]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Pull bugzilla-7200 into release branch
authorLen Brown <len.brown@intel.com>
Sat, 17 Feb 2007 03:11:37 +0000 (22:11 -0500)
committerLen Brown <len.brown@intel.com>
Sat, 17 Feb 2007 03:11:37 +0000 (22:11 -0500)
3424 files changed:
.mailmap [new file with mode: 0644]
CREDITS
Documentation/ABI/testing/debugfs-pktcdvd
Documentation/ABI/testing/sysfs-class-pktcdvd
Documentation/DocBook/gadget.tmpl
Documentation/DocBook/kernel-api.tmpl
Documentation/DocBook/stylesheet.xsl
Documentation/DocBook/usb.tmpl
Documentation/acpi-hotkey.txt [deleted file]
Documentation/auxdisplay/cfag12864b [new file with mode: 0644]
Documentation/auxdisplay/cfag12864b-example.c [new file with mode: 0644]
Documentation/auxdisplay/ks0108 [new file with mode: 0644]
Documentation/cdrom/packet-writing.txt
Documentation/driver-model/devres.txt [new file with mode: 0644]
Documentation/drivers/edac/edac.txt
Documentation/fb/s3fb.txt [new file with mode: 0644]
Documentation/feature-removal-schedule.txt
Documentation/filesystems/relay.txt
Documentation/filesystems/ufs.txt
Documentation/gpio.txt [new file with mode: 0644]
Documentation/hrtimer/timer_stats.txt [new file with mode: 0644]
Documentation/hrtimers/highres.txt [new file with mode: 0644]
Documentation/hrtimers/hrtimers.txt [moved from Documentation/hrtimers.txt with 100% similarity]
Documentation/i2c/busses/i2c-i801
Documentation/i2c/busses/i2c-parport
Documentation/i2c/busses/i2c-piix4
Documentation/i2c/busses/i2c-viapro
Documentation/i2c/porting-clients
Documentation/i2c/smbus-protocol
Documentation/i2c/writing-clients
Documentation/ioctl-number.txt
Documentation/isdn/README.gigaset
Documentation/kdump/kdump.txt
Documentation/kernel-doc-nano-HOWTO.txt
Documentation/kernel-parameters.txt
Documentation/local_ops.txt [new file with mode: 0644]
Documentation/nfsroot.txt
Documentation/powerpc/booting-without-of.txt
Documentation/powerpc/mpc52xx-device-tree-bindings.txt
Documentation/rbtree.txt [new file with mode: 0644]
Documentation/rtc.txt
Documentation/scsi/ChangeLog.megaraid
Documentation/sony-laptop.txt [new file with mode: 0644]
Documentation/spi/spi-summary
Documentation/sysrq.txt
Documentation/x86_64/boot-options.txt
Documentation/x86_64/cpu-hotplug-spec
Documentation/x86_64/kernel-stacks
Documentation/x86_64/machinecheck [new file with mode: 0644]
Documentation/x86_64/mm.txt
MAINTAINERS
Makefile
arch/alpha/Kconfig
arch/alpha/kernel/setup.c
arch/alpha/kernel/time.c
arch/alpha/kernel/vmlinux.lds.S
arch/arm/Kconfig
arch/arm/common/rtctime.c
arch/arm/kernel/irq.c
arch/arm/kernel/isa.c
arch/arm/kernel/setup.c
arch/arm/kernel/time.c
arch/arm/kernel/vmlinux.lds.S
arch/arm/mach-at91rm9200/clock.c
arch/arm/mach-at91rm9200/gpio.c
arch/arm/mach-imx/time.c
arch/arm/mach-ixp4xx/common.c
arch/arm/mach-netx/time.c
arch/arm/mach-pxa/time.c
arch/arm26/Kconfig
arch/arm26/kernel/ecard.c
arch/arm26/kernel/setup.c
arch/arm26/kernel/time.c
arch/arm26/kernel/vmlinux-arm26-xip.lds.in
arch/arm26/kernel/vmlinux-arm26.lds.in
arch/avr32/boards/atstk1000/atstk1002.c
arch/avr32/kernel/setup.c
arch/avr32/kernel/syscall_table.S
arch/avr32/kernel/time.c
arch/avr32/kernel/vmlinux.lds.c
arch/avr32/mach-at32ap/at32ap7000.c
arch/avr32/mach-at32ap/clock.c
arch/avr32/mm/tlb.c
arch/cris/Kconfig
arch/cris/arch-v10/drivers/axisflashmap.c
arch/cris/arch-v10/drivers/ds1302.c
arch/cris/arch-v10/drivers/eeprom.c
arch/cris/arch-v10/drivers/gpio.c
arch/cris/arch-v10/drivers/i2c.c
arch/cris/arch-v10/drivers/pcf8563.c
arch/cris/arch-v10/kernel/time.c
arch/cris/arch-v10/mm/tlb.c
arch/cris/arch-v10/vmlinux.lds.S
arch/cris/arch-v32/drivers/cryptocop.c
arch/cris/arch-v32/drivers/gpio.c
arch/cris/arch-v32/drivers/i2c.c
arch/cris/arch-v32/drivers/pcf8563.c
arch/cris/arch-v32/drivers/sync_serial.c
arch/cris/arch-v32/mm/tlb.c
arch/cris/arch-v32/vmlinux.lds.S
arch/cris/kernel/profile.c
arch/cris/kernel/setup.c
arch/cris/kernel/time.c
arch/cris/mm/tlb.c
arch/frv/Kconfig
arch/frv/kernel/pm.c
arch/frv/kernel/setup.c
arch/frv/kernel/sysctl.c
arch/frv/kernel/vmlinux.lds.S
arch/h8300/Kconfig
arch/h8300/kernel/Makefile
arch/h8300/kernel/setup.c
arch/h8300/kernel/time.c
arch/h8300/kernel/vmlinux.lds.S
arch/i386/Kconfig
arch/i386/Kconfig.cpu
arch/i386/Kconfig.debug
arch/i386/defconfig
arch/i386/kernel/Makefile
arch/i386/kernel/acpi/boot.c
arch/i386/kernel/apic.c
arch/i386/kernel/apm.c
arch/i386/kernel/asm-offsets.c
arch/i386/kernel/cpu/common.c
arch/i386/kernel/cpu/cpufreq/Kconfig
arch/i386/kernel/cpu/cpufreq/Makefile
arch/i386/kernel/cpu/cpufreq/e_powersaver.c [new file with mode: 0644]
arch/i386/kernel/cpu/cpufreq/longhaul.c
arch/i386/kernel/cpu/cpufreq/longhaul.h
arch/i386/kernel/cpu/cpufreq/powernow-k8.c
arch/i386/kernel/cpu/cyrix.c
arch/i386/kernel/cpu/mcheck/mce.c
arch/i386/kernel/cpu/mcheck/mce.h
arch/i386/kernel/cpu/mcheck/p4.c
arch/i386/kernel/cpu/mtrr/if.c
arch/i386/kernel/cpu/mtrr/main.c
arch/i386/kernel/cpu/mtrr/mtrr.h
arch/i386/kernel/cpu/proc.c
arch/i386/kernel/cpu/transmeta.c
arch/i386/kernel/cpuid.c
arch/i386/kernel/e820.c
arch/i386/kernel/entry.S
arch/i386/kernel/head.S
arch/i386/kernel/hpet.c
arch/i386/kernel/i8253.c
arch/i386/kernel/i8259.c
arch/i386/kernel/io_apic.c
arch/i386/kernel/irq.c
arch/i386/kernel/kprobes.c
arch/i386/kernel/microcode.c
arch/i386/kernel/msr.c
arch/i386/kernel/nmi.c
arch/i386/kernel/paravirt.c
arch/i386/kernel/pcspeaker.c [new file with mode: 0644]
arch/i386/kernel/process.c
arch/i386/kernel/ptrace.c
arch/i386/kernel/setup.c
arch/i386/kernel/signal.c
arch/i386/kernel/smp.c
arch/i386/kernel/smpboot.c
arch/i386/kernel/sysenter.c
arch/i386/kernel/time.c
arch/i386/kernel/traps.c
arch/i386/kernel/tsc.c
arch/i386/kernel/tsc_sync.c [new file with mode: 0644]
arch/i386/kernel/vm86.c
arch/i386/kernel/vmi.c [new file with mode: 0644]
arch/i386/kernel/vmitime.c [new file with mode: 0644]
arch/i386/kernel/vmlinux.lds.S
arch/i386/mach-default/setup.c
arch/i386/math-emu/get_address.c
arch/i386/math-emu/status_w.h
arch/i386/mm/discontig.c
arch/i386/mm/fault.c
arch/i386/mm/highmem.c
arch/i386/mm/init.c
arch/i386/mm/pageattr.c
arch/i386/mm/pgtable.c
arch/i386/oprofile/op_model_ppro.c
arch/i386/pci/Makefile
arch/i386/pci/mmconfig-shared.c [new file with mode: 0644]
arch/i386/pci/mmconfig.c
arch/i386/pci/pci.h
arch/ia64/Kconfig
arch/ia64/hp/common/sba_iommu.c
arch/ia64/ia32/binfmt_elf32.c
arch/ia64/ia32/ia32_entry.S
arch/ia64/ia32/sys_ia32.c
arch/ia64/kernel/acpi.c
arch/ia64/kernel/crash.c
arch/ia64/kernel/efi.c
arch/ia64/kernel/irq_ia64.c
arch/ia64/kernel/perfmon.c
arch/ia64/kernel/sal.c
arch/ia64/kernel/salinfo.c
arch/ia64/kernel/setup.c
arch/ia64/kernel/traps.c
arch/ia64/kernel/vmlinux.lds.S
arch/ia64/mm/contig.c
arch/ia64/mm/discontig.c
arch/ia64/mm/init.c
arch/ia64/sn/kernel/sn2/sn2_smp.c
arch/ia64/sn/kernel/sn2/sn_hwperf.c
arch/ia64/sn/kernel/sn2/sn_proc_fs.c
arch/ia64/sn/kernel/xpc_main.c
arch/m32r/Kconfig
arch/m32r/Makefile
arch/m32r/defconfig
arch/m32r/kernel/head.S
arch/m32r/kernel/process.c
arch/m32r/kernel/setup.c
arch/m32r/kernel/signal.c
arch/m32r/kernel/time.c
arch/m32r/kernel/vmlinux.lds.S
arch/m32r/lib/ashxdi3.S
arch/m32r/lib/checksum.S
arch/m32r/lib/delay.c
arch/m32r/lib/memcpy.S
arch/m32r/lib/memset.S
arch/m32r/lib/strlen.S
arch/m32r/m32104ut/defconfig.m32104ut
arch/m32r/m32700ut/defconfig.m32700ut.smp
arch/m32r/m32700ut/defconfig.m32700ut.up
arch/m32r/mappi/defconfig.nommu
arch/m32r/mappi/defconfig.smp
arch/m32r/mappi/defconfig.up
arch/m32r/mappi2/defconfig.opsp [new file with mode: 0644]
arch/m32r/mappi2/defconfig.vdec2
arch/m32r/mappi3/defconfig.smp
arch/m32r/mm/fault-nommu.c
arch/m32r/mm/fault.c
arch/m32r/mm/mmu.S
arch/m32r/oaks32r/defconfig.nommu
arch/m32r/opsput/defconfig.opsput
arch/m68k/Kconfig
arch/m68k/atari/stdma.c
arch/m68k/bvme6000/rtc.c
arch/m68k/kernel/Makefile
arch/m68k/kernel/ptrace.c
arch/m68k/kernel/setup.c
arch/m68k/kernel/time.c
arch/m68k/kernel/traps.c
arch/m68k/kernel/vmlinux-std.lds
arch/m68k/kernel/vmlinux-sun3.lds
arch/m68k/mvme16x/rtc.c
arch/m68knommu/Kconfig
arch/m68knommu/kernel/ptrace.c
arch/m68knommu/kernel/setup.c
arch/m68knommu/kernel/time.c
arch/m68knommu/kernel/traps.c
arch/m68knommu/kernel/vmlinux.lds.S
arch/mips/Kconfig
arch/mips/au1000/common/power.c
arch/mips/configs/ip27_defconfig
arch/mips/dec/int-handler.S
arch/mips/kernel/asm-offsets.c
arch/mips/kernel/entry.S
arch/mips/kernel/linux32.c
arch/mips/kernel/mips-mt.c
arch/mips/kernel/rtlx.c
arch/mips/kernel/scall64-64.S
arch/mips/kernel/scall64-n32.S
arch/mips/kernel/scall64-o32.S
arch/mips/kernel/setup.c
arch/mips/kernel/signal-common.h
arch/mips/kernel/signal.c
arch/mips/kernel/signal32.c
arch/mips/kernel/signal_n32.c
arch/mips/kernel/time.c
arch/mips/kernel/vmlinux.lds.S
arch/mips/kernel/vpe.c
arch/mips/lasat/sysctl.c
arch/mips/mm/Makefile
arch/mips/mm/c-sb1.c
arch/mips/mm/cache.c
arch/mips/mm/dma-coherent.c [deleted file]
arch/mips/mm/dma-default.c [moved from arch/mips/mm/dma-noncoherent.c with 63% similarity]
arch/mips/mm/dma-ip27.c [deleted file]
arch/mips/mm/dma-ip32.c [deleted file]
arch/mips/momentum/jaguar_atx/platform.c
arch/mips/momentum/ocelot_3/platform.c
arch/mips/pci/Makefile
arch/mips/pci/pci-dac.c [new file with mode: 0644]
arch/mips/philips/pnx8550/common/proc.c
arch/mips/sibyte/sb1250/bcm1250_tbprof.c
arch/mips/tx4927/toshiba_rbtx4927/toshiba_rbtx4927_setup.c
arch/parisc/Kconfig
arch/parisc/kernel/perf.c
arch/parisc/kernel/setup.c
arch/parisc/kernel/sys_parisc32.c
arch/parisc/kernel/syscall_table.S
arch/parisc/kernel/time.c
arch/parisc/kernel/vmlinux.lds.S
arch/parisc/mm/init.c
arch/powerpc/Kconfig
arch/powerpc/boot/dts/kuroboxHD.dts [new file with mode: 0644]
arch/powerpc/boot/dts/lite5200.dts
arch/powerpc/boot/dts/lite5200b.dts
arch/powerpc/boot/dts/mpc8313erdb.dts [new file with mode: 0644]
arch/powerpc/boot/dts/mpc8349emitxgp.dts [new file with mode: 0644]
arch/powerpc/boot/dts/mpc834x_mds.dts [moved from arch/powerpc/boot/dts/mpc8349emds.dts with 98% similarity]
arch/powerpc/boot/dts/mpc8568mds.dts [new file with mode: 0644]
arch/powerpc/configs/linkstation_defconfig
arch/powerpc/configs/mpc8313_rdb_defconfig [new file with mode: 0644]
arch/powerpc/configs/mpc834x_itx_defconfig
arch/powerpc/configs/mpc834x_itxgp_defconfig [new file with mode: 0644]
arch/powerpc/configs/mpc834x_mds_defconfig
arch/powerpc/configs/mpc8568mds_defconfig [new file with mode: 0644]
arch/powerpc/configs/ps3_defconfig
arch/powerpc/kernel/btext.c
arch/powerpc/kernel/cputable.c
arch/powerpc/kernel/head_44x.S
arch/powerpc/kernel/head_fsl_booke.S
arch/powerpc/kernel/idle.c
arch/powerpc/kernel/legacy_serial.c
arch/powerpc/kernel/lparcfg.c
arch/powerpc/kernel/nvram_64.c
arch/powerpc/kernel/proc_ppc64.c
arch/powerpc/kernel/prom.c
arch/powerpc/kernel/prom_init.c
arch/powerpc/kernel/rtas-proc.c
arch/powerpc/kernel/rtas_flash.c
arch/powerpc/kernel/setup_32.c
arch/powerpc/kernel/smp.c
arch/powerpc/kernel/sys_ppc32.c
arch/powerpc/kernel/udbg.c
arch/powerpc/kernel/vdso.c
arch/powerpc/kernel/vmlinux.lds.S
arch/powerpc/mm/mem.c
arch/powerpc/mm/pgtable_32.c
arch/powerpc/oprofile/op_model_cell.c
arch/powerpc/platforms/52xx/Makefile
arch/powerpc/platforms/52xx/efika-pci.c [deleted file]
arch/powerpc/platforms/52xx/efika-setup.c [deleted file]
arch/powerpc/platforms/52xx/efika.c [new file with mode: 0644]
arch/powerpc/platforms/52xx/efika.h [deleted file]
arch/powerpc/platforms/52xx/lite5200.c
arch/powerpc/platforms/52xx/mpc52xx_common.c
arch/powerpc/platforms/52xx/mpc52xx_pic.c
arch/powerpc/platforms/83xx/Kconfig
arch/powerpc/platforms/83xx/Makefile
arch/powerpc/platforms/83xx/mpc8313_rdb.c [new file with mode: 0644]
arch/powerpc/platforms/83xx/mpc834x_itx.c
arch/powerpc/platforms/83xx/mpc834x_mds.c [moved from arch/powerpc/platforms/83xx/mpc834x_sys.c with 56% similarity]
arch/powerpc/platforms/83xx/mpc834x_sys.h [deleted file]
arch/powerpc/platforms/83xx/mpc83xx.h
arch/powerpc/platforms/85xx/Kconfig
arch/powerpc/platforms/85xx/Makefile
arch/powerpc/platforms/85xx/mpc8568_mds.c [new file with mode: 0644]
arch/powerpc/platforms/85xx/mpc85xx_ads.c
arch/powerpc/platforms/85xx/mpc85xx_cds.c
arch/powerpc/platforms/Makefile
arch/powerpc/platforms/cell/pmu.c
arch/powerpc/platforms/cell/spu_manage.c
arch/powerpc/platforms/cell/spufs/context.c
arch/powerpc/platforms/cell/spufs/file.c
arch/powerpc/platforms/cell/spufs/inode.c
arch/powerpc/platforms/cell/spufs/run.c
arch/powerpc/platforms/cell/spufs/sched.c
arch/powerpc/platforms/cell/spufs/spufs.h
arch/powerpc/platforms/celleb/htab.c
arch/powerpc/platforms/embedded6xx/linkstation.c
arch/powerpc/platforms/iseries/lpevents.c
arch/powerpc/platforms/iseries/mf.c
arch/powerpc/platforms/iseries/proc.c
arch/powerpc/platforms/iseries/viopath.c
arch/powerpc/platforms/powermac/pic.c
arch/powerpc/platforms/powermac/setup.c
arch/powerpc/platforms/ps3/Kconfig
arch/powerpc/platforms/ps3/htab.c
arch/powerpc/platforms/ps3/setup.c
arch/powerpc/platforms/ps3/spu.c
arch/powerpc/platforms/pseries/Makefile
arch/powerpc/platforms/pseries/eeh.c
arch/powerpc/platforms/pseries/firmware.h [deleted file]
arch/powerpc/platforms/pseries/hvCall_inst.c
arch/powerpc/platforms/pseries/kexec.c [new file with mode: 0644]
arch/powerpc/platforms/pseries/pci.c
arch/powerpc/platforms/pseries/pseries.h [new file with mode: 0644]
arch/powerpc/platforms/pseries/ras.c
arch/powerpc/platforms/pseries/ras.h [deleted file]
arch/powerpc/platforms/pseries/reconfig.c
arch/powerpc/platforms/pseries/rtasd.c
arch/powerpc/platforms/pseries/scanlog.c
arch/powerpc/platforms/pseries/setup.c
arch/powerpc/platforms/pseries/smp.c
arch/powerpc/sysdev/fsl_soc.c
arch/powerpc/sysdev/mpic.c
arch/powerpc/sysdev/qe_lib/ucc_slow.c
arch/powerpc/xmon/xmon.c
arch/ppc/8xx_io/cs4218_tdm.c
arch/ppc/Kconfig
arch/ppc/configs/taishan_defconfig [new file with mode: 0644]
arch/ppc/kernel/head_fsl_booke.S
arch/ppc/kernel/ppc_htab.c
arch/ppc/kernel/ppc_ksyms.c
arch/ppc/kernel/setup.c
arch/ppc/kernel/vmlinux.lds.S
arch/ppc/mm/pgtable.c
arch/ppc/platforms/4xx/Kconfig
arch/ppc/platforms/4xx/Makefile
arch/ppc/platforms/4xx/taishan.c [new file with mode: 0644]
arch/ppc/platforms/4xx/taishan.h [new file with mode: 0644]
arch/ppc/platforms/lopec.c
arch/ppc/platforms/pplus.c
arch/ppc/platforms/prep_setup.c
arch/ppc/syslib/Makefile
arch/ppc/syslib/i8259.c
arch/s390/Kconfig
arch/s390/appldata/appldata.h
arch/s390/appldata/appldata_base.c
arch/s390/hypfs/inode.c
arch/s390/kernel/compat_linux.c
arch/s390/kernel/compat_wrapper.S
arch/s390/kernel/debug.c
arch/s390/kernel/setup.c
arch/s390/kernel/smp.c
arch/s390/kernel/syscalls.S
arch/s390/kernel/time.c
arch/s390/kernel/vmlinux.lds.S
arch/s390/mm/Makefile
arch/s390/mm/cmm.c
arch/s390/mm/fault.c
arch/s390/mm/ioremap.c [deleted file]
arch/sh/Kconfig
arch/sh/Makefile
arch/sh/boards/bigsur/Makefile [deleted file]
arch/sh/boards/bigsur/io.c [deleted file]
arch/sh/boards/bigsur/irq.c [deleted file]
arch/sh/boards/bigsur/led.c [deleted file]
arch/sh/boards/bigsur/setup.c [deleted file]
arch/sh/boards/ec3104/Makefile [deleted file]
arch/sh/boards/ec3104/io.c [deleted file]
arch/sh/boards/ec3104/irq.c [deleted file]
arch/sh/boards/ec3104/setup.c [deleted file]
arch/sh/boards/landisk/landisk_pwb.c
arch/sh/boards/mpc1211/Makefile
arch/sh/boards/mpc1211/led.c [deleted file]
arch/sh/boards/mpc1211/setup.c
arch/sh/boards/renesas/r7780rp/Makefile
arch/sh/boards/renesas/r7780rp/io.c
arch/sh/boards/renesas/r7780rp/led.c [deleted file]
arch/sh/boards/renesas/r7780rp/setup.c
arch/sh/boards/renesas/rts7751r2d/Makefile
arch/sh/boards/renesas/rts7751r2d/io.c [deleted file]
arch/sh/boards/renesas/rts7751r2d/irq.c
arch/sh/boards/renesas/rts7751r2d/led.c [deleted file]
arch/sh/boards/renesas/rts7751r2d/setup.c
arch/sh/boards/se/7206/Makefile
arch/sh/boards/se/7206/led.c [deleted file]
arch/sh/boards/se/7206/setup.c
arch/sh/boards/se/7300/Makefile
arch/sh/boards/se/7300/led.c [deleted file]
arch/sh/boards/se/7300/setup.c
arch/sh/boards/se/73180/Makefile
arch/sh/boards/se/73180/led.c [deleted file]
arch/sh/boards/se/73180/setup.c
arch/sh/boards/se/7343/Makefile
arch/sh/boards/se/7343/led.c [deleted file]
arch/sh/boards/se/7343/setup.c
arch/sh/boards/se/770x/Makefile
arch/sh/boards/se/770x/irq.c
arch/sh/boards/se/770x/led.c [deleted file]
arch/sh/boards/se/770x/setup.c
arch/sh/boards/se/7751/Makefile
arch/sh/boards/se/7751/led.c [deleted file]
arch/sh/boards/se/7751/setup.c
arch/sh/boards/sh03/Makefile
arch/sh/boards/sh03/led.c [deleted file]
arch/sh/boards/sh03/setup.c
arch/sh/boards/shmin/setup.c
arch/sh/cchips/voyagergx/irq.c
arch/sh/cchips/voyagergx/setup.c
arch/sh/configs/rts7751r2d_defconfig
arch/sh/configs/se7750_defconfig
arch/sh/drivers/Makefile
arch/sh/drivers/dma/dma-sh.c
arch/sh/drivers/heartbeat.c [new file with mode: 0644]
arch/sh/drivers/pci/Makefile
arch/sh/drivers/pci/ops-bigsur.c [deleted file]
arch/sh/drivers/pci/pci-sh7751.c
arch/sh/kernel/Makefile
arch/sh/kernel/cpu/init.c
arch/sh/kernel/cpu/irq/ipr.c
arch/sh/kernel/cpu/sh2/entry.S
arch/sh/kernel/cpu/sh2/probe.c
arch/sh/kernel/cpu/sh2/setup-sh7619.c
arch/sh/kernel/cpu/sh2a/probe.c
arch/sh/kernel/cpu/sh2a/setup-sh7206.c
arch/sh/kernel/cpu/sh3/entry.S
arch/sh/kernel/cpu/sh3/probe.c
arch/sh/kernel/cpu/sh3/setup-sh7709.c
arch/sh/kernel/cpu/sh4/probe.c
arch/sh/kernel/cpu/sh4/setup-sh7750.c
arch/sh/kernel/cpu/sh4/setup-sh7760.c
arch/sh/kernel/debugtraps.S [new file with mode: 0644]
arch/sh/kernel/early_printk.c
arch/sh/kernel/entry-common.S
arch/sh/kernel/io_generic.c
arch/sh/kernel/kgdb_stub.c
arch/sh/kernel/process.c
arch/sh/kernel/setup.c
arch/sh/kernel/sh_ksyms.c
arch/sh/kernel/signal.c
arch/sh/kernel/syscalls.S
arch/sh/kernel/time.c
arch/sh/kernel/traps.c
arch/sh/kernel/vmlinux.lds.S
arch/sh/mm/Kconfig
arch/sh/mm/cache-debugfs.c
arch/sh/mm/cache-sh3.c
arch/sh/mm/cache-sh4.c
arch/sh/mm/cache-sh7705.c
arch/sh/mm/fault.c
arch/sh/mm/init.c
arch/sh/mm/ioremap.c
arch/sh/mm/pg-sh4.c
arch/sh/mm/pg-sh7705.c
arch/sh/mm/pmb.c
arch/sh/mm/tlb-flush.c
arch/sh/mm/tlb-nommu.c
arch/sh/mm/tlb-sh3.c
arch/sh/mm/tlb-sh4.c
arch/sh/oprofile/op_model_sh7750.c
arch/sh/tools/mach-types
arch/sh64/Kconfig
arch/sh64/kernel/setup.c
arch/sh64/kernel/time.c
arch/sh64/kernel/traps.c
arch/sh64/kernel/vmlinux.lds.S
arch/sh64/mm/init.c
arch/sparc/Kconfig
arch/sparc/kernel/Makefile
arch/sparc/kernel/apc.c
arch/sparc/kernel/setup.c
arch/sparc/kernel/sunos_ioctl.c
arch/sparc/kernel/sys_sunos.c
arch/sparc/kernel/time.c
arch/sparc/kernel/vmlinux.lds.S
arch/sparc64/Kconfig
arch/sparc64/defconfig
arch/sparc64/kernel/irq.c
arch/sparc64/kernel/pci.c
arch/sparc64/kernel/pci_common.c
arch/sparc64/kernel/pci_sun4v.c
arch/sparc64/kernel/pci_sun4v.h
arch/sparc64/kernel/pci_sun4v_asm.S
arch/sparc64/kernel/setup.c
arch/sparc64/kernel/sunos_ioctl32.c
arch/sparc64/kernel/sys_sparc32.c
arch/sparc64/kernel/sys_sunos32.c
arch/sparc64/kernel/systbls.S
arch/sparc64/kernel/time.c
arch/sparc64/kernel/vmlinux.lds.S
arch/sparc64/mm/init.c
arch/sparc64/solaris/socksys.c
arch/um/Kconfig
arch/um/drivers/chan_kern.c
arch/um/drivers/harddog_kern.c
arch/um/drivers/harddog_user.c
arch/um/drivers/hostaudio_kern.c
arch/um/drivers/line.c
arch/um/drivers/mconsole_kern.c
arch/um/drivers/mconsole_user.c
arch/um/drivers/net_kern.c
arch/um/drivers/port_kern.c
arch/um/drivers/port_user.c
arch/um/drivers/random.c
arch/um/drivers/ssl.c
arch/um/drivers/stdio_console.c
arch/um/drivers/ubd_kern.c
arch/um/include/chan_kern.h
arch/um/include/chan_user.h
arch/um/include/kern_util.h
arch/um/include/line.h
arch/um/include/mconsole_kern.h
arch/um/include/net_kern.h
arch/um/include/os.h
arch/um/include/sigio.h
arch/um/include/tempfile.h
arch/um/include/umid.h [deleted file]
arch/um/include/user_util.h
arch/um/kernel/Makefile
arch/um/kernel/exec.c
arch/um/kernel/irq.c
arch/um/kernel/mem.c
arch/um/kernel/physmem.c
arch/um/kernel/ptrace.c
arch/um/kernel/resource.c [deleted file]
arch/um/kernel/sigio.c
arch/um/kernel/skas/mem.c
arch/um/kernel/syscall.c
arch/um/kernel/sysrq.c
arch/um/kernel/time.c
arch/um/kernel/trap.c
arch/um/kernel/tt/gdb.c
arch/um/kernel/tt/gdb_kern.c
arch/um/kernel/um_arch.c
arch/um/kernel/umid.c
arch/um/os-Linux/aio.c
arch/um/os-Linux/elf_aux.c
arch/um/os-Linux/file.c
arch/um/os-Linux/irq.c
arch/um/os-Linux/mem.c
arch/um/os-Linux/sigio.c
arch/um/os-Linux/start_up.c
arch/um/os-Linux/sys-i386/registers.c
arch/um/os-Linux/sys-x86_64/Makefile
arch/um/os-Linux/sys-x86_64/prctl.c [new file with mode: 0644]
arch/um/os-Linux/sys-x86_64/registers.c
arch/um/os-Linux/umid.c
arch/um/sys-x86_64/ptrace.c
arch/um/sys-x86_64/syscalls.c
arch/um/sys-x86_64/tls.c
arch/v850/Kconfig
arch/v850/kernel/anna.c
arch/v850/kernel/as85ep1.c
arch/v850/kernel/fpga85e2c.c
arch/v850/kernel/gbus_int.c
arch/v850/kernel/ma.c
arch/v850/kernel/me2.c
arch/v850/kernel/rte_cb.c
arch/v850/kernel/rte_cb_leds.c
arch/v850/kernel/rte_mb_a_pci.c
arch/v850/kernel/rte_me2_cb.c
arch/v850/kernel/setup.c
arch/v850/kernel/teg.c
arch/v850/kernel/time.c
arch/v850/kernel/vmlinux.lds.S
arch/x86_64/Kconfig
arch/x86_64/defconfig
arch/x86_64/ia32/ia32_binfmt.c
arch/x86_64/ia32/ia32_signal.c
arch/x86_64/ia32/ia32entry.S
arch/x86_64/ia32/sys_ia32.c
arch/x86_64/kernel/Makefile
arch/x86_64/kernel/acpi/sleep.c
arch/x86_64/kernel/apic.c
arch/x86_64/kernel/e820.c
arch/x86_64/kernel/early-quirks.c
arch/x86_64/kernel/head.S
arch/x86_64/kernel/head64.c
arch/x86_64/kernel/hpet.c [moved from arch/i386/kernel/time_hpet.c with 57% similarity]
arch/x86_64/kernel/i8259.c
arch/x86_64/kernel/io_apic.c
arch/x86_64/kernel/ioport.c
arch/x86_64/kernel/irq.c
arch/x86_64/kernel/mce.c
arch/x86_64/kernel/mce_amd.c
arch/x86_64/kernel/nmi.c
arch/x86_64/kernel/pci-calgary.c
arch/x86_64/kernel/pci-dma.c
arch/x86_64/kernel/pci-gart.c
arch/x86_64/kernel/pmtimer.c
arch/x86_64/kernel/ptrace.c
arch/x86_64/kernel/setup.c
arch/x86_64/kernel/setup64.c
arch/x86_64/kernel/smpboot.c
arch/x86_64/kernel/stacktrace.c
arch/x86_64/kernel/time.c
arch/x86_64/kernel/tsc.c [new file with mode: 0644]
arch/x86_64/kernel/tsc_sync.c [new file with mode: 0644]
arch/x86_64/kernel/vmlinux.lds.S
arch/x86_64/kernel/vsyscall.c
arch/x86_64/kernel/x8664_ksyms.c
arch/x86_64/lib/Makefile
arch/x86_64/lib/copy_user_nocache.S [new file with mode: 0644]
arch/x86_64/mm/fault.c
arch/x86_64/mm/init.c
arch/x86_64/mm/numa.c
arch/x86_64/mm/pageattr.c
arch/x86_64/pci/Makefile
arch/x86_64/pci/mmconfig.c
arch/xtensa/Kconfig
arch/xtensa/kernel/setup.c
arch/xtensa/kernel/time.c
arch/xtensa/kernel/vmlinux.lds.S
block/blktrace.c
block/cfq-iosched.c
block/elevator.c
block/genhd.c
block/ioctl.c
crypto/proc.c
drivers/Kconfig
drivers/Makefile
drivers/acorn/block/mfmhd.c
drivers/acorn/char/i2c.c
drivers/acpi/Kconfig
drivers/acpi/Makefile
drivers/acpi/ac.c
drivers/acpi/acpi_memhotplug.c
drivers/acpi/asus_acpi.c
drivers/acpi/battery.c
drivers/acpi/bay.c
drivers/acpi/bus.c
drivers/acpi/button.c
drivers/acpi/cm_sbs.c
drivers/acpi/container.c
drivers/acpi/debug.c
drivers/acpi/dispatcher/dsmethod.c
drivers/acpi/dock.c
drivers/acpi/ec.c
drivers/acpi/event.c
drivers/acpi/events/evgpe.c
drivers/acpi/events/evmisc.c
drivers/acpi/executer/exdump.c
drivers/acpi/executer/exmutex.c
drivers/acpi/fan.c
drivers/acpi/glue.c
drivers/acpi/hotkey.c [deleted file]
drivers/acpi/i2c_ec.c
drivers/acpi/ibm_acpi.c
drivers/acpi/namespace/nsinit.c
drivers/acpi/numa.c
drivers/acpi/osl.c
drivers/acpi/pci_bind.c
drivers/acpi/pci_irq.c
drivers/acpi/pci_link.c
drivers/acpi/pci_root.c
drivers/acpi/power.c
drivers/acpi/processor_core.c
drivers/acpi/processor_idle.c
drivers/acpi/processor_perflib.c
drivers/acpi/processor_thermal.c
drivers/acpi/processor_throttling.c
drivers/acpi/sbs.c
drivers/acpi/scan.c
drivers/acpi/sleep/poweroff.c
drivers/acpi/system.c
drivers/acpi/tables.c
drivers/acpi/tables/tbxface.c
drivers/acpi/thermal.c
drivers/acpi/toshiba_acpi.c
drivers/acpi/utilities/utdelete.c
drivers/acpi/utils.c
drivers/acpi/video.c
drivers/ata/Kconfig
drivers/ata/Makefile
drivers/ata/ahci.c
drivers/ata/ata_generic.c
drivers/ata/ata_piix.c
drivers/ata/libata-core.c
drivers/ata/libata-eh.c
drivers/ata/libata-scsi.c
drivers/ata/libata-sff.c
drivers/ata/libata.h
drivers/ata/pata_ali.c
drivers/ata/pata_amd.c
drivers/ata/pata_artop.c
drivers/ata/pata_atiixp.c
drivers/ata/pata_cmd64x.c
drivers/ata/pata_cs5520.c
drivers/ata/pata_cs5530.c
drivers/ata/pata_cs5535.c
drivers/ata/pata_cypress.c
drivers/ata/pata_efar.c
drivers/ata/pata_hpt366.c
drivers/ata/pata_hpt37x.c
drivers/ata/pata_hpt3x2n.c
drivers/ata/pata_hpt3x3.c
drivers/ata/pata_isapnp.c
drivers/ata/pata_it8213.c [new file with mode: 0644]
drivers/ata/pata_it821x.c
drivers/ata/pata_ixp4xx_cf.c
drivers/ata/pata_jmicron.c
drivers/ata/pata_legacy.c
drivers/ata/pata_marvell.c
drivers/ata/pata_mpc52xx.c [new file with mode: 0644]
drivers/ata/pata_mpiix.c
drivers/ata/pata_netcell.c
drivers/ata/pata_ns87410.c
drivers/ata/pata_oldpiix.c
drivers/ata/pata_opti.c
drivers/ata/pata_optidma.c
drivers/ata/pata_pcmcia.c
drivers/ata/pata_pdc2027x.c
drivers/ata/pata_pdc202xx_old.c
drivers/ata/pata_platform.c
drivers/ata/pata_qdi.c
drivers/ata/pata_radisys.c
drivers/ata/pata_rz1000.c
drivers/ata/pata_sc1200.c
drivers/ata/pata_serverworks.c
drivers/ata/pata_sil680.c
drivers/ata/pata_sis.c
drivers/ata/pata_sl82c105.c
drivers/ata/pata_triflex.c
drivers/ata/pata_via.c
drivers/ata/pata_winbond.c
drivers/ata/pdc_adma.c
drivers/ata/sata_inic162x.c [new file with mode: 0644]
drivers/ata/sata_mv.c
drivers/ata/sata_nv.c
drivers/ata/sata_promise.c
drivers/ata/sata_qstor.c
drivers/ata/sata_sil.c
drivers/ata/sata_sil24.c
drivers/ata/sata_sis.c
drivers/ata/sata_svw.c
drivers/ata/sata_sx4.c
drivers/ata/sata_uli.c
drivers/ata/sata_via.c
drivers/ata/sata_vsc.c
drivers/atm/adummy.c
drivers/atm/eni.c
drivers/atm/fore200e.c
drivers/atm/idt77105.c
drivers/atm/uPD98402.c
drivers/atm/zatm.c
drivers/auxdisplay/Kconfig [new file with mode: 0644]
drivers/auxdisplay/Makefile [new file with mode: 0644]
drivers/auxdisplay/cfag12864b.c [new file with mode: 0644]
drivers/auxdisplay/cfag12864bfb.c [new file with mode: 0644]
drivers/auxdisplay/ks0108.c [new file with mode: 0644]
drivers/base/Kconfig
drivers/base/Makefile
drivers/base/base.h
drivers/base/core.c
drivers/base/dd.c
drivers/base/devres.c [new file with mode: 0644]
drivers/base/dma-mapping.c [new file with mode: 0644]
drivers/base/dmapool.c
drivers/base/node.c
drivers/block/DAC960.c
drivers/block/DAC960.h
drivers/block/Kconfig
drivers/block/acsi.c
drivers/block/acsi_slm.c
drivers/block/aoe/aoechr.c
drivers/block/paride/Kconfig
drivers/block/paride/pd.c
drivers/block/paride/pg.c
drivers/block/paride/pt.c
drivers/block/pktcdvd.c
drivers/block/umem.c
drivers/bluetooth/bfusb.c
drivers/bluetooth/bt3c_cs.c
drivers/bluetooth/btuart_cs.c
drivers/bluetooth/dtl1_cs.c
drivers/bluetooth/hci_bcsp.c
drivers/bluetooth/hci_h4.c
drivers/bluetooth/hci_ldisc.c
drivers/bluetooth/hci_usb.c
drivers/bluetooth/hci_vhci.c
drivers/cdrom/aztcd.c
drivers/cdrom/cdrom.c
drivers/cdrom/cm206.c
drivers/cdrom/gscd.c
drivers/cdrom/sjcd.c
drivers/cdrom/viocd.c
drivers/char/Kconfig
drivers/char/agp/Makefile
drivers/char/agp/agp.h
drivers/char/agp/ali-agp.c
drivers/char/agp/alpha-agp.c
drivers/char/agp/amd-k7-agp.c
drivers/char/agp/amd64-agp.c
drivers/char/agp/ati-agp.c
drivers/char/agp/backend.c
drivers/char/agp/compat_ioctl.c [new file with mode: 0644]
drivers/char/agp/compat_ioctl.h [new file with mode: 0644]
drivers/char/agp/efficeon-agp.c
drivers/char/agp/frontend.c
drivers/char/agp/generic.c
drivers/char/agp/hp-agp.c
drivers/char/agp/i460-agp.c
drivers/char/agp/intel-agp.c
drivers/char/agp/nvidia-agp.c
drivers/char/agp/parisc-agp.c
drivers/char/agp/sgi-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/amiserial.c
drivers/char/briq_panel.c
drivers/char/cyclades.c
drivers/char/drm/drm_drv.c
drivers/char/drm/ffb_context.c
drivers/char/drm/ffb_drv.c
drivers/char/drm/i810_dma.c
drivers/char/drm/i830_dma.c
drivers/char/drm/via_dmablit.c
drivers/char/ds1302.c
drivers/char/ds1620.c
drivers/char/dsp56k.c
drivers/char/dtlk.c
drivers/char/epca.c
drivers/char/generic_nvram.c
drivers/char/generic_serial.c
drivers/char/hangcheck-timer.c
drivers/char/hpet.c
drivers/char/hvsi.c
drivers/char/hw_random/intel-rng.c
drivers/char/ip2/i2lib.c
drivers/char/ip2/ip2main.c
drivers/char/ipmi/ipmi_devintf.c
drivers/char/ipmi/ipmi_msghandler.c
drivers/char/ipmi/ipmi_poweroff.c
drivers/char/isicom.c
drivers/char/istallion.c
drivers/char/keyboard.c
drivers/char/mbcs.c
drivers/char/moxa.c
drivers/char/mspec.c
drivers/char/mxser.c
drivers/char/mxser.h
drivers/char/mxser_new.c
drivers/char/mxser_new.h
drivers/char/n_r3964.c
drivers/char/n_tty.c
drivers/char/nvram.c
drivers/char/nwbutton.c
drivers/char/nwflash.c
drivers/char/pcmcia/cm4000_cs.c
drivers/char/pcmcia/cm4040_cs.c
drivers/char/pcmcia/synclink_cs.c
drivers/char/pty.c
drivers/char/random.c
drivers/char/raw.c
drivers/char/rio/rio_linux.c
drivers/char/rio/riointr.c
drivers/char/riscom8.c
drivers/char/rocket.c
drivers/char/rtc.c
drivers/char/scan_keyb.c [deleted file]
drivers/char/scan_keyb.h [deleted file]
drivers/char/ser_a2232.c
drivers/char/serial167.c
drivers/char/sonypi.c
drivers/char/specialix.c
drivers/char/synclink.c
drivers/char/synclink_gt.c
drivers/char/synclinkmp.c
drivers/char/sysrq.c
drivers/char/tlclk.c
drivers/char/toshiba.c
drivers/char/tpm/tpm.c
drivers/char/tpm/tpm_bios.c
drivers/char/tty_io.c
drivers/char/tty_ioctl.c
drivers/char/vc_screen.c
drivers/char/viotape.c
drivers/char/vme_scc.c
drivers/char/vt.c
drivers/char/vt_ioctl.c
drivers/char/watchdog/acquirewdt.c
drivers/char/watchdog/advantechwdt.c
drivers/char/watchdog/alim1535_wdt.c
drivers/char/watchdog/alim7101_wdt.c
drivers/char/watchdog/cpu5wdt.c
drivers/char/watchdog/eurotechwdt.c
drivers/char/watchdog/i6300esb.c
drivers/char/watchdog/i8xx_tco.c
drivers/char/watchdog/iTCO_wdt.c
drivers/char/watchdog/ib700wdt.c
drivers/char/watchdog/ibmasr.c
drivers/char/watchdog/indydog.c
drivers/char/watchdog/machzwd.c
drivers/char/watchdog/mixcomwd.c
drivers/char/watchdog/omap_wdt.c
drivers/char/watchdog/pc87413_wdt.c
drivers/char/watchdog/pcwd.c
drivers/char/watchdog/pcwd_pci.c
drivers/char/watchdog/pcwd_usb.c
drivers/char/watchdog/pnx4008_wdt.c
drivers/char/watchdog/rm9k_wdt.c
drivers/char/watchdog/s3c2410_wdt.c
drivers/char/watchdog/sbc60xxwdt.c
drivers/char/watchdog/sbc8360.c
drivers/char/watchdog/sbc_epx_c3.c
drivers/char/watchdog/sc1200wdt.c
drivers/char/watchdog/sc520_wdt.c
drivers/char/watchdog/shwdt.c
drivers/char/watchdog/smsc37b787_wdt.c
drivers/char/watchdog/softdog.c
drivers/char/watchdog/w83627hf_wdt.c
drivers/char/watchdog/w83697hf_wdt.c
drivers/char/watchdog/w83877f_wdt.c
drivers/char/watchdog/w83977f_wdt.c
drivers/char/watchdog/wafer5823wdt.c
drivers/char/watchdog/wdt.c
drivers/char/watchdog/wdt977.c
drivers/char/watchdog/wdt_pci.c
drivers/clocksource/acpi_pm.c
drivers/clocksource/cyclone.c
drivers/clocksource/scx200_hrt.c
drivers/cpufreq/Kconfig
drivers/cpufreq/cpufreq.c
drivers/cpufreq/cpufreq_conservative.c
drivers/cpufreq/cpufreq_ondemand.c
drivers/cpufreq/cpufreq_stats.c
drivers/cpufreq/cpufreq_userspace.c
drivers/crypto/geode-aes.c
drivers/edac/e752x_edac.c
drivers/edac/edac_mc.c
drivers/edac/edac_mc.h
drivers/fc4/fc_syms.c
drivers/fc4/soc.c
drivers/fc4/socal.c
drivers/firmware/edd.c
drivers/hid/hid-core.c
drivers/hwmon/vt8231.c
drivers/i2c/busses/Kconfig
drivers/i2c/busses/Makefile
drivers/i2c/busses/i2c-ali1535.c
drivers/i2c/busses/i2c-ali1563.c
drivers/i2c/busses/i2c-ali15x3.c
drivers/i2c/busses/i2c-amd756-s4882.c
drivers/i2c/busses/i2c-amd756.c
drivers/i2c/busses/i2c-amd8111.c
drivers/i2c/busses/i2c-i801.c
drivers/i2c/busses/i2c-i810.c
drivers/i2c/busses/i2c-ibm_iic.c
drivers/i2c/busses/i2c-iop3xx.c
drivers/i2c/busses/i2c-isa.c
drivers/i2c/busses/i2c-mv64xxx.c
drivers/i2c/busses/i2c-nforce2.c
drivers/i2c/busses/i2c-ocores.c
drivers/i2c/busses/i2c-parport.h
drivers/i2c/busses/i2c-pasemi.c [new file with mode: 0644]
drivers/i2c/busses/i2c-piix4.c
drivers/i2c/busses/i2c-powermac.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/busses/scx200_acb.c
drivers/i2c/busses/scx200_i2c.c
drivers/i2c/chips/eeprom.c
drivers/i2c/chips/tps65010.c
drivers/i2c/i2c-core.c
drivers/i2c/i2c-dev.c
drivers/ide/ide-proc.c
drivers/ide/ide-tape.c
drivers/ide/legacy/ide-cs.c
drivers/ide/ppc/mpc8xx.c
drivers/ide/ppc/pmac.c
drivers/ieee1394/dv1394.c
drivers/ieee1394/eth1394.c
drivers/ieee1394/iso.c
drivers/ieee1394/ohci1394.c
drivers/ieee1394/pcilynx.c
drivers/ieee1394/raw1394.c
drivers/ieee1394/video1394.c
drivers/infiniband/Kconfig
drivers/infiniband/Makefile
drivers/infiniband/core/addr.c
drivers/infiniband/core/cache.c
drivers/infiniband/core/cma.c
drivers/infiniband/core/device.c
drivers/infiniband/core/ucm.c
drivers/infiniband/core/ucma.c
drivers/infiniband/core/user_mad.c
drivers/infiniband/core/uverbs_main.c
drivers/infiniband/hw/amso1100/c2.c
drivers/infiniband/hw/cxgb3/Kconfig [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/Makefile [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/cxio_dbg.c [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/cxio_hal.c [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/cxio_hal.h [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/cxio_resource.c [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/cxio_resource.h [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/cxio_wr.h [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/iwch.c [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/iwch.h [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/iwch_cm.c [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/iwch_cm.h [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/iwch_cq.c [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/iwch_ev.c [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/iwch_mem.c [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/iwch_provider.c [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/iwch_provider.h [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/iwch_qp.c [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/iwch_user.h [new file with mode: 0644]
drivers/infiniband/hw/cxgb3/tcb.h [new file with mode: 0644]
drivers/infiniband/hw/ehca/ehca_cq.c
drivers/infiniband/hw/ehca/ehca_eq.c
drivers/infiniband/hw/ehca/ehca_irq.c
drivers/infiniband/hw/ehca/ehca_mrmw.c
drivers/infiniband/hw/ehca/ehca_pd.c
drivers/infiniband/hw/ehca/ehca_qp.c
drivers/infiniband/hw/ipath/ipath_diag.c
drivers/infiniband/hw/ipath/ipath_file_ops.c
drivers/infiniband/hw/ipath/ipath_fs.c
drivers/infiniband/hw/ipath/ipath_kernel.h
drivers/infiniband/hw/mthca/mthca_cmd.c
drivers/infiniband/hw/mthca/mthca_dev.h
drivers/infiniband/hw/mthca/mthca_main.c
drivers/infiniband/hw/mthca/mthca_memfree.c
drivers/infiniband/hw/mthca/mthca_memfree.h
drivers/infiniband/hw/mthca/mthca_mr.c
drivers/infiniband/hw/mthca/mthca_profile.c
drivers/infiniband/hw/mthca/mthca_provider.c
drivers/infiniband/hw/mthca/mthca_provider.h
drivers/infiniband/hw/mthca/mthca_qp.c
drivers/infiniband/hw/mthca/mthca_srq.c
drivers/infiniband/ulp/ipoib/Kconfig
drivers/infiniband/ulp/ipoib/Makefile
drivers/infiniband/ulp/ipoib/ipoib.h
drivers/infiniband/ulp/ipoib/ipoib_cm.c [new file with mode: 0644]
drivers/infiniband/ulp/ipoib/ipoib_fs.c
drivers/infiniband/ulp/ipoib/ipoib_ib.c
drivers/infiniband/ulp/ipoib/ipoib_main.c
drivers/infiniband/ulp/ipoib/ipoib_multicast.c
drivers/infiniband/ulp/ipoib/ipoib_verbs.c
drivers/infiniband/ulp/ipoib/ipoib_vlan.c
drivers/input/ff-memless.c
drivers/input/gameport/ns558.c
drivers/input/input.c
drivers/input/keyboard/Kconfig
drivers/input/keyboard/Makefile
drivers/input/keyboard/gpio_keys.c [new file with mode: 0644]
drivers/input/keyboard/hilkbd.c
drivers/input/misc/Kconfig
drivers/input/misc/Makefile
drivers/input/misc/atlas_btns.c [new file with mode: 0644]
drivers/input/misc/hp_sdc_rtc.c
drivers/input/misc/uinput.c
drivers/input/misc/wistron_btns.c
drivers/input/mouse/inport.c
drivers/input/mouse/pc110pad.c
drivers/input/mouse/rpcmouse.c
drivers/input/serio/hil_mlc.c
drivers/input/serio/hp_sdc.c
drivers/input/serio/i8042.c
drivers/input/serio/serio_raw.c
drivers/input/touchscreen/Kconfig
drivers/input/touchscreen/ads7846.c
drivers/input/tsdev.c
drivers/isdn/capi/capi.c
drivers/isdn/capi/capidrv.c
drivers/isdn/capi/kcapi_proc.c
drivers/isdn/divert/divert_procfs.c
drivers/isdn/gigaset/Kconfig
drivers/isdn/gigaset/Makefile
drivers/isdn/gigaset/asyncdata.c
drivers/isdn/gigaset/bas-gigaset.c
drivers/isdn/gigaset/common.c
drivers/isdn/gigaset/ev-layer.c
drivers/isdn/gigaset/interface.c
drivers/isdn/gigaset/isocdata.c
drivers/isdn/gigaset/ser-gigaset.c [new file with mode: 0644]
drivers/isdn/hardware/avm/avm_cs.c
drivers/isdn/hardware/avm/b1dma.c
drivers/isdn/hardware/avm/c4.c
drivers/isdn/hardware/eicon/capifunc.c
drivers/isdn/hardware/eicon/debug.c
drivers/isdn/hardware/eicon/di.c
drivers/isdn/hardware/eicon/divamnt.c
drivers/isdn/hardware/eicon/divasi.c
drivers/isdn/hardware/eicon/divasmain.c
drivers/isdn/hardware/eicon/divasproc.c
drivers/isdn/hardware/eicon/message.c
drivers/isdn/hardware/eicon/os_pri.c
drivers/isdn/hardware/eicon/platform.h
drivers/isdn/hisax/Kconfig
drivers/isdn/hisax/Makefile
drivers/isdn/hisax/avma1_cs.c
drivers/isdn/hisax/config.c
drivers/isdn/hisax/elsa_cs.c
drivers/isdn/hisax/elsa_ser.c
drivers/isdn/hisax/hfc4s8s_l1.c
drivers/isdn/hisax/hfc_usb.c
drivers/isdn/hisax/hfc_usb.h
drivers/isdn/hisax/hisax.h
drivers/isdn/hisax/isar.c
drivers/isdn/hisax/isdnl1.h
drivers/isdn/hisax/isdnl3.c
drivers/isdn/hisax/isdnl3.h
drivers/isdn/hisax/sedlbauer_cs.c
drivers/isdn/hisax/teles_cs.c
drivers/isdn/hysdn/boardergo.c
drivers/isdn/hysdn/hysdn_procconf.c
drivers/isdn/hysdn/hysdn_proclog.c
drivers/isdn/hysdn/hysdn_sched.c
drivers/isdn/i4l/isdn_bsdcomp.c
drivers/isdn/i4l/isdn_common.c
drivers/isdn/i4l/isdn_tty.c
drivers/isdn/pcbit/callbacks.c
drivers/isdn/pcbit/capi.c
drivers/isdn/pcbit/drv.c
drivers/isdn/pcbit/edss1.c
drivers/isdn/pcbit/edss1.h
drivers/isdn/pcbit/layer2.c
drivers/isdn/pcbit/module.c
drivers/isdn/pcbit/pcbit.h
drivers/isdn/sc/card.h
drivers/isdn/sc/command.c
drivers/isdn/sc/event.c
drivers/isdn/sc/init.c
drivers/isdn/sc/interrupt.c
drivers/isdn/sc/ioctl.c
drivers/isdn/sc/message.c
drivers/isdn/sc/packet.c
drivers/isdn/sc/scioc.h
drivers/isdn/sc/shmem.c
drivers/isdn/sc/timer.c
drivers/kvm/kvm.h
drivers/kvm/kvm_main.c
drivers/kvm/paging_tmpl.h
drivers/kvm/svm.c
drivers/kvm/vmx.c
drivers/kvm/vmx.h
drivers/macintosh/adb.c
drivers/macintosh/adbhid.c
drivers/macintosh/ans-lcd.c
drivers/macintosh/apm_emu.c
drivers/macintosh/mac_hid.c
drivers/macintosh/macio-adb.c
drivers/macintosh/nvram.c
drivers/macintosh/smu.c
drivers/macintosh/therm_adt746x.c
drivers/macintosh/via-cuda.c
drivers/macintosh/via-macii.c
drivers/macintosh/via-maciisi.c
drivers/macintosh/via-pmu.c
drivers/macintosh/via-pmu68k.c
drivers/md/bitmap.c
drivers/md/dm-ioctl.c
drivers/md/md.c
drivers/media/common/saa7146_fops.c
drivers/media/dvb/b2c2/flexcop-i2c.c
drivers/media/dvb/dvb-core/dmxdev.c
drivers/media/dvb/dvb-core/dvbdev.c
drivers/media/dvb/dvb-usb/dvb-usb-i2c.c
drivers/media/dvb/ttpci/av7110_av.c
drivers/media/dvb/ttpci/av7110_ca.c
drivers/media/dvb/ttpci/av7110_hw.c
drivers/media/dvb/ttpci/av7110_v4l.c
drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
drivers/media/radio/dsbr100.c
drivers/media/radio/miropcm20-radio.c
drivers/media/radio/miropcm20-rds.c
drivers/media/radio/radio-aimslab.c
drivers/media/radio/radio-aztech.c
drivers/media/radio/radio-cadet.c
drivers/media/radio/radio-gemtek-pci.c
drivers/media/radio/radio-gemtek.c
drivers/media/radio/radio-maestro.c
drivers/media/radio/radio-maxiradio.c
drivers/media/radio/radio-rtrack2.c
drivers/media/radio/radio-sf16fmi.c
drivers/media/radio/radio-sf16fmr2.c
drivers/media/radio/radio-terratec.c
drivers/media/radio/radio-trust.c
drivers/media/radio/radio-typhoon.c
drivers/media/radio/radio-zoltrix.c
drivers/media/video/adv7170.c
drivers/media/video/adv7175.c
drivers/media/video/arv.c
drivers/media/video/bt819.c
drivers/media/video/bt856.c
drivers/media/video/bt8xx/bttv-driver.c
drivers/media/video/bt8xx/bttv-vbi.c
drivers/media/video/bw-qcam.c
drivers/media/video/c-qcam.c
drivers/media/video/cafe_ccic.c
drivers/media/video/cpia.c
drivers/media/video/cpia2/cpia2_v4l.c
drivers/media/video/cx88/cx88-blackbird.c
drivers/media/video/cx88/cx88-tvaudio.c
drivers/media/video/cx88/cx88-video.c
drivers/media/video/dabusb.c
drivers/media/video/em28xx/em28xx-input.c
drivers/media/video/em28xx/em28xx-video.c
drivers/media/video/et61x251/et61x251_core.c
drivers/media/video/indycam.c
drivers/media/video/ir-kbd-i2c.c
drivers/media/video/meye.c
drivers/media/video/ov511.c
drivers/media/video/pms.c
drivers/media/video/pvrusb2/pvrusb2-i2c-core.c
drivers/media/video/pvrusb2/pvrusb2-v4l2.c
drivers/media/video/pwc/pwc-if.c
drivers/media/video/saa5246a.c
drivers/media/video/saa5249.c
drivers/media/video/saa7111.c
drivers/media/video/saa7114.c
drivers/media/video/saa711x.c
drivers/media/video/saa7134/saa6752hs.c
drivers/media/video/saa7134/saa7134-empress.c
drivers/media/video/saa7134/saa7134-input.c
drivers/media/video/saa7134/saa7134-oss.c
drivers/media/video/saa7134/saa7134-video.c
drivers/media/video/saa7134/saa7134.h
drivers/media/video/saa7185.c
drivers/media/video/saa7191.c
drivers/media/video/se401.c
drivers/media/video/sn9c102/sn9c102_core.c
drivers/media/video/stradis.c
drivers/media/video/stv680.c
drivers/media/video/tda7432.c
drivers/media/video/tda9875.c
drivers/media/video/tuner-core.c
drivers/media/video/tvmixer.c
drivers/media/video/usbvideo/ibmcam.c
drivers/media/video/usbvideo/ultracam.c
drivers/media/video/usbvideo/usbvideo.c
drivers/media/video/usbvideo/vicam.c
drivers/media/video/usbvision/usbvision-core.c
drivers/media/video/usbvision/usbvision-i2c.c
drivers/media/video/usbvision/usbvision-video.c
drivers/media/video/v4l2-common.c
drivers/media/video/videodev.c
drivers/media/video/vino.c
drivers/media/video/vivi.c
drivers/media/video/w9966.c
drivers/media/video/w9968cf.c
drivers/media/video/zc0301/zc0301_core.c
drivers/media/video/zoran_card.c
drivers/media/video/zoran_driver.c
drivers/media/video/zoran_procfs.c
drivers/message/fusion/Kconfig
drivers/message/fusion/Makefile
drivers/message/fusion/lsi/mpi.h
drivers/message/fusion/lsi/mpi_cnfg.h
drivers/message/fusion/lsi/mpi_history.txt
drivers/message/fusion/lsi/mpi_init.h
drivers/message/fusion/lsi/mpi_ioc.h
drivers/message/fusion/lsi/mpi_log_sas.h
drivers/message/fusion/lsi/mpi_sas.h
drivers/message/fusion/mptbase.c
drivers/message/fusion/mptbase.h
drivers/message/fusion/mptctl.c
drivers/message/fusion/mptctl.h
drivers/message/fusion/mptfc.c
drivers/message/fusion/mptlan.c
drivers/message/fusion/mptlan.h
drivers/message/fusion/mptsas.c
drivers/message/fusion/mptscsih.c
drivers/message/fusion/mptscsih.h
drivers/message/fusion/mptspi.c
drivers/message/i2o/i2o_config.c
drivers/message/i2o/i2o_proc.c
drivers/misc/Kconfig
drivers/misc/Makefile
drivers/misc/asus-laptop.c
drivers/misc/hdpuftrs/hdpu_cpustate.c
drivers/misc/hdpuftrs/hdpu_nexus.c
drivers/misc/ibmasm/ibmasmfs.c
drivers/misc/ioc4.c
drivers/misc/sony-laptop.c [new file with mode: 0644]
drivers/misc/tifm_7xx1.c
drivers/mmc/mmc_block.c
drivers/mmc/sdhci.c
drivers/mmc/tifm_sd.c
drivers/mmc/wbsd.c
drivers/mtd/chips/cfi_util.c
drivers/mtd/devices/block2mtd.c
drivers/mtd/devices/doc2001.c
drivers/mtd/devices/doc2001plus.c
drivers/mtd/devices/docecc.c
drivers/mtd/devices/pmc551.c
drivers/mtd/devices/slram.c
drivers/mtd/ftl.c
drivers/mtd/inftlmount.c
drivers/mtd/mtdchar.c
drivers/mtd/mtdcore.c
drivers/mtd/nand/cafe.c
drivers/mtd/nftlcore.c
drivers/net/7990.c
drivers/net/arcnet/com20020.c
drivers/net/arm/ether1.c
drivers/net/arm/ether3.c
drivers/net/arm/etherh.c
drivers/net/au1000_eth.c
drivers/net/bonding/bond_main.c
drivers/net/bonding/bond_sysfs.c
drivers/net/cris/eth_v10.c
drivers/net/cxgb3/cxgb3_main.c
drivers/net/ehea/ehea_main.c
drivers/net/fec_8xx/fec_8xx-netta.c
drivers/net/fec_8xx/fec_main.c
drivers/net/fec_8xx/fec_mii.c
drivers/net/fs_enet/fs_enet-main.c
drivers/net/fs_enet/mac-fcc.c
drivers/net/fs_enet/mac-fec.c
drivers/net/fs_enet/mac-scc.c
drivers/net/fs_enet/mii-bitbang.c
drivers/net/fs_enet/mii-fec.c
drivers/net/gianfar.c
drivers/net/gianfar_ethtool.c
drivers/net/gianfar_mii.c
drivers/net/gianfar_sysfs.c
drivers/net/hamradio/bpqether.c
drivers/net/hamradio/scc.c
drivers/net/hamradio/yam.c
drivers/net/ibm_emac/ibm_emac_core.c
drivers/net/ibmveth.c
drivers/net/irda/ma600-sir.c
drivers/net/irda/vlsi_ir.c
drivers/net/macb.c
drivers/net/meth.c
drivers/net/mipsnet.c
drivers/net/netxen/netxen_nic_main.c
drivers/net/phy/cicada.c
drivers/net/phy/davicom.c
drivers/net/phy/fixed.c
drivers/net/phy/lxt.c
drivers/net/phy/marvell.c
drivers/net/phy/mdio_bus.c
drivers/net/phy/phy.c
drivers/net/phy/phy_device.c
drivers/net/phy/qsemi.c
drivers/net/ppp_generic.c
drivers/net/pppoe.c
drivers/net/qla3xxx.c
drivers/net/s2io.c
drivers/net/sc92031.c
drivers/net/sungem_phy.c
drivers/net/tg3.c
drivers/net/tg3.h
drivers/net/tsi108_eth.c
drivers/net/tun.c
drivers/net/ucc_geth.c
drivers/net/ucc_geth_phy.c
drivers/net/wan/cosa.c
drivers/net/wan/cycx_drv.c
drivers/net/wan/pci200syn.c
drivers/net/wireless/airo.c
drivers/net/wireless/arlan-proc.c
drivers/net/wireless/atmel.c
drivers/net/wireless/bcm43xx/bcm43xx_debugfs.c
drivers/net/wireless/bcm43xx/bcm43xx_wx.c
drivers/net/wireless/strip.c
drivers/oprofile/event_buffer.c
drivers/oprofile/event_buffer.h
drivers/oprofile/oprofile_files.c
drivers/oprofile/oprofilefs.c
drivers/parisc/ccio-dma.c
drivers/parisc/eisa.c
drivers/parisc/eisa_eeprom.c
drivers/parisc/led.c
drivers/parisc/sba_iommu.c
drivers/parport/parport_cs.c
drivers/parport/parport_gsc.c
drivers/parport/procfs.c
drivers/pci/Kconfig
drivers/pci/hotplug/cpqphp_sysfs.c
drivers/pci/hotplug/ibmphp_ebda.c
drivers/pci/pci.c
drivers/pci/pcie/aer/aerdrv.c
drivers/pci/proc.c
drivers/pci/quirks.c
drivers/pci/syscall.c
drivers/pcmcia/at91_cf.c
drivers/pcmcia/cistpl.c
drivers/pcmcia/i82365.c
drivers/pcmcia/m32r_cfc.c
drivers/pcmcia/m32r_pcc.c
drivers/pcmcia/m8xx_pcmcia.c
drivers/pcmcia/omap_cf.c
drivers/pcmcia/pcmcia_ioctl.c
drivers/pcmcia/pxa2xx_lubbock.c
drivers/pcmcia/sa1100_badge4.c
drivers/pcmcia/sa1100_cerf.c
drivers/pcmcia/sa1100_h3600.c
drivers/pcmcia/sa1100_jornada720.c
drivers/pcmcia/sa1100_neponset.c
drivers/pcmcia/sa1100_shannon.c
drivers/pcmcia/sa1100_simpad.c
drivers/pcmcia/vrc4171_card.c
drivers/pcmcia/yenta_socket.c
drivers/pnp/base.h
drivers/pnp/isapnp/proc.c
drivers/pnp/pnpacpi/Kconfig
drivers/pnp/pnpbios/rsparser.c
drivers/ps3/Makefile
drivers/ps3/ps3av.c [new file with mode: 0644]
drivers/ps3/ps3av_cmd.c [new file with mode: 0644]
drivers/ps3/vuart.c
drivers/ps3/vuart.h
drivers/rapidio/rio-scan.c
drivers/rapidio/rio-sysfs.c
drivers/rtc/Kconfig
drivers/rtc/Makefile
drivers/rtc/rtc-cmos.c [new file with mode: 0644]
drivers/rtc/rtc-dev.c
drivers/rtc/rtc-ds1553.c
drivers/rtc/rtc-ds1672.c
drivers/rtc/rtc-ds1742.c
drivers/rtc/rtc-omap.c
drivers/rtc/rtc-pcf8563.c
drivers/rtc/rtc-proc.c
drivers/rtc/rtc-rs5c372.c
drivers/rtc/rtc-s3c.c
drivers/rtc/rtc-sysfs.c
drivers/rtc/rtc-x1205.c
drivers/s390/block/dasd_eer.c
drivers/s390/block/dasd_proc.c
drivers/s390/char/fs3270.c
drivers/s390/char/monreader.c
drivers/s390/char/monwriter.c
drivers/s390/char/sclp_tty.c
drivers/s390/char/sclp_vt220.c
drivers/s390/char/tape_char.c
drivers/s390/char/tape_class.c
drivers/s390/char/tape_class.h
drivers/s390/char/tape_proc.c
drivers/s390/char/vmcp.c
drivers/s390/char/vmlogrdr.c
drivers/s390/char/vmwatchdog.c
drivers/s390/cio/blacklist.c
drivers/s390/cio/device_id.c
drivers/s390/cio/device_ops.c
drivers/s390/cio/qdio.c
drivers/s390/crypto/zcrypt_api.c
drivers/s390/net/ctcmain.c
drivers/s390/net/lcs.c
drivers/s390/net/netiucv.c
drivers/s390/net/qeth_proc.c
drivers/s390/scsi/zfcp_aux.c
drivers/s390/scsi/zfcp_erp.c
drivers/s390/scsi/zfcp_ext.h
drivers/s390/scsi/zfcp_fsf.c
drivers/sbus/char/bpp.c
drivers/sbus/char/cpwatchdog.c
drivers/sbus/char/display7seg.c
drivers/sbus/char/envctrl.c
drivers/sbus/char/flash.c
drivers/sbus/char/jsflash.c
drivers/sbus/char/openprom.c
drivers/sbus/char/riowatchdog.c
drivers/sbus/char/rtc.c
drivers/sbus/char/uctrl.c
drivers/sbus/char/vfc_dev.c
drivers/sbus/sbus.c
drivers/scsi/3w-9xxx.c
drivers/scsi/3w-xxxx.c
drivers/scsi/53c700.c
drivers/scsi/53c700.h
drivers/scsi/53c7xx.c
drivers/scsi/BusLogic.c
drivers/scsi/BusLogic.h
drivers/scsi/FlashPoint.c
drivers/scsi/Kconfig
drivers/scsi/Makefile
drivers/scsi/NCR53c406a.c
drivers/scsi/NCR_D700.c
drivers/scsi/a2091.c
drivers/scsi/a3000.c
drivers/scsi/aacraid/Makefile
drivers/scsi/aacraid/aachba.c
drivers/scsi/aacraid/aacraid.h
drivers/scsi/aacraid/commctrl.c
drivers/scsi/aacraid/comminit.c
drivers/scsi/aacraid/commsup.c
drivers/scsi/aacraid/dpcsup.c
drivers/scsi/aacraid/linit.c
drivers/scsi/aacraid/nark.c [new file with mode: 0644]
drivers/scsi/aacraid/rkt.c
drivers/scsi/aacraid/rx.c
drivers/scsi/aacraid/sa.c
drivers/scsi/advansys.c
drivers/scsi/aha152x.c
drivers/scsi/aic7xxx/aic79xx.h
drivers/scsi/aic7xxx/aic79xx_core.c
drivers/scsi/aic7xxx/aic79xx_osm.c
drivers/scsi/aic7xxx/aic79xx_osm.h
drivers/scsi/aic7xxx/aic79xx_osm_pci.c
drivers/scsi/aic7xxx/aic79xx_pci.c
drivers/scsi/aic7xxx_old.c
drivers/scsi/aic94xx/aic94xx_dev.c
drivers/scsi/aic94xx/aic94xx_dump.c
drivers/scsi/aic94xx/aic94xx_hwi.c
drivers/scsi/aic94xx/aic94xx_init.c
drivers/scsi/aic94xx/aic94xx_reg_def.h
drivers/scsi/aic94xx/aic94xx_sas.h
drivers/scsi/aic94xx/aic94xx_scb.c
drivers/scsi/aic94xx/aic94xx_sds.c
drivers/scsi/aic94xx/aic94xx_seq.c
drivers/scsi/aic94xx/aic94xx_seq.h
drivers/scsi/aic94xx/aic94xx_task.c
drivers/scsi/aic94xx/aic94xx_tmf.c
drivers/scsi/amiga7xx.c
drivers/scsi/arcmsr/arcmsr_hba.c
drivers/scsi/arm/acornscsi.c
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/oak.c
drivers/scsi/arm/powertec.c
drivers/scsi/atari_scsi.c
drivers/scsi/bvme6000.c
drivers/scsi/ch.c
drivers/scsi/dpt_i2o.c
drivers/scsi/dtc.c
drivers/scsi/eata_pio.c
drivers/scsi/g_NCR5380.c
drivers/scsi/gdth.c
drivers/scsi/gvp11.c
drivers/scsi/ibmvscsi/ibmvstgt.c
drivers/scsi/initio.c
drivers/scsi/ipr.c
drivers/scsi/ipr.h
drivers/scsi/lasi700.c
drivers/scsi/libsas/sas_discover.c
drivers/scsi/libsas/sas_event.c
drivers/scsi/libsas/sas_expander.c
drivers/scsi/libsas/sas_init.c
drivers/scsi/libsas/sas_internal.h
drivers/scsi/libsas/sas_port.c
drivers/scsi/libsas/sas_scsi_host.c
drivers/scsi/mac_scsi.c
drivers/scsi/megaraid.c
drivers/scsi/megaraid/mbox_defs.h
drivers/scsi/megaraid/mega_common.h
drivers/scsi/megaraid/megaraid_ioctl.h
drivers/scsi/megaraid/megaraid_mbox.c
drivers/scsi/megaraid/megaraid_mbox.h
drivers/scsi/megaraid/megaraid_mm.c
drivers/scsi/megaraid/megaraid_sas.c
drivers/scsi/megaraid/megaraid_sas.h
drivers/scsi/mvme147.c
drivers/scsi/mvme16x.c
drivers/scsi/nsp32.c
drivers/scsi/osst.c
drivers/scsi/pas16.c
drivers/scsi/pcmcia/aha152x_stub.c
drivers/scsi/pcmcia/fdomain_stub.c
drivers/scsi/pcmcia/nsp_cs.c
drivers/scsi/pcmcia/nsp_cs.h
drivers/scsi/pcmcia/qlogic_stub.c
drivers/scsi/pcmcia/sym53c500_cs.c
drivers/scsi/qla1280.c
drivers/scsi/qla2xxx/qla_attr.c
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_gbl.h
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_isr.c
drivers/scsi/qla2xxx/qla_mbx.c
drivers/scsi/qla2xxx/qla_os.c
drivers/scsi/qla2xxx/qla_sup.c
drivers/scsi/qla2xxx/qla_version.h
drivers/scsi/qla4xxx/ql4_os.c
drivers/scsi/scsi.c
drivers/scsi/scsi_debug.c
drivers/scsi/scsi_error.c
drivers/scsi/scsi_lib.c
drivers/scsi/scsi_priv.h
drivers/scsi/scsi_proc.c
drivers/scsi/scsi_scan.c
drivers/scsi/scsi_sysctl.c
drivers/scsi/scsi_tgt_if.c
drivers/scsi/scsi_transport_fc.c
drivers/scsi/scsi_transport_sas.c
drivers/scsi/scsi_transport_spi.c
drivers/scsi/sd.c
drivers/scsi/sim710.c
drivers/scsi/sni_53c710.c [new file with mode: 0644]
drivers/scsi/sr.c
drivers/scsi/sr_ioctl.c
drivers/scsi/st.c
drivers/scsi/st.h
drivers/scsi/stex.c
drivers/scsi/sun3_scsi.c
drivers/scsi/sun3_scsi_vme.c
drivers/scsi/sym53c416.c
drivers/scsi/t128.c
drivers/scsi/tmscsim.c
drivers/scsi/wd33c93.c
drivers/serial/8250.c
drivers/serial/8250_acorn.c
drivers/serial/8250_pci.c
drivers/serial/8250_pnp.c
drivers/serial/Kconfig
drivers/serial/Makefile
drivers/serial/atmel_serial.c
drivers/serial/crisv10.c
drivers/serial/icom.c
drivers/serial/ioc3_serial.c
drivers/serial/ioc4_serial.c
drivers/serial/ip22zilog.c
drivers/serial/jsm/jsm_driver.c
drivers/serial/jsm/jsm_tty.c
drivers/serial/mpc52xx_uart.c
drivers/serial/of_serial.c [new file with mode: 0644]
drivers/serial/pnx8xxx_uart.c [new file with mode: 0644]
drivers/serial/serial_core.c
drivers/serial/serial_cs.c
drivers/serial/serial_txx9.c
drivers/serial/sunsab.c
drivers/serial/sunsu.c
drivers/serial/sunzilog.c
drivers/sn/ioc3.c
drivers/spi/Kconfig
drivers/spi/Makefile
drivers/spi/at25.c [new file with mode: 0644]
drivers/spi/atmel_spi.c [new file with mode: 0644]
drivers/spi/atmel_spi.h [new file with mode: 0644]
drivers/spi/omap_uwire.c [new file with mode: 0644]
drivers/spi/pxa2xx_spi.c
drivers/spi/spi.c
drivers/spi/spi_bitbang.c
drivers/spi/spi_imx.c [new file with mode: 0644]
drivers/tc/lk201.c
drivers/tc/zs.c
drivers/telephony/ixj.c
drivers/telephony/ixj.h
drivers/telephony/ixj_pcmcia.c
drivers/telephony/phonedev.c
drivers/usb/gadget/at91_udc.c
drivers/usb/gadget/dummy_hcd.c
drivers/usb/gadget/ether.c
drivers/usb/gadget/file_storage.c
drivers/usb/gadget/goku_udc.c
drivers/usb/gadget/net2280.c
drivers/usb/gadget/omap_udc.c
drivers/usb/gadget/pxa2xx_udc.c
drivers/usb/gadget/rndis.c
drivers/usb/gadget/serial.c
drivers/usb/gadget/zero.c
drivers/usb/host/hc_crisv10.c
drivers/usb/host/ohci-ep93xx.c
drivers/usb/host/ohci-pnx4008.c
drivers/usb/host/ohci-pnx8550.c
drivers/usb/host/sl811_cs.c
drivers/usb/host/uhci-hcd.c
drivers/usb/host/uhci-q.c
drivers/usb/image/microtek.c
drivers/usb/input/aiptek.c
drivers/usb/input/hid-core.c
drivers/usb/input/hid-ff.c
drivers/usb/input/hid-lgff.c
drivers/usb/input/hid-pidff.c
drivers/usb/misc/adutux.c
drivers/usb/misc/appledisplay.c
drivers/usb/misc/ftdi-elan.c
drivers/usb/misc/sisusbvga/sisusb.c
drivers/usb/misc/sisusbvga/sisusb_con.c
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/plusb.c
drivers/usb/net/rndis_host.c
drivers/usb/net/rtl8150.c
drivers/usb/net/usbnet.c
drivers/usb/net/zaurus.c
drivers/usb/serial/digi_acceleport.c
drivers/usb/serial/keyspan_pda.c
drivers/usb/serial/mos7720.c
drivers/usb/serial/mos7840.c
drivers/usb/storage/datafab.c
drivers/usb/storage/initializers.c
drivers/usb/storage/jumpshot.c
drivers/usb/storage/sddr09.c
drivers/usb/storage/shuttle_usbat.c
drivers/video/Kconfig
drivers/video/Makefile
drivers/video/S3triofb.c [deleted file]
drivers/video/atafb.c
drivers/video/aty/atyfb_base.c
drivers/video/aty/mach64_accel.c
drivers/video/aty/mach64_gx.c
drivers/video/aty/radeon_i2c.c
drivers/video/au1100fb.c
drivers/video/console/fbcon.c
drivers/video/console/fbcon.h
drivers/video/console/mdacon.c
drivers/video/console/vgacon.c
drivers/video/controlfb.c
drivers/video/cyber2000fb.c
drivers/video/cyberfb.c [deleted file]
drivers/video/cyberfb.h [deleted file]
drivers/video/fbmem.c
drivers/video/fbsysfs.c
drivers/video/g364fb.c
drivers/video/geode/gx1fb_core.c
drivers/video/hitfb.c
drivers/video/hpfb.c
drivers/video/i810/i810-i2c.c
drivers/video/i810/i810.h
drivers/video/i810/i810_main.c
drivers/video/igafb.c
drivers/video/imxfb.c
drivers/video/intelfb/intelfb_i2c.c
drivers/video/intelfb/intelfbdrv.c
drivers/video/intelfb/intelfbhw.c
drivers/video/kyro/fbdev.c
drivers/video/macfb.c
drivers/video/matrox/i2c-matroxfb.c
drivers/video/matrox/matroxfb_crtc2.c
drivers/video/maxinefb.c
drivers/video/mbx/mbxdebugfs.c
drivers/video/modedb.c
drivers/video/neofb.c
drivers/video/nvidia/nv_i2c.c
drivers/video/nvidia/nv_of.c
drivers/video/nvidia/nvidia.c
drivers/video/pm3fb.c
drivers/video/pmag-aa-fb.c
drivers/video/ps3fb.c [new file with mode: 0644]
drivers/video/retz3fb.c [deleted file]
drivers/video/retz3fb.h [deleted file]
drivers/video/riva/fbdev.c
drivers/video/riva/rivafb-i2c.c
drivers/video/riva/rivafb.h
drivers/video/s3c2410fb.c
drivers/video/s3fb.c [new file with mode: 0644]
drivers/video/sa1100fb.h
drivers/video/savage/savagefb-i2c.c
drivers/video/savage/savagefb_driver.c
drivers/video/sis/init.c
drivers/video/sis/init.h
drivers/video/sis/init301.c
drivers/video/sis/init301.h
drivers/video/sis/initextlfb.c
drivers/video/sis/sis.h
drivers/video/sis/sis_main.c
drivers/video/sis/sis_main.h
drivers/video/sis/vgatypes.h
drivers/video/sis/vstruct.h
drivers/video/sun3fb.c [deleted file]
drivers/video/svgalib.c [new file with mode: 0644]
drivers/video/tgafb.c
drivers/video/vga16fb.c
drivers/video/virgefb.c [deleted file]
drivers/video/virgefb.h [deleted file]
drivers/w1/slaves/w1_therm.c
drivers/zorro/proc.c
fs/9p/vfs_file.c
fs/9p/vfs_inode.c
fs/9p/vfs_super.c
fs/Kconfig
fs/adfs/adfs.h
fs/adfs/dir.c
fs/adfs/file.c
fs/adfs/super.c
fs/affs/affs.h
fs/affs/dir.c
fs/affs/file.c
fs/affs/inode.c
fs/affs/super.c
fs/affs/symlink.c
fs/afs/cell.c
fs/afs/dir.c
fs/afs/file.c
fs/afs/inode.c
fs/afs/internal.h
fs/afs/main.c
fs/afs/mntpt.c
fs/afs/proc.c
fs/afs/super.c
fs/aio.c
fs/autofs/autofs_i.h
fs/autofs/inode.c
fs/autofs/root.c
fs/autofs/symlink.c
fs/autofs4/autofs_i.h
fs/autofs4/inode.c
fs/autofs4/root.c
fs/autofs4/symlink.c
fs/bad_inode.c
fs/befs/linuxvfs.c
fs/bfs/bfs.h
fs/bfs/dir.c
fs/bfs/file.c
fs/bfs/inode.c
fs/binfmt_elf.c
fs/binfmt_elf_fdpic.c
fs/binfmt_misc.c
fs/block_dev.c
fs/buffer.c
fs/char_dev.c
fs/cifs/CHANGES
fs/cifs/TODO
fs/cifs/cifsfs.c
fs/cifs/cifsfs.h
fs/cifs/cifspdu.h
fs/cifs/cifsproto.h
fs/cifs/cifssmb.c
fs/cifs/connect.c
fs/cifs/file.c
fs/cifs/inode.c
fs/cifs/readdir.c
fs/coda/cnode.c
fs/coda/dir.c
fs/coda/inode.c
fs/coda/pioctl.c
fs/coda/sysctl.c
fs/configfs/configfs_internal.h
fs/configfs/dir.c
fs/configfs/inode.c
fs/configfs/mount.c
fs/configfs/symlink.c
fs/cramfs/inode.c
fs/debugfs/file.c
fs/devpts/inode.c
fs/dlm/debug_fs.c
fs/dlm/memory.c
fs/dlm/user.c
fs/dquot.c
fs/drop_caches.c
fs/ecryptfs/Makefile
fs/ecryptfs/crypto.c
fs/ecryptfs/debug.c
fs/ecryptfs/ecryptfs_kernel.h
fs/ecryptfs/file.c
fs/ecryptfs/inode.c
fs/ecryptfs/keystore.c
fs/ecryptfs/main.c
fs/ecryptfs/messaging.c [new file with mode: 0644]
fs/ecryptfs/mmap.c
fs/ecryptfs/netlink.c [new file with mode: 0644]
fs/ecryptfs/super.c
fs/efs/dir.c
fs/efs/super.c
fs/exec.c
fs/ext2/dir.c
fs/ext2/ext2.h
fs/ext2/file.c
fs/ext2/namei.c
fs/ext2/super.c
fs/ext2/symlink.c
fs/ext3/file.c
fs/ext3/hash.c
fs/ext3/inode.c
fs/ext3/namei.c
fs/ext3/resize.c
fs/ext3/super.c
fs/ext3/symlink.c
fs/ext4/file.c
fs/ext4/hash.c
fs/ext4/inode.c
fs/ext4/namei.c
fs/ext4/resize.c
fs/ext4/super.c
fs/ext4/symlink.c
fs/fat/file.c
fs/fat/inode.c
fs/filesystems.c
fs/freevxfs/vxfs_extern.h
fs/freevxfs/vxfs_immed.c
fs/freevxfs/vxfs_inode.c
fs/freevxfs/vxfs_lookup.c
fs/freevxfs/vxfs_super.c
fs/fuse/control.c
fs/fuse/dir.c
fs/fuse/file.c
fs/fuse/inode.c
fs/gfs2/bmap.c
fs/gfs2/dir.c
fs/gfs2/eaops.c
fs/gfs2/eattr.c
fs/gfs2/glops.c
fs/gfs2/lm.c
fs/gfs2/locking/dlm/plock.c
fs/gfs2/main.c
fs/gfs2/meta_io.c
fs/gfs2/mount.c
fs/gfs2/ondisk.c
fs/gfs2/ops_dentry.c
fs/gfs2/ops_export.c
fs/gfs2/ops_file.c
fs/gfs2/ops_inode.c
fs/gfs2/ops_inode.h
fs/gfs2/ops_super.c
fs/gfs2/ops_super.h
fs/gfs2/ops_vm.c
fs/gfs2/recovery.c
fs/gfs2/rgrp.c
fs/gfs2/util.c
fs/hfs/dir.c
fs/hfs/hfs.h
fs/hfs/hfs_fs.h
fs/hfs/inode.c
fs/hfs/super.c
fs/hfsplus/catalog.c
fs/hfsplus/dir.c
fs/hfsplus/hfsplus_raw.h
fs/hfsplus/inode.c
fs/hfsplus/super.c
fs/hostfs/hostfs_kern.c
fs/hpfs/file.c
fs/hpfs/hpfs_fn.h
fs/hpfs/namei.c
fs/hpfs/super.c
fs/hppfs/hppfs_kern.c
fs/hugetlbfs/inode.c
fs/inode.c
fs/inotify_user.c
fs/ioprio.c
fs/isofs/dir.c
fs/isofs/inode.c
fs/isofs/isofs.h
fs/jffs/inode-v23.c
fs/jffs2/compr_zlib.c
fs/jffs2/dir.c
fs/jffs2/file.c
fs/jffs2/os-linux.h
fs/jffs2/summary.c
fs/jffs2/super.c
fs/jffs2/symlink.c
fs/jfs/file.c
fs/jfs/jfs_inode.h
fs/jfs/namei.c
fs/jfs/super.c
fs/jfs/symlink.c
fs/libfs.c
fs/lockd/clntproc.c
fs/lockd/host.c
fs/lockd/svc.c
fs/lockd/svc4proc.c
fs/lockd/svclock.c
fs/lockd/svcproc.c
fs/minix/bitmap.c
fs/minix/dir.c
fs/minix/file.c
fs/minix/inode.c
fs/minix/itree_common.c
fs/minix/itree_v1.c
fs/minix/itree_v2.c
fs/minix/minix.h
fs/minix/namei.c
fs/msdos/namei.c
fs/namei.c
fs/namespace.c
fs/ncpfs/dir.c
fs/ncpfs/file.c
fs/ncpfs/inode.c
fs/nfs/callback.c
fs/nfs/callback_xdr.c
fs/nfs/client.c
fs/nfs/dir.c
fs/nfs/direct.c
fs/nfs/file.c
fs/nfs/getroot.c
fs/nfs/inode.c
fs/nfs/internal.h
fs/nfs/namespace.c
fs/nfs/nfs3proc.c
fs/nfs/nfs4_fs.h
fs/nfs/nfs4namespace.c
fs/nfs/nfs4proc.c
fs/nfs/nfs4renewd.c
fs/nfs/nfs4xdr.c
fs/nfs/proc.c
fs/nfs/read.c
fs/nfs/super.c
fs/nfs/symlink.c
fs/nfs/sysctl.c
fs/nfs/write.c
fs/nfsd/export.c
fs/nfsd/nfs3xdr.c
fs/nfsd/nfs4acl.c
fs/nfsd/nfs4callback.c
fs/nfsd/nfs4idmap.c
fs/nfsd/nfs4state.c
fs/nfsd/nfs4xdr.c
fs/nfsd/nfscache.c
fs/nfsd/nfsctl.c
fs/nfsd/nfsfh.c
fs/nfsd/nfsproc.c
fs/nfsd/nfssvc.c
fs/nfsd/nfsxdr.c
fs/nfsd/vfs.c
fs/ntfs/attrib.c
fs/ntfs/file.c
fs/ntfs/namei.c
fs/ntfs/ntfs.h
fs/ntfs/super.c
fs/ntfs/sysctl.c
fs/ocfs2/cluster/nodemanager.c
fs/ocfs2/cluster/nodemanager.h
fs/ocfs2/dlm/dlmfs.c
fs/ocfs2/file.c
fs/ocfs2/file.h
fs/ocfs2/namei.c
fs/ocfs2/namei.h
fs/ocfs2/super.c
fs/ocfs2/symlink.c
fs/ocfs2/symlink.h
fs/openpromfs/inode.c
fs/partitions/check.c
fs/partitions/msdos.c
fs/partitions/sgi.c
fs/partitions/sun.c
fs/proc/Makefile
fs/proc/array.c
fs/proc/base.c
fs/proc/generic.c
fs/proc/inode.c
fs/proc/internal.h
fs/proc/nommu.c
fs/proc/proc_misc.c
fs/proc/proc_sysctl.c [new file with mode: 0644]
fs/proc/proc_tty.c
fs/proc/root.c
fs/proc/task_mmu.c
fs/proc/task_nommu.c
fs/qnx4/dir.c
fs/qnx4/file.c
fs/qnx4/inode.c
fs/ramfs/file-mmu.c
fs/ramfs/file-nommu.c
fs/ramfs/inode.c
fs/ramfs/internal.h
fs/read_write.c
fs/reiserfs/do_balan.c
fs/reiserfs/file.c
fs/reiserfs/namei.c
fs/reiserfs/super.c
fs/romfs/inode.c
fs/smbfs/dir.c
fs/smbfs/file.c
fs/smbfs/inode.c
fs/smbfs/proto.h
fs/smbfs/request.c
fs/smbfs/symlink.c
fs/super.c
fs/sysfs/dir.c
fs/sysfs/inode.c
fs/sysfs/mount.c
fs/sysfs/symlink.c
fs/sysfs/sysfs.h
fs/sysv/file.c
fs/sysv/inode.c
fs/sysv/namei.c
fs/sysv/symlink.c
fs/sysv/sysv.h
fs/udf/file.c
fs/udf/namei.c
fs/udf/super.c
fs/udf/udfdecl.h
fs/ufs/balloc.c
fs/ufs/dir.c
fs/ufs/ialloc.c
fs/ufs/inode.c
fs/ufs/namei.c
fs/ufs/super.c
fs/ufs/symlink.c
fs/ufs/truncate.c
fs/ufs/util.h
fs/vfat/namei.c
fs/xattr_acl.c
fs/xfs/linux-2.6/kmem.c
fs/xfs/linux-2.6/mrlock.h
fs/xfs/linux-2.6/xfs_aops.c
fs/xfs/linux-2.6/xfs_buf.c
fs/xfs/linux-2.6/xfs_buf.h
fs/xfs/linux-2.6/xfs_export.c
fs/xfs/linux-2.6/xfs_file.c
fs/xfs/linux-2.6/xfs_ioctl.c
fs/xfs/linux-2.6/xfs_iops.c
fs/xfs/linux-2.6/xfs_iops.h
fs/xfs/linux-2.6/xfs_linux.h
fs/xfs/linux-2.6/xfs_lrw.c
fs/xfs/linux-2.6/xfs_lrw.h
fs/xfs/linux-2.6/xfs_super.c
fs/xfs/linux-2.6/xfs_sysctl.c
fs/xfs/linux-2.6/xfs_vfs.h
fs/xfs/linux-2.6/xfs_vnode.c
fs/xfs/linux-2.6/xfs_vnode.h
fs/xfs/quota/xfs_dquot.c
fs/xfs/quota/xfs_dquot_item.c
fs/xfs/quota/xfs_qm.c
fs/xfs/quota/xfs_qm_bhv.c
fs/xfs/quota/xfs_qm_stats.c
fs/xfs/quota/xfs_qm_syscalls.c
fs/xfs/quota/xfs_trans_dquot.c
fs/xfs/support/debug.c
fs/xfs/support/debug.h
fs/xfs/support/move.h
fs/xfs/xfs_acl.c
fs/xfs/xfs_alloc_btree.h
fs/xfs/xfs_attr.c
fs/xfs/xfs_attr_leaf.c
fs/xfs/xfs_bit.c
fs/xfs/xfs_bmap.c
fs/xfs/xfs_bmap.h
fs/xfs/xfs_bmap_btree.c
fs/xfs/xfs_bmap_btree.h
fs/xfs/xfs_btree.h
fs/xfs/xfs_buf_item.c
fs/xfs/xfs_buf_item.h
fs/xfs/xfs_cap.h [deleted file]
fs/xfs/xfs_da_btree.c
fs/xfs/xfs_da_btree.h
fs/xfs/xfs_dfrag.c
fs/xfs/xfs_error.c
fs/xfs/xfs_error.h
fs/xfs/xfs_extfree_item.c
fs/xfs/xfs_fsops.c
fs/xfs/xfs_ialloc.c
fs/xfs/xfs_ialloc_btree.h
fs/xfs/xfs_inode.c
fs/xfs/xfs_inode_item.c
fs/xfs/xfs_iomap.c
fs/xfs/xfs_log_recover.c
fs/xfs/xfs_mac.h [deleted file]
fs/xfs/xfs_mount.c
fs/xfs/xfs_mount.h
fs/xfs/xfs_rename.c
fs/xfs/xfs_rtalloc.c
fs/xfs/xfs_rtalloc.h
fs/xfs/xfs_rw.c
fs/xfs/xfs_trans.c
fs/xfs/xfs_trans.h
fs/xfs/xfs_trans_ail.c
fs/xfs/xfs_vfsops.c
fs/xfs/xfs_vnodeops.c
include/acpi/acinterp.h
include/acpi/acobject.h
include/acpi/acpi_drivers.h
include/acpi/acpiosxf.h
include/acpi/processor.h
include/asm-alpha/mman.h
include/asm-alpha/percpu.h
include/asm-alpha/termios.h
include/asm-arm/arch-at91rm9200/gpio.h
include/asm-arm/arch-imx/spi_imx.h [new file with mode: 0644]
include/asm-arm/arch-omap/gpio.h
include/asm-arm/arch-pxa/gpio.h [new file with mode: 0644]
include/asm-arm/arch-s3c2410/gpio.h [new file with mode: 0644]
include/asm-arm/arch-sa1100/gpio.h [new file with mode: 0644]
include/asm-arm/gpio.h [new file with mode: 0644]
include/asm-arm/hardware/gpio_keys.h [new file with mode: 0644]
include/asm-arm/spinlock.h
include/asm-arm/termios.h
include/asm-arm/uaccess.h
include/asm-arm26/termios.h
include/asm-arm26/uaccess-asm.h
include/asm-avr32/arch-at32ap/board.h
include/asm-avr32/io.h
include/asm-avr32/termios.h
include/asm-avr32/unistd.h
include/asm-cris/semaphore-helper.h
include/asm-cris/system.h
include/asm-cris/termios.h
include/asm-frv/termios.h
include/asm-generic/dma-mapping-broken.h
include/asm-generic/gpio.h [new file with mode: 0644]
include/asm-generic/memory_model.h
include/asm-generic/mman.h
include/asm-generic/pgtable.h
include/asm-h8300/termios.h
include/asm-i386/acpi.h
include/asm-i386/apic.h
include/asm-i386/atomic.h
include/asm-i386/bitops.h
include/asm-i386/bugs.h
include/asm-i386/desc.h
include/asm-i386/elf.h
include/asm-i386/hpet.h
include/asm-i386/i8253.h
include/asm-i386/idle.h [new file with mode: 0644]
include/asm-i386/mach-default/do_timer.h
include/asm-i386/mach-voyager/do_timer.h
include/asm-i386/mce.h
include/asm-i386/mmu_context.h
include/asm-i386/mpspec.h
include/asm-i386/msr.h
include/asm-i386/paravirt.h
include/asm-i386/pda.h
include/asm-i386/pgalloc.h
include/asm-i386/processor.h
include/asm-i386/ptrace.h
include/asm-i386/segment.h
include/asm-i386/setup.h
include/asm-i386/smp.h
include/asm-i386/termios.h
include/asm-i386/time.h
include/asm-i386/timer.h
include/asm-i386/tsc.h
include/asm-i386/uaccess.h
include/asm-i386/vmi.h [new file with mode: 0644]
include/asm-i386/vmi_time.h [new file with mode: 0644]
include/asm-ia64/dma-mapping.h
include/asm-ia64/libata-portmap.h [new file with mode: 0644]
include/asm-ia64/setup.h
include/asm-ia64/termios.h
include/asm-m32r/a.out.h
include/asm-m32r/addrspace.h
include/asm-m32r/bugs.h
include/asm-m32r/byteorder.h
include/asm-m32r/cache.h
include/asm-m32r/cacheflush.h
include/asm-m32r/current.h
include/asm-m32r/delay.h
include/asm-m32r/dma.h
include/asm-m32r/errno.h
include/asm-m32r/ide.h
include/asm-m32r/ioctls.h
include/asm-m32r/ipcbuf.h
include/asm-m32r/kmap_types.h
include/asm-m32r/m32104ut/m32104ut_pld.h
include/asm-m32r/m32700ut/m32700ut_lan.h
include/asm-m32r/m32700ut/m32700ut_lcd.h
include/asm-m32r/m32700ut/m32700ut_pld.h
include/asm-m32r/mappi2/mappi2_pld.h
include/asm-m32r/mappi3/mappi3_pld.h
include/asm-m32r/mc146818rtc.h
include/asm-m32r/mman.h
include/asm-m32r/mmu.h
include/asm-m32r/mmu_context.h
include/asm-m32r/module.h
include/asm-m32r/msgbuf.h
include/asm-m32r/namei.h
include/asm-m32r/opsput/opsput_lan.h
include/asm-m32r/opsput/opsput_lcd.h
include/asm-m32r/opsput/opsput_pld.h
include/asm-m32r/page.h
include/asm-m32r/param.h
include/asm-m32r/pci.h
include/asm-m32r/pgalloc.h
include/asm-m32r/pgtable-2level.h
include/asm-m32r/posix_types.h
include/asm-m32r/rtc.h
include/asm-m32r/scatterlist.h
include/asm-m32r/sections.h
include/asm-m32r/segment.h
include/asm-m32r/sembuf.h
include/asm-m32r/setup.h
include/asm-m32r/shmbuf.h
include/asm-m32r/shmparam.h
include/asm-m32r/sigcontext.h
include/asm-m32r/siginfo.h
include/asm-m32r/signal.h
include/asm-m32r/smp.h
include/asm-m32r/sockios.h
include/asm-m32r/spinlock_types.h
include/asm-m32r/stat.h
include/asm-m32r/string.h
include/asm-m32r/syscall.h
include/asm-m32r/system.h
include/asm-m32r/termbits.h
include/asm-m32r/termios.h
include/asm-m32r/timex.h
include/asm-m32r/tlbflush.h
include/asm-m32r/types.h
include/asm-m32r/uaccess.h
include/asm-m32r/ucontext.h
include/asm-m32r/unaligned.h
include/asm-m32r/unistd.h
include/asm-m32r/user.h
include/asm-m32r/vga.h
include/asm-m32r/xor.h
include/asm-m68k/math-emu.h
include/asm-m68k/termios.h
include/asm-m68k/user.h
include/asm-mips/atomic.h
include/asm-mips/bitops.h
include/asm-mips/compat-signal.h [new file with mode: 0644]
include/asm-mips/dma-mapping.h
include/asm-mips/mach-generic/dma-coherence.h [new file with mode: 0644]
include/asm-mips/mach-generic/kmalloc.h
include/asm-mips/mach-ip27/dma-coherence.h [new file with mode: 0644]
include/asm-mips/mach-ip32/dma-coherence.h [new file with mode: 0644]
include/asm-mips/mach-jazz/dma-coherence.h [new file with mode: 0644]
include/asm-mips/mips_mt.h
include/asm-mips/mman.h
include/asm-mips/sigcontext.h
include/asm-mips/spinlock.h
include/asm-mips/system.h
include/asm-mips/termios.h
include/asm-mips/uaccess.h
include/asm-parisc/mman.h
include/asm-parisc/termios.h
include/asm-powerpc/Kbuild
include/asm-powerpc/cell-pmu.h
include/asm-powerpc/floppy.h
include/asm-powerpc/ps3.h
include/asm-powerpc/ps3av.h [new file with mode: 0644]
include/asm-powerpc/ps3fb.h [new file with mode: 0644]
include/asm-powerpc/spu.h
include/asm-powerpc/systbl.h
include/asm-powerpc/termios.h
include/asm-powerpc/ucc_slow.h
include/asm-powerpc/udbg.h
include/asm-powerpc/vdso.h
include/asm-ppc/ibm4xx.h
include/asm-s390/ccwdev.h
include/asm-s390/io.h
include/asm-s390/termios.h
include/asm-sh/Kbuild
include/asm-sh/bigsur/bigsur.h [deleted file]
include/asm-sh/bigsur/io.h [deleted file]
include/asm-sh/bigsur/serial.h [deleted file]
include/asm-sh/bugs.h
include/asm-sh/cacheflush.h
include/asm-sh/cpu-sh3/cacheflush.h
include/asm-sh/cpu-sh4/cacheflush.h
include/asm-sh/cpu-sh4/dma.h
include/asm-sh/dma-mapping.h
include/asm-sh/ec3104/ec3104.h [deleted file]
include/asm-sh/ec3104/io.h [deleted file]
include/asm-sh/ec3104/keyboard.h [deleted file]
include/asm-sh/ec3104/serial.h [deleted file]
include/asm-sh/irq.h
include/asm-sh/kgdb.h
include/asm-sh/mmu.h
include/asm-sh/mmu_context.h
include/asm-sh/page.h
include/asm-sh/pgtable.h
include/asm-sh/processor.h
include/asm-sh/rts7751r2d.h
include/asm-sh/serial.h
include/asm-sh/termios.h
include/asm-sh/thread_info.h
include/asm-sh/tlbflush.h
include/asm-sh/ubc.h
include/asm-sh/unistd.h
include/asm-sh/voyagergx.h
include/asm-sh64/termios.h
include/asm-sparc/io.h
include/asm-sparc/termios.h
include/asm-sparc64/irq.h
include/asm-sparc64/pbm.h
include/asm-sparc64/setup.h
include/asm-sparc64/termios.h
include/asm-um/elf-ppc.h
include/asm-um/processor-x86_64.h
include/asm-um/ptrace-x86_64.h
include/asm-v850/termios.h
include/asm-x86_64/bitops.h
include/asm-x86_64/bootsetup.h
include/asm-x86_64/dma-mapping.h
include/asm-x86_64/e820.h
include/asm-x86_64/hpet.h
include/asm-x86_64/hw_irq.h
include/asm-x86_64/io.h
include/asm-x86_64/io_apic.h
include/asm-x86_64/mce.h
include/asm-x86_64/mmzone.h
include/asm-x86_64/mutex.h
include/asm-x86_64/pgalloc.h
include/asm-x86_64/pgtable.h
include/asm-x86_64/proto.h
include/asm-x86_64/setup.h
include/asm-x86_64/termios.h
include/asm-x86_64/timex.h
include/asm-x86_64/tsc.h [new file with mode: 0644]
include/asm-x86_64/uaccess.h
include/asm-x86_64/vsyscall.h
include/asm-xtensa/mman.h
include/asm-xtensa/termios.h
include/linux/Kbuild
include/linux/acpi.h
include/linux/acpi_pmtmr.h [new file with mode: 0644]
include/linux/agp_backend.h
include/linux/ata.h
include/linux/atalk.h
include/linux/binfmts.h
include/linux/blkdev.h
include/linux/buffer_head.h
include/linux/byteorder/Kbuild
include/linux/byteorder/pdp_endian.h [deleted file]
include/linux/byteorder/swabb.h
include/linux/cfag12864b.h [new file with mode: 0644]
include/linux/clockchips.h [new file with mode: 0644]
include/linux/clocksource.h
include/linux/coda_linux.h
include/linux/compiler-gcc.h
include/linux/console.h
include/linux/console_struct.h
include/linux/cpu.h
include/linux/cpufreq.h
include/linux/cpuset.h
include/linux/device.h
include/linux/dma-mapping.h
include/linux/dmapool.h
include/linux/dn.h
include/linux/efs_fs.h
include/linux/ext3_fs.h
include/linux/ext4_fs.h
include/linux/fb.h
include/linux/fs.h
include/linux/genhd.h
include/linux/gfp.h
include/linux/gigaset_dev.h
include/linux/hardirq.h
include/linux/hrtimer.h
include/linux/i2c-id.h
include/linux/i2c.h
include/linux/init.h
include/linux/init_task.h
include/linux/interrupt.h
include/linux/io.h
include/linux/ioport.h
include/linux/irq.h
include/linux/jiffies.h
include/linux/kernel.h
include/linux/kfifo.h
include/linux/ks0108.h [new file with mode: 0644]
include/linux/ktime.h
include/linux/kvm.h
include/linux/libata.h
include/linux/list.h
include/linux/lockdep.h
include/linux/magic.h
include/linux/mc146818rtc.h
include/linux/minix_fs.h
include/linux/mm.h
include/linux/mm_inline.h
include/linux/mmzone.h
include/linux/mount.h
include/linux/msdos_fs.h
include/linux/ncp_fs.h
include/linux/netfilter.h
include/linux/netfilter_ipv4/ip_conntrack.h
include/linux/netlink.h
include/linux/nfs4.h
include/linux/nfs4_acl.h
include/linux/nfs_fs.h
include/linux/nfs_xdr.h
include/linux/nfsd/const.h
include/linux/nfsd/export.h
include/linux/nfsd/nfsd.h
include/linux/nfsd/nfsfh.h
include/linux/nmi.h
include/linux/pci.h
include/linux/pci_ids.h
include/linux/phonedev.h
include/linux/pid.h
include/linux/pnp.h
include/linux/proc_fs.h
include/linux/qnx4_fs.h
include/linux/quota.h
include/linux/random.h
include/linux/reiserfs_fs.h
include/linux/reiserfs_xattr.h
include/linux/relay.h
include/linux/rio.h
include/linux/sched.h
include/linux/security.h
include/linux/serial_core.h
include/linux/serial_ip3106.h [deleted file]
include/linux/serial_pnx8xxx.h [new file with mode: 0644]
include/linux/slab_def.h
include/linux/socket.h
include/linux/spi/ads7846.h
include/linux/spi/eeprom.h [new file with mode: 0644]
include/linux/spi/spi.h
include/linux/spi/spi_bitbang.h
include/linux/spinlock.h
include/linux/stat.h
include/linux/sunrpc/clnt.h
include/linux/sunrpc/debug.h
include/linux/sunrpc/sched.h
include/linux/sunrpc/svc.h
include/linux/sunrpc/svcsock.h
include/linux/svga.h [new file with mode: 0644]
include/linux/swap.h
include/linux/sysctl.h
include/linux/tick.h [new file with mode: 0644]
include/linux/time.h
include/linux/timer.h
include/linux/timex.h
include/linux/toshiba.h
include/linux/tty.h
include/linux/ufs_fs.h
include/linux/ufs_fs_i.h
include/linux/ufs_fs_sb.h
include/linux/vmstat.h
include/linux/xattr.h
include/net/ax25.h
include/net/dn_route.h
include/net/dst.h
include/net/ip6_fib.h
include/net/netfilter/nf_conntrack.h
include/net/netfilter/nf_conntrack_expect.h
include/net/netfilter/nf_conntrack_l3proto.h
include/net/netfilter/nf_conntrack_l4proto.h
include/net/netrom.h
include/net/rose.h
include/net/route.h
include/net/xfrm.h
include/scsi/libsas.h
include/scsi/scsi_transport_sas.h
include/scsi/scsi_transport_spi.h
include/sound/emu10k1.h
include/sound/pcm.h
include/sound/version.h
include/video/neomagic.h
include/video/s3blit.h [deleted file]
init/Kconfig
init/Makefile
init/calibrate.c
init/initramfs.c
init/main.c
init/noinitramfs.c [new file with mode: 0644]
init/version.c
ipc/Makefile
ipc/ipc_sysctl.c [new file with mode: 0644]
ipc/mqueue.c
ipc/shm.c
ipc/util.c
kernel/Makefile
kernel/auditfilter.c
kernel/capability.c
kernel/compat.c
kernel/cpu.c
kernel/cpuset.c
kernel/exit.c
kernel/fork.c
kernel/futex.c
kernel/hrtimer.c
kernel/irq/Makefile
kernel/irq/chip.c
kernel/irq/devres.c [new file with mode: 0644]
kernel/irq/manage.c
kernel/irq/proc.c
kernel/itimer.c
kernel/kfifo.c
kernel/kmod.c
kernel/kthread.c
kernel/lockdep.c
kernel/lockdep_proc.c
kernel/mutex-debug.c
kernel/panic.c
kernel/posix-cpu-timers.c
kernel/posix-timers.c
kernel/power/disk.c
kernel/power/main.c
kernel/power/snapshot.c
kernel/power/swsusp.c
kernel/power/user.c
kernel/printk.c
kernel/profile.c
kernel/relay.c
kernel/resource.c
kernel/rtmutex.c
kernel/sched.c
kernel/signal.c
kernel/softirq.c
kernel/sys.c
kernel/sysctl.c
kernel/time.c
kernel/time/Kconfig [new file with mode: 0644]
kernel/time/Makefile
kernel/time/clockevents.c [new file with mode: 0644]
kernel/time/clocksource.c
kernel/time/jiffies.c
kernel/time/ntp.c
kernel/time/tick-broadcast.c [new file with mode: 0644]
kernel/time/tick-common.c [new file with mode: 0644]
kernel/time/tick-internal.h [new file with mode: 0644]
kernel/time/tick-oneshot.c [new file with mode: 0644]
kernel/time/tick-sched.c [new file with mode: 0644]
kernel/time/timer_list.c [new file with mode: 0644]
kernel/time/timer_stats.c [new file with mode: 0644]
kernel/timer.c
kernel/tsacct.c
kernel/utsname_sysctl.c [new file with mode: 0644]
kernel/workqueue.c
lib/Kconfig
lib/Kconfig.debug
lib/Makefile
lib/bitmap.c
lib/bust_spinlocks.c
lib/cmdline.c
lib/devres.c [new file with mode: 0644]
lib/idr.c
lib/iomap.c
lib/kobject.c
lib/sha1.c
lib/sort.c
lib/string.c
lib/swiotlb.c
lib/textsearch.c
lib/vsprintf.c
mm/Kconfig
mm/filemap.c
mm/highmem.c
mm/memory.c
mm/mempolicy.c
mm/mempool.c
mm/mincore.c
mm/page-writeback.c
mm/page_alloc.c
mm/readahead.c
mm/shmem.c
mm/slab.c
mm/truncate.c
mm/vmalloc.c
mm/vmscan.c
mm/vmstat.c
net/802/fc.c
net/802/fddi.c
net/802/hippi.c
net/802/psnap.c
net/802/tr.c
net/8021q/vlan.c
net/8021q/vlan.h
net/8021q/vlan_dev.c
net/8021q/vlanproc.c
net/appletalk/aarp.c
net/appletalk/atalk_proc.c
net/appletalk/ddp.c
net/appletalk/dev.c
net/appletalk/sysctl_net_atalk.c
net/atm/addr.c
net/atm/atm_sysfs.c
net/atm/br2684.c
net/atm/clip.c
net/atm/common.c
net/atm/common.h
net/atm/ioctl.c
net/atm/lec.c
net/atm/lec.h
net/atm/mpc.c
net/atm/mpc.h
net/atm/mpoa_caches.c
net/atm/mpoa_caches.h
net/atm/mpoa_proc.c
net/atm/proc.c
net/atm/pvc.c
net/atm/raw.c
net/atm/resources.c
net/atm/signaling.h
net/atm/svc.c
net/ax25/af_ax25.c
net/ax25/ax25_addr.c
net/ax25/ax25_dev.c
net/ax25/ax25_ds_in.c
net/ax25/ax25_ds_subr.c
net/ax25/ax25_iface.c
net/ax25/ax25_in.c
net/ax25/ax25_ip.c
net/ax25/ax25_out.c
net/ax25/ax25_route.c
net/ax25/ax25_std_in.c
net/ax25/ax25_std_subr.c
net/ax25/ax25_std_timer.c
net/ax25/ax25_subr.c
net/ax25/ax25_uid.c
net/ax25/sysctl_net_ax25.c
net/bluetooth/af_bluetooth.c
net/bluetooth/bnep/bnep.h
net/bluetooth/bnep/core.c
net/bluetooth/bnep/netdev.c
net/bluetooth/bnep/sock.c
net/bluetooth/cmtp/capi.c
net/bluetooth/cmtp/cmtp.h
net/bluetooth/cmtp/core.c
net/bluetooth/cmtp/sock.c
net/bluetooth/hci_conn.c
net/bluetooth/hci_core.c
net/bluetooth/hci_event.c
net/bluetooth/hci_sock.c
net/bluetooth/hidp/core.c
net/bluetooth/hidp/hidp.h
net/bluetooth/hidp/sock.c
net/bluetooth/l2cap.c
net/bluetooth/lib.c
net/bluetooth/rfcomm/core.c
net/bluetooth/rfcomm/sock.c
net/bluetooth/rfcomm/tty.c
net/bluetooth/sco.c
net/bridge/br_device.c
net/bridge/br_fdb.c
net/bridge/br_forward.c
net/bridge/br_if.c
net/bridge/br_input.c
net/bridge/br_ioctl.c
net/bridge/br_netfilter.c
net/bridge/br_notify.c
net/bridge/br_private.h
net/bridge/br_stp.c
net/bridge/br_stp_bpdu.c
net/bridge/br_stp_if.c
net/bridge/br_stp_timer.c
net/bridge/br_sysfs_br.c
net/bridge/netfilter/ebt_802_3.c
net/bridge/netfilter/ebt_among.c
net/bridge/netfilter/ebt_arpreply.c
net/bridge/netfilter/ebt_ip.c
net/bridge/netfilter/ebt_log.c
net/bridge/netfilter/ebt_mark_m.c
net/bridge/netfilter/ebt_stp.c
net/bridge/netfilter/ebt_ulog.c
net/bridge/netfilter/ebt_vlan.c
net/bridge/netfilter/ebtable_filter.c
net/bridge/netfilter/ebtables.c
net/compat.c
net/core/datagram.c
net/core/dev.c
net/core/dev_mcast.c
net/core/dst.c
net/core/ethtool.c
net/core/filter.c
net/core/gen_estimator.c
net/core/gen_stats.c
net/core/iovec.c
net/core/link_watch.c
net/core/neighbour.c
net/core/net-sysfs.c
net/core/netpoll.c
net/core/pktgen.c
net/core/rtnetlink.c
net/core/scm.c
net/core/skbuff.c
net/core/sock.c
net/core/stream.c
net/core/user_dma.c
net/core/utils.c
net/core/wireless.c
net/dccp/ccids/ccid2.c
net/dccp/ccids/ccid3.c
net/dccp/ccids/lib/packet_history.h
net/dccp/ccids/lib/tfrc_equation.c
net/dccp/dccp.h
net/dccp/feat.c
net/dccp/feat.h
net/dccp/input.c
net/dccp/ipv4.c
net/dccp/ipv6.c
net/dccp/options.c
net/dccp/output.c
net/dccp/probe.c
net/dccp/proto.c
net/dccp/sysctl.c
net/dccp/timer.c
net/decnet/af_decnet.c
net/decnet/dn_dev.c
net/decnet/dn_fib.c
net/decnet/dn_neigh.c
net/decnet/dn_nsp_in.c
net/decnet/dn_nsp_out.c
net/decnet/dn_route.c
net/decnet/dn_rules.c
net/decnet/dn_table.c
net/decnet/netfilter/dn_rtmsg.c
net/decnet/sysctl_net_decnet.c
net/econet/af_econet.c
net/ethernet/eth.c
net/ieee80211/ieee80211_crypt_wep.c
net/ieee80211/ieee80211_rx.c
net/ieee80211/ieee80211_tx.c
net/ieee80211/ieee80211_wx.c
net/ieee80211/softmac/ieee80211softmac_assoc.c
net/ieee80211/softmac/ieee80211softmac_auth.c
net/ieee80211/softmac/ieee80211softmac_event.c
net/ieee80211/softmac/ieee80211softmac_io.c
net/ieee80211/softmac/ieee80211softmac_module.c
net/ieee80211/softmac/ieee80211softmac_priv.h
net/ieee80211/softmac/ieee80211softmac_scan.c
net/ieee80211/softmac/ieee80211softmac_wx.c
net/ipv4/af_inet.c
net/ipv4/ah4.c
net/ipv4/arp.c
net/ipv4/datagram.c
net/ipv4/devinet.c
net/ipv4/esp4.c
net/ipv4/fib_frontend.c
net/ipv4/fib_hash.c
net/ipv4/fib_semantics.c
net/ipv4/fib_trie.c
net/ipv4/icmp.c
net/ipv4/igmp.c
net/ipv4/inet_connection_sock.c
net/ipv4/inet_diag.c
net/ipv4/inet_hashtables.c
net/ipv4/inetpeer.c
net/ipv4/ip_forward.c
net/ipv4/ip_fragment.c
net/ipv4/ip_gre.c
net/ipv4/ip_input.c
net/ipv4/ip_options.c
net/ipv4/ip_output.c
net/ipv4/ip_sockglue.c
net/ipv4/ipcomp.c
net/ipv4/ipconfig.c
net/ipv4/ipip.c
net/ipv4/ipmr.c
net/ipv4/ipvs/ip_vs_app.c
net/ipv4/ipvs/ip_vs_conn.c
net/ipv4/ipvs/ip_vs_core.c
net/ipv4/ipvs/ip_vs_ctl.c
net/ipv4/ipvs/ip_vs_ftp.c
net/ipv4/ipvs/ip_vs_lblc.c
net/ipv4/ipvs/ip_vs_lblcr.c
net/ipv4/ipvs/ip_vs_rr.c
net/ipv4/ipvs/ip_vs_sched.c
net/ipv4/multipath_drr.c
net/ipv4/multipath_random.c
net/ipv4/multipath_rr.c
net/ipv4/multipath_wrandom.c
net/ipv4/netfilter.c
net/ipv4/netfilter/Kconfig
net/ipv4/netfilter/arp_tables.c
net/ipv4/netfilter/arpt_mangle.c
net/ipv4/netfilter/ip_conntrack_amanda.c
net/ipv4/netfilter/ip_conntrack_core.c
net/ipv4/netfilter/ip_conntrack_ftp.c
net/ipv4/netfilter/ip_conntrack_helper_h323.c
net/ipv4/netfilter/ip_conntrack_helper_pptp.c
net/ipv4/netfilter/ip_conntrack_irc.c
net/ipv4/netfilter/ip_conntrack_netbios_ns.c
net/ipv4/netfilter/ip_conntrack_netlink.c
net/ipv4/netfilter/ip_conntrack_proto_generic.c
net/ipv4/netfilter/ip_conntrack_proto_icmp.c
net/ipv4/netfilter/ip_conntrack_proto_sctp.c
net/ipv4/netfilter/ip_conntrack_proto_tcp.c
net/ipv4/netfilter/ip_conntrack_proto_udp.c
net/ipv4/netfilter/ip_conntrack_sip.c
net/ipv4/netfilter/ip_conntrack_standalone.c
net/ipv4/netfilter/ip_conntrack_tftp.c
net/ipv4/netfilter/ip_nat_core.c
net/ipv4/netfilter/ip_nat_ftp.c
net/ipv4/netfilter/ip_nat_helper.c
net/ipv4/netfilter/ip_nat_helper_pptp.c
net/ipv4/netfilter/ip_nat_irc.c
net/ipv4/netfilter/ip_nat_proto_icmp.c
net/ipv4/netfilter/ip_nat_rule.c
net/ipv4/netfilter/ip_nat_sip.c
net/ipv4/netfilter/ip_nat_snmp_basic.c
net/ipv4/netfilter/ip_nat_standalone.c
net/ipv4/netfilter/ip_queue.c
net/ipv4/netfilter/ip_tables.c
net/ipv4/netfilter/ipt_CLUSTERIP.c
net/ipv4/netfilter/ipt_ECN.c
net/ipv4/netfilter/ipt_LOG.c
net/ipv4/netfilter/ipt_MASQUERADE.c
net/ipv4/netfilter/ipt_NETMAP.c
net/ipv4/netfilter/ipt_REDIRECT.c
net/ipv4/netfilter/ipt_REJECT.c
net/ipv4/netfilter/ipt_SAME.c
net/ipv4/netfilter/ipt_TOS.c
net/ipv4/netfilter/ipt_TTL.c
net/ipv4/netfilter/ipt_ULOG.c
net/ipv4/netfilter/ipt_addrtype.c
net/ipv4/netfilter/ipt_ah.c
net/ipv4/netfilter/ipt_iprange.c
net/ipv4/netfilter/ipt_owner.c
net/ipv4/netfilter/ipt_recent.c
net/ipv4/netfilter/ipt_ttl.c
net/ipv4/netfilter/iptable_filter.c
net/ipv4/netfilter/iptable_mangle.c
net/ipv4/netfilter/iptable_raw.c
net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c
net/ipv4/netfilter/nf_conntrack_proto_icmp.c
net/ipv4/netfilter/nf_nat_core.c
net/ipv4/netfilter/nf_nat_h323.c
net/ipv4/netfilter/nf_nat_helper.c
net/ipv4/netfilter/nf_nat_pptp.c
net/ipv4/netfilter/nf_nat_proto_icmp.c
net/ipv4/netfilter/nf_nat_rule.c
net/ipv4/netfilter/nf_nat_sip.c
net/ipv4/netfilter/nf_nat_snmp_basic.c
net/ipv4/netfilter/nf_nat_standalone.c
net/ipv4/proc.c
net/ipv4/protocol.c
net/ipv4/raw.c
net/ipv4/route.c
net/ipv4/syncookies.c
net/ipv4/sysctl_net_ipv4.c
net/ipv4/tcp.c
net/ipv4/tcp_cong.c
net/ipv4/tcp_cubic.c
net/ipv4/tcp_highspeed.c
net/ipv4/tcp_htcp.c
net/ipv4/tcp_input.c
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_minisocks.c
net/ipv4/tcp_output.c
net/ipv4/tcp_probe.c
net/ipv4/tcp_timer.c
net/ipv4/tcp_vegas.c
net/ipv4/tcp_westwood.c
net/ipv4/tunnel4.c
net/ipv4/udp.c
net/ipv4/udp_impl.h
net/ipv4/xfrm4_input.c
net/ipv4/xfrm4_mode_tunnel.c
net/ipv4/xfrm4_output.c
net/ipv4/xfrm4_policy.c
net/ipv4/xfrm4_tunnel.c
net/ipv6/Kconfig
net/ipv6/addrconf.c
net/ipv6/af_inet6.c
net/ipv6/ah6.c
net/ipv6/anycast.c
net/ipv6/datagram.c
net/ipv6/esp6.c
net/ipv6/exthdrs.c
net/ipv6/exthdrs_core.c
net/ipv6/icmp.c
net/ipv6/inet6_hashtables.c
net/ipv6/ip6_fib.c
net/ipv6/ip6_flowlabel.c
net/ipv6/ip6_input.c
net/ipv6/ip6_output.c
net/ipv6/ip6_tunnel.c
net/ipv6/ipcomp6.c
net/ipv6/ipv6_sockglue.c
net/ipv6/mcast.c
net/ipv6/mip6.c
net/ipv6/ndisc.c
net/ipv6/netfilter.c
net/ipv6/netfilter/Kconfig
net/ipv6/netfilter/ip6_queue.c
net/ipv6/netfilter/ip6_tables.c
net/ipv6/netfilter/ip6t_HL.c
net/ipv6/netfilter/ip6t_LOG.c
net/ipv6/netfilter/ip6t_REJECT.c
net/ipv6/netfilter/ip6t_ah.c
net/ipv6/netfilter/ip6t_hl.c
net/ipv6/netfilter/ip6t_ipv6header.c
net/ipv6/netfilter/ip6t_mh.c
net/ipv6/netfilter/ip6table_mangle.c
net/ipv6/netfilter/ip6table_raw.c
net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c
net/ipv6/netfilter/nf_conntrack_reasm.c
net/ipv6/proc.c
net/ipv6/protocol.c
net/ipv6/raw.c
net/ipv6/reassembly.c
net/ipv6/route.c
net/ipv6/sit.c
net/ipv6/sysctl_net_ipv6.c
net/ipv6/tcp_ipv6.c
net/ipv6/tunnel6.c
net/ipv6/udp.c
net/ipv6/udp_impl.h
net/ipv6/xfrm6_input.c
net/ipv6/xfrm6_output.c
net/ipv6/xfrm6_policy.c
net/ipv6/xfrm6_state.c
net/ipv6/xfrm6_tunnel.c
net/ipx/af_ipx.c
net/ipx/ipx_proc.c
net/ipx/ipx_route.c
net/ipx/sysctl_net_ipx.c
net/irda/af_irda.c
net/irda/discovery.c
net/irda/ircomm/ircomm_core.c
net/irda/ircomm/ircomm_event.c
net/irda/ircomm/ircomm_lmp.c
net/irda/ircomm/ircomm_param.c
net/irda/ircomm/ircomm_ttp.c
net/irda/ircomm/ircomm_tty.c
net/irda/ircomm/ircomm_tty_attach.c
net/irda/ircomm/ircomm_tty_ioctl.c
net/irda/irda_device.c
net/irda/iriap.c
net/irda/irias_object.c
net/irda/irlan/irlan_client.c
net/irda/irlan/irlan_client_event.c
net/irda/irlan/irlan_common.c
net/irda/irlan/irlan_eth.c
net/irda/irlan/irlan_event.c
net/irda/irlan/irlan_filter.c
net/irda/irlan/irlan_provider.c
net/irda/irlan/irlan_provider_event.c
net/irda/irlap.c
net/irda/irlap_event.c
net/irda/irlap_frame.c
net/irda/irlmp.c
net/irda/irlmp_event.c
net/irda/irlmp_frame.c
net/irda/irmod.c
net/irda/irnet/irnet.h
net/irda/irnet/irnet_irda.c
net/irda/irnet/irnet_irda.h
net/irda/irnet/irnet_ppp.c
net/irda/irproc.c
net/irda/irqueue.c
net/irda/irsysctl.c
net/irda/irttp.c
net/irda/parameters.c
net/irda/qos.c
net/irda/timer.c
net/irda/wrapper.c
net/key/af_key.c
net/lapb/lapb_iface.c
net/lapb/lapb_in.c
net/lapb/lapb_out.c
net/lapb/lapb_subr.c
net/lapb/lapb_timer.c
net/llc/af_llc.c
net/llc/llc_conn.c
net/llc/llc_input.c
net/llc/llc_output.c
net/llc/llc_pdu.c
net/llc/llc_proc.c
net/llc/llc_s_st.c
net/llc/llc_sap.c
net/llc/llc_station.c
net/llc/sysctl_net_llc.c
net/netfilter/Kconfig
net/netfilter/core.c
net/netfilter/nf_conntrack_core.c
net/netfilter/nf_conntrack_expect.c
net/netfilter/nf_conntrack_ftp.c
net/netfilter/nf_conntrack_h323_main.c
net/netfilter/nf_conntrack_irc.c
net/netfilter/nf_conntrack_l3proto_generic.c
net/netfilter/nf_conntrack_netbios_ns.c
net/netfilter/nf_conntrack_netlink.c
net/netfilter/nf_conntrack_pptp.c
net/netfilter/nf_conntrack_proto.c
net/netfilter/nf_conntrack_proto_generic.c
net/netfilter/nf_conntrack_proto_sctp.c
net/netfilter/nf_conntrack_proto_tcp.c
net/netfilter/nf_conntrack_proto_udp.c
net/netfilter/nf_conntrack_sip.c
net/netfilter/nf_conntrack_standalone.c
net/netfilter/nf_conntrack_tftp.c
net/netfilter/nf_internals.h
net/netfilter/nf_log.c
net/netfilter/nf_queue.c
net/netfilter/nf_sockopt.c
net/netfilter/nf_sysctl.c
net/netfilter/nfnetlink.c
net/netfilter/nfnetlink_log.c
net/netfilter/nfnetlink_queue.c
net/netfilter/x_tables.c
net/netfilter/xt_CLASSIFY.c
net/netfilter/xt_MARK.c
net/netfilter/xt_NFQUEUE.c
net/netfilter/xt_NOTRACK.c
net/netfilter/xt_SECMARK.c
net/netfilter/xt_conntrack.c
net/netfilter/xt_dccp.c
net/netfilter/xt_hashlimit.c
net/netfilter/xt_helper.c
net/netfilter/xt_length.c
net/netfilter/xt_limit.c
net/netfilter/xt_mac.c
net/netfilter/xt_mark.c
net/netfilter/xt_multiport.c
net/netfilter/xt_physdev.c
net/netfilter/xt_policy.c
net/netfilter/xt_quota.c
net/netfilter/xt_realm.c
net/netfilter/xt_sctp.c
net/netfilter/xt_string.c
net/netfilter/xt_tcpmss.c
net/netlabel/netlabel_cipso_v4.c
net/netlink/af_netlink.c
net/netlink/genetlink.c
net/netrom/af_netrom.c
net/netrom/nr_dev.c
net/netrom/nr_in.c
net/netrom/nr_out.c
net/netrom/nr_route.c
net/netrom/nr_subr.c
net/netrom/nr_timer.c
net/netrom/sysctl_net_netrom.c
net/packet/af_packet.c
net/rose/af_rose.c
net/rose/rose_dev.c
net/rose/rose_in.c
net/rose/rose_out.c
net/rose/rose_route.c
net/rose/rose_subr.c
net/rose/sysctl_net_rose.c
net/rxrpc/connection.c
net/rxrpc/internal.h
net/rxrpc/krxiod.c
net/rxrpc/krxsecd.c
net/rxrpc/main.c
net/rxrpc/proc.c
net/rxrpc/sysctl.c
net/rxrpc/transport.c
net/sched/act_api.c
net/sched/act_gact.c
net/sched/act_ipt.c
net/sched/act_mirred.c
net/sched/act_pedit.c
net/sched/act_police.c
net/sched/act_simple.c
net/sched/cls_api.c
net/sched/cls_basic.c
net/sched/cls_fw.c
net/sched/cls_route.c
net/sched/cls_rsvp.c
net/sched/cls_rsvp.h
net/sched/cls_rsvp6.c
net/sched/cls_tcindex.c
net/sched/cls_u32.c
net/sched/em_cmp.c
net/sched/em_meta.c
net/sched/em_nbyte.c
net/sched/em_text.c
net/sched/em_u32.c
net/sched/ematch.c
net/sched/sch_api.c
net/sched/sch_atm.c
net/sched/sch_cbq.c
net/sched/sch_dsmark.c
net/sched/sch_generic.c
net/sched/sch_gred.c
net/sched/sch_hfsc.c
net/sched/sch_htb.c
net/sched/sch_ingress.c
net/sched/sch_netem.c
net/sched/sch_prio.c
net/sched/sch_red.c
net/sched/sch_sfq.c
net/sched/sch_tbf.c
net/sched/sch_teql.c
net/sctp/associola.c
net/sctp/bind_addr.c
net/sctp/crc32c.c
net/sctp/debug.c
net/sctp/endpointola.c
net/sctp/input.c
net/sctp/inqueue.c
net/sctp/ipv6.c
net/sctp/objcnt.c
net/sctp/output.c
net/sctp/outqueue.c
net/sctp/primitive.c
net/sctp/proc.c
net/sctp/protocol.c
net/sctp/sm_make_chunk.c
net/sctp/sm_sideeffect.c
net/sctp/sm_statefuns.c
net/sctp/sm_statetable.c
net/sctp/socket.c
net/sctp/sysctl.c
net/sctp/transport.c
net/sctp/tsnmap.c
net/sctp/ulpevent.c
net/sctp/ulpqueue.c
net/socket.c
net/sunrpc/auth.c
net/sunrpc/auth_gss/auth_gss.c
net/sunrpc/auth_gss/gss_generic_token.c
net/sunrpc/auth_gss/gss_krb5_crypto.c
net/sunrpc/auth_gss/gss_krb5_mech.c
net/sunrpc/auth_gss/gss_krb5_seal.c
net/sunrpc/auth_gss/gss_krb5_seqnum.c
net/sunrpc/auth_gss/gss_krb5_unseal.c
net/sunrpc/auth_gss/gss_krb5_wrap.c
net/sunrpc/auth_gss/gss_mech_switch.c
net/sunrpc/auth_gss/gss_spkm3_mech.c
net/sunrpc/auth_gss/gss_spkm3_seal.c
net/sunrpc/auth_gss/gss_spkm3_token.c
net/sunrpc/auth_gss/gss_spkm3_unseal.c
net/sunrpc/auth_gss/svcauth_gss.c
net/sunrpc/auth_null.c
net/sunrpc/auth_unix.c
net/sunrpc/cache.c
net/sunrpc/clnt.c
net/sunrpc/pmap_clnt.c
net/sunrpc/rpc_pipe.c
net/sunrpc/sched.c
net/sunrpc/stats.c
net/sunrpc/sunrpc_syms.c
net/sunrpc/svc.c
net/sunrpc/svcauth.c
net/sunrpc/svcauth_unix.c
net/sunrpc/svcsock.c
net/sunrpc/sysctl.c
net/sunrpc/xdr.c
net/sunrpc/xprt.c
net/sunrpc/xprtsock.c
net/tipc/addr.c
net/tipc/addr.h
net/tipc/bcast.c
net/tipc/bcast.h
net/tipc/bearer.c
net/tipc/bearer.h
net/tipc/cluster.c
net/tipc/cluster.h
net/tipc/config.c
net/tipc/config.h
net/tipc/core.c
net/tipc/core.h
net/tipc/dbg.c
net/tipc/dbg.h
net/tipc/discover.c
net/tipc/discover.h
net/tipc/eth_media.c
net/tipc/handler.c
net/tipc/link.c
net/tipc/link.h
net/tipc/msg.c
net/tipc/msg.h
net/tipc/name_distr.c
net/tipc/name_distr.h
net/tipc/name_table.c
net/tipc/name_table.h
net/tipc/net.c
net/tipc/net.h
net/tipc/netlink.c
net/tipc/node.c
net/tipc/node.h
net/tipc/node_subscr.c
net/tipc/node_subscr.h
net/tipc/port.c
net/tipc/port.h
net/tipc/ref.c
net/tipc/ref.h
net/tipc/socket.c
net/tipc/subscr.c
net/tipc/subscr.h
net/tipc/user_reg.c
net/tipc/user_reg.h
net/tipc/zone.c
net/tipc/zone.h
net/unix/af_unix.c
net/unix/garbage.c
net/unix/sysctl_net_unix.c
net/wanrouter/af_wanpipe.c
net/wanrouter/wanmain.c
net/wanrouter/wanproc.c
net/x25/af_x25.c
net/x25/sysctl_net_x25.c
net/x25/x25_dev.c
net/x25/x25_facilities.c
net/x25/x25_in.c
net/x25/x25_link.c
net/x25/x25_out.c
net/x25/x25_proc.c
net/x25/x25_route.c
net/x25/x25_timer.c
net/xfrm/xfrm_algo.c
net/xfrm/xfrm_input.c
net/xfrm/xfrm_policy.c
net/xfrm/xfrm_state.c
net/xfrm/xfrm_user.c
scripts/kconfig/qconf.cc
scripts/kernel-doc
scripts/mkcompile_h
scripts/mkuboot.sh
scripts/mod/modpost.c
security/inode.c
security/keys/compat.c
security/keys/proc.c
security/keys/user_defined.c
security/security.c
security/selinux/avc.c
security/selinux/hooks.c
security/selinux/selinuxfs.c
security/selinux/ss/avtab.c
security/selinux/ss/sidtab.c
sound/arm/pxa2xx-ac97.c
sound/core/control.c
sound/core/hwdep.c
sound/core/info.c
sound/core/init.c
sound/core/misc.c
sound/core/oss/mixer_oss.c
sound/core/oss/pcm_oss.c
sound/core/pcm_native.c
sound/core/rawmidi.c
sound/core/seq/instr/ainstr_fm.c
sound/core/seq/instr/ainstr_gf1.c
sound/core/seq/instr/ainstr_iw.c
sound/core/seq/instr/ainstr_simple.c
sound/core/seq/oss/seq_oss.c
sound/core/seq/seq_clientmgr.c
sound/core/seq/seq_virmidi.c
sound/core/sound.c
sound/core/timer.c
sound/drivers/dummy.c
sound/drivers/mtpav.c
sound/drivers/mts64.c
sound/drivers/portman2x4.c
sound/drivers/serial-u16550.c
sound/drivers/virmidi.c
sound/isa/ad1848/ad1848.c
sound/isa/cmi8330.c
sound/isa/dt019x.c
sound/isa/es1688/es1688.c
sound/isa/gus/gusclassic.c
sound/isa/gus/gusextreme.c
sound/isa/gus/gusmax.c
sound/isa/opl3sa2.c
sound/isa/sb/sb8.c
sound/oss/Kconfig
sound/oss/ac97_codec.c
sound/oss/ad1889.c
sound/oss/au1550_ac97.c
sound/oss/btaudio.c
sound/oss/cs46xx.c
sound/oss/dmasound/Kconfig
sound/oss/dmasound/dac3550a.c
sound/oss/dmasound/dmasound_core.c
sound/oss/dmasound/tas3001c.c
sound/oss/dmasound/tas3004.c
sound/oss/dmasound/tas_common.c
sound/oss/emu10k1/audio.c
sound/oss/emu10k1/main.c
sound/oss/emu10k1/midi.c
sound/oss/emu10k1/mixer.c
sound/oss/es1371.c
sound/oss/hal2.c
sound/oss/i810_audio.c
sound/oss/kahlua.c
sound/oss/msnd_pinnacle.c
sound/oss/nec_vrc5477.c
sound/oss/opl3.c
sound/oss/os.h
sound/oss/sb_card.c
sound/oss/sh_dac_audio.c
sound/oss/soundcard.c
sound/oss/swarm_cs4297a.c
sound/oss/trident.c
sound/oss/via82cxxx_audio.c
sound/oss/vwsnd.c
sound/oss/waveartist.c
sound/pci/ac97/ac97_codec.c
sound/pci/ac97/ac97_patch.c
sound/pci/ac97/ac97_patch.h
sound/pci/hda/patch_conexant.c
sound/pci/hda/patch_sigmatel.c
sound/soc/at91/at91-i2s.c
sound/soc/at91/at91-pcm.c
sound/soc/codecs/Kconfig
sound/sound_core.c
sound/synth/emux/emux.c
sound/synth/emux/emux_proc.c
sound/usb/usbaudio.c
sound/usb/usbquirks.h
usr/Makefile
usr/gen_init_cpio.c

diff --git a/.mailmap b/.mailmap
new file mode 100644 (file)
index 0000000..bf62dbe
--- /dev/null
+++ b/.mailmap
@@ -0,0 +1,96 @@
+#
+# This list is used by git-shortlog to fix a few botched name translations
+# in the git archive, either because the author's full name was messed up
+# and/or not always written the same way, making contributions from the
+# same person appearing not to be so or badly displayed.
+#
+# repo-abbrev: /pub/scm/linux/kernel/git/
+#
+
+Aaron Durbin <adurbin@google.com>
+Adam Oldham <oldhamca@gmail.com>
+Adam Radford <aradford@gmail.com>
+Adrian Bunk <bunk@stusta.de>
+Alan Cox <alan@lxorguk.ukuu.org.uk>
+Alan Cox <root@hraefn.swansea.linux.org.uk>
+Aleksey Gorelov <aleksey_gorelov@phoenix.com>
+Al Viro <viro@ftp.linux.org.uk>
+Al Viro <viro@zenIV.linux.org.uk>
+Andreas Herrmann <aherrman@de.ibm.com>
+Andrew Morton <akpm@osdl.org>
+Andrew Vasquez <andrew.vasquez@qlogic.com>
+Andy Adamson <andros@citi.umich.edu>
+Arnaud Patard <arnaud.patard@rtp-net.org>
+Arnd Bergmann <arnd@arndb.de>
+Axel Dyks <xl@xlsigned.net>
+Ben Gardner <bgardner@wabtec.com>
+Ben M Cahill <ben.m.cahill@intel.com>
+Björn Steinbrink <B.Steinbrink@gmx.de>
+Brian Avery <b.avery@hp.com>
+Brian King <brking@us.ibm.com>
+Christoph Hellwig <hch@lst.de>
+Corey Minyard <minyard@acm.org>
+David Brownell <david-b@pacbell.net>
+David Woodhouse <dwmw2@shinybook.infradead.org>
+Domen Puncer <domen@coderock.org>
+Douglas Gilbert <dougg@torque.net>
+Ed L. Cashin <ecashin@coraid.com>
+Evgeniy Polyakov <johnpol@2ka.mipt.ru>
+Felipe W Damasio <felipewd@terra.com.br>
+Felix Kuhling <fxkuehl@gmx.de>
+Felix Moeller <felix@derklecks.de>
+Filipe Lautert <filipe@icewall.org>
+Franck Bui-Huu <vagabon.xyz@gmail.com>
+Frank Zago <fzago@systemfabricworks.com>
+Greg Kroah-Hartman <greg@echidna.(none)>
+Greg Kroah-Hartman <gregkh@suse.de>
+Greg Kroah-Hartman <greg@kroah.com>
+Henk Vergonet <Henk.Vergonet@gmail.com>
+Henrik Kretzschmar <henne@nachtwindheim.de>
+Herbert Xu <herbert@gondor.apana.org.au>
+Jacob Shin <Jacob.Shin@amd.com>
+James Bottomley <jejb@mulgrave.(none)>
+James Bottomley <jejb@titanic.il.steeleye.com>
+James E Wilson <wilson@specifix.com>
+James Ketrenos <jketreno@io.(none)>
+Jean Tourrilhes <jt@hpl.hp.com>
+Jeff Garzik <jgarzik@pretzel.yyz.us>
+Jens Axboe <axboe@suse.de>
+Jens Osterkamp <Jens.Osterkamp@de.ibm.com>
+John Stultz <johnstul@us.ibm.com>
+Juha Yrjola <at solidboot.com>
+Juha Yrjola <juha.yrjola@nokia.com>
+Juha Yrjola <juha.yrjola@solidboot.com>
+Kay Sievers <kay.sievers@vrfy.org>
+Kenneth W Chen <kenneth.w.chen@intel.com>
+Koushik <raghavendra.koushik@neterion.com>
+Leonid I Ananiev <leonid.i.ananiev@intel.com>
+Linas Vepstas <linas@austin.ibm.com>
+Matthieu CASTET <castet.matthieu@free.fr>
+Michel Dänzer <michel@tungstengraphics.com>
+Mitesh shah <mshah@teja.com>
+Morten Welinder <terra@gnome.org>
+Morten Welinder <welinder@anemone.rentec.com>
+Morten Welinder <welinder@darter.rentec.com>
+Morten Welinder <welinder@troll.com>
+Nguyen Anh Quynh <aquynh@gmail.com>
+Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
+Patrick Mochel <mochel@digitalimplant.org>
+Peter A Jonsson <pj@ludd.ltu.se>
+Praveen BP <praveenbp@ti.com>
+Rajesh Shah <rajesh.shah@intel.com>
+Ralf Baechle <ralf@linux-mips.org>
+Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+Rémi Denis-Courmont <rdenis@simphalempin.com>
+Rudolf Marek <R.Marek@sh.cvut.cz>
+Rui Saraiva <rmps@joel.ist.utl.pt>
+Sachin P Sant <ssant@in.ibm.com>
+Sam Ravnborg <sam@mars.ravnborg.org>
+Simon Kelley <simon@thekelleys.org.uk>
+Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr>
+Stephen Hemminger <shemminger@osdl.org>
+Tejun Heo <htejun@gmail.com>
+Thomas Graf <tgraf@suug.ch>
+Tony Luck <tony.luck@intel.com>
+Tsuneo Yoshioka <Tsuneo.Yoshioka@f-secure.com>
+Valdis Kletnieks <Valdis.Kletnieks@vt.edu>
diff --git a/CREDITS b/CREDITS
index ae08e4c10ed4f5c2364db7326cbdd4a7cce529f8..a4e5599003b28d5c5e7f74f08d24d1c2dba718c3 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -2571,6 +2571,16 @@ S: Subiaco, 6008
 S: Perth, Western Australia
 S: Australia
 
+N: Miguel Ojeda Sandonis
+E: maxextreme@gmail.com
+D: Author: Auxiliary LCD Controller driver (ks0108)
+D: Author: Auxiliary LCD driver (cfag12864b)
+D: Author: Auxiliary LCD framebuffer driver (cfag12864bfb)
+D: Maintainer: Auxiliary display drivers tree (drivers/auxdisplay/*)
+S: C/ Mieses 20, 9-B
+S: Valladolid 47009
+S: Spain
+
 N: Greg Page
 E: gpage@sovereign.org
 D: IPX development and support
index 03dbd883cc41599211cb1c462fc126352112bb3a..bf9c16b64c34feff4087a6b83b78995d213bcc96 100644 (file)
@@ -1,6 +1,6 @@
 What:           /debug/pktcdvd/pktcdvd[0-7]
 Date:           Oct. 2006
-KernelVersion:  2.6.19
+KernelVersion:  2.6.20
 Contact:        Thomas Maier <balagi@justmail.de>
 Description:
 
@@ -11,8 +11,7 @@ The pktcdvd module (packet writing driver) creates
 these files in debugfs:
 
 /debug/pktcdvd/pktcdvd[0-7]/
-    info            (0444) Lots of human readable driver
-                           statistics and infos. Multiple lines!
+    info            (0444) Lots of driver statistics and infos.
 
 Example:
 -------
index c4c55edc9a5c9ca7f5eaa6441049360ad5813017..b1c3f0263359150017e37081baa5f0aeb01c2121 100644 (file)
@@ -1,6 +1,6 @@
 What:           /sys/class/pktcdvd/
 Date:           Oct. 2006
-KernelVersion:  2.6.19
+KernelVersion:  2.6.20
 Contact:        Thomas Maier <balagi@justmail.de>
 Description:
 
index a34442436128ebd2e0ac209f050402e298e23827..e7fc964334086403ea4a4b73b35ef253464b2d0e 100644 (file)
@@ -482,13 +482,13 @@ slightly.
 <para>Gadget drivers
 rely on common USB structures and constants
 defined in the
-<filename>&lt;linux/usb_ch9.h&gt;</filename>
+<filename>&lt;linux/usb/ch9.h&gt;</filename>
 header file, which is standard in Linux 2.6 kernels.
 These are the same types and constants used by host
 side drivers (and usbcore).
 </para>
 
-!Iinclude/linux/usb_ch9.h
+!Iinclude/linux/usb/ch9.h
 </sect1>
 
 <sect1 id="core"><title>Core Objects and Methods</title>
index 3fa0c4b4541e065760a3c119e88d314ba3b6ee91..0bb90237e230d5e0d9c05448767741bd8c0c6e87 100644 (file)
@@ -316,6 +316,9 @@ X!Earch/i386/kernel/mca.c
      <sect1><title>DMI Interfaces</title>
 !Edrivers/firmware/dmi_scan.c
      </sect1>
+     <sect1><title>EDD Interfaces</title>
+!Idrivers/firmware/edd.c
+     </sect1>
   </chapter>
 
   <chapter id="security">
index 3ccce886c349d4ab3d5e357213d651b82d204eb4..974e17ccf10644af33b1d6347655b7a9c26e747c 100644 (file)
@@ -4,4 +4,5 @@
 <param name="funcsynopsis.style">ansi</param>
 <param name="funcsynopsis.tabular.threshold">80</param>
 <!-- <param name="paper.type">A4</param> -->
+<param name="generate.section.toc.level">2</param>
 </stylesheet>
index 143e5ff7deb8c4fad66789c02750749251a2acea..a2ebd651b05a8d241dc529ae29c3ee05fd7459ac 100644 (file)
 
 <chapter><title>USB-Standard Types</title>
 
-    <para>In <filename>&lt;linux/usb_ch9.h&gt;</filename> you will find
+    <para>In <filename>&lt;linux/usb/ch9.h&gt;</filename> you will find
     the USB data types defined in chapter 9 of the USB specification.
     These data types are used throughout USB, and in APIs including
     this host side API, gadget APIs, and usbfs.
     </para>
 
-!Iinclude/linux/usb_ch9.h
+!Iinclude/linux/usb/ch9.h
 
     </chapter>
 
@@ -574,7 +574,7 @@ for (;;) {
 #include &lt;asm/byteorder.h&gt;</programlisting>
            The standard USB device model requests, from "Chapter 9" of
            the USB 2.0 specification, are automatically included from
-           the <filename>&lt;linux/usb_ch9.h&gt;</filename> header.
+           the <filename>&lt;linux/usb/ch9.h&gt;</filename> header.
            </para>
 
            <para>Unless noted otherwise, the ioctl requests
diff --git a/Documentation/acpi-hotkey.txt b/Documentation/acpi-hotkey.txt
deleted file mode 100644 (file)
index 38040fa..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-driver/acpi/hotkey.c implement:
-1. /proc/acpi/hotkey/event_config 
-(event based hotkey or event config interface):
-a. add a  event based hotkey(event) : 
-echo "0:bus::action:method:num:num" > event_config
-
-b. delete a event based hotkey(event): 
-echo "1:::::num:num" > event_config
-
-c.  modify a event based hotkey(event):    
-echo "2:bus::action:method:num:num" > event_config
-
-2. /proc/acpi/hotkey/poll_config 
-(polling based hotkey or event config interface):
-a.add a polling based hotkey(event) :  
-echo "0:bus:method:action:method:num" > poll_config
-this adding command will create a proc file 
-/proc/acpi/hotkey/method, which is used to get 
-result of polling.
-
-b.delete a polling based hotkey(event):        
-echo "1:::::num" > event_config
-
-c.modify a polling based hotkey(event):    
-echo "2:bus:method:action:method:num" > poll_config
-
-3./proc/acpi/hotkey/action 
-(interface to call aml method associated with a 
-specific hotkey(event))
-echo "event_num:event_type:event_argument" > 
-       /proc/acpi/hotkey/action.
-The result of the execution of this aml method is 
-attached to /proc/acpi/hotkey/poll_method, which is dynamically
-created.  Please use command "cat /proc/acpi/hotkey/polling_method" 
-to retrieve it.
-
-Note: Use cmdline "acpi_generic_hotkey" to over-ride
-platform-specific with generic driver.
diff --git a/Documentation/auxdisplay/cfag12864b b/Documentation/auxdisplay/cfag12864b
new file mode 100644 (file)
index 0000000..3572b98
--- /dev/null
@@ -0,0 +1,105 @@
+       ===================================
+       cfag12864b LCD Driver Documentation
+       ===================================
+
+License:               GPLv2
+Author & Maintainer:   Miguel Ojeda Sandonis <maxextreme@gmail.com>
+Date:                  2006-10-27
+
+
+
+--------
+0. INDEX
+--------
+
+       1. DRIVER INFORMATION
+       2. DEVICE INFORMATION
+       3. WIRING
+       4. USERSPACE PROGRAMMING
+
+
+---------------------
+1. DRIVER INFORMATION
+---------------------
+
+This driver support one cfag12864b display at time.
+
+
+---------------------
+2. DEVICE INFORMATION
+---------------------
+
+Manufacturer:  Crystalfontz
+Device Name:   Crystalfontz 12864b LCD Series
+Device Code:   cfag12864b
+Webpage:       http://www.crystalfontz.com
+Device Webpage:        http://www.crystalfontz.com/products/12864b/
+Type:          LCD (Liquid Crystal Display)
+Width:         128
+Height:                64
+Colors:                2 (B/N)
+Controller:    ks0108
+Controllers:   2
+Pages:         8 each controller
+Addresses:     64 each page
+Data size:     1 byte each address
+Memory size:   2 * 8 * 64 * 1 = 1024 bytes = 1 Kbyte
+
+
+---------
+3. WIRING
+---------
+
+The cfag12864b LCD Series don't have official wiring.
+
+The common wiring is done to the parallel port as shown:
+
+Parallel Port                          cfag12864b
+
+  Name Pin#                            Pin# Name
+
+Strobe ( 1)------------------------------(17) Enable
+Data 0 ( 2)------------------------------( 4) Data 0
+Data 1 ( 3)------------------------------( 5) Data 1
+Data 2 ( 4)------------------------------( 6) Data 2
+Data 3 ( 5)------------------------------( 7) Data 3
+Data 4 ( 6)------------------------------( 8) Data 4
+Data 5 ( 7)------------------------------( 9) Data 5
+Data 6 ( 8)------------------------------(10) Data 6
+Data 7 ( 9)------------------------------(11) Data 7
+       (10)                      [+5v]---( 1) Vdd
+       (11)                      [GND]---( 2) Ground
+       (12)                      [+5v]---(14) Reset
+       (13)                      [GND]---(15) Read / Write
+  Line (14)------------------------------(13) Controller Select 1
+       (15)
+  Init (16)------------------------------(12) Controller Select 2
+Select (17)------------------------------(16) Data / Instruction
+Ground (18)---[GND]              [+5v]---(19) LED +
+Ground (19)---[GND]
+Ground (20)---[GND]              E    A             Values:
+Ground (21)---[GND]       [GND]---[P1]---(18) Vee    Â· R = Resistor = 22 ohm
+Ground (22)---[GND]                |                 Â· P1 = Preset = 10 Kohm
+Ground (23)---[GND]       ----   S ------( 3) V0     Â· P2 = Preset = 1 Kohm
+Ground (24)---[GND]       |  |
+Ground (25)---[GND] [GND]---[P2]---[R]---(20) LED -
+
+
+------------------------
+4. USERSPACE PROGRAMMING
+------------------------
+
+The cfag12864bfb describes a framebuffer device (/dev/fbX).
+
+It has a size of 1024 bytes = 1 Kbyte.
+Each bit represents one pixel. If the bit is high, the pixel will
+turn on. If the pixel is low, the pixel will turn off.
+
+You can use the framebuffer as a file: fopen, fwrite, fclose...
+Although the LCD won't get updated until the next refresh time arrives.
+
+Also, you can mmap the framebuffer: open & mmap, munmap & close...
+which is the best option for most uses.
+
+Check Documentation/auxdisplay/cfag12864b-example.c
+for a real working userspace complete program with usage examples.
diff --git a/Documentation/auxdisplay/cfag12864b-example.c b/Documentation/auxdisplay/cfag12864b-example.c
new file mode 100644 (file)
index 0000000..7bfac35
--- /dev/null
@@ -0,0 +1,282 @@
+/*
+ *    Filename: cfag12864b-example.c
+ *     Version: 0.1.0
+ * Description: cfag12864b LCD userspace example program
+ *     License: GPLv2
+ *
+ *      Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
+ *        Date: 2006-10-31
+ *
+ *  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.
+ *
+ *  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
+ *
+ */
+
+/*
+ * ------------------------
+ * start of cfag12864b code
+ * ------------------------
+ */
+
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+
+#define CFAG12864B_WIDTH               (128)
+#define CFAG12864B_HEIGHT              (64)
+#define CFAG12864B_SIZE                        (128 * 64 / 8)
+#define CFAG12864B_BPB                 (8)
+#define CFAG12864B_ADDRESS(x, y)       ((y) * CFAG12864B_WIDTH / \
+                                       CFAG12864B_BPB + (x) / CFAG12864B_BPB)
+#define CFAG12864B_BIT(n)              (((unsigned char) 1) << (n))
+
+#undef CFAG12864B_DOCHECK
+#ifdef CFAG12864B_DOCHECK
+       #define CFAG12864B_CHECK(x, y)          ((x) < CFAG12864B_WIDTH && \
+                                               (y) < CFAG12864B_HEIGHT)
+#else
+       #define CFAG12864B_CHECK(x, y)          (1)
+#endif
+
+int cfag12864b_fd;
+unsigned char * cfag12864b_mem;
+unsigned char cfag12864b_buffer[CFAG12864B_SIZE];
+
+/*
+ * init a cfag12864b framebuffer device
+ *
+ * No error:       return = 0
+ * Unable to open: return = -1
+ * Unable to mmap: return = -2
+ */
+int cfag12864b_init(char *path)
+{
+       cfag12864b_fd = open(path, O_RDWR);
+       if (cfag12864b_fd == -1)
+               return -1;
+
+       cfag12864b_mem = mmap(0, CFAG12864B_SIZE, PROT_READ | PROT_WRITE,
+               MAP_SHARED, cfag12864b_fd, 0);
+       if (cfag12864b_mem == MAP_FAILED) {
+               close(cfag12864b_fd);
+               return -2;
+       }
+
+       return 0;
+}
+
+/*
+ * exit a cfag12864b framebuffer device
+ */
+void cfag12864b_exit(void)
+{
+       munmap(cfag12864b_mem, CFAG12864B_SIZE);
+       close(cfag12864b_fd);
+}
+
+/*
+ * set (x, y) pixel
+ */
+void cfag12864b_set(unsigned char x, unsigned char y)
+{
+       if (CFAG12864B_CHECK(x, y))
+               cfag12864b_buffer[CFAG12864B_ADDRESS(x, y)] |=
+                       CFAG12864B_BIT(x % CFAG12864B_BPB);
+}
+
+/*
+ * unset (x, y) pixel
+ */
+void cfag12864b_unset(unsigned char x, unsigned char y)
+{
+       if (CFAG12864B_CHECK(x, y))
+               cfag12864b_buffer[CFAG12864B_ADDRESS(x, y)] &=
+                       ~CFAG12864B_BIT(x % CFAG12864B_BPB);
+}
+
+/*
+ * is set (x, y) pixel?
+ *
+ * Pixel off: return = 0
+ * Pixel on:  return = 1
+ */
+unsigned char cfag12864b_isset(unsigned char x, unsigned char y)
+{
+       if (CFAG12864B_CHECK(x, y))
+               if (cfag12864b_buffer[CFAG12864B_ADDRESS(x, y)] &
+                       CFAG12864B_BIT(x % CFAG12864B_BPB))
+                       return 1;
+
+       return 0;
+}
+
+/*
+ * not (x, y) pixel
+ */
+void cfag12864b_not(unsigned char x, unsigned char y)
+{
+       if (cfag12864b_isset(x, y))
+               cfag12864b_unset(x, y);
+       else
+               cfag12864b_set(x, y);
+}
+
+/*
+ * fill (set all pixels)
+ */
+void cfag12864b_fill(void)
+{
+       unsigned short i;
+
+       for (i = 0; i < CFAG12864B_SIZE; i++)
+               cfag12864b_buffer[i] = 0xFF;
+}
+
+/*
+ * clear (unset all pixels)
+ */
+void cfag12864b_clear(void)
+{
+       unsigned short i;
+
+       for (i = 0; i < CFAG12864B_SIZE; i++)
+               cfag12864b_buffer[i] = 0;
+}
+
+/*
+ * format a [128*64] matrix
+ *
+ * Pixel off: src[i] = 0
+ * Pixel on:  src[i] > 0
+ */
+void cfag12864b_format(unsigned char * matrix)
+{
+       unsigned char i, j, n;
+
+       for (i = 0; i < CFAG12864B_HEIGHT; i++)
+       for (j = 0; j < CFAG12864B_WIDTH / CFAG12864B_BPB; j++) {
+               cfag12864b_buffer[i * CFAG12864B_WIDTH / CFAG12864B_BPB +
+                       j] = 0;
+               for (n = 0; n < CFAG12864B_BPB; n++)
+                       if (matrix[i * CFAG12864B_WIDTH +
+                               j * CFAG12864B_BPB + n])
+                               cfag12864b_buffer[i * CFAG12864B_WIDTH /
+                                       CFAG12864B_BPB + j] |=
+                                       CFAG12864B_BIT(n);
+       }
+}
+
+/*
+ * blit buffer to lcd
+ */
+void cfag12864b_blit(void)
+{
+       memcpy(cfag12864b_mem, cfag12864b_buffer, CFAG12864B_SIZE);
+}
+
+/*
+ * ----------------------
+ * end of cfag12864b code
+ * ----------------------
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#define EXAMPLES       6
+
+void example(unsigned char n)
+{
+       unsigned short i, j;
+       unsigned char matrix[CFAG12864B_WIDTH * CFAG12864B_HEIGHT];
+
+       if (n > EXAMPLES)
+               return;
+
+       printf("Example %i/%i - ", n, EXAMPLES);
+
+       switch (n) {
+       case 1:
+               printf("Draw points setting bits");
+               cfag12864b_clear();
+               for (i = 0; i < CFAG12864B_WIDTH; i += 2)
+                       for (j = 0; j < CFAG12864B_HEIGHT; j += 2)
+                               cfag12864b_set(i, j);
+               break;
+
+       case 2:
+               printf("Clear the LCD");
+               cfag12864b_clear();
+               break;
+
+       case 3:
+               printf("Draw rows formatting a [128*64] matrix");
+               memset(matrix, 0, CFAG12864B_WIDTH * CFAG12864B_HEIGHT);
+               for (i = 0; i < CFAG12864B_WIDTH; i++)
+                       for (j = 0; j < CFAG12864B_HEIGHT; j += 2)
+                               matrix[j * CFAG12864B_WIDTH + i] = 1;
+               cfag12864b_format(matrix);
+               break;
+
+       case 4:
+               printf("Fill the lcd");
+               cfag12864b_fill();
+               break;
+
+       case 5:
+               printf("Draw columns unsetting bits");
+               for (i = 0; i < CFAG12864B_WIDTH; i += 2)
+                       for (j = 0; j < CFAG12864B_HEIGHT; j++)
+                               cfag12864b_unset(i, j);
+               break;
+
+       case 6:
+               printf("Do negative not-ing all bits");
+               for (i = 0; i < CFAG12864B_WIDTH; i++)
+                       for (j = 0; j < CFAG12864B_HEIGHT; j ++)
+                               cfag12864b_not(i, j);
+               break;
+       }
+
+       puts(" - [Press Enter]");
+}
+
+int main(int argc, char *argv[])
+{
+       unsigned char n;
+
+       if (argc != 2) {
+               printf(
+                       "Sintax:  %s fbdev\n"
+                       "Usually: /dev/fb0, /dev/fb1...\n", argv[0]);
+               return -1;
+       }
+
+       if (cfag12864b_init(argv[1])) {
+               printf("Can't init %s fbdev\n", argv[1]);
+               return -2;
+       }
+
+       for (n = 1; n <= EXAMPLES; n++) {
+               example(n);
+               cfag12864b_blit();
+               while (getchar() != '\n');
+       }
+
+       cfag12864b_exit();
+
+       return 0;
+}
diff --git a/Documentation/auxdisplay/ks0108 b/Documentation/auxdisplay/ks0108
new file mode 100644 (file)
index 0000000..92b03b6
--- /dev/null
@@ -0,0 +1,55 @@
+       ==========================================
+       ks0108 LCD Controller Driver Documentation
+       ==========================================
+
+License:               GPLv2
+Author & Maintainer:   Miguel Ojeda Sandonis <maxextreme@gmail.com>
+Date:                  2006-10-27
+
+
+
+--------
+0. INDEX
+--------
+
+       1. DRIVER INFORMATION
+       2. DEVICE INFORMATION
+       3. WIRING
+
+
+---------------------
+1. DRIVER INFORMATION
+---------------------
+
+This driver support the ks0108 LCD controller.
+
+
+---------------------
+2. DEVICE INFORMATION
+---------------------
+
+Manufacturer:  Samsung
+Device Name:   KS0108 LCD Controller
+Device Code:   ks0108
+Webpage:       -
+Device Webpage:        -
+Type:          LCD Controller (Liquid Crystal Display Controller)
+Width:         64
+Height:                64
+Colors:                2 (B/N)
+Pages:         8
+Addresses:     64 each page
+Data size:     1 byte each address
+Memory size:   8 * 64 * 1 = 512 bytes
+
+
+---------
+3. WIRING
+---------
+
+The driver supports data parallel port wiring.
+
+If you aren't building LCD related hardware, you should check
+your LCD specific wiring information in the same folder.
+
+For example, check Documentation/auxdisplay/cfag12864b.
index 7715d2247c4de4cf01045a7f46ce9ce5bf36a7a4..cf1f8126991c00fe5f904631d0471821bf958515 100644 (file)
@@ -93,7 +93,7 @@ Notes
 Using the pktcdvd sysfs interface
 ---------------------------------
 
-Since Linux 2.6.19, the pktcdvd module has a sysfs interface
+Since Linux 2.6.20, the pktcdvd module has a sysfs interface
 and can be controlled by it. For example the "pktcdvd" tool uses
 this interface. (see http://people.freenet.de/BalaGi#pktcdvd )
 
diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt
new file mode 100644 (file)
index 0000000..5163b85
--- /dev/null
@@ -0,0 +1,268 @@
+Devres - Managed Device Resource
+================================
+
+Tejun Heo      <teheo@suse.de>
+
+First draft    10 January 2007
+
+
+1. Intro                       : Huh? Devres?
+2. Devres                      : Devres in a nutshell
+3. Devres Group                        : Group devres'es and release them together
+4. Details                     : Life time rules, calling context, ...
+5. Overhead                    : How much do we have to pay for this?
+6. List of managed interfaces  : Currently implemented managed interfaces
+
+
+  1. Intro
+  --------
+
+devres came up while trying to convert libata to use iomap.  Each
+iomapped address should be kept and unmapped on driver detach.  For
+example, a plain SFF ATA controller (that is, good old PCI IDE) in
+native mode makes use of 5 PCI BARs and all of them should be
+maintained.
+
+As with many other device drivers, libata low level drivers have
+sufficient bugs in ->remove and ->probe failure path.  Well, yes,
+that's probably because libata low level driver developers are lazy
+bunch, but aren't all low level driver developers?  After spending a
+day fiddling with braindamaged hardware with no document or
+braindamaged document, if it's finally working, well, it's working.
+
+For one reason or another, low level drivers don't receive as much
+attention or testing as core code, and bugs on driver detach or
+initilaization failure doesn't happen often enough to be noticeable.
+Init failure path is worse because it's much less travelled while
+needs to handle multiple entry points.
+
+So, many low level drivers end up leaking resources on driver detach
+and having half broken failure path implementation in ->probe() which
+would leak resources or even cause oops when failure occurs.  iomap
+adds more to this mix.  So do msi and msix.
+
+
+  2. Devres
+  ---------
+
+devres is basically linked list of arbitrarily sized memory areas
+associated with a struct device.  Each devres entry is associated with
+a release function.  A devres can be released in several ways.  No
+matter what, all devres entries are released on driver detach.  On
+release, the associated release function is invoked and then the
+devres entry is freed.
+
+Managed interface is created for resources commonly used by device
+drivers using devres.  For example, coherent DMA memory is acquired
+using dma_alloc_coherent().  The managed version is called
+dmam_alloc_coherent().  It is identical to dma_alloc_coherent() except
+for the DMA memory allocated using it is managed and will be
+automatically released on driver detach.  Implementation looks like
+the following.
+
+  struct dma_devres {
+       size_t          size;
+       void            *vaddr;
+       dma_addr_t      dma_handle;
+  };
+
+  static void dmam_coherent_release(struct device *dev, void *res)
+  {
+       struct dma_devres *this = res;
+
+       dma_free_coherent(dev, this->size, this->vaddr, this->dma_handle);
+  }
+
+  dmam_alloc_coherent(dev, size, dma_handle, gfp)
+  {
+       struct dma_devres *dr;
+       void *vaddr;
+
+       dr = devres_alloc(dmam_coherent_release, sizeof(*dr), gfp);
+       ...
+
+       /* alloc DMA memory as usual */
+       vaddr = dma_alloc_coherent(...);
+       ...
+
+       /* record size, vaddr, dma_handle in dr */
+       dr->vaddr = vaddr;
+       ...
+
+       devres_add(dev, dr);
+
+       return vaddr;
+  }
+
+If a driver uses dmam_alloc_coherent(), the area is guaranteed to be
+freed whether initialization fails half-way or the device gets
+detached.  If most resources are acquired using managed interface, a
+driver can have much simpler init and exit code.  Init path basically
+looks like the following.
+
+  my_init_one()
+  {
+       struct mydev *d;
+
+       d = devm_kzalloc(dev, sizeof(*d), GFP_KERNEL);
+       if (!d)
+               return -ENOMEM;
+
+       d->ring = dmam_alloc_coherent(...);
+       if (!d->ring)
+               return -ENOMEM;
+
+       if (check something)
+               return -EINVAL;
+       ...
+
+       return register_to_upper_layer(d);
+  }
+
+And exit path,
+
+  my_remove_one()
+  {
+       unregister_from_upper_layer(d);
+       shutdown_my_hardware();
+  }
+
+As shown above, low level drivers can be simplified a lot by using
+devres.  Complexity is shifted from less maintained low level drivers
+to better maintained higher layer.  Also, as init failure path is
+shared with exit path, both can get more testing.
+
+
+  3. Devres group
+  ---------------
+
+Devres entries can be grouped using devres group.  When a group is
+released, all contained normal devres entries and properly nested
+groups are released.  One usage is to rollback series of acquired
+resources on failure.  For example,
+
+  if (!devres_open_group(dev, NULL, GFP_KERNEL))
+       return -ENOMEM;
+
+  acquire A;
+  if (failed)
+       goto err;
+
+  acquire B;
+  if (failed)
+       goto err;
+  ...
+
+  devres_remove_group(dev, NULL);
+  return 0;
+
+ err:
+  devres_release_group(dev, NULL);
+  return err_code;
+
+As resource acquision failure usually means probe failure, constructs
+like above are usually useful in midlayer driver (e.g. libata core
+layer) where interface function shouldn't have side effect on failure.
+For LLDs, just returning error code suffices in most cases.
+
+Each group is identified by void *id.  It can either be explicitly
+specified by @id argument to devres_open_group() or automatically
+created by passing NULL as @id as in the above example.  In both
+cases, devres_open_group() returns the group's id.  The returned id
+can be passed to other devres functions to select the target group.
+If NULL is given to those functions, the latest open group is
+selected.
+
+For example, you can do something like the following.
+
+  int my_midlayer_create_something()
+  {
+       if (!devres_open_group(dev, my_midlayer_create_something, GFP_KERNEL))
+               return -ENOMEM;
+
+       ...
+
+       devres_close_group(dev, my_midlayer_something);
+       return 0;
+  }
+
+  void my_midlayer_destroy_something()
+  {
+       devres_release_group(dev, my_midlayer_create_soemthing);
+  }
+
+
+  4. Details
+  ----------
+
+Lifetime of a devres entry begins on devres allocation and finishes
+when it is released or destroyed (removed and freed) - no reference
+counting.
+
+devres core guarantees atomicity to all basic devres operations and
+has support for single-instance devres types (atomic
+lookup-and-add-if-not-found).  Other than that, synchronizing
+concurrent accesses to allocated devres data is caller's
+responsibility.  This is usually non-issue because bus ops and
+resource allocations already do the job.
+
+For an example of single-instance devres type, read pcim_iomap_table()
+in lib/iomap.c.
+
+All devres interface functions can be called without context if the
+right gfp mask is given.
+
+
+  5. Overhead
+  -----------
+
+Each devres bookkeeping info is allocated together with requested data
+area.  With debug option turned off, bookkeeping info occupies 16
+bytes on 32bit machines and 24 bytes on 64bit (three pointers rounded
+up to ull alignment).  If singly linked list is used, it can be
+reduced to two pointers (8 bytes on 32bit, 16 bytes on 64bit).
+
+Each devres group occupies 8 pointers.  It can be reduced to 6 if
+singly linked list is used.
+
+Memory space overhead on ahci controller with two ports is between 300
+and 400 bytes on 32bit machine after naive conversion (we can
+certainly invest a bit more effort into libata core layer).
+
+
+  6. List of managed interfaces
+  -----------------------------
+
+IO region
+  devm_request_region()
+  devm_request_mem_region()
+  devm_release_region()
+  devm_release_mem_region()
+
+IRQ
+  devm_request_irq()
+  devm_free_irq()
+
+DMA
+  dmam_alloc_coherent()
+  dmam_free_coherent()
+  dmam_alloc_noncoherent()
+  dmam_free_noncoherent()
+  dmam_declare_coherent_memory()
+  dmam_pool_create()
+  dmam_pool_destroy()
+
+PCI
+  pcim_enable_device() : after success, all PCI ops become managed
+  pcim_pin_device()    : keep PCI device enabled after release
+
+IOMAP
+  devm_ioport_map()
+  devm_ioport_unmap()
+  devm_ioremap()
+  devm_ioremap_nocache()
+  devm_iounmap()
+  pcim_iomap()
+  pcim_iounmap()
+  pcim_iomap_table()   : array of mapped addresses indexed by BAR
+  pcim_iomap_regions() : do request_region() and iomap() on multiple BARs
index 7b3d969d29642cf6cef4982cde9dc8bb89e7710d..3c5a9e4297b4d622cb4f1022f4e934e756378669 100644 (file)
@@ -339,7 +339,21 @@ Device Symlink:
 
        'device'
 
-       Symlink to the memory controller device
+       Symlink to the memory controller device.
+
+Sdram memory scrubbing rate:
+
+       'sdram_scrub_rate'
+
+       Read/Write attribute file that controls memory scrubbing. The scrubbing
+       rate is set by writing a minimum bandwith in bytes/sec to the attribute
+       file. The rate will be translated to an internal value that gives at
+       least the specified rate.
+
+       Reading the file will return the actual scrubbing rate employed.
+
+       If configuration fails or memory scrubbing is not implemented, the value
+       of the attribute file will be -1.
 
 
 
diff --git a/Documentation/fb/s3fb.txt b/Documentation/fb/s3fb.txt
new file mode 100644 (file)
index 0000000..8a04c0d
--- /dev/null
@@ -0,0 +1,78 @@
+
+       s3fb - fbdev driver for S3 Trio/Virge chips
+       ===========================================
+
+
+Supported Hardware
+==================
+
+       S3 Trio32
+       S3 Trio64 (and variants V+, UV+, V2/DX, V2/GX)
+       S3 Virge  (and variants VX, DX, GX and GX2+)
+       S3 Plato/PX             (completely untested)
+       S3 Aurora64V+           (completely untested)
+
+       - only PCI bus supported
+       - only BIOS initialized VGA devices supported
+       - probably not working on big endian
+
+I tested s3fb on Trio64 (plain, V+ and V2/DX) and Virge (plain, VX, DX),
+all on i386.
+
+
+Supported Features
+==================
+
+       *  4 bpp pseudocolor modes (with 18bit palette, two variants)
+       *  8 bpp pseudocolor mode (with 18bit palette)
+       * 16 bpp truecolor modes (RGB 555 and RGB 565)
+       * 24 bpp truecolor mode (RGB 888) on (only on Virge VX)
+       * 32 bpp truecolor mode (RGB 888) on (not on Virge VX)
+       * text mode (activated by bpp = 0)
+       * interlaced mode variant (not available in text mode)
+       * doublescan mode variant (not available in text mode)
+       * panning in both directions
+       * suspend/resume support
+       * DPMS support
+
+Text mode is supported even in higher resolutions, but there is limitation
+to lower pixclocks (maximum between 50-60 MHz, depending on specific hardware).
+This limitation is not enforced by driver. Text mode supports 8bit wide fonts
+only (hardware limitation) and 16bit tall fonts (driver limitation).
+
+There are two 4 bpp modes. First mode (selected if nonstd == 0) is mode with
+packed pixels, high nibble first. Second mode (selected if nonstd == 1) is mode
+with interleaved planes (1 byte interleave), MSB first. Both modes support
+8bit wide fonts only (driver limitation).
+
+Suspend/resume works on systems that initialize video card during resume and
+if device is active (for example used by fbcon).
+
+
+Missing Features
+================
+(alias TODO list)
+
+       * secondary (not initialized by BIOS) device support
+       * big endian support
+       * Zorro bus support
+       * MMIO support
+       * 24 bpp mode support on more cards
+       * support for fontwidths != 8 in 4 bpp modes
+       * support for fontheight != 16 in text mode
+       * composite and external sync (is anyone able to test this?)
+       * hardware cursor
+       * video overlay support
+       * vsync synchronization
+       * feature connector support
+       * acceleration support (8514-like 2D, Virge 3D, busmaster transfers)
+       * better values for some magic registers (performance issues)
+
+
+Known bugs
+==========
+
+       * cursor disable in text mode doesn't work
+
+--
+Ondrej Zajicek <santiago@crfreenet.org>
index fa844fd7bded4004f1c050e8cc5bc719210c1452..28f897fd367490797384e98d2fffa5dc69eb9740 100644 (file)
@@ -215,6 +215,13 @@ Who:       Jean Delvare <khali@linux-fr.org>,
 
 ---------------------------
 
+What:  drivers depending on OBSOLETE_OSS
+When:  options in 2.6.22, code in 2.6.24
+Why:   OSS drivers with ALSA replacements
+Who:   Adrian Bunk <bunk@stusta.de>
+
+---------------------------
+
 What:  IPv4 only connection tracking/NAT/helpers
 When:  2.6.22
 Why:   The new layer 3 independant connection tracking replaces the old
@@ -246,29 +253,6 @@ Who:       Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
 
 ---------------------------
 
-<<<<<<< test:Documentation/feature-removal-schedule.txt
-What:  ACPI hotkey driver (CONFIG_ACPI_HOTKEY)
-When:  2.6.21
-Why:   hotkey.c was an attempt to consolidate multiple drivers that use
-       ACPI to implement hotkeys.  However, hotkeys are not documented
-       in the ACPI specification, so the drivers used undocumented
-       vendor-specific hooks and turned out to be more different than
-       the same.
-
-       Further, the keys and the features supplied by each platform
-       are different, so there will always be a need for
-       platform-specific drivers.
-
-       So the new plan is to delete hotkey.c and instead, work on the
-       platform specific drivers to try to make them look the same
-       to the user when they supply the same features.
-
-       hotkey.c has always depended on CONFIG_EXPERIMENTAL
-
-Who:   Len Brown <len.brown@intel.com>
-
----------------------------
-
 What:  /sys/firmware/acpi/namespace
 When:  2.6.21
 Why:   The ACPI namespace is effectively the symbol list for
@@ -312,3 +296,18 @@ Why:    In kernel tree version of driver is unmaintained. Sk98lin driver
        replaced by the skge driver. 
 Who:    Stephen Hemminger <shemminger@osdl.org>
 
+---------------------------
+
+What:  Compaq touchscreen device emulation
+When:  Oct 2007
+Files: drivers/input/tsdev.c
+Why:   The code says it was obsolete when it was written in 2001.
+       tslib is a userspace library which does anything tsdev can do and
+       much more besides in userspace where this code belongs. There is no
+       longer any need for tsdev and applications should have converted to
+       use tslib by now.
+       The name "tsdev" is also extremely confusing and lots of people have
+       it loaded when they don't need/use it.
+Who:   Richard Purdie <rpurdie@rpsys.net>
+
+---------------------------
index d6788dae034948ce35eab71bfa80e013217864ac..7fbb6ffe576910695a5aecabd21c1c428497304f 100644 (file)
@@ -157,7 +157,7 @@ TBD(curr. line MT:/API/)
   channel management functions:
 
     relay_open(base_filename, parent, subbuf_size, n_subbufs,
-               callbacks)
+               callbacks, private_data)
     relay_close(chan)
     relay_flush(chan)
     relay_reset(chan)
@@ -251,7 +251,7 @@ static struct rchan_callbacks relay_callbacks =
 
 And an example relay_open() invocation using them:
 
-  chan = relay_open("cpu", NULL, SUBBUF_SIZE, N_SUBBUFS, &relay_callbacks);
+  chan = relay_open("cpu", NULL, SUBBUF_SIZE, N_SUBBUFS, &relay_callbacks, NULL);
 
 If the create_buf_file() callback fails, or isn't defined, channel
 creation and thus relay_open() will fail.
@@ -289,6 +289,11 @@ they use the proper locking for such a buffer, either by wrapping
 writes in a spinlock, or by copying a write function from relay.h and
 creating a local version that internally does the proper locking.
 
+The private_data passed into relay_open() allows clients to associate
+user-defined data with a channel, and is immediately available
+(including in create_buf_file()) via chan->private_data or
+buf->chan->private_data.
+
 Channel 'modes'
 ---------------
 
index 2b5a56a6a5588cd102fcbd57a3b2e8d700489f40..7a602adeca2b7399f04b50232c838a9aec305712 100644 (file)
@@ -21,7 +21,7 @@ ufstype=type_of_ufs
                supported as read-write
 
        ufs2    used in FreeBSD 5.x
-               supported as read-only
+               supported as read-write
 
        5xbsd   synonym for ufs2
 
@@ -50,12 +50,11 @@ ufstype=type_of_ufs
 POSSIBLE PROBLEMS
 =================
 
-There is still bug in reallocation of fragment, in file fs/ufs/balloc.c, 
-line 364. But it seems working on current buffer cache configuration.
+See next section, if you have any.
 
 
 BUG REPORTS
 ===========
 
-Any ufs bug report you can send to daniel.pirkl@email.cz (do not send 
-partition tables bug reports.)
+Any ufs bug report you can send to daniel.pirkl@email.cz or
+to dushistov@mail.ru (do not send partition tables bug reports).
diff --git a/Documentation/gpio.txt b/Documentation/gpio.txt
new file mode 100644 (file)
index 0000000..576ce46
--- /dev/null
@@ -0,0 +1,274 @@
+GPIO Interfaces
+
+This provides an overview of GPIO access conventions on Linux.
+
+
+What is a GPIO?
+===============
+A "General Purpose Input/Output" (GPIO) is a flexible software-controlled
+digital signal.  They are provided from many kinds of chip, and are familiar
+to Linux developers working with embedded and custom hardware.  Each GPIO
+represents a bit connected to a particular pin, or "ball" on Ball Grid Array
+(BGA) packages.  Board schematics show which external hardware connects to
+which GPIOs.  Drivers can be written generically, so that board setup code
+passes such pin configuration data to drivers.
+
+System-on-Chip (SOC) processors heavily rely on GPIOs.  In some cases, every
+non-dedicated pin can be configured as a GPIO; and most chips have at least
+several dozen of them.  Programmable logic devices (like FPGAs) can easily
+provide GPIOs; multifunction chips like power managers, and audio codecs
+often have a few such pins to help with pin scarcity on SOCs; and there are
+also "GPIO Expander" chips that connect using the I2C or SPI serial busses.
+Most PC southbridges have a few dozen GPIO-capable pins (with only the BIOS
+firmware knowing how they're used).
+
+The exact capabilities of GPIOs vary between systems.  Common options:
+
+  - Output values are writable (high=1, low=0).  Some chips also have
+    options about how that value is driven, so that for example only one
+    value might be driven ... supporting "wire-OR" and similar schemes
+    for the other value.
+
+  - Input values are likewise readable (1, 0).  Some chips support readback
+    of pins configured as "output", which is very useful in such "wire-OR"
+    cases (to support bidirectional signaling).  GPIO controllers may have
+    input de-glitch logic, sometimes with software controls.
+
+  - Inputs can often be used as IRQ signals, often edge triggered but
+    sometimes level triggered.  Such IRQs may be configurable as system
+    wakeup events, to wake the system from a low power state.
+
+  - Usually a GPIO will be configurable as either input or output, as needed
+    by different product boards; single direction ones exist too.
+
+  - Most GPIOs can be accessed while holding spinlocks, but those accessed
+    through a serial bus normally can't.  Some systems support both types.
+
+On a given board each GPIO is used for one specific purpose like monitoring
+MMC/SD card insertion/removal, detecting card writeprotect status, driving
+a LED, configuring a transceiver, bitbanging a serial bus, poking a hardware
+watchdog, sensing a switch, and so on.
+
+
+GPIO conventions
+================
+Note that this is called a "convention" because you don't need to do it this
+way, and it's no crime if you don't.  There **are** cases where portability
+is not the main issue; GPIOs are often used for the kind of board-specific
+glue logic that may even change between board revisions, and can't ever be
+used on a board that's wired differently.  Only least-common-denominator
+functionality can be very portable.  Other features are platform-specific,
+and that can be critical for glue logic.
+
+Plus, this doesn't define an implementation framework, just an interface.
+One platform might implement it as simple inline functions accessing chip
+registers; another might implement it by delegating through abstractions
+used for several very different kinds of GPIO controller.
+
+That said, if the convention is supported on their platform, drivers should
+use it when possible:
+
+       #include <asm/gpio.h>
+
+If you stick to this convention then it'll be easier for other developers to
+see what your code is doing, and help maintain it.
+
+
+Identifying GPIOs
+-----------------
+GPIOs are identified by unsigned integers in the range 0..MAX_INT.  That
+reserves "negative" numbers for other purposes like marking signals as
+"not available on this board", or indicating faults.  Code that doesn't
+touch the underlying hardware treats these integers as opaque cookies.
+
+Platforms define how they use those integers, and usually #define symbols
+for the GPIO lines so that board-specific setup code directly corresponds
+to the relevant schematics.  In contrast, drivers should only use GPIO
+numbers passed to them from that setup code, using platform_data to hold
+board-specific pin configuration data (along with other board specific
+data they need).  That avoids portability problems.
+
+So for example one platform uses numbers 32-159 for GPIOs; while another
+uses numbers 0..63 with one set of GPIO controllers, 64-79 with another
+type of GPIO controller, and on one particular board 80-95 with an FPGA.
+The numbers need not be contiguous; either of those platforms could also
+use numbers 2000-2063 to identify GPIOs in a bank of I2C GPIO expanders.
+
+Whether a platform supports multiple GPIO controllers is currently a
+platform-specific implementation issue.
+
+
+Using GPIOs
+-----------
+One of the first things to do with a GPIO, often in board setup code when
+setting up a platform_device using the GPIO, is mark its direction:
+
+       /* set as input or output, returning 0 or negative errno */
+       int gpio_direction_input(unsigned gpio);
+       int gpio_direction_output(unsigned gpio);
+
+The return value is zero for success, else a negative errno.  It should
+be checked, since the get/set calls don't have error returns and since
+misconfiguration is possible.  (These calls could sleep.)
+
+Setting the direction can fail if the GPIO number is invalid, or when
+that particular GPIO can't be used in that mode.  It's generally a bad
+idea to rely on boot firmware to have set the direction correctly, since
+it probably wasn't validated to do more than boot Linux.  (Similarly,
+that board setup code probably needs to multiplex that pin as a GPIO,
+and configure pullups/pulldowns appropriately.)
+
+
+Spinlock-Safe GPIO access
+-------------------------
+Most GPIO controllers can be accessed with memory read/write instructions.
+That doesn't need to sleep, and can safely be done from inside IRQ handlers.
+
+Use these calls to access such GPIOs:
+
+       /* GPIO INPUT:  return zero or nonzero */
+       int gpio_get_value(unsigned gpio);
+
+       /* GPIO OUTPUT */
+       void gpio_set_value(unsigned gpio, int value);
+
+The values are boolean, zero for low, nonzero for high.  When reading the
+value of an output pin, the value returned should be what's seen on the
+pin ... that won't always match the specified output value, because of
+issues including wire-OR and output latencies.
+
+The get/set calls have no error returns because "invalid GPIO" should have
+been reported earlier in gpio_set_direction().  However, note that not all
+platforms can read the value of output pins; those that can't should always
+return zero.  Also, using these calls for GPIOs that can't safely be accessed
+without sleeping (see below) is an error.
+
+Platform-specific implementations are encouraged to optimize the two
+calls to access the GPIO value in cases where the GPIO number (and for
+output, value) are constant.  It's normal for them to need only a couple
+of instructions in such cases (reading or writing a hardware register),
+and not to need spinlocks.  Such optimized calls can make bitbanging
+applications a lot more efficient (in both space and time) than spending
+dozens of instructions on subroutine calls.
+
+
+GPIO access that may sleep
+--------------------------
+Some GPIO controllers must be accessed using message based busses like I2C
+or SPI.  Commands to read or write those GPIO values require waiting to
+get to the head of a queue to transmit a command and get its response.
+This requires sleeping, which can't be done from inside IRQ handlers.
+
+Platforms that support this type of GPIO distinguish them from other GPIOs
+by returning nonzero from this call:
+
+       int gpio_cansleep(unsigned gpio);
+
+To access such GPIOs, a different set of accessors is defined:
+
+       /* GPIO INPUT:  return zero or nonzero, might sleep */
+       int gpio_get_value_cansleep(unsigned gpio);
+
+       /* GPIO OUTPUT, might sleep */
+       void gpio_set_value_cansleep(unsigned gpio, int value);
+
+Other than the fact that these calls might sleep, and will not be ignored
+for GPIOs that can't be accessed from IRQ handlers, these calls act the
+same as the spinlock-safe calls.
+
+
+Claiming and Releasing GPIOs (OPTIONAL)
+---------------------------------------
+To help catch system configuration errors, two calls are defined.
+However, many platforms don't currently support this mechanism.
+
+       /* request GPIO, returning 0 or negative errno.
+        * non-null labels may be useful for diagnostics.
+        */
+       int gpio_request(unsigned gpio, const char *label);
+
+       /* release previously-claimed GPIO */
+       void gpio_free(unsigned gpio);
+
+Passing invalid GPIO numbers to gpio_request() will fail, as will requesting
+GPIOs that have already been claimed with that call.  The return value of
+gpio_request() must be checked.  (These calls could sleep.)
+
+These calls serve two basic purposes.  One is marking the signals which
+are actually in use as GPIOs, for better diagnostics; systems may have
+several hundred potential GPIOs, but often only a dozen are used on any
+given board.  Another is to catch conflicts between drivers, reporting
+errors when drivers wrongly think they have exclusive use of that signal.
+
+These two calls are optional because not not all current Linux platforms
+offer such functionality in their GPIO support; a valid implementation
+could return success for all gpio_request() calls.  Unlike the other calls,
+the state they represent doesn't normally match anything from a hardware
+register; it's just a software bitmap which clearly is not necessary for
+correct operation of hardware or (bug free) drivers.
+
+Note that requesting a GPIO does NOT cause it to be configured in any
+way; it just marks that GPIO as in use.  Separate code must handle any
+pin setup (e.g. controlling which pin the GPIO uses, pullup/pulldown).
+
+
+GPIOs mapped to IRQs
+--------------------
+GPIO numbers are unsigned integers; so are IRQ numbers.  These make up
+two logically distinct namespaces (GPIO 0 need not use IRQ 0).  You can
+map between them using calls like:
+
+       /* map GPIO numbers to IRQ numbers */
+       int gpio_to_irq(unsigned gpio);
+
+       /* map IRQ numbers to GPIO numbers */
+       int irq_to_gpio(unsigned irq);
+
+Those return either the corresponding number in the other namespace, or
+else a negative errno code if the mapping can't be done.  (For example,
+some GPIOs can't used as IRQs.)  It is an unchecked error to use a GPIO
+number that hasn't been marked as an input using gpio_set_direction(), or
+to use an IRQ number that didn't originally come from gpio_to_irq().
+
+These two mapping calls are expected to cost on the order of a single
+addition or subtraction.  They're not allowed to sleep.
+
+Non-error values returned from gpio_to_irq() can be passed to request_irq()
+or free_irq().  They will often be stored into IRQ resources for platform
+devices, by the board-specific initialization code.  Note that IRQ trigger
+options are part of the IRQ interface, e.g. IRQF_TRIGGER_FALLING, as are
+system wakeup capabilities.
+
+Non-error values returned from irq_to_gpio() would most commonly be used
+with gpio_get_value(), for example to initialize or update driver state
+when the IRQ is edge-triggered.
+
+
+
+What do these conventions omit?
+===============================
+One of the biggest things these conventions omit is pin multiplexing, since
+this is highly chip-specific and nonportable.  One platform might not need
+explicit multiplexing; another might have just two options for use of any
+given pin; another might have eight options per pin; another might be able
+to route a given GPIO to any one of several pins.  (Yes, those examples all
+come from systems that run Linux today.)
+
+Related to multiplexing is configuration and enabling of the pullups or
+pulldowns integrated on some platforms.  Not all platforms support them,
+or support them in the same way; and any given board might use external
+pullups (or pulldowns) so that the on-chip ones should not be used.
+
+There are other system-specific mechanisms that are not specified here,
+like the aforementioned options for input de-glitching and wire-OR output.
+Hardware may support reading or writing GPIOs in gangs, but that's usually
+configuration dependent:  for GPIOs sharing the same bank.  (GPIOs are
+commonly grouped in banks of 16 or 32, with a given SOC having several such
+banks.)  Some systems can trigger IRQs from output GPIOs.  Code relying on
+such mechanisms will necessarily be nonportable.
+
+Dynamic definition of GPIOs is not currently supported; for example, as
+a side effect of configuring an add-on board with some GPIO expanders.
+
+These calls are purely for kernel space, but a userspace API could be built
+on top of it.
diff --git a/Documentation/hrtimer/timer_stats.txt b/Documentation/hrtimer/timer_stats.txt
new file mode 100644 (file)
index 0000000..27f782e
--- /dev/null
@@ -0,0 +1,68 @@
+timer_stats - timer usage statistics
+------------------------------------
+
+timer_stats is a debugging facility to make the timer (ab)usage in a Linux
+system visible to kernel and userspace developers. It is not intended for
+production usage as it adds significant overhead to the (hr)timer code and the
+(hr)timer data structures.
+
+timer_stats should be used by kernel and userspace developers to verify that
+their code does not make unduly use of timers. This helps to avoid unnecessary
+wakeups, which should be avoided to optimize power consumption.
+
+It can be enabled by CONFIG_TIMER_STATS in the "Kernel hacking" configuration
+section.
+
+timer_stats collects information about the timer events which are fired in a
+Linux system over a sample period:
+
+- the pid of the task(process) which initialized the timer
+- the name of the process which initialized the timer
+- the function where the timer was intialized
+- the callback function which is associated to the timer
+- the number of events (callbacks)
+
+timer_stats adds an entry to /proc: /proc/timer_stats
+
+This entry is used to control the statistics functionality and to read out the
+sampled information.
+
+The timer_stats functionality is inactive on bootup.
+
+To activate a sample period issue:
+# echo 1 >/proc/timer_stats
+
+To stop a sample period issue:
+# echo 0 >/proc/timer_stats
+
+The statistics can be retrieved by:
+# cat /proc/timer_stats
+
+The readout of /proc/timer_stats automatically disables sampling. The sampled
+information is kept until a new sample period is started. This allows multiple
+readouts.
+
+Sample output of /proc/timer_stats:
+
+Timerstats sample period: 3.888770 s
+  12,     0 swapper          hrtimer_stop_sched_tick (hrtimer_sched_tick)
+  15,     1 swapper          hcd_submit_urb (rh_timer_func)
+   4,   959 kedac            schedule_timeout (process_timeout)
+   1,     0 swapper          page_writeback_init (wb_timer_fn)
+  28,     0 swapper          hrtimer_stop_sched_tick (hrtimer_sched_tick)
+  22,  2948 IRQ 4            tty_flip_buffer_push (delayed_work_timer_fn)
+   3,  3100 bash             schedule_timeout (process_timeout)
+   1,     1 swapper          queue_delayed_work_on (delayed_work_timer_fn)
+   1,     1 swapper          queue_delayed_work_on (delayed_work_timer_fn)
+   1,     1 swapper          neigh_table_init_no_netlink (neigh_periodic_timer)
+   1,  2292 ip               __netdev_watchdog_up (dev_watchdog)
+   1,    23 events/1         do_cache_clean (delayed_work_timer_fn)
+90 total events, 30.0 events/sec
+
+The first column is the number of events, the second column the pid, the third
+column is the name of the process. The forth column shows the function which
+initialized the timer and in parantheses the callback function which was
+executed on expiry.
+
+    Thomas, Ingo
+
diff --git a/Documentation/hrtimers/highres.txt b/Documentation/hrtimers/highres.txt
new file mode 100644 (file)
index 0000000..ce0e9a9
--- /dev/null
@@ -0,0 +1,249 @@
+High resolution timers and dynamic ticks design notes
+-----------------------------------------------------
+
+Further information can be found in the paper of the OLS 2006 talk "hrtimers
+and beyond". The paper is part of the OLS 2006 Proceedings Volume 1, which can
+be found on the OLS website:
+http://www.linuxsymposium.org/2006/linuxsymposium_procv1.pdf
+
+The slides to this talk are available from:
+http://tglx.de/projects/hrtimers/ols2006-hrtimers.pdf
+
+The slides contain five figures (pages 2, 15, 18, 20, 22), which illustrate the
+changes in the time(r) related Linux subsystems. Figure #1 (p. 2) shows the
+design of the Linux time(r) system before hrtimers and other building blocks
+got merged into mainline.
+
+Note: the paper and the slides are talking about "clock event source", while we
+switched to the name "clock event devices" in meantime.
+
+The design contains the following basic building blocks:
+
+- hrtimer base infrastructure
+- timeofday and clock source management
+- clock event management
+- high resolution timer functionality
+- dynamic ticks
+
+
+hrtimer base infrastructure
+---------------------------
+
+The hrtimer base infrastructure was merged into the 2.6.16 kernel. Details of
+the base implementation are covered in Documentation/hrtimers/hrtimer.txt. See
+also figure #2 (OLS slides p. 15)
+
+The main differences to the timer wheel, which holds the armed timer_list type
+timers are:
+       - time ordered enqueueing into a rb-tree
+       - independent of ticks (the processing is based on nanoseconds)
+
+
+timeofday and clock source management
+-------------------------------------
+
+John Stultz's Generic Time Of Day (GTOD) framework moves a large portion of
+code out of the architecture-specific areas into a generic management
+framework, as illustrated in figure #3 (OLS slides p. 18). The architecture
+specific portion is reduced to the low level hardware details of the clock
+sources, which are registered in the framework and selected on a quality based
+decision. The low level code provides hardware setup and readout routines and
+initializes data structures, which are used by the generic time keeping code to
+convert the clock ticks to nanosecond based time values. All other time keeping
+related functionality is moved into the generic code. The GTOD base patch got
+merged into the 2.6.18 kernel.
+
+Further information about the Generic Time Of Day framework is available in the
+OLS 2005 Proceedings Volume 1:
+http://www.linuxsymposium.org/2005/linuxsymposium_procv1.pdf
+
+The paper "We Are Not Getting Any Younger: A New Approach to Time and
+Timers" was written by J. Stultz, D.V. Hart, & N. Aravamudan.
+
+Figure #3 (OLS slides p.18) illustrates the transformation.
+
+
+clock event management
+----------------------
+
+While clock sources provide read access to the monotonically increasing time
+value, clock event devices are used to schedule the next event
+interrupt(s). The next event is currently defined to be periodic, with its
+period defined at compile time. The setup and selection of the event device
+for various event driven functionalities is hardwired into the architecture
+dependent code. This results in duplicated code across all architectures and
+makes it extremely difficult to change the configuration of the system to use
+event interrupt devices other than those already built into the
+architecture. Another implication of the current design is that it is necessary
+to touch all the architecture-specific implementations in order to provide new
+functionality like high resolution timers or dynamic ticks.
+
+The clock events subsystem tries to address this problem by providing a generic
+solution to manage clock event devices and their usage for the various clock
+event driven kernel functionalities. The goal of the clock event subsystem is
+to minimize the clock event related architecture dependent code to the pure
+hardware related handling and to allow easy addition and utilization of new
+clock event devices. It also minimizes the duplicated code across the
+architectures as it provides generic functionality down to the interrupt
+service handler, which is almost inherently hardware dependent.
+
+Clock event devices are registered either by the architecture dependent boot
+code or at module insertion time. Each clock event device fills a data
+structure with clock-specific property parameters and callback functions. The
+clock event management decides, by using the specified property parameters, the
+set of system functions a clock event device will be used to support. This
+includes the distinction of per-CPU and per-system global event devices.
+
+System-level global event devices are used for the Linux periodic tick. Per-CPU
+event devices are used to provide local CPU functionality such as process
+accounting, profiling, and high resolution timers.
+
+The management layer assignes one or more of the folliwing functions to a clock
+event device:
+      - system global periodic tick (jiffies update)
+      - cpu local update_process_times
+      - cpu local profiling
+      - cpu local next event interrupt (non periodic mode)
+
+The clock event device delegates the selection of those timer interrupt related
+functions completely to the management layer. The clock management layer stores
+a function pointer in the device description structure, which has to be called
+from the hardware level handler. This removes a lot of duplicated code from the
+architecture specific timer interrupt handlers and hands the control over the
+clock event devices and the assignment of timer interrupt related functionality
+to the core code.
+
+The clock event layer API is rather small. Aside from the clock event device
+registration interface it provides functions to schedule the next event
+interrupt, clock event device notification service and support for suspend and
+resume.
+
+The framework adds about 700 lines of code which results in a 2KB increase of
+the kernel binary size. The conversion of i386 removes about 100 lines of
+code. The binary size decrease is in the range of 400 byte. We believe that the
+increase of flexibility and the avoidance of duplicated code across
+architectures justifies the slight increase of the binary size.
+
+The conversion of an architecture has no functional impact, but allows to
+utilize the high resolution and dynamic tick functionalites without any change
+to the clock event device and timer interrupt code. After the conversion the
+enabling of high resolution timers and dynamic ticks is simply provided by
+adding the kernel/time/Kconfig file to the architecture specific Kconfig and
+adding the dynamic tick specific calls to the idle routine (a total of 3 lines
+added to the idle function and the Kconfig file)
+
+Figure #4 (OLS slides p.20) illustrates the transformation.
+
+
+high resolution timer functionality
+-----------------------------------
+
+During system boot it is not possible to use the high resolution timer
+functionality, while making it possible would be difficult and would serve no
+useful function. The initialization of the clock event device framework, the
+clock source framework (GTOD) and hrtimers itself has to be done and
+appropriate clock sources and clock event devices have to be registered before
+the high resolution functionality can work. Up to the point where hrtimers are
+initialized, the system works in the usual low resolution periodic mode. The
+clock source and the clock event device layers provide notification functions
+which inform hrtimers about availability of new hardware. hrtimers validates
+the usability of the registered clock sources and clock event devices before
+switching to high resolution mode. This ensures also that a kernel which is
+configured for high resolution timers can run on a system which lacks the
+necessary hardware support.
+
+The high resolution timer code does not support SMP machines which have only
+global clock event devices. The support of such hardware would involve IPI
+calls when an interrupt happens. The overhead would be much larger than the
+benefit. This is the reason why we currently disable high resolution and
+dynamic ticks on i386 SMP systems which stop the local APIC in C3 power
+state. A workaround is available as an idea, but the problem has not been
+tackled yet.
+
+The time ordered insertion of timers provides all the infrastructure to decide
+whether the event device has to be reprogrammed when a timer is added. The
+decision is made per timer base and synchronized across per-cpu timer bases in
+a support function. The design allows the system to utilize separate per-CPU
+clock event devices for the per-CPU timer bases, but currently only one
+reprogrammable clock event device per-CPU is utilized.
+
+When the timer interrupt happens, the next event interrupt handler is called
+from the clock event distribution code and moves expired timers from the
+red-black tree to a separate double linked list and invokes the softirq
+handler. An additional mode field in the hrtimer structure allows the system to
+execute callback functions directly from the next event interrupt handler. This
+is restricted to code which can safely be executed in the hard interrupt
+context. This applies, for example, to the common case of a wakeup function as
+used by nanosleep. The advantage of executing the handler in the interrupt
+context is the avoidance of up to two context switches - from the interrupted
+context to the softirq and to the task which is woken up by the expired
+timer.
+
+Once a system has switched to high resolution mode, the periodic tick is
+switched off. This disables the per system global periodic clock event device -
+e.g. the PIT on i386 SMP systems.
+
+The periodic tick functionality is provided by an per-cpu hrtimer. The callback
+function is executed in the next event interrupt context and updates jiffies
+and calls update_process_times and profiling. The implementation of the hrtimer
+based periodic tick is designed to be extended with dynamic tick functionality.
+This allows to use a single clock event device to schedule high resolution
+timer and periodic events (jiffies tick, profiling, process accounting) on UP
+systems. This has been proved to work with the PIT on i386 and the Incrementer
+on PPC.
+
+The softirq for running the hrtimer queues and executing the callbacks has been
+separated from the tick bound timer softirq to allow accurate delivery of high
+resolution timer signals which are used by itimer and POSIX interval
+timers. The execution of this softirq can still be delayed by other softirqs,
+but the overall latencies have been significantly improved by this separation.
+
+Figure #5 (OLS slides p.22) illustrates the transformation.
+
+
+dynamic ticks
+-------------
+
+Dynamic ticks are the logical consequence of the hrtimer based periodic tick
+replacement (sched_tick). The functionality of the sched_tick hrtimer is
+extended by three functions:
+
+- hrtimer_stop_sched_tick
+- hrtimer_restart_sched_tick
+- hrtimer_update_jiffies
+
+hrtimer_stop_sched_tick() is called when a CPU goes into idle state. The code
+evaluates the next scheduled timer event (from both hrtimers and the timer
+wheel) and in case that the next event is further away than the next tick it
+reprograms the sched_tick to this future event, to allow longer idle sleeps
+without worthless interruption by the periodic tick. The function is also
+called when an interrupt happens during the idle period, which does not cause a
+reschedule. The call is necessary as the interrupt handler might have armed a
+new timer whose expiry time is before the time which was identified as the
+nearest event in the previous call to hrtimer_stop_sched_tick.
+
+hrtimer_restart_sched_tick() is called when the CPU leaves the idle state before
+it calls schedule(). hrtimer_restart_sched_tick() resumes the periodic tick,
+which is kept active until the next call to hrtimer_stop_sched_tick().
+
+hrtimer_update_jiffies() is called from irq_enter() when an interrupt happens
+in the idle period to make sure that jiffies are up to date and the interrupt
+handler has not to deal with an eventually stale jiffy value.
+
+The dynamic tick feature provides statistical values which are exported to
+userspace via /proc/stats and can be made available for enhanced power
+management control.
+
+The implementation leaves room for further development like full tickless
+systems, where the time slice is controlled by the scheduler, variable
+frequency profiling, and a complete removal of jiffies in the future.
+
+
+Aside the current initial submission of i386 support, the patchset has been
+extended to x86_64 and ARM already. Initial (work in progress) support is also
+available for MIPS and PowerPC.
+
+         Thomas, Ingo
+
+
+
index 3db69a086c41d466afa26dfc6132c82b304a57e7..c34f0db78a30f9f66b22f055f92cd95ae024c6dc 100644 (file)
@@ -48,14 +48,9 @@ following:
 The SMBus controller is function 3 in device 1f. Class 0c05 is SMBus Serial
 Controller.
 
-If you do NOT see the 24x3 device at function 3, and you can't figure out
-any way in the BIOS to enable it,
-
 The ICH chips are quite similar to Intel's PIIX4 chip, at least in the
 SMBus controller.
 
-See the file i2c-piix4 for some additional information.
-
 
 Process Call Support
 --------------------
@@ -74,6 +69,61 @@ SMBus 2.0 Support
 
 The 82801DB (ICH4) and later chips support several SMBus 2.0 features.
 
+
+Hidden ICH SMBus
+----------------
+
+If your system has an Intel ICH south bridge, but you do NOT see the
+SMBus device at 00:1f.3 in lspci, and you can't figure out any way in the
+BIOS to enable it, it means it has been hidden by the BIOS code. Asus is
+well known for first doing this on their P4B motherboard, and many other
+boards after that. Some vendor machines are affected as well.
+
+The first thing to try is the "i2c_ec" ACPI driver. It could be that the
+SMBus was hidden on purpose because it'll be driven by ACPI. If the
+i2c_ec driver works for you, just forget about the i2c-i801 driver and
+don't try to unhide the ICH SMBus. Even if i2c_ec doesn't work, you
+better make sure that the SMBus isn't used by the ACPI code. Try loading
+the "fan" and "thermal" drivers, and check in /proc/acpi/fan and
+/proc/acpi/thermal_zone. If you find anything there, it's likely that
+the ACPI is accessing the SMBus and it's safer not to unhide it. Only
+once you are certain that ACPI isn't using the SMBus, you can attempt
+to unhide it.
+
+In order to unhide the SMBus, we need to change the value of a PCI
+register before the kernel enumerates the PCI devices. This is done in
+drivers/pci/quirks.c, where all affected boards must be listed (see
+function asus_hides_smbus_hostbridge.) If the SMBus device is missing,
+and you think there's something interesting on the SMBus (e.g. a
+hardware monitoring chip), you need to add your board to the list.
+
+The motherboard is identified using the subvendor and subdevice IDs of the
+host bridge PCI device. Get yours with "lspci -n -v -s 00:00.0":
+
+00:00.0 Class 0600: 8086:2570 (rev 02)
+        Subsystem: 1043:80f2
+        Flags: bus master, fast devsel, latency 0
+        Memory at fc000000 (32-bit, prefetchable) [size=32M]
+        Capabilities: [e4] #09 [2106]
+        Capabilities: [a0] AGP version 3.0
+
+Here the host bridge ID is 2570 (82865G/PE/P), the subvendor ID is 1043
+(Asus) and the subdevice ID is 80f2 (P4P800-X). You can find the symbolic
+names for the bridge ID and the subvendor ID in include/linux/pci_ids.h,
+and then add a case for your subdevice ID at the right place in
+drivers/pci/quirks.c. Then please give it very good testing, to make sure
+that the unhidden SMBus doesn't conflict with e.g. ACPI.
+
+If it works, proves useful (i.e. there are usable chips on the SMBus)
+and seems safe, please submit a patch for inclusion into the kernel.
+
+Note: There's a useful script in lm_sensors 2.10.2 and later, named
+unhide_ICH_SMBus (in prog/hotplug), which uses the fakephp driver to
+temporarily unhide the SMBus without having to patch and recompile your
+kernel. It's very convenient if you just want to check if there's
+anything interesting on your hidden ICH SMBus.
+
+
 **********************
 The lm_sensors project gratefully acknowledges the support of Texas
 Instruments in the initial development of this driver.
index 77b995dfca22652bc94532a9145047d444b8baec..dceaba1ad930733e04d95dca441ec3c411f7f0be 100644 (file)
@@ -19,6 +19,7 @@ It currently supports the following devices:
  * (type=4) Analog Devices ADM1032 evaluation board
  * (type=5) Analog Devices evaluation boards: ADM1025, ADM1030, ADM1031
  * (type=6) Barco LPT->DVI (K5800236) adapter
+ * (type=7) One For All JP1 parallel port adapter
 
 These devices use different pinout configurations, so you have to tell
 the driver what you have, using the type module parameter. There is no
@@ -157,3 +158,17 @@ many more, using /dev/velleman.
   http://home.wanadoo.nl/hihihi/libk8005.htm
   http://struyve.mine.nu:8080/index.php?block=k8000
   http://sourceforge.net/projects/libk8005/
+
+
+One For All JP1 parallel port adapter
+-------------------------------------
+
+The JP1 project revolves around a set of remote controls which expose
+the I2C bus their internal configuration EEPROM lives on via a 6 pin
+jumper in the battery compartment. More details can be found at:
+
+http://www.hifi-remote.com/jp1/
+
+Details of the simple parallel port hardware can be found at:
+
+http://www.hifi-remote.com/jp1/hardware.shtml
index 921476333235b3b207c30458f97986956c372b68..7cbe43fa2701dfb875a7eae69754ecb557e5c043 100644 (file)
@@ -6,7 +6,7 @@ Supported adapters:
     Datasheet: Publicly available at the Intel website
   * ServerWorks OSB4, CSB5, CSB6 and HT-1000 southbridges
     Datasheet: Only available via NDA from ServerWorks
-  * ATI IXP southbridges IXP200, IXP300, IXP400
+  * ATI IXP200, IXP300, IXP400 and SB600 southbridges
     Datasheet: Not publicly available
   * Standard Microsystems (SMSC) SLC90E66 (Victory66) southbridge
     Datasheet: Publicly available at the SMSC website http://www.smsc.com
index 25680346e0acd2059bf23608f5982b8bb2163eaf..775f489e86f63162d9abe00b1588f4b515704521 100644 (file)
@@ -13,6 +13,9 @@ Supported adapters:
   * VIA Technologies, Inc. VT8235, VT8237R, VT8237A, VT8251
     Datasheet: available on request and under NDA from VIA
 
+  * VIA Technologies, Inc. CX700
+    Datasheet: available on request and under NDA from VIA
+
 Authors:
        Kyösti Mälkki <kmalkki@cc.hut.fi>,
        Mark D. Studebaker <mdsxyz123@yahoo.com>,
@@ -44,6 +47,7 @@ Your lspci -n listing must show one of these :
  device 1106:3227   (VT8237R)
  device 1106:3337   (VT8237A)
  device 1106:3287   (VT8251)
+ device 1106:8324   (CX700)
 
 If none of these show up, you should look in the BIOS for settings like
 enable ACPI / SMBus or even USB.
@@ -51,3 +55,6 @@ enable ACPI / SMBus or even USB.
 Except for the oldest chips (VT82C596A/B, VT82C686A and most probably
 VT8231), this driver supports I2C block transactions. Such transactions
 are mainly useful to read from and write to EEPROMs.
+
+The CX700 additionally appears to support SMBus PEC, although this driver
+doesn't implement it yet.
index f03c2a02f806684c39c0cd8459eaab71a661496b..ca272b263a92e5f2aefaf0158c30145ba7119a9f 100644 (file)
@@ -129,6 +129,12 @@ Technical changes:
   structure, those name member should be initialized to a driver name
   string. i2c_driver itself has no name member anymore.
 
+* [Driver model] Instead of shutdown or reboot notifiers, provide a
+  shutdown() method in your driver.
+
+* [Power management] Use the driver model suspend() and resume()
+  callbacks instead of the obsolete pm_register() calls.
+
 Coding policy:
 
 * [Copyright] Use (C), not (c), for copyright.
index 09f5e5ca49272544002b862d0b61af21bc66ce70..8a653c60d25a22d1bde489b947e58b0847d6e324 100644 (file)
@@ -97,7 +97,7 @@ SMBus Write Word Data
 =====================
 
 This is the opposite operation of the Read Word Data command. 16 bits
-of data is read from a device, from a designated register that is 
+of data is written to a device, to the designated register that is
 specified through the Comm byte. 
 
 S Addr Wr [A] Comm [A] DataLow [A] DataHigh [A] P
index 3a057c8e5507c4d1ef8620b93fff8bfe1f208702..fbcff96f4ca1f8881d8459ff94c74ac1e38e6417 100644 (file)
@@ -21,20 +21,26 @@ The driver structure
 
 Usually, you will implement a single driver structure, and instantiate
 all clients from it. Remember, a driver structure contains general access 
-routines, a client structure specific information like the actual I2C
-address.
+routines, and should be zero-initialized except for fields with data you
+provide.  A client structure holds device-specific information like the
+driver model device node, and its I2C address.
 
 static struct i2c_driver foo_driver = {
        .driver = {
                .name   = "foo",
        },
-       .attach_adapter = &foo_attach_adapter,
-       .detach_client  = &foo_detach_client,
-       .command        = &foo_command /* may be NULL */
+       .attach_adapter = foo_attach_adapter,
+       .detach_client  = foo_detach_client,
+       .shutdown       = foo_shutdown, /* optional */
+       .suspend        = foo_suspend,  /* optional */
+       .resume         = foo_resume,   /* optional */
+       .command        = foo_command,  /* optional */
 }
  
-The name field must match the driver name, including the case. It must not
-contain spaces, and may be up to 31 characters long.
+The name field is the driver name, and must not contain spaces.  It
+should match the module name (if the driver can be compiled as a module),
+although you can use MODULE_ALIAS (passing "foo" in this example) to add
+another name for the module.
 
 All other fields are for call-back functions which will be explained 
 below.
@@ -43,11 +49,18 @@ below.
 Extra client data
 =================
 
-The client structure has a special `data' field that can point to any
-structure at all. You can use this to keep client-specific data. You
+Each client structure has a special `data' field that can point to any
+structure at all.  You should use this to keep device-specific data,
+especially in drivers that handle multiple I2C or SMBUS devices.  You
 do not always need this, but especially for `sensors' drivers, it can
 be very useful.
 
+       /* store the value */
+       void i2c_set_clientdata(struct i2c_client *client, void *data);
+
+       /* retrieve the value */
+       void *i2c_get_clientdata(struct i2c_client *client);
+
 An example structure is below.
 
   struct foo_data {
@@ -493,6 +506,33 @@ by `__init_data'.  Hose functions and structures can be removed after
 kernel booting (or module loading) is completed.
 
 
+Power Management
+================
+
+If your I2C device needs special handling when entering a system low
+power state -- like putting a transceiver into a low power mode, or
+activating a system wakeup mechanism -- do that in the suspend() method.
+The resume() method should reverse what the suspend() method does.
+
+These are standard driver model calls, and they work just like they
+would for any other driver stack.  The calls can sleep, and can use
+I2C messaging to the device being suspended or resumed (since their
+parent I2C adapter is active when these calls are issued, and IRQs
+are still enabled).
+
+
+System Shutdown
+===============
+
+If your I2C device needs special handling when the system shuts down
+or reboots (including kexec) -- like turning something off -- use a
+shutdown() method.
+
+Again, this is a standard driver model call, working just like it
+would for any other driver stack:  the calls can sleep, and can use
+I2C messaging.
+
+
 Command function
 ================
 
index 5a8bd5bd88eff17f02421165fff6811674e0a53f..8f750c0efed5ed0adc5329ff5bd6a5e17d5c9113 100644 (file)
@@ -94,8 +94,7 @@ Code  Seq#    Include File            Comments
 'L'    00-1F   linux/loop.h
 'L'    E0-FF   linux/ppdd.h            encrypted disk device driver
                                        <http://linux01.gwdg.de/~alatham/ppdd.html>
-'M'    all     linux/soundcard.h       conflict!
-'M'    00-1F   linux/isicom.h          conflict!
+'M'    all     linux/soundcard.h
 'N'    00-1F   drivers/usb/scanner.h
 'P'    all     linux/soundcard.h
 'Q'    all     linux/soundcard.h
index fa0d4cca964acc1ff3cc73a342ef9c3592ca3322..55b2852904a40f7a042c69fd3888423d02eb4d38 100644 (file)
@@ -8,29 +8,33 @@ GigaSet 307x Device Driver
      This release supports the connection of the Gigaset 307x/417x family of
      ISDN DECT bases via Gigaset M101 Data, Gigaset M105 Data or direct USB
      connection. The following devices are reported to be compatible:
-     307x/417x:
-        Gigaset SX255isdn
-        Gigaset SX353isdn
-        Sinus 45 [AB] isdn (Deutsche Telekom)
-        Sinus 721X/XA
+
+     Bases:
+        Siemens Gigaset 3070/3075 isdn
+        Siemens Gigaset 4170/4175 isdn
+        Siemens Gigaset SX205/255
+        Siemens Gigaset SX353
+        T-Com Sinus 45 [AB] isdn
+        T-Com Sinus 721X[A] [SE]
         Vox Chicago 390 ISDN (KPN Telecom)
-     M101:
-        Sinus 45 Data 1 (Telekom)
-     M105:
-        Gigaset USB Adapter DECT
-        Sinus 45 Data 2 (Telekom)
-        Sinus 721 data
+
+     RS232 data boxes:
+        Siemens Gigaset M101 Data
+        T-Com Sinus 45 Data 1
+
+     USB data boxes:
+        Siemens Gigaset M105 Data
+        Siemens Gigaset USB Adapter DECT
+        T-Com Sinus 45 Data 2
+        T-Com Sinus 721 data
         Chicago 390 USB (KPN)
+
      See also http://www.erbze.info/sinus_gigaset.htm and
               http://gigaset307x.sourceforge.net/
 
      We had also reports from users of Gigaset M105 who could use the drivers
      with SX 100 and CX 100 ISDN bases (only in unimodem mode, see section 2.4.)
      If you have another device that works with our driver, please let us know.
-     For example, Gigaset SX205isdn/Sinus 721 X SE and Gigaset SX303isdn bases
-     are just versions without answering machine of models known to work, so
-     they should work just as well; but so far we are lacking positive reports
-     on these.
 
      Chances of getting an USB device to work are good if the output of
         lsusb
@@ -60,14 +64,28 @@ GigaSet 307x Device Driver
      To get the device working, you have to load the proper kernel module. You
      can do this using
          modprobe modulename
-     where modulename is usb_gigaset (M105) or bas_gigaset (direct USB
-     connection to the base).
+     where modulename is ser_gigaset (M101), usb_gigaset (M105), or
+     bas_gigaset (direct USB connection to the base).
+
+     The module ser_gigaset provides a serial line discipline N_GIGASET_M101
+     which drives the device through the regular serial line driver. To use it,
+     run the Gigaset M101 daemon "gigasetm101d" (also available from
+     http://sourceforge.net/projects/gigaset307x/) with the device file of the
+     RS232 port to the M101 as an argument, for example:
+        gigasetm101d /dev/ttyS1
+     This will open the device file, set its line discipline to N_GIGASET_M101,
+     and then sleep in the background, keeping the device open so that the
+     line discipline remains active. To deactivate it, kill the daemon, for
+     example with
+        killall gigasetm101d
+     before disconnecting the device.
 
 2.2. Device nodes for user space programs
      ------------------------------------
      The device can be accessed from user space (eg. by the user space tools
      mentioned in 1.2.) through the device nodes:
 
+     - /dev/ttyGS0 for M101 (RS232 data boxes)
      - /dev/ttyGU0 for M105 (USB data boxes)
      - /dev/ttyGB0 for the base driver (direct USB connection)
 
@@ -168,6 +186,19 @@ GigaSet 307x Device Driver
      You can also use /sys/class/tty/ttyGxy/cidmode for changing the CID mode
      setting (ttyGxy is ttyGU0 or ttyGB0).
 
+2.6. M105 Undocumented USB Requests
+     ------------------------------
+
+     The Gigaset M105 USB data box understands a couple of useful, but
+     undocumented USB commands. These requests are not used in normal
+     operation (for wireless access to the base), but are needed for access
+     to the M105's own configuration mode (registration to the base, baudrate
+     and line format settings, device status queries) via the gigacontr
+     utility. Their use is disabled in the driver by default for safety
+     reasons but can be enabled by setting the kernel configuration option
+     "Support for undocumented USB requests" (GIGASET_UNDOCREQ) to "Y" and
+     recompiling.
+
 
 3.   Troubleshooting
      ---------------
index 073306818347fad7b2899a6a9eaa704c38a39723..79775a4130b5e1992d8ed8ca82d3056d0263e0bc 100644 (file)
@@ -311,10 +311,10 @@ Following are the arch specific command line options to be used while
 loading dump-capture kernel.
 
 For i386, x86_64 and ia64:
-       "init 1 irqpoll maxcpus=1"
+       "1 irqpoll maxcpus=1"
 
 For ppc64:
-       "init 1 maxcpus=1 noirqdistrib"
+       "1 maxcpus=1 noirqdistrib"
 
 
 Notes on loading the dump-capture kernel:
@@ -332,8 +332,8 @@ Notes on loading the dump-capture kernel:
 * You must specify <root-dev> in the format corresponding to the root
   device name in the output of mount command.
 
-* "init 1" boots the dump-capture kernel into single-user mode without
-  networking. If you want networking, use "init 3."
+* Boot parameter "1" boots the dump-capture kernel into single-user
+  mode without networking. If you want networking, use "3".
 
 * We generally don' have to bring up a SMP kernel just to capture the
   dump. Hence generally it is useful either to build a UP dump-capture
index 284e7e198e93a288624c6258ff30294c6aacf8d6..2075c0658bf547d04d36fa1b6a59a2c7a48d50b8 100644 (file)
@@ -101,16 +101,20 @@ The format of the block comment is like this:
 
 /**
  * function_name(:)? (- short description)?
-(* @parameterx: (description of parameter x)?)*
+(* @parameterx(space)*: (description of parameter x)?)*
 (* a blank line)?
  * (Description:)? (Description of function)?
  * (section header: (section description)? )*
 (*)?*/
 
-The short function description cannot be multiline, but the other
-descriptions can be (and they can contain blank lines). Avoid putting a
-spurious blank line after the function name, or else the description will
-be repeated!
+The short function description ***cannot be multiline***, but the other
+descriptions can be (and they can contain blank lines).  If you continue
+that initial short description onto a second line, that second line will
+appear further down at the beginning of the description section, which is
+almost certainly not what you had in mind.
+
+Avoid putting a spurious blank line after the function name, or else the
+description will be repeated!
 
 All descriptive text is further processed, scanning for the following special
 patterns, which are highlighted appropriately.
@@ -121,6 +125,31 @@ patterns, which are highlighted appropriately.
 '@parameter' - name of a parameter
 '%CONST' - name of a constant.
 
+NOTE 1:  The multi-line descriptive text you provide does *not* recognize
+line breaks, so if you try to format some text nicely, as in:
+
+  Return codes
+    0 - cool
+    1 - invalid arg
+    2 - out of memory
+
+this will all run together and produce:
+
+  Return codes 0 - cool 1 - invalid arg 2 - out of memory
+
+NOTE 2:  If the descriptive text you provide has lines that begin with
+some phrase followed by a colon, each of those phrases will be taken as
+a new section heading, which means you should similarly try to avoid text
+like:
+
+  Return codes:
+    0: cool
+    1: invalid arg
+    2: out of memory
+
+every line of which would start a new section.  Again, probably not
+what you were after.
+
 Take a look around the source tree for examples.
 
 
index 25d2985171044712e864035fc5201147ba96cdb8..abd575cfc759acbf085644ebe9b7dc04dd8ce81d 100644 (file)
@@ -104,6 +104,9 @@ loader, and have no meaning to the kernel directly.
 Do not modify the syntax of boot loader parameters without extreme
 need or coordination with <Documentation/i386/boot.txt>.
 
+There are also arch-specific kernel-parameters not documented here.
+See for example <Documentation/x86_64/boot-options.txt>.
+
 Note that ALL kernel parameters listed below are CASE SENSITIVE, and that
 a trailing = on the name of any parameter states that that parameter will
 be entered as an environment variable, whereas its absence indicates that
@@ -361,6 +364,11 @@ and is between 256 and 4096 characters. It is defined in the file
                        clocksource is not available, it defaults to PIT.
                        Format: { pit | tsc | cyclone | pmtmr }
 
+       code_bytes      [IA32] How many bytes of object code to print in an
+                       oops report.
+                       Range: 0 - 8192
+                       Default: 64
+
        disable_8254_timer
        enable_8254_timer
                        [IA32/X86_64] Disable/Enable interrupt 0 timer routing
@@ -601,6 +609,10 @@ and is between 256 and 4096 characters. It is defined in the file
                        highmem otherwise. This also works to reduce highmem
                        size on bigger boxes.
 
+       highres=        [KNL] Enable/disable high resolution timer mode.
+                       Valid parameters: "on", "off"
+                       Default: "on"
+
        hisax=          [HW,ISDN]
                        See Documentation/isdn/README.HiSax.
 
@@ -1070,6 +1082,10 @@ and is between 256 and 4096 characters. It is defined in the file
                        in certain environments such as networked servers or
                        real-time systems.
 
+       nohz=           [KNL] Boottime enable/disable dynamic ticks
+                       Valid arguments: on, off
+                       Default: on
+
        noirqbalance    [IA-32,SMP,KNL] Disable kernel irq balancing
 
        noirqdebug      [IA-32] Disables the code which attempts to detect and
@@ -1396,6 +1412,8 @@ and is between 256 and 4096 characters. It is defined in the file
                        in <PAGE_SIZE> units (needed only for swap files).
                        See  Documentation/power/swsusp-and-swap-files.txt
 
+       retain_initrd   [RAM] Keep initrd memory after extraction
+
        rhash_entries=  [KNL,NET]
                        Set number of hash buckets for route cache
 
diff --git a/Documentation/local_ops.txt b/Documentation/local_ops.txt
new file mode 100644 (file)
index 0000000..b0aca07
--- /dev/null
@@ -0,0 +1,163 @@
+            Semantics and Behavior of Local Atomic Operations
+
+                           Mathieu Desnoyers
+
+
+       This document explains the purpose of the local atomic operations, how
+to implement them for any given architecture and shows how they can be used
+properly. It also stresses on the precautions that must be taken when reading
+those local variables across CPUs when the order of memory writes matters.
+
+
+
+* Purpose of local atomic operations
+
+Local atomic operations are meant to provide fast and highly reentrant per CPU
+counters. They minimize the performance cost of standard atomic operations by
+removing the LOCK prefix and memory barriers normally required to synchronize
+across CPUs.
+
+Having fast per CPU atomic counters is interesting in many cases : it does not
+require disabling interrupts to protect from interrupt handlers and it permits
+coherent counters in NMI handlers. It is especially useful for tracing purposes
+and for various performance monitoring counters.
+
+Local atomic operations only guarantee variable modification atomicity wrt the
+CPU which owns the data. Therefore, care must taken to make sure that only one
+CPU writes to the local_t data. This is done by using per cpu data and making
+sure that we modify it from within a preemption safe context. It is however
+permitted to read local_t data from any CPU : it will then appear to be written
+out of order wrt other memory writes on the owner CPU.
+
+
+* Implementation for a given architecture
+
+It can be done by slightly modifying the standard atomic operations : only
+their UP variant must be kept. It typically means removing LOCK prefix (on
+i386 and x86_64) and any SMP sychronization barrier. If the architecture does
+not have a different behavior between SMP and UP, including asm-generic/local.h
+in your archtecture's local.h is sufficient.
+
+The local_t type is defined as an opaque signed long by embedding an
+atomic_long_t inside a structure. This is made so a cast from this type to a
+long fails. The definition looks like :
+
+typedef struct { atomic_long_t a; } local_t;
+
+
+* How to use local atomic operations
+
+#include <linux/percpu.h>
+#include <asm/local.h>
+
+static DEFINE_PER_CPU(local_t, counters) = LOCAL_INIT(0);
+
+
+* Counting
+
+Counting is done on all the bits of a signed long.
+
+In preemptible context, use get_cpu_var() and put_cpu_var() around local atomic
+operations : it makes sure that preemption is disabled around write access to
+the per cpu variable. For instance :
+
+       local_inc(&get_cpu_var(counters));
+       put_cpu_var(counters);
+
+If you are already in a preemption-safe context, you can directly use
+__get_cpu_var() instead.
+
+       local_inc(&__get_cpu_var(counters));
+
+
+
+* Reading the counters
+
+Those local counters can be read from foreign CPUs to sum the count. Note that
+the data seen by local_read across CPUs must be considered to be out of order
+relatively to other memory writes happening on the CPU that owns the data.
+
+       long sum = 0;
+       for_each_online_cpu(cpu)
+               sum += local_read(&per_cpu(counters, cpu));
+
+If you want to use a remote local_read to synchronize access to a resource
+between CPUs, explicit smp_wmb() and smp_rmb() memory barriers must be used
+respectively on the writer and the reader CPUs. It would be the case if you use
+the local_t variable as a counter of bytes written in a buffer : there should
+be a smp_wmb() between the buffer write and the counter increment and also a
+smp_rmb() between the counter read and the buffer read.
+
+
+Here is a sample module which implements a basic per cpu counter using local.h.
+
+--- BEGIN ---
+/* test-local.c
+ *
+ * Sample module for local.h usage.
+ */
+
+
+#include <asm/local.h>
+#include <linux/module.h>
+#include <linux/timer.h>
+
+static DEFINE_PER_CPU(local_t, counters) = LOCAL_INIT(0);
+
+static struct timer_list test_timer;
+
+/* IPI called on each CPU. */
+static void test_each(void *info)
+{
+       /* Increment the counter from a non preemptible context */
+       printk("Increment on cpu %d\n", smp_processor_id());
+       local_inc(&__get_cpu_var(counters));
+
+       /* This is what incrementing the variable would look like within a
+        * preemptible context (it disables preemption) :
+        *
+        * local_inc(&get_cpu_var(counters));
+        * put_cpu_var(counters);
+        */
+}
+
+static void do_test_timer(unsigned long data)
+{
+       int cpu;
+
+       /* Increment the counters */
+       on_each_cpu(test_each, NULL, 0, 1);
+       /* Read all the counters */
+       printk("Counters read from CPU %d\n", smp_processor_id());
+       for_each_online_cpu(cpu) {
+               printk("Read : CPU %d, count %ld\n", cpu,
+                       local_read(&per_cpu(counters, cpu)));
+       }
+       del_timer(&test_timer);
+       test_timer.expires = jiffies + 1000;
+       add_timer(&test_timer);
+}
+
+static int __init test_init(void)
+{
+       /* initialize the timer that will increment the counter */
+       init_timer(&test_timer);
+       test_timer.function = do_test_timer;
+       test_timer.expires = jiffies + 1;
+       add_timer(&test_timer);
+
+       return 0;
+}
+
+static void __exit test_exit(void)
+{
+       del_timer_sync(&test_timer);
+}
+
+module_init(test_init);
+module_exit(test_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Mathieu Desnoyers");
+MODULE_DESCRIPTION("Local Atomic Ops");
+--- END ---
index 719f9a9d60c0a4a5c9668608eb3f588b130835ed..16a7cae2721dada82c9e1d9267b48c9f90b9802d 100644 (file)
@@ -67,8 +67,8 @@ nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
   <nfs-options>        Standard NFS options. All options are separated by commas.
                The following defaults are used:
                        port            = as given by server portmap daemon
-                       rsize           = 1024
-                       wsize           = 1024
+                       rsize           = 4096
+                       wsize           = 4096
                        timeo           = 7
                        retrans         = 3
                        acregmin        = 3
index 33994271cb3bcbc81caba4581be2c5ec16046946..3b514672b80ed3ef6d34b179dc65d35e366f0126 100644 (file)
@@ -1334,6 +1334,9 @@ platforms are moved over to use the flattened-device-tree model.
       fsl-usb2-mph compatible controllers.  Either this property or
       "port0" (or both) must be defined for "fsl-usb2-mph" compatible 
       controllers.
+    - dr_mode : indicates the working mode for "fsl-usb2-dr" compatible
+      controllers.  Can be "host", "peripheral", or "otg".  Default to
+      "host" if not defined for backward compatibility.
 
    Recommended properties :
     - interrupts : <a b> where a is the interrupt number and b is a
@@ -1367,6 +1370,7 @@ platforms are moved over to use the flattened-device-tree model.
                #size-cells = <0>;
                interrupt-parent = <700>;
                interrupts = <26 1>;
+               dr_mode = "otg";
                phy = "ulpi";
        };
 
index 69f016f02bb0f6055913528b2fa19428872a6584..e59fcbbe338cb437dabb6fd28d8d0f5d1e14345b 100644 (file)
@@ -1,7 +1,7 @@
-MPC52xx Device Tree Bindings
+MPC5200 Device Tree Bindings
 ----------------------------
 
-(c) 2006 Secret Lab Technologies Ltd
+(c) 2006-2007 Secret Lab Technologies Ltd
 Grant Likely <grant.likely at secretlab.ca>
 
 ********** DRAFT ***********
@@ -20,11 +20,11 @@ described in Documentation/powerpc/booting-without-of.txt), or passed
 by Open Firmare (IEEE 1275) compatible firmware using an OF compatible
 client interface API.
 
-This document specifies the requirements on the device-tree for mpc52xx
+This document specifies the requirements on the device-tree for mpc5200
 based boards.  These requirements are above and beyond the details
 specified in either the OpenFirmware spec or booting-without-of.txt
 
-All new mpc52xx-based boards are expected to match this document.  In
+All new mpc5200-based boards are expected to match this document.  In
 cases where this document is not sufficient to support a new board port,
 this document should be updated as part of adding the new board support.
 
@@ -32,26 +32,26 @@ II - Philosophy
 ===============
 The core of this document is naming convention.  The whole point of
 defining this convention is to reduce or eliminate the number of
-special cases required to support a 52xx board.  If all 52xx boards
-follow the same convention, then generic 52xx support code will work
+special cases required to support a 5200 board.  If all 5200 boards
+follow the same convention, then generic 5200 support code will work
 rather than coding special cases for each new board.
 
 This section tries to capture the thought process behind why the naming
 convention is what it is.
 
-1. Node names
--------------
+1.  names
+---------
 There is strong convention/requirements already established for children
 of the root node.  'cpus' describes the processor cores, 'memory'
 describes memory, and 'chosen' provides boot configuration.  Other nodes
 are added to describe devices attached to the processor local bus.
+
 Following convention already established with other system-on-chip
-processors, MPC52xx boards must have an 'soc5200' node as a child of the
-root node.
+processors, 5200 device trees should use the name 'soc5200' for the
+parent node of on chip devices, and the root node should be its parent.
 
-The soc5200 node holds child nodes for all on chip devices.  Child nodes
-are typically named after the configured function.  ie. the FEC node is
-named 'ethernet', and a PSC in uart mode is named 'serial'.
+Child nodes are typically named after the configured function.  ie.
+the FEC node is named 'ethernet', and a PSC in uart mode is named 'serial'.
 
 2. device_type property
 -----------------------
@@ -66,28 +66,47 @@ exactly.
 Since device_type isn't enough to match devices to drivers, there also
 needs to be a naming convention for the compatible property.  Compatible
 is an list of device descriptions sorted from specific to generic.  For
-the mpc52xx, the required format for each compatible value is
-<chip>-<device>[-<mode>].  At the minimum, the list shall contain two
-items; the first specifying the exact chip, and the second specifying
-mpc52xx for the chip.
-
-ie. ethernet on mpc5200b: compatible = "mpc5200b-ethernet\0mpc52xx-ethernet"
-
-The idea here is that most drivers will match to the most generic field
-in the compatible list (mpc52xx-*), but can also test the more specific
-field for enabling bug fixes or extra features.
+the mpc5200, the required format for each compatible value is
+<chip>-<device>[-<mode>].  The OS should be able to match a device driver
+to the device based solely on the compatible value.  If two drivers
+match on the compatible list; the 'most compatible' driver should be
+selected.
+
+The split between the MPC5200 and the MPC5200B leaves a bit of a
+connundrum.  How should the compatible property be set up to provide
+maximum compatability information; but still acurately describe the
+chip?  For the MPC5200; the answer is easy.  Most of the SoC devices
+originally appeared on the MPC5200.  Since they didn't exist anywhere
+else; the 5200 compatible properties will contain only one item;
+"mpc5200-<device>".
+
+The 5200B is almost the same as the 5200, but not quite.  It fixes
+silicon bugs and it adds a small number of enhancements.  Most of the
+devices either provide exactly the same interface as on the 5200.  A few
+devices have extra functions but still have a backwards compatible mode.
+To express this infomation as completely as possible, 5200B device trees
+should have two items in the compatible list;
+"mpc5200b-<device>\0mpc5200-<device>".  It is *strongly* recommended
+that 5200B device trees follow this convention (instead of only listing
+the base mpc5200 item).
+
+If another chip appear on the market with one of the mpc5200 SoC
+devices, then the compatible list should include mpc5200-<device>.
+
+ie. ethernet on mpc5200: compatible = "mpc5200-ethernet"
+    ethernet on mpc5200b: compatible = "mpc5200b-ethernet\0mpc5200-ethernet"
 
 Modal devices, like PSCs, also append the configured function to the
 end of the compatible field.  ie. A PSC in i2s mode would specify
-"mpc52xx-psc-i2s", not "mpc52xx-i2s".  This convention is chosen to
+"mpc5200-psc-i2s", not "mpc5200-i2s".  This convention is chosen to
 avoid naming conflicts with non-psc devices providing the same
-function.  For example, "mpc52xx-spi" and "mpc52xx-psc-spi" describe
+function.  For example, "mpc5200-spi" and "mpc5200-psc-spi" describe
 the mpc5200 simple spi device and a PSC spi mode respectively.
 
 If the soc device is more generic and present on other SOCs, the
 compatible property can specify the more generic device type also.
 
-ie. mscan: compatible = "mpc5200-mscan\0mpc52xx-mscan\0fsl,mscan";
+ie. mscan: compatible = "mpc5200-mscan\0fsl,mscan";
 
 At the time of writing, exact chip may be either 'mpc5200' or
 'mpc5200b'.
@@ -96,7 +115,7 @@ Device drivers should always try to match as generically as possible.
 
 III - Structure
 ===============
-The device tree for an mpc52xx board follows the structure defined in
+The device tree for an mpc5200 board follows the structure defined in
 booting-without-of.txt with the following additional notes:
 
 0) the root node
@@ -115,7 +134,7 @@ Typical memory description node; see booting-without-of.
 
 3) The soc5200 node
 -------------------
-This node describes the on chip SOC peripherals.  Every mpc52xx based
+This node describes the on chip SOC peripherals.  Every mpc5200 based
 board will have this node, and as such there is a common naming
 convention for SOC devices.
 
@@ -125,71 +144,111 @@ name                     type            description
 device_type            string          must be "soc"
 ranges                 int             should be <0 baseaddr baseaddr+10000>
 reg                    int             must be <baseaddr 10000>
+compatible             string          mpc5200: "mpc5200-soc"
+                                       mpc5200b: "mpc5200b-soc\0mpc5200-soc"
+system-frequency       int             Fsystem frequency; source of all
+                                       other clocks.
+bus-frequency          int             IPB bus frequency in HZ.  Clock rate
+                                       used by most of the soc devices.
+#interrupt-cells       int             must be <3>.
 
 Recommended properties:
 name                   type            description
 ----                   ----            -----------
-compatible             string          should be "<chip>-soc\0mpc52xx-soc"
-                                       ie. "mpc5200b-soc\0mpc52xx-soc"
-#interrupt-cells       int             must be <3>.  If it is not defined
-                                       here then it must be defined in every
-                                       soc device node.
-bus-frequency          int             IPB bus frequency in HZ.  Clock rate
-                                       used by most of the soc devices.
-                                       Defining it here avoids needing it
-                                       added to every device node.
+model                  string          Exact model of the chip;
+                                       ie: model="fsl,mpc5200"
+revision               string          Silicon revision of chip
+                                       ie: revision="M08A"
+
+The 'model' and 'revision' properties are *strongly* recommended.  Having
+them presence acts as a bit of a safety net for working around as yet
+undiscovered bugs on one version of silicon.  For example, device drivers
+can use the model and revision properties to decide if a bug fix should
+be turned on.
 
 4) soc5200 child nodes
 ----------------------
 Any on chip SOC devices available to Linux must appear as soc5200 child nodes.
 
-Note: in the tables below, '*' matches all <chip> values.  ie.
-*-pic would translate to "mpc5200-pic\0mpc52xx-pic"
+Note: The tables below show the value for the mpc5200.  A mpc5200b device
+tree should use the "mpc5200b-<device>\0mpc5200-<device> form.
 
 Required soc5200 child nodes:
 name           device_type             compatible      Description
 ----           -----------             ----------      -----------
-cdm@<addr>     cdm                     *-cmd           Clock Distribution
-pic@<addr>     interrupt-controller    *-pic           need an interrupt
+cdm@<addr>     cdm                     mpc5200-cmd     Clock Distribution
+pic@<addr>     interrupt-controller    mpc5200-pic     need an interrupt
                                                        controller to boot
-bestcomm@<addr>        dma-controller          *-bestcomm      52xx pic also requires
-                                                       the bestcomm device
+bestcomm@<addr>        dma-controller          mpc5200-bestcomm 5200 pic also requires
+                                                        the bestcomm device
 
 Recommended soc5200 child nodes; populate as needed for your board
-name           device_type     compatible      Description
-----           -----------     ----------      -----------
-gpt@<addr>     gpt             *-gpt           General purpose timers
-rtc@<addr>     rtc             *-rtc           Real time clock
-mscan@<addr>   mscan           *-mscan         CAN bus controller
-pci@<addr>     pci             *-pci           PCI bridge
-serial@<addr>  serial          *-psc-uart      PSC in serial mode
-i2s@<addr>     sound           *-psc-i2s       PSC in i2s mode
-ac97@<addr>    sound           *-psc-ac97      PSC in ac97 mode
-spi@<addr>     spi             *-psc-spi       PSC in spi mode
-irda@<addr>    irda            *-psc-irda      PSC in IrDA mode
-spi@<addr>     spi             *-spi           MPC52xx spi device
-ethernet@<addr>        network         *-fec           MPC52xx ethernet device
-ata@<addr>     ata             *-ata           IDE ATA interface
-i2c@<addr>     i2c             *-i2c           I2C controller
-usb@<addr>     usb-ohci-be     *-ohci,ohci-be  USB controller
-xlb@<addr>     xlb             *-xlb           XLB arbritrator
+name           device_type     compatible        Description
+----           -----------     ----------        -----------
+gpt@<addr>     gpt             mpc5200-gpt       General purpose timers
+rtc@<addr>     rtc             mpc5200-rtc       Real time clock
+mscan@<addr>   mscan           mpc5200-mscan     CAN bus controller
+pci@<addr>     pci             mpc5200-pci       PCI bridge
+serial@<addr>  serial          mpc5200-psc-uart  PSC in serial mode
+i2s@<addr>     sound           mpc5200-psc-i2s   PSC in i2s mode
+ac97@<addr>    sound           mpc5200-psc-ac97  PSC in ac97 mode
+spi@<addr>     spi             mpc5200-psc-spi   PSC in spi mode
+irda@<addr>    irda            mpc5200-psc-irda  PSC in IrDA mode
+spi@<addr>     spi             mpc5200-spi       MPC5200 spi device
+ethernet@<addr>        network         mpc5200-fec       MPC5200 ethernet device
+ata@<addr>     ata             mpc5200-ata       IDE ATA interface
+i2c@<addr>     i2c             mpc5200-i2c       I2C controller
+usb@<addr>     usb-ohci-be     mpc5200-ohci,ohci-be    USB controller
+xlb@<addr>     xlb             mpc5200-xlb       XLB arbritrator
+
+Important child node properties
+name           type            description
+----           ----            -----------
+cell-index     int             When multiple devices are present, is the
+                               index of the device in the hardware (ie. There
+                               are 6 PSC on the 5200 numbered PSC1 to PSC6)
+                                   PSC1 has 'cell-index = <0>'
+                                   PSC4 has 'cell-index = <3>'
+
+5) General Purpose Timer nodes (child of soc5200 node)
+On the mpc5200 and 5200b, GPT0 has a watchdog timer function.  If the board
+design supports the internal wdt, then the device node for GPT0 should
+include the empty property 'has-wdt'.
+
+6) PSC nodes (child of soc5200 node)
+PSC nodes can define the optional 'port-number' property to force assignment
+order of serial ports.  For example, PSC5 might be physically connected to
+the port labeled 'COM1' and PSC1 wired to 'COM1'.  In this case, PSC5 would
+have a "port-number = <0>" property, and PSC1 would have "port-number = <1>".
+
+PSC in i2s mode:  The mpc5200 and mpc5200b PSCs are not compatible when in
+i2s mode.  An 'mpc5200b-psc-i2s' node cannot include 'mpc5200-psc-i2s' in the
+compatible field.
 
 IV - Extra Notes
 ================
 
 1. Interrupt mapping
 --------------------
-The mpc52xx pic driver splits hardware IRQ numbers into two levels.  The
+The mpc5200 pic driver splits hardware IRQ numbers into two levels.  The
 split reflects the layout of the PIC hardware itself, which groups
 interrupts into one of three groups; CRIT, MAIN or PERP.  Also, the
 Bestcomm dma engine has it's own set of interrupt sources which are
 cascaded off of peripheral interrupt 0, which the driver interprets as a
 fourth group, SDMA.
 
-The interrupts property for device nodes using the mpc52xx pic consists
+The interrupts property for device nodes using the mpc5200 pic consists
 of three cells; <L1 L2 level>
 
     L1 := [CRIT=0, MAIN=1, PERP=2, SDMA=3]
     L2 := interrupt number; directly mapped from the value in the
           "ICTL PerStat, MainStat, CritStat Encoded Register"
     level := [LEVEL_HIGH=0, EDGE_RISING=1, EDGE_FALLING=2, LEVEL_LOW=3]
+
+2. Shared registers
+-------------------
+Some SoC devices share registers between them.  ie. the i2c devices use
+a single clock control register, and almost all device are affected by
+the port_config register.  Devices which need to manipulate shared regs
+should look to the parent SoC node.  The soc node is responsible
+for arbitrating all shared register access.
diff --git a/Documentation/rbtree.txt b/Documentation/rbtree.txt
new file mode 100644 (file)
index 0000000..7224459
--- /dev/null
@@ -0,0 +1,192 @@
+Red-black Trees (rbtree) in Linux
+January 18, 2007
+Rob Landley <rob@landley.net>
+=============================
+
+What are red-black trees, and what are they for?
+------------------------------------------------
+
+Red-black trees are a type of self-balancing binary search tree, used for
+storing sortable key/value data pairs.  This differs from radix trees (which
+are used to efficiently store sparse arrays and thus use long integer indexes
+to insert/access/delete nodes) and hash tables (which are not kept sorted to
+be easily traversed in order, and must be tuned for a specific size and
+hash function where rbtrees scale gracefully storing arbitrary keys).
+
+Red-black trees are similar to AVL trees, but provide faster real-time bounded
+worst case performance for insertion and deletion (at most two rotations and
+three rotations, respectively, to balance the tree), with slightly slower
+(but still O(log n)) lookup time.
+
+To quote Linux Weekly News:
+
+    There are a number of red-black trees in use in the kernel.
+    The anticipatory, deadline, and CFQ I/O schedulers all employ
+    rbtrees to track requests; the packet CD/DVD driver does the same.
+    The high-resolution timer code uses an rbtree to organize outstanding
+    timer requests.  The ext3 filesystem tracks directory entries in a
+    red-black tree.  Virtual memory areas (VMAs) are tracked with red-black
+    trees, as are epoll file descriptors, cryptographic keys, and network
+    packets in the "hierarchical token bucket" scheduler.
+
+This document covers use of the Linux rbtree implementation.  For more
+information on the nature and implementation of Red Black Trees,  see:
+
+  Linux Weekly News article on red-black trees
+    http://lwn.net/Articles/184495/
+
+  Wikipedia entry on red-black trees
+    http://en.wikipedia.org/wiki/Red-black_tree
+
+Linux implementation of red-black trees
+---------------------------------------
+
+Linux's rbtree implementation lives in the file "lib/rbtree.c".  To use it,
+"#include <linux/rbtree.h>".
+
+The Linux rbtree implementation is optimized for speed, and thus has one
+less layer of indirection (and better cache locality) than more traditional
+tree implementations.  Instead of using pointers to separate rb_node and data
+structures, each instance of struct rb_node is embedded in the data structure
+it organizes.  And instead of using a comparison callback function pointer,
+users are expected to write their own tree search and insert functions
+which call the provided rbtree functions.  Locking is also left up to the
+user of the rbtree code.
+
+Creating a new rbtree
+---------------------
+
+Data nodes in an rbtree tree are structures containing a struct rb_node member:
+
+  struct mytype {
+       struct rb_node node;
+       char *keystring;
+  };
+
+When dealing with a pointer to the embedded struct rb_node, the containing data
+structure may be accessed with the standard container_of() macro.  In addition,
+individual members may be accessed directly via rb_entry(node, type, member).
+
+At the root of each rbtree is an rb_root structure, which is initialized to be
+empty via:
+
+  struct rb_root mytree = RB_ROOT;
+
+Searching for a value in an rbtree
+----------------------------------
+
+Writing a search function for your tree is fairly straightforward: start at the
+root, compare each value, and follow the left or right branch as necessary.
+
+Example:
+
+  struct mytype *my_search(struct rb_root *root, char *string)
+  {
+       struct rb_node *node = root->rb_node;
+
+       while (node) {
+               struct mytype *data = container_of(node, struct mytype, node);
+               int result;
+
+               result = strcmp(string, data->keystring);
+
+               if (result < 0)
+                       node = node->rb_left;
+               else if (result > 0)
+                       node = node->rb_right;
+               else
+                       return data;
+       }
+       return NULL;
+  }
+
+Inserting data into an rbtree
+-----------------------------
+
+Inserting data in the tree involves first searching for the place to insert the
+new node, then inserting the node and rebalancing ("recoloring") the tree.
+
+The search for insertion differs from the previous search by finding the
+location of the pointer on which to graft the new node.  The new node also
+needs a link to its parent node for rebalancing purposes.
+
+Example:
+
+  int my_insert(struct rb_root *root, struct mytype *data)
+  {
+       struct rb_node **new = &(root->rb_node), *parent = NULL;
+
+       /* Figure out where to put new node */
+       while (*new) {
+               struct mytype *this = container_of(*new, struct mytype, node);
+               int result = strcmp(data->keystring, this->keystring);
+
+               parent = *new;
+               if (result < 0)
+                       new = &((*new)->rb_left);
+               else if (result > 0)
+                       new = &((*new)->rb_right);
+               else
+                       return FALSE;
+       }
+
+       /* Add new node and rebalance tree. */
+       rb_link_node(data->node, parent, new);
+       rb_insert_color(data->node, root);
+
+       return TRUE;
+  }
+
+Removing or replacing existing data in an rbtree
+------------------------------------------------
+
+To remove an existing node from a tree, call:
+
+  void rb_erase(struct rb_node *victim, struct rb_root *tree);
+
+Example:
+
+  struct mytype *data = mysearch(mytree, "walrus");
+
+  if (data) {
+       rb_erase(data->node, mytree);
+       myfree(data);
+  }
+
+To replace an existing node in a tree with a new one with the same key, call:
+
+  void rb_replace_node(struct rb_node *old, struct rb_node *new,
+                       struct rb_root *tree);
+
+Replacing a node this way does not re-sort the tree: If the new node doesn't
+have the same key as the old node, the rbtree will probably become corrupted.
+
+Iterating through the elements stored in an rbtree (in sort order)
+------------------------------------------------------------------
+
+Four functions are provided for iterating through an rbtree's contents in
+sorted order.  These work on arbitrary trees, and should not need to be
+modified or wrapped (except for locking purposes):
+
+  struct rb_node *rb_first(struct rb_root *tree);
+  struct rb_node *rb_last(struct rb_root *tree);
+  struct rb_node *rb_next(struct rb_node *node);
+  struct rb_node *rb_prev(struct rb_node *node);
+
+To start iterating, call rb_first() or rb_last() with a pointer to the root
+of the tree, which will return a pointer to the node structure contained in
+the first or last element in the tree.  To continue, fetch the next or previous
+node by calling rb_next() or rb_prev() on the current node.  This will return
+NULL when there are no more nodes left.
+
+The iterator functions return a pointer to the embedded struct rb_node, from
+which the containing data structure may be accessed with the container_of()
+macro, and individual members may be accessed directly via
+rb_entry(node, type, member).
+
+Example:
+
+  struct rb_node *node;
+  for (node = rb_first(&mytree); node; node = rb_next(node))
+       printk("key=%s\n", rb_entry(node, int, keystring));
+
index 7cf1ec5bcdd3b37854ec34ebc085cd3be4532ee7..1ef6bb88cd0003ad05a0d813533689e130a72002 100644 (file)
@@ -149,7 +149,7 @@ RTC class framework, but can't be supported by the older driver.
        is connected to an IRQ line, it can often issue an alarm IRQ up to
        24 hours in the future.
 
-    *  RTC_WKALM_SET, RTC_WKALM_READ ... RTCs that can issue alarms beyond
+    *  RTC_WKALM_SET, RTC_WKALM_RD ... RTCs that can issue alarms beyond
        the next 24 hours use a slightly more powerful API, which supports
        setting the longer alarm time and enabling its IRQ using a single
        request (using the same model as EFI firmware).
@@ -167,6 +167,28 @@ Linux out of a low power sleep state (or hibernation) back to a fully
 operational state.  For example, a system could enter a deep power saving
 state until it's time to execute some scheduled tasks.
 
+Note that many of these ioctls need not actually be implemented by your
+driver.  The common rtc-dev interface handles many of these nicely if your
+driver returns ENOIOCTLCMD.  Some common examples:
+
+    *  RTC_RD_TIME, RTC_SET_TIME: the read_time/set_time functions will be
+       called with appropriate values.
+
+    *  RTC_ALM_SET, RTC_ALM_READ, RTC_WKALM_SET, RTC_WKALM_RD: the
+       set_alarm/read_alarm functions will be called.  To differentiate
+       between the ALM and WKALM, check the larger fields of the rtc_wkalrm
+       struct (like tm_year).  These will be set to -1 when using ALM and
+       will be set to proper values when using WKALM.
+
+    *  RTC_IRQP_SET, RTC_IRQP_READ: the irq_set_freq function will be called
+       to set the frequency while the framework will handle the read for you
+       since the frequency is stored in the irq_freq member of the rtc_device
+       structure.  Also make sure you set the max_user_freq member in your
+       initialization routines so the framework can sanity check the user
+       input for you.
+
+If all else fails, check out the rtc-test.c driver!
+
 
 -------------------- 8< ---------------- 8< -----------------------------
 
@@ -237,7 +259,7 @@ int main(int argc, char **argv)
                                "\n...Update IRQs not supported.\n");
                        goto test_READ;
                }
-               perror("ioctl");
+               perror("RTC_UIE_ON ioctl");
                exit(errno);
        }
 
@@ -284,7 +306,7 @@ int main(int argc, char **argv)
        /* Turn off update interrupts */
        retval = ioctl(fd, RTC_UIE_OFF, 0);
        if (retval == -1) {
-               perror("ioctl");
+               perror("RTC_UIE_OFF ioctl");
                exit(errno);
        }
 
@@ -292,7 +314,7 @@ test_READ:
        /* Read the RTC time/date */
        retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);
        if (retval == -1) {
-               perror("ioctl");
+               perror("RTC_RD_TIME ioctl");
                exit(errno);
        }
 
@@ -320,14 +342,14 @@ test_READ:
                                "\n...Alarm IRQs not supported.\n");
                        goto test_PIE;
                }
-               perror("ioctl");
+               perror("RTC_ALM_SET ioctl");
                exit(errno);
        }
 
        /* Read the current alarm settings */
        retval = ioctl(fd, RTC_ALM_READ, &rtc_tm);
        if (retval == -1) {
-               perror("ioctl");
+               perror("RTC_ALM_READ ioctl");
                exit(errno);
        }
 
@@ -337,7 +359,7 @@ test_READ:
        /* Enable alarm interrupts */
        retval = ioctl(fd, RTC_AIE_ON, 0);
        if (retval == -1) {
-               perror("ioctl");
+               perror("RTC_AIE_ON ioctl");
                exit(errno);
        }
 
@@ -355,7 +377,7 @@ test_READ:
        /* Disable alarm interrupts */
        retval = ioctl(fd, RTC_AIE_OFF, 0);
        if (retval == -1) {
-               perror("ioctl");
+               perror("RTC_AIE_OFF ioctl");
                exit(errno);
        }
 
@@ -368,7 +390,7 @@ test_PIE:
                        fprintf(stderr, "\nNo periodic IRQ support\n");
                        return 0;
                }
-               perror("ioctl");
+               perror("RTC_IRQP_READ ioctl");
                exit(errno);
        }
        fprintf(stderr, "\nPeriodic IRQ rate is %ldHz.\n", tmp);
@@ -387,7 +409,7 @@ test_PIE:
                                        "\n...Periodic IRQ rate is fixed\n");
                                goto done;
                        }
-                       perror("ioctl");
+                       perror("RTC_IRQP_SET ioctl");
                        exit(errno);
                }
 
@@ -397,7 +419,7 @@ test_PIE:
                /* Enable periodic interrupts */
                retval = ioctl(fd, RTC_PIE_ON, 0);
                if (retval == -1) {
-                       perror("ioctl");
+                       perror("RTC_PIE_ON ioctl");
                        exit(errno);
                }
 
@@ -416,7 +438,7 @@ test_PIE:
                /* Disable periodic interrupts */
                retval = ioctl(fd, RTC_PIE_OFF, 0);
                if (retval == -1) {
-                       perror("ioctl");
+                       perror("RTC_PIE_OFF ioctl");
                        exit(errno);
                }
        }
index a056bbe67c7ea22627b044b02bf19ed3426421d9..37796fe45bd00a0a31fa9bc4a3a6a12decbe1606 100644 (file)
@@ -1,3 +1,19 @@
+Release Date   : Thu Nov 16 15:32:35 EST 2006 -
+                               Sumant Patro <sumant.patro@lsi.com>
+Current Version : 2.20.5.1 (scsi module), 2.20.2.6 (cmm module)
+Older Version  : 2.20.4.9 (scsi module), 2.20.2.6 (cmm module)
+
+1.     Changes in Initialization to fix kdump failure.
+       Send SYNC command on loading.
+       This command clears the pending commands in the adapter
+       and re-initialize its internal RAID structure.
+       Without this change, megaraid driver either panics or fails to
+       initialize the adapter during kdump's second kernel boot
+       if there are pending commands or interrupts from other devices
+       sharing the same IRQ.
+2.     Authors email-id domain name changed from lsil.com to lsi.com.
+       Also modified the MODULE_AUTHOR to megaraidlinux@lsi.com
+
 Release Date   : Fri May 19 09:31:45 EST 2006 - Seokmann Ju <sju@lsil.com>
 Current Version : 2.20.4.9 (scsi module), 2.20.2.6 (cmm module)
 Older Version  : 2.20.4.8 (scsi module), 2.20.2.6 (cmm module)
diff --git a/Documentation/sony-laptop.txt b/Documentation/sony-laptop.txt
new file mode 100644 (file)
index 0000000..dfd26df
--- /dev/null
@@ -0,0 +1,106 @@
+Sony Notebook Control Driver (SNC) Readme
+-----------------------------------------
+       Copyright (C) 2004- 2005 Stelian Pop <stelian@popies.net>
+       Copyright (C) 2007 Mattia Dongili <malattia@linux.it>
+
+This mini-driver drives the SNC device present in the ACPI BIOS of
+the Sony Vaio laptops.
+
+It gives access to some extra laptop functionalities. In its current
+form, this driver let the user set or query the screen brightness
+through the backlight subsystem and remove/apply power to some devices.
+
+Backlight control:
+------------------
+If your laptop model supports it, you will find sysfs files in the
+/sys/class/backlight/sony/
+directory. You will be able to query and set the current screen
+brightness:
+       brightness              get/set screen brightness (an iteger
+                               between 0 and 7)
+       actual_brightness       reading from this file will query the HW
+                               to get real brightness value
+       max_brightness          the maximum brightness value
+
+
+Platform specific:
+------------------
+Loading the sony-laptop module will create a
+/sys/devices/platform/sony-laptop/
+directory populated with some files.
+
+You then read/write integer values from/to those files by using
+standard UNIX tools.
+
+The files are:
+       brightness_default      screen brightness which will be set
+                               when the laptop will be rebooted
+       cdpower                 power on/off the internal CD drive
+       audiopower              power on/off the internal sound card
+       lanpower                power on/off the internal ethernet card
+                               (only in debug mode)
+
+Note that some files may be missing if they are not supported
+by your particular laptop model.
+
+Example usage:
+       # echo "1" > /sys/devices/platform/sony-laptop/brightness_default
+sets the lowest screen brightness for the next and later reboots,
+       # echo "8" > /sys/devices/platform/sony-laptop/brightness_default
+sets the highest screen brightness for the next and later reboots,
+       # cat /sys/devices/platform/sony-laptop/brightness_default
+retrieves the value.
+
+       # echo "0" > /sys/devices/platform/sony-laptop/audiopower
+powers off the sound card,
+       # echo "1" > /sys/devices/platform/sony-laptop/audiopower
+powers on the sound card.
+
+Development:
+------------
+
+If you want to help with the development of this driver (and
+you are not afraid of any side effects doing strange things with
+your ACPI BIOS could have on your laptop), load the driver and
+pass the option 'debug=1'.
+
+REPEAT: DON'T DO THIS IF YOU DON'T LIKE RISKY BUSINESS.
+
+In your kernel logs you will find the list of all ACPI methods
+the SNC device has on your laptop. You can see the GCDP/GCDP methods
+used to pwer on/off the CD drive, but there are others.
+
+I HAVE NO IDEA WHAT THOSE METHODS DO.
+
+The sony-laptop driver creates, for some of those methods (the most
+current ones found on several Vaio models), an entry under
+/sys/devices/platform/sony-laptop, just like the 'cdpower' one.
+You can create other entries corresponding to your own laptop methods by
+further editing the source (see the 'sony_acpi_values' table, and add a new
+entry to this table with your get/set method names using the
+HANDLE_NAMES macro).
+
+Your mission, should you accept it, is to try finding out what
+those entries are for, by reading/writing random values from/to those
+files and find out what is the impact on your laptop.
+
+Should you find anything interesting, please report it back to me,
+I will not disavow all knowledge of your actions :)
+
+Bugs/Limitations:
+-----------------
+
+* This driver is not based on official documentation from Sony
+  (because there is none), so there is no guarantee this driver
+  will work at all, or do the right thing. Although this hasn't
+  happened to me, this driver could do very bad things to your
+  laptop, including permanent damage.
+
+* The sony-laptop and sonypi drivers do not interact at all. In the
+  future, sonypi could use sony-laptop to do (part of) its business.
+
+* spicctrl, which is the userspace tool used to communicate with the
+  sonypi driver (through /dev/sonypi) does not try to use the
+  sony-laptop driver. In the future, spicctrl could try sonypi first,
+  and if it isn't present, try sony-laptop instead.
+
index 72795796b13d64a4667ab233ebded8c2bcad4297..ecc7c9eb9f2938ee00b38aa30863050c3ac01c0d 100644 (file)
@@ -284,7 +284,6 @@ SPI protocol drivers somewhat resemble platform device drivers:
        static struct spi_driver CHIP_driver = {
                .driver = {
                        .name           = "CHIP",
-                       .bus            = &spi_bus_type,
                        .owner          = THIS_MODULE,
                },
 
@@ -312,7 +311,7 @@ might look like this unless you're creating a class_device:
                chip = kzalloc(sizeof *chip, GFP_KERNEL);
                if (!chip)
                        return -ENOMEM;
-               dev_set_drvdata(&spi->dev, chip);
+               spi_set_drvdata(spi, chip);
 
                ... etc
                return 0;
index 61613166981b9139a5961fe0c3344cbd03286688..452c0f1523044883b785fc5d35699b270fa7493a 100644 (file)
@@ -64,11 +64,6 @@ On all -  write a character to /proc/sysrq-trigger.  e.g.:
 
 *  What are the 'command' keys?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-'r'     - Turns off keyboard raw mode and sets it to XLATE.
-
-'k'     - Secure Access Key (SAK) Kills all programs on the current virtual
-          console. NOTE: See important comments below in SAK section.
-
 'b'     - Will immediately reboot the system without syncing or unmounting
           your disks.
 
@@ -76,21 +71,37 @@ On all -  write a character to /proc/sysrq-trigger.  e.g.:
 
 'd'    - Shows all locks that are held.
 
-'o'     - Will shut your system off (if configured and supported).
+'e'     - Send a SIGTERM to all processes, except for init.
 
-'s'     - Will attempt to sync all mounted filesystems.
+'f'    - Will call oom_kill to kill a memory hog process.
 
-'u'     - Will attempt to remount all mounted filesystems read-only.
+'g'    - Used by kgdb on ppc platforms.
 
-'p'     - Will dump the current registers and flags to your console.
+'h'     - Will display help (actually any other key than those listed
+          above will display help. but 'h' is easy to remember :-)
 
-'t'     - Will dump a list of current tasks and their information to your
-          console.
+'i'     - Send a SIGKILL to all processes, except for init.
+
+'k'     - Secure Access Key (SAK) Kills all programs on the current virtual
+          console. NOTE: See important comments below in SAK section.
 
 'm'     - Will dump current memory info to your console.
 
 'n'    - Used to make RT tasks nice-able
 
+'o'     - Will shut your system off (if configured and supported).
+
+'p'     - Will dump the current registers and flags to your console.
+
+'r'     - Turns off keyboard raw mode and sets it to XLATE.
+
+'s'     - Will attempt to sync all mounted filesystems.
+
+'t'     - Will dump a list of current tasks and their information to your
+          console.
+
+'u'     - Will attempt to remount all mounted filesystems read-only.
+
 'v'    - Dumps Voyager SMP processor info to your console.
 
 'w'    - Dumps tasks that are in uninterruptable (blocked) state.
@@ -102,17 +113,6 @@ On all -  write a character to /proc/sysrq-trigger.  e.g.:
           it so that only emergency messages like PANICs or OOPSes would
           make it to your console.)
 
-'f'    - Will call oom_kill to kill a memory hog process.
-
-'e'     - Send a SIGTERM to all processes, except for init.
-
-'g'    - Used by kgdb on ppc platforms.
-
-'i'     - Send a SIGKILL to all processes, except for init.
-
-'h'     - Will display help (actually any other key than those listed
-          above will display help. but 'h' is easy to remember :-)
-
 *  Okay, so what can I use them for?
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Well, un'R'aw is very handy when your X server or a svgalib program crashes.
index 5c86ed6f0448a8e2378a4ba62d6cedecf236215c..625a21db0c2a7e8f1825bf1cacc18b7131a37a82 100644 (file)
@@ -180,40 +180,81 @@ PCI
   pci=lastbus=NUMBER          Scan upto NUMBER busses, no matter what the mptable says.
   pci=noacpi           Don't use ACPI to set up PCI interrupt routing.
 
-IOMMU
-
- iommu=[size][,noagp][,off][,force][,noforce][,leak][,memaper[=order]][,merge]
-         [,forcesac][,fullflush][,nomerge][,noaperture][,calgary]
-   size  set size of iommu (in bytes)
-   noagp don't initialize the AGP driver and use full aperture.
-   off   don't use the IOMMU
-   leak  turn on simple iommu leak tracing (only when CONFIG_IOMMU_LEAK is on)
-   memaper[=order] allocate an own aperture over RAM with size 32MB^order.
-   noforce don't force IOMMU usage. Default.
-   force  Force IOMMU.
-   merge  Do SG merging. Implies force (experimental)
-   nomerge Don't do SG merging.
-   forcesac For SAC mode for masks <40bits  (experimental)
-   fullflush Flush IOMMU on each allocation (default)
-   nofullflush Don't use IOMMU fullflush
-   allowed  overwrite iommu off workarounds for specific chipsets.
-   soft         Use software bounce buffering (default for Intel machines)
-   noaperture Don't touch the aperture for AGP.
-   allowdac Allow DMA >4GB
-           When off all DMA over >4GB is forced through an IOMMU or bounce
-           buffering.
-   nodac    Forbid DMA >4GB
-   panic    Always panic when IOMMU overflows
-   calgary  Use the Calgary IOMMU if it is available
-
-  swiotlb=pages[,force]
-
-  pages  Prereserve that many 128K pages for the software IO bounce buffering.
-  force  Force all IO through the software TLB.
-
-  calgary=[64k,128k,256k,512k,1M,2M,4M,8M]
-  calgary=[translate_empty_slots]
-  calgary=[disable=<PCI bus number>]
+IOMMU (input/output memory management unit)
+
+ Currently four x86-64 PCI-DMA mapping implementations exist:
+
+   1. <arch/x86_64/kernel/pci-nommu.c>: use no hardware/software IOMMU at all
+      (e.g. because you have < 3 GB memory).
+      Kernel boot message: "PCI-DMA: Disabling IOMMU"
+
+   2. <arch/x86_64/kernel/pci-gart.c>: AMD GART based hardware IOMMU.
+      Kernel boot message: "PCI-DMA: using GART IOMMU"
+
+   3. <arch/x86_64/kernel/pci-swiotlb.c> : Software IOMMU implementation. Used
+      e.g. if there is no hardware IOMMU in the system and it is need because
+      you have >3GB memory or told the kernel to us it (iommu=soft))
+      Kernel boot message: "PCI-DMA: Using software bounce buffering
+      for IO (SWIOTLB)"
+
+   4. <arch/x86_64/pci-calgary.c> : IBM Calgary hardware IOMMU. Used in IBM
+      pSeries and xSeries servers. This hardware IOMMU supports DMA address
+      mapping with memory protection, etc.
+      Kernel boot message: "PCI-DMA: Using Calgary IOMMU"
+
+ iommu=[<size>][,noagp][,off][,force][,noforce][,leak[=<nr_of_leak_pages>]
+       [,memaper[=<order>]][,merge][,forcesac][,fullflush][,nomerge]
+       [,noaperture][,calgary]
+
+  General iommu options:
+    off                Don't initialize and use any kind of IOMMU.
+    noforce            Don't force hardware IOMMU usage when it is not needed.
+                       (default).
+    force              Force the use of the hardware IOMMU even when it is
+                       not actually needed (e.g. because < 3 GB memory).
+    soft               Use software bounce buffering (SWIOTLB) (default for
+                       Intel machines). This can be used to prevent the usage
+                       of an available hardware IOMMU.
+
+  iommu options only relevant to the AMD GART hardware IOMMU:
+    <size>             Set the size of the remapping area in bytes.
+    allowed            Overwrite iommu off workarounds for specific chipsets.
+    fullflush          Flush IOMMU on each allocation (default).
+    nofullflush        Don't use IOMMU fullflush.
+    leak               Turn on simple iommu leak tracing (only when
+                       CONFIG_IOMMU_LEAK is on). Default number of leak pages
+                       is 20.
+    memaper[=<order>]  Allocate an own aperture over RAM with size 32MB<<order.
+                       (default: order=1, i.e. 64MB)
+    merge              Do scatter-gather (SG) merging. Implies "force"
+                       (experimental).
+    nomerge            Don't do scatter-gather (SG) merging.
+    noaperture         Ask the IOMMU not to touch the aperture for AGP.
+    forcesac           Force single-address cycle (SAC) mode for masks <40bits
+                       (experimental).
+    noagp              Don't initialize the AGP driver and use full aperture.
+    allowdac           Allow double-address cycle (DAC) mode, i.e. DMA >4GB.
+                       DAC is used with 32-bit PCI to push a 64-bit address in
+                       two cycles. When off all DMA over >4GB is forced through
+                       an IOMMU or software bounce buffering.
+    nodac              Forbid DAC mode, i.e. DMA >4GB.
+    panic              Always panic when IOMMU overflows.
+    calgary            Use the Calgary IOMMU if it is available
+
+  iommu options only relevant to the software bounce buffering (SWIOTLB) IOMMU
+  implementation:
+    swiotlb=<pages>[,force]
+    <pages>            Prereserve that many 128K pages for the software IO
+                       bounce buffering.
+    force              Force all IO through the software TLB.
+
+  Settings for the IBM Calgary hardware IOMMU currently found in IBM
+  pSeries and xSeries machines:
+
+    calgary=[64k,128k,256k,512k,1M,2M,4M,8M]
+    calgary=[translate_empty_slots]
+    calgary=[disable=<PCI bus number>]
+    panic              Always panic when IOMMU overflows
 
     64k,...,8M - Set the size of each PCI slot's translation table
     when using the Calgary IOMMU. This is the size of the translation
@@ -234,14 +275,14 @@ IOMMU
 
 Debugging
 
-  oops=panic Always panic on oopses. Default is to just kill the process,
-            but there is a small probability of deadlocking the machine.
-            This will also cause panics on machine check exceptions.
-            Useful together with panic=30 to trigger a reboot.
+  oops=panic   Always panic on oopses. Default is to just kill the process,
+               but there is a small probability of deadlocking the machine.
+               This will also cause panics on machine check exceptions.
+               Useful together with panic=30 to trigger a reboot.
 
-  kstack=N   Print that many words from the kernel stack in oops dumps.
+  kstack=N     Print N words from the kernel stack in oops dumps.
 
-  pagefaulttrace Dump all page faults. Only useful for extreme debugging
+  pagefaulttrace  Dump all page faults. Only useful for extreme debugging
                and will create a lot of output.
 
   call_trace=[old|both|newfallback|new]
@@ -251,15 +292,8 @@ Debugging
                newfallback: use new unwinder but fall back to old if it gets
                        stuck (default)
 
-  call_trace=[old|both|newfallback|new]
-               old: use old inexact backtracer
-               new: use new exact dwarf2 unwinder
-               both: print entries from both
-               newfallback: use new unwinder but fall back to old if it gets
-                       stuck (default)
-
-Misc
+Miscellaneous
 
   noreplacement  Don't replace instructions with more appropriate ones
                 for the CPU. This may be useful on asymmetric MP systems
-                where some CPU have less capabilities than the others.
+                where some CPUs have less capabilities than others.
index 5c0fa345e556113e77506286f243c6e34f01d815..3c23e0587db33421e8a09fded674114b0c8a90ac 100644 (file)
@@ -2,7 +2,7 @@ Firmware support for CPU hotplug under Linux/x86-64
 ---------------------------------------------------
 
 Linux/x86-64 supports CPU hotplug now. For various reasons Linux wants to
-know in advance boot time the maximum number of CPUs that could be plugged
+know in advance of boot time the maximum number of CPUs that could be plugged
 into the system. ACPI 3.0 currently has no official way to supply
 this information from the firmware to the operating system.
 
index bddfddd466ab6355440c5d6710b2f753c4d8f7c1..5ad65d51fb95a64e1fbc646bb416c06e30a77541 100644 (file)
@@ -9,9 +9,9 @@ zombie. While the thread is in user space the kernel stack is empty
 except for the thread_info structure at the bottom.
 
 In addition to the per thread stacks, there are specialized stacks
-associated with each cpu.  These stacks are only used while the kernel
-is in control on that cpu, when a cpu returns to user space the
-specialized stacks contain no useful data.  The main cpu stacks is
+associated with each CPU.  These stacks are only used while the kernel
+is in control on that CPU; when a CPU returns to user space the
+specialized stacks contain no useful data.  The main CPU stacks are:
 
 * Interrupt stack.  IRQSTACKSIZE
 
@@ -32,17 +32,17 @@ x86_64 also has a feature which is not available on i386, the ability
 to automatically switch to a new stack for designated events such as
 double fault or NMI, which makes it easier to handle these unusual
 events on x86_64.  This feature is called the Interrupt Stack Table
-(IST).  There can be up to 7 IST entries per cpu. The IST code is an
-index into the Task State Segment (TSS), the IST entries in the TSS
-point to dedicated stacks, each stack can be a different size.
+(IST).  There can be up to 7 IST entries per CPU. The IST code is an
+index into the Task State Segment (TSS). The IST entries in the TSS
+point to dedicated stacks; each stack can be a different size.
 
-An IST is selected by an non-zero value in the IST field of an
+An IST is selected by a non-zero value in the IST field of an
 interrupt-gate descriptor.  When an interrupt occurs and the hardware
 loads such a descriptor, the hardware automatically sets the new stack
 pointer based on the IST value, then invokes the interrupt handler.  If
 software wants to allow nested IST interrupts then the handler must
 adjust the IST values on entry to and exit from the interrupt handler.
-(this is occasionally done, e.g. for debug exceptions)
+(This is occasionally done, e.g. for debug exceptions.)
 
 Events with different IST codes (i.e. with different stacks) can be
 nested.  For example, a debug interrupt can safely be interrupted by an
@@ -58,17 +58,17 @@ The currently assigned IST stacks are :-
 
   Used for interrupt 12 - Stack Fault Exception (#SS).
 
-  This allows to recover from invalid stack segments. Rarely
+  This allows the CPU to recover from invalid stack segments. Rarely
   happens.
 
 * DOUBLEFAULT_STACK.  EXCEPTION_STKSZ (PAGE_SIZE).
 
   Used for interrupt 8 - Double Fault Exception (#DF).
 
-  Invoked when handling a exception causes another exception. Happens
-  when the kernel is very confused (e.g. kernel stack pointer corrupt)
-  Using a separate stack allows to recover from it well enough in many
-  cases to still output an oops.
+  Invoked when handling one exception causes another exception. Happens
+  when the kernel is very confused (e.g. kernel stack pointer corrupt).
+  Using a separate stack allows the kernel to recover from it well enough
+  in many cases to still output an oops.
 
 * NMI_STACK.  EXCEPTION_STKSZ (PAGE_SIZE).
 
diff --git a/Documentation/x86_64/machinecheck b/Documentation/x86_64/machinecheck
new file mode 100644 (file)
index 0000000..068a6d9
--- /dev/null
@@ -0,0 +1,70 @@
+
+Configurable sysfs parameters for the x86-64 machine check code.
+
+Machine checks report internal hardware error conditions detected
+by the CPU. Uncorrected errors typically cause a machine check
+(often with panic), corrected ones cause a machine check log entry.
+
+Machine checks are organized in banks (normally associated with
+a hardware subsystem) and subevents in a bank. The exact meaning
+of the banks and subevent is CPU specific.
+
+mcelog knows how to decode them.
+
+When you see the "Machine check errors logged" message in the system
+log then mcelog should run to collect and decode machine check entries
+from /dev/mcelog. Normally mcelog should be run regularly from a cronjob.
+
+Each CPU has a directory in /sys/devices/system/machinecheck/machinecheckN
+(N = CPU number)
+
+The directory contains some configurable entries:
+
+Entries:
+
+bankNctl
+(N bank number)
+       64bit Hex bitmask enabling/disabling specific subevents for bank N
+       When a bit in the bitmask is zero then the respective
+       subevent will not be reported.
+       By default all events are enabled.
+       Note that BIOS maintain another mask to disable specific events
+       per bank.  This is not visible here
+
+The following entries appear for each CPU, but they are truly shared
+between all CPUs.
+
+check_interval
+       How often to poll for corrected machine check errors, in seconds
+       (Note output is hexademical). Default 5 minutes.
+
+tolerant
+       Tolerance level. When a machine check exception occurs for a non
+       corrected machine check the kernel can take different actions.
+       Since machine check exceptions can happen any time it is sometimes
+       risky for the kernel to kill a process because it defies
+       normal kernel locking rules. The tolerance level configures
+       how hard the kernel tries to recover even at some risk of deadlock.
+
+       0: always panic,
+       1: panic if deadlock possible,
+       2: try to avoid panic,
+       3: never panic or exit (for testing only)
+
+       Default: 1
+
+       Note this only makes a difference if the CPU allows recovery
+       from a machine check exception. Current x86 CPUs generally do not.
+
+trigger
+       Program to run when a machine check event is detected.
+       This is an alternative to running mcelog regularly from cron
+       and allows to detect events faster.
+
+TBD document entries for AMD threshold interrupt configuration
+
+For more details about the x86 machine check architecture
+see the Intel and AMD architecture manuals from their developer websites.
+
+For more details about the architecture see
+see http://one.firstfloor.org/~andi/mce.pdf
index 133561b9cb0c32f03f840af433bdd4976f68a3c0..f42798ed1c54c326be5021877757fef5e841f3f8 100644 (file)
@@ -3,26 +3,26 @@
 
 Virtual memory map with 4 level page tables:
 
-0000000000000000 - 00007fffffffffff (=47bits) user space, different per mm
+0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm
 hole caused by [48:63] sign extension
-ffff800000000000 - ffff80ffffffffff (=40bits) guard hole
-ffff810000000000 - ffffc0ffffffffff (=46bits) direct mapping of all phys. memory
-ffffc10000000000 - ffffc1ffffffffff (=40bits) hole
-ffffc20000000000 - ffffe1ffffffffff (=45bits) vmalloc/ioremap space
+ffff800000000000 - ffff80ffffffffff (=40 bits) guard hole
+ffff810000000000 - ffffc0ffffffffff (=46 bits) direct mapping of all phys. memory
+ffffc10000000000 - ffffc1ffffffffff (=40 bits) hole
+ffffc20000000000 - ffffe1ffffffffff (=45 bits) vmalloc/ioremap space
 ... unused hole ...
-ffffffff80000000 - ffffffff82800000 (=40MB)   kernel text mapping, from phys 0
+ffffffff80000000 - ffffffff82800000 (=40 MB)   kernel text mapping, from phys 0
 ... unused hole ...
-ffffffff88000000 - fffffffffff00000 (=1919MB) module mapping space
+ffffffff88000000 - fffffffffff00000 (=1919 MB) module mapping space
 
-The direct mapping covers all memory in the system upto the highest
+The direct mapping covers all memory in the system up to the highest
 memory address (this means in some cases it can also include PCI memory
-holes)
+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.
 
-Current X86-64 implementations only support 40 bit of address space,
-but we support upto 46bits. This expands into MBZ space in the page tables.
+Current X86-64 implementations only support 40 bits of address space,
+but we support up to 46 bits. This expands into MBZ space in the page tables.
 
 -Andi Kleen, Jul 2004
index a6c1ebd18d0f801e685e5625ca052aa98eea7d88..a384551a597810724237d097cc622a9f3a14ecb7 100644 (file)
@@ -247,6 +247,13 @@ L: linux-acpi@vger.kernel.org
 W:     http://acpi.sourceforge.net/
 S:     Supported
 
+ACPI VIDEO DRIVER
+P:     Luming Yu
+M:     luming.yu@intel.com
+L:     linux-acpi@vger.kernel.org
+W:     http://acpi.sourceforge.net/
+S:     Supported
+
 AD1816 SOUND DRIVER
 P:     Thorsten Knabe
 M:     Thorsten Knabe <linux@thorsten-knabe.de>
@@ -620,6 +627,11 @@ P: Haavard Skinnemoen
 M:     hskinnemoen@atmel.com
 S:     Supported
 
+ATMEL SPI DRIVER
+P:     Haavard Skinnemoen
+M:     hskinnemoen@atmel.com
+S:     Supported
+
 ATMEL WIRELESS DRIVER
 P:     Simon Kelley
 M:     simon@thekelleys.org.uk
@@ -635,6 +647,12 @@ W: http://people.redhat.com/sgrubb/audit/
 T:     git kernel.org:/pub/scm/linux/kernel/git/dwmw2/audit-2.6.git
 S:     Maintained
 
+AUXILIARY DISPLAY DRIVERS
+P:     Miguel Ojeda Sandonis
+M:     maxextreme@gmail.com
+L:     linux-kernel@vger.kernel.org
+S:     Maintained
+
 AVR32 ARCHITECTURE
 P:     Haavard Skinnemoen
 M:     hskinnemoen@atmel.com
@@ -836,6 +854,18 @@ L: linux-kernel@vger.kernel.org
 L:     discuss@x86-64.org
 S:     Maintained
 
+CFAG12864B LCD DRIVER
+P:     Miguel Ojeda Sandonis
+M:     maxextreme@gmail.com
+L:     linux-kernel@vger.kernel.org
+S:     Maintained
+
+CFAG12864BFB LCD FRAMEBUFFER DRIVER
+P:     Miguel Ojeda Sandonis
+M:     maxextreme@gmail.com
+L:     linux-kernel@vger.kernel.org
+S:     Maintained
+
 COMMON INTERNET FILE SYSTEM (CIFS)
 P:     Steve French
 M:     sfrench@samba.org
@@ -984,14 +1014,12 @@ L:       cycsyn-devel@bazar.conectiva.com.br
 S:     Maintained
 
 CYCLADES ASYNC MUX DRIVER
-M:     async@cyclades.com
 W:     http://www.cyclades.com/
-S:     Supported
+S:     Orphan
 
 CYCLADES PC300 DRIVER
-M:     pc300@cyclades.com
 W:     http://www.cyclades.com/
-S:     Supported
+S:     Orphan
 
 DAMA SLAVE for AX.25
 P:     Joerg Reuter
@@ -1971,6 +1999,12 @@ M:       davem@davemloft.net
 L:     linux-kernel@vger.kernel.org
 S:     Maintained
 
+KS0108 LCD CONTROLLER DRIVER
+P:     Miguel Ojeda Sandonis
+M:     maxextreme@gmail.com
+L:     linux-kernel@vger.kernel.org
+S:     Maintained
+
 LAPB module
 L:     linux-x25@vger.kernel.org
 S:     Orphan
@@ -2501,6 +2535,12 @@ M:       olof@lixom.net
 L:     netdev@vger.kernel.org
 S:     Maintained
 
+PA SEMI SMBUS DRIVER
+P:     Olof Johansson
+M:     olof@lixom.net
+L:     i2c@lm-sensors.org
+S:     Maintained
+
 PARALLEL PORT SUPPORT
 P:     Phil Blundell
 M:     philb@gnu.org
@@ -3028,6 +3068,8 @@ S:        Maintained
 SONY VAIO CONTROL DEVICE DRIVER
 P:     Stelian Pop
 M:     stelian@popies.net
+P:     Mattia Dongili
+M:     malattia@linux.it
 W:     http://popies.net/sonypi/
 S:     Maintained
 
@@ -3746,6 +3788,7 @@ P:        Andi Kleen
 M:     ak@suse.de
 L:     discuss@x86-64.org
 W:     http://www.x86-64.org
+T:     quilt ftp://ftp.firstfloor.org/pub/ak/x86_64/quilt-current
 S:     Maintained
 
 YAM DRIVER FOR AX.25
index cdeda68cf2aa9082571366837a504fe80ef6c40e..b6c8790925bfe1f4c51442e06941f34207b0cc02 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -789,7 +789,7 @@ $(vmlinux-dirs): prepare scripts
 
 pattern = ".*/localversion[^~]*"
 string  = $(shell cat /dev/null \
-          `find $(objtree) $(srctree) -maxdepth 1 -regex $(pattern) | sort`)
+          `find $(objtree) $(srctree) -maxdepth 1 -regex $(pattern) | sort -u`)
 
 localver = $(subst $(space),, $(string) \
                              $(patsubst "%",%,$(CONFIG_LOCALVERSION)))
@@ -825,9 +825,6 @@ include/config/kernel.release: include/config/auto.conf FORCE
 # Listed in dependency order
 PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3
 
-# prepare-all is deprecated, use prepare as valid replacement
-PHONY += prepare-all
-
 # prepare3 is used to check if we are building in a separate output directory,
 # and if so do:
 # 1) Check that make has not been executed in the kernel src $(srctree)
@@ -860,7 +857,7 @@ prepare0: archprepare FORCE
        $(Q)$(MAKE) $(build)=.
 
 # All the preparing..
-prepare prepare-all: prepare0
+prepare: prepare0
 
 # Leave this as default for preprocessing vmlinux.lds.S, which is now
 # done in arch/$(ARCH)/kernel/Makefile
@@ -931,6 +928,12 @@ headers_install: include/linux/version.h scripts_basic FORCE
        $(Q)$(MAKE) $(build)=scripts scripts/unifdef
        $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.headersinst obj=include
 
+PHONY += headers_check_all
+headers_check_all: headers_install_all
+       $(Q)for arch in $(HDRARCHES); do \
+        $(MAKE) ARCH=$$arch -f $(srctree)/scripts/Makefile.headersinst obj=include BIASMDIR=-bi-$$arch HDRCHECK=1 ;\
+        done
+
 PHONY += headers_check
 headers_check: headers_install
        $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.headersinst obj=include HDRCHECK=1
index 84caf50725b53e829df2a39baa059084d63663e4..770f717bd250c2c0965b6477e2b6b205b8f37dbe 100644 (file)
@@ -41,6 +41,10 @@ config GENERIC_CALIBRATE_DELAY
        bool
        default y
 
+config ZONE_DMA
+       bool
+       default y
+
 config GENERIC_ISA_DMA
        bool
        default y
index 1aea7c7c683cddb0d5b7e065f1e08f720d70a8e0..d352c2b05f1a245503e5af698b4d8ef6a7858aeb 100644 (file)
@@ -122,7 +122,7 @@ static void get_sysnames(unsigned long, unsigned long, unsigned long,
                         char **, char **);
 static void determine_cpu_caches (unsigned int);
 
-static char command_line[COMMAND_LINE_SIZE];
+static char __initdata command_line[COMMAND_LINE_SIZE];
 
 /*
  * The format of "screen_info" is strange, and due to early
@@ -547,7 +547,7 @@ setup_arch(char **cmdline_p)
        } else {
                strlcpy(command_line, COMMAND_LINE, sizeof command_line);
        }
-       strcpy(saved_command_line, command_line);
+       strcpy(boot_command_line, command_line);
        *cmdline_p = command_line;
 
        /* 
@@ -589,7 +589,7 @@ setup_arch(char **cmdline_p)
        }
 
        /* Replace the command line, now that we've killed it with strsep.  */
-       strcpy(command_line, saved_command_line);
+       strcpy(command_line, boot_command_line);
 
        /* If we want SRM console printk echoing early, do it now. */
        if (alpha_using_srm && srmcons_output) {
index d7053eb4ffcfd93623d58aabda82d30cf9118dee..4748e14a28bca3b9edd05b73d0787b60367cee7d 100644 (file)
@@ -90,17 +90,6 @@ static inline __u32 rpcc(void)
     return result;
 }
 
-/*
- * Scheduler clock - returns current time in nanosec units.
- *
- * Copied from ARM code for expediency... ;-}
- */
-unsigned long long sched_clock(void)
-{
-        return (unsigned long long)jiffies * (1000000000 / HZ);
-}
-
-
 /*
  * timer_interrupt() needs to keep up the real-time clock,
  * as well as call the "do_timer()" routine every clocktick
index 76bf071e376c9915b31fe96fc30dbb3090672a34..4cc44bd33d3345502339ebe62e45790841eddff0 100644 (file)
@@ -52,10 +52,12 @@ SECTIONS
   }
   __initcall_end = .;
 
+#ifdef CONFIG_BLK_DEV_INITRD
   . = ALIGN(8192);
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
   __initramfs_end = .;
+#endif
 
   . = ALIGN(8);
   .con_initcall.init : {
index 1523046e092bd6b24488354617293037ca47e0a6..5c795193ebbad56bcde85161ffaab4fde02e2e90 100644 (file)
@@ -29,6 +29,10 @@ config MMU
        bool
        default y
 
+config NO_IOPORT
+       bool
+       default n
+
 config EISA
        bool
        ---help---
@@ -100,6 +104,10 @@ config GENERIC_BUST_SPINLOCK
 config ARCH_MAY_HAVE_PC_FDC
        bool
 
+config ZONE_DMA
+       bool
+       default y
+
 config GENERIC_ISA_DMA
        bool
 
@@ -294,6 +302,7 @@ config ARCH_RPC
        select TIMER_ACORN
        select ARCH_MAY_HAVE_PC_FDC
        select ISA_DMA_API
+       select NO_IOPORT
        help
          On the Acorn Risc-PC, Linux can support the internal IDE disk and
          CD-ROM interface, serial and parallel port, and the floppy drive.
index 4e5445cfb0ea696eff688baf7ecd364f9697fc80..bf1075e1f571d32794e92fd01aa18c2594a53971 100644 (file)
@@ -329,7 +329,7 @@ static int rtc_fasync(int fd, struct file *file, int on)
        return fasync_helper(fd, file, on, &rtc_async_queue);
 }
 
-static struct file_operations rtc_fops = {
+static const struct file_operations rtc_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .read           = rtc_read,
index ec01f08f5642bef24e4e84ab6339042afabdb60d..e101846ab7dd960f485f4fd8a97d23dd8b81b960 100644 (file)
@@ -159,8 +159,7 @@ void __init init_IRQ(void)
        int irq;
 
        for (irq = 0; irq < NR_IRQS; irq++)
-               irq_desc[irq].status |= IRQ_NOREQUEST | IRQ_DELAYED_DISABLE |
-                       IRQ_NOPROBE;
+               irq_desc[irq].status |= IRQ_NOREQUEST | IRQ_NOPROBE;
 
 #ifdef CONFIG_SMP
        bad_irq_desc.affinity = CPU_MASK_ALL;
index 54bbd9fe255cab1a6acba22a2bef1bd2d4fbe3f8..50a30bc91872652c5d8f68ad2d013ce9afed7503 100644 (file)
@@ -70,5 +70,5 @@ register_isa_ports(unsigned int membase, unsigned int portbase, unsigned int por
        isa_membase = membase;
        isa_portbase = portbase;
        isa_portshift = portshift;
-       isa_sysctl_header = register_sysctl_table(ctl_bus, 0);
+       isa_sysctl_header = register_sysctl_table(ctl_bus);
 }
index bbab134cd82d3fa547d72d5d2514591da9f52d92..ed522151878bdc5996def09b367892f95e8e4881 100644 (file)
@@ -106,7 +106,7 @@ unsigned long phys_initrd_size __initdata = 0;
 static struct meminfo meminfo __initdata = { 0, };
 static const char *cpu_name;
 static const char *machine_name;
-static char command_line[COMMAND_LINE_SIZE];
+static char __initdata command_line[COMMAND_LINE_SIZE];
 
 static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;
 static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } };
@@ -803,8 +803,8 @@ void __init setup_arch(char **cmdline_p)
        init_mm.end_data   = (unsigned long) &_edata;
        init_mm.brk        = (unsigned long) &_end;
 
-       memcpy(saved_command_line, from, COMMAND_LINE_SIZE);
-       saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
+       memcpy(boot_command_line, from, COMMAND_LINE_SIZE);
+       boot_command_line[COMMAND_LINE_SIZE-1] = '\0';
        parse_cmdline(cmdline_p, from);
        paging_init(&meminfo, mdesc);
        request_standard_resources(&meminfo, mdesc);
index 3c8cdcfe8d4a9f72c9ffb3762a72b260be85d73c..ee47c532e2108b0879bef642c3a5ee174891b581 100644 (file)
@@ -77,16 +77,6 @@ static unsigned long dummy_gettimeoffset(void)
 }
 #endif
 
-/*
- * Scheduler clock - returns current time in nanosec units.
- * This is the default implementation.  Sub-architecture
- * implementations can override this.
- */
-unsigned long long __attribute__((weak)) sched_clock(void)
-{
-       return (unsigned long long)jiffies * (1000000000 / HZ);
-}
-
 /*
  * An implementation of printk_clock() independent from
  * sched_clock().  This avoids non-bootable kernels when
index a8fa75ea07a991a3211da58766cb33dfbca235a9..b929a60f7547cdde716dca1c18b06aafd92f8a22 100644 (file)
@@ -53,10 +53,12 @@ SECTIONS
                __security_initcall_start = .;
                        *(.security_initcall.init)
                __security_initcall_end = .;
+#ifdef CONFIG_BLK_DEV_INITRD
                . = ALIGN(32);
                __initramfs_start = .;
                        usr/built-in.o(.init.ramfs)
                __initramfs_end = .;
+#endif
                . = ALIGN(64);
                __per_cpu_start = .;
                        *(.data.percpu)
index 4dee21fefe5a61647552f0a7e5b91ea0aadf6631..36a8e4d1cc6ddd3813786cfec9ff4494627ac5db 100644 (file)
@@ -407,7 +407,7 @@ static int at91_clk_open(struct inode *inode, struct file *file)
        return single_open(file, at91_clk_show, NULL);
 }
 
-static struct file_operations at91_clk_operations = {
+static const struct file_operations at91_clk_operations = {
        .open           = at91_clk_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index af22659c8a2895a4c90b66a2f8203790e6e509f4..15eb5b6b29f2ed94ad36c7243d38d9832e2c9028 100644 (file)
@@ -64,6 +64,24 @@ static inline unsigned pin_to_mask(unsigned pin)
  */
 
 
+/*
+ * mux the pin to the "GPIO" peripheral role.
+ */
+int __init_or_module at91_set_GPIO_periph(unsigned pin, int use_pullup)
+{
+       void __iomem    *pio = pin_to_controller(pin);
+       unsigned        mask = pin_to_mask(pin);
+
+       if (!pio)
+               return -EINVAL;
+       __raw_writel(mask, pio + PIO_IDR);
+       __raw_writel(mask, pio + (use_pullup ? PIO_PUER : PIO_PUDR));
+       __raw_writel(mask, pio + PIO_PER);
+       return 0;
+}
+EXPORT_SYMBOL(at91_set_GPIO_periph);
+
+
 /*
  * mux the pin to the "A" internal peripheral role.
  */
@@ -181,6 +199,36 @@ EXPORT_SYMBOL(at91_set_multi_drive);
 
 /*--------------------------------------------------------------------------*/
 
+/* new-style GPIO calls; these expect at91_set_GPIO_periph to have been
+ * called, and maybe at91_set_multi_drive() for putout pins.
+ */
+
+int gpio_direction_input(unsigned pin)
+{
+       void __iomem    *pio = pin_to_controller(pin);
+       unsigned        mask = pin_to_mask(pin);
+
+       if (!pio || !(__raw_readl(pio + PIO_PSR) & mask))
+               return -EINVAL;
+       __raw_writel(mask, pio + PIO_OER);
+       return 0;
+}
+EXPORT_SYMBOL(gpio_direction_input);
+
+int gpio_direction_output(unsigned pin)
+{
+       void __iomem    *pio = pin_to_controller(pin);
+       unsigned        mask = pin_to_mask(pin);
+
+       if (!pio || !(__raw_readl(pio + PIO_PSR) & mask))
+               return -EINVAL;
+       __raw_writel(mask, pio + PIO_OER);
+       return 0;
+}
+EXPORT_SYMBOL(gpio_direction_output);
+
+/*--------------------------------------------------------------------------*/
+
 /*
  * assuming the pin is muxed as a gpio output, set its value.
  */
index 40039b2a90b39079a7af6f5fcdd5856f6452280e..2703a730baf77ff5cfd59a40faacc74e8e5cdd07 100644 (file)
@@ -87,7 +87,7 @@ static struct clocksource clocksource_imx = {
        .read           = imx_get_cycles,
        .mask           = 0xFFFFFFFF,
        .shift          = 20,
-       .is_continuous  = 1,
+       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
 };
 
 static int __init imx_clocksource_init(void)
index 2ec9a9e9a04dd0e702c58faa8015dd0df5498fac..45068c3d8dcc2336f02a92d21557257dd31337f5 100644 (file)
@@ -395,7 +395,7 @@ static struct clocksource clocksource_ixp4xx = {
        .read           = ixp4xx_get_cycles,
        .mask           = CLOCKSOURCE_MASK(32),
        .shift          = 20,
-       .is_continuous  = 1,
+       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
 };
 
 unsigned long ixp4xx_timer_freq = FREQ;
index 5773b55ef4a69f203dc83831d6452128094924b8..7e132fcccd47810de97955d9c3dc4146893027d5 100644 (file)
@@ -62,7 +62,7 @@ static struct clocksource clocksource_netx = {
        .read           = netx_get_cycles,
        .mask           = CLOCKSOURCE_MASK(32),
        .shift          = 20,
-       .is_continuous  = 1,
+       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
 };
 
 /*
index ee2beb400414653cdba4166df543633c62ca83b3..fc3b82a740a0b021f188d7801c3da29f93723b74 100644 (file)
@@ -112,7 +112,7 @@ static struct clocksource clocksource_pxa = {
        .read           = pxa_get_cycles,
        .mask           = CLOCKSOURCE_MASK(32),
        .shift          = 20,
-       .is_continuous  = 1,
+       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
 };
 
 static void __init pxa_timer_init(void)
index 74eba8b5a8ca41c5576b30c691b56344f0a416ce..989113dce415fadb3ac3e4e6dff03ea40a2ebd7c 100644 (file)
@@ -60,6 +60,10 @@ config GENERIC_CALIBRATE_DELAY
 config GENERIC_BUST_SPINLOCK
        bool
 
+config ZONE_DMA
+       bool
+       default y
+
 config GENERIC_ISA_DMA
        bool
 
index 9dbc17247c6fdfd6a3b00b2fdc734b02aaae02f9..e2bcefc91cc30fe2001e01b6481003659cc64ddc 100644 (file)
@@ -665,7 +665,7 @@ ecard_probe(int slot, card_type_t type)
                ec->fiqmask = 4;
        }
 
-       for (i = 0; i < sizeof(blacklist) / sizeof(*blacklist); i++)
+       for (i = 0; i < ARRAY_SIZE(blacklist); i++)
                if (blacklist[i].manufacturer == ec->cid.manufacturer &&
                    blacklist[i].product == ec->cid.product) {
                        ec->card_desc = blacklist[i].type;
index 466ddb54b44ffb01bd0c1211ddaf2f6ba80fc971..0e006c6cd5a0d6bc348675f1203ecd937f5de44c 100644 (file)
@@ -80,7 +80,7 @@ unsigned long phys_initrd_size __initdata = 0;
 static struct meminfo meminfo __initdata = { 0, };
 static struct proc_info_item proc_info;
 static const char *machine_name;
-static char command_line[COMMAND_LINE_SIZE];
+static char __initdata command_line[COMMAND_LINE_SIZE];
 
 static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;
 
@@ -492,8 +492,8 @@ void __init setup_arch(char **cmdline_p)
        init_mm.end_data   = (unsigned long) &_edata;
        init_mm.brk        = (unsigned long) &_end;
 
-       memcpy(saved_command_line, from, COMMAND_LINE_SIZE);
-       saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
+       memcpy(boot_command_line, from, COMMAND_LINE_SIZE);
+       boot_command_line[COMMAND_LINE_SIZE-1] = '\0';
        parse_cmdline(&meminfo, cmdline_p, from);
        bootmem_init(&meminfo);
        paging_init(&meminfo);
index 1206469b2b86249574f0dd111a83d457b960c7a8..0f1d57fbd3d7bea278fed6bf0ed3a20b0e7ce8d6 100644 (file)
@@ -89,14 +89,6 @@ static unsigned long gettimeoffset(void)
         return (offset + LATCH/2) / LATCH;
 }
 
-/*
- * Scheduler clock - returns current time in nanosec units.
- */
-unsigned long long sched_clock(void)
-{
-       return (unsigned long long)jiffies * (1000000000 / HZ);
-}
-
 static unsigned long next_rtc_update;
 
 /*
index ca61ec8218fe4bd33657766cbec3f2c0cfabdbc7..046a85054018ff4ee849e99d2cfe3483b3025657 100644 (file)
@@ -46,10 +46,12 @@ SECTIONS
                __con_initcall_start = .;
                        *(.con_initcall.init)
                __con_initcall_end = .;
+#ifdef CONFIG_BLK_DEV_INITRD
                . = ALIGN(32);
                __initramfs_start = .;
                        usr/built-in.o(.init.ramfs)
                __initramfs_end = .;
+#endif
                . = ALIGN(32768);
                __init_end = .;
        }
index d1d3418d7eb623627005e398094660ed678035d1..1d2949e83be8de301112f98bec3599cd046a7047 100644 (file)
@@ -47,10 +47,12 @@ SECTIONS
                __con_initcall_start = .;
                        *(.con_initcall.init)
                __con_initcall_end = .;
+#ifdef CONFIG_BLK_DEV_INITRD
                . = ALIGN(32);
                __initramfs_start = .;
                        usr/built-in.o(.init.ramfs)
                __initramfs_end = .;
+#endif
                . = ALIGN(32768);
                __init_end = .;
        }
index d47e39f0e971925f81cba2588fa185b5829ed1a0..5974768a59e58f182b32c52626c2daed58528b24 100644 (file)
@@ -8,7 +8,6 @@
  * published by the Free Software Foundation.
  */
 #include <linux/clk.h>
-#include <linux/device.h>
 #include <linux/etherdevice.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
@@ -36,12 +35,11 @@ static struct eth_addr __initdata hw_addr[2];
 static struct eth_platform_data __initdata eth_data[2];
 extern struct lcdc_platform_data atstk1000_fb0_data;
 
-static struct spi_board_info spi_board_info[] __initdata = {
+static struct spi_board_info spi0_board_info[] __initdata = {
        {
+               /* QVGA display */
                .modalias       = "ltv350qv",
-               .controller_data = (void *)GPIO_PIN_PA(4),
                .max_speed_hz   = 16000000,
-               .bus_num        = 0,
                .chip_select    = 1,
        },
 };
@@ -149,8 +147,7 @@ static int __init atstk1002_init(void)
 
        set_hw_addr(at32_add_device_eth(0, &eth_data[0]));
 
-       spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
-       at32_add_device_spi(0);
+       at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info));
        at32_add_device_lcdc(0, &atstk1000_fb0_data);
 
        return 0;
index c6734aefb559992e4eef8b4eb5d25b64ce0a6d6b..a1a7c3c3f522c97ce3ac82c47f91de3693b53fe1 100644 (file)
@@ -45,7 +45,7 @@ struct avr32_cpuinfo boot_cpu_data = {
 };
 EXPORT_SYMBOL(boot_cpu_data);
 
-static char command_line[COMMAND_LINE_SIZE];
+static char __initdata command_line[COMMAND_LINE_SIZE];
 
 /*
  * Should be more than enough, but if you have a _really_ complex
@@ -202,7 +202,7 @@ __tagtable(ATAG_MEM, parse_tag_mem);
 
 static int __init parse_tag_cmdline(struct tag *tag)
 {
-       strlcpy(saved_command_line, tag->u.cmdline.cmdline, COMMAND_LINE_SIZE);
+       strlcpy(boot_command_line, tag->u.cmdline.cmdline, COMMAND_LINE_SIZE);
        return 0;
 }
 __tagtable(ATAG_CMDLINE, parse_tag_cmdline);
@@ -294,7 +294,7 @@ void __init setup_arch (char **cmdline_p)
        init_mm.end_data = (unsigned long) &_edata;
        init_mm.brk = (unsigned long) &_end;
 
-       strlcpy(command_line, saved_command_line, COMMAND_LINE_SIZE);
+       strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
        *cmdline_p = command_line;
        parse_early_param();
 
index db8f8b55ffdf2925cfc0288a045c2fc463eefa3a..7c279586fbbac96b6445adc074ec56848c213e7f 100644 (file)
@@ -8,14 +8,6 @@
  * published by the Free Software Foundation.
  */
 
-#if !defined(CONFIG_NFSD) && !defined(CONFIG_NFSD_MODULE)
-#define sys_nfsservctl sys_ni_syscall
-#endif
-
-#if !defined(CONFIG_SYSV_IPC)
-# define sys_ipc       sys_ni_syscall
-#endif
-
        .section .rodata,"a",@progbits
        .type   sys_call_table,@object
        .global sys_call_table
@@ -129,7 +121,7 @@ sys_call_table:
        .long   sys_getitimer           /* 105 */
        .long   sys_swapoff
        .long   sys_sysinfo
-       .long   sys_ipc
+       .long   sys_ni_syscall          /* was sys_ipc briefly */
        .long   sys_sendfile
        .long   sys_setdomainname       /* 110 */
        .long   sys_newuname
@@ -287,4 +279,16 @@ sys_call_table:
        .long   sys_tee
        .long   sys_vmsplice
        .long   __sys_epoll_pwait       /* 265 */
+       .long   sys_msgget
+       .long   sys_msgsnd
+       .long   sys_msgrcv
+       .long   sys_msgctl
+       .long   sys_semget              /* 270 */
+       .long   sys_semop
+       .long   sys_semctl
+       .long   sys_semtimedop
+       .long   sys_shmat
+       .long   sys_shmget              /* 275 */
+       .long   sys_shmdt
+       .long   sys_shmctl
        .long   sys_ni_syscall          /* r8 is saturated at nr_syscalls */
index 5a247ba71a72e1bdfcd036e3ca8840eb35fbfe08..c10833f2ee0ce0e1dea60d255e64e07f13f14c48 100644 (file)
@@ -37,7 +37,7 @@ static struct clocksource clocksource_avr32 = {
        .read           = read_cycle_count,
        .mask           = CLOCKSOURCE_MASK(32),
        .shift          = 16,
-       .is_continuous  = 1,
+       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
 };
 
 /*
@@ -109,15 +109,6 @@ static void avr32_hpt_init(unsigned int count)
        sysreg_write(COUNT, count);
 }
 
-/*
- * Scheduler clock - returns current time in nanosec units.
- */
-unsigned long long sched_clock(void)
-{
-       /* There must be better ways...? */
-       return (unsigned long long)jiffies * (1000000000 / HZ);
-}
-
 /*
  * local_timer_interrupt() does profiling and process accounting on a
  * per-CPU basis.
index 5c4424e362b50cbaf918ccb264693f87ccf7509b..ef13b7c78935dba91cce904c289f3259f689db75 100644 (file)
@@ -46,10 +46,12 @@ SECTIONS
                __security_initcall_start = .;
                        *(.security_initcall.init)
                __security_initcall_end = .;
+#ifdef CONFIG_BLK_DEV_INITRD
                . = ALIGN(32);
                __initramfs_start = .;
                        *(.init.ramfs)
                __initramfs_end = .;
+#endif
                . = ALIGN(4096);
                __init_end = .;
        }
index c1e477ec7576850887591f9cc14c7d42128fa0b0..bc235507c5c7508c28a79a6219079c95d349641b 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/clk.h>
 #include <linux/init.h>
 #include <linux/platform_device.h>
+#include <linux/spi/spi.h>
 
 #include <asm/io.h>
 
@@ -310,8 +311,6 @@ static void genclk_mode(struct clk *clk, int enabled)
 {
        u32 control;
 
-       BUG_ON(clk->index > 7);
-
        control = sm_readl(&system_manager, PM_GCCTRL + 4 * clk->index);
        if (enabled)
                control |= SM_BIT(CEN);
@@ -325,11 +324,6 @@ static unsigned long genclk_get_rate(struct clk *clk)
        u32 control;
        unsigned long div = 1;
 
-       BUG_ON(clk->index > 7);
-
-       if (!clk->parent)
-               return 0;
-
        control = sm_readl(&system_manager, PM_GCCTRL + 4 * clk->index);
        if (control & SM_BIT(DIVEN))
                div = 2 * (SM_BFEXT(DIV, control) + 1);
@@ -342,11 +336,6 @@ static long genclk_set_rate(struct clk *clk, unsigned long rate, int apply)
        u32 control;
        unsigned long parent_rate, actual_rate, div;
 
-       BUG_ON(clk->index > 7);
-
-       if (!clk->parent)
-               return 0;
-
        parent_rate = clk->parent->get_rate(clk->parent);
        control = sm_readl(&system_manager, PM_GCCTRL + 4 * clk->index);
 
@@ -373,11 +362,8 @@ int genclk_set_parent(struct clk *clk, struct clk *parent)
 {
        u32 control;
 
-       BUG_ON(clk->index > 7);
-
        printk("clk %s: new parent %s (was %s)\n",
-              clk->name, parent->name,
-              clk->parent ? clk->parent->name : "(null)");
+              clk->name, parent->name, clk->parent->name);
 
        control = sm_readl(&system_manager, PM_GCCTRL + 4 * clk->index);
 
@@ -399,6 +385,22 @@ int genclk_set_parent(struct clk *clk, struct clk *parent)
        return 0;
 }
 
+static void __init genclk_init_parent(struct clk *clk)
+{
+       u32 control;
+       struct clk *parent;
+
+       BUG_ON(clk->index > 7);
+
+       control = sm_readl(&system_manager, PM_GCCTRL + 4 * clk->index);
+       if (control & SM_BIT(OSCSEL))
+               parent = (control & SM_BIT(PLLSEL)) ? &pll1 : &osc1;
+       else
+               parent = (control & SM_BIT(PLLSEL)) ? &pll0 : &osc0;
+
+       clk->parent = parent;
+}
+
 /* --------------------------------------------------------------------
  *  System peripherals
  * -------------------------------------------------------------------- */
@@ -750,8 +752,41 @@ static struct resource atmel_spi1_resource[] = {
 DEFINE_DEV(atmel_spi, 1);
 DEV_CLK(spi_clk, atmel_spi1, pba, 1);
 
-struct platform_device *__init at32_add_device_spi(unsigned int id)
+static void
+at32_spi_setup_slaves(unsigned int bus_num, struct spi_board_info *b,
+                     unsigned int n, const u8 *pins)
+{
+       unsigned int pin, mode;
+
+       for (; n; n--, b++) {
+               b->bus_num = bus_num;
+               if (b->chip_select >= 4)
+                       continue;
+               pin = (unsigned)b->controller_data;
+               if (!pin) {
+                       pin = pins[b->chip_select];
+                       b->controller_data = (void *)pin;
+               }
+               mode = AT32_GPIOF_OUTPUT;
+               if (!(b->mode & SPI_CS_HIGH))
+                       mode |= AT32_GPIOF_HIGH;
+               at32_select_gpio(pin, mode);
+       }
+}
+
+struct platform_device *__init
+at32_add_device_spi(unsigned int id, struct spi_board_info *b, unsigned int n)
 {
+       /*
+        * Manage the chipselects as GPIOs, normally using the same pins
+        * the SPI controller expects; but boards can use other pins.
+        */
+       static u8 __initdata spi0_pins[] =
+               { GPIO_PIN_PA(3), GPIO_PIN_PA(4),
+                 GPIO_PIN_PA(5), GPIO_PIN_PA(20), };
+       static u8 __initdata spi1_pins[] =
+               { GPIO_PIN_PB(2), GPIO_PIN_PB(3),
+                 GPIO_PIN_PB(4), GPIO_PIN_PA(27), };
        struct platform_device *pdev;
 
        switch (id) {
@@ -760,14 +795,7 @@ struct platform_device *__init at32_add_device_spi(unsigned int id)
                select_peripheral(PA(0),  PERIPH_A, 0); /* MISO  */
                select_peripheral(PA(1),  PERIPH_A, 0); /* MOSI  */
                select_peripheral(PA(2),  PERIPH_A, 0); /* SCK   */
-
-               /* NPCS[2:0] */
-               at32_select_gpio(GPIO_PIN_PA(3),
-                                AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH);
-               at32_select_gpio(GPIO_PIN_PA(4),
-                                AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH);
-               at32_select_gpio(GPIO_PIN_PA(5),
-                                AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH);
+               at32_spi_setup_slaves(0, b, n, spi0_pins);
                break;
 
        case 1:
@@ -775,20 +803,14 @@ struct platform_device *__init at32_add_device_spi(unsigned int id)
                select_peripheral(PB(0),  PERIPH_B, 0); /* MISO  */
                select_peripheral(PB(1),  PERIPH_B, 0); /* MOSI  */
                select_peripheral(PB(5),  PERIPH_B, 0); /* SCK   */
-
-               /* NPCS[2:0] */
-               at32_select_gpio(GPIO_PIN_PB(2),
-                                AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH);
-               at32_select_gpio(GPIO_PIN_PB(3),
-                                AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH);
-               at32_select_gpio(GPIO_PIN_PB(4),
-                                AT32_GPIOF_OUTPUT | AT32_GPIOF_HIGH);
+               at32_spi_setup_slaves(1, b, n, spi1_pins);
                break;
 
        default:
                return NULL;
        }
 
+       spi_register_board_info(b, n);
        platform_device_register(pdev);
        return pdev;
 }
@@ -872,6 +894,50 @@ at32_add_device_lcdc(unsigned int id, struct lcdc_platform_data *data)
        return pdev;
 }
 
+/* --------------------------------------------------------------------
+ *  GCLK
+ * -------------------------------------------------------------------- */
+static struct clk gclk0 = {
+       .name           = "gclk0",
+       .mode           = genclk_mode,
+       .get_rate       = genclk_get_rate,
+       .set_rate       = genclk_set_rate,
+       .set_parent     = genclk_set_parent,
+       .index          = 0,
+};
+static struct clk gclk1 = {
+       .name           = "gclk1",
+       .mode           = genclk_mode,
+       .get_rate       = genclk_get_rate,
+       .set_rate       = genclk_set_rate,
+       .set_parent     = genclk_set_parent,
+       .index          = 1,
+};
+static struct clk gclk2 = {
+       .name           = "gclk2",
+       .mode           = genclk_mode,
+       .get_rate       = genclk_get_rate,
+       .set_rate       = genclk_set_rate,
+       .set_parent     = genclk_set_parent,
+       .index          = 2,
+};
+static struct clk gclk3 = {
+       .name           = "gclk3",
+       .mode           = genclk_mode,
+       .get_rate       = genclk_get_rate,
+       .set_rate       = genclk_set_rate,
+       .set_parent     = genclk_set_parent,
+       .index          = 3,
+};
+static struct clk gclk4 = {
+       .name           = "gclk4",
+       .mode           = genclk_mode,
+       .get_rate       = genclk_get_rate,
+       .set_rate       = genclk_set_rate,
+       .set_parent     = genclk_set_parent,
+       .index          = 4,
+};
+
 struct clk *at32_clock_list[] = {
        &osc32k,
        &osc0,
@@ -908,6 +974,11 @@ struct clk *at32_clock_list[] = {
        &atmel_spi1_spi_clk,
        &lcdc0_hclk,
        &lcdc0_pixclk,
+       &gclk0,
+       &gclk1,
+       &gclk2,
+       &gclk3,
+       &gclk4,
 };
 unsigned int at32_nr_clocks = ARRAY_SIZE(at32_clock_list);
 
@@ -936,6 +1007,13 @@ void __init at32_clock_init(void)
        if (sm_readl(sm, PM_PLL1) & SM_BIT(PLLOSC))
                pll1.parent = &osc1;
 
+       genclk_init_parent(&gclk0);
+       genclk_init_parent(&gclk1);
+       genclk_init_parent(&gclk2);
+       genclk_init_parent(&gclk3);
+       genclk_init_parent(&gclk4);
+       genclk_init_parent(&lcdc0_pixclk);
+
        /*
         * Turn on all clocks that have at least one user already, and
         * turn off everything else. We only do this for module
index 3d0d1097389f167ec48dca953e277f7b331ab5fa..49e7b12fe710848dfa1b4fa18f12978768efa481 100644 (file)
@@ -63,7 +63,11 @@ EXPORT_SYMBOL(clk_enable);
 
 static void __clk_disable(struct clk *clk)
 {
-       BUG_ON(clk->users == 0);
+       if (clk->users == 0) {
+               printk(KERN_ERR "%s: mismatched disable\n", clk->name);
+               WARN_ON(1);
+               return;
+       }
 
        if (--clk->users == 0 && clk->mode)
                clk->mode(clk, 0);
index 7b073052203d77a4d6002709b53f435afda0a10b..56672018e42f2e25c62240556693842e45ee3cc0 100644 (file)
@@ -360,7 +360,7 @@ static int tlb_open(struct inode *inode, struct file *file)
        return seq_open(file, &tlb_ops);
 }
 
-static struct file_operations proc_tlb_operations = {
+static const struct file_operations proc_tlb_operations = {
        .open           = tlb_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index 3474309e049c857ac2192c50fe1429358aff0dfc..4b41248b61ad8b6922df5b31c3ebdfa98d52945d 100644 (file)
@@ -9,6 +9,10 @@ config MMU
        bool
        default y
 
+config ZONE_DMA
+       bool
+       default y
+
 config RWSEM_GENERIC_SPINLOCK
        bool
        default y
@@ -40,6 +44,9 @@ config IRQ_PER_CPU
        bool
        default y
 
+config NO_IOPORT
+       def_bool y
+
 config CRIS
        bool
        default y
index ffade19a14e6f0b974dbea77034bacc329ebd795..efd7b0f3a91042aa85455309594979ec6de44a3a 100644 (file)
@@ -359,8 +359,7 @@ static struct mtd_info *flash_probe(void)
                 * So we use the MTD concatenation layer instead of further
                 * complicating the probing procedure.
                 */
-               mtd_cse = mtd_concat_create(mtds,
-                                           sizeof(mtds) / sizeof(mtds[0]),
+               mtd_cse = mtd_concat_create(mtds, ARRAY_SIZE(mtds),
                                            "cse0+cse1");
 #else
                printk(KERN_ERR "%s and %s: Cannot concatenate due to kernel "
index 3cf4f23de1d083b82007abfb5808928e0c77b2ee..88eff7f54ea6cc17ab28e70b33155957ba3acdb1 100644 (file)
@@ -499,7 +499,7 @@ print_rtc_status(void)
 
 /* The various file operations we support. */
 
-static struct file_operations rtc_fops = {
+static const struct file_operations rtc_fops = {
        .owner =        THIS_MODULE,
        .ioctl =        rtc_ioctl,
 }; 
index 284ebfda03f05a672def45c46777f62f01c91034..be35a70798aa5cc008807e6cc7488ba45f0d24dc 100644 (file)
@@ -172,7 +172,7 @@ static const char eeprom_name[] = "eeprom";
 static struct eeprom_type eeprom;
 
 /* This is the exported file-operations structure for this device. */
-struct file_operations eeprom_fops =
+const struct file_operations eeprom_fops =
 {
   .llseek  = eeprom_lseek,
   .read    = eeprom_read,
index 9aba18b931dddcf91c01d44452079a0442b3cde3..f389ed6998fe4f92ec9fc28b95ce2cc8cbd65e34 100644 (file)
@@ -838,7 +838,7 @@ gpio_leds_ioctl(unsigned int cmd, unsigned long arg)
        return 0;
 }
 
-struct file_operations gpio_fops = {
+const struct file_operations gpio_fops = {
        .owner       = THIS_MODULE,
        .poll        = gpio_poll,
        .ioctl       = gpio_ioctl,
index 092c724a645f8096b32c07c60de600dd665da932..aca81ddaf60f787eb42256819d72ab137c3f4d23 100644 (file)
@@ -692,7 +692,7 @@ i2c_ioctl(struct inode *inode, struct file *file,
        return 0;
 }
 
-static struct file_operations i2c_fops = {
+static const struct file_operations i2c_fops = {
        .owner    = THIS_MODULE,
        .ioctl    = i2c_ioctl,
        .open     = i2c_open,
index 8c830eefc89c4e9a07e480b78d32747475f35ffa..107796e501495f50a85731a6cee88c06f393528a 100644 (file)
@@ -56,7 +56,7 @@ static const unsigned char days_in_month[] =
 
 int pcf8563_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
 
-static struct file_operations pcf8563_fops = {
+static const struct file_operations pcf8563_fops = {
        .owner = THIS_MODULE,
        .ioctl = pcf8563_ioctl,
 };
index ebacf1457d914cacae4069c21094639fbc906dd7..077e973c33f0c131be44a9c8e32fd4c149b61528 100644 (file)
@@ -38,7 +38,6 @@ unsigned long get_ns_in_jiffie(void)
        unsigned long flags;
 
        local_irq_save(flags);
-       local_irq_disable();
        timer_count = *R_TIMER0_DATA;
        presc_count = *R_TIM_PRESC_STATUS;  
        /* presc_count might be wrapped */
index 70a5523eff78b3a5f7ec2c98b4e4d98bd6a6d70d..7d9fec88dee56c16bdc6eef806c4d1b3fc450708 100644 (file)
@@ -42,8 +42,7 @@ flush_tlb_all(void)
         * in the same 4-way entry group. details.. 
         */
 
-       local_save_flags(flags);
-       local_irq_disable();
+       local_irq_save(flags);
        for(i = 0; i < NUM_TLB_ENTRIES; i++) {
                *R_TLB_SELECT = ( IO_FIELD(R_TLB_SELECT, index, i) );
                *R_TLB_HI = ( IO_FIELD(R_TLB_HI, page_id, INVALID_PAGEID ) |
@@ -78,8 +77,7 @@ flush_tlb_mm(struct mm_struct *mm)
         * global pages. is it worth the extra I/O ? 
         */
 
-       local_save_flags(flags);
-       local_irq_disable();
+       local_irq_save(flags);
        for(i = 0; i < NUM_TLB_ENTRIES; i++) {
                *R_TLB_SELECT = IO_FIELD(R_TLB_SELECT, index, i);
                if (IO_EXTRACT(R_TLB_HI, page_id, *R_TLB_HI) == page_id) {
@@ -118,8 +116,7 @@ flush_tlb_page(struct vm_area_struct *vma,
         * and the virtual address requested 
         */
 
-       local_save_flags(flags);
-       local_irq_disable();
+       local_irq_save(flags);
        for(i = 0; i < NUM_TLB_ENTRIES; i++) {
                unsigned long tlb_hi;
                *R_TLB_SELECT = IO_FIELD(R_TLB_SELECT, index, i);
index 689729a7e66e6b217d8649a3f8ae6235f1b2798d..4b348b38cf333f9819776a817a4de43f618ded6d 100644 (file)
@@ -82,7 +82,8 @@ SECTIONS
                __con_initcall_end = .;
        }       
        SECURITY_INIT
-               
+
+#ifdef CONFIG_BLK_DEV_INITRD
        .init.ramfs : {
                __initramfs_start = .;
                *(.init.ramfs)
@@ -93,6 +94,7 @@ SECTIONS
                FILL (0); 
                . = ALIGN (8192);
        }
+#endif
        
        __vmlinux_end = .;            /* last address of the physical file */
        __init_end = .;
index 2449637e6fc0ab1bad494dbec05de816f2c12d74..1a071f17446dea7aac9dd40c146c900ed271ad6f 100644 (file)
@@ -266,7 +266,7 @@ static void print_user_dma_lists(struct cryptocop_dma_list_operation *dma_op);
 
 
 
-struct file_operations cryptocop_fops = {
+const struct file_operations cryptocop_fops = {
        owner: THIS_MODULE,
        open: cryptocop_open,
        release: cryptocop_release,
index 08d36f0955c6789ced9bafa4283cf99546a69ef2..d82c5c56113506079e541ff003d1a35b73aaf1bf 100644 (file)
@@ -705,7 +705,7 @@ gpio_leds_ioctl(unsigned int cmd, unsigned long arg)
        return 0;
 }
 
-struct file_operations gpio_fops = {
+const struct file_operations gpio_fops = {
        .owner       = THIS_MODULE,
        .poll        = gpio_poll,
        .ioctl       = gpio_ioctl,
index 95f00188c6283fdaede4a43e518656da3c668b07..5d6c52737df3683246ee69152b8256a2c33bd851 100644 (file)
@@ -573,7 +573,7 @@ i2c_ioctl(struct inode *inode, struct file *file,
        return 0;
 }
 
-static struct file_operations i2c_fops = {
+static const struct file_operations i2c_fops = {
        owner:    THIS_MODULE,
        ioctl:    i2c_ioctl,
        open:     i2c_open,
index 2fc7d75a35ded92fd07b22dbed11cea994892f35..544ab01794110e84a250a15a3baf57053e7c40e2 100644 (file)
@@ -50,7 +50,7 @@ int pcf8563_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
 int pcf8563_open(struct inode *, struct file *);
 int pcf8563_release(struct inode *, struct file *);
 
-static struct file_operations pcf8563_fops = {
+static const struct file_operations pcf8563_fops = {
        owner: THIS_MODULE,
        ioctl: pcf8563_ioctl,
        open: pcf8563_open,
index 424eb0eb1cd599ecf5b4c86fefad108ae03f54f0..df89298aafc46121fb445649f0c1f50818d70b60 100644 (file)
@@ -187,7 +187,7 @@ static struct sync_port ports[]=
 
 #define NUMBER_OF_PORTS (sizeof(ports)/sizeof(sync_port))
 
-static struct file_operations sync_serial_fops = {
+static const struct file_operations sync_serial_fops = {
        .owner   = THIS_MODULE,
        .write   = sync_serial_write,
        .read    = sync_serial_read,
index 9d75d7692303fca512713743952403f07cab07fe..c2d12e9c40d79a2e5720837bdaca10bebd07693c 100644 (file)
@@ -54,8 +54,7 @@ __flush_tlb_all(void)
         * Mask with 0xf so similar TLB entries aren't written in the same 4-way
         * entry group.
         */
-       local_save_flags(flags);
-       local_irq_disable();
+       local_irq_save(flags);
 
        for (mmu = 1; mmu <= 2; mmu++) {
                SUPP_BANK_SEL(mmu); /* Select the MMU */
@@ -92,8 +91,7 @@ __flush_tlb_mm(struct mm_struct *mm)
                return;
 
        /* Mark the TLB entries that match the page_id as invalid. */
-       local_save_flags(flags);
-       local_irq_disable();
+       local_irq_save(flags);
 
        for (mmu = 1; mmu <= 2; mmu++) {
                SUPP_BANK_SEL(mmu);
@@ -140,8 +138,7 @@ __flush_tlb_page(struct vm_area_struct *vma, unsigned long addr)
         * Invalidate those TLB entries that match both the mm context and the
         * requested virtual address.
         */
-       local_save_flags(flags);
-       local_irq_disable();
+       local_irq_save(flags);
 
        for (mmu = 1; mmu <= 2; mmu++) {
                SUPP_BANK_SEL(mmu);
index 472d4b3c4cf4b1d595d36a7b43dabd063d7c5a2d..e124fcd766d5c0fcd1cfd06fd42a746e5444822b 100644 (file)
@@ -95,6 +95,7 @@ SECTIONS
        .data.percpu  : { *(.data.percpu) }
        __per_cpu_end = .;
 
+#ifdef CONFIG_BLK_DEV_INITRD
        .init.ramfs : {
                __initramfs_start = .;
                *(.init.ramfs)
@@ -107,6 +108,7 @@ SECTIONS
                FILL (0);
                . = ALIGN (8192);
        }
+#endif
 
        __vmlinux_end = .;      /* Last address of the physical file. */
        __init_end = .;
index f60ab785f235dbd105ca7a40a467409fcc2636bf..4cfcae6205071754987bb0d04b541b809a342376 100644 (file)
@@ -50,7 +50,7 @@ write_cris_profile(struct file *file, const char __user *buf,
   memset(sample_buffer, 0, SAMPLE_BUFFER_SIZE);
 }
 
-static struct file_operations cris_proc_profile_operations = {
+static const struct file_operations cris_proc_profile_operations = {
        .read           = read_cris_profile,
        .write          = write_cris_profile,
 };
index ca8b45a0fe2ed4dc8fc48cb9c0cdfdd20a5af7db..65466c49d7a99ea35701aaadf1ddb4a6bac7f6b9 100644 (file)
@@ -29,7 +29,7 @@ struct screen_info screen_info;
 extern int root_mountflags;
 extern char _etext, _edata, _end;
 
-char cris_command_line[COMMAND_LINE_SIZE] = { 0, };
+char __initdata cris_command_line[COMMAND_LINE_SIZE] = { 0, };
 
 extern const unsigned long text_start, edata; /* set by the linker script */
 extern unsigned long dram_start, dram_end;
@@ -153,8 +153,8 @@ setup_arch(char **cmdline_p)
 #endif
 
        /* Save command line for future references. */
-       memcpy(saved_command_line, cris_command_line, COMMAND_LINE_SIZE);
-       saved_command_line[COMMAND_LINE_SIZE - 1] = '\0';
+       memcpy(boot_command_line, cris_command_line, COMMAND_LINE_SIZE);
+       boot_command_line[COMMAND_LINE_SIZE - 1] = '\0';
 
        /* give credit for the CRIS port */
        show_etrax_copyright();
index 0f9213cbd48e24f9068c62125b7b9814d09ce617..acfd0455940590c5e5292ce86b89dde0e1b0200e 100644 (file)
@@ -55,7 +55,6 @@ void do_gettimeofday(struct timeval *tv)
        unsigned long flags;
        signed long usec, sec;
        local_irq_save(flags);
-       local_irq_disable();
        usec = do_gettimeoffset();
 
         /*
@@ -217,14 +216,6 @@ cris_do_profile(struct pt_regs* regs)
 #endif
 }
 
-/*
- * Scheduler clock - returns current time in nanosec units.
- */
-unsigned long long sched_clock(void)
-{
-       return (unsigned long long)jiffies * (1000000000 / HZ);
-}
-
 static int
 __init init_udelay(void)
 {
index 0df390a656cdf9f1edfc94c25b5bf6cbc7a33497..c4a98e2e529e04dd46b85ff768bdabad3df8d1a4 100644 (file)
@@ -8,6 +8,7 @@
  */
 
 #include <linux/init.h>
+#include <linux/kernel.h>
 #include <asm/tlb.h>
 
 #define D(x)
@@ -100,7 +101,7 @@ tlb_init(void)
 
        /* clear the page_id map */
 
-       for (i = 1; i < sizeof (page_id_map) / sizeof (page_id_map[0]); i++)
+       for (i = 1; i < ARRAY_SIZE(page_id_map); i++)
                page_id_map[i] = NULL;
        
        /* invalidate the entire TLB */
index 7561d7b72e75408bb05f3998008c2cee2b1debcf..cea237413aa242b995442e5abee32cfdac728fca 100644 (file)
@@ -6,6 +6,10 @@ config FRV
        bool
        default y
 
+config ZONE_DMA
+       bool
+       default y
+
 config RWSEM_GENERIC_SPINLOCK
        bool
        default y
index ee677ced7b68413b098e6e192815afb067c1cdf8..c57ce3f1f2e281b2c38a7de860d390cbc08e5fd0 100644 (file)
@@ -125,7 +125,6 @@ unsigned long sleep_phys_sp(void *sp)
  * Use a temporary sysctl number. Horrid, but will be cleaned up in 2.6
  * when all the PM interfaces exist nicely.
  */
-#define CTL_PM 9899
 #define CTL_PM_SUSPEND 1
 #define CTL_PM_CMODE 2
 #define CTL_PM_P0 4
@@ -402,17 +401,53 @@ static int cm_sysctl(ctl_table *table, int __user *name, int nlen,
 
 static struct ctl_table pm_table[] =
 {
-       {CTL_PM_SUSPEND, "suspend", NULL, 0, 0200, NULL, &sysctl_pm_do_suspend},
-       {CTL_PM_CMODE, "cmode", &clock_cmode_current, sizeof(int), 0644, NULL, &cmode_procctl, &cmode_sysctl, NULL},
-       {CTL_PM_P0, "p0", &clock_p0_current, sizeof(int), 0644, NULL, &p0_procctl, &p0_sysctl, NULL},
-       {CTL_PM_CM, "cm", &clock_cm_current, sizeof(int), 0644, NULL, &cm_procctl, &cm_sysctl, NULL},
-       {0}
+       {
+               .ctl_name       = CTL_PM_SUSPEND,
+               .procname       = "suspend",
+               .data           = NULL,
+               .maxlen         = 0,
+               .mode           = 0200,
+               .proc_handler   = &sysctl_pm_do_suspend,
+       },
+       {
+               .ctl_name       = CTL_PM_CMODE,
+               .procname       = "cmode",
+               .data           = &clock_cmode_current,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &cmode_procctl,
+               .strategy       = &cmode_sysctl,
+       },
+       {
+               .ctl_name       = CTL_PM_P0,
+               .procname       = "p0",
+               .data           = &clock_p0_current,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &p0_procctl,
+               .strategy       = &p0_sysctl,
+       },
+       {
+               .ctl_name       = CTL_PM_CM,
+               .procname       = "cm",
+               .data           = &clock_cm_current,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &cm_procctl,
+               .strategy       = &cm_sysctl,
+       },
+       { .ctl_name = 0}
 };
 
 static struct ctl_table pm_dir_table[] =
 {
-       {CTL_PM, "pm", NULL, 0, 0555, pm_table},
-       {0}
+       {
+               .ctl_name       = CTL_PM,
+               .procname       = "pm",
+               .mode           = 0555,
+               .child          = pm_table,
+       },
+       { .ctl_name = 0}
 };
 
 /*
@@ -420,7 +455,7 @@ static struct ctl_table pm_dir_table[] =
  */
 static int __init pm_init(void)
 {
-       register_sysctl_table(pm_dir_table, 1);
+       register_sysctl_table(pm_dir_table);
        return 0;
 }
 
index 1a5eb6c301c9b0e833d389953d76650eb70390fe..8ea3ca2aba621f9390e304e6bf97a1dc140a1e3e 100644 (file)
@@ -110,7 +110,7 @@ unsigned long __initdata num_mappedpages;
 
 struct cpuinfo_frv __nongprelbss boot_cpu_data;
 
-char command_line[COMMAND_LINE_SIZE];
+char __initdata command_line[COMMAND_LINE_SIZE];
 char __initdata redboot_command_line[COMMAND_LINE_SIZE];
 
 #ifdef CONFIG_PM
@@ -762,7 +762,7 @@ void __init setup_arch(char **cmdline_p)
        printk("uClinux FR-V port done by Red Hat Inc <dhowells@redhat.com>\n");
 #endif
 
-       memcpy(saved_command_line, redboot_command_line, COMMAND_LINE_SIZE);
+       memcpy(boot_command_line, redboot_command_line, COMMAND_LINE_SIZE);
 
        determine_cpu();
        determine_clocks(1);
@@ -803,7 +803,7 @@ void __init setup_arch(char **cmdline_p)
 #endif
 
        /* deal with the command line - RedBoot may have passed one to the kernel */
-       memcpy(command_line, saved_command_line, sizeof(command_line));
+       memcpy(command_line, boot_command_line, sizeof(command_line));
        *cmdline_p = &command_line[0];
        parse_cmdline_early(command_line);
 
index ce676803eb6f59a03e8ee36780ac009fac4cc63b..3e9d7e03fb95b35cd94bf4779b667641ea8df528 100644 (file)
@@ -175,22 +175,40 @@ static int procctl_frv_pin_cxnr(ctl_table *table, int write, struct file *filp,
  */
 static struct ctl_table frv_table[] =
 {
-       { 1, "cache-mode",      NULL, 0, 0644, NULL, &procctl_frv_cachemode },
+       {
+               .ctl_name       = 1,
+               .procname       = "cache-mode",
+               .data           = NULL,
+               .maxlen         = 0,
+               .mode           = 0644,
+               .proc_handler   = &procctl_frv_cachemode,
+       },
 #ifdef CONFIG_MMU
-       { 2, "pin-cxnr",        NULL, 0, 0644, NULL, &procctl_frv_pin_cxnr },
+       {
+               .ctl_name       = 2,
+               .procname       = "pin-cxnr",
+               .data           = NULL,
+               .maxlen         = 0,
+               .mode           = 0644,
+               .proc_handler   = &procctl_frv_pin_cxnr
+       },
 #endif
-       { 0 }
+       {}
 };
 
 /*
  * Use a temporary sysctl number. Horrid, but will be cleaned up in 2.6
  * when all the PM interfaces exist nicely.
  */
-#define CTL_FRV 9898
 static struct ctl_table frv_dir_table[] =
 {
-       {CTL_FRV, "frv", NULL, 0, 0555, frv_table},
-       {0}
+       {
+               .ctl_name       = CTL_FRV,
+               .procname       = "frv",
+               .mode           = 0555,
+               .child          = frv_table
+       },
+       {}
 };
 
 /*
@@ -198,7 +216,7 @@ static struct ctl_table frv_dir_table[] =
  */
 static int __init frv_sysctl_init(void)
 {
-       register_sysctl_table(frv_dir_table, 1);
+       register_sysctl_table(frv_dir_table);
        return 0;
 }
 
index 9c1fb12367fa3cfbedf6b8abe926fc40eb0e431e..97910e016825e29361f4fb41b5e5aee69b043d60 100644 (file)
@@ -61,10 +61,12 @@ SECTIONS
   .data.percpu  : { *(.data.percpu) }
   __per_cpu_end = .;
 
+#ifdef CONFIG_BLK_DEV_INITRD
   . = ALIGN(4096);
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
   __initramfs_end = .;
+#endif
 
   . = ALIGN(THREAD_SIZE);
   __init_end = .;
index 34a84bc4baf59ae515c1a0b0c899deee21604ef4..1734d96422c60f82219e779d57bae3c81fac525b 100644 (file)
@@ -17,6 +17,10 @@ config SWAP
        bool
        default n
 
+config ZONE_DMA
+       bool
+       default y
+
 config FPU
        bool
        default n
@@ -53,6 +57,9 @@ config TIME_LOW_RES
        bool
        default y
 
+config NO_IOPORT
+       def_bool y
+
 config ISA
        bool
        default y
index 71b6131e98b877f1d21559a80139707b2dce1de8..4edbc2ef6ca28e6d2c8a09c9727ec5c9f9a50b30 100644 (file)
@@ -6,6 +6,8 @@ extra-y := vmlinux.lds
 
 obj-y := process.o traps.o ptrace.o ints.o \
         sys_h8300.o time.o semaphore.o signal.o \
-         setup.o gpio.o init_task.o syscalls.o
+         setup.o gpio.o init_task.o syscalls.o devres.o
+
+devres-y = ../../../kernel/irq/devres.o
 
 obj-$(CONFIG_MODULES) += module.o h8300_ksyms.o 
index 6adf8f41d2a1f153fdf7ba9b1fc9598cb0674329..313cd80810441516b95e86610e5f49b1651bf47f 100644 (file)
@@ -54,7 +54,7 @@ unsigned long rom_length;
 unsigned long memory_start;
 unsigned long memory_end;
 
-char command_line[COMMAND_LINE_SIZE];
+char __initdata command_line[COMMAND_LINE_SIZE];
 
 extern int _stext, _etext, _sdata, _edata, _sbss, _ebss, _end;
 extern int _ramstart, _ramend;
@@ -154,8 +154,8 @@ void __init setup_arch(char **cmdline_p)
 #endif
        /* Keep a copy of command line */
        *cmdline_p = &command_line[0];
-       memcpy(saved_command_line, command_line, COMMAND_LINE_SIZE);
-       saved_command_line[COMMAND_LINE_SIZE-1] = 0;
+       memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
+       boot_command_line[COMMAND_LINE_SIZE-1] = 0;
 
 #ifdef DEBUG
        if (strlen(*cmdline_p)) 
index 8abab3bc2b6fe1615cf80c71e3ca6450e8ee91f2..d1ef615ba895369ffb4883b082600e1e66e9651f 100644 (file)
@@ -118,9 +118,3 @@ int do_settimeofday(struct timespec *tv)
 }
 
 EXPORT_SYMBOL(do_settimeofday);
-
-unsigned long long sched_clock(void)
-{
-       return (unsigned long long)jiffies * (1000000000 / HZ);
-
-}
index f05288be8878fb86efcf4bcae6b95fdafe69073d..65f1cdc5ee0459fd20b3fab62ee5f36a2e962216 100644 (file)
@@ -126,10 +126,12 @@ SECTIONS
        ___con_initcall_end = .;
                *(.exit.text)
                *(.exit.data)
+#if defined(CONFIG_BLK_DEV_INITRD)
                . = ALIGN(4);
        ___initramfs_start = .;
                *(.init.ramfs)
        ___initramfs_end = .;
+#endif
        . = ALIGN(0x4) ;
        ___init_end = .;
        __edata = . ;
index 0dfee812811a9c75427551ef8177b45f2ca7a998..1df4a1f14289e15c1dc6292e3711f2ad64a30c57 100644 (file)
@@ -18,6 +18,18 @@ config GENERIC_TIME
        bool
        default y
 
+config CLOCKSOURCE_WATCHDOG
+       bool
+       default y
+
+config GENERIC_CLOCKEVENTS
+       bool
+       default y
+
+config GENERIC_CLOCKEVENTS_BROADCAST
+       bool
+       default y
+
 config LOCKDEP_SUPPORT
        bool
        default y
@@ -38,6 +50,10 @@ config MMU
        bool
        default y
 
+config ZONE_DMA
+       bool
+       default y
+
 config SBUS
        bool
 
@@ -70,6 +86,8 @@ source "init/Kconfig"
 
 menu "Processor type and features"
 
+source "kernel/time/Kconfig"
+
 config SMP
        bool "Symmetric multi-processing support"
        ---help---
@@ -199,6 +217,15 @@ config PARAVIRT
          However, when run without a hypervisor the kernel is
          theoretically slower.  If in doubt, say N.
 
+config VMI
+       bool "VMI Paravirt-ops support"
+       depends on PARAVIRT && !NO_HZ
+       default y
+       help
+         VMI provides a paravirtualized interface to multiple hypervisors
+         include VMware ESX server and Xen by connecting to a ROM module
+         provided by the hypervisor.
+
 config ACPI_SRAT
        bool
        default y
@@ -1259,3 +1286,12 @@ config X86_TRAMPOLINE
 config KTIME_SCALAR
        bool
        default y
+
+config NO_IDLE_HZ
+       bool
+       depends on PARAVIRT
+       default y
+       help
+         Switches the regular HZ timer off when the system is going idle.
+         This helps a hypervisor detect that the Linux system is idle,
+         reducing the overhead of idle systems.
index 2aecfba4ac4f8fe702a2c0fc279877f10ee792f8..b99c0e2a4e63a0b1726e83e10cd27b158b9a73bb 100644 (file)
@@ -226,11 +226,6 @@ config X86_CMPXCHG
        depends on !M386
        default y
 
-config X86_XADD
-       bool
-       depends on !M386
-       default y
-
 config X86_L1_CACHE_SHIFT
        int
        default "7" if MPENTIUM4 || X86_GENERIC
index f68cc6f215f8b1c9bff53c0f6668d4b792f3b30a..458bc1611933b815f16856f9b608ef217a5a0a74 100644 (file)
@@ -87,7 +87,7 @@ config DOUBLEFAULT
 
 config DEBUG_PARAVIRT
        bool "Enable some paravirtualization debugging"
-       default y
+       default n
        depends on PARAVIRT && DEBUG_KERNEL
        help
          Currently deliberately clobbers regs which are allowed to be
index bb0c376b62b32fcc8ee934ce281676908b6fd150..5ae1e0bc8fd7e6ecf6a73cb6b3fa002ebd6cdf45 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20-rc3
-# Fri Jan  5 11:54:46 2007
+# Linux kernel version: 2.6.20-git8
+# Tue Feb 13 11:25:18 2007
 #
 CONFIG_X86_32=y
 CONFIG_GENERIC_TIME=y
@@ -10,6 +10,7 @@ CONFIG_STACKTRACE_SUPPORT=y
 CONFIG_SEMAPHORE_SLEEPERS=y
 CONFIG_X86=y
 CONFIG_MMU=y
+CONFIG_ZONE_DMA=y
 CONFIG_GENERIC_ISA_DMA=y
 CONFIG_GENERIC_IOMAP=y
 CONFIG_GENERIC_BUG=y
@@ -139,7 +140,6 @@ CONFIG_MPENTIUMIII=y
 # CONFIG_MVIAC3_2 is not set
 CONFIG_X86_GENERIC=y
 CONFIG_X86_CMPXCHG=y
-CONFIG_X86_XADD=y
 CONFIG_X86_L1_CACHE_SHIFT=7
 CONFIG_RWSEM_XCHGADD_ALGORITHM=y
 # CONFIG_ARCH_HAS_ILOG2_U32 is not set
@@ -198,6 +198,7 @@ CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
 CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_RESOURCES_64BIT=y
+CONFIG_ZONE_DMA_FLAG=1
 # CONFIG_HIGHPTE is not set
 # CONFIG_MATH_EMULATION is not set
 CONFIG_MTRR=y
@@ -211,6 +212,7 @@ CONFIG_HZ_250=y
 CONFIG_HZ=250
 # CONFIG_KEXEC is not set
 # CONFIG_CRASH_DUMP is not set
+CONFIG_PHYSICAL_START=0x100000
 # CONFIG_RELOCATABLE is not set
 CONFIG_PHYSICAL_ALIGN=0x100000
 # CONFIG_HOTPLUG_CPU is not set
@@ -229,13 +231,14 @@ CONFIG_PM_SYSFS_DEPRECATED=y
 # ACPI (Advanced Configuration and Power Interface) Support
 #
 CONFIG_ACPI=y
+CONFIG_ACPI_PROCFS=y
 CONFIG_ACPI_AC=y
 CONFIG_ACPI_BATTERY=y
 CONFIG_ACPI_BUTTON=y
-# CONFIG_ACPI_VIDEO is not set
 # CONFIG_ACPI_HOTKEY is not set
 CONFIG_ACPI_FAN=y
 # CONFIG_ACPI_DOCK is not set
+# CONFIG_ACPI_BAY is not set
 CONFIG_ACPI_PROCESSOR=y
 CONFIG_ACPI_THERMAL=y
 # CONFIG_ACPI_ASUS is not set
@@ -306,7 +309,6 @@ CONFIG_PCI_DIRECT=y
 CONFIG_PCI_MMCONFIG=y
 # CONFIG_PCIEPORTBUS is not set
 CONFIG_PCI_MSI=y
-# CONFIG_PCI_MULTITHREAD_PROBE is not set
 # CONFIG_PCI_DEBUG is not set
 # CONFIG_HT_IRQ is not set
 CONFIG_ISA_DMA_API=y
@@ -347,6 +349,7 @@ CONFIG_UNIX=y
 CONFIG_XFRM=y
 # CONFIG_XFRM_USER is not set
 # CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
 CONFIG_IP_MULTICAST=y
@@ -446,6 +449,7 @@ CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
 CONFIG_FW_LOADER=y
 # CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
 # CONFIG_SYS_HYPERVISOR is not set
 
 #
@@ -466,8 +470,7 @@ CONFIG_FW_LOADER=y
 #
 # Plug and Play support
 #
-CONFIG_PNP=y
-CONFIG_PNPACPI=y
+# CONFIG_PNP is not set
 
 #
 # Block devices
@@ -515,6 +518,7 @@ 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_BLK_DEV_IDEACPI=y
 # CONFIG_IDE_TASK_IOCTL is not set
 
 #
@@ -547,6 +551,7 @@ CONFIG_BLK_DEV_AMD74XX=y
 # CONFIG_BLK_DEV_JMICRON is not set
 # CONFIG_BLK_DEV_SC1200 is not set
 CONFIG_BLK_DEV_PIIX=y
+# CONFIG_BLK_DEV_IT8213 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
@@ -557,6 +562,7 @@ CONFIG_BLK_DEV_PIIX=y
 # CONFIG_BLK_DEV_SLC90E66 is not set
 # CONFIG_BLK_DEV_TRM290 is not set
 # CONFIG_BLK_DEV_VIA82CXXX is not set
+# CONFIG_BLK_DEV_TC86C001 is not set
 # CONFIG_IDE_ARM is not set
 CONFIG_BLK_DEV_IDEDMA=y
 # CONFIG_IDEDMA_IVB is not set
@@ -655,6 +661,7 @@ CONFIG_AIC79XX_DEBUG_MASK=0
 # Serial ATA (prod) and Parallel ATA (experimental) drivers
 #
 CONFIG_ATA=y
+# CONFIG_ATA_NONSTANDARD is not set
 CONFIG_SATA_AHCI=y
 CONFIG_SATA_SVW=y
 CONFIG_ATA_PIIX=y
@@ -670,6 +677,7 @@ CONFIG_SATA_SIL=y
 # CONFIG_SATA_ULI is not set
 CONFIG_SATA_VIA=y
 # CONFIG_SATA_VITESSE is not set
+# CONFIG_SATA_INIC162X is not set
 CONFIG_SATA_INTEL_COMBINED=y
 # CONFIG_PATA_ALI is not set
 # CONFIG_PATA_AMD is not set
@@ -687,6 +695,7 @@ CONFIG_SATA_INTEL_COMBINED=y
 # CONFIG_PATA_HPT3X2N is not set
 # CONFIG_PATA_HPT3X3 is not set
 # CONFIG_PATA_IT821X is not set
+# CONFIG_PATA_IT8213 is not set
 # CONFIG_PATA_JMICRON is not set
 # CONFIG_PATA_TRIFLEX is not set
 # CONFIG_PATA_MARVELL is not set
@@ -739,9 +748,7 @@ CONFIG_IEEE1394=y
 # Subsystem Options
 #
 # CONFIG_IEEE1394_VERBOSEDEBUG is not set
-# CONFIG_IEEE1394_OUI_DB is not set
 # CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set
-# CONFIG_IEEE1394_EXPORT_FULL_API is not set
 
 #
 # Device Drivers
@@ -766,6 +773,11 @@ CONFIG_IEEE1394_RAWIO=y
 #
 # CONFIG_I2O is not set
 
+#
+# Macintosh device drivers
+#
+# CONFIG_MAC_EMUMOUSEBTN is not set
+
 #
 # Network device support
 #
@@ -833,6 +845,7 @@ CONFIG_8139TOO=y
 # CONFIG_SUNDANCE is not set
 # CONFIG_TLAN is not set
 # CONFIG_VIA_RHINE is not set
+# CONFIG_SC92031 is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -855,11 +868,13 @@ CONFIG_SKY2=y
 CONFIG_TIGON3=y
 CONFIG_BNX2=y
 # CONFIG_QLA3XXX is not set
+# CONFIG_ATL1 is not set
 
 #
 # Ethernet (10000 Mbit)
 #
 # CONFIG_CHELSIO_T1 is not set
+# CONFIG_CHELSIO_T3 is not set
 # CONFIG_IXGB is not set
 # CONFIG_S2IO is not set
 # CONFIG_MYRI10GE is not set
@@ -1090,6 +1105,7 @@ CONFIG_SOUND=y
 # Open Sound System
 #
 CONFIG_SOUND_PRIME=y
+CONFIG_OBSOLETE_OSS=y
 # CONFIG_SOUND_BT878 is not set
 # CONFIG_SOUND_ES1371 is not set
 CONFIG_SOUND_ICH=y
@@ -1103,6 +1119,7 @@ CONFIG_SOUND_ICH=y
 # HID Devices
 #
 CONFIG_HID=y
+# CONFIG_HID_DEBUG is not set
 
 #
 # USB support
@@ -1117,10 +1134,8 @@ CONFIG_USB=y
 # Miscellaneous USB options
 #
 CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
 # CONFIG_USB_DYNAMIC_MINORS is not set
 # CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_MULTITHREAD_PROBE is not set
 # CONFIG_USB_OTG is not set
 
 #
@@ -1130,9 +1145,11 @@ CONFIG_USB_EHCI_HCD=y
 # CONFIG_USB_EHCI_SPLIT_ISO is not set
 # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
 # CONFIG_USB_EHCI_TT_NEWSCHED is not set
+# CONFIG_USB_EHCI_BIG_ENDIAN_MMIO 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_BIG_ENDIAN_DESC is not set
+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
 CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 CONFIG_USB_UHCI_HCD=y
 # CONFIG_USB_SL811_HCD is not set
@@ -1183,6 +1200,7 @@ CONFIG_USB_HID=y
 # CONFIG_USB_ATI_REMOTE2 is not set
 # CONFIG_USB_KEYSPAN_REMOTE is not set
 # CONFIG_USB_APPLETOUCH is not set
+# CONFIG_USB_GTCO is not set
 
 #
 # USB Imaging devices
@@ -1287,6 +1305,10 @@ CONFIG_USB_MON=y
 # DMA Devices
 #
 
+#
+# Auxiliary Display support
+#
+
 #
 # Virtualization
 #
@@ -1480,6 +1502,7 @@ CONFIG_UNUSED_SYMBOLS=y
 # CONFIG_DEBUG_FS is not set
 # CONFIG_HEADERS_CHECK is not set
 CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
 CONFIG_LOG_BUF_SHIFT=18
 CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_SCHEDSTATS is not set
@@ -1488,7 +1511,6 @@ CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_RT_MUTEX_TESTER is not set
 # CONFIG_DEBUG_SPINLOCK is not set
 # CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
 # CONFIG_DEBUG_LOCK_ALLOC is not set
 # CONFIG_PROVE_LOCKING is not set
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
@@ -1533,7 +1555,8 @@ CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
 CONFIG_ZLIB_INFLATE=y
 CONFIG_PLIST=y
-CONFIG_IOMAP_COPY=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_GENERIC_PENDING_IRQ=y
index 1e8988e558c54971fe08fbe9f868a72c7126a924..4ae3dcf1d2f0623f0ea3288fc8e400fdae730fb5 100644 (file)
@@ -18,7 +18,7 @@ obj-$(CONFIG_X86_MSR)         += msr.o
 obj-$(CONFIG_X86_CPUID)                += cpuid.o
 obj-$(CONFIG_MICROCODE)                += microcode.o
 obj-$(CONFIG_APM)              += apm.o
-obj-$(CONFIG_X86_SMP)          += smp.o smpboot.o
+obj-$(CONFIG_X86_SMP)          += smp.o smpboot.o tsc_sync.o
 obj-$(CONFIG_X86_TRAMPOLINE)   += trampoline.o
 obj-$(CONFIG_X86_MPPARSE)      += mpparse.o
 obj-$(CONFIG_X86_LOCAL_APIC)   += apic.o nmi.o
@@ -32,7 +32,6 @@ obj-$(CONFIG_KPROBES)         += kprobes.o
 obj-$(CONFIG_MODULES)          += module.o
 obj-y                          += sysenter.o vsyscall.o
 obj-$(CONFIG_ACPI_SRAT)        += srat.o
-obj-$(CONFIG_HPET_TIMER)       += time_hpet.o
 obj-$(CONFIG_EFI)              += efi.o efi_stub.o
 obj-$(CONFIG_DOUBLEFAULT)      += doublefault.o
 obj-$(CONFIG_VM86)             += vm86.o
@@ -40,8 +39,9 @@ obj-$(CONFIG_EARLY_PRINTK)    += early_printk.o
 obj-$(CONFIG_HPET_TIMER)       += hpet.o
 obj-$(CONFIG_K8_NB)            += k8.o
 
-# Make sure this is linked after any other paravirt_ops structs: see head.S
+obj-$(CONFIG_VMI)              += vmi.o vmitime.o
 obj-$(CONFIG_PARAVIRT)         += paravirt.o
+obj-y                          += pcspeaker.o
 
 EXTRA_AFLAGS   := -traditional
 
index e94aff6888cab7aca553870d908aacf04526914f..e5eb97a910ed8d82f74fc67802e04321eacdc82c 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <linux/init.h>
 #include <linux/acpi.h>
+#include <linux/acpi_pmtmr.h>
 #include <linux/efi.h>
 #include <linux/cpumask.h>
 #include <linux/module.h>
@@ -615,6 +616,7 @@ static int __init acpi_parse_sbf(struct acpi_table_header *table)
 }
 
 #ifdef CONFIG_HPET_TIMER
+#include <asm/hpet.h>
 
 static int __init acpi_parse_hpet(struct acpi_table_header *table)
 {
@@ -645,24 +647,11 @@ static int __init acpi_parse_hpet(struct acpi_table_header *table)
                hpet_res->end = (1 * 1024) - 1;
        }
 
-#ifdef CONFIG_X86_64
-       vxtime.hpet_address = hpet_tbl->address.address;
-
+       hpet_address = hpet_tbl->address.address;
        printk(KERN_INFO PREFIX "HPET id: %#x base: %#lx\n",
-               hpet_tbl->id, vxtime.hpet_address);
-
-       res_start = vxtime.hpet_address;
-#else                          /* X86 */
-       {
-               extern unsigned long hpet_address;
+              hpet_tbl->id, hpet_address);
 
-               hpet_address = hpet_tbl->address.address;
-               printk(KERN_INFO PREFIX "HPET id: %#x base: %#lx\n",
-                       hpet_tbl->id, hpet_address);
-
-               res_start = hpet_address;
-       }
-#endif                         /* X86 */
+       res_start = hpet_address;
 
        if (hpet_res) {
                hpet_res->start = res_start;
@@ -676,10 +665,6 @@ static int __init acpi_parse_hpet(struct acpi_table_header *table)
 #define        acpi_parse_hpet NULL
 #endif
 
-#ifdef CONFIG_X86_PM_TIMER
-extern u32 pmtmr_ioport;
-#endif
-
 static int __init acpi_parse_fadt(struct acpi_table_header *table)
 {
 
@@ -865,10 +850,9 @@ static inline int acpi_parse_madt_ioapic_entries(void)
 static void __init acpi_process_madt(void)
 {
 #ifdef CONFIG_X86_LOCAL_APIC
-       int count, error;
+       int error;
 
-       count = acpi_table_parse(ACPI_SIG_MADT, acpi_parse_madt);
-       if (count >= 1) {
+       if (!acpi_table_parse(ACPI_SIG_MADT, acpi_parse_madt)) {
 
                /*
                 * Parse MADT LAPIC entries
index 776d9be26af9ea5906bc0e04798878e69d3b51a3..9655c233e6f144804c275f9b8eada53fb27f8f8a 100644 (file)
@@ -25,6 +25,8 @@
 #include <linux/kernel_stat.h>
 #include <linux/sysdev.h>
 #include <linux/cpu.h>
+#include <linux/clockchips.h>
+#include <linux/acpi_pmtmr.h>
 #include <linux/module.h>
 
 #include <asm/atomic.h>
@@ -36,6 +38,7 @@
 #include <asm/hpet.h>
 #include <asm/i8253.h>
 #include <asm/nmi.h>
+#include <asm/idle.h>
 
 #include <mach_apic.h>
 #include <mach_apicdef.h>
 #include "io_ports.h"
 
 /*
- * cpu_mask that denotes the CPUs that needs timer interrupt coming in as
- * IPIs in place of local APIC timers
+ * Sanity check
  */
-static cpumask_t timer_bcast_ipi;
+#if (SPURIOUS_APIC_VECTOR & 0x0F) != 0x0F
+# error SPURIOUS_APIC_VECTOR definition error
+#endif
 
 /*
  * Knob to control our willingness to enable the local APIC.
+ *
+ * -1=force-disable, +1=force-enable
  */
-static int enable_local_apic __initdata = 0; /* -1=force-disable, +1=force-enable */
-
-static inline void lapic_disable(void)
-{
-       enable_local_apic = -1;
-       clear_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability);
-}
+static int enable_local_apic __initdata = 0;
 
-static inline void lapic_enable(void)
-{
-       enable_local_apic = 1;
-}
+/* Local APIC timer verification ok */
+static int local_apic_timer_verify_ok;
 
 /*
- * Debug level
+ * Debug level, exported for io_apic.c
  */
 int apic_verbosity;
 
+static unsigned int calibration_result;
 
+static int lapic_next_event(unsigned long delta,
+                           struct clock_event_device *evt);
+static void lapic_timer_setup(enum clock_event_mode mode,
+                             struct clock_event_device *evt);
+static void lapic_timer_broadcast(cpumask_t mask);
 static void apic_pm_activate(void);
 
+/*
+ * The local apic timer can be used for any function which is CPU local.
+ */
+static struct clock_event_device lapic_clockevent = {
+       .name           = "lapic",
+       .features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT
+                       | CLOCK_EVT_FEAT_C3STOP | CLOCK_EVT_FEAT_DUMMY,
+       .shift          = 32,
+       .set_mode       = lapic_timer_setup,
+       .set_next_event = lapic_next_event,
+       .broadcast      = lapic_timer_broadcast,
+       .rating         = 100,
+       .irq            = -1,
+};
+static DEFINE_PER_CPU(struct clock_event_device, lapic_events);
+
+/* Local APIC was disabled by the BIOS and enabled by the kernel */
+static int enabled_via_apicbase;
+
+/*
+ * Get the LAPIC version
+ */
+static inline int lapic_get_version(void)
+{
+       return GET_APIC_VERSION(apic_read(APIC_LVR));
+}
+
+/*
+ * Check, if the APIC is integrated or a seperate chip
+ */
+static inline int lapic_is_integrated(void)
+{
+       return APIC_INTEGRATED(lapic_get_version());
+}
+
+/*
+ * Check, whether this is a modern or a first generation APIC
+ */
 static int modern_apic(void)
 {
-       unsigned int lvr, version;
        /* AMD systems use old APIC versions, so check the CPU */
        if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
-               boot_cpu_data.x86 >= 0xf)
+           boot_cpu_data.x86 >= 0xf)
                return 1;
-       lvr = apic_read(APIC_LVR);
-       version = GET_APIC_VERSION(lvr);
-       return version >= 0x14;
+       return lapic_get_version() >= 0x14;
+}
+
+/**
+ * enable_NMI_through_LVT0 - enable NMI through local vector table 0
+ */
+void enable_NMI_through_LVT0 (void * dummy)
+{
+       unsigned int v = APIC_DM_NMI;
+
+       /* Level triggered for 82489DX */
+       if (!lapic_is_integrated())
+               v |= APIC_LVT_LEVEL_TRIGGER;
+       apic_write_around(APIC_LVT0, v);
+}
+
+/**
+ * get_physical_broadcast - Get number of physical broadcast IDs
+ */
+int get_physical_broadcast(void)
+{
+       return modern_apic() ? 0xff : 0xf;
+}
+
+/**
+ * lapic_get_maxlvt - get the maximum number of local vector table entries
+ */
+int lapic_get_maxlvt(void)
+{
+       unsigned int v = apic_read(APIC_LVR);
+
+       /* 82489DXs do not report # of LVT entries. */
+       return APIC_INTEGRATED(GET_APIC_VERSION(v)) ? GET_APIC_MAXLVT(v) : 2;
 }
 
 /*
- * 'what should we do if we get a hw irq event on an illegal vector'.
- * each architecture has to answer this themselves.
+ * Local APIC timer
  */
-void ack_bad_irq(unsigned int irq)
+
+/* Clock divisor is set to 16 */
+#define APIC_DIVISOR 16
+
+/*
+ * This function sets up the local APIC timer, with a timeout of
+ * 'clocks' APIC bus clock. During calibration we actually call
+ * this function twice on the boot CPU, once with a bogus timeout
+ * value, second time for real. The other (noncalibrating) CPUs
+ * call this function only once, with the real, calibrated value.
+ *
+ * We do reads before writes even if unnecessary, to get around the
+ * P5 APIC double write bug.
+ */
+static void __setup_APIC_LVTT(unsigned int clocks, int oneshot, int irqen)
 {
-       printk("unexpected IRQ trap at vector %02x\n", irq);
+       unsigned int lvtt_value, tmp_value;
+
+       lvtt_value = LOCAL_TIMER_VECTOR;
+       if (!oneshot)
+               lvtt_value |= APIC_LVT_TIMER_PERIODIC;
+       if (!lapic_is_integrated())
+               lvtt_value |= SET_APIC_TIMER_BASE(APIC_TIMER_BASE_DIV);
+
+       if (!irqen)
+               lvtt_value |= APIC_LVT_MASKED;
+
+       apic_write_around(APIC_LVTT, lvtt_value);
+
        /*
-        * Currently unexpected vectors happen only on SMP and APIC.
-        * We _must_ ack these because every local APIC has only N
-        * irq slots per priority level, and a 'hanging, unacked' IRQ
-        * holds up an irq slot - in excessive cases (when multiple
-        * unexpected vectors occur) that might lock up the APIC
-        * completely.
-        * But only ack when the APIC is enabled -AK
+        * Divide PICLK by 16
         */
-       if (cpu_has_apic)
-               ack_APIC_irq();
+       tmp_value = apic_read(APIC_TDCR);
+       apic_write_around(APIC_TDCR, (tmp_value
+                               & ~(APIC_TDR_DIV_1 | APIC_TDR_DIV_TMBASE))
+                               | APIC_TDR_DIV_16);
+
+       if (!oneshot)
+               apic_write_around(APIC_TMICT, clocks/APIC_DIVISOR);
 }
 
-void __init apic_intr_init(void)
+/*
+ * Program the next event, relative to now
+ */
+static int lapic_next_event(unsigned long delta,
+                           struct clock_event_device *evt)
+{
+       apic_write_around(APIC_TMICT, delta);
+       return 0;
+}
+
+/*
+ * Setup the lapic timer in periodic or oneshot mode
+ */
+static void lapic_timer_setup(enum clock_event_mode mode,
+                             struct clock_event_device *evt)
+{
+       unsigned long flags;
+       unsigned int v;
+
+       /* Lapic used for broadcast ? */
+       if (!local_apic_timer_verify_ok)
+               return;
+
+       local_irq_save(flags);
+
+       switch (mode) {
+       case CLOCK_EVT_MODE_PERIODIC:
+       case CLOCK_EVT_MODE_ONESHOT:
+               __setup_APIC_LVTT(calibration_result,
+                                 mode != CLOCK_EVT_MODE_PERIODIC, 1);
+               break;
+       case CLOCK_EVT_MODE_UNUSED:
+       case CLOCK_EVT_MODE_SHUTDOWN:
+               v = apic_read(APIC_LVTT);
+               v |= (APIC_LVT_MASKED | LOCAL_TIMER_VECTOR);
+               apic_write_around(APIC_LVTT, v);
+               break;
+       }
+
+       local_irq_restore(flags);
+}
+
+/*
+ * Local APIC timer broadcast function
+ */
+static void lapic_timer_broadcast(cpumask_t mask)
 {
 #ifdef CONFIG_SMP
-       smp_intr_init();
+       send_IPI_mask(mask, LOCAL_TIMER_VECTOR);
 #endif
-       /* self generated IPI for local APIC timer */
-       set_intr_gate(LOCAL_TIMER_VECTOR, apic_timer_interrupt);
+}
 
-       /* IPI vectors for APIC spurious and error interrupts */
-       set_intr_gate(SPURIOUS_APIC_VECTOR, spurious_interrupt);
-       set_intr_gate(ERROR_APIC_VECTOR, error_interrupt);
+/*
+ * Setup the local APIC timer for this CPU. Copy the initilized values
+ * of the boot CPU and register the clock event in the framework.
+ */
+static void __devinit setup_APIC_timer(void)
+{
+       struct clock_event_device *levt = &__get_cpu_var(lapic_events);
 
-       /* thermal monitor LVT interrupt */
-#ifdef CONFIG_X86_MCE_P4THERMAL
-       set_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt);
-#endif
+       memcpy(levt, &lapic_clockevent, sizeof(*levt));
+       levt->cpumask = cpumask_of_cpu(smp_processor_id());
+
+       clockevents_register_device(levt);
 }
 
-/* Using APIC to generate smp_local_timer_interrupt? */
-int using_apic_timer __read_mostly = 0;
+/*
+ * In this functions we calibrate APIC bus clocks to the external timer.
+ *
+ * We want to do the calibration only once since we want to have local timer
+ * irqs syncron. CPUs connected by the same APIC bus have the very same bus
+ * frequency.
+ *
+ * This was previously done by reading the PIT/HPET and waiting for a wrap
+ * around to find out, that a tick has elapsed. I have a box, where the PIT
+ * readout is broken, so it never gets out of the wait loop again. This was
+ * also reported by others.
+ *
+ * Monitoring the jiffies value is inaccurate and the clockevents
+ * infrastructure allows us to do a simple substitution of the interrupt
+ * handler.
+ *
+ * The calibration routine also uses the pm_timer when possible, as the PIT
+ * happens to run way too slow (factor 2.3 on my VAIO CoreDuo, which goes
+ * back to normal later in the boot process).
+ */
+
+#define LAPIC_CAL_LOOPS                (HZ/10)
 
-static int enabled_via_apicbase;
+static __initdata volatile int lapic_cal_loops = -1;
+static __initdata long lapic_cal_t1, lapic_cal_t2;
+static __initdata unsigned long long lapic_cal_tsc1, lapic_cal_tsc2;
+static __initdata unsigned long lapic_cal_pm1, lapic_cal_pm2;
+static __initdata unsigned long lapic_cal_j1, lapic_cal_j2;
 
-void enable_NMI_through_LVT0 (void * dummy)
+/*
+ * Temporary interrupt handler.
+ */
+static void __init lapic_cal_handler(struct clock_event_device *dev)
 {
-       unsigned int v, ver;
+       unsigned long long tsc = 0;
+       long tapic = apic_read(APIC_TMCCT);
+       unsigned long pm = acpi_pm_read_early();
 
-       ver = apic_read(APIC_LVR);
-       ver = GET_APIC_VERSION(ver);
-       v = APIC_DM_NMI;                        /* unmask and set to NMI */
-       if (!APIC_INTEGRATED(ver))              /* 82489DX */
-               v |= APIC_LVT_LEVEL_TRIGGER;
-       apic_write_around(APIC_LVT0, v);
+       if (cpu_has_tsc)
+               rdtscll(tsc);
+
+       switch (lapic_cal_loops++) {
+       case 0:
+               lapic_cal_t1 = tapic;
+               lapic_cal_tsc1 = tsc;
+               lapic_cal_pm1 = pm;
+               lapic_cal_j1 = jiffies;
+               break;
+
+       case LAPIC_CAL_LOOPS:
+               lapic_cal_t2 = tapic;
+               lapic_cal_tsc2 = tsc;
+               if (pm < lapic_cal_pm1)
+                       pm += ACPI_PM_OVRRUN;
+               lapic_cal_pm2 = pm;
+               lapic_cal_j2 = jiffies;
+               break;
+       }
 }
 
-int get_physical_broadcast(void)
+/*
+ * Setup the boot APIC
+ *
+ * Calibrate and verify the result.
+ */
+void __init setup_boot_APIC_clock(void)
 {
-       if (modern_apic())
-               return 0xff;
-       else
-               return 0xf;
+       struct clock_event_device *levt = &__get_cpu_var(lapic_events);
+       const long pm_100ms = PMTMR_TICKS_PER_SEC/10;
+       const long pm_thresh = pm_100ms/100;
+       void (*real_handler)(struct clock_event_device *dev);
+       unsigned long deltaj;
+       long delta, deltapm;
+
+       apic_printk(APIC_VERBOSE, "Using local APIC timer interrupts.\n"
+                   "calibrating APIC timer ...\n");
+
+       local_irq_disable();
+
+       /* Replace the global interrupt handler */
+       real_handler = global_clock_event->event_handler;
+       global_clock_event->event_handler = lapic_cal_handler;
+
+       /*
+        * Setup the APIC counter to 1e9. There is no way the lapic
+        * can underflow in the 100ms detection time frame
+        */
+       __setup_APIC_LVTT(1000000000, 0, 0);
+
+       /* Let the interrupts run */
+       local_irq_enable();
+
+       while(lapic_cal_loops <= LAPIC_CAL_LOOPS);
+
+       local_irq_disable();
+
+       /* Restore the real event handler */
+       global_clock_event->event_handler = real_handler;
+
+       /* Build delta t1-t2 as apic timer counts down */
+       delta = lapic_cal_t1 - lapic_cal_t2;
+       apic_printk(APIC_VERBOSE, "... lapic delta = %ld\n", delta);
+
+       /* Check, if the PM timer is available */
+       deltapm = lapic_cal_pm2 - lapic_cal_pm1;
+       apic_printk(APIC_VERBOSE, "... PM timer delta = %ld\n", deltapm);
+
+       if (deltapm) {
+               unsigned long mult;
+               u64 res;
+
+               mult = clocksource_hz2mult(PMTMR_TICKS_PER_SEC, 22);
+
+               if (deltapm > (pm_100ms - pm_thresh) &&
+                   deltapm < (pm_100ms + pm_thresh)) {
+                       apic_printk(APIC_VERBOSE, "... PM timer result ok\n");
+               } else {
+                       res = (((u64) deltapm) *  mult) >> 22;
+                       do_div(res, 1000000);
+                       printk(KERN_WARNING "APIC calibration not consistent "
+                              "with PM Timer: %ldms instead of 100ms\n",
+                              (long)res);
+                       /* Correct the lapic counter value */
+                       res = (((u64) delta ) * pm_100ms);
+                       do_div(res, deltapm);
+                       printk(KERN_INFO "APIC delta adjusted to PM-Timer: "
+                              "%lu (%ld)\n", (unsigned long) res, delta);
+                       delta = (long) res;
+               }
+       }
+
+       /* Calculate the scaled math multiplication factor */
+       lapic_clockevent.mult = div_sc(delta, TICK_NSEC * LAPIC_CAL_LOOPS, 32);
+       lapic_clockevent.max_delta_ns =
+               clockevent_delta2ns(0x7FFFFF, &lapic_clockevent);
+       lapic_clockevent.min_delta_ns =
+               clockevent_delta2ns(0xF, &lapic_clockevent);
+
+       calibration_result = (delta * APIC_DIVISOR) / LAPIC_CAL_LOOPS;
+
+       apic_printk(APIC_VERBOSE, "..... delta %ld\n", delta);
+       apic_printk(APIC_VERBOSE, "..... mult: %ld\n", lapic_clockevent.mult);
+       apic_printk(APIC_VERBOSE, "..... calibration result: %u\n",
+                   calibration_result);
+
+       if (cpu_has_tsc) {
+               delta = (long)(lapic_cal_tsc2 - lapic_cal_tsc1);
+               apic_printk(APIC_VERBOSE, "..... CPU clock speed is "
+                           "%ld.%04ld MHz.\n",
+                           (delta / LAPIC_CAL_LOOPS) / (1000000 / HZ),
+                           (delta / LAPIC_CAL_LOOPS) % (1000000 / HZ));
+       }
+
+       apic_printk(APIC_VERBOSE, "..... host bus clock speed is "
+                   "%u.%04u MHz.\n",
+                   calibration_result / (1000000 / HZ),
+                   calibration_result % (1000000 / HZ));
+
+
+       apic_printk(APIC_VERBOSE, "... verify APIC timer\n");
+
+       /*
+        * Setup the apic timer manually
+        */
+       local_apic_timer_verify_ok = 1;
+       levt->event_handler = lapic_cal_handler;
+       lapic_timer_setup(CLOCK_EVT_MODE_PERIODIC, levt);
+       lapic_cal_loops = -1;
+
+       /* Let the interrupts run */
+       local_irq_enable();
+
+       while(lapic_cal_loops <= LAPIC_CAL_LOOPS);
+
+       local_irq_disable();
+
+       /* Stop the lapic timer */
+       lapic_timer_setup(CLOCK_EVT_MODE_SHUTDOWN, levt);
+
+       local_irq_enable();
+
+       /* Jiffies delta */
+       deltaj = lapic_cal_j2 - lapic_cal_j1;
+       apic_printk(APIC_VERBOSE, "... jiffies delta = %lu\n", deltaj);
+
+       /* Check, if the PM timer is available */
+       deltapm = lapic_cal_pm2 - lapic_cal_pm1;
+       apic_printk(APIC_VERBOSE, "... PM timer delta = %ld\n", deltapm);
+
+       local_apic_timer_verify_ok = 0;
+
+       if (deltapm) {
+               if (deltapm > (pm_100ms - pm_thresh) &&
+                   deltapm < (pm_100ms + pm_thresh)) {
+                       apic_printk(APIC_VERBOSE, "... PM timer result ok\n");
+                       /* Check, if the jiffies result is consistent */
+                       if (deltaj < LAPIC_CAL_LOOPS-2 ||
+                           deltaj > LAPIC_CAL_LOOPS+2) {
+                               /*
+                                * Not sure, what we can do about this one.
+                                * When high resultion timers are active
+                                * and the lapic timer does not stop in C3
+                                * we are fine. Otherwise more trouble might
+                                * be waiting. -- tglx
+                                */
+                               printk(KERN_WARNING "Global event device %s "
+                                      "has wrong frequency "
+                                      "(%lu ticks instead of %d)\n",
+                                      global_clock_event->name, deltaj,
+                                      LAPIC_CAL_LOOPS);
+                       }
+                       local_apic_timer_verify_ok = 1;
+               }
+       } else {
+               /* Check, if the jiffies result is consistent */
+               if (deltaj >= LAPIC_CAL_LOOPS-2 &&
+                   deltaj <= LAPIC_CAL_LOOPS+2) {
+                       apic_printk(APIC_VERBOSE, "... jiffies result ok\n");
+                       local_apic_timer_verify_ok = 1;
+               }
+       }
+
+       if (!local_apic_timer_verify_ok) {
+               printk(KERN_WARNING
+                      "APIC timer disabled due to verification failure.\n");
+               /* No broadcast on UP ! */
+               if (num_possible_cpus() == 1)
+                       return;
+       } else
+               lapic_clockevent.features &= ~CLOCK_EVT_FEAT_DUMMY;
+
+       /* Setup the lapic or request the broadcast */
+       setup_APIC_timer();
+}
+
+void __devinit setup_secondary_APIC_clock(void)
+{
+       setup_APIC_timer();
 }
 
-int get_maxlvt(void)
+/*
+ * The guts of the apic timer interrupt
+ */
+static void local_apic_timer_interrupt(void)
 {
-       unsigned int v, ver, maxlvt;
+       int cpu = smp_processor_id();
+       struct clock_event_device *evt = &per_cpu(lapic_events, cpu);
 
-       v = apic_read(APIC_LVR);
-       ver = GET_APIC_VERSION(v);
-       /* 82489DXs do not report # of LVT entries. */
-       maxlvt = APIC_INTEGRATED(ver) ? GET_APIC_MAXLVT(v) : 2;
-       return maxlvt;
+       /*
+        * Normally we should not be here till LAPIC has been initialized but
+        * in some cases like kdump, its possible that there is a pending LAPIC
+        * timer interrupt from previous kernel's context and is delivered in
+        * new kernel the moment interrupts are enabled.
+        *
+        * Interrupts are enabled early and LAPIC is setup much later, hence
+        * its possible that when we get here evt->event_handler is NULL.
+        * Check for event_handler being NULL and discard the interrupt as
+        * spurious.
+        */
+       if (!evt->event_handler) {
+               printk(KERN_WARNING
+                      "Spurious LAPIC timer interrupt on cpu %d\n", cpu);
+               /* Switch it off */
+               lapic_timer_setup(CLOCK_EVT_MODE_SHUTDOWN, evt);
+               return;
+       }
+
+       per_cpu(irq_stat, cpu).apic_timer_irqs++;
+
+       evt->event_handler(evt);
+}
+
+/*
+ * Local APIC timer interrupt. This is the most natural way for doing
+ * local interrupts, but local timer interrupts can be emulated by
+ * broadcast interrupts too. [in case the hw doesn't support APIC timers]
+ *
+ * [ if a single-CPU system runs an SMP kernel then we call the local
+ *   interrupt as well. Thus we cannot inline the local irq ... ]
+ */
+
+void fastcall smp_apic_timer_interrupt(struct pt_regs *regs)
+{
+       struct pt_regs *old_regs = set_irq_regs(regs);
+
+       /*
+        * NOTE! We'd better ACK the irq immediately,
+        * because timer handling can be slow.
+        */
+       ack_APIC_irq();
+       /*
+        * update_process_times() expects us to have done irq_enter().
+        * Besides, if we don't timer interrupts ignore the global
+        * interrupt lock, which is the WrongThing (tm) to do.
+        */
+       exit_idle();
+       irq_enter();
+       local_apic_timer_interrupt();
+       irq_exit();
+
+       set_irq_regs(old_regs);
+}
+
+int setup_profiling_timer(unsigned int multiplier)
+{
+       return -EINVAL;
 }
 
+/*
+ * Local APIC start and shutdown
+ */
+
+/**
+ * clear_local_APIC - shutdown the local APIC
+ *
+ * This is called, when a CPU is disabled and before rebooting, so the state of
+ * the local APIC has no dangling leftovers. Also used to cleanout any BIOS
+ * leftovers during boot.
+ */
 void clear_local_APIC(void)
 {
-       int maxlvt;
+       int maxlvt = lapic_get_maxlvt();
        unsigned long v;
 
-       maxlvt = get_maxlvt();
-
        /*
         * Masking an LVT entry can trigger a local APIC error
         * if the vector is zero. Mask LVTERR first to prevent this.
@@ -189,7 +613,7 @@ void clear_local_APIC(void)
                apic_write_around(APIC_LVTPC, v | APIC_LVT_MASKED);
        }
 
-/* lets not touch this if we didn't frob it */
+       /* lets not touch this if we didn't frob it */
 #ifdef CONFIG_X86_MCE_P4THERMAL
        if (maxlvt >= 5) {
                v = apic_read(APIC_LVTTHMR);
@@ -211,90 +635,23 @@ void clear_local_APIC(void)
        if (maxlvt >= 5)
                apic_write_around(APIC_LVTTHMR, APIC_LVT_MASKED);
 #endif
-       v = GET_APIC_VERSION(apic_read(APIC_LVR));
-       if (APIC_INTEGRATED(v)) {       /* !82489DX */
-               if (maxlvt > 3)         /* Due to Pentium errata 3AP and 11AP. */
+       /* Integrated APIC (!82489DX) ? */
+       if (lapic_is_integrated()) {
+               if (maxlvt > 3)
+                       /* Clear ESR due to Pentium errata 3AP and 11AP */
                        apic_write(APIC_ESR, 0);
                apic_read(APIC_ESR);
        }
 }
 
-void __init connect_bsp_APIC(void)
+/**
+ * disable_local_APIC - clear and disable the local APIC
+ */
+void disable_local_APIC(void)
 {
-       if (pic_mode) {
-               /*
-                * Do not trust the local APIC being empty at bootup.
-                */
-               clear_local_APIC();
-               /*
-                * PIC mode, enable APIC mode in the IMCR, i.e.
-                * connect BSP's local APIC to INT and NMI lines.
-                */
-               apic_printk(APIC_VERBOSE, "leaving PIC mode, "
-                               "enabling APIC mode.\n");
-               outb(0x70, 0x22);
-               outb(0x01, 0x23);
-       }
-       enable_apic_mode();
-}
+       unsigned long value;
 
-void disconnect_bsp_APIC(int virt_wire_setup)
-{
-       if (pic_mode) {
-               /*
-                * Put the board back into PIC mode (has an effect
-                * only on certain older boards).  Note that APIC
-                * interrupts, including IPIs, won't work beyond
-                * this point!  The only exception are INIT IPIs.
-                */
-               apic_printk(APIC_VERBOSE, "disabling APIC mode, "
-                               "entering PIC mode.\n");
-               outb(0x70, 0x22);
-               outb(0x00, 0x23);
-       }
-       else {
-               /* Go back to Virtual Wire compatibility mode */
-               unsigned long value;
-
-               /* For the spurious interrupt use vector F, and enable it */
-               value = apic_read(APIC_SPIV);
-               value &= ~APIC_VECTOR_MASK;
-               value |= APIC_SPIV_APIC_ENABLED;
-               value |= 0xf;
-               apic_write_around(APIC_SPIV, value);
-
-               if (!virt_wire_setup) {
-                       /* For LVT0 make it edge triggered, active high, external and enabled */
-                       value = apic_read(APIC_LVT0);
-                       value &= ~(APIC_MODE_MASK | APIC_SEND_PENDING |
-                               APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR |
-                               APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED );
-                       value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
-                       value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_EXTINT);
-                       apic_write_around(APIC_LVT0, value);
-               }
-               else {
-                       /* Disable LVT0 */
-                       apic_write_around(APIC_LVT0, APIC_LVT_MASKED);
-               }
-
-               /* For LVT1 make it edge triggered, active high, nmi and enabled */
-               value = apic_read(APIC_LVT1);
-               value &= ~(
-                       APIC_MODE_MASK | APIC_SEND_PENDING |
-                       APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR |
-                       APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED);
-               value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
-               value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_NMI);
-               apic_write_around(APIC_LVT1, value);
-       }
-}
-
-void disable_local_APIC(void)
-{
-       unsigned long value;
-
-       clear_local_APIC();
+       clear_local_APIC();
 
        /*
         * Disable APIC (implies clearing of registers
@@ -304,14 +661,41 @@ void disable_local_APIC(void)
        value &= ~APIC_SPIV_APIC_ENABLED;
        apic_write_around(APIC_SPIV, value);
 
+       /*
+        * When LAPIC was disabled by the BIOS and enabled by the kernel,
+        * restore the disabled state.
+        */
        if (enabled_via_apicbase) {
                unsigned int l, h;
+
                rdmsr(MSR_IA32_APICBASE, l, h);
                l &= ~MSR_IA32_APICBASE_ENABLE;
                wrmsr(MSR_IA32_APICBASE, l, h);
        }
 }
 
+/*
+ * If Linux enabled the LAPIC against the BIOS default disable it down before
+ * re-entering the BIOS on shutdown.  Otherwise the BIOS may get confused and
+ * not power-off.  Additionally clear all LVT entries before disable_local_APIC
+ * for the case where Linux didn't enable the LAPIC.
+ */
+void lapic_shutdown(void)
+{
+       unsigned long flags;
+
+       if (!cpu_has_apic)
+               return;
+
+       local_irq_save(flags);
+       clear_local_APIC();
+
+       if (enabled_via_apicbase)
+               disable_local_APIC();
+
+       local_irq_restore(flags);
+}
+
 /*
  * This is to verify that we're looking at a real local APIC.
  * Check these against your board if the CPUs aren't getting
@@ -344,7 +728,7 @@ int __init verify_local_APIC(void)
        reg1 = GET_APIC_VERSION(reg0);
        if (reg1 == 0x00 || reg1 == 0xff)
                return 0;
-       reg1 = get_maxlvt();
+       reg1 = lapic_get_maxlvt();
        if (reg1 < 0x02 || reg1 == 0xff)
                return 0;
 
@@ -367,10 +751,15 @@ int __init verify_local_APIC(void)
        return 1;
 }
 
+/**
+ * sync_Arb_IDs - synchronize APIC bus arbitration IDs
+ */
 void __init sync_Arb_IDs(void)
 {
-       /* Unsupported on P4 - see Intel Dev. Manual Vol. 3, Ch. 8.6.1
-          And not needed on AMD */
+       /*
+        * Unsupported on P4 - see Intel Dev. Manual Vol. 3, Ch. 8.6.1 And not
+        * needed on AMD.
+        */
        if (modern_apic())
                return;
        /*
@@ -383,14 +772,12 @@ void __init sync_Arb_IDs(void)
                                | APIC_DM_INIT);
 }
 
-extern void __error_in_apic_c (void);
-
 /*
  * An initial setup of the virtual wire mode.
  */
 void __init init_bsp_APIC(void)
 {
-       unsigned long value, ver;
+       unsigned long value;
 
        /*
         * Don't do the setup now if we have a SMP BIOS as the
@@ -399,9 +786,6 @@ void __init init_bsp_APIC(void)
        if (smp_found_config || !cpu_has_apic)
                return;
 
-       value = apic_read(APIC_LVR);
-       ver = GET_APIC_VERSION(value);
-
        /*
         * Do not trust the local APIC being empty at bootup.
         */
@@ -413,9 +797,10 @@ void __init init_bsp_APIC(void)
        value = apic_read(APIC_SPIV);
        value &= ~APIC_VECTOR_MASK;
        value |= APIC_SPIV_APIC_ENABLED;
-       
+
        /* This bit is reserved on P4/Xeon and should be cleared */
-       if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) && (boot_cpu_data.x86 == 15))
+       if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) &&
+           (boot_cpu_data.x86 == 15))
                value &= ~APIC_SPIV_FOCUS_DISABLED;
        else
                value |= APIC_SPIV_FOCUS_DISABLED;
@@ -427,14 +812,17 @@ void __init init_bsp_APIC(void)
         */
        apic_write_around(APIC_LVT0, APIC_DM_EXTINT);
        value = APIC_DM_NMI;
-       if (!APIC_INTEGRATED(ver))              /* 82489DX */
+       if (!lapic_is_integrated())             /* 82489DX */
                value |= APIC_LVT_LEVEL_TRIGGER;
        apic_write_around(APIC_LVT1, value);
 }
 
+/**
+ * setup_local_APIC - setup the local APIC
+ */
 void __devinit setup_local_APIC(void)
 {
-       unsigned long oldvalue, value, ver, maxlvt;
+       unsigned long oldvalue, value, maxlvt, integrated;
        int i, j;
 
        /* Pound the ESR really hard over the head with a big hammer - mbligh */
@@ -445,11 +833,7 @@ void __devinit setup_local_APIC(void)
                apic_write(APIC_ESR, 0);
        }
 
-       value = apic_read(APIC_LVR);
-       ver = GET_APIC_VERSION(value);
-
-       if ((SPURIOUS_APIC_VECTOR & 0x0f) != 0x0f)
-               __error_in_apic_c();
+       integrated = lapic_is_integrated();
 
        /*
         * Double-check whether this APIC is really registered.
@@ -520,13 +904,10 @@ void __devinit setup_local_APIC(void)
         * like LRU than MRU (the short-term load is more even across CPUs).
         * See also the comment in end_level_ioapic_irq().  --macro
         */
-#if 1
+
        /* Enable focus processor (bit==0) */
        value &= ~APIC_SPIV_FOCUS_DISABLED;
-#else
-       /* Disable focus processor (bit==1) */
-       value |= APIC_SPIV_FOCUS_DISABLED;
-#endif
+
        /*
         * Set spurious IRQ vector
         */
@@ -562,17 +943,18 @@ void __devinit setup_local_APIC(void)
                value = APIC_DM_NMI;
        else
                value = APIC_DM_NMI | APIC_LVT_MASKED;
-       if (!APIC_INTEGRATED(ver))              /* 82489DX */
+       if (!integrated)                /* 82489DX */
                value |= APIC_LVT_LEVEL_TRIGGER;
        apic_write_around(APIC_LVT1, value);
 
-       if (APIC_INTEGRATED(ver) && !esr_disable) {             /* !82489DX */
-               maxlvt = get_maxlvt();
+       if (integrated && !esr_disable) {               /* !82489DX */
+               maxlvt = lapic_get_maxlvt();
                if (maxlvt > 3)         /* Due to the Pentium erratum 3AP. */
                        apic_write(APIC_ESR, 0);
                oldvalue = apic_read(APIC_ESR);
 
-               value = ERROR_APIC_VECTOR;      // enables sending errors
+               /* enables sending errors */
+               value = ERROR_APIC_VECTOR;
                apic_write_around(APIC_LVTERR, value);
                /*
                 * spec says clear errors after enabling vector.
@@ -585,207 +967,30 @@ void __devinit setup_local_APIC(void)
                                "vector: 0x%08lx  after: 0x%08lx\n",
                                oldvalue, value);
        } else {
-               if (esr_disable)        
-                       /* 
-                        * Something untraceble is creating bad interrupts on 
+               if (esr_disable)
+                       /*
+                        * Something untraceble is creating bad interrupts on
                         * secondary quads ... for the moment, just leave the
                         * ESR disabled - we can't do anything useful with the
                         * errors anyway - mbligh
                         */
-                       printk("Leaving ESR disabled.\n");
-               else 
-                       printk("No ESR for 82489DX.\n");
+                       printk(KERN_INFO "Leaving ESR disabled.\n");
+               else
+                       printk(KERN_INFO "No ESR for 82489DX.\n");
        }
 
+       /* Disable the local apic timer */
+       value = apic_read(APIC_LVTT);
+       value |= (APIC_LVT_MASKED | LOCAL_TIMER_VECTOR);
+       apic_write_around(APIC_LVTT, value);
+
        setup_apic_nmi_watchdog(NULL);
        apic_pm_activate();
 }
 
 /*
- * If Linux enabled the LAPIC against the BIOS default
- * disable it down before re-entering the BIOS on shutdown.
- * Otherwise the BIOS may get confused and not power-off.
- * Additionally clear all LVT entries before disable_local_APIC
- * for the case where Linux didn't enable the LAPIC.
- */
-void lapic_shutdown(void)
-{
-       unsigned long flags;
-
-       if (!cpu_has_apic)
-               return;
-
-       local_irq_save(flags);
-       clear_local_APIC();
-
-       if (enabled_via_apicbase)
-               disable_local_APIC();
-
-       local_irq_restore(flags);
-}
-
-#ifdef CONFIG_PM
-
-static struct {
-       int active;
-       /* r/w apic fields */
-       unsigned int apic_id;
-       unsigned int apic_taskpri;
-       unsigned int apic_ldr;
-       unsigned int apic_dfr;
-       unsigned int apic_spiv;
-       unsigned int apic_lvtt;
-       unsigned int apic_lvtpc;
-       unsigned int apic_lvt0;
-       unsigned int apic_lvt1;
-       unsigned int apic_lvterr;
-       unsigned int apic_tmict;
-       unsigned int apic_tdcr;
-       unsigned int apic_thmr;
-} apic_pm_state;
-
-static int lapic_suspend(struct sys_device *dev, pm_message_t state)
-{
-       unsigned long flags;
-       int maxlvt;
-
-       if (!apic_pm_state.active)
-               return 0;
-
-       maxlvt = get_maxlvt();
-
-       apic_pm_state.apic_id = apic_read(APIC_ID);
-       apic_pm_state.apic_taskpri = apic_read(APIC_TASKPRI);
-       apic_pm_state.apic_ldr = apic_read(APIC_LDR);
-       apic_pm_state.apic_dfr = apic_read(APIC_DFR);
-       apic_pm_state.apic_spiv = apic_read(APIC_SPIV);
-       apic_pm_state.apic_lvtt = apic_read(APIC_LVTT);
-       if (maxlvt >= 4)
-               apic_pm_state.apic_lvtpc = apic_read(APIC_LVTPC);
-       apic_pm_state.apic_lvt0 = apic_read(APIC_LVT0);
-       apic_pm_state.apic_lvt1 = apic_read(APIC_LVT1);
-       apic_pm_state.apic_lvterr = apic_read(APIC_LVTERR);
-       apic_pm_state.apic_tmict = apic_read(APIC_TMICT);
-       apic_pm_state.apic_tdcr = apic_read(APIC_TDCR);
-#ifdef CONFIG_X86_MCE_P4THERMAL
-       if (maxlvt >= 5)
-               apic_pm_state.apic_thmr = apic_read(APIC_LVTTHMR);
-#endif
-       
-       local_irq_save(flags);
-       disable_local_APIC();
-       local_irq_restore(flags);
-       return 0;
-}
-
-static int lapic_resume(struct sys_device *dev)
-{
-       unsigned int l, h;
-       unsigned long flags;
-       int maxlvt;
-
-       if (!apic_pm_state.active)
-               return 0;
-
-       maxlvt = get_maxlvt();
-
-       local_irq_save(flags);
-
-       /*
-        * Make sure the APICBASE points to the right address
-        *
-        * FIXME! This will be wrong if we ever support suspend on
-        * SMP! We'll need to do this as part of the CPU restore!
-        */
-       rdmsr(MSR_IA32_APICBASE, l, h);
-       l &= ~MSR_IA32_APICBASE_BASE;
-       l |= MSR_IA32_APICBASE_ENABLE | mp_lapic_addr;
-       wrmsr(MSR_IA32_APICBASE, l, h);
-
-       apic_write(APIC_LVTERR, ERROR_APIC_VECTOR | APIC_LVT_MASKED);
-       apic_write(APIC_ID, apic_pm_state.apic_id);
-       apic_write(APIC_DFR, apic_pm_state.apic_dfr);
-       apic_write(APIC_LDR, apic_pm_state.apic_ldr);
-       apic_write(APIC_TASKPRI, apic_pm_state.apic_taskpri);
-       apic_write(APIC_SPIV, apic_pm_state.apic_spiv);
-       apic_write(APIC_LVT0, apic_pm_state.apic_lvt0);
-       apic_write(APIC_LVT1, apic_pm_state.apic_lvt1);
-#ifdef CONFIG_X86_MCE_P4THERMAL
-       if (maxlvt >= 5)
-               apic_write(APIC_LVTTHMR, apic_pm_state.apic_thmr);
-#endif
-       if (maxlvt >= 4)
-               apic_write(APIC_LVTPC, apic_pm_state.apic_lvtpc);
-       apic_write(APIC_LVTT, apic_pm_state.apic_lvtt);
-       apic_write(APIC_TDCR, apic_pm_state.apic_tdcr);
-       apic_write(APIC_TMICT, apic_pm_state.apic_tmict);
-       apic_write(APIC_ESR, 0);
-       apic_read(APIC_ESR);
-       apic_write(APIC_LVTERR, apic_pm_state.apic_lvterr);
-       apic_write(APIC_ESR, 0);
-       apic_read(APIC_ESR);
-       local_irq_restore(flags);
-       return 0;
-}
-
-/*
- * This device has no shutdown method - fully functioning local APICs
- * are needed on every CPU up until machine_halt/restart/poweroff.
- */
-
-static struct sysdev_class lapic_sysclass = {
-       set_kset_name("lapic"),
-       .resume         = lapic_resume,
-       .suspend        = lapic_suspend,
-};
-
-static struct sys_device device_lapic = {
-       .id     = 0,
-       .cls    = &lapic_sysclass,
-};
-
-static void __devinit apic_pm_activate(void)
-{
-       apic_pm_state.active = 1;
-}
-
-static int __init init_lapic_sysfs(void)
-{
-       int error;
-
-       if (!cpu_has_apic)
-               return 0;
-       /* XXX: remove suspend/resume procs if !apic_pm_state.active? */
-
-       error = sysdev_class_register(&lapic_sysclass);
-       if (!error)
-               error = sysdev_register(&device_lapic);
-       return error;
-}
-device_initcall(init_lapic_sysfs);
-
-#else  /* CONFIG_PM */
-
-static void apic_pm_activate(void) { }
-
-#endif /* CONFIG_PM */
-
-/*
- * Detect and enable local APICs on non-SMP boards.
- * Original code written by Keir Fraser.
+ * Detect and initialize APIC
  */
-
-static int __init apic_set_verbosity(char *str)
-{
-       if (strcmp("debug", str) == 0)
-               apic_verbosity = APIC_DEBUG;
-       else if (strcmp("verbose", str) == 0)
-               apic_verbosity = APIC_VERBOSE;
-       return 1;
-}
-
-__setup("apic=", apic_set_verbosity);
-
 static int __init detect_init_APIC (void)
 {
        u32 h, l, features;
@@ -797,7 +1002,7 @@ static int __init detect_init_APIC (void)
        switch (boot_cpu_data.x86_vendor) {
        case X86_VENDOR_AMD:
                if ((boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model > 1) ||
-                   (boot_cpu_data.x86 == 15))      
+                   (boot_cpu_data.x86 == 15))
                        break;
                goto no_apic;
        case X86_VENDOR_INTEL:
@@ -811,23 +1016,23 @@ static int __init detect_init_APIC (void)
 
        if (!cpu_has_apic) {
                /*
-                * Over-ride BIOS and try to enable the local
-                * APIC only if "lapic" specified.
+                * Over-ride BIOS and try to enable the local APIC only if
+                * "lapic" specified.
                 */
                if (enable_local_apic <= 0) {
-                       printk("Local APIC disabled by BIOS -- "
+                       printk(KERN_INFO "Local APIC disabled by BIOS -- "
                               "you can enable it with \"lapic\"\n");
                        return -1;
                }
                /*
-                * Some BIOSes disable the local APIC in the
-                * APIC_BASE MSR. This can only be done in
-                * software for Intel P6 or later and AMD K7
-                * (Model > 1) or later.
+                * Some BIOSes disable the local APIC in the APIC_BASE
+                * MSR. This can only be done in software for Intel P6 or later
+                * and AMD K7 (Model > 1) or later.
                 */
                rdmsr(MSR_IA32_APICBASE, l, h);
                if (!(l & MSR_IA32_APICBASE_ENABLE)) {
-                       printk("Local APIC disabled by BIOS -- reenabling.\n");
+                       printk(KERN_INFO
+                              "Local APIC disabled by BIOS -- reenabling.\n");
                        l &= ~MSR_IA32_APICBASE_BASE;
                        l |= MSR_IA32_APICBASE_ENABLE | APIC_DEFAULT_PHYS_BASE;
                        wrmsr(MSR_IA32_APICBASE, l, h);
@@ -840,7 +1045,7 @@ static int __init detect_init_APIC (void)
         */
        features = cpuid_edx(1);
        if (!(features & (1 << X86_FEATURE_APIC))) {
-               printk("Could not enable APIC!\n");
+               printk(KERN_WARNING "Could not enable APIC!\n");
                return -1;
        }
        set_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability);
@@ -854,17 +1059,20 @@ static int __init detect_init_APIC (void)
        if (nmi_watchdog != NMI_NONE)
                nmi_watchdog = NMI_LOCAL_APIC;
 
-       printk("Found and enabled local APIC!\n");
+       printk(KERN_INFO "Found and enabled local APIC!\n");
 
        apic_pm_activate();
 
        return 0;
 
 no_apic:
-       printk("No local APIC present or hardware disabled\n");
+       printk(KERN_INFO "No local APIC present or hardware disabled\n");
        return -1;
 }
 
+/**
+ * init_apic_mappings - initialize APIC mappings
+ */
 void __init init_apic_mappings(void)
 {
        unsigned long apic_phys;
@@ -924,387 +1132,96 @@ fake_ioapic_page:
 }
 
 /*
- * This part sets up the APIC 32 bit clock in LVTT1, with HZ interrupts
- * per second. We assume that the caller has already set up the local
- * APIC.
- *
- * The APIC timer is not exactly sync with the external timer chip, it
- * closely follows bus clocks.
- */
-
-/*
- * The timer chip is already set up at HZ interrupts per second here,
- * but we do not accept timer interrupts yet. We only allow the BP
- * to calibrate.
+ * This initializes the IO-APIC and APIC hardware if this is
+ * a UP kernel.
  */
-static unsigned int __devinit get_8254_timer_count(void)
+int __init APIC_init_uniprocessor (void)
 {
-       unsigned long flags;
+       if (enable_local_apic < 0)
+               clear_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability);
 
-       unsigned int count;
-
-       spin_lock_irqsave(&i8253_lock, flags);
-
-       outb_p(0x00, PIT_MODE);
-       count = inb_p(PIT_CH0);
-       count |= inb_p(PIT_CH0) << 8;
-
-       spin_unlock_irqrestore(&i8253_lock, flags);
-
-       return count;
-}
-
-/* next tick in 8254 can be caught by catching timer wraparound */
-static void __devinit wait_8254_wraparound(void)
-{
-       unsigned int curr_count, prev_count;
-
-       curr_count = get_8254_timer_count();
-       do {
-               prev_count = curr_count;
-               curr_count = get_8254_timer_count();
-
-               /* workaround for broken Mercury/Neptune */
-               if (prev_count >= curr_count + 0x100)
-                       curr_count = get_8254_timer_count();
-
-       } while (prev_count >= curr_count);
-}
-
-/*
- * Default initialization for 8254 timers. If we use other timers like HPET,
- * we override this later
- */
-void (*wait_timer_tick)(void) __devinitdata = wait_8254_wraparound;
-
-/*
- * This function sets up the local APIC timer, with a timeout of
- * 'clocks' APIC bus clock. During calibration we actually call
- * this function twice on the boot CPU, once with a bogus timeout
- * value, second time for real. The other (noncalibrating) CPUs
- * call this function only once, with the real, calibrated value.
- *
- * We do reads before writes even if unnecessary, to get around the
- * P5 APIC double write bug.
- */
-
-#define APIC_DIVISOR 16
-
-static void __setup_APIC_LVTT(unsigned int clocks)
-{
-       unsigned int lvtt_value, tmp_value, ver;
-       int cpu = smp_processor_id();
-
-       ver = GET_APIC_VERSION(apic_read(APIC_LVR));
-       lvtt_value = APIC_LVT_TIMER_PERIODIC | LOCAL_TIMER_VECTOR;
-       if (!APIC_INTEGRATED(ver))
-               lvtt_value |= SET_APIC_TIMER_BASE(APIC_TIMER_BASE_DIV);
-
-       if (cpu_isset(cpu, timer_bcast_ipi))
-               lvtt_value |= APIC_LVT_MASKED;
-
-       apic_write_around(APIC_LVTT, lvtt_value);
+       if (!smp_found_config && !cpu_has_apic)
+               return -1;
 
        /*
-        * Divide PICLK by 16
+        * Complain if the BIOS pretends there is one.
         */
-       tmp_value = apic_read(APIC_TDCR);
-       apic_write_around(APIC_TDCR, (tmp_value
-                               & ~(APIC_TDR_DIV_1 | APIC_TDR_DIV_TMBASE))
-                               | APIC_TDR_DIV_16);
-
-       apic_write_around(APIC_TMICT, clocks/APIC_DIVISOR);
-}
+       if (!cpu_has_apic &&
+           APIC_INTEGRATED(apic_version[boot_cpu_physical_apicid])) {
+               printk(KERN_ERR "BIOS bug, local APIC #%d not detected!...\n",
+                      boot_cpu_physical_apicid);
+               clear_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability);
+               return -1;
+       }
 
-static void __devinit setup_APIC_timer(unsigned int clocks)
-{
-       unsigned long flags;
+       verify_local_APIC();
 
-       local_irq_save(flags);
+       connect_bsp_APIC();
 
        /*
-        * Wait for IRQ0's slice:
+        * Hack: In case of kdump, after a crash, kernel might be booting
+        * on a cpu with non-zero lapic id. But boot_cpu_physical_apicid
+        * might be zero if read from MP tables. Get it from LAPIC.
         */
-       wait_timer_tick();
+#ifdef CONFIG_CRASH_DUMP
+       boot_cpu_physical_apicid = GET_APIC_ID(apic_read(APIC_ID));
+#endif
+       phys_cpu_present_map = physid_mask_of_physid(boot_cpu_physical_apicid);
 
-       __setup_APIC_LVTT(clocks);
+       setup_local_APIC();
 
-       local_irq_restore(flags);
+#ifdef CONFIG_X86_IO_APIC
+       if (smp_found_config)
+               if (!skip_ioapic_setup && nr_ioapics)
+                       setup_IO_APIC();
+#endif
+       setup_boot_clock();
+
+       return 0;
 }
 
 /*
- * In this function we calibrate APIC bus clocks to the external
- * timer. Unfortunately we cannot use jiffies and the timer irq
- * to calibrate, since some later bootup code depends on getting
- * the first irq? Ugh.
- *
- * We want to do the calibration only once since we
- * want to have local timer irqs syncron. CPUs connected
- * by the same APIC bus have the very same bus frequency.
- * And we want to have irqs off anyways, no accidental
- * APIC irq that way.
+ * APIC command line parameters
  */
-
-static int __init calibrate_APIC_clock(void)
-{
-       unsigned long long t1 = 0, t2 = 0;
-       long tt1, tt2;
-       long result;
-       int i;
-       const int LOOPS = HZ/10;
-
-       apic_printk(APIC_VERBOSE, "calibrating APIC timer ...\n");
-
-       /*
-        * Put whatever arbitrary (but long enough) timeout
-        * value into the APIC clock, we just want to get the
-        * counter running for calibration.
-        */
-       __setup_APIC_LVTT(1000000000);
-
-       /*
-        * The timer chip counts down to zero. Let's wait
-        * for a wraparound to start exact measurement:
-        * (the current tick might have been already half done)
-        */
-
-       wait_timer_tick();
-
-       /*
-        * We wrapped around just now. Let's start:
-        */
-       if (cpu_has_tsc)
-               rdtscll(t1);
-       tt1 = apic_read(APIC_TMCCT);
-
-       /*
-        * Let's wait LOOPS wraprounds:
-        */
-       for (i = 0; i < LOOPS; i++)
-               wait_timer_tick();
-
-       tt2 = apic_read(APIC_TMCCT);
-       if (cpu_has_tsc)
-               rdtscll(t2);
-
-       /*
-        * The APIC bus clock counter is 32 bits only, it
-        * might have overflown, but note that we use signed
-        * longs, thus no extra care needed.
-        *
-        * underflown to be exact, as the timer counts down ;)
-        */
-
-       result = (tt1-tt2)*APIC_DIVISOR/LOOPS;
-
-       if (cpu_has_tsc)
-               apic_printk(APIC_VERBOSE, "..... CPU clock speed is "
-                       "%ld.%04ld MHz.\n",
-                       ((long)(t2-t1)/LOOPS)/(1000000/HZ),
-                       ((long)(t2-t1)/LOOPS)%(1000000/HZ));
-
-       apic_printk(APIC_VERBOSE, "..... host bus clock speed is "
-               "%ld.%04ld MHz.\n",
-               result/(1000000/HZ),
-               result%(1000000/HZ));
-
-       return result;
-}
-
-static unsigned int calibration_result;
-
-void __init setup_boot_APIC_clock(void)
-{
-       unsigned long flags;
-       apic_printk(APIC_VERBOSE, "Using local APIC timer interrupts.\n");
-       using_apic_timer = 1;
-
-       local_irq_save(flags);
-
-       calibration_result = calibrate_APIC_clock();
-       /*
-        * Now set up the timer for real.
-        */
-       setup_APIC_timer(calibration_result);
-
-       local_irq_restore(flags);
-}
-
-void __devinit setup_secondary_APIC_clock(void)
-{
-       setup_APIC_timer(calibration_result);
-}
-
-void disable_APIC_timer(void)
+static int __init parse_lapic(char *arg)
 {
-       if (using_apic_timer) {
-               unsigned long v;
-
-               v = apic_read(APIC_LVTT);
-               /*
-                * When an illegal vector value (0-15) is written to an LVT
-                * entry and delivery mode is Fixed, the APIC may signal an
-                * illegal vector error, with out regard to whether the mask
-                * bit is set or whether an interrupt is actually seen on input.
-                *
-                * Boot sequence might call this function when the LVTT has
-                * '0' vector value. So make sure vector field is set to
-                * valid value.
-                */
-               v |= (APIC_LVT_MASKED | LOCAL_TIMER_VECTOR);
-               apic_write_around(APIC_LVTT, v);
-       }
+       enable_local_apic = 1;
+       return 0;
 }
+early_param("lapic", parse_lapic);
 
-void enable_APIC_timer(void)
+static int __init parse_nolapic(char *arg)
 {
-       int cpu = smp_processor_id();
-
-       if (using_apic_timer &&
-           !cpu_isset(cpu, timer_bcast_ipi)) {
-               unsigned long v;
-
-               v = apic_read(APIC_LVTT);
-               apic_write_around(APIC_LVTT, v & ~APIC_LVT_MASKED);
-       }
+       enable_local_apic = -1;
+       clear_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability);
+       return 0;
 }
+early_param("nolapic", parse_nolapic);
 
-void switch_APIC_timer_to_ipi(void *cpumask)
+static int __init apic_set_verbosity(char *str)
 {
-       cpumask_t mask = *(cpumask_t *)cpumask;
-       int cpu = smp_processor_id();
-
-       if (cpu_isset(cpu, mask) &&
-           !cpu_isset(cpu, timer_bcast_ipi)) {
-               disable_APIC_timer();
-               cpu_set(cpu, timer_bcast_ipi);
-       }
+       if (strcmp("debug", str) == 0)
+               apic_verbosity = APIC_DEBUG;
+       else if (strcmp("verbose", str) == 0)
+               apic_verbosity = APIC_VERBOSE;
+       return 1;
 }
-EXPORT_SYMBOL(switch_APIC_timer_to_ipi);
-
-void switch_ipi_to_APIC_timer(void *cpumask)
-{
-       cpumask_t mask = *(cpumask_t *)cpumask;
-       int cpu = smp_processor_id();
 
-       if (cpu_isset(cpu, mask) &&
-           cpu_isset(cpu, timer_bcast_ipi)) {
-               cpu_clear(cpu, timer_bcast_ipi);
-               enable_APIC_timer();
-       }
-}
-EXPORT_SYMBOL(switch_ipi_to_APIC_timer);
+__setup("apic=", apic_set_verbosity);
 
-#undef APIC_DIVISOR
 
 /*
- * Local timer interrupt handler. It does both profiling and
- * process statistics/rescheduling.
- *
- * We do profiling in every local tick, statistics/rescheduling
- * happen only every 'profiling multiplier' ticks. The default
- * multiplier is 1 and it can be changed by writing the new multiplier
- * value into /proc/profile.
+ * Local APIC interrupts
  */
 
-inline void smp_local_timer_interrupt(void)
-{
-       profile_tick(CPU_PROFILING);
-#ifdef CONFIG_SMP
-       update_process_times(user_mode_vm(get_irq_regs()));
-#endif
-
-       /*
-        * We take the 'long' return path, and there every subsystem
-        * grabs the apropriate locks (kernel lock/ irq lock).
-        *
-        * we might want to decouple profiling from the 'long path',
-        * and do the profiling totally in assembly.
-        *
-        * Currently this isn't too much of an issue (performance wise),
-        * we can take more than 100K local irqs per second on a 100 MHz P5.
-        */
-}
-
-/*
- * Local APIC timer interrupt. This is the most natural way for doing
- * local interrupts, but local timer interrupts can be emulated by
- * broadcast interrupts too. [in case the hw doesn't support APIC timers]
- *
- * [ if a single-CPU system runs an SMP kernel then we call the local
- *   interrupt as well. Thus we cannot inline the local irq ... ]
- */
-
-fastcall void smp_apic_timer_interrupt(struct pt_regs *regs)
-{
-       struct pt_regs *old_regs = set_irq_regs(regs);
-       int cpu = smp_processor_id();
-
-       /*
-        * the NMI deadlock-detector uses this.
-        */
-       per_cpu(irq_stat, cpu).apic_timer_irqs++;
-
-       /*
-        * NOTE! We'd better ACK the irq immediately,
-        * because timer handling can be slow.
-        */
-       ack_APIC_irq();
-       /*
-        * update_process_times() expects us to have done irq_enter().
-        * Besides, if we don't timer interrupts ignore the global
-        * interrupt lock, which is the WrongThing (tm) to do.
-        */
-       irq_enter();
-       smp_local_timer_interrupt();
-       irq_exit();
-       set_irq_regs(old_regs);
-}
-
-#ifndef CONFIG_SMP
-static void up_apic_timer_interrupt_call(void)
-{
-       int cpu = smp_processor_id();
-
-       /*
-        * the NMI deadlock-detector uses this.
-        */
-       per_cpu(irq_stat, cpu).apic_timer_irqs++;
-
-       smp_local_timer_interrupt();
-}
-#endif
-
-void smp_send_timer_broadcast_ipi(void)
-{
-       cpumask_t mask;
-
-       cpus_and(mask, cpu_online_map, timer_bcast_ipi);
-       if (!cpus_empty(mask)) {
-#ifdef CONFIG_SMP
-               send_IPI_mask(mask, LOCAL_TIMER_VECTOR);
-#else
-               /*
-                * We can directly call the apic timer interrupt handler
-                * in UP case. Minus all irq related functions
-                */
-               up_apic_timer_interrupt_call();
-#endif
-       }
-}
-
-int setup_profiling_timer(unsigned int multiplier)
-{
-       return -EINVAL;
-}
-
 /*
  * This interrupt should _never_ happen with our APIC/SMP architecture
  */
-fastcall void smp_spurious_interrupt(struct pt_regs *regs)
+void smp_spurious_interrupt(struct pt_regs *regs)
 {
        unsigned long v;
 
+       exit_idle();
        irq_enter();
        /*
         * Check if this really is a spurious interrupt and ACK it
@@ -1316,19 +1233,19 @@ fastcall void smp_spurious_interrupt(struct pt_regs *regs)
                ack_APIC_irq();
 
        /* see sw-dev-man vol 3, chapter 7.4.13.5 */
-       printk(KERN_INFO "spurious APIC interrupt on CPU#%d, should never happen.\n",
-                       smp_processor_id());
+       printk(KERN_INFO "spurious APIC interrupt on CPU#%d, "
+              "should never happen.\n", smp_processor_id());
        irq_exit();
 }
 
 /*
  * This interrupt should never happen with our APIC/SMP architecture
  */
-
-fastcall void smp_error_interrupt(struct pt_regs *regs)
+void smp_error_interrupt(struct pt_regs *regs)
 {
        unsigned long v, v1;
 
+       exit_idle();
        irq_enter();
        /* First tickle the hardware, only then report what went on. -- REW */
        v = apic_read(APIC_ESR);
@@ -1348,69 +1265,261 @@ fastcall void smp_error_interrupt(struct pt_regs *regs)
           7: Illegal register address
        */
        printk (KERN_DEBUG "APIC error on CPU%d: %02lx(%02lx)\n",
-               smp_processor_id(), v , v1);
+               smp_processor_id(), v , v1);
        irq_exit();
 }
 
 /*
- * This initializes the IO-APIC and APIC hardware if this is
- * a UP kernel.
+ * Initialize APIC interrupts
  */
-int __init APIC_init_uniprocessor (void)
+void __init apic_intr_init(void)
 {
-       if (enable_local_apic < 0)
-               clear_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability);
+#ifdef CONFIG_SMP
+       smp_intr_init();
+#endif
+       /* self generated IPI for local APIC timer */
+       set_intr_gate(LOCAL_TIMER_VECTOR, apic_timer_interrupt);
 
-       if (!smp_found_config && !cpu_has_apic)
-               return -1;
+       /* IPI vectors for APIC spurious and error interrupts */
+       set_intr_gate(SPURIOUS_APIC_VECTOR, spurious_interrupt);
+       set_intr_gate(ERROR_APIC_VECTOR, error_interrupt);
 
-       /*
-        * Complain if the BIOS pretends there is one.
-        */
-       if (!cpu_has_apic && APIC_INTEGRATED(apic_version[boot_cpu_physical_apicid])) {
-               printk(KERN_ERR "BIOS bug, local APIC #%d not detected!...\n",
-                       boot_cpu_physical_apicid);
-               clear_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability);
-               return -1;
+       /* thermal monitor LVT interrupt */
+#ifdef CONFIG_X86_MCE_P4THERMAL
+       set_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt);
+#endif
+}
+
+/**
+ * connect_bsp_APIC - attach the APIC to the interrupt system
+ */
+void __init connect_bsp_APIC(void)
+{
+       if (pic_mode) {
+               /*
+                * Do not trust the local APIC being empty at bootup.
+                */
+               clear_local_APIC();
+               /*
+                * PIC mode, enable APIC mode in the IMCR, i.e.  connect BSP's
+                * local APIC to INT and NMI lines.
+                */
+               apic_printk(APIC_VERBOSE, "leaving PIC mode, "
+                               "enabling APIC mode.\n");
+               outb(0x70, 0x22);
+               outb(0x01, 0x23);
        }
+       enable_apic_mode();
+}
 
-       verify_local_APIC();
+/**
+ * disconnect_bsp_APIC - detach the APIC from the interrupt system
+ * @virt_wire_setup:   indicates, whether virtual wire mode is selected
+ *
+ * Virtual wire mode is necessary to deliver legacy interrupts even when the
+ * APIC is disabled.
+ */
+void disconnect_bsp_APIC(int virt_wire_setup)
+{
+       if (pic_mode) {
+               /*
+                * Put the board back into PIC mode (has an effect only on
+                * certain older boards).  Note that APIC interrupts, including
+                * IPIs, won't work beyond this point!  The only exception are
+                * INIT IPIs.
+                */
+               apic_printk(APIC_VERBOSE, "disabling APIC mode, "
+                               "entering PIC mode.\n");
+               outb(0x70, 0x22);
+               outb(0x00, 0x23);
+       } else {
+               /* Go back to Virtual Wire compatibility mode */
+               unsigned long value;
 
-       connect_bsp_APIC();
+               /* For the spurious interrupt use vector F, and enable it */
+               value = apic_read(APIC_SPIV);
+               value &= ~APIC_VECTOR_MASK;
+               value |= APIC_SPIV_APIC_ENABLED;
+               value |= 0xf;
+               apic_write_around(APIC_SPIV, value);
 
-       /*
-        * Hack: In case of kdump, after a crash, kernel might be booting
-        * on a cpu with non-zero lapic id. But boot_cpu_physical_apicid
-        * might be zero if read from MP tables. Get it from LAPIC.
-        */
-#ifdef CONFIG_CRASH_DUMP
-       boot_cpu_physical_apicid = GET_APIC_ID(apic_read(APIC_ID));
-#endif
-       phys_cpu_present_map = physid_mask_of_physid(boot_cpu_physical_apicid);
+               if (!virt_wire_setup) {
+                       /*
+                        * For LVT0 make it edge triggered, active high,
+                        * external and enabled
+                        */
+                       value = apic_read(APIC_LVT0);
+                       value &= ~(APIC_MODE_MASK | APIC_SEND_PENDING |
+                               APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR |
+                               APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED );
+                       value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
+                       value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_EXTINT);
+                       apic_write_around(APIC_LVT0, value);
+               } else {
+                       /* Disable LVT0 */
+                       apic_write_around(APIC_LVT0, APIC_LVT_MASKED);
+               }
 
-       setup_local_APIC();
+               /*
+                * For LVT1 make it edge triggered, active high, nmi and
+                * enabled
+                */
+               value = apic_read(APIC_LVT1);
+               value &= ~(
+                       APIC_MODE_MASK | APIC_SEND_PENDING |
+                       APIC_INPUT_POLARITY | APIC_LVT_REMOTE_IRR |
+                       APIC_LVT_LEVEL_TRIGGER | APIC_LVT_MASKED);
+               value |= APIC_LVT_REMOTE_IRR | APIC_SEND_PENDING;
+               value = SET_APIC_DELIVERY_MODE(value, APIC_MODE_NMI);
+               apic_write_around(APIC_LVT1, value);
+       }
+}
 
-#ifdef CONFIG_X86_IO_APIC
-       if (smp_found_config)
-               if (!skip_ioapic_setup && nr_ioapics)
-                       setup_IO_APIC();
+/*
+ * Power management
+ */
+#ifdef CONFIG_PM
+
+static struct {
+       int active;
+       /* r/w apic fields */
+       unsigned int apic_id;
+       unsigned int apic_taskpri;
+       unsigned int apic_ldr;
+       unsigned int apic_dfr;
+       unsigned int apic_spiv;
+       unsigned int apic_lvtt;
+       unsigned int apic_lvtpc;
+       unsigned int apic_lvt0;
+       unsigned int apic_lvt1;
+       unsigned int apic_lvterr;
+       unsigned int apic_tmict;
+       unsigned int apic_tdcr;
+       unsigned int apic_thmr;
+} apic_pm_state;
+
+static int lapic_suspend(struct sys_device *dev, pm_message_t state)
+{
+       unsigned long flags;
+       int maxlvt;
+
+       if (!apic_pm_state.active)
+               return 0;
+
+       maxlvt = lapic_get_maxlvt();
+
+       apic_pm_state.apic_id = apic_read(APIC_ID);
+       apic_pm_state.apic_taskpri = apic_read(APIC_TASKPRI);
+       apic_pm_state.apic_ldr = apic_read(APIC_LDR);
+       apic_pm_state.apic_dfr = apic_read(APIC_DFR);
+       apic_pm_state.apic_spiv = apic_read(APIC_SPIV);
+       apic_pm_state.apic_lvtt = apic_read(APIC_LVTT);
+       if (maxlvt >= 4)
+               apic_pm_state.apic_lvtpc = apic_read(APIC_LVTPC);
+       apic_pm_state.apic_lvt0 = apic_read(APIC_LVT0);
+       apic_pm_state.apic_lvt1 = apic_read(APIC_LVT1);
+       apic_pm_state.apic_lvterr = apic_read(APIC_LVTERR);
+       apic_pm_state.apic_tmict = apic_read(APIC_TMICT);
+       apic_pm_state.apic_tdcr = apic_read(APIC_TDCR);
+#ifdef CONFIG_X86_MCE_P4THERMAL
+       if (maxlvt >= 5)
+               apic_pm_state.apic_thmr = apic_read(APIC_LVTTHMR);
 #endif
-       setup_boot_APIC_clock();
 
+       local_irq_save(flags);
+       disable_local_APIC();
+       local_irq_restore(flags);
        return 0;
 }
 
-static int __init parse_lapic(char *arg)
+static int lapic_resume(struct sys_device *dev)
 {
-       lapic_enable();
+       unsigned int l, h;
+       unsigned long flags;
+       int maxlvt;
+
+       if (!apic_pm_state.active)
+               return 0;
+
+       maxlvt = lapic_get_maxlvt();
+
+       local_irq_save(flags);
+
+       /*
+        * Make sure the APICBASE points to the right address
+        *
+        * FIXME! This will be wrong if we ever support suspend on
+        * SMP! We'll need to do this as part of the CPU restore!
+        */
+       rdmsr(MSR_IA32_APICBASE, l, h);
+       l &= ~MSR_IA32_APICBASE_BASE;
+       l |= MSR_IA32_APICBASE_ENABLE | mp_lapic_addr;
+       wrmsr(MSR_IA32_APICBASE, l, h);
+
+       apic_write(APIC_LVTERR, ERROR_APIC_VECTOR | APIC_LVT_MASKED);
+       apic_write(APIC_ID, apic_pm_state.apic_id);
+       apic_write(APIC_DFR, apic_pm_state.apic_dfr);
+       apic_write(APIC_LDR, apic_pm_state.apic_ldr);
+       apic_write(APIC_TASKPRI, apic_pm_state.apic_taskpri);
+       apic_write(APIC_SPIV, apic_pm_state.apic_spiv);
+       apic_write(APIC_LVT0, apic_pm_state.apic_lvt0);
+       apic_write(APIC_LVT1, apic_pm_state.apic_lvt1);
+#ifdef CONFIG_X86_MCE_P4THERMAL
+       if (maxlvt >= 5)
+               apic_write(APIC_LVTTHMR, apic_pm_state.apic_thmr);
+#endif
+       if (maxlvt >= 4)
+               apic_write(APIC_LVTPC, apic_pm_state.apic_lvtpc);
+       apic_write(APIC_LVTT, apic_pm_state.apic_lvtt);
+       apic_write(APIC_TDCR, apic_pm_state.apic_tdcr);
+       apic_write(APIC_TMICT, apic_pm_state.apic_tmict);
+       apic_write(APIC_ESR, 0);
+       apic_read(APIC_ESR);
+       apic_write(APIC_LVTERR, apic_pm_state.apic_lvterr);
+       apic_write(APIC_ESR, 0);
+       apic_read(APIC_ESR);
+       local_irq_restore(flags);
        return 0;
 }
-early_param("lapic", parse_lapic);
 
-static int __init parse_nolapic(char *arg)
+/*
+ * This device has no shutdown method - fully functioning local APICs
+ * are needed on every CPU up until machine_halt/restart/poweroff.
+ */
+
+static struct sysdev_class lapic_sysclass = {
+       set_kset_name("lapic"),
+       .resume         = lapic_resume,
+       .suspend        = lapic_suspend,
+};
+
+static struct sys_device device_lapic = {
+       .id     = 0,
+       .cls    = &lapic_sysclass,
+};
+
+static void __devinit apic_pm_activate(void)
 {
-       lapic_disable();
-       return 0;
+       apic_pm_state.active = 1;
 }
-early_param("nolapic", parse_nolapic);
 
+static int __init init_lapic_sysfs(void)
+{
+       int error;
+
+       if (!cpu_has_apic)
+               return 0;
+       /* XXX: remove suspend/resume procs if !apic_pm_state.active? */
+
+       error = sysdev_class_register(&lapic_sysclass);
+       if (!error)
+               error = sysdev_register(&device_lapic);
+       return error;
+}
+device_initcall(init_lapic_sysfs);
+
+#else  /* CONFIG_PM */
+
+static void apic_pm_activate(void) { }
+
+#endif /* CONFIG_PM */
index 199016927541871f4dc18a4d0e746e03873ba700..064bbf2861f40fc4e96ed1ebfb9916b2c4731334 100644 (file)
 #include <linux/slab.h>
 #include <linux/stat.h>
 #include <linux/proc_fs.h>
+#include <linux/seq_file.h>
 #include <linux/miscdevice.h>
 #include <linux/apm_bios.h>
 #include <linux/init.h>
 
 #include "io_ports.h"
 
-extern unsigned long get_cmos_time(void);
 extern void machine_real_restart(unsigned char *, int);
 
 #if defined(CONFIG_APM_DISPLAY_BLANK) && defined(CONFIG_VT)
@@ -1175,28 +1175,6 @@ out:
        spin_unlock(&user_list_lock);
 }
 
-static void set_time(void)
-{
-       struct timespec ts;
-       if (got_clock_diff) {   /* Must know time zone in order to set clock */
-               ts.tv_sec = get_cmos_time() + clock_cmos_diff;
-               ts.tv_nsec = 0;
-               do_settimeofday(&ts);
-       } 
-}
-
-static void get_time_diff(void)
-{
-#ifndef CONFIG_APM_RTC_IS_GMT
-       /*
-        * Estimate time zone so that set_time can update the clock
-        */
-       clock_cmos_diff = -get_cmos_time();
-       clock_cmos_diff += get_seconds();
-       got_clock_diff = 1;
-#endif
-}
-
 static void reinit_timer(void)
 {
 #ifdef INIT_TIMER_AFTER_SUSPEND
@@ -1236,19 +1214,6 @@ static int suspend(int vetoable)
        local_irq_disable();
        device_power_down(PMSG_SUSPEND);
 
-       /* serialize with the timer interrupt */
-       write_seqlock(&xtime_lock);
-
-       /* protect against access to timer chip registers */
-       spin_lock(&i8253_lock);
-
-       get_time_diff();
-       /*
-        * Irq spinlock must be dropped around set_system_power_state.
-        * We'll undo any timer changes due to interrupts below.
-        */
-       spin_unlock(&i8253_lock);
-       write_sequnlock(&xtime_lock);
        local_irq_enable();
 
        save_processor_state();
@@ -1257,7 +1222,6 @@ static int suspend(int vetoable)
        restore_processor_state();
 
        local_irq_disable();
-       set_time();
        reinit_timer();
 
        if (err == APM_NO_ERROR)
@@ -1287,11 +1251,6 @@ static void standby(void)
 
        local_irq_disable();
        device_power_down(PMSG_SUSPEND);
-       /* serialize with the timer interrupt */
-       write_seqlock(&xtime_lock);
-       /* If needed, notify drivers here */
-       get_time_diff();
-       write_sequnlock(&xtime_lock);
        local_irq_enable();
 
        err = set_system_power_state(APM_STATE_STANDBY);
@@ -1385,7 +1344,6 @@ static void check_events(void)
                        ignore_bounce = 1;
                        if ((event != APM_NORMAL_RESUME)
                            || (ignore_normal_resume == 0)) {
-                               set_time();
                                device_resume();
                                pm_send_all(PM_RESUME, (void *)0);
                                queue_event(event, NULL);
@@ -1401,7 +1359,6 @@ static void check_events(void)
                        break;
 
                case APM_UPDATE_TIME:
-                       set_time();
                        break;
 
                case APM_CRITICAL_SUSPEND:
@@ -1636,9 +1593,8 @@ static int do_open(struct inode * inode, struct file * filp)
        return 0;
 }
 
-static int apm_get_info(char *buf, char **start, off_t fpos, int length)
+static int proc_apm_show(struct seq_file *m, void *v)
 {
-       char *          p;
        unsigned short  bx;
        unsigned short  cx;
        unsigned short  dx;
@@ -1650,8 +1606,6 @@ static int apm_get_info(char *buf, char **start, off_t fpos, int length)
        int             time_units     = -1;
        char            *units         = "?";
 
-       p = buf;
-
        if ((num_online_cpus() == 1) &&
            !(error = apm_get_power_status(&bx, &cx, &dx))) {
                ac_line_status = (bx >> 8) & 0xff;
@@ -1705,7 +1659,7 @@ static int apm_get_info(char *buf, char **start, off_t fpos, int length)
              -1: Unknown
           8) min = minutes; sec = seconds */
 
-       p += sprintf(p, "%s %d.%d 0x%02x 0x%02x 0x%02x 0x%02x %d%% %d %s\n",
+       seq_printf(m, "%s %d.%d 0x%02x 0x%02x 0x%02x 0x%02x %d%% %d %s\n",
                     driver_version,
                     (apm_info.bios.version >> 8) & 0xff,
                     apm_info.bios.version & 0xff,
@@ -1716,10 +1670,22 @@ static int apm_get_info(char *buf, char **start, off_t fpos, int length)
                     percentage,
                     time_units,
                     units);
+       return 0;
+}
 
-       return p - buf;
+static int proc_apm_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, proc_apm_show, NULL);
 }
 
+static const struct file_operations apm_file_ops = {
+       .owner          = THIS_MODULE,
+       .open           = proc_apm_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
 static int apm(void *unused)
 {
        unsigned short  bx;
@@ -1894,7 +1860,7 @@ static int __init apm_setup(char *str)
 __setup("apm=", apm_setup);
 #endif
 
-static struct file_operations apm_bios_fops = {
+static const struct file_operations apm_bios_fops = {
        .owner          = THIS_MODULE,
        .read           = do_read,
        .poll           = do_poll,
@@ -2341,9 +2307,9 @@ static int __init apm_init(void)
        set_base(gdt[APM_DS >> 3],
                 __va((unsigned long)apm_info.bios.dseg << 4));
 
-       apm_proc = create_proc_info_entry("apm", 0, NULL, apm_get_info);
+       apm_proc = create_proc_entry("apm", 0, NULL);
        if (apm_proc)
-               apm_proc->owner = THIS_MODULE;
+               apm_proc->proc_fops = &apm_file_ops;
 
        kapmd_task = kthread_create(apm, NULL, "kapmd");
        if (IS_ERR(kapmd_task)) {
index 1b2f3cd332707f7fd6beb0e6fdf7b0a4149eb5ad..c37535163bfc1624bb069f85743a87211972b202 100644 (file)
@@ -72,7 +72,7 @@ void foo(void)
        OFFSET(PT_EAX, pt_regs, eax);
        OFFSET(PT_DS,  pt_regs, xds);
        OFFSET(PT_ES,  pt_regs, xes);
-       OFFSET(PT_GS,  pt_regs, xgs);
+       OFFSET(PT_FS,  pt_regs, xfs);
        OFFSET(PT_ORIG_EAX, pt_regs, orig_eax);
        OFFSET(PT_EIP, pt_regs, eip);
        OFFSET(PT_CS,  pt_regs, xcs);
index 8a8bbdaaf38aba279fa3df1672f05a0cdc5253cb..dcbbd0a8bfc2b8b5aa29ce1b7d4b1b78dd47b4e2 100644 (file)
@@ -605,7 +605,7 @@ void __init early_cpu_init(void)
 struct pt_regs * __devinit idle_regs(struct pt_regs *regs)
 {
        memset(regs, 0, sizeof(struct pt_regs));
-       regs->xgs = __KERNEL_PDA;
+       regs->xfs = __KERNEL_PDA;
        return regs;
 }
 
@@ -662,12 +662,12 @@ struct i386_pda boot_pda = {
        .pcurrent = &init_task,
 };
 
-static inline void set_kernel_gs(void)
+static inline void set_kernel_fs(void)
 {
-       /* Set %gs for this CPU's PDA.  Memory clobber is to create a
+       /* Set %fs for this CPU's PDA.  Memory clobber is to create a
           barrier with respect to any PDA operations, so the compiler
           doesn't move any before here. */
-       asm volatile ("mov %0, %%gs" : : "r" (__KERNEL_PDA) : "memory");
+       asm volatile ("mov %0, %%fs" : : "r" (__KERNEL_PDA) : "memory");
 }
 
 /* Initialize the CPU's GDT and PDA.  The boot CPU does this for
@@ -718,7 +718,7 @@ void __cpuinit cpu_set_gdt(int cpu)
           the boot CPU, this will transition from the boot gdt+pda to
           the real ones). */
        load_gdt(cpu_gdt_descr);
-       set_kernel_gs();
+       set_kernel_fs();
 }
 
 /* Common CPU init for both boot and secondary CPUs */
@@ -764,8 +764,8 @@ static void __cpuinit _cpu_init(int cpu, struct task_struct *curr)
        __set_tss_desc(cpu, GDT_ENTRY_DOUBLEFAULT_TSS, &doublefault_tss);
 #endif
 
-       /* Clear %fs. */
-       asm volatile ("mov %0, %%fs" : : "r" (0));
+       /* Clear %gs. */
+       asm volatile ("mov %0, %%gs" : : "r" (0));
 
        /* Clear all 6 debug registers: */
        set_debugreg(0, 0);
index 5299c5bf445484c26ea5ade60eb3b0ecbcdb71ee..6c52182ca323c7e874a35f30092da909449f8b19 100644 (file)
@@ -217,6 +217,15 @@ config X86_LONGHAUL
 
          If in doubt, say N.
 
+config X86_E_POWERSAVER
+       tristate "VIA C7 Enhanced PowerSaver (EXPERIMENTAL)"
+       select CPU_FREQ_TABLE
+       depends on EXPERIMENTAL
+       help
+         This adds the CPUFreq driver for VIA C7 processors.
+
+         If in doubt, say N.
+
 comment "shared options"
 
 config X86_ACPI_CPUFREQ_PROC_INTF
index 8de3abe322a946aec2b1c6a3ec49a72fb3ad1438..560f7760dae5c3dd18fa4b85845531bca0d30db4 100644 (file)
@@ -2,6 +2,7 @@ obj-$(CONFIG_X86_POWERNOW_K6)           += powernow-k6.o
 obj-$(CONFIG_X86_POWERNOW_K7)          += powernow-k7.o
 obj-$(CONFIG_X86_POWERNOW_K8)          += powernow-k8.o
 obj-$(CONFIG_X86_LONGHAUL)             += longhaul.o
+obj-$(CONFIG_X86_E_POWERSAVER)         += e_powersaver.o
 obj-$(CONFIG_ELAN_CPUFREQ)             += elanfreq.o
 obj-$(CONFIG_SC520_CPUFREQ)            += sc520_freq.o
 obj-$(CONFIG_X86_LONGRUN)              += longrun.o  
diff --git a/arch/i386/kernel/cpu/cpufreq/e_powersaver.c b/arch/i386/kernel/cpu/cpufreq/e_powersaver.c
new file mode 100644 (file)
index 0000000..f43d98e
--- /dev/null
@@ -0,0 +1,334 @@
+/*
+ *  Based on documentation provided by Dave Jones. Thanks!
+ *
+ *  Licensed under the terms of the GNU GPL License version 2.
+ *
+ *  BIG FAT DISCLAIMER: Work in progress code. Possibly *dangerous*
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/cpufreq.h>
+#include <linux/ioport.h>
+#include <linux/slab.h>
+
+#include <asm/msr.h>
+#include <asm/tsc.h>
+#include <asm/timex.h>
+#include <asm/io.h>
+#include <asm/delay.h>
+
+#define EPS_BRAND_C7M  0
+#define EPS_BRAND_C7   1
+#define EPS_BRAND_EDEN 2
+#define EPS_BRAND_C3   3
+
+struct eps_cpu_data {
+       u32 fsb;
+       struct cpufreq_frequency_table freq_table[];
+};
+
+static struct eps_cpu_data *eps_cpu[NR_CPUS];
+
+
+static unsigned int eps_get(unsigned int cpu)
+{
+       struct eps_cpu_data *centaur;
+       u32 lo, hi;
+
+       if (cpu)
+               return 0;
+       centaur = eps_cpu[cpu];
+       if (centaur == NULL)
+               return 0;
+
+       /* Return current frequency */
+       rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
+       return centaur->fsb * ((lo >> 8) & 0xff);
+}
+
+static int eps_set_state(struct eps_cpu_data *centaur,
+                        unsigned int cpu,
+                        u32 dest_state)
+{
+       struct cpufreq_freqs freqs;
+       u32 lo, hi;
+       int err = 0;
+       int i;
+
+       freqs.old = eps_get(cpu);
+       freqs.new = centaur->fsb * ((dest_state >> 8) & 0xff);
+       freqs.cpu = cpu;
+       cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
+
+       /* Wait while CPU is busy */
+       rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
+       i = 0;
+       while (lo & ((1 << 16) | (1 << 17))) {
+               udelay(16);
+               rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
+               i++;
+               if (unlikely(i > 64)) {
+                       err = -ENODEV;
+                       goto postchange;
+               }
+       }
+       /* Set new multiplier and voltage */
+       wrmsr(MSR_IA32_PERF_CTL, dest_state & 0xffff, 0);
+       /* Wait until transition end */
+       i = 0;
+       do {
+               udelay(16);
+               rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
+               i++;
+               if (unlikely(i > 64)) {
+                       err = -ENODEV;
+                       goto postchange;
+               }
+       } while (lo & ((1 << 16) | (1 << 17)));
+
+       /* Return current frequency */
+postchange:
+       rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
+       freqs.new = centaur->fsb * ((lo >> 8) & 0xff);
+
+       cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
+       return err;
+}
+
+static int eps_target(struct cpufreq_policy *policy,
+                              unsigned int target_freq,
+                              unsigned int relation)
+{
+       struct eps_cpu_data *centaur;
+       unsigned int newstate = 0;
+       unsigned int cpu = policy->cpu;
+       unsigned int dest_state;
+       int ret;
+
+       if (unlikely(eps_cpu[cpu] == NULL))
+               return -ENODEV;
+       centaur = eps_cpu[cpu];
+
+       if (unlikely(cpufreq_frequency_table_target(policy,
+                       &eps_cpu[cpu]->freq_table[0],
+                       target_freq,
+                       relation,
+                       &newstate))) {
+               return -EINVAL;
+       }
+
+       /* Make frequency transition */
+       dest_state = centaur->freq_table[newstate].index & 0xffff;
+       ret = eps_set_state(centaur, cpu, dest_state);
+       if (ret)
+               printk(KERN_ERR "eps: Timeout!\n");
+       return ret;
+}
+
+static int eps_verify(struct cpufreq_policy *policy)
+{
+       return cpufreq_frequency_table_verify(policy,
+                       &eps_cpu[policy->cpu]->freq_table[0]);
+}
+
+static int eps_cpu_init(struct cpufreq_policy *policy)
+{
+       unsigned int i;
+       u32 lo, hi;
+       u64 val;
+       u8 current_multiplier, current_voltage;
+       u8 max_multiplier, max_voltage;
+       u8 min_multiplier, min_voltage;
+       u8 brand;
+       u32 fsb;
+       struct eps_cpu_data *centaur;
+       struct cpufreq_frequency_table *f_table;
+       int k, step, voltage;
+       int ret;
+       int states;
+
+       if (policy->cpu != 0)
+               return -ENODEV;
+
+       /* Check brand */
+       printk("eps: Detected VIA ");
+       rdmsr(0x1153, lo, hi);
+       brand = (((lo >> 2) ^ lo) >> 18) & 3;
+       switch(brand) {
+       case EPS_BRAND_C7M:
+               printk("C7-M\n");
+               break;
+       case EPS_BRAND_C7:
+               printk("C7\n");
+               break;
+       case EPS_BRAND_EDEN:
+               printk("Eden\n");
+               break;
+       case EPS_BRAND_C3:
+               printk("C3\n");
+               return -ENODEV;
+               break;
+       }
+       /* Enable Enhanced PowerSaver */
+       rdmsrl(MSR_IA32_MISC_ENABLE, val);
+       if (!(val & 1 << 16)) {
+               val |= 1 << 16;
+               wrmsrl(MSR_IA32_MISC_ENABLE, val);
+               /* Can be locked at 0 */
+               rdmsrl(MSR_IA32_MISC_ENABLE, val);
+               if (!(val & 1 << 16)) {
+                       printk("eps: Can't enable Enhanced PowerSaver\n");
+                       return -ENODEV;
+               }
+       }
+
+       /* Print voltage and multiplier */
+       rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
+       current_voltage = lo & 0xff;
+       printk("eps: Current voltage = %dmV\n", current_voltage * 16 + 700);
+       current_multiplier = (lo >> 8) & 0xff;
+       printk("eps: Current multiplier = %d\n", current_multiplier);
+
+       /* Print limits */
+       max_voltage = hi & 0xff;
+       printk("eps: Highest voltage = %dmV\n", max_voltage * 16 + 700);
+       max_multiplier = (hi >> 8) & 0xff;
+       printk("eps: Highest multiplier = %d\n", max_multiplier);
+       min_voltage = (hi >> 16) & 0xff;
+       printk("eps: Lowest voltage = %dmV\n", min_voltage * 16 + 700);
+       min_multiplier = (hi >> 24) & 0xff;
+       printk("eps: Lowest multiplier = %d\n", min_multiplier);
+
+       /* Sanity checks */
+       if (current_multiplier == 0 || max_multiplier == 0
+           || min_multiplier == 0)
+               return -EINVAL;
+       if (current_multiplier > max_multiplier
+           || max_multiplier <= min_multiplier)
+               return -EINVAL;
+       if (current_voltage > 0x1c || max_voltage > 0x1c)
+               return -EINVAL;
+       if (max_voltage < min_voltage)
+               return -EINVAL;
+
+       /* Calc FSB speed */
+       fsb = cpu_khz / current_multiplier;
+       /* Calc number of p-states supported */
+       if (brand == EPS_BRAND_C7M)
+               states = max_multiplier - min_multiplier + 1;
+       else
+               states = 2;
+
+       /* Allocate private data and frequency table for current cpu */
+       centaur = kzalloc(sizeof(struct eps_cpu_data)
+                   + (states + 1) * sizeof(struct cpufreq_frequency_table),
+                   GFP_KERNEL);
+       if (!centaur)
+               return -ENOMEM;
+       eps_cpu[0] = centaur;
+
+       /* Copy basic values */
+       centaur->fsb = fsb;
+
+       /* Fill frequency and MSR value table */
+       f_table = &centaur->freq_table[0];
+       if (brand != EPS_BRAND_C7M) {
+               f_table[0].frequency = fsb * min_multiplier;
+               f_table[0].index = (min_multiplier << 8) | min_voltage;
+               f_table[1].frequency = fsb * max_multiplier;
+               f_table[1].index = (max_multiplier << 8) | max_voltage;
+               f_table[2].frequency = CPUFREQ_TABLE_END;
+       } else {
+               k = 0;
+               step = ((max_voltage - min_voltage) * 256)
+                       / (max_multiplier - min_multiplier);
+               for (i = min_multiplier; i <= max_multiplier; i++) {
+                       voltage = (k * step) / 256 + min_voltage;
+                       f_table[k].frequency = fsb * i;
+                       f_table[k].index = (i << 8) | voltage;
+                       k++;
+               }
+               f_table[k].frequency = CPUFREQ_TABLE_END;
+       }
+
+       policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
+       policy->cpuinfo.transition_latency = 140000; /* 844mV -> 700mV in ns */
+       policy->cur = fsb * current_multiplier;
+
+       ret = cpufreq_frequency_table_cpuinfo(policy, &centaur->freq_table[0]);
+       if (ret) {
+               kfree(centaur);
+               return ret;
+       }
+
+       cpufreq_frequency_table_get_attr(&centaur->freq_table[0], policy->cpu);
+       return 0;
+}
+
+static int eps_cpu_exit(struct cpufreq_policy *policy)
+{
+       unsigned int cpu = policy->cpu;
+       struct eps_cpu_data *centaur;
+       u32 lo, hi;
+
+       if (eps_cpu[cpu] == NULL)
+               return -ENODEV;
+       centaur = eps_cpu[cpu];
+
+       /* Get max frequency */
+       rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
+       /* Set max frequency */
+       eps_set_state(centaur, cpu, hi & 0xffff);
+       /* Bye */
+       cpufreq_frequency_table_put_attr(policy->cpu);
+       kfree(eps_cpu[cpu]);
+       eps_cpu[cpu] = NULL;
+       return 0;
+}
+
+static struct freq_attr* eps_attr[] = {
+       &cpufreq_freq_attr_scaling_available_freqs,
+       NULL,
+};
+
+static struct cpufreq_driver eps_driver = {
+       .verify         = eps_verify,
+       .target         = eps_target,
+       .init           = eps_cpu_init,
+       .exit           = eps_cpu_exit,
+       .get            = eps_get,
+       .name           = "e_powersaver",
+       .owner          = THIS_MODULE,
+       .attr           = eps_attr,
+};
+
+static int __init eps_init(void)
+{
+       struct cpuinfo_x86 *c = cpu_data;
+
+       /* This driver will work only on Centaur C7 processors with
+        * Enhanced SpeedStep/PowerSaver registers */
+       if (c->x86_vendor != X86_VENDOR_CENTAUR
+           || c->x86 != 6 || c->x86_model != 10)
+               return -ENODEV;
+       if (!cpu_has(c, X86_FEATURE_EST))
+               return -ENODEV;
+
+       if (cpufreq_register_driver(&eps_driver))
+               return -EINVAL;
+       return 0;
+}
+
+static void __exit eps_exit(void)
+{
+       cpufreq_unregister_driver(&eps_driver);
+}
+
+MODULE_AUTHOR("Rafa³ Bilski <rafalbilski@interia.pl>");
+MODULE_DESCRIPTION("Enhanced PowerSaver driver for VIA C7 CPU's.");
+MODULE_LICENSE("GPL");
+
+module_init(eps_init);
+module_exit(eps_exit);
index a3db9332d652eccbc9c3745b55aaf309c4eebbe7..b59878a0d9b31a6f58b939f64bebadc656c55752 100644 (file)
@@ -8,12 +8,11 @@
  *  VIA have currently 3 different versions of Longhaul.
  *  Version 1 (Longhaul) uses the BCR2 MSR at 0x1147.
  *   It is present only in Samuel 1 (C5A), Samuel 2 (C5B) stepping 0.
- *  Version 2 of longhaul is the same as v1, but adds voltage scaling.
- *   Present in Samuel 2 (steppings 1-7 only) (C5B), and Ezra (C5C)
- *   voltage scaling support has currently been disabled in this driver
- *   until we have code that gets it right.
+ *  Version 2 of longhaul is backward compatible with v1, but adds
+ *   LONGHAUL MSR for purpose of both frequency and voltage scaling.
+ *   Present in Samuel 2 (steppings 1-7 only) (C5B), and Ezra (C5C).
  *  Version 3 of longhaul got renamed to Powersaver and redesigned
- *   to use the POWERSAVER MSR at 0x110a.
+ *   to use only the POWERSAVER MSR at 0x110a.
  *   It is present in Ezra-T (C5M), Nehemiah (C5X) and above.
  *   It's pretty much the same feature wise to longhaul v2, though
  *   there is provision for scaling FSB too, but this doesn't work
 #define        CPU_EZRA        3
 #define        CPU_EZRA_T      4
 #define        CPU_NEHEMIAH    5
+#define        CPU_NEHEMIAH_C  6
 
 /* Flags */
 #define USE_ACPI_C3            (1 << 1)
 #define USE_NORTHBRIDGE                (1 << 2)
+#define USE_VT8235             (1 << 3)
 
 static int cpu_model;
 static unsigned int numscales=16;
@@ -63,7 +64,8 @@ static unsigned int fsb;
 static struct mV_pos *vrm_mV_table;
 static unsigned char *mV_vrm_table;
 struct f_msr {
-       unsigned char vrm;
+       u8 vrm;
+       u8 pos;
 };
 static struct f_msr f_msr_table[32];
 
@@ -73,10 +75,10 @@ static int can_scale_voltage;
 static struct acpi_processor *pr = NULL;
 static struct acpi_processor_cx *cx = NULL;
 static u8 longhaul_flags;
+static u8 longhaul_pos;
 
 /* Module parameters */
 static int scale_voltage;
-static int ignore_latency;
 
 #define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "longhaul", msg)
 
@@ -164,26 +166,47 @@ static void do_longhaul1(unsigned int clock_ratio_index)
 static void do_powersaver(int cx_address, unsigned int clock_ratio_index)
 {
        union msr_longhaul longhaul;
+       u8 dest_pos;
        u32 t;
 
+       dest_pos = f_msr_table[clock_ratio_index].pos;
+
        rdmsrl(MSR_VIA_LONGHAUL, longhaul.val);
+       /* Setup new frequency */
        longhaul.bits.RevisionKey = longhaul.bits.RevisionID;
        longhaul.bits.SoftBusRatio = clock_ratio_index & 0xf;
        longhaul.bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4;
-       longhaul.bits.EnableSoftBusRatio = 1;
-
-       if (can_scale_voltage) {
+       /* Setup new voltage */
+       if (can_scale_voltage)
                longhaul.bits.SoftVID = f_msr_table[clock_ratio_index].vrm;
+       /* Sync to timer tick */
+       safe_halt();
+       /* Raise voltage if necessary */
+       if (can_scale_voltage && longhaul_pos < dest_pos) {
                longhaul.bits.EnableSoftVID = 1;
+               wrmsrl(MSR_VIA_LONGHAUL, longhaul.val);
+               /* Change voltage */
+               if (!cx_address) {
+                       ACPI_FLUSH_CPU_CACHE();
+                       halt();
+               } else {
+                       ACPI_FLUSH_CPU_CACHE();
+                       /* Invoke C3 */
+                       inb(cx_address);
+                       /* Dummy op - must do something useless after P_LVL3
+                        * read */
+                       t = inl(acpi_gbl_FADT.xpm_timer_block.address);
+               }
+               longhaul.bits.EnableSoftVID = 0;
+               wrmsrl(MSR_VIA_LONGHAUL, longhaul.val);
+               longhaul_pos = dest_pos;
        }
 
-       /* Sync to timer tick */
-       safe_halt();
        /* Change frequency on next halt or sleep */
+       longhaul.bits.EnableSoftBusRatio = 1;
        wrmsrl(MSR_VIA_LONGHAUL, longhaul.val);
        if (!cx_address) {
                ACPI_FLUSH_CPU_CACHE();
-               /* Invoke C1 */
                halt();
        } else {
                ACPI_FLUSH_CPU_CACHE();
@@ -193,12 +216,29 @@ static void do_powersaver(int cx_address, unsigned int clock_ratio_index)
                t = inl(acpi_gbl_FADT.xpm_timer_block.address);
        }
        /* Disable bus ratio bit */
-       local_irq_disable();
-       longhaul.bits.RevisionKey = longhaul.bits.RevisionID;
        longhaul.bits.EnableSoftBusRatio = 0;
-       longhaul.bits.EnableSoftBSEL = 0;
-       longhaul.bits.EnableSoftVID = 0;
        wrmsrl(MSR_VIA_LONGHAUL, longhaul.val);
+
+       /* Reduce voltage if necessary */
+       if (can_scale_voltage && longhaul_pos > dest_pos) {
+               longhaul.bits.EnableSoftVID = 1;
+               wrmsrl(MSR_VIA_LONGHAUL, longhaul.val);
+               /* Change voltage */
+               if (!cx_address) {
+                       ACPI_FLUSH_CPU_CACHE();
+                       halt();
+               } else {
+                       ACPI_FLUSH_CPU_CACHE();
+                       /* Invoke C3 */
+                       inb(cx_address);
+                       /* Dummy op - must do something useless after P_LVL3
+                        * read */
+                       t = inl(acpi_gbl_FADT.xpm_timer_block.address);
+               }
+               longhaul.bits.EnableSoftVID = 0;
+               wrmsrl(MSR_VIA_LONGHAUL, longhaul.val);
+               longhaul_pos = dest_pos;
+       }
 }
 
 /**
@@ -257,26 +297,19 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
        /*
         * Longhaul v1. (Samuel[C5A] and Samuel2 stepping 0[C5B])
         * Software controlled multipliers only.
-        *
-        * *NB* Until we get voltage scaling working v1 & v2 are the same code.
-        * Longhaul v2 appears in Samuel2 Steppings 1->7 [C5b] and Ezra [C5C]
         */
        case TYPE_LONGHAUL_V1:
-       case TYPE_LONGHAUL_V2:
                do_longhaul1(clock_ratio_index);
                break;
 
        /*
+        * Longhaul v2 appears in Samuel2 Steppings 1->7 [C5B] and Ezra [C5C]
+        *
         * Longhaul v3 (aka Powersaver). (Ezra-T [C5M] & Nehemiah [C5N])
-        * We can scale voltage with this too, but that's currently
-        * disabled until we come up with a decent 'match freq to voltage'
-        * algorithm.
-        * When we add voltage scaling, we will also need to do the
-        * voltage/freq setting in order depending on the direction
-        * of scaling (like we do in powernow-k7.c)
         * Nehemiah can do FSB scaling too, but this has never been proven
         * to work in practice.
         */
+       case TYPE_LONGHAUL_V2:
        case TYPE_POWERSAVER:
                if (longhaul_flags & USE_ACPI_C3) {
                        /* Don't allow wakeup */
@@ -301,6 +334,7 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
        local_irq_restore(flags);
        preempt_enable();
 
+       freqs.new = calc_speed(longhaul_get_cpu_mult());
        cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
 }
 
@@ -315,31 +349,19 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
 
 #define ROUNDING       0xf
 
-static int _guess(int guess, int mult)
-{
-       int target;
-
-       target = ((mult/10)*guess);
-       if (mult%10 != 0)
-               target += (guess/2);
-       target += ROUNDING/2;
-       target &= ~ROUNDING;
-       return target;
-}
-
-
 static int guess_fsb(int mult)
 {
-       int speed = (cpu_khz/1000);
+       int speed = cpu_khz / 1000;
        int i;
-       int speeds[] = { 66, 100, 133, 200 };
-
-       speed += ROUNDING/2;
-       speed &= ~ROUNDING;
-
-       for (i=0; i<4; i++) {
-               if (_guess(speeds[i], mult) == speed)
-                       return speeds[i];
+       int speeds[] = { 666, 1000, 1333, 2000 };
+       int f_max, f_min;
+
+       for (i = 0; i < 4; i++) {
+               f_max = ((speeds[i] * mult) + 50) / 100;
+               f_max += (ROUNDING / 2);
+               f_min = f_max - ROUNDING;
+               if ((speed <= f_max) && (speed >= f_min))
+                       return speeds[i] / 10;
        }
        return 0;
 }
@@ -347,67 +369,40 @@ static int guess_fsb(int mult)
 
 static int __init longhaul_get_ranges(void)
 {
-       unsigned long invalue;
-       unsigned int ezra_t_multipliers[32]= {
-                       90,  30,  40, 100,  55,  35,  45,  95,
-                       50,  70,  80,  60, 120,  75,  85,  65,
-                       -1, 110, 120,  -1, 135, 115, 125, 105,
-                       130, 150, 160, 140,  -1, 155,  -1, 145 };
        unsigned int j, k = 0;
-       union msr_longhaul longhaul;
-       int mult = 0;
+       int mult;
 
-       switch (longhaul_version) {
-       case TYPE_LONGHAUL_V1:
-       case TYPE_LONGHAUL_V2:
-               /* Ugh, Longhaul v1 didn't have the min/max MSRs.
-                  Assume min=3.0x & max = whatever we booted at. */
+       /* Get current frequency */
+       mult = longhaul_get_cpu_mult();
+       if (mult == -1) {
+               printk(KERN_INFO PFX "Invalid (reserved) multiplier!\n");
+               return -EINVAL;
+       }
+       fsb = guess_fsb(mult);
+       if (fsb == 0) {
+               printk(KERN_INFO PFX "Invalid (reserved) FSB!\n");
+               return -EINVAL;
+       }
+       /* Get max multiplier - as we always did.
+        * Longhaul MSR is usefull only when voltage scaling is enabled.
+        * C3 is booting at max anyway. */
+       maxmult = mult;
+       /* Get min multiplier */
+       switch (cpu_model) {
+       case CPU_NEHEMIAH:
+               minmult = 50;
+               break;
+       case CPU_NEHEMIAH_C:
+               minmult = 40;
+               break;
+       default:
                minmult = 30;
-               maxmult = mult = longhaul_get_cpu_mult();
                break;
-
-       case TYPE_POWERSAVER:
-               /* Ezra-T */
-               if (cpu_model==CPU_EZRA_T) {
-                       minmult = 30;
-                       rdmsrl (MSR_VIA_LONGHAUL, longhaul.val);
-                       invalue = longhaul.bits.MaxMHzBR;
-                       if (longhaul.bits.MaxMHzBR4)
-                               invalue += 16;
-                       maxmult = mult = ezra_t_multipliers[invalue];
-                       break;
-               }
-
-               /* Nehemiah */
-               if (cpu_model==CPU_NEHEMIAH) {
-                       rdmsrl (MSR_VIA_LONGHAUL, longhaul.val);
-
-                       /*
-                        * TODO: This code works, but raises a lot of questions.
-                        * - Some Nehemiah's seem to have broken Min/MaxMHzBR's.
-                        *   We get around this by using a hardcoded multiplier of 4.0x
-                        *   for the minimimum speed, and the speed we booted up at for the max.
-                        *   This is done in longhaul_get_cpu_mult() by reading the EBLCR register.
-                        * - According to some VIA documentation EBLCR is only
-                        *   in pre-Nehemiah C3s. How this still works is a mystery.
-                        *   We're possibly using something undocumented and unsupported,
-                        *   But it works, so we don't grumble.
-                        */
-                       minmult=40;
-                       maxmult = mult = longhaul_get_cpu_mult();
-                       break;
-               }
        }
-       fsb = guess_fsb(mult);
 
        dprintk ("MinMult:%d.%dx MaxMult:%d.%dx\n",
                 minmult/10, minmult%10, maxmult/10, maxmult%10);
 
-       if (fsb == 0) {
-               printk (KERN_INFO PFX "Invalid (reserved) FSB!\n");
-               return -EINVAL;
-       }
-
        highest_speed = calc_speed(maxmult);
        lowest_speed = calc_speed(minmult);
        dprintk ("FSB:%dMHz  Lowest speed: %s   Highest speed:%s\n", fsb,
@@ -455,6 +450,7 @@ static void __init longhaul_setup_voltagescaling(void)
        union msr_longhaul longhaul;
        struct mV_pos minvid, maxvid;
        unsigned int j, speed, pos, kHz_step, numvscales;
+       int min_vid_speed;
 
        rdmsrl(MSR_VIA_LONGHAUL, longhaul.val);
        if (!(longhaul.bits.RevisionID & 1)) {
@@ -468,14 +464,14 @@ static void __init longhaul_setup_voltagescaling(void)
                mV_vrm_table = &mV_vrm85[0];
        } else {
                printk (KERN_INFO PFX "Mobile VRM\n");
+               if (cpu_model < CPU_NEHEMIAH)
+                       return;
                vrm_mV_table = &mobilevrm_mV[0];
                mV_vrm_table = &mV_mobilevrm[0];
        }
 
        minvid = vrm_mV_table[longhaul.bits.MinimumVID];
        maxvid = vrm_mV_table[longhaul.bits.MaximumVID];
-       numvscales = maxvid.pos - minvid.pos + 1;
-       kHz_step = (highest_speed - lowest_speed) / numvscales;
 
        if (minvid.mV == 0 || maxvid.mV == 0 || minvid.mV > maxvid.mV) {
                printk (KERN_INFO PFX "Bogus values Min:%d.%03d Max:%d.%03d. "
@@ -491,20 +487,59 @@ static void __init longhaul_setup_voltagescaling(void)
                return;
        }
 
-       printk(KERN_INFO PFX "Max VID=%d.%03d  Min VID=%d.%03d, %d possible voltage scales\n",
+       /* How many voltage steps */
+       numvscales = maxvid.pos - minvid.pos + 1;
+       printk(KERN_INFO PFX
+               "Max VID=%d.%03d  "
+               "Min VID=%d.%03d, "
+               "%d possible voltage scales\n",
                maxvid.mV/1000, maxvid.mV%1000,
                minvid.mV/1000, minvid.mV%1000,
                numvscales);
 
+       /* Calculate max frequency at min voltage */
+       j = longhaul.bits.MinMHzBR;
+       if (longhaul.bits.MinMHzBR4)
+               j += 16;
+       min_vid_speed = eblcr_table[j];
+       if (min_vid_speed == -1)
+               return;
+       switch (longhaul.bits.MinMHzFSB) {
+       case 0:
+               min_vid_speed *= 13333;
+               break;
+       case 1:
+               min_vid_speed *= 10000;
+               break;
+       case 3:
+               min_vid_speed *= 6666;
+               break;
+       default:
+               return;
+               break;
+       }
+       if (min_vid_speed >= highest_speed)
+               return;
+       /* Calculate kHz for one voltage step */
+       kHz_step = (highest_speed - min_vid_speed) / numvscales;
+
+
        j = 0;
        while (longhaul_table[j].frequency != CPUFREQ_TABLE_END) {
                speed = longhaul_table[j].frequency;
-               pos = (speed - lowest_speed) / kHz_step + minvid.pos;
+               if (speed > min_vid_speed)
+                       pos = (speed - min_vid_speed) / kHz_step + minvid.pos;
+               else
+                       pos = minvid.pos;
                f_msr_table[longhaul_table[j].index].vrm = mV_vrm_table[pos];
+               f_msr_table[longhaul_table[j].index].pos = pos;
                j++;
        }
 
+       longhaul_pos = maxvid.pos;
        can_scale_voltage = 1;
+       printk(KERN_INFO PFX "Voltage scaling enabled. "
+               "Use of \"conservative\" governor is highly recommended.\n");
 }
 
 
@@ -573,20 +608,51 @@ static int enable_arbiter_disable(void)
        if (dev != NULL) {
                /* Enable access to port 0x22 */
                pci_read_config_byte(dev, reg, &pci_cmd);
-               if ( !(pci_cmd & 1<<7) ) {
+               if (!(pci_cmd & 1<<7)) {
                        pci_cmd |= 1<<7;
                        pci_write_config_byte(dev, reg, pci_cmd);
+                       pci_read_config_byte(dev, reg, &pci_cmd);
+                       if (!(pci_cmd & 1<<7)) {
+                               printk(KERN_ERR PFX
+                                       "Can't enable access to port 0x22.\n");
+                               return 0;
+                       }
                }
                return 1;
        }
        return 0;
 }
 
+static int longhaul_setup_vt8235(void)
+{
+       struct pci_dev *dev;
+       u8 pci_cmd;
+
+       /* Find VT8235 southbridge */
+       dev = pci_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, NULL);
+       if (dev != NULL) {
+               /* Set transition time to max */
+               pci_read_config_byte(dev, 0xec, &pci_cmd);
+               pci_cmd &= ~(1 << 2);
+               pci_write_config_byte(dev, 0xec, pci_cmd);
+               pci_read_config_byte(dev, 0xe4, &pci_cmd);
+               pci_cmd &= ~(1 << 7);
+               pci_write_config_byte(dev, 0xe4, pci_cmd);
+               pci_read_config_byte(dev, 0xe5, &pci_cmd);
+               pci_cmd |= 1 << 7;
+               pci_write_config_byte(dev, 0xe5, pci_cmd);
+               return 1;
+       }
+       return 0;
+}
+
 static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
 {
        struct cpuinfo_x86 *c = cpu_data;
        char *cpuname=NULL;
        int ret;
+       u32 lo, hi;
+       int vt8235_present;
 
        /* Check what we have on this motherboard */
        switch (c->x86_model) {
@@ -599,16 +665,20 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
                break;
 
        case 7:
-               longhaul_version = TYPE_LONGHAUL_V1;
                switch (c->x86_mask) {
                case 0:
+                       longhaul_version = TYPE_LONGHAUL_V1;
                        cpu_model = CPU_SAMUEL2;
                        cpuname = "C3 'Samuel 2' [C5B]";
-                       /* Note, this is not a typo, early Samuel2's had Samuel1 ratios. */
-                       memcpy (clock_ratio, samuel1_clock_ratio, sizeof(samuel1_clock_ratio));
-                       memcpy (eblcr_table, samuel2_eblcr, sizeof(samuel2_eblcr));
+                       /* Note, this is not a typo, early Samuel2's had
+                        * Samuel1 ratios. */
+                       memcpy(clock_ratio, samuel1_clock_ratio,
+                               sizeof(samuel1_clock_ratio));
+                       memcpy(eblcr_table, samuel2_eblcr,
+                               sizeof(samuel2_eblcr));
                        break;
                case 1 ... 15:
+                       longhaul_version = TYPE_LONGHAUL_V2;
                        if (c->x86_mask < 8) {
                                cpu_model = CPU_SAMUEL2;
                                cpuname = "C3 'Samuel 2' [C5B]";
@@ -616,8 +686,10 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
                                cpu_model = CPU_EZRA;
                                cpuname = "C3 'Ezra' [C5C]";
                        }
-                       memcpy (clock_ratio, ezra_clock_ratio, sizeof(ezra_clock_ratio));
-                       memcpy (eblcr_table, ezra_eblcr, sizeof(ezra_eblcr));
+                       memcpy(clock_ratio, ezra_clock_ratio,
+                               sizeof(ezra_clock_ratio));
+                       memcpy(eblcr_table, ezra_eblcr,
+                               sizeof(ezra_eblcr));
                        break;
                }
                break;
@@ -632,24 +704,24 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
                break;
 
        case 9:
-               cpu_model = CPU_NEHEMIAH;
                longhaul_version = TYPE_POWERSAVER;
-               numscales=32;
+               numscales = 32;
+               memcpy(clock_ratio,
+                      nehemiah_clock_ratio,
+                      sizeof(nehemiah_clock_ratio));
+               memcpy(eblcr_table, nehemiah_eblcr, sizeof(nehemiah_eblcr));
                switch (c->x86_mask) {
                case 0 ... 1:
-                       cpuname = "C3 'Nehemiah A' [C5N]";
-                       memcpy (clock_ratio, nehemiah_a_clock_ratio, sizeof(nehemiah_a_clock_ratio));
-                       memcpy (eblcr_table, nehemiah_a_eblcr, sizeof(nehemiah_a_eblcr));
+                       cpu_model = CPU_NEHEMIAH;
+                       cpuname = "C3 'Nehemiah A' [C5XLOE]";
                        break;
                case 2 ... 4:
-                       cpuname = "C3 'Nehemiah B' [C5N]";
-                       memcpy (clock_ratio, nehemiah_b_clock_ratio, sizeof(nehemiah_b_clock_ratio));
-                       memcpy (eblcr_table, nehemiah_b_eblcr, sizeof(nehemiah_b_eblcr));
+                       cpu_model = CPU_NEHEMIAH;
+                       cpuname = "C3 'Nehemiah B' [C5XLOH]";
                        break;
                case 5 ... 15:
-                       cpuname = "C3 'Nehemiah C' [C5N]";
-                       memcpy (clock_ratio, nehemiah_c_clock_ratio, sizeof(nehemiah_c_clock_ratio));
-                       memcpy (eblcr_table, nehemiah_c_eblcr, sizeof(nehemiah_c_eblcr));
+                       cpu_model = CPU_NEHEMIAH_C;
+                       cpuname = "C3 'Nehemiah C' [C5P]";
                        break;
                }
                break;
@@ -658,6 +730,13 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
                cpuname = "Unknown";
                break;
        }
+       /* Check Longhaul ver. 2 */
+       if (longhaul_version == TYPE_LONGHAUL_V2) {
+               rdmsr(MSR_VIA_LONGHAUL, lo, hi);
+               if (lo == 0 && hi == 0)
+                       /* Looks like MSR isn't present */
+                       longhaul_version = TYPE_LONGHAUL_V1;
+       }
 
        printk (KERN_INFO PFX "VIA %s CPU detected.  ", cpuname);
        switch (longhaul_version) {
@@ -670,15 +749,18 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
                break;
        };
 
+       /* Doesn't hurt */
+       vt8235_present = longhaul_setup_vt8235();
+
        /* Find ACPI data for processor */
-       acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
-                           &longhaul_walk_callback, NULL, (void *)&pr);
+       acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT,
+                               ACPI_UINT32_MAX, &longhaul_walk_callback,
+                               NULL, (void *)&pr);
 
        /* Check ACPI support for C3 state */
-       if ((pr != NULL) && (longhaul_version == TYPE_POWERSAVER)) {
+       if (pr != NULL && longhaul_version != TYPE_LONGHAUL_V1) {
                cx = &pr->power.states[ACPI_STATE_C3];
-               if (cx->address > 0 &&
-                  (cx->latency <= 1000 || ignore_latency != 0) ) {
+               if (cx->address > 0 && cx->latency <= 1000) {
                        longhaul_flags |= USE_ACPI_C3;
                        goto print_support_type;
                }
@@ -688,8 +770,11 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
                longhaul_flags |= USE_NORTHBRIDGE;
                goto print_support_type;
        }
-
-       /* No ACPI C3 or we can't use it */
+       /* Use VT8235 southbridge if present */
+       if (longhaul_version == TYPE_POWERSAVER && vt8235_present) {
+               longhaul_flags |= USE_VT8235;
+               goto print_support_type;
+       }
        /* Check ACPI support for bus master arbiter disable */
        if ((pr == NULL) || !(pr->flags.bm_control)) {
                printk(KERN_ERR PFX
@@ -698,18 +783,18 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
        }
 
 print_support_type:
-       if (!(longhaul_flags & USE_NORTHBRIDGE)) {
-               printk (KERN_INFO PFX "Using ACPI support.\n");
-       } else {
+       if (longhaul_flags & USE_NORTHBRIDGE)
                printk (KERN_INFO PFX "Using northbridge support.\n");
-       }
+       else if (longhaul_flags & USE_VT8235)
+               printk (KERN_INFO PFX "Using VT8235 support.\n");
+       else
+               printk (KERN_INFO PFX "Using ACPI support.\n");
 
        ret = longhaul_get_ranges();
        if (ret != 0)
                return ret;
 
-       if ((longhaul_version==TYPE_LONGHAUL_V2 || longhaul_version==TYPE_POWERSAVER) &&
-                (scale_voltage != 0))
+       if ((longhaul_version != TYPE_LONGHAUL_V1) && (scale_voltage != 0))
                longhaul_setup_voltagescaling();
 
        policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
@@ -797,8 +882,6 @@ static void __exit longhaul_exit(void)
 
 module_param (scale_voltage, int, 0644);
 MODULE_PARM_DESC(scale_voltage, "Scale voltage of processor");
-module_param(ignore_latency, int, 0644);
-MODULE_PARM_DESC(ignore_latency, "Skip ACPI C3 latency test");
 
 MODULE_AUTHOR ("Dave Jones <davej@codemonkey.org.uk>");
 MODULE_DESCRIPTION ("Longhaul driver for VIA Cyrix processors.");
index bc4682aad69b506acd909307ef6eba787013fd64..bb0a04b1d1abe5af709ce624397c838013d0bd46 100644 (file)
@@ -235,84 +235,14 @@ static int __initdata ezrat_eblcr[32] = {
 /*
  * VIA C3 Nehemiah */
 
-static int __initdata nehemiah_a_clock_ratio[32] = {
+static int __initdata  nehemiah_clock_ratio[32] = {
        100, /* 0000 -> 10.0x */
        160, /* 0001 -> 16.0x */
-       -1,  /* 0010 ->  RESERVED */
-       90,  /* 0011 ->  9.0x */
-       95,  /* 0100 ->  9.5x */
-       -1,  /* 0101 ->  RESERVED */
-       -1,  /* 0110 ->  RESERVED */
-       55,  /* 0111 ->  5.5x */
-       60,  /* 1000 ->  6.0x */
-       70,  /* 1001 ->  7.0x */
-       80,  /* 1010 ->  8.0x */
-       50,  /* 1011 ->  5.0x */
-       65,  /* 1100 ->  6.5x */
-       75,  /* 1101 ->  7.5x */
-       85,  /* 1110 ->  8.5x */
-       120, /* 1111 -> 12.0x */
-       100, /* 0000 -> 10.0x */
-       -1,  /* 0001 -> RESERVED */
-       120, /* 0010 -> 12.0x */
-       90,  /* 0011 ->  9.0x */
-       105, /* 0100 -> 10.5x */
-       115, /* 0101 -> 11.5x */
-       125, /* 0110 -> 12.5x */
-       135, /* 0111 -> 13.5x */
-       140, /* 1000 -> 14.0x */
-       150, /* 1001 -> 15.0x */
-       160, /* 1010 -> 16.0x */
-       130, /* 1011 -> 13.0x */
-       145, /* 1100 -> 14.5x */
-       155, /* 1101 -> 15.5x */
-       -1,  /* 1110 -> RESERVED (13.0x) */
-       120, /* 1111 -> 12.0x */
-};
-
-static int __initdata  nehemiah_b_clock_ratio[32] = {
-       100, /* 0000 -> 10.0x */
-       160, /* 0001 -> 16.0x */
-       -1,  /* 0010 ->  RESERVED */
-       90,  /* 0011 ->  9.0x */
-       95,  /* 0100 ->  9.5x */
-       -1,  /* 0101 ->  RESERVED */
-       -1,  /* 0110 ->  RESERVED */
-       55,  /* 0111 ->  5.5x */
-       60,  /* 1000 ->  6.0x */
-       70,  /* 1001 ->  7.0x */
-       80,  /* 1010 ->  8.0x */
-       50,  /* 1011 ->  5.0x */
-       65,  /* 1100 ->  6.5x */
-       75,  /* 1101 ->  7.5x */
-       85,  /* 1110 ->  8.5x */
-       120, /* 1111 -> 12.0x */
-       100, /* 0000 -> 10.0x */
-       110, /* 0001 -> 11.0x */
-       120, /* 0010 -> 12.0x */
-       90,  /* 0011 ->  9.0x */
-       105, /* 0100 -> 10.5x */
-       115, /* 0101 -> 11.5x */
-       125, /* 0110 -> 12.5x */
-       135, /* 0111 -> 13.5x */
-       140, /* 1000 -> 14.0x */
-       150, /* 1001 -> 15.0x */
-       160, /* 1010 -> 16.0x */
-       130, /* 1011 -> 13.0x */
-       145, /* 1100 -> 14.5x */
-       155, /* 1101 -> 15.5x */
-       -1,  /* 1110 -> RESERVED (13.0x) */
-       120, /* 1111 -> 12.0x */
-};
-
-static int __initdata  nehemiah_c_clock_ratio[32] = {
-       100, /* 0000 -> 10.0x */
-       160, /* 0001 -> 16.0x */
-       40,  /* 0010 ->  RESERVED */
+       40,  /* 0010 ->  4.0x */
        90,  /* 0011 ->  9.0x */
        95,  /* 0100 ->  9.5x */
        -1,  /* 0101 ->  RESERVED */
-       45,  /* 0110 ->  RESERVED */
+       45,  /* 0110 ->  4.5x */
        55,  /* 0111 ->  5.5x */
        60,  /* 1000 ->  6.0x */
        70,  /* 1001 ->  7.0x */
@@ -340,84 +270,14 @@ static int __initdata  nehemiah_c_clock_ratio[32] = {
        120, /* 1111 -> 12.0x */
 };
 
-static int __initdata nehemiah_a_eblcr[32] = {
-       50,  /* 0000 ->  5.0x */
-       160, /* 0001 -> 16.0x */
-       -1,  /* 0010 ->  RESERVED */
-       100, /* 0011 -> 10.0x */
-       55,  /* 0100 ->  5.5x */
-       -1,  /* 0101 ->  RESERVED */
-       -1,  /* 0110 ->  RESERVED */
-       95,  /* 0111 ->  9.5x */
-       90,  /* 1000 ->  9.0x */
-       70,  /* 1001 ->  7.0x */
-       80,  /* 1010 ->  8.0x */
-       60,  /* 1011 ->  6.0x */
-       120, /* 1100 -> 12.0x */
-       75,  /* 1101 ->  7.5x */
-       85,  /* 1110 ->  8.5x */
-       65,  /* 1111 ->  6.5x */
-       90,  /* 0000 ->  9.0x */
-       -1,  /* 0001 -> RESERVED */
-       120, /* 0010 -> 12.0x */
-       100, /* 0011 -> 10.0x */
-       135, /* 0100 -> 13.5x */
-       115, /* 0101 -> 11.5x */
-       125, /* 0110 -> 12.5x */
-       105, /* 0111 -> 10.5x */
-       130, /* 1000 -> 13.0x */
-       150, /* 1001 -> 15.0x */
-       160, /* 1010 -> 16.0x */
-       140, /* 1011 -> 14.0x */
-       120, /* 1100 -> 12.0x */
-       155, /* 1101 -> 15.5x */
-       -1,  /* 1110 -> RESERVED (13.0x) */
-       145 /* 1111 -> 14.5x */
-   /* end of table  */
-};
-static int __initdata nehemiah_b_eblcr[32] = {
-       50,  /* 0000 ->  5.0x */
-       160, /* 0001 -> 16.0x */
-       -1,  /* 0010 ->  RESERVED */
-       100, /* 0011 -> 10.0x */
-       55,  /* 0100 ->  5.5x */
-       -1,  /* 0101 ->  RESERVED */
-       -1,  /* 0110 ->  RESERVED */
-       95,  /* 0111 ->  9.5x */
-       90,  /* 1000 ->  9.0x */
-       70,  /* 1001 ->  7.0x */
-       80,  /* 1010 ->  8.0x */
-       60,  /* 1011 ->  6.0x */
-       120, /* 1100 -> 12.0x */
-       75,  /* 1101 ->  7.5x */
-       85,  /* 1110 ->  8.5x */
-       65,  /* 1111 ->  6.5x */
-       90,  /* 0000 ->  9.0x */
-       110, /* 0001 -> 11.0x */
-       120, /* 0010 -> 12.0x */
-       100, /* 0011 -> 10.0x */
-       135, /* 0100 -> 13.5x */
-       115, /* 0101 -> 11.5x */
-       125, /* 0110 -> 12.5x */
-       105, /* 0111 -> 10.5x */
-       130, /* 1000 -> 13.0x */
-       150, /* 1001 -> 15.0x */
-       160, /* 1010 -> 16.0x */
-       140, /* 1011 -> 14.0x */
-       120, /* 1100 -> 12.0x */
-       155, /* 1101 -> 15.5x */
-       -1,  /* 1110 -> RESERVED (13.0x) */
-       145 /* 1111 -> 14.5x */
-          /* end of table  */
-};
-static int __initdata nehemiah_c_eblcr[32] = {
+static int __initdata nehemiah_eblcr[32] = {
        50,  /* 0000 ->  5.0x */
        160, /* 0001 -> 16.0x */
-       40,  /* 0010 ->  RESERVED */
+       40,  /* 0010 ->  4.0x */
        100, /* 0011 -> 10.0x */
        55,  /* 0100 ->  5.5x */
        -1,  /* 0101 ->  RESERVED */
-       45,  /* 0110 ->  RESERVED */
+       45,  /* 0110 ->  4.5x */
        95,  /* 0111 ->  9.5x */
        90,  /* 1000 ->  9.0x */
        70,  /* 1001 ->  7.0x */
@@ -443,7 +303,6 @@ static int __initdata nehemiah_c_eblcr[32] = {
        155, /* 1101 -> 15.5x */
        -1,  /* 1110 -> RESERVED (13.0x) */
        145 /* 1111 -> 14.5x */
-         /* end of table  */
 };
 
 /*
index 2d64916725592dd98d69faf36df2d6bd14d284f3..fe3b67005ebbb1d04ea17c20e804b47cf8cede7e 100644 (file)
@@ -1289,7 +1289,11 @@ static unsigned int powernowk8_get (unsigned int cpu)
        if (query_current_values_with_pending_wait(data))
                goto out;
 
-       khz = find_khz_freq_from_fid(data->currfid);
+       if (cpu_family == CPU_HW_PSTATE)
+               khz = find_khz_freq_from_fiddid(data->currfid, data->currdid);
+       else
+               khz = find_khz_freq_from_fid(data->currfid);
+
 
 out:
        set_cpus_allowed(current, oldmask);
index c0c3b59de32c4d183b677e843ffacffa5aa2f1bb..de27bd07bc9c853c36ee21cdd4ddfaa9ea455663 100644 (file)
@@ -6,6 +6,7 @@
 #include <asm/io.h>
 #include <asm/processor.h>
 #include <asm/timer.h>
+#include <asm/pci-direct.h>
 
 #include "cpu.h"
 
@@ -161,19 +162,19 @@ static void __cpuinit set_cx86_inc(void)
 static void __cpuinit geode_configure(void)
 {
        unsigned long flags;
-       u8 ccr3, ccr4;
+       u8 ccr3;
        local_irq_save(flags);
 
        /* Suspend on halt power saving and enable #SUSP pin */
        setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x88);
 
        ccr3 = getCx86(CX86_CCR3);
-       setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10);       /* Enable */
-       
-       ccr4 = getCx86(CX86_CCR4);
-       ccr4 |= 0x38;           /* FPU fast, DTE cache, Mem bypass */
+       setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10);       /* enable MAPEN */
        
-       setCx86(CX86_CCR3, ccr3);
+
+       /* FPU fast, DTE cache, Mem bypass */
+       setCx86(CX86_CCR4, getCx86(CX86_CCR4) | 0x38);
+       setCx86(CX86_CCR3, ccr3);                       /* disable MAPEN */
        
        set_cx86_memwb();
        set_cx86_reorder();     
@@ -183,14 +184,6 @@ static void __cpuinit geode_configure(void)
 }
 
 
-#ifdef CONFIG_PCI
-static struct pci_device_id __cpuinitdata cyrix_55x0[] = {
-       { PCI_DEVICE(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5510) },
-       { PCI_DEVICE(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5520) },
-       { },
-};
-#endif
-
 static void __cpuinit init_cyrix(struct cpuinfo_x86 *c)
 {
        unsigned char dir0, dir0_msn, dir0_lsn, dir1 = 0;
@@ -258,6 +251,8 @@ static void __cpuinit init_cyrix(struct cpuinfo_x86 *c)
 
        case 4: /* MediaGX/GXm or Geode GXM/GXLV/GX1 */
 #ifdef CONFIG_PCI
+       {
+               u32 vendor, device;
                /* It isn't really a PCI quirk directly, but the cure is the
                   same. The MediaGX has deep magic SMM stuff that handles the
                   SB emulation. It thows away the fifo on disable_dma() which
@@ -273,22 +268,34 @@ static void __cpuinit init_cyrix(struct cpuinfo_x86 *c)
                printk(KERN_INFO "Working around Cyrix MediaGX virtual DMA bugs.\n");
                isa_dma_bridge_buggy = 2;
 
+               /* We do this before the PCI layer is running. However we
+                  are safe here as we know the bridge must be a Cyrix
+                  companion and must be present */
+               vendor = read_pci_config_16(0, 0, 0x12, PCI_VENDOR_ID);
+               device = read_pci_config_16(0, 0, 0x12, PCI_DEVICE_ID);
 
                /*
                 *  The 5510/5520 companion chips have a funky PIT.
                 */  
-               if (pci_dev_present(cyrix_55x0))
+               if (vendor == PCI_VENDOR_ID_CYRIX &&
+        (device == PCI_DEVICE_ID_CYRIX_5510 || device == PCI_DEVICE_ID_CYRIX_5520))
                        pit_latch_buggy = 1;
+       }
 #endif
                c->x86_cache_size=16;   /* Yep 16K integrated cache thats it */
 
                /* GXm supports extended cpuid levels 'ala' AMD */
                if (c->cpuid_level == 2) {
                        /* Enable cxMMX extensions (GX1 Datasheet 54) */
-                       setCx86(CX86_CCR7, getCx86(CX86_CCR7)|1);
+                       setCx86(CX86_CCR7, getCx86(CX86_CCR7) | 1);
                        
-                       /* GXlv/GXm/GX1 */
-                       if((dir1 >= 0x50 && dir1 <= 0x54) || dir1 >= 0x63)
+                       /*
+                        * GXm : 0x30 ... 0x5f GXm  datasheet 51
+                        * GXlv: 0x6x          GXlv datasheet 54
+                        *  ?  : 0x7x
+                        * GX1 : 0x8x          GX1  datasheet 56
+                        */
+                       if((0x30 <= dir1 && dir1 <= 0x6f) || (0x80 <=dir1 && dir1 <= 0x8f))
                                geode_configure();
                        get_model_name(c);  /* get CPU marketing name */
                        return;
@@ -415,15 +422,14 @@ static void __cpuinit cyrix_identify(struct cpuinfo_x86 * c)
                
                if (dir0 == 5 || dir0 == 3)
                {
-                       unsigned char ccr3, ccr4;
+                       unsigned char ccr3;
                        unsigned long flags;
                        printk(KERN_INFO "Enabling CPUID on Cyrix processor.\n");
                        local_irq_save(flags);
                        ccr3 = getCx86(CX86_CCR3);
-                       setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10); /* enable MAPEN  */
-                       ccr4 = getCx86(CX86_CCR4);
-                       setCx86(CX86_CCR4, ccr4 | 0x80);          /* enable cpuid  */
-                       setCx86(CX86_CCR3, ccr3);                 /* disable MAPEN */
+                       setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10);       /* enable MAPEN  */
+                       setCx86(CX86_CCR4, getCx86(CX86_CCR4) | 0x80);  /* enable cpuid  */
+                       setCx86(CX86_CCR3, ccr3);                       /* disable MAPEN */
                        local_irq_restore(flags);
                }
        }
index d555bec0db99d0c0cfa1f3d910a3a17403e7709d..4f10c62d180c1521b26fa5007ca8120e12e4d409 100644 (file)
@@ -12,6 +12,7 @@
 
 #include <asm/processor.h> 
 #include <asm/system.h>
+#include <asm/mce.h>
 
 #include "mce.h"
 
index 84fd4cf7d0fb11e4396c981f0319af9d85b4dc5f..81fb6e2d35f37e2109d02a0e5b98fb1335261e4f 100644 (file)
@@ -1,4 +1,5 @@
 #include <linux/init.h>
+#include <asm/mce.h>
 
 void amd_mcheck_init(struct cpuinfo_x86 *c);
 void intel_p4_mcheck_init(struct cpuinfo_x86 *c);
@@ -9,6 +10,5 @@ void winchip_mcheck_init(struct cpuinfo_x86 *c);
 /* Call the installed machine check handler for this CPU setup. */
 extern fastcall void (*machine_check_vector)(struct pt_regs *, long error_code);
 
-extern int mce_disabled;
 extern int nr_mce_banks;
 
index 504434a46011e2ca553a7e6f67ccfad3c5ec7fc1..8359c19d3a23d1c531a543a766d00d7ca5842b61 100644 (file)
@@ -12,6 +12,7 @@
 #include <asm/system.h>
 #include <asm/msr.h>
 #include <asm/apic.h>
+#include <asm/idle.h>
 
 #include <asm/therm_throt.h>
 
@@ -59,6 +60,7 @@ static void (*vendor_thermal_interrupt)(struct pt_regs *regs) = unexpected_therm
 
 fastcall void smp_thermal_interrupt(struct pt_regs *regs)
 {
+       exit_idle();
        irq_enter();
        vendor_thermal_interrupt(regs);
        irq_exit();
index 5ae1705eafa6281adcfc065702a0d2743575d5e2..c7d8f175674525543baa11f712b1241eeb364d67 100644 (file)
@@ -211,6 +211,9 @@ mtrr_ioctl(struct file *file, unsigned int cmd, unsigned long __arg)
        default:
                return -ENOTTY;
        case MTRRIOC_ADD_ENTRY:
+#ifdef CONFIG_COMPAT
+       case MTRRIOC32_ADD_ENTRY:
+#endif
                if (!capable(CAP_SYS_ADMIN))
                        return -EPERM;
                err =
@@ -218,21 +221,33 @@ mtrr_ioctl(struct file *file, unsigned int cmd, unsigned long __arg)
                                  file, 0);
                break;
        case MTRRIOC_SET_ENTRY:
+#ifdef CONFIG_COMPAT
+       case MTRRIOC32_SET_ENTRY:
+#endif
                if (!capable(CAP_SYS_ADMIN))
                        return -EPERM;
                err = mtrr_add(sentry.base, sentry.size, sentry.type, 0);
                break;
        case MTRRIOC_DEL_ENTRY:
+#ifdef CONFIG_COMPAT
+       case MTRRIOC32_DEL_ENTRY:
+#endif
                if (!capable(CAP_SYS_ADMIN))
                        return -EPERM;
                err = mtrr_file_del(sentry.base, sentry.size, file, 0);
                break;
        case MTRRIOC_KILL_ENTRY:
+#ifdef CONFIG_COMPAT
+       case MTRRIOC32_KILL_ENTRY:
+#endif
                if (!capable(CAP_SYS_ADMIN))
                        return -EPERM;
                err = mtrr_del(-1, sentry.base, sentry.size);
                break;
        case MTRRIOC_GET_ENTRY:
+#ifdef CONFIG_COMPAT
+       case MTRRIOC32_GET_ENTRY:
+#endif
                if (gentry.regnum >= num_var_ranges)
                        return -EINVAL;
                mtrr_if->get(gentry.regnum, &gentry.base, &size, &type);
@@ -249,6 +264,9 @@ mtrr_ioctl(struct file *file, unsigned int cmd, unsigned long __arg)
 
                break;
        case MTRRIOC_ADD_PAGE_ENTRY:
+#ifdef CONFIG_COMPAT
+       case MTRRIOC32_ADD_PAGE_ENTRY:
+#endif
                if (!capable(CAP_SYS_ADMIN))
                        return -EPERM;
                err =
@@ -256,21 +274,33 @@ mtrr_ioctl(struct file *file, unsigned int cmd, unsigned long __arg)
                                  file, 1);
                break;
        case MTRRIOC_SET_PAGE_ENTRY:
+#ifdef CONFIG_COMPAT
+       case MTRRIOC32_SET_PAGE_ENTRY:
+#endif
                if (!capable(CAP_SYS_ADMIN))
                        return -EPERM;
                err = mtrr_add_page(sentry.base, sentry.size, sentry.type, 0);
                break;
        case MTRRIOC_DEL_PAGE_ENTRY:
+#ifdef CONFIG_COMPAT
+       case MTRRIOC32_DEL_PAGE_ENTRY:
+#endif
                if (!capable(CAP_SYS_ADMIN))
                        return -EPERM;
                err = mtrr_file_del(sentry.base, sentry.size, file, 1);
                break;
        case MTRRIOC_KILL_PAGE_ENTRY:
+#ifdef CONFIG_COMPAT
+       case MTRRIOC32_KILL_PAGE_ENTRY:
+#endif
                if (!capable(CAP_SYS_ADMIN))
                        return -EPERM;
                err = mtrr_del_page(-1, sentry.base, sentry.size);
                break;
        case MTRRIOC_GET_PAGE_ENTRY:
+#ifdef CONFIG_COMPAT
+       case MTRRIOC32_GET_PAGE_ENTRY:
+#endif
                if (gentry.regnum >= num_var_ranges)
                        return -EINVAL;
                mtrr_if->get(gentry.regnum, &gentry.base, &size, &type);
@@ -339,7 +369,7 @@ static int mtrr_open(struct inode *inode, struct file *file)
        return single_open(file, mtrr_seq_show, NULL);
 }
 
-static struct file_operations mtrr_fops = {
+static const struct file_operations mtrr_fops = {
        .owner   = THIS_MODULE,
        .open    = mtrr_open, 
        .read    = seq_read,
index 16bb7ea87145411e9ee63f1dd31b982a4f7ed816..0acfb6a5a220839deeba89f0f1766cf703c94332 100644 (file)
@@ -50,7 +50,7 @@ u32 num_var_ranges = 0;
 unsigned int *usage_table;
 static DEFINE_MUTEX(mtrr_mutex);
 
-u32 size_or_mask, size_and_mask;
+u64 size_or_mask, size_and_mask;
 
 static struct mtrr_ops * mtrr_ops[X86_VENDOR_NUM] = {};
 
@@ -662,8 +662,8 @@ void __init mtrr_bp_init(void)
                             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;
+                       size_or_mask = ~((1ULL << (phys_addr - PAGE_SHIFT)) - 1);
+                       size_and_mask = ~size_or_mask & 0xfffff00000ULL;
                } else if (boot_cpu_data.x86_vendor == X86_VENDOR_CENTAUR &&
                           boot_cpu_data.x86 == 6) {
                        /* VIA C* family have Intel style MTRRs, but
index d61ea9db6cfebfd908ca2184621979bc2faf82ab..289dfe6030e3a4b89d8615bfd89ff2abd52fc7fa 100644 (file)
@@ -84,7 +84,7 @@ void get_mtrr_state(void);
 
 extern void set_mtrr_ops(struct mtrr_ops * ops);
 
-extern u32 size_or_mask, size_and_mask;
+extern u64 size_or_mask, size_and_mask;
 extern struct mtrr_ops * mtrr_if;
 
 #define is_cpu(vnd)    (mtrr_if && mtrr_if->vendor == X86_VENDOR_##vnd)
index 6624d8583c428a20694641aabba7f0ec6ce9308c..47e3ebbfb28df3755ab08e7c129363561192c88b 100644 (file)
@@ -29,7 +29,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL,
                NULL, NULL, NULL, "mp", "nx", NULL, "mmxext", NULL,
-               NULL, "fxsr_opt", "rdtscp", NULL, NULL, "lm", "3dnowext", "3dnow",
+               NULL, "fxsr_opt", "pdpe1gb", "rdtscp", NULL, "lm", "3dnowext", "3dnow",
 
                /* Transmeta-defined */
                "recovery", "longrun", NULL, "lrti", NULL, NULL, NULL, NULL,
@@ -47,7 +47,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                /* Intel-defined (#2) */
                "pni", NULL, NULL, "monitor", "ds_cpl", "vmx", "smx", "est",
                "tm2", "ssse3", "cid", NULL, NULL, "cx16", "xtpr", NULL,
-               NULL, NULL, "dca", NULL, NULL, NULL, NULL, NULL,
+               NULL, NULL, "dca", NULL, NULL, NULL, NULL, "popcnt",
                NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
                /* VIA/Cyrix/Centaur-defined */
@@ -57,8 +57,9 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
                /* AMD-defined (#2) */
-               "lahf_lm", "cmp_legacy", "svm", NULL, "cr8legacy", NULL, NULL, NULL,
-               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+               "lahf_lm", "cmp_legacy", "svm", "extapic", "cr8legacy", "abm",
+               "sse4a", "misalignsse",
+               "3dnowprefetch", "osvw", "ibs", NULL, NULL, NULL, NULL, NULL,
                NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
        };
@@ -69,8 +70,11 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                "ttp",  /* thermal trip */
                "tm",
                "stc",
+               "100mhzsteps",
+               "hwpstate",
                NULL,
-               /* nothing */   /* constant_tsc - moved to flags */
+               NULL,   /* constant_tsc - moved to flags */
+               /* nothing */
        };
        struct cpuinfo_x86 *c = v;
        int i, n = c - cpu_data;
index 4056fb7d2cdfdbb137f4b1e40ddab1a908d6ca0b..5678d46863c614f2c942ef6397eca9e627fd7a22 100644 (file)
@@ -9,7 +9,7 @@ static void __cpuinit init_transmeta(struct cpuinfo_x86 *c)
 {
        unsigned int cap_mask, uk, max, dummy;
        unsigned int cms_rev1, cms_rev2;
-       unsigned int cpu_rev, cpu_freq, cpu_flags, new_cpu_rev;
+       unsigned int cpu_rev, cpu_freq = 0, cpu_flags, new_cpu_rev;
        char cpu_info[65];
 
        get_model_name(c);      /* Same as AMD/Cyrix */
@@ -72,6 +72,9 @@ static void __cpuinit init_transmeta(struct cpuinfo_x86 *c)
        wrmsr(0x80860004, ~0, uk);
        c->x86_capability[0] = cpuid_edx(0x00000001);
        wrmsr(0x80860004, cap_mask, uk);
+
+       /* All Transmeta CPUs have a constant TSC */
+       set_bit(X86_FEATURE_CONSTANT_TSC, c->x86_capability);
        
        /* If we can run i686 user-space code, call us an i686 */
 #define USER686 (X86_FEATURE_TSC|X86_FEATURE_CX8|X86_FEATURE_CMOV)
index 51130b39cd2e8de87f8b2269f150b4d6692018cb..eeae0d992337dd3e7c543e683adcc45233abb697 100644 (file)
@@ -48,7 +48,6 @@ static struct class *cpuid_class;
 #ifdef CONFIG_SMP
 
 struct cpuid_command {
-       int cpu;
        u32 reg;
        u32 *data;
 };
@@ -57,8 +56,7 @@ static void cpuid_smp_cpuid(void *cmd_block)
 {
        struct cpuid_command *cmd = (struct cpuid_command *)cmd_block;
 
-       if (cmd->cpu == smp_processor_id())
-               cpuid(cmd->reg, &cmd->data[0], &cmd->data[1], &cmd->data[2],
+       cpuid(cmd->reg, &cmd->data[0], &cmd->data[1], &cmd->data[2],
                      &cmd->data[3]);
 }
 
@@ -70,11 +68,10 @@ static inline void do_cpuid(int cpu, u32 reg, u32 * data)
        if (cpu == smp_processor_id()) {
                cpuid(reg, &data[0], &data[1], &data[2], &data[3]);
        } else {
-               cmd.cpu = cpu;
                cmd.reg = reg;
                cmd.data = data;
 
-               smp_call_function(cpuid_smp_cpuid, &cmd, 1, 1);
+               smp_call_function_single(cpu, cpuid_smp_cpuid, &cmd, 1, 1);
        }
        preempt_enable();
 }
@@ -148,7 +145,7 @@ static int cpuid_open(struct inode *inode, struct file *file)
 /*
  * File operations we support
  */
-static struct file_operations cpuid_fops = {
+static const struct file_operations cpuid_fops = {
        .owner = THIS_MODULE,
        .llseek = cpuid_seek,
        .read = cpuid_read,
index f391abcf7da901d2b4320eb2618dc53feddf63c1..70f39560846aa3bcd27bb52fe426a766a441479e 100644 (file)
@@ -14,6 +14,7 @@
 #include <asm/pgtable.h>
 #include <asm/page.h>
 #include <asm/e820.h>
+#include <asm/setup.h>
 
 #ifdef CONFIG_EFI
 int efi_enabled = 0;
@@ -156,21 +157,22 @@ static struct resource standard_io_resources[] = { {
        .flags  = IORESOURCE_BUSY | IORESOURCE_IO
 } };
 
-static int romsignature(const unsigned char *x)
+#define ROMSIGNATURE 0xaa55
+
+static int __init romsignature(const unsigned char *rom)
 {
        unsigned short sig;
-       int ret = 0;
-       if (probe_kernel_address((const unsigned short *)x, sig) == 0)
-               ret = (sig == 0xaa55);
-       return ret;
+
+       return probe_kernel_address((const unsigned short *)rom, sig) == 0 &&
+              sig == ROMSIGNATURE;
 }
 
 static int __init romchecksum(unsigned char *rom, unsigned long length)
 {
-       unsigned char *p, sum = 0;
+       unsigned char sum;
 
-       for (p = rom; p < rom + length; p++)
-               sum += *p;
+       for (sum = 0; length; length--)
+               sum += *rom++;
        return sum == 0;
 }
 
index 5e47683fc63ae736e25d30e83aef093965cdc17d..18bddcb8e9e82757042d4813568120257b9bb25f 100644 (file)
@@ -30,7 +30,7 @@
  *     18(%esp) - %eax
  *     1C(%esp) - %ds
  *     20(%esp) - %es
- *     24(%esp) - %gs
+ *     24(%esp) - %fs
  *     28(%esp) - orig_eax
  *     2C(%esp) - %eip
  *     30(%esp) - %cs
@@ -99,9 +99,9 @@ VM_MASK               = 0x00020000
 
 #define SAVE_ALL \
        cld; \
-       pushl %gs; \
+       pushl %fs; \
        CFI_ADJUST_CFA_OFFSET 4;\
-       /*CFI_REL_OFFSET gs, 0;*/\
+       /*CFI_REL_OFFSET fs, 0;*/\
        pushl %es; \
        CFI_ADJUST_CFA_OFFSET 4;\
        /*CFI_REL_OFFSET es, 0;*/\
@@ -133,7 +133,7 @@ VM_MASK             = 0x00020000
        movl %edx, %ds; \
        movl %edx, %es; \
        movl $(__KERNEL_PDA), %edx; \
-       movl %edx, %gs
+       movl %edx, %fs
 
 #define RESTORE_INT_REGS \
        popl %ebx;      \
@@ -166,9 +166,9 @@ VM_MASK             = 0x00020000
 2:     popl %es;       \
        CFI_ADJUST_CFA_OFFSET -4;\
        /*CFI_RESTORE es;*/\
-3:     popl %gs;       \
+3:     popl %fs;       \
        CFI_ADJUST_CFA_OFFSET -4;\
-       /*CFI_RESTORE gs;*/\
+       /*CFI_RESTORE fs;*/\
 .pushsection .fixup,"ax";      \
 4:     movl $0,(%esp); \
        jmp 1b;         \
@@ -227,6 +227,7 @@ ENTRY(ret_from_fork)
        CFI_ADJUST_CFA_OFFSET -4
        jmp syscall_exit
        CFI_ENDPROC
+END(ret_from_fork)
 
 /*
  * Return to user mode is not as complex as all this looks,
@@ -258,6 +259,7 @@ ENTRY(resume_userspace)
                                        # int/exception return?
        jne work_pending
        jmp restore_all
+END(ret_from_exception)
 
 #ifdef CONFIG_PREEMPT
 ENTRY(resume_kernel)
@@ -272,6 +274,7 @@ need_resched:
        jz restore_all
        call preempt_schedule_irq
        jmp need_resched
+END(resume_kernel)
 #endif
        CFI_ENDPROC
 
@@ -349,16 +352,17 @@ sysenter_past_esp:
        movl PT_OLDESP(%esp), %ecx
        xorl %ebp,%ebp
        TRACE_IRQS_ON
-1:     mov  PT_GS(%esp), %gs
+1:     mov  PT_FS(%esp), %fs
        ENABLE_INTERRUPTS_SYSEXIT
        CFI_ENDPROC
 .pushsection .fixup,"ax"
-2:     movl $0,PT_GS(%esp)
+2:     movl $0,PT_FS(%esp)
        jmp 1b
 .section __ex_table,"a"
        .align 4
        .long 1b,2b
 .popsection
+ENDPROC(sysenter_entry)
 
        # system call handler stub
 ENTRY(system_call)
@@ -459,6 +463,7 @@ ldt_ss:
        CFI_ADJUST_CFA_OFFSET -8
        jmp restore_nocheck
        CFI_ENDPROC
+ENDPROC(system_call)
 
        # perform work that needs to be done immediately before resumption
        ALIGN
@@ -504,6 +509,7 @@ work_notifysig_v86:
        xorl %edx, %edx
        call do_notify_resume
        jmp resume_userspace_sig
+END(work_pending)
 
        # perform syscall exit tracing
        ALIGN
@@ -519,6 +525,7 @@ syscall_trace_entry:
        cmpl $(nr_syscalls), %eax
        jnae syscall_call
        jmp syscall_exit
+END(syscall_trace_entry)
 
        # perform syscall exit tracing
        ALIGN
@@ -532,6 +539,7 @@ syscall_exit_work:
        movl $1, %edx
        call do_syscall_trace
        jmp resume_userspace
+END(syscall_exit_work)
        CFI_ENDPROC
 
        RING0_INT_FRAME                 # can't unwind into user space anyway
@@ -542,15 +550,17 @@ syscall_fault:
        GET_THREAD_INFO(%ebp)
        movl $-EFAULT,PT_EAX(%esp)
        jmp resume_userspace
+END(syscall_fault)
 
 syscall_badsys:
        movl $-ENOSYS,PT_EAX(%esp)
        jmp resume_userspace
+END(syscall_badsys)
        CFI_ENDPROC
 
 #define FIXUP_ESPFIX_STACK \
        /* since we are on a wrong stack, we cant make it a C code :( */ \
-       movl %gs:PDA_cpu, %ebx; \
+       movl %fs:PDA_cpu, %ebx; \
        PER_CPU(cpu_gdt_descr, %ebx); \
        movl GDS_address(%ebx), %ebx; \
        GET_DESC_BASE(GDT_ENTRY_ESPFIX_SS, %ebx, %eax, %ax, %al, %ah); \
@@ -581,9 +591,9 @@ syscall_badsys:
 ENTRY(interrupt)
 .text
 
-vector=0
 ENTRY(irq_entries_start)
        RING0_INT_FRAME
+vector=0
 .rept NR_IRQS
        ALIGN
  .if vector
@@ -592,11 +602,16 @@ ENTRY(irq_entries_start)
 1:     pushl $~(vector)
        CFI_ADJUST_CFA_OFFSET 4
        jmp common_interrupt
-.data
+ .previous
        .long 1b
-.text
+ .text
 vector=vector+1
 .endr
+END(irq_entries_start)
+
+.previous
+END(interrupt)
+.previous
 
 /*
  * the CPU automatically disables interrupts when executing an IRQ vector,
@@ -609,6 +624,7 @@ common_interrupt:
        movl %esp,%eax
        call do_IRQ
        jmp ret_from_intr
+ENDPROC(common_interrupt)
        CFI_ENDPROC
 
 #define BUILD_INTERRUPT(name, nr)      \
@@ -621,18 +637,24 @@ ENTRY(name)                               \
        movl %esp,%eax;                 \
        call smp_/**/name;              \
        jmp ret_from_intr;              \
-       CFI_ENDPROC
+       CFI_ENDPROC;                    \
+ENDPROC(name)
 
 /* The include is where all of the SMP etc. interrupts come from */
 #include "entry_arch.h"
 
+/* This alternate entry is needed because we hijack the apic LVTT */
+#if defined(CONFIG_VMI) && defined(CONFIG_X86_LOCAL_APIC)
+BUILD_INTERRUPT(apic_vmi_timer_interrupt,LOCAL_TIMER_VECTOR)
+#endif
+
 KPROBE_ENTRY(page_fault)
        RING0_EC_FRAME
        pushl $do_page_fault
        CFI_ADJUST_CFA_OFFSET 4
        ALIGN
 error_code:
-       /* the function address is in %gs's slot on the stack */
+       /* the function address is in %fs's slot on the stack */
        pushl %es
        CFI_ADJUST_CFA_OFFSET 4
        /*CFI_REL_OFFSET es, 0*/
@@ -661,20 +683,20 @@ error_code:
        CFI_ADJUST_CFA_OFFSET 4
        CFI_REL_OFFSET ebx, 0
        cld
-       pushl %gs
+       pushl %fs
        CFI_ADJUST_CFA_OFFSET 4
-       /*CFI_REL_OFFSET gs, 0*/
+       /*CFI_REL_OFFSET fs, 0*/
        movl $(__KERNEL_PDA), %ecx
-       movl %ecx, %gs
+       movl %ecx, %fs
        UNWIND_ESPFIX_STACK
        popl %ecx
        CFI_ADJUST_CFA_OFFSET -4
        /*CFI_REGISTER es, ecx*/
-       movl PT_GS(%esp), %edi          # get the function address
+       movl PT_FS(%esp), %edi          # get the function address
        movl PT_ORIG_EAX(%esp), %edx    # get the error code
        movl $-1, PT_ORIG_EAX(%esp)     # no syscall to restart
-       mov  %ecx, PT_GS(%esp)
-       /*CFI_REL_OFFSET gs, ES*/
+       mov  %ecx, PT_FS(%esp)
+       /*CFI_REL_OFFSET fs, ES*/
        movl $(__USER_DS), %ecx
        movl %ecx, %ds
        movl %ecx, %es
@@ -692,6 +714,7 @@ ENTRY(coprocessor_error)
        CFI_ADJUST_CFA_OFFSET 4
        jmp error_code
        CFI_ENDPROC
+END(coprocessor_error)
 
 ENTRY(simd_coprocessor_error)
        RING0_INT_FRAME
@@ -701,6 +724,7 @@ ENTRY(simd_coprocessor_error)
        CFI_ADJUST_CFA_OFFSET 4
        jmp error_code
        CFI_ENDPROC
+END(simd_coprocessor_error)
 
 ENTRY(device_not_available)
        RING0_INT_FRAME
@@ -721,6 +745,7 @@ device_not_available_emulate:
        CFI_ADJUST_CFA_OFFSET -4
        jmp ret_from_exception
        CFI_ENDPROC
+END(device_not_available)
 
 /*
  * Debug traps and NMI can happen at the one SYSENTER instruction
@@ -864,10 +889,12 @@ ENTRY(native_iret)
        .align 4
        .long 1b,iret_exc
 .previous
+END(native_iret)
 
 ENTRY(native_irq_enable_sysexit)
        sti
        sysexit
+END(native_irq_enable_sysexit)
 #endif
 
 KPROBE_ENTRY(int3)
@@ -890,6 +917,7 @@ ENTRY(overflow)
        CFI_ADJUST_CFA_OFFSET 4
        jmp error_code
        CFI_ENDPROC
+END(overflow)
 
 ENTRY(bounds)
        RING0_INT_FRAME
@@ -899,6 +927,7 @@ ENTRY(bounds)
        CFI_ADJUST_CFA_OFFSET 4
        jmp error_code
        CFI_ENDPROC
+END(bounds)
 
 ENTRY(invalid_op)
        RING0_INT_FRAME
@@ -908,6 +937,7 @@ ENTRY(invalid_op)
        CFI_ADJUST_CFA_OFFSET 4
        jmp error_code
        CFI_ENDPROC
+END(invalid_op)
 
 ENTRY(coprocessor_segment_overrun)
        RING0_INT_FRAME
@@ -917,6 +947,7 @@ ENTRY(coprocessor_segment_overrun)
        CFI_ADJUST_CFA_OFFSET 4
        jmp error_code
        CFI_ENDPROC
+END(coprocessor_segment_overrun)
 
 ENTRY(invalid_TSS)
        RING0_EC_FRAME
@@ -924,6 +955,7 @@ ENTRY(invalid_TSS)
        CFI_ADJUST_CFA_OFFSET 4
        jmp error_code
        CFI_ENDPROC
+END(invalid_TSS)
 
 ENTRY(segment_not_present)
        RING0_EC_FRAME
@@ -931,6 +963,7 @@ ENTRY(segment_not_present)
        CFI_ADJUST_CFA_OFFSET 4
        jmp error_code
        CFI_ENDPROC
+END(segment_not_present)
 
 ENTRY(stack_segment)
        RING0_EC_FRAME
@@ -938,6 +971,7 @@ ENTRY(stack_segment)
        CFI_ADJUST_CFA_OFFSET 4
        jmp error_code
        CFI_ENDPROC
+END(stack_segment)
 
 KPROBE_ENTRY(general_protection)
        RING0_EC_FRAME
@@ -953,6 +987,7 @@ ENTRY(alignment_check)
        CFI_ADJUST_CFA_OFFSET 4
        jmp error_code
        CFI_ENDPROC
+END(alignment_check)
 
 ENTRY(divide_error)
        RING0_INT_FRAME
@@ -962,6 +997,7 @@ ENTRY(divide_error)
        CFI_ADJUST_CFA_OFFSET 4
        jmp error_code
        CFI_ENDPROC
+END(divide_error)
 
 #ifdef CONFIG_X86_MCE
 ENTRY(machine_check)
@@ -972,6 +1008,7 @@ ENTRY(machine_check)
        CFI_ADJUST_CFA_OFFSET 4
        jmp error_code
        CFI_ENDPROC
+END(machine_check)
 #endif
 
 ENTRY(spurious_interrupt_bug)
@@ -982,6 +1019,7 @@ ENTRY(spurious_interrupt_bug)
        CFI_ADJUST_CFA_OFFSET 4
        jmp error_code
        CFI_ENDPROC
+END(spurious_interrupt_bug)
 
 ENTRY(kernel_thread_helper)
        pushl $0                # fake return address for unwinder
index edef5084ce17104b6c46f900d70d22b480ed8794..3fa7f9389afe7a39ce327ed5e4cf8493dfe7cf8e 100644 (file)
@@ -53,6 +53,7 @@
  * any particular GDT layout, because we load our own as soon as we
  * can.
  */
+.section .text.head,"ax",@progbits
 ENTRY(startup_32)
 
 #ifdef CONFIG_PARAVIRT
@@ -103,7 +104,7 @@ ENTRY(startup_32)
        movzwl OLD_CL_OFFSET,%esi
        addl $(OLD_CL_BASE_ADDR),%esi
 2:
-       movl $(saved_command_line - __PAGE_OFFSET),%edi
+       movl $(boot_command_line - __PAGE_OFFSET),%edi
        movl $(COMMAND_LINE_SIZE/4),%ecx
        rep
        movsl
@@ -141,16 +142,25 @@ page_pde_offset = (__PAGE_OFFSET >> 20);
        jb 10b
        movl %edi,(init_pg_tables_end - __PAGE_OFFSET)
 
-#ifdef CONFIG_SMP
        xorl %ebx,%ebx                          /* This is the boot CPU (BSP) */
        jmp 3f
-
 /*
  * Non-boot CPU entry point; entered from trampoline.S
  * We can't lgdt here, because lgdt itself uses a data segment, but
  * we know the trampoline has already loaded the boot_gdt_table GDT
  * for us.
+ *
+ * If cpu hotplug is not supported then this code can go in init section
+ * which will be freed later
  */
+
+#ifdef CONFIG_HOTPLUG_CPU
+.section .text,"ax",@progbits
+#else
+.section .init.text,"ax",@progbits
+#endif
+
+#ifdef CONFIG_SMP
 ENTRY(startup_32_smp)
        cld
        movl $(__BOOT_DS),%eax
@@ -208,8 +218,8 @@ ENTRY(startup_32_smp)
        xorl %ebx,%ebx
        incl %ebx
 
-3:
 #endif /* CONFIG_SMP */
+3:
 
 /*
  * Enable paging
@@ -309,7 +319,7 @@ is386:      movl $2,%ecx            # set MP
 
        call check_x87
        call setup_pda
-       lgdt cpu_gdt_descr
+       lgdt early_gdt_descr
        lidt idt_descr
        ljmp $(__KERNEL_CS),$1f
 1:     movl $(__KERNEL_DS),%eax        # reload all the segment registers
@@ -319,12 +329,12 @@ is386:    movl $2,%ecx            # set MP
        movl %eax,%ds
        movl %eax,%es
 
-       xorl %eax,%eax                  # Clear FS and LDT
-       movl %eax,%fs
+       xorl %eax,%eax                  # Clear GS and LDT
+       movl %eax,%gs
        lldt %ax
 
        movl $(__KERNEL_PDA),%eax
-       mov  %eax,%gs
+       mov  %eax,%fs
 
        cld                     # gcc2 wants the direction flag cleared at all times
        pushl $0                # fake return address for unwinder
@@ -360,12 +370,12 @@ check_x87:
  * cpu_gdt_table and boot_pda; for secondary CPUs, these will be
  * that CPU's GDT and PDA.
  */
-setup_pda:
+ENTRY(setup_pda)
        /* get the PDA pointer */
        movl start_pda, %eax
 
        /* slot the PDA address into the GDT */
-       mov cpu_gdt_descr+2, %ecx
+       mov early_gdt_descr+2, %ecx
        mov %ax, (__KERNEL_PDA+0+2)(%ecx)               /* base & 0x0000ffff */
        shr $16, %eax
        mov %al, (__KERNEL_PDA+4+0)(%ecx)               /* base & 0x00ff0000 */
@@ -492,6 +502,7 @@ ignore_int:
 #endif
        iret
 
+.section .text
 #ifdef CONFIG_PARAVIRT
 startup_paravirt:
        cld
@@ -502,10 +513,11 @@ startup_paravirt:
        pushl   %ecx
        pushl   %eax
 
-       /* paravirt.o is last in link, and that probe fn never returns */
        pushl   $__start_paravirtprobe
 1:
        movl    0(%esp), %eax
+       cmpl    $__stop_paravirtprobe, %eax
+       je      unhandled_paravirt
        pushl   (%eax)
        movl    8(%esp), %eax
        call    *(%esp)
@@ -517,6 +529,10 @@ startup_paravirt:
 
        addl    $4, (%esp)
        jmp     1b
+
+unhandled_paravirt:
+       /* Nothing wanted us: we're screwed. */
+       ud2
 #endif
 
 /*
@@ -581,7 +597,7 @@ idt_descr:
 
 # boot GDT descriptor (later on used by CPU#0):
        .word 0                         # 32 bit align gdt_desc.address
-ENTRY(cpu_gdt_descr)
+ENTRY(early_gdt_descr)
        .word GDT_ENTRIES*8-1
        .long cpu_gdt_table
 
index 0b29d41322a2620c50a0bdc98fa1ec314d397ac9..e1006b7acc9e56d5be196599cd997d9cd364be8b 100644 (file)
@@ -1,4 +1,5 @@
 #include <linux/clocksource.h>
+#include <linux/clockchips.h>
 #include <linux/errno.h>
 #include <linux/hpet.h>
 #include <linux/init.h>
 #include <asm/hpet.h>
 #include <asm/io.h>
 
+extern struct clock_event_device *global_clock_event;
+
 #define HPET_MASK      CLOCKSOURCE_MASK(32)
 #define HPET_SHIFT     22
 
 /* FSEC = 10^-15 NSEC = 10^-9 */
 #define FSEC_PER_NSEC  1000000
 
-static void __iomem *hpet_ptr;
+/*
+ * HPET address is set in acpi/boot.c, when an ACPI entry exists
+ */
+unsigned long hpet_address;
+static void __iomem * hpet_virt_address;
+
+static inline unsigned long hpet_readl(unsigned long a)
+{
+       return readl(hpet_virt_address + a);
+}
+
+static inline void hpet_writel(unsigned long d, unsigned long a)
+{
+       writel(d, hpet_virt_address + a);
+}
+
+/*
+ * HPET command line enable / disable
+ */
+static int boot_hpet_disable;
+
+static int __init hpet_setup(char* str)
+{
+       if (str) {
+               if (!strncmp("disable", str, 7))
+                       boot_hpet_disable = 1;
+       }
+       return 1;
+}
+__setup("hpet=", hpet_setup);
+
+static inline int is_hpet_capable(void)
+{
+       return (!boot_hpet_disable && hpet_address);
+}
+
+/*
+ * HPET timer interrupt enable / disable
+ */
+static int hpet_legacy_int_enabled;
+
+/**
+ * is_hpet_enabled - check whether the hpet timer interrupt is enabled
+ */
+int is_hpet_enabled(void)
+{
+       return is_hpet_capable() && hpet_legacy_int_enabled;
+}
+
+/*
+ * When the hpet driver (/dev/hpet) is enabled, we need to reserve
+ * timer 0 and timer 1 in case of RTC emulation.
+ */
+#ifdef CONFIG_HPET
+static void hpet_reserve_platform_timers(unsigned long id)
+{
+       struct hpet __iomem *hpet = hpet_virt_address;
+       struct hpet_timer __iomem *timer = &hpet->hpet_timers[2];
+       unsigned int nrtimers, i;
+       struct hpet_data hd;
+
+       nrtimers = ((id & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT) + 1;
+
+       memset(&hd, 0, sizeof (hd));
+       hd.hd_phys_address = hpet_address;
+       hd.hd_address = hpet_virt_address;
+       hd.hd_nirqs = nrtimers;
+       hd.hd_flags = HPET_DATA_PLATFORM;
+       hpet_reserve_timer(&hd, 0);
+
+#ifdef CONFIG_HPET_EMULATE_RTC
+       hpet_reserve_timer(&hd, 1);
+#endif
+
+       hd.hd_irq[0] = HPET_LEGACY_8254;
+       hd.hd_irq[1] = HPET_LEGACY_RTC;
+
+       for (i = 2; i < nrtimers; timer++, i++)
+               hd.hd_irq[i] = (timer->hpet_config & Tn_INT_ROUTE_CNF_MASK) >>
+                       Tn_INT_ROUTE_CNF_SHIFT;
+
+       hpet_alloc(&hd);
+
+}
+#else
+static void hpet_reserve_platform_timers(unsigned long id) { }
+#endif
+
+/*
+ * Common hpet info
+ */
+static unsigned long hpet_period;
+
+static void hpet_set_mode(enum clock_event_mode mode,
+                         struct clock_event_device *evt);
+static int hpet_next_event(unsigned long delta,
+                          struct clock_event_device *evt);
+
+/*
+ * The hpet clock event device
+ */
+static struct clock_event_device hpet_clockevent = {
+       .name           = "hpet",
+       .features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
+       .set_mode       = hpet_set_mode,
+       .set_next_event = hpet_next_event,
+       .shift          = 32,
+       .irq            = 0,
+};
+
+static void hpet_start_counter(void)
+{
+       unsigned long cfg = hpet_readl(HPET_CFG);
+
+       cfg &= ~HPET_CFG_ENABLE;
+       hpet_writel(cfg, HPET_CFG);
+       hpet_writel(0, HPET_COUNTER);
+       hpet_writel(0, HPET_COUNTER + 4);
+       cfg |= HPET_CFG_ENABLE;
+       hpet_writel(cfg, HPET_CFG);
+}
+
+static void hpet_enable_int(void)
+{
+       unsigned long cfg = hpet_readl(HPET_CFG);
+
+       cfg |= HPET_CFG_LEGACY;
+       hpet_writel(cfg, HPET_CFG);
+       hpet_legacy_int_enabled = 1;
+}
+
+static void hpet_set_mode(enum clock_event_mode mode,
+                         struct clock_event_device *evt)
+{
+       unsigned long cfg, cmp, now;
+       uint64_t delta;
+
+       switch(mode) {
+       case CLOCK_EVT_MODE_PERIODIC:
+               delta = ((uint64_t)(NSEC_PER_SEC/HZ)) * hpet_clockevent.mult;
+               delta >>= hpet_clockevent.shift;
+               now = hpet_readl(HPET_COUNTER);
+               cmp = now + (unsigned long) delta;
+               cfg = hpet_readl(HPET_T0_CFG);
+               cfg |= HPET_TN_ENABLE | HPET_TN_PERIODIC |
+                      HPET_TN_SETVAL | HPET_TN_32BIT;
+               hpet_writel(cfg, HPET_T0_CFG);
+               /*
+                * The first write after writing TN_SETVAL to the
+                * config register sets the counter value, the second
+                * write sets the period.
+                */
+               hpet_writel(cmp, HPET_T0_CMP);
+               udelay(1);
+               hpet_writel((unsigned long) delta, HPET_T0_CMP);
+               break;
+
+       case CLOCK_EVT_MODE_ONESHOT:
+               cfg = hpet_readl(HPET_T0_CFG);
+               cfg &= ~HPET_TN_PERIODIC;
+               cfg |= HPET_TN_ENABLE | HPET_TN_32BIT;
+               hpet_writel(cfg, HPET_T0_CFG);
+               break;
+
+       case CLOCK_EVT_MODE_UNUSED:
+       case CLOCK_EVT_MODE_SHUTDOWN:
+               cfg = hpet_readl(HPET_T0_CFG);
+               cfg &= ~HPET_TN_ENABLE;
+               hpet_writel(cfg, HPET_T0_CFG);
+               break;
+       }
+}
+
+static int hpet_next_event(unsigned long delta,
+                          struct clock_event_device *evt)
+{
+       unsigned long cnt;
+
+       cnt = hpet_readl(HPET_COUNTER);
+       cnt += delta;
+       hpet_writel(cnt, HPET_T0_CMP);
+
+       return ((long)(hpet_readl(HPET_COUNTER) - cnt ) > 0);
+}
+
+/*
+ * Try to setup the HPET timer
+ */
+int __init hpet_enable(void)
+{
+       unsigned long id;
+       uint64_t hpet_freq;
+
+       if (!is_hpet_capable())
+               return 0;
+
+       hpet_virt_address = ioremap_nocache(hpet_address, HPET_MMAP_SIZE);
+
+       /*
+        * Read the period and check for a sane value:
+        */
+       hpet_period = hpet_readl(HPET_PERIOD);
+       if (hpet_period < HPET_MIN_PERIOD || hpet_period > HPET_MAX_PERIOD)
+               goto out_nohpet;
+
+       /*
+        * The period is a femto seconds value. We need to calculate the
+        * scaled math multiplication factor for nanosecond to hpet tick
+        * conversion.
+        */
+       hpet_freq = 1000000000000000ULL;
+       do_div(hpet_freq, hpet_period);
+       hpet_clockevent.mult = div_sc((unsigned long) hpet_freq,
+                                     NSEC_PER_SEC, 32);
+       /* Calculate the min / max delta */
+       hpet_clockevent.max_delta_ns = clockevent_delta2ns(0x7FFFFFFF,
+                                                          &hpet_clockevent);
+       hpet_clockevent.min_delta_ns = clockevent_delta2ns(0x30,
+                                                          &hpet_clockevent);
+
+       /*
+        * Read the HPET ID register to retrieve the IRQ routing
+        * information and the number of channels
+        */
+       id = hpet_readl(HPET_ID);
+
+#ifdef CONFIG_HPET_EMULATE_RTC
+       /*
+        * The legacy routing mode needs at least two channels, tick timer
+        * and the rtc emulation channel.
+        */
+       if (!(id & HPET_ID_NUMBER))
+               goto out_nohpet;
+#endif
+
+       /* Start the counter */
+       hpet_start_counter();
+
+       if (id & HPET_ID_LEGSUP) {
+               hpet_enable_int();
+               hpet_reserve_platform_timers(id);
+               /*
+                * Start hpet with the boot cpu mask and make it
+                * global after the IO_APIC has been initialized.
+                */
+               hpet_clockevent.cpumask =cpumask_of_cpu(0);
+               clockevents_register_device(&hpet_clockevent);
+               global_clock_event = &hpet_clockevent;
+               return 1;
+       }
+       return 0;
 
+out_nohpet:
+       iounmap(hpet_virt_address);
+       hpet_virt_address = NULL;
+       return 0;
+}
+
+/*
+ * Clock source related code
+ */
 static cycle_t read_hpet(void)
 {
-       return (cycle_t)readl(hpet_ptr);
+       return (cycle_t)hpet_readl(HPET_COUNTER);
 }
 
 static struct clocksource clocksource_hpet = {
@@ -24,28 +286,17 @@ static struct clocksource clocksource_hpet = {
        .rating         = 250,
        .read           = read_hpet,
        .mask           = HPET_MASK,
-       .mult           = 0, /* set below */
        .shift          = HPET_SHIFT,
-       .is_continuous  = 1,
+       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
 };
 
 static int __init init_hpet_clocksource(void)
 {
-       unsigned long hpet_period;
-       void __iomem* hpet_base;
        u64 tmp;
-       int err;
 
-       if (!is_hpet_enabled())
+       if (!hpet_virt_address)
                return -ENODEV;
 
-       /* calculate the hpet address: */
-       hpet_base = ioremap_nocache(hpet_address, HPET_MMAP_SIZE);
-       hpet_ptr = hpet_base + HPET_COUNTER;
-
-       /* calculate the frequency: */
-       hpet_period = readl(hpet_base + HPET_PERIOD);
-
        /*
         * hpet period is in femto seconds per cycle
         * so we need to convert this to ns/cyc units
@@ -61,11 +312,218 @@ static int __init init_hpet_clocksource(void)
        do_div(tmp, FSEC_PER_NSEC);
        clocksource_hpet.mult = (u32)tmp;
 
-       err = clocksource_register(&clocksource_hpet);
-       if (err)
-               iounmap(hpet_base);
-
-       return err;
+       return clocksource_register(&clocksource_hpet);
 }
 
 module_init(init_hpet_clocksource);
+
+#ifdef CONFIG_HPET_EMULATE_RTC
+
+/* HPET in LegacyReplacement Mode eats up RTC interrupt line. When, HPET
+ * is enabled, we support RTC interrupt functionality in software.
+ * RTC has 3 kinds of interrupts:
+ * 1) Update Interrupt - generate an interrupt, every sec, when RTC clock
+ *    is updated
+ * 2) Alarm Interrupt - generate an interrupt at a specific time of day
+ * 3) Periodic Interrupt - generate periodic interrupt, with frequencies
+ *    2Hz-8192Hz (2Hz-64Hz for non-root user) (all freqs in powers of 2)
+ * (1) and (2) above are implemented using polling at a frequency of
+ * 64 Hz. The exact frequency is a tradeoff between accuracy and interrupt
+ * overhead. (DEFAULT_RTC_INT_FREQ)
+ * For (3), we use interrupts at 64Hz or user specified periodic
+ * frequency, whichever is higher.
+ */
+#include <linux/mc146818rtc.h>
+#include <linux/rtc.h>
+
+#define DEFAULT_RTC_INT_FREQ   64
+#define DEFAULT_RTC_SHIFT      6
+#define RTC_NUM_INTS           1
+
+static unsigned long hpet_rtc_flags;
+static unsigned long hpet_prev_update_sec;
+static struct rtc_time hpet_alarm_time;
+static unsigned long hpet_pie_count;
+static unsigned long hpet_t1_cmp;
+static unsigned long hpet_default_delta;
+static unsigned long hpet_pie_delta;
+static unsigned long hpet_pie_limit;
+
+/*
+ * Timer 1 for RTC emulation. We use one shot mode, as periodic mode
+ * is not supported by all HPET implementations for timer 1.
+ *
+ * hpet_rtc_timer_init() is called when the rtc is initialized.
+ */
+int hpet_rtc_timer_init(void)
+{
+       unsigned long cfg, cnt, delta, flags;
+
+       if (!is_hpet_enabled())
+               return 0;
+
+       if (!hpet_default_delta) {
+               uint64_t clc;
+
+               clc = (uint64_t) hpet_clockevent.mult * NSEC_PER_SEC;
+               clc >>= hpet_clockevent.shift + DEFAULT_RTC_SHIFT;
+               hpet_default_delta = (unsigned long) clc;
+       }
+
+       if (!(hpet_rtc_flags & RTC_PIE) || hpet_pie_limit)
+               delta = hpet_default_delta;
+       else
+               delta = hpet_pie_delta;
+
+       local_irq_save(flags);
+
+       cnt = delta + hpet_readl(HPET_COUNTER);
+       hpet_writel(cnt, HPET_T1_CMP);
+       hpet_t1_cmp = cnt;
+
+       cfg = hpet_readl(HPET_T1_CFG);
+       cfg &= ~HPET_TN_PERIODIC;
+       cfg |= HPET_TN_ENABLE | HPET_TN_32BIT;
+       hpet_writel(cfg, HPET_T1_CFG);
+
+       local_irq_restore(flags);
+
+       return 1;
+}
+
+/*
+ * The functions below are called from rtc driver.
+ * Return 0 if HPET is not being used.
+ * Otherwise do the necessary changes and return 1.
+ */
+int hpet_mask_rtc_irq_bit(unsigned long bit_mask)
+{
+       if (!is_hpet_enabled())
+               return 0;
+
+       hpet_rtc_flags &= ~bit_mask;
+       return 1;
+}
+
+int hpet_set_rtc_irq_bit(unsigned long bit_mask)
+{
+       unsigned long oldbits = hpet_rtc_flags;
+
+       if (!is_hpet_enabled())
+               return 0;
+
+       hpet_rtc_flags |= bit_mask;
+
+       if (!oldbits)
+               hpet_rtc_timer_init();
+
+       return 1;
+}
+
+int hpet_set_alarm_time(unsigned char hrs, unsigned char min,
+                       unsigned char sec)
+{
+       if (!is_hpet_enabled())
+               return 0;
+
+       hpet_alarm_time.tm_hour = hrs;
+       hpet_alarm_time.tm_min = min;
+       hpet_alarm_time.tm_sec = sec;
+
+       return 1;
+}
+
+int hpet_set_periodic_freq(unsigned long freq)
+{
+       uint64_t clc;
+
+       if (!is_hpet_enabled())
+               return 0;
+
+       if (freq <= DEFAULT_RTC_INT_FREQ)
+               hpet_pie_limit = DEFAULT_RTC_INT_FREQ / freq;
+       else {
+               clc = (uint64_t) hpet_clockevent.mult * NSEC_PER_SEC;
+               do_div(clc, freq);
+               clc >>= hpet_clockevent.shift;
+               hpet_pie_delta = (unsigned long) clc;
+       }
+       return 1;
+}
+
+int hpet_rtc_dropped_irq(void)
+{
+       return is_hpet_enabled();
+}
+
+static void hpet_rtc_timer_reinit(void)
+{
+       unsigned long cfg, delta;
+       int lost_ints = -1;
+
+       if (unlikely(!hpet_rtc_flags)) {
+               cfg = hpet_readl(HPET_T1_CFG);
+               cfg &= ~HPET_TN_ENABLE;
+               hpet_writel(cfg, HPET_T1_CFG);
+               return;
+       }
+
+       if (!(hpet_rtc_flags & RTC_PIE) || hpet_pie_limit)
+               delta = hpet_default_delta;
+       else
+               delta = hpet_pie_delta;
+
+       /*
+        * Increment the comparator value until we are ahead of the
+        * current count.
+        */
+       do {
+               hpet_t1_cmp += delta;
+               hpet_writel(hpet_t1_cmp, HPET_T1_CMP);
+               lost_ints++;
+       } while ((long)(hpet_readl(HPET_COUNTER) - hpet_t1_cmp) > 0);
+
+       if (lost_ints) {
+               if (hpet_rtc_flags & RTC_PIE)
+                       hpet_pie_count += lost_ints;
+               if (printk_ratelimit())
+                       printk(KERN_WARNING "rtc: lost %d interrupts\n",
+                               lost_ints);
+       }
+}
+
+irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id)
+{
+       struct rtc_time curr_time;
+       unsigned long rtc_int_flag = 0;
+
+       hpet_rtc_timer_reinit();
+
+       if (hpet_rtc_flags & (RTC_UIE | RTC_AIE))
+               rtc_get_rtc_time(&curr_time);
+
+       if (hpet_rtc_flags & RTC_UIE &&
+           curr_time.tm_sec != hpet_prev_update_sec) {
+               rtc_int_flag = RTC_UF;
+               hpet_prev_update_sec = curr_time.tm_sec;
+       }
+
+       if (hpet_rtc_flags & RTC_PIE &&
+           ++hpet_pie_count >= hpet_pie_limit) {
+               rtc_int_flag |= RTC_PF;
+               hpet_pie_count = 0;
+       }
+
+       if (hpet_rtc_flags & RTC_PIE &&
+           (curr_time.tm_sec == hpet_alarm_time.tm_sec) &&
+           (curr_time.tm_min == hpet_alarm_time.tm_min) &&
+           (curr_time.tm_hour == hpet_alarm_time.tm_hour))
+                       rtc_int_flag |= RTC_AF;
+
+       if (rtc_int_flag) {
+               rtc_int_flag |= (RTC_IRQF | (RTC_NUM_INTS << 8));
+               rtc_interrupt(rtc_int_flag, dev_id);
+       }
+       return IRQ_HANDLED;
+}
+#endif
index 9a0060b92e32ace2911ae839a9d8b710e7458ec4..a6bc7bb38834282239bba67631b6ae2041b14e2b 100644 (file)
@@ -2,7 +2,7 @@
  * i8253.c  8253/PIT functions
  *
  */
-#include <linux/clocksource.h>
+#include <linux/clockchips.h>
 #include <linux/spinlock.h>
 #include <linux/jiffies.h>
 #include <linux/sysdev.h>
 DEFINE_SPINLOCK(i8253_lock);
 EXPORT_SYMBOL(i8253_lock);
 
-void setup_pit_timer(void)
+/*
+ * HPET replaces the PIT, when enabled. So we need to know, which of
+ * the two timers is used
+ */
+struct clock_event_device *global_clock_event;
+
+/*
+ * Initialize the PIT timer.
+ *
+ * This is also called after resume to bring the PIT into operation again.
+ */
+static void init_pit_timer(enum clock_event_mode mode,
+                          struct clock_event_device *evt)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&i8253_lock, flags);
+
+       switch(mode) {
+       case CLOCK_EVT_MODE_PERIODIC:
+               /* binary, mode 2, LSB/MSB, ch 0 */
+               outb_p(0x34, PIT_MODE);
+               udelay(10);
+               outb_p(LATCH & 0xff , PIT_CH0); /* LSB */
+               udelay(10);
+               outb(LATCH >> 8 , PIT_CH0);     /* MSB */
+               break;
+
+       case CLOCK_EVT_MODE_ONESHOT:
+       case CLOCK_EVT_MODE_SHUTDOWN:
+       case CLOCK_EVT_MODE_UNUSED:
+               /* One shot setup */
+               outb_p(0x38, PIT_MODE);
+               udelay(10);
+               break;
+       }
+       spin_unlock_irqrestore(&i8253_lock, flags);
+}
+
+/*
+ * Program the next event in oneshot mode
+ *
+ * Delta is given in PIT ticks
+ */
+static int pit_next_event(unsigned long delta, struct clock_event_device *evt)
 {
        unsigned long flags;
 
        spin_lock_irqsave(&i8253_lock, flags);
-       outb_p(0x34,PIT_MODE);          /* binary, mode 2, LSB/MSB, ch 0 */
-       udelay(10);
-       outb_p(LATCH & 0xff , PIT_CH0); /* LSB */
-       udelay(10);
-       outb(LATCH >> 8 , PIT_CH0);     /* MSB */
+       outb_p(delta & 0xff , PIT_CH0); /* LSB */
+       outb(delta >> 8 , PIT_CH0);     /* MSB */
        spin_unlock_irqrestore(&i8253_lock, flags);
+
+       return 0;
+}
+
+/*
+ * On UP the PIT can serve all of the possible timer functions. On SMP systems
+ * it can be solely used for the global tick.
+ *
+ * The profiling and update capabilites are switched off once the local apic is
+ * registered. This mechanism replaces the previous #ifdef LOCAL_APIC -
+ * !using_apic_timer decisions in do_timer_interrupt_hook()
+ */
+struct clock_event_device pit_clockevent = {
+       .name           = "pit",
+       .features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
+       .set_mode       = init_pit_timer,
+       .set_next_event = pit_next_event,
+       .shift          = 32,
+       .irq            = 0,
+};
+
+/*
+ * Initialize the conversion factor and the min/max deltas of the clock event
+ * structure and register the clock event source with the framework.
+ */
+void __init setup_pit_timer(void)
+{
+       /*
+        * Start pit with the boot cpu mask and make it global after the
+        * IO_APIC has been initialized.
+        */
+       pit_clockevent.cpumask = cpumask_of_cpu(0);
+       pit_clockevent.mult = div_sc(CLOCK_TICK_RATE, NSEC_PER_SEC, 32);
+       pit_clockevent.max_delta_ns =
+               clockevent_delta2ns(0x7FFF, &pit_clockevent);
+       pit_clockevent.min_delta_ns =
+               clockevent_delta2ns(0xF, &pit_clockevent);
+       clockevents_register_device(&pit_clockevent);
+       global_clock_event = &pit_clockevent;
 }
 
 /*
@@ -46,7 +126,7 @@ static cycle_t pit_read(void)
        static u32 old_jifs;
 
        spin_lock_irqsave(&i8253_lock, flags);
-        /*
+       /*
         * Although our caller may have the read side of xtime_lock,
         * this is now a seqlock, and we are cheating in this routine
         * by having side effects on state that we cannot undo if
index c8d45821c788f77467535569816d820d395f8a4b..03abfdb1a6e4c5cb8e4c7e407f0a19e3763de2df 100644 (file)
@@ -41,6 +41,7 @@ static void mask_and_ack_8259A(unsigned int);
 static struct irq_chip i8259A_chip = {
        .name           = "XT-PIC",
        .mask           = disable_8259A_irq,
+       .disable        = disable_8259A_irq,
        .unmask         = enable_8259A_irq,
        .mask_ack       = mask_and_ack_8259A,
 };
@@ -409,12 +410,6 @@ void __init native_init_IRQ(void)
         */
        intr_init_hook();
 
-       /*
-        * Set the clock to HZ Hz, we already have a valid
-        * vector now:
-        */
-       setup_pit_timer();
-
        /*
         * External FPU? Set up irq13 if so, for
         * original braindamaged IBM FERR coupling.
index ba8d302a0b728718d099f5254a8e463d45b1853d..4ccebd454e256786d0e8e32fc9e540bf97ab5b72 100644 (file)
@@ -482,8 +482,8 @@ static void do_irq_balance(void)
                package_index = CPU_TO_PACKAGEINDEX(i);
                for (j = 0; j < NR_IRQS; j++) {
                        unsigned long value_now, delta;
-                       /* Is this an active IRQ? */
-                       if (!irq_desc[j].action)
+                       /* Is this an active IRQ or balancing disabled ? */
+                       if (!irq_desc[j].action || irq_balancing_disabled(j))
                                continue;
                        if ( package_index == i )
                                IRQ_DELTA(package_index,j) = 0;
@@ -1281,11 +1281,9 @@ static void ioapic_register_intr(int irq, int vector, unsigned long trigger)
                        trigger == IOAPIC_LEVEL)
                set_irq_chip_and_handler_name(irq, &ioapic_chip,
                                         handle_fasteoi_irq, "fasteoi");
-       else {
-               irq_desc[irq].status |= IRQ_DELAYED_DISABLE;
+       else
                set_irq_chip_and_handler_name(irq, &ioapic_chip,
                                         handle_edge_irq, "edge");
-       }
        set_intr_gate(vector, interrupt[irq]);
 }
 
@@ -1588,7 +1586,7 @@ void /*__init*/ print_local_APIC(void * dummy)
        v = apic_read(APIC_LVR);
        printk(KERN_INFO "... APIC VERSION: %08x\n", v);
        ver = GET_APIC_VERSION(v);
-       maxlvt = get_maxlvt();
+       maxlvt = lapic_get_maxlvt();
 
        v = apic_read(APIC_TASKPRI);
        printk(KERN_DEBUG "... APIC TASKPRI: %08x (%02x)\n", v, v & APIC_TPRI_MASK);
@@ -1920,7 +1918,7 @@ static void __init setup_ioapic_ids_from_mpc(void)
 static void __init setup_ioapic_ids_from_mpc(void) { }
 #endif
 
-static int no_timer_check __initdata;
+int no_timer_check __initdata;
 
 static int __init notimercheck(char *s)
 {
@@ -2310,7 +2308,7 @@ static inline void __init check_timer(void)
 
        disable_8259A_irq(0);
        set_irq_chip_and_handler_name(0, &lapic_chip, handle_fasteoi_irq,
-                                     "fasteio");
+                                     "fasteoi");
        apic_write_around(APIC_LVT0, APIC_DM_FIXED | vector);   /* Fixed mode */
        enable_8259A_irq(0);
 
index 3201d421090a0d2cf5237f4d55ef070d41bc48b9..0f2ca590bf2306411c58a149a091c5941dae7113 100644 (file)
@@ -10,7 +10,6 @@
  * io_apic.c.)
  */
 
-#include <asm/uaccess.h>
 #include <linux/module.h>
 #include <linux/seq_file.h>
 #include <linux/interrupt.h>
 #include <linux/cpu.h>
 #include <linux/delay.h>
 
+#include <asm/idle.h>
+
+#include <asm/apic.h>
+#include <asm/uaccess.h>
+
 DEFINE_PER_CPU(irq_cpustat_t, irq_stat) ____cacheline_internodealigned_in_smp;
 EXPORT_PER_CPU_SYMBOL(irq_stat);
 
-#ifndef CONFIG_X86_LOCAL_APIC
 /*
  * 'what should we do if we get a hw irq event on an illegal vector'.
  * each architecture has to answer this themselves.
  */
 void ack_bad_irq(unsigned int irq)
 {
-       printk("unexpected IRQ trap at vector %02x\n", irq);
-}
+       printk(KERN_ERR "unexpected IRQ trap at vector %02x\n", irq);
+
+#ifdef CONFIG_X86_LOCAL_APIC
+       /*
+        * Currently unexpected vectors happen only on SMP and APIC.
+        * We _must_ ack these because every local APIC has only N
+        * irq slots per priority level, and a 'hanging, unacked' IRQ
+        * holds up an irq slot - in excessive cases (when multiple
+        * unexpected vectors occur) that might lock up the APIC
+        * completely.
+        * But only ack when the APIC is enabled -AK
+        */
+       if (cpu_has_apic)
+               ack_APIC_irq();
 #endif
+}
 
 #ifdef CONFIG_4KSTACKS
 /*
@@ -61,6 +77,7 @@ fastcall unsigned int do_IRQ(struct pt_regs *regs)
        union irq_ctx *curctx, *irqctx;
        u32 *isp;
 #endif
+       exit_idle();
 
        if (unlikely((unsigned)irq >= NR_IRQS)) {
                printk(KERN_EMERG "%s: cannot handle IRQ %d\n",
index af1d53344993cac32221d7209bf853bed4f5febc..b545bc746fceb2a9f6f192778c6dbca784395553 100644 (file)
@@ -363,7 +363,7 @@ no_kprobe:
                        "       pushf\n"
                        /* skip cs, eip, orig_eax */
                        "       subl $12, %esp\n"
-                       "       pushl %gs\n"
+                       "       pushl %fs\n"
                        "       pushl %ds\n"
                        "       pushl %es\n"
                        "       pushl %eax\n"
@@ -387,7 +387,7 @@ no_kprobe:
                        "       popl %edi\n"
                        "       popl %ebp\n"
                        "       popl %eax\n"
-                       /* skip eip, orig_eax, es, ds, gs */
+                       /* skip eip, orig_eax, es, ds, fs */
                        "       addl $20, %esp\n"
                        "       popf\n"
                        "       ret\n");
@@ -408,7 +408,7 @@ fastcall void *__kprobes trampoline_handler(struct pt_regs *regs)
        spin_lock_irqsave(&kretprobe_lock, flags);
        head = kretprobe_inst_table_head(current);
        /* fixup registers */
-       regs->xcs = __KERNEL_CS;
+       regs->xcs = __KERNEL_CS | get_kernel_rpl();
        regs->eip = trampoline_address;
        regs->orig_eax = 0xffffffff;
 
index c8fa13721bcb8f3b3023f6a64208d4b2bcd95f94..b8f16633a6ece6380cd8396c702c2ac75937a6a1 100644 (file)
@@ -384,7 +384,7 @@ static int do_microcode_update (void)
 {
        long cursor = 0;
        int error = 0;
-       void *new_mc;
+       void *new_mc = NULL;
        int cpu;
        cpumask_t old;
 
@@ -451,7 +451,7 @@ static ssize_t microcode_write (struct file *file, const char __user *buf, size_
        return ret;
 }
 
-static struct file_operations microcode_fops = {
+static const struct file_operations microcode_fops = {
        .owner          = THIS_MODULE,
        .write          = microcode_write,
        .open           = microcode_open,
index 4a472a17d1c684f07c39054478599c14aeff6ab9..bcaa6e9b6197a4466972153fb812f783f82c13a7 100644 (file)
@@ -68,7 +68,6 @@ static inline int rdmsr_eio(u32 reg, u32 *eax, u32 *edx)
 #ifdef CONFIG_SMP
 
 struct msr_command {
-       int cpu;
        int err;
        u32 reg;
        u32 data[2];
@@ -78,16 +77,14 @@ static void msr_smp_wrmsr(void *cmd_block)
 {
        struct msr_command *cmd = (struct msr_command *)cmd_block;
 
-       if (cmd->cpu == smp_processor_id())
-               cmd->err = wrmsr_eio(cmd->reg, cmd->data[0], cmd->data[1]);
+       cmd->err = wrmsr_eio(cmd->reg, cmd->data[0], cmd->data[1]);
 }
 
 static void msr_smp_rdmsr(void *cmd_block)
 {
        struct msr_command *cmd = (struct msr_command *)cmd_block;
 
-       if (cmd->cpu == smp_processor_id())
-               cmd->err = rdmsr_eio(cmd->reg, &cmd->data[0], &cmd->data[1]);
+       cmd->err = rdmsr_eio(cmd->reg, &cmd->data[0], &cmd->data[1]);
 }
 
 static inline int do_wrmsr(int cpu, u32 reg, u32 eax, u32 edx)
@@ -99,12 +96,11 @@ static inline int do_wrmsr(int cpu, u32 reg, u32 eax, u32 edx)
        if (cpu == smp_processor_id()) {
                ret = wrmsr_eio(reg, eax, edx);
        } else {
-               cmd.cpu = cpu;
                cmd.reg = reg;
                cmd.data[0] = eax;
                cmd.data[1] = edx;
 
-               smp_call_function(msr_smp_wrmsr, &cmd, 1, 1);
+               smp_call_function_single(cpu, msr_smp_wrmsr, &cmd, 1, 1);
                ret = cmd.err;
        }
        preempt_enable();
@@ -120,10 +116,9 @@ static inline int do_rdmsr(int cpu, u32 reg, u32 * eax, u32 * edx)
        if (cpu == smp_processor_id()) {
                ret = rdmsr_eio(reg, eax, edx);
        } else {
-               cmd.cpu = cpu;
                cmd.reg = reg;
 
-               smp_call_function(msr_smp_rdmsr, &cmd, 1, 1);
+               smp_call_function_single(cpu, msr_smp_rdmsr, &cmd, 1, 1);
 
                *eax = cmd.data[0];
                *edx = cmd.data[1];
@@ -230,7 +225,7 @@ static int msr_open(struct inode *inode, struct file *file)
 /*
  * File operations we support
  */
-static struct file_operations msr_fops = {
+static const struct file_operations msr_fops = {
        .owner = THIS_MODULE,
        .llseek = msr_seek,
        .read = msr_read,
index 1a6f8bb8881ce72fa99909914beb70141b4a519f..821df34d2b3a3a1b8a71ada0a77b64229e0f0200 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/dmi.h>
 #include <linux/kprobes.h>
 #include <linux/cpumask.h>
+#include <linux/kernel_stat.h>
 
 #include <asm/smp.h>
 #include <asm/nmi.h>
@@ -185,7 +186,8 @@ static __cpuinit inline int nmi_known_cpu(void)
 {
        switch (boot_cpu_data.x86_vendor) {
        case X86_VENDOR_AMD:
-               return ((boot_cpu_data.x86 == 15) || (boot_cpu_data.x86 == 6));
+               return ((boot_cpu_data.x86 == 15) || (boot_cpu_data.x86 == 6)
+                       || (boot_cpu_data.x86 == 16));
        case X86_VENDOR_INTEL:
                if (cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON))
                        return 1;
@@ -216,6 +218,28 @@ static __init void nmi_cpu_busy(void *data)
 }
 #endif
 
+static unsigned int adjust_for_32bit_ctr(unsigned int hz)
+{
+       u64 counter_val;
+       unsigned int retval = hz;
+
+       /*
+        * On Intel CPUs with P6/ARCH_PERFMON only 32 bits in the counter
+        * are writable, with higher bits sign extending from bit 31.
+        * So, we can only program the counter with 31 bit values and
+        * 32nd bit should be 1, for 33.. to be 1.
+        * Find the appropriate nmi_hz
+        */
+       counter_val = (u64)cpu_khz * 1000;
+       do_div(counter_val, retval);
+       if (counter_val > 0x7fffffffULL) {
+               u64 count = (u64)cpu_khz * 1000;
+               do_div(count, 0x7fffffffUL);
+               retval = count + 1;
+       }
+       return retval;
+}
+
 static int __init check_nmi_watchdog(void)
 {
        unsigned int *prev_nmi_count;
@@ -281,18 +305,10 @@ static int __init check_nmi_watchdog(void)
                struct nmi_watchdog_ctlblk *wd = &__get_cpu_var(nmi_watchdog_ctlblk);
 
                nmi_hz = 1;
-               /*
-                * On Intel CPUs with ARCH_PERFMON only 32 bits in the counter
-                * are writable, with higher bits sign extending from bit 31.
-                * So, we can only program the counter with 31 bit values and
-                * 32nd bit should be 1, for 33.. to be 1.
-                * Find the appropriate nmi_hz
-                */
-               if (wd->perfctr_msr == MSR_ARCH_PERFMON_PERFCTR0 &&
-                       ((u64)cpu_khz * 1000) > 0x7fffffffULL) {
-                       u64 count = (u64)cpu_khz * 1000;
-                       do_div(count, 0x7fffffffUL);
-                       nmi_hz = count + 1;
+
+               if (wd->perfctr_msr == MSR_P6_PERFCTR0 ||
+                   wd->perfctr_msr == MSR_ARCH_PERFMON_PERFCTR0) {
+                       nmi_hz = adjust_for_32bit_ctr(nmi_hz);
                }
        }
 
@@ -369,6 +385,34 @@ void enable_timer_nmi_watchdog(void)
        }
 }
 
+static void __acpi_nmi_disable(void *__unused)
+{
+       apic_write_around(APIC_LVT0, APIC_DM_NMI | APIC_LVT_MASKED);
+}
+
+/*
+ * Disable timer based NMIs on all CPUs:
+ */
+void acpi_nmi_disable(void)
+{
+       if (atomic_read(&nmi_active) && nmi_watchdog == NMI_IO_APIC)
+               on_each_cpu(__acpi_nmi_disable, NULL, 0, 1);
+}
+
+static void __acpi_nmi_enable(void *__unused)
+{
+       apic_write_around(APIC_LVT0, APIC_DM_NMI);
+}
+
+/*
+ * Enable timer based NMIs on all CPUs:
+ */
+void acpi_nmi_enable(void)
+{
+       if (atomic_read(&nmi_active) && nmi_watchdog == NMI_IO_APIC)
+               on_each_cpu(__acpi_nmi_enable, NULL, 0, 1);
+}
+
 #ifdef CONFIG_PM
 
 static int nmi_pm_active; /* nmi_active before suspend */
@@ -442,6 +486,17 @@ static void write_watchdog_counter(unsigned int perfctr_msr, const char *descr)
        wrmsrl(perfctr_msr, 0 - count);
 }
 
+static void write_watchdog_counter32(unsigned int perfctr_msr,
+               const char *descr)
+{
+       u64 count = (u64)cpu_khz * 1000;
+
+       do_div(count, nmi_hz);
+       if(descr)
+               Dprintk("setting %s to -0x%08Lx\n", descr, count);
+       wrmsr(perfctr_msr, (u32)(-count), 0);
+}
+
 /* Note that these events don't tick when the CPU idles. This means
    the frequency varies with CPU load. */
 
@@ -531,7 +586,8 @@ static int setup_p6_watchdog(void)
 
        /* setup the timer */
        wrmsr(evntsel_msr, evntsel, 0);
-       write_watchdog_counter(perfctr_msr, "P6_PERFCTR0");
+       nmi_hz = adjust_for_32bit_ctr(nmi_hz);
+       write_watchdog_counter32(perfctr_msr, "P6_PERFCTR0");
        apic_write(APIC_LVTPC, APIC_DM_NMI);
        evntsel |= P6_EVNTSEL0_ENABLE;
        wrmsr(evntsel_msr, evntsel, 0);
@@ -704,7 +760,8 @@ static int setup_intel_arch_watchdog(void)
 
        /* setup the timer */
        wrmsr(evntsel_msr, evntsel, 0);
-       write_watchdog_counter(perfctr_msr, "INTEL_ARCH_PERFCTR0");
+       nmi_hz = adjust_for_32bit_ctr(nmi_hz);
+       write_watchdog_counter32(perfctr_msr, "INTEL_ARCH_PERFCTR0");
        apic_write(APIC_LVTPC, APIC_DM_NMI);
        evntsel |= ARCH_PERFMON_EVENTSEL0_ENABLE;
        wrmsr(evntsel_msr, evntsel, 0);
@@ -762,7 +819,8 @@ void setup_apic_nmi_watchdog (void *unused)
        if (nmi_watchdog == NMI_LOCAL_APIC) {
                switch (boot_cpu_data.x86_vendor) {
                case X86_VENDOR_AMD:
-                       if (boot_cpu_data.x86 != 6 && boot_cpu_data.x86 != 15)
+                       if (boot_cpu_data.x86 != 6 && boot_cpu_data.x86 != 15 &&
+                               boot_cpu_data.x86 != 16)
                                return;
                        if (!setup_k7_watchdog())
                                return;
@@ -916,9 +974,13 @@ __kprobes int nmi_watchdog_tick(struct pt_regs * regs, unsigned reason)
                cpu_clear(cpu, backtrace_mask);
        }
 
-       sum = per_cpu(irq_stat, cpu).apic_timer_irqs;
+       /*
+        * Take the local apic timer and PIT/HPET into account. We don't
+        * know which one is active, when we have highres/dyntick on
+        */
+       sum = per_cpu(irq_stat, cpu).apic_timer_irqs + kstat_irqs(0);
 
-       /* if the apic timer isn't firing, this cpu isn't doing much */
+       /* if the none of the timers isn't firing, this cpu isn't doing much */
        if (!touched && last_irq_sums[cpu] == sum) {
                /*
                 * Ayiee, looks like this CPU is stuck ...
@@ -956,6 +1018,8 @@ __kprobes int nmi_watchdog_tick(struct pt_regs * regs, unsigned reason)
                                dummy &= ~P4_CCCR_OVF;
                                wrmsrl(wd->cccr_msr, dummy);
                                apic_write(APIC_LVTPC, APIC_DM_NMI);
+                               /* start the cycle over again */
+                               write_watchdog_counter(wd->perfctr_msr, NULL);
                        }
                        else if (wd->perfctr_msr == MSR_P6_PERFCTR0 ||
                                 wd->perfctr_msr == MSR_ARCH_PERFMON_PERFCTR0) {
@@ -964,9 +1028,12 @@ __kprobes int nmi_watchdog_tick(struct pt_regs * regs, unsigned reason)
                                 * other P6 variant.
                                 * ArchPerfom/Core Duo also needs this */
                                apic_write(APIC_LVTPC, APIC_DM_NMI);
+                               /* P6/ARCH_PERFMON has 32 bit counter write */
+                               write_watchdog_counter32(wd->perfctr_msr, NULL);
+                       } else {
+                               /* start the cycle over again */
+                               write_watchdog_counter(wd->perfctr_msr, NULL);
                        }
-                       /* start the cycle over again */
-                       write_watchdog_counter(wd->perfctr_msr, NULL);
                        rc = 1;
                } else if (nmi_watchdog == NMI_IO_APIC) {
                        /* don't know how to accurately check for this.
index e55fd05da0f521048c03bf68206f336e1cb6f94f..c156ecfa38727c2133ec4f3994ba8f4f9e82fc9f 100644 (file)
@@ -92,7 +92,7 @@ static unsigned native_patch(u8 type, u16 clobbers, void *insns, unsigned len)
        return insn_len;
 }
 
-static fastcall unsigned long native_get_debugreg(int regno)
+static unsigned long native_get_debugreg(int regno)
 {
        unsigned long val = 0;  /* Damn you, gcc! */
 
@@ -115,7 +115,7 @@ static fastcall unsigned long native_get_debugreg(int regno)
        return val;
 }
 
-static fastcall void native_set_debugreg(int regno, unsigned long value)
+static void native_set_debugreg(int regno, unsigned long value)
 {
        switch (regno) {
        case 0:
@@ -146,55 +146,55 @@ void init_IRQ(void)
        paravirt_ops.init_IRQ();
 }
 
-static fastcall void native_clts(void)
+static void native_clts(void)
 {
        asm volatile ("clts");
 }
 
-static fastcall unsigned long native_read_cr0(void)
+static unsigned long native_read_cr0(void)
 {
        unsigned long val;
        asm volatile("movl %%cr0,%0\n\t" :"=r" (val));
        return val;
 }
 
-static fastcall void native_write_cr0(unsigned long val)
+static void native_write_cr0(unsigned long val)
 {
        asm volatile("movl %0,%%cr0": :"r" (val));
 }
 
-static fastcall unsigned long native_read_cr2(void)
+static unsigned long native_read_cr2(void)
 {
        unsigned long val;
        asm volatile("movl %%cr2,%0\n\t" :"=r" (val));
        return val;
 }
 
-static fastcall void native_write_cr2(unsigned long val)
+static void native_write_cr2(unsigned long val)
 {
        asm volatile("movl %0,%%cr2": :"r" (val));
 }
 
-static fastcall unsigned long native_read_cr3(void)
+static unsigned long native_read_cr3(void)
 {
        unsigned long val;
        asm volatile("movl %%cr3,%0\n\t" :"=r" (val));
        return val;
 }
 
-static fastcall void native_write_cr3(unsigned long val)
+static void native_write_cr3(unsigned long val)
 {
        asm volatile("movl %0,%%cr3": :"r" (val));
 }
 
-static fastcall unsigned long native_read_cr4(void)
+static unsigned long native_read_cr4(void)
 {
        unsigned long val;
        asm volatile("movl %%cr4,%0\n\t" :"=r" (val));
        return val;
 }
 
-static fastcall unsigned long native_read_cr4_safe(void)
+static unsigned long native_read_cr4_safe(void)
 {
        unsigned long val;
        /* This could fault if %cr4 does not exist */
@@ -207,51 +207,51 @@ static fastcall unsigned long native_read_cr4_safe(void)
        return val;
 }
 
-static fastcall void native_write_cr4(unsigned long val)
+static void native_write_cr4(unsigned long val)
 {
        asm volatile("movl %0,%%cr4": :"r" (val));
 }
 
-static fastcall unsigned long native_save_fl(void)
+static unsigned long native_save_fl(void)
 {
        unsigned long f;
        asm volatile("pushfl ; popl %0":"=g" (f): /* no input */);
        return f;
 }
 
-static fastcall void native_restore_fl(unsigned long f)
+static void native_restore_fl(unsigned long f)
 {
        asm volatile("pushl %0 ; popfl": /* no output */
                             :"g" (f)
                             :"memory", "cc");
 }
 
-static fastcall void native_irq_disable(void)
+static void native_irq_disable(void)
 {
        asm volatile("cli": : :"memory");
 }
 
-static fastcall void native_irq_enable(void)
+static void native_irq_enable(void)
 {
        asm volatile("sti": : :"memory");
 }
 
-static fastcall void native_safe_halt(void)
+static void native_safe_halt(void)
 {
        asm volatile("sti; hlt": : :"memory");
 }
 
-static fastcall void native_halt(void)
+static void native_halt(void)
 {
        asm volatile("hlt": : :"memory");
 }
 
-static fastcall void native_wbinvd(void)
+static void native_wbinvd(void)
 {
        asm volatile("wbinvd": : :"memory");
 }
 
-static fastcall unsigned long long native_read_msr(unsigned int msr, int *err)
+static unsigned long long native_read_msr(unsigned int msr, int *err)
 {
        unsigned long long val;
 
@@ -270,7 +270,7 @@ static fastcall unsigned long long native_read_msr(unsigned int msr, int *err)
        return val;
 }
 
-static fastcall int native_write_msr(unsigned int msr, unsigned long long val)
+static int native_write_msr(unsigned int msr, unsigned long long val)
 {
        int err;
        asm volatile("2: wrmsr ; xorl %0,%0\n"
@@ -288,53 +288,53 @@ static fastcall int native_write_msr(unsigned int msr, unsigned long long val)
        return err;
 }
 
-static fastcall unsigned long long native_read_tsc(void)
+static unsigned long long native_read_tsc(void)
 {
        unsigned long long val;
        asm volatile("rdtsc" : "=A" (val));
        return val;
 }
 
-static fastcall unsigned long long native_read_pmc(void)
+static unsigned long long native_read_pmc(void)
 {
        unsigned long long val;
        asm volatile("rdpmc" : "=A" (val));
        return val;
 }
 
-static fastcall void native_load_tr_desc(void)
+static void native_load_tr_desc(void)
 {
        asm volatile("ltr %w0"::"q" (GDT_ENTRY_TSS*8));
 }
 
-static fastcall void native_load_gdt(const struct Xgt_desc_struct *dtr)
+static void native_load_gdt(const struct Xgt_desc_struct *dtr)
 {
        asm volatile("lgdt %0"::"m" (*dtr));
 }
 
-static fastcall void native_load_idt(const struct Xgt_desc_struct *dtr)
+static void native_load_idt(const struct Xgt_desc_struct *dtr)
 {
        asm volatile("lidt %0"::"m" (*dtr));
 }
 
-static fastcall void native_store_gdt(struct Xgt_desc_struct *dtr)
+static void native_store_gdt(struct Xgt_desc_struct *dtr)
 {
        asm ("sgdt %0":"=m" (*dtr));
 }
 
-static fastcall void native_store_idt(struct Xgt_desc_struct *dtr)
+static void native_store_idt(struct Xgt_desc_struct *dtr)
 {
        asm ("sidt %0":"=m" (*dtr));
 }
 
-static fastcall unsigned long native_store_tr(void)
+static unsigned long native_store_tr(void)
 {
        unsigned long tr;
        asm ("str %0":"=r" (tr));
        return tr;
 }
 
-static fastcall void native_load_tls(struct thread_struct *t, unsigned int cpu)
+static void native_load_tls(struct thread_struct *t, unsigned int cpu)
 {
 #define C(i) get_cpu_gdt_table(cpu)[GDT_ENTRY_TLS_MIN + i] = t->tls_array[i]
        C(0); C(1); C(2);
@@ -348,22 +348,22 @@ static inline void native_write_dt_entry(void *dt, int entry, u32 entry_low, u32
        lp[1] = entry_high;
 }
 
-static fastcall void native_write_ldt_entry(void *dt, int entrynum, u32 low, u32 high)
+static void native_write_ldt_entry(void *dt, int entrynum, u32 low, u32 high)
 {
        native_write_dt_entry(dt, entrynum, low, high);
 }
 
-static fastcall void native_write_gdt_entry(void *dt, int entrynum, u32 low, u32 high)
+static void native_write_gdt_entry(void *dt, int entrynum, u32 low, u32 high)
 {
        native_write_dt_entry(dt, entrynum, low, high);
 }
 
-static fastcall void native_write_idt_entry(void *dt, int entrynum, u32 low, u32 high)
+static void native_write_idt_entry(void *dt, int entrynum, u32 low, u32 high)
 {
        native_write_dt_entry(dt, entrynum, low, high);
 }
 
-static fastcall void native_load_esp0(struct tss_struct *tss,
+static void native_load_esp0(struct tss_struct *tss,
                                      struct thread_struct *thread)
 {
        tss->esp0 = thread->esp0;
@@ -375,12 +375,12 @@ static fastcall void native_load_esp0(struct tss_struct *tss,
        }
 }
 
-static fastcall void native_io_delay(void)
+static void native_io_delay(void)
 {
        asm volatile("outb %al,$0x80");
 }
 
-static fastcall void native_flush_tlb(void)
+static void native_flush_tlb(void)
 {
        __native_flush_tlb();
 }
@@ -389,49 +389,49 @@ static fastcall void native_flush_tlb(void)
  * Global pages have to be flushed a bit differently. Not a real
  * performance problem because this does not happen often.
  */
-static fastcall void native_flush_tlb_global(void)
+static void native_flush_tlb_global(void)
 {
        __native_flush_tlb_global();
 }
 
-static fastcall void native_flush_tlb_single(u32 addr)
+static void native_flush_tlb_single(u32 addr)
 {
        __native_flush_tlb_single(addr);
 }
 
 #ifndef CONFIG_X86_PAE
-static fastcall void native_set_pte(pte_t *ptep, pte_t pteval)
+static void native_set_pte(pte_t *ptep, pte_t pteval)
 {
        *ptep = pteval;
 }
 
-static fastcall void native_set_pte_at(struct mm_struct *mm, u32 addr, pte_t *ptep, pte_t pteval)
+static void native_set_pte_at(struct mm_struct *mm, u32 addr, pte_t *ptep, pte_t pteval)
 {
        *ptep = pteval;
 }
 
-static fastcall void native_set_pmd(pmd_t *pmdp, pmd_t pmdval)
+static void native_set_pmd(pmd_t *pmdp, pmd_t pmdval)
 {
        *pmdp = pmdval;
 }
 
 #else /* CONFIG_X86_PAE */
 
-static fastcall void native_set_pte(pte_t *ptep, pte_t pte)
+static void native_set_pte(pte_t *ptep, pte_t pte)
 {
        ptep->pte_high = pte.pte_high;
        smp_wmb();
        ptep->pte_low = pte.pte_low;
 }
 
-static fastcall void native_set_pte_at(struct mm_struct *mm, u32 addr, pte_t *ptep, pte_t pte)
+static void native_set_pte_at(struct mm_struct *mm, u32 addr, pte_t *ptep, pte_t pte)
 {
        ptep->pte_high = pte.pte_high;
        smp_wmb();
        ptep->pte_low = pte.pte_low;
 }
 
-static fastcall void native_set_pte_present(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte)
+static void native_set_pte_present(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte)
 {
        ptep->pte_low = 0;
        smp_wmb();
@@ -440,29 +440,29 @@ static fastcall void native_set_pte_present(struct mm_struct *mm, unsigned long
        ptep->pte_low = pte.pte_low;
 }
 
-static fastcall void native_set_pte_atomic(pte_t *ptep, pte_t pteval)
+static void native_set_pte_atomic(pte_t *ptep, pte_t pteval)
 {
        set_64bit((unsigned long long *)ptep,pte_val(pteval));
 }
 
-static fastcall void native_set_pmd(pmd_t *pmdp, pmd_t pmdval)
+static void native_set_pmd(pmd_t *pmdp, pmd_t pmdval)
 {
        set_64bit((unsigned long long *)pmdp,pmd_val(pmdval));
 }
 
-static fastcall void native_set_pud(pud_t *pudp, pud_t pudval)
+static void native_set_pud(pud_t *pudp, pud_t pudval)
 {
        *pudp = pudval;
 }
 
-static fastcall void native_pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
+static void native_pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
 {
        ptep->pte_low = 0;
        smp_wmb();
        ptep->pte_high = 0;
 }
 
-static fastcall void native_pmd_clear(pmd_t *pmd)
+static void native_pmd_clear(pmd_t *pmd)
 {
        u32 *tmp = (u32 *)pmd;
        *tmp = 0;
@@ -472,8 +472,8 @@ static fastcall void native_pmd_clear(pmd_t *pmd)
 #endif /* CONFIG_X86_PAE */
 
 /* These are in entry.S */
-extern fastcall void native_iret(void);
-extern fastcall void native_irq_enable_sysexit(void);
+extern void native_iret(void);
+extern void native_irq_enable_sysexit(void);
 
 static int __init print_banner(void)
 {
@@ -482,9 +482,6 @@ static int __init print_banner(void)
 }
 core_initcall(print_banner);
 
-/* We simply declare start_kernel to be the paravirt probe of last resort. */
-paravirt_probe(start_kernel);
-
 struct paravirt_ops paravirt_ops = {
        .name = "bare hardware",
        .paravirt_enabled = 0,
@@ -544,12 +541,21 @@ struct paravirt_ops paravirt_ops = {
        .apic_write = native_apic_write,
        .apic_write_atomic = native_apic_write_atomic,
        .apic_read = native_apic_read,
+       .setup_boot_clock = setup_boot_APIC_clock,
+       .setup_secondary_clock = setup_secondary_APIC_clock,
 #endif
+       .set_lazy_mode = (void *)native_nop,
 
        .flush_tlb_user = native_flush_tlb,
        .flush_tlb_kernel = native_flush_tlb_global,
        .flush_tlb_single = native_flush_tlb_single,
 
+       .alloc_pt = (void *)native_nop,
+       .alloc_pd = (void *)native_nop,
+       .alloc_pd_clone = (void *)native_nop,
+       .release_pt = (void *)native_nop,
+       .release_pd = (void *)native_nop,
+
        .set_pte = native_set_pte,
        .set_pte_at = native_set_pte_at,
        .set_pmd = native_set_pmd,
@@ -565,6 +571,8 @@ struct paravirt_ops paravirt_ops = {
 
        .irq_enable_sysexit = native_irq_enable_sysexit,
        .iret = native_iret,
+
+       .startup_ipi_hook = (void *)native_nop,
 };
 
 /*
diff --git a/arch/i386/kernel/pcspeaker.c b/arch/i386/kernel/pcspeaker.c
new file mode 100644 (file)
index 0000000..bc1f2d3
--- /dev/null
@@ -0,0 +1,20 @@
+#include <linux/platform_device.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+
+static __init int add_pcspkr(void)
+{
+       struct platform_device *pd;
+       int ret;
+
+       pd = platform_device_alloc("pcspkr", -1);
+       if (!pd)
+               return -ENOMEM;
+
+       ret = platform_device_add(pd);
+       if (ret)
+               platform_device_put(pd);
+
+       return ret;
+}
+device_initcall(add_pcspkr);
index c641056233a60a2bffaff12edae8773018019945..bea304d48cdbb8fdc150e9033ad0e53a3961c439 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/ptrace.h>
 #include <linux/random.h>
 #include <linux/personality.h>
+#include <linux/tick.h>
 
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
@@ -48,6 +49,7 @@
 #include <asm/i387.h>
 #include <asm/desc.h>
 #include <asm/vm86.h>
+#include <asm/idle.h>
 #ifdef CONFIG_MATH_EMULATION
 #include <asm/math_emu.h>
 #endif
@@ -80,6 +82,42 @@ void (*pm_idle)(void);
 EXPORT_SYMBOL(pm_idle);
 static DEFINE_PER_CPU(unsigned int, cpu_idle_state);
 
+static ATOMIC_NOTIFIER_HEAD(idle_notifier);
+
+void idle_notifier_register(struct notifier_block *n)
+{
+       atomic_notifier_chain_register(&idle_notifier, n);
+}
+
+void idle_notifier_unregister(struct notifier_block *n)
+{
+       atomic_notifier_chain_unregister(&idle_notifier, n);
+}
+
+static DEFINE_PER_CPU(volatile unsigned long, idle_state);
+
+void enter_idle(void)
+{
+       /* needs to be atomic w.r.t. interrupts, not against other CPUs */
+       __set_bit(0, &__get_cpu_var(idle_state));
+       atomic_notifier_call_chain(&idle_notifier, IDLE_START, NULL);
+}
+
+static void __exit_idle(void)
+{
+       /* needs to be atomic w.r.t. interrupts, not against other CPUs */
+       if (__test_and_clear_bit(0, &__get_cpu_var(idle_state)) == 0)
+               return;
+       atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL);
+}
+
+void exit_idle(void)
+{
+       if (current->pid)
+               return;
+       __exit_idle();
+}
+
 void disable_hlt(void)
 {
        hlt_counter++;
@@ -130,6 +168,7 @@ EXPORT_SYMBOL(default_idle);
  */
 static void poll_idle (void)
 {
+       local_irq_enable();
        cpu_relax();
 }
 
@@ -173,6 +212,7 @@ void cpu_idle(void)
 
        /* endless idle loop with no priority at all */
        while (1) {
+               tick_nohz_stop_sched_tick();
                while (!need_resched()) {
                        void (*idle)(void);
 
@@ -189,8 +229,18 @@ void cpu_idle(void)
                                play_dead();
 
                        __get_cpu_var(irq_stat).idle_timestamp = jiffies;
+
+                       /*
+                        * Idle routines should keep interrupts disabled
+                        * from here on, until they go to idle.
+                        * Otherwise, idle callbacks can misfire.
+                        */
+                       local_irq_disable();
+                       enter_idle();
                        idle();
+                       __exit_idle();
                }
+               tick_nohz_restart_sched_tick();
                preempt_enable_no_resched();
                schedule();
                preempt_disable();
@@ -243,7 +293,11 @@ void mwait_idle_with_hints(unsigned long eax, unsigned long ecx)
                __monitor((void *)&current_thread_info()->flags, 0, 0);
                smp_mb();
                if (!need_resched())
-                       __mwait(eax, ecx);
+                       __sti_mwait(eax, ecx);
+               else
+                       local_irq_enable();
+       } else {
+               local_irq_enable();
        }
 }
 
@@ -308,8 +362,8 @@ void show_regs(struct pt_regs * regs)
                regs->eax,regs->ebx,regs->ecx,regs->edx);
        printk("ESI: %08lx EDI: %08lx EBP: %08lx",
                regs->esi, regs->edi, regs->ebp);
-       printk(" DS: %04x ES: %04x GS: %04x\n",
-              0xffff & regs->xds,0xffff & regs->xes, 0xffff & regs->xgs);
+       printk(" DS: %04x ES: %04x FS: %04x\n",
+              0xffff & regs->xds,0xffff & regs->xes, 0xffff & regs->xfs);
 
        cr0 = read_cr0();
        cr2 = read_cr2();
@@ -340,7 +394,7 @@ int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
 
        regs.xds = __USER_DS;
        regs.xes = __USER_DS;
-       regs.xgs = __KERNEL_PDA;
+       regs.xfs = __KERNEL_PDA;
        regs.orig_eax = -1;
        regs.eip = (unsigned long) kernel_thread_helper;
        regs.xcs = __KERNEL_CS | get_kernel_rpl();
@@ -425,7 +479,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
 
        p->thread.eip = (unsigned long) ret_from_fork;
 
-       savesegment(fs,p->thread.fs);
+       savesegment(gs,p->thread.gs);
 
        tsk = current;
        if (unlikely(test_tsk_thread_flag(tsk, TIF_IO_BITMAP))) {
@@ -501,8 +555,8 @@ void dump_thread(struct pt_regs * regs, struct user * dump)
        dump->regs.eax = regs->eax;
        dump->regs.ds = regs->xds;
        dump->regs.es = regs->xes;
-       savesegment(fs,dump->regs.fs);
-       dump->regs.gs = regs->xgs;
+       dump->regs.fs = regs->xfs;
+       savesegment(gs,dump->regs.gs);
        dump->regs.orig_eax = regs->orig_eax;
        dump->regs.eip = regs->eip;
        dump->regs.cs = regs->xcs;
@@ -653,7 +707,7 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas
        load_esp0(tss, next);
 
        /*
-        * Save away %fs. No need to save %gs, as it was saved on the
+        * Save away %gs. No need to save %fs, as it was saved on the
         * stack on entry.  No need to save %es and %ds, as those are
         * always kernel segments while inside the kernel.  Doing this
         * before setting the new TLS descriptors avoids the situation
@@ -662,7 +716,7 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas
         * used %fs or %gs (it does not today), or if the kernel is
         * running inside of a hypervisor layer.
         */
-       savesegment(fs, prev->fs);
+       savesegment(gs, prev->gs);
 
        /*
         * Load the per-thread Thread-Local Storage descriptor.
@@ -670,14 +724,13 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas
        load_TLS(next, cpu);
 
        /*
-        * Restore %fs if needed.
-        *
-        * Glibc normally makes %fs be zero.
+        * Restore IOPL if needed.  In normal use, the flags restore
+        * in the switch assembly will handle this.  But if the kernel
+        * is running virtualized at a non-zero CPL, the popf will
+        * not restore flags, so it must be done in a separate step.
         */
-       if (unlikely(prev->fs | next->fs))
-               loadsegment(fs, next->fs);
-
-       write_pda(pcurrent, next_p);
+       if (get_kernel_rpl() && unlikely(prev->iopl != next->iopl))
+               set_iopl_mask(next->iopl);
 
        /*
         * Now maybe handle debug registers and/or IO bitmaps
@@ -688,6 +741,15 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas
 
        disable_tsc(prev_p, next_p);
 
+       /*
+        * Leave lazy mode, flushing any hypercalls made here.
+        * This must be done before restoring TLS segments so
+        * the GDT and LDT are properly updated, and must be
+        * done before math_state_restore, so the TS bit is up
+        * to date.
+        */
+       arch_leave_lazy_cpu_mode();
+
        /* If the task has used fpu the last 5 timeslices, just do a full
         * restore of the math state immediately to avoid the trap; the
         * chances of needing FPU soon are obviously high now
@@ -695,6 +757,14 @@ struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct tas
        if (next_p->fpu_counter > 5)
                math_state_restore();
 
+       /*
+        * Restore %gs if needed (which is common)
+        */
+       if (prev->gs | next->gs)
+               loadsegment(gs, next->gs);
+
+       write_pda(pcurrent, next_p);
+
        return prev_p;
 }
 
index af8aabe8580034970071a8ddb57630fbc619ace9..4a8f8a2597233d06316afa6463d9e1eabdd9592e 100644 (file)
@@ -89,14 +89,14 @@ static int putreg(struct task_struct *child,
        unsigned long regno, unsigned long value)
 {
        switch (regno >> 2) {
-               case FS:
+               case GS:
                        if (value && (value & 3) != 3)
                                return -EIO;
-                       child->thread.fs = value;
+                       child->thread.gs = value;
                        return 0;
                case DS:
                case ES:
-               case GS:
+               case FS:
                        if (value && (value & 3) != 3)
                                return -EIO;
                        value &= 0xffff;
@@ -112,7 +112,7 @@ static int putreg(struct task_struct *child,
                        value |= get_stack_long(child, EFL_OFFSET) & ~FLAG_MASK;
                        break;
        }
-       if (regno > ES*4)
+       if (regno > FS*4)
                regno -= 1*4;
        put_stack_long(child, regno, value);
        return 0;
@@ -124,18 +124,18 @@ static unsigned long getreg(struct task_struct *child,
        unsigned long retval = ~0UL;
 
        switch (regno >> 2) {
-               case FS:
-                       retval = child->thread.fs;
+               case GS:
+                       retval = child->thread.gs;
                        break;
                case DS:
                case ES:
-               case GS:
+               case FS:
                case SS:
                case CS:
                        retval = 0xffff;
                        /* fall through */
                default:
-                       if (regno > ES*4)
+                       if (regno > FS*4)
                                regno -= 1*4;
                        retval &= get_stack_long(child, regno);
        }
index 4b31ad70c1ac6699c6710faf415ec6e1c30d488b..122623dcc6e1bc94543f0d343d0fe4a19e90cef7 100644 (file)
@@ -33,7 +33,6 @@
 #include <linux/initrd.h>
 #include <linux/bootmem.h>
 #include <linux/seq_file.h>
-#include <linux/platform_device.h>
 #include <linux/console.h>
 #include <linux/mca.h>
 #include <linux/root_dev.h>
@@ -60,6 +59,7 @@
 #include <asm/io_apic.h>
 #include <asm/ist.h>
 #include <asm/io.h>
+#include <asm/vmi.h>
 #include <setup_arch.h>
 #include <bios_ebda.h>
 
@@ -132,7 +132,7 @@ unsigned long saved_videomode;
 #define RAMDISK_PROMPT_FLAG            0x8000
 #define RAMDISK_LOAD_FLAG              0x4000  
 
-static char command_line[COMMAND_LINE_SIZE];
+static char __initdata command_line[COMMAND_LINE_SIZE];
 
 unsigned char __initdata boot_params[PARAM_SIZE];
 
@@ -576,11 +576,19 @@ void __init setup_arch(char **cmdline_p)
                print_memory_map("user");
        }
 
-       strlcpy(command_line, saved_command_line, COMMAND_LINE_SIZE);
+       strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
        *cmdline_p = command_line;
 
        max_low_pfn = setup_memory();
 
+#ifdef CONFIG_VMI
+       /*
+        * Must be after max_low_pfn is determined, and before kernel
+        * pagetables are setup.
+        */
+       vmi_init();
+#endif
+
        /*
         * NOTE: before this point _nobody_ is allowed to allocate
         * any memory using the bootmem allocator.  Although the
@@ -651,28 +659,3 @@ void __init setup_arch(char **cmdline_p)
 #endif
        tsc_init();
 }
-
-static __init int add_pcspkr(void)
-{
-       struct platform_device *pd;
-       int ret;
-
-       pd = platform_device_alloc("pcspkr", -1);
-       if (!pd)
-               return -ENOMEM;
-
-       ret = platform_device_add(pd);
-       if (ret)
-               platform_device_put(pd);
-
-       return ret;
-}
-device_initcall(add_pcspkr);
-
-/*
- * Local Variables:
- * mode:c
- * c-file-style:"k&r"
- * c-basic-offset:8
- * End:
- */
index 65d7620eaa093756e083ed5d0f9786ccfc1bd917..4f99e870c986f41b72168b3dd44fbfc1e075bbe6 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/suspend.h>
 #include <linux/ptrace.h>
 #include <linux/elf.h>
+#include <linux/binfmts.h>
 #include <asm/processor.h>
 #include <asm/ucontext.h>
 #include <asm/uaccess.h>
@@ -128,8 +129,8 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *peax
                         X86_EFLAGS_TF | X86_EFLAGS_SF | X86_EFLAGS_ZF | \
                         X86_EFLAGS_AF | X86_EFLAGS_PF | X86_EFLAGS_CF)
 
-       COPY_SEG(gs);
-       GET_SEG(fs);
+       GET_SEG(gs);
+       COPY_SEG(fs);
        COPY_SEG(es);
        COPY_SEG(ds);
        COPY(edi);
@@ -244,9 +245,9 @@ setup_sigcontext(struct sigcontext __user *sc, struct _fpstate __user *fpstate,
 {
        int tmp, err = 0;
 
-       err |= __put_user(regs->xgs, (unsigned int __user *)&sc->gs);
-       savesegment(fs, tmp);
-       err |= __put_user(tmp, (unsigned int __user *)&sc->fs);
+       err |= __put_user(regs->xfs, (unsigned int __user *)&sc->fs);
+       savesegment(gs, tmp);
+       err |= __put_user(tmp, (unsigned int __user *)&sc->gs);
 
        err |= __put_user(regs->xes, (unsigned int __user *)&sc->es);
        err |= __put_user(regs->xds, (unsigned int __user *)&sc->ds);
@@ -349,7 +350,10 @@ static int setup_frame(int sig, struct k_sigaction *ka,
                        goto give_sigsegv;
        }
 
-       restorer = (void *)VDSO_SYM(&__kernel_sigreturn);
+       if (current->binfmt->hasvdso)
+               restorer = (void *)VDSO_SYM(&__kernel_sigreturn);
+       else
+               restorer = (void *)&frame->retcode;
        if (ka->sa.sa_flags & SA_RESTORER)
                restorer = ka->sa.sa_restorer;
 
index 5285aff8367fec481d33a7ed94c0278815202286..9bd9637ae692fb731e08c836b562b5ad069eecb3 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <asm/mtrr.h>
 #include <asm/tlbflush.h>
+#include <asm/idle.h>
 #include <mach_apic.h>
 
 /*
@@ -374,8 +375,7 @@ static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm,
        /*
         * i'm not happy about this global shared spinlock in the
         * MM hot path, but we'll see how contended it is.
-        * Temporarily this turns IRQs off, so that lockups are
-        * detected by the NMI watchdog.
+        * AK: x86-64 has a faster method that could be ported.
         */
        spin_lock(&tlbstate_lock);
        
@@ -400,7 +400,7 @@ static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm,
 
        while (!cpus_empty(flush_cpumask))
                /* nothing. lockup detection does not belong here */
-               mb();
+               cpu_relax();
 
        flush_mm = NULL;
        flush_va = 0;
@@ -624,6 +624,7 @@ fastcall void smp_call_function_interrupt(struct pt_regs *regs)
        /*
         * At this point the info structure may be out of scope unless wait==1
         */
+       exit_idle();
        irq_enter();
        (*func)(info);
        irq_exit();
index 8c6c8c52b95c0b574b837c279f84647d3b4ba867..48bfcaa13ecca45c79503f791814c75ed4a5ba54 100644 (file)
@@ -63,6 +63,7 @@
 #include <mach_apic.h>
 #include <mach_wakecpu.h>
 #include <smpboot_hooks.h>
+#include <asm/vmi.h>
 
 /* Set if we find a B stepping CPU */
 static int __devinitdata smp_b_stepping;
@@ -93,12 +94,6 @@ cpumask_t cpu_possible_map;
 EXPORT_SYMBOL(cpu_possible_map);
 static cpumask_t smp_commenced_mask;
 
-/* TSC's upper 32 bits can't be written in eariler CPU (before prescott), there
- * is no way to resync one AP against BP. TBD: for prescott and above, we
- * should use IA64's algorithm
- */
-static int __devinitdata tsc_sync_disabled;
-
 /* Per CPU bogomips and other parameters */
 struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned;
 EXPORT_SYMBOL(cpu_data);
@@ -215,151 +210,6 @@ valid_k7:
        ;
 }
 
-/*
- * TSC synchronization.
- *
- * We first check whether all CPUs have their TSC's synchronized,
- * then we print a warning if not, and always resync.
- */
-
-static struct {
-       atomic_t start_flag;
-       atomic_t count_start;
-       atomic_t count_stop;
-       unsigned long long values[NR_CPUS];
-} tsc __cpuinitdata = {
-       .start_flag = ATOMIC_INIT(0),
-       .count_start = ATOMIC_INIT(0),
-       .count_stop = ATOMIC_INIT(0),
-};
-
-#define NR_LOOPS 5
-
-static void __init synchronize_tsc_bp(void)
-{
-       int i;
-       unsigned long long t0;
-       unsigned long long sum, avg;
-       long long delta;
-       unsigned int one_usec;
-       int buggy = 0;
-
-       printk(KERN_INFO "checking TSC synchronization across %u CPUs: ", num_booting_cpus());
-
-       /* convert from kcyc/sec to cyc/usec */
-       one_usec = cpu_khz / 1000;
-
-       atomic_set(&tsc.start_flag, 1);
-       wmb();
-
-       /*
-        * We loop a few times to get a primed instruction cache,
-        * then the last pass is more or less synchronized and
-        * the BP and APs set their cycle counters to zero all at
-        * once. This reduces the chance of having random offsets
-        * between the processors, and guarantees that the maximum
-        * delay between the cycle counters is never bigger than
-        * the latency of information-passing (cachelines) between
-        * two CPUs.
-        */
-       for (i = 0; i < NR_LOOPS; i++) {
-               /*
-                * all APs synchronize but they loop on '== num_cpus'
-                */
-               while (atomic_read(&tsc.count_start) != num_booting_cpus()-1)
-                       cpu_relax();
-               atomic_set(&tsc.count_stop, 0);
-               wmb();
-               /*
-                * this lets the APs save their current TSC:
-                */
-               atomic_inc(&tsc.count_start);
-
-               rdtscll(tsc.values[smp_processor_id()]);
-               /*
-                * We clear the TSC in the last loop:
-                */
-               if (i == NR_LOOPS-1)
-                       write_tsc(0, 0);
-
-               /*
-                * Wait for all APs to leave the synchronization point:
-                */
-               while (atomic_read(&tsc.count_stop) != num_booting_cpus()-1)
-                       cpu_relax();
-               atomic_set(&tsc.count_start, 0);
-               wmb();
-               atomic_inc(&tsc.count_stop);
-       }
-
-       sum = 0;
-       for (i = 0; i < NR_CPUS; i++) {
-               if (cpu_isset(i, cpu_callout_map)) {
-                       t0 = tsc.values[i];
-                       sum += t0;
-               }
-       }
-       avg = sum;
-       do_div(avg, num_booting_cpus());
-
-       for (i = 0; i < NR_CPUS; i++) {
-               if (!cpu_isset(i, cpu_callout_map))
-                       continue;
-               delta = tsc.values[i] - avg;
-               if (delta < 0)
-                       delta = -delta;
-               /*
-                * We report bigger than 2 microseconds clock differences.
-                */
-               if (delta > 2*one_usec) {
-                       long long realdelta;
-
-                       if (!buggy) {
-                               buggy = 1;
-                               printk("\n");
-                       }
-                       realdelta = delta;
-                       do_div(realdelta, one_usec);
-                       if (tsc.values[i] < avg)
-                               realdelta = -realdelta;
-
-                       if (realdelta)
-                               printk(KERN_INFO "CPU#%d had %Ld usecs TSC "
-                                       "skew, fixed it up.\n", i, realdelta);
-               }
-       }
-       if (!buggy)
-               printk("passed.\n");
-}
-
-static void __cpuinit synchronize_tsc_ap(void)
-{
-       int i;
-
-       /*
-        * Not every cpu is online at the time
-        * this gets called, so we first wait for the BP to
-        * finish SMP initialization:
-        */
-       while (!atomic_read(&tsc.start_flag))
-               cpu_relax();
-
-       for (i = 0; i < NR_LOOPS; i++) {
-               atomic_inc(&tsc.count_start);
-               while (atomic_read(&tsc.count_start) != num_booting_cpus())
-                       cpu_relax();
-
-               rdtscll(tsc.values[smp_processor_id()]);
-               if (i == NR_LOOPS-1)
-                       write_tsc(0, 0);
-
-               atomic_inc(&tsc.count_stop);
-               while (atomic_read(&tsc.count_stop) != num_booting_cpus())
-                       cpu_relax();
-       }
-}
-#undef NR_LOOPS
-
 extern void calibrate_delay(void);
 
 static atomic_t init_deasserted;
@@ -437,20 +287,12 @@ static void __cpuinit smp_callin(void)
        /*
         * Save our processor parameters
         */
-       smp_store_cpu_info(cpuid);
-
-       disable_APIC_timer();
+       smp_store_cpu_info(cpuid);
 
        /*
         * Allow the master to continue.
         */
        cpu_set(cpuid, cpu_callin_map);
-
-       /*
-        *      Synchronize the TSC with the BP
-        */
-       if (cpu_has_tsc && cpu_khz && !tsc_sync_disabled)
-               synchronize_tsc_ap();
 }
 
 static int cpucount;
@@ -545,18 +387,25 @@ static void __cpuinit start_secondary(void *unused)
         * booting is too fragile that we want to limit the
         * things done here to the most necessary things.
         */
+#ifdef CONFIG_VMI
+       vmi_bringup();
+#endif
        secondary_cpu_init();
        preempt_disable();
        smp_callin();
        while (!cpu_isset(smp_processor_id(), smp_commenced_mask))
                rep_nop();
-       setup_secondary_APIC_clock();
+       /*
+        * Check TSC synchronization with the BP:
+        */
+       check_tsc_sync_target();
+
+       setup_secondary_clock();
        if (nmi_watchdog == NMI_IO_APIC) {
                disable_8259A_irq(0);
                enable_NMI_through_LVT0(NULL);
                enable_8259A_irq(0);
        }
-       enable_APIC_timer();
        /*
         * low-memory mappings have been cleared, flush them from
         * the local TLBs too.
@@ -619,7 +468,6 @@ extern struct {
        unsigned short ss;
 } stack_start;
 extern struct i386_pda *start_pda;
-extern struct Xgt_desc_struct cpu_gdt_descr;
 
 #ifdef CONFIG_NUMA
 
@@ -749,7 +597,7 @@ wakeup_secondary_cpu(int logical_apicid, unsigned long start_eip)
        /*
         * Due to the Pentium erratum 3AP.
         */
-       maxlvt = get_maxlvt();
+       maxlvt = lapic_get_maxlvt();
        if (maxlvt > 3) {
                apic_read_around(APIC_SPIV);
                apic_write(APIC_ESR, 0);
@@ -834,12 +682,19 @@ wakeup_secondary_cpu(int phys_apicid, unsigned long start_eip)
        else
                num_starts = 0;
 
+       /*
+        * Paravirt / VMI wants a startup IPI hook here to set up the
+        * target processor state.
+        */
+       startup_ipi_hook(phys_apicid, (unsigned long) start_secondary,
+                        (unsigned long) stack_start.esp);
+
        /*
         * Run STARTUP IPI loop.
         */
        Dprintk("#startup loops: %d.\n", num_starts);
 
-       maxlvt = get_maxlvt();
+       maxlvt = lapic_get_maxlvt();
 
        for (j = 1; j <= num_starts; j++) {
                Dprintk("Sending STARTUP #%d.\n",j);
@@ -1115,8 +970,6 @@ static int __cpuinit __smp_prepare_cpu(int cpu)
        info.cpu = cpu;
        INIT_WORK(&info.task, do_warm_boot_cpu);
 
-       tsc_sync_disabled = 1;
-
        /* init low mem mapping */
        clone_pgd_range(swapper_pg_dir, swapper_pg_dir + USER_PGD_PTRS,
                        min_t(unsigned long, KERNEL_PGD_PTRS, USER_PGD_PTRS));
@@ -1124,7 +977,6 @@ static int __cpuinit __smp_prepare_cpu(int cpu)
        schedule_work(&info.task);
        wait_for_completion(&done);
 
-       tsc_sync_disabled = 0;
        zap_low_mappings();
        ret = 0;
 exit:
@@ -1320,13 +1172,7 @@ static void __init smp_boot_cpus(unsigned int max_cpus)
 
        smpboot_setup_io_apic();
 
-       setup_boot_APIC_clock();
-
-       /*
-        * Synchronize the TSC with the AP
-        */
-       if (cpu_has_tsc && cpucount && cpu_khz)
-               synchronize_tsc_bp();
+       setup_boot_clock();
 }
 
 /* These are wrappers to interface to the new boot process.  Someone
@@ -1461,9 +1307,16 @@ int __cpuinit __cpu_up(unsigned int cpu)
        }
 
        local_irq_enable();
+
        per_cpu(cpu_state, cpu) = CPU_UP_PREPARE;
        /* Unleash the CPU! */
        cpu_set(cpu, smp_commenced_mask);
+
+       /*
+        * Check TSC synchronization with the AP:
+        */
+       check_tsc_sync_source(cpu);
+
        while (!cpu_isset(cpu, cpu_online_map))
                cpu_relax();
 
index bc882a2b1db6f4fda8f80976d968ae48e804f0e8..13ca54a85a1ca2220e1f521441307e7d558946b7 100644 (file)
@@ -78,7 +78,7 @@ int __init sysenter_setup(void)
        syscall_pages[0] = virt_to_page(syscall_page);
 
 #ifdef CONFIG_COMPAT_VDSO
-       __set_fixmap(FIX_VDSO, __pa(syscall_page), PAGE_READONLY);
+       __set_fixmap(FIX_VDSO, __pa(syscall_page), PAGE_READONLY_EXEC);
        printk("Compat vDSO mapped to %08lx.\n", __fix_to_virt(FIX_VDSO));
 #endif
 
index c505b16c099038381efc87791d37e49c0aeb158c..a5350059557a6541c0c96b8f8ba6933073999d05 100644 (file)
@@ -131,15 +131,13 @@ unsigned long profile_pc(struct pt_regs *regs)
        unsigned long pc = instruction_pointer(regs);
 
 #ifdef CONFIG_SMP
-       if (!user_mode_vm(regs) && in_lock_functions(pc)) {
+       if (!v8086_mode(regs) && SEGMENT_IS_KERNEL_CODE(regs->xcs) &&
+           in_lock_functions(pc)) {
 #ifdef CONFIG_FRAME_POINTER
                return *(unsigned long *)(regs->ebp + 4);
 #else
-               unsigned long *sp;
-               if ((regs->xcs & 3) == 0)
-                       sp = (unsigned long *)&regs->esp;
-               else
-                       sp = (unsigned long *)regs->esp;
+               unsigned long *sp = (unsigned long *)&regs->esp;
+
                /* Return address is either directly at stack pointer
                   or above a saved eflags. Eflags has bits 22-31 zero,
                   kernel addresses don't. */
@@ -161,15 +159,6 @@ EXPORT_SYMBOL(profile_pc);
  */
 irqreturn_t timer_interrupt(int irq, void *dev_id)
 {
-       /*
-        * Here we are in the timer irq handler. We just have irqs locally
-        * disabled but we don't know if the timer_bh is running on the other
-        * CPU. We need to avoid to SMP race with it. NOTE: we don' t need
-        * the irq version of write_lock because as just said we have irq
-        * locally disabled. -arca
-        */
-       write_seqlock(&xtime_lock);
-
 #ifdef CONFIG_X86_IO_APIC
        if (timer_ack) {
                /*
@@ -188,7 +177,6 @@ irqreturn_t timer_interrupt(int irq, void *dev_id)
 
        do_timer_interrupt_hook();
 
-
        if (MCA_bus) {
                /* The PS/2 uses level-triggered interrupts.  You can't
                turn them off, nor would you want to (any attempt to
@@ -203,18 +191,11 @@ irqreturn_t timer_interrupt(int irq, void *dev_id)
                outb_p( irq_v|0x80, 0x61 );     /* reset the IRQ */
        }
 
-       write_sequnlock(&xtime_lock);
-
-#ifdef CONFIG_X86_LOCAL_APIC
-       if (using_apic_timer)
-               smp_send_timer_broadcast_ipi();
-#endif
-
        return IRQ_HANDLED;
 }
 
 /* not static: needed by APM */
-unsigned long get_cmos_time(void)
+unsigned long read_persistent_clock(void)
 {
        unsigned long retval;
        unsigned long flags;
@@ -227,11 +208,11 @@ unsigned long get_cmos_time(void)
 
        return retval;
 }
-EXPORT_SYMBOL(get_cmos_time);
 
 static void sync_cmos_clock(unsigned long dummy);
 
 static DEFINE_TIMER(sync_cmos_timer, sync_cmos_clock, 0, 0);
+int no_sync_cmos_clock;
 
 static void sync_cmos_clock(unsigned long dummy)
 {
@@ -275,117 +256,20 @@ static void sync_cmos_clock(unsigned long dummy)
 
 void notify_arch_cmos_timer(void)
 {
-       mod_timer(&sync_cmos_timer, jiffies + 1);
-}
-
-static long clock_cmos_diff;
-static unsigned long sleep_start;
-
-static int timer_suspend(struct sys_device *dev, pm_message_t state)
-{
-       /*
-        * Estimate time zone so that set_time can update the clock
-        */
-       unsigned long ctime =  get_cmos_time();
-
-       clock_cmos_diff = -ctime;
-       clock_cmos_diff += get_seconds();
-       sleep_start = ctime;
-       return 0;
-}
-
-static int timer_resume(struct sys_device *dev)
-{
-       unsigned long flags;
-       unsigned long sec;
-       unsigned long ctime = get_cmos_time();
-       long sleep_length = (ctime - sleep_start) * HZ;
-       struct timespec ts;
-
-       if (sleep_length < 0) {
-               printk(KERN_WARNING "CMOS clock skew detected in timer resume!\n");
-               /* The time after the resume must not be earlier than the time
-                * before the suspend or some nasty things will happen
-                */
-               sleep_length = 0;
-               ctime = sleep_start;
-       }
-#ifdef CONFIG_HPET_TIMER
-       if (is_hpet_enabled())
-               hpet_reenable();
-#endif
-       setup_pit_timer();
-
-       sec = ctime + clock_cmos_diff;
-       ts.tv_sec = sec;
-       ts.tv_nsec = 0;
-       do_settimeofday(&ts);
-       write_seqlock_irqsave(&xtime_lock, flags);
-       jiffies_64 += sleep_length;
-       write_sequnlock_irqrestore(&xtime_lock, flags);
-       touch_softlockup_watchdog();
-       return 0;
-}
-
-static struct sysdev_class timer_sysclass = {
-       .resume = timer_resume,
-       .suspend = timer_suspend,
-       set_kset_name("timer"),
-};
-
-
-/* XXX this driverfs stuff should probably go elsewhere later -john */
-static struct sys_device device_timer = {
-       .id     = 0,
-       .cls    = &timer_sysclass,
-};
-
-static int time_init_device(void)
-{
-       int error = sysdev_class_register(&timer_sysclass);
-       if (!error)
-               error = sysdev_register(&device_timer);
-       return error;
+       if (!no_sync_cmos_clock)
+               mod_timer(&sync_cmos_timer, jiffies + 1);
 }
 
-device_initcall(time_init_device);
-
-#ifdef CONFIG_HPET_TIMER
 extern void (*late_time_init)(void);
 /* Duplicate of time_init() below, with hpet_enable part added */
 static void __init hpet_time_init(void)
 {
-       struct timespec ts;
-       ts.tv_sec = get_cmos_time();
-       ts.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
-
-       do_settimeofday(&ts);
-
-       if ((hpet_enable() >= 0) && hpet_use_timer) {
-               printk("Using HPET for base-timer\n");
-       }
-
+       if (!hpet_enable())
+               setup_pit_timer();
        do_time_init();
 }
-#endif
 
 void __init time_init(void)
 {
-       struct timespec ts;
-#ifdef CONFIG_HPET_TIMER
-       if (is_hpet_capable()) {
-               /*
-                * HPET initialization needs to do memory-mapped io. So, let
-                * us do a late initialization after mem_init().
-                */
-               late_time_init = hpet_time_init;
-               return;
-       }
-#endif
-       ts.tv_sec = get_cmos_time();
-       ts.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
-
-       do_settimeofday(&ts);
-
-       do_time_init();
+       late_time_init = hpet_time_init;
 }
index 0efad8aeb41af86849ac3b8e6b667d6603f4f594..af0d3f70a8174d6b0a3b284dd46495e64c4deb34 100644 (file)
@@ -94,6 +94,7 @@ asmlinkage void spurious_interrupt_bug(void);
 asmlinkage void machine_check(void);
 
 int kstack_depth_to_print = 24;
+static unsigned int code_bytes = 64;
 ATOMIC_NOTIFIER_HEAD(i386die_chain);
 
 int register_die_notifier(struct notifier_block *nb)
@@ -291,10 +292,11 @@ void show_registers(struct pt_regs *regs)
        int i;
        int in_kernel = 1;
        unsigned long esp;
-       unsigned short ss;
+       unsigned short ss, gs;
 
        esp = (unsigned long) (&regs->esp);
        savesegment(ss, ss);
+       savesegment(gs, gs);
        if (user_mode_vm(regs)) {
                in_kernel = 0;
                esp = regs->esp;
@@ -313,8 +315,8 @@ void show_registers(struct pt_regs *regs)
                regs->eax, regs->ebx, regs->ecx, regs->edx);
        printk(KERN_EMERG "esi: %08lx   edi: %08lx   ebp: %08lx   esp: %08lx\n",
                regs->esi, regs->edi, regs->ebp, esp);
-       printk(KERN_EMERG "ds: %04x   es: %04x   ss: %04x\n",
-               regs->xds & 0xffff, regs->xes & 0xffff, ss);
+       printk(KERN_EMERG "ds: %04x   es: %04x   fs: %04x  gs: %04x  ss: %04x\n",
+              regs->xds & 0xffff, regs->xes & 0xffff, regs->xfs & 0xffff, gs, ss);
        printk(KERN_EMERG "Process %.*s (pid: %d, ti=%p task=%p task.ti=%p)",
                TASK_COMM_LEN, current->comm, current->pid,
                current_thread_info(), current, current->thread_info);
@@ -324,7 +326,8 @@ void show_registers(struct pt_regs *regs)
         */
        if (in_kernel) {
                u8 *eip;
-               int code_bytes = 64;
+               unsigned int code_prologue = code_bytes * 43 / 64;
+               unsigned int code_len = code_bytes;
                unsigned char c;
 
                printk("\n" KERN_EMERG "Stack: ");
@@ -332,14 +335,14 @@ void show_registers(struct pt_regs *regs)
 
                printk(KERN_EMERG "Code: ");
 
-               eip = (u8 *)regs->eip - 43;
+               eip = (u8 *)regs->eip - code_prologue;
                if (eip < (u8 *)PAGE_OFFSET ||
                        probe_kernel_address(eip, c)) {
                        /* try starting at EIP */
                        eip = (u8 *)regs->eip;
-                       code_bytes = 32;
+                       code_len = code_len - code_prologue + 1;
                }
-               for (i = 0; i < code_bytes; i++, eip++) {
+               for (i = 0; i < code_len; i++, eip++) {
                        if (eip < (u8 *)PAGE_OFFSET ||
                                probe_kernel_address(eip, c)) {
                                printk(" Bad EIP value.");
@@ -1191,3 +1194,13 @@ static int __init kstack_setup(char *s)
        return 1;
 }
 __setup("kstack=", kstack_setup);
+
+static int __init code_bytes_setup(char *s)
+{
+       code_bytes = simple_strtoul(s, NULL, 0);
+       if (code_bytes > 8192)
+               code_bytes = 8192;
+
+       return 1;
+}
+__setup("code_bytes=", code_bytes_setup);
index 2cfc7b09b925cd8147e7f54aa809ce3f58a592f6..3082a418635c11d6f3cdce2b53d3499a3124c075 100644 (file)
@@ -23,6 +23,7 @@
  * an extra value to store the TSC freq
  */
 unsigned int tsc_khz;
+unsigned long long (*custom_sched_clock)(void);
 
 int tsc_disable;
 
@@ -59,12 +60,6 @@ static inline int check_tsc_unstable(void)
        return tsc_unstable;
 }
 
-void mark_tsc_unstable(void)
-{
-       tsc_unstable = 1;
-}
-EXPORT_SYMBOL_GPL(mark_tsc_unstable);
-
 /* Accellerators for sched_clock()
  * convert from cycles(64bits) => nanoseconds (64bits)
  *  basic equation:
@@ -107,14 +102,14 @@ unsigned long long sched_clock(void)
 {
        unsigned long long this_offset;
 
+       if (unlikely(custom_sched_clock))
+               return (*custom_sched_clock)();
+
        /*
-        * in the NUMA case we dont use the TSC as they are not
-        * synchronized across all CPUs.
+        * Fall back to jiffies if there's no TSC available:
         */
-#ifndef CONFIG_NUMA
-       if (!cpu_khz || check_tsc_unstable())
-#endif
-               /* no locking but a rare wrong value is not a big deal */
+       if (unlikely(tsc_disable))
+               /* No locking but a rare wrong value is not a big deal: */
                return (jiffies_64 - INITIAL_JIFFIES) * (1000000000 / HZ);
 
        /* read the Time Stamp Counter: */
@@ -194,13 +189,13 @@ EXPORT_SYMBOL(recalibrate_cpu_khz);
 void __init tsc_init(void)
 {
        if (!cpu_has_tsc || tsc_disable)
-               return;
+               goto out_no_tsc;
 
        cpu_khz = calculate_cpu_khz();
        tsc_khz = cpu_khz;
 
        if (!cpu_khz)
-               return;
+               goto out_no_tsc;
 
        printk("Detected %lu.%03lu MHz processor.\n",
                                (unsigned long)cpu_khz / 1000,
@@ -208,37 +203,18 @@ void __init tsc_init(void)
 
        set_cyc2ns_scale(cpu_khz);
        use_tsc_delay();
-}
+       return;
 
-#ifdef CONFIG_CPU_FREQ
-
-static unsigned int cpufreq_delayed_issched = 0;
-static unsigned int cpufreq_init = 0;
-static struct work_struct cpufreq_delayed_get_work;
-
-static void handle_cpufreq_delayed_get(struct work_struct *work)
-{
-       unsigned int cpu;
-
-       for_each_online_cpu(cpu)
-               cpufreq_get(cpu);
-
-       cpufreq_delayed_issched = 0;
+out_no_tsc:
+       /*
+        * Set the tsc_disable flag if there's no TSC support, this
+        * makes it a fast flag for the kernel to see whether it
+        * should be using the TSC.
+        */
+       tsc_disable = 1;
 }
 
-/*
- * if we notice cpufreq oddness, schedule a call to cpufreq_get() as it tries
- * to verify the CPU frequency the timing core thinks the CPU is running
- * at is still correct.
- */
-static inline void cpufreq_delayed_get(void)
-{
-       if (cpufreq_init && !cpufreq_delayed_issched) {
-               cpufreq_delayed_issched = 1;
-               printk(KERN_DEBUG "Checking if CPU frequency changed.\n");
-               schedule_work(&cpufreq_delayed_get_work);
-       }
-}
+#ifdef CONFIG_CPU_FREQ
 
 /*
  * if the CPU frequency is scaled, TSC-based delays will need a different
@@ -303,17 +279,9 @@ static struct notifier_block time_cpufreq_notifier_block = {
 
 static int __init cpufreq_tsc(void)
 {
-       int ret;
-
-       INIT_WORK(&cpufreq_delayed_get_work, handle_cpufreq_delayed_get);
-       ret = cpufreq_register_notifier(&time_cpufreq_notifier_block,
-                                       CPUFREQ_TRANSITION_NOTIFIER);
-       if (!ret)
-               cpufreq_init = 1;
-
-       return ret;
+       return cpufreq_register_notifier(&time_cpufreq_notifier_block,
+                                        CPUFREQ_TRANSITION_NOTIFIER);
 }
-
 core_initcall(cpufreq_tsc);
 
 #endif
@@ -321,7 +289,6 @@ core_initcall(cpufreq_tsc);
 /* clock source code */
 
 static unsigned long current_tsc_khz = 0;
-static int tsc_update_callback(void);
 
 static cycle_t read_tsc(void)
 {
@@ -339,37 +306,28 @@ static struct clocksource clocksource_tsc = {
        .mask                   = CLOCKSOURCE_MASK(64),
        .mult                   = 0, /* to be set */
        .shift                  = 22,
-       .update_callback        = tsc_update_callback,
-       .is_continuous          = 1,
+       .flags                  = CLOCK_SOURCE_IS_CONTINUOUS |
+                                 CLOCK_SOURCE_MUST_VERIFY,
 };
 
-static int tsc_update_callback(void)
+void mark_tsc_unstable(void)
 {
-       int change = 0;
-
-       /* check to see if we should switch to the safe clocksource: */
-       if (clocksource_tsc.rating != 0 && check_tsc_unstable()) {
-               clocksource_tsc.rating = 0;
-               clocksource_reselect();
-               change = 1;
-       }
-
-       /* only update if tsc_khz has changed: */
-       if (current_tsc_khz != tsc_khz) {
-               current_tsc_khz = tsc_khz;
-               clocksource_tsc.mult = clocksource_khz2mult(current_tsc_khz,
-                                                       clocksource_tsc.shift);
-               change = 1;
+       if (!tsc_unstable) {
+               tsc_unstable = 1;
+               /* Can be called before registration */
+               if (clocksource_tsc.mult)
+                       clocksource_change_rating(&clocksource_tsc, 0);
+               else
+                       clocksource_tsc.rating = 0;
        }
-
-       return change;
 }
+EXPORT_SYMBOL_GPL(mark_tsc_unstable);
 
 static int __init dmi_mark_tsc_unstable(struct dmi_system_id *d)
 {
        printk(KERN_NOTICE "%s detected: marking TSC unstable.\n",
                       d->ident);
-       mark_tsc_unstable();
+       tsc_unstable = 1;
        return 0;
 }
 
@@ -386,65 +344,44 @@ static struct dmi_system_id __initdata bad_tsc_dmi_table[] = {
         {}
 };
 
-#define TSC_FREQ_CHECK_INTERVAL (10*MSEC_PER_SEC) /* 10sec in MS */
-static struct timer_list verify_tsc_freq_timer;
-
-/* XXX - Probably should add locking */
-static void verify_tsc_freq(unsigned long unused)
-{
-       static u64 last_tsc;
-       static unsigned long last_jiffies;
-
-       u64 now_tsc, interval_tsc;
-       unsigned long now_jiffies, interval_jiffies;
-
-
-       if (check_tsc_unstable())
-               return;
-
-       rdtscll(now_tsc);
-       now_jiffies = jiffies;
-
-       if (!last_jiffies) {
-               goto out;
-       }
-
-       interval_jiffies = now_jiffies - last_jiffies;
-       interval_tsc = now_tsc - last_tsc;
-       interval_tsc *= HZ;
-       do_div(interval_tsc, cpu_khz*1000);
-
-       if (interval_tsc < (interval_jiffies * 3 / 4)) {
-               printk("TSC appears to be running slowly. "
-                       "Marking it as unstable\n");
-               mark_tsc_unstable();
-               return;
-       }
-
-out:
-       last_tsc = now_tsc;
-       last_jiffies = now_jiffies;
-       /* set us up to go off on the next interval: */
-       mod_timer(&verify_tsc_freq_timer,
-               jiffies + msecs_to_jiffies(TSC_FREQ_CHECK_INTERVAL));
-}
-
 /*
  * Make an educated guess if the TSC is trustworthy and synchronized
  * over all CPUs.
  */
-static __init int unsynchronized_tsc(void)
+__cpuinit int unsynchronized_tsc(void)
 {
+       if (!cpu_has_tsc || tsc_unstable)
+               return 1;
        /*
         * Intel systems are normally all synchronized.
         * Exceptions must mark TSC as unstable:
         */
-       if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
-               return 0;
+       if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL) {
+               /* assume multi socket systems are not synchronized: */
+               if (num_possible_cpus() > 1)
+                       tsc_unstable = 1;
+       }
+       return tsc_unstable;
+}
+
+/*
+ * Geode_LX - the OLPC CPU has a possibly a very reliable TSC
+ */
+#ifdef CONFIG_MGEODE_LX
+/* RTSC counts during suspend */
+#define RTSC_SUSP 0x100
+
+static void __init check_geode_tsc_reliable(void)
+{
+       unsigned long val;
 
-       /* assume multi socket systems are not synchronized: */
-       return num_possible_cpus() > 1;
+       rdmsrl(MSR_GEODE_BUSCONT_CONF0, val);
+       if ((val & RTSC_SUSP))
+               clocksource_tsc.flags &= ~CLOCK_SOURCE_MUST_VERIFY;
 }
+#else
+static inline void check_geode_tsc_reliable(void) { }
+#endif
 
 static int __init init_tsc_clocksource(void)
 {
@@ -453,20 +390,16 @@ static int __init init_tsc_clocksource(void)
                /* check blacklist */
                dmi_check_system(bad_tsc_dmi_table);
 
-               if (unsynchronized_tsc()) /* mark unstable if unsynced */
-                       mark_tsc_unstable();
+               unsynchronized_tsc();
+               check_geode_tsc_reliable();
                current_tsc_khz = tsc_khz;
                clocksource_tsc.mult = clocksource_khz2mult(current_tsc_khz,
                                                        clocksource_tsc.shift);
                /* lower the rating if we already know its unstable: */
-               if (check_tsc_unstable())
+               if (check_tsc_unstable()) {
                        clocksource_tsc.rating = 0;
-
-               init_timer(&verify_tsc_freq_timer);
-               verify_tsc_freq_timer.function = verify_tsc_freq;
-               verify_tsc_freq_timer.expires =
-                       jiffies + msecs_to_jiffies(TSC_FREQ_CHECK_INTERVAL);
-               add_timer(&verify_tsc_freq_timer);
+                       clocksource_tsc.flags &= ~CLOCK_SOURCE_IS_CONTINUOUS;
+               }
 
                return clocksource_register(&clocksource_tsc);
        }
diff --git a/arch/i386/kernel/tsc_sync.c b/arch/i386/kernel/tsc_sync.c
new file mode 100644 (file)
index 0000000..1242462
--- /dev/null
@@ -0,0 +1 @@
+#include "../../x86_64/kernel/tsc_sync.c"
index be2f96e67f78d80c51ba6c1b9a5fde49563ff415..d1b8f2b7aea616c1902bfe616071f586c76f5bbd 100644 (file)
@@ -96,12 +96,12 @@ static int copy_vm86_regs_to_user(struct vm86_regs __user *user,
 {
        int ret = 0;
 
-       /* kernel_vm86_regs is missing xfs, so copy everything up to
-          (but not including) xgs, and then rest after xgs. */
-       ret += copy_to_user(user, regs, offsetof(struct kernel_vm86_regs, pt.xgs));
-       ret += copy_to_user(&user->__null_gs, &regs->pt.xgs,
+       /* kernel_vm86_regs is missing xgs, so copy everything up to
+          (but not including) orig_eax, and then rest including orig_eax. */
+       ret += copy_to_user(user, regs, offsetof(struct kernel_vm86_regs, pt.orig_eax));
+       ret += copy_to_user(&user->orig_eax, &regs->pt.orig_eax,
                            sizeof(struct kernel_vm86_regs) -
-                           offsetof(struct kernel_vm86_regs, pt.xgs));
+                           offsetof(struct kernel_vm86_regs, pt.orig_eax));
 
        return ret;
 }
@@ -113,12 +113,13 @@ static int copy_vm86_regs_from_user(struct kernel_vm86_regs *regs,
 {
        int ret = 0;
 
-       ret += copy_from_user(regs, user, offsetof(struct kernel_vm86_regs, pt.xgs));
-       ret += copy_from_user(&regs->pt.xgs, &user->__null_gs,
+       /* copy eax-xfs inclusive */
+       ret += copy_from_user(regs, user, offsetof(struct kernel_vm86_regs, pt.orig_eax));
+       /* copy orig_eax-__gsh+extra */
+       ret += copy_from_user(&regs->pt.orig_eax, &user->orig_eax,
                              sizeof(struct kernel_vm86_regs) -
-                             offsetof(struct kernel_vm86_regs, pt.xgs) +
+                             offsetof(struct kernel_vm86_regs, pt.orig_eax) +
                              extra);
-
        return ret;
 }
 
@@ -157,8 +158,8 @@ struct pt_regs * fastcall save_v86_state(struct kernel_vm86_regs * regs)
 
        ret = KVM86->regs32;
 
-       loadsegment(fs, current->thread.saved_fs);
-       ret->xgs = current->thread.saved_gs;
+       ret->xfs = current->thread.saved_fs;
+       loadsegment(gs, current->thread.saved_gs);
 
        return ret;
 }
@@ -285,9 +286,9 @@ static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk
  */
        info->regs.pt.xds = 0;
        info->regs.pt.xes = 0;
-       info->regs.pt.xgs = 0;
+       info->regs.pt.xfs = 0;
 
-/* we are clearing fs later just before "jmp resume_userspace",
+/* we are clearing gs later just before "jmp resume_userspace",
  * because it is not saved/restored.
  */
 
@@ -321,8 +322,8 @@ static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk
  */
        info->regs32->eax = 0;
        tsk->thread.saved_esp0 = tsk->thread.esp0;
-       savesegment(fs, tsk->thread.saved_fs);
-       tsk->thread.saved_gs = info->regs32->xgs;
+       tsk->thread.saved_fs = info->regs32->xfs;
+       savesegment(gs, tsk->thread.saved_gs);
 
        tss = &per_cpu(init_tss, get_cpu());
        tsk->thread.esp0 = (unsigned long) &info->VM86_TSS_ESP0;
@@ -342,7 +343,7 @@ static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk
        __asm__ __volatile__(
                "movl %0,%%esp\n\t"
                "movl %1,%%ebp\n\t"
-               "mov  %2, %%fs\n\t"
+               "mov  %2, %%gs\n\t"
                "jmp resume_userspace"
                : /* no outputs */
                :"r" (&info->regs), "r" (task_thread_info(tsk)), "r" (0));
diff --git a/arch/i386/kernel/vmi.c b/arch/i386/kernel/vmi.c
new file mode 100644 (file)
index 0000000..bb5a7ab
--- /dev/null
@@ -0,0 +1,949 @@
+/*
+ * VMI specific paravirt-ops implementation
+ *
+ * Copyright (C) 2005, VMware, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 zach@vmware.com
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/license.h>
+#include <linux/cpu.h>
+#include <linux/bootmem.h>
+#include <linux/mm.h>
+#include <asm/vmi.h>
+#include <asm/io.h>
+#include <asm/fixmap.h>
+#include <asm/apicdef.h>
+#include <asm/apic.h>
+#include <asm/processor.h>
+#include <asm/timer.h>
+#include <asm/vmi_time.h>
+
+/* Convenient for calling VMI functions indirectly in the ROM */
+typedef u32 __attribute__((regparm(1))) (VROMFUNC)(void);
+typedef u64 __attribute__((regparm(2))) (VROMLONGFUNC)(int);
+
+#define call_vrom_func(rom,func) \
+   (((VROMFUNC *)(rom->func))())
+
+#define call_vrom_long_func(rom,func,arg) \
+   (((VROMLONGFUNC *)(rom->func)) (arg))
+
+static struct vrom_header *vmi_rom;
+static int license_gplok;
+static int disable_nodelay;
+static int disable_pge;
+static int disable_pse;
+static int disable_sep;
+static int disable_tsc;
+static int disable_mtrr;
+
+/* Cached VMI operations */
+struct {
+       void (*cpuid)(void /* non-c */);
+       void (*_set_ldt)(u32 selector);
+       void (*set_tr)(u32 selector);
+       void (*set_kernel_stack)(u32 selector, u32 esp0);
+       void (*allocate_page)(u32, u32, u32, u32, u32);
+       void (*release_page)(u32, u32);
+       void (*set_pte)(pte_t, pte_t *, unsigned);
+       void (*update_pte)(pte_t *, unsigned);
+       void (*set_linear_mapping)(int, u32, u32, u32);
+       void (*flush_tlb)(int);
+       void (*set_initial_ap_state)(int, int);
+       void (*halt)(void);
+} vmi_ops;
+
+/* XXX move this to alternative.h */
+extern struct paravirt_patch __start_parainstructions[],
+       __stop_parainstructions[];
+
+/*
+ * VMI patching routines.
+ */
+#define MNEM_CALL 0xe8
+#define MNEM_JMP  0xe9
+#define MNEM_RET  0xc3
+
+static char irq_save_disable_callout[] = {
+       MNEM_CALL, 0, 0, 0, 0,
+       MNEM_CALL, 0, 0, 0, 0,
+       MNEM_RET
+};
+#define IRQ_PATCH_INT_MASK 0
+#define IRQ_PATCH_DISABLE  5
+
+static inline void patch_offset(unsigned char *eip, unsigned char *dest)
+{
+        *(unsigned long *)(eip+1) = dest-eip-5;
+}
+
+static unsigned patch_internal(int call, unsigned len, void *insns)
+{
+       u64 reloc;
+       struct vmi_relocation_info *const rel = (struct vmi_relocation_info *)&reloc;
+       reloc = call_vrom_long_func(vmi_rom, get_reloc, call);
+       switch(rel->type) {
+               case VMI_RELOCATION_CALL_REL:
+                       BUG_ON(len < 5);
+                       *(char *)insns = MNEM_CALL;
+                       patch_offset(insns, rel->eip);
+                       return 5;
+
+               case VMI_RELOCATION_JUMP_REL:
+                       BUG_ON(len < 5);
+                       *(char *)insns = MNEM_JMP;
+                       patch_offset(insns, rel->eip);
+                       return 5;
+
+               case VMI_RELOCATION_NOP:
+                       /* obliterate the whole thing */
+                       return 0;
+
+               case VMI_RELOCATION_NONE:
+                       /* leave native code in place */
+                       break;
+
+               default:
+                       BUG();
+       }
+       return len;
+}
+
+/*
+ * Apply patch if appropriate, return length of new instruction
+ * sequence.  The callee does nop padding for us.
+ */
+static unsigned vmi_patch(u8 type, u16 clobbers, void *insns, unsigned len)
+{
+       switch (type) {
+               case PARAVIRT_IRQ_DISABLE:
+                       return patch_internal(VMI_CALL_DisableInterrupts, len, insns);
+               case PARAVIRT_IRQ_ENABLE:
+                       return patch_internal(VMI_CALL_EnableInterrupts, len, insns);
+               case PARAVIRT_RESTORE_FLAGS:
+                       return patch_internal(VMI_CALL_SetInterruptMask, len, insns);
+               case PARAVIRT_SAVE_FLAGS:
+                       return patch_internal(VMI_CALL_GetInterruptMask, len, insns);
+               case PARAVIRT_SAVE_FLAGS_IRQ_DISABLE:
+                       if (len >= 10) {
+                               patch_internal(VMI_CALL_GetInterruptMask, len, insns);
+                               patch_internal(VMI_CALL_DisableInterrupts, len-5, insns+5);
+                               return 10;
+                       } else {
+                               /*
+                                * You bastards didn't leave enough room to
+                                * patch save_flags_irq_disable inline.  Patch
+                                * to a helper
+                                */
+                               BUG_ON(len < 5);
+                               *(char *)insns = MNEM_CALL;
+                               patch_offset(insns, irq_save_disable_callout);
+                               return 5;
+                       }
+               case PARAVIRT_INTERRUPT_RETURN:
+                       return patch_internal(VMI_CALL_IRET, len, insns);
+               case PARAVIRT_STI_SYSEXIT:
+                       return patch_internal(VMI_CALL_SYSEXIT, len, insns);
+               default:
+                       break;
+       }
+       return len;
+}
+
+/* CPUID has non-C semantics, and paravirt-ops API doesn't match hardware ISA */
+static void vmi_cpuid(unsigned int *eax, unsigned int *ebx,
+                               unsigned int *ecx, unsigned int *edx)
+{
+       int override = 0;
+       if (*eax == 1)
+               override = 1;
+        asm volatile ("call *%6"
+                      : "=a" (*eax),
+                        "=b" (*ebx),
+                        "=c" (*ecx),
+                        "=d" (*edx)
+                      : "0" (*eax), "2" (*ecx), "r" (vmi_ops.cpuid));
+       if (override) {
+               if (disable_pse)
+                       *edx &= ~X86_FEATURE_PSE;
+               if (disable_pge)
+                       *edx &= ~X86_FEATURE_PGE;
+               if (disable_sep)
+                       *edx &= ~X86_FEATURE_SEP;
+               if (disable_tsc)
+                       *edx &= ~X86_FEATURE_TSC;
+               if (disable_mtrr)
+                       *edx &= ~X86_FEATURE_MTRR;
+       }
+}
+
+static inline void vmi_maybe_load_tls(struct desc_struct *gdt, int nr, struct desc_struct *new)
+{
+       if (gdt[nr].a != new->a || gdt[nr].b != new->b)
+               write_gdt_entry(gdt, nr, new->a, new->b);
+}
+
+static void vmi_load_tls(struct thread_struct *t, unsigned int cpu)
+{
+       struct desc_struct *gdt = get_cpu_gdt_table(cpu);
+       vmi_maybe_load_tls(gdt, GDT_ENTRY_TLS_MIN + 0, &t->tls_array[0]);
+       vmi_maybe_load_tls(gdt, GDT_ENTRY_TLS_MIN + 1, &t->tls_array[1]);
+       vmi_maybe_load_tls(gdt, GDT_ENTRY_TLS_MIN + 2, &t->tls_array[2]);
+}
+
+static void vmi_set_ldt(const void *addr, unsigned entries)
+{
+       unsigned cpu = smp_processor_id();
+       u32 low, high;
+
+       pack_descriptor(&low, &high, (unsigned long)addr,
+                       entries * sizeof(struct desc_struct) - 1,
+                       DESCTYPE_LDT, 0);
+       write_gdt_entry(get_cpu_gdt_table(cpu), GDT_ENTRY_LDT, low, high);
+       vmi_ops._set_ldt(entries ? GDT_ENTRY_LDT*sizeof(struct desc_struct) : 0);
+}
+
+static void vmi_set_tr(void)
+{
+       vmi_ops.set_tr(GDT_ENTRY_TSS*sizeof(struct desc_struct));
+}
+
+static void vmi_load_esp0(struct tss_struct *tss,
+                                  struct thread_struct *thread)
+{
+       tss->esp0 = thread->esp0;
+
+       /* This can only happen when SEP is enabled, no need to test "SEP"arately */
+       if (unlikely(tss->ss1 != thread->sysenter_cs)) {
+               tss->ss1 = thread->sysenter_cs;
+               wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0);
+       }
+       vmi_ops.set_kernel_stack(__KERNEL_DS, tss->esp0);
+}
+
+static void vmi_flush_tlb_user(void)
+{
+       vmi_ops.flush_tlb(VMI_FLUSH_TLB);
+}
+
+static void vmi_flush_tlb_kernel(void)
+{
+       vmi_ops.flush_tlb(VMI_FLUSH_TLB | VMI_FLUSH_GLOBAL);
+}
+
+/* Stub to do nothing at all; used for delays and unimplemented calls */
+static void vmi_nop(void)
+{
+}
+
+/* For NO_IDLE_HZ, we stop the clock when halting the kernel */
+#ifdef CONFIG_NO_IDLE_HZ
+static fastcall void vmi_safe_halt(void)
+{
+       int idle = vmi_stop_hz_timer();
+       vmi_ops.halt();
+       if (idle) {
+               local_irq_disable();
+               vmi_account_time_restart_hz_timer();
+               local_irq_enable();
+       }
+}
+#endif
+
+#ifdef CONFIG_DEBUG_PAGE_TYPE
+
+#ifdef CONFIG_X86_PAE
+#define MAX_BOOT_PTS (2048+4+1)
+#else
+#define MAX_BOOT_PTS (1024+1)
+#endif
+
+/*
+ * During boot, mem_map is not yet available in paging_init, so stash
+ * all the boot page allocations here.
+ */
+static struct {
+       u32 pfn;
+       int type;
+} boot_page_allocations[MAX_BOOT_PTS];
+static int num_boot_page_allocations;
+static int boot_allocations_applied;
+
+void vmi_apply_boot_page_allocations(void)
+{
+       int i;
+       BUG_ON(!mem_map);
+       for (i = 0; i < num_boot_page_allocations; i++) {
+               struct page *page = pfn_to_page(boot_page_allocations[i].pfn);
+               page->type = boot_page_allocations[i].type;
+               page->type = boot_page_allocations[i].type &
+                               ~(VMI_PAGE_ZEROED | VMI_PAGE_CLONE);
+       }
+       boot_allocations_applied = 1;
+}
+
+static void record_page_type(u32 pfn, int type)
+{
+       BUG_ON(num_boot_page_allocations >= MAX_BOOT_PTS);
+       boot_page_allocations[num_boot_page_allocations].pfn = pfn;
+       boot_page_allocations[num_boot_page_allocations].type = type;
+       num_boot_page_allocations++;
+}
+
+static void check_zeroed_page(u32 pfn, int type, struct page *page)
+{
+       u32 *ptr;
+       int i;
+       int limit = PAGE_SIZE / sizeof(int);
+
+       if (page_address(page))
+               ptr = (u32 *)page_address(page);
+       else
+               ptr = (u32 *)__va(pfn << PAGE_SHIFT);
+       /*
+        * When cloning the root in non-PAE mode, only the userspace
+        * pdes need to be zeroed.
+        */
+       if (type & VMI_PAGE_CLONE)
+               limit = USER_PTRS_PER_PGD;
+       for (i = 0; i < limit; i++)
+               BUG_ON(ptr[i]);
+}
+
+/*
+ * We stash the page type into struct page so we can verify the page
+ * types are used properly.
+ */
+static void vmi_set_page_type(u32 pfn, int type)
+{
+       /* PAE can have multiple roots per page - don't track */
+       if (PTRS_PER_PMD > 1 && (type & VMI_PAGE_PDP))
+               return;
+
+       if (boot_allocations_applied) {
+               struct page *page = pfn_to_page(pfn);
+               if (type != VMI_PAGE_NORMAL)
+                       BUG_ON(page->type);
+               else
+                       BUG_ON(page->type == VMI_PAGE_NORMAL);
+               page->type = type & ~(VMI_PAGE_ZEROED | VMI_PAGE_CLONE);
+               if (type & VMI_PAGE_ZEROED)
+                       check_zeroed_page(pfn, type, page);
+       } else {
+               record_page_type(pfn, type);
+       }
+}
+
+static void vmi_check_page_type(u32 pfn, int type)
+{
+       /* PAE can have multiple roots per page - skip checks */
+       if (PTRS_PER_PMD > 1 && (type & VMI_PAGE_PDP))
+               return;
+
+       type &= ~(VMI_PAGE_ZEROED | VMI_PAGE_CLONE);
+       if (boot_allocations_applied) {
+               struct page *page = pfn_to_page(pfn);
+               BUG_ON((page->type ^ type) & VMI_PAGE_PAE);
+               BUG_ON(type == VMI_PAGE_NORMAL && page->type);
+               BUG_ON((type & page->type) == 0);
+       }
+}
+#else
+#define vmi_set_page_type(p,t) do { } while (0)
+#define vmi_check_page_type(p,t) do { } while (0)
+#endif
+
+static void vmi_allocate_pt(u32 pfn)
+{
+       vmi_set_page_type(pfn, VMI_PAGE_L1);
+       vmi_ops.allocate_page(pfn, VMI_PAGE_L1, 0, 0, 0);
+}
+
+static void vmi_allocate_pd(u32 pfn)
+{
+       /*
+        * This call comes in very early, before mem_map is setup.
+        * It is called only for swapper_pg_dir, which already has
+        * data on it.
+        */
+       vmi_set_page_type(pfn, VMI_PAGE_L2);
+       vmi_ops.allocate_page(pfn, VMI_PAGE_L2, 0, 0, 0);
+}
+
+static void vmi_allocate_pd_clone(u32 pfn, u32 clonepfn, u32 start, u32 count)
+{
+       vmi_set_page_type(pfn, VMI_PAGE_L2 | VMI_PAGE_CLONE);
+       vmi_check_page_type(clonepfn, VMI_PAGE_L2);
+       vmi_ops.allocate_page(pfn, VMI_PAGE_L2 | VMI_PAGE_CLONE, clonepfn, start, count);
+}
+
+static void vmi_release_pt(u32 pfn)
+{
+       vmi_ops.release_page(pfn, VMI_PAGE_L1);
+       vmi_set_page_type(pfn, VMI_PAGE_NORMAL);
+}
+
+static void vmi_release_pd(u32 pfn)
+{
+       vmi_ops.release_page(pfn, VMI_PAGE_L2);
+       vmi_set_page_type(pfn, VMI_PAGE_NORMAL);
+}
+
+/*
+ * Helper macros for MMU update flags.  We can defer updates until a flush
+ * or page invalidation only if the update is to the current address space
+ * (otherwise, there is no flush).  We must check against init_mm, since
+ * this could be a kernel update, which usually passes init_mm, although
+ * sometimes this check can be skipped if we know the particular function
+ * is only called on user mode PTEs.  We could change the kernel to pass
+ * current->active_mm here, but in particular, I was unsure if changing
+ * mm/highmem.c to do this would still be correct on other architectures.
+ */
+#define is_current_as(mm, mustbeuser) ((mm) == current->active_mm ||    \
+                                       (!mustbeuser && (mm) == &init_mm))
+#define vmi_flags_addr(mm, addr, level, user)                           \
+        ((level) | (is_current_as(mm, user) ?                           \
+                (VMI_PAGE_CURRENT_AS | ((addr) & VMI_PAGE_VA_MASK)) : 0))
+#define vmi_flags_addr_defer(mm, addr, level, user)                     \
+        ((level) | (is_current_as(mm, user) ?                           \
+                (VMI_PAGE_DEFER | VMI_PAGE_CURRENT_AS | ((addr) & VMI_PAGE_VA_MASK)) : 0))
+
+static void vmi_update_pte(struct mm_struct *mm, u32 addr, pte_t *ptep)
+{
+       vmi_check_page_type(__pa(ptep) >> PAGE_SHIFT, VMI_PAGE_PTE);
+       vmi_ops.update_pte(ptep, vmi_flags_addr(mm, addr, VMI_PAGE_PT, 0));
+}
+
+static void vmi_update_pte_defer(struct mm_struct *mm, u32 addr, pte_t *ptep)
+{
+       vmi_check_page_type(__pa(ptep) >> PAGE_SHIFT, VMI_PAGE_PTE);
+       vmi_ops.update_pte(ptep, vmi_flags_addr_defer(mm, addr, VMI_PAGE_PT, 0));
+}
+
+static void vmi_set_pte(pte_t *ptep, pte_t pte)
+{
+       /* XXX because of set_pmd_pte, this can be called on PT or PD layers */
+       vmi_check_page_type(__pa(ptep) >> PAGE_SHIFT, VMI_PAGE_PTE | VMI_PAGE_PD);
+       vmi_ops.set_pte(pte, ptep, VMI_PAGE_PT);
+}
+
+static void vmi_set_pte_at(struct mm_struct *mm, u32 addr, pte_t *ptep, pte_t pte)
+{
+       vmi_check_page_type(__pa(ptep) >> PAGE_SHIFT, VMI_PAGE_PTE);
+       vmi_ops.set_pte(pte, ptep, vmi_flags_addr(mm, addr, VMI_PAGE_PT, 0));
+}
+
+static void vmi_set_pmd(pmd_t *pmdp, pmd_t pmdval)
+{
+#ifdef CONFIG_X86_PAE
+       const pte_t pte = { pmdval.pmd, pmdval.pmd >> 32 };
+       vmi_check_page_type(__pa(pmdp) >> PAGE_SHIFT, VMI_PAGE_PMD);
+#else
+       const pte_t pte = { pmdval.pud.pgd.pgd };
+       vmi_check_page_type(__pa(pmdp) >> PAGE_SHIFT, VMI_PAGE_PGD);
+#endif
+       vmi_ops.set_pte(pte, (pte_t *)pmdp, VMI_PAGE_PD);
+}
+
+#ifdef CONFIG_X86_PAE
+
+static void vmi_set_pte_atomic(pte_t *ptep, pte_t pteval)
+{
+       /*
+        * XXX This is called from set_pmd_pte, but at both PT
+        * and PD layers so the VMI_PAGE_PT flag is wrong.  But
+        * it is only called for large page mapping changes,
+        * the Xen backend, doesn't support large pages, and the
+        * ESX backend doesn't depend on the flag.
+        */
+       set_64bit((unsigned long long *)ptep,pte_val(pteval));
+       vmi_ops.update_pte(ptep, VMI_PAGE_PT);
+}
+
+static void vmi_set_pte_present(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte)
+{
+       vmi_check_page_type(__pa(ptep) >> PAGE_SHIFT, VMI_PAGE_PTE);
+       vmi_ops.set_pte(pte, ptep, vmi_flags_addr_defer(mm, addr, VMI_PAGE_PT, 1));
+}
+
+static void vmi_set_pud(pud_t *pudp, pud_t pudval)
+{
+       /* Um, eww */
+       const pte_t pte = { pudval.pgd.pgd, pudval.pgd.pgd >> 32 };
+       vmi_check_page_type(__pa(pudp) >> PAGE_SHIFT, VMI_PAGE_PGD);
+       vmi_ops.set_pte(pte, (pte_t *)pudp, VMI_PAGE_PDP);
+}
+
+static void vmi_pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
+{
+       const pte_t pte = { 0 };
+       vmi_check_page_type(__pa(ptep) >> PAGE_SHIFT, VMI_PAGE_PTE);
+       vmi_ops.set_pte(pte, ptep, vmi_flags_addr(mm, addr, VMI_PAGE_PT, 0));
+}
+
+void vmi_pmd_clear(pmd_t *pmd)
+{
+       const pte_t pte = { 0 };
+       vmi_check_page_type(__pa(pmd) >> PAGE_SHIFT, VMI_PAGE_PMD);
+       vmi_ops.set_pte(pte, (pte_t *)pmd, VMI_PAGE_PD);
+}
+#endif
+
+#ifdef CONFIG_SMP
+struct vmi_ap_state ap;
+extern void setup_pda(void);
+
+static void __init /* XXX cpu hotplug */
+vmi_startup_ipi_hook(int phys_apicid, unsigned long start_eip,
+                    unsigned long start_esp)
+{
+       /* Default everything to zero.  This is fine for most GPRs. */
+       memset(&ap, 0, sizeof(struct vmi_ap_state));
+
+       ap.gdtr_limit = GDT_SIZE - 1;
+       ap.gdtr_base = (unsigned long) get_cpu_gdt_table(phys_apicid);
+
+       ap.idtr_limit = IDT_ENTRIES * 8 - 1;
+       ap.idtr_base = (unsigned long) idt_table;
+
+       ap.ldtr = 0;
+
+       ap.cs = __KERNEL_CS;
+       ap.eip = (unsigned long) start_eip;
+       ap.ss = __KERNEL_DS;
+       ap.esp = (unsigned long) start_esp;
+
+       ap.ds = __USER_DS;
+       ap.es = __USER_DS;
+       ap.fs = __KERNEL_PDA;
+       ap.gs = 0;
+
+       ap.eflags = 0;
+
+       setup_pda();
+
+#ifdef CONFIG_X86_PAE
+       /* efer should match BSP efer. */
+       if (cpu_has_nx) {
+               unsigned l, h;
+               rdmsr(MSR_EFER, l, h);
+               ap.efer = (unsigned long long) h << 32 | l;
+       }
+#endif
+
+       ap.cr3 = __pa(swapper_pg_dir);
+       /* Protected mode, paging, AM, WP, NE, MP. */
+       ap.cr0 = 0x80050023;
+       ap.cr4 = mmu_cr4_features;
+       vmi_ops.set_initial_ap_state(__pa(&ap), phys_apicid);
+}
+#endif
+
+static inline int __init check_vmi_rom(struct vrom_header *rom)
+{
+       struct pci_header *pci;
+       struct pnp_header *pnp;
+       const char *manufacturer = "UNKNOWN";
+       const char *product = "UNKNOWN";
+       const char *license = "unspecified";
+
+       if (rom->rom_signature != 0xaa55)
+               return 0;
+       if (rom->vrom_signature != VMI_SIGNATURE)
+               return 0;
+       if (rom->api_version_maj != VMI_API_REV_MAJOR ||
+           rom->api_version_min+1 < VMI_API_REV_MINOR+1) {
+               printk(KERN_WARNING "VMI: Found mismatched rom version %d.%d\n",
+                               rom->api_version_maj,
+                               rom->api_version_min);
+               return 0;
+       }
+
+       /*
+        * Relying on the VMI_SIGNATURE field is not 100% safe, so check
+        * the PCI header and device type to make sure this is really a
+        * VMI device.
+        */
+       if (!rom->pci_header_offs) {
+               printk(KERN_WARNING "VMI: ROM does not contain PCI header.\n");
+               return 0;
+       }
+
+       pci = (struct pci_header *)((char *)rom+rom->pci_header_offs);
+       if (pci->vendorID != PCI_VENDOR_ID_VMWARE ||
+           pci->deviceID != PCI_DEVICE_ID_VMWARE_VMI) {
+               /* Allow it to run... anyways, but warn */
+               printk(KERN_WARNING "VMI: ROM from unknown manufacturer\n");
+       }
+
+       if (rom->pnp_header_offs) {
+               pnp = (struct pnp_header *)((char *)rom+rom->pnp_header_offs);
+               if (pnp->manufacturer_offset)
+                       manufacturer = (const char *)rom+pnp->manufacturer_offset;
+               if (pnp->product_offset)
+                       product = (const char *)rom+pnp->product_offset;
+       }
+
+       if (rom->license_offs)
+               license = (char *)rom+rom->license_offs;
+
+       printk(KERN_INFO "VMI: Found %s %s, API version %d.%d, ROM version %d.%d\n",
+               manufacturer, product,
+               rom->api_version_maj, rom->api_version_min,
+               pci->rom_version_maj, pci->rom_version_min);
+
+        license_gplok = license_is_gpl_compatible(license);
+        if (!license_gplok) {
+                printk(KERN_WARNING "VMI: ROM license '%s' taints kernel... "
+                      "inlining disabled\n",
+                       license);
+                add_taint(TAINT_PROPRIETARY_MODULE);
+        }
+       return 1;
+}
+
+/*
+ * Probe for the VMI option ROM
+ */
+static inline int __init probe_vmi_rom(void)
+{
+       unsigned long base;
+
+       /* VMI ROM is in option ROM area, check signature */
+       for (base = 0xC0000; base < 0xE0000; base += 2048) {
+               struct vrom_header *romstart;
+               romstart = (struct vrom_header *)isa_bus_to_virt(base);
+               if (check_vmi_rom(romstart)) {
+                       vmi_rom = romstart;
+                       return 1;
+               }
+       }
+       return 0;
+}
+
+/*
+ * VMI setup common to all processors
+ */
+void vmi_bringup(void)
+{
+       /* We must establish the lowmem mapping for MMU ops to work */
+       if (vmi_rom)
+               vmi_ops.set_linear_mapping(0, __PAGE_OFFSET, max_low_pfn, 0);
+}
+
+/*
+ * Return a pointer to the VMI function or a NOP stub
+ */
+static void *vmi_get_function(int vmicall)
+{
+       u64 reloc;
+       const struct vmi_relocation_info *rel = (struct vmi_relocation_info *)&reloc;
+       reloc = call_vrom_long_func(vmi_rom, get_reloc, vmicall);
+       BUG_ON(rel->type == VMI_RELOCATION_JUMP_REL);
+       if (rel->type == VMI_RELOCATION_CALL_REL)
+               return (void *)rel->eip;
+       else
+               return (void *)vmi_nop;
+}
+
+/*
+ * Helper macro for making the VMI paravirt-ops fill code readable.
+ * For unimplemented operations, fall back to default.
+ */
+#define para_fill(opname, vmicall)                             \
+do {                                                           \
+       reloc = call_vrom_long_func(vmi_rom, get_reloc,         \
+                                   VMI_CALL_##vmicall);        \
+       if (rel->type != VMI_RELOCATION_NONE) {                 \
+               BUG_ON(rel->type != VMI_RELOCATION_CALL_REL);   \
+               paravirt_ops.opname = (void *)rel->eip;         \
+       }                                                       \
+} while (0)
+
+/*
+ * Activate the VMI interface and switch into paravirtualized mode
+ */
+static inline int __init activate_vmi(void)
+{
+       short kernel_cs;
+       u64 reloc;
+       const struct vmi_relocation_info *rel = (struct vmi_relocation_info *)&reloc;
+
+       if (call_vrom_func(vmi_rom, vmi_init) != 0) {
+               printk(KERN_ERR "VMI ROM failed to initialize!");
+               return 0;
+       }
+       savesegment(cs, kernel_cs);
+
+       paravirt_ops.paravirt_enabled = 1;
+       paravirt_ops.kernel_rpl = kernel_cs & SEGMENT_RPL_MASK;
+
+       paravirt_ops.patch = vmi_patch;
+       paravirt_ops.name = "vmi";
+
+       /*
+        * Many of these operations are ABI compatible with VMI.
+        * This means we can fill in the paravirt-ops with direct
+        * pointers into the VMI ROM.  If the calling convention for
+        * these operations changes, this code needs to be updated.
+        *
+        * Exceptions
+        *  CPUID paravirt-op uses pointers, not the native ISA
+        *  halt has no VMI equivalent; all VMI halts are "safe"
+        *  no MSR support yet - just trap and emulate.  VMI uses the
+        *    same ABI as the native ISA, but Linux wants exceptions
+        *    from bogus MSR read / write handled
+        *  rdpmc is not yet used in Linux
+        */
+
+       /* CPUID is special, so very special */
+       reloc = call_vrom_long_func(vmi_rom, get_reloc, VMI_CALL_CPUID);
+       if (rel->type != VMI_RELOCATION_NONE) {
+               BUG_ON(rel->type != VMI_RELOCATION_CALL_REL);
+               vmi_ops.cpuid = (void *)rel->eip;
+               paravirt_ops.cpuid = vmi_cpuid;
+       }
+
+       para_fill(clts, CLTS);
+       para_fill(get_debugreg, GetDR);
+       para_fill(set_debugreg, SetDR);
+       para_fill(read_cr0, GetCR0);
+       para_fill(read_cr2, GetCR2);
+       para_fill(read_cr3, GetCR3);
+       para_fill(read_cr4, GetCR4);
+       para_fill(write_cr0, SetCR0);
+       para_fill(write_cr2, SetCR2);
+       para_fill(write_cr3, SetCR3);
+       para_fill(write_cr4, SetCR4);
+       para_fill(save_fl, GetInterruptMask);
+       para_fill(restore_fl, SetInterruptMask);
+       para_fill(irq_disable, DisableInterrupts);
+       para_fill(irq_enable, EnableInterrupts);
+       /* irq_save_disable !!! sheer pain */
+       patch_offset(&irq_save_disable_callout[IRQ_PATCH_INT_MASK],
+                    (char *)paravirt_ops.save_fl);
+       patch_offset(&irq_save_disable_callout[IRQ_PATCH_DISABLE],
+                    (char *)paravirt_ops.irq_disable);
+#ifndef CONFIG_NO_IDLE_HZ
+       para_fill(safe_halt, Halt);
+#else
+       vmi_ops.halt = vmi_get_function(VMI_CALL_Halt);
+       paravirt_ops.safe_halt = vmi_safe_halt;
+#endif
+       para_fill(wbinvd, WBINVD);
+       /* paravirt_ops.read_msr = vmi_rdmsr */
+       /* paravirt_ops.write_msr = vmi_wrmsr */
+       para_fill(read_tsc, RDTSC);
+       /* paravirt_ops.rdpmc = vmi_rdpmc */
+
+       /* TR interface doesn't pass TR value */
+       reloc = call_vrom_long_func(vmi_rom, get_reloc, VMI_CALL_SetTR);
+       if (rel->type != VMI_RELOCATION_NONE) {
+               BUG_ON(rel->type != VMI_RELOCATION_CALL_REL);
+               vmi_ops.set_tr = (void *)rel->eip;
+               paravirt_ops.load_tr_desc = vmi_set_tr;
+       }
+
+       /* LDT is special, too */
+       reloc = call_vrom_long_func(vmi_rom, get_reloc, VMI_CALL_SetLDT);
+       if (rel->type != VMI_RELOCATION_NONE) {
+               BUG_ON(rel->type != VMI_RELOCATION_CALL_REL);
+               vmi_ops._set_ldt = (void *)rel->eip;
+               paravirt_ops.set_ldt = vmi_set_ldt;
+       }
+
+       para_fill(load_gdt, SetGDT);
+       para_fill(load_idt, SetIDT);
+       para_fill(store_gdt, GetGDT);
+       para_fill(store_idt, GetIDT);
+       para_fill(store_tr, GetTR);
+       paravirt_ops.load_tls = vmi_load_tls;
+       para_fill(write_ldt_entry, WriteLDTEntry);
+       para_fill(write_gdt_entry, WriteGDTEntry);
+       para_fill(write_idt_entry, WriteIDTEntry);
+       reloc = call_vrom_long_func(vmi_rom, get_reloc,
+                                   VMI_CALL_UpdateKernelStack);
+       if (rel->type != VMI_RELOCATION_NONE) {
+               BUG_ON(rel->type != VMI_RELOCATION_CALL_REL);
+               vmi_ops.set_kernel_stack = (void *)rel->eip;
+               paravirt_ops.load_esp0 = vmi_load_esp0;
+       }
+
+       para_fill(set_iopl_mask, SetIOPLMask);
+       paravirt_ops.io_delay = (void *)vmi_nop;
+       if (!disable_nodelay) {
+               paravirt_ops.const_udelay = (void *)vmi_nop;
+       }
+
+       para_fill(set_lazy_mode, SetLazyMode);
+
+       reloc = call_vrom_long_func(vmi_rom, get_reloc, VMI_CALL_FlushTLB);
+       if (rel->type != VMI_RELOCATION_NONE) {
+               vmi_ops.flush_tlb = (void *)rel->eip;
+               paravirt_ops.flush_tlb_user = vmi_flush_tlb_user;
+               paravirt_ops.flush_tlb_kernel = vmi_flush_tlb_kernel;
+       }
+       para_fill(flush_tlb_single, InvalPage);
+
+       /*
+        * Until a standard flag format can be agreed on, we need to
+        * implement these as wrappers in Linux.  Get the VMI ROM
+        * function pointers for the two backend calls.
+        */
+#ifdef CONFIG_X86_PAE
+       vmi_ops.set_pte = vmi_get_function(VMI_CALL_SetPxELong);
+       vmi_ops.update_pte = vmi_get_function(VMI_CALL_UpdatePxELong);
+#else
+       vmi_ops.set_pte = vmi_get_function(VMI_CALL_SetPxE);
+       vmi_ops.update_pte = vmi_get_function(VMI_CALL_UpdatePxE);
+#endif
+       vmi_ops.set_linear_mapping = vmi_get_function(VMI_CALL_SetLinearMapping);
+       vmi_ops.allocate_page = vmi_get_function(VMI_CALL_AllocatePage);
+       vmi_ops.release_page = vmi_get_function(VMI_CALL_ReleasePage);
+
+       paravirt_ops.alloc_pt = vmi_allocate_pt;
+       paravirt_ops.alloc_pd = vmi_allocate_pd;
+       paravirt_ops.alloc_pd_clone = vmi_allocate_pd_clone;
+       paravirt_ops.release_pt = vmi_release_pt;
+       paravirt_ops.release_pd = vmi_release_pd;
+       paravirt_ops.set_pte = vmi_set_pte;
+       paravirt_ops.set_pte_at = vmi_set_pte_at;
+       paravirt_ops.set_pmd = vmi_set_pmd;
+       paravirt_ops.pte_update = vmi_update_pte;
+       paravirt_ops.pte_update_defer = vmi_update_pte_defer;
+#ifdef CONFIG_X86_PAE
+       paravirt_ops.set_pte_atomic = vmi_set_pte_atomic;
+       paravirt_ops.set_pte_present = vmi_set_pte_present;
+       paravirt_ops.set_pud = vmi_set_pud;
+       paravirt_ops.pte_clear = vmi_pte_clear;
+       paravirt_ops.pmd_clear = vmi_pmd_clear;
+#endif
+       /*
+        * These MUST always be patched.  Don't support indirect jumps
+        * through these operations, as the VMI interface may use either
+        * a jump or a call to get to these operations, depending on
+        * the backend.  They are performance critical anyway, so requiring
+        * a patch is not a big problem.
+        */
+       paravirt_ops.irq_enable_sysexit = (void *)0xfeedbab0;
+       paravirt_ops.iret = (void *)0xbadbab0;
+
+#ifdef CONFIG_SMP
+       paravirt_ops.startup_ipi_hook = vmi_startup_ipi_hook;
+       vmi_ops.set_initial_ap_state = vmi_get_function(VMI_CALL_SetInitialAPState);
+#endif
+
+#ifdef CONFIG_X86_LOCAL_APIC
+       paravirt_ops.apic_read = vmi_get_function(VMI_CALL_APICRead);
+       paravirt_ops.apic_write = vmi_get_function(VMI_CALL_APICWrite);
+       paravirt_ops.apic_write_atomic = vmi_get_function(VMI_CALL_APICWrite);
+#endif
+
+       /*
+        * Check for VMI timer functionality by probing for a cycle frequency method
+        */
+       reloc = call_vrom_long_func(vmi_rom, get_reloc, VMI_CALL_GetCycleFrequency);
+       if (rel->type != VMI_RELOCATION_NONE) {
+               vmi_timer_ops.get_cycle_frequency = (void *)rel->eip;
+               vmi_timer_ops.get_cycle_counter =
+                       vmi_get_function(VMI_CALL_GetCycleCounter);
+               vmi_timer_ops.get_wallclock =
+                       vmi_get_function(VMI_CALL_GetWallclockTime);
+               vmi_timer_ops.wallclock_updated =
+                       vmi_get_function(VMI_CALL_WallclockUpdated);
+               vmi_timer_ops.set_alarm = vmi_get_function(VMI_CALL_SetAlarm);
+               vmi_timer_ops.cancel_alarm =
+                        vmi_get_function(VMI_CALL_CancelAlarm);
+               paravirt_ops.time_init = vmi_time_init;
+               paravirt_ops.get_wallclock = vmi_get_wallclock;
+               paravirt_ops.set_wallclock = vmi_set_wallclock;
+#ifdef CONFIG_X86_LOCAL_APIC
+               paravirt_ops.setup_boot_clock = vmi_timer_setup_boot_alarm;
+               paravirt_ops.setup_secondary_clock = vmi_timer_setup_secondary_alarm;
+#endif
+               custom_sched_clock = vmi_sched_clock;
+       }
+
+       /*
+        * Alternative instruction rewriting doesn't happen soon enough
+        * to convert VMI_IRET to a call instead of a jump; so we have
+        * to do this before IRQs get reenabled.  Fortunately, it is
+        * idempotent.
+        */
+       apply_paravirt(__start_parainstructions, __stop_parainstructions);
+
+       vmi_bringup();
+
+       return 1;
+}
+
+#undef para_fill
+
+void __init vmi_init(void)
+{
+       unsigned long flags;
+
+       if (!vmi_rom)
+               probe_vmi_rom();
+       else
+               check_vmi_rom(vmi_rom);
+
+       /* In case probing for or validating the ROM failed, basil */
+       if (!vmi_rom)
+               return;
+
+       reserve_top_address(-vmi_rom->virtual_top);
+
+       local_irq_save(flags);
+       activate_vmi();
+#ifdef CONFIG_SMP
+       no_timer_check = 1;
+#endif
+       local_irq_restore(flags & X86_EFLAGS_IF);
+}
+
+static int __init parse_vmi(char *arg)
+{
+       if (!arg)
+               return -EINVAL;
+
+       if (!strcmp(arg, "disable_nodelay"))
+               disable_nodelay = 1;
+       else if (!strcmp(arg, "disable_pge")) {
+               clear_bit(X86_FEATURE_PGE, boot_cpu_data.x86_capability);
+               disable_pge = 1;
+       } else if (!strcmp(arg, "disable_pse")) {
+               clear_bit(X86_FEATURE_PSE, boot_cpu_data.x86_capability);
+               disable_pse = 1;
+       } else if (!strcmp(arg, "disable_sep")) {
+               clear_bit(X86_FEATURE_SEP, boot_cpu_data.x86_capability);
+               disable_sep = 1;
+       } else if (!strcmp(arg, "disable_tsc")) {
+               clear_bit(X86_FEATURE_TSC, boot_cpu_data.x86_capability);
+               disable_tsc = 1;
+       } else if (!strcmp(arg, "disable_mtrr")) {
+               clear_bit(X86_FEATURE_MTRR, boot_cpu_data.x86_capability);
+               disable_mtrr = 1;
+       }
+       return 0;
+}
+
+early_param("vmi", parse_vmi);
diff --git a/arch/i386/kernel/vmitime.c b/arch/i386/kernel/vmitime.c
new file mode 100644 (file)
index 0000000..76d2adc
--- /dev/null
@@ -0,0 +1,499 @@
+/*
+ * VMI paravirtual timer support routines.
+ *
+ * Copyright (C) 2005, VMware, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 dhecht@vmware.com
+ *
+ */
+
+/*
+ * Portions of this code from arch/i386/kernel/timers/timer_tsc.c.
+ * Portions of the CONFIG_NO_IDLE_HZ code from arch/s390/kernel/time.c.
+ * See comments there for proper credits.
+ */
+
+#include <linux/spinlock.h>
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/jiffies.h>
+#include <linux/interrupt.h>
+#include <linux/kernel_stat.h>
+#include <linux/rcupdate.h>
+#include <linux/clocksource.h>
+
+#include <asm/timer.h>
+#include <asm/io.h>
+#include <asm/apic.h>
+#include <asm/div64.h>
+#include <asm/timer.h>
+#include <asm/desc.h>
+
+#include <asm/vmi.h>
+#include <asm/vmi_time.h>
+
+#include <mach_timer.h>
+#include <io_ports.h>
+
+#ifdef CONFIG_X86_LOCAL_APIC
+#define VMI_ALARM_WIRING VMI_ALARM_WIRED_LVTT
+#else
+#define VMI_ALARM_WIRING VMI_ALARM_WIRED_IRQ0
+#endif
+
+/* Cached VMI operations */
+struct vmi_timer_ops vmi_timer_ops;
+
+#ifdef CONFIG_NO_IDLE_HZ
+
+/* /proc/sys/kernel/hz_timer state. */
+int sysctl_hz_timer;
+
+/* Some stats */
+static DEFINE_PER_CPU(unsigned long, vmi_idle_no_hz_irqs);
+static DEFINE_PER_CPU(unsigned long, vmi_idle_no_hz_jiffies);
+static DEFINE_PER_CPU(unsigned long, idle_start_jiffies);
+
+#endif /* CONFIG_NO_IDLE_HZ */
+
+/* Number of alarms per second. By default this is CONFIG_VMI_ALARM_HZ. */
+static int alarm_hz = CONFIG_VMI_ALARM_HZ;
+
+/* Cache of the value get_cycle_frequency / HZ. */
+static signed long long cycles_per_jiffy;
+
+/* Cache of the value get_cycle_frequency / alarm_hz. */
+static signed long long cycles_per_alarm;
+
+/* The number of cycles accounted for by the 'jiffies'/'xtime' count.
+ * Protected by xtime_lock. */
+static unsigned long long real_cycles_accounted_system;
+
+/* The number of cycles accounted for by update_process_times(), per cpu. */
+static DEFINE_PER_CPU(unsigned long long, process_times_cycles_accounted_cpu);
+
+/* The number of stolen cycles accounted, per cpu. */
+static DEFINE_PER_CPU(unsigned long long, stolen_cycles_accounted_cpu);
+
+/* Clock source. */
+static cycle_t read_real_cycles(void)
+{
+       return vmi_timer_ops.get_cycle_counter(VMI_CYCLES_REAL);
+}
+
+static cycle_t read_available_cycles(void)
+{
+       return vmi_timer_ops.get_cycle_counter(VMI_CYCLES_AVAILABLE);
+}
+
+#if 0
+static cycle_t read_stolen_cycles(void)
+{
+       return vmi_timer_ops.get_cycle_counter(VMI_CYCLES_STOLEN);
+}
+#endif  /*  0  */
+
+static struct clocksource clocksource_vmi = {
+       .name                   = "vmi-timer",
+       .rating                 = 450,
+       .read                   = read_real_cycles,
+       .mask                   = CLOCKSOURCE_MASK(64),
+       .mult                   = 0, /* to be set */
+       .shift                  = 22,
+       .flags                  = CLOCK_SOURCE_IS_CONTINUOUS,
+};
+
+
+/* Timer interrupt handler. */
+static irqreturn_t vmi_timer_interrupt(int irq, void *dev_id);
+
+static struct irqaction vmi_timer_irq  = {
+       vmi_timer_interrupt,
+       SA_INTERRUPT,
+       CPU_MASK_NONE,
+       "VMI-alarm",
+       NULL,
+       NULL
+};
+
+/* Alarm rate */
+static int __init vmi_timer_alarm_rate_setup(char* str)
+{
+       int alarm_rate;
+       if (get_option(&str, &alarm_rate) == 1 && alarm_rate > 0) {
+               alarm_hz = alarm_rate;
+               printk(KERN_WARNING "VMI timer alarm HZ set to %d\n", alarm_hz);
+       }
+       return 1;
+}
+__setup("vmi_timer_alarm_hz=", vmi_timer_alarm_rate_setup);
+
+
+/* Initialization */
+static void vmi_get_wallclock_ts(struct timespec *ts)
+{
+       unsigned long long wallclock;
+       wallclock = vmi_timer_ops.get_wallclock(); // nsec units
+       ts->tv_nsec = do_div(wallclock, 1000000000);
+       ts->tv_sec = wallclock;
+}
+
+static void update_xtime_from_wallclock(void)
+{
+       struct timespec ts;
+       vmi_get_wallclock_ts(&ts);
+       do_settimeofday(&ts);
+}
+
+unsigned long vmi_get_wallclock(void)
+{
+       struct timespec ts;
+       vmi_get_wallclock_ts(&ts);
+       return ts.tv_sec;
+}
+
+int vmi_set_wallclock(unsigned long now)
+{
+       return -1;
+}
+
+unsigned long long vmi_sched_clock(void)
+{
+       return read_available_cycles();
+}
+
+void __init vmi_time_init(void)
+{
+       unsigned long long cycles_per_sec, cycles_per_msec;
+       unsigned long flags;
+
+       local_irq_save(flags);
+       setup_irq(0, &vmi_timer_irq);
+#ifdef CONFIG_X86_LOCAL_APIC
+       set_intr_gate(LOCAL_TIMER_VECTOR, apic_vmi_timer_interrupt);
+#endif
+
+       no_sync_cmos_clock = 1;
+
+       vmi_get_wallclock_ts(&xtime);
+       set_normalized_timespec(&wall_to_monotonic,
+               -xtime.tv_sec, -xtime.tv_nsec);
+
+       real_cycles_accounted_system = read_real_cycles();
+       update_xtime_from_wallclock();
+       per_cpu(process_times_cycles_accounted_cpu, 0) = read_available_cycles();
+
+       cycles_per_sec = vmi_timer_ops.get_cycle_frequency();
+
+       cycles_per_jiffy = cycles_per_sec;
+       (void)do_div(cycles_per_jiffy, HZ);
+       cycles_per_alarm = cycles_per_sec;
+       (void)do_div(cycles_per_alarm, alarm_hz);
+       cycles_per_msec = cycles_per_sec;
+       (void)do_div(cycles_per_msec, 1000);
+       cpu_khz = cycles_per_msec;
+
+       printk(KERN_WARNING "VMI timer cycles/sec = %llu ; cycles/jiffy = %llu ;"
+              "cycles/alarm = %llu\n", cycles_per_sec, cycles_per_jiffy,
+              cycles_per_alarm);
+
+       clocksource_vmi.mult = clocksource_khz2mult(cycles_per_msec,
+                                                   clocksource_vmi.shift);
+       if (clocksource_register(&clocksource_vmi))
+               printk(KERN_WARNING "Error registering VMITIME clocksource.");
+
+       /* Disable PIT. */
+       outb_p(0x3a, PIT_MODE); /* binary, mode 5, LSB/MSB, ch 0 */
+
+       /* schedule the alarm. do this in phase with process_times_cycles_accounted_cpu
+        * reduce the latency calling update_process_times. */
+       vmi_timer_ops.set_alarm(
+                     VMI_ALARM_WIRED_IRQ0 | VMI_ALARM_IS_PERIODIC | VMI_CYCLES_AVAILABLE,
+                     per_cpu(process_times_cycles_accounted_cpu, 0) + cycles_per_alarm,
+                     cycles_per_alarm);
+
+       local_irq_restore(flags);
+}
+
+#ifdef CONFIG_X86_LOCAL_APIC
+
+void __init vmi_timer_setup_boot_alarm(void)
+{
+       local_irq_disable();
+
+       /* Route the interrupt to the correct vector. */
+       apic_write_around(APIC_LVTT, LOCAL_TIMER_VECTOR);
+
+       /* Cancel the IRQ0 wired alarm, and setup the LVTT alarm. */
+       vmi_timer_ops.cancel_alarm(VMI_CYCLES_AVAILABLE);
+       vmi_timer_ops.set_alarm(
+                     VMI_ALARM_WIRED_LVTT | VMI_ALARM_IS_PERIODIC | VMI_CYCLES_AVAILABLE,
+                     per_cpu(process_times_cycles_accounted_cpu, 0) + cycles_per_alarm,
+                     cycles_per_alarm);
+       local_irq_enable();
+}
+
+/* Initialize the time accounting variables for an AP on an SMP system.
+ * Also, set the local alarm for the AP. */
+void __init vmi_timer_setup_secondary_alarm(void)
+{
+       int cpu = smp_processor_id();
+
+       /* Route the interrupt to the correct vector. */
+       apic_write_around(APIC_LVTT, LOCAL_TIMER_VECTOR);
+
+       per_cpu(process_times_cycles_accounted_cpu, cpu) = read_available_cycles();
+
+       vmi_timer_ops.set_alarm(
+                     VMI_ALARM_WIRED_LVTT | VMI_ALARM_IS_PERIODIC | VMI_CYCLES_AVAILABLE,
+                     per_cpu(process_times_cycles_accounted_cpu, cpu) + cycles_per_alarm,
+                     cycles_per_alarm);
+}
+
+#endif
+
+/* Update system wide (real) time accounting (e.g. jiffies, xtime). */
+static void vmi_account_real_cycles(unsigned long long cur_real_cycles)
+{
+       long long cycles_not_accounted;
+
+       write_seqlock(&xtime_lock);
+
+       cycles_not_accounted = cur_real_cycles - real_cycles_accounted_system;
+       while (cycles_not_accounted >= cycles_per_jiffy) {
+               /* systems wide jiffies and wallclock. */
+               do_timer(1);
+
+               cycles_not_accounted -= cycles_per_jiffy;
+               real_cycles_accounted_system += cycles_per_jiffy;
+       }
+
+       if (vmi_timer_ops.wallclock_updated())
+               update_xtime_from_wallclock();
+
+       write_sequnlock(&xtime_lock);
+}
+
+/* Update per-cpu process times. */
+static void vmi_account_process_times_cycles(struct pt_regs *regs, int cpu,
+                                            unsigned long long cur_process_times_cycles)
+{
+       long long cycles_not_accounted;
+       cycles_not_accounted = cur_process_times_cycles -
+               per_cpu(process_times_cycles_accounted_cpu, cpu);
+
+       while (cycles_not_accounted >= cycles_per_jiffy) {
+               /* Account time to the current process.  This includes
+                * calling into the scheduler to decrement the timeslice
+                * and possibly reschedule.*/
+               update_process_times(user_mode(regs));
+               /* XXX handle /proc/profile multiplier.  */
+               profile_tick(CPU_PROFILING);
+
+               cycles_not_accounted -= cycles_per_jiffy;
+               per_cpu(process_times_cycles_accounted_cpu, cpu) += cycles_per_jiffy;
+       }
+}
+
+#ifdef CONFIG_NO_IDLE_HZ
+/* Update per-cpu idle times.  Used when a no-hz halt is ended. */
+static void vmi_account_no_hz_idle_cycles(int cpu,
+                                         unsigned long long cur_process_times_cycles)
+{
+       long long cycles_not_accounted;
+       unsigned long no_idle_hz_jiffies = 0;
+
+       cycles_not_accounted = cur_process_times_cycles -
+               per_cpu(process_times_cycles_accounted_cpu, cpu);
+
+       while (cycles_not_accounted >= cycles_per_jiffy) {
+               no_idle_hz_jiffies++;
+               cycles_not_accounted -= cycles_per_jiffy;
+               per_cpu(process_times_cycles_accounted_cpu, cpu) += cycles_per_jiffy;
+       }
+       /* Account time to the idle process. */
+       account_steal_time(idle_task(cpu), jiffies_to_cputime(no_idle_hz_jiffies));
+}
+#endif
+
+/* Update per-cpu stolen time. */
+static void vmi_account_stolen_cycles(int cpu,
+                                     unsigned long long cur_real_cycles,
+                                     unsigned long long cur_avail_cycles)
+{
+       long long stolen_cycles_not_accounted;
+       unsigned long stolen_jiffies = 0;
+
+       if (cur_real_cycles < cur_avail_cycles)
+               return;
+
+       stolen_cycles_not_accounted = cur_real_cycles - cur_avail_cycles -
+               per_cpu(stolen_cycles_accounted_cpu, cpu);
+
+       while (stolen_cycles_not_accounted >= cycles_per_jiffy) {
+               stolen_jiffies++;
+               stolen_cycles_not_accounted -= cycles_per_jiffy;
+               per_cpu(stolen_cycles_accounted_cpu, cpu) += cycles_per_jiffy;
+       }
+       /* HACK: pass NULL to force time onto cpustat->steal. */
+       account_steal_time(NULL, jiffies_to_cputime(stolen_jiffies));
+}
+
+/* Body of either IRQ0 interrupt handler (UP no local-APIC) or
+ * local-APIC LVTT interrupt handler (UP & local-APIC or SMP). */
+static void vmi_local_timer_interrupt(int cpu)
+{
+       unsigned long long cur_real_cycles, cur_process_times_cycles;
+
+       cur_real_cycles = read_real_cycles();
+       cur_process_times_cycles = read_available_cycles();
+       /* Update system wide (real) time state (xtime, jiffies). */
+       vmi_account_real_cycles(cur_real_cycles);
+       /* Update per-cpu process times. */
+       vmi_account_process_times_cycles(get_irq_regs(), cpu, cur_process_times_cycles);
+        /* Update time stolen from this cpu by the hypervisor. */
+       vmi_account_stolen_cycles(cpu, cur_real_cycles, cur_process_times_cycles);
+}
+
+#ifdef CONFIG_NO_IDLE_HZ
+
+/* Must be called only from idle loop, with interrupts disabled. */
+int vmi_stop_hz_timer(void)
+{
+       /* Note that cpu_set, cpu_clear are (SMP safe) atomic on x86. */
+
+       unsigned long seq, next;
+       unsigned long long real_cycles_expiry;
+       int cpu = smp_processor_id();
+       int idle;
+
+       BUG_ON(!irqs_disabled());
+       if (sysctl_hz_timer != 0)
+               return 0;
+
+       cpu_set(cpu, nohz_cpu_mask);
+       smp_mb();
+       if (rcu_needs_cpu(cpu) || local_softirq_pending() ||
+           (next = next_timer_interrupt(), time_before_eq(next, jiffies))) {
+               cpu_clear(cpu, nohz_cpu_mask);
+               next = jiffies;
+               idle = 0;
+       } else
+               idle = 1;
+
+       /* Convert jiffies to the real cycle counter. */
+       do {
+               seq = read_seqbegin(&xtime_lock);
+               real_cycles_expiry = real_cycles_accounted_system +
+                       (long)(next - jiffies) * cycles_per_jiffy;
+       } while (read_seqretry(&xtime_lock, seq));
+
+       /* This cpu is going idle. Disable the periodic alarm. */
+       if (idle) {
+               vmi_timer_ops.cancel_alarm(VMI_CYCLES_AVAILABLE);
+               per_cpu(idle_start_jiffies, cpu) = jiffies;
+       }
+
+       /* Set the real time alarm to expire at the next event. */
+       vmi_timer_ops.set_alarm(
+                     VMI_ALARM_WIRING | VMI_ALARM_IS_ONESHOT | VMI_CYCLES_REAL,
+                     real_cycles_expiry, 0);
+
+       return idle;
+}
+
+static void vmi_reenable_hz_timer(int cpu)
+{
+       /* For /proc/vmi/info idle_hz stat. */
+       per_cpu(vmi_idle_no_hz_jiffies, cpu) += jiffies - per_cpu(idle_start_jiffies, cpu);
+       per_cpu(vmi_idle_no_hz_irqs, cpu)++;
+
+       /* Don't bother explicitly cancelling the one-shot alarm -- at
+        * worse we will receive a spurious timer interrupt. */
+       vmi_timer_ops.set_alarm(
+                     VMI_ALARM_WIRING | VMI_ALARM_IS_PERIODIC | VMI_CYCLES_AVAILABLE,
+                     per_cpu(process_times_cycles_accounted_cpu, cpu) + cycles_per_alarm,
+                     cycles_per_alarm);
+       /* Indicate this cpu is no longer nohz idle. */
+       cpu_clear(cpu, nohz_cpu_mask);
+}
+
+/* Called from interrupt handlers when (local) HZ timer is disabled. */
+void vmi_account_time_restart_hz_timer(void)
+{
+       unsigned long long cur_real_cycles, cur_process_times_cycles;
+       int cpu = smp_processor_id();
+
+       BUG_ON(!irqs_disabled());
+       /* Account the time during which the HZ timer was disabled. */
+       cur_real_cycles = read_real_cycles();
+       cur_process_times_cycles = read_available_cycles();
+       /* Update system wide (real) time state (xtime, jiffies). */
+       vmi_account_real_cycles(cur_real_cycles);
+       /* Update per-cpu idle times. */
+       vmi_account_no_hz_idle_cycles(cpu, cur_process_times_cycles);
+        /* Update time stolen from this cpu by the hypervisor. */
+       vmi_account_stolen_cycles(cpu, cur_real_cycles, cur_process_times_cycles);
+       /* Reenable the hz timer. */
+       vmi_reenable_hz_timer(cpu);
+}
+
+#endif /* CONFIG_NO_IDLE_HZ */
+
+/* UP (and no local-APIC) VMI-timer alarm interrupt handler.
+ * Handler for IRQ0. Not used when SMP or X86_LOCAL_APIC after
+ * APIC setup and setup_boot_vmi_alarm() is called.  */
+static irqreturn_t vmi_timer_interrupt(int irq, void *dev_id)
+{
+       vmi_local_timer_interrupt(smp_processor_id());
+       return IRQ_HANDLED;
+}
+
+#ifdef CONFIG_X86_LOCAL_APIC
+
+/* SMP VMI-timer alarm interrupt handler. Handler for LVTT vector.
+ * Also used in UP when CONFIG_X86_LOCAL_APIC.
+ * The wrapper code is from arch/i386/kernel/apic.c#smp_apic_timer_interrupt. */
+void smp_apic_vmi_timer_interrupt(struct pt_regs *regs)
+{
+       struct pt_regs *old_regs = set_irq_regs(regs);
+       int cpu = smp_processor_id();
+
+       /*
+        * the NMI deadlock-detector uses this.
+        */
+        per_cpu(irq_stat,cpu).apic_timer_irqs++;
+
+       /*
+        * NOTE! We'd better ACK the irq immediately,
+        * because timer handling can be slow.
+        */
+       ack_APIC_irq();
+
+       /*
+        * update_process_times() expects us to have done irq_enter().
+        * Besides, if we don't timer interrupts ignore the global
+        * interrupt lock, which is the WrongThing (tm) to do.
+        */
+       irq_enter();
+       vmi_local_timer_interrupt(cpu);
+       irq_exit();
+       set_irq_regs(old_regs);
+}
+
+#endif  /* CONFIG_X86_LOCAL_APIC */
index a53c8b1854b58896a2dbc2b384d52722a1754481..ca51610955df34f56e83b323db66a8208366dc00 100644 (file)
@@ -37,9 +37,14 @@ SECTIONS
 {
   . = LOAD_OFFSET + LOAD_PHYSICAL_ADDR;
   phys_startup_32 = startup_32 - LOAD_OFFSET;
+
+  .text.head : AT(ADDR(.text.head) - LOAD_OFFSET) {
+       _text = .;                      /* Text and read-only data */
+       *(.text.head)
+  } :text = 0x9090
+
   /* read-only */
   .text : AT(ADDR(.text) - LOAD_OFFSET) {
-       _text = .;                      /* Text and read-only data */
        *(.text)
        SCHED_TEXT
        LOCK_TEXT
@@ -181,12 +186,14 @@ SECTIONS
      from .altinstructions and .eh_frame */
   .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { *(.exit.text) }
   .exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) { *(.exit.data) }
+#if defined(CONFIG_BLK_DEV_INITRD)
   . = ALIGN(4096);
   .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
        __initramfs_start = .;
        *(.init.ramfs)
        __initramfs_end = .;
   }
+#endif
   . = ALIGN(L1_CACHE_BYTES);
   .data.percpu  : AT(ADDR(.data.percpu) - LOAD_OFFSET) {
        __per_cpu_start = .;
index cc2f519b2f7f6c41a5b6ff5fdbe082fa730b5734..c7881621070630abd4b7c0c25ec28b1534c163c0 100644 (file)
@@ -79,7 +79,12 @@ void __init trap_init_hook(void)
 {
 }
 
-static struct irqaction irq0  = { timer_interrupt, IRQF_DISABLED, CPU_MASK_NONE, "timer", NULL, NULL};
+static struct irqaction irq0  = {
+       .handler = timer_interrupt,
+       .flags = IRQF_DISABLED | IRQF_NOBALANCING,
+       .mask = CPU_MASK_NONE,
+       .name = "timer"
+};
 
 /**
  * time_init_hook - do any specific initialisations for the system timer.
@@ -90,6 +95,7 @@ static struct irqaction irq0  = { timer_interrupt, IRQF_DISABLED, CPU_MASK_NONE,
  **/
 void __init time_init_hook(void)
 {
+       irq0.mask = cpumask_of_cpu(0);
        setup_irq(0, &irq0);
 }
 
index 9819b705efa422af8c3f1ee5652fa0649f606811..2e2c51a8bd3ae6d921167607977d9f25d2f75ae0 100644 (file)
@@ -56,15 +56,14 @@ static int reg_offset_vm86[] = {
 #define VM86_REG_(x) (*(unsigned short *) \
                      (reg_offset_vm86[((unsigned)x)]+(u_char *) FPU_info))
 
-/* These are dummy, fs and gs are not saved on the stack. */
-#define ___FS ___ds
+/* This dummy, gs is not saved on the stack. */
 #define ___GS ___ds
 
 static int reg_offset_pm[] = {
        offsetof(struct info,___cs),
        offsetof(struct info,___ds),
        offsetof(struct info,___es),
-       offsetof(struct info,___FS),
+       offsetof(struct info,___fs),
        offsetof(struct info,___GS),
        offsetof(struct info,___ss),
        offsetof(struct info,___ds)
@@ -169,13 +168,10 @@ static long pm_address(u_char FPU_modrm, u_char segment,
 
   switch ( segment )
     {
-      /* fs and gs aren't used by the kernel, so they still have their
-        user-space values. */
-    case PREFIX_FS_-1:
-      /* N.B. - movl %seg, mem is a 2 byte write regardless of prefix */
-      savesegment(fs, addr->selector);
-      break;
+      /* gs isn't used by the kernel, so it still has its
+        user-space value. */
     case PREFIX_GS_-1:
+      /* N.B. - movl %seg, mem is a 2 byte write regardless of prefix */
       savesegment(gs, addr->selector);
       break;
     default:
index 78d7b7689dd6b414ae6f25fb7ca61bb3c1c91028..59e73302aa60c599c6f5609d2e81a2bf49e3c9df 100644 (file)
 
 #define status_word() \
   ((partial_status & ~SW_Top & 0xffff) | ((top << SW_Top_Shift) & SW_Top))
-#define setcc(cc) ({ \
-  partial_status &= ~(SW_C0|SW_C1|SW_C2|SW_C3); \
-  partial_status |= (cc) & (SW_C0|SW_C1|SW_C2|SW_C3); })
+static inline void setcc(int cc)
+{
+       partial_status &= ~(SW_C0|SW_C1|SW_C2|SW_C3);
+       partial_status |= (cc) & (SW_C0|SW_C1|SW_C2|SW_C3);
+}
 
 #ifdef PECULIAR_486
    /* Default, this conveys no information, but an 80486 does it. */
index e0c390d6ceb526464d3c3b220e0fdc59f138ec8e..aa58720f68711ab5fd61c019b4862de89b6c5c35 100644 (file)
@@ -101,7 +101,6 @@ extern void find_max_pfn(void);
 extern void add_one_highpage_init(struct page *, int, int);
 
 extern struct e820map e820;
-extern unsigned long init_pg_tables_end;
 extern unsigned long highend_pfn, highstart_pfn;
 extern unsigned long max_low_pfn;
 extern unsigned long totalram_pages;
index aaaa4d225f7e25ad86c66511fcdf06d598ce9a09..b8c4e259fc8b7929e5ebeb1ea028c9d25a033646 100644 (file)
@@ -46,43 +46,17 @@ int unregister_page_fault_notifier(struct notifier_block *nb)
 }
 EXPORT_SYMBOL_GPL(unregister_page_fault_notifier);
 
-static inline int notify_page_fault(enum die_val val, const char *str,
-                       struct pt_regs *regs, long err, int trap, int sig)
+static inline int notify_page_fault(struct pt_regs *regs, long err)
 {
        struct die_args args = {
                .regs = regs,
-               .str = str,
+               .str = "page fault",
                .err = err,
-               .trapnr = trap,
-               .signr = sig
+               .trapnr = 14,
+               .signr = SIGSEGV
        };
-       return atomic_notifier_call_chain(&notify_page_fault_chain, val, &args);
-}
-
-/*
- * Unlock any spinlocks which will prevent us from getting the
- * message out 
- */
-void bust_spinlocks(int yes)
-{
-       int loglevel_save = console_loglevel;
-
-       if (yes) {
-               oops_in_progress = 1;
-               return;
-       }
-#ifdef CONFIG_VT
-       unblank_screen();
-#endif
-       oops_in_progress = 0;
-       /*
-        * OK, the message is on the console.  Now we call printk()
-        * without oops_in_progress set so that printk will give klogd
-        * a poke.  Hold onto your hats...
-        */
-       console_loglevel = 15;          /* NMI oopser may have shut the console up */
-       printk(" ");
-       console_loglevel = loglevel_save;
+       return atomic_notifier_call_chain(&notify_page_fault_chain,
+                                         DIE_PAGE_FAULT, &args);
 }
 
 /*
@@ -353,8 +327,7 @@ fastcall void __kprobes do_page_fault(struct pt_regs *regs,
        if (unlikely(address >= TASK_SIZE)) {
                if (!(error_code & 0x0000000d) && vmalloc_fault(address) >= 0)
                        return;
-               if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
-                                               SIGSEGV) == NOTIFY_STOP)
+               if (notify_page_fault(regs, error_code) == NOTIFY_STOP)
                        return;
                /*
                 * Don't take the mm semaphore here. If we fixup a prefetch
@@ -363,8 +336,7 @@ fastcall void __kprobes do_page_fault(struct pt_regs *regs,
                goto bad_area_nosemaphore;
        }
 
-       if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
-                                       SIGSEGV) == NOTIFY_STOP)
+       if (notify_page_fault(regs, error_code) == NOTIFY_STOP)
                return;
 
        /* It's safe to allow irq's after cr2 has been saved and the vmalloc
index e0fa6cb655a82574a50c3e8fc9334c2f71b9c156..bb2de1089add4e90270e4f35afbbe442007cbefe 100644 (file)
@@ -33,13 +33,14 @@ void *kmap_atomic(struct page *page, enum km_type type)
 
        /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
        pagefault_disable();
+
+       idx = type + KM_TYPE_NR*smp_processor_id();
+       BUG_ON(!pte_none(*(kmap_pte-idx)));
+
        if (!PageHighMem(page))
                return page_address(page);
 
-       idx = type + KM_TYPE_NR*smp_processor_id();
        vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
-       if (!pte_none(*(kmap_pte-idx)))
-               BUG();
        set_pte(kmap_pte-idx, mk_pte(page, kmap_prot));
 
        return (void*) vaddr;
index c5c5ea700cc708ae0e08388bfc492da509f173eb..ae436882af7a11dce76b34ee711fa6ce80c0502e 100644 (file)
@@ -62,6 +62,7 @@ static pmd_t * __init one_md_table_init(pgd_t *pgd)
                
 #ifdef CONFIG_X86_PAE
        pmd_table = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
+       paravirt_alloc_pd(__pa(pmd_table) >> PAGE_SHIFT);
        set_pgd(pgd, __pgd(__pa(pmd_table) | _PAGE_PRESENT));
        pud = pud_offset(pgd, 0);
        if (pmd_table != pmd_offset(pud, 0)) 
@@ -82,6 +83,7 @@ static pte_t * __init one_page_table_init(pmd_t *pmd)
 {
        if (pmd_none(*pmd)) {
                pte_t *page_table = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
+               paravirt_alloc_pt(__pa(page_table) >> PAGE_SHIFT);
                set_pmd(pmd, __pmd(__pa(page_table) | _PAGE_TABLE));
                if (page_table != pte_offset_kernel(pmd, 0))
                        BUG();  
@@ -345,6 +347,8 @@ static void __init pagetable_init (void)
        /* Init entries of the first-level page table to the zero page */
        for (i = 0; i < PTRS_PER_PGD; i++)
                set_pgd(pgd_base + i, __pgd(__pa(empty_zero_page) | _PAGE_PRESENT));
+#else
+       paravirt_alloc_pd(__pa(swapper_pg_dir) >> PAGE_SHIFT);
 #endif
 
        /* Enable PSE if available */
index e223b1d4981c2ee845f65d5337606862c57f0213..412ebbd8adb06f12c6f31093a43c1815f55fe8e9 100644 (file)
@@ -60,6 +60,7 @@ static struct page *split_large_page(unsigned long address, pgprot_t prot,
        address = __pa(address);
        addr = address & LARGE_PAGE_MASK; 
        pbase = (pte_t *)page_address(base);
+       paravirt_alloc_pt(page_to_pfn(base));
        for (i = 0; i < PTRS_PER_PTE; i++, addr += PAGE_SIZE) {
                set_pte(&pbase[i], pfn_pte(addr >> PAGE_SHIFT,
                                           addr == address ? prot : ref_prot));
@@ -172,6 +173,7 @@ __change_page_attr(struct page *page, pgprot_t prot)
        if (!PageReserved(kpte_page)) {
                if (cpu_has_pse && (page_private(kpte_page) == 0)) {
                        ClearPagePrivate(kpte_page);
+                       paravirt_release_pt(page_to_pfn(kpte_page));
                        list_add(&kpte_page->lru, &df_list);
                        revert_page(kpte_page, address);
                }
index f349eaf450b0db542c5c3e56c3b598da94562a66..fa0cfbd551e185f83f75adecd7a0ecd6a03788cc 100644 (file)
@@ -171,6 +171,8 @@ void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags)
 void reserve_top_address(unsigned long reserve)
 {
        BUG_ON(fixmaps > 0);
+       printk(KERN_INFO "Reserving virtual address space above 0x%08x\n",
+              (int)-reserve);
 #ifdef CONFIG_COMPAT_VDSO
        BUG_ON(reserve != 0);
 #else
@@ -248,9 +250,15 @@ void pgd_ctor(void *pgd, struct kmem_cache *cache, unsigned long unused)
        clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
                        swapper_pg_dir + USER_PTRS_PER_PGD,
                        KERNEL_PGD_PTRS);
+
        if (PTRS_PER_PMD > 1)
                return;
 
+       /* must happen under lock */
+       paravirt_alloc_pd_clone(__pa(pgd) >> PAGE_SHIFT,
+                       __pa(swapper_pg_dir) >> PAGE_SHIFT,
+                       USER_PTRS_PER_PGD, PTRS_PER_PGD - USER_PTRS_PER_PGD);
+
        pgd_list_add(pgd);
        spin_unlock_irqrestore(&pgd_lock, flags);
 }
@@ -260,6 +268,7 @@ void pgd_dtor(void *pgd, struct kmem_cache *cache, unsigned long unused)
 {
        unsigned long flags; /* can be called from interrupt context */
 
+       paravirt_release_pd(__pa(pgd) >> PAGE_SHIFT);
        spin_lock_irqsave(&pgd_lock, flags);
        pgd_list_del(pgd);
        spin_unlock_irqrestore(&pgd_lock, flags);
@@ -277,13 +286,18 @@ pgd_t *pgd_alloc(struct mm_struct *mm)
                pmd_t *pmd = kmem_cache_alloc(pmd_cache, GFP_KERNEL);
                if (!pmd)
                        goto out_oom;
+               paravirt_alloc_pd(__pa(pmd) >> PAGE_SHIFT);
                set_pgd(&pgd[i], __pgd(1 + __pa(pmd)));
        }
        return pgd;
 
 out_oom:
-       for (i--; i >= 0; i--)
-               kmem_cache_free(pmd_cache, (void *)__va(pgd_val(pgd[i])-1));
+       for (i--; i >= 0; i--) {
+               pgd_t pgdent = pgd[i];
+               void* pmd = (void *)__va(pgd_val(pgdent)-1);
+               paravirt_release_pd(__pa(pmd) >> PAGE_SHIFT);
+               kmem_cache_free(pmd_cache, pmd);
+       }
        kmem_cache_free(pgd_cache, pgd);
        return NULL;
 }
@@ -294,8 +308,12 @@ void pgd_free(pgd_t *pgd)
 
        /* in the PAE case user pgd entries are overwritten before usage */
        if (PTRS_PER_PMD > 1)
-               for (i = 0; i < USER_PTRS_PER_PGD; ++i)
-                       kmem_cache_free(pmd_cache, (void *)__va(pgd_val(pgd[i])-1));
+               for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
+                       pgd_t pgdent = pgd[i];
+                       void* pmd = (void *)__va(pgd_val(pgdent)-1);
+                       paravirt_release_pd(__pa(pmd) >> PAGE_SHIFT);
+                       kmem_cache_free(pmd_cache, pmd);
+               }
        /* in the non-PAE case, free_pgtables() clears user pgd entries */
        kmem_cache_free(pgd_cache, pgd);
 }
index ca2447e05e15d90a70012e4d2b725c8fa9a47e78..c554f52cb80825b8fc85cd72fd91cb1e1612c00a 100644 (file)
@@ -24,7 +24,8 @@
 
 #define CTR_IS_RESERVED(msrs,c) (msrs->counters[(c)].addr ? 1 : 0)
 #define CTR_READ(l,h,msrs,c) do {rdmsr(msrs->counters[(c)].addr, (l), (h));} while (0)
-#define CTR_WRITE(l,msrs,c) do {wrmsr(msrs->counters[(c)].addr, -(u32)(l), -1);} while (0)
+#define CTR_32BIT_WRITE(l,msrs,c)      \
+       do {wrmsr(msrs->counters[(c)].addr, -(u32)(l), 0);} while (0)
 #define CTR_OVERFLOWED(n) (!((n) & (1U<<31)))
 
 #define CTRL_IS_RESERVED(msrs,c) (msrs->controls[(c)].addr ? 1 : 0)
@@ -79,7 +80,7 @@ static void ppro_setup_ctrs(struct op_msrs const * const msrs)
        for (i = 0; i < NUM_COUNTERS; ++i) {
                if (unlikely(!CTR_IS_RESERVED(msrs,i)))
                        continue;
-               CTR_WRITE(1, msrs, i);
+               CTR_32BIT_WRITE(1, msrs, i);
        }
 
        /* enable active counters */
@@ -87,7 +88,7 @@ static void ppro_setup_ctrs(struct op_msrs const * const msrs)
                if ((counter_config[i].enabled) && (CTR_IS_RESERVED(msrs,i))) {
                        reset_value[i] = counter_config[i].count;
 
-                       CTR_WRITE(counter_config[i].count, msrs, i);
+                       CTR_32BIT_WRITE(counter_config[i].count, msrs, i);
 
                        CTRL_READ(low, high, msrs, i);
                        CTRL_CLEAR(low);
@@ -116,7 +117,7 @@ static int ppro_check_ctrs(struct pt_regs * const regs,
                CTR_READ(low, high, msrs, i);
                if (CTR_OVERFLOWED(low)) {
                        oprofile_add_sample(regs, i);
-                       CTR_WRITE(reset_value[i], msrs, i);
+                       CTR_32BIT_WRITE(reset_value[i], msrs, i);
                }
        }
 
index 1594d2f55c8f13e5fc4b22389456957d8bacefb1..44650e03308b0ad6d849abc0dcc0645800292be5 100644 (file)
@@ -1,7 +1,7 @@
 obj-y                          := i386.o init.o
 
 obj-$(CONFIG_PCI_BIOS)         += pcbios.o
-obj-$(CONFIG_PCI_MMCONFIG)     += mmconfig.o direct.o
+obj-$(CONFIG_PCI_MMCONFIG)     += mmconfig.o direct.o mmconfig-shared.o
 obj-$(CONFIG_PCI_DIRECT)       += direct.o
 
 pci-y                          := fixup.o
diff --git a/arch/i386/pci/mmconfig-shared.c b/arch/i386/pci/mmconfig-shared.c
new file mode 100644 (file)
index 0000000..747d8c6
--- /dev/null
@@ -0,0 +1,264 @@
+/*
+ * mmconfig-shared.c - Low-level direct PCI config space access via
+ *                     MMCONFIG - common code between i386 and x86-64.
+ *
+ * This code does:
+ * - known chipset handling
+ * - ACPI decoding and validation
+ *
+ * Per-architecture code takes care of the mappings and accesses
+ * themselves.
+ */
+
+#include <linux/pci.h>
+#include <linux/init.h>
+#include <linux/acpi.h>
+#include <linux/bitmap.h>
+#include <asm/e820.h>
+
+#include "pci.h"
+
+/* aperture is up to 256MB but BIOS may reserve less */
+#define MMCONFIG_APER_MIN      (2 * 1024*1024)
+#define MMCONFIG_APER_MAX      (256 * 1024*1024)
+
+DECLARE_BITMAP(pci_mmcfg_fallback_slots, 32*PCI_MMCFG_MAX_CHECK_BUS);
+
+/* K8 systems have some devices (typically in the builtin northbridge)
+   that are only accessible using type1
+   Normally this can be expressed in the MCFG by not listing them
+   and assigning suitable _SEGs, but this isn't implemented in some BIOS.
+   Instead try to discover all devices on bus 0 that are unreachable using MM
+   and fallback for them. */
+static void __init unreachable_devices(void)
+{
+       int i, bus;
+       /* Use the max bus number from ACPI here? */
+       for (bus = 0; bus < PCI_MMCFG_MAX_CHECK_BUS; bus++) {
+               for (i = 0; i < 32; i++) {
+                       unsigned int devfn = PCI_DEVFN(i, 0);
+                       u32 val1, val2;
+
+                       pci_conf1_read(0, bus, devfn, 0, 4, &val1);
+                       if (val1 == 0xffffffff)
+                               continue;
+
+                       if (pci_mmcfg_arch_reachable(0, bus, devfn)) {
+                               raw_pci_ops->read(0, bus, devfn, 0, 4, &val2);
+                               if (val1 == val2)
+                                       continue;
+                       }
+                       set_bit(i + 32 * bus, pci_mmcfg_fallback_slots);
+                       printk(KERN_NOTICE "PCI: No mmconfig possible on device"
+                              " %02x:%02x\n", bus, i);
+               }
+       }
+}
+
+static const char __init *pci_mmcfg_e7520(void)
+{
+       u32 win;
+       pci_conf1_read(0, 0, PCI_DEVFN(0,0), 0xce, 2, &win);
+
+       pci_mmcfg_config_num = 1;
+       pci_mmcfg_config = kzalloc(sizeof(pci_mmcfg_config[0]), GFP_KERNEL);
+       if (!pci_mmcfg_config)
+               return NULL;
+       pci_mmcfg_config[0].address = (win & 0xf000) << 16;
+       pci_mmcfg_config[0].pci_segment = 0;
+       pci_mmcfg_config[0].start_bus_number = 0;
+       pci_mmcfg_config[0].end_bus_number = 255;
+
+       return "Intel Corporation E7520 Memory Controller Hub";
+}
+
+static const char __init *pci_mmcfg_intel_945(void)
+{
+       u32 pciexbar, mask = 0, len = 0;
+
+       pci_mmcfg_config_num = 1;
+
+       pci_conf1_read(0, 0, PCI_DEVFN(0,0), 0x48, 4, &pciexbar);
+
+       /* Enable bit */
+       if (!(pciexbar & 1))
+               pci_mmcfg_config_num = 0;
+
+       /* Size bits */
+       switch ((pciexbar >> 1) & 3) {
+       case 0:
+               mask = 0xf0000000U;
+               len  = 0x10000000U;
+               break;
+       case 1:
+               mask = 0xf8000000U;
+               len  = 0x08000000U;
+               break;
+       case 2:
+               mask = 0xfc000000U;
+               len  = 0x04000000U;
+               break;
+       default:
+               pci_mmcfg_config_num = 0;
+       }
+
+       /* Errata #2, things break when not aligned on a 256Mb boundary */
+       /* Can only happen in 64M/128M mode */
+
+       if ((pciexbar & mask) & 0x0fffffffU)
+               pci_mmcfg_config_num = 0;
+
+       if (pci_mmcfg_config_num) {
+               pci_mmcfg_config = kzalloc(sizeof(pci_mmcfg_config[0]), GFP_KERNEL);
+               if (!pci_mmcfg_config)
+                       return NULL;
+               pci_mmcfg_config[0].address = pciexbar & mask;
+               pci_mmcfg_config[0].pci_segment = 0;
+               pci_mmcfg_config[0].start_bus_number = 0;
+               pci_mmcfg_config[0].end_bus_number = (len >> 20) - 1;
+       }
+
+       return "Intel Corporation 945G/GZ/P/PL Express Memory Controller Hub";
+}
+
+struct pci_mmcfg_hostbridge_probe {
+       u32 vendor;
+       u32 device;
+       const char *(*probe)(void);
+};
+
+static struct pci_mmcfg_hostbridge_probe pci_mmcfg_probes[] __initdata = {
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7520_MCH, pci_mmcfg_e7520 },
+       { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82945G_HB, pci_mmcfg_intel_945 },
+};
+
+static int __init pci_mmcfg_check_hostbridge(void)
+{
+       u32 l;
+       u16 vendor, device;
+       int i;
+       const char *name;
+
+       pci_conf1_read(0, 0, PCI_DEVFN(0,0), 0, 4, &l);
+       vendor = l & 0xffff;
+       device = (l >> 16) & 0xffff;
+
+       pci_mmcfg_config_num = 0;
+       pci_mmcfg_config = NULL;
+       name = NULL;
+
+       for (i = 0; !name && i < ARRAY_SIZE(pci_mmcfg_probes); i++) {
+               if (pci_mmcfg_probes[i].vendor == vendor &&
+                   pci_mmcfg_probes[i].device == device)
+                       name = pci_mmcfg_probes[i].probe();
+       }
+
+       if (name) {
+               printk(KERN_INFO "PCI: Found %s %s MMCONFIG support.\n",
+                      name, pci_mmcfg_config_num ? "with" : "without");
+       }
+
+       return name != NULL;
+}
+
+static void __init pci_mmcfg_insert_resources(void)
+{
+#define PCI_MMCFG_RESOURCE_NAME_LEN 19
+       int i;
+       struct resource *res;
+       char *names;
+       unsigned num_buses;
+
+       res = kcalloc(PCI_MMCFG_RESOURCE_NAME_LEN + sizeof(*res),
+                       pci_mmcfg_config_num, GFP_KERNEL);
+       if (!res) {
+               printk(KERN_ERR "PCI: Unable to allocate MMCONFIG resources\n");
+               return;
+       }
+
+       names = (void *)&res[pci_mmcfg_config_num];
+       for (i = 0; i < pci_mmcfg_config_num; i++, res++) {
+               struct acpi_mcfg_allocation *cfg = &pci_mmcfg_config[i];
+               num_buses = cfg->end_bus_number - cfg->start_bus_number + 1;
+               res->name = names;
+               snprintf(names, PCI_MMCFG_RESOURCE_NAME_LEN, "PCI MMCONFIG %u",
+                        cfg->pci_segment);
+               res->start = cfg->address;
+               res->end = res->start + (num_buses << 20) - 1;
+               res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
+               insert_resource(&iomem_resource, res);
+               names += PCI_MMCFG_RESOURCE_NAME_LEN;
+       }
+}
+
+static void __init pci_mmcfg_reject_broken(int type)
+{
+       typeof(pci_mmcfg_config[0]) *cfg;
+
+       if ((pci_mmcfg_config_num == 0) ||
+           (pci_mmcfg_config == NULL) ||
+           (pci_mmcfg_config[0].address == 0))
+               return;
+
+       cfg = &pci_mmcfg_config[0];
+
+       /*
+        * Handle more broken MCFG tables on Asus etc.
+        * They only contain a single entry for bus 0-0.
+        */
+       if (pci_mmcfg_config_num == 1 &&
+           cfg->pci_segment == 0 &&
+           (cfg->start_bus_number | cfg->end_bus_number) == 0) {
+               printk(KERN_ERR "PCI: start and end of bus number is 0. "
+                      "Rejected as broken MCFG.\n");
+               goto reject;
+       }
+
+       /*
+        * Only do this check when type 1 works. If it doesn't work
+        * assume we run on a Mac and always use MCFG
+        */
+       if (type == 1 && !e820_all_mapped(cfg->address,
+                                         cfg->address + MMCONFIG_APER_MIN,
+                                         E820_RESERVED)) {
+               printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %Lx is not"
+                      " E820-reserved\n", cfg->address);
+               goto reject;
+       }
+       return;
+
+reject:
+       printk(KERN_ERR "PCI: Not using MMCONFIG.\n");
+       kfree(pci_mmcfg_config);
+       pci_mmcfg_config = NULL;
+       pci_mmcfg_config_num = 0;
+}
+
+void __init pci_mmcfg_init(int type)
+{
+       int known_bridge = 0;
+
+       if ((pci_probe & PCI_PROBE_MMCONF) == 0)
+               return;
+
+       if (type == 1 && pci_mmcfg_check_hostbridge())
+               known_bridge = 1;
+
+       if (!known_bridge) {
+               acpi_table_parse(ACPI_SIG_MCFG, acpi_parse_mcfg);
+               pci_mmcfg_reject_broken(type);
+       }
+
+       if ((pci_mmcfg_config_num == 0) ||
+           (pci_mmcfg_config == NULL) ||
+           (pci_mmcfg_config[0].address == 0))
+               return;
+
+       if (pci_mmcfg_arch_init()) {
+               if (type == 1)
+                       unreachable_devices();
+               if (known_bridge)
+                       pci_mmcfg_insert_resources();
+               pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF;
+       }
+}
index 5700220dcf5fa15a4c0984128ce0c8e95735bd60..bb1afd9e589d5bdf27a5bfe91b2c4cd78107e8f1 100644 (file)
 #include <asm/e820.h>
 #include "pci.h"
 
-/* aperture is up to 256MB but BIOS may reserve less */
-#define MMCONFIG_APER_MIN      (2 * 1024*1024)
-#define MMCONFIG_APER_MAX      (256 * 1024*1024)
-
 /* Assume systems with more busses have correct MCFG */
-#define MAX_CHECK_BUS 16
-
 #define mmcfg_virt_addr ((void __iomem *) fix_to_virt(FIX_PCIE_MCFG))
 
 /* The base address of the last MMCONFIG device accessed */
 static u32 mmcfg_last_accessed_device;
 static int mmcfg_last_accessed_cpu;
 
-static DECLARE_BITMAP(fallback_slots, MAX_CHECK_BUS*32);
-
 /*
  * Functions for accessing PCI configuration space with MMCONFIG accesses
  */
 static u32 get_base_addr(unsigned int seg, int bus, unsigned devfn)
 {
-       int cfg_num = -1;
        struct acpi_mcfg_allocation *cfg;
+       int cfg_num;
 
-       if (seg == 0 && bus < MAX_CHECK_BUS &&
-           test_bit(PCI_SLOT(devfn) + 32*bus, fallback_slots))
+       if (seg == 0 && bus < PCI_MMCFG_MAX_CHECK_BUS &&
+           test_bit(PCI_SLOT(devfn) + 32*bus, pci_mmcfg_fallback_slots))
                return 0;
 
-       while (1) {
-               ++cfg_num;
-               if (cfg_num >= pci_mmcfg_config_num) {
-                       break;
-               }
+       for (cfg_num = 0; cfg_num < pci_mmcfg_config_num; cfg_num++) {
                cfg = &pci_mmcfg_config[cfg_num];
-               if (cfg->pci_segment != seg)
-                       continue;
-               if ((cfg->start_bus_number <= bus) &&
+               if (cfg->pci_segment == seg &&
+                   (cfg->start_bus_number <= bus) &&
                    (cfg->end_bus_number >= bus))
                        return cfg->address;
        }
 
-       /* Handle more broken MCFG tables on Asus etc.
-          They only contain a single entry for bus 0-0. Assume
-          this applies to all busses. */
-       cfg = &pci_mmcfg_config[0];
-       if (pci_mmcfg_config_num == 1 &&
-               cfg->pci_segment == 0 &&
-               (cfg->start_bus_number | cfg->end_bus_number) == 0)
-               return cfg->address;
-
        /* Fall back to type 0 */
        return 0;
 }
@@ -158,67 +136,15 @@ static struct pci_raw_ops pci_mmcfg = {
        .write =        pci_mmcfg_write,
 };
 
-/* K8 systems have some devices (typically in the builtin northbridge)
-   that are only accessible using type1
-   Normally this can be expressed in the MCFG by not listing them
-   and assigning suitable _SEGs, but this isn't implemented in some BIOS.
-   Instead try to discover all devices on bus 0 that are unreachable using MM
-   and fallback for them. */
-static __init void unreachable_devices(void)
+int __init pci_mmcfg_arch_reachable(unsigned int seg, unsigned int bus,
+                                   unsigned int devfn)
 {
-       int i, k;
-       unsigned long flags;
-
-       for (k = 0; k < MAX_CHECK_BUS; k++) {
-               for (i = 0; i < 32; i++) {
-                       u32 val1;
-                       u32 addr;
-
-                       pci_conf1_read(0, k, PCI_DEVFN(i, 0), 0, 4, &val1);
-                       if (val1 == 0xffffffff)
-                               continue;
-
-                       /* Locking probably not needed, but safer */
-                       spin_lock_irqsave(&pci_config_lock, flags);
-                       addr = get_base_addr(0, k, PCI_DEVFN(i, 0));
-                       if (addr != 0)
-                               pci_exp_set_dev_base(addr, k, PCI_DEVFN(i, 0));
-                       if (addr == 0 ||
-                           readl((u32 __iomem *)mmcfg_virt_addr) != val1) {
-                               set_bit(i + 32*k, fallback_slots);
-                               printk(KERN_NOTICE
-                       "PCI: No mmconfig possible on %x:%x\n", k, i);
-                       }
-                       spin_unlock_irqrestore(&pci_config_lock, flags);
-               }
-       }
+       return get_base_addr(seg, bus, devfn) != 0;
 }
 
-void __init pci_mmcfg_init(int type)
+int __init pci_mmcfg_arch_init(void)
 {
-       if ((pci_probe & PCI_PROBE_MMCONF) == 0)
-               return;
-
-       acpi_table_parse(ACPI_SIG_MCFG, acpi_parse_mcfg);
-       if ((pci_mmcfg_config_num == 0) ||
-           (pci_mmcfg_config == NULL) ||
-           (pci_mmcfg_config[0].address == 0))
-               return;
-
-       /* Only do this check when type 1 works. If it doesn't work
-          assume we run on a Mac and always use MCFG */
-       if (type == 1 && !e820_all_mapped(pci_mmcfg_config[0].address,
-                       pci_mmcfg_config[0].address + MMCONFIG_APER_MIN,
-                       E820_RESERVED)) {
-               printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %lx is not E820-reserved\n",
-                               (unsigned long)pci_mmcfg_config[0].address);
-               printk(KERN_ERR "PCI: Not using MMCONFIG.\n");
-               return;
-       }
-
        printk(KERN_INFO "PCI: Using MMCONFIG\n");
        raw_pci_ops = &pci_mmcfg;
-       pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF;
-
-       unreachable_devices();
+       return 1;
 }
index a0a25180b61a93b974d4e5918d85960a4093dd9d..e58bae2076ad50b96a0e2fb78493e198e44816ec 100644 (file)
@@ -94,3 +94,13 @@ extern void pci_pcbios_init(void);
 extern void pci_mmcfg_init(int type);
 extern void pcibios_sort(void);
 
+/* pci-mmconfig.c */
+
+/* Verify the first 16 busses. We assume that systems with more busses
+   get MCFG right. */
+#define PCI_MMCFG_MAX_CHECK_BUS 16
+extern DECLARE_BITMAP(pci_mmcfg_fallback_slots, 32*PCI_MMCFG_MAX_CHECK_BUS);
+
+extern int __init pci_mmcfg_arch_reachable(unsigned int seg, unsigned int bus,
+                                          unsigned int devfn);
+extern int __init pci_mmcfg_arch_init(void);
index f1d2899e9a629763173afffb8d86766a5fac08fc..d51f0f11f7f95169f424cd99768928635be92dd3 100644 (file)
@@ -22,8 +22,13 @@ config IA64
 
 config 64BIT
        bool
+       select ATA_NONSTANDARD if ATA
        default y
 
+config ZONE_DMA
+       def_bool y
+       depends on !IA64_SGI_SN2
+
 config MMU
        bool
        default y
index ce49fe3a3b5654f88256d24b8fe6fc2410ccfc0b..c1dca226b479ef1be7ca1e605529b0a899cdaf9d 100644 (file)
@@ -1881,7 +1881,7 @@ ioc_open(struct inode *inode, struct file *file)
        return seq_open(file, &ioc_seq_ops);
 }
 
-static struct file_operations ioc_fops = {
+static const struct file_operations ioc_fops = {
        .open    = ioc_open,
        .read    = seq_read,
        .llseek  = seq_lseek,
index 578737ec7629374253ea7b53029b8a3fe7d6848c..c05bda66236451291e51e7622682ab41593739bf 100644 (file)
@@ -91,9 +91,8 @@ ia64_elf32_init (struct pt_regs *regs)
         * it with privilege level 3 because the IVE uses non-privileged accesses to these
         * tables.  IA-32 segmentation is used to protect against IA-32 accesses to them.
         */
-       vma = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);
+       vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
        if (vma) {
-               memset(vma, 0, sizeof(*vma));
                vma->vm_mm = current->mm;
                vma->vm_start = IA32_GDT_OFFSET;
                vma->vm_end = vma->vm_start + PAGE_SIZE;
@@ -117,9 +116,8 @@ ia64_elf32_init (struct pt_regs *regs)
         * code is locked in specific gate page, which is pointed by pretcode
         * when setup_frame_ia32
         */
-       vma = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);
+       vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
        if (vma) {
-               memset(vma, 0, sizeof(*vma));
                vma->vm_mm = current->mm;
                vma->vm_start = IA32_GATE_OFFSET;
                vma->vm_end = vma->vm_start + PAGE_SIZE;
@@ -142,9 +140,8 @@ ia64_elf32_init (struct pt_regs *regs)
         * Install LDT as anonymous memory.  This gives us all-zero segment descriptors
         * until a task modifies them via modify_ldt().
         */
-       vma = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);
+       vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
        if (vma) {
-               memset(vma, 0, sizeof(*vma));
                vma->vm_mm = current->mm;
                vma->vm_start = IA32_LDT_OFFSET;
                vma->vm_end = vma->vm_start + PAGE_ALIGN(IA32_LDT_ENTRIES*IA32_LDT_ENTRY_SIZE);
@@ -214,12 +211,10 @@ ia32_setup_arg_pages (struct linux_binprm *bprm, int executable_stack)
                bprm->loader += stack_base;
        bprm->exec += stack_base;
 
-       mpnt = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);
+       mpnt = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
        if (!mpnt)
                return -ENOMEM;
 
-       memset(mpnt, 0, sizeof(*mpnt));
-
        down_write(&current->mm->mmap_sem);
        {
                mpnt->vm_mm = current->mm;
index a32cd59b81ed7e00658fd0f7b6fcf00924121736..687e5fdc968377fcead5c80c909f9f7aa8e02f5b 100644 (file)
@@ -326,7 +326,7 @@ ia32_syscall_table:
        data8 sys_ni_syscall
        data8 compat_sys_wait4
        data8 sys_swapoff         /* 115 */
-       data8 sys32_sysinfo
+       data8 compat_sys_sysinfo
        data8 sys32_ipc
        data8 sys_fsync
        data8 sys32_sigreturn
index 957681c39ad9957a287929c093aa060908b7c9c4..d430d36ae49d62763757d05c354ec4590781d6da 100644 (file)
@@ -2209,74 +2209,6 @@ sys32_fstat64 (unsigned int fd, struct stat64 __user *statbuf)
        return ret;
 }
 
-struct sysinfo32 {
-       s32 uptime;
-       u32 loads[3];
-       u32 totalram;
-       u32 freeram;
-       u32 sharedram;
-       u32 bufferram;
-       u32 totalswap;
-       u32 freeswap;
-       u16 procs;
-       u16 pad;
-       u32 totalhigh;
-       u32 freehigh;
-       u32 mem_unit;
-       char _f[8];
-};
-
-asmlinkage long
-sys32_sysinfo (struct sysinfo32 __user *info)
-{
-       struct sysinfo s;
-       long ret, err;
-       int bitcount = 0;
-       mm_segment_t old_fs = get_fs();
-
-       set_fs(KERNEL_DS);
-       ret = sys_sysinfo((struct sysinfo __user *) &s);
-       set_fs(old_fs);
-       /* Check to see if any memory value is too large for 32-bit and
-        * scale down if needed.
-        */
-       if ((s.totalram >> 32) || (s.totalswap >> 32)) {
-               while (s.mem_unit < PAGE_SIZE) {
-                       s.mem_unit <<= 1;
-                       bitcount++;
-               }
-               s.totalram >>= bitcount;
-               s.freeram >>= bitcount;
-               s.sharedram >>= bitcount;
-               s.bufferram >>= bitcount;
-               s.totalswap >>= bitcount;
-               s.freeswap >>= bitcount;
-               s.totalhigh >>= bitcount;
-               s.freehigh >>= bitcount;
-       }
-
-       if (!access_ok(VERIFY_WRITE, info, sizeof(*info)))
-               return -EFAULT;
-
-       err  = __put_user(s.uptime, &info->uptime);
-       err |= __put_user(s.loads[0], &info->loads[0]);
-       err |= __put_user(s.loads[1], &info->loads[1]);
-       err |= __put_user(s.loads[2], &info->loads[2]);
-       err |= __put_user(s.totalram, &info->totalram);
-       err |= __put_user(s.freeram, &info->freeram);
-       err |= __put_user(s.sharedram, &info->sharedram);
-       err |= __put_user(s.bufferram, &info->bufferram);
-       err |= __put_user(s.totalswap, &info->totalswap);
-       err |= __put_user(s.freeswap, &info->freeswap);
-       err |= __put_user(s.procs, &info->procs);
-       err |= __put_user (s.totalhigh, &info->totalhigh);
-       err |= __put_user (s.freehigh, &info->freehigh);
-       err |= __put_user (s.mem_unit, &info->mem_unit);
-       if (err)
-               return -EFAULT;
-       return ret;
-}
-
 asmlinkage long
 sys32_sched_rr_get_interval (pid_t pid, struct compat_timespec __user *interval)
 {
index 9197d7b361b33da914744bff7a2a393a799c9ba9..3549c94467b8a2ceea285af768f5a3a6da2dbc32 100644 (file)
@@ -651,7 +651,7 @@ int __init acpi_boot_init(void)
         * information -- the successor to MPS tables.
         */
 
-       if (acpi_table_parse(ACPI_SIG_MADT, acpi_parse_madt) < 1) {
+       if (acpi_table_parse(ACPI_SIG_MADT, acpi_parse_madt)) {
                printk(KERN_ERR PREFIX "Can't find MADT\n");
                goto skip_madt;
        }
@@ -702,7 +702,7 @@ int __init acpi_boot_init(void)
         * gets interrupts such as power and sleep buttons.  If it's not
         * on a Legacy interrupt, it needs to be setup.
         */
-       if (acpi_table_parse(ACPI_SIG_FADT, acpi_parse_fadt) < 1)
+       if (acpi_table_parse(ACPI_SIG_FADT, acpi_parse_fadt))
                printk(KERN_ERR PREFIX "Can't find FADT\n");
 
 #ifdef CONFIG_SMP
index 37bb16f07fc3f2fd2b7a3ca8112f0d6a0a6af2e0..5cdd2f5fa064acbcd5ab266526545a5b4e77f3fd 100644 (file)
@@ -222,7 +222,7 @@ machine_crash_setup(void)
        if((ret = register_die_notifier(&kdump_init_notifier_nb)) != 0)
                return ret;
 #ifdef CONFIG_SYSCTL
-       register_sysctl_table(sys_table, 0);
+       register_sysctl_table(sys_table);
 #endif
        return 0;
 }
index 6c03928544c233cb4b3e5c14537b56f9a7fe3898..772ba6fe110f6c0f56da55c491669debc2ec3787 100644 (file)
@@ -413,11 +413,10 @@ efi_init (void)
        efi_char16_t *c16;
        u64 efi_desc_size;
        char *cp, vendor[100] = "unknown";
-       extern char saved_command_line[];
        int i;
 
        /* it's too early to be able to use the standard kernel command line support... */
-       for (cp = saved_command_line; *cp; ) {
+       for (cp = boot_command_line; *cp; ) {
                if (memcmp(cp, "mem=", 4) == 0) {
                        mem_limit = memparse(cp + 4, &cp);
                } else if (memcmp(cp, "max_addr=", 9) == 0) {
index ba3ba8bc50bef1aa77758256ec818e000eb88ff4..456f57b087ca78c9b3ddbc7244b125a6657ef8fa 100644 (file)
@@ -275,7 +275,7 @@ static struct irqaction ipi_irqaction = {
 
 static struct irqaction resched_irqaction = {
        .handler =      dummy_handler,
-       .flags =        SA_INTERRUPT,
+       .flags =        IRQF_DISABLED,
        .name =         "resched"
 };
 #endif
index aa94f60fa8e7724ee04f83e665e9b762c97540ca..2ecb20b551e19e7b526fc57021bd4d83fa1b09ea 100644 (file)
@@ -521,19 +521,57 @@ pfm_sysctl_t pfm_sysctl;
 EXPORT_SYMBOL(pfm_sysctl);
 
 static ctl_table pfm_ctl_table[]={
-       {1, "debug", &pfm_sysctl.debug, sizeof(int), 0666, NULL, &proc_dointvec, NULL,},
-       {2, "debug_ovfl", &pfm_sysctl.debug_ovfl, sizeof(int), 0666, NULL, &proc_dointvec, NULL,},
-       {3, "fastctxsw", &pfm_sysctl.fastctxsw, sizeof(int), 0600, NULL, &proc_dointvec, NULL,},
-       {4, "expert_mode", &pfm_sysctl.expert_mode, sizeof(int), 0600, NULL, &proc_dointvec, NULL,},
-       { 0, },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "debug",
+               .data           = &pfm_sysctl.debug,
+               .maxlen         = sizeof(int),
+               .mode           = 0666,
+               .proc_handler   = &proc_dointvec,
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "debug_ovfl",
+               .data           = &pfm_sysctl.debug_ovfl,
+               .maxlen         = sizeof(int),
+               .mode           = 0666,
+               .proc_handler   = &proc_dointvec,
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "fastctxsw",
+               .data           = &pfm_sysctl.fastctxsw,
+               .maxlen         = sizeof(int),
+               .mode           = 0600,
+               .proc_handler   =  &proc_dointvec,
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "expert_mode",
+               .data           = &pfm_sysctl.expert_mode,
+               .maxlen         = sizeof(int),
+               .mode           = 0600,
+               .proc_handler   = &proc_dointvec,
+       },
+       {}
 };
 static ctl_table pfm_sysctl_dir[] = {
-       {1, "perfmon", NULL, 0, 0755, pfm_ctl_table, },
-       {0,},
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "perfmon",
+               .mode           = 0755,
+               .child          = pfm_ctl_table,
+       },
+       {}
 };
 static ctl_table pfm_sysctl_root[] = {
-       {1, "kernel", NULL, 0, 0755, pfm_sysctl_dir, },
-       {0,},
+       {
+               .ctl_name       = CTL_KERN,
+               .procname       = "kernel",
+               .mode           = 0755,
+               .child          = pfm_sysctl_dir,
+       },
+       {}
 };
 static struct ctl_table_header *pfm_sysctl_header;
 
@@ -621,7 +659,7 @@ EXPORT_PER_CPU_SYMBOL_GPL(pfm_syst_info);
 
 
 /* forward declaration */
-static struct file_operations pfm_file_ops;
+static const struct file_operations pfm_file_ops;
 
 /*
  * forward declarations
@@ -2126,7 +2164,7 @@ pfm_no_open(struct inode *irrelevant, struct file *dontcare)
 
 
 
-static struct file_operations pfm_file_ops = {
+static const struct file_operations pfm_file_ops = {
        .llseek   = no_llseek,
        .read     = pfm_read,
        .write    = pfm_write,
@@ -2301,12 +2339,11 @@ pfm_smpl_buffer_alloc(struct task_struct *task, pfm_context_t *ctx, unsigned lon
        DPRINT(("smpl_buf @%p\n", smpl_buf));
 
        /* allocate vma */
-       vma = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);
+       vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
        if (!vma) {
                DPRINT(("Cannot allocate vma\n"));
                goto error_kmem;
        }
-       memset(vma, 0, sizeof(*vma));
 
        /*
         * partially initialize the vma for the sampling buffer
@@ -6597,7 +6634,7 @@ found:
        return 0;
 }
 
-static struct file_operations pfm_proc_fops = {
+static const struct file_operations pfm_proc_fops = {
        .open           = pfm_proc_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -6689,7 +6726,7 @@ pfm_init(void)
        /*
         * create /proc/sys/kernel/perfmon (for debugging purposes)
         */
-       pfm_sysctl_header = register_sysctl_table(pfm_sysctl_root, 0);
+       pfm_sysctl_header = register_sysctl_table(pfm_sysctl_root);
 
        /*
         * initialize all our spinlocks
index 20bad78b5073d48ba454ee24131b01a81531861b..37c876f95dba38de4fbc4e30b159e6c472704a65 100644 (file)
@@ -194,9 +194,8 @@ static void __init
 chk_nointroute_opt(void)
 {
        char *cp;
-       extern char saved_command_line[];
 
-       for (cp = saved_command_line; *cp; ) {
+       for (cp = boot_command_line; *cp; ) {
                if (memcmp(cp, "nointroute", 10) == 0) {
                        no_int_routing = 1;
                        printk ("no_int_routing on\n");
index e375a2f0f2c34f67848948bdd918e0a867ace9f8..af9f8754d8474ac0b0660ca50eaa547fadeeadcc 100644 (file)
@@ -352,7 +352,7 @@ retry:
        return size;
 }
 
-static struct file_operations salinfo_event_fops = {
+static const struct file_operations salinfo_event_fops = {
        .open  = salinfo_event_open,
        .read  = salinfo_event_read,
 };
@@ -568,7 +568,7 @@ salinfo_log_write(struct file *file, const char __user *buffer, size_t count, lo
        return count;
 }
 
-static struct file_operations salinfo_data_fops = {
+static const struct file_operations salinfo_data_fops = {
        .open    = salinfo_log_open,
        .release = salinfo_log_release,
        .read    = salinfo_log_read,
index 83c2629e1c4c001cc56bae5fec820863dc9339fb..5fa09d141ab7a8545a963dfb1e9e60fdb316ea7e 100644 (file)
@@ -262,7 +262,7 @@ reserve_memory (void)
         * appropriate after a kernel panic.
         */
        {
-               char *from = strstr(saved_command_line, "crashkernel=");
+               char *from = strstr(boot_command_line, "crashkernel=");
                unsigned long base, size;
                if (from) {
                        size = memparse(from + 12, &from);
@@ -463,7 +463,7 @@ setup_arch (char **cmdline_p)
        ia64_patch_vtop((u64) __start___vtop_patchlist, (u64) __end___vtop_patchlist);
 
        *cmdline_p = __va(ia64_boot_param->command_line);
-       strlcpy(saved_command_line, *cmdline_p, COMMAND_LINE_SIZE);
+       strlcpy(boot_command_line, *cmdline_p, COMMAND_LINE_SIZE);
 
        efi_init();
        io_port_init();
index ab684747036fbcf71b6ce464a9561942f982e48d..765cbe5ba6ae280474761231db44d890ff74cbde 100644 (file)
@@ -24,8 +24,6 @@
 #include <asm/uaccess.h>
 #include <asm/kdebug.h>
 
-extern spinlock_t timerlist_lock;
-
 fpswa_interface_t *fpswa_interface;
 EXPORT_SYMBOL(fpswa_interface);
 
@@ -53,34 +51,6 @@ trap_init (void)
                fpswa_interface = __va(ia64_boot_param->fpswa);
 }
 
-/*
- * Unlock any spinlocks which will prevent us from getting the message out (timerlist_lock
- * is acquired through the console unblank code)
- */
-void
-bust_spinlocks (int yes)
-{
-       int loglevel_save = console_loglevel;
-
-       if (yes) {
-               oops_in_progress = 1;
-               return;
-       }
-
-#ifdef CONFIG_VT
-       unblank_screen();
-#endif
-       oops_in_progress = 0;
-       /*
-        * OK, the message is on the console.  Now we call printk() without
-        * oops_in_progress set so that printk will give klogd a poke.  Hold onto
-        * your hats...
-        */
-       console_loglevel = 15;          /* NMI oopser may have shut the console up */
-       printk(" ");
-       console_loglevel = loglevel_save;
-}
-
 void
 die (const char *str, struct pt_regs *regs, long err)
 {
index 8f3d0066f4468cffbb980ce04e091ea48c4b6106..25dd55e4db2482985e86563599be0f05ec74058b 100644 (file)
@@ -111,12 +111,14 @@ SECTIONS
   .init.data : AT(ADDR(.init.data) - LOAD_OFFSET)
        { *(.init.data) }
 
+#ifdef CONFIG_BLK_DEV_INITRD
   .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET)
        {
          __initramfs_start = .;
          *(.init.ramfs)
          __initramfs_end = .;
        }
+#endif
 
    . = ALIGN(16);
   .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET)
index 63e6d49c5813ed2bac5d027f0668a80080544a97..ca4d41e5f177563c5739816c14ee563dc51ed87b 100644 (file)
@@ -259,9 +259,11 @@ paging_init (void)
        num_physpages = 0;
        efi_memmap_walk(count_pages, &num_physpages);
 
-       max_dma = virt_to_phys((void *) MAX_DMA_ADDRESS) >> PAGE_SHIFT;
        memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
+#ifdef CONFIG_ZONE_DMA
+       max_dma = virt_to_phys((void *) MAX_DMA_ADDRESS) >> PAGE_SHIFT;
        max_zone_pfns[ZONE_DMA] = max_dma;
+#endif
        max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
 
 #ifdef CONFIG_VIRTUAL_MEM_MAP
index 6eae596c509d5cc5c17a5ebc5b5702f4e6d6bf01..16835108bb5bc71a3e19cdcc1f582473ce89899c 100644 (file)
@@ -37,7 +37,9 @@ struct early_node_data {
        unsigned long pernode_size;
        struct bootmem_data bootmem_data;
        unsigned long num_physpages;
+#ifdef CONFIG_ZONE_DMA
        unsigned long num_dma_physpages;
+#endif
        unsigned long min_pfn;
        unsigned long max_pfn;
 };
@@ -633,9 +635,11 @@ static __init int count_node_pages(unsigned long start, unsigned long len, int n
        unsigned long end = start + len;
 
        mem_data[node].num_physpages += len >> PAGE_SHIFT;
+#ifdef CONFIG_ZONE_DMA
        if (start <= __pa(MAX_DMA_ADDRESS))
                mem_data[node].num_dma_physpages +=
                        (min(end, __pa(MAX_DMA_ADDRESS)) - start) >>PAGE_SHIFT;
+#endif
        start = GRANULEROUNDDOWN(start);
        start = ORDERROUNDDOWN(start);
        end = GRANULEROUNDUP(end);
@@ -688,7 +692,9 @@ void __init paging_init(void)
        }
 
        memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
+#ifdef CONFIG_ZONE_DMA
        max_zone_pfns[ZONE_DMA] = max_dma;
+#endif
        max_zone_pfns[ZONE_NORMAL] = max_pfn;
        free_area_init_nodes(max_zone_pfns);
 
index faaca21a3718c5e7b5b82ed7a5b04fbc7c586a8e..f225dd72968b3bdd159b1b7c0552eec66b3c92e2 100644 (file)
@@ -68,7 +68,7 @@ max_pgt_pages(void)
 #ifndef        CONFIG_NUMA
        node_free_pages = nr_free_pages();
 #else
-       node_free_pages = nr_free_pages_pgdat(NODE_DATA(numa_node_id()));
+       node_free_pages = node_page_state(numa_node_id(), NR_FREE_PAGES);
 #endif
        max_pgt_pages = node_free_pages / PGT_FRACTION_OF_NODE_MEM;
        max_pgt_pages = max(max_pgt_pages, MIN_PGT_PAGES);
@@ -176,9 +176,8 @@ ia64_init_addr_space (void)
         * the problem.  When the process attempts to write to the register backing store
         * for the first time, it will get a SEGFAULT in this case.
         */
-       vma = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);
+       vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
        if (vma) {
-               memset(vma, 0, sizeof(*vma));
                vma->vm_mm = current->mm;
                vma->vm_start = current->thread.rbs_bot & PAGE_MASK;
                vma->vm_end = vma->vm_start + PAGE_SIZE;
@@ -195,9 +194,8 @@ ia64_init_addr_space (void)
 
        /* map NaT-page at address zero to speed up speculative dereferencing of NULL: */
        if (!(current->personality & MMAP_PAGE_ZERO)) {
-               vma = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);
+               vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
                if (vma) {
-                       memset(vma, 0, sizeof(*vma));
                        vma->vm_mm = current->mm;
                        vma->vm_end = PAGE_SIZE;
                        vma->vm_page_prot = __pgprot(pgprot_val(PAGE_READONLY) | _PAGE_MA_NAT);
index d9d306c79f2d7a1743369380e637c4118d012c22..601747b1e22aa82c54dba040f6cb31034436facf 100644 (file)
@@ -455,7 +455,7 @@ static int sn2_ptc_proc_open(struct inode *inode, struct file *file)
        return seq_open(file, &sn2_ptc_seq_ops);
 }
 
-static struct file_operations proc_sn2_ptc_operations = {
+static const struct file_operations proc_sn2_ptc_operations = {
        .open = sn2_ptc_proc_open,
        .read = seq_read,
        .llseek = seq_lseek,
index 33367996d72d595b180179977b4a20e6c3b929bc..6da9854751cd9be20d0035fa32b037f6ef6590c0 100644 (file)
@@ -865,7 +865,7 @@ error:
        return r;
 }
 
-static struct file_operations sn_hwperf_fops = {
+static const struct file_operations sn_hwperf_fops = {
        .ioctl = sn_hwperf_ioctl,
 };
 
index 43ddc2eccb965bd3c71d372e1afc6c53505babc4..62b3e9a496acc7bd0d716c74931cd6e58db78bf5 100644 (file)
@@ -89,61 +89,80 @@ static int coherence_id_open(struct inode *inode, struct file *file)
        return single_open(file, coherence_id_show, NULL);
 }
 
-static struct proc_dir_entry
-*sn_procfs_create_entry(const char *name, struct proc_dir_entry *parent,
-                       int (*openfunc)(struct inode *, struct file *),
-       int (*releasefunc)(struct inode *, struct file *),
-       ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *))
-{
-       struct proc_dir_entry *e = create_proc_entry(name, 0444, parent);
-
-       if (e) {
-               struct file_operations *f;
-
-               f = kzalloc(sizeof(*f), GFP_KERNEL);
-               if (f) {
-                       f->open = openfunc;
-                       f->read = seq_read;
-                       f->llseek = seq_lseek;
-                       f->release = releasefunc;
-                       f->write = write;
-                       e->proc_fops = f;
-               }
-       }
-
-       return e;
-}
-
 /* /proc/sgi_sn/sn_topology uses seq_file, see sn_hwperf.c */
 extern int sn_topology_open(struct inode *, struct file *);
 extern int sn_topology_release(struct inode *, struct file *);
 
+static const struct file_operations proc_partition_id_fops = {
+       .open           = partition_id_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
+static const struct file_operations proc_system_sn_fops = {
+       .open           = system_serial_number_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
+static const struct file_operations proc_license_id_fops = {
+       .open           = licenseID_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
+static const struct file_operations proc_sn_force_intr_fops = {
+       .open           = sn_force_interrupt_open,
+       .read           = seq_read,
+       .write          = sn_force_interrupt_write_proc,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
+static const struct file_operations proc_coherence_id_fops = {
+       .open           = coherence_id_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
+static const struct file_operations proc_sn_topo_fops = {
+       .open           = sn_topology_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = sn_topology_release,
+};
+
 void register_sn_procfs(void)
 {
        static struct proc_dir_entry *sgi_proc_dir = NULL;
+       struct proc_dir_entry *pde;
 
        BUG_ON(sgi_proc_dir != NULL);
        if (!(sgi_proc_dir = proc_mkdir("sgi_sn", NULL)))
                return;
 
-       sn_procfs_create_entry("partition_id", sgi_proc_dir,
-               partition_id_open, single_release, NULL);
-
-       sn_procfs_create_entry("system_serial_number", sgi_proc_dir,
-               system_serial_number_open, single_release, NULL);
-
-       sn_procfs_create_entry("licenseID", sgi_proc_dir, 
-               licenseID_open, single_release, NULL);
-
-       sn_procfs_create_entry("sn_force_interrupt", sgi_proc_dir,
-               sn_force_interrupt_open, single_release,
-               sn_force_interrupt_write_proc);
-
-       sn_procfs_create_entry("coherence_id", sgi_proc_dir, 
-               coherence_id_open, single_release, NULL);
-       
-       sn_procfs_create_entry("sn_topology", sgi_proc_dir,
-               sn_topology_open, sn_topology_release, NULL);
+       pde = create_proc_entry("partition_id", 0444, sgi_proc_dir);
+       if (pde)
+               pde->proc_fops = &proc_partition_id_fops;
+       pde = create_proc_entry("system_serial_number", 0444, sgi_proc_dir);
+       if (pde)
+               pde->proc_fops = &proc_system_sn_fops;
+       pde = create_proc_entry("licenseID", 0444, sgi_proc_dir);
+       if (pde)
+               pde->proc_fops = &proc_license_id_fops;
+       pde = create_proc_entry("sn_force_interrupt", 0644, sgi_proc_dir);
+       if (pde)
+               pde->proc_fops = &proc_sn_force_intr_fops;
+       pde = create_proc_entry("coherence_id", 0444, sgi_proc_dir);
+       if (pde)
+               pde->proc_fops = &proc_coherence_id_fops;
+       pde = create_proc_entry("sn_topology", 0444, sgi_proc_dir);
+       if (pde)
+               pde->proc_fops = &proc_sn_topo_fops;
 }
 
 #endif /* CONFIG_PROC_FS */
index 7a387d2373637a7ba9801f0691820674680ae24f..68355ef6f84170096b52aee5938a390143841e10 100644 (file)
@@ -101,67 +101,57 @@ static int xpc_disengage_request_max_timelimit = 120;
 
 static ctl_table xpc_sys_xpc_hb_dir[] = {
        {
-               1,
-               "hb_interval",
-               &xpc_hb_interval,
-               sizeof(int),
-               0644,
-               NULL,
-               &proc_dointvec_minmax,
-               &sysctl_intvec,
-               NULL,
-               &xpc_hb_min_interval,
-               &xpc_hb_max_interval
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "hb_interval",
+               .data           = &xpc_hb_interval,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xpc_hb_min_interval,
+               .extra2         = &xpc_hb_max_interval
        },
        {
-               2,
-               "hb_check_interval",
-               &xpc_hb_check_interval,
-               sizeof(int),
-               0644,
-               NULL,
-               &proc_dointvec_minmax,
-               &sysctl_intvec,
-               NULL,
-               &xpc_hb_check_min_interval,
-               &xpc_hb_check_max_interval
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "hb_check_interval",
+               .data           = &xpc_hb_check_interval,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xpc_hb_check_min_interval,
+               .extra2         = &xpc_hb_check_max_interval
        },
-       {0}
+       {}
 };
 static ctl_table xpc_sys_xpc_dir[] = {
        {
-               1,
-               "hb",
-               NULL,
-               0,
-               0555,
-               xpc_sys_xpc_hb_dir
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "hb",
+               .mode           = 0555,
+               .child          = xpc_sys_xpc_hb_dir
        },
        {
-               2,
-               "disengage_request_timelimit",
-               &xpc_disengage_request_timelimit,
-               sizeof(int),
-               0644,
-               NULL,
-               &proc_dointvec_minmax,
-               &sysctl_intvec,
-               NULL,
-               &xpc_disengage_request_min_timelimit,
-               &xpc_disengage_request_max_timelimit
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "disengage_request_timelimit",
+               .data           = &xpc_disengage_request_timelimit,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xpc_disengage_request_min_timelimit,
+               .extra2         = &xpc_disengage_request_max_timelimit
        },
-       {0}
+       {}
 };
 static ctl_table xpc_sys_dir[] = {
        {
-               1,
-               "xpc",
-               NULL,
-               0,
-               0555,
-               xpc_sys_xpc_dir
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "xpc",
+               .mode           = 0555,
+               .child          = xpc_sys_xpc_dir
        },
-       {0}
+       {}
 };
 static struct ctl_table_header *xpc_sysctl;
 
@@ -1251,7 +1241,7 @@ xpc_init(void)
        snprintf(xpc_part->bus_id, BUS_ID_SIZE, "part");
        snprintf(xpc_chan->bus_id, BUS_ID_SIZE, "chan");
 
-       xpc_sysctl = register_sysctl_table(xpc_sys_dir, 1);
+       xpc_sysctl = register_sysctl_table(xpc_sys_dir);
 
        /*
         * The first few fields of each entry of xpc_partitions[] need to
index f383dab973f5ea62d86f914a5774357be3ea7a4d..9740d6b8ae11c407ae56d4c88bf6b179056deceb 100644 (file)
@@ -16,6 +16,10 @@ config GENERIC_ISA_DMA
        bool
        default y
 
+config ZONE_DMA
+       bool
+       default y
+
 config GENERIC_HARDIRQS
        bool
        default y
@@ -24,6 +28,9 @@ config GENERIC_IRQ_PROBE
        bool
        default y
 
+config NO_IOPORT
+       def_bool y
+
 source "init/Kconfig"
 
 
index f219c47d334fefd3c12892ecf7ffd640e8fda1ed..cdf63b210c53d68d7ebad661498515401851fb05 100644 (file)
@@ -7,7 +7,7 @@
 
 LDFLAGS                :=
 OBJCOPYFLAGS   := -O binary -R .note -R .comment -S
-LDFLAGS_vmlinux        := -e startup_32
+LDFLAGS_vmlinux        :=
 
 CFLAGS += -pipe -fno-schedule-insns
 CFLAGS_KERNEL += -mmodel=medium
index 853093093168e40bede4a8df4baa86dc0931af2f..13579917afef09e621bdfbf6fd08e6393e90f174 100644 (file)
@@ -1,20 +1,18 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc5
-# Fri Jun  3 16:20:11 2005
+# Linux kernel version: 2.6.19
+# Tue Dec 12 17:52:38 2006
 #
 CONFIG_M32R=y
-# CONFIG_UID16 is not set
 CONFIG_GENERIC_ISA_DMA=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
-CONFIG_BROKEN_ON_SMP=y
 CONFIG_LOCK_KERNEL=y
 CONFIG_INIT_ENV_ARG_LIMIT=32
 
@@ -22,32 +20,40 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 # General setup
 #
 CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
 # CONFIG_POSIX_MQUEUE is not set
 CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
-CONFIG_SYSCTL=y
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
 # CONFIG_AUDIT is not set
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
-# CONFIG_IKCONFIG_PROC is not set
+CONFIG_IKCONFIG_PROC=y
+# CONFIG_CPUSETS is not set
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
 CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
 # CONFIG_KALLSYMS is not set
+CONFIG_HOTPLUG=y
 CONFIG_PRINTK=y
 CONFIG_BUG=y
+CONFIG_ELF_CORE=y
 CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SHMEM=y
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
 
 #
 # Loadable module support
@@ -55,10 +61,29 @@ CONFIG_BASE_SMALL=0
 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=y
+CONFIG_STOP_MACHINE=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+
+#
+# IO Schedulers
+#
+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 is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
 
 #
 # Processor type and features
@@ -70,8 +95,10 @@ CONFIG_PLAT_M32700UT=y
 # CONFIG_PLAT_OAKS32R is not set
 # CONFIG_PLAT_MAPPI2 is not set
 # CONFIG_PLAT_MAPPI3 is not set
+# CONFIG_PLAT_M32104UT is not set
 CONFIG_CHIP_M32700=y
 # CONFIG_CHIP_M32102 is not set
+# CONFIG_CHIP_M32104 is not set
 # CONFIG_CHIP_VDEC2 is not set
 # CONFIG_CHIP_OPSP is not set
 CONFIG_MMU=y
@@ -85,34 +112,39 @@ CONFIG_TIMER_DIVIDE=128
 CONFIG_MEMORY_START=0x08000000
 CONFIG_MEMORY_SIZE=0x01000000
 CONFIG_NOHIGHMEM=y
-# CONFIG_DISCONTIGMEM is not set
+CONFIG_ARCH_DISCONTIGMEM_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_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_IRAM_START=0x00f00000
+CONFIG_IRAM_SIZE=0x00080000
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_PREEMPT=y
-# CONFIG_HAVE_DEC_LOCK is not set
-# CONFIG_SMP is not set
+CONFIG_SMP=y
+# CONFIG_CHIP_M32700_TS1 is not set
+CONFIG_NR_CPUS=2
+CONFIG_NODES_SHIFT=1
 
 #
 # Bus options (PCI, PCMCIA, EISA, MCA, ISA)
 #
-# CONFIG_PCI is not set
 # CONFIG_ISA is not set
 
 #
 # PCCARD (PCMCIA/CardBus) support
 #
-CONFIG_PCCARD=y
-# CONFIG_PCMCIA_DEBUG is not set
-CONFIG_PCMCIA=y
-
-#
-# PC-card bridges
-#
-# CONFIG_TCIC is not set
-# CONFIG_M32R_PCC is not set
-CONFIG_M32R_CFC=y
-CONFIG_M32R_CFC_NUM=1
+# CONFIG_PCCARD is not set
 
 #
 # PCI Hotplug Support
@@ -124,6 +156,94 @@ CONFIG_M32R_CFC_NUM=1
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# 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_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_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK 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
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC 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_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED 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
 #
@@ -133,12 +253,100 @@ CONFIG_BINFMT_ELF=y
 #
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
+CONFIG_FW_LOADER=y
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
 
 #
 # Memory Technology Devices (MTD)
 #
-# CONFIG_MTD is not set
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_REDBOOT_PARTS=y
+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
+# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+# CONFIG_MTD_CHAR is not set
+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
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=m
+CONFIG_MTD_JEDECPROBE=m
+CONFIG_MTD_GEN_PROBE=m
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+# CONFIG_MTD_CFI_NOSWAP is not set
+CONFIG_MTD_CFI_BE_BYTE_SWAP=y
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+CONFIG_MTD_CFI_GEOMETRY=y
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+# CONFIG_MTD_CFI_I2 is not set
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_OTP is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+CONFIG_MTD_CFI_AMDSTD=m
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=m
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
 
 #
 # Parallel port support
@@ -152,7 +360,6 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 #
 # Block devices
 #
-# CONFIG_BLK_DEV_FD is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
@@ -160,23 +367,21 @@ CONFIG_BLK_DEV_NBD=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
 # CONFIG_BLK_DEV_INITRD is not set
-CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CDROM_PKTCDVD is not set
+CONFIG_ATA_OVER_ETH=m
 
 #
-# IO Schedulers
+# Misc devices
 #
-CONFIG_IOSCHED_NOOP=y
-# CONFIG_IOSCHED_AS is not set
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_TIFM_CORE is not set
 
 #
 # ATA/ATAPI/MFM/RLL support
 #
 CONFIG_IDE=y
+CONFIG_IDE_MAX_HWIFS=4
 CONFIG_BLK_DEV_IDE=y
 
 #
@@ -185,7 +390,6 @@ CONFIG_BLK_DEV_IDE=y
 # CONFIG_BLK_DEV_IDE_SATA is not set
 CONFIG_BLK_DEV_IDEDISK=y
 # CONFIG_IDEDISK_MULTI_MODE is not set
-CONFIG_BLK_DEV_IDECS=y
 CONFIG_BLK_DEV_IDECD=m
 # CONFIG_BLK_DEV_IDETAPE is not set
 # CONFIG_BLK_DEV_IDEFLOPPY is not set
@@ -204,7 +408,9 @@ CONFIG_IDE_GENERIC=y
 #
 # SCSI device support
 #
+# CONFIG_RAID_ATTRS is not set
 CONFIG_SCSI=m
+# CONFIG_SCSI_NETLINK is not set
 CONFIG_SCSI_PROC_FS=y
 
 #
@@ -216,6 +422,7 @@ CONFIG_BLK_DEV_SD=m
 CONFIG_BLK_DEV_SR=m
 # CONFIG_BLK_DEV_SR_VENDOR is not set
 CONFIG_CHR_DEV_SG=m
+# CONFIG_CHR_DEV_SCH is not set
 
 #
 # Some SCSI devices (e.g. CD jukebox) support multiple LUNs
@@ -225,26 +432,23 @@ CONFIG_SCSI_MULTI_LUN=y
 # CONFIG_SCSI_LOGGING is not set
 
 #
-# SCSI Transport Attributes
+# SCSI Transports
 #
 # CONFIG_SCSI_SPI_ATTRS is not set
 # CONFIG_SCSI_FC_ATTRS is not set
 # CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
 
 #
 # SCSI low-level drivers
 #
-# CONFIG_SCSI_SATA is not set
+# CONFIG_ISCSI_TCP is not set
 # CONFIG_SCSI_DEBUG is not set
 
 #
-# PCMCIA SCSI adapter support
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
 #
-# CONFIG_PCMCIA_AHA152X is not set
-# CONFIG_PCMCIA_FDOMAIN is not set
-# CONFIG_PCMCIA_NINJA_SCSI is not set
-# CONFIG_PCMCIA_QLOGIC is not set
-# CONFIG_PCMCIA_SYM53C500 is not set
 
 #
 # Multi-device support (RAID and LVM)
@@ -254,6 +458,7 @@ CONFIG_SCSI_MULTI_LUN=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -264,75 +469,19 @@ CONFIG_SCSI_MULTI_LUN=y
 #
 
 #
-# Networking support
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_UNIX=y
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-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_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_IP_TCPDIAG=y
-# CONFIG_IP_TCPDIAG_IPV6 is not set
-# CONFIG_IPV6 is not set
-# CONFIG_NETFILTER 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
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
-
-#
-# Network testing
+# Network device support
 #
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
 CONFIG_NETDEVICES=y
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
 
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -358,11 +507,6 @@ CONFIG_SMC91X=y
 #
 # CONFIG_NET_RADIO is not set
 
-#
-# PCMCIA network device support
-#
-# CONFIG_NET_PCMCIA is not set
-
 #
 # Wan interfaces
 #
@@ -371,6 +515,8 @@ CONFIG_SMC91X=y
 # 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
@@ -386,6 +532,7 @@ CONFIG_SMC91X=y
 # Input device support
 #
 CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
 
 #
 # Userland interfaces
@@ -414,7 +561,6 @@ CONFIG_SERIO_SERPORT=y
 # CONFIG_SERIO_LIBPS2 is not set
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
@@ -422,6 +568,7 @@ CONFIG_SOUND_GAMEPORT=y
 CONFIG_VT=y
 CONFIG_VT_CONSOLE=y
 CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
 
 #
@@ -450,8 +597,8 @@ CONFIG_LEGACY_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
 # CONFIG_RTC is not set
-# CONFIG_GEN_RTC is not set
 CONFIG_DS1302=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
@@ -459,52 +606,64 @@ CONFIG_DS1302=y
 #
 # Ftape, the floppy tape device driver
 #
-# CONFIG_DRM is not set
-
-#
-# PCMCIA character devices
-#
-# CONFIG_SYNCLINK_CS is not set
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 
 #
 # I2C support
 #
 # CONFIG_I2C is not set
 
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
 #
 # Dallas's 1-wire bus
 #
 # CONFIG_W1 is not set
 
 #
-# Misc devices
+# Hardware Monitoring support
 #
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
 
 #
 # Multimedia devices
 #
-CONFIG_VIDEO_DEV=y
+CONFIG_VIDEO_DEV=m
+CONFIG_VIDEO_V4L1=y
+CONFIG_VIDEO_V4L1_COMPAT=y
+CONFIG_VIDEO_V4L2=y
 
 #
-# Video For Linux
+# Video Capture Adapters
 #
 
 #
-# Video Adapters
+# Video Capture Adapters
 #
+# CONFIG_VIDEO_ADV_DEBUG is not set
+CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
+# CONFIG_VIDEO_VIVI is not set
 # CONFIG_VIDEO_CPIA is not set
-CONFIG_VIDEO_M32R_AR=y
-CONFIG_VIDEO_M32R_AR_M64278=y
+CONFIG_VIDEO_M32R_AR=m
+CONFIG_VIDEO_M32R_AR_M64278=m
 
 #
 # Radio Adapters
 #
-# CONFIG_RADIO_MAESTRO is not set
 
 #
 # Digital Video Broadcasting Devices
@@ -514,15 +673,16 @@ CONFIG_VIDEO_M32R_AR_M64278=y
 #
 # Graphics support
 #
+CONFIG_FIRMWARE_EDID=y
 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_BACKLIGHT is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_S1D13XXX=y
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -531,6 +691,7 @@ CONFIG_FB=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
@@ -542,6 +703,7 @@ CONFIG_LOGO=y
 CONFIG_LOGO_LINUX_MONO=y
 CONFIG_LOGO_LINUX_VGA16=y
 CONFIG_LOGO_LINUX_CLUT224=y
+CONFIG_LOGO_M32R_CLUT224=y
 # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
@@ -554,6 +716,11 @@ CONFIG_LOGO_LINUX_CLUT224=y
 #
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
 
 #
 # USB Gadget Support
@@ -563,23 +730,62 @@ CONFIG_LOGO_LINUX_CLUT224=y
 #
 # MMC/SD Card support
 #
-# CONFIG_MMC is not set
+CONFIG_MMC=y
+CONFIG_MMC_DEBUG=y
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_TIFM_SD is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
 
 #
 # InfiniBand support
 #
-# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
 
 #
 # File systems
 #
 CONFIG_EXT2_FS=y
 # CONFIG_EXT2_FS_XATTR is not set
-CONFIG_EXT3_FS=m
+# 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=m
+# CONFIG_EXT4DEV_FS is not set
+CONFIG_JBD=y
 CONFIG_JBD_DEBUG=y
 CONFIG_FS_MBCACHE=y
 CONFIG_REISERFS_FS=m
@@ -587,17 +793,19 @@ CONFIG_REISERFS_FS=m
 # CONFIG_REISERFS_PROC_INFO is not set
 # CONFIG_REISERFS_FS_XATTR is not set
 # CONFIG_JFS_FS is not set
-
-#
-# XFS support
-#
+# CONFIG_FS_POSIX_ACL is not set
 # CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
 # CONFIG_QUOTA is not set
 CONFIG_DNOTIFY=y
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
 
 #
 # CD-ROM/DVD Filesystems
@@ -623,15 +831,13 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
 #
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
 CONFIG_SYSFS=y
-CONFIG_DEVFS_FS=y
-CONFIG_DEVFS_MOUNT=y
-# CONFIG_DEVFS_DEBUG is not set
-# CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
-# CONFIG_TMPFS_XATTR is not set
+# CONFIG_TMPFS_POSIX_ACL is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
 
 #
 # Miscellaneous filesystems
@@ -643,6 +849,8 @@ CONFIG_RAMFS=y
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
+# CONFIG_JFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
 # CONFIG_CRAMFS is not set
 # CONFIG_VXFS_FS is not set
 # CONFIG_HPFS_FS is not set
@@ -655,12 +863,14 @@ CONFIG_RAMFS=y
 #
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
 # CONFIG_NFS_V4 is not set
 # CONFIG_NFS_DIRECTIO is not set
 # CONFIG_NFSD is not set
 CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
 # CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
@@ -669,6 +879,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
@@ -723,16 +934,23 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 #
 # Profiling support
 #
-# CONFIG_PROFILING is not set
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=y
 
 #
 # Kernel hacking
 #
 # CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
 # CONFIG_DEBUG_KERNEL is not set
-CONFIG_LOG_BUF_SHIFT=14
+CONFIG_LOG_BUF_SHIFT=15
 # CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_FS is not set
 # CONFIG_FRAME_POINTER is not set
+# CONFIG_UNWIND_INFO is not set
+# CONFIG_HEADERS_CHECK is not set
 
 #
 # Security options
@@ -745,13 +963,10 @@ CONFIG_LOG_BUF_SHIFT=14
 #
 # CONFIG_CRYPTO 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
index 0d3c8ee0e03d9fc21de2fd05f160d7d612d993a2..dab7436d7bbe85e2997c18b43b5082e4eece4255 100644 (file)
@@ -7,8 +7,6 @@
  *                            Hitoshi Yamamoto
  */
 
-/* $Id$ */
-
 #include <linux/init.h>
 __INIT
 __INITDATA
index 44cbe0ce0f8fb21681590509e76af47ac9696727..a689e2978b6e382bdad4f9fcd56fbf194a1ddb6f 100644 (file)
@@ -174,7 +174,7 @@ void show_regs(struct pt_regs * regs)
          regs->acc1h, regs->acc1l);
 #elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
        printk("ACCH[%08lx]:ACCL[%08lx]\n", \
-         regs->acch, regs->accl);
+         regs->acc0h, regs->acc0l);
 #else
 #error unknown isa configuration
 #endif
index 936205f7aba079284ad4ad82318850f13659b1b0..d64814385d705624d504333fe0b204ef63870b43 100644 (file)
@@ -64,7 +64,7 @@ struct screen_info screen_info = {
 
 extern int root_mountflags;
 
-static char command_line[COMMAND_LINE_SIZE];
+static char __initdata command_line[COMMAND_LINE_SIZE];
 
 static struct resource data_resource = {
        .name   = "Kernel data",
@@ -95,8 +95,8 @@ static __inline__ void parse_mem_cmdline(char ** cmdline_p)
        int usermem = 0;
 
        /* Save unparsed command line copy for /proc/cmdline */
-       memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
-       saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
+       memcpy(boot_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
+       boot_command_line[COMMAND_LINE_SIZE-1] = '\0';
 
        memory_start = (unsigned long)CONFIG_MEMORY_START+PAGE_OFFSET;
        memory_end = memory_start+(unsigned long)CONFIG_MEMORY_SIZE;
index 092ea86bb0794a473780c2b474197f2bcf4ef1ee..4b156054baa6306f0d1d5d774c3f972809951737 100644 (file)
@@ -109,19 +109,10 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
        COPY(r10);
        COPY(r11);
        COPY(r12);
-#if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2)
        COPY(acc0h);
        COPY(acc0l);
-       COPY(acc1h);
-       COPY(acc1l);
-#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
-       COPY(acch);
-       COPY(accl);
-       COPY(dummy_acc1h);
-       COPY(dummy_acc1l);
-#else
-#error unknown isa configuration
-#endif
+       COPY(acc1h);            /* ISA_DSP_LEVEL2 only */
+       COPY(acc1l);            /* ISA_DSP_LEVEL2 only */
        COPY(psw);
        COPY(bpc);
        COPY(bbpsw);
@@ -196,19 +187,10 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
        COPY(r10);
        COPY(r11);
        COPY(r12);
-#if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2)
        COPY(acc0h);
        COPY(acc0l);
-       COPY(acc1h);
-       COPY(acc1l);
-#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
-       COPY(acch);
-       COPY(accl);
-       COPY(dummy_acc1h);
-       COPY(dummy_acc1l);
-#else
-#error unknown isa configuration
-#endif
+       COPY(acc1h);            /* ISA_DSP_LEVEL2 only */
+       COPY(acc1l);            /* ISA_DSP_LEVEL2 only */
        COPY(psw);
        COPY(bpc);
        COPY(bbpsw);
index a09038282c78a3f5b452f4c4cbbf06120283d15f..3858c9f39ba5fb2362ad60e5ce381514e5c7c933 100644 (file)
@@ -286,11 +286,3 @@ void __init time_init(void)
 #error no chip configuration
 #endif
 }
-
-/*
- *  Scheduler clock - returns current time in nanosec units.
- */
-unsigned long long sched_clock(void)
-{
-       return (unsigned long long)jiffies * (1000000000 / HZ);
-}
index 358b9cee2c6585c0a84d42e9e22ef4c7fbe52b64..439cc257cd1df7faf55a57051530d65be3dac13b 100644 (file)
@@ -6,12 +6,15 @@
 #include <asm/page.h>
 
 OUTPUT_ARCH(m32r)
-ENTRY(startup_32)
 #if defined(__LITTLE_ENDIAN__)
        jiffies = jiffies_64;
 #else
        jiffies = jiffies_64 + 4;
 #endif
+
+kernel_entry = boot - 0x80000000;
+ENTRY(kernel_entry)
+
 SECTIONS
 {
   . = CONFIG_MEMORY_START + __PAGE_OFFSET;
@@ -99,10 +102,14 @@ SECTIONS
      from .altinstructions and .eh_frame */
   .exit.text : { *(.exit.text) }
   .exit.data : { *(.exit.data) }
+
+#ifdef CONFIG_BLK_DEV_INITRD
   . = ALIGN(4096);
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
   __initramfs_end = .;
+#endif
+
   . = ALIGN(32);
   __per_cpu_start = .;
   .data.percpu  : { *(.data.percpu) }
index 107594b65d58315059fd86f0cfe02c284cb6fc95..7fc0c19801ba4a3a688a8e8bd6e95daa8c1d9137 100644 (file)
@@ -4,8 +4,6 @@
  * Copyright (C) 2001,2002  Hiroyuki Kondo, and Hirokazu Takata
  *
  */
-/* $Id$ */
-
 
 ;
 ;      input   (r0,r1)  src
@@ -293,4 +291,3 @@ __lshrdi3:
 #endif /* not CONFIG_ISA_DUAL_ISSUE */
 
        .end
-
index cfbe00e5184a7dcbfb189cfde256942060e9f95f..0af0360c76d9505f2ce1965f3fc9e337830d1f46 100644 (file)
@@ -25,8 +25,6 @@
  *             as published by the Free Software Foundation; either version
  *             2 of the License, or (at your option) any later version.
  */
-/* $Id$ */
-
 
 #include <linux/linkage.h>
 #include <asm/assembler.h>
@@ -319,3 +317,4 @@ ENTRY(csum_partial_copy_generic)
        nop
        nop
 
+       .end
index 06382a38c3185f79242b2dbec8a3f12850bccced..59bfc34e0d9f8aa86ded52d4145592af889aec1f 100644 (file)
@@ -5,8 +5,6 @@
  * Copyright (c) 2004  Hirokazu Takata
  */
 
-/* $Id$ */
-
 #include <linux/param.h>
 #ifdef CONFIG_SMP
 #include <linux/sched.h>
index 2089a215314eb5aff9c18f032182bc0693696584..05987cd639ef70b9fa193ff3c0351e4f9215b4e0 100644 (file)
@@ -10,8 +10,6 @@
  *        src: r1
  *        n  : r2
  */
-/* $Id$ */
-
 
        .text
 #include <linux/linkage.h>
index b47fa3537aa4f16067473a9b7085beea3f79d6de..2b2831a379273730c79c026e64bc911d3e456caa 100644 (file)
@@ -12,8 +12,6 @@
  *        ret: r0
  *
  */
-/* $Id$ */
-
 
        .text
        .global memset
index 5f41aacd7b3e43f71ab10ed5fba0e07acd76b84a..916de9e8f80121cdbdc51d733b11d382636a0292 100644 (file)
@@ -6,8 +6,6 @@
  *  size_t strlen(const char *s);
  *
  */
-/* $Id$ */
-
 
 #include <linux/linkage.h>
 #include <asm/assembler.h>
index 454de336803a10b971d77ab2a98e3cd72dbe11c8..7b68fe8d921e2b8328f4d9cd58842090a9d11292 100644 (file)
@@ -1,20 +1,20 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.14
-# Wed Nov  9 16:04:51 2005
+# Linux kernel version: 2.6.19
+# Wed Dec 13 17:22:20 2006
 #
 CONFIG_M32R=y
-# CONFIG_UID16 is not set
 CONFIG_GENERIC_ISA_DMA=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
 CONFIG_BROKEN_ON_SMP=y
+CONFIG_LOCK_KERNEL=y
 CONFIG_INIT_ENV_ARG_LIMIT=32
 
 #
@@ -22,33 +22,66 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 #
 CONFIG_LOCALVERSION=""
 CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
 # CONFIG_POSIX_MQUEUE is not set
 # CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
 # CONFIG_AUDIT is not set
-CONFIG_HOTPLUG=y
-# CONFIG_KOBJECT_UEVENT is not set
-# CONFIG_IKCONFIG is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
 CONFIG_INITRAMFS_SOURCE=""
-CONFIG_EMBEDDED=y
-# CONFIG_KALLSYMS is not set
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+# CONFIG_EMBEDDED is not set
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
 CONFIG_PRINTK=y
 CONFIG_BUG=y
+CONFIG_ELF_CORE=y
 CONFIG_BASE_FULL=y
-# CONFIG_FUTEX is not set
-# CONFIG_EPOLL is not set
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
 CONFIG_TINY_SHMEM=y
 CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
 
 #
 # Loadable module support
 #
-# CONFIG_MODULES is not set
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE 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"
 
 #
 # Processor type and features
@@ -70,40 +103,40 @@ CONFIG_ISA_M32R=y
 CONFIG_BUS_CLOCK=54000000
 CONFIG_TIMER_DIVIDE=128
 # CONFIG_CPU_LITTLE_ENDIAN is not set
-CONFIG_MEMORY_START=04000000
-CONFIG_MEMORY_SIZE=01000000
+CONFIG_MEMORY_START=0x04000000
+CONFIG_MEMORY_SIZE=0x01000000
 CONFIG_NOHIGHMEM=y
-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
+CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
 CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_FLATMEM_MANUAL=y
-# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_FLATMEM_MANUAL is not set
+CONFIG_DISCONTIGMEM_MANUAL=y
 # CONFIG_SPARSEMEM_MANUAL is not set
-CONFIG_FLATMEM=y
+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_RESOURCES_64BIT is not set
+CONFIG_IRAM_START=0x00700000
+CONFIG_IRAM_SIZE=0x00010000
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
-# CONFIG_PREEMPT is not set
+CONFIG_PREEMPT=y
 # CONFIG_SMP is not set
+CONFIG_NODES_SHIFT=1
 
 #
 # Bus options (PCI, PCMCIA, EISA, MCA, ISA)
 #
-# CONFIG_ISA is not set
+CONFIG_ISA=y
 
 #
 # PCCARD (PCMCIA/CardBus) support
 #
-CONFIG_PCCARD=y
-# CONFIG_PCMCIA_DEBUG is not set
-CONFIG_PCMCIA=y
-CONFIG_PCMCIA_LOAD_CIS=y
-CONFIG_PCMCIA_IOCTL=y
-
-#
-# PC-card bridges
-#
+# CONFIG_PCCARD is not set
 
 #
 # PCI Hotplug Support
@@ -112,10 +145,8 @@ CONFIG_PCMCIA_IOCTL=y
 #
 # Executable file formats
 #
-CONFIG_BINFMT_FLAT=y
-# CONFIG_BINFMT_ZFLAT is not set
-# CONFIG_BINFMT_SHARED_FLAT is not set
-# CONFIG_BINFMT_MISC is not set
+# CONFIG_BINFMT_FLAT is not set
+CONFIG_BINFMT_MISC=y
 
 #
 # Networking
@@ -125,17 +156,19 @@ CONFIG_NET=y
 #
 # Networking options
 #
-# CONFIG_PACKET is not set
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
 CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
 # CONFIG_IP_MULTICAST is not set
 # 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_IP_PNP is not set
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
 # CONFIG_ARPD is not set
@@ -143,13 +176,87 @@ CONFIG_IP_PNP_DHCP=y
 # CONFIG_INET_AH is not set
 # CONFIG_INET_ESP is not set
 # CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
 # CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
 CONFIG_INET_DIAG=y
 CONFIG_INET_TCP_DIAG=y
 # CONFIG_TCP_CONG_ADVANCED is not set
-CONFIG_TCP_CONG_BIC=y
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+
+#
+# IP: Virtual Server Configuration
+#
+# CONFIG_IP_VS is not set
 # CONFIG_IPV6 is not set
-# CONFIG_NETFILTER is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK 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_ENABLED is not set
+CONFIG_NETFILTER_XTABLES=m
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
+# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
+CONFIG_NETFILTER_XT_TARGET_MARK=m
+CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
+CONFIG_NETFILTER_XT_MATCH_COMMENT=m
+CONFIG_NETFILTER_XT_MATCH_DCCP=m
+# CONFIG_NETFILTER_XT_MATCH_DSCP is not set
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+CONFIG_NETFILTER_XT_MATCH_LENGTH=m
+CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+CONFIG_NETFILTER_XT_MATCH_MAC=m
+CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
+# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
+CONFIG_NETFILTER_XT_MATCH_REALM=m
+CONFIG_NETFILTER_XT_MATCH_SCTP=m
+# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
+CONFIG_NETFILTER_XT_MATCH_STRING=m
+CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
+# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set
+
+#
+# IP: Netfilter Configuration
+#
+CONFIG_IP_NF_QUEUE=m
+CONFIG_IP_NF_IPTABLES=m
+CONFIG_IP_NF_MATCH_IPRANGE=m
+CONFIG_IP_NF_MATCH_TOS=m
+CONFIG_IP_NF_MATCH_RECENT=m
+CONFIG_IP_NF_MATCH_ECN=m
+# CONFIG_IP_NF_MATCH_AH is not set
+CONFIG_IP_NF_MATCH_TTL=m
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=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_MANGLE=m
+CONFIG_IP_NF_TARGET_TOS=m
+CONFIG_IP_NF_TARGET_ECN=m
+CONFIG_IP_NF_TARGET_TTL=m
+CONFIG_IP_NF_RAW=m
+CONFIG_IP_NF_ARPTABLES=m
+CONFIG_IP_NF_ARPFILTER=m
+CONFIG_IP_NF_ARP_MANGLE=m
 
 #
 # DCCP Configuration (EXPERIMENTAL)
@@ -160,6 +267,11 @@ CONFIG_TCP_CONG_BIC=y
 # SCTP Configuration (EXPERIMENTAL)
 #
 # CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC is not set
 # CONFIG_ATM is not set
 # CONFIG_BRIDGE is not set
 # CONFIG_VLAN_8021Q is not set
@@ -169,11 +281,14 @@ CONFIG_TCP_CONG_BIC=y
 # 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
+
+#
+# QoS and/or fair queueing
+#
 # CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
+CONFIG_NET_CLS_ROUTE=y
 
 #
 # Network testing
@@ -193,8 +308,8 @@ CONFIG_TCP_CONG_BIC=y
 #
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=y
-# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_FW_LOADER is not set
+# CONFIG_SYS_HYPERVISOR is not set
 
 #
 # Connector - unified userspace <-> kernelspace linker
@@ -209,11 +324,21 @@ CONFIG_FW_LOADER=y
 #
 # Parallel port support
 #
-# CONFIG_PARPORT is not set
+CONFIG_PARPORT=m
+# CONFIG_PARPORT_GSC is not set
+# CONFIG_PARPORT_AX88796 is not set
+CONFIG_PARPORT_1284=y
 
 #
 # Plug and Play support
 #
+CONFIG_PNP=y
+# CONFIG_PNP_DEBUG is not set
+
+#
+# Protocols
+#
+CONFIG_ISAPNP=y
 
 #
 # Block devices
@@ -221,37 +346,130 @@ CONFIG_FW_LOADER=y
 # 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_RAM=y
-CONFIG_BLK_DEV_RAM_COUNT=16
-CONFIG_BLK_DEV_RAM_SIZE=4096
-CONFIG_BLK_DEV_INITRD=y
-# CONFIG_CDROM_PKTCDVD is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_BLK_DEV_INITRD is not set
+CONFIG_CDROM_PKTCDVD=m
+CONFIG_CDROM_PKTCDVD_BUFFERS=8
+CONFIG_CDROM_PKTCDVD_WCACHE=y
+# CONFIG_ATA_OVER_ETH is not set
 
 #
-# IO Schedulers
+# Misc devices
 #
-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
+# CONFIG_TIFM_CORE is not set
 
 #
 # ATA/ATAPI/MFM/RLL support
 #
-# CONFIG_IDE is not set
+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_IDEPNP is not set
+# CONFIG_IDE_ARM is not set
+# 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
 
 #
 # SCSI device support
 #
 # CONFIG_RAID_ATTRS is not set
-# CONFIG_SCSI is not set
+CONFIG_SCSI=y
+# CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+CONFIG_CHR_DEV_ST=m
+# CONFIG_CHR_DEV_OSST is not set
+CONFIG_BLK_DEV_SR=m
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_CHR_DEV_SG=m
+# 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 Transports
+#
+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
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_SCSI_AHA152X is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_IN2000 is not set
+# CONFIG_SCSI_DTC3280 is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GENERIC_NCR5380 is not set
+# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
+# CONFIG_SCSI_NCR53C406A is not set
+# CONFIG_SCSI_PAS16 is not set
+# CONFIG_SCSI_PSI240I is not set
+# CONFIG_SCSI_QLOGIC_FAS is not set
+# CONFIG_SCSI_SYM53C416 is not set
+# CONFIG_SCSI_T128 is not set
+# CONFIG_SCSI_DEBUG is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+
+#
+# Old CD-ROM drivers (not SCSI, not IDE)
+#
+# CONFIG_CD_NO_IDESCSI is not set
 
 #
 # Multi-device support (RAID and LVM)
 #
-# CONFIG_MD is not set
+CONFIG_MD=y
+CONFIG_BLK_DEV_MD=y
+# CONFIG_MD_LINEAR is not set
+# CONFIG_MD_RAID0 is not set
+CONFIG_MD_RAID1=y
+# CONFIG_MD_RAID10 is not set
+# CONFIG_MD_RAID456 is not set
+# CONFIG_MD_MULTIPATH is not set
+# CONFIG_MD_FAULTY is not set
+CONFIG_BLK_DEV_DM=m
+# CONFIG_DM_DEBUG is not set
+CONFIG_DM_CRYPT=m
+CONFIG_DM_SNAPSHOT=m
+# CONFIG_DM_MIRROR is not set
+# CONFIG_DM_ZERO is not set
+# CONFIG_DM_MULTIPATH is not set
 
 #
 # Fusion MPT device support
@@ -270,10 +488,16 @@ CONFIG_IOSCHED_NOOP=y
 # Network device support
 #
 CONFIG_NETDEVICES=y
-CONFIG_DUMMY=y
+CONFIG_DUMMY=m
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
+# CONFIG_NET_SB1000 is not set
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
 
 #
 # PHY device support
@@ -285,8 +509,33 @@ CONFIG_DUMMY=y
 #
 CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
-CONFIG_SMC91X=y
-# CONFIG_NE2000 is not set
+CONFIG_NET_VENDOR_3COM=y
+# CONFIG_EL1 is not set
+# CONFIG_EL2 is not set
+# CONFIG_EL16 is not set
+# CONFIG_EL3 is not set
+# CONFIG_NET_VENDOR_SMC is not set
+# CONFIG_SMC91X is not set
+# 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=y
+# CONFIG_E2100 is not set
+# CONFIG_EWRK3 is not set
+# CONFIG_EEXPRESS is not set
+# CONFIG_EEXPRESS_PRO is not set
+# CONFIG_HPLAN_PLUS is not set
+# CONFIG_HPLAN is not set
+# CONFIG_LP486E is not set
+# CONFIG_ETH16I is not set
+CONFIG_NE2000=m
+# CONFIG_SEEQ8005 is not set
+CONFIG_NET_PCI=y
+# CONFIG_AC3200 is not set
+# CONFIG_APRICOT is not set
+# CONFIG_CS89x0 is not set
+# CONFIG_NET_POCKET is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -299,21 +548,18 @@ CONFIG_SMC91X=y
 #
 # Token Ring devices
 #
+# CONFIG_TR is not set
 
 #
 # Wireless LAN (non-hamradio)
 #
 # CONFIG_NET_RADIO is not set
 
-#
-# PCMCIA network device support
-#
-# CONFIG_NET_PCMCIA is not set
-
 #
 # Wan interfaces
 #
 # CONFIG_WAN is not set
+# CONFIG_PLIP is not set
 # CONFIG_PPP is not set
 # CONFIG_SLIP is not set
 # CONFIG_SHAPER is not set
@@ -334,35 +580,83 @@ CONFIG_SMC91X=y
 #
 # Input device support
 #
-# CONFIG_INPUT is not set
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+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_KEYBOARD_STOWAWAY is not set
+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
+# CONFIG_INPUT_MISC is not set
 
 #
 # Hardware I/O ports
 #
-# CONFIG_SERIO is not set
+CONFIG_SERIO=y
+CONFIG_SERIO_I8042=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_PARKBD is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
 
 #
 # Character devices
 #
-# CONFIG_VT is not set
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
 
 #
 # Serial drivers
 #
-# CONFIG_SERIAL_8250 is not set
+CONFIG_SERIAL_8250=m
+CONFIG_SERIAL_8250_PNP=m
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_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_M32R_SIO=y
-CONFIG_SERIAL_M32R_SIO_CONSOLE=y
+# CONFIG_SERIAL_M32R_SIO_CONSOLE 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
 
 #
 # IPMI
@@ -372,13 +666,8 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # Watchdog Cards
 #
-CONFIG_WATCHDOG=y
-# CONFIG_WATCHDOG_NOWAYOUT is not set
-
-#
-# Watchdog Device Drivers
-#
-CONFIG_SOFT_WATCHDOG=y
+# CONFIG_WATCHDOG is not set
+# CONFIG_HW_RANDOM is not set
 # CONFIG_RTC is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
@@ -386,21 +675,57 @@ CONFIG_SOFT_WATCHDOG=y
 #
 # Ftape, the floppy tape device driver
 #
-
-#
-# PCMCIA character devices
-#
-# CONFIG_SYNCLINK_CS is not set
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 
 #
 # I2C support
 #
-# CONFIG_I2C is not set
+CONFIG_I2C=m
+CONFIG_I2C_CHARDEV=m
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=m
+CONFIG_I2C_ALGOPCF=m
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_ELEKTOR=m
+CONFIG_I2C_ISA=m
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_STUB 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_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
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
 
 #
 # Dallas's 1-wire bus
@@ -410,21 +735,89 @@ CONFIG_SOFT_WATCHDOG=y
 #
 # Hardware Monitoring support
 #
-# CONFIG_HWMON is not set
-# CONFIG_HWMON_VID is not set
+CONFIG_HWMON=y
+CONFIG_HWMON_VID=m
+# CONFIG_SENSORS_ABITUGURU is not set
+CONFIG_SENSORS_ADM1021=m
+CONFIG_SENSORS_ADM1025=m
+# CONFIG_SENSORS_ADM1026 is not set
+CONFIG_SENSORS_ADM1031=m
+# CONFIG_SENSORS_ADM9240 is not set
+CONFIG_SENSORS_ASB100=m
+# CONFIG_SENSORS_ATXP1 is not set
+CONFIG_SENSORS_DS1621=m
+# CONFIG_SENSORS_F71805F is not set
+CONFIG_SENSORS_FSCHER=m
+# CONFIG_SENSORS_FSCPOS is not set
+CONFIG_SENSORS_GL518SM=m
+# CONFIG_SENSORS_GL520SM is not set
+CONFIG_SENSORS_IT87=m
+# CONFIG_SENSORS_LM63 is not set
+CONFIG_SENSORS_LM75=m
+CONFIG_SENSORS_LM77=m
+CONFIG_SENSORS_LM78=m
+CONFIG_SENSORS_LM80=m
+CONFIG_SENSORS_LM83=m
+CONFIG_SENSORS_LM85=m
+# CONFIG_SENSORS_LM87 is not set
+CONFIG_SENSORS_LM90=m
+# CONFIG_SENSORS_LM92 is not set
+CONFIG_SENSORS_MAX1619=m
+# CONFIG_SENSORS_PC87360 is not set
+CONFIG_SENSORS_SMSC47M1=m
+# CONFIG_SENSORS_SMSC47M192 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_VT1211 is not set
+CONFIG_SENSORS_W83781D=m
+# CONFIG_SENSORS_W83791D is not set
+# CONFIG_SENSORS_W83792D is not set
+CONFIG_SENSORS_W83L785TS=m
+CONFIG_SENSORS_W83627HF=m
+# CONFIG_SENSORS_W83627EHF is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
 
 #
-# Misc devices
+# Multimedia devices
 #
+CONFIG_VIDEO_DEV=m
+CONFIG_VIDEO_V4L1=y
+CONFIG_VIDEO_V4L1_COMPAT=y
+CONFIG_VIDEO_V4L2=y
 
 #
-# Multimedia Capabilities Port drivers
+# Video Capture Adapters
 #
 
 #
-# Multimedia devices
+# Video Capture Adapters
 #
-# CONFIG_VIDEO_DEV is not set
+# CONFIG_VIDEO_ADV_DEBUG is not set
+CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
+# CONFIG_VIDEO_VIVI is not set
+# CONFIG_VIDEO_PMS is not set
+CONFIG_VIDEO_BWQCAM=m
+CONFIG_VIDEO_CQCAM=m
+# CONFIG_VIDEO_W9966 is not set
+# CONFIG_VIDEO_CPIA is not set
+# CONFIG_VIDEO_SAA5246A is not set
+# CONFIG_VIDEO_SAA5249 is not set
+# CONFIG_TUNER_3036 is not set
+# CONFIG_VIDEO_M32R_AR is not set
+
+#
+# Radio Adapters
+#
+# CONFIG_RADIO_CADET is not set
+# CONFIG_RADIO_RTRACK is not set
+# CONFIG_RADIO_RTRACK2 is not set
+# CONFIG_RADIO_AZTECH is not set
+# CONFIG_RADIO_GEMTEK is not set
+# CONFIG_RADIO_SF16FMI is not set
+# CONFIG_RADIO_SF16FMR2 is not set
+# CONFIG_RADIO_TERRATEC is not set
+# CONFIG_RADIO_TRUST is not set
+# CONFIG_RADIO_TYPHOON is not set
+# CONFIG_RADIO_ZOLTRIX is not set
 
 #
 # Digital Video Broadcasting Devices
@@ -434,8 +827,18 @@ CONFIG_SOFT_WATCHDOG=y
 #
 # Graphics support
 #
+CONFIG_FIRMWARE_EDID=y
 # CONFIG_FB is not set
 
+#
+# Console display driver support
+#
+CONFIG_VGA_CONSOLE=y
+# CONFIG_VGACON_SOFT_SCROLLBACK is not set
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
 #
 # Sound
 #
@@ -446,6 +849,11 @@ CONFIG_SOFT_WATCHDOG=y
 #
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
 
 #
 # USB Gadget Support
@@ -457,34 +865,70 @@ CONFIG_SOFT_WATCHDOG=y
 #
 # CONFIG_MMC is not set
 
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
 #
 # InfiniBand support
 #
 
 #
-# SN Devices
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
 #
 
 #
 # File systems
 #
 CONFIG_EXT2_FS=y
-# CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT2_FS_XATTR=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+CONFIG_EXT2_FS_SECURITY=y
 CONFIG_EXT3_FS=y
 CONFIG_EXT3_FS_XATTR=y
 CONFIG_EXT3_FS_POSIX_ACL=y
-# CONFIG_EXT3_FS_SECURITY is not set
+CONFIG_EXT3_FS_SECURITY=y
+# CONFIG_EXT4DEV_FS is not set
 CONFIG_JBD=y
-# CONFIG_JBD_DEBUG is not set
+CONFIG_JBD_DEBUG=y
 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_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
 # CONFIG_MINIX_FS is not set
-# CONFIG_ROMFS_FS is not set
-# CONFIG_INOTIFY is not set
+CONFIG_ROMFS_FS=y
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
 # CONFIG_QUOTA is not set
 CONFIG_DNOTIFY=y
 # CONFIG_AUTOFS_FS is not set
@@ -494,8 +938,11 @@ CONFIG_DNOTIFY=y
 #
 # CD-ROM/DVD Filesystems
 #
-# CONFIG_ISO9660_FS is not set
-# CONFIG_UDF_FS is not set
+CONFIG_ISO9660_FS=y
+CONFIG_JOLIET=y
+# CONFIG_ZISOFS is not set
+CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
 
 #
 # DOS/FAT/NT Filesystems
@@ -503,7 +950,7 @@ CONFIG_DNOTIFY=y
 CONFIG_FAT_FS=y
 CONFIG_MSDOS_FS=y
 CONFIG_VFAT_FS=y
-CONFIG_FAT_DEFAULT_CODEPAGE=932
+CONFIG_FAT_DEFAULT_CODEPAGE=437
 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
 # CONFIG_NTFS_FS is not set
 
@@ -511,11 +958,13 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
 # Pseudo filesystems
 #
 CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
 CONFIG_SYSFS=y
 CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
-# CONFIG_RELAYFS_FS is not set
+CONFIG_CONFIGFS_FS=m
 
 #
 # Miscellaneous filesystems
@@ -527,7 +976,7 @@ CONFIG_RAMFS=y
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
-CONFIG_CRAMFS=y
+# CONFIG_CRAMFS is not set
 # CONFIG_VXFS_FS is not set
 # CONFIG_HPFS_FS is not set
 # CONFIG_QNX4FS_FS is not set
@@ -542,10 +991,14 @@ CONFIG_NFS_V3=y
 # CONFIG_NFS_V3_ACL is not set
 # CONFIG_NFS_V4 is not set
 # CONFIG_NFS_DIRECTIO is not set
-# CONFIG_NFSD is not set
-CONFIG_ROOT_NFS=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V3=y
+# CONFIG_NFSD_V3_ACL is not set
+# CONFIG_NFSD_V4 is not set
+# CONFIG_NFSD_TCP is not set
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
+CONFIG_EXPORTFS=m
 CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
 # CONFIG_RPCSEC_GSS_KRB5 is not set
@@ -567,7 +1020,7 @@ CONFIG_MSDOS_PARTITION=y
 # Native Language Support
 #
 CONFIG_NLS=y
-CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_DEFAULT="cp437"
 CONFIG_NLS_CODEPAGE_437=y
 # CONFIG_NLS_CODEPAGE_737 is not set
 # CONFIG_NLS_CODEPAGE_775 is not set
@@ -592,7 +1045,7 @@ CONFIG_NLS_CODEPAGE_932=y
 # 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_1=y
 # CONFIG_NLS_ISO8859_2 is not set
 # CONFIG_NLS_ISO8859_3 is not set
 # CONFIG_NLS_ISO8859_4 is not set
@@ -605,32 +1058,28 @@ CONFIG_NLS_CODEPAGE_932=y
 # 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
+# CONFIG_NLS_UTF8 is not set
 
 #
 # Profiling support
 #
-# CONFIG_PROFILING is not set
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=m
 
 #
 # Kernel hacking
 #
 # CONFIG_PRINTK_TIME is not set
-CONFIG_DEBUG_KERNEL=y
-CONFIG_MAGIC_SYSRQ=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_KERNEL is not set
 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
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
-CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_BUGVERBOSE=y
 # CONFIG_DEBUG_FS is not set
 # CONFIG_FRAME_POINTER is not set
-# CONFIG_DEBUG_STACKOVERFLOW is not set
-# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_UNWIND_INFO is not set
+# CONFIG_HEADERS_CHECK is not set
 
 #
 # Security options
@@ -641,7 +1090,38 @@ CONFIG_DEBUG_INFO=y
 #
 # Cryptographic options
 #
-# CONFIG_CRYPTO is not set
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=m
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_NULL=m
+CONFIG_CRYPTO_MD4=m
+CONFIG_CRYPTO_MD5=m
+CONFIG_CRYPTO_SHA1=m
+CONFIG_CRYPTO_SHA256=m
+CONFIG_CRYPTO_SHA512=m
+CONFIG_CRYPTO_WP512=m
+# CONFIG_CRYPTO_TGR192 is not set
+CONFIG_CRYPTO_ECB=m
+CONFIG_CRYPTO_CBC=m
+CONFIG_CRYPTO_DES=m
+CONFIG_CRYPTO_BLOWFISH=m
+CONFIG_CRYPTO_TWOFISH=m
+CONFIG_CRYPTO_TWOFISH_COMMON=m
+CONFIG_CRYPTO_SERPENT=m
+CONFIG_CRYPTO_AES=m
+# 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
@@ -650,8 +1130,12 @@ CONFIG_DEBUG_INFO=y
 #
 # Library routines
 #
-# CONFIG_CRC_CCITT is not set
-# CONFIG_CRC16 is not set
+CONFIG_CRC_CCITT=m
+CONFIG_CRC16=m
 CONFIG_CRC32=y
-CONFIG_LIBCRC32C=y
-CONFIG_ZLIB_INFLATE=y
+CONFIG_LIBCRC32C=m
+CONFIG_TEXTSEARCH=y
+CONFIG_TEXTSEARCH_KMP=m
+CONFIG_TEXTSEARCH_BM=m
+CONFIG_TEXTSEARCH_FSM=m
+CONFIG_PLIST=y
index 3e607d90b5f45b71af6cd34a907ecece49c5ecc1..13579917afef09e621bdfbf6fd08e6393e90f174 100644 (file)
@@ -1,19 +1,18 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc5
-# Fri Jun  3 16:20:58 2005
+# Linux kernel version: 2.6.19
+# Tue Dec 12 17:52:38 2006
 #
 CONFIG_M32R=y
-# CONFIG_UID16 is not set
 CONFIG_GENERIC_ISA_DMA=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
 CONFIG_LOCK_KERNEL=y
 CONFIG_INIT_ENV_ARG_LIMIT=32
 
@@ -21,33 +20,40 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 # General setup
 #
 CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
 # CONFIG_POSIX_MQUEUE is not set
 CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
-CONFIG_SYSCTL=y
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
 # CONFIG_AUDIT is not set
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
-# CONFIG_IKCONFIG_PROC is not set
+CONFIG_IKCONFIG_PROC=y
 # CONFIG_CPUSETS is not set
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
 CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
 # CONFIG_KALLSYMS is not set
+CONFIG_HOTPLUG=y
 CONFIG_PRINTK=y
 CONFIG_BUG=y
+CONFIG_ELF_CORE=y
 CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SHMEM=y
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
 
 #
 # Loadable module support
@@ -55,12 +61,30 @@ CONFIG_BASE_SMALL=0
 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=y
 CONFIG_STOP_MACHINE=y
 
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+
+#
+# IO Schedulers
+#
+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 is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+
 #
 # Processor type and features
 #
@@ -71,8 +95,10 @@ CONFIG_PLAT_M32700UT=y
 # CONFIG_PLAT_OAKS32R is not set
 # CONFIG_PLAT_MAPPI2 is not set
 # CONFIG_PLAT_MAPPI3 is not set
+# CONFIG_PLAT_M32104UT is not set
 CONFIG_CHIP_M32700=y
 # CONFIG_CHIP_M32102 is not set
+# CONFIG_CHIP_M32104 is not set
 # CONFIG_CHIP_VDEC2 is not set
 # CONFIG_CHIP_OPSP is not set
 CONFIG_MMU=y
@@ -86,37 +112,39 @@ CONFIG_TIMER_DIVIDE=128
 CONFIG_MEMORY_START=0x08000000
 CONFIG_MEMORY_SIZE=0x01000000
 CONFIG_NOHIGHMEM=y
-# CONFIG_DISCONTIGMEM is not set
+CONFIG_ARCH_DISCONTIGMEM_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_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_IRAM_START=0x00f00000
+CONFIG_IRAM_SIZE=0x00080000
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_PREEMPT=y
-# CONFIG_HAVE_DEC_LOCK is not set
 CONFIG_SMP=y
-CONFIG_CHIP_M32700_TS1=y
+# CONFIG_CHIP_M32700_TS1 is not set
 CONFIG_NR_CPUS=2
-# CONFIG_NUMA is not set
+CONFIG_NODES_SHIFT=1
 
 #
 # Bus options (PCI, PCMCIA, EISA, MCA, ISA)
 #
-# CONFIG_PCI is not set
 # CONFIG_ISA is not set
 
 #
 # PCCARD (PCMCIA/CardBus) support
 #
-CONFIG_PCCARD=y
-# CONFIG_PCMCIA_DEBUG is not set
-CONFIG_PCMCIA=y
-
-#
-# PC-card bridges
-#
-# CONFIG_TCIC is not set
-# CONFIG_M32R_PCC is not set
-CONFIG_M32R_CFC=y
-CONFIG_M32R_CFC_NUM=1
+# CONFIG_PCCARD is not set
 
 #
 # PCI Hotplug Support
@@ -128,6 +156,94 @@ CONFIG_M32R_CFC_NUM=1
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# 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_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_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK 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
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC 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_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED 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
 #
@@ -137,12 +253,100 @@ CONFIG_BINFMT_ELF=y
 #
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
+CONFIG_FW_LOADER=y
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
 
 #
 # Memory Technology Devices (MTD)
 #
-# CONFIG_MTD is not set
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_REDBOOT_PARTS=y
+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
+# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+# CONFIG_MTD_CHAR is not set
+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
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=m
+CONFIG_MTD_JEDECPROBE=m
+CONFIG_MTD_GEN_PROBE=m
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+# CONFIG_MTD_CFI_NOSWAP is not set
+CONFIG_MTD_CFI_BE_BYTE_SWAP=y
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+CONFIG_MTD_CFI_GEOMETRY=y
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+# CONFIG_MTD_CFI_I2 is not set
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_OTP is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+CONFIG_MTD_CFI_AMDSTD=m
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=m
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
 
 #
 # Parallel port support
@@ -156,7 +360,6 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 #
 # Block devices
 #
-# CONFIG_BLK_DEV_FD is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
@@ -164,23 +367,21 @@ CONFIG_BLK_DEV_NBD=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
 # CONFIG_BLK_DEV_INITRD is not set
-CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CDROM_PKTCDVD is not set
+CONFIG_ATA_OVER_ETH=m
 
 #
-# IO Schedulers
+# Misc devices
 #
-CONFIG_IOSCHED_NOOP=y
-# CONFIG_IOSCHED_AS is not set
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_TIFM_CORE is not set
 
 #
 # ATA/ATAPI/MFM/RLL support
 #
 CONFIG_IDE=y
+CONFIG_IDE_MAX_HWIFS=4
 CONFIG_BLK_DEV_IDE=y
 
 #
@@ -189,7 +390,6 @@ CONFIG_BLK_DEV_IDE=y
 # CONFIG_BLK_DEV_IDE_SATA is not set
 CONFIG_BLK_DEV_IDEDISK=y
 # CONFIG_IDEDISK_MULTI_MODE is not set
-CONFIG_BLK_DEV_IDECS=y
 CONFIG_BLK_DEV_IDECD=m
 # CONFIG_BLK_DEV_IDETAPE is not set
 # CONFIG_BLK_DEV_IDEFLOPPY is not set
@@ -208,7 +408,9 @@ CONFIG_IDE_GENERIC=y
 #
 # SCSI device support
 #
+# CONFIG_RAID_ATTRS is not set
 CONFIG_SCSI=m
+# CONFIG_SCSI_NETLINK is not set
 CONFIG_SCSI_PROC_FS=y
 
 #
@@ -220,6 +422,7 @@ CONFIG_BLK_DEV_SD=m
 CONFIG_BLK_DEV_SR=m
 # CONFIG_BLK_DEV_SR_VENDOR is not set
 CONFIG_CHR_DEV_SG=m
+# CONFIG_CHR_DEV_SCH is not set
 
 #
 # Some SCSI devices (e.g. CD jukebox) support multiple LUNs
@@ -229,26 +432,23 @@ CONFIG_SCSI_MULTI_LUN=y
 # CONFIG_SCSI_LOGGING is not set
 
 #
-# SCSI Transport Attributes
+# SCSI Transports
 #
 # CONFIG_SCSI_SPI_ATTRS is not set
 # CONFIG_SCSI_FC_ATTRS is not set
 # CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
 
 #
 # SCSI low-level drivers
 #
-# CONFIG_SCSI_SATA is not set
+# CONFIG_ISCSI_TCP is not set
 # CONFIG_SCSI_DEBUG is not set
 
 #
-# PCMCIA SCSI adapter support
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
 #
-# CONFIG_PCMCIA_AHA152X is not set
-# CONFIG_PCMCIA_FDOMAIN is not set
-# CONFIG_PCMCIA_NINJA_SCSI is not set
-# CONFIG_PCMCIA_QLOGIC is not set
-# CONFIG_PCMCIA_SYM53C500 is not set
 
 #
 # Multi-device support (RAID and LVM)
@@ -258,6 +458,7 @@ CONFIG_SCSI_MULTI_LUN=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -268,75 +469,19 @@ CONFIG_SCSI_MULTI_LUN=y
 #
 
 #
-# Networking support
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_UNIX=y
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-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_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_IP_TCPDIAG=y
-# CONFIG_IP_TCPDIAG_IPV6 is not set
-# CONFIG_IPV6 is not set
-# CONFIG_NETFILTER 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
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
-
-#
-# Network testing
+# Network device support
 #
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
 CONFIG_NETDEVICES=y
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
 
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -362,11 +507,6 @@ CONFIG_SMC91X=y
 #
 # CONFIG_NET_RADIO is not set
 
-#
-# PCMCIA network device support
-#
-# CONFIG_NET_PCMCIA is not set
-
 #
 # Wan interfaces
 #
@@ -375,6 +515,8 @@ CONFIG_SMC91X=y
 # 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
@@ -390,6 +532,7 @@ CONFIG_SMC91X=y
 # Input device support
 #
 CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
 
 #
 # Userland interfaces
@@ -418,7 +561,6 @@ CONFIG_SERIO_SERPORT=y
 # CONFIG_SERIO_LIBPS2 is not set
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
@@ -426,6 +568,7 @@ CONFIG_SOUND_GAMEPORT=y
 CONFIG_VT=y
 CONFIG_VT_CONSOLE=y
 CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
 
 #
@@ -454,8 +597,8 @@ CONFIG_LEGACY_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
 # CONFIG_RTC is not set
-# CONFIG_GEN_RTC is not set
 CONFIG_DS1302=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
@@ -463,52 +606,64 @@ CONFIG_DS1302=y
 #
 # Ftape, the floppy tape device driver
 #
-# CONFIG_DRM is not set
-
-#
-# PCMCIA character devices
-#
-# CONFIG_SYNCLINK_CS is not set
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 
 #
 # I2C support
 #
 # CONFIG_I2C is not set
 
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
 #
 # Dallas's 1-wire bus
 #
 # CONFIG_W1 is not set
 
 #
-# Misc devices
+# Hardware Monitoring support
 #
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
 
 #
 # Multimedia devices
 #
-CONFIG_VIDEO_DEV=y
+CONFIG_VIDEO_DEV=m
+CONFIG_VIDEO_V4L1=y
+CONFIG_VIDEO_V4L1_COMPAT=y
+CONFIG_VIDEO_V4L2=y
 
 #
-# Video For Linux
+# Video Capture Adapters
 #
 
 #
-# Video Adapters
+# Video Capture Adapters
 #
+# CONFIG_VIDEO_ADV_DEBUG is not set
+CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
+# CONFIG_VIDEO_VIVI is not set
 # CONFIG_VIDEO_CPIA is not set
-CONFIG_VIDEO_M32R_AR=y
-CONFIG_VIDEO_M32R_AR_M64278=y
+CONFIG_VIDEO_M32R_AR=m
+CONFIG_VIDEO_M32R_AR_M64278=m
 
 #
 # Radio Adapters
 #
-# CONFIG_RADIO_MAESTRO is not set
 
 #
 # Digital Video Broadcasting Devices
@@ -518,15 +673,16 @@ CONFIG_VIDEO_M32R_AR_M64278=y
 #
 # Graphics support
 #
+CONFIG_FIRMWARE_EDID=y
 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_BACKLIGHT is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_S1D13XXX=y
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -535,6 +691,7 @@ CONFIG_FB=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
@@ -546,6 +703,7 @@ CONFIG_LOGO=y
 CONFIG_LOGO_LINUX_MONO=y
 CONFIG_LOGO_LINUX_VGA16=y
 CONFIG_LOGO_LINUX_CLUT224=y
+CONFIG_LOGO_M32R_CLUT224=y
 # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
@@ -558,6 +716,11 @@ CONFIG_LOGO_LINUX_CLUT224=y
 #
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
 
 #
 # USB Gadget Support
@@ -567,23 +730,62 @@ CONFIG_LOGO_LINUX_CLUT224=y
 #
 # MMC/SD Card support
 #
-# CONFIG_MMC is not set
+CONFIG_MMC=y
+CONFIG_MMC_DEBUG=y
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_TIFM_SD is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
 
 #
 # InfiniBand support
 #
-# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
 
 #
 # File systems
 #
 CONFIG_EXT2_FS=y
 # CONFIG_EXT2_FS_XATTR is not set
-CONFIG_EXT3_FS=m
+# 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=m
+# CONFIG_EXT4DEV_FS is not set
+CONFIG_JBD=y
 CONFIG_JBD_DEBUG=y
 CONFIG_FS_MBCACHE=y
 CONFIG_REISERFS_FS=m
@@ -591,17 +793,19 @@ CONFIG_REISERFS_FS=m
 # CONFIG_REISERFS_PROC_INFO is not set
 # CONFIG_REISERFS_FS_XATTR is not set
 # CONFIG_JFS_FS is not set
-
-#
-# XFS support
-#
+# CONFIG_FS_POSIX_ACL is not set
 # CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
 # CONFIG_QUOTA is not set
 CONFIG_DNOTIFY=y
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
 
 #
 # CD-ROM/DVD Filesystems
@@ -627,15 +831,13 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
 #
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
 CONFIG_SYSFS=y
-CONFIG_DEVFS_FS=y
-CONFIG_DEVFS_MOUNT=y
-# CONFIG_DEVFS_DEBUG is not set
-# CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
-# CONFIG_TMPFS_XATTR is not set
+# CONFIG_TMPFS_POSIX_ACL is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
 
 #
 # Miscellaneous filesystems
@@ -647,6 +849,8 @@ CONFIG_RAMFS=y
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
+# CONFIG_JFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
 # CONFIG_CRAMFS is not set
 # CONFIG_VXFS_FS is not set
 # CONFIG_HPFS_FS is not set
@@ -659,12 +863,14 @@ CONFIG_RAMFS=y
 #
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
 # CONFIG_NFS_V4 is not set
 # CONFIG_NFS_DIRECTIO is not set
 # CONFIG_NFSD is not set
 CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
 # CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
@@ -673,6 +879,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
@@ -727,16 +934,23 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 #
 # Profiling support
 #
-# CONFIG_PROFILING is not set
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=y
 
 #
 # Kernel hacking
 #
 # CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
 # CONFIG_DEBUG_KERNEL is not set
 CONFIG_LOG_BUF_SHIFT=15
 # CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_FS is not set
 # CONFIG_FRAME_POINTER is not set
+# CONFIG_UNWIND_INFO is not set
+# CONFIG_HEADERS_CHECK is not set
 
 #
 # Security options
@@ -749,13 +963,10 @@ CONFIG_LOG_BUF_SHIFT=15
 #
 # CONFIG_CRYPTO 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
index 2d3e7cda8f461e5f8a35a51e61f6ada8a006268e..190f961d33e2b4baf77f4d059b96e6a77febbb66 100644 (file)
@@ -1,19 +1,18 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc5
-# Fri Jun  3 16:21:34 2005
+# Linux kernel version: 2.6.19
+# Tue Dec 12 12:07:08 2006
 #
 CONFIG_M32R=y
-# CONFIG_UID16 is not set
 CONFIG_GENERIC_ISA_DMA=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_LOCK_KERNEL=y
 CONFIG_INIT_ENV_ARG_LIMIT=32
@@ -22,32 +21,39 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 # General setup
 #
 CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
 # CONFIG_POSIX_MQUEUE is not set
 CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
-CONFIG_SYSCTL=y
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
 # CONFIG_AUDIT is not set
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
-# CONFIG_IKCONFIG_PROC is not set
+CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
 CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
 # CONFIG_KALLSYMS is not set
+CONFIG_HOTPLUG=y
 CONFIG_PRINTK=y
 CONFIG_BUG=y
+CONFIG_ELF_CORE=y
 CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SHMEM=y
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
 
 #
 # Loadable module support
@@ -55,11 +61,29 @@ CONFIG_BASE_SMALL=0
 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=y
 
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+
+#
+# IO Schedulers
+#
+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 is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+
 #
 # Processor type and features
 #
@@ -70,8 +94,10 @@ CONFIG_PLAT_M32700UT=y
 # CONFIG_PLAT_OAKS32R is not set
 # CONFIG_PLAT_MAPPI2 is not set
 # CONFIG_PLAT_MAPPI3 is not set
+# CONFIG_PLAT_M32104UT is not set
 CONFIG_CHIP_M32700=y
 # CONFIG_CHIP_M32102 is not set
+# CONFIG_CHIP_M32104 is not set
 # CONFIG_CHIP_VDEC2 is not set
 # CONFIG_CHIP_OPSP is not set
 CONFIG_MMU=y
@@ -85,34 +111,37 @@ CONFIG_TIMER_DIVIDE=128
 CONFIG_MEMORY_START=0x08000000
 CONFIG_MEMORY_SIZE=0x01000000
 CONFIG_NOHIGHMEM=y
-# CONFIG_DISCONTIGMEM is not set
+CONFIG_ARCH_DISCONTIGMEM_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_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_IRAM_START=0x00f00000
+CONFIG_IRAM_SIZE=0x00080000
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_PREEMPT=y
-# CONFIG_HAVE_DEC_LOCK is not set
 # CONFIG_SMP is not set
+CONFIG_NODES_SHIFT=1
 
 #
 # Bus options (PCI, PCMCIA, EISA, MCA, ISA)
 #
-# CONFIG_PCI is not set
 # CONFIG_ISA is not set
 
 #
 # PCCARD (PCMCIA/CardBus) support
 #
-CONFIG_PCCARD=y
-# CONFIG_PCMCIA_DEBUG is not set
-CONFIG_PCMCIA=y
-
-#
-# PC-card bridges
-#
-# CONFIG_TCIC is not set
-# CONFIG_M32R_PCC is not set
-CONFIG_M32R_CFC=y
-CONFIG_M32R_CFC_NUM=1
+# CONFIG_PCCARD is not set
 
 #
 # PCI Hotplug Support
@@ -124,6 +153,94 @@ CONFIG_M32R_CFC_NUM=1
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# 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_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_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK 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
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC 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_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED 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
 #
@@ -133,12 +250,100 @@ CONFIG_BINFMT_ELF=y
 #
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
+CONFIG_FW_LOADER=y
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
 
 #
 # Memory Technology Devices (MTD)
 #
-# CONFIG_MTD is not set
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_REDBOOT_PARTS=y
+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
+# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
+# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
+# CONFIG_MTD_CMDLINE_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+# CONFIG_MTD_CHAR is not set
+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
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=m
+CONFIG_MTD_JEDECPROBE=m
+CONFIG_MTD_GEN_PROBE=m
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+# CONFIG_MTD_CFI_NOSWAP is not set
+CONFIG_MTD_CFI_BE_BYTE_SWAP=y
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+CONFIG_MTD_CFI_GEOMETRY=y
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+# CONFIG_MTD_CFI_I2 is not set
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_OTP is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+CONFIG_MTD_CFI_AMDSTD=m
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=m
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
 
 #
 # Parallel port support
@@ -152,7 +357,6 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 #
 # Block devices
 #
-# CONFIG_BLK_DEV_FD is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
@@ -160,23 +364,21 @@ CONFIG_BLK_DEV_NBD=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
 # CONFIG_BLK_DEV_INITRD is not set
-CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CDROM_PKTCDVD is not set
+CONFIG_ATA_OVER_ETH=m
 
 #
-# IO Schedulers
+# Misc devices
 #
-CONFIG_IOSCHED_NOOP=y
-# CONFIG_IOSCHED_AS is not set
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_TIFM_CORE is not set
 
 #
 # ATA/ATAPI/MFM/RLL support
 #
 CONFIG_IDE=y
+CONFIG_IDE_MAX_HWIFS=4
 CONFIG_BLK_DEV_IDE=y
 
 #
@@ -185,7 +387,6 @@ CONFIG_BLK_DEV_IDE=y
 # CONFIG_BLK_DEV_IDE_SATA is not set
 CONFIG_BLK_DEV_IDEDISK=y
 # CONFIG_IDEDISK_MULTI_MODE is not set
-CONFIG_BLK_DEV_IDECS=y
 CONFIG_BLK_DEV_IDECD=m
 # CONFIG_BLK_DEV_IDETAPE is not set
 # CONFIG_BLK_DEV_IDEFLOPPY is not set
@@ -204,7 +405,9 @@ CONFIG_IDE_GENERIC=y
 #
 # SCSI device support
 #
+# CONFIG_RAID_ATTRS is not set
 CONFIG_SCSI=m
+# CONFIG_SCSI_NETLINK is not set
 CONFIG_SCSI_PROC_FS=y
 
 #
@@ -216,6 +419,7 @@ CONFIG_BLK_DEV_SD=m
 CONFIG_BLK_DEV_SR=m
 # CONFIG_BLK_DEV_SR_VENDOR is not set
 CONFIG_CHR_DEV_SG=m
+# CONFIG_CHR_DEV_SCH is not set
 
 #
 # Some SCSI devices (e.g. CD jukebox) support multiple LUNs
@@ -225,26 +429,23 @@ CONFIG_SCSI_MULTI_LUN=y
 # CONFIG_SCSI_LOGGING is not set
 
 #
-# SCSI Transport Attributes
+# SCSI Transports
 #
 # CONFIG_SCSI_SPI_ATTRS is not set
 # CONFIG_SCSI_FC_ATTRS is not set
 # CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
 
 #
 # SCSI low-level drivers
 #
-# CONFIG_SCSI_SATA is not set
+# CONFIG_ISCSI_TCP is not set
 # CONFIG_SCSI_DEBUG is not set
 
 #
-# PCMCIA SCSI adapter support
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
 #
-# CONFIG_PCMCIA_AHA152X is not set
-# CONFIG_PCMCIA_FDOMAIN is not set
-# CONFIG_PCMCIA_NINJA_SCSI is not set
-# CONFIG_PCMCIA_QLOGIC is not set
-# CONFIG_PCMCIA_SYM53C500 is not set
 
 #
 # Multi-device support (RAID and LVM)
@@ -254,6 +455,7 @@ CONFIG_SCSI_MULTI_LUN=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -264,75 +466,19 @@ CONFIG_SCSI_MULTI_LUN=y
 #
 
 #
-# Networking support
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_UNIX=y
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-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_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_IP_TCPDIAG=y
-# CONFIG_IP_TCPDIAG_IPV6 is not set
-# CONFIG_IPV6 is not set
-# CONFIG_NETFILTER 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
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
-
-#
-# Network testing
+# Network device support
 #
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
 CONFIG_NETDEVICES=y
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
 
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -358,11 +504,6 @@ CONFIG_SMC91X=y
 #
 # CONFIG_NET_RADIO is not set
 
-#
-# PCMCIA network device support
-#
-# CONFIG_NET_PCMCIA is not set
-
 #
 # Wan interfaces
 #
@@ -371,6 +512,8 @@ CONFIG_SMC91X=y
 # 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
@@ -386,6 +529,7 @@ CONFIG_SMC91X=y
 # Input device support
 #
 CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
 
 #
 # Userland interfaces
@@ -414,7 +558,6 @@ CONFIG_SERIO_SERPORT=y
 # CONFIG_SERIO_LIBPS2 is not set
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
@@ -422,6 +565,7 @@ CONFIG_SOUND_GAMEPORT=y
 CONFIG_VT=y
 CONFIG_VT_CONSOLE=y
 CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
 
 #
@@ -450,8 +594,8 @@ CONFIG_LEGACY_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
 # CONFIG_RTC is not set
-# CONFIG_GEN_RTC is not set
 CONFIG_DS1302=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
@@ -459,52 +603,64 @@ CONFIG_DS1302=y
 #
 # Ftape, the floppy tape device driver
 #
-# CONFIG_DRM is not set
-
-#
-# PCMCIA character devices
-#
-# CONFIG_SYNCLINK_CS is not set
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 
 #
 # I2C support
 #
 # CONFIG_I2C is not set
 
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
 #
 # Dallas's 1-wire bus
 #
 # CONFIG_W1 is not set
 
 #
-# Misc devices
+# Hardware Monitoring support
 #
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
 
 #
 # Multimedia devices
 #
-CONFIG_VIDEO_DEV=y
+CONFIG_VIDEO_DEV=m
+CONFIG_VIDEO_V4L1=y
+CONFIG_VIDEO_V4L1_COMPAT=y
+CONFIG_VIDEO_V4L2=y
 
 #
-# Video For Linux
+# Video Capture Adapters
 #
 
 #
-# Video Adapters
+# Video Capture Adapters
 #
+# CONFIG_VIDEO_ADV_DEBUG is not set
+CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
+# CONFIG_VIDEO_VIVI is not set
 # CONFIG_VIDEO_CPIA is not set
-CONFIG_VIDEO_M32R_AR=y
-CONFIG_VIDEO_M32R_AR_M64278=y
+CONFIG_VIDEO_M32R_AR=m
+CONFIG_VIDEO_M32R_AR_M64278=m
 
 #
 # Radio Adapters
 #
-# CONFIG_RADIO_MAESTRO is not set
 
 #
 # Digital Video Broadcasting Devices
@@ -514,15 +670,16 @@ CONFIG_VIDEO_M32R_AR_M64278=y
 #
 # Graphics support
 #
+CONFIG_FIRMWARE_EDID=y
 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_BACKLIGHT is not set
 # CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
-# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_S1D13XXX=y
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -531,6 +688,7 @@ CONFIG_FB=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
@@ -542,6 +700,7 @@ CONFIG_LOGO=y
 CONFIG_LOGO_LINUX_MONO=y
 CONFIG_LOGO_LINUX_VGA16=y
 CONFIG_LOGO_LINUX_CLUT224=y
+CONFIG_LOGO_M32R_CLUT224=y
 # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
@@ -554,6 +713,11 @@ CONFIG_LOGO_LINUX_CLUT224=y
 #
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
 
 #
 # USB Gadget Support
@@ -563,23 +727,62 @@ CONFIG_LOGO_LINUX_CLUT224=y
 #
 # MMC/SD Card support
 #
-# CONFIG_MMC is not set
+CONFIG_MMC=y
+CONFIG_MMC_DEBUG=y
+CONFIG_MMC_BLOCK=y
+# CONFIG_MMC_TIFM_SD is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
 
 #
 # InfiniBand support
 #
-# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
 
 #
 # File systems
 #
 CONFIG_EXT2_FS=y
 # CONFIG_EXT2_FS_XATTR is not set
-CONFIG_EXT3_FS=m
+# 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=m
+# CONFIG_EXT4DEV_FS is not set
+CONFIG_JBD=y
 CONFIG_JBD_DEBUG=y
 CONFIG_FS_MBCACHE=y
 CONFIG_REISERFS_FS=m
@@ -587,17 +790,19 @@ CONFIG_REISERFS_FS=m
 # CONFIG_REISERFS_PROC_INFO is not set
 # CONFIG_REISERFS_FS_XATTR is not set
 # CONFIG_JFS_FS is not set
-
-#
-# XFS support
-#
+# CONFIG_FS_POSIX_ACL is not set
 # CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
 # CONFIG_QUOTA is not set
 CONFIG_DNOTIFY=y
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
 
 #
 # CD-ROM/DVD Filesystems
@@ -623,15 +828,13 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
 #
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
 CONFIG_SYSFS=y
-CONFIG_DEVFS_FS=y
-CONFIG_DEVFS_MOUNT=y
-# CONFIG_DEVFS_DEBUG is not set
-# CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
-# CONFIG_TMPFS_XATTR is not set
+# CONFIG_TMPFS_POSIX_ACL is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
 
 #
 # Miscellaneous filesystems
@@ -643,6 +846,8 @@ CONFIG_RAMFS=y
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
+# CONFIG_JFFS_FS is not set
+# CONFIG_JFFS2_FS is not set
 # CONFIG_CRAMFS is not set
 # CONFIG_VXFS_FS is not set
 # CONFIG_HPFS_FS is not set
@@ -655,12 +860,14 @@ CONFIG_RAMFS=y
 #
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
 # CONFIG_NFS_V4 is not set
 # CONFIG_NFS_DIRECTIO is not set
 # CONFIG_NFSD is not set
 CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
 # CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
@@ -669,6 +876,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
@@ -723,16 +931,23 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 #
 # Profiling support
 #
-# CONFIG_PROFILING is not set
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=y
 
 #
 # Kernel hacking
 #
 # CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
 # CONFIG_DEBUG_KERNEL is not set
 CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_FS is not set
 # CONFIG_FRAME_POINTER is not set
+# CONFIG_UNWIND_INFO is not set
+# CONFIG_HEADERS_CHECK is not set
 
 #
 # Security options
@@ -745,13 +960,10 @@ CONFIG_LOG_BUF_SHIFT=14
 #
 # CONFIG_CRYPTO 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
index a8425fba340b43a8cbe924bc35d71dd8177b7c16..fbf6c384c9d094b305cf0adf442ddbf1c56a3a9d 100644 (file)
@@ -1,19 +1,18 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc5
-# Fri Jun  3 16:21:46 2005
+# Linux kernel version: 2.6.19
+# Wed Dec 13 17:57:45 2006
 #
 CONFIG_M32R=y
-# CONFIG_UID16 is not set
 CONFIG_GENERIC_ISA_DMA=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_LOCK_KERNEL=y
 CONFIG_INIT_ENV_ARG_LIMIT=32
@@ -22,29 +21,36 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 # General setup
 #
 CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+# CONFIG_SYSVIPC is not set
 # CONFIG_POSIX_MQUEUE is not set
 CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
-CONFIG_SYSCTL=y
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
 # CONFIG_AUDIT is not set
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 # CONFIG_IKCONFIG_PROC is not set
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
 CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
 # CONFIG_KALLSYMS is not set
+CONFIG_HOTPLUG=y
 CONFIG_PRINTK=y
 CONFIG_BUG=y
+CONFIG_ELF_CORE=y
 CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
 CONFIG_TINY_SHMEM=y
 CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
 
 #
 # Loadable module support
@@ -52,11 +58,29 @@ CONFIG_BASE_SMALL=0
 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=y
 
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+
+#
+# IO Schedulers
+#
+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 is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+
 #
 # Processor type and features
 #
@@ -67,8 +91,10 @@ CONFIG_PLAT_MAPPI=y
 # CONFIG_PLAT_OAKS32R is not set
 # CONFIG_PLAT_MAPPI2 is not set
 # CONFIG_PLAT_MAPPI3 is not set
+# CONFIG_PLAT_M32104UT is not set
 CONFIG_CHIP_M32700=y
 # CONFIG_CHIP_M32102 is not set
+# CONFIG_CHIP_M32104 is not set
 # CONFIG_CHIP_VDEC2 is not set
 # CONFIG_CHIP_OPSP is not set
 # CONFIG_MMU is not set
@@ -82,18 +108,31 @@ CONFIG_TIMER_DIVIDE=128
 CONFIG_MEMORY_START=0x00000000
 CONFIG_MEMORY_SIZE=0x00E00000
 CONFIG_NOHIGHMEM=y
-# CONFIG_DISCONTIGMEM is not set
+CONFIG_ARCH_DISCONTIGMEM_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_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_IRAM_START=0x00f00000
+CONFIG_IRAM_SIZE=0x00080000
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_PREEMPT=y
-# CONFIG_HAVE_DEC_LOCK is not set
 # CONFIG_SMP is not set
+CONFIG_NODES_SHIFT=1
 
 #
 # Bus options (PCI, PCMCIA, EISA, MCA, ISA)
 #
-# CONFIG_PCI is not set
 # CONFIG_ISA is not set
 
 #
@@ -102,12 +141,14 @@ CONFIG_PREEMPT=y
 CONFIG_PCCARD=y
 # CONFIG_PCMCIA_DEBUG is not set
 CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_IOCTL=y
 
 #
 # PC-card bridges
 #
-# CONFIG_TCIC is not set
 CONFIG_M32R_PCC=y
+CONFIG_PCCARD_NONSTATIC=y
 
 #
 # PCI Hotplug Support
@@ -121,6 +162,94 @@ CONFIG_BINFMT_FLAT=y
 # CONFIG_BINFMT_SHARED_FLAT is not set
 # CONFIG_BINFMT_MISC is not set
 
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# 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_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_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK 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
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC 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_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED 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
 #
@@ -130,7 +259,13 @@ CONFIG_BINFMT_FLAT=y
 #
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
+CONFIG_FW_LOADER=y
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -149,7 +284,6 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 #
 # Block devices
 #
-# CONFIG_BLK_DEV_FD is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
@@ -157,18 +291,15 @@ CONFIG_BLK_DEV_NBD=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
 # CONFIG_BLK_DEV_INITRD is not set
-CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
 
 #
-# IO Schedulers
+# Misc devices
 #
-CONFIG_IOSCHED_NOOP=y
-# CONFIG_IOSCHED_AS is not set
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_TIFM_CORE is not set
 
 #
 # ATA/ATAPI/MFM/RLL support
@@ -178,7 +309,13 @@ CONFIG_IOSCHED_CFQ=y
 #
 # SCSI device support
 #
+# CONFIG_RAID_ATTRS is not set
 # CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
 
 #
 # Multi-device support (RAID and LVM)
@@ -188,6 +325,7 @@ CONFIG_IOSCHED_CFQ=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -198,75 +336,18 @@ CONFIG_IOSCHED_CFQ=y
 #
 
 #
-# Networking support
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_UNIX=y
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-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_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_IP_TCPDIAG=y
-# CONFIG_IP_TCPDIAG_IPV6 is not set
-# CONFIG_IPV6 is not set
-# CONFIG_NETFILTER 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
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
-
-#
-# Network testing
+# Network device support
 #
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
 CONFIG_NETDEVICES=y
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
 
+#
+# PHY device support
+#
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -303,6 +384,8 @@ CONFIG_NE2000=y
 # 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
@@ -318,6 +401,7 @@ CONFIG_NE2000=y
 # Input device support
 #
 CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
 
 #
 # Userland interfaces
@@ -346,7 +430,6 @@ CONFIG_SERIO_SERPORT=y
 # CONFIG_SERIO_LIBPS2 is not set
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
@@ -366,7 +449,6 @@ CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_SERIAL_M32R_SIO=y
 CONFIG_SERIAL_M32R_SIO_CONSOLE=y
-# CONFIG_SERIAL_M32R_PLDSIO is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -380,39 +462,53 @@ CONFIG_LEGACY_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
 # CONFIG_RTC is not set
-# CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 
 #
 # Ftape, the floppy tape device driver
 #
-# CONFIG_DRM is not set
 
 #
 # 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_TCG_TPM is not set
 
 #
 # I2C support
 #
 # CONFIG_I2C is not set
 
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
 #
 # Dallas's 1-wire bus
 #
 # CONFIG_W1 is not set
 
 #
-# Misc devices
+# Hardware Monitoring support
 #
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
 
 #
 # Multimedia devices
@@ -427,7 +523,9 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # Graphics support
 #
+CONFIG_FIRMWARE_EDID=y
 # CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
 # Sound
@@ -439,6 +537,11 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
 
 #
 # USB Gadget Support
@@ -450,31 +553,73 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # CONFIG_MMC is not set
 
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
 #
 # InfiniBand support
 #
-# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
 
 #
 # File systems
 #
 CONFIG_EXT2_FS=y
 # CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT3_FS is not set
-# CONFIG_JBD 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_EXT4DEV_FS 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
-
-#
-# XFS support
-#
+# CONFIG_FS_POSIX_ACL is not set
 # CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
 # CONFIG_QUOTA is not set
 CONFIG_DNOTIFY=y
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
 
 #
 # CD-ROM/DVD Filesystems
@@ -493,15 +638,12 @@ CONFIG_DNOTIFY=y
 # Pseudo filesystems
 #
 CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
 CONFIG_SYSFS=y
-CONFIG_DEVFS_FS=y
-CONFIG_DEVFS_MOUNT=y
-# CONFIG_DEVFS_DEBUG is not set
-CONFIG_DEVPTS_FS_XATTR=y
-CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
 
 #
 # Miscellaneous filesystems
@@ -525,12 +667,14 @@ CONFIG_RAMFS=y
 #
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
 # CONFIG_NFS_V4 is not set
 # CONFIG_NFS_DIRECTIO is not set
 # CONFIG_NFSD is not set
 CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
 # CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
@@ -539,6 +683,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
@@ -599,10 +744,16 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 # Kernel hacking
 #
 # CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
 # CONFIG_DEBUG_KERNEL is not set
 CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_FS is not set
 # CONFIG_FRAME_POINTER is not set
+# CONFIG_UNWIND_INFO is not set
+# CONFIG_HEADERS_CHECK is not set
 
 #
 # Security options
@@ -615,13 +766,10 @@ CONFIG_LOG_BUF_SHIFT=14
 #
 # CONFIG_CRYPTO 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
index 1a7f3cd4224667cc82e71f2e1ca4de92d0e85c2a..168669202b94518cab1d0a7cf282d4dcd73c1cd0 100644 (file)
@@ -1,21 +1,18 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc5
-# Fri Jun  3 16:21:52 2005
+# Linux kernel version: 2.6.19
+# Wed Dec 13 17:50:59 2006
 #
 CONFIG_M32R=y
-# CONFIG_UID16 is not set
 CONFIG_GENERIC_ISA_DMA=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
-# CONFIG_CLEAN_COMPILE is not set
-CONFIG_BROKEN=y
-CONFIG_BROKEN_ON_SMP=y
 CONFIG_LOCK_KERNEL=y
 CONFIG_INIT_ENV_ARG_LIMIT=32
 
@@ -23,32 +20,39 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 # General setup
 #
 CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
 # CONFIG_POSIX_MQUEUE is not set
 # CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
 # 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_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
 CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
 # CONFIG_KALLSYMS is not set
+CONFIG_HOTPLUG=y
 CONFIG_PRINTK=y
 CONFIG_BUG=y
+CONFIG_ELF_CORE=y
 CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SHMEM=y
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
 
 #
 # Loadable module support
@@ -56,12 +60,30 @@ CONFIG_BASE_SMALL=0
 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=y
 CONFIG_STOP_MACHINE=y
 
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+
+#
+# IO Schedulers
+#
+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 is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+
 #
 # Processor type and features
 #
@@ -72,8 +94,10 @@ CONFIG_PLAT_MAPPI=y
 # CONFIG_PLAT_OAKS32R is not set
 # CONFIG_PLAT_MAPPI2 is not set
 # CONFIG_PLAT_MAPPI3 is not set
+# CONFIG_PLAT_M32104UT is not set
 CONFIG_CHIP_M32700=y
 # CONFIG_CHIP_M32102 is not set
+# CONFIG_CHIP_M32104 is not set
 # CONFIG_CHIP_VDEC2 is not set
 # CONFIG_CHIP_OPSP is not set
 CONFIG_MMU=y
@@ -87,23 +111,33 @@ CONFIG_TIMER_DIVIDE=128
 CONFIG_MEMORY_START=0x08000000
 CONFIG_MEMORY_SIZE=0x04000000
 CONFIG_NOHIGHMEM=y
+CONFIG_ARCH_DISCONTIGMEM_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_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
 CONFIG_IRAM_START=0x00f00000
 CONFIG_IRAM_SIZE=0x00080000
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_PREEMPT=y
-# CONFIG_HAVE_DEC_LOCK is not set
 CONFIG_SMP=y
 CONFIG_CHIP_M32700_TS1=y
 CONFIG_NR_CPUS=2
-# CONFIG_NUMA is not set
+CONFIG_NODES_SHIFT=1
 
 #
 # Bus options (PCI, PCMCIA, EISA, MCA, ISA)
 #
-# CONFIG_PCI is not set
 # CONFIG_ISA is not set
 
 #
@@ -112,12 +146,14 @@ CONFIG_NR_CPUS=2
 CONFIG_PCCARD=y
 # CONFIG_PCMCIA_DEBUG is not set
 CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_IOCTL=y
 
 #
 # PC-card bridges
 #
-# CONFIG_TCIC is not set
 CONFIG_M32R_PCC=y
+CONFIG_PCCARD_NONSTATIC=y
 
 #
 # PCI Hotplug Support
@@ -129,6 +165,93 @@ CONFIG_M32R_PCC=y
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+# CONFIG_PACKET is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# 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_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_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK 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
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC 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_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED 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
 #
@@ -138,7 +261,13 @@ CONFIG_BINFMT_ELF=y
 #
 # CONFIG_STANDALONE is not set
 CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
+CONFIG_FW_LOADER=y
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -161,6 +290,8 @@ 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
+# CONFIG_SSFDC is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -186,6 +317,7 @@ CONFIG_MTD_CFI_I2=y
 # Mapping drivers for chip access
 #
 # CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PLATRAM is not set
 
 #
 # Self-contained MTD device drivers
@@ -193,7 +325,6 @@ CONFIG_MTD_CFI_I2=y
 # CONFIG_MTD_SLRAM is not set
 # CONFIG_MTD_PHRAM is not set
 # CONFIG_MTD_MTDRAM is not set
-# CONFIG_MTD_BLKMTD is not set
 # CONFIG_MTD_BLOCK2MTD is not set
 
 #
@@ -208,6 +339,11 @@ CONFIG_MTD_CFI_I2=y
 #
 # CONFIG_MTD_NAND is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -220,7 +356,6 @@ CONFIG_MTD_CFI_I2=y
 #
 # Block devices
 #
-# CONFIG_BLK_DEV_FD is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
@@ -228,23 +363,21 @@ CONFIG_BLK_DEV_NBD=m
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
 CONFIG_BLK_DEV_INITRD=y
-CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
 
 #
-# IO Schedulers
+# Misc devices
 #
-CONFIG_IOSCHED_NOOP=y
-# CONFIG_IOSCHED_AS is not set
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_TIFM_CORE is not set
 
 #
 # ATA/ATAPI/MFM/RLL support
 #
 CONFIG_IDE=m
+CONFIG_IDE_MAX_HWIFS=4
 CONFIG_BLK_DEV_IDE=m
 
 #
@@ -271,7 +404,13 @@ CONFIG_IDE_GENERIC=m
 #
 # SCSI device support
 #
+# CONFIG_RAID_ATTRS is not set
 # CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
 
 #
 # Multi-device support (RAID and LVM)
@@ -281,85 +420,29 @@ CONFIG_IDE_GENERIC=m
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
 # IEEE 1394 (FireWire) support
 #
-# CONFIG_IEEE1394 is not set
 
 #
 # I2O device support
 #
 
 #
-# Networking support
+# Network device support
 #
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_PACKET is not set
-CONFIG_UNIX=y
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-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_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_IP_TCPDIAG=y
-# CONFIG_IP_TCPDIAG_IPV6 is not set
-# CONFIG_IPV6 is not set
-# CONFIG_NETFILTER 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
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
 CONFIG_NETDEVICES=y
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
 
+#
+# PHY device support
+#
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -396,6 +479,8 @@ CONFIG_NE2000=y
 # 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
@@ -411,6 +496,7 @@ CONFIG_NE2000=y
 # Input device support
 #
 CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
 
 #
 # Userland interfaces
@@ -442,7 +528,6 @@ CONFIG_SERIO=y
 # CONFIG_SERIO_LIBPS2 is not set
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
@@ -462,7 +547,6 @@ CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_SERIAL_M32R_SIO=y
 CONFIG_SERIAL_M32R_SIO_CONSOLE=y
-# CONFIG_SERIAL_M32R_PLDSIO is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -476,39 +560,53 @@ CONFIG_LEGACY_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
 # CONFIG_RTC is not set
-# CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 
 #
 # Ftape, the floppy tape device driver
 #
-# CONFIG_DRM is not set
 
 #
 # 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_TCG_TPM is not set
 
 #
 # I2C support
 #
 # CONFIG_I2C is not set
 
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
 #
 # Dallas's 1-wire bus
 #
 # CONFIG_W1 is not set
 
 #
-# Misc devices
+# Hardware Monitoring support
 #
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
 
 #
 # Multimedia devices
@@ -523,7 +621,9 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # Graphics support
 #
+CONFIG_FIRMWARE_EDID=y
 # CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
 # Sound
@@ -535,6 +635,11 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
 
 #
 # USB Gadget Support
@@ -546,31 +651,74 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # CONFIG_MMC is not set
 
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
 #
 # InfiniBand support
 #
-# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
 
 #
 # File systems
 #
 CONFIG_EXT2_FS=y
 # CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT3_FS is not set
-# CONFIG_JBD 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_EXT4DEV_FS 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
-
-#
-# XFS support
-#
+# CONFIG_FS_POSIX_ACL is not set
 # CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
 # CONFIG_MINIX_FS is not set
 CONFIG_ROMFS_FS=y
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=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
@@ -595,16 +743,13 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
 #
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
 CONFIG_SYSFS=y
-CONFIG_DEVFS_FS=y
-CONFIG_DEVFS_MOUNT=y
-# CONFIG_DEVFS_DEBUG is not set
-# CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
-# CONFIG_TMPFS_XATTR is not set
-# CONFIG_HUGETLBFS is not set
+# CONFIG_TMPFS_POSIX_ACL is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
 
 #
 # Miscellaneous filesystems
@@ -621,8 +766,9 @@ CONFIG_JFFS_FS_VERBOSE=0
 CONFIG_JFFS_PROC_FS=y
 CONFIG_JFFS2_FS=y
 CONFIG_JFFS2_FS_DEBUG=0
-# CONFIG_JFFS2_FS_NAND is not set
-# CONFIG_JFFS2_FS_NOR_ECC is not set
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
+# CONFIG_JFFS2_FS_XATTR is not set
 # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
 CONFIG_JFFS2_ZLIB=y
 CONFIG_JFFS2_RTIME=y
@@ -639,12 +785,14 @@ CONFIG_JFFS2_RTIME=y
 #
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
 # CONFIG_NFS_V4 is not set
 # CONFIG_NFS_DIRECTIO is not set
 # CONFIG_NFSD is not set
 CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
 # CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
@@ -653,6 +801,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
@@ -713,10 +862,16 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 # Kernel hacking
 #
 # CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
 # CONFIG_DEBUG_KERNEL is not set
 CONFIG_LOG_BUF_SHIFT=15
 # CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_FS is not set
 # CONFIG_FRAME_POINTER is not set
+# CONFIG_UNWIND_INFO is not set
+# CONFIG_HEADERS_CHECK is not set
 
 #
 # Security options
@@ -729,14 +884,11 @@ CONFIG_LOG_BUF_SHIFT=15
 #
 # CONFIG_CRYPTO 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=y
index 38910fb766926078b6cb7bf38b0c37b8b3ce3b45..5ba00603c1a0d09500b4c8fa9f4bf83e7e659120 100644 (file)
@@ -1,20 +1,18 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc5
-# Fri Jun  3 16:21:59 2005
+# Linux kernel version: 2.6.19
+# Wed Dec 13 17:51:20 2006
 #
 CONFIG_M32R=y
-# CONFIG_UID16 is not set
 CONFIG_GENERIC_ISA_DMA=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
-# CONFIG_CLEAN_COMPILE is not set
-CONFIG_BROKEN=y
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_LOCK_KERNEL=y
 CONFIG_INIT_ENV_ARG_LIMIT=32
@@ -23,31 +21,38 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 # General setup
 #
 CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
 # CONFIG_POSIX_MQUEUE is not set
 # CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
 # CONFIG_AUDIT is not set
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
 CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
 # CONFIG_KALLSYMS is not set
+CONFIG_HOTPLUG=y
 CONFIG_PRINTK=y
 CONFIG_BUG=y
+CONFIG_ELF_CORE=y
 CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SHMEM=y
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
 
 #
 # Loadable module support
@@ -55,11 +60,29 @@ CONFIG_BASE_SMALL=0
 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=y
 
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+
+#
+# IO Schedulers
+#
+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 is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+
 #
 # Processor type and features
 #
@@ -70,8 +93,10 @@ CONFIG_PLAT_MAPPI=y
 # CONFIG_PLAT_OAKS32R is not set
 # CONFIG_PLAT_MAPPI2 is not set
 # CONFIG_PLAT_MAPPI3 is not set
+# CONFIG_PLAT_M32104UT is not set
 CONFIG_CHIP_M32700=y
 # CONFIG_CHIP_M32102 is not set
+# CONFIG_CHIP_M32104 is not set
 # CONFIG_CHIP_VDEC2 is not set
 # CONFIG_CHIP_OPSP is not set
 CONFIG_MMU=y
@@ -85,20 +110,31 @@ CONFIG_TIMER_DIVIDE=128
 CONFIG_MEMORY_START=0x08000000
 CONFIG_MEMORY_SIZE=0x04000000
 CONFIG_NOHIGHMEM=y
+CONFIG_ARCH_DISCONTIGMEM_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_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
 CONFIG_IRAM_START=0x00f00000
 CONFIG_IRAM_SIZE=0x00080000
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_PREEMPT=y
-# CONFIG_HAVE_DEC_LOCK is not set
 # CONFIG_SMP is not set
+CONFIG_NODES_SHIFT=1
 
 #
 # Bus options (PCI, PCMCIA, EISA, MCA, ISA)
 #
-# CONFIG_PCI is not set
 # CONFIG_ISA is not set
 
 #
@@ -107,12 +143,14 @@ CONFIG_PREEMPT=y
 CONFIG_PCCARD=y
 # CONFIG_PCMCIA_DEBUG is not set
 CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_IOCTL=y
 
 #
 # PC-card bridges
 #
-# CONFIG_TCIC is not set
 CONFIG_M32R_PCC=y
+CONFIG_PCCARD_NONSTATIC=y
 
 #
 # PCI Hotplug Support
@@ -124,6 +162,93 @@ CONFIG_M32R_PCC=y
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+# CONFIG_PACKET is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# 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_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_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK 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
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC 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_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED 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
 #
@@ -133,7 +258,13 @@ CONFIG_BINFMT_ELF=y
 #
 # CONFIG_STANDALONE is not set
 CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
+CONFIG_FW_LOADER=y
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -156,6 +287,8 @@ 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
+# CONFIG_SSFDC is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -181,6 +314,7 @@ CONFIG_MTD_CFI_I2=y
 # Mapping drivers for chip access
 #
 # CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PLATRAM is not set
 
 #
 # Self-contained MTD device drivers
@@ -188,7 +322,6 @@ CONFIG_MTD_CFI_I2=y
 # CONFIG_MTD_SLRAM is not set
 # CONFIG_MTD_PHRAM is not set
 # CONFIG_MTD_MTDRAM is not set
-# CONFIG_MTD_BLKMTD is not set
 # CONFIG_MTD_BLOCK2MTD is not set
 
 #
@@ -203,6 +336,11 @@ CONFIG_MTD_CFI_I2=y
 #
 # CONFIG_MTD_NAND is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -215,7 +353,6 @@ CONFIG_MTD_CFI_I2=y
 #
 # Block devices
 #
-# CONFIG_BLK_DEV_FD is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
@@ -223,23 +360,21 @@ CONFIG_BLK_DEV_NBD=m
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
 CONFIG_BLK_DEV_INITRD=y
-CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
 
 #
-# IO Schedulers
+# Misc devices
 #
-CONFIG_IOSCHED_NOOP=y
-# CONFIG_IOSCHED_AS is not set
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_TIFM_CORE is not set
 
 #
 # ATA/ATAPI/MFM/RLL support
 #
 CONFIG_IDE=m
+CONFIG_IDE_MAX_HWIFS=4
 CONFIG_BLK_DEV_IDE=m
 
 #
@@ -266,7 +401,13 @@ CONFIG_IDE_GENERIC=m
 #
 # SCSI device support
 #
+# CONFIG_RAID_ATTRS is not set
 # CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
 
 #
 # Multi-device support (RAID and LVM)
@@ -276,85 +417,29 @@ CONFIG_IDE_GENERIC=m
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
 # IEEE 1394 (FireWire) support
 #
-# CONFIG_IEEE1394 is not set
 
 #
 # I2O device support
 #
 
 #
-# Networking support
+# Network device support
 #
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_PACKET is not set
-CONFIG_UNIX=y
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-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_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_IP_TCPDIAG=y
-# CONFIG_IP_TCPDIAG_IPV6 is not set
-# CONFIG_IPV6 is not set
-# CONFIG_NETFILTER 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
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
 CONFIG_NETDEVICES=y
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
 
+#
+# PHY device support
+#
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -391,6 +476,8 @@ CONFIG_NE2000=y
 # 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
@@ -406,6 +493,7 @@ CONFIG_NE2000=y
 # Input device support
 #
 CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
 
 #
 # Userland interfaces
@@ -437,7 +525,6 @@ CONFIG_SERIO=y
 # CONFIG_SERIO_LIBPS2 is not set
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
@@ -457,7 +544,6 @@ CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_SERIAL_M32R_SIO=y
 CONFIG_SERIAL_M32R_SIO_CONSOLE=y
-# CONFIG_SERIAL_M32R_PLDSIO is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -471,39 +557,53 @@ CONFIG_LEGACY_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
 # CONFIG_RTC is not set
-# CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 
 #
 # Ftape, the floppy tape device driver
 #
-# CONFIG_DRM is not set
 
 #
 # 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_TCG_TPM is not set
 
 #
 # I2C support
 #
 # CONFIG_I2C is not set
 
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
 #
 # Dallas's 1-wire bus
 #
 # CONFIG_W1 is not set
 
 #
-# Misc devices
+# Hardware Monitoring support
 #
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
 
 #
 # Multimedia devices
@@ -518,7 +618,9 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # Graphics support
 #
+CONFIG_FIRMWARE_EDID=y
 # CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
 # Sound
@@ -530,6 +632,11 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
 
 #
 # USB Gadget Support
@@ -541,31 +648,74 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # CONFIG_MMC is not set
 
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
 #
 # InfiniBand support
 #
-# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
 
 #
 # File systems
 #
 CONFIG_EXT2_FS=y
 # CONFIG_EXT2_FS_XATTR is not set
-# CONFIG_EXT3_FS is not set
-# CONFIG_JBD 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_EXT4DEV_FS 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
-
-#
-# XFS support
-#
+# CONFIG_FS_POSIX_ACL is not set
 # CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
 # CONFIG_MINIX_FS is not set
 CONFIG_ROMFS_FS=y
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=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
@@ -590,16 +740,13 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
 #
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
 CONFIG_SYSFS=y
-CONFIG_DEVFS_FS=y
-CONFIG_DEVFS_MOUNT=y
-# CONFIG_DEVFS_DEBUG is not set
-# CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
-# CONFIG_TMPFS_XATTR is not set
-# CONFIG_HUGETLBFS is not set
+# CONFIG_TMPFS_POSIX_ACL is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
 
 #
 # Miscellaneous filesystems
@@ -616,8 +763,9 @@ CONFIG_JFFS_FS_VERBOSE=0
 CONFIG_JFFS_PROC_FS=y
 CONFIG_JFFS2_FS=y
 CONFIG_JFFS2_FS_DEBUG=0
-# CONFIG_JFFS2_FS_NAND is not set
-# CONFIG_JFFS2_FS_NOR_ECC is not set
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
+# CONFIG_JFFS2_FS_XATTR is not set
 # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
 CONFIG_JFFS2_ZLIB=y
 CONFIG_JFFS2_RTIME=y
@@ -634,12 +782,14 @@ CONFIG_JFFS2_RTIME=y
 #
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
 # CONFIG_NFS_V4 is not set
 # CONFIG_NFS_DIRECTIO is not set
 # CONFIG_NFSD is not set
 CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
 # CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
@@ -648,6 +798,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
@@ -708,10 +859,16 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 # Kernel hacking
 #
 # CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
 # CONFIG_DEBUG_KERNEL is not set
 CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_FS is not set
 # CONFIG_FRAME_POINTER is not set
+# CONFIG_UNWIND_INFO is not set
+# CONFIG_HEADERS_CHECK is not set
 
 #
 # Security options
@@ -724,14 +881,11 @@ CONFIG_LOG_BUF_SHIFT=14
 #
 # CONFIG_CRYPTO 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=y
diff --git a/arch/m32r/mappi2/defconfig.opsp b/arch/m32r/mappi2/defconfig.opsp
new file mode 100644 (file)
index 0000000..b379ae9
--- /dev/null
@@ -0,0 +1,883 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.19
+# Wed Dec 13 19:40:30 2006
+#
+CONFIG_M32R=y
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=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_IPC_NS is not set
+# CONFIG_POSIX_MQUEUE is not set
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+CONFIG_IKCONFIG=y
+# CONFIG_IKCONFIG_PROC is not set
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
+# CONFIG_KALLSYMS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+# CONFIG_FUTEX is not set
+# CONFIG_EPOLL is not set
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+
+#
+# IO Schedulers
+#
+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 is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+
+#
+# Processor type and features
+#
+# CONFIG_PLAT_MAPPI is not set
+# CONFIG_PLAT_USRV is not set
+# CONFIG_PLAT_M32700UT is not set
+# CONFIG_PLAT_OPSPUT is not set
+# CONFIG_PLAT_OAKS32R is not set
+CONFIG_PLAT_MAPPI2=y
+# CONFIG_PLAT_MAPPI3 is not set
+# CONFIG_PLAT_M32104UT is not set
+# CONFIG_CHIP_M32700 is not set
+# CONFIG_CHIP_M32102 is not set
+# CONFIG_CHIP_M32104 is not set
+# CONFIG_CHIP_VDEC2 is not set
+CONFIG_CHIP_OPSP=y
+CONFIG_MMU=y
+CONFIG_TLB_ENTRIES=16
+CONFIG_ISA_M32R2=y
+CONFIG_ISA_DSP_LEVEL2=y
+CONFIG_ISA_DUAL_ISSUE=y
+CONFIG_BUS_CLOCK=50000000
+CONFIG_TIMER_DIVIDE=128
+# CONFIG_CPU_LITTLE_ENDIAN is not set
+CONFIG_MEMORY_START=0x08000000
+CONFIG_MEMORY_SIZE=0x01000000
+CONFIG_NOHIGHMEM=y
+CONFIG_ARCH_DISCONTIGMEM_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_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_IRAM_START=0x00f00000
+CONFIG_IRAM_SIZE=0x00008000
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_PREEMPT=y
+# CONFIG_SMP is not set
+CONFIG_NODES_SHIFT=1
+
+#
+# Bus options (PCI, PCMCIA, EISA, MCA, ISA)
+#
+# CONFIG_ISA is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+CONFIG_PCCARD=y
+# CONFIG_PCMCIA_DEBUG is not set
+CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_IOCTL=y
+
+#
+# PC-card bridges
+#
+# CONFIG_M32R_CFC is not set
+
+#
+# PCI Hotplug Support
+#
+
+#
+# Executable file formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# 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_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_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK 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
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC 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_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED 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=y
+# CONFIG_SYS_HYPERVISOR 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_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_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+# CONFIG_BLK_DEV_INITRD is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# Misc devices
+#
+# CONFIG_TIFM_CORE is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+CONFIG_IDE_MAX_HWIFS=4
+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_IDECS=y
+CONFIG_BLK_DEV_IDECD=m
+# 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_IDE_ARM is not set
+# CONFIG_BLK_DEV_IDEDMA is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=m
+# CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=m
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+CONFIG_BLK_DEV_SR=m
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_CHR_DEV_SG=m
+# 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 is not set
+# CONFIG_SCSI_LOGGING is not set
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_SCSI_DEBUG is not set
+
+#
+# PCMCIA SCSI adapter support
+#
+# CONFIG_PCMCIA_AHA152X is not set
+# CONFIG_PCMCIA_FDOMAIN is not set
+# CONFIG_PCMCIA_NINJA_SCSI is not set
+# CONFIG_PCMCIA_QLOGIC is not set
+# CONFIG_PCMCIA_SYM53C500 is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+
+#
+# I2O device support
+#
+
+#
+# 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
+
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+CONFIG_SMC91X=y
+# CONFIG_NE2000 is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# PCMCIA network device support
+#
+# CONFIG_NET_PCMCIA is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# Userland interfaces
+#
+# CONFIG_INPUT_MOUSEDEV is not set
+# 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_LIBPS2 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_VT_HW_CONSOLE_BINDING is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_M32R_SIO=y
+CONFIG_SERIAL_M32R_SIO_CONSOLE=y
+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_HW_RANDOM=y
+# CONFIG_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+
+#
+# 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_TCG_TPM is not set
+
+#
+# I2C support
+#
+# CONFIG_I2C is not set
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Multimedia devices
+#
+CONFIG_VIDEO_DEV=y
+CONFIG_VIDEO_V4L1=y
+CONFIG_VIDEO_V4L1_COMPAT=y
+CONFIG_VIDEO_V4L2=y
+
+#
+# Video Capture Adapters
+#
+
+#
+# Video Capture Adapters
+#
+# CONFIG_VIDEO_ADV_DEBUG is not set
+CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
+# CONFIG_VIDEO_VIVI is not set
+# CONFIG_VIDEO_CPIA is not set
+# CONFIG_VIDEO_M32R_AR is not set
+
+#
+# Radio Adapters
+#
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+# CONFIG_USB_ARCH_HAS_HCD is not set
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA 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_EXT4DEV_FS is not set
+CONFIG_JBD=y
+CONFIG_JBD_DEBUG=y
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# 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_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_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=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+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 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 is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_FRAME_POINTER is not set
+# CONFIG_UNWIND_INFO is not set
+# CONFIG_HEADERS_CHECK is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
index 56f287b658989cbf700afc53c4dd55b82080d2b5..fe5b2a63cd6805873087d39946148e2152274c29 100644 (file)
@@ -1,19 +1,18 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc5
-# Fri Jun  3 16:22:02 2005
+# Linux kernel version: 2.6.19
+# Wed Dec 13 19:31:44 2006
 #
 CONFIG_M32R=y
-# CONFIG_UID16 is not set
 CONFIG_GENERIC_ISA_DMA=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_LOCK_KERNEL=y
 CONFIG_INIT_ENV_ARG_LIMIT=32
@@ -22,32 +21,39 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 # General setup
 #
 CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
 # CONFIG_POSIX_MQUEUE is not set
 CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
-CONFIG_SYSCTL=y
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
 # CONFIG_AUDIT is not set
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 # CONFIG_IKCONFIG_PROC is not set
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
 CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
 # CONFIG_KALLSYMS is not set
+CONFIG_HOTPLUG=y
 CONFIG_PRINTK=y
 CONFIG_BUG=y
+CONFIG_ELF_CORE=y
 CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SHMEM=y
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
 
 #
 # Loadable module support
@@ -55,11 +61,29 @@ CONFIG_BASE_SMALL=0
 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=y
 
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+
+#
+# IO Schedulers
+#
+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 is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+
 #
 # Processor type and features
 #
@@ -70,8 +94,10 @@ CONFIG_KMOD=y
 # CONFIG_PLAT_OAKS32R is not set
 CONFIG_PLAT_MAPPI2=y
 # CONFIG_PLAT_MAPPI3 is not set
+# CONFIG_PLAT_M32104UT is not set
 # CONFIG_CHIP_M32700 is not set
 # CONFIG_CHIP_M32102 is not set
+# CONFIG_CHIP_M32104 is not set
 CONFIG_CHIP_VDEC2=y
 # CONFIG_CHIP_OPSP is not set
 CONFIG_MMU=y
@@ -83,18 +109,31 @@ CONFIG_TIMER_DIVIDE=128
 CONFIG_MEMORY_START=0x08000000
 CONFIG_MEMORY_SIZE=0x01000000
 CONFIG_NOHIGHMEM=y
-# CONFIG_DISCONTIGMEM is not set
+CONFIG_ARCH_DISCONTIGMEM_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_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_IRAM_START=0x00f00000
+CONFIG_IRAM_SIZE=0x00008000
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_PREEMPT=y
-# CONFIG_HAVE_DEC_LOCK is not set
 # CONFIG_SMP is not set
+CONFIG_NODES_SHIFT=1
 
 #
 # Bus options (PCI, PCMCIA, EISA, MCA, ISA)
 #
-# CONFIG_PCI is not set
 # CONFIG_ISA is not set
 
 #
@@ -103,11 +142,12 @@ CONFIG_PREEMPT=y
 CONFIG_PCCARD=y
 # CONFIG_PCMCIA_DEBUG is not set
 CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_IOCTL=y
 
 #
 # PC-card bridges
 #
-# CONFIG_TCIC is not set
 # CONFIG_M32R_CFC is not set
 
 #
@@ -120,6 +160,94 @@ CONFIG_PCMCIA=y
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# 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_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_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK 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
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC 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_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED 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
 #
@@ -129,7 +257,13 @@ CONFIG_BINFMT_ELF=y
 #
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
+CONFIG_FW_LOADER=y
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -148,7 +282,6 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 #
 # Block devices
 #
-# CONFIG_BLK_DEV_FD is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
@@ -156,23 +289,21 @@ CONFIG_BLK_DEV_NBD=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
 # CONFIG_BLK_DEV_INITRD is not set
-CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
 
 #
-# IO Schedulers
+# Misc devices
 #
-CONFIG_IOSCHED_NOOP=y
-# CONFIG_IOSCHED_AS is not set
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_TIFM_CORE is not set
 
 #
 # ATA/ATAPI/MFM/RLL support
 #
 CONFIG_IDE=y
+CONFIG_IDE_MAX_HWIFS=4
 CONFIG_BLK_DEV_IDE=y
 
 #
@@ -200,7 +331,9 @@ CONFIG_IDE_GENERIC=y
 #
 # SCSI device support
 #
+# CONFIG_RAID_ATTRS is not set
 CONFIG_SCSI=m
+# CONFIG_SCSI_NETLINK is not set
 CONFIG_SCSI_PROC_FS=y
 
 #
@@ -212,6 +345,7 @@ CONFIG_BLK_DEV_SD=m
 CONFIG_BLK_DEV_SR=m
 # CONFIG_BLK_DEV_SR_VENDOR is not set
 CONFIG_CHR_DEV_SG=m
+# CONFIG_CHR_DEV_SCH is not set
 
 #
 # Some SCSI devices (e.g. CD jukebox) support multiple LUNs
@@ -221,16 +355,18 @@ CONFIG_SCSI_MULTI_LUN=y
 # CONFIG_SCSI_LOGGING is not set
 
 #
-# SCSI Transport Attributes
+# SCSI Transports
 #
 # CONFIG_SCSI_SPI_ATTRS is not set
 # CONFIG_SCSI_FC_ATTRS is not set
 # CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
 
 #
 # SCSI low-level drivers
 #
-# CONFIG_SCSI_SATA is not set
+# CONFIG_ISCSI_TCP is not set
 # CONFIG_SCSI_DEBUG is not set
 
 #
@@ -242,6 +378,10 @@ CONFIG_SCSI_MULTI_LUN=y
 # CONFIG_PCMCIA_QLOGIC is not set
 # CONFIG_PCMCIA_SYM53C500 is not set
 
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+
 #
 # Multi-device support (RAID and LVM)
 #
@@ -250,6 +390,7 @@ CONFIG_SCSI_MULTI_LUN=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -260,75 +401,19 @@ CONFIG_SCSI_MULTI_LUN=y
 #
 
 #
-# Networking support
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_UNIX=y
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-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_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_IP_TCPDIAG=y
-# CONFIG_IP_TCPDIAG_IPV6 is not set
-# CONFIG_IPV6 is not set
-# CONFIG_NETFILTER 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
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
-
-#
-# Network testing
+# Network device support
 #
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
 CONFIG_NETDEVICES=y
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
 
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -367,6 +452,8 @@ CONFIG_SMC91X=y
 # 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
@@ -382,6 +469,7 @@ CONFIG_SMC91X=y
 # Input device support
 #
 CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
 
 #
 # Userland interfaces
@@ -410,7 +498,6 @@ CONFIG_SERIO_SERPORT=y
 # CONFIG_SERIO_LIBPS2 is not set
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
@@ -418,6 +505,7 @@ CONFIG_SOUND_GAMEPORT=y
 CONFIG_VT=y
 CONFIG_VT_CONSOLE=y
 CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
 # CONFIG_SERIAL_NONSTANDARD is not set
 
 #
@@ -432,7 +520,6 @@ CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_SERIAL_M32R_SIO=y
 CONFIG_SERIAL_M32R_SIO_CONSOLE=y
-# CONFIG_SERIAL_M32R_PLDSIO is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -446,59 +533,78 @@ CONFIG_LEGACY_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
 # CONFIG_RTC is not set
-# CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 
 #
 # Ftape, the floppy tape device driver
 #
-# CONFIG_DRM is not set
 
 #
 # 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_TCG_TPM is not set
 
 #
 # I2C support
 #
 # CONFIG_I2C is not set
 
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
 #
 # Dallas's 1-wire bus
 #
 # CONFIG_W1 is not set
 
 #
-# Misc devices
+# Hardware Monitoring support
 #
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
 
 #
 # Multimedia devices
 #
 CONFIG_VIDEO_DEV=y
+CONFIG_VIDEO_V4L1=y
+CONFIG_VIDEO_V4L1_COMPAT=y
+CONFIG_VIDEO_V4L2=y
 
 #
-# Video For Linux
+# Video Capture Adapters
 #
 
 #
-# Video Adapters
+# Video Capture Adapters
 #
+# CONFIG_VIDEO_ADV_DEBUG is not set
+CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
+# CONFIG_VIDEO_VIVI is not set
 # CONFIG_VIDEO_CPIA is not set
 # CONFIG_VIDEO_M32R_AR is not set
 
 #
 # Radio Adapters
 #
-# CONFIG_RADIO_MAESTRO is not set
 
 #
 # Digital Video Broadcasting Devices
@@ -508,6 +614,7 @@ CONFIG_VIDEO_DEV=y
 #
 # Graphics support
 #
+CONFIG_FIRMWARE_EDID=y
 # CONFIG_FB is not set
 
 #
@@ -515,6 +622,7 @@ CONFIG_VIDEO_DEV=y
 #
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_DUMMY_CONSOLE=y
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
 # Sound
@@ -526,6 +634,11 @@ CONFIG_DUMMY_CONSOLE=y
 #
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
 
 #
 # USB Gadget Support
@@ -537,39 +650,74 @@ CONFIG_DUMMY_CONSOLE=y
 #
 # CONFIG_MMC is not set
 
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
 #
 # InfiniBand support
 #
-# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
 
 #
 # File systems
 #
 CONFIG_EXT2_FS=y
 # CONFIG_EXT2_FS_XATTR is not set
-CONFIG_EXT3_FS=m
+# 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=m
+# CONFIG_EXT4DEV_FS is not set
+CONFIG_JBD=y
 CONFIG_JBD_DEBUG=y
 CONFIG_FS_MBCACHE=y
-CONFIG_REISERFS_FS=m
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-# CONFIG_REISERFS_FS_XATTR is not set
+# CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
-
-#
-# XFS support
-#
+# CONFIG_FS_POSIX_ACL is not set
 # CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
 # CONFIG_QUOTA is not set
 CONFIG_DNOTIFY=y
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
 
 #
 # CD-ROM/DVD Filesystems
@@ -595,15 +743,13 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
 #
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
 CONFIG_SYSFS=y
-CONFIG_DEVFS_FS=y
-CONFIG_DEVFS_MOUNT=y
-# CONFIG_DEVFS_DEBUG is not set
-# CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
-# CONFIG_TMPFS_XATTR is not set
+# CONFIG_TMPFS_POSIX_ACL is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
 
 #
 # Miscellaneous filesystems
@@ -627,12 +773,14 @@ CONFIG_RAMFS=y
 #
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
 # CONFIG_NFS_V4 is not set
 # CONFIG_NFS_DIRECTIO is not set
 # CONFIG_NFSD is not set
 CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
 # CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
@@ -641,6 +789,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
@@ -701,10 +850,16 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 # Kernel hacking
 #
 # CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
 # CONFIG_DEBUG_KERNEL is not set
 CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_FS is not set
 # CONFIG_FRAME_POINTER is not set
+# CONFIG_UNWIND_INFO is not set
+# CONFIG_HEADERS_CHECK is not set
 
 #
 # Security options
@@ -717,13 +872,10 @@ CONFIG_LOG_BUF_SHIFT=14
 #
 # CONFIG_CRYPTO 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
index 2eebe75fc07176c28878ee8d9a6d440cc923a2da..2f352267a6d9d3c39e937f888d752fab19cf91bb 100644 (file)
@@ -1,21 +1,18 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc5
-# Tue May 31 17:55:34 2005
+# Linux kernel version: 2.6.19
+# Mon Dec 11 19:57:33 2006
 #
 CONFIG_M32R=y
-# CONFIG_UID16 is not set
 CONFIG_GENERIC_ISA_DMA=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
-# CONFIG_CLEAN_COMPILE is not set
-CONFIG_BROKEN=y
-CONFIG_BROKEN_ON_SMP=y
 CONFIG_LOCK_KERNEL=y
 CONFIG_INIT_ENV_ARG_LIMIT=32
 
@@ -23,32 +20,39 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 # General setup
 #
 CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
 # CONFIG_POSIX_MQUEUE is not set
 # CONFIG_BSD_PROCESS_ACCT is not set
-CONFIG_SYSCTL=y
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
 # 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_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
 CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
 # CONFIG_KALLSYMS is not set
+CONFIG_HOTPLUG=y
 CONFIG_PRINTK=y
 CONFIG_BUG=y
+CONFIG_ELF_CORE=y
 CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SHMEM=y
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
 
 #
 # Loadable module support
@@ -56,12 +60,30 @@ CONFIG_BASE_SMALL=0
 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=y
 CONFIG_STOP_MACHINE=y
 
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+
+#
+# IO Schedulers
+#
+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 is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+
 #
 # Processor type and features
 #
@@ -72,8 +94,10 @@ CONFIG_STOP_MACHINE=y
 # CONFIG_PLAT_OAKS32R is not set
 # CONFIG_PLAT_MAPPI2 is not set
 CONFIG_PLAT_MAPPI3=y
+# CONFIG_PLAT_M32104UT is not set
 CONFIG_CHIP_M32700=y
 # CONFIG_CHIP_M32102 is not set
+# CONFIG_CHIP_M32104 is not set
 # CONFIG_CHIP_VDEC2 is not set
 # CONFIG_CHIP_OPSP is not set
 CONFIG_MMU=y
@@ -87,23 +111,33 @@ CONFIG_TIMER_DIVIDE=128
 CONFIG_MEMORY_START=0x08000000
 CONFIG_MEMORY_SIZE=0x08000000
 CONFIG_NOHIGHMEM=y
+CONFIG_ARCH_DISCONTIGMEM_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_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
 CONFIG_IRAM_START=0x00f00000
 CONFIG_IRAM_SIZE=0x00080000
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_PREEMPT=y
-# CONFIG_HAVE_DEC_LOCK is not set
 CONFIG_SMP=y
 # CONFIG_CHIP_M32700_TS1 is not set
 CONFIG_NR_CPUS=2
-# CONFIG_NUMA is not set
+CONFIG_NODES_SHIFT=1
 
 #
 # Bus options (PCI, PCMCIA, EISA, MCA, ISA)
 #
-# CONFIG_PCI is not set
 # CONFIG_ISA is not set
 
 #
@@ -112,11 +146,12 @@ CONFIG_NR_CPUS=2
 CONFIG_PCCARD=y
 # CONFIG_PCMCIA_DEBUG is not set
 CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_IOCTL=y
 
 #
 # PC-card bridges
 #
-# CONFIG_TCIC is not set
 # CONFIG_M32R_PCC is not set
 # CONFIG_M32R_CFC is not set
 
@@ -130,6 +165,93 @@ CONFIG_PCMCIA=y
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+# CONFIG_PACKET is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# 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_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_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK 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
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC 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_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED 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
 #
@@ -140,6 +262,12 @@ CONFIG_BINFMT_ELF=y
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
 CONFIG_FW_LOADER=y
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -162,6 +290,8 @@ 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
+# CONFIG_SSFDC is not set
 
 #
 # RAM/ROM/Flash chip drivers
@@ -187,6 +317,7 @@ CONFIG_MTD_CFI_I2=y
 # Mapping drivers for chip access
 #
 # CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PLATRAM is not set
 
 #
 # Self-contained MTD device drivers
@@ -194,7 +325,6 @@ CONFIG_MTD_CFI_I2=y
 # CONFIG_MTD_SLRAM is not set
 # CONFIG_MTD_PHRAM is not set
 # CONFIG_MTD_MTDRAM is not set
-# CONFIG_MTD_BLKMTD is not set
 # CONFIG_MTD_BLOCK2MTD is not set
 
 #
@@ -209,6 +339,11 @@ CONFIG_MTD_CFI_I2=y
 #
 # CONFIG_MTD_NAND is not set
 
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
 #
 # Parallel port support
 #
@@ -221,7 +356,6 @@ CONFIG_MTD_CFI_I2=y
 #
 # Block devices
 #
-# CONFIG_BLK_DEV_FD is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
@@ -229,23 +363,21 @@ CONFIG_BLK_DEV_NBD=m
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
 CONFIG_BLK_DEV_INITRD=y
-CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
 
 #
-# IO Schedulers
+# Misc devices
 #
-CONFIG_IOSCHED_NOOP=y
-# CONFIG_IOSCHED_AS is not set
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_TIFM_CORE is not set
 
 #
 # ATA/ATAPI/MFM/RLL support
 #
 CONFIG_IDE=y
+CONFIG_IDE_MAX_HWIFS=4
 CONFIG_BLK_DEV_IDE=y
 
 #
@@ -254,7 +386,7 @@ CONFIG_BLK_DEV_IDE=y
 # CONFIG_BLK_DEV_IDE_SATA is not set
 CONFIG_BLK_DEV_IDEDISK=y
 # CONFIG_IDEDISK_MULTI_MODE is not set
-CONFIG_BLK_DEV_IDECS=y
+CONFIG_BLK_DEV_IDECS=m
 CONFIG_BLK_DEV_IDECD=m
 # CONFIG_BLK_DEV_IDETAPE is not set
 # CONFIG_BLK_DEV_IDEFLOPPY is not set
@@ -272,7 +404,13 @@ CONFIG_IDE_GENERIC=y
 #
 # SCSI device support
 #
+# CONFIG_RAID_ATTRS is not set
 # CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
 
 #
 # Multi-device support (RAID and LVM)
@@ -282,85 +420,30 @@ CONFIG_IDE_GENERIC=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
 # IEEE 1394 (FireWire) support
 #
-# CONFIG_IEEE1394 is not set
 
 #
 # I2O device support
 #
 
 #
-# Networking support
+# Network device support
 #
-CONFIG_NET=y
-
-#
-# Networking options
-#
-# CONFIG_PACKET is not set
-CONFIG_UNIX=y
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-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_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_IP_TCPDIAG=y
-# CONFIG_IP_TCPDIAG_IPV6 is not set
-# CONFIG_IPV6 is not set
-# CONFIG_NETFILTER 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
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
 CONFIG_NETDEVICES=y
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
 
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -399,6 +482,8 @@ CONFIG_SMC91X=y
 # 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
@@ -414,6 +499,7 @@ CONFIG_SMC91X=y
 # Input device support
 #
 CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
 
 #
 # Userland interfaces
@@ -445,7 +531,6 @@ CONFIG_SERIO=y
 # CONFIG_SERIO_LIBPS2 is not set
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
@@ -465,7 +550,6 @@ CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_SERIAL_M32R_SIO=y
 CONFIG_SERIAL_M32R_SIO_CONSOLE=y
-# CONFIG_SERIAL_M32R_PLDSIO is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -479,39 +563,53 @@ CONFIG_LEGACY_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
 # CONFIG_RTC is not set
-# CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 
 #
 # Ftape, the floppy tape device driver
 #
-# CONFIG_DRM is not set
 
 #
 # 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_TCG_TPM is not set
 
 #
 # I2C support
 #
 # CONFIG_I2C is not set
 
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
 #
 # Dallas's 1-wire bus
 #
 # CONFIG_W1 is not set
 
 #
-# Misc devices
+# Hardware Monitoring support
 #
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
 
 #
 # Multimedia devices
@@ -526,7 +624,9 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # Graphics support
 #
+CONFIG_FIRMWARE_EDID=y
 # CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
 # Sound
@@ -538,6 +638,11 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
 
 #
 # USB Gadget Support
@@ -549,36 +654,74 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # CONFIG_MMC is not set
 
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
 #
 # InfiniBand support
 #
-# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA 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_EXT4DEV_FS 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
-
-#
-# XFS support
-#
+# CONFIG_FS_POSIX_ACL is not set
 # CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
 # CONFIG_MINIX_FS is not set
 CONFIG_ROMFS_FS=y
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=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
@@ -603,16 +746,13 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
 #
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
 CONFIG_SYSFS=y
-CONFIG_DEVFS_FS=y
-CONFIG_DEVFS_MOUNT=y
-# CONFIG_DEVFS_DEBUG is not set
-# CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
-# CONFIG_TMPFS_XATTR is not set
-# CONFIG_HUGETLBFS is not set
+# CONFIG_TMPFS_POSIX_ACL is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
 
 #
 # Miscellaneous filesystems
@@ -629,8 +769,9 @@ CONFIG_JFFS_FS_VERBOSE=0
 CONFIG_JFFS_PROC_FS=y
 CONFIG_JFFS2_FS=y
 CONFIG_JFFS2_FS_DEBUG=0
-# CONFIG_JFFS2_FS_NAND is not set
-# CONFIG_JFFS2_FS_NOR_ECC is not set
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
+# CONFIG_JFFS2_FS_XATTR is not set
 # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
 CONFIG_JFFS2_ZLIB=y
 CONFIG_JFFS2_RTIME=y
@@ -647,12 +788,14 @@ CONFIG_JFFS2_RTIME=y
 #
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
 # CONFIG_NFS_V4 is not set
 # CONFIG_NFS_DIRECTIO is not set
 # CONFIG_NFSD is not set
 CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
 # CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
@@ -661,6 +804,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
@@ -721,10 +865,16 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 # Kernel hacking
 #
 # CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
 # CONFIG_DEBUG_KERNEL is not set
 CONFIG_LOG_BUF_SHIFT=15
 # CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_FS is not set
 # CONFIG_FRAME_POINTER is not set
+# CONFIG_UNWIND_INFO is not set
+# CONFIG_HEADERS_CHECK is not set
 
 #
 # Security options
@@ -737,14 +887,11 @@ CONFIG_LOG_BUF_SHIFT=15
 #
 # CONFIG_CRYPTO 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=y
index 03fc4c858e0e01d521fac4a1aa2c55322b88bbdf..9880abac3f5488ffc7d5ccc1ea9f6bc2afd20604 100644 (file)
@@ -7,8 +7,6 @@
  *    Copyright (C) 1995  Linus Torvalds
  */
 
-/* $Id: fault-nommu.c,v 1.1 2004/03/30 06:40:59 sakugawa Exp $ */
-
 #include <linux/signal.h>
 #include <linux/sched.h>
 #include <linux/kernel.h>
@@ -46,32 +44,6 @@ unsigned int tlb_entry_d_dat[NR_CPUS];
 #define tlb_entry_d tlb_entry_d_dat[smp_processor_id()]
 #endif
 
-/*
- * Unlock any spinlocks which will prevent us from getting the
- * message out
- */
-void bust_spinlocks(int yes)
-{
-       int loglevel_save = console_loglevel;
-
-       if (yes) {
-               oops_in_progress = 1;
-               return;
-       }
-#ifdef CONFIG_VT
-       unblank_screen();
-#endif
-       oops_in_progress = 0;
-       /*
-        * OK, the message is on the console.  Now we call printk()
-        * without oops_in_progress set so that printk will give klogd
-        * a poke.  Hold onto your hats...
-        */
-       console_loglevel = 15;          /* NMI oopser may have shut the console up */
-       printk(" ");
-       console_loglevel = loglevel_save;
-}
-
 void do_BUG(const char *file, int line)
 {
        bust_spinlocks(1);
@@ -161,4 +133,3 @@ void local_flush_tlb_all(void)
 {
        BUG();
 }
-
index 9b9feb0f161075c09fb9f012017449e240f40cfa..037d58e82fb5a06319396fbb23670f0e1e939489 100644 (file)
@@ -49,32 +49,6 @@ unsigned int tlb_entry_d_dat[NR_CPUS];
 
 extern void init_tlb(void);
 
-/*
- * Unlock any spinlocks which will prevent us from getting the
- * message out
- */
-void bust_spinlocks(int yes)
-{
-       int loglevel_save = console_loglevel;
-
-       if (yes) {
-               oops_in_progress = 1;
-               return;
-       }
-#ifdef CONFIG_VT
-       unblank_screen();
-#endif
-       oops_in_progress = 0;
-       /*
-        * OK, the message is on the console.  Now we call printk()
-        * without oops_in_progress set so that printk will give klogd
-        * a poke.  Hold onto your hats...
-        */
-       console_loglevel = 15;          /* NMI oopser may have shut the console up */
-       printk(" ");
-       console_loglevel = loglevel_save;
-}
-
 /*======================================================================*
  * do_page_fault()
  *======================================================================*
@@ -362,8 +336,10 @@ vmalloc_fault:
                if (!pte_present(*pte_k))
                        goto no_context;
 
-               addr = (address & PAGE_MASK) | (error_code & ACE_INSTRUCTION);
+               addr = (address & PAGE_MASK);
+               set_thread_fault_code(error_code);
                update_mmu_cache(NULL, addr, *pte_k);
+               set_thread_fault_code(0);
                return;
        }
 }
@@ -377,7 +353,7 @@ vmalloc_fault:
 void update_mmu_cache(struct vm_area_struct *vma, unsigned long vaddr,
        pte_t pte)
 {
-       unsigned long *entry1, *entry2;
+       volatile unsigned long *entry1, *entry2;
        unsigned long pte_data, flags;
        unsigned int *entry_dat;
        int inst = get_thread_fault_code() & ACE_INSTRUCTION;
@@ -391,30 +367,26 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long vaddr,
 
        vaddr = (vaddr & PAGE_MASK) | get_asid();
 
+       pte_data = pte_val(pte);
+
 #ifdef CONFIG_CHIP_OPSP
        entry1 = (unsigned long *)ITLB_BASE;
-       for(i = 0 ; i < NR_TLB_ENTRIES; i++) {
-               if(*entry1++ == vaddr) {
-                       pte_data = pte_val(pte);
-                       set_tlb_data(entry1, pte_data);
-                       break;
-               }
-               entry1++;
+       for (i = 0; i < NR_TLB_ENTRIES; i++) {
+               if (*entry1++ == vaddr) {
+                       set_tlb_data(entry1, pte_data);
+                       break;
+               }
+               entry1++;
        }
        entry2 = (unsigned long *)DTLB_BASE;
-       for(i = 0 ; i < NR_TLB_ENTRIES ; i++) {
-               if(*entry2++ == vaddr) {
-                       pte_data = pte_val(pte);
-                       set_tlb_data(entry2, pte_data);
-                       break;
-               }
-               entry2++;
+       for (i = 0; i < NR_TLB_ENTRIES; i++) {
+               if (*entry2++ == vaddr) {
+                       set_tlb_data(entry2, pte_data);
+                       break;
+               }
+               entry2++;
        }
-       local_irq_restore(flags);
-       return;
 #else
-       pte_data = pte_val(pte);
-
        /*
         * Update TLB entries
         *  entry1: ITLB entry address
@@ -439,6 +411,7 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long vaddr,
                "i" (MSVA_offset), "i" (MTOP_offset), "i" (MIDXI_offset)
                : "r4", "memory"
        );
+#endif
 
        if ((!inst && entry2 >= DTLB_END) || (inst && entry1 >= ITLB_END))
                goto notfound;
@@ -482,7 +455,6 @@ notfound:
        set_tlb_data(entry1, pte_data);
 
        goto found;
-#endif
 }
 
 /*======================================================================*
index 9a4d40b3d6a26ceab9c021ba1d558371e1930880..8bb74b10dca76707a2d7c52e4fb3399fd3f26fbf 100644 (file)
@@ -4,8 +4,6 @@
  *  Copyright (C) 2001 by Hiroyuki Kondo
  */
 
-/* $Id: mmu.S,v 1.15 2004/03/16 02:56:27 takata Exp $ */
-
 #include <linux/linkage.h>
 #include <asm/assembler.h>
 #include <asm/smp.h>
@@ -345,5 +343,4 @@ ENTRY(m32r_otlb_entrys)
 
 #endif  /* CONFIG_MMU */
 
-.end
-
+       .end
index 3f9fe519acb2413e62ccb26ac004c4ddcc616277..aaa00828e0d38e746405417752a9fd6956eddf02 100644 (file)
@@ -1,19 +1,18 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc5
-# Fri Jun  3 16:22:04 2005
+# Linux kernel version: 2.6.19
+# Tue Dec 12 12:09:17 2006
 #
 CONFIG_M32R=y
-# CONFIG_UID16 is not set
 CONFIG_GENERIC_ISA_DMA=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_LOCK_KERNEL=y
 CONFIG_INIT_ENV_ARG_LIMIT=32
@@ -22,28 +21,35 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 # General setup
 #
 CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+# CONFIG_SYSVIPC is not set
 # CONFIG_POSIX_MQUEUE is not set
 CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
-CONFIG_SYSCTL=y
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
 # CONFIG_AUDIT is not set
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
 # CONFIG_IKCONFIG is not set
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
 CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
 # CONFIG_KALLSYMS is not set
+CONFIG_HOTPLUG=y
 CONFIG_PRINTK=y
 CONFIG_BUG=y
+CONFIG_ELF_CORE=y
 CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
 CONFIG_TINY_SHMEM=y
 CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
 
 #
 # Loadable module support
@@ -51,11 +57,29 @@ CONFIG_BASE_SMALL=0
 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=y
 
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+
+#
+# IO Schedulers
+#
+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 is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+
 #
 # Processor type and features
 #
@@ -66,8 +90,10 @@ CONFIG_KMOD=y
 CONFIG_PLAT_OAKS32R=y
 # CONFIG_PLAT_MAPPI2 is not set
 # CONFIG_PLAT_MAPPI3 is not set
+# CONFIG_PLAT_M32104UT is not set
 # CONFIG_CHIP_M32700 is not set
 CONFIG_CHIP_M32102=y
+# CONFIG_CHIP_M32104 is not set
 # CONFIG_CHIP_VDEC2 is not set
 # CONFIG_CHIP_OPSP is not set
 CONFIG_ISA_M32R=y
@@ -77,18 +103,31 @@ CONFIG_TIMER_DIVIDE=128
 CONFIG_MEMORY_START=0x01000000
 CONFIG_MEMORY_SIZE=0x00800000
 CONFIG_NOHIGHMEM=y
-# CONFIG_DISCONTIGMEM is not set
+CONFIG_ARCH_DISCONTIGMEM_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_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_IRAM_START=0x00f00000
+CONFIG_IRAM_SIZE=0x00010000
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_PREEMPT=y
-# CONFIG_HAVE_DEC_LOCK is not set
 # CONFIG_SMP is not set
+CONFIG_NODES_SHIFT=1
 
 #
 # Bus options (PCI, PCMCIA, EISA, MCA, ISA)
 #
-# CONFIG_PCI is not set
 # CONFIG_ISA is not set
 
 #
@@ -108,6 +147,94 @@ CONFIG_BINFMT_FLAT=y
 # CONFIG_BINFMT_SHARED_FLAT is not set
 # CONFIG_BINFMT_MISC is not set
 
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# 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_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_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK 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
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC 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_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED 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
 #
@@ -118,6 +245,12 @@ CONFIG_BINFMT_FLAT=y
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
 # CONFIG_FW_LOADER is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -136,7 +269,6 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 #
 # Block devices
 #
-# CONFIG_BLK_DEV_FD is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
@@ -144,18 +276,15 @@ CONFIG_BLK_DEV_NBD=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
 # CONFIG_BLK_DEV_INITRD is not set
-CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
 
 #
-# IO Schedulers
+# Misc devices
 #
-CONFIG_IOSCHED_NOOP=y
-# CONFIG_IOSCHED_AS is not set
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_TIFM_CORE is not set
 
 #
 # ATA/ATAPI/MFM/RLL support
@@ -165,7 +294,13 @@ CONFIG_IOSCHED_CFQ=y
 #
 # SCSI device support
 #
+# CONFIG_RAID_ATTRS is not set
 # CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
 
 #
 # Multi-device support (RAID and LVM)
@@ -175,6 +310,7 @@ CONFIG_IOSCHED_CFQ=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -185,75 +321,18 @@ CONFIG_IOSCHED_CFQ=y
 #
 
 #
-# Networking support
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_UNIX=y
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-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_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_IP_TCPDIAG=y
-# CONFIG_IP_TCPDIAG_IPV6 is not set
-# CONFIG_IPV6 is not set
-# CONFIG_NETFILTER 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
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
-
-#
-# Network testing
+# Network device support
 #
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
 CONFIG_NETDEVICES=y
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
 
+#
+# PHY device support
+#
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -285,6 +364,8 @@ CONFIG_NE2000=y
 # 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
@@ -300,6 +381,7 @@ CONFIG_NE2000=y
 # Input device support
 #
 CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
 
 #
 # Userland interfaces
@@ -328,7 +410,6 @@ CONFIG_SERIO_SERPORT=y
 # CONFIG_SERIO_LIBPS2 is not set
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
@@ -348,7 +429,6 @@ CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_SERIAL_M32R_SIO=y
 CONFIG_SERIAL_M32R_SIO_CONSOLE=y
-# CONFIG_SERIAL_M32R_PLDSIO is not set
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
@@ -362,34 +442,46 @@ CONFIG_LEGACY_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
 # CONFIG_RTC is not set
-# CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 
 #
 # Ftape, the floppy tape device driver
 #
-# CONFIG_DRM is not set
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
+# CONFIG_TCG_TPM is not set
 
 #
 # I2C support
 #
 # CONFIG_I2C is not set
 
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
 #
 # Dallas's 1-wire bus
 #
 # CONFIG_W1 is not set
 
 #
-# Misc devices
+# Hardware Monitoring support
 #
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
 
 #
 # Multimedia devices
@@ -404,7 +496,9 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # Graphics support
 #
+CONFIG_FIRMWARE_EDID=y
 # CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
 # Sound
@@ -416,6 +510,11 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
 
 #
 # USB Gadget Support
@@ -427,10 +526,44 @@ CONFIG_LEGACY_PTY_COUNT=256
 #
 # CONFIG_MMC is not set
 
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
 #
 # InfiniBand support
 #
-# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
 
 #
 # File systems
@@ -438,20 +571,22 @@ CONFIG_LEGACY_PTY_COUNT=256
 CONFIG_EXT2_FS=y
 # CONFIG_EXT2_FS_XATTR is not set
 # CONFIG_EXT3_FS is not set
-# CONFIG_JBD is not set
+# CONFIG_EXT4DEV_FS is not set
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
-
-#
-# XFS support
-#
+# CONFIG_FS_POSIX_ACL is not set
 # CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
 # CONFIG_QUOTA is not set
 CONFIG_DNOTIFY=y
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
 
 #
 # CD-ROM/DVD Filesystems
@@ -470,13 +605,12 @@ CONFIG_DNOTIFY=y
 # Pseudo filesystems
 #
 CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
 CONFIG_SYSFS=y
-# CONFIG_DEVFS_FS is not set
-CONFIG_DEVPTS_FS_XATTR=y
-CONFIG_DEVPTS_FS_SECURITY=y
 # CONFIG_TMPFS is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
 
 #
 # Miscellaneous filesystems
@@ -500,12 +634,14 @@ CONFIG_RAMFS=y
 #
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
 # CONFIG_NFS_V4 is not set
 # CONFIG_NFS_DIRECTIO is not set
 # CONFIG_NFSD is not set
 CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
 # CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
@@ -514,6 +650,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
@@ -574,10 +711,16 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 # Kernel hacking
 #
 # CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
 # CONFIG_DEBUG_KERNEL is not set
 CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_FS is not set
 # CONFIG_FRAME_POINTER is not set
+# CONFIG_UNWIND_INFO is not set
+# CONFIG_HEADERS_CHECK is not set
 
 #
 # Security options
@@ -590,13 +733,10 @@ CONFIG_LOG_BUF_SHIFT=14
 #
 # CONFIG_CRYPTO 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
index 66adec6a701adeba82cdf8a5fd9e69c2ef755d44..461f95e72d173bd1aed1db49ce277d62500db6f2 100644 (file)
@@ -1,19 +1,18 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.12-rc5
-# Fri Jun  3 16:22:06 2005
+# Linux kernel version: 2.6.19
+# Wed Dec 13 18:34:36 2006
 #
 CONFIG_M32R=y
-# CONFIG_UID16 is not set
 CONFIG_GENERIC_ISA_DMA=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
 # Code maturity level options
 #
 CONFIG_EXPERIMENTAL=y
-CONFIG_CLEAN_COMPILE=y
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_INIT_ENV_ARG_LIMIT=32
 
@@ -21,32 +20,39 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 # General setup
 #
 CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
 # CONFIG_POSIX_MQUEUE is not set
 CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
-CONFIG_SYSCTL=y
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
 # CONFIG_AUDIT is not set
-CONFIG_HOTPLUG=y
-CONFIG_KOBJECT_UEVENT=y
 CONFIG_IKCONFIG=y
 # CONFIG_IKCONFIG_PROC is not set
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
 CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
 # CONFIG_KALLSYMS is not set
+CONFIG_HOTPLUG=y
 CONFIG_PRINTK=y
 CONFIG_BUG=y
+CONFIG_ELF_CORE=y
 CONFIG_BASE_FULL=y
 # CONFIG_FUTEX is not set
 # CONFIG_EPOLL is not set
-# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SHMEM=y
-CONFIG_CC_ALIGN_FUNCTIONS=0
-CONFIG_CC_ALIGN_LABELS=0
-CONFIG_CC_ALIGN_LOOPS=0
-CONFIG_CC_ALIGN_JUMPS=0
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
 
 #
 # Loadable module support
@@ -54,11 +60,29 @@ CONFIG_BASE_SMALL=0
 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=y
 
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+
+#
+# IO Schedulers
+#
+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 is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+
 #
 # Processor type and features
 #
@@ -69,8 +93,10 @@ CONFIG_PLAT_OPSPUT=y
 # CONFIG_PLAT_OAKS32R is not set
 # CONFIG_PLAT_MAPPI2 is not set
 # CONFIG_PLAT_MAPPI3 is not set
+# CONFIG_PLAT_M32104UT is not set
 # CONFIG_CHIP_M32700 is not set
 # CONFIG_CHIP_M32102 is not set
+# CONFIG_CHIP_M32104 is not set
 # CONFIG_CHIP_VDEC2 is not set
 CONFIG_CHIP_OPSP=y
 CONFIG_MMU=y
@@ -84,17 +110,31 @@ CONFIG_TIMER_DIVIDE=128
 CONFIG_MEMORY_START=0x08000000
 CONFIG_MEMORY_SIZE=0x01000000
 CONFIG_NOHIGHMEM=y
-# CONFIG_DISCONTIGMEM is not set
+CONFIG_ARCH_DISCONTIGMEM_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_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_IRAM_START=0x00f00000
+CONFIG_IRAM_SIZE=0x00010000
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 # CONFIG_PREEMPT is not set
 # CONFIG_SMP is not set
+CONFIG_NODES_SHIFT=1
 
 #
 # Bus options (PCI, PCMCIA, EISA, MCA, ISA)
 #
-# CONFIG_PCI is not set
 # CONFIG_ISA is not set
 
 #
@@ -103,13 +143,15 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_PCCARD=y
 # CONFIG_PCMCIA_DEBUG is not set
 CONFIG_PCMCIA=y
+CONFIG_PCMCIA_LOAD_CIS=y
+CONFIG_PCMCIA_IOCTL=y
 
 #
 # PC-card bridges
 #
-# CONFIG_TCIC is not set
 CONFIG_M32R_CFC=y
 CONFIG_M32R_CFC_NUM=1
+CONFIG_PCCARD_NONSTATIC=y
 
 #
 # PCI Hotplug Support
@@ -121,6 +163,94 @@ CONFIG_M32R_CFC_NUM=1
 CONFIG_BINFMT_ELF=y
 # CONFIG_BINFMT_MISC is not set
 
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# 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_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_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK 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
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC 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_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED 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
 #
@@ -130,8 +260,14 @@ CONFIG_BINFMT_ELF=y
 #
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
+CONFIG_FW_LOADER=y
 # CONFIG_DEBUG_DRIVER is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
 
 #
 # Memory Technology Devices (MTD)
@@ -150,7 +286,6 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 #
 # Block devices
 #
-# CONFIG_BLK_DEV_FD is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
@@ -158,18 +293,15 @@ CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
 # CONFIG_BLK_DEV_INITRD is not set
-CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
 
 #
-# IO Schedulers
+# Misc devices
 #
-CONFIG_IOSCHED_NOOP=y
-# CONFIG_IOSCHED_AS is not set
-CONFIG_IOSCHED_DEADLINE=y
-CONFIG_IOSCHED_CFQ=y
-# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_TIFM_CORE is not set
 
 #
 # ATA/ATAPI/MFM/RLL support
@@ -179,7 +311,9 @@ CONFIG_IOSCHED_CFQ=y
 #
 # SCSI device support
 #
+# CONFIG_RAID_ATTRS is not set
 CONFIG_SCSI=m
+# CONFIG_SCSI_NETLINK is not set
 CONFIG_SCSI_PROC_FS=y
 
 #
@@ -191,6 +325,7 @@ CONFIG_BLK_DEV_SD=m
 CONFIG_BLK_DEV_SR=m
 # CONFIG_BLK_DEV_SR_VENDOR is not set
 CONFIG_CHR_DEV_SG=m
+# CONFIG_CHR_DEV_SCH is not set
 
 #
 # Some SCSI devices (e.g. CD jukebox) support multiple LUNs
@@ -200,16 +335,18 @@ CONFIG_SCSI_MULTI_LUN=y
 # CONFIG_SCSI_LOGGING is not set
 
 #
-# SCSI Transport Attributes
+# SCSI Transports
 #
 # CONFIG_SCSI_SPI_ATTRS is not set
 # CONFIG_SCSI_FC_ATTRS is not set
 # CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
 
 #
 # SCSI low-level drivers
 #
-# CONFIG_SCSI_SATA is not set
+# CONFIG_ISCSI_TCP is not set
 # CONFIG_SCSI_DEBUG is not set
 
 #
@@ -221,6 +358,10 @@ CONFIG_SCSI_MULTI_LUN=y
 # CONFIG_PCMCIA_QLOGIC is not set
 # CONFIG_PCMCIA_SYM53C500 is not set
 
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+
 #
 # Multi-device support (RAID and LVM)
 #
@@ -229,6 +370,7 @@ CONFIG_SCSI_MULTI_LUN=y
 #
 # Fusion MPT device support
 #
+# CONFIG_FUSION is not set
 
 #
 # IEEE 1394 (FireWire) support
@@ -239,75 +381,19 @@ CONFIG_SCSI_MULTI_LUN=y
 #
 
 #
-# Networking support
-#
-CONFIG_NET=y
-
-#
-# Networking options
-#
-CONFIG_PACKET=y
-# CONFIG_PACKET_MMAP is not set
-CONFIG_UNIX=y
-# CONFIG_NET_KEY is not set
-CONFIG_INET=y
-# CONFIG_IP_MULTICAST is not set
-# CONFIG_IP_ADVANCED_ROUTER is not set
-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_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_IP_TCPDIAG=y
-# CONFIG_IP_TCPDIAG_IPV6 is not set
-# CONFIG_IPV6 is not set
-# CONFIG_NETFILTER is not set
-
-#
-# SCTP Configuration (EXPERIMENTAL)
+# Network device support
 #
-# 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
-
-#
-# QoS and/or fair queueing
-#
-# CONFIG_NET_SCHED is not set
-# CONFIG_NET_CLS_ROUTE is not set
-
-#
-# Network testing
-#
-# CONFIG_NET_PKTGEN is not set
-# CONFIG_NETPOLL is not set
-# CONFIG_NET_POLL_CONTROLLER is not set
-# CONFIG_HAMRADIO is not set
-# CONFIG_IRDA is not set
-# CONFIG_BT is not set
 CONFIG_NETDEVICES=y
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
 
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
 #
 # Ethernet (10 or 100Mbit)
 #
@@ -346,6 +432,8 @@ CONFIG_SMC91X=y
 # 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
@@ -361,6 +449,7 @@ CONFIG_SMC91X=y
 # Input device support
 #
 CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
 
 #
 # Userland interfaces
@@ -389,7 +478,6 @@ CONFIG_SERIO_SERPORT=y
 # CONFIG_SERIO_LIBPS2 is not set
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
-CONFIG_SOUND_GAMEPORT=y
 
 #
 # Character devices
@@ -423,8 +511,8 @@ CONFIG_LEGACY_PTY_COUNT=256
 # Watchdog Cards
 #
 # CONFIG_WATCHDOG is not set
+CONFIG_HW_RANDOM=y
 # CONFIG_RTC is not set
-# CONFIG_GEN_RTC is not set
 CONFIG_DS1302=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
@@ -432,31 +520,45 @@ CONFIG_DS1302=y
 #
 # Ftape, the floppy tape device driver
 #
-# CONFIG_DRM is not set
 
 #
 # 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_TCG_TPM is not set
 
 #
 # I2C support
 #
 # CONFIG_I2C is not set
 
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
 #
 # Dallas's 1-wire bus
 #
 # CONFIG_W1 is not set
 
 #
-# Misc devices
+# Hardware Monitoring support
 #
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
 
 #
 # Multimedia devices
@@ -471,7 +573,9 @@ CONFIG_DS1302=y
 #
 # Graphics support
 #
+CONFIG_FIRMWARE_EDID=y
 # CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
 # Sound
@@ -483,6 +587,11 @@ CONFIG_DS1302=y
 #
 # CONFIG_USB_ARCH_HAS_HCD is not set
 # CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
 
 #
 # USB Gadget Support
@@ -494,39 +603,74 @@ CONFIG_DS1302=y
 #
 # CONFIG_MMC is not set
 
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
 #
 # InfiniBand support
 #
-# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
 
 #
 # File systems
 #
 CONFIG_EXT2_FS=y
 # CONFIG_EXT2_FS_XATTR is not set
-CONFIG_EXT3_FS=m
+# 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=m
+# CONFIG_EXT4DEV_FS is not set
+CONFIG_JBD=y
 CONFIG_JBD_DEBUG=y
 CONFIG_FS_MBCACHE=y
-CONFIG_REISERFS_FS=m
-# CONFIG_REISERFS_CHECK is not set
-# CONFIG_REISERFS_PROC_INFO is not set
-# CONFIG_REISERFS_FS_XATTR is not set
+# CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
-
-#
-# XFS support
-#
+# CONFIG_FS_POSIX_ACL is not set
 # CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
 # CONFIG_QUOTA is not set
 CONFIG_DNOTIFY=y
 # CONFIG_AUTOFS_FS is not set
 # CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
 
 #
 # CD-ROM/DVD Filesystems
@@ -552,15 +696,13 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
 #
 CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
 CONFIG_SYSFS=y
-CONFIG_DEVFS_FS=y
-CONFIG_DEVFS_MOUNT=y
-# CONFIG_DEVFS_DEBUG is not set
-# CONFIG_DEVPTS_FS_XATTR is not set
 CONFIG_TMPFS=y
-# CONFIG_TMPFS_XATTR is not set
+# CONFIG_TMPFS_POSIX_ACL is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
 
 #
 # Miscellaneous filesystems
@@ -584,12 +726,14 @@ CONFIG_RAMFS=y
 #
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
 # CONFIG_NFS_V4 is not set
 # CONFIG_NFS_DIRECTIO is not set
 # CONFIG_NFSD is not set
 CONFIG_ROOT_NFS=y
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
 # CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
@@ -598,6 +742,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
@@ -658,21 +803,32 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 # Kernel hacking
 #
 # CONFIG_PRINTK_TIME is not set
-CONFIG_DEBUG_KERNEL=y
+CONFIG_ENABLE_MUST_CHECK=y
 # CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_KERNEL=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
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_RWSEMS is not set
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
 # CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_BUGVERBOSE is not set
 CONFIG_DEBUG_INFO=y
 # CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
 # CONFIG_FRAME_POINTER is not set
+# CONFIG_UNWIND_INFO is not set
+CONFIG_FORCED_INLINING=y
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_RCU_TORTURE_TEST is not set
 # CONFIG_DEBUG_STACKOVERFLOW is not set
 # CONFIG_DEBUG_STACK_USAGE is not set
-# CONFIG_DEBUG_PAGEALLOC is not set
 
 #
 # Security options
@@ -685,13 +841,10 @@ CONFIG_DEBUG_INFO=y
 #
 # CONFIG_CRYPTO 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
index 70a577c89c7c84d279d9ce9f9c08f1c0bbaa08db..a8e1e604dfa81427b19d77a1ae3d81fdfb9841c8 100644 (file)
@@ -42,6 +42,9 @@ config ARCH_MAY_HAVE_PC_FDC
        depends on Q40 || (BROKEN && SUN3X)
        default y
 
+config NO_IOPORT
+       def_bool y
+
 mainmenu "Linux/68k Kernel Configuration"
 
 source "init/Kconfig"
@@ -439,6 +442,10 @@ config GENERIC_ISA_DMA
        depends on Q40 || AMIGA_PCMCIA || GG2
        default y
 
+config ZONE_DMA
+       bool
+       default y
+
 source "drivers/pci/Kconfig"
 
 source "drivers/zorro/Kconfig"
index d01deb46ebbcb60ee092085c0bef142a0c049da6..ab3fd5202b2477c5624e4a23fbac11f78e7063bb 100644 (file)
@@ -174,7 +174,7 @@ int stdma_islocked(void)
 void __init stdma_init(void)
 {
        stdma_isr = NULL;
-       request_irq(IRQ_MFP_FDC, stdma_int, IRQ_TYPE_SLOW | SA_SHIRQ,
+       request_irq(IRQ_MFP_FDC, stdma_int, IRQ_TYPE_SLOW | IRQF_SHARED,
                    "ST-DMA: floppy/ACSI/IDE/Falcon-SCSI", stdma_int);
 }
 
index 15c16b62dff5cf604c029ff34f59fbe281f07476..a812d03879f891b8e69501f13b2c410ae7241b01 100644 (file)
@@ -159,7 +159,7 @@ static int rtc_release(struct inode *inode, struct file *file)
  *     The various file operations we support.
  */
 
-static struct file_operations rtc_fops = {
+static const struct file_operations rtc_fops = {
        .ioctl =        rtc_ioctl,
        .open =         rtc_open,
        .release =      rtc_release,
index 1c9ecaa473d5795e90ef0540ae3c9accedec9a20..0b68ab8d63d1d5a120f9e4403b317ecdbfd71308 100644 (file)
@@ -10,7 +10,9 @@ endif
 extra-y        += vmlinux.lds
 
 obj-y  := entry.o process.o traps.o ints.o signal.o ptrace.o \
-          sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o
+          sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o devres.o
+
+devres-y = ../../../kernel/irq/devres.o
 
 obj-$(CONFIG_PCI)      += bios32.o
 obj-$(CONFIG_MODULES)  += module.o
index ef89060ea328374d25fe9d03a8a449cf9126d52f..7fd2720c38416f422d70d695d8dc73c67ed0a7b5 100644 (file)
@@ -76,7 +76,7 @@ static inline long get_reg(struct task_struct *task, int regno)
 
        if (regno == PT_USP)
                addr = &task->thread.usp;
-       else if (regno < sizeof(regoff)/sizeof(regoff[0]))
+       else if (regno < ARRAY_SIZE(regoff))
                addr = (unsigned long *)(task->thread.esp0 + regoff[regno]);
        else
                return 0;
@@ -93,7 +93,7 @@ static inline int put_reg(struct task_struct *task, int regno,
 
        if (regno == PT_USP)
                addr = &task->thread.usp;
-       else if (regno < sizeof(regoff)/sizeof(regoff[0]))
+       else if (regno < ARRAY_SIZE(regoff))
                addr = (unsigned long *)(task->thread.esp0 + regoff[regno]);
        else
                return -1;
index 9af3ee0e555d7be8ace62282659b31831cf3642f..42b8fd09ea8f582e83be24770ce434efe164e1b5 100644 (file)
@@ -256,7 +256,7 @@ void __init setup_arch(char **cmdline_p)
        init_mm.brk = (unsigned long) &_end;
 
        *cmdline_p = m68k_command_line;
-       memcpy(saved_command_line, *cmdline_p, CL_SIZE);
+       memcpy(boot_command_line, *cmdline_p, CL_SIZE);
 
        /* Parse the command line for arch-specific options.
         * For the m68k, this is currently only "debug=xxx" to enable printing
index 2a599c3ed7878322239737583dd0137399e19077..4c065f9ceffcd5ab7fcfe6e8de09b3e6d2adacc9 100644 (file)
@@ -159,12 +159,3 @@ int do_settimeofday(struct timespec *tv)
 }
 
 EXPORT_SYMBOL(do_settimeofday);
-
-/*
- * Scheduler clock - returns current time in ns units.
- */
-unsigned long long sched_clock(void)
-{
-       return (unsigned long long)jiffies*(1000000000/HZ);
-}
-
index 759fa244e6cd60cc5e226c486525e64b43aae190..a27a4fa332962a6c35918c1f28c3f6494c026453 100644 (file)
@@ -1011,7 +1011,7 @@ EXPORT_SYMBOL(dump_stack);
 void bad_super_trap (struct frame *fp)
 {
        console_verbose();
-       if (fp->ptregs.vector < 4*sizeof(vec_names)/sizeof(vec_names[0]))
+       if (fp->ptregs.vector < 4 * ARRAY_SIZE(vec_names))
                printk ("*** %s ***   FORMAT=%X\n",
                        vec_names[(fp->ptregs.vector) >> 2],
                        fp->ptregs.format);
index d2794452b195cbcafd1bca92c069df1f85ebdb23..437b4f8d86c58200d15fcce3a0eaa6d99d9a98d3 100644 (file)
@@ -61,10 +61,12 @@ SECTIONS
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
   SECURITY_INIT
+#ifdef CONFIG_BLK_DEV_INITRD
   . = ALIGN(8192);
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
   __initramfs_end = .;
+#endif
   . = ALIGN(8192);
   __init_end = .;
 
index 8c7eccbfc982e31205f37cb7a062b713faa60efd..2868e206fc76816a5cb795fb31632b5e35c7d713 100644 (file)
@@ -55,10 +55,12 @@ __init_begin = .;
        .con_initcall.init : { *(.con_initcall.init) }
        __con_initcall_end = .;
        SECURITY_INIT
+#ifdef CONFIG_BLK_DEV_INITRD
        . = ALIGN(8192);
        __initramfs_start = .;
        .init.ramfs : { *(.init.ramfs) }
        __initramfs_end = .;
+#endif
        . = ALIGN(8192);
        __init_end = .;
        .data.init.task : { *(.data.init_task) }
index b0e4c084df8a062aaf25293908d081dbf9daa5a5..272d47eac58d4f99ceced83b6de7d1258cced58c 100644 (file)
@@ -147,7 +147,7 @@ static int rtc_release(struct inode *inode, struct file *file)
  *     The various file operations we support.
  */
 
-static struct file_operations rtc_fops = {
+static const struct file_operations rtc_fops = {
        .ioctl =        rtc_ioctl,
        .open =         rtc_open,
        .release =      rtc_release,
index 25993c2a8fbbeb4c540218980f05d22c60a9dfcb..823f73736bb5b3c8a35f84e608302224e3abcedd 100644 (file)
@@ -17,6 +17,10 @@ config FPU
        bool
        default n
 
+config ZONE_DMA
+       bool
+       default y
+
 config RWSEM_GENERIC_SPINLOCK
        bool
        default y
@@ -49,6 +53,9 @@ config TIME_LOW_RES
        bool
        default y
 
+config NO_IOPORT
+       def_bool y
+
 source "init/Kconfig"
 
 menu "Processor type and features"
index 9130119537b9ffdbe082e9857f0ea9c657ae159b..72d34962357519477ea234a93e928402a759fc82 100644 (file)
@@ -62,7 +62,7 @@ static inline long get_reg(struct task_struct *task, int regno)
 
        if (regno == PT_USP)
                addr = &task->thread.usp;
-       else if (regno < sizeof(regoff)/sizeof(regoff[0]))
+       else if (regno < ARRAY_SIZE(regoff))
                addr = (unsigned long *)(task->thread.esp0 + regoff[regno]);
        else
                return 0;
@@ -79,7 +79,7 @@ static inline int put_reg(struct task_struct *task, int regno,
 
        if (regno == PT_USP)
                addr = &task->thread.usp;
-       else if (regno < sizeof(regoff)/sizeof(regoff[0]))
+       else if (regno < ARRAY_SIZE(regoff))
                addr = (unsigned long *) (task->thread.esp0 + regoff[regno]);
        else
                return -1;
index 9cf2e4d1fc77e3cf725069b37084e2bb01877063..d5c25d27b64d7f5e02ed8282fbc4867fb411b0d4 100644 (file)
@@ -44,7 +44,7 @@ unsigned long memory_end;
 EXPORT_SYMBOL(memory_start);
 EXPORT_SYMBOL(memory_end);
 
-char command_line[COMMAND_LINE_SIZE];
+char __initdata command_line[COMMAND_LINE_SIZE];
 
 /* setup some dummy routines */
 static void dummy_waitbut(void)
@@ -231,8 +231,8 @@ void setup_arch(char **cmdline_p)
 
        /* Keep a copy of command line */
        *cmdline_p = &command_line[0];
-       memcpy(saved_command_line, command_line, COMMAND_LINE_SIZE);
-       saved_command_line[COMMAND_LINE_SIZE-1] = 0;
+       memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
+       boot_command_line[COMMAND_LINE_SIZE-1] = 0;
 
 #ifdef DEBUG
        if (strlen(*cmdline_p))
index 11ea217ed5cfa153f6d2b8e550ea1a23eee5fea2..467053da2d08343d29f77c7cc31529c7caef8e54 100644 (file)
@@ -174,13 +174,4 @@ int do_settimeofday(struct timespec *tv)
        clock_was_set();
        return 0;
 }
-
-/*
- * Scheduler clock - returns current time in nanosec units.
- */
-unsigned long long sched_clock(void)
-{
-       return (unsigned long long)jiffies * (1000000000 / HZ);
-}
-
 EXPORT_SYMBOL(do_settimeofday);
index 9129b3a5258bc28a8e832eea7dcd809bb7860c44..bed5f47bf568c05c940d19a289085ba5ea4fdbf5 100644 (file)
@@ -158,7 +158,7 @@ void show_stack(struct task_struct *task, unsigned long *stack)
 void bad_super_trap(struct frame *fp)
 {
        console_verbose();
-       if (fp->ptregs.vector < 4*sizeof(vec_names)/sizeof(vec_names[0]))
+       if (fp->ptregs.vector < 4 * ARRAY_SIZE(vec_names))
                printk (KERN_WARNING "*** %s ***   FORMAT=%X\n",
                        vec_names[(fp->ptregs.vector) >> 2],
                        fp->ptregs.format);
index bfade20a9e5e8fd75b53fa24c77c0f1e30591c56..c86a1bf589d4582fb9cf6ee3bac1dc070556333f 100644 (file)
@@ -159,10 +159,12 @@ SECTIONS {
                __security_initcall_start = .;
                *(.security_initcall.init)
                __security_initcall_end = .;
+#ifdef CONFIG_BLK_DEV_INITRD
                . = ALIGN(4);
                __initramfs_start = .;
                *(.init.ramfs)
                __initramfs_end = .;
+#endif
                . = ALIGN(4096);
                __init_end = .;
        } > INIT
index 9d839a9c4b1a10f62b9f938e7ed013509a04178d..a92ce6bd7cf1c89fa867e08126e8d573b61cbb06 100644 (file)
@@ -8,6 +8,10 @@ mainmenu "Linux/MIPS Kernel Configuration"
 
 menu "Machine selection"
 
+config ZONE_DMA
+       bool
+       default y
+
 choice
        prompt "System type"
        default SGI_IP22
@@ -594,8 +598,6 @@ config SGI_IP32
        select ARC
        select ARC32
        select BOOT_ELF32
-       select OWN_DMA
-       select DMA_IP32
        select DMA_NONCOHERENT
        select HW_HAS_PCI
        select R5000_CPU_SCACHE
@@ -753,6 +755,7 @@ config TOSHIBA_JMR3927
        select SWAP_IO_SPACE
        select SYS_HAS_CPU_TX39XX
        select SYS_SUPPORTS_32BIT_KERNEL
+       select SYS_SUPPORTS_LITTLE_ENDIAN
        select SYS_SUPPORTS_BIG_ENDIAN
        select TOSHIBA_BOARDS
 
@@ -767,6 +770,7 @@ config TOSHIBA_RBTX4927
        select SYS_HAS_CPU_TX49XX
        select SYS_SUPPORTS_32BIT_KERNEL
        select SYS_SUPPORTS_64BIT_KERNEL
+       select SYS_SUPPORTS_LITTLE_ENDIAN
        select SYS_SUPPORTS_BIG_ENDIAN
        select TOSHIBA_BOARDS
        select GENERIC_HARDIRQS_NO__DO_IRQ
@@ -877,9 +881,6 @@ config DMA_NONCOHERENT
 config DMA_NEED_PCI_MAP_STATE
        bool
 
-config OWN_DMA
-       bool
-
 config EARLY_PRINTK
        bool
 
index 7504a63646161f81ec3d9176be903d8955c5da57..3901e8e04755502a1af4e5cf55caa8e79beec1a9 100644 (file)
@@ -62,12 +62,6 @@ extern unsigned long save_local_and_disable(int controller);
 extern void restore_local_and_enable(int controller, unsigned long mask);
 extern void local_enable_irq(unsigned int irq_nr);
 
-/* Quick acpi hack. This will have to change! */
-#define        CTL_ACPI 9999
-#define        ACPI_S1_SLP_TYP 19
-#define        ACPI_SLEEP 21
-
-
 static DEFINE_SPINLOCK(pm_lock);
 
 /* We need to save/restore a bunch of core registers that are
@@ -425,15 +419,41 @@ static int pm_do_freq(ctl_table * ctl, int write, struct file *file,
 
 
 static struct ctl_table pm_table[] = {
-       {ACPI_S1_SLP_TYP, "suspend", NULL, 0, 0600, NULL, &pm_do_suspend},
-       {ACPI_SLEEP, "sleep", NULL, 0, 0600, NULL, &pm_do_sleep},
-       {CTL_ACPI, "freq", NULL, 0, 0600, NULL, &pm_do_freq},
-       {0}
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "suspend",
+               .data           = NULL,
+               .maxlen         = 0,
+               .mode           = 0600,
+               .proc_handler   = &pm_do_suspend
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "sleep",
+               .data           = NULL,
+               .maxlen         = 0,
+               .mode           = 0600,
+               .proc_handler   = &pm_do_sleep
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "freq",
+               .data           = NULL,
+               .maxlen         = 0,
+               .mode           = 0600,
+               .proc_handler   = &pm_do_freq
+       },
+       {}
 };
 
 static struct ctl_table pm_dir_table[] = {
-       {CTL_ACPI, "pm", NULL, 0, 0555, pm_table},
-       {0}
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "pm",
+               .mode           = 0555,
+               .child          = pm_table
+       },
+       {}
 };
 
 /*
@@ -441,7 +461,7 @@ static struct ctl_table pm_dir_table[] = {
  */
 static int __init pm_init(void)
 {
-       register_sysctl_table(pm_dir_table, 1);
+       register_sysctl_table(pm_dir_table);
        return 0;
 }
 
index 96090f28373bbfe025871a72dc7adf0c5fa88a77..f21186c12d81f41fae2ca403d59a5d87ec0bc399 100644 (file)
@@ -264,7 +264,7 @@ CONFIG_BINFMT_ELF=y
 CONFIG_MIPS32_COMPAT=y
 CONFIG_COMPAT=y
 CONFIG_MIPS32_O32=y
-# CONFIG_MIPS32_N32 is not set
+CONFIG_MIPS32_N32=y
 CONFIG_BINFMT_ELF32=y
 
 #
index b251ef864c33b281fa899a295c266f10f48db98d..00cecdcc75f215cb6e5a6581442774996fcc26f3 100644 (file)
                 srlv   t3,t1,t2
 
 handle_it:
-               LONG_L  s0, TI_REGS($28)
-               LONG_S  sp, TI_REGS($28)
-               PTR_LA  ra, ret_from_irq
                j       dec_irq_dispatch
                 nop
 
@@ -277,7 +274,6 @@ fpu:
 #endif
 
 spurious:
-               PTR_LA  ra, _ret_from_irq
                j       spurious_interrupt
                 nop
                END(plat_irq_dispatch)
index ea7df4b8da338d92822f35d72d96e52324415429..c0b089d47181bcd946f740571f0aed7b788c517b 100644 (file)
@@ -249,7 +249,6 @@ void output_sc_defines(void)
        offset("#define SC_MDHI       ", struct sigcontext, sc_mdhi);
        offset("#define SC_MDLO       ", struct sigcontext, sc_mdlo);
        offset("#define SC_PC         ", struct sigcontext, sc_pc);
-       offset("#define SC_STATUS     ", struct sigcontext, sc_status);
        offset("#define SC_FPC_CSR    ", struct sigcontext, sc_fpc_csr);
        offset("#define SC_FPC_EIR    ", struct sigcontext, sc_fpc_eir);
        offset("#define SC_HI1        ", struct sigcontext, sc_hi1);
index f10b6a19f8bf7b672242dbf2dcf9bf1f495c7c13..0b78fcbf044ab563453850fe8d404ca3615b6053 100644 (file)
 #endif
 
 #ifndef CONFIG_PREEMPT
-       .macro  preempt_stop
-       local_irq_disable
-       .endm
 #define resume_kernel  restore_all
+#else
+#define __ret_from_irq ret_from_exception
 #endif
 
        .text
        .align  5
-FEXPORT(ret_from_irq)
-       LONG_S  s0, TI_REGS($28)
-#ifdef CONFIG_PREEMPT
-FEXPORT(ret_from_exception)
-#else
-       b       _ret_from_irq
+#ifndef CONFIG_PREEMPT
 FEXPORT(ret_from_exception)
-       preempt_stop
+       local_irq_disable                       # preempt stop
+       b       __ret_from_irq
 #endif
-FEXPORT(_ret_from_irq)
+FEXPORT(ret_from_irq)
+       LONG_S  s0, TI_REGS($28)
+FEXPORT(__ret_from_irq)
        LONG_L  t0, PT_STATUS(sp)               # returning to kernel mode?
        andi    t0, t0, KU_USER
        beqz    t0, resume_kernel
index 0b8ce59429a8d1e3e73a6fe22cfe9b61b6429b40..fc4dd6c9dd802c8308f16f422b7f93cc15734905 100644 (file)
@@ -39,6 +39,7 @@
 #include <net/sock.h>
 #include <net/scm.h>
 
+#include <asm/compat-signal.h>
 #include <asm/ipc.h>
 #include <asm/sim.h>
 #include <asm/uaccess.h>
@@ -193,50 +194,6 @@ sysn32_waitid(int which, compat_pid_t pid,
        return ret;
 }
 
-struct sysinfo32 {
-       s32 uptime;
-       u32 loads[3];
-       u32 totalram;
-       u32 freeram;
-       u32 sharedram;
-       u32 bufferram;
-       u32 totalswap;
-       u32 freeswap;
-       u16 procs;
-       u32 totalhigh;
-       u32 freehigh;
-       u32 mem_unit;
-       char _f[8];
-};
-
-asmlinkage int sys32_sysinfo(struct sysinfo32 __user *info)
-{
-       struct sysinfo s;
-       int ret, err;
-       mm_segment_t old_fs = get_fs ();
-
-       set_fs (KERNEL_DS);
-       ret = sys_sysinfo((struct sysinfo __user *)&s);
-       set_fs (old_fs);
-       err = put_user (s.uptime, &info->uptime);
-       err |= __put_user (s.loads[0], &info->loads[0]);
-       err |= __put_user (s.loads[1], &info->loads[1]);
-       err |= __put_user (s.loads[2], &info->loads[2]);
-       err |= __put_user (s.totalram, &info->totalram);
-       err |= __put_user (s.freeram, &info->freeram);
-       err |= __put_user (s.sharedram, &info->sharedram);
-       err |= __put_user (s.bufferram, &info->bufferram);
-       err |= __put_user (s.totalswap, &info->totalswap);
-       err |= __put_user (s.freeswap, &info->freeswap);
-       err |= __put_user (s.procs, &info->procs);
-       err |= __put_user (s.totalhigh, &info->totalhigh);
-       err |= __put_user (s.freehigh, &info->freehigh);
-       err |= __put_user (s.mem_unit, &info->mem_unit);
-       if (err)
-               return -EFAULT;
-       return ret;
-}
-
 #define RLIM_INFINITY32        0x7fffffff
 #define RESOURCE32(x) ((x > RLIM_INFINITY32) ? RLIM_INFINITY32 : x)
 
@@ -780,3 +737,49 @@ _sys32_clone(nabi_no_regargs struct pt_regs regs)
        return do_fork(clone_flags, newsp, &regs, 0,
                       parent_tidptr, child_tidptr);
 }
+
+/*
+ * Implement the event wait interface for the eventpoll file. It is the kernel
+ * part of the user space epoll_pwait(2).
+ */
+asmlinkage long compat_sys_epoll_pwait(int epfd,
+       struct epoll_event __user *events, int maxevents, int timeout,
+       const compat_sigset_t __user *sigmask, size_t sigsetsize)
+{
+       int error;
+       sigset_t ksigmask, sigsaved;
+
+       /*
+        * If the caller wants a certain signal mask to be set during the wait,
+        * we apply it here.
+        */
+       if (sigmask) {
+               if (sigsetsize != sizeof(sigset_t))
+                       return -EINVAL;
+               if (!access_ok(VERIFY_READ, sigmask, sizeof(ksigmask)))
+                       return -EFAULT;
+               if (__copy_conv_sigset_from_user(&ksigmask, sigmask))
+                       return -EFAULT;
+               sigdelsetmask(&ksigmask, sigmask(SIGKILL) | sigmask(SIGSTOP));
+               sigprocmask(SIG_SETMASK, &ksigmask, &sigsaved);
+       }
+
+       error = sys_epoll_wait(epfd, events, maxevents, timeout);
+
+       /*
+        * If we changed the signal mask, we need to restore the original one.
+        * In case we've got a signal while waiting, we do not restore the
+        * signal mask yet, and we allow do_signal() to deliver the signal on
+        * the way back to userspace, before the signal mask is restored.
+        */
+       if (sigmask) {
+               if (error == -EINTR) {
+                       memcpy(&current->saved_sigmask, &sigsaved,
+                               sizeof(sigsaved));
+                       set_thread_flag(TIF_RESTORE_SIGMASK);
+               } else
+                       sigprocmask(SIG_SETMASK, &sigsaved, NULL);
+       }
+
+       return error;
+}
index a32f6797353aa32fc6b25b770a1b867cf62f2909..ba01800b601874d4a224c2752d8682dd1c606853 100644 (file)
@@ -3,9 +3,11 @@
  * Copyright (C) 2005 Mips Technologies, Inc
  */
 
+#include <linux/device.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/cpumask.h>
+#include <linux/module.h>
 #include <linux/interrupt.h>
 #include <linux/security.h>
 
@@ -453,3 +455,20 @@ void mt_cflush_release(void)
 #endif /* CONFIG_MIPS_MT_SMTC */
        /* FILL IN VSMP and AP/SP VERSIONS HERE */
 }
+
+struct class *mt_class;
+
+static int __init mt_init(void)
+{
+       struct class *mtc;
+
+       mtc = class_create(THIS_MODULE, "mt");
+       if (IS_ERR(mtc))
+               return PTR_ERR(mtc);
+
+       mt_class = mtc;
+
+       return 0;
+}
+
+subsys_initcall(mt_init);
index 8610f4a925e90a043a4ebd17ccddb5c899f98e0f..d92c48e0d7a6dd1aac6e5260e3d2f148530bdef2 100644 (file)
@@ -17,6 +17,7 @@
  *
  */
 
+#include <linux/device.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/fs.h>
@@ -34,6 +35,7 @@
 #include <linux/sched.h>
 #include <linux/wait.h>
 #include <asm/mipsmtregs.h>
+#include <asm/mips_mt.h>
 #include <asm/cacheflush.h>
 #include <asm/atomic.h>
 #include <asm/cpu.h>
@@ -476,7 +478,7 @@ static ssize_t file_write(struct file *file, const char __user * buffer,
        return rtlx_write(minor, (void *)buffer, count, 1);
 }
 
-static struct file_operations rtlx_fops = {
+static const struct file_operations rtlx_fops = {
        .owner =   THIS_MODULE,
        .open =    file_open,
        .release = file_release,
@@ -498,7 +500,8 @@ static char register_chrdev_failed[] __initdata =
 
 static int rtlx_module_init(void)
 {
-       int i;
+       struct device *dev;
+       int i, err;
 
        major = register_chrdev(0, module_name, &rtlx_fops);
        if (major < 0) {
@@ -511,6 +514,13 @@ static int rtlx_module_init(void)
                init_waitqueue_head(&channel_wqs[i].rt_queue);
                init_waitqueue_head(&channel_wqs[i].lx_queue);
                channel_wqs[i].in_open = 0;
+
+               dev = device_create(mt_class, NULL, MKDEV(major, i),
+                                   "%s%d", module_name, i);
+               if (IS_ERR(dev)) {
+                       err = PTR_ERR(dev);
+                       goto out_chrdev;
+               }
        }
 
        /* set up notifiers */
@@ -525,10 +535,21 @@ static int rtlx_module_init(void)
        setup_irq(rtlx_irq_num, &rtlx_irq);
 
        return 0;
+
+out_chrdev:
+       for (i = 0; i < RTLX_CHANNELS; i++)
+               device_destroy(mt_class, MKDEV(major, i));
+
+       return err;
 }
 
 static void __exit rtlx_module_exit(void)
 {
+       int i;
+
+       for (i = 0; i < RTLX_CHANNELS; i++)
+               device_destroy(mt_class, MKDEV(major, i));
+
        unregister_chrdev(major, module_name);
 }
 
index e569b846e9a380ff96e65507f6e13ec3d5f6e414..10e9a18630aa47b168c8140b99f80875e5c76c32 100644 (file)
@@ -470,4 +470,4 @@ sys_call_table:
        PTR     sys_get_robust_list
        PTR     sys_kexec_load                  /* 5270 */
        PTR     sys_getcpu
-       PTR     sys_epoll_pwait
+       PTR     compat_sys_epoll_pwait
index 39add2341aa296f303f0d4f0b0d18c67aa232a74..2ceda4644a4d7b4ee64d778753b8fcd0c9dce170 100644 (file)
@@ -217,7 +217,7 @@ EXPORT(sysn32_call_table)
        PTR     sys32_gettimeofday
        PTR     compat_sys_getrlimit            /* 6095 */
        PTR     compat_sys_getrusage
-       PTR     sys32_sysinfo
+       PTR     compat_sys_sysinfo
        PTR     compat_sys_times
        PTR     sys32_ptrace
        PTR     sys_getuid                      /* 6100 */
@@ -396,4 +396,4 @@ EXPORT(sysn32_call_table)
        PTR     compat_sys_get_robust_list
        PTR     compat_sys_kexec_load
        PTR     sys_getcpu
-       PTR     sys_epoll_pwait
+       PTR     compat_sys_epoll_pwait
index c58b8e0105ea0db8fa4cc2994324fddde7a4d17b..c5f590ca99b09d47a293a40b2c55ae83a01687dd 100644 (file)
@@ -321,7 +321,7 @@ sys_call_table:
        PTR     sys_ni_syscall                  /* sys_vm86 */
        PTR     compat_sys_wait4
        PTR     sys_swapoff                     /* 4115 */
-       PTR     sys32_sysinfo
+       PTR     compat_sys_sysinfo
        PTR     sys32_ipc
        PTR     sys_fsync
        PTR     sys32_sigreturn
index d2e01e7167b86a2e644d5d12d0fc2647ce1b5c8a..394540fad7699ef4e773f03ef30feb7301d7386b 100644 (file)
@@ -452,7 +452,7 @@ static void __init arch_mem_init(char **cmdline_p)
        print_memory_map();
 
        strlcpy(command_line, arcs_cmdline, sizeof(command_line));
-       strlcpy(saved_command_line, command_line, COMMAND_LINE_SIZE);
+       strlcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
 
        *cmdline_p = command_line;
 
index b1f09d54ebe64396ba88f33ceabf0ed21b1c6419..fdbdbdc65b543b6333610afcdf0f68d318b1151e 100644 (file)
  * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
  */
 
+#ifndef __SIGNAL_COMMON_H
+#define __SIGNAL_COMMON_H
 
-static inline int
-setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
-{
-       int err = 0;
+/* #define DEBUG_SIG */
 
-       err |= __put_user(regs->cp0_epc, &sc->sc_pc);
+#ifdef DEBUG_SIG
+#  define DEBUGP(fmt, args...) printk("%s: " fmt, __FUNCTION__ , ##args)
+#else
+#  define DEBUGP(fmt, args...)
+#endif
 
-#define save_gp_reg(i) do {                                            \
-       err |= __put_user(regs->regs[i], &sc->sc_regs[i]);              \
-} while(0)
-       __put_user(0, &sc->sc_regs[0]); save_gp_reg(1); save_gp_reg(2);
-       save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);
-       save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);
-       save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);
-       save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);
-       save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);
-       save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);
-       save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);
-       save_gp_reg(31);
-#undef save_gp_reg
-
-       err |= __put_user(regs->hi, &sc->sc_mdhi);
-       err |= __put_user(regs->lo, &sc->sc_mdlo);
-       if (cpu_has_dsp) {
-               err |= __put_user(mfhi1(), &sc->sc_hi1);
-               err |= __put_user(mflo1(), &sc->sc_lo1);
-               err |= __put_user(mfhi2(), &sc->sc_hi2);
-               err |= __put_user(mflo2(), &sc->sc_lo2);
-               err |= __put_user(mfhi3(), &sc->sc_hi3);
-               err |= __put_user(mflo3(), &sc->sc_lo3);
-               err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
-       }
-
-       err |= __put_user(!!used_math(), &sc->sc_used_math);
-
-       if (!used_math())
-               goto out;
-
-       /*
-        * Save FPU state to signal context.  Signal handler will "inherit"
-        * current FPU state.
-        */
-       preempt_disable();
-
-       if (!is_fpu_owner()) {
-               own_fpu();
-               restore_fp(current);
-       }
-       err |= save_fp_context(sc);
-
-       preempt_enable();
-
-out:
-       return err;
-}
-
-static inline int
-restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
-{
-       unsigned int used_math;
-       unsigned long treg;
-       int err = 0;
-
-       /* Always make any pending restarted system calls return -EINTR */
-       current_thread_info()->restart_block.fn = do_no_restart_syscall;
-
-       err |= __get_user(regs->cp0_epc, &sc->sc_pc);
-       err |= __get_user(regs->hi, &sc->sc_mdhi);
-       err |= __get_user(regs->lo, &sc->sc_mdlo);
-       if (cpu_has_dsp) {
-               err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
-               err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
-               err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
-               err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
-               err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
-               err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
-               err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
-       }
-
-#define restore_gp_reg(i) do {                                         \
-       err |= __get_user(regs->regs[i], &sc->sc_regs[i]);              \
-} while(0)
-       restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);
-       restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);
-       restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);
-       restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);
-       restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);
-       restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);
-       restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);
-       restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);
-       restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);
-       restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);
-       restore_gp_reg(31);
-#undef restore_gp_reg
-
-       err |= __get_user(used_math, &sc->sc_used_math);
-       conditional_used_math(used_math);
-
-       preempt_disable();
-
-       if (used_math()) {
-               /* restore fpu context if we have used it before */
-               own_fpu();
-               err |= restore_fp_context(sc);
-       } else {
-               /* signal handler may have used FPU.  Give it up. */
-               lose_fpu();
-       }
-
-       preempt_enable();
-
-       return err;
-}
+#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
 
 /*
  * Determine which stack to use..
  */
-static inline void __user *
-get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
-{
-       unsigned long sp;
-
-       /* Default to using normal stack */
-       sp = regs->regs[29];
-
-       /*
-        * FPU emulator may have it's own trampoline active just
-        * above the user stack, 16-bytes before the next lowest
-        * 16 byte boundary.  Try to avoid trashing it.
-        */
-       sp -= 32;
-
-       /* This is the X/Open sanctioned signal stack switching.  */
-       if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0))
-               sp = current->sas_ss_sp + current->sas_ss_size;
-
-       return (void __user *)((sp - frame_size) & (ICACHE_REFILLS_WORKAROUND_WAR ? ~(cpu_icache_line_size()-1) : ALMASK));
-}
-
-static inline int install_sigtramp(unsigned int __user *tramp,
-       unsigned int syscall)
-{
-       int err;
-
-       /*
-        * Set up the return code ...
-        *
-        *         li      v0, __NR__foo_sigreturn
-        *         syscall
-        */
-
-       err = __put_user(0x24020000 + syscall, tramp + 0);
-       err |= __put_user(0x0000000c          , tramp + 1);
-       if (ICACHE_REFILLS_WORKAROUND_WAR) {
-               err |= __put_user(0, tramp + 2);
-               err |= __put_user(0, tramp + 3);
-               err |= __put_user(0, tramp + 4);
-               err |= __put_user(0, tramp + 5);
-               err |= __put_user(0, tramp + 6);
-               err |= __put_user(0, tramp + 7);
-       }
-       flush_cache_sigtramp((unsigned long) tramp);
+extern void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
+                                size_t frame_size);
+/*
+ * install trampoline code to get back from the sig handler
+ */
+extern int install_sigtramp(unsigned int __user *tramp, unsigned int syscall);
 
-       return err;
-}
+#endif /* __SIGNAL_COMMON_H */
index 9a44053cd9f18143521584d27165064bddbd254d..b2e9ab1bb10152b6c3c712c1b27adbddd021ff8a 100644 (file)
 
 #include "signal-common.h"
 
-#define DEBUG_SIG 0
+/*
+ * Horribly complicated - with the bloody RM9000 workarounds enabled
+ * the signal trampolines is moving to the end of the structure so we can
+ * increase the alignment without breaking software compatibility.
+ */
+#if ICACHE_REFILLS_WORKAROUND_WAR == 0
+
+struct sigframe {
+       u32 sf_ass[4];          /* argument save space for o32 */
+       u32 sf_code[2];         /* signal trampoline */
+       struct sigcontext sf_sc;
+       sigset_t sf_mask;
+};
+
+struct rt_sigframe {
+       u32 rs_ass[4];          /* argument save space for o32 */
+       u32 rs_code[2];         /* signal trampoline */
+       struct siginfo rs_info;
+       struct ucontext rs_uc;
+};
+
+#else
+
+struct sigframe {
+       u32 sf_ass[4];                  /* argument save space for o32 */
+       u32 sf_pad[2];
+       struct sigcontext sf_sc;        /* hw context */
+       sigset_t sf_mask;
+       u32 sf_code[8] ____cacheline_aligned;   /* signal trampoline */
+};
+
+struct rt_sigframe {
+       u32 rs_ass[4];                  /* argument save space for o32 */
+       u32 rs_pad[2];
+       struct siginfo rs_info;
+       struct ucontext rs_uc;
+       u32 rs_code[8] ____cacheline_aligned;   /* signal trampoline */
+};
+
+#endif
+
+/*
+ * Helper routines
+ */
+int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
+{
+       int err = 0;
+       int i;
+
+       err |= __put_user(regs->cp0_epc, &sc->sc_pc);
+
+       err |= __put_user(0, &sc->sc_regs[0]);
+       for (i = 1; i < 32; i++)
+               err |= __put_user(regs->regs[i], &sc->sc_regs[i]);
+
+       err |= __put_user(regs->hi, &sc->sc_mdhi);
+       err |= __put_user(regs->lo, &sc->sc_mdlo);
+       if (cpu_has_dsp) {
+               err |= __put_user(mfhi1(), &sc->sc_hi1);
+               err |= __put_user(mflo1(), &sc->sc_lo1);
+               err |= __put_user(mfhi2(), &sc->sc_hi2);
+               err |= __put_user(mflo2(), &sc->sc_lo2);
+               err |= __put_user(mfhi3(), &sc->sc_hi3);
+               err |= __put_user(mflo3(), &sc->sc_lo3);
+               err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
+       }
+
+       err |= __put_user(!!used_math(), &sc->sc_used_math);
+
+       if (used_math()) {
+               /*
+                * Save FPU state to signal context. Signal handler
+                * will "inherit" current FPU state.
+                */
+               preempt_disable();
+
+               if (!is_fpu_owner()) {
+                       own_fpu();
+                       restore_fp(current);
+               }
+               err |= save_fp_context(sc);
+
+               preempt_enable();
+       }
+       return err;
+}
+
+int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
+{
+       unsigned int used_math;
+       unsigned long treg;
+       int err = 0;
+       int i;
+
+       /* Always make any pending restarted system calls return -EINTR */
+       current_thread_info()->restart_block.fn = do_no_restart_syscall;
+
+       err |= __get_user(regs->cp0_epc, &sc->sc_pc);
+       err |= __get_user(regs->hi, &sc->sc_mdhi);
+       err |= __get_user(regs->lo, &sc->sc_mdlo);
+       if (cpu_has_dsp) {
+               err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
+               err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
+               err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
+               err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
+               err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
+               err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
+               err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
+       }
+
+       for (i = 1; i < 32; i++)
+               err |= __get_user(regs->regs[i], &sc->sc_regs[i]);
+
+       err |= __get_user(used_math, &sc->sc_used_math);
+       conditional_used_math(used_math);
+
+       preempt_disable();
+
+       if (used_math()) {
+               /* restore fpu context if we have used it before */
+               own_fpu();
+               err |= restore_fp_context(sc);
+       } else {
+               /* signal handler may have used FPU.  Give it up. */
+               lose_fpu();
+       }
+
+       preempt_enable();
+
+       return err;
+}
+
+void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
+                         size_t frame_size)
+{
+       unsigned long sp;
+
+       /* Default to using normal stack */
+       sp = regs->regs[29];
+
+       /*
+        * FPU emulator may have it's own trampoline active just
+        * above the user stack, 16-bytes before the next lowest
+        * 16 byte boundary.  Try to avoid trashing it.
+        */
+       sp -= 32;
+
+       /* This is the X/Open sanctioned signal stack switching.  */
+       if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0))
+               sp = current->sas_ss_sp + current->sas_ss_size;
+
+       return (void __user *)((sp - frame_size) & (ICACHE_REFILLS_WORKAROUND_WAR ? ~(cpu_icache_line_size()-1) : ALMASK));
+}
+
+int install_sigtramp(unsigned int __user *tramp, unsigned int syscall)
+{
+       int err;
+
+       /*
+        * Set up the return code ...
+        *
+        *         li      v0, __NR__foo_sigreturn
+        *         syscall
+        */
+
+       err = __put_user(0x24020000 + syscall, tramp + 0);
+       err |= __put_user(0x0000000c         , tramp + 1);
+       if (ICACHE_REFILLS_WORKAROUND_WAR) {
+               err |= __put_user(0, tramp + 2);
+               err |= __put_user(0, tramp + 3);
+               err |= __put_user(0, tramp + 4);
+               err |= __put_user(0, tramp + 5);
+               err |= __put_user(0, tramp + 6);
+               err |= __put_user(0, tramp + 7);
+       }
+       flush_cache_sigtramp((unsigned long) tramp);
 
-#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
+       return err;
+}
 
 /*
  * Atomically swap in the new signal mask, and wait for a signal.
  */
 
 #ifdef CONFIG_TRAD_SIGNALS
-save_static_function(sys_sigsuspend);
-__attribute_used__ noinline static int
-_sys_sigsuspend(nabi_no_regargs struct pt_regs regs)
+asmlinkage int sys_sigsuspend(nabi_no_regargs struct pt_regs regs)
 {
        sigset_t newset;
        sigset_t __user *uset;
@@ -68,9 +242,7 @@ _sys_sigsuspend(nabi_no_regargs struct pt_regs regs)
 }
 #endif
 
-save_static_function(sys_rt_sigsuspend);
-__attribute_used__ noinline static int
-_sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
+asmlinkage int sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
 {
        sigset_t newset;
        sigset_t __user *unewset;
@@ -148,45 +320,8 @@ asmlinkage int sys_sigaltstack(nabi_no_regargs struct pt_regs regs)
        return do_sigaltstack(uss, uoss, usp);
 }
 
-/*
- * Horribly complicated - with the bloody RM9000 workarounds enabled
- * the signal trampolines is moving to the end of the structure so we can
- * increase the alignment without breaking software compatibility.
- */
 #ifdef CONFIG_TRAD_SIGNALS
-struct sigframe {
-       u32 sf_ass[4];                  /* argument save space for o32 */
-#if ICACHE_REFILLS_WORKAROUND_WAR
-       u32 sf_pad[2];
-#else
-       u32 sf_code[2];                 /* signal trampoline */
-#endif
-       struct sigcontext sf_sc;
-       sigset_t sf_mask;
-#if ICACHE_REFILLS_WORKAROUND_WAR
-       u32 sf_code[8] ____cacheline_aligned;   /* signal trampoline */
-#endif
-};
-#endif
-
-struct rt_sigframe {
-       u32 rs_ass[4];                  /* argument save space for o32 */
-#if ICACHE_REFILLS_WORKAROUND_WAR
-       u32 rs_pad[2];
-#else
-       u32 rs_code[2];                 /* signal trampoline */
-#endif
-       struct siginfo rs_info;
-       struct ucontext rs_uc;
-#if ICACHE_REFILLS_WORKAROUND_WAR
-       u32 rs_code[8] ____cacheline_aligned;   /* signal trampoline */
-#endif
-};
-
-#ifdef CONFIG_TRAD_SIGNALS
-save_static_function(sys_sigreturn);
-__attribute_used__ noinline static void
-_sys_sigreturn(nabi_no_regargs struct pt_regs regs)
+asmlinkage void sys_sigreturn(nabi_no_regargs struct pt_regs regs)
 {
        struct sigframe __user *frame;
        sigset_t blocked;
@@ -221,9 +356,7 @@ badframe:
 }
 #endif /* CONFIG_TRAD_SIGNALS */
 
-save_static_function(sys_rt_sigreturn);
-__attribute_used__ noinline static void
-_sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
+asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
 {
        struct rt_sigframe __user *frame;
        sigset_t set;
@@ -275,7 +408,7 @@ int setup_frame(struct k_sigaction * ka, struct pt_regs *regs,
        if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
                goto give_sigsegv;
 
-       install_sigtramp(frame->sf_code, __NR_sigreturn);
+       err |= install_sigtramp(frame->sf_code, __NR_sigreturn);
 
        err |= setup_sigcontext(regs, &frame->sf_sc);
        err |= __copy_to_user(&frame->sf_mask, set, sizeof(*set));
@@ -299,11 +432,9 @@ int setup_frame(struct k_sigaction * ka, struct pt_regs *regs,
        regs->regs[31] = (unsigned long) frame->sf_code;
        regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
 
-#if DEBUG_SIG
-       printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
+       DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
               current->comm, current->pid,
-              frame, regs->cp0_epc, frame->regs[31]);
-#endif
+              frame, regs->cp0_epc, regs->regs[31]);
        return 0;
 
 give_sigsegv:
@@ -322,7 +453,7 @@ int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs,
        if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
                goto give_sigsegv;
 
-       install_sigtramp(frame->rs_code, __NR_rt_sigreturn);
+       err |= install_sigtramp(frame->rs_code, __NR_rt_sigreturn);
 
        /* Create siginfo.  */
        err |= copy_siginfo_to_user(&frame->rs_info, info);
@@ -359,11 +490,10 @@ int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs,
        regs->regs[31] = (unsigned long) frame->rs_code;
        regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
 
-#if DEBUG_SIG
-       printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
+       DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
               current->comm, current->pid,
               frame, regs->cp0_epc, regs->regs[31]);
-#endif
+
        return 0;
 
 give_sigsegv:
@@ -371,7 +501,7 @@ give_sigsegv:
        return -EFAULT;
 }
 
-static inline int handle_signal(unsigned long sig, siginfo_t *info,
+static int handle_signal(unsigned long sig, siginfo_t *info,
        struct k_sigaction *ka, sigset_t *oldset, struct pt_regs *regs)
 {
        int ret;
index c86a5ddff050a78661eced6ca74a68b5358b5187..c28cb21514c858dc856918f22211f4036565b7c7 100644 (file)
@@ -8,6 +8,7 @@
  * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
  */
 #include <linux/cache.h>
+#include <linux/compat.h>
 #include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/smp.h>
@@ -24,6 +25,7 @@
 
 #include <asm/abi.h>
 #include <asm/asm.h>
+#include <asm/compat-signal.h>
 #include <linux/bitops.h>
 #include <asm/cacheflush.h>
 #include <asm/sim.h>
@@ -33,6 +35,8 @@
 #include <asm/fpu.h>
 #include <asm/war.h>
 
+#include "signal-common.h"
+
 #define SI_PAD_SIZE32   ((SI_MAX_SIZE/sizeof(int)) - 3)
 
 typedef struct compat_siginfo {
@@ -102,10 +106,6 @@ typedef struct compat_siginfo {
 #define __NR_O32_rt_sigreturn          4193
 #define __NR_O32_restart_syscall       4253
 
-#define DEBUG_SIG 0
-
-#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
-
 /* 32-bit compatibility types */
 
 #define _NSIG_BPW32    32
@@ -139,6 +139,143 @@ struct ucontext32 {
        sigset_t32          uc_sigmask;   /* mask last for extensibility */
 };
 
+/*
+ * Horribly complicated - with the bloody RM9000 workarounds enabled
+ * the signal trampolines is moving to the end of the structure so we can
+ * increase the alignment without breaking software compatibility.
+ */
+#if ICACHE_REFILLS_WORKAROUND_WAR == 0
+
+struct sigframe32 {
+       u32 sf_ass[4];          /* argument save space for o32 */
+       u32 sf_code[2];         /* signal trampoline */
+       struct sigcontext32 sf_sc;
+       sigset_t sf_mask;
+};
+
+struct rt_sigframe32 {
+       u32 rs_ass[4];                  /* argument save space for o32 */
+       u32 rs_code[2];                 /* signal trampoline */
+       compat_siginfo_t rs_info;
+       struct ucontext32 rs_uc;
+};
+
+#else  /* ICACHE_REFILLS_WORKAROUND_WAR */
+
+struct sigframe32 {
+       u32 sf_ass[4];                  /* argument save space for o32 */
+       u32 sf_pad[2];
+       struct sigcontext32 sf_sc;      /* hw context */
+       sigset_t sf_mask;
+       u32 sf_code[8] ____cacheline_aligned;   /* signal trampoline */
+};
+
+struct rt_sigframe32 {
+       u32 rs_ass[4];                  /* argument save space for o32 */
+       u32 rs_pad[2];
+       compat_siginfo_t rs_info;
+       struct ucontext32 rs_uc;
+       u32 rs_code[8] __attribute__((aligned(32)));    /* signal trampoline */
+};
+
+#endif /* !ICACHE_REFILLS_WORKAROUND_WAR */
+
+/*
+ * sigcontext handlers
+ */
+static int setup_sigcontext32(struct pt_regs *regs,
+                             struct sigcontext32 __user *sc)
+{
+       int err = 0;
+       int i;
+
+       err |= __put_user(regs->cp0_epc, &sc->sc_pc);
+
+       err |= __put_user(0, &sc->sc_regs[0]);
+       for (i = 1; i < 32; i++)
+               err |= __put_user(regs->regs[i], &sc->sc_regs[i]);
+
+       err |= __put_user(regs->hi, &sc->sc_mdhi);
+       err |= __put_user(regs->lo, &sc->sc_mdlo);
+       if (cpu_has_dsp) {
+               err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
+               err |= __put_user(mfhi1(), &sc->sc_hi1);
+               err |= __put_user(mflo1(), &sc->sc_lo1);
+               err |= __put_user(mfhi2(), &sc->sc_hi2);
+               err |= __put_user(mflo2(), &sc->sc_lo2);
+               err |= __put_user(mfhi3(), &sc->sc_hi3);
+               err |= __put_user(mflo3(), &sc->sc_lo3);
+       }
+
+       err |= __put_user(!!used_math(), &sc->sc_used_math);
+
+       if (used_math()) {
+               /*
+                * Save FPU state to signal context.  Signal handler
+                * will "inherit" current FPU state.
+                */
+               preempt_disable();
+
+               if (!is_fpu_owner()) {
+                       own_fpu();
+                       restore_fp(current);
+               }
+               err |= save_fp_context32(sc);
+
+               preempt_enable();
+       }
+       return err;
+}
+
+static int restore_sigcontext32(struct pt_regs *regs,
+                               struct sigcontext32 __user *sc)
+{
+       u32 used_math;
+       int err = 0;
+       s32 treg;
+       int i;
+
+       /* Always make any pending restarted system calls return -EINTR */
+       current_thread_info()->restart_block.fn = do_no_restart_syscall;
+
+       err |= __get_user(regs->cp0_epc, &sc->sc_pc);
+       err |= __get_user(regs->hi, &sc->sc_mdhi);
+       err |= __get_user(regs->lo, &sc->sc_mdlo);
+       if (cpu_has_dsp) {
+               err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
+               err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
+               err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
+               err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
+               err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
+               err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
+               err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
+       }
+
+       for (i = 1; i < 32; i++)
+               err |= __get_user(regs->regs[i], &sc->sc_regs[i]);
+
+       err |= __get_user(used_math, &sc->sc_used_math);
+       conditional_used_math(used_math);
+
+       preempt_disable();
+
+       if (used_math()) {
+               /* restore fpu context if we have used it before */
+               own_fpu();
+               err |= restore_fp_context32(sc);
+       } else {
+               /* signal handler may have used FPU.  Give it up. */
+               lose_fpu();
+       }
+
+       preempt_enable();
+
+       return err;
+}
+
+/*
+ *
+ */
 extern void __put_sigset_unknown_nsig(void);
 extern void __get_sigset_unknown_nsig(void);
 
@@ -191,9 +328,7 @@ static inline int get_sigset(sigset_t *kbuf, const compat_sigset_t __user *ubuf)
  * Atomically swap in the new signal mask, and wait for a signal.
  */
 
-save_static_function(sys32_sigsuspend);
-__attribute_used__ noinline static int
-_sys32_sigsuspend(nabi_no_regargs struct pt_regs regs)
+asmlinkage int sys32_sigsuspend(nabi_no_regargs struct pt_regs regs)
 {
        compat_sigset_t __user *uset;
        sigset_t newset;
@@ -215,9 +350,7 @@ _sys32_sigsuspend(nabi_no_regargs struct pt_regs regs)
        return -ERESTARTNOHAND;
 }
 
-save_static_function(sys32_rt_sigsuspend);
-__attribute_used__ noinline static int
-_sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
+asmlinkage int sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
 {
        compat_sigset_t __user *uset;
        sigset_t newset;
@@ -326,91 +459,6 @@ asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs)
        return ret;
 }
 
-static int restore_sigcontext32(struct pt_regs *regs, struct sigcontext32 __user *sc)
-{
-       u32 used_math;
-       int err = 0;
-       s32 treg;
-
-       /* Always make any pending restarted system calls return -EINTR */
-       current_thread_info()->restart_block.fn = do_no_restart_syscall;
-
-       err |= __get_user(regs->cp0_epc, &sc->sc_pc);
-       err |= __get_user(regs->hi, &sc->sc_mdhi);
-       err |= __get_user(regs->lo, &sc->sc_mdlo);
-       if (cpu_has_dsp) {
-               err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
-               err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
-               err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
-               err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
-               err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
-               err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
-               err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
-       }
-
-#define restore_gp_reg(i) do {                                         \
-       err |= __get_user(regs->regs[i], &sc->sc_regs[i]);              \
-} while(0)
-       restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);
-       restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);
-       restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);
-       restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);
-       restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);
-       restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);
-       restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);
-       restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);
-       restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);
-       restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);
-       restore_gp_reg(31);
-#undef restore_gp_reg
-
-       err |= __get_user(used_math, &sc->sc_used_math);
-       conditional_used_math(used_math);
-
-       preempt_disable();
-
-       if (used_math()) {
-               /* restore fpu context if we have used it before */
-               own_fpu();
-               err |= restore_fp_context32(sc);
-       } else {
-               /* signal handler may have used FPU.  Give it up. */
-               lose_fpu();
-       }
-
-       preempt_enable();
-
-       return err;
-}
-
-struct sigframe {
-       u32 sf_ass[4];                  /* argument save space for o32 */
-#if ICACHE_REFILLS_WORKAROUND_WAR
-       u32 sf_pad[2];
-#else
-       u32 sf_code[2];                 /* signal trampoline */
-#endif
-       struct sigcontext32 sf_sc;
-       sigset_t sf_mask;
-#if ICACHE_REFILLS_WORKAROUND_WAR
-       u32 sf_code[8] ____cacheline_aligned;   /* signal trampoline */
-#endif
-};
-
-struct rt_sigframe32 {
-       u32 rs_ass[4];                  /* argument save space for o32 */
-#if ICACHE_REFILLS_WORKAROUND_WAR
-       u32 rs_pad[2];
-#else
-       u32 rs_code[2];                 /* signal trampoline */
-#endif
-       compat_siginfo_t rs_info;
-       struct ucontext32 rs_uc;
-#if ICACHE_REFILLS_WORKAROUND_WAR
-       u32 rs_code[8] __attribute__((aligned(32)));    /* signal trampoline */
-#endif
-};
-
 int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
 {
        int err;
@@ -463,17 +511,15 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
        return err;
 }
 
-save_static_function(sys32_sigreturn);
-__attribute_used__ noinline static void
-_sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
+asmlinkage void sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
 {
-       struct sigframe __user *frame;
+       struct sigframe32 __user *frame;
        sigset_t blocked;
 
-       frame = (struct sigframe __user *) regs.regs[29];
+       frame = (struct sigframe32 __user *) regs.regs[29];
        if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
                goto badframe;
-       if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked)))
+       if (__copy_conv_sigset_from_user(&blocked, &frame->sf_mask))
                goto badframe;
 
        sigdelsetmask(&blocked, ~_BLOCKABLE);
@@ -499,9 +545,7 @@ badframe:
        force_sig(SIGSEGV, current);
 }
 
-save_static_function(sys32_rt_sigreturn);
-__attribute_used__ noinline static void
-_sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
+asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
 {
        struct rt_sigframe32 __user *frame;
        mm_segment_t old_fs;
@@ -512,7 +556,7 @@ _sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
        frame = (struct rt_sigframe32 __user *) regs.regs[29];
        if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
                goto badframe;
-       if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
+       if (__copy_conv_sigset_from_user(&set, &frame->rs_uc.uc_sigmask))
                goto badframe;
 
        sigdelsetmask(&set, ~_BLOCKABLE);
@@ -554,111 +598,21 @@ badframe:
        force_sig(SIGSEGV, current);
 }
 
-static inline int setup_sigcontext32(struct pt_regs *regs,
-                                    struct sigcontext32 __user *sc)
-{
-       int err = 0;
-
-       err |= __put_user(regs->cp0_epc, &sc->sc_pc);
-       err |= __put_user(regs->cp0_status, &sc->sc_status);
-
-#define save_gp_reg(i) {                                               \
-       err |= __put_user(regs->regs[i], &sc->sc_regs[i]);              \
-} while(0)
-       __put_user(0, &sc->sc_regs[0]); save_gp_reg(1); save_gp_reg(2);
-       save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);
-       save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);
-       save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);
-       save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);
-       save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);
-       save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);
-       save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);
-       save_gp_reg(31);
-#undef save_gp_reg
-
-       err |= __put_user(regs->hi, &sc->sc_mdhi);
-       err |= __put_user(regs->lo, &sc->sc_mdlo);
-       if (cpu_has_dsp) {
-               err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
-               err |= __put_user(mfhi1(), &sc->sc_hi1);
-               err |= __put_user(mflo1(), &sc->sc_lo1);
-               err |= __put_user(mfhi2(), &sc->sc_hi2);
-               err |= __put_user(mflo2(), &sc->sc_lo2);
-               err |= __put_user(mfhi3(), &sc->sc_hi3);
-               err |= __put_user(mflo3(), &sc->sc_lo3);
-       }
-
-       err |= __put_user(!!used_math(), &sc->sc_used_math);
-
-       if (!used_math())
-               goto out;
-
-       /*
-        * Save FPU state to signal context.  Signal handler will "inherit"
-        * current FPU state.
-        */
-       preempt_disable();
-
-       if (!is_fpu_owner()) {
-               own_fpu();
-               restore_fp(current);
-       }
-       err |= save_fp_context32(sc);
-
-       preempt_enable();
-
-out:
-       return err;
-}
-
-/*
- * Determine which stack to use..
- */
-static inline void __user *get_sigframe(struct k_sigaction *ka,
-                                       struct pt_regs *regs,
-                                       size_t frame_size)
-{
-       unsigned long sp;
-
-       /* Default to using normal stack */
-       sp = regs->regs[29];
-
-       /*
-        * FPU emulator may have it's own trampoline active just
-        * above the user stack, 16-bytes before the next lowest
-        * 16 byte boundary.  Try to avoid trashing it.
-        */
-       sp -= 32;
-
-       /* This is the X/Open sanctioned signal stack switching.  */
-       if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0))
-               sp = current->sas_ss_sp + current->sas_ss_size;
-
-       return (void __user *)((sp - frame_size) & ALMASK);
-}
-
 int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
        int signr, sigset_t *set)
 {
-       struct sigframe __user *frame;
+       struct sigframe32 __user *frame;
        int err = 0;
 
        frame = get_sigframe(ka, regs, sizeof(*frame));
        if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
                goto give_sigsegv;
 
-       /*
-        * Set up the return code ...
-        *
-        *         li      v0, __NR_O32_sigreturn
-        *         syscall
-        */
-       err |= __put_user(0x24020000 + __NR_O32_sigreturn, frame->sf_code + 0);
-       err |= __put_user(0x0000000c                     , frame->sf_code + 1);
-       flush_cache_sigtramp((unsigned long) frame->sf_code);
+       err |= install_sigtramp(frame->sf_code, __NR_O32_sigreturn);
 
        err |= setup_sigcontext32(regs, &frame->sf_sc);
-       err |= __copy_to_user(&frame->sf_mask, set, sizeof(*set));
+       err |= __copy_conv_sigset_to_user(&frame->sf_mask, set);
+
        if (err)
                goto give_sigsegv;
 
@@ -679,11 +633,10 @@ int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
        regs->regs[31] = (unsigned long) frame->sf_code;
        regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
 
-#if DEBUG_SIG
-       printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
+       DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
               current->comm, current->pid,
-              frame, regs->cp0_epc, frame->sf_code);
-#endif
+              frame, regs->cp0_epc, regs->regs[31]);
+
        return 0;
 
 give_sigsegv:
@@ -702,17 +655,7 @@ int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
        if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
                goto give_sigsegv;
 
-       /* Set up to return from userspace.  If provided, use a stub already
-          in userspace.  */
-       /*
-        * Set up the return code ...
-        *
-        *         li      v0, __NR_O32_rt_sigreturn
-        *         syscall
-        */
-       err |= __put_user(0x24020000 + __NR_O32_rt_sigreturn, frame->rs_code + 0);
-       err |= __put_user(0x0000000c                      , frame->rs_code + 1);
-       flush_cache_sigtramp((unsigned long) frame->rs_code);
+       err |= install_sigtramp(frame->rs_code, __NR_O32_rt_sigreturn);
 
        /* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */
        err |= copy_siginfo_to_user32(&frame->rs_info, info);
@@ -728,7 +671,7 @@ int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
        err |= __put_user(current->sas_ss_size,
                          &frame->rs_uc.uc_stack.ss_size);
        err |= setup_sigcontext32(regs, &frame->rs_uc.uc_mcontext);
-       err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set));
+       err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set);
 
        if (err)
                goto give_sigsegv;
@@ -750,11 +693,10 @@ int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
        regs->regs[31] = (unsigned long) frame->rs_code;
        regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
 
-#if DEBUG_SIG
-       printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
+       DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
               current->comm, current->pid,
-              frame, regs->cp0_epc, frame->rs_code);
-#endif
+              frame, regs->cp0_epc, regs->regs[31]);
+
        return 0;
 
 give_sigsegv:
index b28646b3ceaea8d04eaab8336206fbee571fb129..7ca2a078841fb65253d5e9aeec70b8dfcebbd5c9 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <asm/asm.h>
 #include <asm/cacheflush.h>
+#include <asm/compat-signal.h>
 #include <asm/sim.h>
 #include <asm/uaccess.h>
 #include <asm/ucontext.h>
@@ -47,9 +48,9 @@
 #define __NR_N32_rt_sigreturn          6211
 #define __NR_N32_restart_syscall       6214
 
-#define DEBUG_SIG 0
+extern int setup_sigcontext(struct pt_regs *, struct sigcontext __user *);
+extern int restore_sigcontext(struct pt_regs *, struct sigcontext __user *);
 
-#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
 
 /* IRIX compatible stack_t  */
 typedef struct sigaltstack32 {
@@ -63,28 +64,33 @@ struct ucontextn32 {
        s32                 uc_link;
        stack32_t           uc_stack;
        struct sigcontext   uc_mcontext;
-       sigset_t            uc_sigmask;   /* mask last for extensibility */
+       compat_sigset_t     uc_sigmask;   /* mask last for extensibility */
 };
 
+#if ICACHE_REFILLS_WORKAROUND_WAR == 0
+
 struct rt_sigframe_n32 {
        u32 rs_ass[4];                  /* argument save space for o32 */
-#if ICACHE_REFILLS_WORKAROUND_WAR
-       u32 rs_pad[2];
-#else
        u32 rs_code[2];                 /* signal trampoline */
-#endif
        struct siginfo rs_info;
        struct ucontextn32 rs_uc;
-#if ICACHE_REFILLS_WORKAROUND_WAR
+};
+
+#else  /* ICACHE_REFILLS_WORKAROUND_WAR */
+
+struct rt_sigframe_n32 {
+       u32 rs_ass[4];                  /* argument save space for o32 */
+       u32 rs_pad[2];
+       struct siginfo rs_info;
+       struct ucontextn32 rs_uc;
        u32 rs_code[8] ____cacheline_aligned;           /* signal trampoline */
-#endif
 };
 
+#endif /* !ICACHE_REFILLS_WORKAROUND_WAR */
+
 extern void sigset_from_compat (sigset_t *set, compat_sigset_t *compat);
 
-save_static_function(sysn32_rt_sigsuspend);
-__attribute_used__ noinline static int
-_sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
+asmlinkage int sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
 {
        compat_sigset_t __user *unewset;
        compat_sigset_t uset;
@@ -114,9 +120,7 @@ _sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
        return -ERESTARTNOHAND;
 }
 
-save_static_function(sysn32_rt_sigreturn);
-__attribute_used__ noinline static void
-_sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
+asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
 {
        struct rt_sigframe_n32 __user *frame;
        sigset_t set;
@@ -126,7 +130,7 @@ _sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
        frame = (struct rt_sigframe_n32 __user *) regs.regs[29];
        if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
                goto badframe;
-       if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
+       if (__copy_conv_sigset_from_user(&set, &frame->rs_uc.uc_sigmask))
                goto badframe;
 
        sigdelsetmask(&set, ~_BLOCKABLE);
@@ -192,7 +196,7 @@ int setup_rt_frame_n32(struct k_sigaction * ka,
        err |= __put_user(current->sas_ss_size,
                          &frame->rs_uc.uc_stack.ss_size);
        err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext);
-       err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set));
+       err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set);
 
        if (err)
                goto give_sigsegv;
@@ -214,11 +218,10 @@ int setup_rt_frame_n32(struct k_sigaction * ka,
        regs->regs[31] = (unsigned long) frame->rs_code;
        regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
 
-#if DEBUG_SIG
-       printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
+       DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
               current->comm, current->pid,
               frame, regs->cp0_epc, regs->regs[31]);
-#endif
+
        return 0;
 
 give_sigsegv:
index 8aa544f73a5ea27fd85eb007ac9ec59938e0ff35..e5e56bd498dbcf0d650fe22152ad98e6c5d62a8e 100644 (file)
@@ -307,7 +307,7 @@ static unsigned int __init calibrate_hpt(void)
 struct clocksource clocksource_mips = {
        .name           = "MIPS",
        .mask           = 0xffffffff,
-       .is_continuous  = 1,
+       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
 };
 
 static void __init init_mips_clocksource(void)
@@ -455,8 +455,3 @@ EXPORT_SYMBOL(rtc_lock);
 EXPORT_SYMBOL(to_tm);
 EXPORT_SYMBOL(rtc_mips_set_time);
 EXPORT_SYMBOL(rtc_mips_get_time);
-
-unsigned long long sched_clock(void)
-{
-       return (unsigned long long)jiffies*(1000000000/HZ);
-}
index cecff24cc9721a16e7abdb9e04980f73b53293ec..c76b793310c26d4a5a5c4895a7d83fe839826165 100644 (file)
@@ -113,10 +113,12 @@ SECTIONS
      references from .rodata */
   .exit.text : { *(.exit.text) }
   .exit.data : { *(.exit.data) }
+#if defined(CONFIG_BLK_DEV_INITRD)
   . = ALIGN(_PAGE_SIZE);
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
   __initramfs_end = .;
+#endif
   . = ALIGN(32);
   __per_cpu_start = .;
   .data.percpu  : { *(.data.percpu) }
index 459624969c99739d24b90aee8ca8bcdb6f52bd53..9aca871a307f8f161215099085c716c0e08db8de 100644 (file)
@@ -29,6 +29,7 @@
  */
 
 #include <linux/kernel.h>
+#include <linux/device.h>
 #include <linux/module.h>
 #include <linux/fs.h>
 #include <linux/init.h>
@@ -48,6 +49,7 @@
 #include <asm/cacheflush.h>
 #include <asm/atomic.h>
 #include <asm/cpu.h>
+#include <asm/mips_mt.h>
 #include <asm/processor.h>
 #include <asm/system.h>
 #include <asm/vpe.h>
@@ -64,6 +66,7 @@ typedef void *vpe_handle;
 
 static char module_name[] = "vpe";
 static int major;
+static const int minor = 1;    /* fixed for now  */
 
 #ifdef CONFIG_MIPS_APSP_KSPD
  static struct kspd_notifications kspd_events;
@@ -1205,7 +1208,7 @@ static ssize_t vpe_write(struct file *file, const char __user * buffer,
        return ret;
 }
 
-static struct file_operations vpe_fops = {
+static const struct file_operations vpe_fops = {
        .owner = THIS_MODULE,
        .open = vpe_open,
        .release = vpe_release,
@@ -1365,12 +1368,15 @@ static void kspd_sp_exit( int sp_id)
 }
 #endif
 
+static struct device *vpe_dev;
+
 static int __init vpe_module_init(void)
 {
        struct vpe *v = NULL;
+       struct device *dev;
        struct tc *t;
        unsigned long val;
-       int i;
+       int i, err;
 
        if (!cpu_has_mipsmt) {
                printk("VPE loader: not a MIPS MT capable processor\n");
@@ -1383,6 +1389,14 @@ static int __init vpe_module_init(void)
                return major;
        }
 
+       dev = device_create(mt_class, NULL, MKDEV(major, minor),
+                           "tc%d", minor);
+       if (IS_ERR(dev)) {
+               err = PTR_ERR(dev);
+               goto out_chrdev;
+       }
+       vpe_dev = dev;
+
        dmt();
        dvpe();
 
@@ -1478,6 +1492,11 @@ static int __init vpe_module_init(void)
        kspd_events.kspd_sp_exit = kspd_sp_exit;
 #endif
        return 0;
+
+out_chrdev:
+       unregister_chrdev(major, module_name);
+
+       return err;
 }
 
 static void __exit vpe_module_exit(void)
@@ -1490,6 +1509,7 @@ static void __exit vpe_module_exit(void)
                }
        }
 
+       device_destroy(mt_class, MKDEV(major, minor));
        unregister_chrdev(major, module_name);
 }
 
index 12878359f2c883673950f0e90ec2da01732c543d..699ab1886ceba8deeff05f626e23597a8b560ee8 100644 (file)
@@ -302,42 +302,129 @@ extern int lasat_boot_to_service;
 #ifdef CONFIG_SYSCTL
 
 static ctl_table lasat_table[] = {
-       {LASAT_CPU_HZ, "cpu-hz", &lasat_board_info.li_cpu_hz, sizeof(int),
-        0444, NULL, &proc_dointvec, &sysctl_intvec},
-       {LASAT_BUS_HZ, "bus-hz", &lasat_board_info.li_bus_hz, sizeof(int),
-        0444, NULL, &proc_dointvec, &sysctl_intvec},
-       {LASAT_MODEL, "bmid", &lasat_board_info.li_bmid, sizeof(int),
-        0444, NULL, &proc_dointvec, &sysctl_intvec},
-       {LASAT_PRID, "prid", &lasat_board_info.li_prid, sizeof(int),
-        0644, NULL, &proc_lasat_eeprom_value, &sysctl_lasat_eeprom_value},
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "cpu-hz",
+               .data           = &lasat_board_info.li_cpu_hz,
+               .maxlen         = sizeof(int),
+               .mode           = 0444,
+               .proc_handler   = &proc_dointvec,
+               .strategy       = &sysctl_intvec
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "bus-hz",
+               .data           = &lasat_board_info.li_bus_hz,
+               .maxlen         = sizeof(int),
+               .mode           = 0444,
+               .proc_handler   = &proc_dointvec,
+               .strategy       = &sysctl_intvec
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "bmid",
+               .data           = &lasat_board_info.li_bmid,
+               .maxlen         = sizeof(int),
+               .mode           = 0444,
+               .proc_handler   = &proc_dointvec,
+               .strategy       = &sysctl_intvec
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "prid",
+               .data           = &lasat_board_info.li_prid,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_lasat_eeprom_value,
+               .strategy       = &sysctl_lasat_eeprom_value
+       },
 #ifdef CONFIG_INET
-       {LASAT_IPADDR, "ipaddr", &lasat_board_info.li_eeprom_info.ipaddr, sizeof(int),
-        0644, NULL, &proc_lasat_ip, &sysctl_lasat_intvec},
-       {LASAT_NETMASK, "netmask", &lasat_board_info.li_eeprom_info.netmask, sizeof(int),
-        0644, NULL, &proc_lasat_ip, &sysctl_lasat_intvec},
-       {LASAT_BCAST, "bcastaddr", &lasat_bcastaddr,
-               sizeof(lasat_bcastaddr), 0600, NULL,
-               &proc_dostring, &sysctl_string},
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "ipaddr",
+               .data           = &lasat_board_info.li_eeprom_info.ipaddr,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_lasat_ip,
+               .strategy       = &sysctl_lasat_intvec
+       },
+       {
+               .ctl_name       = LASAT_NETMASK,
+               .procname       = "netmask",
+               .data           = &lasat_board_info.li_eeprom_info.netmask,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_lasat_ip,
+               .strategy       = &sysctl_lasat_intvec
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "bcastaddr",
+               .data           = &lasat_bcastaddr,
+               .maxlen         = sizeof(lasat_bcastaddr),
+               .mode           = 0600,
+               .proc_handler   = &proc_dostring,
+               .strategy       = &sysctl_string
+       },
 #endif
-       {LASAT_PASSWORD, "passwd_hash", &lasat_board_info.li_eeprom_info.passwd_hash, sizeof(lasat_board_info.li_eeprom_info.passwd_hash),
-        0600, NULL, &proc_dolasatstring, &sysctl_lasatstring},
-       {LASAT_SBOOT, "boot-service", &lasat_boot_to_service, sizeof(int),
-        0644, NULL, &proc_dointvec, &sysctl_intvec},
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "passwd_hash",
+               .data           = &lasat_board_info.li_eeprom_info.passwd_hash,
+               .maxlen         = sizeof(lasat_board_info.li_eeprom_info.passwd_hash),
+               .mode           = 0600,
+               .proc_handler   = &proc_dolasatstring,
+               .strategy       = &sysctl_lasatstring
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "boot-service",
+               .data           = &lasat_boot_to_service,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec,
+               .strategy       = &sysctl_intvec
+       },
 #ifdef CONFIG_DS1603
-       {LASAT_RTC, "rtc", &rtctmp, sizeof(int),
-        0644, NULL, &proc_dolasatrtc, &sysctl_lasat_rtc},
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "rtc",
+               .data           = &rtctmp,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dolasatrtc,
+               .strategy       = &sysctl_lasat_rtc
+       },
 #endif
-       {LASAT_NAMESTR, "namestr", &lasat_board_info.li_namestr, sizeof(lasat_board_info.li_namestr),
-        0444, NULL, &proc_dostring, &sysctl_string},
-       {LASAT_TYPESTR, "typestr", &lasat_board_info.li_typestr, sizeof(lasat_board_info.li_typestr),
-        0444, NULL, &proc_dostring, &sysctl_string},
-       {0}
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "namestr",
+               .data           = &lasat_board_info.li_namestr,
+               .maxlen         = sizeof(lasat_board_info.li_namestr),
+               .mode           = 0444,
+               .proc_handler   =  &proc_dostring,
+               .strategy       = &sysctl_string
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "typestr",
+               .data           = &lasat_board_info.li_typestr,
+               .maxlen         = sizeof(lasat_board_info.li_typestr),
+               .mode           = 0444,
+               .proc_handler   = &proc_dostring,
+               .strategy       = &sysctl_string
+       },
+       {}
 };
 
-#define CTL_LASAT 1    // CTL_ANY ???
 static ctl_table lasat_root_table[] = {
-       { CTL_LASAT, "lasat", NULL, 0, 0555, lasat_table },
-       { 0 }
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "lasat",
+               .mode           =  0555,
+               .child          = lasat_table
+       },
+       {}
 };
 
 static int __init lasat_register_sysctl(void)
@@ -345,7 +432,7 @@ static int __init lasat_register_sysctl(void)
        struct ctl_table_header *lasat_table_header;
 
        lasat_table_header =
-               register_sysctl_table(lasat_root_table, 0);
+               register_sysctl_table(lasat_root_table);
 
        return 0;
 }
index 19e41fd186c4e0c8a9d4ab3646c5897aa359514b..de5727385bc67c2a03a91845a1d66c86fa61cfcb 100644 (file)
@@ -2,8 +2,8 @@
 # Makefile for the Linux/MIPS-specific parts of the memory manager.
 #
 
-obj-y                          += cache.o extable.o fault.o init.o pgtable.o \
-                                  tlbex.o tlbex-fault.o
+obj-y                          += cache.o dma-default.o extable.o fault.o \
+                                  init.o pgtable.o tlbex.o tlbex-fault.o
 
 obj-$(CONFIG_32BIT)            += ioremap.o pgtable-32.o
 obj-$(CONFIG_64BIT)            += pgtable-64.o
@@ -32,14 +32,4 @@ obj-$(CONFIG_R5000_CPU_SCACHE)  += sc-r5k.o
 obj-$(CONFIG_RM7000_CPU_SCACHE)        += sc-rm7k.o
 obj-$(CONFIG_MIPS_CPU_SCACHE)  += sc-mips.o
 
-#
-# Choose one DMA coherency model
-#
-ifndef CONFIG_OWN_DMA
-obj-$(CONFIG_DMA_COHERENT)     += dma-coherent.o
-obj-$(CONFIG_DMA_NONCOHERENT)  += dma-noncoherent.o
-endif
-obj-$(CONFIG_DMA_IP27)         += dma-ip27.o
-obj-$(CONFIG_DMA_IP32)         += dma-ip32.o
-
 EXTRA_AFLAGS := $(CFLAGS)
index 3a8afd47feaab8b3f1e98e5be73b563acd612282..9ea460b16bda3e3e2b25614621bd332093e14982 100644 (file)
@@ -259,6 +259,12 @@ static void sb1_flush_cache_data_page(unsigned long addr)
                on_each_cpu(sb1_flush_cache_data_page_ipi, (void *) addr, 1, 1);
 }
 #else
+
+static void local_sb1_flush_cache_data_page(unsigned long addr)
+{
+       __sb1_writeback_inv_dcache_range(addr, addr + PAGE_SIZE);
+}
+
 void sb1_flush_cache_data_page(unsigned long)
        __attribute__((alias("local_sb1_flush_cache_data_page")));
 #endif
index 1f954a238a6332b0d8aaa0a4dde2fc5903f4f225..31819c58bffaa188c676f9c61112c569a2f8874c 100644 (file)
@@ -107,8 +107,6 @@ void __update_cache(struct vm_area_struct *vma, unsigned long address,
        }
 }
 
-#define __weak __attribute__((weak))
-
 static char cache_panic[] __initdata = "Yeee, unsupported cache architecture.";
 
 void __init cpu_cache_init(void)
diff --git a/arch/mips/mm/dma-coherent.c b/arch/mips/mm/dma-coherent.c
deleted file mode 100644 (file)
index 5697c6e..0000000
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * 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) 2000  Ani Joshi <ajoshi@unixbox.com>
- * Copyright (C) 2000, 2001  Ralf Baechle <ralf@gnu.org>
- * swiped from i386, and cloned for MIPS by Geert, polished by Ralf.
- */
-#include <linux/types.h>
-#include <linux/dma-mapping.h>
-#include <linux/mm.h>
-#include <linux/module.h>
-#include <linux/string.h>
-
-#include <asm/cache.h>
-#include <asm/io.h>
-
-void *dma_alloc_noncoherent(struct device *dev, size_t size,
-       dma_addr_t * dma_handle, gfp_t gfp)
-{
-       void *ret;
-       /* ignore region specifiers */
-       gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
-
-       if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))
-               gfp |= GFP_DMA;
-       ret = (void *) __get_free_pages(gfp, get_order(size));
-
-       if (ret != NULL) {
-               memset(ret, 0, size);
-               *dma_handle = virt_to_phys(ret);
-       }
-
-       return ret;
-}
-
-EXPORT_SYMBOL(dma_alloc_noncoherent);
-
-void *dma_alloc_coherent(struct device *dev, size_t size,
-       dma_addr_t * dma_handle, gfp_t gfp)
-       __attribute__((alias("dma_alloc_noncoherent")));
-
-EXPORT_SYMBOL(dma_alloc_coherent);
-
-void dma_free_noncoherent(struct device *dev, size_t size, void *vaddr,
-       dma_addr_t dma_handle)
-{
-       unsigned long addr = (unsigned long) vaddr;
-
-       free_pages(addr, get_order(size));
-}
-
-EXPORT_SYMBOL(dma_free_noncoherent);
-
-void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
-       dma_addr_t dma_handle) __attribute__((alias("dma_free_noncoherent")));
-
-EXPORT_SYMBOL(dma_free_coherent);
-
-dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size,
-       enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-
-       return __pa(ptr);
-}
-
-EXPORT_SYMBOL(dma_map_single);
-
-void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
-                enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_unmap_single);
-
-int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
-       enum dma_data_direction direction)
-{
-       int i;
-
-       BUG_ON(direction == DMA_NONE);
-
-       for (i = 0; i < nents; i++, sg++) {
-               sg->dma_address = (dma_addr_t)page_to_phys(sg->page) + sg->offset;
-       }
-
-       return nents;
-}
-
-EXPORT_SYMBOL(dma_map_sg);
-
-dma_addr_t dma_map_page(struct device *dev, struct page *page,
-       unsigned long offset, size_t size, enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-
-       return page_to_phys(page) + offset;
-}
-
-EXPORT_SYMBOL(dma_map_page);
-
-void dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
-              enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_unmap_page);
-
-void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries,
-            enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_unmap_sg);
-
-void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,
-       size_t size, enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_sync_single_for_cpu);
-
-void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle,
-       size_t size, enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_sync_single_for_device);
-
-void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle,
-                     unsigned long offset, size_t size,
-                     enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_sync_single_range_for_cpu);
-
-void dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle,
-                     unsigned long offset, size_t size,
-                     enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_sync_single_range_for_device);
-
-void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
-                enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_sync_sg_for_cpu);
-
-void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems,
-                enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_sync_sg_for_device);
-
-int dma_mapping_error(dma_addr_t dma_addr)
-{
-       return 0;
-}
-
-EXPORT_SYMBOL(dma_mapping_error);
-
-int dma_supported(struct device *dev, u64 mask)
-{
-       /*
-        * we fall back to GFP_DMA when the mask isn't all 1s,
-        * so we can't guarantee allocations that must be
-        * within a tighter range than GFP_DMA..
-        */
-       if (mask < 0x00ffffff)
-               return 0;
-
-       return 1;
-}
-
-EXPORT_SYMBOL(dma_supported);
-
-int dma_is_consistent(struct device *dev, dma_addr_t dma_addr)
-{
-       return 1;
-}
-
-EXPORT_SYMBOL(dma_is_consistent);
-
-void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
-              enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_cache_sync);
-
-/* The DAC routines are a PCIism.. */
-
-#ifdef CONFIG_PCI
-
-#include <linux/pci.h>
-
-dma64_addr_t pci_dac_page_to_dma(struct pci_dev *pdev,
-       struct page *page, unsigned long offset, int direction)
-{
-       return (dma64_addr_t)page_to_phys(page) + offset;
-}
-
-EXPORT_SYMBOL(pci_dac_page_to_dma);
-
-struct page *pci_dac_dma_to_page(struct pci_dev *pdev,
-       dma64_addr_t dma_addr)
-{
-       return mem_map + (dma_addr >> PAGE_SHIFT);
-}
-
-EXPORT_SYMBOL(pci_dac_dma_to_page);
-
-unsigned long pci_dac_dma_to_offset(struct pci_dev *pdev,
-       dma64_addr_t dma_addr)
-{
-       return dma_addr & ~PAGE_MASK;
-}
-
-EXPORT_SYMBOL(pci_dac_dma_to_offset);
-
-void pci_dac_dma_sync_single_for_cpu(struct pci_dev *pdev,
-       dma64_addr_t dma_addr, size_t len, int direction)
-{
-       BUG_ON(direction == PCI_DMA_NONE);
-}
-
-EXPORT_SYMBOL(pci_dac_dma_sync_single_for_cpu);
-
-void pci_dac_dma_sync_single_for_device(struct pci_dev *pdev,
-       dma64_addr_t dma_addr, size_t len, int direction)
-{
-       BUG_ON(direction == PCI_DMA_NONE);
-}
-
-EXPORT_SYMBOL(pci_dac_dma_sync_single_for_device);
-
-#endif /* CONFIG_PCI */
similarity index 63%
rename from arch/mips/mm/dma-noncoherent.c
rename to arch/mips/mm/dma-default.c
index 8cecef0957c359ff55827b85b91b5b74e74a4648..4a32e939698f6206fd29a8e454309c8b02687236 100644 (file)
@@ -4,28 +4,39 @@
  * for more details.
  *
  * Copyright (C) 2000  Ani Joshi <ajoshi@unixbox.com>
- * Copyright (C) 2000, 2001  Ralf Baechle <ralf@gnu.org>
+ * Copyright (C) 2000, 2001, 06  Ralf Baechle <ralf@linux-mips.org>
  * swiped from i386, and cloned for MIPS by Geert, polished by Ralf.
  */
+
 #include <linux/types.h>
+#include <linux/dma-mapping.h>
 #include <linux/mm.h>
 #include <linux/module.h>
 #include <linux/string.h>
-#include <linux/dma-mapping.h>
 
 #include <asm/cache.h>
 #include <asm/io.h>
 
+#include <dma-coherence.h>
+
 /*
  * Warning on the terminology - Linux calls an uncached area coherent;
  * MIPS terminology calls memory areas with hardware maintained coherency
  * coherent.
  */
 
+static inline int cpu_is_noncoherent_r10000(struct device *dev)
+{
+       return !plat_device_is_coherent(dev) &&
+              (current_cpu_data.cputype == CPU_R10000 &&
+              current_cpu_data.cputype == CPU_R12000);
+}
+
 void *dma_alloc_noncoherent(struct device *dev, size_t size,
        dma_addr_t * dma_handle, gfp_t gfp)
 {
        void *ret;
+
        /* ignore region specifiers */
        gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
 
@@ -35,7 +46,7 @@ void *dma_alloc_noncoherent(struct device *dev, size_t size,
 
        if (ret != NULL) {
                memset(ret, 0, size);
-               *dma_handle = virt_to_phys(ret);
+               *dma_handle = plat_map_dma_mem(dev, ret, size);
        }
 
        return ret;
@@ -48,10 +59,21 @@ void *dma_alloc_coherent(struct device *dev, size_t size,
 {
        void *ret;
 
-       ret = dma_alloc_noncoherent(dev, size, dma_handle, gfp);
+       /* ignore region specifiers */
+       gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
+
+       if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))
+               gfp |= GFP_DMA;
+       ret = (void *) __get_free_pages(gfp, get_order(size));
+
        if (ret) {
-               dma_cache_wback_inv((unsigned long) ret, size);
-               ret = UNCAC_ADDR(ret);
+               memset(ret, 0, size);
+               *dma_handle = plat_map_dma_mem(dev, ret, size);
+
+               if (!plat_device_is_coherent(dev)) {
+                       dma_cache_wback_inv((unsigned long) ret, size);
+                       ret = UNCAC_ADDR(ret);
+               }
        }
 
        return ret;
@@ -72,7 +94,9 @@ void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
 {
        unsigned long addr = (unsigned long) vaddr;
 
-       addr = CAC_ADDR(addr);
+       if (!plat_device_is_coherent(dev))
+               addr = CAC_ADDR(addr);
+
        free_pages(addr, get_order(size));
 }
 
@@ -104,9 +128,10 @@ dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size,
 {
        unsigned long addr = (unsigned long) ptr;
 
-       __dma_sync(addr, size, direction);
+       if (!plat_device_is_coherent(dev))
+               __dma_sync(addr, size, direction);
 
-       return virt_to_phys(ptr);
+       return plat_map_dma_mem(dev, ptr, size);
 }
 
 EXPORT_SYMBOL(dma_map_single);
@@ -114,10 +139,11 @@ EXPORT_SYMBOL(dma_map_single);
 void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
        enum dma_data_direction direction)
 {
-       unsigned long addr;
-       addr = dma_addr + PAGE_OFFSET;
+       if (cpu_is_noncoherent_r10000(dev))
+               __dma_sync(plat_dma_addr_to_phys(dma_addr) + PAGE_OFFSET, size,
+                          direction);
 
-       //__dma_sync(addr, size, direction);
+       plat_unmap_dma_mem(dma_addr);
 }
 
 EXPORT_SYMBOL(dma_unmap_single);
@@ -133,11 +159,10 @@ int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
                unsigned long addr;
 
                addr = (unsigned long) page_address(sg->page);
-               if (addr) {
+               if (!plat_device_is_coherent(dev) && addr)
                        __dma_sync(addr + sg->offset, sg->length, direction);
-                       sg->dma_address = (dma_addr_t)page_to_phys(sg->page)
-                                         + sg->offset;
-               }
+               sg->dma_address = plat_map_dma_mem_page(dev, sg->page) +
+                                 sg->offset;
        }
 
        return nents;
@@ -148,14 +173,16 @@ EXPORT_SYMBOL(dma_map_sg);
 dma_addr_t dma_map_page(struct device *dev, struct page *page,
        unsigned long offset, size_t size, enum dma_data_direction direction)
 {
-       unsigned long addr;
-
        BUG_ON(direction == DMA_NONE);
 
-       addr = (unsigned long) page_address(page) + offset;
-       dma_cache_wback_inv(addr, size);
+       if (!plat_device_is_coherent(dev)) {
+               unsigned long addr;
+
+               addr = (unsigned long) page_address(page) + offset;
+               dma_cache_wback_inv(addr, size);
+       }
 
-       return page_to_phys(page) + offset;
+       return plat_map_dma_mem_page(dev, page) + offset;
 }
 
 EXPORT_SYMBOL(dma_map_page);
@@ -165,12 +192,14 @@ void dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
 {
        BUG_ON(direction == DMA_NONE);
 
-       if (direction != DMA_TO_DEVICE) {
+       if (!plat_device_is_coherent(dev) && direction != DMA_TO_DEVICE) {
                unsigned long addr;
 
-               addr = dma_address + PAGE_OFFSET;
+               addr = plat_dma_addr_to_phys(dma_address);
                dma_cache_wback_inv(addr, size);
        }
+
+       plat_unmap_dma_mem(dma_address);
 }
 
 EXPORT_SYMBOL(dma_unmap_page);
@@ -183,13 +212,15 @@ void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries,
 
        BUG_ON(direction == DMA_NONE);
 
-       if (direction == DMA_TO_DEVICE)
-               return;
-
        for (i = 0; i < nhwentries; i++, sg++) {
-               addr = (unsigned long) page_address(sg->page);
-               if (addr)
-                       __dma_sync(addr + sg->offset, sg->length, direction);
+               if (!plat_device_is_coherent(dev) &&
+                   direction != DMA_TO_DEVICE) {
+                       addr = (unsigned long) page_address(sg->page);
+                       if (addr)
+                               __dma_sync(addr + sg->offset, sg->length,
+                                          direction);
+               }
+               plat_unmap_dma_mem(sg->dma_address);
        }
 }
 
@@ -198,12 +229,14 @@ EXPORT_SYMBOL(dma_unmap_sg);
 void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,
        size_t size, enum dma_data_direction direction)
 {
-       unsigned long addr;
-
        BUG_ON(direction == DMA_NONE);
 
-       addr = dma_handle + PAGE_OFFSET;
-       __dma_sync(addr, size, direction);
+       if (cpu_is_noncoherent_r10000(dev)) {
+               unsigned long addr;
+
+               addr = PAGE_OFFSET + plat_dma_addr_to_phys(dma_handle);
+               __dma_sync(addr, size, direction);
+       }
 }
 
 EXPORT_SYMBOL(dma_sync_single_for_cpu);
@@ -211,12 +244,14 @@ EXPORT_SYMBOL(dma_sync_single_for_cpu);
 void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle,
        size_t size, enum dma_data_direction direction)
 {
-       unsigned long addr;
-
        BUG_ON(direction == DMA_NONE);
 
-       addr = dma_handle + PAGE_OFFSET;
-       __dma_sync(addr, size, direction);
+       if (cpu_is_noncoherent_r10000(dev)) {
+               unsigned long addr;
+
+               addr = plat_dma_addr_to_phys(dma_handle);
+               __dma_sync(addr, size, direction);
+       }
 }
 
 EXPORT_SYMBOL(dma_sync_single_for_device);
@@ -224,12 +259,14 @@ EXPORT_SYMBOL(dma_sync_single_for_device);
 void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle,
        unsigned long offset, size_t size, enum dma_data_direction direction)
 {
-       unsigned long addr;
-
        BUG_ON(direction == DMA_NONE);
 
-       addr = dma_handle + offset + PAGE_OFFSET;
-       __dma_sync(addr, size, direction);
+       if (cpu_is_noncoherent_r10000(dev)) {
+               unsigned long addr;
+
+               addr = PAGE_OFFSET + plat_dma_addr_to_phys(dma_handle);
+               __dma_sync(addr + offset, size, direction);
+       }
 }
 
 EXPORT_SYMBOL(dma_sync_single_range_for_cpu);
@@ -237,12 +274,14 @@ EXPORT_SYMBOL(dma_sync_single_range_for_cpu);
 void dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle,
        unsigned long offset, size_t size, enum dma_data_direction direction)
 {
-       unsigned long addr;
-
        BUG_ON(direction == DMA_NONE);
 
-       addr = dma_handle + offset + PAGE_OFFSET;
-       __dma_sync(addr, size, direction);
+       if (cpu_is_noncoherent_r10000(dev)) {
+               unsigned long addr;
+
+               addr = PAGE_OFFSET + plat_dma_addr_to_phys(dma_handle);
+               __dma_sync(addr + offset, size, direction);
+       }
 }
 
 EXPORT_SYMBOL(dma_sync_single_range_for_device);
@@ -255,9 +294,12 @@ void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
        BUG_ON(direction == DMA_NONE);
 
        /* Make sure that gcc doesn't leave the empty loop body.  */
-       for (i = 0; i < nelems; i++, sg++)
-               __dma_sync((unsigned long)page_address(sg->page),
-                          sg->length, direction);
+       for (i = 0; i < nelems; i++, sg++) {
+               if (!plat_device_is_coherent(dev))
+                       __dma_sync((unsigned long)page_address(sg->page),
+                                  sg->length, direction);
+               plat_unmap_dma_mem(sg->dma_address);
+       }
 }
 
 EXPORT_SYMBOL(dma_sync_sg_for_cpu);
@@ -270,9 +312,12 @@ void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nele
        BUG_ON(direction == DMA_NONE);
 
        /* Make sure that gcc doesn't leave the empty loop body.  */
-       for (i = 0; i < nelems; i++, sg++)
-               __dma_sync((unsigned long)page_address(sg->page),
-                          sg->length, direction);
+       for (i = 0; i < nelems; i++, sg++) {
+               if (!plat_device_is_coherent(dev))
+                       __dma_sync((unsigned long)page_address(sg->page),
+                                  sg->length, direction);
+               plat_unmap_dma_mem(sg->dma_address);
+       }
 }
 
 EXPORT_SYMBOL(dma_sync_sg_for_device);
@@ -301,70 +346,18 @@ EXPORT_SYMBOL(dma_supported);
 
 int dma_is_consistent(struct device *dev, dma_addr_t dma_addr)
 {
-       return 1;
+       return plat_device_is_coherent(dev);
 }
 
 EXPORT_SYMBOL(dma_is_consistent);
 
 void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
-       enum dma_data_direction direction)
+              enum dma_data_direction direction)
 {
-       if (direction == DMA_NONE)
-               return;
+       BUG_ON(direction == DMA_NONE);
 
-       dma_cache_wback_inv((unsigned long)vaddr, size);
+       if (!plat_device_is_coherent(dev))
+               dma_cache_wback_inv((unsigned long)vaddr, size);
 }
 
 EXPORT_SYMBOL(dma_cache_sync);
-
-/* The DAC routines are a PCIism.. */
-
-#ifdef CONFIG_PCI
-
-#include <linux/pci.h>
-
-dma64_addr_t pci_dac_page_to_dma(struct pci_dev *pdev,
-       struct page *page, unsigned long offset, int direction)
-{
-       return (dma64_addr_t)page_to_phys(page) + offset;
-}
-
-EXPORT_SYMBOL(pci_dac_page_to_dma);
-
-struct page *pci_dac_dma_to_page(struct pci_dev *pdev,
-       dma64_addr_t dma_addr)
-{
-       return mem_map + (dma_addr >> PAGE_SHIFT);
-}
-
-EXPORT_SYMBOL(pci_dac_dma_to_page);
-
-unsigned long pci_dac_dma_to_offset(struct pci_dev *pdev,
-       dma64_addr_t dma_addr)
-{
-       return dma_addr & ~PAGE_MASK;
-}
-
-EXPORT_SYMBOL(pci_dac_dma_to_offset);
-
-void pci_dac_dma_sync_single_for_cpu(struct pci_dev *pdev,
-       dma64_addr_t dma_addr, size_t len, int direction)
-{
-       BUG_ON(direction == PCI_DMA_NONE);
-
-       dma_cache_wback_inv(dma_addr + PAGE_OFFSET, len);
-}
-
-EXPORT_SYMBOL(pci_dac_dma_sync_single_for_cpu);
-
-void pci_dac_dma_sync_single_for_device(struct pci_dev *pdev,
-       dma64_addr_t dma_addr, size_t len, int direction)
-{
-       BUG_ON(direction == PCI_DMA_NONE);
-
-       dma_cache_wback_inv(dma_addr + PAGE_OFFSET, len);
-}
-
-EXPORT_SYMBOL(pci_dac_dma_sync_single_for_device);
-
-#endif /* CONFIG_PCI */
diff --git a/arch/mips/mm/dma-ip27.c b/arch/mips/mm/dma-ip27.c
deleted file mode 100644 (file)
index f088344..0000000
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * 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) 2000  Ani Joshi <ajoshi@unixbox.com>
- * Copyright (C) 2000, 2001  Ralf Baechle <ralf@gnu.org>
- * swiped from i386, and cloned for MIPS by Geert, polished by Ralf.
- */
-#include <linux/types.h>
-#include <linux/mm.h>
-#include <linux/module.h>
-#include <linux/string.h>
-#include <linux/pci.h>
-
-#include <asm/cache.h>
-#include <asm/pci/bridge.h>
-
-#define pdev_to_baddr(pdev, addr) \
-       (BRIDGE_CONTROLLER(pdev->bus)->baddr + (addr))
-#define dev_to_baddr(dev, addr) \
-       pdev_to_baddr(to_pci_dev(dev), (addr))
-
-void *dma_alloc_noncoherent(struct device *dev, size_t size,
-       dma_addr_t * dma_handle, gfp_t gfp)
-{
-       void *ret;
-
-       /* ignore region specifiers */
-       gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
-
-       if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))
-               gfp |= GFP_DMA;
-       ret = (void *) __get_free_pages(gfp, get_order(size));
-
-       if (ret != NULL) {
-               memset(ret, 0, size);
-               *dma_handle = dev_to_baddr(dev, virt_to_phys(ret));
-       }
-
-       return ret;
-}
-
-EXPORT_SYMBOL(dma_alloc_noncoherent);
-
-void *dma_alloc_coherent(struct device *dev, size_t size,
-       dma_addr_t * dma_handle, gfp_t gfp)
-       __attribute__((alias("dma_alloc_noncoherent")));
-
-EXPORT_SYMBOL(dma_alloc_coherent);
-
-void dma_free_noncoherent(struct device *dev, size_t size, void *vaddr,
-       dma_addr_t dma_handle)
-{
-       unsigned long addr = (unsigned long) vaddr;
-
-       free_pages(addr, get_order(size));
-}
-
-EXPORT_SYMBOL(dma_free_noncoherent);
-
-void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
-       dma_addr_t dma_handle) __attribute__((alias("dma_free_noncoherent")));
-
-EXPORT_SYMBOL(dma_free_coherent);
-
-dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size,
-       enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-
-       return dev_to_baddr(dev, __pa(ptr));
-}
-
-EXPORT_SYMBOL(dma_map_single);
-
-void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
-                enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_unmap_single);
-
-int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
-       enum dma_data_direction direction)
-{
-       int i;
-
-       BUG_ON(direction == DMA_NONE);
-
-       for (i = 0; i < nents; i++, sg++) {
-               sg->dma_address = (dma_addr_t) dev_to_baddr(dev,
-                       page_to_phys(sg->page) + sg->offset);
-       }
-
-       return nents;
-}
-
-EXPORT_SYMBOL(dma_map_sg);
-
-dma_addr_t dma_map_page(struct device *dev, struct page *page,
-       unsigned long offset, size_t size, enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-
-       return dev_to_baddr(dev, page_to_phys(page) + offset);
-}
-
-EXPORT_SYMBOL(dma_map_page);
-
-void dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
-              enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_unmap_page);
-
-void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries,
-            enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_unmap_sg);
-
-void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
-               enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_sync_single_for_cpu);
-
-void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size,
-               enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_sync_single_for_device);
-
-void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle,
-                     unsigned long offset, size_t size,
-                     enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_sync_single_range_for_cpu);
-
-void dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle,
-                     unsigned long offset, size_t size,
-                     enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_sync_single_range_for_device);
-
-void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
-                enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_sync_sg_for_cpu);
-
-void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems,
-                enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_sync_sg_for_device);
-
-int dma_mapping_error(dma_addr_t dma_addr)
-{
-       return 0;
-}
-
-EXPORT_SYMBOL(dma_mapping_error);
-
-int dma_supported(struct device *dev, u64 mask)
-{
-       /*
-        * we fall back to GFP_DMA when the mask isn't all 1s,
-        * so we can't guarantee allocations that must be
-        * within a tighter range than GFP_DMA..
-        */
-       if (mask < 0x00ffffff)
-               return 0;
-
-       return 1;
-}
-
-EXPORT_SYMBOL(dma_supported);
-
-int dma_is_consistent(struct device *dev, dma_addr_t dma_addr)
-{
-       return 1;
-}
-
-EXPORT_SYMBOL(dma_is_consistent);
-
-void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
-              enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-}
-
-EXPORT_SYMBOL(dma_cache_sync);
-
-dma64_addr_t pci_dac_page_to_dma(struct pci_dev *pdev,
-       struct page *page, unsigned long offset, int direction)
-{
-       dma64_addr_t addr = page_to_phys(page) + offset;
-
-       return (dma64_addr_t) pdev_to_baddr(pdev, addr);
-}
-
-EXPORT_SYMBOL(pci_dac_page_to_dma);
-
-struct page *pci_dac_dma_to_page(struct pci_dev *pdev,
-       dma64_addr_t dma_addr)
-{
-       struct bridge_controller *bc = BRIDGE_CONTROLLER(pdev->bus);
-
-       return pfn_to_page((dma_addr - bc->baddr) >> PAGE_SHIFT);
-}
-
-EXPORT_SYMBOL(pci_dac_dma_to_page);
-
-unsigned long pci_dac_dma_to_offset(struct pci_dev *pdev,
-       dma64_addr_t dma_addr)
-{
-       return dma_addr & ~PAGE_MASK;
-}
-
-EXPORT_SYMBOL(pci_dac_dma_to_offset);
-
-void pci_dac_dma_sync_single_for_cpu(struct pci_dev *pdev,
-       dma64_addr_t dma_addr, size_t len, int direction)
-{
-       BUG_ON(direction == PCI_DMA_NONE);
-}
-
-EXPORT_SYMBOL(pci_dac_dma_sync_single_for_cpu);
-
-void pci_dac_dma_sync_single_for_device(struct pci_dev *pdev,
-       dma64_addr_t dma_addr, size_t len, int direction)
-{
-       BUG_ON(direction == PCI_DMA_NONE);
-}
-
-EXPORT_SYMBOL(pci_dac_dma_sync_single_for_device);
diff --git a/arch/mips/mm/dma-ip32.c b/arch/mips/mm/dma-ip32.c
deleted file mode 100644 (file)
index b42b6f7..0000000
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * 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) 2000  Ani Joshi <ajoshi@unixbox.com>
- * Copyright (C) 2000, 2001  Ralf Baechle <ralf@gnu.org>
- * Copyright (C) 2005 Ilya A. Volynets-Evenbakh <ilya@total-knowledge.com>
- * swiped from i386, and cloned for MIPS by Geert, polished by Ralf.
- * IP32 changes by Ilya.
- */
-#include <linux/types.h>
-#include <linux/mm.h>
-#include <linux/module.h>
-#include <linux/string.h>
-#include <linux/dma-mapping.h>
-
-#include <asm/cache.h>
-#include <asm/io.h>
-#include <asm/ip32/crime.h>
-
-/*
- * Warning on the terminology - Linux calls an uncached area coherent;
- * MIPS terminology calls memory areas with hardware maintained coherency
- * coherent.
- */
-
-/*
- * Few notes.
- * 1. CPU sees memory as two chunks: 0-256M@0x0, and the rest @0x40000000+256M
- * 2. PCI sees memory as one big chunk @0x0 (or we could use 0x40000000 for native-endian)
- * 3. All other devices see memory as one big chunk at 0x40000000
- * 4. Non-PCI devices will pass NULL as struct device*
- * Thus we translate differently, depending on device.
- */
-
-#define RAM_OFFSET_MASK        0x3fffffff
-
-void *dma_alloc_noncoherent(struct device *dev, size_t size,
-       dma_addr_t * dma_handle, gfp_t gfp)
-{
-       void *ret;
-       /* ignore region specifiers */
-       gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
-
-       if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))
-               gfp |= GFP_DMA;
-       ret = (void *) __get_free_pages(gfp, get_order(size));
-
-       if (ret != NULL) {
-               unsigned long addr = virt_to_phys(ret)&RAM_OFFSET_MASK;
-               memset(ret, 0, size);
-               if(dev==NULL)
-                   addr+= CRIME_HI_MEM_BASE;
-               *dma_handle = addr;
-       }
-
-       return ret;
-}
-
-EXPORT_SYMBOL(dma_alloc_noncoherent);
-
-void *dma_alloc_coherent(struct device *dev, size_t size,
-       dma_addr_t * dma_handle, gfp_t gfp)
-{
-       void *ret;
-
-       ret = dma_alloc_noncoherent(dev, size, dma_handle, gfp);
-       if (ret) {
-               dma_cache_wback_inv((unsigned long) ret, size);
-               ret = UNCAC_ADDR(ret);
-       }
-
-       return ret;
-}
-
-EXPORT_SYMBOL(dma_alloc_coherent);
-
-void dma_free_noncoherent(struct device *dev, size_t size, void *vaddr,
-       dma_addr_t dma_handle)
-{
-       free_pages((unsigned long) vaddr, get_order(size));
-}
-
-EXPORT_SYMBOL(dma_free_noncoherent);
-
-void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
-       dma_addr_t dma_handle)
-{
-       unsigned long addr = (unsigned long) vaddr;
-
-       addr = CAC_ADDR(addr);
-       free_pages(addr, get_order(size));
-}
-
-EXPORT_SYMBOL(dma_free_coherent);
-
-static inline void __dma_sync(unsigned long addr, size_t size,
-       enum dma_data_direction direction)
-{
-       switch (direction) {
-       case DMA_TO_DEVICE:
-               dma_cache_wback(addr, size);
-               break;
-
-       case DMA_FROM_DEVICE:
-               dma_cache_inv(addr, size);
-               break;
-
-       case DMA_BIDIRECTIONAL:
-               dma_cache_wback_inv(addr, size);
-               break;
-
-       default:
-               BUG();
-       }
-}
-
-dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size,
-       enum dma_data_direction direction)
-{
-       unsigned long addr = (unsigned long) ptr;
-
-       switch (direction) {
-       case DMA_TO_DEVICE:
-               dma_cache_wback(addr, size);
-               break;
-
-       case DMA_FROM_DEVICE:
-               dma_cache_inv(addr, size);
-               break;
-
-       case DMA_BIDIRECTIONAL:
-               dma_cache_wback_inv(addr, size);
-               break;
-
-       default:
-               BUG();
-       }
-
-       addr = virt_to_phys(ptr)&RAM_OFFSET_MASK;
-       if(dev == NULL)
-           addr+=CRIME_HI_MEM_BASE;
-       return (dma_addr_t)addr;
-}
-
-EXPORT_SYMBOL(dma_map_single);
-
-void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
-       enum dma_data_direction direction)
-{
-       switch (direction) {
-       case DMA_TO_DEVICE:
-               break;
-
-       case DMA_FROM_DEVICE:
-               break;
-
-       case DMA_BIDIRECTIONAL:
-               break;
-
-       default:
-               BUG();
-       }
-}
-
-EXPORT_SYMBOL(dma_unmap_single);
-
-int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
-       enum dma_data_direction direction)
-{
-       int i;
-
-       BUG_ON(direction == DMA_NONE);
-
-       for (i = 0; i < nents; i++, sg++) {
-               unsigned long addr;
-
-               addr = (unsigned long) page_address(sg->page)+sg->offset;
-               if (addr)
-                       __dma_sync(addr, sg->length, direction);
-               addr = __pa(addr)&RAM_OFFSET_MASK;
-               if(dev == NULL)
-                       addr +=  CRIME_HI_MEM_BASE;
-               sg->dma_address = (dma_addr_t)addr;
-       }
-
-       return nents;
-}
-
-EXPORT_SYMBOL(dma_map_sg);
-
-dma_addr_t dma_map_page(struct device *dev, struct page *page,
-       unsigned long offset, size_t size, enum dma_data_direction direction)
-{
-       unsigned long addr;
-
-       BUG_ON(direction == DMA_NONE);
-
-       addr = (unsigned long) page_address(page) + offset;
-       dma_cache_wback_inv(addr, size);
-       addr = __pa(addr)&RAM_OFFSET_MASK;
-       if(dev == NULL)
-               addr +=  CRIME_HI_MEM_BASE;
-
-       return (dma_addr_t)addr;
-}
-
-EXPORT_SYMBOL(dma_map_page);
-
-void dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
-       enum dma_data_direction direction)
-{
-       BUG_ON(direction == DMA_NONE);
-
-       if (direction != DMA_TO_DEVICE) {
-               unsigned long addr;
-
-               dma_address&=RAM_OFFSET_MASK;
-               addr = dma_address + PAGE_OFFSET;
-               if(dma_address>=256*1024*1024)
-                       addr+=CRIME_HI_MEM_BASE;
-               dma_cache_wback_inv(addr, size);
-       }
-}
-
-EXPORT_SYMBOL(dma_unmap_page);
-
-void dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries,
-       enum dma_data_direction direction)
-{
-       unsigned long addr;
-       int i;
-
-       BUG_ON(direction == DMA_NONE);
-
-       if (direction == DMA_TO_DEVICE)
-               return;
-
-       for (i = 0; i < nhwentries; i++, sg++) {
-               addr = (unsigned long) page_address(sg->page);
-               if (!addr)
-                       continue;
-               dma_cache_wback_inv(addr + sg->offset, sg->length);
-       }
-}
-
-EXPORT_SYMBOL(dma_unmap_sg);
-
-void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,
-       size_t size, enum dma_data_direction direction)
-{
-       unsigned long addr;
-
-       BUG_ON(direction == DMA_NONE);
-
-       dma_handle&=RAM_OFFSET_MASK;
-       addr = dma_handle + PAGE_OFFSET;
-       if(dma_handle>=256*1024*1024)
-           addr+=CRIME_HI_MEM_BASE;
-       __dma_sync(addr, size, direction);
-}
-
-EXPORT_SYMBOL(dma_sync_single_for_cpu);
-
-void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle,
-       size_t size, enum dma_data_direction direction)
-{
-       unsigned long addr;
-
-       BUG_ON(direction == DMA_NONE);
-
-       dma_handle&=RAM_OFFSET_MASK;
-       addr = dma_handle + PAGE_OFFSET;
-       if(dma_handle>=256*1024*1024)
-           addr+=CRIME_HI_MEM_BASE;
-       __dma_sync(addr, size, direction);
-}
-
-EXPORT_SYMBOL(dma_sync_single_for_device);
-
-void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle,
-       unsigned long offset, size_t size, enum dma_data_direction direction)
-{
-       unsigned long addr;
-
-       BUG_ON(direction == DMA_NONE);
-
-       dma_handle&=RAM_OFFSET_MASK;
-       addr = dma_handle + offset + PAGE_OFFSET;
-       if(dma_handle>=256*1024*1024)
-           addr+=CRIME_HI_MEM_BASE;
-       __dma_sync(addr, size, direction);
-}
-
-EXPORT_SYMBOL(dma_sync_single_range_for_cpu);
-
-void dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle,
-       unsigned long offset, size_t size, enum dma_data_direction direction)
-{
-       unsigned long addr;
-
-       BUG_ON(direction == DMA_NONE);
-
-       dma_handle&=RAM_OFFSET_MASK;
-       addr = dma_handle + offset + PAGE_OFFSET;
-       if(dma_handle>=256*1024*1024)
-           addr+=CRIME_HI_MEM_BASE;
-       __dma_sync(addr, size, direction);
-}
-
-EXPORT_SYMBOL(dma_sync_single_range_for_device);
-
-void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
-       enum dma_data_direction direction)
-{
-       int i;
-
-       BUG_ON(direction == DMA_NONE);
-
-       /* Make sure that gcc doesn't leave the empty loop body.  */
-       for (i = 0; i < nelems; i++, sg++)
-               __dma_sync((unsigned long)page_address(sg->page),
-                          sg->length, direction);
-}
-
-EXPORT_SYMBOL(dma_sync_sg_for_cpu);
-
-void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems,
-       enum dma_data_direction direction)
-{
-       int i;
-
-       BUG_ON(direction == DMA_NONE);
-
-       /* Make sure that gcc doesn't leave the empty loop body.  */
-       for (i = 0; i < nelems; i++, sg++)
-               __dma_sync((unsigned long)page_address(sg->page),
-                          sg->length, direction);
-}
-
-EXPORT_SYMBOL(dma_sync_sg_for_device);
-
-int dma_mapping_error(dma_addr_t dma_addr)
-{
-       return 0;
-}
-
-EXPORT_SYMBOL(dma_mapping_error);
-
-int dma_supported(struct device *dev, u64 mask)
-{
-       /*
-        * we fall back to GFP_DMA when the mask isn't all 1s,
-        * so we can't guarantee allocations that must be
-        * within a tighter range than GFP_DMA..
-        */
-       if (mask < 0x00ffffff)
-               return 0;
-
-       return 1;
-}
-
-EXPORT_SYMBOL(dma_supported);
-
-int dma_is_consistent(struct device *dev, dma_addr_t dma_addr)
-{
-       return 1;
-}
-
-EXPORT_SYMBOL(dma_is_consistent);
-
-void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
-       enum dma_data_direction direction)
-{
-       if (direction == DMA_NONE)
-               return;
-
-       dma_cache_wback_inv((unsigned long)vaddr, size);
-}
-
-EXPORT_SYMBOL(dma_cache_sync);
-
index 035ea5137c71c9ee6c77c7f208ef8cda7c7f5b7c..81037709ba0d4cc2a4f5daefb83c02401cf3e5f6 100644 (file)
@@ -129,7 +129,7 @@ static struct mv643xx_eth_platform_data eth2_pd = {
 
 static struct platform_device eth2_device = {
        .name           = MV643XX_ETH_NAME,
-       .id             = 1,
+       .id             = 2,
        .num_resources  = ARRAY_SIZE(mv64x60_eth2_resources),
        .resource       = mv64x60_eth2_resources,
        .dev = {
index eefe5841fbb2cae942d16f05eee377fca5fab948..57cfe5c6e4a8e71cef2c89e1c34f2a7d749fcc9b 100644 (file)
@@ -129,7 +129,7 @@ static struct mv643xx_eth_platform_data eth2_pd = {
 
 static struct platform_device eth2_device = {
        .name           = MV643XX_ETH_NAME,
-       .id             = 1,
+       .id             = 2,
        .num_resources  = ARRAY_SIZE(mv64x60_eth2_resources),
        .resource       = mv64x60_eth2_resources,
        .dev = {
index 82b20c28bef8f8782a83ef4495728b12a119325b..bf85995ca042fecf18f6250a5683fa93f6e70683 100644 (file)
@@ -2,7 +2,7 @@
 # Makefile for the PCI specific kernel interface routines under Linux.
 #
 
-obj-y                          += pci.o
+obj-y                          += pci.o pci-dac.o
 
 #
 # PCI bus host bridge specific code
diff --git a/arch/mips/pci/pci-dac.c b/arch/mips/pci/pci-dac.c
new file mode 100644 (file)
index 0000000..0f0ea1b
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * 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) 2000  Ani Joshi <ajoshi@unixbox.com>
+ * Copyright (C) 2000, 2001, 06  Ralf Baechle <ralf@linux-mips.org>
+ * swiped from i386, and cloned for MIPS by Geert, polished by Ralf.
+ */
+
+#include <linux/types.h>
+#include <linux/dma-mapping.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+#include <linux/string.h>
+
+#include <asm/cache.h>
+#include <asm/io.h>
+
+#include <dma-coherence.h>
+
+#include <linux/pci.h>
+
+dma64_addr_t pci_dac_page_to_dma(struct pci_dev *pdev,
+       struct page *page, unsigned long offset, int direction)
+{
+       struct device *dev = &pdev->dev;
+
+       BUG_ON(direction == DMA_NONE);
+
+       if (!plat_device_is_coherent(dev)) {
+               unsigned long addr;
+
+               addr = (unsigned long) page_address(page) + offset;
+               dma_cache_wback_inv(addr, PAGE_SIZE);
+       }
+
+       return plat_map_dma_mem_page(dev, page) + offset;
+}
+
+EXPORT_SYMBOL(pci_dac_page_to_dma);
+
+struct page *pci_dac_dma_to_page(struct pci_dev *pdev,
+       dma64_addr_t dma_addr)
+{
+       return pfn_to_page(plat_dma_addr_to_phys(dma_addr) >> PAGE_SHIFT);
+}
+
+EXPORT_SYMBOL(pci_dac_dma_to_page);
+
+unsigned long pci_dac_dma_to_offset(struct pci_dev *pdev,
+       dma64_addr_t dma_addr)
+{
+       return dma_addr & ~PAGE_MASK;
+}
+
+EXPORT_SYMBOL(pci_dac_dma_to_offset);
+
+void pci_dac_dma_sync_single_for_cpu(struct pci_dev *pdev,
+       dma64_addr_t dma_addr, size_t len, int direction)
+{
+       BUG_ON(direction == PCI_DMA_NONE);
+
+       if (!plat_device_is_coherent(&pdev->dev))
+               dma_cache_wback_inv(dma_addr + PAGE_OFFSET, len);
+}
+
+EXPORT_SYMBOL(pci_dac_dma_sync_single_for_cpu);
+
+void pci_dac_dma_sync_single_for_device(struct pci_dev *pdev,
+       dma64_addr_t dma_addr, size_t len, int direction)
+{
+       BUG_ON(direction == PCI_DMA_NONE);
+
+       if (!plat_device_is_coherent(&pdev->dev))
+               dma_cache_wback_inv(dma_addr + PAGE_OFFSET, len);
+}
+
+EXPORT_SYMBOL(pci_dac_dma_sync_single_for_device);
index 72a016767e09d399f3ff65d95641a7082e639e32..3f097558ef1365df5b3f1d62343744322e731782 100644 (file)
@@ -79,10 +79,7 @@ static int pnx8550_proc_init( void )
 
        // Create /proc/pnx8550
         pnx8550_dir = create_proc_entry("pnx8550", S_IFDIR|S_IRUGO, NULL);
-        if (pnx8550_dir){
-                pnx8550_dir->nlink = 1;
-        }
-        else {
+        if (!pnx8550_dir) {
                 printk(KERN_ERR "Can't create pnx8550 proc dir\n");
                 return -1;
         }
@@ -90,7 +87,6 @@ static int pnx8550_proc_init( void )
        // Create /proc/pnx8550/timers
         pnx8550_timers = create_proc_entry("timers", S_IFREG|S_IRUGO, pnx8550_dir );
         if (pnx8550_timers){
-                pnx8550_timers->nlink = 1;
                 pnx8550_timers->read_proc = pnx8550_timers_read;
         }
         else {
@@ -100,7 +96,6 @@ static int pnx8550_proc_init( void )
        // Create /proc/pnx8550/registers
         pnx8550_registers = create_proc_entry("registers", S_IFREG|S_IRUGO, pnx8550_dir );
         if (pnx8550_registers){
-                pnx8550_registers->nlink = 1;
                 pnx8550_registers->read_proc = pnx8550_registers_read;
         }
         else {
index d1a906e683b2aa2c63ffe89d884b0056f4abcd47..212547c573102b0060955a3cd54d01b42c60c2e3 100644 (file)
@@ -374,7 +374,7 @@ static long sbprof_tb_ioctl(struct file *filp,
        return error;
 }
 
-static struct file_operations sbprof_tb_fops = {
+static const struct file_operations sbprof_tb_fops = {
        .owner          = THIS_MODULE,
        .open           = sbprof_tb_open,
        .release        = sbprof_tb_release,
index 735cb8778f4c257f9df9d8413bd78683cec775e8..7316a78fdd6832e0b3e4a3cf581297579350e9e7 100644 (file)
@@ -137,6 +137,8 @@ int tx4927_using_backplane = 0;
 extern void gt64120_time_init(void);
 extern void toshiba_rbtx4927_irq_setup(void);
 
+char *prom_getcmdline(void);
+
 #ifdef CONFIG_PCI
 #define CONFIG_TX4927BUG_WORKAROUND
 #undef TX4927_SUPPORT_COMMAND_IO
index 0f9ff618c6d7205c7d86f856cd78b9898b89e85a..28da4e71c44311e7111f8a2b2182b0d595a2d62d 100644 (file)
@@ -50,9 +50,6 @@ config TIME_LOW_RES
        depends on SMP
        default y
 
-config GENERIC_ISA_DMA
-       bool
-
 config GENERIC_HARDIRQS
        def_bool y
 
index ac8ee205c35197a5712f5687e9d734a0993ab8d6..a46bc62b643e46373144142f7c010a3644f41a19 100644 (file)
@@ -479,7 +479,7 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
        return error;
 }
 
-static struct file_operations perf_fops = {
+static const struct file_operations perf_fops = {
        .llseek = no_llseek,
        .read = perf_read,
        .write = perf_write,
index 3c7a3faf78edcc657443772e5fe785472df4ef8c..74b3686dd1e00c253fb7284b7d299051dc2f0ddb 100644 (file)
@@ -45,7 +45,7 @@
 #include <asm/io.h>
 #include <asm/setup.h>
 
-char   command_line[COMMAND_LINE_SIZE] __read_mostly;
+char   __initdata command_line[COMMAND_LINE_SIZE] __read_mostly;
 
 /* Intended for ccio/sba/cpu statistics under /proc/bus/{runway|gsc} */
 struct proc_dir_entry * proc_runway_root __read_mostly = NULL;
@@ -71,9 +71,9 @@ void __init setup_cmdline(char **cmdline_p)
        /* boot_args[0] is free-mem start, boot_args[1] is ptr to command line */
        if (boot_args[0] < 64) {
                /* called from hpux boot loader */
-               saved_command_line[0] = '\0';
+               boot_command_line[0] = '\0';
        } else {
-               strcpy(saved_command_line, (char *)__va(boot_args[1]));
+               strcpy(boot_command_line, (char *)__va(boot_args[1]));
 
 #ifdef CONFIG_BLK_DEV_INITRD
                if (boot_args[2] != 0) /* did palo pass us a ramdisk? */
@@ -84,7 +84,7 @@ void __init setup_cmdline(char **cmdline_p)
 #endif
        }
 
-       strcpy(command_line, saved_command_line);
+       strcpy(command_line, boot_command_line);
        *cmdline_p = command_line;
 }
 
index 29be4377aca6c0fb1e2cebd00d4fba4556efdc01..ce3245f87fddf832f9385a53b691ae7585a7d2a4 100644 (file)
@@ -579,70 +579,6 @@ asmlinkage int sys32_sendfile64(int out_fd, int in_fd, compat_loff_t __user *off
 }
 
 
-struct sysinfo32 {
-       s32 uptime;
-       u32 loads[3];
-       u32 totalram;
-       u32 freeram;
-       u32 sharedram;
-       u32 bufferram;
-       u32 totalswap;
-       u32 freeswap;
-       unsigned short procs;
-       u32 totalhigh;
-       u32 freehigh;
-       u32 mem_unit;
-       char _f[12];
-};
-
-/* We used to call sys_sysinfo and translate the result.  But sys_sysinfo
- * undoes the good work done elsewhere, and rather than undoing the
- * damage, I decided to just duplicate the code from sys_sysinfo here.
- */
-
-asmlinkage int sys32_sysinfo(struct sysinfo32 __user *info)
-{
-       struct sysinfo val;
-       int err;
-       unsigned long seq;
-
-       /* We don't need a memset here because we copy the
-        * struct to userspace once element at a time.
-        */
-
-       do {
-               seq = read_seqbegin(&xtime_lock);
-               val.uptime = jiffies / HZ;
-
-               val.loads[0] = avenrun[0] << (SI_LOAD_SHIFT - FSHIFT);
-               val.loads[1] = avenrun[1] << (SI_LOAD_SHIFT - FSHIFT);
-               val.loads[2] = avenrun[2] << (SI_LOAD_SHIFT - FSHIFT);
-
-               val.procs = nr_threads;
-       } while (read_seqretry(&xtime_lock, seq));
-
-
-       si_meminfo(&val);
-       si_swapinfo(&val);
-       
-       err = put_user (val.uptime, &info->uptime);
-       err |= __put_user (val.loads[0], &info->loads[0]);
-       err |= __put_user (val.loads[1], &info->loads[1]);
-       err |= __put_user (val.loads[2], &info->loads[2]);
-       err |= __put_user (val.totalram, &info->totalram);
-       err |= __put_user (val.freeram, &info->freeram);
-       err |= __put_user (val.sharedram, &info->sharedram);
-       err |= __put_user (val.bufferram, &info->bufferram);
-       err |= __put_user (val.totalswap, &info->totalswap);
-       err |= __put_user (val.freeswap, &info->freeswap);
-       err |= __put_user (val.procs, &info->procs);
-       err |= __put_user (val.totalhigh, &info->totalhigh);
-       err |= __put_user (val.freehigh, &info->freehigh);
-       err |= __put_user (val.mem_unit, &info->mem_unit);
-       return err ? -EFAULT : 0;
-}
-
-
 /* lseek() needs a wrapper because 'offset' can be negative, but the top
  * half of the argument has been zeroed by syscall.S.
  */
index 701d66a596e8855d22ab3ddaa4a889b68b4500ce..be8eb9a0d24a7420879fc819b776870b01b21b21 100644 (file)
        /* struct rusage contains longs... */
        ENTRY_COMP(wait4)
        ENTRY_SAME(swapoff)             /* 115 */
-       ENTRY_DIFF(sysinfo)
+       ENTRY_COMP(sysinfo)
        ENTRY_SAME(shutdown)
        ENTRY_SAME(fsync)
        ENTRY_SAME(madvise)
index bad7d1eb62b975dff89921860ca30e816e948de3..5f1b51af06a9820ff54e57479c50543eacb0799f 100644 (file)
@@ -288,17 +288,6 @@ do_settimeofday (struct timespec *tv)
 }
 EXPORT_SYMBOL(do_settimeofday);
 
-/*
- * XXX: We can do better than this.
- * Returns nanoseconds
- */
-
-unsigned long long sched_clock(void)
-{
-       return (unsigned long long)jiffies * (1000000000 / HZ);
-}
-
-
 void __init start_cpu_itimer(void)
 {
        unsigned int cpu = smp_processor_id();
index 7b943b45f7cd518f7749aa50fcf6ed081d5615f0..3b78c2794c369e72bfe57d2bdd461fc8754b0d63 100644 (file)
@@ -173,10 +173,12 @@ SECTIONS
      from .altinstructions and .eh_frame */
   .exit.text : { *(.exit.text) }
   .exit.data : { *(.exit.data) }
+#ifdef CONFIG_BLK_DEV_INITRD
   . = ALIGN(ASM_PAGE_SIZE);
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
   __initramfs_end = .;
+#endif
   . = ALIGN(32);
   __per_cpu_start = .;
   .data.percpu  : { *(.data.percpu) }
index 0667f2b4f9775b13ab6fbc527884de52022bfa34..12117db0043bdd0d52740bc0c42e04d3af9cb496 100644 (file)
@@ -77,12 +77,11 @@ static void __init mem_limit_func(void)
 {
        char *cp, *end;
        unsigned long limit;
-       extern char saved_command_line[];
 
        /* We need this before __setup() functions are called */
 
        limit = MAX_MEM;
-       for (cp = saved_command_line; *cp; ) {
+       for (cp = boot_command_line; *cp; ) {
                if (memcmp(cp, "mem=", 4) == 0) {
                        cp += 4;
                        limit = memparse(cp, &end);
@@ -808,9 +807,7 @@ void __init paging_init(void)
        for (i = 0; i < npmem_ranges; i++) {
                unsigned long zones_size[MAX_NR_ZONES] = { 0, };
 
-               /* We have an IOMMU, so all memory can go into a single
-                  ZONE_DMA zone. */
-               zones_size[ZONE_DMA] = pmem_ranges[i].pages;
+               zones_size[ZONE_NORMAL] = pmem_ranges[i].pages;
 
 #ifdef CONFIG_DISCONTIGMEM
                /* Need to initialize the pfnnid_map before we can initialize
index f08e80a0bf0addaf3a33d95f30238a6064f4a53e..340d9beab6d1368978907f387fa1ff9943a71123 100644 (file)
@@ -876,7 +876,7 @@ config ARCH_SPARSEMEM_ENABLE
 
 config ARCH_SPARSEMEM_DEFAULT
        def_bool y
-       depends on (SMP && PPC_PSERIES) || PPC_CELL
+       depends on (SMP && PPC_PSERIES) || PPC_PS3
 
 config ARCH_POPULATES_NODE_MAP
        def_bool y
@@ -977,6 +977,10 @@ config ISA
          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 ZONE_DMA
+       bool
+       default y
+
 config GENERIC_ISA_DMA
        bool
        depends on PPC64 || POWER4 || 6xx && !CPM2
diff --git a/arch/powerpc/boot/dts/kuroboxHD.dts b/arch/powerpc/boot/dts/kuroboxHD.dts
new file mode 100644 (file)
index 0000000..096e94a
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * Device Tree Souce for Buffalo KuroboxHD
+ *
+ * Choose CONFIG_LINKSTATION to build a kernel for KuroboxHD, or use
+ * the default configuration linkstation_defconfig.
+ *
+ * Based on sandpoint.dts
+ *
+ * 2006 (c) G. Liakhovetski <g.liakhovetski@gmx.de>
+ *
+ * This file is licensed under
+ * the terms of the GNU General Public License version 2.  This program
+ * is licensed "as is" without any warranty of any kind, whether express
+ * or implied.
+
+XXXX add flash parts, rtc, ??
+
+build with: "dtc -f -I dts -O dtb -o kuroboxHD.dtb -V 16 kuroboxHD.dts"
+
+
+ */
+
+/ {
+       linux,phandle = <1000>;
+       model = "KuroboxHD";
+       compatible = "linkstation";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       cpus {
+               linux,phandle = <2000>;
+               #cpus = <1>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               PowerPC,603e { /* Really 8241 */
+                       linux,phandle = <2100>;
+                       linux,boot-cpu;
+                       device_type = "cpu";
+                       reg = <0>;
+                       clock-frequency = <bebc200>;    /* Fixed by bootwrapper */
+                       timebase-frequency = <1743000>; /* Fixed by bootwrapper */
+                       bus-frequency = <0>;            /* From bootloader */
+                       /* Following required by dtc but not used */
+                       i-cache-line-size = <0>;
+                       d-cache-line-size = <0>;
+                       i-cache-size = <4000>;
+                       d-cache-size = <4000>;
+               };
+       };
+
+       memory {
+               linux,phandle = <3000>;
+               device_type = "memory";
+               reg = <00000000 04000000>;
+       };
+
+       soc10x { /* AFAICT need to make soc for 8245's uarts to be defined */
+               linux,phandle = <4000>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+               #interrupt-cells = <2>;
+               device_type = "soc";
+               compatible = "mpc10x";
+               store-gathering = <0>; /* 0 == off, !0 == on */
+               reg = <80000000 00100000>;
+               ranges = <80000000 80000000 70000000    /* pci mem space */
+                         fc000000 fc000000 00100000    /* EUMB */
+                         fe000000 fe000000 00c00000    /* pci i/o space */
+                         fec00000 fec00000 00300000    /* pci cfg regs */
+                         fef00000 fef00000 00100000>;  /* pci iack */
+
+               i2c@80003000 {
+                       linux,phandle = <4300>;
+                       device_type = "i2c";
+                       compatible = "fsl-i2c";
+                       reg = <80003000 1000>;
+                       interrupts = <5 2>;
+                       interrupt-parent = <4400>;
+               };
+
+               serial@80004500 {
+                       linux,phandle = <4511>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <80004500 8>;
+                       clock-frequency = <5d08d88>;
+                       current-speed = <2580>;
+                       interrupts = <9 2>;
+                       interrupt-parent = <4400>;
+               };
+
+               serial@80004600 {
+                       linux,phandle = <4512>;
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <80004600 8>;
+                       clock-frequency = <5d08d88>;
+                       current-speed = <e100>;
+                       interrupts = <a 0>;
+                       interrupt-parent = <4400>;
+               };
+
+               pic@80040000 {
+                       linux,phandle = <4400>;
+                       #interrupt-cells = <2>;
+                       #address-cells = <0>;
+                       device_type = "open-pic";
+                       compatible = "chrp,open-pic";
+                       interrupt-controller;
+                       reg = <80040000 40000>;
+                       built-in;
+               };
+
+               pci@fec00000 {
+                       linux,phandle = <4500>;
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+                       #interrupt-cells = <1>;
+                       device_type = "pci";
+                       compatible = "mpc10x-pci";
+                       reg = <fec00000 400000>;
+                       ranges = <01000000 0        0 fe000000 0 00c00000
+                                 02000000 0 80000000 80000000 0 70000000>;
+                       bus-range = <0 ff>;
+                       clock-frequency = <7f28155>;
+                       interrupt-parent = <4400>;
+                       interrupt-map-mask = <f800 0 0 7>;
+                       interrupt-map = <
+                               /* IDSEL 0x11 - IRQ0 ETH */
+                               5800 0 0 1 4400 0 1
+                               5800 0 0 2 4400 1 1
+                               5800 0 0 3 4400 2 1
+                               5800 0 0 4 4400 3 1
+                               /* IDSEL 0x12 - IRQ1 IDE0 */
+                               6000 0 0 1 4400 1 1
+                               6000 0 0 2 4400 2 1
+                               6000 0 0 3 4400 3 1
+                               6000 0 0 4 4400 0 1
+                               /* IDSEL 0x14 - IRQ3 USB2.0 */
+                               7000 0 0 1 4400 3 1
+                               7000 0 0 2 4400 3 1
+                               7000 0 0 3 4400 3 1
+                               7000 0 0 4 4400 3 1
+                       >;
+               };
+       };
+};
index 186870704ad92832332e9582166117d1e44211db..c03103c632855877dd2c7d088dfd6d509a3ea540 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Lite5200 board Device Tree Source
  *
- * Copyright 2006 Secret Lab Technologies Ltd.
+ * Copyright 2006-2007 Secret Lab Technologies Ltd.
  * Grant Likely <grant.likely@secretlab.ca>
  *
  * This program is free software; you can redistribute  it and/or modify it
@@ -17,8 +17,9 @@
  */
 
 / {
-       model = "Lite5200";
-       compatible = "lite5200\0lite52xx\0mpc5200\0mpc52xx";
+       model = "fsl,lite5200";
+       // revision = "1.0";
+       compatible = "fsl,lite5200\0generic-mpc5200";
        #address-cells = <1>;
        #size-cells = <1>;
 
        };
 
        soc5200@f0000000 {
+               model = "fsl,mpc5200";
+               revision = ""                   // from bootloader
                #interrupt-cells = <3>;
                device_type = "soc";
                ranges = <0 f0000000 f0010000>;
                reg = <f0000000 00010000>;
                bus-frequency = <0>;            // from bootloader
+               system-frequency = <0>;         // from bootloader
 
                cdm@200 {
-                       compatible = "mpc5200-cdm\0mpc52xx-cdm";
+                       compatible = "mpc5200-cdm";
                        reg = <200 38>;
                };
 
                        interrupt-controller;
                        #interrupt-cells = <3>;
                        device_type = "interrupt-controller";
-                       compatible = "mpc5200-pic\0mpc52xx-pic";
+                       compatible = "mpc5200-pic";
                        reg = <500 80>;
                        built-in;
                };
 
                gpt@600 {       // General Purpose Timer
-                       compatible = "mpc5200-gpt\0mpc52xx-gpt";
+                       compatible = "mpc5200-gpt";
                        device_type = "gpt";
+                       cell-index = <0>;
                        reg = <600 10>;
                        interrupts = <1 9 0>;
                        interrupt-parent = <500>;
+                       has-wdt;
                };
 
                gpt@610 {       // General Purpose Timer
-                       compatible = "mpc5200-gpt\0mpc52xx-gpt";
+                       compatible = "mpc5200-gpt";
                        device_type = "gpt";
+                       cell-index = <1>;
                        reg = <610 10>;
                        interrupts = <1 a 0>;
                        interrupt-parent = <500>;
                };
 
                gpt@620 {       // General Purpose Timer
-                       compatible = "mpc5200-gpt\0mpc52xx-gpt";
+                       compatible = "mpc5200-gpt";
                        device_type = "gpt";
+                       cell-index = <2>;
                        reg = <620 10>;
                        interrupts = <1 b 0>;
                        interrupt-parent = <500>;
                };
 
                gpt@630 {       // General Purpose Timer
-                       compatible = "mpc5200-gpt\0mpc52xx-gpt";
+                       compatible = "mpc5200-gpt";
                        device_type = "gpt";
+                       cell-index = <3>;
                        reg = <630 10>;
                        interrupts = <1 c 0>;
                        interrupt-parent = <500>;
                };
 
                gpt@640 {       // General Purpose Timer
-                       compatible = "mpc5200-gpt\0mpc52xx-gpt";
+                       compatible = "mpc5200-gpt";
                        device_type = "gpt";
+                       cell-index = <4>;
                        reg = <640 10>;
                        interrupts = <1 d 0>;
                        interrupt-parent = <500>;
                };
 
                gpt@650 {       // General Purpose Timer
-                       compatible = "mpc5200-gpt\0mpc52xx-gpt";
+                       compatible = "mpc5200-gpt";
                        device_type = "gpt";
+                       cell-index = <5>;
                        reg = <650 10>;
                        interrupts = <1 e 0>;
                        interrupt-parent = <500>;
                };
 
                gpt@660 {       // General Purpose Timer
-                       compatible = "mpc5200-gpt\0mpc52xx-gpt";
+                       compatible = "mpc5200-gpt";
                        device_type = "gpt";
+                       cell-index = <6>;
                        reg = <660 10>;
                        interrupts = <1 f 0>;
                        interrupt-parent = <500>;
                };
 
                gpt@670 {       // General Purpose Timer
-                       compatible = "mpc5200-gpt\0mpc52xx-gpt";
+                       compatible = "mpc5200-gpt";
                        device_type = "gpt";
+                       cell-index = <7>;
                        reg = <670 10>;
                        interrupts = <1 10 0>;
                        interrupt-parent = <500>;
                };
 
                rtc@800 {       // Real time clock
-                       compatible = "mpc5200-rtc\0mpc52xx-rtc";
+                       compatible = "mpc5200-rtc";
                        device_type = "rtc";
                        reg = <800 100>;
                        interrupts = <1 5 0 1 6 0>;
 
                mscan@900 {
                        device_type = "mscan";
-                       compatible = "mpc5200-mscan\0mpc52xx-mscan";
+                       compatible = "mpc5200-mscan";
+                       cell-index = <0>;
                        interrupts = <2 11 0>;
                        interrupt-parent = <500>;
                        reg = <900 80>;
 
                mscan@980 {
                        device_type = "mscan";
-                       compatible = "mpc5200-mscan\0mpc52xx-mscan";
+                       compatible = "mpc5200-mscan";
+                       cell-index = <1>;
                        interrupts = <1 12 0>;
                        interrupt-parent = <500>;
                        reg = <980 80>;
                };
 
                gpio@b00 {
-                       compatible = "mpc5200-gpio\0mpc52xx-gpio";
+                       compatible = "mpc5200-gpio";
                        reg = <b00 40>;
                        interrupts = <1 7 0>;
                        interrupt-parent = <500>;
                };
 
                gpio-wkup@b00 {
-                       compatible = "mpc5200-gpio-wkup\0mpc52xx-gpio-wkup";
+                       compatible = "mpc5200-gpio-wkup";
                        reg = <c00 40>;
                        interrupts = <1 8 0 0 3 0>;
                        interrupt-parent = <500>;
                        #size-cells = <2>;
                        #address-cells = <3>;
                        device_type = "pci";
-                       compatible = "mpc5200-pci\0mpc52xx-pci";
+                       compatible = "mpc5200-pci";
                        reg = <d00 100>;
                        interrupt-map-mask = <f800 0 0 7>;
                        interrupt-map = <c000 0 0 1 500 0 0 3
 
                spi@f00 {
                        device_type = "spi";
-                       compatible = "mpc5200-spi\0mpc52xx-spi";
+                       compatible = "mpc5200-spi";
                        reg = <f00 20>;
                        interrupts = <2 d 0 2 e 0>;
                        interrupt-parent = <500>;
 
                usb@1000 {
                        device_type = "usb-ohci-be";
-                       compatible = "mpc5200-ohci\0mpc52xx-ohci\0ohci-be";
+                       compatible = "mpc5200-ohci\0ohci-be";
                        reg = <1000 ff>;
                        interrupts = <2 6 0>;
                        interrupt-parent = <500>;
 
                bestcomm@1200 {
                        device_type = "dma-controller";
-                       compatible = "mpc5200-bestcomm\0mpc52xx-bestcomm";
+                       compatible = "mpc5200-bestcomm";
                        reg = <1200 80>;
                        interrupts = <3 0 0  3 1 0  3 2 0  3 3 0
                                      3 4 0  3 5 0  3 6 0  3 7 0
                };
 
                xlb@1f00 {
-                       compatible = "mpc5200-xlb\0mpc52xx-xlb";
+                       compatible = "mpc5200-xlb";
                        reg = <1f00 100>;
                };
 
                serial@2000 {           // PSC1
                        device_type = "serial";
-                       compatible = "mpc5200-psc-uart\0mpc52xx-psc-uart";
+                       compatible = "mpc5200-psc-uart";
                        port-number = <0>;  // Logical port assignment
+                       cell-index = <0>;
                        reg = <2000 100>;
                        interrupts = <2 1 0>;
                        interrupt-parent = <500>;
                };
 
-               // PSC2 in spi mode example
-               spi@2200 {              // PSC2
-                       device_type = "spi";
-                       compatible = "mpc5200-psc-spi\0mpc52xx-psc-spi";
-                       reg = <2200 100>;
-                       interrupts = <2 2 0>;
-                       interrupt-parent = <500>;
-               };
+               // PSC2 in ac97 mode example
+               //ac97@2200 {           // PSC2
+               //      device_type = "sound";
+               //      compatible = "mpc5200-psc-ac97";
+               //      cell-index = <1>;
+               //      reg = <2200 100>;
+               //      interrupts = <2 2 0>;
+               //      interrupt-parent = <500>;
+               //};
 
                // PSC3 in CODEC mode example
-               i2s@2400 {              // PSC3
-                       device_type = "sound";
-                       compatible = "mpc5200-psc-i2s\0mpc52xx-psc-i2s";
-                       reg = <2400 100>;
-                       interrupts = <2 3 0>;
-                       interrupt-parent = <500>;
-               };
+               //i2s@2400 {            // PSC3
+               //      device_type = "sound";
+               //      compatible = "mpc5200-psc-i2s";
+               //      cell-index = <2>;
+               //      reg = <2400 100>;
+               //      interrupts = <2 3 0>;
+               //      interrupt-parent = <500>;
+               //};
 
-               // PSC4 unconfigured
+               // PSC4 in uart mode example
                //serial@2600 {         // PSC4
                //      device_type = "serial";
-               //      compatible = "mpc5200-psc-uart\0mpc52xx-psc-uart";
+               //      compatible = "mpc5200-psc-uart";
+               //      cell-index = <3>;
                //      reg = <2600 100>;
                //      interrupts = <2 b 0>;
                //      interrupt-parent = <500>;
                //};
 
-               // PSC5 unconfigured
+               // PSC5 in uart mode example
                //serial@2800 {         // PSC5
                //      device_type = "serial";
-               //      compatible = "mpc5200-psc-uart\0mpc52xx-psc-uart";
+               //      compatible = "mpc5200-psc-uart";
+               //      cell-index = <4>;
                //      reg = <2800 100>;
                //      interrupts = <2 c 0>;
                //      interrupt-parent = <500>;
                //};
 
-               // PSC6 in AC97 mode example
-               ac97@2c00 {             // PSC6
-                       device_type = "sound";
-                       compatible = "mpc5200-psc-ac97\0mpc52xx-psc-ac97";
-                       reg = <2c00 100>;
-                       interrupts = <2 4 0>;
-                       interrupt-parent = <500>;
-               };
+               // PSC6 in spi mode example
+               //spi@2c00 {            // PSC6
+               //      device_type = "spi";
+               //      compatible = "mpc5200-psc-spi";
+               //      cell-index = <5>;
+               //      reg = <2c00 100>;
+               //      interrupts = <2 4 0>;
+               //      interrupt-parent = <500>;
+               //};
 
                ethernet@3000 {
                        device_type = "network";
-                       compatible = "mpc5200-fec\0mpc52xx-fec";
+                       compatible = "mpc5200-fec";
                        reg = <3000 800>;
                        mac-address = [ 02 03 04 05 06 07 ]; // Bad!
                        interrupts = <2 5 0>;
 
                ata@3a00 {
                        device_type = "ata";
-                       compatible = "mpc5200-ata\0mpc52xx-ata";
+                       compatible = "mpc5200-ata";
                        reg = <3a00 100>;
                        interrupts = <2 7 0>;
                        interrupt-parent = <500>;
 
                i2c@3d00 {
                        device_type = "i2c";
-                       compatible = "mpc5200-i2c\0mpc52xx-i2c";
+                       compatible = "mpc5200-i2c";
+                       cell-index = <0>;
                        reg = <3d00 40>;
                        interrupts = <2 f 0>;
                        interrupt-parent = <500>;
 
                i2c@3d40 {
                        device_type = "i2c";
-                       compatible = "mpc5200-i2c\0mpc52xx-i2c";
+                       compatible = "mpc5200-i2c";
+                       cell-index = <1>;
                        reg = <3d40 40>;
                        interrupts = <2 10 0>;
                        interrupt-parent = <500>;
                };
                sram@8000 {
                        device_type = "sram";
-                       compatible = "mpc5200-sram\0mpc52xx-sram\0sram";
+                       compatible = "mpc5200-sram\0sram";
                        reg = <8000 4000>;
                };
        };
index 5bb2760d7c30cf3e72fd5c0c40610d0f098b6ccc..3875ca9a9a624550b457188e3dd53602e86c35d4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Lite5200B board Device Tree Source
  *
- * Copyright 2006 Secret Lab Technologies Ltd.
+ * Copyright 2006-2007 Secret Lab Technologies Ltd.
  * Grant Likely <grant.likely@secretlab.ca>
  *
  * This program is free software; you can redistribute  it and/or modify it
@@ -17,8 +17,9 @@
  */
 
 / {
-       model = "Lite5200b";
-       compatible = "lite5200b\0lite52xx\0mpc5200b\0mpc52xx";
+       model = "fsl,lite5200b";
+       // revision = "1.0";
+       compatible = "fsl,lite5200b\0generic-mpc5200";
        #address-cells = <1>;
        #size-cells = <1>;
 
        };
 
        soc5200@f0000000 {
+               model = "fsl,mpc5200b";
+               revision = "";                  // from bootloader
                #interrupt-cells = <3>;
                device_type = "soc";
                ranges = <0 f0000000 f0010000>;
                reg = <f0000000 00010000>;
                bus-frequency = <0>;            // from bootloader
+               system-frequency = <0>;         // from bootloader
 
                cdm@200 {
-                       compatible = "mpc5200b-cdm\0mpc52xx-cdm";
+                       compatible = "mpc5200b-cdm\0mpc5200-cdm";
                        reg = <200 38>;
                };
 
                        interrupt-controller;
                        #interrupt-cells = <3>;
                        device_type = "interrupt-controller";
-                       compatible = "mpc5200b-pic\0mpc52xx-pic";
+                       compatible = "mpc5200b-pic\0mpc5200-pic";
                        reg = <500 80>;
                        built-in;
                };
 
                gpt@600 {       // General Purpose Timer
-                       compatible = "mpc5200b-gpt\0mpc52xx-gpt";
+                       compatible = "mpc5200b-gpt\0mpc5200-gpt";
                        device_type = "gpt";
+                       cell-index = <0>;
                        reg = <600 10>;
                        interrupts = <1 9 0>;
                        interrupt-parent = <500>;
+                       has-wdt;
                };
 
                gpt@610 {       // General Purpose Timer
-                       compatible = "mpc5200b-gpt\0mpc52xx-gpt";
+                       compatible = "mpc5200b-gpt\0mpc5200-gpt";
                        device_type = "gpt";
+                       cell-index = <1>;
                        reg = <610 10>;
                        interrupts = <1 a 0>;
                        interrupt-parent = <500>;
                };
 
                gpt@620 {       // General Purpose Timer
-                       compatible = "mpc5200b-gpt\0mpc52xx-gpt";
+                       compatible = "mpc5200b-gpt\0mpc5200-gpt";
                        device_type = "gpt";
+                       cell-index = <2>;
                        reg = <620 10>;
                        interrupts = <1 b 0>;
                        interrupt-parent = <500>;
                };
 
                gpt@630 {       // General Purpose Timer
-                       compatible = "mpc5200b-gpt\0mpc52xx-gpt";
+                       compatible = "mpc5200b-gpt\0mpc5200-gpt";
                        device_type = "gpt";
+                       cell-index = <3>;
                        reg = <630 10>;
                        interrupts = <1 c 0>;
                        interrupt-parent = <500>;
                };
 
                gpt@640 {       // General Purpose Timer
-                       compatible = "mpc5200b-gpt\0mpc52xx-gpt";
+                       compatible = "mpc5200b-gpt\0mpc5200-gpt";
                        device_type = "gpt";
+                       cell-index = <4>;
                        reg = <640 10>;
                        interrupts = <1 d 0>;
                        interrupt-parent = <500>;
                };
 
                gpt@650 {       // General Purpose Timer
-                       compatible = "mpc5200b-gpt\0mpc52xx-gpt";
+                       compatible = "mpc5200b-gpt\0mpc5200-gpt";
                        device_type = "gpt";
+                       cell-index = <5>;
                        reg = <650 10>;
                        interrupts = <1 e 0>;
                        interrupt-parent = <500>;
                };
 
                gpt@660 {       // General Purpose Timer
-                       compatible = "mpc5200b-gpt\0mpc52xx-gpt";
+                       compatible = "mpc5200b-gpt\0mpc5200-gpt";
                        device_type = "gpt";
+                       cell-index = <6>;
                        reg = <660 10>;
                        interrupts = <1 f 0>;
                        interrupt-parent = <500>;
                };
 
                gpt@670 {       // General Purpose Timer
-                       compatible = "mpc5200b-gpt\0mpc52xx-gpt";
+                       compatible = "mpc5200b-gpt\0mpc5200-gpt";
                        device_type = "gpt";
+                       cell-index = <7>;
                        reg = <670 10>;
                        interrupts = <1 10 0>;
                        interrupt-parent = <500>;
                };
 
                rtc@800 {       // Real time clock
-                       compatible = "mpc5200b-rtc\0mpc52xx-rtc";
+                       compatible = "mpc5200b-rtc\0mpc5200-rtc";
                        device_type = "rtc";
                        reg = <800 100>;
                        interrupts = <1 5 0 1 6 0>;
 
                mscan@900 {
                        device_type = "mscan";
-                       compatible = "mpc5200b-mscan\0mpc52xx-mscan";
+                       compatible = "mpc5200b-mscan\0mpc5200-mscan";
+                       cell-index = <0>;
                        interrupts = <2 11 0>;
                        interrupt-parent = <500>;
                        reg = <900 80>;
 
                mscan@980 {
                        device_type = "mscan";
-                       compatible = "mpc5200b-mscan\0mpc52xx-mscan";
+                       compatible = "mpc5200b-mscan\0mpc5200-mscan";
+                       cell-index = <1>;
                        interrupts = <1 12 0>;
                        interrupt-parent = <500>;
                        reg = <980 80>;
                };
 
                gpio@b00 {
-                       compatible = "mpc5200b-gpio\0mpc52xx-gpio";
+                       compatible = "mpc5200b-gpio\0mpc5200-gpio";
                        reg = <b00 40>;
                        interrupts = <1 7 0>;
                        interrupt-parent = <500>;
                };
 
                gpio-wkup@b00 {
-                       compatible = "mpc5200b-gpio-wkup\0mpc52xx-gpio-wkup";
+                       compatible = "mpc5200b-gpio-wkup\0mpc5200-gpio-wkup";
                        reg = <c00 40>;
                        interrupts = <1 8 0 0 3 0>;
                        interrupt-parent = <500>;
                        #size-cells = <2>;
                        #address-cells = <3>;
                        device_type = "pci";
-                       compatible = "mpc5200b-pci\0mpc52xx-pci";
+                       compatible = "mpc5200b-pci\0mpc5200-pci";
                        reg = <d00 100>;
                        interrupt-map-mask = <f800 0 0 7>;
                        interrupt-map = <c000 0 0 1 500 0 0 3 // 1st slot
 
                spi@f00 {
                        device_type = "spi";
-                       compatible = "mpc5200b-spi\0mpc52xx-spi";
+                       compatible = "mpc5200b-spi\0mpc5200-spi";
                        reg = <f00 20>;
                        interrupts = <2 d 0 2 e 0>;
                        interrupt-parent = <500>;
 
                usb@1000 {
                        device_type = "usb-ohci-be";
-                       compatible = "mpc5200b-ohci\0mpc52xx-ohci\0ohci-be";
+                       compatible = "mpc5200b-ohci\0mpc5200-ohci\0ohci-be";
                        reg = <1000 ff>;
                        interrupts = <2 6 0>;
                        interrupt-parent = <500>;
 
                bestcomm@1200 {
                        device_type = "dma-controller";
-                       compatible = "mpc5200b-bestcomm\0mpc52xx-bestcomm";
+                       compatible = "mpc5200b-bestcomm\0mpc5200-bestcomm";
                        reg = <1200 80>;
                        interrupts = <3 0 0  3 1 0  3 2 0  3 3 0
                                      3 4 0  3 5 0  3 6 0  3 7 0
                };
 
                xlb@1f00 {
-                       compatible = "mpc5200b-xlb\0mpc52xx-xlb";
+                       compatible = "mpc5200b-xlb\0mpc5200-xlb";
                        reg = <1f00 100>;
                };
 
                serial@2000 {           // PSC1
                        device_type = "serial";
-                       compatible = "mpc5200b-psc-uart\0mpc52xx-psc-uart";
+                       compatible = "mpc5200b-psc-uart\0mpc5200-psc-uart";
                        port-number = <0>;  // Logical port assignment
+                       cell-index = <0>;
                        reg = <2000 100>;
                        interrupts = <2 1 0>;
                        interrupt-parent = <500>;
                };
 
-               // PSC2 in spi mode example
-               spi@2200 {              // PSC2
-                       device_type = "spi";
-                       compatible = "mpc5200b-psc-spi\0mpc52xx-psc-spi";
-                       reg = <2200 100>;
-                       interrupts = <2 2 0>;
-                       interrupt-parent = <500>;
-               };
+               // PSC2 in ac97 mode example
+               //ac97@2200 {           // PSC2
+               //      device_type = "sound";
+               //      compatible = "mpc5200b-psc-ac97\0mpc5200-psc-ac97";
+               //      cell-index = <1>;
+               //      reg = <2200 100>;
+               //      interrupts = <2 2 0>;
+               //      interrupt-parent = <500>;
+               //};
 
                // PSC3 in CODEC mode example
-               i2s@2400 {              // PSC3
-                       device_type = "sound";
-                       compatible = "mpc5200b-psc-i2s\0mpc52xx-psc-i2s";
-                       reg = <2400 100>;
-                       interrupts = <2 3 0>;
-                       interrupt-parent = <500>;
-               };
+               //i2s@2400 {            // PSC3
+               //      device_type = "sound";
+               //      compatible = "mpc5200b-psc-i2s"; //not 5200 compatible
+               //      cell-index = <2>;
+               //      reg = <2400 100>;
+               //      interrupts = <2 3 0>;
+               //      interrupt-parent = <500>;
+               //};
 
-               // PSC4 unconfigured
+               // PSC4 in uart mode example
                //serial@2600 {         // PSC4
                //      device_type = "serial";
-               //      compatible = "mpc5200b-psc-uart\0mpc52xx-psc-uart";
+               //      compatible = "mpc5200b-psc-uart\0mpc5200-psc-uart";
+               //      cell-index = <3>;
                //      reg = <2600 100>;
                //      interrupts = <2 b 0>;
                //      interrupt-parent = <500>;
                //};
 
-               // PSC5 unconfigured
+               // PSC5 in uart mode example
                //serial@2800 {         // PSC5
                //      device_type = "serial";
-               //      compatible = "mpc5200b-psc-uart\0mpc52xx-psc-uart";
+               //      compatible = "mpc5200b-psc-uart\0mpc5200-psc-uart";
+               //      cell-index = <4>;
                //      reg = <2800 100>;
                //      interrupts = <2 c 0>;
                //      interrupt-parent = <500>;
                //};
 
-               // PSC6 in AC97 mode example
-               ac97@2c00 {             // PSC6
-                       device_type = "sound";
-                       compatible = "mpc5200b-psc-ac97\0mpc52xx-psc-ac97";
-                       reg = <2c00 100>;
-                       interrupts = <2 4 0>;
-                       interrupt-parent = <500>;
-               };
+               // PSC6 in spi mode example
+               //spi@2c00 {            // PSC6
+               //      device_type = "spi";
+               //      compatible = "mpc5200b-psc-spi\0mpc5200-psc-spi";
+               //      cell-index = <5>;
+               //      reg = <2c00 100>;
+               //      interrupts = <2 4 0>;
+               //      interrupt-parent = <500>;
+               //};
 
                ethernet@3000 {
                        device_type = "network";
-                       compatible = "mpc5200b-fec\0mpc52xx-fec";
+                       compatible = "mpc5200b-fec\0mpc5200-fec";
                        reg = <3000 800>;
                        mac-address = [ 02 03 04 05 06 07 ]; // Bad!
                        interrupts = <2 5 0>;
 
                ata@3a00 {
                        device_type = "ata";
-                       compatible = "mpc5200b-ata\0mpc52xx-ata";
+                       compatible = "mpc5200b-ata\0mpc5200-ata";
                        reg = <3a00 100>;
                        interrupts = <2 7 0>;
                        interrupt-parent = <500>;
 
                i2c@3d00 {
                        device_type = "i2c";
-                       compatible = "mpc5200b-i2c\0mpc52xx-i2c";
+                       compatible = "mpc5200b-i2c\0mpc5200-i2c";
+                       cell-index = <0>;
                        reg = <3d00 40>;
                        interrupts = <2 f 0>;
                        interrupt-parent = <500>;
 
                i2c@3d40 {
                        device_type = "i2c";
-                       compatible = "mpc5200b-i2c\0mpc52xx-i2c";
+                       compatible = "mpc5200b-i2c\0mpc5200-i2c";
+                       cell-index = <1>;
                        reg = <3d40 40>;
                        interrupts = <2 10 0>;
                        interrupt-parent = <500>;
                };
                sram@8000 {
                        device_type = "sram";
-                       compatible = "mpc5200b-sram\0mpc52xx-sram\0sram";
+                       compatible = "mpc5200b-sram\0mpc5200-sram\0sram";
                        reg = <8000 4000>;
                };
        };
diff --git a/arch/powerpc/boot/dts/mpc8313erdb.dts b/arch/powerpc/boot/dts/mpc8313erdb.dts
new file mode 100644 (file)
index 0000000..3d2f5a0
--- /dev/null
@@ -0,0 +1,219 @@
+/*
+ * MPC8313E RDB Device Tree Source
+ *
+ * Copyright 2005, 2006, 2007 Freescale Semiconductor Inc.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+/ {
+       model = "MPC8313ERDB";
+       compatible = "MPC83xx";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       cpus {
+               #cpus = <1>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               PowerPC,8313@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       d-cache-line-size = <20>;       // 32 bytes
+                       i-cache-line-size = <20>;       // 32 bytes
+                       d-cache-size = <4000>;          // L1, 16K
+                       i-cache-size = <4000>;          // L1, 16K
+                       timebase-frequency = <0>;       // from bootloader
+                       bus-frequency = <0>;            // from bootloader
+                       clock-frequency = <0>;          // from bootloader
+                       32-bit;
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <00000000 08000000>;      // 128MB at 0
+       };
+
+       soc8313@e0000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               #interrupt-cells = <2>;
+               device_type = "soc";
+               ranges = <0 e0000000 00100000>;
+               reg = <e0000000 00000200>;
+               bus-frequency = <0>;
+
+               wdt@200 {
+                       device_type = "watchdog";
+                       compatible = "mpc83xx_wdt";
+                       reg = <200 100>;
+               };
+
+               i2c@3000 {
+                       device_type = "i2c";
+                       compatible = "fsl-i2c";
+                       reg = <3000 100>;
+                       interrupts = <e 8>;
+                       interrupt-parent = <700>;
+                       dfsrr;
+               };
+
+               i2c@3100 {
+                       device_type = "i2c";
+                       compatible = "fsl-i2c";
+                       reg = <3100 100>;
+                       interrupts = <f 8>;
+                       interrupt-parent = <700>;
+                       dfsrr;
+               };
+
+               spi@7000 {
+                       device_type = "spi";
+                       compatible = "mpc83xx_spi";
+                       reg = <7000 1000>;
+                       interrupts = <10 8>;
+                       interrupt-parent = <700>;
+                       mode = <0>;
+               };
+
+               /* phy type (ULPI, UTMI, UTMI_WIDE, SERIAL) */
+               usb@23000 {
+                       device_type = "usb";
+                       compatible = "fsl-usb2-dr";
+                       reg = <23000 1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       interrupt-parent = <700>;
+                       interrupts = <26 2>;
+                       phy_type = "utmi_wide";
+               };
+
+               mdio@24520 {
+                       device_type = "mdio";
+                       compatible = "gianfar";
+                       reg = <24520 20>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       linux,phandle = <24520>;
+                       ethernet-phy@1 {
+                               linux,phandle = <2452001>;
+                               interrupt-parent = <700>;
+                               interrupts = <13 2>;
+                               reg = <1>;
+                               device_type = "ethernet-phy";
+                       };
+                       ethernet-phy@4 {
+                               linux,phandle = <2452004>;
+                               interrupt-parent = <700>;
+                               interrupts = <14 2>;
+                               reg = <4>;
+                               device_type = "ethernet-phy";
+                       };
+               };
+
+               ethernet@24000 {
+                       device_type = "network";
+                       model = "eTSEC";
+                       compatible = "gianfar";
+                       reg = <24000 1000>;
+                       local-mac-address = [ 00 00 00 00 00 00 ];
+                       interrupts = <25 8 24 8 23 8>;
+                       interrupt-parent = <700>;
+                       phy-handle = <2452001>;
+               };
+
+               ethernet@25000 {
+                       device_type = "network";
+                       model = "eTSEC";
+                       compatible = "gianfar";
+                       reg = <25000 1000>;
+                       local-mac-address = [ 00 00 00 00 00 00 ];
+                       interrupts = <22 8 21 8 20 8>;
+                       interrupt-parent = <700>;
+                       phy-handle = <2452004>;
+               };
+
+               serial@4500 {
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <4500 100>;
+                       clock-frequency = <0>;
+                       interrupts = <9 8>;
+                       interrupt-parent = <700>;
+               };
+
+               serial@4600 {
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <4600 100>;
+                       clock-frequency = <0>;
+                       interrupts = <a 8>;
+                       interrupt-parent = <700>;
+               };
+
+               pci@8500 {
+                       interrupt-map-mask = <f800 0 0 7>;
+                       interrupt-map = <
+
+                                       /* IDSEL 0x0E -mini PCI */
+                                        7000 0 0 1 700 12 8
+                                        7000 0 0 2 700 12 8
+                                        7000 0 0 3 700 12 8
+                                        7000 0 0 4 700 12 8
+
+                                       /* IDSEL 0x0F - PCI slot */
+                                        7800 0 0 1 700 11 8
+                                        7800 0 0 2 700 12 8
+                                        7800 0 0 3 700 11 8
+                                        7800 0 0 4 700 12 8>;
+                       interrupt-parent = <700>;
+                       interrupts = <42 8>;
+                       bus-range = <0 0>;
+                       ranges = <02000000 0 90000000 90000000 0 10000000
+                                 42000000 0 80000000 80000000 0 10000000
+                                 01000000 0 00000000 e2000000 0 00100000>;
+                       clock-frequency = <3f940aa>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       reg = <8500 100>;
+                       compatible = "83xx";
+                       device_type = "pci";
+               };
+
+               crypto@30000 {
+                       device_type = "crypto";
+                       model = "SEC2";
+                       compatible = "talitos";
+                       reg = <30000 7000>;
+                       interrupts = <b 8>;
+                       interrupt-parent = <700>;
+                       /* Rev. 2.2 */
+                       num-channels = <1>;
+                       channel-fifo-len = <18>;
+                       exec-units-mask = <0000004c>;
+                       descriptor-types-mask = <0122003f>;
+               };
+
+               /* IPIC
+                * interrupts cell = <intr #, sense>
+                * sense values match linux IORESOURCE_IRQ_* defines:
+                * sense == 8: Level, low assertion
+                * sense == 2: Edge, high-to-low change
+                */
+               pic@700 {
+                       linux,phandle = <700>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       reg = <700 100>;
+                       built-in;
+                       device_type = "ipic";
+               };
+       };
+};
diff --git a/arch/powerpc/boot/dts/mpc8349emitxgp.dts b/arch/powerpc/boot/dts/mpc8349emitxgp.dts
new file mode 100644 (file)
index 0000000..3190774
--- /dev/null
@@ -0,0 +1,187 @@
+/*
+ * MPC8349E-mITX-GP Device Tree Source
+ *
+ * Copyright 2007 Freescale Semiconductor Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ */
+/ {
+       model = "MPC8349EMITXGP";
+       compatible = "MPC834xMITXGP";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       cpus {
+               #cpus = <1>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               PowerPC,8349@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       d-cache-line-size = <20>;
+                       i-cache-line-size = <20>;
+                       d-cache-size = <8000>;
+                       i-cache-size = <8000>;
+                       timebase-frequency = <0>;       // from bootloader
+                       bus-frequency = <0>;            // from bootloader
+                       clock-frequency = <0>;          // from bootloader
+                       32-bit;
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               reg = <00000000 10000000>;
+       };
+
+       soc8349@e0000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               #interrupt-cells = <2>;
+               device_type = "soc";
+               ranges = <0 e0000000 00100000>;
+               reg = <e0000000 00000200>;
+               bus-frequency = <0>;                    // from bootloader
+
+               wdt@200 {
+                       device_type = "watchdog";
+                       compatible = "mpc83xx_wdt";
+                       reg = <200 100>;
+               };
+
+               i2c@3000 {
+                       device_type = "i2c";
+                       compatible = "fsl-i2c";
+                       reg = <3000 100>;
+                       interrupts = <e 8>;
+                       interrupt-parent = <700>;
+                       dfsrr;
+               };
+
+               i2c@3100 {
+                       device_type = "i2c";
+                       compatible = "fsl-i2c";
+                       reg = <3100 100>;
+                       interrupts = <f 8>;
+                       interrupt-parent = <700>;
+                       dfsrr;
+               };
+
+               spi@7000 {
+                       device_type = "spi";
+                       compatible = "mpc83xx_spi";
+                       reg = <7000 1000>;
+                       interrupts = <10 8>;
+                       interrupt-parent = <700>;
+                       mode = <0>;
+               };
+
+               usb@23000 {
+                       device_type = "usb";
+                       compatible = "fsl-usb2-dr";
+                       reg = <23000 1000>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       interrupt-parent = <700>;
+                       interrupts = <26 2>;
+                       dr_mode = "otg";
+                       phy_type = "ulpi";
+               };
+
+               mdio@24520 {
+                       device_type = "mdio";
+                       compatible = "gianfar";
+                       reg = <24520 20>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       linux,phandle = <24520>;
+
+                       /* Vitesse 8201 */
+                       ethernet-phy@1c {
+                               linux,phandle = <245201c>;
+                               interrupt-parent = <700>;
+                               interrupts = <12 2>;
+                               reg = <1c>;
+                               device_type = "ethernet-phy";
+                       };
+               };
+
+               ethernet@24000 {
+                       device_type = "network";
+                       model = "TSEC";
+                       compatible = "gianfar";
+                       reg = <24000 1000>;
+                       local-mac-address = [ 00 00 00 00 00 00 ];
+                       interrupts = <20 8 21 8 22 8>;
+                       interrupt-parent = <700>;
+                       phy-handle = <245201c>;
+               };
+
+               serial@4500 {
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <4500 100>;
+                       clock-frequency = <0>;          // from bootloader
+                       interrupts = <9 8>;
+                       interrupt-parent = <700>;
+               };
+
+               serial@4600 {
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <4600 100>;
+                       clock-frequency = <0>;          // from bootloader
+                       interrupts = <a 8>;
+                       interrupt-parent = <700>;
+               };
+
+               pci@8600 {
+                       interrupt-map-mask = <f800 0 0 7>;
+                       interrupt-map = <
+                                       /* IDSEL 0x0F - PCI Slot */
+                                       7800 0 0 1 700 14 8 /* PCI_INTA */
+                                       7800 0 0 2 700 15 8 /* PCI_INTB */
+                                        >;
+                       interrupt-parent = <700>;
+                       interrupts = <43 8>;
+                       bus-range = <1 1>;
+                       ranges = <42000000 0 a0000000 a0000000 0 10000000
+                                 02000000 0 b0000000 b0000000 0 10000000
+                                 01000000 0 00000000 e3000000 0 01000000>;
+                       clock-frequency = <3f940aa>;
+                       #interrupt-cells = <1>;
+                       #size-cells = <2>;
+                       #address-cells = <3>;
+                       reg = <8600 100>;
+                       compatible = "83xx";
+                       device_type = "pci";
+               };
+
+               crypto@30000 {
+                       device_type = "crypto";
+                       model = "SEC2";
+                       compatible = "talitos";
+                       reg = <30000 10000>;
+                       interrupts = <b 8>;
+                       interrupt-parent = <700>;
+                       num-channels = <4>;
+                       channel-fifo-len = <18>;
+                       exec-units-mask = <0000007e>;
+                       descriptor-types-mask = <01010ebf>;
+               };
+
+               pic@700 {
+                       linux,phandle = <700>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       reg = <700 100>;
+                       built-in;
+                       device_type = "ipic";
+               };
+       };
+};
similarity index 98%
rename from arch/powerpc/boot/dts/mpc8349emds.dts
rename to arch/powerpc/boot/dts/mpc834x_mds.dts
index efceb34326535a1630b49ed5218e06cc764364c6..dc121b3cb4a9654a9b6bf48355989651f34b3767 100644 (file)
                reg = <00000000 10000000>;      // 256MB at 0
        };
 
+       bcsr@e2400000 {
+               device_type = "board-control";
+               reg = <e2400000 8000>;
+       };
+
        soc8349@e0000000 {
                #address-cells = <1>;
                #size-cells = <1>;
                        #size-cells = <0>;
                        interrupt-parent = <700>;
                        interrupts = <26 2>;
+                       dr_mode = "otg";
                        phy_type = "ulpi";
                };
 
diff --git a/arch/powerpc/boot/dts/mpc8568mds.dts b/arch/powerpc/boot/dts/mpc8568mds.dts
new file mode 100644 (file)
index 0000000..06d2465
--- /dev/null
@@ -0,0 +1,380 @@
+/*
+ * MPC8568E MDS Device Tree Source
+ *
+ * Copyright 2007 Freescale Semiconductor Inc.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+
+/*
+/memreserve/   00000000 1000000;
+*/
+
+/ {
+       model = "MPC8568EMDS";
+       compatible = "MPC85xxMDS";
+       #address-cells = <1>;
+       #size-cells = <1>;
+       linux,phandle = <100>;
+
+       cpus {
+               #cpus = <1>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               linux,phandle = <200>;
+
+               PowerPC,8568@0 {
+                       device_type = "cpu";
+                       reg = <0>;
+                       d-cache-line-size = <20>;       // 32 bytes
+                       i-cache-line-size = <20>;       // 32 bytes
+                       d-cache-size = <8000>;          // L1, 32K
+                       i-cache-size = <8000>;          // L1, 32K
+                       timebase-frequency = <0>;
+                       bus-frequency = <0>;
+                       clock-frequency = <0>;
+                       32-bit;
+                       linux,phandle = <201>;
+               };
+       };
+
+       memory {
+               device_type = "memory";
+               linux,phandle = <300>;
+               reg = <00000000 10000000>;
+       };
+
+       bcsr@f8000000 {
+               device_type = "board-control";
+               reg = <f8000000 8000>;
+       };
+
+       soc8568@e0000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               #interrupt-cells = <2>;
+               device_type = "soc";
+               ranges = <0 e0000000 00100000>;
+               reg = <e0000000 00100000>;
+               bus-frequency = <0>;
+
+               i2c@3000 {
+                       device_type = "i2c";
+                       compatible = "fsl-i2c";
+                       reg = <3000 100>;
+                       interrupts = <1b 2>;
+                       interrupt-parent = <40000>;
+                       dfsrr;
+               };
+
+               i2c@3100 {
+                       device_type = "i2c";
+                       compatible = "fsl-i2c";
+                       reg = <3100 100>;
+                       interrupts = <1b 2>;
+                       interrupt-parent = <40000>;
+                       dfsrr;
+               };
+
+               mdio@24520 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       device_type = "mdio";
+                       compatible = "gianfar";
+                       reg = <24520 20>;
+                       linux,phandle = <24520>;
+                       ethernet-phy@0 {
+                               linux,phandle = <2452000>;
+                               interrupt-parent = <40000>;
+                               interrupts = <31 1>;
+                               reg = <0>;
+                               device_type = "ethernet-phy";
+                       };
+                       ethernet-phy@1 {
+                               linux,phandle = <2452001>;
+                               interrupt-parent = <40000>;
+                               interrupts = <32 1>;
+                               reg = <1>;
+                               device_type = "ethernet-phy";
+                       };
+
+                       ethernet-phy@2 {
+                               linux,phandle = <2452002>;
+                               interrupt-parent = <40000>;
+                               interrupts = <31 1>;
+                               reg = <2>;
+                               device_type = "ethernet-phy";
+                       };
+                       ethernet-phy@3 {
+                               linux,phandle = <2452003>;
+                               interrupt-parent = <40000>;
+                               interrupts = <32 1>;
+                               reg = <3>;
+                               device_type = "ethernet-phy";
+                       };
+               };
+
+               ethernet@24000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       device_type = "network";
+                       model = "eTSEC";
+                       compatible = "gianfar";
+                       reg = <24000 1000>;
+                       mac-address = [ 00 00 00 00 00 00 ];
+                       interrupts = <d 2 e 2 12 2>;
+                       interrupt-parent = <40000>;
+                       phy-handle = <2452002>;
+               };
+
+               ethernet@25000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       device_type = "network";
+                       model = "eTSEC";
+                       compatible = "gianfar";
+                       reg = <25000 1000>;
+                       mac-address = [ 00 00 00 00 00 00];
+                       interrupts = <13 2 14 2 18 2>;
+                       interrupt-parent = <40000>;
+                       phy-handle = <2452003>;
+               };
+
+               serial@4500 {
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <4500 100>;
+                       clock-frequency = <0>;
+                       interrupts = <1a 2>;
+                       interrupt-parent = <40000>;
+               };
+
+               serial@4600 {
+                       device_type = "serial";
+                       compatible = "ns16550";
+                       reg = <4600 100>;
+                       clock-frequency = <0>;
+                       interrupts = <1a 2>;
+                       interrupt-parent = <40000>;
+               };
+
+               crypto@30000 {
+                       device_type = "crypto";
+                       model = "SEC2";
+                       compatible = "talitos";
+                       reg = <30000 f000>;
+                       interrupts = <1d 2>;
+                       interrupt-parent = <40000>;
+                       num-channels = <4>;
+                       channel-fifo-len = <18>;
+                       exec-units-mask = <000000fe>;
+                       descriptor-types-mask = <012b0ebf>;
+               };
+
+               pic@40000 {
+                       linux,phandle = <40000>;
+                       clock-frequency = <0>;
+                       interrupt-controller;
+                       #address-cells = <0>;
+                       #interrupt-cells = <2>;
+                       reg = <40000 40000>;
+                       built-in;
+                       compatible = "chrp,open-pic";
+                       device_type = "open-pic";
+                        big-endian;
+               };
+               par_io@e0100 {
+                       reg = <e0100 100>;
+                       device_type = "par_io";
+                       num-ports = <7>;
+
+                       ucc_pin@01 {
+                               linux,phandle = <e010001>;
+                               pio-map = <
+                       /* port  pin  dir  open_drain  assignment  has_irq */
+                                       4  0a  1  0  2  0       /* TxD0 */
+                                       4  09  1  0  2  0       /* TxD1 */
+                                       4  08  1  0  2  0       /* TxD2 */
+                                       4  07  1  0  2  0       /* TxD3 */
+                                       4  17  1  0  2  0       /* TxD4 */
+                                       4  16  1  0  2  0       /* TxD5 */
+                                       4  15  1  0  2  0       /* TxD6 */
+                                       4  14  1  0  2  0       /* TxD7 */
+                                       4  0f  2  0  2  0       /* RxD0 */
+                                       4  0e  2  0  2  0       /* RxD1 */
+                                       4  0d  2  0  2  0       /* RxD2 */
+                                       4  0c  2  0  2  0       /* RxD3 */
+                                       4  1d  2  0  2  0       /* RxD4 */
+                                       4  1c  2  0  2  0       /* RxD5 */
+                                       4  1b  2  0  2  0       /* RxD6 */
+                                       4  1a  2  0  2  0       /* RxD7 */
+                                       4  0b  1  0  2  0       /* TX_EN */
+                                       4  18  1  0  2  0       /* TX_ER */
+                                       4  0f  2  0  2  0       /* RX_DV */
+                                       4  1e  2  0  2  0       /* RX_ER */
+                                       4  11  2  0  2  0       /* RX_CLK */
+                                       4  13  1  0  2  0       /* GTX_CLK */
+                                       1  1f  2  0  3  0>;     /* GTX125 */
+                       };
+                       ucc_pin@02 {
+                               linux,phandle = <e010002>;
+                               pio-map = <
+                       /* port  pin  dir  open_drain  assignment  has_irq */
+                                       5  0a 1  0  2  0   /* TxD0 */
+                                       5  09 1  0  2  0   /* TxD1 */
+                                       5  08 1  0  2  0   /* TxD2 */
+                                       5  07 1  0  2  0   /* TxD3 */
+                                       5  17 1  0  2  0   /* TxD4 */
+                                       5  16 1  0  2  0   /* TxD5 */
+                                       5  15 1  0  2  0   /* TxD6 */
+                                       5  14 1  0  2  0   /* TxD7 */
+                                       5  0f 2  0  2  0   /* RxD0 */
+                                       5  0e 2  0  2  0   /* RxD1 */
+                                       5  0d 2  0  2  0   /* RxD2 */
+                                       5  0c 2  0  2  0   /* RxD3 */
+                                       5  1d 2  0  2  0   /* RxD4 */
+                                       5  1c 2  0  2  0   /* RxD5 */
+                                       5  1b 2  0  2  0   /* RxD6 */
+                                       5  1a 2  0  2  0   /* RxD7 */
+                                       5  0b 1  0  2  0   /* TX_EN */
+                                       5  18 1  0  2  0   /* TX_ER */
+                                       5  10 2  0  2  0   /* RX_DV */
+                                       5  1e 2  0  2  0   /* RX_ER */
+                                       5  11 2  0  2  0   /* RX_CLK */
+                                       5  13 1  0  2  0   /* GTX_CLK */
+                                       1  1f 2  0  3  0   /* GTX125 */
+                                       4  06 3  0  2  0   /* MDIO */
+                                       4  05 1  0  2  0>; /* MDC */
+                       };
+               };
+       };
+
+       qe@e0080000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               device_type = "qe";
+               model = "QE";
+               ranges = <0 e0080000 00040000>;
+               reg = <e0080000 480>;
+               brg-frequency = <0>;
+               bus-frequency = <179A7B00>;
+
+               muram@10000 {
+                       device_type = "muram";
+                       ranges = <0 00010000 0000c000>;
+
+                       data-only@0{
+                               reg = <0 c000>;
+                       };
+               };
+
+               spi@4c0 {
+                       device_type = "spi";
+                       compatible = "fsl_spi";
+                       reg = <4c0 40>;
+                       interrupts = <2>;
+                       interrupt-parent = <80>;
+                       mode = "cpu";
+               };
+
+               spi@500 {
+                       device_type = "spi";
+                       compatible = "fsl_spi";
+                       reg = <500 40>;
+                       interrupts = <1>;
+                       interrupt-parent = <80>;
+                       mode = "cpu";
+               };
+
+               ucc@2000 {
+                       device_type = "network";
+                       compatible = "ucc_geth";
+                       model = "UCC";
+                       device-id = <1>;
+                       reg = <2000 200>;
+                       interrupts = <20>;
+                       interrupt-parent = <80>;
+                       mac-address = [ 00 04 9f 00 23 23 ];
+                       rx-clock = <0>;
+                       tx-clock = <19>;
+                       phy-handle = <212000>;
+                       pio-handle = <e010001>;
+               };
+
+               ucc@3000 {
+                       device_type = "network";
+                       compatible = "ucc_geth";
+                       model = "UCC";
+                       device-id = <2>;
+                       reg = <3000 200>;
+                       interrupts = <21>;
+                       interrupt-parent = <80>;
+                       mac-address = [ 00 11 22 33 44 55 ];
+                       rx-clock = <0>;
+                       tx-clock = <14>;
+                       phy-handle = <212001>;
+                       pio-handle = <e010002>;
+               };
+
+               mdio@2120 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       reg = <2120 18>;
+                       device_type = "mdio";
+                       compatible = "ucc_geth_phy";
+
+                       /* These are the same PHYs as on
+                        * gianfar's MDIO bus */
+                       ethernet-phy@00 {
+                               linux,phandle = <212000>;
+                               interrupt-parent = <40000>;
+                               interrupts = <31 1>;
+                               reg = <0>;
+                               device_type = "ethernet-phy";
+                               interface = <6>; //ENET_1000_GMII
+                       };
+                       ethernet-phy@01 {
+                               linux,phandle = <212001>;
+                               interrupt-parent = <40000>;
+                               interrupts = <32 1>;
+                               reg = <1>;
+                               device_type = "ethernet-phy";
+                               interface = <6>;
+                       };
+                       ethernet-phy@02 {
+                               linux,phandle = <212002>;
+                               interrupt-parent = <40000>;
+                               interrupts = <31 1>;
+                               reg = <2>;
+                               device_type = "ethernet-phy";
+                               interface = <6>; //ENET_1000_GMII
+                       };
+                       ethernet-phy@03 {
+                               linux,phandle = <212003>;
+                               interrupt-parent = <40000>;
+                               interrupts = <32 1>;
+                               reg = <3>;
+                               device_type = "ethernet-phy";
+                               interface = <6>; //ENET_1000_GMII
+                       };
+               };
+
+               qeic@80 {
+                       linux,phandle = <80>;
+                       interrupt-controller;
+                       device_type = "qeic";
+                       #address-cells = <0>;
+                       #interrupt-cells = <1>;
+                       reg = <80 80>;
+                       built-in;
+                       big-endian;
+                       interrupts = <1e 2 1e 2>; //high:30 low:30
+                       interrupt-parent = <40000>;
+               };
+
+       };
+};
index 405c1c908213d0215ed9178c4f76ce7a19c3b53b..dde66a597a8d90e4f8ac1596425847ec15d9785d 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20-rc5
-# Mon Jan 22 22:17:58 2007
+# Linux kernel version: 2.6.20-rc6
+# Sun Jan 28 23:13:56 2007
 #
 # CONFIG_PPC64 is not set
 CONFIG_PPC32=y
@@ -58,7 +58,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
 #
 # General setup
 #
-CONFIG_LOCALVERSION="-kuroboxHG"
+CONFIG_LOCALVERSION=""
 CONFIG_LOCALVERSION_AUTO=y
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
@@ -206,7 +206,7 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_PROC_DEVICETREE=y
 # CONFIG_CMDLINE_BOOL is not set
 # CONFIG_PM is not set
-# CONFIG_SECCOMP is not set
+CONFIG_SECCOMP=y
 CONFIG_ISA_DMA_API=y
 
 #
@@ -312,39 +312,40 @@ CONFIG_NF_CONNTRACK=m
 # CONFIG_NF_CT_ACCT is not set
 # CONFIG_NF_CONNTRACK_MARK is not set
 # CONFIG_NF_CONNTRACK_EVENTS is not set
-# CONFIG_NF_CT_PROTO_SCTP is not set
-# CONFIG_NF_CONNTRACK_AMANDA is not set
+CONFIG_NF_CT_PROTO_GRE=m
+CONFIG_NF_CT_PROTO_SCTP=m
+CONFIG_NF_CONNTRACK_AMANDA=m
 CONFIG_NF_CONNTRACK_FTP=m
-# CONFIG_NF_CONNTRACK_H323 is not set
+CONFIG_NF_CONNTRACK_H323=m
 CONFIG_NF_CONNTRACK_IRC=m
-# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set
-# CONFIG_NF_CONNTRACK_PPTP is not set
-# CONFIG_NF_CONNTRACK_SIP is not set
+CONFIG_NF_CONNTRACK_NETBIOS_NS=m
+CONFIG_NF_CONNTRACK_PPTP=m
+CONFIG_NF_CONNTRACK_SIP=m
 CONFIG_NF_CONNTRACK_TFTP=m
 CONFIG_NETFILTER_XTABLES=m
-CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
+# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set
 # CONFIG_NETFILTER_XT_TARGET_DSCP is not set
-CONFIG_NETFILTER_XT_TARGET_MARK=m
+# CONFIG_NETFILTER_XT_TARGET_MARK is not set
 # CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set
-CONFIG_NETFILTER_XT_TARGET_NFLOG=m
+# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set
 # CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set
 # CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
-CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
+# CONFIG_NETFILTER_XT_MATCH_CONNTRACK is not set
 # CONFIG_NETFILTER_XT_MATCH_DCCP is not set
 # CONFIG_NETFILTER_XT_MATCH_DSCP is not set
-CONFIG_NETFILTER_XT_MATCH_ESP=m
-CONFIG_NETFILTER_XT_MATCH_HELPER=m
-CONFIG_NETFILTER_XT_MATCH_LENGTH=m
-CONFIG_NETFILTER_XT_MATCH_LIMIT=m
+# CONFIG_NETFILTER_XT_MATCH_ESP is not set
+# CONFIG_NETFILTER_XT_MATCH_HELPER is not set
+# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set
+# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set
 CONFIG_NETFILTER_XT_MATCH_MAC=m
-CONFIG_NETFILTER_XT_MATCH_MARK=m
+# CONFIG_NETFILTER_XT_MATCH_MARK is not set
 # CONFIG_NETFILTER_XT_MATCH_POLICY is not set
-CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
+# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
 CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
 # CONFIG_NETFILTER_XT_MATCH_QUOTA is not set
 # CONFIG_NETFILTER_XT_MATCH_REALM is not set
 # CONFIG_NETFILTER_XT_MATCH_SCTP is not set
-# CONFIG_NETFILTER_XT_MATCH_STATE is not set
+CONFIG_NETFILTER_XT_MATCH_STATE=m
 # CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set
 # CONFIG_NETFILTER_XT_MATCH_STRING is not set
 # CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set
@@ -359,12 +360,12 @@ CONFIG_NF_CONNTRACK_PROC_COMPAT=y
 CONFIG_IP_NF_IPTABLES=m
 CONFIG_IP_NF_MATCH_IPRANGE=m
 # CONFIG_IP_NF_MATCH_TOS is not set
-# CONFIG_IP_NF_MATCH_RECENT is not set
+CONFIG_IP_NF_MATCH_RECENT=m
 # CONFIG_IP_NF_MATCH_ECN is not set
 # CONFIG_IP_NF_MATCH_AH is not set
 # CONFIG_IP_NF_MATCH_TTL is not set
-# CONFIG_IP_NF_MATCH_OWNER is not set
-# CONFIG_IP_NF_MATCH_ADDRTYPE is not set
+CONFIG_IP_NF_MATCH_OWNER=m
+CONFIG_IP_NF_MATCH_ADDRTYPE=m
 CONFIG_IP_NF_FILTER=m
 CONFIG_IP_NF_TARGET_REJECT=m
 # CONFIG_IP_NF_TARGET_LOG is not set
@@ -374,16 +375,17 @@ CONFIG_NF_NAT=m
 CONFIG_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_TARGET_NETMAP is not set
+# CONFIG_IP_NF_TARGET_SAME is not set
 # CONFIG_NF_NAT_SNMP_BASIC is not set
+CONFIG_NF_NAT_PROTO_GRE=m
 CONFIG_NF_NAT_FTP=m
 CONFIG_NF_NAT_IRC=m
 CONFIG_NF_NAT_TFTP=m
-# CONFIG_NF_NAT_AMANDA is not set
-# CONFIG_NF_NAT_PPTP is not set
-# CONFIG_NF_NAT_H323 is not set
-# CONFIG_NF_NAT_SIP is not set
+CONFIG_NF_NAT_AMANDA=m
+CONFIG_NF_NAT_PPTP=m
+CONFIG_NF_NAT_H323=m
+CONFIG_NF_NAT_SIP=m
 CONFIG_IP_NF_MANGLE=m
 CONFIG_IP_NF_TARGET_TOS=m
 CONFIG_IP_NF_TARGET_ECN=m
@@ -472,6 +474,7 @@ CONFIG_MTD_PARTITIONS=y
 # User Modules And Translation Layers
 #
 CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
 CONFIG_MTD_BLOCK=y
 # CONFIG_FTL is not set
 # CONFIG_NFTL is not set
@@ -518,6 +521,7 @@ CONFIG_MTD_PHYSMAP=y
 CONFIG_MTD_PHYSMAP_START=0xffc00000
 CONFIG_MTD_PHYSMAP_LEN=0x400000
 CONFIG_MTD_PHYSMAP_BANKWIDTH=1
+# CONFIG_MTD_PHYSMAP_OF is not set
 # CONFIG_MTD_PLATRAM is not set
 
 #
@@ -540,6 +544,7 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=1
 # NAND Flash Device Drivers
 #
 # CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_CAFE is not set
 
 #
 # OneNAND Flash Device Drivers
@@ -696,7 +701,7 @@ CONFIG_ATA=y
 # CONFIG_PATA_HPT37X is not set
 # CONFIG_PATA_HPT3X2N is not set
 # CONFIG_PATA_HPT3X3 is not set
-# CONFIG_PATA_IT821X is not set
+CONFIG_PATA_IT821X=y
 # CONFIG_PATA_JMICRON is not set
 # CONFIG_PATA_TRIFLEX is not set
 # CONFIG_PATA_MARVELL is not set
@@ -763,11 +768,33 @@ CONFIG_TUN=m
 #
 # PHY device support
 #
+# CONFIG_PHYLIB is not set
 
 #
 # Ethernet (10 or 100Mbit)
 #
-# CONFIG_NET_ETHERNET is not set
+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
+
+#
+# Tulip family network device support
+#
+CONFIG_NET_TULIP=y
+# CONFIG_DE2104X is not set
+CONFIG_TULIP=y
+# CONFIG_TULIP_MWI is not set
+CONFIG_TULIP_MMIO=y
+# CONFIG_TULIP_NAPI is not set
+# CONFIG_DE4X5 is not set
+# CONFIG_WINBOND_840 is not set
+# CONFIG_DM9102 is not set
+# CONFIG_ULI526X is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_PCI is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -829,7 +856,8 @@ CONFIG_NET_RADIO=y
 # CONFIG_USB_ZD1201 is not set
 # CONFIG_HOSTAP is not set
 # CONFIG_BCM43XX is not set
-# CONFIG_ZD1211RW is not set
+CONFIG_ZD1211RW=m
+# CONFIG_ZD1211RW_DEBUG is not set
 CONFIG_NET_WIRELESS=y
 
 #
@@ -1098,7 +1126,7 @@ CONFIG_DUMMY_CONSOLE=y
 #
 # HID Devices
 #
-CONFIG_HID=y
+CONFIG_HID=m
 
 #
 # USB support
@@ -1115,7 +1143,6 @@ CONFIG_USB=y
 CONFIG_USB_DEVICEFS=y
 # CONFIG_USB_BANDWIDTH is not set
 # CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_MULTITHREAD_PROBE is not set
 # CONFIG_USB_OTG is not set
 
 #
@@ -1136,7 +1163,7 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 # USB Device Class drivers
 #
 # CONFIG_USB_ACM is not set
-# CONFIG_USB_PRINTER is not set
+CONFIG_USB_PRINTER=m
 
 #
 # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
@@ -1371,7 +1398,11 @@ 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_XFS_FS=m
+# CONFIG_XFS_QUOTA is not set
+# CONFIG_XFS_SECURITY is not set
+# CONFIG_XFS_POSIX_ACL is not set
+# CONFIG_XFS_RT is not set
 # CONFIG_GFS2_FS is not set
 # CONFIG_OCFS2_FS is not set
 # CONFIG_MINIX_FS is not set
@@ -1461,7 +1492,12 @@ 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_CIFS=m
+# CONFIG_CIFS_STATS is not set
+# CONFIG_CIFS_WEAK_PW_HASH is not set
+# CONFIG_CIFS_XATTR is not set
+# CONFIG_CIFS_DEBUG2 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
@@ -1495,7 +1531,7 @@ CONFIG_NLS_CODEPAGE_437=m
 # 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_932=m
 # CONFIG_NLS_CODEPAGE_949 is not set
 # CONFIG_NLS_CODEPAGE_874 is not set
 # CONFIG_NLS_ISO8859_8 is not set
@@ -1526,12 +1562,14 @@ CONFIG_NLS_UTF8=m
 # Library routines
 #
 CONFIG_BITREVERSE=y
-# CONFIG_CRC_CCITT is not set
+CONFIG_CRC_CCITT=m
 # CONFIG_CRC16 is not set
 CONFIG_CRC32=y
 CONFIG_LIBCRC32C=m
 CONFIG_ZLIB_INFLATE=m
 CONFIG_ZLIB_DEFLATE=m
+CONFIG_TEXTSEARCH=y
+CONFIG_TEXTSEARCH_KMP=m
 CONFIG_PLIST=y
 CONFIG_IOMAP_COPY=y
 
diff --git a/arch/powerpc/configs/mpc8313_rdb_defconfig b/arch/powerpc/configs/mpc8313_rdb_defconfig
new file mode 100644 (file)
index 0000000..f875237
--- /dev/null
@@ -0,0 +1,1409 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.20
+# Wed Feb  7 22:08:04 2007
+#
+# CONFIG_PPC64 is not set
+CONFIG_PPC32=y
+CONFIG_PPC_MERGE=y
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_IRQ_PER_CPU=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_ILOG2_U32=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_PPC=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_GENERIC_NVRAM=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_PPC_OF=y
+CONFIG_PPC_UDBG_16550=y
+# CONFIG_GENERIC_TBSYNC is not set
+CONFIG_AUDIT_ARCH=y
+CONFIG_GENERIC_BUG=y
+CONFIG_DEFAULT_UIMAGE=y
+
+#
+# Processor support
+#
+# CONFIG_CLASSIC32 is not set
+# CONFIG_PPC_82xx is not set
+CONFIG_PPC_83xx=y
+# CONFIG_PPC_85xx is not set
+# CONFIG_PPC_86xx is not set
+# CONFIG_PPC_8xx is not set
+# CONFIG_40x is not set
+# CONFIG_44x is not set
+# CONFIG_E200 is not set
+CONFIG_6xx=y
+CONFIG_83xx=y
+CONFIG_PPC_FPU=y
+# CONFIG_PPC_DCR_NATIVE is not set
+# CONFIG_PPC_DCR_MMIO is not set
+CONFIG_PPC_STD_MMU=y
+CONFIG_PPC_STD_MMU_32=y
+# CONFIG_SMP is not set
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
+# CONFIG_KALLSYMS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+# CONFIG_EPOLL is not set
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+# CONFIG_KMOD is not set
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF 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_PPC_GEN550=y
+# CONFIG_WANT_EARLY_SERIAL is not set
+
+#
+# Platform support
+#
+CONFIG_MPC8313_RDB=y
+# CONFIG_MPC832x_MDS is not set
+# CONFIG_MPC834x_SYS is not set
+# CONFIG_MPC834x_ITX is not set
+# CONFIG_MPC8360E_PB is not set
+CONFIG_PPC_MPC831x=y
+# CONFIG_MPIC is not set
+
+#
+# Kernel options
+#
+# CONFIG_HIGHMEM is not set
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
+# 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_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_POPULATES_NODE_MAP=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_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT 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
+#
+CONFIG_GENERIC_ISA_DMA=y
+# CONFIG_MPIC_WEIRD is not set
+# CONFIG_PPC_I8259 is not set
+CONFIG_PPC_INDIRECT_PCI=y
+CONFIG_FSL_SOC=y
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+# CONFIG_PCIEPORTBUS is not set
+# CONFIG_PCI_DEBUG is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# Advanced setup
+#
+# CONFIG_ADVANCED_OPTIONS is not set
+
+#
+# Default settings for advanced configuration options are used
+#
+CONFIG_HIGHMEM_START=0xfe000000
+CONFIG_LOWMEM_SIZE=0x30000000
+CONFIG_KERNEL_START=0xc0000000
+CONFIG_TASK_SIZE=0x80000000
+CONFIG_BOOT_LOAD=0x00800000
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY 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=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+# 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=y
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK 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
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC 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_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED 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
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+# CONFIG_MTD_BLKDEVS is not set
+# CONFIG_MTD_BLOCK is not set
+# CONFIG_MTD_BLOCK_RO is not set
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+CONFIG_MTD_CFI_AMDSTD=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_PHYSMAP_START=0xfe000000
+CONFIG_MTD_PHYSMAP_LEN=0x1000000
+CONFIG_MTD_PHYSMAP_BANKWIDTH=2
+# CONFIG_MTD_PHYSMAP_OF is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_DATAFLASH is not set
+# CONFIG_MTD_M25P80 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_CAFE is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND 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 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=32768
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# Misc devices
+#
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE 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_TGT is not set
+# CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+# CONFIG_BLK_DEV_SD is not set
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_BLK_DEV_SR is not set
+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 is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+
+#
+# SCSI Transports
+#
+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
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# 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
+# 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_SCSI_AIC94XX is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_ARCMSR is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+# CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
+# CONFIG_SCSI_HPTIOP 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_STEX is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_QLA_FC is not set
+# CONFIG_SCSI_QLA_ISCSI is not set
+# CONFIG_SCSI_LPFC is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_DEBUG is not set
+# CONFIG_SCSI_SRP is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA 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 is not set
+# CONFIG_MD_RAID456 is not set
+# CONFIG_MD_MULTIPATH is not set
+# CONFIG_MD_FAULTY is not set
+# CONFIG_BLK_DEV_DM 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
+#
+# CONFIG_MAC_EMUMOUSEBTN is not set
+# CONFIG_WINDFARM is not set
+
+#
+# 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=y
+
+#
+# MII PHY device drivers
+#
+# CONFIG_MARVELL_PHY is not set
+# CONFIG_DAVICOM_PHY is not set
+# CONFIG_QSEMI_PHY is not set
+# CONFIG_LXT_PHY is not set
+CONFIG_CICADA_PHY=y
+# CONFIG_VITESSE_PHY is not set
+# CONFIG_SMSC_PHY is not set
+# CONFIG_BROADCOM_PHY is not set
+# CONFIG_FIXED_PHY 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 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_TLAN is not set
+# CONFIG_VIA_RHINE is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 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_SKY2 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_GIANFAR=y
+CONFIG_GFAR_NAPI=y
+# CONFIG_QLA3XXX is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC 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_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
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# Userland interfaces
+#
+# CONFIG_INPUT_MOUSEDEV is not set
+# 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 is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_PCI=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_UARTLITE is not set
+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=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+CONFIG_83xx_WDT=y
+
+#
+# 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_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER 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 is not set
+# 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_MPC=y
+# CONFIG_I2C_NFORCE2 is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_PROSAVAGE is not set
+# CONFIG_I2C_SAVAGE4 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_M41T00 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
+
+#
+# SPI support
+#
+CONFIG_SPI=y
+# CONFIG_SPI_DEBUG is not set
+CONFIG_SPI_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+CONFIG_SPI_BITBANG=y
+CONFIG_SPI_MPC83xx=y
+
+#
+# SPI Protocol Masters
+#
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_ADM1021 is not set
+# CONFIG_SENSORS_ADM1025 is not set
+# CONFIG_SENSORS_ADM1026 is not set
+# CONFIG_SENSORS_ADM1031 is not set
+# CONFIG_SENSORS_ADM9240 is not set
+# CONFIG_SENSORS_ASB100 is not set
+# CONFIG_SENSORS_ATXP1 is not set
+# CONFIG_SENSORS_DS1621 is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_FSCHER is not set
+# CONFIG_SENSORS_FSCPOS is not set
+# CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
+# CONFIG_SENSORS_IT87 is not set
+# CONFIG_SENSORS_LM63 is not set
+# CONFIG_SENSORS_LM70 is not set
+# CONFIG_SENSORS_LM75 is not set
+# CONFIG_SENSORS_LM77 is not set
+# CONFIG_SENSORS_LM78 is not set
+# CONFIG_SENSORS_LM80 is not set
+# CONFIG_SENSORS_LM83 is not set
+# CONFIG_SENSORS_LM85 is not set
+# CONFIG_SENSORS_LM87 is not set
+# CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
+# CONFIG_SENSORS_MAX1619 is not set
+# CONFIG_SENSORS_PC87360 is not set
+# CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_SIS5595 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47M192 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_VIA686A is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_VT8231 is not set
+# CONFIG_SENSORS_W83781D is not set
+# CONFIG_SENSORS_W83791D is not set
+# CONFIG_SENSORS_W83792D is not set
+# CONFIG_SENSORS_W83793 is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83627HF is not set
+# CONFIG_SENSORS_W83627EHF is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+# CONFIG_USB_DABUSB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=y
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_EHCI=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_EHCI_TT_NEWSCHED 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=y
+# CONFIG_USB_SL811_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# 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_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
+# CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_LIBUSUAL is not set
+
+#
+# USB Input Devices
+#
+# CONFIG_USB_HID is not set
+
+#
+# USB HID Boot Protocol drivers
+#
+# CONFIG_USB_KBD is not set
+# CONFIG_USB_MOUSE 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_TOUCHSCREEN is not set
+# CONFIG_USB_YEALINK is not set
+# CONFIG_USB_XPAD is not set
+# CONFIG_USB_ATI_REMOTE is not set
+# CONFIG_USB_ATI_REMOTE2 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 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_MII is not set
+# CONFIG_USB_USBNET is not set
+CONFIG_USB_MON=y
+
+#
+# USB port drivers
+#
+
+#
+# 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_ADUTUX 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_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_PHIDGET is not set
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_FTDI_ELAN is not set
+# CONFIG_USB_APPLEDISPLAY is not set
+# CONFIG_USB_SISUSBVGA is not set
+# CONFIG_USB_LD is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_TEST is not set
+
+#
+# USB DSL modem support
+#
+
+#
+# USB Gadget Support
+#
+CONFIG_USB_GADGET=y
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_SELECTED=y
+CONFIG_USB_GADGET_NET2280=y
+CONFIG_USB_NET2280=y
+# CONFIG_USB_GADGET_PXA2XX is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_AT91 is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+CONFIG_USB_GADGET_DUALSPEED=y
+# CONFIG_USB_ZERO is not set
+CONFIG_USB_ETH=y
+CONFIG_USB_ETH_RNDIS=y
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_FILE_STORAGE is not set
+# CONFIG_USB_G_SERIAL is not set
+# CONFIG_USB_MIDI_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+CONFIG_RTC_INTF_DEV_UIE_EMUL=y
+
+#
+# RTC drivers
+#
+# CONFIG_RTC_DRV_X1205 is not set
+CONFIG_RTC_DRV_DS1307=y
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_ISL1208 is not set
+# CONFIG_RTC_DRV_DS1672 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_PCF8563 is not set
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_RS5C348 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_TEST is not set
+# CONFIG_RTC_DRV_MAX6902 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# DMA Engine support
+#
+CONFIG_DMA_ENGINE=y
+
+#
+# DMA Clients
+#
+CONFIG_NET_DMA=y
+
+#
+# DMA Devices
+#
+CONFIG_INTEL_IOATDMA=y
+
+#
+# Virtualization
+#
+
+#
+# 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_EXT4DEV_FS 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 is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# 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_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_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_JFFS2_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=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+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_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 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_KARMA_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_PLIST=y
+CONFIG_IOMAP_COPY=y
+
+#
+# Instrumentation Support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_RWSEMS is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_DEBUG_STACKOVERFLOW is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUGGER is not set
+# CONFIG_BDI_SWITCH is not set
+# CONFIG_BOOTX_TEXT is not set
+# CONFIG_SERIAL_TEXT_DEBUG is not set
+# CONFIG_PPC_EARLY_DEBUG is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_MANAGER=y
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC 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_GF128MUL is not set
+# CONFIG_CRYPTO_ECB is not set
+CONFIG_CRYPTO_CBC=y
+# CONFIG_CRYPTO_LRW 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
+#
index 7902806429f8a7979206049c7c71e7345c0a7ce6..23d8964846e0bef598ed75abd3c3a20e98b0354a 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20-rc5
-# Fri Jan 26 00:19:02 2007
+# Linux kernel version: 2.6.20
+# Wed Feb  7 13:12:18 2007
 #
 # CONFIG_PPC64 is not set
 CONFIG_PPC32=y
@@ -34,9 +34,9 @@ CONFIG_DEFAULT_UIMAGE=y
 CONFIG_PPC_83xx=y
 # CONFIG_PPC_85xx is not set
 # CONFIG_PPC_86xx is not set
+# CONFIG_PPC_8xx is not set
 # CONFIG_40x is not set
 # CONFIG_44x is not set
-# CONFIG_8xx is not set
 # CONFIG_E200 is not set
 CONFIG_6xx=y
 CONFIG_83xx=y
@@ -178,7 +178,6 @@ CONFIG_FSL_SOC=y
 CONFIG_PCI=y
 CONFIG_PCI_DOMAINS=y
 # CONFIG_PCIEPORTBUS is not set
-# CONFIG_PCI_DEBUG is not set
 
 #
 # PCCARD (PCMCIA/CardBus) support
@@ -303,7 +302,6 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
 # CONFIG_FW_LOADER is not set
-# CONFIG_DEBUG_DRIVER is not set
 # CONFIG_SYS_HYPERVISOR is not set
 
 #
@@ -523,6 +521,7 @@ CONFIG_SCSI_SPI_ATTRS=y
 # Serial ATA (prod) and Parallel ATA (experimental) drivers
 #
 CONFIG_ATA=y
+# CONFIG_ATA_NONSTANDARD is not set
 # CONFIG_SATA_AHCI is not set
 # CONFIG_SATA_SVW is not set
 # CONFIG_ATA_PIIX is not set
@@ -647,37 +646,7 @@ CONFIG_CICADA_PHY=y
 #
 # 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 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_TLAN is not set
-# CONFIG_VIA_RHINE is not set
+# CONFIG_NET_ETHERNET is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -693,7 +662,6 @@ CONFIG_E100=y
 # CONFIG_SKGE is not set
 # CONFIG_SKY2 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_GIANFAR=y
@@ -746,26 +714,7 @@ CONFIG_GFAR_NAPI=y
 #
 # Input device support
 #
-CONFIG_INPUT=y
-# CONFIG_INPUT_FF_MEMLESS is not set
-
-#
-# Userland interfaces
-#
-# CONFIG_INPUT_MOUSEDEV is not set
-# 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
+# CONFIG_INPUT is not set
 
 #
 # Hardware I/O ports
@@ -784,7 +733,7 @@ CONFIG_INPUT=y
 #
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_PCI=y
+# CONFIG_SERIAL_8250_PCI is not set
 CONFIG_SERIAL_8250_NR_UARTS=4
 CONFIG_SERIAL_8250_RUNTIME_UARTS=4
 # CONFIG_SERIAL_8250_EXTENDED is not set
@@ -887,7 +836,7 @@ CONFIG_I2C_MPC=y
 # 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_PCF8574=y
 # CONFIG_SENSORS_PCA9539 is not set
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_M41T00 is not set
@@ -901,7 +850,6 @@ CONFIG_I2C_MPC=y
 # SPI support
 #
 CONFIG_SPI=y
-# CONFIG_SPI_DEBUG is not set
 CONFIG_SPI_MASTER=y
 
 #
@@ -922,52 +870,8 @@ CONFIG_SPI_MPC83xx=y
 #
 # Hardware Monitoring support
 #
-CONFIG_HWMON=y
+# CONFIG_HWMON is not set
 # CONFIG_HWMON_VID is not set
-# CONFIG_SENSORS_ABITUGURU is not set
-# CONFIG_SENSORS_ADM1021 is not set
-# CONFIG_SENSORS_ADM1025 is not set
-# CONFIG_SENSORS_ADM1026 is not set
-# CONFIG_SENSORS_ADM1031 is not set
-# CONFIG_SENSORS_ADM9240 is not set
-# CONFIG_SENSORS_ASB100 is not set
-# CONFIG_SENSORS_ATXP1 is not set
-# CONFIG_SENSORS_DS1621 is not set
-# CONFIG_SENSORS_F71805F is not set
-# CONFIG_SENSORS_FSCHER is not set
-# CONFIG_SENSORS_FSCPOS is not set
-# CONFIG_SENSORS_GL518SM is not set
-# CONFIG_SENSORS_GL520SM is not set
-# CONFIG_SENSORS_IT87 is not set
-# CONFIG_SENSORS_LM63 is not set
-# CONFIG_SENSORS_LM70 is not set
-# CONFIG_SENSORS_LM75 is not set
-# CONFIG_SENSORS_LM77 is not set
-# CONFIG_SENSORS_LM78 is not set
-# CONFIG_SENSORS_LM80 is not set
-# CONFIG_SENSORS_LM83 is not set
-# CONFIG_SENSORS_LM85 is not set
-# CONFIG_SENSORS_LM87 is not set
-# CONFIG_SENSORS_LM90 is not set
-# CONFIG_SENSORS_LM92 is not set
-# CONFIG_SENSORS_MAX1619 is not set
-# CONFIG_SENSORS_PC87360 is not set
-# CONFIG_SENSORS_PC87427 is not set
-# CONFIG_SENSORS_SIS5595 is not set
-# CONFIG_SENSORS_SMSC47M1 is not set
-# CONFIG_SENSORS_SMSC47M192 is not set
-# CONFIG_SENSORS_SMSC47B397 is not set
-# CONFIG_SENSORS_VIA686A is not set
-# CONFIG_SENSORS_VT1211 is not set
-# CONFIG_SENSORS_VT8231 is not set
-# CONFIG_SENSORS_W83781D is not set
-# CONFIG_SENSORS_W83791D is not set
-# CONFIG_SENSORS_W83792D is not set
-# CONFIG_SENSORS_W83793 is not set
-# CONFIG_SENSORS_W83L785TS is not set
-# CONFIG_SENSORS_W83627HF is not set
-# CONFIG_SENSORS_W83627EHF is not set
-# CONFIG_HWMON_DEBUG_CHIP is not set
 
 #
 # Multimedia devices
@@ -983,7 +887,7 @@ CONFIG_HWMON=y
 #
 # Graphics support
 #
-CONFIG_FIRMWARE_EDID=y
+# CONFIG_FIRMWARE_EDID is not set
 # CONFIG_FB is not set
 # CONFIG_FB_IBM_GXT4500 is not set
 # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
@@ -993,11 +897,6 @@ CONFIG_FIRMWARE_EDID=y
 #
 # CONFIG_SOUND is not set
 
-#
-# HID Devices
-#
-CONFIG_HID=y
-
 #
 # USB support
 #
@@ -1023,10 +922,8 @@ CONFIG_USB_EHCI_HCD=y
 # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
 # CONFIG_USB_EHCI_TT_NEWSCHED 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=y
+# CONFIG_USB_OHCI_HCD is not set
+# CONFIG_USB_UHCI_HCD is not set
 # CONFIG_USB_SL811_HCD is not set
 
 #
@@ -1058,25 +955,10 @@ CONFIG_USB_STORAGE=y
 #
 # USB Input Devices
 #
-# CONFIG_USB_HID is not set
 
 #
 # USB HID Boot Protocol drivers
 #
-# CONFIG_USB_KBD is not set
-# CONFIG_USB_MOUSE 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_TOUCHSCREEN is not set
-# CONFIG_USB_YEALINK is not set
-# CONFIG_USB_XPAD is not set
-# CONFIG_USB_ATI_REMOTE is not set
-# CONFIG_USB_ATI_REMOTE2 is not set
-# CONFIG_USB_KEYSPAN_REMOTE is not set
-# CONFIG_USB_APPLETOUCH is not set
 
 #
 # USB Imaging devices
@@ -1133,25 +1015,7 @@ CONFIG_USB_MON=y
 #
 # USB Gadget Support
 #
-CONFIG_USB_GADGET=y
-# CONFIG_USB_GADGET_DEBUG_FILES is not set
-CONFIG_USB_GADGET_SELECTED=y
-CONFIG_USB_GADGET_NET2280=y
-CONFIG_USB_NET2280=y
-# CONFIG_USB_GADGET_PXA2XX is not set
-# CONFIG_USB_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_LH7A40X is not set
-# CONFIG_USB_GADGET_OMAP is not set
-# CONFIG_USB_GADGET_AT91 is not set
-# CONFIG_USB_GADGET_DUMMY_HCD is not set
-CONFIG_USB_GADGET_DUALSPEED=y
-# CONFIG_USB_ZERO is not set
-CONFIG_USB_ETH=y
-CONFIG_USB_ETH_RNDIS=y
-# CONFIG_USB_GADGETFS is not set
-# CONFIG_USB_FILE_STORAGE is not set
-# CONFIG_USB_G_SERIAL is not set
-# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_GADGET is not set
 
 #
 # MMC/SD Card support
@@ -1273,8 +1137,11 @@ CONFIG_DNOTIFY=y
 #
 # DOS/FAT/NT Filesystems
 #
-# CONFIG_MSDOS_FS is not set
-# CONFIG_VFAT_FS is not set
+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
 
 #
@@ -1340,7 +1207,7 @@ CONFIG_PARTITION_ADVANCED=y
 # 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_MAC_PARTITION=y
 CONFIG_MSDOS_PARTITION=y
 # CONFIG_BSD_DISKLABEL is not set
 # CONFIG_MINIX_SUBPARTITION is not set
@@ -1356,7 +1223,46 @@ CONFIG_MSDOS_PARTITION=y
 #
 # Native Language Support
 #
-# CONFIG_NLS is not set
+CONFIG_NLS=y
+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 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 is not set
 
 #
 # Distributed Lock Manager
@@ -1388,27 +1294,9 @@ CONFIG_ENABLE_MUST_CHECK=y
 # CONFIG_UNUSED_SYMBOLS is not set
 # CONFIG_DEBUG_FS is not set
 # CONFIG_HEADERS_CHECK is not set
-CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_KERNEL is not set
 CONFIG_LOG_BUF_SHIFT=14
-CONFIG_DETECT_SOFTLOCKUP=y
-# CONFIG_SCHEDSTATS is not set
-# CONFIG_DEBUG_SLAB is not set
-# CONFIG_DEBUG_RT_MUTEXES is not set
-# CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
-# CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-# CONFIG_DEBUG_KOBJECT is not set
 # CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_INFO is not set
-# CONFIG_DEBUG_VM is not set
-# CONFIG_DEBUG_LIST is not set
-CONFIG_FORCED_INLINING=y
-# CONFIG_RCU_TORTURE_TEST is not set
-# CONFIG_DEBUGGER is not set
-# CONFIG_BDI_SWITCH is not set
 # CONFIG_BOOTX_TEXT is not set
 # CONFIG_SERIAL_TEXT_DEBUG is not set
 # CONFIG_PPC_EARLY_DEBUG is not set
diff --git a/arch/powerpc/configs/mpc834x_itxgp_defconfig b/arch/powerpc/configs/mpc834x_itxgp_defconfig
new file mode 100644 (file)
index 0000000..4aa666c
--- /dev/null
@@ -0,0 +1,1174 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.20
+# Fri Feb  9 13:28:19 2007
+#
+# CONFIG_PPC64 is not set
+CONFIG_PPC32=y
+CONFIG_PPC_MERGE=y
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_IRQ_PER_CPU=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_ILOG2_U32=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_PPC=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_GENERIC_NVRAM=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_PPC_OF=y
+CONFIG_PPC_UDBG_16550=y
+# CONFIG_GENERIC_TBSYNC is not set
+CONFIG_AUDIT_ARCH=y
+CONFIG_GENERIC_BUG=y
+CONFIG_DEFAULT_UIMAGE=y
+
+#
+# Processor support
+#
+# CONFIG_CLASSIC32 is not set
+# CONFIG_PPC_82xx is not set
+CONFIG_PPC_83xx=y
+# CONFIG_PPC_85xx is not set
+# CONFIG_PPC_86xx is not set
+# CONFIG_PPC_8xx is not set
+# CONFIG_40x is not set
+# CONFIG_44x is not set
+# CONFIG_E200 is not set
+CONFIG_6xx=y
+CONFIG_83xx=y
+CONFIG_PPC_FPU=y
+# CONFIG_PPC_DCR_NATIVE is not set
+# CONFIG_PPC_DCR_MMIO is not set
+CONFIG_PPC_STD_MMU=y
+CONFIG_PPC_STD_MMU_32=y
+# CONFIG_SMP is not set
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
+# CONFIG_KALLSYMS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+# CONFIG_EPOLL is not set
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+# CONFIG_KMOD is not set
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF 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_PPC_GEN550=y
+# CONFIG_WANT_EARLY_SERIAL is not set
+
+#
+# Platform support
+#
+# CONFIG_MPC832x_MDS is not set
+# CONFIG_MPC834x_SYS is not set
+CONFIG_MPC834x_ITX=y
+# CONFIG_MPC8360E_PB is not set
+CONFIG_MPC834x=y
+# CONFIG_MPIC is not set
+
+#
+# Kernel options
+#
+# CONFIG_HIGHMEM is not set
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
+# 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_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_POPULATES_NODE_MAP=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_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT 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
+#
+CONFIG_GENERIC_ISA_DMA=y
+# CONFIG_MPIC_WEIRD is not set
+# CONFIG_PPC_I8259 is not set
+CONFIG_PPC_INDIRECT_PCI=y
+CONFIG_FSL_SOC=y
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+# CONFIG_PCIEPORTBUS is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# PCI Hotplug Support
+#
+# CONFIG_HOTPLUG_PCI is not set
+
+#
+# Advanced setup
+#
+# CONFIG_ADVANCED_OPTIONS is not set
+
+#
+# Default settings for advanced configuration options are used
+#
+CONFIG_HIGHMEM_START=0xfe000000
+CONFIG_LOWMEM_SIZE=0x30000000
+CONFIG_KERNEL_START=0xc0000000
+CONFIG_TASK_SIZE=0x80000000
+CONFIG_BOOT_LOAD=0x00800000
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY 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=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+# 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=y
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK 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
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC 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_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED 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_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_PARTITIONS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+# CONFIG_MTD_BLKDEVS is not set
+# CONFIG_MTD_BLOCK is not set
+# CONFIG_MTD_BLOCK_RO is not set
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+CONFIG_MTD_CFI_AMDSTD=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_PHYSMAP_START=0xfe000000
+CONFIG_MTD_PHYSMAP_LEN=0x800000
+CONFIG_MTD_PHYSMAP_BANKWIDTH=2
+# CONFIG_MTD_PHYSMAP_OF is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_DATAFLASH is not set
+# CONFIG_MTD_M25P80 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_CAFE is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND 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 is not set
+# CONFIG_BLK_DEV_SX8 is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=32768
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# Misc devices
+#
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE 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_TGT is not set
+# CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_BLK_DEV_SR is not set
+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 is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+
+#
+# SCSI Transports
+#
+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
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# 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
+# 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_SCSI_AIC94XX is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_ARCMSR is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+# CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
+# CONFIG_SCSI_HPTIOP 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_STEX is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_QLA_FC is not set
+# CONFIG_SCSI_QLA_ISCSI is not set
+# CONFIG_SCSI_LPFC is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_DEBUG is not set
+# CONFIG_SCSI_SRP is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD 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
+#
+# CONFIG_MAC_EMUMOUSEBTN is not set
+# CONFIG_WINDFARM is not set
+
+#
+# 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=y
+
+#
+# MII PHY device drivers
+#
+# CONFIG_MARVELL_PHY is not set
+# CONFIG_DAVICOM_PHY is not set
+# CONFIG_QSEMI_PHY is not set
+# CONFIG_LXT_PHY is not set
+CONFIG_CICADA_PHY=y
+# CONFIG_VITESSE_PHY is not set
+# CONFIG_SMSC_PHY is not set
+# CONFIG_BROADCOM_PHY is not set
+# CONFIG_FIXED_PHY is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+# CONFIG_NET_ETHERNET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 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_SKY2 is not set
+# CONFIG_SK98LIN is not set
+# CONFIG_TIGON3 is not set
+# CONFIG_BNX2 is not set
+CONFIG_GIANFAR=y
+CONFIG_GFAR_NAPI=y
+# CONFIG_QLA3XXX is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC 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_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 is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+# CONFIG_VT is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+# CONFIG_SERIAL_8250_PCI is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_UARTLITE is not set
+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=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+CONFIG_83xx_WDT=y
+
+#
+# PCI-based Watchdog Cards
+#
+# CONFIG_PCIPCWATCHDOG is not set
+# CONFIG_WDTPCI is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_NVRAM is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER 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 is not set
+# 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_MPC=y
+# CONFIG_I2C_NFORCE2 is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_PROSAVAGE is not set
+# CONFIG_I2C_SAVAGE4 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=y
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_M41T00 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
+
+#
+# SPI support
+#
+CONFIG_SPI=y
+CONFIG_SPI_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+CONFIG_SPI_BITBANG=y
+CONFIG_SPI_MPC83xx=y
+
+#
+# SPI Protocol Masters
+#
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+# CONFIG_HWMON is not set
+# CONFIG_HWMON_VID is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+# CONFIG_FIRMWARE_EDID is not set
+# CONFIG_FB is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT 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_ARCH_HAS_EHCI=y
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+CONFIG_RTC_INTF_DEV_UIE_EMUL=y
+
+#
+# RTC drivers
+#
+# CONFIG_RTC_DRV_X1205 is not set
+CONFIG_RTC_DRV_DS1307=y
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_ISL1208 is not set
+# CONFIG_RTC_DRV_DS1672 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_PCF8563 is not set
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_RS5C348 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_TEST is not set
+# CONFIG_RTC_DRV_MAX6902 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# DMA Engine support
+#
+CONFIG_DMA_ENGINE=y
+
+#
+# DMA Clients
+#
+CONFIG_NET_DMA=y
+
+#
+# DMA Devices
+#
+CONFIG_INTEL_IOATDMA=y
+
+#
+# Virtualization
+#
+
+#
+# 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_EXT4DEV_FS 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 is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# 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_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_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_JFFS2_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=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+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_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_KARMA_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 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 is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_PLIST=y
+CONFIG_IOMAP_COPY=y
+
+#
+# Instrumentation Support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_BOOTX_TEXT is not set
+# CONFIG_SERIAL_TEXT_DEBUG is not set
+# CONFIG_PPC_EARLY_DEBUG is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_MANAGER=y
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC 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_GF128MUL is not set
+# CONFIG_CRYPTO_ECB is not set
+CONFIG_CRYPTO_CBC=y
+# CONFIG_CRYPTO_LRW 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
+#
index 9eaed3a369832cadfb7ba6a56e76eaf83063a798..2e3f8efb6ab1aa417b77782b7ce3ac95df581803 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20-rc5
-# Fri Jan 26 00:19:27 2007
+# Linux kernel version: 2.6.20
+# Thu Feb  8 01:00:48 2007
 #
 # CONFIG_PPC64 is not set
 CONFIG_PPC32=y
@@ -34,9 +34,9 @@ CONFIG_DEFAULT_UIMAGE=y
 CONFIG_PPC_83xx=y
 # CONFIG_PPC_85xx is not set
 # CONFIG_PPC_86xx is not set
+# CONFIG_PPC_8xx is not set
 # CONFIG_40x is not set
 # CONFIG_44x is not set
-# CONFIG_8xx is not set
 # CONFIG_E200 is not set
 CONFIG_6xx=y
 CONFIG_83xx=y
@@ -128,8 +128,9 @@ CONFIG_PPC_GEN550=y
 #
 # Platform support
 #
+# CONFIG_MPC8313_RDB is not set
 # CONFIG_MPC832x_MDS is not set
-CONFIG_MPC834x_SYS=y
+CONFIG_MPC834x_MDS=y
 # CONFIG_MPC834x_ITX is not set
 # CONFIG_MPC8360E_PB is not set
 CONFIG_MPC834x=y
diff --git a/arch/powerpc/configs/mpc8568mds_defconfig b/arch/powerpc/configs/mpc8568mds_defconfig
new file mode 100644 (file)
index 0000000..058e06d
--- /dev/null
@@ -0,0 +1,992 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.20-rc5
+# Wed Feb  7 23:54:25 2007
+#
+# CONFIG_PPC64 is not set
+CONFIG_PPC32=y
+CONFIG_PPC_MERGE=y
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_IRQ_PER_CPU=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_ILOG2_U32=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_PPC=y
+CONFIG_EARLY_PRINTK=y
+CONFIG_GENERIC_NVRAM=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_PPC_OF=y
+CONFIG_PPC_UDBG_16550=y
+# CONFIG_GENERIC_TBSYNC is not set
+CONFIG_AUDIT_ARCH=y
+CONFIG_GENERIC_BUG=y
+CONFIG_DEFAULT_UIMAGE=y
+
+#
+# Processor support
+#
+# CONFIG_CLASSIC32 is not set
+# CONFIG_PPC_82xx is not set
+# CONFIG_PPC_83xx is not set
+CONFIG_PPC_85xx=y
+# CONFIG_PPC_86xx is not set
+# CONFIG_40x is not set
+# CONFIG_44x is not set
+# CONFIG_8xx is not set
+# CONFIG_E200 is not set
+CONFIG_85xx=y
+CONFIG_E500=y
+# CONFIG_PPC_DCR_NATIVE is not set
+# CONFIG_PPC_DCR_MMIO is not set
+CONFIG_BOOKE=y
+CONFIG_FSL_BOOKE=y
+# CONFIG_PHYS_64BIT is not set
+CONFIG_SPE=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
+# CONFIG_KALLSYMS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+# CONFIG_EPOLL is not set
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+# CONFIG_KMOD is not set
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF 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_WANT_EARLY_SERIAL is not set
+
+#
+# Platform support
+#
+# CONFIG_MPC8540_ADS is not set
+# CONFIG_MPC8560_ADS is not set
+# CONFIG_MPC85xx_CDS is not set
+CONFIG_MPC8568_MDS=y
+CONFIG_MPC85xx=y
+CONFIG_PPC_INDIRECT_PCI_BE=y
+CONFIG_MPIC=y
+
+#
+# Kernel options
+#
+# CONFIG_HIGHMEM is not set
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
+# 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_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_MATH_EMULATION=y
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_POPULATES_NODE_MAP=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_SPLIT_PTLOCK_CPUS=4
+# CONFIG_RESOURCES_64BIT 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
+#
+# CONFIG_MPIC_WEIRD is not set
+# CONFIG_PPC_I8259 is not set
+CONFIG_PPC_INDIRECT_PCI=y
+CONFIG_FSL_SOC=y
+# CONFIG_PCI is not set
+# CONFIG_PCI_DOMAINS is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# PCI Hotplug Support
+#
+
+#
+# Advanced setup
+#
+# CONFIG_ADVANCED_OPTIONS is not set
+
+#
+# Default settings for advanced configuration options are used
+#
+CONFIG_HIGHMEM_START=0xfe000000
+CONFIG_LOWMEM_SIZE=0x30000000
+CONFIG_KERNEL_START=0xc0000000
+CONFIG_TASK_SIZE=0x80000000
+CONFIG_BOOT_LOAD=0x00800000
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY 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=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+# 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=y
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK 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
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC 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_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED 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
+# CONFIG_SYS_HYPERVISOR 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_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=32768
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# Misc devices
+#
+# CONFIG_TIFM_CORE 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_TGT is not set
+# CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+# CONFIG_BLK_DEV_SD is not set
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_BLK_DEV_SR is not set
+# CONFIG_CHR_DEV_SG is not set
+# CONFIG_CHR_DEV_SCH is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_SCSI_DEBUG is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA 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
+#
+
+#
+# I2O device support
+#
+
+#
+# Macintosh device drivers
+#
+# CONFIG_MAC_EMUMOUSEBTN is not set
+# CONFIG_WINDFARM is not set
+
+#
+# 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
+
+#
+# PHY device support
+#
+CONFIG_PHYLIB=y
+
+#
+# MII PHY device drivers
+#
+CONFIG_MARVELL_PHY=y
+# CONFIG_DAVICOM_PHY is not set
+# CONFIG_QSEMI_PHY is not set
+# CONFIG_LXT_PHY is not set
+# CONFIG_CICADA_PHY is not set
+# CONFIG_VITESSE_PHY is not set
+# CONFIG_SMSC_PHY is not set
+# CONFIG_BROADCOM_PHY is not set
+# CONFIG_FIXED_PHY is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+
+#
+# Ethernet (1000 Mbit)
+#
+CONFIG_GIANFAR=y
+CONFIG_GFAR_NAPI=y
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN 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
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# Userland interfaces
+#
+# CONFIG_INPUT_MOUSEDEV is not set
+# 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 is not set
+# 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_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_UARTLITE 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
+
+#
+# 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_BOOKE_WDT is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_NVRAM 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_RAW_DRIVER 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 is not set
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+CONFIG_I2C_MPC=y
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_STUB 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_M41T00 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
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_ADM1021 is not set
+# CONFIG_SENSORS_ADM1025 is not set
+# CONFIG_SENSORS_ADM1026 is not set
+# CONFIG_SENSORS_ADM1031 is not set
+# CONFIG_SENSORS_ADM9240 is not set
+# CONFIG_SENSORS_ASB100 is not set
+# CONFIG_SENSORS_ATXP1 is not set
+# CONFIG_SENSORS_DS1621 is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_FSCHER is not set
+# CONFIG_SENSORS_FSCPOS is not set
+# CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
+# CONFIG_SENSORS_IT87 is not set
+# CONFIG_SENSORS_LM63 is not set
+# CONFIG_SENSORS_LM75 is not set
+# CONFIG_SENSORS_LM77 is not set
+# CONFIG_SENSORS_LM78 is not set
+# CONFIG_SENSORS_LM80 is not set
+# CONFIG_SENSORS_LM83 is not set
+# CONFIG_SENSORS_LM85 is not set
+# CONFIG_SENSORS_LM87 is not set
+# CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
+# CONFIG_SENSORS_MAX1619 is not set
+# CONFIG_SENSORS_PC87360 is not set
+# CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47M192 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_W83781D is not set
+# CONFIG_SENSORS_W83791D is not set
+# CONFIG_SENSORS_W83792D is not set
+# CONFIG_SENSORS_W83793 is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83627HF is not set
+# CONFIG_SENSORS_W83627EHF is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# HID Devices
+#
+CONFIG_HID=y
+
+#
+# USB support
+#
+# CONFIG_USB_ARCH_HAS_HCD is not set
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# Virtualization
+#
+
+#
+# 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_EXT4DEV_FS 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 is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# 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_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_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=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+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_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 is not set
+# CONFIG_MSDOS_PARTITION 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_KARMA_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_PLIST=y
+CONFIG_IOMAP_COPY=y
+
+#
+# Instrumentation Support
+#
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=y
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_RWSEMS is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_INFO is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+CONFIG_DEBUGGER=y
+# CONFIG_XMON is not set
+# CONFIG_BDI_SWITCH is not set
+CONFIG_BOOTX_TEXT=y
+CONFIG_PPC_EARLY_DEBUG=y
+# CONFIG_PPC_EARLY_DEBUG_LPAR is not set
+# CONFIG_PPC_EARLY_DEBUG_G5 is not set
+# CONFIG_PPC_EARLY_DEBUG_RTAS_PANEL is not set
+# CONFIG_PPC_EARLY_DEBUG_RTAS_CONSOLE is not set
+# CONFIG_PPC_EARLY_DEBUG_MAPLE is not set
+# CONFIG_PPC_EARLY_DEBUG_ISERIES is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_MANAGER=y
+# CONFIG_CRYPTO_HMAC is not set
+# CONFIG_CRYPTO_XCBC 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_GF128MUL is not set
+CONFIG_CRYPTO_ECB=m
+CONFIG_CRYPTO_CBC=y
+# CONFIG_CRYPTO_LRW 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
+#
index ec644b34a08245eac1cb5f8e4ef9397d5e2cbc0b..0345a2ceec5970f41bce2021df37d6242bc767e2 100644 (file)
@@ -163,6 +163,7 @@ CONFIG_PS3_HTAB_SIZE=20
 # CONFIG_PS3_DYNAMIC_DMA is not set
 CONFIG_PS3_USE_LPAR_ADDR=y
 CONFIG_PS3_VUART=y
+CONFIG_PS3_PS3AV=y
 
 #
 # Kernel options
@@ -611,14 +612,40 @@ CONFIG_GEN_RTC=y
 # Graphics support
 #
 # CONFIG_FIRMWARE_EDID is not set
-# CONFIG_FB is not set
+CONFIG_FB=y
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_BACKLIGHT is not set
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_OF is not set
+# CONFIG_FB_VGA16 is not set
+# CONFIG_FB_S1D13XXX is not set
 # CONFIG_FB_IBM_GXT4500 is not set
+CONFIG_FB_PS3=y
+CONFIG_FB_PS3_DEFAULT_SIZE_M=18
+# 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_FRAMEBUFFER_CONSOLE_ROTATION is not set
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+
+#
+# Logo configuration
+#
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_LOGO_LINUX_CLUT224=y
 # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
index 93f21aaf7c8ef163a08483cc5f6d06c31d571c80..3678997339d6270cfcf5065979965ab4bf15fefa 100644 (file)
@@ -18,6 +18,7 @@
 #include <asm/io.h>
 #include <asm/lmb.h>
 #include <asm/processor.h>
+#include <asm/udbg.h>
 
 #define NO_SCROLL
 
@@ -912,3 +913,11 @@ static unsigned char vga_font[cmapsz] = {
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x00,
 };
+
+void __init udbg_init_btext(void)
+{
+       /* If btext is enabled, we might have a BAT setup for early display,
+        * thus we do enable some very basic udbg output
+        */
+       udbg_putc = btext_drawchar;
+}
index dd17dffbf05863fea22ab3c65133a0d1dd0a17ef..7ec4ac77c0fa0ee0eb24f92977d0b7740261a56b 100644 (file)
@@ -44,7 +44,7 @@ extern void __setup_cpu_745x(unsigned long offset, struct cpu_spec* spec);
 extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec);
 extern void __setup_cpu_ppc970MP(unsigned long offset, struct cpu_spec* spec);
 extern void __setup_cpu_pa6t(unsigned long offset, struct cpu_spec* spec);
-extern void __restore_cpu_pa6t(unsigned long offset, struct cpu_spec* spec);
+extern void __restore_cpu_pa6t(void);
 extern void __restore_cpu_ppc970(void);
 #endif /* CONFIG_PPC64 */
 
index accb39d49911bee35bbaa7ed5277017661e0a0bf..a15d4b8cce48783e0c54f12bf9b112460532408f 100644 (file)
@@ -32,8 +32,6 @@
 #include <asm/page.h>
 #include <asm/mmu.h>
 #include <asm/pgtable.h>
-#include <asm/ibm4xx.h>
-#include <asm/ibm44x.h>
 #include <asm/cputable.h>
 #include <asm/thread_info.h>
 #include <asm/ppc_asm.h>
index 66877bdfe0b7b8c5a20d2d0bdc7df02b4594152c..1f155d399d576859ab502f0149bf2032285f3e49 100644 (file)
@@ -206,7 +206,8 @@ skpinv:     addi    r6,r6,1                         /* Increment */
        rlwimi  r7,r3,16,4,15   /* Setup MAS0 = TLBSEL | ESEL(r3) */
        mtspr   SPRN_MAS0,r7
        tlbre
-       li      r6,0
+       mfspr   r6,SPRN_MAS1
+       rlwinm  r6,r6,0,2,0     /* clear IPROT */
        mtspr   SPRN_MAS1,r6
        tlbwe
        /* Invalidate TLB1 */
@@ -248,6 +249,8 @@ skpinv:     addi    r6,r6,1                         /* Increment */
        rlwimi  r7,r5,16,4,15   /* Setup MAS0 = TLBSEL | ESEL(r5) */
        mtspr   SPRN_MAS0,r7
        tlbre
+       mfspr   r8,SPRN_MAS1
+       rlwinm  r8,r8,0,2,0     /* clear IPROT */
        mtspr   SPRN_MAS1,r8
        tlbwe
        /* Invalidate TLB1 */
@@ -889,7 +892,6 @@ load_up_spe:
        REST_GPR(9, r11)
        REST_GPR(12, r11)
        lwz     r11,GPR11(r11)
-       SYNC
        rfi
 
 /*
@@ -953,7 +955,6 @@ _GLOBAL(giveup_altivec)
 _GLOBAL(giveup_spe)
        mfmsr   r5
        oris    r5,r5,MSR_SPE@h
-       SYNC
        mtmsr   r5                      /* enable use of SPE now */
        isync
        cmpi    0,r3,0
index 8994af327b47a2586aa1719f442d10a052fd14eb..6e7f50967bab10af659e61c227c7974117bbd945 100644 (file)
@@ -110,17 +110,22 @@ static ctl_table powersave_nap_ctl_table[]={
                .mode           = 0644,
                .proc_handler   = &proc_dointvec,
        },
-       { 0, },
+       {}
 };
 static ctl_table powersave_nap_sysctl_root[] = {
-       { 1, "kernel", NULL, 0, 0755, powersave_nap_ctl_table, },
-       { 0,},
+       {
+               .ctl_name       = CTL_KERN,
+               .procname       = "kernel",
+               .mode           = 0755,
+               .child          = powersave_nap_ctl_table,
+       },
+       {}
 };
 
 static int __init
 register_powersave_nap_sysctl(void)
 {
-       register_sysctl_table(powersave_nap_sysctl_root, 0);
+       register_sysctl_table(powersave_nap_sysctl_root);
 
        return 0;
 }
index 5e6ddfa474c0c72e0797e942d4939559fd01fe79..325f490a10cccbfdafff8503e44dd12ba6b6f968 100644 (file)
@@ -124,6 +124,10 @@ static int __init add_legacy_soc_port(struct device_node *np,
        if (get_property(np, "clock-frequency", NULL) == NULL)
                return -1;
 
+       /* if rtas uses this device, don't try to use it as well */
+       if (get_property(np, "used-by-rtas", NULL) != NULL)
+               return -1;
+
        /* Get the address */
        addrp = of_get_address(soc_dev, 0, NULL, NULL);
        if (addrp == NULL)
@@ -334,6 +338,17 @@ void __init find_legacy_serial_ports(void)
                of_node_put(tsi);
        }
 
+       /* First fill our array with opb bus ports */
+       for (np = NULL; (np = of_find_compatible_node(np, "serial", "ns16750")) != NULL;) {
+               struct device_node *opb = of_get_parent(np);
+               if (opb && !strcmp(opb->type, "opb")) {
+                       index = add_legacy_soc_port(np, np);
+                       if (index >= 0 && np == stdout)
+                               legacy_serial_console = index;
+               }
+               of_node_put(opb);
+       }
+
 #ifdef CONFIG_PCI
        /* Next, try to locate PCI ports */
        for (np = NULL; (np = of_find_all_nodes(np));) {
@@ -498,7 +513,7 @@ static int __init check_legacy_serial_console(void)
        DBG(" -> check_legacy_serial_console()\n");
 
        /* The user has requested a console so this is already set up. */
-       if (strstr(saved_command_line, "console=")) {
+       if (strstr(boot_command_line, "console=")) {
                DBG(" console was specified !\n");
                return -EBUSY;
        }
index 0de5a08cf9b007b78426d323a6cff245593a5c96..89486b631284d29cfd5d03b01a905bf0dd0c35cc 100644 (file)
@@ -571,7 +571,7 @@ static int lparcfg_open(struct inode *inode, struct file *file)
        return single_open(file, lparcfg_data, NULL);
 }
 
-struct file_operations lparcfg_fops = {
+const struct file_operations lparcfg_fops = {
        .owner          = THIS_MODULE,
        .read           = seq_read,
        .write          = lparcfg_write,
index 869cebbba967cf6f56b54a80550034e801f303ae..f9676f52c6d8c58ec70de146c7fd88d8e5f51db4 100644 (file)
@@ -179,7 +179,7 @@ static int dev_nvram_ioctl(struct inode *inode, struct file *file,
        }
 }
 
-struct file_operations nvram_fops = {
+const struct file_operations nvram_fops = {
        .owner =        THIS_MODULE,
        .llseek =       dev_nvram_llseek,
        .read =         dev_nvram_read,
index dd7001cacf75cfc09040b05961c39bb7c0471cfd..f78dfce1b771241256d4242c328286cbc3c92a8a 100644 (file)
@@ -33,7 +33,7 @@ static ssize_t page_map_read( struct file *file, char __user *buf, size_t nbytes
                              loff_t *ppos);
 static int     page_map_mmap( struct file *file, struct vm_area_struct *vma );
 
-static struct file_operations page_map_fops = {
+static const struct file_operations page_map_fops = {
        .llseek = page_map_seek,
        .read   = page_map_read,
        .mmap   = page_map_mmap
@@ -71,7 +71,6 @@ static int __init proc_ppc64_init(void)
        pde = create_proc_entry("ppc64/systemcfg", S_IFREG|S_IRUGO, NULL);
        if (!pde)
                return 1;
-       pde->nlink = 1;
        pde->data = vdso_data;
        pde->size = PAGE_SIZE;
        pde->proc_fops = &page_map_fops;
index 3be52d693eca8c68df1a0da72846f5053be70136..3e86e6e0f7782d436f8c9e57d9b59f461270633f 100644 (file)
@@ -991,7 +991,7 @@ void __init early_init_devtree(void *params)
        of_scan_flat_dt(early_init_dt_scan_memory, NULL);
 
        /* Save command line for /proc/cmdline and then parse parameters */
-       strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE);
+       strlcpy(boot_command_line, cmd_line, COMMAND_LINE_SIZE);
        parse_early_param();
 
        /* Reserve LMB regions used by kernel, initrd, dt, etc... */
index 520ef42f642ecca95c2f04ce3a4480fa3f913c33..4fb5938ce6d389b8b01b9eac48a35b37159cd26b 100644 (file)
@@ -2117,11 +2117,92 @@ static void __init fixup_device_tree_pmac(void)
 #define fixup_device_tree_pmac()
 #endif
 
+#ifdef CONFIG_PPC_EFIKA
+/* The current fw of the Efika has a device tree needs quite a few
+ * fixups to be compliant with the mpc52xx bindings. It's currently
+ * unknown if it will ever be compliant (come on bPlan ...) so we do fixups.
+ * NOTE that we (barely) tolerate it because the EFIKA was out before
+ * the bindings were finished, for any new boards -> RTFM ! */
+
+struct subst_entry {
+       char *path;
+       char *property;
+       void *value;
+       int value_len;
+};
+
+static void __init fixup_device_tree_efika(void)
+{
+       /* Substitution table */
+       #define prop_cstr(x) x, sizeof(x)
+       int prop_sound_irq[3] = { 2, 2, 0 };
+       int prop_bcomm_irq[3*16] = { 3,0,0, 3,1,0, 3,2,0, 3,3,0,
+                                    3,4,0, 3,5,0, 3,6,0, 3,7,0,
+                                    3,8,0, 3,9,0, 3,10,0, 3,11,0,
+                                    3,12,0, 3,13,0, 3,14,0, 3,15,0 };
+       struct subst_entry efika_subst_table[] = {
+               { "/",                  "device_type",  prop_cstr("efika") },
+               { "/builtin",           "compatible",   prop_cstr("soc") },
+               { "/builtin/ata",       "compatible",   prop_cstr("mpc5200b-ata\0mpc5200-ata"), },
+               { "/builtin/bestcomm",  "compatible",   prop_cstr("mpc5200b-bestcomm\0mpc5200-bestcomm") },
+               { "/builtin/bestcomm",  "interrupts",   prop_bcomm_irq, sizeof(prop_bcomm_irq) },
+               { "/builtin/ethernet",  "compatible",   prop_cstr("mpc5200b-fec\0mpc5200-fec") },
+               { "/builtin/pic",       "compatible",   prop_cstr("mpc5200b-pic\0mpc5200-pic") },
+               { "/builtin/serial",    "compatible",   prop_cstr("mpc5200b-psc-uart\0mpc5200-psc-uart") },
+               { "/builtin/sound",     "compatible",   prop_cstr("mpc5200b-psc-ac97\0mpc5200-psc-ac97") },
+               { "/builtin/sound",     "interrupts",   prop_sound_irq, sizeof(prop_sound_irq) },
+               { "/builtin/sram",      "compatible",   prop_cstr("mpc5200b-sram\0mpc5200-sram") },
+               { "/builtin/sram",      "device_type",  prop_cstr("sram") },
+               {}
+       };
+       #undef prop_cstr
+
+       /* Vars */
+       u32 node;
+       char prop[64];
+       int rv, i;
+
+       /* Check if we're really running on a EFIKA */
+       node = call_prom("finddevice", 1, 1, ADDR("/"));
+       if (!PHANDLE_VALID(node))
+               return;
+
+       rv = prom_getprop(node, "model", prop, sizeof(prop));
+       if (rv == PROM_ERROR)
+               return;
+       if (strcmp(prop, "EFIKA5K2"))
+               return;
+
+       prom_printf("Applying EFIKA device tree fixups\n");
+
+       /* Process substitution table */
+       for (i=0; efika_subst_table[i].path; i++) {
+               struct subst_entry *se = &efika_subst_table[i];
+
+               node = call_prom("finddevice", 1, 1, ADDR(se->path));
+               if (!PHANDLE_VALID(node)) {
+                       prom_printf("fixup_device_tree_efika: ",
+                               "skipped entry %x - not found\n", i);
+                       continue;
+               }
+
+               rv = prom_setprop(node, se->path, se->property,
+                                       se->value, se->value_len );
+               if (rv == PROM_ERROR)
+                       prom_printf("fixup_device_tree_efika: ",
+                               "skipped entry %x - setprop error\n", i);
+       }
+}
+#else
+#define fixup_device_tree_efika()
+#endif
+
 static void __init fixup_device_tree(void)
 {
        fixup_device_tree_maple();
        fixup_device_tree_chrp();
        fixup_device_tree_pmac();
+       fixup_device_tree_efika();
 }
 
 static void __init prom_find_boot_cpu(void)
index 2fe82abf1c52835f7424a644c57f8c282d19688a..6cbf2ae5d7aae8c914e6bb8f8b428c8862fa3f70 100644 (file)
@@ -160,7 +160,7 @@ static int sensors_open(struct inode *inode, struct file *file)
        return single_open(file, ppc_rtas_sensors_show, NULL);
 }
 
-struct file_operations ppc_rtas_sensors_operations = {
+const struct file_operations ppc_rtas_sensors_operations = {
        .open           = sensors_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -172,7 +172,7 @@ static int poweron_open(struct inode *inode, struct file *file)
        return single_open(file, ppc_rtas_poweron_show, NULL);
 }
 
-struct file_operations ppc_rtas_poweron_operations = {
+const struct file_operations ppc_rtas_poweron_operations = {
        .open           = poweron_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -185,7 +185,7 @@ static int progress_open(struct inode *inode, struct file *file)
        return single_open(file, ppc_rtas_progress_show, NULL);
 }
 
-struct file_operations ppc_rtas_progress_operations = {
+const struct file_operations ppc_rtas_progress_operations = {
        .open           = progress_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -198,7 +198,7 @@ static int clock_open(struct inode *inode, struct file *file)
        return single_open(file, ppc_rtas_clock_show, NULL);
 }
 
-struct file_operations ppc_rtas_clock_operations = {
+const struct file_operations ppc_rtas_clock_operations = {
        .open           = clock_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -211,7 +211,7 @@ static int tone_freq_open(struct inode *inode, struct file *file)
        return single_open(file, ppc_rtas_tone_freq_show, NULL);
 }
 
-struct file_operations ppc_rtas_tone_freq_operations = {
+const struct file_operations ppc_rtas_tone_freq_operations = {
        .open           = tone_freq_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -224,7 +224,7 @@ static int tone_volume_open(struct inode *inode, struct file *file)
        return single_open(file, ppc_rtas_tone_volume_show, NULL);
 }
 
-struct file_operations ppc_rtas_tone_volume_operations = {
+const struct file_operations ppc_rtas_tone_volume_operations = {
        .open           = tone_volume_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -237,7 +237,7 @@ static int rmo_buf_open(struct inode *inode, struct file *file)
        return single_open(file, ppc_rtas_rmo_buf_show, NULL);
 }
 
-struct file_operations ppc_rtas_rmo_buf_ops = {
+const struct file_operations ppc_rtas_rmo_buf_ops = {
        .open           = rmo_buf_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index 0c4fcd34bfe585ce199271ec7f73fcc549e9d171..f72118c0844fa9da217893869db5ec657cc5a200 100644 (file)
@@ -702,13 +702,12 @@ static int initialize_flash_pde_data(const char *rtas_call_name,
 }
 
 static struct proc_dir_entry *create_flash_pde(const char *filename,
-                                              struct file_operations *fops)
+                                              const struct file_operations *fops)
 {
        struct proc_dir_entry *ent = NULL;
 
        ent = create_proc_entry(filename, S_IRUSR | S_IWUSR, NULL);
        if (ent != NULL) {
-               ent->nlink = 1;
                ent->proc_fops = fops;
                ent->owner = THIS_MODULE;
        }
@@ -716,21 +715,21 @@ static struct proc_dir_entry *create_flash_pde(const char *filename,
        return ent;
 }
 
-static struct file_operations rtas_flash_operations = {
+static const struct file_operations rtas_flash_operations = {
        .read           = rtas_flash_read,
        .write          = rtas_flash_write,
        .open           = rtas_excl_open,
        .release        = rtas_flash_release,
 };
 
-static struct file_operations manage_flash_operations = {
+static const struct file_operations manage_flash_operations = {
        .read           = manage_flash_read,
        .write          = manage_flash_write,
        .open           = rtas_excl_open,
        .release        = rtas_excl_release,
 };
 
-static struct file_operations validate_flash_operations = {
+static const struct file_operations validate_flash_operations = {
        .read           = validate_flash_read,
        .write          = validate_flash_write,
        .open           = rtas_excl_open,
index 6a19fa40dceea957e41c6558c55880aecb33ea4b..44a6a3c47feb5a4f666be6ba4a0c402ffbe74526 100644 (file)
@@ -116,12 +116,8 @@ unsigned long __init early_init(unsigned long dt_ptr)
  */
 void __init machine_init(unsigned long dt_ptr, unsigned long phys)
 {
-       /* If btext is enabled, we might have a BAT setup for early display,
-        * thus we do enable some very basic udbg output
-        */
-#ifdef CONFIG_BOOTX_TEXT
-       udbg_putc = btext_drawchar;
-#endif
+       /* Enable early debugging if any specified (see udbg.h) */
+       udbg_early_init();
 
        /* Do some early initialization based on the flat device tree */
        early_init_devtree(__va(dt_ptr));
index 0e8beca460af59d8b814e99701a1bc65560ba4ba..924d692bc8f9249fd5b0feb091b195bfd08fbfa7 100644 (file)
@@ -78,29 +78,6 @@ int smt_enabled_at_boot = 1;
 
 static void (*crash_ipi_function_ptr)(struct pt_regs *) = NULL;
 
-#ifdef CONFIG_MPIC
-int __init smp_mpic_probe(void)
-{
-       int nr_cpus;
-
-       DBG("smp_mpic_probe()...\n");
-
-       nr_cpus = cpus_weight(cpu_possible_map);
-
-       DBG("nr_cpus: %d\n", nr_cpus);
-
-       if (nr_cpus > 1)
-               mpic_request_ipis();
-
-       return nr_cpus;
-}
-
-void __devinit smp_mpic_setup_cpu(int cpu)
-{
-       mpic_setup_this_cpu();
-}
-#endif /* CONFIG_MPIC */
-
 #ifdef CONFIG_PPC64
 void __devinit smp_generic_kick_cpu(int nr)
 {
index 03a2a2f30d66dfcf555881fd05bed1228de6dbd7..673e8d9df7f58e0067d9eee854c5e789741d90e0 100644 (file)
@@ -198,73 +198,6 @@ static inline long put_tv32(struct compat_timeval __user *o, struct timeval *i)
                 __put_user(i->tv_usec, &o->tv_usec)));
 }
 
-struct sysinfo32 {
-        s32 uptime;
-        u32 loads[3];
-        u32 totalram;
-        u32 freeram;
-        u32 sharedram;
-        u32 bufferram;
-        u32 totalswap;
-        u32 freeswap;
-        unsigned short procs;
-       unsigned short pad;
-       u32 totalhigh;
-       u32 freehigh;
-       u32 mem_unit;
-       char _f[20-2*sizeof(int)-sizeof(int)];
-};
-
-asmlinkage long compat_sys_sysinfo(struct sysinfo32 __user *info)
-{
-       struct sysinfo s;
-       int ret, err;
-       int bitcount=0;
-       mm_segment_t old_fs = get_fs ();
-       
-       /* The __user cast is valid due to set_fs() */
-       set_fs (KERNEL_DS);
-       ret = sys_sysinfo((struct sysinfo __user *)&s);
-       set_fs (old_fs);
-
-       /* Check to see if any memory value is too large for 32-bit and
-         * scale down if needed.
-         */
-       if ((s.totalram >> 32) || (s.totalswap >> 32)) {
-           while (s.mem_unit < PAGE_SIZE) {
-               s.mem_unit <<= 1;
-               bitcount++;
-           }
-           s.totalram >>=bitcount;
-           s.freeram >>= bitcount;
-           s.sharedram >>= bitcount;
-           s.bufferram >>= bitcount;
-           s.totalswap >>= bitcount;
-           s.freeswap >>= bitcount;
-           s.totalhigh >>= bitcount;
-           s.freehigh >>= bitcount;
-       }
-
-       err = put_user (s.uptime, &info->uptime);
-       err |= __put_user (s.loads[0], &info->loads[0]);
-       err |= __put_user (s.loads[1], &info->loads[1]);
-       err |= __put_user (s.loads[2], &info->loads[2]);
-       err |= __put_user (s.totalram, &info->totalram);
-       err |= __put_user (s.freeram, &info->freeram);
-       err |= __put_user (s.sharedram, &info->sharedram);
-       err |= __put_user (s.bufferram, &info->bufferram);
-       err |= __put_user (s.totalswap, &info->totalswap);
-       err |= __put_user (s.freeswap, &info->freeswap);
-       err |= __put_user (s.procs, &info->procs);
-       err |= __put_user (s.totalhigh, &info->totalhigh);
-       err |= __put_user (s.freehigh, &info->freehigh);
-       err |= __put_user (s.mem_unit, &info->mem_unit);
-       if (err)
-               return -EFAULT;
-       
-       return ret;
-}
-
 
 
 
index 8f5afdbad0d5cd5b70232a36236816e1b7b0a432..7e0971868fc25ec77377feb5ac7c34e195a1fd8f 100644 (file)
@@ -49,6 +49,8 @@ void __init udbg_early_init(void)
        udbg_init_debug_beat();
 #elif defined(CONFIG_PPC_EARLY_DEBUG_PAS_REALMODE)
        udbg_init_pas_realmode();
+#elif defined(CONFIG_BOOTX_TEXT)
+       udbg_init_btext();
 #endif
 }
 
@@ -150,7 +152,7 @@ void __init disable_early_printk(void)
 {
        if (!early_console_initialized)
                return;
-       if (strstr(saved_command_line, "udbg-immortal")) {
+       if (strstr(boot_command_line, "udbg-immortal")) {
                printk(KERN_INFO "early console immortal !\n");
                return;
        }
index 50149ec6efa4354c29e0013f7131492baf17939b..e46c31b36641e7fb074e6ba3e45e17fbb7600f14 100644 (file)
 /* Max supported size for symbol names */
 #define MAX_SYMNAME    64
 
-#define VDSO32_MAXPAGES        (((0x3000 + PAGE_MASK) >> PAGE_SHIFT) + 2)
-#define VDSO64_MAXPAGES        (((0x3000 + PAGE_MASK) >> PAGE_SHIFT) + 2)
-
 extern char vdso32_start, vdso32_end;
 static void *vdso32_kbase = &vdso32_start;
-unsigned int vdso32_pages;
-static struct page *vdso32_pagelist[VDSO32_MAXPAGES];
+static unsigned int vdso32_pages;
+static struct page **vdso32_pagelist;
 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;
-static struct page *vdso64_pagelist[VDSO64_MAXPAGES];
+static unsigned int vdso64_pages;
+static struct page **vdso64_pagelist;
 unsigned long vdso64_rt_sigtramp;
 #endif /* CONFIG_PPC64 */
 
+static int vdso_ready;
+
 /*
  * The vdso data page (aka. systemcfg for old ppc64 fans) is here.
  * Once the early boot kernel code no longer needs to muck around
@@ -182,6 +181,9 @@ int arch_setup_additional_pages(struct linux_binprm *bprm,
        unsigned long vdso_base;
        int rc;
 
+       if (!vdso_ready)
+               return 0;
+
 #ifdef CONFIG_PPC64
        if (test_thread_flag(TIF_32BIT)) {
                vdso_pagelist = vdso32_pagelist;
@@ -661,7 +663,7 @@ static void __init vdso_setup_syscall_map(void)
 }
 
 
-void __init vdso_init(void)
+static int __init vdso_init(void)
 {
        int i;
 
@@ -716,11 +718,13 @@ void __init vdso_init(void)
 #ifdef CONFIG_PPC64
                vdso64_pages = 0;
 #endif
-               return;
+               return 0;
        }
 
        /* Make sure pages are in the correct state */
-       BUG_ON(vdso32_pages + 2 > VDSO32_MAXPAGES);
+       vdso32_pagelist = kzalloc(sizeof(struct page *) * (vdso32_pages + 2),
+                                 GFP_KERNEL);
+       BUG_ON(vdso32_pagelist == NULL);
        for (i = 0; i < vdso32_pages; i++) {
                struct page *pg = virt_to_page(vdso32_kbase + i*PAGE_SIZE);
                ClearPageReserved(pg);
@@ -731,7 +735,9 @@ void __init vdso_init(void)
        vdso32_pagelist[i] = NULL;
 
 #ifdef CONFIG_PPC64
-       BUG_ON(vdso64_pages + 2 > VDSO64_MAXPAGES);
+       vdso64_pagelist = kzalloc(sizeof(struct page *) * (vdso64_pages + 2),
+                                 GFP_KERNEL);
+       BUG_ON(vdso64_pagelist == NULL);
        for (i = 0; i < vdso64_pages; i++) {
                struct page *pg = virt_to_page(vdso64_kbase + i*PAGE_SIZE);
                ClearPageReserved(pg);
@@ -743,7 +749,13 @@ void __init vdso_init(void)
 #endif /* CONFIG_PPC64 */
 
        get_page(virt_to_page(vdso_data));
+
+       smp_wmb();
+       vdso_ready = 1;
+
+       return 0;
 }
+arch_initcall(vdso_init);
 
 int in_gate_area_no_task(unsigned long addr)
 {
index 04b8e71bf5b0087a814fba70bd47dce22eda717f..7eefeb4a30e70b9837f3e50eb045444521095baf 100644 (file)
@@ -131,14 +131,14 @@ SECTIONS
                __stop___fw_ftr_fixup = .;
        }
 #endif
-
+#ifdef CONFIG_BLK_DEV_INITRD
        . = ALIGN(PAGE_SIZE);
        .init.ramfs : {
                __initramfs_start = .;
                *(.init.ramfs)
                __initramfs_end = .;
        }
-
+#endif
 #ifdef CONFIG_PPC32
        . = ALIGN(32);
 #else
index 77b4637097e93ce40682e6a4f57a26e81dee2ea9..52f397c108a7b3e981800f8ee9f18c64effcef65 100644 (file)
@@ -384,9 +384,6 @@ void __init mem_init(void)
                initsize >> 10);
 
        mem_init_done = 1;
-
-       /* Initialize the vDSO */
-       vdso_init();
 }
 
 /*
index bd02272bcb0fee3dcdcfcc507c725b7d23bd8404..c284bdac9947088e57fb66bc120639422eaf8900 100644 (file)
@@ -295,7 +295,7 @@ void __init mapin_ram(void)
 }
 
 /* is x a power of 4? */
-#define is_power_of_4(x)       is_power_of_2(x) && (ffs(x) & 1))
+#define is_power_of_4(x)       is_power_of_2(x) && (ffs(x) & 1)
 
 /*
  * Set up a mapping for a block of I/O.
index 2eb15f3881035895e1e83d1cbb0c90ee6bb2e8d8..e08e1d7b3dc5d21bc525d2f5d88fd89efa34ea9c 100644 (file)
 #include "../platforms/cell/interrupt.h"
 
 #define PPU_CYCLES_EVENT_NUM 1 /*  event number for CYCLES */
+#define PPU_CYCLES_GRP_NUM   1  /* special group number for identifying
+                                 * PPU_CYCLES event
+                                 */
 #define CBE_COUNT_ALL_CYCLES 0x42800000        /* PPU cycle event specifier */
 
-#define NUM_THREADS 2
-#define VIRT_CNTR_SW_TIME_NS 100000000 // 0.5 seconds
+#define NUM_THREADS 2         /* number of physical threads in
+                              * physical processor
+                              */
+#define NUM_TRACE_BUS_WORDS 4
+#define NUM_INPUT_BUS_WORDS 2
+
 
 struct pmc_cntrl_data {
        unsigned long vcntr;
@@ -58,7 +65,7 @@ struct pmc_cntrl_data {
 struct pm_signal {
        u16 cpu;                /* Processor to modify */
        u16 sub_unit;           /* hw subunit this applies to (if applicable) */
-       u16 signal_group;       /* Signal Group to Enable/Disable */
+       short int signal_group; /* Signal Group to Enable/Disable */
        u8 bus_word;            /* Enable/Disable on this Trace/Trigger/Event
                                 * Bus Word(s) (bitmask)
                                 */
@@ -93,7 +100,6 @@ static struct {
        u32 pm07_cntrl[NR_PHYS_CTRS];
 } pm_regs;
 
-
 #define GET_SUB_UNIT(x) ((x & 0x0000f000) >> 12)
 #define GET_BUS_WORD(x) ((x & 0x000000f0) >> 4)
 #define GET_BUS_TYPE(x) ((x & 0x00000300) >> 8)
@@ -101,7 +107,6 @@ static struct {
 #define GET_COUNT_CYCLES(x) (x & 0x00000001)
 #define GET_INPUT_CONTROL(x) ((x & 0x00000004) >> 2)
 
-
 static DEFINE_PER_CPU(unsigned long[NR_PHYS_CTRS], pmc_values);
 
 static struct pmc_cntrl_data pmc_cntrl[NUM_THREADS][NR_PHYS_CTRS];
@@ -129,8 +134,8 @@ static spinlock_t virt_cntr_lock = SPIN_LOCK_UNLOCKED;
 
 static u32 ctr_enabled;
 
-static unsigned char trace_bus[4];
-static unsigned char input_bus[2];
+static unsigned char trace_bus[NUM_TRACE_BUS_WORDS];
+static unsigned char input_bus[NUM_INPUT_BUS_WORDS];
 
 /*
  * Firmware interface functions
@@ -177,25 +182,40 @@ static void pm_rtas_reset_signals(u32 node)
 static void pm_rtas_activate_signals(u32 node, u32 count)
 {
        int ret;
-       int j;
+       int i, j;
        struct pm_signal pm_signal_local[NR_PHYS_CTRS];
 
+       /* There is no debug setup required for the cycles event.
+        * Note that only events in the same group can be used.
+        * Otherwise, there will be conflicts in correctly routing
+        * the signals on the debug bus.  It is the responsiblity
+        * of the OProfile user tool to check the events are in
+        * the same group.
+        */
+       i = 0;
        for (j = 0; j < count; j++) {
-               /* fw expects physical cpu # */
-               pm_signal_local[j].cpu = node;
-               pm_signal_local[j].signal_group = pm_signal[j].signal_group;
-               pm_signal_local[j].bus_word = pm_signal[j].bus_word;
-               pm_signal_local[j].sub_unit = pm_signal[j].sub_unit;
-               pm_signal_local[j].bit = pm_signal[j].bit;
+               if (pm_signal[j].signal_group != PPU_CYCLES_GRP_NUM) {
+
+                       /* fw expects physical cpu # */
+                       pm_signal_local[i].cpu = node;
+                       pm_signal_local[i].signal_group
+                               = pm_signal[j].signal_group;
+                       pm_signal_local[i].bus_word = pm_signal[j].bus_word;
+                       pm_signal_local[i].sub_unit = pm_signal[j].sub_unit;
+                       pm_signal_local[i].bit = pm_signal[j].bit;
+                       i++;
+               }
        }
 
-       ret = rtas_ibm_cbe_perftools(SUBFUNC_ACTIVATE, PASSTHRU_ENABLE,
-                                    pm_signal_local,
-                                    count * sizeof(struct pm_signal));
+       if (i != 0) {
+               ret = rtas_ibm_cbe_perftools(SUBFUNC_ACTIVATE, PASSTHRU_ENABLE,
+                                            pm_signal_local,
+                                            i * sizeof(struct pm_signal));
 
-       if (ret)
-               printk(KERN_WARNING "%s: rtas returned: %d\n",
-                      __FUNCTION__, ret);
+               if (ret)
+                       printk(KERN_WARNING "%s: rtas returned: %d\n",
+                              __FUNCTION__, ret);
+       }
 }
 
 /*
@@ -212,7 +232,7 @@ static void set_pm_event(u32 ctr, int event, u32 unit_mask)
                /* Special Event: Count all cpu cycles */
                pm_regs.pm07_cntrl[ctr] = CBE_COUNT_ALL_CYCLES;
                p = &(pm_signal[ctr]);
-               p->signal_group = 21;
+               p->signal_group = PPU_CYCLES_GRP_NUM;
                p->bus_word = 1;
                p->sub_unit = 0;
                p->bit = 0;
@@ -232,13 +252,21 @@ static void set_pm_event(u32 ctr, int event, u32 unit_mask)
 
        p->signal_group = event / 100;
        p->bus_word = bus_word;
-       p->sub_unit = unit_mask & 0x0000f000;
+       p->sub_unit = (unit_mask & 0x0000f000) >> 12;
 
        pm_regs.pm07_cntrl[ctr] = 0;
        pm_regs.pm07_cntrl[ctr] |= PM07_CTR_COUNT_CYCLES(count_cycles);
        pm_regs.pm07_cntrl[ctr] |= PM07_CTR_POLARITY(polarity);
        pm_regs.pm07_cntrl[ctr] |= PM07_CTR_INPUT_CONTROL(input_control);
 
+       /* Some of the islands signal selection is based on 64 bit words.
+        * The debug bus words are 32 bits, the input words to the performance
+        * counters are defined as 32 bits.  Need to convert the 64 bit island
+        * specification to the appropriate 32 input bit and bus word for the
+        * performance counter event selection.  See the CELL Performance
+        * monitoring signals manual and the Perf cntr hardware descriptions
+        * for the details.
+        */
        if (input_control == 0) {
                if (signal_bit > 31) {
                        signal_bit -= 32;
@@ -259,12 +287,12 @@ static void set_pm_event(u32 ctr, int event, u32 unit_mask)
                p->bit = signal_bit;
        }
 
-       for (i = 0; i < 4; i++) {
+       for (i = 0; i < NUM_TRACE_BUS_WORDS; i++) {
                if (bus_word & (1 << i)) {
                        pm_regs.debug_bus_control |=
                            (bus_type << (31 - (2 * i) + 1));
 
-                       for (j = 0; j < 2; j++) {
+                       for (j = 0; j < NUM_INPUT_BUS_WORDS; j++) {
                                if (input_bus[j] == 0xff) {
                                        input_bus[j] = i;
                                        pm_regs.group_control |=
@@ -278,52 +306,58 @@ out:
        ;
 }
 
-static void write_pm_cntrl(int cpu, struct pm_cntrl *pm_cntrl)
+static void write_pm_cntrl(int cpu)
 {
-       /* Oprofile will use 32 bit counters, set bits 7:10 to 0 */
+       /* Oprofile will use 32 bit counters, set bits 7:10 to 0
+        * pmregs.pm_cntrl is a global
+        */
+
        u32 val = 0;
-       if (pm_cntrl->enable == 1)
+       if (pm_regs.pm_cntrl.enable == 1)
                val |= CBE_PM_ENABLE_PERF_MON;
 
-       if (pm_cntrl->stop_at_max == 1)
+       if (pm_regs.pm_cntrl.stop_at_max == 1)
                val |= CBE_PM_STOP_AT_MAX;
 
-       if (pm_cntrl->trace_mode == 1)
-               val |= CBE_PM_TRACE_MODE_SET(pm_cntrl->trace_mode);
+       if (pm_regs.pm_cntrl.trace_mode == 1)
+               val |= CBE_PM_TRACE_MODE_SET(pm_regs.pm_cntrl.trace_mode);
 
-       if (pm_cntrl->freeze == 1)
+       if (pm_regs.pm_cntrl.freeze == 1)
                val |= CBE_PM_FREEZE_ALL_CTRS;
 
        /* Routine set_count_mode must be called previously to set
         * the count mode based on the user selection of user and kernel.
         */
-       val |= CBE_PM_COUNT_MODE_SET(pm_cntrl->count_mode);
+       val |= CBE_PM_COUNT_MODE_SET(pm_regs.pm_cntrl.count_mode);
        cbe_write_pm(cpu, pm_control, val);
 }
 
 static inline void
-set_count_mode(u32 kernel, u32 user, struct pm_cntrl *pm_cntrl)
+set_count_mode(u32 kernel, u32 user)
 {
        /* The user must specify user and kernel if they want them. If
-        *  neither is specified, OProfile will count in hypervisor mode
+        *  neither is specified, OProfile will count in hypervisor mode.
+        *  pm_regs.pm_cntrl is a global
         */
        if (kernel) {
                if (user)
-                       pm_cntrl->count_mode = CBE_COUNT_ALL_MODES;
+                       pm_regs.pm_cntrl.count_mode = CBE_COUNT_ALL_MODES;
                else
-                       pm_cntrl->count_mode = CBE_COUNT_SUPERVISOR_MODE;
+                       pm_regs.pm_cntrl.count_mode =
+                               CBE_COUNT_SUPERVISOR_MODE;
        } else {
                if (user)
-                       pm_cntrl->count_mode = CBE_COUNT_PROBLEM_MODE;
+                       pm_regs.pm_cntrl.count_mode = CBE_COUNT_PROBLEM_MODE;
                else
-                       pm_cntrl->count_mode = CBE_COUNT_HYPERVISOR_MODE;
+                       pm_regs.pm_cntrl.count_mode =
+                               CBE_COUNT_HYPERVISOR_MODE;
        }
 }
 
 static inline void enable_ctr(u32 cpu, u32 ctr, u32 * pm07_cntrl)
 {
 
-       pm07_cntrl[ctr] |= PM07_CTR_ENABLE(1);
+       pm07_cntrl[ctr] |= CBE_PM_CTR_ENABLE;
        cbe_write_pm07_control(cpu, ctr, pm07_cntrl[ctr]);
 }
 
@@ -365,6 +399,14 @@ static void cell_virtual_cntr(unsigned long data)
        hdw_thread = 1 ^ hdw_thread;
        next_hdw_thread = hdw_thread;
 
+       for (i = 0; i < num_counters; i++)
+       /* There are some per thread events.  Must do the
+        * set event, for the thread that is being started
+        */
+               set_pm_event(i,
+                       pmc_cntrl[next_hdw_thread][i].evnts,
+                       pmc_cntrl[next_hdw_thread][i].masks);
+
        /* The following is done only once per each node, but
         * we need cpu #, not node #, to pass to the cbe_xxx functions.
         */
@@ -385,12 +427,13 @@ static void cell_virtual_cntr(unsigned long data)
                            == 0xFFFFFFFF)
                                /* If the cntr value is 0xffffffff, we must
                                 * reset that to 0xfffffff0 when the current
-                                * thread is restarted.  This will generate a new
-                                * interrupt and make sure that we never restore
-                                * the counters to the max value.  If the counters
-                                * were restored to the max value, they do not
-                                * increment and no interrupts are generated.  Hence
-                                * no more samples will be collected on that cpu.
+                                * thread is restarted.  This will generate a
+                                * new interrupt and make sure that we never
+                                * restore the counters to the max value.  If
+                                * the counters were restored to the max value,
+                                * they do not increment and no interrupts are
+                                * generated.  Hence no more samples will be
+                                * collected on that cpu.
                                 */
                                cbe_write_ctr(cpu, i, 0xFFFFFFF0);
                        else
@@ -410,9 +453,6 @@ static void cell_virtual_cntr(unsigned long data)
                                 * Must do the set event, enable_cntr
                                 * for each cpu.
                                 */
-                               set_pm_event(i,
-                                    pmc_cntrl[next_hdw_thread][i].evnts,
-                                    pmc_cntrl[next_hdw_thread][i].masks);
                                enable_ctr(cpu, i,
                                           pm_regs.pm07_cntrl);
                        } else {
@@ -465,8 +505,7 @@ cell_reg_setup(struct op_counter_config *ctr,
        pm_regs.pm_cntrl.trace_mode = 0;
        pm_regs.pm_cntrl.freeze = 1;
 
-       set_count_mode(sys->enable_kernel, sys->enable_user,
-                      &pm_regs.pm_cntrl);
+       set_count_mode(sys->enable_kernel, sys->enable_user);
 
        /* Setup the thread 0 events */
        for (i = 0; i < num_ctrs; ++i) {
@@ -498,10 +537,10 @@ cell_reg_setup(struct op_counter_config *ctr,
                pmc_cntrl[1][i].vcntr = i;
        }
 
-       for (i = 0; i < 4; i++)
+       for (i = 0; i < NUM_TRACE_BUS_WORDS; i++)
                trace_bus[i] = 0xff;
 
-       for (i = 0; i < 2; i++)
+       for (i = 0; i < NUM_INPUT_BUS_WORDS; i++)
                input_bus[i] = 0xff;
 
        /* Our counters count up, and "count" refers to
@@ -560,7 +599,7 @@ static void cell_cpu_setup(struct op_counter_config *cntr)
        cbe_write_pm(cpu, pm_start_stop, 0);
        cbe_write_pm(cpu, group_control, pm_regs.group_control);
        cbe_write_pm(cpu, debug_bus_control, pm_regs.debug_bus_control);
-       write_pm_cntrl(cpu, &pm_regs.pm_cntrl);
+       write_pm_cntrl(cpu);
 
        for (i = 0; i < num_counters; ++i) {
                if (ctr_enabled & (1 << i)) {
@@ -602,7 +641,7 @@ static void cell_global_start(struct op_counter_config *ctr)
                        }
                }
 
-               cbe_clear_pm_interrupts(cpu);
+               cbe_get_and_clear_pm_interrupts(cpu);
                cbe_enable_pm_interrupts(cpu, hdw_thread, interrupt_mask);
                cbe_enable_pm(cpu);
        }
@@ -672,7 +711,7 @@ cell_handle_interrupt(struct pt_regs *regs, struct op_counter_config *ctr)
 
        cbe_disable_pm(cpu);
 
-       interrupt_mask = cbe_clear_pm_interrupts(cpu);
+       interrupt_mask = cbe_get_and_clear_pm_interrupts(cpu);
 
        /* If the interrupt mask has been cleared, then the virt cntr
         * has cleared the interrupt.  When the thread that generated
index 795b713ec9ee5bc6925178509ade409a7adeb494..07cdbcacf1569348a7fffed925225640830e8c3c 100644 (file)
@@ -6,5 +6,5 @@ obj-y                           += mpc52xx_pic.o mpc52xx_common.o
 obj-$(CONFIG_PCI)              += mpc52xx_pci.o
 endif
 
-obj-$(CONFIG_PPC_EFIKA)                += efika-setup.o efika-pci.o
+obj-$(CONFIG_PPC_EFIKA)                += efika.o
 obj-$(CONFIG_PPC_LITE5200)     += lite5200.o
diff --git a/arch/powerpc/platforms/52xx/efika-pci.c b/arch/powerpc/platforms/52xx/efika-pci.c
deleted file mode 100644 (file)
index 62e05b2..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-
-#include <linux/kernel.h>
-#include <linux/pci.h>
-#include <linux/string.h>
-#include <linux/init.h>
-
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/prom.h>
-#include <asm/machdep.h>
-#include <asm/sections.h>
-#include <asm/pci-bridge.h>
-#include <asm/rtas.h>
-
-#include "efika.h"
-
-#ifdef CONFIG_PCI
-/*
- * Access functions for PCI config space using RTAS calls.
- */
-static int rtas_read_config(struct pci_bus *bus, unsigned int devfn, int offset,
-                           int len, u32 * val)
-{
-       struct pci_controller *hose = bus->sysdata;
-       unsigned long addr = (offset & 0xff) | ((devfn & 0xff) << 8)
-           | (((bus->number - hose->first_busno) & 0xff) << 16)
-           | (hose->index << 24);
-       int ret = -1;
-       int rval;
-
-       rval = rtas_call(rtas_token("read-pci-config"), 2, 2, &ret, addr, len);
-       *val = ret;
-       return rval ? PCIBIOS_DEVICE_NOT_FOUND : PCIBIOS_SUCCESSFUL;
-}
-
-static int rtas_write_config(struct pci_bus *bus, unsigned int devfn,
-                            int offset, int len, u32 val)
-{
-       struct pci_controller *hose = bus->sysdata;
-       unsigned long addr = (offset & 0xff) | ((devfn & 0xff) << 8)
-           | (((bus->number - hose->first_busno) & 0xff) << 16)
-           | (hose->index << 24);
-       int rval;
-
-       rval = rtas_call(rtas_token("write-pci-config"), 3, 1, NULL,
-                        addr, len, val);
-       return rval ? PCIBIOS_DEVICE_NOT_FOUND : PCIBIOS_SUCCESSFUL;
-}
-
-static struct pci_ops rtas_pci_ops = {
-       rtas_read_config,
-       rtas_write_config
-};
-
-void __init efika_pcisetup(void)
-{
-       const int *bus_range;
-       int len;
-       struct pci_controller *hose;
-       struct device_node *root;
-       struct device_node *pcictrl;
-
-       root = of_find_node_by_path("/");
-       if (root == NULL) {
-               printk(KERN_WARNING EFIKA_PLATFORM_NAME
-                      ": Unable to find the root node\n");
-               return;
-       }
-
-       for (pcictrl = NULL;;) {
-               pcictrl = of_get_next_child(root, pcictrl);
-               if ((pcictrl == NULL) || (strcmp(pcictrl->name, "pci") == 0))
-                       break;
-       }
-
-       of_node_put(root);
-
-       if (pcictrl == NULL) {
-               printk(KERN_WARNING EFIKA_PLATFORM_NAME
-                      ": Unable to find the PCI bridge node\n");
-               return;
-       }
-
-       bus_range = get_property(pcictrl, "bus-range", &len);
-       if (bus_range == NULL || len < 2 * sizeof(int)) {
-               printk(KERN_WARNING EFIKA_PLATFORM_NAME
-                      ": Can't get bus-range for %s\n", pcictrl->full_name);
-               return;
-       }
-
-       if (bus_range[1] == bus_range[0])
-               printk(KERN_INFO EFIKA_PLATFORM_NAME ": PCI bus %d",
-                      bus_range[0]);
-       else
-               printk(KERN_INFO EFIKA_PLATFORM_NAME ": PCI buses %d..%d",
-                      bus_range[0], bus_range[1]);
-       printk(" controlled by %s\n", pcictrl->full_name);
-       printk("\n");
-
-       hose = pcibios_alloc_controller();
-       if (!hose) {
-               printk(KERN_WARNING EFIKA_PLATFORM_NAME
-                      ": Can't allocate PCI controller structure for %s\n",
-                      pcictrl->full_name);
-               return;
-       }
-
-       hose->arch_data = of_node_get(pcictrl);
-       hose->first_busno = bus_range[0];
-       hose->last_busno = bus_range[1];
-       hose->ops = &rtas_pci_ops;
-
-       pci_process_bridge_OF_ranges(hose, pcictrl, 0);
-}
-
-#else
-void __init efika_pcisetup(void)
-{}
-#endif
diff --git a/arch/powerpc/platforms/52xx/efika-setup.c b/arch/powerpc/platforms/52xx/efika-setup.c
deleted file mode 100644 (file)
index 110c980..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- *
- * Efika 5K2 platform setup
- * Some code really inspired from the lite5200b platform.
- * 
- * Copyright (C) 2006 bplan GmbH
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2. This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- *
- */
-
-#include <linux/errno.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/reboot.h>
-#include <linux/init.h>
-#include <linux/utsrelease.h>
-#include <linux/seq_file.h>
-#include <linux/root_dev.h>
-#include <linux/initrd.h>
-#include <linux/timer.h>
-#include <linux/pci.h>
-
-#include <asm/pgtable.h>
-#include <asm/prom.h>
-#include <asm/time.h>
-#include <asm/machdep.h>
-#include <asm/rtas.h>
-#include <asm/of_device.h>
-#include <asm/of_platform.h>
-#include <asm/mpc52xx.h>
-
-#include "efika.h"
-
-static void efika_show_cpuinfo(struct seq_file *m)
-{
-       struct device_node *root;
-       const char *revision = NULL;
-       const char *codegendescription = NULL;
-       const char *codegenvendor = NULL;
-
-       root = of_find_node_by_path("/");
-       if (root) {
-               revision = get_property(root, "revision", NULL);
-               codegendescription =
-                   get_property(root, "CODEGEN,description", NULL);
-               codegenvendor = get_property(root, "CODEGEN,vendor", NULL);
-
-               of_node_put(root);
-       }
-
-       if (codegendescription)
-               seq_printf(m, "machine\t\t: %s\n", codegendescription);
-       else
-               seq_printf(m, "machine\t\t: Efika\n");
-
-       if (revision)
-               seq_printf(m, "revision\t: %s\n", revision);
-
-       if (codegenvendor)
-               seq_printf(m, "vendor\t\t: %s\n", codegenvendor);
-
-       of_node_put(root);
-}
-
-static void __init efika_setup_arch(void)
-{
-       rtas_initialize();
-
-#ifdef CONFIG_BLK_DEV_INITRD
-       initrd_below_start_ok = 1;
-
-       if (initrd_start)
-               ROOT_DEV = Root_RAM0;
-       else
-#endif
-               ROOT_DEV = Root_SDA2;   /* sda2 (sda1 is for the kernel) */
-
-       efika_pcisetup();
-
-       if (ppc_md.progress)
-               ppc_md.progress("Linux/PPC " UTS_RELEASE " runnung on Efika ;-)\n", 0x0);
-}
-
-static void __init efika_init(void)
-{
-       struct device_node *np;
-       struct device_node *cnp = NULL;
-       const u32 *base;
-
-       /* Find every child of the SOC node and add it to of_platform */
-       np = of_find_node_by_name(NULL, "builtin");
-       if (np) {
-               char name[BUS_ID_SIZE];
-               while ((cnp = of_get_next_child(np, cnp))) {
-                       strcpy(name, cnp->name);
-
-                       base = get_property(cnp, "reg", NULL);
-                       if (base == NULL)
-                               continue;
-
-                       snprintf(name+strlen(name), BUS_ID_SIZE, "@%x", *base);
-                       of_platform_device_create(cnp, name, NULL);
-
-                       printk(KERN_INFO EFIKA_PLATFORM_NAME" : Added %s (type '%s' at '%s') to the known devices\n", name, cnp->type, cnp->full_name);
-               }
-       }
-
-       if (ppc_md.progress)
-               ppc_md.progress("  Have fun with your Efika!    ", 0x7777);
-}
-
-static int __init efika_probe(void)
-{
-       char *model = of_get_flat_dt_prop(of_get_flat_dt_root(),
-                                         "model", NULL);
-
-       if (model == NULL)
-               return 0;
-       if (strcmp(model, "EFIKA5K2"))
-               return 0;
-
-       ISA_DMA_THRESHOLD = ~0L;
-       DMA_MODE_READ = 0x44;
-       DMA_MODE_WRITE = 0x48;
-
-       return 1;
-}
-
-define_machine(efika)
-{
-       .name = EFIKA_PLATFORM_NAME,
-       .probe = efika_probe,
-       .setup_arch = efika_setup_arch,
-       .init = efika_init,
-       .show_cpuinfo = efika_show_cpuinfo,
-       .init_IRQ = mpc52xx_init_irq,
-       .get_irq = mpc52xx_get_irq,
-       .restart = rtas_restart,
-       .power_off = rtas_power_off,
-       .halt = rtas_halt,
-       .set_rtc_time = rtas_set_rtc_time,
-       .get_rtc_time = rtas_get_rtc_time,
-       .progress = rtas_progress,
-       .get_boot_time = rtas_get_boot_time,
-       .calibrate_decr = generic_calibrate_decr,
-       .phys_mem_access_prot = pci_phys_mem_access_prot,
-};
diff --git a/arch/powerpc/platforms/52xx/efika.c b/arch/powerpc/platforms/52xx/efika.c
new file mode 100644 (file)
index 0000000..8de0341
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+ * Efika 5K2 platform code
+ * Some code really inspired from the lite5200b platform.
+ *
+ * Copyright (C) 2006 bplan GmbH
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#include <linux/errno.h>
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/reboot.h>
+#include <linux/init.h>
+#include <linux/utsrelease.h>
+#include <linux/seq_file.h>
+#include <linux/string.h>
+#include <linux/root_dev.h>
+#include <linux/initrd.h>
+#include <linux/timer.h>
+#include <linux/pci.h>
+
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/sections.h>
+#include <asm/pci-bridge.h>
+#include <asm/pgtable.h>
+#include <asm/prom.h>
+#include <asm/time.h>
+#include <asm/machdep.h>
+#include <asm/rtas.h>
+#include <asm/of_device.h>
+#include <asm/of_platform.h>
+#include <asm/mpc52xx.h>
+
+
+#define EFIKA_PLATFORM_NAME "Efika"
+
+
+/* ------------------------------------------------------------------------ */
+/* PCI accesses thru RTAS                                                   */
+/* ------------------------------------------------------------------------ */
+
+#ifdef CONFIG_PCI
+
+/*
+ * Access functions for PCI config space using RTAS calls.
+ */
+static int rtas_read_config(struct pci_bus *bus, unsigned int devfn, int offset,
+                           int len, u32 * val)
+{
+       struct pci_controller *hose = bus->sysdata;
+       unsigned long addr = (offset & 0xff) | ((devfn & 0xff) << 8)
+           | (((bus->number - hose->first_busno) & 0xff) << 16)
+           | (hose->index << 24);
+       int ret = -1;
+       int rval;
+
+       rval = rtas_call(rtas_token("read-pci-config"), 2, 2, &ret, addr, len);
+       *val = ret;
+       return rval ? PCIBIOS_DEVICE_NOT_FOUND : PCIBIOS_SUCCESSFUL;
+}
+
+static int rtas_write_config(struct pci_bus *bus, unsigned int devfn,
+                            int offset, int len, u32 val)
+{
+       struct pci_controller *hose = bus->sysdata;
+       unsigned long addr = (offset & 0xff) | ((devfn & 0xff) << 8)
+           | (((bus->number - hose->first_busno) & 0xff) << 16)
+           | (hose->index << 24);
+       int rval;
+
+       rval = rtas_call(rtas_token("write-pci-config"), 3, 1, NULL,
+                        addr, len, val);
+       return rval ? PCIBIOS_DEVICE_NOT_FOUND : PCIBIOS_SUCCESSFUL;
+}
+
+static struct pci_ops rtas_pci_ops = {
+       rtas_read_config,
+       rtas_write_config
+};
+
+
+void __init efika_pcisetup(void)
+{
+       const int *bus_range;
+       int len;
+       struct pci_controller *hose;
+       struct device_node *root;
+       struct device_node *pcictrl;
+
+       root = of_find_node_by_path("/");
+       if (root == NULL) {
+               printk(KERN_WARNING EFIKA_PLATFORM_NAME
+                      ": Unable to find the root node\n");
+               return;
+       }
+
+       for (pcictrl = NULL;;) {
+               pcictrl = of_get_next_child(root, pcictrl);
+               if ((pcictrl == NULL) || (strcmp(pcictrl->name, "pci") == 0))
+                       break;
+       }
+
+       of_node_put(root);
+
+       if (pcictrl == NULL) {
+               printk(KERN_WARNING EFIKA_PLATFORM_NAME
+                      ": Unable to find the PCI bridge node\n");
+               return;
+       }
+
+       bus_range = get_property(pcictrl, "bus-range", &len);
+       if (bus_range == NULL || len < 2 * sizeof(int)) {
+               printk(KERN_WARNING EFIKA_PLATFORM_NAME
+                      ": Can't get bus-range for %s\n", pcictrl->full_name);
+               return;
+       }
+
+       if (bus_range[1] == bus_range[0])
+               printk(KERN_INFO EFIKA_PLATFORM_NAME ": PCI bus %d",
+                      bus_range[0]);
+       else
+               printk(KERN_INFO EFIKA_PLATFORM_NAME ": PCI buses %d..%d",
+                      bus_range[0], bus_range[1]);
+       printk(" controlled by %s\n", pcictrl->full_name);
+       printk("\n");
+
+       hose = pcibios_alloc_controller();
+       if (!hose) {
+               printk(KERN_WARNING EFIKA_PLATFORM_NAME
+                      ": Can't allocate PCI controller structure for %s\n",
+                      pcictrl->full_name);
+               return;
+       }
+
+       hose->arch_data = of_node_get(pcictrl);
+       hose->first_busno = bus_range[0];
+       hose->last_busno = bus_range[1];
+       hose->ops = &rtas_pci_ops;
+
+       pci_process_bridge_OF_ranges(hose, pcictrl, 0);
+}
+
+#else
+void __init efika_pcisetup(void)
+{}
+#endif
+
+
+
+/* ------------------------------------------------------------------------ */
+/* Platform setup                                                           */
+/* ------------------------------------------------------------------------ */
+
+static void efika_show_cpuinfo(struct seq_file *m)
+{
+       struct device_node *root;
+       const char *revision = NULL;
+       const char *codegendescription = NULL;
+       const char *codegenvendor = NULL;
+
+       root = of_find_node_by_path("/");
+       if (!root)
+               return;
+
+       revision = get_property(root, "revision", NULL);
+       codegendescription =
+                   get_property(root, "CODEGEN,description", NULL);
+       codegenvendor = get_property(root, "CODEGEN,vendor", NULL);
+
+       if (codegendescription)
+               seq_printf(m, "machine\t\t: %s\n", codegendescription);
+       else
+               seq_printf(m, "machine\t\t: Efika\n");
+
+       if (revision)
+               seq_printf(m, "revision\t: %s\n", revision);
+
+       if (codegenvendor)
+               seq_printf(m, "vendor\t\t: %s\n", codegenvendor);
+
+       of_node_put(root);
+}
+
+static void __init efika_setup_arch(void)
+{
+       rtas_initialize();
+
+#ifdef CONFIG_BLK_DEV_INITRD
+       initrd_below_start_ok = 1;
+
+       if (initrd_start)
+               ROOT_DEV = Root_RAM0;
+       else
+#endif
+               ROOT_DEV = Root_SDA2;   /* sda2 (sda1 is for the kernel) */
+
+       efika_pcisetup();
+
+       if (ppc_md.progress)
+               ppc_md.progress("Linux/PPC " UTS_RELEASE " running on Efika ;-)\n", 0x0);
+}
+
+static int __init efika_probe(void)
+{
+       char *model = of_get_flat_dt_prop(of_get_flat_dt_root(),
+                                         "model", NULL);
+
+       if (model == NULL)
+               return 0;
+       if (strcmp(model, "EFIKA5K2"))
+               return 0;
+
+       ISA_DMA_THRESHOLD = ~0L;
+       DMA_MODE_READ = 0x44;
+       DMA_MODE_WRITE = 0x48;
+
+       return 1;
+}
+
+define_machine(efika)
+{
+       .name                   = EFIKA_PLATFORM_NAME,
+       .probe                  = efika_probe,
+       .setup_arch             = efika_setup_arch,
+       .init                   = mpc52xx_declare_of_platform_devices,
+       .show_cpuinfo           = efika_show_cpuinfo,
+       .init_IRQ               = mpc52xx_init_irq,
+       .get_irq                = mpc52xx_get_irq,
+       .restart                = rtas_restart,
+       .power_off              = rtas_power_off,
+       .halt                   = rtas_halt,
+       .set_rtc_time           = rtas_set_rtc_time,
+       .get_rtc_time           = rtas_get_rtc_time,
+       .progress               = rtas_progress,
+       .get_boot_time          = rtas_get_boot_time,
+       .calibrate_decr         = generic_calibrate_decr,
+       .phys_mem_access_prot   = pci_phys_mem_access_prot,
+};
+
diff --git a/arch/powerpc/platforms/52xx/efika.h b/arch/powerpc/platforms/52xx/efika.h
deleted file mode 100644 (file)
index 2f060fd..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Efika 5K2 platform setup - Header file
- *
- * Copyright (C) 2006 bplan GmbH
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2. This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- *
- */
-
-#ifndef __ARCH_POWERPC_EFIKA__
-#define __ARCH_POWERPC_EFIKA__
-
-#define EFIKA_PLATFORM_NAME "Efika"
-
-extern void __init efika_pcisetup(void);
-
-#endif
index cdb16bfa6ca67976cc7dfba0499ef4b6839ffc55..cc3b40de21ddf8ef3351694d593568be95601b2a 100644 (file)
  */
 
 static void __init
-lite52xx_setup_cpu(void)
+lite5200_setup_cpu(void)
 {
        struct mpc52xx_gpio __iomem *gpio;
        u32 port_config;
 
        /* Map zones */
-       gpio = mpc52xx_find_and_map("mpc52xx-gpio");
+       gpio = mpc52xx_find_and_map("mpc5200-gpio");
        if (!gpio) {
                printk(KERN_ERR __FILE__ ": "
                        "Error while mapping GPIO register for port config. "
@@ -85,12 +85,12 @@ error:
        iounmap(gpio);
 }
 
-static void __init lite52xx_setup_arch(void)
+static void __init lite5200_setup_arch(void)
 {
        struct device_node *np;
 
        if (ppc_md.progress)
-               ppc_md.progress("lite52xx_setup_arch()", 0);
+               ppc_md.progress("lite5200_setup_arch()", 0);
 
        np = of_find_node_by_type(NULL, "cpu");
        if (np) {
@@ -105,7 +105,7 @@ static void __init lite52xx_setup_arch(void)
 
        /* CPU & Port mux setup */
        mpc52xx_setup_cpu();    /* Generic */
-       lite52xx_setup_cpu();   /* Platorm specific */
+       lite5200_setup_cpu();   /* Platorm specific */
 
 #ifdef CONFIG_PCI
        np = of_find_node_by_type(np, "pci");
@@ -126,7 +126,7 @@ static void __init lite52xx_setup_arch(void)
 
 }
 
-void lite52xx_show_cpuinfo(struct seq_file *m)
+void lite5200_show_cpuinfo(struct seq_file *m)
 {
        struct device_node* np = of_find_all_nodes(NULL);
        const char *model = NULL;
@@ -143,25 +143,26 @@ void lite52xx_show_cpuinfo(struct seq_file *m)
 /*
  * Called very early, MMU is off, device-tree isn't unflattened
  */
-static int __init lite52xx_probe(void)
+static int __init lite5200_probe(void)
 {
        unsigned long node = of_get_flat_dt_root();
        const char *model = of_get_flat_dt_prop(node, "model", NULL);
 
-       if (!of_flat_dt_is_compatible(node, "lite52xx"))
+       if (!of_flat_dt_is_compatible(node, "fsl,lite5200") &&
+           !of_flat_dt_is_compatible(node, "fsl,lite5200b"))
                return 0;
-       pr_debug("%s board w/ mpc52xx found\n", model ? model : "unknown");
+       pr_debug("%s board found\n", model ? model : "unknown");
 
        return 1;
 }
 
-define_machine(lite52xx) {
-       .name           = "lite52xx",
-       .probe          = lite52xx_probe,
-       .setup_arch     = lite52xx_setup_arch,
+define_machine(lite5200) {
+       .name           = "lite5200",
+       .probe          = lite5200_probe,
+       .setup_arch     = lite5200_setup_arch,
        .init           = mpc52xx_declare_of_platform_devices,
        .init_IRQ       = mpc52xx_init_irq,
        .get_irq        = mpc52xx_get_irq,
-       .show_cpuinfo   = lite52xx_show_cpuinfo,
+       .show_cpuinfo   = lite5200_show_cpuinfo,
        .calibrate_decr = generic_calibrate_decr,
 };
index cc40889074bd1f6c88e07a619f40186a047546d3..ed0cb694aea878692e329f941e7ce40aaf0d7a1d 100644 (file)
@@ -83,8 +83,8 @@ mpc52xx_setup_cpu(void)
        struct mpc52xx_xlb  __iomem *xlb;
 
        /* Map zones */
-       cdm = mpc52xx_find_and_map("mpc52xx-cdm");
-       xlb = mpc52xx_find_and_map("mpc52xx-xlb");
+       cdm = mpc52xx_find_and_map("mpc5200-cdm");
+       xlb = mpc52xx_find_and_map("mpc5200-xlb");
 
        if (!cdm || !xlb) {
                printk(KERN_ERR __FILE__ ": "
index cd91a6c3aafa5b90edaaf0cf5c07f1e96871713b..c75192567e5573e2292dfb98f4fc7f433552e1d1 100644 (file)
@@ -383,16 +383,16 @@ void __init mpc52xx_init_irq(void)
        struct device_node *picnode;
 
        /* Remap the necessary zones */
-       picnode = of_find_compatible_node(NULL, NULL, "mpc52xx-pic");
+       picnode = of_find_compatible_node(NULL, NULL, "mpc5200-pic");
 
-       intr = mpc52xx_find_and_map("mpc52xx-pic");
+       intr = mpc52xx_find_and_map("mpc5200-pic");
        if (!intr)
-               panic(__FILE__  ": find_and_map failed on 'mpc52xx-pic'. "
+               panic(__FILE__  ": find_and_map failed on 'mpc5200-pic'. "
                                "Check node !");
 
-       sdma = mpc52xx_find_and_map("mpc52xx-bestcomm");
+       sdma = mpc52xx_find_and_map("mpc5200-bestcomm");
        if (!sdma)
-               panic(__FILE__  ": find_and_map failed on 'mpc52xx-bestcomm'. "
+               panic(__FILE__  ": find_and_map failed on 'mpc5200-bestcomm'. "
                                "Check node !");
 
        /* Disable all interrupt sources. */
index edcd5b875b6699e8a3f2f8dc21c63f541d37eae1..1aea1e69ff31c3ac562326d4a4e4900afa1d1a8c 100644 (file)
@@ -3,7 +3,13 @@ menu "Platform support"
 
 choice
        prompt "Machine Type"
-       default MPC834x_SYS
+       default MPC834x_MDS
+
+config MPC8313_RDB
+       bool "Freescale MPC8313 RDB"
+       select DEFAULT_UIMAGE
+       help
+         This option enables support for the MPC8313 RDB board.
 
 config MPC832x_MDS
        bool "Freescale MPC832x MDS"
@@ -12,13 +18,13 @@ config MPC832x_MDS
        help
          This option enables support for the MPC832x MDS evaluation board.
 
-config MPC834x_SYS
-       bool "Freescale MPC834x SYS"
+config MPC834x_MDS
+       bool "Freescale MPC834x MDS"
        select DEFAULT_UIMAGE
        help
-         This option enables support for the MPC 834x SYS evaluation board.
+         This option enables support for the MPC 834x MDS evaluation board.
 
-         Be aware that PCI buses can only function when SYS board is plugged
+         Be aware that PCI buses can only function when MDS board is plugged
          into the PIB (Platform IO Board) board from Freescale which provide
          3 PCI slots.  The PIBs PCI initialization is the bootloader's
          responsibility.
@@ -41,6 +47,12 @@ config MPC8360E_PB
 
 endchoice
 
+config PPC_MPC831x
+       bool
+       select PPC_UDBG_16550
+       select PPC_INDIRECT_PCI
+       default y if MPC8313_RDB
+
 config PPC_MPC832x
        bool
        select PPC_UDBG_16550
@@ -51,7 +63,7 @@ config MPC834x
        bool
        select PPC_UDBG_16550
        select PPC_INDIRECT_PCI
-       default y if MPC834x_SYS || MPC834x_ITX
+       default y if MPC834x_MDS || MPC834x_ITX
 
 config PPC_MPC836x
        bool
index f1aa7e24a9382de1f18153dca7ce5a4da2c305fe..6c8199c4c38214c1da86b58f77137b39486a1b99 100644 (file)
@@ -3,7 +3,8 @@
 #
 obj-y                          := misc.o
 obj-$(CONFIG_PCI)              += pci.o
-obj-$(CONFIG_MPC834x_SYS)      += mpc834x_sys.o
+obj-$(CONFIG_MPC8313_RDB)      += mpc8313_rdb.o
+obj-$(CONFIG_MPC834x_MDS)      += mpc834x_mds.o
 obj-$(CONFIG_MPC834x_ITX)      += mpc834x_itx.o
 obj-$(CONFIG_MPC8360E_PB)      += mpc8360e_pb.o
 obj-$(CONFIG_MPC832x_MDS)      += mpc832x_mds.o
diff --git a/arch/powerpc/platforms/83xx/mpc8313_rdb.c b/arch/powerpc/platforms/83xx/mpc8313_rdb.c
new file mode 100644 (file)
index 0000000..c3b98c3
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * arch/powerpc/platforms/83xx/mpc8313_rdb.c
+ *
+ * Description: MPC8313x RDB board specific routines.
+ * This file is based on mpc834x_sys.c
+ * Author: Lo Wlison <r43300@freescale.com>
+ *
+ * Copyright (C) Freescale Semiconductor, Inc. 2006. 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.
+ */
+
+#include <linux/pci.h>
+
+#include <asm/time.h>
+#include <asm/ipic.h>
+#include <asm/udbg.h>
+
+#include "mpc83xx.h"
+
+#undef DEBUG
+#ifdef DEBUG
+#define DBG(fmt...) udbg_printf(fmt)
+#else
+#define DBG(fmt...)
+#endif
+
+#ifndef CONFIG_PCI
+unsigned long isa_io_base = 0;
+unsigned long isa_mem_base = 0;
+#endif
+
+/* ************************************************************************
+ *
+ * Setup the architecture
+ *
+ */
+static void __init mpc8313_rdb_setup_arch(void)
+{
+       struct device_node *np;
+
+       if (ppc_md.progress)
+               ppc_md.progress("mpc8313_rdb_setup_arch()", 0);
+
+#ifdef CONFIG_PCI
+       for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
+               add_bridge(np);
+
+       ppc_md.pci_exclude_device = mpc83xx_exclude_device;
+#endif
+}
+
+void __init mpc8313_rdb_init_IRQ(void)
+{
+       struct device_node *np;
+
+       np = of_find_node_by_type(NULL, "ipic");
+       if (!np)
+               return;
+
+       ipic_init(np, 0);
+
+       /* Initialize the default interrupt mapping priorities,
+        * in case the boot rom changed something on us.
+        */
+       ipic_set_default_priority();
+}
+
+/*
+ * Called very early, MMU is off, device-tree isn't unflattened
+ */
+static int __init mpc8313_rdb_probe(void)
+{
+       char *model = of_get_flat_dt_prop(of_get_flat_dt_root(),
+                                         "model", NULL);
+       if (model == NULL)
+               return 0;
+       if (strcmp(model, "MPC8313ERDB"))
+               return 0;
+
+       DBG("MPC8313 RDB found\n");
+
+       return 1;
+}
+
+define_machine(mpc8313_rdb) {
+       .name                   = "MPC8313 RDB",
+       .probe                  = mpc8313_rdb_probe,
+       .setup_arch             = mpc8313_rdb_setup_arch,
+       .init_IRQ               = mpc8313_rdb_init_IRQ,
+       .get_irq                = ipic_get_irq,
+       .restart                = mpc83xx_restart,
+       .time_init              = mpc83xx_time_init,
+       .calibrate_decr         = generic_calibrate_decr,
+       .progress               = udbg_progress,
+};
index 2446dea9407ec17a1a83b90ce225e62389bbe16b..443a3172f370f96295f751e8baafbaddeb9a6acc 100644 (file)
@@ -38,8 +38,6 @@
 
 #include "mpc83xx.h"
 
-#include <platforms/83xx/mpc834x_sys.h>
-
 #ifndef CONFIG_PCI
 unsigned long isa_io_base = 0;
 unsigned long isa_mem_base = 0;
similarity index 56%
rename from arch/powerpc/platforms/83xx/mpc834x_sys.c
rename to arch/powerpc/platforms/83xx/mpc834x_mds.c
index f30393f0b8320343e4ebf8f3c88af9b671ff7cae..d2736da76c46bb63ca3a1ef6e394b0bf1157a53d 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * arch/powerpc/platforms/83xx/mpc834x_sys.c
+ * arch/powerpc/platforms/83xx/mpc834x_mds.c
  *
- * MPC834x SYS board specific routines
+ * MPC834x MDS board specific routines
  *
  * Maintainer: Kumar Gala <galak@kernel.crashing.org>
  *
@@ -43,17 +43,87 @@ unsigned long isa_io_base = 0;
 unsigned long isa_mem_base = 0;
 #endif
 
+#define BCSR5_INT_USB          0x02
+/* Note: This is only for PB, not for PB+PIB
+ * On PB only port0 is connected using ULPI */
+static int mpc834x_usb_cfg(void)
+{
+       unsigned long sccr, sicrl;
+       void __iomem *immap;
+       void __iomem *bcsr_regs = NULL;
+       u8 bcsr5;
+       struct device_node *np = NULL;
+       int port0_is_dr = 0;
+
+       if ((np = of_find_compatible_node(np, "usb", "fsl-usb2-dr")) != NULL)
+               port0_is_dr = 1;
+       if ((np = of_find_compatible_node(np, "usb", "fsl-usb2-mph")) != NULL){
+               if (port0_is_dr) {
+                       printk(KERN_WARNING
+                               "There is only one USB port on PB board! \n");
+                       return -1;
+               } else if (!port0_is_dr)
+                       /* No usb port enabled */
+                       return -1;
+       }
+
+       immap = ioremap(get_immrbase(), 0x1000);
+       if (!immap)
+               return -1;
+
+       /* Configure clock */
+       sccr = in_be32(immap + MPC83XX_SCCR_OFFS);
+       if (port0_is_dr)
+               sccr |= MPC83XX_SCCR_USB_DRCM_11;  /* 1:3 */
+       else
+               sccr |= MPC83XX_SCCR_USB_MPHCM_11; /* 1:3 */
+       out_be32(immap + MPC83XX_SCCR_OFFS, sccr);
+
+       /* Configure Pin */
+       sicrl = in_be32(immap + MPC83XX_SICRL_OFFS);
+       /* set port0 only */
+       if (port0_is_dr)
+               sicrl |= MPC83XX_SICRL_USB0;
+       else
+               sicrl &= ~(MPC83XX_SICRL_USB0);
+       out_be32(immap + MPC83XX_SICRL_OFFS, sicrl);
+
+       iounmap(immap);
+
+       /* Map BCSR area */
+       np = of_find_node_by_name(NULL, "bcsr");
+       if (np != 0) {
+               struct resource res;
+
+               of_address_to_resource(np, 0, &res);
+               bcsr_regs = ioremap(res.start, res.end - res.start + 1);
+               of_node_put(np);
+       }
+       if (!bcsr_regs)
+               return -1;
+
+       /*
+        * if MDS board is plug into PIB board,
+        * force to use the PHY on MDS board
+        */
+       bcsr5 = in_8(bcsr_regs + 5);
+       if (!(bcsr5 & BCSR5_INT_USB))
+               out_8(bcsr_regs + 5, (bcsr5 | BCSR5_INT_USB));
+       iounmap(bcsr_regs);
+       return 0;
+}
+
 /* ************************************************************************
  *
  * Setup the architecture
  *
  */
-static void __init mpc834x_sys_setup_arch(void)
+static void __init mpc834x_mds_setup_arch(void)
 {
        struct device_node *np;
 
        if (ppc_md.progress)
-               ppc_md.progress("mpc834x_sys_setup_arch()", 0);
+               ppc_md.progress("mpc834x_mds_setup_arch()", 0);
 
        np = of_find_node_by_type(NULL, "cpu");
        if (np != 0) {
@@ -65,6 +135,7 @@ static void __init mpc834x_sys_setup_arch(void)
                        loops_per_jiffy = 50000000 / HZ;
                of_node_put(np);
        }
+
 #ifdef CONFIG_PCI
        for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
                add_bridge(np);
@@ -72,6 +143,8 @@ static void __init mpc834x_sys_setup_arch(void)
        ppc_md.pci_exclude_device = mpc83xx_exclude_device;
 #endif
 
+       mpc834x_usb_cfg();
+
 #ifdef  CONFIG_ROOT_NFS
        ROOT_DEV = Root_NFS;
 #else
@@ -79,7 +152,7 @@ static void __init mpc834x_sys_setup_arch(void)
 #endif
 }
 
-static void __init mpc834x_sys_init_IRQ(void)
+static void __init mpc834x_mds_init_IRQ(void)
 {
        struct device_node *np;
 
@@ -119,7 +192,7 @@ late_initcall(mpc834x_rtc_hookup);
 /*
  * Called very early, MMU is off, device-tree isn't unflattened
  */
-static int __init mpc834x_sys_probe(void)
+static int __init mpc834x_mds_probe(void)
 {
        /* We always match for now, eventually we should look at the flat
           dev tree to ensure this is the board we are suppose to run on
@@ -127,11 +200,11 @@ static int __init mpc834x_sys_probe(void)
        return 1;
 }
 
-define_machine(mpc834x_sys) {
-       .name                   = "MPC834x SYS",
-       .probe                  = mpc834x_sys_probe,
-       .setup_arch             = mpc834x_sys_setup_arch,
-       .init_IRQ               = mpc834x_sys_init_IRQ,
+define_machine(mpc834x_mds) {
+       .name                   = "MPC834x MDS",
+       .probe                  = mpc834x_mds_probe,
+       .setup_arch             = mpc834x_mds_setup_arch,
+       .init_IRQ               = mpc834x_mds_init_IRQ,
        .get_irq                = ipic_get_irq,
        .restart                = mpc83xx_restart,
        .time_init              = mpc83xx_time_init,
diff --git a/arch/powerpc/platforms/83xx/mpc834x_sys.h b/arch/powerpc/platforms/83xx/mpc834x_sys.h
deleted file mode 100644 (file)
index 7d5bbef..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * arch/powerpc/platforms/83xx/mpc834x_sys.h
- *
- * MPC834X SYS common board definitions
- *
- * 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 as published by the
- * Free Software Foundation;  either version 2 of the  License, or (at your
- * option) any later version.
- *
- */
-
-#ifndef __MACH_MPC83XX_SYS_H__
-#define __MACH_MPC83XX_SYS_H__
-
-#define PIRQA  MPC83xx_IRQ_EXT4
-#define PIRQB  MPC83xx_IRQ_EXT5
-#define PIRQC  MPC83xx_IRQ_EXT6
-#define PIRQD  MPC83xx_IRQ_EXT7
-
-#endif                         /* __MACH_MPC83XX_SYS_H__ */
index 01cae106912bec714d4df34105c3305971970554..9cd03b59c8f4796a177e8df9801a03cd09d02c5e 100644 (file)
@@ -4,6 +4,24 @@
 #include <linux/init.h>
 #include <linux/device.h>
 
+/* System Clock Control Register */
+#define MPC83XX_SCCR_OFFS          0xA08
+#define MPC83XX_SCCR_USB_MPHCM_11  0x00c00000
+#define MPC83XX_SCCR_USB_MPHCM_01  0x00400000
+#define MPC83XX_SCCR_USB_MPHCM_10  0x00800000
+#define MPC83XX_SCCR_USB_DRCM_11   0x00300000
+#define MPC83XX_SCCR_USB_DRCM_01   0x00100000
+#define MPC83XX_SCCR_USB_DRCM_10   0x00200000
+
+/* system i/o configuration register low */
+#define MPC83XX_SICRL_OFFS         0x114
+#define MPC83XX_SICRL_USB0         0x40000000
+#define MPC83XX_SICRL_USB1         0x20000000
+
+/* system i/o configuration register high */
+#define MPC83XX_SICRH_OFFS         0x118
+#define MPC83XX_SICRH_USB_UTMI     0x00020000
+
 /*
  * Declaration for the various functions exported by the
  * mpc83xx_* files. Mostly for use by mpc83xx_setup
index 0584f3c7e8844559d2ad15622c571fe8cf2cfb68..0efdd2f1babe382bfdae1cd4d6f240c7895215fe 100644 (file)
@@ -23,6 +23,13 @@ config MPC85xx_CDS
        help
          This option enables support for the MPC85xx CDS board
 
+config MPC8568_MDS
+       bool "Freescale MPC8568 MDS"
+       select DEFAULT_UIMAGE
+#      select QUICC_ENGINE
+       help
+         This option enables support for the MPC8568 MDS board
+
 endchoice
 
 config MPC8540
@@ -36,6 +43,12 @@ config MPC8560
        select PPC_INDIRECT_PCI
        default y if MPC8560_ADS
 
+config MPC85xx
+       bool
+       select PPC_UDBG_16550
+       select PPC_INDIRECT_PCI
+       default y if MPC8540_ADS || MPC85xx_CDS || MPC8560_ADS || MPC8568_MDS
+
 config PPC_INDIRECT_PCI_BE
        bool
        depends on PPC_85xx
index 282f5d0d01520a4a83b78b378283e352803d7e5d..e40e521816b8147a1d4e508ee137d69360e94f7e 100644 (file)
@@ -5,3 +5,4 @@ obj-$(CONFIG_PPC_85xx)  += misc.o pci.o
 obj-$(CONFIG_MPC8540_ADS) += mpc85xx_ads.o
 obj-$(CONFIG_MPC8560_ADS) += mpc85xx_ads.o
 obj-$(CONFIG_MPC85xx_CDS) += mpc85xx_cds.o
+obj-$(CONFIG_MPC8568_MDS) += mpc8568_mds.o
diff --git a/arch/powerpc/platforms/85xx/mpc8568_mds.c b/arch/powerpc/platforms/85xx/mpc8568_mds.c
new file mode 100644 (file)
index 0000000..0861d11
--- /dev/null
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) Freescale Semicondutor, Inc. 2006-2007. All rights reserved.
+ *
+ * Author: Andy Fleming <afleming@freescale.com>
+ *
+ * Based on 83xx/mpc8360e_pb.c by:
+ *        Li Yang <LeoLi@freescale.com>
+ *        Yin Olivia <Hong-hua.Yin@freescale.com>
+ *
+ * Description:
+ * MPC8568E MDS PB board specific routines.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/stddef.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/reboot.h>
+#include <linux/pci.h>
+#include <linux/kdev_t.h>
+#include <linux/major.h>
+#include <linux/console.h>
+#include <linux/delay.h>
+#include <linux/seq_file.h>
+#include <linux/root_dev.h>
+#include <linux/initrd.h>
+#include <linux/module.h>
+#include <linux/fsl_devices.h>
+
+#include <asm/of_device.h>
+#include <asm/of_platform.h>
+#include <asm/system.h>
+#include <asm/atomic.h>
+#include <asm/time.h>
+#include <asm/io.h>
+#include <asm/machdep.h>
+#include <asm/bootinfo.h>
+#include <asm/pci-bridge.h>
+#include <asm/mpc85xx.h>
+#include <asm/irq.h>
+#include <mm/mmu_decl.h>
+#include <asm/prom.h>
+#include <asm/udbg.h>
+#include <sysdev/fsl_soc.h>
+#include <asm/qe.h>
+#include <asm/qe_ic.h>
+#include <asm/mpic.h>
+
+#include "mpc85xx.h"
+
+#undef DEBUG
+#ifdef DEBUG
+#define DBG(fmt...) udbg_printf(fmt)
+#else
+#define DBG(fmt...)
+#endif
+
+#ifndef CONFIG_PCI
+unsigned long isa_io_base = 0;
+unsigned long isa_mem_base = 0;
+#endif
+
+/* ************************************************************************
+ *
+ * Setup the architecture
+ *
+ */
+static void __init mpc8568_mds_setup_arch(void)
+{
+       struct device_node *np;
+       static u8 *bcsr_regs = NULL;
+
+
+       if (ppc_md.progress)
+               ppc_md.progress("mpc8568_mds_setup_arch()", 0);
+
+       np = of_find_node_by_type(NULL, "cpu");
+       if (np != NULL) {
+               const unsigned int *fp =
+                   get_property(np, "clock-frequency", NULL);
+               if (fp != NULL)
+                       loops_per_jiffy = *fp / HZ;
+               else
+                       loops_per_jiffy = 50000000 / HZ;
+               of_node_put(np);
+       }
+
+       /* Map BCSR area */
+       np = of_find_node_by_name(NULL, "bcsr");
+       if (np != NULL) {
+               struct resource res;
+
+               of_address_to_resource(np, 0, &res);
+               bcsr_regs = ioremap(res.start, res.end - res.start +1);
+               of_node_put(np);
+       }
+
+#ifdef CONFIG_PCI
+       for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;) {
+               add_bridge(np);
+       }
+       of_node_put(np);
+#endif
+
+#ifdef CONFIG_QUICC_ENGINE
+       if ((np = of_find_node_by_name(NULL, "qe")) != NULL) {
+               qe_reset();
+               of_node_put(np);
+       }
+
+       if ((np = of_find_node_by_name(NULL, "par_io")) != NULL) {
+               struct device_node *ucc = NULL;
+
+               par_io_init(np);
+               of_node_put(np);
+
+               for ( ;(ucc = of_find_node_by_name(ucc, "ucc")) != NULL;)
+                       par_io_of_config(ucc);
+
+               of_node_put(ucc);
+       }
+
+       if (bcsr_regs) {
+               u8 bcsr_phy;
+
+               /* Reset the Ethernet PHY */
+               bcsr_phy = in_be8(&bcsr_regs[9]);
+               bcsr_phy &= ~0x20;
+               out_be8(&bcsr_regs[9], bcsr_phy);
+
+               udelay(1000);
+
+               bcsr_phy = in_be8(&bcsr_regs[9]);
+               bcsr_phy |= 0x20;
+               out_be8(&bcsr_regs[9], bcsr_phy);
+
+               iounmap(bcsr_regs);
+       }
+
+#endif /* CONFIG_QUICC_ENGINE */
+}
+
+static struct of_device_id mpc8568_ids[] = {
+       { .type = "soc", },
+       { .compatible = "soc", },
+       { .type = "qe", },
+       {},
+};
+
+static int __init mpc8568_publish_devices(void)
+{
+       if (!machine_is(mpc8568_mds))
+               return 0;
+
+       /* Publish the QE devices */
+       of_platform_bus_probe(NULL,mpc8568_ids,NULL);
+
+       return 0;
+}
+device_initcall(mpc8568_publish_devices);
+
+static void __init mpc8568_mds_pic_init(void)
+{
+       struct mpic *mpic;
+       struct resource r;
+       struct device_node *np = NULL;
+
+       np = of_find_node_by_type(NULL, "open-pic");
+       if (!np)
+               return;
+
+       if (of_address_to_resource(np, 0, &r)) {
+               printk(KERN_ERR "Failed to map mpic register space\n");
+               of_node_put(np);
+               return;
+       }
+
+       mpic = mpic_alloc(np, r.start,
+                       MPIC_PRIMARY | MPIC_WANTS_RESET | MPIC_BIG_ENDIAN,
+                       4, 0, " OpenPIC  ");
+       BUG_ON(mpic == NULL);
+       of_node_put(np);
+
+       /* Internal Interrupts */
+       mpic_assign_isu(mpic, 0, r.start + 0x10200);
+       mpic_assign_isu(mpic, 1, r.start + 0x10280);
+       mpic_assign_isu(mpic, 2, r.start + 0x10300);
+       mpic_assign_isu(mpic, 3, r.start + 0x10380);
+       mpic_assign_isu(mpic, 4, r.start + 0x10400);
+       mpic_assign_isu(mpic, 5, r.start + 0x10480);
+       mpic_assign_isu(mpic, 6, r.start + 0x10500);
+       mpic_assign_isu(mpic, 7, r.start + 0x10580);
+       mpic_assign_isu(mpic, 8, r.start + 0x10600);
+       mpic_assign_isu(mpic, 9, r.start + 0x10680);
+       mpic_assign_isu(mpic, 10, r.start + 0x10700);
+       mpic_assign_isu(mpic, 11, r.start + 0x10780);
+
+       /* External Interrupts */
+       mpic_assign_isu(mpic, 12, r.start + 0x10000);
+       mpic_assign_isu(mpic, 13, r.start + 0x10080);
+       mpic_assign_isu(mpic, 14, r.start + 0x10100);
+
+       mpic_init(mpic);
+
+
+#ifdef CONFIG_QUICC_ENGINE
+       np = of_find_node_by_type(NULL, "qeic");
+       if (!np)
+               return;
+
+       qe_ic_init(np, 0);
+       of_node_put(np);
+#endif                         /* CONFIG_QUICC_ENGINE */
+}
+
+
+static int __init mpc8568_mds_probe(void)
+{
+       char *model = of_get_flat_dt_prop(of_get_flat_dt_root(),
+                                         "model", NULL);
+       if (model == NULL)
+               return 0;
+       if (strcmp(model, "MPC8568EMDS"))
+               return 0;
+
+       DBG("MPC8568EMDS found\n");
+
+       return 1;
+}
+
+
+define_machine(mpc8568_mds) {
+       .name           = "MPC8568E MDS",
+       .probe          = mpc8568_mds_probe,
+       .setup_arch     = mpc8568_mds_setup_arch,
+       .init_IRQ       = mpc8568_mds_pic_init,
+       .get_irq        = mpic_get_irq,
+       .restart        = mpc85xx_restart,
+       .calibrate_decr = generic_calibrate_decr,
+       .progress       = udbg_progress,
+};
index bda2e55e6c4c1db7e5f84eadd8a2c18d18682894..c56fce57621c1cb5c943fbfeb94de26c8c3e1cd8 100644 (file)
@@ -45,8 +45,7 @@ unsigned long isa_mem_base = 0;
 #endif
 
 #ifdef CONFIG_PCI
-int
-mpc85xx_exclude_device(u_char bus, u_char devfn)
+static int mpc85xx_exclude_device(u_char bus, u_char devfn)
 {
        if (bus == 0 && PCI_SLOT(devfn) == 0)
                return PCIBIOS_DEVICE_NOT_FOUND;
@@ -69,7 +68,7 @@ static void cpm2_cascade(unsigned int irq, struct irq_desc *desc)
 
 #endif /* CONFIG_CPM2 */
 
-void __init mpc85xx_ads_pic_init(void)
+static void __init mpc85xx_ads_pic_init(void)
 {
        struct mpic *mpic;
        struct resource r;
@@ -254,7 +253,7 @@ static void __init mpc85xx_ads_setup_arch(void)
 #endif
 }
 
-void mpc85xx_ads_show_cpuinfo(struct seq_file *m)
+static void mpc85xx_ads_show_cpuinfo(struct seq_file *m)
 {
        uint pvid, svid, phid1;
        uint memsize = total_memory;
index 953cd5dd3f54df1fff74edd4c5253e7ec40182b4..abc0aca6de4052760ce9b6204eec9604c0a3cef1 100644 (file)
@@ -56,7 +56,6 @@ unsigned long isa_mem_base = 0;
 static int cds_pci_slot = 2;
 static volatile u8 *cadmus;
 
-
 #ifdef CONFIG_PCI
 
 #define ARCADIA_HOST_BRIDGE_IDSEL      17
@@ -64,8 +63,7 @@ static volatile u8 *cadmus;
 
 extern int mpc85xx_pci2_busno;
 
-int
-mpc85xx_exclude_device(u_char bus, u_char devfn)
+static int mpc85xx_exclude_device(u_char bus, u_char devfn)
 {
        if (bus == 0 && PCI_SLOT(devfn) == 0)
                return PCIBIOS_DEVICE_NOT_FOUND;
@@ -81,8 +79,7 @@ mpc85xx_exclude_device(u_char bus, u_char devfn)
                return PCIBIOS_SUCCESSFUL;
 }
 
-void __init
-mpc85xx_cds_pcibios_fixup(void)
+static void __init mpc85xx_cds_pcibios_fixup(void)
 {
        struct pci_dev *dev;
        u_char          c;
@@ -144,7 +141,7 @@ static void mpc85xx_8259_cascade(unsigned int irq, struct irq_desc *desc)
 #endif /* PPC_I8259 */
 #endif /* CONFIG_PCI */
 
-void __init mpc85xx_cds_pic_init(void)
+static void __init mpc85xx_cds_pic_init(void)
 {
        struct mpic *mpic;
        struct resource r;
@@ -224,12 +221,10 @@ void __init mpc85xx_cds_pic_init(void)
 #endif /* CONFIG_PPC_I8259 */
 }
 
-
 /*
  * Setup the architecture
  */
-static void __init
-mpc85xx_cds_setup_arch(void)
+static void __init mpc85xx_cds_setup_arch(void)
 {
        struct device_node *cpu;
 #ifdef CONFIG_PCI
@@ -276,9 +271,7 @@ mpc85xx_cds_setup_arch(void)
 #endif
 }
 
-
-void
-mpc85xx_cds_show_cpuinfo(struct seq_file *m)
+static void mpc85xx_cds_show_cpuinfo(struct seq_file *m)
 {
        uint pvid, svid, phid1;
        uint memsize = total_memory;
index 65e612315b9bd6e4f80314a95a8f0a5cd179e046..452004283f1707b31625428f93da4ddc39fcafcf 100644 (file)
@@ -5,9 +5,9 @@ ifeq ($(CONFIG_PPC64),y)
 obj-$(CONFIG_PPC_PMAC)         += powermac/
 endif
 endif
-obj-$(CONFIG_PPC_MPC52xx)      += 52xx/
 obj-$(CONFIG_PPC_CHRP)         += chrp/
 obj-$(CONFIG_4xx)              += 4xx/
+obj-$(CONFIG_PPC_MPC52xx)      += 52xx/
 obj-$(CONFIG_PPC_8xx)          += 8xx/
 obj-$(CONFIG_PPC_82xx)         += 82xx/
 obj-$(CONFIG_PPC_83xx)         += 83xx/
index d04ae1671e6ce5d40f413f820efeb645169d3ba2..66ca4b5a1dbc6cab284962aec94ac9a38f2da189 100644 (file)
@@ -345,18 +345,12 @@ EXPORT_SYMBOL_GPL(cbe_read_trace_buffer);
  * Enabling/disabling interrupts for the entire performance monitoring unit.
  */
 
-u32 cbe_query_pm_interrupts(u32 cpu)
-{
-       return cbe_read_pm(cpu, pm_status);
-}
-EXPORT_SYMBOL_GPL(cbe_query_pm_interrupts);
-
-u32 cbe_clear_pm_interrupts(u32 cpu)
+u32 cbe_get_and_clear_pm_interrupts(u32 cpu)
 {
        /* Reading pm_status clears the interrupt bits. */
-       return cbe_query_pm_interrupts(cpu);
+       return cbe_read_pm(cpu, pm_status);
 }
-EXPORT_SYMBOL_GPL(cbe_clear_pm_interrupts);
+EXPORT_SYMBOL_GPL(cbe_get_and_clear_pm_interrupts);
 
 void cbe_enable_pm_interrupts(u32 cpu, u32 thread, u32 mask)
 {
@@ -371,7 +365,7 @@ EXPORT_SYMBOL_GPL(cbe_enable_pm_interrupts);
 
 void cbe_disable_pm_interrupts(u32 cpu)
 {
-       cbe_clear_pm_interrupts(cpu);
+       cbe_get_and_clear_pm_interrupts(cpu);
        cbe_write_pm(cpu, pm_status, 0);
 }
 EXPORT_SYMBOL_GPL(cbe_disable_pm_interrupts);
index d8b39fe39cddc9be1872e5f75fd59ccd2cd3ab23..e34599f53d284250b4174b90f6bbaaa9daab99ba 100644 (file)
@@ -59,63 +59,6 @@ static u64 __init find_spu_unit_number(struct device_node *spe)
        return 0;
 }
 
-static int __init cell_spuprop_present(struct spu *spu, struct device_node *spe,
-               const char *prop)
-{
-       const struct address_prop {
-               unsigned long address;
-               unsigned int len;
-       } __attribute__((packed)) *p;
-       int proplen;
-
-       unsigned long start_pfn, nr_pages;
-       struct pglist_data *pgdata;
-       struct zone *zone;
-       int ret;
-
-       p = get_property(spe, prop, &proplen);
-       WARN_ON(proplen != sizeof (*p));
-
-       start_pfn = p->address >> PAGE_SHIFT;
-       nr_pages = ((unsigned long)p->len + PAGE_SIZE - 1) >> PAGE_SHIFT;
-
-       pgdata = NODE_DATA(spu->node);
-       zone = pgdata->node_zones;
-
-       ret = __add_pages(zone, start_pfn, nr_pages);
-
-       return ret;
-}
-
-static void __iomem * __init map_spe_prop(struct spu *spu,
-               struct device_node *n, const char *name)
-{
-       const struct address_prop {
-               unsigned long address;
-               unsigned int len;
-       } __attribute__((packed)) *prop;
-
-       const void *p;
-       int proplen;
-       void __iomem *ret = NULL;
-       int err = 0;
-
-       p = get_property(n, name, &proplen);
-       if (proplen != sizeof (struct address_prop))
-               return NULL;
-
-       prop = p;
-
-       err = cell_spuprop_present(spu, n, name);
-       if (err && (err != -EEXIST))
-               goto out;
-
-       ret = ioremap(prop->address, prop->len);
-
- out:
-       return ret;
-}
-
 static void spu_unmap(struct spu *spu)
 {
        if (!firmware_has_feature(FW_FEATURE_LPAR))
@@ -157,6 +100,23 @@ static int __init spu_map_interrupts_old(struct spu *spu,
        return spu->irqs[2] == NO_IRQ ? -EINVAL : 0;
 }
 
+static void __iomem * __init spu_map_prop_old(struct spu *spu,
+                                             struct device_node *n,
+                                             const char *name)
+{
+       const struct address_prop {
+               unsigned long address;
+               unsigned int len;
+       } __attribute__((packed)) *prop;
+       int proplen;
+
+       prop = get_property(n, name, &proplen);
+       if (prop == NULL || proplen != sizeof (struct address_prop))
+               return NULL;
+
+       return ioremap(prop->address, prop->len);
+}
+
 static int __init spu_map_device_old(struct spu *spu)
 {
        struct device_node *node = spu->devnode;
@@ -175,7 +135,7 @@ static int __init spu_map_device_old(struct spu *spu)
 
        /* we use local store as ram, not io memory */
        spu->local_store = (void __force *)
-               map_spe_prop(spu, node, "local-store");
+               spu_map_prop_old(spu, node, "local-store");
        if (!spu->local_store)
                goto out;
 
@@ -184,16 +144,16 @@ static int __init spu_map_device_old(struct spu *spu)
                goto out_unmap;
        spu->problem_phys = *(unsigned long *)prop;
 
-       spu->problem = map_spe_prop(spu, node, "problem");
+       spu->problem = spu_map_prop_old(spu, node, "problem");
        if (!spu->problem)
                goto out_unmap;
 
-       spu->priv2 = map_spe_prop(spu, node, "priv2");
+       spu->priv2 = spu_map_prop_old(spu, node, "priv2");
        if (!spu->priv2)
                goto out_unmap;
 
        if (!firmware_has_feature(FW_FEATURE_LPAR)) {
-               spu->priv1 = map_spe_prop(spu, node, "priv1");
+               spu->priv1 = spu_map_prop_old(spu, node, "priv1");
                if (!spu->priv1)
                        goto out_unmap;
        }
@@ -245,34 +205,20 @@ static int spu_map_resource(struct spu *spu, int nr,
                            void __iomem** virt, unsigned long *phys)
 {
        struct device_node *np = spu->devnode;
-       unsigned long start_pfn, nr_pages;
-       struct pglist_data *pgdata;
-       struct zone *zone;
        struct resource resource = { };
        unsigned long len;
        int ret;
 
        ret = of_address_to_resource(np, nr, &resource);
        if (ret)
-               goto out;
-
+               return ret;
        if (phys)
                *phys = resource.start;
        len = resource.end - resource.start + 1;
        *virt = ioremap(resource.start, len);
        if (!*virt)
-               ret = -EINVAL;
-
-       start_pfn = resource.start >> PAGE_SHIFT;
-       nr_pages = (len + PAGE_SIZE - 1) >> PAGE_SHIFT;
-
-       pgdata = NODE_DATA(spu->node);
-       zone = pgdata->node_zones;
-
-       ret = __add_pages(zone, start_pfn, nr_pages);
-
-out:
-       return ret;
+               return -EINVAL;
+       return 0;
 }
 
 static int __init spu_map_device(struct spu *spu)
index 0870009f56db64e7e535bf61c70d393e95684605..04ad2e364e977350643d89087b06e2c5c8163478 100644 (file)
@@ -42,7 +42,7 @@ struct spu_context *alloc_spu_context(struct spu_gang *gang)
        }
        spin_lock_init(&ctx->mmio_lock);
        kref_init(&ctx->kref);
-       init_rwsem(&ctx->state_sema);
+       mutex_init(&ctx->state_mutex);
        init_MUTEX(&ctx->run_sema);
        init_waitqueue_head(&ctx->ibox_wq);
        init_waitqueue_head(&ctx->wbox_wq);
@@ -53,6 +53,10 @@ struct spu_context *alloc_spu_context(struct spu_gang *gang)
        ctx->owner = get_task_mm(current);
        if (gang)
                spu_gang_add_ctx(gang, ctx);
+       ctx->rt_priority = current->rt_priority;
+       ctx->policy = current->policy;
+       ctx->prio = current->prio;
+       INIT_DELAYED_WORK(&ctx->sched_work, spu_sched_tick);
        goto out;
 out_free:
        kfree(ctx);
@@ -65,9 +69,9 @@ void destroy_spu_context(struct kref *kref)
 {
        struct spu_context *ctx;
        ctx = container_of(kref, struct spu_context, kref);
-       down_write(&ctx->state_sema);
+       mutex_lock(&ctx->state_mutex);
        spu_deactivate(ctx);
-       up_write(&ctx->state_sema);
+       mutex_unlock(&ctx->state_mutex);
        spu_fini_csa(&ctx->csa);
        if (ctx->gang)
                spu_gang_remove_ctx(ctx->gang, ctx);
@@ -96,107 +100,102 @@ void spu_forget(struct spu_context *ctx)
        spu_release(ctx);
 }
 
-void spu_acquire(struct spu_context *ctx)
-{
-       down_read(&ctx->state_sema);
-}
-
-void spu_release(struct spu_context *ctx)
-{
-       up_read(&ctx->state_sema);
-}
-
 void spu_unmap_mappings(struct spu_context *ctx)
 {
        if (ctx->local_store)
                unmap_mapping_range(ctx->local_store, 0, LS_SIZE, 1);
        if (ctx->mfc)
-               unmap_mapping_range(ctx->mfc, 0, 0x4000, 1);
+               unmap_mapping_range(ctx->mfc, 0, 0x1000, 1);
        if (ctx->cntl)
-               unmap_mapping_range(ctx->cntl, 0, 0x4000, 1);
+               unmap_mapping_range(ctx->cntl, 0, 0x1000, 1);
        if (ctx->signal1)
-               unmap_mapping_range(ctx->signal1, 0, 0x4000, 1);
+               unmap_mapping_range(ctx->signal1, 0, PAGE_SIZE, 1);
        if (ctx->signal2)
-               unmap_mapping_range(ctx->signal2, 0, 0x4000, 1);
+               unmap_mapping_range(ctx->signal2, 0, PAGE_SIZE, 1);
+       if (ctx->mss)
+               unmap_mapping_range(ctx->mss, 0, 0x1000, 1);
+       if (ctx->psmap)
+               unmap_mapping_range(ctx->psmap, 0, 0x20000, 1);
 }
 
+/**
+ * spu_acquire_exclusive - lock spu contex and protect against userspace access
+ * @ctx:       spu contex to lock
+ *
+ * Note:
+ *     Returns 0 and with the context locked on success
+ *     Returns negative error and with the context _unlocked_ on failure.
+ */
 int spu_acquire_exclusive(struct spu_context *ctx)
 {
-       int ret = 0;
+       int ret = -EINVAL;
 
-       down_write(&ctx->state_sema);
-       /* ctx is about to be freed, can't acquire any more */
-       if (!ctx->owner) {
-               ret = -EINVAL;
-               goto out;
-       }
+       spu_acquire(ctx);
+       /*
+        * Context is about to be freed, so we can't acquire it anymore.
+        */
+       if (!ctx->owner)
+               goto out_unlock;
 
        if (ctx->state == SPU_STATE_SAVED) {
                ret = spu_activate(ctx, 0);
                if (ret)
-                       goto out;
-               ctx->state = SPU_STATE_RUNNABLE;
+                       goto out_unlock;
        } else {
-               /* We need to exclude userspace access to the context. */
+               /*
+                * We need to exclude userspace access to the context.
+                *
+                * To protect against memory access we invalidate all ptes
+                * and make sure the pagefault handlers block on the mutex.
+                */
                spu_unmap_mappings(ctx);
        }
 
-out:
-       if (ret)
-               up_write(&ctx->state_sema);
+       return 0;
+
+ out_unlock:
+       spu_release(ctx);
        return ret;
 }
 
-int spu_acquire_runnable(struct spu_context *ctx)
+/**
+ * spu_acquire_runnable - lock spu contex and make sure it is in runnable state
+ * @ctx:       spu contex to lock
+ *
+ * Note:
+ *     Returns 0 and with the context locked on success
+ *     Returns negative error and with the context _unlocked_ on failure.
+ */
+int spu_acquire_runnable(struct spu_context *ctx, unsigned long flags)
 {
-       int ret = 0;
-
-       down_read(&ctx->state_sema);
-       if (ctx->state == SPU_STATE_RUNNABLE) {
-               ctx->spu->prio = current->prio;
-               return 0;
-       }
-       up_read(&ctx->state_sema);
-
-       down_write(&ctx->state_sema);
-       /* ctx is about to be freed, can't acquire any more */
-       if (!ctx->owner) {
-               ret = -EINVAL;
-               goto out;
-       }
+       int ret = -EINVAL;
 
+       spu_acquire(ctx);
        if (ctx->state == SPU_STATE_SAVED) {
-               ret = spu_activate(ctx, 0);
+               /*
+                * Context is about to be freed, so we can't acquire it anymore.
+                */
+               if (!ctx->owner)
+                       goto out_unlock;
+               ret = spu_activate(ctx, flags);
                if (ret)
-                       goto out;
-               ctx->state = SPU_STATE_RUNNABLE;
+                       goto out_unlock;
        }
 
-       downgrade_write(&ctx->state_sema);
-       /* On success, we return holding the lock */
-
-       return ret;
-out:
-       /* Release here, to simplify calling code. */
-       up_write(&ctx->state_sema);
+       return 0;
 
+ out_unlock:
+       spu_release(ctx);
        return ret;
 }
 
+/**
+ * spu_acquire_saved - lock spu contex and make sure it is in saved state
+ * @ctx:       spu contex to lock
+ */
 void spu_acquire_saved(struct spu_context *ctx)
 {
-       down_read(&ctx->state_sema);
-
-       if (ctx->state == SPU_STATE_SAVED)
-               return;
-
-       up_read(&ctx->state_sema);
-       down_write(&ctx->state_sema);
-
-       if (ctx->state == SPU_STATE_RUNNABLE) {
+       spu_acquire(ctx);
+       if (ctx->state != SPU_STATE_SAVED)
                spu_deactivate(ctx);
-               ctx->state = SPU_STATE_SAVED;
-       }
-
-       downgrade_write(&ctx->state_sema);
 }
index 347eff56fcbd59d81640e9ae40fa4a72e9cea50d..b00653d69c01cd654749d9a51231f6db7f258072 100644 (file)
@@ -45,8 +45,8 @@ spufs_mem_open(struct inode *inode, struct file *file)
        struct spufs_inode_info *i = SPUFS_I(inode);
        struct spu_context *ctx = i->i_ctx;
        file->private_data = ctx;
-       file->f_mapping = inode->i_mapping;
        ctx->local_store = inode->i_mapping;
+       smp_wmb();
        return 0;
 }
 
@@ -95,39 +95,38 @@ spufs_mem_write(struct file *file, const char __user *buffer,
        return ret;
 }
 
-static struct page *
-spufs_mem_mmap_nopage(struct vm_area_struct *vma,
-                     unsigned long address, int *type)
+static unsigned long spufs_mem_mmap_nopfn(struct vm_area_struct *vma,
+                                         unsigned long address)
 {
-       struct page *page = NOPAGE_SIGBUS;
-
        struct spu_context *ctx = vma->vm_file->private_data;
-       unsigned long offset = address - vma->vm_start;
+       unsigned long pfn, offset = address - vma->vm_start;
+
        offset += vma->vm_pgoff << PAGE_SHIFT;
 
+       if (offset >= LS_SIZE)
+               return NOPFN_SIGBUS;
+
        spu_acquire(ctx);
 
        if (ctx->state == SPU_STATE_SAVED) {
                vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot)
                                                        & ~_PAGE_NO_CACHE);
-               page = vmalloc_to_page(ctx->csa.lscsa->ls + offset);
+               pfn = vmalloc_to_pfn(ctx->csa.lscsa->ls + offset);
        } else {
                vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot)
-                                                       | _PAGE_NO_CACHE);
-               page = pfn_to_page((ctx->spu->local_store_phys + offset)
-                                  >> PAGE_SHIFT);
+                                            | _PAGE_NO_CACHE);
+               pfn = (ctx->spu->local_store_phys + offset) >> PAGE_SHIFT;
        }
-       spu_release(ctx);
+       vm_insert_pfn(vma, address, pfn);
 
-       if (type)
-               *type = VM_FAULT_MINOR;
+       spu_release(ctx);
 
-       page_cache_get(page);
-       return page;
+       return NOPFN_REFAULT;
 }
 
+
 static struct vm_operations_struct spufs_mem_mmap_vmops = {
-       .nopage = spufs_mem_mmap_nopage,
+       .nopfn = spufs_mem_mmap_nopfn,
 };
 
 static int
@@ -136,7 +135,7 @@ spufs_mem_mmap(struct file *file, struct vm_area_struct *vma)
        if (!(vma->vm_flags & VM_SHARED))
                return -EINVAL;
 
-       vma->vm_flags |= VM_IO;
+       vma->vm_flags |= VM_IO | VM_PFNMAP;
        vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot)
                                     | _PAGE_NO_CACHE);
 
@@ -144,7 +143,7 @@ spufs_mem_mmap(struct file *file, struct vm_area_struct *vma)
        return 0;
 }
 
-static struct file_operations spufs_mem_fops = {
+static const struct file_operations spufs_mem_fops = {
        .open    = spufs_mem_open,
        .read    = spufs_mem_read,
        .write   = spufs_mem_write,
@@ -152,49 +151,42 @@ static struct file_operations spufs_mem_fops = {
        .mmap    = spufs_mem_mmap,
 };
 
-static struct page *spufs_ps_nopage(struct vm_area_struct *vma,
+static unsigned long spufs_ps_nopfn(struct vm_area_struct *vma,
                                    unsigned long address,
-                                   int *type, unsigned long ps_offs,
+                                   unsigned long ps_offs,
                                    unsigned long ps_size)
 {
-       struct page *page = NOPAGE_SIGBUS;
-       int fault_type = VM_FAULT_SIGBUS;
        struct spu_context *ctx = vma->vm_file->private_data;
-       unsigned long offset = address - vma->vm_start;
-       unsigned long area;
+       unsigned long area, offset = address - vma->vm_start;
        int ret;
 
        offset += vma->vm_pgoff << PAGE_SHIFT;
        if (offset >= ps_size)
-               goto out;
+               return NOPFN_SIGBUS;
 
-       ret = spu_acquire_runnable(ctx);
+       /* error here usually means a signal.. we might want to test
+        * the error code more precisely though
+        */
+       ret = spu_acquire_runnable(ctx, 0);
        if (ret)
-               goto out;
+               return NOPFN_REFAULT;
 
        area = ctx->spu->problem_phys + ps_offs;
-       page = pfn_to_page((area + offset) >> PAGE_SHIFT);
-       fault_type = VM_FAULT_MINOR;
-       page_cache_get(page);
-
+       vm_insert_pfn(vma, address, (area + offset) >> PAGE_SHIFT);
        spu_release(ctx);
 
-      out:
-       if (type)
-               *type = fault_type;
-
-       return page;
+       return NOPFN_REFAULT;
 }
 
 #if SPUFS_MMAP_4K
-static struct page *spufs_cntl_mmap_nopage(struct vm_area_struct *vma,
-                                          unsigned long address, int *type)
+static unsigned long spufs_cntl_mmap_nopfn(struct vm_area_struct *vma,
+                                          unsigned long address)
 {
-       return spufs_ps_nopage(vma, address, type, 0x4000, 0x1000);
+       return spufs_ps_nopfn(vma, address, 0x4000, 0x1000);
 }
 
 static struct vm_operations_struct spufs_cntl_mmap_vmops = {
-       .nopage = spufs_cntl_mmap_nopage,
+       .nopfn = spufs_cntl_mmap_nopfn,
 };
 
 /*
@@ -205,7 +197,7 @@ static int spufs_cntl_mmap(struct file *file, struct vm_area_struct *vma)
        if (!(vma->vm_flags & VM_SHARED))
                return -EINVAL;
 
-       vma->vm_flags |= VM_IO;
+       vma->vm_flags |= VM_IO | VM_PFNMAP;
        vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot)
                                     | _PAGE_NO_CACHE | _PAGE_GUARDED);
 
@@ -243,13 +235,13 @@ static int spufs_cntl_open(struct inode *inode, struct file *file)
        struct spu_context *ctx = i->i_ctx;
 
        file->private_data = ctx;
-       file->f_mapping = inode->i_mapping;
        ctx->cntl = inode->i_mapping;
+       smp_wmb();
        return simple_attr_open(inode, file, spufs_cntl_get,
                                        spufs_cntl_set, "0x%08lx");
 }
 
-static struct file_operations spufs_cntl_fops = {
+static const struct file_operations spufs_cntl_fops = {
        .open = spufs_cntl_open,
        .release = simple_attr_close,
        .read = simple_attr_read,
@@ -309,7 +301,7 @@ spufs_regs_write(struct file *file, const char __user *buffer,
        return ret;
 }
 
-static struct file_operations spufs_regs_fops = {
+static const struct file_operations spufs_regs_fops = {
        .open    = spufs_regs_open,
        .read    = spufs_regs_read,
        .write   = spufs_regs_write,
@@ -360,7 +352,7 @@ spufs_fpcr_write(struct file *file, const char __user * buffer,
        return ret;
 }
 
-static struct file_operations spufs_fpcr_fops = {
+static const struct file_operations spufs_fpcr_fops = {
        .open = spufs_regs_open,
        .read = spufs_fpcr_read,
        .write = spufs_fpcr_write,
@@ -426,7 +418,7 @@ static ssize_t spufs_mbox_read(struct file *file, char __user *buf,
        return count;
 }
 
-static struct file_operations spufs_mbox_fops = {
+static const struct file_operations spufs_mbox_fops = {
        .open   = spufs_pipe_open,
        .read   = spufs_mbox_read,
 };
@@ -452,7 +444,7 @@ static ssize_t spufs_mbox_stat_read(struct file *file, char __user *buf,
        return 4;
 }
 
-static struct file_operations spufs_mbox_stat_fops = {
+static const struct file_operations spufs_mbox_stat_fops = {
        .open   = spufs_pipe_open,
        .read   = spufs_mbox_stat_read,
 };
@@ -559,7 +551,7 @@ static unsigned int spufs_ibox_poll(struct file *file, poll_table *wait)
        return mask;
 }
 
-static struct file_operations spufs_ibox_fops = {
+static const struct file_operations spufs_ibox_fops = {
        .open   = spufs_pipe_open,
        .read   = spufs_ibox_read,
        .poll   = spufs_ibox_poll,
@@ -585,7 +577,7 @@ static ssize_t spufs_ibox_stat_read(struct file *file, char __user *buf,
        return 4;
 }
 
-static struct file_operations spufs_ibox_stat_fops = {
+static const struct file_operations spufs_ibox_stat_fops = {
        .open   = spufs_pipe_open,
        .read   = spufs_ibox_stat_read,
 };
@@ -692,7 +684,7 @@ static unsigned int spufs_wbox_poll(struct file *file, poll_table *wait)
        return mask;
 }
 
-static struct file_operations spufs_wbox_fops = {
+static const struct file_operations spufs_wbox_fops = {
        .open   = spufs_pipe_open,
        .write  = spufs_wbox_write,
        .poll   = spufs_wbox_poll,
@@ -718,7 +710,7 @@ static ssize_t spufs_wbox_stat_read(struct file *file, char __user *buf,
        return 4;
 }
 
-static struct file_operations spufs_wbox_stat_fops = {
+static const struct file_operations spufs_wbox_stat_fops = {
        .open   = spufs_pipe_open,
        .read   = spufs_wbox_stat_read,
 };
@@ -728,8 +720,8 @@ static int spufs_signal1_open(struct inode *inode, struct file *file)
        struct spufs_inode_info *i = SPUFS_I(inode);
        struct spu_context *ctx = i->i_ctx;
        file->private_data = ctx;
-       file->f_mapping = inode->i_mapping;
        ctx->signal1 = inode->i_mapping;
+       smp_wmb();
        return nonseekable_open(inode, file);
 }
 
@@ -791,23 +783,23 @@ static ssize_t spufs_signal1_write(struct file *file, const char __user *buf,
        return 4;
 }
 
-static struct page *spufs_signal1_mmap_nopage(struct vm_area_struct *vma,
-                                             unsigned long address, int *type)
+static unsigned long spufs_signal1_mmap_nopfn(struct vm_area_struct *vma,
+                                             unsigned long address)
 {
 #if PAGE_SIZE == 0x1000
-       return spufs_ps_nopage(vma, address, type, 0x14000, 0x1000);
+       return spufs_ps_nopfn(vma, address, 0x14000, 0x1000);
 #elif PAGE_SIZE == 0x10000
        /* For 64k pages, both signal1 and signal2 can be used to mmap the whole
         * signal 1 and 2 area
         */
-       return spufs_ps_nopage(vma, address, type, 0x10000, 0x10000);
+       return spufs_ps_nopfn(vma, address, 0x10000, 0x10000);
 #else
 #error unsupported page size
 #endif
 }
 
 static struct vm_operations_struct spufs_signal1_mmap_vmops = {
-       .nopage = spufs_signal1_mmap_nopage,
+       .nopfn = spufs_signal1_mmap_nopfn,
 };
 
 static int spufs_signal1_mmap(struct file *file, struct vm_area_struct *vma)
@@ -815,7 +807,7 @@ static int spufs_signal1_mmap(struct file *file, struct vm_area_struct *vma)
        if (!(vma->vm_flags & VM_SHARED))
                return -EINVAL;
 
-       vma->vm_flags |= VM_IO;
+       vma->vm_flags |= VM_IO | VM_PFNMAP;
        vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot)
                                     | _PAGE_NO_CACHE | _PAGE_GUARDED);
 
@@ -823,7 +815,7 @@ static int spufs_signal1_mmap(struct file *file, struct vm_area_struct *vma)
        return 0;
 }
 
-static struct file_operations spufs_signal1_fops = {
+static const struct file_operations spufs_signal1_fops = {
        .open = spufs_signal1_open,
        .read = spufs_signal1_read,
        .write = spufs_signal1_write,
@@ -835,8 +827,8 @@ static int spufs_signal2_open(struct inode *inode, struct file *file)
        struct spufs_inode_info *i = SPUFS_I(inode);
        struct spu_context *ctx = i->i_ctx;
        file->private_data = ctx;
-       file->f_mapping = inode->i_mapping;
        ctx->signal2 = inode->i_mapping;
+       smp_wmb();
        return nonseekable_open(inode, file);
 }
 
@@ -899,23 +891,23 @@ static ssize_t spufs_signal2_write(struct file *file, const char __user *buf,
 }
 
 #if SPUFS_MMAP_4K
-static struct page *spufs_signal2_mmap_nopage(struct vm_area_struct *vma,
-                                             unsigned long address, int *type)
+static unsigned long spufs_signal2_mmap_nopfn(struct vm_area_struct *vma,
+                                             unsigned long address)
 {
 #if PAGE_SIZE == 0x1000
-       return spufs_ps_nopage(vma, address, type, 0x1c000, 0x1000);
+       return spufs_ps_nopfn(vma, address, 0x1c000, 0x1000);
 #elif PAGE_SIZE == 0x10000
        /* For 64k pages, both signal1 and signal2 can be used to mmap the whole
         * signal 1 and 2 area
         */
-       return spufs_ps_nopage(vma, address, type, 0x10000, 0x10000);
+       return spufs_ps_nopfn(vma, address, 0x10000, 0x10000);
 #else
 #error unsupported page size
 #endif
 }
 
 static struct vm_operations_struct spufs_signal2_mmap_vmops = {
-       .nopage = spufs_signal2_mmap_nopage,
+       .nopfn = spufs_signal2_mmap_nopfn,
 };
 
 static int spufs_signal2_mmap(struct file *file, struct vm_area_struct *vma)
@@ -923,7 +915,7 @@ static int spufs_signal2_mmap(struct file *file, struct vm_area_struct *vma)
        if (!(vma->vm_flags & VM_SHARED))
                return -EINVAL;
 
-       vma->vm_flags |= VM_IO;
+       vma->vm_flags |= VM_IO | VM_PFNMAP;
        vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot)
                                     | _PAGE_NO_CACHE | _PAGE_GUARDED);
 
@@ -934,7 +926,7 @@ static int spufs_signal2_mmap(struct file *file, struct vm_area_struct *vma)
 #define spufs_signal2_mmap NULL
 #endif /* !SPUFS_MMAP_4K */
 
-static struct file_operations spufs_signal2_fops = {
+static const struct file_operations spufs_signal2_fops = {
        .open = spufs_signal2_open,
        .read = spufs_signal2_read,
        .write = spufs_signal2_write,
@@ -1000,14 +992,14 @@ DEFINE_SIMPLE_ATTRIBUTE(spufs_signal2_type, spufs_signal2_type_get,
                                        spufs_signal2_type_set, "%llu");
 
 #if SPUFS_MMAP_4K
-static struct page *spufs_mss_mmap_nopage(struct vm_area_struct *vma,
-                                          unsigned long address, int *type)
+static unsigned long spufs_mss_mmap_nopfn(struct vm_area_struct *vma,
+                                         unsigned long address)
 {
-       return spufs_ps_nopage(vma, address, type, 0x0000, 0x1000);
+       return spufs_ps_nopfn(vma, address, 0x0000, 0x1000);
 }
 
 static struct vm_operations_struct spufs_mss_mmap_vmops = {
-       .nopage = spufs_mss_mmap_nopage,
+       .nopfn = spufs_mss_mmap_nopfn,
 };
 
 /*
@@ -1018,7 +1010,7 @@ static int spufs_mss_mmap(struct file *file, struct vm_area_struct *vma)
        if (!(vma->vm_flags & VM_SHARED))
                return -EINVAL;
 
-       vma->vm_flags |= VM_IO;
+       vma->vm_flags |= VM_IO | VM_PFNMAP;
        vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot)
                                     | _PAGE_NO_CACHE | _PAGE_GUARDED);
 
@@ -1032,24 +1024,27 @@ static int spufs_mss_mmap(struct file *file, struct vm_area_struct *vma)
 static int spufs_mss_open(struct inode *inode, struct file *file)
 {
        struct spufs_inode_info *i = SPUFS_I(inode);
+       struct spu_context *ctx = i->i_ctx;
 
        file->private_data = i->i_ctx;
+       ctx->mss = inode->i_mapping;
+       smp_wmb();
        return nonseekable_open(inode, file);
 }
 
-static struct file_operations spufs_mss_fops = {
+static const struct file_operations spufs_mss_fops = {
        .open    = spufs_mss_open,
        .mmap    = spufs_mss_mmap,
 };
 
-static struct page *spufs_psmap_mmap_nopage(struct vm_area_struct *vma,
-                                          unsigned long address, int *type)
+static unsigned long spufs_psmap_mmap_nopfn(struct vm_area_struct *vma,
+                                           unsigned long address)
 {
-       return spufs_ps_nopage(vma, address, type, 0x0000, 0x20000);
+       return spufs_ps_nopfn(vma, address, 0x0000, 0x20000);
 }
 
 static struct vm_operations_struct spufs_psmap_mmap_vmops = {
-       .nopage = spufs_psmap_mmap_nopage,
+       .nopfn = spufs_psmap_mmap_nopfn,
 };
 
 /*
@@ -1060,7 +1055,7 @@ static int spufs_psmap_mmap(struct file *file, struct vm_area_struct *vma)
        if (!(vma->vm_flags & VM_SHARED))
                return -EINVAL;
 
-       vma->vm_flags |= VM_IO;
+       vma->vm_flags |= VM_IO | VM_PFNMAP;
        vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot)
                                     | _PAGE_NO_CACHE | _PAGE_GUARDED);
 
@@ -1071,26 +1066,29 @@ static int spufs_psmap_mmap(struct file *file, struct vm_area_struct *vma)
 static int spufs_psmap_open(struct inode *inode, struct file *file)
 {
        struct spufs_inode_info *i = SPUFS_I(inode);
+       struct spu_context *ctx = i->i_ctx;
 
        file->private_data = i->i_ctx;
+       ctx->psmap = inode->i_mapping;
+       smp_wmb();
        return nonseekable_open(inode, file);
 }
 
-static struct file_operations spufs_psmap_fops = {
+static const struct file_operations spufs_psmap_fops = {
        .open    = spufs_psmap_open,
        .mmap    = spufs_psmap_mmap,
 };
 
 
 #if SPUFS_MMAP_4K
-static struct page *spufs_mfc_mmap_nopage(struct vm_area_struct *vma,
-                                          unsigned long address, int *type)
+static unsigned long spufs_mfc_mmap_nopfn(struct vm_area_struct *vma,
+                                         unsigned long address)
 {
-       return spufs_ps_nopage(vma, address, type, 0x3000, 0x1000);
+       return spufs_ps_nopfn(vma, address, 0x3000, 0x1000);
 }
 
 static struct vm_operations_struct spufs_mfc_mmap_vmops = {
-       .nopage = spufs_mfc_mmap_nopage,
+       .nopfn = spufs_mfc_mmap_nopfn,
 };
 
 /*
@@ -1101,7 +1099,7 @@ static int spufs_mfc_mmap(struct file *file, struct vm_area_struct *vma)
        if (!(vma->vm_flags & VM_SHARED))
                return -EINVAL;
 
-       vma->vm_flags |= VM_IO;
+       vma->vm_flags |= VM_IO | VM_PFNMAP;
        vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot)
                                     | _PAGE_NO_CACHE | _PAGE_GUARDED);
 
@@ -1125,6 +1123,8 @@ static int spufs_mfc_open(struct inode *inode, struct file *file)
                return -EBUSY;
 
        file->private_data = ctx;
+       ctx->mfc = inode->i_mapping;
+       smp_wmb();
        return nonseekable_open(inode, file);
 }
 
@@ -1309,7 +1309,7 @@ static ssize_t spufs_mfc_write(struct file *file, const char __user *buffer,
        if (ret)
                goto out;
 
-       spu_acquire_runnable(ctx);
+       spu_acquire_runnable(ctx, 0);
        if (file->f_flags & O_NONBLOCK) {
                ret = ctx->ops->send_mfc_command(ctx, &cmd);
        } else {
@@ -1393,7 +1393,7 @@ static int spufs_mfc_fasync(int fd, struct file *file, int on)
        return fasync_helper(fd, file, on, &ctx->mfc_fasync);
 }
 
-static struct file_operations spufs_mfc_fops = {
+static const struct file_operations spufs_mfc_fops = {
        .open    = spufs_mfc_open,
        .read    = spufs_mfc_read,
        .write   = spufs_mfc_write,
@@ -1650,7 +1650,7 @@ static ssize_t spufs_mbox_info_read(struct file *file, char __user *buf,
        return ret;
 }
 
-static struct file_operations spufs_mbox_info_fops = {
+static const struct file_operations spufs_mbox_info_fops = {
        .open = spufs_info_open,
        .read = spufs_mbox_info_read,
        .llseek  = generic_file_llseek,
@@ -1688,7 +1688,7 @@ static ssize_t spufs_ibox_info_read(struct file *file, char __user *buf,
        return ret;
 }
 
-static struct file_operations spufs_ibox_info_fops = {
+static const struct file_operations spufs_ibox_info_fops = {
        .open = spufs_info_open,
        .read = spufs_ibox_info_read,
        .llseek  = generic_file_llseek,
@@ -1729,7 +1729,7 @@ static ssize_t spufs_wbox_info_read(struct file *file, char __user *buf,
        return ret;
 }
 
-static struct file_operations spufs_wbox_info_fops = {
+static const struct file_operations spufs_wbox_info_fops = {
        .open = spufs_info_open,
        .read = spufs_wbox_info_read,
        .llseek  = generic_file_llseek,
@@ -1779,7 +1779,7 @@ static ssize_t spufs_dma_info_read(struct file *file, char __user *buf,
        return ret;
 }
 
-static struct file_operations spufs_dma_info_fops = {
+static const struct file_operations spufs_dma_info_fops = {
        .open = spufs_info_open,
        .read = spufs_dma_info_read,
 };
@@ -1830,7 +1830,7 @@ static ssize_t spufs_proxydma_info_read(struct file *file, char __user *buf,
        return ret;
 }
 
-static struct file_operations spufs_proxydma_info_fops = {
+static const struct file_operations spufs_proxydma_info_fops = {
        .open = spufs_info_open,
        .read = spufs_proxydma_info_read,
 };
index 738b9244382fa5c851a9fcc353a43aaf28c14e2e..8079983ef94fa5486c264cdf85123acbbbcbb161 100644 (file)
@@ -220,11 +220,11 @@ static int spufs_dir_close(struct inode *inode, struct file *file)
        return dcache_dir_close(inode, file);
 }
 
-struct inode_operations spufs_dir_inode_operations = {
+const struct inode_operations spufs_dir_inode_operations = {
        .lookup = simple_lookup,
 };
 
-struct file_operations spufs_context_fops = {
+const struct file_operations spufs_context_fops = {
        .open           = dcache_dir_open,
        .release        = spufs_dir_close,
        .llseek         = dcache_dir_lseek,
@@ -372,7 +372,7 @@ static int spufs_gang_close(struct inode *inode, struct file *file)
        return dcache_dir_close(inode, file);
 }
 
-struct file_operations spufs_gang_fops = {
+const struct file_operations spufs_gang_fops = {
        .open           = dcache_dir_open,
        .release        = spufs_gang_close,
        .llseek         = dcache_dir_lseek,
index 1acc2ffef8c8ac67749be5dbf1a43ef176648304..353a8fa07ab87797694de155d6ba50f65ebc06d3 100644 (file)
@@ -133,7 +133,7 @@ out_drop_priv:
        spu_mfc_sr1_set(ctx->spu, sr1);
 
 out_unlock:
-       spu_release_exclusive(ctx);
+       spu_release(ctx);
 out:
        return ret;
 }
@@ -143,7 +143,7 @@ static inline int spu_run_init(struct spu_context *ctx, u32 * npc)
        int ret;
        unsigned long runcntl = SPU_RUNCNTL_RUNNABLE;
 
-       ret = spu_acquire_runnable(ctx);
+       ret = spu_acquire_runnable(ctx, SPU_ACTIVATE_NOWAKE);
        if (ret)
                return ret;
 
@@ -155,7 +155,7 @@ static inline int spu_run_init(struct spu_context *ctx, u32 * npc)
                        spu_release(ctx);
                        ret = spu_setup_isolated(ctx);
                        if (!ret)
-                               ret = spu_acquire_runnable(ctx);
+                               ret = spu_acquire_runnable(ctx, SPU_ACTIVATE_NOWAKE);
                }
 
                /* if userspace has set the runcntrl register (eg, to issue an
@@ -164,8 +164,10 @@ static inline int spu_run_init(struct spu_context *ctx, u32 * npc)
                        (SPU_RUNCNTL_RUNNABLE | SPU_RUNCNTL_ISOLATE);
                if (runcntl == 0)
                        runcntl = SPU_RUNCNTL_RUNNABLE;
-       } else
+       } else {
+               spu_start_tick(ctx);
                ctx->ops->npc_write(ctx, *npc);
+       }
 
        ctx->ops->runcntl_write(ctx, runcntl);
        return ret;
@@ -176,6 +178,7 @@ static inline int spu_run_fini(struct spu_context *ctx, u32 * npc,
 {
        int ret = 0;
 
+       spu_stop_tick(ctx);
        *status = ctx->ops->status_read(ctx);
        *npc = ctx->ops->npc_read(ctx);
        spu_release(ctx);
@@ -329,8 +332,10 @@ long spufs_run_spu(struct file *file, struct spu_context *ctx,
                }
                if (unlikely(ctx->state != SPU_STATE_RUNNABLE)) {
                        ret = spu_reacquire_runnable(ctx, npc, &status);
-                       if (ret)
+                       if (ret) {
+                               spu_stop_tick(ctx);
                                goto out2;
+                       }
                        continue;
                }
                ret = spu_process_events(ctx);
@@ -361,4 +366,3 @@ out:
        up(&ctx->run_sema);
        return ret;
 }
-
index bd6fe4b7a84baab84face56b2d8ca5f5c263db2e..2f25e68b4bac1c5c8eb95160ba73d1ebfec44b81 100644 (file)
 #include <asm/spu_priv1.h>
 #include "spufs.h"
 
-#define SPU_MIN_TIMESLICE      (100 * HZ / 1000)
+#define SPU_TIMESLICE  (HZ)
 
-#define SPU_BITMAP_SIZE (((MAX_PRIO+BITS_PER_LONG)/BITS_PER_LONG)+1)
 struct spu_prio_array {
-       unsigned long bitmap[SPU_BITMAP_SIZE];
-       wait_queue_head_t waitq[MAX_PRIO];
+       DECLARE_BITMAP(bitmap, MAX_PRIO);
+       struct list_head runq[MAX_PRIO];
+       spinlock_t runq_lock;
        struct list_head active_list[MAX_NUMNODES];
        struct mutex active_mutex[MAX_NUMNODES];
 };
 
 static struct spu_prio_array *spu_prio;
+static struct workqueue_struct *spu_sched_wq;
 
 static inline int node_allowed(int node)
 {
@@ -68,6 +69,64 @@ static inline int node_allowed(int node)
        return 1;
 }
 
+void spu_start_tick(struct spu_context *ctx)
+{
+       if (ctx->policy == SCHED_RR)
+               queue_delayed_work(spu_sched_wq, &ctx->sched_work, SPU_TIMESLICE);
+}
+
+void spu_stop_tick(struct spu_context *ctx)
+{
+       if (ctx->policy == SCHED_RR)
+               cancel_delayed_work(&ctx->sched_work);
+}
+
+void spu_sched_tick(struct work_struct *work)
+{
+       struct spu_context *ctx =
+               container_of(work, struct spu_context, sched_work.work);
+       struct spu *spu;
+       int rearm = 1;
+
+       mutex_lock(&ctx->state_mutex);
+       spu = ctx->spu;
+       if (spu) {
+               int best = sched_find_first_bit(spu_prio->bitmap);
+               if (best <= ctx->prio) {
+                       spu_deactivate(ctx);
+                       rearm = 0;
+               }
+       }
+       mutex_unlock(&ctx->state_mutex);
+
+       if (rearm)
+               spu_start_tick(ctx);
+}
+
+/**
+ * spu_add_to_active_list - add spu to active list
+ * @spu:       spu to add to the active list
+ */
+static void spu_add_to_active_list(struct spu *spu)
+{
+       mutex_lock(&spu_prio->active_mutex[spu->node]);
+       list_add_tail(&spu->list, &spu_prio->active_list[spu->node]);
+       mutex_unlock(&spu_prio->active_mutex[spu->node]);
+}
+
+/**
+ * spu_remove_from_active_list - remove spu from active list
+ * @spu:       spu to remove from the active list
+ */
+static void spu_remove_from_active_list(struct spu *spu)
+{
+       int node = spu->node;
+
+       mutex_lock(&spu_prio->active_mutex[node]);
+       list_del_init(&spu->list);
+       mutex_unlock(&spu_prio->active_mutex[node]);
+}
+
 static inline void mm_needs_global_tlbie(struct mm_struct *mm)
 {
        int nr = (NR_CPUS > 1) ? NR_CPUS : NR_CPUS + 1;
@@ -94,8 +153,12 @@ int spu_switch_event_unregister(struct notifier_block * n)
        return blocking_notifier_chain_unregister(&spu_switch_notifier, n);
 }
 
-
-static inline void bind_context(struct spu *spu, struct spu_context *ctx)
+/**
+ * spu_bind_context - bind spu context to physical spu
+ * @spu:       physical spu to bind to
+ * @ctx:       context to bind
+ */
+static void spu_bind_context(struct spu *spu, struct spu_context *ctx)
 {
        pr_debug("%s: pid=%d SPU=%d NODE=%d\n", __FUNCTION__, current->pid,
                 spu->number, spu->node);
@@ -104,7 +167,6 @@ static inline void bind_context(struct spu *spu, struct spu_context *ctx)
        ctx->spu = spu;
        ctx->ops = &spu_hw_ops;
        spu->pid = current->pid;
-       spu->prio = current->prio;
        spu->mm = ctx->owner;
        mm_needs_global_tlbie(spu->mm);
        spu->ibox_callback = spufs_ibox_callback;
@@ -118,12 +180,21 @@ static inline void bind_context(struct spu *spu, struct spu_context *ctx)
        spu->timestamp = jiffies;
        spu_cpu_affinity_set(spu, raw_smp_processor_id());
        spu_switch_notify(spu, ctx);
+       spu_add_to_active_list(spu);
+       ctx->state = SPU_STATE_RUNNABLE;
 }
 
-static inline void unbind_context(struct spu *spu, struct spu_context *ctx)
+/**
+ * spu_unbind_context - unbind spu context from physical spu
+ * @spu:       physical spu to unbind from
+ * @ctx:       context to unbind
+ */
+static void spu_unbind_context(struct spu *spu, struct spu_context *ctx)
 {
        pr_debug("%s: unbind pid=%d SPU=%d NODE=%d\n", __FUNCTION__,
                 spu->pid, spu->number, spu->node);
+
+       spu_remove_from_active_list(spu);
        spu_switch_notify(spu, NULL);
        spu_unmap_mappings(ctx);
        spu_save(&ctx->csa, spu);
@@ -136,95 +207,98 @@ static inline void unbind_context(struct spu *spu, struct spu_context *ctx)
        spu->dma_callback = NULL;
        spu->mm = NULL;
        spu->pid = 0;
-       spu->prio = MAX_PRIO;
        ctx->ops = &spu_backing_ops;
        ctx->spu = NULL;
        spu->flags = 0;
        spu->ctx = NULL;
 }
 
-static inline void spu_add_wq(wait_queue_head_t * wq, wait_queue_t * wait,
-                             int prio)
+/**
+ * spu_add_to_rq - add a context to the runqueue
+ * @ctx:       context to add
+ */
+static void spu_add_to_rq(struct spu_context *ctx)
 {
-       prepare_to_wait_exclusive(wq, wait, TASK_INTERRUPTIBLE);
-       set_bit(prio, spu_prio->bitmap);
+       spin_lock(&spu_prio->runq_lock);
+       list_add_tail(&ctx->rq, &spu_prio->runq[ctx->prio]);
+       set_bit(ctx->prio, spu_prio->bitmap);
+       spin_unlock(&spu_prio->runq_lock);
 }
 
-static inline void spu_del_wq(wait_queue_head_t * wq, wait_queue_t * wait,
-                             int prio)
+/**
+ * spu_del_from_rq - remove a context from the runqueue
+ * @ctx:       context to remove
+ */
+static void spu_del_from_rq(struct spu_context *ctx)
 {
-       u64 flags;
-
-       __set_current_state(TASK_RUNNING);
-
-       spin_lock_irqsave(&wq->lock, flags);
+       spin_lock(&spu_prio->runq_lock);
+       list_del_init(&ctx->rq);
+       if (list_empty(&spu_prio->runq[ctx->prio]))
+               clear_bit(ctx->prio, spu_prio->bitmap);
+       spin_unlock(&spu_prio->runq_lock);
+}
 
-       remove_wait_queue_locked(wq, wait);
-       if (list_empty(&wq->task_list))
-               clear_bit(prio, spu_prio->bitmap);
+/**
+ * spu_grab_context - remove one context from the runqueue
+ * @prio:      priority of the context to be removed
+ *
+ * This function removes one context from the runqueue for priority @prio.
+ * If there is more than one context with the given priority the first
+ * task on the runqueue will be taken.
+ *
+ * Returns the spu_context it just removed.
+ *
+ * Must be called with spu_prio->runq_lock held.
+ */
+static struct spu_context *spu_grab_context(int prio)
+{
+       struct list_head *rq = &spu_prio->runq[prio];
 
-       spin_unlock_irqrestore(&wq->lock, flags);
+       if (list_empty(rq))
+               return NULL;
+       return list_entry(rq->next, struct spu_context, rq);
 }
 
-static void spu_prio_wait(struct spu_context *ctx, u64 flags)
+static void spu_prio_wait(struct spu_context *ctx)
 {
-       int prio = current->prio;
-       wait_queue_head_t *wq = &spu_prio->waitq[prio];
        DEFINE_WAIT(wait);
 
-       if (ctx->spu)
-               return;
-
-       spu_add_wq(wq, &wait, prio);
-
+       set_bit(SPU_SCHED_WAKE, &ctx->sched_flags);
+       prepare_to_wait_exclusive(&ctx->stop_wq, &wait, TASK_INTERRUPTIBLE);
        if (!signal_pending(current)) {
-               up_write(&ctx->state_sema);
-               pr_debug("%s: pid=%d prio=%d\n", __FUNCTION__,
-                        current->pid, current->prio);
+               mutex_unlock(&ctx->state_mutex);
                schedule();
-               down_write(&ctx->state_sema);
+               mutex_lock(&ctx->state_mutex);
        }
-
-       spu_del_wq(wq, &wait, prio);
+       __set_current_state(TASK_RUNNING);
+       remove_wait_queue(&ctx->stop_wq, &wait);
+       clear_bit(SPU_SCHED_WAKE, &ctx->sched_flags);
 }
 
-static void spu_prio_wakeup(void)
+/**
+ * spu_reschedule - try to find a runnable context for a spu
+ * @spu:       spu available
+ *
+ * This function is called whenever a spu becomes idle.  It looks for the
+ * most suitable runnable spu context and schedules it for execution.
+ */
+static void spu_reschedule(struct spu *spu)
 {
-       int best = sched_find_first_bit(spu_prio->bitmap);
-       if (best < MAX_PRIO) {
-               wait_queue_head_t *wq = &spu_prio->waitq[best];
-               wake_up_interruptible_nr(wq, 1);
-       }
-}
+       int best;
 
-static int get_active_spu(struct spu *spu)
-{
-       int node = spu->node;
-       struct spu *tmp;
-       int rc = 0;
+       spu_free(spu);
 
-       mutex_lock(&spu_prio->active_mutex[node]);
-       list_for_each_entry(tmp, &spu_prio->active_list[node], list) {
-               if (tmp == spu) {
-                       list_del_init(&spu->list);
-                       rc = 1;
-                       break;
-               }
+       spin_lock(&spu_prio->runq_lock);
+       best = sched_find_first_bit(spu_prio->bitmap);
+       if (best < MAX_PRIO) {
+               struct spu_context *ctx = spu_grab_context(best);
+               if (ctx && test_bit(SPU_SCHED_WAKE, &ctx->sched_flags))
+                       wake_up(&ctx->stop_wq);
        }
-       mutex_unlock(&spu_prio->active_mutex[node]);
-       return rc;
-}
-
-static void put_active_spu(struct spu *spu)
-{
-       int node = spu->node;
-
-       mutex_lock(&spu_prio->active_mutex[node]);
-       list_add_tail(&spu->list, &spu_prio->active_list[node]);
-       mutex_unlock(&spu_prio->active_mutex[node]);
+       spin_unlock(&spu_prio->runq_lock);
 }
 
-static struct spu *spu_get_idle(struct spu_context *ctx, u64 flags)
+static struct spu *spu_get_idle(struct spu_context *ctx)
 {
        struct spu *spu = NULL;
        int node = cpu_to_node(raw_smp_processor_id());
@@ -241,87 +315,154 @@ static struct spu *spu_get_idle(struct spu_context *ctx, u64 flags)
        return spu;
 }
 
-static inline struct spu *spu_get(struct spu_context *ctx, u64 flags)
+/**
+ * find_victim - find a lower priority context to preempt
+ * @ctx:       canidate context for running
+ *
+ * Returns the freed physical spu to run the new context on.
+ */
+static struct spu *find_victim(struct spu_context *ctx)
 {
-       /* Future: spu_get_idle() if possible,
-        * otherwise try to preempt an active
-        * context.
+       struct spu_context *victim = NULL;
+       struct spu *spu;
+       int node, n;
+
+       /*
+        * Look for a possible preemption candidate on the local node first.
+        * If there is no candidate look at the other nodes.  This isn't
+        * exactly fair, but so far the whole spu schedule tries to keep
+        * a strong node affinity.  We might want to fine-tune this in
+        * the future.
         */
-       return spu_get_idle(ctx, flags);
+ restart:
+       node = cpu_to_node(raw_smp_processor_id());
+       for (n = 0; n < MAX_NUMNODES; n++, node++) {
+               node = (node < MAX_NUMNODES) ? node : 0;
+               if (!node_allowed(node))
+                       continue;
+
+               mutex_lock(&spu_prio->active_mutex[node]);
+               list_for_each_entry(spu, &spu_prio->active_list[node], list) {
+                       struct spu_context *tmp = spu->ctx;
+
+                       if (tmp->rt_priority < ctx->rt_priority &&
+                           (!victim || tmp->rt_priority < victim->rt_priority))
+                               victim = spu->ctx;
+               }
+               mutex_unlock(&spu_prio->active_mutex[node]);
+
+               if (victim) {
+                       /*
+                        * This nests ctx->state_mutex, but we always lock
+                        * higher priority contexts before lower priority
+                        * ones, so this is safe until we introduce
+                        * priority inheritance schemes.
+                        */
+                       if (!mutex_trylock(&victim->state_mutex)) {
+                               victim = NULL;
+                               goto restart;
+                       }
+
+                       spu = victim->spu;
+                       if (!spu) {
+                               /*
+                                * This race can happen because we've dropped
+                                * the active list mutex.  No a problem, just
+                                * restart the search.
+                                */
+                               mutex_unlock(&victim->state_mutex);
+                               victim = NULL;
+                               goto restart;
+                       }
+                       spu_unbind_context(spu, victim);
+                       mutex_unlock(&victim->state_mutex);
+                       return spu;
+               }
+       }
+
+       return NULL;
 }
 
-/* The three externally callable interfaces
- * for the scheduler begin here.
+/**
+ * spu_activate - find a free spu for a context and execute it
+ * @ctx:       spu context to schedule
+ * @flags:     flags (currently ignored)
  *
- *     spu_activate    - bind a context to SPU, waiting as needed.
- *     spu_deactivate  - unbind a context from its SPU.
- *     spu_yield       - yield an SPU if others are waiting.
+ * Tries to find a free spu to run @ctx.  If no free spu is availble
+ * add the context to the runqueue so it gets woken up once an spu
+ * is available.
  */
-
-int spu_activate(struct spu_context *ctx, u64 flags)
+int spu_activate(struct spu_context *ctx, unsigned long flags)
 {
-       struct spu *spu;
-       int ret = 0;
 
-       for (;;) {
-               if (ctx->spu)
+       if (ctx->spu)
+               return 0;
+
+       do {
+               struct spu *spu;
+
+               spu = spu_get_idle(ctx);
+               /*
+                * If this is a realtime thread we try to get it running by
+                * preempting a lower priority thread.
+                */
+               if (!spu && ctx->rt_priority)
+                       spu = find_victim(ctx);
+               if (spu) {
+                       spu_bind_context(spu, ctx);
                        return 0;
-               spu = spu_get(ctx, flags);
-               if (spu != NULL) {
-                       if (ctx->spu != NULL) {
-                               spu_free(spu);
-                               spu_prio_wakeup();
-                               break;
-                       }
-                       bind_context(spu, ctx);
-                       put_active_spu(spu);
-                       break;
                }
-               spu_prio_wait(ctx, flags);
-               if (signal_pending(current)) {
-                       ret = -ERESTARTSYS;
-                       spu_prio_wakeup();
-                       break;
-               }
-       }
-       return ret;
+
+               spu_add_to_rq(ctx);
+               if (!(flags & SPU_ACTIVATE_NOWAKE))
+                       spu_prio_wait(ctx);
+               spu_del_from_rq(ctx);
+       } while (!signal_pending(current));
+
+       return -ERESTARTSYS;
 }
 
+/**
+ * spu_deactivate - unbind a context from it's physical spu
+ * @ctx:       spu context to unbind
+ *
+ * Unbind @ctx from the physical spu it is running on and schedule
+ * the highest priority context to run on the freed physical spu.
+ */
 void spu_deactivate(struct spu_context *ctx)
 {
-       struct spu *spu;
-       int needs_idle;
+       struct spu *spu = ctx->spu;
 
-       spu = ctx->spu;
-       if (!spu)
-               return;
-       needs_idle = get_active_spu(spu);
-       unbind_context(spu, ctx);
-       if (needs_idle) {
-               spu_free(spu);
-               spu_prio_wakeup();
+       if (spu) {
+               spu_unbind_context(spu, ctx);
+               spu_reschedule(spu);
        }
 }
 
+/**
+ * spu_yield -  yield a physical spu if others are waiting
+ * @ctx:       spu context to yield
+ *
+ * Check if there is a higher priority context waiting and if yes
+ * unbind @ctx from the physical spu and schedule the highest
+ * priority context to run on the freed physical spu instead.
+ */
 void spu_yield(struct spu_context *ctx)
 {
        struct spu *spu;
        int need_yield = 0;
 
-       if (down_write_trylock(&ctx->state_sema)) {
+       if (mutex_trylock(&ctx->state_mutex)) {
                if ((spu = ctx->spu) != NULL) {
                        int best = sched_find_first_bit(spu_prio->bitmap);
                        if (best < MAX_PRIO) {
                                pr_debug("%s: yielding SPU %d NODE %d\n",
                                         __FUNCTION__, spu->number, spu->node);
                                spu_deactivate(ctx);
-                               ctx->state = SPU_STATE_SAVED;
                                need_yield = 1;
-                       } else {
-                               spu->prio = MAX_PRIO;
                        }
                }
-               up_write(&ctx->state_sema);
+               mutex_unlock(&ctx->state_mutex);
        }
        if (unlikely(need_yield))
                yield();
@@ -331,14 +472,19 @@ int __init spu_sched_init(void)
 {
        int i;
 
+       spu_sched_wq = create_singlethread_workqueue("spusched");
+       if (!spu_sched_wq)
+               return 1;
+
        spu_prio = kzalloc(sizeof(struct spu_prio_array), GFP_KERNEL);
        if (!spu_prio) {
                printk(KERN_WARNING "%s: Unable to allocate priority queue.\n",
                       __FUNCTION__);
+                      destroy_workqueue(spu_sched_wq);
                return 1;
        }
        for (i = 0; i < MAX_PRIO; i++) {
-               init_waitqueue_head(&spu_prio->waitq[i]);
+               INIT_LIST_HEAD(&spu_prio->runq[i]);
                __clear_bit(i, spu_prio->bitmap);
        }
        __set_bit(MAX_PRIO, spu_prio->bitmap);
@@ -346,6 +492,7 @@ int __init spu_sched_init(void)
                mutex_init(&spu_prio->active_mutex[i]);
                INIT_LIST_HEAD(&spu_prio->active_list[i]);
        }
+       spin_lock_init(&spu_prio->runq_lock);
        return 0;
 }
 
@@ -364,4 +511,5 @@ void __exit spu_sched_exit(void)
                mutex_unlock(&spu_prio->active_mutex[node]);
        }
        kfree(spu_prio);
+       destroy_workqueue(spu_sched_wq);
 }
index 70fb13395c04b47325e6940df9c089c921ac3a8a..0c437891dfd5cf6b25af3cc1248b033192627ea1 100644 (file)
@@ -23,7 +23,7 @@
 #define SPUFS_H
 
 #include <linux/kref.h>
-#include <linux/rwsem.h>
+#include <linux/mutex.h>
 #include <linux/spinlock.h>
 #include <linux/fs.h>
 
@@ -37,11 +37,13 @@ enum {
 };
 
 struct spu_context_ops;
-
-#define SPU_CONTEXT_PREEMPT          0UL
-
 struct spu_gang;
 
+/* ctx->sched_flags */
+enum {
+       SPU_SCHED_WAKE = 0,
+};
+
 struct spu_context {
        struct spu *spu;                  /* pointer to a physical SPU */
        struct spu_state csa;             /* SPU context save area. */
@@ -51,10 +53,12 @@ struct spu_context {
        struct address_space *cntl;        /* 'control' area mappings. */
        struct address_space *signal1;     /* 'signal1' area mappings. */
        struct address_space *signal2;     /* 'signal2' area mappings. */
+       struct address_space *mss;         /* 'mss' area mappings. */
+       struct address_space *psmap;       /* 'psmap' area mappings. */
        u64 object_id;             /* user space pointer for oprofile */
 
        enum { SPU_STATE_RUNNABLE, SPU_STATE_SAVED } state;
-       struct rw_semaphore state_sema;
+       struct mutex state_mutex;
        struct semaphore run_sema;
 
        struct mm_struct *owner;
@@ -75,6 +79,14 @@ struct spu_context {
 
        struct list_head gang_list;
        struct spu_gang *gang;
+
+       /* scheduler fields */
+       struct list_head rq;
+       struct delayed_work sched_work;
+       unsigned long sched_flags;
+       unsigned long rt_priority;
+       int policy;
+       int prio;
 };
 
 struct spu_gang {
@@ -149,7 +161,7 @@ long spufs_run_spu(struct file *file,
                   struct spu_context *ctx, u32 *npc, u32 *status);
 long spufs_create(struct nameidata *nd,
                         unsigned int flags, mode_t mode);
-extern struct file_operations spufs_context_fops;
+extern const struct file_operations spufs_context_fops;
 
 /* gang management */
 struct spu_gang *alloc_spu_gang(void);
@@ -159,6 +171,16 @@ void spu_gang_remove_ctx(struct spu_gang *gang, struct spu_context *ctx);
 void spu_gang_add_ctx(struct spu_gang *gang, struct spu_context *ctx);
 
 /* context management */
+static inline void spu_acquire(struct spu_context *ctx)
+{
+       mutex_lock(&ctx->state_mutex);
+}
+
+static inline void spu_release(struct spu_context *ctx)
+{
+       mutex_unlock(&ctx->state_mutex);
+}
+
 struct spu_context * alloc_spu_context(struct spu_gang *gang);
 void destroy_spu_context(struct kref *kref);
 struct spu_context * get_spu_context(struct spu_context *ctx);
@@ -166,20 +188,18 @@ int put_spu_context(struct spu_context *ctx);
 void spu_unmap_mappings(struct spu_context *ctx);
 
 void spu_forget(struct spu_context *ctx);
-void spu_acquire(struct spu_context *ctx);
-void spu_release(struct spu_context *ctx);
-int spu_acquire_runnable(struct spu_context *ctx);
+int spu_acquire_runnable(struct spu_context *ctx, unsigned long flags);
 void spu_acquire_saved(struct spu_context *ctx);
 int spu_acquire_exclusive(struct spu_context *ctx);
-
-static inline void spu_release_exclusive(struct spu_context *ctx)
-{
-       up_write(&ctx->state_sema);
-}
-
-int spu_activate(struct spu_context *ctx, u64 flags);
+enum {
+       SPU_ACTIVATE_NOWAKE = 1,
+};
+int spu_activate(struct spu_context *ctx, unsigned long flags);
 void spu_deactivate(struct spu_context *ctx);
 void spu_yield(struct spu_context *ctx);
+void spu_start_tick(struct spu_context *ctx);
+void spu_stop_tick(struct spu_context *ctx);
+void spu_sched_tick(struct work_struct *work);
 int __init spu_sched_init(void);
 void __exit spu_sched_exit(void);
 
index ffa7c2c2030d27fa595ce744fa51f6925560168c..279d7339e1701a1678babb99801373485c299fbb 100644 (file)
@@ -95,7 +95,6 @@ static long beat_lpar_hpte_insert(unsigned long hpte_group,
        unsigned long lpar_rc;
        unsigned long slot;
        unsigned long hpte_v, hpte_r;
-       unsigned long flags;
 
        /* same as iseries */
        if (vflags & HPTE_V_SECONDARY)
@@ -115,17 +114,17 @@ static long beat_lpar_hpte_insert(unsigned long hpte_group,
        if (rflags & (_PAGE_GUARDED|_PAGE_NO_CACHE))
                hpte_r &= ~_PAGE_COHERENT;
 
-       spin_lock_irqsave(&beat_htab_lock, flags);
+       spin_lock(&beat_htab_lock);
        if ((lpar_rc = beat_read_mask(hpte_group)) == 0) {
                if (!(vflags & HPTE_V_BOLTED))
                        DBG_LOW(" full\n");
-               spin_unlock_irqrestore(&beat_htab_lock, flags);
+               spin_unlock(&beat_htab_lock);
                return -1;
        }
 
        lpar_rc = beat_insert_htab_entry(0, hpte_group, lpar_rc << 48,
                hpte_v, hpte_r, &slot);
-       spin_unlock_irqrestore(&beat_htab_lock, flags);
+       spin_unlock(&beat_htab_lock);
 
        /*
         * Since we try and ioremap PHBs we don't own, the pte insert
@@ -189,7 +188,6 @@ static long beat_lpar_hpte_updatepp(unsigned long slot,
 {
        unsigned long lpar_rc;
        unsigned long dummy0, dummy1, want_v;
-       unsigned long flags;
 
        want_v = hpte_encode_v(va, psize);
 
@@ -197,17 +195,17 @@ static long beat_lpar_hpte_updatepp(unsigned long slot,
                "avpnv=%016lx, slot=%016lx, psize: %d, newpp %016lx ... ",
                want_v & HPTE_V_AVPN, slot, psize, newpp);
 
-       spin_lock_irqsave(&beat_htab_lock, flags);
+       spin_lock(&beat_htab_lock);
        dummy0 = beat_lpar_hpte_getword0(slot);
        if ((dummy0 & ~0x7FUL) != (want_v & ~0x7FUL)) {
                DBG_LOW("not found !\n");
-               spin_unlock_irqrestore(&beat_htab_lock, flags);
+               spin_unlock(&beat_htab_lock);
                return -1;
        }
 
        lpar_rc = beat_write_htab_entry(0, slot, 0, newpp, 0, 7, &dummy0,
                                        &dummy1);
-       spin_unlock_irqrestore(&beat_htab_lock, flags);
+       spin_unlock(&beat_htab_lock);
        if (lpar_rc != 0 || dummy0 == 0) {
                DBG_LOW("not found !\n");
                return -1;
@@ -256,18 +254,17 @@ static void beat_lpar_hpte_updateboltedpp(unsigned long newpp,
                                          int psize)
 {
        unsigned long lpar_rc, slot, vsid, va, dummy0, dummy1;
-       unsigned long flags;
 
        vsid = get_kernel_vsid(ea);
        va = (vsid << 28) | (ea & 0x0fffffff);
 
-       spin_lock_irqsave(&beat_htab_lock, flags);
+       spin_lock(&beat_htab_lock);
        slot = beat_lpar_hpte_find(va, psize);
        BUG_ON(slot == -1);
 
        lpar_rc = beat_write_htab_entry(0, slot, 0, newpp, 0, 7,
                &dummy0, &dummy1);
-       spin_unlock_irqrestore(&beat_htab_lock, flags);
+       spin_unlock(&beat_htab_lock);
 
        BUG_ON(lpar_rc != 0);
 }
index 61599d919ea8c7f623c61449f750af31bece6ae4..3f6c4114f908c392a27e2b1d92b6691b875782de 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/kernel.h>
 #include <linux/pci.h>
 #include <linux/initrd.h>
-#include <linux/root_dev.h>
 #include <linux/mtd/physmap.h>
 
 #include <asm/time.h>
@@ -91,17 +90,6 @@ static void __init linkstation_setup_arch(void)
                               ARRAY_SIZE(linkstation_physmap_partitions));
 #endif
 
-#ifdef CONFIG_BLK_DEV_INITRD
-       if (initrd_start)
-               ROOT_DEV = Root_RAM0;
-       else
-#endif
-#ifdef CONFIG_ROOT_NFS
-               ROOT_DEV = Root_NFS;
-#else
-               ROOT_DEV = Root_HDA1;
-#endif
-
        /* Lookup PCI host bridges */
        for (np = NULL; (np = of_find_node_by_type(np, "pci")) != NULL;)
                add_bridge(np);
index c1f4502a3c6a02827773db41befced91abce8d8a..91df52a1899addd4aeaec8b39d1d5f9809cccc19 100644 (file)
@@ -308,7 +308,7 @@ static int proc_lpevents_open(struct inode *inode, struct file *file)
        return single_open(file, proc_lpevents_show, NULL);
 }
 
-static struct file_operations proc_lpevents_operations = {
+static const struct file_operations proc_lpevents_operations = {
        .open           = proc_lpevents_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index 1ad0e4aaad1a0d5ba514e4d1d136c9cf7d40907c..b1187d95e3b27fc6da3a873e374babcc1d265c4b 100644 (file)
@@ -1224,7 +1224,7 @@ out:
        return rc;
 }
 
-static struct file_operations proc_vmlinux_operations = {
+static const struct file_operations proc_vmlinux_operations = {
        .write          = proc_mf_change_vmlinux,
 };
 
@@ -1253,7 +1253,6 @@ static int __init mf_proc_init(void)
                ent = create_proc_entry("cmdline", S_IFREG|S_IRUSR|S_IWUSR, mf);
                if (!ent)
                        return 1;
-               ent->nlink = 1;
                ent->data = (void *)(long)i;
                ent->read_proc = proc_mf_dump_cmdline;
                ent->write_proc = proc_mf_change_cmdline;
@@ -1264,7 +1263,6 @@ static int __init mf_proc_init(void)
                ent = create_proc_entry("vmlinux", S_IFREG|S_IWUSR, mf);
                if (!ent)
                        return 1;
-               ent->nlink = 1;
                ent->data = (void *)(long)i;
                ent->proc_fops = &proc_vmlinux_operations;
        }
@@ -1272,7 +1270,6 @@ static int __init mf_proc_init(void)
        ent = create_proc_entry("side", S_IFREG|S_IRUSR|S_IWUSR, mf_proc_root);
        if (!ent)
                return 1;
-       ent->nlink = 1;
        ent->data = (void *)0;
        ent->read_proc = proc_mf_dump_side;
        ent->write_proc = proc_mf_change_side;
@@ -1280,7 +1277,6 @@ static int __init mf_proc_init(void)
        ent = create_proc_entry("src", S_IFREG|S_IRUSR|S_IWUSR, mf_proc_root);
        if (!ent)
                return 1;
-       ent->nlink = 1;
        ent->data = (void *)0;
        ent->read_proc = proc_mf_dump_src;
        ent->write_proc = proc_mf_change_src;
index b54e37101e6972ba75650692385af460012c0179..f2cde4180204c6559d0229b156f5440a97c43bb0 100644 (file)
@@ -101,7 +101,7 @@ static int proc_titantod_open(struct inode *inode, struct file *file)
        return single_open(file, proc_titantod_show, NULL);
 }
 
-static struct file_operations proc_titantod_operations = {
+static const struct file_operations proc_titantod_operations = {
        .open           = proc_titantod_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index a6799ed34a66c07555c71e910586328112eb8f79..e2100ece9c652759162dec6f7b0bee08656a9297 100644 (file)
@@ -173,7 +173,7 @@ static int proc_viopath_open(struct inode *inode, struct file *file)
        return single_open(file, proc_viopath_show, NULL);
 }
 
-static struct file_operations proc_viopath_operations = {
+static const struct file_operations proc_viopath_operations = {
        .open           = proc_viopath_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index 39db12890214e5e905cb69b01bc0c9a6c4bf1ad0..5e5c0e4add91dc09cf465d0e3bd9eb0f4dfdabb8 100644 (file)
@@ -305,8 +305,6 @@ static int pmac_pic_host_map(struct irq_host *h, unsigned int virq,
        level = !!(level_mask[hw >> 5] & (1UL << (hw & 0x1f)));
        if (level)
                desc->status |= IRQ_LEVEL;
-       else
-               desc->status |= IRQ_DELAYED_DISABLE;
        set_irq_chip_and_handler(virq, &pmac_pic, level ?
                                 handle_level_irq : handle_edge_irq);
        return 0;
index d949e9df41ef65b8ffa9d836d0a98f425da325e3..651fa424ea06c5ef10be103ac3c888856f6aacaa 100644 (file)
@@ -506,8 +506,8 @@ void note_bootable_part(dev_t dev, int part, int goodness)
        if ((goodness <= current_root_goodness) &&
            ROOT_DEV != DEFAULT_ROOT_DEVICE)
                return;
-       p = strstr(saved_command_line, "root=");
-       if (p != NULL && (p == saved_command_line || p[-1] == ' '))
+       p = strstr(boot_command_line, "root=");
+       if (p != NULL && (p == boot_command_line || p[-1] == ' '))
                return;
 
        if (!found_boot) {
index de52ec4e9e586c7d11e088587beddfb669ce4a6e..4be3943d1c0dca360c13cc144969f3c459b8fdeb 100644 (file)
@@ -51,4 +51,15 @@ config PS3_VUART
          including the System Manager and AV Settings.  In
          general, all users will say Y.
 
+config PS3_PS3AV
+       tristate "PS3 AV settings driver"
+       depends on PPC_PS3
+       select PS3_VUART
+       default y
+       help
+         Include support for the PS3 AV Settings driver.
+
+         This support is required for graphics and sound. In
+         general, all users will say Y or M.
+
 endmenu
index a4b5a1bc60f4aa6c5a2c441dff52629a3e2da3bb..e12e59fea13a5a8a94517f580c3c1d5e5041d37d 100644 (file)
@@ -2,7 +2,7 @@
  *  PS3 pagetable management routines.
  *
  *  Copyright (C) 2006 Sony Computer Entertainment Inc.
- *  Copyright 2006 Sony Corp.
+ *  Copyright 2006, 2007 Sony 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
@@ -24,6 +24,7 @@
 #include <asm/lmb.h>
 #include <asm/udbg.h>
 #include <asm/lv1call.h>
+#include <asm/ps3fb.h>
 
 #include "platform.h"
 
@@ -233,6 +234,9 @@ static void ps3_hpte_invalidate(unsigned long slot, unsigned long va,
 
 static void ps3_hpte_clear(void)
 {
+       /* Make sure to clean up the frame buffer device first */
+       ps3fb_cleanup();
+
        lv1_unmap_htab(htab_addr);
 }
 
index e62505e1881300e17d5581cde9c0ebc018c56188..13d669a8ecae6d00e25fc816d163e711db8cb7f7 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/root_dev.h>
 #include <linux/console.h>
 #include <linux/kexec.h>
+#include <linux/bootmem.h>
 
 #include <asm/machdep.h>
 #include <asm/firmware.h>
@@ -80,6 +81,46 @@ static void ps3_panic(char *str)
        for (;;) ;
 }
 
+
+static void prealloc(struct ps3_prealloc *p)
+{
+       if (!p->size)
+               return;
+
+       p->address = __alloc_bootmem(p->size, p->align, __pa(MAX_DMA_ADDRESS));
+       if (!p->address) {
+               printk(KERN_ERR "%s: Cannot allocate %s\n", __FUNCTION__,
+                      p->name);
+               return;
+       }
+
+       printk(KERN_INFO "%s: %lu bytes at %p\n", p->name, p->size,
+              p->address);
+}
+
+#ifdef CONFIG_FB_PS3
+struct ps3_prealloc ps3fb_videomemory = {
+    .name = "ps3fb videomemory",
+    .size = CONFIG_FB_PS3_DEFAULT_SIZE_M*1024*1024,
+    .align = 1024*1024                 /* the GPU requires 1 MiB alignment */
+};
+#define prealloc_ps3fb_videomemory()   prealloc(&ps3fb_videomemory)
+
+static int __init early_parse_ps3fb(char *p)
+{
+       if (!p)
+               return 1;
+
+       ps3fb_videomemory.size = _ALIGN_UP(memparse(p, &p),
+                                          ps3fb_videomemory.align);
+       return 0;
+}
+early_param("ps3fb", early_parse_ps3fb);
+#else
+#define prealloc_ps3fb_videomemory()   do { } while (0)
+#endif
+
+
 static void __init ps3_setup_arch(void)
 {
        union ps3_firmware_version v;
@@ -101,6 +142,7 @@ static void __init ps3_setup_arch(void)
        conswitchp = &dummy_con;
 #endif
 
+       prealloc_ps3fb_videomemory();
        ppc_md.power_save = ps3_power_save;
 
        DBG(" <- %s:%d\n", __func__, __LINE__);
index d1929721b0e47be7d868b64e07443190605616f3..a397e4e17c13ca93230f2a33977b4627170c3f21 100644 (file)
@@ -170,31 +170,6 @@ static int __init construct_spu(struct spu *spu)
        return result;
 }
 
-static int __init add_spu_pages(unsigned long start_addr, unsigned long size)
-{
-       int result;
-       unsigned long start_pfn;
-       unsigned long nr_pages;
-       struct pglist_data *pgdata;
-       struct zone *zone;
-
-       BUG_ON(!mem_init_done);
-
-       start_pfn = start_addr >> PAGE_SHIFT;
-       nr_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
-
-       pgdata = NODE_DATA(0);
-       zone = pgdata->node_zones;
-
-       result = __add_pages(zone, start_pfn, nr_pages);
-
-       if (result)
-               pr_debug("%s:%d: __add_pages failed: (%d)\n",
-                       __func__, __LINE__, result);
-
-       return result;
-}
-
 static void spu_unmap(struct spu *spu)
 {
        iounmap(spu->priv2);
@@ -206,19 +181,6 @@ static void spu_unmap(struct spu *spu)
 static int __init setup_areas(struct spu *spu)
 {
        struct table {char* name; unsigned long addr; unsigned long size;};
-       int result;
-
-       /* setup pages */
-
-       result = add_spu_pages(spu->local_store_phys, LS_SIZE);
-       if (result)
-               goto fail_add;
-
-       result = add_spu_pages(spu->problem_phys, sizeof(struct spu_problem));
-       if (result)
-               goto fail_add;
-
-       /* ioremap */
 
        spu_pdata(spu)->shadow = __ioremap(
                spu_pdata(spu)->shadow_addr, sizeof(struct spe_shadow),
@@ -260,8 +222,8 @@ static int __init setup_areas(struct spu *spu)
 
 fail_ioremap:
        spu_unmap(spu);
-fail_add:
-       return result;
+
+       return -ENOMEM;
 }
 
 static int __init setup_interrupts(struct spu *spu)
index 69590fbf83daef9ba3a246c7e9f9a14b0d8261b5..dc0583bdbc637ec769e817cab5ad68f8216f37ca 100644 (file)
@@ -9,6 +9,7 @@ obj-$(CONFIG_SMP)       += smp.o
 obj-$(CONFIG_XICS)     += xics.o
 obj-$(CONFIG_SCANLOG)  += scanlog.o
 obj-$(CONFIG_EEH)      += eeh.o eeh_cache.o eeh_driver.o eeh_event.o
+obj-$(CONFIG_KEXEC)    += kexec.o
 
 obj-$(CONFIG_HOTPLUG_CPU)      += hotplug-cpu.o
 
index 9437f48cc9e731302f017905aa2099d233658659..6cedbc002e0ffb3a2f4449b73d1388336cb2a327 100644 (file)
@@ -1078,7 +1078,7 @@ static int proc_eeh_open(struct inode *inode, struct file *file)
        return single_open(file, proc_eeh_show, NULL);
 }
 
-static struct file_operations proc_eeh_operations = {
+static const struct file_operations proc_eeh_operations = {
        .open      = proc_eeh_open,
        .read      = seq_read,
        .llseek    = seq_lseek,
diff --git a/arch/powerpc/platforms/pseries/firmware.h b/arch/powerpc/platforms/pseries/firmware.h
deleted file mode 100644 (file)
index 714f56f..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright 2006 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.
- */
-
-#ifndef _PSERIES_FIRMWARE_H
-#define _PSERIES_FIRMWARE_H
-
-#include <asm/firmware.h>
-
-extern void __init fw_feature_init(void);
-
-#endif /* _PSERIES_FIRMWARE_H */
index 3ddc04925d50d01f85266379ffe6d96a0a406aa0..eae51ef9af2441c2b12660ad786e3a318e567436 100644 (file)
@@ -90,7 +90,7 @@ static int hcall_inst_seq_open(struct inode *inode, struct file *file)
        return rc;
 }
 
-static struct file_operations hcall_inst_seq_fops = {
+static const struct file_operations hcall_inst_seq_fops = {
        .open = hcall_inst_seq_open,
        .read = seq_read,
        .llseek = seq_lseek,
diff --git a/arch/powerpc/platforms/pseries/kexec.c b/arch/powerpc/platforms/pseries/kexec.c
new file mode 100644 (file)
index 0000000..af26856
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ *  Copyright 2006 Michael Ellerman, 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.
+ */
+
+#include <asm/machdep.h>
+#include <asm/page.h>
+#include <asm/firmware.h>
+#include <asm/kexec.h>
+#include <asm/mpic.h>
+
+#include "pseries.h"
+#include "xics.h"
+#include "plpar_wrappers.h"
+
+static void pseries_kexec_cpu_down(int crash_shutdown, int secondary)
+{
+       /* Don't risk a hypervisor call if we're crashing */
+       if (firmware_has_feature(FW_FEATURE_SPLPAR) && !crash_shutdown) {
+               unsigned long addr;
+
+               addr = __pa(get_slb_shadow());
+               if (unregister_slb_shadow(hard_smp_processor_id(), addr))
+                       printk("SLB shadow buffer deregistration of "
+                              "cpu %u (hw_cpu_id %d) failed\n",
+                              smp_processor_id(),
+                              hard_smp_processor_id());
+
+               addr = __pa(get_lppaca());
+               if (unregister_vpa(hard_smp_processor_id(), addr)) {
+                       printk("VPA deregistration of cpu %u (hw_cpu_id %d) "
+                                       "failed\n", smp_processor_id(),
+                                       hard_smp_processor_id());
+               }
+       }
+}
+
+static void pseries_kexec_cpu_down_mpic(int crash_shutdown, int secondary)
+{
+       pseries_kexec_cpu_down(crash_shutdown, secondary);
+       mpic_teardown_this_cpu(secondary);
+}
+
+void __init setup_kexec_cpu_down_mpic(void)
+{
+       ppc_md.kexec_cpu_down = pseries_kexec_cpu_down_mpic;
+}
+
+static void pseries_kexec_cpu_down_xics(int crash_shutdown, int secondary)
+{
+       pseries_kexec_cpu_down(crash_shutdown, secondary);
+       xics_teardown_cpu(secondary);
+}
+
+void __init setup_kexec_cpu_down_xics(void)
+{
+       ppc_md.kexec_cpu_down = pseries_kexec_cpu_down_xics;
+}
+
+static int __init pseries_kexec_setup(void)
+{
+       ppc_md.machine_kexec = default_machine_kexec;
+       ppc_md.machine_kexec_prepare = default_machine_kexec_prepare;
+       ppc_md.machine_crash_shutdown = default_machine_crash_shutdown;
+
+       return 0;
+}
+__initcall(pseries_kexec_setup);
index c69bd15ced9c1497b8ec645e1ee11dbc8142464d..fa59124ce3febe98fe6c8015f071cb12e003b5bd 100644 (file)
@@ -98,6 +98,10 @@ static void fixup_winbond_82c105(struct pci_dev* dev)
                if (dev->resource[i].flags & IORESOURCE_IO
                    && dev->bus->number == 0 && dev->devfn == 0x81)
                        dev->resource[i].flags &= ~IORESOURCE_IO;
+               if (dev->resource[i].start == 0 && dev->resource[i].end) {
+                       dev->resource[i].flags = 0;
+                       dev->resource[i].end = 0;
+               }
        }
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105,
diff --git a/arch/powerpc/platforms/pseries/pseries.h b/arch/powerpc/platforms/pseries/pseries.h
new file mode 100644 (file)
index 0000000..b43f139
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2006 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.
+ */
+
+#ifndef _PSERIES_PSERIES_H
+#define _PSERIES_PSERIES_H
+
+extern void __init fw_feature_init(void);
+
+struct pt_regs;
+
+extern int pSeries_system_reset_exception(struct pt_regs *regs);
+extern int pSeries_machine_check_exception(struct pt_regs *regs);
+
+#ifdef CONFIG_SMP
+extern void smp_init_pseries_mpic(void);
+extern void smp_init_pseries_xics(void);
+#else
+static inline smp_init_pseries_mpic(void) { };
+static inline smp_init_pseries_xics(void) { };
+#endif
+
+#ifdef CONFIG_KEXEC
+extern void setup_kexec_cpu_down_xics(void);
+extern void setup_kexec_cpu_down_mpic(void);
+#else
+static inline setup_kexec_cpu_down_xics(void) { };
+static inline setup_kexec_cpu_down_mpic(void) { };
+#endif
+
+#endif /* _PSERIES_PSERIES_H */
index b1d3d161249ec4724a4b14a685ad38c8d9ba6009..edc0388731132f7c1daa63940591ac79dc39d428 100644 (file)
@@ -51,7 +51,7 @@
 #include <asm/udbg.h>
 #include <asm/firmware.h>
 
-#include "ras.h"
+#include "pseries.h"
 
 static unsigned char ras_log_buf[RTAS_ERROR_LOG_MAX];
 static DEFINE_SPINLOCK(ras_log_buf_lock);
diff --git a/arch/powerpc/platforms/pseries/ras.h b/arch/powerpc/platforms/pseries/ras.h
deleted file mode 100644 (file)
index 0e66b0d..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#ifndef _PSERIES_RAS_H
-#define _PSERIES_RAS_H
-
-struct pt_regs;
-
-extern int pSeries_system_reset_exception(struct pt_regs *regs);
-extern int pSeries_machine_check_exception(struct pt_regs *regs);
-
-#endif /* _PSERIES_RAS_H */
index 4ad33e41b0082794582e9a8710d063aa6e7ab599..5aa97aff3391ee9a822997d6d4cd893798324725 100644 (file)
@@ -499,7 +499,7 @@ out:
        return rv ? rv : count;
 }
 
-static struct file_operations ofdt_fops = {
+static const struct file_operations ofdt_fops = {
        .write = ofdt_write
 };
 
@@ -513,7 +513,6 @@ static int proc_ppc64_create_ofdt(void)
 
        ent = create_proc_entry("ppc64/ofdt", S_IWUSR, NULL);
        if (ent) {
-               ent->nlink = 1;
                ent->data = NULL;
                ent->size = 0;
                ent->proc_fops = &ofdt_fops;
index 8ca2612221d65c2f85763b5ba09f6d69d22098cf..77d0937d5c07a334643f4e8518ad59ca7a854afd 100644 (file)
@@ -331,7 +331,7 @@ static unsigned int rtas_log_poll(struct file *file, poll_table * wait)
        return 0;
 }
 
-struct file_operations proc_rtas_log_operations = {
+const struct file_operations proc_rtas_log_operations = {
        .read =         rtas_log_read,
        .poll =         rtas_log_poll,
        .open =         rtas_log_open,
index 45368a57d7ddd02541a8db3a009031bab995cadb..8e1ef168e2ddfd67c111b0059e994f640ef17b57 100644 (file)
@@ -184,7 +184,7 @@ static int scanlog_release(struct inode * inode, struct file * file)
        return 0;
 }
 
-struct file_operations scanlog_fops = {
+const struct file_operations scanlog_fops = {
        .owner          = THIS_MODULE,
        .read           = scanlog_read,
        .write          = scanlog_write,
index 042ecae107ac89066c5596ab0ccafe58161539d9..435a045965261fec6bff86d23bdfe8c5212f6440 100644 (file)
@@ -55,7 +55,6 @@
 #include <asm/dma.h>
 #include <asm/machdep.h>
 #include <asm/irq.h>
-#include <asm/kexec.h>
 #include <asm/time.h>
 #include <asm/nvram.h>
 #include "xics.h"
 #include <asm/i8259.h>
 #include <asm/udbg.h>
 #include <asm/smp.h>
+#include <asm/firmware.h>
 
 #include "plpar_wrappers.h"
-#include "ras.h"
-#include "firmware.h"
+#include "pseries.h"
 
 #ifdef DEBUG
 #define DBG(fmt...) udbg_printf(fmt)
@@ -77,8 +76,6 @@
 #endif
 
 /* move those away to a .h */
-extern void smp_init_pseries_mpic(void);
-extern void smp_init_pseries_xics(void);
 extern void find_udbg_vterm(void);
 
 int fwnmi_active;  /* TRUE if an FWNMI handler is present */
@@ -221,42 +218,6 @@ static void pseries_lpar_enable_pmcs(void)
                get_lppaca()->pmcregs_in_use = 1;
 }
 
-#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 (firmware_has_feature(FW_FEATURE_SPLPAR) && !crash_shutdown) {
-               unsigned long addr;
-
-               addr = __pa(get_slb_shadow());
-               if (unregister_slb_shadow(hard_smp_processor_id(), addr))
-                       printk("SLB shadow buffer deregistration of "
-                              "cpu %u (hw_cpu_id %d) failed\n",
-                              smp_processor_id(),
-                              hard_smp_processor_id());
-
-               addr = __pa(get_lppaca());
-               if (unregister_vpa(hard_smp_processor_id(), addr)) {
-                       printk("VPA deregistration of cpu %u (hw_cpu_id %d) "
-                                       "failed\n", smp_processor_id(),
-                                       hard_smp_processor_id());
-               }
-       }
-}
-
-static void pseries_kexec_cpu_down_mpic(int crash_shutdown, int secondary)
-{
-       pseries_kexec_cpu_down(crash_shutdown, secondary);
-       mpic_teardown_this_cpu(secondary);
-}
-
-static void pseries_kexec_cpu_down_xics(int crash_shutdown, int secondary)
-{
-       pseries_kexec_cpu_down(crash_shutdown, secondary);
-       xics_teardown_cpu(secondary);
-}
-#endif /* CONFIG_KEXEC */
-
 static void __init pseries_discover_pic(void)
 {
        struct device_node *np;
@@ -269,21 +230,13 @@ static void __init pseries_discover_pic(void)
                        pSeries_mpic_node = of_node_get(np);
                        ppc_md.init_IRQ       = pseries_mpic_init_IRQ;
                        ppc_md.get_irq        = mpic_get_irq;
-#ifdef CONFIG_KEXEC
-                       ppc_md.kexec_cpu_down = pseries_kexec_cpu_down_mpic;
-#endif
-#ifdef CONFIG_SMP
+                       setup_kexec_cpu_down_mpic();
                        smp_init_pseries_mpic();
-#endif
                        return;
                } else if (strstr(typep, "ppc-xicp")) {
                        ppc_md.init_IRQ       = xics_init_IRQ;
-#ifdef CONFIG_KEXEC
-                       ppc_md.kexec_cpu_down = pseries_kexec_cpu_down_xics;
-#endif
-#ifdef CONFIG_SMP
+                       setup_kexec_cpu_down_xics();
                        smp_init_pseries_xics();
-#endif
                        return;
                }
        }
@@ -554,9 +507,4 @@ define_machine(pseries) {
        .check_legacy_ioport    = pSeries_check_legacy_ioport,
        .system_reset_exception = pSeries_system_reset_exception,
        .machine_check_exception = pSeries_machine_check_exception,
-#ifdef CONFIG_KEXEC
-       .machine_kexec          = default_machine_kexec,
-       .machine_kexec_prepare  = default_machine_kexec_prepare,
-       .machine_crash_shutdown = default_machine_crash_shutdown,
-#endif
 };
index 4408518eaebe4afe76d6a1b3f354a4a6cc0a0421..116305b22a2bf209721e12bfca19666e6a293432 100644 (file)
@@ -48,6 +48,7 @@
 #include <asm/vdso_datapage.h>
 
 #include "plpar_wrappers.h"
+#include "pseries.h"
 
 #ifdef DEBUG
 #include <asm/udbg.h>
index 9f2a9a444bfbce7cf8aa1dc5713f1b0ca11db625..34161bc5a02f6384e7baf33e24de303325025872 100644 (file)
@@ -441,7 +441,8 @@ static int __init fsl_usb_of_init(void)
 {
        struct device_node *np;
        unsigned int i;
-       struct platform_device *usb_dev_mph = NULL, *usb_dev_dr = NULL;
+       struct platform_device *usb_dev_mph = NULL, *usb_dev_dr_host = NULL,
+               *usb_dev_dr_client = NULL;
        int ret;
 
        for (np = NULL, i = 0;
@@ -507,33 +508,72 @@ static int __init fsl_usb_of_init(void)
 
                of_irq_to_resource(np, 0, &r[1]);
 
-               usb_dev_dr =
-                   platform_device_register_simple("fsl-ehci", i, r, 2);
-               if (IS_ERR(usb_dev_dr)) {
-                       ret = PTR_ERR(usb_dev_dr);
+               prop = get_property(np, "dr_mode", NULL);
+
+               if (!prop || !strcmp(prop, "host")) {
+                       usb_data.operating_mode = FSL_USB2_DR_HOST;
+                       usb_dev_dr_host = platform_device_register_simple(
+                                       "fsl-ehci", i, r, 2);
+                       if (IS_ERR(usb_dev_dr_host)) {
+                               ret = PTR_ERR(usb_dev_dr_host);
+                               goto err;
+                       }
+               } else if (prop && !strcmp(prop, "peripheral")) {
+                       usb_data.operating_mode = FSL_USB2_DR_DEVICE;
+                       usb_dev_dr_client = platform_device_register_simple(
+                                       "fsl-usb2-udc", i, r, 2);
+                       if (IS_ERR(usb_dev_dr_client)) {
+                               ret = PTR_ERR(usb_dev_dr_client);
+                               goto err;
+                       }
+               } else if (prop && !strcmp(prop, "otg")) {
+                       usb_data.operating_mode = FSL_USB2_DR_OTG;
+                       usb_dev_dr_host = platform_device_register_simple(
+                                       "fsl-ehci", i, r, 2);
+                       if (IS_ERR(usb_dev_dr_host)) {
+                               ret = PTR_ERR(usb_dev_dr_host);
+                               goto err;
+                       }
+                       usb_dev_dr_client = platform_device_register_simple(
+                                       "fsl-usb2-udc", i, r, 2);
+                       if (IS_ERR(usb_dev_dr_client)) {
+                               ret = PTR_ERR(usb_dev_dr_client);
+                               goto err;
+                       }
+               } else {
+                       ret = -EINVAL;
                        goto err;
                }
 
-               usb_dev_dr->dev.coherent_dma_mask = 0xffffffffUL;
-               usb_dev_dr->dev.dma_mask = &usb_dev_dr->dev.coherent_dma_mask;
-
-               usb_data.operating_mode = FSL_USB2_DR_HOST;
-
                prop = get_property(np, "phy_type", NULL);
                usb_data.phy_mode = determine_usb_phy(prop);
 
-               ret =
-                   platform_device_add_data(usb_dev_dr, &usb_data,
-                                            sizeof(struct
-                                                   fsl_usb2_platform_data));
-               if (ret)
-                       goto unreg_dr;
+               if (usb_dev_dr_host) {
+                       usb_dev_dr_host->dev.coherent_dma_mask = 0xffffffffUL;
+                       usb_dev_dr_host->dev.dma_mask = &usb_dev_dr_host->
+                               dev.coherent_dma_mask;
+                       if ((ret = platform_device_add_data(usb_dev_dr_host,
+                                               &usb_data, sizeof(struct
+                                               fsl_usb2_platform_data))))
+                               goto unreg_dr;
+               }
+               if (usb_dev_dr_client) {
+                       usb_dev_dr_client->dev.coherent_dma_mask = 0xffffffffUL;
+                       usb_dev_dr_client->dev.dma_mask = &usb_dev_dr_client->
+                               dev.coherent_dma_mask;
+                       if ((ret = platform_device_add_data(usb_dev_dr_client,
+                                               &usb_data, sizeof(struct
+                                               fsl_usb2_platform_data))))
+                               goto unreg_dr;
+               }
        }
        return 0;
 
 unreg_dr:
-       if (usb_dev_dr)
-               platform_device_unregister(usb_dev_dr);
+       if (usb_dev_dr_host)
+               platform_device_unregister(usb_dev_dr_host);
+       if (usb_dev_dr_client)
+               platform_device_unregister(usb_dev_dr_client);
 unreg_mph:
        if (usb_dev_mph)
                platform_device_unregister(usb_dev_mph);
@@ -699,7 +739,7 @@ static int __init fs_enet_of_init(void)
                                if (ret)
                                        goto unreg;
                        }
-                       
+
                        of_node_put(phy);
                        of_node_put(mdio);
 
index aa701cc27ecc5e20af599e4d66c28ca0c81f097c..4e54a09dd33b1fc0c197ad77fa4c47123ba6b0a5 100644 (file)
@@ -1395,4 +1395,25 @@ void smp_mpic_message_pass(int target, int msg)
                break;
        }
 }
+
+int __init smp_mpic_probe(void)
+{
+       int nr_cpus;
+
+       DBG("smp_mpic_probe()...\n");
+
+       nr_cpus = cpus_weight(cpu_possible_map);
+
+       DBG("nr_cpus: %d\n", nr_cpus);
+
+       if (nr_cpus > 1)
+               mpic_request_ipis();
+
+       return nr_cpus;
+}
+
+void __devinit smp_mpic_setup_cpu(int cpu)
+{
+       mpic_setup_this_cpu();
+}
 #endif /* CONFIG_SMP */
index 47b56203f47ee0017656ba1d654f831b8dd2e74d..0e97e5c94f8ac98e318eee16ceade00f23aac308 100644 (file)
@@ -179,7 +179,7 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc
        uccs->us_info = us_info;
        uccs->saved_uccm = 0;
        uccs->p_rx_frame = 0;
-       uccs->us_regs = us_info->us_regs;
+       uccs->us_regs = us_info->regs;
        us_regs = uccs->us_regs;
        uccs->p_ucce = (u16 *) & (us_regs->ucce);
        uccs->p_uccm = (u16 *) & (us_regs->uccm);
@@ -206,7 +206,7 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc
        uccs->us_pram = qe_muram_addr(uccs->us_pram_offset);
 
        /* Init Guemr register */
-       if ((ret = ucc_init_guemr((struct ucc_common *) (us_info->us_regs)))) {
+       if ((ret = ucc_init_guemr((struct ucc_common *) (us_info->regs)))) {
                uccs_err("ucc_slow_init: Could not init the guemr register.");
                ucc_slow_free(uccs);
                return ret;
@@ -214,7 +214,7 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc
 
        /* Set UCC to slow type */
        if ((ret = ucc_set_type(us_info->ucc_num,
-                               (struct ucc_common *) (us_info->us_regs),
+                               (struct ucc_common *) (us_info->regs),
                                UCC_SPEED_TYPE_SLOW))) {
                uccs_err("ucc_slow_init: Could not init the guemr register.");
                ucc_slow_free(uccs);
index 77540a2f77040734396570889e6127230d965404..0183e5fbaf46bc7ccb7b159b0035a94c72b23c3c 100644 (file)
@@ -2811,7 +2811,6 @@ static void dump_spu_fields(struct spu *spu)
        DUMP_FIELD(spu, "0x%lx", irqs[2]);
        DUMP_FIELD(spu, "0x%x", slb_replace);
        DUMP_FIELD(spu, "%d", pid);
-       DUMP_FIELD(spu, "%d", prio);
        DUMP_FIELD(spu, "0x%p", mm);
        DUMP_FIELD(spu, "0x%p", ctx);
        DUMP_FIELD(spu, "0x%p", rq);
index 684ed04eb8b8aedcd7bb1cd88b147de90f13b4da..a956f28ab162b8d825a8cc068ca62a021249a313 100644 (file)
@@ -1711,7 +1711,7 @@ static int mixer_ioctl(struct inode *inode, struct file *file, u_int cmd,
 }
 
 
-static struct file_operations mixer_fops =
+static const struct file_operations mixer_fops =
 {
        .owner =        THIS_MODULE,
        .llseek =       sound_lseek,
@@ -2298,7 +2298,7 @@ static int sq_ioctl(struct inode *inode, struct file *file, u_int cmd,
 
 
 
-static struct file_operations sq_fops =
+static const struct file_operations sq_fops =
 {
        .owner =        THIS_MODULE,
        .llseek =       sound_lseek,
@@ -2433,7 +2433,7 @@ static ssize_t state_read(struct file *file, char *buf, size_t count,
 }
 
 
-static struct file_operations state_fops =
+static const struct file_operations state_fops =
 {
        .owner =        THIS_MODULE,
        .llseek =       sound_lseek,
index c22e60619d9bb6c257f0b7a6483c355cf45112ea..0df9c33629fd992159cf95406157886dff090994 100644 (file)
@@ -1177,6 +1177,10 @@ config ISA
          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 ZONE_DMA
+       bool
+       default y
+
 config GENERIC_ISA_DMA
        bool
        depends on 6xx && !CPM2
diff --git a/arch/ppc/configs/taishan_defconfig b/arch/ppc/configs/taishan_defconfig
new file mode 100644 (file)
index 0000000..1ca0204
--- /dev/null
@@ -0,0 +1,1077 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.20
+# Mon Feb 12 11:11:58 2007
+#
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+CONFIG_ARCH_HAS_ILOG2_U32=y
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_PPC=y
+CONFIG_PPC32=y
+CONFIG_GENERIC_NVRAM=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_GENERIC_BUG=y
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_SYSFS_DEPRECATED=y
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+# CONFIG_HOTPLUG is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_LBD is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_LSF 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"
+
+#
+# Processor
+#
+# CONFIG_6xx is not set
+# CONFIG_40x is not set
+CONFIG_44x=y
+# CONFIG_8xx is not set
+# CONFIG_E200 is not set
+# CONFIG_E500 is not set
+CONFIG_PPC_DCR_NATIVE=y
+CONFIG_PPC_DCR=y
+CONFIG_BOOKE=y
+CONFIG_PTE_64BIT=y
+CONFIG_PHYS_64BIT=y
+# CONFIG_MATH_EMULATION is not set
+# CONFIG_KEXEC is not set
+# CONFIG_CPU_FREQ is not set
+CONFIG_4xx=y
+CONFIG_WANT_EARLY_SERIAL=y
+
+#
+# IBM 4xx options
+#
+# CONFIG_BAMBOO is not set
+# CONFIG_EBONY is not set
+# CONFIG_LUAN is not set
+# CONFIG_YUCCA is not set
+# CONFIG_OCOTEA is not set
+CONFIG_TAISHAN=y
+CONFIG_440GX=y
+CONFIG_440A=y
+CONFIG_IBM_OCP=y
+CONFIG_IBM_EMAC4=y
+CONFIG_PPC4xx_DMA=y
+CONFIG_PPC4xx_EDMA=y
+CONFIG_PPC_GEN550=y
+CONFIG_NOT_COHERENT_CACHE=y
+
+#
+# Platform options
+#
+# CONFIG_PC_KEYBOARD is not set
+# CONFIG_HIGHMEM is not set
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
+# 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_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_SPLIT_PTLOCK_CPUS=4
+CONFIG_RESOURCES_64BIT=y
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_CMDLINE_BOOL=y
+CONFIG_CMDLINE="ip=on console=ttyS0,115200"
+CONFIG_SECCOMP=y
+CONFIG_ISA_DMA_API=y
+
+#
+# Bus options
+#
+CONFIG_ZONE_DMA=y
+# CONFIG_PPC_I8259 is not set
+CONFIG_PPC_INDIRECT_PCI=y
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+# CONFIG_PCI_DEBUG is not set
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+
+#
+# Advanced setup
+#
+# CONFIG_ADVANCED_OPTIONS is not set
+
+#
+# Default settings for advanced configuration options are used
+#
+CONFIG_HIGHMEM_START=0xfe000000
+CONFIG_LOWMEM_SIZE=0x30000000
+CONFIG_KERNEL_START=0xc0000000
+CONFIG_TASK_SIZE=0x80000000
+CONFIG_CONSISTENT_START=0xff100000
+CONFIG_CONSISTENT_SIZE=0x00200000
+CONFIG_BOOT_LOAD=0x01000000
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_ASK_IP_FIB_HASH=y
+# CONFIG_IP_FIB_TRIE is not set
+CONFIG_IP_FIB_HASH=y
+# CONFIG_IP_MULTIPLE_TABLES is not set
+# CONFIG_IP_ROUTE_MULTIPATH is not set
+# CONFIG_IP_ROUTE_VERBOSE is not set
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE 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_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK 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
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+CONFIG_BRIDGE=y
+# 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_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED 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 is not set
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+CONFIG_MTD_CMDLINE_PARTS=y
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
+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
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+CONFIG_MTD_JEDECPROBE=y
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_NOSWAP=y
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_GEOMETRY is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_OTP is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+CONFIG_MTD_CFI_AMDSTD=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+
+#
+# Mapping drivers for chip access
+#
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+CONFIG_MTD_PHYSMAP=y
+CONFIG_MTD_PHYSMAP_START=0x8000000
+CONFIG_MTD_PHYSMAP_LEN=0x0
+CONFIG_MTD_PHYSMAP_BANKWIDTH=2
+# CONFIG_MTD_PCI is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+
+#
+# NAND Flash Device Drivers
+#
+# CONFIG_MTD_NAND is not set
+# CONFIG_MTD_NAND_CAFE is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND 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_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=65536
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+
+#
+# Misc devices
+#
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA 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
+#
+# CONFIG_MAC_EMUMOUSEBTN is not set
+# CONFIG_WINDFARM is not set
+
+#
+# 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_IBM_EMAC=y
+CONFIG_IBM_EMAC_RXB=128
+CONFIG_IBM_EMAC_TXB=128
+CONFIG_IBM_EMAC_POLL_WEIGHT=32
+CONFIG_IBM_EMAC_RX_COPY_THRESHOLD=256
+CONFIG_IBM_EMAC_RX_SKB_HEADROOM=0
+CONFIG_IBM_EMAC_PHY_RX_CLK_FIX=y
+# CONFIG_IBM_EMAC_DEBUG is not set
+CONFIG_IBM_EMAC_ZMII=y
+CONFIG_IBM_EMAC_RGMII=y
+CONFIG_IBM_EMAC_TAH=y
+CONFIG_NET_PCI=y
+# CONFIG_PCNET32 is not set
+# 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_TLAN is not set
+# CONFIG_VIA_RHINE is not set
+# CONFIG_SC92031 is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+# CONFIG_ACENIC is not set
+# CONFIG_DL2K is not set
+# CONFIG_E1000 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_SKY2 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_QLA3XXX is not set
+# CONFIG_ATL1 is not set
+
+#
+# Ethernet (10000 Mbit)
+#
+# CONFIG_CHELSIO_T1 is not set
+# CONFIG_CHELSIO_T3 is not set
+# CONFIG_IXGB is not set
+# CONFIG_S2IO is not set
+# CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC 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=y
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+# CONFIG_PPP_ASYNC is not set
+# CONFIG_PPP_SYNC_TTY is not set
+# CONFIG_PPP_DEFLATE is not set
+# CONFIG_PPP_BSDCOMP is not set
+# CONFIG_PPP_MPPE is not set
+CONFIG_PPPOE=y
+# CONFIG_SLIP is not set
+CONFIG_SLHC=y
+# 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 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_LIBPS2 is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+# CONFIG_VT is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_PCI=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+CONFIG_SERIAL_8250_EXTENDED=y
+# CONFIG_SERIAL_8250_MANY_PORTS is not set
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_RSA is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_UARTLITE is not set
+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_HW_RANDOM=m
+# CONFIG_NVRAM is not set
+# CONFIG_GEN_RTC is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+# CONFIG_APPLICOM is not set
+# CONFIG_AGP is not set
+# CONFIG_DRM is not set
+# CONFIG_RAW_DRIVER 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 is not set
+# 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_IBM_IIC=y
+# CONFIG_I2C_MPC is not set
+# CONFIG_I2C_NFORCE2 is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_PROSAVAGE is not set
+# CONFIG_I2C_SAVAGE4 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=y
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_M41T00 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
+
+#
+# SPI support
+#
+# CONFIG_SPI is not set
+# CONFIG_SPI_MASTER is not set
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+CONFIG_HWMON=y
+# CONFIG_HWMON_VID is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_ADM1021 is not set
+# CONFIG_SENSORS_ADM1025 is not set
+# CONFIG_SENSORS_ADM1026 is not set
+# CONFIG_SENSORS_ADM1031 is not set
+# CONFIG_SENSORS_ADM9240 is not set
+# CONFIG_SENSORS_ASB100 is not set
+# CONFIG_SENSORS_ATXP1 is not set
+# CONFIG_SENSORS_DS1621 is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_FSCHER is not set
+# CONFIG_SENSORS_FSCPOS is not set
+# CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
+# CONFIG_SENSORS_IT87 is not set
+# CONFIG_SENSORS_LM63 is not set
+# CONFIG_SENSORS_LM75 is not set
+# CONFIG_SENSORS_LM77 is not set
+# CONFIG_SENSORS_LM78 is not set
+# CONFIG_SENSORS_LM80 is not set
+# CONFIG_SENSORS_LM83 is not set
+# CONFIG_SENSORS_LM85 is not set
+# CONFIG_SENSORS_LM87 is not set
+# CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
+# CONFIG_SENSORS_MAX1619 is not set
+# CONFIG_SENSORS_PC87360 is not set
+# CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_SIS5595 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47M192 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_VIA686A is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_VT8231 is not set
+# CONFIG_SENSORS_W83781D is not set
+# CONFIG_SENSORS_W83791D is not set
+# CONFIG_SENSORS_W83792D is not set
+# CONFIG_SENSORS_W83793 is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83627HF is not set
+# CONFIG_SENSORS_W83627EHF is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+# CONFIG_FB is not set
+# CONFIG_FB_IBM_GXT4500 is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT 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_ARCH_HAS_EHCI=y
+# CONFIG_USB is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# LED devices
+#
+# CONFIG_NEW_LEDS is not set
+
+#
+# LED drivers
+#
+
+#
+# LED Triggers
+#
+
+#
+# InfiniBand support
+#
+# CONFIG_INFINIBAND is not set
+
+#
+# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
+#
+
+#
+# Real Time Clock
+#
+# CONFIG_RTC_CLASS is not set
+
+#
+# DMA Engine support
+#
+# CONFIG_DMA_ENGINE is not set
+
+#
+# DMA Clients
+#
+
+#
+# DMA Devices
+#
+
+#
+# Auxiliary Display support
+#
+
+#
+# Virtualization
+#
+
+#
+# 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_EXT4DEV_FS is not set
+CONFIG_JBD=y
+CONFIG_JBD_DEBUG=y
+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_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# 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_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_KCORE=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_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_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+CONFIG_JFFS2_SUMMARY=y
+# CONFIG_JFFS2_FS_XATTR is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_ZLIB=y
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN 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=y
+# CONFIG_NFS_V3 is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# 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 is not set
+CONFIG_MSDOS_PARTITION=y
+
+#
+# Native Language Support
+#
+# CONFIG_NLS is not set
+
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+CONFIG_DEBUG_MUTEXES=y
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FORCED_INLINING=y
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_KGDB is not set
+# CONFIG_XMON is not set
+CONFIG_BDI_SWITCH=y
+# CONFIG_SERIAL_TEXT_DEBUG is not set
+CONFIG_PPC_OCP=y
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
index 66877bdfe0b7b8c5a20d2d0bdc7df02b4594152c..1f155d399d576859ab502f0149bf2032285f3e49 100644 (file)
@@ -206,7 +206,8 @@ skpinv:     addi    r6,r6,1                         /* Increment */
        rlwimi  r7,r3,16,4,15   /* Setup MAS0 = TLBSEL | ESEL(r3) */
        mtspr   SPRN_MAS0,r7
        tlbre
-       li      r6,0
+       mfspr   r6,SPRN_MAS1
+       rlwinm  r6,r6,0,2,0     /* clear IPROT */
        mtspr   SPRN_MAS1,r6
        tlbwe
        /* Invalidate TLB1 */
@@ -248,6 +249,8 @@ skpinv:     addi    r6,r6,1                         /* Increment */
        rlwimi  r7,r5,16,4,15   /* Setup MAS0 = TLBSEL | ESEL(r5) */
        mtspr   SPRN_MAS0,r7
        tlbre
+       mfspr   r8,SPRN_MAS1
+       rlwinm  r8,r8,0,2,0     /* clear IPROT */
        mtspr   SPRN_MAS1,r8
        tlbwe
        /* Invalidate TLB1 */
@@ -889,7 +892,6 @@ load_up_spe:
        REST_GPR(9, r11)
        REST_GPR(12, r11)
        lwz     r11,GPR11(r11)
-       SYNC
        rfi
 
 /*
@@ -953,7 +955,6 @@ _GLOBAL(giveup_altivec)
 _GLOBAL(giveup_spe)
        mfmsr   r5
        oris    r5,r5,MSR_SPE@h
-       SYNC
        mtmsr   r5                      /* enable use of SPE now */
        isync
        cmpi    0,r3,0
index bd129d3c2cc13af95228168f53d6cf76df5d2666..0a7e42d54eaf59dceca3eaa658b7db8986ffbe39 100644 (file)
@@ -442,17 +442,22 @@ static ctl_table htab_ctl_table[]={
                .mode           = 0644,
                .proc_handler   = &proc_dol2crvec,
        },
-       { 0, },
+       {}
 };
 static ctl_table htab_sysctl_root[] = {
-       { 1, "kernel", NULL, 0, 0755, htab_ctl_table, },
-       { 0,},
+       {
+               .ctl_name       = CTL_KERN,
+               .procname       = "kernel",
+               .mode           = 0555,
+               .child          = htab_ctl_table,
+       },
+       {}
 };
 
 static int __init
 register_ppc_htab_sysctl(void)
 {
-       register_sysctl_table(htab_sysctl_root, 0);
+       register_sysctl_table(htab_sysctl_root);
 
        return 0;
 }
index 1f49503317cb424789a78bdbcd5668ec9dbbc10e..1318b6f4c3df5f96d5d02d276af582f1807bae93 100644 (file)
@@ -271,7 +271,7 @@ EXPORT_SYMBOL(mmu_hash_lock); /* For MOL */
 extern long *intercept_table;
 EXPORT_SYMBOL(intercept_table);
 #endif /* CONFIG_PPC_STD_MMU */
-#if defined(CONFIG_40x) || defined(CONFIG_BOOKE)
+#ifdef CONFIG_PPC_DCR_NATIVE
 EXPORT_SYMBOL(__mtdcr);
 EXPORT_SYMBOL(__mfdcr);
 #endif
index 3c506af1988085393265aeb5a30c6755b7ce220a..c79704f5409c52a14db7fd7576c49985a6618e38 100644 (file)
@@ -543,7 +543,7 @@ void __init setup_arch(char **cmdline_p)
        init_mm.brk = (unsigned long) klimit;
 
        /* Save unparsed command line copy for /proc/cmdline */
-       strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE);
+       strlcpy(boot_command_line, cmd_line, COMMAND_LINE_SIZE);
        *cmdline_p = cmd_line;
 
        parse_early_param();
index 61921268a0d00c290e7dfd1db163a8311d934461..a0625562a44bb7a82db233c6388b984662ec44a8 100644 (file)
@@ -135,10 +135,12 @@ SECTIONS
   .data.percpu  : { *(.data.percpu) }
   __per_cpu_end = .;
 
+#ifdef CONFIG_BLK_DEV_INITRD
   . = ALIGN(4096);
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
   __initramfs_end = .;
+#endif
 
   . = ALIGN(4096);
   __init_end = .;
index 82b06a1ef95d6e532415bfb238d43311e5778e28..c023b7298809b282639168eb2125f4e9d3218de0 100644 (file)
@@ -314,7 +314,7 @@ void __init mapin_ram(void)
 }
 
 /* is x a power of 4? */
-#define is_power_of_4(x)       is_power_of_2(x) && (ffs(x) & 1))
+#define is_power_of_4(x)       is_power_of_2(x) && (ffs(x) & 1)
 
 /*
  * Set up a mapping for a block of I/O.
index 6980de420e920af1000a692ba9ef63ef29faab02..705ae56016f002e7f17e55eb1364bdc10063822e 100644 (file)
@@ -98,6 +98,12 @@ config OCOTEA
        help
          This option enables support for the IBM PPC440GX evaluation board.
 
+config TAISHAN
+       bool "Taishan"
+       select WANT_EARLY_SERIAL
+       help
+         This option enables support for the AMCC PPC440GX evaluation board.
+
 endchoice
 
 config EP405PC
@@ -126,7 +132,7 @@ config 440GP
 
 config 440GX
        bool
-       depends on OCOTEA
+       depends on OCOTEA || TAISHAN
        default y
 
 config 440SP
@@ -173,7 +179,7 @@ config BOOKE
 
 config IBM_OCP
        bool
-       depends on ASH || BAMBOO || BUBINGA || CPCI405 || EBONY || EP405 || LUAN || YUCCA || OCOTEA || REDWOOD_5 || REDWOOD_6 || SYCAMORE || WALNUT
+       depends on ASH || BAMBOO || BUBINGA || CPCI405 || EBONY || EP405 || LUAN || YUCCA || OCOTEA || REDWOOD_5 || REDWOOD_6 || SYCAMORE || TAISHAN || WALNUT
        default y
 
 config IBM_EMAC4
index a04a0d0a0f5cd6b7670e0af81890a76b6e0bf2aa..fa6610bccaf9872fa6be6af592d025f51652f56e 100644 (file)
@@ -12,6 +12,7 @@ obj-$(CONFIG_OCOTEA)          += ocotea.o
 obj-$(CONFIG_REDWOOD_5)                += redwood5.o
 obj-$(CONFIG_REDWOOD_6)                += redwood6.o
 obj-$(CONFIG_SYCAMORE)         += sycamore.o
+obj-$(CONFIG_TAISHAN)          += taishan.o
 obj-$(CONFIG_WALNUT)           += walnut.o
 obj-$(CONFIG_XILINX_ML300)     += xilinx_ml300.o
 obj-$(CONFIG_XILINX_ML403)     += xilinx_ml403.o
diff --git a/arch/ppc/platforms/4xx/taishan.c b/arch/ppc/platforms/4xx/taishan.c
new file mode 100644 (file)
index 0000000..bb0253e
--- /dev/null
@@ -0,0 +1,395 @@
+/*
+ * arch/ppc/platforms/4xx/taishan.c
+ *
+ * AMCC Taishan board specific routines
+ *
+ * Copyright 2007 DENX Software Engineering, Stefan Roese <sr@denx.de>
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/stddef.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/reboot.h>
+#include <linux/pci.h>
+#include <linux/kdev_t.h>
+#include <linux/types.h>
+#include <linux/major.h>
+#include <linux/blkdev.h>
+#include <linux/console.h>
+#include <linux/delay.h>
+#include <linux/ide.h>
+#include <linux/initrd.h>
+#include <linux/seq_file.h>
+#include <linux/root_dev.h>
+#include <linux/tty.h>
+#include <linux/serial.h>
+#include <linux/serial_core.h>
+#include <linux/platform_device.h>
+#include <linux/mtd/partitions.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/ndfc.h>
+#include <linux/mtd/physmap.h>
+
+#include <asm/machdep.h>
+#include <asm/ocp.h>
+#include <asm/bootinfo.h>
+#include <asm/ppcboot.h>
+
+#include <syslib/gen550.h>
+#include <syslib/ibm440gx_common.h>
+
+extern bd_t __res;
+
+static struct ibm44x_clocks clocks __initdata;
+
+/*
+ * NOR FLASH configuration (using mtd physmap driver)
+ */
+
+/* start will be added dynamically, end is always fixed */
+static struct resource taishan_nor_resource = {
+       .start = TAISHAN_FLASH_ADDR,
+       .end   = 0x1ffffffffULL,
+       .flags = IORESOURCE_MEM,
+};
+
+#define RW_PART0_OF    0
+#define RW_PART0_SZ    0x180000
+#define RW_PART1_SZ    0x200000
+/* Partition 2 will be autosized dynamically... */
+#define RW_PART3_SZ    0x80000
+#define RW_PART4_SZ    0x40000
+
+static struct mtd_partition taishan_nor_parts[] = {
+       {
+               .name = "kernel",
+               .offset = 0,
+               .size = RW_PART0_SZ
+       },
+       {
+               .name = "root",
+               .offset = MTDPART_OFS_APPEND,
+               .size = RW_PART1_SZ,
+       },
+       {
+               .name = "user",
+               .offset = MTDPART_OFS_APPEND,
+/*             .size = RW_PART2_SZ */ /* will be adjusted dynamically */
+       },
+       {
+               .name = "env",
+               .offset = MTDPART_OFS_APPEND,
+               .size = RW_PART3_SZ,
+       },
+       {
+               .name = "u-boot",
+               .offset = MTDPART_OFS_APPEND,
+               .size = RW_PART4_SZ,
+       }
+};
+
+static struct physmap_flash_data taishan_nor_data = {
+       .width          = 4,
+       .parts          = taishan_nor_parts,
+       .nr_parts       = ARRAY_SIZE(taishan_nor_parts),
+};
+
+static struct platform_device taishan_nor_device = {
+       .name           = "physmap-flash",
+       .id             = 0,
+       .dev = {
+                       .platform_data = &taishan_nor_data,
+               },
+       .num_resources  = 1,
+       .resource       = &taishan_nor_resource,
+};
+
+static int taishan_setup_flash(void)
+{
+       /*
+        * Adjust partition 2 to flash size
+        */
+       taishan_nor_parts[2].size = __res.bi_flashsize -
+               RW_PART0_SZ - RW_PART1_SZ - RW_PART3_SZ - RW_PART4_SZ;
+
+       platform_device_register(&taishan_nor_device);
+
+       return 0;
+}
+arch_initcall(taishan_setup_flash);
+
+static void __init
+taishan_calibrate_decr(void)
+{
+       unsigned int freq;
+
+       if (mfspr(SPRN_CCR1) & CCR1_TCS)
+               freq = TAISHAN_TMR_CLK;
+       else
+               freq = clocks.cpu;
+
+       ibm44x_calibrate_decr(freq);
+}
+
+static int
+taishan_show_cpuinfo(struct seq_file *m)
+{
+       seq_printf(m, "vendor\t\t: AMCC\n");
+       seq_printf(m, "machine\t\t: PPC440GX EVB (Taishan)\n");
+       ibm440gx_show_cpuinfo(m);
+       return 0;
+}
+
+static inline int
+taishan_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin)
+{
+       static char pci_irq_table[][4] =
+       /*
+        *      PCI IDSEL/INTPIN->INTLINE
+        *         A   B   C   D
+        */
+       {
+               { 23, 24, 25, 26 },     /* IDSEL 1 - PCI Slot 0 */
+               { 24, 25, 26, 23 },     /* IDSEL 2 - PCI Slot 1 */
+       };
+
+       const long min_idsel = 1, max_idsel = 2, irqs_per_slot = 4;
+       return PCI_IRQ_TABLE_LOOKUP;
+}
+
+static void __init taishan_set_emacdata(void)
+{
+       struct ocp_def *def;
+       struct ocp_func_emac_data *emacdata;
+       int i;
+
+       /* Set phy_map, phy_mode, and mac_addr for each EMAC */
+       for (i=2; i<4; i++) {
+               def = ocp_get_one_device(OCP_VENDOR_IBM, OCP_FUNC_EMAC, i);
+               emacdata = def->additions;
+               if (i < 2) {
+                       emacdata->phy_map = 0x00000001; /* Skip 0x00 */
+                       emacdata->phy_mode = PHY_MODE_SMII;
+               } else {
+                       emacdata->phy_map = 0x00000001; /* Skip 0x00 */
+                       emacdata->phy_mode = PHY_MODE_RGMII;
+               }
+               if (i == 0)
+                       memcpy(emacdata->mac_addr, "\0\0\0\0\0\0", 6);
+               else if (i == 1)
+                       memcpy(emacdata->mac_addr, "\0\0\0\0\0\0", 6);
+               else if (i == 2)
+                       memcpy(emacdata->mac_addr, __res.bi_enetaddr, 6);
+               else if (i == 3)
+                       memcpy(emacdata->mac_addr, __res.bi_enet1addr, 6);
+       }
+}
+
+#define PCIX_READW(offset) \
+       (readw(pcix_reg_base+offset))
+
+#define PCIX_WRITEW(value, offset) \
+       (writew(value, pcix_reg_base+offset))
+
+#define PCIX_WRITEL(value, offset) \
+       (writel(value, pcix_reg_base+offset))
+
+/*
+ * FIXME: This is only here to "make it work".  This will move
+ * to a ibm_pcix.c which will contain a generic IBM PCIX bridge
+ * configuration library. -Matt
+ */
+static void __init
+taishan_setup_pcix(void)
+{
+       void *pcix_reg_base;
+
+       pcix_reg_base = ioremap64(PCIX0_REG_BASE, PCIX_REG_SIZE);
+
+       /* Enable PCIX0 I/O, Mem, and Busmaster cycles */
+       PCIX_WRITEW(PCIX_READW(PCIX0_COMMAND) | PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER, PCIX0_COMMAND);
+
+       /* Disable all windows */
+       PCIX_WRITEL(0, PCIX0_POM0SA);
+       PCIX_WRITEL(0, PCIX0_POM1SA);
+       PCIX_WRITEL(0, PCIX0_POM2SA);
+       PCIX_WRITEL(0, PCIX0_PIM0SA);
+       PCIX_WRITEL(0, PCIX0_PIM0SAH);
+       PCIX_WRITEL(0, PCIX0_PIM1SA);
+       PCIX_WRITEL(0, PCIX0_PIM2SA);
+       PCIX_WRITEL(0, PCIX0_PIM2SAH);
+
+       /* Setup 2GB PLB->PCI outbound mem window (3_8000_0000->0_8000_0000) */
+       PCIX_WRITEL(0x00000003, PCIX0_POM0LAH);
+       PCIX_WRITEL(0x80000000, PCIX0_POM0LAL);
+       PCIX_WRITEL(0x00000000, PCIX0_POM0PCIAH);
+       PCIX_WRITEL(0x80000000, PCIX0_POM0PCIAL);
+       PCIX_WRITEL(0x80000001, PCIX0_POM0SA);
+
+       /* Setup 2GB PCI->PLB inbound memory window at 0, enable MSIs */
+       PCIX_WRITEL(0x00000000, PCIX0_PIM0LAH);
+       PCIX_WRITEL(0x00000000, PCIX0_PIM0LAL);
+       PCIX_WRITEL(0xe0000007, PCIX0_PIM0SA);
+       PCIX_WRITEL(0xffffffff, PCIX0_PIM0SAH);
+
+       iounmap(pcix_reg_base);
+
+       eieio();
+}
+
+static void __init
+taishan_setup_hose(void)
+{
+       struct pci_controller *hose;
+
+       /* Configure windows on the PCI-X host bridge */
+       taishan_setup_pcix();
+
+       hose = pcibios_alloc_controller();
+
+       if (!hose)
+               return;
+
+       hose->first_busno = 0;
+       hose->last_busno = 0xff;
+
+       hose->pci_mem_offset = TAISHAN_PCI_MEM_OFFSET;
+
+       pci_init_resource(&hose->io_resource,
+                       TAISHAN_PCI_LOWER_IO,
+                       TAISHAN_PCI_UPPER_IO,
+                       IORESOURCE_IO,
+                       "PCI host bridge");
+
+       pci_init_resource(&hose->mem_resources[0],
+                       TAISHAN_PCI_LOWER_MEM,
+                       TAISHAN_PCI_UPPER_MEM,
+                       IORESOURCE_MEM,
+                       "PCI host bridge");
+
+       hose->io_space.start = TAISHAN_PCI_LOWER_IO;
+       hose->io_space.end = TAISHAN_PCI_UPPER_IO;
+       hose->mem_space.start = TAISHAN_PCI_LOWER_MEM;
+       hose->mem_space.end = TAISHAN_PCI_UPPER_MEM;
+       hose->io_base_virt = ioremap64(TAISHAN_PCI_IO_BASE, TAISHAN_PCI_IO_SIZE);
+       isa_io_base = (unsigned long) hose->io_base_virt;
+
+       setup_indirect_pci(hose,
+                       TAISHAN_PCI_CFGA_PLB32,
+                       TAISHAN_PCI_CFGD_PLB32);
+       hose->set_cfg_type = 1;
+
+       hose->last_busno = pciauto_bus_scan(hose, hose->first_busno);
+
+       ppc_md.pci_swizzle = common_swizzle;
+       ppc_md.pci_map_irq = taishan_map_irq;
+}
+
+
+static void __init
+taishan_early_serial_map(void)
+{
+       struct uart_port port;
+
+       /* Setup ioremapped serial port access */
+       memset(&port, 0, sizeof(port));
+       port.membase = ioremap64(PPC440GX_UART0_ADDR, 8);
+       port.irq = UART0_INT;
+       port.uartclk = clocks.uart0;
+       port.regshift = 0;
+       port.iotype = UPIO_MEM;
+       port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST;
+       port.line = 0;
+
+       if (early_serial_setup(&port) != 0)
+               printk("Early serial init of port 0 failed\n");
+
+#if defined(CONFIG_SERIAL_TEXT_DEBUG) || defined(CONFIG_KGDB)
+       /* Configure debug serial access */
+       gen550_init(0, &port);
+
+       /* Purge TLB entry added in head_44x.S for early serial access */
+       _tlbie(UART0_IO_BASE);
+#endif
+
+       port.membase = ioremap64(PPC440GX_UART1_ADDR, 8);
+       port.irq = UART1_INT;
+       port.uartclk = clocks.uart1;
+       port.line = 1;
+
+       if (early_serial_setup(&port) != 0)
+               printk("Early serial init of port 1 failed\n");
+
+#if defined(CONFIG_SERIAL_TEXT_DEBUG) || defined(CONFIG_KGDB)
+       /* Configure debug serial access */
+       gen550_init(1, &port);
+#endif
+}
+
+static void __init
+taishan_setup_arch(void)
+{
+       taishan_set_emacdata();
+
+       ibm440gx_tah_enable();
+
+       /*
+        * Determine various clocks.
+        * To be completely correct we should get SysClk
+        * from FPGA, because it can be changed by on-board switches
+        * --ebs
+        */
+       ibm440gx_get_clocks(&clocks, 33333333, 6 * 1843200);
+       ocp_sys_info.opb_bus_freq = clocks.opb;
+
+       /* init to some ~sane value until calibrate_delay() runs */
+        loops_per_jiffy = 50000000/HZ;
+
+       /* Setup PCI host bridge */
+       taishan_setup_hose();
+
+#ifdef CONFIG_BLK_DEV_INITRD
+       if (initrd_start)
+               ROOT_DEV = Root_RAM0;
+       else
+#endif
+#ifdef CONFIG_ROOT_NFS
+               ROOT_DEV = Root_NFS;
+#else
+               ROOT_DEV = Root_HDA1;
+#endif
+
+       taishan_early_serial_map();
+
+       /* Identify the system */
+       printk("AMCC PowerPC 440GX Taishan Platform\n");
+}
+
+static void __init taishan_init(void)
+{
+       ibm440gx_l2c_setup(&clocks);
+}
+
+void __init platform_init(unsigned long r3, unsigned long r4,
+               unsigned long r5, unsigned long r6, unsigned long r7)
+{
+       ibm44x_platform_init(r3, r4, r5, r6, r7);
+
+       ppc_md.setup_arch = taishan_setup_arch;
+       ppc_md.show_cpuinfo = taishan_show_cpuinfo;
+       ppc_md.get_irq = NULL;          /* Set in ppc4xx_pic_init() */
+
+       ppc_md.calibrate_decr = taishan_calibrate_decr;
+
+#ifdef CONFIG_KGDB
+       ppc_md.early_serial_map = taishan_early_serial_map;
+#endif
+       ppc_md.init = taishan_init;
+}
+
diff --git a/arch/ppc/platforms/4xx/taishan.h b/arch/ppc/platforms/4xx/taishan.h
new file mode 100644 (file)
index 0000000..ea7561a
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * arch/ppc/platforms/4xx/taishan.h
+ *
+ * AMCC Taishan board definitions
+ *
+ * Copyright 2007 DENX Software Engineering, Stefan Roese <sr@denx.de>
+ *
+ * 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__
+#ifndef __ASM_TAISHAN_H__
+#define __ASM_TAISHAN_H__
+
+#include <platforms/4xx/ibm440gx.h>
+
+/* External timer clock frequency */
+#define TAISHAN_TMR_CLK        25000000
+
+/* Flash */
+#define TAISHAN_FPGA_ADDR              0x0000000141000000ULL
+#define TAISHAN_LCM_ADDR               0x0000000142000000ULL
+#define TAISHAN_FLASH_ADDR             0x00000001fc000000ULL
+#define TAISHAN_FLASH_SIZE             0x4000000
+
+/*
+ * Serial port defines
+ */
+#define RS_TABLE_SIZE  2
+
+/* head_44x.S created UART mapping, used before early_serial_setup.
+ * We cannot use default OpenBIOS UART mappings because they
+ * don't work for configurations with more than 512M RAM.    --ebs
+ */
+#define UART0_IO_BASE  0xF0000200
+#define UART1_IO_BASE  0xF0000300
+
+#define BASE_BAUD      11059200/16
+#define STD_UART_OP(num)                                       \
+       { 0, BASE_BAUD, 0, UART##num##_INT,                     \
+               (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST),        \
+               iomem_base: (void*)UART##num##_IO_BASE,         \
+               io_type: SERIAL_IO_MEM},
+
+#define SERIAL_PORT_DFNS       \
+       STD_UART_OP(0)          \
+       STD_UART_OP(1)
+
+/* PCI support */
+#define TAISHAN_PCI_LOWER_IO   0x00000000
+#define TAISHAN_PCI_UPPER_IO   0x0000ffff
+#define TAISHAN_PCI_LOWER_MEM  0x80000000
+#define TAISHAN_PCI_UPPER_MEM  0xffffefff
+
+#define TAISHAN_PCI_CFGA_PLB32 0x0ec00000
+#define TAISHAN_PCI_CFGD_PLB32 0x0ec00004
+
+#define TAISHAN_PCI_IO_BASE    0x0000000208000000ULL
+#define TAISHAN_PCI_IO_SIZE    0x00010000
+#define TAISHAN_PCI_MEM_OFFSET 0x00000000
+
+#endif                         /* __ASM_TAISHAN_H__ */
+#endif                         /* __KERNEL__ */
index 18dc6e8dd4f40d9712de5a88fb4e125de83434f7..b947c774f52485794b6ce2fb1976febbc0d44d02 100644 (file)
@@ -344,7 +344,7 @@ lopec_setup_arch(void)
                 if (bootargs != NULL) {
                         strcpy(cmd_line, bootargs);
                         /* again.. */
-                        strcpy(saved_command_line, cmd_line);
+                        strcpy(boot_command_line, cmd_line);
                }
        }
 #endif
index 9778105d4dfeaaca72ab5f67718cb55e9e0c0631..8a1788c48155459da8b854ef144a4f87267ae102 100644 (file)
@@ -592,7 +592,7 @@ static void __init pplus_setup_arch(void)
                if (bootargs != NULL) {
                        strcpy(cmd_line, bootargs);
                        /* again.. */
-                       strcpy(saved_command_line, cmd_line);
+                       strcpy(boot_command_line, cmd_line);
                }
        }
 #endif
index 1cb75a1f825e4a431589a4940772308c44381d5f..f166299571d63a962e4008c48e988d29d7d51cc5 100644 (file)
@@ -634,7 +634,7 @@ static void __init prep_init_sound(void)
        /*
         * Find a way to push these informations to the cs4232 driver
         * Give it out with printk, when not in cmd_line?
-        * Append it to  cmd_line and saved_command_line?
+        * Append it to  cmd_line and boot_command_line?
         * Format is cs4232=io,irq,dma,dma2
         */
 }
@@ -897,7 +897,7 @@ prep_setup_arch(void)
                 if (bootargs != NULL) {
                         strcpy(cmd_line, bootargs);
                         /* again.. */
-                        strcpy(saved_command_line, cmd_line);
+                        strcpy(boot_command_line, cmd_line);
                }
        }
 
index d84f04666972d579ac15444566a20e9b2ba567d4..09911118c6750c4c7bda5a8999061afc8e89342b 100644 (file)
@@ -69,6 +69,7 @@ obj-$(CONFIG_SANDPOINT)               += pci_auto.o todc_time.o
 obj-$(CONFIG_SBC82xx)          += todc_time.o
 obj-$(CONFIG_SPRUCE)           += cpc700_pic.o pci_auto.o \
                                   todc_time.o
+obj-$(CONFIG_TAISHAN)          += pci_auto.o
 obj-$(CONFIG_8260)             += m8260_setup.o pq2_devices.o pq2_sys.o \
                                   ppc_sys.o
 obj-$(CONFIG_PCI_8260)         += m82xx_pci.o pci_auto.o
index a43dda5a83343a7cc39d5ea1ae6794e915ac871c..1e5a00a4b5f55a5280dcc37452ccf847619b7274 100644 (file)
@@ -154,7 +154,7 @@ static struct resource pic_edgectrl_iores = {
 
 static struct irqaction i8259_irqaction = {
        .handler = no_action,
-       .flags = SA_INTERRUPT,
+       .flags = IRQF_DISABLED,
        .mask = CPU_MASK_NONE,
        .name = "82c59 secondary cascade",
 };
index eaed402ad3460a758872ccf271971a36f6042add..eaaac3788110ec90ad076dc92d922da452675242 100644 (file)
@@ -7,6 +7,10 @@ config MMU
        bool
        default y
 
+config ZONE_DMA
+       bool
+       default y
+
 config LOCKDEP_SUPPORT
        bool
        default y
@@ -37,6 +41,9 @@ config GENERIC_HWEIGHT
 config GENERIC_TIME
        def_bool y
 
+config NO_IOMEM
+       def_bool y
+
 mainmenu "Linux Kernel Configuration"
 
 config S390
index 0429481dea633b9fe2bffb6aff2e50d6f60d6857..4069b81f7f1d159f1fb2b6fc1bc6b9f7d788a8a0 100644 (file)
@@ -21,8 +21,7 @@
 #define APPLDATA_RECORD_NET_SUM_ID     0x03    /* must be < 256 !     */
 #define APPLDATA_RECORD_PROC_ID                0x04
 
-#define CTL_APPLDATA           2120    /* sysctl IDs, must be unique */
-#define CTL_APPLDATA_TIMER     2121
+#define CTL_APPLDATA_TIMER     2121    /* sysctl IDs, must be unique */
 #define CTL_APPLDATA_INTERVAL  2122
 #define CTL_APPLDATA_MEM       2123
 #define CTL_APPLDATA_OS                2124
index c9da7d16145e727f91f77b655016fa29fe5074ac..0c3cf4b16ae488c2949867c93bec362bb5b42b82 100644 (file)
@@ -506,7 +506,7 @@ int appldata_register_ops(struct appldata_ops *ops)
 
        ops->ctl_table[3].ctl_name = 0;
 
-       ops->sysctl_header = register_sysctl_table(ops->ctl_table,1);
+       ops->sysctl_header = register_sysctl_table(ops->ctl_table);
 
        P_INFO("%s-ops registered!\n", ops->name);
        return 0;
@@ -606,7 +606,7 @@ static int __init appldata_init(void)
        /* Register cpu hotplug notifier */
        register_hotcpu_notifier(&appldata_nb);
 
-       appldata_sysctl_header = register_sysctl_table(appldata_dir_table, 1);
+       appldata_sysctl_header = register_sysctl_table(appldata_dir_table);
 #ifdef MODULE
        appldata_dir_table[0].de->owner = THIS_MODULE;
        appldata_table[0].de->owner = THIS_MODULE;
index a4fda7b5364062d7c4aa0fe1dbe1a29afc5e7eb9..ba5d3167df0db3175fb76525843094ac653582e6 100644 (file)
@@ -34,7 +34,7 @@ struct hypfs_sb_info {
        struct mutex lock;              /* lock to protect update process */
 };
 
-static struct file_operations hypfs_file_ops;
+static const struct file_operations hypfs_file_ops;
 static struct file_system_type hypfs_type;
 static struct super_operations hypfs_s_ops;
 
@@ -440,7 +440,7 @@ struct dentry *hypfs_create_str(struct super_block *sb, struct dentry *dir,
        return dentry;
 }
 
-static struct file_operations hypfs_file_ops = {
+static const struct file_operations hypfs_file_ops = {
        .open           = hypfs_open,
        .release        = hypfs_release,
        .read           = do_sync_read,
index 666bb6daa148e649d3156aea4b88c65e7c553b3e..664c669b1856ac881e96bca89b8c5a2429a517c6 100644 (file)
@@ -398,51 +398,6 @@ int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf)
        return err;
 }
 
-struct sysinfo32 {
-        s32 uptime;
-        u32 loads[3];
-        u32 totalram;
-        u32 freeram;
-        u32 sharedram;
-        u32 bufferram;
-        u32 totalswap;
-        u32 freeswap;
-        unsigned short procs;
-       unsigned short pads;
-       u32 totalhigh;
-       u32 freehigh;
-       unsigned int mem_unit;
-        char _f[8];
-};
-
-asmlinkage long sys32_sysinfo(struct sysinfo32 __user *info)
-{
-       struct sysinfo s;
-       int ret, err;
-       mm_segment_t old_fs = get_fs ();
-       
-       set_fs (KERNEL_DS);
-       ret = sys_sysinfo((struct sysinfo __force __user *) &s);
-       set_fs (old_fs);
-       err = put_user (s.uptime, &info->uptime);
-       err |= __put_user (s.loads[0], &info->loads[0]);
-       err |= __put_user (s.loads[1], &info->loads[1]);
-       err |= __put_user (s.loads[2], &info->loads[2]);
-       err |= __put_user (s.totalram, &info->totalram);
-       err |= __put_user (s.freeram, &info->freeram);
-       err |= __put_user (s.sharedram, &info->sharedram);
-       err |= __put_user (s.bufferram, &info->bufferram);
-       err |= __put_user (s.totalswap, &info->totalswap);
-       err |= __put_user (s.freeswap, &info->freeswap);
-       err |= __put_user (s.procs, &info->procs);
-       err |= __put_user (s.totalhigh, &info->totalhigh);
-       err |= __put_user (s.freehigh, &info->freehigh);
-       err |= __put_user (s.mem_unit, &info->mem_unit);
-       if (err)
-               return -EFAULT;
-       return ret;
-}
-
 asmlinkage long sys32_sched_rr_get_interval(compat_pid_t pid,
                                struct compat_timespec __user *interval)
 {
index 71e54ef0931e1846d35ae784462a993ca21d4705..97901296894eae6785bf74edfc6cceb2842f6656 100644 (file)
@@ -517,10 +517,10 @@ sys32_swapoff_wrapper:
        llgtr   %r2,%r2                 # const char *
        jg      sys_swapoff             # branch to system call
 
-       .globl  sys32_sysinfo_wrapper
-sys32_sysinfo_wrapper:
+       .globl  compat_sys_sysinfo_wrapper
+compat_sys_sysinfo_wrapper:
        llgtr   %r2,%r2                 # struct sysinfo_emu31 *
-       jg      sys32_sysinfo           # branch to system call
+       jg      compat_sys_sysinfo      # branch to system call
 
        .globl  sys32_ipc_wrapper
 sys32_ipc_wrapper:
index f4b62df02aa2721187f514416effebe8af015a60..eca3fe595ff4a9b092b6ee8f89f69309731add77 100644 (file)
@@ -167,7 +167,7 @@ static DECLARE_MUTEX(debug_lock);
 
 static int initialized;
 
-static struct file_operations debug_file_ops = {
+static const struct file_operations debug_file_ops = {
        .owner   = THIS_MODULE,
        .read    = debug_output,
        .write   = debug_input,
@@ -852,7 +852,6 @@ debug_finish_entry(debug_info_t * id, debug_entry_t* active, int level,
 static int debug_stoppable=1;
 static int debug_active=1;
 
-#define CTL_S390DBF 5677
 #define CTL_S390DBF_STOPPABLE 5678
 #define CTL_S390DBF_ACTIVE 5679
 
@@ -1054,7 +1053,7 @@ __init debug_init(void)
 {
        int rc = 0;
 
-       s390dbf_sysctl_header = register_sysctl_table(s390dbf_dir_table, 1);
+       s390dbf_sysctl_header = register_sysctl_table(s390dbf_dir_table);
        down(&debug_lock);
        debug_debugfs_root_entry = debugfs_create_dir(DEBUG_DIR_ROOT,NULL);
        printk(KERN_INFO "debug: Initialization complete\n");
index 03739813d3bf4d7ba51fb44789f7763989286f6c..50c5210fbc64e078683e6d58a67787df7d1c4403 100644 (file)
@@ -740,7 +740,7 @@ setup_arch(char **cmdline_p)
 #endif /* CONFIG_64BIT */
 
        /* Save unparsed command line copy for /proc/cmdline */
-       strlcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
+       strlcpy(boot_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
 
        *cmdline_p = COMMAND_LINE;
        *(*cmdline_p + COMMAND_LINE_SIZE - 1) = '\0';
index 65b52320d145661f245f836318d51b7bfb71a317..83a4ea6e3d605fb6637a845924887583a1a08910 100644 (file)
@@ -57,7 +57,7 @@ static void smp_ext_bitcall(int, ec_bit_sig);
 static void smp_ext_bitcall_others(ec_bit_sig);
 
 /*
-5B * Structure and data for smp_call_function(). This is designed to minimise
+ * Structure and data for smp_call_function(). This is designed to minimise
  * static memory requirements. It also looks cleaner.
  */
 static DEFINE_SPINLOCK(call_lock);
@@ -104,7 +104,7 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
  * remote CPUs are nearly ready to execute <<func>> or are or have executed.
  *
  * You must not call this function with disabled interrupts or from a
- * hardware interrupt handler or from a bottom half handler.
+ * hardware interrupt handler.
  */
 {
        struct call_data_struct data;
@@ -113,8 +113,8 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
        if (cpus <= 0)
                return 0;
 
-       /* Can deadlock when called with interrupts disabled */
-       WARN_ON(irqs_disabled());
+       /* Can deadlock when interrupts are disabled or if in wrong context */
+       WARN_ON(irqs_disabled() || in_irq());
 
        data.func = func;
        data.info = info;
@@ -123,7 +123,7 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
        if (wait)
                atomic_set(&data.finished, 0);
 
-       spin_lock(&call_lock);
+       spin_lock_bh(&call_lock);
        call_data = &data;
        /* Send a message to all other CPUs and wait for them to respond */
         smp_ext_bitcall_others(ec_call_function);
@@ -135,7 +135,7 @@ int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
        if (wait)
                while (atomic_read(&data.finished) != cpus)
                        cpu_relax();
-       spin_unlock(&call_lock);
+       spin_unlock_bh(&call_lock);
 
        return 0;
 }
@@ -159,6 +159,9 @@ int smp_call_function_on(void (*func) (void *info), void *info,
        if (!cpu_online(cpu))
                return -EINVAL;
 
+       /* Can deadlock when interrupts are disabled or if in wrong context */
+       WARN_ON(irqs_disabled() || in_irq());
+
        /* disable preemption for local function call */
        curr_cpu = get_cpu();
 
index a4ceae3dbcf1b5fe8ed8ae27b931a56d8791b346..a52c44455bf0bbb20db3e3f65e8d9edc0c9fc5a5 100644 (file)
@@ -124,7 +124,7 @@ NI_SYSCALL                                                  /* old "idle" system call */
 NI_SYSCALL                                                     /* vm86old for i386 */
 SYSCALL(sys_wait4,sys_wait4,compat_sys_wait4_wrapper)
 SYSCALL(sys_swapoff,sys_swapoff,sys32_swapoff_wrapper)         /* 115 */
-SYSCALL(sys_sysinfo,sys_sysinfo,sys32_sysinfo_wrapper)
+SYSCALL(sys_sysinfo,sys_sysinfo,compat_sys_sysinfo_wrapper)
 SYSCALL(sys_ipc,sys_ipc,sys32_ipc_wrapper)
 SYSCALL(sys_fsync,sys_fsync,sys32_fsync_wrapper)
 SYSCALL(sys_sigreturn_glue,sys_sigreturn_glue,sys32_sigreturn_glue)
index 3b91f27ab202862e28ae2b10ef5f48e87cadb0c6..ee9fd7b859282941db4ad38ee896ea933cc1809e 100644 (file)
@@ -312,7 +312,7 @@ static struct clocksource clocksource_tod = {
        .mask           = -1ULL,
        .mult           = 1000,
        .shift          = 12,
-       .is_continuous  = 1,
+       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
 };
 
 
index a4890739252230df4ebb28cc70a0e79915aa7bd0..c30716ae130ca7b47afc2183997cc387923013f8 100644 (file)
@@ -91,11 +91,14 @@ SECTIONS
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
   SECURITY_INIT
+
+#ifdef CONFIG_BLK_DEV_INITRD
   . = ALIGN(256);
   __initramfs_start = .;
   .init.ramfs : { *(.init.initramfs) }
   . = ALIGN(2);
   __initramfs_end = .;
+#endif
   . = ALIGN(256);
   __per_cpu_start = .;
   .data.percpu  : { *(.data.percpu) }
index 8e09db1edbb91a8cb835d35e7af6605d65c2364e..f95449b29fa5229bcb16bdb3dd9262b9121c2f5b 100644 (file)
@@ -2,6 +2,6 @@
 # Makefile for the linux s390-specific parts of the memory manager.
 #
 
-obj-y   := init.o fault.o ioremap.o extmem.o mmap.o vmem.o
+obj-y   := init.o fault.o extmem.o mmap.o vmem.o
 obj-$(CONFIG_CMM) += cmm.o
 
index f93a056869bc5aa7d38f1a88810acf019029eacf..c5b2f4f078bc7fbd3f58ac9c6eb58ad05f3b4e82 100644 (file)
@@ -256,10 +256,6 @@ cmm_skip_blanks(char *cp, char **endp)
 }
 
 #ifdef CONFIG_CMM_PROC
-/* These will someday get removed. */
-#define VM_CMM_PAGES           1111
-#define VM_CMM_TIMED_PAGES     1112
-#define VM_CMM_TIMEOUT         1113
 
 static struct ctl_table cmm_table[];
 
@@ -422,7 +418,7 @@ cmm_init (void)
        int rc = -ENOMEM;
 
 #ifdef CONFIG_CMM_PROC
-       cmm_sysctl_header = register_sysctl_table(cmm_dir_table, 1);
+       cmm_sysctl_header = register_sysctl_table(cmm_dir_table);
        if (!cmm_sysctl_header)
                goto out;
 #endif
index 9ff143e87746b5ac0bf350c1496307c10506d123..641aef36ccc498847ee90fb42c77fa676f496d9d 100644 (file)
@@ -83,12 +83,10 @@ static inline int notify_page_fault(enum die_val val, const char *str,
 }
 #endif
 
-extern spinlock_t timerlist_lock;
 
 /*
  * Unlock any spinlocks which will prevent us from getting the
- * message out (timerlist_lock is acquired through the
- * console unblank code)
+ * message out.
  */
 void bust_spinlocks(int yes)
 {
diff --git a/arch/s390/mm/ioremap.c b/arch/s390/mm/ioremap.c
deleted file mode 100644 (file)
index 3d2100a..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  arch/s390/mm/ioremap.c
- *
- *  S390 version
- *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
- *    Author(s): Hartmut Penner (hp@de.ibm.com)
- *
- *  Derived from "arch/i386/mm/extable.c"
- *    (C) Copyright 1995 1996 Linus Torvalds
- *
- * Re-map IO memory to kernel address space so that we can access it.
- * This is needed for high PCI addresses that aren't mapped in the
- * 640k-1MB IO memory area on PC's
- */
-
-#include <linux/vmalloc.h>
-#include <linux/mm.h>
-#include <linux/io.h>
-#include <asm/pgalloc.h>
-
-/*
- * Generic mapping function (not visible outside):
- */
-
-/*
- * Remap an arbitrary physical address space into the kernel virtual
- * address space. Needed when the kernel wants to access high addresses
- * directly.
- */
-void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)
-{
-       void * addr;
-       struct vm_struct * area;
-
-       if (phys_addr < virt_to_phys(high_memory))
-               return phys_to_virt(phys_addr);
-       if (phys_addr & ~PAGE_MASK)
-               return NULL;
-       size = PAGE_ALIGN(size);
-       if (!size || size > phys_addr + size)
-               return NULL;
-       area = get_vm_area(size, VM_IOREMAP);
-       if (!area)
-               return NULL;
-       addr = area->addr;
-       if (ioremap_page_range((unsigned long)addr, (unsigned long)addr + size,
-                              phys_addr, __pgprot(flags))) {
-               vfree(addr);
-               return NULL;
-       }
-       return addr;
-}
-
-void iounmap(void *addr)
-{
-       if (addr > high_memory)
-               vfree(addr);
-}
index 4f3891215b87c83f3ff03252558e78b74b981bbd..4d16d89170749ccff61b432972cacd6e0e5f36b5 100644 (file)
@@ -135,12 +135,6 @@ config SH_HP6XX
          More information (hardware only) at
          <http://www.hp.com/jornada/>.
 
-config SH_EC3104
-       bool "EC3104"
-       help
-         Select EC3104 if configuring for a system with an Eclipse
-         International EC3104 chip, e.g. the Harris AD2000.
-
 config SH_SATURN
        bool "Saturn"
        select CPU_SUBTYPE_SH7604
@@ -156,9 +150,6 @@ config SH_DREAMCAST
          <http://www.m17n.org/linux-sh/dreamcast/>.  There is a
          Dreamcast project is at <http://linuxdc.sourceforge.net/>.
 
-config SH_BIGSUR
-       bool "BigSur"
-
 config SH_MPC1211
        bool "Interface MPC1211"
        help
@@ -481,6 +472,7 @@ config SH_PCLK_FREQ
 
 config SH_CLK_MD
        int "CPU Mode Pin Setting"
+       default 0
        depends on CPU_SUBTYPE_SH7619 || CPU_SUBTYPE_SH7206
        help
          MD2 - MD0 pin setting.
@@ -510,8 +502,9 @@ source "arch/sh/cchips/Kconfig"
 config HEARTBEAT
        bool "Heartbeat LED"
        depends on SH_MPC1211 || SH_SH03 || \
-                  SH_BIGSUR || SOLUTION_ENGINE || \
-                  SH_RTS7751R2D || SH_SH4202_MICRODEV || SH_LANDISK
+                  SOLUTION_ENGINE || \
+                  SH_RTS7751R2D || SH_SH4202_MICRODEV || SH_LANDISK || \
+                  SH_R7780RP
        help
          Use the power-on LED on your machine as a load meter.  The exact
          behavior is platform-dependent, but normally the flash frequency is
@@ -596,6 +589,8 @@ menu "Boot options"
 config ZERO_PAGE_OFFSET
        hex "Zero page offset"
        default "0x00004000" if SH_MPC1211 || SH_SH03
+       default "0x00010000" if PAGE_SIZE_64KB
+       default "0x00002000" if PAGE_SIZE_8KB
        default "0x00001000"
        help
          This sets the default offset of zero page.
index c1dbef21263430f68ba594d2b3d893063732cc11..bd9b1729f8b8dab029cd21776908de1e22f84845 100644 (file)
@@ -35,6 +35,7 @@ endif
 endif
 
 cflags-$(CONFIG_CPU_SH2)               := -m2
+cflags-$(CONFIG_CPU_SH2A)              := -m2a $(call cc-option,-m2a-nofpu,)
 cflags-$(CONFIG_CPU_SH3)               := -m3
 cflags-$(CONFIG_CPU_SH4)               := -m4 \
        $(call cc-option,-mno-implicit-fp,-m4-nofpu)
@@ -93,10 +94,8 @@ machdir-$(CONFIG_SH_7300_SOLUTION_ENGINE)    := se/7300
 machdir-$(CONFIG_SH_7343_SOLUTION_ENGINE)      := se/7343
 machdir-$(CONFIG_SH_73180_SOLUTION_ENGINE)     := se/73180
 machdir-$(CONFIG_SH_HP6XX)                     := hp6xx
-machdir-$(CONFIG_SH_EC3104)                    := ec3104
 machdir-$(CONFIG_SH_SATURN)                    := saturn
 machdir-$(CONFIG_SH_DREAMCAST)                 := dreamcast
-machdir-$(CONFIG_SH_BIGSUR)                    := bigsur
 machdir-$(CONFIG_SH_MPC1211)                   := mpc1211
 machdir-$(CONFIG_SH_SH03)                      := sh03
 machdir-$(CONFIG_SH_SECUREEDGE5410)            := snapgear
diff --git a/arch/sh/boards/bigsur/Makefile b/arch/sh/boards/bigsur/Makefile
deleted file mode 100644 (file)
index 0ff9497..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Makefile for the BigSur specific parts of the kernel
-#
-
-obj-y   := setup.o io.o irq.o led.o
-
diff --git a/arch/sh/boards/bigsur/io.c b/arch/sh/boards/bigsur/io.c
deleted file mode 100644 (file)
index 23071f9..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * arch/sh/boards/bigsur/io.c
- *
- * By Dustin McIntire (dustin@sensoria.com) (c)2001
- * Derived from io_hd64465.h, which bore the message:
- * By Greg Banks <gbanks@pocketpenguins.com>
- * (c) 2000 PocketPenguins Inc. 
- * and from io_hd64461.h, which bore the message:
- * Copyright 2000 Stuart Menefy (stuart.menefy@st.com)
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * IO functions for a Hitachi Big Sur Evaluation Board.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <asm/machvec.h>
-#include <asm/io.h>
-#include <asm/bigsur/bigsur.h>
-
-/* Low iomap maps port 0-1K to addresses in 8byte chunks */
-#define BIGSUR_IOMAP_LO_THRESH 0x400
-#define BIGSUR_IOMAP_LO_SHIFT  3
-#define BIGSUR_IOMAP_LO_MASK   ((1<<BIGSUR_IOMAP_LO_SHIFT)-1)
-#define BIGSUR_IOMAP_LO_NMAP   (BIGSUR_IOMAP_LO_THRESH>>BIGSUR_IOMAP_LO_SHIFT)
-static u32 bigsur_iomap_lo[BIGSUR_IOMAP_LO_NMAP];
-static u8 bigsur_iomap_lo_shift[BIGSUR_IOMAP_LO_NMAP];
-
-/* High iomap maps port 1K-64K to addresses in 1K chunks */
-#define BIGSUR_IOMAP_HI_THRESH 0x10000
-#define BIGSUR_IOMAP_HI_SHIFT  10
-#define BIGSUR_IOMAP_HI_MASK   ((1<<BIGSUR_IOMAP_HI_SHIFT)-1)
-#define BIGSUR_IOMAP_HI_NMAP   (BIGSUR_IOMAP_HI_THRESH>>BIGSUR_IOMAP_HI_SHIFT)
-static u32 bigsur_iomap_hi[BIGSUR_IOMAP_HI_NMAP];
-static u8 bigsur_iomap_hi_shift[BIGSUR_IOMAP_HI_NMAP];
-
-void bigsur_port_map(u32 baseport, u32 nports, u32 addr, u8 shift)
-{
-       u32 port, endport = baseport + nports;
-
-       pr_debug("bigsur_port_map(base=0x%0x, n=0x%0x, addr=0x%08x)\n",
-                baseport, nports, addr);
-           
-       for (port = baseport ;
-            port < endport && port < BIGSUR_IOMAP_LO_THRESH ;
-            port += (1<<BIGSUR_IOMAP_LO_SHIFT)) {
-               pr_debug("    maplo[0x%x] = 0x%08x\n", port, addr);
-           bigsur_iomap_lo[port>>BIGSUR_IOMAP_LO_SHIFT] = addr;
-           bigsur_iomap_lo_shift[port>>BIGSUR_IOMAP_LO_SHIFT] = shift;
-               addr += (1<<(BIGSUR_IOMAP_LO_SHIFT));
-       }
-
-       for (port = max_t(u32, baseport, BIGSUR_IOMAP_LO_THRESH);
-            port < endport && port < BIGSUR_IOMAP_HI_THRESH ;
-            port += (1<<BIGSUR_IOMAP_HI_SHIFT)) {
-               pr_debug("    maphi[0x%x] = 0x%08x\n", port, addr);
-           bigsur_iomap_hi[port>>BIGSUR_IOMAP_HI_SHIFT] = addr;
-           bigsur_iomap_hi_shift[port>>BIGSUR_IOMAP_HI_SHIFT] = shift;
-               addr += (1<<(BIGSUR_IOMAP_HI_SHIFT));
-       }
-}
-EXPORT_SYMBOL(bigsur_port_map);
-
-void bigsur_port_unmap(u32 baseport, u32 nports)
-{
-       u32 port, endport = baseport + nports;
-       
-       pr_debug("bigsur_port_unmap(base=0x%0x, n=0x%0x)\n", baseport, nports);
-
-       for (port = baseport ;
-            port < endport && port < BIGSUR_IOMAP_LO_THRESH ;
-            port += (1<<BIGSUR_IOMAP_LO_SHIFT)) {
-               bigsur_iomap_lo[port>>BIGSUR_IOMAP_LO_SHIFT] = 0;
-       }
-
-       for (port = max_t(u32, baseport, BIGSUR_IOMAP_LO_THRESH);
-            port < endport && port < BIGSUR_IOMAP_HI_THRESH ;
-            port += (1<<BIGSUR_IOMAP_HI_SHIFT)) {
-               bigsur_iomap_hi[port>>BIGSUR_IOMAP_HI_SHIFT] = 0;
-       }
-}
-EXPORT_SYMBOL(bigsur_port_unmap);
-
-unsigned long bigsur_isa_port2addr(unsigned long port)
-{
-       unsigned long addr = 0;
-       unsigned char shift;
-
-       /* Physical address not in P0, do nothing */
-       if (PXSEG(port)) {
-               addr = port;
-       /* physical address in P0, map to P2 */
-       } else if (port >= 0x30000) {
-               addr = P2SEGADDR(port);
-       /* Big Sur I/O + HD64465 registers 0x10000-0x30000 */
-       } else if (port >= BIGSUR_IOMAP_HI_THRESH) {
-               addr = BIGSUR_INTERNAL_BASE + (port - BIGSUR_IOMAP_HI_THRESH);
-       /* Handle remapping of high IO/PCI IO ports */
-       } else if (port >= BIGSUR_IOMAP_LO_THRESH) {
-               addr = bigsur_iomap_hi[port >> BIGSUR_IOMAP_HI_SHIFT];
-               shift = bigsur_iomap_hi_shift[port >> BIGSUR_IOMAP_HI_SHIFT];
-
-               if (addr != 0)
-                       addr += (port & BIGSUR_IOMAP_HI_MASK) << shift;
-       } else {
-               /* Handle remapping of low IO ports */
-               addr = bigsur_iomap_lo[port >> BIGSUR_IOMAP_LO_SHIFT];
-               shift = bigsur_iomap_lo_shift[port >> BIGSUR_IOMAP_LO_SHIFT];
-
-               if (addr != 0)
-                       addr += (port & BIGSUR_IOMAP_LO_MASK) << shift;
-       }
-
-       pr_debug("%s(0x%08lx) = 0x%08lx\n", __FUNCTION__, port, addr);
-
-       return addr;
-}
-
diff --git a/arch/sh/boards/bigsur/irq.c b/arch/sh/boards/bigsur/irq.c
deleted file mode 100644 (file)
index 1ab04da..0000000
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- *
- * By Dustin McIntire (dustin@sensoria.com) (c)2001
- *
- * Setup and IRQ handling code for the HD64465 companion chip.
- * by Greg Banks <gbanks@pocketpenguins.com>
- * Copyright (c) 2000 PocketPenguins Inc
- *
- * Derived from setup_hd64465.c which bore the message:
- * Greg Banks <gbanks@pocketpenguins.com>
- * Copyright (c) 2000 PocketPenguins Inc and
- * Copyright (C) 2000 YAEGASHI Takeshi
- * and setup_cqreek.c which bore message:
- * Copyright (C) 2000  Niibe Yutaka
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * IRQ functions for a Hitachi Big Sur Evaluation Board.
- *
- */
-#undef DEBUG
-
-#include <linux/sched.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/param.h>
-#include <linux/ioport.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-#include <linux/irq.h>
-#include <linux/bitops.h>
-
-#include <asm/io.h>
-#include <asm/irq.h>
-
-#include <asm/bigsur/io.h>
-#include <asm/hd64465/hd64465.h>
-#include <asm/bigsur/bigsur.h>
-
-//#define BIGSUR_DEBUG 3
-#undef BIGSUR_DEBUG
-
-#ifdef BIGSUR_DEBUG
-#define DIPRINTK(n, args...)    if (BIGSUR_DEBUG>(n)) printk(args)
-#else
-#define DIPRINTK(n, args...)
-#endif /* BIGSUR_DEBUG */
-
-#ifdef CONFIG_HD64465
-extern int hd64465_irq_demux(int irq);
-#endif /* CONFIG_HD64465 */
-
-
-/*===========================================================*/
-//              Big Sur CPLD IRQ Routines
-/*===========================================================*/
-
-/* Level 1 IRQ routines */
-static void disable_bigsur_l1irq(unsigned int irq)
-{
-        unsigned char mask;
-        unsigned int mask_port = ((irq - BIGSUR_IRQ_LOW)/8) ? BIGSUR_IRLMR1 : BIGSUR_IRLMR0;
-        unsigned char bit =  (1 << ((irq - MGATE_IRQ_LOW)%8) );
-
-        if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) {
-                pr_debug("Disable L1 IRQ %d\n", irq);
-                DIPRINTK(2,"disable_bigsur_l1irq: IMR=0x%08x mask=0x%x\n",
-                        mask_port, bit);
-
-                /* Disable IRQ - set mask bit */
-                mask = inb(mask_port) | bit;
-                outb(mask, mask_port);
-                return;
-        }
-        pr_debug("disable_bigsur_l1irq: Invalid IRQ %d\n", irq);
-}
-
-static void enable_bigsur_l1irq(unsigned int irq)
-{
-        unsigned char mask;
-        unsigned int mask_port = ((irq - BIGSUR_IRQ_LOW)/8) ? BIGSUR_IRLMR1 : BIGSUR_IRLMR0;
-        unsigned char bit =  (1 << ((irq - MGATE_IRQ_LOW)%8) );
-
-        if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) {
-                pr_debug("Enable L1 IRQ %d\n", irq);
-                DIPRINTK(2,"enable_bigsur_l1irq: IMR=0x%08x mask=0x%x\n",
-                        mask_port, bit);
-                /* Enable L1 IRQ - clear mask bit */
-                mask = inb(mask_port) & ~bit;
-                outb(mask, mask_port);
-                return;
-        }
-        pr_debug("enable_bigsur_l1irq: Invalid IRQ %d\n", irq);
-}
-
-
-/* Level 2 irq masks and registers for L2 decoding */
-/* Level2 bitmasks for each level 1 IRQ */
-const u32 bigsur_l2irq_mask[] =
-    {0x40,0x80,0x08,0x01,0x01,0x3C,0x3E,0xFF,0x40,0x80,0x06,0x03};
-/* Level2 to ISR[n] map for each level 1 IRQ */
-const u32 bigsur_l2irq_reg[]  =
-    {   2,   2,   3,   3,   1,   2,   1,   0,   1,   1,   3,   2};
-/* Level2 to Level 1 IRQ map */
-const u32 bigsur_l2_l1_map[]  =
-    {7,7,7,7,7,7,7,7, 4,6,6,6,6,6,8,9, 11,11,5,5,5,5,0,1, 3,10,10,2,-1,-1,-1,-1};
-/* IRQ inactive level (high or low) */
-const u32 bigsur_l2_inactv_state[]  =   {0x00, 0xBE, 0xFC, 0xF7};
-
-/* CPLD external status and mask registers base and offsets */
-static const u32 isr_base = BIGSUR_IRQ0;
-static const u32 isr_offset = BIGSUR_IRQ0 - BIGSUR_IRQ1;
-static const u32 imr_base = BIGSUR_IMR0;
-static const u32 imr_offset = BIGSUR_IMR0 - BIGSUR_IMR1;
-
-#define REG_NUM(irq)  ((irq-BIGSUR_2NDLVL_IRQ_LOW)/8 )
-
-/* Level 2 IRQ routines */
-static void disable_bigsur_l2irq(unsigned int irq)
-{
-        unsigned char mask;
-        unsigned char bit = 1 << ((irq-BIGSUR_2NDLVL_IRQ_LOW)%8);
-        unsigned int mask_port = imr_base - REG_NUM(irq)*imr_offset;
-
-       if(irq >= BIGSUR_2NDLVL_IRQ_LOW && irq < BIGSUR_2NDLVL_IRQ_HIGH) {
-                pr_debug("Disable L2 IRQ %d\n", irq);
-                DIPRINTK(2,"disable_bigsur_l2irq: IMR=0x%08x mask=0x%x\n",
-                        mask_port, bit);
-
-                /* Disable L2 IRQ - set mask bit */
-                mask = inb(mask_port) | bit;
-                outb(mask, mask_port);
-                return;
-        }
-        pr_debug("disable_bigsur_l2irq: Invalid IRQ %d\n", irq);
-}
-
-static void enable_bigsur_l2irq(unsigned int irq)
-{
-        unsigned char mask;
-        unsigned char bit = 1 << ((irq-BIGSUR_2NDLVL_IRQ_LOW)%8);
-        unsigned int mask_port = imr_base - REG_NUM(irq)*imr_offset;
-
-       if(irq >= BIGSUR_2NDLVL_IRQ_LOW && irq < BIGSUR_2NDLVL_IRQ_HIGH) {
-                pr_debug("Enable L2 IRQ %d\n", irq);
-                DIPRINTK(2,"enable_bigsur_l2irq: IMR=0x%08x mask=0x%x\n",
-                        mask_port, bit);
-
-                /* Enable L2 IRQ - clear mask bit */
-                mask = inb(mask_port) & ~bit;
-                outb(mask, mask_port);
-                return;
-        }
-        pr_debug("enable_bigsur_l2irq: Invalid IRQ %d\n", irq);
-}
-
-static void mask_and_ack_bigsur(unsigned int irq)
-{
-        pr_debug("mask_and_ack_bigsur IRQ %d\n", irq);
-        if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH)
-                disable_bigsur_l1irq(irq);
-        else
-                disable_bigsur_l2irq(irq);
-}
-
-static void end_bigsur_irq(unsigned int irq)
-{
-        pr_debug("end_bigsur_irq IRQ %d\n", irq);
-        if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) {
-                if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH)
-                        enable_bigsur_l1irq(irq);
-                else
-                        enable_bigsur_l2irq(irq);
-        }
-}
-
-static unsigned int startup_bigsur_irq(unsigned int irq)
-{
-        u8 mask;
-        u32 reg;
-
-        pr_debug("startup_bigsur_irq IRQ %d\n", irq);
-
-        if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) {
-                /* Enable the L1 IRQ */
-                enable_bigsur_l1irq(irq);
-                /* Enable all L2 IRQs in this L1 IRQ */
-                mask = ~(bigsur_l2irq_mask[irq-BIGSUR_IRQ_LOW]);
-                reg = imr_base - bigsur_l2irq_reg[irq-BIGSUR_IRQ_LOW] * imr_offset;
-                mask &= inb(reg);
-                outb(mask,reg);
-                DIPRINTK(2,"startup_bigsur_irq: IMR=0x%08x mask=0x%x\n",reg,inb(reg));
-        }
-        else {
-                /* Enable the L2 IRQ - clear mask bit */
-                enable_bigsur_l2irq(irq);
-                /* Enable the L1 bit masking this L2 IRQ */
-                enable_bigsur_l1irq(bigsur_l2_l1_map[irq-BIGSUR_2NDLVL_IRQ_LOW]);
-                DIPRINTK(2,"startup_bigsur_irq: L1=%d L2=%d\n",
-                        bigsur_l2_l1_map[irq-BIGSUR_2NDLVL_IRQ_LOW],irq);
-        }
-        return 0;
-}
-
-static void shutdown_bigsur_irq(unsigned int irq)
-{
-        pr_debug("shutdown_bigsur_irq IRQ %d\n", irq);
-        if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH)
-                disable_bigsur_l1irq(irq);
-        else
-                disable_bigsur_l2irq(irq);
-}
-
-/* Define the IRQ structures for the L1 and L2 IRQ types */
-static struct hw_interrupt_type bigsur_l1irq_type = {
-       .typename  = "BigSur-CPLD-Level1-IRQ",
-       .startup = startup_bigsur_irq,
-       .shutdown = shutdown_bigsur_irq,
-       .enable = enable_bigsur_l1irq,
-       .disable = disable_bigsur_l1irq,
-       .ack = mask_and_ack_bigsur,
-       .end = end_bigsur_irq
-};
-
-static struct hw_interrupt_type bigsur_l2irq_type = {
-       .typename  = "BigSur-CPLD-Level2-IRQ",
-       .startup = startup_bigsur_irq,
-       .shutdown  =shutdown_bigsur_irq,
-       .enable = enable_bigsur_l2irq,
-       .disable = disable_bigsur_l2irq,
-       .ack = mask_and_ack_bigsur,
-       .end = end_bigsur_irq
-};
-
-
-static void make_bigsur_l1isr(unsigned int irq) {
-
-        /* sanity check first */
-        if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) {
-                /* save the handler in the main description table */
-                irq_desc[irq].chip = &bigsur_l1irq_type;
-                irq_desc[irq].status = IRQ_DISABLED;
-                irq_desc[irq].action = 0;
-                irq_desc[irq].depth = 1;
-
-                disable_bigsur_l1irq(irq);
-                return;
-        }
-        pr_debug("make_bigsur_l1isr: bad irq, %d\n", irq);
-        return;
-}
-
-static void make_bigsur_l2isr(unsigned int irq) {
-
-        /* sanity check first */
-        if(irq >= BIGSUR_2NDLVL_IRQ_LOW && irq < BIGSUR_2NDLVL_IRQ_HIGH) {
-                /* save the handler in the main description table */
-                irq_desc[irq].chip = &bigsur_l2irq_type;
-                irq_desc[irq].status = IRQ_DISABLED;
-                irq_desc[irq].action = 0;
-                irq_desc[irq].depth = 1;
-
-                disable_bigsur_l2irq(irq);
-                return;
-        }
-        pr_debug("make_bigsur_l2isr: bad irq, %d\n", irq);
-        return;
-}
-
-/* The IRQ's will be decoded as follows:
- * If a level 2 handler exists and there is an unmasked active
- * IRQ, the 2nd level handler will be called.
- * If a level 2 handler does not exist for the active IRQ
- * the 1st level handler will be called.
- */
-
-int bigsur_irq_demux(int irq)
-{
-        int dmux_irq = irq;
-        u8 mask, actv_irqs;
-        u32 reg_num;
-
-        DIPRINTK(3,"bigsur_irq_demux, irq=%d\n", irq);
-        /* decode the 1st level IRQ */
-        if(irq >= BIGSUR_IRQ_LOW && irq < BIGSUR_IRQ_HIGH) {
-                /* Get corresponding L2 ISR bitmask and ISR number */
-                mask = bigsur_l2irq_mask[irq-BIGSUR_IRQ_LOW];
-                reg_num = bigsur_l2irq_reg[irq-BIGSUR_IRQ_LOW];
-                /* find the active IRQ's (XOR with inactive level)*/
-                actv_irqs = inb(isr_base-reg_num*isr_offset) ^
-                                        bigsur_l2_inactv_state[reg_num];
-                /* decode active IRQ's */
-                actv_irqs = actv_irqs & mask & ~(inb(imr_base-reg_num*imr_offset));
-                /* if NEZ then we have an active L2 IRQ */
-                if(actv_irqs) dmux_irq = ffz(~actv_irqs) + reg_num*8+BIGSUR_2NDLVL_IRQ_LOW;
-                /* if no 2nd level IRQ action, but has 1st level, use 1st level handler */
-                if(!irq_desc[dmux_irq].action && irq_desc[irq].action)
-                        dmux_irq = irq;
-                DIPRINTK(1,"bigsur_irq_demux: irq=%d dmux_irq=%d mask=0x%04x reg=%d\n",
-                        irq, dmux_irq, mask, reg_num);
-        }
-#ifdef CONFIG_HD64465
-        dmux_irq = hd64465_irq_demux(dmux_irq);
-#endif /* CONFIG_HD64465 */
-        DIPRINTK(3,"bigsur_irq_demux, demux_irq=%d\n", dmux_irq);
-
-        return dmux_irq;
-}
-
-/*===========================================================*/
-//              Big Sur Init Routines
-/*===========================================================*/
-void __init init_bigsur_IRQ(void)
-{
-        int i;
-
-        if (!MACH_BIGSUR) return;
-
-        /* Create ISR's for Big Sur CPLD IRQ's */
-        /*==============================================================*/
-        for(i=BIGSUR_IRQ_LOW;i<BIGSUR_IRQ_HIGH;i++)
-                make_bigsur_l1isr(i);
-
-        printk(KERN_INFO "Big Sur CPLD L1 interrupts %d to %d.\n",
-                BIGSUR_IRQ_LOW,BIGSUR_IRQ_HIGH);
-
-        for(i=BIGSUR_2NDLVL_IRQ_LOW;i<BIGSUR_2NDLVL_IRQ_HIGH;i++)
-                make_bigsur_l2isr(i);
-
-        printk(KERN_INFO "Big Sur CPLD L2 interrupts %d to %d.\n",
-                BIGSUR_2NDLVL_IRQ_LOW,BIGSUR_2NDLVL_IRQ_HIGH);
-
-}
diff --git a/arch/sh/boards/bigsur/led.c b/arch/sh/boards/bigsur/led.c
deleted file mode 100644 (file)
index d221439..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * linux/arch/sh/boards/bigsur/led.c
- *
- * By Dustin McIntire (dustin@sensoria.com) (c)2001
- * Derived from led_se.c and led.c, which bore the message:
- * Copyright (C) 2000 Stuart Menefy <stuart.menefy@st.com>
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * This file contains Big Sur specific LED code.
- */
-
-#include <asm/io.h>
-#include <asm/bigsur/bigsur.h>
-
-static void mach_led(int position, int value)
-{
-       int word;
-       
-       word = bigsur_inl(BIGSUR_CSLR);
-       if (value) {
-               bigsur_outl(word & ~BIGSUR_LED, BIGSUR_CSLR);
-       } else {
-               bigsur_outl(word | BIGSUR_LED, BIGSUR_CSLR);
-       }
-}
-
-#ifdef CONFIG_HEARTBEAT
-
-#include <linux/sched.h>
-
-/* Cycle the LED on/off */
-void heartbeat_bigsur(void)
-{
-       static unsigned cnt = 0, period = 0, dist = 0;
-
-       if (cnt == 0 || cnt == dist)
-               mach_led( -1, 1);
-       else if (cnt == 7 || cnt == dist+7)
-               mach_led( -1, 0);
-
-       if (++cnt > period) {
-               cnt = 0;
-               /* The hyperbolic function below modifies the heartbeat period
-                * length in dependency of the current (5min) load. It goes
-                * through the points f(0)=126, f(1)=86, f(5)=51,
-                * f(inf)->30. */
-               period = ((672<<FSHIFT)/(5*avenrun[0]+(7<<FSHIFT))) + 30;
-               dist = period / 4;
-       }
-}
-#endif /* CONFIG_HEARTBEAT */
-
diff --git a/arch/sh/boards/bigsur/setup.c b/arch/sh/boards/bigsur/setup.c
deleted file mode 100644 (file)
index 9711c20..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *
- * By Dustin McIntire (dustin@sensoria.com) (c)2001
- * 
- * Setup and IRQ handling code for the HD64465 companion chip.
- * by Greg Banks <gbanks@pocketpenguins.com>
- * Copyright (c) 2000 PocketPenguins Inc
- *
- * Derived from setup_hd64465.c which bore the message:
- * Greg Banks <gbanks@pocketpenguins.com>
- * Copyright (c) 2000 PocketPenguins Inc and
- * Copyright (C) 2000 YAEGASHI Takeshi
- * and setup_cqreek.c which bore message:
- * Copyright (C) 2000  Niibe Yutaka
- * 
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * Setup functions for a Hitachi Big Sur Evaluation Board.
- * 
- */
-
-#include <linux/sched.h>
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/param.h>
-#include <linux/ioport.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-#include <linux/irq.h>
-#include <linux/bitops.h>
-
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/machvec.h>
-#include <asm/bigsur/io.h>
-#include <asm/hd64465/hd64465.h>
-#include <asm/bigsur/bigsur.h>
-
-/*===========================================================*/
-//             Big Sur Init Routines   
-/*===========================================================*/
-
-static void __init bigsur_setup(char **cmdline_p)
-{
-       /* Mask all 2nd level IRQ's */
-       outb(-1,BIGSUR_IMR0);
-       outb(-1,BIGSUR_IMR1);
-       outb(-1,BIGSUR_IMR2);
-       outb(-1,BIGSUR_IMR3);
-
-       /* Mask 1st level interrupts */
-       outb(-1,BIGSUR_IRLMR0);
-       outb(-1,BIGSUR_IRLMR1);
-
-#if defined (CONFIG_HD64465) && defined (CONFIG_SERIAL) 
-       /* remap IO ports for first ISA serial port to HD64465 UART */
-       bigsur_port_map(0x3f8, 8, CONFIG_HD64465_IOBASE + 0x8000, 1);
-#endif /* CONFIG_HD64465 && CONFIG_SERIAL */
-       /* TODO: setup IDE registers */
-       bigsur_port_map(BIGSUR_IDECTL_IOPORT, 2, BIGSUR_ICTL, 8);
-       /* Setup the Ethernet port to BIGSUR_ETHER_IOPORT */
-       bigsur_port_map(BIGSUR_ETHER_IOPORT, 16, BIGSUR_ETHR+BIGSUR_ETHER_IOPORT, 0);
-       /* set page to 1 */
-       outw(1, BIGSUR_ETHR+0xe);
-       /* set the IO port to BIGSUR_ETHER_IOPORT */
-       outw(BIGSUR_ETHER_IOPORT<<3, BIGSUR_ETHR+0x2);
-}
-
-/*
- * The Machine Vector
- */
-extern void heartbeat_bigsur(void);
-extern void init_bigsur_IRQ(void);
-
-struct sh_machine_vector mv_bigsur __initmv = {
-       .mv_name                = "Big Sur",
-       .mv_setup               = bigsur_setup,
-
-       .mv_isa_port2addr       = bigsur_isa_port2addr,
-       .mv_irq_demux           = bigsur_irq_demux,
-
-       .mv_init_irq            = init_bigsur_IRQ,
-#ifdef CONFIG_HEARTBEAT
-       .mv_heartbeat           = heartbeat_bigsur,
-#endif
-};
-ALIAS_MV(bigsur)
diff --git a/arch/sh/boards/ec3104/Makefile b/arch/sh/boards/ec3104/Makefile
deleted file mode 100644 (file)
index 1788915..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Makefile for the EC3104 specific parts of the kernel
-#
-
-obj-y   := setup.o io.o irq.o
-
diff --git a/arch/sh/boards/ec3104/io.c b/arch/sh/boards/ec3104/io.c
deleted file mode 100644 (file)
index 2f86394..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * linux/arch/sh/boards/ec3104/io.c
- *  EC3104 companion chip support
- *
- * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>
- *
- */
-/* EC3104 note:
- * This code was written without any documentation about the EC3104 chip.  While
- * I hope I got most of the basic functionality right, the register names I use
- * are most likely completely different from those in the chip documentation.
- *
- * If you have any further information about the EC3104, please tell me
- * (prumpf@tux.org).
- */
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <asm/io.h>
-#include <asm/page.h>
-#include <asm/ec3104/ec3104.h>
-
-/*
- * EC3104 has a real ISA bus which we redirect low port accesses to (the
- * actual device on mine is a ESS 1868, and I don't want to hack the driver
- * more than strictly necessary).  I am not going to duplicate the
- * hard coding of PC addresses (for the 16550s aso) here though;  it's just
- * too ugly.
- */
-
-#define low_port(port) ((port) < 0x10000)
-
-static inline unsigned long port2addr(unsigned long port)
-{
-       switch(port >> 16) {
-       case 0:
-               return EC3104_ISA_BASE + port * 2;
-
-               /* XXX hack. it's unclear what to do about the serial ports */
-       case 1:
-               return EC3104_BASE + (port&0xffff) * 4;
-
-       default:
-               /* XXX PCMCIA */
-               return 0;
-       }
-}
-
-unsigned char ec3104_inb(unsigned long port)
-{
-       u8 ret;
-
-       ret = *(volatile u8 *)port2addr(port);
-
-       return ret;
-}
-
-unsigned short ec3104_inw(unsigned long port)
-{
-       BUG();
-}
-
-unsigned long ec3104_inl(unsigned long port)
-{
-       BUG();
-}
-
-void ec3104_outb(unsigned char data, unsigned long port)
-{
-       *(volatile u8 *)port2addr(port) = data;
-}
-
-void ec3104_outw(unsigned short data, unsigned long port)
-{
-       BUG();
-}
-
-void ec3104_outl(unsigned long data, unsigned long port)
-{
-       BUG();
-}
diff --git a/arch/sh/boards/ec3104/irq.c b/arch/sh/boards/ec3104/irq.c
deleted file mode 100644 (file)
index ffa4ff1..0000000
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * linux/arch/sh/boards/ec3104/irq.c
- * EC3104 companion chip support
- *
- * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>
- *
- */
-
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/ec3104/ec3104.h>
-
-/* This is for debugging mostly;  here's the table that I intend to keep
- * in here:
- *
- *   index      function        base addr       power           interrupt bit
- *       0      power           b0ec0000        ---             00000001 (unused)
- *       1      irqs            b0ec1000        ---             00000002 (unused)
- *       2      ??              b0ec2000        b0ec0008        00000004
- *       3      PS2 (1)         b0ec3000        b0ec000c        00000008
- *       4      PS2 (2)         b0ec4000        b0ec0010        00000010
- *       5      ??              b0ec5000        b0ec0014        00000020
- *       6      I2C             b0ec6000        b0ec0018        00000040
- *       7      serial (1)      b0ec7000        b0ec001c        00000080
- *       8      serial (2)      b0ec8000        b0ec0020        00000100
- *       9      serial (3)      b0ec9000        b0ec0024        00000200
- *      10      serial (4)      b0eca000        b0ec0028        00000400
- *      12      GPIO (1)        b0ecc000        b0ec0030
- *      13      GPIO (2)        b0ecc000        b0ec0030
- *      16      pcmcia (1)      b0ed0000        b0ec0040        00010000
- *      17      pcmcia (2)      b0ed1000        b0ec0044        00020000
- */
-
-/* I used the register names from another interrupt controller I worked with,
- * since it seems to be identical to the ec3104 except that all bits are
- * inverted:
- *
- * IRR: Interrupt Request Register (pending and enabled interrupts)
- * IMR: Interrupt Mask Register (which interrupts are enabled)
- * IPR: Interrupt Pending Register (pending interrupts, even disabled ones)
- *
- * 0 bits mean pending or enabled, 1 bits mean not pending or disabled.  all
- * IRQs seem to be level-triggered.
- */
-
-#define EC3104_IRR (EC3104_BASE + 0x1000)
-#define EC3104_IMR (EC3104_BASE + 0x1004)
-#define EC3104_IPR (EC3104_BASE + 0x1008)
-
-#define ctrl_readl(addr) (*(volatile u32 *)(addr))
-#define ctrl_writel(data,addr) (*(volatile u32 *)(addr) = (data))
-#define ctrl_readb(addr) (*(volatile u8 *)(addr))
-
-static char *ec3104_name(unsigned index)
-{
-        switch(index) {
-        case 0:
-                return "power management";
-        case 1:
-                return "interrupts";
-        case 3:
-                return "PS2 (1)";
-        case 4:
-                return "PS2 (2)";
-        case 5:
-                return "I2C (1)";
-        case 6:
-                return "I2C (2)";
-        case 7:
-                return "serial (1)";
-        case 8:
-                return "serial (2)";
-        case 9:
-                return "serial (3)";
-        case 10:
-                return "serial (4)";
-        case 16:
-                return "pcmcia (1)";
-        case 17:
-                return "pcmcia (2)";
-        default: {
-                static char buf[32];
-
-                sprintf(buf, "unknown (%d)", index);
-
-                return buf;
-                }
-        }
-}
-
-int get_pending_interrupts(char *buf)
-{
-        u32 ipr;
-        u32 bit;
-        char *p = buf;
-
-        p += sprintf(p, "pending: (");
-
-        ipr = ctrl_inl(EC3104_IPR);
-
-        for (bit = 1; bit < 32; bit++)
-                if (!(ipr & (1<<bit)))
-                        p += sprintf(p, "%s ", ec3104_name(bit));
-
-        p += sprintf(p, ")\n");
-
-        return p - buf;
-}
-
-static inline u32 ec3104_irq2mask(unsigned int irq)
-{
-        return (1 << (irq - EC3104_IRQBASE));
-}
-
-static inline void mask_ec3104_irq(unsigned int irq)
-{
-        u32 mask;
-
-        mask = ctrl_readl(EC3104_IMR);
-
-        mask |= ec3104_irq2mask(irq);
-
-        ctrl_writel(mask, EC3104_IMR);
-}
-
-static inline void unmask_ec3104_irq(unsigned int irq)
-{
-        u32 mask;
-
-        mask = ctrl_readl(EC3104_IMR);
-
-        mask &= ~ec3104_irq2mask(irq);
-
-        ctrl_writel(mask, EC3104_IMR);
-}
-
-static void disable_ec3104_irq(unsigned int irq)
-{
-        mask_ec3104_irq(irq);
-}
-
-static void enable_ec3104_irq(unsigned int irq)
-{
-        unmask_ec3104_irq(irq);
-}
-
-static void mask_and_ack_ec3104_irq(unsigned int irq)
-{
-        mask_ec3104_irq(irq);
-}
-
-static void end_ec3104_irq(unsigned int irq)
-{
-        if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
-                unmask_ec3104_irq(irq);
-}
-
-static unsigned int startup_ec3104_irq(unsigned int irq)
-{
-        unmask_ec3104_irq(irq);
-
-        return 0;
-}
-
-static void shutdown_ec3104_irq(unsigned int irq)
-{
-        mask_ec3104_irq(irq);
-
-}
-
-static struct hw_interrupt_type ec3104_int = {
-        .typename       = "EC3104",
-        .enable         = enable_ec3104_irq,
-        .disable        = disable_ec3104_irq,
-        .ack            = mask_and_ack_ec3104_irq,
-        .end            = end_ec3104_irq,
-        .startup        = startup_ec3104_irq,
-        .shutdown       = shutdown_ec3104_irq,
-};
-
-/* Yuck.  the _demux API is ugly */
-int ec3104_irq_demux(int irq)
-{
-        if (irq == EC3104_IRQ) {
-                unsigned int mask;
-
-                mask = ctrl_readl(EC3104_IRR);
-
-                if (mask == 0xffffffff)
-                        return EC3104_IRQ;
-                else
-                        return EC3104_IRQBASE + ffz(mask);
-        }
-
-        return irq;
-}
diff --git a/arch/sh/boards/ec3104/setup.c b/arch/sh/boards/ec3104/setup.c
deleted file mode 100644 (file)
index 902bc97..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * linux/arch/sh/boards/ec3104/setup.c
- *  EC3104 companion chip support
- *
- * Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>
- *
- */
-/* EC3104 note:
- * This code was written without any documentation about the EC3104 chip.  While
- * I hope I got most of the basic functionality right, the register names I use
- * are most likely completely different from those in the chip documentation.
- *
- * If you have any further information about the EC3104, please tell me
- * (prumpf@tux.org).
- */
-
-#include <linux/sched.h>
-#include <linux/kernel.h>
-#include <linux/param.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-#include <linux/irq.h>
-#include <linux/types.h>
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <asm/machvec.h>
-#include <asm/mach/ec3104.h>
-
-static void __init ec3104_setup(char **cmdline_p)
-{
-       char str[8];
-       int i;
-
-       for (i=0; i<8; i++)
-               str[i] = ctrl_readb(EC3104_BASE + i);
-
-       for (i = EC3104_IRQBASE; i < EC3104_IRQBASE + 32; i++)
-               irq_desc[i].handler = &ec3104_int;
-
-       printk("initializing EC3104 \"%.8s\" at %08x, IRQ %d, IRQ base %d\n",
-              str, EC3104_BASE, EC3104_IRQ, EC3104_IRQBASE);
-
-       /* mask all interrupts.  this should have been done by the boot
-        * loader for us but we want to be sure ... */
-       ctrl_writel(0xffffffff, EC3104_IMR);
-}
-
-/*
- * The Machine Vector
- */
-struct sh_machine_vector mv_ec3104 __initmv = {
-       .mv_name        = "EC3104",
-       .mv_setup       = ec3104_setup,
-       .mv_nr_irqs     = 96,
-
-       .mv_inb         = ec3104_inb,
-       .mv_inw         = ec3104_inw,
-       .mv_inl         = ec3104_inl,
-       .mv_outb        = ec3104_outb,
-       .mv_outw        = ec3104_outw,
-       .mv_outl        = ec3104_outl,
-
-       .mv_irq_demux   = ec3104_irq_demux,
-};
-ALIAS_MV(ec3104)
index e62524978160ac3fbb79448ea7d0656764bd2ee1..47a63c6617ed0b8b3cee4744c2f6ebbbc747852a 100644 (file)
@@ -150,7 +150,7 @@ static irqreturn_t sw_interrupt(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static struct file_operations swdrv_fops = {
+static const struct file_operations swdrv_fops = {
        .read = swdrv_read,     /* read */
        .write = swdrv_write,   /* write */
        .open = swdrv_open,     /* open */
index 1644ebed78cb68ce732009ad2ef5e7ddd40ec6fa..8cd31b5d200b026372f852a76ffb4d93ac0203c7 100644 (file)
@@ -2,7 +2,7 @@
 # Makefile for the Interface (CTP/PCI/MPC-SH02) specific parts of the kernel
 #
 
-obj-y   := setup.o rtc.o led.o
+obj-y   := setup.o rtc.o
 
 obj-$(CONFIG_PCI) += pci.o
 
diff --git a/arch/sh/boards/mpc1211/led.c b/arch/sh/boards/mpc1211/led.c
deleted file mode 100644 (file)
index 8df1591..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * linux/arch/sh/boards/mpc1211/led.c
- *
- * Copyright (C) 2001  Saito.K & Jeanne
- *
- * This file contains Interface MPC-1211 specific LED code.
- */
-
-
-static void mach_led(int position, int value)
-{
-       volatile unsigned char* p = (volatile unsigned char*)0xa2000000;
-
-       if (value) {
-               *p |= 1;
-       } else {
-               *p &= ~1;
-       }
-}
-
-#ifdef CONFIG_HEARTBEAT
-
-#include <linux/sched.h>
-
-/* Cycle the LED's in the clasic Knightrider/Sun pattern */
-void heartbeat_mpc1211(void)
-{
-       static unsigned int cnt = 0, period = 0;
-       volatile unsigned char* p = (volatile unsigned char*)0xa2000000;
-       static unsigned bit = 0, up = 1;
-
-       cnt += 1;
-       if (cnt < period) {
-               return;
-       }
-
-       cnt = 0;
-
-       /* Go through the points (roughly!):
-        * f(0)=10, f(1)=16, f(2)=20, f(5)=35,f(inf)->110
-        */
-       period = 110 - ( (300<<FSHIFT)/
-                        ((avenrun[0]/5) + (3<<FSHIFT)) );
-
-       if (up) {
-               if (bit == 7) {
-                       bit--;
-                       up=0;
-               } else {
-                       bit ++;
-               }
-       } else {
-               if (bit == 0) {
-                       bit++;
-                       up=1;
-               } else {
-                       bit--;
-               }
-       }
-       *p = 1<<bit;
-
-}
-#endif /* CONFIG_HEARTBEAT */
index 7c3d1d304157f48d70555fa4dc71bdc199aeb00d..1a0604b23ce0f4bac86f65fa1e783d8e372cdb04 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/hdreg.h>
 #include <linux/ide.h>
 #include <linux/interrupt.h>
+#include <linux/platform_device.h>
 #include <asm/io.h>
 #include <asm/machvec.h>
 #include <asm/mpc1211/mpc1211.h>
@@ -281,6 +282,32 @@ static int put_smb_blk(unsigned char *p, int address, int command, int no)
        return 0;
 }
 
+static struct resource heartbeat_resources[] = {
+       [0] = {
+               .start  = 0xa2000000,
+               .end    = 0xa2000000 + 8 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device heartbeat_device = {
+       .name           = "heartbeat",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(heartbeat_resources),
+       .resource       = heartbeat_resources,
+};
+
+static struct platform_device *mpc1211_devices[] __initdata = {
+       &heartbeat_device,
+};
+
+static int __init mpc1211_devices_setup(void)
+{
+       return platform_add_devices(mpc1211_devices,
+                                   ARRAY_SIZE(mpc1211_devices));
+}
+__initcall(mpc1211_devices_setup);
+
 /* arch/sh/boards/mpc1211/rtc.c */
 void mpc1211_time_init(void);
 
@@ -317,9 +344,5 @@ struct sh_machine_vector mv_mpc1211 __initmv = {
        .mv_nr_irqs             = 48,
        .mv_irq_demux           = mpc1211_irq_demux,
        .mv_init_irq            = init_mpc1211_IRQ,
-
-#ifdef CONFIG_HEARTBEAT
-       .mv_heartbeat           = heartbeat_mpc1211,
-#endif
 };
 ALIAS_MV(mpc1211)
index 574b0316ed564ace61bd0ca0ce5364f2d38e1741..3c93012e91a33cdd36d2816e849e936bae6b0163 100644 (file)
@@ -4,5 +4,4 @@
 
 obj-y   := setup.o io.o irq.o
 
-obj-$(CONFIG_HEARTBEAT)                += led.o
 obj-$(CONFIG_PUSH_SWITCH)      += psw.o
index 311ccccba718c48e7665403b6b1b722732c9a339..f74d2ffb38517402e48d40346823ddf228ec2a8c 100644 (file)
 #include <linux/pci.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
+#include <linux/io.h>
 #include <asm/r7780rp.h>
 #include <asm/addrspace.h>
-#include <asm/io.h>
-
-static inline unsigned long port2adr(unsigned int port)
-{
-       if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6)
-               if (port == 0x3f6)
-                       return (PA_AREA5_IO + 0x80c);
-               else
-                       return (PA_AREA5_IO + 0x1000 + ((port-0x1f0) << 1));
-       else
-               maybebadio((unsigned long)port);
-
-       return port;
-}
 
 static inline unsigned long port88796l(unsigned int port, int flag)
 {
@@ -40,18 +27,6 @@ static inline unsigned long port88796l(unsigned int port, int flag)
        return addr;
 }
 
-/* The 7780 R7780RP-1 seems to have everything hooked */
-/* up pretty normally (nothing on high-bytes only...) so this */
-/* shouldn't be needed */
-static inline int shifted_port(unsigned long port)
-{
-       /* For IDE registers, value is not shifted */
-       if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6)
-               return 0;
-       else
-               return 1;
-}
-
 #if defined(CONFIG_NE2000) || defined(CONFIG_NE2000_MODULE)
 #define CHECK_AX88796L_PORT(port) \
   ((port >= AX88796L_IO_BASE) && (port < (AX88796L_IO_BASE+0x20)))
@@ -70,12 +45,10 @@ u8 r7780rp_inb(unsigned long port)
 {
        if (CHECK_AX88796L_PORT(port))
                return ctrl_inw(port88796l(port, 0)) & 0xff;
-       else if (PXSEG(port))
-               return ctrl_inb(port);
-       else if (is_pci_ioaddr(port) || shifted_port(port))
+       else if (is_pci_ioaddr(port))
                return ctrl_inb(pci_ioaddr(port));
 
-       return ctrl_inw(port2adr(port)) & 0xff;
+       return ctrl_inw(port) & 0xff;
 }
 
 u8 r7780rp_inb_p(unsigned long port)
@@ -84,12 +57,10 @@ u8 r7780rp_inb_p(unsigned long port)
 
        if (CHECK_AX88796L_PORT(port))
                v = ctrl_inw(port88796l(port, 0)) & 0xff;
-       else if (PXSEG(port))
-               v = ctrl_inb(port);
-       else if (is_pci_ioaddr(port) || shifted_port(port))
+       else if (is_pci_ioaddr(port))
                v = ctrl_inb(pci_ioaddr(port));
        else
-               v = ctrl_inw(port2adr(port)) & 0xff;
+               v = ctrl_inw(port) & 0xff;
 
        ctrl_delay();
 
@@ -98,80 +69,56 @@ u8 r7780rp_inb_p(unsigned long port)
 
 u16 r7780rp_inw(unsigned long port)
 {
-       if (CHECK_AX88796L_PORT(port))
-               maybebadio(port);
-       else if (PXSEG(port))
-               return ctrl_inw(port);
-       else if (is_pci_ioaddr(port) || shifted_port(port))
+       if (is_pci_ioaddr(port))
                return ctrl_inw(pci_ioaddr(port));
-       else
-               maybebadio(port);
 
-       return 0;
+       return ctrl_inw(port);
 }
 
 u32 r7780rp_inl(unsigned long port)
 {
-       if (CHECK_AX88796L_PORT(port))
-               maybebadio(port);
-       else if (PXSEG(port))
-               return ctrl_inl(port);
-       else if (is_pci_ioaddr(port) || shifted_port(port))
+       if (is_pci_ioaddr(port))
                return ctrl_inl(pci_ioaddr(port));
-       else
-               maybebadio(port);
 
-       return 0;
+       return ctrl_inl(port);
 }
 
 void r7780rp_outb(u8 value, unsigned long port)
 {
        if (CHECK_AX88796L_PORT(port))
                ctrl_outw(value, port88796l(port, 0));
-       else if (PXSEG(port))
-               ctrl_outb(value, port);
-       else if (is_pci_ioaddr(port) || shifted_port(port))
+       else if (is_pci_ioaddr(port))
                ctrl_outb(value, pci_ioaddr(port));
        else
-               ctrl_outw(value, port2adr(port));
+               ctrl_outb(value, port);
 }
 
 void r7780rp_outb_p(u8 value, unsigned long port)
 {
        if (CHECK_AX88796L_PORT(port))
                ctrl_outw(value, port88796l(port, 0));
-       else if (PXSEG(port))
-               ctrl_outb(value, port);
-       else if (is_pci_ioaddr(port) || shifted_port(port))
+       else if (is_pci_ioaddr(port))
                ctrl_outb(value, pci_ioaddr(port));
        else
-               ctrl_outw(value, port2adr(port));
+               ctrl_outb(value, port);
 
        ctrl_delay();
 }
 
 void r7780rp_outw(u16 value, unsigned long port)
 {
-       if (CHECK_AX88796L_PORT(port))
-               maybebadio(port);
-       else if (PXSEG(port))
-               ctrl_outw(value, port);
-       else if (is_pci_ioaddr(port) || shifted_port(port))
+       if (is_pci_ioaddr(port))
                ctrl_outw(value, pci_ioaddr(port));
        else
-               maybebadio(port);
+               ctrl_outw(value, port);
 }
 
 void r7780rp_outl(u32 value, unsigned long port)
 {
-       if (CHECK_AX88796L_PORT(port))
-               maybebadio(port);
-       else if (PXSEG(port))
-               ctrl_outl(value, port);
-       else if (is_pci_ioaddr(port) || shifted_port(port))
+       if (is_pci_ioaddr(port))
                ctrl_outl(value, pci_ioaddr(port));
        else
-               maybebadio(port);
+               ctrl_outl(value, port);
 }
 
 void r7780rp_insb(unsigned long port, void *dst, unsigned long count)
@@ -183,16 +130,13 @@ void r7780rp_insb(unsigned long port, void *dst, unsigned long count)
                p = (volatile u16 *)port88796l(port, 0);
                while (count--)
                        *buf++ = *p & 0xff;
-       } else if (PXSEG(port)) {
-               while (count--)
-                       *buf++ = *(volatile u8 *)port;
-       } else if (is_pci_ioaddr(port) || shifted_port(port)) {
+       } else if (is_pci_ioaddr(port)) {
                volatile u8 *bp = (volatile u8 *)pci_ioaddr(port);
 
                while (count--)
                        *buf++ = *bp;
        } else {
-               p = (volatile u16 *)port2adr(port);
+               p = (volatile u16 *)port;
                while (count--)
                        *buf++ = *p & 0xff;
        }
@@ -205,30 +149,26 @@ void r7780rp_insw(unsigned long port, void *dst, unsigned long count)
 
        if (CHECK_AX88796L_PORT(port))
                p = (volatile u16 *)port88796l(port, 1);
-       else if (PXSEG(port))
-               p = (volatile u16 *)port;
-       else if (is_pci_ioaddr(port) || shifted_port(port))
+       else if (is_pci_ioaddr(port))
                p = (volatile u16 *)pci_ioaddr(port);
        else
-               p = (volatile u16 *)port2adr(port);
+               p = (volatile u16 *)port;
 
        while (count--)
                *buf++ = *p;
+
+       flush_dcache_all();
 }
 
 void r7780rp_insl(unsigned long port, void *dst, unsigned long count)
 {
-       u32 *buf = dst;
-
-       if (CHECK_AX88796L_PORT(port))
-               maybebadio(port);
-       else if (is_pci_ioaddr(port) || shifted_port(port)) {
+       if (is_pci_ioaddr(port)) {
                volatile u32 *p = (volatile u32 *)pci_ioaddr(port);
+               u32 *buf = dst;
 
                while (count--)
                        *buf++ = *p;
-       } else
-               maybebadio(port);
+       }
 }
 
 void r7780rp_outsb(unsigned long port, const void *src, unsigned long count)
@@ -240,19 +180,14 @@ void r7780rp_outsb(unsigned long port, const void *src, unsigned long count)
                p = (volatile u16 *)port88796l(port, 0);
                while (count--)
                        *p = *buf++;
-       } else if (PXSEG(port))
-               while (count--)
-                       ctrl_outb(*buf++, port);
-       else if (is_pci_ioaddr(port) || shifted_port(port)) {
+       } else if (is_pci_ioaddr(port)) {
                volatile u8 *bp = (volatile u8 *)pci_ioaddr(port);
 
                while (count--)
                        *bp = *buf++;
-       } else {
-               p = (volatile u16 *)port2adr(port);
+       } else
                while (count--)
-                       *p = *buf++;
-       }
+                       ctrl_outb(*buf++, port);
 }
 
 void r7780rp_outsw(unsigned long port, const void *src, unsigned long count)
@@ -262,40 +197,37 @@ void r7780rp_outsw(unsigned long port, const void *src, unsigned long count)
 
        if (CHECK_AX88796L_PORT(port))
                p = (volatile u16 *)port88796l(port, 1);
-       else if (PXSEG(port))
-               p = (volatile u16 *)port;
-       else if (is_pci_ioaddr(port) || shifted_port(port))
+       else if (is_pci_ioaddr(port))
                p = (volatile u16 *)pci_ioaddr(port);
        else
-               p = (volatile u16 *)port2adr(port);
+               p = (volatile u16 *)port;
 
        while (count--)
                *p = *buf++;
+
+       flush_dcache_all();
 }
 
 void r7780rp_outsl(unsigned long port, const void *src, unsigned long count)
 {
        const u32 *buf = src;
+       u32 *p;
 
-       if (CHECK_AX88796L_PORT(port))
-               maybebadio(port);
-       else if (is_pci_ioaddr(port) || shifted_port(port)) {
-               volatile u32 *p = (volatile u32 *)pci_ioaddr(port);
+       if (is_pci_ioaddr(port))
+               p = (u32 *)pci_ioaddr(port);
+       else
+               p = (u32 *)port;
 
-               while (count--)
-                       *p = *buf++;
-       } else
-               maybebadio(port);
+       while (count--)
+               ctrl_outl(*buf++, (unsigned long)p);
 }
 
 void __iomem *r7780rp_ioport_map(unsigned long port, unsigned int size)
 {
        if (CHECK_AX88796L_PORT(port))
                return (void __iomem *)port88796l(port, size > 1);
-       else if (PXSEG(port))
-               return (void __iomem *)port;
-       else if (is_pci_ioaddr(port) || shifted_port(port))
+       else if (is_pci_ioaddr(port))
                return (void __iomem *)pci_ioaddr(port);
 
-       return (void __iomem *)port2adr(port);
+       return (void __iomem *)port;
 }
diff --git a/arch/sh/boards/renesas/r7780rp/led.c b/arch/sh/boards/renesas/r7780rp/led.c
deleted file mode 100644 (file)
index 6a00a25..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) Atom Create Engineering Co., Ltd.
- *
- * May be copied or modified under the terms of GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * This file contains Renesas Solutions HIGHLANDER R7780RP-1 specific LED code.
- */
-#include <linux/sched.h>
-#include <asm/io.h>
-#include <asm/r7780rp/r7780rp.h>
-
-/* Cycle the LED's in the clasic Knightriger/Sun pattern */
-void heartbeat_r7780rp(void)
-{
-       static unsigned int cnt = 0, period = 0;
-       volatile unsigned short *p = (volatile unsigned short *)PA_OBLED;
-       static unsigned bit = 0, up = 1;
-       unsigned bit_pos[] = {2, 1, 0, 3, 6, 5, 4, 7};
-
-       cnt += 1;
-       if (cnt < period)
-               return;
-
-       cnt = 0;
-
-       /* Go through the points (roughly!):
-        * f(0)=10, f(1)=16, f(2)=20, f(5)=35, f(int)->110
-        */
-       period = 110 - ((300 << FSHIFT)/((avenrun[0]/5) + (3<<FSHIFT)));
-
-       *p = 1 << bit_pos[bit];
-       if (up)
-               if (bit == 7) {
-                       bit--;
-                       up = 0;
-               } else
-                       bit++;
-       else if (bit == 0)
-               up = 1;
-       else
-               bit--;
-}
index 9f89c8de9db98ba9f5a4e0ad3f6478520af515a0..0d74db9f179298fcd4c86e5333d39dcf76131082 100644 (file)
@@ -2,7 +2,7 @@
  * arch/sh/boards/renesas/r7780rp/setup.c
  *
  * Copyright (C) 2002 Atom Create Engineering Co., Ltd.
- * Copyright (C) 2005, 2006 Paul Mundt
+ * Copyright (C) 2005 - 2007 Paul Mundt
  *
  * Renesas Solutions Highlander R7780RP-1 Support.
  *
  */
 #include <linux/init.h>
 #include <linux/platform_device.h>
+#include <linux/pata_platform.h>
 #include <asm/machvec.h>
 #include <asm/r7780rp.h>
 #include <asm/clock.h>
 #include <asm/io.h>
 
-extern void heartbeat_r7780rp(void);
 extern void init_r7780rp_IRQ(void);
 
 static struct resource m66596_usb_host_resources[] = {
@@ -46,14 +46,14 @@ static struct platform_device m66596_usb_host_device = {
 
 static struct resource cf_ide_resources[] = {
        [0] = {
-               .start  = 0x1f0,
-               .end    = 0x1f0 + 8,
-               .flags  = IORESOURCE_IO,
+               .start  = PA_AREA5_IO + 0x1000,
+               .end    = PA_AREA5_IO + 0x1000 + 0x08 - 1,
+               .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = 0x1f0 + 0x206,
-               .end    = 0x1f0 + 8 + 0x206 + 8,
-               .flags  = IORESOURCE_IO,
+               .start  = PA_AREA5_IO + 0x80c,
+               .end    = PA_AREA5_IO + 0x80c + 0x16 - 1,
+               .flags  = IORESOURCE_MEM,
        },
        [2] = {
 #ifdef CONFIG_SH_R7780MP
@@ -65,16 +65,44 @@ static struct resource cf_ide_resources[] = {
        },
 };
 
+static struct pata_platform_info pata_info = {
+       .ioport_shift   = 1,
+};
+
 static struct platform_device cf_ide_device  = {
        .name           = "pata_platform",
        .id             = -1,
        .num_resources  = ARRAY_SIZE(cf_ide_resources),
        .resource       = cf_ide_resources,
+       .dev    = {
+               .platform_data  = &pata_info,
+       },
+};
+
+static unsigned char heartbeat_bit_pos[] = { 2, 1, 0, 3, 6, 5, 4, 7 };
+
+static struct resource heartbeat_resources[] = {
+       [0] = {
+               .start  = PA_OBLED,
+               .end    = PA_OBLED + ARRAY_SIZE(heartbeat_bit_pos) - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device heartbeat_device = {
+       .name           = "heartbeat",
+       .id             = -1,
+       .dev    = {
+               .platform_data  = heartbeat_bit_pos,
+       },
+       .num_resources  = ARRAY_SIZE(heartbeat_resources),
+       .resource       = heartbeat_resources,
 };
 
 static struct platform_device *r7780rp_devices[] __initdata = {
        &m66596_usb_host_device,
        &cf_ide_device,
+       &heartbeat_device,
 };
 
 static int __init r7780rp_devices_setup(void)
@@ -148,7 +176,7 @@ static void __init r7780rp_setup(char **cmdline_p)
 #ifndef CONFIG_SH_R7780MP
        ctrl_outw(0x0001, PA_SDPOW);    /* SD Power ON */
 #endif
-       ctrl_outw(ctrl_inw(PA_IVDRCTL) | 0x0100, PA_IVDRCTL);   /* Si13112 */
+       ctrl_outw(ctrl_inw(PA_IVDRCTL) | 0x01, PA_IVDRCTL);     /* Si13112 */
 
        pm_power_off = r7780rp_power_off;
 }
@@ -185,8 +213,5 @@ struct sh_machine_vector mv_r7780rp __initmv = {
 
        .mv_ioport_map          = r7780rp_ioport_map,
        .mv_init_irq            = init_r7780rp_IRQ,
-#ifdef CONFIG_HEARTBEAT
-       .mv_heartbeat           = heartbeat_r7780rp,
-#endif
 };
 ALIAS_MV(r7780rp)
index 686fc9ea5989c01e1968c739eb8d1bd091c5bb5f..0d4c75a72be0950bd2ac9daef868609a17b7e43f 100644 (file)
@@ -2,5 +2,4 @@
 # Makefile for the RTS7751R2D specific parts of the kernel
 #
 
-obj-y   := setup.o io.o irq.o
-obj-$(CONFIG_HEARTBEAT) += led.o
+obj-y   := setup.o irq.o
diff --git a/arch/sh/boards/renesas/rts7751r2d/io.c b/arch/sh/boards/renesas/rts7751r2d/io.c
deleted file mode 100644 (file)
index f2507a8..0000000
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * Copyright (C) 2001  Ian da Silva, Jeremy Siegel
- * Based largely on io_se.c.
- *
- * I/O routine for Renesas Technology sales RTS7751R2D.
- *
- * Initial version only to support LAN access; some
- * placeholder code from io_rts7751r2d.c left in with the
- * expectation of later SuperIO and PCMCIA access.
- */
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/pci.h>
-#include <linux/io.h>
-#include <asm/rts7751r2d.h>
-#include <asm/addrspace.h>
-
-/*
- * The 7751R RTS7751R2D uses the built-in PCI controller (PCIC)
- * of the 7751R processor, and has a SuperIO accessible via the PCI.
- * The board also includes a PCMCIA controller on its memory bus,
- * like the other Solution Engine boards.
- */
-
-static inline unsigned long port2adr(unsigned int port)
-{
-       if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6)
-               if (port == 0x3f6)
-                       return (PA_AREA5_IO + 0x80c);
-               else
-                       return (PA_AREA5_IO + 0x1000 + ((port-0x1f0) << 1));
-       else
-               maybebadio((unsigned long)port);
-
-       return port;
-}
-
-static inline unsigned long port88796l(unsigned int port, int flag)
-{
-       unsigned long addr;
-
-       if (flag)
-               addr = PA_AX88796L + ((port - AX88796L_IO_BASE) << 1);
-       else
-               addr = PA_AX88796L + ((port - AX88796L_IO_BASE) << 1) + 0x1000;
-
-       return addr;
-}
-
-/* The 7751R RTS7751R2D seems to have everything hooked */
-/* up pretty normally (nothing on high-bytes only...) so this */
-/* shouldn't be needed */
-static inline int shifted_port(unsigned long port)
-{
-       /* For IDE registers, value is not shifted */
-       if ((0x1f0 <= port && port < 0x1f8) || port == 0x3f6)
-               return 0;
-       else
-               return 1;
-}
-
-#if defined(CONFIG_NE2000) || defined(CONFIG_NE2000_MODULE)
-#define CHECK_AX88796L_PORT(port) \
-  ((port >= AX88796L_IO_BASE) && (port < (AX88796L_IO_BASE+0x20)))
-#else
-#define CHECK_AX88796L_PORT(port) (0)
-#endif
-
-/*
- * General outline: remap really low stuff [eventually] to SuperIO,
- * stuff in PCI IO space (at or above window at pci.h:PCIBIOS_MIN_IO)
- * is mapped through the PCI IO window.  Stuff with high bits (PXSEG)
- * should be way beyond the window, and is used  w/o translation for
- * compatibility.
- */
-unsigned char rts7751r2d_inb(unsigned long port)
-{
-       if (CHECK_AX88796L_PORT(port))
-               return (*(volatile unsigned short *)port88796l(port, 0)) & 0xff;
-       else if (PXSEG(port))
-               return *(volatile unsigned char *)port;
-       else if (is_pci_ioaddr(port) || shifted_port(port))
-               return *(volatile unsigned char *)pci_ioaddr(port);
-       else
-               return (*(volatile unsigned short *)port2adr(port) & 0xff);
-}
-
-unsigned char rts7751r2d_inb_p(unsigned long port)
-{
-       unsigned char v;
-
-       if (CHECK_AX88796L_PORT(port))
-               v = (*(volatile unsigned short *)port88796l(port, 0)) & 0xff;
-        else if (PXSEG(port))
-               v = *(volatile unsigned char *)port;
-       else if (is_pci_ioaddr(port) || shifted_port(port))
-               v = *(volatile unsigned char *)pci_ioaddr(port);
-       else
-               v = (*(volatile unsigned short *)port2adr(port) & 0xff);
-
-       ctrl_delay();
-
-       return v;
-}
-
-unsigned short rts7751r2d_inw(unsigned long port)
-{
-       if (CHECK_AX88796L_PORT(port))
-               maybebadio(port);
-        else if (PXSEG(port))
-               return *(volatile unsigned short *)port;
-       else if (is_pci_ioaddr(port) || shifted_port(port))
-               return *(volatile unsigned short *)pci_ioaddr(port);
-       else
-               maybebadio(port);
-
-       return 0;
-}
-
-unsigned int rts7751r2d_inl(unsigned long port)
-{
-       if (CHECK_AX88796L_PORT(port))
-               maybebadio(port);
-        else if (PXSEG(port))
-               return *(volatile unsigned long *)port;
-       else if (is_pci_ioaddr(port) || shifted_port(port))
-               return *(volatile unsigned long *)pci_ioaddr(port);
-       else
-               maybebadio(port);
-
-       return 0;
-}
-
-void rts7751r2d_outb(unsigned char value, unsigned long port)
-{
-       if (CHECK_AX88796L_PORT(port))
-               *((volatile unsigned short *)port88796l(port, 0)) = value;
-        else if (PXSEG(port))
-               *(volatile unsigned char *)port = value;
-       else if (is_pci_ioaddr(port) || shifted_port(port))
-               *(volatile unsigned char *)pci_ioaddr(port) = value;
-       else
-               *(volatile unsigned short *)port2adr(port) = value;
-}
-
-void rts7751r2d_outb_p(unsigned char value, unsigned long port)
-{
-       if (CHECK_AX88796L_PORT(port))
-               *((volatile unsigned short *)port88796l(port, 0)) = value;
-        else if (PXSEG(port))
-               *(volatile unsigned char *)port = value;
-       else if (is_pci_ioaddr(port) || shifted_port(port))
-               *(volatile unsigned char *)pci_ioaddr(port) = value;
-       else
-               *(volatile unsigned short *)port2adr(port) = value;
-
-       ctrl_delay();
-}
-
-void rts7751r2d_outw(unsigned short value, unsigned long port)
-{
-       if (CHECK_AX88796L_PORT(port))
-               maybebadio(port);
-        else if (PXSEG(port))
-               *(volatile unsigned short *)port = value;
-       else if (is_pci_ioaddr(port) || shifted_port(port))
-               *(volatile unsigned short *)pci_ioaddr(port) = value;
-       else
-               maybebadio(port);
-}
-
-void rts7751r2d_outl(unsigned int value, unsigned long port)
-{
-       if (CHECK_AX88796L_PORT(port))
-               maybebadio(port);
-        else if (PXSEG(port))
-               *(volatile unsigned long *)port = value;
-       else if (is_pci_ioaddr(port) || shifted_port(port))
-               *(volatile unsigned long *)pci_ioaddr(port) = value;
-       else
-               maybebadio(port);
-}
-
-void rts7751r2d_insb(unsigned long port, void *addr, unsigned long count)
-{
-       unsigned long a = (unsigned long)addr;
-       volatile __u8 *bp;
-       volatile __u16 *p;
-
-       if (CHECK_AX88796L_PORT(port)) {
-               p = (volatile unsigned short *)port88796l(port, 0);
-               while (count--)
-                       ctrl_outb(*p & 0xff, a++);
-       } else if (PXSEG(port))
-               while (count--)
-                       ctrl_outb(ctrl_inb(port), a++);
-       else if (is_pci_ioaddr(port) || shifted_port(port)) {
-               bp = (__u8 *)pci_ioaddr(port);
-               while (count--)
-                       ctrl_outb(*bp, a++);
-       } else {
-               p = (volatile unsigned short *)port2adr(port);
-               while (count--)
-                       ctrl_outb(*p & 0xff, a++);
-       }
-}
-
-void rts7751r2d_insw(unsigned long port, void *addr, unsigned long count)
-{
-       unsigned long a = (unsigned long)addr;
-       volatile __u16 *p;
-
-       if (CHECK_AX88796L_PORT(port))
-               p = (volatile unsigned short *)port88796l(port, 1);
-       else if (PXSEG(port))
-               p = (volatile unsigned short *)port;
-       else if (is_pci_ioaddr(port) || shifted_port(port))
-               p = (volatile unsigned short *)pci_ioaddr(port);
-       else
-               p = (volatile unsigned short *)port2adr(port);
-       while (count--)
-               ctrl_outw(*p, a++);
-}
-
-void rts7751r2d_insl(unsigned long port, void *addr, unsigned long count)
-{
-       if (CHECK_AX88796L_PORT(port))
-               maybebadio(port);
-       else if (is_pci_ioaddr(port) || shifted_port(port)) {
-               unsigned long a = (unsigned long)addr;
-
-               while (count--) {
-                       ctrl_outl(ctrl_inl(pci_ioaddr(port)), a);
-                       a += 4;
-               }
-       } else
-               maybebadio(port);
-}
-
-void rts7751r2d_outsb(unsigned long port, const void *addr, unsigned long count)
-{
-       unsigned long a = (unsigned long)addr;
-       volatile __u8 *bp;
-       volatile __u16 *p;
-
-       if (CHECK_AX88796L_PORT(port)) {
-               p = (volatile unsigned short *)port88796l(port, 0);
-               while (count--)
-                       *p = ctrl_inb(a++);
-       } else if (PXSEG(port))
-               while (count--)
-                       ctrl_outb(a++, port);
-       else if (is_pci_ioaddr(port) || shifted_port(port)) {
-               bp = (__u8 *)pci_ioaddr(port);
-               while (count--)
-                       *bp = ctrl_inb(a++);
-       } else {
-               p = (volatile unsigned short *)port2adr(port);
-               while (count--)
-                       *p = ctrl_inb(a++);
-       }
-}
-
-void rts7751r2d_outsw(unsigned long port, const void *addr, unsigned long count)
-{
-       unsigned long a = (unsigned long)addr;
-       volatile __u16 *p;
-
-       if (CHECK_AX88796L_PORT(port))
-               p = (volatile unsigned short *)port88796l(port, 1);
-       else if (PXSEG(port))
-               p = (volatile unsigned short *)port;
-       else if (is_pci_ioaddr(port) || shifted_port(port))
-               p = (volatile unsigned short *)pci_ioaddr(port);
-       else
-               p = (volatile unsigned short *)port2adr(port);
-
-       while (count--) {
-               ctrl_outw(*p, a);
-               a += 2;
-       }
-}
-
-void rts7751r2d_outsl(unsigned long port, const void *addr, unsigned long count)
-{
-       if (CHECK_AX88796L_PORT(port))
-               maybebadio(port);
-       else if (is_pci_ioaddr(port) || shifted_port(port)) {
-               unsigned long a = (unsigned long)addr;
-
-               while (count--) {
-                       ctrl_outl(ctrl_inl(a), pci_ioaddr(port));
-                       a += 4;
-               }
-       } else
-               maybebadio(port);
-}
-
-unsigned long rts7751r2d_isa_port2addr(unsigned long offset)
-{
-       return port2adr(offset);
-}
index cb0eb20d1b4348fbd58a81c54a88bf7be7973399..0bae9041acebaa04e9a9dede1593096267bb2750 100644 (file)
@@ -9,7 +9,9 @@
  * Atom Create Engineering Co., Ltd. 2002.
  */
 #include <linux/init.h>
+#include <linux/interrupt.h>
 #include <linux/irq.h>
+#include <linux/interrupt.h>
 #include <linux/io.h>
 #include <asm/rts7751r2d.h>
 
@@ -22,79 +24,31 @@ static int mask_pos[] = {6, 11, 9, 8, 12, 10, 5, 4, 7, 14, 13, 0, 0, 0, 0};
 extern int voyagergx_irq_demux(int irq);
 extern void setup_voyagergx_irq(void);
 
-static void enable_rts7751r2d_irq(unsigned int irq);
-static void disable_rts7751r2d_irq(unsigned int irq);
-
-/* shutdown is same as "disable" */
-#define shutdown_rts7751r2d_irq disable_rts7751r2d_irq
-
-static void ack_rts7751r2d_irq(unsigned int irq);
-static void end_rts7751r2d_irq(unsigned int irq);
-
-static unsigned int startup_rts7751r2d_irq(unsigned int irq)
+static void enable_rts7751r2d_irq(unsigned int irq)
 {
-       enable_rts7751r2d_irq(irq);
-       return 0; /* never anything pending */
+       /* Set priority in IPR back to original value */
+       ctrl_outw(ctrl_inw(IRLCNTR1) | (1 << mask_pos[irq]), IRLCNTR1);
 }
 
 static void disable_rts7751r2d_irq(unsigned int irq)
 {
-       unsigned short val;
-       unsigned short mask = 0xffff ^ (0x0001 << mask_pos[irq]);
-
        /* Set the priority in IPR to 0 */
-       val = ctrl_inw(IRLCNTR1);
-       val &= mask;
-       ctrl_outw(val, IRLCNTR1);
-}
-
-static void enable_rts7751r2d_irq(unsigned int irq)
-{
-       unsigned short val;
-       unsigned short value = (0x0001 << mask_pos[irq]);
-
-       /* Set priority in IPR back to original value */
-       val = ctrl_inw(IRLCNTR1);
-       val |= value;
-       ctrl_outw(val, IRLCNTR1);
+       ctrl_outw(ctrl_inw(IRLCNTR1) & (0xffff ^ (1 << mask_pos[irq])),
+                 IRLCNTR1);
 }
 
 int rts7751r2d_irq_demux(int irq)
 {
-       int demux_irq;
-
-       demux_irq = voyagergx_irq_demux(irq);
-       return demux_irq;
-}
-
-static void ack_rts7751r2d_irq(unsigned int irq)
-{
-       disable_rts7751r2d_irq(irq);
+       return voyagergx_irq_demux(irq);
 }
 
-static void end_rts7751r2d_irq(unsigned int irq)
-{
-       if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
-               enable_rts7751r2d_irq(irq);
-}
-
-static struct hw_interrupt_type rts7751r2d_irq_type = {
-       .typename = "RTS7751R2D IRQ",
-       .startup = startup_rts7751r2d_irq,
-       .shutdown = shutdown_rts7751r2d_irq,
-       .enable = enable_rts7751r2d_irq,
-       .disable = disable_rts7751r2d_irq,
-       .ack = ack_rts7751r2d_irq,
-       .end = end_rts7751r2d_irq,
+static struct irq_chip rts7751r2d_irq_chip __read_mostly = {
+       .name           = "rts7751r2d",
+       .mask           = disable_rts7751r2d_irq,
+       .unmask         = enable_rts7751r2d_irq,
+       .mask_ack       = disable_rts7751r2d_irq,
 };
 
-static void make_rts7751r2d_irq(unsigned int irq)
-{
-       disable_irq_nosync(irq);
-       irq_desc[irq].chip = &rts7751r2d_irq_type;
-       disable_rts7751r2d_irq(irq);
-}
-
 /*
  * Initialize IRQ setting
  */
@@ -119,8 +73,12 @@ void __init init_rts7751r2d_IRQ(void)
         * IRL14=Extention #3
         */
 
-       for (i=0; i<15; i++)
-               make_rts7751r2d_irq(i);
+       for (i=0; i<15; i++) {
+               disable_irq_nosync(i);
+               set_irq_chip_and_handler_name(i, &rts7751r2d_irq_chip,
+                                             handle_level_irq, "level");
+               enable_rts7751r2d_irq(i);
+       }
 
        setup_voyagergx_irq();
 }
diff --git a/arch/sh/boards/renesas/rts7751r2d/led.c b/arch/sh/boards/renesas/rts7751r2d/led.c
deleted file mode 100644 (file)
index 509f548..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * linux/arch/sh/boards/renesas/rts7751r2d/led.c
- *
- * Copyright (C) Atom Create Engineering Co., Ltd.
- *
- * May be copied or modified under the terms of GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * This file contains Renesas Technology Sales RTS7751R2D specific LED code.
- */
-#include <linux/io.h>
-#include <linux/sched.h>
-#include <asm/rts7751r2d.h>
-
-/* Cycle the LED's in the clasic Knightriger/Sun pattern */
-void heartbeat_rts7751r2d(void)
-{
-       static unsigned int cnt = 0, period = 0;
-       volatile unsigned short *p = (volatile unsigned short *)PA_OUTPORT;
-       static unsigned bit = 0, up = 1;
-
-       cnt += 1;
-       if (cnt < period)
-               return;
-
-       cnt = 0;
-
-       /* Go through the points (roughly!):
-        * f(0)=10, f(1)=16, f(2)=20, f(5)=35, f(int)->110
-        */
-       period = 110 - ((300 << FSHIFT)/((avenrun[0]/5) + (3<<FSHIFT)));
-
-       *p = 1 << bit;
-       if (up)
-               if (bit == 7) {
-                       bit--;
-                       up = 0;
-               } else
-                       bit++;
-       else if (bit == 0)
-               up = 1;
-       else
-               bit--;
-}
index 5c042d35ec91768d5255d2cba2ddf8c48f59fcb8..44b42082a0afe721a7f9776e80c327652734c15f 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Renesas Technology Sales RTS7751R2D Support.
  *
- * Copyright (C) 2002 Atom Create Engineering Co., Ltd.
- * Copyright (C) 2004 - 2006 Paul Mundt
+ * Copyright (C) 2002 - 2006 Atom Create Engineering Co., Ltd.
+ * Copyright (C) 2004 - 2007 Paul Mundt
  *
  * 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
  */
 #include <linux/init.h>
 #include <linux/platform_device.h>
+#include <linux/pata_platform.h>
 #include <linux/serial_8250.h>
 #include <linux/pm.h>
 #include <asm/machvec.h>
-#include <asm/mach/rts7751r2d.h>
-#include <asm/io.h>
+#include <asm/rts7751r2d.h>
 #include <asm/voyagergx.h>
-
-extern void heartbeat_rts7751r2d(void);
-extern void init_rts7751r2d_IRQ(void);
-extern int rts7751r2d_irq_demux(int irq);
-
-extern void *voyagergx_consistent_alloc(struct device *, size_t, dma_addr_t *, gfp_t);
-extern int voyagergx_consistent_free(struct device *, size_t, void *, dma_addr_t);
-
-static struct plat_serial8250_port uart_platform_data[] = {
-       {
-               .membase        = (void *)VOYAGER_UART_BASE,
-               .mapbase        = VOYAGER_UART_BASE,
-               .iotype         = UPIO_MEM,
-               .irq            = VOYAGER_UART0_IRQ,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .regshift       = 2,
-               .uartclk        = (9600 * 16),
-       }, {
-               .flags          = 0,
-       },
-};
+#include <asm/io.h>
 
 static void __init voyagergx_serial_init(void)
 {
@@ -45,32 +25,96 @@ static void __init voyagergx_serial_init(void)
        /*
         * GPIO Control
         */
-       val = inl(GPIO_MUX_HIGH);
+       val = readl((void __iomem *)GPIO_MUX_HIGH);
        val |= 0x00001fe0;
-       outl(val, GPIO_MUX_HIGH);
+       writel(val, (void __iomem *)GPIO_MUX_HIGH);
 
        /*
         * Power Mode Gate
         */
-       val = inl(POWER_MODE0_GATE);
+       val = readl((void __iomem *)POWER_MODE0_GATE);
        val |= (POWER_MODE0_GATE_U0 | POWER_MODE0_GATE_U1);
-       outl(val, POWER_MODE0_GATE);
+       writel(val, (void __iomem *)POWER_MODE0_GATE);
 
-       val = inl(POWER_MODE1_GATE);
+       val = readl((void __iomem *)POWER_MODE1_GATE);
        val |= (POWER_MODE1_GATE_U0 | POWER_MODE1_GATE_U1);
-       outl(val, POWER_MODE1_GATE);
+       writel(val, (void __iomem *)POWER_MODE1_GATE);
 }
 
+static struct resource cf_ide_resources[] = {
+       [0] = {
+               .start  = PA_AREA5_IO + 0x1000,
+               .end    = PA_AREA5_IO + 0x1000 + 0x08 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = PA_AREA5_IO + 0x80c,
+               .end    = PA_AREA5_IO + 0x80c + 0x16 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [2] = {
+#ifdef CONFIG_RTS7751R2D_REV11
+               .start  = 1,
+#else
+               .start  = 2,
+#endif
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct pata_platform_info pata_info = {
+       .ioport_shift   = 1,
+};
+
+static struct platform_device cf_ide_device  = {
+       .name           = "pata_platform",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(cf_ide_resources),
+       .resource       = cf_ide_resources,
+       .dev    = {
+               .platform_data  = &pata_info,
+       },
+};
+
+static struct plat_serial8250_port uart_platform_data[] = {
+       {
+               .membase        = (void __iomem *)VOYAGER_UART_BASE,
+               .mapbase        = VOYAGER_UART_BASE,
+               .iotype         = UPIO_MEM,
+               .irq            = VOYAGER_UART0_IRQ,
+               .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
+               .regshift       = 2,
+               .uartclk        = (9600 * 16),
+       }
+};
+
 static struct platform_device uart_device = {
        .name           = "serial8250",
-       .id             = -1,
+       .id             = PLAT8250_DEV_PLATFORM,
        .dev            = {
                .platform_data  = uart_platform_data,
        },
 };
 
+static struct resource heartbeat_resources[] = {
+       [0] = {
+               .start  = PA_OUTPORT,
+               .end    = PA_OUTPORT + 8 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device heartbeat_device = {
+       .name           = "heartbeat",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(heartbeat_resources),
+       .resource       = heartbeat_resources,
+};
+
 static struct platform_device *rts7751r2d_devices[] __initdata = {
        &uart_device,
+       &heartbeat_device,
+       &cf_ide_device,
 };
 
 static int __init rts7751r2d_devices_setup(void)
@@ -78,6 +122,7 @@ static int __init rts7751r2d_devices_setup(void)
        return platform_add_devices(rts7751r2d_devices,
                                    ARRAY_SIZE(rts7751r2d_devices));
 }
+__initcall(rts7751r2d_devices_setup);
 
 static void rts7751r2d_power_off(void)
 {
@@ -89,14 +134,17 @@ static void rts7751r2d_power_off(void)
  */
 static void __init rts7751r2d_setup(char **cmdline_p)
 {
-       device_initcall(rts7751r2d_devices_setup);
+       u16 ver = ctrl_inw(PA_VERREG);
+
+       printk(KERN_INFO "Renesas Technology Sales RTS7751R2D support.\n");
+
+       printk(KERN_INFO "FPGA version:%d (revision:%d)\n",
+                                       (ver >> 4) & 0xf, ver & 0xf);
 
        ctrl_outw(0x0000, PA_OUTPORT);
        pm_power_off = rts7751r2d_power_off;
 
        voyagergx_serial_init();
-
-       printk(KERN_INFO "Renesas Technology Sales RTS7751R2D support.\n");
 }
 
 /*
@@ -107,31 +155,7 @@ struct sh_machine_vector mv_rts7751r2d __initmv = {
        .mv_setup               = rts7751r2d_setup,
        .mv_nr_irqs             = 72,
 
-       .mv_inb                 = rts7751r2d_inb,
-       .mv_inw                 = rts7751r2d_inw,
-       .mv_inl                 = rts7751r2d_inl,
-       .mv_outb                = rts7751r2d_outb,
-       .mv_outw                = rts7751r2d_outw,
-       .mv_outl                = rts7751r2d_outl,
-
-       .mv_inb_p               = rts7751r2d_inb_p,
-       .mv_inw_p               = rts7751r2d_inw,
-       .mv_inl_p               = rts7751r2d_inl,
-       .mv_outb_p              = rts7751r2d_outb_p,
-       .mv_outw_p              = rts7751r2d_outw,
-       .mv_outl_p              = rts7751r2d_outl,
-
-       .mv_insb                = rts7751r2d_insb,
-       .mv_insw                = rts7751r2d_insw,
-       .mv_insl                = rts7751r2d_insl,
-       .mv_outsb               = rts7751r2d_outsb,
-       .mv_outsw               = rts7751r2d_outsw,
-       .mv_outsl               = rts7751r2d_outsl,
-
        .mv_init_irq            = init_rts7751r2d_IRQ,
-#ifdef CONFIG_HEARTBEAT
-       .mv_heartbeat           = heartbeat_rts7751r2d,
-#endif
        .mv_irq_demux           = rts7751r2d_irq_demux,
 
 #ifdef CONFIG_USB_SM501
index 63950f4f24533e54949b5bb49bec81de58af7175..63e7ed699f39b3c41d8578daa8b57ce31807c689 100644 (file)
@@ -3,5 +3,3 @@
 #
 
 obj-y   := setup.o io.o irq.o
-obj-$(CONFIG_HEARTBEAT) += led.o
-
diff --git a/arch/sh/boards/se/7206/led.c b/arch/sh/boards/se/7206/led.c
deleted file mode 100644 (file)
index ef79460..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * linux/arch/sh/kernel/led_se.c
- *
- * Copyright (C) 2000 Stuart Menefy <stuart.menefy@st.com>
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * This file contains Solution Engine specific LED code.
- */
-
-#include <linux/config.h>
-#include <asm/se7206.h>
-
-#ifdef CONFIG_HEARTBEAT
-
-#include <linux/sched.h>
-
-/* Cycle the LED's in the clasic Knightrider/Sun pattern */
-void heartbeat_se(void)
-{
-       static unsigned int cnt = 0, period = 0;
-       volatile unsigned short* p = (volatile unsigned short*)PA_LED;
-       static unsigned bit = 0, up = 1;
-
-       cnt += 1;
-       if (cnt < period) {
-               return;
-       }
-
-       cnt = 0;
-
-       /* Go through the points (roughly!):
-        * f(0)=10, f(1)=16, f(2)=20, f(5)=35,f(inf)->110
-        */
-       period = 110 - ( (300<<FSHIFT)/
-                        ((avenrun[0]/5) + (3<<FSHIFT)) );
-
-       if (up) {
-               if (bit == 7) {
-                       bit--;
-                       up=0;
-               } else {
-                       bit ++;
-               }
-       } else {
-               if (bit == 0) {
-                       bit++;
-                       up=1;
-               } else {
-                       bit--;
-               }
-       }
-       *p = 1<<(bit+8);
-
-}
-#endif /* CONFIG_HEARTBEAT */
index 0f42e91a3238b20bdd25026bdc3dff0155b54f6c..ca714879f55972bba43862ba70073702c9612d22 100644 (file)
@@ -3,6 +3,7 @@
  * linux/arch/sh/boards/se/7206/setup.c
  *
  * Copyright (C) 2006  Yoshinori Sato
+ * Copyright (C) 2007  Paul Mundt
  *
  * Hitachi 7206 SolutionEngine Support.
  *
@@ -34,15 +35,37 @@ static struct platform_device smc91x_device = {
        .resource       = smc91x_resources,
 };
 
+static unsigned char heartbeat_bit_pos[] = { 8, 9, 10, 11, 12, 13, 14, 15 };
+
+static struct resource heartbeat_resources[] = {
+       [0] = {
+               .start  = PA_LED,
+               .end    = PA_LED + ARRAY_SIZE(heartbeat_bit_pos) - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device heartbeat_device = {
+       .name           = "heartbeat",
+       .id             = -1,
+       .dev    = {
+               .platform_data  = heartbeat_bit_pos,
+       },
+       .num_resources  = ARRAY_SIZE(heartbeat_resources),
+       .resource       = heartbeat_resources,
+};
+
+static struct platform_device *se7206_devices[] __initdata = {
+       &smc91x_device,
+       &heartbeat_device,
+};
+
 static int __init se7206_devices_setup(void)
 {
-       return platform_device_register(&smc91x_device);
+       return platform_add_devices(se7206_devices, ARRAY_SIZE(se7206_devices));
 }
-
 __initcall(se7206_devices_setup);
 
-void heartbeat_se(void);
-
 /*
  * The Machine Vector
  */
@@ -72,8 +95,5 @@ struct sh_machine_vector mv_se __initmv = {
        .mv_outsl               = se7206_outsl,
 
        .mv_init_irq            = init_se7206_IRQ,
-#ifdef CONFIG_HEARTBEAT
-       .mv_heartbeat           = heartbeat_se,
-#endif
 };
 ALIAS_MV(se)
index 0fbd4f47815cdb1bc8defab1433b204f26912671..46247368f14be7d19c9e2ced2d90e154a134cef6 100644 (file)
@@ -3,5 +3,3 @@
 #
 
 obj-y   := setup.o io.o irq.o
-
-obj-$(CONFIG_HEARTBEAT) += led.o
diff --git a/arch/sh/boards/se/7300/led.c b/arch/sh/boards/se/7300/led.c
deleted file mode 100644 (file)
index 4d03bb7..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * linux/arch/sh/boards/se/7300/led.c
- *
- * Derived from linux/arch/sh/boards/se/770x/led.c
- *
- * Copyright (C) 2000 Stuart Menefy <stuart.menefy@st.com>
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * This file contains Solution Engine specific LED code.
- */
-
-#include <linux/sched.h>
-#include <asm/se7300.h>
-
-/* Cycle the LED's in the clasic Knightrider/Sun pattern */
-void heartbeat_7300se(void)
-{
-       static unsigned int cnt = 0, period = 0;
-       volatile unsigned short *p = (volatile unsigned short *) PA_LED;
-       static unsigned bit = 0, up = 1;
-
-       cnt += 1;
-       if (cnt < period) {
-               return;
-       }
-
-       cnt = 0;
-
-       /* Go through the points (roughly!):
-        * f(0)=10, f(1)=16, f(2)=20, f(5)=35,f(inf)->110
-        */
-       period = 110 - ((300 << FSHIFT) / ((avenrun[0] / 5) + (3 << FSHIFT)));
-
-       if (up) {
-               if (bit == 7) {
-                       bit--;
-                       up = 0;
-               } else {
-                       bit++;
-               }
-       } else {
-               if (bit == 0) {
-                       bit++;
-                       up = 1;
-               } else {
-                       bit--;
-               }
-       }
-       *p = 1 << (bit + 8);
-
-}
-
index 6f082a722d42842f5502ff9b0a7497f3f35fd659..f1960956bad051f282ec74638432415eb985781a 100644 (file)
@@ -6,14 +6,43 @@
  * SH-Mobile SolutionEngine 7300 Support.
  *
  */
-
 #include <linux/init.h>
+#include <linux/platform_device.h>
 #include <asm/machvec.h>
 #include <asm/se7300.h>
 
-void heartbeat_7300se(void);
 void init_7300se_IRQ(void);
 
+static unsigned char heartbeat_bit_pos[] = { 8, 9, 10, 11, 12, 13, 14, 15 };
+
+static struct resource heartbeat_resources[] = {
+       [0] = {
+               .start  = PA_LED,
+               .end    = PA_LED + ARRAY_SIZE(heartbeat_bit_pos) - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device heartbeat_device = {
+       .name           = "heartbeat",
+       .id             = -1,
+       .dev    = {
+               .platform_data  = heartbeat_bit_pos,
+       },
+       .num_resources  = ARRAY_SIZE(heartbeat_resources),
+       .resource       = heartbeat_resources,
+};
+
+static struct platform_device *se7300_devices[] __initdata = {
+       &heartbeat_device,
+};
+
+static int __init se7300_devices_setup(void)
+{
+       return platform_add_devices(se7300_devices, ARRAY_SIZE(se7300_devices));
+}
+__initcall(se7300_devices_setup);
+
 /*
  * The Machine Vector
  */
@@ -42,8 +71,5 @@ struct sh_machine_vector mv_7300se __initmv = {
        .mv_outsl = sh7300se_outsl,
 
        .mv_init_irq = init_7300se_IRQ,
-#ifdef CONFIG_HEARTBEAT
-       .mv_heartbeat = heartbeat_7300se,
-#endif
 };
 ALIAS_MV(7300se)
index 8f63886a0f3f12f2322fe50106d9af079dbd76b6..e7c09967c529e424cd6b45f8597b097bcb8a2835 100644 (file)
@@ -3,5 +3,3 @@
 #
 
 obj-y   := setup.o io.o irq.o
-
-obj-$(CONFIG_HEARTBEAT) += led.o
diff --git a/arch/sh/boards/se/73180/led.c b/arch/sh/boards/se/73180/led.c
deleted file mode 100644 (file)
index 4b72e9a..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * arch/sh/boards/se/73180/led.c
- *
- * Derived from arch/sh/boards/se/770x/led.c
- *
- * Copyright (C) 2000 Stuart Menefy <stuart.menefy@st.com>
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * This file contains Solution Engine specific LED code.
- */
-
-#include <linux/sched.h>
-#include <asm/mach/se73180.h>
-
-/* Cycle the LED's in the clasic Knightrider/Sun pattern */
-void heartbeat_73180se(void)
-{
-       static unsigned int cnt = 0, period = 0;
-       volatile unsigned short *p = (volatile unsigned short *) PA_LED;
-       static unsigned bit = 0, up = 1;
-
-       cnt += 1;
-       if (cnt < period) {
-               return;
-       }
-
-       cnt = 0;
-
-       /* Go through the points (roughly!):
-        * f(0)=10, f(1)=16, f(2)=20, f(5)=35,f(inf)->110
-        */
-       period = 110 - ((300 << FSHIFT) / ((avenrun[0] / 5) + (3 << FSHIFT)));
-
-       if (up) {
-               if (bit == 7) {
-                       bit--;
-                       up = 0;
-               } else {
-                       bit++;
-               }
-       } else {
-               if (bit == 0) {
-                       bit++;
-                       up = 1;
-               } else {
-                       bit--;
-               }
-       }
-       *p = 1 << (bit + LED_SHIFT);
-
-}
index b38ef50a160a2114b4c7a290d420797de3871e12..911ce1cdbd7f86865bb903ac054b359f0f6be82b 100644 (file)
  */
 
 #include <linux/init.h>
+#include <linux/platform_device.h>
 #include <asm/machvec.h>
 #include <asm/se73180.h>
 #include <asm/irq.h>
 
-void heartbeat_73180se(void);
 void init_73180se_IRQ(void);
 
+static struct resource heartbeat_resources[] = {
+       [0] = {
+               .start  = PA_LED,
+               .end    = PA_LED + 8 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device heartbeat_device = {
+       .name           = "heartbeat",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(heartbeat_resources),
+       .resource       = heartbeat_resources,
+};
+
+static struct platform_device *se73180_devices[] __initdata = {
+       &heartbeat_device,
+};
+
+static int __init se73180_devices_setup(void)
+{
+       return platform_add_devices(sh7343se_platform_devices,
+                                   ARRAY_SIZE(sh7343se_platform_devices));
+}
+__initcall(se73180_devices_setup);
+
 /*
  * The Machine Vector
  */
@@ -46,8 +72,5 @@ struct sh_machine_vector mv_73180se __initmv = {
 
        .mv_init_irq = init_73180se_IRQ,
        .mv_irq_demux = shmse_irq_demux,
-#ifdef CONFIG_HEARTBEAT
-       .mv_heartbeat = heartbeat_73180se,
-#endif
 };
 ALIAS_MV(73180se)
index 4291069c0b4f79e3304cb69cb4212b9c45c51228..3024796c6203b61771592cd6de0c701d4d367c41 100644 (file)
@@ -3,5 +3,3 @@
 #
 
 obj-y   := setup.o io.o irq.o
-
-obj-$(CONFIG_HEARTBEAT) += led.o
diff --git a/arch/sh/boards/se/7343/led.c b/arch/sh/boards/se/7343/led.c
deleted file mode 100644 (file)
index 6b39e19..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * arch/sh/boards/se/7343/led.c
- *
- */
-#include <linux/sched.h>
-#include <asm/mach/se7343.h>
-
-/* Cycle the LED's in the clasic Knightrider/Sun pattern */
-void heartbeat_7343se(void)
-{
-       static unsigned int cnt = 0, period = 0;
-       volatile unsigned short *p = (volatile unsigned short *) PA_LED;
-       static unsigned bit = 0, up = 1;
-
-       cnt += 1;
-       if (cnt < period) {
-               return;
-       }
-
-       cnt = 0;
-
-       /* Go through the points (roughly!):
-        * f(0)=10, f(1)=16, f(2)=20, f(5)=35,f(inf)->110
-        */
-       period = 110 - ((300 << FSHIFT) / ((avenrun[0] / 5) + (3 << FSHIFT)));
-
-       if (up) {
-               if (bit == 7) {
-                       bit--;
-                       up = 0;
-               } else {
-                       bit++;
-               }
-       } else {
-               if (bit == 0) {
-                       bit++;
-                       up = 1;
-               } else {
-                       bit--;
-               }
-       }
-       *p = 1 << (bit + LED_SHIFT);
-
-}
index c7d17fe7764ed2cbabd145726ea31b75912df125..3fdb16f2cef1dfd400677bfd7b9d623706e79ef2 100644 (file)
@@ -4,7 +4,6 @@
 #include <asm/mach/se7343.h>
 #include <asm/irq.h>
 
-void heartbeat_7343se(void);
 void init_7343se_IRQ(void);
 
 static struct resource smc91x_resources[] = {
@@ -31,14 +30,30 @@ static struct platform_device smc91x_device = {
        .resource       = smc91x_resources,
 };
 
-static struct platform_device *smc91x_platform_devices[] __initdata = {
+static struct resource heartbeat_resources[] = {
+       [0] = {
+               .start  = PA_LED,
+               .end    = PA_LED + 8 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device heartbeat_device = {
+       .name           = "heartbeat",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(heartbeat_resources),
+       .resource       = heartbeat_resources,
+};
+
+static struct platform_device *sh7343se_platform_devices[] __initdata = {
        &smc91x_device,
+       &heartbeat_device,
 };
 
 static int __init sh7343se_devices_setup(void)
 {
-       return platform_add_devices(smc91x_platform_devices,
-                                   ARRAY_SIZE(smc91x_platform_devices));
+       return platform_add_devices(sh7343se_platform_devices,
+                                   ARRAY_SIZE(sh7343se_platform_devices));
 }
 
 static void __init sh7343se_setup(char **cmdline_p)
@@ -76,8 +91,5 @@ struct sh_machine_vector mv_7343se __initmv = {
 
        .mv_init_irq = init_7343se_IRQ,
        .mv_irq_demux = shmse_irq_demux,
-#ifdef CONFIG_HEARTBEAT
-       .mv_heartbeat = heartbeat_7343se,
-#endif
 };
 ALIAS_MV(7343se)
index 9a5035f80ec03987aadf37f3e72623a76c6ed179..8e624b06d5ea67efc746ecab0716485d9a4742bc 100644 (file)
@@ -3,4 +3,3 @@
 #
 
 obj-y   := setup.o io.o irq.o
-obj-$(CONFIG_HEARTBEAT) += led.o
index fcd7cd7fa05f1d8f623f8981a616078edcda8ae9..307ca5da6232c54b53821ff86bdddcc2944aab2a 100644 (file)
@@ -2,56 +2,96 @@
  * linux/arch/sh/boards/se/770x/irq.c
  *
  * Copyright (C) 2000  Kazumoto Kojima
+ * Copyright (C) 2006  Nobuhiro Iwamatsu
  *
  * Hitachi SolutionEngine Support.
  *
  */
 
 #include <linux/init.h>
+#include <linux/interrupt.h>
 #include <linux/irq.h>
 #include <asm/irq.h>
 #include <asm/io.h>
 #include <asm/se.h>
 
+/* 
+ * If the problem of make_ipr_irq is solved, 
+ * this code will become unnecessary. :-) 
+ */
+static void se770x_disable_ipr_irq(unsigned int irq)
+{
+       struct ipr_data *p = get_irq_chip_data(irq);
+
+       ctrl_outw(ctrl_inw(p->addr) & (0xffff ^ (0xf << p->shift)), p->addr);
+}
+
+static void se770x_enable_ipr_irq(unsigned int irq)
+{
+       struct ipr_data *p = get_irq_chip_data(irq);
+
+       ctrl_outw(ctrl_inw(p->addr) | (p->priority << p->shift), p->addr);
+}
+
+static struct irq_chip se770x_irq_chip = {
+       .name           = "MS770xSE-FPGA",
+       .mask           = se770x_disable_ipr_irq,
+       .unmask         = se770x_enable_ipr_irq,
+       .mask_ack       = se770x_disable_ipr_irq,
+};
+
+void make_se770x_irq(struct ipr_data *table, unsigned int nr_irqs)
+{
+       int i;
+
+       for (i = 0; i < nr_irqs; i++) {
+               unsigned int irq = table[i].irq;
+               disable_irq_nosync(irq);
+               set_irq_chip_and_handler_name(irq, &se770x_irq_chip,
+                       handle_level_irq, "level");
+               set_irq_chip_data(irq, &table[i]);
+               se770x_enable_ipr_irq(irq);
+       }
+}
+
 static struct ipr_data se770x_ipr_map[] = {
 #if defined(CONFIG_CPU_SUBTYPE_SH7705)
        /* This is default value */
-       { 0xf-0x2, BCR_ILCRA, 2, 0x2 },
-       { 0xf-0xa, BCR_ILCRA, 1, 0xa },
-       { 0xf-0x5, BCR_ILCRB, 0, 0x5 },
-       { 0xf-0x8, BCR_ILCRC, 1, 0x8 },
-       { 0xf-0xc, BCR_ILCRC, 0, 0xc },
-       { 0xf-0xe, BCR_ILCRD, 3, 0xe },
-       { 0xf-0x3, BCR_ILCRD, 1, 0x3 }, /* LAN */
-       { 0xf-0xd, BCR_ILCRE, 2, 0xd },
-       { 0xf-0x9, BCR_ILCRE, 1, 0x9 },
-       { 0xf-0x1, BCR_ILCRE, 0, 0x1 },
-       { 0xf-0xf, BCR_ILCRF, 3, 0xf },
-       { 0xf-0xb, BCR_ILCRF, 1, 0xb },
-       { 0xf-0x7, BCR_ILCRG, 3, 0x7 },
-       { 0xf-0x6, BCR_ILCRG, 2, 0x6 },
-       { 0xf-0x4, BCR_ILCRG, 1, 0x4 },
+       { 0xf-0x2, 0, 8,  0x2 , BCR_ILCRA},
+       { 0xf-0xa, 0, 4,  0xa , BCR_ILCRA},
+       { 0xf-0x5, 0, 0,  0x5 , BCR_ILCRB},
+       { 0xf-0x8, 0, 4,  0x8 , BCR_ILCRC},
+       { 0xf-0xc, 0, 0,  0xc , BCR_ILCRC},
+       { 0xf-0xe, 0, 12, 0xe , BCR_ILCRD},
+       { 0xf-0x3, 0, 4,  0x3 , BCR_ILCRD}, /* LAN */
+       { 0xf-0xd, 0, 8,  0xd , BCR_ILCRE},
+       { 0xf-0x9, 0, 4,  0x9 , BCR_ILCRE},
+       { 0xf-0x1, 0, 0,  0x1 , BCR_ILCRE},
+       { 0xf-0xf, 0, 12, 0xf , BCR_ILCRF},
+       { 0xf-0xb, 0, 4,  0xb , BCR_ILCRF},
+       { 0xf-0x7, 0, 12, 0x7 , BCR_ILCRG},
+       { 0xf-0x6, 0, 8,  0x6 , BCR_ILCRG},
+       { 0xf-0x4, 0, 4,  0x4 , BCR_ILCRG},
 #else
-       { 14, BCR_ILCRA, 2, 0x0f-14 },
-       { 12, BCR_ILCRA, 1, 0x0f-12 },
-       {  8, BCR_ILCRB, 1, 0x0f- 8 },
-       {  6, BCR_ILCRC, 3, 0x0f- 6 },
-       {  5, BCR_ILCRC, 2, 0x0f- 5 },
-       {  4, BCR_ILCRC, 1, 0x0f- 4 },
-       {  3, BCR_ILCRC, 0, 0x0f- 3 },
-       {  1, BCR_ILCRD, 3, 0x0f- 1 },
-
-       { 10, BCR_ILCRD, 1, 0x0f-10 }, /* LAN */
-
-       {  0, BCR_ILCRE, 3, 0x0f- 0 }, /* PCIRQ3 */
-       { 11, BCR_ILCRE, 2, 0x0f-11 }, /* PCIRQ2 */
-       {  9, BCR_ILCRE, 1, 0x0f- 9 }, /* PCIRQ1 */
-       {  7, BCR_ILCRE, 0, 0x0f- 7 }, /* PCIRQ0 */
-
+       { 14, 0,  8, 0x0f-14 ,BCR_ILCRA},
+       { 12, 0,  4, 0x0f-12 ,BCR_ILCRA},
+       {  8, 0,  4, 0x0f- 8 ,BCR_ILCRB},
+       {  6, 0, 12, 0x0f- 6 ,BCR_ILCRC},
+       {  5, 0,  8, 0x0f- 5 ,BCR_ILCRC},
+       {  4, 0,  4, 0x0f- 4 ,BCR_ILCRC},
+       {  3, 0,  0, 0x0f- 3 ,BCR_ILCRC},
+       {  1, 0, 12, 0x0f- 1 ,BCR_ILCRD},
+       /* ST NIC */
+       { 10, 0,  4, 0x0f-10 ,BCR_ILCRD},       /* LAN */
+       /* MRSHPC IRQs setting */
+       {  0, 0, 12, 0x0f- 0 ,BCR_ILCRE},       /* PCIRQ3 */
+       { 11, 0,  8, 0x0f-11 ,BCR_ILCRE},       /* PCIRQ2 */
+       {  9, 0,  4, 0x0f- 9 ,BCR_ILCRE},       /* PCIRQ1 */
+       {  7, 0,  0, 0x0f- 7 ,BCR_ILCRE},       /* PCIRQ0 */
        /* #2, #13 are allocated for SLOT IRQ #1 and #2 (for now) */
        /* NOTE: #2 and #13 are not used on PC */
-       { 13, BCR_ILCRG, 1, 0x0f-13 }, /* SLOTIRQ2 */
-       {  2, BCR_ILCRG, 0, 0x0f- 2 }, /* SLOTIRQ1 */
+       { 13, 0,  4, 0x0f-13 ,BCR_ILCRG},       /* SLOTIRQ2 */
+       {  2, 0,  0, 0x0f- 2 ,BCR_ILCRG},       /* SLOTIRQ1 */
 #endif
 };
 
@@ -81,5 +121,5 @@ void __init init_se_IRQ(void)
        ctrl_outw(0, BCR_ILCRF);
        ctrl_outw(0, BCR_ILCRG);
 #endif
-       make_ipr_irq(se770x_ipr_map, ARRAY_SIZE(se770x_ipr_map));
+       make_se770x_irq(se770x_ipr_map, ARRAY_SIZE(se770x_ipr_map));
 }
diff --git a/arch/sh/boards/se/770x/led.c b/arch/sh/boards/se/770x/led.c
deleted file mode 100644 (file)
index d93dd83..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * linux/arch/sh/boards/se/770x/led.c
- *
- * Copyright (C) 2000 Stuart Menefy <stuart.menefy@st.com>
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * This file contains Solution Engine specific LED code.
- */
-
-#include <linux/sched.h>
-#include <asm/se.h>
-
-/* Cycle the LED's in the clasic Knightrider/Sun pattern */
-void heartbeat_se(void)
-{
-       static unsigned int cnt = 0, period = 0;
-       volatile unsigned short* p = (volatile unsigned short*)PA_LED;
-       static unsigned bit = 0, up = 1;
-
-       cnt += 1;
-       if (cnt < period) {
-               return;
-       }
-
-       cnt = 0;
-
-       /* Go through the points (roughly!):
-        * f(0)=10, f(1)=16, f(2)=20, f(5)=35,f(inf)->110
-        */
-       period = 110 - ( (300<<FSHIFT)/
-                        ((avenrun[0]/5) + (3<<FSHIFT)) );
-
-       if (up) {
-               if (bit == 7) {
-                       bit--;
-                       up=0;
-               } else {
-                       bit ++;
-               }
-       } else {
-               if (bit == 0) {
-                       bit++;
-                       up=1;
-               } else {
-                       bit--;
-               }
-       }
-       *p = 1<<(bit+8);
-
-}
index a1d51d5fa925cbb56512a98cf913c2d40d27312b..45cbc36b9fb70780e820cba14f05e6ec1b5164f8 100644 (file)
@@ -1,5 +1,4 @@
-/* $Id: setup.c,v 1.1.2.4 2002/03/02 21:57:07 lethal Exp $
- *
+/*
  * linux/arch/sh/boards/se/770x/setup.c
  *
  * Copyright (C) 2000  Kazumoto Kojima
@@ -8,12 +7,12 @@
  *
  */
 #include <linux/init.h>
+#include <linux/platform_device.h>
 #include <asm/machvec.h>
 #include <asm/se.h>
 #include <asm/io.h>
 #include <asm/smc37c93x.h>
 
-void heartbeat_se(void);
 void init_se_IRQ(void);
 
 /*
@@ -36,11 +35,6 @@ static void __init smsc_setup(char **cmdline_p)
        smsc_config(ACTIVATE_INDEX, 0x01);
        smsc_config(IRQ_SELECT_INDEX, 6); /* IRQ6 */
 
-       /* IDE1 */
-       smsc_config(CURRENT_LDN_INDEX, LDN_IDE1);
-       smsc_config(ACTIVATE_INDEX, 0x01);
-       smsc_config(IRQ_SELECT_INDEX, 14); /* IRQ14 */
-
        /* AUXIO (GPIO): to use IDE1 */
        smsc_config(CURRENT_LDN_INDEX, LDN_AUXIO);
        smsc_config(GPIO46_INDEX, 0x00); /* nIOROP */
@@ -69,6 +63,36 @@ static void __init smsc_setup(char **cmdline_p)
        outb_p(CONFIG_EXIT, CONFIG_PORT);
 }
 
+static unsigned char heartbeat_bit_pos[] = { 8, 9, 10, 11, 12, 13, 14, 15 };
+
+static struct resource heartbeat_resources[] = {
+       [0] = {
+               .start  = PA_LED,
+               .end    = PA_LED + ARRAY_SIZE(heartbeat_bit_pos) - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device heartbeat_device = {
+       .name           = "heartbeat",
+       .id             = -1,
+       .dev    = {
+               .platform_data  = heartbeat_bit_pos,
+       },
+       .num_resources  = ARRAY_SIZE(heartbeat_resources),
+       .resource       = heartbeat_resources,
+};
+
+static struct platform_device *se_devices[] __initdata = {
+       &heartbeat_device,
+};
+
+static int __init se_devices_setup(void)
+{
+       return platform_add_devices(se_devices, ARRAY_SIZE(se_devices));
+}
+__initcall(se_devices_setup);
+
 /*
  * The Machine Vector
  */
@@ -107,8 +131,5 @@ struct sh_machine_vector mv_se __initmv = {
        .mv_outsl               = se_outsl,
 
        .mv_init_irq            = init_se_IRQ,
-#ifdef CONFIG_HEARTBEAT
-       .mv_heartbeat           = heartbeat_se,
-#endif
 };
 ALIAS_MV(se)
index 188900c48321335bca050c9d1b8b161d9fec7c3a..dbc29f3a9de50be179088eb1f1e69f5fb9fc2cfe 100644 (file)
@@ -5,4 +5,3 @@
 obj-y   := setup.o io.o irq.o
 
 obj-$(CONFIG_PCI) += pci.o
-obj-$(CONFIG_HEARTBEAT) += led.o
diff --git a/arch/sh/boards/se/7751/led.c b/arch/sh/boards/se/7751/led.c
deleted file mode 100644 (file)
index de4194d..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * linux/arch/sh/boards/se/7751/led.c
- *
- * Copyright (C) 2000 Stuart Menefy <stuart.menefy@st.com>
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * This file contains Solution Engine specific LED code.
- */
-#include <linux/sched.h>
-#include <asm/se7751.h>
-
-/* Cycle the LED's in the clasic Knightrider/Sun pattern */
-void heartbeat_7751se(void)
-{
-       static unsigned int cnt = 0, period = 0;
-       volatile unsigned short* p = (volatile unsigned short*)PA_LED;
-       static unsigned bit = 0, up = 1;
-
-       cnt += 1;
-       if (cnt < period) {
-               return;
-       }
-
-       cnt = 0;
-
-       /* Go through the points (roughly!):
-        * f(0)=10, f(1)=16, f(2)=20, f(5)=35,f(inf)->110
-        */
-       period = 110 - ( (300<<FSHIFT)/
-                        ((avenrun[0]/5) + (3<<FSHIFT)) );
-
-       if (up) {
-               if (bit == 7) {
-                       bit--;
-                       up=0;
-               } else {
-                       bit ++;
-               }
-       } else {
-               if (bit == 0) {
-                       bit++;
-                       up=1;
-               } else {
-                       bit--;
-               }
-       }
-       *p = 1<<(bit+8);
-
-}
index f7e1dd39c8364c30db40874a04e391144f249b17..e3feae6ec0bfe503f7ec66340f6cffe731adc89e 100644 (file)
@@ -9,11 +9,11 @@
  * Ian da Silva and Jeremy Siegel, 2001.
  */
 #include <linux/init.h>
+#include <linux/platform_device.h>
 #include <asm/machvec.h>
 #include <asm/se7751.h>
 #include <asm/io.h>
 
-void heartbeat_7751se(void);
 void init_7751se_IRQ(void);
 
 #ifdef CONFIG_SH_KGDB
@@ -161,11 +161,40 @@ static int kgdb_uart_setup(void)
 }
 #endif /* CONFIG_SH_KGDB */
 
+static unsigned char heartbeat_bit_pos[] = { 8, 9, 10, 11, 12, 13, 14, 15 };
+
+static struct resource heartbeat_resources[] = {
+       [0] = {
+               .start  = PA_LED,
+               .end    = PA_LED + ARRAY_SIZE(heartbeat_bit_pos) - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device heartbeat_device = {
+       .name           = "heartbeat",
+       .id             = -1,
+       .dev    = {
+               .platform_data  = heartbeat_bit_pos,
+       },
+       .num_resources  = ARRAY_SIZE(heartbeat_resources),
+       .resource       = heartbeat_resources,
+};
+
+static struct platform_device *se7751_devices[] __initdata = {
+       &smc91x_device,
+       &heartbeat_device,
+};
+
+static int __init se7751_devices_setup(void)
+{
+       return platform_add_devices(se7751_devices, ARRAY_SIZE(se7751_devices));
+}
+__initcall(se7751_devices_setup);
 
 /*
  * The Machine Vector
  */
-
 struct sh_machine_vector mv_7751se __initmv = {
        .mv_name                = "7751 SolutionEngine",
        .mv_setup               = sh7751se_setup,
@@ -189,8 +218,5 @@ struct sh_machine_vector mv_7751se __initmv = {
        .mv_outsl               = sh7751se_outsl,
 
        .mv_init_irq            = init_7751se_IRQ,
-#ifdef CONFIG_HEARTBEAT
-       .mv_heartbeat           = heartbeat_7751se,
-#endif
 };
 ALIAS_MV(7751se)
index 321be50e36a5aeaa23db1e44130941dbca66ea72..400306a796ec5427f9554b5a78074d1f10302495 100644 (file)
@@ -3,4 +3,3 @@
 #
 
 obj-y   := setup.o rtc.o
-obj-$(CONFIG_HEARTBEAT) += led.o
diff --git a/arch/sh/boards/sh03/led.c b/arch/sh/boards/sh03/led.c
deleted file mode 100644 (file)
index d38562a..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * linux/arch/sh/boards/sh03/led.c
- *
- * Copyright (C) 2004  Saito.K Interface Corporation.
- *
- * This file contains Interface CTP/PCI-SH03 specific LED code.
- */
-
-#include <linux/sched.h>
-
-/* Cycle the LED's in the clasic Knightrider/Sun pattern */
-void heartbeat_sh03(void)
-{
-       static unsigned int cnt = 0, period = 0;
-       volatile unsigned char* p = (volatile unsigned char*)0xa0800000;
-       static unsigned bit = 0, up = 1;
-
-       cnt += 1;
-       if (cnt < period) {
-               return;
-       }
-
-       cnt = 0;
-
-       /* Go through the points (roughly!):
-        * f(0)=10, f(1)=16, f(2)=20, f(5)=35,f(inf)->110
-        */
-       period = 110 - ( (300<<FSHIFT)/
-                        ((avenrun[0]/5) + (3<<FSHIFT)) );
-
-       if (up) {
-               if (bit == 7) {
-                       bit--;
-                       up=0;
-               } else {
-                       bit ++;
-               }
-       } else {
-               if (bit == 0) {
-                       bit++;
-                       up=1;
-               } else {
-                       bit--;
-               }
-       }
-       *p = 1<<bit;
-
-}
index 5ad1e19771be79cdcd924d0dda701a54253a8f65..c069c444b4eca13663f4f645a592e555720ac7f2 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/pci.h>
+#include <linux/platform_device.h>
 #include <asm/io.h>
 #include <asm/rtc.h>
 #include <asm/sh03/io.h>
@@ -48,15 +49,36 @@ static void __init sh03_setup(char **cmdline_p)
        board_time_init = sh03_time_init;
 }
 
+static struct resource heartbeat_resources[] = {
+       [0] = {
+               .start  = 0xa0800000,
+               .end    = 0xa0800000 + 8 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device heartbeat_device = {
+       .name           = "heartbeat",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(heartbeat_resources),
+       .resource       = heartbeat_resources,
+};
+
+static struct platform_device *sh03_devices[] __initdata = {
+       &heartbeat_device,
+};
+
+static int __init sh03_devices_setup(void)
+{
+       return platform_add_devices(sh03_devices, ARRAY_SIZE(sh03_devices));
+}
+__initcall(sh03_devices_setup);
+
 struct sh_machine_vector mv_sh03 __initmv = {
        .mv_name                = "Interface (CTP/PCI-SH03)",
        .mv_setup               = sh03_setup,
        .mv_nr_irqs             = 48,
        .mv_ioport_map          = sh03_ioport_map,
        .mv_init_irq            = init_sh03_IRQ,
-
-#ifdef CONFIG_HEARTBEAT
-       .mv_heartbeat           = heartbeat_sh03,
-#endif
 };
 ALIAS_MV(sh03)
index a31a1d1e2681f06e16dff61cf2eef069977949ab..4a9df4a6b034d2f3cfe4013d3c2e4fea4e8dc711 100644 (file)
 #include <asm/irq.h>
 #include <asm/io.h>
 
-#define PFC_PHCR       0xa400010e
+#define PFC_PHCR       0xa400010eUL
+#define INTC_ICR1      0xa4000010UL
+#define INTC_IPRC      0xa4000016UL
+
+static struct ipr_data shmin_ipr_map[] = {
+       { .irq=32, .addr=INTC_IPRC, .shift= 0, .priority=0 },
+       { .irq=33, .addr=INTC_IPRC, .shift= 4, .priority=0 },
+       { .irq=34, .addr=INTC_IPRC, .shift= 8, .priority=8 },
+       { .irq=35, .addr=INTC_IPRC, .shift=12, .priority=0 },
+};
 
 static void __init init_shmin_irq(void)
 {
        ctrl_outw(0x2a00, PFC_PHCR);    // IRQ0-3=IRQ
        ctrl_outw(0x0aaa, INTC_ICR1);   // IRQ0-3=IRQ-mode,Low-active.
+       make_ipr_irq(shmin_ipr_map, ARRAY_SIZE(shmin_ipr_map));
 }
 
 static void __iomem *shmin_ioport_map(unsigned long port, unsigned int size)
index f7ea700d05ae53c022493c791f601aa25266f7e5..70f12907647f13a32e73b3476c967dcb3cd0d237 100644 (file)
@@ -28,21 +28,21 @@ static void disable_voyagergx_irq(unsigned int irq)
        unsigned long val;
        unsigned long mask = 1 << (irq - VOYAGER_IRQ_BASE);
 
-       pr_debug("disable_voyagergx_irq(%d): mask=%lx\n", irq, mask);
-        val = inl(VOYAGER_INT_MASK);
-        val &= ~mask;
-        outl(val, VOYAGER_INT_MASK);
+       pr_debug("disable_voyagergx_irq(%d): mask=%x\n", irq, mask);
+       val = readl((void __iomem *)VOYAGER_INT_MASK);
+       val &= ~mask;
+       writel(val, (void __iomem *)VOYAGER_INT_MASK);
 }
 
 static void enable_voyagergx_irq(unsigned int irq)
 {
-        unsigned long val;
-        unsigned long mask = 1 << (irq - VOYAGER_IRQ_BASE);
+       unsigned long val;
+       unsigned long mask = 1 << (irq - VOYAGER_IRQ_BASE);
 
-        pr_debug("disable_voyagergx_irq(%d): mask=%lx\n", irq, mask);
-        val = inl(VOYAGER_INT_MASK);
-        val |= mask;
-        outl(val, VOYAGER_INT_MASK);
+       pr_debug("disable_voyagergx_irq(%d): mask=%x\n", irq, mask);
+       val = readl((void __iomem *)VOYAGER_INT_MASK);
+       val |= mask;
+       writel(val, (void __iomem *)VOYAGER_INT_MASK);
 }
 
 static void mask_and_ack_voyagergx(unsigned int irq)
@@ -68,20 +68,20 @@ static void shutdown_voyagergx_irq(unsigned int irq)
 }
 
 static struct hw_interrupt_type voyagergx_irq_type = {
-       .typename = "VOYAGERGX-IRQ",
-       .startup = startup_voyagergx_irq,
-       .shutdown = shutdown_voyagergx_irq,
-       .enable = enable_voyagergx_irq,
-       .disable = disable_voyagergx_irq,
-       .ack = mask_and_ack_voyagergx,
-       .end = end_voyagergx_irq,
+       .typename       = "VOYAGERGX-IRQ",
+       .startup        = startup_voyagergx_irq,
+       .shutdown       = shutdown_voyagergx_irq,
+       .enable         = enable_voyagergx_irq,
+       .disable        = disable_voyagergx_irq,
+       .ack            = mask_and_ack_voyagergx,
+       .end            = end_voyagergx_irq,
 };
 
 static irqreturn_t voyagergx_interrupt(int irq, void *dev_id)
 {
        printk(KERN_INFO
               "VoyagerGX: spurious interrupt, status: 0x%x\n",
-                       inl(INT_STATUS));
+                       (unsigned int)readl((void __iomem *)INT_STATUS));
        return IRQ_HANDLED;
 }
 
@@ -93,13 +93,13 @@ static struct {
 void voyagergx_register_irq_demux(int irq,
                int (*demux)(int irq, void *dev), void *dev)
 {
-       voyagergx_demux[irq - VOYAGER_IRQ_BASE].func = demux;
-       voyagergx_demux[irq - VOYAGER_IRQ_BASE].dev = dev;
+       voyagergx_demux[irq - VOYAGER_IRQ_BASE].func = demux;
+       voyagergx_demux[irq - VOYAGER_IRQ_BASE].dev = dev;
 }
 
 void voyagergx_unregister_irq_demux(int irq)
 {
-       voyagergx_demux[irq - VOYAGER_IRQ_BASE].func = 0;
+       voyagergx_demux[irq - VOYAGER_IRQ_BASE].func = 0;
 }
 
 int voyagergx_irq_demux(int irq)
@@ -107,31 +107,25 @@ int voyagergx_irq_demux(int irq)
 
        if (irq == IRQ_VOYAGER ) {
                unsigned long i = 0, bit __attribute__ ((unused));
-               unsigned long val  = inl(INT_STATUS);
-#if 1
-               if ( val & ( 1 << 1 )){
+               unsigned long val  = readl((void __iomem *)INT_STATUS);
+
+               if (val & (1 << 1))
                        i = 1;
-               } else if ( val & ( 1 << 2 )){
+               else if (val & (1 << 2))
                        i = 2;
-               } else if ( val & ( 1 << 6 )){
+               else if (val & (1 << 6))
                        i = 6;
-               } else if( val & ( 1 << 10 )){
+               else if (val & (1 << 10))
                        i = 10;
-               } else if( val & ( 1 << 11 )){
+               else if (val & (1 << 11))
                        i = 11;
-               } else if( val & ( 1 << 12 )){
+               else if (val & (1 << 12))
                        i = 12;
-               } else if( val & ( 1 << 17 )){
+               else if (val & (1 << 17))
                        i = 17;
-               } else {
+               else
                        printk("Unexpected IRQ irq = %d status = 0x%08lx\n", irq, val);
-               }
-               pr_debug("voyagergx_irq_demux %ld\n", i);
-#else
-               for (bit = 1, i = 0 ; i < VOYAGER_IRQ_NUM ; bit <<= 1, i++)
-                       if (val & bit)
-                               break;
-#endif
+               pr_debug("voyagergx_irq_demux %d \n", i);
                if (i < VOYAGER_IRQ_NUM) {
                        irq = VOYAGER_IRQ_BASE + i;
                        if (voyagergx_demux[i].func != 0)
index 66b2fedd7ad9308c53648116d56c317a15c3b533..33f03027c193840a47c52023a5a30e569230d90a 100644 (file)
@@ -19,7 +19,7 @@ static int __init setup_voyagergx(void)
 {
        unsigned long val;
 
-       val = inl(DRAM_CTRL);
+       val = readl((void __iomem *)DRAM_CTRL);
        val |= (DRAM_CTRL_CPU_COLUMN_SIZE_256   |
                DRAM_CTRL_CPU_ACTIVE_PRECHARGE  |
                DRAM_CTRL_CPU_RESET             |
@@ -29,7 +29,7 @@ static int __init setup_voyagergx(void)
                DRAM_CTRL_ACTIVE_PRECHARGE      |
                DRAM_CTRL_RESET                 |
                DRAM_CTRL_REMAIN_ACTIVE);
-       outl(val, DRAM_CTRL);
+       writel(val, (void __iomem *)DRAM_CTRL);
 
        return 0;
 }
index 099e98f14729429566128e0be141b5f6bcb872f6..db6a02df5af680eef0b5c74dcaa4fee5e0ec1596 100644 (file)
@@ -1,15 +1,21 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18
-# Tue Oct  3 11:38:36 2006
+# Linux kernel version: 2.6.20
+# Thu Feb 15 17:17:29 2007
 #
 CONFIG_SUPERH=y
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 CONFIG_GENERIC_FIND_NEXT_BIT=y
 CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
 CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
+# CONFIG_GENERIC_TIME is not set
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
@@ -33,8 +39,8 @@ CONFIG_SYSVIPC=y
 # CONFIG_UTS_NS is not set
 # CONFIG_AUDIT is not set
 # CONFIG_IKCONFIG is not set
+CONFIG_SYSFS_DEPRECATED=y
 # CONFIG_RELAY is not set
-CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SYSCTL=y
 CONFIG_EMBEDDED=y
@@ -97,10 +103,8 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
 # CONFIG_SH_73180_SOLUTION_ENGINE is not set
 # CONFIG_SH_7751_SYSTEMH is not set
 # CONFIG_SH_HP6XX is not set
-# CONFIG_SH_EC3104 is not set
 # CONFIG_SH_SATURN is not set
 # CONFIG_SH_DREAMCAST is not set
-# CONFIG_SH_BIGSUR is not set
 # CONFIG_SH_MPC1211 is not set
 # CONFIG_SH_SH03 is not set
 # CONFIG_SH_SECUREEDGE5410 is not set
@@ -113,6 +117,9 @@ CONFIG_SH_RTS7751R2D=y
 # CONFIG_SH_LANDISK is not set
 # CONFIG_SH_TITAN is not set
 # CONFIG_SH_SHMIN is not set
+# CONFIG_SH_7206_SOLUTION_ENGINE is not set
+# CONFIG_SH_7619_SOLUTION_ENGINE is not set
+# CONFIG_SH_ASDAP310 is not set
 # CONFIG_SH_UNKNOWN is not set
 
 #
@@ -124,6 +131,12 @@ CONFIG_CPU_SH4=y
 # SH-2 Processor Support
 #
 # CONFIG_CPU_SUBTYPE_SH7604 is not set
+# CONFIG_CPU_SUBTYPE_SH7619 is not set
+
+#
+# SH-2A Processor Support
+#
+# CONFIG_CPU_SUBTYPE_SH7206 is not set
 
 #
 # SH-3 Processor Support
@@ -159,12 +172,14 @@ CONFIG_CPU_SUBTYPE_SH7751R=y
 #
 # CONFIG_CPU_SUBTYPE_SH7770 is not set
 # CONFIG_CPU_SUBTYPE_SH7780 is not set
+# CONFIG_CPU_SUBTYPE_SH7785 is not set
 
 #
 # SH4AL-DSP Processor Support
 #
 # CONFIG_CPU_SUBTYPE_SH73180 is not set
 # CONFIG_CPU_SUBTYPE_SH7343 is not set
+# CONFIG_CPU_SUBTYPE_SH7722 is not set
 
 #
 # Memory management options
@@ -174,6 +189,9 @@ CONFIG_PAGE_OFFSET=0x80000000
 CONFIG_MEMORY_START=0x0c000000
 CONFIG_MEMORY_SIZE=0x04000000
 CONFIG_VSYSCALL=y
+CONFIG_PAGE_SIZE_4KB=y
+# CONFIG_PAGE_SIZE_8KB is not set
+# CONFIG_PAGE_SIZE_64KB is not set
 CONFIG_SELECT_MEMORY_MODEL=y
 CONFIG_FLATMEM_MANUAL=y
 # CONFIG_DISCONTIGMEM_MANUAL is not set
@@ -183,6 +201,7 @@ CONFIG_FLAT_NODE_MEM_MAP=y
 # CONFIG_SPARSEMEM_STATIC is not set
 CONFIG_SPLIT_PTLOCK_CPUS=4
 # CONFIG_RESOURCES_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
 
 #
 # Cache configuration
@@ -195,11 +214,14 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
 # Processor features
 #
 CONFIG_CPU_LITTLE_ENDIAN=y
+# CONFIG_CPU_BIG_ENDIAN is not set
 CONFIG_SH_FPU=y
 # CONFIG_SH_DSP is not set
 # CONFIG_SH_STORE_QUEUES is not set
 CONFIG_CPU_HAS_INTEVT=y
+CONFIG_CPU_HAS_IPR_IRQ=y
 CONFIG_CPU_HAS_SR_RB=y
+CONFIG_CPU_HAS_PTEA=y
 
 #
 # Timer support
@@ -210,6 +232,8 @@ CONFIG_SH_TMU=y
 # RTS7751R2D options
 #
 CONFIG_RTS7751R2D_REV11=y
+CONFIG_SH_TIMER_IRQ=16
+# CONFIG_NO_IDLE_HZ is not set
 CONFIG_SH_PCLK_FREQ=60000000
 
 #
@@ -231,11 +255,17 @@ CONFIG_VOYAGERGX=y
 # CONFIG_HD6446X_SERIES is not set
 CONFIG_HEARTBEAT=y
 
+#
+# Additional SuperH Device Drivers
+#
+# CONFIG_PUSH_SWITCH is not set
+
 #
 # Kernel features
 #
 # CONFIG_HZ_100 is not set
 CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
 # CONFIG_HZ_1000 is not set
 CONFIG_HZ=250
 # CONFIG_KEXEC is not set
@@ -251,7 +281,7 @@ CONFIG_ZERO_PAGE_OFFSET=0x00010000
 CONFIG_BOOT_LINK_OFFSET=0x00800000
 # CONFIG_UBC_WAKEUP is not set
 CONFIG_CMDLINE_BOOL=y
-CONFIG_CMDLINE="mem=64M console=ttySC0,115200 root=/dev/hda1"
+CONFIG_CMDLINE="console=ttySC0,115200 root=/dev/sda1"
 
 #
 # Bus options
@@ -260,7 +290,6 @@ CONFIG_PCI=y
 CONFIG_SH_PCIDMA_NONCOHERENT=y
 CONFIG_PCI_AUTO=y
 CONFIG_PCI_AUTO_UPDATE_RESOURCES=y
-# CONFIG_PCI_MULTITHREAD_PROBE is not set
 
 #
 # PCCARD (PCMCIA/CardBus) support
@@ -302,6 +331,7 @@ CONFIG_UNIX=y
 CONFIG_XFRM=y
 # CONFIG_XFRM_USER is not set
 # CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFRM_MIGRATE is not set
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
 # CONFIG_IP_MULTICAST is not set
@@ -319,11 +349,13 @@ CONFIG_IP_FIB_HASH=y
 # CONFIG_INET_TUNNEL is not set
 CONFIG_INET_XFRM_MODE_TRANSPORT=y
 CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
 CONFIG_INET_DIAG=y
 CONFIG_INET_TCP_DIAG=y
 # CONFIG_TCP_CONG_ADVANCED is not set
 CONFIG_TCP_CONG_CUBIC=y
 CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
 # CONFIG_IPV6 is not set
 # CONFIG_INET6_XFRM_TUNNEL is not set
 # CONFIG_INET6_TUNNEL is not set
@@ -380,7 +412,7 @@ CONFIG_WIRELESS_EXT=y
 #
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
+CONFIG_FW_LOADER=m
 # CONFIG_SYS_HYPERVISOR is not set
 
 #
@@ -422,44 +454,145 @@ CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
 # CONFIG_ATA_OVER_ETH is not set
 
 #
-# ATA/ATAPI/MFM/RLL support
-#
-CONFIG_IDE=y
-CONFIG_IDE_MAX_HWIFS=4
-CONFIG_BLK_DEV_IDE=y
-
-#
-# Please see Documentation/ide.txt for help/info on IDE drives
+# Misc devices
 #
-# CONFIG_BLK_DEV_IDE_SATA is not set
-CONFIG_BLK_DEV_IDEDISK=y
-# CONFIG_IDEDISK_MULTI_MODE is not set
-# 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
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_TIFM_CORE is not set
 
 #
-# IDE chipset support/bugfixes
+# ATA/ATAPI/MFM/RLL support
 #
-CONFIG_IDE_GENERIC=y
-# CONFIG_BLK_DEV_IDEPCI is not set
-# CONFIG_IDE_ARM is not set
-# CONFIG_BLK_DEV_IDEDMA is not set
-# CONFIG_IDEDMA_AUTO is not set
-# CONFIG_BLK_DEV_HD is not set
+# CONFIG_IDE is not set
 
 #
 # SCSI device support
 #
 # CONFIG_RAID_ATTRS is not set
-# CONFIG_SCSI is not set
+CONFIG_SCSI=y
+# CONFIG_SCSI_TGT is not set
 # CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_BLK_DEV_SR is not set
+# CONFIG_CHR_DEV_SG is not set
+# CONFIG_CHR_DEV_SCH is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# 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
+# 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_SCSI_AIC94XX is not set
+# CONFIG_SCSI_DPT_I2O is not set
+# CONFIG_SCSI_ARCMSR is not set
+# CONFIG_MEGARAID_NEWGEN is not set
+# CONFIG_MEGARAID_LEGACY is not set
+# CONFIG_MEGARAID_SAS is not set
+# CONFIG_SCSI_HPTIOP is not set
+# CONFIG_SCSI_DMX3191D is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_IPS is not set
+# CONFIG_SCSI_INITIO is not set
+# CONFIG_SCSI_INIA100 is not set
+# CONFIG_SCSI_STEX is not set
+# CONFIG_SCSI_SYM53C8XX_2 is not set
+# CONFIG_SCSI_IPR is not set
+# CONFIG_SCSI_QLOGIC_1280 is not set
+# CONFIG_SCSI_QLA_FC is not set
+# CONFIG_SCSI_QLA_ISCSI is not set
+# CONFIG_SCSI_LPFC is not set
+# CONFIG_SCSI_DC395x is not set
+# CONFIG_SCSI_DC390T is not set
+# CONFIG_SCSI_NSP32 is not set
+# CONFIG_SCSI_DEBUG is not set
+# CONFIG_SCSI_SRP is not set
 
 #
 # Serial ATA (prod) and Parallel ATA (experimental) drivers
 #
-# CONFIG_ATA is not set
+CONFIG_ATA=y
+# CONFIG_ATA_NONSTANDARD is not set
+# CONFIG_SATA_AHCI is not set
+# CONFIG_SATA_SVW is not set
+# CONFIG_ATA_PIIX is not set
+# CONFIG_SATA_MV is not set
+# CONFIG_SATA_NV is not set
+# CONFIG_PDC_ADMA is not set
+# CONFIG_SATA_QSTOR is not set
+# CONFIG_SATA_PROMISE is not set
+# CONFIG_SATA_SX4 is not set
+# CONFIG_SATA_SIL is not set
+# CONFIG_SATA_SIL24 is not set
+# CONFIG_SATA_SIS is not set
+# CONFIG_SATA_ULI is not set
+# CONFIG_SATA_VIA is not set
+# CONFIG_SATA_VITESSE is not set
+# CONFIG_SATA_INIC162X is not set
+# CONFIG_PATA_ALI is not set
+# CONFIG_PATA_AMD is not set
+# CONFIG_PATA_ARTOP is not set
+# CONFIG_PATA_ATIIXP is not set
+# CONFIG_PATA_CMD64X is not set
+# CONFIG_PATA_CS5520 is not set
+# CONFIG_PATA_CS5530 is not set
+# CONFIG_PATA_CYPRESS is not set
+# CONFIG_PATA_EFAR is not set
+# CONFIG_ATA_GENERIC is not set
+# CONFIG_PATA_HPT366 is not set
+# CONFIG_PATA_HPT37X is not set
+# CONFIG_PATA_HPT3X2N is not set
+# CONFIG_PATA_HPT3X3 is not set
+# CONFIG_PATA_IT821X is not set
+# CONFIG_PATA_IT8213 is not set
+# CONFIG_PATA_JMICRON is not set
+# CONFIG_PATA_TRIFLEX is not set
+# CONFIG_PATA_MARVELL is not set
+# CONFIG_PATA_MPIIX is not set
+# CONFIG_PATA_OLDPIIX is not set
+# CONFIG_PATA_NETCELL is not set
+# CONFIG_PATA_NS87410 is not set
+# CONFIG_PATA_OPTI is not set
+# CONFIG_PATA_OPTIDMA is not set
+# CONFIG_PATA_PDC_OLD is not set
+# CONFIG_PATA_RADISYS is not set
+# CONFIG_PATA_RZ1000 is not set
+# CONFIG_PATA_SC1200 is not set
+# CONFIG_PATA_SERVERWORKS is not set
+# CONFIG_PATA_PDC2027X is not set
+# CONFIG_PATA_SIL680 is not set
+# CONFIG_PATA_SIS is not set
+# CONFIG_PATA_VIA is not set
+# CONFIG_PATA_WINBOND is not set
+CONFIG_PATA_PLATFORM=y
 
 #
 # Multi-device support (RAID and LVM)
@@ -470,6 +603,9 @@ CONFIG_IDE_GENERIC=y
 # 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
@@ -540,6 +676,7 @@ CONFIG_8139TOO=y
 # CONFIG_SUNDANCE is not set
 # CONFIG_TLAN is not set
 # CONFIG_VIA_RHINE is not set
+# CONFIG_SC92031 is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -559,14 +696,17 @@ CONFIG_8139TOO=y
 # CONFIG_TIGON3 is not set
 # CONFIG_BNX2 is not set
 # CONFIG_QLA3XXX is not set
+# CONFIG_ATL1 is not set
 
 #
 # Ethernet (10000 Mbit)
 #
 # CONFIG_CHELSIO_T1 is not set
+# CONFIG_CHELSIO_T3 is not set
 # CONFIG_IXGB is not set
 # CONFIG_S2IO is not set
 # CONFIG_MYRI10GE is not set
+# CONFIG_NETXEN_NIC is not set
 
 #
 # Token Ring devices
@@ -611,6 +751,7 @@ CONFIG_NET_WIRELESS=y
 # CONFIG_HIPPI is not set
 # CONFIG_PPP is not set
 # 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
@@ -646,14 +787,23 @@ CONFIG_NET_WIRELESS=y
 #
 # Serial drivers
 #
-# CONFIG_SERIAL_8250 is not set
+CONFIG_SERIAL_8250=y
+# CONFIG_SERIAL_8250_CONSOLE is not set
+CONFIG_SERIAL_8250_PCI=y
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+# CONFIG_SERIAL_8250_EXTENDED is not set
 
 #
 # Non-8250 serial port support
 #
-# CONFIG_SERIAL_SH_SCI is not set
+CONFIG_SERIAL_SH_SCI=y
+CONFIG_SERIAL_SH_SCI_NR_UARTS=1
+CONFIG_SERIAL_SH_SCI_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
 # CONFIG_SERIAL_JSM is not set
-# CONFIG_UNIX98_PTYS is not set
+CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
 
@@ -671,10 +821,6 @@ CONFIG_HW_RANDOM=y
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
 # CONFIG_APPLICOM is not set
-
-#
-# Ftape, the floppy tape device driver
-#
 # CONFIG_DRM is not set
 # CONFIG_RAW_DRIVER is not set
 
@@ -682,7 +828,6 @@ CONFIG_HW_RANDOM=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
-# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -698,6 +843,7 @@ CONFIG_HW_RANDOM=y
 #
 # Dallas's 1-wire bus
 #
+# CONFIG_W1 is not set
 
 #
 # Hardware Monitoring support
@@ -706,18 +852,14 @@ CONFIG_HWMON=y
 # CONFIG_HWMON_VID is not set
 # CONFIG_SENSORS_ABITUGURU is not set
 # CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_PC87427 is not set
 # CONFIG_SENSORS_VT1211 is not set
 # CONFIG_HWMON_DEBUG_CHIP is not set
 
-#
-# Misc devices
-#
-
 #
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
-CONFIG_VIDEO_V4L2=y
 
 #
 # Digital Video Broadcasting Devices
@@ -759,7 +901,6 @@ CONFIG_SND_VERBOSE_PROCFS=y
 CONFIG_SND_MPU401_UART=m
 CONFIG_SND_OPL3_LIB=m
 CONFIG_SND_AC97_CODEC=m
-CONFIG_SND_AC97_BUS=m
 # CONFIG_SND_DUMMY is not set
 # CONFIG_SND_MTPAV is not set
 # CONFIG_SND_SERIAL_U16550 is not set
@@ -782,6 +923,18 @@ CONFIG_SND_AC97_BUS=m
 # CONFIG_SND_CMIPCI is not set
 # CONFIG_SND_CS4281 is not set
 # CONFIG_SND_CS46XX is not set
+# CONFIG_SND_DARLA20 is not set
+# CONFIG_SND_GINA20 is not set
+# CONFIG_SND_LAYLA20 is not set
+# CONFIG_SND_DARLA24 is not set
+# CONFIG_SND_GINA24 is not set
+# CONFIG_SND_LAYLA24 is not set
+# CONFIG_SND_MONA is not set
+# CONFIG_SND_MIA is not set
+# CONFIG_SND_ECHO3G is not set
+# CONFIG_SND_INDIGO is not set
+# CONFIG_SND_INDIGOIO is not set
+# CONFIG_SND_INDIGODJ is not set
 # CONFIG_SND_EMU10K1 is not set
 # CONFIG_SND_EMU10K1X is not set
 # CONFIG_SND_ENS1370 is not set
@@ -801,6 +954,7 @@ CONFIG_SND_AC97_BUS=m
 # CONFIG_SND_MIXART is not set
 # CONFIG_SND_NM256 is not set
 # CONFIG_SND_PCXHR is not set
+# CONFIG_SND_RIPTIDE is not set
 # CONFIG_SND_RME32 is not set
 # CONFIG_SND_RME96 is not set
 # CONFIG_SND_RME9652 is not set
@@ -812,18 +966,23 @@ CONFIG_SND_AC97_BUS=m
 CONFIG_SND_YMFPCI=m
 # CONFIG_SND_AC97_POWER_SAVE is not set
 
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+
 #
 # Open Sound System
 #
 CONFIG_SOUND_PRIME=m
-# CONFIG_OSS_OBSOLETE_DRIVER is not set
+# CONFIG_OBSOLETE_OSS is not set
 # CONFIG_SOUND_BT878 is not set
-# CONFIG_SOUND_ES1371 is not set
 # CONFIG_SOUND_ICH is not set
 # CONFIG_SOUND_TRIDENT is not set
 # CONFIG_SOUND_MSNDCLAS is not set
 # CONFIG_SOUND_MSNDPIN is not set
 # CONFIG_SOUND_VIA82CXXX is not set
+CONFIG_AC97_BUS=m
 
 #
 # USB support
@@ -872,7 +1031,29 @@ CONFIG_USB_ARCH_HAS_EHCI=y
 #
 # Real Time Clock
 #
-# CONFIG_RTC_CLASS is not set
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+
+#
+# RTC drivers
+#
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+CONFIG_RTC_DRV_SH=y
+# CONFIG_RTC_DRV_TEST is not set
+# CONFIG_RTC_DRV_V3020 is not set
 
 #
 # DMA Engine support
@@ -887,6 +1068,14 @@ CONFIG_USB_ARCH_HAS_EHCI=y
 # DMA Devices
 #
 
+#
+# Auxiliary Display support
+#
+
+#
+# Virtualization
+#
+
 #
 # File systems
 #
@@ -894,10 +1083,12 @@ CONFIG_EXT2_FS=y
 # CONFIG_EXT2_FS_XATTR is not set
 # CONFIG_EXT2_FS_XIP is not set
 # CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS is not set
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
 # CONFIG_FS_POSIX_ACL is not set
 # CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
 # CONFIG_OCFS2_FS is not set
 CONFIG_MINIX_FS=y
 # CONFIG_ROMFS_FS is not set
@@ -932,7 +1123,8 @@ CONFIG_PROC_FS=y
 CONFIG_PROC_KCORE=y
 CONFIG_PROC_SYSCTL=y
 CONFIG_SYSFS=y
-# CONFIG_TMPFS is not set
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
 # CONFIG_HUGETLBFS is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
@@ -1017,6 +1209,11 @@ CONFIG_NLS_CODEPAGE_932=y
 # CONFIG_NLS_KOI8_U is not set
 # CONFIG_NLS_UTF8 is not set
 
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
 #
 # Profiling support
 #
@@ -1026,16 +1223,20 @@ CONFIG_OPROFILE=y
 #
 # Kernel hacking
 #
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
 # CONFIG_PRINTK_TIME is not set
 CONFIG_ENABLE_MUST_CHECK=y
 # CONFIG_MAGIC_SYSRQ is not set
 # CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
 # CONFIG_DEBUG_KERNEL is not set
 CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_FS is not set
 # CONFIG_SH_STANDARD_BIOS is not set
-# CONFIG_EARLY_SCIF_CONSOLE is not set
+CONFIG_EARLY_SCIF_CONSOLE=y
+CONFIG_EARLY_SCIF_CONSOLE_PORT=0xffe80000
+CONFIG_EARLY_PRINTK=y
 # CONFIG_KGDB is not set
 
 #
@@ -1052,8 +1253,11 @@ CONFIG_LOG_BUF_SHIFT=14
 #
 # Library routines
 #
+CONFIG_BITREVERSE=y
 # CONFIG_CRC_CCITT is not set
 # CONFIG_CRC16 is not set
 CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
 CONFIG_PLIST=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
index 5d357d68b234e866d26a2efb4e27297e11d4b350..4e6e77fa4ce761b7baafb6335ef9ea4e24d6153c 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.18
-# Tue Oct  3 11:49:01 2006
+# Linux kernel version: 2.6.20-rc2
+# Thu Dec 28 23:15:49 2006
 #
 CONFIG_SUPERH=y
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
@@ -10,6 +10,11 @@ CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_GENERIC_IRQ_PROBE=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
+# CONFIG_GENERIC_TIME is not set
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
 #
@@ -35,6 +40,7 @@ CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_AUDIT is not set
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
+CONFIG_SYSFS_DEPRECATED=y
 # CONFIG_RELAY is not set
 CONFIG_INITRAMFS_SOURCE=""
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
@@ -116,6 +122,8 @@ CONFIG_SH_SOLUTION_ENGINE=y
 # CONFIG_SH_LANDISK is not set
 # CONFIG_SH_TITAN is not set
 # CONFIG_SH_SHMIN is not set
+# CONFIG_SH_7206_SOLUTION_ENGINE is not set
+# CONFIG_SH_7619_SOLUTION_ENGINE is not set
 # CONFIG_SH_UNKNOWN is not set
 
 #
@@ -127,6 +135,12 @@ CONFIG_CPU_SH4=y
 # SH-2 Processor Support
 #
 # CONFIG_CPU_SUBTYPE_SH7604 is not set
+# CONFIG_CPU_SUBTYPE_SH7619 is not set
+
+#
+# SH-2A Processor Support
+#
+# CONFIG_CPU_SUBTYPE_SH7206 is not set
 
 #
 # SH-3 Processor Support
@@ -162,12 +176,14 @@ CONFIG_CPU_SUBTYPE_SH7750=y
 #
 # CONFIG_CPU_SUBTYPE_SH7770 is not set
 # CONFIG_CPU_SUBTYPE_SH7780 is not set
+# CONFIG_CPU_SUBTYPE_SH7785 is not set
 
 #
 # SH4AL-DSP Processor Support
 #
 # CONFIG_CPU_SUBTYPE_SH73180 is not set
 # CONFIG_CPU_SUBTYPE_SH7343 is not set
+# CONFIG_CPU_SUBTYPE_SH7722 is not set
 
 #
 # Memory management options
@@ -177,6 +193,9 @@ CONFIG_PAGE_OFFSET=0x80000000
 CONFIG_MEMORY_START=0x0c000000
 CONFIG_MEMORY_SIZE=0x02000000
 CONFIG_VSYSCALL=y
+CONFIG_PAGE_SIZE_4KB=y
+# CONFIG_PAGE_SIZE_8KB is not set
+# CONFIG_PAGE_SIZE_64KB is not set
 CONFIG_SELECT_MEMORY_MODEL=y
 CONFIG_FLATMEM_MANUAL=y
 # CONFIG_DISCONTIGMEM_MANUAL is not set
@@ -202,17 +221,22 @@ CONFIG_CF_BASE_ADDR=0xb8000000
 # Processor features
 #
 CONFIG_CPU_LITTLE_ENDIAN=y
+# CONFIG_CPU_BIG_ENDIAN is not set
 CONFIG_SH_FPU=y
 # CONFIG_SH_DSP is not set
 # CONFIG_SH_STORE_QUEUES is not set
 CONFIG_CPU_HAS_INTEVT=y
+CONFIG_CPU_HAS_IPR_IRQ=y
 CONFIG_CPU_HAS_SR_RB=y
+CONFIG_CPU_HAS_PTEA=y
 
 #
 # Timer support
 #
 CONFIG_SH_TMU=y
-CONFIG_SH_PCLK_FREQ=50000000
+CONFIG_SH_TIMER_IRQ=16
+# CONFIG_NO_IDLE_HZ is not set
+CONFIG_SH_PCLK_FREQ=33333333
 
 #
 # CPU Frequency scaling
@@ -230,11 +254,17 @@ CONFIG_SH_PCLK_FREQ=50000000
 # CONFIG_HD6446X_SERIES is not set
 CONFIG_HEARTBEAT=y
 
+#
+# Additional SuperH Device Drivers
+#
+# CONFIG_PUSH_SWITCH is not set
+
 #
 # Kernel features
 #
 # CONFIG_HZ_100 is not set
 CONFIG_HZ_250=y
+# CONFIG_HZ_300 is not set
 # CONFIG_HZ_1000 is not set
 CONFIG_HZ=250
 # CONFIG_KEXEC is not set
@@ -249,8 +279,7 @@ CONFIG_PREEMPT_NONE=y
 CONFIG_ZERO_PAGE_OFFSET=0x00001000
 CONFIG_BOOT_LINK_OFFSET=0x00800000
 # CONFIG_UBC_WAKEUP is not set
-CONFIG_CMDLINE_BOOL=y
-CONFIG_CMDLINE="console=ttySC1,38400 root=/dev/nfs ip=bootp"
+# CONFIG_CMDLINE_BOOL is not set
 
 #
 # Bus options
@@ -313,11 +342,13 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_INET_TUNNEL is not set
 CONFIG_INET_XFRM_MODE_TRANSPORT=y
 CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
 CONFIG_INET_DIAG=y
 CONFIG_INET_TCP_DIAG=y
 # CONFIG_TCP_CONG_ADVANCED is not set
 CONFIG_TCP_CONG_CUBIC=y
 CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
 # CONFIG_IPV6 is not set
 # CONFIG_INET6_XFRM_TUNNEL is not set
 # CONFIG_INET6_TUNNEL is not set
@@ -479,17 +510,80 @@ CONFIG_MTD_ROM=y
 # CONFIG_CDROM_PKTCDVD is not set
 # CONFIG_ATA_OVER_ETH is not set
 
+#
+# Misc devices
+#
+# CONFIG_TIFM_CORE is not set
+
 #
 # ATA/ATAPI/MFM/RLL support
 #
-# CONFIG_IDE is not set
+CONFIG_IDE=y
+CONFIG_IDE_MAX_HWIFS=4
+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 is not set
+# 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 is not set
+# CONFIG_IDE_ARM is not set
+# CONFIG_BLK_DEV_IDEDMA is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_BLK_DEV_HD is not set
 
 #
 # SCSI device support
 #
 # CONFIG_RAID_ATTRS is not set
-# CONFIG_SCSI is not set
+CONFIG_SCSI=y
+# CONFIG_SCSI_TGT is not set
 # CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+# CONFIG_BLK_DEV_SD is not set
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_BLK_DEV_SR is not set
+# CONFIG_CHR_DEV_SG is not set
+# CONFIG_CHR_DEV_SCH is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_SCSI_DEBUG is not set
 
 #
 # Serial ATA (prod) and Parallel ATA (experimental) drivers
@@ -633,17 +727,12 @@ CONFIG_HW_RANDOM=y
 # CONFIG_GEN_RTC is not set
 # CONFIG_DTLK is not set
 # CONFIG_R3964 is not set
-
-#
-# Ftape, the floppy tape device driver
-#
 # CONFIG_RAW_DRIVER is not set
 
 #
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
-# CONFIG_TELCLOCK is not set
 
 #
 # I2C support
@@ -659,6 +748,7 @@ CONFIG_HW_RANDOM=y
 #
 # Dallas's 1-wire bus
 #
+# CONFIG_W1 is not set
 
 #
 # Hardware Monitoring support
@@ -667,18 +757,14 @@ CONFIG_HWMON=y
 # CONFIG_HWMON_VID is not set
 # CONFIG_SENSORS_ABITUGURU is not set
 # CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_PC87427 is not set
 # CONFIG_SENSORS_VT1211 is not set
 # CONFIG_HWMON_DEBUG_CHIP is not set
 
-#
-# Misc devices
-#
-
 #
 # Multimedia devices
 #
 # CONFIG_VIDEO_DEV is not set
-CONFIG_VIDEO_V4L2=y
 
 #
 # Digital Video Broadcasting Devices
@@ -757,15 +843,21 @@ CONFIG_FIRMWARE_EDID=y
 # DMA Devices
 #
 
+#
+# Virtualization
+#
+
 #
 # File systems
 #
 # CONFIG_EXT2_FS is not set
 # CONFIG_EXT3_FS is not set
+# CONFIG_EXT4DEV_FS is not set
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
 # CONFIG_FS_POSIX_ACL is not set
 # CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
 # CONFIG_OCFS2_FS is not set
 # CONFIG_MINIX_FS is not set
 # CONFIG_ROMFS_FS is not set
@@ -814,7 +906,6 @@ CONFIG_RAMFS=y
 # CONFIG_BEFS_FS is not set
 # CONFIG_BFS_FS is not set
 # CONFIG_EFS_FS is not set
-# CONFIG_JFFS_FS is not set
 CONFIG_JFFS2_FS=y
 CONFIG_JFFS2_FS_DEBUG=0
 CONFIG_JFFS2_FS_WRITEBUFFER=y
@@ -874,6 +965,11 @@ CONFIG_PARTITION_ADVANCED=y
 #
 # CONFIG_NLS is not set
 
+#
+# Distributed Lock Manager
+#
+# CONFIG_DLM is not set
+
 #
 # Profiling support
 #
@@ -882,14 +978,16 @@ CONFIG_PARTITION_ADVANCED=y
 #
 # Kernel hacking
 #
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
 # CONFIG_PRINTK_TIME is not set
-CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_ENABLE_MUST_CHECK is not set
 # CONFIG_MAGIC_SYSRQ is not set
 # CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
 # CONFIG_DEBUG_KERNEL is not set
 CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_DEBUG_BUGVERBOSE is not set
-# CONFIG_DEBUG_FS is not set
 # CONFIG_SH_STANDARD_BIOS is not set
 # CONFIG_EARLY_SCIF_CONSOLE is not set
 # CONFIG_KGDB is not set
@@ -908,6 +1006,7 @@ CONFIG_LOG_BUF_SHIFT=14
 #
 # Library routines
 #
+CONFIG_BITREVERSE=y
 # CONFIG_CRC_CCITT is not set
 # CONFIG_CRC16 is not set
 CONFIG_CRC32=y
@@ -915,3 +1014,4 @@ CONFIG_CRC32=y
 CONFIG_ZLIB_INFLATE=y
 CONFIG_ZLIB_DEFLATE=y
 CONFIG_PLIST=y
+CONFIG_IOMAP_COPY=y
index bf18dbfb6787db618d339e082b08bd0a8d6e2713..6cb92676c5fc4a51178a72524a61ee6d93ac7f11 100644 (file)
@@ -6,3 +6,4 @@ obj-$(CONFIG_PCI)               += pci/
 obj-$(CONFIG_SH_DMA)           += dma/
 obj-$(CONFIG_SUPERHYWAY)       += superhyway/
 obj-$(CONFIG_PUSH_SWITCH)      += push-switch.o
+obj-$(CONFIG_HEARTBEAT)                += heartbeat.o
index f63721ed86c273fc20864fe107e0877e88d3b65c..06ed0609a95d6c58ecf476d483f0ef6ea617e83e 100644 (file)
 #include <asm/io.h>
 #include "dma-sh.h"
 
-
-
-#ifdef CONFIG_CPU_SH4
-static struct ipr_data dmae_ipr_map[] = {
-       { DMAE_IRQ, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY },
-};
+static int dmte_irq_map[] = {
+       DMTE0_IRQ,
+       DMTE1_IRQ,
+       DMTE2_IRQ,
+       DMTE3_IRQ,
+#if defined(CONFIG_CPU_SUBTYPE_SH7751R) ||     \
+    defined(CONFIG_CPU_SUBTYPE_SH7760)  ||     \
+    defined(CONFIG_CPU_SUBTYPE_SH7780)
+       DMTE4_IRQ,
+       DMTE5_IRQ,
+       DMTE6_IRQ,
+       DMTE7_IRQ,    
 #endif
-static struct ipr_data dmte_ipr_map[] = {
-       /*
-        * Normally we could just do DMTE0_IRQ + chan outright, though in the
-        * case of the 7751R, the DMTE IRQs for channels > 4 start right above
-        * the SCIF
-        */
-       { DMTE0_IRQ + 0, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY },
-       { DMTE0_IRQ + 1, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY },
-       { DMTE0_IRQ + 2, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY },
-       { DMTE0_IRQ + 3, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY },
-       { DMTE4_IRQ + 0, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY },
-       { DMTE4_IRQ + 1, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY },
-       { DMTE4_IRQ + 2, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY },
-       { DMTE4_IRQ + 3, DMA_IPR_ADDR, DMA_IPR_POS, DMA_PRIORITY },
 };
 
 static inline unsigned int get_dmte_irq(unsigned int chan)
 {
        unsigned int irq = 0;
-       if (chan < ARRAY_SIZE(dmte_ipr_map))
-               irq = dmte_ipr_map[chan].irq;
+       if (chan < ARRAY_SIZE(dmte_irq_map))
+               irq = dmte_irq_map[chan];
        return irq;
 }
 
@@ -103,7 +95,7 @@ static void sh_dmac_free_dma(struct dma_channel *chan)
        free_irq(get_dmte_irq(chan->chan), chan);
 }
 
-static void
+static int
 sh_dmac_configure_channel(struct dma_channel *chan, unsigned long chcr)
 {
        if (!chcr)
@@ -119,6 +111,7 @@ sh_dmac_configure_channel(struct dma_channel *chan, unsigned long chcr)
        ctrl_outl(chcr, CHCR[chan->chan]);
 
        chan->flags |= DMA_CONFIGURED;
+       return 0;
 }
 
 static void sh_dmac_enable_dma(struct dma_channel *chan)
@@ -262,17 +255,11 @@ static int __init sh_dmac_init(void)
        int i;
 
 #ifdef CONFIG_CPU_SH4
-       make_ipr_irq(dmae_ipr_map, ARRAY_SIZE(dmae_ipr_map));
        i = request_irq(DMAE_IRQ, dma_err, IRQF_DISABLED, "DMAC Address Error", 0);
        if (unlikely(i < 0))
                return i;
 #endif
 
-       i = info->nr_channels;
-       if (i > ARRAY_SIZE(dmte_ipr_map))
-               i = ARRAY_SIZE(dmte_ipr_map);
-       make_ipr_irq(dmte_ipr_map, i);
-
        /*
         * Initialize DMAOR, and clean up any error flags that may have
         * been set.
diff --git a/arch/sh/drivers/heartbeat.c b/arch/sh/drivers/heartbeat.c
new file mode 100644 (file)
index 0000000..bc59cb6
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * Generic heartbeat driver for regular LED banks
+ *
+ * Copyright (C) 2007  Paul Mundt
+ *
+ * Most SH reference boards include a number of individual LEDs that can
+ * be independently controlled (either via a pre-defined hardware
+ * function or via the LED class, if desired -- the hardware tends to
+ * encapsulate some of the same "triggers" that the LED class supports,
+ * so there's not too much value in it).
+ *
+ * Additionally, most of these boards also have a LED bank that we've
+ * traditionally used for strobing the load average. This use case is
+ * handled by this driver, rather than giving each LED bit position its
+ * own struct device.
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/sched.h>
+#include <linux/timer.h>
+#include <linux/io.h>
+
+#define DRV_NAME "heartbeat"
+#define DRV_VERSION "0.1.0"
+
+struct heartbeat_data {
+       void __iomem *base;
+       unsigned char bit_pos[8];
+       struct timer_list timer;
+};
+
+static void heartbeat_timer(unsigned long data)
+{
+       struct heartbeat_data *hd = (struct heartbeat_data *)data;
+       static unsigned bit = 0, up = 1;
+
+       ctrl_outw(1 << hd->bit_pos[bit], (unsigned long)hd->base);
+       if (up)
+               if (bit == (ARRAY_SIZE(hd->bit_pos) - 1)) {
+                       bit--;
+                       up = 0;
+               } else
+                       bit++;
+       else if (bit == 0)
+               up = 1;
+       else
+               bit--;
+
+       mod_timer(&hd->timer, jiffies + (110 - ((300 << FSHIFT) /
+                       ((avenrun[0] / 5) + (3 << FSHIFT)))));
+}
+
+static int heartbeat_drv_probe(struct platform_device *pdev)
+{
+       struct resource *res;
+       struct heartbeat_data *hd;
+
+       if (unlikely(pdev->num_resources != 1)) {
+               dev_err(&pdev->dev, "invalid number of resources\n");
+               return -EINVAL;
+       }
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (unlikely(res == NULL)) {
+               dev_err(&pdev->dev, "invalid resource\n");
+               return -EINVAL;
+       }
+
+       hd = kmalloc(sizeof(struct heartbeat_data), GFP_KERNEL);
+       if (unlikely(!hd))
+               return -ENOMEM;
+
+       if (pdev->dev.platform_data) {
+               memcpy(hd->bit_pos, pdev->dev.platform_data,
+                      ARRAY_SIZE(hd->bit_pos));
+       } else {
+               int i;
+
+               for (i = 0; i < ARRAY_SIZE(hd->bit_pos); i++)
+                       hd->bit_pos[i] = i;
+       }
+
+       hd->base = (void __iomem *)res->start;
+
+       setup_timer(&hd->timer, heartbeat_timer, (unsigned long)hd);
+       platform_set_drvdata(pdev, hd);
+
+       return mod_timer(&hd->timer, jiffies + 1);
+}
+
+static int heartbeat_drv_remove(struct platform_device *pdev)
+{
+       struct heartbeat_data *hd = platform_get_drvdata(pdev);
+
+       del_timer_sync(&hd->timer);
+
+       platform_set_drvdata(pdev, NULL);
+
+       kfree(hd);
+
+       return 0;
+}
+
+static struct platform_driver heartbeat_driver = {
+       .probe          = heartbeat_drv_probe,
+       .remove         = heartbeat_drv_remove,
+       .driver         = {
+               .name   = DRV_NAME,
+       },
+};
+
+static int __init heartbeat_init(void)
+{
+       printk(KERN_NOTICE DRV_NAME ": version %s loaded\n", DRV_VERSION);
+       return platform_driver_register(&heartbeat_driver);
+}
+
+static void __exit heartbeat_exit(void)
+{
+       platform_driver_unregister(&heartbeat_driver);
+}
+module_init(heartbeat_init);
+module_exit(heartbeat_exit);
+
+MODULE_VERSION(DRV_VERSION);
+MODULE_AUTHOR("Paul Mundt");
+MODULE_LICENSE("GPLv2");
index 9e00cb8a39e90365f8745d42f76cae5e2b24d411..cc8d0d0b142749cbd325bc2621c815c073d86e26 100644 (file)
@@ -12,7 +12,6 @@ obj-$(CONFIG_CPU_SUBTYPE_SH7780)      += pci-sh7780.o ops-sh4.o
 obj-$(CONFIG_SH_DREAMCAST)             += ops-dreamcast.o fixups-dreamcast.o \
                                           dma-dreamcast.o
 obj-$(CONFIG_SH_SECUREEDGE5410)                += ops-snapgear.o
-obj-$(CONFIG_SH_BIGSUR)                        += ops-bigsur.o
 obj-$(CONFIG_SH_RTS7751R2D)            += ops-rts7751r2d.o fixups-rts7751r2d.o
 obj-$(CONFIG_SH_SH03)                  += ops-sh03.o fixups-sh03.o
 obj-$(CONFIG_SH_R7780RP)               += ops-r7780rp.o fixups-r7780rp.o
diff --git a/arch/sh/drivers/pci/ops-bigsur.c b/arch/sh/drivers/pci/ops-bigsur.c
deleted file mode 100644 (file)
index eb31be7..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * linux/arch/sh/drivers/pci/ops-bigsur.c
- *
- * By Dustin McIntire (dustin@sensoria.com) (c)2001
- *
- * Ported to new API by Paul Mundt <lethal@linux-sh.org>.
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * PCI initialization for the Hitachi Big Sur Evaluation Board
- */
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/pci.h>
-#include <asm/io.h>
-#include "pci-sh4.h"
-#include <asm/bigsur/bigsur.h>
-
-#define BIGSUR_PCI_IO  0x4000
-#define BIGSUR_PCI_MEM 0xfd000000
-
-static struct resource sh7751_io_resource = {
-       .name           = "SH7751 IO",
-       .start          = BIGSUR_PCI_IO,
-       .end            = BIGSUR_PCI_IO + (64*1024) - 1,
-       .flags          = IORESOURCE_IO,
-};
-
-static struct resource sh7751_mem_resource = {
-       .name           = "SH7751 mem",
-       .start          = BIGSUR_PCI_MEM,
-       .end            = BIGSUR_PCI_MEM + (64*1024*1024) - 1,
-       .flags          = IORESOURCE_MEM,
-};
-
-extern struct pci_ops sh7751_pci_ops;
-
-struct pci_channel board_pci_channels[] = {
-       { &sh4_pci_ops, &sh7751_io_resource, &sh7751_mem_resource, 0, 0xff },
-       { 0, }
-};
-
-static struct sh4_pci_address_map sh7751_pci_map = {
-       .window0        = {
-               .base   = SH7751_CS3_BASE_ADDR,
-               .size   = BIGSUR_LSR0_SIZE,
-       },
-
-       .window1        = {
-               .base   = SH7751_CS3_BASE_ADDR,
-               .size   = BIGSUR_LSR1_SIZE,
-       },
-};
-
-/*
- * Initialize the Big Sur PCI interface
- * Setup hardware to be Central Funtion
- * Copy the BSR regs to the PCI interface
- * Setup PCI windows into local RAM
- */
-int __init pcibios_init_platform(void)
-{
-       return sh7751_pcic_init(&sh7751_pci_map);
-}
-
-int __init pcibios_map_platform_irq(struct pci_dev *pdev, u8 slot, u8 pin)
-{
-       /*
-        * The Big Sur can be used in a CPCI chassis, but the SH7751 PCI
-        * interface is on the wrong end of the board so that it can also
-        * support a V320 CPI interface chip...  Therefor the IRQ mapping is
-        * somewhat use dependent... I'l assume a linear map for now, i.e.
-        * INTA=slot0,pin0... INTD=slot3,pin0...
-        */
-       int irq = (slot + pin-1) % 4 + BIGSUR_SH7751_PCI_IRQ_BASE;
-
-       PCIDBG(2, "PCI: Mapping Big Sur IRQ for slot %d, pin %c to irq %d\n",
-              slot, pin-1+'A', irq);
-
-       return irq;
-}
index 85e1ee2e2e7b47d6997304768bfbc25c5998d92b..9ddff760d3c6fdbf856e92b79fae6c6c2c36bc68 100644 (file)
@@ -157,15 +157,6 @@ int __init sh7751_pcic_init(struct sh4_pci_address_map *map)
                 PCIBIOS_MIN_IO, (64 << 10),
                 SH7751_PCI_IO_BASE + PCIBIOS_MIN_IO);
 
-       /*
-        * XXX: For now, leave this board-specific. In the event we have other
-        * boards that need to do similar work, this can be wrapped.
-        */
-#ifdef CONFIG_SH_BIGSUR
-       bigsur_port_map(PCIBIOS_MIN_IO, (64 << 10),
-                       SH7751_PCI_IO_BASE + PCIBIOS_MIN_IO, 0);
-#endif
-
        /* Make sure the MSB's of IO window are set to access PCI space
         * correctly */
        word = PCIBIOS_MIN_IO & SH4_PCIIOBR_MASK;
index 2f6d2bcb1c93f8fbc26b7daee131b894e02dd9ad..ff30d7f58043662b8ec85f79118412ca8107e526 100644 (file)
@@ -6,7 +6,8 @@ extra-y := head.o init_task.o vmlinux.lds
 
 obj-y  := process.o signal.o traps.o irq.o \
        ptrace.o setup.o time.o sys_sh.o semaphore.o \
-       io.o io_generic.o sh_ksyms.o syscalls.o
+       io.o io_generic.o sh_ksyms.o syscalls.o \
+       debugtraps.o
 
 obj-y                          += cpu/ timers/
 obj-$(CONFIG_VSYSCALL)         += vsyscall/
index 48121766e8d243e07065e3f3797da7376092cc9b..4b339a640b13c86dc02d9a6de09eab4f8c8ab9f0 100644 (file)
@@ -3,7 +3,7 @@
  *
  * CPU init code
  *
- * Copyright (C) 2002, 2003  Paul Mundt
+ * Copyright (C) 2002 - 2006  Paul Mundt
  * Copyright (C) 2003  Richard Curnow
  *
  * This file is subject to the terms and conditions of the GNU General Public
@@ -12,6 +12,8 @@
  */
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/mm.h>
+#include <asm/mmu_context.h>
 #include <asm/processor.h>
 #include <asm/uaccess.h>
 #include <asm/page.h>
@@ -46,7 +48,7 @@ static void __init cache_init(void)
 {
        unsigned long ccr, flags;
 
-       if (cpu_data->type == CPU_SH_NONE)
+       if (current_cpu_data.type == CPU_SH_NONE)
                panic("Unknown CPU");
 
        jump_to_P2();
@@ -66,7 +68,7 @@ static void __init cache_init(void)
        if (ccr & CCR_CACHE_ENABLE) {
                unsigned long ways, waysize, addrstart;
 
-               waysize = cpu_data->dcache.sets;
+               waysize = current_cpu_data.dcache.sets;
 
 #ifdef CCR_CACHE_ORA
                /*
@@ -77,7 +79,7 @@ static void __init cache_init(void)
                        waysize >>= 1;
 #endif
 
-               waysize <<= cpu_data->dcache.entry_shift;
+               waysize <<= current_cpu_data.dcache.entry_shift;
 
 #ifdef CCR_CACHE_EMODE
                /* If EMODE is not set, we only have 1 way to flush. */
@@ -85,7 +87,7 @@ static void __init cache_init(void)
                        ways = 1;
                else
 #endif
-                       ways = cpu_data->dcache.ways;
+                       ways = current_cpu_data.dcache.ways;
 
                addrstart = CACHE_OC_ADDRESS_ARRAY;
                do {
@@ -93,10 +95,10 @@ static void __init cache_init(void)
 
                        for (addr = addrstart;
                             addr < addrstart + waysize;
-                            addr += cpu_data->dcache.linesz)
+                            addr += current_cpu_data.dcache.linesz)
                                ctrl_outl(0, addr);
 
-                       addrstart += cpu_data->dcache.way_incr;
+                       addrstart += current_cpu_data.dcache.way_incr;
                } while (--ways);
        }
 
@@ -108,7 +110,7 @@ static void __init cache_init(void)
 
 #ifdef CCR_CACHE_EMODE
        /* Force EMODE if possible */
-       if (cpu_data->dcache.ways > 1)
+       if (current_cpu_data.dcache.ways > 1)
                flags |= CCR_CACHE_EMODE;
        else
                flags &= ~CCR_CACHE_EMODE;
@@ -125,10 +127,10 @@ static void __init cache_init(void)
 #ifdef CONFIG_SH_OCRAM
        /* Turn on OCRAM -- halve the OC */
        flags |= CCR_CACHE_ORA;
-       cpu_data->dcache.sets >>= 1;
+       current_cpu_data.dcache.sets >>= 1;
 
-       cpu_data->dcache.way_size = cpu_data->dcache.sets *
-                                   cpu_data->dcache.linesz;
+       current_cpu_data.dcache.way_size = current_cpu_data.dcache.sets *
+                                   current_cpu_data.dcache.linesz;
 #endif
 
        ctrl_outl(flags, CCR);
@@ -170,7 +172,7 @@ static void __init dsp_init(void)
 
        /* If the DSP bit is still set, this CPU has a DSP */
        if (sr & SR_DSP)
-               cpu_data->flags |= CPU_HAS_DSP;
+               current_cpu_data.flags |= CPU_HAS_DSP;
 
        /* Now that we've determined the DSP status, clear the DSP bit. */
        release_dsp();
@@ -202,22 +204,28 @@ asmlinkage void __init sh_cpu_init(void)
        cache_init();
 
        shm_align_mask = max_t(unsigned long,
-                              cpu_data->dcache.way_size - 1,
+                              current_cpu_data.dcache.way_size - 1,
                               PAGE_SIZE - 1);
 
        /* Disable the FPU */
        if (fpu_disabled) {
                printk("FPU Disabled\n");
-               cpu_data->flags &= ~CPU_HAS_FPU;
+               current_cpu_data.flags &= ~CPU_HAS_FPU;
                disable_fpu();
        }
 
        /* FPU initialization */
-       if ((cpu_data->flags & CPU_HAS_FPU)) {
+       if ((current_cpu_data.flags & CPU_HAS_FPU)) {
                clear_thread_flag(TIF_USEDFPU);
                clear_used_math();
        }
 
+       /*
+        * Initialize the per-CPU ASID cache very early, since the
+        * TLB flushing routines depend on this being setup.
+        */
+       current_cpu_data.asid_cache = NO_CONTEXT;
+
 #ifdef CONFIG_SH_DSP
        /* Probe for DSP */
        dsp_init();
@@ -225,7 +233,7 @@ asmlinkage void __init sh_cpu_init(void)
        /* Disable the DSP */
        if (dsp_disabled) {
                printk("DSP Disabled\n");
-               cpu_data->flags &= ~CPU_HAS_DSP;
+               current_cpu_data.flags &= ~CPU_HAS_DSP;
                release_dsp();
        }
 #endif
@@ -240,4 +248,3 @@ asmlinkage void __init sh_cpu_init(void)
        ubc_wakeup();
 #endif
 }
-
index 35eb5751a3aaf842ecaecdb59e66f2dc70bc6d01..210280b6fddfdb5484ef472a2307cf54d7363a23 100644 (file)
@@ -43,16 +43,29 @@ static struct irq_chip ipr_irq_chip = {
        .mask_ack       = disable_ipr_irq,
 };
 
+unsigned int map_ipridx_to_addr(int idx) __attribute__ ((weak));
+unsigned int map_ipridx_to_addr(int idx)
+{
+       return 0;
+}
+
 void make_ipr_irq(struct ipr_data *table, unsigned int nr_irqs)
 {
        int i;
 
        for (i = 0; i < nr_irqs; i++) {
                unsigned int irq = table[i].irq;
-               table[i].addr = map_ipridx_to_addr(table[i].ipr_idx);
+
+               if (!irq)
+                       irq = table[i].irq = i;
+
                /* could the IPR index be mapped, if not we ignore this */
-               if (table[i].addr == 0)
-                       continue;
+               if (!table[i].addr) {
+                       table[i].addr = map_ipridx_to_addr(table[i].ipr_idx);
+                       if (!table[i].addr)
+                               continue;
+               }
+
                disable_irq_nosync(irq);
                set_irq_chip_and_handler_name(irq, &ipr_irq_chip,
                                      handle_level_irq, "level");
index d51fa5e9904a8b92d3b5254720de5288fd0e77d5..7f7d292f36ec12d49aebaf956cbeafe4db2369bb 100644 (file)
@@ -178,12 +178,10 @@ interrupt_entry:
 8:     .long   do_exception_error
        
 trap_entry:
-       /* verbose BUG trapa entry check */
-       mov     #0x3e,r8
-       cmp/ge  r8,r9
-       bf/s    1f
-        add    #-0x10,r9
-       add     #0x10,r9
+       mov     #0x30,r8
+       cmp/ge  r8,r9           ! vector 0x20-0x2f is systemcall
+       bt      1f
+       add     #-0x10,r9       ! convert SH2 to SH3/4 ABI
 1:     
        shll2   r9                      ! TRA
        mov     #OFF_TRA,r8
@@ -206,7 +204,7 @@ trap_entry:
 
 #if defined(CONFIG_SH_STANDARD_BIOS)
        /* Unwind the stack and jmp to the debug entry */
-debug_kernel_fw:
+ENTRY(sh_bios_handler)
        mov     r15,r0
        add     #(22-4)*4-4,r0
        ldc.l   @r0+,gbr
index ba527d9b502411a56db05cb9b840688f8e4ba4fb..108e81b682ed0cb18cfb72f72892f1d08316002c 100644 (file)
 int __init detect_cpu_and_cache_system(void)
 {
 #if defined(CONFIG_CPU_SUBTYPE_SH7604)
-       cpu_data->type                  = CPU_SH7604;
-       cpu_data->dcache.ways           = 4;
-       cpu_data->dcache.way_incr       = (1<<10);
-       cpu_data->dcache.sets           = 64;
-       cpu_data->dcache.entry_shift    = 4;
-       cpu_data->dcache.linesz         = L1_CACHE_BYTES;
-       cpu_data->dcache.flags          = 0;
+       current_cpu_data.type                   = CPU_SH7604;
+       current_cpu_data.dcache.ways            = 4;
+       current_cpu_data.dcache.way_incr        = (1<<10);
+       current_cpu_data.dcache.sets            = 64;
+       current_cpu_data.dcache.entry_shift     = 4;
+       current_cpu_data.dcache.linesz          = L1_CACHE_BYTES;
+       current_cpu_data.dcache.flags           = 0;
 #elif defined(CONFIG_CPU_SUBTYPE_SH7619)
-       cpu_data->type                  = CPU_SH7619;
-       cpu_data->dcache.ways           = 4;
-       cpu_data->dcache.way_incr       = (1<<12);
-       cpu_data->dcache.sets           = 256;
-       cpu_data->dcache.entry_shift    = 4;
-       cpu_data->dcache.linesz         = L1_CACHE_BYTES;
-       cpu_data->dcache.flags          = 0;
+       current_cpu_data.type                   = CPU_SH7619;
+       current_cpu_data.dcache.ways            = 4;
+       current_cpu_data.dcache.way_incr        = (1<<12);
+       current_cpu_data.dcache.sets            = 256;
+       current_cpu_data.dcache.entry_shift     = 4;
+       current_cpu_data.dcache.linesz          = L1_CACHE_BYTES;
+       current_cpu_data.dcache.flags           = 0;
 #endif
        /*
         * SH-2 doesn't have separate caches
         */
-       cpu_data->dcache.flags |= SH_CACHE_COMBINED;
-       cpu_data->icache = cpu_data->dcache;
+       current_cpu_data.dcache.flags |= SH_CACHE_COMBINED;
+       current_cpu_data.icache = current_cpu_data.dcache;
 
        return 0;
 }
index 79283e6c1d8f069a87efb9241e6dee36ca23c94c..f83ff8a68f3567a5b70cc435ba0195feece808a9 100644 (file)
@@ -52,42 +52,38 @@ static int __init sh7619_devices_setup(void)
 }
 __initcall(sh7619_devices_setup);
 
-#define INTC_IPRC      0xf8080000UL
-#define INTC_IPRD      0xf8080002UL
-
-#define CMI0_IRQ       86
-
-#define SCIF0_ERI_IRQ  88
-#define SCIF0_RXI_IRQ  89
-#define SCIF0_BRI_IRQ  90
-#define SCIF0_TXI_IRQ  91
-
-#define SCIF1_ERI_IRQ  92
-#define SCIF1_RXI_IRQ  93
-#define SCIF1_BRI_IRQ  94
-#define SCIF1_TXI_IRQ  95
-
-#define SCIF2_BRI_IRQ  96
-#define SCIF2_ERI_IRQ  97
-#define SCIF2_RXI_IRQ  98
-#define SCIF2_TXI_IRQ  99
-
 static struct ipr_data sh7619_ipr_map[] = {
-       { CMI0_IRQ,      INTC_IPRC, 1, 2 },
-       { SCIF0_ERI_IRQ, INTC_IPRD, 3, 3 },
-       { SCIF0_RXI_IRQ, INTC_IPRD, 3, 3 },
-       { SCIF0_BRI_IRQ, INTC_IPRD, 3, 3 },
-       { SCIF0_TXI_IRQ, INTC_IPRD, 3, 3 },
-       { SCIF1_ERI_IRQ, INTC_IPRD, 2, 3 },
-       { SCIF1_RXI_IRQ, INTC_IPRD, 2, 3 },
-       { SCIF1_BRI_IRQ, INTC_IPRD, 2, 3 },
-       { SCIF1_TXI_IRQ, INTC_IPRD, 2, 3 },
-       { SCIF2_ERI_IRQ, INTC_IPRD, 1, 3 },
-       { SCIF2_RXI_IRQ, INTC_IPRD, 1, 3 },
-       { SCIF2_BRI_IRQ, INTC_IPRD, 1, 3 },
-       { SCIF2_TXI_IRQ, INTC_IPRD, 1, 3 },
+       { 86, 0,  4, 2 },       /* CMI0 */
+       { 88, 1, 12, 3 },       /* SCIF0_ERI */
+       { 89, 1, 12, 3 },       /* SCIF0_RXI */
+       { 90, 1, 12, 3 },       /* SCIF0_BRI */
+       { 91, 1, 12, 3 },       /* SCIF0_TXI */
+       { 92, 1,  8, 3 },       /* SCIF1_ERI */
+       { 93, 1,  8, 3 },       /* SCIF1_RXI */
+       { 94, 1,  8, 3 },       /* SCIF1_BRI */
+       { 95, 1,  8, 3 },       /* SCIF1_TXI */
+       { 96, 1,  4, 3 },       /* SCIF2_ERI */
+       { 97, 1,  4, 3 },       /* SCIF2_RXI */
+       { 98, 1,  4, 3 },       /* SCIF2_BRI */
+       { 99, 1,  4, 3 },       /* SCIF2_TXI */
 };
 
+static unsigned int ipr_offsets[] = {
+       0xf8080000,     /* IPRC */
+       0xf8080002,     /* IPRD */
+       0xf8080004,     /* IPRE */
+       0xf8080006,     /* IPRF */
+       0xf8080008,     /* IPRG */
+};
+
+/* given the IPR index return the address of the IPR register */
+unsigned int map_ipridx_to_addr(int idx)
+{
+       if (unlikely(idx >= ARRAY_SIZE(ipr_offsets)))
+               return 0;
+       return ipr_offsets[idx];
+}
+
 void __init init_IRQ_ipr(void)
 {
        make_ipr_irq(sh7619_ipr_map, ARRAY_SIZE(sh7619_ipr_map));
index 87c6c05420898f0128d27a4677e52f7caa307e87..426f6db01fc69d117621398e5be60f29a09f261a 100644 (file)
 int __init detect_cpu_and_cache_system(void)
 {
        /* Just SH7206 for now .. */
-       cpu_data->type                  = CPU_SH7206;
+       current_cpu_data.type                   = CPU_SH7206;
 
-       cpu_data->dcache.ways           = 4;
-       cpu_data->dcache.way_incr       = (1 << 11);
-       cpu_data->dcache.sets           = 128;
-       cpu_data->dcache.entry_shift    = 4;
-       cpu_data->dcache.linesz         = L1_CACHE_BYTES;
-       cpu_data->dcache.flags          = 0;
+       current_cpu_data.dcache.ways            = 4;
+       current_cpu_data.dcache.way_incr        = (1 << 11);
+       current_cpu_data.dcache.sets            = 128;
+       current_cpu_data.dcache.entry_shift     = 4;
+       current_cpu_data.dcache.linesz          = L1_CACHE_BYTES;
+       current_cpu_data.dcache.flags           = 0;
 
        /*
         * The icache is the same as the dcache as far as this setup is
@@ -32,7 +32,7 @@ int __init detect_cpu_and_cache_system(void)
         * lacks the U bit that the dcache has, none of this has any bearing
         * on the cache info.
         */
-       cpu_data->icache                = cpu_data->dcache;
+       current_cpu_data.icache         = current_cpu_data.dcache;
 
        return 0;
 }
index 4b60fcc7d66755e9d7c9614adeaac9251df8a1f5..4ed9110632bc5d0d368c0437a0d372dbf4bc651f 100644 (file)
@@ -57,55 +57,52 @@ static int __init sh7206_devices_setup(void)
 }
 __initcall(sh7206_devices_setup);
 
-#define INTC_IPR08     0xfffe0c04UL
-#define INTC_IPR09     0xfffe0c06UL
-#define INTC_IPR14     0xfffe0c10UL
-
-#define CMI0_IRQ       140
-
-#define MTU1_TGI1A     164
-
-#define SCIF0_BRI_IRQ  240
-#define SCIF0_ERI_IRQ  241
-#define SCIF0_RXI_IRQ  242
-#define SCIF0_TXI_IRQ  243
-
-#define SCIF1_BRI_IRQ  244
-#define SCIF1_ERI_IRQ  245
-#define SCIF1_RXI_IRQ  246
-#define SCIF1_TXI_IRQ  247
-
-#define SCIF2_BRI_IRQ  248
-#define SCIF2_ERI_IRQ  249
-#define SCIF2_RXI_IRQ  250
-#define SCIF2_TXI_IRQ  251
-
-#define SCIF3_BRI_IRQ  252
-#define SCIF3_ERI_IRQ  253
-#define SCIF3_RXI_IRQ  254
-#define SCIF3_TXI_IRQ  255
-
 static struct ipr_data sh7206_ipr_map[] = {
-       { CMI0_IRQ,      INTC_IPR08, 3, 2 },
-       { MTU2_TGI1A,    INTC_IPR09, 1, 2 },
-       { SCIF0_ERI_IRQ, INTC_IPR14, 3, 3 },
-       { SCIF0_RXI_IRQ, INTC_IPR14, 3, 3 },
-       { SCIF0_BRI_IRQ, INTC_IPR14, 3, 3 },
-       { SCIF0_TXI_IRQ, INTC_IPR14, 3, 3 },
-       { SCIF1_ERI_IRQ, INTC_IPR14, 2, 3 },
-       { SCIF1_RXI_IRQ, INTC_IPR14, 2, 3 },
-       { SCIF1_BRI_IRQ, INTC_IPR14, 2, 3 },
-       { SCIF1_TXI_IRQ, INTC_IPR14, 2, 3 },
-       { SCIF2_ERI_IRQ, INTC_IPR14, 1, 3 },
-       { SCIF2_RXI_IRQ, INTC_IPR14, 1, 3 },
-       { SCIF2_BRI_IRQ, INTC_IPR14, 1, 3 },
-       { SCIF2_TXI_IRQ, INTC_IPR14, 1, 3 },
-       { SCIF3_ERI_IRQ, INTC_IPR14, 0, 3 },
-       { SCIF3_RXI_IRQ, INTC_IPR14, 0, 3 },
-       { SCIF3_BRI_IRQ, INTC_IPR14, 0, 3 },
-       { SCIF3_TXI_IRQ, INTC_IPR14, 0, 3 },
+       { 140,  7, 12, 2 },     /* CMI0 */
+       { 164,  8,  4, 2 },     /* MTU2_TGI1A */
+       { 240, 13, 12, 3 },     /* SCIF0_BRI */
+       { 241, 13, 12, 3 },     /* SCIF0_ERI */
+       { 242, 13, 12, 3 },     /* SCIF0_RXI */
+       { 243, 13, 12, 3 },     /* SCIF0_TXI */
+       { 244, 13,  8, 3 },     /* SCIF1_BRI */
+       { 245, 13,  8, 3 },     /* SCIF1_ERI */
+       { 246, 13,  8, 3 },     /* SCIF1_RXI */
+       { 247, 13,  8, 3 },     /* SCIF1_TXI */
+       { 248, 13,  4, 3 },     /* SCIF2_BRI */
+       { 249, 13,  4, 3 },     /* SCIF2_ERI */
+       { 250, 13,  4, 3 },     /* SCIF2_RXI */
+       { 251, 13,  4, 3 },     /* SCIF2_TXI */
+       { 252, 13,  0, 3 },     /* SCIF3_BRI */
+       { 253, 13,  0, 3 },     /* SCIF3_ERI */
+       { 254, 13,  0, 3 },     /* SCIF3_RXI */
+       { 255, 13,  0, 3 },     /* SCIF3_TXI */
+};
+
+static unsigned int ipr_offsets[] = {
+       0xfffe0818,     /* IPR01 */
+       0xfffe081a,     /* IPR02 */
+       0,              /* unused */
+       0,              /* unused */
+       0xfffe0820,     /* IPR05 */
+       0xfffe0c00,     /* IPR06 */
+       0xfffe0c02,     /* IPR07 */
+       0xfffe0c04,     /* IPR08 */
+       0xfffe0c06,     /* IPR09 */
+       0xfffe0c08,     /* IPR10 */
+       0xfffe0c0a,     /* IPR11 */
+       0xfffe0c0c,     /* IPR12 */
+       0xfffe0c0e,     /* IPR13 */
+       0xfffe0c10,     /* IPR14 */
 };
 
+/* given the IPR index return the address of the IPR register */
+unsigned int map_ipridx_to_addr(int idx)
+{
+       if (unlikely(idx >= ARRAY_SIZE(ipr_offsets)))
+               return 0;
+       return ipr_offsets[idx];
+}
+
 void __init init_IRQ_ipr(void)
 {
        make_ipr_irq(sh7206_ipr_map, ARRAY_SIZE(sh7206_ipr_map));
index 8c0dc2700c69ebc79df3085e0c2e93ce2099a6bb..c19205b0f2c001d2ce1cd73c7dba7674890d102f 100644 (file)
 #include <linux/linkage.h>
 #include <asm/asm-offsets.h>
 #include <asm/thread_info.h>
-#include <asm/unistd.h>
 #include <asm/cpu/mmu_context.h>
-#include <asm/pgtable.h>
-#include <asm/page.h>
+#include <asm/unistd.h>
 
 ! NOTE:
 ! GNU as (as of 2.9.1) changes bf/s into bt/s and bra, when the address
@@ -138,14 +136,29 @@ ENTRY(tlb_protection_violation_store)
 
 call_dpf:
        mov.l   1f, r0
-       mov.l   @r0, r6         ! address
+       mov     r5, r8
+       mov.l   @r0, r6
+       mov     r6, r9
+       mov.l   2f, r0
+       sts     pr, r10
+       jsr     @r0
+        mov    r15, r4
+       !
+       tst     r0, r0
+       bf/s    0f
+        lds    r10, pr
+       rts
+        nop
+0:     sti
        mov.l   3f, r0
-
+       mov     r9, r6
+       mov     r8, r5
        jmp     @r0
-        mov    r15, r4         ! regs
+        mov    r15, r4
 
        .align 2
 1:     .long   MMU_TEA
+2:     .long   __do_page_fault
 3:     .long   do_page_fault
 
        .align  2
@@ -173,7 +186,7 @@ call_dae:
 
 #if defined(CONFIG_SH_STANDARD_BIOS)
        /* Unwind the stack and jmp to the debug entry */
-debug_kernel_fw:
+ENTRY(sh_bios_handler)
        mov.l   @r15+, r0
        mov.l   @r15+, r1
        mov.l   @r15+, r2
@@ -332,175 +345,9 @@ general_exception:
 !
 !
 
-/* This code makes some assumptions to improve performance.
- * Make sure they are stil true. */
-#if PTRS_PER_PGD != PTRS_PER_PTE
-#error PGD and PTE sizes don't match
-#endif
-
-/* gas doesn't flag impossible values for mov #immediate as an error */
-#if (_PAGE_PRESENT >> 2) > 0x7f
-#error cannot load PAGE_PRESENT as an immediate
-#endif
-#if _PAGE_DIRTY > 0x7f
-#error cannot load PAGE_DIRTY as an immediate
-#endif
-#if (_PAGE_PRESENT << 2) != _PAGE_ACCESSED
-#error cannot derive PAGE_ACCESSED from PAGE_PRESENT
-#endif
-
-#if defined(CONFIG_CPU_SH4)
-#define ldmmupteh(r)   mov.l   8f, r
-#else
-#define ldmmupteh(r)   mov     #MMU_PTEH, r
-#endif
-
        .balign         1024,0,1024
 tlb_miss:
-#ifdef COUNT_EXCEPTIONS
-       ! Increment the counts
-       mov.l   9f, k1
-       mov.l   @k1, k2
-       add     #1, k2
-       mov.l   k2, @k1
-#endif
-
-       ! k0 scratch
-       ! k1 pgd and pte pointers
-       ! k2 faulting address
-       ! k3 pgd and pte index masks
-       ! k4 shift
-
-       ! Load up the pgd entry (k1)
-
-       ldmmupteh(k0)                   !  9 LS (latency=2)     MMU_PTEH
-
-       mov.w   4f, k3                  !  8 LS (latency=2)     (PTRS_PER_PGD-1) << 2
-       mov     #-(PGDIR_SHIFT-2), k4   !  6 EX
-
-       mov.l   @(MMU_TEA-MMU_PTEH,k0), k2      ! 18 LS (latency=2)
-
-       mov.l   @(MMU_TTB-MMU_PTEH,k0), k1      ! 18 LS (latency=2)
-
-       mov     k2, k0                  !   5 MT (latency=0)
-       shld    k4, k0                  !  99 EX
-
-       and     k3, k0                  !  78 EX
-
-       mov.l   @(k0, k1), k1           !  21 LS (latency=2)
-       mov     #-(PAGE_SHIFT-2), k4    !   6 EX
-
-       ! Load up the pte entry (k2)
-
-       mov     k2, k0                  !   5 MT (latency=0)
-       shld    k4, k0                  !  99 EX
-
-       tst     k1, k1                  !  86 MT
-
-       bt      20f                     ! 110 BR
-
-       and     k3, k0                  !  78 EX
-       mov.w   5f, k4                  !   8 LS (latency=2)    _PAGE_PRESENT
-
-       mov.l   @(k0, k1), k2           !  21 LS (latency=2)
-       add     k0, k1                  !  49 EX
-
-#ifdef CONFIG_CPU_HAS_PTEA
-       ! Test the entry for present and _PAGE_ACCESSED
-
-       mov     #-28, k3                !   6 EX
-       mov     k2, k0                  !   5 MT (latency=0)
-
-       tst     k4, k2                  !  68 MT
-       shld    k3, k0                  !  99 EX
-
-       bt      20f                     ! 110 BR
-
-       ! Set PTEA register
-       ! MMU_PTEA = ((pteval >> 28) & 0xe) | (pteval & 0x1)
-       !
-       ! k0=pte>>28, k1=pte*, k2=pte, k3=<unused>, k4=_PAGE_PRESENT
-
-       and     #0xe, k0                !  79 EX
-
-       mov     k0, k3                  !   5 MT (latency=0)
-       mov     k2, k0                  !   5 MT (latency=0)
-
-       and     #1, k0                  !  79 EX
-
-       or      k0, k3                  !  82 EX
-
-       ldmmupteh(k0)                   !   9 LS (latency=2)
-       shll2   k4                      ! 101 EX                _PAGE_ACCESSED
-
-       tst     k4, k2                  !  68 MT
-
-       mov.l   k3, @(MMU_PTEA-MMU_PTEH,k0)     ! 27 LS
-
-       mov.l   7f, k3                  !   9 LS (latency=2)    _PAGE_FLAGS_HARDWARE_MASK
-
-       ! k0=MMU_PTEH, k1=pte*, k2=pte, k3=_PAGE_FLAGS_HARDWARE, k4=_PAGE_ACCESSED
-#else
-
-       ! Test the entry for present and _PAGE_ACCESSED
-
-       mov.l   7f, k3                  !   9 LS (latency=2)    _PAGE_FLAGS_HARDWARE_MASK
-       tst     k4, k2                  !  68 MT
-
-       shll2   k4                      ! 101 EX                _PAGE_ACCESSED
-       ldmmupteh(k0)                   !   9 LS (latency=2)
-
-       bt      20f                     ! 110 BR
-       tst     k4, k2                  !  68 MT
-
-       ! k0=MMU_PTEH, k1=pte*, k2=pte, k3=_PAGE_FLAGS_HARDWARE, k4=_PAGE_ACCESSED
-
-#endif
-
-       ! Set up the entry
-
-       and     k2, k3                  !  78 EX
-       bt/s    10f                     ! 108 BR
-
-        mov.l  k3, @(MMU_PTEL-MMU_PTEH,k0)     ! 27 LS
-
-       ldtlb                           ! 128 CO
-
-       ! At least one instruction between ldtlb and rte
-       nop                             ! 119 NOP
-
-       rte                             ! 126 CO
-
-        nop                            ! 119 NOP
-
-
-10:    or      k4, k2                  !  82 EX
-
-       ldtlb                           ! 128 CO
-
-       ! At least one instruction between ldtlb and rte
-       mov.l   k2, @k1                 !  27 LS
-
-       rte                             ! 126 CO
-
-       ! Note we cannot execute mov here, because it is executed after
-       ! restoring SSR, so would be executed in user space.
-        nop                            ! 119 NOP
-
-
-       .align 5
-       ! Once cache line if possible...
-1:     .long   swapper_pg_dir
-4:     .short  (PTRS_PER_PGD-1) << 2
-5:     .short  _PAGE_PRESENT
-7:     .long   _PAGE_FLAGS_HARDWARE_MASK
-8:     .long   MMU_PTEH
-#ifdef COUNT_EXCEPTIONS
-9:     .long   exception_count_miss
-#endif
-
-       ! Either pgd or pte not present
-20:    mov.l   1f, k2
+       mov.l   1f, k2
        mov.l   4f, k3
        bra     handle_exception
         mov.l  @k2, k2
@@ -651,15 +498,6 @@ skip_save:
        bf      interrupt_exception
        shlr2   r8
        shlr    r8
-
-#ifdef COUNT_EXCEPTIONS
-       mov.l   5f, r9
-       add     r8, r9
-       mov.l   @r9, r10
-       add     #1, r10
-       mov.l   r10, @r9
-#endif
-
        mov.l   4f, r9
        add     r8, r9
        mov.l   @r9, r9
@@ -673,9 +511,6 @@ skip_save:
 2:     .long   0x000080f0      ! FD=1, IMASK=15
 3:     .long   0xcfffffff      ! RB=0, BL=0
 4:     .long   exception_handling_table
-#ifdef COUNT_EXCEPTIONS
-5:     .long   exception_count_table
-#endif
 
 interrupt_exception:
        mov.l   1f, r9
index e67098836290ea9ff583991fe0a6e05c27876175..821b0ab7b528226f6d3244a914b8164d1ead4532 100644 (file)
@@ -50,41 +50,41 @@ int __init detect_cpu_and_cache_system(void)
 
        back_to_P1();
 
-       cpu_data->dcache.ways           = 4;
-       cpu_data->dcache.entry_shift    = 4;
-       cpu_data->dcache.linesz         = L1_CACHE_BYTES;
-       cpu_data->dcache.flags          = 0;
+       current_cpu_data.dcache.ways            = 4;
+       current_cpu_data.dcache.entry_shift     = 4;
+       current_cpu_data.dcache.linesz          = L1_CACHE_BYTES;
+       current_cpu_data.dcache.flags           = 0;
 
        /*
         * 7709A/7729 has 16K cache (256-entry), while 7702 has only
         * 2K(direct) 7702 is not supported (yet)
         */
        if (data0 == data1 && data2 == data3) { /* Shadow */
-               cpu_data->dcache.way_incr       = (1 << 11);
-               cpu_data->dcache.entry_mask     = 0x7f0;
-               cpu_data->dcache.sets           = 128;
-               cpu_data->type = CPU_SH7708;
+               current_cpu_data.dcache.way_incr        = (1 << 11);
+               current_cpu_data.dcache.entry_mask      = 0x7f0;
+               current_cpu_data.dcache.sets            = 128;
+               current_cpu_data.type = CPU_SH7708;
 
-               cpu_data->flags |= CPU_HAS_MMU_PAGE_ASSOC;
+               current_cpu_data.flags |= CPU_HAS_MMU_PAGE_ASSOC;
        } else {                                /* 7709A or 7729  */
-               cpu_data->dcache.way_incr       = (1 << 12);
-               cpu_data->dcache.entry_mask     = 0xff0;
-               cpu_data->dcache.sets           = 256;
-               cpu_data->type = CPU_SH7729;
+               current_cpu_data.dcache.way_incr        = (1 << 12);
+               current_cpu_data.dcache.entry_mask      = 0xff0;
+               current_cpu_data.dcache.sets            = 256;
+               current_cpu_data.type = CPU_SH7729;
 
 #if defined(CONFIG_CPU_SUBTYPE_SH7706)
-               cpu_data->type = CPU_SH7706;
+               current_cpu_data.type = CPU_SH7706;
 #endif
 #if defined(CONFIG_CPU_SUBTYPE_SH7710)
-               cpu_data->type = CPU_SH7710;
+               current_cpu_data.type = CPU_SH7710;
 #endif
 #if defined(CONFIG_CPU_SUBTYPE_SH7705)
-               cpu_data->type = CPU_SH7705;
+               current_cpu_data.type = CPU_SH7705;
 
 #if defined(CONFIG_SH7705_CACHE_32KB)
-               cpu_data->dcache.way_incr       = (1 << 13);
-               cpu_data->dcache.entry_mask     = 0x1ff0;
-               cpu_data->dcache.sets           = 512;
+               current_cpu_data.dcache.way_incr        = (1 << 13);
+               current_cpu_data.dcache.entry_mask      = 0x1ff0;
+               current_cpu_data.dcache.sets            = 512;
                ctrl_outl(CCR_CACHE_32KB, CCR3);
 #else
                ctrl_outl(CCR_CACHE_16KB, CCR3);
@@ -95,8 +95,8 @@ int __init detect_cpu_and_cache_system(void)
        /*
         * SH-3 doesn't have separate caches
         */
-       cpu_data->dcache.flags |= SH_CACHE_COMBINED;
-       cpu_data->icache = cpu_data->dcache;
+       current_cpu_data.dcache.flags |= SH_CACHE_COMBINED;
+       current_cpu_data.icache = current_cpu_data.dcache;
 
        return 0;
 }
index ff43ef2a1f0c20cd644a88430835d8ff312a989b..dc9b211cf87f75dc00de23f3f99b3b30c23daae7 100644 (file)
@@ -51,3 +51,24 @@ static int __init sh7709_devices_setup(void)
                                    ARRAY_SIZE(sh7709_devices));
 }
 __initcall(sh7709_devices_setup);
+
+#define IPRx(A,N) .addr=A, .shift=0*N*-1
+#define IPRA(N)        IPRx(0xfffffee2UL,N)
+#define IPRB(N)        IPRx(0xfffffee4UL,N)
+#define IPRE(N)        IPRx(0xa400001aUL,N)
+
+static struct ipr_data sh7709_ipr_map[] = {
+       [16]            = { IPRA(15-12), 2 }, /* TMU TUNI0 */
+       [17]            = { IPRA(11-8),  4 }, /* TMU TUNI1 */
+       [22]            = { IPRA(3-0),   2 }, /* RTC CUI */
+       [23 ... 26]     = { IPRB(7-4),   3 }, /* SCI */
+       [27]            = { IPRB(15-12), 2 }, /* WDT ITI */
+       [48 ... 51]     = { IPRE(15-12), 7 }, /* DMA */
+       [52 ... 55]     = { IPRE(11-8),  3 }, /* IRDA */
+       [56 ... 59]     = { IPRE(7-4),   3 }, /* SCIF */
+};
+
+void __init init_IRQ_ipr()
+{
+       make_ipr_irq(sh7709_ipr_map, ARRAY_SIZE(sh7709_ipr_map));
+}
index 9031a22a2ce7878b03378c48c353b39866fbce5b..9d28c88d2f9de65f829c8cf96208c5ac0705067d 100644 (file)
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  */
-
 #include <linux/init.h>
+#include <linux/io.h>
 #include <asm/processor.h>
 #include <asm/cache.h>
-#include <asm/io.h>
 
 int __init detect_cpu_and_cache_system(void)
 {
@@ -36,20 +35,20 @@ int __init detect_cpu_and_cache_system(void)
        /*
         * Setup some sane SH-4 defaults for the icache
         */
-       cpu_data->icache.way_incr       = (1 << 13);
-       cpu_data->icache.entry_shift    = 5;
-       cpu_data->icache.sets           = 256;
-       cpu_data->icache.ways           = 1;
-       cpu_data->icache.linesz         = L1_CACHE_BYTES;
+       current_cpu_data.icache.way_incr        = (1 << 13);
+       current_cpu_data.icache.entry_shift     = 5;
+       current_cpu_data.icache.sets            = 256;
+       current_cpu_data.icache.ways            = 1;
+       current_cpu_data.icache.linesz          = L1_CACHE_BYTES;
 
        /*
         * And again for the dcache ..
         */
-       cpu_data->dcache.way_incr       = (1 << 14);
-       cpu_data->dcache.entry_shift    = 5;
-       cpu_data->dcache.sets           = 512;
-       cpu_data->dcache.ways           = 1;
-       cpu_data->dcache.linesz         = L1_CACHE_BYTES;
+       current_cpu_data.dcache.way_incr        = (1 << 14);
+       current_cpu_data.dcache.entry_shift     = 5;
+       current_cpu_data.dcache.sets            = 512;
+       current_cpu_data.dcache.ways            = 1;
+       current_cpu_data.dcache.linesz          = L1_CACHE_BYTES;
 
        /*
         * Setup some generic flags we can probe
@@ -57,16 +56,16 @@ int __init detect_cpu_and_cache_system(void)
         */
        if (((pvr >> 16) & 0xff) == 0x10) {
                if ((cvr & 0x02000000) == 0)
-                       cpu_data->flags |= CPU_HAS_L2_CACHE;
+                       current_cpu_data.flags |= CPU_HAS_L2_CACHE;
                if ((cvr & 0x10000000) == 0)
-                       cpu_data->flags |= CPU_HAS_DSP;
+                       current_cpu_data.flags |= CPU_HAS_DSP;
 
-               cpu_data->flags |= CPU_HAS_LLSC;
+               current_cpu_data.flags |= CPU_HAS_LLSC;
        }
 
        /* FPU detection works for everyone */
        if ((cvr & 0x20000000) == 1)
-               cpu_data->flags |= CPU_HAS_FPU;
+               current_cpu_data.flags |= CPU_HAS_FPU;
 
        /* Mask off the upper chip ID */
        pvr &= 0xffff;
@@ -77,151 +76,151 @@ int __init detect_cpu_and_cache_system(void)
         */
        switch (pvr) {
        case 0x205:
-               cpu_data->type = CPU_SH7750;
-               cpu_data->flags |= CPU_HAS_P2_FLUSH_BUG | CPU_HAS_FPU |
+               current_cpu_data.type = CPU_SH7750;
+               current_cpu_data.flags |= CPU_HAS_P2_FLUSH_BUG | CPU_HAS_FPU |
                                   CPU_HAS_PERF_COUNTER;
                break;
        case 0x206:
-               cpu_data->type = CPU_SH7750S;
-               cpu_data->flags |= CPU_HAS_P2_FLUSH_BUG | CPU_HAS_FPU |
+               current_cpu_data.type = CPU_SH7750S;
+               current_cpu_data.flags |= CPU_HAS_P2_FLUSH_BUG | CPU_HAS_FPU |
                                   CPU_HAS_PERF_COUNTER;
                break;
        case 0x1100:
-               cpu_data->type = CPU_SH7751;
-               cpu_data->flags |= CPU_HAS_FPU;
+               current_cpu_data.type = CPU_SH7751;
+               current_cpu_data.flags |= CPU_HAS_FPU;
                break;
        case 0x2000:
-               cpu_data->type = CPU_SH73180;
-               cpu_data->icache.ways = 4;
-               cpu_data->dcache.ways = 4;
-               cpu_data->flags |= CPU_HAS_LLSC;
+               current_cpu_data.type = CPU_SH73180;
+               current_cpu_data.icache.ways = 4;
+               current_cpu_data.dcache.ways = 4;
+               current_cpu_data.flags |= CPU_HAS_LLSC;
                break;
        case 0x2001:
        case 0x2004:
-               cpu_data->type = CPU_SH7770;
-               cpu_data->icache.ways = 4;
-               cpu_data->dcache.ways = 4;
+               current_cpu_data.type = CPU_SH7770;
+               current_cpu_data.icache.ways = 4;
+               current_cpu_data.dcache.ways = 4;
 
-               cpu_data->flags |= CPU_HAS_FPU | CPU_HAS_LLSC;
+               current_cpu_data.flags |= CPU_HAS_FPU | CPU_HAS_LLSC;
                break;
        case 0x2006:
        case 0x200A:
                if (prr == 0x61)
-                       cpu_data->type = CPU_SH7781;
+                       current_cpu_data.type = CPU_SH7781;
                else
-                       cpu_data->type = CPU_SH7780;
+                       current_cpu_data.type = CPU_SH7780;
 
-               cpu_data->icache.ways = 4;
-               cpu_data->dcache.ways = 4;
+               current_cpu_data.icache.ways = 4;
+               current_cpu_data.dcache.ways = 4;
 
-               cpu_data->flags |= CPU_HAS_FPU | CPU_HAS_PERF_COUNTER |
+               current_cpu_data.flags |= CPU_HAS_FPU | CPU_HAS_PERF_COUNTER |
                                   CPU_HAS_LLSC;
                break;
        case 0x3000:
        case 0x3003:
        case 0x3009:
-               cpu_data->type = CPU_SH7343;
-               cpu_data->icache.ways = 4;
-               cpu_data->dcache.ways = 4;
-               cpu_data->flags |= CPU_HAS_LLSC;
+               current_cpu_data.type = CPU_SH7343;
+               current_cpu_data.icache.ways = 4;
+               current_cpu_data.dcache.ways = 4;
+               current_cpu_data.flags |= CPU_HAS_LLSC;
                break;
        case 0x3008:
                if (prr == 0xa0) {
-                       cpu_data->type = CPU_SH7722;
-                       cpu_data->icache.ways = 4;
-                       cpu_data->dcache.ways = 4;
-                       cpu_data->flags |= CPU_HAS_LLSC;
+                       current_cpu_data.type = CPU_SH7722;
+                       current_cpu_data.icache.ways = 4;
+                       current_cpu_data.dcache.ways = 4;
+                       current_cpu_data.flags |= CPU_HAS_LLSC;
                }
                break;
        case 0x8000:
-               cpu_data->type = CPU_ST40RA;
-               cpu_data->flags |= CPU_HAS_FPU;
+               current_cpu_data.type = CPU_ST40RA;
+               current_cpu_data.flags |= CPU_HAS_FPU;
                break;
        case 0x8100:
-               cpu_data->type = CPU_ST40GX1;
-               cpu_data->flags |= CPU_HAS_FPU;
+               current_cpu_data.type = CPU_ST40GX1;
+               current_cpu_data.flags |= CPU_HAS_FPU;
                break;
        case 0x700:
-               cpu_data->type = CPU_SH4_501;
-               cpu_data->icache.ways = 2;
-               cpu_data->dcache.ways = 2;
+               current_cpu_data.type = CPU_SH4_501;
+               current_cpu_data.icache.ways = 2;
+               current_cpu_data.dcache.ways = 2;
                break;
        case 0x600:
-               cpu_data->type = CPU_SH4_202;
-               cpu_data->icache.ways = 2;
-               cpu_data->dcache.ways = 2;
-               cpu_data->flags |= CPU_HAS_FPU;
+               current_cpu_data.type = CPU_SH4_202;
+               current_cpu_data.icache.ways = 2;
+               current_cpu_data.dcache.ways = 2;
+               current_cpu_data.flags |= CPU_HAS_FPU;
                break;
        case 0x500 ... 0x501:
                switch (prr) {
                case 0x10:
-                       cpu_data->type = CPU_SH7750R;
+                       current_cpu_data.type = CPU_SH7750R;
                        break;
                case 0x11:
-                       cpu_data->type = CPU_SH7751R;
+                       current_cpu_data.type = CPU_SH7751R;
                        break;
                case 0x50 ... 0x5f:
-                       cpu_data->type = CPU_SH7760;
+                       current_cpu_data.type = CPU_SH7760;
                        break;
                }
 
-               cpu_data->icache.ways = 2;
-               cpu_data->dcache.ways = 2;
+               current_cpu_data.icache.ways = 2;
+               current_cpu_data.dcache.ways = 2;
 
-               cpu_data->flags |= CPU_HAS_FPU;
+               current_cpu_data.flags |= CPU_HAS_FPU;
 
                break;
        default:
-               cpu_data->type = CPU_SH_NONE;
+               current_cpu_data.type = CPU_SH_NONE;
                break;
        }
 
 #ifdef CONFIG_SH_DIRECT_MAPPED
-       cpu_data->icache.ways = 1;
-       cpu_data->dcache.ways = 1;
+       current_cpu_data.icache.ways = 1;
+       current_cpu_data.dcache.ways = 1;
 #endif
 
 #ifdef CONFIG_CPU_HAS_PTEA
-       cpu_data->flags |= CPU_HAS_PTEA;
+       current_cpu_data.flags |= CPU_HAS_PTEA;
 #endif
 
        /*
         * On anything that's not a direct-mapped cache, look to the CVR
         * for I/D-cache specifics.
         */
-       if (cpu_data->icache.ways > 1) {
+       if (current_cpu_data.icache.ways > 1) {
                size = sizes[(cvr >> 20) & 0xf];
-               cpu_data->icache.way_incr       = (size >> 1);
-               cpu_data->icache.sets           = (size >> 6);
+               current_cpu_data.icache.way_incr        = (size >> 1);
+               current_cpu_data.icache.sets            = (size >> 6);
 
        }
 
        /* Setup the rest of the I-cache info */
-       cpu_data->icache.entry_mask = cpu_data->icache.way_incr -
-                                     cpu_data->icache.linesz;
+       current_cpu_data.icache.entry_mask = current_cpu_data.icache.way_incr -
+                                     current_cpu_data.icache.linesz;
 
-       cpu_data->icache.way_size = cpu_data->icache.sets *
-                                   cpu_data->icache.linesz;
+       current_cpu_data.icache.way_size = current_cpu_data.icache.sets *
+                                   current_cpu_data.icache.linesz;
 
        /* And the rest of the D-cache */
-       if (cpu_data->dcache.ways > 1) {
+       if (current_cpu_data.dcache.ways > 1) {
                size = sizes[(cvr >> 16) & 0xf];
-               cpu_data->dcache.way_incr       = (size >> 1);
-               cpu_data->dcache.sets           = (size >> 6);
+               current_cpu_data.dcache.way_incr        = (size >> 1);
+               current_cpu_data.dcache.sets            = (size >> 6);
        }
 
-       cpu_data->dcache.entry_mask = cpu_data->dcache.way_incr -
-                                     cpu_data->dcache.linesz;
+       current_cpu_data.dcache.entry_mask = current_cpu_data.dcache.way_incr -
+                                     current_cpu_data.dcache.linesz;
 
-       cpu_data->dcache.way_size = cpu_data->dcache.sets *
-                                   cpu_data->dcache.linesz;
+       current_cpu_data.dcache.way_size = current_cpu_data.dcache.sets *
+                                   current_cpu_data.dcache.linesz;
 
        /*
         * Setup the L2 cache desc
         *
         * SH-4A's have an optional PIPT L2.
         */
-       if (cpu_data->flags & CPU_HAS_L2_CACHE) {
+       if (current_cpu_data.flags & CPU_HAS_L2_CACHE) {
                /*
                 * Size calculation is much more sensible
                 * than it is for the L1.
@@ -232,16 +231,22 @@ int __init detect_cpu_and_cache_system(void)
 
                BUG_ON(!size);
 
-               cpu_data->scache.way_incr       = (1 << 16);
-               cpu_data->scache.entry_shift    = 5;
-               cpu_data->scache.ways           = 4;
-               cpu_data->scache.linesz         = L1_CACHE_BYTES;
-               cpu_data->scache.entry_mask     =
-                       (cpu_data->scache.way_incr - cpu_data->scache.linesz);
-               cpu_data->scache.sets           = size /
-                       (cpu_data->scache.linesz * cpu_data->scache.ways);
-               cpu_data->scache.way_size       =
-                       (cpu_data->scache.sets * cpu_data->scache.linesz);
+               current_cpu_data.scache.way_incr        = (1 << 16);
+               current_cpu_data.scache.entry_shift     = 5;
+               current_cpu_data.scache.ways            = 4;
+               current_cpu_data.scache.linesz          = L1_CACHE_BYTES;
+
+               current_cpu_data.scache.entry_mask      =
+                       (current_cpu_data.scache.way_incr -
+                        current_cpu_data.scache.linesz);
+
+               current_cpu_data.scache.sets            = size /
+                       (current_cpu_data.scache.linesz *
+                        current_cpu_data.scache.ways);
+
+               current_cpu_data.scache.way_size        =
+                       (current_cpu_data.scache.sets *
+                        current_cpu_data.scache.linesz);
        }
 
        return 0;
index cbac27634c0b23441409c7835dcb9a914bf2706c..6f8f458912c7c5759844f94023e5c896640303ba 100644 (file)
@@ -46,11 +46,13 @@ static struct platform_device rtc_device = {
 
 static struct plat_sci_port sci_platform_data[] = {
        {
+#ifndef CONFIG_SH_RTS7751R2D
                .mapbase        = 0xffe00000,
                .flags          = UPF_BOOT_AUTOCONF,
                .type           = PORT_SCI,
                .irqs           = { 23, 24, 25, 0 },
        }, {
+#endif
                .mapbase        = 0xffe80000,
                .flags          = UPF_BOOT_AUTOCONF,
                .type           = PORT_SCIF,
@@ -101,7 +103,7 @@ static struct ipr_data sh7750_ipr_map[] = {
        { 35, 2,  8, 7 }, /* DMAC DMTE1 */
        { 36, 2,  8, 7 }, /* DMAC DMTE2 */
        { 37, 2,  8, 7 }, /* DMAC DMTE3 */
-       { 28, 2,  8, 7 }, /* DMAC DMAE */
+       { 38, 2,  8, 7 }, /* DMAC DMAE */
 };
 
 static struct ipr_data sh7751_ipr_map[] = {
index 07e5377bf55016edfb299b52a9a0e2896db386df..b7c702821e6fed19ef060e0e2469ec7619246c71 100644 (file)
@@ -52,17 +52,11 @@ static int __init sh7760_devices_setup(void)
 }
 __initcall(sh7760_devices_setup);
 
-/*
- * SH7760 INTC2-Style interrupts, vectors IRQ48-111 INTEVT 0x800-0xFE0
- */
 static struct intc2_data intc2_irq_table[] = {
-       /* INTPRIO0 | INTMSK0 */
        {48,  0, 28, 0, 31,  3},        /* IRQ 4 */
        {49,  0, 24, 0, 30,  3},        /* IRQ 3 */
        {50,  0, 20, 0, 29,  3},        /* IRQ 2 */
        {51,  0, 16, 0, 28,  3},        /* IRQ 1 */
-       /* 52-55 (INTEVT 0x880-0x8E0) unused/reserved */
-       /* INTPRIO4 | INTMSK0 */
        {56,  4, 28, 0, 25,  3},        /* HCAN2_CHAN0 */
        {57,  4, 24, 0, 24,  3},        /* HCAN2_CHAN1 */
        {58,  4, 20, 0, 23,  3},        /* I2S_CHAN0   */
@@ -71,18 +65,15 @@ static struct intc2_data intc2_irq_table[] = {
        {61,  4,  8, 0, 20,  3},        /* AC97_CHAN1  */
        {62,  4,  4, 0, 19,  3},        /* I2C_CHAN0   */
        {63,  4,  0, 0, 18,  3},        /* I2C_CHAN1   */
-       /* INTPRIO8 | INTMSK0 */
        {52,  8, 16, 0, 11,  3},        /* SCIF0_ERI_IRQ */
        {53,  8, 16, 0, 10,  3},        /* SCIF0_RXI_IRQ */
        {54,  8, 16, 0,  9,  3},        /* SCIF0_BRI_IRQ */
        {55,  8, 16, 0,  8,  3},        /* SCIF0_TXI_IRQ */
        {64,  8, 28, 0, 17,  3},        /* USBHI_IRQ */
        {65,  8, 24, 0, 16,  3},        /* LCDC      */
-       /* 66, 67 unused */
        {68,  8, 20, 0, 14, 13},        /* DMABRGI0_IRQ */
        {69,  8, 20, 0, 13, 13},        /* DMABRGI1_IRQ */
        {70,  8, 20, 0, 12, 13},        /* DMABRGI2_IRQ */
-       /* 71 unused */
        {72,  8, 12, 0,  7,  3},        /* SCIF1_ERI_IRQ */
        {73,  8, 12, 0,  6,  3},        /* SCIF1_RXI_IRQ */
        {74,  8, 12, 0,  5,  3},        /* SCIF1_BRI_IRQ */
@@ -91,26 +82,71 @@ static struct intc2_data intc2_irq_table[] = {
        {77,  8,  8, 0,  2,  3},        /* SCIF2_RXI_IRQ */
        {78,  8,  8, 0,  1,  3},        /* SCIF2_BRI_IRQ */
        {79,  8,  8, 0,  0,  3},        /* SCIF2_TXI_IRQ */
-       /*          | INTMSK4 */
        {80,  8,  4, 4, 23,  3},        /* SIM_ERI */
        {81,  8,  4, 4, 22,  3},        /* SIM_RXI */
        {82,  8,  4, 4, 21,  3},        /* SIM_TXI */
        {83,  8,  4, 4, 20,  3},        /* SIM_TEI */
        {84,  8,  0, 4, 19,  3},        /* HSPII */
-       /* INTPRIOC | INTMSK4 */
-       /* 85-87 unused/reserved */
        {88, 12, 20, 4, 18,  3},        /* MMCI0 */
        {89, 12, 20, 4, 17,  3},        /* MMCI1 */
        {90, 12, 20, 4, 16,  3},        /* MMCI2 */
        {91, 12, 20, 4, 15,  3},        /* MMCI3 */
-       {92, 12, 12, 4,  6,  3},        /* MFI (unsure, bug? in my 7760 manual*/
-       /* 93-107 reserved/undocumented */
+       {92, 12, 12, 4,  6,  3},        /* MFI */
        {108,12,  4, 4,  1,  3},        /* ADC  */
        {109,12,  0, 4,  0,  3},        /* CMTI */
-       /* 110-111 reserved/unused */
 };
 
+static struct ipr_data sh7760_ipr_map[] = {
+       /* IRQ, IPR-idx, shift, priority */
+       { 16, 0, 12, 2 }, /* TMU0 TUNI*/
+       { 17, 0,  8, 2 }, /* TMU1 TUNI */
+       { 18, 0,  4, 2 }, /* TMU2 TUNI */
+       { 19, 0,  4, 2 }, /* TMU2 TIPCI */
+       { 27, 1, 12, 2 }, /* WDT ITI */
+       { 28, 1,  8, 2 }, /* REF RCMI */
+       { 29, 1,  8, 2 }, /* REF ROVI */
+       { 32, 2,  0, 7 }, /* HUDI */
+       { 33, 2, 12, 7 }, /* GPIOI */
+       { 34, 2,  8, 7 }, /* DMAC DMTE0 */
+       { 35, 2,  8, 7 }, /* DMAC DMTE1 */
+       { 36, 2,  8, 7 }, /* DMAC DMTE2 */
+       { 37, 2,  8, 7 }, /* DMAC DMTE3 */
+       { 38, 2,  8, 7 }, /* DMAC DMAE */
+       { 44, 2,  8, 7 }, /* DMAC DMTE4 */
+       { 45, 2,  8, 7 }, /* DMAC DMTE5 */
+       { 46, 2,  8, 7 }, /* DMAC DMTE6 */
+       { 47, 2,  8, 7 }, /* DMAC DMTE7 */
+/* these here are only valid if INTC_ICR bit 7 is set to 1!
+ * XXX: maybe CONFIG_SH_IRLMODE symbol? SH7751 could use it too */
+#if 0
+       {  2, 3, 12, 3 }, /* IRL0 */
+       {  5, 3,  8, 3 }, /* IRL1 */
+       {  8, 3,  4, 3 }, /* IRL2 */
+       { 11, 3,  0, 3 }, /* IRL3 */
+#endif
+};
+
+static unsigned long ipr_offsets[] = {
+       0xffd00004UL,   /* 0: IPRA */
+       0xffd00008UL,   /* 1: IPRB */
+       0xffd0000cUL,   /* 2: IPRC */
+       0xffd00010UL,   /* 3: IPRD */
+};
+
+/* given the IPR index return the address of the IPR register */
+unsigned int map_ipridx_to_addr(int idx)
+{
+       if (idx >= ARRAY_SIZE(ipr_offsets))
+               return 0;
+       return ipr_offsets[idx];
+}
+
 void __init init_IRQ_intc2(void)
 {
        make_intc2_irq(intc2_irq_table, ARRAY_SIZE(intc2_irq_table));
 }
+
+void __init  init_IRQ_ipr(void)
+{
+       make_ipr_irq(sh7760_ipr_map, ARRAY_SIZE(sh7760_ipr_map));
+}
diff --git a/arch/sh/kernel/debugtraps.S b/arch/sh/kernel/debugtraps.S
new file mode 100644 (file)
index 0000000..13b6674
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * arch/sh/kernel/debugtraps.S
+ *
+ * Debug trap jump tables for SuperH
+ *
+ *  Copyright (C) 2006  Paul Mundt
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file "COPYING" in the main directory of this archive
+ * for more details.
+ */
+#include <linux/sys.h>
+#include <linux/linkage.h>
+
+#if !defined(CONFIG_SH_KGDB)
+#define kgdb_handle_exception  debug_trap_handler
+#endif
+
+#if !defined(CONFIG_SH_STANDARD_BIOS)
+#define sh_bios_handler                debug_trap_handler
+#endif
+
+       .data
+
+ENTRY(debug_trap_table)
+       .long debug_trap_handler        /* 0x30 */
+       .long debug_trap_handler        /* 0x31 */
+       .long debug_trap_handler        /* 0x32 */
+       .long debug_trap_handler        /* 0x33 */
+       .long debug_trap_handler        /* 0x34 */
+       .long debug_trap_handler        /* 0x35 */
+       .long debug_trap_handler        /* 0x36 */
+       .long debug_trap_handler        /* 0x37 */
+       .long debug_trap_handler        /* 0x38 */
+       .long debug_trap_handler        /* 0x39 */
+       .long debug_trap_handler        /* 0x3a */
+       .long debug_trap_handler        /* 0x3b */
+       .long kgdb_handle_exception     /* 0x3c */
+       .long debug_trap_handler        /* 0x3d */
+       .long bug_trap_handler          /* 0x3e */
+       .long sh_bios_handler           /* 0x3f */
index 560b91cdd15ced07aef986db027f9b3ad6daf1fa..9048c0326d879452cee49cfbccec42d4812aae26 100644 (file)
@@ -106,12 +106,32 @@ static struct console scif_console = {
 };
 
 #if defined(CONFIG_CPU_SH4) && !defined(CONFIG_SH_STANDARD_BIOS)
+#define DEFAULT_BAUD 115200
 /*
  * Simple SCIF init, primarily aimed at SH7750 and other similar SH-4
  * devices that aren't using sh-ipl+g.
  */
-static void scif_sercon_init(int baud)
+static void scif_sercon_init(char *s)
 {
+       unsigned baud = DEFAULT_BAUD;
+       char *e;
+
+       if (*s == ',')
+               ++s;
+
+       if (*s) {
+               /* ignore ioport/device name */
+               s += strcspn(s, ",");
+               if (*s == ',')
+                       s++;
+       }
+
+       if (*s) {
+               baud = simple_strtoul(s, &e, 0);
+               if (baud == 0 || s == e)
+                       baud = DEFAULT_BAUD;
+       }
+
        ctrl_outw(0, scif_port.mapbase + 8);
        ctrl_outw(0, scif_port.mapbase);
 
@@ -167,7 +187,7 @@ int __init setup_early_printk(char *buf)
                early_console = &scif_console;
 
 #if defined(CONFIG_CPU_SH4) && !defined(CONFIG_SH_STANDARD_BIOS)
-               scif_sercon_init(115200);
+               scif_sercon_init(buf + 6);
 #endif
        }
 #endif
index fc279aeb73ab946c83106be747659f1d2fb04e48..ab4ebb856c2a3cc7ca9f2e75ceb94c32ebdc1c22 100644 (file)
 #  define resume_kernel                __restore_all
 #endif
 
-#if defined(CONFIG_SH_STANDARD_BIOS) || defined(CONFIG_SH_KGDB)
-! Handle kernel debug if either kgdb (SW) or gdb-stub (FW) is present.
-! If both are configured, handle the debug traps (breakpoints) in SW,
-! but still allow BIOS traps to FW.
-
-       .align  2
-debug_kernel:
-#if defined(CONFIG_SH_STANDARD_BIOS) && defined(CONFIG_SH_KGDB)
-       /* Force BIOS call to FW (debug_trap put TRA in r8) */
-       mov     r8,r0
-       shlr2   r0
-       cmp/eq  #0x3f,r0
-       bt      debug_kernel_fw
-#endif /* CONFIG_SH_STANDARD_BIOS && CONFIG_SH_KGDB */
-
-debug_enter:           
-#if defined(CONFIG_SH_KGDB)
-       /* Jump to kgdb, pass stacked regs as arg */
-debug_kernel_sw:
-       mov.l   3f, r0
-       jmp     @r0
-        mov    r15, r4
-       .align  2
-3:     .long   kgdb_handle_exception
-#endif /* CONFIG_SH_KGDB */
-#ifdef CONFIG_SH_STANDARD_BIOS
-       bra     debug_kernel_fw
-        nop
-#endif
-#endif /* CONFIG_SH_STANDARD_BIOS || CONFIG_SH_KGDB */
-
-       .align  2
-debug_trap:    
-#if defined(CONFIG_SH_STANDARD_BIOS) || defined(CONFIG_SH_KGDB)
-       mov     r8, r0
-       shlr2   r0
-       cmp/eq  #0x3f, r0               ! sh_bios() trap
-       bf      1f
-#ifdef CONFIG_SH_KGDB
-       cmp/eq  #0xff, r0               ! XXX: KGDB trap, fix for SH-2.
-       bf      1f
-#endif
-       mov     #OFF_SR, r0
-       mov.l   @(r0,r15), r0           ! get status register
-       shll    r0
-       shll    r0                      ! kernel space?
-       bt/s    debug_kernel
-1:
-#endif
-        mov.l  @r15, r0                ! Restore R0 value
-       mov.l   1f, r8
-       jmp     @r8
-        nop
 
        .align  2
 ENTRY(exception_error)
        !
 #ifdef CONFIG_TRACE_IRQFLAGS
-       mov.l   3f, r0
+       mov.l   2f, r0
        jsr     @r0
         nop
 #endif
        sti
-       mov.l   2f, r0
+       mov.l   1f, r0
        jmp     @r0
         nop
 
-!
        .align  2
-1:     .long   break_point_trap_software
-2:     .long   do_exception_error
+1:     .long   do_exception_error
 #ifdef CONFIG_TRACE_IRQFLAGS
-3:     .long   trace_hardirqs_on
+2:     .long   trace_hardirqs_on
 #endif
 
        .align  2
@@ -330,17 +275,32 @@ __restore_all:
        .align  2
 1:     .long   restore_all
 
-       .align  2
-not_syscall_tra:       
-       bra     debug_trap
-        nop
-
        .align  2
 syscall_badsys:                        ! Bad syscall number
        mov     #-ENOSYS, r0
        bra     resume_userspace
         mov.l  r0, @(OFF_R0,r15)       ! Return value
-       
+
+/*
+ * The main debug trap handler.
+ *
+ * r8=TRA (not the trap number!)
+ *
+ * Note: This assumes that the trapa value is left in its original
+ * form (without the shlr2 shift) so the calculation for the jump
+ * call table offset remains a simple in place mask.
+ */
+debug_trap:
+       mov     r8, r0
+       and     #(0xf << 2), r0
+       mov.l   1f, r8
+       add     r0, r8
+       mov.l   @r8, r8
+       jmp     @r8
+        nop
+
+       .align  2
+1:     .long   debug_trap_table
 
 /*
  * Syscall interface:
@@ -348,17 +308,19 @@ syscall_badsys:                   ! Bad syscall number
  *     Syscall #: R3
  *     Arguments #0 to #3: R4--R7
  *     Arguments #4 to #6: R0, R1, R2
- *     TRA: (number of arguments + 0x10) x 4
+ *     TRA: (number of arguments + ABI revision) x 4
  *
  * This code also handles delegating other traps to the BIOS/gdb stub
  * according to:
  *
  * Trap number
- * (TRA>>2)        Purpose
- * --------        -------
- * 0x0-0xf         old syscall ABI
- * 0x10-0x1f       new syscall ABI
- * 0x20-0xff       delegated through debug_trap to BIOS/gdb stub.
+ * (TRA>>2)    Purpose
+ * --------    -------
+ * 0x00-0x0f   original SH-3/4 syscall ABI (not in general use).
+ * 0x10-0x1f   general SH-3/4 syscall ABI.
+ * 0x20-0x2f   syscall ABI for SH-2 parts.
+ * 0x30-0x3f   debug traps used by the kernel.
+ * 0x40-0xff   Not supported by all parts, so left unhandled.
  *
  * Note: When we're first called, the TRA value must be shifted
  * right 2 bits in order to get the value that was used as the "trapa"
@@ -375,17 +337,22 @@ ret_from_fork:
         nop
        .align  2
 1:     .long   schedule_tail
-       !
+
+/*
+ * The poorly named main trapa decode and dispatch routine, for
+ * system calls and debug traps through their respective jump tables.
+ */
 ENTRY(system_call)
 #if !defined(CONFIG_CPU_SH2)
        mov.l   1f, r9
        mov.l   @r9, r8         ! Read from TRA (Trap Address) Register
 #endif
-       !
-       ! Is the trap argument >= 0x20? (TRA will be >= 0x80)
-       mov     #0x7f, r9
+       /*
+        * Check the trap type
+        */
+       mov     #((0x20 << 2) - 1), r9
        cmp/hi  r9, r8
-       bt/s    not_syscall_tra
+       bt/s    debug_trap              ! it's a debug trap..
         mov    #OFF_TRA, r9
        add     r15, r9
        mov.l   r8, @r9                 ! set TRA value to tra
index 28ec7487de8ce2461e035964d20805a9f8f9c2ee..66626c03e1eeb4b8e72f09871f6e83f1daa1b1c5 100644 (file)
@@ -1,9 +1,8 @@
-/* $Id: io_generic.c,v 1.2 2003/05/04 19:29:53 lethal Exp $
- *
- * linux/arch/sh/kernel/io_generic.c
+/*
+ * arch/sh/kernel/io_generic.c
  *
  * Copyright (C) 2000  Niibe Yutaka
- * Copyright (C) 2005  Paul Mundt
+ * Copyright (C) 2005 - 2007 Paul Mundt
  *
  * Generic I/O routine. These can be used where a machine specific version
  * is not required.
@@ -13,8 +12,9 @@
  * for more details.
  */
 #include <linux/module.h>
-#include <asm/io.h>
+#include <linux/io.h>
 #include <asm/machvec.h>
+#include <asm/cacheflush.h>
 
 #ifdef CONFIG_CPU_SH3
 /* SH3 has a PCMCIA bug that needs a dummy read from area 6 for a
@@ -96,6 +96,7 @@ void generic_insw(unsigned long port, void *dst, unsigned long count)
        while (count--)
                *buf++ = *port_addr;
 
+       flush_dcache_all();
        dummy_read();
 }
 
@@ -170,6 +171,7 @@ void generic_outsw(unsigned long port, const void *src, unsigned long count)
        while (count--)
                *port_addr = *buf++;
 
+       flush_dcache_all();
        dummy_read();
 }
 
index 9c6315f0335dfdc45bac2f8aa47a3fc9fa0adb11..d8927d85492e389d84cb954e6b150714e15d6938 100644 (file)
@@ -1323,8 +1323,11 @@ static void kgdb_command_loop(const int excep_code, const int trapa_value)
 }
 
 /* There has been an exception, most likely a breakpoint. */
-void kgdb_handle_exception(struct pt_regs *regs)
+asmlinkage void kgdb_handle_exception(unsigned long r4, unsigned long r5,
+                                     unsigned long r6, unsigned long r7,
+                                     struct pt_regs __regs)
 {
+       struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
        int excep_code, vbr_val;
        int count;
        int trapa_value = ctrl_inl(TRA);
@@ -1368,8 +1371,6 @@ void kgdb_handle_exception(struct pt_regs *regs)
 
        vbr_val = trap_registers.vbr;
        asm("ldc %0, vbr": :"r"(vbr_val));
-
-       return;
 }
 
 /* Trigger a breakpoint by function */
index 486c06e180333404baf796be54b796b110d7f448..9d6a438b3eaf7a8e7692e69eab757886c9ee952d 100644 (file)
@@ -1,42 +1,30 @@
-/* $Id: process.c,v 1.28 2004/05/05 16:54:23 lethal Exp $
+/*
+ * arch/sh/kernel/process.c
  *
- *  linux/arch/sh/kernel/process.c
+ * This file handles the architecture-dependent parts of process handling..
  *
  *  Copyright (C) 1995  Linus Torvalds
  *
  *  SuperH version:  Copyright (C) 1999, 2000  Niibe Yutaka & Kaz Kojima
  *                  Copyright (C) 2006 Lineo Solutions Inc. support SH4A UBC
+ *                  Copyright (C) 2002 - 2006  Paul Mundt
  */
-
-/*
- * This file handles the architecture-dependent parts of process handling..
- */
-
 #include <linux/module.h>
-#include <linux/unistd.h>
 #include <linux/mm.h>
 #include <linux/elfcore.h>
-#include <linux/a.out.h>
-#include <linux/slab.h>
 #include <linux/pm.h>
-#include <linux/ptrace.h>
 #include <linux/kallsyms.h>
 #include <linux/kexec.h>
-
-#include <asm/io.h>
 #include <asm/uaccess.h>
 #include <asm/mmu_context.h>
-#include <asm/elf.h>
 #include <asm/ubc.h>
 
-static int hlt_counter=0;
-
+static int hlt_counter;
 int ubc_usercnt = 0;
 
 #define HARD_IDLE_TIMEOUT (HZ / 3)
 
 void (*pm_idle)(void);
-
 void (*pm_power_off)(void);
 EXPORT_SYMBOL(pm_power_off);
 
@@ -44,14 +32,12 @@ void disable_hlt(void)
 {
        hlt_counter++;
 }
-
 EXPORT_SYMBOL(disable_hlt);
 
 void enable_hlt(void)
 {
        hlt_counter--;
 }
-
 EXPORT_SYMBOL(enable_hlt);
 
 void default_idle(void)
@@ -152,19 +138,21 @@ __asm__(".align 5\n"
        ".align 2\n\t"
        "1:.long do_exit");
 
+/* Don't use this in BL=1(cli).  Or else, CPU resets! */
 int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
-{      /* Don't use this in BL=1(cli).  Or else, CPU resets! */
+{
        struct pt_regs regs;
 
        memset(&regs, 0, sizeof(regs));
-       regs.regs[4] = (unsigned long) arg;
-       regs.regs[5] = (unsigned long) fn;
+       regs.regs[4] = (unsigned long)arg;
+       regs.regs[5] = (unsigned long)fn;
 
-       regs.pc = (unsigned long) kernel_thread_helper;
+       regs.pc = (unsigned long)kernel_thread_helper;
        regs.sr = (1 << 30);
 
        /* Ok, create the new process.. */
-       return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0, NULL, NULL);
+       return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0,
+                      &regs, 0, NULL, NULL);
 }
 
 /*
@@ -211,21 +199,20 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu)
        return fpvalid;
 }
 
-/* 
+/*
  * Capture the user space registers if the task is not running (in user space)
  */
 int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs)
 {
        struct pt_regs ptregs;
-       
+
        ptregs = *task_pt_regs(tsk);
        elf_core_copy_regs(regs, &ptregs);
 
        return 1;
 }
 
-int
-dump_task_fpu (struct task_struct *tsk, elf_fpregset_t *fpu)
+int dump_task_fpu(struct task_struct *tsk, elf_fpregset_t *fpu)
 {
        int fpvalid = 0;
 
@@ -263,12 +250,14 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
                childregs->regs[15] = usp;
                ti->addr_limit = USER_DS;
        } else {
-               childregs->regs[15] = (unsigned long)task_stack_page(p) + THREAD_SIZE;
+               childregs->regs[15] = (unsigned long)task_stack_page(p) +
+                                                       THREAD_SIZE;
                ti->addr_limit = KERNEL_DS;
        }
-        if (clone_flags & CLONE_SETTLS) {
+
+        if (clone_flags & CLONE_SETTLS)
                childregs->gbr = childregs->regs[0];
-       }
+
        childregs->regs[0] = 0; /* Set return value for child */
 
        p->thread.sp = (unsigned long) childregs;
@@ -280,8 +269,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
 }
 
 /* Tracing by user break controller.  */
-static void
-ubc_set_tracing(int asid, unsigned long pc)
+static void ubc_set_tracing(int asid, unsigned long pc)
 {
 #if defined(CONFIG_CPU_SH4A)
        unsigned long val;
@@ -297,7 +285,7 @@ ubc_set_tracing(int asid, unsigned long pc)
        val = (UBC_CRR_RES | UBC_CRR_PCB | UBC_CRR_BIE);
        ctrl_outl(val, UBC_CRR0);
 
-       /* Read UBC register that we writed last. For chekking UBC Register changed */
+       /* Read UBC register that we wrote last, for checking update */
        val = ctrl_inl(UBC_CRR0);
 
 #else  /* CONFIG_CPU_SH4A */
@@ -305,13 +293,14 @@ ubc_set_tracing(int asid, unsigned long pc)
 
 #ifdef CONFIG_MMU
        /* We don't have any ASID settings for the SH-2! */
-       if (cpu_data->type != CPU_SH7604)
+       if (current_cpu_data.type != CPU_SH7604)
                ctrl_outb(asid, UBC_BASRA);
 #endif
 
        ctrl_outl(0, UBC_BAMRA);
 
-       if (cpu_data->type == CPU_SH7729 || cpu_data->type == CPU_SH7710) {
+       if (current_cpu_data.type == CPU_SH7729 ||
+           current_cpu_data.type == CPU_SH7710) {
                ctrl_outw(BBR_INST | BBR_READ | BBR_CPU, UBC_BBRA);
                ctrl_outl(BRCR_PCBA | BRCR_PCTE, UBC_BRCR);
        } else {
@@ -325,7 +314,8 @@ ubc_set_tracing(int asid, unsigned long pc)
  *     switch_to(x,y) should switch tasks from x to y.
  *
  */
-struct task_struct *__switch_to(struct task_struct *prev, struct task_struct *next)
+struct task_struct *__switch_to(struct task_struct *prev,
+                               struct task_struct *next)
 {
 #if defined(CONFIG_SH_FPU)
        unlazy_fpu(prev, task_pt_regs(prev));
@@ -354,7 +344,7 @@ struct task_struct *__switch_to(struct task_struct *prev, struct task_struct *ne
 #ifdef CONFIG_MMU
        /*
         * Restore the kernel mode register
-        *      k7 (r7_bank1)
+        *      k7 (r7_bank1)
         */
        asm volatile("ldc       %0, r7_bank"
                     : /* no output */
@@ -367,7 +357,7 @@ struct task_struct *__switch_to(struct task_struct *prev, struct task_struct *ne
        else if (next->thread.ubc_pc && next->mm) {
                int asid = 0;
 #ifdef CONFIG_MMU
-               asid |= next->mm->context.id & MMU_CONTEXT_ASID_MASK;
+               asid |= cpu_asid(smp_processor_id(), next->mm);
 #endif
                ubc_set_tracing(asid, next->thread.ubc_pc);
        } else {
@@ -405,7 +395,8 @@ asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp,
        if (!newsp)
                newsp = regs->regs[15];
        return do_fork(clone_flags, newsp, regs, 0,
-                       (int __user *)parent_tidptr, (int __user *)child_tidptr);
+                       (int __user *)parent_tidptr,
+                       (int __user *)child_tidptr);
 }
 
 /*
@@ -493,9 +484,27 @@ asmlinkage void break_point_trap(void)
        force_sig(SIGTRAP, current);
 }
 
-asmlinkage void break_point_trap_software(unsigned long r4, unsigned long r5,
-                                         unsigned long r6, unsigned long r7,
-                                         struct pt_regs __regs)
+/*
+ * Generic trap handler.
+ */
+asmlinkage void debug_trap_handler(unsigned long r4, unsigned long r5,
+                                  unsigned long r6, unsigned long r7,
+                                  struct pt_regs __regs)
+{
+       struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
+
+       /* Rewind */
+       regs->pc -= 2;
+
+       force_sig(SIGTRAP, current);
+}
+
+/*
+ * Special handler for BUG() traps.
+ */
+asmlinkage void bug_trap_handler(unsigned long r4, unsigned long r5,
+                                unsigned long r6, unsigned long r7,
+                                struct pt_regs __regs)
 {
        struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
 
index 225f9ea5cdd7c8d0c7dadcf74664bde8576506d3..98802ab282114239f0d3d4cc401ace5dcd27cbcf 100644 (file)
@@ -1,14 +1,11 @@
 /*
- *  linux/arch/sh/kernel/setup.c
+ * arch/sh/kernel/setup.c
  *
- *  Copyright (C) 1999  Niibe Yutaka
- *  Copyright (C) 2002, 2003  Paul Mundt
- */
-
-/*
  * This file handles the architecture-dependent parts of initialization
+ *
+ *  Copyright (C) 1999  Niibe Yutaka
+ *  Copyright (C) 2002 - 2006 Paul Mundt
  */
-
 #include <linux/screen_info.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
@@ -75,7 +72,7 @@ static struct sh_machine_vector* __init get_mv_byname(const char* name);
 #define RAMDISK_PROMPT_FLAG            0x8000
 #define RAMDISK_LOAD_FLAG              0x4000
 
-static char command_line[COMMAND_LINE_SIZE] = { 0, };
+static char __initdata command_line[COMMAND_LINE_SIZE] = { 0, };
 
 static struct resource code_resource = { .name = "Kernel code", };
 static struct resource data_resource = { .name = "Kernel data", };
@@ -90,8 +87,8 @@ static inline void parse_cmdline (char ** cmdline_p, char mv_name[MV_NAME_SIZE],
        int len = 0;
 
        /* Save unparsed command line copy for /proc/cmdline */
-       memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
-       saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
+       memcpy(boot_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
+       boot_command_line[COMMAND_LINE_SIZE-1] = '\0';
 
        memory_start = (unsigned long)PAGE_OFFSET+__MEMORY_START;
        memory_end = memory_start + __MEMORY_SIZE;
@@ -395,9 +392,9 @@ static const char *cpu_name[] = {
        [CPU_SH_NONE]   = "Unknown"
 };
 
-const char *get_cpu_subtype(void)
+const char *get_cpu_subtype(struct sh_cpuinfo *c)
 {
-       return cpu_name[boot_cpu_data.type];
+       return cpu_name[c->type];
 }
 
 #ifdef CONFIG_PROC_FS
@@ -407,19 +404,19 @@ static const char *cpu_flags[] = {
        "ptea", "llsc", "l2", NULL
 };
 
-static void show_cpuflags(struct seq_file *m)
+static void show_cpuflags(struct seq_file *m, struct sh_cpuinfo *c)
 {
        unsigned long i;
 
        seq_printf(m, "cpu flags\t:");
 
-       if (!cpu_data->flags) {
+       if (!c->flags) {
                seq_printf(m, " %s\n", cpu_flags[0]);
                return;
        }
 
        for (i = 0; cpu_flags[i]; i++)
-               if ((cpu_data->flags & (1 << i)))
+               if ((c->flags & (1 << i)))
                        seq_printf(m, " %s", cpu_flags[i+1]);
 
        seq_printf(m, "\n");
@@ -441,16 +438,20 @@ static void show_cacheinfo(struct seq_file *m, const char *type,
  */
 static int show_cpuinfo(struct seq_file *m, void *v)
 {
-       unsigned int cpu = smp_processor_id();
+       struct sh_cpuinfo *c = v;
+       unsigned int cpu = c - cpu_data;
+
+       if (!cpu_online(cpu))
+               return 0;
 
-       if (!cpu && cpu_online(cpu))
+       if (cpu == 0)
                seq_printf(m, "machine\t\t: %s\n", get_system_type());
 
        seq_printf(m, "processor\t: %d\n", cpu);
        seq_printf(m, "cpu family\t: %s\n", init_utsname()->machine);
-       seq_printf(m, "cpu type\t: %s\n", get_cpu_subtype());
+       seq_printf(m, "cpu type\t: %s\n", get_cpu_subtype(c));
 
-       show_cpuflags(m);
+       show_cpuflags(m, c);
 
        seq_printf(m, "cache type\t: ");
 
@@ -459,22 +460,22 @@ static int show_cpuinfo(struct seq_file *m, void *v)
         * unified cache on the SH-2 and SH-3, as well as the harvard
         * style cache on the SH-4.
         */
-       if (boot_cpu_data.icache.flags & SH_CACHE_COMBINED) {
+       if (c->icache.flags & SH_CACHE_COMBINED) {
                seq_printf(m, "unified\n");
-               show_cacheinfo(m, "cache", boot_cpu_data.icache);
+               show_cacheinfo(m, "cache", c->icache);
        } else {
                seq_printf(m, "split (harvard)\n");
-               show_cacheinfo(m, "icache", boot_cpu_data.icache);
-               show_cacheinfo(m, "dcache", boot_cpu_data.dcache);
+               show_cacheinfo(m, "icache", c->icache);
+               show_cacheinfo(m, "dcache", c->dcache);
        }
 
        /* Optional secondary cache */
-       if (boot_cpu_data.flags & CPU_HAS_L2_CACHE)
-               show_cacheinfo(m, "scache", boot_cpu_data.scache);
+       if (c->flags & CPU_HAS_L2_CACHE)
+               show_cacheinfo(m, "scache", c->scache);
 
        seq_printf(m, "bogomips\t: %lu.%02lu\n",
-                    boot_cpu_data.loops_per_jiffy/(500000/HZ),
-                    (boot_cpu_data.loops_per_jiffy/(5000/HZ)) % 100);
+                    c->loops_per_jiffy/(500000/HZ),
+                    (c->loops_per_jiffy/(5000/HZ)) % 100);
 
        return show_clocks(m);
 }
index e6106239a0fec627120ee62c116fa830fb82322e..fe1b276c97c6140a1a8f2ae911ff0697af3a2734 100644 (file)
@@ -105,7 +105,6 @@ EXPORT_SYMBOL(__flush_purge_region);
 EXPORT_SYMBOL(clear_user_page);
 #endif
 
-EXPORT_SYMBOL(flush_tlb_page);
 EXPORT_SYMBOL(__down_trylock);
 
 #ifdef CONFIG_SMP
index 379c88bf5d9a0a8faeb50bd1ab39c6d524784e54..32f10a03fbb5e9388d27d1d889dffbff3df03b03 100644 (file)
@@ -127,7 +127,7 @@ static inline int restore_sigcontext_fpu(struct sigcontext __user *sc)
 {
        struct task_struct *tsk = current;
 
-       if (!(cpu_data->flags & CPU_HAS_FPU))
+       if (!(current_cpu_data.flags & CPU_HAS_FPU))
                return 0;
 
        set_used_math();
@@ -140,7 +140,7 @@ static inline int save_sigcontext_fpu(struct sigcontext __user *sc,
 {
        struct task_struct *tsk = current;
 
-       if (!(cpu_data->flags & CPU_HAS_FPU))
+       if (!(current_cpu_data.flags & CPU_HAS_FPU))
                return 0;
 
        if (!used_math()) {
@@ -181,7 +181,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *r0_p
 #undef COPY
 
 #ifdef CONFIG_SH_FPU
-       if (cpu_data->flags & CPU_HAS_FPU) {
+       if (current_cpu_data.flags & CPU_HAS_FPU) {
                int owned_fp;
                struct task_struct *tsk = current;
 
index ca81976e9e3485fb01f0a45d811f5e9a0bab702a..38fc8cd3ea3a12fbe35dc6a014d12b651eab6795 100644 (file)
@@ -319,15 +319,15 @@ ENTRY(sys_call_table)
        .long sys_mq_getsetattr
        .long sys_kexec_load
        .long sys_waitid
-       .long sys_ni_syscall            /* 285 */
-       .long sys_add_key
+       .long sys_add_key               /* 285 */
        .long sys_request_key
        .long sys_keyctl
        .long sys_ioprio_set
-       .long sys_ioprio_get            /* 290 */
-       .long sys_inotify_init
+       .long sys_ioprio_get
+       .long sys_inotify_init          /* 290 */
        .long sys_inotify_add_watch
        .long sys_inotify_rm_watch
+       .long sys_ni_syscall
        .long sys_migrate_pages
        .long sys_openat                /* 295 */
        .long sys_mkdirat
index c206c9504c4bb40da950a374ead73943f9ab36a4..d47e775962e955054f8e0296f4f3a5fdd65377e5 100644 (file)
@@ -41,14 +41,6 @@ static int null_rtc_set_time(const time_t secs)
 void (*rtc_sh_get_time)(struct timespec *) = null_rtc_get_time;
 int (*rtc_sh_set_time)(const time_t) = null_rtc_set_time;
 
-/*
- * Scheduler clock - returns current time in nanosec units.
- */
-unsigned long long __attribute__ ((weak)) sched_clock(void)
-{
-       return (unsigned long long)jiffies * (1000000000 / HZ);
-}
-
 #ifndef CONFIG_GENERIC_TIME
 void do_gettimeofday(struct timeval *tv)
 {
index ec110157992df81c91d8b38eddc3e5f4634894b4..e9f168f60f95ef2f99efaf7c06c95250e643d25e 100644 (file)
@@ -156,13 +156,13 @@ static inline void do_bug_verbose(struct pt_regs *regs)
 {
 }
 #endif /* CONFIG_DEBUG_BUGVERBOSE */
-#endif /* CONFIG_BUG */
 
 void handle_BUG(struct pt_regs *regs)
 {
        do_bug_verbose(regs);
        die("Kernel BUG", regs, TRAPA_BUG_OPCODE & 0xff);
 }
+#endif /* CONFIG_BUG */
 
 /*
  * handle an instruction that does an unaligned memory access by emulating the
@@ -641,7 +641,7 @@ int is_dsp_inst(struct pt_regs *regs)
         * Safe guard if DSP mode is already enabled or we're lacking
         * the DSP altogether.
         */
-       if (!(cpu_data->flags & CPU_HAS_DSP) || (regs->sr & SR_DSP))
+       if (!(current_cpu_data.flags & CPU_HAS_DSP) || (regs->sr & SR_DSP))
                return 0;
 
        get_user(inst, ((unsigned short *) regs->pc));
index f34bdcc33a7dd5a39124e7f3f1c543b48884353a..75de165867a0e75a83ac4220c493c5b10a530bfb 100644 (file)
@@ -83,9 +83,13 @@ SECTIONS
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
   SECURITY_INIT
+
+#ifdef CONFIG_BLK_DEV_INITRD
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
   __initramfs_end = .;
+#endif
+
   __machvec_start = .;
   .init.machvec : { *(.init.machvec) }
   __machvec_end = .;
index 29f4ee35c6dc44e356aa0cf59891e0253c71d929..6b0d28ac9241cd20e91ac5474af7d221c8161854 100644 (file)
@@ -20,7 +20,7 @@ config CPU_SH4
        bool
        select CPU_HAS_INTEVT
        select CPU_HAS_SR_RB
-       select CPU_HAS_PTEA if !CPU_SUBTYPE_ST40
+       select CPU_HAS_PTEA if (!CPU_SUBTYPE_ST40 && !CPU_SH4A) || CPU_SHX2
 
 config CPU_SH4A
        bool
@@ -72,6 +72,7 @@ config CPU_SUBTYPE_SH7705
 config CPU_SUBTYPE_SH7706
        bool "Support SH7706 processor"
        select CPU_SH3
+       select CPU_HAS_IPR_IRQ
        help
          Select SH7706 if you have a 133 Mhz SH-3 HD6417706 CPU.
 
@@ -92,6 +93,7 @@ config CPU_SUBTYPE_SH7708
 config CPU_SUBTYPE_SH7709
        bool "Support SH7709 processor"
        select CPU_SH3
+       select CPU_HAS_IPR_IRQ
        select CPU_HAS_PINT_IRQ
        help
          Select SH7709 if you have a  80 Mhz SH-3 HD6417709 CPU.
@@ -149,6 +151,7 @@ config CPU_SUBTYPE_SH7760
        bool "Support SH7760 processor"
        select CPU_SH4
        select CPU_HAS_INTC2_IRQ
+       select CPU_HAS_IPR_IRQ
 
 config CPU_SUBTYPE_SH4_202
        bool "Support SH4-202 processor"
index e0122bd33ddb6373771e0d10bc648063ff2d990d..de6d2c9aa4773c1b1b989b66fd2e764524c8c03d 100644 (file)
@@ -46,10 +46,10 @@ static int cache_seq_show(struct seq_file *file, void *iter)
 
        if (cache_type == CACHE_TYPE_DCACHE) {
                base = CACHE_OC_ADDRESS_ARRAY;
-               cache = &cpu_data->dcache;
+               cache = &current_cpu_data.dcache;
        } else {
                base = CACHE_IC_ADDRESS_ARRAY;
-               cache = &cpu_data->icache;
+               cache = &current_cpu_data.icache;
        }
 
        /*
@@ -114,7 +114,7 @@ static int cache_debugfs_open(struct inode *inode, struct file *file)
        return single_open(file, cache_seq_show, inode->i_private);
 }
 
-static struct file_operations cache_debugfs_fops = {
+static const struct file_operations cache_debugfs_fops = {
        .owner          = THIS_MODULE,
        .open           = cache_debugfs_open,
        .read           = seq_read,
index 838731fc608dd6459178fc5fa5ecd9ef440b2629..6d1dbec08ad4694fd1b8ba57b47cfc1f50c6247a 100644 (file)
@@ -44,11 +44,11 @@ void __flush_wback_region(void *start, int size)
 
        for (v = begin; v < end; v+=L1_CACHE_BYTES) {
                unsigned long addrstart = CACHE_OC_ADDRESS_ARRAY;
-               for (j = 0; j < cpu_data->dcache.ways; j++) {
+               for (j = 0; j < current_cpu_data.dcache.ways; j++) {
                        unsigned long data, addr, p;
 
                        p = __pa(v);
-                       addr = addrstart | (v & cpu_data->dcache.entry_mask);
+                       addr = addrstart | (v & current_cpu_data.dcache.entry_mask);
                        local_irq_save(flags);
                        data = ctrl_inl(addr);
 
@@ -60,7 +60,7 @@ void __flush_wback_region(void *start, int size)
                                break;
                        }
                        local_irq_restore(flags);
-                       addrstart += cpu_data->dcache.way_incr;
+                       addrstart += current_cpu_data.dcache.way_incr;
                }
        }
 }
@@ -85,7 +85,7 @@ void __flush_purge_region(void *start, int size)
 
                data = (v & 0xfffffc00); /* _Virtual_ address, ~U, ~V */
                addr = CACHE_OC_ADDRESS_ARRAY |
-                       (v & cpu_data->dcache.entry_mask) | SH_CACHE_ASSOC;
+                       (v & current_cpu_data.dcache.entry_mask) | SH_CACHE_ASSOC;
                ctrl_outl(data, addr);
        }
 }
index c6955157c9897fc20d43567d09622fcfe6ab2d79..e0cd4b7f4aeb4d510ad74680b8c89aa18781f978 100644 (file)
@@ -54,21 +54,21 @@ static void __init emit_cache_params(void)
                ctrl_inl(CCN_CVR),
                ctrl_inl(CCN_PRR));
        printk("I-cache : n_ways=%d n_sets=%d way_incr=%d\n",
-               cpu_data->icache.ways,
-               cpu_data->icache.sets,
-               cpu_data->icache.way_incr);
+               current_cpu_data.icache.ways,
+               current_cpu_data.icache.sets,
+               current_cpu_data.icache.way_incr);
        printk("I-cache : entry_mask=0x%08x alias_mask=0x%08x n_aliases=%d\n",
-               cpu_data->icache.entry_mask,
-               cpu_data->icache.alias_mask,
-               cpu_data->icache.n_aliases);
+               current_cpu_data.icache.entry_mask,
+               current_cpu_data.icache.alias_mask,
+               current_cpu_data.icache.n_aliases);
        printk("D-cache : n_ways=%d n_sets=%d way_incr=%d\n",
-               cpu_data->dcache.ways,
-               cpu_data->dcache.sets,
-               cpu_data->dcache.way_incr);
+               current_cpu_data.dcache.ways,
+               current_cpu_data.dcache.sets,
+               current_cpu_data.dcache.way_incr);
        printk("D-cache : entry_mask=0x%08x alias_mask=0x%08x n_aliases=%d\n",
-               cpu_data->dcache.entry_mask,
-               cpu_data->dcache.alias_mask,
-               cpu_data->dcache.n_aliases);
+               current_cpu_data.dcache.entry_mask,
+               current_cpu_data.dcache.alias_mask,
+               current_cpu_data.dcache.n_aliases);
 
        if (!__flush_dcache_segment_fn)
                panic("unknown number of cache ways\n");
@@ -87,10 +87,10 @@ void __init p3_cache_init(void)
 {
        int i;
 
-       compute_alias(&cpu_data->icache);
-       compute_alias(&cpu_data->dcache);
+       compute_alias(&current_cpu_data.icache);
+       compute_alias(&current_cpu_data.dcache);
 
-       switch (cpu_data->dcache.ways) {
+       switch (current_cpu_data.dcache.ways) {
        case 1:
                __flush_dcache_segment_fn = __flush_dcache_segment_1way;
                break;
@@ -110,7 +110,7 @@ void __init p3_cache_init(void)
        if (ioremap_page_range(P3SEG, P3SEG + (PAGE_SIZE * 4), 0, PAGE_KERNEL))
                panic("%s failed.", __FUNCTION__);
 
-       for (i = 0; i < cpu_data->dcache.n_aliases; i++)
+       for (i = 0; i < current_cpu_data.dcache.n_aliases; i++)
                mutex_init(&p3map_mutex[i]);
 }
 
@@ -200,13 +200,14 @@ void flush_cache_sigtramp(unsigned long addr)
                     : /* no output */
                     : "m" (__m(v)));
 
-       index = CACHE_IC_ADDRESS_ARRAY | (v & cpu_data->icache.entry_mask);
+       index = CACHE_IC_ADDRESS_ARRAY |
+                       (v & current_cpu_data.icache.entry_mask);
 
        local_irq_save(flags);
        jump_to_P2();
 
-       for (i = 0; i < cpu_data->icache.ways;
-            i++, index += cpu_data->icache.way_incr)
+       for (i = 0; i < current_cpu_data.icache.ways;
+            i++, index += current_cpu_data.icache.way_incr)
                ctrl_outl(0, index);    /* Clear out Valid-bit */
 
        back_to_P1();
@@ -223,7 +224,7 @@ static inline void flush_cache_4096(unsigned long start,
         * All types of SH-4 require PC to be in P2 to operate on the I-cache.
         * Some types of SH-4 require PC to be in P2 to operate on the D-cache.
         */
-       if ((cpu_data->flags & CPU_HAS_P2_FLUSH_BUG) ||
+       if ((current_cpu_data.flags & CPU_HAS_P2_FLUSH_BUG) ||
            (start < CACHE_OC_ADDRESS_ARRAY))
                exec_offset = 0x20000000;
 
@@ -236,16 +237,26 @@ static inline void flush_cache_4096(unsigned long start,
 /*
  * Write back & invalidate the D-cache of the page.
  * (To avoid "alias" issues)
+ *
+ * This uses a lazy write-back on UP, which is explicitly
+ * disabled on SMP.
  */
 void flush_dcache_page(struct page *page)
 {
-       if (test_bit(PG_mapped, &page->flags)) {
+#ifndef CONFIG_SMP
+       struct address_space *mapping = page_mapping(page);
+
+       if (mapping && !mapping_mapped(mapping))
+               set_bit(PG_dcache_dirty, &page->flags);
+       else
+#endif
+       {
                unsigned long phys = PHYSADDR(page_address(page));
                unsigned long addr = CACHE_OC_ADDRESS_ARRAY;
                int i, n;
 
                /* Loop all the D-cache */
-               n = cpu_data->dcache.n_aliases;
+               n = current_cpu_data.dcache.n_aliases;
                for (i = 0; i < n; i++, addr += 4096)
                        flush_cache_4096(addr, phys);
        }
@@ -277,7 +288,7 @@ static inline void flush_icache_all(void)
 
 void flush_dcache_all(void)
 {
-       (*__flush_dcache_segment_fn)(0UL, cpu_data->dcache.way_size);
+       (*__flush_dcache_segment_fn)(0UL, current_cpu_data.dcache.way_size);
        wmb();
 }
 
@@ -291,8 +302,8 @@ static void __flush_cache_mm(struct mm_struct *mm, unsigned long start,
                             unsigned long end)
 {
        unsigned long d = 0, p = start & PAGE_MASK;
-       unsigned long alias_mask = cpu_data->dcache.alias_mask;
-       unsigned long n_aliases = cpu_data->dcache.n_aliases;
+       unsigned long alias_mask = current_cpu_data.dcache.alias_mask;
+       unsigned long n_aliases = current_cpu_data.dcache.n_aliases;
        unsigned long select_bit;
        unsigned long all_aliases_mask;
        unsigned long addr_offset;
@@ -379,7 +390,7 @@ void flush_cache_mm(struct mm_struct *mm)
         * If cache is only 4k-per-way, there are never any 'aliases'.  Since
         * the cache is physically tagged, the data can just be left in there.
         */
-       if (cpu_data->dcache.n_aliases == 0)
+       if (current_cpu_data.dcache.n_aliases == 0)
                return;
 
        /*
@@ -416,7 +427,7 @@ void flush_cache_page(struct vm_area_struct *vma, unsigned long address,
        unsigned long phys = pfn << PAGE_SHIFT;
        unsigned int alias_mask;
 
-       alias_mask = cpu_data->dcache.alias_mask;
+       alias_mask = current_cpu_data.dcache.alias_mask;
 
        /* We only need to flush D-cache when we have alias */
        if ((address^phys) & alias_mask) {
@@ -430,7 +441,7 @@ void flush_cache_page(struct vm_area_struct *vma, unsigned long address,
                        phys);
        }
 
-       alias_mask = cpu_data->icache.alias_mask;
+       alias_mask = current_cpu_data.icache.alias_mask;
        if (vma->vm_flags & VM_EXEC) {
                /*
                 * Evict entries from the portion of the cache from which code
@@ -462,7 +473,7 @@ void flush_cache_range(struct vm_area_struct *vma, unsigned long start,
         * If cache is only 4k-per-way, there are never any 'aliases'.  Since
         * the cache is physically tagged, the data can just be left in there.
         */
-       if (cpu_data->dcache.n_aliases == 0)
+       if (current_cpu_data.dcache.n_aliases == 0)
                return;
 
        /*
@@ -523,7 +534,7 @@ static void __flush_cache_4096(unsigned long addr, unsigned long phys,
        unsigned long a, ea, p;
        unsigned long temp_pc;
 
-       dcache = &cpu_data->dcache;
+       dcache = &current_cpu_data.dcache;
        /* Write this way for better assembly. */
        way_count = dcache->ways;
        way_incr = dcache->way_incr;
@@ -598,7 +609,7 @@ static void __flush_dcache_segment_1way(unsigned long start,
        base_addr = ((base_addr >> 16) << 16);
        base_addr |= start;
 
-       dcache = &cpu_data->dcache;
+       dcache = &current_cpu_data.dcache;
        linesz = dcache->linesz;
        way_incr = dcache->way_incr;
        way_size = dcache->way_size;
@@ -640,7 +651,7 @@ static void __flush_dcache_segment_2way(unsigned long start,
        base_addr = ((base_addr >> 16) << 16);
        base_addr |= start;
 
-       dcache = &cpu_data->dcache;
+       dcache = &current_cpu_data.dcache;
        linesz = dcache->linesz;
        way_incr = dcache->way_incr;
        way_size = dcache->way_size;
@@ -699,7 +710,7 @@ static void __flush_dcache_segment_4way(unsigned long start,
        base_addr = ((base_addr >> 16) << 16);
        base_addr |= start;
 
-       dcache = &cpu_data->dcache;
+       dcache = &current_cpu_data.dcache;
        linesz = dcache->linesz;
        way_incr = dcache->way_incr;
        way_size = dcache->way_size;
index 045abdf078f5bdc71a99c67f64da9c6cf76e6f4b..31f8deb7a158e410b61069a2a4aa6320cb397b1f 100644 (file)
@@ -3,11 +3,11 @@
  *
  * Copyright (C) 1999, 2000  Niibe Yutaka
  * Copyright (C) 2004  Alex Song
+ * Copyright (C) 2006  Paul Mundt
  *
  * This file is subject to the terms and conditions of the GNU General Public
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
- *
  */
 #include <linux/init.h>
 #include <linux/mman.h>
@@ -32,9 +32,9 @@ static inline void cache_wback_all(void)
 {
        unsigned long ways, waysize, addrstart;
 
-       ways = cpu_data->dcache.ways;
-       waysize = cpu_data->dcache.sets;
-       waysize <<= cpu_data->dcache.entry_shift;
+       ways = current_cpu_data.dcache.ways;
+       waysize = current_cpu_data.dcache.sets;
+       waysize <<= current_cpu_data.dcache.entry_shift;
 
        addrstart = CACHE_OC_ADDRESS_ARRAY;
 
@@ -43,7 +43,7 @@ static inline void cache_wback_all(void)
 
                for (addr = addrstart;
                     addr < addrstart + waysize;
-                    addr += cpu_data->dcache.linesz) {
+                    addr += current_cpu_data.dcache.linesz) {
                        unsigned long data;
                        int v = SH_CACHE_UPDATED | SH_CACHE_VALID;
 
@@ -51,10 +51,9 @@ static inline void cache_wback_all(void)
 
                        if ((data & v) == v)
                                ctrl_outl(data & ~v, addr);
-
                }
 
-               addrstart += cpu_data->dcache.way_incr;
+               addrstart += current_cpu_data.dcache.way_incr;
        } while (--ways);
 }
 
@@ -94,9 +93,9 @@ static void __flush_dcache_page(unsigned long phys)
        local_irq_save(flags);
        jump_to_P2();
 
-       ways = cpu_data->dcache.ways;
-       waysize = cpu_data->dcache.sets;
-       waysize <<= cpu_data->dcache.entry_shift;
+       ways = current_cpu_data.dcache.ways;
+       waysize = current_cpu_data.dcache.sets;
+       waysize <<= current_cpu_data.dcache.entry_shift;
 
        addrstart = CACHE_OC_ADDRESS_ARRAY;
 
@@ -105,7 +104,7 @@ static void __flush_dcache_page(unsigned long phys)
 
                for (addr = addrstart;
                     addr < addrstart + waysize;
-                    addr += cpu_data->dcache.linesz) {
+                    addr += current_cpu_data.dcache.linesz) {
                        unsigned long data;
 
                        data = ctrl_inl(addr) & (0x1ffffC00 | SH_CACHE_VALID);
@@ -115,7 +114,7 @@ static void __flush_dcache_page(unsigned long phys)
                        }
                }
 
-               addrstart += cpu_data->dcache.way_incr;
+               addrstart += current_cpu_data.dcache.way_incr;
        } while (--ways);
 
        back_to_P1();
@@ -128,7 +127,11 @@ static void __flush_dcache_page(unsigned long phys)
  */
 void flush_dcache_page(struct page *page)
 {
-       if (test_bit(PG_mapped, &page->flags))
+       struct address_space *mapping = page_mapping(page);
+
+       if (mapping && !mapping_mapped(mapping))
+               set_bit(PG_dcache_dirty, &page->flags);
+       else
                __flush_dcache_page(PHYSADDR(page_address(page)));
 }
 
index 716ebf568af20d2e2e7e303161d11304886ff794..fa5d7f0b9f1877a5b8bccedc71d97ce84d660a22 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/kprobes.h>
 #include <asm/system.h>
 #include <asm/mmu_context.h>
+#include <asm/tlbflush.h>
 #include <asm/kgdb.h>
 
 extern void die(const char *,struct pt_regs *,long);
@@ -224,3 +225,89 @@ do_sigbus:
        if (!user_mode(regs))
                goto no_context;
 }
+
+#ifdef CONFIG_SH_STORE_QUEUES
+/*
+ * This is a special case for the SH-4 store queues, as pages for this
+ * space still need to be faulted in before it's possible to flush the
+ * store queue cache for writeout to the remapped region.
+ */
+#define P3_ADDR_MAX            (P4SEG_STORE_QUE + 0x04000000)
+#else
+#define P3_ADDR_MAX            P4SEG
+#endif
+
+/*
+ * Called with interrupts disabled.
+ */
+asmlinkage int __kprobes __do_page_fault(struct pt_regs *regs,
+                                        unsigned long writeaccess,
+                                        unsigned long address)
+{
+       pgd_t *pgd;
+       pud_t *pud;
+       pmd_t *pmd;
+       pte_t *pte;
+       pte_t entry;
+       struct mm_struct *mm = current->mm;
+       spinlock_t *ptl;
+       int ret = 1;
+
+#ifdef CONFIG_SH_KGDB
+       if (kgdb_nofault && kgdb_bus_err_hook)
+               kgdb_bus_err_hook();
+#endif
+
+       /*
+        * We don't take page faults for P1, P2, and parts of P4, these
+        * are always mapped, whether it be due to legacy behaviour in
+        * 29-bit mode, or due to PMB configuration in 32-bit mode.
+        */
+       if (address >= P3SEG && address < P3_ADDR_MAX) {
+               pgd = pgd_offset_k(address);
+               mm = NULL;
+       } else {
+               if (unlikely(address >= TASK_SIZE || !mm))
+                       return 1;
+
+               pgd = pgd_offset(mm, address);
+       }
+
+       pud = pud_offset(pgd, address);
+       if (pud_none_or_clear_bad(pud))
+               return 1;
+       pmd = pmd_offset(pud, address);
+       if (pmd_none_or_clear_bad(pmd))
+               return 1;
+
+       if (mm)
+               pte = pte_offset_map_lock(mm, pmd, address, &ptl);
+       else
+               pte = pte_offset_kernel(pmd, address);
+
+       entry = *pte;
+       if (unlikely(pte_none(entry) || pte_not_present(entry)))
+               goto unlock;
+       if (unlikely(writeaccess && !pte_write(entry)))
+               goto unlock;
+
+       if (writeaccess)
+               entry = pte_mkdirty(entry);
+       entry = pte_mkyoung(entry);
+
+#ifdef CONFIG_CPU_SH4
+       /*
+        * ITLB is not affected by "ldtlb" instruction.
+        * So, we need to flush the entry by ourselves.
+        */
+       local_flush_tlb_one(get_asid(), address & PAGE_MASK);
+#endif
+
+       set_pte(pte, entry);
+       update_mmu_cache(NULL, address, entry);
+       ret = 0;
+unlock:
+       if (mm)
+               pte_unmap_unlock(pte, ptl);
+       return ret;
+}
index 29bd37b1488e42ee7e5a74d5beb5cf5ba680b059..ae957a9323754a2eb12c50a62e5c9cb436d304fb 100644 (file)
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
 pgd_t swapper_pg_dir[PTRS_PER_PGD];
 
-/*
- * Cache of MMU context last used.
- */
-unsigned long mmu_context_cache = NO_CONTEXT;
-
 #ifdef CONFIG_MMU
 /* It'd be good if these lines were in the standard header file. */
 #define START_PFN      (NODE_DATA(0)->bdata->node_boot_start >> PAGE_SHIFT)
@@ -111,7 +106,7 @@ static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot)
 
        set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, prot));
 
-       __flush_tlb_page(get_asid(), addr);
+       flush_tlb_one(get_asid(), addr);
 }
 
 /*
@@ -158,7 +153,6 @@ void __init paging_init(void)
         * Setup some defaults for the zone sizes.. these should be safe
         * regardless of distcontiguous memory or MMU settings.
         */
-       zones_size[ZONE_DMA] = 0 >> PAGE_SHIFT;
        zones_size[ZONE_NORMAL] = __MEMORY_SIZE >> PAGE_SHIFT;
 #ifdef CONFIG_HIGHMEM
        zones_size[ZONE_HIGHMEM] = 0 >> PAGE_SHIFT;
@@ -170,8 +164,6 @@ void __init paging_init(void)
         * the zone sizes accordingly, in addition to turning it on.
         */
        {
-               unsigned long max_dma, low, start_pfn;
-
                /* We don't need to map the kernel through the TLB, as
                 * it is permanatly mapped using P1. So clear the
                 * entire pgd. */
@@ -179,19 +171,7 @@ void __init paging_init(void)
 
                /* Turn on the MMU */
                enable_mmu();
-
-               /* Fixup the zone sizes */
-               start_pfn = START_PFN;
-               max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT;
-               low = MAX_LOW_PFN;
-
-               if (low < max_dma) {
-                       zones_size[ZONE_DMA] = low - start_pfn;
-                       zones_size[ZONE_NORMAL] = 0;
-               } else {
-                       zones_size[ZONE_DMA] = max_dma - start_pfn;
-                       zones_size[ZONE_NORMAL] = low - max_dma;
-               }
+               zones_size[ZONE_NORMAL] = MAX_LOW_PFN - START_PFN;
        }
 
        /* Set an initial value for the MMU.TTB so we don't have to
index 90b494a0cf45b5f78c1c98c5d8b9c7b28c8868ac..be03d74e99cbc4412c713ba96141b66a0443a21d 100644 (file)
@@ -44,12 +44,6 @@ void __iomem *__ioremap(unsigned long phys_addr, unsigned long size,
        if (!size || last_addr < phys_addr)
                return NULL;
 
-       /*
-        * Don't remap the low PCI/ISA area, it's always mapped..
-        */
-       if (phys_addr >= 0xA0000 && last_addr < 0x100000)
-               return (void __iomem *)phys_to_virt(phys_addr);
-
        /*
         * If we're on an SH7751 or SH7780 PCI controller, PCI memory is
         * mapped at the end of the address space (typically 0xfd000000)
index 3f98d2a4f936355507e4386855e442b7fa6860ac..969efeceb9282ae1b434dfc025a9728923e696c2 100644 (file)
@@ -13,7 +13,7 @@
 
 extern struct mutex p3map_mutex[];
 
-#define CACHE_ALIAS (cpu_data->dcache.alias_mask)
+#define CACHE_ALIAS (current_cpu_data.dcache.alias_mask)
 
 /*
  * clear_user_page
@@ -23,7 +23,6 @@ extern struct mutex p3map_mutex[];
  */
 void clear_user_page(void *to, unsigned long address, struct page *page)
 {
-       __set_bit(PG_mapped, &page->flags);
        if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0)
                clear_page(to);
        else {
@@ -40,7 +39,7 @@ void clear_user_page(void *to, unsigned long address, struct page *page)
                mutex_lock(&p3map_mutex[(address & CACHE_ALIAS)>>12]);
                set_pte(pte, entry);
                local_irq_save(flags);
-               __flush_tlb_page(get_asid(), p3_addr);
+               flush_tlb_one(get_asid(), p3_addr);
                local_irq_restore(flags);
                update_mmu_cache(NULL, p3_addr, entry);
                __clear_user_page((void *)p3_addr, to);
@@ -59,7 +58,6 @@ void clear_user_page(void *to, unsigned long address, struct page *page)
 void copy_user_page(void *to, void *from, unsigned long address,
                    struct page *page)
 {
-       __set_bit(PG_mapped, &page->flags);
        if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0)
                copy_page(to, from);
        else {
@@ -76,7 +74,7 @@ void copy_user_page(void *to, void *from, unsigned long address,
                mutex_lock(&p3map_mutex[(address & CACHE_ALIAS)>>12]);
                set_pte(pte, entry);
                local_irq_save(flags);
-               __flush_tlb_page(get_asid(), p3_addr);
+               flush_tlb_one(get_asid(), p3_addr);
                local_irq_restore(flags);
                update_mmu_cache(NULL, p3_addr, entry);
                __copy_user_page((void *)p3_addr, from, to);
@@ -84,23 +82,3 @@ void copy_user_page(void *to, void *from, unsigned long address,
                mutex_unlock(&p3map_mutex[(address & CACHE_ALIAS)>>12]);
        }
 }
-
-/*
- * For SH-4, we have our own implementation for ptep_get_and_clear
- */
-inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
-{
-       pte_t pte = *ptep;
-
-       pte_clear(mm, addr, ptep);
-       if (!pte_not_present(pte)) {
-               unsigned long pfn = pte_pfn(pte);
-               if (pfn_valid(pfn)) {
-                       struct page *page = pfn_to_page(pfn);
-                       struct address_space *mapping = page_mapping(page);
-                       if (!mapping || !mapping_writably_mapped(mapping))
-                               __clear_bit(PG_mapped, &page->flags);
-               }
-       }
-       return pte;
-}
index ff9ece986cbcb822f2e85bf1adb8991330c0f97e..887ab9d18ccd25b16d4e5bc8d6d50db5f6020192 100644 (file)
@@ -7,9 +7,7 @@
  * This file is subject to the terms and conditions of the GNU General Public
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
- *
  */
-
 #include <linux/init.h>
 #include <linux/mman.h>
 #include <linux/mm.h>
@@ -45,13 +43,13 @@ static inline void __flush_purge_virtual_region(void *p1, void *virt, int size)
 
                p = __pa(p1_begin);
 
-               ways = cpu_data->dcache.ways;
+               ways = current_cpu_data.dcache.ways;
                addr = CACHE_OC_ADDRESS_ARRAY;
 
                do {
                        unsigned long data;
 
-                       addr |= (v & cpu_data->dcache.entry_mask);
+                       addr |= (v & current_cpu_data.dcache.entry_mask);
 
                        data = ctrl_inl(addr);
                        if ((data & CACHE_PHYSADDR_MASK) ==
@@ -60,7 +58,7 @@ static inline void __flush_purge_virtual_region(void *p1, void *virt, int size)
                                ctrl_outl(data, addr);
                        }
 
-                       addr += cpu_data->dcache.way_incr;
+                       addr += current_cpu_data.dcache.way_incr;
                } while (--ways);
 
                p1_begin += L1_CACHE_BYTES;
@@ -76,7 +74,6 @@ void clear_user_page(void *to, unsigned long address, struct page *pg)
 {
        struct page *page = virt_to_page(to);
 
-       __set_bit(PG_mapped, &page->flags);
        if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0) {
                clear_page(to);
                __flush_wback_region(to, PAGE_SIZE);
@@ -95,12 +92,11 @@ void clear_user_page(void *to, unsigned long address, struct page *pg)
  * @from: P1 address
  * @address: U0 address to be mapped
  */
-void copy_user_page(void *to, void *from, unsigned long address, struct page *pg)
+void copy_user_page(void *to, void *from, unsigned long address,
+                   struct page *pg)
 {
        struct page *page = virt_to_page(to);
 
-
-       __set_bit(PG_mapped, &page->flags);
        if (((address ^ (unsigned long)to) & CACHE_ALIAS) == 0) {
                copy_page(to, from);
                __flush_wback_region(to, PAGE_SIZE);
@@ -112,26 +108,3 @@ void copy_user_page(void *to, void *from, unsigned long address, struct page *pg
                __flush_wback_region(to, PAGE_SIZE);
        }
 }
-
-/*
- * For SH7705, we have our own implementation for ptep_get_and_clear
- * Copied from pg-sh4.c
- */
-inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
-{
-       pte_t pte = *ptep;
-
-       pte_clear(mm, addr, ptep);
-       if (!pte_not_present(pte)) {
-               unsigned long pfn = pte_pfn(pte);
-               if (pfn_valid(pfn)) {
-                       struct page *page = pfn_to_page(pfn);
-                       struct address_space *mapping = page_mapping(page);
-                       if (!mapping || !mapping_writably_mapped(mapping))
-                               __clear_bit(PG_mapped, &page->flags);
-               }
-       }
-
-       return pte;
-}
-
index b60ad83a7635ceceb19bc8896b5774f7f0c5c001..d0d45e2e0ab319f62e94d0439798d0ac1c6e941f 100644 (file)
@@ -378,7 +378,7 @@ static int pmb_debugfs_open(struct inode *inode, struct file *file)
        return single_open(file, pmb_seq_show, NULL);
 }
 
-static struct file_operations pmb_debugfs_fops = {
+static const struct file_operations pmb_debugfs_fops = {
        .owner          = THIS_MODULE,
        .open           = pmb_debugfs_open,
        .read           = seq_read,
index 73ec7f6084fa404def63f9e86d8e8afda763ac60..d2f7b4a2eb05356339a0599638c935c08fd9d0fd 100644 (file)
@@ -2,24 +2,28 @@
  * TLB flushing operations for SH with an MMU.
  *
  *  Copyright (C) 1999  Niibe Yutaka
- *  Copyright (C) 2003  Paul Mundt
+ *  Copyright (C) 2003 - 2006  Paul Mundt
  *
  * This file is subject to the terms and conditions of the GNU General Public
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  */
 #include <linux/mm.h>
+#include <linux/io.h>
 #include <asm/mmu_context.h>
 #include <asm/tlbflush.h>
+#include <asm/cacheflush.h>
 
-void flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
+void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
 {
-       if (vma->vm_mm && vma->vm_mm->context.id != NO_CONTEXT) {
+       unsigned int cpu = smp_processor_id();
+
+       if (vma->vm_mm && cpu_context(cpu, vma->vm_mm) != NO_CONTEXT) {
                unsigned long flags;
                unsigned long asid;
                unsigned long saved_asid = MMU_NO_ASID;
 
-               asid = vma->vm_mm->context.id & MMU_CONTEXT_ASID_MASK;
+               asid = cpu_asid(cpu, vma->vm_mm);
                page &= PAGE_MASK;
 
                local_irq_save(flags);
@@ -27,33 +31,34 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
                        saved_asid = get_asid();
                        set_asid(asid);
                }
-               __flush_tlb_page(asid, page);
+               local_flush_tlb_one(asid, page);
                if (saved_asid != MMU_NO_ASID)
                        set_asid(saved_asid);
                local_irq_restore(flags);
        }
 }
 
-void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
-                    unsigned long end)
+void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
+                          unsigned long end)
 {
        struct mm_struct *mm = vma->vm_mm;
+       unsigned int cpu = smp_processor_id();
 
-       if (mm->context.id != NO_CONTEXT) {
+       if (cpu_context(cpu, mm) != NO_CONTEXT) {
                unsigned long flags;
                int size;
 
                local_irq_save(flags);
                size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
                if (size > (MMU_NTLB_ENTRIES/4)) { /* Too many TLB to flush */
-                       mm->context.id = NO_CONTEXT;
+                       cpu_context(cpu, mm) = NO_CONTEXT;
                        if (mm == current->mm)
-                               activate_context(mm);
+                               activate_context(mm, cpu);
                } else {
                        unsigned long asid;
                        unsigned long saved_asid = MMU_NO_ASID;
 
-                       asid = mm->context.id & MMU_CONTEXT_ASID_MASK;
+                       asid = cpu_asid(cpu, mm);
                        start &= PAGE_MASK;
                        end += (PAGE_SIZE - 1);
                        end &= PAGE_MASK;
@@ -62,7 +67,7 @@ void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
                                set_asid(asid);
                        }
                        while (start < end) {
-                               __flush_tlb_page(asid, start);
+                               local_flush_tlb_one(asid, start);
                                start += PAGE_SIZE;
                        }
                        if (saved_asid != MMU_NO_ASID)
@@ -72,26 +77,27 @@ void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
        }
 }
 
-void flush_tlb_kernel_range(unsigned long start, unsigned long end)
+void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)
 {
+       unsigned int cpu = smp_processor_id();
        unsigned long flags;
        int size;
 
        local_irq_save(flags);
        size = (end - start + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
        if (size > (MMU_NTLB_ENTRIES/4)) { /* Too many TLB to flush */
-               flush_tlb_all();
+               local_flush_tlb_all();
        } else {
                unsigned long asid;
                unsigned long saved_asid = get_asid();
 
-               asid = init_mm.context.id & MMU_CONTEXT_ASID_MASK;
+               asid = cpu_asid(cpu, &init_mm);
                start &= PAGE_MASK;
                end += (PAGE_SIZE - 1);
                end &= PAGE_MASK;
                set_asid(asid);
                while (start < end) {
-                       __flush_tlb_page(asid, start);
+                       local_flush_tlb_one(asid, start);
                        start += PAGE_SIZE;
                }
                set_asid(saved_asid);
@@ -99,22 +105,24 @@ void flush_tlb_kernel_range(unsigned long start, unsigned long end)
        local_irq_restore(flags);
 }
 
-void flush_tlb_mm(struct mm_struct *mm)
+void local_flush_tlb_mm(struct mm_struct *mm)
 {
+       unsigned int cpu = smp_processor_id();
+
        /* Invalidate all TLB of this process. */
        /* Instead of invalidating each TLB, we get new MMU context. */
-       if (mm->context.id != NO_CONTEXT) {
+       if (cpu_context(cpu, mm) != NO_CONTEXT) {
                unsigned long flags;
 
                local_irq_save(flags);
-               mm->context.id = NO_CONTEXT;
+               cpu_context(cpu, mm) = NO_CONTEXT;
                if (mm == current->mm)
-                       activate_context(mm);
+                       activate_context(mm, cpu);
                local_irq_restore(flags);
        }
 }
 
-void flush_tlb_all(void)
+void local_flush_tlb_all(void)
 {
        unsigned long flags, status;
 
@@ -132,3 +140,54 @@ void flush_tlb_all(void)
        ctrl_barrier();
        local_irq_restore(flags);
 }
+
+void update_mmu_cache(struct vm_area_struct *vma,
+                     unsigned long address, pte_t pte)
+{
+       unsigned long flags;
+       unsigned long pteval;
+       unsigned long vpn;
+       struct page *page;
+       unsigned long pfn = pte_pfn(pte);
+       struct address_space *mapping;
+
+       if (!pfn_valid(pfn))
+               return;
+
+       page = pfn_to_page(pfn);
+       mapping = page_mapping(page);
+       if (mapping) {
+               unsigned long phys = pte_val(pte) & PTE_PHYS_MASK;
+               int dirty = test_and_clear_bit(PG_dcache_dirty, &page->flags);
+
+               if (dirty)
+                       __flush_wback_region((void *)P1SEGADDR(phys),
+                                            PAGE_SIZE);
+       }
+
+       local_irq_save(flags);
+
+       /* Set PTEH register */
+       vpn = (address & MMU_VPN_MASK) | get_asid();
+       ctrl_outl(vpn, MMU_PTEH);
+
+       pteval = pte_val(pte);
+
+#ifdef CONFIG_CPU_HAS_PTEA
+       /* Set PTEA register */
+       /* TODO: make this look less hacky */
+       ctrl_outl(((pteval >> 28) & 0xe) | (pteval & 0x1), MMU_PTEA);
+#endif
+
+       /* Set PTEL register */
+       pteval &= _PAGE_FLAGS_HARDWARE_MASK; /* drop software flags */
+#if defined(CONFIG_SH_WRITETHROUGH) && defined(CONFIG_CPU_SH4)
+       pteval |= _PAGE_WT;
+#endif
+       /* conveniently, we want all the software flags to be 0 anyway */
+       ctrl_outl(pteval, MMU_PTEL);
+
+       /* Load the TLB */
+       asm volatile("ldtlb": /* no output */ : /* no input */ : "memory");
+       local_irq_restore(flags);
+}
index e55cfea01092dc4531c0d8acb07cfa41ef8ef853..1ccca7c0532e54a5da01227a45b4a5234c913f11 100644 (file)
 /*
  * Nothing too terribly exciting here ..
  */
-
-void flush_tlb(void)
-{
-       BUG();
-}
-
-void flush_tlb_all(void)
+void local_flush_tlb_all(void)
 {
        BUG();
 }
 
-void flush_tlb_mm(struct mm_struct *mm)
+void local_flush_tlb_mm(struct mm_struct *mm)
 {
        BUG();
 }
 
-void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
+void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
                            unsigned long end)
 {
        BUG();
 }
 
-void flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
+void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
 {
        BUG();
 }
 
-void __flush_tlb_page(unsigned long asid, unsigned long page)
+void local_flush_tlb_one(unsigned long asid, unsigned long page)
 {
        BUG();
 }
 
-void flush_tlb_kernel_range(unsigned long start, unsigned long end)
+void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)
 {
        BUG();
 }
@@ -55,4 +49,3 @@ void update_mmu_cache(struct vm_area_struct * vma,
 {
        BUG();
 }
-
index 46b09e26e0825fa411a593fdd4f5755e01d4f77a..e5e76eb7ee09e1b2c6f118201335349847e0c4ec 100644 (file)
@@ -8,71 +8,11 @@
  *
  * Released under the terms of the GNU GPL v2.0.
  */
-#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/ptrace.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/interrupt.h>
-
+#include <linux/io.h>
 #include <asm/system.h>
-#include <asm/io.h>
-#include <asm/uaccess.h>
-#include <asm/pgalloc.h>
 #include <asm/mmu_context.h>
-#include <asm/cacheflush.h>
 
-void update_mmu_cache(struct vm_area_struct * vma,
-                     unsigned long address, pte_t pte)
-{
-       unsigned long flags;
-       unsigned long pteval;
-       unsigned long vpn;
-
-       /* Ptrace may call this routine. */
-       if (vma && current->active_mm != vma->vm_mm)
-               return;
-
-#if defined(CONFIG_SH7705_CACHE_32KB)
-       {
-               struct page *page = pte_page(pte);
-               unsigned long pfn = pte_pfn(pte);
-
-               if (pfn_valid(pfn) && !test_bit(PG_mapped, &page->flags)) {
-                       unsigned long phys = pte_val(pte) & PTE_PHYS_MASK;
-
-                       __flush_wback_region((void *)P1SEGADDR(phys),
-                                            PAGE_SIZE);
-                       __set_bit(PG_mapped, &page->flags);
-               }
-       }
-#endif
-
-       local_irq_save(flags);
-
-       /* Set PTEH register */
-       vpn = (address & MMU_VPN_MASK) | get_asid();
-       ctrl_outl(vpn, MMU_PTEH);
-
-       pteval = pte_val(pte);
-
-       /* Set PTEL register */
-       pteval &= _PAGE_FLAGS_HARDWARE_MASK; /* drop software flags */
-       /* conveniently, we want all the software flags to be 0 anyway */
-       ctrl_outl(pteval, MMU_PTEL);
-
-       /* Load the TLB */
-       asm volatile("ldtlb": /* no output */ : /* no input */ : "memory");
-       local_irq_restore(flags);
-}
-
-void __flush_tlb_page(unsigned long asid, unsigned long page)
+void local_flush_tlb_one(unsigned long asid, unsigned long page)
 {
        unsigned long addr, data;
        int i, ways = MMU_NTLB_WAYS;
@@ -86,7 +26,7 @@ void __flush_tlb_page(unsigned long asid, unsigned long page)
        addr = MMU_TLB_ADDRESS_ARRAY | (page & 0x1F000);
        data = (page & 0xfffe0000) | asid; /* VALID bit is off */
 
-       if ((cpu_data->flags & CPU_HAS_MMU_PAGE_ASSOC)) {
+       if ((current_cpu_data.flags & CPU_HAS_MMU_PAGE_ASSOC)) {
                addr |= MMU_PAGE_ASSOC_BIT;
                ways = 1;       /* we already know the way .. */
        }
@@ -94,4 +34,3 @@ void __flush_tlb_page(unsigned long asid, unsigned long page)
        for (i = 0; i < ways; i++)
                ctrl_outl(data, addr + (i << 8));
 }
-
index 812b2d567de2f6e57a7519864923a1bbd69bbfb9..221e7095473d383348d57c9389f5f7be146ac34f 100644 (file)
@@ -8,76 +8,11 @@
  *
  * Released under the terms of the GNU GPL v2.0.
  */
-#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/ptrace.h>
-#include <linux/mman.h>
-#include <linux/mm.h>
-#include <linux/smp.h>
-#include <linux/smp_lock.h>
-#include <linux/interrupt.h>
-
+#include <linux/io.h>
 #include <asm/system.h>
-#include <asm/io.h>
-#include <asm/uaccess.h>
-#include <asm/pgalloc.h>
 #include <asm/mmu_context.h>
-#include <asm/cacheflush.h>
 
-void update_mmu_cache(struct vm_area_struct * vma,
-                     unsigned long address, pte_t pte)
-{
-       unsigned long flags;
-       unsigned long pteval;
-       unsigned long vpn;
-       struct page *page;
-       unsigned long pfn;
-
-       /* Ptrace may call this routine. */
-       if (vma && current->active_mm != vma->vm_mm)
-               return;
-
-       pfn = pte_pfn(pte);
-       if (pfn_valid(pfn)) {
-               page = pfn_to_page(pfn);
-               if (!test_bit(PG_mapped, &page->flags)) {
-                       unsigned long phys = pte_val(pte) & PTE_PHYS_MASK;
-                       __flush_wback_region((void *)P1SEGADDR(phys), PAGE_SIZE);
-                       __set_bit(PG_mapped, &page->flags);
-               }
-       }
-
-       local_irq_save(flags);
-
-       /* Set PTEH register */
-       vpn = (address & MMU_VPN_MASK) | get_asid();
-       ctrl_outl(vpn, MMU_PTEH);
-
-       pteval = pte_val(pte);
-
-       /* Set PTEA register */
-       if (cpu_data->flags & CPU_HAS_PTEA)
-               /* TODO: make this look less hacky */
-               ctrl_outl(((pteval >> 28) & 0xe) | (pteval & 0x1), MMU_PTEA);
-
-       /* Set PTEL register */
-       pteval &= _PAGE_FLAGS_HARDWARE_MASK; /* drop software flags */
-#ifdef CONFIG_SH_WRITETHROUGH
-       pteval |= _PAGE_WT;
-#endif
-       /* conveniently, we want all the software flags to be 0 anyway */
-       ctrl_outl(pteval, MMU_PTEL);
-
-       /* Load the TLB */
-       asm volatile("ldtlb": /* no output */ : /* no input */ : "memory");
-       local_irq_restore(flags);
-}
-
-void __flush_tlb_page(unsigned long asid, unsigned long page)
+void local_flush_tlb_one(unsigned long asid, unsigned long page)
 {
        unsigned long addr, data;
 
@@ -93,4 +28,3 @@ void __flush_tlb_page(unsigned long asid, unsigned long page)
        ctrl_outl(data, addr);
        back_to_P1();
 }
-
index 60402eec4b4d3f34589e8ccaa78f351bc331d6ce..ebee7e24ede9e253cf87f7d78ca5fc35114f848b 100644 (file)
@@ -187,7 +187,7 @@ static ssize_t sh7750_write_count(struct file *file, const char __user *buf,
        return count;
 }
 
-static struct file_operations count_fops = {
+static const struct file_operations count_fops = {
        .read           = sh7750_read_count,
        .write          = sh7750_write_count,
 };
@@ -259,7 +259,7 @@ static struct oprofile_operations sh7750_perf_counter_ops = {
 
 int __init oprofile_arch_init(struct oprofile_operations **ops)
 {
-       if (!(cpu_data->flags & CPU_HAS_PERF_COUNTER))
+       if (!(current_cpu_data.flags & CPU_HAS_PERF_COUNTER))
                return -ENODEV;
 
        sh7750_perf_counter_ops.cpu_type = (char *)get_cpu_subtype();
index 0571755e9a84e8e6b2ae55e266043923f03423e8..4fe0f94cbf429687b648d37ff29f7429501e4f0a 100644 (file)
@@ -16,7 +16,6 @@ HD64461                       HD64461
 HD64465                        HD64465
 SATURN                 SH_SATURN
 DREAMCAST              SH_DREAMCAST
-BIGSUR                 SH_BIGSUR
 MPC1211                        SH_MPC1211
 SNAPGEAR               SH_SECUREEDGE5410
 HS7751RVOIP            SH_HS7751RVOIP
index 7bc0744b7ab6aca55207c96740c48c793fa286e4..e14b533558c8a87fc712c17252dc22ea140318cd 100644 (file)
@@ -36,9 +36,6 @@ config GENERIC_CALIBRATE_DELAY
 config RWSEM_XCHGADD_ALGORITHM
        bool
 
-config GENERIC_ISA_DMA
-       bool
-
 config ARCH_HAS_ILOG2_U32
        bool
        default n
index b9e7d54d7b8553d89d2c9988c561f4227d38d19b..53e9d20a874a4c6b75c44d949763261f87525893 100644 (file)
@@ -83,7 +83,7 @@ extern int sh64_tlb_init(void);
 #define RAMDISK_PROMPT_FLAG            0x8000
 #define RAMDISK_LOAD_FLAG              0x4000
 
-static char command_line[COMMAND_LINE_SIZE] = { 0, };
+static char __initdata command_line[COMMAND_LINE_SIZE] = { 0, };
 unsigned long long memory_start = CONFIG_MEMORY_START;
 unsigned long long memory_end = CONFIG_MEMORY_START + (CONFIG_MEMORY_SIZE_IN_MB * 1024 * 1024);
 
@@ -95,8 +95,8 @@ static inline void parse_mem_cmdline (char ** cmdline_p)
        int len = 0;
 
        /* Save unparsed command line copy for /proc/cmdline */
-       memcpy(saved_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
-       saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
+       memcpy(boot_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
+       boot_command_line[COMMAND_LINE_SIZE-1] = '\0';
 
        for (;;) {
          /*
index 9c4a38a8698c608e353a04831fc1761fcd99e526..390b40de7cefcb6886b81bc50ad6513cfbf3b43f 100644 (file)
@@ -579,12 +579,3 @@ void enter_deep_standby(void)
        asm __volatile__ ("nop");
        panic("Unexpected wakeup!\n");
 }
-
-/*
- * Scheduler clock - returns current time in nanosec units.
- */
-unsigned long long sched_clock(void)
-{
-       return (unsigned long long)jiffies * (1000000000 / HZ);
-}
-
index 224b7f5b92246efdccfbd00be1575f57d3ebca9d..c346d7ef9280f3452ec54b4edacba5698e58ce96 100644 (file)
@@ -910,30 +910,57 @@ static int misaligned_fixup(struct pt_regs *regs)
 }
 
 static ctl_table unaligned_table[] = {
-       {1, "kernel_reports", &kernel_mode_unaligned_fixup_count,
-               sizeof(int), 0644, NULL, &proc_dointvec},
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "kernel_reports",
+               .data           = &kernel_mode_unaligned_fixup_count,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec
+       },
 #if defined(CONFIG_SH64_USER_MISALIGNED_FIXUP)
-       {2, "user_reports", &user_mode_unaligned_fixup_count,
-               sizeof(int), 0644, NULL, &proc_dointvec},
-       {3, "user_enable", &user_mode_unaligned_fixup_enable,
-               sizeof(int), 0644, NULL, &proc_dointvec},
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "user_reports",
+               .data           = &user_mode_unaligned_fixup_count,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "user_enable",
+               .data           = &user_mode_unaligned_fixup_enable,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec},
 #endif
-       {0}
+       {}
 };
 
 static ctl_table unaligned_root[] = {
-       {1, "unaligned_fixup", NULL, 0, 0555, unaligned_table},
-       {0}
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "unaligned_fixup",
+               .mode           = 0555,
+               unaligned_table
+       },
+       {}
 };
 
 static ctl_table sh64_root[] = {
-       {1, "sh64", NULL, 0, 0555, unaligned_root},
-       {0}
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "sh64",
+               .mode           = 0555,
+               .child          = unaligned_root
+       },
+       {}
 };
 static struct ctl_table_header *sysctl_header;
 static int __init init_sysctl(void)
 {
-       sysctl_header = register_sysctl_table(sh64_root, 0);
+       sysctl_header = register_sysctl_table(sh64_root);
        return 0;
 }
 
index 95c4d753e357132bc6e98ac8a3c4a465ba106451..a59c5e998131e93c5649e82d21328e8ba720d493 100644 (file)
@@ -115,9 +115,13 @@ SECTIONS
   .con_initcall.init : C_PHYS(.con_initcall.init) { *(.con_initcall.init) }
   __con_initcall_end = .;
   SECURITY_INIT
+
+#ifdef CONFIG_BLK_DEV_INITRD
   __initramfs_start = .;
   .init.ramfs : C_PHYS(.init.ramfs) { *(.init.ramfs) }
   __initramfs_end = .;
+#endif
+
   . = ALIGN(PAGE_SIZE);
   __init_end = .;
 
index 83295bd21aa7d050c3046e5b1189a66c793fcf51..5dc08787259c1220acf701e1e2730ee85a125c9c 100644 (file)
@@ -118,10 +118,7 @@ void __init paging_init(void)
 
        mmu_context_cache = MMU_CONTEXT_FIRST_VERSION;
 
-        /*
-        * All memory is good as ZONE_NORMAL (fall-through) and ZONE_DMA.
-         */
-       zones_size[ZONE_DMA] = MAX_LOW_PFN - START_PFN;
+       zones_size[ZONE_NORMAL] = MAX_LOW_PFN - START_PFN;
        NODE_DATA(0)->node_mem_map = NULL;
        free_area_init_node(0, NODE_DATA(0), zones_size, __MEMORY_START >> PAGE_SHIFT, 0);
 }
index d0dec1ea2eed93345091981a64c6028f9ae474ff..bd992c0048f0aa1d8801b6dde2b3380982268ef9 100644 (file)
@@ -13,6 +13,10 @@ config HIGHMEM
        bool
        default y
 
+config ZONE_DMA
+       bool
+       default y
+
 config GENERIC_ISA_DMA
        bool
        default y
index 6616ee05c313c613f3f4fe18053fb806458d2ef2..e795f282dece9f29d6914bc639ffb0c73da5d9f9 100644 (file)
@@ -12,7 +12,9 @@ obj-y    := entry.o wof.o wuf.o etrap.o rtrap.o traps.o $(IRQ_OBJS) \
            sys_sparc.o sunos_asm.o systbls.o \
            time.o windows.o cpu.o devices.o sclow.o \
            tadpole.o tick14.o ptrace.o sys_solaris.o \
-           unaligned.o muldiv.o semaphore.o prom.o of_device.o
+           unaligned.o muldiv.o semaphore.o prom.o of_device.o devres.o
+
+devres-y = ../../../kernel/irq/devres.o
 
 obj-$(CONFIG_PCI) += pcic.o
 obj-$(CONFIG_SUN4) += sun4setup.o
index 406dd94afb457447593e825c92f27024b5f79277..d06a405ca718eb6f0067c9d80ca16d606486d4a3 100644 (file)
@@ -127,7 +127,7 @@ static int apc_ioctl(struct inode *inode, struct file *f,
        return 0;
 }
 
-static struct file_operations apc_fops = {
+static const struct file_operations apc_fops = {
        .ioctl =        apc_ioctl,
        .open =         apc_open,
        .release =      apc_release,
index 383526ad94fccb61f9176a51233bcce62d4c5d3a..eccd8e87f529eac499bba338ffdeb86b3d9f9f48 100644 (file)
@@ -246,7 +246,7 @@ void __init setup_arch(char **cmdline_p)
 
        /* Initialize PROM console and command line. */
        *cmdline_p = prom_getbootargs();
-       strcpy(saved_command_line, *cmdline_p);
+       strcpy(boot_command_line, *cmdline_p);
 
        /* Set sparc_cpu_model */
        sparc_cpu_model = sun_unknown;
index a6ba3d26222c1c173d4e5960ba26904705178843..32e8274e43574513c501fb8cd42940741f88aae7 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/termios.h>
+#include <linux/tty.h>
 #include <linux/ioctl.h>
 #include <linux/route.h>
 #include <linux/sockios.h>
index 0bf8c165fc929240d24b3d26bf414e9d2551eb60..da6606f0cffc41b4f85e3d6ea65c4042361d6f54 100644 (file)
@@ -859,14 +859,16 @@ asmlinkage int sunos_wait4(pid_t pid, unsigned int __user *stat_addr,
        return ret;
 }
 
-extern int kill_pg(int, int, int);
 asmlinkage int sunos_killpg(int pgrp, int sig)
 {
        int ret;
 
-       lock_kernel();
-       ret = kill_pg(pgrp, sig, 0);
-       unlock_kernel();
+       rcu_read_lock();
+       ret = -EINVAL;
+       if (pgrp > 0)
+               ret = kill_pgrp(find_pid(pgrp), sig, 0);
+       rcu_read_unlock();
+
        return ret;
 }
 
index 2fcce000d87731c8c13a5965842f13b71bb6f251..9bb1240aaf8afee365a25a14b566de19f02ce601 100644 (file)
@@ -436,15 +436,6 @@ static inline unsigned long do_gettimeoffset(void)
        return (*master_l10_counter >> 10) & 0x1fffff;
 }
 
-/*
- * Returns nanoseconds
- * XXX This is a suboptimal implementation.
- */
-unsigned long long sched_clock(void)
-{
-       return (unsigned long long)jiffies * (1000000000 / HZ);
-}
-
 /* Ok, my cute asm atomicity trick doesn't work anymore.
  * There are just too many variables that need to be protected
  * now (both members of xtime, et al.)
index b73e6b9067eddf5ba48ea26d503c607f67d2ea60..e5c24e0521dee34f43e0ef32c693320512f841a9 100644 (file)
@@ -57,10 +57,14 @@ SECTIONS
   .con_initcall.init : { *(.con_initcall.init) }
   __con_initcall_end = .;
   SECURITY_INIT
+
+#ifdef CONFIG_BLK_DEV_INITRD
   . = ALIGN(4096);
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
   __initramfs_end = .;
+#endif
+
   . = ALIGN(32);
   __per_cpu_start = .;
   .data.percpu  : { *(.data.percpu) }
index d41f66ac7fff71dd8768271775aad6b183de987f..f75a686ba6443d7ed3853c9afcdbbc6eeaaa83a8 100644 (file)
@@ -232,10 +232,6 @@ config LARGE_ALLOCS
 
 source "mm/Kconfig"
 
-config GENERIC_ISA_DMA
-       bool
-       default y
-
 config ISA
        bool
        help
index 5a9e68b13e606277d37fdbe527fd3b758463696c..0f44a6a6675fa4d93a2cf9790f1f7dbf203c4953 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20-rc2
-# Thu Dec 28 15:09:49 2006
+# Linux kernel version: 2.6.20
+# Sun Feb 11 23:47:40 2007
 #
 CONFIG_SPARC=y
 CONFIG_SPARC64=y
@@ -49,7 +49,6 @@ CONFIG_POSIX_MQUEUE=y
 # CONFIG_IKCONFIG is not set
 CONFIG_SYSFS_DEPRECATED=y
 CONFIG_RELAY=y
-CONFIG_INITRAMFS_SOURCE=""
 CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 CONFIG_SYSCTL=y
 # CONFIG_EMBEDDED is not set
@@ -144,14 +143,14 @@ CONFIG_HAVE_MEMORY_PRESENT=y
 CONFIG_SPARSEMEM_EXTREME=y
 CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_RESOURCES_64BIT=y
-CONFIG_GENERIC_ISA_DMA=y
+CONFIG_ZONE_DMA_FLAG=0
 CONFIG_SBUS=y
 CONFIG_SBUSCHAR=y
 CONFIG_SUN_AUXIO=y
 CONFIG_SUN_IO=y
 CONFIG_PCI=y
 CONFIG_PCI_DOMAINS=y
-# CONFIG_PCI_MULTITHREAD_PROBE is not set
+CONFIG_PCI_MSI=y
 # CONFIG_PCI_DEBUG is not set
 CONFIG_SUN_OPENPROMFS=m
 CONFIG_SPARC32_COMPAT=y
@@ -182,7 +181,9 @@ CONFIG_UNIX=y
 CONFIG_XFRM=y
 CONFIG_XFRM_USER=m
 # CONFIG_XFRM_SUB_POLICY is not set
+CONFIG_XFRM_MIGRATE=y
 CONFIG_NET_KEY=m
+CONFIG_NET_KEY_MIGRATE=y
 CONFIG_INET=y
 CONFIG_IP_MULTICAST=y
 # CONFIG_IP_ADVANCED_ROUTER is not set
@@ -300,6 +301,7 @@ CONFIG_STANDALONE=y
 # CONFIG_PREVENT_FIRMWARE_BUILD is not set
 CONFIG_FW_LOADER=y
 # CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
 # CONFIG_SYS_HYPERVISOR is not set
 
 #
@@ -393,6 +395,7 @@ CONFIG_BLK_DEV_ALI15X3=y
 # CONFIG_BLK_DEV_JMICRON is not set
 # CONFIG_BLK_DEV_SC1200 is not set
 # CONFIG_BLK_DEV_PIIX is not set
+# CONFIG_BLK_DEV_IT8213 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
@@ -402,6 +405,7 @@ CONFIG_BLK_DEV_ALI15X3=y
 # CONFIG_BLK_DEV_SLC90E66 is not set
 # CONFIG_BLK_DEV_TRM290 is not set
 # CONFIG_BLK_DEV_VIA82CXXX is not set
+# CONFIG_BLK_DEV_TC86C001 is not set
 # CONFIG_IDE_ARM is not set
 CONFIG_BLK_DEV_IDEDMA=y
 # CONFIG_IDEDMA_IVB is not set
@@ -579,6 +583,7 @@ CONFIG_NET_PCI=y
 # CONFIG_EPIC100 is not set
 # CONFIG_SUNDANCE is not set
 # CONFIG_VIA_RHINE is not set
+# CONFIG_SC92031 is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -601,11 +606,13 @@ CONFIG_E1000_NAPI=y
 CONFIG_TIGON3=m
 CONFIG_BNX2=m
 # CONFIG_QLA3XXX is not set
+# CONFIG_ATL1 is not set
 
 #
 # Ethernet (10000 Mbit)
 #
 # CONFIG_CHELSIO_T1 is not set
+# CONFIG_CHELSIO_T3 is not set
 # CONFIG_IXGB is not set
 # CONFIG_S2IO is not set
 # CONFIG_MYRI10GE is not set
@@ -627,8 +634,17 @@ CONFIG_BNX2=m
 # CONFIG_WAN is not set
 # CONFIG_FDDI is not set
 # CONFIG_HIPPI is not set
-# CONFIG_PPP is not set
+CONFIG_PPP=m
+CONFIG_PPP_MULTILINK=y
+CONFIG_PPP_FILTER=y
+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 is not set
+CONFIG_SLHC=m
 # CONFIG_NET_FC is not set
 # CONFIG_SHAPER is not set
 # CONFIG_NETCONSOLE is not set
@@ -1042,6 +1058,11 @@ CONFIG_SND_ALI5451=m
 CONFIG_SND_SUN_CS4231=m
 # CONFIG_SND_SUN_DBRI is not set
 
+#
+# SoC audio support
+#
+# CONFIG_SND_SOC is not set
+
 #
 # Open Sound System
 #
@@ -1052,6 +1073,7 @@ CONFIG_AC97_BUS=m
 # HID Devices
 #
 CONFIG_HID=y
+# CONFIG_HID_DEBUG is not set
 
 #
 # USB support
@@ -1066,9 +1088,7 @@ CONFIG_USB=y
 # Miscellaneous USB options
 #
 CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
 # CONFIG_USB_DYNAMIC_MINORS is not set
-# CONFIG_USB_MULTITHREAD_PROBE is not set
 # CONFIG_USB_OTG is not set
 
 #
@@ -1078,9 +1098,11 @@ CONFIG_USB_EHCI_HCD=m
 # CONFIG_USB_EHCI_SPLIT_ISO is not set
 # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
 # CONFIG_USB_EHCI_TT_NEWSCHED is not set
+# CONFIG_USB_EHCI_BIG_ENDIAN_MMIO 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_BIG_ENDIAN_DESC is not set
+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
 CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 CONFIG_USB_UHCI_HCD=m
 # CONFIG_USB_SL811_HCD is not set
@@ -1132,6 +1154,7 @@ CONFIG_USB_HIDDEV=y
 # CONFIG_USB_ATI_REMOTE2 is not set
 # CONFIG_USB_KEYSPAN_REMOTE is not set
 # CONFIG_USB_APPLETOUCH is not set
+# CONFIG_USB_GTCO is not set
 
 #
 # USB Imaging devices
@@ -1235,6 +1258,10 @@ CONFIG_USB_HIDDEV=y
 # DMA Devices
 #
 
+#
+# Auxiliary Display support
+#
+
 #
 # Virtualization
 #
@@ -1426,7 +1453,6 @@ CONFIG_SCHEDSTATS=y
 # CONFIG_RT_MUTEX_TESTER is not set
 # CONFIG_DEBUG_SPINLOCK is not set
 # CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
 # CONFIG_DEBUG_LOCK_ALLOC is not set
 # CONFIG_PROVE_LOCKING is not set
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
@@ -1473,8 +1499,10 @@ CONFIG_CRYPTO_TGR192=m
 CONFIG_CRYPTO_GF128MUL=m
 CONFIG_CRYPTO_ECB=m
 CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_PCBC=m
 CONFIG_CRYPTO_LRW=m
 CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_FCRYPT=m
 CONFIG_CRYPTO_BLOWFISH=m
 CONFIG_CRYPTO_TWOFISH=m
 CONFIG_CRYPTO_TWOFISH_COMMON=m
@@ -1489,6 +1517,7 @@ CONFIG_CRYPTO_ANUBIS=m
 CONFIG_CRYPTO_DEFLATE=y
 CONFIG_CRYPTO_MICHAEL_MIC=m
 CONFIG_CRYPTO_CRC32C=m
+CONFIG_CRYPTO_CAMELLIA=m
 CONFIG_CRYPTO_TEST=m
 
 #
@@ -1506,4 +1535,5 @@ CONFIG_LIBCRC32C=m
 CONFIG_ZLIB_INFLATE=y
 CONFIG_ZLIB_DEFLATE=y
 CONFIG_PLIST=y
-CONFIG_IOMAP_COPY=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
index c3d068c7a4128c5ad7a94a8ad62936f425fe2569..b5ff3ee5ace1cc23d3a86cd50878568b505ea7d8 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/seq_file.h>
 #include <linux/bootmem.h>
 #include <linux/irq.h>
+#include <linux/msi.h>
 
 #include <asm/ptrace.h>
 #include <asm/processor.h>
@@ -87,7 +88,6 @@ struct ino_bucket ivector_table[NUM_IVECS] __attribute__ ((aligned (SMP_CACHE_BY
 #define irq_work(__cpu)        &(trap_block[(__cpu)].irq_worklist)
 
 static unsigned int virt_to_real_irq_table[NR_IRQS];
-static unsigned char virt_irq_cur = 1;
 
 static unsigned char virt_irq_alloc(unsigned int real_irq)
 {
@@ -95,26 +95,32 @@ static unsigned char virt_irq_alloc(unsigned int real_irq)
 
        BUILD_BUG_ON(NR_IRQS >= 256);
 
-       ent = virt_irq_cur;
+       for (ent = 1; ent < NR_IRQS; ent++) {
+               if (!virt_to_real_irq_table[ent])
+                       break;
+       }
        if (ent >= NR_IRQS) {
                printk(KERN_ERR "IRQ: Out of virtual IRQs.\n");
                return 0;
        }
 
-       virt_irq_cur = ent + 1;
        virt_to_real_irq_table[ent] = real_irq;
 
        return ent;
 }
 
-#if 0 /* Currently unused. */
-static unsigned char real_to_virt_irq(unsigned int real_irq)
+static void virt_irq_free(unsigned int virt_irq)
 {
-       struct ino_bucket *bucket = __bucket(real_irq);
+       unsigned int real_irq;
 
-       return bucket->virt_irq;
+       if (virt_irq >= NR_IRQS)
+               return;
+
+       real_irq = virt_to_real_irq_table[virt_irq];
+       virt_to_real_irq_table[virt_irq] = 0;
+
+       __bucket(real_irq)->virt_irq = 0;
 }
-#endif
 
 static unsigned int virt_to_real_irq(unsigned char virt_irq)
 {
@@ -268,8 +274,7 @@ static int irq_choose_cpu(unsigned int virt_irq)
 
 static void sun4u_irq_enable(unsigned int virt_irq)
 {
-       irq_desc_t *desc = irq_desc + virt_irq;
-       struct irq_handler_data *data = desc->handler_data;
+       struct irq_handler_data *data = get_irq_chip_data(virt_irq);
 
        if (likely(data)) {
                unsigned long cpuid, imap;
@@ -286,8 +291,7 @@ static void sun4u_irq_enable(unsigned int virt_irq)
 
 static void sun4u_irq_disable(unsigned int virt_irq)
 {
-       irq_desc_t *desc = irq_desc + virt_irq;
-       struct irq_handler_data *data = desc->handler_data;
+       struct irq_handler_data *data = get_irq_chip_data(virt_irq);
 
        if (likely(data)) {
                unsigned long imap = data->imap;
@@ -300,8 +304,7 @@ static void sun4u_irq_disable(unsigned int virt_irq)
 
 static void sun4u_irq_end(unsigned int virt_irq)
 {
-       irq_desc_t *desc = irq_desc + virt_irq;
-       struct irq_handler_data *data = desc->handler_data;
+       struct irq_handler_data *data = get_irq_chip_data(virt_irq);
 
        if (likely(data))
                upa_writel(ICLR_IDLE, data->iclr);
@@ -344,6 +347,20 @@ static void sun4v_irq_disable(unsigned int virt_irq)
        }
 }
 
+#ifdef CONFIG_PCI_MSI
+static void sun4v_msi_enable(unsigned int virt_irq)
+{
+       sun4v_irq_enable(virt_irq);
+       unmask_msi_irq(virt_irq);
+}
+
+static void sun4v_msi_disable(unsigned int virt_irq)
+{
+       mask_msi_irq(virt_irq);
+       sun4v_irq_disable(virt_irq);
+}
+#endif
+
 static void sun4v_irq_end(unsigned int virt_irq)
 {
        struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
@@ -362,8 +379,7 @@ static void sun4v_irq_end(unsigned int virt_irq)
 static void run_pre_handler(unsigned int virt_irq)
 {
        struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
-       irq_desc_t *desc = irq_desc + virt_irq;
-       struct irq_handler_data *data = desc->handler_data;
+       struct irq_handler_data *data = get_irq_chip_data(virt_irq);
 
        if (likely(data->pre_handler)) {
                data->pre_handler(__irq_ino(__irq(bucket)),
@@ -402,30 +418,47 @@ static struct irq_chip sun4v_irq_ack = {
        .end            = sun4v_irq_end,
 };
 
+#ifdef CONFIG_PCI_MSI
+static struct irq_chip sun4v_msi = {
+       .typename       = "sun4v+msi",
+       .mask           = mask_msi_irq,
+       .unmask         = unmask_msi_irq,
+       .enable         = sun4v_msi_enable,
+       .disable        = sun4v_msi_disable,
+       .ack            = run_pre_handler,
+       .end            = sun4v_irq_end,
+};
+#endif
+
 void irq_install_pre_handler(int virt_irq,
                             void (*func)(unsigned int, void *, void *),
                             void *arg1, void *arg2)
 {
-       irq_desc_t *desc = irq_desc + virt_irq;
-       struct irq_handler_data *data = desc->handler_data;
+       struct irq_handler_data *data = get_irq_chip_data(virt_irq);
+       struct irq_chip *chip;
 
        data->pre_handler = func;
        data->pre_handler_arg1 = arg1;
        data->pre_handler_arg2 = arg2;
 
-       if (desc->chip == &sun4u_irq_ack ||
-           desc->chip == &sun4v_irq_ack)
+       chip = get_irq_chip(virt_irq);
+       if (chip == &sun4u_irq_ack ||
+           chip == &sun4v_irq_ack
+#ifdef CONFIG_PCI_MSI
+           || chip == &sun4v_msi
+#endif
+           )
                return;
 
-       desc->chip = (desc->chip == &sun4u_irq ?
-                     &sun4u_irq_ack : &sun4v_irq_ack);
+       chip = (chip == &sun4u_irq ?
+               &sun4u_irq_ack : &sun4v_irq_ack);
+       set_irq_chip(virt_irq, chip);
 }
 
 unsigned int build_irq(int inofixup, unsigned long iclr, unsigned long imap)
 {
        struct ino_bucket *bucket;
        struct irq_handler_data *data;
-       irq_desc_t *desc;
        int ino;
 
        BUG_ON(tlb_type == hypervisor);
@@ -434,11 +467,11 @@ unsigned int build_irq(int inofixup, unsigned long iclr, unsigned long imap)
        bucket = &ivector_table[ino];
        if (!bucket->virt_irq) {
                bucket->virt_irq = virt_irq_alloc(__irq(bucket));
-               irq_desc[bucket->virt_irq].chip = &sun4u_irq;
+               set_irq_chip(bucket->virt_irq, &sun4u_irq);
        }
 
-       desc = irq_desc + bucket->virt_irq;
-       if (unlikely(desc->handler_data))
+       data = get_irq_chip_data(bucket->virt_irq);
+       if (unlikely(data))
                goto out;
 
        data = kzalloc(sizeof(struct irq_handler_data), GFP_ATOMIC);
@@ -446,7 +479,7 @@ unsigned int build_irq(int inofixup, unsigned long iclr, unsigned long imap)
                prom_printf("IRQ: kzalloc(irq_handler_data) failed.\n");
                prom_halt();
        }
-       desc->handler_data = data;
+       set_irq_chip_data(bucket->virt_irq, data);
 
        data->imap  = imap;
        data->iclr  = iclr;
@@ -460,7 +493,6 @@ unsigned int sun4v_build_irq(u32 devhandle, unsigned int devino)
        struct ino_bucket *bucket;
        struct irq_handler_data *data;
        unsigned long sysino;
-       irq_desc_t *desc;
 
        BUG_ON(tlb_type != hypervisor);
 
@@ -468,11 +500,11 @@ unsigned int sun4v_build_irq(u32 devhandle, unsigned int devino)
        bucket = &ivector_table[sysino];
        if (!bucket->virt_irq) {
                bucket->virt_irq = virt_irq_alloc(__irq(bucket));
-               irq_desc[bucket->virt_irq].chip = &sun4v_irq;
+               set_irq_chip(bucket->virt_irq, &sun4v_irq);
        }
 
-       desc = irq_desc + bucket->virt_irq;
-       if (unlikely(desc->handler_data))
+       data = get_irq_chip_data(bucket->virt_irq);
+       if (unlikely(data))
                goto out;
 
        data = kzalloc(sizeof(struct irq_handler_data), GFP_ATOMIC);
@@ -480,7 +512,7 @@ unsigned int sun4v_build_irq(u32 devhandle, unsigned int devino)
                prom_printf("IRQ: kzalloc(irq_handler_data) failed.\n");
                prom_halt();
        }
-       desc->handler_data = data;
+       set_irq_chip_data(bucket->virt_irq, data);
 
        /* Catch accidental accesses to these things.  IMAP/ICLR handling
         * is done by hypervisor calls on sun4v platforms, not by direct
@@ -493,6 +525,56 @@ out:
        return bucket->virt_irq;
 }
 
+#ifdef CONFIG_PCI_MSI
+unsigned int sun4v_build_msi(u32 devhandle, unsigned int *virt_irq_p,
+                            unsigned int msi_start, unsigned int msi_end)
+{
+       struct ino_bucket *bucket;
+       struct irq_handler_data *data;
+       unsigned long sysino;
+       unsigned int devino;
+
+       BUG_ON(tlb_type != hypervisor);
+
+       /* Find a free devino in the given range.  */
+       for (devino = msi_start; devino < msi_end; devino++) {
+               sysino = sun4v_devino_to_sysino(devhandle, devino);
+               bucket = &ivector_table[sysino];
+               if (!bucket->virt_irq)
+                       break;
+       }
+       if (devino >= msi_end)
+               return 0;
+
+       sysino = sun4v_devino_to_sysino(devhandle, devino);
+       bucket = &ivector_table[sysino];
+       bucket->virt_irq = virt_irq_alloc(__irq(bucket));
+       *virt_irq_p = bucket->virt_irq;
+       set_irq_chip(bucket->virt_irq, &sun4v_msi);
+
+       data = get_irq_chip_data(bucket->virt_irq);
+       if (unlikely(data))
+               return devino;
+
+       data = kzalloc(sizeof(struct irq_handler_data), GFP_ATOMIC);
+       if (unlikely(!data)) {
+               prom_printf("IRQ: kzalloc(irq_handler_data) failed.\n");
+               prom_halt();
+       }
+       set_irq_chip_data(bucket->virt_irq, data);
+
+       data->imap = ~0UL;
+       data->iclr = ~0UL;
+
+       return devino;
+}
+
+void sun4v_destroy_msi(unsigned int virt_irq)
+{
+       virt_irq_free(virt_irq);
+}
+#endif
+
 void ack_bad_irq(unsigned int virt_irq)
 {
        struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
index dfc41cd4bb5d06f690fa47080e8a6dcbecb3c65e..6b740eb6fe7e45915a0e4372cf496036b3d3fb23 100644 (file)
@@ -13,6 +13,8 @@
 #include <linux/capability.h>
 #include <linux/errno.h>
 #include <linux/smp_lock.h>
+#include <linux/msi.h>
+#include <linux/irq.h>
 #include <linux/init.h>
 
 #include <asm/uaccess.h>
@@ -646,4 +648,37 @@ int pci_domain_nr(struct pci_bus *pbus)
 }
 EXPORT_SYMBOL(pci_domain_nr);
 
+#ifdef CONFIG_PCI_MSI
+int arch_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)
+{
+       struct pcidev_cookie *pcp = pdev->sysdata;
+       struct pci_pbm_info *pbm = pcp->pbm;
+       struct pci_controller_info *p = pbm->parent;
+       int virt_irq, err;
+
+       if (!pbm->msi_num || !p->setup_msi_irq)
+               return -EINVAL;
+
+       err = p->setup_msi_irq(&virt_irq, pdev, desc);
+       if (err < 0)
+               return err;
+
+       return virt_irq;
+}
+
+void arch_teardown_msi_irq(unsigned int virt_irq)
+{
+       struct msi_desc *entry = get_irq_data(virt_irq);
+       struct pci_dev *pdev = entry->dev;
+       struct pcidev_cookie *pcp = pdev->sysdata;
+       struct pci_pbm_info *pbm = pcp->pbm;
+       struct pci_controller_info *p = pbm->parent;
+
+       if (!pbm->msi_num || !p->setup_msi_irq)
+               return;
+
+       return p->teardown_msi_irq(virt_irq, pdev);
+}
+#endif /* !(CONFIG_PCI_MSI) */
+
 #endif /* !(CONFIG_PCI) */
index 827ae30aa4971e5306e1f8c0ed6db494e65b71ec..5a92cb90ebe009d18fb7f1a61656d48bd6ab42c1 100644 (file)
@@ -7,6 +7,8 @@
 #include <linux/string.h>
 #include <linux/slab.h>
 #include <linux/init.h>
+#include <linux/pci.h>
+#include <linux/device.h>
 
 #include <asm/pbm.h>
 #include <asm/prom.h>
@@ -129,6 +131,20 @@ static void __init fixup_obp_assignments(struct pci_dev *pdev,
        }
 }
 
+static ssize_t
+show_pciobppath_attr(struct device * dev, struct device_attribute * attr, char * buf)
+{
+       struct pci_dev *pdev;
+       struct pcidev_cookie *sysdata;
+
+       pdev = to_pci_dev(dev);
+       sysdata = pdev->sysdata;
+
+       return snprintf (buf, PAGE_SIZE, "%s\n", sysdata->prom_node->full_name);
+}
+
+static DEVICE_ATTR(obppath, S_IRUSR | S_IRGRP | S_IROTH, show_pciobppath_attr, NULL);
+
 /* Fill in the PCI device cookie sysdata for the given
  * PCI device.  This cookie is the means by which one
  * can get to OBP and PCI controller specific information
@@ -142,7 +158,7 @@ static void __init pdev_cookie_fillin(struct pci_pbm_info *pbm,
        struct pcidev_cookie *pcp;
        struct device_node *dp;
        struct property *prop;
-       int nregs, len;
+       int nregs, len, err;
 
        dp = find_device_prom_node(pbm, pdev, bus_node,
                                   &pregs, &nregs);
@@ -215,6 +231,13 @@ static void __init pdev_cookie_fillin(struct pci_pbm_info *pbm,
        fixup_obp_assignments(pdev, pcp);
 
        pdev->sysdata = pcp;
+
+       /* we don't really care if we can create this file or not,
+        * but we need to assign the result of the call or the world will fall
+        * under alien invasion and everybody will be frozen on a spaceship
+        * ready to be eaten on alpha centauri by some green and jelly humanoid.
+        */
+       err = sysfs_create_file(&pdev->dev.kobj, &dev_attr_obppath.attr);
 }
 
 void __init pci_fill_in_pbm_cookies(struct pci_bus *pbus,
index 6b04794b7a971bab494b7837748c6bc741bc7e5b..ec22cd61ec8ce8eeab6689a6de6ff4d04efc948d 100644 (file)
@@ -10,6 +10,8 @@
 #include <linux/slab.h>
 #include <linux/interrupt.h>
 #include <linux/percpu.h>
+#include <linux/irq.h>
+#include <linux/msi.h>
 
 #include <asm/pbm.h>
 #include <asm/iommu.h>
@@ -1074,6 +1076,443 @@ static void pci_sun4v_get_bus_range(struct pci_pbm_info *pbm)
 
 }
 
+#ifdef CONFIG_PCI_MSI
+struct pci_sun4v_msiq_entry {
+       u64             version_type;
+#define MSIQ_VERSION_MASK              0xffffffff00000000UL
+#define MSIQ_VERSION_SHIFT             32
+#define MSIQ_TYPE_MASK                 0x00000000000000ffUL
+#define MSIQ_TYPE_SHIFT                        0
+#define MSIQ_TYPE_NONE                 0x00
+#define MSIQ_TYPE_MSG                  0x01
+#define MSIQ_TYPE_MSI32                        0x02
+#define MSIQ_TYPE_MSI64                        0x03
+#define MSIQ_TYPE_INTX                 0x08
+#define MSIQ_TYPE_NONE2                        0xff
+
+       u64             intx_sysino;
+       u64             reserved1;
+       u64             stick;
+       u64             req_id;  /* bus/device/func */
+#define MSIQ_REQID_BUS_MASK            0xff00UL
+#define MSIQ_REQID_BUS_SHIFT           8
+#define MSIQ_REQID_DEVICE_MASK         0x00f8UL
+#define MSIQ_REQID_DEVICE_SHIFT                3
+#define MSIQ_REQID_FUNC_MASK           0x0007UL
+#define MSIQ_REQID_FUNC_SHIFT          0
+
+       u64             msi_address;
+
+       /* The format of this value is message type dependant.
+        * For MSI bits 15:0 are the data from the MSI packet.
+        * For MSI-X bits 31:0 are the data from the MSI packet.
+        * For MSG, the message code and message routing code where:
+        *      bits 39:32 is the bus/device/fn of the msg target-id
+        *      bits 18:16 is the message routing code
+        *      bits 7:0 is the message code
+        * For INTx the low order 2-bits are:
+        *      00 - INTA
+        *      01 - INTB
+        *      10 - INTC
+        *      11 - INTD
+        */
+       u64             msi_data;
+
+       u64             reserved2;
+};
+
+/* For now this just runs as a pre-handler for the real interrupt handler.
+ * So we just walk through the queue and ACK all the entries, update the
+ * head pointer, and return.
+ *
+ * In the longer term it would be nice to do something more integrated
+ * wherein we can pass in some of this MSI info to the drivers.  This
+ * would be most useful for PCIe fabric error messages, although we could
+ * invoke those directly from the loop here in order to pass the info around.
+ */
+static void pci_sun4v_msi_prehandler(unsigned int ino, void *data1, void *data2)
+{
+       struct pci_pbm_info *pbm = data1;
+       struct pci_sun4v_msiq_entry *base, *ep;
+       unsigned long msiqid, orig_head, head, type, err;
+
+       msiqid = (unsigned long) data2;
+
+       head = 0xdeadbeef;
+       err = pci_sun4v_msiq_gethead(pbm->devhandle, msiqid, &head);
+       if (unlikely(err))
+               goto hv_error_get;
+
+       if (unlikely(head >= (pbm->msiq_ent_count * sizeof(struct pci_sun4v_msiq_entry))))
+               goto bad_offset;
+
+       head /= sizeof(struct pci_sun4v_msiq_entry);
+       orig_head = head;
+       base = (pbm->msi_queues + ((msiqid - pbm->msiq_first) *
+                                  (pbm->msiq_ent_count *
+                                   sizeof(struct pci_sun4v_msiq_entry))));
+       ep = &base[head];
+       while ((ep->version_type & MSIQ_TYPE_MASK) != 0) {
+               type = (ep->version_type & MSIQ_TYPE_MASK) >> MSIQ_TYPE_SHIFT;
+               if (unlikely(type != MSIQ_TYPE_MSI32 &&
+                            type != MSIQ_TYPE_MSI64))
+                       goto bad_type;
+
+               pci_sun4v_msi_setstate(pbm->devhandle,
+                                      ep->msi_data /* msi_num */,
+                                      HV_MSISTATE_IDLE);
+
+               /* Clear the entry.  */
+               ep->version_type &= ~MSIQ_TYPE_MASK;
+
+               /* Go to next entry in ring.  */
+               head++;
+               if (head >= pbm->msiq_ent_count)
+                       head = 0;
+               ep = &base[head];
+       }
+
+       if (likely(head != orig_head)) {
+               /* ACK entries by updating head pointer.  */
+               head *= sizeof(struct pci_sun4v_msiq_entry);
+               err = pci_sun4v_msiq_sethead(pbm->devhandle, msiqid, head);
+               if (unlikely(err))
+                       goto hv_error_set;
+       }
+       return;
+
+hv_error_set:
+       printk(KERN_EMERG "MSI: Hypervisor set head gives error %lu\n", err);
+       goto hv_error_cont;
+
+hv_error_get:
+       printk(KERN_EMERG "MSI: Hypervisor get head gives error %lu\n", err);
+
+hv_error_cont:
+       printk(KERN_EMERG "MSI: devhandle[%x] msiqid[%lx] head[%lu]\n",
+              pbm->devhandle, msiqid, head);
+       return;
+
+bad_offset:
+       printk(KERN_EMERG "MSI: Hypervisor gives bad offset %lx max(%lx)\n",
+              head, pbm->msiq_ent_count * sizeof(struct pci_sun4v_msiq_entry));
+       return;
+
+bad_type:
+       printk(KERN_EMERG "MSI: Entry has bad type %lx\n", type);
+       return;
+}
+
+static int msi_bitmap_alloc(struct pci_pbm_info *pbm)
+{
+       unsigned long size, bits_per_ulong;
+
+       bits_per_ulong = sizeof(unsigned long) * 8;
+       size = (pbm->msi_num + (bits_per_ulong - 1)) & ~(bits_per_ulong - 1);
+       size /= 8;
+       BUG_ON(size % sizeof(unsigned long));
+
+       pbm->msi_bitmap = kzalloc(size, GFP_KERNEL);
+       if (!pbm->msi_bitmap)
+               return -ENOMEM;
+
+       return 0;
+}
+
+static void msi_bitmap_free(struct pci_pbm_info *pbm)
+{
+       kfree(pbm->msi_bitmap);
+       pbm->msi_bitmap = NULL;
+}
+
+static int msi_queue_alloc(struct pci_pbm_info *pbm)
+{
+       unsigned long q_size, alloc_size, pages, order;
+       int i;
+
+       q_size = pbm->msiq_ent_count * sizeof(struct pci_sun4v_msiq_entry);
+       alloc_size = (pbm->msiq_num * q_size);
+       order = get_order(alloc_size);
+       pages = __get_free_pages(GFP_KERNEL | __GFP_COMP, order);
+       if (pages == 0UL) {
+               printk(KERN_ERR "MSI: Cannot allocate MSI queues (o=%lu).\n",
+                      order);
+               return -ENOMEM;
+       }
+       memset((char *)pages, 0, PAGE_SIZE << order);
+       pbm->msi_queues = (void *) pages;
+
+       for (i = 0; i < pbm->msiq_num; i++) {
+               unsigned long err, base = __pa(pages + (i * q_size));
+               unsigned long ret1, ret2;
+
+               err = pci_sun4v_msiq_conf(pbm->devhandle,
+                                         pbm->msiq_first + i,
+                                         base, pbm->msiq_ent_count);
+               if (err) {
+                       printk(KERN_ERR "MSI: msiq register fails (err=%lu)\n",
+                              err);
+                       goto h_error;
+               }
+
+               err = pci_sun4v_msiq_info(pbm->devhandle,
+                                         pbm->msiq_first + i,
+                                         &ret1, &ret2);
+               if (err) {
+                       printk(KERN_ERR "MSI: Cannot read msiq (err=%lu)\n",
+                              err);
+                       goto h_error;
+               }
+               if (ret1 != base || ret2 != pbm->msiq_ent_count) {
+                       printk(KERN_ERR "MSI: Bogus qconf "
+                              "expected[%lx:%x] got[%lx:%lx]\n",
+                              base, pbm->msiq_ent_count,
+                              ret1, ret2);
+                       goto h_error;
+               }
+       }
+
+       return 0;
+
+h_error:
+       free_pages(pages, order);
+       return -EINVAL;
+}
+
+static void pci_sun4v_msi_init(struct pci_pbm_info *pbm)
+{
+       u32 *val;
+       int len;
+
+       val = of_get_property(pbm->prom_node, "#msi-eqs", &len);
+       if (!val || len != 4)
+               goto no_msi;
+       pbm->msiq_num = *val;
+       if (pbm->msiq_num) {
+               struct msiq_prop {
+                       u32 first_msiq;
+                       u32 num_msiq;
+                       u32 first_devino;
+               } *mqp;
+               struct msi_range_prop {
+                       u32 first_msi;
+                       u32 num_msi;
+               } *mrng;
+               struct addr_range_prop {
+                       u32 msi32_high;
+                       u32 msi32_low;
+                       u32 msi32_len;
+                       u32 msi64_high;
+                       u32 msi64_low;
+                       u32 msi64_len;
+               } *arng;
+
+               val = of_get_property(pbm->prom_node, "msi-eq-size", &len);
+               if (!val || len != 4)
+                       goto no_msi;
+
+               pbm->msiq_ent_count = *val;
+
+               mqp = of_get_property(pbm->prom_node,
+                                     "msi-eq-to-devino", &len);
+               if (!mqp || len != sizeof(struct msiq_prop))
+                       goto no_msi;
+
+               pbm->msiq_first = mqp->first_msiq;
+               pbm->msiq_first_devino = mqp->first_devino;
+
+               val = of_get_property(pbm->prom_node, "#msi", &len);
+               if (!val || len != 4)
+                       goto no_msi;
+               pbm->msi_num = *val;
+
+               mrng = of_get_property(pbm->prom_node, "msi-ranges", &len);
+               if (!mrng || len != sizeof(struct msi_range_prop))
+                       goto no_msi;
+               pbm->msi_first = mrng->first_msi;
+
+               val = of_get_property(pbm->prom_node, "msi-data-mask", &len);
+               if (!val || len != 4)
+                       goto no_msi;
+               pbm->msi_data_mask = *val;
+
+               val = of_get_property(pbm->prom_node, "msix-data-width", &len);
+               if (!val || len != 4)
+                       goto no_msi;
+               pbm->msix_data_width = *val;
+
+               arng = of_get_property(pbm->prom_node, "msi-address-ranges",
+                                      &len);
+               if (!arng || len != sizeof(struct addr_range_prop))
+                       goto no_msi;
+               pbm->msi32_start = ((u64)arng->msi32_high << 32) |
+                       (u64) arng->msi32_low;
+               pbm->msi64_start = ((u64)arng->msi64_high << 32) |
+                       (u64) arng->msi64_low;
+               pbm->msi32_len = arng->msi32_len;
+               pbm->msi64_len = arng->msi64_len;
+
+               if (msi_bitmap_alloc(pbm))
+                       goto no_msi;
+
+               if (msi_queue_alloc(pbm)) {
+                       msi_bitmap_free(pbm);
+                       goto no_msi;
+               }
+
+               printk(KERN_INFO "%s: MSI Queue first[%u] num[%u] count[%u] "
+                      "devino[0x%x]\n",
+                      pbm->name,
+                      pbm->msiq_first, pbm->msiq_num,
+                      pbm->msiq_ent_count,
+                      pbm->msiq_first_devino);
+               printk(KERN_INFO "%s: MSI first[%u] num[%u] mask[0x%x] "
+                      "width[%u]\n",
+                      pbm->name,
+                      pbm->msi_first, pbm->msi_num, pbm->msi_data_mask,
+                      pbm->msix_data_width);
+               printk(KERN_INFO "%s: MSI addr32[0x%lx:0x%x] "
+                      "addr64[0x%lx:0x%x]\n",
+                      pbm->name,
+                      pbm->msi32_start, pbm->msi32_len,
+                      pbm->msi64_start, pbm->msi64_len);
+               printk(KERN_INFO "%s: MSI queues at RA [%p]\n",
+                      pbm->name,
+                      pbm->msi_queues);
+       }
+
+       return;
+
+no_msi:
+       pbm->msiq_num = 0;
+       printk(KERN_INFO "%s: No MSI support.\n", pbm->name);
+}
+
+static int alloc_msi(struct pci_pbm_info *pbm)
+{
+       int i;
+
+       for (i = 0; i < pbm->msi_num; i++) {
+               if (!test_and_set_bit(i, pbm->msi_bitmap))
+                       return i + pbm->msi_first;
+       }
+
+       return -ENOENT;
+}
+
+static void free_msi(struct pci_pbm_info *pbm, int msi_num)
+{
+       msi_num -= pbm->msi_first;
+       clear_bit(msi_num, pbm->msi_bitmap);
+}
+
+static int pci_sun4v_setup_msi_irq(unsigned int *virt_irq_p,
+                                  struct pci_dev *pdev,
+                                  struct msi_desc *entry)
+{
+       struct pcidev_cookie *pcp = pdev->sysdata;
+       struct pci_pbm_info *pbm = pcp->pbm;
+       unsigned long devino, msiqid;
+       struct msi_msg msg;
+       int msi_num, err;
+
+       *virt_irq_p = 0;
+
+       msi_num = alloc_msi(pbm);
+       if (msi_num < 0)
+               return msi_num;
+
+       devino = sun4v_build_msi(pbm->devhandle, virt_irq_p,
+                                pbm->msiq_first_devino,
+                                (pbm->msiq_first_devino +
+                                 pbm->msiq_num));
+       err = -ENOMEM;
+       if (!devino)
+               goto out_err;
+
+       set_irq_msi(*virt_irq_p, entry);
+
+       msiqid = ((devino - pbm->msiq_first_devino) +
+                 pbm->msiq_first);
+
+       err = -EINVAL;
+       if (pci_sun4v_msiq_setstate(pbm->devhandle, msiqid, HV_MSIQSTATE_IDLE))
+       if (err)
+               goto out_err;
+
+       if (pci_sun4v_msiq_setvalid(pbm->devhandle, msiqid, HV_MSIQ_VALID))
+               goto out_err;
+
+       if (pci_sun4v_msi_setmsiq(pbm->devhandle,
+                                 msi_num, msiqid,
+                                 (entry->msi_attrib.is_64 ?
+                                  HV_MSITYPE_MSI64 : HV_MSITYPE_MSI32)))
+               goto out_err;
+
+       if (pci_sun4v_msi_setstate(pbm->devhandle, msi_num, HV_MSISTATE_IDLE))
+               goto out_err;
+
+       if (pci_sun4v_msi_setvalid(pbm->devhandle, msi_num, HV_MSIVALID_VALID))
+               goto out_err;
+
+       pcp->msi_num = msi_num;
+
+       if (entry->msi_attrib.is_64) {
+               msg.address_hi = pbm->msi64_start >> 32;
+               msg.address_lo = pbm->msi64_start & 0xffffffff;
+       } else {
+               msg.address_hi = 0;
+               msg.address_lo = pbm->msi32_start;
+       }
+       msg.data = msi_num;
+       write_msi_msg(*virt_irq_p, &msg);
+
+       irq_install_pre_handler(*virt_irq_p,
+                               pci_sun4v_msi_prehandler,
+                               pbm, (void *) msiqid);
+
+       return 0;
+
+out_err:
+       free_msi(pbm, msi_num);
+       sun4v_destroy_msi(*virt_irq_p);
+       *virt_irq_p = 0;
+       return err;
+
+}
+
+static void pci_sun4v_teardown_msi_irq(unsigned int virt_irq,
+                                      struct pci_dev *pdev)
+{
+       struct pcidev_cookie *pcp = pdev->sysdata;
+       struct pci_pbm_info *pbm = pcp->pbm;
+       unsigned long msiqid, err;
+       unsigned int msi_num;
+
+       msi_num = pcp->msi_num;
+       err = pci_sun4v_msi_getmsiq(pbm->devhandle, msi_num, &msiqid);
+       if (err) {
+               printk(KERN_ERR "%s: getmsiq gives error %lu\n",
+                      pbm->name, err);
+               return;
+       }
+
+       pci_sun4v_msi_setvalid(pbm->devhandle, msi_num, HV_MSIVALID_INVALID);
+       pci_sun4v_msiq_setvalid(pbm->devhandle, msiqid, HV_MSIQ_INVALID);
+
+       free_msi(pbm, msi_num);
+
+       /* The sun4v_destroy_msi() will liberate the devino and thus the MSIQ
+        * allocation.
+        */
+       sun4v_destroy_msi(virt_irq);
+}
+#else /* CONFIG_PCI_MSI */
+static void pci_sun4v_msi_init(struct pci_pbm_info *pbm)
+{
+}
+#endif /* !(CONFIG_PCI_MSI) */
+
 static void pci_sun4v_pbm_init(struct pci_controller_info *p, struct device_node *dp, u32 devhandle)
 {
        struct pci_pbm_info *pbm;
@@ -1119,6 +1558,7 @@ static void pci_sun4v_pbm_init(struct pci_controller_info *p, struct device_node
 
        pci_sun4v_get_bus_range(pbm);
        pci_sun4v_iommu_init(pbm);
+       pci_sun4v_msi_init(pbm);
 
        pdev_htab_populate(pbm);
 }
@@ -1187,6 +1627,10 @@ void sun4v_pci_init(struct device_node *dp, char *model_name)
        p->scan_bus = pci_sun4v_scan_bus;
        p->base_address_update = pci_sun4v_base_address_update;
        p->resource_adjust = pci_sun4v_resource_adjust;
+#ifdef CONFIG_PCI_MSI
+       p->setup_msi_irq = pci_sun4v_setup_msi_irq;
+       p->teardown_msi_irq = pci_sun4v_teardown_msi_irq;
+#endif
        p->pci_ops = &pci_sun4v_ops;
 
        /* Like PSYCHO and SCHIZO we have a 2GB aligned area
index 884d25f6158dad36a58c6c4c30365c910530d7a1..8e9fc3a5b4f52d68120d360fa0d18ca6f0e9b2a7 100644 (file)
@@ -28,4 +28,65 @@ extern int pci_sun4v_config_put(unsigned long devhandle,
                                unsigned long size,
                                unsigned long data);
 
+extern unsigned long pci_sun4v_msiq_conf(unsigned long devhandle,
+                                        unsigned long msiqid,
+                                        unsigned long msiq_paddr,
+                                        unsigned long num_entries);
+extern unsigned long pci_sun4v_msiq_info(unsigned long devhandle,
+                                        unsigned long msiqid,
+                                        unsigned long *msiq_paddr,
+                                        unsigned long *num_entries);
+extern unsigned long pci_sun4v_msiq_getvalid(unsigned long devhandle,
+                                            unsigned long msiqid,
+                                            unsigned long *valid);
+extern unsigned long pci_sun4v_msiq_setvalid(unsigned long devhandle,
+                                            unsigned long msiqid,
+                                            unsigned long valid);
+extern unsigned long pci_sun4v_msiq_getstate(unsigned long devhandle,
+                                            unsigned long msiqid,
+                                            unsigned long *state);
+extern unsigned long pci_sun4v_msiq_setstate(unsigned long devhandle,
+                                            unsigned long msiqid,
+                                            unsigned long state);
+extern unsigned long pci_sun4v_msiq_gethead(unsigned long devhandle,
+                                            unsigned long msiqid,
+                                            unsigned long *head);
+extern unsigned long pci_sun4v_msiq_sethead(unsigned long devhandle,
+                                            unsigned long msiqid,
+                                            unsigned long head);
+extern unsigned long pci_sun4v_msiq_gettail(unsigned long devhandle,
+                                            unsigned long msiqid,
+                                            unsigned long *head);
+extern unsigned long pci_sun4v_msi_getvalid(unsigned long devhandle,
+                                           unsigned long msinum,
+                                           unsigned long *valid);
+extern unsigned long pci_sun4v_msi_setvalid(unsigned long devhandle,
+                                           unsigned long msinum,
+                                           unsigned long valid);
+extern unsigned long pci_sun4v_msi_getmsiq(unsigned long devhandle,
+                                          unsigned long msinum,
+                                          unsigned long *msiq);
+extern unsigned long pci_sun4v_msi_setmsiq(unsigned long devhandle,
+                                          unsigned long msinum,
+                                          unsigned long msiq,
+                                          unsigned long msitype);
+extern unsigned long pci_sun4v_msi_getstate(unsigned long devhandle,
+                                           unsigned long msinum,
+                                           unsigned long *state);
+extern unsigned long pci_sun4v_msi_setstate(unsigned long devhandle,
+                                           unsigned long msinum,
+                                           unsigned long state);
+extern unsigned long pci_sun4v_msg_getmsiq(unsigned long devhandle,
+                                          unsigned long msinum,
+                                          unsigned long *msiq);
+extern unsigned long pci_sun4v_msg_setmsiq(unsigned long devhandle,
+                                          unsigned long msinum,
+                                          unsigned long msiq);
+extern unsigned long pci_sun4v_msg_getvalid(unsigned long devhandle,
+                                           unsigned long msinum,
+                                           unsigned long *valid);
+extern unsigned long pci_sun4v_msg_setvalid(unsigned long devhandle,
+                                           unsigned long msinum,
+                                           unsigned long valid);
+
 #endif /* !(_PCI_SUN4V_H) */
index 6604fdbf746cc44b2c410013563a87e27ae84ee3..ecb81f389b0689ff3518448813a1532e96e50af5 100644 (file)
@@ -93,3 +93,269 @@ pci_sun4v_config_put:
         mov    -1, %o1
 1:     retl
         mov    %o1, %o0
+
+       /* %o0: devhandle
+        * %o1: msiqid
+        * %o2: msiq phys address
+        * %o3: num entries
+        *
+        * returns %o0: status
+        *
+        * status will be zero if the operation completed
+        * successfully, else -1 if not
+        */
+       .globl  pci_sun4v_msiq_conf
+pci_sun4v_msiq_conf:
+       mov     HV_FAST_PCI_MSIQ_CONF, %o5
+       ta      HV_FAST_TRAP
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msiqid
+        * %o2: &msiq_phys_addr
+        * %o3: &msiq_num_entries
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msiq_info
+pci_sun4v_msiq_info:
+       mov     %o2, %o4
+       mov     HV_FAST_PCI_MSIQ_INFO, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%o4]
+       stx     %o2, [%o3]
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msiqid
+        * %o2: &valid
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msiq_getvalid
+pci_sun4v_msiq_getvalid:
+       mov     HV_FAST_PCI_MSIQ_GETVALID, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%o2]
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msiqid
+        * %o2: valid
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msiq_setvalid
+pci_sun4v_msiq_setvalid:
+       mov     HV_FAST_PCI_MSIQ_SETVALID, %o5
+       ta      HV_FAST_TRAP
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msiqid
+        * %o2: &state
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msiq_getstate
+pci_sun4v_msiq_getstate:
+       mov     HV_FAST_PCI_MSIQ_GETSTATE, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%o2]
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msiqid
+        * %o2: state
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msiq_setstate
+pci_sun4v_msiq_setstate:
+       mov     HV_FAST_PCI_MSIQ_SETSTATE, %o5
+       ta      HV_FAST_TRAP
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msiqid
+        * %o2: &head
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msiq_gethead
+pci_sun4v_msiq_gethead:
+       mov     HV_FAST_PCI_MSIQ_GETHEAD, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%o2]
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msiqid
+        * %o2: head
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msiq_sethead
+pci_sun4v_msiq_sethead:
+       mov     HV_FAST_PCI_MSIQ_SETHEAD, %o5
+       ta      HV_FAST_TRAP
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msiqid
+        * %o2: &tail
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msiq_gettail
+pci_sun4v_msiq_gettail:
+       mov     HV_FAST_PCI_MSIQ_GETTAIL, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%o2]
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msinum
+        * %o2: &valid
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msi_getvalid
+pci_sun4v_msi_getvalid:
+       mov     HV_FAST_PCI_MSI_GETVALID, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%o2]
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msinum
+        * %o2: valid
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msi_setvalid
+pci_sun4v_msi_setvalid:
+       mov     HV_FAST_PCI_MSI_SETVALID, %o5
+       ta      HV_FAST_TRAP
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msinum
+        * %o2: &msiq
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msi_getmsiq
+pci_sun4v_msi_getmsiq:
+       mov     HV_FAST_PCI_MSI_GETMSIQ, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%o2]
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msinum
+        * %o2: msitype
+        * %o3: msiq
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msi_setmsiq
+pci_sun4v_msi_setmsiq:
+       mov     HV_FAST_PCI_MSI_SETMSIQ, %o5
+       ta      HV_FAST_TRAP
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msinum
+        * %o2: &state
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msi_getstate
+pci_sun4v_msi_getstate:
+       mov     HV_FAST_PCI_MSI_GETSTATE, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%o2]
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msinum
+        * %o2: state
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msi_setstate
+pci_sun4v_msi_setstate:
+       mov     HV_FAST_PCI_MSI_SETSTATE, %o5
+       ta      HV_FAST_TRAP
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msinum
+        * %o2: &msiq
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msg_getmsiq
+pci_sun4v_msg_getmsiq:
+       mov     HV_FAST_PCI_MSG_GETMSIQ, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%o2]
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msinum
+        * %o2: msiq
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msg_setmsiq
+pci_sun4v_msg_setmsiq:
+       mov     HV_FAST_PCI_MSG_SETMSIQ, %o5
+       ta      HV_FAST_TRAP
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msinum
+        * %o2: &valid
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msg_getvalid
+pci_sun4v_msg_getvalid:
+       mov     HV_FAST_PCI_MSG_GETVALID, %o5
+       ta      HV_FAST_TRAP
+       stx     %o1, [%o2]
+       retl
+        mov    %o0, %o0
+
+       /* %o0: devhandle
+        * %o1: msinum
+        * %o2: valid
+        *
+        * returns %o0: status
+        */
+       .globl  pci_sun4v_msg_setvalid
+pci_sun4v_msg_setvalid:
+       mov     HV_FAST_PCI_MSG_SETVALID, %o5
+       ta      HV_FAST_TRAP
+       retl
+        mov    %o0, %o0
+
index bf033b31d4376341a8cce56b9ec77e9127f6986b..451028341c7559570d7a6593db389024d07c4816 100644 (file)
@@ -315,7 +315,7 @@ void __init setup_arch(char **cmdline_p)
 {
        /* Initialize PROM console and command line. */
        *cmdline_p = prom_getbootargs();
-       strcpy(saved_command_line, *cmdline_p);
+       strcpy(boot_command_line, *cmdline_p);
 
        if (tlb_type == hypervisor)
                printk("ARCH: SUN4V\n");
index 3f619ead22cc89a70ed5905e782a041153626463..a05e43d517554b5a81befdef2f074e05283270f4 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/termios.h>
+#include <linux/tty.h>
 #include <linux/ioctl.h>
 #include <linux/route.h>
 #include <linux/sockios.h>
index e27cb71bd8e2c09a20bfe7d50b379c80b39abe0a..7876a02262852399ee3c27efa1d135d366feb528 100644 (file)
@@ -459,70 +459,6 @@ asmlinkage long compat_sys_sysfs(int option, u32 arg1, u32 arg2)
        return sys_sysfs(option, arg1, arg2);
 }
 
-struct sysinfo32 {
-        s32 uptime;
-        u32 loads[3];
-        u32 totalram;
-        u32 freeram;
-        u32 sharedram;
-        u32 bufferram;
-        u32 totalswap;
-        u32 freeswap;
-        unsigned short procs;
-       unsigned short pad;
-       u32 totalhigh;
-       u32 freehigh;
-       u32 mem_unit;
-       char _f[20-2*sizeof(int)-sizeof(int)];
-};
-
-asmlinkage long sys32_sysinfo(struct sysinfo32 __user *info)
-{
-       struct sysinfo s;
-       int ret, err;
-       int bitcount = 0;
-       mm_segment_t old_fs = get_fs ();
-       
-       set_fs(KERNEL_DS);
-       ret = sys_sysinfo((struct sysinfo __user *) &s);
-       set_fs(old_fs);
-       /* Check to see if any memory value is too large for 32-bit and
-         * scale down if needed.
-         */
-       if ((s.totalram >> 32) || (s.totalswap >> 32)) {
-               while (s.mem_unit < PAGE_SIZE) {
-                       s.mem_unit <<= 1;
-                       bitcount++;
-               }
-               s.totalram >>= bitcount;
-               s.freeram >>= bitcount;
-               s.sharedram >>= bitcount;
-               s.bufferram >>= bitcount;
-               s.totalswap >>= bitcount;
-               s.freeswap >>= bitcount;
-               s.totalhigh >>= bitcount;
-               s.freehigh >>= bitcount;
-       }
-
-       err = put_user (s.uptime, &info->uptime);
-       err |= __put_user (s.loads[0], &info->loads[0]);
-       err |= __put_user (s.loads[1], &info->loads[1]);
-       err |= __put_user (s.loads[2], &info->loads[2]);
-       err |= __put_user (s.totalram, &info->totalram);
-       err |= __put_user (s.freeram, &info->freeram);
-       err |= __put_user (s.sharedram, &info->sharedram);
-       err |= __put_user (s.bufferram, &info->bufferram);
-       err |= __put_user (s.totalswap, &info->totalswap);
-       err |= __put_user (s.freeswap, &info->freeswap);
-       err |= __put_user (s.procs, &info->procs);
-       err |= __put_user (s.totalhigh, &info->totalhigh);
-       err |= __put_user (s.freehigh, &info->freehigh);
-       err |= __put_user (s.mem_unit, &info->mem_unit);
-       if (err)
-               return -EFAULT;
-       return ret;
-}
-
 asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid, struct compat_timespec __user *interval)
 {
        struct timespec t;
index 2ebc2c0513832ad64ec09b9266d245eef0028622..4cff95b7b3a4732cdf1b2405833691b02216bf25 100644 (file)
@@ -824,10 +824,17 @@ asmlinkage int sunos_wait4(compat_pid_t pid, compat_uint_t __user *stat_addr, in
        return ret;
 }
 
-extern int kill_pg(int, int, int);
 asmlinkage int sunos_killpg(int pgrp, int sig)
 {
-       return kill_pg(pgrp, sig, 0);
+       int ret;
+
+       rcu_read_lock();
+       ret = -EINVAL;
+       if (pgrp > 0)
+               ret = kill_pgrp(find_pid(pgrp), sig, 0);
+       rcu_read_unlock();
+
+       return ret;
 }
 
 asmlinkage int sunos_audit(void)
index 9a8026797ac04c368db63eab8a43dcf445d2b0a8..948b7d2d5874f37030c85b69026a1046f2ba10c4 100644 (file)
@@ -61,7 +61,7 @@ sys_call_table32:
        .word sys32_epoll_wait, sys32_ioprio_set, sys_getppid, sys32_sigaction, sys_sgetmask
 /*200*/        .word sys32_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir
        .word sys32_readahead, sys32_socketcall, sys32_syslog, sys32_lookup_dcookie, sys32_fadvise64
-/*210*/        .word sys32_fadvise64_64, sys32_tgkill, sys32_waitpid, sys_swapoff, sys32_sysinfo
+/*210*/        .word sys32_fadvise64_64, sys32_tgkill, sys32_waitpid, sys_swapoff, compat_sys_sysinfo
        .word sys32_ipc, sys32_sigreturn, sys_clone, sys32_ioprio_get, compat_sys_adjtimex
 /*220*/        .word sys32_sigprocmask, sys_ni_syscall, sys32_delete_module, sys_ni_syscall, sys32_getpgid
        .word sys32_bdflush, sys32_sysfs, sys_nis_syscall, sys32_setfsuid16, sys32_setfsgid16
index 061e1b1fa5838e24701f9b307527c2d9c7325ca4..f84da4f1b7060a201d71b1c766797730d22fb945 100644 (file)
@@ -1327,7 +1327,7 @@ static int mini_rtc_release(struct inode *inode, struct file *file)
 }
 
 
-static struct file_operations mini_rtc_fops = {
+static const struct file_operations mini_rtc_fops = {
        .owner          = THIS_MODULE,
        .ioctl          = mini_rtc_ioctl,
        .open           = mini_rtc_open,
index 4a6063f33e7a4155e084cd50ba58a2617f3fa3c3..13fa2a2e4513b75cdae8052b544d5a96bf134c29 100644 (file)
@@ -81,10 +81,14 @@ SECTIONS
   __sun4v_2insn_patch = .;
   .sun4v_2insn_patch : { *(.sun4v_2insn_patch) }
   __sun4v_2insn_patch_end = .;
+
+#ifdef CONFIG_BLK_DEV_INITRD
   . = ALIGN(8192); 
   __initramfs_start = .;
   .init.ramfs : { *(.init.ramfs) }
   __initramfs_end = .;
+#endif
+
   . = ALIGN(8192);
   __per_cpu_start = .;
   .data.percpu  : { *(.data.percpu) }
index 054822a3e05ec6d64f9fead97c692a86f87fdc46..b1a1ee0cc6bd6b514e5d05b2b4d00d8e2de55e8b 100644 (file)
@@ -416,7 +416,7 @@ void show_mem(void)
        printk("Free swap:       %6ldkB\n",
               nr_swap_pages << (PAGE_SHIFT-10));
        printk("%ld pages of RAM\n", num_physpages);
-       printk("%d free pages\n", nr_free_pages());
+       printk("%lu free pages\n", nr_free_pages());
 }
 
 void mmu_info(struct seq_file *m)
@@ -1467,8 +1467,8 @@ void __init paging_init(void)
                for (znum = 0; znum < MAX_NR_ZONES; znum++)
                        zones_size[znum] = zholes_size[znum] = 0;
 
-               zones_size[ZONE_DMA] = end_pfn;
-               zholes_size[ZONE_DMA] = end_pfn - pages_avail;
+               zones_size[ZONE_NORMAL] = end_pfn;
+               zholes_size[ZONE_NORMAL] = end_pfn - pages_avail;
 
                free_area_init_node(0, &contig_page_data, zones_size,
                                    __pa(PAGE_OFFSET) >> PAGE_SHIFT,
@@ -1593,7 +1593,7 @@ void __init mem_init(void)
        initpages = (((unsigned long) __init_end) - ((unsigned long) __init_begin));
        initpages = PAGE_ALIGN(initpages) >> PAGE_SHIFT;
 
-       printk("Memory: %uk available (%ldk kernel code, %ldk data, %ldk init) [%016lx,%016lx]\n",
+       printk("Memory: %luk available (%ldk kernel code, %ldk data, %ldk init) [%016lx,%016lx]\n",
               nr_free_pages() << (PAGE_SHIFT-10),
               codepages << (PAGE_SHIFT-10),
               datapages << (PAGE_SHIFT-10), 
index 89a4757f192f5bee16b90fed7b793ce622bf36c7..c2864447de821d7f52367cf8ef98b9a9caf7f070 100644 (file)
@@ -163,7 +163,7 @@ static unsigned int socksys_poll(struct file * filp, poll_table * wait)
        return mask;
 }
        
-static struct file_operations socksys_fops = {
+static const struct file_operations socksys_fops = {
        .open =         socksys_open,
        .release =      socksys_release,
 };
index d32a80e6668c08c008714d8c0ef1f26ce6a4645b..b3a21ba77cd2a40f9784d3e5d86fe53dfb1fed67 100644 (file)
@@ -16,6 +16,9 @@ config MMU
        bool
        default y
 
+config NO_IOMEM
+       def_bool y
+
 mainmenu "Linux/Usermode Kernel Configuration"
 
 config ISA
index 7d4190e5565498c6eea6dce02fc3cc092a65b384..7b8baf146accc411487cb3c098db8825f0b56759 100644 (file)
 #include "line.h"
 #include "os.h"
 
-/* XXX: could well be moved to somewhere else, if needed. */
-static int my_printf(const char * fmt, ...)
-       __attribute__ ((format (printf, 1, 2)));
-
-static int my_printf(const char * fmt, ...)
-{
-       /* Yes, can be called on atomic context.*/
-       char *buf = kmalloc(4096, GFP_ATOMIC);
-       va_list args;
-       int r;
-
-       if (!buf) {
-               /* We print directly fmt.
-                * Yes, yes, yes, feel free to complain. */
-               r = strlen(fmt);
-       } else {
-               va_start(args, fmt);
-               r = vsprintf(buf, fmt, args);
-               va_end(args);
-               fmt = buf;
-       }
-
-       if (r)
-               r = os_write_file(1, fmt, r);
-       return r;
-
-}
-
 #ifdef CONFIG_NOCONFIG_CHAN
-/* Despite its name, there's no added trailing newline. */
-static int my_puts(const char * buf)
-{
-       return os_write_file(1, buf, strlen(buf));
-}
-
-static void *not_configged_init(char *str, int device, struct chan_opts *opts)
+static void *not_configged_init(char *str, int device,
+                               const struct chan_opts *opts)
 {
-       my_puts("Using a channel type which is configured out of "
+       printk("Using a channel type which is configured out of "
               "UML\n");
        return NULL;
 }
@@ -64,34 +31,34 @@ static void *not_configged_init(char *str, int device, struct chan_opts *opts)
 static int not_configged_open(int input, int output, int primary, void *data,
                              char **dev_out)
 {
-       my_puts("Using a channel type which is configured out of "
+       printk("Using a channel type which is configured out of "
               "UML\n");
        return -ENODEV;
 }
 
 static void not_configged_close(int fd, void *data)
 {
-       my_puts("Using a channel type which is configured out of "
+       printk("Using a channel type which is configured out of "
               "UML\n");
 }
 
 static int not_configged_read(int fd, char *c_out, void *data)
 {
-       my_puts("Using a channel type which is configured out of "
+       printk("Using a channel type which is configured out of "
               "UML\n");
        return -EIO;
 }
 
 static int not_configged_write(int fd, const char *buf, int len, void *data)
 {
-       my_puts("Using a channel type which is configured out of "
+       printk("Using a channel type which is configured out of "
               "UML\n");
        return -EIO;
 }
 
 static int not_configged_console_write(int fd, const char *buf, int len)
 {
-       my_puts("Using a channel type which is configured out of "
+       printk("Using a channel type which is configured out of "
               "UML\n");
        return -EIO;
 }
@@ -99,14 +66,14 @@ static int not_configged_console_write(int fd, const char *buf, int len)
 static int not_configged_window_size(int fd, void *data, unsigned short *rows,
                                     unsigned short *cols)
 {
-       my_puts("Using a channel type which is configured out of "
+       printk("Using a channel type which is configured out of "
               "UML\n");
        return -ENODEV;
 }
 
 static void not_configged_free(void *data)
 {
-       my_puts("Using a channel type which is configured out of "
+       printk("Using a channel type which is configured out of "
               "UML\n");
 }
 
@@ -255,15 +222,28 @@ void enable_chan(struct line *line)
        }
 }
 
+/* Items are added in IRQ context, when free_irq can't be called, and
+ * removed in process context, when it can.
+ * This handles interrupt sources which disappear, and which need to
+ * be permanently disabled.  This is discovered in IRQ context, but
+ * the freeing of the IRQ must be done later.
+ */
+static DEFINE_SPINLOCK(irqs_to_free_lock);
 static LIST_HEAD(irqs_to_free);
 
 void free_irqs(void)
 {
        struct chan *chan;
+       LIST_HEAD(list);
+       struct list_head *ele;
 
-       while(!list_empty(&irqs_to_free)){
-               chan = list_entry(irqs_to_free.next, struct chan, free_list);
-               list_del(&chan->free_list);
+       spin_lock_irq(&irqs_to_free_lock);
+       list_splice_init(&irqs_to_free, &list);
+       INIT_LIST_HEAD(&irqs_to_free);
+       spin_unlock_irq(&irqs_to_free_lock);
+
+       list_for_each(ele, &list){
+               chan = list_entry(ele, struct chan, free_list);
 
                if(chan->input)
                        free_irq(chan->line->driver->read_irq, chan);
@@ -279,7 +259,9 @@ static void close_one_chan(struct chan *chan, int delay_free_irq)
                return;
 
        if(delay_free_irq){
+               spin_lock_irq(&irqs_to_free_lock);
                list_add(&chan->free_list, &irqs_to_free);
+               spin_unlock_irq(&irqs_to_free_lock);
        }
        else {
                if(chan->input)
@@ -372,8 +354,7 @@ int console_write_chan(struct list_head *chans, const char *buf, int len)
        return ret;
 }
 
-int console_open_chan(struct line *line, struct console *co,
-                     const struct chan_opts *opts)
+int console_open_chan(struct line *line, struct console *co)
 {
        int err;
 
@@ -381,7 +362,7 @@ int console_open_chan(struct line *line, struct console *co,
        if(err)
                return err;
 
-       printk("Console initialized on /dev/%s%d\n",co->name,co->index);
+       printk("Console initialized on /dev/%s%d\n", co->name, co->index);
        return 0;
 }
 
@@ -534,7 +515,7 @@ static const struct chan_type chan_table[] = {
 };
 
 static struct chan *parse_chan(struct line *line, char *str, int device,
-                              const struct chan_opts *opts)
+                              const struct chan_opts *opts, char **error_out)
 {
        const struct chan_type *entry;
        const struct chan_ops *ops;
@@ -553,19 +534,21 @@ static struct chan *parse_chan(struct line *line, char *str, int device,
                }
        }
        if(ops == NULL){
-               my_printf("parse_chan couldn't parse \"%s\"\n",
-                      str);
+               *error_out = "No match for configured backends";
                return NULL;
        }
-       if(ops->init == NULL)
-               return NULL;
+
        data = (*ops->init)(str, device, opts);
-       if(data == NULL)
+       if(data == NULL){
+               *error_out = "Configuration failed";
                return NULL;
+       }
 
        chan = kmalloc(sizeof(*chan), GFP_ATOMIC);
-       if(chan == NULL)
+       if(chan == NULL){
+               *error_out = "Memory allocation failed";
                return NULL;
+       }
        *chan = ((struct chan) { .list          = LIST_HEAD_INIT(chan->list),
                                 .free_list     =
                                        LIST_HEAD_INIT(chan->free_list),
@@ -582,7 +565,7 @@ static struct chan *parse_chan(struct line *line, char *str, int device,
 }
 
 int parse_chan_pair(char *str, struct line *line, int device,
-                   const struct chan_opts *opts)
+                   const struct chan_opts *opts, char **error_out)
 {
        struct list_head *chans = &line->chan_list;
        struct chan *new, *chan;
@@ -599,14 +582,14 @@ int parse_chan_pair(char *str, struct line *line, int device,
                in = str;
                *out = '\0';
                out++;
-               new = parse_chan(line, in, device, opts);
+               new = parse_chan(line, in, device, opts, error_out);
                if(new == NULL)
                        return -1;
 
                new->input = 1;
                list_add(&new->list, chans);
 
-               new = parse_chan(line, out, device, opts);
+               new = parse_chan(line, out, device, opts, error_out);
                if(new == NULL)
                        return -1;
 
@@ -614,7 +597,7 @@ int parse_chan_pair(char *str, struct line *line, int device,
                new->output = 1;
        }
        else {
-               new = parse_chan(line, str, device, opts);
+               new = parse_chan(line, str, device, opts, error_out);
                if(new == NULL)
                        return -1;
 
index 64ff22aa077bdb3686fe33e655914630af45dd44..55601687b3bcf735abadd11d555fdc7e59acc33d 100644 (file)
@@ -9,10 +9,10 @@
  *     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.
- *     
- *     Neither Alan Cox nor CymruNet Ltd. admit liability nor provide 
- *     warranty for any of this software. This material is provided 
- *     "AS-IS" and at no charge.       
+ *
+ *     Neither Alan Cox nor CymruNet Ltd. admit liability nor provide
+ *     warranty for any of this software. This material is provided
+ *     "AS-IS" and at no charge.
  *
  *     (c) Copyright 1995    Alan Cox <alan@lxorguk.ukuu.org.uk>
  *
  *     Made SMP safe for 2.3.x
  *
  *  20011127 Joel Becker (jlbec@evilplan.org>
- *     Added soft_noboot; Allows testing the softdog trigger without 
+ *     Added soft_noboot; Allows testing the softdog trigger without
  *     requiring a recompile.
  *     Added WDIOC_GETTIMEOUT and WDIOC_SETTIMOUT.
  */
+
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/reboot.h>
 #include <linux/smp_lock.h>
 #include <linux/init.h>
+#include <linux/spinlock.h>
 #include <asm/uaccess.h>
 #include "mconsole.h"
 
 MODULE_LICENSE("GPL");
 
-/* Locked by the BKL in harddog_open and harddog_release */
+static DEFINE_SPINLOCK(lock);
 static int timer_alive;
 static int harddog_in_fd = -1;
 static int harddog_out_fd = -1;
@@ -57,18 +58,18 @@ static int harddog_out_fd = -1;
 /*
  *     Allow only one person to hold it open
  */
+
 extern int start_watchdog(int *in_fd_ret, int *out_fd_ret, char *sock);
 
 static int harddog_open(struct inode *inode, struct file *file)
 {
-       int err;
+       int err = -EBUSY;
        char *sock = NULL;
 
-       lock_kernel();
+       spin_lock(&lock);
        if(timer_alive)
-               return -EBUSY;
-#ifdef CONFIG_HARDDOG_NOWAYOUT  
+               goto err;
+#ifdef CONFIG_HARDDOG_NOWAYOUT
        __module_get(THIS_MODULE);
 #endif
 
@@ -76,11 +77,15 @@ static int harddog_open(struct inode *inode, struct file *file)
        sock = mconsole_notify_socket();
 #endif
        err = start_watchdog(&harddog_in_fd, &harddog_out_fd, sock);
-       if(err) return(err);
+       if(err)
+               goto err;
 
        timer_alive = 1;
-       unlock_kernel();
+       spin_unlock(&lock);
        return nonseekable_open(inode, file);
+err:
+       spin_unlock(&lock);
+       return err;
 }
 
 extern void stop_watchdog(int in_fd, int out_fd);
@@ -90,14 +95,16 @@ static int harddog_release(struct inode *inode, struct file *file)
        /*
         *      Shut off the timer.
         */
-       lock_kernel();
+
+       spin_lock(&lock);
 
        stop_watchdog(harddog_in_fd, harddog_out_fd);
        harddog_in_fd = -1;
        harddog_out_fd = -1;
 
        timer_alive=0;
-       unlock_kernel();
+       spin_unlock(&lock);
+
        return 0;
 }
 
@@ -110,7 +117,7 @@ static ssize_t harddog_write(struct file *file, const char __user *data, size_t
         *      Refresh the timer.
         */
        if(len)
-               return(ping_watchdog(harddog_out_fd));
+               return ping_watchdog(harddog_out_fd);
        return 0;
 }
 
@@ -134,11 +141,11 @@ static int harddog_ioctl(struct inode *inode, struct file *file,
                case WDIOC_GETBOOTSTATUS:
                        return put_user(0,(int __user *)argp);
                case WDIOC_KEEPALIVE:
-                       return(ping_watchdog(harddog_out_fd));
+                       return ping_watchdog(harddog_out_fd);
        }
 }
 
-static struct file_operations harddog_fops = {
+static const struct file_operations harddog_fops = {
        .owner          = THIS_MODULE,
        .write          = harddog_write,
        .ioctl          = harddog_ioctl,
@@ -165,7 +172,7 @@ static int __init harddog_init(void)
 
        printk(banner);
 
-       return(0);
+       return 0;
 }
 
 static void __exit harddog_exit(void)
@@ -175,14 +182,3 @@ static void __exit harddog_exit(void)
 
 module_init(harddog_init);
 module_exit(harddog_exit);
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
index def013b5a3c7a5ec373dae711829b4ae10f76349..c495ecf263b14862b9b9227679416abbf0f0d032 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
  * Licensed under the GPL
  */
@@ -38,7 +38,7 @@ int start_watchdog(int *in_fd_ret, int *out_fd_ret, char *sock)
        int in_fds[2], out_fds[2], pid, n, err;
        char pid_buf[sizeof("nnnnn\0")], c;
        char *pid_args[] = { "/usr/bin/uml_watchdog", "-pid", pid_buf, NULL };
-       char *mconsole_args[] = { "/usr/bin/uml_watchdog", "-mconsole", NULL, 
+       char *mconsole_args[] = { "/usr/bin/uml_watchdog", "-mconsole", NULL,
                                  NULL };
        char **args = NULL;
 
@@ -96,7 +96,7 @@ int start_watchdog(int *in_fd_ret, int *out_fd_ret, char *sock)
        }
        *in_fd_ret = in_fds[0];
        *out_fd_ret = out_fds[1];
-       return(0);
+       return 0;
 
  out_close_in:
        os_close_file(in_fds[0]);
@@ -105,7 +105,7 @@ int start_watchdog(int *in_fd_ret, int *out_fd_ret, char *sock)
        os_close_file(out_fds[0]);
        os_close_file(out_fds[1]);
  out:
-       return(err);
+       return err;
 }
 
 void stop_watchdog(int in_fd, int out_fd)
@@ -123,20 +123,9 @@ int ping_watchdog(int fd)
        if(n != sizeof(c)){
                printk("ping_watchdog - write failed, err = %d\n", -n);
                if(n < 0)
-                       return(n);
-               return(-EIO);
+                       return n;
+               return -EIO;
        }
        return 1;
 
 }
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
index a0d148ea63d6bfa7b8bf8a1ffaceeff6b72ad477..10e08a8c17c3149cc346529a1c61bb6f6b241cff 100644 (file)
 #include "os.h"
 
 struct hostaudio_state {
-  int fd;
+       int fd;
 };
 
 struct hostmixer_state {
-  int fd;
+       int fd;
 };
 
 #define HOSTAUDIO_DEV_DSP "/dev/sound/dsp"
 #define HOSTAUDIO_DEV_MIXER "/dev/sound/mixer"
 
-/* Only changed from linux_main at boot time */
-char *dsp = HOSTAUDIO_DEV_DSP;
-char *mixer = HOSTAUDIO_DEV_MIXER;
+/* Changed either at boot time or module load time.  At boot, this is
+ * single-threaded; at module load, multiple modules would each have
+ * their own copy of these variables.
+ */
+static char *dsp = HOSTAUDIO_DEV_DSP;
+static char *mixer = HOSTAUDIO_DEV_MIXER;
 
 #define DSP_HELP \
 "    This is used to specify the host dsp device to the hostaudio driver.\n" \
@@ -69,12 +72,12 @@ MODULE_PARM_DESC(mixer, MIXER_HELP);
 static ssize_t hostaudio_read(struct file *file, char __user *buffer,
                              size_t count, loff_t *ppos)
 {
-        struct hostaudio_state *state = file->private_data;
+       struct hostaudio_state *state = file->private_data;
        void *kbuf;
        int err;
 
 #ifdef DEBUG
-        printk("hostaudio: read called, count = %d\n", count);
+       printk("hostaudio: read called, count = %d\n", count);
 #endif
 
        kbuf = kmalloc(count, GFP_KERNEL);
@@ -88,7 +91,7 @@ static ssize_t hostaudio_read(struct file *file, char __user *buffer,
        if(copy_to_user(buffer, kbuf, err))
                err = -EFAULT;
 
- out:
+out:
        kfree(kbuf);
        return(err);
 }
@@ -96,12 +99,12 @@ static ssize_t hostaudio_read(struct file *file, char __user *buffer,
 static ssize_t hostaudio_write(struct file *file, const char __user *buffer,
                               size_t count, loff_t *ppos)
 {
-        struct hostaudio_state *state = file->private_data;
+       struct hostaudio_state *state = file->private_data;
        void *kbuf;
        int err;
 
 #ifdef DEBUG
-        printk("hostaudio: write called, count = %d\n", count);
+       printk("hostaudio: write called, count = %d\n", count);
 #endif
 
        kbuf = kmalloc(count, GFP_KERNEL);
@@ -125,24 +128,24 @@ static ssize_t hostaudio_write(struct file *file, const char __user *buffer,
 static unsigned int hostaudio_poll(struct file *file, 
                                   struct poll_table_struct *wait)
 {
-        unsigned int mask = 0;
+       unsigned int mask = 0;
 
 #ifdef DEBUG
-        printk("hostaudio: poll called (unimplemented)\n");
+       printk("hostaudio: poll called (unimplemented)\n");
 #endif
 
-        return(mask);
+       return(mask);
 }
 
 static int hostaudio_ioctl(struct inode *inode, struct file *file, 
                           unsigned int cmd, unsigned long arg)
 {
-        struct hostaudio_state *state = file->private_data;
+       struct hostaudio_state *state = file->private_data;
        unsigned long data = 0;
        int err;
 
 #ifdef DEBUG
-        printk("hostaudio: ioctl called, cmd = %u\n", cmd);
+       printk("hostaudio: ioctl called, cmd = %u\n", cmd);
 #endif
        switch(cmd){
        case SNDCTL_DSP_SPEED:
@@ -179,42 +182,40 @@ static int hostaudio_ioctl(struct inode *inode, struct file *file,
 
 static int hostaudio_open(struct inode *inode, struct file *file)
 {
-        struct hostaudio_state *state;
-        int r = 0, w = 0;
-        int ret;
+       struct hostaudio_state *state;
+       int r = 0, w = 0;
+       int ret;
 
 #ifdef DEBUG
-        printk("hostaudio: open called (host: %s)\n", dsp);
+       printk("hostaudio: open called (host: %s)\n", dsp);
 #endif
 
-        state = kmalloc(sizeof(struct hostaudio_state), GFP_KERNEL);
-        if(state == NULL)
+       state = kmalloc(sizeof(struct hostaudio_state), GFP_KERNEL);
+       if(state == NULL)
                return(-ENOMEM);
 
-        if(file->f_mode & FMODE_READ) r = 1;
-        if(file->f_mode & FMODE_WRITE) w = 1;
+       if(file->f_mode & FMODE_READ) r = 1;
+       if(file->f_mode & FMODE_WRITE) w = 1;
 
        ret = os_open_file(dsp, of_set_rw(OPENFLAGS(), r, w), 0);
-        if(ret < 0){
+       if(ret < 0){
                kfree(state);
                return(ret);
-        }
-
+       }
        state->fd = ret;
-        file->private_data = state;
-        return(0);
+       file->private_data = state;
+       return(0);
 }
 
 static int hostaudio_release(struct inode *inode, struct file *file)
 {
-        struct hostaudio_state *state = file->private_data;
+       struct hostaudio_state *state = file->private_data;
 
 #ifdef DEBUG
-        printk("hostaudio: release called\n");
+       printk("hostaudio: release called\n");
 #endif
-
-               os_close_file(state->fd);
-        kfree(state);
+       os_close_file(state->fd);
+       kfree(state);
 
        return(0);
 }
@@ -224,10 +225,10 @@ static int hostaudio_release(struct inode *inode, struct file *file)
 static int hostmixer_ioctl_mixdev(struct inode *inode, struct file *file, 
                                  unsigned int cmd, unsigned long arg)
 {
-        struct hostmixer_state *state = file->private_data;
+       struct hostmixer_state *state = file->private_data;
 
 #ifdef DEBUG
-        printk("hostmixer: ioctl called\n");
+       printk("hostmixer: ioctl called\n");
 #endif
 
        return(os_ioctl_generic(state->fd, cmd, arg));
@@ -235,68 +236,67 @@ static int hostmixer_ioctl_mixdev(struct inode *inode, struct file *file,
 
 static int hostmixer_open_mixdev(struct inode *inode, struct file *file)
 {
-        struct hostmixer_state *state;
-        int r = 0, w = 0;
-        int ret;
+       struct hostmixer_state *state;
+       int r = 0, w = 0;
+       int ret;
 
 #ifdef DEBUG
-        printk("hostmixer: open called (host: %s)\n", mixer);
+       printk("hostmixer: open called (host: %s)\n", mixer);
 #endif
 
-        state = kmalloc(sizeof(struct hostmixer_state), GFP_KERNEL);
-        if(state == NULL) return(-ENOMEM);
+       state = kmalloc(sizeof(struct hostmixer_state), GFP_KERNEL);
+       if(state == NULL) return(-ENOMEM);
 
-        if(file->f_mode & FMODE_READ) r = 1;
-        if(file->f_mode & FMODE_WRITE) w = 1;
+       if(file->f_mode & FMODE_READ) r = 1;
+       if(file->f_mode & FMODE_WRITE) w = 1;
 
        ret = os_open_file(mixer, of_set_rw(OPENFLAGS(), r, w), 0);
         
-        if(ret < 0){
+       if(ret < 0){
                printk("hostaudio_open_mixdev failed to open '%s', err = %d\n",
                       dsp, -ret);
                kfree(state);
                return(ret);
-        }
+       }
 
-        file->private_data = state;
-        return(0);
+       file->private_data = state;
+       return(0);
 }
 
 static int hostmixer_release(struct inode *inode, struct file *file)
 {
-        struct hostmixer_state *state = file->private_data;
+       struct hostmixer_state *state = file->private_data;
 
 #ifdef DEBUG
-        printk("hostmixer: release called\n");
+       printk("hostmixer: release called\n");
 #endif
 
-               os_close_file(state->fd);
-        kfree(state);
+       os_close_file(state->fd);
+       kfree(state);
 
        return(0);
 }
 
-
 /* kernel module operations */
 
 static const struct file_operations hostaudio_fops = {
-        .owner          = THIS_MODULE,
-        .llseek         = no_llseek,
-        .read           = hostaudio_read,
-        .write          = hostaudio_write,
-        .poll           = hostaudio_poll,
-        .ioctl          = hostaudio_ioctl,
-        .mmap           = NULL,
-        .open           = hostaudio_open,
-        .release        = hostaudio_release,
+       .owner          = THIS_MODULE,
+       .llseek         = no_llseek,
+       .read           = hostaudio_read,
+       .write          = hostaudio_write,
+       .poll           = hostaudio_poll,
+       .ioctl          = hostaudio_ioctl,
+       .mmap           = NULL,
+       .open           = hostaudio_open,
+       .release        = hostaudio_release,
 };
 
 static const struct file_operations hostmixer_fops = {
-        .owner          = THIS_MODULE,
-        .llseek         = no_llseek,
-        .ioctl          = hostmixer_ioctl_mixdev,
-        .open           = hostmixer_open_mixdev,
-        .release        = hostmixer_release,
+       .owner          = THIS_MODULE,
+       .llseek         = no_llseek,
+       .ioctl          = hostmixer_ioctl_mixdev,
+       .open           = hostmixer_open_mixdev,
+       .release        = hostmixer_release,
 };
 
 struct {
@@ -310,42 +310,31 @@ MODULE_LICENSE("GPL");
 
 static int __init hostaudio_init_module(void)
 {
-        printk(KERN_INFO "UML Audio Relay (host dsp = %s, host mixer = %s)\n",
+       printk(KERN_INFO "UML Audio Relay (host dsp = %s, host mixer = %s)\n",
               dsp, mixer);
 
        module_data.dev_audio = register_sound_dsp(&hostaudio_fops, -1);
-        if(module_data.dev_audio < 0){
-                printk(KERN_ERR "hostaudio: couldn't register DSP device!\n");
-                return -ENODEV;
-        }
+       if(module_data.dev_audio < 0){
+               printk(KERN_ERR "hostaudio: couldn't register DSP device!\n");
+               return -ENODEV;
+       }
 
        module_data.dev_mixer = register_sound_mixer(&hostmixer_fops, -1);
-        if(module_data.dev_mixer < 0){
-                printk(KERN_ERR "hostmixer: couldn't register mixer "
+       if(module_data.dev_mixer < 0){
+               printk(KERN_ERR "hostmixer: couldn't register mixer "
                       "device!\n");
-                unregister_sound_dsp(module_data.dev_audio);
-                return -ENODEV;
-        }
+               unregister_sound_dsp(module_data.dev_audio);
+               return -ENODEV;
+       }
 
-        return 0;
+       return 0;
 }
 
 static void __exit hostaudio_cleanup_module (void)
 {
-       unregister_sound_mixer(module_data.dev_mixer);
-       unregister_sound_dsp(module_data.dev_audio);
+       unregister_sound_mixer(module_data.dev_mixer);
+       unregister_sound_dsp(module_data.dev_audio);
 }
 
 module_init(hostaudio_init_module);
 module_exit(hostaudio_cleanup_module);
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
index 83301e1ef67cbe24dbe6ee73f70b21c756ff87f8..01d4ab6b0ef1889582f4d5defb4142138b0141f0 100644 (file)
@@ -191,7 +191,6 @@ void line_flush_buffer(struct tty_struct *tty)
        /*XXX: copied from line_write, verify if it is correct!*/
        if(tty->stopped)
                return;
-               //return 0;
 
        spin_lock_irqsave(&line->lock, flags);
        err = flush_buffer(line);
@@ -421,42 +420,55 @@ int line_setup_irq(int fd, int input, int output, struct line *line, void *data)
        return err;
 }
 
+/* Normally, a driver like this can rely mostly on the tty layer
+ * locking, particularly when it comes to the driver structure.
+ * However, in this case, mconsole requests can come in "from the
+ * side", and race with opens and closes.
+ *
+ * mconsole config requests will want to be sure the device isn't in
+ * use, and get_config, open, and close will want a stable
+ * configuration.  The checking and modification of the configuration
+ * is done under a spinlock.  Checking whether the device is in use is
+ * line->tty->count > 1, also under the spinlock.
+ *
+ * tty->count serves to decide whether the device should be enabled or
+ * disabled on the host.  If it's equal to 1, then we are doing the
+ * first open or last close.  Otherwise, open and close just return.
+ */
+
 int line_open(struct line *lines, struct tty_struct *tty)
 {
-       struct line *line;
+       struct line *line = &lines[tty->index];
        int err = -ENODEV;
 
-       line = &lines[tty->index];
-       tty->driver_data = line;
+       spin_lock(&line->count_lock);
+       if(!line->valid)
+               goto out_unlock;
 
-       /* The IRQ which takes this lock is not yet enabled and won't be run
-        * before the end, so we don't need to use spin_lock_irq.*/
-       spin_lock(&line->lock);
+       err = 0;
+       if(tty->count > 1)
+               goto out_unlock;
+
+       spin_unlock(&line->count_lock);
 
        tty->driver_data = line;
        line->tty = tty;
-       if(!line->valid)
-               goto out;
 
-       if(tty->count == 1){
-               /* Here the device is opened, if necessary, and interrupt
-                * is registered.
-                */
-               enable_chan(line);
-               INIT_DELAYED_WORK(&line->task, line_timer_cb);
+       enable_chan(line);
+       INIT_DELAYED_WORK(&line->task, line_timer_cb);
 
-               if(!line->sigio){
-                       chan_enable_winch(&line->chan_list, tty);
-                       line->sigio = 1;
-               }
-
-               chan_window_size(&line->chan_list, &tty->winsize.ws_row,
-                                &tty->winsize.ws_col);
+       if(!line->sigio){
+               chan_enable_winch(&line->chan_list, tty);
+               line->sigio = 1;
        }
 
-       err = 0;
-out:
-       spin_unlock(&line->lock);
+       chan_window_size(&line->chan_list, &tty->winsize.ws_row,
+                        &tty->winsize.ws_col);
+
+       return err;
+
+out_unlock:
+       spin_unlock(&line->count_lock);
        return err;
 }
 
@@ -466,25 +478,36 @@ void line_close(struct tty_struct *tty, struct file * filp)
 {
        struct line *line = tty->driver_data;
 
-       /* XXX: I assume this should be called in process context, not with
-         *  interrupts disabled!
-         */
-       spin_lock_irq(&line->lock);
+       /* If line_open fails (and tty->driver_data is never set),
+        * tty_open will call line_close.  So just return in this case.
+        */
+       if(line == NULL)
+               return;
 
        /* We ignore the error anyway! */
        flush_buffer(line);
 
-       if(tty->count == 1){
-               line->tty = NULL;
-               tty->driver_data = NULL;
+       spin_lock(&line->count_lock);
+       if(!line->valid)
+               goto out_unlock;
 
-               if(line->sigio){
-                       unregister_winch(tty);
-                       line->sigio = 0;
-               }
+       if(tty->count > 1)
+               goto out_unlock;
+
+       spin_unlock(&line->count_lock);
+
+       line->tty = NULL;
+       tty->driver_data = NULL;
+
+       if(line->sigio){
+               unregister_winch(tty);
+               line->sigio = 0;
         }
 
-       spin_unlock_irq(&line->lock);
+       return;
+
+out_unlock:
+       spin_unlock(&line->count_lock);
 }
 
 void close_lines(struct line *lines, int nlines)
@@ -495,14 +518,44 @@ void close_lines(struct line *lines, int nlines)
                close_chan(&lines[i].chan_list, 0);
 }
 
+static int setup_one_line(struct line *lines, int n, char *init, int init_prio,
+                         char **error_out)
+{
+       struct line *line = &lines[n];
+       int err = -EINVAL;
+
+       spin_lock(&line->count_lock);
+
+       if(line->tty != NULL){
+               *error_out = "Device is already open";
+               goto out;
+       }
+
+       if (line->init_pri <= init_prio){
+               line->init_pri = init_prio;
+               if (!strcmp(init, "none"))
+                       line->valid = 0;
+               else {
+                       line->init_str = init;
+                       line->valid = 1;
+               }
+       }
+       err = 0;
+out:
+       spin_unlock(&line->count_lock);
+       return err;
+}
+
 /* Common setup code for both startup command line and mconsole initialization.
  * @lines contains the array (of size @num) to modify;
  * @init is the setup string;
+ * @error_out is an error string in the case of failure;
  */
 
-int line_setup(struct line *lines, unsigned int num, char *init)
+int line_setup(struct line *lines, unsigned int num, char *init,
+              char **error_out)
 {
-       int i, n;
+       int i, n, err;
        char *end;
 
        if(*init == '=') {
@@ -513,73 +566,56 @@ int line_setup(struct line *lines, unsigned int num, char *init)
        else {
                n = simple_strtoul(init, &end, 0);
                if(*end != '='){
-                       printk(KERN_ERR "line_setup failed to parse \"%s\"\n",
-                              init);
-                       return 0;
+                       *error_out = "Couldn't parse device number";
+                       return -EINVAL;
                }
                init = end;
        }
        init++;
 
        if (n >= (signed int) num) {
-               printk("line_setup - %d out of range ((0 ... %d) allowed)\n",
-                      n, num - 1);
-               return 0;
+               *error_out = "Device number out of range";
+               return -EINVAL;
        }
        else if (n >= 0){
-               if (lines[n].tty != NULL) {
-                       printk("line_setup - device %d is open\n", n);
-                       return 0;
-               }
-               if (lines[n].init_pri <= INIT_ONE){
-                       lines[n].init_pri = INIT_ONE;
-                       if (!strcmp(init, "none"))
-                               lines[n].valid = 0;
-                       else {
-                               lines[n].init_str = init;
-                               lines[n].valid = 1;
-                       }
-               }
+               err = setup_one_line(lines, n, init, INIT_ONE, error_out);
+               if(err)
+                       return err;
        }
        else {
                for(i = 0; i < num; i++){
-                       if(lines[i].init_pri <= INIT_ALL){
-                               lines[i].init_pri = INIT_ALL;
-                               if(!strcmp(init, "none")) lines[i].valid = 0;
-                               else {
-                                       lines[i].init_str = init;
-                                       lines[i].valid = 1;
-                               }
-                       }
+                       err = setup_one_line(lines, i, init, INIT_ALL,
+                                            error_out);
+                       if(err)
+                               return err;
                }
        }
        return n == -1 ? num : n;
 }
 
 int line_config(struct line *lines, unsigned int num, char *str,
-               const struct chan_opts *opts)
+               const struct chan_opts *opts, char **error_out)
 {
        struct line *line;
        char *new;
        int n;
 
        if(*str == '='){
-               printk("line_config - can't configure all devices from "
-                      "mconsole\n");
-               return 1;
+               *error_out = "Can't configure all devices from mconsole";
+               return -EINVAL;
        }
 
        new = kstrdup(str, GFP_KERNEL);
        if(new == NULL){
-               printk("line_config - kstrdup failed\n");
-               return 1;
+               *error_out = "Failed to allocate memory";
+               return -ENOMEM;
        }
-       n = line_setup(lines, num, new);
+       n = line_setup(lines, num, new, error_out);
        if(n < 0)
-               return 1;
+               return n;
 
        line = &lines[n];
-       return parse_chan_pair(line->init_str, line, n, opts);
+       return parse_chan_pair(line->init_str, line, n, opts, error_out);
 }
 
 int line_get_config(char *name, struct line *lines, unsigned int num, char *str,
@@ -602,13 +638,13 @@ int line_get_config(char *name, struct line *lines, unsigned int num, char *str,
 
        line = &lines[dev];
 
-       spin_lock(&line->lock);
+       spin_lock(&line->count_lock);
        if(!line->valid)
                CONFIG_CHUNK(str, size, n, "none", 1);
        else if(line->tty == NULL)
                CONFIG_CHUNK(str, size, n, line->init_str, 1);
        else n = chan_config_string(&line->chan_list, str, size, error_out);
-       spin_unlock(&line->lock);
+       spin_unlock(&line->count_lock);
 
        return n;
 }
@@ -628,22 +664,21 @@ int line_id(char **str, int *start_out, int *end_out)
         return n;
 }
 
-int line_remove(struct line *lines, unsigned int num, int n)
+int line_remove(struct line *lines, unsigned int num, int n, char **error_out)
 {
        int err;
        char config[sizeof("conxxxx=none\0")];
 
        sprintf(config, "%d=none", n);
-       err = line_setup(lines, num, config);
+       err = line_setup(lines, num, config, error_out);
        if(err >= 0)
                err = 0;
        return err;
 }
 
-struct tty_driver *line_register_devfs(struct lines *set,
-                                      struct line_driver *line_driver,
-                                      const struct tty_operations *ops,
-                                      struct line *lines, int nlines)
+struct tty_driver *register_lines(struct line_driver *line_driver,
+                                 const struct tty_operations *ops,
+                                 struct line *lines, int nlines)
 {
        int i;
        struct tty_driver *driver = alloc_tty_driver(nlines);
@@ -683,6 +718,7 @@ static LIST_HEAD(winch_handlers);
 void lines_init(struct line *lines, int nlines, struct chan_opts *opts)
 {
        struct line *line;
+       char *error;
        int i;
 
        for(i = 0; i < nlines; i++){
@@ -696,8 +732,9 @@ void lines_init(struct line *lines, int nlines, struct chan_opts *opts)
                if(line->init_str == NULL)
                        printk("lines_init - kstrdup returned NULL\n");
 
-               if(parse_chan_pair(line->init_str, line, i, opts)){
-                       printk("parse_chan_pair failed for device %d\n", i);
+               if(parse_chan_pair(line->init_str, line, i, opts, &error)){
+                       printk("parse_chan_pair failed for device %d : %s\n",
+                              i, error);
                        line->valid = 0;
                }
        }
@@ -737,7 +774,7 @@ static irqreturn_t winch_interrupt(int irq, void *data)
                line = tty->driver_data;
                chan_window_size(&line->chan_list, &tty->winsize.ws_row,
                                 &tty->winsize.ws_col);
-               kill_pg(tty->pgrp, SIGWINCH, 1);
+               kill_pgrp(tty->pgrp, SIGWINCH, 1);
        }
  out:
        if(winch->fd != -1)
index 96f0189327af58260bcbfe14e304faf67cfe513c..178b2eff4a8ce836b5286aae5e32429480a2cf66 100644 (file)
@@ -33,7 +33,6 @@
 #include "irq_user.h"
 #include "init.h"
 #include "os.h"
-#include "umid.h"
 #include "irq_kern.h"
 #include "choose-mode.h"
 
@@ -337,13 +336,15 @@ void mconsole_stop(struct mc_request *req)
        mconsole_reply(req, "", 0, 0);
 }
 
-/* This list is populated by __initcall routines. */
-
+static DEFINE_SPINLOCK(mc_devices_lock);
 static LIST_HEAD(mconsole_devices);
 
 void mconsole_register_dev(struct mc_device *new)
 {
+       spin_lock(&mc_devices_lock);
+       BUG_ON(!list_empty(&new->list));
        list_add(&new->list, &mconsole_devices);
+       spin_unlock(&mc_devices_lock);
 }
 
 static struct mc_device *mconsole_find_dev(char *name)
@@ -367,18 +368,21 @@ struct unplugged_pages {
        void *pages[UNPLUGGED_PER_PAGE];
 };
 
+static DECLARE_MUTEX(plug_mem_mutex);
 static unsigned long long unplugged_pages_count = 0;
-static struct list_head unplugged_pages = LIST_HEAD_INIT(unplugged_pages);
+static LIST_HEAD(unplugged_pages);
 static int unplug_index = UNPLUGGED_PER_PAGE;
 
-static int mem_config(char *str)
+static int mem_config(char *str, char **error_out)
 {
        unsigned long long diff;
        int err = -EINVAL, i, add;
        char *ret;
 
-       if(str[0] != '=')
+       if(str[0] != '='){
+               *error_out = "Expected '=' after 'mem'";
                goto out;
+       }
 
        str++;
        if(str[0] == '-')
@@ -386,15 +390,21 @@ static int mem_config(char *str)
        else if(str[0] == '+'){
                add = 1;
        }
-       else goto out;
+       else {
+               *error_out = "Expected increment to start with '-' or '+'";
+               goto out;
+       }
 
        str++;
        diff = memparse(str, &ret);
-       if(*ret != '\0')
+       if(*ret != '\0'){
+               *error_out = "Failed to parse memory increment";
                goto out;
+       }
 
        diff /= PAGE_SIZE;
 
+       down(&plug_mem_mutex);
        for(i = 0; i < diff; i++){
                struct unplugged_pages *unplugged;
                void *addr;
@@ -435,11 +445,14 @@ static int mem_config(char *str)
                                unplugged = list_entry(entry,
                                                       struct unplugged_pages,
                                                       list);
-                               unplugged->pages[unplug_index++] = addr;
                                err = os_drop_memory(addr, PAGE_SIZE);
-                               if(err)
+                               if(err){
                                        printk("Failed to release memory - "
                                               "errno = %d\n", err);
+                                       *error_out = "Failed to release memory";
+                                       goto out_unlock;
+                               }
+                               unplugged->pages[unplug_index++] = addr;
                        }
 
                        unplugged_pages_count++;
@@ -447,6 +460,8 @@ static int mem_config(char *str)
        }
 
        err = 0;
+out_unlock:
+       up(&plug_mem_mutex);
 out:
        return err;
 }
@@ -470,12 +485,14 @@ static int mem_id(char **str, int *start_out, int *end_out)
        return 0;
 }
 
-static int mem_remove(int n)
+static int mem_remove(int n, char **error_out)
 {
+       *error_out = "Memory doesn't support the remove operation";
        return -EBUSY;
 }
 
 static struct mc_device mem_mc = {
+       .list           = LIST_HEAD_INIT(mem_mc.list),
        .name           = "mem",
        .config         = mem_config,
        .get_config     = mem_get_config,
@@ -542,7 +559,7 @@ static void mconsole_get_config(int (*get_config)(char *, char *, int,
 void mconsole_config(struct mc_request *req)
 {
        struct mc_device *dev;
-       char *ptr = req->request.data, *name;
+       char *ptr = req->request.data, *name, *error_string = "";
        int err;
 
        ptr += strlen("config");
@@ -559,8 +576,8 @@ void mconsole_config(struct mc_request *req)
                ptr++;
 
        if(*ptr == '='){
-               err = (*dev->config)(name);
-               mconsole_reply(req, "", err, 0);
+               err = (*dev->config)(name, &error_string);
+               mconsole_reply(req, error_string, err, 0);
        }
        else mconsole_get_config(dev->get_config, req, name);
 }
@@ -595,13 +612,16 @@ void mconsole_remove(struct mc_request *req)
                goto out;
        }
 
-       err = (*dev->remove)(n);
+       err_msg = NULL;
+       err = (*dev->remove)(n, &err_msg);
        switch(err){
        case -ENODEV:
-               err_msg = "Device doesn't exist";
+               if(err_msg == NULL)
+                       err_msg = "Device doesn't exist";
                break;
        case -EBUSY:
-               err_msg = "Device is currently open";
+               if(err_msg == NULL)
+                       err_msg = "Device is currently open";
                break;
        default:
                break;
@@ -615,7 +635,7 @@ struct mconsole_output {
        struct mc_request *req;
 };
 
-static DEFINE_SPINLOCK(console_lock);
+static DEFINE_SPINLOCK(client_lock);
 static LIST_HEAD(clients);
 static char console_buf[MCONSOLE_MAX_DATA];
 static int console_index = 0;
@@ -670,16 +690,18 @@ static void with_console(struct mc_request *req, void (*proc)(void *),
        unsigned long flags;
 
        entry.req = req;
+       spin_lock_irqsave(&client_lock, flags);
        list_add(&entry.list, &clients);
-       spin_lock_irqsave(&console_lock, flags);
+       spin_unlock_irqrestore(&client_lock, flags);
 
        (*proc)(arg);
 
        mconsole_reply_len(req, console_buf, console_index, 0, 0);
        console_index = 0;
 
-       spin_unlock_irqrestore(&console_lock, flags);
+       spin_lock_irqsave(&client_lock, flags);
        list_del(&entry.list);
+       spin_unlock_irqrestore(&client_lock, flags);
 }
 
 #ifdef CONFIG_MAGIC_SYSRQ
index 75aef6f7ef6e22dd9669f55f707021cd4f539d10..f02634fbf32ad0e95be61d11c7d911f11a318cd0 100644 (file)
@@ -16,7 +16,7 @@
 #include "user.h"
 #include "sysdep/ptrace.h"
 #include "mconsole.h"
-#include "umid.h"
+#include "os.h"
 #include "user_util.h"
 
 static struct mconsole_command commands[] = {
index afe3d427ddfae510b29135453dcfa3217252c308..04e31f86c10afb88f21002b7b0eb8c261e3490a9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and 
+ * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and
  * James Leu (jleu@mindspring.net).
  * Copyright (C) 2001 by various other people who didn't put their name here.
  * Licensed under the GPL.
@@ -91,8 +91,8 @@ irqreturn_t uml_net_interrupt(int irq, void *dev_id)
        spin_lock(&lp->lock);
        while((err = uml_net_rx(dev)) > 0) ;
        if(err < 0) {
-               printk(KERN_ERR 
-                      "Device '%s' read returned %d, shutting it down\n", 
+               printk(KERN_ERR
+                      "Device '%s' read returned %d, shutting it down\n",
                       dev->name, err);
                /* dev_close can't be called in interrupt context, and takes
                 * again lp->lock.
@@ -108,7 +108,7 @@ irqreturn_t uml_net_interrupt(int irq, void *dev_id)
 
 out:
        spin_unlock(&lp->lock);
-       return(IRQ_HANDLED);
+       return IRQ_HANDLED;
 }
 
 static int uml_net_open(struct net_device *dev)
@@ -159,7 +159,7 @@ out:
 static int uml_net_close(struct net_device *dev)
 {
        struct uml_net_private *lp = dev->priv;
-       
+
        netif_stop_queue(dev);
 
        free_irq(dev->irq, dev);
@@ -194,7 +194,7 @@ static int uml_net_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
                /* this is normally done in the interrupt when tx finishes */
                netif_wake_queue(dev);
-       } 
+       }
        else if(len == 0){
                netif_start_queue(dev);
                lp->stats.tx_dropped++;
@@ -239,7 +239,7 @@ static int uml_net_set_mac(struct net_device *dev, void *addr)
        set_ether_mac(dev, hwaddr->sa_data);
        spin_unlock_irq(&lp->lock);
 
-       return(0);
+       return 0;
 }
 
 static int uml_net_change_mtu(struct net_device *dev, int new_mtu)
@@ -333,7 +333,7 @@ static int eth_configure(int n, void *init, char *mac,
        struct uml_net_private *lp;
        int save, err, size;
 
-       size = transport->private_size + sizeof(struct uml_net_private) + 
+       size = transport->private_size + sizeof(struct uml_net_private) +
                sizeof(((struct uml_net_private *) 0)->user);
 
        device = kzalloc(sizeof(*device), GFP_KERNEL);
@@ -438,7 +438,7 @@ static int eth_configure(int n, void *init, char *mac,
        lp->tl.function = uml_net_user_timer_expire;
        memcpy(lp->mac, device->mac, sizeof(lp->mac));
 
-       if (transport->user->init) 
+       if (transport->user->init)
                (*transport->user->init)(&lp->user, dev);
 
        set_ether_mac(dev, device->mac);
@@ -460,38 +460,36 @@ static struct uml_net *find_device(int n)
        device = NULL;
  out:
        spin_unlock(&devices_lock);
-       return(device);
+       return device;
 }
 
-static int eth_parse(char *str, int *index_out, char **str_out)
+static int eth_parse(char *str, int *index_out, char **str_out,
+                    char **error_out)
 {
        char *end;
-       int n;
+       int n, err = -EINVAL;;
 
        n = simple_strtoul(str, &end, 0);
        if(end == str){
-               printk(KERN_ERR "eth_setup: Failed to parse '%s'\n", str);
-               return(1);
-       }
-       if(n < 0){
-               printk(KERN_ERR "eth_setup: device %d is negative\n", n);
-               return(1);
+               *error_out = "Bad device number";
+               return err;
        }
+
        str = end;
        if(*str != '='){
-               printk(KERN_ERR 
-                      "eth_setup: expected '=' after device number\n");
-               return(1);
+               *error_out = "Expected '=' after device number";
+               return err;
        }
+
        str++;
        if(find_device(n)){
-               printk(KERN_ERR "eth_setup: Device %d already configured\n",
-                      n);
-               return(1);
+               *error_out = "Device already configured";
+               return err;
        }
-       if(index_out) *index_out = n;
+
+       *index_out = n;
        *str_out = str;
-       return(0);
+       return 0;
 }
 
 struct eth_init {
@@ -500,13 +498,11 @@ struct eth_init {
        int index;
 };
 
-/* Filled in at boot time.  Will need locking if the transports become
- * modular.
- */
-struct list_head transports = LIST_HEAD_INIT(transports);
+static DEFINE_SPINLOCK(transports_lock);
+static LIST_HEAD(transports);
 
 /* Filled in during early boot */
-struct list_head eth_cmd_line = LIST_HEAD_INIT(eth_cmd_line);
+static LIST_HEAD(eth_cmd_line);
 
 static int check_transport(struct transport *transport, char *eth, int n,
                           void **init_out, char **mac_out)
@@ -515,23 +511,23 @@ static int check_transport(struct transport *transport, char *eth, int n,
 
        len = strlen(transport->name);
        if(strncmp(eth, transport->name, len))
-               return(0);
+               return 0;
 
        eth += len;
        if(*eth == ',')
                eth++;
        else if(*eth != '\0')
-               return(0);
+               return 0;
 
        *init_out = kmalloc(transport->setup_size, GFP_KERNEL);
        if(*init_out == NULL)
-               return(1);
+               return 1;
 
        if(!transport->setup(eth, mac_out, *init_out)){
                kfree(*init_out);
                *init_out = NULL;
        }
-       return(1);
+       return 1;
 }
 
 void register_transport(struct transport *new)
@@ -542,7 +538,10 @@ void register_transport(struct transport *new)
        char *mac = NULL;
        int match;
 
+       spin_lock(&transports_lock);
+       BUG_ON(!list_empty(&new->list));
        list_add(&new->list, &transports);
+       spin_unlock(&transports_lock);
 
        list_for_each_safe(ele, next, &eth_cmd_line){
                eth = list_entry(ele, struct eth_init, list);
@@ -564,7 +563,9 @@ static int eth_setup_common(char *str, int index)
        struct transport *transport;
        void *init;
        char *mac = NULL;
+       int found = 0;
 
+       spin_lock(&transports_lock);
        list_for_each(ele, &transports){
                transport = list_entry(ele, struct transport, list);
                if(!check_transport(transport, str, index, &init, &mac))
@@ -573,19 +574,26 @@ static int eth_setup_common(char *str, int index)
                        eth_configure(index, init, mac, transport);
                        kfree(init);
                }
-               return(1);
+               found = 1;
+               break;
        }
-       return(0);
+
+       spin_unlock(&transports_lock);
+       return found;
 }
 
 static int eth_setup(char *str)
 {
        struct eth_init *new;
+       char *error;
        int n, err;
 
-       err = eth_parse(str, &n, &str);
-       if(err)
+       err = eth_parse(str, &n, &str, &error);
+       if(err){
+               printk(KERN_ERR "eth_setup - Couldn't parse '%s' : %s\n",
+                      str, error);
                return 1;
+       }
 
        new = alloc_bootmem(sizeof(*new));
        if (new == NULL){
@@ -607,38 +615,24 @@ __uml_help(eth_setup,
 "    Configure a network device.\n\n"
 );
 
-#if 0
-static int eth_init(void)
-{
-       struct list_head *ele, *next;
-       struct eth_init *eth;
-
-       list_for_each_safe(ele, next, &eth_cmd_line){
-               eth = list_entry(ele, struct eth_init, list);
-
-               if(eth_setup_common(eth->init, eth->index))
-                       list_del(&eth->list);
-       }
-       
-       return(1);
-}
-__initcall(eth_init);
-#endif
-
-static int net_config(char *str)
+static int net_config(char *str, char **error_out)
 {
        int n, err;
 
-       err = eth_parse(str, &n, &str);
-       if(err) return(err);
+       err = eth_parse(str, &n, &str, error_out);
+       if(err)
+               return err;
 
+       /* This string is broken up and the pieces used by the underlying
+        * driver.  So, it is freed only if eth_setup_common fails.
+        */
        str = kstrdup(str, GFP_KERNEL);
        if(str == NULL){
-               printk(KERN_ERR "net_config failed to strdup string\n");
-               return(-1);
+               *error_out = "net_config failed to strdup string";
+               return -ENOMEM;
        }
        err = !eth_setup_common(str, n);
-       if(err) 
+       if(err)
                kfree(str);
        return(err);
 }
@@ -658,7 +652,7 @@ static int net_id(char **str, int *start_out, int *end_out)
         return n;
 }
 
-static int net_remove(int n)
+static int net_remove(int n, char **error_out)
 {
        struct uml_net *device;
        struct net_device *dev;
@@ -671,7 +665,7 @@ static int net_remove(int n)
        dev = device->dev;
        lp = dev->priv;
        if(lp->fd > 0)
-                return -EBUSY;
+               return -EBUSY;
        if(lp->remove != NULL) (*lp->remove)(&lp->user);
        unregister_netdev(dev);
        platform_device_unregister(&device->pdev);
@@ -683,10 +677,11 @@ static int net_remove(int n)
 }
 
 static struct mc_device net_mc = {
+       .list           = LIST_HEAD_INIT(net_mc.list),
        .name           = "eth",
        .config         = net_config,
        .get_config     = NULL,
-        .id            = net_id,
+       .id             = net_id,
        .remove         = net_remove,
 };
 
@@ -699,7 +694,8 @@ static int uml_inetaddr_event(struct notifier_block *this, unsigned long event,
        void (*proc)(unsigned char *, unsigned char *, void *);
        unsigned char addr_buf[4], netmask_buf[4];
 
-       if(dev->open != uml_net_open) return(NOTIFY_DONE);
+       if(dev->open != uml_net_open)
+               return NOTIFY_DONE;
 
        lp = dev->priv;
 
@@ -717,9 +713,10 @@ static int uml_inetaddr_event(struct notifier_block *this, unsigned long event,
                memcpy(netmask_buf, &ifa->ifa_mask, sizeof(netmask_buf));
                (*proc)(addr_buf, netmask_buf, &lp->user);
        }
-       return(NOTIFY_DONE);
+       return NOTIFY_DONE;
 }
 
+/* uml_net_init shouldn't be called twice on two CPUs at the same time */
 struct notifier_block uml_inetaddr_notifier = {
        .notifier_call          = uml_inetaddr_event,
 };
@@ -727,7 +724,7 @@ struct notifier_block uml_inetaddr_notifier = {
 static int uml_net_init(void)
 {
        struct list_head *ele;
-       struct uml_net_private *lp;     
+       struct uml_net_private *lp;
        struct in_device *ip;
        struct in_ifaddr *in;
 
@@ -738,18 +735,21 @@ static int uml_net_init(void)
         * didn't get a chance to run for them.  This fakes it so that
         * addresses which have already been set up get handled properly.
         */
+       spin_lock(&opened_lock);
        list_for_each(ele, &opened){
                lp = list_entry(ele, struct uml_net_private, list);
                ip = lp->dev->ip_ptr;
-               if(ip == NULL) continue;
+               if(ip == NULL)
+                       continue;
                in = ip->ifa_list;
                while(in != NULL){
                        uml_inetaddr_event(NULL, NETDEV_UP, in);
                        in = in->ifa_next;
                }
-       }       
+       }
+       spin_unlock(&opened_lock);
 
-       return(0);
+       return 0;
 }
 
 __initcall(uml_net_init);
@@ -759,13 +759,16 @@ static void close_devices(void)
        struct list_head *ele;
        struct uml_net_private *lp;
 
+       spin_lock(&opened_lock);
        list_for_each(ele, &opened){
                lp = list_entry(ele, struct uml_net_private, list);
                free_irq(lp->dev->irq, lp->dev);
                if((lp->close != NULL) && (lp->fd >= 0))
                        (*lp->close)(lp->fd, &lp->user);
-               if(lp->remove != NULL) (*lp->remove)(&lp->user);
+               if(lp->remove != NULL)
+                       (*lp->remove)(&lp->user);
        }
+       spin_unlock(&opened_lock);
 }
 
 __uml_exitcall(close_devices);
@@ -783,8 +786,8 @@ struct sk_buff *ether_adjust_skb(struct sk_buff *skb, int extra)
        return(skb);
 }
 
-void iter_addresses(void *d, void (*cb)(unsigned char *, unsigned char *, 
-                                       void *), 
+void iter_addresses(void *d, void (*cb)(unsigned char *, unsigned char *,
+                                       void *),
                    void *arg)
 {
        struct net_device *dev = d;
@@ -809,11 +812,11 @@ int dev_netmask(void *d, void *m)
        struct in_ifaddr *in;
        __be32 *mask_out = m;
 
-       if(ip == NULL) 
+       if(ip == NULL)
                return(1);
 
        in = ip->ifa_list;
-       if(in == NULL) 
+       if(in == NULL)
                return(1);
 
        *mask_out = in->ifa_mask;
@@ -827,7 +830,7 @@ void *get_output_buffer(int *len_out)
        ret = (void *) __get_free_pages(GFP_KERNEL, 0);
        if(ret) *len_out = PAGE_SIZE;
        else *len_out = 0;
-       return(ret);
+       return ret;
 }
 
 void free_output_buffer(void *buffer)
@@ -835,7 +838,7 @@ void free_output_buffer(void *buffer)
        free_pages((unsigned long) buffer, 0);
 }
 
-int tap_setup_common(char *str, char *type, char **dev_name, char **mac_out, 
+int tap_setup_common(char *str, char *type, char **dev_name, char **mac_out,
                     char **gate_addr)
 {
        char *remain;
@@ -854,14 +857,3 @@ unsigned short eth_protocol(struct sk_buff *skb)
 {
        return(eth_type_trans(skb, skb->dev));
 }
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
index 6dfe632f1c14d9a64ebc9a279a65025eefba2ac7..1c8efd95c421946ab5e7e56db518395c1847378b 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
  * Licensed under the GPL
  */
@@ -55,9 +55,9 @@ static irqreturn_t pipe_interrupt(int irq, void *data)
        fd = os_rcv_fd(conn->socket[0], &conn->helper_pid);
        if(fd < 0){
                if(fd == -EAGAIN)
-                       return(IRQ_NONE);
+                       return IRQ_NONE;
 
-               printk(KERN_ERR "pipe_interrupt : os_rcv_fd returned %d\n", 
+               printk(KERN_ERR "pipe_interrupt : os_rcv_fd returned %d\n",
                       -fd);
                os_close_file(conn->fd);
        }
@@ -68,7 +68,7 @@ static irqreturn_t pipe_interrupt(int irq, void *data)
        list_add(&conn->list, &conn->port->connections);
 
        complete(&conn->port->done);
-       return(IRQ_HANDLED);
+       return IRQ_HANDLED;
 }
 
 #define NO_WAITER_MSG \
@@ -97,14 +97,14 @@ static int port_accept(struct port_list *port)
                       "connection\n");
                goto out_close;
        }
-       *conn = ((struct connection) 
+       *conn = ((struct connection)
                { .list         = LIST_HEAD_INIT(conn->list),
                  .fd           = fd,
                  .socket       = { socket[0], socket[1] },
                  .telnetd_pid  = pid,
                  .port         = port });
 
-       if(um_request_irq(TELNETD_IRQ, socket[0], IRQ_READ, pipe_interrupt, 
+       if(um_request_irq(TELNETD_IRQ, socket[0], IRQ_READ, pipe_interrupt,
                          IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM,
                          "telnetd", conn)){
                printk(KERN_ERR "port_accept : failed to get IRQ for "
@@ -117,20 +117,20 @@ static int port_accept(struct port_list *port)
                printk("No one waiting for port\n");
        }
        list_add(&conn->list, &port->pending);
-       return(1);
+       return 1;
 
  out_free:
        kfree(conn);
  out_close:
        os_close_file(fd);
-       if(pid != -1) 
+       if(pid != -1)
                os_kill_process(pid, 1);
  out:
-       return(ret);
-} 
+       return ret;
+}
 
-DECLARE_MUTEX(ports_sem);
-struct list_head ports = LIST_HEAD_INIT(ports);
+static DECLARE_MUTEX(ports_sem);
+static LIST_HEAD(ports);
 
 void port_work_proc(struct work_struct *unused)
 {
@@ -158,8 +158,8 @@ static irqreturn_t port_interrupt(int irq, void *data)
 
        port->has_connection = 1;
        schedule_work(&port_work);
-       return(IRQ_HANDLED);
-} 
+       return IRQ_HANDLED;
+}
 
 void *port_data(int port_num)
 {
@@ -185,14 +185,14 @@ void *port_data(int port_num)
                       port_num, -fd);
                goto out_free;
        }
-       if(um_request_irq(ACCEPT_IRQ, fd, IRQ_READ, port_interrupt, 
-                         IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM, "port",
-                         port)){
+       if(um_request_irq(ACCEPT_IRQ, fd, IRQ_READ, port_interrupt,
+                         IRQF_DISABLED | IRQF_SHARED | IRQF_SAMPLE_RANDOM,
+                         "port", port)){
                printk(KERN_ERR "Failed to get IRQ for port %d\n", port_num);
                goto out_close;
        }
 
-       *port = ((struct port_list) 
+       *port = ((struct port_list)
                { .list                 = LIST_HEAD_INIT(port->list),
                  .wait_count           = ATOMIC_INIT(0),
                  .has_connection       = 0,
@@ -222,7 +222,7 @@ void *port_data(int port_num)
        os_close_file(fd);
  out:
        up(&ports_sem);
-       return(dev);
+       return dev;
 }
 
 int port_wait(void *data)
@@ -232,15 +232,15 @@ int port_wait(void *data)
        struct port_list *port = dev->port;
        int fd;
 
-        atomic_inc(&port->wait_count);
+       atomic_inc(&port->wait_count);
        while(1){
                fd = -ERESTARTSYS;
-                if(wait_for_completion_interruptible(&port->done))
-                        goto out;
+               if(wait_for_completion_interruptible(&port->done))
+                       goto out;
 
                spin_lock(&port->lock);
 
-               conn = list_entry(port->connections.next, struct connection, 
+               conn = list_entry(port->connections.next, struct connection,
                                  list);
                list_del(&conn->list);
                spin_unlock(&port->lock);
@@ -248,12 +248,12 @@ int port_wait(void *data)
                os_shutdown_socket(conn->socket[0], 1, 1);
                os_close_file(conn->socket[0]);
                os_shutdown_socket(conn->socket[1], 1, 1);
-               os_close_file(conn->socket[1]); 
+               os_close_file(conn->socket[1]);
 
                /* This is done here because freeing an IRQ can't be done
                 * within the IRQ handler.  So, pipe_interrupt always ups
                 * the semaphore regardless of whether it got a successful
-                * connection.  Then we loop here throwing out failed 
+                * connection.  Then we loop here throwing out failed
                 * connections until a good one is found.
                 */
                free_irq(TELNETD_IRQ, conn);
index bc6afaf74c1a8123ace69f94c5d2d9a340bc6347..80508023054f27bfc493827eeb3e53cbc864f7b0 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
  * Licensed under the GPL
  */
@@ -38,18 +38,18 @@ static void *port_init(char *str, int device, const struct chan_opts *opts)
        if(*str != ':'){
                printk("port_init : channel type 'port' must specify a "
                       "port number\n");
-               return(NULL);
+               return NULL;
        }
        str++;
        port = strtoul(str, &end, 0);
        if((*end != '\0') || (end == str)){
                printk("port_init : couldn't parse port '%s'\n", str);
-               return(NULL);
+               return NULL;
        }
 
        kern_data = port_data(port);
        if(kern_data == NULL)
-               return(NULL);
+               return NULL;
 
        data = um_kmalloc(sizeof(*data));
        if(data == NULL)
@@ -59,10 +59,10 @@ static void *port_init(char *str, int device, const struct chan_opts *opts)
                                      .kernel_data      = kern_data });
        sprintf(data->dev, "%d", port);
 
-       return(data);
+       return data;
  err:
        port_kern_free(kern_data);
-       return(NULL);
+       return NULL;
 }
 
 static void port_free(void *d)
@@ -83,14 +83,14 @@ static int port_open(int input, int output, int primary, void *d,
        if((fd >= 0) && data->raw){
                CATCH_EINTR(err = tcgetattr(fd, &data->tt));
                if(err)
-                       return(err);
+                       return err;
 
                err = raw(fd);
                if(err)
-                       return(err);
+                       return err;
        }
        *dev_out = data->dev;
-       return(fd);
+       return fd;
 }
 
 static void port_close(int fd, void *d)
@@ -120,8 +120,8 @@ int port_listen_fd(int port)
        int fd, err, arg;
 
        fd = socket(PF_INET, SOCK_STREAM, 0);
-       if(fd == -1) 
-               return(-errno);
+       if(fd == -1)
+               return -errno;
 
        arg = 1;
        if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &arg, sizeof(arg)) < 0){
@@ -136,7 +136,7 @@ int port_listen_fd(int port)
                err = -errno;
                goto out;
        }
-  
+
        if(listen(fd, 1) < 0){
                err = -errno;
                goto out;
@@ -146,10 +146,10 @@ int port_listen_fd(int port)
        if(err < 0)
                goto out;
 
-       return(fd);
+       return fd;
  out:
        os_close_file(fd);
-       return(err);
+       return err;
 }
 
 struct port_pre_exec_data {
@@ -173,13 +173,13 @@ void port_pre_exec(void *arg)
 int port_connection(int fd, int *socket, int *pid_out)
 {
        int new, err;
-       char *argv[] = { "/usr/sbin/in.telnetd", "-L", 
+       char *argv[] = { "/usr/sbin/in.telnetd", "-L",
                         "/usr/lib/uml/port-helper", NULL };
        struct port_pre_exec_data data;
 
        new = os_accept_connection(fd);
        if(new < 0)
-               return(new);
+               return new;
 
        err = os_pipe(socket, 0, 0);
        if(err < 0)
@@ -190,29 +190,18 @@ int port_connection(int fd, int *socket, int *pid_out)
                  .pipe_fd              = socket[1] });
 
        err = run_helper(port_pre_exec, &data, argv, NULL);
-       if(err < 0) 
+       if(err < 0)
                goto out_shutdown;
 
        *pid_out = err;
-       return(new);
+       return new;
 
  out_shutdown:
        os_shutdown_socket(socket[0], 1, 1);
        os_close_file(socket[0]);
-       os_shutdown_socket(socket[1], 1, 1);    
+       os_shutdown_socket(socket[1], 1, 1);
        os_close_file(socket[1]);
  out_close:
        os_close_file(new);
-       return(err);
+       return err;
 }
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
index 73b2bdd6d2d3b867165e116b7a1b430f34096c9b..e942e836f9954335651fc3c2b6587c2bd7d7e888 100644 (file)
@@ -78,6 +78,7 @@ static const struct file_operations rng_chrdev_ops = {
        .read           = rng_dev_read,
 };
 
+/* rng_init shouldn't be called more than once at boot time */
 static struct miscdevice rng_miscdev = {
        RNG_MISCDEV_MINOR,
        RNG_MODULE_NAME,
index ed9c59082d0df56806248e7928d4a953d524d15e..fc22b9bd91530548a72cd0b6aad1afde5b00d3e6 100644 (file)
@@ -38,6 +38,7 @@ static void ssl_announce(char *dev_name, int dev)
               dev_name);
 }
 
+/* Almost const, except that xterm_title may be changed in an initcall */
 static struct chan_opts opts = {
        .announce       = ssl_announce,
        .xterm_title    = "Serial Line #%d",
@@ -46,10 +47,12 @@ static struct chan_opts opts = {
        .in_kernel      = 1,
 };
 
-static int ssl_config(char *str);
+static int ssl_config(char *str, char **error_out);
 static int ssl_get_config(char *dev, char *str, int size, char **error_out);
-static int ssl_remove(int n);
+static int ssl_remove(int n, char **error_out);
 
+
+/* Const, except for .mc.list */
 static struct line_driver driver = {
        .name                   = "UML serial line",
        .device_name            = "ttyS",
@@ -61,9 +64,8 @@ static struct line_driver driver = {
        .read_irq_name          = "ssl",
        .write_irq              = SSL_WRITE_IRQ,
        .write_irq_name         = "ssl-write",
-       .symlink_from           = "serial",
-       .symlink_to             = "tts",
        .mc  = {
+               .list           = LIST_HEAD_INIT(driver.mc.list),
                .name           = "ssl",
                .config         = ssl_config,
                .get_config     = ssl_get_config,
@@ -72,17 +74,16 @@ static struct line_driver driver = {
        },
 };
 
-/* The array is initialized by line_init, which is an initcall.  The 
- * individual elements are protected by individual semaphores.
+/* The array is initialized by line_init, at initcall time.  The
+ * elements are locked individually as needed.
  */
 static struct line serial_lines[NR_PORTS] =
        { [0 ... NR_PORTS - 1] = LINE_INIT(CONFIG_SSL_CHAN, &driver) };
 
-static struct lines lines = LINES_INIT(NR_PORTS);
-
-static int ssl_config(char *str)
+static int ssl_config(char *str, char **error_out)
 {
-       return line_config(serial_lines, ARRAY_SIZE(serial_lines), str, &opts);
+       return line_config(serial_lines, ARRAY_SIZE(serial_lines), str, &opts,
+                          error_out);
 }
 
 static int ssl_get_config(char *dev, char *str, int size, char **error_out)
@@ -91,9 +92,10 @@ static int ssl_get_config(char *dev, char *str, int size, char **error_out)
                               size, error_out);
 }
 
-static int ssl_remove(int n)
+static int ssl_remove(int n, char **error_out)
 {
-       return line_remove(serial_lines, ARRAY_SIZE(serial_lines), n);
+       return line_remove(serial_lines, ARRAY_SIZE(serial_lines), n,
+                          error_out);
 }
 
 static int ssl_open(struct tty_struct *tty, struct file *filp)
@@ -168,9 +170,10 @@ static int ssl_console_setup(struct console *co, char *options)
 {
        struct line *line = &serial_lines[co->index];
 
-       return console_open_chan(line, co, &opts);
+       return console_open_chan(line, co);
 }
 
+/* No locking for register_console call - relies on single-threaded initcalls */
 static struct console ssl_cons = {
        .name           = "ttyS",
        .write          = ssl_console_write,
@@ -186,9 +189,8 @@ static int ssl_init(void)
 
        printk(KERN_INFO "Initializing software serial port version %d\n",
               ssl_version);
-       ssl_driver = line_register_devfs(&lines, &driver, &ssl_ops,
-                                        serial_lines,
-                                        ARRAY_SIZE(serial_lines));
+       ssl_driver = register_lines(&driver, &ssl_ops, serial_lines,
+                                   ARRAY_SIZE(serial_lines));
 
        lines_init(serial_lines, ARRAY_SIZE(serial_lines), &opts);
 
@@ -212,7 +214,15 @@ __uml_exitcall(ssl_exit);
 
 static int ssl_chan_setup(char *str)
 {
-       return line_setup(serial_lines, ARRAY_SIZE(serial_lines), str);
+       char *error;
+       int ret;
+
+       ret = line_setup(serial_lines, ARRAY_SIZE(serial_lines), str, &error);
+       if(ret < 0)
+               printk(KERN_ERR "Failed to set up serial line with "
+                      "configuration string \"%s\" : %s\n", str, error);
+
+       return 1;
 }
 
 __setup("ssl", ssl_chan_setup);
index 7a4897e27f42784054bb674fb29e8664f17a5af9..7ff0b0fc37e73eff2875fe4ae0db633570181b66 100644 (file)
@@ -30,8 +30,6 @@
 
 #define MAX_TTYS (16)
 
-/* ----------------------------------------------------------------------------- */
-
 /* Referenced only by tty_driver below - presumably it's locked correctly
  * by the tty driver.
  */
@@ -44,6 +42,7 @@ void stdio_announce(char *dev_name, int dev)
               dev_name);
 }
 
+/* Almost const, except that xterm_title may be changed in an initcall */
 static struct chan_opts opts = {
        .announce       = stdio_announce,
        .xterm_title    = "Virtual Console #%d",
@@ -52,10 +51,12 @@ static struct chan_opts opts = {
        .in_kernel      = 1,
 };
 
-static int con_config(char *str);
+static int con_config(char *str, char **error_out);
 static int con_get_config(char *dev, char *str, int size, char **error_out);
-static int con_remove(int n);
+static int con_remove(int n, char **con_remove);
+
 
+/* Const, except for .mc.list */
 static struct line_driver driver = {
        .name                   = "UML console",
        .device_name            = "tty",
@@ -67,9 +68,8 @@ static struct line_driver driver = {
        .read_irq_name          = "console",
        .write_irq              = CONSOLE_WRITE_IRQ,
        .write_irq_name         = "console-write",
-       .symlink_from           = "ttys",
-       .symlink_to             = "vc",
        .mc  = {
+               .list           = LIST_HEAD_INIT(driver.mc.list),
                .name           = "con",
                .config         = con_config,
                .get_config     = con_get_config,
@@ -78,18 +78,16 @@ static struct line_driver driver = {
        },
 };
 
-static struct lines console_lines = LINES_INIT(MAX_TTYS);
-
-/* The array is initialized by line_init, which is an initcall.  The 
- * individual elements are protected by individual semaphores.
+/* The array is initialized by line_init, at initcall time.  The
+ * elements are locked individually as needed.
  */
-struct line vts[MAX_TTYS] = { LINE_INIT(CONFIG_CON_ZERO_CHAN, &driver),
-                             [ 1 ... MAX_TTYS - 1 ] =
-                             LINE_INIT(CONFIG_CON_CHAN, &driver) };
+static struct line vts[MAX_TTYS] = { LINE_INIT(CONFIG_CON_ZERO_CHAN, &driver),
+                                    [ 1 ... MAX_TTYS - 1 ] =
+                                    LINE_INIT(CONFIG_CON_CHAN, &driver) };
 
-static int con_config(char *str)
+static int con_config(char *str, char **error_out)
 {
-       return line_config(vts, ARRAY_SIZE(vts), str, &opts);
+       return line_config(vts, ARRAY_SIZE(vts), str, &opts, error_out);
 }
 
 static int con_get_config(char *dev, char *str, int size, char **error_out)
@@ -97,9 +95,9 @@ static int con_get_config(char *dev, char *str, int size, char **error_out)
        return line_get_config(dev, vts, ARRAY_SIZE(vts), str, size, error_out);
 }
 
-static int con_remove(int n)
+static int con_remove(int n, char **error_out)
 {
-       return line_remove(vts, ARRAY_SIZE(vts), n);
+       return line_remove(vts, ARRAY_SIZE(vts), n, error_out);
 }
 
 static int con_open(struct tty_struct *tty, struct file *filp)
@@ -146,9 +144,10 @@ static int uml_console_setup(struct console *co, char *options)
 {
        struct line *line = &vts[co->index];
 
-       return console_open_chan(line, co, &opts);
+       return console_open_chan(line, co);
 }
 
+/* No locking for register_console call - relies on single-threaded initcalls */
 static struct console stdiocons = {
        .name           = "tty",
        .write          = uml_console_write,
@@ -156,16 +155,14 @@ static struct console stdiocons = {
        .setup          = uml_console_setup,
        .flags          = CON_PRINTBUFFER,
        .index          = -1,
-       .data           = &vts,
 };
 
 int stdio_init(void)
 {
        char *new_title;
 
-       console_driver = line_register_devfs(&console_lines, &driver,
-                                            &console_ops, vts,
-                                            ARRAY_SIZE(vts));
+       console_driver = register_lines(&driver, &console_ops, vts,
+                                       ARRAY_SIZE(vts));
        if (console_driver == NULL)
                return -1;
        printk(KERN_INFO "Initialized stdio console driver\n");
@@ -192,7 +189,15 @@ __uml_exitcall(console_exit);
 
 static int console_chan_setup(char *str)
 {
-       return line_setup(vts, ARRAY_SIZE(vts), str);
+       char *error;
+       int ret;
+
+       ret = line_setup(vts, ARRAY_SIZE(vts), str, &error);
+       if(ret < 0)
+               printk(KERN_ERR "Failed to set up console with "
+                      "configuration string \"%s\" : %s\n", str, error);
+
+       return 1;
 }
 __setup("con", console_chan_setup);
 __channel_help(console_chan_setup, "con");
index 49c047b75cc556cbda484a5c6166d23d5b137f7c..f98d26e513813483dc27681ce75f180e7566f4ae 100644 (file)
@@ -56,6 +56,7 @@
 enum ubd_req { UBD_READ, UBD_WRITE };
 
 struct io_thread_req {
+       struct request *req;
        enum ubd_req op;
        int fds[2];
        unsigned long offsets[2];
@@ -106,10 +107,6 @@ static inline void ubd_set_bit(__u64 bit, unsigned char *data)
 
 #define DRIVER_NAME "uml-blkdev"
 
-/* Can be taken in interrupt context, and is passed to the block layer to lock
- * the request queue. Kernel side code knows that. */
-static DEFINE_SPINLOCK(ubd_io_lock);
-
 static DEFINE_MUTEX(ubd_lock);
 
 /* XXX - this made sense in 2.4 days, now it's only used as a boolean, and
@@ -132,12 +129,8 @@ static struct block_device_operations ubd_blops = {
        .getgeo         = ubd_getgeo,
 };
 
-/* Protected by the queue_lock */
-static request_queue_t *ubd_queue;
-
 /* Protected by ubd_lock */
 static int fake_major = MAJOR_NR;
-
 static struct gendisk *ubd_gendisk[MAX_DEV];
 static struct gendisk *fake_gendisk[MAX_DEV];
 
@@ -148,10 +141,6 @@ static struct gendisk *fake_gendisk[MAX_DEV];
 #define OPEN_FLAGS ((struct openflags) { .r = 1, .w = 1, .s = 0, .c = 0, \
                                         .cl = 1 })
 #endif
-
-/* Not protected - changed only in ubd_setup_common and then only to
- * to enable O_SYNC.
- */
 static struct openflags global_openflags = OPEN_FLAGS;
 
 struct cow {
@@ -178,6 +167,8 @@ struct ubd {
        unsigned no_cow:1;
        struct cow cow;
        struct platform_device pdev;
+       struct request_queue *queue;
+       spinlock_t lock;
 };
 
 #define DEFAULT_COW { \
@@ -198,8 +189,10 @@ struct ubd {
         .no_cow =               0, \
        .shared =               0, \
         .cow =                 DEFAULT_COW, \
+       .lock =                 SPIN_LOCK_UNLOCKED,     \
 }
 
+/* Protected by ubd_lock */
 struct ubd ubd_devs[MAX_DEV] = { [ 0 ... MAX_DEV - 1 ] = DEFAULT_UBD };
 
 /* Only changed by fake_ide_setup which is a setup */
@@ -242,7 +235,6 @@ static void make_ide_entries(char *dev_name)
 
        ent = create_proc_entry("media", S_IFREG|S_IRUGO, dir);
        if(!ent) return;
-       ent->nlink = 1;
        ent->data = NULL;
        ent->read_proc = proc_ide_read_media;
        ent->write_proc = NULL;
@@ -286,12 +278,12 @@ static int parse_unit(char **ptr)
  * otherwise, the str pointer is used (and owned) inside ubd_devs array, so it
  * should not be freed on exit.
  */
-static int ubd_setup_common(char *str, int *index_out)
+static int ubd_setup_common(char *str, int *index_out, char **error_out)
 {
        struct ubd *ubd_dev;
        struct openflags flags = global_openflags;
        char *backing_file;
-       int n, err, i;
+       int n, err = 0, i;
 
        if(index_out) *index_out = -1;
        n = *str;
@@ -302,56 +294,55 @@ static int ubd_setup_common(char *str, int *index_out)
                str++;
                if(!strcmp(str, "sync")){
                        global_openflags = of_sync(global_openflags);
-                       return(0);
+                       goto out1;
                }
+
+               err = -EINVAL;
                major = simple_strtoul(str, &end, 0);
                if((*end != '\0') || (end == str)){
-                       printk(KERN_ERR
-                              "ubd_setup : didn't parse major number\n");
-                       return(1);
+                       *error_out = "Didn't parse major number";
+                       goto out1;
                }
 
-               err = 1;
-               mutex_lock(&ubd_lock);
-               if(fake_major != MAJOR_NR){
-                       printk(KERN_ERR "Can't assign a fake major twice\n");
-                       goto out1;
-               }
+               mutex_lock(&ubd_lock);
+               if(fake_major != MAJOR_NR){
+                       *error_out = "Can't assign a fake major twice";
+                       goto out1;
+               }
 
-               fake_major = major;
+               fake_major = major;
 
                printk(KERN_INFO "Setting extra ubd major number to %d\n",
                       major);
-               err = 0;
-       out1:
-               mutex_unlock(&ubd_lock);
-               return(err);
+               err = 0;
+       out1:
+               mutex_unlock(&ubd_lock);
+               return err;
        }
 
        n = parse_unit(&str);
        if(n < 0){
-               printk(KERN_ERR "ubd_setup : couldn't parse unit number "
-                      "'%s'\n", str);
-               return(1);
+               *error_out = "Couldn't parse device number";
+               return -EINVAL;
        }
        if(n >= MAX_DEV){
-               printk(KERN_ERR "ubd_setup : index %d out of range "
-                      "(%d devices, from 0 to %d)\n", n, MAX_DEV, MAX_DEV - 1);
-               return(1);
+               *error_out = "Device number out of range";
+               return 1;
        }
 
-       err = 1;
+       err = -EBUSY;
        mutex_lock(&ubd_lock);
 
        ubd_dev = &ubd_devs[n];
        if(ubd_dev->file != NULL){
-               printk(KERN_ERR "ubd_setup : device already configured\n");
+               *error_out = "Device is already configured";
                goto out;
        }
 
        if (index_out)
                *index_out = n;
 
+       err = -EINVAL;
        for (i = 0; i < sizeof("rscd="); i++) {
                switch (*str) {
                case 'r':
@@ -370,47 +361,54 @@ static int ubd_setup_common(char *str, int *index_out)
                        str++;
                        goto break_loop;
                default:
-                       printk(KERN_ERR "ubd_setup : Expected '=' or flag letter (r, s, c, or d)\n");
+                       *error_out = "Expected '=' or flag letter "
+                               "(r, s, c, or d)";
                        goto out;
                }
                str++;
        }
 
-        if (*str == '=')
-               printk(KERN_ERR "ubd_setup : Too many flags specified\n");
-        else
-               printk(KERN_ERR "ubd_setup : Expected '='\n");
+       if (*str == '=')
+               *error_out = "Too many flags specified";
+       else
+               *error_out = "Missing '='";
        goto out;
 
 break_loop:
-       err = 0;
        backing_file = strchr(str, ',');
 
-       if (!backing_file) {
+       if (backing_file == NULL)
                backing_file = strchr(str, ':');
-       }
 
-       if(backing_file){
-               if(ubd_dev->no_cow)
-                       printk(KERN_ERR "Can't specify both 'd' and a "
-                              "cow file\n");
+       if(backing_file != NULL){
+               if(ubd_dev->no_cow){
+                       *error_out = "Can't specify both 'd' and a cow file";
+                       goto out;
+               }
                else {
                        *backing_file = '\0';
                        backing_file++;
                }
        }
+       err = 0;
        ubd_dev->file = str;
        ubd_dev->cow.file = backing_file;
        ubd_dev->boot_openflags = flags;
 out:
        mutex_unlock(&ubd_lock);
-       return(err);
+       return err;
 }
 
 static int ubd_setup(char *str)
 {
-       ubd_setup_common(str, NULL);
-       return(1);
+       char *error;
+       int err;
+
+       err = ubd_setup_common(str, NULL, &error);
+       if(err)
+               printk(KERN_ERR "Failed to initialize device with \"%s\" : "
+                      "%s\n", str, error);
+       return 1;
 }
 
 __setup("ubd", ubd_setup);
@@ -422,7 +420,7 @@ __uml_help(ubd_setup,
 "    use either a ':' or a ',': the first one allows writing things like;\n"
 "      ubd0=~/Uml/root_cow:~/Uml/root_backing_file\n"
 "    while with a ',' the shell would not expand the 2nd '~'.\n"
-"    When using only one filename, UML will detect whether to thread it like\n"
+"    When using only one filename, UML will detect whether to treat it like\n"
 "    a COW file or a backing file. To override this detection, add the 'd'\n"
 "    flag:\n"
 "      ubd0d=BackingFile\n"
@@ -471,12 +469,6 @@ static void do_ubd_request(request_queue_t * q);
 /* Only changed by ubd_init, which is an initcall. */
 int thread_fd = -1;
 
-/* Changed by ubd_handler, which is serialized because interrupts only
- * happen on CPU 0.
- * XXX: currently unused.
- */
-static int intr_count = 0;
-
 /* call ubd_finish if you need to serialize */
 static void __ubd_finish(struct request *req, int error)
 {
@@ -499,36 +491,38 @@ static void __ubd_finish(struct request *req, int error)
  * spin_lock_irq()/spin_lock_irqsave() */
 static inline void ubd_finish(struct request *req, int error)
 {
-       spin_lock(&ubd_io_lock);
+       struct ubd *dev = req->rq_disk->private_data;
+
+       spin_lock(&dev->lock);
        __ubd_finish(req, error);
-       spin_unlock(&ubd_io_lock);
+       spin_unlock(&dev->lock);
 }
 
 /* XXX - move this inside ubd_intr. */
-/* Called without ubd_io_lock held, and only in interrupt context. */
+/* Called without dev->lock held, and only in interrupt context. */
 static void ubd_handler(void)
 {
        struct io_thread_req req;
-       struct request *rq = elv_next_request(ubd_queue);
+       struct request *rq;
+       struct ubd *dev;
        int n;
 
        do_ubd = 0;
-       intr_count++;
        n = os_read_file(thread_fd, &req, sizeof(req));
        if(n != sizeof(req)){
                printk(KERN_ERR "Pid %d - spurious interrupt in ubd_handler, "
                       "err = %d\n", os_getpid(), -n);
-               spin_lock(&ubd_io_lock);
-               end_request(rq, 0);
-               spin_unlock(&ubd_io_lock);
                return;
        }
 
+       rq = req.req;
+       dev = rq->rq_disk->private_data;
+
        ubd_finish(rq, req.error);
-       reactivate_fd(thread_fd, UBD_IRQ);      
-       spin_lock(&ubd_io_lock);
-       do_ubd_request(ubd_queue);
-       spin_unlock(&ubd_io_lock);
+       reactivate_fd(thread_fd, UBD_IRQ);
+       spin_lock(&dev->lock);
+       do_ubd_request(dev->queue);
+       spin_unlock(&dev->lock);
 }
 
 static irqreturn_t ubd_intr(int irq, void *dev)
@@ -632,8 +626,7 @@ static int ubd_open_dev(struct ubd *ubd_dev)
 }
 
 static int ubd_disk_register(int major, u64 size, int unit,
-                       struct gendisk **disk_out)
-                       
+                            struct gendisk **disk_out)
 {
        struct gendisk *disk;
 
@@ -659,7 +652,7 @@ static int ubd_disk_register(int major, u64 size, int unit,
        }
 
        disk->private_data = &ubd_devs[unit];
-       disk->queue = ubd_queue;
+       disk->queue = ubd_devs[unit].queue;
        add_disk(disk);
 
        *disk_out = disk;
@@ -668,28 +661,39 @@ static int ubd_disk_register(int major, u64 size, int unit,
 
 #define ROUND_BLOCK(n) ((n + ((1 << 9) - 1)) & (-1 << 9))
 
-static int ubd_add(int n)
+static int ubd_add(int n, char **error_out)
 {
        struct ubd *ubd_dev = &ubd_devs[n];
-       int err;
+       int err = 0;
 
-       err = -ENODEV;
        if(ubd_dev->file == NULL)
                goto out;
 
        err = ubd_file_size(ubd_dev, &ubd_dev->size);
-       if(err < 0)
+       if(err < 0){
+               *error_out = "Couldn't determine size of device's file";
                goto out;
+       }
 
        ubd_dev->size = ROUND_BLOCK(ubd_dev->size);
 
-       err = ubd_disk_register(MAJOR_NR, ubd_dev->size, n, &ubd_gendisk[n]);
-       if(err)
+       err = -ENOMEM;
+       ubd_dev->queue = blk_init_queue(do_ubd_request, &ubd_dev->lock);
+       if (ubd_dev->queue == NULL) {
+               *error_out = "Failed to initialize device queue";
                goto out;
+       }
+       ubd_dev->queue->queuedata = ubd_dev;
+
+       err = ubd_disk_register(MAJOR_NR, ubd_dev->size, n, &ubd_gendisk[n]);
+       if(err){
+               *error_out = "Failed to register device";
+               goto out_cleanup;
+       }
 
        if(fake_major != MAJOR_NR)
                ubd_disk_register(fake_major, ubd_dev->size, n,
-                            &fake_gendisk[n]);
+                                 &fake_gendisk[n]);
 
        /* perhaps this should also be under the "if (fake_major)" above */
        /* using the fake_disk->disk_name and also the fakehd_set name */
@@ -699,30 +703,37 @@ static int ubd_add(int n)
        err = 0;
 out:
        return err;
+
+out_cleanup:
+       blk_cleanup_queue(ubd_dev->queue);
+       goto out;
 }
 
-static int ubd_config(char *str)
+static int ubd_config(char *str, char **error_out)
 {
        int n, ret;
 
+       /* This string is possibly broken up and stored, so it's only
+        * freed if ubd_setup_common fails, or if only general options
+        * were set.
+        */
        str = kstrdup(str, GFP_KERNEL);
        if (str == NULL) {
-               printk(KERN_ERR "ubd_config failed to strdup string\n");
-               ret = 1;
-               goto out;
+               *error_out = "Failed to allocate memory";
+               return -ENOMEM;
        }
-       ret = ubd_setup_common(str, &n);
-       if (ret) {
-               ret = -1;
+
+       ret = ubd_setup_common(str, &n, error_out);
+       if (ret)
                goto err_free;
-       }
+
        if (n == -1) {
                ret = 0;
                goto err_free;
        }
 
        mutex_lock(&ubd_lock);
-       ret = ubd_add(n);
+       ret = ubd_add(n, error_out);
        if (ret)
                ubd_devs[n].file = NULL;
        mutex_unlock(&ubd_lock);
@@ -777,7 +788,7 @@ static int ubd_id(char **str, int *start_out, int *end_out)
         return n;
 }
 
-static int ubd_remove(int n)
+static int ubd_remove(int n, char **error_out)
 {
        struct ubd *ubd_dev;
        int err = -ENODEV;
@@ -807,6 +818,7 @@ static int ubd_remove(int n)
                fake_gendisk[n] = NULL;
        }
 
+       blk_cleanup_queue(ubd_dev->queue);
        platform_device_unregister(&ubd_dev->pdev);
        *ubd_dev = ((struct ubd) DEFAULT_UBD);
        err = 0;
@@ -815,8 +827,11 @@ out:
        return err;
 }
 
-/* All these are called by mconsole in process context and without ubd-specific locks. */
+/* All these are called by mconsole in process context and without
+ * ubd-specific locks.  The structure itself is const except for .list.
+ */
 static struct mc_device ubd_mc = {
+       .list           = LIST_HEAD_INIT(ubd_mc.list),
        .name           = "ubd",
        .config         = ubd_config,
        .get_config     = ubd_get_config,
@@ -836,13 +851,17 @@ static int __init ubd0_init(void)
 {
        struct ubd *ubd_dev = &ubd_devs[0];
 
+       mutex_lock(&ubd_lock);
        if(ubd_dev->file == NULL)
                ubd_dev->file = "root_fs";
+       mutex_unlock(&ubd_lock);
+
        return(0);
 }
 
 __initcall(ubd0_init);
 
+/* Used in ubd_init, which is an initcall */
 static struct platform_driver ubd_driver = {
        .driver = {
                .name  = DRIVER_NAME,
@@ -851,17 +870,12 @@ static struct platform_driver ubd_driver = {
 
 static int __init ubd_init(void)
 {
-        int i;
+       char *error;
+       int i, err;
 
        if (register_blkdev(MAJOR_NR, "ubd"))
                return -1;
 
-       ubd_queue = blk_init_queue(do_ubd_request, &ubd_io_lock);
-       if (!ubd_queue) {
-               unregister_blkdev(MAJOR_NR, "ubd");
-               return -1;
-       }
-               
        if (fake_major != MAJOR_NR) {
                char name[sizeof("ubd_nnn\0")];
 
@@ -870,8 +884,14 @@ static int __init ubd_init(void)
                        return -1;
        }
        platform_driver_register(&ubd_driver);
-       for (i = 0; i < MAX_DEV; i++)
-               ubd_add(i);
+       mutex_lock(&ubd_lock);
+       for (i = 0; i < MAX_DEV; i++){
+               err = ubd_add(i, &error);
+               if(err)
+                       printk(KERN_ERR "Failed to initialize ubd device %d :"
+                              "%s\n", i, error);
+       }
+       mutex_unlock(&ubd_lock);
        return 0;
 }
 
@@ -1003,7 +1023,7 @@ static void cowify_req(struct io_thread_req *req, unsigned long *bitmap,
                           req->bitmap_words, bitmap_len);
 }
 
-/* Called with ubd_io_lock held */
+/* Called with dev->lock held */
 static int prepare_request(struct request *req, struct io_thread_req *io_req)
 {
        struct gendisk *disk = req->rq_disk;
@@ -1022,6 +1042,7 @@ static int prepare_request(struct request *req, struct io_thread_req *io_req)
        offset = ((__u64) req->sector) << 9;
        len = req->current_nr_sectors << 9;
 
+       io_req->req = req;
        io_req->fds[0] = (ubd_dev->cow.file != NULL) ? ubd_dev->cow.fd : ubd_dev->fd;
        io_req->fds[1] = ubd_dev->fd;
        io_req->cow_offset = -1;
@@ -1043,7 +1064,7 @@ static int prepare_request(struct request *req, struct io_thread_req *io_req)
        return(0);
 }
 
-/* Called with ubd_io_lock held */
+/* Called with dev->lock held */
 static void do_ubd_request(request_queue_t *q)
 {
        struct io_thread_req io_req;
@@ -1102,7 +1123,7 @@ static int ubd_ioctl(struct inode * inode, struct file * file,
                                 sizeof(ubd_id)))
                        return(-EFAULT);
                return(0);
-               
+
        case CDROMVOLREAD:
                if(copy_from_user(&volume, (char __user *) arg, sizeof(volume)))
                        return(-EFAULT);
index 9003a343e1484691880fb6ebf20cf0963609f7d6..c4b41bb1035f6f8ef10a193b92bea717650711fc 100644 (file)
@@ -30,14 +30,13 @@ struct chan {
 extern void chan_interrupt(struct list_head *chans, struct delayed_work *task,
                           struct tty_struct *tty, int irq);
 extern int parse_chan_pair(char *str, struct line *line, int device,
-                          const struct chan_opts *opts);
+                          const struct chan_opts *opts, char **error_out);
 extern int open_chan(struct list_head *chans);
 extern int write_chan(struct list_head *chans, const char *buf, int len,
                             int write_irq);
 extern int console_write_chan(struct list_head *chans, const char *buf, 
                              int len);
-extern int console_open_chan(struct line *line, struct console *co,
-                            const struct chan_opts *opts);
+extern int console_open_chan(struct line *line, struct console *co);
 extern void deactivate_chan(struct list_head *chans, int irq);
 extern void reactivate_chan(struct list_head *chans, int irq);
 extern void chan_enable_winch(struct list_head *chans, struct tty_struct *tty);
index a795547a1dbdb5217563457761bd0f13c2a557e4..38f16d812e7c29d230aa6d72086ef2f3329b40eb 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com)
  * Licensed under the GPL
  */
@@ -9,11 +9,11 @@
 #include "init.h"
 
 struct chan_opts {
-       void (*announce)(char *dev_name, int dev);
+       void (*const announce)(char *dev_name, int dev);
        char *xterm_title;
-       int raw;
-       unsigned long tramp_stack;
-       int in_kernel;
+       const int raw;
+       const unsigned long tramp_stack;
+       const int in_kernel;
 };
 
 enum chan_init_pri { INIT_STATIC, INIT_ALL, INIT_ONE };
@@ -54,14 +54,3 @@ __uml_help(fn, prefix "[0-9]*=<channel description>\n" \
 );
 
 #endif
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
index cec9fcc57bf51f5169cbee6cf7fdc6f60555d5f8..173af029d12b6ec9280c28acbe851ad5b1f7443d 100644 (file)
@@ -61,7 +61,6 @@ extern int set_signals(int enable);
 extern void force_sigbus(void);
 extern int pid_to_processor_id(int pid);
 extern void deliver_signals(void *t);
-extern int next_syscall_index(int max);
 extern int next_trap_index(int max);
 extern void default_idle(void);
 extern void finish_fork(void);
@@ -88,7 +87,6 @@ extern void timer_irq(union uml_pt_regs *regs);
 extern void unprotect_stack(unsigned long stack);
 extern void do_uml_exitcalls(void);
 extern int attach_debugger(int idle_pid, int pid, int stop);
-extern void bad_segv(struct faultinfo fi, unsigned long ip);
 extern int config_gdb(char *str);
 extern int remove_gdb(void);
 extern char *uml_strdup(char *string);
@@ -104,8 +102,6 @@ extern int clear_user_proc(void *buf, int size);
 extern int copy_to_user_proc(void *to, void *from, int size);
 extern int copy_from_user_proc(void *to, void *from, int size);
 extern int strlen_user_proc(char *str);
-extern void bus_handler(int sig, union uml_pt_regs *regs);
-extern void winch(int sig, union uml_pt_regs *regs);
 extern long execute_syscall(void *r);
 extern int smp_sigio_handler(void);
 extern void *get_current(void);
@@ -120,7 +116,6 @@ extern void time_init_kern(void);
 
 /* Are we disallowed to sleep? Used to choose between GFP_KERNEL and GFP_ATOMIC. */
 extern int __cant_sleep(void);
-extern void segv_handler(int sig, union uml_pt_regs *regs);
 extern void sigio_handler(int sig, union uml_pt_regs *regs);
 
 #endif
index 5f232ae89fbb8440a7dd4b4830011bb401f437d4..1223f2c844b4085c798e79400419bcb718dc979c 100644 (file)
 #include "linux/tty.h"
 #include "linux/interrupt.h"
 #include "linux/spinlock.h"
+#include "linux/mutex.h"
 #include "chan_user.h"
 #include "mconsole_kern.h"
 
+/* There's only one modifiable field in this - .mc.list */
 struct line_driver {
-       char *name;
-       char *device_name;
-       short major;
-       short minor_start;
-       short type;
-       short subtype;
-       int read_irq;
-       char *read_irq_name;
-       int write_irq;
-       char *write_irq_name;
-       char *symlink_from;
-       char *symlink_to;
+       const char *name;
+       const char *device_name;
+       const short major;
+       const short minor_start;
+       const short type;
+       const short subtype;
+       const int read_irq;
+       const char *read_irq_name;
+       const int write_irq;
+       const char *write_irq_name;
        struct mc_device mc;
 };
 
 struct line {
        struct tty_struct *tty;
+       spinlock_t count_lock;
+       int valid;
+
        char *init_str;
        int init_pri;
        struct list_head chan_list;
-       int valid;
-       int count;
-       int throttled;
+
        /*This lock is actually, mostly, local to*/
        spinlock_t lock;
-
+       int throttled;
        /* Yes, this is a real circular buffer.
         * XXX: And this should become a struct kfifo!
         *
@@ -57,22 +58,17 @@ struct line {
 };
 
 #define LINE_INIT(str, d) \
-       { .init_str =   str, \
+       { .count_lock = SPIN_LOCK_UNLOCKED, \
+         .init_str =   str,    \
          .init_pri =   INIT_STATIC, \
          .valid =      1, \
          .lock =       SPIN_LOCK_UNLOCKED, \
          .driver =     d }
 
-struct lines {
-       int num;
-};
-
-#define LINES_INIT(n) {  .num =        n }
-
 extern void line_close(struct tty_struct *tty, struct file * filp);
 extern int line_open(struct line *lines, struct tty_struct *tty);
 extern int line_setup(struct line *lines, unsigned int sizeof_lines,
-                     char *init);
+                     char *init, char **error_out);
 extern int line_write(struct tty_struct *tty, const unsigned char *buf,
                      int len);
 extern void line_put_char(struct tty_struct *tty, unsigned char ch);
@@ -90,17 +86,18 @@ extern char *add_xterm_umid(char *base);
 extern int line_setup_irq(int fd, int input, int output, struct line *line,
                          void *data);
 extern void line_close_chan(struct line *line);
-extern struct tty_driver * line_register_devfs(struct lines *set,
-                                              struct line_driver *line_driver,
-                                              const struct tty_operations *driver,
-                                              struct line *lines, int nlines);
+extern struct tty_driver *register_lines(struct line_driver *line_driver,
+                                        const struct tty_operations *driver,
+                                        struct line *lines, int nlines);
 extern void lines_init(struct line *lines, int nlines, struct chan_opts *opts);
 extern void close_lines(struct line *lines, int nlines);
 
 extern int line_config(struct line *lines, unsigned int sizeof_lines,
-                      char *str, const struct chan_opts *opts);
+                      char *str, const struct chan_opts *opts,
+                      char **error_out);
 extern int line_id(char **str, int *start_out, int *end_out);
-extern int line_remove(struct line *lines, unsigned int sizeof_lines, int n);
+extern int line_remove(struct line *lines, unsigned int sizeof_lines, int n,
+                      char **error_out);
 extern int line_get_config(char *dev, struct line *lines,
                           unsigned int sizeof_lines, char *str,
                           int size, char **error_out);
index 1ea6d928e1cd2a5794057cebac2fa6636363048d..d2fe07e78958cb521c4aa3e439581da596b85efe 100644 (file)
@@ -18,10 +18,10 @@ struct mconsole_entry {
 struct mc_device {
        struct list_head list;
        char *name;
-       int (*config)(char *);
+       int (*config)(char *, char **);
        int (*get_config)(char *, char *, int, char **);
-        int (*id)(char **, int *, int *);
-       int (*remove)(int);
+       int (*id)(char **, int *, int *);
+       int (*remove)(int, char **);
 };
 
 #define CONFIG_CHUNK(str, size, current, chunk, end) \
@@ -50,14 +50,3 @@ static inline void mconsole_register_dev(struct mc_device *new)
 #endif
 
 #endif
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
index 218f8b47fdcd7ea80543acca85bc4e2b0bd9e972..125ab42df18a4e53ec77319991df474a890092cc 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright (C) 2002 Jeff Dike (jdike@karaya.com)
  * Licensed under the GPL
  */
@@ -36,7 +36,7 @@ struct uml_net_private {
        void (*remove)(void *);
        int (*read)(int, struct sk_buff **skb, struct uml_net_private *);
        int (*write)(int, struct sk_buff **skb, struct uml_net_private *);
-       
+
        void (*add_address)(unsigned char *, unsigned char *, void *);
        void (*delete_address)(unsigned char *, unsigned char *, void *);
        int (*set_mtu)(int mtu, void *);
@@ -52,18 +52,18 @@ struct net_kern_info {
 
 struct transport {
        struct list_head list;
-       char *name;
-       int (*setup)(char *, char **, void *);
+       const char *name;
+       int (* const setup)(char *, char **, void *);
        const struct net_user_info *user;
        const struct net_kern_info *kern;
-       int private_size;
-       int setup_size;
+       const int private_size;
+       const int setup_size;
 };
 
 extern struct net_device *ether_init(int);
 extern unsigned short ether_protocol(struct sk_buff *);
 extern struct sk_buff *ether_adjust_skb(struct sk_buff *skb, int extra);
-extern int tap_setup_common(char *str, char *type, char **dev_name, 
+extern int tap_setup_common(char *str, char *type, char **dev_name,
                            char **mac_out, char **gate_addr);
 extern void register_transport(struct transport *new);
 extern unsigned short eth_protocol(struct sk_buff *skb);
index 13a86bd383d3355fdaf4b30e9703b4968fb58ff8..8629bd1914925aba5d78f4348221c796fc323920 100644 (file)
@@ -137,7 +137,6 @@ extern int os_new_tty_pgrp(int fd, int pid);
 extern int os_get_ifname(int fd, char *namebuf);
 extern int os_set_slip(int fd);
 extern int os_set_owner(int fd, int pid);
-extern int os_sigio_async(int master, int slave);
 extern int os_mode_fd(int fd, int mode);
 
 extern int os_seek_file(int fd, __u64 offset);
@@ -341,4 +340,6 @@ extern void maybe_sigio_broken(int fd, int read);
 extern void sig_handler_common_skas(int sig, void *sc_ptr);
 extern void user_signal(int sig, union uml_pt_regs *regs, int pid);
 
+extern int os_arch_prctl(int pid, int code, unsigned long *addr);
+
 #endif
index fe99ea163c2e68eab0be8e7cecd183132a53e5e1..434f1a9ae4b354621f01d82eb3965cc8645af989 100644 (file)
@@ -12,14 +12,3 @@ extern void sigio_lock(void);
 extern void sigio_unlock(void);
 
 #endif
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
index e36d9e0f51058dc88f730701bcde3b72037a4816..d441eac936b9830014e4ec650562d10f262dc0f8 100644 (file)
@@ -9,13 +9,3 @@
 extern int make_tempfile(const char *template, char **tempname, int do_unlink);
 
 #endif
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
diff --git a/arch/um/include/umid.h b/arch/um/include/umid.h
deleted file mode 100644 (file)
index 11373c8..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
- * Licensed under the GPL
- */
-
-#ifndef __UMID_H__
-#define __UMID_H__
-
-extern int umid_file_name(char *name, char *buf, int len);
-
-#endif
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
index 06625fefef3387b2aac94471361cf59139042b34..023575f67343c99186ebd8ad751c4c35b7eef17a 100644 (file)
@@ -38,8 +38,6 @@ extern unsigned long long highmem;
 
 extern char host_info[];
 
-extern char saved_command_line[];
-
 extern unsigned long _stext, _etext, _sdata, _edata, __bss_start, _end;
 extern unsigned long _unprotected_end;
 extern unsigned long brk_start;
index 6fa63a2a89e3855df6d351229cdca896c6c3a8f7..c5cf4a0827b0f130b20578c1a5c4fa0167249728 100644 (file)
@@ -7,7 +7,7 @@ extra-y := vmlinux.lds
 clean-files :=
 
 obj-y = config.o exec.o exitcode.o init_task.o irq.o ksyms.o mem.o \
-       physmem.o process.o ptrace.o reboot.o resource.o sigio.o \
+       physmem.o process.o ptrace.o reboot.o sigio.o \
        signal.o smp.o syscall.o sysrq.o time.o tlb.o trap.o uaccess.o \
        um_arch.o umid.o
 
index 8d56ec6cca79606e8ee8d075e455e1f2b8d532d6..121166400e25a01917df9452560e2fc12bfba882 100644 (file)
@@ -39,9 +39,9 @@ static long execve1(char *file, char __user * __user *argv,
                    char __user *__user *env)
 {
         long error;
+#ifdef CONFIG_TTY_LOG
        struct tty_struct *tty;
 
-#ifdef CONFIG_TTY_LOG
        mutex_lock(&tty_mutex);
        tty = get_current_tty();
        if (tty)
index 5c1e611f628d548fed1716c75d5537c39d6b8cc4..50a288bb875a87ec10e977db3f366358c15d29d8 100644 (file)
@@ -79,7 +79,7 @@ skip:
        return 0;
 }
 
-struct irq_fd *active_fds = NULL;
+static struct irq_fd *active_fds = NULL;
 static struct irq_fd **last_irq_ptr = &active_fds;
 
 extern void free_irqs(void);
@@ -124,8 +124,8 @@ int activate_fd(int irq, int fd, int type, void *dev_id)
        if (err < 0)
                goto out;
 
-       new_fd = um_kmalloc(sizeof(*new_fd));
        err = -ENOMEM;
+       new_fd = kmalloc(sizeof(struct irq_fd), GFP_KERNEL);
        if (new_fd == NULL)
                goto out;
 
@@ -176,9 +176,8 @@ int activate_fd(int irq, int fd, int type, void *dev_id)
                 */
                spin_unlock_irqrestore(&irq_lock, flags);
                kfree(tmp_pfd);
-               tmp_pfd = NULL;
 
-               tmp_pfd = um_kmalloc(n);
+               tmp_pfd = kmalloc(n, GFP_KERNEL);
                if (tmp_pfd == NULL)
                        goto out_kfree;
 
index c95855ba6ab576f7063f3bdf825efb8182a13b9a..e85d65deea0db9c46f16085c8f168e56e4a475c5 100644 (file)
@@ -24,8 +24,9 @@
 #include "init.h"
 #include "kern_constants.h"
 
-/* Changed during early boot */
+/* allocated in paging_init, zeroed in mem_init, and unchanged thereafter */
 unsigned long *empty_zero_page = NULL;
+/* allocated in paging_init and unchanged thereafter */
 unsigned long *empty_bad_page = NULL;
 pgd_t swapper_pg_dir[PTRS_PER_PGD];
 unsigned long long highmem;
@@ -65,8 +66,8 @@ void mem_init(void)
 {
        max_low_pfn = (high_physmem - uml_physmem) >> PAGE_SHIFT;
 
-        /* clear the zero-page */
-        memset((void *) empty_zero_page, 0, PAGE_SIZE);
+       /* clear the zero-page */
+       memset((void *) empty_zero_page, 0, PAGE_SIZE);
 
        /* Map in the area just after the brk now that kmalloc is about
         * to be turned on.
@@ -253,8 +254,10 @@ struct page *arch_validate(struct page *page, gfp_t mask, int order)
        int i;
 
  again:
-       if(page == NULL) return(page);
-       if(PageHighMem(page)) return(page);
+       if(page == NULL)
+               return page;
+       if(PageHighMem(page))
+               return page;
 
        addr = (unsigned long) page_address(page);
        for(i = 0; i < (1 << order); i++){
@@ -263,13 +266,15 @@ struct page *arch_validate(struct page *page, gfp_t mask, int order)
                                     sizeof(zero),
                                     &current->thread.fault_addr,
                                     &current->thread.fault_catcher)){
-                       if(!(mask & __GFP_WAIT)) return(NULL);
+                       if(!(mask & __GFP_WAIT))
+                               return NULL;
                        else break;
                }
                addr += PAGE_SIZE;
        }
 
-       if(i == (1 << order)) return(page);
+       if(i == (1 << order))
+               return page;
        page = alloc_pages(mask, order);
        goto again;
 }
@@ -283,7 +288,6 @@ void free_initmem(void)
 }
 
 #ifdef CONFIG_BLK_DEV_INITRD
-
 void free_initrd_mem(unsigned long start, unsigned long end)
 {
        if (start < end)
@@ -296,37 +300,36 @@ void free_initrd_mem(unsigned long start, unsigned long end)
                totalram_pages++;
        }
 }
-       
 #endif
 
 void show_mem(void)
 {
-        int pfn, total = 0, reserved = 0;
-        int shared = 0, cached = 0;
-        int highmem = 0;
+       int pfn, total = 0, reserved = 0;
+       int shared = 0, cached = 0;
+       int highmem = 0;
        struct page *page;
 
-        printk("Mem-info:\n");
-        show_free_areas();
-        printk("Free swap:       %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
-        pfn = max_mapnr;
-        while(pfn-- > 0) {
+       printk("Mem-info:\n");
+       show_free_areas();
+       printk("Free swap:       %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
+       pfn = max_mapnr;
+       while(pfn-- > 0) {
                page = pfn_to_page(pfn);
-                total++;
-                if(PageHighMem(page))
-                        highmem++;
-                if(PageReserved(page))
-                        reserved++;
-                else if(PageSwapCache(page))
-                        cached++;
-                else if(page_count(page))
-                        shared += page_count(page) - 1;
-        }
-        printk("%d pages of RAM\n", total);
-        printk("%d pages of HIGHMEM\n", highmem);
-        printk("%d reserved pages\n", reserved);
-        printk("%d pages shared\n", shared);
-        printk("%d pages swap cached\n", cached);
+               total++;
+               if(PageHighMem(page))
+                       highmem++;
+               if(PageReserved(page))
+                       reserved++;
+               else if(PageSwapCache(page))
+                       cached++;
+               else if(page_count(page))
+                       shared += page_count(page) - 1;
+       }
+       printk("%d pages of RAM\n", total);
+       printk("%d pages of HIGHMEM\n", highmem);
+       printk("%d reserved pages\n", reserved);
+       printk("%d pages shared\n", shared);
+       printk("%d pages swap cached\n", cached);
 }
 
 /*
@@ -362,28 +365,7 @@ pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
 struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address)
 {
        struct page *pte;
-   
+
        pte = alloc_page(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO);
        return pte;
 }
-
-struct iomem_region *iomem_regions = NULL;
-int iomem_size = 0;
-
-extern int parse_iomem(char *str, int *add) __init;
-
-__uml_setup("iomem=", parse_iomem,
-"iomem=<name>,<file>\n"
-"    Configure <file> as an IO memory region named <name>.\n\n"
-);
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
index abafa64b8727ecef4e0b35f04fbcae7d7551662a..638f3b5f6094a362968bca5c241a97a34cfe92fb 100644 (file)
@@ -40,7 +40,7 @@ static struct rb_node **find_rb(void *virt)
        while(*n != NULL){
                d = rb_entry(*n, struct phys_desc, rb);
                if(d->virt == virt)
-                       return(n);
+                       return n;
 
                if(d->virt > virt)
                        n = &(*n)->rb_left;
@@ -48,7 +48,7 @@ static struct rb_node **find_rb(void *virt)
                        n = &(*n)->rb_right;
        }
 
-       return(n);
+       return n;
 }
 
 static struct phys_desc *find_phys_mapping(void *virt)
@@ -56,9 +56,9 @@ static struct phys_desc *find_phys_mapping(void *virt)
        struct rb_node **n = find_rb(virt);
 
        if(*n == NULL)
-               return(NULL);
+               return NULL;
 
-       return(rb_entry(*n, struct phys_desc, rb));
+       return rb_entry(*n, struct phys_desc, rb);
 }
 
 static void insert_phys_mapping(struct phys_desc *desc)
@@ -89,10 +89,10 @@ static struct desc_mapping *find_mapping(int fd)
        list_for_each(ele, &descriptor_mappings){
                desc = list_entry(ele, struct desc_mapping, list);
                if(desc->fd == fd)
-                       return(desc);
+                       return desc;
        }
 
-       return(NULL);
+       return NULL;
 }
 
 static struct desc_mapping *descriptor_mapping(int fd)
@@ -101,11 +101,11 @@ static struct desc_mapping *descriptor_mapping(int fd)
 
        desc = find_mapping(fd);
        if(desc != NULL)
-               return(desc);
+               return desc;
 
        desc = kmalloc(sizeof(*desc), GFP_ATOMIC);
        if(desc == NULL)
-               return(NULL);
+               return NULL;
 
        *desc = ((struct desc_mapping)
                { .fd =         fd,
@@ -113,7 +113,7 @@ static struct desc_mapping *descriptor_mapping(int fd)
                  .pages =      LIST_HEAD_INIT(desc->pages) });
        list_add(&desc->list, &descriptor_mappings);
 
-       return(desc);
+       return desc;
 }
 
 int physmem_subst_mapping(void *virt, int fd, __u64 offset, int w)
@@ -125,11 +125,11 @@ int physmem_subst_mapping(void *virt, int fd, __u64 offset, int w)
 
        fd_maps = descriptor_mapping(fd);
        if(fd_maps == NULL)
-               return(-ENOMEM);
+               return -ENOMEM;
 
        phys = __pa(virt);
        desc = find_phys_mapping(virt);
-       if(desc != NULL)
+       if(desc != NULL)
                panic("Address 0x%p is already substituted\n", virt);
 
        err = -ENOMEM;
@@ -155,7 +155,7 @@ int physmem_subst_mapping(void *virt, int fd, __u64 offset, int w)
        rb_erase(&desc->rb, &phys_mappings);
        kfree(desc);
  out:
-       return(err);
+       return err;
 }
 
 static int physmem_fd = -1;
@@ -182,10 +182,10 @@ int physmem_remove_mapping(void *virt)
        virt = (void *) ((unsigned long) virt & PAGE_MASK);
        desc = find_phys_mapping(virt);
        if(desc == NULL)
-               return(0);
+               return 0;
 
        remove_mapping(desc);
-       return(1);
+       return 1;
 }
 
 void physmem_forget_descriptor(int fd)
@@ -239,9 +239,9 @@ void arch_free_page(struct page *page, int order)
 
 int is_remapped(void *virt)
 {
-       struct phys_desc *desc = find_phys_mapping(virt);
+       struct phys_desc *desc = find_phys_mapping(virt);
 
-       return(desc != NULL);
+       return desc != NULL;
 }
 
 /* Changed during early boot */
@@ -276,7 +276,7 @@ int init_maps(unsigned long physmem, unsigned long iomem, unsigned long highmem)
        else map = alloc_bootmem_low_pages(total_len);
 
        if(map == NULL)
-               return(-ENOMEM);
+               return -ENOMEM;
 
        for(i = 0; i < total_pages; i++){
                p = &map[i];
@@ -286,7 +286,7 @@ int init_maps(unsigned long physmem, unsigned long iomem, unsigned long highmem)
        }
 
        max_mapnr = total_pages;
-       return(0);
+       return 0;
 }
 
 /* Changed during early boot */
@@ -296,7 +296,7 @@ unsigned long get_kmem_end(void)
 {
        if(kmem_top == 0)
                kmem_top = CHOOSE_MODE(kmem_end_tt, kmem_end_skas);
-       return(kmem_top);
+       return kmem_top;
 }
 
 void map_memory(unsigned long virt, unsigned long phys, unsigned long len,
@@ -379,7 +379,7 @@ int phys_mapping(unsigned long phys, __u64 *offset_out)
                *offset_out = phys - iomem_size;
        }
 
-       return(fd);
+       return fd;
 }
 
 static int __init uml_mem_setup(char *line, int *add)
@@ -398,6 +398,23 @@ __uml_setup("mem=", uml_mem_setup,
 "      Example: mem=64M\n\n"
 );
 
+extern int __init parse_iomem(char *str, int *add);
+
+__uml_setup("iomem=", parse_iomem,
+"iomem=<name>,<file>\n"
+"    Configure <file> as an IO memory region named <name>.\n\n"
+);
+
+/*
+ * This list is constructed in parse_iomem and addresses filled in in
+ * setup_iomem, both of which run during early boot.  Afterwards, it's
+ * unchanged.
+ */
+struct iomem_region *iomem_regions = NULL;
+
+/* Initialized in parse_iomem */
+int iomem_size = 0;
+
 unsigned long find_iomem(char *driver, unsigned long *len_out)
 {
        struct iomem_region *region = iomem_regions;
@@ -405,13 +422,13 @@ unsigned long find_iomem(char *driver, unsigned long *len_out)
        while(region != NULL){
                if(!strcmp(region->driver, driver)){
                        *len_out = region->size;
-                       return(region->virt);
+                       return region->virt;
                }
 
                region = region->next;
        }
 
-       return(0);
+       return 0;
 }
 
 int setup_iomem(void)
@@ -435,18 +452,7 @@ int setup_iomem(void)
                region = region->next;
        }
 
-       return(0);
+       return 0;
 }
 
 __initcall(setup_iomem);
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
index 9a77fb3c269d667d122c628fec3dd90d8fc4222a..627742d894347c7ca6eb51f989b1e4c259de0909 100644 (file)
@@ -18,6 +18,7 @@
 #include "kern_util.h"
 #include "skas_ptrace.h"
 #include "sysdep/ptrace.h"
+#include "os.h"
 
 static inline void set_singlestepping(struct task_struct *child, int on)
 {
@@ -240,6 +241,12 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                ret = 0;
                break;
        }
+#endif
+#ifdef PTRACE_ARCH_PRCTL
+        case PTRACE_ARCH_PRCTL:
+                /* XXX Calls ptrace on the host - needs some SMP thinking */
+                ret = arch_prctl_skas(child, data, (void *) addr);
+                break;
 #endif
        default:
                ret = ptrace_request(child, request, addr, data);
diff --git a/arch/um/kernel/resource.c b/arch/um/kernel/resource.c
deleted file mode 100644 (file)
index 32188e1..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/* 
- * Copyright (C) 2000 Jeff Dike (jdike@karaya.com)
- * Licensed under the GPL
- */
-
-#include "linux/pci.h"
-
-unsigned long resource_fixup(struct pci_dev * dev, struct resource * res,
-                            unsigned long start, unsigned long size)
-{
-       return start;
-}
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
index 2b0ab438301c8bae8f8f4c3a6fe951b71f72e1dd..89f9866a1354b8073cf5f015bd4b80e276b6e9a4 100644 (file)
@@ -23,7 +23,7 @@ static irqreturn_t sigio_interrupt(int irq, void *data)
 
        os_read_file(sigio_irq_fd, &c, sizeof(c));
        reactivate_fd(sigio_irq_fd, SIGIO_WRITE_IRQ);
-       return(IRQ_HANDLED);
+       return IRQ_HANDLED;
 }
 
 int write_sigio_irq(int fd)
@@ -36,12 +36,13 @@ int write_sigio_irq(int fd)
        if(err){
                printk("write_sigio_irq : um_request_irq failed, err = %d\n",
                       err);
-               return(-1);
+               return -1;
        }
        sigio_irq_fd = fd;
-       return(0);
+       return 0;
 }
 
+/* These are called from os-Linux/sigio.c to protect its pollfds arrays. */
 static DEFINE_SPINLOCK(sigio_spinlock);
 
 void sigio_lock(void)
index 0d2cce621134b98e315c958f6addd43a8d0d1bf1..7c18dfcd7d8eee3446457ca928a867136cf880e2 100644 (file)
@@ -14,13 +14,9 @@ unsigned long set_task_sizes_skas(unsigned long *task_size_out)
        unsigned long host_task_size = ROUND_4M((unsigned long)
                                                &host_task_size);
 
-#ifdef CONFIG_HOST_TASK_SIZE
-       *host_size_out = ROUND_4M(CONFIG_HOST_TASK_SIZE);
-       *task_size_out = CONFIG_HOST_TASK_SIZE;
-#else
        if (!skas_needs_stub)
                *task_size_out = host_task_size;
        else *task_size_out = CONFIG_STUB_START & PGDIR_MASK;
-#endif
+
        return host_task_size;
 }
index f5ed8624648b88f0b0022a5994f202361fea19fb..2828c52832275fffa7b013e86cb70ea4867363f9 100644 (file)
@@ -149,22 +149,6 @@ long sys_olduname(struct oldold_utsname __user * name)
        return error;
 }
 
-DEFINE_SPINLOCK(syscall_lock);
-
-static int syscall_index = 0;
-
-int next_syscall_index(int limit)
-{
-       int ret;
-
-       spin_lock(&syscall_lock);
-       ret = syscall_index;
-       if(++syscall_index == limit)
-               syscall_index = 0;
-       spin_unlock(&syscall_lock);
-       return(ret);
-}
-
 int kernel_execve(const char *filename, char *const argv[], char *const envp[])
 {
        mm_segment_t fs;
index 239c98054dec4292f3444783240bf28958f7a850..f9e02b31a97af3dde7bb23437013d6e628b85761 100644 (file)
@@ -50,7 +50,7 @@ void dump_stack(void)
 EXPORT_SYMBOL(dump_stack);
 
 /*Stolen from arch/i386/kernel/traps.c */
-static int kstack_depth_to_print = 24;
+static const int kstack_depth_to_print = 24;
 
 /* This recently started being used in arch-independent code too, as in
  * kernel/sched.c.*/
index 2e354b3ca060649bb0cbd8afef6633637dc357a8..b1f8b0752419d8514763d6ca297674e6e7ceb03e 100644 (file)
@@ -35,31 +35,31 @@ unsigned long long sched_clock(void)
        return (unsigned long long)jiffies_64 * (1000000000 / HZ);
 }
 
-static unsigned long long prev_nsecs;
+static unsigned long long prev_nsecs[NR_CPUS];
 #ifdef CONFIG_UML_REAL_TIME_CLOCK
-static long long delta               /* Deviation per interval */
+static long long delta[NR_CPUS];               /* Deviation per interval */
 #endif
 
 void timer_irq(union uml_pt_regs *regs)
 {
        unsigned long long ticks = 0;
-
 #ifdef CONFIG_UML_REAL_TIME_CLOCK
-       if(prev_nsecs){
+       int c = cpu();
+       if(prev_nsecs[c]){
                /* We've had 1 tick */
                unsigned long long nsecs = os_nsecs();
 
-               delta += nsecs - prev_nsecs;
-               prev_nsecs = nsecs;
+               delta[c] += nsecs - prev_nsecs[c];
+               prev_nsecs[c] = nsecs;
 
                /* Protect against the host clock being set backwards */
-               if(delta < 0)
-                       delta = 0;
+               if(delta[c] < 0)
+                       delta[c] = 0;
 
-               ticks += (delta * HZ) / BILLION;
-               delta -= (ticks * BILLION) / HZ;
+               ticks += (delta[c] * HZ) / BILLION;
+               delta[c] -= (ticks * BILLION) / HZ;
        }
-       else prev_nsecs = os_nsecs();
+       else prev_nsecs[c] = os_nsecs();
 #else
        ticks = 1;
 #endif
@@ -69,8 +69,8 @@ void timer_irq(union uml_pt_regs *regs)
        }
 }
 
+/* Protects local_offset */
 static DEFINE_SPINLOCK(timer_spinlock);
-
 static unsigned long long local_offset = 0;
 
 static inline unsigned long long get_time(void)
index b5f124a2f6ae843b48d33ca02c2a9800a695578d..26f15c4585747c3bf1d95fef79276e628b69c7f6 100644 (file)
@@ -128,7 +128,18 @@ out_of_memory:
        goto out;
 }
 
-void segv_handler(int sig, union uml_pt_regs *regs)
+static void bad_segv(struct faultinfo fi, unsigned long ip)
+{
+       struct siginfo si;
+
+       si.si_signo = SIGSEGV;
+       si.si_code = SEGV_ACCERR;
+       si.si_addr = (void __user *) FAULT_ADDRESS(fi);
+       current->thread.arch.faultinfo = fi;
+       force_sig_info(SIGSEGV, &si, current);
+}
+
+static void segv_handler(int sig, union uml_pt_regs *regs)
 {
        struct faultinfo * fi = UPT_FAULTINFO(regs);
 
@@ -205,17 +216,6 @@ unsigned long segv(struct faultinfo fi, unsigned long ip, int is_user, void *sc)
        return(0);
 }
 
-void bad_segv(struct faultinfo fi, unsigned long ip)
-{
-       struct siginfo si;
-
-       si.si_signo = SIGSEGV;
-       si.si_code = SEGV_ACCERR;
-       si.si_addr = (void __user *) FAULT_ADDRESS(fi);
-       current->thread.arch.faultinfo = fi;
-       force_sig_info(SIGSEGV, &si, current);
-}
-
 void relay_signal(int sig, union uml_pt_regs *regs)
 {
        if(arch_handle_signal(sig, regs))
@@ -232,14 +232,14 @@ void relay_signal(int sig, union uml_pt_regs *regs)
        force_sig(sig, current);
 }
 
-void bus_handler(int sig, union uml_pt_regs *regs)
+static void bus_handler(int sig, union uml_pt_regs *regs)
 {
        if(current->thread.fault_catcher != NULL)
                do_longjmp(current->thread.fault_catcher, 1);
        else relay_signal(sig, regs);
 }
 
-void winch(int sig, union uml_pt_regs *regs)
+static void winch(int sig, union uml_pt_regs *regs)
 {
        do_IRQ(WINCH_IRQ, regs);
 }
index 786e4edd86c51bb9f3a03766d22ec8eb7c8dc55f..8eba8f7dca683cefaebb04f51be819a3f8362e68 100644 (file)
@@ -139,7 +139,7 @@ static void config_gdb_cb(void *arg)
        init_proxy(debugger_pid, 0, 0);
 }
 
-int gdb_config(char *str)
+int gdb_config(char *str, char **error_out)
 {
        struct gdb_data data;
 
@@ -154,7 +154,7 @@ void remove_gdb_cb(void *unused)
        exit_debugger_cb(NULL);
 }
 
-int gdb_remove(int unused)
+int gdb_remove(int unused, char **error_out)
 {
        initial_thread_cb(remove_gdb_cb, NULL);
         return 0;
index 68e1bf63cd0ad2e453010bc384161dfb74e75699..03b06bc00771596d55856641de8963ebb9c16e8c 100644 (file)
@@ -8,10 +8,11 @@
 
 #ifdef CONFIG_MCONSOLE
 
-extern int gdb_config(char *str);
-extern int gdb_remove(int n);
+extern int gdb_config(char *str, char **error_out);
+extern int gdb_remove(int n, char **error_out);
 
 static struct mc_device gdb_mc = {
+       .list           = INIT_LIST_HEAD(gdb_mc.list),
        .name           = "gdb",
        .config         = gdb_config,
        .remove         = gdb_remove,
index 66f43c906821b46de035417fdb1ca042b47eecad..89c6dba731f817d7d37d739ffb38ea279d0d3f0c 100644 (file)
@@ -30,7 +30,6 @@
 #include "kern.h"
 #include "mem_user.h"
 #include "mem.h"
-#include "umid.h"
 #include "initrd.h"
 #include "init.h"
 #include "os.h"
@@ -44,9 +43,9 @@
 #define DEFAULT_COMMAND_LINE "root=98:0"
 
 /* Changed in linux_main and setup_arch, which run before SMP is started */
-static char command_line[COMMAND_LINE_SIZE] = { 0 };
+static char __initdata command_line[COMMAND_LINE_SIZE] = { 0 };
 
-static void add_arg(char *arg)
+static void __init add_arg(char *arg)
 {
        if (strlen(command_line) + strlen(arg) + 1 > COMMAND_LINE_SIZE) {
                printf("add_arg: Too many command line arguments!\n");
@@ -331,7 +330,7 @@ EXPORT_SYMBOL(end_iomem);
 
 extern char __binary_start;
 
-int linux_main(int argc, char **argv)
+int __init linux_main(int argc, char **argv)
 {
        unsigned long avail, diff;
        unsigned long virtmem_size, max_physmem;
@@ -482,7 +481,7 @@ void __init setup_arch(char **cmdline_p)
        atomic_notifier_chain_register(&panic_notifier_list,
                        &panic_exit_notifier);
        paging_init();
-        strlcpy(saved_command_line, command_line, COMMAND_LINE_SIZE);
+       strlcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
        *cmdline_p = command_line;
        setup_hostinfo();
 }
index 4eaee823bfd2a4979a32295f2bba60c6f9e41ccb..039e16efcd5571a7a520f051cf5efa1c61c61b54 100644 (file)
@@ -16,8 +16,10 @@ static int __init set_umid_arg(char *name, int *add)
 {
        int err;
 
-       if(umid_inited)
+       if(umid_inited){
+               printf("umid already set\n");
                return 0;
+       }
 
        *add = 0;
        err = set_umid(name);
index f897140cc4ae2ec6e76bb3610a510017f4679a7c..6ff12743a0bdbe3e396e78b19ac667b52265c74b 100644 (file)
@@ -24,9 +24,6 @@ struct aio_thread_req {
        struct aio_context *aio;
 };
 
-static int aio_req_fd_r = -1;
-static int aio_req_fd_w = -1;
-
 #if defined(HAVE_AIO_ABI)
 #include <linux/aio_abi.h>
 
@@ -111,6 +108,7 @@ static int do_aio(aio_context_t ctx, enum aio_type type, int fd, char *buf,
        return err;
 }
 
+/* Initialized in an initcall and unchanged thereafter */
 static aio_context_t ctx = 0;
 
 static int aio_thread(void *arg)
@@ -137,7 +135,7 @@ static int aio_thread(void *arg)
                        err = os_write_file(reply_fd, &reply, sizeof(reply));
                        if(err != sizeof(reply))
                                printk("aio_thread - write failed, fd = %d, "
-                                      "err = %d\n", aio_req_fd_r, -err);
+                                      "err = %d\n", reply_fd, -err);
                }
        }
        return 0;
@@ -182,6 +180,11 @@ out:
        return err;
 }
 
+/* These are initialized in initcalls and not changed */
+static int aio_req_fd_r = -1;
+static int aio_req_fd_w = -1;
+static int aio_pid = -1;
+
 static int not_aio_thread(void *arg)
 {
        struct aio_thread_req req;
@@ -208,14 +211,12 @@ static int not_aio_thread(void *arg)
                err = os_write_file(req.aio->reply_fd, &reply, sizeof(reply));
                if(err != sizeof(reply))
                        printk("not_aio_thread - write failed, fd = %d, "
-                              "err = %d\n", aio_req_fd_r, -err);
+                              "err = %d\n", req.aio->reply_fd, -err);
        }
 
        return 0;
 }
 
-static int aio_pid = -1;
-
 static int init_aio_24(void)
 {
        unsigned long stack;
@@ -308,6 +309,7 @@ static int submit_aio_26(enum aio_type type, int io_fd, char *buf, int len,
 }
 #endif
 
+/* Initialized in an initcall and unchanged thereafter */
 static int aio_24 = DEFAULT_24_AIO;
 
 static int __init set_aio_24(char *name, int *add)
index 5a99dd3fbed0477bb7443eba1324e70f0dc4bcf4..3a8d7e3aae0a9e2cdc70d1bc547a8b636b614d29 100644 (file)
@@ -21,12 +21,11 @@ typedef Elf32_auxv_t elf_auxv_t;
 typedef Elf64_auxv_t elf_auxv_t;
 #endif
 
+/* These are initialized very early in boot and never changed */
 char * elf_aux_platform;
 long elf_aux_hwcap;
-
 unsigned long vsyscall_ehdr;
 unsigned long vsyscall_end;
-
 unsigned long __kernel_vsyscall;
 
 __init void scan_elf_aux( char **envp)
index 189fa677085a7880d9d8c7bdbcd4593de04a3ea1..371b4335f46dd2985fa852ef4a97abccc03080e5 100644 (file)
@@ -162,25 +162,6 @@ int os_set_owner(int fd, int pid)
        return 0;
 }
 
-/* FIXME? moved wholesale from sigio_user.c to get fcntls out of that file */
-int os_sigio_async(int master, int slave)
-{
-       int flags;
-
-       flags = fcntl(master, F_GETFL);
-       if(flags < 0)
-               return -errno;
-
-       if((fcntl(master, F_SETFL, flags | O_NONBLOCK | O_ASYNC) < 0) ||
-          (fcntl(master, F_SETOWN, os_getpid()) < 0))
-               return -errno;
-
-       if((fcntl(slave, F_SETFL, flags | O_NONBLOCK) < 0))
-               return -errno;
-
-       return(0);
-}
-
 int os_mode_fd(int fd, int mode)
 {
        int err;
index d46b818c1311258934679b82fdd0685afeaecbca..d1b61d474e0a0a535423f74b097b851bf0b05677 100644 (file)
 #include "os.h"
 #include "um_malloc.h"
 
+/*
+ * Locked by irq_lock in arch/um/kernel/irq.c.  Changed by os_create_pollfd
+ * and os_free_irq_by_cb, which are called under irq_lock.
+ */
 static struct pollfd *pollfds = NULL;
 static int pollfds_num = 0;
 static int pollfds_size = 0;
@@ -58,7 +62,7 @@ int os_create_pollfd(int fd, int events, void *tmp_pfd, int size_tmpfds)
        if (pollfds_num == pollfds_size) {
                if (size_tmpfds <= pollfds_size * sizeof(pollfds[0])) {
                        /* return min size needed for new pollfds area */
-                       return((pollfds_size + 1) * sizeof(pollfds[0]));
+                       return (pollfds_size + 1) * sizeof(pollfds[0]);
                }
 
                if (pollfds != NULL) {
index 4203681e508d0a680635347c53a2168fdd3a68be..f1ea169db85e174cf2d6998043bce9d655eef0cd 100644 (file)
 
 #include <sys/param.h>
 
+/* Modified by which_tmpdir, which is called during early boot */
 static char *default_tmpdir = "/tmp";
+
+/*
+ *  Modified when creating the physical memory file and when checking
+ * the tmp filesystem for usability, both happening during early boot.
+ */
 static char *tempdir = NULL;
 
 static void __init find_tempdir(void)
@@ -29,7 +35,8 @@ static void __init find_tempdir(void)
        int i;
        char *dir = NULL;
 
-       if(tempdir != NULL) return;     /* We've already been called */
+       if(tempdir != NULL) /* We've already been called */
+               return;
        for(i = 0; dirs[i]; i++){
                dir = getenv(dirs[i]);
                if((dir != NULL) && (*dir != '\0'))
@@ -83,6 +90,7 @@ static int next(int fd, char *buf, int size, char c)
        return 1;
 }
 
+/* which_tmpdir is called only during early boot */
 static int checked_tmpdir = 0;
 
 /* Look for a tmpfs mounted at /dev/shm.  I couldn't find a cleaner
@@ -186,7 +194,7 @@ int make_tempfile(const char *template, char **out_tempname, int do_unlink)
        } else {
                free(tempname);
        }
-       return(fd);
+       return fd;
 out:
        free(tempname);
        return -1;
@@ -231,7 +239,7 @@ int create_tmp_file(unsigned long long len)
                exit(1);
        }
 
-       return(fd);
+       return fd;
 }
 
 int create_mem_file(unsigned long long len)
@@ -245,7 +253,7 @@ int create_mem_file(unsigned long long len)
                errno = -err;
                perror("exec_close");
        }
-       return(fd);
+       return fd;
 }
 
 
index 925a65240cfec96c0f6c424e6009bf24a2012f90..b2e1fd8e35712504c1b8190acd2175f923ce7e5e 100644 (file)
@@ -97,20 +97,22 @@ static int write_sigio_thread(void *unused)
 
 static int need_poll(struct pollfds *polls, int n)
 {
-       if(n <= polls->size){
-               polls->used = n;
+       struct pollfd *new;
+
+       if(n <= polls->size)
                return 0;
-       }
-       kfree(polls->poll);
-       polls->poll = um_kmalloc_atomic(n * sizeof(struct pollfd));
-       if(polls->poll == NULL){
+
+       new = um_kmalloc_atomic(n * sizeof(struct pollfd));
+       if(new == NULL){
                printk("need_poll : failed to allocate new pollfds\n");
-               polls->size = 0;
-               polls->used = 0;
                return -ENOMEM;
        }
+
+       memcpy(new, polls->poll, polls->used * sizeof(struct pollfd));
+       kfree(polls->poll);
+
+       polls->poll = new;
        polls->size = n;
-       polls->used = n;
        return 0;
 }
 
@@ -171,15 +173,15 @@ int add_sigio_fd(int fd)
                        goto out;
        }
 
-       n = current_poll.used + 1;
-       err = need_poll(&next_poll, n);
+       n = current_poll.used;
+       err = need_poll(&next_poll, n + 1);
        if(err)
                goto out;
 
-       for(i = 0; i < current_poll.used; i++)
-               next_poll.poll[i] = current_poll.poll[i];
-
-       next_poll.poll[n - 1] = *p;
+       memcpy(next_poll.poll, current_poll.poll,
+              current_poll.used * sizeof(struct pollfd));
+       next_poll.poll[n] = *p;
+       next_poll.used = n + 1;
        update_thread();
  out:
        sigio_unlock();
@@ -214,6 +216,7 @@ int ignore_sigio_fd(int fd)
                if(p->fd != fd)
                        next_poll.poll[n++] = *p;
        }
+       next_poll.used = current_poll.used - 1;
 
        update_thread();
  out:
@@ -331,10 +334,9 @@ void maybe_sigio_broken(int fd, int read)
 
        sigio_lock();
        err = need_poll(&all_sigio_fds, all_sigio_fds.used + 1);
-       if(err){
-               printk("maybe_sigio_broken - failed to add pollfd\n");
+       if(err)
                goto out;
-       }
+
        all_sigio_fds.poll[all_sigio_fds.used++] =
                ((struct pollfd) { .fd          = fd,
                                   .events      = read ? POLLIN : POLLOUT,
index 7fe92680c7dd8de39fef42309818df27546ff17a..5178eba9afa54fa779ab3af327e82259768d7fbf 100644 (file)
@@ -54,7 +54,7 @@ static int ptrace_child(void *arg)
                perror("ptrace");
                os_kill_process(pid, 0);
        }
-       os_stop_process(pid);
+       kill(pid, SIGSTOP);
 
        /*This syscall will be intercepted by the parent. Don't call more than
         * once, please.*/
@@ -73,6 +73,34 @@ static int ptrace_child(void *arg)
        _exit(ret);
 }
 
+static void fatal_perror(char *str)
+{
+       perror(str);
+       exit(1);
+}
+
+static void fatal(char *fmt, ...)
+{
+       va_list list;
+
+       va_start(list, fmt);
+       vprintf(fmt, list);
+       va_end(list);
+       fflush(stdout);
+
+       exit(1);
+}
+
+static void non_fatal(char *fmt, ...)
+{
+       va_list list;
+
+       va_start(list, fmt);
+       vprintf(fmt, list);
+       va_end(list);
+       fflush(stdout);
+}
+
 static int start_ptraced_child(void **stack_out)
 {
        void *stack;
@@ -82,20 +110,20 @@ static int start_ptraced_child(void **stack_out)
        stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC,
                     MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
        if(stack == MAP_FAILED)
-               panic("check_ptrace : mmap failed, errno = %d", errno);
+               fatal_perror("check_ptrace : mmap failed");
        sp = (unsigned long) stack + PAGE_SIZE - sizeof(void *);
        pid = clone(ptrace_child, (void *) sp, SIGCHLD, NULL);
        if(pid < 0)
-               panic("start_ptraced_child : clone failed, errno = %d", errno);
+               fatal_perror("start_ptraced_child : clone failed");
        CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED));
        if(n < 0)
-               panic("check_ptrace : clone failed, errno = %d", errno);
+               fatal_perror("check_ptrace : clone failed");
        if(!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGSTOP))
-               panic("check_ptrace : expected SIGSTOP, got status = %d",
+               fatal("check_ptrace : expected SIGSTOP, got status = %d",
                      status);
 
        *stack_out = stack;
-       return(pid);
+       return pid;
 }
 
 /* When testing for SYSEMU support, if it is one of the broken versions, we
@@ -105,34 +133,34 @@ static int start_ptraced_child(void **stack_out)
  * must work anyway!
  */
 static int stop_ptraced_child(int pid, void *stack, int exitcode,
-                             int mustpanic)
+                             int mustexit)
 {
        int status, n, ret = 0;
 
        if(ptrace(PTRACE_CONT, pid, 0, 0) < 0)
-               panic("check_ptrace : ptrace failed, errno = %d", errno);
+               fatal_perror("stop_ptraced_child : ptrace failed");
        CATCH_EINTR(n = waitpid(pid, &status, 0));
        if(!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) {
                int exit_with = WEXITSTATUS(status);
                if (exit_with == 2)
-                       printf("check_ptrace : child exited with status 2. "
-                              "Serious trouble happening! Try updating your "
-                              "host skas patch!\nDisabling SYSEMU support.");
-               printf("check_ptrace : child exited with exitcode %d, while "
-                     "expecting %d; status 0x%x", exit_with,
-                     exitcode, status);
-               if (mustpanic)
-                       panic("\n");
-               else
-                       printf("\n");
+                       non_fatal("check_ptrace : child exited with status 2. "
+                                 "Serious trouble happening! Try updating "
+                                 "your host skas patch!\nDisabling SYSEMU "
+                                 "support.");
+               non_fatal("check_ptrace : child exited with exitcode %d, while "
+                         "expecting %d; status 0x%x\n", exit_with,
+                         exitcode, status);
+               if (mustexit)
+                       exit(1);
                ret = -1;
        }
 
        if(munmap(stack, PAGE_SIZE) < 0)
-               panic("check_ptrace : munmap failed, errno = %d", errno);
+               fatal_perror("check_ptrace : munmap failed");
        return ret;
 }
 
+/* Changed only during early boot */
 int ptrace_faultinfo = 1;
 int ptrace_ldt = 1;
 int proc_mm = 1;
@@ -160,6 +188,7 @@ __uml_setup("mode=skas0", mode_skas0_cmd_param,
                "    specify mode=tt. Note that this was recently added - on \n"
                "    older kernels you must use simply \"skas0\".\n\n");
 
+/* Changed only during early boot */
 static int force_sysemu_disabled = 0;
 
 static int __init nosysemu_cmd_param(char *str, int* add)
@@ -180,9 +209,9 @@ __uml_setup("nosysemu", nosysemu_cmd_param,
 static void __init check_sysemu(void)
 {
        void *stack;
-       int pid, n, status, count=0;
+       int pid, n, status, count=0;
 
-       printf("Checking syscall emulation patch for ptrace...");
+       non_fatal("Checking syscall emulation patch for ptrace...");
        sysemu_supported = 0;
        pid = start_ptraced_child(&stack);
 
@@ -191,31 +220,30 @@ static void __init check_sysemu(void)
 
        CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED));
        if (n < 0)
-               panic("check_sysemu : wait failed, errno = %d", errno);
+               fatal_perror("check_sysemu : wait failed");
        if(!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGTRAP))
-               panic("check_sysemu : expected SIGTRAP, "
-                     "got status = %d", status);
+               fatal("check_sysemu : expected SIGTRAP, got status = %d",
+                     status);
 
        n = ptrace(PTRACE_POKEUSR, pid, PT_SYSCALL_RET_OFFSET,
                   os_getpid());
        if(n < 0)
-               panic("check_sysemu : failed to modify system "
-                     "call return, errno = %d", errno);
+               fatal_perror("check_sysemu : failed to modify system call "
+                            "return");
 
        if (stop_ptraced_child(pid, stack, 0, 0) < 0)
                goto fail_stopped;
 
        sysemu_supported = 1;
-       printf("OK\n");
+       non_fatal("OK\n");
        set_using_sysemu(!force_sysemu_disabled);
 
-       printf("Checking advanced syscall emulation patch for ptrace...");
+       non_fatal("Checking advanced syscall emulation patch for ptrace...");
        pid = start_ptraced_child(&stack);
 
-       if(ptrace(PTRACE_OLDSETOPTIONS, pid, 0,
-                 (void *) PTRACE_O_TRACESYSGOOD) < 0)
-               panic("check_ptrace: PTRACE_OLDSETOPTIONS failed, errno = %d",
-                     errno);
+       if((ptrace(PTRACE_OLDSETOPTIONS, pid, 0,
+                  (void *) PTRACE_O_TRACESYSGOOD) < 0))
+               fatal_perror("check_ptrace: PTRACE_OLDSETOPTIONS failed");
 
        while(1){
                count++;
@@ -223,29 +251,30 @@ static void __init check_sysemu(void)
                        goto fail;
                CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED));
                if(n < 0)
-                       panic("check_ptrace : wait failed, errno = %d", errno);
+                       fatal_perror("check_ptrace : wait failed");
+
                if(WIFSTOPPED(status) && (WSTOPSIG(status) == (SIGTRAP|0x80))){
                        if (!count)
-                               panic("check_ptrace : SYSEMU_SINGLESTEP "
+                               fatal("check_ptrace : SYSEMU_SINGLESTEP "
                                      "doesn't singlestep");
                        n = ptrace(PTRACE_POKEUSR, pid, PT_SYSCALL_RET_OFFSET,
                                   os_getpid());
                        if(n < 0)
-                               panic("check_sysemu : failed to modify system "
-                                     "call return, errno = %d", errno);
+                               fatal_perror("check_sysemu : failed to modify "
+                                            "system call return");
                        break;
                }
                else if(WIFSTOPPED(status) && (WSTOPSIG(status) == SIGTRAP))
                        count++;
                else
-                       panic("check_ptrace : expected SIGTRAP or "
-                             "(SIGTRAP|0x80), got status = %d", status);
+                       fatal("check_ptrace : expected SIGTRAP or "
+                             "(SIGTRAP | 0x80), got status = %d", status);
        }
        if (stop_ptraced_child(pid, stack, 0, 0) < 0)
                goto fail_stopped;
 
        sysemu_supported = 2;
-       printf("OK\n");
+       non_fatal("OK\n");
 
        if ( !force_sysemu_disabled )
                set_using_sysemu(sysemu_supported);
@@ -254,7 +283,7 @@ static void __init check_sysemu(void)
 fail:
        stop_ptraced_child(pid, stack, 1, 0);
 fail_stopped:
-       printf("missing\n");
+       non_fatal("missing\n");
 }
 
 static void __init check_ptrace(void)
@@ -262,22 +291,25 @@ static void __init check_ptrace(void)
        void *stack;
        int pid, syscall, n, status;
 
-       printf("Checking that ptrace can change system call numbers...");
+       non_fatal("Checking that ptrace can change system call numbers...");
        pid = start_ptraced_child(&stack);
 
-       if(ptrace(PTRACE_OLDSETOPTIONS, pid, 0, (void *)PTRACE_O_TRACESYSGOOD) < 0)
-               panic("check_ptrace: PTRACE_OLDSETOPTIONS failed, errno = %d", errno);
+       if((ptrace(PTRACE_OLDSETOPTIONS, pid, 0,
+                  (void *) PTRACE_O_TRACESYSGOOD) < 0))
+               fatal_perror("check_ptrace: PTRACE_OLDSETOPTIONS failed");
 
        while(1){
                if(ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0)
-                       panic("check_ptrace : ptrace failed, errno = %d",
-                             errno);
+                       fatal_perror("check_ptrace : ptrace failed");
+
                CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED));
                if(n < 0)
-                       panic("check_ptrace : wait failed, errno = %d", errno);
-               if(!WIFSTOPPED(status) || (WSTOPSIG(status) != (SIGTRAP|0x80)))
-                       panic("check_ptrace : expected (SIGTRAP|0x80), "
-                             "got status = %d", status);
+                       fatal_perror("check_ptrace : wait failed");
+
+               if(!WIFSTOPPED(status) ||
+                  (WSTOPSIG(status) != (SIGTRAP | 0x80)))
+                       fatal("check_ptrace : expected (SIGTRAP|0x80), "
+                              "got status = %d", status);
 
                syscall = ptrace(PTRACE_PEEKUSR, pid, PT_SYSCALL_NR_OFFSET,
                                 0);
@@ -285,13 +317,13 @@ static void __init check_ptrace(void)
                        n = ptrace(PTRACE_POKEUSR, pid, PT_SYSCALL_NR_OFFSET,
                                   __NR_getppid);
                        if(n < 0)
-                               panic("check_ptrace : failed to modify system "
-                                     "call, errno = %d", errno);
+                               fatal_perror("check_ptrace : failed to modify "
+                                            "system call");
                        break;
                }
        }
        stop_ptraced_child(pid, stack, 0, 1);
-       printf("OK\n");
+       non_fatal("OK\n");
        check_sysemu();
 }
 
@@ -350,22 +382,22 @@ static inline void check_skas3_ptrace_faultinfo(void)
        void *stack;
        int pid, n;
 
-       printf("  - PTRACE_FAULTINFO...");
+       non_fatal("  - PTRACE_FAULTINFO...");
        pid = start_ptraced_child(&stack);
 
        n = ptrace(PTRACE_FAULTINFO, pid, 0, &fi);
        if (n < 0) {
                ptrace_faultinfo = 0;
                if(errno == EIO)
-                       printf("not found\n");
+                       non_fatal("not found\n");
                else
                        perror("not found");
        }
        else {
                if (!ptrace_faultinfo)
-                       printf("found but disabled on command line\n");
+                       non_fatal("found but disabled on command line\n");
                else
-                       printf("found\n");
+                       non_fatal("found\n");
        }
 
        init_registers(pid);
@@ -383,13 +415,13 @@ static inline void check_skas3_ptrace_ldt(void)
                .ptr = ldtbuf,
                .bytecount = sizeof(ldtbuf)};
 
-       printf("  - PTRACE_LDT...");
+       non_fatal("  - PTRACE_LDT...");
        pid = start_ptraced_child(&stack);
 
        n = ptrace(PTRACE_LDT, pid, 0, (unsigned long) &ldt_op);
        if (n < 0) {
                if(errno == EIO)
-                       printf("not found\n");
+                       non_fatal("not found\n");
                else {
                        perror("not found");
                }
@@ -397,9 +429,9 @@ static inline void check_skas3_ptrace_ldt(void)
        }
        else {
                if(ptrace_ldt)
-                       printf("found\n");
+                       non_fatal("found\n");
                else
-                       printf("found, but use is disabled\n");
+                       non_fatal("found, but use is disabled\n");
        }
 
        stop_ptraced_child(pid, stack, 1, 1);
@@ -414,22 +446,22 @@ static inline void check_skas3_ptrace_ldt(void)
 
 static inline void check_skas3_proc_mm(void)
 {
-       printf("  - /proc/mm...");
-       if (os_access("/proc/mm", OS_ACC_W_OK) < 0) {
-               proc_mm = 0;
-               printf("not found\n");
+       non_fatal("  - /proc/mm...");
+       if (access("/proc/mm", W_OK) < 0) {
+               proc_mm = 0;
+               perror("not found");
        }
        else {
                if (!proc_mm)
-                       printf("found but disabled on command line\n");
+                       non_fatal("found but disabled on command line\n");
                else
-                       printf("found\n");
+                       non_fatal("found\n");
        }
 }
 
 int can_do_skas(void)
 {
-       printf("Checking for the skas3 patch in the host:\n");
+       non_fatal("Checking for the skas3 patch in the host:\n");
 
        check_skas3_proc_mm();
        check_skas3_ptrace_faultinfo();
@@ -443,16 +475,16 @@ int can_do_skas(void)
 #else
 int can_do_skas(void)
 {
-       return(0);
+       return 0;
 }
 #endif
 
 int __init parse_iomem(char *str, int *add)
 {
        struct iomem_region *new;
-       struct uml_stat buf;
+       struct stat64 buf;
        char *file, *driver;
-       int fd, err, size;
+       int fd, size;
 
        driver = str;
        file = strchr(str,',');
@@ -462,15 +494,14 @@ int __init parse_iomem(char *str, int *add)
        }
        *file = '\0';
        file++;
-       fd = os_open_file(file, of_rdwr(OPENFLAGS()), 0);
+       fd = open(file, O_RDWR, 0);
        if(fd < 0){
                os_print_error(fd, "parse_iomem - Couldn't open io file");
                goto out;
        }
 
-       err = os_stat_fd(fd, &buf);
-       if(err < 0){
-               os_print_error(err, "parse_iomem - cannot stat_fd file");
+       if(fstat64(fd, &buf) < 0){
+               perror("parse_iomem - cannot stat_fd file");
                goto out_close;
        }
 
@@ -480,7 +511,7 @@ int __init parse_iomem(char *str, int *add)
                goto out_close;
        }
 
-       size = (buf.ust_size + UM_KERN_PAGE_SIZE) & ~(UM_KERN_PAGE_SIZE - 1);
+       size = (buf.st_size + UM_KERN_PAGE_SIZE) & ~(UM_KERN_PAGE_SIZE - 1);
 
        *new = ((struct iomem_region) { .next           = iomem_regions,
                                        .driver         = driver,
@@ -491,11 +522,11 @@ int __init parse_iomem(char *str, int *add)
        iomem_regions = new;
        iomem_size += new->size + UM_KERN_PAGE_SIZE;
 
-       return(0);
+       return 0;
  out_close:
-       os_close_file(fd);
+       close(fd);
  out:
-       return(1);
+       return 1;
 }
 
 
@@ -526,6 +557,24 @@ static void openpty_cb(void *arg)
                info->err = -errno;
 }
 
+static int async_pty(int master, int slave)
+{
+       int flags;
+
+       flags = fcntl(master, F_GETFL);
+       if(flags < 0)
+               return -errno;
+
+       if((fcntl(master, F_SETFL, flags | O_NONBLOCK | O_ASYNC) < 0) ||
+          (fcntl(master, F_SETOWN, os_getpid()) < 0))
+               return -errno;
+
+       if((fcntl(slave, F_SETFL, flags | O_NONBLOCK) < 0))
+               return -errno;
+
+       return(0);
+}
+
 static void __init check_one_sigio(void (*proc)(int, int))
 {
        struct sigaction old, new;
@@ -551,7 +600,7 @@ static void __init check_one_sigio(void (*proc)(int, int))
        if (err < 0)
                panic("check_sigio : __raw failed, errno = %d\n", -err);
 
-       err = os_sigio_async(master, slave);
+       err = async_pty(master, slave);
        if(err < 0)
                panic("tty_fds : sigio_async failed, err = %d\n", -err);
 
index 7cd0369e02b3b82970727bec506038ecb3cfd00c..79cd93c8c5ed62d08ebe0d1d99461e4f98105f1c 100644 (file)
@@ -34,27 +34,27 @@ void init_thread_registers(union uml_pt_regs *to)
 int save_fp_registers(int pid, unsigned long *fp_regs)
 {
        if(ptrace(PTRACE_GETFPREGS, pid, 0, fp_regs) < 0)
-               return(-errno);
-       return(0);
+               return -errno;
+       return 0;
 }
 
 int restore_fp_registers(int pid, unsigned long *fp_regs)
 {
        if(ptrace(PTRACE_SETFPREGS, pid, 0, fp_regs) < 0)
-               return(-errno);
-       return(0);
+               return -errno;
+       return 0;
 }
 
 static int move_registers(int pid, int int_op, union uml_pt_regs *regs,
                          int fp_op, unsigned long *fp_regs)
 {
        if(ptrace(int_op, pid, 0, regs->skas.regs) < 0)
-               return(-errno);
+               return -errno;
 
        if(ptrace(fp_op, pid, 0, fp_regs) < 0)
-               return(-errno);
+               return -errno;
 
-       return(0);
+       return 0;
 }
 
 void save_registers(int pid, union uml_pt_regs *regs)
index f67842a7735b80b09b6a7f1fbb13a1f98861a630..7955e061a678aaf3d7f29143b3a6ed65257ad391 100644 (file)
@@ -3,7 +3,7 @@
 # Licensed under the GPL
 #
 
-obj-$(CONFIG_MODE_SKAS) = registers.o signal.o
+obj-$(CONFIG_MODE_SKAS) = registers.o prctl.o signal.o
 
 USER_OBJS := $(obj-y)
 
diff --git a/arch/um/os-Linux/sys-x86_64/prctl.c b/arch/um/os-Linux/sys-x86_64/prctl.c
new file mode 100644 (file)
index 0000000..9d34edd
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ * Copyright (C) 2007 Jeff Dike (jdike@{addtoit.com,linux.intel.com})
+ * Licensed under the GPL
+ */
+
+#include <sys/ptrace.h>
+#include <linux/ptrace.h>
+
+int os_arch_prctl(int pid, int code, unsigned long *addr)
+{
+        return ptrace(PTRACE_ARCH_PRCTL, pid, (unsigned long) addr, code);
+}
index cb8e8a2632803c75d1c90db8b0b73cbbc86b6d07..a2d7e0c603f798efe99beb39da79b35f3ca9199e 100644 (file)
@@ -27,12 +27,12 @@ static int move_registers(int pid, int int_op, int fp_op,
                          union uml_pt_regs *regs)
 {
        if(ptrace(int_op, pid, 0, regs->skas.regs) < 0)
-               return(-errno);
+               return -errno;
 
        if(ptrace(fp_op, pid, 0, regs->skas.fp) < 0)
-               return(-errno);
+               return -errno;
 
-       return(0);
+       return 0;
 }
 
 void save_registers(int pid, union uml_pt_regs *regs)
index 48092b95c8ab997b4914a072afcd17f0e1aa7eda..b462863f7172fda8b98b5ac41f0d6367faf9e9ec 100644 (file)
@@ -18,7 +18,7 @@
 #define UMID_LEN 64
 
 /* Changed by set_umid, which is run early in boot */
-char umid[UMID_LEN] = { 0 };
+static char umid[UMID_LEN] = { 0 };
 
 /* Changed by set_uml_dir and make_uml_dir, which are run early in boot */
 static char *uml_dir = UML_DIR;
@@ -235,6 +235,7 @@ int __init set_umid(char *name)
        return 0;
 }
 
+/* Changed in make_umid, which is called during early boot */
 static int umid_setup = 0;
 
 int __init make_umid(void)
index 147bbf05cbc2fbc2d71e395f038ac97ce0387902..55b66e09a98cce2437969f49fdc477e08bb92311 100644 (file)
@@ -71,8 +71,6 @@ int poke_user(struct task_struct *child, long addr, long data)
 
         if (addr < MAX_REG_OFFSET)
                 return putreg(child, addr, data);
-
-#if 0 /* Need x86_64 debugregs handling */
         else if((addr >= offsetof(struct user, u_debugreg[0])) &&
                 (addr <= offsetof(struct user, u_debugreg[7]))){
                 addr -= offsetof(struct user, u_debugreg[0]);
@@ -81,7 +79,6 @@ int poke_user(struct task_struct *child, long addr, long data)
                 child->thread.arch.debugregs[addr] = data;
                 return 0;
         }
-#endif
         return -EIO;
 }
 
@@ -119,14 +116,12 @@ int peek_user(struct task_struct *child, long addr, long data)
         if(addr < MAX_REG_OFFSET){
                 tmp = getreg(child, addr);
         }
-#if 0 /* Need x86_64 debugregs handling */
         else if((addr >= offsetof(struct user, u_debugreg[0])) &&
                 (addr <= offsetof(struct user, u_debugreg[7]))){
                 addr -= offsetof(struct user, u_debugreg[0]);
                 addr = addr >> 2;
                 tmp = child->thread.arch.debugregs[addr];
         }
-#endif
         return put_user(tmp, (unsigned long *) data);
 }
 
index 73ce4463f70c6f96b2cd94f000b69df5a0da95ff..01b91f9fa7893647454f2a843f22a729197d78cb 100644 (file)
@@ -16,6 +16,7 @@
 #include "asm/prctl.h" /* XXX This should get the constants from libc */
 #include "choose-mode.h"
 #include "kern.h"
+#include "os.h"
 
 asmlinkage long sys_uname64(struct new_utsname __user * name)
 {
@@ -58,40 +59,69 @@ static long arch_prctl_tt(int code, unsigned long addr)
 
 #ifdef CONFIG_MODE_SKAS
 
-/* XXX: Must also call arch_prctl in the host, beside saving the segment bases! */
-static long arch_prctl_skas(int code, unsigned long addr)
+long arch_prctl_skas(struct task_struct *task, int code,
+                     unsigned long __user *addr)
 {
-       long ret = 0;
+        unsigned long *ptr = addr, tmp;
+       long ret;
+       int pid = task->mm->context.skas.id.u.pid;
 
+       /*
+        * With ARCH_SET_FS (and ARCH_SET_GS is treated similarly to
+        * be safe), we need to call arch_prctl on the host because
+        * setting %fs may result in something else happening (like a
+        * GDT or thread.fs being set instead).  So, we let the host
+        * fiddle the registers and thread struct and restore the
+        * registers afterwards.
+        *
+        * So, the saved registers are stored to the process (this
+        * needed because a stub may have been the last thing to run),
+        * arch_prctl is run on the host, then the registers are read
+        * back.
+        */
        switch(code){
        case ARCH_SET_FS:
-               current->thread.regs.regs.skas.regs[FS_BASE / sizeof(unsigned long)] = addr;
-               break;
        case ARCH_SET_GS:
-               current->thread.regs.regs.skas.regs[GS_BASE / sizeof(unsigned long)] = addr;
+                restore_registers(pid, &current->thread.regs.regs);
+                break;
+        case ARCH_GET_FS:
+        case ARCH_GET_GS:
+                /*
+                 * With these two, we read to a local pointer and
+                 * put_user it to the userspace pointer that we were
+                 * given.  If addr isn't valid (because it hasn't been
+                 * faulted in or is just bogus), we want put_user to
+                 * fault it in (or return -EFAULT) instead of having
+                 * the host return -EFAULT.
+                 */
+                ptr = &tmp;
+        }
+
+        ret = os_arch_prctl(pid, code, ptr);
+        if(ret)
+                return ret;
+
+        switch(code){
+       case ARCH_SET_FS:
+       case ARCH_SET_GS:
+                save_registers(pid, &current->thread.regs.regs);
                break;
        case ARCH_GET_FS:
-               ret = put_user(current->thread.regs.regs.skas.
-                               regs[FS_BASE / sizeof(unsigned long)],
-                               (unsigned long __user *)addr);
+               ret = put_user(tmp, addr);
                break;
        case ARCH_GET_GS:
-               ret = put_user(current->thread.regs.regs.skas.
-                               regs[GS_BASE / sizeof(unsigned long)],
-                               (unsigned long __user *)addr);
+               ret = put_user(tmp, addr);
                break;
-       default:
-               ret = -EINVAL;
-               break;
        }
 
-       return(ret);
+       return ret;
 }
 #endif
 
 long sys_arch_prctl(int code, unsigned long addr)
 {
-       return(CHOOSE_MODE_PROC(arch_prctl_tt, arch_prctl_skas, code, addr));
+       return CHOOSE_MODE_PROC(arch_prctl_tt, arch_prctl_skas, current, code,
+                                (unsigned long __user *) addr);
 }
 
 long sys_clone(unsigned long clone_flags, unsigned long newsp,
@@ -105,5 +135,14 @@ long sys_clone(unsigned long clone_flags, unsigned long newsp,
        ret = do_fork(clone_flags, newsp, &current->thread.regs, 0, parent_tid,
                      child_tid);
        current->thread.forking = 0;
-       return(ret);
+       return ret;
+}
+
+void arch_switch_to_skas(struct task_struct *from, struct task_struct *to)
+{
+        if(to->thread.arch.fs == 0)
+                return;
+
+        arch_prctl_skas(to, ARCH_SET_FS, (void __user *) to->thread.arch.fs);
 }
+
index ce1bf1b81c431dcb859db4f25410a2758c226f19..febbc94be25fd423c890ac8f11d1859ca919217a 100644 (file)
@@ -1,14 +1,17 @@
 #include "linux/sched.h"
 
-void debug_arch_force_load_TLS(void)
-{
-}
-
 void clear_flushed_tls(struct task_struct *task)
 {
 }
 
 int arch_copy_tls(struct task_struct *t)
 {
+       /*
+        * If CLONE_SETTLS is set, we need to save the thread id
+        * (which is argument 5, child_tid, of clone) so it can be set
+        * during context switches.
+        */
+       t->thread.arch.fs = t->thread.regs.regs.skas.regs[R8 / sizeof(long)];
+
         return 0;
 }
index f0d4d72e560fe8e1b68700e6c87929da3239bae6..dbfab8fc9b49c2c4c6e620558401f57af2bedf50 100644 (file)
@@ -10,6 +10,9 @@ mainmenu "uClinux/v850 (w/o MMU) Kernel Configuration"
 config MMU
                bool
        default n
+config ZONE_DMA
+       bool
+       default y
 config RWSEM_GENERIC_SPINLOCK
        bool
        default y
index 40892d3e3c247ea2dbada930d4f65b5675f05993..0e429041a117606aa39674aa3d367ac684910a92 100644 (file)
@@ -114,7 +114,7 @@ static struct v850e_intc_irq_init irq_inits[] = {
        { "ST",  IRQ_INTST(0),  IRQ_INTST_NUM,  3, 5 },
        { 0 }
 };
-#define NUM_IRQ_INITS ((sizeof irq_inits / sizeof irq_inits[0]) - 1)
+#define NUM_IRQ_INITS (ARRAY_SIZE(irq_inits) - 1)
 
 static struct hw_interrupt_type hw_itypes[NUM_IRQ_INITS];
 
index 5352f8a5aa070191f9d0d027a0ac7bc420b10cb9..18437bc5c3ad29aa53eb221d0a1595aa7445aac2 100644 (file)
@@ -142,7 +142,7 @@ static struct v850e_intc_irq_init irq_inits[] = {
        { "ST",  IRQ_INTST(0),  IRQ_INTST_NUM,  3, 5 },
        { 0 }
 };
-#define NUM_IRQ_INITS ((sizeof irq_inits / sizeof irq_inits[0]) - 1)
+#define NUM_IRQ_INITS (ARRAY_SIZE(irq_inits) - 1)
 
 static struct hw_interrupt_type hw_itypes[NUM_IRQ_INITS];
 
index cb04a6954ccbc5d99b639d119bc36a50fa6f96ca..5c4923558a75c8f7b5620ccb7a5fb3f20df60f3a 100644 (file)
@@ -138,7 +138,7 @@ struct v850e_intc_irq_init irq_inits[] = {
        { "RPU", IRQ_RPU(0),    IRQ_RPU_NUM,    1, 6 },
        { 0 }
 };
-#define NUM_IRQ_INITS ((sizeof irq_inits / sizeof irq_inits[0]) - 1)
+#define NUM_IRQ_INITS (ARRAY_SIZE(irq_inits) - 1)
 
 struct hw_interrupt_type hw_itypes[NUM_IRQ_INITS];
 
index 25d636e79e6acfe59be1fc933632ad894e880a21..b2bcc251f65b8b1ec3c6c9a0d63845c25d99af69 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/irq.h>
 #include <linux/interrupt.h>
 #include <linux/signal.h>
+#include <linux/kernel.h>
 
 #include <asm/machdep.h>
 
@@ -36,7 +37,7 @@ struct used_gint {
        { 1, GBUS_INT_PRIORITY_HIGH },
        { 3, GBUS_INT_PRIORITY_LOW }
 };
-#define NUM_USED_GINTS (sizeof used_gint / sizeof used_gint[0])
+#define NUM_USED_GINTS ARRAY_SIZE(used_gint)
 
 /* A table of which GINT is used by each GBUS interrupts (they are
    assigned based on priority).  */
@@ -231,8 +232,7 @@ struct gbus_int_irq_init gbus_irq_inits[] __initdata = {
        { "GBUS_INT", IRQ_GBUS_INT(0), IRQ_GBUS_INT_NUM, 1, 6},
        { 0 }
 };
-#define NUM_GBUS_IRQ_INITS  \
-   ((sizeof gbus_irq_inits / sizeof gbus_irq_inits[0]) - 1)
+#define NUM_GBUS_IRQ_INITS (ARRAY_SIZE(gbus_irq_inits) - 1)
 
 static struct hw_interrupt_type gbus_hw_itypes[NUM_GBUS_IRQ_INITS];
 
index 2aa8ab0f7edcb4f1198ae67205b9f815fdb6beaa..143774de75e1a590ca83a82018f10706bfa09be5 100644 (file)
@@ -43,7 +43,7 @@ static struct v850e_intc_irq_init irq_inits[] = {
        { "ST",  IRQ_INTST(0),  IRQ_INTST_NUM,  4, 5 },
        { 0 }
 };
-#define NUM_IRQ_INITS ((sizeof irq_inits / sizeof irq_inits[0]) - 1)
+#define NUM_IRQ_INITS (ARRAY_SIZE(irq_inits) - 1)
 
 static struct hw_interrupt_type hw_itypes[NUM_IRQ_INITS];
 
index 14b0c8858aa46a8445dc44ee8f566316b0b04fbb..38be5c194f6b9a5ca782a2b71f07e66f60e0e7e3 100644 (file)
@@ -44,7 +44,7 @@ static struct v850e_intc_irq_init irq_inits[] = {
        { "UBTITO", IRQ_INTUBTITO(0), IRQ_INTUBTITO_NUM, 5, 4 },
        { 0 }
 };
-#define NUM_IRQ_INITS ((sizeof irq_inits / sizeof irq_inits[0]) - 1)
+#define NUM_IRQ_INITS (ARRAY_SIZE(irq_inits) - 1)
 
 static struct hw_interrupt_type hw_itypes[NUM_IRQ_INITS];
 
index 0f7f6cd705a2d1eae01fa817054e462a577ef917..43018e1edebd13b6bf84558ef32628c13056c0af 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/irq.h>
 #include <linux/fs.h>
 #include <linux/module.h>
+#include <linux/kernel.h>
 
 #include <asm/machdep.h>
 #include <asm/v850e_uart.h>
@@ -176,8 +177,7 @@ static struct gbus_int_irq_init gbus_irq_inits[] = {
 #endif
        { 0 }
 };
-#define NUM_GBUS_IRQ_INITS  \
-   ((sizeof gbus_irq_inits / sizeof gbus_irq_inits[0]) - 1)
+#define NUM_GBUS_IRQ_INITS (ARRAY_SIZE(gbus_irq_inits) - 1)
 
 static struct hw_interrupt_type gbus_hw_itypes[NUM_GBUS_IRQ_INITS];
 
index 996bd4f33ecb11a84de31911cb44fa531d53a429..aa47ab1dcd87a866cf8ecb54000aef614bf8e70d 100644 (file)
@@ -117,7 +117,7 @@ static loff_t leds_dev_lseek (struct file *file, loff_t offs, int whence)
        return 0;
 }
 
-static struct file_operations leds_fops = {
+static const struct file_operations leds_fops = {
        .read           = leds_dev_read,
        .write          = leds_dev_write,
        .llseek         = leds_dev_lseek
index 35213fa9f7d829544c36e1223a6805df9cc4f004..35a4bd5515cb53c8903d612fc43ebda0a4cb5535 100644 (file)
@@ -70,8 +70,7 @@ static struct mb_pci_dev_irq mb_pci_dev_irqs[] = {
        /* PCI slot 2 */
        { 9,    IRQ_MB_A_PCI2(0),       1 }
 };
-#define NUM_MB_PCI_DEV_IRQS \
-  (sizeof mb_pci_dev_irqs / sizeof mb_pci_dev_irqs[0])
+#define NUM_MB_PCI_DEV_IRQS ARRAY_SIZE(mb_pci_dev_irqs)
 
 \f
 /* PCI configuration primitives.  */
index 3be355a029e27766c21f823661b435a524d06277..46803d48dffe2e5a14aec1c12813e8b6598f2465 100644 (file)
@@ -170,8 +170,7 @@ static struct cb_pic_irq_init cb_pic_irq_inits[] = {
        { "CB_EXTTM2",       IRQ_CB_EXTTM2,       1, 1, 6 },
        { 0 }
 };
-#define NUM_CB_PIC_IRQ_INITS  \
-   ((sizeof cb_pic_irq_inits / sizeof cb_pic_irq_inits[0]) - 1)
+#define NUM_CB_PIC_IRQ_INITS (ARRAY_SIZE(cb_pic_irq_inits) - 1)
 
 static struct hw_interrupt_type cb_pic_hw_itypes[NUM_CB_PIC_IRQ_INITS];
 static unsigned char cb_pic_active_irqs = 0;
index 1bf672a25692a9b3575d527092a1b255430e391f..a914f244f494a77c0d7654e4e8473c7e1e06ea24 100644 (file)
@@ -42,7 +42,7 @@ extern char _root_fs_image_start __attribute__ ((__weak__));
 extern char _root_fs_image_end __attribute__ ((__weak__));
 
 
-char command_line[COMMAND_LINE_SIZE];
+char __initdata command_line[COMMAND_LINE_SIZE];
 
 /* Memory not used by the kernel.  */
 static unsigned long total_ram_pages;
@@ -64,8 +64,8 @@ void __init setup_arch (char **cmdline)
 {
        /* Keep a copy of command line */
        *cmdline = command_line;
-       memcpy (saved_command_line, command_line, COMMAND_LINE_SIZE);
-       saved_command_line[COMMAND_LINE_SIZE - 1] = '\0';
+       memcpy (boot_command_line, command_line, COMMAND_LINE_SIZE);
+       boot_command_line[COMMAND_LINE_SIZE - 1] = '\0';
 
        console_verbose ();
 
index 290d506650166633a691aecd1c953cfeff75cd16..699248f92aae104d2a9091384a1798b5bfd73a42 100644 (file)
@@ -43,7 +43,7 @@ static struct v850e_intc_irq_init irq_inits[] = {
        { "ST",  IRQ_INTST(0),  IRQ_INTST_NUM,  1, 5 },
        { 0 }
 };
-#define NUM_IRQ_INITS ((sizeof irq_inits / sizeof irq_inits[0]) - 1)
+#define NUM_IRQ_INITS (ARRAY_SIZE(irq_inits) - 1)
 
 static struct hw_interrupt_type hw_itypes[NUM_IRQ_INITS];
 
index cd06f47c0ea7404bfd29f15f31e222ca9c2f5260..486e3a441c868d2ae97efd01fdab9d0e74de0b2e 100644 (file)
 
 #define TICK_SIZE      (tick_nsec / 1000)
 
-/*
- * Scheduler clock - returns current time in nanosec units.
- */
-unsigned long long sched_clock(void)
-{
-       return (unsigned long long)jiffies * (1000000000 / HZ);
-}
-
 /*
  * timer_interrupt() needs to keep up the real-time clock,
  * as well as call the "do_timer()" routine every clocktick
index 3a5fd07fe064cef52b7e0a7a0ec42bfb04192168..3563082212510b09eb92d922c2eedb28ea6d26ab 100644 (file)
                __root_fs_image_start = . ;                                   \
                *(.root)                                                      \
                __root_fs_image_end = . ;
+
+#ifdef CONFIG_BLK_DEV_INITRD
 /* The initramfs archive.  */
 #define INITRAMFS_CONTENTS                                                   \
                . = ALIGN (4) ;                                               \
                ___initramfs_start = . ;                                      \
                        *(.init.ramfs)                                        \
                ___initramfs_end = . ;
+#endif
+
 /* Where the initial bootmap (bitmap for the boot-time memory allocator) 
    should be place.  */
 #define BOOTMAP_CONTENTS                                                     \
index d4275537b25b6e8bc814f19215278da2633420f3..56eb14c9847524ef7072da08969b84b086438f2e 100644 (file)
@@ -24,6 +24,14 @@ config X86
        bool
        default y
 
+config GENERIC_TIME
+       bool
+       default y
+
+config GENERIC_TIME_VSYSCALL
+       bool
+       default y
+
 config ZONE_DMA32
        bool
        default y
@@ -44,6 +52,10 @@ config MMU
        bool
        default y
 
+config ZONE_DMA
+       bool
+       default y
+
 config ISA
        bool
 
@@ -148,18 +160,18 @@ config MPSC
          Optimize for Intel Pentium 4 and older Nocona/Dempsey Xeon CPUs
          with Intel Extended Memory 64 Technology(EM64T). For details see
          <http://www.intel.com/technology/64bitextensions/>.
-         Note the the latest Xeons (Xeon 51xx and 53xx) are not based on the
-          Netburst core and shouldn't use this option. You can distingush them
+         Note that the latest Xeons (Xeon 51xx and 53xx) are not based on the
+          Netburst core and shouldn't use this option. You can distinguish them
          using the cpu family field
-         in /proc/cpuinfo. Family 15 is a older Xeon, Family 6 a newer one
-         (this rule only applies to system that support EM64T)
+         in /proc/cpuinfo. Family 15 is an older Xeon, Family 6 a newer one
+         (this rule only applies to systems that support EM64T)
 
 config MCORE2
        bool "Intel Core2 / newer Xeon"
        help
          Optimize for Intel Core2 and newer Xeons (51xx)
-         You can distingush the newer Xeons from the older ones using
-         the cpu family field in /proc/cpuinfo. 15 is a older Xeon
+         You can distinguish the newer Xeons from the older ones using
+         the cpu family field in /proc/cpuinfo. 15 is an older Xeon
          (use CONFIG_MPSC then), 6 is a newer one. This rule only
          applies to CPUs that support EM64T.
 
@@ -454,8 +466,8 @@ config IOMMU
          on systems with more than 3GB. This is usually needed for USB,
          sound, many IDE/SATA chipsets and some other devices.
          Provides a driver for the AMD Athlon64/Opteron/Turion/Sempron GART
-         based IOMMU and a software bounce buffer based IOMMU used on Intel
-         systems and as fallback.
+         based hardware IOMMU and a software bounce buffer based IOMMU used
+         on Intel systems and as fallback.
          The code is only active when needed (enough memory and limited
          device) unless CONFIG_IOMMU_DEBUG or iommu=force is specified
          too.
@@ -492,6 +504,12 @@ config CALGARY_IOMMU_ENABLED_BY_DEFAULT
 # need this always selected by IOMMU for the VIA workaround
 config SWIOTLB
        bool
+       help
+         Support for software bounce buffers used on x86-64 systems
+         which don't have a hardware IOMMU (e.g. the current generation
+         of Intel's x86-64 CPUs). Using this PCI devices which can only
+         access 32-bits of memory can be used on systems with more than
+         3 GB of memory. If unsure, say Y.
 
 config X86_MCE
        bool "Machine check support" if EMBEDDED
index 69584c2953057fdda7b69b723920ecd8dbb38185..293a4a4c609e2c16649c685e6541d108be7fee31 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.20-rc3
-# Fri Jan  5 11:54:41 2007
+# Linux kernel version: 2.6.20-git8
+# Tue Feb 13 11:25:16 2007
 #
 CONFIG_X86_64=y
 CONFIG_64BIT=y
@@ -11,6 +11,7 @@ CONFIG_LOCKDEP_SUPPORT=y
 CONFIG_STACKTRACE_SUPPORT=y
 CONFIG_SEMAPHORE_SLEEPERS=y
 CONFIG_MMU=y
+CONFIG_ZONE_DMA=y
 CONFIG_RWSEM_GENERIC_SPINLOCK=y
 CONFIG_GENERIC_HWEIGHT=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
@@ -153,6 +154,7 @@ CONFIG_NEED_MULTIPLE_NODES=y
 CONFIG_SPLIT_PTLOCK_CPUS=4
 CONFIG_MIGRATION=y
 CONFIG_RESOURCES_64BIT=y
+CONFIG_ZONE_DMA_FLAG=1
 CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
 CONFIG_OUT_OF_LINE_PFN_TO_PAGE=y
 CONFIG_NR_CPUS=32
@@ -201,13 +203,14 @@ CONFIG_ACPI=y
 CONFIG_ACPI_SLEEP=y
 CONFIG_ACPI_SLEEP_PROC_FS=y
 CONFIG_ACPI_SLEEP_PROC_SLEEP=y
+CONFIG_ACPI_PROCFS=y
 CONFIG_ACPI_AC=y
 CONFIG_ACPI_BATTERY=y
 CONFIG_ACPI_BUTTON=y
-# CONFIG_ACPI_VIDEO is not set
 # CONFIG_ACPI_HOTKEY is not set
 CONFIG_ACPI_FAN=y
 # CONFIG_ACPI_DOCK is not set
+# CONFIG_ACPI_BAY is not set
 CONFIG_ACPI_PROCESSOR=y
 CONFIG_ACPI_HOTPLUG_CPU=y
 CONFIG_ACPI_THERMAL=y
@@ -263,7 +266,6 @@ CONFIG_PCI_MMCONFIG=y
 CONFIG_PCIEPORTBUS=y
 CONFIG_PCIEAER=y
 CONFIG_PCI_MSI=y
-# CONFIG_PCI_MULTITHREAD_PROBE is not set
 # CONFIG_PCI_DEBUG is not set
 # CONFIG_HT_IRQ is not set
 
@@ -398,6 +400,7 @@ CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
 CONFIG_FW_LOADER=y
 # CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
 # CONFIG_SYS_HYPERVISOR is not set
 
 #
@@ -466,6 +469,7 @@ 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_BLK_DEV_IDEACPI=y
 # CONFIG_IDE_TASK_IOCTL is not set
 
 #
@@ -497,6 +501,7 @@ CONFIG_BLK_DEV_ATIIXP=y
 # CONFIG_BLK_DEV_JMICRON is not set
 # CONFIG_BLK_DEV_SC1200 is not set
 CONFIG_BLK_DEV_PIIX=y
+# CONFIG_BLK_DEV_IT8213 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
@@ -507,6 +512,7 @@ CONFIG_BLK_DEV_PDC202XX_NEW=y
 # CONFIG_BLK_DEV_SLC90E66 is not set
 # CONFIG_BLK_DEV_TRM290 is not set
 # CONFIG_BLK_DEV_VIA82CXXX is not set
+# CONFIG_BLK_DEV_TC86C001 is not set
 # CONFIG_IDE_ARM is not set
 CONFIG_BLK_DEV_IDEDMA=y
 # CONFIG_IDEDMA_IVB is not set
@@ -599,6 +605,7 @@ CONFIG_MEGARAID_SAS=y
 # Serial ATA (prod) and Parallel ATA (experimental) drivers
 #
 CONFIG_ATA=y
+# CONFIG_ATA_NONSTANDARD is not set
 CONFIG_SATA_AHCI=y
 CONFIG_SATA_SVW=y
 CONFIG_ATA_PIIX=y
@@ -614,6 +621,7 @@ CONFIG_SATA_SIL=y
 # CONFIG_SATA_ULI is not set
 CONFIG_SATA_VIA=y
 # CONFIG_SATA_VITESSE is not set
+# CONFIG_SATA_INIC162X is not set
 CONFIG_SATA_INTEL_COMBINED=y
 # CONFIG_PATA_ALI is not set
 # CONFIG_PATA_AMD is not set
@@ -630,6 +638,7 @@ CONFIG_SATA_INTEL_COMBINED=y
 # CONFIG_PATA_HPT3X2N is not set
 # CONFIG_PATA_HPT3X3 is not set
 # CONFIG_PATA_IT821X is not set
+# CONFIG_PATA_IT8213 is not set
 # CONFIG_PATA_JMICRON is not set
 # CONFIG_PATA_TRIFLEX is not set
 # CONFIG_PATA_MARVELL is not set
@@ -682,9 +691,7 @@ CONFIG_IEEE1394=y
 # Subsystem Options
 #
 # CONFIG_IEEE1394_VERBOSEDEBUG is not set
-# CONFIG_IEEE1394_OUI_DB is not set
 # CONFIG_IEEE1394_EXTRA_CONFIG_ROMS is not set
-# CONFIG_IEEE1394_EXPORT_FULL_API is not set
 
 #
 # Device Drivers
@@ -706,6 +713,11 @@ CONFIG_IEEE1394_RAWIO=y
 #
 # CONFIG_I2O is not set
 
+#
+# Macintosh device drivers
+#
+# CONFIG_MAC_EMUMOUSEBTN is not set
+
 #
 # Network device support
 #
@@ -774,6 +786,7 @@ CONFIG_8139TOO=y
 # CONFIG_EPIC100 is not set
 # CONFIG_SUNDANCE is not set
 # CONFIG_VIA_RHINE is not set
+# CONFIG_SC92031 is not set
 
 #
 # Ethernet (1000 Mbit)
@@ -795,11 +808,13 @@ CONFIG_E1000=y
 CONFIG_TIGON3=y
 CONFIG_BNX2=y
 # CONFIG_QLA3XXX is not set
+# CONFIG_ATL1 is not set
 
 #
 # Ethernet (10000 Mbit)
 #
 # CONFIG_CHELSIO_T1 is not set
+# CONFIG_CHELSIO_T3 is not set
 # CONFIG_IXGB is not set
 CONFIG_S2IO=m
 # CONFIG_S2IO_NAPI is not set
@@ -1115,6 +1130,7 @@ CONFIG_SOUND=y
 # Open Sound System
 #
 CONFIG_SOUND_PRIME=y
+CONFIG_OBSOLETE_OSS=y
 # CONFIG_SOUND_BT878 is not set
 # CONFIG_SOUND_ES1371 is not set
 CONFIG_SOUND_ICH=y
@@ -1128,6 +1144,7 @@ CONFIG_SOUND_ICH=y
 # HID Devices
 #
 CONFIG_HID=y
+# CONFIG_HID_DEBUG is not set
 
 #
 # USB support
@@ -1142,10 +1159,8 @@ CONFIG_USB=y
 # Miscellaneous USB options
 #
 CONFIG_USB_DEVICEFS=y
-# CONFIG_USB_BANDWIDTH is not set
 # CONFIG_USB_DYNAMIC_MINORS is not set
 # CONFIG_USB_SUSPEND is not set
-# CONFIG_USB_MULTITHREAD_PROBE is not set
 # CONFIG_USB_OTG is not set
 
 #
@@ -1155,9 +1170,11 @@ CONFIG_USB_EHCI_HCD=y
 # CONFIG_USB_EHCI_SPLIT_ISO is not set
 # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
 # CONFIG_USB_EHCI_TT_NEWSCHED is not set
+# CONFIG_USB_EHCI_BIG_ENDIAN_MMIO 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_BIG_ENDIAN_DESC is not set
+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
 CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 CONFIG_USB_UHCI_HCD=y
 # CONFIG_USB_SL811_HCD is not set
@@ -1208,6 +1225,7 @@ CONFIG_USB_HID=y
 # CONFIG_USB_ATI_REMOTE2 is not set
 # CONFIG_USB_KEYSPAN_REMOTE is not set
 # CONFIG_USB_APPLETOUCH is not set
+# CONFIG_USB_GTCO is not set
 
 #
 # USB Imaging devices
@@ -1312,6 +1330,10 @@ CONFIG_USB_MON=y
 # DMA Devices
 #
 
+#
+# Auxiliary Display support
+#
+
 #
 # Virtualization
 #
@@ -1512,6 +1534,7 @@ CONFIG_UNUSED_SYMBOLS=y
 CONFIG_DEBUG_FS=y
 # CONFIG_HEADERS_CHECK is not set
 CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
 CONFIG_LOG_BUF_SHIFT=18
 CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_SCHEDSTATS is not set
@@ -1520,7 +1543,6 @@ CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_RT_MUTEX_TESTER is not set
 # CONFIG_DEBUG_SPINLOCK is not set
 # CONFIG_DEBUG_MUTEXES is not set
-# CONFIG_DEBUG_RWSEMS is not set
 # CONFIG_DEBUG_LOCK_ALLOC is not set
 # CONFIG_PROVE_LOCKING is not set
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
@@ -1560,4 +1582,5 @@ CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
 CONFIG_ZLIB_INFLATE=y
 CONFIG_PLIST=y
-CONFIG_IOMAP_COPY=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
index 5ce0bd486bbf35a90c31e4f9adb0cd918fb0f438..071100ea12512fe409361542ad7a7cf8ae5a62ad 100644 (file)
@@ -300,12 +300,10 @@ int ia32_setup_arg_pages(struct linux_binprm *bprm, unsigned long stack_top,
                bprm->loader += stack_base;
        bprm->exec += stack_base;
 
-       mpnt = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);
+       mpnt = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
        if (!mpnt) 
                return -ENOMEM; 
 
-       memset(mpnt, 0, sizeof(*mpnt));
-
        down_write(&mm->mmap_sem);
        {
                mpnt->vm_mm = mm;
@@ -346,20 +344,30 @@ EXPORT_SYMBOL(ia32_setup_arg_pages);
 #include <linux/sysctl.h>
 
 static ctl_table abi_table2[] = {
-       { 99, "vsyscall32", &sysctl_vsyscall32, sizeof(int), 0644, NULL,
-         proc_dointvec },
-       { 0, }
-}; 
+       {
+               .ctl_name       = 99,
+               .procname       = "vsyscall32",
+               .data           = &sysctl_vsyscall32,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec
+       },
+       {}
+};
 
-static ctl_table abi_root_table2[] = { 
-       { .ctl_name = CTL_ABI, .procname = "abi", .mode = 0555, 
-         .child = abi_table2 }, 
-       { 0 }, 
-}; 
+static ctl_table abi_root_table2[] = {
+       {
+               .ctl_name = CTL_ABI,
+               .procname = "abi",
+               .mode = 0555,
+               .child = abi_table2
+       },
+       {}
+};
 
 static __init int ia32_binfmt_init(void)
 { 
-       register_sysctl_table(abi_root_table2, 1);
+       register_sysctl_table(abi_root_table2);
        return 0;
 }
 __initcall(ia32_binfmt_init);
index ff499ef2a1ba10674cba34782c546cbeac43a51a..359eacc385094f76e4cc7d6eff8c288bda6ff4f6 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/stddef.h>
 #include <linux/personality.h>
 #include <linux/compat.h>
+#include <linux/binfmts.h>
 #include <asm/ucontext.h>
 #include <asm/uaccess.h>
 #include <asm/i387.h>
@@ -449,7 +450,11 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
 
        /* Return stub is in 32bit vsyscall page */
        { 
-               void __user *restorer = VSYSCALL32_SIGRETURN; 
+               void __user *restorer;
+               if (current->binfmt->hasvdso)
+                       restorer = VSYSCALL32_SIGRETURN;
+               else
+                       restorer = (void *)&frame->retcode;
                if (ka->sa.sa_flags & SA_RESTORER)
                        restorer = ka->sa.sa_restorer;       
                err |= __put_user(ptr_to_compat(restorer), &frame->pretcode);
@@ -495,7 +500,7 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
                ptrace_notify(SIGTRAP);
 
 #if DEBUG_SIG
-       printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
+       printk("SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
                current->comm, current->pid, frame, regs->rip, frame->pretcode);
 #endif
 
@@ -601,7 +606,7 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
                ptrace_notify(SIGTRAP);
 
 #if DEBUG_SIG
-       printk("SIG deliver (%s:%d): sp=%p pc=%p ra=%p\n",
+       printk("SIG deliver (%s:%d): sp=%p pc=%lx ra=%u\n",
                current->comm, current->pid, frame, regs->rip, frame->pretcode);
 #endif
 
index b4aa875e175becbaa59b27f6a1be2554b1f6aca1..eda7a0d4dc15c8050c65bcb3b2c1d81369115435 100644 (file)
@@ -515,7 +515,7 @@ ia32_sys_call_table:
        .quad sys32_vm86_warning        /* vm86old */ 
        .quad compat_sys_wait4
        .quad sys_swapoff               /* 115 */
-       .quad sys32_sysinfo
+       .quad compat_sys_sysinfo
        .quad sys32_ipc
        .quad sys_fsync
        .quad stub32_sigreturn
@@ -718,4 +718,5 @@ ia32_sys_call_table:
        .quad compat_sys_vmsplice
        .quad compat_sys_move_pages
        .quad sys_getcpu
+       .quad sys_epoll_pwait
 ia32_syscall_end:              
index c9bac3af29d6a746be28d38a241667e78593df3f..200fdde18d968e70ce5d7bf2832db7e683a4f448 100644 (file)
@@ -523,72 +523,6 @@ sys32_sysfs(int option, u32 arg1, u32 arg2)
        return sys_sysfs(option, arg1, arg2);
 }
 
-struct sysinfo32 {
-        s32 uptime;
-        u32 loads[3];
-        u32 totalram;
-        u32 freeram;
-        u32 sharedram;
-        u32 bufferram;
-        u32 totalswap;
-        u32 freeswap;
-        unsigned short procs;
-       unsigned short pad; 
-        u32 totalhigh;
-        u32 freehigh;
-        u32 mem_unit;
-        char _f[20-2*sizeof(u32)-sizeof(int)];
-};
-
-asmlinkage long
-sys32_sysinfo(struct sysinfo32 __user *info)
-{
-       struct sysinfo s;
-       int ret;
-       mm_segment_t old_fs = get_fs ();
-       int bitcount = 0;
-       
-       set_fs (KERNEL_DS);
-       ret = sys_sysinfo((struct sysinfo __user *)&s);
-       set_fs (old_fs);
-
-        /* Check to see if any memory value is too large for 32-bit and scale
-        *  down if needed
-        */
-       if ((s.totalram >> 32) || (s.totalswap >> 32)) {
-               while (s.mem_unit < PAGE_SIZE) {
-                       s.mem_unit <<= 1;
-                       bitcount++;
-               }
-               s.totalram >>= bitcount;
-               s.freeram >>= bitcount;
-               s.sharedram >>= bitcount;
-               s.bufferram >>= bitcount;
-               s.totalswap >>= bitcount;
-               s.freeswap >>= bitcount;
-               s.totalhigh >>= bitcount;
-               s.freehigh >>= bitcount;
-       }
-
-       if (!access_ok(VERIFY_WRITE, info, sizeof(struct sysinfo32)) ||
-           __put_user (s.uptime, &info->uptime) ||
-           __put_user (s.loads[0], &info->loads[0]) ||
-           __put_user (s.loads[1], &info->loads[1]) ||
-           __put_user (s.loads[2], &info->loads[2]) ||
-           __put_user (s.totalram, &info->totalram) ||
-           __put_user (s.freeram, &info->freeram) ||
-           __put_user (s.sharedram, &info->sharedram) ||
-           __put_user (s.bufferram, &info->bufferram) ||
-           __put_user (s.totalswap, &info->totalswap) ||
-           __put_user (s.freeswap, &info->freeswap) ||
-           __put_user (s.procs, &info->procs) ||
-           __put_user (s.totalhigh, &info->totalhigh) || 
-           __put_user (s.freehigh, &info->freehigh) ||
-           __put_user (s.mem_unit, &info->mem_unit))
-               return -EFAULT;
-       return 0;
-}
-                
 asmlinkage long
 sys32_sched_rr_get_interval(compat_pid_t pid, struct compat_timespec __user *interval)
 {
index 3c7cbff04d3d78a2d8f5a73ecf8dbc1438475152..bb47e86f3d0228ae59a09834e1815de37ed5a983 100644 (file)
@@ -8,7 +8,7 @@ obj-y   := process.o signal.o entry.o traps.o irq.o \
                ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_x86_64.o \
                x8664_ksyms.o i387.o syscall.o vsyscall.o \
                setup64.o bootflag.o e820.o reboot.o quirks.o i8237.o \
-               pci-dma.o pci-nommu.o alternative.o
+               pci-dma.o pci-nommu.o alternative.o hpet.o tsc.o
 
 obj-$(CONFIG_STACKTRACE)       += stacktrace.o
 obj-$(CONFIG_X86_MCE)          += mce.o therm_throt.o
@@ -19,7 +19,7 @@ obj-$(CONFIG_ACPI)            += acpi/
 obj-$(CONFIG_X86_MSR)          += msr.o
 obj-$(CONFIG_MICROCODE)                += microcode.o
 obj-$(CONFIG_X86_CPUID)                += cpuid.o
-obj-$(CONFIG_SMP)              += smp.o smpboot.o trampoline.o
+obj-$(CONFIG_SMP)              += smp.o smpboot.o trampoline.o tsc_sync.o
 obj-y                          += apic.o  nmi.o
 obj-y                          += io_apic.o mpparse.o \
                genapic.o genapic_cluster.o genapic_flat.o
@@ -43,6 +43,7 @@ obj-$(CONFIG_PCI)             += early-quirks.o
 
 obj-y                          += topology.o
 obj-y                          += intel_cacheinfo.o
+obj-y                          += pcspeaker.o
 
 CFLAGS_vsyscall.o              := $(PROFILING) -g0
 
@@ -56,3 +57,4 @@ quirks-y                      += ../../i386/kernel/quirks.o
 i8237-y                                += ../../i386/kernel/i8237.o
 msr-$(subst m,y,$(CONFIG_X86_MSR))  += ../../i386/kernel/msr.o
 alternative-y                  += ../../i386/kernel/alternative.o
+pcspeaker-y                    += ../../i386/kernel/pcspeaker.o
index 5ebf62c7a3d2ba936c2e22dfcd0b0ae02b9bdde5..23178ce6c78380bc29f85e146e375676cd4e5242 100644 (file)
@@ -58,7 +58,7 @@ unsigned long acpi_wakeup_address = 0;
 unsigned long acpi_video_flags;
 extern char wakeup_start, wakeup_end;
 
-extern unsigned long FASTCALL(acpi_copy_wakeup_routine(unsigned long));
+extern unsigned long acpi_copy_wakeup_routine(unsigned long);
 
 static pgd_t low_ptr;
 
index 124b2d27b4acd2e912d0d7db6f9dbe1a85bb5019..723417d924c09717c9c6659fbf5fe7361b0caafb 100644 (file)
@@ -37,6 +37,7 @@
 #include <asm/idle.h>
 #include <asm/proto.h>
 #include <asm/timex.h>
+#include <asm/hpet.h>
 #include <asm/apic.h>
 
 int apic_mapped;
@@ -763,7 +764,7 @@ static void setup_APIC_timer(unsigned int clocks)
        local_irq_save(flags);
 
        /* wait for irq slice */
-       if (vxtime.hpet_address && hpet_use_timer) {
+       if (hpet_address && hpet_use_timer) {
                int trigger = hpet_readl(HPET_T0_CMP);
                while (hpet_readl(HPET_COUNTER) >= trigger)
                        /* do nothing */ ;
@@ -785,7 +786,7 @@ static void setup_APIC_timer(unsigned int clocks)
        /* Turn off PIT interrupt if we use APIC timer as main timer.
           Only works with the PM timer right now
           TBD fix it for HPET too. */
-       if (vxtime.mode == VXTIME_PMTMR &&
+       if ((pmtmr_ioport != 0) &&
                smp_processor_id() == boot_cpu_id &&
                apic_runs_main_timer == 1 &&
                !cpu_isset(boot_cpu_id, timer_interrupt_broadcast_ipi_mask)) {
index 6fe191c5808465ddc7c8673c8996d52a67858d98..4651fd22b213bf047e7e9ffd9bf904ddeb4d1cd4 100644 (file)
@@ -83,6 +83,13 @@ static inline int bad_addr(unsigned long *addrp, unsigned long size)
                return 1;
        }
 
+#ifdef CONFIG_NUMA
+       /* NUMA memory to node map */
+       if (last >= nodemap_addr && addr < nodemap_addr + nodemap_size) {
+               *addrp = nodemap_addr + nodemap_size;
+               return 1;
+       }
+#endif
        /* XXX ramdisk image here? */ 
        return 0;
 } 
@@ -183,6 +190,37 @@ unsigned long __init e820_end_of_ram(void)
        return end_pfn; 
 }
 
+/*
+ * Find the hole size in the range.
+ */
+unsigned long __init e820_hole_size(unsigned long start, unsigned long end)
+{
+       unsigned long ram = 0;
+       int i;
+
+       for (i = 0; i < e820.nr_map; i++) {
+               struct e820entry *ei = &e820.map[i];
+               unsigned long last, addr;
+
+               if (ei->type != E820_RAM ||
+                   ei->addr+ei->size <= start ||
+                   ei->addr >= end)
+                       continue;
+
+               addr = round_up(ei->addr, PAGE_SIZE);
+               if (addr < start)
+                       addr = start;
+
+               last = round_down(ei->addr + ei->size, PAGE_SIZE);
+               if (last >= end)
+                       last = end;
+
+               if (last > addr)
+                       ram += last - addr;
+       }
+       return ((end - start) - ram);
+}
+
 /*
  * Mark e820 reserved areas as busy for the resource manager.
  */
index bd30d138113fa9e270a8e7974df36f185db11d50..8047ea8c2ab271e9e315547e3a77450d31edcab4 100644 (file)
@@ -53,7 +53,9 @@ static void nvidia_bugs(void)
                return;
 
        nvidia_hpet_detected = 0;
-       acpi_table_parse(ACPI_SIG_HPET, nvidia_hpet_check);
+       if (acpi_table_parse(ACPI_SIG_HPET, nvidia_hpet_check))
+               return;
+
        if (nvidia_hpet_detected == 0) {
                acpi_skip_timer_override = 1;
                printk(KERN_INFO "Nvidia board "
index 1e6f80870679506482ef7d2714621e8ad4df4d08..598a4d0351fc15190274f504995ec738f0b63cec 100644 (file)
@@ -163,6 +163,20 @@ startup_64:
         */
        lgdt    cpu_gdt_descr
 
+       /* set up data segments. actually 0 would do too */
+       movl $__KERNEL_DS,%eax
+       movl %eax,%ds
+       movl %eax,%ss
+       movl %eax,%es
+
+       /*
+        * We don't really need to load %fs or %gs, but load them anyway
+        * to kill any stale realmode selectors.  This allows execution
+        * under VT hardware.
+        */
+       movl %eax,%fs
+       movl %eax,%gs
+
        /* 
         * Setup up a dummy PDA. this is just for some early bootup code
         * that does in_interrupt() 
@@ -173,12 +187,6 @@ startup_64:
        shrq    $32,%rdx
        wrmsr   
 
-       /* set up data segments. actually 0 would do too */
-       movl $__KERNEL_DS,%eax
-       movl %eax,%ds   
-       movl %eax,%ss
-       movl %eax,%es
-                       
        /* esi is pointer to real mode structure with interesting info.
           pass it to C */
        movl    %esi, %edi
index cc230b93cd1c7081ea4483ac2aa8ec8192eb972a..5f197b0a330ab4d3393325afbdf30f6ec70cff3c 100644 (file)
@@ -34,8 +34,6 @@ static void __init clear_bss(void)
 #define OLD_CL_BASE_ADDR        0x90000
 #define OLD_CL_OFFSET           0x90022
 
-extern char saved_command_line[];
-
 static void __init copy_bootdata(char *real_mode_data)
 {
        int new_data;
@@ -50,7 +48,7 @@ static void __init copy_bootdata(char *real_mode_data)
                new_data = OLD_CL_BASE_ADDR + * (u16 *) OLD_CL_OFFSET;
        }
        command_line = (char *) ((u64)(new_data));
-       memcpy(saved_command_line, command_line, COMMAND_LINE_SIZE);
+       memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
 }
 
 void __init x86_64_start_kernel(char * real_mode_data)
similarity index 57%
rename from arch/i386/kernel/time_hpet.c
rename to arch/x86_64/kernel/hpet.c
index 1e4702dfcd017e7649961465eaeb734116d9178b..65a0edd71a17ebd296336ef6162ff8c14590a933 100644 (file)
-/*
- *  linux/arch/i386/kernel/time_hpet.c
- *  This code largely copied from arch/x86_64/kernel/time.c
- *  See that file for credits.
- *
- *  2003-06-30    Venkatesh Pallipadi - Additional changes for HPET support
- */
-
-#include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/param.h>
-#include <linux/string.h>
+#include <linux/sched.h>
 #include <linux/init.h>
-#include <linux/smp.h>
+#include <linux/mc146818rtc.h>
+#include <linux/time.h>
+#include <linux/clocksource.h>
+#include <linux/ioport.h>
+#include <linux/acpi.h>
+#include <linux/hpet.h>
+#include <asm/pgtable.h>
+#include <asm/vsyscall.h>
+#include <asm/timex.h>
+#include <asm/hpet.h>
 
-#include <asm/timer.h>
-#include <asm/fixmap.h>
-#include <asm/apic.h>
+int nohpet __initdata;
 
-#include <linux/timex.h>
+unsigned long hpet_address;
+unsigned long hpet_period;     /* fsecs / HPET clock */
+unsigned long hpet_tick;       /* HPET clocks / interrupt */
 
-#include <asm/hpet.h>
-#include <linux/hpet.h>
+int hpet_use_timer;            /* Use counter of hpet for time keeping,
+                                * otherwise PIT
+                                */
 
-static unsigned long hpet_period;      /* fsecs / HPET clock */
-unsigned long hpet_tick;               /* hpet clks count per tick */
-unsigned long hpet_address;            /* hpet memory map physical address */
-int hpet_use_timer;
+#ifdef CONFIG_HPET
+static __init int late_hpet_init(void)
+{
+       struct hpet_data        hd;
+       unsigned int            ntimer;
 
-static int use_hpet;           /* can be used for runtime check of hpet */
-static int boot_hpet_disable;  /* boottime override for HPET timer */
-static void __iomem * hpet_virt_address;       /* hpet kernel virtual address */
+       if (!hpet_address)
+               return 0;
 
-#define FSEC_TO_USEC (1000000000UL)
+       memset(&hd, 0, sizeof(hd));
 
-int hpet_readl(unsigned long a)
-{
-       return readl(hpet_virt_address + a);
-}
+       ntimer = hpet_readl(HPET_ID);
+       ntimer = (ntimer & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT;
+       ntimer++;
 
-static void hpet_writel(unsigned long d, unsigned long a)
-{
-       writel(d, hpet_virt_address + a);
-}
+       /*
+        * Register with driver.
+        * Timer0 and Timer1 is used by platform.
+        */
+       hd.hd_phys_address = hpet_address;
+       hd.hd_address = (void __iomem *)fix_to_virt(FIX_HPET_BASE);
+       hd.hd_nirqs = ntimer;
+       hd.hd_flags = HPET_DATA_PLATFORM;
+       hpet_reserve_timer(&hd, 0);
+#ifdef CONFIG_HPET_EMULATE_RTC
+       hpet_reserve_timer(&hd, 1);
+#endif
+       hd.hd_irq[0] = HPET_LEGACY_8254;
+       hd.hd_irq[1] = HPET_LEGACY_RTC;
+       if (ntimer > 2) {
+               struct hpet             *hpet;
+               struct hpet_timer       *timer;
+               int                     i;
+
+               hpet = (struct hpet *) fix_to_virt(FIX_HPET_BASE);
+               timer = &hpet->hpet_timers[2];
+               for (i = 2; i < ntimer; timer++, i++)
+                       hd.hd_irq[i] = (timer->hpet_config &
+                                       Tn_INT_ROUTE_CNF_MASK) >>
+                               Tn_INT_ROUTE_CNF_SHIFT;
 
-#ifdef CONFIG_X86_LOCAL_APIC
-/*
- * HPET counters dont wrap around on every tick. They just change the
- * comparator value and continue. Next tick can be caught by checking
- * for a change in the comparator value. Used in apic.c.
- */
-static void __devinit wait_hpet_tick(void)
-{
-       unsigned int start_cmp_val, end_cmp_val;
+       }
 
-       start_cmp_val = hpet_readl(HPET_T0_CMP);
-       do {
-               end_cmp_val = hpet_readl(HPET_T0_CMP);
-       } while (start_cmp_val == end_cmp_val);
+       hpet_alloc(&hd);
+       return 0;
 }
+fs_initcall(late_hpet_init);
 #endif
 
-static int hpet_timer_stop_set_go(unsigned long tick)
+int hpet_timer_stop_set_go(unsigned long tick)
 {
        unsigned int cfg;
 
-       /*
-        * Stop the timers and reset the main counter.
-        */
+/*
+ * Stop the timers and reset the main counter.
+ */
+
        cfg = hpet_readl(HPET_CFG);
-       cfg &= ~HPET_CFG_ENABLE;
+       cfg &= ~(HPET_CFG_ENABLE | HPET_CFG_LEGACY);
        hpet_writel(cfg, HPET_CFG);
        hpet_writel(0, HPET_COUNTER);
        hpet_writel(0, HPET_COUNTER + 4);
 
+/*
+ * Set up timer 0, as periodic with first interrupt to happen at hpet_tick,
+ * and period also hpet_tick.
+ */
        if (hpet_use_timer) {
-               /*
-                * Set up timer 0, as periodic with first interrupt to happen at
-                * hpet_tick, and period also hpet_tick.
-                */
-               cfg = hpet_readl(HPET_T0_CFG);
-               cfg |= HPET_TN_ENABLE | HPET_TN_PERIODIC |
-                      HPET_TN_SETVAL | HPET_TN_32BIT;
-               hpet_writel(cfg, HPET_T0_CFG);
-
-               /*
-                * The first write after writing TN_SETVAL to the config register sets
-                * the counter value, the second write sets the threshold.
-                */
-               hpet_writel(tick, HPET_T0_CMP);
-               hpet_writel(tick, HPET_T0_CMP);
-       }
-       /*
-        * Go!
-        */
-       cfg = hpet_readl(HPET_CFG);
-       if (hpet_use_timer)
+               hpet_writel(HPET_TN_ENABLE | HPET_TN_PERIODIC | HPET_TN_SETVAL |
+                   HPET_TN_32BIT, HPET_T0_CFG);
+               hpet_writel(hpet_tick, HPET_T0_CMP); /* next interrupt */
+               hpet_writel(hpet_tick, HPET_T0_CMP); /* period */
                cfg |= HPET_CFG_LEGACY;
+       }
+/*
+ * Go!
+ */
+
        cfg |= HPET_CFG_ENABLE;
        hpet_writel(cfg, HPET_CFG);
 
        return 0;
 }
 
-/*
- * Check whether HPET was found by ACPI boot parse. If yes setup HPET
- * counter 0 for kernel base timer.
- */
-int __init hpet_enable(void)
+int hpet_arch_init(void)
 {
        unsigned int id;
-       unsigned long tick_fsec_low, tick_fsec_high; /* tick in femto sec */
-       unsigned long hpet_tick_rem;
 
-       if (boot_hpet_disable)
+       if (!hpet_address)
                return -1;
+       set_fixmap_nocache(FIX_HPET_BASE, hpet_address);
+       __set_fixmap(VSYSCALL_HPET, hpet_address, PAGE_KERNEL_VSYSCALL_NOCACHE);
+
+/*
+ * Read the period, compute tick and quotient.
+ */
 
-       if (!hpet_address) {
-               return -1;
-       }
-       hpet_virt_address = ioremap_nocache(hpet_address, HPET_MMAP_SIZE);
-       /*
-        * Read the period, compute tick and quotient.
-        */
        id = hpet_readl(HPET_ID);
 
-       /*
-        * We are checking for value '1' or more in number field if
-        * CONFIG_HPET_EMULATE_RTC is set because we will need an
-        * additional timer for RTC emulation.
-        * However, we can do with one timer otherwise using the
-        * the single HPET timer for system time.
-        */
-#ifdef CONFIG_HPET_EMULATE_RTC
-       if (!(id & HPET_ID_NUMBER)) {
-               iounmap(hpet_virt_address);
-               hpet_virt_address = NULL;
+       if (!(id & HPET_ID_VENDOR) || !(id & HPET_ID_NUMBER))
                return -1;
-       }
-#endif
-
 
        hpet_period = hpet_readl(HPET_PERIOD);
-       if ((hpet_period < HPET_MIN_PERIOD) || (hpet_period > HPET_MAX_PERIOD)) {
-               iounmap(hpet_virt_address);
-               hpet_virt_address = NULL;
+       if (hpet_period < 100000 || hpet_period > 100000000)
                return -1;
-       }
 
-       /*
-        * 64 bit math
-        * First changing tick into fsec
-        * Then 64 bit div to find number of hpet clk per tick
-        */
-       ASM_MUL64_REG(tick_fsec_low, tick_fsec_high,
-                       KERNEL_TICK_USEC, FSEC_TO_USEC);
-       ASM_DIV64_REG(hpet_tick, hpet_tick_rem,
-                       hpet_period, tick_fsec_low, tick_fsec_high);
-
-       if (hpet_tick_rem > (hpet_period >> 1))
-               hpet_tick++; /* rounding the result */
-
-       hpet_use_timer = id & HPET_ID_LEGSUP;
-
-       if (hpet_timer_stop_set_go(hpet_tick)) {
-               iounmap(hpet_virt_address);
-               hpet_virt_address = NULL;
-               return -1;
-       }
+       hpet_tick = (FSEC_PER_TICK + hpet_period / 2) / hpet_period;
 
-       use_hpet = 1;
+       hpet_use_timer = (id & HPET_ID_LEGSUP);
 
-#ifdef CONFIG_HPET
-       {
-               struct hpet_data        hd;
-               unsigned int            ntimer;
-
-               memset(&hd, 0, sizeof (hd));
-
-               ntimer = hpet_readl(HPET_ID);
-               ntimer = (ntimer & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT;
-               ntimer++;
-
-               /*
-                * Register with driver.
-                * Timer0 and Timer1 is used by platform.
-                */
-               hd.hd_phys_address = hpet_address;
-               hd.hd_address = hpet_virt_address;
-               hd.hd_nirqs = ntimer;
-               hd.hd_flags = HPET_DATA_PLATFORM;
-               hpet_reserve_timer(&hd, 0);
-#ifdef CONFIG_HPET_EMULATE_RTC
-               hpet_reserve_timer(&hd, 1);
-#endif
-               hd.hd_irq[0] = HPET_LEGACY_8254;
-               hd.hd_irq[1] = HPET_LEGACY_RTC;
-               if (ntimer > 2) {
-                       struct hpet __iomem     *hpet;
-                       struct hpet_timer __iomem *timer;
-                       int                     i;
-
-                       hpet = hpet_virt_address;
-
-                       for (i = 2, timer = &hpet->hpet_timers[2]; i < ntimer;
-                               timer++, i++)
-                               hd.hd_irq[i] = (timer->hpet_config &
-                                       Tn_INT_ROUTE_CNF_MASK) >>
-                                       Tn_INT_ROUTE_CNF_SHIFT;
-
-               }
-
-               hpet_alloc(&hd);
-       }
-#endif
-
-#ifdef CONFIG_X86_LOCAL_APIC
-       if (hpet_use_timer)
-               wait_timer_tick = wait_hpet_tick;
-#endif
-       return 0;
+       return hpet_timer_stop_set_go(hpet_tick);
 }
 
 int hpet_reenable(void)
@@ -226,28 +140,51 @@ int hpet_reenable(void)
        return hpet_timer_stop_set_go(hpet_tick);
 }
 
-int is_hpet_enabled(void)
-{
-       return use_hpet;
-}
+/*
+ * calibrate_tsc() calibrates the processor TSC in a very simple way, comparing
+ * it to the HPET timer of known frequency.
+ */
 
-int is_hpet_capable(void)
+#define TICK_COUNT 100000000
+#define TICK_MIN   5000
+
+/*
+ * Some platforms take periodic SMI interrupts with 5ms duration. Make sure none
+ * occurs between the reads of the hpet & TSC.
+ */
+static void __init read_hpet_tsc(int *hpet, int *tsc)
 {
-       if (!boot_hpet_disable && hpet_address)
-               return 1;
-       return 0;
+       int tsc1, tsc2, hpet1;
+
+       do {
+               tsc1 = get_cycles_sync();
+               hpet1 = hpet_readl(HPET_COUNTER);
+               tsc2 = get_cycles_sync();
+       } while (tsc2 - tsc1 > TICK_MIN);
+       *hpet = hpet1;
+       *tsc = tsc2;
 }
 
-static int __init hpet_setup(char* str)
+unsigned int __init hpet_calibrate_tsc(void)
 {
-       if (str) {
-               if (!strncmp("disable", str, 7))
-                       boot_hpet_disable = 1;
-       }
-       return 1;
-}
+       int tsc_start, hpet_start;
+       int tsc_now, hpet_now;
+       unsigned long flags;
+
+       local_irq_save(flags);
+
+       read_hpet_tsc(&hpet_start, &tsc_start);
 
-__setup("hpet=", hpet_setup);
+       do {
+               local_irq_disable();
+               read_hpet_tsc(&hpet_now, &tsc_now);
+               local_irq_restore(flags);
+       } while ((tsc_now - tsc_start) < TICK_COUNT &&
+               (hpet_now - hpet_start) < TICK_COUNT);
+
+       return (tsc_now - tsc_start) * 1000000000L
+               / ((hpet_now - hpet_start) * hpet_period / 1000);
+}
 
 #ifdef CONFIG_HPET_EMULATE_RTC
 /* HPET in LegacyReplacement Mode eats up RTC interrupt line. When, HPET
@@ -264,7 +201,6 @@ __setup("hpet=", hpet_setup);
  * For (3), we use interrupts at 64Hz or user specified periodic
  * frequency, whichever is higher.
  */
-#include <linux/mc146818rtc.h>
 #include <linux/rtc.h>
 
 #define DEFAULT_RTC_INT_FREQ   64
@@ -283,6 +219,11 @@ static unsigned long PIE_count;
 static unsigned long hpet_rtc_int_freq; /* RTC interrupt frequency */
 static unsigned int hpet_t1_cmp; /* cached comparator register */
 
+int is_hpet_enabled(void)
+{
+       return hpet_address != 0;
+}
+
 /*
  * Timer 1 for RTC, we do not use periodic interrupt feature,
  * even if HPET supports periodic interrupts on Timer 1.
@@ -367,8 +308,9 @@ static void hpet_rtc_timer_reinit(void)
                if (PIE_on)
                        PIE_count += lost_ints;
 
-               printk(KERN_WARNING "rtc: lost some interrupts at %ldHz.\n",
-                      hpet_rtc_int_freq);
+               if (printk_ratelimit())
+                       printk(KERN_WARNING "rtc: lost some interrupts at %ldHz.\n",
+                              hpet_rtc_int_freq);
        }
 }
 
@@ -450,7 +392,7 @@ int hpet_rtc_dropped_irq(void)
        return 1;
 }
 
-irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id)
+irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
        struct rtc_time curr_time;
        unsigned long rtc_int_flag = 0;
@@ -495,3 +437,75 @@ irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id)
 }
 #endif
 
+static int __init nohpet_setup(char *s)
+{
+       nohpet = 1;
+       return 1;
+}
+
+__setup("nohpet", nohpet_setup);
+
+#define HPET_MASK      0xFFFFFFFF
+#define HPET_SHIFT     22
+
+/* FSEC = 10^-15 NSEC = 10^-9 */
+#define FSEC_PER_NSEC  1000000
+
+static void *hpet_ptr;
+
+static cycle_t read_hpet(void)
+{
+       return (cycle_t)readl(hpet_ptr);
+}
+
+static cycle_t __vsyscall_fn vread_hpet(void)
+{
+       return readl((void __iomem *)fix_to_virt(VSYSCALL_HPET) + 0xf0);
+}
+
+struct clocksource clocksource_hpet = {
+       .name           = "hpet",
+       .rating         = 250,
+       .read           = read_hpet,
+       .mask           = (cycle_t)HPET_MASK,
+       .mult           = 0, /* set below */
+       .shift          = HPET_SHIFT,
+       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
+       .vread          = vread_hpet,
+};
+
+static int __init init_hpet_clocksource(void)
+{
+       unsigned long hpet_period;
+       void __iomem *hpet_base;
+       u64 tmp;
+
+       if (!hpet_address)
+               return -ENODEV;
+
+       /* calculate the hpet address: */
+       hpet_base = ioremap_nocache(hpet_address, HPET_MMAP_SIZE);
+       hpet_ptr = hpet_base + HPET_COUNTER;
+
+       /* calculate the frequency: */
+       hpet_period = readl(hpet_base + HPET_PERIOD);
+
+       /*
+        * hpet period is in femto seconds per cycle
+        * so we need to convert this to ns/cyc units
+        * aproximated by mult/2^shift
+        *
+        *  fsec/cyc * 1nsec/1000000fsec = nsec/cyc = mult/2^shift
+        *  fsec/cyc * 1ns/1000000fsec * 2^shift = mult
+        *  fsec/cyc * 2^shift * 1nsec/1000000fsec = mult
+        *  (fsec/cyc << shift)/1000000 = mult
+        *  (hpet_period << shift)/FSEC_PER_NSEC = mult
+        */
+       tmp = (u64)hpet_period << HPET_SHIFT;
+       do_div(tmp, FSEC_PER_NSEC);
+       clocksource_hpet.mult = (u32)tmp;
+
+       return clocksource_register(&clocksource_hpet);
+}
+
+module_init(init_hpet_clocksource);
index d73c79e821f172ee3efe48f490e97b947bb8c153..01e2cf0bdeb10a60bbfb967d9dae2880b2f9827f 100644 (file)
@@ -103,6 +103,7 @@ static void mask_and_ack_8259A(unsigned int);
 static struct irq_chip i8259A_chip = {
        .name           = "XT-PIC",
        .mask           = disable_8259A_irq,
+       .disable        = disable_8259A_irq,
        .unmask         = enable_8259A_irq,
        .mask_ack       = mask_and_ack_8259A,
 };
index 6be6730acb5c9039ead2720c1a8219b011f3cde5..950682f3576697b3fa7bcc8b916be3b8a3547c8d 100644 (file)
@@ -810,11 +810,9 @@ static void ioapic_register_intr(int irq, int vector, unsigned long trigger)
                        trigger == IOAPIC_LEVEL)
                set_irq_chip_and_handler_name(irq, &ioapic_chip,
                                              handle_fasteoi_irq, "fasteoi");
-       else {
-               irq_desc[irq].status |= IRQ_DELAYED_DISABLE;
+       else
                set_irq_chip_and_handler_name(irq, &ioapic_chip,
                                              handle_edge_irq, "edge");
-       }
 }
 static void __init setup_IO_APIC_irq(int apic, int pin, int idx, int irq)
 {
@@ -831,7 +829,7 @@ static void __init setup_IO_APIC_irq(int apic, int pin, int idx, int irq)
        entry.delivery_mode = INT_DELIVERY_MODE;
        entry.dest_mode = INT_DEST_MODE;
        entry.mask = 0;                         /* enable IRQ */
-       entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
+       entry.dest = cpu_mask_to_apicid(TARGET_CPUS);
 
        entry.trigger = irq_trigger(idx);
        entry.polarity = irq_polarity(idx);
@@ -839,7 +837,7 @@ static void __init setup_IO_APIC_irq(int apic, int pin, int idx, int irq)
        if (irq_trigger(idx)) {
                entry.trigger = 1;
                entry.mask = 1;
-               entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
+               entry.dest = cpu_mask_to_apicid(TARGET_CPUS);
        }
 
        if (!apic && !IO_APIC_IRQ(irq))
@@ -851,7 +849,7 @@ static void __init setup_IO_APIC_irq(int apic, int pin, int idx, int irq)
                if (vector < 0)
                        return;
 
-               entry.dest.logical.logical_dest = cpu_mask_to_apicid(mask);
+               entry.dest = cpu_mask_to_apicid(mask);
                entry.vector = vector;
 
                ioapic_register_intr(irq, vector, IOAPIC_AUTO);
@@ -920,7 +918,7 @@ static void __init setup_ExtINT_IRQ0_pin(unsigned int apic, unsigned int pin, in
         */
        entry.dest_mode = INT_DEST_MODE;
        entry.mask = 0;                                 /* unmask IRQ now */
-       entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
+       entry.dest = cpu_mask_to_apicid(TARGET_CPUS);
        entry.delivery_mode = INT_DELIVERY_MODE;
        entry.polarity = 0;
        entry.trigger = 0;
@@ -1020,18 +1018,17 @@ void __apicdebuginit print_IO_APIC(void)
 
        printk(KERN_DEBUG ".... IRQ redirection table:\n");
 
-       printk(KERN_DEBUG " NR Log Phy Mask Trig IRR Pol"
-                         " Stat Dest Deli Vect:   \n");
+       printk(KERN_DEBUG " NR Dst Mask Trig IRR Pol"
+                         " Stat Dmod Deli Vect:   \n");
 
        for (i = 0; i <= reg_01.bits.entries; i++) {
                struct IO_APIC_route_entry entry;
 
                entry = ioapic_read_entry(apic, i);
 
-               printk(KERN_DEBUG " %02x %03X %02X  ",
+               printk(KERN_DEBUG " %02x %03X ",
                        i,
-                       entry.dest.logical.logical_dest,
-                       entry.dest.physical.physical_dest
+                       entry.dest
                );
 
                printk("%1d    %1d    %1d   %1d   %1d    %1d    %1d    %02X\n",
@@ -1293,8 +1290,7 @@ void disable_IO_APIC(void)
                entry.dest_mode       = 0; /* Physical */
                entry.delivery_mode   = dest_ExtINT; /* ExtInt */
                entry.vector          = 0;
-               entry.dest.physical.physical_dest =
-                                       GET_APIC_ID(apic_read(APIC_ID));
+               entry.dest          = GET_APIC_ID(apic_read(APIC_ID));
 
                /*
                 * Add it to the IO-APIC irq-routing table:
@@ -1556,7 +1552,7 @@ static inline void unlock_ExtINT_logic(void)
 
        entry1.dest_mode = 0;                   /* physical delivery */
        entry1.mask = 0;                        /* unmask IRQ now */
-       entry1.dest.physical.physical_dest = hard_smp_processor_id();
+       entry1.dest = hard_smp_processor_id();
        entry1.delivery_mode = dest_ExtINT;
        entry1.polarity = entry0.polarity;
        entry1.trigger = 0;
@@ -2131,7 +2127,7 @@ int io_apic_set_pci_routing (int ioapic, int pin, int irq, int triggering, int p
 
        entry.delivery_mode = INT_DELIVERY_MODE;
        entry.dest_mode = INT_DEST_MODE;
-       entry.dest.logical.logical_dest = cpu_mask_to_apicid(mask);
+       entry.dest = cpu_mask_to_apicid(mask);
        entry.trigger = triggering;
        entry.polarity = polarity;
        entry.mask = 1;                                  /* Disabled (masked) */
index fe063d3cfe42b7ff8c09184cd6986492cce01eeb..745b1f0f494ecdaa2dffce605549c127a52df567 100644 (file)
@@ -114,6 +114,6 @@ asmlinkage long sys_iopl(unsigned int level, struct pt_regs *regs)
                if (!capable(CAP_SYS_RAWIO))
                        return -EPERM;
        }
-       regs->eflags = (regs->eflags &~ 0x3000UL) | (level << 12);
+       regs->eflags = (regs->eflags &~ X86_EFLAGS_IOPL) | (level << 12);
        return 0;
 }
index 0c06af6c13bcb6c4d4e8331da76279442ce378a3..3bc30d2c13d3289809cd538f07cef4fc8033c0dc 100644 (file)
@@ -18,6 +18,7 @@
 #include <asm/uaccess.h>
 #include <asm/io_apic.h>
 #include <asm/idle.h>
+#include <asm/smp.h>
 
 atomic_t irq_err_count;
 
@@ -120,9 +121,14 @@ asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
 
        if (likely(irq < NR_IRQS))
                generic_handle_irq(irq);
-       else if (printk_ratelimit())
-               printk(KERN_EMERG "%s: %d.%d No irq handler for vector\n",
-                       __func__, smp_processor_id(), vector);
+       else {
+               if (!disable_apic)
+                       ack_APIC_irq();
+
+               if (printk_ratelimit())
+                       printk(KERN_EMERG "%s: %d.%d No irq handler for vector\n",
+                               __func__, smp_processor_id(), vector);
+       }
 
        irq_exit();
 
index ac085038af2924aab65b5eb82c77fdc26d5430d6..8011a8e1c7d41d8a5baf2876c87697b37eec39ca 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/cpu.h>
 #include <linux/percpu.h>
 #include <linux/ctype.h>
+#include <linux/kmod.h>
 #include <asm/processor.h> 
 #include <asm/msr.h>
 #include <asm/mce.h>
@@ -42,6 +43,10 @@ static unsigned long console_logged;
 static int notify_user;
 static int rip_msr;
 static int mce_bootlog = 1;
+static atomic_t mce_events;
+
+static char trigger[128];
+static char *trigger_argv[2] = { trigger, NULL };
 
 /*
  * Lockless MCE logging infrastructure.
@@ -57,6 +62,7 @@ struct mce_log mcelog = {
 void mce_log(struct mce *mce)
 {
        unsigned next, entry;
+       atomic_inc(&mce_events);
        mce->finished = 0;
        wmb();
        for (;;) {
@@ -161,6 +167,17 @@ static inline void mce_get_rip(struct mce *m, struct pt_regs *regs)
        }
 }
 
+static void do_mce_trigger(void)
+{
+       static atomic_t mce_logged;
+       int events = atomic_read(&mce_events);
+       if (events != atomic_read(&mce_logged) && trigger[0]) {
+               /* Small race window, but should be harmless.  */
+               atomic_set(&mce_logged, events);
+               call_usermodehelper(trigger, trigger_argv, NULL, -1);
+       }
+}
+
 /* 
  * The actual machine check handler
  */
@@ -234,8 +251,12 @@ void do_machine_check(struct pt_regs * regs, long error_code)
        }
 
        /* Never do anything final in the polling timer */
-       if (!regs)
+       if (!regs) {
+               /* Normal interrupt context here. Call trigger for any new
+                  events. */
+               do_mce_trigger();
                goto out;
+       }
 
        /* If we didn't find an uncorrectable error, pick
           the last one (shouldn't happen, just being safe). */
@@ -516,7 +537,7 @@ static int mce_ioctl(struct inode *i, struct file *f,unsigned int cmd, unsigned
        } 
 }
 
-static struct file_operations mce_chrdev_ops = {
+static const struct file_operations mce_chrdev_ops = {
        .read = mce_read,
        .ioctl = mce_ioctl,
 };
@@ -606,17 +627,42 @@ DEFINE_PER_CPU(struct sys_device, device_mce);
        }                                                                          \
        static SYSDEV_ATTR(name, 0644, show_ ## name, set_ ## name);
 
+/* TBD should generate these dynamically based on number of available banks */
 ACCESSOR(bank0ctl,bank[0],mce_restart())
 ACCESSOR(bank1ctl,bank[1],mce_restart())
 ACCESSOR(bank2ctl,bank[2],mce_restart())
 ACCESSOR(bank3ctl,bank[3],mce_restart())
 ACCESSOR(bank4ctl,bank[4],mce_restart())
 ACCESSOR(bank5ctl,bank[5],mce_restart())
-static struct sysdev_attribute * bank_attributes[NR_BANKS] = {
-       &attr_bank0ctl, &attr_bank1ctl, &attr_bank2ctl,
-       &attr_bank3ctl, &attr_bank4ctl, &attr_bank5ctl};
+
+static ssize_t show_trigger(struct sys_device *s, char *buf)
+{
+       strcpy(buf, trigger);
+       strcat(buf, "\n");
+       return strlen(trigger) + 1;
+}
+
+static ssize_t set_trigger(struct sys_device *s,const char *buf,size_t siz)
+{
+       char *p;
+       int len;
+       strncpy(trigger, buf, sizeof(trigger));
+       trigger[sizeof(trigger)-1] = 0;
+       len = strlen(trigger);
+       p = strchr(trigger, '\n');
+       if (*p) *p = 0;
+       return len;
+}
+
+static SYSDEV_ATTR(trigger, 0644, show_trigger, set_trigger);
 ACCESSOR(tolerant,tolerant,)
 ACCESSOR(check_interval,check_interval,mce_restart())
+static struct sysdev_attribute *mce_attributes[] = {
+       &attr_bank0ctl, &attr_bank1ctl, &attr_bank2ctl,
+       &attr_bank3ctl, &attr_bank4ctl, &attr_bank5ctl,
+       &attr_tolerant, &attr_check_interval, &attr_trigger,
+       NULL
+};
 
 /* Per cpu sysdev init.  All of the cpus still share the same ctl bank */
 static __cpuinit int mce_create_device(unsigned int cpu)
@@ -632,11 +678,9 @@ static __cpuinit int mce_create_device(unsigned int cpu)
        err = sysdev_register(&per_cpu(device_mce,cpu));
 
        if (!err) {
-               for (i = 0; i < banks; i++)
+               for (i = 0; mce_attributes[i]; i++)
                        sysdev_create_file(&per_cpu(device_mce,cpu),
-                               bank_attributes[i]);
-               sysdev_create_file(&per_cpu(device_mce,cpu), &attr_tolerant);
-               sysdev_create_file(&per_cpu(device_mce,cpu), &attr_check_interval);
+                               mce_attributes[i]);
        }
        return err;
 }
@@ -645,11 +689,9 @@ static void mce_remove_device(unsigned int cpu)
 {
        int i;
 
-       for (i = 0; i < banks; i++)
+       for (i = 0; mce_attributes[i]; i++)
                sysdev_remove_file(&per_cpu(device_mce,cpu),
-                       bank_attributes[i]);
-       sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_tolerant);
-       sysdev_remove_file(&per_cpu(device_mce,cpu), &attr_check_interval);
+                       mce_attributes[i]);
        sysdev_unregister(&per_cpu(device_mce,cpu));
        memset(&per_cpu(device_mce, cpu).kobj, 0, sizeof(struct kobject));
 }
index fa09debad4b7c18b34966ebb3bd13bcca0937b9e..d0bd5d66e103d8d491dc728cb06a82dec86425ba 100644 (file)
@@ -37,6 +37,8 @@
 #define THRESHOLD_MAX     0xFFF
 #define INT_TYPE_APIC     0x00020000
 #define MASK_VALID_HI     0x80000000
+#define MASK_CNTP_HI      0x40000000
+#define MASK_LOCKED_HI    0x20000000
 #define MASK_LVTOFF_HI    0x00F00000
 #define MASK_COUNT_EN_HI  0x00080000
 #define MASK_INT_TYPE_HI  0x00060000
@@ -122,14 +124,17 @@ void __cpuinit mce_amd_feature_init(struct cpuinfo_x86 *c)
                for (block = 0; block < NR_BLOCKS; ++block) {
                        if (block == 0)
                                address = MSR_IA32_MC0_MISC + bank * 4;
-                       else if (block == 1)
-                               address = MCG_XBLK_ADDR
-                                       + ((low & MASK_BLKPTR_LO) >> 21);
+                       else if (block == 1) {
+                               address = (low & MASK_BLKPTR_LO) >> 21;
+                               if (!address)
+                                       break;
+                               address += MCG_XBLK_ADDR;
+                       }
                        else
                                ++address;
 
                        if (rdmsr_safe(address, &low, &high))
-                               continue;
+                               break;
 
                        if (!(high & MASK_VALID_HI)) {
                                if (block)
@@ -138,8 +143,8 @@ void __cpuinit mce_amd_feature_init(struct cpuinfo_x86 *c)
                                        break;
                        }
 
-                       if (!(high & MASK_VALID_HI >> 1)  ||
-                            (high & MASK_VALID_HI >> 2))
+                       if (!(high & MASK_CNTP_HI)  ||
+                            (high & MASK_LOCKED_HI))
                                continue;
 
                        if (!block)
@@ -187,17 +192,22 @@ asmlinkage void mce_threshold_interrupt(void)
 
        /* assume first bank caused it */
        for (bank = 0; bank < NR_BANKS; ++bank) {
+               if (!(per_cpu(bank_map, m.cpu) & (1 << bank)))
+                       continue;
                for (block = 0; block < NR_BLOCKS; ++block) {
                        if (block == 0)
                                address = MSR_IA32_MC0_MISC + bank * 4;
-                       else if (block == 1)
-                               address = MCG_XBLK_ADDR
-                                       + ((low & MASK_BLKPTR_LO) >> 21);
+                       else if (block == 1) {
+                               address = (low & MASK_BLKPTR_LO) >> 21;
+                               if (!address)
+                                       break;
+                               address += MCG_XBLK_ADDR;
+                       }
                        else
                                ++address;
 
                        if (rdmsr_safe(address, &low, &high))
-                               continue;
+                               break;
 
                        if (!(high & MASK_VALID_HI)) {
                                if (block)
@@ -206,10 +216,14 @@ asmlinkage void mce_threshold_interrupt(void)
                                        break;
                        }
 
-                       if (!(high & MASK_VALID_HI >> 1)  ||
-                            (high & MASK_VALID_HI >> 2))
+                       if (!(high & MASK_CNTP_HI)  ||
+                            (high & MASK_LOCKED_HI))
                                continue;
 
+                       /* Log the machine check that caused the threshold
+                          event. */
+                       do_machine_check(NULL, 0);
+
                        if (high & MASK_OVERFLOW_HI) {
                                rdmsrl(address, m.misc);
                                rdmsrl(MSR_IA32_MC0_STATUS + bank * 4,
@@ -385,7 +399,7 @@ static __cpuinit int allocate_threshold_blocks(unsigned int cpu,
                return 0;
 
        if (rdmsr_safe(address, &low, &high))
-               goto recurse;
+               return 0;
 
        if (!(high & MASK_VALID_HI)) {
                if (block)
@@ -394,14 +408,13 @@ static __cpuinit int allocate_threshold_blocks(unsigned int cpu,
                        return 0;
        }
 
-       if (!(high & MASK_VALID_HI >> 1)  ||
-            (high & MASK_VALID_HI >> 2))
+       if (!(high & MASK_CNTP_HI)  ||
+            (high & MASK_LOCKED_HI))
                goto recurse;
 
        b = kzalloc(sizeof(struct threshold_block), GFP_KERNEL);
        if (!b)
                return -ENOMEM;
-       memset(b, 0, sizeof(struct threshold_block));
 
        b->block = block;
        b->bank = bank;
@@ -490,7 +503,6 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank)
                err = -ENOMEM;
                goto out;
        }
-       memset(b, 0, sizeof(struct threshold_bank));
 
        kobject_set_name(&b->kobj, "threshold_bank%i", bank);
        b->kobj.parent = &per_cpu(device_mce, cpu).kobj;
index 9cb42ecb7f8966bb90bf3426f8b82e0cad9b55cf..486f4c61a948851f3b729a646da78e679e689341 100644 (file)
@@ -172,7 +172,7 @@ static __cpuinit inline int nmi_known_cpu(void)
 {
        switch (boot_cpu_data.x86_vendor) {
        case X86_VENDOR_AMD:
-               return boot_cpu_data.x86 == 15;
+               return boot_cpu_data.x86 == 15 || boot_cpu_data.x86 == 16;
        case X86_VENDOR_INTEL:
                if (cpu_has(&boot_cpu_data, X86_FEATURE_ARCH_PERFMON))
                        return 1;
@@ -214,6 +214,23 @@ static __init void nmi_cpu_busy(void *data)
 }
 #endif
 
+static unsigned int adjust_for_32bit_ctr(unsigned int hz)
+{
+       unsigned int retval = hz;
+
+       /*
+        * On Intel CPUs with ARCH_PERFMON only 32 bits in the counter
+        * are writable, with higher bits sign extending from bit 31.
+        * So, we can only program the counter with 31 bit values and
+        * 32nd bit should be 1, for 33.. to be 1.
+        * Find the appropriate nmi_hz
+        */
+       if ((((u64)cpu_khz * 1000) / retval) > 0x7fffffffULL) {
+               retval = ((u64)cpu_khz * 1000) / 0x7fffffffUL + 1;
+       }
+       return retval;
+}
+
 int __init check_nmi_watchdog (void)
 {
        int *counts;
@@ -268,17 +285,8 @@ int __init check_nmi_watchdog (void)
                struct nmi_watchdog_ctlblk *wd = &__get_cpu_var(nmi_watchdog_ctlblk);
 
                nmi_hz = 1;
-               /*
-                * On Intel CPUs with ARCH_PERFMON only 32 bits in the counter
-                * are writable, with higher bits sign extending from bit 31.
-                * So, we can only program the counter with 31 bit values and
-                * 32nd bit should be 1, for 33.. to be 1.
-                * Find the appropriate nmi_hz
-                */
-               if (wd->perfctr_msr == MSR_ARCH_PERFMON_PERFCTR0 &&
-                       ((u64)cpu_khz * 1000) > 0x7fffffffULL) {
-                       nmi_hz = ((u64)cpu_khz * 1000) / 0x7fffffffUL + 1;
-               }
+               if (wd->perfctr_msr == MSR_ARCH_PERFMON_PERFCTR0)
+                       nmi_hz = adjust_for_32bit_ctr(nmi_hz);
        }
 
        kfree(counts);
@@ -360,6 +368,33 @@ void enable_timer_nmi_watchdog(void)
        }
 }
 
+static void __acpi_nmi_disable(void *__unused)
+{
+       apic_write(APIC_LVT0, APIC_DM_NMI | APIC_LVT_MASKED);
+}
+
+/*
+ * Disable timer based NMIs on all CPUs:
+ */
+void acpi_nmi_disable(void)
+{
+       if (atomic_read(&nmi_active) && nmi_watchdog == NMI_IO_APIC)
+               on_each_cpu(__acpi_nmi_disable, NULL, 0, 1);
+}
+
+static void __acpi_nmi_enable(void *__unused)
+{
+       apic_write(APIC_LVT0, APIC_DM_NMI);
+}
+
+/*
+ * Enable timer based NMIs on all CPUs:
+ */
+void acpi_nmi_enable(void)
+{
+       if (atomic_read(&nmi_active) && nmi_watchdog == NMI_IO_APIC)
+               on_each_cpu(__acpi_nmi_enable, NULL, 0, 1);
+}
 #ifdef CONFIG_PM
 
 static int nmi_pm_active; /* nmi_active before suspend */
@@ -634,7 +669,9 @@ static int setup_intel_arch_watchdog(void)
 
        /* setup the timer */
        wrmsr(evntsel_msr, evntsel, 0);
-       wrmsrl(perfctr_msr, -((u64)cpu_khz * 1000 / nmi_hz));
+
+       nmi_hz = adjust_for_32bit_ctr(nmi_hz);
+       wrmsr(perfctr_msr, (u32)(-((u64)cpu_khz * 1000 / nmi_hz)), 0);
 
        apic_write(APIC_LVTPC, APIC_DM_NMI);
        evntsel |= ARCH_PERFMON_EVENTSEL0_ENABLE;
@@ -855,15 +892,23 @@ int __kprobes nmi_watchdog_tick(struct pt_regs * regs, unsigned reason)
                                dummy &= ~P4_CCCR_OVF;
                                wrmsrl(wd->cccr_msr, dummy);
                                apic_write(APIC_LVTPC, APIC_DM_NMI);
+                               /* start the cycle over again */
+                               wrmsrl(wd->perfctr_msr,
+                                      -((u64)cpu_khz * 1000 / nmi_hz));
                        } else if (wd->perfctr_msr == MSR_ARCH_PERFMON_PERFCTR0) {
                                /*
                                 * ArchPerfom/Core Duo needs to re-unmask
                                 * the apic vector
                                 */
                                apic_write(APIC_LVTPC, APIC_DM_NMI);
+                               /* ARCH_PERFMON has 32 bit counter writes */
+                               wrmsr(wd->perfctr_msr,
+                                    (u32)(-((u64)cpu_khz * 1000 / nmi_hz)), 0);
+                       } else {
+                               /* start the cycle over again */
+                               wrmsrl(wd->perfctr_msr,
+                                      -((u64)cpu_khz * 1000 / nmi_hz));
                        }
-                       /* start the cycle over again */
-                       wrmsrl(wd->perfctr_msr, -((u64)cpu_khz * 1000 / nmi_hz));
                        rc = 1;
                } else  if (nmi_watchdog == NMI_IO_APIC) {
                        /* don't know how to accurately check for this.
index 3d65b1d4c2b39e4110dc913159615089e4a5ab02..04480c3b68f5d15177192e8336fcdecda4f52b68 100644 (file)
@@ -138,6 +138,8 @@ static const unsigned long phb_debug_offsets[] = {
 
 #define PHB_DEBUG_STUFF_OFFSET 0x0020
 
+#define EMERGENCY_PAGES 32 /* = 128KB */
+
 unsigned int specified_table_size = TCE_TABLE_SIZE_UNSPECIFIED;
 static int translate_empty_slots __read_mostly = 0;
 static int calgary_detected __read_mostly = 0;
@@ -296,6 +298,16 @@ static void __iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,
 {
        unsigned long entry;
        unsigned long badbit;
+       unsigned long badend;
+
+       /* were we called with bad_dma_address? */
+       badend = bad_dma_address + (EMERGENCY_PAGES * PAGE_SIZE);
+       if (unlikely((dma_addr >= bad_dma_address) && (dma_addr < badend))) {
+               printk(KERN_ERR "Calgary: driver tried unmapping bad DMA "
+                      "address 0x%Lx\n", dma_addr);
+               WARN_ON(1);
+               return;
+       }
 
        entry = dma_addr >> PAGE_SHIFT;
 
@@ -656,8 +668,8 @@ static void __init calgary_reserve_regions(struct pci_dev *dev)
        u64 start;
        struct iommu_table *tbl = dev->sysdata;
 
-       /* reserve bad_dma_address in case it's a legal address */
-       iommu_range_reserve(tbl, bad_dma_address, 1);
+       /* reserve EMERGENCY_PAGES from bad_dma_address and up */
+       iommu_range_reserve(tbl, bad_dma_address, EMERGENCY_PAGES);
 
        /* avoid the BIOS/VGA first 640KB-1MB region */
        start = (640 * 1024);
@@ -1176,6 +1188,7 @@ int __init calgary_iommu_init(void)
        }
 
        force_iommu = 1;
+       bad_dma_address = 0x0;
        dma_ops = &calgary_dma_ops;
 
        return 0;
index 683b7a5c1ab30170d716a99fe90c633187f4a827..651ccfb06697dae54fbd96ffde647f12e98e691d 100644 (file)
@@ -223,30 +223,10 @@ int dma_set_mask(struct device *dev, u64 mask)
 }
 EXPORT_SYMBOL(dma_set_mask);
 
-/* iommu=[size][,noagp][,off][,force][,noforce][,leak][,memaper[=order]][,merge]
-         [,forcesac][,fullflush][,nomerge][,biomerge]
-   size  set size of iommu (in bytes)
-   noagp don't initialize the AGP driver and use full aperture.
-   off   don't use the IOMMU
-   leak  turn on simple iommu leak tracing (only when CONFIG_IOMMU_LEAK is on)
-   memaper[=order] allocate an own aperture over RAM with size 32MB^order.
-   noforce don't force IOMMU usage. Default.
-   force  Force IOMMU.
-   merge  Do lazy merging. This may improve performance on some block devices.
-          Implies force (experimental)
-   biomerge Do merging at the BIO layer. This is more efficient than merge,
-            but should be only done with very big IOMMUs. Implies merge,force.
-   nomerge Don't do SG merging.
-   forcesac For SAC mode for masks <40bits  (experimental)
-   fullflush Flush IOMMU on each allocation (default)
-   nofullflush Don't use IOMMU fullflush
-   allowed  overwrite iommu off workarounds for specific chipsets.
-   soft         Use software bounce buffering (default for Intel machines)
-   noaperture Don't touch the aperture for AGP.
-   allowdac Allow DMA >4GB
-   nodac    Forbid DMA >4GB
-   panic    Force panic when IOMMU overflows
-*/
+/*
+ * See <Documentation/x86_64/boot-options.txt> for the iommu kernel parameter
+ * documentation.
+ */
 __init int iommu_setup(char *p)
 {
        iommu_merge = 1;
index fc1960f1f243982f8ecd6746ce0bddb8828ab633..030eb3753358146c207f99864225cd88020137ba 100644 (file)
@@ -185,7 +185,7 @@ static void iommu_full(struct device *dev, size_t size, int dir)
 static inline int need_iommu(struct device *dev, unsigned long addr, size_t size)
 { 
        u64 mask = *dev->dma_mask;
-       int high = addr + size >= mask;
+       int high = addr + size > mask;
        int mmu = high;
        if (force_iommu) 
                mmu = 1; 
@@ -195,7 +195,7 @@ static inline int need_iommu(struct device *dev, unsigned long addr, size_t size
 static inline int nonforced_iommu(struct device *dev, unsigned long addr, size_t size)
 { 
        u64 mask = *dev->dma_mask;
-       int high = addr + size >= mask;
+       int high = addr + size > mask;
        int mmu = high;
        return mmu; 
 }
index 7554458dc9cbb6f35c2d8caf9f0333f5c7e41410..ae8f91214f1564e510cf63c49efe079eb504853a 100644 (file)
 #include <asm/msr.h>
 #include <asm/vsyscall.h>
 
-/* The I/O port the PMTMR resides at.
- * The location is detected during setup_arch(),
- * in arch/i386/kernel/acpi/boot.c */
-u32 pmtmr_ioport __read_mostly;
-
-/* value of the Power timer at last timer interrupt */
-static u32 offset_delay;
-static u32 last_pmtmr_tick;
-
 #define ACPI_PM_MASK 0xFFFFFF /* limit it to 24 bits */
 
 static inline u32 cyc2us(u32 cycles)
@@ -48,38 +39,6 @@ static inline u32 cyc2us(u32 cycles)
        return (cycles >> 10);
 }
 
-int pmtimer_mark_offset(void)
-{
-       static int first_run = 1;
-       unsigned long tsc;
-       u32 lost;
-
-       u32 tick = inl(pmtmr_ioport);
-       u32 delta;
-
-       delta = cyc2us((tick - last_pmtmr_tick) & ACPI_PM_MASK);
-
-       last_pmtmr_tick = tick;
-       monotonic_base += delta * NSEC_PER_USEC;
-
-       delta += offset_delay;
-
-       lost = delta / (USEC_PER_SEC / HZ);
-       offset_delay = delta % (USEC_PER_SEC / HZ);
-
-       rdtscll(tsc);
-       vxtime.last_tsc = tsc - offset_delay * (u64)cpu_khz / 1000;
-
-       /* don't calculate delay for first run,
-          or if we've got less then a tick */
-       if (first_run || (lost < 1)) {
-               first_run = 0;
-               offset_delay = 0;
-       }
-
-       return lost - 1;
-}
-
 static unsigned pmtimer_wait_tick(void)
 {
        u32 a, b;
@@ -101,23 +60,6 @@ void pmtimer_wait(unsigned us)
        } while (cyc2us(b - a) < us);
 }
 
-void pmtimer_resume(void)
-{
-       last_pmtmr_tick = inl(pmtmr_ioport);
-}
-
-unsigned int do_gettimeoffset_pm(void)
-{
-       u32 now, offset, delta = 0;
-
-       offset = last_pmtmr_tick;
-       now = inl(pmtmr_ioport);
-       delta = (now - offset) & ACPI_PM_MASK;
-
-       return offset_delay + cyc2us(delta);
-}
-
-
 static int __init nopmtimer_setup(char *s)
 {
        pmtmr_ioport = 0;
index addc14af0c562a7ec485c89fc6c69d71bb3ed1ca..4326a690a509a14ae2c5c4d2980233a82864eebc 100644 (file)
@@ -536,8 +536,12 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
                }
                ret = 0;
                for (ui = 0; ui < sizeof(struct user_regs_struct); ui += sizeof(long)) {
-                       ret |= __get_user(tmp, (unsigned long __user *) data);
-                       putreg(child, ui, tmp);
+                       ret = __get_user(tmp, (unsigned long __user *) data);
+                       if (ret)
+                               break;
+                       ret = putreg(child, ui, tmp);
+                       if (ret)
+                               break;
                        data += sizeof(long);
                }
                break;
index af425a8049fb5620596a0bc61bf005d399df3e32..3d98b696881d7b012b9a176fadb5b482e810786c 100644 (file)
@@ -100,7 +100,7 @@ EXPORT_SYMBOL_GPL(edid_info);
 
 extern int root_mountflags;
 
-char command_line[COMMAND_LINE_SIZE];
+char __initdata command_line[COMMAND_LINE_SIZE];
 
 struct resource standard_io_resources[] = {
        { .name = "dma1", .start = 0x00, .end = 0x1f,
@@ -138,128 +138,6 @@ struct resource code_resource = {
        .flags = IORESOURCE_RAM,
 };
 
-#define IORESOURCE_ROM (IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM)
-
-static struct resource system_rom_resource = {
-       .name = "System ROM",
-       .start = 0xf0000,
-       .end = 0xfffff,
-       .flags = IORESOURCE_ROM,
-};
-
-static struct resource extension_rom_resource = {
-       .name = "Extension ROM",
-       .start = 0xe0000,
-       .end = 0xeffff,
-       .flags = IORESOURCE_ROM,
-};
-
-static struct resource adapter_rom_resources[] = {
-       { .name = "Adapter ROM", .start = 0xc8000, .end = 0,
-               .flags = IORESOURCE_ROM },
-       { .name = "Adapter ROM", .start = 0, .end = 0,
-               .flags = IORESOURCE_ROM },
-       { .name = "Adapter ROM", .start = 0, .end = 0,
-               .flags = IORESOURCE_ROM },
-       { .name = "Adapter ROM", .start = 0, .end = 0,
-               .flags = IORESOURCE_ROM },
-       { .name = "Adapter ROM", .start = 0, .end = 0,
-               .flags = IORESOURCE_ROM },
-       { .name = "Adapter ROM", .start = 0, .end = 0,
-               .flags = IORESOURCE_ROM }
-};
-
-static struct resource video_rom_resource = {
-       .name = "Video ROM",
-       .start = 0xc0000,
-       .end = 0xc7fff,
-       .flags = IORESOURCE_ROM,
-};
-
-static struct resource video_ram_resource = {
-       .name = "Video RAM area",
-       .start = 0xa0000,
-       .end = 0xbffff,
-       .flags = IORESOURCE_RAM,
-};
-
-#define romsignature(x) (*(unsigned short *)(x) == 0xaa55)
-
-static int __init romchecksum(unsigned char *rom, unsigned long length)
-{
-       unsigned char *p, sum = 0;
-
-       for (p = rom; p < rom + length; p++)
-               sum += *p;
-       return sum == 0;
-}
-
-static void __init probe_roms(void)
-{
-       unsigned long start, length, upper;
-       unsigned char *rom;
-       int           i;
-
-       /* video rom */
-       upper = adapter_rom_resources[0].start;
-       for (start = video_rom_resource.start; start < upper; start += 2048) {
-               rom = isa_bus_to_virt(start);
-               if (!romsignature(rom))
-                       continue;
-
-               video_rom_resource.start = start;
-
-               /* 0 < length <= 0x7f * 512, historically */
-               length = rom[2] * 512;
-
-               /* if checksum okay, trust length byte */
-               if (length && romchecksum(rom, length))
-                       video_rom_resource.end = start + length - 1;
-
-               request_resource(&iomem_resource, &video_rom_resource);
-               break;
-                       }
-
-       start = (video_rom_resource.end + 1 + 2047) & ~2047UL;
-       if (start < upper)
-               start = upper;
-
-       /* system rom */
-       request_resource(&iomem_resource, &system_rom_resource);
-       upper = system_rom_resource.start;
-
-       /* check for extension rom (ignore length byte!) */
-       rom = isa_bus_to_virt(extension_rom_resource.start);
-       if (romsignature(rom)) {
-               length = extension_rom_resource.end - extension_rom_resource.start + 1;
-               if (romchecksum(rom, length)) {
-                       request_resource(&iomem_resource, &extension_rom_resource);
-                       upper = extension_rom_resource.start;
-               }
-       }
-
-       /* check for adapter roms on 2k boundaries */
-       for (i = 0; i < ARRAY_SIZE(adapter_rom_resources) && start < upper;
-            start += 2048) {
-               rom = isa_bus_to_virt(start);
-               if (!romsignature(rom))
-                       continue;
-
-               /* 0 < length <= 0x7f * 512, historically */
-               length = rom[2] * 512;
-
-               /* but accept any length that fits if checksum okay */
-               if (!length || start + length > upper || !romchecksum(rom, length))
-                       continue;
-
-               adapter_rom_resources[i].start = start;
-               adapter_rom_resources[i].end = start + length - 1;
-               request_resource(&iomem_resource, &adapter_rom_resources[i]);
-
-               start = adapter_rom_resources[i++].end & ~2047UL;
-       }
-}
-
 #ifdef CONFIG_PROC_VMCORE
 /* elfcorehdr= specifies the location of elf core header
  * stored by the crashed kernel. This option will be passed
@@ -343,7 +221,7 @@ static void discover_ebda(void)
 
 void __init setup_arch(char **cmdline_p)
 {
-       printk(KERN_INFO "Command line: %s\n", saved_command_line);
+       printk(KERN_INFO "Command line: %s\n", boot_command_line);
 
        ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
        screen_info = SCREEN_INFO;
@@ -373,7 +251,7 @@ void __init setup_arch(char **cmdline_p)
 
        early_identify_cpu(&boot_cpu_data);
 
-       strlcpy(command_line, saved_command_line, COMMAND_LINE_SIZE);
+       strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
        *cmdline_p = command_line;
 
        parse_early_param();
@@ -444,6 +322,11 @@ void __init setup_arch(char **cmdline_p)
        /* reserve ebda region */
        if (ebda_addr)
                reserve_bootmem_generic(ebda_addr, ebda_size);
+#ifdef CONFIG_NUMA
+       /* reserve nodemap region */
+       if (nodemap_addr)
+               reserve_bootmem_generic(nodemap_addr, nodemap_size);
+#endif
 
 #ifdef CONFIG_SMP
        /*
@@ -519,15 +402,11 @@ void __init setup_arch(char **cmdline_p)
        init_apic_mappings();
 
        /*
-        * Request address space for all standard RAM and ROM resources
-        * and also for regions reported as reserved by the e820.
-        */
-       probe_roms();
+        * We trust e820 completely. No explicit ROM probing in memory.
+        */
        e820_reserve_resources(); 
        e820_mark_nosave_regions();
 
-       request_resource(&iomem_resource, &video_ram_resource);
-
        {
        unsigned i;
        /* request I/O space for devices used on all i[345]86 PCs */
@@ -1063,7 +942,8 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL,
                NULL, NULL, NULL, NULL, "nx", NULL, "mmxext", NULL,
-               NULL, "fxsr_opt", NULL, "rdtscp", NULL, "lm", "3dnowext", "3dnow",
+               NULL, "fxsr_opt", "pdpe1gb", "rdtscp", NULL, "lm",
+               "3dnowext", "3dnow",
 
                /* Transmeta-defined */
                "recovery", "longrun", NULL, "lrti", NULL, NULL, NULL, NULL,
@@ -1081,7 +961,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                /* Intel-defined (#2) */
                "pni", NULL, NULL, "monitor", "ds_cpl", "vmx", "smx", "est",
                "tm2", "ssse3", "cid", NULL, NULL, "cx16", "xtpr", NULL,
-               NULL, NULL, "dca", NULL, NULL, NULL, NULL, NULL,
+               NULL, NULL, "dca", NULL, NULL, NULL, NULL, "popcnt",
                NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
                /* VIA/Cyrix/Centaur-defined */
@@ -1091,8 +971,10 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
                /* AMD-defined (#2) */
-               "lahf_lm", "cmp_legacy", "svm", NULL, "cr8_legacy", NULL, NULL, NULL,
-               NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+               "lahf_lm", "cmp_legacy", "svm", "extapic", "cr8_legacy",
+               "altmovcr8", "abm", "sse4a",
+               "misalignsse", "3dnowprefetch",
+               "osvw", "ibs", NULL, NULL, NULL, NULL,
                NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
        };
@@ -1103,6 +985,9 @@ static int show_cpuinfo(struct seq_file *m, void *v)
                "ttp",  /* thermal trip */
                "tm",
                "stc",
+               "100mhzsteps",
+               "hwpstate",
+               NULL,   /* tsc invariant mapped to constant_tsc */
                NULL,
                /* nothing */   /* constant_tsc - moved to flags */
        };
@@ -1219,23 +1104,3 @@ struct seq_operations cpuinfo_op = {
        .stop = c_stop,
        .show = show_cpuinfo,
 };
-
-#if defined(CONFIG_INPUT_PCSPKR) || defined(CONFIG_INPUT_PCSPKR_MODULE)
-#include <linux/platform_device.h>
-static __init int add_pcspkr(void)
-{
-       struct platform_device *pd;
-       int ret;
-
-       pd = platform_device_alloc("pcspkr", -1);
-       if (!pd)
-               return -ENOMEM;
-
-       ret = platform_device_add(pd);
-       if (ret)
-               platform_device_put(pd);
-
-       return ret;
-}
-device_initcall(add_pcspkr);
-#endif
index 8c4b80fe71a146c73447d4af46ced0e60d80c5b9..6a70b55f719d7cb47a463b3d8c638f7aae378c25 100644 (file)
@@ -37,7 +37,6 @@ struct desc_ptr idt_descr = { 256 * 16 - 1, (unsigned long) idt_table };
 char boot_cpu_stack[IRQSTACKSIZE] __attribute__((section(".bss.page_aligned")));
 
 unsigned long __supported_pte_mask __read_mostly = ~0UL;
-EXPORT_SYMBOL(__supported_pte_mask);
 static int do_not_nx __cpuinitdata = 0;
 
 /* noexec=on|off
index daf19332f0dd02ed7ab4257e5c887989dfeb0ef8..35443729aad8b5fef81caba0483d5e6ab66d5856 100644 (file)
@@ -148,217 +148,6 @@ static void __cpuinit smp_store_cpu_info(int id)
        print_cpu_info(c);
 }
 
-/*
- * New Funky TSC sync algorithm borrowed from IA64.
- * Main advantage is that it doesn't reset the TSCs fully and
- * in general looks more robust and it works better than my earlier
- * attempts. I believe it was written by David Mosberger. Some minor
- * adjustments for x86-64 by me -AK
- *
- * Original comment reproduced below.
- *
- * Synchronize TSC of the current (slave) CPU with the TSC of the
- * MASTER CPU (normally the time-keeper CPU).  We use a closed loop to
- * eliminate the possibility of unaccounted-for errors (such as
- * getting a machine check in the middle of a calibration step).  The
- * basic idea is for the slave to ask the master what itc value it has
- * and to read its own itc before and after the master responds.  Each
- * iteration gives us three timestamps:
- *
- *     slave           master
- *
- *     t0 ---\
- *             ---\
- *                --->
- *                     tm
- *                /---
- *            /---
- *     t1 <---
- *
- *
- * The goal is to adjust the slave's TSC such that tm falls exactly
- * half-way between t0 and t1.  If we achieve this, the clocks are
- * synchronized provided the interconnect between the slave and the
- * master is symmetric.  Even if the interconnect were asymmetric, we
- * would still know that the synchronization error is smaller than the
- * roundtrip latency (t0 - t1).
- *
- * When the interconnect is quiet and symmetric, this lets us
- * synchronize the TSC to within one or two cycles.  However, we can
- * only *guarantee* that the synchronization is accurate to within a
- * round-trip time, which is typically in the range of several hundred
- * cycles (e.g., ~500 cycles).  In practice, this means that the TSCs
- * are usually almost perfectly synchronized, but we shouldn't assume
- * that the accuracy is much better than half a micro second or so.
- *
- * [there are other errors like the latency of RDTSC and of the
- * WRMSR. These can also account to hundreds of cycles. So it's
- * probably worse. It claims 153 cycles error on a dual Opteron,
- * but I suspect the numbers are actually somewhat worse -AK]
- */
-
-#define MASTER 0
-#define SLAVE  (SMP_CACHE_BYTES/8)
-
-/* Intentionally don't use cpu_relax() while TSC synchronization
-   because we don't want to go into funky power save modi or cause
-   hypervisors to schedule us away.  Going to sleep would likely affect
-   latency and low latency is the primary objective here. -AK */
-#define no_cpu_relax() barrier()
-
-static __cpuinitdata DEFINE_SPINLOCK(tsc_sync_lock);
-static volatile __cpuinitdata unsigned long go[SLAVE + 1];
-static int notscsync __cpuinitdata;
-
-#undef DEBUG_TSC_SYNC
-
-#define NUM_ROUNDS     64      /* magic value */
-#define NUM_ITERS      5       /* likewise */
-
-/* Callback on boot CPU */
-static __cpuinit void sync_master(void *arg)
-{
-       unsigned long flags, i;
-
-       go[MASTER] = 0;
-
-       local_irq_save(flags);
-       {
-               for (i = 0; i < NUM_ROUNDS*NUM_ITERS; ++i) {
-                       while (!go[MASTER])
-                               no_cpu_relax();
-                       go[MASTER] = 0;
-                       rdtscll(go[SLAVE]);
-               }
-       }
-       local_irq_restore(flags);
-}
-
-/*
- * Return the number of cycles by which our tsc differs from the tsc
- * on the master (time-keeper) CPU.  A positive number indicates our
- * tsc is ahead of the master, negative that it is behind.
- */
-static inline long
-get_delta(long *rt, long *master)
-{
-       unsigned long best_t0 = 0, best_t1 = ~0UL, best_tm = 0;
-       unsigned long tcenter, t0, t1, tm;
-       int i;
-
-       for (i = 0; i < NUM_ITERS; ++i) {
-               rdtscll(t0);
-               go[MASTER] = 1;
-               while (!(tm = go[SLAVE]))
-                       no_cpu_relax();
-               go[SLAVE] = 0;
-               rdtscll(t1);
-
-               if (t1 - t0 < best_t1 - best_t0)
-                       best_t0 = t0, best_t1 = t1, best_tm = tm;
-       }
-
-       *rt = best_t1 - best_t0;
-       *master = best_tm - best_t0;
-
-       /* average best_t0 and best_t1 without overflow: */
-       tcenter = (best_t0/2 + best_t1/2);
-       if (best_t0 % 2 + best_t1 % 2 == 2)
-               ++tcenter;
-       return tcenter - best_tm;
-}
-
-static __cpuinit void sync_tsc(unsigned int master)
-{
-       int i, done = 0;
-       long delta, adj, adjust_latency = 0;
-       unsigned long flags, rt, master_time_stamp, bound;
-#ifdef DEBUG_TSC_SYNC
-       static struct syncdebug {
-               long rt;        /* roundtrip time */
-               long master;    /* master's timestamp */
-               long diff;      /* difference between midpoint and master's timestamp */
-               long lat;       /* estimate of tsc adjustment latency */
-       } t[NUM_ROUNDS] __cpuinitdata;
-#endif
-
-       printk(KERN_INFO "CPU %d: Syncing TSC to CPU %u.\n",
-               smp_processor_id(), master);
-
-       go[MASTER] = 1;
-
-       /* It is dangerous to broadcast IPI as cpus are coming up,
-        * as they may not be ready to accept them.  So since
-        * we only need to send the ipi to the boot cpu direct
-        * the message, and avoid the race.
-        */
-       smp_call_function_single(master, sync_master, NULL, 1, 0);
-
-       while (go[MASTER])      /* wait for master to be ready */
-               no_cpu_relax();
-
-       spin_lock_irqsave(&tsc_sync_lock, flags);
-       {
-               for (i = 0; i < NUM_ROUNDS; ++i) {
-                       delta = get_delta(&rt, &master_time_stamp);
-                       if (delta == 0) {
-                               done = 1;       /* let's lock on to this... */
-                               bound = rt;
-                       }
-
-                       if (!done) {
-                               unsigned long t;
-                               if (i > 0) {
-                                       adjust_latency += -delta;
-                                       adj = -delta + adjust_latency/4;
-                               } else
-                                       adj = -delta;
-
-                               rdtscll(t);
-                               wrmsrl(MSR_IA32_TSC, t + adj);
-                       }
-#ifdef DEBUG_TSC_SYNC
-                       t[i].rt = rt;
-                       t[i].master = master_time_stamp;
-                       t[i].diff = delta;
-                       t[i].lat = adjust_latency/4;
-#endif
-               }
-       }
-       spin_unlock_irqrestore(&tsc_sync_lock, flags);
-
-#ifdef DEBUG_TSC_SYNC
-       for (i = 0; i < NUM_ROUNDS; ++i)
-               printk("rt=%5ld master=%5ld diff=%5ld adjlat=%5ld\n",
-                      t[i].rt, t[i].master, t[i].diff, t[i].lat);
-#endif
-
-       printk(KERN_INFO
-              "CPU %d: synchronized TSC with CPU %u (last diff %ld cycles, "
-              "maxerr %lu cycles)\n",
-              smp_processor_id(), master, delta, rt);
-}
-
-static void __cpuinit tsc_sync_wait(void)
-{
-       /*
-        * When the CPU has synchronized TSCs assume the BIOS
-        * or the hardware already synced.  Otherwise we could
-        * mess up a possible perfect synchronization with a
-        * not-quite-perfect algorithm.
-        */
-       if (notscsync || !cpu_has_tsc || !unsynchronized_tsc())
-               return;
-       sync_tsc(0);
-}
-
-static __init int notscsync_setup(char *s)
-{
-       notscsync = 1;
-       return 1;
-}
-__setup("notscsync", notscsync_setup);
-
 static atomic_t init_deasserted __cpuinitdata;
 
 /*
@@ -546,6 +335,11 @@ void __cpuinit start_secondary(void)
        /* otherwise gcc will move up the smp_processor_id before the cpu_init */
        barrier();
 
+       /*
+        * Check TSC sync first:
+        */
+       check_tsc_sync_target();
+
        Dprintk("cpu %d: setting up apic clock\n", smp_processor_id());         
        setup_secondary_APIC_clock();
 
@@ -565,14 +359,6 @@ void __cpuinit start_secondary(void)
         */
        set_cpu_sibling_map(smp_processor_id());
 
-       /* 
-        * Wait for TSC sync to not schedule things before.
-        * We still process interrupts, which could see an inconsistent
-        * time in that window unfortunately. 
-        * Do this here because TSC sync has global unprotected state.
-        */
-       tsc_sync_wait();
-
        /*
         * We need to hold call_lock, so there is no inconsistency
         * between the time smp_call_function() determines number of
@@ -592,6 +378,7 @@ void __cpuinit start_secondary(void)
        cpu_set(smp_processor_id(), cpu_online_map);
        per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
        spin_unlock(&vector_lock);
+
        unlock_ipi_call_lock();
 
        cpu_idle();
@@ -1168,6 +955,11 @@ int __cpuinit __cpu_up(unsigned int cpu)
        /* Unleash the CPU! */
        Dprintk("waiting for cpu %d\n", cpu);
 
+       /*
+        * Make sure and check TSC sync:
+        */
+       check_tsc_sync_source(cpu);
+
        while (!cpu_isset(cpu, cpu_online_map))
                cpu_relax();
 
@@ -1190,7 +982,6 @@ void __init smp_cpus_done(unsigned int max_cpus)
        smp_cleanup_boot();
        setup_ioapic_dest();
        check_nmi_watchdog();
-       time_init_gtod();
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
index 6026b31d037ef72a9b92213f1b522b8ba8e8f0b0..65ac2c6b34a6a1f80c9be549572e1d2f2e1d102e 100644 (file)
@@ -32,7 +32,7 @@ static void save_stack_address(void *data, unsigned long addr)
                trace->skip--;
                return;
        }
-       if (trace->nr_entries < trace->max_entries - 1)
+       if (trace->nr_entries < trace->max_entries)
                trace->entries[trace->nr_entries++] = addr;
 }
 
@@ -49,7 +49,8 @@ static struct stacktrace_ops save_stack_ops = {
 void save_stack_trace(struct stack_trace *trace, struct task_struct *task)
 {
        dump_trace(task, NULL, NULL, &save_stack_ops, trace);
-       trace->entries[trace->nr_entries++] = ULONG_MAX;
+       if (trace->nr_entries < trace->max_entries)
+               trace->entries[trace->nr_entries++] = ULONG_MAX;
 }
 EXPORT_SYMBOL(save_stack_trace);
 
index 335cc91c49b722c87ba12e8b4040c1f0ee38869b..a87c5170562054736eee872dc576d8225f26e313 100644 (file)
 #include <linux/cpufreq.h>
 #include <linux/hpet.h>
 #include <asm/apic.h>
+#include <asm/hpet.h>
 
-#ifdef CONFIG_CPU_FREQ
-static void cpufreq_delayed_get(void);
-#endif
 extern void i8254_timer_resume(void);
 extern int using_apic_timer;
 
@@ -55,128 +53,7 @@ DEFINE_SPINLOCK(rtc_lock);
 EXPORT_SYMBOL(rtc_lock);
 DEFINE_SPINLOCK(i8253_lock);
 
-int nohpet __initdata = 0;
-static int notsc __initdata = 0;
-
-#define USEC_PER_TICK (USEC_PER_SEC / HZ)
-#define NSEC_PER_TICK (NSEC_PER_SEC / HZ)
-#define FSEC_PER_TICK (FSEC_PER_SEC / HZ)
-
-#define NS_SCALE       10 /* 2^10, carefully chosen */
-#define US_SCALE       32 /* 2^32, arbitralrily chosen */
-
-unsigned int cpu_khz;                                  /* TSC clocks / usec, not used here */
-EXPORT_SYMBOL(cpu_khz);
-static unsigned long hpet_period;                      /* fsecs / HPET clock */
-unsigned long hpet_tick;                               /* HPET clocks / interrupt */
-int hpet_use_timer;                            /* Use counter of hpet for time keeping, otherwise PIT */
-unsigned long vxtime_hz = PIT_TICK_RATE;
-int report_lost_ticks;                         /* command line option */
-unsigned long long monotonic_base;
-
-struct vxtime_data __vxtime __section_vxtime;  /* for vsyscalls */
-
 volatile unsigned long __jiffies __section_jiffies = INITIAL_JIFFIES;
-struct timespec __xtime __section_xtime;
-struct timezone __sys_tz __section_sys_tz;
-
-/*
- * do_gettimeoffset() returns microseconds since last timer interrupt was
- * triggered by hardware. A memory read of HPET is slower than a register read
- * of TSC, but much more reliable. It's also synchronized to the timer
- * interrupt. Note that do_gettimeoffset() may return more than hpet_tick, if a
- * timer interrupt has happened already, but vxtime.trigger wasn't updated yet.
- * This is not a problem, because jiffies hasn't updated either. They are bound
- * together by xtime_lock.
- */
-
-static inline unsigned int do_gettimeoffset_tsc(void)
-{
-       unsigned long t;
-       unsigned long x;
-       t = get_cycles_sync();
-       if (t < vxtime.last_tsc) 
-               t = vxtime.last_tsc; /* hack */
-       x = ((t - vxtime.last_tsc) * vxtime.tsc_quot) >> US_SCALE;
-       return x;
-}
-
-static inline unsigned int do_gettimeoffset_hpet(void)
-{
-       /* cap counter read to one tick to avoid inconsistencies */
-       unsigned long counter = hpet_readl(HPET_COUNTER) - vxtime.last;
-       return (min(counter,hpet_tick) * vxtime.quot) >> US_SCALE;
-}
-
-unsigned int (*do_gettimeoffset)(void) = do_gettimeoffset_tsc;
-
-/*
- * This version of gettimeofday() has microsecond resolution and better than
- * microsecond precision, as we're using at least a 10 MHz (usually 14.31818
- * MHz) HPET timer.
- */
-
-void do_gettimeofday(struct timeval *tv)
-{
-       unsigned long seq;
-       unsigned int sec, usec;
-
-       do {
-               seq = read_seqbegin(&xtime_lock);
-
-               sec = xtime.tv_sec;
-               usec = xtime.tv_nsec / NSEC_PER_USEC;
-
-               /* i386 does some correction here to keep the clock 
-                  monotonous even when ntpd is fixing drift.
-                  But they didn't work for me, there is a non monotonic
-                  clock anyways with ntp.
-                  I dropped all corrections now until a real solution can
-                  be found. Note when you fix it here you need to do the same
-                  in arch/x86_64/kernel/vsyscall.c and export all needed
-                  variables in vmlinux.lds. -AK */ 
-               usec += do_gettimeoffset();
-
-       } while (read_seqretry(&xtime_lock, seq));
-
-       tv->tv_sec = sec + usec / USEC_PER_SEC;
-       tv->tv_usec = usec % USEC_PER_SEC;
-}
-
-EXPORT_SYMBOL(do_gettimeofday);
-
-/*
- * settimeofday() first undoes the correction that gettimeofday would do
- * on the time, and then saves it. This is ugly, but has been like this for
- * ages already.
- */
-
-int do_settimeofday(struct timespec *tv)
-{
-       time_t wtm_sec, sec = tv->tv_sec;
-       long wtm_nsec, nsec = tv->tv_nsec;
-
-       if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
-               return -EINVAL;
-
-       write_seqlock_irq(&xtime_lock);
-
-       nsec -= do_gettimeoffset() * NSEC_PER_USEC;
-
-       wtm_sec  = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec);
-       wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec);
-
-       set_normalized_timespec(&xtime, sec, nsec);
-       set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec);
-
-       ntp_clear();
-
-       write_sequnlock_irq(&xtime_lock);
-       clock_was_set();
-       return 0;
-}
-
-EXPORT_SYMBOL(do_settimeofday);
 
 unsigned long profile_pc(struct pt_regs *regs)
 {
@@ -267,84 +144,9 @@ static void set_rtc_mmss(unsigned long nowtime)
 }
 
 
-/* monotonic_clock(): returns # of nanoseconds passed since time_init()
- *             Note: This function is required to return accurate
- *             time even in the absence of multiple timer ticks.
- */
-static inline unsigned long long cycles_2_ns(unsigned long long cyc);
-unsigned long long monotonic_clock(void)
-{
-       unsigned long seq;
-       u32 last_offset, this_offset, offset;
-       unsigned long long base;
-
-       if (vxtime.mode == VXTIME_HPET) {
-               do {
-                       seq = read_seqbegin(&xtime_lock);
-
-                       last_offset = vxtime.last;
-                       base = monotonic_base;
-                       this_offset = hpet_readl(HPET_COUNTER);
-               } while (read_seqretry(&xtime_lock, seq));
-               offset = (this_offset - last_offset);
-               offset *= NSEC_PER_TICK / hpet_tick;
-       } else {
-               do {
-                       seq = read_seqbegin(&xtime_lock);
-
-                       last_offset = vxtime.last_tsc;
-                       base = monotonic_base;
-               } while (read_seqretry(&xtime_lock, seq));
-               this_offset = get_cycles_sync();
-               offset = cycles_2_ns(this_offset - last_offset);
-       }
-       return base + offset;
-}
-EXPORT_SYMBOL(monotonic_clock);
-
-static noinline void handle_lost_ticks(int lost)
-{
-       static long lost_count;
-       static int warned;
-       if (report_lost_ticks) {
-               printk(KERN_WARNING "time.c: Lost %d timer tick(s)! ", lost);
-               print_symbol("rip %s)\n", get_irq_regs()->rip);
-       }
-
-       if (lost_count == 1000 && !warned) {
-               printk(KERN_WARNING "warning: many lost ticks.\n"
-                      KERN_WARNING "Your time source seems to be instable or "
-                               "some driver is hogging interupts\n");
-               print_symbol("rip %s\n", get_irq_regs()->rip);
-               if (vxtime.mode == VXTIME_TSC && vxtime.hpet_address) {
-                       printk(KERN_WARNING "Falling back to HPET\n");
-                       if (hpet_use_timer)
-                               vxtime.last = hpet_readl(HPET_T0_CMP) - 
-                                                       hpet_tick;
-                       else
-                               vxtime.last = hpet_readl(HPET_COUNTER);
-                       vxtime.mode = VXTIME_HPET;
-                       do_gettimeoffset = do_gettimeoffset_hpet;
-               }
-               /* else should fall back to PIT, but code missing. */
-               warned = 1;
-       } else
-               lost_count++;
-
-#ifdef CONFIG_CPU_FREQ
-       /* In some cases the CPU can change frequency without us noticing
-          Give cpufreq a change to catch up. */
-       if ((lost_count+1) % 25 == 0)
-               cpufreq_delayed_get();
-#endif
-}
-
 void main_timer_handler(void)
 {
        static unsigned long rtc_update = 0;
-       unsigned long tsc;
-       int delay = 0, offset = 0, lost = 0;
-
 /*
  * Here we are in the timer irq handler. We have irqs locally disabled (so we
  * don't need spin_lock_irqsave()) but we don't know if the timer_bh is running
@@ -354,72 +156,11 @@ void main_timer_handler(void)
 
        write_seqlock(&xtime_lock);
 
-       if (vxtime.hpet_address)
-               offset = hpet_readl(HPET_COUNTER);
-
-       if (hpet_use_timer) {
-               /* if we're using the hpet timer functionality,
-                * we can more accurately know the counter value
-                * when the timer interrupt occured.
-                */
-               offset = hpet_readl(HPET_T0_CMP) - hpet_tick;
-               delay = hpet_readl(HPET_COUNTER) - offset;
-       } else if (!pmtmr_ioport) {
-               spin_lock(&i8253_lock);
-               outb_p(0x00, 0x43);
-               delay = inb_p(0x40);
-               delay |= inb(0x40) << 8;
-               spin_unlock(&i8253_lock);
-               delay = LATCH - 1 - delay;
-       }
-
-       tsc = get_cycles_sync();
-
-       if (vxtime.mode == VXTIME_HPET) {
-               if (offset - vxtime.last > hpet_tick) {
-                       lost = (offset - vxtime.last) / hpet_tick - 1;
-               }
-
-               monotonic_base += 
-                       (offset - vxtime.last) * NSEC_PER_TICK / hpet_tick;
-
-               vxtime.last = offset;
-#ifdef CONFIG_X86_PM_TIMER
-       } else if (vxtime.mode == VXTIME_PMTMR) {
-               lost = pmtimer_mark_offset();
-#endif
-       } else {
-               offset = (((tsc - vxtime.last_tsc) *
-                          vxtime.tsc_quot) >> US_SCALE) - USEC_PER_TICK;
-
-               if (offset < 0)
-                       offset = 0;
-
-               if (offset > USEC_PER_TICK) {
-                       lost = offset / USEC_PER_TICK;
-                       offset %= USEC_PER_TICK;
-               }
-
-               monotonic_base += cycles_2_ns(tsc - vxtime.last_tsc);
-
-               vxtime.last_tsc = tsc - vxtime.quot * delay / vxtime.tsc_quot;
-
-               if ((((tsc - vxtime.last_tsc) *
-                     vxtime.tsc_quot) >> US_SCALE) < offset)
-                       vxtime.last_tsc = tsc -
-                               (((long) offset << US_SCALE) / vxtime.tsc_quot) - 1;
-       }
-
-       if (lost > 0)
-               handle_lost_ticks(lost);
-       else
-               lost = 0;
-
 /*
  * Do the timer stuff.
  */
 
-       do_timer(lost + 1);
+       do_timer(1);
 #ifndef CONFIG_SMP
        update_process_times(user_mode(get_irq_regs()));
 #endif
@@ -460,40 +201,6 @@ static irqreturn_t timer_interrupt(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static unsigned int cyc2ns_scale __read_mostly;
-
-static inline void set_cyc2ns_scale(unsigned long cpu_khz)
-{
-       cyc2ns_scale = (NSEC_PER_MSEC << NS_SCALE) / cpu_khz;
-}
-
-static inline unsigned long long cycles_2_ns(unsigned long long cyc)
-{
-       return (cyc * cyc2ns_scale) >> NS_SCALE;
-}
-
-unsigned long long sched_clock(void)
-{
-       unsigned long a = 0;
-
-#if 0
-       /* Don't do a HPET read here. Using TSC always is much faster
-          and HPET may not be mapped yet when the scheduler first runs.
-           Disadvantage is a small drift between CPUs in some configurations,
-          but that should be tolerable. */
-       if (__vxtime.mode == VXTIME_HPET)
-               return (hpet_readl(HPET_COUNTER) * vxtime.quot) >> US_SCALE;
-#endif
-
-       /* Could do CPU core sync here. Opteron can execute rdtsc speculatively,
-          which means it is not completely exact and may not be monotonous between
-          CPUs. But the errors should be too small to matter for scheduling
-          purposes. */
-
-       rdtscll(a);
-       return cycles_2_ns(a);
-}
-
 static unsigned long get_cmos_time(void)
 {
        unsigned int year, mon, day, hour, min, sec;
@@ -545,159 +252,6 @@ static unsigned long get_cmos_time(void)
        return mktime(year, mon, day, hour, min, sec);
 }
 
-#ifdef CONFIG_CPU_FREQ
-
-/* Frequency scaling support. Adjust the TSC based timer when the cpu frequency
-   changes.
-   
-   RED-PEN: On SMP we assume all CPUs run with the same frequency.  It's
-   not that important because current Opteron setups do not support
-   scaling on SMP anyroads.
-
-   Should fix up last_tsc too. Currently gettimeofday in the
-   first tick after the change will be slightly wrong. */
-
-#include <linux/workqueue.h>
-
-static unsigned int cpufreq_delayed_issched = 0;
-static unsigned int cpufreq_init = 0;
-static struct work_struct cpufreq_delayed_get_work;
-
-static void handle_cpufreq_delayed_get(struct work_struct *v)
-{
-       unsigned int cpu;
-       for_each_online_cpu(cpu) {
-               cpufreq_get(cpu);
-       }
-       cpufreq_delayed_issched = 0;
-}
-
-/* if we notice lost ticks, schedule a call to cpufreq_get() as it tries
- * to verify the CPU frequency the timing core thinks the CPU is running
- * at is still correct.
- */
-static void cpufreq_delayed_get(void)
-{
-       static int warned;
-       if (cpufreq_init && !cpufreq_delayed_issched) {
-               cpufreq_delayed_issched = 1;
-               if (!warned) {
-                       warned = 1;
-                       printk(KERN_DEBUG 
-       "Losing some ticks... checking if CPU frequency changed.\n");
-               }
-               schedule_work(&cpufreq_delayed_get_work);
-       }
-}
-
-static unsigned int  ref_freq = 0;
-static unsigned long loops_per_jiffy_ref = 0;
-
-static unsigned long cpu_khz_ref = 0;
-
-static int time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
-                                void *data)
-{
-        struct cpufreq_freqs *freq = data;
-       unsigned long *lpj, dummy;
-
-       if (cpu_has(&cpu_data[freq->cpu], X86_FEATURE_CONSTANT_TSC))
-               return 0;
-
-       lpj = &dummy;
-       if (!(freq->flags & CPUFREQ_CONST_LOOPS))
-#ifdef CONFIG_SMP
-               lpj = &cpu_data[freq->cpu].loops_per_jiffy;
-#else
-               lpj = &boot_cpu_data.loops_per_jiffy;
-#endif
-
-       if (!ref_freq) {
-               ref_freq = freq->old;
-               loops_per_jiffy_ref = *lpj;
-               cpu_khz_ref = cpu_khz;
-       }
-        if ((val == CPUFREQ_PRECHANGE  && freq->old < freq->new) ||
-            (val == CPUFREQ_POSTCHANGE && freq->old > freq->new) ||
-           (val == CPUFREQ_RESUMECHANGE)) {
-                *lpj =
-               cpufreq_scale(loops_per_jiffy_ref, ref_freq, freq->new);
-
-               cpu_khz = cpufreq_scale(cpu_khz_ref, ref_freq, freq->new);
-               if (!(freq->flags & CPUFREQ_CONST_LOOPS))
-                       vxtime.tsc_quot = (USEC_PER_MSEC << US_SCALE) / cpu_khz;
-       }
-       
-       set_cyc2ns_scale(cpu_khz_ref);
-
-       return 0;
-}
-static struct notifier_block time_cpufreq_notifier_block = {
-         .notifier_call  = time_cpufreq_notifier
-};
-
-static int __init cpufreq_tsc(void)
-{
-       INIT_WORK(&cpufreq_delayed_get_work, handle_cpufreq_delayed_get);
-       if (!cpufreq_register_notifier(&time_cpufreq_notifier_block,
-                                      CPUFREQ_TRANSITION_NOTIFIER))
-               cpufreq_init = 1;
-       return 0;
-}
-
-core_initcall(cpufreq_tsc);
-
-#endif
-
-/*
- * calibrate_tsc() calibrates the processor TSC in a very simple way, comparing
- * it to the HPET timer of known frequency.
- */
-
-#define TICK_COUNT 100000000
-#define TICK_MIN   5000
-
-/*
- * Some platforms take periodic SMI interrupts with 5ms duration. Make sure none
- * occurs between the reads of the hpet & TSC.
- */
-static void __init read_hpet_tsc(int *hpet, int *tsc)
-{
-       int tsc1, tsc2, hpet1;
-
-       do {
-               tsc1 = get_cycles_sync();
-               hpet1 = hpet_readl(HPET_COUNTER);
-               tsc2 = get_cycles_sync();
-       } while (tsc2 - tsc1 > TICK_MIN);
-       *hpet = hpet1;
-       *tsc = tsc2;
-}
-
-
-static unsigned int __init hpet_calibrate_tsc(void)
-{
-       int tsc_start, hpet_start;
-       int tsc_now, hpet_now;
-       unsigned long flags;
-
-       local_irq_save(flags);
-       local_irq_disable();
-
-       read_hpet_tsc(&hpet_start, &tsc_start);
-
-       do {
-               local_irq_disable();
-               read_hpet_tsc(&hpet_now, &tsc_now);
-               local_irq_restore(flags);
-       } while ((tsc_now - tsc_start) < TICK_COUNT &&
-                (hpet_now - hpet_start) < TICK_COUNT);
-
-       return (tsc_now - tsc_start) * 1000000000L
-               / ((hpet_now - hpet_start) * hpet_period / 1000);
-}
-
 
 /*
  * pit_calibrate_tsc() uses the speaker output (channel 2) of
@@ -728,124 +282,6 @@ static unsigned int __init pit_calibrate_tsc(void)
        return (end - start) / 50;
 }
 
-#ifdef CONFIG_HPET
-static __init int late_hpet_init(void)
-{
-       struct hpet_data        hd;
-       unsigned int            ntimer;
-
-       if (!vxtime.hpet_address)
-               return 0;
-
-       memset(&hd, 0, sizeof (hd));
-
-       ntimer = hpet_readl(HPET_ID);
-       ntimer = (ntimer & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT;
-       ntimer++;
-
-       /*
-        * Register with driver.
-        * Timer0 and Timer1 is used by platform.
-        */
-       hd.hd_phys_address = vxtime.hpet_address;
-       hd.hd_address = (void __iomem *)fix_to_virt(FIX_HPET_BASE);
-       hd.hd_nirqs = ntimer;
-       hd.hd_flags = HPET_DATA_PLATFORM;
-       hpet_reserve_timer(&hd, 0);
-#ifdef CONFIG_HPET_EMULATE_RTC
-       hpet_reserve_timer(&hd, 1);
-#endif
-       hd.hd_irq[0] = HPET_LEGACY_8254;
-       hd.hd_irq[1] = HPET_LEGACY_RTC;
-       if (ntimer > 2) {
-               struct hpet             *hpet;
-               struct hpet_timer       *timer;
-               int                     i;
-
-               hpet = (struct hpet *) fix_to_virt(FIX_HPET_BASE);
-               timer = &hpet->hpet_timers[2];
-               for (i = 2; i < ntimer; timer++, i++)
-                       hd.hd_irq[i] = (timer->hpet_config &
-                                       Tn_INT_ROUTE_CNF_MASK) >>
-                               Tn_INT_ROUTE_CNF_SHIFT;
-
-       }
-
-       hpet_alloc(&hd);
-       return 0;
-}
-fs_initcall(late_hpet_init);
-#endif
-
-static int hpet_timer_stop_set_go(unsigned long tick)
-{
-       unsigned int cfg;
-
-/*
- * Stop the timers and reset the main counter.
- */
-
-       cfg = hpet_readl(HPET_CFG);
-       cfg &= ~(HPET_CFG_ENABLE | HPET_CFG_LEGACY);
-       hpet_writel(cfg, HPET_CFG);
-       hpet_writel(0, HPET_COUNTER);
-       hpet_writel(0, HPET_COUNTER + 4);
-
-/*
- * Set up timer 0, as periodic with first interrupt to happen at hpet_tick,
- * and period also hpet_tick.
- */
-       if (hpet_use_timer) {
-               hpet_writel(HPET_TN_ENABLE | HPET_TN_PERIODIC | HPET_TN_SETVAL |
-                   HPET_TN_32BIT, HPET_T0_CFG);
-               hpet_writel(hpet_tick, HPET_T0_CMP); /* next interrupt */
-               hpet_writel(hpet_tick, HPET_T0_CMP); /* period */
-               cfg |= HPET_CFG_LEGACY;
-       }
-/*
- * Go!
- */
-
-       cfg |= HPET_CFG_ENABLE;
-       hpet_writel(cfg, HPET_CFG);
-
-       return 0;
-}
-
-static int hpet_init(void)
-{
-       unsigned int id;
-
-       if (!vxtime.hpet_address)
-               return -1;
-       set_fixmap_nocache(FIX_HPET_BASE, vxtime.hpet_address);
-       __set_fixmap(VSYSCALL_HPET, vxtime.hpet_address, PAGE_KERNEL_VSYSCALL_NOCACHE);
-
-/*
- * Read the period, compute tick and quotient.
- */
-
-       id = hpet_readl(HPET_ID);
-
-       if (!(id & HPET_ID_VENDOR) || !(id & HPET_ID_NUMBER))
-               return -1;
-
-       hpet_period = hpet_readl(HPET_PERIOD);
-       if (hpet_period < 100000 || hpet_period > 100000000)
-               return -1;
-
-       hpet_tick = (FSEC_PER_TICK + hpet_period / 2) / hpet_period;
-
-       hpet_use_timer = (id & HPET_ID_LEGSUP);
-
-       return hpet_timer_stop_set_go(hpet_tick);
-}
-
-static int hpet_reenable(void)
-{
-       return hpet_timer_stop_set_go(hpet_tick);
-}
-
 #define PIT_MODE 0x43
 #define PIT_CH0  0x40
 
@@ -873,7 +309,7 @@ void __init pit_stop_interrupt(void)
 void __init stop_timer_interrupt(void)
 {
        char *name;
-       if (vxtime.hpet_address) {
+       if (hpet_address) {
                name = "HPET";
                hpet_timer_stop_set_go(0);
        } else {
@@ -883,12 +319,6 @@ void __init stop_timer_interrupt(void)
        printk(KERN_INFO "timer: %s interrupt stopped.\n", name);
 }
 
-int __init time_setup(char *str)
-{
-       report_lost_ticks = 1;
-       return 1;
-}
-
 static struct irqaction irq0 = {
        timer_interrupt, IRQF_DISABLED, CPU_MASK_NONE, "timer", NULL, NULL
 };
@@ -896,124 +326,41 @@ static struct irqaction irq0 = {
 void __init time_init(void)
 {
        if (nohpet)
-               vxtime.hpet_address = 0;
-
+               hpet_address = 0;
        xtime.tv_sec = get_cmos_time();
        xtime.tv_nsec = 0;
 
        set_normalized_timespec(&wall_to_monotonic,
                                -xtime.tv_sec, -xtime.tv_nsec);
 
-       if (!hpet_init())
-                vxtime_hz = (FSEC_PER_SEC + hpet_period / 2) / hpet_period;
-       else
-               vxtime.hpet_address = 0;
+       if (hpet_arch_init())
+               hpet_address = 0;
 
        if (hpet_use_timer) {
                /* set tick_nsec to use the proper rate for HPET */
                tick_nsec = TICK_NSEC_HPET;
                cpu_khz = hpet_calibrate_tsc();
                timename = "HPET";
-#ifdef CONFIG_X86_PM_TIMER
-       } else if (pmtmr_ioport && !vxtime.hpet_address) {
-               vxtime_hz = PM_TIMER_FREQUENCY;
-               timename = "PM";
-               pit_init();
-               cpu_khz = pit_calibrate_tsc();
-#endif
        } else {
                pit_init();
                cpu_khz = pit_calibrate_tsc();
                timename = "PIT";
        }
 
-       vxtime.mode = VXTIME_TSC;
-       vxtime.quot = (USEC_PER_SEC << US_SCALE) / vxtime_hz;
-       vxtime.tsc_quot = (USEC_PER_MSEC << US_SCALE) / cpu_khz;
-       vxtime.last_tsc = get_cycles_sync();
-       set_cyc2ns_scale(cpu_khz);
-       setup_irq(0, &irq0);
-
-#ifndef CONFIG_SMP
-       time_init_gtod();
-#endif
-}
-
-/*
- * Make an educated guess if the TSC is trustworthy and synchronized
- * over all CPUs.
- */
-__cpuinit int unsynchronized_tsc(void)
-{
-#ifdef CONFIG_SMP
-       if (apic_is_clustered_box())
-               return 1;
-#endif
-       /* Most intel systems have synchronized TSCs except for
-          multi node systems */
-       if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) {
-#ifdef CONFIG_ACPI
-               /* But TSC doesn't tick in C3 so don't use it there */
-               if (acpi_gbl_FADT.header.length > 0 && acpi_gbl_FADT.C3latency < 1000)
-                       return 1;
-#endif
-               return 0;
-       }
-
-       /* Assume multi socket systems are not synchronized */
-       return num_present_cpus() > 1;
-}
-
-/*
- * Decide what mode gettimeofday should use.
- */
-void time_init_gtod(void)
-{
-       char *timetype;
-
        if (unsynchronized_tsc())
-               notsc = 1;
+               mark_tsc_unstable();
 
-       if (cpu_has(&boot_cpu_data, X86_FEATURE_RDTSCP))
+       if (cpu_has(&boot_cpu_data, X86_FEATURE_RDTSCP))
                vgetcpu_mode = VGETCPU_RDTSCP;
        else
                vgetcpu_mode = VGETCPU_LSL;
 
-       if (vxtime.hpet_address && notsc) {
-               timetype = hpet_use_timer ? "HPET" : "PIT/HPET";
-               if (hpet_use_timer)
-                       vxtime.last = hpet_readl(HPET_T0_CMP) - hpet_tick;
-               else
-                       vxtime.last = hpet_readl(HPET_COUNTER);
-               vxtime.mode = VXTIME_HPET;
-               do_gettimeoffset = do_gettimeoffset_hpet;
-#ifdef CONFIG_X86_PM_TIMER
-       /* Using PM for gettimeofday is quite slow, but we have no other
-          choice because the TSC is too unreliable on some systems. */
-       } else if (pmtmr_ioport && !vxtime.hpet_address && notsc) {
-               timetype = "PM";
-               do_gettimeoffset = do_gettimeoffset_pm;
-               vxtime.mode = VXTIME_PMTMR;
-               sysctl_vsyscall = 0;
-               printk(KERN_INFO "Disabling vsyscall due to use of PM timer\n");
-#endif
-       } else {
-               timetype = hpet_use_timer ? "HPET/TSC" : "PIT/TSC";
-               vxtime.mode = VXTIME_TSC;
-       }
-
-       printk(KERN_INFO "time.c: Using %ld.%06ld MHz WALL %s GTOD %s timer.\n",
-              vxtime_hz / 1000000, vxtime_hz % 1000000, timename, timetype);
+       set_cyc2ns_scale(cpu_khz);
        printk(KERN_INFO "time.c: Detected %d.%03d MHz processor.\n",
                cpu_khz / 1000, cpu_khz % 1000);
-       vxtime.quot = (USEC_PER_SEC << US_SCALE) / vxtime_hz;
-       vxtime.tsc_quot = (USEC_PER_MSEC << US_SCALE) / cpu_khz;
-       vxtime.last_tsc = get_cycles_sync();
-
-       set_cyc2ns_scale(cpu_khz);
+       setup_irq(0, &irq0);
 }
 
-__setup("report_lost_ticks", time_setup);
 
 static long clock_cmos_diff;
 static unsigned long sleep_start;
@@ -1050,7 +397,7 @@ static int timer_resume(struct sys_device *dev)
                sleep_length = 0;
                ctime = sleep_start;
        }
-       if (vxtime.hpet_address)
+       if (hpet_address)
                hpet_reenable();
        else
                i8254_timer_resume();
@@ -1059,20 +406,8 @@ static int timer_resume(struct sys_device *dev)
        write_seqlock_irqsave(&xtime_lock,flags);
        xtime.tv_sec = sec;
        xtime.tv_nsec = 0;
-       if (vxtime.mode == VXTIME_HPET) {
-               if (hpet_use_timer)
-                       vxtime.last = hpet_readl(HPET_T0_CMP) - hpet_tick;
-               else
-                       vxtime.last = hpet_readl(HPET_COUNTER);
-#ifdef CONFIG_X86_PM_TIMER
-       } else if (vxtime.mode == VXTIME_PMTMR) {
-               pmtimer_resume();
-#endif
-       } else
-               vxtime.last_tsc = get_cycles_sync();
-       write_sequnlock_irqrestore(&xtime_lock,flags);
        jiffies += sleep_length;
-       monotonic_base += sleep_length * (NSEC_PER_SEC/HZ);
+       write_sequnlock_irqrestore(&xtime_lock,flags);
        touch_softlockup_watchdog();
        return 0;
 }
@@ -1098,269 +433,3 @@ static int time_init_device(void)
 }
 
 device_initcall(time_init_device);
-
-#ifdef CONFIG_HPET_EMULATE_RTC
-/* HPET in LegacyReplacement Mode eats up RTC interrupt line. When, HPET
- * is enabled, we support RTC interrupt functionality in software.
- * RTC has 3 kinds of interrupts:
- * 1) Update Interrupt - generate an interrupt, every sec, when RTC clock
- *    is updated
- * 2) Alarm Interrupt - generate an interrupt at a specific time of day
- * 3) Periodic Interrupt - generate periodic interrupt, with frequencies
- *    2Hz-8192Hz (2Hz-64Hz for non-root user) (all freqs in powers of 2)
- * (1) and (2) above are implemented using polling at a frequency of
- * 64 Hz. The exact frequency is a tradeoff between accuracy and interrupt
- * overhead. (DEFAULT_RTC_INT_FREQ)
- * For (3), we use interrupts at 64Hz or user specified periodic
- * frequency, whichever is higher.
- */
-#include <linux/rtc.h>
-
-#define DEFAULT_RTC_INT_FREQ   64
-#define RTC_NUM_INTS           1
-
-static unsigned long UIE_on;
-static unsigned long prev_update_sec;
-
-static unsigned long AIE_on;
-static struct rtc_time alarm_time;
-
-static unsigned long PIE_on;
-static unsigned long PIE_freq = DEFAULT_RTC_INT_FREQ;
-static unsigned long PIE_count;
-
-static unsigned long hpet_rtc_int_freq; /* RTC interrupt frequency */
-static unsigned int hpet_t1_cmp; /* cached comparator register */
-
-int is_hpet_enabled(void)
-{
-       return vxtime.hpet_address != 0;
-}
-
-/*
- * Timer 1 for RTC, we do not use periodic interrupt feature,
- * even if HPET supports periodic interrupts on Timer 1.
- * The reason being, to set up a periodic interrupt in HPET, we need to
- * stop the main counter. And if we do that everytime someone diables/enables
- * RTC, we will have adverse effect on main kernel timer running on Timer 0.
- * So, for the time being, simulate the periodic interrupt in software.
- *
- * hpet_rtc_timer_init() is called for the first time and during subsequent
- * interuppts reinit happens through hpet_rtc_timer_reinit().
- */
-int hpet_rtc_timer_init(void)
-{
-       unsigned int cfg, cnt;
-       unsigned long flags;
-
-       if (!is_hpet_enabled())
-               return 0;
-       /*
-        * Set the counter 1 and enable the interrupts.
-        */
-       if (PIE_on && (PIE_freq > DEFAULT_RTC_INT_FREQ))
-               hpet_rtc_int_freq = PIE_freq;
-       else
-               hpet_rtc_int_freq = DEFAULT_RTC_INT_FREQ;
-
-       local_irq_save(flags);
-
-       cnt = hpet_readl(HPET_COUNTER);
-       cnt += ((hpet_tick*HZ)/hpet_rtc_int_freq);
-       hpet_writel(cnt, HPET_T1_CMP);
-       hpet_t1_cmp = cnt;
-
-       cfg = hpet_readl(HPET_T1_CFG);
-       cfg &= ~HPET_TN_PERIODIC;
-       cfg |= HPET_TN_ENABLE | HPET_TN_32BIT;
-       hpet_writel(cfg, HPET_T1_CFG);
-
-       local_irq_restore(flags);
-
-       return 1;
-}
-
-static void hpet_rtc_timer_reinit(void)
-{
-       unsigned int cfg, cnt, ticks_per_int, lost_ints;
-
-       if (unlikely(!(PIE_on | AIE_on | UIE_on))) {
-               cfg = hpet_readl(HPET_T1_CFG);
-               cfg &= ~HPET_TN_ENABLE;
-               hpet_writel(cfg, HPET_T1_CFG);
-               return;
-       }
-
-       if (PIE_on && (PIE_freq > DEFAULT_RTC_INT_FREQ))
-               hpet_rtc_int_freq = PIE_freq;
-       else
-               hpet_rtc_int_freq = DEFAULT_RTC_INT_FREQ;
-
-       /* It is more accurate to use the comparator value than current count.*/
-       ticks_per_int = hpet_tick * HZ / hpet_rtc_int_freq;
-       hpet_t1_cmp += ticks_per_int;
-       hpet_writel(hpet_t1_cmp, HPET_T1_CMP);
-
-       /*
-        * If the interrupt handler was delayed too long, the write above tries
-        * to schedule the next interrupt in the past and the hardware would
-        * not interrupt until the counter had wrapped around.
-        * So we have to check that the comparator wasn't set to a past time.
-        */
-       cnt = hpet_readl(HPET_COUNTER);
-       if (unlikely((int)(cnt - hpet_t1_cmp) > 0)) {
-               lost_ints = (cnt - hpet_t1_cmp) / ticks_per_int + 1;
-               /* Make sure that, even with the time needed to execute
-                * this code, the next scheduled interrupt has been moved
-                * back to the future: */
-               lost_ints++;
-
-               hpet_t1_cmp += lost_ints * ticks_per_int;
-               hpet_writel(hpet_t1_cmp, HPET_T1_CMP);
-
-               if (PIE_on)
-                       PIE_count += lost_ints;
-
-               printk(KERN_WARNING "rtc: lost some interrupts at %ldHz.\n",
-                      hpet_rtc_int_freq);
-       }
-}
-
-/*
- * The functions below are called from rtc driver.
- * Return 0 if HPET is not being used.
- * Otherwise do the necessary changes and return 1.
- */
-int hpet_mask_rtc_irq_bit(unsigned long bit_mask)
-{
-       if (!is_hpet_enabled())
-               return 0;
-
-       if (bit_mask & RTC_UIE)
-               UIE_on = 0;
-       if (bit_mask & RTC_PIE)
-               PIE_on = 0;
-       if (bit_mask & RTC_AIE)
-               AIE_on = 0;
-
-       return 1;
-}
-
-int hpet_set_rtc_irq_bit(unsigned long bit_mask)
-{
-       int timer_init_reqd = 0;
-
-       if (!is_hpet_enabled())
-               return 0;
-
-       if (!(PIE_on | AIE_on | UIE_on))
-               timer_init_reqd = 1;
-
-       if (bit_mask & RTC_UIE) {
-               UIE_on = 1;
-       }
-       if (bit_mask & RTC_PIE) {
-               PIE_on = 1;
-               PIE_count = 0;
-       }
-       if (bit_mask & RTC_AIE) {
-               AIE_on = 1;
-       }
-
-       if (timer_init_reqd)
-               hpet_rtc_timer_init();
-
-       return 1;
-}
-
-int hpet_set_alarm_time(unsigned char hrs, unsigned char min, unsigned char sec)
-{
-       if (!is_hpet_enabled())
-               return 0;
-
-       alarm_time.tm_hour = hrs;
-       alarm_time.tm_min = min;
-       alarm_time.tm_sec = sec;
-
-       return 1;
-}
-
-int hpet_set_periodic_freq(unsigned long freq)
-{
-       if (!is_hpet_enabled())
-               return 0;
-
-       PIE_freq = freq;
-       PIE_count = 0;
-
-       return 1;
-}
-
-int hpet_rtc_dropped_irq(void)
-{
-       if (!is_hpet_enabled())
-               return 0;
-
-       return 1;
-}
-
-irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-{
-       struct rtc_time curr_time;
-       unsigned long rtc_int_flag = 0;
-       int call_rtc_interrupt = 0;
-
-       hpet_rtc_timer_reinit();
-
-       if (UIE_on | AIE_on) {
-               rtc_get_rtc_time(&curr_time);
-       }
-       if (UIE_on) {
-               if (curr_time.tm_sec != prev_update_sec) {
-                       /* Set update int info, call real rtc int routine */
-                       call_rtc_interrupt = 1;
-                       rtc_int_flag = RTC_UF;
-                       prev_update_sec = curr_time.tm_sec;
-               }
-       }
-       if (PIE_on) {
-               PIE_count++;
-               if (PIE_count >= hpet_rtc_int_freq/PIE_freq) {
-                       /* Set periodic int info, call real rtc int routine */
-                       call_rtc_interrupt = 1;
-                       rtc_int_flag |= RTC_PF;
-                       PIE_count = 0;
-               }
-       }
-       if (AIE_on) {
-               if ((curr_time.tm_sec == alarm_time.tm_sec) &&
-                   (curr_time.tm_min == alarm_time.tm_min) &&
-                   (curr_time.tm_hour == alarm_time.tm_hour)) {
-                       /* Set alarm int info, call real rtc int routine */
-                       call_rtc_interrupt = 1;
-                       rtc_int_flag |= RTC_AF;
-               }
-       }
-       if (call_rtc_interrupt) {
-               rtc_int_flag |= (RTC_IRQF | (RTC_NUM_INTS << 8));
-               rtc_interrupt(rtc_int_flag, dev_id);
-       }
-       return IRQ_HANDLED;
-}
-#endif
-
-static int __init nohpet_setup(char *s) 
-{ 
-       nohpet = 1;
-       return 1;
-} 
-
-__setup("nohpet", nohpet_setup);
-
-int __init notsc_setup(char *s)
-{
-       notsc = 1;
-       return 1;
-}
-
-__setup("notsc", notsc_setup);
diff --git a/arch/x86_64/kernel/tsc.c b/arch/x86_64/kernel/tsc.c
new file mode 100644 (file)
index 0000000..8958318
--- /dev/null
@@ -0,0 +1,226 @@
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/clocksource.h>
+#include <linux/time.h>
+#include <linux/acpi.h>
+#include <linux/cpufreq.h>
+
+#include <asm/timex.h>
+
+static int notsc __initdata = 0;
+
+unsigned int cpu_khz;          /* TSC clocks / usec, not used here */
+EXPORT_SYMBOL(cpu_khz);
+
+static unsigned int cyc2ns_scale __read_mostly;
+
+void set_cyc2ns_scale(unsigned long khz)
+{
+       cyc2ns_scale = (NSEC_PER_MSEC << NS_SCALE) / khz;
+}
+
+static unsigned long long cycles_2_ns(unsigned long long cyc)
+{
+       return (cyc * cyc2ns_scale) >> NS_SCALE;
+}
+
+unsigned long long sched_clock(void)
+{
+       unsigned long a = 0;
+
+       /* Could do CPU core sync here. Opteron can execute rdtsc speculatively,
+        * which means it is not completely exact and may not be monotonous
+        * between CPUs. But the errors should be too small to matter for
+        * scheduling purposes.
+        */
+
+       rdtscll(a);
+       return cycles_2_ns(a);
+}
+
+static int tsc_unstable;
+
+static inline int check_tsc_unstable(void)
+{
+       return tsc_unstable;
+}
+#ifdef CONFIG_CPU_FREQ
+
+/* Frequency scaling support. Adjust the TSC based timer when the cpu frequency
+ * changes.
+ *
+ * RED-PEN: On SMP we assume all CPUs run with the same frequency.  It's
+ * not that important because current Opteron setups do not support
+ * scaling on SMP anyroads.
+ *
+ * Should fix up last_tsc too. Currently gettimeofday in the
+ * first tick after the change will be slightly wrong.
+ */
+
+#include <linux/workqueue.h>
+
+static unsigned int cpufreq_delayed_issched = 0;
+static unsigned int cpufreq_init = 0;
+static struct work_struct cpufreq_delayed_get_work;
+
+static void handle_cpufreq_delayed_get(struct work_struct *v)
+{
+       unsigned int cpu;
+       for_each_online_cpu(cpu) {
+               cpufreq_get(cpu);
+       }
+       cpufreq_delayed_issched = 0;
+}
+
+static unsigned int  ref_freq = 0;
+static unsigned long loops_per_jiffy_ref = 0;
+
+static unsigned long cpu_khz_ref = 0;
+
+static int time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
+                                void *data)
+{
+       struct cpufreq_freqs *freq = data;
+       unsigned long *lpj, dummy;
+
+       if (cpu_has(&cpu_data[freq->cpu], X86_FEATURE_CONSTANT_TSC))
+               return 0;
+
+       lpj = &dummy;
+       if (!(freq->flags & CPUFREQ_CONST_LOOPS))
+#ifdef CONFIG_SMP
+               lpj = &cpu_data[freq->cpu].loops_per_jiffy;
+#else
+               lpj = &boot_cpu_data.loops_per_jiffy;
+#endif
+
+       if (!ref_freq) {
+               ref_freq = freq->old;
+               loops_per_jiffy_ref = *lpj;
+               cpu_khz_ref = cpu_khz;
+       }
+       if ((val == CPUFREQ_PRECHANGE  && freq->old < freq->new) ||
+               (val == CPUFREQ_POSTCHANGE && freq->old > freq->new) ||
+               (val == CPUFREQ_RESUMECHANGE)) {
+               *lpj =
+               cpufreq_scale(loops_per_jiffy_ref, ref_freq, freq->new);
+
+               cpu_khz = cpufreq_scale(cpu_khz_ref, ref_freq, freq->new);
+               if (!(freq->flags & CPUFREQ_CONST_LOOPS))
+                       mark_tsc_unstable();
+       }
+
+       set_cyc2ns_scale(cpu_khz_ref);
+
+       return 0;
+}
+
+static struct notifier_block time_cpufreq_notifier_block = {
+       .notifier_call  = time_cpufreq_notifier
+};
+
+static int __init cpufreq_tsc(void)
+{
+       INIT_WORK(&cpufreq_delayed_get_work, handle_cpufreq_delayed_get);
+       if (!cpufreq_register_notifier(&time_cpufreq_notifier_block,
+                                      CPUFREQ_TRANSITION_NOTIFIER))
+               cpufreq_init = 1;
+       return 0;
+}
+
+core_initcall(cpufreq_tsc);
+
+#endif
+
+static int tsc_unstable = 0;
+
+/*
+ * Make an educated guess if the TSC is trustworthy and synchronized
+ * over all CPUs.
+ */
+__cpuinit int unsynchronized_tsc(void)
+{
+       if (tsc_unstable)
+               return 1;
+
+#ifdef CONFIG_SMP
+       if (apic_is_clustered_box())
+               return 1;
+#endif
+       /* Most intel systems have synchronized TSCs except for
+          multi node systems */
+       if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) {
+#ifdef CONFIG_ACPI
+               /* But TSC doesn't tick in C3 so don't use it there */
+               if (acpi_gbl_FADT.header.length > 0 && acpi_gbl_FADT.C3latency < 1000)
+                       return 1;
+#endif
+               return 0;
+       }
+
+       /* Assume multi socket systems are not synchronized */
+       return num_present_cpus() > 1;
+}
+
+int __init notsc_setup(char *s)
+{
+       notsc = 1;
+       return 1;
+}
+
+__setup("notsc", notsc_setup);
+
+
+/* clock source code: */
+static cycle_t read_tsc(void)
+{
+       cycle_t ret = (cycle_t)get_cycles_sync();
+       return ret;
+}
+
+static cycle_t __vsyscall_fn vread_tsc(void)
+{
+       cycle_t ret = (cycle_t)get_cycles_sync();
+       return ret;
+}
+
+static struct clocksource clocksource_tsc = {
+       .name                   = "tsc",
+       .rating                 = 300,
+       .read                   = read_tsc,
+       .mask                   = CLOCKSOURCE_MASK(64),
+       .shift                  = 22,
+       .flags                  = CLOCK_SOURCE_IS_CONTINUOUS |
+                                 CLOCK_SOURCE_MUST_VERIFY,
+       .vread                  = vread_tsc,
+};
+
+void mark_tsc_unstable(void)
+{
+       if (!tsc_unstable) {
+               tsc_unstable = 1;
+               /* Change only the rating, when not registered */
+               if (clocksource_tsc.mult)
+                       clocksource_change_rating(&clocksource_tsc, 0);
+               else
+                       clocksource_tsc.rating = 0;
+       }
+}
+EXPORT_SYMBOL_GPL(mark_tsc_unstable);
+
+static int __init init_tsc_clocksource(void)
+{
+       if (!notsc) {
+               clocksource_tsc.mult = clocksource_khz2mult(cpu_khz,
+                                                       clocksource_tsc.shift);
+               if (check_tsc_unstable())
+                       clocksource_tsc.rating = 0;
+
+               return clocksource_register(&clocksource_tsc);
+       }
+       return 0;
+}
+
+module_init(init_tsc_clocksource);
diff --git a/arch/x86_64/kernel/tsc_sync.c b/arch/x86_64/kernel/tsc_sync.c
new file mode 100644 (file)
index 0000000..014f0db
--- /dev/null
@@ -0,0 +1,187 @@
+/*
+ * arch/x86_64/kernel/tsc_sync.c: check TSC synchronization.
+ *
+ * Copyright (C) 2006, Red Hat, Inc., Ingo Molnar
+ *
+ * We check whether all boot CPUs have their TSC's synchronized,
+ * print a warning if not and turn off the TSC clock-source.
+ *
+ * The warp-check is point-to-point between two CPUs, the CPU
+ * initiating the bootup is the 'source CPU', the freshly booting
+ * CPU is the 'target CPU'.
+ *
+ * Only two CPUs may participate - they can enter in any order.
+ * ( The serial nature of the boot logic and the CPU hotplug lock
+ *   protects against more than 2 CPUs entering this code. )
+ */
+#include <linux/spinlock.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/smp.h>
+#include <linux/nmi.h>
+#include <asm/tsc.h>
+
+/*
+ * Entry/exit counters that make sure that both CPUs
+ * run the measurement code at once:
+ */
+static __cpuinitdata atomic_t start_count;
+static __cpuinitdata atomic_t stop_count;
+
+/*
+ * We use a raw spinlock in this exceptional case, because
+ * we want to have the fastest, inlined, non-debug version
+ * of a critical section, to be able to prove TSC time-warps:
+ */
+static __cpuinitdata raw_spinlock_t sync_lock = __RAW_SPIN_LOCK_UNLOCKED;
+static __cpuinitdata cycles_t last_tsc;
+static __cpuinitdata cycles_t max_warp;
+static __cpuinitdata int nr_warps;
+
+/*
+ * TSC-warp measurement loop running on both CPUs:
+ */
+static __cpuinit void check_tsc_warp(void)
+{
+       cycles_t start, now, prev, end;
+       int i;
+
+       start = get_cycles_sync();
+       /*
+        * The measurement runs for 20 msecs:
+        */
+       end = start + cpu_khz * 20ULL;
+       now = start;
+
+       for (i = 0; ; i++) {
+               /*
+                * We take the global lock, measure TSC, save the
+                * previous TSC that was measured (possibly on
+                * another CPU) and update the previous TSC timestamp.
+                */
+               __raw_spin_lock(&sync_lock);
+               prev = last_tsc;
+               now = get_cycles_sync();
+               last_tsc = now;
+               __raw_spin_unlock(&sync_lock);
+
+               /*
+                * Be nice every now and then (and also check whether
+                * measurement is done [we also insert a 100 million
+                * loops safety exit, so we dont lock up in case the
+                * TSC readout is totally broken]):
+                */
+               if (unlikely(!(i & 7))) {
+                       if (now > end || i > 100000000)
+                               break;
+                       cpu_relax();
+                       touch_nmi_watchdog();
+               }
+               /*
+                * Outside the critical section we can now see whether
+                * we saw a time-warp of the TSC going backwards:
+                */
+               if (unlikely(prev > now)) {
+                       __raw_spin_lock(&sync_lock);
+                       max_warp = max(max_warp, prev - now);
+                       nr_warps++;
+                       __raw_spin_unlock(&sync_lock);
+               }
+
+       }
+}
+
+/*
+ * Source CPU calls into this - it waits for the freshly booted
+ * target CPU to arrive and then starts the measurement:
+ */
+void __cpuinit check_tsc_sync_source(int cpu)
+{
+       int cpus = 2;
+
+       /*
+        * No need to check if we already know that the TSC is not
+        * synchronized:
+        */
+       if (unsynchronized_tsc())
+               return;
+
+       printk(KERN_INFO "checking TSC synchronization [CPU#%d -> CPU#%d]:",
+                         smp_processor_id(), cpu);
+
+       /*
+        * Reset it - in case this is a second bootup:
+        */
+       atomic_set(&stop_count, 0);
+
+       /*
+        * Wait for the target to arrive:
+        */
+       while (atomic_read(&start_count) != cpus-1)
+               cpu_relax();
+       /*
+        * Trigger the target to continue into the measurement too:
+        */
+       atomic_inc(&start_count);
+
+       check_tsc_warp();
+
+       while (atomic_read(&stop_count) != cpus-1)
+               cpu_relax();
+
+       /*
+        * Reset it - just in case we boot another CPU later:
+        */
+       atomic_set(&start_count, 0);
+
+       if (nr_warps) {
+               printk("\n");
+               printk(KERN_WARNING "Measured %Ld cycles TSC warp between CPUs,"
+                                   " turning off TSC clock.\n", max_warp);
+               mark_tsc_unstable();
+               nr_warps = 0;
+               max_warp = 0;
+               last_tsc = 0;
+       } else {
+               printk(" passed.\n");
+       }
+
+       /*
+        * Let the target continue with the bootup:
+        */
+       atomic_inc(&stop_count);
+}
+
+/*
+ * Freshly booted CPUs call into this:
+ */
+void __cpuinit check_tsc_sync_target(void)
+{
+       int cpus = 2;
+
+       if (unsynchronized_tsc())
+               return;
+
+       /*
+        * Register this CPU's participation and wait for the
+        * source CPU to start the measurement:
+        */
+       atomic_inc(&start_count);
+       while (atomic_read(&start_count) != cpus)
+               cpu_relax();
+
+       check_tsc_warp();
+
+       /*
+        * Ok, we are done:
+        */
+       atomic_inc(&stop_count);
+
+       /*
+        * Wait for the source CPU to print stuff:
+        */
+       while (atomic_read(&stop_count) != cpus)
+               cpu_relax();
+}
+#undef NR_LOOPS
+
index 1e54ddf2338d7347149a1d3300294ce5d07f88b9..b73212c0a55001d0c24df52442a9b027879e3183 100644 (file)
@@ -88,31 +88,25 @@ SECTIONS
   __vsyscall_0 = VSYSCALL_VIRT_ADDR;
 
   . = ALIGN(CONFIG_X86_L1_CACHE_BYTES);
-  .xtime_lock : AT(VLOAD(.xtime_lock)) { *(.xtime_lock) }
-  xtime_lock = VVIRT(.xtime_lock);
-
-  .vxtime : AT(VLOAD(.vxtime)) { *(.vxtime) }
-  vxtime = VVIRT(.vxtime);
+  .vsyscall_fn : AT(VLOAD(.vsyscall_fn)) { *(.vsyscall_fn) }
+  . = ALIGN(CONFIG_X86_L1_CACHE_BYTES);
+  .vsyscall_gtod_data : AT(VLOAD(.vsyscall_gtod_data))
+               { *(.vsyscall_gtod_data) }
+  vsyscall_gtod_data = VVIRT(.vsyscall_gtod_data);
 
   .vgetcpu_mode : AT(VLOAD(.vgetcpu_mode)) { *(.vgetcpu_mode) }
   vgetcpu_mode = VVIRT(.vgetcpu_mode);
 
-  .sys_tz : AT(VLOAD(.sys_tz)) { *(.sys_tz) }
-  sys_tz = VVIRT(.sys_tz);
-
-  .sysctl_vsyscall : AT(VLOAD(.sysctl_vsyscall)) { *(.sysctl_vsyscall) }
-  sysctl_vsyscall = VVIRT(.sysctl_vsyscall);
-
-  .xtime : AT(VLOAD(.xtime)) { *(.xtime) }
-  xtime = VVIRT(.xtime);
-
   . = ALIGN(CONFIG_X86_L1_CACHE_BYTES);
   .jiffies : AT(VLOAD(.jiffies)) { *(.jiffies) }
   jiffies = VVIRT(.jiffies);
 
-  .vsyscall_1 ADDR(.vsyscall_0) + 1024: AT(VLOAD(.vsyscall_1)) { *(.vsyscall_1) }
-  .vsyscall_2 ADDR(.vsyscall_0) + 2048: AT(VLOAD(.vsyscall_2)) { *(.vsyscall_2) }
-  .vsyscall_3 ADDR(.vsyscall_0) + 3072: AT(VLOAD(.vsyscall_3)) { *(.vsyscall_3) }
+  .vsyscall_1 ADDR(.vsyscall_0) + 1024: AT(VLOAD(.vsyscall_1))
+               { *(.vsyscall_1) }
+  .vsyscall_2 ADDR(.vsyscall_0) + 2048: AT(VLOAD(.vsyscall_2))
+               { *(.vsyscall_2) }
+  .vsyscall_3 ADDR(.vsyscall_0) + 3072: AT(VLOAD(.vsyscall_3))
+               { *(.vsyscall_3) }
 
   . = VSYSCALL_VIRT_ADDR + 4096;
 
@@ -192,10 +186,14 @@ SECTIONS
      from .altinstructions and .eh_frame */
   .exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) { *(.exit.text) }
   .exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) { *(.exit.data) }
+
+#ifdef CONFIG_BLK_DEV_INITRD
   . = ALIGN(4096);
   __initramfs_start = .;
   .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { *(.init.ramfs) }
   __initramfs_end = .;
+#endif
+
     . = ALIGN(CONFIG_X86_L1_CACHE_BYTES);
   __per_cpu_start = .;
   .data.percpu  : AT(ADDR(.data.percpu) - LOAD_OFFSET) { *(.data.percpu) }
index 2433d6fc68b14faa4f51b9e841a0b1f9d755f3af..180ff919eaf91a85fd0e39f9146ed49aa7d1933b 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/seqlock.h>
 #include <linux/jiffies.h>
 #include <linux/sysctl.h>
+#include <linux/clocksource.h>
 #include <linux/getcpu.h>
 #include <linux/cpu.h>
 #include <linux/smp.h>
@@ -34,6 +35,7 @@
 #include <asm/vsyscall.h>
 #include <asm/pgtable.h>
 #include <asm/page.h>
+#include <asm/unistd.h>
 #include <asm/fixmap.h>
 #include <asm/errno.h>
 #include <asm/io.h>
 #define __vsyscall(nr) __attribute__ ((unused,__section__(".vsyscall_" #nr)))
 #define __syscall_clobber "r11","rcx","memory"
 
-int __sysctl_vsyscall __section_sysctl_vsyscall = 1;
-seqlock_t __xtime_lock __section_xtime_lock = SEQLOCK_UNLOCKED;
+struct vsyscall_gtod_data_t {
+       seqlock_t lock;
+       int sysctl_enabled;
+       struct timeval wall_time_tv;
+       struct timezone sys_tz;
+       cycle_t offset_base;
+       struct clocksource clock;
+};
 int __vgetcpu_mode __section_vgetcpu_mode;
 
-#include <asm/unistd.h>
-
-static __always_inline void timeval_normalize(struct timeval * tv)
+struct vsyscall_gtod_data_t __vsyscall_gtod_data __section_vsyscall_gtod_data =
 {
-       time_t __sec;
-
-       __sec = tv->tv_usec / 1000000;
-       if (__sec) {
-               tv->tv_usec %= 1000000;
-               tv->tv_sec += __sec;
-       }
-}
+       .lock = SEQLOCK_UNLOCKED,
+       .sysctl_enabled = 1,
+};
 
-static __always_inline void do_vgettimeofday(struct timeval * tv)
+void update_vsyscall(struct timespec *wall_time, struct clocksource *clock)
 {
-       long sequence, t;
-       unsigned long sec, usec;
-
-       do {
-               sequence = read_seqbegin(&__xtime_lock);
-               
-               sec = __xtime.tv_sec;
-               usec = __xtime.tv_nsec / 1000;
-
-               if (__vxtime.mode != VXTIME_HPET) {
-                       t = get_cycles_sync();
-                       if (t < __vxtime.last_tsc)
-                               t = __vxtime.last_tsc;
-                       usec += ((t - __vxtime.last_tsc) *
-                                __vxtime.tsc_quot) >> 32;
-                       /* See comment in x86_64 do_gettimeofday. */
-               } else {
-                       usec += ((readl((void __iomem *)
-                                  fix_to_virt(VSYSCALL_HPET) + 0xf0) -
-                                 __vxtime.last) * __vxtime.quot) >> 32;
-               }
-       } while (read_seqretry(&__xtime_lock, sequence));
-
-       tv->tv_sec = sec + usec / 1000000;
-       tv->tv_usec = usec % 1000000;
+       unsigned long flags;
+
+       write_seqlock_irqsave(&vsyscall_gtod_data.lock, flags);
+       /* copy vsyscall data */
+       vsyscall_gtod_data.clock = *clock;
+       vsyscall_gtod_data.wall_time_tv.tv_sec = wall_time->tv_sec;
+       vsyscall_gtod_data.wall_time_tv.tv_usec = wall_time->tv_nsec/1000;
+       vsyscall_gtod_data.sys_tz = sys_tz;
+       write_sequnlock_irqrestore(&vsyscall_gtod_data.lock, flags);
 }
 
-/* RED-PEN may want to readd seq locking, but then the variable should be write-once. */
+/* RED-PEN may want to readd seq locking, but then the variable should be
+ * write-once.
+ */
 static __always_inline void do_get_tz(struct timezone * tz)
 {
-       *tz = __sys_tz;
+       *tz = __vsyscall_gtod_data.sys_tz;
 }
 
 static __always_inline int gettimeofday(struct timeval *tv, struct timezone *tz)
@@ -101,7 +88,8 @@ static __always_inline int gettimeofday(struct timeval *tv, struct timezone *tz)
        int ret;
        asm volatile("vsysc2: syscall"
                : "=a" (ret)
-               : "0" (__NR_gettimeofday),"D" (tv),"S" (tz) : __syscall_clobber );
+               : "0" (__NR_gettimeofday),"D" (tv),"S" (tz)
+               : __syscall_clobber );
        return ret;
 }
 
@@ -114,10 +102,44 @@ static __always_inline long time_syscall(long *t)
        return secs;
 }
 
+static __always_inline void do_vgettimeofday(struct timeval * tv)
+{
+       cycle_t now, base, mask, cycle_delta;
+       unsigned long seq, mult, shift, nsec_delta;
+       cycle_t (*vread)(void);
+       do {
+               seq = read_seqbegin(&__vsyscall_gtod_data.lock);
+
+               vread = __vsyscall_gtod_data.clock.vread;
+               if (unlikely(!__vsyscall_gtod_data.sysctl_enabled || !vread)) {
+                       gettimeofday(tv,0);
+                       return;
+               }
+               now = vread();
+               base = __vsyscall_gtod_data.clock.cycle_last;
+               mask = __vsyscall_gtod_data.clock.mask;
+               mult = __vsyscall_gtod_data.clock.mult;
+               shift = __vsyscall_gtod_data.clock.shift;
+
+               *tv = __vsyscall_gtod_data.wall_time_tv;
+
+       } while (read_seqretry(&__vsyscall_gtod_data.lock, seq));
+
+       /* calculate interval: */
+       cycle_delta = (now - base) & mask;
+       /* convert to nsecs: */
+       nsec_delta = (cycle_delta * mult) >> shift;
+
+       /* convert to usecs and add to timespec: */
+       tv->tv_usec += nsec_delta / NSEC_PER_USEC;
+       while (tv->tv_usec > USEC_PER_SEC) {
+               tv->tv_sec += 1;
+               tv->tv_usec -= USEC_PER_SEC;
+       }
+}
+
 int __vsyscall(0) vgettimeofday(struct timeval * tv, struct timezone * tz)
 {
-       if (!__sysctl_vsyscall)
-               return gettimeofday(tv,tz);
        if (tv)
                do_vgettimeofday(tv);
        if (tz)
@@ -129,11 +151,11 @@ int __vsyscall(0) vgettimeofday(struct timeval * tv, struct timezone * tz)
  * unlikely */
 time_t __vsyscall(1) vtime(time_t *t)
 {
-       if (!__sysctl_vsyscall)
+       if (unlikely(!__vsyscall_gtod_data.sysctl_enabled))
                return time_syscall(t);
        else if (t)
-               *t = __xtime.tv_sec;            
-       return __xtime.tv_sec;
+               *t = __vsyscall_gtod_data.wall_time_tv.tv_sec;
+       return __vsyscall_gtod_data.wall_time_tv.tv_sec;
 }
 
 /* Fast way to get current CPU and node.
@@ -210,7 +232,7 @@ static int vsyscall_sysctl_change(ctl_table *ctl, int write, struct file * filp,
                ret = -ENOMEM;
                goto out;
        }
-       if (!sysctl_vsyscall) {
+       if (!vsyscall_gtod_data.sysctl_enabled) {
                writew(SYSCALL, map1);
                writew(SYSCALL, map2);
        } else {
@@ -232,16 +254,17 @@ static int vsyscall_sysctl_nostrat(ctl_table *t, int __user *name, int nlen,
 
 static ctl_table kernel_table2[] = {
        { .ctl_name = 99, .procname = "vsyscall64",
-         .data = &sysctl_vsyscall, .maxlen = sizeof(int), .mode = 0644,
+         .data = &vsyscall_gtod_data.sysctl_enabled, .maxlen = sizeof(int),
+         .mode = 0644,
          .strategy = vsyscall_sysctl_nostrat,
          .proc_handler = vsyscall_sysctl_change },
-       { 0, }
+       {}
 };
 
 static ctl_table kernel_root_table2[] = {
        { .ctl_name = CTL_KERN, .procname = "kernel", .mode = 0555,
          .child = kernel_table2 },
-       { 0 },
+       {}
 };
 
 #endif
@@ -301,7 +324,7 @@ static int __init vsyscall_init(void)
        BUG_ON((unsigned long) &vgetcpu != VSYSCALL_ADDR(__NR_vgetcpu));
        map_vsyscall();
 #ifdef CONFIG_SYSCTL
-       register_sysctl_table(kernel_root_table2, 0);
+       register_sysctl_table(kernel_root_table2);
 #endif
        on_each_cpu(cpu_vsyscall_init, NULL, 0, 1);
        hotcpu_notifier(cpu_vsyscall_notifier, 0);
index 6d77e4797a471035978e04e4307a71d034918cbc..0dffae69f4ad89a52e0deb67688d1648f3f32c21 100644 (file)
@@ -26,6 +26,7 @@ EXPORT_SYMBOL(__put_user_4);
 EXPORT_SYMBOL(__put_user_8);
 
 EXPORT_SYMBOL(copy_user_generic);
+EXPORT_SYMBOL(__copy_user_nocache);
 EXPORT_SYMBOL(copy_from_user);
 EXPORT_SYMBOL(copy_to_user);
 EXPORT_SYMBOL(__copy_from_user_inatomic);
@@ -34,8 +35,8 @@ EXPORT_SYMBOL(copy_page);
 EXPORT_SYMBOL(clear_page);
 
 #ifdef CONFIG_SMP
-extern void FASTCALL( __write_lock_failed(rwlock_t *rw));
-extern void FASTCALL( __read_lock_failed(rwlock_t *rw));
+extern void  __write_lock_failed(rwlock_t *rw);
+extern void  __read_lock_failed(rwlock_t *rw);
 EXPORT_SYMBOL(__write_lock_failed);
 EXPORT_SYMBOL(__read_lock_failed);
 #endif
index b78d4170fce230ea2d1797295a9248d1efdc66ea..8d5f835af4819bdcba182705d8c1e1b450c8fa87 100644 (file)
@@ -9,4 +9,4 @@ obj-y := io.o iomap_copy.o
 lib-y := csum-partial.o csum-copy.o csum-wrappers.o delay.o \
        usercopy.o getuser.o putuser.o  \
        thunk.o clear_page.o copy_page.o bitstr.o bitops.o
-lib-y += memcpy.o memmove.o memset.o copy_user.o rwlock.o
+lib-y += memcpy.o memmove.o memset.o copy_user.o rwlock.o copy_user_nocache.o
diff --git a/arch/x86_64/lib/copy_user_nocache.S b/arch/x86_64/lib/copy_user_nocache.S
new file mode 100644 (file)
index 0000000..4620efb
--- /dev/null
@@ -0,0 +1,217 @@
+/* Copyright 2002 Andi Kleen, SuSE Labs.
+ * Subject to the GNU Public License v2.
+ *
+ * Functions to copy from and to user space.
+ */
+
+#include <linux/linkage.h>
+#include <asm/dwarf2.h>
+
+#define FIX_ALIGNMENT 1
+
+#include <asm/current.h>
+#include <asm/asm-offsets.h>
+#include <asm/thread_info.h>
+#include <asm/cpufeature.h>
+
+/*
+ * copy_user_nocache - Uncached memory copy with exception handling
+ * This will force destination/source out of cache for more performance.
+ *
+ * Input:
+ * rdi destination
+ * rsi source
+ * rdx count
+ * rcx zero flag       when 1 zero on exception
+ *
+ * Output:
+ * eax uncopied bytes or 0 if successful.
+ */
+ENTRY(__copy_user_nocache)
+       CFI_STARTPROC
+       pushq %rbx
+       CFI_ADJUST_CFA_OFFSET 8
+       CFI_REL_OFFSET rbx, 0
+       pushq %rcx              /* save zero flag */
+       CFI_ADJUST_CFA_OFFSET 8
+       CFI_REL_OFFSET rcx, 0
+
+       xorl %eax,%eax          /* zero for the exception handler */
+
+#ifdef FIX_ALIGNMENT
+       /* check for bad alignment of destination */
+       movl %edi,%ecx
+       andl $7,%ecx
+       jnz  .Lbad_alignment
+.Lafter_bad_alignment:
+#endif
+
+       movq %rdx,%rcx
+
+       movl $64,%ebx
+       shrq $6,%rdx
+       decq %rdx
+       js   .Lhandle_tail
+
+       .p2align 4
+.Lloop:
+.Ls1:  movq (%rsi),%r11
+.Ls2:  movq 1*8(%rsi),%r8
+.Ls3:  movq 2*8(%rsi),%r9
+.Ls4:  movq 3*8(%rsi),%r10
+.Ld1:  movnti %r11,(%rdi)
+.Ld2:  movnti %r8,1*8(%rdi)
+.Ld3:  movnti %r9,2*8(%rdi)
+.Ld4:  movnti %r10,3*8(%rdi)
+
+.Ls5:  movq 4*8(%rsi),%r11
+.Ls6:  movq 5*8(%rsi),%r8
+.Ls7:  movq 6*8(%rsi),%r9
+.Ls8:  movq 7*8(%rsi),%r10
+.Ld5:  movnti %r11,4*8(%rdi)
+.Ld6:  movnti %r8,5*8(%rdi)
+.Ld7:  movnti %r9,6*8(%rdi)
+.Ld8:  movnti %r10,7*8(%rdi)
+
+       dec  %rdx
+
+       leaq 64(%rsi),%rsi
+       leaq 64(%rdi),%rdi
+
+       jns  .Lloop
+
+       .p2align 4
+.Lhandle_tail:
+       movl %ecx,%edx
+       andl $63,%ecx
+       shrl $3,%ecx
+       jz   .Lhandle_7
+       movl $8,%ebx
+       .p2align 4
+.Lloop_8:
+.Ls9:  movq (%rsi),%r8
+.Ld9:  movnti %r8,(%rdi)
+       decl %ecx
+       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:
+.Ls10: movb (%rsi),%bl
+.Ld10: movb %bl,(%rdi)
+       incq %rdi
+       incq %rsi
+       decl %ecx
+       jnz .Lloop_1
+
+       CFI_REMEMBER_STATE
+.Lende:
+       popq %rcx
+       CFI_ADJUST_CFA_OFFSET -8
+       CFI_RESTORE %rcx
+       popq %rbx
+       CFI_ADJUST_CFA_OFFSET -8
+       CFI_RESTORE rbx
+       ret
+       CFI_RESTORE_STATE
+
+#ifdef FIX_ALIGNMENT
+       /* align destination */
+       .p2align 4
+.Lbad_alignment:
+       movl $8,%r9d
+       subl %ecx,%r9d
+       movl %r9d,%ecx
+       cmpq %r9,%rdx
+       jz   .Lhandle_7
+       js   .Lhandle_7
+.Lalign_1:
+.Ls11: movb (%rsi),%bl
+.Ld11: movb %bl,(%rdi)
+       incq %rsi
+       incq %rdi
+       decl %ecx
+       jnz .Lalign_1
+       subq %r9,%rdx
+       jmp .Lafter_bad_alignment
+#endif
+
+       /* table sorted by exception address */
+       .section __ex_table,"a"
+       .align 8
+       .quad .Ls1,.Ls1e
+       .quad .Ls2,.Ls2e
+       .quad .Ls3,.Ls3e
+       .quad .Ls4,.Ls4e
+       .quad .Ld1,.Ls1e
+       .quad .Ld2,.Ls2e
+       .quad .Ld3,.Ls3e
+       .quad .Ld4,.Ls4e
+       .quad .Ls5,.Ls5e
+       .quad .Ls6,.Ls6e
+       .quad .Ls7,.Ls7e
+       .quad .Ls8,.Ls8e
+       .quad .Ld5,.Ls5e
+       .quad .Ld6,.Ls6e
+       .quad .Ld7,.Ls7e
+       .quad .Ld8,.Ls8e
+       .quad .Ls9,.Le_quad
+       .quad .Ld9,.Le_quad
+       .quad .Ls10,.Le_byte
+       .quad .Ld10,.Le_byte
+#ifdef FIX_ALIGNMENT
+       .quad .Ls11,.Lzero_rest
+       .quad .Ld11,.Lzero_rest
+#endif
+       .quad .Le5,.Le_zero
+       .previous
+
+       /* compute 64-offset for main loop. 8 bytes accuracy with error on the
+          pessimistic side. this is gross. it would be better to fix the
+          interface. */
+       /* eax: zero, ebx: 64 */
+.Ls1e:         addl $8,%eax
+.Ls2e:         addl $8,%eax
+.Ls3e:         addl $8,%eax
+.Ls4e:         addl $8,%eax
+.Ls5e:         addl $8,%eax
+.Ls6e:         addl $8,%eax
+.Ls7e:         addl $8,%eax
+.Ls8e:         addl $8,%eax
+       addq %rbx,%rdi  /* +64 */
+       subq %rax,%rdi  /* correct destination with computed offset */
+
+       shlq $6,%rdx    /* loop counter * 64 (stride length) */
+       addq %rax,%rdx  /* add offset to loopcnt */
+       andl $63,%ecx   /* remaining bytes */
+       addq %rcx,%rdx  /* add them */
+       jmp .Lzero_rest
+
+       /* exception on quad word loop in tail handling */
+       /* ecx: loopcnt/8, %edx: length, rdi: correct */
+.Le_quad:
+       shll $3,%ecx
+       andl $7,%edx
+       addl %ecx,%edx
+       /* edx: bytes to zero, rdi: dest, eax:zero */
+.Lzero_rest:
+       cmpl $0,(%rsp)  /* zero flag set? */
+       jz   .Le_zero
+       movq %rdx,%rcx
+.Le_byte:
+       xorl %eax,%eax
+.Le5:  rep
+       stosb
+       /* when there is another exception while zeroing the rest just return */
+.Le_zero:
+       movq %rdx,%rax
+       jmp .Lende
+       CFI_ENDPROC
+ENDPROC(__copy_user_nocache)
+
+
index a65fc6f1dcaff5ec3dd876a609a4f56fd3d7abf5..6ada7231f3abd11953e1bdd89c4101eac9ebe8db 100644 (file)
@@ -56,38 +56,17 @@ int unregister_page_fault_notifier(struct notifier_block *nb)
 }
 EXPORT_SYMBOL_GPL(unregister_page_fault_notifier);
 
-static inline int notify_page_fault(enum die_val val, const char *str,
-                       struct pt_regs *regs, long err, int trap, int sig)
+static inline int notify_page_fault(struct pt_regs *regs, long err)
 {
        struct die_args args = {
                .regs = regs,
-               .str = str,
+               .str = "page fault",
                .err = err,
-               .trapnr = trap,
-               .signr = sig
+               .trapnr = 14,
+               .signr = SIGSEGV
        };
-       return atomic_notifier_call_chain(&notify_page_fault_chain, val, &args);
-}
-
-void bust_spinlocks(int yes)
-{
-       int loglevel_save = console_loglevel;
-       if (yes) {
-               oops_in_progress = 1;
-       } else {
-#ifdef CONFIG_VT
-               unblank_screen();
-#endif
-               oops_in_progress = 0;
-               /*
-                * OK, the message is on the console.  Now we call printk()
-                * without oops_in_progress set so that printk will give klogd
-                * a poke.  Hold onto your hats...
-                */
-               console_loglevel = 15;          /* NMI oopser may have shut the console up */
-               printk(" ");
-               console_loglevel = loglevel_save;
-       }
+       return atomic_notifier_call_chain(&notify_page_fault_chain,
+                                         DIE_PAGE_FAULT, &args);
 }
 
 /* Sometimes the CPU reports invalid exceptions on prefetch.
@@ -376,8 +355,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,
                        if (vmalloc_fault(address) >= 0)
                                return;
                }
-               if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
-                                               SIGSEGV) == NOTIFY_STOP)
+               if (notify_page_fault(regs, error_code) == NOTIFY_STOP)
                        return;
                /*
                 * Don't take the mm semaphore here. If we fixup a prefetch
@@ -386,8 +364,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,
                goto bad_area_nosemaphore;
        }
 
-       if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
-                                       SIGSEGV) == NOTIFY_STOP)
+       if (notify_page_fault(regs, error_code) == NOTIFY_STOP)
                return;
 
        if (likely(regs->eflags & X86_EFLAGS_IF))
index 2968b90ef8adfec3d0316a3ef7b8d8e49628284d..ec31534eb104875649847948c32f816c6951d5a8 100644 (file)
@@ -711,20 +711,30 @@ int kern_addr_valid(unsigned long addr)
 extern int exception_trace, page_fault_trace;
 
 static ctl_table debug_table2[] = {
-       { 99, "exception-trace", &exception_trace, sizeof(int), 0644, NULL,
-         proc_dointvec },
-       { 0, }
+       {
+               .ctl_name       = 99,
+               .procname       = "exception-trace",
+               .data           = &exception_trace,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec
+       },
+       {}
 }; 
 
 static ctl_table debug_root_table2[] = { 
-       { .ctl_name = CTL_DEBUG, .procname = "debug", .mode = 0555, 
-          .child = debug_table2 }, 
-       { 0 }, 
+       {
+               .ctl_name = CTL_DEBUG,
+               .procname = "debug",
+               .mode = 0555,
+               .child = debug_table2
+       },
+       {}
 }; 
 
 static __init int x8664_sysctl_init(void)
 { 
-       register_sysctl_table(debug_root_table2, 1);
+       register_sysctl_table(debug_root_table2);
        return 0;
 }
 __initcall(x8664_sysctl_init);
index 2ee2e003606cad9cc727042af6ed435dadc45a53..41b8fb069924d9a6b26582688f9421aa44e80d8d 100644 (file)
@@ -36,6 +36,8 @@ unsigned char apicid_to_node[MAX_LOCAL_APIC] __cpuinitdata = {
 cpumask_t node_to_cpumask[MAX_NUMNODES] __read_mostly;
 
 int numa_off __initdata;
+unsigned long __initdata nodemap_addr;
+unsigned long __initdata nodemap_size;
 
 
 /*
@@ -52,34 +54,88 @@ populate_memnodemap(const struct bootnode *nodes, int numnodes, int shift)
        int res = -1;
        unsigned long addr, end;
 
-       if (shift >= 64)
-               return -1;
-       memset(memnodemap, 0xff, sizeof(memnodemap));
+       memset(memnodemap, 0xff, memnodemapsize);
        for (i = 0; i < numnodes; i++) {
                addr = nodes[i].start;
                end = nodes[i].end;
                if (addr >= end)
                        continue;
-               if ((end >> shift) >= NODEMAPSIZE)
+               if ((end >> shift) >= memnodemapsize)
                        return 0;
                do {
                        if (memnodemap[addr >> shift] != 0xff)
                                return -1;
                        memnodemap[addr >> shift] = i;
-                       addr += (1UL << shift);
+                       addr += (1UL << shift);
                } while (addr < end);
                res = 1;
        } 
        return res;
 }
 
-int __init compute_hash_shift(struct bootnode *nodes, int numnodes)
+static int __init allocate_cachealigned_memnodemap(void)
 {
-       int shift = 20;
+       unsigned long pad, pad_addr;
+
+       memnodemap = memnode.embedded_map;
+       if (memnodemapsize <= 48)
+               return 0;
+
+       pad = L1_CACHE_BYTES - 1;
+       pad_addr = 0x8000;
+       nodemap_size = pad + memnodemapsize;
+       nodemap_addr = find_e820_area(pad_addr, end_pfn<<PAGE_SHIFT,
+                                     nodemap_size);
+       if (nodemap_addr == -1UL) {
+               printk(KERN_ERR
+                      "NUMA: Unable to allocate Memory to Node hash map\n");
+               nodemap_addr = nodemap_size = 0;
+               return -1;
+       }
+       pad_addr = (nodemap_addr + pad) & ~pad;
+       memnodemap = phys_to_virt(pad_addr);
+
+       printk(KERN_DEBUG "NUMA: Allocated memnodemap from %lx - %lx\n",
+              nodemap_addr, nodemap_addr + nodemap_size);
+       return 0;
+}
 
-       while (populate_memnodemap(nodes, numnodes, shift + 1) >= 0)
-               shift++;
+/*
+ * The LSB of all start and end addresses in the node map is the value of the
+ * maximum possible shift.
+ */
+static int __init
+extract_lsb_from_nodes (const struct bootnode *nodes, int numnodes)
+{
+       int i, nodes_used = 0;
+       unsigned long start, end;
+       unsigned long bitfield = 0, memtop = 0;
+
+       for (i = 0; i < numnodes; i++) {
+               start = nodes[i].start;
+               end = nodes[i].end;
+               if (start >= end)
+                       continue;
+               bitfield |= start;
+               nodes_used++;
+               if (end > memtop)
+                       memtop = end;
+       }
+       if (nodes_used <= 1)
+               i = 63;
+       else
+               i = find_first_bit(&bitfield, sizeof(unsigned long)*8);
+       memnodemapsize = (memtop >> i)+1;
+       return i;
+}
+
+int __init compute_hash_shift(struct bootnode *nodes, int numnodes)
+{
+       int shift;
 
+       shift = extract_lsb_from_nodes(nodes, numnodes);
+       if (allocate_cachealigned_memnodemap())
+               return -1;
        printk(KERN_DEBUG "NUMA: Using %d for the hash shift.\n",
                shift);
 
@@ -216,31 +272,113 @@ void __init numa_init_array(void)
 }
 
 #ifdef CONFIG_NUMA_EMU
+/* Numa emulation */
 int numa_fake __initdata = 0;
 
-/* Numa emulation */
+/*
+ * This function is used to find out if the start and end correspond to
+ * different zones.
+ */
+int zone_cross_over(unsigned long start, unsigned long end)
+{
+       if ((start < (MAX_DMA32_PFN << PAGE_SHIFT)) &&
+                       (end >= (MAX_DMA32_PFN << PAGE_SHIFT)))
+               return 1;
+       return 0;
+}
+
 static int __init numa_emulation(unsigned long start_pfn, unsigned long end_pfn)
 {
-       int i;
+       int i, big;
        struct bootnode nodes[MAX_NUMNODES];
-       unsigned long sz = ((end_pfn - start_pfn)<<PAGE_SHIFT) / numa_fake;
+       unsigned long sz, old_sz;
+       unsigned long hole_size;
+       unsigned long start, end;
+       unsigned long max_addr = (end_pfn << PAGE_SHIFT);
+
+       start = (start_pfn << PAGE_SHIFT);
+       hole_size = e820_hole_size(start, max_addr);
+       sz = (max_addr - start - hole_size) / numa_fake;
 
        /* Kludge needed for the hash function */
-       if (hweight64(sz) > 1) {
-               unsigned long x = 1;
-               while ((x << 1) < sz)
-                       x <<= 1;
-               if (x < sz/2)
-                       printk(KERN_ERR "Numa emulation unbalanced. Complain to maintainer\n");
-               sz = x;
-       }
 
+       old_sz = sz;
+       /*
+        * Round down to the nearest FAKE_NODE_MIN_SIZE.
+        */
+       sz &= FAKE_NODE_MIN_HASH_MASK;
+
+       /*
+        * We ensure that each node is at least 64MB big.  Smaller than this
+        * size can cause VM hiccups.
+        */
+       if (sz == 0) {
+               printk(KERN_INFO "Not enough memory for %d nodes.  Reducing "
+                               "the number of nodes\n", numa_fake);
+               numa_fake = (max_addr - start - hole_size) / FAKE_NODE_MIN_SIZE;
+               printk(KERN_INFO "Number of fake nodes will be = %d\n",
+                               numa_fake);
+               sz = FAKE_NODE_MIN_SIZE;
+       }
+       /*
+        * Find out how many nodes can get an extra NODE_MIN_SIZE granule.
+        * This logic ensures the extra memory gets distributed among as many
+        * nodes as possible (as compared to one single node getting all that
+        * extra memory.
+        */
+       big = ((old_sz - sz) * numa_fake) / FAKE_NODE_MIN_SIZE;
+       printk(KERN_INFO "Fake node Size: %luMB hole_size: %luMB big nodes: "
+                       "%d\n",
+                       (sz >> 20), (hole_size >> 20), big);
        memset(&nodes,0,sizeof(nodes));
+       end = start;
        for (i = 0; i < numa_fake; i++) {
-               nodes[i].start = (start_pfn<<PAGE_SHIFT) + i*sz;
+               /*
+                * In case we are not able to allocate enough memory for all
+                * the nodes, we reduce the number of fake nodes.
+                */
+               if (end >= max_addr) {
+                       numa_fake = i - 1;
+                       break;
+               }
+               start = nodes[i].start = end;
+               /*
+                * Final node can have all the remaining memory.
+                */
                if (i == numa_fake-1)
-                       sz = (end_pfn<<PAGE_SHIFT) - nodes[i].start;
-               nodes[i].end = nodes[i].start + sz;
+                       sz = max_addr - start;
+               end = nodes[i].start + sz;
+               /*
+                * Fir "big" number of nodes get extra granule.
+                */
+               if (i < big)
+                       end += FAKE_NODE_MIN_SIZE;
+               /*
+                * Iterate over the range to ensure that this node gets at
+                * least sz amount of RAM (excluding holes)
+                */
+               while ((end - start - e820_hole_size(start, end)) < sz) {
+                       end += FAKE_NODE_MIN_SIZE;
+                       if (end >= max_addr)
+                               break;
+               }
+               /*
+                * Look at the next node to make sure there is some real memory
+                * to map.  Bad things happen when the only memory present
+                * in a zone on a fake node is IO hole.
+                */
+               while (e820_hole_size(end, end + FAKE_NODE_MIN_SIZE) > 0) {
+                       if (zone_cross_over(start, end + sz)) {
+                               end = (MAX_DMA32_PFN << PAGE_SHIFT);
+                               break;
+                       }
+                       if (end >= max_addr)
+                               break;
+                       end += FAKE_NODE_MIN_SIZE;
+               }
+               if (end > max_addr)
+                       end = max_addr;
+               nodes[i].end = end;
                printk(KERN_INFO "Faking node %d at %016Lx-%016Lx (%LuMB)\n",
                       i,
                       nodes[i].start, nodes[i].end,
@@ -290,6 +428,7 @@ void __init numa_initmem_init(unsigned long start_pfn, unsigned long end_pfn)
               end_pfn << PAGE_SHIFT); 
                /* setup dummy node covering all memory */ 
        memnode_shift = 63; 
+       memnodemap = memnode.embedded_map;
        memnodemap[0] = 0;
        nodes_clear(node_online_map);
        node_set_online(0);
@@ -321,20 +460,6 @@ 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;
@@ -344,7 +469,8 @@ void __init paging_init(void)
        max_zone_pfns[ZONE_DMA32] = MAX_DMA32_PFN;
        max_zone_pfns[ZONE_NORMAL] = end_pfn;
 
-       arch_sparse_init();
+       sparse_memory_present_with_active_regions(MAX_NUMNODES);
+       sparse_init();
 
        for_each_online_node(i) {
                setup_node_zones(i); 
index ccb91dd996a957c1dc26f183e095c3a8edbd30f1..65c5eaa5990563048b1ac59e04e3dcd645441b5c 100644 (file)
@@ -107,6 +107,7 @@ static void revert_page(unsigned long address, pgprot_t ref_prot)
        pud_t *pud;
        pmd_t *pmd;
        pte_t large_pte;
+       unsigned long pfn;
 
        pgd = pgd_offset_k(address);
        BUG_ON(pgd_none(*pgd));
@@ -114,7 +115,8 @@ static void revert_page(unsigned long address, pgprot_t ref_prot)
        BUG_ON(pud_none(*pud));
        pmd = pmd_offset(pud, address);
        BUG_ON(pmd_val(*pmd) & _PAGE_PSE);
-       large_pte = mk_pte_phys(__pa(address) & LARGE_PAGE_MASK, ref_prot);
+       pfn = (__pa(address) & LARGE_PAGE_MASK) >> PAGE_SHIFT;
+       large_pte = pfn_pte(pfn, ref_prot);
        large_pte = pte_mkhuge(large_pte);
        set_pte((pte_t *)pmd, large_pte);
 }      
index 149aba05a5b8e70c6abb22dd17e21b1f1994adf4..c9eddc8859c0f797818c81dbaed75d4618a605d2 100644 (file)
@@ -11,7 +11,7 @@ obj-y         += fixup.o init.o
 obj-$(CONFIG_ACPI)     += acpi.o
 obj-y                  += legacy.o irq.o common.o early.o
 # mmconfig has a 64bit special
-obj-$(CONFIG_PCI_MMCONFIG) += mmconfig.o direct.o
+obj-$(CONFIG_PCI_MMCONFIG) += mmconfig.o direct.o mmconfig-shared.o
 
 obj-$(CONFIG_NUMA)     += k8-bus.o
 
@@ -24,3 +24,4 @@ fixup-y  += ../../i386/pci/fixup.o
 i386-y  += ../../i386/pci/i386.o
 init-y += ../../i386/pci/init.o
 early-y += ../../i386/pci/early.o
+mmconfig-shared-y += ../../i386/pci/mmconfig-shared.o
index faabb6e87f12461de8c25bf4ec4f14f75216edaa..65d82736987e600b642646f4d14e515b4fc020fc 100644 (file)
 
 #include "pci.h"
 
-/* aperture is up to 256MB but BIOS may reserve less */
-#define MMCONFIG_APER_MIN      (2 * 1024*1024)
-#define MMCONFIG_APER_MAX      (256 * 1024*1024)
-
-/* Verify the first 16 busses. We assume that systems with more busses
-   get MCFG right. */
-#define MAX_CHECK_BUS 16
-
-static DECLARE_BITMAP(fallback_slots, 32*MAX_CHECK_BUS);
-
 /* Static virtual mapping of the MMCONFIG aperture */
 struct mmcfg_virt {
        struct acpi_mcfg_allocation *cfg;
@@ -32,30 +22,17 @@ static struct mmcfg_virt *pci_mmcfg_virt;
 
 static char __iomem *get_virt(unsigned int seg, unsigned bus)
 {
-       int cfg_num = -1;
        struct acpi_mcfg_allocation *cfg;
+       int cfg_num;
 
-       while (1) {
-               ++cfg_num;
-               if (cfg_num >= pci_mmcfg_config_num)
-                       break;
+       for (cfg_num = 0; cfg_num < pci_mmcfg_config_num; cfg_num++) {
                cfg = pci_mmcfg_virt[cfg_num].cfg;
-               if (cfg->pci_segment != seg)
-                       continue;
-               if ((cfg->start_bus_number <= bus) &&
+               if (cfg->pci_segment == seg &&
+                   (cfg->start_bus_number <= bus) &&
                    (cfg->end_bus_number >= bus))
                        return pci_mmcfg_virt[cfg_num].virt;
        }
 
-       /* Handle more broken MCFG tables on Asus etc.
-          They only contain a single entry for bus 0-0. Assume
-          this applies to all busses. */
-       cfg = &pci_mmcfg_config[0];
-       if (pci_mmcfg_config_num == 1 &&
-               cfg->pci_segment == 0 &&
-               (cfg->start_bus_number | cfg->end_bus_number) == 0)
-               return pci_mmcfg_virt[0].virt;
-
        /* Fall back to type 0 */
        return NULL;
 }
@@ -63,8 +40,8 @@ static char __iomem *get_virt(unsigned int seg, unsigned bus)
 static char __iomem *pci_dev_base(unsigned int seg, unsigned int bus, unsigned int devfn)
 {
        char __iomem *addr;
-       if (seg == 0 && bus < MAX_CHECK_BUS &&
-               test_bit(32*bus + PCI_SLOT(devfn), fallback_slots))
+       if (seg == 0 && bus < PCI_MMCFG_MAX_CHECK_BUS &&
+               test_bit(32*bus + PCI_SLOT(devfn), pci_mmcfg_fallback_slots))
                return NULL;
        addr = get_virt(seg, bus);
        if (!addr)
@@ -135,79 +112,46 @@ static struct pci_raw_ops pci_mmcfg = {
        .write =        pci_mmcfg_write,
 };
 
-/* K8 systems have some devices (typically in the builtin northbridge)
-   that are only accessible using type1
-   Normally this can be expressed in the MCFG by not listing them
-   and assigning suitable _SEGs, but this isn't implemented in some BIOS.
-   Instead try to discover all devices on bus 0 that are unreachable using MM
-   and fallback for them. */
-static __init void unreachable_devices(void)
+static void __iomem * __init mcfg_ioremap(struct acpi_mcfg_allocation *cfg)
 {
-       int i, k;
-       /* Use the max bus number from ACPI here? */
-       for (k = 0; k < MAX_CHECK_BUS; k++) {
-               for (i = 0; i < 32; i++) {
-                       u32 val1;
-                       char __iomem *addr;
-
-                       pci_conf1_read(0, k, PCI_DEVFN(i,0), 0, 4, &val1);
-                       if (val1 == 0xffffffff)
-                               continue;
-                       addr = pci_dev_base(0, k, PCI_DEVFN(i, 0));
-                       if (addr == NULL|| readl(addr) != val1) {
-                               set_bit(i + 32*k, fallback_slots);
-                               printk(KERN_NOTICE "PCI: No mmconfig possible"
-                                      " on device %02x:%02x\n", k, i);
-                       }
-               }
+       void __iomem *addr;
+       u32 size;
+
+       size = (cfg->end_bus_number + 1) << 20;
+       addr = ioremap_nocache(cfg->address, size);
+       if (addr) {
+               printk(KERN_INFO "PCI: Using MMCONFIG at %Lx - %Lx\n",
+                      cfg->address, cfg->address + size - 1);
        }
+       return addr;
 }
 
-void __init pci_mmcfg_init(int type)
+int __init pci_mmcfg_arch_reachable(unsigned int seg, unsigned int bus,
+                                   unsigned int devfn)
 {
-       int i;
-
-       if ((pci_probe & PCI_PROBE_MMCONF) == 0)
-               return;
-
-       acpi_table_parse(ACPI_SIG_MCFG, acpi_parse_mcfg);
-       if ((pci_mmcfg_config_num == 0) ||
-           (pci_mmcfg_config == NULL) ||
-           (pci_mmcfg_config[0].address == 0))
-               return;
-
-       /* Only do this check when type 1 works. If it doesn't work
-           assume we run on a Mac and always use MCFG */
-       if (type == 1 && !e820_all_mapped(pci_mmcfg_config[0].address,
-                       pci_mmcfg_config[0].address + MMCONFIG_APER_MIN,
-                       E820_RESERVED)) {
-               printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %lx is not E820-reserved\n",
-                               (unsigned long)pci_mmcfg_config[0].address);
-               printk(KERN_ERR "PCI: Not using MMCONFIG.\n");
-               return;
-       }
+       return pci_dev_base(seg, bus, devfn) != NULL;
+}
 
-       pci_mmcfg_virt = kmalloc(sizeof(*pci_mmcfg_virt) * pci_mmcfg_config_num, GFP_KERNEL);
+int __init pci_mmcfg_arch_init(void)
+{
+       int i;
+       pci_mmcfg_virt = kmalloc(sizeof(*pci_mmcfg_virt) *
+                                pci_mmcfg_config_num, GFP_KERNEL);
        if (pci_mmcfg_virt == NULL) {
                printk(KERN_ERR "PCI: Can not allocate memory for mmconfig structures\n");
-               return;
+               return 0;
        }
+
        for (i = 0; i < pci_mmcfg_config_num; ++i) {
                pci_mmcfg_virt[i].cfg = &pci_mmcfg_config[i];
-               pci_mmcfg_virt[i].virt = ioremap_nocache(pci_mmcfg_config[i].address,
-                                                        MMCONFIG_APER_MAX);
+               pci_mmcfg_virt[i].virt = mcfg_ioremap(&pci_mmcfg_config[i]);
                if (!pci_mmcfg_virt[i].virt) {
                        printk(KERN_ERR "PCI: Cannot map mmconfig aperture for "
                                        "segment %d\n",
                                pci_mmcfg_config[i].pci_segment);
-                       return;
+                       return 0;
                }
-               printk(KERN_INFO "PCI: Using MMCONFIG at %lx\n",
-                       (unsigned long)pci_mmcfg_config[i].address);
        }
-
-       unreachable_devices();
-
        raw_pci_ops = &pci_mmcfg;
-       pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF;
+       return 1;
 }
index 2e74cb0b7807fd986fa4993e9baf4044f8c015f9..7fbb44bea37f85048ebb8c6c55e2a9063477083d 100644 (file)
@@ -7,6 +7,10 @@ config FRAME_POINTER
        bool
        default n
 
+config ZONE_DMA
+       bool
+       default y
+
 config XTENSA
        bool
        default y
@@ -42,6 +46,9 @@ config ARCH_HAS_ILOG2_U64
        bool
        default n
 
+config NO_IOPORT
+       def_bool y
+
 source "init/Kconfig"
 
 menu "Processor type and features"
index b6374c09de20e267b5235ae49968e1ca268d4a61..1ecf6716c3274a1ce2575236b036e864c57e6127 100644 (file)
@@ -78,7 +78,7 @@ extern unsigned long loops_per_jiffy;
 
 /* Command line specified as configuration option. */
 
-static char command_line[COMMAND_LINE_SIZE];
+static char __initdata command_line[COMMAND_LINE_SIZE];
 
 #ifdef CONFIG_CMDLINE_BOOL
 static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;
@@ -253,8 +253,8 @@ void __init setup_arch(char **cmdline_p)
        extern int mem_reserve(unsigned long, unsigned long, int);
        extern void bootmem_init(void);
 
-       memcpy(saved_command_line, command_line, COMMAND_LINE_SIZE);
-       saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
+       memcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
+       boot_command_line[COMMAND_LINE_SIZE-1] = '\0';
        *cmdline_p = command_line;
 
        /* Reserve some memory regions */
index a350431363a0a8c56080c170ab5a7ff88db2c50d..22949be4a5d8cc3c5d62f93b8779a67c3ecd451f 100644 (file)
@@ -38,15 +38,6 @@ unsigned long ccount_nsec;           /* nsec per ccount increment */
 unsigned int last_ccount_stamp;
 static long last_rtc_update = 0;
 
-/*
- * Scheduler clock - returns current tim in nanosec units.
- */
-
-unsigned long long sched_clock(void)
-{
-       return (unsigned long long)jiffies * (1000000000 / HZ);
-}
-
 static irqreturn_t timer_interrupt(int irq, void *dev_id);
 static struct irqaction timer_irqaction = {
        .handler =      timer_interrupt,
index a36c104c3a5295a05e89a0ef1eaf1c0d27b8cfd1..ab6370054cee709cdfccff4850d6fcdefb24ce9d 100644 (file)
@@ -203,10 +203,12 @@ SECTIONS
   .data.percpu  : { *(.data.percpu) }
   __per_cpu_end = .;
 
+#ifdef CONFIG_BLK_DEV_INITRD
   . = ALIGN(4096);
   __initramfs_start =.;
   .init.ramfs : { *(.init.ramfs) }
   __initramfs_end = .;
+#endif
 
   /* We need this dummy segment here */
 
index d3679dd1d2201785e91194415d01736a16af54bc..3f0e7c37c059037080cbe44456f176c5a4800319 100644 (file)
@@ -264,7 +264,7 @@ static ssize_t blk_dropped_read(struct file *filp, char __user *buffer,
        return simple_read_from_buffer(buffer, count, ppos, buf, strlen(buf));
 }
 
-static struct file_operations blk_dropped_fops = {
+static const struct file_operations blk_dropped_fops = {
        .owner =        THIS_MODULE,
        .open =         blk_dropped_open,
        .read =         blk_dropped_read,
@@ -363,10 +363,9 @@ static int blk_trace_setup(request_queue_t *q, struct block_device *bdev,
        if (!bt->dropped_file)
                goto err;
 
-       bt->rchan = relay_open("trace", dir, buts.buf_size, buts.buf_nr, &blk_relay_callbacks);
+       bt->rchan = relay_open("trace", dir, buts.buf_size, buts.buf_nr, &blk_relay_callbacks, bt);
        if (!bt->rchan)
                goto err;
-       bt->rchan->private_data = bt;
 
        bt->act_mask = buts.act_mask;
        if (!bt->act_mask)
index 07b706243772e46fe2434248bf0e4fba938fca0a..b6491c020f26ec53dedcbed84e20aea0a7aea299 100644 (file)
@@ -146,9 +146,9 @@ struct cfq_queue {
        /* fifo list of requests in sort_list */
        struct list_head fifo;
 
-       unsigned long slice_start;
        unsigned long slice_end;
-       unsigned long slice_left;
+       unsigned long service_last;
+       long slice_resid;
 
        /* number of requests that are on the dispatch list */
        int on_dispatch[2];
@@ -162,15 +162,16 @@ struct cfq_queue {
 };
 
 enum cfqq_state_flags {
-       CFQ_CFQQ_FLAG_on_rr = 0,
-       CFQ_CFQQ_FLAG_wait_request,
-       CFQ_CFQQ_FLAG_must_alloc,
-       CFQ_CFQQ_FLAG_must_alloc_slice,
-       CFQ_CFQQ_FLAG_must_dispatch,
-       CFQ_CFQQ_FLAG_fifo_expire,
-       CFQ_CFQQ_FLAG_idle_window,
-       CFQ_CFQQ_FLAG_prio_changed,
-       CFQ_CFQQ_FLAG_queue_new,
+       CFQ_CFQQ_FLAG_on_rr = 0,        /* on round-robin busy list */
+       CFQ_CFQQ_FLAG_wait_request,     /* waiting for a request */
+       CFQ_CFQQ_FLAG_must_alloc,       /* must be allowed rq alloc */
+       CFQ_CFQQ_FLAG_must_alloc_slice, /* per-slice must_alloc flag */
+       CFQ_CFQQ_FLAG_must_dispatch,    /* must dispatch, even if expired */
+       CFQ_CFQQ_FLAG_fifo_expire,      /* FIFO checked in this slice */
+       CFQ_CFQQ_FLAG_idle_window,      /* slice idling enabled */
+       CFQ_CFQQ_FLAG_prio_changed,     /* task priority has changed */
+       CFQ_CFQQ_FLAG_queue_new,        /* queue never been serviced */
+       CFQ_CFQQ_FLAG_slice_new,        /* no requests dispatched in slice */
 };
 
 #define CFQ_CFQQ_FNS(name)                                             \
@@ -196,6 +197,7 @@ CFQ_CFQQ_FNS(fifo_expire);
 CFQ_CFQQ_FNS(idle_window);
 CFQ_CFQQ_FNS(prio_changed);
 CFQ_CFQQ_FNS(queue_new);
+CFQ_CFQQ_FNS(slice_new);
 #undef CFQ_CFQQ_FNS
 
 static struct cfq_queue *cfq_find_cfq_hash(struct cfq_data *, unsigned int, unsigned short);
@@ -230,6 +232,50 @@ static inline pid_t cfq_queue_pid(struct task_struct *task, int rw, int is_sync)
        return CFQ_KEY_ASYNC;
 }
 
+/*
+ * Scale schedule slice based on io priority. Use the sync time slice only
+ * if a queue is marked sync and has sync io queued. A sync queue with async
+ * io only, should not get full sync slice length.
+ */
+static inline int
+cfq_prio_to_slice(struct cfq_data *cfqd, struct cfq_queue *cfqq)
+{
+       const int base_slice = cfqd->cfq_slice[cfq_cfqq_sync(cfqq)];
+
+       WARN_ON(cfqq->ioprio >= IOPRIO_BE_NR);
+
+       return base_slice + (base_slice/CFQ_SLICE_SCALE * (4 - cfqq->ioprio));
+}
+
+static inline void
+cfq_set_prio_slice(struct cfq_data *cfqd, struct cfq_queue *cfqq)
+{
+       cfqq->slice_end = cfq_prio_to_slice(cfqd, cfqq) + jiffies;
+       cfqq->slice_end += cfqq->slice_resid;
+
+       /*
+        * Don't carry over residual for more than one slice, we only want
+        * to slightly correct the fairness. Carrying over forever would
+        * easily introduce oscillations.
+        */
+       cfqq->slice_resid = 0;
+}
+
+/*
+ * We need to wrap this check in cfq_cfqq_slice_new(), since ->slice_end
+ * isn't valid until the first request from the dispatch is activated
+ * and the slice time set.
+ */
+static inline int cfq_slice_used(struct cfq_queue *cfqq)
+{
+       if (cfq_cfqq_slice_new(cfqq))
+               return 0;
+       if (time_before(jiffies, cfqq->slice_end))
+               return 0;
+
+       return 1;
+}
+
 /*
  * Lifted from AS - choose which of rq1 and rq2 that is best served now.
  * We choose the request that is closest to the head right now. Distance
@@ -355,9 +401,14 @@ cfq_find_next_rq(struct cfq_data *cfqd, struct cfq_queue *cfqq,
 static void cfq_resort_rr_list(struct cfq_queue *cfqq, int preempted)
 {
        struct cfq_data *cfqd = cfqq->cfqd;
-       struct list_head *list;
+       struct list_head *list, *n;
+       struct cfq_queue *__cfqq;
 
-       BUG_ON(!cfq_cfqq_on_rr(cfqq));
+       /*
+        * Resorting requires the cfqq to be on the RR list already.
+        */
+       if (!cfq_cfqq_on_rr(cfqq))
+               return;
 
        list_del(&cfqq->cfq_list);
 
@@ -379,15 +430,13 @@ static void cfq_resort_rr_list(struct cfq_queue *cfqq, int preempted)
                        list = &cfqd->rr_list[cfqq->ioprio];
        }
 
-       /*
-        * If this queue was preempted or is new (never been serviced), let
-        * it be added first for fairness but beind other new queues.
-        * Otherwise, just add to the back  of the list.
-        */
        if (preempted || cfq_cfqq_queue_new(cfqq)) {
-               struct list_head *n = list;
-               struct cfq_queue *__cfqq;
-
+               /*
+                * If this queue was preempted or is new (never been serviced),
+                * let it be added first for fairness but beind other new
+                * queues.
+                */
+               n = list;
                while (n->next != list) {
                        __cfqq = list_entry_cfqq(n->next);
                        if (!cfq_cfqq_queue_new(__cfqq))
@@ -395,11 +444,32 @@ static void cfq_resort_rr_list(struct cfq_queue *cfqq, int preempted)
 
                        n = n->next;
                }
+               list_add_tail(&cfqq->cfq_list, n);
+       } else if (!cfq_cfqq_class_sync(cfqq)) {
+               /*
+                * async queue always goes to the end. this wont be overly
+                * unfair to writes, as the sort of the sync queue wont be
+                * allowed to pass the async queue again.
+                */
+               list_add_tail(&cfqq->cfq_list, list);
+       } else {
+               /*
+                * sort by last service, but don't cross a new or async
+                * queue. we don't cross a new queue because it hasn't been
+                * service before, and we don't cross an async queue because
+                * it gets added to the end on expire.
+                */
+               n = list;
+               while ((n = n->prev) != list) {
+                       struct cfq_queue *__cfqq = list_entry_cfqq(n);
 
-               list = n;
+                       if (!cfq_cfqq_class_sync(cfqq) || !__cfqq->service_last)
+                               break;
+                       if (time_before(__cfqq->service_last, cfqq->service_last))
+                               break;
+               }
+               list_add(&cfqq->cfq_list, n);
        }
-
-       list_add_tail(&cfqq->cfq_list, list);
 }
 
 /*
@@ -604,11 +674,10 @@ __cfq_set_active_queue(struct cfq_data *cfqd, struct cfq_queue *cfqq)
                 */
                del_timer(&cfqd->idle_class_timer);
 
-               cfqq->slice_start = jiffies;
                cfqq->slice_end = 0;
-               cfqq->slice_left = 0;
                cfq_clear_cfqq_must_alloc_slice(cfqq);
                cfq_clear_cfqq_fifo_expire(cfqq);
+               cfq_mark_cfqq_slice_new(cfqq);
        }
 
        cfqd->active_queue = cfqq;
@@ -619,16 +688,11 @@ __cfq_set_active_queue(struct cfq_data *cfqd, struct cfq_queue *cfqq)
  */
 static void
 __cfq_slice_expired(struct cfq_data *cfqd, struct cfq_queue *cfqq,
-                   int preempted)
+                   int preempted, int timed_out)
 {
-       unsigned long now = jiffies;
-
        if (cfq_cfqq_wait_request(cfqq))
                del_timer(&cfqd->idle_slice_timer);
 
-       if (!preempted && !cfq_cfqq_dispatched(cfqq))
-               cfq_schedule_dispatch(cfqd);
-
        cfq_clear_cfqq_must_dispatch(cfqq);
        cfq_clear_cfqq_wait_request(cfqq);
        cfq_clear_cfqq_queue_new(cfqq);
@@ -637,13 +701,10 @@ __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(cfqq->slice_end, now))
-               cfqq->slice_left = cfqq->slice_end - now;
-       else
-               cfqq->slice_left = 0;
+       if (timed_out && !cfq_cfqq_slice_new(cfqq))
+               cfqq->slice_resid = cfqq->slice_end - jiffies;
 
-       if (cfq_cfqq_on_rr(cfqq))
-               cfq_resort_rr_list(cfqq, preempted);
+       cfq_resort_rr_list(cfqq, preempted);
 
        if (cfqq == cfqd->active_queue)
                cfqd->active_queue = NULL;
@@ -656,12 +717,13 @@ __cfq_slice_expired(struct cfq_data *cfqd, struct cfq_queue *cfqq,
        cfqd->dispatch_slice = 0;
 }
 
-static inline void cfq_slice_expired(struct cfq_data *cfqd, int preempted)
+static inline void cfq_slice_expired(struct cfq_data *cfqd, int preempted,
+                                    int timed_out)
 {
        struct cfq_queue *cfqq = cfqd->active_queue;
 
        if (cfqq)
-               __cfq_slice_expired(cfqd, cfqq, preempted);
+               __cfq_slice_expired(cfqd, cfqq, preempted, timed_out);
 }
 
 /*
@@ -758,14 +820,13 @@ static struct cfq_queue *cfq_set_active_queue(struct cfq_data *cfqd)
 
 #define CIC_SEEKY(cic) ((cic)->seek_mean > (128 * 1024))
 
-static int cfq_arm_slice_timer(struct cfq_data *cfqd, struct cfq_queue *cfqq)
-
+static int cfq_arm_slice_timer(struct cfq_data *cfqd)
 {
+       struct cfq_queue *cfqq = cfqd->active_queue;
        struct cfq_io_context *cic;
        unsigned long sl;
 
        WARN_ON(!RB_EMPTY_ROOT(&cfqq->sort_list));
-       WARN_ON(cfqq != cfqd->active_queue);
 
        /*
         * idle is disabled, either manually or by past process history
@@ -822,41 +883,21 @@ static inline struct request *cfq_check_fifo(struct cfq_queue *cfqq)
 
        if (cfq_cfqq_fifo_expire(cfqq))
                return NULL;
+
+       cfq_mark_cfqq_fifo_expire(cfqq);
+
        if (list_empty(&cfqq->fifo))
                return NULL;
 
        fifo = cfq_cfqq_class_sync(cfqq);
        rq = rq_entry_fifo(cfqq->fifo.next);
 
-       if (time_after(jiffies, rq->start_time + cfqd->cfq_fifo_expire[fifo])) {
-               cfq_mark_cfqq_fifo_expire(cfqq);
+       if (time_after(jiffies, rq->start_time + cfqd->cfq_fifo_expire[fifo]))
                return rq;
-       }
 
        return NULL;
 }
 
-/*
- * Scale schedule slice based on io priority. Use the sync time slice only
- * if a queue is marked sync and has sync io queued. A sync queue with async
- * io only, should not get full sync slice length.
- */
-static inline int
-cfq_prio_to_slice(struct cfq_data *cfqd, struct cfq_queue *cfqq)
-{
-       const int base_slice = cfqd->cfq_slice[cfq_cfqq_sync(cfqq)];
-
-       WARN_ON(cfqq->ioprio >= IOPRIO_BE_NR);
-
-       return base_slice + (base_slice/CFQ_SLICE_SCALE * (4 - cfqq->ioprio));
-}
-
-static inline void
-cfq_set_prio_slice(struct cfq_data *cfqd, struct cfq_queue *cfqq)
-{
-       cfqq->slice_end = cfq_prio_to_slice(cfqd, cfqq) + jiffies;
-}
-
 static inline int
 cfq_prio_to_maxrq(struct cfq_data *cfqd, struct cfq_queue *cfqq)
 {
@@ -872,7 +913,6 @@ cfq_prio_to_maxrq(struct cfq_data *cfqd, struct cfq_queue *cfqq)
  */
 static struct cfq_queue *cfq_select_queue(struct cfq_data *cfqd)
 {
-       unsigned long now = jiffies;
        struct cfq_queue *cfqq;
 
        cfqq = cfqd->active_queue;
@@ -882,7 +922,7 @@ static struct cfq_queue *cfq_select_queue(struct cfq_data *cfqd)
        /*
         * slice has expired
         */
-       if (!cfq_cfqq_must_dispatch(cfqq) && time_after(now, cfqq->slice_end))
+       if (!cfq_cfqq_must_dispatch(cfqq) && cfq_slice_used(cfqq))
                goto expire;
 
        /*
@@ -891,16 +931,16 @@ static struct cfq_queue *cfq_select_queue(struct cfq_data *cfqd)
         */
        if (!RB_EMPTY_ROOT(&cfqq->sort_list))
                goto keep_queue;
-       else if (cfq_cfqq_dispatched(cfqq)) {
+       else if (cfq_cfqq_slice_new(cfqq) || cfq_cfqq_dispatched(cfqq)) {
                cfqq = NULL;
                goto keep_queue;
        } else if (cfq_cfqq_class_sync(cfqq)) {
-               if (cfq_arm_slice_timer(cfqd, cfqq))
+               if (cfq_arm_slice_timer(cfqd))
                        return NULL;
        }
 
 expire:
-       cfq_slice_expired(cfqd, 0);
+       cfq_slice_expired(cfqd, 0, 0);
 new_queue:
        cfqq = cfq_set_active_queue(cfqd);
 keep_queue:
@@ -942,21 +982,16 @@ __cfq_dispatch_requests(struct cfq_data *cfqd, struct cfq_queue *cfqq,
 
        } while (dispatched < max_dispatch);
 
-       /*
-        * if slice end isn't set yet, set it.
-        */
-       if (!cfqq->slice_end)
-               cfq_set_prio_slice(cfqd, cfqq);
-
        /*
         * expire an async queue immediately if it has used up its slice. idle
         * queue always expire after 1 dispatch round.
         */
        if ((!cfq_cfqq_sync(cfqq) &&
            cfqd->dispatch_slice >= cfq_prio_to_maxrq(cfqd, cfqq)) ||
-           cfq_class_idle(cfqq) ||
-           !cfq_cfqq_idle_window(cfqq))
-               cfq_slice_expired(cfqd, 0);
+           cfq_class_idle(cfqq)) {
+               cfqq->slice_end = jiffies + 1;
+               cfq_slice_expired(cfqd, 0, 0);
+       }
 
        return dispatched;
 }
@@ -991,7 +1026,7 @@ cfq_forced_dispatch(struct cfq_data *cfqd)
        dispatched += cfq_forced_dispatch_cfqqs(&cfqd->cur_rr);
        dispatched += cfq_forced_dispatch_cfqqs(&cfqd->idle_rr);
 
-       cfq_slice_expired(cfqd, 0);
+       cfq_slice_expired(cfqd, 0, 0);
 
        BUG_ON(cfqd->busy_queues);
 
@@ -1022,6 +1057,14 @@ cfq_dispatch_requests(request_queue_t *q, int force)
                if (prev_cfqq == cfqq)
                        break;
 
+               /*
+                * So we have dispatched before in this round, if the
+                * next queue has idling enabled (must be sync), don't
+                * allow it service until the previous have continued.
+                */
+               if (cfqd->rq_in_driver && cfq_cfqq_idle_window(cfqq))
+                       break;
+
                cfq_clear_cfqq_must_dispatch(cfqq);
                cfq_clear_cfqq_wait_request(cfqq);
                del_timer(&cfqd->idle_slice_timer);
@@ -1031,14 +1074,6 @@ cfq_dispatch_requests(request_queue_t *q, int force)
                        max_dispatch = 1;
 
                dispatched += __cfq_dispatch_requests(cfqd, cfqq, max_dispatch);
-
-               /*
-                * If the dispatch cfqq has idling enabled and is still
-                * the active queue, break out.
-                */
-               if (cfq_cfqq_idle_window(cfqq) && cfqd->active_queue)
-                       break;
-
                prev_cfqq = cfqq;
        }
 
@@ -1064,8 +1099,10 @@ static void cfq_put_queue(struct cfq_queue *cfqq)
        BUG_ON(cfqq->allocated[READ] + cfqq->allocated[WRITE]);
        BUG_ON(cfq_cfqq_on_rr(cfqq));
 
-       if (unlikely(cfqd->active_queue == cfqq))
-               __cfq_slice_expired(cfqd, cfqq, 0);
+       if (unlikely(cfqd->active_queue == cfqq)) {
+               __cfq_slice_expired(cfqd, cfqq, 0, 0);
+               cfq_schedule_dispatch(cfqd);
+       }
 
        /*
         * it's on the empty list and still hashed
@@ -1120,8 +1157,10 @@ static void cfq_free_io_context(struct io_context *ioc)
 
 static void cfq_exit_cfqq(struct cfq_data *cfqd, struct cfq_queue *cfqq)
 {
-       if (unlikely(cfqq == cfqd->active_queue))
-               __cfq_slice_expired(cfqd, cfqq, 0);
+       if (unlikely(cfqq == cfqd->active_queue)) {
+               __cfq_slice_expired(cfqd, cfqq, 0, 0);
+               cfq_schedule_dispatch(cfqd);
+       }
 
        cfq_put_queue(cfqq);
 }
@@ -1238,9 +1277,7 @@ static void cfq_init_prio_data(struct cfq_queue *cfqq)
        cfqq->org_ioprio = cfqq->ioprio;
        cfqq->org_ioprio_class = cfqq->ioprio_class;
 
-       if (cfq_cfqq_on_rr(cfqq))
-               cfq_resort_rr_list(cfqq, 0);
-
+       cfq_resort_rr_list(cfqq, 0);
        cfq_clear_cfqq_prio_changed(cfqq);
 }
 
@@ -1332,10 +1369,7 @@ retry:
                hlist_add_head(&cfqq->cfq_hash, &cfqd->cfq_hash[hashval]);
                atomic_set(&cfqq->ref, 0);
                cfqq->cfqd = cfqd;
-               /*
-                * set ->slice_left to allow preemption for a new process
-                */
-               cfqq->slice_left = 2 * cfqd->cfq_slice_idle;
+
                cfq_mark_cfqq_idle_window(cfqq);
                cfq_mark_cfqq_prio_changed(cfqq);
                cfq_mark_cfqq_queue_new(cfqq);
@@ -1471,22 +1505,8 @@ err:
 static void
 cfq_update_io_thinktime(struct cfq_data *cfqd, struct cfq_io_context *cic)
 {
-       unsigned long elapsed, ttime;
-
-       /*
-        * if this context already has stuff queued, thinktime is from
-        * last queue not last end
-        */
-#if 0
-       if (time_after(cic->last_end_request, cic->last_queue))
-               elapsed = jiffies - cic->last_end_request;
-       else
-               elapsed = jiffies - cic->last_queue;
-#else
-               elapsed = jiffies - cic->last_end_request;
-#endif
-
-       ttime = min(elapsed, 2UL * cfqd->cfq_slice_idle);
+       unsigned long elapsed = jiffies - cic->last_end_request;
+       unsigned long ttime = min(elapsed, 2UL * cfqd->cfq_slice_idle);
 
        cic->ttime_samples = (7*cic->ttime_samples + 256) / 8;
        cic->ttime_total = (7*cic->ttime_total + 256*ttime) / 8;
@@ -1546,7 +1566,6 @@ cfq_update_idle_window(struct cfq_data *cfqd, struct cfq_queue *cfqq,
                cfq_clear_cfqq_idle_window(cfqq);
 }
 
-
 /*
  * Check if new_cfqq should preempt the currently active queue. Return 0 for
  * no or if we aren't sure, a 1 will cause a preempt.
@@ -1567,11 +1586,6 @@ cfq_should_preempt(struct cfq_data *cfqd, struct cfq_queue *new_cfqq,
                return 1;
        if (!cfq_cfqq_wait_request(new_cfqq))
                return 0;
-       /*
-        * if it doesn't have slice left, forget it
-        */
-       if (new_cfqq->slice_left < cfqd->cfq_slice_idle)
-               return 0;
        /*
         * if the new request is sync, but the currently running queue is
         * not, let the sync request have priority.
@@ -1594,10 +1608,7 @@ cfq_should_preempt(struct cfq_data *cfqd, struct cfq_queue *new_cfqq,
  */
 static void cfq_preempt_queue(struct cfq_data *cfqd, struct cfq_queue *cfqq)
 {
-       cfq_slice_expired(cfqd, 1);
-
-       if (!cfqq->slice_left)
-               cfqq->slice_left = cfq_prio_to_slice(cfqd, cfqq) / 2;
+       cfq_slice_expired(cfqd, 1, 1);
 
        /*
         * Put the new queue at the front of the of the current list,
@@ -1606,7 +1617,8 @@ static void cfq_preempt_queue(struct cfq_data *cfqd, struct cfq_queue *cfqq)
        BUG_ON(!cfq_cfqq_on_rr(cfqq));
        list_move(&cfqq->cfq_list, &cfqd->cur_rr);
 
-       cfqq->slice_end = cfqq->slice_left + jiffies;
+       cfqq->slice_end = 0;
+       cfq_mark_cfqq_slice_new(cfqq);
 }
 
 /*
@@ -1639,7 +1651,7 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
                 */
                if (cic == cfqd->active_cic &&
                    del_timer(&cfqd->idle_slice_timer)) {
-                       cfq_slice_expired(cfqd, 0);
+                       cfq_slice_expired(cfqd, 0, 0);
                        blk_start_queueing(cfqd->queue);
                }
                return;
@@ -1649,7 +1661,6 @@ cfq_rq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
        cfq_update_io_seektime(cic, rq);
        cfq_update_idle_window(cfqd, cfqq, cic);
 
-       cic->last_queue = jiffies;
        cic->last_request_pos = rq->sector + rq->nr_sectors;
 
        if (cfqq == cfqd->active_queue) {
@@ -1702,12 +1713,12 @@ static void cfq_completed_request(request_queue_t *q, struct request *rq)
        WARN_ON(!cfqq->on_dispatch[sync]);
        cfqd->rq_in_driver--;
        cfqq->on_dispatch[sync]--;
+       cfqq->service_last = now;
 
        if (!cfq_class_idle(cfqq))
                cfqd->last_end_request = now;
 
-       if (!cfq_cfqq_dispatched(cfqq) && cfq_cfqq_on_rr(cfqq))
-               cfq_resort_rr_list(cfqq, 0);
+       cfq_resort_rr_list(cfqq, 0);
 
        if (sync)
                RQ_CIC(rq)->last_end_request = now;
@@ -1717,10 +1728,14 @@ static void cfq_completed_request(request_queue_t *q, struct request *rq)
         * or if we want to idle in case it has no pending requests.
         */
        if (cfqd->active_queue == cfqq) {
-               if (time_after(now, cfqq->slice_end))
-                       cfq_slice_expired(cfqd, 0);
+               if (cfq_cfqq_slice_new(cfqq)) {
+                       cfq_set_prio_slice(cfqd, cfqq);
+                       cfq_clear_cfqq_slice_new(cfqq);
+               }
+               if (cfq_slice_used(cfqq))
+                       cfq_slice_expired(cfqd, 0, 1);
                else if (sync && RB_EMPTY_ROOT(&cfqq->sort_list)) {
-                       if (!cfq_arm_slice_timer(cfqd, cfqq))
+                       if (!cfq_arm_slice_timer(cfqd))
                                cfq_schedule_dispatch(cfqd);
                }
        }
@@ -1757,8 +1772,7 @@ static void cfq_prio_boost(struct cfq_queue *cfqq)
        /*
         * refile between round-robin lists if we moved the priority class
         */
-       if ((ioprio_class != cfqq->ioprio_class || ioprio != cfqq->ioprio) &&
-           cfq_cfqq_on_rr(cfqq))
+       if ((ioprio_class != cfqq->ioprio_class || ioprio != cfqq->ioprio))
                cfq_resort_rr_list(cfqq, 0);
 }
 
@@ -1893,16 +1907,17 @@ static void cfq_idle_slice_timer(unsigned long data)
        struct cfq_data *cfqd = (struct cfq_data *) data;
        struct cfq_queue *cfqq;
        unsigned long flags;
+       int timed_out = 1;
 
        spin_lock_irqsave(cfqd->queue->queue_lock, flags);
 
        if ((cfqq = cfqd->active_queue) != NULL) {
-               unsigned long now = jiffies;
+               timed_out = 0;
 
                /*
                 * expired
                 */
-               if (time_after(now, cfqq->slice_end))
+               if (cfq_slice_used(cfqq))
                        goto expire;
 
                /*
@@ -1921,7 +1936,7 @@ static void cfq_idle_slice_timer(unsigned long data)
                }
        }
 expire:
-       cfq_slice_expired(cfqd, 0);
+       cfq_slice_expired(cfqd, 0, timed_out);
 out_kick:
        cfq_schedule_dispatch(cfqd);
 out_cont:
@@ -1967,7 +1982,7 @@ static void cfq_exit_queue(elevator_t *e)
        spin_lock_irq(q->queue_lock);
 
        if (cfqd->active_queue)
-               __cfq_slice_expired(cfqd, cfqd->active_queue, 0);
+               __cfq_slice_expired(cfqd, cfqd->active_queue, 0, 0);
 
        while (!list_empty(&cfqd->cic_list)) {
                struct cfq_io_context *cic = list_entry(cfqd->cic_list.next,
index f6dafa8c7c4d03bea2522125895bf43579480cb9..25f6ef28e3bb34567db40fb0d8472f39038d0ae5 100644 (file)
@@ -269,6 +269,22 @@ void elevator_exit(elevator_t *e)
 
 EXPORT_SYMBOL(elevator_exit);
 
+static void elv_activate_rq(request_queue_t *q, struct request *rq)
+{
+       elevator_t *e = q->elevator;
+
+       if (e->ops->elevator_activate_req_fn)
+               e->ops->elevator_activate_req_fn(q, rq);
+}
+
+static void elv_deactivate_rq(request_queue_t *q, struct request *rq)
+{
+       elevator_t *e = q->elevator;
+
+       if (e->ops->elevator_deactivate_req_fn)
+               e->ops->elevator_deactivate_req_fn(q, rq);
+}
+
 static inline void __elv_rqhash_del(struct request *rq)
 {
        hlist_del_init(&rq->hash);
@@ -397,6 +413,8 @@ void elv_dispatch_sort(request_queue_t *q, struct request *rq)
        list_for_each_prev(entry, &q->queue_head) {
                struct request *pos = list_entry_rq(entry);
 
+               if (rq_data_dir(rq) != rq_data_dir(pos))
+                       break;
                if (pos->cmd_flags & (REQ_SOFTBARRIER|REQ_HARDBARRIER|REQ_STARTED))
                        break;
                if (rq->sector >= boundary) {
@@ -498,16 +516,14 @@ void elv_merge_requests(request_queue_t *q, struct request *rq,
 
 void elv_requeue_request(request_queue_t *q, struct request *rq)
 {
-       elevator_t *e = q->elevator;
-
        /*
         * it already went through dequeue, we need to decrement the
         * in_flight count again
         */
        if (blk_account_rq(rq)) {
                q->in_flight--;
-               if (blk_sorted_rq(rq) && e->ops->elevator_deactivate_req_fn)
-                       e->ops->elevator_deactivate_req_fn(q, rq);
+               if (blk_sorted_rq(rq))
+                       elv_deactivate_rq(q, rq);
        }
 
        rq->cmd_flags &= ~REQ_STARTED;
@@ -700,16 +716,13 @@ struct request *elv_next_request(request_queue_t *q)
 
        while ((rq = __elv_next_request(q)) != NULL) {
                if (!(rq->cmd_flags & REQ_STARTED)) {
-                       elevator_t *e = q->elevator;
-
                        /*
                         * This is the first time the device driver
                         * sees this request (possibly after
                         * requeueing).  Notify IO scheduler.
                         */
-                       if (blk_sorted_rq(rq) &&
-                           e->ops->elevator_activate_req_fn)
-                               e->ops->elevator_activate_req_fn(q, rq);
+                       if (blk_sorted_rq(rq))
+                               elv_activate_rq(q, rq);
 
                        /*
                         * just mark as started even if we don't start
index 457fdac4c17d98db97cebd0c6910e23f4f97399f..36bd3e12a6d4c58bdda0dde62237a50d84b93d09 100644 (file)
@@ -61,6 +61,14 @@ int register_blkdev(unsigned int major, const char *name)
        /* temporary */
        if (major == 0) {
                for (index = ARRAY_SIZE(major_names)-1; index > 0; index--) {
+                       /*
+                        * Disallow the LANANA-assigned LOCAL/EXPERIMENTAL
+                        * majors
+                        */
+                       if ((60 <= index && index <= 63) ||
+                                       (120 <= index && index <= 127) ||
+                                       (240 <= index && index <= 254))
+                               continue;
                        if (major_names[index] == NULL)
                                break;
                }
index f6962b64660ea67c6092c6303d7d52cd69bffbeb..e3f5eb9882cf4dfb403f6ca64f7262180b9db0fa 100644 (file)
@@ -61,7 +61,7 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user
                                }
                        }
                        /* all seems OK */
-                       add_partition(disk, part, start, length);
+                       add_partition(disk, part, start, length, ADDPART_FLAG_NONE);
                        mutex_unlock(&bdev->bd_mutex);
                        return 0;
                case BLKPG_DEL_PARTITION:
index dabce0676f63abb358f469c98a57b44afdd774e1..102c751a124c1d0368b9c7e9d8b1c421181e7667 100644 (file)
@@ -101,7 +101,7 @@ static int crypto_info_open(struct inode *inode, struct file *file)
        return seq_open(file, &crypto_seq_ops);
 }
         
-static struct file_operations proc_crypto_ops = {
+static const struct file_operations proc_crypto_ops = {
        .open           = crypto_info_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index e7da9fa724ec5f50aa70040df67c10c2d7cbf2fe..050323fd79e9ae78f4f528ce260e08a8ec89f38b 100644 (file)
@@ -80,6 +80,8 @@ source "drivers/rtc/Kconfig"
 
 source "drivers/dma/Kconfig"
 
+source "drivers/auxdisplay/Kconfig"
+
 source "drivers/kvm/Kconfig"
 
 endmenu
index f28dcb4ec8b38e69d79e3e4e9263fa62e7e9cbc0..3a718f51350ed53e369609efb7086581656f7aca 100644 (file)
@@ -38,6 +38,7 @@ obj-$(CONFIG_ATA)             += ata/
 obj-$(CONFIG_FUSION)           += message/
 obj-$(CONFIG_IEEE1394)         += ieee1394/
 obj-y                          += cdrom/
+obj-y                          += auxdisplay/
 obj-$(CONFIG_MTD)              += mtd/
 obj-$(CONFIG_SPI)              += spi/
 obj-$(CONFIG_PCCARD)           += pcmcia/
index 7fde8f4daebfff867e688e275c09a735634c9292..689a4c3542babc00e385699fe1caf4b02c0f9103 100644 (file)
@@ -99,7 +99,6 @@
  */
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/fs.h>
 #include <linux/interrupt.h>
 #include <linux/kernel.h>
index 9e584a7af434eec943908eeaa97477e2b0b80f06..d276fd14d63a05ff63f529bd5a4525584e580a85 100644 (file)
@@ -14,7 +14,6 @@
  */
 #include <linux/capability.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/time.h>
 #include <linux/miscdevice.h>
 #include <linux/rtc.h>
@@ -238,7 +237,7 @@ static int rtc_ioctl(struct inode *inode, struct file *file,
        return -EINVAL;
 }
 
-static struct file_operations rtc_fops = {
+static const struct file_operations rtc_fops = {
        .ioctl  = rtc_ioctl,
 };
 
index 20eacc2c9e0e5223f27d9f979672a5ed031b350b..e942ffe8b57ee4c9a13a447bf205e3939815dfcc 100644 (file)
@@ -13,6 +13,7 @@ config ACPI
        depends on IA64 || X86
        depends on PCI
        depends on PM
+       select PNP
        default y
        ---help---
          Advanced Configuration and Power Interface (ACPI) support for 
@@ -132,15 +133,6 @@ config ACPI_VIDEO
          Note that this is an ref. implementation only.  It may or may not work
          for your integrated video device.
 
-config ACPI_HOTKEY
-       tristate "Generic Hotkey (EXPERIMENTAL)"
-       depends on EXPERIMENTAL
-       depends on X86
-       default n
-       help
-         Experimental consolidated hotkey driver.
-         If you are unsure, say N.
-
 config ACPI_FAN
        tristate "Fan"
        default y
index 856c32bccacb04024b7036282bed0c865ef7395e..5956e9f64a8bfd682754999267f99f80ba9a7558 100644 (file)
@@ -46,7 +46,6 @@ obj-$(CONFIG_ACPI_FAN)                += fan.o
 obj-$(CONFIG_ACPI_DOCK)                += dock.o
 obj-$(CONFIG_ACPI_BAY)         += bay.o
 obj-$(CONFIG_ACPI_VIDEO)       += video.o
-obj-$(CONFIG_ACPI_HOTKEY)      += hotkey.o
 obj-y                          += pci_root.o pci_link.o pci_irq.o pci_bind.o
 obj-$(CONFIG_ACPI_POWER)       += power.o
 obj-$(CONFIG_ACPI_PROCESSOR)   += processor.o
index 6daeace796a86c2b3e7892c517b5bab107ceb8a7..37c7dc4f9fe5db6d15b7bba43803790f0c0ee588 100644 (file)
@@ -35,7 +35,6 @@
 #define ACPI_AC_COMPONENT              0x00020000
 #define ACPI_AC_CLASS                  "ac_adapter"
 #define ACPI_AC_HID                    "ACPI0003"
-#define ACPI_AC_DRIVER_NAME            "ACPI AC Adapter Driver"
 #define ACPI_AC_DEVICE_NAME            "AC Adapter"
 #define ACPI_AC_FILE_STATE             "state"
 #define ACPI_AC_NOTIFY_STATUS          0x80
 #define ACPI_AC_STATUS_UNKNOWN         0xFF
 
 #define _COMPONENT             ACPI_AC_COMPONENT
-ACPI_MODULE_NAME("acpi_ac")
+ACPI_MODULE_NAME("ac");
 
-    MODULE_AUTHOR("Paul Diefenbaugh");
-MODULE_DESCRIPTION(ACPI_AC_DRIVER_NAME);
+MODULE_AUTHOR("Paul Diefenbaugh");
+MODULE_DESCRIPTION("ACPI AC Adapter Driver");
 MODULE_LICENSE("GPL");
 
 extern struct proc_dir_entry *acpi_lock_ac_dir(void);
@@ -58,7 +57,7 @@ static int acpi_ac_remove(struct acpi_device *device, int type);
 static int acpi_ac_open_fs(struct inode *inode, struct file *file);
 
 static struct acpi_driver acpi_ac_driver = {
-       .name = ACPI_AC_DRIVER_NAME,
+       .name = "ac",
        .class = ACPI_AC_CLASS,
        .ids = ACPI_AC_HID,
        .ops = {
index cd946ed192d3e38a1539fcd58abfcfaf06258c26..c26172671fd882a175eb04cba40d6a8d1db8c304 100644 (file)
 #define ACPI_MEMORY_DEVICE_COMPONENT           0x08000000UL
 #define ACPI_MEMORY_DEVICE_CLASS               "memory"
 #define ACPI_MEMORY_DEVICE_HID                 "PNP0C80"
-#define ACPI_MEMORY_DEVICE_DRIVER_NAME         "Hotplug Mem Driver"
 #define ACPI_MEMORY_DEVICE_NAME                        "Hotplug Mem Device"
 
 #define _COMPONENT             ACPI_MEMORY_DEVICE_COMPONENT
 
-ACPI_MODULE_NAME("acpi_memory")
-    MODULE_AUTHOR("Naveen B S <naveen.b.s@intel.com>");
-MODULE_DESCRIPTION(ACPI_MEMORY_DEVICE_DRIVER_NAME);
+ACPI_MODULE_NAME("acpi_memhotplug");
+MODULE_AUTHOR("Naveen B S <naveen.b.s@intel.com>");
+MODULE_DESCRIPTION("Hotplug Mem Driver");
 MODULE_LICENSE("GPL");
 
 /* ACPI _STA method values */
@@ -60,7 +59,7 @@ static int acpi_memory_device_remove(struct acpi_device *device, int type);
 static int acpi_memory_device_start(struct acpi_device *device);
 
 static struct acpi_driver acpi_memory_device_driver = {
-       .name = ACPI_MEMORY_DEVICE_DRIVER_NAME,
+       .name = "acpi_memhotplug",
        .class = ACPI_MEMORY_DEVICE_CLASS,
        .ids = ACPI_MEMORY_DEVICE_HID,
        .ops = {
index 31ad70a6e22eb3074261b757fc7d831b841c9bed..772299fb5f9d97e54078f549e8241a852bbf181b 100644 (file)
@@ -141,6 +141,7 @@ struct asus_hotk {
                W5A,            //W5A
                W3V,            //W3030V
                xxN,            //M2400N, M3700N, M5200N, M6800N, S1300N, S5200N
+               A4S,            //Z81sp
                //(Centrino)
                END_MODEL
        } model;                //Models currently supported
@@ -397,7 +398,16 @@ static struct model_data model_conf[END_MODEL] = {
         .brightness_set = "SPLV",
         .brightness_get = "GPLV",
         .display_set = "SDSP",
-        .display_get = "\\ADVG"}
+       .display_get = "\\ADVG"},
+
+       {
+               .name              = "A4S",
+               .brightness_set    = "SPLV",
+               .brightness_get    = "GPLV",
+               .mt_bt_switch      = "BLED",
+               .mt_wled           = "WLED"
+       }
+
 };
 
 /* procdir we use */
@@ -421,7 +431,7 @@ static struct asus_hotk *hotk;
 static int asus_hotk_add(struct acpi_device *device);
 static int asus_hotk_remove(struct acpi_device *device, int type);
 static struct acpi_driver asus_hotk_driver = {
-       .name = ACPI_HOTK_NAME,
+       .name = "asus_acpi",
        .class = ACPI_HOTK_CLASS,
        .ids = ACPI_HOTK_HID,
        .ops = {
@@ -1117,6 +1127,8 @@ static int asus_model_match(char *model)
                return W3V;
        else if (strncmp(model, "W5A", 3) == 0)
                return W5A;
+       else if (strncmp(model, "A4S", 3) == 0)
+               return A4S;
        else
                return END_MODEL;
 }
@@ -1365,10 +1377,6 @@ static int __init asus_acpi_init(void)
        if (acpi_disabled)
                return -ENODEV;
 
-       if (!acpi_specific_hotkey_enabled) {
-               printk(KERN_ERR "Using generic hotkey driver\n");
-               return -ENODEV;
-       }
        asus_proc_dir = proc_mkdir(PROC_ASUS, acpi_root_dir);
        if (!asus_proc_dir) {
                printk(KERN_ERR "Asus ACPI: Unable to create /proc entry\n");
index 0d7a32e502d1040c7eddd2e8b619055cbae0fb0d..e64c76c8b7268a56562969d48b6c940bbda09bfc 100644 (file)
@@ -42,7 +42,6 @@
 #define ACPI_BATTERY_COMPONENT         0x00040000
 #define ACPI_BATTERY_CLASS             "battery"
 #define ACPI_BATTERY_HID               "PNP0C0A"
-#define ACPI_BATTERY_DRIVER_NAME       "ACPI Battery Driver"
 #define ACPI_BATTERY_DEVICE_NAME       "Battery"
 #define ACPI_BATTERY_FILE_INFO         "info"
 #define ACPI_BATTERY_FILE_STATUS       "state"
 #define ACPI_BATTERY_UNITS_AMPS                "mA"
 
 #define _COMPONENT             ACPI_BATTERY_COMPONENT
-ACPI_MODULE_NAME("acpi_battery")
+ACPI_MODULE_NAME("battery");
 
-    MODULE_AUTHOR("Paul Diefenbaugh");
-MODULE_DESCRIPTION(ACPI_BATTERY_DRIVER_NAME);
+MODULE_AUTHOR("Paul Diefenbaugh");
+MODULE_DESCRIPTION("ACPI Battery Driver");
 MODULE_LICENSE("GPL");
 
 extern struct proc_dir_entry *acpi_lock_battery_dir(void);
@@ -67,7 +66,7 @@ static int acpi_battery_remove(struct acpi_device *device, int type);
 static int acpi_battery_resume(struct acpi_device *device);
 
 static struct acpi_driver acpi_battery_driver = {
-       .name = ACPI_BATTERY_DRIVER_NAME,
+       .name = "battery",
        .class = ACPI_BATTERY_CLASS,
        .ids = ACPI_BATTERY_HID,
        .ops = {
index 91082ce6f5d1de0e158704401c45d46590336afa..fb3f31b5e69f6587ff4c7cada15b2291c64fad40 100644 (file)
 #include <asm/uaccess.h>
 #include <linux/platform_device.h>
 
-#define ACPI_BAY_DRIVER_NAME "ACPI Removable Drive Bay Driver"
-
-ACPI_MODULE_NAME("bay")
+ACPI_MODULE_NAME("bay");
 MODULE_AUTHOR("Kristen Carlson Accardi");
-MODULE_DESCRIPTION(ACPI_BAY_DRIVER_NAME);
+MODULE_DESCRIPTION("ACPI Removable Drive Bay Driver");
 MODULE_LICENSE("GPL");
 #define ACPI_BAY_CLASS "bay"
 #define ACPI_BAY_COMPONENT     0x10000000
@@ -47,18 +45,6 @@ MODULE_LICENSE("GPL");
        acpi_get_name(h, ACPI_FULL_PATHNAME, &buffer);\
        printk(KERN_DEBUG PREFIX "%s: %s\n", prefix, s); }
 static void bay_notify(acpi_handle handle, u32 event, void *data);
-static int acpi_bay_add(struct acpi_device *device);
-static int acpi_bay_remove(struct acpi_device *device, int type);
-
-static struct acpi_driver acpi_bay_driver = {
-       .name = ACPI_BAY_DRIVER_NAME,
-       .class = ACPI_BAY_CLASS,
-       .ids = ACPI_BAY_HID,
-       .ops = {
-               .add = acpi_bay_add,
-               .remove = acpi_bay_remove,
-               },
-};
 
 struct bay {
        acpi_handle handle;
@@ -234,14 +220,6 @@ int eject_removable_drive(struct device *dev)
 }
 EXPORT_SYMBOL_GPL(eject_removable_drive);
 
-static int acpi_bay_add(struct acpi_device *device)
-{
-       bay_dprintk(device->handle, "adding bay device");
-       strcpy(acpi_device_name(device), "Dockable Bay");
-       strcpy(acpi_device_class(device), "bay");
-       return 0;
-}
-
 static int acpi_bay_add_fs(struct bay *bay)
 {
        int ret;
@@ -303,7 +281,7 @@ static int bay_add(acpi_handle handle, int id)
 
        /* initialize platform device stuff */
        pdev = platform_device_register_simple(ACPI_BAY_CLASS, id, NULL, 0);
-       if (pdev == NULL) {
+       if (IS_ERR(pdev)) {
                printk(KERN_ERR PREFIX "Error registering bay device\n");
                goto bay_add_err;
        }
@@ -339,52 +317,6 @@ bay_add_err:
        return -ENODEV;
 }
 
-static int acpi_bay_remove(struct acpi_device *device, int type)
-{
-       /*** FIXME: do something here */
-       return 0;
-}
-
-/**
- * bay_create_acpi_device - add new devices to acpi
- * @handle - handle of the device to add
- *
- *  This function will create a new acpi_device for the given
- *  handle if one does not exist already.  This should cause
- *  acpi to scan for drivers for the given devices, and call
- *  matching driver's add routine.
- *
- *  Returns a pointer to the acpi_device corresponding to the handle.
- */
-static struct acpi_device * bay_create_acpi_device(acpi_handle handle)
-{
-       struct acpi_device *device = NULL;
-       struct acpi_device *parent_device;
-       acpi_handle parent;
-       int ret;
-
-       bay_dprintk(handle, "Trying to get device");
-       if (acpi_bus_get_device(handle, &device)) {
-               /*
-                * no device created for this object,
-                * so we should create one.
-                */
-               bay_dprintk(handle, "No device for handle");
-               acpi_get_parent(handle, &parent);
-               if (acpi_bus_get_device(parent, &parent_device))
-                       parent_device = NULL;
-
-               ret = acpi_bus_add(&device, parent_device, handle,
-                       ACPI_BUS_TYPE_DEVICE);
-               if (ret) {
-                       pr_debug("error adding bus, %x\n",
-                               -ret);
-                       return NULL;
-               }
-       }
-       return device;
-}
-
 /**
  * bay_notify - act upon an acpi bay notification
  * @handle: the bay handle
@@ -394,38 +326,19 @@ static struct acpi_device * bay_create_acpi_device(acpi_handle handle)
  */
 static void bay_notify(acpi_handle handle, u32 event, void *data)
 {
-       struct acpi_device *dev;
+       struct bay *bay_dev = (struct bay *)data;
+       struct device *dev = &bay_dev->pdev->dev;
 
        bay_dprintk(handle, "Bay event");
 
        switch(event) {
        case ACPI_NOTIFY_BUS_CHECK:
-               printk("Bus Check\n");
        case ACPI_NOTIFY_DEVICE_CHECK:
-               printk("Device Check\n");
-               dev = bay_create_acpi_device(handle);
-               if (dev)
-                       acpi_bus_generate_event(dev, event, 0);
-               else
-                       printk("No device for generating event\n");
-               /* wouldn't it be a good idea to just rescan SATA
-                * right here?
-                */
-               break;
        case ACPI_NOTIFY_EJECT_REQUEST:
-               printk("Eject request\n");
-               dev = bay_create_acpi_device(handle);
-               if (dev)
-                       acpi_bus_generate_event(dev, event, 0);
-               else
-                       printk("No device for generating eventn");
-
-               /* wouldn't it be a good idea to just call the
-                * eject_device here if we were a SATA device?
-                */
+               kobject_uevent(&dev->kobj, KOBJ_CHANGE);
                break;
        default:
-               printk("unknown event %d\n", event);
+               printk(KERN_ERR PREFIX "Bay: unknown event %d\n", event);
        }
 }
 
@@ -457,10 +370,6 @@ static int __init bay_init(void)
        acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
                ACPI_UINT32_MAX, find_bay, &bays, NULL);
 
-       if (bays)
-               if ((acpi_bus_register_driver(&acpi_bay_driver) < 0))
-                       printk(KERN_ERR "Unable to register bay driver\n");
-
        if (!bays)
                return -ENODEV;
 
@@ -481,8 +390,6 @@ static void __exit bay_exit(void)
                kfree(bay->name);
                kfree(bay);
        }
-
-       acpi_bus_unregister_driver(&acpi_bay_driver);
 }
 
 postcore_initcall(bay_init);
index c26468da429507be4ccef20e3f1b57165d860d85..fd37e19360d018e180f82bea3b29850a60606bb0 100644 (file)
@@ -39,7 +39,7 @@
 #include <acpi/acpi_drivers.h>
 
 #define _COMPONENT             ACPI_BUS_COMPONENT
-ACPI_MODULE_NAME("acpi_bus")
+ACPI_MODULE_NAME("bus");
 #ifdef CONFIG_X86
 extern void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger);
 #endif
index c726612fafb606a6c7869666c7cd4af9dcd374c7..cb4110b50cd0f19f15b0f6c6d124861bd62a82ef 100644 (file)
@@ -34,7 +34,6 @@
 #include <acpi/acpi_drivers.h>
 
 #define ACPI_BUTTON_COMPONENT          0x00080000
-#define ACPI_BUTTON_DRIVER_NAME                "ACPI Button Driver"
 #define ACPI_BUTTON_CLASS              "button"
 #define ACPI_BUTTON_FILE_INFO          "info"
 #define ACPI_BUTTON_FILE_STATE         "state"
 #define ACPI_BUTTON_TYPE_LID           0x05
 
 #define _COMPONENT             ACPI_BUTTON_COMPONENT
-ACPI_MODULE_NAME("acpi_button")
+ACPI_MODULE_NAME("button");
 
 MODULE_AUTHOR("Paul Diefenbaugh");
-MODULE_DESCRIPTION(ACPI_BUTTON_DRIVER_NAME);
+MODULE_DESCRIPTION("ACPI Button Driver");
 MODULE_LICENSE("GPL");
 
 static int acpi_button_add(struct acpi_device *device);
@@ -73,7 +72,7 @@ static int acpi_button_info_open_fs(struct inode *inode, struct file *file);
 static int acpi_button_state_open_fs(struct inode *inode, struct file *file);
 
 static struct acpi_driver acpi_button_driver = {
-       .name = ACPI_BUTTON_DRIVER_NAME,
+       .name = "button",
        .class = ACPI_BUTTON_CLASS,
        .ids = "button_power,button_sleep,PNP0C0D,PNP0C0C,PNP0C0E",
        .ops = {
index 4a9b7bf6f44ed79a3fff799c3a5245ed49f273a6..f9db4f444bd0f814fe4ffbec8252e4227df981dc 100644 (file)
@@ -31,7 +31,7 @@
 #include <acpi/actypes.h>
 #include <acpi/acutils.h>
 
-ACPI_MODULE_NAME("cm_sbs")
+ACPI_MODULE_NAME("cm_sbs");
 #define ACPI_AC_CLASS          "ac_adapter"
 #define ACPI_BATTERY_CLASS     "battery"
 #define ACPI_SBS_COMPONENT     0x00080000
index 69a68fd394cf6861c5e8bb9618604523fa08785d..0930d9413dfa31768e889e7150e9dd55a0691670 100644 (file)
@@ -35,7 +35,6 @@
 #include <acpi/acpi_drivers.h>
 #include <acpi/container.h>
 
-#define ACPI_CONTAINER_DRIVER_NAME     "ACPI container driver"
 #define ACPI_CONTAINER_DEVICE_NAME     "ACPI container device"
 #define ACPI_CONTAINER_CLASS           "container"
 
 
 #define ACPI_CONTAINER_COMPONENT       0x01000000
 #define _COMPONENT                     ACPI_CONTAINER_COMPONENT
-ACPI_MODULE_NAME("acpi_container")
+ACPI_MODULE_NAME("container");
 
-    MODULE_AUTHOR("Anil S Keshavamurthy");
-MODULE_DESCRIPTION(ACPI_CONTAINER_DRIVER_NAME);
+MODULE_AUTHOR("Anil S Keshavamurthy");
+MODULE_DESCRIPTION("ACPI container driver");
 MODULE_LICENSE("GPL");
 
 #define ACPI_STA_PRESENT               (0x00000001)
@@ -56,7 +55,7 @@ static int acpi_container_add(struct acpi_device *device);
 static int acpi_container_remove(struct acpi_device *device, int type);
 
 static struct acpi_driver acpi_container_driver = {
-       .name = ACPI_CONTAINER_DRIVER_NAME,
+       .name = "container",
        .class = ACPI_CONTAINER_CLASS,
        .ids = "ACPI0004,PNP0A05,PNP0A06",
        .ops = {
index d48f65a8f6587122be909ff286280203011f6bf5..bf513e07b7735738c0099171443ac05e6fcc917e 100644 (file)
@@ -12,7 +12,7 @@
 #include <acpi/acglobal.h>
 
 #define _COMPONENT             ACPI_SYSTEM_COMPONENT
-ACPI_MODULE_NAME("debug")
+ACPI_MODULE_NAME("debug");
 
 #ifdef MODULE_PARAM_PREFIX
 #undef MODULE_PARAM_PREFIX
index 1cbe6190582494ed9f3557c58a17b659644f4979..1683e5c5b94c5febc942d191489f0f30634cbe04 100644 (file)
@@ -231,10 +231,8 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node,
                 * Obtain the method mutex if necessary. Do not acquire mutex for a
                 * recursive call.
                 */
-               if (!walk_state ||
-                   !obj_desc->method.mutex->mutex.owner_thread ||
-                   (walk_state->thread !=
-                    obj_desc->method.mutex->mutex.owner_thread)) {
+               if (acpi_os_get_thread_id() !=
+                   obj_desc->method.mutex->mutex.owner_thread_id) {
                        /*
                         * Acquire the method mutex. This releases the interpreter if we
                         * block (and reacquires it before it returns)
@@ -248,14 +246,14 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node,
                        }
 
                        /* Update the mutex and walk info and save the original sync_level */
+                       obj_desc->method.mutex->mutex.owner_thread_id =
+                               acpi_os_get_thread_id();
 
                        if (walk_state) {
                                obj_desc->method.mutex->mutex.
                                    original_sync_level =
                                    walk_state->thread->current_sync_level;
 
-                               obj_desc->method.mutex->mutex.owner_thread =
-                                   walk_state->thread;
                                walk_state->thread->current_sync_level =
                                    obj_desc->method.sync_level;
                        } else {
@@ -569,7 +567,7 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
 
                        acpi_os_release_mutex(method_desc->method.mutex->mutex.
                                              os_mutex);
-                       method_desc->method.mutex->mutex.owner_thread = NULL;
+                       method_desc->method.mutex->mutex.owner_thread_id = ACPI_MUTEX_NOT_ACQUIRED;
                }
        }
 
index 688e83a169068836c9546564bce5c8e669f8f55b..54a697f9aa1873400cd2ad1237b786e4f3f9550e 100644 (file)
 #include <acpi/acpi_bus.h>
 #include <acpi/acpi_drivers.h>
 
-#define ACPI_DOCK_DRIVER_NAME "ACPI Dock Station Driver"
+#define ACPI_DOCK_DRIVER_DESCRIPTION "ACPI Dock Station Driver"
 
-ACPI_MODULE_NAME("dock")
+ACPI_MODULE_NAME("dock");
 MODULE_AUTHOR("Kristen Carlson Accardi");
-MODULE_DESCRIPTION(ACPI_DOCK_DRIVER_NAME);
+MODULE_DESCRIPTION(ACPI_DOCK_DRIVER_DESCRIPTION);
 MODULE_LICENSE("GPL");
 
 static struct atomic_notifier_head dock_notifier_list;
@@ -741,7 +741,7 @@ static int dock_add(acpi_handle handle)
                goto dock_add_err;
        }
 
-       printk(KERN_INFO PREFIX "%s \n", ACPI_DOCK_DRIVER_NAME);
+       printk(KERN_INFO PREFIX "%s \n", ACPI_DOCK_DRIVER_DESCRIPTION);
 
        return 0;
 
index 743ce27fa0bbf2915c78f4d18fdefecb1fdf133a..ab688837379534b46ab194dacb41925215c3670b 100644 (file)
 #include <acpi/actypes.h>
 
 #define _COMPONENT             ACPI_EC_COMPONENT
-ACPI_MODULE_NAME("acpi_ec")
+ACPI_MODULE_NAME("ec");
 #define ACPI_EC_COMPONENT              0x00100000
 #define ACPI_EC_CLASS                  "embedded_controller"
 #define ACPI_EC_HID                    "PNP0C09"
-#define ACPI_EC_DRIVER_NAME            "ACPI Embedded Controller Driver"
 #define ACPI_EC_DEVICE_NAME            "Embedded Controller"
 #define ACPI_EC_FILE_INFO              "info"
 #undef PREFIX
@@ -80,7 +79,7 @@ static int acpi_ec_stop(struct acpi_device *device, int type);
 static int acpi_ec_add(struct acpi_device *device);
 
 static struct acpi_driver acpi_ec_driver = {
-       .name = ACPI_EC_DRIVER_NAME,
+       .name = "ec",
        .class = ACPI_EC_CLASS,
        .ids = ACPI_EC_HID,
        .ops = {
@@ -280,8 +279,10 @@ static int acpi_ec_transaction(struct acpi_ec *ec, u8 command,
        mutex_lock(&ec->lock);
        if (ec->global_lock) {
                status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
-               if (ACPI_FAILURE(status))
+               if (ACPI_FAILURE(status)) {
+                       mutex_unlock(&ec->lock);
                        return -ENODEV;
+               }
        }
 
        /* Make sure GPE is enabled before doing transaction */
index 959a893c8d1fdbd45d415c4a8a50c954ac498050..3b23562e6f92d195ea24dad4b1eb24131b6f519a 100644 (file)
@@ -13,7 +13,7 @@
 #include <acpi/acpi_drivers.h>
 
 #define _COMPONENT             ACPI_SYSTEM_COMPONENT
-ACPI_MODULE_NAME("event")
+ACPI_MODULE_NAME("event");
 
 /* Global vars for handling event proc entry */
 static DEFINE_SPINLOCK(acpi_system_event_lock);
index dfac3ecc596ebfd9314148d3a54ba80648c9d8b0..635ba449ebc2c97e98c2bc615f44e87bcaaf3092 100644 (file)
@@ -636,17 +636,6 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
                }
        }
 
-       if (!acpi_gbl_system_awake_and_running) {
-               /*
-                * We just woke up because of a wake GPE. Disable any further GPEs
-                * until we are fully up and running (Only wake GPEs should be enabled
-                * at this time, but we just brute-force disable them all.)
-                * 1) We must disable this particular wake GPE so it won't fire again
-                * 2) We want to disable all wake GPEs, since we are now awake
-                */
-               (void)acpi_hw_disable_all_gpes();
-       }
-
        /*
         * Dispatch the GPE to either an installed handler, or the control method
         * associated with this GPE (_Lxx or _Exx). If a handler exists, we invoke
index 1b784ffe54c3d3c5976a28c1fac2301bb9f47e3d..d572700197f309d118ff302fde56c29a2c25fb1a 100644 (file)
@@ -196,12 +196,11 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node * node,
                notify_info->notify.value = (u16) notify_value;
                notify_info->notify.handler_obj = handler_obj;
 
-               status =
-                   acpi_os_execute(OSL_NOTIFY_HANDLER, acpi_ev_notify_dispatch,
-                                   notify_info);
-               if (ACPI_FAILURE(status)) {
-                       acpi_ut_delete_generic_state(notify_info);
-               }
+               acpi_ex_relinquish_interpreter();
+
+               acpi_ev_notify_dispatch(notify_info);
+
+               acpi_ex_reacquire_interpreter();
        }
 
        if (!handler_obj) {
index 68d283fd60e7d254d936b0850a63950a948dbad3..1a73c14df2c5aa7d7f7cdd1c195bb1e202747139 100644 (file)
@@ -134,7 +134,7 @@ static struct acpi_exdump_info acpi_ex_dump_method[8] = {
 static struct acpi_exdump_info acpi_ex_dump_mutex[5] = {
        {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_mutex), NULL},
        {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(mutex.sync_level), "Sync Level"},
-       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.owner_thread), "Owner Thread"},
+       {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.owner_thread_id), "Owner Thread"},
        {ACPI_EXD_UINT16, ACPI_EXD_OFFSET(mutex.acquisition_depth),
         "Acquire Depth"},
        {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(mutex.os_mutex), "OsMutex"}
index 5101bad5baf8b3074d29156b8a47444b286e90f8..4eb883bda6ae7f23800decda4a549042c64c8a94 100644 (file)
@@ -66,10 +66,9 @@ acpi_ex_link_mutex(union acpi_operand_object *obj_desc,
  *
  ******************************************************************************/
 
-void acpi_ex_unlink_mutex(union acpi_operand_object *obj_desc)
+void acpi_ex_unlink_mutex(union acpi_operand_object *obj_desc,
+                         struct acpi_thread_state *thread)
 {
-       struct acpi_thread_state *thread = obj_desc->mutex.owner_thread;
-
        if (!thread) {
                return;
        }
@@ -174,16 +173,13 @@ acpi_ex_acquire_mutex(union acpi_operand_object *time_desc,
 
        /* Support for multiple acquires by the owning thread */
 
-       if (obj_desc->mutex.owner_thread) {
-               if (obj_desc->mutex.owner_thread->thread_id ==
-                   walk_state->thread->thread_id) {
-                       /*
-                        * The mutex is already owned by this thread, just increment the
-                        * acquisition depth
-                        */
-                       obj_desc->mutex.acquisition_depth++;
-                       return_ACPI_STATUS(AE_OK);
-               }
+       if (obj_desc->mutex.owner_thread_id == acpi_os_get_thread_id()) {
+               /*
+                * The mutex is already owned by this thread, just increment the
+                * acquisition depth
+                */
+               obj_desc->mutex.acquisition_depth++;
+               return_ACPI_STATUS(AE_OK);
        }
 
        /* Acquire the mutex, wait if necessary. Special case for Global Lock */
@@ -206,7 +202,7 @@ acpi_ex_acquire_mutex(union acpi_operand_object *time_desc,
 
        /* Have the mutex: update mutex and walk info and save the sync_level */
 
-       obj_desc->mutex.owner_thread = walk_state->thread;
+       obj_desc->mutex.owner_thread_id = acpi_os_get_thread_id();
        obj_desc->mutex.acquisition_depth = 1;
        obj_desc->mutex.original_sync_level =
            walk_state->thread->current_sync_level;
@@ -246,7 +242,7 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
 
        /* The mutex must have been previously acquired in order to release it */
 
-       if (!obj_desc->mutex.owner_thread) {
+       if (!obj_desc->mutex.owner_thread_id) {
                ACPI_ERROR((AE_INFO,
                            "Cannot release Mutex [%4.4s], not acquired",
                            acpi_ut_get_node_name(obj_desc->mutex.node)));
@@ -266,14 +262,14 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
         * The Mutex is owned, but this thread must be the owner.
         * Special case for Global Lock, any thread can release
         */
-       if ((obj_desc->mutex.owner_thread->thread_id !=
+       if ((obj_desc->mutex.owner_thread_id !=
             walk_state->thread->thread_id)
            && (obj_desc->mutex.os_mutex != acpi_gbl_global_lock_mutex)) {
                ACPI_ERROR((AE_INFO,
                            "Thread %lX cannot release Mutex [%4.4s] acquired by thread %lX",
                            (unsigned long)walk_state->thread->thread_id,
                            acpi_ut_get_node_name(obj_desc->mutex.node),
-                           (unsigned long)obj_desc->mutex.owner_thread->thread_id));
+                           (unsigned long)obj_desc->mutex.owner_thread_id));
                return_ACPI_STATUS(AE_AML_NOT_OWNER);
        }
 
@@ -300,7 +296,7 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
 
        /* Unlink the mutex from the owner's list */
 
-       acpi_ex_unlink_mutex(obj_desc);
+       acpi_ex_unlink_mutex(obj_desc, walk_state->thread);
 
        /* Release the mutex, special case for Global Lock */
 
@@ -312,7 +308,7 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
 
        /* Update the mutex and restore sync_level */
 
-       obj_desc->mutex.owner_thread = NULL;
+       obj_desc->mutex.owner_thread_id = ACPI_MUTEX_NOT_ACQUIRED;
        walk_state->thread->current_sync_level =
            obj_desc->mutex.original_sync_level;
 
@@ -367,7 +363,7 @@ void acpi_ex_release_all_mutexes(struct acpi_thread_state *thread)
 
                /* Mark mutex unowned */
 
-               obj_desc->mutex.owner_thread = NULL;
+               obj_desc->mutex.owner_thread_id = ACPI_MUTEX_NOT_ACQUIRED;
 
                /* Update Thread sync_level (Last mutex is the important one) */
 
index af22fdf73413a5c342b7ac5ae8f1aae9234a5254..ec655c53949225080bd90c76143831994f40444e 100644 (file)
 
 #define ACPI_FAN_COMPONENT             0x00200000
 #define ACPI_FAN_CLASS                 "fan"
-#define ACPI_FAN_DRIVER_NAME           "ACPI Fan Driver"
 #define ACPI_FAN_FILE_STATE            "state"
 
 #define _COMPONENT             ACPI_FAN_COMPONENT
-ACPI_MODULE_NAME("acpi_fan")
+ACPI_MODULE_NAME("fan");
 
-    MODULE_AUTHOR("Paul Diefenbaugh");
-MODULE_DESCRIPTION(ACPI_FAN_DRIVER_NAME);
+MODULE_AUTHOR("Paul Diefenbaugh");
+MODULE_DESCRIPTION("ACPI Fan Driver");
 MODULE_LICENSE("GPL");
 
 static int acpi_fan_add(struct acpi_device *device);
@@ -52,7 +51,7 @@ static int acpi_fan_suspend(struct acpi_device *device, pm_message_t state);
 static int acpi_fan_resume(struct acpi_device *device);
 
 static struct acpi_driver acpi_fan_driver = {
-       .name = ACPI_FAN_DRIVER_NAME,
+       .name = "fan",
        .class = ACPI_FAN_CLASS,
        .ids = "PNP0C0B",
        .ops = {
index 7b6c9ff9bebe17d92cb954bc1e6d34e2fac1d946..4334c208841a3f06586ba3693b10d8437fff5b12 100644 (file)
@@ -241,3 +241,65 @@ static int __init init_acpi_device_notify(void)
 }
 
 arch_initcall(init_acpi_device_notify);
+
+
+#if defined(CONFIG_RTC_DRV_CMOS) || defined(CONFIG_RTC_DRV_CMOS_MODULE)
+
+/* Every ACPI platform has a mc146818 compatible "cmos rtc".  Here we find
+ * its device node and pass extra config data.  This helps its driver use
+ * capabilities that the now-obsolete mc146818 didn't have, and informs it
+ * that this board's RTC is wakeup-capable (per ACPI spec).
+ */
+#include <linux/mc146818rtc.h>
+
+static struct cmos_rtc_board_info rtc_info;
+
+
+/* PNP devices are registered in a subsys_initcall();
+ * ACPI specifies the PNP IDs to use.
+ */
+#include <linux/pnp.h>
+
+static int __init pnp_match(struct device *dev, void *data)
+{
+       static const char *ids[] = { "PNP0b00", "PNP0b01", "PNP0b02", };
+       struct pnp_dev *pnp = to_pnp_dev(dev);
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(ids); i++) {
+               if (compare_pnp_id(pnp->id, ids[i]) != 0)
+                       return 1;
+       }
+       return 0;
+}
+
+static struct device *__init get_rtc_dev(void)
+{
+       return bus_find_device(&pnp_bus_type, NULL, NULL, pnp_match);
+}
+
+static int __init acpi_rtc_init(void)
+{
+       struct device *dev = get_rtc_dev();
+
+       if (dev) {
+               rtc_info.rtc_day_alarm = acpi_gbl_FADT.day_alarm;
+               rtc_info.rtc_mon_alarm = acpi_gbl_FADT.month_alarm;
+               rtc_info.rtc_century = acpi_gbl_FADT.century;
+
+               /* NOTE:  acpi_gbl_FADT->rtcs4 is NOT currently useful */
+
+               dev->platform_data = &rtc_info;
+
+               /* RTC always wakes from S1/S2/S3, and often S4/STD */
+               device_init_wakeup(dev, 1);
+
+               put_device(dev);
+       } else
+               pr_debug("ACPI: RTC unavailable?\n");
+       return 0;
+}
+/* do this between RTC subsys_initcall() and rtc_cmos driver_initcall() */
+fs_initcall(acpi_rtc_init);
+
+#endif
diff --git a/drivers/acpi/hotkey.c b/drivers/acpi/hotkey.c
deleted file mode 100644 (file)
index 8edfb92..0000000
+++ /dev/null
@@ -1,1042 +0,0 @@
-/*
- *  hotkey.c - ACPI Hotkey Driver ($Revision: 0.2 $)
- *
- *  Copyright (C) 2004 Luming Yu <luming.yu@intel.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.
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- */
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/types.h>
-#include <linux/proc_fs.h>
-#include <linux/sched.h>
-#include <linux/kmod.h>
-#include <linux/seq_file.h>
-#include <acpi/acpi_drivers.h>
-#include <acpi/acpi_bus.h>
-#include <asm/uaccess.h>
-
-#define HOTKEY_ACPI_VERSION "0.1"
-
-#define HOTKEY_PROC "hotkey"
-#define HOTKEY_EV_CONFIG    "event_config"
-#define HOTKEY_PL_CONFIG    "poll_config"
-#define HOTKEY_ACTION   "action"
-#define HOTKEY_INFO "info"
-
-#define ACPI_HOTK_NAME          "Generic Hotkey Driver"
-#define ACPI_HOTK_CLASS         "Hotkey"
-#define ACPI_HOTK_DEVICE_NAME   "Hotkey"
-#define ACPI_HOTK_HID           "Unknown?"
-#define ACPI_HOTKEY_COMPONENT   0x20000000
-
-#define ACPI_HOTKEY_EVENT   0x1
-#define ACPI_HOTKEY_POLLING 0x2
-#define ACPI_UNDEFINED_EVENT    0xf
-
-#define RESULT_STR_LEN     80
-
-#define ACTION_METHOD  0
-#define POLL_METHOD    1
-
-#define IS_EVENT(e)            ((e) <= 10000 && (e) >0)
-#define IS_POLL(e)             ((e) > 10000)
-#define IS_OTHERS(e)           ((e)<=0 || (e)>=20000)
-#define _COMPONENT              ACPI_HOTKEY_COMPONENT
-ACPI_MODULE_NAME("acpi_hotkey")
-
-    MODULE_AUTHOR("luming.yu@intel.com");
-MODULE_DESCRIPTION(ACPI_HOTK_NAME);
-MODULE_LICENSE("GPL");
-
-/*  standardized internal hotkey number/event  */
-enum {
-       /* Video Extension event */
-       HK_EVENT_CYCLE_OUTPUT_DEVICE = 0x80,
-       HK_EVENT_OUTPUT_DEVICE_STATUS_CHANGE,
-       HK_EVENT_CYCLE_DISPLAY_OUTPUT,
-       HK_EVENT_NEXT_DISPLAY_OUTPUT,
-       HK_EVENT_PREVIOUS_DISPLAY_OUTPUT,
-       HK_EVENT_CYCLE_BRIGHTNESS,
-       HK_EVENT_INCREASE_BRIGHTNESS,
-       HK_EVENT_DECREASE_BRIGHTNESS,
-       HK_EVENT_ZERO_BRIGHTNESS,
-       HK_EVENT_DISPLAY_DEVICE_OFF,
-
-       /* Snd Card event */
-       HK_EVENT_VOLUME_MUTE,
-       HK_EVENT_VOLUME_INCLREASE,
-       HK_EVENT_VOLUME_DECREASE,
-
-       /* running state control */
-       HK_EVENT_ENTERRING_S3,
-       HK_EVENT_ENTERRING_S4,
-       HK_EVENT_ENTERRING_S5,
-};
-
-enum conf_entry_enum {
-       bus_handle = 0,
-       bus_method = 1,
-       action_handle = 2,
-       method = 3,
-       LAST_CONF_ENTRY
-};
-
-/*  procdir we use */
-static struct proc_dir_entry *hotkey_proc_dir;
-static struct proc_dir_entry *hotkey_config;
-static struct proc_dir_entry *hotkey_poll_config;
-static struct proc_dir_entry *hotkey_action;
-static struct proc_dir_entry *hotkey_info;
-
-/* linkage for all type of hotkey */
-struct acpi_hotkey_link {
-       struct list_head entries;
-       int hotkey_type;        /* event or polling based hotkey  */
-       int hotkey_standard_num;        /* standardized hotkey(event) number */
-};
-
-/* event based hotkey */
-struct acpi_event_hotkey {
-       struct acpi_hotkey_link hotkey_link;
-       int flag;
-       acpi_handle bus_handle; /* bus to install notify handler */
-       int external_hotkey_num;        /* external hotkey/event number */
-       acpi_handle action_handle;      /* acpi handle attached aml action method */
-       char *action_method;    /* action method */
-};
-
-/*
- * There are two ways to poll status
- * 1. directy call read_xxx method, without any arguments passed in
- * 2. call write_xxx method, with arguments passed in, you need
- * the result is saved in acpi_polling_hotkey.poll_result.
- * anthoer read command through polling interface.
- *
- */
-
-/* polling based hotkey */
-struct acpi_polling_hotkey {
-       struct acpi_hotkey_link hotkey_link;
-       int flag;
-       acpi_handle poll_handle;        /* acpi handle attached polling method */
-       char *poll_method;      /* poll method */
-       acpi_handle action_handle;      /* acpi handle attached action method */
-       char *action_method;    /* action method */
-       union acpi_object *poll_result; /* polling_result */
-       struct proc_dir_entry *proc;
-};
-
-/* hotkey object union */
-union acpi_hotkey {
-       struct list_head entries;
-       struct acpi_hotkey_link link;
-       struct acpi_event_hotkey event_hotkey;
-       struct acpi_polling_hotkey poll_hotkey;
-};
-
-/* hotkey object list */
-struct acpi_hotkey_list {
-       struct list_head *entries;
-       int count;
-};
-
-static int auto_hotkey_add(struct acpi_device *device);
-static int auto_hotkey_remove(struct acpi_device *device, int type);
-
-static struct acpi_driver hotkey_driver = {
-       .name = ACPI_HOTK_NAME,
-       .class = ACPI_HOTK_CLASS,
-       .ids = ACPI_HOTK_HID,
-       .ops = {
-               .add = auto_hotkey_add,
-               .remove = auto_hotkey_remove,
-               },
-};
-
-static void free_hotkey_device(union acpi_hotkey *key);
-static void free_hotkey_buffer(union acpi_hotkey *key);
-static void free_poll_hotkey_buffer(union acpi_hotkey *key);
-static int hotkey_open_config(struct inode *inode, struct file *file);
-static int hotkey_poll_open_config(struct inode *inode, struct file *file);
-static ssize_t hotkey_write_config(struct file *file,
-                                  const char __user * buffer,
-                                  size_t count, loff_t * data);
-static int hotkey_info_open_fs(struct inode *inode, struct file *file);
-static int hotkey_action_open_fs(struct inode *inode, struct file *file);
-static ssize_t hotkey_execute_aml_method(struct file *file,
-                                        const char __user * buffer,
-                                        size_t count, loff_t * data);
-static int hotkey_config_seq_show(struct seq_file *seq, void *offset);
-static int hotkey_poll_config_seq_show(struct seq_file *seq, void *offset);
-static int hotkey_polling_open_fs(struct inode *inode, struct file *file);
-static union acpi_hotkey *get_hotkey_by_event(struct
-                                             acpi_hotkey_list
-                                             *hotkey_list, int event);
-
-/* event based config */
-static const struct file_operations hotkey_config_fops = {
-       .open = hotkey_open_config,
-       .read = seq_read,
-       .write = hotkey_write_config,
-       .llseek = seq_lseek,
-       .release = single_release,
-};
-
-/* polling based config */
-static const struct file_operations hotkey_poll_config_fops = {
-       .open = hotkey_poll_open_config,
-       .read = seq_read,
-       .write = hotkey_write_config,
-       .llseek = seq_lseek,
-       .release = single_release,
-};
-
-/* hotkey driver info */
-static const struct file_operations hotkey_info_fops = {
-       .open = hotkey_info_open_fs,
-       .read = seq_read,
-       .llseek = seq_lseek,
-       .release = single_release,
-};
-
-/* action */
-static const struct file_operations hotkey_action_fops = {
-       .open = hotkey_action_open_fs,
-       .read = seq_read,
-       .write = hotkey_execute_aml_method,
-       .llseek = seq_lseek,
-       .release = single_release,
-};
-
-/* polling results */
-static const struct file_operations hotkey_polling_fops = {
-       .open = hotkey_polling_open_fs,
-       .read = seq_read,
-       .llseek = seq_lseek,
-       .release = single_release,
-};
-
-struct acpi_hotkey_list global_hotkey_list;    /* link all ev or pl hotkey  */
-struct list_head hotkey_entries;       /* head of the list of hotkey_list */
-
-static int hotkey_info_seq_show(struct seq_file *seq, void *offset)
-{
-
-       seq_printf(seq, "Hotkey generic driver ver: %s\n", HOTKEY_ACPI_VERSION);
-
-       return 0;
-}
-
-static int hotkey_info_open_fs(struct inode *inode, struct file *file)
-{
-       return single_open(file, hotkey_info_seq_show, PDE(inode)->data);
-}
-
-static char *format_result(union acpi_object *object)
-{
-       char *buf;
-
-       buf = kzalloc(RESULT_STR_LEN, GFP_KERNEL);
-       if (!buf)
-               return NULL;
-       /* Now, just support integer type */
-       if (object->type == ACPI_TYPE_INTEGER)
-               sprintf(buf, "%d\n", (u32) object->integer.value);
-       return buf;
-}
-
-static int hotkey_polling_seq_show(struct seq_file *seq, void *offset)
-{
-       struct acpi_polling_hotkey *poll_hotkey = seq->private;
-       char *buf;
-
-
-       if (poll_hotkey->poll_result) {
-               buf = format_result(poll_hotkey->poll_result);
-               if (buf)
-                       seq_printf(seq, "%s", buf);
-               kfree(buf);
-       }
-       return 0;
-}
-
-static int hotkey_polling_open_fs(struct inode *inode, struct file *file)
-{
-       return single_open(file, hotkey_polling_seq_show, PDE(inode)->data);
-}
-
-static int hotkey_action_open_fs(struct inode *inode, struct file *file)
-{
-       return single_open(file, hotkey_info_seq_show, PDE(inode)->data);
-}
-
-/* Mapping external hotkey number to standardized hotkey event num */
-static int hotkey_get_internal_event(int event, struct acpi_hotkey_list *list)
-{
-       struct list_head *entries;
-       int val = -1;
-
-
-       list_for_each(entries, list->entries) {
-               union acpi_hotkey *key =
-                   container_of(entries, union acpi_hotkey, entries);
-               if (key->link.hotkey_type == ACPI_HOTKEY_EVENT
-                   && key->event_hotkey.external_hotkey_num == event) {
-                       val = key->link.hotkey_standard_num;
-                       break;
-               }
-       }
-
-       return val;
-}
-
-static void
-acpi_hotkey_notify_handler(acpi_handle handle, u32 event, void *data)
-{
-       struct acpi_device *device = NULL;
-       u32 internal_event;
-
-
-       if (acpi_bus_get_device(handle, &device))
-               return;
-
-       internal_event = hotkey_get_internal_event(event, &global_hotkey_list);
-       acpi_bus_generate_event(device, internal_event, 0);
-
-       return;
-}
-
-/* Need to invent automatically hotkey add method */
-static int auto_hotkey_add(struct acpi_device *device)
-{
-       /* Implement me */
-       return 0;
-}
-
-/* Need to invent automatically hotkey remove method */
-static int auto_hotkey_remove(struct acpi_device *device, int type)
-{
-       /* Implement me */
-       return 0;
-}
-
-/* Create a proc file for each polling method */
-static int create_polling_proc(union acpi_hotkey *device)
-{
-       struct proc_dir_entry *proc;
-       char proc_name[80];
-       mode_t mode;
-
-       mode = S_IFREG | S_IRUGO | S_IWUGO;
-
-       sprintf(proc_name, "%d", device->link.hotkey_standard_num);
-       /*
-          strcat(proc_name, device->poll_hotkey.poll_method);
-        */
-       proc = create_proc_entry(proc_name, mode, hotkey_proc_dir);
-
-       if (!proc) {
-               return -ENODEV;
-       } else {
-               proc->proc_fops = &hotkey_polling_fops;
-               proc->owner = THIS_MODULE;
-               proc->data = device;
-               proc->uid = 0;
-               proc->gid = 0;
-               device->poll_hotkey.proc = proc;
-       }
-       return 0;
-}
-
-static int hotkey_add(union acpi_hotkey *device)
-{
-       int status = 0;
-       struct acpi_device *dev = NULL;
-
-
-       if (device->link.hotkey_type == ACPI_HOTKEY_EVENT) {
-               acpi_bus_get_device(device->event_hotkey.bus_handle, &dev);
-               status = acpi_install_notify_handler(dev->handle,
-                                                    ACPI_DEVICE_NOTIFY,
-                                                    acpi_hotkey_notify_handler,
-                                                    dev);
-       } else                  /* Add polling hotkey */
-               create_polling_proc(device);
-
-       global_hotkey_list.count++;
-
-       list_add_tail(&device->link.entries, global_hotkey_list.entries);
-
-       return status;
-}
-
-static int hotkey_remove(union acpi_hotkey *device)
-{
-       struct list_head *entries, *next;
-
-
-       list_for_each_safe(entries, next, global_hotkey_list.entries) {
-               union acpi_hotkey *key =
-                   container_of(entries, union acpi_hotkey, entries);
-               if (key->link.hotkey_standard_num ==
-                   device->link.hotkey_standard_num) {
-                       list_del(&key->link.entries);
-                       free_hotkey_device(key);
-                       global_hotkey_list.count--;
-                       break;
-               }
-       }
-       kfree(device);
-       return 0;
-}
-
-static int hotkey_update(union acpi_hotkey *key)
-{
-       struct list_head *entries;
-
-
-       list_for_each(entries, global_hotkey_list.entries) {
-               union acpi_hotkey *tmp =
-                   container_of(entries, union acpi_hotkey, entries);
-               if (tmp->link.hotkey_standard_num ==
-                   key->link.hotkey_standard_num) {
-                       if (key->link.hotkey_type == ACPI_HOTKEY_EVENT) {
-                               free_hotkey_buffer(tmp);
-                               tmp->event_hotkey.bus_handle =
-                                   key->event_hotkey.bus_handle;
-                               tmp->event_hotkey.external_hotkey_num =
-                                   key->event_hotkey.external_hotkey_num;
-                               tmp->event_hotkey.action_handle =
-                                   key->event_hotkey.action_handle;
-                               tmp->event_hotkey.action_method =
-                                   key->event_hotkey.action_method;
-                               kfree(key);
-                       } else {
-                               /*
-                                  char  proc_name[80];
-
-                                  sprintf(proc_name, "%d", tmp->link.hotkey_standard_num);
-                                  strcat(proc_name, tmp->poll_hotkey.poll_method);
-                                  remove_proc_entry(proc_name,hotkey_proc_dir);
-                                */
-                               free_poll_hotkey_buffer(tmp);
-                               tmp->poll_hotkey.poll_handle =
-                                   key->poll_hotkey.poll_handle;
-                               tmp->poll_hotkey.poll_method =
-                                   key->poll_hotkey.poll_method;
-                               tmp->poll_hotkey.action_handle =
-                                   key->poll_hotkey.action_handle;
-                               tmp->poll_hotkey.action_method =
-                                   key->poll_hotkey.action_method;
-                               tmp->poll_hotkey.poll_result =
-                                   key->poll_hotkey.poll_result;
-                               /*
-                                  create_polling_proc(tmp);
-                                */
-                               kfree(key);
-                       }
-                       return 0;
-                       break;
-               }
-       }
-
-       return -ENODEV;
-}
-
-static void free_hotkey_device(union acpi_hotkey *key)
-{
-       struct acpi_device *dev;
-
-
-       if (key->link.hotkey_type == ACPI_HOTKEY_EVENT) {
-               acpi_bus_get_device(key->event_hotkey.bus_handle, &dev);
-               if (dev->handle)
-                       acpi_remove_notify_handler(dev->handle,
-                                                  ACPI_DEVICE_NOTIFY,
-                                                  acpi_hotkey_notify_handler);
-               free_hotkey_buffer(key);
-       } else {
-               char proc_name[80];
-
-               sprintf(proc_name, "%d", key->link.hotkey_standard_num);
-               /*
-                  strcat(proc_name, key->poll_hotkey.poll_method);
-                */
-               remove_proc_entry(proc_name, hotkey_proc_dir);
-               free_poll_hotkey_buffer(key);
-       }
-       kfree(key);
-       return;
-}
-
-static void free_hotkey_buffer(union acpi_hotkey *key)
-{
-       /* key would never be null, action method could be */
-       kfree(key->event_hotkey.action_method);
-}
-
-static void free_poll_hotkey_buffer(union acpi_hotkey *key)
-{
-       /* key would never be null, others could be*/
-       kfree(key->poll_hotkey.action_method);
-       kfree(key->poll_hotkey.poll_method);
-       kfree(key->poll_hotkey.poll_result);
-}
-static int
-init_hotkey_device(union acpi_hotkey *key, char **config_entry,
-                  int std_num, int external_num)
-{
-       acpi_handle tmp_handle;
-       acpi_status status = AE_OK;
-
-       if (std_num < 0 || IS_POLL(std_num) || !key)
-               goto do_fail;
-
-       if (!config_entry[bus_handle] || !config_entry[action_handle]
-                       || !config_entry[method])
-               goto do_fail;
-
-       key->link.hotkey_type = ACPI_HOTKEY_EVENT;
-       key->link.hotkey_standard_num = std_num;
-       key->event_hotkey.flag = 0;
-       key->event_hotkey.action_method = config_entry[method];
-
-       status = acpi_get_handle(NULL, config_entry[bus_handle],
-                          &(key->event_hotkey.bus_handle));
-       if (ACPI_FAILURE(status))
-               goto do_fail_zero;
-       key->event_hotkey.external_hotkey_num = external_num;
-       status = acpi_get_handle(NULL, config_entry[action_handle],
-                           &(key->event_hotkey.action_handle));
-       if (ACPI_FAILURE(status))
-               goto do_fail_zero;
-       status = acpi_get_handle(key->event_hotkey.action_handle,
-                                config_entry[method], &tmp_handle);
-       if (ACPI_FAILURE(status))
-               goto do_fail_zero;
-       return AE_OK;
-do_fail_zero:
-       key->event_hotkey.action_method = NULL;
-do_fail:
-       return -ENODEV;
-}
-
-static int
-init_poll_hotkey_device(union acpi_hotkey *key, char **config_entry,
-                       int std_num)
-{
-       acpi_status status = AE_OK;
-       acpi_handle tmp_handle;
-
-       if (std_num < 0 || IS_EVENT(std_num) || !key)
-               goto do_fail;
-       if (!config_entry[bus_handle] ||!config_entry[bus_method] ||
-               !config_entry[action_handle] || !config_entry[method])
-               goto do_fail;
-
-       key->link.hotkey_type = ACPI_HOTKEY_POLLING;
-       key->link.hotkey_standard_num = std_num;
-       key->poll_hotkey.flag = 0;
-       key->poll_hotkey.poll_method = config_entry[bus_method];
-       key->poll_hotkey.action_method = config_entry[method];
-
-       status = acpi_get_handle(NULL, config_entry[bus_handle],
-                     &(key->poll_hotkey.poll_handle));
-       if (ACPI_FAILURE(status))
-               goto do_fail_zero;
-       status = acpi_get_handle(key->poll_hotkey.poll_handle,
-                                config_entry[bus_method], &tmp_handle);
-       if (ACPI_FAILURE(status))
-               goto do_fail_zero;
-       status =
-           acpi_get_handle(NULL, config_entry[action_handle],
-                           &(key->poll_hotkey.action_handle));
-       if (ACPI_FAILURE(status))
-               goto do_fail_zero;
-       status = acpi_get_handle(key->poll_hotkey.action_handle,
-                                config_entry[method], &tmp_handle);
-       if (ACPI_FAILURE(status))
-               goto do_fail_zero;
-       key->poll_hotkey.poll_result =
-           kmalloc(sizeof(union acpi_object), GFP_KERNEL);
-       if (!key->poll_hotkey.poll_result)
-               goto do_fail_zero;
-       return AE_OK;
-
-do_fail_zero:
-       key->poll_hotkey.poll_method = NULL;
-       key->poll_hotkey.action_method = NULL;
-do_fail:
-       return -ENODEV;
-}
-
-static int hotkey_open_config(struct inode *inode, struct file *file)
-{
-       return (single_open
-                    (file, hotkey_config_seq_show, PDE(inode)->data));
-}
-
-static int hotkey_poll_open_config(struct inode *inode, struct file *file)
-{
-       return (single_open
-                    (file, hotkey_poll_config_seq_show, PDE(inode)->data));
-}
-
-static int hotkey_config_seq_show(struct seq_file *seq, void *offset)
-{
-       struct acpi_hotkey_list *hotkey_list = &global_hotkey_list;
-       struct list_head *entries;
-       char bus_name[ACPI_PATHNAME_MAX] = { 0 };
-       char action_name[ACPI_PATHNAME_MAX] = { 0 };
-       struct acpi_buffer bus = { ACPI_PATHNAME_MAX, bus_name };
-       struct acpi_buffer act = { ACPI_PATHNAME_MAX, action_name };
-
-
-       list_for_each(entries, hotkey_list->entries) {
-               union acpi_hotkey *key =
-                   container_of(entries, union acpi_hotkey, entries);
-               if (key->link.hotkey_type == ACPI_HOTKEY_EVENT) {
-                       acpi_get_name(key->event_hotkey.bus_handle,
-                                     ACPI_NAME_TYPE_MAX, &bus);
-                       acpi_get_name(key->event_hotkey.action_handle,
-                                     ACPI_NAME_TYPE_MAX, &act);
-                       seq_printf(seq, "%s:%s:%s:%d:%d\n", bus_name,
-                                  action_name,
-                                  key->event_hotkey.action_method,
-                                  key->link.hotkey_standard_num,
-                                  key->event_hotkey.external_hotkey_num);
-               }
-       }
-       seq_puts(seq, "\n");
-       return 0;
-}
-
-static int hotkey_poll_config_seq_show(struct seq_file *seq, void *offset)
-{
-       struct acpi_hotkey_list *hotkey_list = &global_hotkey_list;
-       struct list_head *entries;
-       char bus_name[ACPI_PATHNAME_MAX] = { 0 };
-       char action_name[ACPI_PATHNAME_MAX] = { 0 };
-       struct acpi_buffer bus = { ACPI_PATHNAME_MAX, bus_name };
-       struct acpi_buffer act = { ACPI_PATHNAME_MAX, action_name };
-
-
-       list_for_each(entries, hotkey_list->entries) {
-               union acpi_hotkey *key =
-                   container_of(entries, union acpi_hotkey, entries);
-               if (key->link.hotkey_type == ACPI_HOTKEY_POLLING) {
-                       acpi_get_name(key->poll_hotkey.poll_handle,
-                                     ACPI_NAME_TYPE_MAX, &bus);
-                       acpi_get_name(key->poll_hotkey.action_handle,
-                                     ACPI_NAME_TYPE_MAX, &act);
-                       seq_printf(seq, "%s:%s:%s:%s:%d\n", bus_name,
-                                  key->poll_hotkey.poll_method,
-                                  action_name,
-                                  key->poll_hotkey.action_method,
-                                  key->link.hotkey_standard_num);
-               }
-       }
-       seq_puts(seq, "\n");
-       return 0;
-}
-
-static int
-get_parms(char *config_record, int *cmd, char **config_entry,
-              int *internal_event_num, int *external_event_num)
-{
-/* the format of *config_record =
- * "1:\d+:*" : "cmd:internal_event_num"
- * "\d+:\w+:\w+:\w+:\w+:\d+:\d+" :
- * "cmd:bus_handle:bus_method:action_handle:method:internal_event_num:external_event_num"
- */
-       char *tmp, *tmp1, count;
-       int i;
-
-       sscanf(config_record, "%d", cmd);
-       if (*cmd == 1) {
-               if (sscanf(config_record, "%d:%d", cmd, internal_event_num) !=
-                   2)
-                       goto do_fail;
-               else
-                       return (6);
-       }
-       tmp = strchr(config_record, ':');
-       if (!tmp)
-               goto do_fail;
-       tmp++;
-       for (i = 0; i < LAST_CONF_ENTRY; i++) {
-               tmp1 = strchr(tmp, ':');
-               if (!tmp1) {
-                       goto do_fail;
-               }
-               count = tmp1 - tmp;
-               config_entry[i] = kzalloc(count + 1, GFP_KERNEL);
-               if (!config_entry[i])
-                       goto handle_failure;
-               strncpy(config_entry[i], tmp, count);
-               tmp = tmp1 + 1;
-       }
-       if (sscanf(tmp, "%d:%d", internal_event_num, external_event_num) <= 0)
-               goto handle_failure;
-       if (!IS_OTHERS(*internal_event_num)) {
-               return 6;
-       }
-handle_failure:
-       while (i-- > 0)
-               kfree(config_entry[i]);
-do_fail:
-       return -1;
-}
-
-/*  count is length for one input record */
-static ssize_t hotkey_write_config(struct file *file,
-                                  const char __user * buffer,
-                                  size_t count, loff_t * data)
-{
-       char *config_record = NULL;
-       char *config_entry[LAST_CONF_ENTRY];
-       int cmd, internal_event_num, external_event_num;
-       int ret = 0;
-       union acpi_hotkey *key = kzalloc(sizeof(union acpi_hotkey), GFP_KERNEL);
-
-       if (!key)
-               return -ENOMEM;
-
-       config_record = kzalloc(count + 1, GFP_KERNEL);
-       if (!config_record) {
-               kfree(key);
-               return -ENOMEM;
-       }
-
-       if (copy_from_user(config_record, buffer, count)) {
-               kfree(config_record);
-               kfree(key);
-               printk(KERN_ERR PREFIX "Invalid data\n");
-               return -EINVAL;
-       }
-       ret = get_parms(config_record, &cmd, config_entry,
-                      &internal_event_num, &external_event_num);
-       kfree(config_record);
-       if (ret != 6) {
-               printk(KERN_ERR PREFIX "Invalid data format ret=%d\n", ret);
-               return -EINVAL;
-       }
-
-       if (cmd == 1) {
-               union acpi_hotkey *tmp = NULL;
-               tmp = get_hotkey_by_event(&global_hotkey_list,
-                                         internal_event_num);
-               if (!tmp)
-                       printk(KERN_ERR PREFIX "Invalid key\n");
-               else
-                       memcpy(key, tmp, sizeof(union acpi_hotkey));
-               goto cont_cmd;
-       }
-       if (IS_EVENT(internal_event_num)) {
-               if (init_hotkey_device(key, config_entry,
-                       internal_event_num, external_event_num))
-                       goto init_hotkey_fail;
-       } else {
-               if (init_poll_hotkey_device(key, config_entry,
-                              internal_event_num))
-                       goto init_poll_hotkey_fail;
-       }
-cont_cmd:
-       switch (cmd) {
-       case 0:
-               if (get_hotkey_by_event(&global_hotkey_list,
-                               key->link.hotkey_standard_num))
-                       goto fail_out;
-               else
-                       hotkey_add(key);
-               break;
-       case 1:
-               hotkey_remove(key);
-               break;
-       case 2:
-               /* key is kfree()ed if matched*/
-               if (hotkey_update(key))
-                       goto fail_out;
-               break;
-       default:
-               goto fail_out;
-               break;
-       }
-       return count;
-
-init_poll_hotkey_fail:         /* failed init_poll_hotkey_device */
-       kfree(config_entry[bus_method]);
-       config_entry[bus_method] = NULL;
-init_hotkey_fail:              /* failed init_hotkey_device */
-       kfree(config_entry[method]);
-fail_out:
-       kfree(config_entry[bus_handle]);
-       kfree(config_entry[action_handle]);
-       /* No double free since elements =NULL for error cases */
-       if (IS_EVENT(internal_event_num)) {
-               if (config_entry[bus_method])
-                       kfree(config_entry[bus_method]);
-               free_hotkey_buffer(key);        /* frees [method] */
-       } else
-               free_poll_hotkey_buffer(key);  /* frees [bus_method]+[method] */
-       kfree(key);
-       printk(KERN_ERR PREFIX "invalid key\n");
-       return -EINVAL;
-}
-
-/*
- * This function evaluates an ACPI method, given an int as parameter, the
- * method is searched within the scope of the handle, can be NULL. The output
- * of the method is written is output, which can also be NULL
- *
- * returns 1 if write is successful, 0 else.
- */
-static int write_acpi_int(acpi_handle handle, const char *method, int val,
-                         struct acpi_buffer *output)
-{
-       struct acpi_object_list params; /* list of input parameters (an int here) */
-       union acpi_object in_obj;       /* the only param we use */
-       acpi_status status;
-
-       params.count = 1;
-       params.pointer = &in_obj;
-       in_obj.type = ACPI_TYPE_INTEGER;
-       in_obj.integer.value = val;
-
-       status = acpi_evaluate_object(handle, (char *)method, &params, output);
-
-       return (status == AE_OK);
-}
-
-static int read_acpi_int(acpi_handle handle, const char *method,
-                        union acpi_object *val)
-{
-       struct acpi_buffer output;
-       union acpi_object out_obj;
-       acpi_status status;
-
-       output.length = sizeof(out_obj);
-       output.pointer = &out_obj;
-
-       status = acpi_evaluate_object(handle, (char *)method, NULL, &output);
-       if (val) {
-               val->integer.value = out_obj.integer.value;
-               val->type = out_obj.type;
-       } else
-               printk(KERN_ERR PREFIX "null val pointer\n");
-       return ((status == AE_OK)
-                    && (out_obj.type == ACPI_TYPE_INTEGER));
-}
-
-static union acpi_hotkey *get_hotkey_by_event(struct
-                                             acpi_hotkey_list
-                                             *hotkey_list, int event)
-{
-       struct list_head *entries;
-
-       list_for_each(entries, hotkey_list->entries) {
-               union acpi_hotkey *key =
-                   container_of(entries, union acpi_hotkey, entries);
-               if (key->link.hotkey_standard_num == event) {
-                       return (key);
-               }
-       }
-       return (NULL);
-}
-
-/*
- * user call AML method interface:
- * Call convention:
- * echo "event_num: arg type : value"
- * example: echo "1:1:30" > /proc/acpi/action
- * Just support 1 integer arg passing to AML method
- */
-
-static ssize_t hotkey_execute_aml_method(struct file *file,
-                                        const char __user * buffer,
-                                        size_t count, loff_t * data)
-{
-       struct acpi_hotkey_list *hotkey_list = &global_hotkey_list;
-       char *arg;
-       int event, method_type, type, value;
-       union acpi_hotkey *key;
-
-
-       arg = kzalloc(count + 1, GFP_KERNEL);
-       if (!arg)
-               return -ENOMEM;
-
-       if (copy_from_user(arg, buffer, count)) {
-               kfree(arg);
-               printk(KERN_ERR PREFIX "Invalid argument 2\n");
-               return -EINVAL;
-       }
-
-       if (sscanf(arg, "%d:%d:%d:%d", &event, &method_type, &type, &value) !=
-           4) {
-               kfree(arg);
-               printk(KERN_ERR PREFIX "Invalid argument 3\n");
-               return -EINVAL;
-       }
-       kfree(arg);
-       if (type == ACPI_TYPE_INTEGER) {
-               key = get_hotkey_by_event(hotkey_list, event);
-               if (!key)
-                       goto do_fail;
-               if (IS_EVENT(event))
-                       write_acpi_int(key->event_hotkey.action_handle,
-                                      key->event_hotkey.action_method, value,
-                                      NULL);
-               else if (IS_POLL(event)) {
-                       if (method_type == POLL_METHOD)
-                               read_acpi_int(key->poll_hotkey.poll_handle,
-                                             key->poll_hotkey.poll_method,
-                                             key->poll_hotkey.poll_result);
-                       else if (method_type == ACTION_METHOD)
-                               write_acpi_int(key->poll_hotkey.action_handle,
-                                              key->poll_hotkey.action_method,
-                                              value, NULL);
-                       else
-                               goto do_fail;
-
-               }
-       } else {
-               printk(KERN_WARNING "Not supported\n");
-               return -EINVAL;
-       }
-       return count;
-      do_fail:
-       return -EINVAL;
-
-}
-
-static int __init hotkey_init(void)
-{
-       int result;
-       mode_t mode = S_IFREG | S_IRUGO | S_IWUGO;
-
-
-       if (acpi_disabled)
-               return -ENODEV;
-
-       if (acpi_specific_hotkey_enabled) {
-               printk("Using specific hotkey driver\n");
-               return -ENODEV;
-       }
-
-       hotkey_proc_dir = proc_mkdir(HOTKEY_PROC, acpi_root_dir);
-       if (!hotkey_proc_dir) {
-               return (-ENODEV);
-       }
-       hotkey_proc_dir->owner = THIS_MODULE;
-
-       hotkey_config =
-           create_proc_entry(HOTKEY_EV_CONFIG, mode, hotkey_proc_dir);
-       if (!hotkey_config) {
-               goto do_fail1;
-       } else {
-               hotkey_config->proc_fops = &hotkey_config_fops;
-               hotkey_config->data = &global_hotkey_list;
-               hotkey_config->owner = THIS_MODULE;
-               hotkey_config->uid = 0;
-               hotkey_config->gid = 0;
-       }
-
-       hotkey_poll_config =
-           create_proc_entry(HOTKEY_PL_CONFIG, mode, hotkey_proc_dir);
-       if (!hotkey_poll_config) {
-               goto do_fail2;
-       } else {
-               hotkey_poll_config->proc_fops = &hotkey_poll_config_fops;
-               hotkey_poll_config->data = &global_hotkey_list;
-               hotkey_poll_config->owner = THIS_MODULE;
-               hotkey_poll_config->uid = 0;
-               hotkey_poll_config->gid = 0;
-       }
-
-       hotkey_action = create_proc_entry(HOTKEY_ACTION, mode, hotkey_proc_dir);
-       if (!hotkey_action) {
-               goto do_fail3;
-       } else {
-               hotkey_action->proc_fops = &hotkey_action_fops;
-               hotkey_action->owner = THIS_MODULE;
-               hotkey_action->uid = 0;
-               hotkey_action->gid = 0;
-       }
-
-       hotkey_info = create_proc_entry(HOTKEY_INFO, mode, hotkey_proc_dir);
-       if (!hotkey_info) {
-               goto do_fail4;
-       } else {
-               hotkey_info->proc_fops = &hotkey_info_fops;
-               hotkey_info->owner = THIS_MODULE;
-               hotkey_info->uid = 0;
-               hotkey_info->gid = 0;
-       }
-
-       result = acpi_bus_register_driver(&hotkey_driver);
-       if (result < 0)
-               goto do_fail5;
-       global_hotkey_list.count = 0;
-       global_hotkey_list.entries = &hotkey_entries;
-
-       INIT_LIST_HEAD(&hotkey_entries);
-
-       return (0);
-
-      do_fail5:
-       remove_proc_entry(HOTKEY_INFO, hotkey_proc_dir);
-      do_fail4:
-       remove_proc_entry(HOTKEY_ACTION, hotkey_proc_dir);
-      do_fail3:
-       remove_proc_entry(HOTKEY_PL_CONFIG, hotkey_proc_dir);
-      do_fail2:
-       remove_proc_entry(HOTKEY_EV_CONFIG, hotkey_proc_dir);
-      do_fail1:
-       remove_proc_entry(HOTKEY_PROC, acpi_root_dir);
-       return (-ENODEV);
-}
-
-static void __exit hotkey_exit(void)
-{
-       struct list_head *entries, *next;
-
-
-       list_for_each_safe(entries, next, global_hotkey_list.entries) {
-               union acpi_hotkey *key =
-                   container_of(entries, union acpi_hotkey, entries);
-
-               acpi_os_wait_events_complete(NULL);
-               list_del(&key->link.entries);
-               global_hotkey_list.count--;
-               free_hotkey_device(key);
-       }
-       acpi_bus_unregister_driver(&hotkey_driver);
-       remove_proc_entry(HOTKEY_EV_CONFIG, hotkey_proc_dir);
-       remove_proc_entry(HOTKEY_PL_CONFIG, hotkey_proc_dir);
-       remove_proc_entry(HOTKEY_ACTION, hotkey_proc_dir);
-       remove_proc_entry(HOTKEY_INFO, hotkey_proc_dir);
-       remove_proc_entry(HOTKEY_PROC, acpi_root_dir);
-       return;
-}
-
-module_init(hotkey_init);
-module_exit(hotkey_exit);
index 8338be0990bce2854078bfef18e45ccef0836ca2..acab4a4818974df5487cdc27efcc3fad7d084308 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/slab.h>
 #include <linux/kernel.h>
 #include <linux/stddef.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/i2c.h>
 #include <linux/acpi.h>
 #define ACPI_EC_HC_COMPONENT   0x00080000
 #define ACPI_EC_HC_CLASS       "ec_hc_smbus"
 #define ACPI_EC_HC_HID         "ACPI0001"
-#define ACPI_EC_HC_DRIVER_NAME "ACPI EC HC smbus driver"
 #define ACPI_EC_HC_DEVICE_NAME "EC HC smbus"
 
 #define _COMPONENT             ACPI_EC_HC_COMPONENT
 
-ACPI_MODULE_NAME("acpi_smbus")
+ACPI_MODULE_NAME("i2c_ec");
 
 static int acpi_ec_hc_add(struct acpi_device *device);
 static int acpi_ec_hc_remove(struct acpi_device *device, int type);
 
 static struct acpi_driver acpi_ec_hc_driver = {
-       .name = ACPI_EC_HC_DRIVER_NAME,
+       .name = "i2c_ec",
        .class = ACPI_EC_HC_CLASS,
        .ids = ACPI_EC_HC_HID,
        .ops = {
@@ -340,6 +338,7 @@ static int acpi_ec_hc_add(struct acpi_device *device)
        smbus->adapter.owner = THIS_MODULE;
        smbus->adapter.algo = &acpi_ec_smbus_algorithm;
        smbus->adapter.algo_data = smbus;
+       smbus->adapter.dev.parent = &device->dev;
 
        if (i2c_add_adapter(&smbus->adapter)) {
                ACPI_DEBUG_PRINT((ACPI_DB_WARN,
index c6144ca6663861529a65d1f7f5c5d618be1f43f3..1a0ed3dc409c8426d1e79f084a1ce0e38451bac7 100644 (file)
@@ -496,6 +496,10 @@ static int ibm_acpi_driver_init(void)
        printk(IBM_INFO "%s v%s\n", IBM_DESC, IBM_VERSION);
        printk(IBM_INFO "%s\n", IBM_URL);
 
+       if (ibm_thinkpad_ec_found)
+               printk(IBM_INFO "ThinkPad EC firmware %s\n",
+                      ibm_thinkpad_ec_found);
+
        return 0;
 }
 
@@ -2617,7 +2621,7 @@ static void __init ibm_handle_init(char *name,
        ibm_handle_init(#object, &object##_handle, *object##_parent,    \
                object##_paths, ARRAY_SIZE(object##_paths), &object##_path)
 
-static int set_ibm_param(const char *val, struct kernel_param *kp)
+static int __init set_ibm_param(const char *val, struct kernel_param *kp)
 {
        unsigned int i;
 
@@ -2659,7 +2663,8 @@ static void acpi_ibm_exit(void)
        for (i = ARRAY_SIZE(ibms) - 1; i >= 0; i--)
                ibm_exit(&ibms[i]);
 
-       remove_proc_entry(IBM_DIR, acpi_root_dir);
+       if (proc_dir)
+               remove_proc_entry(IBM_DIR, acpi_root_dir);
 
        if (ibm_thinkpad_ec_found)
                kfree(ibm_thinkpad_ec_found);
@@ -2696,11 +2701,6 @@ static int __init acpi_ibm_init(void)
        if (acpi_disabled)
                return -ENODEV;
 
-       if (!acpi_specific_hotkey_enabled) {
-               printk(IBM_ERR "using generic hotkey driver\n");
-               return -ENODEV;
-       }
-
        /* ec is required because many other handles are relative to it */
        IBM_HANDLE_INIT(ec);
        if (!ec_handle) {
@@ -2710,9 +2710,6 @@ static int __init acpi_ibm_init(void)
 
        /* Models with newer firmware report the EC in DMI */
        ibm_thinkpad_ec_found = check_dmi_for_ec();
-       if (ibm_thinkpad_ec_found)
-               printk(IBM_INFO "ThinkPad EC firmware %s\n",
-                      ibm_thinkpad_ec_found);
 
        /* these handles are not required */
        IBM_HANDLE_INIT(vid);
@@ -2742,6 +2739,7 @@ static int __init acpi_ibm_init(void)
        proc_dir = proc_mkdir(IBM_DIR, acpi_root_dir);
        if (!proc_dir) {
                printk(IBM_ERR "unable to create proc dir %s", IBM_DIR);
+               acpi_ibm_exit();
                return -ENODEV;
        }
        proc_dir->owner = THIS_MODULE;
index 326af8fc0ce7e83fd91d9d7fee21f6d854f25694..33db2241044e5930430c5091f6580c9013721f15 100644 (file)
@@ -45,6 +45,7 @@
 #include <acpi/acnamesp.h>
 #include <acpi/acdispat.h>
 #include <acpi/acinterp.h>
+#include <linux/nmi.h>
 
 #define _COMPONENT          ACPI_NAMESPACE
 ACPI_MODULE_NAME("nsinit")
@@ -534,7 +535,15 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
        info->parameter_type = ACPI_PARAM_ARGS;
        info->flags = ACPI_IGNORE_RETURN_VALUE;
 
+       /*
+        * Some hardware relies on this being executed as atomically
+        * as possible (without an NMI being received in the middle of
+        * this) - so disable NMIs and initialize the device:
+        */
+       acpi_nmi_disable();
        status = acpi_ns_evaluate(info);
+       acpi_nmi_enable();
+
        if (ACPI_SUCCESS(status)) {
                walk_info->num_INI++;
 
index 4a9faff4c01dc897bd113dabd50ec961024125a8..8fcd6a15517f5810ee6b2b6f98ba33d01d8d707a 100644 (file)
@@ -33,7 +33,7 @@
 
 #define ACPI_NUMA      0x80000000
 #define _COMPONENT     ACPI_NUMA
-ACPI_MODULE_NAME("numa")
+ACPI_MODULE_NAME("numa");
 
 static nodemask_t nodes_found_map = NODE_MASK_NONE;
 #define PXM_INVAL      -1
@@ -45,12 +45,6 @@ int __cpuinitdata pxm_to_node_map[MAX_PXM_DOMAINS]
 int __cpuinitdata node_to_pxm_map[MAX_NUMNODES]
                                = { [0 ... MAX_NUMNODES - 1] = PXM_INVAL };
 
-extern int __init acpi_table_parse_madt_family(char *id,
-                                              unsigned long madt_size,
-                                              int entry_id,
-                                              acpi_madt_entry_handler handler,
-                                              unsigned int max_entries);
-
 int __cpuinit pxm_to_node(int pxm)
 {
        if (pxm < 0)
@@ -208,9 +202,9 @@ static int __init acpi_parse_srat(struct acpi_table_header *table)
 
 int __init
 acpi_table_parse_srat(enum acpi_srat_type id,
-                     acpi_madt_entry_handler handler, unsigned int max_entries)
+                     acpi_table_entry_handler handler, unsigned int max_entries)
 {
-       return acpi_table_parse_madt_family(ACPI_SIG_SRAT,
+       return acpi_table_parse_entries(ACPI_SIG_SRAT,
                                            sizeof(struct acpi_table_srat), id,
                                            handler, max_entries);
 }
@@ -220,9 +214,7 @@ int __init acpi_numa_init(void)
        int result;
 
        /* SRAT: Static Resource Affinity Table */
-       result = acpi_table_parse(ACPI_SIG_SRAT, acpi_parse_srat);
-
-       if (result > 0) {
+       if (!acpi_table_parse(ACPI_SIG_SRAT, acpi_parse_srat)) {
                result = acpi_table_parse_srat(ACPI_SRAT_TYPE_CPU_AFFINITY,
                                               acpi_parse_processor_affinity,
                                               NR_CPUS);
@@ -230,7 +222,7 @@ int __init acpi_numa_init(void)
        }
 
        /* SLIT: System Locality Information Table */
-       result = acpi_table_parse(ACPI_SIG_SLIT, acpi_parse_slit);
+       acpi_table_parse(ACPI_SIG_SLIT, acpi_parse_slit);
 
        acpi_numa_arch_fixup();
        return 0;
index 0f6f3bcbc8ebc2d4b0c06cb8f1443d1fb5e6e9b6..971eca4864fab3223bc68d97cd032a56d428f4ea 100644 (file)
@@ -46,7 +46,7 @@
 #include <linux/efi.h>
 
 #define _COMPONENT             ACPI_OS_SERVICES
-ACPI_MODULE_NAME("osl")
+ACPI_MODULE_NAME("osl");
 #define PREFIX         "ACPI: "
 struct acpi_os_dpc {
        acpi_osd_exec_callback function;
@@ -68,9 +68,6 @@ EXPORT_SYMBOL(acpi_in_debugger);
 extern char line_buf[80];
 #endif                         /*ENABLE_DEBUGGER */
 
-int acpi_specific_hotkey_enabled = TRUE;
-EXPORT_SYMBOL(acpi_specific_hotkey_enabled);
-
 static unsigned int acpi_irq_irq;
 static acpi_osd_handler acpi_irq_handler;
 static void *acpi_irq_context;
@@ -205,7 +202,7 @@ void __iomem *acpi_os_map_memory(acpi_physical_address phys, acpi_size size)
 {
        if (phys > ULONG_MAX) {
                printk(KERN_ERR PREFIX "Cannot map memory that high\n");
-               return 0;
+               return NULL;
        }
        if (acpi_gbl_permanent_mmap)
                /*
@@ -890,26 +887,6 @@ u32 acpi_os_get_line(char *buffer)
 }
 #endif                         /*  ACPI_FUTURE_USAGE  */
 
-/* Assumes no unreadable holes inbetween */
-u8 acpi_os_readable(void *ptr, acpi_size len)
-{
-#if defined(__i386__) || defined(__x86_64__)
-       char tmp;
-       return !__get_user(tmp, (char __user *)ptr)
-           && !__get_user(tmp, (char __user *)ptr + len - 1);
-#endif
-       return 1;
-}
-
-#ifdef ACPI_FUTURE_USAGE
-u8 acpi_os_writable(void *ptr, acpi_size len)
-{
-       /* could do dummy write (racy) or a kernel page table lookup.
-          The later may be difficult at early boot when kmap doesn't work yet. */
-       return 1;
-}
-#endif
-
 acpi_status acpi_os_signal(u32 function, void *info)
 {
        switch (function) {
@@ -1012,14 +989,6 @@ static int __init acpi_wake_gpes_always_on_setup(char *str)
 
 __setup("acpi_wake_gpes_always_on", acpi_wake_gpes_always_on_setup);
 
-static int __init acpi_hotkey_setup(char *str)
-{
-       acpi_specific_hotkey_enabled = FALSE;
-       return 1;
-}
-
-__setup("acpi_generic_hotkey", acpi_hotkey_setup);
-
 /*
  * max_cstate is defined in the base kernel so modules can
  * change it w/o depending on the state of the processor module.
index 55f57a61c55e19bab562c331473ea9abee9bc89f..028969370bbf821d9c015353f5d0d69b0cebc2c9 100644 (file)
@@ -36,7 +36,7 @@
 #include <acpi/acpi_drivers.h>
 
 #define _COMPONENT             ACPI_PCI_COMPONENT
-ACPI_MODULE_NAME("pci_bind")
+ACPI_MODULE_NAME("pci_bind");
 
 struct acpi_pci_data {
        struct acpi_pci_id id;
index fe7d007833ade1b03ba2660269bcd10d42440c54..dd3186abe07a9c464df616aae6fb05454fb53085 100644 (file)
@@ -38,7 +38,7 @@
 #include <acpi/acpi_drivers.h>
 
 #define _COMPONENT             ACPI_PCI_COMPONENT
-ACPI_MODULE_NAME("pci_irq")
+ACPI_MODULE_NAME("pci_irq");
 
 static struct acpi_prt_list acpi_prt;
 static DEFINE_SPINLOCK(acpi_prt_lock);
index 0f683c8c6fbc76676b193241e5af457118c7915f..acc594771379af521ef06a5f7a549ca781583d8d 100644 (file)
 #include <acpi/acpi_drivers.h>
 
 #define _COMPONENT             ACPI_PCI_COMPONENT
-ACPI_MODULE_NAME("pci_link")
+ACPI_MODULE_NAME("pci_link");
 #define ACPI_PCI_LINK_CLASS            "pci_irq_routing"
 #define ACPI_PCI_LINK_HID              "PNP0C0F"
-#define ACPI_PCI_LINK_DRIVER_NAME      "ACPI PCI Interrupt Link Driver"
 #define ACPI_PCI_LINK_DEVICE_NAME      "PCI Interrupt Link"
 #define ACPI_PCI_LINK_FILE_INFO                "info"
 #define ACPI_PCI_LINK_FILE_STATUS      "state"
@@ -56,7 +55,7 @@ static int acpi_pci_link_add(struct acpi_device *device);
 static int acpi_pci_link_remove(struct acpi_device *device, int type);
 
 static struct acpi_driver acpi_pci_link_driver = {
-       .name = ACPI_PCI_LINK_DRIVER_NAME,
+       .name = "pci_link",
        .class = ACPI_PCI_LINK_CLASS,
        .ids = ACPI_PCI_LINK_HID,
        .ops = {
index 4ecf701687e8768d23135796f3c818b0b68a213f..ad4145a37786d93a974455575a411b080c4aad63 100644 (file)
 #include <acpi/acpi_drivers.h>
 
 #define _COMPONENT             ACPI_PCI_COMPONENT
-ACPI_MODULE_NAME("pci_root")
+ACPI_MODULE_NAME("pci_root");
 #define ACPI_PCI_ROOT_CLASS            "pci_bridge"
 #define ACPI_PCI_ROOT_HID              "PNP0A03"
-#define ACPI_PCI_ROOT_DRIVER_NAME      "ACPI PCI Root Bridge Driver"
 #define ACPI_PCI_ROOT_DEVICE_NAME      "PCI Root Bridge"
 static int acpi_pci_root_add(struct acpi_device *device);
 static int acpi_pci_root_remove(struct acpi_device *device, int type);
 static int acpi_pci_root_start(struct acpi_device *device);
 
 static struct acpi_driver acpi_pci_root_driver = {
-       .name = ACPI_PCI_ROOT_DRIVER_NAME,
+       .name = "pci_root",
        .class = ACPI_PCI_ROOT_CLASS,
        .ids = ACPI_PCI_ROOT_HID,
        .ops = {
index 0ba7dfbbb2eebe47ad9f673d6151f605b503ef3a..00d6118ff1efeab52c7b8198141b8dfe65a2c218 100644 (file)
 #include <acpi/acpi_drivers.h>
 
 #define _COMPONENT             ACPI_POWER_COMPONENT
-ACPI_MODULE_NAME("acpi_power")
+ACPI_MODULE_NAME("power");
 #define ACPI_POWER_COMPONENT           0x00800000
 #define ACPI_POWER_CLASS               "power_resource"
-#define ACPI_POWER_DRIVER_NAME         "ACPI Power Resource Driver"
 #define ACPI_POWER_DEVICE_NAME         "Power Resource"
 #define ACPI_POWER_FILE_INFO           "info"
 #define ACPI_POWER_FILE_STATUS         "state"
@@ -57,25 +56,33 @@ ACPI_MODULE_NAME("acpi_power")
 #define ACPI_POWER_RESOURCE_STATE_UNKNOWN 0xFF
 static int acpi_power_add(struct acpi_device *device);
 static int acpi_power_remove(struct acpi_device *device, int type);
+static int acpi_power_resume(struct acpi_device *device);
 static int acpi_power_open_fs(struct inode *inode, struct file *file);
 
 static struct acpi_driver acpi_power_driver = {
-       .name = ACPI_POWER_DRIVER_NAME,
+       .name = "power",
        .class = ACPI_POWER_CLASS,
        .ids = ACPI_POWER_HID,
        .ops = {
                .add = acpi_power_add,
                .remove = acpi_power_remove,
+               .resume = acpi_power_resume,
                },
 };
 
+struct acpi_power_reference {
+       struct list_head node;
+       struct acpi_device *device;
+};
+
 struct acpi_power_resource {
        struct acpi_device * device;
        acpi_bus_id name;
        u32 system_level;
        u32 order;
        int state;
-       int references;
+       struct mutex resource_lock;
+       struct list_head reference;
 };
 
 static struct list_head acpi_power_resource_list;
@@ -171,22 +178,47 @@ static int acpi_power_get_list_state(struct acpi_handle_list *list, int *state)
        return result;
 }
 
-static int acpi_power_on(acpi_handle handle)
+static int acpi_power_on(acpi_handle handle, struct acpi_device *dev)
 {
        int result = 0;
+       int found = 0;
        acpi_status status = AE_OK;
-       struct acpi_device *device = NULL;
        struct acpi_power_resource *resource = NULL;
+       struct list_head *node, *next;
+       struct acpi_power_reference *ref;
 
 
        result = acpi_power_get_context(handle, &resource);
        if (result)
                return result;
 
-       resource->references++;
+       mutex_lock(&resource->resource_lock);
+       list_for_each_safe(node, next, &resource->reference) {
+               ref = container_of(node, struct acpi_power_reference, node);
+               if (dev->handle == ref->device->handle) {
+                       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] already referenced by resource [%s]\n",
+                                 dev->pnp.bus_id, resource->name));
+                       found = 1;
+                       break;
+               }
+       }
+
+       if (!found) {
+               ref = kmalloc(sizeof (struct acpi_power_reference),
+                   irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL);
+               if (!ref) {
+                       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "kmalloc() failed\n"));
+                       mutex_unlock(&resource->resource_lock);
+                       return -ENOMEM;
+               }
+               list_add_tail(&ref->node, &resource->reference);
+               ref->device = dev;
+               ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] added to resource [%s] references\n",
+                         dev->pnp.bus_id, resource->name));
+       }
+       mutex_unlock(&resource->resource_lock);
 
-       if ((resource->references > 1)
-           || (resource->state == ACPI_POWER_RESOURCE_STATE_ON)) {
+       if (resource->state == ACPI_POWER_RESOURCE_STATE_ON) {
                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource [%s] already on\n",
                                  resource->name));
                return 0;
@@ -203,38 +235,49 @@ static int acpi_power_on(acpi_handle handle)
                return -ENOEXEC;
 
        /* Update the power resource's _device_ power state */
-       device = resource->device;
        resource->device->power.state = ACPI_STATE_D0;
 
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource [%s] turned on\n",
                          resource->name));
-
        return 0;
 }
 
-static int acpi_power_off_device(acpi_handle handle)
+static int acpi_power_off_device(acpi_handle handle, struct acpi_device *dev)
 {
        int result = 0;
        acpi_status status = AE_OK;
        struct acpi_power_resource *resource = NULL;
+       struct list_head *node, *next;
+       struct acpi_power_reference *ref;
+
 
        result = acpi_power_get_context(handle, &resource);
        if (result)
                return result;
 
-       if (resource->references)
-               resource->references--;
+       mutex_lock(&resource->resource_lock);
+       list_for_each_safe(node, next, &resource->reference) {
+               ref = container_of(node, struct acpi_power_reference, node);
+               if (dev->handle == ref->device->handle) {
+                       list_del(&ref->node);
+                       kfree(ref);
+                       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] removed from resource [%s] references\n",
+                           dev->pnp.bus_id, resource->name));
+                       break;
+               }
+       }
 
-       if (resource->references) {
-               ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-                                 "Resource [%s] is still in use, dereferencing\n",
-                                 resource->device->pnp.bus_id));
+       if (!list_empty(&resource->reference)) {
+               ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Cannot turn resource [%s] off - resource is in use\n",
+                   resource->name));
+               mutex_unlock(&resource->resource_lock);
                return 0;
        }
+       mutex_unlock(&resource->resource_lock);
 
        if (resource->state == ACPI_POWER_RESOURCE_STATE_OFF) {
                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource [%s] already off\n",
-                                 resource->device->pnp.bus_id));
+                                 resource->name));
                return 0;
        }
 
@@ -276,7 +319,7 @@ int acpi_enable_wakeup_device_power(struct acpi_device *dev)
        arg.integer.value = 1;
        /* Open power resource */
        for (i = 0; i < dev->wakeup.resources.count; i++) {
-               ret = acpi_power_on(dev->wakeup.resources.handles[i]);
+               ret = acpi_power_on(dev->wakeup.resources.handles[i], dev);
                if (ret) {
                        printk(KERN_ERR PREFIX "Transition power state\n");
                        dev->wakeup.flags.valid = 0;
@@ -323,7 +366,7 @@ int acpi_disable_wakeup_device_power(struct acpi_device *dev)
 
        /* Close power resource */
        for (i = 0; i < dev->wakeup.resources.count; i++) {
-               ret = acpi_power_off_device(dev->wakeup.resources.handles[i]);
+               ret = acpi_power_off_device(dev->wakeup.resources.handles[i], dev);
                if (ret) {
                        printk(KERN_ERR PREFIX "Transition power state\n");
                        dev->wakeup.flags.valid = 0;
@@ -407,7 +450,7 @@ int acpi_power_transition(struct acpi_device *device, int state)
         * (e.g. so the device doesn't lose power while transitioning).
         */
        for (i = 0; i < tl->count; i++) {
-               result = acpi_power_on(tl->handles[i]);
+               result = acpi_power_on(tl->handles[i], device);
                if (result)
                        goto end;
        }
@@ -416,7 +459,7 @@ int acpi_power_transition(struct acpi_device *device, int state)
         * Then we dereference all power resources used in the current list.
         */
        for (i = 0; i < cl->count; i++) {
-               result = acpi_power_off_device(cl->handles[i]);
+               result = acpi_power_off_device(cl->handles[i], device);
                if (result)
                        goto end;
        }
@@ -439,7 +482,11 @@ static struct proc_dir_entry *acpi_power_dir;
 
 static int acpi_power_seq_show(struct seq_file *seq, void *offset)
 {
+       int count = 0;
+       int result = 0;
        struct acpi_power_resource *resource = NULL;
+       struct list_head *node, *next;
+       struct acpi_power_reference *ref;
 
 
        resource = seq->private;
@@ -447,6 +494,10 @@ static int acpi_power_seq_show(struct seq_file *seq, void *offset)
        if (!resource)
                goto end;
 
+       result = acpi_power_get_state(resource);
+       if (result)
+               goto end;
+
        seq_puts(seq, "state:                   ");
        switch (resource->state) {
        case ACPI_POWER_RESOURCE_STATE_ON:
@@ -460,11 +511,18 @@ static int acpi_power_seq_show(struct seq_file *seq, void *offset)
                break;
        }
 
+       mutex_lock(&resource->resource_lock);
+       list_for_each_safe(node, next, &resource->reference) {
+               ref = container_of(node, struct acpi_power_reference, node);
+               count++;
+       }
+       mutex_unlock(&resource->resource_lock);
+
        seq_printf(seq, "system level:            S%d\n"
                   "order:                   %d\n"
                   "reference count:         %d\n",
                   resource->system_level,
-                  resource->order, resource->references);
+                  resource->order, count);
 
       end:
        return 0;
@@ -537,6 +595,8 @@ static int acpi_power_add(struct acpi_device *device)
                return -ENOMEM;
 
        resource->device = device;
+       mutex_init(&resource->resource_lock);
+       INIT_LIST_HEAD(&resource->reference);
        strcpy(resource->name, device->pnp.bus_id);
        strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME);
        strcpy(acpi_device_class(device), ACPI_POWER_CLASS);
@@ -584,6 +644,7 @@ static int acpi_power_add(struct acpi_device *device)
 static int acpi_power_remove(struct acpi_device *device, int type)
 {
        struct acpi_power_resource *resource = NULL;
+       struct list_head *node, *next;
 
 
        if (!device || !acpi_driver_data(device))
@@ -593,11 +654,54 @@ static int acpi_power_remove(struct acpi_device *device, int type)
 
        acpi_power_remove_fs(device);
 
+       mutex_lock(&resource->resource_lock);
+       list_for_each_safe(node, next, &resource->reference) {
+               struct acpi_power_reference *ref = container_of(node, struct acpi_power_reference, node);
+               list_del(&ref->node);
+               kfree(ref);
+       }
+       mutex_unlock(&resource->resource_lock);
+
        kfree(resource);
 
        return 0;
 }
 
+static int acpi_power_resume(struct acpi_device *device)
+{
+       int result = 0;
+       struct acpi_power_resource *resource = NULL;
+       struct acpi_power_reference *ref;
+
+       if (!device || !acpi_driver_data(device))
+               return -EINVAL;
+
+       resource = (struct acpi_power_resource *)acpi_driver_data(device);
+
+       result = acpi_power_get_state(resource);
+       if (result)
+               return result;
+
+       mutex_lock(&resource->resource_lock);
+       if ((resource->state == ACPI_POWER_RESOURCE_STATE_ON) &&
+           list_empty(&resource->reference)) {
+               mutex_unlock(&resource->resource_lock);
+               result = acpi_power_off_device(device->handle, NULL);
+               return result;
+       }
+
+       if ((resource->state == ACPI_POWER_RESOURCE_STATE_OFF) &&
+           !list_empty(&resource->reference)) {
+               ref = container_of(resource->reference.next, struct acpi_power_reference, node);
+               mutex_unlock(&resource->resource_lock);
+               result = acpi_power_on(device->handle, ref->device);
+               return result;
+       }
+
+       mutex_unlock(&resource->resource_lock);
+       return 0;
+}
+
 static int __init acpi_power_init(void)
 {
        int result = 0;
index 0079bc51082c723eb35ee5098159f1acf3574ba2..99d1516d1e7023c067b8485272440dab43111485 100644 (file)
@@ -60,7 +60,6 @@
 
 #define ACPI_PROCESSOR_COMPONENT       0x01000000
 #define ACPI_PROCESSOR_CLASS           "processor"
-#define ACPI_PROCESSOR_DRIVER_NAME     "ACPI Processor Driver"
 #define ACPI_PROCESSOR_DEVICE_NAME     "Processor"
 #define ACPI_PROCESSOR_FILE_INFO       "info"
 #define ACPI_PROCESSOR_FILE_THROTTLING "throttling"
 #define ACPI_STA_PRESENT 0x00000001
 
 #define _COMPONENT             ACPI_PROCESSOR_COMPONENT
-ACPI_MODULE_NAME("acpi_processor")
+ACPI_MODULE_NAME("processor_core");
 
-    MODULE_AUTHOR("Paul Diefenbaugh");
-MODULE_DESCRIPTION(ACPI_PROCESSOR_DRIVER_NAME);
+MODULE_AUTHOR("Paul Diefenbaugh");
+MODULE_DESCRIPTION("ACPI Processor Driver");
 MODULE_LICENSE("GPL");
 
 static int acpi_processor_add(struct acpi_device *device);
@@ -89,7 +88,7 @@ static acpi_status acpi_processor_hotadd_init(acpi_handle handle, int *p_cpu);
 static int acpi_processor_handle_eject(struct acpi_processor *pr);
 
 static struct acpi_driver acpi_processor_driver = {
-       .name = ACPI_PROCESSOR_DRIVER_NAME,
+       .name = "processor",
        .class = ACPI_PROCESSOR_CLASS,
        .ids = ACPI_PROCESSOR_HID,
        .ops = {
@@ -404,7 +403,7 @@ static int map_lsapic_id(struct acpi_subtable_header *entry,
        if (lsapic->lapic_flags & ACPI_MADT_ENABLED) {
                /* First check against id */
                if (lsapic->processor_id == acpi_id) {
-                       *apic_id = lsapic->id;
+                       *apic_id = (lsapic->id << 8) | lsapic->eid;
                        return 1;
                /* Check against optional uid */
                } else if (entry->length >= 16 &&
@@ -1005,7 +1004,7 @@ static int __init acpi_processor_init(void)
 #ifdef CONFIG_SMP
        if (ACPI_FAILURE(acpi_get_table(ACPI_SIG_MADT, 0,
                                (struct acpi_table_header **)&madt)))
-               madt = 0;
+               madt = NULL;
 #endif
 
        acpi_processor_dir = proc_mkdir(ACPI_PROCESSOR_CLASS, acpi_root_dir);
index 6c6751b1405be5d7547a0e7f9010bc7dbaa82593..60773005b8afacbe24024a9ea33e96cc578ac59d 100644 (file)
 #include <linux/moduleparam.h>
 #include <linux/sched.h>       /* need_resched() */
 #include <linux/latency.h>
+#include <linux/clockchips.h>
+
+/*
+ * Include the apic definitions for x86 to have the APIC timer related defines
+ * available also for UP (on SMP it gets magically included via linux/smp.h).
+ * asm/acpi.h is not an option, as it would require more include magic. Also
+ * creating an empty asm-ia64/apic.h would just trade pest vs. cholera.
+ */
+#ifdef CONFIG_X86
+#include <asm/apic.h>
+#endif
+
+/*
+ * Include the apic definitions for x86 to have the APIC timer related defines
+ * available also for UP (on SMP it gets magically included via linux/smp.h).
+ */
+#ifdef CONFIG_X86
+#include <asm/apic.h>
+#endif
 
 #include <asm/io.h>
 #include <asm/uaccess.h>
@@ -48,9 +67,8 @@
 
 #define ACPI_PROCESSOR_COMPONENT        0x01000000
 #define ACPI_PROCESSOR_CLASS            "processor"
-#define ACPI_PROCESSOR_DRIVER_NAME      "ACPI Processor Driver"
 #define _COMPONENT              ACPI_PROCESSOR_COMPONENT
-ACPI_MODULE_NAME("acpi_processor")
+ACPI_MODULE_NAME("processor_idle");
 #define ACPI_PROCESSOR_FILE_POWER      "power"
 #define US_TO_PM_TIMER_TICKS(t)                ((t * (PM_TIMER_FREQUENCY/1000)) / 1000)
 #define C2_OVERHEAD                    4       /* 1us (3.579 ticks per us) */
@@ -238,6 +256,81 @@ static void acpi_cstate_enter(struct acpi_processor_cx *cstate)
        }
 }
 
+#ifdef ARCH_APICTIMER_STOPS_ON_C3
+
+/*
+ * Some BIOS implementations switch to C3 in the published C2 state.
+ * This seems to be a common problem on AMD boxen, but other vendors
+ * are affected too. We pick the most conservative approach: we assume
+ * that the local APIC stops in both C2 and C3.
+ */
+static void acpi_timer_check_state(int state, struct acpi_processor *pr,
+                                  struct acpi_processor_cx *cx)
+{
+       struct acpi_processor_power *pwr = &pr->power;
+
+       /*
+        * Check, if one of the previous states already marked the lapic
+        * unstable
+        */
+       if (pwr->timer_broadcast_on_state < state)
+               return;
+
+       if (cx->type >= ACPI_STATE_C2)
+               pr->power.timer_broadcast_on_state = state;
+}
+
+static void acpi_propagate_timer_broadcast(struct acpi_processor *pr)
+{
+#ifdef CONFIG_GENERIC_CLOCKEVENTS
+       unsigned long reason;
+
+       reason = pr->power.timer_broadcast_on_state < INT_MAX ?
+               CLOCK_EVT_NOTIFY_BROADCAST_ON : CLOCK_EVT_NOTIFY_BROADCAST_OFF;
+
+       clockevents_notify(reason, &pr->id);
+#else
+       cpumask_t mask = cpumask_of_cpu(pr->id);
+
+       if (pr->power.timer_broadcast_on_state < INT_MAX)
+               on_each_cpu(switch_APIC_timer_to_ipi, &mask, 1, 1);
+       else
+               on_each_cpu(switch_ipi_to_APIC_timer, &mask, 1, 1);
+#endif
+}
+
+/* Power(C) State timer broadcast control */
+static void acpi_state_timer_broadcast(struct acpi_processor *pr,
+                                      struct acpi_processor_cx *cx,
+                                      int broadcast)
+{
+#ifdef CONFIG_GENERIC_CLOCKEVENTS
+
+       int state = cx - pr->power.states;
+
+       if (state >= pr->power.timer_broadcast_on_state) {
+               unsigned long reason;
+
+               reason = broadcast ?  CLOCK_EVT_NOTIFY_BROADCAST_ENTER :
+                       CLOCK_EVT_NOTIFY_BROADCAST_EXIT;
+               clockevents_notify(reason, &pr->id);
+       }
+#endif
+}
+
+#else
+
+static void acpi_timer_check_state(int state, struct acpi_processor *pr,
+                                  struct acpi_processor_cx *cstate) { }
+static void acpi_propagate_timer_broadcast(struct acpi_processor *pr) { }
+static void acpi_state_timer_broadcast(struct acpi_processor *pr,
+                                      struct acpi_processor_cx *cx,
+                                      int broadcast)
+{
+}
+
+#endif
+
 static void acpi_processor_idle(void)
 {
        struct acpi_processor *pr = NULL;
@@ -382,6 +475,7 @@ static void acpi_processor_idle(void)
                /* Get start time (ticks) */
                t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
                /* Invoke C2 */
+               acpi_state_timer_broadcast(pr, cx, 1);
                acpi_cstate_enter(cx);
                /* Get end time (ticks) */
                t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);
@@ -396,6 +490,7 @@ static void acpi_processor_idle(void)
                /* Compute time (ticks) that we were actually asleep */
                sleep_ticks =
                    ticks_elapsed(t1, t2) - cx->latency_ticks - C2_OVERHEAD;
+               acpi_state_timer_broadcast(pr, cx, 0);
                break;
 
        case ACPI_STATE_C3:
@@ -417,6 +512,7 @@ static void acpi_processor_idle(void)
                /* Get start time (ticks) */
                t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
                /* Invoke C3 */
+               acpi_state_timer_broadcast(pr, cx, 1);
                acpi_cstate_enter(cx);
                /* Get end time (ticks) */
                t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);
@@ -436,6 +532,7 @@ static void acpi_processor_idle(void)
                /* Compute time (ticks) that we were actually asleep */
                sleep_ticks =
                    ticks_elapsed(t1, t2) - cx->latency_ticks - C3_OVERHEAD;
+               acpi_state_timer_broadcast(pr, cx, 0);
                break;
 
        default:
@@ -904,11 +1001,7 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
        unsigned int i;
        unsigned int working = 0;
 
-#ifdef ARCH_APICTIMER_STOPS_ON_C3
-       int timer_broadcast = 0;
-       cpumask_t mask = cpumask_of_cpu(pr->id);
-       on_each_cpu(switch_ipi_to_APIC_timer, &mask, 1, 1);
-#endif
+       pr->power.timer_broadcast_on_state = INT_MAX;
 
        for (i = 1; i < ACPI_PROCESSOR_MAX_POWER; i++) {
                struct acpi_processor_cx *cx = &pr->power.states[i];
@@ -920,21 +1013,14 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
 
                case ACPI_STATE_C2:
                        acpi_processor_power_verify_c2(cx);
-#ifdef ARCH_APICTIMER_STOPS_ON_C3
-                       /* Some AMD systems fake C3 as C2, but still
-                          have timer troubles */
-                       if (cx->valid && 
-                               boot_cpu_data.x86_vendor == X86_VENDOR_AMD)
-                               timer_broadcast++;
-#endif
+                       if (cx->valid)
+                               acpi_timer_check_state(i, pr, cx);
                        break;
 
                case ACPI_STATE_C3:
                        acpi_processor_power_verify_c3(pr, cx);
-#ifdef ARCH_APICTIMER_STOPS_ON_C3
                        if (cx->valid)
-                               timer_broadcast++;
-#endif
+                               acpi_timer_check_state(i, pr, cx);
                        break;
                }
 
@@ -942,10 +1028,7 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
                        working++;
        }
 
-#ifdef ARCH_APICTIMER_STOPS_ON_C3
-       if (timer_broadcast)
-               on_each_cpu(switch_APIC_timer_to_ipi, &mask, 1, 1);
-#endif
+       acpi_propagate_timer_broadcast(pr);
 
        return (working);
 }
index 058f13cf3b796208da3a801c7e81d5c6edd82e14..2f2e7964226dcc59840cec2b0e1942a251d64880 100644 (file)
 
 #define ACPI_PROCESSOR_COMPONENT       0x01000000
 #define ACPI_PROCESSOR_CLASS           "processor"
-#define ACPI_PROCESSOR_DRIVER_NAME     "ACPI Processor Driver"
 #define ACPI_PROCESSOR_FILE_PERFORMANCE        "performance"
 #define _COMPONENT             ACPI_PROCESSOR_COMPONENT
-ACPI_MODULE_NAME("acpi_processor")
+ACPI_MODULE_NAME("processor_perflib");
 
 static DEFINE_MUTEX(performance_mutex);
 
index 40fecd67ad8371674372a77c73e9e3b0fb991cdd..06e6f3fb88254d61dda243f390a7eabc509696aa 100644 (file)
@@ -41,9 +41,8 @@
 
 #define ACPI_PROCESSOR_COMPONENT        0x01000000
 #define ACPI_PROCESSOR_CLASS            "processor"
-#define ACPI_PROCESSOR_DRIVER_NAME      "ACPI Processor Driver"
 #define _COMPONENT              ACPI_PROCESSOR_COMPONENT
-ACPI_MODULE_NAME("acpi_processor")
+ACPI_MODULE_NAME("processor_thermal");
 
 /* --------------------------------------------------------------------------
                                  Limit Interface
index 89dff3639abef84e8880590d4eb1c8e742bd71b2..b33486009f41c690f1b6bed87f4818beb17a27d6 100644 (file)
@@ -41,9 +41,8 @@
 
 #define ACPI_PROCESSOR_COMPONENT        0x01000000
 #define ACPI_PROCESSOR_CLASS            "processor"
-#define ACPI_PROCESSOR_DRIVER_NAME      "ACPI Processor Driver"
 #define _COMPONENT              ACPI_PROCESSOR_COMPONENT
-ACPI_MODULE_NAME("acpi_processor")
+ACPI_MODULE_NAME("processor_throttling");
 
 /* --------------------------------------------------------------------------
                               Throttling Control
index f58fc7447ab4ee8757885d869505a629ff4efa7a..1eab2034c9a5b6d5bb3c37cae98156883a0ce24f 100644 (file)
@@ -59,7 +59,6 @@ extern void acpi_unlock_battery_dir(struct proc_dir_entry *acpi_battery_dir);
 #define ACPI_AC_CLASS                  "ac_adapter"
 #define ACPI_BATTERY_CLASS             "battery"
 #define ACPI_SBS_HID                   "ACPI0002"
-#define ACPI_SBS_DRIVER_NAME           "ACPI Smart Battery System Driver"
 #define ACPI_SBS_DEVICE_NAME           "Smart Battery System"
 #define ACPI_SBS_FILE_INFO             "info"
 #define ACPI_SBS_FILE_STATE            "state"
@@ -78,7 +77,7 @@ extern void acpi_unlock_battery_dir(struct proc_dir_entry *acpi_battery_dir);
 #define        MAX_SBS_BAT                     4
 #define        MAX_SMBUS_ERR                   1
 
-ACPI_MODULE_NAME("acpi_sbs");
+ACPI_MODULE_NAME("sbs");
 
 MODULE_AUTHOR("Rich Townsend");
 MODULE_DESCRIPTION("Smart Battery System ACPI interface driver");
@@ -110,7 +109,7 @@ static void acpi_battery_smbus_err_handler(struct acpi_ec_smbus *smbus);
 static void acpi_sbs_update_queue(void *data);
 
 static struct acpi_driver acpi_sbs_driver = {
-       .name = ACPI_SBS_DRIVER_NAME,
+       .name = "sbs",
        .class = ACPI_SBS_CLASS,
        .ids = ACPI_SBS_HID,
        .ops = {
index 64f26db10c8efd765fcde8e8d0eb821b3a06efc2..bb0e0da39fb15d355be664e5ae23f1dc5e632441 100644 (file)
 #include <acpi/acinterp.h>     /* for acpi_ex_eisa_id_to_string() */
 
 #define _COMPONENT             ACPI_BUS_COMPONENT
-ACPI_MODULE_NAME("scan")
+ACPI_MODULE_NAME("scan");
 #define STRUCT_TO_INT(s)       (*((int*)&s))
 extern struct acpi_device *acpi_root;
 
 #define ACPI_BUS_CLASS                 "system_bus"
 #define ACPI_BUS_HID                   "ACPI_BUS"
-#define ACPI_BUS_DRIVER_NAME           "ACPI Bus Driver"
 #define ACPI_BUS_DEVICE_NAME           "System Bus"
 
 static LIST_HEAD(acpi_device_list);
index 47fb4b394eec568636b2a7da421e12210e96acc6..d9801eff6489c1448e2e33c20650c21f0e399469 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/pm.h>
 #include <linux/init.h>
 #include <acpi/acpi_bus.h>
-#include <linux/sched.h>
 #include <linux/sysdev.h>
 #include <asm/io.h>
 #include "sleep.h"
index 7147b0bdab0a83f8581d79bf192ea986deea10f5..83a8d3097904e99dbb825736ee84294bd4739de5 100644 (file)
 #include <acpi/acpi_drivers.h>
 
 #define _COMPONENT             ACPI_SYSTEM_COMPONENT
-ACPI_MODULE_NAME("acpi_system")
+ACPI_MODULE_NAME("system");
 #ifdef MODULE_PARAM_PREFIX
 #undef MODULE_PARAM_PREFIX
 #endif
 #define MODULE_PARAM_PREFIX "acpi."
 
 #define ACPI_SYSTEM_CLASS              "system"
-#define ACPI_SYSTEM_DRIVER_NAME                "ACPI System Driver"
 #define ACPI_SYSTEM_DEVICE_NAME                "System"
 #define ACPI_SYSTEM_FILE_INFO          "info"
 #define ACPI_SYSTEM_FILE_EVENT         "event"
index ba4cb200314a12f50b66527140e7abada696fe91..849e2c361804bd91fbba7279e149469e1848f56f 100644 (file)
@@ -25,7 +25,6 @@
 
 #include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/smp.h>
 #include <linux/string.h>
 #include <linux/types.h>
@@ -170,40 +169,40 @@ void acpi_table_print_madt_entry(struct acpi_subtable_header * header)
 
 
 int __init
-acpi_table_parse_madt_family(char *id,
-                            unsigned long madt_size,
+acpi_table_parse_entries(char *id,
+                            unsigned long table_size,
                             int entry_id,
-                            acpi_madt_entry_handler handler,
+                            acpi_table_entry_handler handler,
                             unsigned int max_entries)
 {
-       struct acpi_table_header *madt = NULL;
+       struct acpi_table_header *table_header = NULL;
        struct acpi_subtable_header *entry;
        unsigned int count = 0;
-       unsigned long madt_end;
+       unsigned long table_end;
 
        if (!handler)
                return -EINVAL;
 
-       /* Locate the MADT (if exists). There should only be one. */
-       acpi_get_table(id, 0, &madt);
+       /* Locate the table (if exists). There should only be one. */
+       acpi_get_table(id, 0, &table_header);
 
-       if (!madt) {
+       if (!table_header) {
                printk(KERN_WARNING PREFIX "%4.4s not present\n", id);
                return -ENODEV;
        }
 
-       madt_end = (unsigned long)madt + madt->length;
+       table_end = (unsigned long)table_header + table_header->length;
 
        /* Parse all entries looking for a match. */
 
        entry = (struct acpi_subtable_header *)
-           ((unsigned long)madt + madt_size);
+           ((unsigned long)table_header + table_size);
 
        while (((unsigned long)entry) + sizeof(struct acpi_subtable_header) <
-              madt_end) {
+              table_end) {
                if (entry->type == entry_id
                    && (!max_entries || count++ < max_entries))
-                       if (handler(entry, madt_end))
+                       if (handler(entry, table_end))
                                return -EINVAL;
 
                entry = (struct acpi_subtable_header *)
@@ -219,13 +218,22 @@ acpi_table_parse_madt_family(char *id,
 
 int __init
 acpi_table_parse_madt(enum acpi_madt_type id,
-                     acpi_madt_entry_handler handler, unsigned int max_entries)
+                     acpi_table_entry_handler handler, unsigned int max_entries)
 {
-       return acpi_table_parse_madt_family(ACPI_SIG_MADT,
+       return acpi_table_parse_entries(ACPI_SIG_MADT,
                                            sizeof(struct acpi_table_madt), id,
                                            handler, max_entries);
 }
 
+/**
+ * acpi_table_parse - find table with @id, run @handler on it
+ *
+ * @id: table id to find
+ * @handler: handler to run
+ *
+ * Scan the ACPI System Descriptor Table (STD) for a table matching @id,
+ * run @handler on it.  Return 0 if table found, return on if not.
+ */
 int __init acpi_table_parse(char *id, acpi_table_handler handler)
 {
        struct acpi_table_header *table = NULL;
@@ -235,9 +243,9 @@ int __init acpi_table_parse(char *id, acpi_table_handler handler)
        acpi_get_table(id, 0, &table);
        if (table) {
                handler(table);
-               return 1;
-       } else
                return 0;
+       } else
+               return 1;
 }
 
 /*
index 807978d5381abb34767687de505600b0e8d6aa8a..417ef5fa7666e4a09b49f25a764778778de84cd4 100644 (file)
@@ -338,9 +338,9 @@ acpi_status acpi_unload_table_id(acpi_owner_id id)
        int i;
        acpi_status status = AE_NOT_EXIST;
 
-       ACPI_FUNCTION_TRACE(acpi_unload_table);
+       ACPI_FUNCTION_TRACE(acpi_unload_table_id);
 
-       /* Find table from the requested type list */
+       /* Find table in the global table list */
        for (i = 0; i < acpi_gbl_root_table_list.count; ++i) {
                if (id != acpi_gbl_root_table_list.tables[i].owner_id) {
                        continue;
@@ -352,8 +352,9 @@ acpi_status acpi_unload_table_id(acpi_owner_id id)
                * simply a position within the hierarchy
                */
                acpi_tb_delete_namespace_by_owner(i);
-               acpi_tb_release_owner_id(i);
+               status = acpi_tb_release_owner_id(i);
                acpi_tb_set_table_loaded_flag(i, FALSE);
+               break;
        }
        return_ACPI_STATUS(status);
 }
@@ -408,7 +409,7 @@ acpi_get_table(char *signature,
                }
 
                if (!acpi_gbl_permanent_mmap) {
-                       acpi_gbl_root_table_list.tables[i].pointer = 0;
+                       acpi_gbl_root_table_list.tables[i].pointer = NULL;
                }
 
                return (status);
index f76d3168c2b2d3e098ba0ca14883853dc6917b19..15022bc863365c0dda886dcbf1bdaf60392af750 100644 (file)
@@ -36,7 +36,8 @@
 #include <linux/init.h>
 #include <linux/types.h>
 #include <linux/proc_fs.h>
-#include <linux/sched.h>
+#include <linux/timer.h>
+#include <linux/jiffies.h>
 #include <linux/kmod.h>
 #include <linux/seq_file.h>
 #include <asm/uaccess.h>
@@ -46,7 +47,6 @@
 
 #define ACPI_THERMAL_COMPONENT         0x04000000
 #define ACPI_THERMAL_CLASS             "thermal_zone"
-#define ACPI_THERMAL_DRIVER_NAME       "ACPI Thermal Zone Driver"
 #define ACPI_THERMAL_DEVICE_NAME       "Thermal Zone"
 #define ACPI_THERMAL_FILE_STATE                "state"
 #define ACPI_THERMAL_FILE_TEMPERATURE  "temperature"
 #define CELSIUS_TO_KELVIN(t)   ((t+273)*10)
 
 #define _COMPONENT             ACPI_THERMAL_COMPONENT
-ACPI_MODULE_NAME("acpi_thermal")
+ACPI_MODULE_NAME("thermal");
 
 MODULE_AUTHOR("Paul Diefenbaugh");
-MODULE_DESCRIPTION(ACPI_THERMAL_DRIVER_NAME);
+MODULE_DESCRIPTION("ACPI Thermal Zone Driver");
 MODULE_LICENSE("GPL");
 
 static int tzp;
@@ -98,7 +98,7 @@ static ssize_t acpi_thermal_write_polling(struct file *, const char __user *,
                                          size_t, loff_t *);
 
 static struct acpi_driver acpi_thermal_driver = {
-       .name = ACPI_THERMAL_DRIVER_NAME,
+       .name = "thermal",
        .class = ACPI_THERMAL_CLASS,
        .ids = ACPI_THERMAL_HID,
        .ops = {
@@ -269,7 +269,7 @@ static int acpi_thermal_set_polling(struct acpi_thermal *tz, int seconds)
 
        ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                          "Polling frequency set to %lu seconds\n",
-                         tz->polling_frequency));
+                         tz->polling_frequency/10));
 
        return 0;
 }
index d9b651ffcdc0c21335f1c15e1e7ef7e3d86361cf..faf8a5232d8e5d94d285f7c92bc4b6856ace05bb 100644 (file)
@@ -125,7 +125,7 @@ static int write_acpi_int(const char *methodName, int val)
        union acpi_object in_objs[1];
        acpi_status status;
 
-       params.count = sizeof(in_objs) / sizeof(in_objs[0]);
+       params.count = ARRAY_SIZE(in_objs);
        params.pointer = in_objs;
        in_objs[0].type = ACPI_TYPE_INTEGER;
        in_objs[0].integer.value = val;
@@ -561,10 +561,6 @@ static int __init toshiba_acpi_init(void)
        if (acpi_disabled)
                return -ENODEV;
 
-       if (!acpi_specific_hotkey_enabled) {
-               printk(MY_INFO "Using generic hotkey driver\n");
-               return -ENODEV;
-       }
        /* simple device detection: look for HCI method */
        if (is_valid_acpi_path(METHOD_HCI_1))
                method_hci = METHOD_HCI_1;
index f777cebdc46dd85f8ec66b491096f9d2f20af1a3..673a0caa4073438f3f22af2dcad6a6e9f4bdc029 100644 (file)
@@ -170,7 +170,6 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
                        acpi_os_delete_mutex(object->mutex.os_mutex);
                        acpi_gbl_global_lock_mutex = NULL;
                } else {
-                       acpi_ex_unlink_mutex(object);
                        acpi_os_delete_mutex(object->mutex.os_mutex);
                }
                break;
index 68a809fa7b19d06ef9f9457120d05fdbbecdb9b2..34f1575710807eada4cfd4ff8162b9753b4cfd1b 100644 (file)
@@ -31,7 +31,7 @@
 #include <acpi/acpi_drivers.h>
 
 #define _COMPONENT             ACPI_BUS_COMPONENT
-ACPI_MODULE_NAME("acpi_utils")
+ACPI_MODULE_NAME("utils");
 
 /* --------------------------------------------------------------------------
                             Object Evaluation Helpers
index e0b97add8c6355274cb220b04352c9927263b5d2..bf525cca3b637160a3c1b28f95269ea108c1dfd3 100644 (file)
@@ -40,7 +40,6 @@
 
 #define ACPI_VIDEO_COMPONENT           0x08000000
 #define ACPI_VIDEO_CLASS               "video"
-#define ACPI_VIDEO_DRIVER_NAME         "ACPI Video Driver"
 #define ACPI_VIDEO_BUS_NAME            "Video Bus"
 #define ACPI_VIDEO_DEVICE_NAME         "Video Device"
 #define ACPI_VIDEO_NOTIFY_SWITCH       0x80
 #define ACPI_VIDEO_DISPLAY_LCD 4
 
 #define _COMPONENT             ACPI_VIDEO_COMPONENT
-ACPI_MODULE_NAME("acpi_video")
+ACPI_MODULE_NAME("video");
 
-    MODULE_AUTHOR("Bruno Ducrot");
-MODULE_DESCRIPTION(ACPI_VIDEO_DRIVER_NAME);
+MODULE_AUTHOR("Bruno Ducrot");
+MODULE_DESCRIPTION("ACPI Video Driver");
 MODULE_LICENSE("GPL");
 
 static int acpi_video_bus_add(struct acpi_device *device);
 static int acpi_video_bus_remove(struct acpi_device *device, int type);
 
 static struct acpi_driver acpi_video_bus = {
-       .name = ACPI_VIDEO_DRIVER_NAME,
+       .name = "video",
        .class = ACPI_VIDEO_CLASS,
        .ids = ACPI_VIDEO_HID,
        .ops = {
index 1c94b43d2c9b0fd6696ce44fb7837953cd051500..3747457fee7a1f2180dbf0abf96281494c3ff050 100644 (file)
@@ -41,12 +41,12 @@ config SATA_SVW
          If unsure, say N.
 
 config ATA_PIIX
-       tristate "Intel PIIX/ICH SATA support"
+       tristate "Intel ESB, ICH, PIIX3, PIIX4 PATA/SATA support"
        depends on PCI
        help
          This option enables support for ICH5/6/7/8 Serial ATA
-         and support for PATA on the Intel PIIX3/PIIX4/ICH series
-         PATA host controllers.
+         and support for PATA on the Intel ESB/ICH/PIIX3/PIIX4 series
+         host controllers.
 
          If unsure, say N.
 
@@ -116,11 +116,14 @@ config SATA_SIL24
          If unsure, say N.
 
 config SATA_SIS
-       tristate "SiS 964/180 SATA support"
+       tristate "SiS 964/965/966/180 SATA support"
        depends on PCI
+       select PATA_SIS
        help
-         This option enables support for SiS Serial ATA 964/180.
-
+         This option enables support for SiS Serial ATA on 
+         SiS 964/965/966/180 and Parallel ATA on SiS 180.
+         The PATA support for SiS 180 requires additionally to
+         enable the PATA_SIS driver in the config.
          If unsure, say N.
 
 config SATA_ULI
@@ -147,6 +150,12 @@ config SATA_VITESSE
 
          If unsure, say N.
 
+config SATA_INIC162X
+       tristate "Initio 162x SATA support (HIGHLY EXPERIMENTAL)"
+       depends on PCI && EXPERIMENTAL
+       help
+         This option enables support for Initio 162x Serial ATA.
+
 config SATA_INTEL_COMBINED
        bool
        depends on IDE=y && !BLK_DEV_IDE_SATA && (SATA_AHCI || ATA_PIIX)
@@ -296,7 +305,7 @@ config PATA_ISAPNP
          If unsure, say N.
 
 config PATA_IT821X
-       tristate "IT821x PATA support (Experimental)"
+       tristate "IT8211/2 PATA support (Experimental)"
        depends on PCI && EXPERIMENTAL
        help
          This option enables support for the ITE 8211 and 8212
@@ -305,6 +314,15 @@ config PATA_IT821X
 
          If unsure, say N.
 
+config PATA_IT8213
+       tristate "IT8213 PATA support (Experimental)"
+       depends on PCI && EXPERIMENTAL
+       help
+         This option enables support for the ITE 821 PATA
+          controllers via the new ATA layer.
+
+         If unsure, say N.
+
 config PATA_JMICRON
        tristate "JMicron PATA support"
        depends on PCI
@@ -341,6 +359,15 @@ config PATA_MARVELL
 
          If unsure, say N.
 
+config PATA_MPC52xx
+       tristate "Freescale MPC52xx SoC internal IDE"
+       depends on PPC_MPC52xx
+       help
+         This option enables support for integrated IDE controller
+         of the Freescale MPC52xx SoC.
+
+         If unsure, say N.
+
 config PATA_MPIIX
        tristate "Intel PATA MPIIX support"
        depends on PCI
index bc3d81ae757e64e9b98869a3ef1204e420553400..cd096f0c78a105c2e9a9e605e0acdc3aed82af89 100644 (file)
@@ -15,6 +15,7 @@ obj-$(CONFIG_SATA_SX4)                += sata_sx4.o
 obj-$(CONFIG_SATA_NV)          += sata_nv.o
 obj-$(CONFIG_SATA_ULI)         += sata_uli.o
 obj-$(CONFIG_SATA_MV)          += sata_mv.o
+obj-$(CONFIG_SATA_INIC162X)    += sata_inic162x.o
 obj-$(CONFIG_PDC_ADMA)         += pdc_adma.o
 
 obj-$(CONFIG_PATA_ALI)         += pata_ali.o
@@ -33,11 +34,13 @@ obj-$(CONFIG_PATA_HPT3X2N)  += pata_hpt3x2n.o
 obj-$(CONFIG_PATA_HPT3X3)      += pata_hpt3x3.o
 obj-$(CONFIG_PATA_ISAPNP)      += pata_isapnp.o
 obj-$(CONFIG_PATA_IT821X)      += pata_it821x.o
+obj-$(CONFIG_PATA_IT8213)      += pata_it8213.o
 obj-$(CONFIG_PATA_JMICRON)     += pata_jmicron.o
 obj-$(CONFIG_PATA_NETCELL)     += pata_netcell.o
 obj-$(CONFIG_PATA_NS87410)     += pata_ns87410.o
 obj-$(CONFIG_PATA_OPTI)                += pata_opti.o
 obj-$(CONFIG_PATA_OPTIDMA)     += pata_optidma.o
+obj-$(CONFIG_PATA_MPC52xx)     += pata_mpc52xx.o
 obj-$(CONFIG_PATA_MARVELL)     += pata_marvell.o
 obj-$(CONFIG_PATA_MPIIX)       += pata_mpiix.o
 obj-$(CONFIG_PATA_OLDPIIX)     += pata_oldpiix.o
index e2796fb40eb7eb7765060262f77a8d54763a051c..6a3543e062415cfa733e728fd327d3cbe851be14 100644 (file)
 #include <linux/blkdev.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
-#include <linux/sched.h>
 #include <linux/dma-mapping.h>
 #include <linux/device.h>
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_cmnd.h>
 #include <linux/libata.h>
-#include <asm/io.h>
 
 #define DRV_NAME       "ahci"
 #define DRV_VERSION    "2.0"
@@ -166,9 +164,6 @@ enum {
        PORT_CMD_ICC_PARTIAL    = (0x2 << 28), /* Put i/f in partial state */
        PORT_CMD_ICC_SLUMBER    = (0x6 << 28), /* Put i/f in slumber state */
 
-       /* hpriv->flags bits */
-       AHCI_FLAG_MSI           = (1 << 0),
-
        /* ap->flags bits */
        AHCI_FLAG_NO_NCQ                = (1 << 24),
        AHCI_FLAG_IGN_IRQ_IF_ERR        = (1 << 25), /* ignore IRQ_IF_ERR */
@@ -191,7 +186,6 @@ struct ahci_sg {
 };
 
 struct ahci_host_priv {
-       unsigned long           flags;
        u32                     cap;    /* cache of HOST_CAP register */
        u32                     port_map; /* cache of HOST_PORTS_IMPL reg */
 };
@@ -229,7 +223,6 @@ static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg);
 static int ahci_port_resume(struct ata_port *ap);
 static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg);
 static int ahci_pci_device_resume(struct pci_dev *pdev);
-static void ahci_remove_one (struct pci_dev *pdev);
 
 static struct scsi_host_template ahci_sht = {
        .module                 = THIS_MODULE,
@@ -266,6 +259,8 @@ static const struct ata_port_operations ahci_ops = {
 
        .irq_handler            = ahci_interrupt,
        .irq_clear              = ahci_irq_clear,
+       .irq_on                 = ata_dummy_irq_on,
+       .irq_ack                = ata_dummy_irq_ack,
 
        .scr_read               = ahci_scr_read,
        .scr_write              = ahci_scr_write,
@@ -297,6 +292,8 @@ static const struct ata_port_operations ahci_vt8251_ops = {
 
        .irq_handler            = ahci_interrupt,
        .irq_clear              = ahci_irq_clear,
+       .irq_on                 = ata_dummy_irq_on,
+       .irq_ack                = ata_dummy_irq_ack,
 
        .scr_read               = ahci_scr_read,
        .scr_write              = ahci_scr_write,
@@ -431,7 +428,7 @@ static const struct pci_device_id ahci_pci_tbl[] = {
 
        /* Generic, PCI class code for AHCI */
        { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
-         0x010601, 0xffffff, board_ahci },
+         PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci },
 
        { }     /* terminate list */
 };
@@ -441,9 +438,9 @@ static struct pci_driver ahci_pci_driver = {
        .name                   = DRV_NAME,
        .id_table               = ahci_pci_tbl,
        .probe                  = ahci_init_one,
+       .remove                 = ata_pci_remove_one,
        .suspend                = ahci_pci_device_suspend,
        .resume                 = ahci_pci_device_resume,
-       .remove                 = ahci_remove_one,
 };
 
 
@@ -452,16 +449,12 @@ static inline int ahci_nr_ports(u32 cap)
        return (cap & 0x1f) + 1;
 }
 
-static inline unsigned long ahci_port_base_ul (unsigned long base, unsigned int port)
+static inline void __iomem *ahci_port_base(void __iomem *base,
+                                          unsigned int port)
 {
        return base + 0x100 + (port * 0x80);
 }
 
-static inline void __iomem *ahci_port_base (void __iomem *base, unsigned int port)
-{
-       return (void __iomem *) ahci_port_base_ul((unsigned long)base, port);
-}
-
 static u32 ahci_scr_read (struct ata_port *ap, unsigned int sc_reg_in)
 {
        unsigned int sc_reg;
@@ -475,7 +468,7 @@ static u32 ahci_scr_read (struct ata_port *ap, unsigned int sc_reg_in)
                return 0xffffffffU;
        }
 
-       return readl((void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4));
+       return readl(ap->ioaddr.scr_addr + (sc_reg * 4));
 }
 
 
@@ -493,7 +486,7 @@ static void ahci_scr_write (struct ata_port *ap, unsigned int sc_reg_in,
                return;
        }
 
-       writel(val, (void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4));
+       writel(val, ap->ioaddr.scr_addr + (sc_reg * 4));
 }
 
 static void ahci_start_engine(void __iomem *port_mmio)
@@ -735,7 +728,7 @@ static void ahci_init_controller(void __iomem *mmio, struct pci_dev *pdev,
 
 static unsigned int ahci_dev_classify(struct ata_port *ap)
 {
-       void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr;
+       void __iomem *port_mmio = ap->ioaddr.cmd_addr;
        struct ata_taskfile tf;
        u32 tmp;
 
@@ -763,7 +756,7 @@ static void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag,
 
 static int ahci_clo(struct ata_port *ap)
 {
-       void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr;
+       void __iomem *port_mmio = ap->ioaddr.cmd_addr;
        struct ahci_host_priv *hpriv = ap->host->private_data;
        u32 tmp;
 
@@ -785,7 +778,7 @@ static int ahci_clo(struct ata_port *ap)
 static int ahci_softreset(struct ata_port *ap, unsigned int *class)
 {
        struct ahci_port_priv *pp = ap->private_data;
-       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR];
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
        const u32 cmd_fis_len = 5; /* five dwords */
        const char *reason = NULL;
@@ -893,7 +886,7 @@ static int ahci_hardreset(struct ata_port *ap, unsigned int *class)
        struct ahci_port_priv *pp = ap->private_data;
        u8 *d2h_fis = pp->rx_fis + RX_FIS_D2H_REG;
        struct ata_taskfile tf;
-       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR];
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
        int rc;
 
@@ -921,7 +914,7 @@ static int ahci_hardreset(struct ata_port *ap, unsigned int *class)
 
 static int ahci_vt8251_hardreset(struct ata_port *ap, unsigned int *class)
 {
-       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR];
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
        int rc;
 
@@ -946,7 +939,7 @@ static int ahci_vt8251_hardreset(struct ata_port *ap, unsigned int *class)
 
 static void ahci_postreset(struct ata_port *ap, unsigned int *class)
 {
-       void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr;
+       void __iomem *port_mmio = ap->ioaddr.cmd_addr;
        u32 new_tmp, tmp;
 
        ata_std_postreset(ap, class);
@@ -965,7 +958,7 @@ static void ahci_postreset(struct ata_port *ap, unsigned int *class)
 
 static u8 ahci_check_status(struct ata_port *ap)
 {
-       void __iomem *mmio = (void __iomem *) ap->ioaddr.cmd_addr;
+       void __iomem *mmio = ap->ioaddr.cmd_addr;
 
        return readl(mmio + PORT_TFDATA) & 0xFF;
 }
@@ -1111,7 +1104,7 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat)
 
 static void ahci_host_intr(struct ata_port *ap)
 {
-       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR];
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
        struct ata_eh_info *ehi = &ap->eh_info;
        struct ahci_port_priv *pp = ap->private_data;
@@ -1209,7 +1202,7 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance)
        VPRINTK("ENTER\n");
 
        hpriv = host->private_data;
-       mmio = host->mmio_base;
+       mmio = host->iomap[AHCI_PCI_BAR];
 
        /* sigh.  0xffffffff is a valid return from h/w */
        irq_stat = readl(mmio + HOST_IRQ_STAT);
@@ -1254,7 +1247,7 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance)
 static unsigned int ahci_qc_issue(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
-       void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr;
+       void __iomem *port_mmio = ap->ioaddr.cmd_addr;
 
        if (qc->tf.protocol == ATA_PROT_NCQ)
                writel(1 << qc->tag, port_mmio + PORT_SCR_ACT);
@@ -1266,7 +1259,7 @@ static unsigned int ahci_qc_issue(struct ata_queued_cmd *qc)
 
 static void ahci_freeze(struct ata_port *ap)
 {
-       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR];
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
 
        /* turn IRQ off */
@@ -1275,7 +1268,7 @@ static void ahci_freeze(struct ata_port *ap)
 
 static void ahci_thaw(struct ata_port *ap)
 {
-       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR];
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
        u32 tmp;
 
@@ -1290,7 +1283,7 @@ static void ahci_thaw(struct ata_port *ap)
 
 static void ahci_error_handler(struct ata_port *ap)
 {
-       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR];
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
 
        if (!(ap->pflags & ATA_PFLAG_FROZEN)) {
@@ -1306,7 +1299,7 @@ static void ahci_error_handler(struct ata_port *ap)
 
 static void ahci_vt8251_error_handler(struct ata_port *ap)
 {
-       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR];
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
 
        if (!(ap->pflags & ATA_PFLAG_FROZEN)) {
@@ -1323,7 +1316,7 @@ static void ahci_vt8251_error_handler(struct ata_port *ap)
 static void ahci_post_internal_cmd(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
-       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR];
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
 
        if (qc->flags & ATA_QCFLAG_FAILED)
@@ -1340,7 +1333,7 @@ static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg)
 {
        struct ahci_host_priv *hpriv = ap->host->private_data;
        struct ahci_port_priv *pp = ap->private_data;
-       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR];
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
        const char *emsg = NULL;
        int rc;
@@ -1361,7 +1354,7 @@ static int ahci_port_resume(struct ata_port *ap)
 {
        struct ahci_port_priv *pp = ap->private_data;
        struct ahci_host_priv *hpriv = ap->host->private_data;
-       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR];
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
 
        ahci_power_up(port_mmio, hpriv->cap);
@@ -1373,7 +1366,7 @@ static int ahci_port_resume(struct ata_port *ap)
 static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg)
 {
        struct ata_host *host = dev_get_drvdata(&pdev->dev);
-       void __iomem *mmio = host->mmio_base;
+       void __iomem *mmio = host->iomap[AHCI_PCI_BAR];
        u32 ctl;
 
        if (mesg.event == PM_EVENT_SUSPEND) {
@@ -1394,10 +1387,12 @@ static int ahci_pci_device_resume(struct pci_dev *pdev)
 {
        struct ata_host *host = dev_get_drvdata(&pdev->dev);
        struct ahci_host_priv *hpriv = host->private_data;
-       void __iomem *mmio = host->mmio_base;
+       void __iomem *mmio = host->iomap[AHCI_PCI_BAR];
        int rc;
 
-       ata_pci_device_do_resume(pdev);
+       rc = ata_pci_device_do_resume(pdev);
+       if (rc)
+               return rc;
 
        if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
                rc = ahci_reset_controller(mmio, pdev);
@@ -1418,29 +1413,24 @@ static int ahci_port_start(struct ata_port *ap)
        struct device *dev = ap->host->dev;
        struct ahci_host_priv *hpriv = ap->host->private_data;
        struct ahci_port_priv *pp;
-       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR];
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
        void *mem;
        dma_addr_t mem_dma;
        int rc;
 
-       pp = kmalloc(sizeof(*pp), GFP_KERNEL);
+       pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
        if (!pp)
                return -ENOMEM;
-       memset(pp, 0, sizeof(*pp));
 
        rc = ata_pad_alloc(ap, dev);
-       if (rc) {
-               kfree(pp);
+       if (rc)
                return rc;
-       }
 
-       mem = dma_alloc_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, &mem_dma, GFP_KERNEL);
-       if (!mem) {
-               ata_pad_free(ap, dev);
-               kfree(pp);
+       mem = dmam_alloc_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, &mem_dma,
+                                 GFP_KERNEL);
+       if (!mem)
                return -ENOMEM;
-       }
        memset(mem, 0, AHCI_PORT_PRIV_DMA_SZ);
 
        /*
@@ -1482,10 +1472,8 @@ static int ahci_port_start(struct ata_port *ap)
 
 static void ahci_port_stop(struct ata_port *ap)
 {
-       struct device *dev = ap->host->dev;
        struct ahci_host_priv *hpriv = ap->host->private_data;
-       struct ahci_port_priv *pp = ap->private_data;
-       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *mmio = ap->host->iomap[AHCI_PCI_BAR];
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
        const char *emsg = NULL;
        int rc;
@@ -1494,19 +1482,13 @@ static void ahci_port_stop(struct ata_port *ap)
        rc = ahci_deinit_port(port_mmio, hpriv->cap, &emsg);
        if (rc)
                ata_port_printk(ap, KERN_WARNING, "%s (%d)\n", emsg, rc);
-
-       ap->private_data = NULL;
-       dma_free_coherent(dev, AHCI_PORT_PRIV_DMA_SZ,
-                         pp->cmd_slot, pp->cmd_slot_dma);
-       ata_pad_free(ap, dev);
-       kfree(pp);
 }
 
-static void ahci_setup_port(struct ata_ioports *port, unsigned long base,
+static void ahci_setup_port(struct ata_ioports *port, void __iomem *base,
                            unsigned int port_idx)
 {
        VPRINTK("ENTER, base==0x%lx, port_idx %u\n", base, port_idx);
-       base = ahci_port_base_ul(base, port_idx);
+       base = ahci_port_base(base, port_idx);
        VPRINTK("base now==0x%lx\n", base);
 
        port->cmd_addr          = base;
@@ -1519,7 +1501,7 @@ static int ahci_host_init(struct ata_probe_ent *probe_ent)
 {
        struct ahci_host_priv *hpriv = probe_ent->private_data;
        struct pci_dev *pdev = to_pci_dev(probe_ent->dev);
-       void __iomem *mmio = probe_ent->mmio_base;
+       void __iomem *mmio = probe_ent->iomap[AHCI_PCI_BAR];
        unsigned int i, cap_n_ports, using_dac;
        int rc;
 
@@ -1586,7 +1568,7 @@ static int ahci_host_init(struct ata_probe_ent *probe_ent)
        }
 
        for (i = 0; i < probe_ent->n_ports; i++)
-               ahci_setup_port(&probe_ent->port[i], (unsigned long) mmio, i);
+               ahci_setup_port(&probe_ent->port[i], mmio, i);
 
        ahci_init_controller(mmio, pdev, probe_ent->n_ports,
                             probe_ent->port_flags, hpriv);
@@ -1600,7 +1582,7 @@ static void ahci_print_info(struct ata_probe_ent *probe_ent)
 {
        struct ahci_host_priv *hpriv = probe_ent->private_data;
        struct pci_dev *pdev = to_pci_dev(probe_ent->dev);
-       void __iomem *mmio = probe_ent->mmio_base;
+       void __iomem *mmio = probe_ent->iomap[AHCI_PCI_BAR];
        u32 vers, cap, impl, speed;
        const char *speed_s;
        u16 cc;
@@ -1619,11 +1601,11 @@ static void ahci_print_info(struct ata_probe_ent *probe_ent)
                speed_s = "?";
 
        pci_read_config_word(pdev, 0x0a, &cc);
-       if (cc == 0x0101)
+       if (cc == PCI_CLASS_STORAGE_IDE)
                scc_s = "IDE";
-       else if (cc == 0x0106)
+       else if (cc == PCI_CLASS_STORAGE_SATA)
                scc_s = "SATA";
-       else if (cc == 0x0104)
+       else if (cc == PCI_CLASS_STORAGE_RAID)
                scc_s = "RAID";
        else
                scc_s = "unknown";
@@ -1667,15 +1649,13 @@ static void ahci_print_info(struct ata_probe_ent *probe_ent)
                );
 }
 
-static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
+static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version;
-       struct ata_probe_ent *probe_ent = NULL;
-       struct ahci_host_priv *hpriv;
-       unsigned long base;
-       void __iomem *mmio_base;
        unsigned int board_idx = (unsigned int) ent->driver_data;
-       int have_msi, pci_dev_busy = 0;
+       struct device *dev = &pdev->dev;
+       struct ata_probe_ent *probe_ent;
+       struct ahci_host_priv *hpriv;
        int rc;
 
        VPRINTK("ENTER\n");
@@ -1685,57 +1665,36 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       /* JMicron-specific fixup: make sure we're in AHCI mode */
-       /* This is protected from races with ata_jmicron by the pci probe
-          locking */
        if (pdev->vendor == PCI_VENDOR_ID_JMICRON) {
-               /* AHCI enable, AHCI on function 0 */
-               pci_write_config_byte(pdev, 0x41, 0xa1);
-               /* Function 1 is the PATA controller */
+               /* Function 1 is the PATA controller except on the 368, where
+                  we are not AHCI anyway */
                if (PCI_FUNC(pdev->devfn))
                        return -ENODEV;
        }
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
-       rc = pci_request_regions(pdev, DRV_NAME);
-       if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
-       }
+       rc = pcim_iomap_regions(pdev, 1 << AHCI_PCI_BAR, DRV_NAME);
+       if (rc == -EBUSY)
+               pcim_pin_device(pdev);
+       if (rc)
+               return rc;
 
-       if (pci_enable_msi(pdev) == 0)
-               have_msi = 1;
-       else {
+       if (pci_enable_msi(pdev))
                pci_intx(pdev, 1);
-               have_msi = 0;
-       }
 
-       probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_msi;
-       }
+       probe_ent = devm_kzalloc(dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
-       memset(probe_ent, 0, sizeof(*probe_ent));
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
 
-       mmio_base = pci_iomap(pdev, AHCI_PCI_BAR, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
-       base = (unsigned long) mmio_base;
-
-       hpriv = kmalloc(sizeof(*hpriv), GFP_KERNEL);
-       if (!hpriv) {
-               rc = -ENOMEM;
-               goto err_out_iounmap;
-       }
-       memset(hpriv, 0, sizeof(*hpriv));
+       hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
+       if (!hpriv)
+               return -ENOMEM;
 
        probe_ent->sht          = ahci_port_info[board_idx].sht;
        probe_ent->port_flags   = ahci_port_info[board_idx].flags;
@@ -1745,16 +1704,13 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 
                probe_ent->irq = pdev->irq;
                probe_ent->irq_flags = IRQF_SHARED;
-       probe_ent->mmio_base = mmio_base;
+       probe_ent->iomap = pcim_iomap_table(pdev);
        probe_ent->private_data = hpriv;
 
-       if (have_msi)
-               hpriv->flags |= AHCI_FLAG_MSI;
-
        /* initialize adapter */
        rc = ahci_host_init(probe_ent);
        if (rc)
-               goto err_out_hpriv;
+               return rc;
 
        if (!(probe_ent->port_flags & AHCI_FLAG_NO_NCQ) &&
            (hpriv->cap & HOST_CAP_NCQ))
@@ -1762,62 +1718,11 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 
        ahci_print_info(probe_ent);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
-       kfree(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
+       devm_kfree(dev, probe_ent);
        return 0;
-
-err_out_hpriv:
-       kfree(hpriv);
-err_out_iounmap:
-       pci_iounmap(pdev, mmio_base);
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_msi:
-       if (have_msi)
-               pci_disable_msi(pdev);
-       else
-               pci_intx(pdev, 0);
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
-}
-
-static void ahci_remove_one (struct pci_dev *pdev)
-{
-       struct device *dev = pci_dev_to_dev(pdev);
-       struct ata_host *host = dev_get_drvdata(dev);
-       struct ahci_host_priv *hpriv = host->private_data;
-       unsigned int i;
-       int have_msi;
-
-       for (i = 0; i < host->n_ports; i++)
-               ata_port_detach(host->ports[i]);
-
-       have_msi = hpriv->flags & AHCI_FLAG_MSI;
-       free_irq(host->irq, host);
-
-       for (i = 0; i < host->n_ports; i++) {
-               struct ata_port *ap = host->ports[i];
-
-               ata_scsi_release(ap->scsi_host);
-               scsi_host_put(ap->scsi_host);
-       }
-
-       kfree(hpriv);
-       pci_iounmap(pdev, host->mmio_base);
-       kfree(host);
-
-       if (have_msi)
-               pci_disable_msi(pdev);
-       else
-               pci_intx(pdev, 0);
-       pci_release_regions(pdev);
-       pci_disable_device(pdev);
-       dev_set_drvdata(dev, NULL);
 }
 
 static int __init ahci_init(void)
index 24af56081b5d86a4ab2ae2736cacfb5dc038d836..be66ea08da551f16fa76459510e8cc75fa65f0f1 100644 (file)
@@ -79,7 +79,7 @@ static int generic_set_mode(struct ata_port *ap, struct ata_device **unused)
 
        /* Bits 5 and 6 indicate if DMA is active on master/slave */
        if (ap->ioaddr.bmdma_addr)
-               dma_enabled = inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
+               dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
 
        for (i = 0; i < ATA_MAX_DEVICES; i++) {
                struct ata_device *dev = &ap->device[i];
@@ -138,7 +138,7 @@ static struct ata_port_operations generic_port_ops = {
        .bmdma_stop     = ata_bmdma_stop,
        .bmdma_status   = ata_bmdma_status,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .freeze         = ata_bmdma_freeze,
        .thaw           = ata_bmdma_thaw,
@@ -150,10 +150,10 @@ static struct ata_port_operations generic_port_ops = {
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int all_generic_ide;            /* Set to claim all devices */
index 47701b286f8b6e2a124392c8b8b2befe27051139..4d716c7347e70c9bf8195db78ec5377a605db57d 100644 (file)
@@ -118,7 +118,7 @@ enum {
        PIIX_80C_SEC            = (1 << 7) | (1 << 6),
 
        /* controller IDs */
-       piix_pata_33            = 0,    /* PIIX3 or 4 at 33Mhz */
+       piix_pata_33            = 0,    /* PIIX4 at 33Mhz */
        ich_pata_33             = 1,    /* ICH up to UDMA 33 only */
        ich_pata_66             = 2,    /* ICH up to 66 Mhz */
        ich_pata_100            = 3,    /* ICH up to UDMA 100 */
@@ -128,6 +128,7 @@ enum {
        ich6_sata_ahci          = 7,
        ich6m_sata_ahci         = 8,
        ich8_sata_ahci          = 9,
+       piix_pata_mwdma         = 10,   /* PIIX3 MWDMA only */
 
        /* constants for mapping table */
        P0                      = 0,  /* port 0 */
@@ -153,7 +154,6 @@ struct piix_host_priv {
 
 static int piix_init_one (struct pci_dev *pdev,
                                    const struct pci_device_id *ent);
-static void piix_host_stop(struct ata_host *host);
 static void piix_pata_error_handler(struct ata_port *ap);
 static void ich_pata_error_handler(struct ata_port *ap);
 static void piix_sata_error_handler(struct ata_port *ap);
@@ -164,7 +164,8 @@ static void ich_set_dmamode (struct ata_port *ap, struct ata_device *adev);
 static unsigned int in_module_init = 1;
 
 static const struct pci_device_id piix_pci_tbl[] = {
-#ifdef ATA_ENABLE_PATA
+       /* Intel PIIX3 for the 430HX etc */
+       { 0x8086, 0x7010, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_mwdma },
        /* Intel PIIX4 for the 430TX/440BX/MX chipset: UDMA 33 */
        /* Also PIIX4E (fn3 rev 2) and PIIX4M (fn3 rev 3) */
        { 0x8086, 0x7111, PCI_ANY_ID, PCI_ANY_ID, 0, 0, piix_pata_33 },
@@ -202,7 +203,6 @@ static const struct pci_device_id piix_pci_tbl[] = {
        /* ICH7/7-R (i945, i975) UDMA 100*/
        { 0x8086, 0x27DF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_133 },
        { 0x8086, 0x269E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich_pata_100 },
-#endif
 
        /* NOTE: The following PCI ids must be kept in sync with the
         * list in drivers/pci/quirks.c.
@@ -297,7 +297,7 @@ static const struct ata_port_operations piix_pata_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .freeze                 = ata_bmdma_freeze,
        .thaw                   = ata_bmdma_thaw,
@@ -306,10 +306,10 @@ static const struct ata_port_operations piix_pata_ops = {
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = piix_host_stop,
 };
 
 static const struct ata_port_operations ich_pata_ops = {
@@ -330,7 +330,7 @@ static const struct ata_port_operations ich_pata_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .freeze                 = ata_bmdma_freeze,
        .thaw                   = ata_bmdma_thaw,
@@ -339,10 +339,10 @@ static const struct ata_port_operations ich_pata_ops = {
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = piix_host_stop,
 };
 
 static const struct ata_port_operations piix_sata_ops = {
@@ -360,7 +360,7 @@ static const struct ata_port_operations piix_sata_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .freeze                 = ata_bmdma_freeze,
        .thaw                   = ata_bmdma_thaw,
@@ -369,10 +369,10 @@ static const struct ata_port_operations piix_sata_ops = {
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = piix_host_stop,
 };
 
 static const struct piix_map_db ich5_map_db = {
@@ -441,7 +441,7 @@ static const struct piix_map_db *piix_map_db_table[] = {
 };
 
 static struct ata_port_info piix_port_info[] = {
-       /* piix_pata_33: 0:  PIIX3 or 4 at 33MHz */
+       /* piix_pata_33: 0:  PIIX4 at 33MHz */
        {
                .sht            = &piix_sht,
                .flags          = PIIX_PATA_FLAGS,
@@ -543,6 +543,14 @@ static struct ata_port_info piix_port_info[] = {
                .port_ops       = &piix_sata_ops,
        },
 
+       /* piix_pata_mwdma: 10:  PIIX3 MWDMA only */
+       {
+               .sht            = &piix_sht,
+               .flags          = PIIX_PATA_FLAGS,
+               .pio_mask       = 0x1f, /* pio0-4 */
+               .mwdma_mask     = 0x06, /* mwdma1-2 ?? CHECK 0 should be ok but slow */
+               .port_ops       = &piix_pata_ops,
+       },
 };
 
 static struct pci_bits piix_enable_bits[] = {
@@ -569,6 +577,7 @@ struct ich_laptop {
 static const struct ich_laptop ich_laptop[] = {
        /* devid, subvendor, subdev */
        { 0x27DF, 0x0005, 0x0280 },     /* ICH7 on Acer 5602WLMi */
+       { 0x27DF, 0x1025, 0x0110 },     /* ICH7 on Acer 3682WLMi */
        /* end marker */
        { 0, }
 };
@@ -632,7 +641,7 @@ static int piix_pata_prereset(struct ata_port *ap)
 
        if (!pci_test_config_bits(pdev, &piix_enable_bits[ap->port_no]))
                return -ENOENT;
-               
+
        ap->cbl = ATA_CBL_PATA40;
        return ata_std_prereset(ap);
 }
@@ -776,7 +785,7 @@ static void do_pata_set_dmamode (struct ata_port *ap, struct ata_device *adev, i
        u16 master_data;
        u8 speed                = adev->dma_mode;
        int devid               = adev->devno + 2 * ap->port_no;
-       u8 udma_enable;
+       u8 udma_enable          = 0;
 
        static const     /* ISP  RTC */
        u8 timings[][2] = { { 0, 0 },
@@ -786,7 +795,8 @@ static void do_pata_set_dmamode (struct ata_port *ap, struct ata_device *adev, i
                            { 2, 3 }, };
 
        pci_read_config_word(dev, master_port, &master_data);
-       pci_read_config_byte(dev, 0x48, &udma_enable);
+       if (ap->udma_mask)
+               pci_read_config_byte(dev, 0x48, &udma_enable);
 
        if (speed >= XFER_UDMA_0) {
                unsigned int udma = adev->dma_mode - XFER_UDMA_0;
@@ -1059,6 +1069,7 @@ static void __devinit piix_init_sata_map(struct pci_dev *pdev,
 static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version;
+       struct device *dev = &pdev->dev;
        struct ata_port_info port_info[2];
        struct ata_port_info *ppinfo[2] = { &port_info[0], &port_info[1] };
        struct piix_host_priv *hpriv;
@@ -1072,7 +1083,7 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        if (!in_module_init)
                return -ENODEV;
 
-       hpriv = kzalloc(sizeof(*hpriv), GFP_KERNEL);
+       hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
        if (!hpriv)
                return -ENOMEM;
 
@@ -1122,15 +1133,6 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        return ata_pci_init_one(pdev, ppinfo, 2);
 }
 
-static void piix_host_stop(struct ata_host *host)
-{
-       struct piix_host_priv *hpriv = host->private_data;
-
-       ata_host_stop(host);
-
-       kfree(hpriv);
-}
-
 static int __init piix_init(void)
 {
        int rc;
index 667acd283364503c328fd4dcd7c1dbadc2ac5d85..2cf8251728d23f11d479c789b5f020dc9158da4b 100644 (file)
@@ -59,6 +59,9 @@
 
 #include "libata.h"
 
+#define DRV_VERSION    "2.10"  /* must be exactly four chars */
+
+
 /* debounce timing parameters in msecs { interval, duration, timeout } */
 const unsigned long sata_deb_timing_normal[]           = {   5,  100, 2000 };
 const unsigned long sata_deb_timing_hotplug[]          = {  25,  500, 2000 };
@@ -598,51 +601,7 @@ void ata_dev_disable(struct ata_device *dev)
 }
 
 /**
- *     ata_pio_devchk - PATA device presence detection
- *     @ap: ATA channel to examine
- *     @device: Device to examine (starting at zero)
- *
- *     This technique was originally described in
- *     Hale Landis's ATADRVR (www.ata-atapi.com), and
- *     later found its way into the ATA/ATAPI spec.
- *
- *     Write a pattern to the ATA shadow registers,
- *     and if a device is present, it will respond by
- *     correctly storing and echoing back the
- *     ATA shadow register contents.
- *
- *     LOCKING:
- *     caller.
- */
-
-static unsigned int ata_pio_devchk(struct ata_port *ap,
-                                  unsigned int device)
-{
-       struct ata_ioports *ioaddr = &ap->ioaddr;
-       u8 nsect, lbal;
-
-       ap->ops->dev_select(ap, device);
-
-       outb(0x55, ioaddr->nsect_addr);
-       outb(0xaa, ioaddr->lbal_addr);
-
-       outb(0xaa, ioaddr->nsect_addr);
-       outb(0x55, ioaddr->lbal_addr);
-
-       outb(0x55, ioaddr->nsect_addr);
-       outb(0xaa, ioaddr->lbal_addr);
-
-       nsect = inb(ioaddr->nsect_addr);
-       lbal = inb(ioaddr->lbal_addr);
-
-       if ((nsect == 0x55) && (lbal == 0xaa))
-               return 1;       /* we found a device */
-
-       return 0;               /* nothing found */
-}
-
-/**
- *     ata_mmio_devchk - PATA device presence detection
+ *     ata_devchk - PATA device presence detection
  *     @ap: ATA channel to examine
  *     @device: Device to examine (starting at zero)
  *
@@ -659,25 +618,24 @@ static unsigned int ata_pio_devchk(struct ata_port *ap,
  *     caller.
  */
 
-static unsigned int ata_mmio_devchk(struct ata_port *ap,
-                                   unsigned int device)
+static unsigned int ata_devchk(struct ata_port *ap, unsigned int device)
 {
        struct ata_ioports *ioaddr = &ap->ioaddr;
        u8 nsect, lbal;
 
        ap->ops->dev_select(ap, device);
 
-       writeb(0x55, (void __iomem *) ioaddr->nsect_addr);
-       writeb(0xaa, (void __iomem *) ioaddr->lbal_addr);
+       iowrite8(0x55, ioaddr->nsect_addr);
+       iowrite8(0xaa, ioaddr->lbal_addr);
 
-       writeb(0xaa, (void __iomem *) ioaddr->nsect_addr);
-       writeb(0x55, (void __iomem *) ioaddr->lbal_addr);
+       iowrite8(0xaa, ioaddr->nsect_addr);
+       iowrite8(0x55, ioaddr->lbal_addr);
 
-       writeb(0x55, (void __iomem *) ioaddr->nsect_addr);
-       writeb(0xaa, (void __iomem *) ioaddr->lbal_addr);
+       iowrite8(0x55, ioaddr->nsect_addr);
+       iowrite8(0xaa, ioaddr->lbal_addr);
 
-       nsect = readb((void __iomem *) ioaddr->nsect_addr);
-       lbal = readb((void __iomem *) ioaddr->lbal_addr);
+       nsect = ioread8(ioaddr->nsect_addr);
+       lbal = ioread8(ioaddr->lbal_addr);
 
        if ((nsect == 0x55) && (lbal == 0xaa))
                return 1;       /* we found a device */
@@ -685,27 +643,6 @@ static unsigned int ata_mmio_devchk(struct ata_port *ap,
        return 0;               /* nothing found */
 }
 
-/**
- *     ata_devchk - PATA device presence detection
- *     @ap: ATA channel to examine
- *     @device: Device to examine (starting at zero)
- *
- *     Dispatch ATA device presence detection, depending
- *     on whether we are using PIO or MMIO to talk to the
- *     ATA shadow registers.
- *
- *     LOCKING:
- *     caller.
- */
-
-static unsigned int ata_devchk(struct ata_port *ap,
-                                   unsigned int device)
-{
-       if (ap->flags & ATA_FLAG_MMIO)
-               return ata_mmio_devchk(ap, device);
-       return ata_pio_devchk(ap, device);
-}
-
 /**
  *     ata_dev_classify - determine device type based on ATA-spec signature
  *     @tf: ATA taskfile register set for device to be identified
@@ -923,11 +860,7 @@ void ata_std_dev_select (struct ata_port *ap, unsigned int device)
        else
                tmp = ATA_DEVICE_OBS | ATA_DEV1;
 
-       if (ap->flags & ATA_FLAG_MMIO) {
-               writeb(tmp, (void __iomem *) ap->ioaddr.device_addr);
-       } else {
-               outb(tmp, ap->ioaddr.device_addr);
-       }
+       iowrite8(tmp, ap->ioaddr.device_addr);
        ata_pause(ap);          /* needed; also flushes, for mmio */
 }
 
@@ -1156,7 +1089,7 @@ void ata_port_flush_task(struct ata_port *ap)
                ata_port_printk(ap, KERN_DEBUG, "%s: EXIT\n", __FUNCTION__);
 }
 
-void ata_qc_complete_internal(struct ata_queued_cmd *qc)
+static void ata_qc_complete_internal(struct ata_queued_cmd *qc)
 {
        struct completion *waiting = qc->private_data;
 
@@ -1249,7 +1182,6 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
                        buflen += sg[i].length;
 
                ata_sg_init(qc, sg, n_elem);
-               qc->nsect = buflen / ATA_SECT_SIZE;
                qc->nbytes = buflen;
        }
 
@@ -1292,7 +1224,7 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
        if (ap->ops->post_internal_cmd)
                ap->ops->post_internal_cmd(qc);
 
-       if (qc->flags & ATA_QCFLAG_FAILED && !qc->err_mask) {
+       if ((qc->flags & ATA_QCFLAG_FAILED) && !qc->err_mask) {
                if (ata_msg_warn(ap))
                        ata_dev_printk(dev, KERN_WARNING,
                                "zero err_mask for failed "
@@ -1478,7 +1410,16 @@ int ata_dev_read_id(struct ata_device *dev, unsigned int *p_class,
        }
 
        tf.protocol = ATA_PROT_PIO;
-       tf.flags |= ATA_TFLAG_POLLING; /* for polling presence detection */
+
+       /* Some devices choke if TF registers contain garbage.  Make
+        * sure those are properly initialized.
+        */
+       tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
+
+       /* Device presence detection is unreliable on some
+        * controllers.  Always poll IDENTIFY if available.
+        */
+       tf.flags |= ATA_TFLAG_POLLING;
 
        err_mask = ata_exec_internal(dev, &tf, NULL, DMA_FROM_DEVICE,
                                     id, sizeof(id[0]) * ATA_ID_WORDS);
@@ -1608,6 +1549,8 @@ int ata_dev_configure(struct ata_device *dev)
        const u16 *id = dev->id;
        unsigned int xfer_mask;
        char revbuf[7];         /* XYZ-99\0 */
+       char fwrevbuf[ATA_ID_FW_REV_LEN+1];
+       char modelbuf[ATA_ID_PROD_LEN+1];
        int rc;
 
        if (!ata_dev_enabled(dev) && ata_msg_info(ap)) {
@@ -1662,6 +1605,16 @@ int ata_dev_configure(struct ata_device *dev)
 
                dev->n_sectors = ata_id_n_sectors(id);
 
+               /* SCSI only uses 4-char revisions, dump full 8 chars from ATA */
+               ata_id_c_string(dev->id, fwrevbuf, ATA_ID_FW_REV,
+                               sizeof(fwrevbuf));
+
+               ata_id_c_string(dev->id, modelbuf, ATA_ID_PROD,
+                               sizeof(modelbuf));
+
+               if (dev->id[59] & 0x100)
+                       dev->multi_count = dev->id[59] & 0xff;
+
                if (ata_id_has_lba(id)) {
                        const char *lba_desc;
                        char ncq_desc[20];
@@ -1681,13 +1634,16 @@ int ata_dev_configure(struct ata_device *dev)
                        ata_dev_config_ncq(dev, ncq_desc, sizeof(ncq_desc));
 
                        /* print device info to dmesg */
-                       if (ata_msg_drv(ap) && print_info)
-                               ata_dev_printk(dev, KERN_INFO, "%s, "
-                                       "max %s, %Lu sectors: %s %s\n",
-                                       revbuf,
-                                       ata_mode_string(xfer_mask),
+                       if (ata_msg_drv(ap) && print_info) {
+                               ata_dev_printk(dev, KERN_INFO,
+                                       "%s: %s, %s, max %s\n",
+                                       revbuf, modelbuf, fwrevbuf,
+                                       ata_mode_string(xfer_mask));
+                               ata_dev_printk(dev, KERN_INFO,
+                                       "%Lu sectors, multi %u: %s %s\n",
                                        (unsigned long long)dev->n_sectors,
-                                       lba_desc, ncq_desc);
+                                       dev->multi_count, lba_desc, ncq_desc);
+                       }
                } else {
                        /* CHS */
 
@@ -1704,22 +1660,17 @@ int ata_dev_configure(struct ata_device *dev)
                        }
 
                        /* print device info to dmesg */
-                       if (ata_msg_drv(ap) && print_info)
-                               ata_dev_printk(dev, KERN_INFO, "%s, "
-                                       "max %s, %Lu sectors: CHS %u/%u/%u\n",
-                                       revbuf,
-                                       ata_mode_string(xfer_mask),
-                                       (unsigned long long)dev->n_sectors,
-                                       dev->cylinders, dev->heads,
-                                       dev->sectors);
-               }
-
-               if (dev->id[59] & 0x100) {
-                       dev->multi_count = dev->id[59] & 0xff;
-                       if (ata_msg_drv(ap) && print_info)
+                       if (ata_msg_drv(ap) && print_info) {
                                ata_dev_printk(dev, KERN_INFO,
-                                       "ata%u: dev %u multi count %u\n",
-                                       ap->id, dev->devno, dev->multi_count);
+                                       "%s: %s, %s, max %s\n",
+                                       revbuf, modelbuf, fwrevbuf,
+                                       ata_mode_string(xfer_mask));
+                               ata_dev_printk(dev, KERN_INFO, 
+                                       "%Lu sectors, multi %u, CHS %u/%u/%u\n",
+                                       (unsigned long long)dev->n_sectors,
+                                       dev->multi_count, dev->cylinders,
+                                       dev->heads, dev->sectors);
+                       }
                }
 
                dev->cdb_len = 16;
@@ -2391,6 +2342,10 @@ static int ata_dev_set_mode(struct ata_device *dev)
                dev->flags |= ATA_DFLAG_PIO;
 
        err_mask = ata_dev_set_xfermode(dev);
+       /* Old CFA may refuse this command, which is just fine */
+       if (dev->xfer_shift == ATA_SHIFT_PIO && ata_id_is_cfa(dev->id))
+               err_mask &= ~AC_ERR_DEV;
+
        if (err_mask) {
                ata_dev_printk(dev, KERN_ERR, "failed to set xfermode "
                               "(err_mask=0x%x)\n", err_mask);
@@ -2493,7 +2448,7 @@ int ata_set_mode(struct ata_port *ap, struct ata_device **r_failed_dev)
        for (i = 0; i < ATA_MAX_DEVICES; i++) {
                dev = &ap->device[i];
 
-               /* don't udpate suspended devices' xfer mode */
+               /* don't update suspended devices' xfer mode */
                if (!ata_dev_ready(dev))
                        continue;
 
@@ -2614,13 +2569,8 @@ static void ata_bus_post_reset(struct ata_port *ap, unsigned int devmask)
                u8 nsect, lbal;
 
                ap->ops->dev_select(ap, 1);
-               if (ap->flags & ATA_FLAG_MMIO) {
-                       nsect = readb((void __iomem *) ioaddr->nsect_addr);
-                       lbal = readb((void __iomem *) ioaddr->lbal_addr);
-               } else {
-                       nsect = inb(ioaddr->nsect_addr);
-                       lbal = inb(ioaddr->lbal_addr);
-               }
+               nsect = ioread8(ioaddr->nsect_addr);
+               lbal = ioread8(ioaddr->lbal_addr);
                if ((nsect == 1) && (lbal == 1))
                        break;
                if (time_after(jiffies, timeout)) {
@@ -2648,19 +2598,11 @@ static unsigned int ata_bus_softreset(struct ata_port *ap,
        DPRINTK("ata%u: bus reset via SRST\n", ap->id);
 
        /* software reset.  causes dev0 to be selected */
-       if (ap->flags & ATA_FLAG_MMIO) {
-               writeb(ap->ctl, (void __iomem *) ioaddr->ctl_addr);
-               udelay(20);     /* FIXME: flush */
-               writeb(ap->ctl | ATA_SRST, (void __iomem *) ioaddr->ctl_addr);
-               udelay(20);     /* FIXME: flush */
-               writeb(ap->ctl, (void __iomem *) ioaddr->ctl_addr);
-       } else {
-               outb(ap->ctl, ioaddr->ctl_addr);
-               udelay(10);
-               outb(ap->ctl | ATA_SRST, ioaddr->ctl_addr);
-               udelay(10);
-               outb(ap->ctl, ioaddr->ctl_addr);
-       }
+       iowrite8(ap->ctl, ioaddr->ctl_addr);
+       udelay(20);     /* FIXME: flush */
+       iowrite8(ap->ctl | ATA_SRST, ioaddr->ctl_addr);
+       udelay(20);     /* FIXME: flush */
+       iowrite8(ap->ctl, ioaddr->ctl_addr);
 
        /* spec mandates ">= 2ms" before checking status.
         * We wait 150ms, because that was the magic delay used for
@@ -2745,8 +2687,7 @@ void ata_bus_reset(struct ata_port *ap)
                ap->device[1].class = ata_dev_try_classify(ap, 1, &err);
 
        /* re-enable interrupts */
-       if (ap->ioaddr.ctl_addr)        /* FIXME: hack. create a hook instead */
-               ata_irq_on(ap);
+       ap->ops->irq_on(ap);
 
        /* is double-select really necessary? */
        if (ap->device[1].class != ATA_DEV_NONE)
@@ -2761,10 +2702,7 @@ void ata_bus_reset(struct ata_port *ap)
 
        if (ap->flags & (ATA_FLAG_SATA_RESET | ATA_FLAG_SRST)) {
                /* set up device control for ATA_FLAG_SATA_RESET */
-               if (ap->flags & ATA_FLAG_MMIO)
-                       writeb(ap->ctl, (void __iomem *) ioaddr->ctl_addr);
-               else
-                       outb(ap->ctl, ioaddr->ctl_addr);
+               iowrite8(ap->ctl, ioaddr->ctl_addr);
        }
 
        DPRINTK("EXIT\n");
@@ -3098,6 +3036,9 @@ int sata_std_hardreset(struct ata_port *ap, unsigned int *class)
                return 0;
        }
 
+       /* wait a while before checking status, see SRST for more info */
+       msleep(150);
+
        if (ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT)) {
                ata_port_printk(ap, KERN_ERR,
                                "COMRESET failed (device not ready)\n");
@@ -3138,11 +3079,8 @@ void ata_std_postreset(struct ata_port *ap, unsigned int *classes)
                sata_scr_write(ap, SCR_ERROR, serror);
 
        /* re-enable interrupts */
-       if (!ap->ops->error_handler) {
-               /* FIXME: hack. create a hook instead */
-               if (ap->ioaddr.ctl_addr)
-                       ata_irq_on(ap);
-       }
+       if (!ap->ops->error_handler)
+               ap->ops->irq_on(ap);
 
        /* is double-select really necessary? */
        if (classes[0] != ATA_DEV_NONE)
@@ -3157,12 +3095,8 @@ void ata_std_postreset(struct ata_port *ap, unsigned int *classes)
        }
 
        /* set up device control */
-       if (ap->ioaddr.ctl_addr) {
-               if (ap->flags & ATA_FLAG_MMIO)
-                       writeb(ap->ctl, (void __iomem *) ap->ioaddr.ctl_addr);
-               else
-                       outb(ap->ctl, ap->ioaddr.ctl_addr);
-       }
+       if (ap->ioaddr.ctl_addr)
+               iowrite8(ap->ctl, ap->ioaddr.ctl_addr);
 
        DPRINTK("EXIT\n");
 }
@@ -3187,7 +3121,8 @@ static int ata_dev_same_device(struct ata_device *dev, unsigned int new_class,
                               const u16 *new_id)
 {
        const u16 *old_id = dev->id;
-       unsigned char model[2][41], serial[2][21];
+       unsigned char model[2][ATA_ID_PROD_LEN + 1];
+       unsigned char serial[2][ATA_ID_SERNO_LEN + 1];
        u64 new_n_sectors;
 
        if (dev->class != new_class) {
@@ -3196,10 +3131,10 @@ static int ata_dev_same_device(struct ata_device *dev, unsigned int new_class,
                return 0;
        }
 
-       ata_id_c_string(old_id, model[0], ATA_ID_PROD_OFS, sizeof(model[0]));
-       ata_id_c_string(new_id, model[1], ATA_ID_PROD_OFS, sizeof(model[1]));
-       ata_id_c_string(old_id, serial[0], ATA_ID_SERNO_OFS, sizeof(serial[0]));
-       ata_id_c_string(new_id, serial[1], ATA_ID_SERNO_OFS, sizeof(serial[1]));
+       ata_id_c_string(old_id, model[0], ATA_ID_PROD, sizeof(model[0]));
+       ata_id_c_string(new_id, model[1], ATA_ID_PROD, sizeof(model[1]));
+       ata_id_c_string(old_id, serial[0], ATA_ID_SERNO, sizeof(serial[0]));
+       ata_id_c_string(new_id, serial[1], ATA_ID_SERNO, sizeof(serial[1]));
        new_n_sectors = ata_id_n_sectors(new_id);
 
        if (strcmp(model[0], model[1])) {
@@ -3324,37 +3259,20 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
        { }
 };
 
-static int ata_strim(char *s, size_t len)
-{
-       len = strnlen(s, len);
-
-       /* ATAPI specifies that empty space is blank-filled; remove blanks */
-       while ((len > 0) && (s[len - 1] == ' ')) {
-               len--;
-               s[len] = 0;
-       }
-       return len;
-}
-
 unsigned long ata_device_blacklisted(const struct ata_device *dev)
 {
-       unsigned char model_num[40];
-       unsigned char model_rev[16];
-       unsigned int nlen, rlen;
+       unsigned char model_num[ATA_ID_PROD_LEN + 1];
+       unsigned char model_rev[ATA_ID_FW_REV_LEN + 1];
        const struct ata_blacklist_entry *ad = ata_device_blacklist;
 
-       ata_id_string(dev->id, model_num, ATA_ID_PROD_OFS,
-                         sizeof(model_num));
-       ata_id_string(dev->id, model_rev, ATA_ID_FW_REV_OFS,
-                         sizeof(model_rev));
-       nlen = ata_strim(model_num, sizeof(model_num));
-       rlen = ata_strim(model_rev, sizeof(model_rev));
+       ata_id_c_string(dev->id, model_num, ATA_ID_PROD, sizeof(model_num));
+       ata_id_c_string(dev->id, model_rev, ATA_ID_FW_REV, sizeof(model_rev));
 
        while (ad->model_num) {
-               if (!strncmp(ad->model_num, model_num, nlen)) {
+               if (!strcmp(ad->model_num, model_num)) {
                        if (ad->model_rev == NULL)
                                return ad->horkage;
-                       if (!strncmp(ad->model_rev, model_rev, rlen))
+                       if (!strcmp(ad->model_rev, model_rev))
                                return ad->horkage;
                }
                ad++;
@@ -3894,53 +3812,7 @@ void swap_buf_le16(u16 *buf, unsigned int buf_words)
 }
 
 /**
- *     ata_mmio_data_xfer - Transfer data by MMIO
- *     @adev: device for this I/O
- *     @buf: data buffer
- *     @buflen: buffer length
- *     @write_data: read/write
- *
- *     Transfer data from/to the device data register by MMIO.
- *
- *     LOCKING:
- *     Inherited from caller.
- */
-
-void ata_mmio_data_xfer(struct ata_device *adev, unsigned char *buf,
-                       unsigned int buflen, int write_data)
-{
-       struct ata_port *ap = adev->ap;
-       unsigned int i;
-       unsigned int words = buflen >> 1;
-       u16 *buf16 = (u16 *) buf;
-       void __iomem *mmio = (void __iomem *)ap->ioaddr.data_addr;
-
-       /* Transfer multiple of 2 bytes */
-       if (write_data) {
-               for (i = 0; i < words; i++)
-                       writew(le16_to_cpu(buf16[i]), mmio);
-       } else {
-               for (i = 0; i < words; i++)
-                       buf16[i] = cpu_to_le16(readw(mmio));
-       }
-
-       /* Transfer trailing 1 byte, if any. */
-       if (unlikely(buflen & 0x01)) {
-               u16 align_buf[1] = { 0 };
-               unsigned char *trailing_buf = buf + buflen - 1;
-
-               if (write_data) {
-                       memcpy(align_buf, trailing_buf, 1);
-                       writew(le16_to_cpu(align_buf[0]), mmio);
-               } else {
-                       align_buf[0] = cpu_to_le16(readw(mmio));
-                       memcpy(trailing_buf, align_buf, 1);
-               }
-       }
-}
-
-/**
- *     ata_pio_data_xfer - Transfer data by PIO
+ *     ata_data_xfer - Transfer data by PIO
  *     @adev: device to target
  *     @buf: data buffer
  *     @buflen: buffer length
@@ -3951,18 +3823,17 @@ void ata_mmio_data_xfer(struct ata_device *adev, unsigned char *buf,
  *     LOCKING:
  *     Inherited from caller.
  */
-
-void ata_pio_data_xfer(struct ata_device *adev, unsigned char *buf,
-                      unsigned int buflen, int write_data)
+void ata_data_xfer(struct ata_device *adev, unsigned char *buf,
+                  unsigned int buflen, int write_data)
 {
        struct ata_port *ap = adev->ap;
        unsigned int words = buflen >> 1;
 
        /* Transfer multiple of 2 bytes */
        if (write_data)
-               outsw(ap->ioaddr.data_addr, buf, words);
+               iowrite16_rep(ap->ioaddr.data_addr, buf, words);
        else
-               insw(ap->ioaddr.data_addr, buf, words);
+               ioread16_rep(ap->ioaddr.data_addr, buf, words);
 
        /* Transfer trailing 1 byte, if any. */
        if (unlikely(buflen & 0x01)) {
@@ -3971,16 +3842,16 @@ void ata_pio_data_xfer(struct ata_device *adev, unsigned char *buf,
 
                if (write_data) {
                        memcpy(align_buf, trailing_buf, 1);
-                       outw(le16_to_cpu(align_buf[0]), ap->ioaddr.data_addr);
+                       iowrite16(le16_to_cpu(align_buf[0]), ap->ioaddr.data_addr);
                } else {
-                       align_buf[0] = cpu_to_le16(inw(ap->ioaddr.data_addr));
+                       align_buf[0] = cpu_to_le16(ioread16(ap->ioaddr.data_addr));
                        memcpy(trailing_buf, align_buf, 1);
                }
        }
 }
 
 /**
- *     ata_pio_data_xfer_noirq - Transfer data by PIO
+ *     ata_data_xfer_noirq - Transfer data by PIO
  *     @adev: device to target
  *     @buf: data buffer
  *     @buflen: buffer length
@@ -3992,13 +3863,12 @@ void ata_pio_data_xfer(struct ata_device *adev, unsigned char *buf,
  *     LOCKING:
  *     Inherited from caller.
  */
-
-void ata_pio_data_xfer_noirq(struct ata_device *adev, unsigned char *buf,
-                                   unsigned int buflen, int write_data)
+void ata_data_xfer_noirq(struct ata_device *adev, unsigned char *buf,
+                        unsigned int buflen, int write_data)
 {
        unsigned long flags;
        local_irq_save(flags);
-       ata_pio_data_xfer(adev, buf, buflen, write_data);
+       ata_data_xfer(adev, buf, buflen, write_data);
        local_irq_restore(flags);
 }
 
@@ -4022,11 +3892,11 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
        unsigned int offset;
        unsigned char *buf;
 
-       if (qc->cursect == (qc->nsect - 1))
+       if (qc->curbytes == qc->nbytes - ATA_SECT_SIZE)
                ap->hsm_task_state = HSM_ST_LAST;
 
        page = sg[qc->cursg].page;
-       offset = sg[qc->cursg].offset + qc->cursg_ofs * ATA_SECT_SIZE;
+       offset = sg[qc->cursg].offset + qc->cursg_ofs;
 
        /* get the current page and offset */
        page = nth_page(page, (offset >> PAGE_SHIFT));
@@ -4051,10 +3921,10 @@ static void ata_pio_sector(struct ata_queued_cmd *qc)
                ap->ops->data_xfer(qc->dev, buf + offset, ATA_SECT_SIZE, do_write);
        }
 
-       qc->cursect++;
-       qc->cursg_ofs++;
+       qc->curbytes += ATA_SECT_SIZE;
+       qc->cursg_ofs += ATA_SECT_SIZE;
 
-       if ((qc->cursg_ofs * ATA_SECT_SIZE) == (&sg[qc->cursg])->length) {
+       if (qc->cursg_ofs == (&sg[qc->cursg])->length) {
                qc->cursg++;
                qc->cursg_ofs = 0;
        }
@@ -4079,7 +3949,8 @@ static void ata_pio_sectors(struct ata_queued_cmd *qc)
 
                WARN_ON(qc->dev->multi_count == 0);
 
-               nsect = min(qc->nsect - qc->cursect, qc->dev->multi_count);
+               nsect = min((qc->nbytes - qc->curbytes) / ATA_SECT_SIZE,
+                           qc->dev->multi_count);
                while (nsect--)
                        ata_pio_sector(qc);
        } else
@@ -4320,7 +4191,7 @@ static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq)
                        qc = ata_qc_from_tag(ap, qc->tag);
                        if (qc) {
                                if (likely(!(qc->err_mask & AC_ERR_HSM))) {
-                                       ata_irq_on(ap);
+                                       ap->ops->irq_on(ap);
                                        ata_qc_complete(qc);
                                } else
                                        ata_port_freeze(ap);
@@ -4336,7 +4207,7 @@ static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq)
        } else {
                if (in_wq) {
                        spin_lock_irqsave(ap->lock, flags);
-                       ata_irq_on(ap);
+                       ap->ops->irq_on(ap);
                        ata_qc_complete(qc);
                        spin_unlock_irqrestore(ap->lock, flags);
                } else
@@ -5161,7 +5032,7 @@ idle_irq:
 
 #ifdef ATA_IRQ_TRAP
        if ((ap->stats.idle_irq % 1000) == 0) {
-               ata_irq_ack(ap, 0); /* debug trap */
+               ap->ops->irq_ack(ap, 0); /* debug trap */
                ata_port_printk(ap, KERN_WARNING, "irq trap\n");
                return 1;
        }
@@ -5502,54 +5373,25 @@ void ata_host_resume(struct ata_host *host)
  *     LOCKING:
  *     Inherited from caller.
  */
-
-int ata_port_start (struct ata_port *ap)
+int ata_port_start(struct ata_port *ap)
 {
        struct device *dev = ap->dev;
        int rc;
 
-       ap->prd = dma_alloc_coherent(dev, ATA_PRD_TBL_SZ, &ap->prd_dma, GFP_KERNEL);
+       ap->prd = dmam_alloc_coherent(dev, ATA_PRD_TBL_SZ, &ap->prd_dma,
+                                     GFP_KERNEL);
        if (!ap->prd)
                return -ENOMEM;
 
        rc = ata_pad_alloc(ap, dev);
-       if (rc) {
-               dma_free_coherent(dev, ATA_PRD_TBL_SZ, ap->prd, ap->prd_dma);
+       if (rc)
                return rc;
-       }
-
-       DPRINTK("prd alloc, virt %p, dma %llx\n", ap->prd, (unsigned long long) ap->prd_dma);
 
+       DPRINTK("prd alloc, virt %p, dma %llx\n", ap->prd,
+               (unsigned long long)ap->prd_dma);
        return 0;
 }
 
-
-/**
- *     ata_port_stop - Undo ata_port_start()
- *     @ap: Port to shut down
- *
- *     Frees the PRD table.
- *
- *     May be used as the port_stop() entry in ata_port_operations.
- *
- *     LOCKING:
- *     Inherited from caller.
- */
-
-void ata_port_stop (struct ata_port *ap)
-{
-       struct device *dev = ap->dev;
-
-       dma_free_coherent(dev, ATA_PRD_TBL_SZ, ap->prd, ap->prd_dma);
-       ata_pad_free(ap, dev);
-}
-
-void ata_host_stop (struct ata_host *host)
-{
-       if (host->mmio_base)
-               iounmap(host->mmio_base);
-}
-
 /**
  *     ata_dev_init - Initialize an ata_device structure
  *     @dev: Device structure to initialize
@@ -5723,6 +5565,27 @@ static struct ata_port * ata_port_add(const struct ata_probe_ent *ent,
        return ap;
 }
 
+static void ata_host_release(struct device *gendev, void *res)
+{
+       struct ata_host *host = dev_get_drvdata(gendev);
+       int i;
+
+       for (i = 0; i < host->n_ports; i++) {
+               struct ata_port *ap = host->ports[i];
+
+               if (!ap)
+                       continue;
+
+               if (ap->ops->port_stop)
+                       ap->ops->port_stop(ap);
+
+               scsi_host_put(ap->scsi_host);
+       }
+
+       if (host->ops->host_stop)
+               host->ops->host_stop(host);
+}
+
 /**
  *     ata_sas_host_init - Initialize a host struct
  *     @host:  host to initialize
@@ -5770,22 +5633,28 @@ int ata_device_add(const struct ata_probe_ent *ent)
        int rc;
 
        DPRINTK("ENTER\n");
-       
+
        if (ent->irq == 0) {
                dev_printk(KERN_ERR, dev, "is not available: No interrupt assigned.\n");
                return 0;
        }
+
+       if (!devres_open_group(dev, ata_device_add, GFP_KERNEL))
+               return 0;
+
        /* alloc a container for our list of ATA ports (buses) */
-       host = kzalloc(sizeof(struct ata_host) +
-                      (ent->n_ports * sizeof(void *)), GFP_KERNEL);
+       host = devres_alloc(ata_host_release, sizeof(struct ata_host) +
+                           (ent->n_ports * sizeof(void *)), GFP_KERNEL);
        if (!host)
-               return 0;
+               goto err_out;
+       devres_add(dev, host);
+       dev_set_drvdata(dev, host);
 
        ata_host_init(host, dev, ent->_host_flags, ent->port_ops);
        host->n_ports = ent->n_ports;
        host->irq = ent->irq;
        host->irq2 = ent->irq2;
-       host->mmio_base = ent->mmio_base;
+       host->iomap = ent->iomap;
        host->private_data = ent->private_data;
 
        /* register each port bound to this device */
@@ -5823,8 +5692,8 @@ int ata_device_add(const struct ata_probe_ent *ent)
                                (ap->pio_mask << ATA_SHIFT_PIO);
 
                /* print per-port info to dmesg */
-               ata_port_printk(ap, KERN_INFO, "%cATA max %s cmd 0x%lX "
-                               "ctl 0x%lX bmdma 0x%lX irq %d\n",
+               ata_port_printk(ap, KERN_INFO, "%cATA max %s cmd 0x%p "
+                               "ctl 0x%p bmdma 0x%p irq %d\n",
                                ap->flags & ATA_FLAG_SATA ? 'S' : 'P',
                                ata_mode_string(xfer_mode_mask),
                                ap->ioaddr.cmd_addr,
@@ -5837,8 +5706,8 @@ int ata_device_add(const struct ata_probe_ent *ent)
        }
 
        /* obtain irq, that may be shared between channels */
-       rc = request_irq(ent->irq, ent->port_ops->irq_handler, ent->irq_flags,
-                        DRV_NAME, host);
+       rc = devm_request_irq(dev, ent->irq, ent->port_ops->irq_handler,
+                             ent->irq_flags, DRV_NAME, host);
        if (rc) {
                dev_printk(KERN_ERR, dev, "irq %lu request failed: %d\n",
                           ent->irq, rc);
@@ -5851,15 +5720,19 @@ int ata_device_add(const struct ata_probe_ent *ent)
                   so trap it now */
                BUG_ON(ent->irq == ent->irq2);
 
-               rc = request_irq(ent->irq2, ent->port_ops->irq_handler, ent->irq_flags,
-                        DRV_NAME, host);
+               rc = devm_request_irq(dev, ent->irq2,
+                               ent->port_ops->irq_handler, ent->irq_flags,
+                               DRV_NAME, host);
                if (rc) {
                        dev_printk(KERN_ERR, dev, "irq %lu request failed: %d\n",
                                   ent->irq2, rc);
-                       goto err_out_free_irq;
+                       goto err_out;
                }
        }
 
+       /* resource acquisition complete */
+       devres_remove_group(dev, ata_device_add);
+
        /* perform each probe synchronously */
        DPRINTK("probe begin\n");
        for (i = 0; i < host->n_ports; i++) {
@@ -5928,24 +5801,13 @@ int ata_device_add(const struct ata_probe_ent *ent)
                ata_scsi_scan_host(ap);
        }
 
-       dev_set_drvdata(dev, host);
-
        VPRINTK("EXIT, returning %u\n", ent->n_ports);
        return ent->n_ports; /* success */
 
-err_out_free_irq:
-       free_irq(ent->irq, host);
-err_out:
-       for (i = 0; i < host->n_ports; i++) {
-               struct ata_port *ap = host->ports[i];
-               if (ap) {
-                       ap->ops->port_stop(ap);
-                       scsi_host_put(ap->scsi_host);
-               }
-       }
-
-       kfree(host);
-       VPRINTK("EXIT, returning 0\n");
+ err_out:
+       devres_release_group(dev, ata_device_add);
+       dev_set_drvdata(dev, NULL);
+       VPRINTK("EXIT, returning %d\n", rc);
        return 0;
 }
 
@@ -6008,76 +5870,20 @@ void ata_port_detach(struct ata_port *ap)
 }
 
 /**
- *     ata_host_remove - PCI layer callback for device removal
- *     @host: ATA host set that was removed
+ *     ata_host_detach - Detach all ports of an ATA host
+ *     @host: Host to detach
  *
- *     Unregister all objects associated with this host set. Free those
- *     objects.
+ *     Detach all ports of @host.
  *
  *     LOCKING:
- *     Inherited from calling layer (may sleep).
+ *     Kernel thread context (may sleep).
  */
-
-void ata_host_remove(struct ata_host *host)
+void ata_host_detach(struct ata_host *host)
 {
-       unsigned int i;
+       int i;
 
        for (i = 0; i < host->n_ports; i++)
                ata_port_detach(host->ports[i]);
-
-       free_irq(host->irq, host);
-       if (host->irq2)
-               free_irq(host->irq2, host);
-
-       for (i = 0; i < host->n_ports; i++) {
-               struct ata_port *ap = host->ports[i];
-
-               ata_scsi_release(ap->scsi_host);
-
-               if ((ap->flags & ATA_FLAG_NO_LEGACY) == 0) {
-                       struct ata_ioports *ioaddr = &ap->ioaddr;
-
-                       /* FIXME: Add -ac IDE pci mods to remove these special cases */
-                       if (ioaddr->cmd_addr == ATA_PRIMARY_CMD)
-                               release_region(ATA_PRIMARY_CMD, 8);
-                       else if (ioaddr->cmd_addr == ATA_SECONDARY_CMD)
-                               release_region(ATA_SECONDARY_CMD, 8);
-               }
-
-               scsi_host_put(ap->scsi_host);
-       }
-
-       if (host->ops->host_stop)
-               host->ops->host_stop(host);
-
-       kfree(host);
-}
-
-/**
- *     ata_scsi_release - SCSI layer callback hook for host unload
- *     @shost: libata host to be unloaded
- *
- *     Performs all duties necessary to shut down a libata port...
- *     Kill port kthread, disable port, and release resources.
- *
- *     LOCKING:
- *     Inherited from SCSI layer.
- *
- *     RETURNS:
- *     One.
- */
-
-int ata_scsi_release(struct Scsi_Host *shost)
-{
-       struct ata_port *ap = ata_shost_to_port(shost);
-
-       DPRINTK("ENTER\n");
-
-       ap->ops->port_disable(ap);
-       ap->ops->port_stop(ap);
-
-       DPRINTK("EXIT\n");
-       return 1;
 }
 
 struct ata_probe_ent *
@@ -6085,7 +5891,11 @@ ata_probe_ent_alloc(struct device *dev, const struct ata_port_info *port)
 {
        struct ata_probe_ent *probe_ent;
 
-       probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
+       /* XXX - the following if can go away once all LLDs are managed */
+       if (!list_empty(&dev->devres_head))
+               probe_ent = devm_kzalloc(dev, sizeof(*probe_ent), GFP_KERNEL);
+       else
+               probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
        if (!probe_ent) {
                printk(KERN_ERR DRV_NAME "(%s): out of memory\n",
                       kobject_name(&(dev->kobj)));
@@ -6135,37 +5945,23 @@ void ata_std_ports(struct ata_ioports *ioaddr)
 
 #ifdef CONFIG_PCI
 
-void ata_pci_host_stop (struct ata_host *host)
-{
-       struct pci_dev *pdev = to_pci_dev(host->dev);
-
-       pci_iounmap(pdev, host->mmio_base);
-}
-
 /**
  *     ata_pci_remove_one - PCI layer callback for device removal
  *     @pdev: PCI device that was removed
  *
- *     PCI layer indicates to libata via this hook that
- *     hot-unplug or module unload event has occurred.
- *     Handle this by unregistering all objects associated
- *     with this PCI device.  Free those objects.  Then finally
- *     release PCI resources and disable device.
+ *     PCI layer indicates to libata via this hook that hot-unplug or
+ *     module unload event has occurred.  Detach all ports.  Resource
+ *     release is handled via devres.
  *
  *     LOCKING:
  *     Inherited from PCI layer (may sleep).
  */
-
-void ata_pci_remove_one (struct pci_dev *pdev)
+void ata_pci_remove_one(struct pci_dev *pdev)
 {
        struct device *dev = pci_dev_to_dev(pdev);
        struct ata_host *host = dev_get_drvdata(dev);
 
-       ata_host_remove(host);
-
-       pci_release_regions(pdev);
-       pci_disable_device(pdev);
-       dev_set_drvdata(dev, NULL);
+       ata_host_detach(host);
 }
 
 /* move to PCI subsystem */
@@ -6212,12 +6008,22 @@ void ata_pci_device_do_suspend(struct pci_dev *pdev, pm_message_t mesg)
        }
 }
 
-void ata_pci_device_do_resume(struct pci_dev *pdev)
+int ata_pci_device_do_resume(struct pci_dev *pdev)
 {
+       int rc;
+
        pci_set_power_state(pdev, PCI_D0);
        pci_restore_state(pdev);
-       pci_enable_device(pdev);
+
+       rc = pcim_enable_device(pdev);
+       if (rc) {
+               dev_printk(KERN_ERR, &pdev->dev,
+                          "failed to enable device after resume (%d)\n", rc);
+               return rc;
+       }
+
        pci_set_master(pdev);
+       return 0;
 }
 
 int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg)
@@ -6237,10 +6043,12 @@ int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg)
 int ata_pci_device_resume(struct pci_dev *pdev)
 {
        struct ata_host *host = dev_get_drvdata(&pdev->dev);
+       int rc;
 
-       ata_pci_device_do_resume(pdev);
-       ata_host_resume(host);
-       return 0;
+       rc = ata_pci_device_do_resume(pdev);
+       if (rc == 0)
+               ata_host_resume(host);
+       return rc;
 }
 #endif /* CONFIG_PCI */
 
@@ -6386,8 +6194,7 @@ EXPORT_SYMBOL_GPL(ata_std_bios_param);
 EXPORT_SYMBOL_GPL(ata_std_ports);
 EXPORT_SYMBOL_GPL(ata_host_init);
 EXPORT_SYMBOL_GPL(ata_device_add);
-EXPORT_SYMBOL_GPL(ata_port_detach);
-EXPORT_SYMBOL_GPL(ata_host_remove);
+EXPORT_SYMBOL_GPL(ata_host_detach);
 EXPORT_SYMBOL_GPL(ata_sg_init);
 EXPORT_SYMBOL_GPL(ata_sg_init_one);
 EXPORT_SYMBOL_GPL(ata_hsm_move);
@@ -6404,12 +6211,9 @@ EXPORT_SYMBOL_GPL(ata_check_status);
 EXPORT_SYMBOL_GPL(ata_altstatus);
 EXPORT_SYMBOL_GPL(ata_exec_command);
 EXPORT_SYMBOL_GPL(ata_port_start);
-EXPORT_SYMBOL_GPL(ata_port_stop);
-EXPORT_SYMBOL_GPL(ata_host_stop);
 EXPORT_SYMBOL_GPL(ata_interrupt);
-EXPORT_SYMBOL_GPL(ata_mmio_data_xfer);
-EXPORT_SYMBOL_GPL(ata_pio_data_xfer);
-EXPORT_SYMBOL_GPL(ata_pio_data_xfer_noirq);
+EXPORT_SYMBOL_GPL(ata_data_xfer);
+EXPORT_SYMBOL_GPL(ata_data_xfer_noirq);
 EXPORT_SYMBOL_GPL(ata_qc_prep);
 EXPORT_SYMBOL_GPL(ata_noop_qc_prep);
 EXPORT_SYMBOL_GPL(ata_bmdma_setup);
@@ -6446,7 +6250,6 @@ EXPORT_SYMBOL_GPL(ata_scsi_queuecmd);
 EXPORT_SYMBOL_GPL(ata_scsi_slave_config);
 EXPORT_SYMBOL_GPL(ata_scsi_slave_destroy);
 EXPORT_SYMBOL_GPL(ata_scsi_change_queue_depth);
-EXPORT_SYMBOL_GPL(ata_scsi_release);
 EXPORT_SYMBOL_GPL(ata_host_intr);
 EXPORT_SYMBOL_GPL(sata_scr_valid);
 EXPORT_SYMBOL_GPL(sata_scr_read);
@@ -6467,7 +6270,6 @@ EXPORT_SYMBOL_GPL(ata_timing_merge);
 
 #ifdef CONFIG_PCI
 EXPORT_SYMBOL_GPL(pci_test_config_bits);
-EXPORT_SYMBOL_GPL(ata_pci_host_stop);
 EXPORT_SYMBOL_GPL(ata_pci_init_native_mode);
 EXPORT_SYMBOL_GPL(ata_pci_init_one);
 EXPORT_SYMBOL_GPL(ata_pci_remove_one);
@@ -6491,3 +6293,7 @@ EXPORT_SYMBOL_GPL(ata_eh_thaw_port);
 EXPORT_SYMBOL_GPL(ata_eh_qc_complete);
 EXPORT_SYMBOL_GPL(ata_eh_qc_retry);
 EXPORT_SYMBOL_GPL(ata_do_eh);
+EXPORT_SYMBOL_GPL(ata_irq_on);
+EXPORT_SYMBOL_GPL(ata_dummy_irq_on);
+EXPORT_SYMBOL_GPL(ata_irq_ack);
+EXPORT_SYMBOL_GPL(ata_dummy_irq_ack);
index 748435807d689cbc8ac3aa511576dc87e656b427..52c85af7fe9912492cd9353a4d92f78e3a600e9c 100644 (file)
@@ -1443,15 +1443,10 @@ static void ata_eh_report(struct ata_port *ap)
                };
                struct ata_queued_cmd *qc = __ata_qc_from_tag(ap, tag);
                struct ata_taskfile *cmd = &qc->tf, *res = &qc->result_tf;
-               unsigned int nbytes;
 
                if (!(qc->flags & ATA_QCFLAG_FAILED) || !qc->err_mask)
                        continue;
 
-               nbytes = qc->nbytes;
-               if (!nbytes)
-                       nbytes = qc->nsect << 9;
-
                ata_dev_printk(qc->dev, KERN_ERR,
                        "cmd %02x/%02x:%02x:%02x:%02x:%02x/%02x:%02x:%02x:%02x:%02x/%02x "
                        "tag %d cdb 0x%x data %u %s\n         "
@@ -1461,7 +1456,7 @@ static void ata_eh_report(struct ata_port *ap)
                        cmd->lbal, cmd->lbam, cmd->lbah,
                        cmd->hob_feature, cmd->hob_nsect,
                        cmd->hob_lbal, cmd->hob_lbam, cmd->hob_lbah,
-                       cmd->device, qc->tag, qc->cdb[0], nbytes,
+                       cmd->device, qc->tag, qc->cdb[0], qc->nbytes,
                        dma_str[qc->dma_dir],
                        res->command, res->feature, res->nsect,
                        res->lbal, res->lbam, res->lbah,
index 73902d335767b4a8404d2e5b7fb1b3503ddd9798..0009818a4306e7fb5e18c717f81d57256ebda337 100644 (file)
@@ -148,6 +148,45 @@ int ata_std_bios_param(struct scsi_device *sdev, struct block_device *bdev,
        return 0;
 }
 
+/**
+ *     ata_get_identity - Handler for HDIO_GET_IDENTITY ioctl
+ *     @sdev: SCSI device to get identify data for
+ *     @arg: User buffer area for identify data
+ *
+ *     LOCKING:
+ *     Defined by the SCSI layer.  We don't really care.
+ *
+ *     RETURNS:
+ *     Zero on success, negative errno on error.
+ */
+static int ata_get_identity(struct scsi_device *sdev, void __user *arg)
+{
+       struct ata_port *ap = ata_shost_to_port(sdev->host);
+       struct ata_device *dev = ata_scsi_find_dev(ap, sdev);
+       u16 __user *dst = arg;
+       char buf[40];
+
+       if (!dev)
+               return -ENOMSG;
+
+       if (copy_to_user(dst, dev->id, ATA_ID_WORDS * sizeof(u16)))
+               return -EFAULT;
+
+       ata_id_string(dev->id, buf, ATA_ID_PROD, ATA_ID_PROD_LEN);
+       if (copy_to_user(dst + ATA_ID_PROD, buf, ATA_ID_PROD_LEN))
+               return -EFAULT;
+
+       ata_id_string(dev->id, buf, ATA_ID_FW_REV, ATA_ID_FW_REV_LEN);
+       if (copy_to_user(dst + ATA_ID_FW_REV, buf, ATA_ID_FW_REV_LEN))
+               return -EFAULT;
+
+       ata_id_string(dev->id, buf, ATA_ID_SERNO, ATA_ID_SERNO_LEN);
+       if (copy_to_user(dst + ATA_ID_SERNO, buf, ATA_ID_SERNO_LEN))
+               return -EFAULT;
+
+       return 0;
+}
+
 /**
  *     ata_cmd_ioctl - Handler for HDIO_DRIVE_CMD ioctl
  *     @scsidev: Device to which we are issuing command
@@ -159,7 +198,6 @@ int ata_std_bios_param(struct scsi_device *sdev, struct block_device *bdev,
  *     RETURNS:
  *     Zero on success, negative errno on error.
  */
-
 int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
 {
        int rc = 0;
@@ -359,6 +397,9 @@ int ata_scsi_ioctl(struct scsi_device *scsidev, int cmd, void __user *arg)
                        return -EINVAL;
                return 0;
 
+       case HDIO_GET_IDENTITY:
+               return ata_get_identity(scsidev, arg);
+
        case HDIO_DRIVE_CMD:
                if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
                        return -EACCES;
@@ -397,9 +438,9 @@ int ata_scsi_ioctl(struct scsi_device *scsidev, int cmd, void __user *arg)
  *     RETURNS:
  *     Command allocated, or %NULL if none available.
  */
-struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev,
-                                      struct scsi_cmnd *cmd,
-                                      void (*done)(struct scsi_cmnd *))
+static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev,
+                                             struct scsi_cmnd *cmd,
+                                             void (*done)(struct scsi_cmnd *))
 {
        struct ata_queued_cmd *qc;
 
@@ -435,7 +476,7 @@ struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev,
  *     LOCKING:
  *     inherited from caller
  */
-void ata_dump_status(unsigned id, struct ata_taskfile *tf)
+static void ata_dump_status(unsigned id, struct ata_taskfile *tf)
 {
        u8 stat = tf->command, err = tf->feature;
 
@@ -610,8 +651,8 @@ int ata_scsi_device_resume(struct scsi_device *sdev)
  *     LOCKING:
  *     spin_lock_irqsave(host lock)
  */
-void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk, u8 *asc,
-                       u8 *ascq, int verbose)
+static void ata_to_sense_error(unsigned id, u8 drv_stat, u8 drv_err, u8 *sk,
+                              u8 *asc, u8 *ascq, int verbose)
 {
        int i;
 
@@ -1359,7 +1400,7 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc)
                goto nothing_to_do;
 
        qc->flags |= ATA_QCFLAG_IO;
-       qc->nsect = n_block;
+       qc->nbytes = n_block * ATA_SECT_SIZE;
 
        rc = ata_build_rw_tf(&qc->tf, qc->dev, block, n_block, tf_flags,
                             qc->tag);
@@ -1698,8 +1739,8 @@ unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf,
 
        if (buflen > 35) {
                memcpy(&rbuf[8], "ATA     ", 8);
-               ata_id_string(args->id, &rbuf[16], ATA_ID_PROD_OFS, 16);
-               ata_id_string(args->id, &rbuf[32], ATA_ID_FW_REV_OFS, 4);
+               ata_id_string(args->id, &rbuf[16], ATA_ID_PROD, 16);
+               ata_id_string(args->id, &rbuf[32], ATA_ID_FW_REV, 4);
                if (rbuf[32] == 0 || rbuf[32] == ' ')
                        memcpy(&rbuf[32], "n/a ", 4);
        }
@@ -1768,13 +1809,13 @@ unsigned int ata_scsiop_inq_80(struct ata_scsi_args *args, u8 *rbuf,
                0,
                0x80,                   /* this page code */
                0,
-               ATA_SERNO_LEN,          /* page len */
+               ATA_ID_SERNO_LEN,       /* page len */
        };
        memcpy(rbuf, hdr, sizeof(hdr));
 
-       if (buflen > (ATA_SERNO_LEN + 4 - 1))
+       if (buflen > (ATA_ID_SERNO_LEN + 4 - 1))
                ata_id_string(args->id, (unsigned char *) &rbuf[4],
-                             ATA_ID_SERNO_OFS, ATA_SERNO_LEN);
+                             ATA_ID_SERNO, ATA_ID_SERNO_LEN);
 
        return 0;
 }
@@ -1799,19 +1840,18 @@ unsigned int ata_scsiop_inq_83(struct ata_scsi_args *args, u8 *rbuf,
 {
        int num;
        const int sat_model_serial_desc_len = 68;
-       const int ata_model_byte_len = 40;
 
        rbuf[1] = 0x83;                 /* this page code */
        num = 4;
 
-       if (buflen > (ATA_SERNO_LEN + num + 3)) {
+       if (buflen > (ATA_ID_SERNO_LEN + num + 3)) {
                /* piv=0, assoc=lu, code_set=ACSII, designator=vendor */
                rbuf[num + 0] = 2;
-               rbuf[num + 3] = ATA_SERNO_LEN;
+               rbuf[num + 3] = ATA_ID_SERNO_LEN;
                num += 4;
                ata_id_string(args->id, (unsigned char *) rbuf + num,
-                             ATA_ID_SERNO_OFS, ATA_SERNO_LEN);
-               num += ATA_SERNO_LEN;
+                             ATA_ID_SERNO, ATA_ID_SERNO_LEN);
+               num += ATA_ID_SERNO_LEN;
        }
        if (buflen > (sat_model_serial_desc_len + num + 3)) {
                /* SAT defined lu model and serial numbers descriptor */
@@ -1823,11 +1863,11 @@ unsigned int ata_scsiop_inq_83(struct ata_scsi_args *args, u8 *rbuf,
                memcpy(rbuf + num, "ATA     ", 8);
                num += 8;
                ata_id_string(args->id, (unsigned char *) rbuf + num,
-                             ATA_ID_PROD_OFS, ata_model_byte_len);
-               num += ata_model_byte_len;
+                             ATA_ID_PROD, ATA_ID_PROD_LEN);
+               num += ATA_ID_PROD_LEN;
                ata_id_string(args->id, (unsigned char *) rbuf + num,
-                             ATA_ID_SERNO_OFS, ATA_SERNO_LEN);
-               num += ATA_SERNO_LEN;
+                             ATA_ID_SERNO, ATA_ID_SERNO_LEN);
+               num += ATA_ID_SERNO_LEN;
        }
        rbuf[3] = num - 4;    /* page len (assume less than 256 bytes) */
        return 0;
@@ -1955,15 +1995,15 @@ static unsigned int ata_msense_rw_recovery(u8 **ptr_io, const u8 *last)
  */
 static int ata_dev_supports_fua(u16 *id)
 {
-       unsigned char model[41], fw[9];
+       unsigned char model[ATA_ID_PROD_LEN + 1], fw[ATA_ID_FW_REV_LEN + 1];
 
        if (!libata_fua)
                return 0;
        if (!ata_id_has_fua(id))
                return 0;
 
-       ata_id_c_string(id, model, ATA_ID_PROD_OFS, sizeof(model));
-       ata_id_c_string(id, fw, ATA_ID_FW_REV_OFS, sizeof(fw));
+       ata_id_c_string(id, model, ATA_ID_PROD, sizeof(model));
+       ata_id_c_string(id, fw, ATA_ID_FW_REV, sizeof(fw));
 
        if (strcmp(model, "Maxtor"))
                return 1;
@@ -2661,7 +2701,7 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc)
         * TODO: find out if we need to do more here to
         *       cover scatter/gather case.
         */
-       qc->nsect = scmd->request_bufflen / ATA_SECT_SIZE;
+       qc->nbytes = scmd->request_bufflen;
 
        /* request result TF */
        qc->flags |= ATA_QCFLAG_RESULT_TF;
@@ -3059,7 +3099,8 @@ void ata_scsi_hotplug(struct work_struct *work)
        for (i = 0; i < ATA_MAX_DEVICES; i++) {
                struct ata_device *dev = &ap->device[i];
                if (ata_dev_enabled(dev) && !dev->sdev) {
-                       queue_delayed_work(ata_aux_wq, &ap->hotplug_task, HZ);
+                       queue_delayed_work(ata_aux_wq, &ap->hotplug_task,
+                               round_jiffies_relative(HZ));
                        break;
                }
        }
@@ -3264,7 +3305,8 @@ EXPORT_SYMBOL_GPL(ata_sas_port_init);
 
 void ata_sas_port_destroy(struct ata_port *ap)
 {
-       ap->ops->port_stop(ap);
+       if (ap->ops->port_stop)
+               ap->ops->port_stop(ap);
        kfree(ap);
 }
 EXPORT_SYMBOL_GPL(ata_sas_port_destroy);
index 12c88c588039d4224b5c544cc8fcf55af11ead23..16bc3e35bdd4e196eae43be264a1e758dfcf84d9 100644 (file)
@@ -56,10 +56,7 @@ u8 ata_irq_on(struct ata_port *ap)
        ap->ctl &= ~ATA_NIEN;
        ap->last_ctl = ap->ctl;
 
-       if (ap->flags & ATA_FLAG_MMIO)
-               writeb(ap->ctl, (void __iomem *) ioaddr->ctl_addr);
-       else
-               outb(ap->ctl, ioaddr->ctl_addr);
+       iowrite8(ap->ctl, ioaddr->ctl_addr);
        tmp = ata_wait_idle(ap);
 
        ap->ops->irq_clear(ap);
@@ -67,92 +64,74 @@ u8 ata_irq_on(struct ata_port *ap)
        return tmp;
 }
 
+u8 ata_dummy_irq_on (struct ata_port *ap)      { return 0; }
+
 /**
- *     ata_tf_load_pio - send taskfile registers to host controller
- *     @ap: Port to which output is sent
- *     @tf: ATA taskfile register set
+ *     ata_irq_ack - Acknowledge a device interrupt.
+ *     @ap: Port on which interrupts are enabled.
  *
- *     Outputs ATA taskfile to standard ATA host controller.
+ *     Wait up to 10 ms for legacy IDE device to become idle (BUSY
+ *     or BUSY+DRQ clear).  Obtain dma status and port status from
+ *     device.  Clear the interrupt.  Return port status.
  *
  *     LOCKING:
- *     Inherited from caller.
  */
 
-static void ata_tf_load_pio(struct ata_port *ap, const struct ata_taskfile *tf)
+u8 ata_irq_ack(struct ata_port *ap, unsigned int chk_drq)
 {
-       struct ata_ioports *ioaddr = &ap->ioaddr;
-       unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR;
+       unsigned int bits = chk_drq ? ATA_BUSY | ATA_DRQ : ATA_BUSY;
+       u8 host_stat, post_stat, status;
 
-       if (tf->ctl != ap->last_ctl) {
-               outb(tf->ctl, ioaddr->ctl_addr);
-               ap->last_ctl = tf->ctl;
-               ata_wait_idle(ap);
-       }
+       status = ata_busy_wait(ap, bits, 1000);
+       if (status & bits)
+               if (ata_msg_err(ap))
+                       printk(KERN_ERR "abnormal status 0x%X\n", status);
 
-       if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) {
-               outb(tf->hob_feature, ioaddr->feature_addr);
-               outb(tf->hob_nsect, ioaddr->nsect_addr);
-               outb(tf->hob_lbal, ioaddr->lbal_addr);
-               outb(tf->hob_lbam, ioaddr->lbam_addr);
-               outb(tf->hob_lbah, ioaddr->lbah_addr);
-               VPRINTK("hob: feat 0x%X nsect 0x%X, lba 0x%X 0x%X 0x%X\n",
-                       tf->hob_feature,
-                       tf->hob_nsect,
-                       tf->hob_lbal,
-                       tf->hob_lbam,
-                       tf->hob_lbah);
-       }
+       /* get controller status; clear intr, err bits */
+       host_stat = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
+       iowrite8(host_stat | ATA_DMA_INTR | ATA_DMA_ERR,
+                ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
 
-       if (is_addr) {
-               outb(tf->feature, ioaddr->feature_addr);
-               outb(tf->nsect, ioaddr->nsect_addr);
-               outb(tf->lbal, ioaddr->lbal_addr);
-               outb(tf->lbam, ioaddr->lbam_addr);
-               outb(tf->lbah, ioaddr->lbah_addr);
-               VPRINTK("feat 0x%X nsect 0x%X lba 0x%X 0x%X 0x%X\n",
-                       tf->feature,
-                       tf->nsect,
-                       tf->lbal,
-                       tf->lbam,
-                       tf->lbah);
-       }
+       post_stat = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
 
-       if (tf->flags & ATA_TFLAG_DEVICE) {
-               outb(tf->device, ioaddr->device_addr);
-               VPRINTK("device 0x%X\n", tf->device);
-       }
+       if (ata_msg_intr(ap))
+               printk(KERN_INFO "%s: irq ack: host_stat 0x%X, new host_stat 0x%X, drv_stat 0x%X\n",
+                       __FUNCTION__,
+                       host_stat, post_stat, status);
 
-       ata_wait_idle(ap);
+       return status;
 }
 
+u8 ata_dummy_irq_ack(struct ata_port *ap, unsigned int chk_drq) { return 0; }
+
 /**
- *     ata_tf_load_mmio - send taskfile registers to host controller
+ *     ata_tf_load - send taskfile registers to host controller
  *     @ap: Port to which output is sent
  *     @tf: ATA taskfile register set
  *
- *     Outputs ATA taskfile to standard ATA host controller using MMIO.
+ *     Outputs ATA taskfile to standard ATA host controller.
  *
  *     LOCKING:
  *     Inherited from caller.
  */
 
-static void ata_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
+void ata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
 {
        struct ata_ioports *ioaddr = &ap->ioaddr;
        unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR;
 
        if (tf->ctl != ap->last_ctl) {
-               writeb(tf->ctl, (void __iomem *) ap->ioaddr.ctl_addr);
+               iowrite8(tf->ctl, ioaddr->ctl_addr);
                ap->last_ctl = tf->ctl;
                ata_wait_idle(ap);
        }
 
        if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) {
-               writeb(tf->hob_feature, (void __iomem *) ioaddr->feature_addr);
-               writeb(tf->hob_nsect, (void __iomem *) ioaddr->nsect_addr);
-               writeb(tf->hob_lbal, (void __iomem *) ioaddr->lbal_addr);
-               writeb(tf->hob_lbam, (void __iomem *) ioaddr->lbam_addr);
-               writeb(tf->hob_lbah, (void __iomem *) ioaddr->lbah_addr);
+               iowrite8(tf->hob_feature, ioaddr->feature_addr);
+               iowrite8(tf->hob_nsect, ioaddr->nsect_addr);
+               iowrite8(tf->hob_lbal, ioaddr->lbal_addr);
+               iowrite8(tf->hob_lbam, ioaddr->lbam_addr);
+               iowrite8(tf->hob_lbah, ioaddr->lbah_addr);
                VPRINTK("hob: feat 0x%X nsect 0x%X, lba 0x%X 0x%X 0x%X\n",
                        tf->hob_feature,
                        tf->hob_nsect,
@@ -162,11 +141,11 @@ static void ata_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
        }
 
        if (is_addr) {
-               writeb(tf->feature, (void __iomem *) ioaddr->feature_addr);
-               writeb(tf->nsect, (void __iomem *) ioaddr->nsect_addr);
-               writeb(tf->lbal, (void __iomem *) ioaddr->lbal_addr);
-               writeb(tf->lbam, (void __iomem *) ioaddr->lbam_addr);
-               writeb(tf->lbah, (void __iomem *) ioaddr->lbah_addr);
+               iowrite8(tf->feature, ioaddr->feature_addr);
+               iowrite8(tf->nsect, ioaddr->nsect_addr);
+               iowrite8(tf->lbal, ioaddr->lbal_addr);
+               iowrite8(tf->lbam, ioaddr->lbam_addr);
+               iowrite8(tf->lbah, ioaddr->lbah_addr);
                VPRINTK("feat 0x%X nsect 0x%X lba 0x%X 0x%X 0x%X\n",
                        tf->feature,
                        tf->nsect,
@@ -176,108 +155,34 @@ static void ata_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
        }
 
        if (tf->flags & ATA_TFLAG_DEVICE) {
-               writeb(tf->device, (void __iomem *) ioaddr->device_addr);
+               iowrite8(tf->device, ioaddr->device_addr);
                VPRINTK("device 0x%X\n", tf->device);
        }
 
        ata_wait_idle(ap);
 }
 
-
-/**
- *     ata_tf_load - send taskfile registers to host controller
- *     @ap: Port to which output is sent
- *     @tf: ATA taskfile register set
- *
- *     Outputs ATA taskfile to standard ATA host controller using MMIO
- *     or PIO as indicated by the ATA_FLAG_MMIO flag.
- *     Writes the control, feature, nsect, lbal, lbam, and lbah registers.
- *     Optionally (ATA_TFLAG_LBA48) writes hob_feature, hob_nsect,
- *     hob_lbal, hob_lbam, and hob_lbah.
- *
- *     This function waits for idle (!BUSY and !DRQ) after writing
- *     registers.  If the control register has a new value, this
- *     function also waits for idle after writing control and before
- *     writing the remaining registers.
- *
- *     May be used as the tf_load() entry in ata_port_operations.
- *
- *     LOCKING:
- *     Inherited from caller.
- */
-void ata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
-{
-       if (ap->flags & ATA_FLAG_MMIO)
-               ata_tf_load_mmio(ap, tf);
-       else
-               ata_tf_load_pio(ap, tf);
-}
-
 /**
- *     ata_exec_command_pio - issue ATA command to host controller
- *     @ap: port to which command is being issued
- *     @tf: ATA taskfile register set
- *
- *     Issues PIO write to ATA command register, with proper
- *     synchronization with interrupt handler / other threads.
- *
- *     LOCKING:
- *     spin_lock_irqsave(host lock)
- */
-
-static void ata_exec_command_pio(struct ata_port *ap, const struct ata_taskfile *tf)
-{
-       DPRINTK("ata%u: cmd 0x%X\n", ap->id, tf->command);
-
-               outb(tf->command, ap->ioaddr.command_addr);
-       ata_pause(ap);
-}
-
-
-/**
- *     ata_exec_command_mmio - issue ATA command to host controller
+ *     ata_exec_command - issue ATA command to host controller
  *     @ap: port to which command is being issued
  *     @tf: ATA taskfile register set
  *
- *     Issues MMIO write to ATA command register, with proper
- *     synchronization with interrupt handler / other threads.
- *
- *     FIXME: missing write posting for 400nS delay enforcement
+ *     Issues ATA command, with proper synchronization with interrupt
+ *     handler / other threads.
  *
  *     LOCKING:
  *     spin_lock_irqsave(host lock)
  */
-
-static void ata_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf)
+void ata_exec_command(struct ata_port *ap, const struct ata_taskfile *tf)
 {
        DPRINTK("ata%u: cmd 0x%X\n", ap->id, tf->command);
 
-               writeb(tf->command, (void __iomem *) ap->ioaddr.command_addr);
+       iowrite8(tf->command, ap->ioaddr.command_addr);
        ata_pause(ap);
 }
 
-
-/**
- *     ata_exec_command - issue ATA command to host controller
- *     @ap: port to which command is being issued
- *     @tf: ATA taskfile register set
- *
- *     Issues PIO/MMIO write to ATA command register, with proper
- *     synchronization with interrupt handler / other threads.
- *
- *     LOCKING:
- *     spin_lock_irqsave(host lock)
- */
-void ata_exec_command(struct ata_port *ap, const struct ata_taskfile *tf)
-{
-       if (ap->flags & ATA_FLAG_MMIO)
-               ata_exec_command_mmio(ap, tf);
-       else
-               ata_exec_command_pio(ap, tf);
-}
-
 /**
- *     ata_tf_read_pio - input device's ATA taskfile shadow registers
+ *     ata_tf_read - input device's ATA taskfile shadow registers
  *     @ap: Port from which input is read
  *     @tf: ATA taskfile register set for storing input
  *
@@ -287,121 +192,28 @@ void ata_exec_command(struct ata_port *ap, const struct ata_taskfile *tf)
  *     LOCKING:
  *     Inherited from caller.
  */
-
-static void ata_tf_read_pio(struct ata_port *ap, struct ata_taskfile *tf)
-{
-       struct ata_ioports *ioaddr = &ap->ioaddr;
-
-       tf->command = ata_check_status(ap);
-       tf->feature = inb(ioaddr->error_addr);
-       tf->nsect = inb(ioaddr->nsect_addr);
-       tf->lbal = inb(ioaddr->lbal_addr);
-       tf->lbam = inb(ioaddr->lbam_addr);
-       tf->lbah = inb(ioaddr->lbah_addr);
-       tf->device = inb(ioaddr->device_addr);
-
-       if (tf->flags & ATA_TFLAG_LBA48) {
-               outb(tf->ctl | ATA_HOB, ioaddr->ctl_addr);
-               tf->hob_feature = inb(ioaddr->error_addr);
-               tf->hob_nsect = inb(ioaddr->nsect_addr);
-               tf->hob_lbal = inb(ioaddr->lbal_addr);
-               tf->hob_lbam = inb(ioaddr->lbam_addr);
-               tf->hob_lbah = inb(ioaddr->lbah_addr);
-       }
-}
-
-/**
- *     ata_tf_read_mmio - input device's ATA taskfile shadow registers
- *     @ap: Port from which input is read
- *     @tf: ATA taskfile register set for storing input
- *
- *     Reads ATA taskfile registers for currently-selected device
- *     into @tf via MMIO.
- *
- *     LOCKING:
- *     Inherited from caller.
- */
-
-static void ata_tf_read_mmio(struct ata_port *ap, struct ata_taskfile *tf)
+void ata_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
 {
        struct ata_ioports *ioaddr = &ap->ioaddr;
 
        tf->command = ata_check_status(ap);
-       tf->feature = readb((void __iomem *)ioaddr->error_addr);
-       tf->nsect = readb((void __iomem *)ioaddr->nsect_addr);
-       tf->lbal = readb((void __iomem *)ioaddr->lbal_addr);
-       tf->lbam = readb((void __iomem *)ioaddr->lbam_addr);
-       tf->lbah = readb((void __iomem *)ioaddr->lbah_addr);
-       tf->device = readb((void __iomem *)ioaddr->device_addr);
+       tf->feature = ioread8(ioaddr->error_addr);
+       tf->nsect = ioread8(ioaddr->nsect_addr);
+       tf->lbal = ioread8(ioaddr->lbal_addr);
+       tf->lbam = ioread8(ioaddr->lbam_addr);
+       tf->lbah = ioread8(ioaddr->lbah_addr);
+       tf->device = ioread8(ioaddr->device_addr);
 
        if (tf->flags & ATA_TFLAG_LBA48) {
-               writeb(tf->ctl | ATA_HOB, (void __iomem *) ap->ioaddr.ctl_addr);
-               tf->hob_feature = readb((void __iomem *)ioaddr->error_addr);
-               tf->hob_nsect = readb((void __iomem *)ioaddr->nsect_addr);
-               tf->hob_lbal = readb((void __iomem *)ioaddr->lbal_addr);
-               tf->hob_lbam = readb((void __iomem *)ioaddr->lbam_addr);
-               tf->hob_lbah = readb((void __iomem *)ioaddr->lbah_addr);
+               iowrite8(tf->ctl | ATA_HOB, ioaddr->ctl_addr);
+               tf->hob_feature = ioread8(ioaddr->error_addr);
+               tf->hob_nsect = ioread8(ioaddr->nsect_addr);
+               tf->hob_lbal = ioread8(ioaddr->lbal_addr);
+               tf->hob_lbam = ioread8(ioaddr->lbam_addr);
+               tf->hob_lbah = ioread8(ioaddr->lbah_addr);
        }
 }
 
-
-/**
- *     ata_tf_read - input device's ATA taskfile shadow registers
- *     @ap: Port from which input is read
- *     @tf: ATA taskfile register set for storing input
- *
- *     Reads ATA taskfile registers for currently-selected device
- *     into @tf.
- *
- *     Reads nsect, lbal, lbam, lbah, and device.  If ATA_TFLAG_LBA48
- *     is set, also reads the hob registers.
- *
- *     May be used as the tf_read() entry in ata_port_operations.
- *
- *     LOCKING:
- *     Inherited from caller.
- */
-void ata_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
-{
-       if (ap->flags & ATA_FLAG_MMIO)
-               ata_tf_read_mmio(ap, tf);
-       else
-               ata_tf_read_pio(ap, tf);
-}
-
-/**
- *     ata_check_status_pio - Read device status reg & clear interrupt
- *     @ap: port where the device is
- *
- *     Reads ATA taskfile status register for currently-selected device
- *     and return its value. This also clears pending interrupts
- *      from this device
- *
- *     LOCKING:
- *     Inherited from caller.
- */
-static u8 ata_check_status_pio(struct ata_port *ap)
-{
-       return inb(ap->ioaddr.status_addr);
-}
-
-/**
- *     ata_check_status_mmio - Read device status reg & clear interrupt
- *     @ap: port where the device is
- *
- *     Reads ATA taskfile status register for currently-selected device
- *     via MMIO and return its value. This also clears pending interrupts
- *      from this device
- *
- *     LOCKING:
- *     Inherited from caller.
- */
-static u8 ata_check_status_mmio(struct ata_port *ap)
-{
-               return readb((void __iomem *) ap->ioaddr.status_addr);
-}
-
-
 /**
  *     ata_check_status - Read device status reg & clear interrupt
  *     @ap: port where the device is
@@ -410,19 +222,14 @@ static u8 ata_check_status_mmio(struct ata_port *ap)
  *     and return its value. This also clears pending interrupts
  *      from this device
  *
- *     May be used as the check_status() entry in ata_port_operations.
- *
  *     LOCKING:
  *     Inherited from caller.
  */
 u8 ata_check_status(struct ata_port *ap)
 {
-       if (ap->flags & ATA_FLAG_MMIO)
-               return ata_check_status_mmio(ap);
-       return ata_check_status_pio(ap);
+       return ioread8(ap->ioaddr.status_addr);
 }
 
-
 /**
  *     ata_altstatus - Read device alternate status reg
  *     @ap: port where the device is
@@ -441,58 +248,52 @@ u8 ata_altstatus(struct ata_port *ap)
        if (ap->ops->check_altstatus)
                return ap->ops->check_altstatus(ap);
 
-       if (ap->flags & ATA_FLAG_MMIO)
-               return readb((void __iomem *)ap->ioaddr.altstatus_addr);
-       return inb(ap->ioaddr.altstatus_addr);
+       return ioread8(ap->ioaddr.altstatus_addr);
 }
 
 /**
- *     ata_bmdma_setup_mmio - Set up PCI IDE BMDMA transaction
+ *     ata_bmdma_setup - Set up PCI IDE BMDMA transaction
  *     @qc: Info associated with this ATA transaction.
  *
  *     LOCKING:
  *     spin_lock_irqsave(host lock)
  */
-
-static void ata_bmdma_setup_mmio (struct ata_queued_cmd *qc)
+void ata_bmdma_setup(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
        unsigned int rw = (qc->tf.flags & ATA_TFLAG_WRITE);
        u8 dmactl;
-       void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
 
        /* load PRD table addr. */
        mb();   /* make sure PRD table writes are visible to controller */
-       writel(ap->prd_dma, mmio + ATA_DMA_TABLE_OFS);
+       iowrite32(ap->prd_dma, ap->ioaddr.bmdma_addr + ATA_DMA_TABLE_OFS);
 
        /* specify data direction, triple-check start bit is clear */
-       dmactl = readb(mmio + ATA_DMA_CMD);
+       dmactl = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
        dmactl &= ~(ATA_DMA_WR | ATA_DMA_START);
        if (!rw)
                dmactl |= ATA_DMA_WR;
-       writeb(dmactl, mmio + ATA_DMA_CMD);
+       iowrite8(dmactl, ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
 
        /* issue r/w command */
        ap->ops->exec_command(ap, &qc->tf);
 }
 
 /**
- *     ata_bmdma_start_mmio - Start a PCI IDE BMDMA transaction
+ *     ata_bmdma_start - Start a PCI IDE BMDMA transaction
  *     @qc: Info associated with this ATA transaction.
  *
  *     LOCKING:
  *     spin_lock_irqsave(host lock)
  */
-
-static void ata_bmdma_start_mmio (struct ata_queued_cmd *qc)
+void ata_bmdma_start (struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
-       void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
        u8 dmactl;
 
        /* start host DMA transaction */
-       dmactl = readb(mmio + ATA_DMA_CMD);
-       writeb(dmactl | ATA_DMA_START, mmio + ATA_DMA_CMD);
+       dmactl = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
+       iowrite8(dmactl | ATA_DMA_START, ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
 
        /* Strictly, one may wish to issue a readb() here, to
         * flush the mmio write.  However, control also passes
@@ -507,96 +308,6 @@ static void ata_bmdma_start_mmio (struct ata_queued_cmd *qc)
         */
 }
 
-/**
- *     ata_bmdma_setup_pio - Set up PCI IDE BMDMA transaction (PIO)
- *     @qc: Info associated with this ATA transaction.
- *
- *     LOCKING:
- *     spin_lock_irqsave(host lock)
- */
-
-static void ata_bmdma_setup_pio (struct ata_queued_cmd *qc)
-{
-       struct ata_port *ap = qc->ap;
-       unsigned int rw = (qc->tf.flags & ATA_TFLAG_WRITE);
-       u8 dmactl;
-
-       /* load PRD table addr. */
-       outl(ap->prd_dma, ap->ioaddr.bmdma_addr + ATA_DMA_TABLE_OFS);
-
-       /* specify data direction, triple-check start bit is clear */
-       dmactl = inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
-       dmactl &= ~(ATA_DMA_WR | ATA_DMA_START);
-       if (!rw)
-               dmactl |= ATA_DMA_WR;
-       outb(dmactl, ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
-
-       /* issue r/w command */
-       ap->ops->exec_command(ap, &qc->tf);
-}
-
-/**
- *     ata_bmdma_start_pio - Start a PCI IDE BMDMA transaction (PIO)
- *     @qc: Info associated with this ATA transaction.
- *
- *     LOCKING:
- *     spin_lock_irqsave(host lock)
- */
-
-static void ata_bmdma_start_pio (struct ata_queued_cmd *qc)
-{
-       struct ata_port *ap = qc->ap;
-       u8 dmactl;
-
-       /* start host DMA transaction */
-       dmactl = inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
-       outb(dmactl | ATA_DMA_START,
-            ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
-}
-
-
-/**
- *     ata_bmdma_start - Start a PCI IDE BMDMA transaction
- *     @qc: Info associated with this ATA transaction.
- *
- *     Writes the ATA_DMA_START flag to the DMA command register.
- *
- *     May be used as the bmdma_start() entry in ata_port_operations.
- *
- *     LOCKING:
- *     spin_lock_irqsave(host lock)
- */
-void ata_bmdma_start(struct ata_queued_cmd *qc)
-{
-       if (qc->ap->flags & ATA_FLAG_MMIO)
-               ata_bmdma_start_mmio(qc);
-       else
-               ata_bmdma_start_pio(qc);
-}
-
-
-/**
- *     ata_bmdma_setup - Set up PCI IDE BMDMA transaction
- *     @qc: Info associated with this ATA transaction.
- *
- *     Writes address of PRD table to device's PRD Table Address
- *     register, sets the DMA control register, and calls
- *     ops->exec_command() to start the transfer.
- *
- *     May be used as the bmdma_setup() entry in ata_port_operations.
- *
- *     LOCKING:
- *     spin_lock_irqsave(host lock)
- */
-void ata_bmdma_setup(struct ata_queued_cmd *qc)
-{
-       if (qc->ap->flags & ATA_FLAG_MMIO)
-               ata_bmdma_setup_mmio(qc);
-       else
-               ata_bmdma_setup_pio(qc);
-}
-
-
 /**
  *     ata_bmdma_irq_clear - Clear PCI IDE BMDMA interrupt.
  *     @ap: Port associated with this ATA transaction.
@@ -608,23 +319,16 @@ void ata_bmdma_setup(struct ata_queued_cmd *qc)
  *     LOCKING:
  *     spin_lock_irqsave(host lock)
  */
-
 void ata_bmdma_irq_clear(struct ata_port *ap)
 {
-       if (!ap->ioaddr.bmdma_addr)
+       void __iomem *mmio = ap->ioaddr.bmdma_addr;
+
+       if (!mmio)
                return;
 
-       if (ap->flags & ATA_FLAG_MMIO) {
-               void __iomem *mmio =
-                     ((void __iomem *) ap->ioaddr.bmdma_addr) + ATA_DMA_STATUS;
-               writeb(readb(mmio), mmio);
-       } else {
-               unsigned long addr = ap->ioaddr.bmdma_addr + ATA_DMA_STATUS;
-               outb(inb(addr), addr);
-       }
+       iowrite8(ioread8(mmio + ATA_DMA_STATUS), mmio + ATA_DMA_STATUS);
 }
 
-
 /**
  *     ata_bmdma_status - Read PCI IDE BMDMA status
  *     @ap: Port associated with this ATA transaction.
@@ -636,19 +340,11 @@ void ata_bmdma_irq_clear(struct ata_port *ap)
  *     LOCKING:
  *     spin_lock_irqsave(host lock)
  */
-
 u8 ata_bmdma_status(struct ata_port *ap)
 {
-       u8 host_stat;
-       if (ap->flags & ATA_FLAG_MMIO) {
-               void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
-               host_stat = readb(mmio + ATA_DMA_STATUS);
-       } else
-               host_stat = inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
-       return host_stat;
+       return ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
 }
 
-
 /**
  *     ata_bmdma_stop - Stop PCI IDE BMDMA transfer
  *     @qc: Command we are ending DMA for
@@ -660,21 +356,14 @@ u8 ata_bmdma_status(struct ata_port *ap)
  *     LOCKING:
  *     spin_lock_irqsave(host lock)
  */
-
 void ata_bmdma_stop(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
-       if (ap->flags & ATA_FLAG_MMIO) {
-               void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
+       void __iomem *mmio = ap->ioaddr.bmdma_addr;
 
-               /* clear start/stop bit */
-               writeb(readb(mmio + ATA_DMA_CMD) & ~ATA_DMA_START,
-                       mmio + ATA_DMA_CMD);
-       } else {
-               /* clear start/stop bit */
-               outb(inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD) & ~ATA_DMA_START,
-                       ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
-       }
+       /* clear start/stop bit */
+       iowrite8(ioread8(mmio + ATA_DMA_CMD) & ~ATA_DMA_START,
+                mmio + ATA_DMA_CMD);
 
        /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */
        ata_altstatus(ap);        /* dummy read */
@@ -696,10 +385,7 @@ void ata_bmdma_freeze(struct ata_port *ap)
        ap->ctl |= ATA_NIEN;
        ap->last_ctl = ap->ctl;
 
-       if (ap->flags & ATA_FLAG_MMIO)
-               writeb(ap->ctl, (void __iomem *)ioaddr->ctl_addr);
-       else
-               outb(ap->ctl, ioaddr->ctl_addr);
+       iowrite8(ap->ctl, ioaddr->ctl_addr);
 
        /* Under certain circumstances, some controllers raise IRQ on
         * ATA_NIEN manipulation.  Also, many controllers fail to mask
@@ -724,8 +410,7 @@ void ata_bmdma_thaw(struct ata_port *ap)
        /* clear & re-enable interrupts */
        ata_chk_status(ap);
        ap->ops->irq_clear(ap);
-       if (ap->ioaddr.ctl_addr)        /* FIXME: hack. create a hook instead */
-               ata_irq_on(ap);
+       ap->ops->irq_on(ap);
 }
 
 /**
@@ -775,7 +460,7 @@ void ata_bmdma_drive_eh(struct ata_port *ap, ata_prereset_fn_t prereset,
                 * really a timeout event, adjust error mask and
                 * cancel frozen state.
                 */
-               if (qc->err_mask == AC_ERR_TIMEOUT && host_stat & ATA_DMA_ERR) {
+               if (qc->err_mask == AC_ERR_TIMEOUT && (host_stat & ATA_DMA_ERR)) {
                        qc->err_mask = AC_ERR_HOST_BUS;
                        thaw = 1;
                }
@@ -832,6 +517,21 @@ void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc)
 }
 
 #ifdef CONFIG_PCI
+
+static int ata_resources_present(struct pci_dev *pdev, int port)
+{
+       int i;
+       
+       /* Check the PCI resources for this channel are enabled */
+       port = port * 2;
+       for (i = 0; i < 2; i ++) {
+               if (pci_resource_start(pdev, port + i) == 0 ||
+                       pci_resource_len(pdev, port + i) == 0)
+               return 0;
+       }
+       return 1;
+}
+               
 /**
  *     ata_pci_init_native_mode - Initialize native-mode driver
  *     @pdev:  pci device to be initialized
@@ -853,45 +553,62 @@ void ata_bmdma_post_internal_cmd(struct ata_queued_cmd *qc)
 struct ata_probe_ent *
 ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int ports)
 {
-       struct ata_probe_ent *probe_ent =
-               ata_probe_ent_alloc(pci_dev_to_dev(pdev), port[0]);
-       int p = 0;
-       unsigned long bmdma;
+       struct ata_probe_ent *probe_ent;
+       int i, p = 0;
+       void __iomem * const *iomap;
+
+       /* iomap BARs */
+       for (i = 0; i < 4; i++) {
+               if (pcim_iomap(pdev, i, 0) == NULL) {
+                       dev_printk(KERN_ERR, &pdev->dev,
+                                  "failed to iomap PCI BAR %d\n", i);
+                       return NULL;
+               }
+       }
 
+       pcim_iomap(pdev, 4, 0); /* may fail */
+       iomap = pcim_iomap_table(pdev);
+
+       /* alloc and init probe_ent */
+       probe_ent = ata_probe_ent_alloc(pci_dev_to_dev(pdev), port[0]);
        if (!probe_ent)
                return NULL;
 
        probe_ent->irq = pdev->irq;
        probe_ent->irq_flags = IRQF_SHARED;
+       
+       /* Discard disabled ports. Some controllers show their
+          unused channels this way */
+       if (ata_resources_present(pdev, 0) == 0)
+               ports &= ~ATA_PORT_PRIMARY;
+       if (ata_resources_present(pdev, 1) == 0)
+               ports &= ~ATA_PORT_SECONDARY;
 
        if (ports & ATA_PORT_PRIMARY) {
-               probe_ent->port[p].cmd_addr = pci_resource_start(pdev, 0);
+               probe_ent->port[p].cmd_addr = iomap[0];
                probe_ent->port[p].altstatus_addr =
-               probe_ent->port[p].ctl_addr =
-                       pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS;
-               bmdma = pci_resource_start(pdev, 4);
-               if (bmdma) {
+               probe_ent->port[p].ctl_addr = (void __iomem *)
+                       ((unsigned long)iomap[1] | ATA_PCI_CTL_OFS);
+               if (iomap[4]) {
                        if ((!(port[p]->flags & ATA_FLAG_IGN_SIMPLEX)) &&
-                           (inb(bmdma + 2) & 0x80))
+                           (ioread8(iomap[4] + 2) & 0x80))
                                probe_ent->_host_flags |= ATA_HOST_SIMPLEX;
-                       probe_ent->port[p].bmdma_addr = bmdma;
+                       probe_ent->port[p].bmdma_addr = iomap[4];
                }
                ata_std_ports(&probe_ent->port[p]);
                p++;
        }
 
        if (ports & ATA_PORT_SECONDARY) {
-               probe_ent->port[p].cmd_addr = pci_resource_start(pdev, 2);
+               probe_ent->port[p].cmd_addr = iomap[2];
                probe_ent->port[p].altstatus_addr =
-               probe_ent->port[p].ctl_addr =
-                       pci_resource_start(pdev, 3) | ATA_PCI_CTL_OFS;
-               bmdma = pci_resource_start(pdev, 4);
-               if (bmdma) {
-                       bmdma += 8;
+               probe_ent->port[p].ctl_addr = (void __iomem *)
+                       ((unsigned long)iomap[3] | ATA_PCI_CTL_OFS);
+               if (iomap[4]) {
                        if ((!(port[p]->flags & ATA_FLAG_IGN_SIMPLEX)) &&
-                           (inb(bmdma + 2) & 0x80))
+                           (ioread8(iomap[4] + 10) & 0x80))
                                probe_ent->_host_flags |= ATA_HOST_SIMPLEX;
-                       probe_ent->port[p].bmdma_addr = bmdma;
+                       probe_ent->port[p].bmdma_addr = iomap[4] + 8;
                }
                ata_std_ports(&probe_ent->port[p]);
                probe_ent->pinfo2 = port[1];
@@ -902,13 +619,29 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int
        return probe_ent;
 }
 
-
 static struct ata_probe_ent *ata_pci_init_legacy_port(struct pci_dev *pdev,
                                struct ata_port_info **port, int port_mask)
 {
        struct ata_probe_ent *probe_ent;
-       unsigned long bmdma = pci_resource_start(pdev, 4);
+       void __iomem *iomap[5] = { }, *bmdma;
+
+       if (port_mask & ATA_PORT_PRIMARY) {
+               iomap[0] = devm_ioport_map(&pdev->dev, ATA_PRIMARY_CMD, 8);
+               iomap[1] = devm_ioport_map(&pdev->dev, ATA_PRIMARY_CTL, 1);
+               if (!iomap[0] || !iomap[1])
+                       return NULL;
+       }
+
+       if (port_mask & ATA_PORT_SECONDARY) {
+               iomap[2] = devm_ioport_map(&pdev->dev, ATA_SECONDARY_CMD, 8);
+               iomap[3] = devm_ioport_map(&pdev->dev, ATA_SECONDARY_CTL, 1);
+               if (!iomap[2] || !iomap[3])
+                       return NULL;
+       }
 
+       bmdma = pcim_iomap(pdev, 4, 16); /* may fail */
+
+       /* alloc and init probe_ent */
        probe_ent = ata_probe_ent_alloc(pci_dev_to_dev(pdev), port[0]);
        if (!probe_ent)
                return NULL;
@@ -918,13 +651,13 @@ static struct ata_probe_ent *ata_pci_init_legacy_port(struct pci_dev *pdev,
 
        if (port_mask & ATA_PORT_PRIMARY) {
                probe_ent->irq = ATA_PRIMARY_IRQ(pdev);
-               probe_ent->port[0].cmd_addr = ATA_PRIMARY_CMD;
+               probe_ent->port[0].cmd_addr = iomap[0];
                probe_ent->port[0].altstatus_addr =
-               probe_ent->port[0].ctl_addr = ATA_PRIMARY_CTL;
+               probe_ent->port[0].ctl_addr = iomap[1];
                if (bmdma) {
                        probe_ent->port[0].bmdma_addr = bmdma;
                        if ((!(port[0]->flags & ATA_FLAG_IGN_SIMPLEX)) &&
-                           (inb(bmdma + 2) & 0x80))
+                           (ioread8(bmdma + 2) & 0x80))
                                probe_ent->_host_flags |= ATA_HOST_SIMPLEX;
                }
                ata_std_ports(&probe_ent->port[0]);
@@ -936,13 +669,13 @@ static struct ata_probe_ent *ata_pci_init_legacy_port(struct pci_dev *pdev,
                        probe_ent->irq2 = ATA_SECONDARY_IRQ(pdev);
                else
                        probe_ent->irq = ATA_SECONDARY_IRQ(pdev);
-               probe_ent->port[1].cmd_addr = ATA_SECONDARY_CMD;
+               probe_ent->port[1].cmd_addr = iomap[2];
                probe_ent->port[1].altstatus_addr =
-               probe_ent->port[1].ctl_addr = ATA_SECONDARY_CTL;
+               probe_ent->port[1].ctl_addr = iomap[3];
                if (bmdma) {
                        probe_ent->port[1].bmdma_addr = bmdma + 8;
                        if ((!(port[1]->flags & ATA_FLAG_IGN_SIMPLEX)) &&
-                           (inb(bmdma + 10) & 0x80))
+                           (ioread8(bmdma + 10) & 0x80))
                                probe_ent->_host_flags |= ATA_HOST_SIMPLEX;
                }
                ata_std_ports(&probe_ent->port[1]);
@@ -984,15 +717,18 @@ static struct ata_probe_ent *ata_pci_init_legacy_port(struct pci_dev *pdev,
 int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
                      unsigned int n_ports)
 {
+       struct device *dev = &pdev->dev;
        struct ata_probe_ent *probe_ent = NULL;
        struct ata_port_info *port[2];
        u8 mask;
        unsigned int legacy_mode = 0;
-       int disable_dev_on_err = 1;
        int rc;
 
        DPRINTK("ENTER\n");
 
+       if (!devres_open_group(dev, NULL, GFP_KERNEL))
+               return -ENOMEM;
+
        BUG_ON(n_ports < 1 || n_ports > 2);
 
        port[0] = port_info[0];
@@ -1009,9 +745,9 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
           boot for the primary video which is BIOS enabled
          */
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
-               return rc;
+               goto err_out;
 
        if ((pdev->class >> 8) == PCI_CLASS_STORAGE_IDE) {
                u8 tmp8;
@@ -1027,7 +763,8 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
                   left a device in compatibility mode */
                if (legacy_mode) {
                        printk(KERN_ERR "ata: Compatibility mode ATA is not supported on this platform, skipping.\n");
-                       return -EOPNOTSUPP;
+                       rc = -EOPNOTSUPP;
+                       goto err_out;
                }
 #endif
        }
@@ -1035,13 +772,13 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
        if (!legacy_mode) {
                rc = pci_request_regions(pdev, DRV_NAME);
                if (rc) {
-                       disable_dev_on_err = 0;
+                       pcim_pin_device(pdev);
                        goto err_out;
                }
        } else {
                /* Deal with combined mode hack. This side of the logic all
                   goes away once the combined mode hack is killed in 2.6.21 */
-               if (!request_region(ATA_PRIMARY_CMD, 8, "libata")) {
+               if (!devm_request_region(dev, ATA_PRIMARY_CMD, 8, "libata")) {
                        struct resource *conflict, res;
                        res.start = ATA_PRIMARY_CMD;
                        res.end = ATA_PRIMARY_CMD + 8 - 1;
@@ -1051,7 +788,7 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
                        if (!strcmp(conflict->name, "libata"))
                                legacy_mode |= ATA_PORT_PRIMARY;
                        else {
-                               disable_dev_on_err = 0;
+                               pcim_pin_device(pdev);
                                printk(KERN_WARNING "ata: 0x%0X IDE port busy\n" \
                                                    "ata: conflict with %s\n",
                                                    ATA_PRIMARY_CMD,
@@ -1060,7 +797,7 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
                } else
                        legacy_mode |= ATA_PORT_PRIMARY;
 
-               if (!request_region(ATA_SECONDARY_CMD, 8, "libata")) {
+               if (!devm_request_region(dev, ATA_SECONDARY_CMD, 8, "libata")) {
                        struct resource *conflict, res;
                        res.start = ATA_SECONDARY_CMD;
                        res.end = ATA_SECONDARY_CMD + 8 - 1;
@@ -1070,7 +807,7 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
                        if (!strcmp(conflict->name, "libata"))
                                legacy_mode |= ATA_PORT_SECONDARY;
                        else {
-                               disable_dev_on_err = 0;
+                               pcim_pin_device(pdev);
                                printk(KERN_WARNING "ata: 0x%X IDE port busy\n" \
                                                    "ata: conflict with %s\n",
                                                    ATA_SECONDARY_CMD,
@@ -1090,16 +827,16 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
        /* we have legacy mode, but all ports are unavailable */
        if (legacy_mode == (1 << 3)) {
                rc = -EBUSY;
-               goto err_out_regions;
+               goto err_out;
        }
 
        /* TODO: If we get no DMA mask we should fall back to PIO */
        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               goto err_out;
        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               goto err_out;
 
        if (legacy_mode) {
                probe_ent = ata_pci_init_legacy_port(pdev, port, legacy_mode);
@@ -1111,40 +848,22 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
        }
        if (!probe_ent) {
                rc = -ENOMEM;
-               goto err_out_regions;
+               goto err_out;
        }
 
        pci_set_master(pdev);
 
        if (!ata_device_add(probe_ent)) {
                rc = -ENODEV;
-               goto err_out_ent;
+               goto err_out;
        }
 
-       kfree(probe_ent);
-
+       devm_kfree(dev, probe_ent);
+       devres_remove_group(dev, NULL);
        return 0;
 
-err_out_ent:
-       kfree(probe_ent);
-err_out_regions:
-       /* All this conditional stuff is needed for the combined mode hack
-          until 2.6.21 when it can go */
-       if (legacy_mode) {
-               pci_release_region(pdev, 4);
-               if (legacy_mode & ATA_PORT_PRIMARY) {
-                       release_region(ATA_PRIMARY_CMD, 8);
-                       pci_release_region(pdev, 1);
-               }
-               if (legacy_mode & ATA_PORT_SECONDARY) {
-                       release_region(ATA_SECONDARY_CMD, 8);
-                       pci_release_region(pdev, 3);
-               }
-       } else
-               pci_release_regions(pdev);
 err_out:
-       if (disable_dev_on_err)
-               pci_disable_device(pdev);
+       devres_release_group(dev, NULL);
        return rc;
 }
 
index 81ae41d5f23f04a4447c7b40bf7d347d5ef2b30c..06ccf230e3c2b97308879b87ef93b98d504902b4 100644 (file)
@@ -29,7 +29,6 @@
 #define __LIBATA_H__
 
 #define DRV_NAME       "libata"
-#define DRV_VERSION    "2.00"  /* must be exactly four chars */
 
 struct ata_scsi_args {
        struct ata_device       *dev;
@@ -136,4 +135,7 @@ extern void ata_qc_schedule_eh(struct ata_queued_cmd *qc);
 /* libata-sff.c */
 extern u8 ata_irq_on(struct ata_port *ap);
 
+/* pata_sis.c */
+extern struct ata_port_info sis_info133;
+
 #endif /* __LIBATA_H__ */
index c5d61d1911a53624ee50dfe145357c7ff5514dd8..ab44d18850f6eed706b0576624c8d92359ef13e0 100644 (file)
@@ -153,11 +153,11 @@ static void ali_early_error_handler(struct ata_port *ap)
 
 static unsigned long ali_20_filter(const struct ata_port *ap, struct ata_device *adev, unsigned long mask)
 {
-       char model_num[40];
+       char model_num[ATA_ID_PROD_LEN + 1];
        /* No DMA on anything but a disk for now */
        if (adev->class != ATA_DEV_ATA)
                mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
-       ata_id_string(adev->id, model_num, ATA_ID_PROD_OFS, sizeof(model_num));
+       ata_id_c_string(adev->id, model_num, ATA_ID_PROD, sizeof(model_num));
        if (strstr(model_num, "WDC"))
                return mask &= ~ATA_MASK_UDMA;
        return ata_pci_default_filter(ap, adev, mask);
@@ -370,14 +370,14 @@ static struct ata_port_operations ali_early_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -411,14 +411,14 @@ static struct ata_port_operations ali_20_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -449,14 +449,14 @@ static struct ata_port_operations ali_c2_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -486,14 +486,14 @@ static struct ata_port_operations ali_c5_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 
@@ -504,7 +504,7 @@ static struct ata_port_operations ali_c5_port_ops = {
  *     Perform the setup on the device that must be done both at boot
  *     and at resume time.
  */
+
 static void ali_init_chipset(struct pci_dev *pdev)
 {
        u8 rev, tmp;
@@ -655,7 +655,7 @@ static int ali_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
                port_info[0] = port_info[1] = &info_c5;
 
        ali_init_chipset(pdev);
-       
+
        isa_bridge = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, NULL);
        if (isa_bridge && rev >= 0x20 && rev < 0xC2) {
                /* Are we paired with a UDMA capable chip */
index a6b330089f227f0fe62204f001b23cb3c97fef87..619e44b04032ea0bada67d42ff73b81b81fb6893 100644 (file)
@@ -362,14 +362,14 @@ static struct ata_port_operations amd33_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations amd66_port_ops = {
@@ -396,14 +396,14 @@ static struct ata_port_operations amd66_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations amd100_port_ops = {
@@ -430,14 +430,14 @@ static struct ata_port_operations amd100_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations amd133_port_ops = {
@@ -464,14 +464,14 @@ static struct ata_port_operations amd133_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations nv100_port_ops = {
@@ -498,14 +498,14 @@ static struct ata_port_operations nv100_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations nv133_port_ops = {
@@ -532,14 +532,14 @@ static struct ata_port_operations nv133_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
index 37bc1323bda7aad0aff65f3aa7b95cc8fb889069..21c30282717ccafea9a541f9173552467bec932a 100644 (file)
@@ -341,14 +341,14 @@ static const struct ata_port_operations artop6210_ops = {
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
 
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static const struct ata_port_operations artop6260_ops = {
@@ -373,14 +373,14 @@ static const struct ata_port_operations artop6260_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 
index 504e1dbfffd7d9d6581fe4432c8e266bcd70730e..c3eb40c91c80435c0fefda38c4159cd7eebec136 100644 (file)
@@ -252,14 +252,14 @@ static struct ata_port_operations atiixp_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int atiixp_init_one(struct pci_dev *dev, const struct pci_device_id *id)
index 449162cbf93ef13477bbecaff90e23fdbf8df585..da098282b5f6ddab91d7bb358324a1613bf02bcd 100644 (file)
@@ -313,14 +313,14 @@ static struct ata_port_operations cmd64x_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations cmd646r1_port_ops = {
@@ -347,14 +347,14 @@ static struct ata_port_operations cmd646r1_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations cmd648_port_ops = {
@@ -381,14 +381,14 @@ static struct ata_port_operations cmd648_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int cmd64x_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
index 9f165a8e032d4dca1df88447d9b56935f36a32d0..1ce8fcfd7826e08c32c90c130125c6013c7cb895 100644 (file)
@@ -99,9 +99,9 @@ static void cs5520_set_timings(struct ata_port *ap, struct ata_device *adev, int
 static void cs5520_enable_dma(struct ata_port *ap, struct ata_device *adev)
 {
        /* Set the DMA enable/disable flag */
-       u8 reg = inb(ap->ioaddr.bmdma_addr + 0x02);
+       u8 reg = ioread8(ap->ioaddr.bmdma_addr + 0x02);
        reg |= 1<<(adev->devno + 5);
-       outb(reg, ap->ioaddr.bmdma_addr + 0x02);
+       iowrite8(reg, ap->ioaddr.bmdma_addr + 0x02);
 }
 
 /**
@@ -193,19 +193,20 @@ static struct ata_port_operations cs5520_port_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        u8 pcicfg;
+       void *iomap[5];
        static struct ata_probe_ent probe[2];
        int ports = 0;
 
@@ -236,6 +237,16 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_devic
                return -ENODEV;
        }
 
+       /* Map IO ports */
+       iomap[0] = devm_ioport_map(&dev->dev, 0x1F0, 8);
+       iomap[1] = devm_ioport_map(&dev->dev, 0x3F6, 1);
+       iomap[2] = devm_ioport_map(&dev->dev, 0x170, 8);
+       iomap[3] = devm_ioport_map(&dev->dev, 0x376, 1);
+       iomap[4] = pcim_iomap(dev, 2, 0);
+
+       if (!iomap[0] || !iomap[1] || !iomap[2] || !iomap[3] || !iomap[4])
+               return -ENOMEM;
+
        /* We have to do our own plumbing as the PCI setup for this
           chipset is non-standard so we can't punt to the libata code */
 
@@ -249,10 +260,10 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_devic
        probe[0].irq_flags = 0;
        probe[0].port_flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST;
        probe[0].n_ports = 1;
-       probe[0].port[0].cmd_addr = 0x1F0;
-       probe[0].port[0].ctl_addr = 0x3F6;
-       probe[0].port[0].altstatus_addr = 0x3F6;
-       probe[0].port[0].bmdma_addr = pci_resource_start(dev, 2);
+       probe[0].port[0].cmd_addr = iomap[0];
+       probe[0].port[0].ctl_addr = iomap[1];
+       probe[0].port[0].altstatus_addr = iomap[1];
+       probe[0].port[0].bmdma_addr = iomap[4];
 
        /* The secondary lurks at different addresses but is otherwise
           the same beastie */
@@ -260,10 +271,10 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_devic
        probe[1] = probe[0];
        INIT_LIST_HEAD(&probe[1].node);
        probe[1].irq = 15;
-       probe[1].port[0].cmd_addr = 0x170;
-       probe[1].port[0].ctl_addr = 0x376;
-       probe[1].port[0].altstatus_addr = 0x376;
-       probe[1].port[0].bmdma_addr = pci_resource_start(dev, 2) + 8;
+       probe[1].port[0].cmd_addr = iomap[2];
+       probe[1].port[0].ctl_addr = iomap[3];
+       probe[1].port[0].altstatus_addr = iomap[3];
+       probe[1].port[0].bmdma_addr = iomap[4] + 8;
 
        /* Let libata fill in the port details */
        ata_std_ports(&probe[0].port[0]);
@@ -294,7 +305,7 @@ static void __devexit cs5520_remove_one(struct pci_dev *pdev)
        struct device *dev = pci_dev_to_dev(pdev);
        struct ata_host *host = dev_get_drvdata(dev);
 
-       ata_host_remove(host);
+       ata_host_detach(host);
        dev_set_drvdata(dev, NULL);
 }
 
@@ -305,7 +316,7 @@ static void __devexit cs5520_remove_one(struct pci_dev *pdev)
  *     Do any reconfiguration work needed by a resume from RAM. We need
  *     to restore DMA mode support on BIOSen which disabled it
  */
+
 static int cs5520_reinit_one(struct pci_dev *pdev)
 {
        u8 pcicfg;
index b1ca207e3545dcdce0b828806ded54db5a39891e..3d7b7d87ec6f3a49647a0b5a6a9ab0ff4e4703bf 100644 (file)
 #define DRV_NAME       "pata_cs5530"
 #define DRV_VERSION    "0.7.1"
 
+static void __iomem *cs5530_port_base(struct ata_port *ap)
+{
+       unsigned long bmdma = (unsigned long)ap->ioaddr.bmdma_addr;
+
+       return (void __iomem *)((bmdma & ~0x0F) + 0x20 + 0x10 * ap->port_no);
+}
+
 /**
  *     cs5530_set_piomode              -       PIO setup
  *     @ap: ATA interface
@@ -52,19 +59,19 @@ static void cs5530_set_piomode(struct ata_port *ap, struct ata_device *adev)
                {0x00009172, 0x00012171, 0x00020080, 0x00032010, 0x00040010},
                {0xd1329172, 0x71212171, 0x30200080, 0x20102010, 0x00100010}
        };
-       unsigned long base = ( ap->ioaddr.bmdma_addr & ~0x0F) + 0x20 + 0x10 * ap->port_no;
+       void __iomem *base = cs5530_port_base(ap);
        u32 tuning;
        int format;
 
        /* Find out which table to use */
-       tuning = inl(base + 0x04);
+       tuning = ioread32(base + 0x04);
        format = (tuning & 0x80000000UL) ? 1 : 0;
 
        /* Now load the right timing register */
        if (adev->devno)
                base += 0x08;
 
-       outl(cs5530_pio_timings[format][adev->pio_mode - XFER_PIO_0], base);
+       iowrite32(cs5530_pio_timings[format][adev->pio_mode - XFER_PIO_0], base);
 }
 
 /**
@@ -79,12 +86,12 @@ static void cs5530_set_piomode(struct ata_port *ap, struct ata_device *adev)
 
 static void cs5530_set_dmamode(struct ata_port *ap, struct ata_device *adev)
 {
-       unsigned long base = ( ap->ioaddr.bmdma_addr & ~0x0F) + 0x20 + 0x10 * ap->port_no;
+       void __iomem *base = cs5530_port_base(ap);
        u32 tuning, timing = 0;
        u8 reg;
 
        /* Find out which table to use */
-       tuning = inl(base + 0x04);
+       tuning = ioread32(base + 0x04);
 
        switch(adev->dma_mode) {
                case XFER_UDMA_0:
@@ -105,20 +112,20 @@ static void cs5530_set_dmamode(struct ata_port *ap, struct ata_device *adev)
        /* Merge in the PIO format bit */
        timing |= (tuning & 0x80000000UL);
        if (adev->devno == 0) /* Master */
-               outl(timing, base + 0x04);
+               iowrite32(timing, base + 0x04);
        else {
                if (timing & 0x00100000)
                        tuning |= 0x00100000;   /* UDMA for both */
                else
                        tuning &= ~0x00100000;  /* MWDMA for both */
-               outl(tuning, base + 0x04);
-               outl(timing, base + 0x0C);
+               iowrite32(tuning, base + 0x04);
+               iowrite32(timing, base + 0x0C);
        }
 
        /* Set the DMA capable bit in the BMDMA area */
-       reg = inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
+       reg = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
        reg |= (1 << (5 + adev->devno));
-       outb(reg, ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
+       iowrite8(reg, ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
 
        /* Remember the last DMA setup we did */
 
@@ -210,14 +217,14 @@ static struct ata_port_operations cs5530_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = cs5530_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct dmi_system_id palmax_dmi_table[] = {
@@ -247,7 +254,7 @@ static int cs5530_is_palmax(void)
  *     Perform the chip initialisation work that is shared between both
  *     setup and resume paths
  */
+
 static int cs5530_init_chip(void)
 {
        struct pci_dev *master_0 = NULL, *cs5530_0 = NULL, *dev = NULL;
@@ -357,11 +364,11 @@ static int cs5530_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
                .port_ops = &cs5530_port_ops
        };
        static struct ata_port_info *port_info[2] = { &info, &info };
-       
+
        /* Chip initialisation */
        if (cs5530_init_chip())
                return -ENODEV;
-               
+
        if (cs5530_is_palmax())
                port_info[1] = &info_palmax_secondary;
 
@@ -376,7 +383,7 @@ static int cs5530_reinit_one(struct pci_dev *pdev)
                BUG();
        return ata_pci_device_resume(pdev);
 }
-       
+
 static const struct pci_device_id cs5530[] = {
        { PCI_VDEVICE(CYRIX, PCI_DEVICE_ID_CYRIX_5530_IDE), },
 
index e3efec4ffc79ada787f54d8b612b6cf1db294168..17bc693cc5149b34e69e74879da4635d4aeb0046 100644 (file)
@@ -214,14 +214,14 @@ static struct ata_port_operations cs5535_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
index e2a95699bae7ff293ef1eb29fa5d859db3ccefd8..63f48f08763db323bc7e76984f5e1a6f6a62274c 100644 (file)
@@ -165,14 +165,14 @@ static struct ata_port_operations cy82c693_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int cy82c693_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
index edf8a63f50af3afe6b54d93a0deffa5da252dcb7..c19b6a8a7dc6c5afc6b433f6e2746cffb5edfa91 100644 (file)
@@ -261,14 +261,14 @@ static const struct ata_port_operations efar_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 
index 2663599a7c02fb041f7e1ac0485164af6ee706f4..27d724b5eea2c138a54c5314290f3b031fdf4a9f 100644 (file)
@@ -151,23 +151,13 @@ static const char *bad_ata66_3[] = {
 
 static int hpt_dma_blacklisted(const struct ata_device *dev, char *modestr, const char *list[])
 {
-       unsigned char model_num[40];
-       char *s;
-       unsigned int len;
+       unsigned char model_num[ATA_ID_PROD_LEN + 1];
        int i = 0;
 
-       ata_id_string(dev->id, model_num, ATA_ID_PROD_OFS, sizeof(model_num));
-       s = &model_num[0];
-       len = strnlen(s, sizeof(model_num));
+       ata_id_c_string(dev->id, model_num, ATA_ID_PROD, sizeof(model_num));
 
-       /* ATAPI specifies that empty space is blank-filled; remove blanks */
-       while ((len > 0) && (s[len - 1] == ' ')) {
-               len--;
-               s[len] = 0;
-       }
-
-       while(list[i] != NULL) {
-               if (!strncmp(list[i], s, len)) {
+       while (list[i] != NULL) {
+               if (!strcmp(list[i], model_num)) {
                        printk(KERN_WARNING DRV_NAME ": %s is not supported for %s.\n",
                                modestr, list[i]);
                        return 1;
@@ -232,7 +222,7 @@ static int hpt36x_pre_reset(struct ata_port *ap)
 
        if (!pci_test_config_bits(pdev, &hpt36x_enable_bits[ap->port_no]))
                return -ENOENT;
-               
+
        pci_read_config_byte(pdev, 0x5A, &ata66);
        if (ata66 & (1 << ap->port_no))
                ap->cbl = ATA_CBL_PATA40;
@@ -371,14 +361,14 @@ static struct ata_port_operations hpt366_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
index dfb306057cf465c9e5f48eff8abdb55e633e6f6a..4ffc392052c02f1a2dfb4769d06cace005e84abd 100644 (file)
@@ -349,24 +349,13 @@ static u32 hpt37x_find_mode(struct ata_port *ap, int speed)
 
 static int hpt_dma_blacklisted(const struct ata_device *dev, char *modestr, const char *list[])
 {
-       unsigned char model_num[40];
-       char *s;
-       unsigned int len;
+       unsigned char model_num[ATA_ID_PROD_LEN + 1];
        int i = 0;
 
-       ata_id_string(dev->id, model_num, ATA_ID_PROD_OFS,
-                         sizeof(model_num));
-       s = &model_num[0];
-       len = strnlen(s, sizeof(model_num));
+       ata_id_c_string(dev->id, model_num, ATA_ID_PROD, sizeof(model_num));
 
-       /* ATAPI specifies that empty space is blank-filled; remove blanks */
-       while ((len > 0) && (s[len - 1] == ' ')) {
-               len--;
-               s[len] = 0;
-       }
-
-       while(list[i] != NULL) {
-               if (!strncmp(list[i], s, len)) {
+       while (list[i] != NULL) {
+               if (!strcmp(list[i], model_num)) {
                        printk(KERN_WARNING DRV_NAME ": %s is not supported for %s.\n",
                                modestr, list[i]);
                        return 1;
@@ -459,7 +448,7 @@ static int hpt37x_pre_reset(struct ata_port *ap)
        };
        if (!pci_test_config_bits(pdev, &hpt37x_enable_bits[ap->port_no]))
                return -ENOENT;
-               
+
        pci_read_config_byte(pdev, 0x5B, &scr2);
        pci_write_config_byte(pdev, 0x5B, scr2 & ~0x01);
        /* Cable register now active */
@@ -504,7 +493,7 @@ static int hpt374_pre_reset(struct ata_port *ap)
 
        if (!pci_test_config_bits(pdev, &hpt37x_enable_bits[ap->port_no]))
                return -ENOENT;
-               
+
        /* Do the extra channel work */
        pci_read_config_word(pdev, 0x52, &mcr3);
        pci_read_config_word(pdev, 0x56, &mcr6);
@@ -645,24 +634,24 @@ static void hpt370_bmdma_stop(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
        struct pci_dev *pdev = to_pci_dev(ap->host->dev);
-       u8 dma_stat = inb(ap->ioaddr.bmdma_addr + 2);
+       u8 dma_stat = ioread8(ap->ioaddr.bmdma_addr + 2);
        u8 dma_cmd;
-       unsigned long bmdma = ap->ioaddr.bmdma_addr;
+       void __iomem *bmdma = ap->ioaddr.bmdma_addr;
 
        if (dma_stat & 0x01) {
                udelay(20);
-               dma_stat = inb(bmdma + 2);
+               dma_stat = ioread8(bmdma + 2);
        }
        if (dma_stat & 0x01) {
                /* Clear the engine */
                pci_write_config_byte(pdev, 0x50 + 4 * ap->port_no, 0x37);
                udelay(10);
                /* Stop DMA */
-               dma_cmd = inb(bmdma );
-               outb(dma_cmd & 0xFE, bmdma);
+               dma_cmd = ioread8(bmdma );
+               iowrite8(dma_cmd & 0xFE, bmdma);
                /* Clear Error */
-               dma_stat = inb(bmdma + 2);
-               outb(dma_stat | 0x06 , bmdma + 2);
+               dma_stat = ioread8(bmdma + 2);
+               iowrite8(dma_stat | 0x06 , bmdma + 2);
                /* Clear the engine */
                pci_write_config_byte(pdev, 0x50 + 4 * ap->port_no, 0x37);
                udelay(10);
@@ -807,14 +796,14 @@ static struct ata_port_operations hpt370_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -846,14 +835,14 @@ static struct ata_port_operations hpt370a_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -886,14 +875,14 @@ static struct ata_port_operations hpt372_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -926,14 +915,14 @@ static struct ata_port_operations hpt374_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
index 886fab9aa62c5cdaec19c0036e3b32eb1cf3148c..65f2e180e7fa285644e9bf38522d39846da446b5 100644 (file)
@@ -263,26 +263,26 @@ static void hpt3x2n_bmdma_stop(struct ata_queued_cmd *qc)
 
 static void hpt3x2n_set_clock(struct ata_port *ap, int source)
 {
-       unsigned long bmdma = ap->ioaddr.bmdma_addr;
+       void __iomem *bmdma = ap->ioaddr.bmdma_addr;
 
        /* Tristate the bus */
-       outb(0x80, bmdma+0x73);
-       outb(0x80, bmdma+0x77);
+       iowrite8(0x80, bmdma+0x73);
+       iowrite8(0x80, bmdma+0x77);
 
        /* Switch clock and reset channels */
-       outb(source, bmdma+0x7B);
-       outb(0xC0, bmdma+0x79);
+       iowrite8(source, bmdma+0x7B);
+       iowrite8(0xC0, bmdma+0x79);
 
        /* Reset state machines */
-       outb(0x37, bmdma+0x70);
-       outb(0x37, bmdma+0x74);
+       iowrite8(0x37, bmdma+0x70);
+       iowrite8(0x37, bmdma+0x74);
 
        /* Complete reset */
-       outb(0x00, bmdma+0x79);
+       iowrite8(0x00, bmdma+0x79);
 
        /* Reconnect channels to bus */
-       outb(0x00, bmdma+0x73);
-       outb(0x00, bmdma+0x77);
+       iowrite8(0x00, bmdma+0x73);
+       iowrite8(0x00, bmdma+0x77);
 }
 
 /* Check if our partner interface is busy */
@@ -373,14 +373,14 @@ static struct ata_port_operations hpt3x2n_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = hpt3x2n_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
index 5f1d385eb592da1f2c9d6a4c8cb382afc9b6f7b0..483ce7c12c9ac61da2e614e2f798ceb983abbaef 100644 (file)
@@ -148,14 +148,14 @@ static struct ata_port_operations hpt3x3_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
@@ -164,7 +164,7 @@ static struct ata_port_operations hpt3x3_port_ops = {
  *
  *     Perform the setup required at boot and on resume.
  */
+
 static void hpt3x3_init_chipset(struct pci_dev *dev)
 {
        u16 cmd;
index a97d55ae95c9e6809e450befd37fdf5df32bc98e..1bf5ec18b2e31490b350eb041773f04b265ad099 100644 (file)
@@ -53,14 +53,14 @@ static struct ata_port_operations isapnp_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
@@ -75,6 +75,7 @@ static struct ata_port_operations isapnp_port_ops = {
 static int isapnp_init_one(struct pnp_dev *idev, const struct pnp_device_id *dev_id)
 {
        struct ata_probe_ent ae;
+       void __iomem *cmd_addr, *ctl_addr;
 
        if (pnp_port_valid(idev, 0) == 0)
                return -ENODEV;
@@ -83,6 +84,10 @@ static int isapnp_init_one(struct pnp_dev *idev, const struct pnp_device_id *dev
        if (pnp_irq_valid(idev, 0) == 0)
                return -ENODEV;
 
+       cmd_addr = devm_ioport_map(&idev->dev, pnp_port_start(idev, 0), 8);
+       if (!cmd_addr)
+               return -ENOMEM;
+
        memset(&ae, 0, sizeof(struct ata_probe_ent));
        INIT_LIST_HEAD(&ae.node);
        ae.dev = &idev->dev;
@@ -93,11 +98,13 @@ static int isapnp_init_one(struct pnp_dev *idev, const struct pnp_device_id *dev
        ae.irq = pnp_irq(idev, 0);
        ae.irq_flags = 0;
        ae.port_flags = ATA_FLAG_SLAVE_POSS;
-       ae.port[0].cmd_addr = pnp_port_start(idev, 0);
+       ae.port[0].cmd_addr = cmd_addr;
 
        if (pnp_port_valid(idev, 1) == 0) {
-               ae.port[0].altstatus_addr = pnp_port_start(idev, 1);
-               ae.port[0].ctl_addr = pnp_port_start(idev, 1);
+               ctl_addr = devm_ioport_map(&idev->dev,
+                                          pnp_port_start(idev, 1), 1);
+               ae.port[0].altstatus_addr = ctl_addr;
+               ae.port[0].ctl_addr = ctl_addr;
                ae.port_flags |= ATA_FLAG_SRST;
        }
        ata_std_ports(&ae.port[0]);
@@ -120,7 +127,7 @@ static void isapnp_remove_one(struct pnp_dev *idev)
        struct device *dev = &idev->dev;
        struct ata_host *host = dev_get_drvdata(dev);
 
-       ata_host_remove(host);
+       ata_host_detach(host);
        dev_set_drvdata(dev, NULL);
 }
 
diff --git a/drivers/ata/pata_it8213.c b/drivers/ata/pata_it8213.c
new file mode 100644 (file)
index 0000000..7eac869
--- /dev/null
@@ -0,0 +1,354 @@
+/*
+ *    pata_it8213.c - iTE Tech. Inc.  IT8213 PATA driver
+ *
+ *    The IT8213 is a very Intel ICH like device for timing purposes, having
+ *    a similar register layout and the same split clock arrangement. Cable
+ *    detection is different, and it does not have slave channels or all the
+ *    clutter of later ICH/SATA setups.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+#include <linux/blkdev.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <scsi/scsi_host.h>
+#include <linux/libata.h>
+#include <linux/ata.h>
+
+#define DRV_NAME       "pata_it8213"
+#define DRV_VERSION    "0.0.2"
+
+/**
+ *     it8213_pre_reset        -       check for 40/80 pin
+ *     @ap: Port
+ *
+ *     Perform cable detection for the 8213 ATA interface. This is
+ *     different to the PIIX arrangement
+ */
+
+static int it8213_pre_reset(struct ata_port *ap)
+{
+       static const struct pci_bits it8213_enable_bits[] = {
+               { 0x41U, 1U, 0x80UL, 0x80UL },  /* port 0 */
+       };
+
+       struct pci_dev *pdev = to_pci_dev(ap->host->dev);
+       u8 tmp;
+
+       if (!pci_test_config_bits(pdev, &it8213_enable_bits[ap->port_no]))
+               return -ENOENT;
+
+       pci_read_config_byte(pdev, 0x42, &tmp);
+       if (tmp & 2)    /* The initial docs are incorrect */
+               ap->cbl = ATA_CBL_PATA40;
+       else
+               ap->cbl = ATA_CBL_PATA80;
+       return ata_std_prereset(ap);
+}
+
+/**
+ *     it8213_probe_reset - Probe specified port on PATA host controller
+ *     @ap: Port to probe
+ *
+ *     LOCKING:
+ *     None (inherited from caller).
+ */
+
+static void it8213_error_handler(struct ata_port *ap)
+{
+       ata_bmdma_drive_eh(ap, it8213_pre_reset, ata_std_softreset, NULL, ata_std_postreset);
+}
+
+/**
+ *     it8213_set_piomode - Initialize host controller PATA PIO timings
+ *     @ap: Port whose timings we are configuring
+ *     @adev: um
+ *
+ *     Set PIO mode for device, in host controller PCI config space.
+ *
+ *     LOCKING:
+ *     None (inherited from caller).
+ */
+
+static void it8213_set_piomode (struct ata_port *ap, struct ata_device *adev)
+{
+       unsigned int pio        = adev->pio_mode - XFER_PIO_0;
+       struct pci_dev *dev     = to_pci_dev(ap->host->dev);
+       unsigned int idetm_port= ap->port_no ? 0x42 : 0x40;
+       u16 idetm_data;
+       int control = 0;
+
+       /*
+        *      See Intel Document 298600-004 for the timing programing rules
+        *      for PIIX/ICH. The 8213 is a clone so very similar
+        */
+
+       static const     /* ISP  RTC */
+       u8 timings[][2] = { { 0, 0 },
+                           { 0, 0 },
+                           { 1, 0 },
+                           { 2, 1 },
+                           { 2, 3 }, };
+
+       if (pio > 2)
+               control |= 1;   /* TIME1 enable */
+       if (ata_pio_need_iordy(adev))   /* PIO 3/4 require IORDY */
+               control |= 2;   /* IORDY enable */
+       /* Bit 2 is set for ATAPI on the IT8213 - reverse of ICH/PIIX */
+       if (adev->class != ATA_DEV_ATA)
+               control |= 4;
+
+       pci_read_config_word(dev, idetm_port, &idetm_data);
+
+       /* Enable PPE, IE and TIME as appropriate */
+
+       if (adev->devno == 0) {
+               idetm_data &= 0xCCF0;
+               idetm_data |= control;
+               idetm_data |= (timings[pio][0] << 12) |
+                       (timings[pio][1] << 8);
+       } else {
+               u8 slave_data;
+
+               idetm_data &= 0xCC0F;
+               idetm_data |= (control << 4);
+
+               /* Slave timing in seperate register */
+               pci_read_config_byte(dev, 0x44, &slave_data);
+               slave_data &= 0xF0;
+               slave_data |= ((timings[pio][0] << 2) | timings[pio][1]) << 4;
+               pci_write_config_byte(dev, 0x44, slave_data);
+       }
+
+       idetm_data |= 0x4000;   /* Ensure SITRE is enabled */
+       pci_write_config_word(dev, idetm_port, idetm_data);
+}
+
+/**
+ *     it8213_set_dmamode - Initialize host controller PATA DMA timings
+ *     @ap: Port whose timings we are configuring
+ *     @adev: Device to program
+ *
+ *     Set UDMA/MWDMA mode for device, in host controller PCI config space.
+ *     This device is basically an ICH alike.
+ *
+ *     LOCKING:
+ *     None (inherited from caller).
+ */
+
+static void it8213_set_dmamode (struct ata_port *ap, struct ata_device *adev)
+{
+       struct pci_dev *dev     = to_pci_dev(ap->host->dev);
+       u16 master_data;
+       u8 speed                = adev->dma_mode;
+       int devid               = adev->devno;
+       u8 udma_enable;
+
+       static const     /* ISP  RTC */
+       u8 timings[][2] = { { 0, 0 },
+                           { 0, 0 },
+                           { 1, 0 },
+                           { 2, 1 },
+                           { 2, 3 }, };
+
+       pci_read_config_word(dev, 0x40, &master_data);
+       pci_read_config_byte(dev, 0x48, &udma_enable);
+
+       if (speed >= XFER_UDMA_0) {
+               unsigned int udma = adev->dma_mode - XFER_UDMA_0;
+               u16 udma_timing;
+               u16 ideconf;
+               int u_clock, u_speed;
+
+               /* Clocks follow the PIIX style */
+               u_speed = min(2 - (udma & 1), udma);
+               if (udma == 5)
+                       u_clock = 0x1000;       /* 100Mhz */
+               else if (udma > 2)
+                       u_clock = 1;            /* 66Mhz */
+               else
+                       u_clock = 0;            /* 33Mhz */
+
+               udma_enable |= (1 << devid);
+
+               /* Load the UDMA mode number */
+               pci_read_config_word(dev, 0x4A, &udma_timing);
+               udma_timing &= ~(3 << (4 * devid));
+               udma_timing |= (udma & 3) << (4 * devid);
+               pci_write_config_word(dev, 0x4A, udma_timing);
+
+               /* Load the clock selection */
+               pci_read_config_word(dev, 0x54, &ideconf);
+               ideconf &= ~(0x1001 << devid);
+               ideconf |= u_clock << devid;
+               pci_write_config_word(dev, 0x54, ideconf);
+       } else {
+               /*
+                * MWDMA is driven by the PIO timings. We must also enable
+                * IORDY unconditionally along with TIME1. PPE has already
+                * been set when the PIO timing was set.
+                */
+               unsigned int mwdma      = adev->dma_mode - XFER_MW_DMA_0;
+               unsigned int control;
+               u8 slave_data;
+               static const unsigned int needed_pio[3] = {
+                       XFER_PIO_0, XFER_PIO_3, XFER_PIO_4
+               };
+               int pio = needed_pio[mwdma] - XFER_PIO_0;
+
+               control = 3;    /* IORDY|TIME1 */
+
+               /* If the drive MWDMA is faster than it can do PIO then
+                  we must force PIO into PIO0 */
+
+               if (adev->pio_mode < needed_pio[mwdma])
+                       /* Enable DMA timing only */
+                       control |= 8;   /* PIO cycles in PIO0 */
+
+               if (devid) {    /* Slave */
+                       master_data &= 0xFF4F;  /* Mask out IORDY|TIME1|DMAONLY */
+                       master_data |= control << 4;
+                       pci_read_config_byte(dev, 0x44, &slave_data);
+                       slave_data &= (0x0F + 0xE1 * ap->port_no);
+                       /* Load the matching timing */
+                       slave_data |= ((timings[pio][0] << 2) | timings[pio][1]) << (ap->port_no ? 4 : 0);
+                       pci_write_config_byte(dev, 0x44, slave_data);
+               } else {        /* Master */
+                       master_data &= 0xCCF4;  /* Mask out IORDY|TIME1|DMAONLY
+                                                  and master timing bits */
+                       master_data |= control;
+                       master_data |=
+                               (timings[pio][0] << 12) |
+                               (timings[pio][1] << 8);
+               }
+               udma_enable &= ~(1 << devid);
+               pci_write_config_word(dev, 0x40, master_data);
+       }
+       pci_write_config_byte(dev, 0x48, udma_enable);
+}
+
+static struct scsi_host_template it8213_sht = {
+       .module                 = THIS_MODULE,
+       .name                   = DRV_NAME,
+       .ioctl                  = ata_scsi_ioctl,
+       .queuecommand           = ata_scsi_queuecmd,
+       .can_queue              = ATA_DEF_QUEUE,
+       .this_id                = ATA_SHT_THIS_ID,
+       .sg_tablesize           = LIBATA_MAX_PRD,
+       .max_sectors            = ATA_MAX_SECTORS,
+       .cmd_per_lun            = ATA_SHT_CMD_PER_LUN,
+       .emulated               = ATA_SHT_EMULATED,
+       .use_clustering         = ATA_SHT_USE_CLUSTERING,
+       .proc_name              = DRV_NAME,
+       .dma_boundary           = ATA_DMA_BOUNDARY,
+       .slave_configure        = ata_scsi_slave_config,
+       .bios_param             = ata_std_bios_param,
+       .resume                 = ata_scsi_device_resume,
+       .suspend                = ata_scsi_device_suspend,
+};
+
+static const struct ata_port_operations it8213_ops = {
+       .port_disable           = ata_port_disable,
+       .set_piomode            = it8213_set_piomode,
+       .set_dmamode            = it8213_set_dmamode,
+       .mode_filter            = ata_pci_default_filter,
+
+       .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,
+
+       .freeze                 = ata_bmdma_freeze,
+       .thaw                   = ata_bmdma_thaw,
+       .error_handler          = it8213_error_handler,
+       .post_internal_cmd      = ata_bmdma_post_internal_cmd,
+
+       .bmdma_setup            = ata_bmdma_setup,
+       .bmdma_start            = ata_bmdma_start,
+       .bmdma_stop             = ata_bmdma_stop,
+       .bmdma_status           = ata_bmdma_status,
+       .qc_prep                = ata_qc_prep,
+       .qc_issue               = ata_qc_issue_prot,
+       .data_xfer              = ata_data_xfer,
+
+       .irq_handler            = ata_interrupt,
+       .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
+
+       .port_start             = ata_port_start,
+};
+
+
+/**
+ *     it8213_init_one - Register 8213 ATA PCI device with kernel services
+ *     @pdev: PCI device to register
+ *     @ent: Entry in it8213_pci_tbl matching with @pdev
+ *
+ *     Called from kernel PCI layer.
+ *
+ *     LOCKING:
+ *     Inherited from PCI layer (may sleep).
+ *
+ *     RETURNS:
+ *     Zero on success, or -ERRNO value.
+ */
+
+static int it8213_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
+{
+       static int printed_version;
+       static struct ata_port_info info = {
+               .sht            = &it8213_sht,
+               .flags          = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST,
+               .pio_mask       = 0x1f, /* pio0-4 */
+               .mwdma_mask     = 0x07, /* mwdma0-2 */
+               .udma_mask      = 0x1f, /* UDMA 100 */
+               .port_ops       = &it8213_ops,
+       };
+       static struct ata_port_info *port_info[2] = { &info, &info };
+
+       if (!printed_version++)
+               dev_printk(KERN_DEBUG, &pdev->dev,
+                          "version " DRV_VERSION "\n");
+
+       /* Current IT8213 stuff is single port */
+       return ata_pci_init_one(pdev, port_info, 1);
+}
+
+static const struct pci_device_id it8213_pci_tbl[] = {
+       { PCI_VDEVICE(ITE, PCI_DEVICE_ID_ITE_8213), },
+
+       { }     /* terminate list */
+};
+
+static struct pci_driver it8213_pci_driver = {
+       .name                   = DRV_NAME,
+       .id_table               = it8213_pci_tbl,
+       .probe                  = it8213_init_one,
+       .remove                 = ata_pci_remove_one,
+       .suspend                = ata_pci_device_suspend,
+       .resume                 = ata_pci_device_resume,
+};
+
+static int __init it8213_init(void)
+{
+       return pci_register_driver(&it8213_pci_driver);
+}
+
+static void __exit it8213_exit(void)
+{
+       pci_unregister_driver(&it8213_pci_driver);
+}
+
+module_init(it8213_init);
+module_exit(it8213_exit);
+
+MODULE_AUTHOR("Alan Cox");
+MODULE_DESCRIPTION("SCSI low-level driver for the ITE 8213");
+MODULE_LICENSE("GPL");
+MODULE_DEVICE_TABLE(pci, it8213_pci_tbl);
+MODULE_VERSION(DRV_VERSION);
index e8afd486434a6d1ce92a3e4b56bf5b08572f8823..73394c75be4254fac5c0624c7b0ea23747279fdc 100644 (file)
@@ -492,7 +492,7 @@ static int it821x_smart_set_mode(struct ata_port *ap, struct ata_device **unused
        /* Bits 5 and 6 indicate if DMA is active on master/slave */
        /* It is possible that BMDMA isn't allocated */
        if (ap->ioaddr.bmdma_addr)
-               dma_enabled = inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
+               dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
 
        for (i = 0; i < ATA_MAX_DEVICES; i++) {
                struct ata_device *dev = &ap->device[i];
@@ -531,23 +531,9 @@ static int it821x_smart_set_mode(struct ata_port *ap, struct ata_device **unused
 
 static void it821x_dev_config(struct ata_port *ap, struct ata_device *adev)
 {
-       unsigned char model_num[40];
-       char *s;
-       unsigned int len;
-
-       /* This block ought to be a library routine as it is in several
-          drivers now */
-
-       ata_id_string(adev->id, model_num, ATA_ID_PROD_OFS,
-                         sizeof(model_num));
-       s = &model_num[0];
-       len = strnlen(s, sizeof(model_num));
-
-       /* ATAPI specifies that empty space is blank-filled; remove blanks */
-       while ((len > 0) && (s[len - 1] == ' ')) {
-               len--;
-               s[len] = 0;
-       }
+       unsigned char model_num[ATA_ID_PROD_LEN + 1];
+
+       ata_id_c_string(adev->id, model_num, ATA_ID_PROD, sizeof(model_num));
 
        if (adev->max_sectors > 255)
                adev->max_sectors = 255;
@@ -608,14 +594,10 @@ static int it821x_port_start(struct ata_port *ap)
        if (ret < 0)
                return ret;
 
-       ap->private_data = kmalloc(sizeof(struct it821x_dev), GFP_KERNEL);
-       if (ap->private_data == NULL) {
-               ata_port_stop(ap);
+       itdev = devm_kzalloc(&pdev->dev, sizeof(struct it821x_dev), GFP_KERNEL);
+       if (itdev == NULL)
                return -ENOMEM;
-       }
-
-       itdev = ap->private_data;
-       memset(itdev, 0, sizeof(struct it821x_dev));
+       ap->private_data = itdev;
 
        pci_read_config_byte(pdev, 0x50, &conf);
 
@@ -646,20 +628,6 @@ static int it821x_port_start(struct ata_port *ap)
        return 0;
 }
 
-/**
- *     it821x_port_stop        -       port shutdown
- *     @ap: ATA port being removed
- *
- *     Release the private objects we added in it821x_port_start
- */
-
-static void it821x_port_stop(struct ata_port *ap) {
-       kfree(ap->private_data);
-       ap->private_data = NULL;        /* We want an OOPS if we reuse this
-                                          too late! */
-       ata_port_stop(ap);
-}
-
 static struct scsi_host_template it821x_sht = {
        .module                 = THIS_MODULE,
        .name                   = DRV_NAME,
@@ -706,14 +674,14 @@ static struct ata_port_operations it821x_smart_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = it821x_smart_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = it821x_port_start,
-       .port_stop      = it821x_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations it821x_passthru_port_ops = {
@@ -742,14 +710,14 @@ static struct ata_port_operations it821x_passthru_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = it821x_passthru_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_clear      = ata_bmdma_irq_clear,
        .irq_handler    = ata_interrupt,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = it821x_port_start,
-       .port_stop      = it821x_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static void __devinit it821x_disable_raid(struct pci_dev *pdev)
index 23b8aab3ebd8f876fff754736cb0b18bad8f1b7d..3222ac7b945d43637295ed8f9d349df8ce937367 100644 (file)
@@ -95,14 +95,6 @@ static void ixp4xx_irq_clear(struct ata_port *ap)
 {
 }
 
-static void ixp4xx_host_stop (struct ata_host *host)
-{
-       struct ixp4xx_pata_data *data = host->dev->platform_data;
-
-       iounmap(data->cs0);
-       iounmap(data->cs1);
-}
-
 static struct scsi_host_template ixp4xx_sht = {
        .module                 = THIS_MODULE,
        .name                   = DRV_NAME,
@@ -139,10 +131,10 @@ static struct ata_port_operations ixp4xx_port_ops = {
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ixp4xx_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ixp4xx_host_stop,
 
        .phy_reset      = ixp4xx_phy_reset,
 };
@@ -150,9 +142,9 @@ static struct ata_port_operations ixp4xx_port_ops = {
 static void ixp4xx_setup_port(struct ata_ioports *ioaddr,
                                struct ixp4xx_pata_data *data)
 {
-       ioaddr->cmd_addr        = (unsigned long) data->cs0;
-       ioaddr->altstatus_addr  = (unsigned long) data->cs1 + 0x06;
-       ioaddr->ctl_addr        = (unsigned long) data->cs1 + 0x06;
+       ioaddr->cmd_addr        = data->cs0;
+       ioaddr->altstatus_addr  = data->cs1 + 0x06;
+       ioaddr->ctl_addr        = data->cs1 + 0x06;
 
        ata_std_ports(ioaddr);
 
@@ -162,19 +154,19 @@ static void ixp4xx_setup_port(struct ata_ioports *ioaddr,
         * ixp4xx in little endian mode.
         */
 
-       ioaddr->data_addr       ^= 0x02;
-       ioaddr->cmd_addr        ^= 0x03;
-       ioaddr->altstatus_addr  ^= 0x03;
-       ioaddr->ctl_addr        ^= 0x03;
-       ioaddr->error_addr      ^= 0x03;
-       ioaddr->feature_addr    ^= 0x03;
-       ioaddr->nsect_addr      ^= 0x03;
-       ioaddr->lbal_addr       ^= 0x03;
-       ioaddr->lbam_addr       ^= 0x03;
-       ioaddr->lbah_addr       ^= 0x03;
-       ioaddr->device_addr     ^= 0x03;
-       ioaddr->status_addr     ^= 0x03;
-       ioaddr->command_addr    ^= 0x03;
+       *(unsigned long *)&ioaddr->data_addr            ^= 0x02;
+       *(unsigned long *)&ioaddr->cmd_addr             ^= 0x03;
+       *(unsigned long *)&ioaddr->altstatus_addr       ^= 0x03;
+       *(unsigned long *)&ioaddr->ctl_addr             ^= 0x03;
+       *(unsigned long *)&ioaddr->error_addr           ^= 0x03;
+       *(unsigned long *)&ioaddr->feature_addr         ^= 0x03;
+       *(unsigned long *)&ioaddr->nsect_addr           ^= 0x03;
+       *(unsigned long *)&ioaddr->lbal_addr            ^= 0x03;
+       *(unsigned long *)&ioaddr->lbam_addr            ^= 0x03;
+       *(unsigned long *)&ioaddr->lbah_addr            ^= 0x03;
+       *(unsigned long *)&ioaddr->device_addr          ^= 0x03;
+       *(unsigned long *)&ioaddr->status_addr          ^= 0x03;
+       *(unsigned long *)&ioaddr->command_addr         ^= 0x03;
 #endif
 }
 
@@ -195,8 +187,8 @@ static __devinit int ixp4xx_pata_probe(struct platform_device *pdev)
 
        pdev->dev.coherent_dma_mask = DMA_32BIT_MASK;
 
-       data->cs0 = ioremap(cs0->start, 0x1000);
-       data->cs1 = ioremap(cs1->start, 0x1000);
+       data->cs0 = devm_ioremap(&pdev->dev, cs0->start, 0x1000);
+       data->cs1 = devm_ioremap(&pdev->dev, cs1->start, 0x1000);
 
        irq = platform_get_irq(pdev, 0);
        if (irq)
@@ -238,7 +230,7 @@ static __devexit int ixp4xx_pata_remove(struct platform_device *dev)
 {
        struct ata_host *host = platform_get_drvdata(dev);
 
-       ata_host_remove(host);
+       ata_host_detach(host);
        platform_set_drvdata(dev, NULL);
 
        return 0;
index d50264af284811d164b231f4a4d01e352b8751d0..7a635dd326f85825d044a957d906a827497145c6 100644 (file)
@@ -161,16 +161,16 @@ static const struct ata_port_operations jmicron_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        /* IRQ-related hooks */
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        /* Generic PATA PCI ATA helpers */
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 
@@ -221,7 +221,7 @@ static int jmicron_init_one (struct pci_dev *pdev, const struct pci_device_id *i
 static int jmicron_reinit_one(struct pci_dev *pdev)
 {
        u32 reg;
-       
+
        switch(pdev->device) {
                case PCI_DEVICE_ID_JMICRON_JMB368:
                        break;
index 581cb33c6f456df927ac4ba2f88a601dc042b50e..98c1fee4b305a92f3d92f08506010d861ee027c4 100644 (file)
@@ -89,9 +89,10 @@ static int probe_all;                        /* Set to check all ISA port ranges */
 static int ht6560a;                    /* HT 6560A on primary 1, secondary 2, both 3 */
 static int ht6560b;                    /* HT 6560A on primary 1, secondary 2, both 3 */
 static int opti82c611a;                        /* Opti82c611A on primary 1, secondary 2, both 3 */
-static int opti82c46x;         /* Opti 82c465MV present (pri/sec autodetect) */
+static int opti82c46x;                 /* Opti 82c465MV present (pri/sec autodetect) */
 static int autospeed;                  /* Chip present which snoops speed changes */
 static int pio_mask = 0x1F;            /* PIO range for autospeed devices */
+static int iordy_mask = 0xFFFFFFFF;    /* Use iordy if available */
 
 /**
  *     legacy_set_mode         -       mode setting
@@ -113,6 +114,7 @@ static int legacy_set_mode(struct ata_port *ap, struct ata_device **unused)
        for (i = 0; i < ATA_MAX_DEVICES; i++) {
                struct ata_device *dev = &ap->device[i];
                if (ata_dev_enabled(dev)) {
+                       ata_dev_printk(dev, KERN_INFO, "configured for PIO\n");
                        dev->pio_mode = XFER_PIO_0;
                        dev->xfer_mode = XFER_PIO_0;
                        dev->xfer_shift = ATA_SHIFT_PIO;
@@ -164,14 +166,14 @@ static struct ata_port_operations simple_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer_noirq,
+       .data_xfer      = ata_data_xfer_noirq,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations legacy_port_ops = {
@@ -189,14 +191,14 @@ static struct ata_port_operations legacy_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer_noirq,
+       .data_xfer      = ata_data_xfer_noirq,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -257,31 +259,33 @@ static void pdc_data_xfer_vlb(struct ata_device *adev, unsigned char *buf, unsig
                local_irq_save(flags);
 
                /* Perform the 32bit I/O synchronization sequence */
-               inb(ap->ioaddr.nsect_addr);
-               inb(ap->ioaddr.nsect_addr);
-               inb(ap->ioaddr.nsect_addr);
+               ioread8(ap->ioaddr.nsect_addr);
+               ioread8(ap->ioaddr.nsect_addr);
+               ioread8(ap->ioaddr.nsect_addr);
 
                /* Now the data */
 
                if (write_data)
-                       outsl(ap->ioaddr.data_addr, buf, buflen >> 2);
+                       iowrite32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
                else
-                       insl(ap->ioaddr.data_addr, buf, buflen >> 2);
+                       ioread32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
 
                if (unlikely(slop)) {
                        u32 pad;
                        if (write_data) {
                                memcpy(&pad, buf + buflen - slop, slop);
-                               outl(le32_to_cpu(pad), ap->ioaddr.data_addr);
+                               pad = le32_to_cpu(pad);
+                               iowrite32(pad, ap->ioaddr.data_addr);
                        } else {
-                               pad = cpu_to_le16(inl(ap->ioaddr.data_addr));
+                               pad = ioread32(ap->ioaddr.data_addr);
+                               pad = cpu_to_le16(pad);
                                memcpy(buf + buflen - slop, &pad, slop);
                        }
                }
                local_irq_restore(flags);
        }
        else
-               ata_pio_data_xfer_noirq(adev, buf, buflen, write_data);
+               ata_data_xfer_noirq(adev, buf, buflen, write_data);
 }
 
 static struct ata_port_operations pdc20230_port_ops = {
@@ -303,10 +307,10 @@ static struct ata_port_operations pdc20230_port_ops = {
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -332,8 +336,8 @@ static void ht6560a_set_piomode(struct ata_port *ap, struct ata_device *adev)
        inb(0x3E6);
        inb(0x3E6);
 
-       outb(recover << 4 | active, ap->ioaddr.device_addr);
-       inb(ap->ioaddr.status_addr);
+       iowrite8(recover << 4 | active, ap->ioaddr.device_addr);
+       ioread8(ap->ioaddr.status_addr);
 }
 
 static struct ata_port_operations ht6560a_port_ops = {
@@ -351,14 +355,14 @@ static struct ata_port_operations ht6560a_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,    /* Check vlb/noirq */
+       .data_xfer      = ata_data_xfer,        /* Check vlb/noirq */
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -387,7 +391,7 @@ static void ht6560b_set_piomode(struct ata_port *ap, struct ata_device *adev)
        inb(0x3E6);
        inb(0x3E6);
 
-       outb(recover << 4 | active, ap->ioaddr.device_addr);
+       iowrite8(recover << 4 | active, ap->ioaddr.device_addr);
 
        if (adev->class != ATA_DEV_ATA) {
                u8 rconf = inb(0x3E6);
@@ -396,7 +400,7 @@ static void ht6560b_set_piomode(struct ata_port *ap, struct ata_device *adev)
                        outb(rconf, 0x3E6);
                }
        }
-       inb(ap->ioaddr.status_addr);
+       ioread8(ap->ioaddr.status_addr);
 }
 
 static struct ata_port_operations ht6560b_port_ops = {
@@ -414,14 +418,14 @@ static struct ata_port_operations ht6560b_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,    /* FIXME: Check 32bit and noirq */
+       .data_xfer      = ata_data_xfer,        /* FIXME: Check 32bit and noirq */
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -464,12 +468,12 @@ static void opti82c611a_set_piomode(struct ata_port *ap, struct ata_device *adev
        u8 rc;
 
        /* Enter configuration mode */
-       inw(ap->ioaddr.error_addr);
-       inw(ap->ioaddr.error_addr);
-       outb(3, ap->ioaddr.nsect_addr);
+       ioread16(ap->ioaddr.error_addr);
+       ioread16(ap->ioaddr.error_addr);
+       iowrite8(3, ap->ioaddr.nsect_addr);
 
        /* Read VLB clock strapping */
-       clock = 1000000000 / khz[inb(ap->ioaddr.lbah_addr) & 0x03];
+       clock = 1000000000 / khz[ioread8(ap->ioaddr.lbah_addr) & 0x03];
 
        /* Get the timing data in cycles */
        ata_timing_compute(adev, adev->pio_mode, &t, clock, 1000);
@@ -487,33 +491,33 @@ static void opti82c611a_set_piomode(struct ata_port *ap, struct ata_device *adev
        setup = FIT(t.setup, 1, 4) - 1;
 
        /* Select the right timing bank for write timing */
-       rc = inb(ap->ioaddr.lbal_addr);
+       rc = ioread8(ap->ioaddr.lbal_addr);
        rc &= 0x7F;
        rc |= (adev->devno << 7);
-       outb(rc, ap->ioaddr.lbal_addr);
+       iowrite8(rc, ap->ioaddr.lbal_addr);
 
        /* Write the timings */
-       outb(active << 4 | recover, ap->ioaddr.error_addr);
+       iowrite8(active << 4 | recover, ap->ioaddr.error_addr);
 
        /* Select the right bank for read timings, also
           load the shared timings for address */
-       rc = inb(ap->ioaddr.device_addr);
+       rc = ioread8(ap->ioaddr.device_addr);
        rc &= 0xC0;
        rc |= adev->devno;      /* Index select */
        rc |= (setup << 4) | 0x04;
-       outb(rc, ap->ioaddr.device_addr);
+       iowrite8(rc, ap->ioaddr.device_addr);
 
        /* Load the read timings */
-       outb(active << 4 | recover, ap->ioaddr.data_addr);
+       iowrite8(active << 4 | recover, ap->ioaddr.data_addr);
 
        /* Ensure the timing register mode is right */
-       rc = inb (ap->ioaddr.lbal_addr);
+       rc = ioread8(ap->ioaddr.lbal_addr);
        rc &= 0x73;
        rc |= 0x84;
-       outb(rc, ap->ioaddr.lbal_addr);
+       iowrite8(rc, ap->ioaddr.lbal_addr);
 
        /* Exit command mode */
-       outb(0x83,  ap->ioaddr.nsect_addr);
+       iowrite8(0x83,  ap->ioaddr.nsect_addr);
 }
 
 
@@ -532,14 +536,14 @@ static struct ata_port_operations opti82c611a_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -563,9 +567,9 @@ static void opti82c46x_set_piomode(struct ata_port *ap, struct ata_device *adev)
        sysclk = opti_syscfg(0xAC) & 0xC0;      /* BIOS set */
 
        /* Enter configuration mode */
-       inw(ap->ioaddr.error_addr);
-       inw(ap->ioaddr.error_addr);
-       outb(3, ap->ioaddr.nsect_addr);
+       ioread16(ap->ioaddr.error_addr);
+       ioread16(ap->ioaddr.error_addr);
+       iowrite8(3, ap->ioaddr.nsect_addr);
 
        /* Read VLB clock strapping */
        clock = 1000000000 / khz[sysclk];
@@ -586,33 +590,33 @@ static void opti82c46x_set_piomode(struct ata_port *ap, struct ata_device *adev)
        setup = FIT(t.setup, 1, 4) - 1;
 
        /* Select the right timing bank for write timing */
-       rc = inb(ap->ioaddr.lbal_addr);
+       rc = ioread8(ap->ioaddr.lbal_addr);
        rc &= 0x7F;
        rc |= (adev->devno << 7);
-       outb(rc, ap->ioaddr.lbal_addr);
+       iowrite8(rc, ap->ioaddr.lbal_addr);
 
        /* Write the timings */
-       outb(active << 4 | recover, ap->ioaddr.error_addr);
+       iowrite8(active << 4 | recover, ap->ioaddr.error_addr);
 
        /* Select the right bank for read timings, also
           load the shared timings for address */
-       rc = inb(ap->ioaddr.device_addr);
+       rc = ioread8(ap->ioaddr.device_addr);
        rc &= 0xC0;
        rc |= adev->devno;      /* Index select */
        rc |= (setup << 4) | 0x04;
-       outb(rc, ap->ioaddr.device_addr);
+       iowrite8(rc, ap->ioaddr.device_addr);
 
        /* Load the read timings */
-       outb(active << 4 | recover, ap->ioaddr.data_addr);
+       iowrite8(active << 4 | recover, ap->ioaddr.data_addr);
 
        /* Ensure the timing register mode is right */
-       rc = inb (ap->ioaddr.lbal_addr);
+       rc = ioread8(ap->ioaddr.lbal_addr);
        rc &= 0x73;
        rc |= 0x84;
-       outb(rc, ap->ioaddr.lbal_addr);
+       iowrite8(rc, ap->ioaddr.lbal_addr);
 
        /* Exit command mode */
-       outb(0x83,  ap->ioaddr.nsect_addr);
+       iowrite8(0x83,  ap->ioaddr.nsect_addr);
 
        /* We need to know this for quad device on the MVB */
        ap->host->private_data = ap;
@@ -662,14 +666,14 @@ static struct ata_port_operations opti82c46x_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = opti82c46x_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 
@@ -689,25 +693,32 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
        struct legacy_data *ld = &legacy_data[nr_legacy_host];
        struct ata_probe_ent ae;
        struct platform_device *pdev;
-       int ret = -EBUSY;
        struct ata_port_operations *ops = &legacy_port_ops;
+       void __iomem *io_addr, *ctrl_addr;
        int pio_modes = pio_mask;
        u32 mask = (1 << port);
-
-       if (request_region(io, 8, "pata_legacy") == NULL)
-               return -EBUSY;
-       if (request_region(ctrl, 1, "pata_legacy") == NULL)
-               goto fail_io;
+       u32 iordy = (iordy_mask & mask) ? 0: ATA_FLAG_NO_IORDY;
+       int ret;
 
        pdev = platform_device_register_simple(DRV_NAME, nr_legacy_host, NULL, 0);
-       if (IS_ERR(pdev)) {
-               ret = PTR_ERR(pdev);
-               goto fail_dev;
-       }
+       if (IS_ERR(pdev))
+               return PTR_ERR(pdev);
+
+       ret = -EBUSY;
+       if (devm_request_region(&pdev->dev, io, 8, "pata_legacy") == NULL ||
+           devm_request_region(&pdev->dev, ctrl, 1, "pata_legacy") == NULL)
+               goto fail;
+
+       ret = -ENOMEM;
+       io_addr = devm_ioport_map(&pdev->dev, io, 8);
+       ctrl_addr = devm_ioport_map(&pdev->dev, ctrl, 1);
+       if (!io_addr || !ctrl_addr)
+               goto fail;
 
        if (ht6560a & mask) {
                ops = &ht6560a_port_ops;
                pio_modes = 0x07;
+               iordy = ATA_FLAG_NO_IORDY;
        }
        if (ht6560b & mask) {
                ops = &ht6560b_port_ops;
@@ -743,6 +754,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
                        printk(KERN_INFO "PDC20230-C/20630 VLB ATA controller detected.\n");
                                pio_modes = 0x07;
                        ops = &pdc20230_port_ops;
+                       iordy = ATA_FLAG_NO_IORDY;
                        udelay(100);
                        inb(0x1F5);
                } else {
@@ -760,6 +772,7 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
        /* Chip does mode setting by command snooping */
        if (ops == &legacy_port_ops && (autospeed & mask))
                ops = &simple_port_ops;
+
        memset(&ae, 0, sizeof(struct ata_probe_ent));
        INIT_LIST_HEAD(&ae.node);
        ae.dev = &pdev->dev;
@@ -769,28 +782,23 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
        ae.pio_mask = pio_modes;
        ae.irq = irq;
        ae.irq_flags = 0;
-       ae.port_flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST;
-       ae.port[0].cmd_addr = io;
-       ae.port[0].altstatus_addr = ctrl;
-       ae.port[0].ctl_addr =   ctrl;
+       ae.port_flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST|iordy;
+       ae.port[0].cmd_addr = io_addr;
+       ae.port[0].altstatus_addr = ctrl_addr;
+       ae.port[0].ctl_addr = ctrl_addr;
        ata_std_ports(&ae.port[0]);
        ae.private_data = ld;
 
-       ret = ata_device_add(&ae);
-       if (ret == 0) {
-               ret = -ENODEV;
+       ret = -ENODEV;
+       if (!ata_device_add(&ae))
                goto fail;
-       }
+
        legacy_host[nr_legacy_host++] = dev_get_drvdata(&pdev->dev);
        ld->platform_dev = pdev;
        return 0;
 
 fail:
        platform_device_unregister(pdev);
-fail_dev:
-       release_region(ctrl, 1);
-fail_io:
-       release_region(io, 8);
        return ret;
 }
 
@@ -923,15 +931,11 @@ static __exit void legacy_exit(void)
 
        for (i = 0; i < nr_legacy_host; i++) {
                struct legacy_data *ld = &legacy_data[i];
-               struct ata_port *ap =legacy_host[i]->ports[0];
-               unsigned long io = ap->ioaddr.cmd_addr;
-               unsigned long ctrl = ap->ioaddr.ctl_addr;
-               ata_host_remove(legacy_host[i]);
+
+               ata_host_detach(legacy_host[i]);
                platform_device_unregister(ld->platform_dev);
                if (ld->timing)
                        release_region(ld->timing, 2);
-               release_region(io, 8);
-               release_region(ctrl, 1);
        }
 }
 
@@ -947,6 +951,7 @@ module_param(ht6560b, int, 0);
 module_param(opti82c611a, int, 0);
 module_param(opti82c46x, int, 0);
 module_param(pio_mask, int, 0);
+module_param(iordy_mask, int, 0);
 
 module_init(legacy_init);
 module_exit(legacy_exit);
index 1c810ea0025374bbb7df98a5da47960690d9d730..13a70ac6f1dc2f536b132229ac7706aa87e7d6e5 100644 (file)
@@ -45,10 +45,10 @@ static int marvell_pre_reset(struct ata_port *ap)
        for(i = 0; i <= 0x0F; i++)
                printk("%02X:%02X ", i, readb(barp + i));
        printk("\n");
-       
+
        devices = readl(barp + 0x0C);
        pci_iounmap(pdev, barp);
-       
+
        if ((pdev->device == 0x6145) && (ap->port_no == 0) &&
            (!(devices & 0x10)))        /* PATA enable ? */
                return -ENOENT;
@@ -57,7 +57,7 @@ static int marvell_pre_reset(struct ata_port *ap)
        switch(ap->port_no)
        {
        case 0:
-               if (inb(ap->ioaddr.bmdma_addr + 1) & 1)
+               if (ioread8(ap->ioaddr.bmdma_addr + 1) & 1)
                        ap->cbl = ATA_CBL_PATA40;
                else
                        ap->cbl = ATA_CBL_PATA80;
@@ -129,16 +129,16 @@ static const struct ata_port_operations marvell_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        /* Timeout handling */
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        /* Generic PATA PCI ATA helpers */
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 
diff --git a/drivers/ata/pata_mpc52xx.c b/drivers/ata/pata_mpc52xx.c
new file mode 100644 (file)
index 0000000..29e1809
--- /dev/null
@@ -0,0 +1,536 @@
+/*
+ * drivers/ata/pata_mpc52xx.c
+ *
+ * libata driver for the Freescale MPC52xx on-chip IDE interface
+ *
+ * Copyright (C) 2006 Sylvain Munaut <tnt@246tNt.com>
+ * Copyright (C) 2003 Mipsys - Benjamin Herrenschmidt
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of any
+ * kind, whether express or implied.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/delay.h>
+#include <linux/libata.h>
+
+#include <asm/types.h>
+#include <asm/prom.h>
+#include <asm/of_platform.h>
+#include <asm/mpc52xx.h>
+
+
+#define DRV_NAME       "mpc52xx_ata"
+#define DRV_VERSION    "0.1.0"
+
+
+/* Private structures used by the driver */
+struct mpc52xx_ata_timings {
+       u32     pio1;
+       u32     pio2;
+};
+
+struct mpc52xx_ata_priv {
+       unsigned int                    ipb_period;
+       struct mpc52xx_ata __iomem *    ata_regs;
+       int                             ata_irq;
+       struct mpc52xx_ata_timings      timings[2];
+       int                             csel;
+};
+
+
+/* ATAPI-4 PIO specs (in ns) */
+static const int ataspec_t0[5]    = {600, 383, 240, 180, 120};
+static const int ataspec_t1[5]    = { 70,  50,  30,  30,  25};
+static const int ataspec_t2_8[5]  = {290, 290, 290,  80,  70};
+static const int ataspec_t2_16[5] = {165, 125, 100,  80,  70};
+static const int ataspec_t2i[5]   = {  0,   0,   0,  70,  25};
+static const int ataspec_t4[5]    = { 30,  20,  15,  10,  10};
+static const int ataspec_ta[5]    = { 35,  35,  35,  35,  35};
+
+#define CALC_CLKCYC(c,v) ((((v)+(c)-1)/(c)))
+
+
+/* Bit definitions inside the registers */
+#define MPC52xx_ATA_HOSTCONF_SMR       0x80000000UL /* State machine reset */
+#define MPC52xx_ATA_HOSTCONF_FR                0x40000000UL /* FIFO Reset */
+#define MPC52xx_ATA_HOSTCONF_IE                0x02000000UL /* Enable interrupt in PIO */
+#define MPC52xx_ATA_HOSTCONF_IORDY     0x01000000UL /* Drive supports IORDY protocol */
+
+#define MPC52xx_ATA_HOSTSTAT_TIP       0x80000000UL /* Transaction in progress */
+#define MPC52xx_ATA_HOSTSTAT_UREP      0x40000000UL /* UDMA Read Extended Pause */
+#define MPC52xx_ATA_HOSTSTAT_RERR      0x02000000UL /* Read Error */
+#define MPC52xx_ATA_HOSTSTAT_WERR      0x01000000UL /* Write Error */
+
+#define MPC52xx_ATA_FIFOSTAT_EMPTY     0x01 /* FIFO Empty */
+
+#define MPC52xx_ATA_DMAMODE_WRITE      0x01 /* Write DMA */
+#define MPC52xx_ATA_DMAMODE_READ       0x02 /* Read DMA */
+#define MPC52xx_ATA_DMAMODE_UDMA       0x04 /* UDMA enabled */
+#define MPC52xx_ATA_DMAMODE_IE         0x08 /* Enable drive interrupt to CPU in DMA mode */
+#define MPC52xx_ATA_DMAMODE_FE         0x10 /* FIFO Flush enable in Rx mode */
+#define MPC52xx_ATA_DMAMODE_FR         0x20 /* FIFO Reset */
+#define MPC52xx_ATA_DMAMODE_HUT                0x40 /* Host UDMA burst terminate */
+
+
+/* Structure of the hardware registers */
+struct mpc52xx_ata {
+
+       /* Host interface registers */
+       u32 config;             /* ATA + 0x00 Host configuration */
+       u32 host_status;        /* ATA + 0x04 Host controller status */
+       u32 pio1;               /* ATA + 0x08 PIO Timing 1 */
+       u32 pio2;               /* ATA + 0x0c PIO Timing 2 */
+       u32 mdma1;              /* ATA + 0x10 MDMA Timing 1 */
+       u32 mdma2;              /* ATA + 0x14 MDMA Timing 2 */
+       u32 udma1;              /* ATA + 0x18 UDMA Timing 1 */
+       u32 udma2;              /* ATA + 0x1c UDMA Timing 2 */
+       u32 udma3;              /* ATA + 0x20 UDMA Timing 3 */
+       u32 udma4;              /* ATA + 0x24 UDMA Timing 4 */
+       u32 udma5;              /* ATA + 0x28 UDMA Timing 5 */
+       u32 share_cnt;          /* ATA + 0x2c ATA share counter */
+       u32 reserved0[3];
+
+       /* FIFO registers */
+       u32 fifo_data;          /* ATA + 0x3c */
+       u8  fifo_status_frame;  /* ATA + 0x40 */
+       u8  fifo_status;        /* ATA + 0x41 */
+       u16 reserved7[1];
+       u8  fifo_control;       /* ATA + 0x44 */
+       u8  reserved8[5];
+       u16 fifo_alarm;         /* ATA + 0x4a */
+       u16 reserved9;
+       u16 fifo_rdp;           /* ATA + 0x4e */
+       u16 reserved10;
+       u16 fifo_wrp;           /* ATA + 0x52 */
+       u16 reserved11;
+       u16 fifo_lfrdp;         /* ATA + 0x56 */
+       u16 reserved12;
+       u16 fifo_lfwrp;         /* ATA + 0x5a */
+
+       /* Drive TaskFile registers */
+       u8  tf_control;         /* ATA + 0x5c TASKFILE Control/Alt Status */
+       u8  reserved13[3];
+       u16 tf_data;            /* ATA + 0x60 TASKFILE Data */
+       u16 reserved14;
+       u8  tf_features;        /* ATA + 0x64 TASKFILE Features/Error */
+       u8  reserved15[3];
+       u8  tf_sec_count;       /* ATA + 0x68 TASKFILE Sector Count */
+       u8  reserved16[3];
+       u8  tf_sec_num;         /* ATA + 0x6c TASKFILE Sector Number */
+       u8  reserved17[3];
+       u8  tf_cyl_low;         /* ATA + 0x70 TASKFILE Cylinder Low */
+       u8  reserved18[3];
+       u8  tf_cyl_high;        /* ATA + 0x74 TASKFILE Cylinder High */
+       u8  reserved19[3];
+       u8  tf_dev_head;        /* ATA + 0x78 TASKFILE Device/Head */
+       u8  reserved20[3];
+       u8  tf_command;         /* ATA + 0x7c TASKFILE Command/Status */
+       u8  dma_mode;           /* ATA + 0x7d ATA Host DMA Mode configuration */
+       u8  reserved21[2];
+};
+
+
+/* ======================================================================== */
+/* Aux fns                                                                  */
+/* ======================================================================== */
+
+
+/* MPC52xx low level hw control */
+
+static int
+mpc52xx_ata_compute_pio_timings(struct mpc52xx_ata_priv *priv, int dev, int pio)
+{
+       struct mpc52xx_ata_timings *timing = &priv->timings[dev];
+       unsigned int ipb_period = priv->ipb_period;
+       unsigned int t0, t1, t2_8, t2_16, t2i, t4, ta;
+
+       if ((pio<0) || (pio>4))
+               return -EINVAL;
+
+       t0      = CALC_CLKCYC(ipb_period, 1000 * ataspec_t0[pio]);
+       t1      = CALC_CLKCYC(ipb_period, 1000 * ataspec_t1[pio]);
+       t2_8    = CALC_CLKCYC(ipb_period, 1000 * ataspec_t2_8[pio]);
+       t2_16   = CALC_CLKCYC(ipb_period, 1000 * ataspec_t2_16[pio]);
+       t2i     = CALC_CLKCYC(ipb_period, 1000 * ataspec_t2i[pio]);
+       t4      = CALC_CLKCYC(ipb_period, 1000 * ataspec_t4[pio]);
+       ta      = CALC_CLKCYC(ipb_period, 1000 * ataspec_ta[pio]);
+
+       timing->pio1 = (t0 << 24) | (t2_8 << 16) | (t2_16 << 8) | (t2i);
+       timing->pio2 = (t4 << 24) | (t1 << 16) | (ta << 8);
+
+       return 0;
+}
+
+static void
+mpc52xx_ata_apply_timings(struct mpc52xx_ata_priv *priv, int device)
+{
+       struct mpc52xx_ata __iomem *regs = priv->ata_regs;
+       struct mpc52xx_ata_timings *timing = &priv->timings[device];
+
+       out_be32(&regs->pio1,  timing->pio1);
+       out_be32(&regs->pio2,  timing->pio2);
+       out_be32(&regs->mdma1, 0);
+       out_be32(&regs->mdma2, 0);
+       out_be32(&regs->udma1, 0);
+       out_be32(&regs->udma2, 0);
+       out_be32(&regs->udma3, 0);
+       out_be32(&regs->udma4, 0);
+       out_be32(&regs->udma5, 0);
+
+       priv->csel = device;
+}
+
+static int
+mpc52xx_ata_hw_init(struct mpc52xx_ata_priv *priv)
+{
+       struct mpc52xx_ata __iomem *regs = priv->ata_regs;
+       int tslot;
+
+       /* Clear share_cnt (all sample code do this ...) */
+       out_be32(&regs->share_cnt, 0);
+
+       /* Configure and reset host */
+       out_be32(&regs->config,
+                       MPC52xx_ATA_HOSTCONF_IE |
+                       MPC52xx_ATA_HOSTCONF_IORDY |
+                       MPC52xx_ATA_HOSTCONF_SMR |
+                       MPC52xx_ATA_HOSTCONF_FR);
+
+       udelay(10);
+
+       out_be32(&regs->config,
+                       MPC52xx_ATA_HOSTCONF_IE |
+                       MPC52xx_ATA_HOSTCONF_IORDY);
+
+       /* Set the time slot to 1us */
+       tslot = CALC_CLKCYC(priv->ipb_period, 1000000);
+       out_be32(&regs->share_cnt, tslot << 16 );
+
+       /* Init timings to PIO0 */
+       memset(priv->timings, 0x00, 2*sizeof(struct mpc52xx_ata_timings));
+
+       mpc52xx_ata_compute_pio_timings(priv, 0, 0);
+       mpc52xx_ata_compute_pio_timings(priv, 1, 0);
+
+       mpc52xx_ata_apply_timings(priv, 0);
+
+       return 0;
+}
+
+
+/* ======================================================================== */
+/* libata driver                                                            */
+/* ======================================================================== */
+
+static void
+mpc52xx_ata_set_piomode(struct ata_port *ap, struct ata_device *adev)
+{
+       struct mpc52xx_ata_priv *priv = ap->host->private_data;
+       int pio, rv;
+
+       pio = adev->pio_mode - XFER_PIO_0;
+
+       rv = mpc52xx_ata_compute_pio_timings(priv, adev->devno, pio);
+
+       if (rv) {
+               printk(KERN_ERR DRV_NAME
+                       ": Trying to select invalid PIO mode %d\n", pio);
+               return;
+       }
+
+       mpc52xx_ata_apply_timings(priv, adev->devno);
+}
+static void
+mpc52xx_ata_dev_select(struct ata_port *ap, unsigned int device)
+{
+       struct mpc52xx_ata_priv *priv = ap->host->private_data;
+
+       if (device != priv->csel)
+               mpc52xx_ata_apply_timings(priv, device);
+
+       ata_std_dev_select(ap,device);
+}
+
+static void
+mpc52xx_ata_error_handler(struct ata_port *ap)
+{
+       ata_bmdma_drive_eh(ap, ata_std_prereset, ata_std_softreset, NULL,
+                       ata_std_postreset);
+}
+
+
+
+static struct scsi_host_template mpc52xx_ata_sht = {
+       .module                 = THIS_MODULE,
+       .name                   = DRV_NAME,
+       .ioctl                  = ata_scsi_ioctl,
+       .queuecommand           = ata_scsi_queuecmd,
+       .can_queue              = ATA_DEF_QUEUE,
+       .this_id                = ATA_SHT_THIS_ID,
+       .sg_tablesize           = LIBATA_MAX_PRD,
+       .max_sectors            = ATA_MAX_SECTORS,
+       .cmd_per_lun            = ATA_SHT_CMD_PER_LUN,
+       .emulated               = ATA_SHT_EMULATED,
+       .use_clustering         = ATA_SHT_USE_CLUSTERING,
+       .proc_name              = DRV_NAME,
+       .dma_boundary           = ATA_DMA_BOUNDARY,
+       .slave_configure        = ata_scsi_slave_config,
+       .bios_param             = ata_std_bios_param,
+};
+
+static struct ata_port_operations mpc52xx_ata_port_ops = {
+       .port_disable           = ata_port_disable,
+       .set_piomode            = mpc52xx_ata_set_piomode,
+       .dev_select             = mpc52xx_ata_dev_select,
+       .tf_load                = ata_tf_load,
+       .tf_read                = ata_tf_read,
+       .check_status           = ata_check_status,
+       .exec_command           = ata_exec_command,
+       .freeze                 = ata_bmdma_freeze,
+       .thaw                   = ata_bmdma_thaw,
+       .error_handler          = mpc52xx_ata_error_handler,
+       .qc_prep                = ata_qc_prep,
+       .qc_issue               = ata_qc_issue_prot,
+       .data_xfer              = ata_data_xfer,
+       .irq_handler            = ata_interrupt,
+       .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
+       .port_start             = ata_port_start,
+};
+
+static struct ata_probe_ent mpc52xx_ata_probe_ent = {
+       .port_ops       = &mpc52xx_ata_port_ops,
+       .sht            = &mpc52xx_ata_sht,
+       .n_ports        = 1,
+       .pio_mask       = 0x1f,         /* Up to PIO4 */
+       .mwdma_mask     = 0x00,         /* No MWDMA   */
+       .udma_mask      = 0x00,         /* No UDMA    */
+       .port_flags     = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST,
+       .irq_flags      = 0,
+};
+
+static int __devinit
+mpc52xx_ata_init_one(struct device *dev, struct mpc52xx_ata_priv *priv)
+{
+       struct ata_probe_ent *ae = &mpc52xx_ata_probe_ent;
+       struct ata_ioports *aio = &ae->port[0];
+       int rv;
+
+       INIT_LIST_HEAD(&ae->node);
+       ae->dev = dev;
+       ae->irq = priv->ata_irq;
+
+       aio->cmd_addr           = 0;    /* Don't have a classic reg block */
+       aio->altstatus_addr     = &priv->ata_regs->tf_control;
+       aio->ctl_addr           = &priv->ata_regs->tf_control;
+       aio->data_addr          = &priv->ata_regs->tf_data;
+       aio->error_addr         = &priv->ata_regs->tf_features;
+       aio->feature_addr       = &priv->ata_regs->tf_features;
+       aio->nsect_addr         = &priv->ata_regs->tf_sec_count;
+       aio->lbal_addr          = &priv->ata_regs->tf_sec_num;
+       aio->lbam_addr          = &priv->ata_regs->tf_cyl_low;
+       aio->lbah_addr          = &priv->ata_regs->tf_cyl_high;
+       aio->device_addr        = &priv->ata_regs->tf_dev_head;
+       aio->status_addr        = &priv->ata_regs->tf_command;
+       aio->command_addr       = &priv->ata_regs->tf_command;
+
+       ae->private_data = priv;
+
+       rv = ata_device_add(ae);
+
+       return rv ? 0 : -EINVAL;
+}
+
+static struct mpc52xx_ata_priv *
+mpc52xx_ata_remove_one(struct device *dev)
+{
+       struct ata_host *host = dev_get_drvdata(dev);
+       struct mpc52xx_ata_priv *priv = host->private_data;
+
+       ata_host_detach(host);
+
+       return priv;
+}
+
+
+/* ======================================================================== */
+/* OF Platform driver                                                       */
+/* ======================================================================== */
+
+static int __devinit
+mpc52xx_ata_probe(struct of_device *op, const struct of_device_id *match)
+{
+       unsigned int ipb_freq;
+       struct resource res_mem;
+       int ata_irq = NO_IRQ;
+       struct mpc52xx_ata __iomem *ata_regs;
+       struct mpc52xx_ata_priv *priv;
+       int rv;
+
+       /* Get ipb frequency */
+       ipb_freq = mpc52xx_find_ipb_freq(op->node);
+       if (!ipb_freq) {
+               printk(KERN_ERR DRV_NAME ": "
+                       "Unable to find IPB Bus frequency\n" );
+               return -ENODEV;
+       }
+
+       /* Get IRQ and register */
+       rv = of_address_to_resource(op->node, 0, &res_mem);
+       if (rv) {
+               printk(KERN_ERR DRV_NAME ": "
+                       "Error while parsing device node resource\n" );
+               return rv;
+       }
+
+       ata_irq = irq_of_parse_and_map(op->node, 0);
+       if (ata_irq == NO_IRQ) {
+               printk(KERN_ERR DRV_NAME ": "
+                       "Error while mapping the irq\n");
+               return -EINVAL;
+       }
+
+       /* Request mem region */
+       if (!devm_request_mem_region(&op->dev, res_mem.start,
+                                    sizeof(struct mpc52xx_ata), DRV_NAME)) {
+               printk(KERN_ERR DRV_NAME ": "
+                       "Error while requesting mem region\n");
+               rv = -EBUSY;
+               goto err;
+       }
+
+       /* Remap registers */
+       ata_regs = devm_ioremap(&op->dev, res_mem.start,
+                               sizeof(struct mpc52xx_ata));
+       if (!ata_regs) {
+               printk(KERN_ERR DRV_NAME ": "
+                       "Error while mapping register set\n");
+               rv = -ENOMEM;
+               goto err;
+       }
+
+       /* Prepare our private structure */
+       priv = devm_kzalloc(&op->dev, sizeof(struct mpc52xx_ata_priv),
+                           GFP_ATOMIC);
+       if (!priv) {
+               printk(KERN_ERR DRV_NAME ": "
+                       "Error while allocating private structure\n");
+               rv = -ENOMEM;
+               goto err;
+       }
+
+       priv->ipb_period = 1000000000 / (ipb_freq / 1000);
+       priv->ata_regs = ata_regs;
+       priv->ata_irq = ata_irq;
+       priv->csel = -1;
+
+       /* Init the hw */
+       rv = mpc52xx_ata_hw_init(priv);
+       if (rv) {
+               printk(KERN_ERR DRV_NAME ": Error during HW init\n");
+               goto err;
+       }
+
+       /* Register ourselves to libata */
+       rv = mpc52xx_ata_init_one(&op->dev, priv);
+       if (rv) {
+               printk(KERN_ERR DRV_NAME ": "
+                       "Error while registering to ATA layer\n");
+               return rv;
+       }
+
+       /* Done */
+       return 0;
+
+       /* Error path */
+err:
+       irq_dispose_mapping(ata_irq);
+       return rv;
+}
+
+static int
+mpc52xx_ata_remove(struct of_device *op)
+{
+       struct mpc52xx_ata_priv *priv;
+
+       priv = mpc52xx_ata_remove_one(&op->dev);
+       irq_dispose_mapping(priv->ata_irq);
+
+       return 0;
+}
+
+
+#ifdef CONFIG_PM
+
+static int
+mpc52xx_ata_suspend(struct of_device *op, pm_message_t state)
+{
+       return 0;       /* FIXME : What to do here ? */
+}
+
+static int
+mpc52xx_ata_resume(struct of_device *op)
+{
+       return 0;       /* FIXME : What to do here ? */
+}
+
+#endif
+
+
+static struct of_device_id mpc52xx_ata_of_match[] = {
+       {
+               .type           = "ata",
+               .compatible     = "mpc5200-ata",
+       },
+       {},
+};
+
+
+static struct of_platform_driver mpc52xx_ata_of_platform_driver = {
+       .owner          = THIS_MODULE,
+       .name           = DRV_NAME,
+       .match_table    = mpc52xx_ata_of_match,
+       .probe          = mpc52xx_ata_probe,
+       .remove         = mpc52xx_ata_remove,
+#ifdef CONFIG_PM
+       .suspend        = mpc52xx_ata_suspend,
+       .resume         = mpc52xx_ata_resume,
+#endif
+       .driver         = {
+               .name   = DRV_NAME,
+               .owner  = THIS_MODULE,
+       },
+};
+
+
+/* ======================================================================== */
+/* Module                                                                   */
+/* ======================================================================== */
+
+static int __init
+mpc52xx_ata_init(void)
+{
+       printk(KERN_INFO "ata: MPC52xx IDE/ATA libata driver\n");
+       return of_register_platform_driver(&mpc52xx_ata_of_platform_driver);
+}
+
+static void __exit
+mpc52xx_ata_exit(void)
+{
+       of_unregister_platform_driver(&mpc52xx_ata_of_platform_driver);
+}
+
+module_init(mpc52xx_ata_init);
+module_exit(mpc52xx_ata_exit);
+
+MODULE_AUTHOR("Sylvain Munaut <tnt@246tNt.com>");
+MODULE_DESCRIPTION("Freescale MPC52xx IDE/ATA libata driver");
+MODULE_LICENSE("GPL");
+MODULE_DEVICE_TABLE(of, mpc52xx_ata_of_match);
+MODULE_VERSION(DRV_VERSION);
+
index 4ccca938675e754a295d78d2c9510662627e1563..f2e7115f7ab9de2aba9b0a9426e7155916c2f26f 100644 (file)
@@ -35,7 +35,7 @@
 #include <linux/libata.h>
 
 #define DRV_NAME "pata_mpiix"
-#define DRV_VERSION "0.7.3"
+#define DRV_VERSION "0.7.5"
 
 enum {
        IDETIM = 0x6C,          /* IDE control register */
@@ -49,12 +49,9 @@ enum {
 static int mpiix_pre_reset(struct ata_port *ap)
 {
        struct pci_dev *pdev = to_pci_dev(ap->host->dev);
-       static const struct pci_bits mpiix_enable_bits[] = {
-               { 0x6D, 1, 0x80, 0x80 },
-               { 0x6F, 1, 0x80, 0x80 }
-       };
+       static const struct pci_bits mpiix_enable_bits = { 0x6D, 1, 0x80, 0x80 };
 
-       if (!pci_test_config_bits(pdev, &mpiix_enable_bits[ap->port_no]))
+       if (!pci_test_config_bits(pdev, &mpiix_enable_bits))
                return -ENOENT;
        ap->cbl = ATA_CBL_PATA40;
        return ata_std_prereset(ap);
@@ -80,8 +77,8 @@ static void mpiix_error_handler(struct ata_port *ap)
  *     @adev: ATA device
  *
  *     Called to do the PIO mode setup. The MPIIX allows us to program the
- *     IORDY sample point (2-5 clocks), recovery 1-4 clocks and whether
- *     prefetching or iordy are used.
+ *     IORDY sample point (2-5 clocks), recovery (1-4 clocks) and whether
+ *     prefetching or IORDY are used.
  *
  *     This would get very ugly because we can only program timing for one
  *     device at a time, the other gets PIO0. Fortunately libata calls
@@ -103,18 +100,19 @@ static void mpiix_set_piomode(struct ata_port *ap, struct ata_device *adev)
                            { 2, 3 }, };
 
        pci_read_config_word(pdev, IDETIM, &idetim);
-       /* Mask the IORDY/TIME/PPE0 bank for this device */
+
+       /* Mask the IORDY/TIME/PPE for this device */
        if (adev->class == ATA_DEV_ATA)
-               control |= PPE;         /* PPE enable for disk */
+               control |= PPE;         /* Enable prefetch/posting for disk */
        if (ata_pio_need_iordy(adev))
-               control |= IORDY;       /* IORDY */
-       if (pio > 0)
+               control |= IORDY;
+       if (pio > 1)
                control |= FTIM;        /* This drive is on the fast timing bank */
 
        /* Mask out timing and clear both TIME bank selects */
        idetim &= 0xCCEE;
-       idetim &= ~(0x07  << (2 * adev->devno));
-       idetim |= (control << (2 * adev->devno));
+       idetim &= ~(0x07  << (4 * adev->devno));
+       idetim |= control << (4 * adev->devno);
 
        idetim |= (timings[pio][0] << 12) | (timings[pio][1] << 8);
        pci_write_config_word(pdev, IDETIM, idetim);
@@ -188,23 +186,24 @@ static struct ata_port_operations mpiix_port_ops = {
 
        .qc_prep        = ata_qc_prep,
        .qc_issue       = mpiix_qc_issue_prot,
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int mpiix_init_one(struct pci_dev *dev, const struct pci_device_id *id)
 {
        /* Single threaded by the PCI probe logic */
-       static struct ata_probe_ent probe[2];
+       static struct ata_probe_ent probe;
        static int printed_version;
+       void __iomem *cmd_addr, *ctl_addr;
        u16 idetim;
-       int enabled;
+       int irq;
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &dev->dev, "version " DRV_VERSION "\n");
@@ -217,65 +216,49 @@ static int mpiix_init_one(struct pci_dev *dev, const struct pci_device_id *id)
        if (!(idetim & ENABLED))
                return -ENODEV;
 
+       /* See if it's primary or secondary channel... */
+       if (!(idetim & SECONDARY)) {
+               irq = 14;
+               cmd_addr = devm_ioport_map(&dev->dev, 0x1F0, 8);
+               ctl_addr = devm_ioport_map(&dev->dev, 0x3F6, 1);
+       } else {
+               irq = 15;
+               cmd_addr = devm_ioport_map(&dev->dev, 0x170, 8);
+               ctl_addr = devm_ioport_map(&dev->dev, 0x376, 1);
+       }
+
+       if (!cmd_addr || !ctl_addr)
+               return -ENOMEM;
+
        /* We do our own plumbing to avoid leaking special cases for whacko
           ancient hardware into the core code. There are two issues to
           worry about.  #1 The chip is a bridge so if in legacy mode and
           without BARs set fools the setup.  #2 If you pci_disable_device
           the MPIIX your box goes castors up */
 
-       INIT_LIST_HEAD(&probe[0].node);
-       probe[0].dev = pci_dev_to_dev(dev);
-       probe[0].port_ops = &mpiix_port_ops;
-       probe[0].sht = &mpiix_sht;
-       probe[0].pio_mask = 0x1F;
-       probe[0].irq = 14;
-       probe[0].irq_flags = SA_SHIRQ;
-       probe[0].port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST;
-       probe[0].n_ports = 1;
-       probe[0].port[0].cmd_addr = 0x1F0;
-       probe[0].port[0].ctl_addr = 0x3F6;
-       probe[0].port[0].altstatus_addr = 0x3F6;
-
-       /* The secondary lurks at different addresses but is otherwise
-          the same beastie */
-
-       INIT_LIST_HEAD(&probe[1].node);
-       probe[1] = probe[0];
-       probe[1].irq = 15;
-       probe[1].port[0].cmd_addr = 0x170;
-       probe[1].port[0].ctl_addr = 0x376;
-       probe[1].port[0].altstatus_addr = 0x376;
+       INIT_LIST_HEAD(&probe.node);
+       probe.dev = pci_dev_to_dev(dev);
+       probe.port_ops = &mpiix_port_ops;
+       probe.sht = &mpiix_sht;
+       probe.pio_mask = 0x1F;
+       probe.irq_flags = IRQF_SHARED;
+       probe.port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST;
+       probe.n_ports = 1;
+
+       probe.irq = irq;
+       probe.port[0].cmd_addr = cmd_addr;
+       probe.port[0].ctl_addr = ctl_addr;
+       probe.port[0].altstatus_addr = ctl_addr;
 
        /* Let libata fill in the port details */
-       ata_std_ports(&probe[0].port[0]);
-       ata_std_ports(&probe[1].port[0]);
+       ata_std_ports(&probe.port[0]);
 
        /* Now add the port that is active */
-       enabled = (idetim & SECONDARY) ? 1 : 0;
-
-       if (ata_device_add(&probe[enabled]))
+       if (ata_device_add(&probe))
                return 0;
        return -ENODEV;
 }
 
-/**
- *     mpiix_remove_one        -       device unload
- *     @pdev: PCI device being removed
- *
- *     Handle an unplug/unload event for a PCI device. Unload the
- *     PCI driver but do not use the default handler as we *MUST NOT*
- *     disable the device as it has other functions.
- */
-
-static void __devexit mpiix_remove_one(struct pci_dev *pdev)
-{
-       struct device *dev = pci_dev_to_dev(pdev);
-       struct ata_host *host = dev_get_drvdata(dev);
-
-       ata_host_remove(host);
-       dev_set_drvdata(dev, NULL);
-}
-
 static const struct pci_device_id mpiix[] = {
        { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82371MX), },
 
@@ -286,7 +269,7 @@ static struct pci_driver mpiix_pci_driver = {
        .name           = DRV_NAME,
        .id_table       = mpiix,
        .probe          = mpiix_init_one,
-       .remove         = mpiix_remove_one,
+       .remove         = ata_pci_remove_one,
        .suspend        = ata_pci_device_suspend,
        .resume         = ata_pci_device_resume,
 };
index cf7fe037471c3e94660f97655885d53646a0295f..e8393e19be47d94b9c06b13e2a16ca157b9c9cce 100644 (file)
@@ -89,16 +89,16 @@ static const struct ata_port_operations netcell_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        /* IRQ-related hooks */
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        /* Generic PATA PCI ATA helpers */
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 
index c3032eb9010dfa4b6405f44f3daea6bb7477b469..3d1fa487c48606aa0ac745f4b023ad8a818aff4c 100644 (file)
@@ -179,14 +179,14 @@ static struct ata_port_operations ns87410_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ns87410_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int ns87410_init_one(struct pci_dev *dev, const struct pci_device_id *id)
index 10ac3cc10181cbd5b48cd45dcac06f6637797bc6..45215aa05e72b92a8b2b7d3c7be6804d5e2cbd0c 100644 (file)
@@ -25,7 +25,7 @@
 #include <linux/ata.h>
 
 #define DRV_NAME       "pata_oldpiix"
-#define DRV_VERSION    "0.5.2"
+#define DRV_VERSION    "0.5.3"
 
 /**
  *     oldpiix_pre_reset               -       probe begin
@@ -94,19 +94,21 @@ static void oldpiix_set_piomode (struct ata_port *ap, struct ata_device *adev)
                            { 2, 1 },
                            { 2, 3 }, };
 
-       if (pio > 2)
-               control |= 1;   /* TIME1 enable */
+       if (pio > 1)
+               control |= 1;   /* TIME */
        if (ata_pio_need_iordy(adev))
-               control |= 2;   /* IE IORDY */
+               control |= 2;   /* IE */
 
-       /* Intel specifies that the PPE functionality is for disk only */
+       /* Intel specifies that the prefetch/posting is for disk only */
        if (adev->class == ATA_DEV_ATA)
-               control |= 4;   /* PPE enable */
+               control |= 4;   /* PPE */
 
        pci_read_config_word(dev, idetm_port, &idetm_data);
 
-       /* Enable PPE, IE and TIME as appropriate. Clear the other
-          drive timing bits */
+       /*
+        * Set PPE, IE and TIME as appropriate.
+        * Clear the other drive's timing bits.
+        */
        if (adev->devno == 0) {
                idetm_data &= 0xCCE0;
                idetm_data |= control;
@@ -259,14 +261,14 @@ static const struct ata_port_operations oldpiix_pata_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = oldpiix_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 
index c2988b0aa8ea07f30f73054ab97e5729ed733ecd..da1aa148b37d9f69b5d91c88b57608f1e7d65461 100644 (file)
@@ -95,18 +95,18 @@ static void opti_error_handler(struct ata_port *ap)
 
 static void opti_write_reg(struct ata_port *ap, u8 val, int reg)
 {
-       unsigned long regio = ap->ioaddr.cmd_addr;
+       void __iomem *regio = ap->ioaddr.cmd_addr;
 
        /* These 3 unlock the control register access */
-       inw(regio + 1);
-       inw(regio + 1);
-       outb(3, regio + 2);
+       ioread16(regio + 1);
+       ioread16(regio + 1);
+       iowrite8(3, regio + 2);
 
        /* Do the I/O */
-       outb(val, regio + reg);
+       iowrite8(val, regio + reg);
 
        /* Relock */
-       outb(0x83, regio + 2);
+       iowrite8(0x83, regio + 2);
 }
 
 /**
@@ -124,7 +124,7 @@ static void opti_set_piomode(struct ata_port *ap, struct ata_device *adev)
        struct ata_device *pair = ata_dev_pair(adev);
        int clock;
        int pio = adev->pio_mode - XFER_PIO_0;
-       unsigned long regio = ap->ioaddr.cmd_addr;
+       void __iomem *regio = ap->ioaddr.cmd_addr;
        u8 addr;
 
        /* Address table precomputed with prefetch off and a DCLK of 2 */
@@ -137,8 +137,8 @@ static void opti_set_piomode(struct ata_port *ap, struct ata_device *adev)
                { 0x58, 0x44, 0x32, 0x22, 0x21 }
        };
 
-       outb(0xff, regio + 5);
-       clock = inw(regio + 5) & 1;
+       iowrite8(0xff, regio + 5);
+       clock = ioread16(regio + 5) & 1;
 
        /*
         *      As with many controllers the address setup time is shared
@@ -205,14 +205,14 @@ static struct ata_port_operations opti_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int opti_init_one(struct pci_dev *dev, const struct pci_device_id *id)
index 80d111c569dc25db5fc74d76e199a31bf3c28a03..d80b36e209cc52bc6de595d414caecb32163a975 100644 (file)
@@ -91,12 +91,12 @@ static void optidma_error_handler(struct ata_port *ap)
 
 static void optidma_unlock(struct ata_port *ap)
 {
-       unsigned long regio = ap->ioaddr.cmd_addr;
+       void __iomem *regio = ap->ioaddr.cmd_addr;
 
        /* These 3 unlock the control register access */
-       inw(regio + 1);
-       inw(regio + 1);
-       outb(3, regio + 2);
+       ioread16(regio + 1);
+       ioread16(regio + 1);
+       iowrite8(3, regio + 2);
 }
 
 /**
@@ -108,10 +108,10 @@ static void optidma_unlock(struct ata_port *ap)
 
 static void optidma_lock(struct ata_port *ap)
 {
-       unsigned long regio = ap->ioaddr.cmd_addr;
+       void __iomem *regio = ap->ioaddr.cmd_addr;
 
        /* Relock */
-       outb(0x83, regio + 2);
+       iowrite8(0x83, regio + 2);
 }
 
 /**
@@ -133,7 +133,7 @@ static void optidma_set_mode(struct ata_port *ap, struct ata_device *adev, u8 mo
        struct ata_device *pair = ata_dev_pair(adev);
        int pio = adev->pio_mode - XFER_PIO_0;
        int dma = adev->dma_mode - XFER_MW_DMA_0;
-       unsigned long regio = ap->ioaddr.cmd_addr;
+       void __iomem *regio = ap->ioaddr.cmd_addr;
        u8 addr;
 
        /* Address table precomputed with a DCLK of 2 */
@@ -178,20 +178,20 @@ static void optidma_set_mode(struct ata_port *ap, struct ata_device *adev, u8 mo
 
        /* Commence primary programming sequence */
        /* First we load the device number into the timing select */
-       outb(adev->devno, regio + MISC_REG);
+       iowrite8(adev->devno, regio + MISC_REG);
        /* Now we load the data timings into read data/write data */
        if (mode < XFER_MW_DMA_0) {
-               outb(data_rec_timing[pci_clock][pio], regio + READ_REG);
-               outb(data_rec_timing[pci_clock][pio], regio + WRITE_REG);
+               iowrite8(data_rec_timing[pci_clock][pio], regio + READ_REG);
+               iowrite8(data_rec_timing[pci_clock][pio], regio + WRITE_REG);
        } else if (mode < XFER_UDMA_0) {
-               outb(dma_data_rec_timing[pci_clock][dma], regio + READ_REG);
-               outb(dma_data_rec_timing[pci_clock][dma], regio + WRITE_REG);
+               iowrite8(dma_data_rec_timing[pci_clock][dma], regio + READ_REG);
+               iowrite8(dma_data_rec_timing[pci_clock][dma], regio + WRITE_REG);
        }
        /* Finally we load the address setup into the misc register */
-       outb(addr | adev->devno, regio + MISC_REG);
+       iowrite8(addr | adev->devno, regio + MISC_REG);
 
        /* Programming sequence complete, timing 0 dev 0, timing 1 dev 1 */
-       outb(0x85, regio + CNTRL_REG);
+       iowrite8(0x85, regio + CNTRL_REG);
 
        /* Switch back to IDE mode */
        optidma_lock(ap);
@@ -389,14 +389,14 @@ static struct ata_port_operations optidma_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations optiplus_port_ops = {
@@ -424,14 +424,14 @@ static struct ata_port_operations optiplus_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
index 9ed7f58424a3a31214fb3b436f00510cb07a9264..36468ec6454cad8606a7908bb3df959997647b48 100644 (file)
@@ -88,14 +88,14 @@ static struct ata_port_operations pcmcia_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer_noirq,
+       .data_xfer      = ata_data_xfer_noirq,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 #define CS_CHECK(fn, ret) \
@@ -123,6 +123,7 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
        cistpl_cftable_entry_t *cfg;
        int pass, last_ret = 0, last_fn = 0, is_kme = 0, ret = -ENOMEM;
        unsigned long io_base, ctl_base;
+       void __iomem *io_addr, *ctl_addr;
 
        info = kzalloc(sizeof(*info), GFP_KERNEL);
        if (info == NULL)
@@ -233,10 +234,17 @@ next_entry:
        CS_CHECK(RequestIRQ, pcmcia_request_irq(pdev, &pdev->irq));
        CS_CHECK(RequestConfiguration, pcmcia_request_configuration(pdev, &pdev->conf));
 
+       /* iomap */
+       ret = -ENOMEM;
+       io_addr = devm_ioport_map(&pdev->dev, io_base, 8);
+       ctl_addr = devm_ioport_map(&pdev->dev, ctl_base, 1);
+       if (!io_addr || !ctl_addr)
+               goto failed;
+
        /* Success. Disable the IRQ nIEN line, do quirks */
-       outb(0x02, ctl_base);
+       iowrite8(0x02, ctl_addr);
        if (is_kme)
-               outb(0x81, ctl_base + 0x01);
+               iowrite8(0x81, ctl_addr + 0x01);
 
        /* FIXME: Could be more ports at base + 0x10 but we only deal with
           one right now */
@@ -256,13 +264,14 @@ next_entry:
        ae.n_ports = 1;
        ae.pio_mask = 1;                /* ISA so PIO 0 cycles */
        ae.irq = pdev->irq.AssignedIRQ;
-       ae.irq_flags = SA_SHIRQ;
+       ae.irq_flags = IRQF_SHARED;
        ae.port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST;
-       ae.port[0].cmd_addr = io_base;
-       ae.port[0].altstatus_addr = ctl_base;
-       ae.port[0].ctl_addr = ctl_base;
+       ae.port[0].cmd_addr = io_addr;
+       ae.port[0].altstatus_addr = ctl_addr;
+       ae.port[0].ctl_addr = ctl_addr;
        ata_std_ports(&ae.port[0]);
 
+       ret = -ENODEV;
        if (ata_device_add(&ae) == 0)
                goto failed;
 
@@ -298,7 +307,7 @@ static void pcmcia_remove_one(struct pcmcia_device *pdev)
                /* If we have attached the device to the ATA layer, detach it */
                if (info->ndev) {
                        struct ata_host *host = dev_get_drvdata(dev);
-                       ata_host_remove(host);
+                       ata_host_detach(host);
                        dev_set_drvdata(dev, NULL);
                }
                info->ndev = 0;
index 76dd1c935dbd34449b78d49bbea80dc0587fca45..61537873d28ef133d4dc5efab882b7efc2c3714c 100644 (file)
@@ -33,7 +33,6 @@
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_cmnd.h>
 #include <linux/libata.h>
-#include <asm/io.h>
 
 #define DRV_NAME       "pata_pdc2027x"
 #define DRV_VERSION    "0.74-ac5"
@@ -46,6 +45,8 @@
 #endif
 
 enum {
+       PDC_MMIO_BAR            = 5,
+
        PDC_UDMA_100            = 0,
        PDC_UDMA_133            = 1,
 
@@ -62,7 +63,6 @@ enum {
 };
 
 static int pdc2027x_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
-static void pdc2027x_remove_one(struct pci_dev *pdev);
 static void pdc2027x_error_handler(struct ata_port *ap);
 static void pdc2027x_set_piomode(struct ata_port *ap, struct ata_device *adev);
 static void pdc2027x_set_dmamode(struct ata_port *ap, struct ata_device *adev);
@@ -123,7 +123,7 @@ static struct pci_driver pdc2027x_pci_driver = {
        .name                   = DRV_NAME,
        .id_table               = pdc2027x_pci_tbl,
        .probe                  = pdc2027x_init_one,
-       .remove                 = __devexit_p(pdc2027x_remove_one),
+       .remove                 = ata_pci_remove_one,
 };
 
 static struct scsi_host_template pdc2027x_sht = {
@@ -160,7 +160,7 @@ static struct ata_port_operations pdc2027x_pata100_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_mmio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .freeze                 = ata_bmdma_freeze,
        .thaw                   = ata_bmdma_thaw,
@@ -169,10 +169,10 @@ static struct ata_port_operations pdc2027x_pata100_ops = {
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_pci_host_stop,
 };
 
 static struct ata_port_operations pdc2027x_pata133_ops = {
@@ -194,7 +194,7 @@ static struct ata_port_operations pdc2027x_pata133_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_mmio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .freeze                 = ata_bmdma_freeze,
        .thaw                   = ata_bmdma_thaw,
@@ -203,10 +203,10 @@ static struct ata_port_operations pdc2027x_pata133_ops = {
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_pci_host_stop,
 };
 
 static struct ata_port_info pdc2027x_port_info[] = {
@@ -245,7 +245,7 @@ MODULE_DEVICE_TABLE(pci, pdc2027x_pci_tbl);
  */
 static inline void __iomem *port_mmio(struct ata_port *ap, unsigned int offset)
 {
-       return ap->host->mmio_base + ap->port_no * 0x100 + offset;
+       return ap->host->iomap[PDC_MMIO_BAR] + ap->port_no * 0x100 + offset;
 }
 
 /**
@@ -526,18 +526,19 @@ static int pdc2027x_check_atapi_dma(struct ata_queued_cmd *qc)
 
 static long pdc_read_counter(struct ata_probe_ent *probe_ent)
 {
+       void __iomem *mmio_base = probe_ent->iomap[PDC_MMIO_BAR];
        long counter;
        int retry = 1;
        u32 bccrl, bccrh, bccrlv, bccrhv;
 
 retry:
-       bccrl = readl(probe_ent->mmio_base + PDC_BYTE_COUNT) & 0xffff;
-       bccrh = readl(probe_ent->mmio_base + PDC_BYTE_COUNT + 0x100) & 0xffff;
+       bccrl = readl(mmio_base + PDC_BYTE_COUNT) & 0xffff;
+       bccrh = readl(mmio_base + PDC_BYTE_COUNT + 0x100) & 0xffff;
        rmb();
 
        /* Read the counter values again for verification */
-       bccrlv = readl(probe_ent->mmio_base + PDC_BYTE_COUNT) & 0xffff;
-       bccrhv = readl(probe_ent->mmio_base + PDC_BYTE_COUNT + 0x100) & 0xffff;
+       bccrlv = readl(mmio_base + PDC_BYTE_COUNT) & 0xffff;
+       bccrhv = readl(mmio_base + PDC_BYTE_COUNT + 0x100) & 0xffff;
        rmb();
 
        counter = (bccrh << 15) | bccrl;
@@ -568,7 +569,7 @@ retry:
  */
 static void pdc_adjust_pll(struct ata_probe_ent *probe_ent, long pll_clock, unsigned int board_idx)
 {
-
+       void __iomem *mmio_base = probe_ent->iomap[PDC_MMIO_BAR];
        u16 pll_ctl;
        long pll_clock_khz = pll_clock / 1000;
        long pout_required = board_idx? PDC_133_MHZ:PDC_100_MHZ;
@@ -587,7 +588,7 @@ static void pdc_adjust_pll(struct ata_probe_ent *probe_ent, long pll_clock, unsi
        /* Show the current clock value of PLL control register
         * (maybe already configured by the firmware)
         */
-       pll_ctl = readw(probe_ent->mmio_base + PDC_PLL_CTL);
+       pll_ctl = readw(mmio_base + PDC_PLL_CTL);
 
        PDPRINTK("pll_ctl[%X]\n", pll_ctl);
 #endif
@@ -627,8 +628,8 @@ static void pdc_adjust_pll(struct ata_probe_ent *probe_ent, long pll_clock, unsi
 
        PDPRINTK("Writing pll_ctl[%X]\n", pll_ctl);
 
-       writew(pll_ctl, probe_ent->mmio_base + PDC_PLL_CTL);
-       readw(probe_ent->mmio_base + PDC_PLL_CTL); /* flush */
+       writew(pll_ctl, mmio_base + PDC_PLL_CTL);
+       readw(mmio_base + PDC_PLL_CTL); /* flush */
 
        /* Wait the PLL circuit to be stable */
        mdelay(30);
@@ -638,7 +639,7 @@ static void pdc_adjust_pll(struct ata_probe_ent *probe_ent, long pll_clock, unsi
         *  Show the current clock value of PLL control register
         * (maybe configured by the firmware)
         */
-       pll_ctl = readw(probe_ent->mmio_base + PDC_PLL_CTL);
+       pll_ctl = readw(mmio_base + PDC_PLL_CTL);
 
        PDPRINTK("pll_ctl[%X]\n", pll_ctl);
 #endif
@@ -654,6 +655,7 @@ static void pdc_adjust_pll(struct ata_probe_ent *probe_ent, long pll_clock, unsi
  */
 static long pdc_detect_pll_input_clock(struct ata_probe_ent *probe_ent)
 {
+       void __iomem *mmio_base = probe_ent->iomap[PDC_MMIO_BAR];
        u32 scr;
        long start_count, end_count;
        long pll_clock;
@@ -662,10 +664,10 @@ static long pdc_detect_pll_input_clock(struct ata_probe_ent *probe_ent)
        start_count = pdc_read_counter(probe_ent);
 
        /* Start the test mode */
-       scr = readl(probe_ent->mmio_base + PDC_SYS_CTL);
+       scr = readl(mmio_base + PDC_SYS_CTL);
        PDPRINTK("scr[%X]\n", scr);
-       writel(scr | (0x01 << 14), probe_ent->mmio_base + PDC_SYS_CTL);
-       readl(probe_ent->mmio_base + PDC_SYS_CTL); /* flush */
+       writel(scr | (0x01 << 14), mmio_base + PDC_SYS_CTL);
+       readl(mmio_base + PDC_SYS_CTL); /* flush */
 
        /* Let the counter run for 100 ms. */
        mdelay(100);
@@ -674,10 +676,10 @@ static long pdc_detect_pll_input_clock(struct ata_probe_ent *probe_ent)
        end_count = pdc_read_counter(probe_ent);
 
        /* Stop the test mode */
-       scr = readl(probe_ent->mmio_base + PDC_SYS_CTL);
+       scr = readl(mmio_base + PDC_SYS_CTL);
        PDPRINTK("scr[%X]\n", scr);
-       writel(scr & ~(0x01 << 14), probe_ent->mmio_base + PDC_SYS_CTL);
-       readl(probe_ent->mmio_base + PDC_SYS_CTL); /* flush */
+       writel(scr & ~(0x01 << 14), mmio_base + PDC_SYS_CTL);
+       readl(mmio_base + PDC_SYS_CTL); /* flush */
 
        /* calculate the input clock in Hz */
        pll_clock = (start_count - end_count) * 10;
@@ -722,7 +724,7 @@ static int pdc_hardware_init(struct pci_dev *pdev, struct ata_probe_ent *pe, uns
  * @port: ata ioports to setup
  * @base: base address
  */
-static void pdc_ata_setup_port(struct ata_ioports *port, unsigned long base)
+static void pdc_ata_setup_port(struct ata_ioports *port, void __iomem *base)
 {
        port->cmd_addr          =
        port->data_addr         = base;
@@ -755,48 +757,37 @@ static int __devinit pdc2027x_init_one(struct pci_dev *pdev, const struct pci_de
        static int printed_version;
        unsigned int board_idx = (unsigned int) ent->driver_data;
 
-       struct ata_probe_ent *probe_ent = NULL;
-       unsigned long base;
+       struct ata_probe_ent *probe_ent;
        void __iomem *mmio_base;
        int rc;
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
-       rc = pci_request_regions(pdev, DRV_NAME);
+       rc = pcim_iomap_regions(pdev, 1 << PDC_MMIO_BAR, DRV_NAME);
        if (rc)
-               goto err_out;
+               return rc;
 
        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
        /* Prepare the probe entry */
-       probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
 
-       mmio_base = pci_iomap(pdev, 5, 0);
-       if (!mmio_base) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
-
-       base = (unsigned long) mmio_base;
-
        probe_ent->sht          = pdc2027x_port_info[board_idx].sht;
        probe_ent->port_flags   = pdc2027x_port_info[board_idx].flags;
        probe_ent->pio_mask     = pdc2027x_port_info[board_idx].pio_mask;
@@ -805,13 +796,15 @@ static int __devinit pdc2027x_init_one(struct pci_dev *pdev, const struct pci_de
        probe_ent->port_ops     = pdc2027x_port_info[board_idx].port_ops;
 
                probe_ent->irq = pdev->irq;
-               probe_ent->irq_flags = SA_SHIRQ;
-       probe_ent->mmio_base = mmio_base;
+               probe_ent->irq_flags = IRQF_SHARED;
+       probe_ent->iomap = pcim_iomap_table(pdev);
 
-       pdc_ata_setup_port(&probe_ent->port[0], base + 0x17c0);
-       probe_ent->port[0].bmdma_addr = base + 0x1000;
-       pdc_ata_setup_port(&probe_ent->port[1], base + 0x15c0);
-       probe_ent->port[1].bmdma_addr = base + 0x1008;
+       mmio_base = probe_ent->iomap[PDC_MMIO_BAR];
+
+       pdc_ata_setup_port(&probe_ent->port[0], mmio_base + 0x17c0);
+       probe_ent->port[0].bmdma_addr = mmio_base + 0x1000;
+       pdc_ata_setup_port(&probe_ent->port[1], mmio_base + 0x15c0);
+       probe_ent->port[1].bmdma_addr = mmio_base + 0x1008;
 
        probe_ent->n_ports = 2;
 
@@ -820,32 +813,13 @@ static int __devinit pdc2027x_init_one(struct pci_dev *pdev, const struct pci_de
 
        /* initialize adapter */
        if (pdc_hardware_init(pdev, probe_ent, board_idx) != 0)
-               goto err_out_free_ent;
+               return -EIO;
 
-       ata_device_add(probe_ent);
-       kfree(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
+       devm_kfree(&pdev->dev, probe_ent);
        return 0;
-
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       pci_disable_device(pdev);
-       return rc;
-}
-
-/**
- * pdc2027x_remove_one - Called to remove a single instance of the
- * adapter.
- *
- * @dev: The PCI device to remove.
- * FIXME: module load/unload not working yet
- */
-static void __devexit pdc2027x_remove_one(struct pci_dev *pdev)
-{
-       ata_pci_remove_one(pdev);
 }
 
 /**
index ad691b9e77434d94bc5491ec250304eb573e970a..6dd63413a523475c82f45cd5c03746b9b13c01b2 100644 (file)
@@ -170,17 +170,17 @@ static void pdc2026x_bmdma_start(struct ata_queued_cmd *qc)
        struct ata_taskfile *tf = &qc->tf;
        int sel66 = ap->port_no ? 0x08: 0x02;
 
-       unsigned long master = ap->host->ports[0]->ioaddr.bmdma_addr;
-       unsigned long clock = master + 0x11;
-       unsigned long atapi_reg = master + 0x20 + (4 * ap->port_no);
+       void __iomem *master = ap->host->ports[0]->ioaddr.bmdma_addr;
+       void __iomem *clock = master + 0x11;
+       void __iomem *atapi_reg = master + 0x20 + (4 * ap->port_no);
 
        u32 len;
 
        /* Check we keep host level locking here */
        if (adev->dma_mode >= XFER_UDMA_2)
-               outb(inb(clock) | sel66, clock);
+               iowrite8(ioread8(clock) | sel66, clock);
        else
-               outb(inb(clock) & ~sel66, clock);
+               iowrite8(ioread8(clock) & ~sel66, clock);
 
        /* The DMA clocks may have been trashed by a reset. FIXME: make conditional
           and move to qc_issue ? */
@@ -189,17 +189,14 @@ static void pdc2026x_bmdma_start(struct ata_queued_cmd *qc)
        /* Cases the state machine will not complete correctly without help */
        if ((tf->flags & ATA_TFLAG_LBA48) ||  tf->protocol == ATA_PROT_ATAPI_DMA)
        {
-               if (tf->flags & ATA_TFLAG_LBA48)
-                       len = qc->nsect * 512;
-               else
-                       len = qc->nbytes;
+               len = qc->nbytes;
 
                if (tf->flags & ATA_TFLAG_WRITE)
                        len |= 0x06000000;
                else
                        len |= 0x05000000;
 
-               outl(len, atapi_reg);
+               iowrite32(len, atapi_reg);
        }
 
        /* Activate DMA */
@@ -222,19 +219,19 @@ static void pdc2026x_bmdma_stop(struct ata_queued_cmd *qc)
 
        int sel66 = ap->port_no ? 0x08: 0x02;
        /* The clock bits are in the same register for both channels */
-       unsigned long master = ap->host->ports[0]->ioaddr.bmdma_addr;
-       unsigned long clock = master + 0x11;
-       unsigned long atapi_reg = master + 0x20 + (4 * ap->port_no);
+       void __iomem *master = ap->host->ports[0]->ioaddr.bmdma_addr;
+       void __iomem *clock = master + 0x11;
+       void __iomem *atapi_reg = master + 0x20 + (4 * ap->port_no);
 
        /* Cases the state machine will not complete correctly */
        if (tf->protocol == ATA_PROT_ATAPI_DMA || ( tf->flags & ATA_TFLAG_LBA48)) {
-               outl(0, atapi_reg);
-               outb(inb(clock) & ~sel66, clock);
+               iowrite32(0, atapi_reg);
+               iowrite8(ioread8(clock) & ~sel66, clock);
        }
        /* Check we keep host level locking here */
        /* Flip back to 33Mhz for PIO */
        if (adev->dma_mode >= XFER_UDMA_2)
-               outb(inb(clock) & ~sel66, clock);
+               iowrite8(ioread8(clock) & ~sel66, clock);
 
        ata_bmdma_stop(qc);
 }
@@ -297,14 +294,14 @@ static struct ata_port_operations pdc2024x_port_ops = {
 
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations pdc2026x_port_ops = {
@@ -331,14 +328,14 @@ static struct ata_port_operations pdc2026x_port_ops = {
 
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int pdc202xx_init_one(struct pci_dev *dev, const struct pci_device_id *id)
index 40ae11cbfda43b5f43207aa6a3e6d8983e873ba5..479a326114e0ca4132740f2e619a793a9ef5046b 100644 (file)
@@ -47,23 +47,6 @@ static int pata_platform_set_mode(struct ata_port *ap, struct ata_device **unuse
        return 0;
 }
 
-static void pata_platform_host_stop(struct ata_host *host)
-{
-       int i;
-
-       /*
-        * Unmap the bases for MMIO
-        */
-       for (i = 0; i < host->n_ports; i++) {
-               struct ata_port *ap = host->ports[i];
-
-               if (ap->flags & ATA_FLAG_MMIO) {
-                       iounmap((void __iomem *)ap->ioaddr.ctl_addr);
-                       iounmap((void __iomem *)ap->ioaddr.cmd_addr);
-               }
-       }
-}
-
 static struct scsi_host_template pata_platform_sht = {
        .module                 = THIS_MODULE,
        .name                   = DRV_NAME,
@@ -100,14 +83,14 @@ static struct ata_port_operations pata_platform_port_ops = {
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
 
-       .data_xfer              = ata_pio_data_xfer_noirq,
+       .data_xfer              = ata_data_xfer_noirq,
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = pata_platform_host_stop
 };
 
 static void pata_platform_setup_port(struct ata_ioports *ioaddr,
@@ -153,7 +136,6 @@ static int __devinit pata_platform_probe(struct platform_device *pdev)
        struct resource *io_res, *ctl_res;
        struct ata_probe_ent ae;
        unsigned int mmio;
-       int ret;
 
        /*
         * Simple resource validation ..
@@ -207,46 +189,29 @@ static int __devinit pata_platform_probe(struct platform_device *pdev)
         * Handle the MMIO case
         */
        if (mmio) {
-               ae.port_flags |= ATA_FLAG_MMIO;
-
-               ae.port[0].cmd_addr = (unsigned long)ioremap(io_res->start,
+               ae.port[0].cmd_addr = devm_ioremap(&pdev->dev, io_res->start,
                                io_res->end - io_res->start + 1);
-               if (unlikely(!ae.port[0].cmd_addr)) {
-                       dev_err(&pdev->dev, "failed to remap IO base\n");
-                       return -ENXIO;
-               }
-
-               ae.port[0].ctl_addr = (unsigned long)ioremap(ctl_res->start,
+               ae.port[0].ctl_addr = devm_ioremap(&pdev->dev, ctl_res->start,
                                ctl_res->end - ctl_res->start + 1);
-               if (unlikely(!ae.port[0].ctl_addr)) {
-                       dev_err(&pdev->dev, "failed to remap CTL base\n");
-                       ret = -ENXIO;
-                       goto bad_remap;
-               }
        } else {
-               ae.port[0].cmd_addr = io_res->start;
-               ae.port[0].ctl_addr = ctl_res->start;
+               ae.port[0].cmd_addr = devm_ioport_map(&pdev->dev, io_res->start,
+                               io_res->end - io_res->start + 1);
+               ae.port[0].ctl_addr = devm_ioport_map(&pdev->dev, ctl_res->start,
+                               ctl_res->end - ctl_res->start + 1);
+       }
+       if (!ae.port[0].cmd_addr || !ae.port[0].ctl_addr) {
+               dev_err(&pdev->dev, "failed to map IO/CTL base\n");
+               return -ENOMEM;
        }
 
        ae.port[0].altstatus_addr = ae.port[0].ctl_addr;
 
        pata_platform_setup_port(&ae.port[0], pdev->dev.platform_data);
 
-       if (unlikely(ata_device_add(&ae) == 0)) {
-               ret = -ENODEV;
-               goto add_failed;
-       }
+       if (unlikely(ata_device_add(&ae) == 0))
+               return -ENODEV;
 
        return 0;
-
-add_failed:
-       if (ae.port[0].ctl_addr && mmio)
-               iounmap((void __iomem *)ae.port[0].ctl_addr);
-bad_remap:
-       if (ae.port[0].cmd_addr && mmio)
-               iounmap((void __iomem *)ae.port[0].cmd_addr);
-
-       return ret;
 }
 
 /**
@@ -261,7 +226,7 @@ static int __devexit pata_platform_remove(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct ata_host *host = dev_get_drvdata(dev);
 
-       ata_host_remove(host);
+       ata_host_detach(host);
        dev_set_drvdata(dev, NULL);
 
        return 0;
index afc0d990e7d6debecea9da3768e39cdc5c2e8364..4362141976adfa41af697adcbede81f4b1fdb44d 100644 (file)
@@ -131,22 +131,24 @@ static void qdi_data_xfer(struct ata_device *adev, unsigned char *buf, unsigned
 
        if (ata_id_has_dword_io(adev->id)) {
                if (write_data)
-                       outsl(ap->ioaddr.data_addr, buf, buflen >> 2);
+                       iowrite32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
                else
-                       insl(ap->ioaddr.data_addr, buf, buflen >> 2);
+                       ioread32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
 
                if (unlikely(slop)) {
                        u32 pad;
                        if (write_data) {
                                memcpy(&pad, buf + buflen - slop, slop);
-                               outl(le32_to_cpu(pad), ap->ioaddr.data_addr);
+                               pad = le32_to_cpu(pad);
+                               iowrite32(pad, ap->ioaddr.data_addr);
                        } else {
-                               pad = cpu_to_le32(inl(ap->ioaddr.data_addr));
+                               pad = ioread32(ap->ioaddr.data_addr);
+                               pad = cpu_to_le32(pad);
                                memcpy(buf + buflen - slop, &pad, slop);
                        }
                }
        } else
-               ata_pio_data_xfer(adev, buf, buflen, write_data);
+               ata_data_xfer(adev, buf, buflen, write_data);
 }
 
 static struct scsi_host_template qdi_sht = {
@@ -189,10 +191,10 @@ static struct ata_port_operations qdi6500_port_ops = {
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations qdi6580_port_ops = {
@@ -217,10 +219,10 @@ static struct ata_port_operations qdi6580_port_ops = {
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
@@ -238,10 +240,9 @@ static __init int qdi_init_one(unsigned long port, int type, unsigned long io, i
 {
        struct ata_probe_ent ae;
        struct platform_device *pdev;
+       void __iomem *io_addr, *ctl_addr;
        int ret;
 
-       unsigned long ctrl = io + 0x206;
-
        /*
         *      Fill in a probe structure first of all
         */
@@ -250,6 +251,12 @@ static __init int qdi_init_one(unsigned long port, int type, unsigned long io, i
        if (IS_ERR(pdev))
                return PTR_ERR(pdev);
 
+       ret = -ENOMEM;
+       io_addr = devm_ioport_map(&pdev->dev, io, 8);
+       ctl_addr = devm_ioport_map(&pdev->dev, io + 0x206, 1);
+       if (!io_addr || !ctl_addr)
+               goto fail;
+
        memset(&ae, 0, sizeof(struct ata_probe_ent));
        INIT_LIST_HEAD(&ae.node);
        ae.dev = &pdev->dev;
@@ -257,19 +264,21 @@ static __init int qdi_init_one(unsigned long port, int type, unsigned long io, i
        if (type == 6580) {
                ae.port_ops = &qdi6580_port_ops;
                ae.pio_mask = 0x1F;
+               ae.port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST;
        } else {
                ae.port_ops = &qdi6500_port_ops;
                ae.pio_mask = 0x07;     /* Actually PIO3 !IORDY is possible */
+               ae.port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST |
+                               ATA_FLAG_NO_IORDY;
        }
 
        ae.sht = &qdi_sht;
        ae.n_ports = 1;
        ae.irq = irq;
        ae.irq_flags = 0;
-       ae.port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST;
-       ae.port[0].cmd_addr = io;
-       ae.port[0].altstatus_addr = ctrl;
-       ae.port[0].ctl_addr =   ctrl;
+       ae.port[0].cmd_addr = io_addr;
+       ae.port[0].altstatus_addr = ctl_addr;
+       ae.port[0].ctl_addr = ctl_addr;
        ata_std_ports(&ae.port[0]);
 
        /*
@@ -282,14 +291,17 @@ static __init int qdi_init_one(unsigned long port, int type, unsigned long io, i
        qdi_data[nr_qdi_host].platform_dev = pdev;
 
        printk(KERN_INFO DRV_NAME": qd%d at 0x%lx.\n", type, io);
-       ret = ata_device_add(&ae);
-       if (ret == 0) {
-               platform_device_unregister(pdev);
-               return -ENODEV;
-       }
+
+       ret = -ENODEV;
+       if (!ata_device_add(&ae))
+               goto fail;
 
        qdi_host[nr_qdi_host++] = dev_get_drvdata(&pdev->dev);
        return 0;
+
+ fail:
+       platform_device_unregister(pdev);
+       return ret;
 }
 
 /**
@@ -382,7 +394,7 @@ static __exit void qdi_exit(void)
        int i;
 
        for (i = 0; i < nr_qdi_host; i++) {
-               ata_host_remove(qdi_host[i]);
+               ata_host_detach(qdi_host[i]);
                /* Free the control resource. The 6580 dual channel has the resources
                 * claimed as a pair of 2 byte resources so we need no special cases...
                 */
index 065541d034ad200e1cce593545920cf03dbad7f7..0d1e571ef6333572aa19df27b3588691c894cf7f 100644 (file)
@@ -255,14 +255,14 @@ static const struct ata_port_operations radisys_pata_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = radisys_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 
index cec0729225e1a62eb77b0a371b429d6aaa2a6508..71a2bac09e0d90ee7638d9ecc129d7ef1141b5d7 100644 (file)
@@ -115,7 +115,7 @@ static struct ata_port_operations rz1000_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .freeze         = ata_bmdma_freeze,
        .thaw           = ata_bmdma_thaw,
@@ -124,10 +124,10 @@ static struct ata_port_operations rz1000_port_ops = {
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int rz1000_fifo_disable(struct pci_dev *pdev)
index a3b35bc5039492edae8e1bc35f2759c7d5949096..58e42fbd14f939f9104758a044cda7b2f077ee72 100644 (file)
@@ -220,14 +220,14 @@ static struct ata_port_operations sc1200_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = sc1200_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
index f02b6a3b0f10fed4dd1b30eecc7cf93b6cee0a88..ad5b43fef3d1a94914d090fc88476ed100a0e2a1 100644 (file)
@@ -218,25 +218,18 @@ static unsigned long serverworks_osb4_filter(const struct ata_port *ap, struct a
 static unsigned long serverworks_csb_filter(const struct ata_port *ap, struct ata_device *adev, unsigned long mask)
 {
        const char *p;
-       char model_num[40];
-       int len, i;
+       char model_num[ATA_ID_PROD_LEN + 1];
+       int i;
 
        /* Disk, UDMA */
        if (adev->class != ATA_DEV_ATA)
                return ata_pci_default_filter(ap, adev, mask);
 
        /* Actually do need to check */
-       ata_id_string(adev->id, model_num, ATA_ID_PROD_OFS, sizeof(model_num));
-       /* Precuationary - why not do this in the libata core ?? */
+       ata_id_c_string(adev->id, model_num, ATA_ID_PROD, sizeof(model_num));
 
-       len = strlen(model_num);
-       while ((len > 0) && (model_num[len - 1] == ' ')) {
-               len--;
-               model_num[len] = 0;
-       }
-
-       for(i = 0; (p = csb_bad_ata100[i]) != NULL; i++) {
-               if (!strncmp(p, model_num, len))
+       for (i = 0; (p = csb_bad_ata100[i]) != NULL; i++) {
+               if (!strcmp(p, model_num))
                        mask &= ~(0x1F << ATA_SHIFT_UDMA);
        }
        return ata_pci_default_filter(ap, adev, mask);
@@ -355,14 +348,14 @@ static struct ata_port_operations serverworks_osb4_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations serverworks_csb_port_ops = {
@@ -390,14 +383,14 @@ static struct ata_port_operations serverworks_csb_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int serverworks_fixup_osb4(struct pci_dev *pdev)
@@ -559,7 +552,7 @@ static int serverworks_reinit_one(struct pci_dev *pdev)
 {
        /* Force master latency timer to 64 PCI clocks */
        pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x40);
-       
+
        switch (pdev->device)
        {
                case PCI_DEVICE_ID_SERVERWORKS_OSB4IDE:
index e8dfd8fc3ff782caf72b3550261e008d02aeae51..ed79fabe025c1e5beed1811da7a447d07205f873 100644 (file)
@@ -252,14 +252,14 @@ static struct ata_port_operations sil680_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
@@ -270,7 +270,7 @@ static struct ata_port_operations sil680_port_ops = {
  *     is powered up on boot and when we resume in case we resumed from RAM.
  *     Returns the final clock settings.
  */
+
 static u8 sil680_init_chip(struct pci_dev *pdev)
 {
        u32 class_rev   = 0;
index 916cedb3d75548457064ae26efb09ead0f62095f..560103d55b2e9a09e784ea6882fc0d0fc5e7149a 100644 (file)
@@ -32,7 +32,9 @@
 #include <scsi/scsi_host.h>
 #include <linux/libata.h>
 #include <linux/ata.h>
+#include "libata.h"
 
+#undef DRV_NAME                /* already defined in libata.h, for libata-core */
 #define DRV_NAME       "pata_sis"
 #define DRV_VERSION    "0.4.5"
 
@@ -43,6 +45,34 @@ struct sis_chipset {
           up code later */
 };
 
+struct sis_laptop {
+       u16 device;
+       u16 subvendor;
+       u16 subdevice;
+};
+
+static const struct sis_laptop sis_laptop[] = {
+       /* devid, subvendor, subdev */
+       { 0x5513, 0x1043, 0x1107 },     /* ASUS A6K */
+       /* end marker */
+       { 0, }
+};
+
+static int sis_short_ata40(struct pci_dev *dev)
+{
+       const struct sis_laptop *lap = &sis_laptop[0];
+
+       while (lap->device) {
+               if (lap->device == dev->device &&
+                   lap->subvendor == dev->subsystem_vendor &&
+                   lap->subdevice == dev->subsystem_device)
+                       return 1;
+               lap++;
+       }
+
+       return 0;
+}
+
 /**
  *     sis_port_base           -       return PCI configuration base for dev
  *     @adev: device
@@ -79,7 +109,7 @@ static int sis_133_pre_reset(struct ata_port *ap)
 
        /* The top bit of this register is the cable detect bit */
        pci_read_config_word(pdev, 0x50 + 2 * ap->port_no, &tmp);
-       if (tmp & 0x8000)
+       if ((tmp & 0x8000) && !sis_short_ata40(pdev))
                ap->cbl = ATA_CBL_PATA40;
        else
                ap->cbl = ATA_CBL_PATA80;
@@ -127,7 +157,7 @@ static int sis_66_pre_reset(struct ata_port *ap)
        /* Older chips keep cable detect in bits 4/5 of reg 0x48 */
        pci_read_config_byte(pdev, 0x48, &tmp);
        tmp >>= ap->port_no;
-       if (tmp & 0x10)
+       if ((tmp & 0x10) && !sis_short_ata40(pdev))
                ap->cbl = ATA_CBL_PATA40;
        else
                ap->cbl = ATA_CBL_PATA80;
@@ -573,14 +603,14 @@ static const struct ata_port_operations sis_133_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static const struct ata_port_operations sis_133_early_ops = {
@@ -606,14 +636,14 @@ static const struct ata_port_operations sis_133_early_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static const struct ata_port_operations sis_100_ops = {
@@ -640,14 +670,14 @@ static const struct ata_port_operations sis_100_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static const struct ata_port_operations sis_66_ops = {
@@ -673,14 +703,14 @@ static const struct ata_port_operations sis_66_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static const struct ata_port_operations sis_old_ops = {
@@ -706,14 +736,14 @@ static const struct ata_port_operations sis_old_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static struct ata_port_info sis_info = {
@@ -753,7 +783,7 @@ static struct ata_port_info sis_info100_early = {
        .pio_mask       = 0x1f, /* pio0-4 */
        .port_ops       = &sis_66_ops,
 };
-static struct ata_port_info sis_info133 = {
+struct ata_port_info sis_info133 = {
        .sht            = &sis_sht,
        .flags          = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST,
        .pio_mask       = 0x1f, /* pio0-4 */
@@ -768,6 +798,8 @@ static struct ata_port_info sis_info133_early = {
        .port_ops       = &sis_133_early_ops,
 };
 
+/* Privately shared with the SiS180 SATA driver, not for use elsewhere */
+EXPORT_SYMBOL_GPL(sis_info133);
 
 static void sis_fixup(struct pci_dev *pdev, struct sis_chipset *sis)
 {
@@ -847,7 +879,7 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        struct sis_chipset *chipset = NULL;
 
        static struct sis_chipset sis_chipsets[] = {
-       
+
                { 0x0968, &sis_info133 },
                { 0x0966, &sis_info133 },
                { 0x0965, &sis_info133 },
index e94f515ef54b6468199a78d92d5fc77e52e935de..96e890fd645b671247069881385de1c36d0abdb0 100644 (file)
@@ -139,13 +139,13 @@ static void sl82c105_set_dmamode(struct ata_port *ap, struct ata_device *adev)
 {
        switch(adev->dma_mode) {
                case XFER_MW_DMA_0:
-                       sl82c105_configure_piomode(ap, adev, 1);
+                       sl82c105_configure_piomode(ap, adev, 0);
                        break;
                case XFER_MW_DMA_1:
                        sl82c105_configure_piomode(ap, adev, 3);
                        break;
                case XFER_MW_DMA_2:
-                       sl82c105_configure_piomode(ap, adev, 3);
+                       sl82c105_configure_piomode(ap, adev, 4);
                        break;
                default:
                        BUG();
@@ -187,7 +187,9 @@ static void sl82c105_bmdma_start(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
 
+       udelay(100);
        sl82c105_reset_engine(ap);
+       udelay(100);
 
        /* Set the clocks for DMA */
        sl82c105_configure_dmamode(ap, qc->dev);
@@ -216,6 +218,7 @@ static void sl82c105_bmdma_stop(struct ata_queued_cmd *qc)
 
        ata_bmdma_stop(qc);
        sl82c105_reset_engine(ap);
+       udelay(100);
 
        /* This will redo the initial setup of the DMA device to matching
           PIO timings */
@@ -262,14 +265,14 @@ static struct ata_port_operations sl82c105_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
index a142971f13074071612e3326a2119813eb4e2a5e..453ab90b721e5576057ef77ee8a64cce6b1b09cc 100644 (file)
@@ -221,14 +221,14 @@ static struct ata_port_operations triflex_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int triflex_init_one(struct pci_dev *dev, const struct pci_device_id *id)
index f0b6c3b7142931a30cb3524a033fb021393a2c47..220fcd6c549296b82154b6f3d7b5a5da1953b337 100644 (file)
@@ -334,14 +334,14 @@ static struct ata_port_operations via_port_ops = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer,
+       .data_xfer      = ata_data_xfer,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations via_port_ops_noirq = {
@@ -369,14 +369,14 @@ static struct ata_port_operations via_port_ops_noirq = {
        .qc_prep        = ata_qc_prep,
        .qc_issue       = ata_qc_issue_prot,
 
-       .data_xfer      = ata_pio_data_xfer_noirq,
+       .data_xfer      = ata_data_xfer_noirq,
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
@@ -391,11 +391,11 @@ static struct ata_port_operations via_port_ops_noirq = {
 static void via_config_fifo(struct pci_dev *pdev, unsigned int flags)
 {
        u8 enable;
-       
+
        /* 0x40 low bits indicate enabled channels */
        pci_read_config_byte(pdev, 0x40 , &enable);
        enable &= 3;
-       
+
        if (flags & VIA_SET_FIFO) {
                static const u8 fifo_setting[4] = {0x00, 0x60, 0x00, 0x20};
                u8 fifo;
@@ -516,7 +516,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
 
        /* Initialise the FIFO for the enabled channels. */
        via_config_fifo(pdev, config->flags);
-       
+
        /* Clock set up */
        switch(config->flags & VIA_UDMA) {
                case VIA_UDMA_NONE:
@@ -575,7 +575,7 @@ static int via_reinit_one(struct pci_dev *pdev)
        u32 timing;
        struct ata_host *host = dev_get_drvdata(&pdev->dev);
        const struct via_isa_bridge *config = host->private_data;
-       
+
        via_config_fifo(pdev, config->flags);
 
        if ((config->flags & VIA_UDMA) == VIA_UDMA_66) {
@@ -590,7 +590,7 @@ static int via_reinit_one(struct pci_dev *pdev)
                timing &= ~0x80008;
                pci_write_config_dword(pdev, 0x50, timing);
        }
-       return ata_pci_device_resume(pdev);     
+       return ata_pci_device_resume(pdev);
 }
 
 static const struct pci_device_id via[] = {
index 5d1f518e1cc7ab1d119e08f372004a28afbc840c..0888b4f19f4c900467a158fa0d1bd6c03ad9210a 100644 (file)
@@ -5,7 +5,7 @@
  *    Support for the Winbond 83759A when operating in advanced mode.
  *    Multichip mode is not currently supported.
  */
+
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/pci.h>
@@ -69,7 +69,7 @@ static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev)
        int timing = 0x88 + (ap->port_no * 4) + (adev->devno * 2);
 
        reg = winbond_readcfg(winbond->config, 0x81);
-       
+
        /* Get the timing data in cycles */
        if (reg & 0x40)         /* Fast VLB bus, assume 50MHz */
                ata_timing_compute(adev, adev->pio_mode, &t, 20000, 1000);
@@ -80,9 +80,9 @@ static void winbond_set_piomode(struct ata_port *ap, struct ata_device *adev)
        recovery = (FIT(t.recover, 1, 15) + 1) & 0x0F;
        timing = (active << 4) | recovery;
        winbond_writecfg(winbond->config, timing, reg);
-       
+
        /* Load the setup timing */
-       
+
        reg = 0x35;
        if (adev->class != ATA_DEV_ATA)
                reg |= 0x08;    /* FIFO off */
@@ -100,22 +100,24 @@ static void winbond_data_xfer(struct ata_device *adev, unsigned char *buf, unsig
 
        if (ata_id_has_dword_io(adev->id)) {
                if (write_data)
-                       outsl(ap->ioaddr.data_addr, buf, buflen >> 2);
+                       iowrite32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
                else
-                       insl(ap->ioaddr.data_addr, buf, buflen >> 2);
+                       ioread32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
 
                if (unlikely(slop)) {
                        u32 pad;
                        if (write_data) {
                                memcpy(&pad, buf + buflen - slop, slop);
-                               outl(le32_to_cpu(pad), ap->ioaddr.data_addr);
+                               pad = le32_to_cpu(pad);
+                               iowrite32(pad, ap->ioaddr.data_addr);
                        } else {
-                               pad = cpu_to_le16(inl(ap->ioaddr.data_addr));
+                               pad = ioread32(ap->ioaddr.data_addr);
+                               pad = cpu_to_le16(pad);
                                memcpy(buf + buflen - slop, &pad, slop);
                        }
                }
        } else
-               ata_pio_data_xfer(adev, buf, buflen, write_data);
+               ata_data_xfer(adev, buf, buflen, write_data);
 }
 
 static struct scsi_host_template winbond_sht = {
@@ -158,10 +160,10 @@ static struct ata_port_operations winbond_port_ops = {
 
        .irq_handler    = ata_interrupt,
        .irq_clear      = ata_bmdma_irq_clear,
+       .irq_on         = ata_irq_on,
+       .irq_ack        = ata_irq_ack,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
@@ -194,13 +196,15 @@ static __init int winbond_init_one(unsigned long port)
        winbond_writecfg(port, 0x85, reg);
 
        reg = winbond_readcfg(port, 0x81);
-       
+
        if (!(reg & 0x03))              /* Disabled */
                return 0;
 
        for (i = 0; i < 2 ; i ++) {
+               unsigned long cmd_port = 0x1F0 - (0x80 * i);
+               void __iomem *cmd_addr, *ctl_addr;
 
-               if (reg & (1 << i)) {           
+               if (reg & (1 << i)) {
                        /*
                         *      Fill in a probe structure first of all
                         */
@@ -209,6 +213,13 @@ static __init int winbond_init_one(unsigned long port)
                        if (IS_ERR(pdev))
                                return PTR_ERR(pdev);
 
+                       cmd_addr = devm_ioport_map(&pdev->dev, cmd_port, 8);
+                       ctl_addr = devm_ioport_map(&pdev->dev, cmd_port + 0x0206, 1);
+                       if (!cmd_addr || !ctl_addr) {
+                               platform_device_unregister(pdev);
+                               return -ENOMEM;
+                       }
+
                        memset(&ae, 0, sizeof(struct ata_probe_ent));
                        INIT_LIST_HEAD(&ae.node);
                        ae.dev = &pdev->dev;
@@ -217,14 +228,14 @@ static __init int winbond_init_one(unsigned long port)
                        ae.pio_mask = 0x1F;
 
                        ae.sht = &winbond_sht;
-       
+
                        ae.n_ports = 1;
                        ae.irq = 14 + i;
                        ae.irq_flags = 0;
                        ae.port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST;
-                       ae.port[0].cmd_addr = 0x1F0 - (0x80 * i);
-                       ae.port[0].altstatus_addr = ae.port[0].cmd_addr + 0x0206;
-                       ae.port[0].ctl_addr = ae.port[0].altstatus_addr;
+                       ae.port[0].cmd_addr = cmd_addr;
+                       ae.port[0].altstatus_addr = ctl_addr;
+                       ae.port[0].ctl_addr = ctl_addr;
                        ata_std_ports(&ae.port[0]);
                        /*
                         *      Hook in a private data structure per channel
@@ -257,7 +268,7 @@ static __init int winbond_init(void)
 
        int ct = 0;
        int i;
-       
+
        if (probe_winbond == 0)
                return -ENODEV;
 
@@ -288,7 +299,7 @@ static __exit void winbond_exit(void)
        int i;
 
        for (i = 0; i < nr_winbond_host; i++) {
-               ata_host_remove(winbond_host[i]);
+               ata_host_detach(winbond_host[i]);
                release_region(winbond_data[i].config, 2);
                platform_device_unregister(winbond_data[i].platform_dev);
        }
index 90786d7a20bbbfde234167b64ef86a4f0a8fa16b..857ac23217ab0895f095700b5db9c529a9f67fb5 100644 (file)
 #include <linux/blkdev.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
-#include <linux/sched.h>
 #include <linux/device.h>
 #include <scsi/scsi_host.h>
-#include <asm/io.h>
 #include <linux/libata.h>
 
 #define DRV_NAME       "pdc_adma"
 #define ADMA_ATA_REGS(base,port_no)    ((base) + ((port_no) * 0x40))
 
 /* macro to calculate base address for ADMA regs */
-#define ADMA_REGS(base,port_no)        ((base) + 0x80 + ((port_no) * 0x20))
+#define ADMA_REGS(base,port_no)                ((base) + 0x80 + ((port_no) * 0x20))
+
+/* macro to obtain addresses from ata_host */
+#define ADMA_HOST_REGS(host,port_no) \
+       ADMA_REGS((host)->iomap[ADMA_MMIO_BAR], port_no)
 
 enum {
+       ADMA_MMIO_BAR           = 4,
+
        ADMA_PORTS              = 2,
        ADMA_CPB_BYTES          = 40,
        ADMA_PRD_BYTES          = LIBATA_MAX_PRD * 16,
@@ -167,9 +171,11 @@ static const struct ata_port_operations adma_ata_ops = {
        .qc_prep                = adma_qc_prep,
        .qc_issue               = adma_qc_issue,
        .eng_timeout            = adma_eng_timeout,
-       .data_xfer              = ata_mmio_data_xfer,
+       .data_xfer              = ata_data_xfer,
        .irq_handler            = adma_intr,
        .irq_clear              = adma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
        .port_start             = adma_port_start,
        .port_stop              = adma_port_stop,
        .host_stop              = adma_host_stop,
@@ -235,11 +241,10 @@ static void adma_reset_engine(void __iomem *chan)
 static void adma_reinit_engine(struct ata_port *ap)
 {
        struct adma_port_priv *pp = ap->private_data;
-       void __iomem *mmio_base = ap->host->mmio_base;
-       void __iomem *chan = ADMA_REGS(mmio_base, ap->port_no);
+       void __iomem *chan = ADMA_HOST_REGS(ap->host, ap->port_no);
 
        /* mask/clear ATA interrupts */
-       writeb(ATA_NIEN, (void __iomem *)ap->ioaddr.ctl_addr);
+       writeb(ATA_NIEN, ap->ioaddr.ctl_addr);
        ata_check_status(ap);
 
        /* reset the ADMA engine */
@@ -263,7 +268,7 @@ static void adma_reinit_engine(struct ata_port *ap)
 
 static inline void adma_enter_reg_mode(struct ata_port *ap)
 {
-       void __iomem *chan = ADMA_REGS(ap->host->mmio_base, ap->port_no);
+       void __iomem *chan = ADMA_HOST_REGS(ap->host, ap->port_no);
 
        writew(aPIOMD4, chan + ADMA_CONTROL);
        readb(chan + ADMA_STATUS);      /* flush */
@@ -410,7 +415,7 @@ static void adma_qc_prep(struct ata_queued_cmd *qc)
 static inline void adma_packet_start(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
-       void __iomem *chan = ADMA_REGS(ap->host->mmio_base, ap->port_no);
+       void __iomem *chan = ADMA_HOST_REGS(ap->host, ap->port_no);
 
        VPRINTK("ENTER, ap %p\n", ap);
 
@@ -443,13 +448,12 @@ static unsigned int adma_qc_issue(struct ata_queued_cmd *qc)
 static inline unsigned int adma_intr_pkt(struct ata_host *host)
 {
        unsigned int handled = 0, port_no;
-       u8 __iomem *mmio_base = host->mmio_base;
 
        for (port_no = 0; port_no < host->n_ports; ++port_no) {
                struct ata_port *ap = host->ports[port_no];
                struct adma_port_priv *pp;
                struct ata_queued_cmd *qc;
-               void __iomem *chan = ADMA_REGS(mmio_base, port_no);
+               void __iomem *chan = ADMA_HOST_REGS(host, port_no);
                u8 status = readb(chan + ADMA_STATUS);
 
                if (status == 0)
@@ -523,7 +527,7 @@ static irqreturn_t adma_intr(int irq, void *dev_instance)
        return IRQ_RETVAL(handled);
 }
 
-static void adma_ata_setup_port(struct ata_ioports *port, unsigned long base)
+static void adma_ata_setup_port(struct ata_ioports *port, void __iomem *base)
 {
        port->cmd_addr          =
        port->data_addr         = base + 0x000;
@@ -550,48 +554,28 @@ static int adma_port_start(struct ata_port *ap)
        if (rc)
                return rc;
        adma_enter_reg_mode(ap);
-       rc = -ENOMEM;
-       pp = kzalloc(sizeof(*pp), GFP_KERNEL);
+       pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
        if (!pp)
-               goto err_out;
-       pp->pkt = dma_alloc_coherent(dev, ADMA_PKT_BYTES, &pp->pkt_dma,
-                                                               GFP_KERNEL);
+               return -ENOMEM;
+       pp->pkt = dmam_alloc_coherent(dev, ADMA_PKT_BYTES, &pp->pkt_dma,
+                                     GFP_KERNEL);
        if (!pp->pkt)
-               goto err_out_kfree;
+               return -ENOMEM;
        /* paranoia? */
        if ((pp->pkt_dma & 7) != 0) {
                printk("bad alignment for pp->pkt_dma: %08x\n",
                                                (u32)pp->pkt_dma);
-               dma_free_coherent(dev, ADMA_PKT_BYTES,
-                                               pp->pkt, pp->pkt_dma);
-               goto err_out_kfree;
+               return -ENOMEM;
        }
        memset(pp->pkt, 0, ADMA_PKT_BYTES);
        ap->private_data = pp;
        adma_reinit_engine(ap);
        return 0;
-
-err_out_kfree:
-       kfree(pp);
-err_out:
-       ata_port_stop(ap);
-       return rc;
 }
 
 static void adma_port_stop(struct ata_port *ap)
 {
-       struct device *dev = ap->host->dev;
-       struct adma_port_priv *pp = ap->private_data;
-
-       adma_reset_engine(ADMA_REGS(ap->host->mmio_base, ap->port_no));
-       if (pp != NULL) {
-               ap->private_data = NULL;
-               if (pp->pkt != NULL)
-                       dma_free_coherent(dev, ADMA_PKT_BYTES,
-                                       pp->pkt, pp->pkt_dma);
-               kfree(pp);
-       }
-       ata_port_stop(ap);
+       adma_reset_engine(ADMA_HOST_REGS(ap->host, ap->port_no));
 }
 
 static void adma_host_stop(struct ata_host *host)
@@ -599,16 +583,14 @@ static void adma_host_stop(struct ata_host *host)
        unsigned int port_no;
 
        for (port_no = 0; port_no < ADMA_PORTS; ++port_no)
-               adma_reset_engine(ADMA_REGS(host->mmio_base, port_no));
-
-       ata_pci_host_stop(host);
+               adma_reset_engine(ADMA_HOST_REGS(host, port_no));
 }
 
 static void adma_host_init(unsigned int chip_id,
                                struct ata_probe_ent *probe_ent)
 {
        unsigned int port_no;
-       void __iomem *mmio_base = probe_ent->mmio_base;
+       void __iomem *mmio_base = probe_ent->iomap[ADMA_MMIO_BAR];
 
        /* enable/lock aGO operation */
        writeb(7, mmio_base + ADMA_MODE_LOCK);
@@ -638,7 +620,7 @@ static int adma_set_dma_masks(struct pci_dev *pdev, void __iomem *mmio_base)
 }
 
 static int adma_ata_init_one(struct pci_dev *pdev,
-                               const struct pci_device_id *ent)
+                            const struct pci_device_id *ent)
 {
        static int printed_version;
        struct ata_probe_ent *probe_ent = NULL;
@@ -649,34 +631,25 @@ static int adma_ata_init_one(struct pci_dev *pdev,
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
-       rc = pci_request_regions(pdev, DRV_NAME);
-       if (rc)
-               goto err_out;
-
-       if ((pci_resource_flags(pdev, 4) & IORESOURCE_MEM) == 0) {
-               rc = -ENODEV;
-               goto err_out_regions;
-       }
+       if ((pci_resource_flags(pdev, 4) & IORESOURCE_MEM) == 0)
+               return -ENODEV;
 
-       mmio_base = pci_iomap(pdev, 4, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       rc = pcim_iomap_regions(pdev, 1 << ADMA_MMIO_BAR, DRV_NAME);
+       if (rc)
+               return rc;
+       mmio_base = pcim_iomap_table(pdev)[ADMA_MMIO_BAR];
 
        rc = adma_set_dma_masks(pdev, mmio_base);
        if (rc)
-               goto err_out_iounmap;
+               return rc;
 
-       probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_iounmap;
-       }
+       probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
@@ -690,12 +663,12 @@ static int adma_ata_init_one(struct pci_dev *pdev,
 
        probe_ent->irq          = pdev->irq;
        probe_ent->irq_flags    = IRQF_SHARED;
-       probe_ent->mmio_base    = mmio_base;
        probe_ent->n_ports      = ADMA_PORTS;
+       probe_ent->iomap        = pcim_iomap_table(pdev);
 
        for (port_no = 0; port_no < probe_ent->n_ports; ++port_no) {
                adma_ata_setup_port(&probe_ent->port[port_no],
-                       ADMA_ATA_REGS((unsigned long)mmio_base, port_no));
+                                   ADMA_ATA_REGS(mmio_base, port_no));
        }
 
        pci_set_master(pdev);
@@ -703,19 +676,11 @@ static int adma_ata_init_one(struct pci_dev *pdev,
        /* initialize adapter */
        adma_host_init(board_idx, probe_ent);
 
-       rc = ata_device_add(probe_ent);
-       kfree(probe_ent);
-       if (rc != ADMA_PORTS)
-               goto err_out_iounmap;
-       return 0;
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
-err_out_iounmap:
-       pci_iounmap(pdev, mmio_base);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       pci_disable_device(pdev);
-       return rc;
+       devm_kfree(&pdev->dev, probe_ent);
+       return 0;
 }
 
 static int __init adma_ata_init(void)
diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c
new file mode 100644 (file)
index 0000000..31b636f
--- /dev/null
@@ -0,0 +1,781 @@
+/*
+ * sata_inic162x.c - Driver for Initio 162x SATA controllers
+ *
+ * Copyright 2006  SUSE Linux Products GmbH
+ * Copyright 2006  Tejun Heo <teheo@novell.com>
+ *
+ * This file is released under GPL v2.
+ *
+ * This controller is eccentric and easily locks up if something isn't
+ * right.  Documentation is available at initio's website but it only
+ * documents registers (not programming model).
+ *
+ * - ATA disks work.
+ * - Hotplug works.
+ * - ATAPI read works but burning doesn't.  This thing is really
+ *   peculiar about ATAPI and I couldn't figure out how ATAPI PIO and
+ *   ATAPI DMA WRITE should be programmed.  If you've got a clue, be
+ *   my guest.
+ * - Both STR and STD work.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <scsi/scsi_host.h>
+#include <linux/libata.h>
+#include <linux/blkdev.h>
+#include <scsi/scsi_device.h>
+
+#define DRV_NAME       "sata_inic162x"
+#define DRV_VERSION    "0.1"
+
+enum {
+       MMIO_BAR                = 5,
+
+       NR_PORTS                = 2,
+
+       HOST_CTL                = 0x7c,
+       HOST_STAT               = 0x7e,
+       HOST_IRQ_STAT           = 0xbc,
+       HOST_IRQ_MASK           = 0xbe,
+
+       PORT_SIZE               = 0x40,
+
+       /* registers for ATA TF operation */
+       PORT_TF                 = 0x00,
+       PORT_ALT_STAT           = 0x08,
+       PORT_IRQ_STAT           = 0x09,
+       PORT_IRQ_MASK           = 0x0a,
+       PORT_PRD_CTL            = 0x0b,
+       PORT_PRD_ADDR           = 0x0c,
+       PORT_PRD_XFERLEN        = 0x10,
+
+       /* IDMA register */
+       PORT_IDMA_CTL           = 0x14,
+
+       PORT_SCR                = 0x20,
+
+       /* HOST_CTL bits */
+       HCTL_IRQOFF             = (1 << 8),  /* global IRQ off */
+       HCTL_PWRDWN             = (1 << 13), /* power down PHYs */
+       HCTL_SOFTRST            = (1 << 13), /* global reset (no phy reset) */
+       HCTL_RPGSEL             = (1 << 15), /* register page select */
+
+       HCTL_KNOWN_BITS         = HCTL_IRQOFF | HCTL_PWRDWN | HCTL_SOFTRST |
+                                 HCTL_RPGSEL,
+
+       /* HOST_IRQ_(STAT|MASK) bits */
+       HIRQ_PORT0              = (1 << 0),
+       HIRQ_PORT1              = (1 << 1),
+       HIRQ_SOFT               = (1 << 14),
+       HIRQ_GLOBAL             = (1 << 15), /* STAT only */
+
+       /* PORT_IRQ_(STAT|MASK) bits */
+       PIRQ_OFFLINE            = (1 << 0),  /* device unplugged */
+       PIRQ_ONLINE             = (1 << 1),  /* device plugged */
+       PIRQ_COMPLETE           = (1 << 2),  /* completion interrupt */
+       PIRQ_FATAL              = (1 << 3),  /* fatal error */
+       PIRQ_ATA                = (1 << 4),  /* ATA interrupt */
+       PIRQ_REPLY              = (1 << 5),  /* reply FIFO not empty */
+       PIRQ_PENDING            = (1 << 7),  /* port IRQ pending (STAT only) */
+
+       PIRQ_ERR                = PIRQ_OFFLINE | PIRQ_ONLINE | PIRQ_FATAL,
+
+       PIRQ_MASK_DMA_READ      = PIRQ_REPLY | PIRQ_ATA,
+       PIRQ_MASK_OTHER         = PIRQ_REPLY | PIRQ_COMPLETE,
+       PIRQ_MASK_FREEZE        = 0xff,
+
+       /* PORT_PRD_CTL bits */
+       PRD_CTL_START           = (1 << 0),
+       PRD_CTL_WR              = (1 << 3),
+       PRD_CTL_DMAEN           = (1 << 7),  /* DMA enable */
+
+       /* PORT_IDMA_CTL bits */
+       IDMA_CTL_RST_ATA        = (1 << 2),  /* hardreset ATA bus */
+       IDMA_CTL_RST_IDMA       = (1 << 5),  /* reset IDMA machinary */
+       IDMA_CTL_GO             = (1 << 7),  /* IDMA mode go */
+       IDMA_CTL_ATA_NIEN       = (1 << 8),  /* ATA IRQ disable */
+};
+
+struct inic_host_priv {
+       u16     cached_hctl;
+};
+
+struct inic_port_priv {
+       u8      dfl_prdctl;
+       u8      cached_prdctl;
+       u8      cached_pirq_mask;
+};
+
+static int inic_slave_config(struct scsi_device *sdev)
+{
+       /* This controller is braindamaged.  dma_boundary is 0xffff
+        * like others but it will lock up the whole machine HARD if
+        * 65536 byte PRD entry is fed.  Reduce maximum segment size.
+        */
+       blk_queue_max_segment_size(sdev->request_queue, 65536 - 512);
+
+       return ata_scsi_slave_config(sdev);
+}
+
+static struct scsi_host_template inic_sht = {
+       .module                 = THIS_MODULE,
+       .name                   = DRV_NAME,
+       .ioctl                  = ata_scsi_ioctl,
+       .queuecommand           = ata_scsi_queuecmd,
+       .can_queue              = ATA_DEF_QUEUE,
+       .this_id                = ATA_SHT_THIS_ID,
+       .sg_tablesize           = LIBATA_MAX_PRD,
+       .cmd_per_lun            = ATA_SHT_CMD_PER_LUN,
+       .emulated               = ATA_SHT_EMULATED,
+       .use_clustering         = ATA_SHT_USE_CLUSTERING,
+       .proc_name              = DRV_NAME,
+       .dma_boundary           = ATA_DMA_BOUNDARY,
+       .slave_configure        = inic_slave_config,
+       .slave_destroy          = ata_scsi_slave_destroy,
+       .bios_param             = ata_std_bios_param,
+       .suspend                = ata_scsi_device_suspend,
+       .resume                 = ata_scsi_device_resume,
+};
+
+static const int scr_map[] = {
+       [SCR_STATUS]    = 0,
+       [SCR_ERROR]     = 1,
+       [SCR_CONTROL]   = 2,
+};
+
+static void __iomem * inic_port_base(struct ata_port *ap)
+{
+       return ap->host->iomap[MMIO_BAR] + ap->port_no * PORT_SIZE;
+}
+
+static void __inic_set_pirq_mask(struct ata_port *ap, u8 mask)
+{
+       void __iomem *port_base = inic_port_base(ap);
+       struct inic_port_priv *pp = ap->private_data;
+
+       writeb(mask, port_base + PORT_IRQ_MASK);
+       pp->cached_pirq_mask = mask;
+}
+
+static void inic_set_pirq_mask(struct ata_port *ap, u8 mask)
+{
+       struct inic_port_priv *pp = ap->private_data;
+
+       if (pp->cached_pirq_mask != mask)
+               __inic_set_pirq_mask(ap, mask);
+}
+
+static void inic_reset_port(void __iomem *port_base)
+{
+       void __iomem *idma_ctl = port_base + PORT_IDMA_CTL;
+       u16 ctl;
+
+       ctl = readw(idma_ctl);
+       ctl &= ~(IDMA_CTL_RST_IDMA | IDMA_CTL_ATA_NIEN | IDMA_CTL_GO);
+
+       /* mask IRQ and assert reset */
+       writew(ctl | IDMA_CTL_RST_IDMA | IDMA_CTL_ATA_NIEN, idma_ctl);
+       readw(idma_ctl); /* flush */
+
+       /* give it some time */
+       msleep(1);
+
+       /* release reset */
+       writew(ctl | IDMA_CTL_ATA_NIEN, idma_ctl);
+
+       /* clear irq */
+       writeb(0xff, port_base + PORT_IRQ_STAT);
+
+       /* reenable ATA IRQ, turn off IDMA mode */
+       writew(ctl, idma_ctl);
+}
+
+static u32 inic_scr_read(struct ata_port *ap, unsigned sc_reg)
+{
+       void __iomem *scr_addr = (void __iomem *)ap->ioaddr.scr_addr;
+       void __iomem *addr;
+       u32 val;
+
+       if (unlikely(sc_reg >= ARRAY_SIZE(scr_map)))
+               return 0xffffffffU;
+
+       addr = scr_addr + scr_map[sc_reg] * 4;
+       val = readl(scr_addr + scr_map[sc_reg] * 4);
+
+       /* this controller has stuck DIAG.N, ignore it */
+       if (sc_reg == SCR_ERROR)
+               val &= ~SERR_PHYRDY_CHG;
+       return val;
+}
+
+static void inic_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val)
+{
+       void __iomem *scr_addr = (void __iomem *)ap->ioaddr.scr_addr;
+       void __iomem *addr;
+
+       if (unlikely(sc_reg >= ARRAY_SIZE(scr_map)))
+               return;
+
+       addr = scr_addr + scr_map[sc_reg] * 4;
+       writel(val, scr_addr + scr_map[sc_reg] * 4);
+}
+
+/*
+ * In TF mode, inic162x is very similar to SFF device.  TF registers
+ * function the same.  DMA engine behaves similary using the same PRD
+ * format as BMDMA but different command register, interrupt and event
+ * notification methods are used.  The following inic_bmdma_*()
+ * functions do the impedance matching.
+ */
+static void inic_bmdma_setup(struct ata_queued_cmd *qc)
+{
+       struct ata_port *ap = qc->ap;
+       struct inic_port_priv *pp = ap->private_data;
+       void __iomem *port_base = inic_port_base(ap);
+       int rw = qc->tf.flags & ATA_TFLAG_WRITE;
+
+       /* make sure device sees PRD table writes */
+       wmb();
+
+       /* load transfer length */
+       writel(qc->nbytes, port_base + PORT_PRD_XFERLEN);
+
+       /* turn on DMA and specify data direction */
+       pp->cached_prdctl = pp->dfl_prdctl | PRD_CTL_DMAEN;
+       if (!rw)
+               pp->cached_prdctl |= PRD_CTL_WR;
+       writeb(pp->cached_prdctl, port_base + PORT_PRD_CTL);
+
+       /* issue r/w command */
+       ap->ops->exec_command(ap, &qc->tf);
+}
+
+static void inic_bmdma_start(struct ata_queued_cmd *qc)
+{
+       struct ata_port *ap = qc->ap;
+       struct inic_port_priv *pp = ap->private_data;
+       void __iomem *port_base = inic_port_base(ap);
+
+       /* start host DMA transaction */
+       pp->cached_prdctl |= PRD_CTL_START;
+       writeb(pp->cached_prdctl, port_base + PORT_PRD_CTL);
+}
+
+static void inic_bmdma_stop(struct ata_queued_cmd *qc)
+{
+       struct ata_port *ap = qc->ap;
+       struct inic_port_priv *pp = ap->private_data;
+       void __iomem *port_base = inic_port_base(ap);
+
+       /* stop DMA engine */
+       writeb(pp->dfl_prdctl, port_base + PORT_PRD_CTL);
+}
+
+static u8 inic_bmdma_status(struct ata_port *ap)
+{
+       /* event is already verified by the interrupt handler */
+       return ATA_DMA_INTR;
+}
+
+static void inic_irq_clear(struct ata_port *ap)
+{
+       /* noop */
+}
+
+static void inic_host_intr(struct ata_port *ap)
+{
+       void __iomem *port_base = inic_port_base(ap);
+       struct ata_eh_info *ehi = &ap->eh_info;
+       u8 irq_stat;
+
+       /* fetch and clear irq */
+       irq_stat = readb(port_base + PORT_IRQ_STAT);
+       writeb(irq_stat, port_base + PORT_IRQ_STAT);
+
+       if (likely(!(irq_stat & PIRQ_ERR))) {
+               struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag);
+
+               if (unlikely(!qc || (qc->tf.flags & ATA_TFLAG_POLLING))) {
+                       ata_chk_status(ap);     /* clear ATA interrupt */
+                       return;
+               }
+
+               if (likely(ata_host_intr(ap, qc)))
+                       return;
+
+               ata_chk_status(ap);     /* clear ATA interrupt */
+               ata_port_printk(ap, KERN_WARNING, "unhandled "
+                               "interrupt, irq_stat=%x\n", irq_stat);
+               return;
+       }
+
+       /* error */
+       ata_ehi_push_desc(ehi, "irq_stat=0x%x", irq_stat);
+
+       if (irq_stat & (PIRQ_OFFLINE | PIRQ_ONLINE)) {
+               ata_ehi_hotplugged(ehi);
+               ata_port_freeze(ap);
+       } else
+               ata_port_abort(ap);
+}
+
+static irqreturn_t inic_interrupt(int irq, void *dev_instance)
+{
+       struct ata_host *host = dev_instance;
+       void __iomem *mmio_base = host->iomap[MMIO_BAR];
+       u16 host_irq_stat;
+       int i, handled = 0;;
+
+       host_irq_stat = readw(mmio_base + HOST_IRQ_STAT);
+
+       if (unlikely(!(host_irq_stat & HIRQ_GLOBAL)))
+               goto out;
+
+       spin_lock(&host->lock);
+
+       for (i = 0; i < NR_PORTS; i++) {
+               struct ata_port *ap = host->ports[i];
+
+               if (!(host_irq_stat & (HIRQ_PORT0 << i)))
+                       continue;
+
+               if (likely(ap && !(ap->flags & ATA_FLAG_DISABLED))) {
+                       inic_host_intr(ap);
+                       handled++;
+               } else {
+                       if (ata_ratelimit())
+                               dev_printk(KERN_ERR, host->dev, "interrupt "
+                                          "from disabled port %d (0x%x)\n",
+                                          i, host_irq_stat);
+               }
+       }
+
+       spin_unlock(&host->lock);
+
+ out:
+       return IRQ_RETVAL(handled);
+}
+
+static unsigned int inic_qc_issue(struct ata_queued_cmd *qc)
+{
+       struct ata_port *ap = qc->ap;
+
+       /* ATA IRQ doesn't wait for DMA transfer completion and vice
+        * versa.  Mask IRQ selectively to detect command completion.
+        * Without it, ATA DMA read command can cause data corruption.
+        *
+        * Something similar might be needed for ATAPI writes.  I
+        * tried a lot of combinations but couldn't find the solution.
+        */
+       if (qc->tf.protocol == ATA_PROT_DMA &&
+           !(qc->tf.flags & ATA_TFLAG_WRITE))
+               inic_set_pirq_mask(ap, PIRQ_MASK_DMA_READ);
+       else
+               inic_set_pirq_mask(ap, PIRQ_MASK_OTHER);
+
+       /* Issuing a command to yet uninitialized port locks up the
+        * controller.  Most of the time, this happens for the first
+        * command after reset which are ATA and ATAPI IDENTIFYs.
+        * Fast fail if stat is 0x7f or 0xff for those commands.
+        */
+       if (unlikely(qc->tf.command == ATA_CMD_ID_ATA ||
+                    qc->tf.command == ATA_CMD_ID_ATAPI)) {
+               u8 stat = ata_chk_status(ap);
+               if (stat == 0x7f || stat == 0xff)
+                       return AC_ERR_HSM;
+       }
+
+       return ata_qc_issue_prot(qc);
+}
+
+static void inic_freeze(struct ata_port *ap)
+{
+       void __iomem *port_base = inic_port_base(ap);
+
+       __inic_set_pirq_mask(ap, PIRQ_MASK_FREEZE);
+
+       ata_chk_status(ap);
+       writeb(0xff, port_base + PORT_IRQ_STAT);
+
+       readb(port_base + PORT_IRQ_STAT); /* flush */
+}
+
+static void inic_thaw(struct ata_port *ap)
+{
+       void __iomem *port_base = inic_port_base(ap);
+
+       ata_chk_status(ap);
+       writeb(0xff, port_base + PORT_IRQ_STAT);
+
+       __inic_set_pirq_mask(ap, PIRQ_MASK_OTHER);
+
+       readb(port_base + PORT_IRQ_STAT); /* flush */
+}
+
+/*
+ * SRST and SControl hardreset don't give valid signature on this
+ * controller.  Only controller specific hardreset mechanism works.
+ */
+static int inic_hardreset(struct ata_port *ap, unsigned int *class)
+{
+       void __iomem *port_base = inic_port_base(ap);
+       void __iomem *idma_ctl = port_base + PORT_IDMA_CTL;
+       const unsigned long *timing = sata_ehc_deb_timing(&ap->eh_context);
+       u16 val;
+       int rc;
+
+       /* hammer it into sane state */
+       inic_reset_port(port_base);
+
+       val = readw(idma_ctl);
+       writew(val | IDMA_CTL_RST_ATA, idma_ctl);
+       readw(idma_ctl);        /* flush */
+       msleep(1);
+       writew(val & ~IDMA_CTL_RST_ATA, idma_ctl);
+
+       rc = sata_phy_resume(ap, timing);
+       if (rc) {
+               ata_port_printk(ap, KERN_WARNING, "failed to resume "
+                               "link after reset (errno=%d)\n", rc);
+               return rc;
+       }
+
+       *class = ATA_DEV_NONE;
+       if (ata_port_online(ap)) {
+               struct ata_taskfile tf;
+
+               /* wait a while before checking status */
+               msleep(150);
+
+               if (ata_busy_sleep(ap, ATA_TMOUT_BOOT_QUICK, ATA_TMOUT_BOOT)) {
+                       ata_port_printk(ap, KERN_WARNING,
+                                       "device busy after hardreset\n");
+                       return -EIO;
+               }
+
+               ata_tf_read(ap, &tf);
+               *class = ata_dev_classify(&tf);
+               if (*class == ATA_DEV_UNKNOWN)
+                       *class = ATA_DEV_NONE;
+       }
+
+       return 0;
+}
+
+static void inic_error_handler(struct ata_port *ap)
+{
+       void __iomem *port_base = inic_port_base(ap);
+       struct inic_port_priv *pp = ap->private_data;
+       unsigned long flags;
+
+       /* reset PIO HSM and stop DMA engine */
+       inic_reset_port(port_base);
+
+       spin_lock_irqsave(ap->lock, flags);
+       ap->hsm_task_state = HSM_ST_IDLE;
+       writeb(pp->dfl_prdctl, port_base + PORT_PRD_CTL);
+       spin_unlock_irqrestore(ap->lock, flags);
+
+       /* PIO and DMA engines have been stopped, perform recovery */
+       ata_do_eh(ap, ata_std_prereset, NULL, inic_hardreset,
+                 ata_std_postreset);
+}
+
+static void inic_post_internal_cmd(struct ata_queued_cmd *qc)
+{
+       /* make DMA engine forget about the failed command */
+       if (qc->err_mask)
+               inic_reset_port(inic_port_base(qc->ap));
+}
+
+static void inic_dev_config(struct ata_port *ap, struct ata_device *dev)
+{
+       /* inic can only handle upto LBA28 max sectors */
+       if (dev->max_sectors > ATA_MAX_SECTORS)
+               dev->max_sectors = ATA_MAX_SECTORS;
+}
+
+static void init_port(struct ata_port *ap)
+{
+       void __iomem *port_base = inic_port_base(ap);
+
+       /* Setup PRD address */
+       writel(ap->prd_dma, port_base + PORT_PRD_ADDR);
+}
+
+static int inic_port_resume(struct ata_port *ap)
+{
+       init_port(ap);
+       return 0;
+}
+
+static int inic_port_start(struct ata_port *ap)
+{
+       void __iomem *port_base = inic_port_base(ap);
+       struct inic_port_priv *pp;
+       u8 tmp;
+       int rc;
+
+       /* alloc and initialize private data */
+       pp = devm_kzalloc(ap->host->dev, sizeof(*pp), GFP_KERNEL);
+       if (!pp)
+               return -ENOMEM;
+       ap->private_data = pp;
+
+       /* default PRD_CTL value, DMAEN, WR and START off */
+       tmp = readb(port_base + PORT_PRD_CTL);
+       tmp &= ~(PRD_CTL_DMAEN | PRD_CTL_WR | PRD_CTL_START);
+       pp->dfl_prdctl = tmp;
+
+       /* Alloc resources */
+       rc = ata_port_start(ap);
+       if (rc) {
+               kfree(pp);
+               return rc;
+       }
+
+       init_port(ap);
+
+       return 0;
+}
+
+static struct ata_port_operations inic_port_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,
+
+       .scr_read               = inic_scr_read,
+       .scr_write              = inic_scr_write,
+
+       .bmdma_setup            = inic_bmdma_setup,
+       .bmdma_start            = inic_bmdma_start,
+       .bmdma_stop             = inic_bmdma_stop,
+       .bmdma_status           = inic_bmdma_status,
+
+       .irq_handler            = inic_interrupt,
+       .irq_clear              = inic_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
+
+       .qc_prep                = ata_qc_prep,
+       .qc_issue               = inic_qc_issue,
+       .data_xfer              = ata_data_xfer,
+
+       .freeze                 = inic_freeze,
+       .thaw                   = inic_thaw,
+       .error_handler          = inic_error_handler,
+       .post_internal_cmd      = inic_post_internal_cmd,
+       .dev_config             = inic_dev_config,
+
+       .port_resume            = inic_port_resume,
+
+       .port_start             = inic_port_start,
+};
+
+static struct ata_port_info inic_port_info = {
+       .sht                    = &inic_sht,
+       /* For some reason, ATA_PROT_ATAPI is broken on this
+        * controller, and no, PIO_POLLING does't fix it.  It somehow
+        * manages to report the wrong ireason and ignoring ireason
+        * results in machine lock up.  Tell libata to always prefer
+        * DMA.
+        */
+       .flags                  = ATA_FLAG_SATA | ATA_FLAG_PIO_DMA,
+       .pio_mask               = 0x1f, /* pio0-4 */
+       .mwdma_mask             = 0x07, /* mwdma0-2 */
+       .udma_mask              = 0x7f, /* udma0-6 */
+       .port_ops               = &inic_port_ops
+};
+
+static int init_controller(void __iomem *mmio_base, u16 hctl)
+{
+       int i;
+       u16 val;
+
+       hctl &= ~HCTL_KNOWN_BITS;
+
+       /* Soft reset whole controller.  Spec says reset duration is 3
+        * PCI clocks, be generous and give it 10ms.
+        */
+       writew(hctl | HCTL_SOFTRST, mmio_base + HOST_CTL);
+       readw(mmio_base + HOST_CTL); /* flush */
+
+       for (i = 0; i < 10; i++) {
+               msleep(1);
+               val = readw(mmio_base + HOST_CTL);
+               if (!(val & HCTL_SOFTRST))
+                       break;
+       }
+
+       if (val & HCTL_SOFTRST)
+               return -EIO;
+
+       /* mask all interrupts and reset ports */
+       for (i = 0; i < NR_PORTS; i++) {
+               void __iomem *port_base = mmio_base + i * PORT_SIZE;
+
+               writeb(0xff, port_base + PORT_IRQ_MASK);
+               inic_reset_port(port_base);
+       }
+
+       /* port IRQ is masked now, unmask global IRQ */
+       writew(hctl & ~HCTL_IRQOFF, mmio_base + HOST_CTL);
+       val = readw(mmio_base + HOST_IRQ_MASK);
+       val &= ~(HIRQ_PORT0 | HIRQ_PORT1);
+       writew(val, mmio_base + HOST_IRQ_MASK);
+
+       return 0;
+}
+
+static int inic_pci_device_resume(struct pci_dev *pdev)
+{
+       struct ata_host *host = dev_get_drvdata(&pdev->dev);
+       struct inic_host_priv *hpriv = host->private_data;
+       void __iomem *mmio_base = host->iomap[MMIO_BAR];
+       int rc;
+
+       ata_pci_device_do_resume(pdev);
+
+       if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
+               printk("XXX\n");
+               rc = init_controller(mmio_base, hpriv->cached_hctl);
+               if (rc)
+                       return rc;
+       }
+
+       ata_host_resume(host);
+
+       return 0;
+}
+
+static int inic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+{
+       static int printed_version;
+       struct ata_port_info *pinfo = &inic_port_info;
+       struct ata_probe_ent *probe_ent;
+       struct inic_host_priv *hpriv;
+       void __iomem * const *iomap;
+       int i, rc;
+
+       if (!printed_version++)
+               dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
+
+       rc = pcim_enable_device(pdev);
+       if (rc)
+               return rc;
+
+       rc = pci_request_regions(pdev, DRV_NAME);
+       if (rc)
+               return rc;
+
+       rc = pcim_iomap_regions(pdev, 0x3f, DRV_NAME);
+       if (rc)
+               return rc;
+       iomap = pcim_iomap_table(pdev);
+
+       /* Set dma_mask.  This devices doesn't support 64bit addressing. */
+       rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       if (rc) {
+               dev_printk(KERN_ERR, &pdev->dev,
+                          "32-bit DMA enable failed\n");
+               return rc;
+       }
+
+       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+       if (rc) {
+               dev_printk(KERN_ERR, &pdev->dev,
+                          "32-bit consistent DMA enable failed\n");
+               return rc;
+       }
+
+       probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
+       hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL);
+       if (!probe_ent || !hpriv)
+               return -ENOMEM;
+
+       probe_ent->dev = &pdev->dev;
+       INIT_LIST_HEAD(&probe_ent->node);
+
+       probe_ent->sht                  = pinfo->sht;
+       probe_ent->port_flags           = pinfo->flags;
+       probe_ent->pio_mask             = pinfo->pio_mask;
+       probe_ent->mwdma_mask           = pinfo->mwdma_mask;
+       probe_ent->udma_mask            = pinfo->udma_mask;
+       probe_ent->port_ops             = pinfo->port_ops;
+       probe_ent->n_ports              = NR_PORTS;
+
+       probe_ent->irq = pdev->irq;
+       probe_ent->irq_flags = IRQF_SHARED;
+
+       probe_ent->iomap = iomap;
+
+       for (i = 0; i < NR_PORTS; i++) {
+               struct ata_ioports *port = &probe_ent->port[i];
+               void __iomem *port_base = iomap[MMIO_BAR] + i * PORT_SIZE;
+
+               port->cmd_addr = iomap[2 * i];
+               port->altstatus_addr =
+               port->ctl_addr = (void __iomem *)
+                       ((unsigned long)iomap[2 * i + 1] | ATA_PCI_CTL_OFS);
+               port->scr_addr = port_base + PORT_SCR;
+
+               ata_std_ports(port);
+       }
+
+       probe_ent->private_data = hpriv;
+       hpriv->cached_hctl = readw(iomap[MMIO_BAR] + HOST_CTL);
+
+       rc = init_controller(iomap[MMIO_BAR], hpriv->cached_hctl);
+       if (rc) {
+               dev_printk(KERN_ERR, &pdev->dev,
+                          "failed to initialize controller\n");
+               return rc;
+       }
+
+       pci_set_master(pdev);
+
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
+
+       devm_kfree(&pdev->dev, probe_ent);
+
+       return 0;
+}
+
+static const struct pci_device_id inic_pci_tbl[] = {
+       { PCI_VDEVICE(INIT, 0x1622), },
+       { },
+};
+
+static struct pci_driver inic_pci_driver = {
+       .name           = DRV_NAME,
+       .id_table       = inic_pci_tbl,
+       .suspend        = ata_pci_device_suspend,
+       .resume         = inic_pci_device_resume,
+       .probe          = inic_init_one,
+       .remove         = ata_pci_remove_one,
+};
+
+static int __init inic_init(void)
+{
+       return pci_register_driver(&inic_pci_driver);
+}
+
+static void __exit inic_exit(void)
+{
+       pci_unregister_driver(&inic_pci_driver);
+}
+
+MODULE_AUTHOR("Tejun Heo");
+MODULE_DESCRIPTION("low-level driver for Initio 162x SATA");
+MODULE_LICENSE("GPL v2");
+MODULE_DEVICE_TABLE(pci, inic_pci_tbl);
+MODULE_VERSION(DRV_VERSION);
+
+module_init(inic_init);
+module_exit(inic_exit);
index aae0b5201c1edb109a750ab717416a567126a220..d689df52eae3790a8027aaa21bc140bd3112d3ae 100644 (file)
 #include <linux/blkdev.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
-#include <linux/sched.h>
 #include <linux/dma-mapping.h>
 #include <linux/device.h>
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_cmnd.h>
 #include <linux/libata.h>
-#include <asm/io.h>
 
 #define DRV_NAME       "sata_mv"
 #define DRV_VERSION    "0.7"
@@ -342,7 +340,6 @@ 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 *host);
 static int mv_port_start(struct ata_port *ap);
 static void mv_port_stop(struct ata_port *ap);
 static void mv_qc_prep(struct ata_queued_cmd *qc);
@@ -406,19 +403,20 @@ static const struct ata_port_operations mv5_ops = {
 
        .qc_prep                = mv_qc_prep,
        .qc_issue               = mv_qc_issue,
-       .data_xfer              = ata_mmio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .eng_timeout            = mv_eng_timeout,
 
        .irq_handler            = mv_interrupt,
        .irq_clear              = mv_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .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 = {
@@ -434,19 +432,20 @@ static const struct ata_port_operations mv6_ops = {
 
        .qc_prep                = mv_qc_prep,
        .qc_issue               = mv_qc_issue,
-       .data_xfer              = ata_mmio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .eng_timeout            = mv_eng_timeout,
 
        .irq_handler            = mv_interrupt,
        .irq_clear              = mv_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .scr_read               = mv_scr_read,
        .scr_write              = mv_scr_write,
 
        .port_start             = mv_port_start,
        .port_stop              = mv_port_stop,
-       .host_stop              = mv_host_stop,
 };
 
 static const struct ata_port_operations mv_iie_ops = {
@@ -462,19 +461,20 @@ static const struct ata_port_operations mv_iie_ops = {
 
        .qc_prep                = mv_qc_prep_iie,
        .qc_issue               = mv_qc_issue,
-       .data_xfer              = ata_mmio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .eng_timeout            = mv_eng_timeout,
 
        .irq_handler            = mv_interrupt,
        .irq_clear              = mv_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .scr_read               = mv_scr_read,
        .scr_write              = mv_scr_write,
 
        .port_start             = mv_port_start,
        .port_stop              = mv_port_stop,
-       .host_stop              = mv_host_stop,
 };
 
 static const struct ata_port_info mv_port_info[] = {
@@ -620,7 +620,7 @@ static inline void __iomem *mv_port_base(void __iomem *base, unsigned int port)
 
 static inline void __iomem *mv_ap_base(struct ata_port *ap)
 {
-       return mv_port_base(ap->host->mmio_base, ap->port_no);
+       return mv_port_base(ap->host->iomap[MV_PRIMARY_BAR], ap->port_no);
 }
 
 static inline int mv_get_hc_count(unsigned long port_flags)
@@ -809,35 +809,6 @@ static void mv_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val)
        }
 }
 
-/**
- *      mv_host_stop - Host specific cleanup/stop routine.
- *      @host: host data structure
- *
- *      Disable ints, cleanup host memory, call general purpose
- *      host_stop.
- *
- *      LOCKING:
- *      Inherited from caller.
- */
-static void mv_host_stop(struct ata_host *host)
-{
-       struct mv_host_priv *hpriv = host->private_data;
-       struct pci_dev *pdev = to_pci_dev(host->dev);
-
-       if (hpriv->hp_flags & MV_HP_FLAG_MSI) {
-               pci_disable_msi(pdev);
-       } else {
-               pci_intx(pdev, 0);
-       }
-       kfree(hpriv);
-       ata_host_stop(host);
-}
-
-static inline void mv_priv_free(struct mv_port_priv *pp, struct device *dev)
-{
-       dma_free_coherent(dev, MV_PORT_PRIV_DMA_SZ, pp->crpb, pp->crpb_dma);
-}
-
 static void mv_edma_cfg(struct mv_host_priv *hpriv, void __iomem *port_mmio)
 {
        u32 cfg = readl(port_mmio + EDMA_CFG_OFS);
@@ -883,22 +854,21 @@ static int mv_port_start(struct ata_port *ap)
        void __iomem *port_mmio = mv_ap_base(ap);
        void *mem;
        dma_addr_t mem_dma;
-       int rc = -ENOMEM;
+       int rc;
 
-       pp = kmalloc(sizeof(*pp), GFP_KERNEL);
+       pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
        if (!pp)
-               goto err_out;
-       memset(pp, 0, sizeof(*pp));
+               return -ENOMEM;
 
-       mem = dma_alloc_coherent(dev, MV_PORT_PRIV_DMA_SZ, &mem_dma,
-                                GFP_KERNEL);
+       mem = dmam_alloc_coherent(dev, MV_PORT_PRIV_DMA_SZ, &mem_dma,
+                                 GFP_KERNEL);
        if (!mem)
-               goto err_out_pp;
+               return -ENOMEM;
        memset(mem, 0, MV_PORT_PRIV_DMA_SZ);
 
        rc = ata_pad_alloc(ap, dev);
        if (rc)
-               goto err_out_priv;
+               return rc;
 
        /* First item in chunk of DMA memory:
         * 32-slot command request table (CRQB), 32 bytes each in size
@@ -951,13 +921,6 @@ static int mv_port_start(struct ata_port *ap)
         */
        ap->private_data = pp;
        return 0;
-
-err_out_priv:
-       mv_priv_free(pp, dev);
-err_out_pp:
-       kfree(pp);
-err_out:
-       return rc;
 }
 
 /**
@@ -971,18 +934,11 @@ err_out:
  */
 static void mv_port_stop(struct ata_port *ap)
 {
-       struct device *dev = ap->host->dev;
-       struct mv_port_priv *pp = ap->private_data;
        unsigned long flags;
 
        spin_lock_irqsave(&ap->host->lock, flags);
        mv_stop_dma(ap);
        spin_unlock_irqrestore(&ap->host->lock, flags);
-
-       ap->private_data = NULL;
-       ata_pad_free(ap, dev);
-       mv_priv_free(pp, dev);
-       kfree(pp);
 }
 
 /**
@@ -1348,7 +1304,7 @@ static void mv_err_intr(struct ata_port *ap, int reset_allowed)
  */
 static void mv_host_intr(struct ata_host *host, u32 relevant, unsigned int hc)
 {
-       void __iomem *mmio = host->mmio_base;
+       void __iomem *mmio = host->iomap[MV_PRIMARY_BAR];
        void __iomem *hc_mmio = mv_hc_base(mmio, hc);
        struct ata_queued_cmd *qc;
        u32 hc_irq_cause;
@@ -1391,8 +1347,7 @@ static void mv_host_intr(struct ata_host *host, u32 relevant, unsigned int hc)
                } else {
                        /* PIO: check for device (drive) interrupt */
                        if ((DEV_IRQ << hard_port) & hc_irq_cause) {
-                               ata_status = readb((void __iomem *)
-                                          ap->ioaddr.status_addr);
+                               ata_status = readb(ap->ioaddr.status_addr);
                                handled = 1;
                                /* ignore spurious intr if drive still BUSY */
                                if (ata_status & ATA_BUSY) {
@@ -1452,7 +1407,7 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance)
 {
        struct ata_host *host = dev_instance;
        unsigned int hc, handled = 0, n_hcs;
-       void __iomem *mmio = host->mmio_base;
+       void __iomem *mmio = host->iomap[MV_PRIMARY_BAR];
        struct mv_host_priv *hpriv;
        u32 irq_stat;
 
@@ -1528,22 +1483,24 @@ static unsigned int mv5_scr_offset(unsigned int sc_reg_in)
 
 static u32 mv5_scr_read(struct ata_port *ap, unsigned int sc_reg_in)
 {
-       void __iomem *mmio = mv5_phy_base(ap->host->mmio_base, ap->port_no);
+       void __iomem *mmio = ap->host->iomap[MV_PRIMARY_BAR];
+       void __iomem *addr = mv5_phy_base(mmio, ap->port_no);
        unsigned int ofs = mv5_scr_offset(sc_reg_in);
 
        if (ofs != 0xffffffffU)
-               return readl(mmio + ofs);
+               return readl(addr + 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->mmio_base, ap->port_no);
+       void __iomem *mmio = ap->host->iomap[MV_PRIMARY_BAR];
+       void __iomem *addr = mv5_phy_base(mmio, ap->port_no);
        unsigned int ofs = mv5_scr_offset(sc_reg_in);
 
        if (ofs != 0xffffffffU)
-               writelfl(val, mmio + ofs);
+               writelfl(val, addr + ofs);
 }
 
 static void mv5_reset_bus(struct pci_dev *pdev, void __iomem *mmio)
@@ -1905,7 +1862,7 @@ static void mv_channel_reset(struct mv_host_priv *hpriv, void __iomem *mmio,
 static void mv_stop_and_reset(struct ata_port *ap)
 {
        struct mv_host_priv *hpriv = ap->host->private_data;
-       void __iomem *mmio = ap->host->mmio_base;
+       void __iomem *mmio = ap->host->iomap[MV_PRIMARY_BAR];
 
        mv_stop_dma(ap);
 
@@ -2003,10 +1960,10 @@ comreset_retry:
                        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);
-       tf.nsect = readb((void __iomem *) ap->ioaddr.nsect_addr);
+       tf.lbah = readb(ap->ioaddr.lbah_addr);
+       tf.lbam = readb(ap->ioaddr.lbam_addr);
+       tf.lbal = readb(ap->ioaddr.lbal_addr);
+       tf.nsect = readb(ap->ioaddr.nsect_addr);
 
        dev->class = ata_dev_classify(&tf);
        if (!ata_dev_enabled(dev)) {
@@ -2038,17 +1995,17 @@ static void mv_phy_reset(struct ata_port *ap)
  */
 static void mv_eng_timeout(struct ata_port *ap)
 {
+       void __iomem *mmio = ap->host->iomap[MV_PRIMARY_BAR];
        struct ata_queued_cmd *qc;
        unsigned long flags;
 
        ata_port_printk(ap, KERN_ERR, "Entering mv_eng_timeout\n");
        DPRINTK("All regs @ start of eng_timeout\n");
-       mv_dump_all_regs(ap->host->mmio_base, ap->port_no,
-                        to_pci_dev(ap->host->dev));
+       mv_dump_all_regs(mmio, ap->port_no, to_pci_dev(ap->host->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->mmio_base, ap, qc, qc->scsicmd, &qc->scsicmd->cmnd);
+              mmio, ap, qc, qc->scsicmd, &qc->scsicmd->cmnd);
 
        spin_lock_irqsave(&ap->host->lock, flags);
        mv_err_intr(ap, 0);
@@ -2076,7 +2033,7 @@ static void mv_eng_timeout(struct ata_port *ap)
  */
 static void mv_port_init(struct ata_ioports *port,  void __iomem *port_mmio)
 {
-       unsigned long shd_base = (unsigned long) port_mmio + SHD_BLK_OFS;
+       void __iomem *shd_base = port_mmio + SHD_BLK_OFS;
        unsigned serr_ofs;
 
        /* PIO related setup
@@ -2224,7 +2181,7 @@ 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 *mmio = probe_ent->iomap[MV_PRIMARY_BAR];
        struct mv_host_priv *hpriv = probe_ent->private_data;
 
        /* global interrupt mask */
@@ -2342,49 +2299,36 @@ static void mv_print_info(struct ata_probe_ent *probe_ent)
 static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version = 0;
-       struct ata_probe_ent *probe_ent = NULL;
+       struct device *dev = &pdev->dev;
+       struct ata_probe_ent *probe_ent;
        struct mv_host_priv *hpriv;
        unsigned int board_idx = (unsigned int)ent->driver_data;
-       void __iomem *mmio_base;
-       int pci_dev_busy = 0, rc;
+       int rc;
 
        if (!printed_version++)
                dev_printk(KERN_INFO, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
-       if (rc) {
+       rc = pcim_enable_device(pdev);
+       if (rc)
                return rc;
-       }
        pci_set_master(pdev);
 
-       rc = pci_request_regions(pdev, DRV_NAME);
-       if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
-       }
+       rc = pcim_iomap_regions(pdev, 1 << MV_PRIMARY_BAR, DRV_NAME);
+       if (rc == -EBUSY)
+               pcim_pin_device(pdev);
+       if (rc)
+               return rc;
 
-       probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       probe_ent = devm_kzalloc(dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
-       memset(probe_ent, 0, sizeof(*probe_ent));
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
 
-       mmio_base = pci_iomap(pdev, MV_PRIMARY_BAR, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
-
-       hpriv = kmalloc(sizeof(*hpriv), GFP_KERNEL);
-       if (!hpriv) {
-               rc = -ENOMEM;
-               goto err_out_iounmap;
-       }
-       memset(hpriv, 0, sizeof(*hpriv));
+       hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
+       if (!hpriv)
+               return -ENOMEM;
 
        probe_ent->sht = mv_port_info[board_idx].sht;
        probe_ent->port_flags = mv_port_info[board_idx].flags;
@@ -2394,53 +2338,26 @@ static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        probe_ent->irq = pdev->irq;
        probe_ent->irq_flags = IRQF_SHARED;
-       probe_ent->mmio_base = mmio_base;
+       probe_ent->iomap = pcim_iomap_table(pdev);
        probe_ent->private_data = hpriv;
 
        /* initialize adapter */
        rc = mv_init_host(pdev, probe_ent, board_idx);
-       if (rc) {
-               goto err_out_hpriv;
-       }
+       if (rc)
+               return rc;
 
        /* Enable interrupts */
-       if (msi && pci_enable_msi(pdev) == 0) {
-               hpriv->hp_flags |= MV_HP_FLAG_MSI;
-       } else {
+       if (msi && !pci_enable_msi(pdev))
                pci_intx(pdev, 1);
-       }
 
        mv_dump_pci_cfg(pdev, 0x68);
        mv_print_info(probe_ent);
 
-       if (ata_device_add(probe_ent) == 0) {
-               rc = -ENODEV;           /* No devices discovered */
-               goto err_out_dev_add;
-       }
+       if (ata_device_add(probe_ent) == 0)
+               return -ENODEV;
 
-       kfree(probe_ent);
+       devm_kfree(dev, probe_ent);
        return 0;
-
-err_out_dev_add:
-       if (MV_HP_FLAG_MSI & hpriv->hp_flags) {
-               pci_disable_msi(pdev);
-       } else {
-               pci_intx(pdev, 0);
-       }
-err_out_hpriv:
-       kfree(hpriv);
-err_out_iounmap:
-       pci_iounmap(pdev, mmio_base);
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy) {
-               pci_disable_device(pdev);
-       }
-
-       return rc;
 }
 
 static int __init mv_init(void)
index f7a963eb1f028ea77a7ce4576d64c3c595faa574..ab92f208dae2f955b9aef79d214707e90c1b10f0 100644 (file)
 #include <linux/libata.h>
 
 #define DRV_NAME                       "sata_nv"
-#define DRV_VERSION                    "3.2"
+#define DRV_VERSION                    "3.3"
 
 #define NV_ADMA_DMA_BOUNDARY           0xffffffffUL
 
 enum {
+       NV_MMIO_BAR                     = 5,
+
        NV_PORTS                        = 2,
        NV_PIO_MASK                     = 0x1f,
        NV_MWDMA_MASK                   = 0x07,
@@ -213,12 +215,21 @@ struct nv_adma_port_priv {
        dma_addr_t              cpb_dma;
        struct nv_adma_prd      *aprd;
        dma_addr_t              aprd_dma;
+       void __iomem *          ctl_block;
+       void __iomem *          gen_block;
+       void __iomem *          notifier_clear_block;
        u8                      flags;
 };
 
+struct nv_host_priv {
+       unsigned long           type;
+};
+
 #define NV_ADMA_CHECK_INTR(GCTL, PORT) ((GCTL) & ( 1 << (19 + (12 * (PORT)))))
 
 static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
+static void nv_remove_one (struct pci_dev *pdev);
+static int nv_pci_device_resume(struct pci_dev *pdev);
 static void nv_ck804_host_stop(struct ata_host *host);
 static irqreturn_t nv_generic_interrupt(int irq, void *dev_instance);
 static irqreturn_t nv_nf2_interrupt(int irq, void *dev_instance);
@@ -239,6 +250,8 @@ static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance);
 static void nv_adma_irq_clear(struct ata_port *ap);
 static int nv_adma_port_start(struct ata_port *ap);
 static void nv_adma_port_stop(struct ata_port *ap);
+static int nv_adma_port_suspend(struct ata_port *ap, pm_message_t mesg);
+static int nv_adma_port_resume(struct ata_port *ap);
 static void nv_adma_error_handler(struct ata_port *ap);
 static void nv_adma_host_stop(struct ata_host *host);
 static void nv_adma_bmdma_setup(struct ata_queued_cmd *qc);
@@ -284,7 +297,9 @@ static struct pci_driver nv_pci_driver = {
        .name                   = DRV_NAME,
        .id_table               = nv_pci_tbl,
        .probe                  = nv_init_one,
-       .remove                 = ata_pci_remove_one,
+       .suspend                = ata_pci_device_suspend,
+       .resume                 = nv_pci_device_resume,
+       .remove                 = nv_remove_one,
 };
 
 static struct scsi_host_template nv_sht = {
@@ -303,6 +318,8 @@ static struct scsi_host_template nv_sht = {
        .slave_configure        = ata_scsi_slave_config,
        .slave_destroy          = ata_scsi_slave_destroy,
        .bios_param             = ata_std_bios_param,
+       .suspend                = ata_scsi_device_suspend,
+       .resume                 = ata_scsi_device_resume,
 };
 
 static struct scsi_host_template nv_adma_sht = {
@@ -321,6 +338,8 @@ static struct scsi_host_template nv_adma_sht = {
        .slave_configure        = nv_adma_slave_config,
        .slave_destroy          = ata_scsi_slave_destroy,
        .bios_param             = ata_std_bios_param,
+       .suspend                = ata_scsi_device_suspend,
+       .resume                 = ata_scsi_device_resume,
 };
 
 static const struct ata_port_operations nv_generic_ops = {
@@ -340,14 +359,14 @@ static const struct ata_port_operations nv_generic_ops = {
        .thaw                   = ata_bmdma_thaw,
        .error_handler          = nv_error_handler,
        .post_internal_cmd      = ata_bmdma_post_internal_cmd,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
        .irq_handler            = nv_generic_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
        .scr_read               = nv_scr_read,
        .scr_write              = nv_scr_write,
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_pci_host_stop,
 };
 
 static const struct ata_port_operations nv_nf2_ops = {
@@ -367,14 +386,14 @@ static const struct ata_port_operations nv_nf2_ops = {
        .thaw                   = nv_nf2_thaw,
        .error_handler          = nv_error_handler,
        .post_internal_cmd      = ata_bmdma_post_internal_cmd,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
        .irq_handler            = nv_nf2_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
        .scr_read               = nv_scr_read,
        .scr_write              = nv_scr_write,
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_pci_host_stop,
 };
 
 static const struct ata_port_operations nv_ck804_ops = {
@@ -394,13 +413,14 @@ static const struct ata_port_operations nv_ck804_ops = {
        .thaw                   = nv_ck804_thaw,
        .error_handler          = nv_error_handler,
        .post_internal_cmd      = ata_bmdma_post_internal_cmd,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
        .irq_handler            = nv_ck804_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
        .scr_read               = nv_scr_read,
        .scr_write              = nv_scr_write,
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
        .host_stop              = nv_ck804_host_stop,
 };
 
@@ -422,13 +442,17 @@ static const struct ata_port_operations nv_adma_ops = {
        .thaw                   = nv_ck804_thaw,
        .error_handler          = nv_adma_error_handler,
        .post_internal_cmd      = nv_adma_bmdma_stop,
-       .data_xfer              = ata_mmio_data_xfer,
+       .data_xfer              = ata_data_xfer,
        .irq_handler            = nv_adma_interrupt,
        .irq_clear              = nv_adma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
        .scr_read               = nv_scr_read,
        .scr_write              = nv_scr_write,
        .port_start             = nv_adma_port_start,
        .port_stop              = nv_adma_port_stop,
+       .port_suspend           = nv_adma_port_suspend,
+       .port_resume            = nv_adma_port_resume,
        .host_stop              = nv_adma_host_stop,
 };
 
@@ -467,6 +491,7 @@ static struct ata_port_info nv_port_info[] = {
        {
                .sht            = &nv_adma_sht,
                .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
+                                 ATA_FLAG_HRST_TO_RESUME |
                                  ATA_FLAG_MMIO | ATA_FLAG_NCQ,
                .pio_mask       = NV_PIO_MASK,
                .mwdma_mask     = NV_MWDMA_MASK,
@@ -483,57 +508,72 @@ MODULE_VERSION(DRV_VERSION);
 
 static int adma_enabled = 1;
 
-static inline void __iomem *__nv_adma_ctl_block(void __iomem *mmio,
-                                               unsigned int port_no)
-{
-       mmio += NV_ADMA_PORT + port_no * NV_ADMA_PORT_SIZE;
-       return mmio;
-}
-
-static inline void __iomem *nv_adma_ctl_block(struct ata_port *ap)
-{
-       return __nv_adma_ctl_block(ap->host->mmio_base, ap->port_no);
-}
-
-static inline void __iomem *nv_adma_gen_block(struct ata_port *ap)
-{
-       return (ap->host->mmio_base + NV_ADMA_GEN);
-}
-
-static inline void __iomem *nv_adma_notifier_clear_block(struct ata_port *ap)
-{
-       return (nv_adma_gen_block(ap) + NV_ADMA_NOTIFIER_CLEAR + (4 * ap->port_no));
-}
-
 static void nv_adma_register_mode(struct ata_port *ap)
 {
-       void __iomem *mmio = nv_adma_ctl_block(ap);
        struct nv_adma_port_priv *pp = ap->private_data;
-       u16 tmp;
+       void __iomem *mmio = pp->ctl_block;
+       u16 tmp, status;
+       int count = 0;
 
        if (pp->flags & NV_ADMA_PORT_REGISTER_MODE)
                return;
 
+       status = readw(mmio + NV_ADMA_STAT);
+       while(!(status & NV_ADMA_STAT_IDLE) && count < 20) {
+               ndelay(50);
+               status = readw(mmio + NV_ADMA_STAT);
+               count++;
+       }
+       if(count == 20)
+               ata_port_printk(ap, KERN_WARNING,
+                       "timeout waiting for ADMA IDLE, stat=0x%hx\n",
+                       status);
+
        tmp = readw(mmio + NV_ADMA_CTL);
        writew(tmp & ~NV_ADMA_CTL_GO, mmio + NV_ADMA_CTL);
 
+       count = 0;
+       status = readw(mmio + NV_ADMA_STAT);
+       while(!(status & NV_ADMA_STAT_LEGACY) && count < 20) {
+               ndelay(50);
+               status = readw(mmio + NV_ADMA_STAT);
+               count++;
+       }
+       if(count == 20)
+               ata_port_printk(ap, KERN_WARNING,
+                        "timeout waiting for ADMA LEGACY, stat=0x%hx\n",
+                        status);
+
        pp->flags |= NV_ADMA_PORT_REGISTER_MODE;
 }
 
 static void nv_adma_mode(struct ata_port *ap)
 {
-       void __iomem *mmio = nv_adma_ctl_block(ap);
        struct nv_adma_port_priv *pp = ap->private_data;
-       u16 tmp;
+       void __iomem *mmio = pp->ctl_block;
+       u16 tmp, status;
+       int count = 0;
 
        if (!(pp->flags & NV_ADMA_PORT_REGISTER_MODE))
                return;
-               
+
        WARN_ON(pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE);
 
        tmp = readw(mmio + NV_ADMA_CTL);
        writew(tmp | NV_ADMA_CTL_GO, mmio + NV_ADMA_CTL);
 
+       status = readw(mmio + NV_ADMA_STAT);
+       while(((status & NV_ADMA_STAT_LEGACY) ||
+             !(status & NV_ADMA_STAT_IDLE)) && count < 20) {
+               ndelay(50);
+               status = readw(mmio + NV_ADMA_STAT);
+               count++;
+       }
+       if(count == 20)
+               ata_port_printk(ap, KERN_WARNING,
+                       "timeout waiting for ADMA LEGACY clear and IDLE, stat=0x%hx\n",
+                       status);
+
        pp->flags &= ~NV_ADMA_PORT_REGISTER_MODE;
 }
 
@@ -568,7 +608,7 @@ static int nv_adma_slave_config(struct scsi_device *sdev)
                /* Subtract 1 since an extra entry may be needed for padding, see
                   libata-scsi.c */
                sg_tablesize = LIBATA_MAX_PRD - 1;
-               
+
                /* Since the legacy DMA engine is in use, we need to disable ADMA
                   on the port. */
                adma_enable = 0;
@@ -580,7 +620,7 @@ static int nv_adma_slave_config(struct scsi_device *sdev)
                sg_tablesize = NV_ADMA_SGTBL_TOTAL_LEN;
                adma_enable = 1;
        }
-       
+
        pci_read_config_dword(pdev, NV_MCP_SATA_CFG_20, &current_reg);
 
        if(ap->port_no == 1)
@@ -589,7 +629,7 @@ static int nv_adma_slave_config(struct scsi_device *sdev)
        else
                config_mask = NV_MCP_SATA_CFG_20_PORT0_EN |
                              NV_MCP_SATA_CFG_20_PORT0_PWB_EN;
-       
+
        if(adma_enable) {
                new_reg = current_reg | config_mask;
                pp->flags &= ~NV_ADMA_ATAPI_SETUP_COMPLETE;
@@ -598,10 +638,10 @@ static int nv_adma_slave_config(struct scsi_device *sdev)
                new_reg = current_reg & ~config_mask;
                pp->flags |= NV_ADMA_ATAPI_SETUP_COMPLETE;
        }
-       
+
        if(current_reg != new_reg)
                pci_write_config_dword(pdev, NV_MCP_SATA_CFG_20, new_reg);
-       
+
        blk_queue_bounce_limit(sdev->request_queue, bounce_limit);
        blk_queue_segment_boundary(sdev->request_queue, segment_boundary);
        blk_queue_max_hw_segments(sdev->request_queue, sg_tablesize);
@@ -648,53 +688,62 @@ static unsigned int nv_adma_tf_to_cpb(struct ata_taskfile *tf, __le16 *cpb)
        return idx;
 }
 
-static void nv_adma_check_cpb(struct ata_port *ap, int cpb_num, int force_err)
+static int nv_adma_check_cpb(struct ata_port *ap, int cpb_num, int force_err)
 {
        struct nv_adma_port_priv *pp = ap->private_data;
-       int complete = 0, have_err = 0;
        u8 flags = pp->cpb[cpb_num].resp_flags;
 
        VPRINTK("CPB %d, flags=0x%x\n", cpb_num, flags);
 
-       if (flags & NV_CPB_RESP_DONE) {
-               VPRINTK("CPB flags done, flags=0x%x\n", flags);
-               complete = 1;
-       }
-       if (flags & NV_CPB_RESP_ATA_ERR) {
-               ata_port_printk(ap, KERN_ERR, "CPB flags ATA err, flags=0x%x\n", flags);
-               have_err = 1;
-               complete = 1;
-       }
-       if (flags & NV_CPB_RESP_CMD_ERR) {
-               ata_port_printk(ap, KERN_ERR, "CPB flags CMD err, flags=0x%x\n", flags);
-               have_err = 1;
-               complete = 1;
-       }
-       if (flags & NV_CPB_RESP_CPB_ERR) {
-               ata_port_printk(ap, KERN_ERR, "CPB flags CPB err, flags=0x%x\n", flags);
-               have_err = 1;
-               complete = 1;
+       if (unlikely((force_err ||
+                    flags & (NV_CPB_RESP_ATA_ERR |
+                             NV_CPB_RESP_CMD_ERR |
+                             NV_CPB_RESP_CPB_ERR)))) {
+               struct ata_eh_info *ehi = &ap->eh_info;
+               int freeze = 0;
+
+               ata_ehi_clear_desc(ehi);
+               ata_ehi_push_desc(ehi, "CPB resp_flags 0x%x", flags );
+               if (flags & NV_CPB_RESP_ATA_ERR) {
+                       ata_ehi_push_desc(ehi, ": ATA error");
+                       ehi->err_mask |= AC_ERR_DEV;
+               } else if (flags & NV_CPB_RESP_CMD_ERR) {
+                       ata_ehi_push_desc(ehi, ": CMD error");
+                       ehi->err_mask |= AC_ERR_DEV;
+               } else if (flags & NV_CPB_RESP_CPB_ERR) {
+                       ata_ehi_push_desc(ehi, ": CPB error");
+                       ehi->err_mask |= AC_ERR_SYSTEM;
+                       freeze = 1;
+               } else {
+                       /* notifier error, but no error in CPB flags? */
+                       ehi->err_mask |= AC_ERR_OTHER;
+                       freeze = 1;
+               }
+               /* Kill all commands. EH will determine what actually failed. */
+               if (freeze)
+                       ata_port_freeze(ap);
+               else
+                       ata_port_abort(ap);
+               return 1;
        }
-       if(complete || force_err)
-       {
+
+       if (flags & NV_CPB_RESP_DONE) {
                struct ata_queued_cmd *qc = ata_qc_from_tag(ap, cpb_num);
-               if(likely(qc)) {
-                       u8 ata_status = 0;
-                       /* Only use the ATA port status for non-NCQ commands.
+               VPRINTK("CPB flags done, flags=0x%x\n", flags);
+               if (likely(qc)) {
+                       /* Grab the ATA port status for non-NCQ commands.
                           For NCQ commands the current status may have nothing to do with
                           the command just completed. */
-                       if(qc->tf.protocol != ATA_PROT_NCQ)
-                               ata_status = readb(nv_adma_ctl_block(ap) + (ATA_REG_STATUS * 4));
-
-                       if(have_err || force_err)
-                               ata_status |= ATA_ERR;
-
-                       qc->err_mask |= ac_err_mask(ata_status);
+                       if (qc->tf.protocol != ATA_PROT_NCQ) {
+                               u8 ata_status = readb(pp->ctl_block + (ATA_REG_STATUS * 4));
+                               qc->err_mask |= ac_err_mask(ata_status);
+                       }
                        DPRINTK("Completing qc from tag %d with err_mask %u\n",cpb_num,
                                qc->err_mask);
                        ata_qc_complete(qc);
                }
        }
+       return 0;
 }
 
 static int nv_host_intr(struct ata_port *ap, u8 irq_stat)
@@ -735,15 +784,14 @@ static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance)
 
                if (ap && !(ap->flags & ATA_FLAG_DISABLED)) {
                        struct nv_adma_port_priv *pp = ap->private_data;
-                       void __iomem *mmio = nv_adma_ctl_block(ap);
+                       void __iomem *mmio = pp->ctl_block;
                        u16 status;
                        u32 gen_ctl;
-                       int have_global_err = 0;
                        u32 notifier, notifier_error;
 
                        /* if in ATA register mode, use standard ata interrupt handler */
                        if (pp->flags & NV_ADMA_PORT_REGISTER_MODE) {
-                               u8 irq_stat = readb(host->mmio_base + NV_INT_STATUS_CK804)
+                               u8 irq_stat = readb(host->iomap[NV_MMIO_BAR] + NV_INT_STATUS_CK804)
                                        >> (NV_INT_PORT_SHIFT * i);
                                if(ata_tag_valid(ap->active_tag))
                                        /** NV_INT_DEV indication seems unreliable at times
@@ -758,7 +806,7 @@ static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance)
                        notifier_error = readl(mmio + NV_ADMA_NOTIFIER_ERROR);
                        notifier_clears[i] = notifier | notifier_error;
 
-                       gen_ctl = readl(nv_adma_gen_block(ap) + NV_ADMA_GEN_CTL);
+                       gen_ctl = readl(pp->gen_block + NV_ADMA_GEN_CTL);
 
                        if( !NV_ADMA_CHECK_INTR(gen_ctl, ap->port_no) && !notifier &&
                            !notifier_error)
@@ -774,52 +822,64 @@ static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance)
                        readw(mmio + NV_ADMA_STAT); /* flush posted write */
                        rmb();
 
-                       /* freeze if hotplugged */
-                       if (unlikely(status & (NV_ADMA_STAT_HOTPLUG | NV_ADMA_STAT_HOTUNPLUG))) {
-                               ata_port_printk(ap, KERN_NOTICE, "Hotplug event, freezing\n");
+                       handled++; /* irq handled if we got here */
+
+                       /* freeze if hotplugged or controller error */
+                       if (unlikely(status & (NV_ADMA_STAT_HOTPLUG |
+                                              NV_ADMA_STAT_HOTUNPLUG |
+                                              NV_ADMA_STAT_TIMEOUT |
+                                              NV_ADMA_STAT_SERROR))) {
+                               struct ata_eh_info *ehi = &ap->eh_info;
+
+                               ata_ehi_clear_desc(ehi);
+                               ata_ehi_push_desc(ehi, "ADMA status 0x%08x", status );
+                               if (status & NV_ADMA_STAT_TIMEOUT) {
+                                       ehi->err_mask |= AC_ERR_SYSTEM;
+                                       ata_ehi_push_desc(ehi, ": timeout");
+                               } else if (status & NV_ADMA_STAT_HOTPLUG) {
+                                       ata_ehi_hotplugged(ehi);
+                                       ata_ehi_push_desc(ehi, ": hotplug");
+                               } else if (status & NV_ADMA_STAT_HOTUNPLUG) {
+                                       ata_ehi_hotplugged(ehi);
+                                       ata_ehi_push_desc(ehi, ": hot unplug");
+                               } else if (status & NV_ADMA_STAT_SERROR) {
+                                       /* let libata analyze SError and figure out the cause */
+                                       ata_ehi_push_desc(ehi, ": SError");
+                               }
                                ata_port_freeze(ap);
-                               handled++;
                                continue;
                        }
 
-                       if (status & NV_ADMA_STAT_TIMEOUT) {
-                               ata_port_printk(ap, KERN_ERR, "timeout, stat=0x%x\n", status);
-                               have_global_err = 1;
-                       }
-                       if (status & NV_ADMA_STAT_CPBERR) {
-                               ata_port_printk(ap, KERN_ERR, "CPB error, stat=0x%x\n", status);
-                               have_global_err = 1;
-                       }
-                       if ((status & NV_ADMA_STAT_DONE) || have_global_err) {
+                       if (status & (NV_ADMA_STAT_DONE |
+                                     NV_ADMA_STAT_CPBERR)) {
                                /** Check CPBs for completed commands */
 
-                               if(ata_tag_valid(ap->active_tag))
+                               if (ata_tag_valid(ap->active_tag)) {
                                        /* Non-NCQ command */
-                                       nv_adma_check_cpb(ap, ap->active_tag, have_global_err ||
-                                               (notifier_error & (1 << ap->active_tag)));
-                               else {
-                                       int pos;
+                                       nv_adma_check_cpb(ap, ap->active_tag,
+                                               notifier_error & (1 << ap->active_tag));
+                               else {
+                                       int pos, error = 0;
                                        u32 active = ap->sactive;
-                                       while( (pos = ffs(active)) ) {
+
+                                       while ((pos = ffs(active)) && !error) {
                                                pos--;
-                                               nv_adma_check_cpb(ap, pos, have_global_err ||
-                                                       (notifier_error & (1 << pos)) );
+                                               error = nv_adma_check_cpb(ap, pos,
+                                                       notifier_error & (1 << pos) );
                                                active &= ~(1 << pos );
                                        }
                                }
                        }
-
-                       handled++; /* irq handled if we got here */
                }
        }
-       
+
        if(notifier_clears[0] || notifier_clears[1]) {
                /* Note: Both notifier clear registers must be written
                   if either is set, even if one is zero, according to NVIDIA. */
-               writel(notifier_clears[0], 
-                       nv_adma_notifier_clear_block(host->ports[0]));
-               writel(notifier_clears[1], 
-                       nv_adma_notifier_clear_block(host->ports[1]));
+               struct nv_adma_port_priv *pp = host->ports[0]->private_data;
+               writel(notifier_clears[0], pp->notifier_clear_block);
+               pp = host->ports[1]->private_data;
+               writel(notifier_clears[1], pp->notifier_clear_block);
        }
 
        spin_unlock(&host->lock);
@@ -829,19 +889,20 @@ static irqreturn_t nv_adma_interrupt(int irq, void *dev_instance)
 
 static void nv_adma_irq_clear(struct ata_port *ap)
 {
-       void __iomem *mmio = nv_adma_ctl_block(ap);
+       struct nv_adma_port_priv *pp = ap->private_data;
+       void __iomem *mmio = pp->ctl_block;
        u16 status = readw(mmio + NV_ADMA_STAT);
        u32 notifier = readl(mmio + NV_ADMA_NOTIFIER);
        u32 notifier_error = readl(mmio + NV_ADMA_NOTIFIER_ERROR);
-       unsigned long dma_stat_addr = ap->ioaddr.bmdma_addr + ATA_DMA_STATUS;
+       void __iomem *dma_stat_addr = ap->ioaddr.bmdma_addr + ATA_DMA_STATUS;
 
        /* clear ADMA status */
        writew(status, mmio + NV_ADMA_STAT);
        writel(notifier | notifier_error,
-              nv_adma_notifier_clear_block(ap));
+              pp->notifier_clear_block);
 
        /** clear legacy status */
-       outb(inb(dma_stat_addr), dma_stat_addr);
+       iowrite8(ioread8(dma_stat_addr), dma_stat_addr);
 }
 
 static void nv_adma_bmdma_setup(struct ata_queued_cmd *qc)
@@ -857,15 +918,15 @@ static void nv_adma_bmdma_setup(struct ata_queued_cmd *qc)
        }
 
        /* load PRD table addr. */
-       outl(ap->prd_dma, ap->ioaddr.bmdma_addr + ATA_DMA_TABLE_OFS);
+       iowrite32(ap->prd_dma, ap->ioaddr.bmdma_addr + ATA_DMA_TABLE_OFS);
 
        /* specify data direction, triple-check start bit is clear */
-       dmactl = inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
+       dmactl = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
        dmactl &= ~(ATA_DMA_WR | ATA_DMA_START);
        if (!rw)
                dmactl |= ATA_DMA_WR;
 
-       outb(dmactl, ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
+       iowrite8(dmactl, ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
 
        /* issue r/w command */
        ata_exec_command(ap, &qc->tf);
@@ -883,9 +944,9 @@ static void nv_adma_bmdma_start(struct ata_queued_cmd *qc)
        }
 
        /* start host DMA transaction */
-       dmactl = inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
-       outb(dmactl | ATA_DMA_START,
-            ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
+       dmactl = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
+       iowrite8(dmactl | ATA_DMA_START,
+                ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
 }
 
 static void nv_adma_bmdma_stop(struct ata_queued_cmd *qc)
@@ -897,8 +958,8 @@ static void nv_adma_bmdma_stop(struct ata_queued_cmd *qc)
                return;
 
        /* clear start/stop bit */
-       outb(inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD) & ~ATA_DMA_START,
-               ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
+       iowrite8(ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_CMD) & ~ATA_DMA_START,
+                ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
 
        /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */
        ata_altstatus(ap);        /* dummy read */
@@ -910,7 +971,7 @@ static u8 nv_adma_bmdma_status(struct ata_port *ap)
 
        WARN_ON(!(pp->flags & NV_ADMA_PORT_REGISTER_MODE));
 
-       return inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
+       return ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
 }
 
 static int nv_adma_port_start(struct ata_port *ap)
@@ -920,7 +981,7 @@ static int nv_adma_port_start(struct ata_port *ap)
        int rc;
        void *mem;
        dma_addr_t mem_dma;
-       void __iomem *mmio = nv_adma_ctl_block(ap);
+       void __iomem *mmio;
        u16 tmp;
 
        VPRINTK("ENTER\n");
@@ -929,19 +990,21 @@ static int nv_adma_port_start(struct ata_port *ap)
        if (rc)
                return rc;
 
-       pp = kzalloc(sizeof(*pp), GFP_KERNEL);
-       if (!pp) {
-               rc = -ENOMEM;
-               goto err_out;
-       }
-
-       mem = dma_alloc_coherent(dev, NV_ADMA_PORT_PRIV_DMA_SZ,
-                                &mem_dma, GFP_KERNEL);
-
-       if (!mem) {
-               rc = -ENOMEM;
-               goto err_out_kfree;
-       }
+       pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
+       if (!pp)
+               return -ENOMEM;
+
+       mmio = ap->host->iomap[NV_MMIO_BAR] + NV_ADMA_PORT +
+              ap->port_no * NV_ADMA_PORT_SIZE;
+       pp->ctl_block = mmio;
+       pp->gen_block = ap->host->iomap[NV_MMIO_BAR] + NV_ADMA_GEN;
+       pp->notifier_clear_block = pp->gen_block +
+              NV_ADMA_NOTIFIER_CLEAR + (4 * ap->port_no);
+
+       mem = dmam_alloc_coherent(dev, NV_ADMA_PORT_PRIV_DMA_SZ,
+                                 &mem_dma, GFP_KERNEL);
+       if (!mem)
+               return -ENOMEM;
        memset(mem, 0, NV_ADMA_PORT_PRIV_DMA_SZ);
 
        /*
@@ -975,9 +1038,9 @@ static int nv_adma_port_start(struct ata_port *ap)
        /* clear CPB fetch count */
        writew(0, mmio + NV_ADMA_CPB_COUNT);
 
-       /* clear GO for register mode */
+       /* clear GO for register mode, enable interrupt */
        tmp = readw(mmio + NV_ADMA_CTL);
-       writew(tmp & ~NV_ADMA_CTL_GO, mmio + NV_ADMA_CTL);
+       writew( (tmp & ~NV_ADMA_CTL_GO) | NV_ADMA_CTL_AIEN, mmio + NV_ADMA_CTL);
 
        tmp = readw(mmio + NV_ADMA_CTL);
        writew(tmp | NV_ADMA_CTL_CHANNEL_RESET, mmio + NV_ADMA_CTL);
@@ -987,53 +1050,89 @@ static int nv_adma_port_start(struct ata_port *ap)
        readl( mmio + NV_ADMA_CTL );    /* flush posted write */
 
        return 0;
-
-err_out_kfree:
-       kfree(pp);
-err_out:
-       ata_port_stop(ap);
-       return rc;
 }
 
 static void nv_adma_port_stop(struct ata_port *ap)
 {
-       struct device *dev = ap->host->dev;
        struct nv_adma_port_priv *pp = ap->private_data;
-       void __iomem *mmio = nv_adma_ctl_block(ap);
+       void __iomem *mmio = pp->ctl_block;
 
        VPRINTK("ENTER\n");
+       writew(0, mmio + NV_ADMA_CTL);
+}
+
+static int nv_adma_port_suspend(struct ata_port *ap, pm_message_t mesg)
+{
+       struct nv_adma_port_priv *pp = ap->private_data;
+       void __iomem *mmio = pp->ctl_block;
 
+       /* Go to register mode - clears GO */
+       nv_adma_register_mode(ap);
+
+       /* clear CPB fetch count */
+       writew(0, mmio + NV_ADMA_CPB_COUNT);
+
+       /* disable interrupt, shut down port */
        writew(0, mmio + NV_ADMA_CTL);
 
-       ap->private_data = NULL;
-       dma_free_coherent(dev, NV_ADMA_PORT_PRIV_DMA_SZ, pp->cpb, pp->cpb_dma);
-       kfree(pp);
-       ata_port_stop(ap);
+       return 0;
 }
 
+static int nv_adma_port_resume(struct ata_port *ap)
+{
+       struct nv_adma_port_priv *pp = ap->private_data;
+       void __iomem *mmio = pp->ctl_block;
+       u16 tmp;
+
+       /* set CPB block location */
+       writel(pp->cpb_dma & 0xFFFFFFFF,        mmio + NV_ADMA_CPB_BASE_LOW);
+       writel((pp->cpb_dma >> 16 ) >> 16,      mmio + NV_ADMA_CPB_BASE_HIGH);
+
+       /* clear any outstanding interrupt conditions */
+       writew(0xffff, mmio + NV_ADMA_STAT);
+
+       /* initialize port variables */
+       pp->flags |= NV_ADMA_PORT_REGISTER_MODE;
+
+       /* clear CPB fetch count */
+       writew(0, mmio + NV_ADMA_CPB_COUNT);
+
+       /* clear GO for register mode, enable interrupt */
+       tmp = readw(mmio + NV_ADMA_CTL);
+       writew((tmp & ~NV_ADMA_CTL_GO) | NV_ADMA_CTL_AIEN, mmio + NV_ADMA_CTL);
+
+       tmp = readw(mmio + NV_ADMA_CTL);
+       writew(tmp | NV_ADMA_CTL_CHANNEL_RESET, mmio + NV_ADMA_CTL);
+       readl( mmio + NV_ADMA_CTL );    /* flush posted write */
+       udelay(1);
+       writew(tmp & ~NV_ADMA_CTL_CHANNEL_RESET, mmio + NV_ADMA_CTL);
+       readl( mmio + NV_ADMA_CTL );    /* flush posted write */
+
+       return 0;
+}
 
 static void nv_adma_setup_port(struct ata_probe_ent *probe_ent, unsigned int port)
 {
-       void __iomem *mmio = probe_ent->mmio_base;
+       void __iomem *mmio = probe_ent->iomap[NV_MMIO_BAR];
        struct ata_ioports *ioport = &probe_ent->port[port];
 
        VPRINTK("ENTER\n");
 
        mmio += NV_ADMA_PORT + port * NV_ADMA_PORT_SIZE;
 
-       ioport->cmd_addr        = (unsigned long) mmio;
-       ioport->data_addr       = (unsigned long) mmio + (ATA_REG_DATA * 4);
+       ioport->cmd_addr        = mmio;
+       ioport->data_addr       = mmio + (ATA_REG_DATA * 4);
        ioport->error_addr      =
-       ioport->feature_addr    = (unsigned long) mmio + (ATA_REG_ERR * 4);
-       ioport->nsect_addr      = (unsigned long) mmio + (ATA_REG_NSECT * 4);
-       ioport->lbal_addr       = (unsigned long) mmio + (ATA_REG_LBAL * 4);
-       ioport->lbam_addr       = (unsigned long) mmio + (ATA_REG_LBAM * 4);
-       ioport->lbah_addr       = (unsigned long) mmio + (ATA_REG_LBAH * 4);
-       ioport->device_addr     = (unsigned long) mmio + (ATA_REG_DEVICE * 4);
+       ioport->feature_addr    = mmio + (ATA_REG_ERR * 4);
+       ioport->nsect_addr      = mmio + (ATA_REG_NSECT * 4);
+       ioport->lbal_addr       = mmio + (ATA_REG_LBAL * 4);
+       ioport->lbam_addr       = mmio + (ATA_REG_LBAM * 4);
+       ioport->lbah_addr       = mmio + (ATA_REG_LBAH * 4);
+       ioport->device_addr     = mmio + (ATA_REG_DEVICE * 4);
        ioport->status_addr     =
-       ioport->command_addr    = (unsigned long) mmio + (ATA_REG_STATUS * 4);
+       ioport->command_addr    = mmio + (ATA_REG_STATUS * 4);
        ioport->altstatus_addr  =
-       ioport->ctl_addr        = (unsigned long) mmio + 0x20;
+       ioport->ctl_addr        = mmio + 0x20;
 }
 
 static int nv_adma_host_init(struct ata_probe_ent *probe_ent)
@@ -1056,15 +1155,6 @@ static int nv_adma_host_init(struct ata_probe_ent *probe_ent)
        for (i = 0; i < probe_ent->n_ports; i++)
                nv_adma_setup_port(probe_ent, i);
 
-       for (i = 0; i < probe_ent->n_ports; i++) {
-               void __iomem *mmio = __nv_adma_ctl_block(probe_ent->mmio_base, i);
-               u16 tmp;
-
-               /* enable interrupt, clear reset if not already clear */
-               tmp = readw(mmio + NV_ADMA_CTL);
-               writew(tmp | NV_ADMA_CTL_AIEN, mmio + NV_ADMA_CTL);
-       }
-
        return 0;
 }
 
@@ -1110,18 +1200,31 @@ static void nv_adma_fill_sg(struct ata_queued_cmd *qc, struct nv_adma_cpb *cpb)
                cpb->next_aprd = cpu_to_le64(((u64)(pp->aprd_dma + NV_ADMA_SGTBL_SZ * qc->tag)));
 }
 
+static int nv_adma_use_reg_mode(struct ata_queued_cmd *qc)
+{
+       struct nv_adma_port_priv *pp = qc->ap->private_data;
+
+       /* ADMA engine can only be used for non-ATAPI DMA commands,
+          or interrupt-driven no-data commands. */
+       if((pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE) ||
+          (qc->tf.flags & ATA_TFLAG_POLLING))
+               return 1;
+
+       if((qc->flags & ATA_QCFLAG_DMAMAP) ||
+          (qc->tf.protocol == ATA_PROT_NODATA))
+               return 0;
+
+       return 1;
+}
+
 static void nv_adma_qc_prep(struct ata_queued_cmd *qc)
 {
        struct nv_adma_port_priv *pp = qc->ap->private_data;
        struct nv_adma_cpb *cpb = &pp->cpb[qc->tag];
        u8 ctl_flags = NV_CPB_CTL_CPB_VALID |
-                      NV_CPB_CTL_APRD_VALID |
                       NV_CPB_CTL_IEN;
 
-       VPRINTK("qc->flags = 0x%lx\n", qc->flags);
-
-       if (!(qc->flags & ATA_QCFLAG_DMAMAP) ||
-            (pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE)) {
+       if (nv_adma_use_reg_mode(qc)) {
                nv_adma_register_mode(qc->ap);
                ata_qc_prep(qc);
                return;
@@ -1137,9 +1240,15 @@ static void nv_adma_qc_prep(struct ata_queued_cmd *qc)
        if (qc->tf.protocol == ATA_PROT_NCQ)
                ctl_flags |= NV_CPB_CTL_QUEUE | NV_CPB_CTL_FPDMA;
 
+       VPRINTK("qc->flags = 0x%lx\n", qc->flags);
+
        nv_adma_tf_to_cpb(&qc->tf, cpb->tf);
 
-       nv_adma_fill_sg(qc, cpb);
+       if(qc->flags & ATA_QCFLAG_DMAMAP) {
+               nv_adma_fill_sg(qc, cpb);
+               ctl_flags |= NV_CPB_CTL_APRD_VALID;
+       } else
+               memset(&cpb->aprd[0], 0, sizeof(struct nv_adma_prd) * 5);
 
        /* Be paranoid and don't let the device see NV_CPB_CTL_CPB_VALID until we are
           finished filling in all of the contents */
@@ -1150,14 +1259,13 @@ static void nv_adma_qc_prep(struct ata_queued_cmd *qc)
 static unsigned int nv_adma_qc_issue(struct ata_queued_cmd *qc)
 {
        struct nv_adma_port_priv *pp = qc->ap->private_data;
-       void __iomem *mmio = nv_adma_ctl_block(qc->ap);
+       void __iomem *mmio = pp->ctl_block;
 
        VPRINTK("ENTER\n");
 
-       if (!(qc->flags & ATA_QCFLAG_DMAMAP) ||
-            (pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE)) {
+       if (nv_adma_use_reg_mode(qc)) {
                /* use ATA register mode */
-               VPRINTK("no dmamap or ATAPI, using ATA register mode: 0x%lx\n", qc->flags);
+               VPRINTK("using ATA register mode: 0x%lx\n", qc->flags);
                nv_adma_register_mode(qc->ap);
                return ata_qc_issue_prot(qc);
        } else
@@ -1229,7 +1337,7 @@ static irqreturn_t nv_nf2_interrupt(int irq, void *dev_instance)
        irqreturn_t ret;
 
        spin_lock(&host->lock);
-       irq_stat = inb(host->ports[0]->ioaddr.scr_addr + NV_INT_STATUS);
+       irq_stat = ioread8(host->ports[0]->ioaddr.scr_addr + NV_INT_STATUS);
        ret = nv_do_interrupt(host, irq_stat);
        spin_unlock(&host->lock);
 
@@ -1243,7 +1351,7 @@ static irqreturn_t nv_ck804_interrupt(int irq, void *dev_instance)
        irqreturn_t ret;
 
        spin_lock(&host->lock);
-       irq_stat = readb(host->mmio_base + NV_INT_STATUS_CK804);
+       irq_stat = readb(host->iomap[NV_MMIO_BAR] + NV_INT_STATUS_CK804);
        ret = nv_do_interrupt(host, irq_stat);
        spin_unlock(&host->lock);
 
@@ -1255,7 +1363,7 @@ static u32 nv_scr_read (struct ata_port *ap, unsigned int sc_reg)
        if (sc_reg > SCR_CONTROL)
                return 0xffffffffU;
 
-       return ioread32((void __iomem *)ap->ioaddr.scr_addr + (sc_reg * 4));
+       return ioread32(ap->ioaddr.scr_addr + (sc_reg * 4));
 }
 
 static void nv_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
@@ -1263,36 +1371,36 @@ static void nv_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
        if (sc_reg > SCR_CONTROL)
                return;
 
-       iowrite32(val, (void __iomem *)ap->ioaddr.scr_addr + (sc_reg * 4));
+       iowrite32(val, ap->ioaddr.scr_addr + (sc_reg * 4));
 }
 
 static void nv_nf2_freeze(struct ata_port *ap)
 {
-       unsigned long scr_addr = ap->host->ports[0]->ioaddr.scr_addr;
+       void __iomem *scr_addr = ap->host->ports[0]->ioaddr.scr_addr;
        int shift = ap->port_no * NV_INT_PORT_SHIFT;
        u8 mask;
 
-       mask = inb(scr_addr + NV_INT_ENABLE);
+       mask = ioread8(scr_addr + NV_INT_ENABLE);
        mask &= ~(NV_INT_ALL << shift);
-       outb(mask, scr_addr + NV_INT_ENABLE);
+       iowrite8(mask, scr_addr + NV_INT_ENABLE);
 }
 
 static void nv_nf2_thaw(struct ata_port *ap)
 {
-       unsigned long scr_addr = ap->host->ports[0]->ioaddr.scr_addr;
+       void __iomem *scr_addr = ap->host->ports[0]->ioaddr.scr_addr;
        int shift = ap->port_no * NV_INT_PORT_SHIFT;
        u8 mask;
 
-       outb(NV_INT_ALL << shift, scr_addr + NV_INT_STATUS);
+       iowrite8(NV_INT_ALL << shift, scr_addr + NV_INT_STATUS);
 
-       mask = inb(scr_addr + NV_INT_ENABLE);
+       mask = ioread8(scr_addr + NV_INT_ENABLE);
        mask |= (NV_INT_MASK << shift);
-       outb(mask, scr_addr + NV_INT_ENABLE);
+       iowrite8(mask, scr_addr + NV_INT_ENABLE);
 }
 
 static void nv_ck804_freeze(struct ata_port *ap)
 {
-       void __iomem *mmio_base = ap->host->mmio_base;
+       void __iomem *mmio_base = ap->host->iomap[NV_MMIO_BAR];
        int shift = ap->port_no * NV_INT_PORT_SHIFT;
        u8 mask;
 
@@ -1303,7 +1411,7 @@ static void nv_ck804_freeze(struct ata_port *ap)
 
 static void nv_ck804_thaw(struct ata_port *ap)
 {
-       void __iomem *mmio_base = ap->host->mmio_base;
+       void __iomem *mmio_base = ap->host->iomap[NV_MMIO_BAR];
        int shift = ap->port_no * NV_INT_PORT_SHIFT;
        u8 mask;
 
@@ -1335,32 +1443,13 @@ static void nv_adma_error_handler(struct ata_port *ap)
 {
        struct nv_adma_port_priv *pp = ap->private_data;
        if(!(pp->flags & NV_ADMA_PORT_REGISTER_MODE)) {
-               void __iomem *mmio = nv_adma_ctl_block(ap);
+               void __iomem *mmio = pp->ctl_block;
                int i;
                u16 tmp;
 
-               u32 notifier = readl(mmio + NV_ADMA_NOTIFIER);
-               u32 notifier_error = readl(mmio + NV_ADMA_NOTIFIER_ERROR);
-               u32 gen_ctl = readl(nv_adma_gen_block(ap) + NV_ADMA_GEN_CTL);
-               u32 status = readw(mmio + NV_ADMA_STAT);
-
-               ata_port_printk(ap, KERN_ERR, "EH in ADMA mode, notifier 0x%X "
-                       "notifier_error 0x%X gen_ctl 0x%X status 0x%X\n",
-                       notifier, notifier_error, gen_ctl, status);
-
-               for( i=0;i<NV_ADMA_MAX_CPBS;i++) {
-                       struct nv_adma_cpb *cpb = &pp->cpb[i];
-                       if( cpb->ctl_flags || cpb->resp_flags )
-                               ata_port_printk(ap, KERN_ERR,
-                                       "CPB %d: ctl_flags 0x%x, resp_flags 0x%x\n",
-                                       i, cpb->ctl_flags, cpb->resp_flags);
-               }
-
                /* Push us back into port register mode for error handling. */
                nv_adma_register_mode(ap);
 
-               ata_port_printk(ap, KERN_ERR, "Resetting port\n");
-
                /* Mark all of the CPBs as invalid to prevent them from being executed */
                for( i=0;i<NV_ADMA_MAX_CPBS;i++)
                        pp->cpb[i].ctl_flags &= ~NV_CPB_CTL_CPB_VALID;
@@ -1386,10 +1475,10 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        static int printed_version = 0;
        struct ata_port_info *ppi[2];
        struct ata_probe_ent *probe_ent;
-       int pci_dev_busy = 0;
+       struct nv_host_priv *hpriv;
        int rc;
        u32 bar;
-       unsigned long base;
+       void __iomem *base;
        unsigned long type = ent->driver_data;
        int mask_set = 0;
 
@@ -1400,17 +1489,17 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                if (pci_resource_start(pdev, bar) == 0)
                        return -ENODEV;
 
-       if (    !printed_version++)
+       if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
-               goto err_out;
+               return rc;
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc) {
-               pci_dev_busy = 1;
-               goto err_out_disable;
+               pcim_pin_device(pdev);
+               return rc;
        }
 
        if(type >= CK804 && adma_enabled) {
@@ -1424,27 +1513,31 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        if(!mask_set) {
                rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
                if (rc)
-                       goto err_out_regions;
+                       return rc;
                rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
                if (rc)
-                       goto err_out_regions;
+                       return rc;
        }
 
        rc = -ENOMEM;
 
+       hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL);
+       if (!hpriv)
+               return -ENOMEM;
+
        ppi[0] = ppi[1] = &nv_port_info[type];
        probe_ent = ata_pci_init_native_mode(pdev, ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY);
        if (!probe_ent)
-               goto err_out_regions;
+               return -ENOMEM;
 
-       probe_ent->mmio_base = pci_iomap(pdev, 5, 0);
-       if (!probe_ent->mmio_base) {
-               rc = -EIO;
-               goto err_out_free_ent;
-       }
+       if (!pcim_iomap(pdev, NV_MMIO_BAR, 0))
+               return -EIO;
+       probe_ent->iomap = pcim_iomap_table(pdev);
 
-       base = (unsigned long)probe_ent->mmio_base;
+       probe_ent->private_data = hpriv;
+       hpriv->type = type;
 
+       base = probe_ent->iomap[NV_MMIO_BAR];
        probe_ent->port[0].scr_addr = base + NV_PORT0_SCR_REG_OFFSET;
        probe_ent->port[1].scr_addr = base + NV_PORT1_SCR_REG_OFFSET;
 
@@ -1462,28 +1555,72 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        if (type == ADMA) {
                rc = nv_adma_host_init(probe_ent);
                if (rc)
-                       goto err_out_iounmap;
+                       return rc;
        }
 
        rc = ata_device_add(probe_ent);
        if (rc != NV_PORTS)
-               goto err_out_iounmap;
-
-       kfree(probe_ent);
+               return -ENODEV;
 
+       devm_kfree(&pdev->dev, probe_ent);
        return 0;
+}
 
-err_out_iounmap:
-       pci_iounmap(pdev, probe_ent->mmio_base);
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out_disable:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-err_out:
-       return rc;
+static void nv_remove_one (struct pci_dev *pdev)
+{
+       struct ata_host *host = dev_get_drvdata(&pdev->dev);
+       struct nv_host_priv *hpriv = host->private_data;
+
+       ata_pci_remove_one(pdev);
+       kfree(hpriv);
+}
+
+static int nv_pci_device_resume(struct pci_dev *pdev)
+{
+       struct ata_host *host = dev_get_drvdata(&pdev->dev);
+       struct nv_host_priv *hpriv = host->private_data;
+       int rc;
+
+       rc = ata_pci_device_do_resume(pdev);
+       if(rc)
+               return rc;
+
+       if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
+               if(hpriv->type >= CK804) {
+                       u8 regval;
+
+                       pci_read_config_byte(pdev, NV_MCP_SATA_CFG_20, &regval);
+                       regval |= NV_MCP_SATA_CFG_20_SATA_SPACE_EN;
+                       pci_write_config_byte(pdev, NV_MCP_SATA_CFG_20, regval);
+               }
+               if(hpriv->type == ADMA) {
+                       u32 tmp32;
+                       struct nv_adma_port_priv *pp;
+                       /* enable/disable ADMA on the ports appropriately */
+                       pci_read_config_dword(pdev, NV_MCP_SATA_CFG_20, &tmp32);
+
+                       pp = host->ports[0]->private_data;
+                       if(pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE)
+                               tmp32 &= ~(NV_MCP_SATA_CFG_20_PORT0_EN |
+                                          NV_MCP_SATA_CFG_20_PORT0_PWB_EN);
+                       else
+                               tmp32 |=  (NV_MCP_SATA_CFG_20_PORT0_EN |
+                                          NV_MCP_SATA_CFG_20_PORT0_PWB_EN);
+                       pp = host->ports[1]->private_data;
+                       if(pp->flags & NV_ADMA_ATAPI_SETUP_COMPLETE)
+                               tmp32 &= ~(NV_MCP_SATA_CFG_20_PORT1_EN |
+                                          NV_MCP_SATA_CFG_20_PORT1_PWB_EN);
+                       else
+                               tmp32 |=  (NV_MCP_SATA_CFG_20_PORT1_EN |
+                                          NV_MCP_SATA_CFG_20_PORT1_PWB_EN);
+
+                       pci_write_config_dword(pdev, NV_MCP_SATA_CFG_20, tmp32);
+               }
+       }
+
+       ata_host_resume(host);
+
+       return 0;
 }
 
 static void nv_ck804_host_stop(struct ata_host *host)
@@ -1495,25 +1632,13 @@ static void nv_ck804_host_stop(struct ata_host *host)
        pci_read_config_byte(pdev, NV_MCP_SATA_CFG_20, &regval);
        regval &= ~NV_MCP_SATA_CFG_20_SATA_SPACE_EN;
        pci_write_config_byte(pdev, NV_MCP_SATA_CFG_20, regval);
-
-       ata_pci_host_stop(host);
 }
 
 static void nv_adma_host_stop(struct ata_host *host)
 {
        struct pci_dev *pdev = to_pci_dev(host->dev);
-       int i;
        u32 tmp32;
 
-       for (i = 0; i < host->n_ports; i++) {
-               void __iomem *mmio = __nv_adma_ctl_block(host->mmio_base, i);
-               u16 tmp;
-
-               /* disable interrupt */
-               tmp = readw(mmio + NV_ADMA_CTL);
-               writew(tmp & ~NV_ADMA_CTL_AIEN, mmio + NV_ADMA_CTL);
-       }
-
        /* disable ADMA on the ports */
        pci_read_config_dword(pdev, NV_MCP_SATA_CFG_20, &tmp32);
        tmp32 &= ~(NV_MCP_SATA_CFG_20_PORT0_EN |
index f055874a6ec5d303a11960fe88605c8975e7923c..cf9ed8c3930155bf87cd0d08c63c1ee84d977539 100644 (file)
 #include <linux/blkdev.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
-#include <linux/sched.h>
 #include <linux/device.h>
+#include <scsi/scsi.h>
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_cmnd.h>
 #include <linux/libata.h>
-#include <asm/io.h>
 #include "sata_promise.h"
 
 #define DRV_NAME       "sata_promise"
 
 
 enum {
+       PDC_MMIO_BAR            = 3,
+
+       /* register offsets */
+       PDC_FEATURE             = 0x04, /* Feature/Error reg (per port) */
+       PDC_SECTOR_COUNT        = 0x08, /* Sector count reg (per port) */
+       PDC_SECTOR_NUMBER       = 0x0C, /* Sector number reg (per port) */
+       PDC_CYLINDER_LOW        = 0x10, /* Cylinder low reg (per port) */
+       PDC_CYLINDER_HIGH       = 0x14, /* Cylinder high reg (per port) */
+       PDC_DEVICE              = 0x18, /* Device/Head reg (per port) */
+       PDC_COMMAND             = 0x1C, /* Command/status reg (per port) */
+       PDC_ALTSTATUS           = 0x38, /* Alternate-status/device-control reg (per port) */
        PDC_PKT_SUBMIT          = 0x40, /* Command packet pointer addr */
        PDC_INT_SEQMASK         = 0x40, /* Mask of asserted SEQ INTs */
        PDC_FLASH_CTL           = 0x44, /* Flash control register */
@@ -71,13 +81,23 @@ enum {
 
        PDC_HAS_PATA            = (1 << 1), /* PDC20375/20575 has PATA */
 
+       /* Sequence counter control registers bit definitions */
+       PDC_SEQCNTRL_INT_MASK   = (1 << 5), /* Sequence Interrupt Mask */
+
+       /* Feature register values */
+       PDC_FEATURE_ATAPI_PIO   = 0x00, /* ATAPI data xfer by PIO */
+       PDC_FEATURE_ATAPI_DMA   = 0x01, /* ATAPI data xfer by DMA */
+
+       /* Device/Head register values */
+       PDC_DEVICE_SATA         = 0xE0, /* Device/Head value for SATA devices */
+
        /* PDC_CTLSTAT bit definitions */
        PDC_DMA_ENABLE          = (1 << 7),
        PDC_IRQ_DISABLE         = (1 << 10),
        PDC_RESET               = (1 << 11), /* HDMA reset */
 
        PDC_COMMON_FLAGS        = ATA_FLAG_NO_LEGACY |
-                                 ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI |
+                                 ATA_FLAG_MMIO |
                                  ATA_FLAG_PIO_POLLING,
 
        /* hp->flags bits */
@@ -92,22 +112,21 @@ struct pdc_port_priv {
 
 struct pdc_host_priv {
        unsigned long           flags;
+       unsigned long           port_flags[ATA_MAX_PORTS];
 };
 
 static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg);
 static void pdc_sata_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
 static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
 static irqreturn_t pdc_interrupt (int irq, void *dev_instance);
-static void pdc_eng_timeout(struct ata_port *ap);
 static int pdc_port_start(struct ata_port *ap);
-static void pdc_port_stop(struct ata_port *ap);
-static void pdc_pata_phy_reset(struct ata_port *ap);
 static void pdc_qc_prep(struct ata_queued_cmd *qc);
 static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
 static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
+static int pdc_check_atapi_dma(struct ata_queued_cmd *qc);
+static int pdc_old_check_atapi_dma(struct ata_queued_cmd *qc);
 static void pdc_irq_clear(struct ata_port *ap);
 static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc);
-static void pdc_host_stop(struct ata_host *host);
 static void pdc_freeze(struct ata_port *ap);
 static void pdc_thaw(struct ata_port *ap);
 static void pdc_error_handler(struct ata_port *ap);
@@ -139,6 +158,7 @@ static const struct ata_port_operations pdc_sata_ops = {
        .check_status           = ata_check_status,
        .exec_command           = pdc_exec_command_mmio,
        .dev_select             = ata_std_dev_select,
+       .check_atapi_dma        = pdc_check_atapi_dma,
 
        .qc_prep                = pdc_qc_prep,
        .qc_issue               = pdc_qc_issue_prot,
@@ -146,48 +166,76 @@ static const struct ata_port_operations pdc_sata_ops = {
        .thaw                   = pdc_thaw,
        .error_handler          = pdc_error_handler,
        .post_internal_cmd      = pdc_post_internal_cmd,
-       .data_xfer              = ata_mmio_data_xfer,
+       .data_xfer              = ata_data_xfer,
        .irq_handler            = pdc_interrupt,
        .irq_clear              = pdc_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .scr_read               = pdc_sata_scr_read,
        .scr_write              = pdc_sata_scr_write,
        .port_start             = pdc_port_start,
-       .port_stop              = pdc_port_stop,
-       .host_stop              = pdc_host_stop,
 };
 
-static const struct ata_port_operations pdc_pata_ops = {
+/* First-generation chips need a more restrictive ->check_atapi_dma op */
+static const struct ata_port_operations pdc_old_sata_ops = {
        .port_disable           = ata_port_disable,
        .tf_load                = pdc_tf_load_mmio,
        .tf_read                = ata_tf_read,
        .check_status           = ata_check_status,
        .exec_command           = pdc_exec_command_mmio,
        .dev_select             = ata_std_dev_select,
+       .check_atapi_dma        = pdc_old_check_atapi_dma,
 
-       .phy_reset              = pdc_pata_phy_reset,
+       .qc_prep                = pdc_qc_prep,
+       .qc_issue               = pdc_qc_issue_prot,
+       .freeze                 = pdc_freeze,
+       .thaw                   = pdc_thaw,
+       .error_handler          = pdc_error_handler,
+       .post_internal_cmd      = pdc_post_internal_cmd,
+       .data_xfer              = ata_data_xfer,
+       .irq_handler            = pdc_interrupt,
+       .irq_clear              = pdc_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
+
+       .scr_read               = pdc_sata_scr_read,
+       .scr_write              = pdc_sata_scr_write,
+       .port_start             = pdc_port_start,
+};
+
+static const struct ata_port_operations pdc_pata_ops = {
+       .port_disable           = ata_port_disable,
+       .tf_load                = pdc_tf_load_mmio,
+       .tf_read                = ata_tf_read,
+       .check_status           = ata_check_status,
+       .exec_command           = pdc_exec_command_mmio,
+       .dev_select             = ata_std_dev_select,
+       .check_atapi_dma        = pdc_check_atapi_dma,
 
        .qc_prep                = pdc_qc_prep,
        .qc_issue               = pdc_qc_issue_prot,
-       .data_xfer              = ata_mmio_data_xfer,
-       .eng_timeout            = pdc_eng_timeout,
+       .freeze                 = pdc_freeze,
+       .thaw                   = pdc_thaw,
+       .error_handler          = pdc_error_handler,
+       .data_xfer              = ata_data_xfer,
        .irq_handler            = pdc_interrupt,
        .irq_clear              = pdc_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = pdc_port_start,
-       .port_stop              = pdc_port_stop,
-       .host_stop              = pdc_host_stop,
 };
 
 static const struct ata_port_info pdc_port_info[] = {
        /* board_2037x */
        {
                .sht            = &pdc_ata_sht,
-               .flags          = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
+               .flags          = PDC_COMMON_FLAGS,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
-               .port_ops       = &pdc_sata_ops,
+               .port_ops       = &pdc_old_sata_ops,
        },
 
        /* board_20319 */
@@ -197,13 +245,13 @@ static const struct ata_port_info pdc_port_info[] = {
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
-               .port_ops       = &pdc_sata_ops,
+               .port_ops       = &pdc_old_sata_ops,
        },
 
        /* board_20619 */
        {
                .sht            = &pdc_ata_sht,
-               .flags          = PDC_COMMON_FLAGS | ATA_FLAG_SRST | ATA_FLAG_SLAVE_POSS,
+               .flags          = PDC_COMMON_FLAGS | ATA_FLAG_SLAVE_POSS,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
@@ -213,7 +261,7 @@ static const struct ata_port_info pdc_port_info[] = {
        /* board_2057x */
        {
                .sht            = &pdc_ata_sht,
-               .flags          = PDC_COMMON_FLAGS | ATA_FLAG_SATA,
+               .flags          = PDC_COMMON_FLAGS,
                .pio_mask       = 0x1f, /* pio0-4 */
                .mwdma_mask     = 0x07, /* mwdma0-2 */
                .udma_mask      = 0x7f, /* udma0-6 ; FIXME */
@@ -271,21 +319,22 @@ static int pdc_port_start(struct ata_port *ap)
        struct pdc_port_priv *pp;
        int rc;
 
+       /* fix up port flags and cable type for SATA+PATA chips */
+       ap->flags |= hp->port_flags[ap->port_no];
+       if (ap->flags & ATA_FLAG_SATA)
+               ap->cbl = ATA_CBL_SATA;
+
        rc = ata_port_start(ap);
        if (rc)
                return rc;
 
-       pp = kzalloc(sizeof(*pp), GFP_KERNEL);
-       if (!pp) {
-               rc = -ENOMEM;
-               goto err_out;
-       }
+       pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
+       if (!pp)
+               return -ENOMEM;
 
-       pp->pkt = dma_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL);
-       if (!pp->pkt) {
-               rc = -ENOMEM;
-               goto err_out_kfree;
-       }
+       pp->pkt = dmam_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL);
+       if (!pp->pkt)
+               return -ENOMEM;
 
        ap->private_data = pp;
 
@@ -300,40 +349,11 @@ static int pdc_port_start(struct ata_port *ap)
        }
 
        return 0;
-
-err_out_kfree:
-       kfree(pp);
-err_out:
-       ata_port_stop(ap);
-       return rc;
 }
 
-
-static void pdc_port_stop(struct ata_port *ap)
-{
-       struct device *dev = ap->host->dev;
-       struct pdc_port_priv *pp = ap->private_data;
-
-       ap->private_data = NULL;
-       dma_free_coherent(dev, 128, pp->pkt, pp->pkt_dma);
-       kfree(pp);
-       ata_port_stop(ap);
-}
-
-
-static void pdc_host_stop(struct ata_host *host)
-{
-       struct pdc_host_priv *hp = host->private_data;
-
-       ata_pci_host_stop(host);
-
-       kfree(hp);
-}
-
-
 static void pdc_reset_port(struct ata_port *ap)
 {
-       void __iomem *mmio = (void __iomem *) ap->ioaddr.cmd_addr + PDC_CTLSTAT;
+       void __iomem *mmio = ap->ioaddr.cmd_addr + PDC_CTLSTAT;
        unsigned int i;
        u32 tmp;
 
@@ -367,28 +387,104 @@ static void pdc_pata_cbl_detect(struct ata_port *ap)
                ap->cbl = ATA_CBL_PATA80;
 }
 
-static void pdc_pata_phy_reset(struct ata_port *ap)
-{
-       pdc_pata_cbl_detect(ap);
-       pdc_reset_port(ap);
-       ata_port_probe(ap);
-       ata_bus_reset(ap);
-}
-
 static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg)
 {
-       if (sc_reg > SCR_CONTROL)
+       if (sc_reg > SCR_CONTROL || ap->cbl != ATA_CBL_SATA)
                return 0xffffffffU;
-       return readl((void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4));
+       return readl(ap->ioaddr.scr_addr + (sc_reg * 4));
 }
 
 
 static void pdc_sata_scr_write (struct ata_port *ap, unsigned int sc_reg,
                               u32 val)
 {
-       if (sc_reg > SCR_CONTROL)
+       if (sc_reg > SCR_CONTROL || ap->cbl != ATA_CBL_SATA)
                return;
-       writel(val, (void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4));
+       writel(val, ap->ioaddr.scr_addr + (sc_reg * 4));
+}
+
+static void pdc_atapi_pkt(struct ata_queued_cmd *qc)
+{
+       struct ata_port *ap = qc->ap;
+       dma_addr_t sg_table = ap->prd_dma;
+       unsigned int cdb_len = qc->dev->cdb_len;
+       u8 *cdb = qc->cdb;
+       struct pdc_port_priv *pp = ap->private_data;
+       u8 *buf = pp->pkt;
+       u32 *buf32 = (u32 *) buf;
+       unsigned int dev_sel, feature, nbytes;
+
+       /* set control bits (byte 0), zero delay seq id (byte 3),
+        * and seq id (byte 2)
+        */
+       switch (qc->tf.protocol) {
+       case ATA_PROT_ATAPI_DMA:
+               if (!(qc->tf.flags & ATA_TFLAG_WRITE))
+                       buf32[0] = cpu_to_le32(PDC_PKT_READ);
+               else
+                       buf32[0] = 0;
+               break;
+       case ATA_PROT_ATAPI_NODATA:
+               buf32[0] = cpu_to_le32(PDC_PKT_NODATA);
+               break;
+       default:
+               BUG();
+               break;
+       }
+       buf32[1] = cpu_to_le32(sg_table);       /* S/G table addr */
+       buf32[2] = 0;                           /* no next-packet */
+
+       /* select drive */
+       if (sata_scr_valid(ap)) {
+               dev_sel = PDC_DEVICE_SATA;
+       } else {
+               dev_sel = ATA_DEVICE_OBS;
+               if (qc->dev->devno != 0)
+                       dev_sel |= ATA_DEV1;
+       }
+       buf[12] = (1 << 5) | ATA_REG_DEVICE;
+       buf[13] = dev_sel;
+       buf[14] = (1 << 5) | ATA_REG_DEVICE | PDC_PKT_CLEAR_BSY;
+       buf[15] = dev_sel; /* once more, waiting for BSY to clear */
+
+       buf[16] = (1 << 5) | ATA_REG_NSECT;
+       buf[17] = 0x00;
+       buf[18] = (1 << 5) | ATA_REG_LBAL;
+       buf[19] = 0x00;
+
+       /* set feature and byte counter registers */
+       if (qc->tf.protocol != ATA_PROT_ATAPI_DMA) {
+               feature = PDC_FEATURE_ATAPI_PIO;
+               /* set byte counter register to real transfer byte count */
+               nbytes = qc->nbytes;
+               if (nbytes > 0xffff)
+                       nbytes = 0xffff;
+       } else {
+               feature = PDC_FEATURE_ATAPI_DMA;
+               /* set byte counter register to 0 */
+               nbytes = 0;
+       }
+       buf[20] = (1 << 5) | ATA_REG_FEATURE;
+       buf[21] = feature;
+       buf[22] = (1 << 5) | ATA_REG_BYTEL;
+       buf[23] = nbytes & 0xFF;
+       buf[24] = (1 << 5) | ATA_REG_BYTEH;
+       buf[25] = (nbytes >> 8) & 0xFF;
+
+       /* send ATAPI packet command 0xA0 */
+       buf[26] = (1 << 5) | ATA_REG_CMD;
+       buf[27] = ATA_CMD_PACKET;
+
+       /* select drive and check DRQ */
+       buf[28] = (1 << 5) | ATA_REG_DEVICE | PDC_PKT_WAIT_DRDY;
+       buf[29] = dev_sel;
+
+       /* we can represent cdb lengths 2/4/6/8/10/12/14/16 */
+       BUG_ON(cdb_len & ~0x1E);
+
+       /* append the CDB as the final part */
+       buf[30] = (((cdb_len >> 1) & 7) << 5) | ATA_REG_DATA | PDC_LAST_REG;
+       memcpy(buf+31, cdb, cdb_len);
 }
 
 static void pdc_qc_prep(struct ata_queued_cmd *qc)
@@ -415,6 +511,17 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc)
                pdc_pkt_footer(&qc->tf, pp->pkt, i);
                break;
 
+       case ATA_PROT_ATAPI:
+               ata_qc_prep(qc);
+               break;
+
+       case ATA_PROT_ATAPI_DMA:
+               ata_qc_prep(qc);
+               /*FALLTHROUGH*/
+       case ATA_PROT_ATAPI_NODATA:
+               pdc_atapi_pkt(qc);
+               break;
+
        default:
                break;
        }
@@ -447,6 +554,13 @@ static void pdc_thaw(struct ata_port *ap)
        readl(mmio + PDC_CTLSTAT); /* flush */
 }
 
+static int pdc_pre_reset(struct ata_port *ap)
+{
+       if (!sata_scr_valid(ap))
+               pdc_pata_cbl_detect(ap);
+       return ata_std_prereset(ap);
+}
+
 static void pdc_error_handler(struct ata_port *ap)
 {
        ata_reset_fn_t hardreset;
@@ -459,7 +573,7 @@ static void pdc_error_handler(struct ata_port *ap)
                hardreset = sata_std_hardreset;
 
        /* perform recovery */
-       ata_do_eh(ap, ata_std_prereset, ata_std_softreset, hardreset,
+       ata_do_eh(ap, pdc_pre_reset, ata_std_softreset, hardreset,
                  ata_std_postreset);
 }
 
@@ -475,49 +589,12 @@ static void pdc_post_internal_cmd(struct ata_queued_cmd *qc)
                pdc_reset_port(ap);
 }
 
-static void pdc_eng_timeout(struct ata_port *ap)
-{
-       struct ata_host *host = ap->host;
-       u8 drv_stat;
-       struct ata_queued_cmd *qc;
-       unsigned long flags;
-
-       DPRINTK("ENTER\n");
-
-       spin_lock_irqsave(&host->lock, flags);
-
-       qc = ata_qc_from_tag(ap, ap->active_tag);
-
-       switch (qc->tf.protocol) {
-       case ATA_PROT_DMA:
-       case ATA_PROT_NODATA:
-               ata_port_printk(ap, KERN_ERR, "command timeout\n");
-               drv_stat = ata_wait_idle(ap);
-               qc->err_mask |= __ac_err_mask(drv_stat);
-               break;
-
-       default:
-               drv_stat = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);
-
-               ata_port_printk(ap, KERN_ERR,
-                               "unknown timeout, cmd 0x%x stat 0x%x\n",
-                               qc->tf.command, drv_stat);
-
-               qc->err_mask |= ac_err_mask(drv_stat);
-               break;
-       }
-
-       spin_unlock_irqrestore(&host->lock, flags);
-       ata_eh_qc_complete(qc);
-       DPRINTK("EXIT\n");
-}
-
 static inline unsigned int pdc_host_intr( struct ata_port *ap,
                                           struct ata_queued_cmd *qc)
 {
        unsigned int handled = 0;
        u32 tmp;
-       void __iomem *mmio = (void __iomem *) ap->ioaddr.cmd_addr + PDC_GLOBAL_CTL;
+       void __iomem *mmio = ap->ioaddr.cmd_addr + PDC_GLOBAL_CTL;
 
        tmp = readl(mmio);
        if (tmp & PDC_ERR_MASK) {
@@ -528,6 +605,8 @@ static inline unsigned int pdc_host_intr( struct ata_port *ap,
        switch (qc->tf.protocol) {
        case ATA_PROT_DMA:
        case ATA_PROT_NODATA:
+       case ATA_PROT_ATAPI_DMA:
+       case ATA_PROT_ATAPI_NODATA:
                qc->err_mask |= ac_err_mask(ata_wait_idle(ap));
                ata_qc_complete(qc);
                handled = 1;
@@ -544,7 +623,7 @@ static inline unsigned int pdc_host_intr( struct ata_port *ap,
 static void pdc_irq_clear(struct ata_port *ap)
 {
        struct ata_host *host = ap->host;
-       void __iomem *mmio = host->mmio_base;
+       void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
 
        readl(mmio + PDC_INT_SEQMASK);
 }
@@ -560,12 +639,12 @@ static irqreturn_t pdc_interrupt (int irq, void *dev_instance)
 
        VPRINTK("ENTER\n");
 
-       if (!host || !host->mmio_base) {
+       if (!host || !host->iomap[PDC_MMIO_BAR]) {
                VPRINTK("QUICK EXIT\n");
                return IRQ_NONE;
        }
 
-       mmio_base = host->mmio_base;
+       mmio_base = host->iomap[PDC_MMIO_BAR];
 
        /* reading should also clear interrupts */
        mask = readl(mmio_base + PDC_INT_SEQMASK);
@@ -610,32 +689,34 @@ static inline void pdc_packet_start(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
        struct pdc_port_priv *pp = ap->private_data;
+       void __iomem *mmio = ap->host->iomap[PDC_MMIO_BAR];
        unsigned int port_no = ap->port_no;
        u8 seq = (u8) (port_no + 1);
 
        VPRINTK("ENTER, ap %p\n", ap);
 
-       writel(0x00000001, ap->host->mmio_base + (seq * 4));
-       readl(ap->host->mmio_base + (seq * 4)); /* flush */
+       writel(0x00000001, mmio + (seq * 4));
+       readl(mmio + (seq * 4));        /* flush */
 
        pp->pkt[2] = seq;
        wmb();                  /* flush PRD, pkt writes */
-       writel(pp->pkt_dma, (void __iomem *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
-       readl((void __iomem *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); /* flush */
+       writel(pp->pkt_dma, ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
+       readl(ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT); /* flush */
 }
 
 static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc)
 {
        switch (qc->tf.protocol) {
+       case ATA_PROT_ATAPI_NODATA:
+               if (qc->dev->flags & ATA_DFLAG_CDB_INTR)
+                       break;
+               /*FALLTHROUGH*/
+       case ATA_PROT_ATAPI_DMA:
        case ATA_PROT_DMA:
        case ATA_PROT_NODATA:
                pdc_packet_start(qc);
                return 0;
 
-       case ATA_PROT_ATAPI_DMA:
-               BUG();
-               break;
-
        default:
                break;
        }
@@ -658,8 +739,44 @@ static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile
        ata_exec_command(ap, tf);
 }
 
+static int pdc_check_atapi_dma(struct ata_queued_cmd *qc)
+{
+       u8 *scsicmd = qc->scsicmd->cmnd;
+       int pio = 1; /* atapi dma off by default */
+
+       /* Whitelist commands that may use DMA. */
+       switch (scsicmd[0]) {
+       case WRITE_12:
+       case WRITE_10:
+       case WRITE_6:
+       case READ_12:
+       case READ_10:
+       case READ_6:
+       case 0xad: /* READ_DVD_STRUCTURE */
+       case 0xbe: /* READ_CD */
+               pio = 0;
+       }
+       /* -45150 (FFFF4FA2) to -1 (FFFFFFFF) shall use PIO mode */
+       if (scsicmd[0] == WRITE_10) {
+               unsigned int lba;
+               lba = (scsicmd[2] << 24) | (scsicmd[3] << 16) | (scsicmd[4] << 8) | scsicmd[5];
+               if (lba >= 0xFFFF4FA2)
+                       pio = 1;
+       }
+       return pio;
+}
+
+static int pdc_old_check_atapi_dma(struct ata_queued_cmd *qc)
+{
+       struct ata_port *ap = qc->ap;
+
+       /* First generation chips cannot use ATAPI DMA on SATA ports */
+       if (sata_scr_valid(ap))
+               return 1;
+       return pdc_check_atapi_dma(qc);
+}
 
-static void pdc_ata_setup_port(struct ata_ioports *port, unsigned long base)
+static void pdc_ata_setup_port(struct ata_ioports *port, void __iomem *base)
 {
        port->cmd_addr          = base;
        port->data_addr         = base;
@@ -679,7 +796,7 @@ static void pdc_ata_setup_port(struct ata_ioports *port, unsigned long base)
 
 static void pdc_host_init(unsigned int chip_id, struct ata_probe_ent *pe)
 {
-       void __iomem *mmio = pe->mmio_base;
+       void __iomem *mmio = pe->iomap[PDC_MMIO_BAR];
        struct pdc_host_priv *hp = pe->private_data;
        int hotplug_offset;
        u32 tmp;
@@ -733,55 +850,43 @@ static void pdc_host_init(unsigned int chip_id, struct ata_probe_ent *pe)
 static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version;
-       struct ata_probe_ent *probe_ent = NULL;
+       struct ata_probe_ent *probe_ent;
        struct pdc_host_priv *hp;
-       unsigned long base;
-       void __iomem *mmio_base;
+       void __iomem *base;
        unsigned int board_idx = (unsigned int) ent->driver_data;
-       int pci_dev_busy = 0;
        int rc;
+       u8 tmp;
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
-       rc = pci_request_regions(pdev, DRV_NAME);
-       if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
-       }
+       rc = pcim_iomap_regions(pdev, 1 << PDC_MMIO_BAR, DRV_NAME);
+       if (rc == -EBUSY)
+               pcim_pin_device(pdev);
+       if (rc)
+               return rc;
 
        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
-       probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
 
-       mmio_base = pci_iomap(pdev, 3, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
-       base = (unsigned long) mmio_base;
-
-       hp = kzalloc(sizeof(*hp), GFP_KERNEL);
-       if (hp == NULL) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
+       hp = devm_kzalloc(&pdev->dev, sizeof(*hp), GFP_KERNEL);
+       if (hp == NULL)
+               return -ENOMEM;
 
        probe_ent->private_data = hp;
 
@@ -794,7 +899,9 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
 
                probe_ent->irq = pdev->irq;
                probe_ent->irq_flags = IRQF_SHARED;
-       probe_ent->mmio_base = mmio_base;
+       probe_ent->iomap = pcim_iomap_table(pdev);
+
+       base = probe_ent->iomap[PDC_MMIO_BAR];
 
        pdc_ata_setup_port(&probe_ent->port[0], base + 0x200);
        pdc_ata_setup_port(&probe_ent->port[1], base + 0x280);
@@ -820,7 +927,17 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
                hp->flags |= PDC_FLAG_GEN_II;
                /* Fall through */
        case board_2037x:
-               probe_ent->n_ports = 2;
+               /* TX2plus boards also have a PATA port */
+               tmp = readb(base + PDC_FLASH_CTL+1);
+               if (!(tmp & 0x80)) {
+                       probe_ent->n_ports = 3;
+                       pdc_ata_setup_port(&probe_ent->port[2], base + 0x300);
+                       hp->port_flags[2] = ATA_FLAG_SLAVE_POSS;
+                       printk(KERN_INFO DRV_NAME " PATA port found\n");
+               } else
+                       probe_ent->n_ports = 2;
+               hp->port_flags[0] = ATA_FLAG_SATA;
+               hp->port_flags[1] = ATA_FLAG_SATA;
                break;
        case board_20619:
                probe_ent->n_ports = 4;
@@ -841,22 +958,11 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
        /* initialize adapter */
        pdc_host_init(board_idx, probe_ent);
 
-       /* FIXME: Need any other frees than hp? */
        if (!ata_device_add(probe_ent))
-               kfree(hp);
-
-       kfree(probe_ent);
+               return -ENODEV;
 
+       devm_kfree(&pdev->dev, probe_ent);
        return 0;
-
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
 }
 
 
index 710909df4eaf18a7e846d29f1f20d945318b7542..6097d8f2a0c0aea71891bbff9c9c7b5b1fa11e47 100644 (file)
 #include <linux/blkdev.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
-#include <linux/sched.h>
 #include <linux/device.h>
 #include <scsi/scsi_host.h>
-#include <asm/io.h>
 #include <linux/libata.h>
 
 #define DRV_NAME       "sata_qstor"
 #define DRV_VERSION    "0.06"
 
 enum {
+       QS_MMIO_BAR             = 4,
+
        QS_PORTS                = 4,
        QS_MAX_PRD              = LIBATA_MAX_PRD,
        QS_CPB_ORDER            = 6,
@@ -117,7 +117,6 @@ static int qs_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *en
 static irqreturn_t qs_intr (int irq, void *dev_instance);
 static int qs_port_start(struct ata_port *ap);
 static void qs_host_stop(struct ata_host *host);
-static void qs_port_stop(struct ata_port *ap);
 static void qs_phy_reset(struct ata_port *ap);
 static void qs_qc_prep(struct ata_queued_cmd *qc);
 static unsigned int qs_qc_issue(struct ata_queued_cmd *qc);
@@ -157,14 +156,15 @@ static const struct ata_port_operations qs_ata_ops = {
        .phy_reset              = qs_phy_reset,
        .qc_prep                = qs_qc_prep,
        .qc_issue               = qs_qc_issue,
-       .data_xfer              = ata_mmio_data_xfer,
+       .data_xfer              = ata_data_xfer,
        .eng_timeout            = qs_eng_timeout,
        .irq_handler            = qs_intr,
        .irq_clear              = qs_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
        .scr_read               = qs_scr_read,
        .scr_write              = qs_scr_write,
        .port_start             = qs_port_start,
-       .port_stop              = qs_port_stop,
        .host_stop              = qs_host_stop,
        .bmdma_stop             = qs_bmdma_stop,
        .bmdma_status           = qs_bmdma_status,
@@ -197,6 +197,11 @@ static struct pci_driver qs_ata_pci_driver = {
        .remove                 = ata_pci_remove_one,
 };
 
+static void __iomem *qs_mmio_base(struct ata_host *host)
+{
+       return host->iomap[QS_MMIO_BAR];
+}
+
 static int qs_check_atapi_dma(struct ata_queued_cmd *qc)
 {
        return 1;       /* ATAPI DMA not supported */
@@ -219,7 +224,7 @@ static void qs_irq_clear(struct ata_port *ap)
 
 static inline void qs_enter_reg_mode(struct ata_port *ap)
 {
-       u8 __iomem *chan = ap->host->mmio_base + (ap->port_no * 0x4000);
+       u8 __iomem *chan = qs_mmio_base(ap->host) + (ap->port_no * 0x4000);
 
        writeb(QS_CTR0_REG, chan + QS_CCT_CTR0);
        readb(chan + QS_CCT_CTR0);        /* flush */
@@ -227,7 +232,7 @@ static inline void qs_enter_reg_mode(struct ata_port *ap)
 
 static inline void qs_reset_channel_logic(struct ata_port *ap)
 {
-       u8 __iomem *chan = ap->host->mmio_base + (ap->port_no * 0x4000);
+       u8 __iomem *chan = qs_mmio_base(ap->host) + (ap->port_no * 0x4000);
 
        writeb(QS_CTR1_RCHN, chan + QS_CCT_CTR1);
        readb(chan + QS_CCT_CTR0);        /* flush */
@@ -257,14 +262,14 @@ static u32 qs_scr_read (struct ata_port *ap, unsigned int sc_reg)
 {
        if (sc_reg > SCR_CONTROL)
                return ~0U;
-       return readl((void __iomem *)(ap->ioaddr.scr_addr + (sc_reg * 8)));
+       return readl(ap->ioaddr.scr_addr + (sc_reg * 8));
 }
 
 static void qs_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
 {
        if (sc_reg > SCR_CONTROL)
                return;
-       writel(val, (void __iomem *)(ap->ioaddr.scr_addr + (sc_reg * 8)));
+       writel(val, ap->ioaddr.scr_addr + (sc_reg * 8));
 }
 
 static unsigned int qs_fill_sg(struct ata_queued_cmd *qc)
@@ -325,7 +330,7 @@ static void qs_qc_prep(struct ata_queued_cmd *qc)
        /* host control block (HCB) */
        buf[ 0] = QS_HCB_HDR;
        buf[ 1] = hflags;
-       *(__le32 *)(&buf[ 4]) = cpu_to_le32(qc->nsect * ATA_SECT_SIZE);
+       *(__le32 *)(&buf[ 4]) = cpu_to_le32(qc->nbytes);
        *(__le32 *)(&buf[ 8]) = cpu_to_le32(nelem);
        addr = ((u64)pp->pkt_dma) + QS_CPB_BYTES;
        *(__le64 *)(&buf[16]) = cpu_to_le64(addr);
@@ -341,7 +346,7 @@ static void qs_qc_prep(struct ata_queued_cmd *qc)
 static inline void qs_packet_start(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
-       u8 __iomem *chan = ap->host->mmio_base + (ap->port_no * 0x4000);
+       u8 __iomem *chan = qs_mmio_base(ap->host) + (ap->port_no * 0x4000);
 
        VPRINTK("ENTER, ap %p\n", ap);
 
@@ -378,7 +383,7 @@ static inline unsigned int qs_intr_pkt(struct ata_host *host)
 {
        unsigned int handled = 0;
        u8 sFFE;
-       u8 __iomem *mmio_base = host->mmio_base;
+       u8 __iomem *mmio_base = qs_mmio_base(host);
 
        do {
                u32 sff0 = readl(mmio_base + QS_HST_SFF);
@@ -470,7 +475,7 @@ static irqreturn_t qs_intr(int irq, void *dev_instance)
        return IRQ_RETVAL(handled);
 }
 
-static void qs_ata_setup_port(struct ata_ioports *port, unsigned long base)
+static void qs_ata_setup_port(struct ata_ioports *port, void __iomem *base)
 {
        port->cmd_addr          =
        port->data_addr         = base + 0x400;
@@ -492,7 +497,7 @@ static int qs_port_start(struct ata_port *ap)
 {
        struct device *dev = ap->host->dev;
        struct qs_port_priv *pp;
-       void __iomem *mmio_base = ap->host->mmio_base;
+       void __iomem *mmio_base = qs_mmio_base(ap->host);
        void __iomem *chan = mmio_base + (ap->port_no * 0x4000);
        u64 addr;
        int rc;
@@ -501,17 +506,13 @@ static int qs_port_start(struct ata_port *ap)
        if (rc)
                return rc;
        qs_enter_reg_mode(ap);
-       pp = kzalloc(sizeof(*pp), GFP_KERNEL);
-       if (!pp) {
-               rc = -ENOMEM;
-               goto err_out;
-       }
-       pp->pkt = dma_alloc_coherent(dev, QS_PKT_BYTES, &pp->pkt_dma,
-                                                               GFP_KERNEL);
-       if (!pp->pkt) {
-               rc = -ENOMEM;
-               goto err_out_kfree;
-       }
+       pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
+       if (!pp)
+               return -ENOMEM;
+       pp->pkt = dmam_alloc_coherent(dev, QS_PKT_BYTES, &pp->pkt_dma,
+                                     GFP_KERNEL);
+       if (!pp->pkt)
+               return -ENOMEM;
        memset(pp->pkt, 0, QS_PKT_BYTES);
        ap->private_data = pp;
 
@@ -519,43 +520,19 @@ static int qs_port_start(struct ata_port *ap)
        writel((u32) addr,        chan + QS_CCF_CPBA);
        writel((u32)(addr >> 32), chan + QS_CCF_CPBA + 4);
        return 0;
-
-err_out_kfree:
-       kfree(pp);
-err_out:
-       ata_port_stop(ap);
-       return rc;
-}
-
-static void qs_port_stop(struct ata_port *ap)
-{
-       struct device *dev = ap->host->dev;
-       struct qs_port_priv *pp = ap->private_data;
-
-       if (pp != NULL) {
-               ap->private_data = NULL;
-               if (pp->pkt != NULL)
-                       dma_free_coherent(dev, QS_PKT_BYTES, pp->pkt,
-                                                               pp->pkt_dma);
-               kfree(pp);
-       }
-       ata_port_stop(ap);
 }
 
 static void qs_host_stop(struct ata_host *host)
 {
-       void __iomem *mmio_base = host->mmio_base;
-       struct pci_dev *pdev = to_pci_dev(host->dev);
+       void __iomem *mmio_base = qs_mmio_base(host);
 
        writeb(0, mmio_base + QS_HCT_CTRL); /* disable host interrupts */
        writeb(QS_CNFG3_GSRST, mmio_base + QS_HCF_CNFG3); /* global reset */
-
-       pci_iounmap(pdev, mmio_base);
 }
 
 static void qs_host_init(unsigned int chip_id, struct ata_probe_ent *pe)
 {
-       void __iomem *mmio_base = pe->mmio_base;
+       void __iomem *mmio_base = pe->iomap[QS_MMIO_BAR];
        unsigned int port_no;
 
        writeb(0, mmio_base + QS_HCT_CTRL); /* disable host interrupts */
@@ -630,44 +607,34 @@ static int qs_ata_init_one(struct pci_dev *pdev,
                                const struct pci_device_id *ent)
 {
        static int printed_version;
-       struct ata_probe_ent *probe_ent = NULL;
-       void __iomem *mmio_base;
+       struct ata_probe_ent *probe_ent;
+       void __iomem * const *iomap;
        unsigned int board_idx = (unsigned int) ent->driver_data;
        int rc, port_no;
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
-       rc = pci_request_regions(pdev, DRV_NAME);
-       if (rc)
-               goto err_out;
-
-       if ((pci_resource_flags(pdev, 4) & IORESOURCE_MEM) == 0) {
-               rc = -ENODEV;
-               goto err_out_regions;
-       }
+       if ((pci_resource_flags(pdev, QS_MMIO_BAR) & IORESOURCE_MEM) == 0)
+               return -ENODEV;
 
-       mmio_base = pci_iomap(pdev, 4, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       rc = pcim_iomap_regions(pdev, 1 << QS_MMIO_BAR, DRV_NAME);
+       if (rc)
+               return rc;
+       iomap = pcim_iomap_table(pdev);
 
-       rc = qs_set_dma_masks(pdev, mmio_base);
+       rc = qs_set_dma_masks(pdev, iomap[QS_MMIO_BAR]);
        if (rc)
-               goto err_out_iounmap;
+               return rc;
 
-       probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_iounmap;
-       }
+       probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
-       memset(probe_ent, 0, sizeof(*probe_ent));
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
 
@@ -680,12 +647,12 @@ static int qs_ata_init_one(struct pci_dev *pdev,
 
        probe_ent->irq          = pdev->irq;
        probe_ent->irq_flags    = IRQF_SHARED;
-       probe_ent->mmio_base    = mmio_base;
+       probe_ent->iomap        = iomap;
        probe_ent->n_ports      = QS_PORTS;
 
        for (port_no = 0; port_no < probe_ent->n_ports; ++port_no) {
-               unsigned long chan = (unsigned long)mmio_base +
-                                                       (port_no * 0x4000);
+               void __iomem *chan =
+                       probe_ent->iomap[QS_MMIO_BAR] + (port_no * 0x4000);
                qs_ata_setup_port(&probe_ent->port[port_no], chan);
        }
 
@@ -694,19 +661,11 @@ static int qs_ata_init_one(struct pci_dev *pdev,
        /* initialize adapter */
        qs_host_init(board_idx, probe_ent);
 
-       rc = ata_device_add(probe_ent);
-       kfree(probe_ent);
-       if (rc != QS_PORTS)
-               goto err_out_iounmap;
-       return 0;
+       if (ata_device_add(probe_ent) != QS_PORTS)
+               return -EIO;
 
-err_out_iounmap:
-       pci_iounmap(pdev, mmio_base);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       pci_disable_device(pdev);
-       return rc;
+       devm_kfree(&pdev->dev, probe_ent);
+       return 0;
 }
 
 static int __init qs_ata_init(void)
index 7808d0369d91e2a59907080c7372bd5c7b2b11c9..dca3d3749f0626cbc2d79798ecda01502b1452e3 100644 (file)
@@ -49,6 +49,8 @@
 #define DRV_VERSION    "2.0"
 
 enum {
+       SIL_MMIO_BAR            = 5,
+
        /*
         * host flags
         */
@@ -200,18 +202,18 @@ static const struct ata_port_operations sil_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_mmio_data_xfer,
+       .data_xfer              = ata_data_xfer,
        .freeze                 = sil_freeze,
        .thaw                   = sil_thaw,
        .error_handler          = ata_bmdma_error_handler,
        .post_internal_cmd      = ata_bmdma_post_internal_cmd,
        .irq_handler            = sil_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
        .scr_read               = sil_scr_read,
        .scr_write              = sil_scr_write,
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_pci_host_stop,
 };
 
 static const struct ata_port_info sil_port_info[] = {
@@ -297,7 +299,8 @@ static void sil_post_set_mode (struct ata_port *ap)
 {
        struct ata_host *host = ap->host;
        struct ata_device *dev;
-       void __iomem *addr = host->mmio_base + sil_port[ap->port_no].xfer_mode;
+       void __iomem *mmio_base = host->iomap[SIL_MMIO_BAR];
+       void __iomem *addr = mmio_base + sil_port[ap->port_no].xfer_mode;
        u32 tmp, dev_mode[2];
        unsigned int i;
 
@@ -320,9 +323,9 @@ static void sil_post_set_mode (struct ata_port *ap)
        readl(addr);    /* flush */
 }
 
-static inline unsigned long sil_scr_addr(struct ata_port *ap, unsigned int sc_reg)
+static inline void __iomem *sil_scr_addr(struct ata_port *ap, unsigned int sc_reg)
 {
-       unsigned long offset = ap->ioaddr.scr_addr;
+       void __iomem *offset = ap->ioaddr.scr_addr;
 
        switch (sc_reg) {
        case SCR_STATUS:
@@ -341,7 +344,7 @@ static inline unsigned long sil_scr_addr(struct ata_port *ap, unsigned int sc_re
 
 static u32 sil_scr_read (struct ata_port *ap, unsigned int sc_reg)
 {
-       void __iomem *mmio = (void __iomem *) sil_scr_addr(ap, sc_reg);
+       void __iomem *mmio = sil_scr_addr(ap, sc_reg);
        if (mmio)
                return readl(mmio);
        return 0xffffffffU;
@@ -349,7 +352,7 @@ static u32 sil_scr_read (struct ata_port *ap, unsigned int sc_reg)
 
 static void sil_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
 {
-       void __iomem *mmio = (void __iomem *) sil_scr_addr(ap, sc_reg);
+       void __iomem *mmio = sil_scr_addr(ap, sc_reg);
        if (mmio)
                writel(val, mmio);
 }
@@ -444,7 +447,7 @@ static void sil_host_intr(struct ata_port *ap, u32 bmdma2)
 static irqreturn_t sil_interrupt(int irq, void *dev_instance)
 {
        struct ata_host *host = dev_instance;
-       void __iomem *mmio_base = host->mmio_base;
+       void __iomem *mmio_base = host->iomap[SIL_MMIO_BAR];
        int handled = 0;
        int i;
 
@@ -476,7 +479,7 @@ static irqreturn_t sil_interrupt(int irq, void *dev_instance)
 
 static void sil_freeze(struct ata_port *ap)
 {
-       void __iomem *mmio_base = ap->host->mmio_base;
+       void __iomem *mmio_base = ap->host->iomap[SIL_MMIO_BAR];
        u32 tmp;
 
        /* global IRQ mask doesn't block SATA IRQ, turn off explicitly */
@@ -491,7 +494,7 @@ static void sil_freeze(struct ata_port *ap)
 
 static void sil_thaw(struct ata_port *ap)
 {
-       void __iomem *mmio_base = ap->host->mmio_base;
+       void __iomem *mmio_base = ap->host->iomap[SIL_MMIO_BAR];
        u32 tmp;
 
        /* clear IRQ */
@@ -541,9 +544,9 @@ static void sil_dev_config(struct ata_port *ap, struct ata_device *dev)
 {
        int print_info = ap->eh_context.i.flags & ATA_EHI_PRINTINFO;
        unsigned int n, quirks = 0;
-       unsigned char model_num[41];
+       unsigned char model_num[ATA_ID_PROD_LEN + 1];
 
-       ata_id_c_string(dev->id, model_num, ATA_ID_PROD_OFS, sizeof(model_num));
+       ata_id_c_string(dev->id, model_num, ATA_ID_PROD, sizeof(model_num));
 
        for (n = 0; sil_blacklist[n].product; n++)
                if (!strcmp(sil_blacklist[n].product, model_num)) {
@@ -621,38 +624,35 @@ static void sil_init_controller(struct pci_dev *pdev,
 static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version;
-       struct ata_probe_ent *probe_ent = NULL;
-       unsigned long base;
+       struct device *dev = &pdev->dev;
+       struct ata_probe_ent *probe_ent;
        void __iomem *mmio_base;
        int rc;
        unsigned int i;
-       int pci_dev_busy = 0;
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
-       rc = pci_request_regions(pdev, DRV_NAME);
-       if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
-       }
+       rc = pcim_iomap_regions(pdev, 1 << SIL_MMIO_BAR, DRV_NAME);
+       if (rc == -EBUSY)
+               pcim_pin_device(pdev);
+       if (rc)
+               return rc;
 
        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
-       probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       probe_ent = devm_kzalloc(dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
        INIT_LIST_HEAD(&probe_ent->node);
        probe_ent->dev = pci_dev_to_dev(pdev);
@@ -666,22 +666,16 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                probe_ent->irq_flags = IRQF_SHARED;
        probe_ent->port_flags = sil_port_info[ent->driver_data].flags;
 
-       mmio_base = pci_iomap(pdev, 5, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
-
-       probe_ent->mmio_base = mmio_base;
+       probe_ent->iomap = pcim_iomap_table(pdev);
 
-       base = (unsigned long) mmio_base;
+       mmio_base = probe_ent->iomap[SIL_MMIO_BAR];
 
        for (i = 0; i < probe_ent->n_ports; i++) {
-               probe_ent->port[i].cmd_addr = base + sil_port[i].tf;
+               probe_ent->port[i].cmd_addr = mmio_base + sil_port[i].tf;
                probe_ent->port[i].altstatus_addr =
-               probe_ent->port[i].ctl_addr = base + sil_port[i].ctl;
-               probe_ent->port[i].bmdma_addr = base + sil_port[i].bmdma;
-               probe_ent->port[i].scr_addr = base + sil_port[i].scr;
+               probe_ent->port[i].ctl_addr = mmio_base + sil_port[i].ctl;
+               probe_ent->port[i].bmdma_addr = mmio_base + sil_port[i].bmdma;
+               probe_ent->port[i].scr_addr = mmio_base + sil_port[i].scr;
                ata_std_ports(&probe_ent->port[i]);
        }
 
@@ -690,30 +684,25 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 
        pci_set_master(pdev);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
-       kfree(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
+       devm_kfree(dev, probe_ent);
        return 0;
-
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
 }
 
 #ifdef CONFIG_PM
 static int sil_pci_device_resume(struct pci_dev *pdev)
 {
        struct ata_host *host = dev_get_drvdata(&pdev->dev);
+       int rc;
+
+       rc = ata_pci_device_do_resume(pdev);
+       if (rc)
+               return rc;
 
-       ata_pci_device_do_resume(pdev);
        sil_init_controller(pdev, host->n_ports, host->ports[0]->flags,
-                           host->mmio_base);
+                           host->iomap[SIL_MMIO_BAR]);
        ata_host_resume(host);
 
        return 0;
index 5aa288d2fb867fb2130a0ced4b599cb61f0afeaa..e65e8d55da3e9b36dea407bc6993b724a8ebf1db 100644 (file)
@@ -28,7 +28,6 @@
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_cmnd.h>
 #include <linux/libata.h>
-#include <asm/io.h>
 
 #define DRV_NAME       "sata_sil24"
 #define DRV_VERSION    "0.3"
@@ -61,6 +60,9 @@ struct sil24_port_multiplier {
 };
 
 enum {
+       SIL24_HOST_BAR          = 0,
+       SIL24_PORT_BAR          = 2,
+
        /*
         * Global controller registers (128 bytes @ BAR0)
         */
@@ -321,12 +323,6 @@ struct sil24_port_priv {
        struct ata_taskfile tf;                 /* Cached taskfile registers */
 };
 
-/* ap->host->private_data */
-struct sil24_host_priv {
-       void __iomem *host_base;        /* global controller control (128 bytes @BAR0) */
-       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);
@@ -341,8 +337,6 @@ static void sil24_thaw(struct ata_port *ap);
 static void sil24_error_handler(struct ata_port *ap);
 static void sil24_post_internal_cmd(struct ata_queued_cmd *qc);
 static int sil24_port_start(struct ata_port *ap);
-static void sil24_port_stop(struct ata_port *ap);
-static void sil24_host_stop(struct ata_host *host);
 static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
 #ifdef CONFIG_PM
 static int sil24_pci_device_resume(struct pci_dev *pdev);
@@ -362,7 +356,7 @@ static struct pci_driver sil24_pci_driver = {
        .name                   = DRV_NAME,
        .id_table               = sil24_pci_tbl,
        .probe                  = sil24_init_one,
-       .remove                 = ata_pci_remove_one, /* safe? */
+       .remove                 = ata_pci_remove_one,
 #ifdef CONFIG_PM
        .suspend                = ata_pci_device_suspend,
        .resume                 = sil24_pci_device_resume,
@@ -406,6 +400,8 @@ static const struct ata_port_operations sil24_ops = {
 
        .irq_handler            = sil24_interrupt,
        .irq_clear              = sil24_irq_clear,
+       .irq_on                 = ata_dummy_irq_on,
+       .irq_ack                = ata_dummy_irq_ack,
 
        .scr_read               = sil24_scr_read,
        .scr_write              = sil24_scr_write,
@@ -416,8 +412,6 @@ static const struct ata_port_operations sil24_ops = {
        .post_internal_cmd      = sil24_post_internal_cmd,
 
        .port_start             = sil24_port_start,
-       .port_stop              = sil24_port_stop,
-       .host_stop              = sil24_host_stop,
 };
 
 /*
@@ -467,7 +461,7 @@ static int sil24_tag(int tag)
 
 static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev)
 {
-       void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr;
+       void __iomem *port = ap->ioaddr.cmd_addr;
 
        if (dev->cdb_len == 16)
                writel(PORT_CS_CDB16, port + PORT_CTRL_STAT);
@@ -478,7 +472,7 @@ static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev)
 static inline void sil24_update_tf(struct ata_port *ap)
 {
        struct sil24_port_priv *pp = ap->private_data;
-       void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr;
+       void __iomem *port = ap->ioaddr.cmd_addr;
        struct sil24_prb __iomem *prb = port;
        u8 fis[6 * 4];
 
@@ -501,7 +495,7 @@ static int sil24_scr_map[] = {
 
 static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg)
 {
-       void __iomem *scr_addr = (void __iomem *)ap->ioaddr.scr_addr;
+       void __iomem *scr_addr = ap->ioaddr.scr_addr;
        if (sc_reg < ARRAY_SIZE(sil24_scr_map)) {
                void __iomem *addr;
                addr = scr_addr + sil24_scr_map[sc_reg] * 4;
@@ -512,7 +506,7 @@ 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)
 {
-       void __iomem *scr_addr = (void __iomem *)ap->ioaddr.scr_addr;
+       void __iomem *scr_addr = ap->ioaddr.scr_addr;
        if (sc_reg < ARRAY_SIZE(sil24_scr_map)) {
                void __iomem *addr;
                addr = scr_addr + sil24_scr_map[sc_reg] * 4;
@@ -528,7 +522,7 @@ static void sil24_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
 
 static int sil24_init_port(struct ata_port *ap)
 {
-       void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr;
+       void __iomem *port = ap->ioaddr.cmd_addr;
        u32 tmp;
 
        writel(PORT_CS_INIT, port + PORT_CTRL_STAT);
@@ -544,7 +538,7 @@ static int sil24_init_port(struct ata_port *ap)
 
 static int sil24_softreset(struct ata_port *ap, unsigned int *class)
 {
-       void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr;
+       void __iomem *port = 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;
@@ -604,7 +598,7 @@ static int sil24_softreset(struct ata_port *ap, unsigned int *class)
 
 static int sil24_hardreset(struct ata_port *ap, unsigned int *class)
 {
-       void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr;
+       void __iomem *port = ap->ioaddr.cmd_addr;
        const char *reason;
        int tout_msec, rc;
        u32 tmp;
@@ -721,7 +715,7 @@ static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
        struct sil24_port_priv *pp = ap->private_data;
-       void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr;
+       void __iomem *port = ap->ioaddr.cmd_addr;
        unsigned int tag = sil24_tag(qc->tag);
        dma_addr_t paddr;
        void __iomem *activate;
@@ -742,7 +736,7 @@ static void sil24_irq_clear(struct ata_port *ap)
 
 static void sil24_freeze(struct ata_port *ap)
 {
-       void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr;
+       void __iomem *port = ap->ioaddr.cmd_addr;
 
        /* Port-wide IRQ mask in HOST_CTRL doesn't really work, clear
         * PORT_IRQ_ENABLE instead.
@@ -752,7 +746,7 @@ static void sil24_freeze(struct ata_port *ap)
 
 static void sil24_thaw(struct ata_port *ap)
 {
-       void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr;
+       void __iomem *port = ap->ioaddr.cmd_addr;
        u32 tmp;
 
        /* clear IRQ */
@@ -765,7 +759,7 @@ static void sil24_thaw(struct ata_port *ap)
 
 static void sil24_error_intr(struct ata_port *ap)
 {
-       void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr;
+       void __iomem *port = ap->ioaddr.cmd_addr;
        struct ata_eh_info *ehi = &ap->eh_info;
        int freeze = 0;
        u32 irq_stat;
@@ -843,7 +837,7 @@ static void sil24_finish_qc(struct ata_queued_cmd *qc)
 
 static inline void sil24_host_intr(struct ata_port *ap)
 {
-       void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr;
+       void __iomem *port = ap->ioaddr.cmd_addr;
        u32 slot_stat, qc_active;
        int rc;
 
@@ -878,12 +872,12 @@ static inline void sil24_host_intr(struct ata_port *ap)
 static irqreturn_t sil24_interrupt(int irq, void *dev_instance)
 {
        struct ata_host *host = dev_instance;
-       struct sil24_host_priv *hpriv = host->private_data;
+       void __iomem *host_base = host->iomap[SIL24_HOST_BAR];
        unsigned handled = 0;
        u32 status;
        int i;
 
-       status = readl(hpriv->host_base + HOST_IRQ_STAT);
+       status = readl(host_base + HOST_IRQ_STAT);
 
        if (status == 0xffffffff) {
                printk(KERN_ERR DRV_NAME ": IRQ status == 0xffffffff, "
@@ -938,13 +932,6 @@ static void sil24_post_internal_cmd(struct ata_queued_cmd *qc)
                sil24_init_port(ap);
 }
 
-static inline void sil24_cblk_free(struct sil24_port_priv *pp, struct device *dev)
-{
-       const size_t cb_size = sizeof(*pp->cmd_block) * SIL24_MAX_CMDS;
-
-       dma_free_coherent(dev, cb_size, pp->cmd_block, pp->cmd_block_dma);
-}
-
 static int sil24_port_start(struct ata_port *ap)
 {
        struct device *dev = ap->host->dev;
@@ -952,22 +939,22 @@ static int sil24_port_start(struct ata_port *ap)
        union sil24_cmd_block *cb;
        size_t cb_size = sizeof(*cb) * SIL24_MAX_CMDS;
        dma_addr_t cb_dma;
-       int rc = -ENOMEM;
+       int rc;
 
-       pp = kzalloc(sizeof(*pp), GFP_KERNEL);
+       pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
        if (!pp)
-               goto err_out;
+               return -ENOMEM;
 
        pp->tf.command = ATA_DRDY;
 
-       cb = dma_alloc_coherent(dev, cb_size, &cb_dma, GFP_KERNEL);
+       cb = dmam_alloc_coherent(dev, cb_size, &cb_dma, GFP_KERNEL);
        if (!cb)
-               goto err_out_pp;
+               return -ENOMEM;
        memset(cb, 0, cb_size);
 
        rc = ata_pad_alloc(ap, dev);
        if (rc)
-               goto err_out_pad;
+               return rc;
 
        pp->cmd_block = cb;
        pp->cmd_block_dma = cb_dma;
@@ -975,33 +962,6 @@ static int sil24_port_start(struct ata_port *ap)
        ap->private_data = pp;
 
        return 0;
-
-err_out_pad:
-       sil24_cblk_free(pp, dev);
-err_out_pp:
-       kfree(pp);
-err_out:
-       return rc;
-}
-
-static void sil24_port_stop(struct ata_port *ap)
-{
-       struct device *dev = ap->host->dev;
-       struct sil24_port_priv *pp = ap->private_data;
-
-       sil24_cblk_free(pp, dev);
-       ata_pad_free(ap, dev);
-       kfree(pp);
-}
-
-static void sil24_host_stop(struct ata_host *host)
-{
-       struct sil24_host_priv *hpriv = host->private_data;
-       struct pci_dev *pdev = to_pci_dev(host->dev);
-
-       pci_iounmap(pdev, hpriv->host_base);
-       pci_iounmap(pdev, hpriv->port_base);
-       kfree(hpriv);
 }
 
 static void sil24_init_controller(struct pci_dev *pdev, int n_ports,
@@ -1066,43 +1026,32 @@ static void sil24_init_controller(struct pci_dev *pdev, int n_ports,
 static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version = 0;
+       struct device *dev = &pdev->dev;
        unsigned int board_id = (unsigned int)ent->driver_data;
        struct ata_port_info *pinfo = &sil24_port_info[board_id];
-       struct ata_probe_ent *probe_ent = NULL;
-       struct sil24_host_priv *hpriv = NULL;
-       void __iomem *host_base = NULL;
-       void __iomem *port_base = NULL;
+       struct ata_probe_ent *probe_ent;
+       void __iomem *host_base;
+       void __iomem *port_base;
        int i, rc;
        u32 tmp;
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
-       rc = pci_request_regions(pdev, DRV_NAME);
+       rc = pcim_iomap_regions(pdev,
+                               (1 << SIL24_HOST_BAR) | (1 << SIL24_PORT_BAR),
+                               DRV_NAME);
        if (rc)
-               goto out_disable;
-
-       rc = -ENOMEM;
-       /* map mmio registers */
-       host_base = pci_iomap(pdev, 0, 0);
-       if (!host_base)
-               goto out_free;
-       port_base = pci_iomap(pdev, 2, 0);
-       if (!port_base)
-               goto out_free;
-
-       /* allocate & init probe_ent and hpriv */
-       probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (!probe_ent)
-               goto out_free;
+               return rc;
 
-       hpriv = kzalloc(sizeof(*hpriv), GFP_KERNEL);
-       if (!hpriv)
-               goto out_free;
+       /* allocate & init probe_ent */
+       probe_ent = devm_kzalloc(dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (!probe_ent)
+               return -ENOMEM;
 
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
@@ -1117,10 +1066,10 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        probe_ent->irq = pdev->irq;
        probe_ent->irq_flags = IRQF_SHARED;
-       probe_ent->private_data = hpriv;
+       probe_ent->iomap = pcim_iomap_table(pdev);
 
-       hpriv->host_base = host_base;
-       hpriv->port_base = port_base;
+       host_base = probe_ent->iomap[SIL24_HOST_BAR];
+       port_base = probe_ent->iomap[SIL24_PORT_BAR];
 
        /*
         * Configure the device
@@ -1132,7 +1081,7 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                        if (rc) {
                                dev_printk(KERN_ERR, &pdev->dev,
                                           "64-bit DMA enable failed\n");
-                               goto out_free;
+                               return rc;
                        }
                }
        } else {
@@ -1140,13 +1089,13 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                if (rc) {
                        dev_printk(KERN_ERR, &pdev->dev,
                                   "32-bit DMA enable failed\n");
-                       goto out_free;
+                       return rc;
                }
                rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
                if (rc) {
                        dev_printk(KERN_ERR, &pdev->dev,
                                   "32-bit consistent DMA enable failed\n");
-                       goto out_free;
+                       return rc;
                }
        }
 
@@ -1162,11 +1111,10 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        for (i = 0; i < probe_ent->n_ports; i++) {
-               unsigned long portu =
-                       (unsigned long)port_base + i * PORT_REGS_SIZE;
+               void __iomem *port = port_base + i * PORT_REGS_SIZE;
 
-               probe_ent->port[i].cmd_addr = portu;
-               probe_ent->port[i].scr_addr = portu + PORT_SCONTROL;
+               probe_ent->port[i].cmd_addr = port;
+               probe_ent->port[i].scr_addr = port + PORT_SCONTROL;
 
                ata_std_ports(&probe_ent->port[i]);
        }
@@ -1176,38 +1124,30 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        pci_set_master(pdev);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
-       kfree(probe_ent);
+       devm_kfree(dev, probe_ent);
        return 0;
-
- out_free:
-       if (host_base)
-               pci_iounmap(pdev, host_base);
-       if (port_base)
-               pci_iounmap(pdev, port_base);
-       kfree(probe_ent);
-       kfree(hpriv);
-       pci_release_regions(pdev);
- out_disable:
-       pci_disable_device(pdev);
-       return rc;
 }
 
 #ifdef CONFIG_PM
 static int sil24_pci_device_resume(struct pci_dev *pdev)
 {
        struct ata_host *host = dev_get_drvdata(&pdev->dev);
-       struct sil24_host_priv *hpriv = host->private_data;
+       void __iomem *host_base = host->iomap[SIL24_HOST_BAR];
+       void __iomem *port_base = host->iomap[SIL24_PORT_BAR];
+       int rc;
 
-       ata_pci_device_do_resume(pdev);
+       rc = ata_pci_device_do_resume(pdev);
+       if (rc)
+               return rc;
 
        if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND)
-               writel(HOST_CTRL_GLOBAL_RST, hpriv->host_base + HOST_CTRL);
+               writel(HOST_CTRL_GLOBAL_RST, host_base + HOST_CTRL);
 
        sil24_init_controller(pdev, host->n_ports, host->ports[0]->flags,
-                             hpriv->host_base, hpriv->port_base);
+                             host_base, port_base);
 
        ata_host_resume(host);
 
index 9c25a1e91730c19578c624a01e953c617c24e808..49c9e2bd706f9ad1f9367f78d481c1fb8139f668 100644 (file)
 #include <linux/device.h>
 #include <scsi/scsi_host.h>
 #include <linux/libata.h>
+#include "libata.h"
 
+#undef DRV_NAME                /* already defined in libata.h, for libata-core */
 #define DRV_NAME       "sata_sis"
-#define DRV_VERSION    "0.6"
+#define DRV_VERSION    "0.7"
 
 enum {
        sis_180                 = 0,
@@ -67,9 +69,12 @@ 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 const struct pci_device_id sis_pci_tbl[] = {
-       { PCI_VDEVICE(SI, 0x180), sis_180 },
-       { PCI_VDEVICE(SI, 0x181), sis_180 },
-       { PCI_VDEVICE(SI, 0x182), sis_180 },
+       { PCI_VDEVICE(SI, 0x0180), sis_180 },           /* SiS 964/180 */
+       { PCI_VDEVICE(SI, 0x0181), sis_180 },           /* SiS 964/180 */
+       { PCI_VDEVICE(SI, 0x0182), sis_180 },           /* SiS 965/965L */
+       { PCI_VDEVICE(SI, 0x0183), sis_180 },           /* SiS 965/965L */
+       { PCI_VDEVICE(SI, 0x1182), sis_180 },           /* SiS 966/966L */
+       { PCI_VDEVICE(SI, 0x1183), sis_180 },           /* SiS 966/966L */
 
        { }     /* terminate list */
 };
@@ -112,18 +117,18 @@ static const struct ata_port_operations sis_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
        .freeze                 = ata_bmdma_freeze,
        .thaw                   = ata_bmdma_thaw,
        .error_handler          = ata_bmdma_error_handler,
        .post_internal_cmd      = ata_bmdma_post_internal_cmd,
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
        .scr_read               = sis_scr_read,
        .scr_write              = sis_scr_write,
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static struct ata_port_info sis_port_info = {
@@ -135,31 +140,42 @@ static struct ata_port_info sis_port_info = {
        .port_ops       = &sis_ops,
 };
 
-
 MODULE_AUTHOR("Uwe Koziolek");
 MODULE_DESCRIPTION("low-level driver for Silicon Integratad Systems SATA controller");
 MODULE_LICENSE("GPL");
 MODULE_DEVICE_TABLE(pci, sis_pci_tbl);
 MODULE_VERSION(DRV_VERSION);
 
-static unsigned int get_scr_cfg_addr(unsigned int port_no, unsigned int sc_reg, int device)
+static unsigned int get_scr_cfg_addr(struct ata_port *ap, unsigned int sc_reg)
 {
+       struct pci_dev *pdev = to_pci_dev(ap->host->dev);
        unsigned int addr = SIS_SCR_BASE + (4 * sc_reg);
+       u8 pmr;
 
-       if (port_no)  {
-               if (device == 0x182)
-                       addr += SIS182_SATA1_OFS;
-               else
-                       addr += SIS180_SATA1_OFS;
+       if (ap->port_no)  {
+               switch (pdev->device) {
+                       case 0x0180:
+                       case 0x0181:
+                               pci_read_config_byte(pdev, SIS_PMR, &pmr);
+                               if ((pmr & SIS_PMR_COMBINED) == 0)
+                                       addr += SIS180_SATA1_OFS;
+                               break;
+
+                       case 0x0182:
+                       case 0x0183:
+                       case 0x1182:
+                       case 0x1183:
+                               addr += SIS182_SATA1_OFS;
+                               break;
+               }
        }
-
        return addr;
 }
 
 static u32 sis_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg)
 {
        struct pci_dev *pdev = to_pci_dev(ap->host->dev);
-       unsigned int cfg_addr = get_scr_cfg_addr(ap->port_no, sc_reg, pdev->device);
+       unsigned int cfg_addr = get_scr_cfg_addr(ap, sc_reg);
        u32 val, val2 = 0;
        u8 pmr;
 
@@ -170,26 +186,28 @@ static u32 sis_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg)
 
        pci_read_config_dword(pdev, cfg_addr, &val);
 
-       if ((pdev->device == 0x182) || (pmr & SIS_PMR_COMBINED))
+       if ((pdev->device == 0x0182) || (pdev->device == 0x0183) || (pdev->device == 0x1182) ||
+           (pdev->device == 0x1183) || (pmr & SIS_PMR_COMBINED))
                pci_read_config_dword(pdev, cfg_addr+0x10, &val2);
 
        return (val|val2) &  0xfffffffb; /* avoid problems with powerdowned ports */
 }
 
-static void sis_scr_cfg_write (struct ata_port *ap, unsigned int scr, u32 val)
+static void sis_scr_cfg_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
 {
        struct pci_dev *pdev = to_pci_dev(ap->host->dev);
-       unsigned int cfg_addr = get_scr_cfg_addr(ap->port_no, scr, pdev->device);
+       unsigned int cfg_addr = get_scr_cfg_addr(ap, sc_reg);
        u8 pmr;
 
-       if (scr == SCR_ERROR) /* doesn't exist in PCI cfg space */
+       if (sc_reg == SCR_ERROR) /* doesn't exist in PCI cfg space */
                return;
 
        pci_read_config_byte(pdev, SIS_PMR, &pmr);
 
        pci_write_config_dword(pdev, cfg_addr, val);
 
-       if ((pdev->device == 0x182) || (pmr & SIS_PMR_COMBINED))
+       if ((pdev->device == 0x0182) || (pdev->device == 0x0183) || (pdev->device == 0x1182) ||
+           (pdev->device == 0x1183) || (pmr & SIS_PMR_COMBINED))
                pci_write_config_dword(pdev, cfg_addr+0x10, val);
 }
 
@@ -207,10 +225,11 @@ static u32 sis_scr_read (struct ata_port *ap, unsigned int sc_reg)
 
        pci_read_config_byte(pdev, SIS_PMR, &pmr);
 
-       val = inl(ap->ioaddr.scr_addr + (sc_reg * 4));
+       val = ioread32(ap->ioaddr.scr_addr + (sc_reg * 4));
 
-       if ((pdev->device == 0x182) || (pmr & SIS_PMR_COMBINED))
-               val2 = inl(ap->ioaddr.scr_addr + (sc_reg * 4) + 0x10);
+       if ((pdev->device == 0x0182) || (pdev->device == 0x0183) || (pdev->device == 0x1182) ||
+           (pdev->device == 0x1183) || (pmr & SIS_PMR_COMBINED))
+               val2 = ioread32(ap->ioaddr.scr_addr + (sc_reg * 4) + 0x10);
 
        return (val | val2) &  0xfffffffb;
 }
@@ -228,9 +247,10 @@ static void sis_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
        if (ap->flags & SIS_FLAG_CFGSCR)
                sis_scr_cfg_write(ap, sc_reg, val);
        else {
-               outl(val, ap->ioaddr.scr_addr + (sc_reg * 4));
-               if ((pdev->device == 0x182) || (pmr & SIS_PMR_COMBINED))
-                       outl(val, ap->ioaddr.scr_addr + (sc_reg * 4)+0x10);
+               iowrite32(val, ap->ioaddr.scr_addr + (sc_reg * 4));
+               if ((pdev->device == 0x0182) || (pdev->device == 0x0183) || (pdev->device == 0x1182) ||
+                   (pdev->device == 0x1183) || (pmr & SIS_PMR_COMBINED))
+                       iowrite32(val, ap->ioaddr.scr_addr + (sc_reg * 4)+0x10);
        }
 }
 
@@ -241,29 +261,28 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        int rc;
        u32 genctl, val;
        struct ata_port_info pi = sis_port_info, *ppi[2] = { &pi, &pi };
-       int pci_dev_busy = 0;
        u8 pmr;
-       u8 port2_start;
+       u8 port2_start = 0x20;
 
        if (!printed_version++)
                dev_printk(KERN_INFO, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
+               pcim_pin_device(pdev);
+               return rc;
        }
 
        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
        /* check and see if the SCRs are in IO space or PCI cfg space */
        pci_read_config_dword(pdev, SIS_GENCTL, &genctl);
@@ -282,60 +301,79 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        pci_read_config_byte(pdev, SIS_PMR, &pmr);
-       if (ent->device != 0x182) {
+       switch (ent->device) {
+       case 0x0180:
+       case 0x0181:
+
+               /* The PATA-handling is provided by pata_sis */
+               switch (pmr & 0x30) {
+               case 0x10:
+                       ppi[1] = &sis_info133;
+                       break;
+                       
+               case 0x30:
+                       ppi[0] = &sis_info133;
+                       break;
+               }
                if ((pmr & SIS_PMR_COMBINED) == 0) {
                        dev_printk(KERN_INFO, &pdev->dev,
                                   "Detected SiS 180/181/964 chipset in SATA mode\n");
                        port2_start = 64;
-               }
-               else {
+               } else {
                        dev_printk(KERN_INFO, &pdev->dev,
                                   "Detected SiS 180/181 chipset in combined mode\n");
                        port2_start=0;
                        pi.flags |= ATA_FLAG_SLAVE_POSS;
                }
-       }
-       else {
+               break;
+
+       case 0x0182:
+       case 0x0183:
                pci_read_config_dword ( pdev, 0x6C, &val);
                if (val & (1L << 31)) {
                        dev_printk(KERN_INFO, &pdev->dev, "Detected SiS 182/965 chipset\n");
                        pi.flags |= ATA_FLAG_SLAVE_POSS;
-               }
-               else
+               } else {
                        dev_printk(KERN_INFO, &pdev->dev, "Detected SiS 182/965L chipset\n");
-               port2_start = 0x20;
+               }
+               break;
+
+       case 0x1182:
+       case 0x1183:
+               pci_read_config_dword(pdev, 0x64, &val);
+               if (val & 0x10000000) {
+                       dev_printk(KERN_INFO, &pdev->dev, "Detected SiS 1182/1183/966L SATA controller\n");
+               } else {
+                       dev_printk(KERN_INFO, &pdev->dev, "Detected SiS 1182/1183/966 SATA controller\n");
+                       pi.flags |= ATA_FLAG_SLAVE_POSS;
+               }
+               break;
        }
 
        probe_ent = ata_pci_init_native_mode(pdev, ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY);
-       if (!probe_ent) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       if (!probe_ent)
+               return -ENOMEM;
 
        if (!(probe_ent->port_flags & SIS_FLAG_CFGSCR)) {
-               probe_ent->port[0].scr_addr =
-                       pci_resource_start(pdev, SIS_SCR_PCI_BAR);
-               probe_ent->port[1].scr_addr =
-                       pci_resource_start(pdev, SIS_SCR_PCI_BAR) + port2_start;
+               void *mmio;
+
+               mmio = pcim_iomap(pdev, SIS_SCR_PCI_BAR, 0);
+               if (!mmio)
+                       return -ENOMEM;
+
+               probe_ent->port[0].scr_addr = mmio;
+               probe_ent->port[1].scr_addr = mmio + port2_start;
        }
 
        pci_set_master(pdev);
        pci_intx(pdev, 1);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
-       kfree(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -EIO;
 
+       devm_kfree(&pdev->dev, probe_ent);
        return 0;
 
-err_out_regions:
-       pci_release_regions(pdev);
-
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
-
 }
 
 static int __init sis_init(void)
@@ -350,4 +388,3 @@ static void __exit sis_exit(void)
 
 module_init(sis_init);
 module_exit(sis_exit);
-
index 5f4e82ade6cda60ad991df3531953e1c6d4a5aae..4e4289994204ea0409c982ae66cc15a9862051fd 100644 (file)
@@ -135,31 +135,31 @@ static void k2_sata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
        unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR;
 
        if (tf->ctl != ap->last_ctl) {
-               writeb(tf->ctl, (void __iomem *) ioaddr->ctl_addr);
+               writeb(tf->ctl, ioaddr->ctl_addr);
                ap->last_ctl = tf->ctl;
                ata_wait_idle(ap);
        }
        if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) {
                writew(tf->feature | (((u16)tf->hob_feature) << 8),
-                      (void __iomem *) ioaddr->feature_addr);
+                      ioaddr->feature_addr);
                writew(tf->nsect | (((u16)tf->hob_nsect) << 8),
-                      (void __iomem *) ioaddr->nsect_addr);
+                      ioaddr->nsect_addr);
                writew(tf->lbal | (((u16)tf->hob_lbal) << 8),
-                      (void __iomem *) ioaddr->lbal_addr);
+                      ioaddr->lbal_addr);
                writew(tf->lbam | (((u16)tf->hob_lbam) << 8),
-                      (void __iomem *) ioaddr->lbam_addr);
+                      ioaddr->lbam_addr);
                writew(tf->lbah | (((u16)tf->hob_lbah) << 8),
-                      (void __iomem *) ioaddr->lbah_addr);
+                      ioaddr->lbah_addr);
        } else if (is_addr) {
-               writew(tf->feature, (void __iomem *) ioaddr->feature_addr);
-               writew(tf->nsect, (void __iomem *) ioaddr->nsect_addr);
-               writew(tf->lbal, (void __iomem *) ioaddr->lbal_addr);
-               writew(tf->lbam, (void __iomem *) ioaddr->lbam_addr);
-               writew(tf->lbah, (void __iomem *) ioaddr->lbah_addr);
+               writew(tf->feature, ioaddr->feature_addr);
+               writew(tf->nsect, ioaddr->nsect_addr);
+               writew(tf->lbal, ioaddr->lbal_addr);
+               writew(tf->lbam, ioaddr->lbam_addr);
+               writew(tf->lbah, ioaddr->lbah_addr);
        }
 
        if (tf->flags & ATA_TFLAG_DEVICE)
-               writeb(tf->device, (void __iomem *) ioaddr->device_addr);
+               writeb(tf->device, ioaddr->device_addr);
 
        ata_wait_idle(ap);
 }
@@ -171,12 +171,12 @@ static void k2_sata_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
        u16 nsect, lbal, lbam, lbah, feature;
 
        tf->command = k2_stat_check_status(ap);
-       tf->device = readw((void __iomem *)ioaddr->device_addr);
-       feature = readw((void __iomem *)ioaddr->error_addr);
-       nsect = readw((void __iomem *)ioaddr->nsect_addr);
-       lbal = readw((void __iomem *)ioaddr->lbal_addr);
-       lbam = readw((void __iomem *)ioaddr->lbam_addr);
-       lbah = readw((void __iomem *)ioaddr->lbah_addr);
+       tf->device = readw(ioaddr->device_addr);
+       feature = readw(ioaddr->error_addr);
+       nsect = readw(ioaddr->nsect_addr);
+       lbal = readw(ioaddr->lbal_addr);
+       lbam = readw(ioaddr->lbam_addr);
+       lbah = readw(ioaddr->lbah_addr);
 
        tf->feature = feature;
        tf->nsect = nsect;
@@ -349,21 +349,21 @@ static const struct ata_port_operations k2_sata_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_mmio_data_xfer,
+       .data_xfer              = ata_data_xfer,
        .freeze                 = ata_bmdma_freeze,
        .thaw                   = ata_bmdma_thaw,
        .error_handler          = ata_bmdma_error_handler,
        .post_internal_cmd      = ata_bmdma_post_internal_cmd,
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
        .scr_read               = k2_sata_scr_read,
        .scr_write              = k2_sata_scr_write,
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_pci_host_stop,
 };
 
-static void k2_sata_setup_port(struct ata_ioports *port, unsigned long base)
+static void k2_sata_setup_port(struct ata_ioports *port, void __iomem *base)
 {
        port->cmd_addr          = base + K2_SATA_TF_CMD_OFFSET;
        port->data_addr         = base + K2_SATA_TF_DATA_OFFSET;
@@ -386,12 +386,11 @@ static void k2_sata_setup_port(struct ata_ioports *port, unsigned long base)
 static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version;
-       struct ata_probe_ent *probe_ent = NULL;
-       unsigned long base;
+       struct device *dev = &pdev->dev;
+       struct ata_probe_ent *probe_ent;
        void __iomem *mmio_base;
        const struct k2_board_info *board_info =
                        &k2_board_info[ent->driver_data];
-       int pci_dev_busy = 0;
        int rc;
        int i;
 
@@ -402,7 +401,7 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
         * If this driver happens to only be useful on Apple's K2, then
         * we should check that here as it has a normal Serverworks ID
         */
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
        /*
@@ -412,48 +411,27 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
        if (pci_resource_len(pdev, 5) == 0)
                return -ENODEV;
 
-       /* Request PCI regions */
-       rc = pci_request_regions(pdev, DRV_NAME);
-       if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
-       }
+       /* Request and iomap PCI regions */
+       rc = pcim_iomap_regions(pdev, 1 << 5, DRV_NAME);
+       if (rc == -EBUSY)
+               pcim_pin_device(pdev);
+       if (rc)
+               return rc;
 
        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
-       probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       probe_ent = devm_kzalloc(dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
-       memset(probe_ent, 0, sizeof(*probe_ent));
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
 
-       mmio_base = pci_iomap(pdev, 5, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
-       base = (unsigned long) mmio_base;
-
-       /* Clear a magic bit in SCR1 according to Darwin, those help
-        * some funky seagate drives (though so far, those were already
-        * set by the firmware on the machines I had access to)
-        */
-       writel(readl(mmio_base + K2_SATA_SICR1_OFFSET) & ~0x00040000,
-              mmio_base + K2_SATA_SICR1_OFFSET);
-
-       /* Clear SATA error & interrupts we don't use */
-       writel(0xffffffff, mmio_base + K2_SATA_SCR_ERROR_OFFSET);
-       writel(0x0, mmio_base + K2_SATA_SIM_OFFSET);
-
        probe_ent->sht = &k2_sata_sht;
        probe_ent->port_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
                                ATA_FLAG_MMIO | board_info->port_flags;
@@ -461,7 +439,7 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
        probe_ent->n_ports = 4;
        probe_ent->irq = pdev->irq;
        probe_ent->irq_flags = IRQF_SHARED;
-       probe_ent->mmio_base = mmio_base;
+       probe_ent->iomap = pcim_iomap_table(pdev);
 
        /* We don't care much about the PIO/UDMA masks, but the core won't like us
         * if we don't fill these
@@ -470,28 +448,33 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
        probe_ent->mwdma_mask = 0x7;
        probe_ent->udma_mask = 0x7f;
 
+       mmio_base = probe_ent->iomap[5];
+
        /* different controllers have different number of ports - currently 4 or 8 */
        /* All ports are on the same function. Multi-function device is no
         * longer available. This should not be seen in any system. */
        for (i = 0; i < board_info->n_ports; i++)
-               k2_sata_setup_port(&probe_ent->port[i], base + i * K2_SATA_PORT_OFFSET);
+               k2_sata_setup_port(&probe_ent->port[i],
+                                  mmio_base + i * K2_SATA_PORT_OFFSET);
+
+       /* Clear a magic bit in SCR1 according to Darwin, those help
+        * some funky seagate drives (though so far, those were already
+        * set by the firmware on the machines I had access to)
+        */
+       writel(readl(mmio_base + K2_SATA_SICR1_OFFSET) & ~0x00040000,
+              mmio_base + K2_SATA_SICR1_OFFSET);
+
+       /* Clear SATA error & interrupts we don't use */
+       writel(0xffffffff, mmio_base + K2_SATA_SCR_ERROR_OFFSET);
+       writel(0x0, mmio_base + K2_SATA_SIM_OFFSET);
 
        pci_set_master(pdev);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
-       kfree(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
+       devm_kfree(dev, probe_ent);
        return 0;
-
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
 }
 
 /* 0x240 is device ID for Apple K2 device
index ae7992de4b08ff44c0b668899ca3f5fce3f2aee2..0ebd77b080d68396b4bc37987b45037004374a8e 100644 (file)
 #include <linux/blkdev.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
-#include <linux/sched.h>
 #include <linux/device.h>
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_cmnd.h>
 #include <linux/libata.h>
-#include <asm/io.h>
 #include "sata_promise.h"
 
 #define DRV_NAME       "sata_sx4"
@@ -50,6 +48,9 @@
 
 
 enum {
+       PDC_MMIO_BAR            = 3,
+       PDC_DIMM_BAR            = 4,
+
        PDC_PRD_TBL             = 0x44, /* Direct command DMA table addr */
 
        PDC_PKT_SUBMIT          = 0x40, /* Command packet pointer addr */
@@ -138,8 +139,6 @@ struct pdc_port_priv {
 };
 
 struct pdc_host_priv {
-       void                    __iomem *dimm_mmio;
-
        unsigned int            doing_hdma;
        unsigned int            hdma_prod;
        unsigned int            hdma_cons;
@@ -156,11 +155,9 @@ static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance);
 static void pdc_eng_timeout(struct ata_port *ap);
 static void pdc_20621_phy_reset (struct ata_port *ap);
 static int pdc_port_start(struct ata_port *ap);
-static void pdc_port_stop(struct ata_port *ap);
 static void pdc20621_qc_prep(struct ata_queued_cmd *qc);
 static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
 static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
-static void pdc20621_host_stop(struct ata_host *host);
 static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe);
 static int pdc20621_detect_dimm(struct ata_probe_ent *pe);
 static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe,
@@ -205,13 +202,13 @@ static const struct ata_port_operations pdc_20621_ops = {
        .phy_reset              = pdc_20621_phy_reset,
        .qc_prep                = pdc20621_qc_prep,
        .qc_issue               = pdc20621_qc_issue_prot,
-       .data_xfer              = ata_mmio_data_xfer,
+       .data_xfer              = ata_data_xfer,
        .eng_timeout            = pdc_eng_timeout,
        .irq_handler            = pdc20621_interrupt,
        .irq_clear              = pdc20621_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
        .port_start             = pdc_port_start,
-       .port_stop              = pdc_port_stop,
-       .host_stop              = pdc20621_host_stop,
 };
 
 static const struct ata_port_info pdc_port_info[] = {
@@ -243,18 +240,6 @@ static struct pci_driver pdc_sata_pci_driver = {
 };
 
 
-static void pdc20621_host_stop(struct ata_host *host)
-{
-       struct pci_dev *pdev = to_pci_dev(host->dev);
-       struct pdc_host_priv *hpriv = host->private_data;
-       void __iomem *dimm_mmio = hpriv->dimm_mmio;
-
-       pci_iounmap(pdev, dimm_mmio);
-       kfree(hpriv);
-
-       pci_iounmap(pdev, host->mmio_base);
-}
-
 static int pdc_port_start(struct ata_port *ap)
 {
        struct device *dev = ap->host->dev;
@@ -265,43 +250,19 @@ static int pdc_port_start(struct ata_port *ap)
        if (rc)
                return rc;
 
-       pp = kmalloc(sizeof(*pp), GFP_KERNEL);
-       if (!pp) {
-               rc = -ENOMEM;
-               goto err_out;
-       }
-       memset(pp, 0, sizeof(*pp));
+       pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
+       if (!pp)
+               return -ENOMEM;
 
-       pp->pkt = dma_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL);
-       if (!pp->pkt) {
-               rc = -ENOMEM;
-               goto err_out_kfree;
-       }
+       pp->pkt = dmam_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL);
+       if (!pp->pkt)
+               return -ENOMEM;
 
        ap->private_data = pp;
 
        return 0;
-
-err_out_kfree:
-       kfree(pp);
-err_out:
-       ata_port_stop(ap);
-       return rc;
-}
-
-
-static void pdc_port_stop(struct ata_port *ap)
-{
-       struct device *dev = ap->host->dev;
-       struct pdc_port_priv *pp = ap->private_data;
-
-       ap->private_data = NULL;
-       dma_free_coherent(dev, 128, pp->pkt, pp->pkt_dma);
-       kfree(pp);
-       ata_port_stop(ap);
 }
 
-
 static void pdc_20621_phy_reset (struct ata_port *ap)
 {
        VPRINTK("ENTER\n");
@@ -452,9 +413,8 @@ static void pdc20621_dma_prep(struct ata_queued_cmd *qc)
        struct scatterlist *sg;
        struct ata_port *ap = qc->ap;
        struct pdc_port_priv *pp = ap->private_data;
-       void __iomem *mmio = ap->host->mmio_base;
-       struct pdc_host_priv *hpriv = ap->host->private_data;
-       void __iomem *dimm_mmio = hpriv->dimm_mmio;
+       void __iomem *mmio = ap->host->iomap[PDC_MMIO_BAR];
+       void __iomem *dimm_mmio = ap->host->iomap[PDC_DIMM_BAR];
        unsigned int portno = ap->port_no;
        unsigned int i, idx, total_len = 0, sgt_len;
        u32 *buf = (u32 *) &pp->dimm_buf[PDC_DIMM_HEADER_SZ];
@@ -513,9 +473,8 @@ static void pdc20621_nodata_prep(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
        struct pdc_port_priv *pp = ap->private_data;
-       void __iomem *mmio = ap->host->mmio_base;
-       struct pdc_host_priv *hpriv = ap->host->private_data;
-       void __iomem *dimm_mmio = hpriv->dimm_mmio;
+       void __iomem *mmio = ap->host->iomap[PDC_MMIO_BAR];
+       void __iomem *dimm_mmio = ap->host->iomap[PDC_DIMM_BAR];
        unsigned int portno = ap->port_no;
        unsigned int i;
 
@@ -565,7 +524,7 @@ static void __pdc20621_push_hdma(struct ata_queued_cmd *qc,
 {
        struct ata_port *ap = qc->ap;
        struct ata_host *host = ap->host;
-       void __iomem *mmio = host->mmio_base;
+       void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
 
        /* hard-code chip #0 */
        mmio += PDC_CHIP0_OFS;
@@ -619,8 +578,7 @@ static void pdc20621_dump_hdma(struct ata_queued_cmd *qc)
 {
        struct ata_port *ap = qc->ap;
        unsigned int port_no = ap->port_no;
-       struct pdc_host_priv *hpriv = ap->host->private_data;
-       void *dimm_mmio = hpriv->dimm_mmio;
+       void __iomem *dimm_mmio = ap->host->iomap[PDC_DIMM_BAR];
 
        dimm_mmio += (port_no * PDC_DIMM_WINDOW_STEP);
        dimm_mmio += PDC_DIMM_HOST_PKT;
@@ -639,7 +597,7 @@ static void pdc20621_packet_start(struct ata_queued_cmd *qc)
        struct ata_port *ap = qc->ap;
        struct ata_host *host = ap->host;
        unsigned int port_no = ap->port_no;
-       void __iomem *mmio = host->mmio_base;
+       void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
        unsigned int rw = (qc->tf.flags & ATA_TFLAG_WRITE);
        u8 seq = (u8) (port_no + 1);
        unsigned int port_ofs;
@@ -668,8 +626,8 @@ static void pdc20621_packet_start(struct ata_queued_cmd *qc)
                readl(mmio + PDC_20621_SEQCTL + (seq * 4));     /* flush */
 
                writel(port_ofs + PDC_DIMM_ATA_PKT,
-                      (void __iomem *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
-               readl((void __iomem *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
+                      ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
+               readl(ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
                VPRINTK("submitted ofs 0x%x (%u), seq %u\n",
                        port_ofs + PDC_DIMM_ATA_PKT,
                        port_ofs + PDC_DIMM_ATA_PKT,
@@ -747,8 +705,8 @@ static inline unsigned int pdc20621_host_intr( struct ata_port *ap,
                        writel(0x00000001, mmio + PDC_20621_SEQCTL + (seq * 4));
                        readl(mmio + PDC_20621_SEQCTL + (seq * 4));
                        writel(port_ofs + PDC_DIMM_ATA_PKT,
-                              (void __iomem *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
-                       readl((void __iomem *) ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
+                              ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
+                       readl(ap->ioaddr.cmd_addr + PDC_PKT_SUBMIT);
                }
 
                /* step two - execute ATA command */
@@ -781,7 +739,7 @@ static inline unsigned int pdc20621_host_intr( struct ata_port *ap,
 static void pdc20621_irq_clear(struct ata_port *ap)
 {
        struct ata_host *host = ap->host;
-       void __iomem *mmio = host->mmio_base;
+       void __iomem *mmio = host->iomap[PDC_MMIO_BAR];
 
        mmio += PDC_CHIP0_OFS;
 
@@ -799,12 +757,12 @@ static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance)
 
        VPRINTK("ENTER\n");
 
-       if (!host || !host->mmio_base) {
+       if (!host || !host->iomap[PDC_MMIO_BAR]) {
                VPRINTK("QUICK EXIT\n");
                return IRQ_NONE;
        }
 
-       mmio_base = host->mmio_base;
+       mmio_base = host->iomap[PDC_MMIO_BAR];
 
        /* reading should also clear interrupts */
        mmio_base += PDC_CHIP0_OFS;
@@ -905,7 +863,7 @@ static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile
 }
 
 
-static void pdc_sata_setup_port(struct ata_ioports *port, unsigned long base)
+static void pdc_sata_setup_port(struct ata_ioports *port, void __iomem *base)
 {
        port->cmd_addr          = base;
        port->data_addr         = base;
@@ -931,9 +889,8 @@ static void pdc20621_get_from_dimm(struct ata_probe_ent *pe, void *psource,
        u16 idx;
        u8 page_mask;
        long dist;
-       void __iomem *mmio = pe->mmio_base;
-       struct pdc_host_priv *hpriv = pe->private_data;
-       void __iomem *dimm_mmio = hpriv->dimm_mmio;
+       void __iomem *mmio = pe->iomap[PDC_MMIO_BAR];
+       void __iomem *dimm_mmio = pe->iomap[PDC_DIMM_BAR];
 
        /* hard-code chip #0 */
        mmio += PDC_CHIP0_OFS;
@@ -987,9 +944,8 @@ static void pdc20621_put_to_dimm(struct ata_probe_ent *pe, void *psource,
        u16 idx;
        u8 page_mask;
        long dist;
-       void __iomem *mmio = pe->mmio_base;
-       struct pdc_host_priv *hpriv = pe->private_data;
-       void __iomem *dimm_mmio = hpriv->dimm_mmio;
+       void __iomem *mmio = pe->iomap[PDC_MMIO_BAR];
+       void __iomem *dimm_mmio = pe->iomap[PDC_DIMM_BAR];
 
        /* hard-code chip #0 */
        mmio += PDC_CHIP0_OFS;
@@ -1034,7 +990,7 @@ static void pdc20621_put_to_dimm(struct ata_probe_ent *pe, void *psource,
 static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe, u32 device,
                                      u32 subaddr, u32 *pdata)
 {
-       void __iomem *mmio = pe->mmio_base;
+       void __iomem *mmio = pe->iomap[PDC_MMIO_BAR];
        u32 i2creg  = 0;
        u32 status;
        u32 count =0;
@@ -1093,7 +1049,7 @@ static int pdc20621_prog_dimm0(struct ata_probe_ent *pe)
        u32 data = 0;
        int size, i;
        u8 bdimmsize;
-       void __iomem *mmio = pe->mmio_base;
+       void __iomem *mmio = pe->iomap[PDC_MMIO_BAR];
        static const struct {
                unsigned int reg;
                unsigned int ofs;
@@ -1155,8 +1111,8 @@ static int pdc20621_prog_dimm0(struct ata_probe_ent *pe)
 static unsigned int pdc20621_prog_dimm_global(struct ata_probe_ent *pe)
 {
        u32 data, spd0;
-       int error, i;
-       void __iomem *mmio = pe->mmio_base;
+       int error, i;
+       void __iomem *mmio = pe->iomap[PDC_MMIO_BAR];
 
        /* hard-code chip #0 */
        mmio += PDC_CHIP0_OFS;
@@ -1210,7 +1166,7 @@ static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe)
        u32 ticks=0;
        u32 clock=0;
        u32 fparam=0;
-       void __iomem *mmio = pe->mmio_base;
+       void __iomem *mmio = pe->iomap[PDC_MMIO_BAR];
 
        /* hard-code chip #0 */
        mmio += PDC_CHIP0_OFS;
@@ -1334,7 +1290,7 @@ static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe)
 static void pdc_20621_init(struct ata_probe_ent *pe)
 {
        u32 tmp;
-       void __iomem *mmio = pe->mmio_base;
+       void __iomem *mmio = pe->iomap[PDC_MMIO_BAR];
 
        /* hard-code chip #0 */
        mmio += PDC_CHIP0_OFS;
@@ -1365,67 +1321,43 @@ static void pdc_20621_init(struct ata_probe_ent *pe)
 static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version;
-       struct ata_probe_ent *probe_ent = NULL;
-       unsigned long base;
-       void __iomem *mmio_base;
-       void __iomem *dimm_mmio = NULL;
-       struct pdc_host_priv *hpriv = NULL;
+       struct ata_probe_ent *probe_ent;
+       void __iomem *base;
+       struct pdc_host_priv *hpriv;
        unsigned int board_idx = (unsigned int) ent->driver_data;
-       int pci_dev_busy = 0;
        int rc;
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
-       rc = pci_request_regions(pdev, DRV_NAME);
-       if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
-       }
+       rc = pcim_iomap_regions(pdev, (1 << PDC_MMIO_BAR) | (1 << PDC_DIMM_BAR),
+                               DRV_NAME);
+       if (rc == -EBUSY)
+               pcim_pin_device(pdev);
+       if (rc)
+               return rc;
 
        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
-       probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
-       memset(probe_ent, 0, sizeof(*probe_ent));
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
 
-       mmio_base = pci_iomap(pdev, 3, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
-       base = (unsigned long) mmio_base;
-
-       hpriv = kmalloc(sizeof(*hpriv), GFP_KERNEL);
-       if (!hpriv) {
-               rc = -ENOMEM;
-               goto err_out_iounmap;
-       }
-       memset(hpriv, 0, sizeof(*hpriv));
-
-       dimm_mmio = pci_iomap(pdev, 4, 0);
-       if (!dimm_mmio) {
-               kfree(hpriv);
-               rc = -ENOMEM;
-               goto err_out_iounmap;
-       }
-
-       hpriv->dimm_mmio = dimm_mmio;
+       hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL);
+       if (!hpriv)
+               return -ENOMEM;
 
        probe_ent->sht          = pdc_port_info[board_idx].sht;
        probe_ent->port_flags   = pdc_port_info[board_idx].flags;
@@ -1436,10 +1368,10 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *
 
                probe_ent->irq = pdev->irq;
                probe_ent->irq_flags = IRQF_SHARED;
-       probe_ent->mmio_base = mmio_base;
+       probe_ent->iomap = pcim_iomap_table(pdev);
 
        probe_ent->private_data = hpriv;
-       base += PDC_CHIP0_OFS;
+       base = probe_ent->iomap[PDC_MMIO_BAR] + PDC_CHIP0_OFS;
 
        probe_ent->n_ports = 4;
        pdc_sata_setup_port(&probe_ent->port[0], base + 0x200);
@@ -1451,31 +1383,15 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *
 
        /* initialize adapter */
        /* initialize local dimm */
-       if (pdc20621_dimm_init(probe_ent)) {
-               rc = -ENOMEM;
-               goto err_out_iounmap_dimm;
-       }
+       if (pdc20621_dimm_init(probe_ent))
+               return -ENOMEM;
        pdc_20621_init(probe_ent);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
-       kfree(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
+       devm_kfree(&pdev->dev, probe_ent);
        return 0;
-
-err_out_iounmap_dimm:          /* only get to this label if 20621 */
-       kfree(hpriv);
-       pci_iounmap(pdev, dimm_mmio);
-err_out_iounmap:
-       pci_iounmap(pdev, mmio_base);
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
 }
 
 
index a43aec62d505deeca00cf4ed20483eba931fc2cb..80131eec68f4cfe95aa028c2533b9cc883f92d87 100644 (file)
@@ -108,7 +108,7 @@ static const struct ata_port_operations uli_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .freeze                 = ata_bmdma_freeze,
        .thaw                   = ata_bmdma_thaw,
@@ -117,13 +117,13 @@ static const struct ata_port_operations uli_ops = {
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .scr_read               = uli_scr_read,
        .scr_write              = uli_scr_write,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static struct ata_port_info uli_port_info = {
@@ -189,62 +189,60 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        struct ata_port_info *ppi[2];
        int rc;
        unsigned int board_idx = (unsigned int) ent->driver_data;
-       int pci_dev_busy = 0;
        struct uli_priv *hpriv;
+       void __iomem * const *iomap;
 
        if (!printed_version++)
                dev_printk(KERN_INFO, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
+               pcim_pin_device(pdev);
+               return rc;
        }
 
        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
        ppi[0] = ppi[1] = &uli_port_info;
        probe_ent = ata_pci_init_native_mode(pdev, ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY);
-       if (!probe_ent) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       if (!probe_ent)
+               return -ENOMEM;
 
-       hpriv = kzalloc(sizeof(*hpriv), GFP_KERNEL);
-       if (!hpriv) {
-               rc = -ENOMEM;
-               goto err_out_probe_ent;
-       }
+       hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL);
+       if (!hpriv)
+               return -ENOMEM;
 
        probe_ent->private_data = hpriv;
 
+       iomap = pcim_iomap_table(pdev);
+
        switch (board_idx) {
        case uli_5287:
                hpriv->scr_cfg_addr[0] = ULI5287_BASE;
                hpriv->scr_cfg_addr[1] = ULI5287_BASE + ULI5287_OFFS;
                        probe_ent->n_ports = 4;
 
-                       probe_ent->port[2].cmd_addr = pci_resource_start(pdev, 0) + 8;
+               probe_ent->port[2].cmd_addr = iomap[0] + 8;
                probe_ent->port[2].altstatus_addr =
-               probe_ent->port[2].ctl_addr =
-                       (pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS) + 4;
-               probe_ent->port[2].bmdma_addr = pci_resource_start(pdev, 4) + 16;
+               probe_ent->port[2].ctl_addr = (void __iomem *)
+                       ((unsigned long)iomap[1] | ATA_PCI_CTL_OFS) + 4;
+               probe_ent->port[2].bmdma_addr = iomap[4] + 16;
                hpriv->scr_cfg_addr[2] = ULI5287_BASE + ULI5287_OFFS*4;
 
-               probe_ent->port[3].cmd_addr = pci_resource_start(pdev, 2) + 8;
+               probe_ent->port[3].cmd_addr = iomap[2] + 8;
                probe_ent->port[3].altstatus_addr =
-               probe_ent->port[3].ctl_addr =
-                       (pci_resource_start(pdev, 3) | ATA_PCI_CTL_OFS) + 4;
-               probe_ent->port[3].bmdma_addr = pci_resource_start(pdev, 4) + 24;
+               probe_ent->port[3].ctl_addr = (void __iomem *)
+                       ((unsigned long)iomap[3] | ATA_PCI_CTL_OFS) + 4;
+               probe_ent->port[3].bmdma_addr = iomap[4] + 24;
                hpriv->scr_cfg_addr[3] = ULI5287_BASE + ULI5287_OFFS*5;
 
                ata_std_ports(&probe_ent->port[2]);
@@ -269,21 +267,11 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        pci_set_master(pdev);
        pci_intx(pdev, 1);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
-       kfree(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
+       devm_kfree(&pdev->dev, probe_ent);
        return 0;
-
-err_out_probe_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
-
 }
 
 static int __init uli_init(void)
index d3d5c0d57032f029024e3077d475573a523c1c4c..baca6d79bb0bc426eda80fe358555a35c246981e 100644 (file)
@@ -44,7 +44,6 @@
 #include <linux/device.h>
 #include <scsi/scsi_host.h>
 #include <linux/libata.h>
-#include <asm/io.h>
 
 #define DRV_NAME       "sata_via"
 #define DRV_VERSION    "2.0"
@@ -59,11 +58,14 @@ enum {
        SATA_INT_GATE           = 0x41, /* SATA interrupt gating */
        SATA_NATIVE_MODE        = 0x42, /* Native mode enable */
        SATA_PATA_SHARING       = 0x49, /* PATA/SATA sharing func ctrl */
-
+       PATA_UDMA_TIMING        = 0xB3, /* PATA timing for DMA/ cable detect */
+       PATA_PIO_TIMING         = 0xAB, /* PATA timing register */
+       
        PORT0                   = (1 << 1),
        PORT1                   = (1 << 0),
        ALL_PORTS               = PORT0 | PORT1,
-       N_PORTS                 = 2,
+       PATA_PORT               = 2,    /* PATA is port 2 */
+       N_PORTS                 = 3,
 
        NATIVE_MODE_ALL         = (1 << 7) | (1 << 6) | (1 << 5) | (1 << 4),
 
@@ -76,6 +78,11 @@ 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 void svia_noop_freeze(struct ata_port *ap);
 static void vt6420_error_handler(struct ata_port *ap);
+static void vt6421_sata_error_handler(struct ata_port *ap);
+static void vt6421_pata_error_handler(struct ata_port *ap);
+static void vt6421_set_pio_mode(struct ata_port *ap, struct ata_device *adev);
+static void vt6421_set_dma_mode(struct ata_port *ap, struct ata_device *adev);
+static int vt6421_port_start(struct ata_port *ap);
 
 static const struct pci_device_id svia_pci_tbl[] = {
        { PCI_VDEVICE(VIA, 0x5337), vt6420 },
@@ -127,7 +134,7 @@ static const struct ata_port_operations vt6420_sata_ops = {
 
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .freeze                 = svia_noop_freeze,
        .thaw                   = ata_bmdma_thaw,
@@ -136,15 +143,49 @@ static const struct ata_port_operations vt6420_sata_ops = {
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
-static const struct ata_port_operations vt6421_sata_ops = {
+static const struct ata_port_operations vt6421_pata_ops = {
        .port_disable           = ata_port_disable,
+       
+       .set_piomode            = vt6421_set_pio_mode,
+       .set_dmamode            = vt6421_set_dma_mode,
+
+       .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,
+
+       .bmdma_setup            = ata_bmdma_setup,
+       .bmdma_start            = ata_bmdma_start,
+       .bmdma_stop             = ata_bmdma_stop,
+       .bmdma_status           = ata_bmdma_status,
+
+       .qc_prep                = ata_qc_prep,
+       .qc_issue               = ata_qc_issue_prot,
+       .data_xfer              = ata_data_xfer,
+
+       .freeze                 = ata_bmdma_freeze,
+       .thaw                   = ata_bmdma_thaw,
+       .error_handler          = vt6421_pata_error_handler,
+       .post_internal_cmd      = ata_bmdma_post_internal_cmd,
 
+       .irq_handler            = ata_interrupt,
+       .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
+
+       .port_start             = vt6421_port_start,
+};
+
+static const struct ata_port_operations vt6421_sata_ops = {
+       .port_disable           = ata_port_disable,
+       
        .tf_load                = ata_tf_load,
        .tf_read                = ata_tf_read,
        .check_status           = ata_check_status,
@@ -158,22 +199,22 @@ static const struct ata_port_operations vt6421_sata_ops = {
 
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_pio_data_xfer,
+       .data_xfer              = ata_data_xfer,
 
        .freeze                 = ata_bmdma_freeze,
        .thaw                   = ata_bmdma_thaw,
-       .error_handler          = ata_bmdma_error_handler,
+       .error_handler          = vt6421_sata_error_handler,
        .post_internal_cmd      = ata_bmdma_post_internal_cmd,
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .scr_read               = svia_scr_read,
        .scr_write              = svia_scr_write,
 
-       .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
+       .port_start             = vt6421_port_start,
 };
 
 static struct ata_port_info vt6420_port_info = {
@@ -195,14 +236,14 @@ static u32 svia_scr_read (struct ata_port *ap, unsigned int sc_reg)
 {
        if (sc_reg > SCR_CONTROL)
                return 0xffffffffU;
-       return inl(ap->ioaddr.scr_addr + (4 * sc_reg));
+       return ioread32(ap->ioaddr.scr_addr + (4 * sc_reg));
 }
 
 static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
 {
        if (sc_reg > SCR_CONTROL)
                return;
-       outl(val, ap->ioaddr.scr_addr + (4 * sc_reg));
+       iowrite32(val, ap->ioaddr.scr_addr + (4 * sc_reg));
 }
 
 static void svia_noop_freeze(struct ata_port *ap)
@@ -289,6 +330,61 @@ static void vt6420_error_handler(struct ata_port *ap)
                                  NULL, ata_std_postreset);
 }
 
+static int vt6421_pata_prereset(struct ata_port *ap)
+{
+       struct pci_dev *pdev = to_pci_dev(ap->host->dev);
+       u8 tmp;
+
+       pci_read_config_byte(pdev, PATA_UDMA_TIMING, &tmp);
+       if (tmp & 0x10)
+               ap->cbl = ATA_CBL_PATA40;
+       else
+               ap->cbl = ATA_CBL_PATA80;
+       return 0;
+}
+
+static void vt6421_pata_error_handler(struct ata_port *ap)
+{
+       return ata_bmdma_drive_eh(ap, vt6421_pata_prereset, ata_std_softreset,
+                                 NULL, ata_std_postreset);
+}
+
+static int vt6421_sata_prereset(struct ata_port *ap)
+{
+       ap->cbl = ATA_CBL_SATA;
+       return 0;
+}
+
+static void vt6421_sata_error_handler(struct ata_port *ap)
+{
+       return ata_bmdma_drive_eh(ap, vt6421_sata_prereset, ata_std_softreset,
+                                 NULL, ata_std_postreset);
+}
+
+static void vt6421_set_pio_mode(struct ata_port *ap, struct ata_device *adev)
+{
+       struct pci_dev *pdev = to_pci_dev(ap->host->dev);
+       static const u8 pio_bits[] = { 0xA8, 0x65, 0x65, 0x31, 0x20 };
+       pci_write_config_byte(pdev, PATA_PIO_TIMING, pio_bits[adev->pio_mode - XFER_PIO_0]);
+}
+
+static void vt6421_set_dma_mode(struct ata_port *ap, struct ata_device *adev)
+{
+       struct pci_dev *pdev = to_pci_dev(ap->host->dev);
+       static const u8 udma_bits[] = { 0xEE, 0xE8, 0xE6, 0xE4, 0xE2, 0xE1, 0xE0, 0xE0 };
+       pci_write_config_byte(pdev, PATA_UDMA_TIMING, udma_bits[adev->pio_mode - XFER_UDMA_0]);
+}
+
+static int vt6421_port_start(struct ata_port *ap)
+{
+       if (ap->port_no == PATA_PORT) {
+               ap->ops = &vt6421_pata_ops;
+               ap->mwdma_mask = 0;
+               ap->flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_NO_LEGACY | ATA_FLAG_SRST;
+       }
+       return ata_port_start(ap);
+}
+
 static const unsigned int svia_bar_sizes[] = {
        8, 4, 8, 4, 16, 256
 };
@@ -297,31 +393,28 @@ static const unsigned int vt6421_bar_sizes[] = {
        16, 16, 16, 16, 32, 128
 };
 
-static unsigned long svia_scr_addr(unsigned long addr, unsigned int port)
+static void __iomem * svia_scr_addr(void __iomem *addr, unsigned int port)
 {
        return addr + (port * 128);
 }
 
-static unsigned long vt6421_scr_addr(unsigned long addr, unsigned int port)
+static void __iomem * vt6421_scr_addr(void __iomem *addr, unsigned int port)
 {
        return addr + (port * 64);
 }
 
 static void vt6421_init_addrs(struct ata_probe_ent *probe_ent,
-                             struct pci_dev *pdev,
-                             unsigned int port)
+                             void __iomem * const *iomap, unsigned int port)
 {
-       unsigned long reg_addr = pci_resource_start(pdev, port);
-       unsigned long bmdma_addr = pci_resource_start(pdev, 4) + (port * 8);
-       unsigned long scr_addr;
+       void __iomem *reg_addr = iomap[port];
+       void __iomem *bmdma_addr = iomap[4] + (port * 8);
 
        probe_ent->port[port].cmd_addr = reg_addr;
        probe_ent->port[port].altstatus_addr =
-       probe_ent->port[port].ctl_addr = (reg_addr + 8) | ATA_PCI_CTL_OFS;
+       probe_ent->port[port].ctl_addr = (void __iomem *)
+               ((unsigned long)(reg_addr + 8) | ATA_PCI_CTL_OFS);
        probe_ent->port[port].bmdma_addr = bmdma_addr;
-
-       scr_addr = vt6421_scr_addr(pci_resource_start(pdev, 5), port);
-       probe_ent->port[port].scr_addr = scr_addr;
+       probe_ent->port[port].scr_addr = vt6421_scr_addr(iomap[5], port);
 
        ata_std_ports(&probe_ent->port[port]);
 }
@@ -330,16 +423,16 @@ static struct ata_probe_ent *vt6420_init_probe_ent(struct pci_dev *pdev)
 {
        struct ata_probe_ent *probe_ent;
        struct ata_port_info *ppi[2];
-       
+       void __iomem * const *iomap;
+
        ppi[0] = ppi[1] = &vt6420_port_info;
        probe_ent = ata_pci_init_native_mode(pdev, ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY);
        if (!probe_ent)
                return NULL;
 
-       probe_ent->port[0].scr_addr =
-               svia_scr_addr(pci_resource_start(pdev, 5), 0);
-       probe_ent->port[1].scr_addr =
-               svia_scr_addr(pci_resource_start(pdev, 5), 1);
+       iomap = pcim_iomap_table(pdev);
+       probe_ent->port[0].scr_addr = svia_scr_addr(iomap[5], 0);
+       probe_ent->port[1].scr_addr = svia_scr_addr(iomap[5], 1);
 
        return probe_ent;
 }
@@ -349,7 +442,7 @@ static struct ata_probe_ent *vt6421_init_probe_ent(struct pci_dev *pdev)
        struct ata_probe_ent *probe_ent;
        unsigned int i;
 
-       probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
+       probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
        if (!probe_ent)
                return NULL;
 
@@ -368,7 +461,7 @@ static struct ata_probe_ent *vt6421_init_probe_ent(struct pci_dev *pdev)
        probe_ent->udma_mask    = 0x7f;
 
        for (i = 0; i < N_PORTS; i++)
-               vt6421_init_addrs(probe_ent, pdev, i);
+               vt6421_init_addrs(probe_ent, pcim_iomap_table(pdev), i);
 
        return probe_ent;
 }
@@ -420,20 +513,19 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        struct ata_probe_ent *probe_ent;
        int board_id = (int) ent->driver_data;
        const int *bar_sizes;
-       int pci_dev_busy = 0;
        u8 tmp8;
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
-       rc = pci_request_regions(pdev, DRV_NAME);
+       rc = pcim_iomap_regions(pdev, 0x1f, DRV_NAME);
        if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
+               pcim_pin_device(pdev);
+               return rc;
        }
 
        if (board_id == vt6420) {
@@ -442,8 +534,7 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                        dev_printk(KERN_ERR, &pdev->dev,
                                   "SATA master/slave not supported (0x%x)\n",
                                   (int) tmp8);
-                       rc = -EIO;
-                       goto err_out_regions;
+                       return -EIO;
                }
 
                bar_sizes = &svia_bar_sizes[0];
@@ -459,16 +550,15 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                                i,
                                (unsigned long long)pci_resource_start(pdev, i),
                                (unsigned long long)pci_resource_len(pdev, i));
-                       rc = -ENODEV;
-                       goto err_out_regions;
+                       return -ENODEV;
                }
 
        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
        if (board_id == vt6420)
                probe_ent = vt6420_init_probe_ent(pdev);
@@ -477,26 +567,18 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 
        if (!probe_ent) {
                dev_printk(KERN_ERR, &pdev->dev, "out of memory\n");
-               rc = -ENOMEM;
-               goto err_out_regions;
+               return -ENOMEM;
        }
 
        svia_configure(pdev);
 
        pci_set_master(pdev);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
-       kfree(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
+       devm_kfree(&pdev->dev, probe_ent);
        return 0;
-
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
 }
 
 static int __init svia_init(void)
@@ -511,4 +593,3 @@ static void __exit svia_exit(void)
 
 module_init(svia_init);
 module_exit(svia_exit);
-
index 0fa1b89f76d588fac3745d4d008712162b6c267d..2fd037bde090d92641a954d82d2017ce3aa375ca 100644 (file)
@@ -50,6 +50,8 @@
 #define DRV_VERSION    "2.0"
 
 enum {
+       VSC_MMIO_BAR                    = 0,
+
        /* Interrupt register offsets (from chip base address) */
        VSC_SATA_INT_STAT_OFFSET        = 0x00,
        VSC_SATA_INT_MASK_OFFSET        = 0x04,
@@ -96,7 +98,6 @@ enum {
                              VSC_SATA_INT_PHY_CHANGE),
 };
 
-
 #define is_vsc_sata_int_err(port_idx, int_status) \
         (int_status & (VSC_SATA_INT_ERROR << (8 * port_idx)))
 
@@ -105,7 +106,7 @@ static u32 vsc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg)
 {
        if (sc_reg > SCR_CONTROL)
                return 0xffffffffU;
-       return readl((void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4));
+       return readl(ap->ioaddr.scr_addr + (sc_reg * 4));
 }
 
 
@@ -114,7 +115,7 @@ static void vsc_sata_scr_write (struct ata_port *ap, unsigned int sc_reg,
 {
        if (sc_reg > SCR_CONTROL)
                return;
-       writel(val, (void __iomem *) ap->ioaddr.scr_addr + (sc_reg * 4));
+       writel(val, ap->ioaddr.scr_addr + (sc_reg * 4));
 }
 
 
@@ -123,7 +124,7 @@ static void vsc_intr_mask_update(struct ata_port *ap, u8 ctl)
        void __iomem *mask_addr;
        u8 mask;
 
-       mask_addr = ap->host->mmio_base +
+       mask_addr = ap->host->iomap[VSC_MMIO_BAR] +
                VSC_SATA_INT_MASK_OFFSET + ap->port_no;
        mask = readb(mask_addr);
        if (ctl & ATA_NIEN)
@@ -150,25 +151,25 @@ static void vsc_sata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
        }
        if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) {
                writew(tf->feature | (((u16)tf->hob_feature) << 8),
-                      (void __iomem *) ioaddr->feature_addr);
+                      ioaddr->feature_addr);
                writew(tf->nsect | (((u16)tf->hob_nsect) << 8),
-                      (void __iomem *) ioaddr->nsect_addr);
+                      ioaddr->nsect_addr);
                writew(tf->lbal | (((u16)tf->hob_lbal) << 8),
-                      (void __iomem *) ioaddr->lbal_addr);
+                      ioaddr->lbal_addr);
                writew(tf->lbam | (((u16)tf->hob_lbam) << 8),
-                      (void __iomem *) ioaddr->lbam_addr);
+                      ioaddr->lbam_addr);
                writew(tf->lbah | (((u16)tf->hob_lbah) << 8),
-                      (void __iomem *) ioaddr->lbah_addr);
+                      ioaddr->lbah_addr);
        } else if (is_addr) {
-               writew(tf->feature, (void __iomem *) ioaddr->feature_addr);
-               writew(tf->nsect, (void __iomem *) ioaddr->nsect_addr);
-               writew(tf->lbal, (void __iomem *) ioaddr->lbal_addr);
-               writew(tf->lbam, (void __iomem *) ioaddr->lbam_addr);
-               writew(tf->lbah, (void __iomem *) ioaddr->lbah_addr);
+               writew(tf->feature, ioaddr->feature_addr);
+               writew(tf->nsect, ioaddr->nsect_addr);
+               writew(tf->lbal, ioaddr->lbal_addr);
+               writew(tf->lbam, ioaddr->lbam_addr);
+               writew(tf->lbah, ioaddr->lbah_addr);
        }
 
        if (tf->flags & ATA_TFLAG_DEVICE)
-               writeb(tf->device, (void __iomem *) ioaddr->device_addr);
+               writeb(tf->device, ioaddr->device_addr);
 
        ata_wait_idle(ap);
 }
@@ -180,12 +181,12 @@ static void vsc_sata_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
        u16 nsect, lbal, lbam, lbah, feature;
 
        tf->command = ata_check_status(ap);
-       tf->device = readw((void __iomem *) ioaddr->device_addr);
-       feature = readw((void __iomem *) ioaddr->error_addr);
-       nsect = readw((void __iomem *) ioaddr->nsect_addr);
-       lbal = readw((void __iomem *) ioaddr->lbal_addr);
-       lbam = readw((void __iomem *) ioaddr->lbam_addr);
-       lbah = readw((void __iomem *) ioaddr->lbah_addr);
+       tf->device = readw(ioaddr->device_addr);
+       feature = readw(ioaddr->error_addr);
+       nsect = readw(ioaddr->nsect_addr);
+       lbal = readw(ioaddr->lbal_addr);
+       lbam = readw(ioaddr->lbam_addr);
+       lbah = readw(ioaddr->lbah_addr);
 
        tf->feature = feature;
        tf->nsect = nsect;
@@ -217,7 +218,8 @@ static irqreturn_t vsc_sata_interrupt (int irq, void *dev_instance)
 
        spin_lock(&host->lock);
 
-       int_status = readl(host->mmio_base + VSC_SATA_INT_STAT_OFFSET);
+       int_status = readl(host->iomap[VSC_MMIO_BAR] +
+                          VSC_SATA_INT_STAT_OFFSET);
 
        for (i = 0; i < host->n_ports; i++) {
                if (int_status & ((u32) 0xFF << (8 * i))) {
@@ -301,21 +303,22 @@ static const struct ata_port_operations vsc_sata_ops = {
        .bmdma_status           = ata_bmdma_status,
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
-       .data_xfer              = ata_mmio_data_xfer,
+       .data_xfer              = ata_data_xfer,
        .freeze                 = ata_bmdma_freeze,
        .thaw                   = ata_bmdma_thaw,
        .error_handler          = ata_bmdma_error_handler,
        .post_internal_cmd      = ata_bmdma_post_internal_cmd,
        .irq_handler            = vsc_sata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
        .scr_read               = vsc_sata_scr_read,
        .scr_write              = vsc_sata_scr_write,
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_pci_host_stop,
 };
 
-static void __devinit vsc_sata_setup_port(struct ata_ioports *port, unsigned long base)
+static void __devinit vsc_sata_setup_port(struct ata_ioports *port,
+                                         void __iomem *base)
 {
        port->cmd_addr          = base + VSC_SATA_TF_CMD_OFFSET;
        port->data_addr         = base + VSC_SATA_TF_DATA_OFFSET;
@@ -332,71 +335,66 @@ static void __devinit vsc_sata_setup_port(struct ata_ioports *port, unsigned lon
        port->ctl_addr          = base + VSC_SATA_TF_CTL_OFFSET;
        port->bmdma_addr        = base + VSC_SATA_DMA_CMD_OFFSET;
        port->scr_addr          = base + VSC_SATA_SCR_STATUS_OFFSET;
-       writel(0, (void __iomem *) base + VSC_SATA_UP_DESCRIPTOR_OFFSET);
-       writel(0, (void __iomem *) base + VSC_SATA_UP_DATA_BUFFER_OFFSET);
+       writel(0, base + VSC_SATA_UP_DESCRIPTOR_OFFSET);
+       writel(0, base + VSC_SATA_UP_DATA_BUFFER_OFFSET);
 }
 
 
 static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version;
-       struct ata_probe_ent *probe_ent = NULL;
-       unsigned long base;
-       int pci_dev_busy = 0;
+       struct ata_probe_ent *probe_ent;
        void __iomem *mmio_base;
        int rc;
+       u8 cls;
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
        /*
         * Check if we have needed resource mapped.
         */
-       if (pci_resource_len(pdev, 0) == 0) {
-               rc = -ENODEV;
-               goto err_out;
-       }
+       if (pci_resource_len(pdev, 0) == 0)
+               return -ENODEV;
 
-       rc = pci_request_regions(pdev, DRV_NAME);
-       if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
-       }
+       rc = pcim_iomap_regions(pdev, 1 << VSC_MMIO_BAR, DRV_NAME);
+       if (rc == -EBUSY)
+               pcim_pin_device(pdev);
+       if (rc)
+               return rc;
 
        /*
         * Use 32 bit DMA mask, because 64 bit address support is poor.
         */
        rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
        rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
-       probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
-       memset(probe_ent, 0, sizeof(*probe_ent));
+       probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
 
-       mmio_base = pci_iomap(pdev, 0, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
-       base = (unsigned long) mmio_base;
-
        /*
-        * Due to a bug in the chip, the default cache line size can't be used
+        * Due to a bug in the chip, the default cache line size can't be
+        * used (unless the default is non-zero).
         */
-       pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x80);
+       pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &cls);
+       if (cls == 0x00)
+               pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x80);
+
+       if (pci_enable_msi(pdev) == 0)
+               pci_intx(pdev, 0);
+       else
+               probe_ent->irq_flags = IRQF_SHARED;
 
        probe_ent->sht = &vsc_sata_sht;
        probe_ent->port_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
@@ -404,8 +402,7 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d
        probe_ent->port_ops = &vsc_sata_ops;
        probe_ent->n_ports = 4;
        probe_ent->irq = pdev->irq;
-       probe_ent->irq_flags = IRQF_SHARED;
-       probe_ent->mmio_base = mmio_base;
+       probe_ent->iomap = pcim_iomap_table(pdev);
 
        /* We don't care much about the PIO/UDMA masks, but the core won't like us
         * if we don't fill these
@@ -414,11 +411,13 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d
        probe_ent->mwdma_mask = 0x07;
        probe_ent->udma_mask = 0x7f;
 
+       mmio_base = probe_ent->iomap[VSC_MMIO_BAR];
+
        /* We have 4 ports per PCI function */
-       vsc_sata_setup_port(&probe_ent->port[0], base + 1 * VSC_SATA_PORT_OFFSET);
-       vsc_sata_setup_port(&probe_ent->port[1], base + 2 * VSC_SATA_PORT_OFFSET);
-       vsc_sata_setup_port(&probe_ent->port[2], base + 3 * VSC_SATA_PORT_OFFSET);
-       vsc_sata_setup_port(&probe_ent->port[3], base + 4 * VSC_SATA_PORT_OFFSET);
+       vsc_sata_setup_port(&probe_ent->port[0], mmio_base + 1 * VSC_SATA_PORT_OFFSET);
+       vsc_sata_setup_port(&probe_ent->port[1], mmio_base + 2 * VSC_SATA_PORT_OFFSET);
+       vsc_sata_setup_port(&probe_ent->port[2], mmio_base + 3 * VSC_SATA_PORT_OFFSET);
+       vsc_sata_setup_port(&probe_ent->port[3], mmio_base + 4 * VSC_SATA_PORT_OFFSET);
 
        pci_set_master(pdev);
 
@@ -430,20 +429,11 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d
         */
        pci_write_config_dword(pdev, 0x98, 0);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
-       kfree(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
+       devm_kfree(&pdev->dev, probe_ent);
        return 0;
-
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
 }
 
 static const struct pci_device_id vsc_sata_pci_tbl[] = {
index ac2c10822be07c41e5f3995dee1f260099ce3bc2..8d60c4eb54fe4967e238d648ade98fa174800707 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/delay.h>
 #include <linux/init.h>
 #include <linux/mm.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/interrupt.h>
 #include <asm/io.h>
index 5aab7bd473ac9325d5e327597ec474d059199184..8fccf018f165502f6d70b35bb9bad0f784344c20 100644 (file)
@@ -912,7 +912,6 @@ static int start_rx(struct atm_dev *dev)
                free_page((unsigned long) eni_dev->free_list);
                return -ENOMEM;
        }
-       memset(eni_dev->rx_map,0,PAGE_SIZE);
        eni_dev->rx_mult = DEFAULT_RX_MULT;
        eni_dev->fast = eni_dev->last_fast = NULL;
        eni_dev->slow = eni_dev->last_slow = NULL;
index 4aeb3d062ff6d52630834147015e1c33c039e314..a7c0ed3107e32ee29e9aee14637fbf9f4ace5808 100644 (file)
@@ -29,7 +29,6 @@
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/capability.h>
-#include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/bitops.h>
 #include <linux/pci.h>
index 325325afabec839302521e16c09ec78532bdfeba..0bd657f5dd2a4554134e15c92b59b404c95a073b 100644 (file)
@@ -4,7 +4,6 @@
 
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
 #include <linux/errno.h>
index 9504cce51bfb372654e2dec26fbadc95ce093b73..fc8cb07c24779033dd95bfa1e7d3c343bd50836c 100644 (file)
@@ -4,7 +4,6 @@
  
 
 #include <linux/module.h>
-#include <linux/sched.h> /* for jiffies */
 #include <linux/mm.h>
 #include <linux/errno.h>
 #include <linux/atmdev.h>
index 756d4f760da3b11f901ccbcedba6fc14d6bf18ad..0d7091e2077fcbc2043612d088c373ef077ca5f2 100644 (file)
@@ -4,7 +4,6 @@
 
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
 #include <linux/pci.h>
diff --git a/drivers/auxdisplay/Kconfig b/drivers/auxdisplay/Kconfig
new file mode 100644 (file)
index 0000000..0300e7f
--- /dev/null
@@ -0,0 +1,109 @@
+#
+# For a description of the syntax of this configuration file,
+# see Documentation/kbuild/kconfig-language.txt.
+#
+# Auxiliary display drivers configuration.
+#
+
+menu "Auxiliary Display support"
+
+config KS0108
+       tristate "KS0108 LCD Controller"
+       depends on PARPORT_PC
+       default n
+       ---help---
+         If you have a LCD controlled by one or more KS0108
+         controllers, say Y. You will need also another more specific
+         driver for your LCD.
+
+         Depends on Parallel Port support. If you say Y at
+         parport, you will be able to compile this as a module (M)
+         and built-in as well (Y).
+
+         To compile this as a module, choose M here:
+         the module will be called ks0108.
+
+         If unsure, say N.
+
+config KS0108_PORT
+       hex "Parallel port where the LCD is connected"
+       depends on KS0108
+       default 0x378
+       ---help---
+         The address of the parallel port where the LCD is connected.
+
+         The first  standard parallel port address is 0x378.
+         The second standard parallel port address is 0x278.
+         The third  standard parallel port address is 0x3BC.
+
+         You can specify a different address if you need.
+
+         If you don't know what I'm talking about, load the parport module,
+         and execute "dmesg" or "cat /proc/ioports". You can see there how
+         many parallel ports are present and which address each one has.
+
+         Usually you only need to use 0x378.
+
+         If you compile this as a module, you can still override this
+         using the module parameters.
+
+config KS0108_DELAY
+       int "Delay between each control writing (microseconds)"
+       depends on KS0108
+       default "2"
+       ---help---
+         Amount of time the ks0108 should wait between each control write
+         to the parallel port.
+
+         If your driver seems to miss random writings, increment this.
+
+         If you don't know what I'm talking about, ignore it.
+
+         If you compile this as a module, you can still override this
+         value using the module parameters.
+
+config CFAG12864B
+       tristate "CFAG12864B LCD"
+       depends on X86
+       depends on FB
+       depends on KS0108
+       default n
+       ---help---
+         If you have a Crystalfontz 128x64 2-color LCD, cfag12864b Series,
+         say Y. You also need the ks0108 LCD Controller driver.
+
+         For help about how to wire your LCD to the parallel port,
+         check Documentation/auxdisplay/cfag12864b
+
+         Depends on the x86 arch and the framebuffer support.
+
+         The LCD framebuffer driver can be attached to a console.
+         It will work fine. However, you can't attach it to the fbdev driver
+         of the xorg server.
+
+         To compile this as a module, choose M here:
+         the modules will be called cfag12864b and cfag12864bfb.
+
+         If unsure, say N.
+
+config CFAG12864B_RATE
+       int "Refresh rate (hertz)"
+       depends on CFAG12864B
+       default "20"
+       ---help---
+         Refresh rate of the LCD.
+
+         As the LCD is not memory mapped, the driver has to make the work by
+         software. This means you should be careful setting this value higher.
+         If your CPUs are really slow or you feel the system is slowed down,
+         decrease the value.
+
+         Be careful modifying this value to a very high value:
+         You can freeze the computer, or the LCD maybe can't draw as fast as you
+         are requesting.
+
+         If you don't know what I'm talking about, ignore it.
+
+         If you compile this as a module, you can still override this
+         value using the module parameters.
+endmenu
diff --git a/drivers/auxdisplay/Makefile b/drivers/auxdisplay/Makefile
new file mode 100644 (file)
index 0000000..8a8936a
--- /dev/null
@@ -0,0 +1,6 @@
+#
+# Makefile for the kernel auxiliary displays device drivers.
+#
+
+obj-$(CONFIG_KS0108)           += ks0108.o
+obj-$(CONFIG_CFAG12864B)       += cfag12864b.o cfag12864bfb.o
diff --git a/drivers/auxdisplay/cfag12864b.c b/drivers/auxdisplay/cfag12864b.c
new file mode 100644 (file)
index 0000000..889583d
--- /dev/null
@@ -0,0 +1,383 @@
+/*
+ *    Filename: cfag12864b.c
+ *     Version: 0.1.0
+ * Description: cfag12864b LCD driver
+ *     License: GPLv2
+ *     Depends: ks0108
+ *
+ *      Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
+ *        Date: 2006-10-31
+ *
+ *  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.
+ *
+ *  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
+ *
+ */
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/fs.h>
+#include <linux/cdev.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/jiffies.h>
+#include <linux/mutex.h>
+#include <linux/uaccess.h>
+#include <linux/vmalloc.h>
+#include <linux/workqueue.h>
+#include <linux/ks0108.h>
+#include <linux/cfag12864b.h>
+
+
+#define CFAG12864B_NAME "cfag12864b"
+
+/*
+ * Module Parameters
+ */
+
+static unsigned int cfag12864b_rate = CONFIG_CFAG12864B_RATE;
+module_param(cfag12864b_rate, uint, S_IRUGO);
+MODULE_PARM_DESC(cfag12864b_rate,
+       "Refresh rate (hertzs)");
+
+unsigned int cfag12864b_getrate(void)
+{
+       return cfag12864b_rate;
+}
+
+/*
+ * cfag12864b Commands
+ *
+ *     E = Enable signal
+ *             Everytime E switch from low to high,
+ *             cfag12864b/ks0108 reads the command/data.
+ *
+ *     CS1 = First ks0108controller.
+ *             If high, the first ks0108 controller receives commands/data.
+ *
+ *     CS2 = Second ks0108 controller
+ *             If high, the second ks0108 controller receives commands/data.
+ *
+ *     DI = Data/Instruction
+ *             If low, cfag12864b will expect commands.
+ *             If high, cfag12864b will expect data.
+ *
+ */
+
+#define bit(n) (((unsigned char)1)<<(n))
+
+#define CFAG12864B_BIT_E       (0)
+#define CFAG12864B_BIT_CS1     (2)
+#define CFAG12864B_BIT_CS2     (1)
+#define CFAG12864B_BIT_DI      (3)
+
+static unsigned char cfag12864b_state;
+
+static void cfag12864b_set(void)
+{
+       ks0108_writecontrol(cfag12864b_state);
+}
+
+static void cfag12864b_setbit(unsigned char state, unsigned char n)
+{
+       if (state)
+               cfag12864b_state |= bit(n);
+       else
+               cfag12864b_state &= ~bit(n);
+}
+
+static void cfag12864b_e(unsigned char state)
+{
+       cfag12864b_setbit(state, CFAG12864B_BIT_E);
+       cfag12864b_set();
+}
+
+static void cfag12864b_cs1(unsigned char state)
+{
+       cfag12864b_setbit(state, CFAG12864B_BIT_CS1);
+}
+
+static void cfag12864b_cs2(unsigned char state)
+{
+       cfag12864b_setbit(state, CFAG12864B_BIT_CS2);
+}
+
+static void cfag12864b_di(unsigned char state)
+{
+       cfag12864b_setbit(state, CFAG12864B_BIT_DI);
+}
+
+static void cfag12864b_setcontrollers(unsigned char first,
+       unsigned char second)
+{
+       if (first)
+               cfag12864b_cs1(0);
+       else
+               cfag12864b_cs1(1);
+
+       if (second)
+               cfag12864b_cs2(0);
+       else
+               cfag12864b_cs2(1);
+}
+
+static void cfag12864b_controller(unsigned char which)
+{
+       if (which == 0)
+               cfag12864b_setcontrollers(1, 0);
+       else if (which == 1)
+               cfag12864b_setcontrollers(0, 1);
+}
+
+static void cfag12864b_displaystate(unsigned char state)
+{
+       cfag12864b_di(0);
+       cfag12864b_e(1);
+       ks0108_displaystate(state);
+       cfag12864b_e(0);
+}
+
+static void cfag12864b_address(unsigned char address)
+{
+       cfag12864b_di(0);
+       cfag12864b_e(1);
+       ks0108_address(address);
+       cfag12864b_e(0);
+}
+
+static void cfag12864b_page(unsigned char page)
+{
+       cfag12864b_di(0);
+       cfag12864b_e(1);
+       ks0108_page(page);
+       cfag12864b_e(0);
+}
+
+static void cfag12864b_startline(unsigned char startline)
+{
+       cfag12864b_di(0);
+       cfag12864b_e(1);
+       ks0108_startline(startline);
+       cfag12864b_e(0);
+}
+
+static void cfag12864b_writebyte(unsigned char byte)
+{
+       cfag12864b_di(1);
+       cfag12864b_e(1);
+       ks0108_writedata(byte);
+       cfag12864b_e(0);
+}
+
+static void cfag12864b_nop(void)
+{
+       cfag12864b_startline(0);
+}
+
+/*
+ * cfag12864b Internal Commands
+ */
+
+static void cfag12864b_on(void)
+{
+       cfag12864b_setcontrollers(1, 1);
+       cfag12864b_displaystate(1);
+}
+
+static void cfag12864b_off(void)
+{
+       cfag12864b_setcontrollers(1, 1);
+       cfag12864b_displaystate(0);
+}
+
+static void cfag12864b_clear(void)
+{
+       unsigned char i, j;
+
+       cfag12864b_setcontrollers(1, 1);
+       for (i = 0; i < CFAG12864B_PAGES; i++) {
+               cfag12864b_page(i);
+               cfag12864b_address(0);
+               for (j = 0; j < CFAG12864B_ADDRESSES; j++)
+                       cfag12864b_writebyte(0);
+       }
+}
+
+/*
+ * Update work
+ */
+
+unsigned char *cfag12864b_buffer;
+static unsigned char *cfag12864b_cache;
+static DEFINE_MUTEX(cfag12864b_mutex);
+static unsigned char cfag12864b_updating;
+static void cfag12864b_update(struct work_struct *delayed_work);
+static struct workqueue_struct *cfag12864b_workqueue;
+static DECLARE_DELAYED_WORK(cfag12864b_work, cfag12864b_update);
+
+static void cfag12864b_queue(void)
+{
+       queue_delayed_work(cfag12864b_workqueue, &cfag12864b_work,
+               HZ / cfag12864b_rate);
+}
+
+unsigned char cfag12864b_enable(void)
+{
+       unsigned char ret;
+
+       mutex_lock(&cfag12864b_mutex);
+
+       if (!cfag12864b_updating) {
+               cfag12864b_updating = 1;
+               cfag12864b_queue();
+               ret = 0;
+       } else
+               ret = 1;
+
+       mutex_unlock(&cfag12864b_mutex);
+
+       return ret;
+}
+
+void cfag12864b_disable(void)
+{
+       mutex_lock(&cfag12864b_mutex);
+
+       if (cfag12864b_updating) {
+               cfag12864b_updating = 0;
+               cancel_delayed_work(&cfag12864b_work);
+               flush_workqueue(cfag12864b_workqueue);
+       }
+
+       mutex_unlock(&cfag12864b_mutex);
+}
+
+unsigned char cfag12864b_isenabled(void)
+{
+       return cfag12864b_updating;
+}
+
+static void cfag12864b_update(struct work_struct *work)
+{
+       unsigned char c;
+       unsigned short i, j, k, b;
+
+       if (memcmp(cfag12864b_cache, cfag12864b_buffer, CFAG12864B_SIZE)) {
+               for (i = 0; i < CFAG12864B_CONTROLLERS; i++) {
+                       cfag12864b_controller(i);
+                       cfag12864b_nop();
+                       for (j = 0; j < CFAG12864B_PAGES; j++) {
+                               cfag12864b_page(j);
+                               cfag12864b_nop();
+                               cfag12864b_address(0);
+                               cfag12864b_nop();
+                               for (k = 0; k < CFAG12864B_ADDRESSES; k++) {
+                                       for (c = 0, b = 0; b < 8; b++)
+                                               if (cfag12864b_buffer
+                                                       [i * CFAG12864B_ADDRESSES / 8
+                                                       + k / 8 + (j * 8 + b) *
+                                                       CFAG12864B_WIDTH / 8]
+                                                       & bit(k % 8))
+                                                       c |= bit(b);
+                                       cfag12864b_writebyte(c);
+                               }
+                       }
+               }
+
+               memcpy(cfag12864b_cache, cfag12864b_buffer, CFAG12864B_SIZE);
+       }
+
+       if (cfag12864b_updating)
+               cfag12864b_queue();
+}
+
+/*
+ * cfag12864b Exported Symbols
+ */
+
+EXPORT_SYMBOL_GPL(cfag12864b_buffer);
+EXPORT_SYMBOL_GPL(cfag12864b_getrate);
+EXPORT_SYMBOL_GPL(cfag12864b_enable);
+EXPORT_SYMBOL_GPL(cfag12864b_disable);
+EXPORT_SYMBOL_GPL(cfag12864b_isenabled);
+
+/*
+ * Module Init & Exit
+ */
+
+static int __init cfag12864b_init(void)
+{
+       int ret = -EINVAL;
+
+       if (PAGE_SIZE < CFAG12864B_SIZE) {
+               printk(KERN_ERR CFAG12864B_NAME ": ERROR: "
+                       "page size (%i) < cfag12864b size (%i)\n",
+                       (unsigned int)PAGE_SIZE, CFAG12864B_SIZE);
+               ret = -ENOMEM;
+               goto none;
+       }
+
+       cfag12864b_buffer = (unsigned char *) __get_free_page(GFP_KERNEL);
+       if (cfag12864b_buffer == NULL) {
+               printk(KERN_ERR CFAG12864B_NAME ": ERROR: "
+                       "can't get a free page\n");
+               ret = -ENOMEM;
+               goto none;
+       }
+
+       cfag12864b_cache = kmalloc(sizeof(unsigned char) *
+               CFAG12864B_SIZE, GFP_KERNEL);
+       if (cfag12864b_buffer == NULL) {
+               printk(KERN_ERR CFAG12864B_NAME ": ERROR: "
+                       "can't alloc cache buffer (%i bytes)\n",
+                       CFAG12864B_SIZE);
+               ret = -ENOMEM;
+               goto bufferalloced;
+       }
+
+       cfag12864b_workqueue = create_singlethread_workqueue(CFAG12864B_NAME);
+       if (cfag12864b_workqueue == NULL)
+               goto cachealloced;
+
+       memset(cfag12864b_buffer, 0, CFAG12864B_SIZE);
+
+       cfag12864b_clear();
+       cfag12864b_on();
+
+       return 0;
+
+cachealloced:
+       kfree(cfag12864b_cache);
+
+bufferalloced:
+       free_page((unsigned long) cfag12864b_buffer);
+
+none:
+       return ret;
+}
+
+static void __exit cfag12864b_exit(void)
+{
+       cfag12864b_disable();
+       cfag12864b_off();
+       destroy_workqueue(cfag12864b_workqueue);
+       kfree(cfag12864b_cache);
+       free_page((unsigned long) cfag12864b_buffer);
+}
+
+module_init(cfag12864b_init);
+module_exit(cfag12864b_exit);
+
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Miguel Ojeda Sandonis <maxextreme@gmail.com>");
+MODULE_DESCRIPTION("cfag12864b LCD driver");
diff --git a/drivers/auxdisplay/cfag12864bfb.c b/drivers/auxdisplay/cfag12864bfb.c
new file mode 100644 (file)
index 0000000..94765e7
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ *    Filename: cfag12864bfb.c
+ *     Version: 0.1.0
+ * Description: cfag12864b LCD framebuffer driver
+ *     License: GPLv2
+ *     Depends: cfag12864b
+ *
+ *      Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
+ *        Date: 2006-10-31
+ *
+ *  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.
+ *
+ *  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
+ *
+ */
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/errno.h>
+#include <linux/fb.h>
+#include <linux/mm.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/uaccess.h>
+#include <linux/cfag12864b.h>
+
+#define CFAG12864BFB_NAME "cfag12864bfb"
+
+static struct fb_fix_screeninfo cfag12864bfb_fix __initdata = {
+       .id = "cfag12864b",
+       .type = FB_TYPE_PACKED_PIXELS,
+       .visual = FB_VISUAL_MONO10,
+       .xpanstep = 0,
+       .ypanstep = 0,
+       .ywrapstep = 0,
+       .line_length = CFAG12864B_WIDTH / 8,
+       .accel = FB_ACCEL_NONE,
+};
+
+static struct fb_var_screeninfo cfag12864bfb_var __initdata = {
+       .xres = CFAG12864B_WIDTH,
+       .yres = CFAG12864B_HEIGHT,
+       .xres_virtual = CFAG12864B_WIDTH,
+       .yres_virtual = CFAG12864B_HEIGHT,
+       .bits_per_pixel = 1,
+       .red = { 0, 1, 0 },
+       .green = { 0, 1, 0 },
+       .blue = { 0, 1, 0 },
+       .left_margin = 0,
+       .right_margin = 0,
+       .upper_margin = 0,
+       .lower_margin = 0,
+       .vmode = FB_VMODE_NONINTERLACED,
+};
+
+static int cfag12864bfb_mmap(struct fb_info *info, struct vm_area_struct *vma)
+{
+       return vm_insert_page(vma, vma->vm_start,
+               virt_to_page(cfag12864b_buffer));
+}
+
+static struct fb_ops cfag12864bfb_ops = {
+       .owner = THIS_MODULE,
+       .fb_fillrect = cfb_fillrect,
+       .fb_copyarea = cfb_copyarea,
+       .fb_imageblit = cfb_imageblit,
+       .fb_mmap = cfag12864bfb_mmap,
+};
+
+static int __init cfag12864bfb_probe(struct platform_device *device)
+{
+       int ret = -EINVAL;
+       struct fb_info *info = framebuffer_alloc(0, &device->dev);
+
+       if (!info)
+               goto none;
+
+       info->screen_base = (char __iomem *) cfag12864b_buffer;
+       info->screen_size = CFAG12864B_SIZE;
+       info->fbops = &cfag12864bfb_ops;
+       info->fix = cfag12864bfb_fix;
+       info->var = cfag12864bfb_var;
+       info->pseudo_palette = NULL;
+       info->par = NULL;
+       info->flags = FBINFO_FLAG_DEFAULT;
+
+       if (register_framebuffer(info) < 0)
+               goto fballoced;
+
+       platform_set_drvdata(device, info);
+
+       printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node,
+               info->fix.id);
+
+       return 0;
+
+fballoced:
+       framebuffer_release(info);
+
+none:
+       return ret;
+}
+
+static int cfag12864bfb_remove(struct platform_device *device)
+{
+       struct fb_info *info = platform_get_drvdata(device);
+
+       if (info) {
+               unregister_framebuffer(info);
+               framebuffer_release(info);
+       }
+
+       return 0;
+}
+
+static struct platform_driver cfag12864bfb_driver = {
+       .probe  = cfag12864bfb_probe,
+       .remove = cfag12864bfb_remove,
+       .driver = {
+               .name   = CFAG12864BFB_NAME,
+       },
+};
+
+static struct platform_device *cfag12864bfb_device;
+
+static int __init cfag12864bfb_init(void)
+{
+       int ret;
+
+       if (cfag12864b_enable()) {
+               printk(KERN_ERR CFAG12864BFB_NAME ": ERROR: "
+                       "can't enable cfag12864b refreshing (being used)\n");
+               return -ENODEV;
+       }
+
+       ret = platform_driver_register(&cfag12864bfb_driver);
+
+       if (!ret) {
+               cfag12864bfb_device =
+                       platform_device_alloc(CFAG12864BFB_NAME, 0);
+
+               if (cfag12864bfb_device)
+                       ret = platform_device_add(cfag12864bfb_device);
+               else
+                       ret = -ENOMEM;
+
+               if (ret) {
+                       platform_device_put(cfag12864bfb_device);
+                       platform_driver_unregister(&cfag12864bfb_driver);
+               }
+       }
+
+       return ret;
+}
+
+static void __exit cfag12864bfb_exit(void)
+{
+       platform_device_unregister(cfag12864bfb_device);
+       platform_driver_unregister(&cfag12864bfb_driver);
+       cfag12864b_disable();
+}
+
+module_init(cfag12864bfb_init);
+module_exit(cfag12864bfb_exit);
+
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Miguel Ojeda Sandonis <maxextreme@gmail.com>");
+MODULE_DESCRIPTION("cfag12864b LCD framebuffer driver");
diff --git a/drivers/auxdisplay/ks0108.c b/drivers/auxdisplay/ks0108.c
new file mode 100644 (file)
index 0000000..a637575
--- /dev/null
@@ -0,0 +1,166 @@
+/*
+ *    Filename: ks0108.c
+ *     Version: 0.1.0
+ * Description: ks0108 LCD Controller driver
+ *     License: GPLv2
+ *     Depends: parport
+ *
+ *      Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
+ *        Date: 2006-10-31
+ *
+ *  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.
+ *
+ *  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
+ *
+ */
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/fs.h>
+#include <linux/io.h>
+#include <linux/parport.h>
+#include <linux/uaccess.h>
+#include <linux/ks0108.h>
+
+#define KS0108_NAME "ks0108"
+
+/*
+ * Module Parameters
+ */
+
+static unsigned int ks0108_port = CONFIG_KS0108_PORT;
+module_param(ks0108_port, uint, S_IRUGO);
+MODULE_PARM_DESC(ks0108_port, "Parallel port where the LCD is connected");
+
+static unsigned int ks0108_delay = CONFIG_KS0108_DELAY;
+module_param(ks0108_delay, uint, S_IRUGO);
+MODULE_PARM_DESC(ks0108_delay, "Delay between each control writing (microseconds)");
+
+/*
+ * Device
+ */
+
+static struct parport *ks0108_parport;
+static struct pardevice *ks0108_pardevice;
+
+/*
+ * ks0108 Exported Commands (don't lock)
+ *
+ *   You _should_ lock in the top driver: This functions _should not_
+ *   get race conditions in any way. Locking for each byte here would be
+ *   so slow and useless.
+ *
+ *   There are not bit definitions because they are not flags,
+ *   just arbitrary combinations defined by the documentation for each
+ *   function in the ks0108 LCD controller. If you want to know what means
+ *   a specific combination, look at the function's name.
+ *
+ *   The ks0108_writecontrol bits need to be reverted ^(0,1,3) because
+ *   the parallel port also revert them using a "not" logic gate.
+ */
+
+#define bit(n) (((unsigned char)1)<<(n))
+
+void ks0108_writedata(unsigned char byte)
+{
+       parport_write_data(ks0108_parport, byte);
+}
+
+void ks0108_writecontrol(unsigned char byte)
+{
+       udelay(ks0108_delay);
+       parport_write_control(ks0108_parport, byte ^ (bit(0) | bit(1) | bit(3)));
+}
+
+void ks0108_displaystate(unsigned char state)
+{
+       ks0108_writedata((state ? bit(0) : 0) | bit(1) | bit(2) | bit(3) | bit(4) | bit(5));
+}
+
+void ks0108_startline(unsigned char startline)
+{
+       ks0108_writedata(min(startline,(unsigned char)63) | bit(6) | bit(7));
+}
+
+void ks0108_address(unsigned char address)
+{
+       ks0108_writedata(min(address,(unsigned char)63) | bit(6));
+}
+
+void ks0108_page(unsigned char page)
+{
+       ks0108_writedata(min(page,(unsigned char)7) | bit(3) | bit(4) | bit(5) | bit(7));
+}
+
+EXPORT_SYMBOL_GPL(ks0108_writedata);
+EXPORT_SYMBOL_GPL(ks0108_writecontrol);
+EXPORT_SYMBOL_GPL(ks0108_displaystate);
+EXPORT_SYMBOL_GPL(ks0108_startline);
+EXPORT_SYMBOL_GPL(ks0108_address);
+EXPORT_SYMBOL_GPL(ks0108_page);
+
+/*
+ * Module Init & Exit
+ */
+
+static int __init ks0108_init(void)
+{
+       int result;
+       int ret = -EINVAL;
+
+       ks0108_parport = parport_find_base(ks0108_port);
+       if (ks0108_parport == NULL) {
+               printk(KERN_ERR KS0108_NAME ": ERROR: "
+                       "parport didn't find %i port\n", ks0108_port);
+               goto none;
+       }
+
+       ks0108_pardevice = parport_register_device(ks0108_parport, KS0108_NAME,
+               NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL);
+       if (ks0108_pardevice == NULL) {
+               printk(KERN_ERR KS0108_NAME ": ERROR: "
+                       "parport didn't register new device\n");
+               goto none;
+       }
+
+       result = parport_claim(ks0108_pardevice);
+       if (result != 0) {
+               printk(KERN_ERR KS0108_NAME ": ERROR: "
+                       "can't claim %i parport, maybe in use\n", ks0108_port);
+               ret = result;
+               goto registered;
+       }
+
+       return 0;
+
+registered:
+       parport_unregister_device(ks0108_pardevice);
+
+none:
+       return ret;
+}
+
+static void __exit ks0108_exit(void)
+{
+       parport_release(ks0108_pardevice);
+       parport_unregister_device(ks0108_pardevice);
+}
+
+module_init(ks0108_init);
+module_exit(ks0108_exit);
+
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Miguel Ojeda Sandonis <maxextreme@gmail.com>");
+MODULE_DESCRIPTION("ks0108 LCD Controller driver");
+
index 1429f3a2629e60003e575bb02c5dd6fe97470e3c..5d6312e3349062cee54d204163bb5407d300a1bb 100644 (file)
@@ -37,6 +37,18 @@ config DEBUG_DRIVER
 
          If you are unsure about this, say N here.
 
+config DEBUG_DEVRES
+       bool "Managed device resources verbose debug messages"
+       depends on DEBUG_KERNEL
+       help
+         This option enables kernel parameter devres.log. If set to
+         non-zero, devres debug messages are printed. Select this if
+         you are having a problem with devres or want to debug
+         resource management for a managed device. devres.log can be
+         switched on and off from sysfs node.
+
+         If you are unsure about this, Say N here.
+
 config SYS_HYPERVISOR
        bool
        default n
index 7bbb9eeda235efb5dd307eb1d5e89dfa552f550a..e9eb7382ac3ac26b9c0c0ccae636da25bf4e1fa0 100644 (file)
@@ -3,6 +3,7 @@
 obj-y                  := core.o sys.o bus.o dd.o \
                           driver.o class.o platform.o \
                           cpu.o firmware.o init.o map.o dmapool.o \
+                          dma-mapping.o devres.o \
                           attribute_container.o transport_class.o
 obj-y                  += power/
 obj-$(CONFIG_ISA)      += isa.o
index d26644a59537f5a708226652f7a82edc713ed216..de7e1442ce60e73c4ab73fa6359b6ce2cba9572e 100644 (file)
@@ -44,3 +44,4 @@ struct class_device_attribute *to_class_dev_attr(struct attribute *_attr)
 
 extern char *make_class_name(const char *name, struct kobject *kobj);
 
+extern void devres_release_all(struct device *dev);
index e13614241c9eeed951141d285bb5d8e041ded23c..a8ac34ba610716a4fc5c4193920a3d44a4697ccd 100644 (file)
@@ -428,6 +428,8 @@ void device_initialize(struct device *dev)
        INIT_LIST_HEAD(&dev->dma_pools);
        INIT_LIST_HEAD(&dev->node);
        init_MUTEX(&dev->sem);
+       spin_lock_init(&dev->devres_lock);
+       INIT_LIST_HEAD(&dev->devres_head);
        device_init_wakeup(dev, 0);
        set_dev_node(dev, -1);
 }
index b5bf243d9cd6a26afc47eabb2990cf2d4cf13884..6a48824e43ff6559ff386d4eb23c301e5293d753 100644 (file)
@@ -112,6 +112,7 @@ static int really_probe(void *void_data)
        atomic_inc(&probe_count);
        pr_debug("%s: Probing driver %s with device %s\n",
                 drv->bus->name, drv->name, dev->bus_id);
+       WARN_ON(!list_empty(&dev->devres_head));
 
        dev->driver = drv;
        if (driver_sysfs_add(dev)) {
@@ -137,6 +138,7 @@ static int really_probe(void *void_data)
        goto done;
 
 probe_failed:
+       devres_release_all(dev);
        driver_sysfs_remove(dev);
        dev->driver = NULL;
 
@@ -327,6 +329,7 @@ static void __device_release_driver(struct device * dev)
                        dev->bus->remove(dev);
                else if (drv->remove)
                        drv->remove(dev);
+               devres_release_all(dev);
                dev->driver = NULL;
                put_driver(drv);
        }
diff --git a/drivers/base/devres.c b/drivers/base/devres.c
new file mode 100644 (file)
index 0000000..e177c95
--- /dev/null
@@ -0,0 +1,644 @@
+/*
+ * drivers/base/devres.c - device resource management
+ *
+ * Copyright (c) 2006  SUSE Linux Products GmbH
+ * Copyright (c) 2006  Tejun Heo <teheo@suse.de>
+ *
+ * This file is released under the GPLv2.
+ */
+
+#include <linux/device.h>
+#include <linux/module.h>
+
+struct devres_node {
+       struct list_head                entry;
+       dr_release_t                    release;
+#ifdef CONFIG_DEBUG_DEVRES
+       const char                      *name;
+       size_t                          size;
+#endif
+};
+
+struct devres {
+       struct devres_node              node;
+       /* -- 3 pointers */
+       unsigned long long              data[]; /* guarantee ull alignment */
+};
+
+struct devres_group {
+       struct devres_node              node[2];
+       void                            *id;
+       int                             color;
+       /* -- 8 pointers */
+};
+
+#ifdef CONFIG_DEBUG_DEVRES
+static int log_devres = 0;
+module_param_named(log, log_devres, int, S_IRUGO | S_IWUSR);
+
+static void set_node_dbginfo(struct devres_node *node, const char *name,
+                            size_t size)
+{
+       node->name = name;
+       node->size = size;
+}
+
+static void devres_log(struct device *dev, struct devres_node *node,
+                      const char *op)
+{
+       if (unlikely(log_devres))
+               dev_printk(KERN_ERR, dev, "DEVRES %3s %p %s (%lu bytes)\n",
+                          op, node, node->name, (unsigned long)node->size);
+}
+#else /* CONFIG_DEBUG_DEVRES */
+#define set_node_dbginfo(node, n, s)   do {} while (0)
+#define devres_log(dev, node, op)      do {} while (0)
+#endif /* CONFIG_DEBUG_DEVRES */
+
+/*
+ * Release functions for devres group.  These callbacks are used only
+ * for identification.
+ */
+static void group_open_release(struct device *dev, void *res)
+{
+       /* noop */
+}
+
+static void group_close_release(struct device *dev, void *res)
+{
+       /* noop */
+}
+
+static struct devres_group * node_to_group(struct devres_node *node)
+{
+       if (node->release == &group_open_release)
+               return container_of(node, struct devres_group, node[0]);
+       if (node->release == &group_close_release)
+               return container_of(node, struct devres_group, node[1]);
+       return NULL;
+}
+
+static __always_inline struct devres * alloc_dr(dr_release_t release,
+                                               size_t size, gfp_t gfp)
+{
+       size_t tot_size = sizeof(struct devres) + size;
+       struct devres *dr;
+
+       dr = kmalloc_track_caller(tot_size, gfp);
+       if (unlikely(!dr))
+               return NULL;
+
+       memset(dr, 0, tot_size);
+       INIT_LIST_HEAD(&dr->node.entry);
+       dr->node.release = release;
+       return dr;
+}
+
+static void add_dr(struct device *dev, struct devres_node *node)
+{
+       devres_log(dev, node, "ADD");
+       BUG_ON(!list_empty(&node->entry));
+       list_add_tail(&node->entry, &dev->devres_head);
+}
+
+/**
+ * devres_alloc - Allocate device resource data
+ * @release: Release function devres will be associated with
+ * @size: Allocation size
+ * @gfp: Allocation flags
+ *
+ * allocate devres of @size bytes.  The allocated area is zeroed, then
+ * associated with @release.  The returned pointer can be passed to
+ * other devres_*() functions.
+ *
+ * RETURNS:
+ * Pointer to allocated devres on success, NULL on failure.
+ */
+#ifdef CONFIG_DEBUG_DEVRES
+void * __devres_alloc(dr_release_t release, size_t size, gfp_t gfp,
+                     const char *name)
+{
+       struct devres *dr;
+
+       dr = alloc_dr(release, size, gfp);
+       if (unlikely(!dr))
+               return NULL;
+       set_node_dbginfo(&dr->node, name, size);
+       return dr->data;
+}
+EXPORT_SYMBOL_GPL(__devres_alloc);
+#else
+void * devres_alloc(dr_release_t release, size_t size, gfp_t gfp)
+{
+       struct devres *dr;
+
+       dr = alloc_dr(release, size, gfp);
+       if (unlikely(!dr))
+               return NULL;
+       return dr->data;
+}
+EXPORT_SYMBOL_GPL(devres_alloc);
+#endif
+
+/**
+ * devres_free - Free device resource data
+ * @res: Pointer to devres data to free
+ *
+ * Free devres created with devres_alloc().
+ */
+void devres_free(void *res)
+{
+       if (res) {
+               struct devres *dr = container_of(res, struct devres, data);
+
+               BUG_ON(!list_empty(&dr->node.entry));
+               kfree(dr);
+       }
+}
+EXPORT_SYMBOL_GPL(devres_free);
+
+/**
+ * devres_add - Register device resource
+ * @dev: Device to add resource to
+ * @res: Resource to register
+ *
+ * Register devres @res to @dev.  @res should have been allocated
+ * using devres_alloc().  On driver detach, the associated release
+ * function will be invoked and devres will be freed automatically.
+ */
+void devres_add(struct device *dev, void *res)
+{
+       struct devres *dr = container_of(res, struct devres, data);
+       unsigned long flags;
+
+       spin_lock_irqsave(&dev->devres_lock, flags);
+       add_dr(dev, &dr->node);
+       spin_unlock_irqrestore(&dev->devres_lock, flags);
+}
+EXPORT_SYMBOL_GPL(devres_add);
+
+static struct devres *find_dr(struct device *dev, dr_release_t release,
+                             dr_match_t match, void *match_data)
+{
+       struct devres_node *node;
+
+       list_for_each_entry_reverse(node, &dev->devres_head, entry) {
+               struct devres *dr = container_of(node, struct devres, node);
+
+               if (node->release != release)
+                       continue;
+               if (match && !match(dev, dr->data, match_data))
+                       continue;
+               return dr;
+       }
+
+       return NULL;
+}
+
+/**
+ * devres_find - Find device resource
+ * @dev: Device to lookup resource from
+ * @release: Look for resources associated with this release function
+ * @match: Match function (optional)
+ * @match_data: Data for the match function
+ *
+ * Find the latest devres of @dev which is associated with @release
+ * and for which @match returns 1.  If @match is NULL, it's considered
+ * to match all.
+ *
+ * RETURNS:
+ * Pointer to found devres, NULL if not found.
+ */
+void * devres_find(struct device *dev, dr_release_t release,
+                  dr_match_t match, void *match_data)
+{
+       struct devres *dr;
+       unsigned long flags;
+
+       spin_lock_irqsave(&dev->devres_lock, flags);
+       dr = find_dr(dev, release, match, match_data);
+       spin_unlock_irqrestore(&dev->devres_lock, flags);
+
+       if (dr)
+               return dr->data;
+       return NULL;
+}
+EXPORT_SYMBOL_GPL(devres_find);
+
+/**
+ * devres_get - Find devres, if non-existent, add one atomically
+ * @dev: Device to lookup or add devres for
+ * @new_res: Pointer to new initialized devres to add if not found
+ * @match: Match function (optional)
+ * @match_data: Data for the match function
+ *
+ * Find the latest devres of @dev which has the same release function
+ * as @new_res and for which @match return 1.  If found, @new_res is
+ * freed; otherwise, @new_res is added atomically.
+ *
+ * RETURNS:
+ * Pointer to found or added devres.
+ */
+void * devres_get(struct device *dev, void *new_res,
+                 dr_match_t match, void *match_data)
+{
+       struct devres *new_dr = container_of(new_res, struct devres, data);
+       struct devres *dr;
+       unsigned long flags;
+
+       spin_lock_irqsave(&dev->devres_lock, flags);
+       dr = find_dr(dev, new_dr->node.release, match, match_data);
+       if (!dr) {
+               add_dr(dev, &new_dr->node);
+               dr = new_dr;
+               new_dr = NULL;
+       }
+       spin_unlock_irqrestore(&dev->devres_lock, flags);
+       devres_free(new_dr);
+
+       return dr->data;
+}
+EXPORT_SYMBOL_GPL(devres_get);
+
+/**
+ * devres_remove - Find a device resource and remove it
+ * @dev: Device to find resource from
+ * @release: Look for resources associated with this release function
+ * @match: Match function (optional)
+ * @match_data: Data for the match function
+ *
+ * Find the latest devres of @dev associated with @release and for
+ * which @match returns 1.  If @match is NULL, it's considered to
+ * match all.  If found, the resource is removed atomically and
+ * returned.
+ *
+ * RETURNS:
+ * Pointer to removed devres on success, NULL if not found.
+ */
+void * devres_remove(struct device *dev, dr_release_t release,
+                    dr_match_t match, void *match_data)
+{
+       struct devres *dr;
+       unsigned long flags;
+
+       spin_lock_irqsave(&dev->devres_lock, flags);
+       dr = find_dr(dev, release, match, match_data);
+       if (dr) {
+               list_del_init(&dr->node.entry);
+               devres_log(dev, &dr->node, "REM");
+       }
+       spin_unlock_irqrestore(&dev->devres_lock, flags);
+
+       if (dr)
+               return dr->data;
+       return NULL;
+}
+EXPORT_SYMBOL_GPL(devres_remove);
+
+/**
+ * devres_destroy - Find a device resource and destroy it
+ * @dev: Device to find resource from
+ * @release: Look for resources associated with this release function
+ * @match: Match function (optional)
+ * @match_data: Data for the match function
+ *
+ * Find the latest devres of @dev associated with @release and for
+ * which @match returns 1.  If @match is NULL, it's considered to
+ * match all.  If found, the resource is removed atomically and freed.
+ *
+ * RETURNS:
+ * 0 if devres is found and freed, -ENOENT if not found.
+ */
+int devres_destroy(struct device *dev, dr_release_t release,
+                  dr_match_t match, void *match_data)
+{
+       void *res;
+
+       res = devres_remove(dev, release, match, match_data);
+       if (unlikely(!res))
+               return -ENOENT;
+
+       devres_free(res);
+       return 0;
+}
+EXPORT_SYMBOL_GPL(devres_destroy);
+
+static int remove_nodes(struct device *dev,
+                       struct list_head *first, struct list_head *end,
+                       struct list_head *todo)
+{
+       int cnt = 0, nr_groups = 0;
+       struct list_head *cur;
+
+       /* First pass - move normal devres entries to @todo and clear
+        * devres_group colors.
+        */
+       cur = first;
+       while (cur != end) {
+               struct devres_node *node;
+               struct devres_group *grp;
+
+               node = list_entry(cur, struct devres_node, entry);
+               cur = cur->next;
+
+               grp = node_to_group(node);
+               if (grp) {
+                       /* clear color of group markers in the first pass */
+                       grp->color = 0;
+                       nr_groups++;
+               } else {
+                       /* regular devres entry */
+                       if (&node->entry == first)
+                               first = first->next;
+                       list_move_tail(&node->entry, todo);
+                       cnt++;
+               }
+       }
+
+       if (!nr_groups)
+               return cnt;
+
+       /* Second pass - Scan groups and color them.  A group gets
+        * color value of two iff the group is wholly contained in
+        * [cur, end).  That is, for a closed group, both opening and
+        * closing markers should be in the range, while just the
+        * opening marker is enough for an open group.
+        */
+       cur = first;
+       while (cur != end) {
+               struct devres_node *node;
+               struct devres_group *grp;
+
+               node = list_entry(cur, struct devres_node, entry);
+               cur = cur->next;
+
+               grp = node_to_group(node);
+               BUG_ON(!grp || list_empty(&grp->node[0].entry));
+
+               grp->color++;
+               if (list_empty(&grp->node[1].entry))
+                       grp->color++;
+
+               BUG_ON(grp->color <= 0 || grp->color > 2);
+               if (grp->color == 2) {
+                       /* No need to update cur or end.  The removed
+                        * nodes are always before both.
+                        */
+                       list_move_tail(&grp->node[0].entry, todo);
+                       list_del_init(&grp->node[1].entry);
+               }
+       }
+
+       return cnt;
+}
+
+static int release_nodes(struct device *dev, struct list_head *first,
+                        struct list_head *end, unsigned long flags)
+{
+       LIST_HEAD(todo);
+       int cnt;
+       struct devres *dr, *tmp;
+
+       cnt = remove_nodes(dev, first, end, &todo);
+
+       spin_unlock_irqrestore(&dev->devres_lock, flags);
+
+       /* Release.  Note that both devres and devres_group are
+        * handled as devres in the following loop.  This is safe.
+        */
+       list_for_each_entry_safe_reverse(dr, tmp, &todo, node.entry) {
+               devres_log(dev, &dr->node, "REL");
+               dr->node.release(dev, dr->data);
+               kfree(dr);
+       }
+
+       return cnt;
+}
+
+/**
+ * devres_release_all - Release all resources
+ * @dev: Device to release resources for
+ *
+ * Release all resources associated with @dev.  This function is
+ * called on driver detach.
+ */
+int devres_release_all(struct device *dev)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&dev->devres_lock, flags);
+       return release_nodes(dev, dev->devres_head.next, &dev->devres_head,
+                            flags);
+}
+
+/**
+ * devres_open_group - Open a new devres group
+ * @dev: Device to open devres group for
+ * @id: Separator ID
+ * @gfp: Allocation flags
+ *
+ * Open a new devres group for @dev with @id.  For @id, using a
+ * pointer to an object which won't be used for another group is
+ * recommended.  If @id is NULL, address-wise unique ID is created.
+ *
+ * RETURNS:
+ * ID of the new group, NULL on failure.
+ */
+void * devres_open_group(struct device *dev, void *id, gfp_t gfp)
+{
+       struct devres_group *grp;
+       unsigned long flags;
+
+       grp = kmalloc(sizeof(*grp), gfp);
+       if (unlikely(!grp))
+               return NULL;
+
+       grp->node[0].release = &group_open_release;
+       grp->node[1].release = &group_close_release;
+       INIT_LIST_HEAD(&grp->node[0].entry);
+       INIT_LIST_HEAD(&grp->node[1].entry);
+       set_node_dbginfo(&grp->node[0], "grp<", 0);
+       set_node_dbginfo(&grp->node[1], "grp>", 0);
+       grp->id = grp;
+       if (id)
+               grp->id = id;
+
+       spin_lock_irqsave(&dev->devres_lock, flags);
+       add_dr(dev, &grp->node[0]);
+       spin_unlock_irqrestore(&dev->devres_lock, flags);
+       return grp->id;
+}
+EXPORT_SYMBOL_GPL(devres_open_group);
+
+/* Find devres group with ID @id.  If @id is NULL, look for the latest. */
+static struct devres_group * find_group(struct device *dev, void *id)
+{
+       struct devres_node *node;
+
+       list_for_each_entry_reverse(node, &dev->devres_head, entry) {
+               struct devres_group *grp;
+
+               if (node->release != &group_open_release)
+                       continue;
+
+               grp = container_of(node, struct devres_group, node[0]);
+
+               if (id) {
+                       if (grp->id == id)
+                               return grp;
+               } else if (list_empty(&grp->node[1].entry))
+                       return grp;
+       }
+
+       return NULL;
+}
+
+/**
+ * devres_close_group - Close a devres group
+ * @dev: Device to close devres group for
+ * @id: ID of target group, can be NULL
+ *
+ * Close the group identified by @id.  If @id is NULL, the latest open
+ * group is selected.
+ */
+void devres_close_group(struct device *dev, void *id)
+{
+       struct devres_group *grp;
+       unsigned long flags;
+
+       spin_lock_irqsave(&dev->devres_lock, flags);
+
+       grp = find_group(dev, id);
+       if (grp)
+               add_dr(dev, &grp->node[1]);
+       else
+               WARN_ON(1);
+
+       spin_unlock_irqrestore(&dev->devres_lock, flags);
+}
+EXPORT_SYMBOL_GPL(devres_close_group);
+
+/**
+ * devres_remove_group - Remove a devres group
+ * @dev: Device to remove group for
+ * @id: ID of target group, can be NULL
+ *
+ * Remove the group identified by @id.  If @id is NULL, the latest
+ * open group is selected.  Note that removing a group doesn't affect
+ * any other resources.
+ */
+void devres_remove_group(struct device *dev, void *id)
+{
+       struct devres_group *grp;
+       unsigned long flags;
+
+       spin_lock_irqsave(&dev->devres_lock, flags);
+
+       grp = find_group(dev, id);
+       if (grp) {
+               list_del_init(&grp->node[0].entry);
+               list_del_init(&grp->node[1].entry);
+               devres_log(dev, &grp->node[0], "REM");
+       } else
+               WARN_ON(1);
+
+       spin_unlock_irqrestore(&dev->devres_lock, flags);
+
+       kfree(grp);
+}
+EXPORT_SYMBOL_GPL(devres_remove_group);
+
+/**
+ * devres_release_group - Release resources in a devres group
+ * @dev: Device to release group for
+ * @id: ID of target group, can be NULL
+ *
+ * Release all resources in the group identified by @id.  If @id is
+ * NULL, the latest open group is selected.  The selected group and
+ * groups properly nested inside the selected group are removed.
+ *
+ * RETURNS:
+ * The number of released non-group resources.
+ */
+int devres_release_group(struct device *dev, void *id)
+{
+       struct devres_group *grp;
+       unsigned long flags;
+       int cnt = 0;
+
+       spin_lock_irqsave(&dev->devres_lock, flags);
+
+       grp = find_group(dev, id);
+       if (grp) {
+               struct list_head *first = &grp->node[0].entry;
+               struct list_head *end = &dev->devres_head;
+
+               if (!list_empty(&grp->node[1].entry))
+                       end = grp->node[1].entry.next;
+
+               cnt = release_nodes(dev, first, end, flags);
+       } else {
+               WARN_ON(1);
+               spin_unlock_irqrestore(&dev->devres_lock, flags);
+       }
+
+       return cnt;
+}
+EXPORT_SYMBOL_GPL(devres_release_group);
+
+/*
+ * Managed kzalloc/kfree
+ */
+static void devm_kzalloc_release(struct device *dev, void *res)
+{
+       /* noop */
+}
+
+static int devm_kzalloc_match(struct device *dev, void *res, void *data)
+{
+       return res == data;
+}
+
+/**
+ * devm_kzalloc - Managed kzalloc
+ * @dev: Device to allocate memory for
+ * @size: Allocation size
+ * @gfp: Allocation gfp flags
+ *
+ * Managed kzalloc.  Memory allocated with this function is
+ * automatically freed on driver detach.  Like all other devres
+ * resources, guaranteed alignment is unsigned long long.
+ *
+ * RETURNS:
+ * Pointer to allocated memory on success, NULL on failure.
+ */
+void * devm_kzalloc(struct device *dev, size_t size, gfp_t gfp)
+{
+       struct devres *dr;
+
+       /* use raw alloc_dr for kmalloc caller tracing */
+       dr = alloc_dr(devm_kzalloc_release, size, gfp);
+       if (unlikely(!dr))
+               return NULL;
+
+       set_node_dbginfo(&dr->node, "devm_kzalloc_release", size);
+       devres_add(dev, dr->data);
+       return dr->data;
+}
+EXPORT_SYMBOL_GPL(devm_kzalloc);
+
+/**
+ * devm_kfree - Managed kfree
+ * @dev: Device this memory belongs to
+ * @p: Memory to free
+ *
+ * Free memory allocated with dev_kzalloc().
+ */
+void devm_kfree(struct device *dev, void *p)
+{
+       int rc;
+
+       rc = devres_destroy(dev, devm_kzalloc_release, devm_kzalloc_match, p);
+       WARN_ON(rc);
+}
+EXPORT_SYMBOL_GPL(devm_kfree);
diff --git a/drivers/base/dma-mapping.c b/drivers/base/dma-mapping.c
new file mode 100644 (file)
index 0000000..ca9186f
--- /dev/null
@@ -0,0 +1,218 @@
+/*
+ * drivers/base/dma-mapping.c - arch-independent dma-mapping routines
+ *
+ * Copyright (c) 2006  SUSE Linux Products GmbH
+ * Copyright (c) 2006  Tejun Heo <teheo@suse.de>
+ *
+ * This file is released under the GPLv2.
+ */
+
+#include <linux/dma-mapping.h>
+
+/*
+ * Managed DMA API
+ */
+struct dma_devres {
+       size_t          size;
+       void            *vaddr;
+       dma_addr_t      dma_handle;
+};
+
+static void dmam_coherent_release(struct device *dev, void *res)
+{
+       struct dma_devres *this = res;
+
+       dma_free_coherent(dev, this->size, this->vaddr, this->dma_handle);
+}
+
+static void dmam_noncoherent_release(struct device *dev, void *res)
+{
+       struct dma_devres *this = res;
+
+       dma_free_noncoherent(dev, this->size, this->vaddr, this->dma_handle);
+}
+
+static int dmam_match(struct device *dev, void *res, void *match_data)
+{
+       struct dma_devres *this = res, *match = match_data;
+
+       if (this->vaddr == match->vaddr) {
+               WARN_ON(this->size != match->size ||
+                       this->dma_handle != match->dma_handle);
+               return 1;
+       }
+       return 0;
+}
+
+/**
+ * dmam_alloc_coherent - Managed dma_alloc_coherent()
+ * @dev: Device to allocate coherent memory for
+ * @size: Size of allocation
+ * @dma_handle: Out argument for allocated DMA handle
+ * @gfp: Allocation flags
+ *
+ * Managed dma_alloc_coherent().  Memory allocated using this function
+ * will be automatically released on driver detach.
+ *
+ * RETURNS:
+ * Pointer to allocated memory on success, NULL on failure.
+ */
+void * dmam_alloc_coherent(struct device *dev, size_t size,
+                          dma_addr_t *dma_handle, gfp_t gfp)
+{
+       struct dma_devres *dr;
+       void *vaddr;
+
+       dr = devres_alloc(dmam_coherent_release, sizeof(*dr), gfp);
+       if (!dr)
+               return NULL;
+
+       vaddr = dma_alloc_coherent(dev, size, dma_handle, gfp);
+       if (!vaddr) {
+               devres_free(dr);
+               return NULL;
+       }
+
+       dr->vaddr = vaddr;
+       dr->dma_handle = *dma_handle;
+       dr->size = size;
+
+       devres_add(dev, dr);
+
+       return vaddr;
+}
+EXPORT_SYMBOL(dmam_alloc_coherent);
+
+/**
+ * dmam_free_coherent - Managed dma_free_coherent()
+ * @dev: Device to free coherent memory for
+ * @size: Size of allocation
+ * @vaddr: Virtual address of the memory to free
+ * @dma_handle: DMA handle of the memory to free
+ *
+ * Managed dma_free_coherent().
+ */
+void dmam_free_coherent(struct device *dev, size_t size, void *vaddr,
+                       dma_addr_t dma_handle)
+{
+       struct dma_devres match_data = { size, vaddr, dma_handle };
+
+       dma_free_coherent(dev, size, vaddr, dma_handle);
+       WARN_ON(devres_destroy(dev, dmam_coherent_release, dmam_match,
+                              &match_data));
+}
+EXPORT_SYMBOL(dmam_free_coherent);
+
+/**
+ * dmam_alloc_non_coherent - Managed dma_alloc_non_coherent()
+ * @dev: Device to allocate non_coherent memory for
+ * @size: Size of allocation
+ * @dma_handle: Out argument for allocated DMA handle
+ * @gfp: Allocation flags
+ *
+ * Managed dma_alloc_non_coherent().  Memory allocated using this
+ * function will be automatically released on driver detach.
+ *
+ * RETURNS:
+ * Pointer to allocated memory on success, NULL on failure.
+ */
+void *dmam_alloc_noncoherent(struct device *dev, size_t size,
+                            dma_addr_t *dma_handle, gfp_t gfp)
+{
+       struct dma_devres *dr;
+       void *vaddr;
+
+       dr = devres_alloc(dmam_noncoherent_release, sizeof(*dr), gfp);
+       if (!dr)
+               return NULL;
+
+       vaddr = dma_alloc_noncoherent(dev, size, dma_handle, gfp);
+       if (!vaddr) {
+               devres_free(dr);
+               return NULL;
+       }
+
+       dr->vaddr = vaddr;
+       dr->dma_handle = *dma_handle;
+       dr->size = size;
+
+       devres_add(dev, dr);
+
+       return vaddr;
+}
+EXPORT_SYMBOL(dmam_alloc_noncoherent);
+
+/**
+ * dmam_free_coherent - Managed dma_free_noncoherent()
+ * @dev: Device to free noncoherent memory for
+ * @size: Size of allocation
+ * @vaddr: Virtual address of the memory to free
+ * @dma_handle: DMA handle of the memory to free
+ *
+ * Managed dma_free_noncoherent().
+ */
+void dmam_free_noncoherent(struct device *dev, size_t size, void *vaddr,
+                          dma_addr_t dma_handle)
+{
+       struct dma_devres match_data = { size, vaddr, dma_handle };
+
+       dma_free_noncoherent(dev, size, vaddr, dma_handle);
+       WARN_ON(!devres_destroy(dev, dmam_noncoherent_release, dmam_match,
+                               &match_data));
+}
+EXPORT_SYMBOL(dmam_free_noncoherent);
+
+#ifdef ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY
+
+static void dmam_coherent_decl_release(struct device *dev, void *res)
+{
+       dma_release_declared_memory(dev);
+}
+
+/**
+ * dmam_declare_coherent_memory - Managed dma_declare_coherent_memory()
+ * @dev: Device to declare coherent memory for
+ * @bus_addr: Bus address of coherent memory to be declared
+ * @device_addr: Device address of coherent memory to be declared
+ * @size: Size of coherent memory to be declared
+ * @flags: Flags
+ *
+ * Managed dma_declare_coherent_memory().
+ *
+ * RETURNS:
+ * 0 on success, -errno on failure.
+ */
+int dmam_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
+                                dma_addr_t device_addr, size_t size, int flags)
+{
+       void *res;
+       int rc;
+
+       res = devres_alloc(dmam_coherent_decl_release, 0, GFP_KERNEL);
+       if (!res)
+               return -ENOMEM;
+
+       rc = dma_declare_coherent_memory(dev, bus_addr, device_addr, size,
+                                        flags);
+       if (rc == 0)
+               devres_add(dev, res);
+       else
+               devres_free(res);
+
+       return rc;
+}
+EXPORT_SYMBOL(dmam_declare_coherent_memory);
+
+/**
+ * dmam_release_declared_memory - Managed dma_release_declared_memory().
+ * @dev: Device to release declared coherent memory for
+ *
+ * Managed dmam_release_declared_memory().
+ */
+void dmam_release_declared_memory(struct device *dev)
+{
+       WARN_ON(devres_destroy(dev, dmam_coherent_decl_release, NULL, NULL));
+}
+EXPORT_SYMBOL(dmam_release_declared_memory);
+
+#endif
index f95d502772740d9fa653379f185e002742d9abf4..cd467c9f33b35e760e20759284bf35d0839e94f2 100644 (file)
@@ -415,8 +415,67 @@ dma_pool_free (struct dma_pool *pool, void *vaddr, dma_addr_t dma)
        spin_unlock_irqrestore (&pool->lock, flags);
 }
 
+/*
+ * Managed DMA pool
+ */
+static void dmam_pool_release(struct device *dev, void *res)
+{
+       struct dma_pool *pool = *(struct dma_pool **)res;
+
+       dma_pool_destroy(pool);
+}
+
+static int dmam_pool_match(struct device *dev, void *res, void *match_data)
+{
+       return *(struct dma_pool **)res == match_data;
+}
+
+/**
+ * dmam_pool_create - Managed dma_pool_create()
+ * @name: name of pool, for diagnostics
+ * @dev: device that will be doing the DMA
+ * @size: size of the blocks in this pool.
+ * @align: alignment requirement for blocks; must be a power of two
+ * @allocation: returned blocks won't cross this boundary (or zero)
+ *
+ * Managed dma_pool_create().  DMA pool created with this function is
+ * automatically destroyed on driver detach.
+ */
+struct dma_pool *dmam_pool_create(const char *name, struct device *dev,
+                                 size_t size, size_t align, size_t allocation)
+{
+       struct dma_pool **ptr, *pool;
+
+       ptr = devres_alloc(dmam_pool_release, sizeof(*ptr), GFP_KERNEL);
+       if (!ptr)
+               return NULL;
+
+       pool = *ptr = dma_pool_create(name, dev, size, align, allocation);
+       if (pool)
+               devres_add(dev, ptr);
+       else
+               devres_free(ptr);
+
+       return pool;
+}
+
+/**
+ * dmam_pool_destroy - Managed dma_pool_destroy()
+ * @pool: dma pool that will be destroyed
+ *
+ * Managed dma_pool_destroy().
+ */
+void dmam_pool_destroy(struct dma_pool *pool)
+{
+       struct device *dev = pool->dev;
+
+       dma_pool_destroy(pool);
+       WARN_ON(devres_destroy(dev, dmam_pool_release, dmam_pool_match, pool));
+}
 
 EXPORT_SYMBOL (dma_pool_create);
 EXPORT_SYMBOL (dma_pool_destroy);
 EXPORT_SYMBOL (dma_pool_alloc);
 EXPORT_SYMBOL (dma_pool_free);
+EXPORT_SYMBOL (dmam_pool_create);
+EXPORT_SYMBOL (dmam_pool_destroy);
index 001e6f6b9c1bf085130f3f286b2a45d1116abf62..475e33f76e0d3cefa8690e56ad046c17574c1231 100644 (file)
@@ -40,13 +40,8 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf)
        int n;
        int nid = dev->id;
        struct sysinfo i;
-       unsigned long inactive;
-       unsigned long active;
-       unsigned long free;
 
        si_meminfo_node(&i, nid);
-       __get_zone_counts(&active, &inactive, &free, NODE_DATA(nid));
-
 
        n = sprintf(buf, "\n"
                       "Node %d MemTotal:     %8lu kB\n"
@@ -74,8 +69,8 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf)
                       nid, K(i.totalram),
                       nid, K(i.freeram),
                       nid, K(i.totalram - i.freeram),
-                      nid, K(active),
-                      nid, K(inactive),
+                      nid, node_page_state(nid, NR_ACTIVE),
+                      nid, node_page_state(nid, NR_INACTIVE),
 #ifdef CONFIG_HIGHMEM
                       nid, K(i.totalhigh),
                       nid, K(i.freehigh),
index 8d81a3a64c078bb4d2523ac51c2ef6ad6c10e7dc..92bf868ca05684a655395cbd78554dc1e3d02beb 100644 (file)
@@ -177,7 +177,7 @@ static void DAC960_AnnounceDriver(DAC960_Controller_T *Controller)
   DAC960_Failure prints a standardized error message, and then returns false.
 */
 
-static boolean DAC960_Failure(DAC960_Controller_T *Controller,
+static bool DAC960_Failure(DAC960_Controller_T *Controller,
                              unsigned char *ErrorMessage)
 {
   DAC960_Error("While configuring DAC960 PCI RAID Controller at\n",
@@ -206,7 +206,7 @@ static boolean DAC960_Failure(DAC960_Controller_T *Controller,
   that are passed in.
  */
 
-static boolean init_dma_loaf(struct pci_dev *dev, struct dma_loaf *loaf,
+static bool init_dma_loaf(struct pci_dev *dev, struct dma_loaf *loaf,
                                                                 size_t len)
 {
        void *cpu_addr;
@@ -250,7 +250,7 @@ static void free_dma_loaf(struct pci_dev *dev, struct dma_loaf *loaf_handle)
   failure.
 */
 
-static boolean DAC960_CreateAuxiliaryStructures(DAC960_Controller_T *Controller)
+static bool DAC960_CreateAuxiliaryStructures(DAC960_Controller_T *Controller)
 {
   int CommandAllocationLength, CommandAllocationGroupSize;
   int CommandsRemaining = 0, CommandIdentifier, CommandGroupByteCount;
@@ -790,7 +790,7 @@ static void DAC960_ExecuteCommand(DAC960_Command_T *Command)
   on failure.
 */
 
-static boolean DAC960_V1_ExecuteType3(DAC960_Controller_T *Controller,
+static bool DAC960_V1_ExecuteType3(DAC960_Controller_T *Controller,
                                      DAC960_V1_CommandOpcode_T CommandOpcode,
                                      dma_addr_t DataDMA)
 {
@@ -814,7 +814,7 @@ static boolean DAC960_V1_ExecuteType3(DAC960_Controller_T *Controller,
   on failure.
 */
 
-static boolean DAC960_V1_ExecuteType3B(DAC960_Controller_T *Controller,
+static bool DAC960_V1_ExecuteType3B(DAC960_Controller_T *Controller,
                                       DAC960_V1_CommandOpcode_T CommandOpcode,
                                       unsigned char CommandOpcode2,
                                       dma_addr_t DataDMA)
@@ -840,7 +840,7 @@ static boolean DAC960_V1_ExecuteType3B(DAC960_Controller_T *Controller,
   on failure.
 */
 
-static boolean DAC960_V1_ExecuteType3D(DAC960_Controller_T *Controller,
+static bool DAC960_V1_ExecuteType3D(DAC960_Controller_T *Controller,
                                       DAC960_V1_CommandOpcode_T CommandOpcode,
                                       unsigned char Channel,
                                       unsigned char TargetID,
@@ -870,7 +870,7 @@ static boolean DAC960_V1_ExecuteType3D(DAC960_Controller_T *Controller,
   Return data in The controller's HealthStatusBuffer, which is dma-able memory
 */
 
-static boolean DAC960_V2_GeneralInfo(DAC960_Controller_T *Controller)
+static bool DAC960_V2_GeneralInfo(DAC960_Controller_T *Controller)
 {
   DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
   DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
@@ -908,7 +908,7 @@ static boolean DAC960_V2_GeneralInfo(DAC960_Controller_T *Controller)
   memory buffer.
 */
 
-static boolean DAC960_V2_NewControllerInfo(DAC960_Controller_T *Controller)
+static bool DAC960_V2_NewControllerInfo(DAC960_Controller_T *Controller)
 {
   DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
   DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
@@ -946,7 +946,7 @@ static boolean DAC960_V2_NewControllerInfo(DAC960_Controller_T *Controller)
   Data is returned in the controller's V2.NewLogicalDeviceInformation
 */
 
-static boolean DAC960_V2_NewLogicalDeviceInfo(DAC960_Controller_T *Controller,
+static bool DAC960_V2_NewLogicalDeviceInfo(DAC960_Controller_T *Controller,
                                           unsigned short LogicalDeviceNumber)
 {
   DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
@@ -997,7 +997,7 @@ static boolean DAC960_V2_NewLogicalDeviceInfo(DAC960_Controller_T *Controller,
 
 */
 
-static boolean DAC960_V2_NewPhysicalDeviceInfo(DAC960_Controller_T *Controller,
+static bool DAC960_V2_NewPhysicalDeviceInfo(DAC960_Controller_T *Controller,
                                            unsigned char Channel,
                                            unsigned char TargetID,
                                            unsigned char LogicalUnit)
@@ -1082,7 +1082,7 @@ static void DAC960_V2_ConstructNewUnitSerialNumber(
   memory buffer.
 */
 
-static boolean DAC960_V2_NewInquiryUnitSerialNumber(DAC960_Controller_T *Controller,
+static bool DAC960_V2_NewInquiryUnitSerialNumber(DAC960_Controller_T *Controller,
                        int Channel, int TargetID, int LogicalUnit)
 {
       DAC960_Command_T *Command;
@@ -1110,7 +1110,7 @@ static boolean DAC960_V2_NewInquiryUnitSerialNumber(DAC960_Controller_T *Control
   success and false on failure.
 */
 
-static boolean DAC960_V2_DeviceOperation(DAC960_Controller_T *Controller,
+static bool DAC960_V2_DeviceOperation(DAC960_Controller_T *Controller,
                                         DAC960_V2_IOCTL_Opcode_T IOCTL_Opcode,
                                         DAC960_V2_OperationDevice_T
                                           OperationDevice)
@@ -1142,7 +1142,7 @@ static boolean DAC960_V2_DeviceOperation(DAC960_Controller_T *Controller,
   other dma mapped memory.
 */
 
-static boolean DAC960_V1_EnableMemoryMailboxInterface(DAC960_Controller_T
+static bool DAC960_V1_EnableMemoryMailboxInterface(DAC960_Controller_T
                                                      *Controller)
 {
   void __iomem *ControllerBaseAddress = Controller->BaseAddress;
@@ -1348,7 +1348,7 @@ skip_mailboxes:
   the structures that are contained in that region.
 */
 
-static boolean DAC960_V2_EnableMemoryMailboxInterface(DAC960_Controller_T
+static bool DAC960_V2_EnableMemoryMailboxInterface(DAC960_Controller_T
                                                      *Controller)
 {
   void __iomem *ControllerBaseAddress = Controller->BaseAddress;
@@ -1373,8 +1373,7 @@ static boolean DAC960_V2_EnableMemoryMailboxInterface(DAC960_Controller_T
   Controller->BounceBufferLimit = DAC690_V2_PciDmaMask;
 
   /* This is a temporary dma mapping, used only in the scope of this function */
-  CommandMailbox =
-         (DAC960_V2_CommandMailbox_T *)pci_alloc_consistent( PCI_Device,
+  CommandMailbox = pci_alloc_consistent(PCI_Device,
                sizeof(DAC960_V2_CommandMailbox_T), &CommandMailboxDMA);
   if (CommandMailbox == NULL)
          return false;
@@ -1526,7 +1525,7 @@ static boolean DAC960_V2_EnableMemoryMailboxInterface(DAC960_Controller_T
   from DAC960 V1 Firmware Controllers and initializes the Controller structure.
 */
 
-static boolean DAC960_V1_ReadControllerConfiguration(DAC960_Controller_T
+static bool DAC960_V1_ReadControllerConfiguration(DAC960_Controller_T
                                                     *Controller)
 {
   DAC960_V1_Enquiry2_T *Enquiry2;
@@ -1767,7 +1766,7 @@ static boolean DAC960_V1_ReadControllerConfiguration(DAC960_Controller_T
   from DAC960 V2 Firmware Controllers and initializes the Controller structure.
 */
 
-static boolean DAC960_V2_ReadControllerConfiguration(DAC960_Controller_T
+static bool DAC960_V2_ReadControllerConfiguration(DAC960_Controller_T
                                                     *Controller)
 {
   DAC960_V2_ControllerInfo_T *ControllerInfo =
@@ -1879,8 +1878,8 @@ static boolean DAC960_V2_ReadControllerConfiguration(DAC960_Controller_T
       if (NewLogicalDeviceInfo->LogicalDeviceState !=
          DAC960_V2_LogicalDevice_Offline)
        Controller->LogicalDriveInitiallyAccessible[LogicalDeviceNumber] = true;
-      LogicalDeviceInfo = (DAC960_V2_LogicalDeviceInfo_T *)
-       kmalloc(sizeof(DAC960_V2_LogicalDeviceInfo_T), GFP_ATOMIC);
+      LogicalDeviceInfo = kmalloc(sizeof(DAC960_V2_LogicalDeviceInfo_T),
+                                  GFP_ATOMIC);
       if (LogicalDeviceInfo == NULL)
        return DAC960_Failure(Controller, "LOGICAL DEVICE ALLOCATION");
       Controller->V2.LogicalDeviceInformation[LogicalDeviceNumber] =
@@ -1898,7 +1897,7 @@ static boolean DAC960_V2_ReadControllerConfiguration(DAC960_Controller_T
   for Controller.
 */
 
-static boolean DAC960_ReportControllerConfiguration(DAC960_Controller_T
+static bool DAC960_ReportControllerConfiguration(DAC960_Controller_T
                                                    *Controller)
 {
   DAC960_Info("Configuring Mylex %s PCI RAID Controller\n",
@@ -1947,7 +1946,7 @@ static boolean DAC960_ReportControllerConfiguration(DAC960_Controller_T
   Controller.
 */
 
-static boolean DAC960_V1_ReadDeviceConfiguration(DAC960_Controller_T
+static bool DAC960_V1_ReadDeviceConfiguration(DAC960_Controller_T
                                                 *Controller)
 {
   struct dma_loaf local_dma;
@@ -2095,7 +2094,7 @@ static boolean DAC960_V1_ReadDeviceConfiguration(DAC960_Controller_T
   device connected to Controller.
 */
 
-static boolean DAC960_V2_ReadDeviceConfiguration(DAC960_Controller_T
+static bool DAC960_V2_ReadDeviceConfiguration(DAC960_Controller_T
                                                 *Controller)
 {
   unsigned char Channel = 0, TargetID = 0, LogicalUnit = 0;
@@ -2113,8 +2112,8 @@ static boolean DAC960_V2_ReadDeviceConfiguration(DAC960_Controller_T
       if (!DAC960_V2_NewPhysicalDeviceInfo(Controller, Channel, TargetID, LogicalUnit))
          break;
 
-      PhysicalDeviceInfo = (DAC960_V2_PhysicalDeviceInfo_T *)
-               kmalloc(sizeof(DAC960_V2_PhysicalDeviceInfo_T), GFP_ATOMIC);
+      PhysicalDeviceInfo = kmalloc(sizeof(DAC960_V2_PhysicalDeviceInfo_T),
+                                   GFP_ATOMIC);
       if (PhysicalDeviceInfo == NULL)
                return DAC960_Failure(Controller, "PHYSICAL DEVICE ALLOCATION");
       Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex] =
@@ -2122,8 +2121,8 @@ static boolean DAC960_V2_ReadDeviceConfiguration(DAC960_Controller_T
       memcpy(PhysicalDeviceInfo, NewPhysicalDeviceInfo,
                sizeof(DAC960_V2_PhysicalDeviceInfo_T));
 
-      InquiryUnitSerialNumber = (DAC960_SCSI_Inquiry_UnitSerialNumber_T *)
-       kmalloc(sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T), GFP_ATOMIC);
+      InquiryUnitSerialNumber = kmalloc(
+             sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T), GFP_ATOMIC);
       if (InquiryUnitSerialNumber == NULL) {
        kfree(PhysicalDeviceInfo);
        return DAC960_Failure(Controller, "SERIAL NUMBER ALLOCATION");
@@ -2219,7 +2218,7 @@ static void DAC960_SanitizeInquiryData(DAC960_SCSI_Inquiry_T
   Information for DAC960 V1 Firmware Controllers.
 */
 
-static boolean DAC960_V1_ReportDeviceConfiguration(DAC960_Controller_T
+static bool DAC960_V1_ReportDeviceConfiguration(DAC960_Controller_T
                                                   *Controller)
 {
   int LogicalDriveNumber, Channel, TargetID;
@@ -2316,7 +2315,7 @@ static boolean DAC960_V1_ReportDeviceConfiguration(DAC960_Controller_T
   Information for DAC960 V2 Firmware Controllers.
 */
 
-static boolean DAC960_V2_ReportDeviceConfiguration(DAC960_Controller_T
+static bool DAC960_V2_ReportDeviceConfiguration(DAC960_Controller_T
                                                   *Controller)
 {
   int PhysicalDeviceIndex, LogicalDriveNumber;
@@ -2501,7 +2500,7 @@ static boolean DAC960_V2_ReportDeviceConfiguration(DAC960_Controller_T
   associated with Controller.
 */
 
-static boolean DAC960_RegisterBlockDevice(DAC960_Controller_T *Controller)
+static bool DAC960_RegisterBlockDevice(DAC960_Controller_T *Controller)
 {
   int MajorNumber = DAC960_MAJOR + Controller->ControllerNumber;
   int n;
@@ -2582,7 +2581,7 @@ static void DAC960_ComputeGenericDiskInfo(DAC960_Controller_T *Controller)
   It returns true for fatal errors and false otherwise.
 */
 
-static boolean DAC960_ReportErrorStatus(DAC960_Controller_T *Controller,
+static bool DAC960_ReportErrorStatus(DAC960_Controller_T *Controller,
                                        unsigned char ErrorStatus,
                                        unsigned char Parameter0,
                                        unsigned char Parameter1)
@@ -3048,7 +3047,7 @@ Failure:
   DAC960_InitializeController initializes Controller.
 */
 
-static boolean 
+static bool 
 DAC960_InitializeController(DAC960_Controller_T *Controller)
 {
   if (DAC960_ReadControllerConfiguration(Controller) &&
@@ -3445,8 +3444,8 @@ static void DAC960_RequestFunction(struct request_queue *RequestQueue)
   individual Buffer.
 */
 
-static inline boolean DAC960_ProcessCompletedRequest(DAC960_Command_T *Command,
-                                                boolean SuccessfulIO)
+static inline bool DAC960_ProcessCompletedRequest(DAC960_Command_T *Command,
+                                                bool SuccessfulIO)
 {
        struct request *Request = Command->Request;
        int UpToDate;
@@ -3572,7 +3571,7 @@ static void DAC960_V1_ProcessCompletedCommand(DAC960_Command_T *Command)
   else if (CommandType == DAC960_ReadRetryCommand ||
           CommandType == DAC960_WriteRetryCommand)
     {
-      boolean normal_completion;
+      bool normal_completion;
 #ifdef FORCE_RETRY_FAILURE_DEBUG
       static int retry_count = 1;
 #endif
@@ -4659,7 +4658,7 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command)
   else if (CommandType == DAC960_ReadRetryCommand ||
           CommandType == DAC960_WriteRetryCommand)
     {
-      boolean normal_completion;
+      bool normal_completion;
 
 #ifdef FORCE_RETRY_FAILURE_DEBUG
       static int retry_count = 1;
@@ -4949,8 +4948,8 @@ static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command)
              PhysicalDevice.LogicalUnit = NewLogicalDeviceInfo->LogicalUnit;
              Controller->V2.LogicalDriveToVirtualDevice[LogicalDeviceNumber] =
                PhysicalDevice;
-             LogicalDeviceInfo = (DAC960_V2_LogicalDeviceInfo_T *)
-               kmalloc(sizeof(DAC960_V2_LogicalDeviceInfo_T), GFP_ATOMIC);
+             LogicalDeviceInfo = kmalloc(sizeof(DAC960_V2_LogicalDeviceInfo_T),
+                                         GFP_ATOMIC);
              Controller->V2.LogicalDeviceInformation[LogicalDeviceNumber] =
                LogicalDeviceInfo;
              DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
@@ -5632,7 +5631,7 @@ static void DAC960_MonitoringTimerFunction(unsigned long TimerData)
        &Controller->V2.ControllerInformation;
       unsigned int StatusChangeCounter =
        Controller->V2.HealthStatusBuffer->StatusChangeCounter;
-      boolean ForceMonitoringCommand = false;
+      bool ForceMonitoringCommand = false;
       if (time_after(jiffies, Controller->SecondaryMonitoringTime
          + DAC960_SecondaryMonitoringInterval))
        {
@@ -5696,7 +5695,7 @@ static void DAC960_MonitoringTimerFunction(unsigned long TimerData)
   necessary.  It returns true if there is enough room and false otherwise.
 */
 
-static boolean DAC960_CheckStatusBuffer(DAC960_Controller_T *Controller,
+static bool DAC960_CheckStatusBuffer(DAC960_Controller_T *Controller,
                                        unsigned int ByteCount)
 {
   unsigned char *NewStatusBuffer;
@@ -5709,14 +5708,14 @@ static boolean DAC960_CheckStatusBuffer(DAC960_Controller_T *Controller,
       unsigned int NewStatusBufferLength = DAC960_InitialStatusBufferSize;
       while (NewStatusBufferLength < ByteCount)
        NewStatusBufferLength *= 2;
-      Controller->CombinedStatusBuffer =
-       (unsigned char *) kmalloc(NewStatusBufferLength, GFP_ATOMIC);
+      Controller->CombinedStatusBuffer = kmalloc(NewStatusBufferLength,
+                                                 GFP_ATOMIC);
       if (Controller->CombinedStatusBuffer == NULL) return false;
       Controller->CombinedStatusBufferLength = NewStatusBufferLength;
       return true;
     }
-  NewStatusBuffer = (unsigned char *)
-    kmalloc(2 * Controller->CombinedStatusBufferLength, GFP_ATOMIC);
+  NewStatusBuffer = kmalloc(2 * Controller->CombinedStatusBufferLength,
+                            GFP_ATOMIC);
   if (NewStatusBuffer == NULL)
     {
       DAC960_Warning("Unable to expand Combined Status Buffer - Truncating\n",
@@ -5744,7 +5743,7 @@ static void DAC960_Message(DAC960_MessageLevel_T MessageLevel,
                           ...)
 {
   static unsigned char Buffer[DAC960_LineBufferSize];
-  static boolean BeginningOfLine = true;
+  static bool BeginningOfLine = true;
   va_list Arguments;
   int Length = 0;
   va_start(Arguments, Controller);
@@ -5837,7 +5836,7 @@ static void DAC960_Message(DAC960_MessageLevel_T MessageLevel,
   Channel and TargetID and returns true on success and false on failure.
 */
 
-static boolean DAC960_ParsePhysicalDevice(DAC960_Controller_T *Controller,
+static bool DAC960_ParsePhysicalDevice(DAC960_Controller_T *Controller,
                                          char *UserCommandString,
                                          unsigned char *Channel,
                                          unsigned char *TargetID)
@@ -5870,7 +5869,7 @@ static boolean DAC960_ParsePhysicalDevice(DAC960_Controller_T *Controller,
   returns true on success and false on failure.
 */
 
-static boolean DAC960_ParseLogicalDrive(DAC960_Controller_T *Controller,
+static bool DAC960_ParseLogicalDrive(DAC960_Controller_T *Controller,
                                        char *UserCommandString,
                                        unsigned char *LogicalDriveNumber)
 {
@@ -5951,7 +5950,7 @@ static void DAC960_V1_SetDeviceState(DAC960_Controller_T *Controller,
   Controllers.
 */
 
-static boolean DAC960_V1_ExecuteUserCommand(DAC960_Controller_T *Controller,
+static bool DAC960_V1_ExecuteUserCommand(DAC960_Controller_T *Controller,
                                            unsigned char *UserCommand)
 {
   DAC960_Command_T *Command;
@@ -6166,7 +6165,7 @@ failure:
   on failure.
 */
 
-static boolean DAC960_V2_TranslatePhysicalDevice(DAC960_Command_T *Command,
+static bool DAC960_V2_TranslatePhysicalDevice(DAC960_Command_T *Command,
                                                 unsigned char Channel,
                                                 unsigned char TargetID,
                                                 unsigned short
@@ -6213,7 +6212,7 @@ static boolean DAC960_V2_TranslatePhysicalDevice(DAC960_Command_T *Command,
   Controllers.
 */
 
-static boolean DAC960_V2_ExecuteUserCommand(DAC960_Controller_T *Controller,
+static bool DAC960_V2_ExecuteUserCommand(DAC960_Controller_T *Controller,
                                            unsigned char *UserCommand)
 {
   DAC960_Command_T *Command;
@@ -7025,7 +7024,7 @@ static int DAC960_gam_ioctl(struct inode *inode, struct file *file,
   return -EINVAL;
 }
 
-static struct file_operations DAC960_gam_fops = {
+static const struct file_operations DAC960_gam_fops = {
        .owner          = THIS_MODULE,
        .ioctl          = DAC960_gam_ioctl
 };
index 6148073532b2951ec9172f6ea0fc069fec58baa0..f5e2436c39aa08936494f5867ef1e30b70796490 100644 (file)
 #define DAC690_V1_PciDmaMask   0xffffffff
 #define DAC690_V2_PciDmaMask   0xffffffffffffffffULL
 
-/*
-  Define a Boolean data type.
-*/
-
-typedef bool boolean;
-
-
 /*
   Define a 32/64 bit I/O Address data type.
 */
@@ -139,25 +132,25 @@ typedef struct DAC960_SCSI_Inquiry
   unsigned char PeripheralDeviceType:5;                        /* Byte 0 Bits 0-4 */
   unsigned char PeripheralQualifier:3;                 /* Byte 0 Bits 5-7 */
   unsigned char DeviceTypeModifier:7;                  /* Byte 1 Bits 0-6 */
-  boolean RMB:1;                                       /* Byte 1 Bit 7 */
+  bool RMB:1;                                          /* Byte 1 Bit 7 */
   unsigned char ANSI_ApprovedVersion:3;                        /* Byte 2 Bits 0-2 */
   unsigned char ECMA_Version:3;                                /* Byte 2 Bits 3-5 */
   unsigned char ISO_Version:2;                         /* Byte 2 Bits 6-7 */
   unsigned char ResponseDataFormat:4;                  /* Byte 3 Bits 0-3 */
   unsigned char :2;                                    /* Byte 3 Bits 4-5 */
-  boolean TrmIOP:1;                                    /* Byte 3 Bit 6 */
-  boolean AENC:1;                                      /* Byte 3 Bit 7 */
+  bool TrmIOP:1;                                       /* Byte 3 Bit 6 */
+  bool AENC:1;                                         /* Byte 3 Bit 7 */
   unsigned char AdditionalLength;                      /* Byte 4 */
   unsigned char :8;                                    /* Byte 5 */
   unsigned char :8;                                    /* Byte 6 */
-  boolean SftRe:1;                                     /* Byte 7 Bit 0 */
-  boolean CmdQue:1;                                    /* Byte 7 Bit 1 */
-  boolean :1;                                          /* Byte 7 Bit 2 */
-  boolean Linked:1;                                    /* Byte 7 Bit 3 */
-  boolean Sync:1;                                      /* Byte 7 Bit 4 */
-  boolean WBus16:1;                                    /* Byte 7 Bit 5 */
-  boolean WBus32:1;                                    /* Byte 7 Bit 6 */
-  boolean RelAdr:1;                                    /* Byte 7 Bit 7 */
+  bool SftRe:1;                                                /* Byte 7 Bit 0 */
+  bool CmdQue:1;                                       /* Byte 7 Bit 1 */
+  bool :1;                                             /* Byte 7 Bit 2 */
+  bool Linked:1;                                       /* Byte 7 Bit 3 */
+  bool Sync:1;                                         /* Byte 7 Bit 4 */
+  bool WBus16:1;                                       /* Byte 7 Bit 5 */
+  bool WBus32:1;                                       /* Byte 7 Bit 6 */
+  bool RelAdr:1;                                       /* Byte 7 Bit 7 */
   unsigned char VendorIdentification[8];               /* Bytes 8-15 */
   unsigned char ProductIdentification[16];             /* Bytes 16-31 */
   unsigned char ProductRevisionLevel[4];               /* Bytes 32-35 */
@@ -215,13 +208,13 @@ DAC960_SCSI_RequestSenseKey_T;
 typedef struct DAC960_SCSI_RequestSense
 {
   unsigned char ErrorCode:7;                           /* Byte 0 Bits 0-6 */
-  boolean Valid:1;                                     /* Byte 0 Bit 7 */
+  bool Valid:1;                                                /* Byte 0 Bit 7 */
   unsigned char SegmentNumber;                         /* Byte 1 */
   DAC960_SCSI_RequestSenseKey_T SenseKey:4;            /* Byte 2 Bits 0-3 */
   unsigned char :1;                                    /* Byte 2 Bit 4 */
-  boolean ILI:1;                                       /* Byte 2 Bit 5 */
-  boolean EOM:1;                                       /* Byte 2 Bit 6 */
-  boolean Filemark:1;                                  /* Byte 2 Bit 7 */
+  bool ILI:1;                                          /* Byte 2 Bit 5 */
+  bool EOM:1;                                          /* Byte 2 Bit 6 */
+  bool Filemark:1;                                     /* Byte 2 Bit 7 */
   unsigned char Information[4];                                /* Bytes 3-6 */
   unsigned char AdditionalSenseLength;                 /* Byte 7 */
   unsigned char CommandSpecificInformation[4];         /* Bytes 8-11 */
@@ -381,8 +374,8 @@ typedef struct DAC960_V1_Enquiry
   unsigned int LogicalDriveSizes[32];                  /* Bytes 4-131 */
   unsigned short FlashAge;                             /* Bytes 132-133 */
   struct {
-    boolean DeferredWriteError:1;                      /* Byte 134 Bit 0 */
-    boolean BatteryLow:1;                              /* Byte 134 Bit 1 */
+    bool DeferredWriteError:1;                         /* Byte 134 Bit 0 */
+    bool BatteryLow:1;                                 /* Byte 134 Bit 1 */
     unsigned char :6;                                  /* Byte 134 Bits 2-7 */
   } StatusFlags;
   unsigned char :8;                                    /* Byte 135 */
@@ -410,7 +403,7 @@ typedef struct DAC960_V1_Enquiry
   unsigned char RebuildCount;                          /* Byte 150 */
   struct {
     unsigned char :3;                                  /* Byte 151 Bits 0-2 */
-    boolean BatteryBackupUnitPresent:1;                        /* Byte 151 Bit 3 */
+    bool BatteryBackupUnitPresent:1;                   /* Byte 151 Bit 3 */
     unsigned char :3;                                  /* Byte 151 Bits 4-6 */
     unsigned char :1;                                  /* Byte 151 Bit 7 */
   } MiscFlags;
@@ -492,8 +485,8 @@ typedef struct DAC960_V1_Enquiry2
       DAC960_V1_ErrorCorrection_ECC =          0x2,
       DAC960_V1_ErrorCorrection_Last =         0x7
     } __attribute__ ((packed)) ErrorCorrection:3;      /* Byte 40 Bits 3-5 */
-    boolean FastPageMode:1;                            /* Byte 40 Bit 6 */
-    boolean LowPowerMemory:1;                          /* Byte 40 Bit 7 */
+    bool FastPageMode:1;                               /* Byte 40 Bit 6 */
+    bool LowPowerMemory:1;                             /* Byte 40 Bit 7 */
     unsigned char :8;                                  /* Bytes 41 */
   } MemoryType;
   unsigned short ClockSpeed;                           /* Bytes 42-43 */
@@ -538,7 +531,7 @@ typedef struct DAC960_V1_Enquiry2
       DAC960_V1_Ultra =                                0x1,
       DAC960_V1_Ultra2 =                       0x2
     } __attribute__ ((packed)) BusSpeed:2;             /* Byte 106 Bits 2-3 */
-    boolean Differential:1;                            /* Byte 106 Bit 4 */
+    bool Differential:1;                               /* Byte 106 Bit 4 */
     unsigned char :3;                                  /* Byte 106 Bits 5-7 */
   } SCSICapability;
   unsigned char :8;                                    /* Byte 107 */
@@ -554,10 +547,10 @@ typedef struct DAC960_V1_Enquiry2
   } __attribute__ ((packed)) FaultManagementType;      /* Byte 114 */
   unsigned char :8;                                    /* Byte 115 */
   struct {
-    boolean Clustering:1;                              /* Byte 116 Bit 0 */
-    boolean MylexOnlineRAIDExpansion:1;                        /* Byte 116 Bit 1 */
-    boolean ReadAhead:1;                               /* Byte 116 Bit 2 */
-    boolean BackgroundInitialization:1;                        /* Byte 116 Bit 3 */
+    bool Clustering:1;                                 /* Byte 116 Bit 0 */
+    bool MylexOnlineRAIDExpansion:1;                   /* Byte 116 Bit 1 */
+    bool ReadAhead:1;                                  /* Byte 116 Bit 2 */
+    bool BackgroundInitialization:1;                   /* Byte 116 Bit 3 */
     unsigned int :28;                                  /* Bytes 116-119 */
   } FirmwareFeatures;
   unsigned int :32;                                    /* Bytes 120-123 */
@@ -589,7 +582,7 @@ typedef struct DAC960_V1_LogicalDriveInformation
   unsigned int LogicalDriveSize;                       /* Bytes 0-3 */
   DAC960_V1_LogicalDriveState_T LogicalDriveState;     /* Byte 4 */
   unsigned char RAIDLevel:7;                           /* Byte 5 Bits 0-6 */
-  boolean WriteBack:1;                                 /* Byte 5 Bit 7 */
+  bool WriteBack:1;                                    /* Byte 5 Bit 7 */
   unsigned short :16;                                  /* Bytes 6-7 */
 }
 DAC960_V1_LogicalDriveInformation_T;
@@ -630,13 +623,13 @@ typedef struct DAC960_V1_EventLogEntry
   unsigned char :2;                                    /* Byte 3 Bits 6-7 */
   unsigned short SequenceNumber;                       /* Bytes 4-5 */
   unsigned char ErrorCode:7;                           /* Byte 6 Bits 0-6 */
-  boolean Valid:1;                                     /* Byte 6 Bit 7 */
+  bool Valid:1;                                                /* Byte 6 Bit 7 */
   unsigned char SegmentNumber;                         /* Byte 7 */
   DAC960_SCSI_RequestSenseKey_T SenseKey:4;            /* Byte 8 Bits 0-3 */
   unsigned char :1;                                    /* Byte 8 Bit 4 */
-  boolean ILI:1;                                       /* Byte 8 Bit 5 */
-  boolean EOM:1;                                       /* Byte 8 Bit 6 */
-  boolean Filemark:1;                                  /* Byte 8 Bit 7 */
+  bool ILI:1;                                          /* Byte 8 Bit 5 */
+  bool EOM:1;                                          /* Byte 8 Bit 6 */
+  bool Filemark:1;                                     /* Byte 8 Bit 7 */
   unsigned char Information[4];                                /* Bytes 9-12 */
   unsigned char AdditionalSenseLength;                 /* Byte 13 */
   unsigned char CommandSpecificInformation[4];         /* Bytes 14-17 */
@@ -670,7 +663,7 @@ DAC960_V1_PhysicalDeviceState_T;
 
 typedef struct DAC960_V1_DeviceState
 {
-  boolean Present:1;                                   /* Byte 0 Bit 0 */
+  bool Present:1;                                      /* Byte 0 Bit 0 */
   unsigned char :7;                                    /* Byte 0 Bits 1-7 */
   enum {
     DAC960_V1_OtherType =                      0x0,
@@ -678,12 +671,12 @@ typedef struct DAC960_V1_DeviceState
     DAC960_V1_SequentialType =                 0x2,
     DAC960_V1_CDROM_or_WORM_Type =             0x3
     } __attribute__ ((packed)) DeviceType:2;           /* Byte 1 Bits 0-1 */
-  boolean :1;                                          /* Byte 1 Bit 2 */
-  boolean Fast20:1;                                    /* Byte 1 Bit 3 */
-  boolean Sync:1;                                      /* Byte 1 Bit 4 */
-  boolean Fast:1;                                      /* Byte 1 Bit 5 */
-  boolean Wide:1;                                      /* Byte 1 Bit 6 */
-  boolean TaggedQueuingSupported:1;                    /* Byte 1 Bit 7 */
+  bool :1;                                             /* Byte 1 Bit 2 */
+  bool Fast20:1;                                       /* Byte 1 Bit 3 */
+  bool Sync:1;                                         /* Byte 1 Bit 4 */
+  bool Fast:1;                                         /* Byte 1 Bit 5 */
+  bool Wide:1;                                         /* Byte 1 Bit 6 */
+  bool TaggedQueuingSupported:1;                       /* Byte 1 Bit 7 */
   DAC960_V1_PhysicalDeviceState_T DeviceState;         /* Byte 2 */
   unsigned char :8;                                    /* Byte 3 */
   unsigned char SynchronousMultiplier;                 /* Byte 4 */
@@ -765,15 +758,15 @@ DAC960_V1_ErrorTable_T;
 typedef struct DAC960_V1_Config2
 {
   unsigned char :1;                                    /* Byte 0 Bit 0 */
-  boolean ActiveNegationEnabled:1;                     /* Byte 0 Bit 1 */
+  bool ActiveNegationEnabled:1;                                /* Byte 0 Bit 1 */
   unsigned char :5;                                    /* Byte 0 Bits 2-6 */
-  boolean NoRescanIfResetReceivedDuringScan:1;         /* Byte 0 Bit 7 */
-  boolean StorageWorksSupportEnabled:1;                        /* Byte 1 Bit 0 */
-  boolean HewlettPackardSupportEnabled:1;              /* Byte 1 Bit 1 */
-  boolean NoDisconnectOnFirstCommand:1;                        /* Byte 1 Bit 2 */
+  bool NoRescanIfResetReceivedDuringScan:1;            /* Byte 0 Bit 7 */
+  bool StorageWorksSupportEnabled:1;                   /* Byte 1 Bit 0 */
+  bool HewlettPackardSupportEnabled:1;                 /* Byte 1 Bit 1 */
+  bool NoDisconnectOnFirstCommand:1;                   /* Byte 1 Bit 2 */
   unsigned char :2;                                    /* Byte 1 Bits 3-4 */
-  boolean AEMI_ARM:1;                                  /* Byte 1 Bit 5 */
-  boolean AEMI_OFM:1;                                  /* Byte 1 Bit 6 */
+  bool AEMI_ARM:1;                                     /* Byte 1 Bit 5 */
+  bool AEMI_OFM:1;                                     /* Byte 1 Bit 6 */
   unsigned char :1;                                    /* Byte 1 Bit 7 */
   enum {
     DAC960_V1_OEMID_Mylex =                    0x00,
@@ -787,13 +780,13 @@ typedef struct DAC960_V1_Config2
   unsigned char PhysicalSector;                                /* Byte 4 */
   unsigned char LogicalSector;                         /* Byte 5 */
   unsigned char BlockFactor;                           /* Byte 6 */
-  boolean ReadAheadEnabled:1;                          /* Byte 7 Bit 0 */
-  boolean LowBIOSDelay:1;                              /* Byte 7 Bit 1 */
+  bool ReadAheadEnabled:1;                             /* Byte 7 Bit 0 */
+  bool LowBIOSDelay:1;                                 /* Byte 7 Bit 1 */
   unsigned char :2;                                    /* Byte 7 Bits 2-3 */
-  boolean ReassignRestrictedToOneSector:1;             /* Byte 7 Bit 4 */
+  bool ReassignRestrictedToOneSector:1;                        /* Byte 7 Bit 4 */
   unsigned char :1;                                    /* Byte 7 Bit 5 */
-  boolean ForceUnitAccessDuringWriteRecovery:1;                /* Byte 7 Bit 6 */
-  boolean EnableLeftSymmetricRAID5Algorithm:1;         /* Byte 7 Bit 7 */
+  bool ForceUnitAccessDuringWriteRecovery:1;           /* Byte 7 Bit 6 */
+  bool EnableLeftSymmetricRAID5Algorithm:1;            /* Byte 7 Bit 7 */
   unsigned char DefaultRebuildRate;                    /* Byte 8 */
   unsigned char :8;                                    /* Byte 9 */
   unsigned char BlocksPerCacheLine;                    /* Byte 10 */
@@ -805,10 +798,10 @@ typedef struct DAC960_V1_Config2
       DAC960_V1_Sync_5MHz =                    0x2,
       DAC960_V1_Sync_10or20MHz =               0x3     /* Byte 11 Bits 0-1 */
     } __attribute__ ((packed)) Speed:2;
-    boolean Force8Bit:1;                               /* Byte 11 Bit 2 */
-    boolean DisableFast20:1;                           /* Byte 11 Bit 3 */
+    bool Force8Bit:1;                                  /* Byte 11 Bit 2 */
+    bool DisableFast20:1;                              /* Byte 11 Bit 3 */
     unsigned char :3;                                  /* Byte 11 Bits 4-6 */
-    boolean EnableTaggedQueuing:1;                     /* Byte 11 Bit 7 */
+    bool EnableTaggedQueuing:1;                                /* Byte 11 Bit 7 */
   } __attribute__ ((packed)) ChannelParameters[6];     /* Bytes 12-17 */
   unsigned char SCSIInitiatorID;                       /* Byte 18 */
   unsigned char :8;                                    /* Byte 19 */
@@ -819,8 +812,8 @@ typedef struct DAC960_V1_Config2
   unsigned char SimultaneousDeviceSpinUpCount;         /* Byte 21 */
   unsigned char SecondsDelayBetweenSpinUps;            /* Byte 22 */
   unsigned char Reserved1[29];                         /* Bytes 23-51 */
-  boolean BIOSDisabled:1;                              /* Byte 52 Bit 0 */
-  boolean CDROMBootEnabled:1;                          /* Byte 52 Bit 1 */
+  bool BIOSDisabled:1;                                 /* Byte 52 Bit 0 */
+  bool CDROMBootEnabled:1;                             /* Byte 52 Bit 1 */
   unsigned char :3;                                    /* Byte 52 Bits 2-4 */
   enum {
     DAC960_V1_Geometry_128_32 =                        0x0,
@@ -849,7 +842,7 @@ typedef struct DAC960_V1_DCDB
     DAC960_V1_DCDB_DataTransferSystemToDevice = 2,
     DAC960_V1_DCDB_IllegalDataTransfer =       3
   } __attribute__ ((packed)) Direction:2;               /* Byte 1 Bits 0-1 */
-  boolean EarlyStatus:1;                                /* Byte 1 Bit 2 */
+  bool EarlyStatus:1;                                   /* Byte 1 Bit 2 */
   unsigned char :1;                                     /* Byte 1 Bit 3 */
   enum {
     DAC960_V1_DCDB_Timeout_24_hours =          0,
@@ -857,8 +850,8 @@ typedef struct DAC960_V1_DCDB
     DAC960_V1_DCDB_Timeout_60_seconds =                2,
     DAC960_V1_DCDB_Timeout_10_minutes =                3
   } __attribute__ ((packed)) Timeout:2;                         /* Byte 1 Bits 4-5 */
-  boolean NoAutomaticRequestSense:1;                    /* Byte 1 Bit 6 */
-  boolean DisconnectPermitted:1;                        /* Byte 1 Bit 7 */
+  bool NoAutomaticRequestSense:1;                       /* Byte 1 Bit 6 */
+  bool DisconnectPermitted:1;                           /* Byte 1 Bit 7 */
   unsigned short TransferLength;                        /* Bytes 2-3 */
   DAC960_BusAddress32_T BusAddress;                     /* Bytes 4-7 */
   unsigned char CDBLength:4;                            /* Byte 8 Bits 0-3 */
@@ -920,7 +913,7 @@ typedef union DAC960_V1_CommandMailbox
     DAC960_V1_CommandIdentifier_T CommandIdentifier;   /* Byte 1 */
     unsigned char Dummy1[5];                           /* Bytes 2-6 */
     unsigned char LogicalDriveNumber:6;                        /* Byte 7 Bits 0-6 */
-    boolean AutoRestore:1;                             /* Byte 7 Bit 7 */
+    bool AutoRestore:1;                                        /* Byte 7 Bit 7 */
     unsigned char Dummy2[8];                           /* Bytes 8-15 */
   } __attribute__ ((packed)) Type3C;
   struct {
@@ -1070,9 +1063,9 @@ typedef struct DAC960_V2_MemoryType
     DAC960_V2_MemoryType_SDRAM =               0x04,
     DAC960_V2_MemoryType_Last =                        0x1F
   } __attribute__ ((packed)) MemoryType:5;             /* Byte 0 Bits 0-4 */
-  boolean :1;                                          /* Byte 0 Bit 5 */
-  boolean MemoryParity:1;                              /* Byte 0 Bit 6 */
-  boolean MemoryECC:1;                                 /* Byte 0 Bit 7 */
+  bool :1;                                             /* Byte 0 Bit 5 */
+  bool MemoryParity:1;                                 /* Byte 0 Bit 6 */
+  bool MemoryECC:1;                                    /* Byte 0 Bit 7 */
 }
 DAC960_V2_MemoryType_T;
 
@@ -1187,13 +1180,13 @@ typedef struct DAC960_V2_ControllerInfo
   unsigned char OEM_Code;                              /* Byte 131 */
   unsigned char VendorName[16];                                /* Bytes 132-147 */
   /* Other Physical/Controller/Operation Information */
-  boolean BBU_Present:1;                               /* Byte 148 Bit 0 */
-  boolean ActiveActiveClusteringMode:1;                        /* Byte 148 Bit 1 */
+  bool BBU_Present:1;                                  /* Byte 148 Bit 0 */
+  bool ActiveActiveClusteringMode:1;                   /* Byte 148 Bit 1 */
   unsigned char :6;                                    /* Byte 148 Bits 2-7 */
   unsigned char :8;                                    /* Byte 149 */
   unsigned short :16;                                  /* Bytes 150-151 */
   /* Physical Device Scan Information */
-  boolean PhysicalScanActive:1;                                /* Byte 152 Bit 0 */
+  bool PhysicalScanActive:1;                           /* Byte 152 Bit 0 */
   unsigned char :7;                                    /* Byte 152 Bits 1-7 */
   unsigned char PhysicalDeviceChannelNumber;           /* Byte 153 */
   unsigned char PhysicalDeviceTargetID;                        /* Byte 154 */
@@ -1305,8 +1298,8 @@ typedef struct DAC960_V2_ControllerInfo
   unsigned int FreeIOP;                                        /* Bytes 468-471 */
   unsigned short MaximumCombLengthInBlocks;            /* Bytes 472-473 */
   unsigned short NumberOfConfigurationGroups;          /* Bytes 474-475 */
-  boolean InstallationAbortStatus:1;                   /* Byte 476 Bit 0 */
-  boolean MaintenanceModeStatus:1;                     /* Byte 476 Bit 1 */
+  bool InstallationAbortStatus:1;                      /* Byte 476 Bit 0 */
+  bool MaintenanceModeStatus:1;                                /* Byte 476 Bit 1 */
   unsigned int :24;                                    /* Bytes 476-479 */
   unsigned char Reserved10[32];                                /* Bytes 480-511 */
   unsigned char Reserved11[512];                       /* Bytes 512-1023 */
@@ -1357,33 +1350,33 @@ typedef struct DAC960_V2_LogicalDeviceInfo
       DAC960_V2_IntelligentWriteCacheEnabled = 0x3,
       DAC960_V2_WriteCache_Last =              0x7
     } __attribute__ ((packed)) WriteCache:3;           /* Byte 8 Bits 3-5 */
-    boolean :1;                                                /* Byte 8 Bit 6 */
-    boolean LogicalDeviceInitialized:1;                        /* Byte 8 Bit 7 */
+    bool :1;                                           /* Byte 8 Bit 6 */
+    bool LogicalDeviceInitialized:1;                   /* Byte 8 Bit 7 */
   } LogicalDeviceControl;                              /* Byte 8 */
   /* Logical Device Operations Status */
-  boolean ConsistencyCheckInProgress:1;                        /* Byte 9 Bit 0 */
-  boolean RebuildInProgress:1;                         /* Byte 9 Bit 1 */
-  boolean BackgroundInitializationInProgress:1;                /* Byte 9 Bit 2 */
-  boolean ForegroundInitializationInProgress:1;                /* Byte 9 Bit 3 */
-  boolean DataMigrationInProgress:1;                   /* Byte 9 Bit 4 */
-  boolean PatrolOperationInProgress:1;                 /* Byte 9 Bit 5 */
+  bool ConsistencyCheckInProgress:1;                   /* Byte 9 Bit 0 */
+  bool RebuildInProgress:1;                            /* Byte 9 Bit 1 */
+  bool BackgroundInitializationInProgress:1;           /* Byte 9 Bit 2 */
+  bool ForegroundInitializationInProgress:1;           /* Byte 9 Bit 3 */
+  bool DataMigrationInProgress:1;                      /* Byte 9 Bit 4 */
+  bool PatrolOperationInProgress:1;                    /* Byte 9 Bit 5 */
   unsigned char :2;                                    /* Byte 9 Bits 6-7 */
   unsigned char RAID5WriteUpdate;                      /* Byte 10 */
   unsigned char RAID5Algorithm;                                /* Byte 11 */
   unsigned short LogicalDeviceNumber;                  /* Bytes 12-13 */
   /* BIOS Info */
-  boolean BIOSDisabled:1;                              /* Byte 14 Bit 0 */
-  boolean CDROMBootEnabled:1;                          /* Byte 14 Bit 1 */
-  boolean DriveCoercionEnabled:1;                      /* Byte 14 Bit 2 */
-  boolean WriteSameDisabled:1;                         /* Byte 14 Bit 3 */
-  boolean HBA_ModeEnabled:1;                           /* Byte 14 Bit 4 */
+  bool BIOSDisabled:1;                                 /* Byte 14 Bit 0 */
+  bool CDROMBootEnabled:1;                             /* Byte 14 Bit 1 */
+  bool DriveCoercionEnabled:1;                         /* Byte 14 Bit 2 */
+  bool WriteSameDisabled:1;                            /* Byte 14 Bit 3 */
+  bool HBA_ModeEnabled:1;                              /* Byte 14 Bit 4 */
   enum {
     DAC960_V2_Geometry_128_32 =                        0x0,
     DAC960_V2_Geometry_255_63 =                        0x1,
     DAC960_V2_Geometry_Reserved1 =             0x2,
     DAC960_V2_Geometry_Reserved2 =             0x3
   } __attribute__ ((packed)) DriveGeometry:2;          /* Byte 14 Bits 5-6 */
-  boolean SuperReadAheadEnabled:1;                     /* Byte 14 Bit 7 */
+  bool SuperReadAheadEnabled:1;                                /* Byte 14 Bit 7 */
   unsigned char :8;                                    /* Byte 15 */
   /* Error Counters */
   unsigned short SoftErrors;                           /* Bytes 16-17 */
@@ -1446,13 +1439,13 @@ typedef struct DAC960_V2_PhysicalDeviceInfo
   unsigned char TargetID;                              /* Byte 2 */
   unsigned char LogicalUnit;                           /* Byte 3 */
   /* Configuration Status Bits */
-  boolean PhysicalDeviceFaultTolerant:1;               /* Byte 4 Bit 0 */
-  boolean PhysicalDeviceConnected:1;                   /* Byte 4 Bit 1 */
-  boolean PhysicalDeviceLocalToController:1;           /* Byte 4 Bit 2 */
+  bool PhysicalDeviceFaultTolerant:1;                  /* Byte 4 Bit 0 */
+  bool PhysicalDeviceConnected:1;                      /* Byte 4 Bit 1 */
+  bool PhysicalDeviceLocalToController:1;              /* Byte 4 Bit 2 */
   unsigned char :5;                                    /* Byte 4 Bits 3-7 */
   /* Multiple Host/Controller Status Bits */
-  boolean RemoteHostSystemDead:1;                      /* Byte 5 Bit 0 */
-  boolean RemoteControllerDead:1;                      /* Byte 5 Bit 1 */
+  bool RemoteHostSystemDead:1;                         /* Byte 5 Bit 0 */
+  bool RemoteControllerDead:1;                         /* Byte 5 Bit 1 */
   unsigned char :6;                                    /* Byte 5 Bits 2-7 */
   DAC960_V2_PhysicalDeviceState_T PhysicalDeviceState; /* Byte 6 */
   unsigned char NegotiatedDataWidthBits;               /* Byte 7 */
@@ -1464,12 +1457,12 @@ typedef struct DAC960_V2_PhysicalDeviceInfo
   unsigned char NetworkAddress[16];                    /* Bytes 16-31 */
   unsigned short MaximumTags;                          /* Bytes 32-33 */
   /* Physical Device Operations Status */
-  boolean ConsistencyCheckInProgress:1;                        /* Byte 34 Bit 0 */
-  boolean RebuildInProgress:1;                         /* Byte 34 Bit 1 */
-  boolean MakingDataConsistentInProgress:1;            /* Byte 34 Bit 2 */
-  boolean PhysicalDeviceInitializationInProgress:1;    /* Byte 34 Bit 3 */
-  boolean DataMigrationInProgress:1;                   /* Byte 34 Bit 4 */
-  boolean PatrolOperationInProgress:1;                 /* Byte 34 Bit 5 */
+  bool ConsistencyCheckInProgress:1;                   /* Byte 34 Bit 0 */
+  bool RebuildInProgress:1;                            /* Byte 34 Bit 1 */
+  bool MakingDataConsistentInProgress:1;               /* Byte 34 Bit 2 */
+  bool PhysicalDeviceInitializationInProgress:1;       /* Byte 34 Bit 3 */
+  bool DataMigrationInProgress:1;                      /* Byte 34 Bit 4 */
+  bool PatrolOperationInProgress:1;                    /* Byte 34 Bit 5 */
   unsigned char :2;                                    /* Byte 34 Bits 6-7 */
   unsigned char LongOperationStatus;                   /* Byte 35 */
   unsigned char ParityErrors;                          /* Byte 36 */
@@ -1555,14 +1548,14 @@ DAC960_V2_Event_T;
 
 typedef struct DAC960_V2_CommandControlBits
 {
-  boolean ForceUnitAccess:1;                           /* Byte 0 Bit 0 */
-  boolean DisablePageOut:1;                            /* Byte 0 Bit 1 */
-  boolean :1;                                          /* Byte 0 Bit 2 */
-  boolean AdditionalScatterGatherListMemory:1;         /* Byte 0 Bit 3 */
-  boolean DataTransferControllerToHost:1;              /* Byte 0 Bit 4 */
-  boolean :1;                                          /* Byte 0 Bit 5 */
-  boolean NoAutoRequestSense:1;                                /* Byte 0 Bit 6 */
-  boolean DisconnectProhibited:1;                      /* Byte 0 Bit 7 */
+  bool ForceUnitAccess:1;                              /* Byte 0 Bit 0 */
+  bool DisablePageOut:1;                               /* Byte 0 Bit 1 */
+  bool :1;                                             /* Byte 0 Bit 2 */
+  bool AdditionalScatterGatherListMemory:1;            /* Byte 0 Bit 3 */
+  bool DataTransferControllerToHost:1;                 /* Byte 0 Bit 4 */
+  bool :1;                                             /* Byte 0 Bit 5 */
+  bool NoAutoRequestSense:1;                           /* Byte 0 Bit 6 */
+  bool DisconnectProhibited:1;                         /* Byte 0 Bit 7 */
 }
 DAC960_V2_CommandControlBits_T;
 
@@ -1825,8 +1818,8 @@ typedef union DAC960_V2_CommandMailbox
     DAC960_V2_CommandTimeout_T CommandTimeout;         /* Byte 19 */
     unsigned char RequestSenseSize;                    /* Byte 20 */
     unsigned char IOCTL_Opcode;                                /* Byte 21 */
-    boolean RestoreConsistency:1;                      /* Byte 22 Bit 0 */
-    boolean InitializedAreaOnly:1;                     /* Byte 22 Bit 1 */
+    bool RestoreConsistency:1;                         /* Byte 22 Bit 0 */
+    bool InitializedAreaOnly:1;                                /* Byte 22 Bit 1 */
     unsigned char :6;                                  /* Byte 22 Bits 2-7 */
     unsigned char Reserved[9];                         /* Bytes 23-31 */
     DAC960_V2_DataTransferMemoryAddress_T
@@ -2190,7 +2183,7 @@ typedef union DAC960_V1_StatusMailbox
   struct {
     DAC960_V1_CommandIdentifier_T CommandIdentifier;   /* Byte 0 */
     unsigned char :7;                                  /* Byte 1 Bits 0-6 */
-    boolean Valid:1;                                   /* Byte 1 Bit 7 */
+    bool Valid:1;                                      /* Byte 1 Bit 7 */
     DAC960_V1_CommandStatus_T CommandStatus;           /* Bytes 2-3 */
   } Fields;
 }
@@ -2322,12 +2315,12 @@ typedef struct DAC960_Controller
   unsigned long ShutdownMonitoringTimer;
   unsigned long LastProgressReportTime;
   unsigned long LastCurrentStatusTime;
-  boolean ControllerInitialized;
-  boolean MonitoringCommandDeferred;
-  boolean EphemeralProgressMessage;
-  boolean DriveSpinUpMessageDisplayed;
-  boolean MonitoringAlertMode;
-  boolean SuppressEnclosureMessages;
+  bool ControllerInitialized;
+  bool MonitoringCommandDeferred;
+  bool EphemeralProgressMessage;
+  bool DriveSpinUpMessageDisplayed;
+  bool MonitoringAlertMode;
+  bool SuppressEnclosureMessages;
   struct timer_list MonitoringTimer;
   struct gendisk *disks[DAC960_MaxLogicalDrives];
   struct pci_pool *ScatterGatherPool;
@@ -2342,11 +2335,11 @@ typedef struct DAC960_Controller
   DAC960_Command_T InitialCommand;
   DAC960_Command_T *Commands[DAC960_MaxDriverQueueDepth];
   struct proc_dir_entry *ControllerProcEntry;
-  boolean LogicalDriveInitiallyAccessible[DAC960_MaxLogicalDrives];
+  bool LogicalDriveInitiallyAccessible[DAC960_MaxLogicalDrives];
   void (*QueueCommand)(DAC960_Command_T *Command);
-  boolean (*ReadControllerConfiguration)(struct DAC960_Controller *);
-  boolean (*ReadDeviceConfiguration)(struct DAC960_Controller *);
-  boolean (*ReportDeviceConfiguration)(struct DAC960_Controller *);
+  bool (*ReadControllerConfiguration)(struct DAC960_Controller *);
+  bool (*ReadDeviceConfiguration)(struct DAC960_Controller *);
+  bool (*ReportDeviceConfiguration)(struct DAC960_Controller *);
   void (*QueueReadWriteCommand)(DAC960_Command_T *Command);
   union {
     struct {
@@ -2359,21 +2352,21 @@ typedef struct DAC960_Controller
       unsigned short OldEventLogSequenceNumber;
       unsigned short DeviceStateChannel;
       unsigned short DeviceStateTargetID;
-      boolean DualModeMemoryMailboxInterface;
-      boolean BackgroundInitializationStatusSupported;
-      boolean SAFTE_EnclosureManagementEnabled;
-      boolean NeedLogicalDriveInformation;
-      boolean NeedErrorTableInformation;
-      boolean NeedDeviceStateInformation;
-      boolean NeedDeviceInquiryInformation;
-      boolean NeedDeviceSerialNumberInformation;
-      boolean NeedRebuildProgress;
-      boolean NeedConsistencyCheckProgress;
-      boolean NeedBackgroundInitializationStatus;
-      boolean StartDeviceStateScan;
-      boolean RebuildProgressFirst;
-      boolean RebuildFlagPending;
-      boolean RebuildStatusPending;
+      bool DualModeMemoryMailboxInterface;
+      bool BackgroundInitializationStatusSupported;
+      bool SAFTE_EnclosureManagementEnabled;
+      bool NeedLogicalDriveInformation;
+      bool NeedErrorTableInformation;
+      bool NeedDeviceStateInformation;
+      bool NeedDeviceInquiryInformation;
+      bool NeedDeviceSerialNumberInformation;
+      bool NeedRebuildProgress;
+      bool NeedConsistencyCheckProgress;
+      bool NeedBackgroundInitializationStatus;
+      bool StartDeviceStateScan;
+      bool RebuildProgressFirst;
+      bool RebuildFlagPending;
+      bool RebuildStatusPending;
 
       dma_addr_t       FirstCommandMailboxDMA;
       DAC960_V1_CommandMailbox_T *FirstCommandMailbox;
@@ -2432,17 +2425,17 @@ typedef struct DAC960_Controller
       dma_addr_t NewInquiryUnitSerialNumberDMA;
 
       int DeviceResetCount[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets];
-      boolean DirectCommandActive[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets];
+      bool DirectCommandActive[DAC960_V1_MaxChannels][DAC960_V1_MaxTargets];
     } V1;
     struct {
       unsigned int StatusChangeCounter;
       unsigned int NextEventSequenceNumber;
       unsigned int PhysicalDeviceIndex;
-      boolean NeedLogicalDeviceInformation;
-      boolean NeedPhysicalDeviceInformation;
-      boolean NeedDeviceSerialNumberInformation;
-      boolean StartLogicalDeviceInformationScan;
-      boolean StartPhysicalDeviceInformationScan;
+      bool NeedLogicalDeviceInformation;
+      bool NeedPhysicalDeviceInformation;
+      bool NeedDeviceSerialNumberInformation;
+      bool StartLogicalDeviceInformationScan;
+      bool StartPhysicalDeviceInformationScan;
       struct pci_pool *RequestSensePool;
 
       dma_addr_t       FirstCommandMailboxDMA;
@@ -2487,7 +2480,7 @@ typedef struct DAC960_Controller
 
       DAC960_V2_PhysicalDevice_T
        LogicalDriveToVirtualDevice[DAC960_MaxLogicalDrives];
-      boolean LogicalDriveFoundDuringScan[DAC960_MaxLogicalDrives];
+      bool LogicalDriveFoundDuringScan[DAC960_MaxLogicalDrives];
     } V2;
   } FW;
   unsigned char ProgressBuffer[DAC960_ProgressBufferSize];
@@ -2572,17 +2565,17 @@ typedef union DAC960_GEM_InboundDoorBellRegister
   unsigned int All;
   struct {
     unsigned int :24;
-    boolean HardwareMailboxNewCommand:1;
-    boolean AcknowledgeHardwareMailboxStatus:1;
-    boolean GenerateInterrupt:1;
-    boolean ControllerReset:1;
-    boolean MemoryMailboxNewCommand:1;
+    bool HardwareMailboxNewCommand:1;
+    bool AcknowledgeHardwareMailboxStatus:1;
+    bool GenerateInterrupt:1;
+    bool ControllerReset:1;
+    bool MemoryMailboxNewCommand:1;
     unsigned int :3;
   } Write;
   struct {
     unsigned int :24;
-    boolean HardwareMailboxFull:1;
-    boolean InitializationInProgress:1;
+    bool HardwareMailboxFull:1;
+    bool InitializationInProgress:1;
     unsigned int :6;
   } Read;
 }
@@ -2596,14 +2589,14 @@ typedef union DAC960_GEM_OutboundDoorBellRegister
   unsigned int All;
   struct {
     unsigned int :24;
-    boolean AcknowledgeHardwareMailboxInterrupt:1;
-    boolean AcknowledgeMemoryMailboxInterrupt:1;
+    bool AcknowledgeHardwareMailboxInterrupt:1;
+    bool AcknowledgeMemoryMailboxInterrupt:1;
     unsigned int :6;
   } Write;
   struct {
     unsigned int :24;
-    boolean HardwareMailboxStatusAvailable:1;
-    boolean MemoryMailboxStatusAvailable:1;
+    bool HardwareMailboxStatusAvailable:1;
+    bool MemoryMailboxStatusAvailable:1;
     unsigned int :6;
   } Read;
 }
@@ -2635,7 +2628,7 @@ typedef union DAC960_GEM_ErrorStatusRegister
   struct {
     unsigned int :24;
     unsigned int :5;
-    boolean ErrorStatusPending:1;
+    bool ErrorStatusPending:1;
     unsigned int :2;
   } Bits;
 }
@@ -2697,7 +2690,7 @@ void DAC960_GEM_MemoryMailboxNewCommand(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_GEM_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
+bool DAC960_GEM_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
 {
   DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
   InboundDoorBellRegister.All =
@@ -2707,7 +2700,7 @@ boolean DAC960_GEM_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_GEM_InitializationInProgressP(void __iomem *ControllerBaseAddress)
+bool DAC960_GEM_InitializationInProgressP(void __iomem *ControllerBaseAddress)
 {
   DAC960_GEM_InboundDoorBellRegister_T InboundDoorBellRegister;
   InboundDoorBellRegister.All =
@@ -2748,7 +2741,7 @@ void DAC960_GEM_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_GEM_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
+bool DAC960_GEM_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 {
   DAC960_GEM_OutboundDoorBellRegister_T OutboundDoorBellRegister;
   OutboundDoorBellRegister.All =
@@ -2758,7 +2751,7 @@ boolean DAC960_GEM_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseA
 }
 
 static inline
-boolean DAC960_GEM_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
+bool DAC960_GEM_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 {
   DAC960_GEM_OutboundDoorBellRegister_T OutboundDoorBellRegister;
   OutboundDoorBellRegister.All =
@@ -2790,7 +2783,7 @@ void DAC960_GEM_DisableInterrupts(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_GEM_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
+bool DAC960_GEM_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
 {
   DAC960_GEM_InterruptMaskRegister_T InterruptMaskRegister;
   InterruptMaskRegister.All =
@@ -2834,7 +2827,7 @@ DAC960_GEM_ReadCommandStatus(void __iomem *ControllerBaseAddress)
   return readw(ControllerBaseAddress + DAC960_GEM_CommandStatusOffset + 2);
 }
 
-static inline boolean
+static inline bool
 DAC960_GEM_ReadErrorStatus(void __iomem *ControllerBaseAddress,
                          unsigned char *ErrorStatus,
                          unsigned char *Parameter0,
@@ -2882,16 +2875,16 @@ typedef union DAC960_BA_InboundDoorBellRegister
 {
   unsigned char All;
   struct {
-    boolean HardwareMailboxNewCommand:1;               /* Bit 0 */
-    boolean AcknowledgeHardwareMailboxStatus:1;                /* Bit 1 */
-    boolean GenerateInterrupt:1;                       /* Bit 2 */
-    boolean ControllerReset:1;                         /* Bit 3 */
-    boolean MemoryMailboxNewCommand:1;                 /* Bit 4 */
+    bool HardwareMailboxNewCommand:1;                  /* Bit 0 */
+    bool AcknowledgeHardwareMailboxStatus:1;           /* Bit 1 */
+    bool GenerateInterrupt:1;                          /* Bit 2 */
+    bool ControllerReset:1;                            /* Bit 3 */
+    bool MemoryMailboxNewCommand:1;                    /* Bit 4 */
     unsigned char :3;                                  /* Bits 5-7 */
   } Write;
   struct {
-    boolean HardwareMailboxEmpty:1;                    /* Bit 0 */
-    boolean InitializationNotInProgress:1;             /* Bit 1 */
+    bool HardwareMailboxEmpty:1;                       /* Bit 0 */
+    bool InitializationNotInProgress:1;                        /* Bit 1 */
     unsigned char :6;                                  /* Bits 2-7 */
   } Read;
 }
@@ -2906,13 +2899,13 @@ typedef union DAC960_BA_OutboundDoorBellRegister
 {
   unsigned char All;
   struct {
-    boolean AcknowledgeHardwareMailboxInterrupt:1;     /* Bit 0 */
-    boolean AcknowledgeMemoryMailboxInterrupt:1;       /* Bit 1 */
+    bool AcknowledgeHardwareMailboxInterrupt:1;                /* Bit 0 */
+    bool AcknowledgeMemoryMailboxInterrupt:1;          /* Bit 1 */
     unsigned char :6;                                  /* Bits 2-7 */
   } Write;
   struct {
-    boolean HardwareMailboxStatusAvailable:1;          /* Bit 0 */
-    boolean MemoryMailboxStatusAvailable:1;            /* Bit 1 */
+    bool HardwareMailboxStatusAvailable:1;             /* Bit 0 */
+    bool MemoryMailboxStatusAvailable:1;               /* Bit 1 */
     unsigned char :6;                                  /* Bits 2-7 */
   } Read;
 }
@@ -2928,8 +2921,8 @@ typedef union DAC960_BA_InterruptMaskRegister
   unsigned char All;
   struct {
     unsigned int :2;                                   /* Bits 0-1 */
-    boolean DisableInterrupts:1;                       /* Bit 2 */
-    boolean DisableInterruptsI2O:1;                    /* Bit 3 */
+    bool DisableInterrupts:1;                          /* Bit 2 */
+    bool DisableInterruptsI2O:1;                       /* Bit 3 */
     unsigned int :4;                                   /* Bits 4-7 */
   } Bits;
 }
@@ -2945,7 +2938,7 @@ typedef union DAC960_BA_ErrorStatusRegister
   unsigned char All;
   struct {
     unsigned int :2;                                   /* Bits 0-1 */
-    boolean ErrorStatusPending:1;                      /* Bit 2 */
+    bool ErrorStatusPending:1;                         /* Bit 2 */
     unsigned int :5;                                   /* Bits 3-7 */
   } Bits;
 }
@@ -3008,7 +3001,7 @@ void DAC960_BA_MemoryMailboxNewCommand(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_BA_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
+bool DAC960_BA_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
 {
   DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister;
   InboundDoorBellRegister.All =
@@ -3017,7 +3010,7 @@ boolean DAC960_BA_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_BA_InitializationInProgressP(void __iomem *ControllerBaseAddress)
+bool DAC960_BA_InitializationInProgressP(void __iomem *ControllerBaseAddress)
 {
   DAC960_BA_InboundDoorBellRegister_T InboundDoorBellRegister;
   InboundDoorBellRegister.All =
@@ -3057,7 +3050,7 @@ void DAC960_BA_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_BA_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
+bool DAC960_BA_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 {
   DAC960_BA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
   OutboundDoorBellRegister.All =
@@ -3066,7 +3059,7 @@ boolean DAC960_BA_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAd
 }
 
 static inline
-boolean DAC960_BA_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
+bool DAC960_BA_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 {
   DAC960_BA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
   OutboundDoorBellRegister.All =
@@ -3097,7 +3090,7 @@ void DAC960_BA_DisableInterrupts(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_BA_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
+bool DAC960_BA_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
 {
   DAC960_BA_InterruptMaskRegister_T InterruptMaskRegister;
   InterruptMaskRegister.All =
@@ -3140,7 +3133,7 @@ DAC960_BA_ReadCommandStatus(void __iomem *ControllerBaseAddress)
   return readw(ControllerBaseAddress + DAC960_BA_CommandStatusOffset + 2);
 }
 
-static inline boolean
+static inline bool
 DAC960_BA_ReadErrorStatus(void __iomem *ControllerBaseAddress,
                          unsigned char *ErrorStatus,
                          unsigned char *Parameter0,
@@ -3188,16 +3181,16 @@ typedef union DAC960_LP_InboundDoorBellRegister
 {
   unsigned char All;
   struct {
-    boolean HardwareMailboxNewCommand:1;               /* Bit 0 */
-    boolean AcknowledgeHardwareMailboxStatus:1;                /* Bit 1 */
-    boolean GenerateInterrupt:1;                       /* Bit 2 */
-    boolean ControllerReset:1;                         /* Bit 3 */
-    boolean MemoryMailboxNewCommand:1;                 /* Bit 4 */
+    bool HardwareMailboxNewCommand:1;                  /* Bit 0 */
+    bool AcknowledgeHardwareMailboxStatus:1;           /* Bit 1 */
+    bool GenerateInterrupt:1;                          /* Bit 2 */
+    bool ControllerReset:1;                            /* Bit 3 */
+    bool MemoryMailboxNewCommand:1;                    /* Bit 4 */
     unsigned char :3;                                  /* Bits 5-7 */
   } Write;
   struct {
-    boolean HardwareMailboxFull:1;                     /* Bit 0 */
-    boolean InitializationInProgress:1;                        /* Bit 1 */
+    bool HardwareMailboxFull:1;                                /* Bit 0 */
+    bool InitializationInProgress:1;                   /* Bit 1 */
     unsigned char :6;                                  /* Bits 2-7 */
   } Read;
 }
@@ -3212,13 +3205,13 @@ typedef union DAC960_LP_OutboundDoorBellRegister
 {
   unsigned char All;
   struct {
-    boolean AcknowledgeHardwareMailboxInterrupt:1;     /* Bit 0 */
-    boolean AcknowledgeMemoryMailboxInterrupt:1;       /* Bit 1 */
+    bool AcknowledgeHardwareMailboxInterrupt:1;                /* Bit 0 */
+    bool AcknowledgeMemoryMailboxInterrupt:1;          /* Bit 1 */
     unsigned char :6;                                  /* Bits 2-7 */
   } Write;
   struct {
-    boolean HardwareMailboxStatusAvailable:1;          /* Bit 0 */
-    boolean MemoryMailboxStatusAvailable:1;            /* Bit 1 */
+    bool HardwareMailboxStatusAvailable:1;             /* Bit 0 */
+    bool MemoryMailboxStatusAvailable:1;               /* Bit 1 */
     unsigned char :6;                                  /* Bits 2-7 */
   } Read;
 }
@@ -3234,7 +3227,7 @@ typedef union DAC960_LP_InterruptMaskRegister
   unsigned char All;
   struct {
     unsigned int :2;                                   /* Bits 0-1 */
-    boolean DisableInterrupts:1;                       /* Bit 2 */
+    bool DisableInterrupts:1;                          /* Bit 2 */
     unsigned int :5;                                   /* Bits 3-7 */
   } Bits;
 }
@@ -3250,7 +3243,7 @@ typedef union DAC960_LP_ErrorStatusRegister
   unsigned char All;
   struct {
     unsigned int :2;                                   /* Bits 0-1 */
-    boolean ErrorStatusPending:1;                      /* Bit 2 */
+    bool ErrorStatusPending:1;                         /* Bit 2 */
     unsigned int :5;                                   /* Bits 3-7 */
   } Bits;
 }
@@ -3313,7 +3306,7 @@ void DAC960_LP_MemoryMailboxNewCommand(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_LP_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
+bool DAC960_LP_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
 {
   DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister;
   InboundDoorBellRegister.All =
@@ -3322,7 +3315,7 @@ boolean DAC960_LP_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_LP_InitializationInProgressP(void __iomem *ControllerBaseAddress)
+bool DAC960_LP_InitializationInProgressP(void __iomem *ControllerBaseAddress)
 {
   DAC960_LP_InboundDoorBellRegister_T InboundDoorBellRegister;
   InboundDoorBellRegister.All =
@@ -3362,7 +3355,7 @@ void DAC960_LP_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_LP_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
+bool DAC960_LP_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 {
   DAC960_LP_OutboundDoorBellRegister_T OutboundDoorBellRegister;
   OutboundDoorBellRegister.All =
@@ -3371,7 +3364,7 @@ boolean DAC960_LP_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAd
 }
 
 static inline
-boolean DAC960_LP_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
+bool DAC960_LP_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 {
   DAC960_LP_OutboundDoorBellRegister_T OutboundDoorBellRegister;
   OutboundDoorBellRegister.All =
@@ -3400,7 +3393,7 @@ void DAC960_LP_DisableInterrupts(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_LP_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
+bool DAC960_LP_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
 {
   DAC960_LP_InterruptMaskRegister_T InterruptMaskRegister;
   InterruptMaskRegister.All =
@@ -3442,7 +3435,7 @@ DAC960_LP_ReadCommandStatus(void __iomem *ControllerBaseAddress)
   return readw(ControllerBaseAddress + DAC960_LP_CommandStatusOffset + 2);
 }
 
-static inline boolean
+static inline bool
 DAC960_LP_ReadErrorStatus(void __iomem *ControllerBaseAddress,
                          unsigned char *ErrorStatus,
                          unsigned char *Parameter0,
@@ -3502,16 +3495,16 @@ typedef union DAC960_LA_InboundDoorBellRegister
 {
   unsigned char All;
   struct {
-    boolean HardwareMailboxNewCommand:1;               /* Bit 0 */
-    boolean AcknowledgeHardwareMailboxStatus:1;                /* Bit 1 */
-    boolean GenerateInterrupt:1;                       /* Bit 2 */
-    boolean ControllerReset:1;                         /* Bit 3 */
-    boolean MemoryMailboxNewCommand:1;                 /* Bit 4 */
+    bool HardwareMailboxNewCommand:1;                  /* Bit 0 */
+    bool AcknowledgeHardwareMailboxStatus:1;           /* Bit 1 */
+    bool GenerateInterrupt:1;                          /* Bit 2 */
+    bool ControllerReset:1;                            /* Bit 3 */
+    bool MemoryMailboxNewCommand:1;                    /* Bit 4 */
     unsigned char :3;                                  /* Bits 5-7 */
   } Write;
   struct {
-    boolean HardwareMailboxEmpty:1;                    /* Bit 0 */
-    boolean InitializationNotInProgress:1;             /* Bit 1 */
+    bool HardwareMailboxEmpty:1;                       /* Bit 0 */
+    bool InitializationNotInProgress:1;                /* Bit 1 */
     unsigned char :6;                                  /* Bits 2-7 */
   } Read;
 }
@@ -3526,13 +3519,13 @@ typedef union DAC960_LA_OutboundDoorBellRegister
 {
   unsigned char All;
   struct {
-    boolean AcknowledgeHardwareMailboxInterrupt:1;     /* Bit 0 */
-    boolean AcknowledgeMemoryMailboxInterrupt:1;       /* Bit 1 */
+    bool AcknowledgeHardwareMailboxInterrupt:1;                /* Bit 0 */
+    bool AcknowledgeMemoryMailboxInterrupt:1;          /* Bit 1 */
     unsigned char :6;                                  /* Bits 2-7 */
   } Write;
   struct {
-    boolean HardwareMailboxStatusAvailable:1;          /* Bit 0 */
-    boolean MemoryMailboxStatusAvailable:1;            /* Bit 1 */
+    bool HardwareMailboxStatusAvailable:1;             /* Bit 0 */
+    bool MemoryMailboxStatusAvailable:1;               /* Bit 1 */
     unsigned char :6;                                  /* Bits 2-7 */
   } Read;
 }
@@ -3548,7 +3541,7 @@ typedef union DAC960_LA_InterruptMaskRegister
   unsigned char All;
   struct {
     unsigned char :2;                                  /* Bits 0-1 */
-    boolean DisableInterrupts:1;                       /* Bit 2 */
+    bool DisableInterrupts:1;                          /* Bit 2 */
     unsigned char :5;                                  /* Bits 3-7 */
   } Bits;
 }
@@ -3564,7 +3557,7 @@ typedef union DAC960_LA_ErrorStatusRegister
   unsigned char All;
   struct {
     unsigned int :2;                                   /* Bits 0-1 */
-    boolean ErrorStatusPending:1;                      /* Bit 2 */
+    bool ErrorStatusPending:1;                         /* Bit 2 */
     unsigned int :5;                                   /* Bits 3-7 */
   } Bits;
 }
@@ -3627,7 +3620,7 @@ void DAC960_LA_MemoryMailboxNewCommand(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_LA_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
+bool DAC960_LA_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
 {
   DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister;
   InboundDoorBellRegister.All =
@@ -3636,7 +3629,7 @@ boolean DAC960_LA_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_LA_InitializationInProgressP(void __iomem *ControllerBaseAddress)
+bool DAC960_LA_InitializationInProgressP(void __iomem *ControllerBaseAddress)
 {
   DAC960_LA_InboundDoorBellRegister_T InboundDoorBellRegister;
   InboundDoorBellRegister.All =
@@ -3676,7 +3669,7 @@ void DAC960_LA_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_LA_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
+bool DAC960_LA_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 {
   DAC960_LA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
   OutboundDoorBellRegister.All =
@@ -3685,7 +3678,7 @@ boolean DAC960_LA_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAd
 }
 
 static inline
-boolean DAC960_LA_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
+bool DAC960_LA_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 {
   DAC960_LA_OutboundDoorBellRegister_T OutboundDoorBellRegister;
   OutboundDoorBellRegister.All =
@@ -3714,7 +3707,7 @@ void DAC960_LA_DisableInterrupts(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_LA_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
+bool DAC960_LA_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
 {
   DAC960_LA_InterruptMaskRegister_T InterruptMaskRegister;
   InterruptMaskRegister.All =
@@ -3763,7 +3756,7 @@ DAC960_LA_ReadStatusRegister(void __iomem *ControllerBaseAddress)
   return readw(ControllerBaseAddress + DAC960_LA_StatusRegisterOffset);
 }
 
-static inline boolean
+static inline bool
 DAC960_LA_ReadErrorStatus(void __iomem *ControllerBaseAddress,
                          unsigned char *ErrorStatus,
                          unsigned char *Parameter0,
@@ -3822,16 +3815,16 @@ typedef union DAC960_PG_InboundDoorBellRegister
 {
   unsigned int All;
   struct {
-    boolean HardwareMailboxNewCommand:1;               /* Bit 0 */
-    boolean AcknowledgeHardwareMailboxStatus:1;                /* Bit 1 */
-    boolean GenerateInterrupt:1;                       /* Bit 2 */
-    boolean ControllerReset:1;                         /* Bit 3 */
-    boolean MemoryMailboxNewCommand:1;                 /* Bit 4 */
+    bool HardwareMailboxNewCommand:1;                  /* Bit 0 */
+    bool AcknowledgeHardwareMailboxStatus:1;           /* Bit 1 */
+    bool GenerateInterrupt:1;                          /* Bit 2 */
+    bool ControllerReset:1;                            /* Bit 3 */
+    bool MemoryMailboxNewCommand:1;                    /* Bit 4 */
     unsigned int :27;                                  /* Bits 5-31 */
   } Write;
   struct {
-    boolean HardwareMailboxFull:1;                     /* Bit 0 */
-    boolean InitializationInProgress:1;                        /* Bit 1 */
+    bool HardwareMailboxFull:1;                                /* Bit 0 */
+    bool InitializationInProgress:1;                   /* Bit 1 */
     unsigned int :30;                                  /* Bits 2-31 */
   } Read;
 }
@@ -3846,13 +3839,13 @@ typedef union DAC960_PG_OutboundDoorBellRegister
 {
   unsigned int All;
   struct {
-    boolean AcknowledgeHardwareMailboxInterrupt:1;     /* Bit 0 */
-    boolean AcknowledgeMemoryMailboxInterrupt:1;       /* Bit 1 */
+    bool AcknowledgeHardwareMailboxInterrupt:1;                /* Bit 0 */
+    bool AcknowledgeMemoryMailboxInterrupt:1;          /* Bit 1 */
     unsigned int :30;                                  /* Bits 2-31 */
   } Write;
   struct {
-    boolean HardwareMailboxStatusAvailable:1;          /* Bit 0 */
-    boolean MemoryMailboxStatusAvailable:1;            /* Bit 1 */
+    bool HardwareMailboxStatusAvailable:1;             /* Bit 0 */
+    bool MemoryMailboxStatusAvailable:1;               /* Bit 1 */
     unsigned int :30;                                  /* Bits 2-31 */
   } Read;
 }
@@ -3868,7 +3861,7 @@ typedef union DAC960_PG_InterruptMaskRegister
   unsigned int All;
   struct {
     unsigned int MessageUnitInterruptMask1:2;          /* Bits 0-1 */
-    boolean DisableInterrupts:1;                       /* Bit 2 */
+    bool DisableInterrupts:1;                          /* Bit 2 */
     unsigned int MessageUnitInterruptMask2:5;          /* Bits 3-7 */
     unsigned int Reserved0:24;                         /* Bits 8-31 */
   } Bits;
@@ -3885,7 +3878,7 @@ typedef union DAC960_PG_ErrorStatusRegister
   unsigned char All;
   struct {
     unsigned int :2;                                   /* Bits 0-1 */
-    boolean ErrorStatusPending:1;                      /* Bit 2 */
+    bool ErrorStatusPending:1;                         /* Bit 2 */
     unsigned int :5;                                   /* Bits 3-7 */
   } Bits;
 }
@@ -3948,7 +3941,7 @@ void DAC960_PG_MemoryMailboxNewCommand(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_PG_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
+bool DAC960_PG_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
 {
   DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister;
   InboundDoorBellRegister.All =
@@ -3957,7 +3950,7 @@ boolean DAC960_PG_HardwareMailboxFullP(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_PG_InitializationInProgressP(void __iomem *ControllerBaseAddress)
+bool DAC960_PG_InitializationInProgressP(void __iomem *ControllerBaseAddress)
 {
   DAC960_PG_InboundDoorBellRegister_T InboundDoorBellRegister;
   InboundDoorBellRegister.All =
@@ -3997,7 +3990,7 @@ void DAC960_PG_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_PG_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
+bool DAC960_PG_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 {
   DAC960_PG_OutboundDoorBellRegister_T OutboundDoorBellRegister;
   OutboundDoorBellRegister.All =
@@ -4006,7 +3999,7 @@ boolean DAC960_PG_HardwareMailboxStatusAvailableP(void __iomem *ControllerBaseAd
 }
 
 static inline
-boolean DAC960_PG_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
+bool DAC960_PG_MemoryMailboxStatusAvailableP(void __iomem *ControllerBaseAddress)
 {
   DAC960_PG_OutboundDoorBellRegister_T OutboundDoorBellRegister;
   OutboundDoorBellRegister.All =
@@ -4039,7 +4032,7 @@ void DAC960_PG_DisableInterrupts(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_PG_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
+bool DAC960_PG_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
 {
   DAC960_PG_InterruptMaskRegister_T InterruptMaskRegister;
   InterruptMaskRegister.All =
@@ -4088,7 +4081,7 @@ DAC960_PG_ReadStatusRegister(void __iomem *ControllerBaseAddress)
   return readw(ControllerBaseAddress + DAC960_PG_StatusRegisterOffset);
 }
 
-static inline boolean
+static inline bool
 DAC960_PG_ReadErrorStatus(void __iomem *ControllerBaseAddress,
                          unsigned char *ErrorStatus,
                          unsigned char *Parameter0,
@@ -4147,15 +4140,15 @@ typedef union DAC960_PD_InboundDoorBellRegister
 {
   unsigned char All;
   struct {
-    boolean NewCommand:1;                              /* Bit 0 */
-    boolean AcknowledgeStatus:1;                       /* Bit 1 */
-    boolean GenerateInterrupt:1;                       /* Bit 2 */
-    boolean ControllerReset:1;                         /* Bit 3 */
+    bool NewCommand:1;                                 /* Bit 0 */
+    bool AcknowledgeStatus:1;                          /* Bit 1 */
+    bool GenerateInterrupt:1;                          /* Bit 2 */
+    bool ControllerReset:1;                            /* Bit 3 */
     unsigned char :4;                                  /* Bits 4-7 */
   } Write;
   struct {
-    boolean MailboxFull:1;                             /* Bit 0 */
-    boolean InitializationInProgress:1;                        /* Bit 1 */
+    bool MailboxFull:1;                                        /* Bit 0 */
+    bool InitializationInProgress:1;                   /* Bit 1 */
     unsigned char :6;                                  /* Bits 2-7 */
   } Read;
 }
@@ -4170,11 +4163,11 @@ typedef union DAC960_PD_OutboundDoorBellRegister
 {
   unsigned char All;
   struct {
-    boolean AcknowledgeInterrupt:1;                    /* Bit 0 */
+    bool AcknowledgeInterrupt:1;                       /* Bit 0 */
     unsigned char :7;                                  /* Bits 1-7 */
   } Write;
   struct {
-    boolean StatusAvailable:1;                         /* Bit 0 */
+    bool StatusAvailable:1;                            /* Bit 0 */
     unsigned char :7;                                  /* Bits 1-7 */
   } Read;
 }
@@ -4189,7 +4182,7 @@ typedef union DAC960_PD_InterruptEnableRegister
 {
   unsigned char All;
   struct {
-    boolean EnableInterrupts:1;                                /* Bit 0 */
+    bool EnableInterrupts:1;                           /* Bit 0 */
     unsigned char :7;                                  /* Bits 1-7 */
   } Bits;
 }
@@ -4205,7 +4198,7 @@ typedef union DAC960_PD_ErrorStatusRegister
   unsigned char All;
   struct {
     unsigned int :2;                                   /* Bits 0-1 */
-    boolean ErrorStatusPending:1;                      /* Bit 2 */
+    bool ErrorStatusPending:1;                         /* Bit 2 */
     unsigned int :5;                                   /* Bits 3-7 */
   } Bits;
 }
@@ -4258,7 +4251,7 @@ void DAC960_PD_ControllerReset(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_PD_MailboxFullP(void __iomem *ControllerBaseAddress)
+bool DAC960_PD_MailboxFullP(void __iomem *ControllerBaseAddress)
 {
   DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister;
   InboundDoorBellRegister.All =
@@ -4267,7 +4260,7 @@ boolean DAC960_PD_MailboxFullP(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_PD_InitializationInProgressP(void __iomem *ControllerBaseAddress)
+bool DAC960_PD_InitializationInProgressP(void __iomem *ControllerBaseAddress)
 {
   DAC960_PD_InboundDoorBellRegister_T InboundDoorBellRegister;
   InboundDoorBellRegister.All =
@@ -4286,7 +4279,7 @@ void DAC960_PD_AcknowledgeInterrupt(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_PD_StatusAvailableP(void __iomem *ControllerBaseAddress)
+bool DAC960_PD_StatusAvailableP(void __iomem *ControllerBaseAddress)
 {
   DAC960_PD_OutboundDoorBellRegister_T OutboundDoorBellRegister;
   OutboundDoorBellRegister.All =
@@ -4315,7 +4308,7 @@ void DAC960_PD_DisableInterrupts(void __iomem *ControllerBaseAddress)
 }
 
 static inline
-boolean DAC960_PD_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
+bool DAC960_PD_InterruptsEnabledP(void __iomem *ControllerBaseAddress)
 {
   DAC960_PD_InterruptEnableRegister_T InterruptEnableRegister;
   InterruptEnableRegister.All =
@@ -4350,7 +4343,7 @@ DAC960_PD_ReadStatusRegister(void __iomem *ControllerBaseAddress)
   return readw(ControllerBaseAddress + DAC960_PD_StatusRegisterOffset);
 }
 
-static inline boolean
+static inline bool
 DAC960_PD_ReadErrorStatus(void __iomem *ControllerBaseAddress,
                          unsigned char *ErrorStatus,
                          unsigned char *Parameter0,
index 58c1debf86f1c7271ed84bce7cf1ea097c878725..cacb1c816e355503757c84c745d00f9a3c81e185 100644 (file)
@@ -417,8 +417,10 @@ config BLK_DEV_INITRD
          etc. See <file:Documentation/initrd.txt> for details.
 
          If RAM disk support (BLK_DEV_RAM) is also included, this
-         also enables initial RAM disk (initrd) support.
+         also enables initial RAM disk (initrd) support and adds
+         15 Kbytes (more on some other architectures) to the kernel size.
 
+         If unsure say Y.
 
 config CDROM_PKTCDVD
        tristate "Packet writing on CD/DVD media"
index 706cdc6a69eca719c856bc3c65575e77804036a7..e3d9152e231a11902e5d40aba2295e9c415ad369 100644 (file)
@@ -46,7 +46,6 @@
 #include <linux/module.h>
 #include <linux/errno.h>
 #include <linux/signal.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/fs.h>
 #include <linux/kernel.h>
index e04be94d195c5ecca5a8faf9cb0ca6fc24d9b09c..e2e04329096385d3d9d34f08a933cbaa22f837d8 100644 (file)
@@ -269,7 +269,7 @@ static int slm_get_pagesize( int device, int *w, int *h );
 
 static DEFINE_TIMER(slm_timer, slm_test_ready, 0, 0);
 
-static struct file_operations slm_fops = {
+static const struct file_operations slm_fops = {
        .owner =        THIS_MODULE,
        .read =         slm_read,
        .write =        slm_write,
index e22b4c9520a9fdecee3317636bb532ea6404cda6..39e563ea08782cf242972b42d3b8c4795e5a83a4 100644 (file)
@@ -233,7 +233,7 @@ loop:
        }
 }
 
-static struct file_operations aoe_fops = {
+static const struct file_operations aoe_fops = {
        .write = aoechr_write,
        .read = aoechr_read,
        .open = aoechr_open,
index c0d2854dd097e8b9bb4673d14923d5eb778d1391..28cf3082d4423fa4e0b0727ecc02ef61a1f27fa7 100644 (file)
@@ -2,14 +2,8 @@
 # PARIDE configuration
 #
 # PARIDE doesn't need PARPORT, but if PARPORT is configured as a module,
-# PARIDE must also be a module.  The bogus CONFIG_PARIDE_PARPORT option
-# controls the choices given to the user ...
+# PARIDE must also be a module.
 # PARIDE only supports PC style parports. Tough for USB or other parports...
-config PARIDE_PARPORT
-       tristate
-       depends on PARIDE!=n
-       default m if PARPORT_PC=m
-       default y if PARPORT_PC!=m
 
 comment "Parallel IDE high-level drivers"
        depends on PARIDE
index 9d9bff23f426d815420ee1110d44c79a5e5f7fd1..99e2c8ce1cc4f7b98cc56289580530c644b003c8 100644 (file)
@@ -153,7 +153,6 @@ enum {D_PRT, D_PRO, D_UNI, D_MOD, D_GEO, D_SBY, D_DLY, D_SLV};
 #include <linux/blkpg.h>
 #include <linux/kernel.h>
 #include <asm/uaccess.h>
-#include <linux/sched.h>
 #include <linux/workqueue.h>
 
 static DEFINE_SPINLOCK(pd_lock);
index 9970aedbb5d9a05f049b33d7cce2b7079a5436a4..d89e7d32a3b604716a63a03edf7ad0fd3492f6a5 100644 (file)
@@ -227,7 +227,7 @@ static struct class *pg_class;
 
 /* kernel glue structures */
 
-static struct file_operations pg_fops = {
+static const struct file_operations pg_fops = {
        .owner = THIS_MODULE,
        .read = pg_read,
        .write = pg_write,
index c902b25e48697d938179d7002ea7522fab5aad93..9f4e67ee1eb0628917155e99c31810bcbb4a6404 100644 (file)
@@ -232,7 +232,7 @@ static char pt_scratch[512];        /* scratch block buffer */
 
 /* kernel glue structures */
 
-static struct file_operations pt_fops = {
+static const struct file_operations pt_fops = {
        .owner = THIS_MODULE,
        .read = pt_read,
        .write = pt_write,
index 62462190e07e877634053cf20e41643c8ea227cf..93fb6ed4ed522da8b53c3dcc96a915bf80e027eb 100644 (file)
@@ -190,15 +190,6 @@ static struct attribute *kobj_pkt_attrs_wqueue[] = {
        NULL
 };
 
-/* declares a char buffer[64] _dbuf, copies data from
- * _b with length _l into it and ensures that _dbuf ends
- * with a \0 character.
- */
-#define DECLARE_BUF_AS_STRING(_dbuf, _b, _l) \
-       char _dbuf[64]; int dlen = (_l) < 0 ? 0 : (_l); \
-       if (dlen >= sizeof(_dbuf)) dlen = sizeof(_dbuf)-1; \
-       memcpy(_dbuf, _b, dlen); _dbuf[dlen] = 0
-
 static ssize_t kobj_pkt_show(struct kobject *kobj,
                        struct attribute *attr, char *data)
 {
@@ -264,9 +255,8 @@ static ssize_t kobj_pkt_store(struct kobject *kobj,
 {
        struct pktcdvd_device *pd = to_pktcdvdkobj(kobj)->pd;
        int val;
-       DECLARE_BUF_AS_STRING(dbuf, data, len); /* ensure sscanf scans a string */
 
-       if (strcmp(attr->name, "reset") == 0 && dlen > 0) {
+       if (strcmp(attr->name, "reset") == 0 && len > 0) {
                pd->stats.pkt_started = 0;
                pd->stats.pkt_ended = 0;
                pd->stats.secs_w = 0;
@@ -274,7 +264,7 @@ static ssize_t kobj_pkt_store(struct kobject *kobj,
                pd->stats.secs_r = 0;
 
        } else if (strcmp(attr->name, "congestion_off") == 0
-                  && sscanf(dbuf, "%d", &val) == 1) {
+                  && sscanf(data, "%d", &val) == 1) {
                spin_lock(&pd->lock);
                pd->write_congestion_off = val;
                init_write_congestion_marks(&pd->write_congestion_off,
@@ -282,7 +272,7 @@ static ssize_t kobj_pkt_store(struct kobject *kobj,
                spin_unlock(&pd->lock);
 
        } else if (strcmp(attr->name, "congestion_on") == 0
-                  && sscanf(dbuf, "%d", &val) == 1) {
+                  && sscanf(data, "%d", &val) == 1) {
                spin_lock(&pd->lock);
                pd->write_congestion_on = val;
                init_write_congestion_marks(&pd->write_congestion_off,
@@ -369,8 +359,7 @@ static ssize_t class_pktcdvd_store_add(struct class *c, const char *buf,
                                        size_t count)
 {
        unsigned int major, minor;
-       DECLARE_BUF_AS_STRING(dbuf, buf, count);
-       if (sscanf(dbuf, "%u:%u", &major, &minor) == 2) {
+       if (sscanf(buf, "%u:%u", &major, &minor) == 2) {
                pkt_setup_dev(MKDEV(major, minor), NULL);
                return count;
        }
@@ -381,8 +370,7 @@ static ssize_t class_pktcdvd_store_remove(struct class *c, const char *buf,
                                        size_t count)
 {
        unsigned int major, minor;
-       DECLARE_BUF_AS_STRING(dbuf, buf, count);
-       if (sscanf(dbuf, "%u:%u", &major, &minor) == 2) {
+       if (sscanf(buf, "%u:%u", &major, &minor) == 2) {
                pkt_remove_dev(MKDEV(major, minor));
                return count;
        }
@@ -447,7 +435,7 @@ static int pkt_debugfs_fops_open(struct inode *inode, struct file *file)
        return single_open(file, pkt_debugfs_seq_show, inode->i_private);
 }
 
-static struct file_operations debug_fops = {
+static const struct file_operations debug_fops = {
        .open           = pkt_debugfs_fops_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -1377,7 +1365,7 @@ try_next_bio:
                        && pd->bio_queue_size <= pd->write_congestion_off);
        spin_unlock(&pd->lock);
        if (wakeup)
-               blk_clear_queue_congested(pd->disk->queue, WRITE);
+               clear_bdi_congested(&pd->disk->queue->backing_dev_info, WRITE);
 
        pkt->sleep_time = max(PACKET_WAIT_TIME, 1);
        pkt_set_state(pkt, PACKET_WAITING_STATE);
@@ -2598,7 +2586,7 @@ static int pkt_make_request(request_queue_t *q, struct bio *bio)
        spin_lock(&pd->lock);
        if (pd->write_congestion_on > 0
            && pd->bio_queue_size >= pd->write_congestion_on) {
-               blk_set_queue_congested(q, WRITE);
+               set_bdi_congested(&q->backing_dev_info, WRITE);
                do {
                        spin_unlock(&pd->lock);
                        congestion_wait(WRITE, HZ);
@@ -2737,7 +2725,7 @@ static int pkt_seq_open(struct inode *inode, struct file *file)
        return single_open(file, pkt_seq_show, PDE(inode)->data);
 }
 
-static struct file_operations pkt_proc_fops = {
+static const struct file_operations pkt_proc_fops = {
        .open   = pkt_seq_open,
        .read   = seq_read,
        .llseek = seq_lseek,
@@ -3064,7 +3052,7 @@ static int pkt_ctl_ioctl(struct inode *inode, struct file *file, unsigned int cm
 }
 
 
-static struct file_operations pkt_ctl_fops = {
+static const struct file_operations pkt_ctl_fops = {
        .ioctl   = pkt_ctl_ioctl,
        .owner   = THIS_MODULE,
 };
index 30f16bd836505f2900050f4f484b59d0346fe8b3..dff3766f117f3307fdc52fbb46a9126db32d4a14 100644 (file)
@@ -35,7 +35,6 @@
  */
 
 //#define DEBUG /* uncomment if you want debugging info (pr_debug) */
-#include <linux/sched.h>
 #include <linux/fs.h>
 #include <linux/bio.h>
 #include <linux/kernel.h>
index 31ade991aa913893e088fb69923be3c86e0d3e12..27cceb6f5652ca4f0a694411273966fbfcfb09a4 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/skbuff.h>
 
index aae3abace586ff59ce0ac769ec1b6058b745fe0d..34e5555cb917d999b33f54815b7baf4d2426c8fa 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/ptrace.h>
index 92648ef2f5d02bf37e15dee1f64cd9bbd4319f89..c1bce75148febb9bb94f8d547a632243c8823570 100644 (file)
@@ -26,7 +26,6 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/ptrace.h>
index 77b99eecbc49cd9d0a81472f19f3932d0a6bc122..459aa97937ab65e25eae168406d9782ad1b14245 100644 (file)
@@ -26,7 +26,6 @@
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/ptrace.h>
index 5e2c31882003e785f630597d0ba8451d0e195e3a..d66064ccb31c49ce57315b53d0449c773c076ab7 100644 (file)
@@ -26,7 +26,6 @@
 
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/fcntl.h>
 #include <linux/interrupt.h>
index ad62abbbb739ae797560fa26391d6afa2a04a2ff..34f0afc42407961d51b1833e53990c0c9b87fcb1 100644 (file)
@@ -27,7 +27,6 @@
 
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/fcntl.h>
 #include <linux/interrupt.h>
index 420b645c4c9f0d20db0e5790e44a3c854890f6c8..0f4203b499af65771ccb63bac79cae5ec2ad4f80 100644 (file)
@@ -27,7 +27,6 @@
 
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/fcntl.h>
 #include <linux/interrupt.h>
index 6bdf593081d8d23f20dc0a5692c8dfec6d29390a..406af579ac3adc58c55ed42f0ef1cbe2a711c832 100644 (file)
@@ -35,7 +35,6 @@
 
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/unistd.h>
 #include <linux/types.h>
 #include <linux/interrupt.h>
index a278d98a915126a2dac78c6d1865fc11d89181cf..b71a5ccc587f984d11707d6e557d0e77fccb1d92 100644 (file)
@@ -332,7 +332,7 @@ static int vhci_fasync(int fd, struct file *file, int on)
        return 0;
 }
 
-static struct file_operations vhci_fops = {
+static const struct file_operations vhci_fops = {
        .owner          = THIS_MODULE,
        .llseek         = vhci_llseek,
        .read           = vhci_read,
index ec469497c10ff46abbb5818d8ea8726284f05d4a..1f9fb7a9670314403d6981166f2544e22ceac9a5 100644 (file)
 
 #include <linux/module.h>
 #include <linux/errno.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/timer.h>
 #include <linux/fs.h>
index 3105dddf59f19a9409807370ebfce41b7a9167f1..b36f44d4d1bf6c3d97e1682ff7611fb87e0044f1 100644 (file)
@@ -3553,9 +3553,7 @@ static void cdrom_sysctl_register(void)
        if (initialized == 1)
                return;
 
-       cdrom_sysctl_header = register_sysctl_table(cdrom_root_table, 1);
-       if (cdrom_root_table->ctl_name && cdrom_root_table->child->de)
-               cdrom_root_table->child->de->owner = THIS_MODULE;
+       cdrom_sysctl_header = register_sysctl_table(cdrom_root_table);
 
        /* set the defaults */
        cdrom_sysctl_settings.autoclose = autoclose;
index b6c61bbb20e135adbba310b0d4f7cb5ea54d41d8..230131163240532cdfa34f3861e74aef87531bdd 100644 (file)
@@ -183,7 +183,6 @@ History:
 #include <linux/errno.h>       /* These include what we really need */
 #include <linux/delay.h>
 #include <linux/string.h>
-#include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/timer.h>
 #include <linux/cdrom.h>
index fa70824897651b15e1f9e9f5c78691fc63951172..b3ab6e9b8df182ac4017940140edc456cb029a25 100644 (file)
@@ -53,7 +53,6 @@
 #include <linux/slab.h>
 #include <linux/errno.h>
 #include <linux/signal.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/fs.h>
 #include <linux/mm.h>
index bf5aef4e555b2d71696e8540a3840bb1258d5f27..5409fca5bbfcaa5fd346fd32428ae02e089806aa 100644 (file)
@@ -60,7 +60,6 @@
 
 #include <linux/module.h>
 #include <linux/errno.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/timer.h>
 #include <linux/fs.h>
index 93fbf84dcc4a5d48dbd09d34d4ceb6cd3807ea20..dc13ebacedfb4446bc788e72804641e404eeb4a7 100644 (file)
@@ -176,7 +176,7 @@ static int proc_viocd_open(struct inode *inode, struct file *file)
        return single_open(file, proc_viocd_show, NULL);
 }
 
-static struct file_operations proc_viocd_operations = {
+static const struct file_operations proc_viocd_operations = {
        .open           = proc_viocd_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index d08bb4ee130751efee0b36bb4b380d491064b28f..d0a6dc53213c00ecb5e22c7b5933c9789c195e30 100644 (file)
@@ -191,7 +191,7 @@ config MOXA_INTELLIO
          module will be called moxa.
 
 config MOXA_SMARTIO
-       tristate "Moxa SmartIO support"
+       tristate "Moxa SmartIO support (OBSOLETE)"
        depends on SERIAL_NONSTANDARD
        help
          Say Y here if you have a Moxa SmartIO multiport serial card.
@@ -202,7 +202,7 @@ config MOXA_SMARTIO
          here.
 
 config MOXA_SMARTIO_NEW
-       tristate "Moxa SmartIO support v. 2.0 (EXPERIMENTAL)"
+       tristate "Moxa SmartIO support v. 2.0"
        depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA)
        help
          Say Y here if you have a Moxa SmartIO multiport serial card and/or
index 3e581603d0a822b9bab9a95b2f55ae056ffb3b05..a0d04a23dacd2f3c809118244c60d7a1bd9ec969 100644 (file)
@@ -1,6 +1,7 @@
 agpgart-y := backend.o frontend.o generic.o isoch.o
 
 obj-$(CONFIG_AGP)              += agpgart.o
+obj-$(CONFIG_COMPAT)           += compat_ioctl.o
 obj-$(CONFIG_AGP_ALI)          += ali-agp.o
 obj-$(CONFIG_AGP_ATI)          += ati-agp.o
 obj-$(CONFIG_AGP_AMD)          += amd-k7-agp.o
index 1d59e2a5b9aabeb666704cfecb5eb8301d719051..9bd68d9f0f5989105b6349ba98004d9cff381b2e 100644 (file)
@@ -114,6 +114,7 @@ struct agp_bridge_driver {
        void (*free_by_type)(struct agp_memory *);
        void *(*agp_alloc_page)(struct agp_bridge_data *);
        void (*agp_destroy_page)(void *);
+        int (*agp_type_to_mask_type) (struct agp_bridge_data *, int);
 };
 
 struct agp_bridge_data {
@@ -218,6 +219,7 @@ struct agp_bridge_data {
 #define I810_PTE_MAIN_UNCACHED 0x00000000
 #define I810_PTE_LOCAL         0x00000002
 #define I810_PTE_VALID         0x00000001
+#define I830_PTE_SYSTEM_CACHED  0x00000006
 #define I810_SMRAM_MISCC       0x70
 #define I810_GFX_MEM_WIN_SIZE  0x00010000
 #define I810_GFX_MEM_WIN_32M   0x00010000
@@ -270,8 +272,16 @@ void global_cache_flush(void);
 void get_agp_version(struct agp_bridge_data *bridge);
 unsigned long agp_generic_mask_memory(struct agp_bridge_data *bridge,
        unsigned long addr, int type);
+int agp_generic_type_to_mask_type(struct agp_bridge_data *bridge,
+                                 int type);
 struct agp_bridge_data *agp_generic_find_bridge(struct pci_dev *pdev);
 
+/* generic functions for user-populated AGP memory types */
+struct agp_memory *agp_generic_alloc_user(size_t page_count, int type);
+void agp_alloc_page_array(size_t size, struct agp_memory *mem);
+void agp_free_page_array(struct agp_memory *mem);
+
+
 /* generic routines for agp>=3 */
 int agp3_generic_fetch_size(void);
 void agp3_generic_tlbflush(struct agp_memory *mem);
@@ -288,6 +298,8 @@ extern struct aper_size_info_16 agp3_generic_sizes[];
 extern int agp_off;
 extern int agp_try_unsupported_boot;
 
+long compat_agp_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
+
 /* Chipset independant registers (from AGP Spec) */
 #define AGP_APBASE     0x10
 
index 5a31ec7c62fc40bd8fc213fd5fb69961971d82db..98177a93076f5c7d4f7959b93b37ae0b99617120 100644 (file)
@@ -214,6 +214,7 @@ static struct agp_bridge_driver ali_generic_bridge = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = ali_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static struct agp_bridge_driver ali_m1541_bridge = {
@@ -237,6 +238,7 @@ static struct agp_bridge_driver ali_m1541_bridge = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = m1541_alloc_page,
        .agp_destroy_page       = m1541_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 
index b4e00a343da9162e559f305794ae31cc99842285..b0acf41c0db9d5f7997783371ac501d55ca89b8f 100644 (file)
@@ -91,6 +91,9 @@ static int alpha_core_agp_insert_memory(struct agp_memory *mem, off_t pg_start,
        int num_entries, status;
        void *temp;
 
+       if (type >= AGP_USER_TYPES || mem->type >= AGP_USER_TYPES)
+               return -EINVAL;
+
        temp = agp_bridge->current_size;
        num_entries = A_SIZE_FIX(temp)->num_entries;
        if ((pg_start + mem->page_count) > num_entries)
@@ -142,6 +145,7 @@ struct agp_bridge_driver alpha_core_agp_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 struct agp_bridge_data *alpha_bridge;
index c85c8cadb6dfd67b9531eb849f140e9095deec9a..3d8d448bf394a181afcd4fc7319b87471aede4a7 100644 (file)
@@ -381,6 +381,7 @@ static struct agp_bridge_driver amd_irongate_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static struct agp_device_ids amd_agp_device_ids[] __devinitdata =
index 93d2209fee4cfdda3539e0a36a9de177dfffcab2..636d984ed4a62598dc1e11f174f9e9a90262bfee 100644 (file)
@@ -62,12 +62,18 @@ static int amd64_insert_memory(struct agp_memory *mem, off_t pg_start, int type)
 {
        int i, j, num_entries;
        long long tmp;
+       int mask_type;
+       struct agp_bridge_data *bridge = mem->bridge;
        u32 pte;
 
        num_entries = agp_num_entries();
 
-       if (type != 0 || mem->type != 0)
+       if (type != mem->type)
                return -EINVAL;
+       mask_type = bridge->driver->agp_type_to_mask_type(bridge, type);
+       if (mask_type != 0)
+               return -EINVAL;
+
 
        /* Make sure we can fit the range in the gatt table. */
        /* FIXME: could wrap */
@@ -90,7 +96,7 @@ static int amd64_insert_memory(struct agp_memory *mem, off_t pg_start, int type)
 
        for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
                tmp = agp_bridge->driver->mask_memory(agp_bridge,
-                       mem->memory[i], mem->type);
+                       mem->memory[i], mask_type);
 
                BUG_ON(tmp & 0xffffff0000000ffcULL);
                pte = (tmp & 0x000000ff00000000ULL) >> 28;
@@ -247,6 +253,7 @@ static struct agp_bridge_driver amd_8151_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 /* Some basic sanity checks for the aperture. */
index 9987dc2e0c3f02474ba75994b9bc7d675e9904db..77c9ad68fba919b09cd72013639622149164d382 100644 (file)
@@ -431,6 +431,7 @@ static struct agp_bridge_driver ati_generic_bridge = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 
index d59e037ddd1234e395b2a277f0c34c45cacb03b1..ebdd6dd66edb6b27931061a3ea732014f58bb31e 100644 (file)
@@ -43,7 +43,7 @@
  * fix some real stupidity. It's only by chance we can bump
  * past 0.99 at all due to some boolean logic error. */
 #define AGPGART_VERSION_MAJOR 0
-#define AGPGART_VERSION_MINOR 101
+#define AGPGART_VERSION_MINOR 102
 static const struct agp_version agp_current_version =
 {
        .major = AGPGART_VERSION_MAJOR,
diff --git a/drivers/char/agp/compat_ioctl.c b/drivers/char/agp/compat_ioctl.c
new file mode 100644 (file)
index 0000000..fcb4b1b
--- /dev/null
@@ -0,0 +1,282 @@
+/*
+ * AGPGART driver frontend compatibility ioctls
+ * Copyright (C) 2004 Silicon Graphics, Inc.
+ * Copyright (C) 2002-2003 Dave Jones
+ * Copyright (C) 1999 Jeff Hartmann
+ * Copyright (C) 1999 Precision Insight, Inc.
+ * Copyright (C) 1999 Xi Graphics, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/agpgart.h>
+#include <asm/uaccess.h>
+#include "agp.h"
+#include "compat_ioctl.h"
+
+static int compat_agpioc_info_wrap(struct agp_file_private *priv, void __user *arg)
+{
+       struct agp_info32 userinfo;
+       struct agp_kern_info kerninfo;
+
+       agp_copy_info(agp_bridge, &kerninfo);
+
+       userinfo.version.major = kerninfo.version.major;
+       userinfo.version.minor = kerninfo.version.minor;
+       userinfo.bridge_id = kerninfo.device->vendor |
+           (kerninfo.device->device << 16);
+       userinfo.agp_mode = kerninfo.mode;
+       userinfo.aper_base = (compat_long_t)kerninfo.aper_base;
+       userinfo.aper_size = kerninfo.aper_size;
+       userinfo.pg_total = userinfo.pg_system = kerninfo.max_memory;
+       userinfo.pg_used = kerninfo.current_memory;
+
+       if (copy_to_user(arg, &userinfo, sizeof(userinfo)))
+               return -EFAULT;
+
+       return 0;
+}
+
+static int compat_agpioc_reserve_wrap(struct agp_file_private *priv, void __user *arg)
+{
+       struct agp_region32 ureserve;
+       struct agp_region kreserve;
+       struct agp_client *client;
+       struct agp_file_private *client_priv;
+
+       DBG("");
+       if (copy_from_user(&ureserve, arg, sizeof(ureserve)))
+               return -EFAULT;
+
+       if ((unsigned) ureserve.seg_count >= ~0U/sizeof(struct agp_segment32))
+               return -EFAULT;
+
+       kreserve.pid = ureserve.pid;
+       kreserve.seg_count = ureserve.seg_count;
+
+       client = agp_find_client_by_pid(kreserve.pid);
+
+       if (kreserve.seg_count == 0) {
+               /* remove a client */
+               client_priv = agp_find_private(kreserve.pid);
+
+               if (client_priv != NULL) {
+                       set_bit(AGP_FF_IS_CLIENT, &client_priv->access_flags);
+                       set_bit(AGP_FF_IS_VALID, &client_priv->access_flags);
+               }
+               if (client == NULL) {
+                       /* client is already removed */
+                       return 0;
+               }
+               return agp_remove_client(kreserve.pid);
+       } else {
+               struct agp_segment32 *usegment;
+               struct agp_segment *ksegment;
+               int seg;
+
+               if (ureserve.seg_count >= 16384)
+                       return -EINVAL;
+
+               usegment = kmalloc(sizeof(*usegment) * ureserve.seg_count, GFP_KERNEL);
+               if (!usegment)
+                       return -ENOMEM;
+
+               ksegment = kmalloc(sizeof(*ksegment) * kreserve.seg_count, GFP_KERNEL);
+               if (!ksegment) {
+                       kfree(usegment);
+                       return -ENOMEM;
+               }
+
+               if (copy_from_user(usegment, (void __user *) ureserve.seg_list,
+                                  sizeof(*usegment) * ureserve.seg_count)) {
+                       kfree(usegment);
+                       kfree(ksegment);
+                       return -EFAULT;
+               }
+
+               for (seg = 0; seg < ureserve.seg_count; seg++) {
+                       ksegment[seg].pg_start = usegment[seg].pg_start;
+                       ksegment[seg].pg_count = usegment[seg].pg_count;
+                       ksegment[seg].prot = usegment[seg].prot;
+               }
+
+               kfree(usegment);
+               kreserve.seg_list = ksegment;
+
+               if (client == NULL) {
+                       /* Create the client and add the segment */
+                       client = agp_create_client(kreserve.pid);
+
+                       if (client == NULL) {
+                               kfree(ksegment);
+                               return -ENOMEM;
+                       }
+                       client_priv = agp_find_private(kreserve.pid);
+
+                       if (client_priv != NULL) {
+                               set_bit(AGP_FF_IS_CLIENT, &client_priv->access_flags);
+                               set_bit(AGP_FF_IS_VALID, &client_priv->access_flags);
+                       }
+               }
+               return agp_create_segment(client, &kreserve);
+       }
+       /* Will never really happen */
+       return -EINVAL;
+}
+
+static int compat_agpioc_allocate_wrap(struct agp_file_private *priv, void __user *arg)
+{
+       struct agp_memory *memory;
+       struct agp_allocate32 alloc;
+
+       DBG("");
+       if (copy_from_user(&alloc, arg, sizeof(alloc)))
+               return -EFAULT;
+
+       memory = agp_allocate_memory_wrap(alloc.pg_count, alloc.type);
+
+       if (memory == NULL)
+               return -ENOMEM;
+
+       alloc.key = memory->key;
+       alloc.physical = memory->physical;
+
+       if (copy_to_user(arg, &alloc, sizeof(alloc))) {
+               agp_free_memory_wrap(memory);
+               return -EFAULT;
+       }
+       return 0;
+}
+
+static int compat_agpioc_bind_wrap(struct agp_file_private *priv, void __user *arg)
+{
+       struct agp_bind32 bind_info;
+       struct agp_memory *memory;
+
+       DBG("");
+       if (copy_from_user(&bind_info, arg, sizeof(bind_info)))
+               return -EFAULT;
+
+       memory = agp_find_mem_by_key(bind_info.key);
+
+       if (memory == NULL)
+               return -EINVAL;
+
+       return agp_bind_memory(memory, bind_info.pg_start);
+}
+
+static int compat_agpioc_unbind_wrap(struct agp_file_private *priv, void __user *arg)
+{
+       struct agp_memory *memory;
+       struct agp_unbind32 unbind;
+
+       DBG("");
+       if (copy_from_user(&unbind, arg, sizeof(unbind)))
+               return -EFAULT;
+
+       memory = agp_find_mem_by_key(unbind.key);
+
+       if (memory == NULL)
+               return -EINVAL;
+
+       return agp_unbind_memory(memory);
+}
+
+long compat_agp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+       struct agp_file_private *curr_priv = file->private_data;
+       int ret_val = -ENOTTY;
+
+       mutex_lock(&(agp_fe.agp_mutex));
+
+       if ((agp_fe.current_controller == NULL) &&
+           (cmd != AGPIOC_ACQUIRE32)) {
+               ret_val = -EINVAL;
+               goto ioctl_out;
+       }
+       if ((agp_fe.backend_acquired != TRUE) &&
+           (cmd != AGPIOC_ACQUIRE32)) {
+               ret_val = -EBUSY;
+               goto ioctl_out;
+       }
+       if (cmd != AGPIOC_ACQUIRE32) {
+               if (!(test_bit(AGP_FF_IS_CONTROLLER, &curr_priv->access_flags))) {
+                       ret_val = -EPERM;
+                       goto ioctl_out;
+               }
+               /* Use the original pid of the controller,
+                * in case it's threaded */
+
+               if (agp_fe.current_controller->pid != curr_priv->my_pid) {
+                       ret_val = -EBUSY;
+                       goto ioctl_out;
+               }
+       }
+
+       switch (cmd) {
+       case AGPIOC_INFO32:
+               ret_val = compat_agpioc_info_wrap(curr_priv, (void __user *) arg);
+               break;
+
+       case AGPIOC_ACQUIRE32:
+               ret_val = agpioc_acquire_wrap(curr_priv);
+               break;
+
+       case AGPIOC_RELEASE32:
+               ret_val = agpioc_release_wrap(curr_priv);
+               break;
+
+       case AGPIOC_SETUP32:
+               ret_val = agpioc_setup_wrap(curr_priv, (void __user *) arg);
+               break;
+
+       case AGPIOC_RESERVE32:
+               ret_val = compat_agpioc_reserve_wrap(curr_priv, (void __user *) arg);
+               break;
+
+       case AGPIOC_PROTECT32:
+               ret_val = agpioc_protect_wrap(curr_priv);
+               break;
+
+       case AGPIOC_ALLOCATE32:
+               ret_val = compat_agpioc_allocate_wrap(curr_priv, (void __user *) arg);
+               break;
+
+       case AGPIOC_DEALLOCATE32:
+               ret_val = agpioc_deallocate_wrap(curr_priv, (int) arg);
+               break;
+
+       case AGPIOC_BIND32:
+               ret_val = compat_agpioc_bind_wrap(curr_priv, (void __user *) arg);
+               break;
+
+       case AGPIOC_UNBIND32:
+               ret_val = compat_agpioc_unbind_wrap(curr_priv, (void __user *) arg);
+               break;
+       }
+
+ioctl_out:
+       DBG("ioctl returns %d\n", ret_val);
+       mutex_unlock(&(agp_fe.agp_mutex));
+       return ret_val;
+}
+
diff --git a/drivers/char/agp/compat_ioctl.h b/drivers/char/agp/compat_ioctl.h
new file mode 100644 (file)
index 0000000..71939d6
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 1999 Jeff Hartmann
+ * Copyright (C) 1999 Precision Insight, Inc.
+ * Copyright (C) 1999 Xi Graphics, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * JEFF HARTMANN, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef _AGP_COMPAT_IOCTL_H
+#define _AGP_COMPAT_IOCTL_H
+
+#include <linux/compat.h>
+#include <linux/agpgart.h>
+
+#define AGPIOC_INFO32       _IOR (AGPIOC_BASE, 0, compat_uptr_t)
+#define AGPIOC_ACQUIRE32    _IO  (AGPIOC_BASE, 1)
+#define AGPIOC_RELEASE32    _IO  (AGPIOC_BASE, 2)
+#define AGPIOC_SETUP32      _IOW (AGPIOC_BASE, 3, compat_uptr_t)
+#define AGPIOC_RESERVE32    _IOW (AGPIOC_BASE, 4, compat_uptr_t)
+#define AGPIOC_PROTECT32    _IOW (AGPIOC_BASE, 5, compat_uptr_t)
+#define AGPIOC_ALLOCATE32   _IOWR(AGPIOC_BASE, 6, compat_uptr_t)
+#define AGPIOC_DEALLOCATE32 _IOW (AGPIOC_BASE, 7, compat_int_t)
+#define AGPIOC_BIND32       _IOW (AGPIOC_BASE, 8, compat_uptr_t)
+#define AGPIOC_UNBIND32     _IOW (AGPIOC_BASE, 9, compat_uptr_t)
+
+struct agp_info32 {
+       struct agp_version version;     /* version of the driver        */
+       u32 bridge_id;          /* bridge vendor/device         */
+       u32 agp_mode;           /* mode info of bridge          */
+       compat_long_t aper_base;        /* base of aperture             */
+       compat_size_t aper_size;        /* size of aperture             */
+       compat_size_t pg_total; /* max pages (swap + system)    */
+       compat_size_t pg_system;        /* max pages (system)           */
+       compat_size_t pg_used;          /* current pages used           */
+};
+
+/*
+ * The "prot" down below needs still a "sleep" flag somehow ...
+ */
+struct agp_segment32 {
+       compat_off_t pg_start;          /* starting page to populate    */
+       compat_size_t pg_count; /* number of pages              */
+       compat_int_t prot;              /* prot flags for mmap          */
+};
+
+struct agp_region32 {
+       compat_pid_t pid;               /* pid of process               */
+       compat_size_t seg_count;        /* number of segments           */
+       struct agp_segment32 *seg_list;
+};
+
+struct agp_allocate32 {
+       compat_int_t key;               /* tag of allocation            */
+       compat_size_t pg_count; /* number of pages              */
+       u32 type;               /* 0 == normal, other devspec   */
+       u32 physical;           /* device specific (some devices
+                                * need a phys address of the
+                                * actual page behind the gatt
+                                * table)                        */
+};
+
+struct agp_bind32 {
+       compat_int_t key;               /* tag of allocation            */
+       compat_off_t pg_start;          /* starting page to populate    */
+};
+
+struct agp_unbind32 {
+       compat_int_t key;               /* tag of allocation            */
+       u32 priority;           /* priority for paging out      */
+};
+
+extern struct agp_front_data agp_fe;
+
+int agpioc_acquire_wrap(struct agp_file_private *priv);
+int agpioc_release_wrap(struct agp_file_private *priv);
+int agpioc_protect_wrap(struct agp_file_private *priv);
+int agpioc_setup_wrap(struct agp_file_private *priv, void __user *arg);
+int agpioc_deallocate_wrap(struct agp_file_private *priv, int arg);
+struct agp_file_private *agp_find_private(pid_t pid);
+struct agp_client *agp_create_client(pid_t id);
+int agp_remove_client(pid_t id);
+int agp_create_segment(struct agp_client *client, struct agp_region *region);
+void agp_free_memory_wrap(struct agp_memory *memory);
+struct agp_memory *agp_allocate_memory_wrap(size_t pg_count, u32 type);
+struct agp_memory *agp_find_mem_by_key(int key);
+struct agp_client *agp_find_client_by_pid(pid_t id);
+
+#endif /* _AGP_COMPAT_H */
index 30f730ff81c1717c82eb3f50a8d94a1194255350..658cb1a72d2cf65d9c5244775ecdf1b696313b02 100644 (file)
@@ -335,6 +335,7 @@ static struct agp_bridge_driver efficeon_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static int __devinit agp_efficeon_probe(struct pci_dev *pdev,
index 0f2ed2aa2d815039d7cd6cd3dc26a20a4e15791e..679d7f972439b43cb511fedf77d334af08928833 100644 (file)
@@ -41,9 +41,9 @@
 #include <asm/pgtable.h>
 #include "agp.h"
 
-static struct agp_front_data agp_fe;
+struct agp_front_data agp_fe;
 
-static struct agp_memory *agp_find_mem_by_key(int key)
+struct agp_memory *agp_find_mem_by_key(int key)
 {
        struct agp_memory *curr;
 
@@ -159,7 +159,7 @@ static pgprot_t agp_convert_mmap_flags(int prot)
        return vm_get_page_prot(prot_bits);
 }
 
-static int agp_create_segment(struct agp_client *client, struct agp_region *region)
+int agp_create_segment(struct agp_client *client, struct agp_region *region)
 {
        struct agp_segment_priv **ret_seg;
        struct agp_segment_priv *seg;
@@ -211,7 +211,7 @@ static void agp_insert_into_pool(struct agp_memory * temp)
 
 /* File private list routines */
 
-static struct agp_file_private *agp_find_private(pid_t pid)
+struct agp_file_private *agp_find_private(pid_t pid)
 {
        struct agp_file_private *curr;
 
@@ -266,13 +266,13 @@ static void agp_remove_file_private(struct agp_file_private * priv)
  * Wrappers for agp_free_memory & agp_allocate_memory
  * These make sure that internal lists are kept updated.
  */
-static void agp_free_memory_wrap(struct agp_memory *memory)
+void agp_free_memory_wrap(struct agp_memory *memory)
 {
        agp_remove_from_pool(memory);
        agp_free_memory(memory);
 }
 
-static struct agp_memory *agp_allocate_memory_wrap(size_t pg_count, u32 type)
+struct agp_memory *agp_allocate_memory_wrap(size_t pg_count, u32 type)
 {
        struct agp_memory *memory;
 
@@ -484,7 +484,7 @@ static struct agp_controller *agp_find_controller_for_client(pid_t id)
        return NULL;
 }
 
-static struct agp_client *agp_find_client_by_pid(pid_t id)
+struct agp_client *agp_find_client_by_pid(pid_t id)
 {
        struct agp_client *temp;
 
@@ -509,7 +509,7 @@ static void agp_insert_client(struct agp_client *client)
        agp_fe.current_controller->num_clients++;
 }
 
-static struct agp_client *agp_create_client(pid_t id)
+struct agp_client *agp_create_client(pid_t id)
 {
        struct agp_client *new_client;
 
@@ -522,7 +522,7 @@ static struct agp_client *agp_create_client(pid_t id)
        return new_client;
 }
 
-static int agp_remove_client(pid_t id)
+int agp_remove_client(pid_t id)
 {
        struct agp_client *client;
        struct agp_client *prev_client;
@@ -746,7 +746,7 @@ static int agpioc_info_wrap(struct agp_file_private *priv, void __user *arg)
        return 0;
 }
 
-static int agpioc_acquire_wrap(struct agp_file_private *priv)
+int agpioc_acquire_wrap(struct agp_file_private *priv)
 {
        struct agp_controller *controller;
 
@@ -789,14 +789,14 @@ static int agpioc_acquire_wrap(struct agp_file_private *priv)
        return 0;
 }
 
-static int agpioc_release_wrap(struct agp_file_private *priv)
+int agpioc_release_wrap(struct agp_file_private *priv)
 {
        DBG("");
        agp_controller_release_current(agp_fe.current_controller, priv);
        return 0;
 }
 
-static int agpioc_setup_wrap(struct agp_file_private *priv, void __user *arg)
+int agpioc_setup_wrap(struct agp_file_private *priv, void __user *arg)
 {
        struct agp_setup mode;
 
@@ -876,7 +876,7 @@ static int agpioc_reserve_wrap(struct agp_file_private *priv, void __user *arg)
        return -EINVAL;
 }
 
-static int agpioc_protect_wrap(struct agp_file_private *priv)
+int agpioc_protect_wrap(struct agp_file_private *priv)
 {
        DBG("");
        /* This function is not currently implemented */
@@ -892,6 +892,9 @@ static int agpioc_allocate_wrap(struct agp_file_private *priv, void __user *arg)
        if (copy_from_user(&alloc, arg, sizeof(struct agp_allocate)))
                return -EFAULT;
 
+       if (alloc.type >= AGP_USER_TYPES)
+               return -EINVAL;
+
        memory = agp_allocate_memory_wrap(alloc.pg_count, alloc.type);
 
        if (memory == NULL)
@@ -907,7 +910,7 @@ static int agpioc_allocate_wrap(struct agp_file_private *priv, void __user *arg)
        return 0;
 }
 
-static int agpioc_deallocate_wrap(struct agp_file_private *priv, int arg)
+int agpioc_deallocate_wrap(struct agp_file_private *priv, int arg)
 {
        struct agp_memory *memory;
 
@@ -1043,6 +1046,9 @@ static const struct file_operations agp_fops =
        .read           = agp_read,
        .write          = agp_write,
        .ioctl          = agp_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl   = compat_agp_ioctl,
+#endif
        .mmap           = agp_mmap,
        .open           = agp_open,
        .release        = agp_release,
index 3491d6f84bc6098b321965edacf416c7a0d277ac..7923337c3d26ae3db5a3aea6496eae8dd4836df6 100644 (file)
@@ -101,6 +101,63 @@ static int agp_get_key(void)
        return -1;
 }
 
+/*
+ * Use kmalloc if possible for the page list. Otherwise fall back to
+ * vmalloc. This speeds things up and also saves memory for small AGP
+ * regions.
+ */
+
+void agp_alloc_page_array(size_t size, struct agp_memory *mem)
+{
+       mem->memory = NULL;
+       mem->vmalloc_flag = 0;
+
+       if (size <= 2*PAGE_SIZE)
+               mem->memory = kmalloc(size, GFP_KERNEL | __GFP_NORETRY);
+       if (mem->memory == NULL) {
+               mem->memory = vmalloc(size);
+               mem->vmalloc_flag = 1;
+       }
+}
+EXPORT_SYMBOL(agp_alloc_page_array);
+
+void agp_free_page_array(struct agp_memory *mem)
+{
+       if (mem->vmalloc_flag) {
+               vfree(mem->memory);
+       } else {
+               kfree(mem->memory);
+       }
+}
+EXPORT_SYMBOL(agp_free_page_array);
+
+
+static struct agp_memory *agp_create_user_memory(unsigned long num_agp_pages)
+{
+       struct agp_memory *new;
+       unsigned long alloc_size = num_agp_pages*sizeof(struct page *);
+
+       new = kzalloc(sizeof(struct agp_memory), GFP_KERNEL);
+       if (new == NULL)
+               return NULL;
+
+       new->key = agp_get_key();
+
+       if (new->key < 0) {
+               kfree(new);
+               return NULL;
+       }
+
+       agp_alloc_page_array(alloc_size, new);
+
+       if (new->memory == NULL) {
+               agp_free_key(new->key);
+               kfree(new);
+               return NULL;
+       }
+       new->num_scratch_pages = 0;
+       return new;
+}
 
 struct agp_memory *agp_create_memory(int scratch_pages)
 {
@@ -116,7 +173,8 @@ struct agp_memory *agp_create_memory(int scratch_pages)
                kfree(new);
                return NULL;
        }
-       new->memory = vmalloc(PAGE_SIZE * scratch_pages);
+
+       agp_alloc_page_array(PAGE_SIZE * scratch_pages, new);
 
        if (new->memory == NULL) {
                agp_free_key(new->key);
@@ -124,6 +182,7 @@ struct agp_memory *agp_create_memory(int scratch_pages)
                return NULL;
        }
        new->num_scratch_pages = scratch_pages;
+       new->type = AGP_NORMAL_MEMORY;
        return new;
 }
 EXPORT_SYMBOL(agp_create_memory);
@@ -146,6 +205,11 @@ void agp_free_memory(struct agp_memory *curr)
        if (curr->is_bound == TRUE)
                agp_unbind_memory(curr);
 
+       if (curr->type >= AGP_USER_TYPES) {
+               agp_generic_free_by_type(curr);
+               return;
+       }
+
        if (curr->type != 0) {
                curr->bridge->driver->free_by_type(curr);
                return;
@@ -157,7 +221,7 @@ void agp_free_memory(struct agp_memory *curr)
                flush_agp_mappings();
        }
        agp_free_key(curr->key);
-       vfree(curr->memory);
+       agp_free_page_array(curr);
        kfree(curr);
 }
 EXPORT_SYMBOL(agp_free_memory);
@@ -188,6 +252,13 @@ struct agp_memory *agp_allocate_memory(struct agp_bridge_data *bridge,
        if ((atomic_read(&bridge->current_memory_agp) + page_count) > bridge->max_memory_agp)
                return NULL;
 
+       if (type >= AGP_USER_TYPES) {
+               new = agp_generic_alloc_user(page_count, type);
+               if (new)
+                       new->bridge = bridge;
+               return new;
+       }
+
        if (type != 0) {
                new = bridge->driver->alloc_by_type(page_count, type);
                if (new)
@@ -960,6 +1031,7 @@ int agp_generic_insert_memory(struct agp_memory * mem, off_t pg_start, int type)
        off_t j;
        void *temp;
        struct agp_bridge_data *bridge;
+       int mask_type;
 
        bridge = mem->bridge;
        if (!bridge)
@@ -995,7 +1067,11 @@ int agp_generic_insert_memory(struct agp_memory * mem, off_t pg_start, int type)
        num_entries -= agp_memory_reserved/PAGE_SIZE;
        if (num_entries < 0) num_entries = 0;
 
-       if (type != 0 || mem->type != 0) {
+       if (type != mem->type)
+               return -EINVAL;
+
+       mask_type = bridge->driver->agp_type_to_mask_type(bridge, type);
+       if (mask_type != 0) {
                /* The generic routines know nothing of memory types */
                return -EINVAL;
        }
@@ -1018,7 +1094,8 @@ int agp_generic_insert_memory(struct agp_memory * mem, off_t pg_start, int type)
        }
 
        for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
-               writel(bridge->driver->mask_memory(bridge, mem->memory[i], mem->type), bridge->gatt_table+j);
+               writel(bridge->driver->mask_memory(bridge, mem->memory[i], mask_type),
+                      bridge->gatt_table+j);
        }
        readl(bridge->gatt_table+j-1);  /* PCI Posting. */
 
@@ -1032,6 +1109,7 @@ int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
 {
        size_t i;
        struct agp_bridge_data *bridge;
+       int mask_type;
 
        bridge = mem->bridge;
        if (!bridge)
@@ -1040,7 +1118,11 @@ int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
        if (mem->page_count == 0)
                return 0;
 
-       if (type != 0 || mem->type != 0) {
+       if (type != mem->type)
+               return -EINVAL;
+
+       mask_type = bridge->driver->agp_type_to_mask_type(bridge, type);
+       if (mask_type != 0) {
                /* The generic routines know nothing of memory types */
                return -EINVAL;
        }
@@ -1056,22 +1138,40 @@ int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
 }
 EXPORT_SYMBOL(agp_generic_remove_memory);
 
-
 struct agp_memory *agp_generic_alloc_by_type(size_t page_count, int type)
 {
        return NULL;
 }
 EXPORT_SYMBOL(agp_generic_alloc_by_type);
 
-
 void agp_generic_free_by_type(struct agp_memory *curr)
 {
-       vfree(curr->memory);
+       agp_free_page_array(curr);
        agp_free_key(curr->key);
        kfree(curr);
 }
 EXPORT_SYMBOL(agp_generic_free_by_type);
 
+struct agp_memory *agp_generic_alloc_user(size_t page_count, int type)
+{
+       struct agp_memory *new;
+       int i;
+       int pages;
+
+       pages = (page_count + ENTRIES_PER_PAGE - 1) / ENTRIES_PER_PAGE;
+       new = agp_create_user_memory(page_count);
+       if (new == NULL)
+               return NULL;
+
+       for (i = 0; i < page_count; i++)
+               new->memory[i] = 0;
+       new->page_count = 0;
+       new->type = type;
+       new->num_scratch_pages = pages;
+
+       return new;
+}
+EXPORT_SYMBOL(agp_generic_alloc_user);
 
 /*
  * Basic Page Allocation Routines -
@@ -1165,6 +1265,15 @@ unsigned long agp_generic_mask_memory(struct agp_bridge_data *bridge,
 }
 EXPORT_SYMBOL(agp_generic_mask_memory);
 
+int agp_generic_type_to_mask_type(struct agp_bridge_data *bridge,
+                                 int type)
+{
+       if (type >= AGP_USER_TYPES)
+               return 0;
+       return type;
+}
+EXPORT_SYMBOL(agp_generic_type_to_mask_type);
+
 /*
  * These functions are implemented according to the AGPv3 spec,
  * which covers implementation details that had previously been
index 907fb66ec4a98f12212b181099e39700eb797513..847deabf7f9b6b110f694d68856cb82c7fab9f56 100644 (file)
@@ -438,6 +438,7 @@ struct agp_bridge_driver hp_zx1_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
        .cant_use_aperture      = 1,
 };
 
index 91769443d8fe2d30cf010ef55318a51b43d82e81..3e7618653abd05ca4f74b12788e018251dd88b74 100644 (file)
@@ -293,6 +293,9 @@ static int i460_insert_memory_small_io_page (struct agp_memory *mem,
        pr_debug("i460_insert_memory_small_io_page(mem=%p, pg_start=%ld, type=%d, paddr0=0x%lx)\n",
                 mem, pg_start, type, mem->memory[0]);
 
+       if (type >= AGP_USER_TYPES || mem->type >= AGP_USER_TYPES)
+               return -EINVAL;
+
        io_pg_start = I460_IOPAGES_PER_KPAGE * pg_start;
 
        temp = agp_bridge->current_size;
@@ -396,6 +399,9 @@ static int i460_insert_memory_large_io_page (struct agp_memory *mem,
        struct lp_desc *start, *end, *lp;
        void *temp;
 
+       if (type >= AGP_USER_TYPES || mem->type >= AGP_USER_TYPES)
+               return -EINVAL;
+
        temp = agp_bridge->current_size;
        num_entries = A_SIZE_8(temp)->num_entries;
 
@@ -572,6 +578,7 @@ struct agp_bridge_driver intel_i460_driver = {
 #endif
        .alloc_by_type          = agp_generic_alloc_by_type,
        .free_by_type           = agp_generic_free_by_type,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
        .cant_use_aperture      = 1,
 };
 
index a3011de51f7c049438ae51fae97f3652522cf9a4..06b0bb6d982fca6486a928b98f7e84898a515579 100644 (file)
@@ -5,6 +5,7 @@
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/init.h>
+#include <linux/kernel.h>
 #include <linux/pagemap.h>
 #include <linux/agp_backend.h>
 #include "agp.h"
@@ -24,6 +25,9 @@
                  agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_HB)
 
 
+extern int agp_memory_reserved;
+
+
 /* Intel 815 register */
 #define INTEL_815_APCONT       0x51
 #define INTEL_815_ATTBASE_MASK ~0x1FFFFFFF
@@ -68,12 +72,15 @@ static struct aper_size_info_fixed intel_i810_sizes[] =
 
 #define AGP_DCACHE_MEMORY      1
 #define AGP_PHYS_MEMORY                2
+#define INTEL_AGP_CACHED_MEMORY 3
 
 static struct gatt_mask intel_i810_masks[] =
 {
        {.mask = I810_PTE_VALID, .type = 0},
        {.mask = (I810_PTE_VALID | I810_PTE_LOCAL), .type = AGP_DCACHE_MEMORY},
-       {.mask = I810_PTE_VALID, .type = 0}
+       {.mask = I810_PTE_VALID, .type = 0},
+       {.mask = I810_PTE_VALID | I830_PTE_SYSTEM_CACHED,
+        .type = INTEL_AGP_CACHED_MEMORY}
 };
 
 static struct _intel_i810_private {
@@ -117,13 +124,15 @@ static int intel_i810_configure(void)
 
        current_size = A_SIZE_FIX(agp_bridge->current_size);
 
-       pci_read_config_dword(intel_i810_private.i810_dev, I810_MMADDR, &temp);
-       temp &= 0xfff80000;
-
-       intel_i810_private.registers = ioremap(temp, 128 * 4096);
        if (!intel_i810_private.registers) {
-               printk(KERN_ERR PFX "Unable to remap memory.\n");
-               return -ENOMEM;
+               pci_read_config_dword(intel_i810_private.i810_dev, I810_MMADDR, &temp);
+               temp &= 0xfff80000;
+
+               intel_i810_private.registers = ioremap(temp, 128 * 4096);
+               if (!intel_i810_private.registers) {
+                       printk(KERN_ERR PFX "Unable to remap memory.\n");
+                       return -ENOMEM;
+               }
        }
 
        if ((readl(intel_i810_private.registers+I810_DRAM_CTL)
@@ -201,62 +210,79 @@ static void i8xx_destroy_pages(void *addr)
        atomic_dec(&agp_bridge->current_memory_agp);
 }
 
+static int intel_i830_type_to_mask_type(struct agp_bridge_data *bridge,
+                                       int type)
+{
+       if (type < AGP_USER_TYPES)
+               return type;
+       else if (type == AGP_USER_CACHED_MEMORY)
+               return INTEL_AGP_CACHED_MEMORY;
+       else
+               return 0;
+}
+
 static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start,
                                int type)
 {
        int i, j, num_entries;
        void *temp;
+       int ret = -EINVAL;
+       int mask_type;
 
        if (mem->page_count == 0)
-               return 0;
+               goto out;
 
        temp = agp_bridge->current_size;
        num_entries = A_SIZE_FIX(temp)->num_entries;
 
        if ((pg_start + mem->page_count) > num_entries)
-               return -EINVAL;
+               goto out_err;
 
-       for (j = pg_start; j < (pg_start + mem->page_count); j++) {
-               if (!PGE_EMPTY(agp_bridge, readl(agp_bridge->gatt_table+j)))
-                       return -EBUSY;
-       }
 
-       if (type != 0 || mem->type != 0) {
-               if ((type == AGP_DCACHE_MEMORY) && (mem->type == AGP_DCACHE_MEMORY)) {
-                       /* special insert */
-                       if (!mem->is_flushed) {
-                               global_cache_flush();
-                               mem->is_flushed = TRUE;
-                       }
-
-                       for (i = pg_start; i < (pg_start + mem->page_count); i++) {
-                               writel((i*4096)|I810_PTE_LOCAL|I810_PTE_VALID, intel_i810_private.registers+I810_PTE_BASE+(i*4));
-                       }
-                       readl(intel_i810_private.registers+I810_PTE_BASE+((i-1)*4));    /* PCI Posting. */
-
-                       agp_bridge->driver->tlb_flush(mem);
-                       return 0;
+       for (j = pg_start; j < (pg_start + mem->page_count); j++) {
+               if (!PGE_EMPTY(agp_bridge, readl(agp_bridge->gatt_table+j))) {
+                       ret = -EBUSY;
+                       goto out_err;
                }
-               if ((type == AGP_PHYS_MEMORY) && (mem->type == AGP_PHYS_MEMORY))
-                       goto insert;
-               return -EINVAL;
        }
 
-insert:
-       if (!mem->is_flushed) {
-               global_cache_flush();
-               mem->is_flushed = TRUE;
-       }
+       if (type != mem->type)
+               goto out_err;
 
-       for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
-               writel(agp_bridge->driver->mask_memory(agp_bridge,
-                       mem->memory[i], mem->type),
-                       intel_i810_private.registers+I810_PTE_BASE+(j*4));
+       mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
+
+       switch (mask_type) {
+       case AGP_DCACHE_MEMORY:
+               if (!mem->is_flushed)
+                       global_cache_flush();
+               for (i = pg_start; i < (pg_start + mem->page_count); i++) {
+                       writel((i*4096)|I810_PTE_LOCAL|I810_PTE_VALID,
+                              intel_i810_private.registers+I810_PTE_BASE+(i*4));
+               }
+               readl(intel_i810_private.registers+I810_PTE_BASE+((i-1)*4));
+               break;
+       case AGP_PHYS_MEMORY:
+       case AGP_NORMAL_MEMORY:
+               if (!mem->is_flushed)
+                       global_cache_flush();
+               for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
+                       writel(agp_bridge->driver->mask_memory(agp_bridge,
+                                                              mem->memory[i],
+                                                              mask_type),
+                              intel_i810_private.registers+I810_PTE_BASE+(j*4));
+               }
+               readl(intel_i810_private.registers+I810_PTE_BASE+((j-1)*4));
+               break;
+       default:
+               goto out_err;
        }
-       readl(intel_i810_private.registers+I810_PTE_BASE+((j-1)*4));    /* PCI Posting. */
 
        agp_bridge->driver->tlb_flush(mem);
-       return 0;
+out:
+       ret = 0;
+out_err:
+       mem->is_flushed = 1;
+       return ret;
 }
 
 static int intel_i810_remove_entries(struct agp_memory *mem, off_t pg_start,
@@ -337,12 +363,11 @@ static struct agp_memory *intel_i810_alloc_by_type(size_t pg_count, int type)
                new->type = AGP_DCACHE_MEMORY;
                new->page_count = pg_count;
                new->num_scratch_pages = 0;
-               vfree(new->memory);
+               agp_free_page_array(new);
                return new;
        }
        if (type == AGP_PHYS_MEMORY)
                return alloc_agpphysmem_i8xx(pg_count, type);
-
        return NULL;
 }
 
@@ -357,7 +382,7 @@ static void intel_i810_free_by_type(struct agp_memory *curr)
                                 gart_to_virt(curr->memory[0]));
                        global_flush_tlb();
                }
-               vfree(curr->memory);
+               agp_free_page_array(curr);
        }
        kfree(curr);
 }
@@ -619,9 +644,11 @@ static int intel_i830_insert_entries(struct agp_memory *mem,off_t pg_start, int
 {
        int i,j,num_entries;
        void *temp;
+       int ret = -EINVAL;
+       int mask_type;
 
        if (mem->page_count == 0)
-               return 0;
+               goto out;
 
        temp = agp_bridge->current_size;
        num_entries = A_SIZE_FIX(temp)->num_entries;
@@ -631,34 +658,41 @@ static int intel_i830_insert_entries(struct agp_memory *mem,off_t pg_start, int
                                pg_start,intel_i830_private.gtt_entries);
 
                printk (KERN_INFO PFX "Trying to insert into local/stolen memory\n");
-               return -EINVAL;
+               goto out_err;
        }
 
        if ((pg_start + mem->page_count) > num_entries)
-               return -EINVAL;
+               goto out_err;
 
        /* The i830 can't check the GTT for entries since its read only,
         * depend on the caller to make the correct offset decisions.
         */
 
-       if ((type != 0 && type != AGP_PHYS_MEMORY) ||
-               (mem->type != 0 && mem->type != AGP_PHYS_MEMORY))
-               return -EINVAL;
+       if (type != mem->type)
+               goto out_err;
+
+       mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
 
-       if (!mem->is_flushed) {
+       if (mask_type != 0 && mask_type != AGP_PHYS_MEMORY &&
+           mask_type != INTEL_AGP_CACHED_MEMORY)
+               goto out_err;
+
+       if (!mem->is_flushed)
                global_cache_flush();
-               mem->is_flushed = TRUE;
-       }
 
        for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
                writel(agp_bridge->driver->mask_memory(agp_bridge,
-                       mem->memory[i], mem->type),
-                       intel_i830_private.registers+I810_PTE_BASE+(j*4));
+                                                      mem->memory[i], mask_type),
+                      intel_i830_private.registers+I810_PTE_BASE+(j*4));
        }
        readl(intel_i830_private.registers+I810_PTE_BASE+((j-1)*4));
-
        agp_bridge->driver->tlb_flush(mem);
-       return 0;
+
+out:
+       ret = 0;
+out_err:
+       mem->is_flushed = 1;
+       return ret;
 }
 
 static int intel_i830_remove_entries(struct agp_memory *mem,off_t pg_start,
@@ -687,7 +721,6 @@ static struct agp_memory *intel_i830_alloc_by_type(size_t pg_count,int type)
 {
        if (type == AGP_PHYS_MEMORY)
                return alloc_agpphysmem_i8xx(pg_count, type);
-
        /* always return NULL for other allocation types for now */
        return NULL;
 }
@@ -734,9 +767,11 @@ static int intel_i915_insert_entries(struct agp_memory *mem,off_t pg_start,
 {
        int i,j,num_entries;
        void *temp;
+       int ret = -EINVAL;
+       int mask_type;
 
        if (mem->page_count == 0)
-               return 0;
+               goto out;
 
        temp = agp_bridge->current_size;
        num_entries = A_SIZE_FIX(temp)->num_entries;
@@ -746,33 +781,41 @@ static int intel_i915_insert_entries(struct agp_memory *mem,off_t pg_start,
                                pg_start,intel_i830_private.gtt_entries);
 
                printk (KERN_INFO PFX "Trying to insert into local/stolen memory\n");
-               return -EINVAL;
+               goto out_err;
        }
 
        if ((pg_start + mem->page_count) > num_entries)
-               return -EINVAL;
+               goto out_err;
 
-       /* The i830 can't check the GTT for entries since its read only,
+       /* The i915 can't check the GTT for entries since its read only,
         * depend on the caller to make the correct offset decisions.
         */
 
-       if ((type != 0 && type != AGP_PHYS_MEMORY) ||
-               (mem->type != 0 && mem->type != AGP_PHYS_MEMORY))
-               return -EINVAL;
+       if (type != mem->type)
+               goto out_err;
+
+       mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
 
-       if (!mem->is_flushed) {
+       if (mask_type != 0 && mask_type != AGP_PHYS_MEMORY &&
+           mask_type != INTEL_AGP_CACHED_MEMORY)
+               goto out_err;
+
+       if (!mem->is_flushed)
                global_cache_flush();
-               mem->is_flushed = TRUE;
-       }
 
        for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
                writel(agp_bridge->driver->mask_memory(agp_bridge,
-                       mem->memory[i], mem->type), intel_i830_private.gtt+j);
+                       mem->memory[i], mask_type), intel_i830_private.gtt+j);
        }
-       readl(intel_i830_private.gtt+j-1);
 
+       readl(intel_i830_private.gtt+j-1);
        agp_bridge->driver->tlb_flush(mem);
-       return 0;
+
+ out:
+       ret = 0;
+ out_err:
+       mem->is_flushed = 1;
+       return ret;
 }
 
 static int intel_i915_remove_entries(struct agp_memory *mem,off_t pg_start,
@@ -803,7 +846,7 @@ static int intel_i915_remove_entries(struct agp_memory *mem,off_t pg_start,
  */
 static int intel_i9xx_fetch_size(void)
 {
-       int num_sizes = sizeof(intel_i830_sizes) / sizeof(*intel_i830_sizes);
+       int num_sizes = ARRAY_SIZE(intel_i830_sizes);
        int aper_size; /* size in megabytes */
        int i;
 
@@ -1384,6 +1427,7 @@ static struct agp_bridge_driver intel_generic_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static struct agp_bridge_driver intel_810_driver = {
@@ -1408,6 +1452,7 @@ static struct agp_bridge_driver intel_810_driver = {
        .free_by_type           = intel_i810_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static struct agp_bridge_driver intel_815_driver = {
@@ -1431,6 +1476,7 @@ static struct agp_bridge_driver intel_815_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static struct agp_bridge_driver intel_830_driver = {
@@ -1455,6 +1501,7 @@ static struct agp_bridge_driver intel_830_driver = {
        .free_by_type           = intel_i810_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = intel_i830_type_to_mask_type,
 };
 
 static struct agp_bridge_driver intel_820_driver = {
@@ -1478,6 +1525,7 @@ static struct agp_bridge_driver intel_820_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static struct agp_bridge_driver intel_830mp_driver = {
@@ -1501,6 +1549,7 @@ static struct agp_bridge_driver intel_830mp_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static struct agp_bridge_driver intel_840_driver = {
@@ -1524,6 +1573,7 @@ static struct agp_bridge_driver intel_840_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static struct agp_bridge_driver intel_845_driver = {
@@ -1547,6 +1597,7 @@ static struct agp_bridge_driver intel_845_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static struct agp_bridge_driver intel_850_driver = {
@@ -1570,6 +1621,7 @@ static struct agp_bridge_driver intel_850_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static struct agp_bridge_driver intel_860_driver = {
@@ -1593,6 +1645,7 @@ static struct agp_bridge_driver intel_860_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static struct agp_bridge_driver intel_915_driver = {
@@ -1617,6 +1670,7 @@ static struct agp_bridge_driver intel_915_driver = {
        .free_by_type           = intel_i810_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = intel_i830_type_to_mask_type,
 };
 
 static struct agp_bridge_driver intel_i965_driver = {
@@ -1641,6 +1695,7 @@ static struct agp_bridge_driver intel_i965_driver = {
        .free_by_type           = intel_i810_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = intel_i830_type_to_mask_type,
 };
 
 static struct agp_bridge_driver intel_7505_driver = {
@@ -1664,6 +1719,7 @@ static struct agp_bridge_driver intel_7505_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static int find_i810(u16 device)
index df7f37b2739abe007a9f9f629f301941f65cadf7..2563286b2fcf3db9a112a986147cd0d23c2c5ed0 100644 (file)
@@ -310,6 +310,7 @@ static struct agp_bridge_driver nvidia_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static int __devinit agp_nvidia_probe(struct pci_dev *pdev,
index 17c50b0f83f0ab5514ca768a9c97bc6a262f360e..b7b4590673ae977d67231ffb5eeb381b2243bcfb 100644 (file)
@@ -228,6 +228,7 @@ struct agp_bridge_driver parisc_agp_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
        .cant_use_aperture      = 1,
 };
 
index 902648db7efaddb4a526eab1e56b70633bba8d9a..92d1dc45b9be05d53fa04fde3c21c2dae4097488 100644 (file)
@@ -265,6 +265,7 @@ struct agp_bridge_driver sgi_tioca_driver = {
        .free_by_type = agp_generic_free_by_type,
        .agp_alloc_page = sgi_tioca_alloc_page,
        .agp_destroy_page = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
        .cant_use_aperture = 1,
        .needs_scratch_page = 0,
        .num_aperture_sizes = 1,
index a00fd48a6f05cc55fdd66451d425e1f7ae1aaddc..60342b708152d25ccd06bbf097b438f179017bb3 100644 (file)
@@ -140,6 +140,7 @@ static struct agp_bridge_driver sis_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static struct agp_device_ids sis_agp_device_ids[] __devinitdata =
index 4f2d7d99902f1cfc21ad988846d1176609b3ccf2..9f5ae7714f85e1c8e30e7ff3ae2440f24e5ea91e 100644 (file)
@@ -444,6 +444,7 @@ static struct agp_bridge_driver sworks_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static int __devinit agp_serverworks_probe(struct pci_dev *pdev,
index dffc19382f7eb828f73426e91b7524f5ffce3305..6c45702e542cc7394ee5596b0d06ef3a2d49047b 100644 (file)
@@ -510,6 +510,7 @@ struct agp_bridge_driver uninorth_agp_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
        .cant_use_aperture      = 1,
 };
 
@@ -534,6 +535,7 @@ struct agp_bridge_driver u3_agp_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
        .cant_use_aperture      = 1,
        .needs_scratch_page     = 1,
 };
index 2ded7a280d7f784eeb0c5ead3a3b55a2e1927c04..2e7c04370cd9e16340ed51da02f38ac30cbce086 100644 (file)
@@ -191,6 +191,7 @@ static struct agp_bridge_driver via_agp3_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static struct agp_bridge_driver via_driver = {
@@ -214,6 +215,7 @@ static struct agp_bridge_driver via_driver = {
        .free_by_type           = agp_generic_free_by_type,
        .agp_alloc_page         = agp_generic_alloc_page,
        .agp_destroy_page       = agp_generic_destroy_page,
+       .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 };
 
 static struct agp_device_ids via_agp_device_ids[] __devinitdata =
index feb4ac802a0d1e44f8fef6d24a7e7638a0d3b563..0e2b72f2b8871d96f124581bba1ee724c2f936c0 100644 (file)
@@ -527,10 +527,8 @@ static void do_softint(unsigned long private_)
        if (!tty)
                return;
 
-       if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) {
+       if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event))
                tty_wakeup(tty);
-               wake_up_interruptible(&tty->write_wait);
-       }
 }
 
 /*
@@ -904,8 +902,7 @@ static int rs_write(struct tty_struct * tty, const unsigned char *buf, int count
        if (!info->xmit.buf)
                return 0;
 
-       local_save_flags(flags);
-       local_irq_disable();
+       local_irq_save(flags);
        while (1) {
                c = CIRC_SPACE_TO_END(info->xmit.head,
                                      info->xmit.tail,
@@ -968,7 +965,6 @@ static void rs_flush_buffer(struct tty_struct *tty)
        local_irq_save(flags);
        info->xmit.head = info->xmit.tail = 0;
        local_irq_restore(flags);
-       wake_up_interruptible(&tty->write_wait);
        tty_wakeup(tty);
 }
 
index 9f8082f8dd290c61aa9d13d6dc5f5be64c68d47d..8dcf9d20f44985be7cbf707bee14e5e20af6a077 100644 (file)
@@ -8,7 +8,6 @@
 
 #include <linux/types.h>
 #include <linux/errno.h>
-#include <linux/sched.h>
 #include <linux/tty.h>
 #include <linux/timer.h>
 #include <linux/kernel.h>
@@ -187,7 +186,7 @@ static ssize_t briq_panel_write(struct file *file, const char __user *buf, size_
        return len;
 }
 
-static struct file_operations briq_panel_fops = {
+static const struct file_operations briq_panel_fops = {
        .owner          = THIS_MODULE,
        .read           = briq_panel_read,
        .write          = briq_panel_write,
index 3ffa0807754c34313f9288299552f97df2c8468f..54df35527bc50b0d946fd1c7993d6aa84afed6b8 100644 (file)
@@ -829,17 +829,18 @@ static unsigned short cy_pci_nboard;
 static unsigned short cy_isa_nboard;
 static unsigned short cy_nboard;
 #ifdef CONFIG_PCI
-static unsigned short cy_pci_dev_id[] = {
-       PCI_DEVICE_ID_CYCLOM_Y_Lo,      /* PCI < 1Mb */
-       PCI_DEVICE_ID_CYCLOM_Y_Hi,      /* PCI > 1Mb */
-       PCI_DEVICE_ID_CYCLOM_4Y_Lo,     /* 4Y PCI < 1Mb */
-       PCI_DEVICE_ID_CYCLOM_4Y_Hi,     /* 4Y PCI > 1Mb */
-       PCI_DEVICE_ID_CYCLOM_8Y_Lo,     /* 8Y PCI < 1Mb */
-       PCI_DEVICE_ID_CYCLOM_8Y_Hi,     /* 8Y PCI > 1Mb */
-       PCI_DEVICE_ID_CYCLOM_Z_Lo,      /* Z PCI < 1Mb */
-       PCI_DEVICE_ID_CYCLOM_Z_Hi,      /* Z PCI > 1Mb */
-       0                       /* end of table */
+static struct pci_device_id cy_pci_dev_id[] __devinitdata = {
+       { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Y_Lo) },      /* PCI < 1Mb */
+       { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Y_Hi) },      /* PCI > 1Mb */
+       { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_4Y_Lo) },     /* 4Y PCI < 1Mb */
+       { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_4Y_Hi) },     /* 4Y PCI > 1Mb */
+       { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_8Y_Lo) },     /* 8Y PCI < 1Mb */
+       { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_8Y_Hi) },     /* 8Y PCI > 1Mb */
+       { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Z_Lo) },      /* Z PCI < 1Mb */
+       { PCI_DEVICE(PCI_VENDOR_ID_CYCLADES, PCI_DEVICE_ID_CYCLOM_Z_Hi) },      /* Z PCI > 1Mb */
+       { }                     /* end of table */
 };
+MODULE_DEVICE_TABLE(pci, cy_pci_dev_id);
 #endif
 
 static void cy_start(struct tty_struct *);
@@ -4488,7 +4489,6 @@ static void cy_flush_buffer(struct tty_struct *tty)
                CY_UNLOCK(info, flags);
        }
        tty_wakeup(tty);
-       wake_up_interruptible(&tty->write_wait);
 }                              /* cy_flush_buffer */
 
 /*
@@ -4759,7 +4759,7 @@ static int __init cy_detect_pci(void)
 
        for (i = 0; i < NR_CARDS; i++) {
                /* look for a Cyclades card by vendor and device id */
-               while ((device_id = cy_pci_dev_id[dev_index]) != 0) {
+               while ((device_id = cy_pci_dev_id[dev_index].device) != 0) {
                        if ((pdev = pci_get_device(PCI_VENDOR_ID_CYCLADES,
                                                   device_id, pdev)) == NULL) {
                                dev_index++;    /* try next device id */
index a70af0de44533efc1914d236218f363e13ac4891..f5b9b2480c149a9d62641f7dcd4ccc0c2d56db1a 100644 (file)
@@ -371,7 +371,7 @@ void drm_exit(struct drm_driver *driver)
 EXPORT_SYMBOL(drm_exit);
 
 /** File operations structure */
-static struct file_operations drm_stub_fops = {
+static const struct file_operations drm_stub_fops = {
        .owner = THIS_MODULE,
        .open = drm_stub_open
 };
index 1383727b443ad98fb28795b1f71c7ecd02ff0d46..ac9ab40d57aa23b1d4b16a3f66ca38746c5c6b53 100644 (file)
@@ -7,7 +7,6 @@
  * for authors.
  */
 
-#include <linux/sched.h>
 #include <asm/upa.h>
 
 #include "ffb.h"
index dd45111a48547619063d30dfdadd2eb2c78a81ba..9a19879e3b688fa7f3924bad6e624846148dc7be 100644 (file)
@@ -9,7 +9,6 @@
 
 #include "ffb_drv.h"
 
-#include <linux/sched.h>
 #include <linux/smp_lock.h>
 #include <asm/shmparam.h>
 #include <asm/oplib.h>
index 60cb4e45a75e52362db30dc19bf47d428324f96a..603d17fd2d6912e556250a758b7e3336b96bb3b4 100644 (file)
@@ -112,7 +112,7 @@ static int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
        return 0;
 }
 
-static struct file_operations i810_buffer_fops = {
+static const struct file_operations i810_buffer_fops = {
        .open = drm_open,
        .release = drm_release,
        .ioctl = drm_ioctl,
index 95224455ec0cf55078d2598ace38b5730719faff..3314a9fea9e52471304996f251ab9093b8f2d4c9 100644 (file)
@@ -114,7 +114,7 @@ static int i830_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
        return 0;
 }
 
-static struct file_operations i830_buffer_fops = {
+static const struct file_operations i830_buffer_fops = {
        .open = drm_open,
        .release = drm_release,
        .ioctl = drm_ioctl,
index 2054d5773717ac6952fcfcf84186930c022067a5..2881a06b6f558a614bcc9c9de1fd8a6822c923b7 100644 (file)
@@ -376,10 +376,8 @@ via_dmablit_handler(drm_device_t *dev, int engine, int from_irq)
                        blitq->cur = cur;
                        blitq->num_outstanding--;
                        blitq->end = jiffies + DRM_HZ;
-                       if (!timer_pending(&blitq->poll_timer)) {
-                               blitq->poll_timer.expires = jiffies+1;
-                               add_timer(&blitq->poll_timer);
-                       }
+                       if (!timer_pending(&blitq->poll_timer))
+                               mod_timer(&blitq->poll_timer, jiffies + 1);
                } else {
                        if (timer_pending(&blitq->poll_timer)) {
                                del_timer(&blitq->poll_timer);
@@ -478,8 +476,7 @@ via_dmablit_timer(unsigned long data)
        via_dmablit_handler(dev, engine, 0);
        
        if (!timer_pending(&blitq->poll_timer)) {
-               blitq->poll_timer.expires = jiffies+1;
-               add_timer(&blitq->poll_timer);
+               mod_timer(&blitq->poll_timer, jiffies + 1);
 
               /*
                * Rerun handler to delete timer if engines are off, and
@@ -574,9 +571,8 @@ via_init_dmablit(drm_device_t *dev)
                }
                DRM_INIT_WAITQUEUE(&blitq->busy_queue);
                INIT_WORK(&blitq->wq, via_dmablit_workqueue);
-               init_timer(&blitq->poll_timer);
-               blitq->poll_timer.function = &via_dmablit_timer;
-               blitq->poll_timer.data = (unsigned long) blitq;
+               setup_timer(&blitq->poll_timer, via_dmablit_timer,
+                               (unsigned long)blitq);
        }       
 }
 
index bcdb107aa96726c59c5226aacbe65df4bd9f5788..fada6ddefbae0bf45138f9bfc5167dab29265945 100644 (file)
@@ -120,7 +120,6 @@ get_rtc_time(struct rtc_time *rtc_tm)
        unsigned long flags;
 
        local_irq_save(flags);
-       local_irq_disable();
 
        rtc_tm->tm_sec = CMOS_READ(RTC_SECONDS);
        rtc_tm->tm_min = CMOS_READ(RTC_MINUTES);
@@ -219,7 +218,6 @@ rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
                        BIN_TO_BCD(yrs);
 
                        local_irq_save(flags);
-                       local_irq_disable();
                        CMOS_WRITE(yrs, RTC_YEAR);
                        CMOS_WRITE(mon, RTC_MONTH);
                        CMOS_WRITE(day, RTC_DAY_OF_MONTH);
index 48cb8f0e8ebf8000e5dcc697d1d20383ae7cfd50..3d7efc26aad61338818a1416ff4d344ad4227a76 100644 (file)
@@ -3,7 +3,6 @@
  *   thermometer driver (as used in the Rebel.com NetWinder)
  */
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/miscdevice.h>
 #include <linux/smp_lock.h>
 #include <linux/delay.h>
index 06f2dbf17710770e5829d464e81cfb48d5e8367c..db984e481d4ca42908fffee5fb426528d119e82b 100644 (file)
@@ -25,7 +25,6 @@
 
 #include <linux/module.h>
 #include <linux/slab.h>        /* for kmalloc() and kfree() */
-#include <linux/sched.h>       /* for struct wait_queue etc */
 #include <linux/major.h>
 #include <linux/types.h>
 #include <linux/errno.h>
index d4005e94fe5f36b90b56e3f7f299c3c82c3fef21..d8dbdb9162329c62bcb8821547cb70c2c94102ee 100644 (file)
@@ -72,6 +72,7 @@
 #define TRACE_RET ((void) 0)
 #endif                         /* TRACING */
 
+static void dtlk_timer_tick(unsigned long data);
 
 static int dtlk_major;
 static int dtlk_port_lpc;
@@ -81,7 +82,7 @@ static int dtlk_has_indexing;
 static unsigned int dtlk_portlist[] =
 {0x25e, 0x29e, 0x2de, 0x31e, 0x35e, 0x39e, 0};
 static wait_queue_head_t dtlk_process_list;
-static struct timer_list dtlk_timer;
+static DEFINE_TIMER(dtlk_timer, dtlk_timer_tick, 0, 0);
 
 /* prototypes for file_operations struct */
 static ssize_t dtlk_read(struct file *, char __user *,
@@ -117,7 +118,6 @@ static char dtlk_write_tts(char);
 /*
    static void dtlk_handle_error(char, char, unsigned int);
  */
-static void dtlk_timer_tick(unsigned long data);
 
 static ssize_t dtlk_read(struct file *file, char __user *buf,
                         size_t count, loff_t * ppos)
@@ -318,7 +318,7 @@ static int dtlk_release(struct inode *inode, struct file *file)
        }
        TRACE_RET;
        
-       del_timer(&dtlk_timer);
+       del_timer_sync(&dtlk_timer);
 
        return 0;
 }
@@ -336,8 +336,6 @@ static int __init dtlk_init(void)
        if (dtlk_dev_probe() == 0)
                printk(", MAJOR %d\n", dtlk_major);
 
-       init_timer(&dtlk_timer);
-       dtlk_timer.function = dtlk_timer_tick;
        init_waitqueue_head(&dtlk_process_list);
 
        return 0;
index a0f822c9d74def65e14f97fb319d782b305ef19d..88fc24fc43928674ef24647a394a2348cd18c082 100644 (file)
@@ -844,7 +844,6 @@ static void pc_flush_buffer(struct tty_struct *tty)
        fepcmd(ch, STOUT, (unsigned) tail, 0, 0, 0);
        memoff(ch);
        spin_unlock_irqrestore(&epca_lock, flags);
-       wake_up_interruptible(&tty->write_wait);
        tty_wakeup(tty);
 } /* End pc_flush_buffer */
 
@@ -1795,7 +1794,6 @@ static void doevent(int crd)
                                { /* Begin if LOWWAIT */
                                        ch->statusflags &= ~LOWWAIT;
                                        tty_wakeup(tty);
-                                       wake_up_interruptible(&tty->write_wait);
                                } /* End if LOWWAIT */
                        } else if (event & EMPTYTX_IND)  { /* Begin EMPTYTX_IND */
                                /* This event is generated by setup_empty_event */
@@ -1803,7 +1801,6 @@ static void doevent(int crd)
                                if (ch->statusflags & EMPTYWAIT)  { /* Begin if EMPTYWAIT */
                                        ch->statusflags &= ~EMPTYWAIT;
                                        tty_wakeup(tty);
-                                       wake_up_interruptible(&tty->write_wait);
                                } /* End if EMPTYWAIT */
                        } /* End EMPTYTX_IND */
                } /* End if valid tty */
index 43ff59816511dddb6f8316c363dfeb39340e2400..2398e864c28d98ab3d11dfb64fe39b9485c1a103 100644 (file)
@@ -117,7 +117,7 @@ static int nvram_ioctl(struct inode *inode, struct file *file,
        return 0;
 }
 
-struct file_operations nvram_fops = {
+const struct file_operations nvram_fops = {
        .owner          = THIS_MODULE,
        .llseek         = nvram_llseek,
        .read           = read_nvram,
index e769811e74172d36bff0d845a9fab7327299b158..337bbcdcf13dfb84642ea646c975bc7abe99a07c 100644 (file)
@@ -382,7 +382,6 @@ void gs_flush_buffer(struct tty_struct *tty)
        port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
        spin_unlock_irqrestore (&port->driver_lock, flags);
 
-       wake_up_interruptible(&tty->write_wait);
        tty_wakeup(tty);
        func_exit ();
 }
index 1aa93a752a9c0c636bf6945224c7ea6aa787bf48..ae76a9ffe89f56481dc0cb851e3e0687b66b8694 100644 (file)
@@ -117,7 +117,7 @@ __setup("hcheck_reboot", hangcheck_parse_reboot);
 __setup("hcheck_dump_tasks", hangcheck_parse_dump_tasks);
 #endif /* not MODULE */
 
-#if defined(CONFIG_X86_64) || defined(CONFIG_S390)
+#if defined(CONFIG_S390)
 # define HAVE_MONOTONIC
 # define TIMER_FREQ 1000000000ULL
 #elif defined(CONFIG_IA64)
index 20dc3be5ecfcf8fe987e41313902f41acdc4a2e0..0be700f4e8fd7acdceaec7dd3acf0acdf63a00d3 100644 (file)
@@ -703,7 +703,7 @@ int hpet_control(struct hpet_task *tp, unsigned int cmd, unsigned long arg)
 
 static ctl_table hpet_table[] = {
        {
-        .ctl_name = 1,
+        .ctl_name = CTL_UNNUMBERED,
         .procname = "max-user-freq",
         .data = &hpet_max_freq,
         .maxlen = sizeof(int),
@@ -715,7 +715,7 @@ static ctl_table hpet_table[] = {
 
 static ctl_table hpet_root[] = {
        {
-        .ctl_name = 1,
+        .ctl_name = CTL_UNNUMBERED,
         .procname = "hpet",
         .maxlen = 0,
         .mode = 0555,
@@ -1018,7 +1018,7 @@ static int __init hpet_init(void)
        if (result < 0)
                return -ENODEV;
 
-       sysctl_header = register_sysctl_table(dev_root, 0);
+       sysctl_header = register_sysctl_table(dev_root);
 
        result = acpi_bus_register_driver(&hpet_acpi_driver);
        if (result < 0) {
index d7806834fc171ad07f08c90f0e5b20a30c000987..50315d6364fdd98727133c9fa7930ea0aa755d0f 100644 (file)
@@ -39,7 +39,6 @@
 #include <linux/module.h>
 #include <linux/major.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/spinlock.h>
 #include <linux/sysrq.h>
 #include <linux/tty.h>
index f22e78e3c70ff81f71f3ecc3102fcade8bac958e..cc1046e6ee02d55a68bfff65a304430a20e8cb47 100644 (file)
  */
 static const struct pci_device_id pci_tbl[] = {
 /* AA
-       { 0x8086, 0x2418, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, */
-       { 0x8086, 0x2410, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* AA */
+       { PCI_DEVICE(0x8086, 0x2418) }, */
+       { PCI_DEVICE(0x8086, 0x2410) }, /* AA */
 /* AB
-       { 0x8086, 0x2428, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, */
-       { 0x8086, 0x2420, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* AB */
+       { PCI_DEVICE(0x8086, 0x2428) }, */
+       { PCI_DEVICE(0x8086, 0x2420) }, /* AB */
 /* ??
-       { 0x8086, 0x2430, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, */
+       { PCI_DEVICE(0x8086, 0x2430) }, */
 /* BAM, CAM, DBM, FBM, GxM
-       { 0x8086, 0x2448, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, */
-       { 0x8086, 0x244c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* BAM */
-       { 0x8086, 0x248c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CAM */
-       { 0x8086, 0x24cc, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* DBM */
-       { 0x8086, 0x2641, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* FBM */
-       { 0x8086, 0x27b9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* GxM */
-       { 0x8086, 0x27bd, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* GxM DH */
+       { PCI_DEVICE(0x8086, 0x2448) }, */
+       { PCI_DEVICE(0x8086, 0x244c) }, /* BAM */
+       { PCI_DEVICE(0x8086, 0x248c) }, /* CAM */
+       { PCI_DEVICE(0x8086, 0x24cc) }, /* DBM */
+       { PCI_DEVICE(0x8086, 0x2641) }, /* FBM */
+       { PCI_DEVICE(0x8086, 0x27b9) }, /* GxM */
+       { PCI_DEVICE(0x8086, 0x27bd) }, /* GxM DH */
 /* BA, CA, DB, Ex, 6300, Fx, 631x/632x, Gx
-       { 0x8086, 0x244e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, */
-       { 0x8086, 0x2440, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* BA */
-       { 0x8086, 0x2480, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* CA */
-       { 0x8086, 0x24c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* DB */
-       { 0x8086, 0x24d0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Ex */
-       { 0x8086, 0x25a1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 6300 */
-       { 0x8086, 0x2640, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Fx */
-       { 0x8086, 0x2670, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */
-       { 0x8086, 0x2671, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */
-       { 0x8086, 0x2672, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */
-       { 0x8086, 0x2673, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */
-       { 0x8086, 0x2674, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */
-       { 0x8086, 0x2675, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */
-       { 0x8086, 0x2676, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */
-       { 0x8086, 0x2677, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */
-       { 0x8086, 0x2678, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */
-       { 0x8086, 0x2679, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */
-       { 0x8086, 0x267a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */
-       { 0x8086, 0x267b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */
-       { 0x8086, 0x267c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */
-       { 0x8086, 0x267d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */
-       { 0x8086, 0x267e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */
-       { 0x8086, 0x267f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* 631x/632x */
-       { 0x8086, 0x27b8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* Gx */
+       { PCI_DEVICE(0x8086, 0x244e) }, */
+       { PCI_DEVICE(0x8086, 0x2440) }, /* BA */
+       { PCI_DEVICE(0x8086, 0x2480) }, /* CA */
+       { PCI_DEVICE(0x8086, 0x24c0) }, /* DB */
+       { PCI_DEVICE(0x8086, 0x24d0) }, /* Ex */
+       { PCI_DEVICE(0x8086, 0x25a1) }, /* 6300 */
+       { PCI_DEVICE(0x8086, 0x2640) }, /* Fx */
+       { PCI_DEVICE(0x8086, 0x2670) }, /* 631x/632x */
+       { PCI_DEVICE(0x8086, 0x2671) }, /* 631x/632x */
+       { PCI_DEVICE(0x8086, 0x2672) }, /* 631x/632x */
+       { PCI_DEVICE(0x8086, 0x2673) }, /* 631x/632x */
+       { PCI_DEVICE(0x8086, 0x2674) }, /* 631x/632x */
+       { PCI_DEVICE(0x8086, 0x2675) }, /* 631x/632x */
+       { PCI_DEVICE(0x8086, 0x2676) }, /* 631x/632x */
+       { PCI_DEVICE(0x8086, 0x2677) }, /* 631x/632x */
+       { PCI_DEVICE(0x8086, 0x2678) }, /* 631x/632x */
+       { PCI_DEVICE(0x8086, 0x2679) }, /* 631x/632x */
+       { PCI_DEVICE(0x8086, 0x267a) }, /* 631x/632x */
+       { PCI_DEVICE(0x8086, 0x267b) }, /* 631x/632x */
+       { PCI_DEVICE(0x8086, 0x267c) }, /* 631x/632x */
+       { PCI_DEVICE(0x8086, 0x267d) }, /* 631x/632x */
+       { PCI_DEVICE(0x8086, 0x267e) }, /* 631x/632x */
+       { PCI_DEVICE(0x8086, 0x267f) }, /* 631x/632x */
+       { PCI_DEVICE(0x8086, 0x27b8) }, /* Gx */
 /* E
-       { 0x8086, 0x245e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, */
-       { 0x8086, 0x2450, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, }, /* E  */
+       { PCI_DEVICE(0x8086, 0x245e) }, */
+       { PCI_DEVICE(0x8086, 0x2450) }, /* E  */
        { 0, }, /* terminate list */
 };
 MODULE_DEVICE_TABLE(pci, pci_tbl);
index 78045767ec33691d7b8b89770c00f5f39b935f48..f86fa0c55d364b05131574d6b48a73be996d5872 100644 (file)
@@ -80,7 +80,7 @@ static int i2RetryFlushOutput(i2ChanStrPtr);
 // Not a documented part of the library routines (careful...) but the Diagnostic
 // i2diag.c finds them useful to help the throughput in certain limited
 // single-threaded operations.
-static void iiSendPendingMail(i2eBordStrPtr);
+static inline void iiSendPendingMail(i2eBordStrPtr);
 static void serviceOutgoingFifo(i2eBordStrPtr);
 
 // Functions defined in ip2.c as part of interrupt handling
@@ -150,6 +150,13 @@ i2Validate ( i2ChanStrPtr pCh )
                          == (CHANNEL_MAGIC | CHANNEL_SUPPORT));
 }
 
+static void iiSendPendingMail_t(unsigned long data)
+{
+       i2eBordStrPtr pB = (i2eBordStrPtr)data;
+
+       iiSendPendingMail(pB);
+}
+
 //******************************************************************************
 // Function:   iiSendPendingMail(pB)
 // Parameters: Pointer to a board structure
@@ -184,12 +191,9 @@ iiSendPendingMail(i2eBordStrPtr pB)
                        /\/\|=mhw=|\/\/                         */
 
                        if( ++pB->SendPendingRetry < 16 ) {
-
-                               init_timer( &(pB->SendPendingTimer) );
-                               pB->SendPendingTimer.expires  = jiffies + 1;
-                               pB->SendPendingTimer.function = (void*)(unsigned long)iiSendPendingMail;
-                               pB->SendPendingTimer.data     = (unsigned long)pB;
-                               add_timer( &(pB->SendPendingTimer) );
+                               setup_timer(&pB->SendPendingTimer,
+                                       iiSendPendingMail_t, (unsigned long)pB);
+                               mod_timer(&pB->SendPendingTimer, jiffies + 1);
                        } else {
                                printk( KERN_ERR "IP2: iiSendPendingMail unable to queue outbound mail\n" );
                        }
@@ -1265,8 +1269,10 @@ i2RetryFlushOutput(i2ChanStrPtr pCh)
 // soon as all the data is completely sent.
 //******************************************************************************
 static void
-i2DrainWakeup(i2ChanStrPtr pCh)
+i2DrainWakeup(unsigned long d)
 {
+       i2ChanStrPtr pCh = (i2ChanStrPtr)d;
+
        ip2trace (CHANN, ITRC_DRAIN, 10, 1, pCh->BookmarkTimer.expires );
 
        pCh->BookmarkTimer.expires = 0;
@@ -1292,14 +1298,12 @@ i2DrainOutput(i2ChanStrPtr pCh, int timeout)
        }
        if ((timeout > 0) && (pCh->BookmarkTimer.expires == 0 )) {
                // One per customer (channel)
-               init_timer( &(pCh->BookmarkTimer) );
-               pCh->BookmarkTimer.expires  = jiffies + timeout;
-               pCh->BookmarkTimer.function = (void*)(unsigned long)i2DrainWakeup;
-               pCh->BookmarkTimer.data     = (unsigned long)pCh;
+               setup_timer(&pCh->BookmarkTimer, i2DrainWakeup,
+                               (unsigned long)pCh);
 
                ip2trace (CHANN, ITRC_DRAIN, 1, 1, pCh->BookmarkTimer.expires );
 
-               add_timer( &(pCh->BookmarkTimer) );
+               mod_timer(&pCh->BookmarkTimer, jiffies + timeout);
        }
        
        i2QueueCommands( PTYPE_INLINE, pCh, -1, 1, CMD_BMARK_REQ );
@@ -1373,15 +1377,7 @@ ip2_owake( PTTY tp)
        ip2trace (CHANN, ITRC_SICMD, 10, 2, tp->flags,
                        (1 << TTY_DO_WRITE_WAKEUP) );
 
-       wake_up_interruptible ( &tp->write_wait );
-       if ( ( tp->flags & (1 << TTY_DO_WRITE_WAKEUP) ) 
-         && tp->ldisc.write_wakeup )
-       {
-               (tp->ldisc.write_wakeup) ( tp );
-
-               ip2trace (CHANN, ITRC_SICMD, 11, 0 );
-
-       }
+       tty_wakeup(tp);
 }
 
 static inline void
index 7c70310a49b5b48a771a86f188f8489521c07123..83c7258d358067c3d72944494b4ff49a891407e4 100644 (file)
@@ -1271,8 +1271,8 @@ static void do_input(struct work_struct *work)
 // code duplicated from n_tty (ldisc)
 static inline void  isig(int sig, struct tty_struct *tty, int flush)
 {
-       if (tty->pgrp > 0)
-               kill_pg(tty->pgrp, sig, 1);
+       if (tty->pgrp)
+               kill_pgrp(tty->pgrp, sig, 1);
        if (flush || !L_NOFLSH(tty)) {
                if ( tty->ldisc.flush_buffer )  
                        tty->ldisc.flush_buffer(tty);
index ff2d052177cb9250c17198b66e5f510db1b52267..c2aa44ee6eb6d89848e68ee42e1b3cba4a799ab7 100644 (file)
@@ -35,7 +35,6 @@
 #include <linux/moduleparam.h>
 #include <linux/errno.h>
 #include <asm/system.h>
-#include <linux/sched.h>
 #include <linux/poll.h>
 #include <linux/spinlock.h>
 #include <linux/slab.h>
index 53582b53da95c449a9cb730f1b93734793139c30..8e222f2b80cc4bb2ee28535e936fcd83d6fb397c 100644 (file)
@@ -34,7 +34,6 @@
 #include <linux/module.h>
 #include <linux/errno.h>
 #include <asm/system.h>
-#include <linux/sched.h>
 #include <linux/poll.h>
 #include <linux/spinlock.h>
 #include <linux/mutex.h>
@@ -406,13 +405,14 @@ static void clean_up_interface_data(ipmi_smi_t intf)
        free_smi_msg_list(&intf->waiting_msgs);
        free_recv_msg_list(&intf->waiting_events);
 
-       /* Wholesale remove all the entries from the list in the
-        * interface and wait for RCU to know that none are in use. */
+       /*
+        * Wholesale remove all the entries from the list in the
+        * interface and wait for RCU to know that none are in use.
+        */
        mutex_lock(&intf->cmd_rcvrs_mutex);
-       list_add_rcu(&list, &intf->cmd_rcvrs);
-       list_del_rcu(&intf->cmd_rcvrs);
+       INIT_LIST_HEAD(&list);
+       list_splice_init_rcu(&intf->cmd_rcvrs, &list, synchronize_rcu);
        mutex_unlock(&intf->cmd_rcvrs_mutex);
-       synchronize_rcu();
 
        list_for_each_entry_safe(rcvr, rcvr2, &list, link)
                kfree(rcvr);
@@ -451,7 +451,7 @@ int ipmi_smi_watcher_register(struct ipmi_smi_watcher *watcher)
        mutex_lock(&ipmi_interfaces_mutex);
 
        /* Build a list of things to deliver. */
-       list_for_each_entry_rcu(intf, &ipmi_interfaces, link) {
+       list_for_each_entry(intf, &ipmi_interfaces, link) {
                if (intf->intf_num == -1)
                        continue;
                e = kmalloc(sizeof(*e), GFP_KERNEL);
@@ -1886,7 +1886,6 @@ int ipmi_smi_add_proc_entry(ipmi_smi_t smi, char *name,
                kfree(entry);
                rv = -ENOMEM;
        } else {
-               file->nlink = 1;
                file->data = data;
                file->read_proc = read_proc;
                file->write_proc = write_proc;
@@ -2760,9 +2759,15 @@ int ipmi_register_smi(struct ipmi_smi_handlers *handlers,
                synchronize_rcu();
                kref_put(&intf->refcount, intf_free);
        } else {
-               /* After this point the interface is legal to use. */
+               /*
+                * Keep memory order straight for RCU readers.  Make
+                * sure everything else is committed to memory before
+                * setting intf_num to mark the interface valid.
+                */
+               smp_wmb();
                intf->intf_num = i;
                mutex_unlock(&ipmi_interfaces_mutex);
+               /* After this point the interface is legal to use. */
                call_smi_watchers(i, intf->si_dev);
                mutex_unlock(&smi_watchers_mutex);
        }
@@ -3923,6 +3928,14 @@ static void send_panic_events(char *str)
                        /* Interface was not ready yet. */
                        continue;
 
+               /*
+                * intf_num is used as an marker to tell if the
+                * interface is valid.  Thus we need a read barrier to
+                * make sure data fetched before checking intf_num
+                * won't be used.
+                */
+               smp_rmb();
+
                /* First job here is to figure out where to send the
                   OEM events.  There's no way in IPMI to send OEM
                   events using an event send command, so we have to
index 9d23136e598a74ce54c4a52d6a250f8f8a6202b5..e02893b7b300907e8a1d18555c155c3b7283c8dc 100644 (file)
@@ -686,7 +686,7 @@ static int ipmi_poweroff_init (void)
                printk(KERN_INFO PFX "Power cycle is enabled.\n");
 
 #ifdef CONFIG_PROC_FS
-       ipmi_table_header = register_sysctl_table(ipmi_root_table, 1);
+       ipmi_table_header = register_sysctl_table(ipmi_root_table);
        if (!ipmi_table_header) {
                printk(KERN_ERR PFX "Unable to register powercycle sysctl\n");
                rv = -ENOMEM;
index 01084abffddf66070e1c5b97847e8fc893f59f16..43ab9edc76f540ce254f07f827e00414bd70abc2 100644 (file)
@@ -183,7 +183,7 @@ static DEFINE_TIMER(tx, isicom_tx, 0, 0);
 /*   baud index mappings from linux defns to isi */
 
 static signed char linuxb_to_isib[] = {
-       -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 15, 16, 17, 18, 19
+       -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 15, 16, 17, 18, 19, 20, 21
 };
 
 struct isi_board {
@@ -213,8 +213,6 @@ struct      isi_port {
        struct tty_struct       * tty;
        wait_queue_head_t       close_wait;
        wait_queue_head_t       open_wait;
-       struct work_struct      hangup_tq;
-       struct work_struct      bh_tqueue;
        unsigned char           * xmit_buf;
        int                     xmit_head;
        int                     xmit_tail;
@@ -510,7 +508,7 @@ static void isicom_tx(unsigned long _data)
                if (port->xmit_cnt <= 0)
                        port->status &= ~ISI_TXOK;
                if (port->xmit_cnt <= WAKEUP_CHARS)
-                       schedule_work(&port->bh_tqueue);
+                       tty_wakeup(tty);
                unlock_card(&isi_card[card]);
        }
 
@@ -524,21 +522,6 @@ sched_again:
        mod_timer(&tx, jiffies + msecs_to_jiffies(10));
 }
 
-/*     Interrupt handlers      */
-
-
-static void isicom_bottomhalf(struct work_struct *work)
-{
-       struct isi_port *port = container_of(work, struct isi_port, bh_tqueue);
-       struct tty_struct *tty = port->tty;
-
-       if (!tty)
-               return;
-
-       tty_wakeup(tty);
-       wake_up_interruptible(&tty->write_wait);
-}
-
 /*
  *     Main interrupt handler routine
  */
@@ -557,6 +540,11 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
                return IRQ_NONE;
 
        base = card->base;
+
+       /* did the card interrupt us? */
+       if (!(inw(base + 0x0e) & 0x02))
+               return IRQ_NONE;
+
        spin_lock(&card->card_lock);
 
        /*
@@ -581,6 +569,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
        port = card->ports + channel;
        if (!(port->flags & ASYNC_INITIALIZED)) {
                outw(0x0000, base+0x04); /* enable interrupts */
+               spin_unlock(&card->card_lock);
                return IRQ_HANDLED;
        }
 
@@ -609,7 +598,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
                                                pr_dbg("interrupt: DCD->low.\n"
                                                        );
                                                port->status &= ~ISI_DCD;
-                                               schedule_work(&port->hangup_tq);
+                                               tty_hangup(tty);
                                        }
                                } else if (header & ISI_DCD) {
                                /* Carrier has been detected */
@@ -631,7 +620,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
                                                /* start tx ing */
                                                port->status |= (ISI_TXOK
                                                        | ISI_CTS);
-                                               schedule_work(&port->bh_tqueue);
+                                               tty_wakeup(tty);
                                        }
                                } else if (!(header & ISI_CTS)) {
                                        port->tty->hw_stopped = 1;
@@ -695,6 +684,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
                tty_flip_buffer_push(tty);
        }
        outw(0x0000, base+0x04); /* enable interrupts */
+       spin_unlock(&card->card_lock);
 
        return IRQ_HANDLED;
 }
@@ -720,7 +710,8 @@ static void isicom_config_port(struct isi_port *port)
                 *  respectively.
                 */
 
-               if (baud < 1 || baud > 2)
+               /* 1,2,3,4 => 57.6, 115.2, 230, 460 kbps resp. */
+               if (baud < 1 || baud > 4)
                        port->tty->termios->c_cflag &= ~CBAUDEX;
                else
                        baud += 15;
@@ -736,6 +727,10 @@ static void isicom_config_port(struct isi_port *port)
                        baud++; /*  57.6 Kbps */
                if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
                        baud +=2; /*  115  Kbps */
+               if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI)
+                       baud += 3; /* 230 kbps*/
+               if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP)
+                       baud += 4; /* 460 kbps*/
        }
        if (linuxb_to_isib[baud] == -1) {
                /* hang up */
@@ -1460,17 +1455,6 @@ static void isicom_start(struct tty_struct *tty)
        port->status |= ISI_TXOK;
 }
 
-/* hangup et all */
-static void do_isicom_hangup(struct work_struct *work)
-{
-       struct isi_port *port = container_of(work, struct isi_port, hangup_tq);
-       struct tty_struct *tty;
-
-       tty = port->tty;
-       if (tty)
-               tty_hangup(tty);
-}
-
 static void isicom_hangup(struct tty_struct *tty)
 {
        struct isi_port *port = tty->driver_data;
@@ -1503,7 +1487,6 @@ static void isicom_flush_buffer(struct tty_struct *tty)
        port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
        spin_unlock_irqrestore(&card->card_lock, flags);
 
-       wake_up_interruptible(&tty->write_wait);
        tty_wakeup(tty);
 }
 
@@ -1536,7 +1519,7 @@ static int __devinit reset_card(struct pci_dev *pdev,
 {
        struct isi_board *board = pci_get_drvdata(pdev);
        unsigned long base = board->base;
-       unsigned int portcount = 0;
+       unsigned int sig, portcount = 0;
        int retval = 0;
 
        dev_dbg(&pdev->dev, "ISILoad:Resetting Card%d at 0x%lx\n", card + 1,
@@ -1544,27 +1527,35 @@ static int __devinit reset_card(struct pci_dev *pdev,
 
        inw(base + 0x8);
 
-       mdelay(10);
+       msleep(10);
 
        outw(0, base + 0x8); /* Reset */
 
-       msleep(3000);
+       msleep(1000);
 
-       *signature = inw(base + 0x4) & 0xff;
+       sig = inw(base + 0x4) & 0xff;
+
+       if (sig != 0xa5 && sig != 0xbb && sig != 0xcc && sig != 0xdd &&
+                       sig != 0xee) {
+               dev_warn(&pdev->dev, "ISILoad:Card%u reset failure (Possible "
+                       "bad I/O Port Address 0x%lx).\n", card + 1, base);
+               dev_dbg(&pdev->dev, "Sig=0x%x\n", sig);
+               retval = -EIO;
+               goto end;
+       }
+
+       msleep(10);
 
        portcount = inw(base + 0x2);
-       if (!(inw(base + 0xe) & 0x1) || ((portcount != 0) &&
-                       (portcount != 4) && (portcount != 8))) {
-               dev_dbg(&pdev->dev, "base+0x2=0x%lx, base+0xe=0x%lx\n",
-                       inw(base + 0x2), inw(base + 0xe));
-               dev_err(&pdev->dev, "ISILoad:PCI Card%d reset failure "
-                       "(Possible bad I/O Port Address 0x%lx).\n",
-                       card + 1, base);
+       if (!inw(base + 0xe) & 0x1 || (portcount != 0 && portcount != 4 &&
+                               portcount != 8 && portcount != 16)) {
+               dev_err(&pdev->dev, "ISILoad:PCI Card%d reset failure.",
+                       card + 1);
                retval = -EIO;
                goto end;
        }
 
-       switch (*signature) {
+       switch (sig) {
        case 0xa5:
        case 0xbb:
        case 0xdd:
@@ -1572,16 +1563,13 @@ static int __devinit reset_card(struct pci_dev *pdev,
                board->shift_count = 12;
                break;
        case 0xcc:
+       case 0xee:
                board->port_count = 16;
                board->shift_count = 11;
                break;
-       default:
-               dev_warn(&pdev->dev, "ISILoad:Card%d reset failure (Possible "
-                       "bad I/O Port Address 0x%lx).\n", card + 1, base);
-               dev_dbg(&pdev->dev, "Sig=0x%lx\n", signature);
-               retval = -EIO;
        }
        dev_info(&pdev->dev, "-Done\n");
+       *signature = sig;
 
 end:
        return retval;
@@ -1757,7 +1745,7 @@ end:
 /*
  *     Insmod can set static symbols so keep these static
  */
-static int card;
+static unsigned int card_count;
 
 static int __devinit isicom_probe(struct pci_dev *pdev,
        const struct pci_device_id *ent)
@@ -1767,7 +1755,7 @@ static int __devinit isicom_probe(struct pci_dev *pdev,
        u8 pciirq;
        struct isi_board *board = NULL;
 
-       if (card >= BOARD_COUNT)
+       if (card_count >= BOARD_COUNT)
                goto err;
 
        ioaddr = pci_resource_start(pdev, 3);
@@ -1785,7 +1773,7 @@ static int __devinit isicom_probe(struct pci_dev *pdev,
        board->index = index;
        board->base = ioaddr;
        board->irq = pciirq;
-       card++;
+       card_count++;
 
        pci_set_drvdata(pdev, board);
 
@@ -1795,7 +1783,7 @@ static int __devinit isicom_probe(struct pci_dev *pdev,
                        "will be disabled.\n", board->base, board->base + 15,
                        index + 1);
                retval = -EBUSY;
-               goto err;
+               goto errdec;
        }
 
        retval = request_irq(board->irq, isicom_interrupt,
@@ -1824,8 +1812,10 @@ errunri:
        free_irq(board->irq, board);
 errunrr:
        pci_release_region(pdev, 3);
-err:
+errdec:
        board->base = 0;
+       card_count--;
+err:
        return retval;
 }
 
@@ -1839,6 +1829,8 @@ static void __devexit isicom_remove(struct pci_dev *pdev)
 
        free_irq(board->irq, board);
        pci_release_region(pdev, 3);
+       board->base = 0;
+       card_count--;
 }
 
 static int __init isicom_init(void)
@@ -1846,8 +1838,6 @@ static int __init isicom_init(void)
        int retval, idx, channel;
        struct isi_port *port;
 
-       card = 0;
-
        for(idx = 0; idx < BOARD_COUNT; idx++) {
                port = &isi_ports[idx * 16];
                isi_card[idx].ports = port;
@@ -1858,8 +1848,6 @@ static int __init isicom_init(void)
                        port->channel = channel;
                        port->close_delay = 50 * HZ/100;
                        port->closing_wait = 3000 * HZ/100;
-                       INIT_WORK(&port->hangup_tq, do_isicom_hangup);
-                       INIT_WORK(&port->bh_tqueue, isicom_bottomhalf);
                        port->status = 0;
                        init_waitqueue_head(&port->open_wait);
                        init_waitqueue_head(&port->close_wait);
index 68645d35187325baa50e8f5c6aec932469b5d67f..7b279d1de4a2eac8d6781269eb4b52f738d5cc5a 100644 (file)
@@ -2424,7 +2424,6 @@ static int stli_hostcmd(struct stlibrd *brdp, struct stliport *portp)
                        if (tty != NULL) {
                                tty_wakeup(tty);
                                EBRDENABLE(brdp);
-                               wake_up_interruptible(&tty->write_wait);
                        }
                }
 
index 7a6c1c0b7a95861f9e4a70c4d6dca302491e5987..cb8d691576da5c30a084db075686c7286158b048 100644 (file)
@@ -595,15 +595,8 @@ static void fn_spawn_con(struct vc_data *vc)
 
 static void fn_SAK(struct vc_data *vc)
 {
-       struct tty_struct *tty = vc->vc_tty;
-
-       /*
-        * SAK should also work in all raw modes and reset
-        * them properly.
-        */
-       if (tty)
-               do_SAK(tty);
-       reset_vc(vc);
+       struct work_struct *SAK_work = &vc_cons[fg_console].SAK_work;
+       schedule_work(SAK_work);
 }
 
 static void fn_null(struct vc_data *vc)
index 0afb7ba999cf6b55cc03065c1fa58c12bf0cef67..57f9115a456cfd4b2443195a7fd67d545dd21318 100644 (file)
@@ -46,7 +46,7 @@ LIST_HEAD(soft_list);
 /*
  * file operations
  */
-struct file_operations mbcs_ops = {
+const struct file_operations mbcs_ops = {
        .open = mbcs_open,
        .llseek = mbcs_sram_llseek,
        .read = mbcs_sram_read,
index f391a24a1b442c1e8eb4aaf1c1857d015dfdc89b..7dbaee8d940296a5617af40e029b39ff2824d4e7 100644 (file)
  *      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 <asm/io.h>
 #include <asm/uaccess.h>
 
-#define                MOXA_VERSION            "5.1k"
+#define MOXA_VERSION           "5.1k"
 
-#define MOXAMAJOR       172
-#define MOXACUMAJOR     173
+#define MOXAMAJOR              172
+#define MOXACUMAJOR            173
 
-#define put_to_user(arg1, arg2) put_user(arg1, (unsigned long *)arg2)
-#define get_from_user(arg1, arg2) get_user(arg1, (unsigned int *)arg2)
-
-#define MAX_BOARDS             4       /* Don't change this value */
+#define MAX_BOARDS             4       /* Don't change this value */
 #define MAX_PORTS_PER_BOARD    32      /* Don't change this value */
-#define MAX_PORTS              128     /* Don't change this value */
+#define MAX_PORTS              (MAX_BOARDS * MAX_PORTS_PER_BOARD)
 
 /*
  *    Define the Moxa PCI vendor and device IDs.
  */
-#define MOXA_BUS_TYPE_ISA              0
-#define MOXA_BUS_TYPE_PCI              1
-
-#ifndef        PCI_VENDOR_ID_MOXA
-#define        PCI_VENDOR_ID_MOXA      0x1393
-#endif
-#ifndef PCI_DEVICE_ID_CP204J
-#define PCI_DEVICE_ID_CP204J   0x2040
-#endif
-#ifndef PCI_DEVICE_ID_C218
-#define PCI_DEVICE_ID_C218     0x2180
-#endif
-#ifndef PCI_DEVICE_ID_C320
-#define PCI_DEVICE_ID_C320     0x3200
-#endif
+#define MOXA_BUS_TYPE_ISA      0
+#define MOXA_BUS_TYPE_PCI      1
 
 enum {
        MOXA_BOARD_C218_PCI = 1,
@@ -105,47 +80,56 @@ static char *moxa_brdname[] =
 
 #ifdef CONFIG_PCI
 static struct pci_device_id moxa_pcibrds[] = {
-       { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_C218, PCI_ANY_ID, PCI_ANY_ID, 
-         0, 0, MOXA_BOARD_C218_PCI },
-       { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_C320, PCI_ANY_ID, PCI_ANY_ID, 
-         0, 0, MOXA_BOARD_C320_PCI },
-       { PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_CP204J, PCI_ANY_ID, PCI_ANY_ID, 
-         0, 0, MOXA_BOARD_CP204J },
+       { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_C218),
+               .driver_data = MOXA_BOARD_C218_PCI },
+       { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_C320),
+               .driver_data = MOXA_BOARD_C320_PCI },
+       { PCI_DEVICE(PCI_VENDOR_ID_MOXA, PCI_DEVICE_ID_MOXA_CP204J),
+               .driver_data = MOXA_BOARD_CP204J },
        { 0 }
 };
 MODULE_DEVICE_TABLE(pci, moxa_pcibrds);
 #endif /* CONFIG_PCI */
 
-typedef struct _moxa_isa_board_conf {
+struct moxa_isa_board_conf {
        int boardType;
        int numPorts;
        unsigned long baseAddr;
-} moxa_isa_board_conf;
+};
 
-static moxa_isa_board_conf moxa_isa_boards[] =
+static struct moxa_isa_board_conf moxa_isa_boards[] =
 {
 /*       {MOXA_BOARD_C218_ISA,8,0xDC000}, */
 };
 
-typedef struct _moxa_pci_devinfo {
-       ushort busNum;
-       ushort devNum;
-       struct pci_dev *pdev;
-} moxa_pci_devinfo;
-
-typedef struct _moxa_board_conf {
+static struct moxa_board_conf {
        int boardType;
        int numPorts;
        unsigned long baseAddr;
        int busType;
-       moxa_pci_devinfo pciInfo;
-} moxa_board_conf;
 
-static moxa_board_conf moxa_boards[MAX_BOARDS];
-static void __iomem *moxaBaseAddr[MAX_BOARDS];
-static int loadstat[MAX_BOARDS];
+       int loadstat;
+
+       void __iomem *basemem;
+       void __iomem *intNdx;
+       void __iomem *intPend;
+       void __iomem *intTable;
+} moxa_boards[MAX_BOARDS];
+
+struct mxser_mstatus {
+       tcflag_t cflag;
+       int cts;
+       int dsr;
+       int ri;
+       int dcd;
+};
+
+struct moxaq_str {
+       int inq;
+       int outq;
+};
 
-struct moxa_str {
+struct moxa_port {
        int type;
        int port;
        int close_delay;
@@ -159,18 +143,18 @@ struct moxa_str {
        int cflag;
        wait_queue_head_t open_wait;
        wait_queue_head_t close_wait;
-       struct work_struct tqueue;
-};
 
-struct mxser_mstatus {
-       tcflag_t cflag;
-       int cts;
-       int dsr;
-       int ri;
-       int dcd;
-};
+       struct timer_list emptyTimer;
 
-static struct mxser_mstatus GMStatus[MAX_PORTS];
+       char chkPort;
+       char lineCtrl;
+       void __iomem *tableAddr;
+       long curBaud;
+       char DCDState;
+       char lowChkFlag;
+
+       ushort breakCnt;
+};
 
 /* statusflags */
 #define TXSTOPPED      0x1
@@ -178,25 +162,17 @@ static struct mxser_mstatus GMStatus[MAX_PORTS];
 #define EMPTYWAIT      0x4
 #define THROTTLE       0x8
 
-/* event */
-#define MOXA_EVENT_HANGUP      1
-
 #define SERIAL_DO_RESTART
 
-
-#define SERIAL_TYPE_NORMAL     1
-
 #define WAKEUP_CHARS           256
 
-#define PORTNO(x)              ((x)->index)
-
 static int verbose = 0;
 static int ttymajor = MOXAMAJOR;
 /* Variables for insmod */
 #ifdef MODULE
-static int baseaddr[]  =       {0, 0, 0, 0};
-static int type[]      =       {0, 0, 0, 0};
-static int numports[]  =       {0, 0, 0, 0};
+static int baseaddr[4];
+static int type[4];
+static int numports[4];
 #endif
 
 MODULE_AUTHOR("William Chen");
@@ -210,19 +186,9 @@ module_param_array(numports, int, NULL, 0);
 module_param(ttymajor, int, 0);
 module_param(verbose, bool, 0644);
 
-static struct tty_driver *moxaDriver;
-static struct moxa_str moxaChannels[MAX_PORTS];
-static unsigned char *moxaXmitBuff;
-static int moxaTimer_on;
-static struct timer_list moxaTimer;
-static int moxaEmptyTimer_on[MAX_PORTS];
-static struct timer_list moxaEmptyTimer[MAX_PORTS];
-static struct semaphore moxaBuffSem;
-
 /*
  * static functions:
  */
-static void do_moxa_softint(struct work_struct *);
 static int moxa_open(struct tty_struct *, struct file *);
 static void moxa_close(struct tty_struct *, struct file *);
 static int moxa_write(struct tty_struct *, const unsigned char *, int);
@@ -244,11 +210,11 @@ static int moxa_tiocmset(struct tty_struct *tty, struct file *file,
 static void moxa_poll(unsigned long);
 static void set_tty_param(struct tty_struct *);
 static int block_till_ready(struct tty_struct *, struct file *,
-                           struct moxa_str *);
+                           struct moxa_port *);
 static void setup_empty_event(struct tty_struct *);
 static void check_xmit_empty(unsigned long);
-static void shut_down(struct moxa_str *);
-static void receive_data(struct moxa_str *);
+static void shut_down(struct moxa_port *);
+static void receive_data(struct moxa_port *);
 /*
  * moxa board interface functions:
  */
@@ -278,8 +244,8 @@ static void MoxaPortTxDisable(int);
 static void MoxaPortTxEnable(int);
 static int MoxaPortResetBrkCnt(int);
 static void MoxaPortSendBreak(int, int);
-static int moxa_get_serial_info(struct moxa_str *, struct serial_struct __user *);
-static int moxa_set_serial_info(struct moxa_str *, struct serial_struct __user *);
+static int moxa_get_serial_info(struct moxa_port *, struct serial_struct __user *);
+static int moxa_set_serial_info(struct moxa_port *, struct serial_struct __user *);
 static void MoxaSetFifo(int port, int enable);
 
 static const struct tty_operations moxa_ops = {
@@ -302,12 +268,41 @@ static const struct tty_operations moxa_ops = {
        .tiocmset = moxa_tiocmset,
 };
 
+static struct tty_driver *moxaDriver;
+static struct moxa_port moxa_ports[MAX_PORTS];
+static DEFINE_TIMER(moxaTimer, moxa_poll, 0, 0);
 static DEFINE_SPINLOCK(moxa_lock);
 
 #ifdef CONFIG_PCI
-static int moxa_get_PCI_conf(struct pci_dev *p, int board_type, moxa_board_conf * board)
+static int __devinit moxa_pci_probe(struct pci_dev *pdev,
+               const struct pci_device_id *ent)
 {
-       board->baseAddr = pci_resource_start (p, 2);
+       struct moxa_board_conf *board;
+       unsigned int i;
+       int board_type = ent->driver_data;
+       int retval;
+
+       retval = pci_enable_device(pdev);
+       if (retval)
+               goto err;
+
+       for (i = 0; i < MAX_BOARDS; i++)
+               if (moxa_boards[i].basemem == NULL)
+                       break;
+
+       retval = -ENODEV;
+       if (i >= MAX_BOARDS) {
+               if (verbose)
+                       printk("More than %d MOXA Intellio family boards "
+                               "found. Board is ignored.\n", MAX_BOARDS);
+               goto err;
+       }
+
+       board = &moxa_boards[i];
+       board->basemem = pci_iomap(pdev, 2, 0x4000);
+       if (board->basemem == NULL)
+               goto err;
+
        board->boardType = board_type;
        switch (board_type) {
        case MOXA_BOARD_C218_ISA:
@@ -323,27 +318,40 @@ static int moxa_get_PCI_conf(struct pci_dev *p, int board_type, moxa_board_conf
                break;
        }
        board->busType = MOXA_BUS_TYPE_PCI;
-       board->pciInfo.busNum = p->bus->number;
-       board->pciInfo.devNum = p->devfn >> 3;
-       board->pciInfo.pdev = p;
-       /* don't lose the reference in the next pci_get_device iteration */
-       pci_dev_get(p);
+
+       pci_set_drvdata(pdev, board);
 
        return (0);
+err:
+       return retval;
 }
+
+static void __devexit moxa_pci_remove(struct pci_dev *pdev)
+{
+       struct moxa_board_conf *brd = pci_get_drvdata(pdev);
+
+       pci_iounmap(pdev, brd->basemem);
+       brd->basemem = NULL;
+}
+
+static struct pci_driver moxa_pci_driver = {
+       .name = "moxa",
+       .id_table = moxa_pcibrds,
+       .probe = moxa_pci_probe,
+       .remove = __devexit_p(moxa_pci_remove)
+};
 #endif /* CONFIG_PCI */
 
 static int __init moxa_init(void)
 {
-       int i, numBoards;
-       struct moxa_str *ch;
+       int i, numBoards, retval = 0;
+       struct moxa_port *ch;
 
        printk(KERN_INFO "MOXA Intellio family driver version %s\n", MOXA_VERSION);
        moxaDriver = alloc_tty_driver(MAX_PORTS + 1);
        if (!moxaDriver)
                return -ENOMEM;
 
-       init_MUTEX(&moxaBuffSem);
        moxaDriver->owner = THIS_MODULE;
        moxaDriver->name = "ttyMX";
        moxaDriver->major = ttymajor;
@@ -351,40 +359,25 @@ static int __init moxa_init(void)
        moxaDriver->type = TTY_DRIVER_TYPE_SERIAL;
        moxaDriver->subtype = SERIAL_TYPE_NORMAL;
        moxaDriver->init_termios = tty_std_termios;
-       moxaDriver->init_termios.c_iflag = 0;
-       moxaDriver->init_termios.c_oflag = 0;
        moxaDriver->init_termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL;
-       moxaDriver->init_termios.c_lflag = 0;
        moxaDriver->init_termios.c_ispeed = 9600;
        moxaDriver->init_termios.c_ospeed = 9600;
        moxaDriver->flags = TTY_DRIVER_REAL_RAW;
        tty_set_operations(moxaDriver, &moxa_ops);
 
-       moxaXmitBuff = NULL;
-
-       for (i = 0, ch = moxaChannels; i < MAX_PORTS; i++, ch++) {
+       for (i = 0, ch = moxa_ports; i < MAX_PORTS; i++, ch++) {
                ch->type = PORT_16550A;
                ch->port = i;
-               INIT_WORK(&ch->tqueue, do_moxa_softint);
-               ch->tty = NULL;
                ch->close_delay = 5 * HZ / 10;
                ch->closing_wait = 30 * HZ;
-               ch->count = 0;
-               ch->blocked_open = 0;
                ch->cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL;
                init_waitqueue_head(&ch->open_wait);
                init_waitqueue_head(&ch->close_wait);
-       }
 
-       for (i = 0; i < MAX_BOARDS; i++) {
-               moxa_boards[i].boardType = 0;
-               moxa_boards[i].numPorts = 0;
-               moxa_boards[i].baseAddr = 0;
-               moxa_boards[i].busType = 0;
-               moxa_boards[i].pciInfo.busNum = 0;
-               moxa_boards[i].pciInfo.devNum = 0;
+               setup_timer(&ch->emptyTimer, check_xmit_empty,
+                               (unsigned long)ch);
        }
-       MoxaDriverInit();
+
        printk("Tty devices major number = %d\n", ttymajor);
 
        if (tty_register_driver(moxaDriver)) {
@@ -392,18 +385,8 @@ static int __init moxa_init(void)
                put_tty_driver(moxaDriver);
                return -1;
        }
-       for (i = 0; i < MAX_PORTS; i++) {
-               init_timer(&moxaEmptyTimer[i]);
-               moxaEmptyTimer[i].function = check_xmit_empty;
-               moxaEmptyTimer[i].data = (unsigned long) & moxaChannels[i];
-               moxaEmptyTimer_on[i] = 0;
-       }
 
-       init_timer(&moxaTimer);
-       moxaTimer.function = moxa_poll;
-       moxaTimer.expires = jiffies + (HZ / 50);
-       moxaTimer_on = 1;
-       add_timer(&moxaTimer);
+       mod_timer(&moxaTimer, jiffies + HZ / 50);
 
        /* Find the boards defined in source code */
        numBoards = 0;
@@ -451,35 +434,22 @@ static int __init moxa_init(void)
                }
        }
 #endif
-       /* Find PCI boards here */
+
 #ifdef CONFIG_PCI
-       {
-               struct pci_dev *p = NULL;
-               int n = ARRAY_SIZE(moxa_pcibrds) - 1;
-               i = 0;
-               while (i < n) {
-                       while ((p = pci_get_device(moxa_pcibrds[i].vendor, moxa_pcibrds[i].device, p))!=NULL)
-                       {
-                               if (pci_enable_device(p))
-                                       continue;
-                               if (numBoards >= MAX_BOARDS) {
-                                       if (verbose)
-                                               printk("More than %d MOXA Intellio family boards found. Board is ignored.", MAX_BOARDS);
-                               } else {
-                                       moxa_get_PCI_conf(p, moxa_pcibrds[i].driver_data,
-                                               &moxa_boards[numBoards]);
-                                       numBoards++;
-                               }
-                       }
-                       i++;
-               }
+       retval = pci_register_driver(&moxa_pci_driver);
+       if (retval) {
+               printk(KERN_ERR "Can't register moxa pci driver!\n");
+               if (numBoards)
+                       retval = 0;
        }
 #endif
+
        for (i = 0; i < numBoards; i++) {
-               moxaBaseAddr[i] = ioremap((unsigned long) moxa_boards[i].baseAddr, 0x4000);
+               moxa_boards[i].basemem = ioremap(moxa_boards[i].baseAddr,
+                               0x4000);
        }
 
-       return (0);
+       return retval;
 }
 
 static void __exit moxa_exit(void)
@@ -489,23 +459,22 @@ static void __exit moxa_exit(void)
        if (verbose)
                printk("Unloading module moxa ...\n");
 
-       if (moxaTimer_on)
-               del_timer(&moxaTimer);
+       del_timer_sync(&moxaTimer);
 
        for (i = 0; i < MAX_PORTS; i++)
-               if (moxaEmptyTimer_on[i])
-                       del_timer(&moxaEmptyTimer[i]);
+               del_timer_sync(&moxa_ports[i].emptyTimer);
 
        if (tty_unregister_driver(moxaDriver))
                printk("Couldn't unregister MOXA Intellio family serial driver\n");
        put_tty_driver(moxaDriver);
 
-       for (i = 0; i < MAX_BOARDS; i++) {
-               if (moxaBaseAddr[i])
-                       iounmap(moxaBaseAddr[i]);
-               if (moxa_boards[i].busType == MOXA_BUS_TYPE_PCI)
-                       pci_dev_put(moxa_boards[i].pciInfo.pdev);
-       }
+#ifdef CONFIG_PCI
+       pci_unregister_driver(&moxa_pci_driver);
+#endif
+
+       for (i = 0; i < MAX_BOARDS; i++)
+               if (moxa_boards[i].basemem)
+                       iounmap(moxa_boards[i].basemem);
 
        if (verbose)
                printk("Done\n");
@@ -514,28 +483,13 @@ static void __exit moxa_exit(void)
 module_init(moxa_init);
 module_exit(moxa_exit);
 
-static void do_moxa_softint(struct work_struct *work)
-{
-       struct moxa_str *ch = container_of(work, struct moxa_str, tqueue);
-       struct tty_struct *tty;
-
-       if (ch && (tty = ch->tty)) {
-               if (test_and_clear_bit(MOXA_EVENT_HANGUP, &ch->event)) {
-                       tty_hangup(tty);        /* FIXME: module removal race here - AKPM */
-                       wake_up_interruptible(&ch->open_wait);
-                       ch->asyncflags &= ~ASYNC_NORMAL_ACTIVE;
-               }
-       }
-}
-
 static int moxa_open(struct tty_struct *tty, struct file *filp)
 {
-       struct moxa_str *ch;
+       struct moxa_port *ch;
        int port;
        int retval;
-       unsigned long page;
 
-       port = PORTNO(tty);
+       port = tty->index;
        if (port == MAX_PORTS) {
                return (0);
        }
@@ -543,23 +497,8 @@ static int moxa_open(struct tty_struct *tty, struct file *filp)
                tty->driver_data = NULL;
                return (-ENODEV);
        }
-       down(&moxaBuffSem);
-       if (!moxaXmitBuff) {
-               page = get_zeroed_page(GFP_KERNEL);
-               if (!page) {
-                       up(&moxaBuffSem);
-                       return (-ENOMEM);
-               }
-               /* This test is guarded by the BuffSem so no longer needed
-                  delete me in 2.5 */
-               if (moxaXmitBuff)
-                       free_page(page);
-               else
-                       moxaXmitBuff = (unsigned char *) page;
-       }
-       up(&moxaBuffSem);
 
-       ch = &moxaChannels[port];
+       ch = &moxa_ports[port];
        ch->count++;
        tty->driver_data = ch;
        ch->tty = tty;
@@ -585,10 +524,10 @@ static int moxa_open(struct tty_struct *tty, struct file *filp)
 
 static void moxa_close(struct tty_struct *tty, struct file *filp)
 {
-       struct moxa_str *ch;
+       struct moxa_port *ch;
        int port;
 
-       port = PORTNO(tty);
+       port = tty->index;
        if (port == MAX_PORTS) {
                return;
        }
@@ -605,7 +544,7 @@ static void moxa_close(struct tty_struct *tty, struct file *filp)
        if (tty_hung_up_p(filp)) {
                return;
        }
-       ch = (struct moxa_str *) tty->driver_data;
+       ch = (struct moxa_port *) tty->driver_data;
 
        if ((tty->count == 1) && (ch->count != 1)) {
                printk("moxa_close: bad serial port count; tty->count is 1, "
@@ -626,8 +565,7 @@ static void moxa_close(struct tty_struct *tty, struct file *filp)
        if (ch->asyncflags & ASYNC_INITIALIZED) {
                setup_empty_event(tty);
                tty_wait_until_sent(tty, 30 * HZ);      /* 30 seconds timeout */
-               moxaEmptyTimer_on[ch->port] = 0;
-               del_timer(&moxaEmptyTimer[ch->port]);
+               del_timer_sync(&moxa_ports[ch->port].emptyTimer);
        }
        shut_down(ch);
        MoxaPortFlushData(port, 2);
@@ -652,11 +590,11 @@ static void moxa_close(struct tty_struct *tty, struct file *filp)
 static int moxa_write(struct tty_struct *tty,
                      const unsigned char *buf, int count)
 {
-       struct moxa_str *ch;
+       struct moxa_port *ch;
        int len, port;
        unsigned long flags;
 
-       ch = (struct moxa_str *) tty->driver_data;
+       ch = (struct moxa_port *) tty->driver_data;
        if (ch == NULL)
                return (0);
        port = ch->port;
@@ -675,11 +613,11 @@ static int moxa_write(struct tty_struct *tty,
 
 static int moxa_write_room(struct tty_struct *tty)
 {
-       struct moxa_str *ch;
+       struct moxa_port *ch;
 
        if (tty->stopped)
                return (0);
-       ch = (struct moxa_str *) tty->driver_data;
+       ch = (struct moxa_port *) tty->driver_data;
        if (ch == NULL)
                return (0);
        return (MoxaPortTxFree(ch->port));
@@ -687,7 +625,7 @@ static int moxa_write_room(struct tty_struct *tty)
 
 static void moxa_flush_buffer(struct tty_struct *tty)
 {
-       struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+       struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 
        if (ch == NULL)
                return;
@@ -698,7 +636,7 @@ static void moxa_flush_buffer(struct tty_struct *tty)
 static int moxa_chars_in_buffer(struct tty_struct *tty)
 {
        int chars;
-       struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+       struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 
        /*
         * Sigh...I have to check if driver_data is NULL here, because
@@ -730,17 +668,16 @@ static void moxa_flush_chars(struct tty_struct *tty)
 
 static void moxa_put_char(struct tty_struct *tty, unsigned char c)
 {
-       struct moxa_str *ch;
+       struct moxa_port *ch;
        int port;
        unsigned long flags;
 
-       ch = (struct moxa_str *) tty->driver_data;
+       ch = (struct moxa_port *) tty->driver_data;
        if (ch == NULL)
                return;
        port = ch->port;
        spin_lock_irqsave(&moxa_lock, flags);
-       moxaXmitBuff[0] = c;
-       MoxaPortWriteData(port, moxaXmitBuff, 1);
+       MoxaPortWriteData(port, &c, 1);
        spin_unlock_irqrestore(&moxa_lock, flags);
        /************************************************
        if ( !(ch->statusflags & LOWWAIT) && (MoxaPortTxFree(port) <= 100) )
@@ -750,11 +687,11 @@ static void moxa_put_char(struct tty_struct *tty, unsigned char c)
 
 static int moxa_tiocmget(struct tty_struct *tty, struct file *file)
 {
-       struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+       struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
        int port;
        int flag = 0, dtr, rts;
 
-       port = PORTNO(tty);
+       port = tty->index;
        if ((port != MAX_PORTS) && (!ch))
                return (-EINVAL);
 
@@ -776,11 +713,11 @@ static int moxa_tiocmget(struct tty_struct *tty, struct file *file)
 static int moxa_tiocmset(struct tty_struct *tty, struct file *file,
                         unsigned int set, unsigned int clear)
 {
-       struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+       struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
        int port;
        int dtr, rts;
 
-       port = PORTNO(tty);
+       port = tty->index;
        if ((port != MAX_PORTS) && (!ch))
                return (-EINVAL);
 
@@ -800,12 +737,12 @@ static int moxa_tiocmset(struct tty_struct *tty, struct file *file,
 static int moxa_ioctl(struct tty_struct *tty, struct file *file,
                      unsigned int cmd, unsigned long arg)
 {
-       struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+       struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
        register int port;
        void __user *argp = (void __user *)arg;
        int retval;
 
-       port = PORTNO(tty);
+       port = tty->index;
        if ((port != MAX_PORTS) && (!ch))
                return (-EINVAL);
 
@@ -853,14 +790,14 @@ static int moxa_ioctl(struct tty_struct *tty, struct file *file,
 
 static void moxa_throttle(struct tty_struct *tty)
 {
-       struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+       struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 
        ch->statusflags |= THROTTLE;
 }
 
 static void moxa_unthrottle(struct tty_struct *tty)
 {
-       struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+       struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 
        ch->statusflags &= ~THROTTLE;
 }
@@ -868,7 +805,7 @@ static void moxa_unthrottle(struct tty_struct *tty)
 static void moxa_set_termios(struct tty_struct *tty,
                             struct ktermios *old_termios)
 {
-       struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+       struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 
        if (ch == NULL)
                return;
@@ -880,7 +817,7 @@ static void moxa_set_termios(struct tty_struct *tty,
 
 static void moxa_stop(struct tty_struct *tty)
 {
-       struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+       struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 
        if (ch == NULL)
                return;
@@ -891,7 +828,7 @@ static void moxa_stop(struct tty_struct *tty)
 
 static void moxa_start(struct tty_struct *tty)
 {
-       struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+       struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 
        if (ch == NULL)
                return;
@@ -905,7 +842,7 @@ static void moxa_start(struct tty_struct *tty)
 
 static void moxa_hangup(struct tty_struct *tty)
 {
-       struct moxa_str *ch = (struct moxa_str *) tty->driver_data;
+       struct moxa_port *ch = (struct moxa_port *) tty->driver_data;
 
        moxa_flush_buffer(tty);
        shut_down(ch);
@@ -919,24 +856,20 @@ static void moxa_hangup(struct tty_struct *tty)
 static void moxa_poll(unsigned long ignored)
 {
        register int card;
-       struct moxa_str *ch;
+       struct moxa_port *ch;
        struct tty_struct *tp;
        int i, ports;
 
-       moxaTimer_on = 0;
        del_timer(&moxaTimer);
 
        if (MoxaDriverPoll() < 0) {
-               moxaTimer.function = moxa_poll;
-               moxaTimer.expires = jiffies + (HZ / 50);
-               moxaTimer_on = 1;
-               add_timer(&moxaTimer);
+               mod_timer(&moxaTimer, jiffies + HZ / 50);
                return;
        }
        for (card = 0; card < MAX_BOARDS; card++) {
                if ((ports = MoxaPortsOfCard(card)) <= 0)
                        continue;
-               ch = &moxaChannels[card * MAX_PORTS_PER_BOARD];
+               ch = &moxa_ports[card * MAX_PORTS_PER_BOARD];
                for (i = 0; i < ports; i++, ch++) {
                        if ((ch->asyncflags & ASYNC_INITIALIZED) == 0)
                                continue;
@@ -962,18 +895,16 @@ static void moxa_poll(unsigned long ignored)
                                        if (MoxaPortDCDON(ch->port))
                                                wake_up_interruptible(&ch->open_wait);
                                        else {
-                                               set_bit(MOXA_EVENT_HANGUP, &ch->event);
-                                               schedule_work(&ch->tqueue);
+                                               tty_hangup(tp);
+                                               wake_up_interruptible(&ch->open_wait);
+                                               ch->asyncflags &= ~ASYNC_NORMAL_ACTIVE;
                                        }
                                }
                        }
                }
        }
 
-       moxaTimer.function = moxa_poll;
-       moxaTimer.expires = jiffies + (HZ / 50);
-       moxaTimer_on = 1;
-       add_timer(&moxaTimer);
+       mod_timer(&moxaTimer, jiffies + HZ / 50);
 }
 
 /******************************************************************************/
@@ -981,10 +912,10 @@ static void moxa_poll(unsigned long ignored)
 static void set_tty_param(struct tty_struct *tty)
 {
        register struct ktermios *ts;
-       struct moxa_str *ch;
+       struct moxa_port *ch;
        int rts, cts, txflow, rxflow, xany;
 
-       ch = (struct moxa_str *) tty->driver_data;
+       ch = (struct moxa_port *) tty->driver_data;
        ts = tty->termios;
        if (ts->c_cflag & CLOCAL)
                ch->asyncflags &= ~ASYNC_CHECK_CD;
@@ -1004,7 +935,7 @@ static void set_tty_param(struct tty_struct *tty)
 }
 
 static int block_till_ready(struct tty_struct *tty, struct file *filp,
-                           struct moxa_str *ch)
+                           struct moxa_port *ch)
 {
        DECLARE_WAITQUEUE(wait,current);
        unsigned long flags;
@@ -1095,40 +1026,33 @@ static int block_till_ready(struct tty_struct *tty, struct file *filp,
 
 static void setup_empty_event(struct tty_struct *tty)
 {
-       struct moxa_str *ch = tty->driver_data;
+       struct moxa_port *ch = tty->driver_data;
        unsigned long flags;
 
        spin_lock_irqsave(&moxa_lock, flags);
        ch->statusflags |= EMPTYWAIT;
-       moxaEmptyTimer_on[ch->port] = 0;
-       del_timer(&moxaEmptyTimer[ch->port]);
-       moxaEmptyTimer[ch->port].expires = jiffies + HZ;
-       moxaEmptyTimer_on[ch->port] = 1;
-       add_timer(&moxaEmptyTimer[ch->port]);
+       mod_timer(&moxa_ports[ch->port].emptyTimer, jiffies + HZ);
        spin_unlock_irqrestore(&moxa_lock, flags);
 }
 
 static void check_xmit_empty(unsigned long data)
 {
-       struct moxa_str *ch;
+       struct moxa_port *ch;
 
-       ch = (struct moxa_str *) data;
-       moxaEmptyTimer_on[ch->port] = 0;
-       del_timer(&moxaEmptyTimer[ch->port]);
+       ch = (struct moxa_port *) data;
+       del_timer_sync(&moxa_ports[ch->port].emptyTimer);
        if (ch->tty && (ch->statusflags & EMPTYWAIT)) {
                if (MoxaPortTxQueue(ch->port) == 0) {
                        ch->statusflags &= ~EMPTYWAIT;
                        tty_wakeup(ch->tty);
                        return;
                }
-               moxaEmptyTimer[ch->port].expires = jiffies + HZ;
-               moxaEmptyTimer_on[ch->port] = 1;
-               add_timer(&moxaEmptyTimer[ch->port]);
+               mod_timer(&moxa_ports[ch->port].emptyTimer, jiffies + HZ);
        } else
                ch->statusflags &= ~EMPTYWAIT;
 }
 
-static void shut_down(struct moxa_str *ch)
+static void shut_down(struct moxa_port *ch)
 {
        struct tty_struct *tp;
 
@@ -1148,7 +1072,7 @@ static void shut_down(struct moxa_str *ch)
        ch->asyncflags &= ~ASYNC_INITIALIZED;
 }
 
-static void receive_data(struct moxa_str *ch)
+static void receive_data(struct moxa_port *ch)
 {
        struct tty_struct *tp;
        struct ktermios *ts;
@@ -1465,35 +1389,21 @@ static void receive_data(struct moxa_str *ch)
 /*
  *    Query
  */
-#define QueryPort      MAX_PORTS
-
-
 
 struct mon_str {
        int tick;
        int rxcnt[MAX_PORTS];
        int txcnt[MAX_PORTS];
 };
-typedef struct mon_str mon_st;
 
 #define        DCD_changed     0x01
 #define        DCD_oldstate    0x80
 
 static unsigned char moxaBuff[10240];
-static void __iomem *moxaIntNdx[MAX_BOARDS];
-static void __iomem *moxaIntPend[MAX_BOARDS];
-static void __iomem *moxaIntTable[MAX_BOARDS];
-static char moxaChkPort[MAX_PORTS];
-static char moxaLineCtrl[MAX_PORTS];
-static void __iomem *moxaTableAddr[MAX_PORTS];
-static long moxaCurBaud[MAX_PORTS];
-static char moxaDCDState[MAX_PORTS];
-static char moxaLowChkFlag[MAX_PORTS];
 static int moxaLowWaterChk;
 static int moxaCard;
-static mon_st moxaLog;
-static int moxaFuncTout;
-static ushort moxaBreakCnt[MAX_PORTS];
+static struct mon_str moxaLog;
+static int moxaFuncTout = HZ / 2;
 
 static void moxadelay(int);
 static void moxafunc(void __iomem *, int, ushort);
@@ -1514,16 +1424,18 @@ static int moxaloadc320(int, void __iomem *, int, int *);
  *****************************************************************************/
 void MoxaDriverInit(void)
 {
-       int i;
+       struct moxa_port *p;
+       unsigned int i;
 
        moxaFuncTout = HZ / 2;  /* 500 mini-seconds */
        moxaCard = 0;
        moxaLog.tick = 0;
        moxaLowWaterChk = 0;
        for (i = 0; i < MAX_PORTS; i++) {
-               moxaChkPort[i] = 0;
-               moxaLowChkFlag[i] = 0;
-               moxaLineCtrl[i] = 0;
+               p = &moxa_ports[i];
+               p->chkPort = 0;
+               p->lowChkFlag = 0;
+               p->lineCtrl = 0;
                moxaLog.rxcnt[i] = 0;
                moxaLog.txcnt[i] = 0;
        }
@@ -1545,19 +1457,12 @@ void MoxaDriverInit(void)
 #define MOXA_GET_CUMAJOR        (MOXA + 64)
 #define MOXA_GETMSTATUS         (MOXA + 65)
 
-
-struct moxaq_str {
-       int inq;
-       int outq;
-};
-
 struct dl_str {
        char __user *buf;
        int len;
        int cardno;
 };
 
-static struct moxaq_str temp_queue[MAX_PORTS];
 static struct dl_str dltmp;
 
 void MoxaPortFlushData(int port, int mode)
@@ -1565,10 +1470,10 @@ void MoxaPortFlushData(int port, int mode)
        void __iomem *ofsAddr;
        if ((mode < 0) || (mode > 2))
                return;
-       ofsAddr = moxaTableAddr[port];
+       ofsAddr = moxa_ports[port].tableAddr;
        moxafunc(ofsAddr, FC_FlushQueue, mode);
        if (mode != 1) {
-               moxaLowChkFlag[port] = 0;
+               moxa_ports[port].lowChkFlag = 0;
                low_water_check(ofsAddr);
        }
 }
@@ -1580,7 +1485,7 @@ int MoxaDriverIoctl(unsigned int cmd, unsigned long arg, int port)
        int MoxaPortTxQueue(int), MoxaPortRxQueue(int);
        void __user *argp = (void __user *)arg;
 
-       if (port == QueryPort) {
+       if (port == MAX_PORTS) {
                if ((cmd != MOXA_GET_CONF) && (cmd != MOXA_INIT_DRIVER) &&
                    (cmd != MOXA_LOAD_BIOS) && (cmd != MOXA_FIND_BOARD) && (cmd != MOXA_LOAD_C320B) &&
                 (cmd != MOXA_LOAD_CODE) && (cmd != MOXA_GETDATACOUNT) &&
@@ -1590,7 +1495,8 @@ int MoxaDriverIoctl(unsigned int cmd, unsigned long arg, int port)
        }
        switch (cmd) {
        case MOXA_GET_CONF:
-               if(copy_to_user(argp, &moxa_boards, MAX_BOARDS * sizeof(moxa_board_conf)))
+               if(copy_to_user(argp, &moxa_boards, MAX_BOARDS *
+                               sizeof(struct moxa_board_conf)))
                        return -EFAULT;
                return (0);
        case MOXA_INIT_DRIVER:
@@ -1599,23 +1505,27 @@ int MoxaDriverIoctl(unsigned int cmd, unsigned long arg, int port)
                return (0);
        case MOXA_GETDATACOUNT:
                moxaLog.tick = jiffies;
-               if(copy_to_user(argp, &moxaLog, sizeof(mon_st)))
+               if(copy_to_user(argp, &moxaLog, sizeof(struct mon_str)))
                        return -EFAULT;
                return (0);
        case MOXA_FLUSH_QUEUE:
                MoxaPortFlushData(port, arg);
                return (0);
-       case MOXA_GET_IOQUEUE:
-               for (i = 0; i < MAX_PORTS; i++) {
-                       if (moxaChkPort[i]) {
-                               temp_queue[i].inq = MoxaPortRxQueue(i);
-                               temp_queue[i].outq = MoxaPortTxQueue(i);
+       case MOXA_GET_IOQUEUE: {
+               struct moxaq_str __user *argm = argp;
+               struct moxaq_str tmp;
+
+               for (i = 0; i < MAX_PORTS; i++, argm++) {
+                       memset(&tmp, 0, sizeof(tmp));
+                       if (moxa_ports[i].chkPort) {
+                               tmp.inq = MoxaPortRxQueue(i);
+                               tmp.outq = MoxaPortTxQueue(i);
                        }
+                       if (copy_to_user(argm, &tmp, sizeof(tmp)))
+                               return -EFAULT;
                }
-               if(copy_to_user(argp, temp_queue, sizeof(struct moxaq_str) * MAX_PORTS))
-                       return -EFAULT;
                return (0);
-       case MOXA_GET_OQUEUE:
+       case MOXA_GET_OQUEUE:
                i = MoxaPortTxQueue(port);
                return put_user(i, (unsigned long __user *)argp);
        case MOXA_GET_IQUEUE:
@@ -1630,33 +1540,36 @@ int MoxaDriverIoctl(unsigned int cmd, unsigned long arg, int port)
                if(copy_to_user(argp, &i, sizeof(int)))
                        return -EFAULT;
                return 0;
-       case MOXA_GETMSTATUS:
-               for (i = 0; i < MAX_PORTS; i++) {
-                       GMStatus[i].ri = 0;
-                       GMStatus[i].dcd = 0;
-                       GMStatus[i].dsr = 0;
-                       GMStatus[i].cts = 0;
-                       if (!moxaChkPort[i]) {
-                               continue;
+       case MOXA_GETMSTATUS: {
+               struct mxser_mstatus __user *argm = argp;
+               struct mxser_mstatus tmp;
+               struct moxa_port *p;
+
+               for (i = 0; i < MAX_PORTS; i++, argm++) {
+                       p = &moxa_ports[i];
+                       memset(&tmp, 0, sizeof(tmp));
+                       if (!p->chkPort) {
+                               goto copy;
                        } else {
-                               status = MoxaPortLineStatus(moxaChannels[i].port);
+                               status = MoxaPortLineStatus(p->port);
                                if (status & 1)
-                                       GMStatus[i].cts = 1;
+                                       tmp.cts = 1;
                                if (status & 2)
-                                       GMStatus[i].dsr = 1;
+                                       tmp.dsr = 1;
                                if (status & 4)
-                                       GMStatus[i].dcd = 1;
+                                       tmp.dcd = 1;
                        }
 
-                       if (!moxaChannels[i].tty || !moxaChannels[i].tty->termios)
-                               GMStatus[i].cflag = moxaChannels[i].cflag;
+                       if (!p->tty || !p->tty->termios)
+                               tmp.cflag = p->cflag;
                        else
-                               GMStatus[i].cflag = moxaChannels[i].tty->termios->c_cflag;
+                               tmp.cflag = p->tty->termios->c_cflag;
+copy:
+                       if (copy_to_user(argm, &tmp, sizeof(tmp)))
+                               return -EFAULT;
                }
-               if(copy_to_user(argp, GMStatus, sizeof(struct mxser_mstatus) * MAX_PORTS))
-                       return -EFAULT;
                return 0;
-       default:
+       default:
                return (-ENOIOCTLCMD);
        case MOXA_LOAD_BIOS:
        case MOXA_FIND_BOARD:
@@ -1694,6 +1607,7 @@ int MoxaDriverIoctl(unsigned int cmd, unsigned long arg, int port)
 
 int MoxaDriverPoll(void)
 {
+       struct moxa_board_conf *brd;
        register ushort temp;
        register int card;
        void __iomem *ofsAddr;
@@ -1703,43 +1617,44 @@ int MoxaDriverPoll(void)
        if (moxaCard == 0)
                return (-1);
        for (card = 0; card < MAX_BOARDS; card++) {
-               if (loadstat[card] == 0)
+               brd = &moxa_boards[card];
+               if (brd->loadstat == 0)
                        continue;
-               if ((ports = moxa_boards[card].numPorts) == 0)
+               if ((ports = brd->numPorts) == 0)
                        continue;
-               if (readb(moxaIntPend[card]) == 0xff) {
-                       ip = moxaIntTable[card] + readb(moxaIntNdx[card]);
+               if (readb(brd->intPend) == 0xff) {
+                       ip = brd->intTable + readb(brd->intNdx);
                        p = card * MAX_PORTS_PER_BOARD;
                        ports <<= 1;
                        for (port = 0; port < ports; port += 2, p++) {
                                if ((temp = readw(ip + port)) != 0) {
                                        writew(0, ip + port);
-                                       ofsAddr = moxaTableAddr[p];
+                                       ofsAddr = moxa_ports[p].tableAddr;
                                        if (temp & IntrTx)
                                                writew(readw(ofsAddr + HostStat) & ~WakeupTx, ofsAddr + HostStat);
                                        if (temp & IntrBreak) {
-                                               moxaBreakCnt[p]++;
+                                               moxa_ports[p].breakCnt++;
                                        }
                                        if (temp & IntrLine) {
                                                if (readb(ofsAddr + FlagStat) & DCD_state) {
-                                                       if ((moxaDCDState[p] & DCD_oldstate) == 0)
-                                                               moxaDCDState[p] = (DCD_oldstate |
+                                                       if ((moxa_ports[p].DCDState & DCD_oldstate) == 0)
+                                                               moxa_ports[p].DCDState = (DCD_oldstate |
                                                                                   DCD_changed);
                                                } else {
-                                                       if (moxaDCDState[p] & DCD_oldstate)
-                                                               moxaDCDState[p] = DCD_changed;
+                                                       if (moxa_ports[p].DCDState & DCD_oldstate)
+                                                               moxa_ports[p].DCDState = DCD_changed;
                                                }
                                        }
                                }
                        }
-                       writeb(0, moxaIntPend[card]);
+                       writeb(0, brd->intPend);
                }
                if (moxaLowWaterChk) {
                        p = card * MAX_PORTS_PER_BOARD;
                        for (port = 0; port < ports; port++, p++) {
-                               if (moxaLowChkFlag[p]) {
-                                       moxaLowChkFlag[p] = 0;
-                                       ofsAddr = moxaTableAddr[p];
+                               if (moxa_ports[p].lowChkFlag) {
+                                       moxa_ports[p].lowChkFlag = 0;
+                                       ofsAddr = moxa_ports[p].tableAddr;
                                        low_water_check(ofsAddr);
                                }
                        }
@@ -1767,9 +1682,7 @@ int MoxaPortsOfCard(int cardno)
  *     2.  MoxaPortEnable(int port);                                        *
  *     3.  MoxaPortDisable(int port);                                       *
  *     4.  MoxaPortGetMaxBaud(int port);                                    *
- *     5.  MoxaPortGetCurBaud(int port);                                    *
  *     6.  MoxaPortSetBaud(int port, long baud);                            *
- *     7.  MoxaPortSetMode(int port, int databit, int stopbit, int parity); *
  *     8.  MoxaPortSetTermio(int port, unsigned char *termio);              *
  *     9.  MoxaPortGetLineOut(int port, int *dtrState, int *rtsState);      *
  *     10. MoxaPortLineCtrl(int port, int dtrState, int rtsState);          *
@@ -1780,18 +1693,12 @@ int MoxaPortsOfCard(int cardno)
  *     15. MoxaPortFlushData(int port, int mode);                           *
  *     16. MoxaPortWriteData(int port, unsigned char * buffer, int length); *
  *     17. MoxaPortReadData(int port, struct tty_struct *tty);              *
- *     18. MoxaPortTxBufSize(int port);                                     *
- *     19. MoxaPortRxBufSize(int port);                                     *
  *     20. MoxaPortTxQueue(int port);                                       *
  *     21. MoxaPortTxFree(int port);                                        *
  *     22. MoxaPortRxQueue(int port);                                       *
- *     23. MoxaPortRxFree(int port);                                        *
  *     24. MoxaPortTxDisable(int port);                                     *
  *     25. MoxaPortTxEnable(int port);                                      *
- *     26. MoxaPortGetBrkCnt(int port);                                     *
  *     27. MoxaPortResetBrkCnt(int port);                                   *
- *     28. MoxaPortSetXonXoff(int port, int xonValue, int xoffValue);       *
- *     29. MoxaPortIsTxHold(int port);                                      *
  *     30. MoxaPortSendBreak(int port, int ticks);                          *
  *****************************************************************************/
 /*
@@ -1878,15 +1785,6 @@ int MoxaPortsOfCard(int cardno)
  *                      38400/57600/115200 bps
  *
  *
- *      Function 9:     Get the current baud rate of this port.
- *      Syntax:
- *      long MoxaPortGetCurBaud(int port);
- *           int port           : port number (0 - 127)
- *
- *           return:    0       : this port is invalid
- *                      50 - 115200 bps
- *
- *
  *      Function 10:    Setting baud rate of this port.
  *      Syntax:
  *      long MoxaPortSetBaud(int port, long baud);
@@ -1900,18 +1798,6 @@ int MoxaPortsOfCard(int cardno)
  *                                    baud rate will be the maximun baud rate.
  *
  *
- *      Function 11:    Setting the data-bits/stop-bits/parity of this port
- *      Syntax:
- *      int  MoxaPortSetMode(int port, int databits, int stopbits, int parity);
- *           int port           : port number (0 - 127)
- *           int databits       : data bits (8/7/6/5)
- *           int stopbits       : stop bits (2/1/0, 0 show 1.5 stop bits)
- int parity     : parity (0:None,1:Odd,2:Even,3:Mark,4:Space)
- *
- *           return:    -1      : invalid parameter
- *                      0       : setting O.K.
- *
- *
  *      Function 12:    Configure the port.
  *      Syntax:
  *      int  MoxaPortSetTermio(int port, struct ktermios *termio, speed_t baud);
@@ -2016,22 +1902,6 @@ int MoxaPortsOfCard(int cardno)
  *           return:    0 - length      : real read data length
  *
  *
- *      Function 22:    Get the Tx buffer size of this port
- *      Syntax:
- *      int  MoxaPortTxBufSize(int port);
- *           int port           : port number (0 - 127)
- *
- *           return:    ..      : Tx buffer size
- *
- *
- *      Function 23:    Get the Rx buffer size of this port
- *      Syntax:
- *      int  MoxaPortRxBufSize(int port);
- *           int port           : port number (0 - 127)
- *
- *           return:    ..      : Rx buffer size
- *
- *
  *      Function 24:    Get the Tx buffer current queued data bytes
  *      Syntax:
  *      int  MoxaPortTxQueue(int port);
@@ -2056,14 +1926,6 @@ int MoxaPortsOfCard(int cardno)
  *           return:    ..      : Rx buffer current queued data bytes
  *
  *
- *      Function 27:    Get the Rx buffer current free space
- *      Syntax:
- *      int  MoxaPortRxFree(int port);
- *           int port           : port number (0 - 127)
- *
- *           return:    ..      : Rx buffer current free space
- *
- *
  *      Function 28:    Disable port data transmission.
  *      Syntax:
  *      void MoxaPortTxDisable(int port);
@@ -2076,14 +1938,6 @@ int MoxaPortsOfCard(int cardno)
  *           int port           : port number (0 - 127)
  *
  *
- *      Function 30:    Get the received BREAK signal count.
- *      Syntax:
- *      int  MoxaPortGetBrkCnt(int port);
- *           int port           : port number (0 - 127)
- *
- *           return:    0 - ..  : BREAK signal count
- *
- *
  *      Function 31:    Get the received BREAK signal count and reset it.
  *      Syntax:
  *      int  MoxaPortResetBrkCnt(int port);
@@ -2092,25 +1946,6 @@ int MoxaPortsOfCard(int cardno)
  *           return:    0 - ..  : BREAK signal count
  *
  *
- *      Function 32:    Set the S/W flow control new XON/XOFF value, default
- *                      XON is 0x11 & XOFF is 0x13.
- *      Syntax:
- *      void MoxaPortSetXonXoff(int port, int xonValue, int xoffValue);
- *           int port           : port number (0 - 127)
- *           int xonValue       : new XON value (0 - 255)
- *           int xoffValue      : new XOFF value (0 - 255)
- *
- *
- *      Function 33:    Check this port's transmission is hold by remote site
- *                      because the flow control.
- *      Syntax:
- *      int  MoxaPortIsTxHold(int port);
- *           int port           : port number (0 - 127)
- *
- *           return:    0       : normal
- *                      1       : hold by remote site
- *
- *
  *      Function 34:    Send out a BREAK signal.
  *      Syntax:
  *      void MoxaPortSendBreak(int port, int ms100);
@@ -2125,7 +1960,7 @@ int MoxaPortIsValid(int port)
 
        if (moxaCard == 0)
                return (0);
-       if (moxaChkPort[port] == 0)
+       if (moxa_ports[port].chkPort == 0)
                return (0);
        return (1);
 }
@@ -2136,9 +1971,9 @@ void MoxaPortEnable(int port)
        int MoxaPortLineStatus(int);
        short lowwater = 512;
 
-       ofsAddr = moxaTableAddr[port];
+       ofsAddr = moxa_ports[port].tableAddr;
        writew(lowwater, ofsAddr + Low_water);
-       moxaBreakCnt[port] = 0;
+       moxa_ports[port].breakCnt = 0;
        if ((moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_ISA) ||
            (moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_PCI)) {
                moxafunc(ofsAddr, FC_SetBreakIrq, 0);
@@ -2155,7 +1990,7 @@ void MoxaPortEnable(int port)
 
 void MoxaPortDisable(int port)
 {
-       void __iomem *ofsAddr = moxaTableAddr[port];
+       void __iomem *ofsAddr = moxa_ports[port].tableAddr;
 
        moxafunc(ofsAddr, FC_SetFlowCtl, 0);    /* disable flow control */
        moxafunc(ofsAddr, FC_ClrLineIrq, Magic_code);
@@ -2181,7 +2016,7 @@ long MoxaPortSetBaud(int port, long baud)
 
        if ((baud < 50L) || ((max = MoxaPortGetMaxBaud(port)) == 0))
                return (0);
-       ofsAddr = moxaTableAddr[port];
+       ofsAddr = moxa_ports[port].tableAddr;
        if (baud > max)
                baud = max;
        if (max == 38400L)
@@ -2193,7 +2028,7 @@ long MoxaPortSetBaud(int port, long baud)
        val = clock / baud;
        moxafunc(ofsAddr, FC_SetBaud, val);
        baud = clock / val;
-       moxaCurBaud[port] = baud;
+       moxa_ports[port].curBaud = baud;
        return (baud);
 }
 
@@ -2203,9 +2038,9 @@ int MoxaPortSetTermio(int port, struct ktermios *termio, speed_t baud)
        tcflag_t cflag;
        tcflag_t mode = 0;
 
-       if (moxaChkPort[port] == 0 || termio == 0)
+       if (moxa_ports[port].chkPort == 0 || termio == 0)
                return (-1);
-       ofsAddr = moxaTableAddr[port];
+       ofsAddr = moxa_ports[port].tableAddr;
        cflag = termio->c_cflag;        /* termio->c_cflag */
 
        mode = termio->c_cflag & CSIZE;
@@ -2259,13 +2094,13 @@ int MoxaPortGetLineOut(int port, int *dtrState, int *rtsState)
        if (!MoxaPortIsValid(port))
                return (-1);
        if (dtrState) {
-               if (moxaLineCtrl[port] & DTR_ON)
+               if (moxa_ports[port].lineCtrl & DTR_ON)
                        *dtrState = 1;
                else
                        *dtrState = 0;
        }
        if (rtsState) {
-               if (moxaLineCtrl[port] & RTS_ON)
+               if (moxa_ports[port].lineCtrl & RTS_ON)
                        *rtsState = 1;
                else
                        *rtsState = 0;
@@ -2278,13 +2113,13 @@ void MoxaPortLineCtrl(int port, int dtr, int rts)
        void __iomem *ofsAddr;
        int mode;
 
-       ofsAddr = moxaTableAddr[port];
+       ofsAddr = moxa_ports[port].tableAddr;
        mode = 0;
        if (dtr)
                mode |= DTR_ON;
        if (rts)
                mode |= RTS_ON;
-       moxaLineCtrl[port] = mode;
+       moxa_ports[port].lineCtrl = mode;
        moxafunc(ofsAddr, FC_LineControl, mode);
 }
 
@@ -2293,7 +2128,7 @@ void MoxaPortFlowCtrl(int port, int rts, int cts, int txflow, int rxflow, int tx
        void __iomem *ofsAddr;
        int mode;
 
-       ofsAddr = moxaTableAddr[port];
+       ofsAddr = moxa_ports[port].tableAddr;
        mode = 0;
        if (rts)
                mode |= RTS_FlowCtl;
@@ -2313,7 +2148,7 @@ int MoxaPortLineStatus(int port)
        void __iomem *ofsAddr;
        int val;
 
-       ofsAddr = moxaTableAddr[port];
+       ofsAddr = moxa_ports[port].tableAddr;
        if ((moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_ISA) ||
            (moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_PCI)) {
                moxafunc(ofsAddr, FC_LineStatus, 0);
@@ -2324,11 +2159,11 @@ int MoxaPortLineStatus(int port)
        val &= 0x0B;
        if (val & 8) {
                val |= 4;
-               if ((moxaDCDState[port] & DCD_oldstate) == 0)
-                       moxaDCDState[port] = (DCD_oldstate | DCD_changed);
+               if ((moxa_ports[port].DCDState & DCD_oldstate) == 0)
+                       moxa_ports[port].DCDState = (DCD_oldstate | DCD_changed);
        } else {
-               if (moxaDCDState[port] & DCD_oldstate)
-                       moxaDCDState[port] = DCD_changed;
+               if (moxa_ports[port].DCDState & DCD_oldstate)
+                       moxa_ports[port].DCDState = DCD_changed;
        }
        val &= 7;
        return (val);
@@ -2338,10 +2173,10 @@ int MoxaPortDCDChange(int port)
 {
        int n;
 
-       if (moxaChkPort[port] == 0)
+       if (moxa_ports[port].chkPort == 0)
                return (0);
-       n = moxaDCDState[port];
-       moxaDCDState[port] &= ~DCD_changed;
+       n = moxa_ports[port].DCDState;
+       moxa_ports[port].DCDState &= ~DCD_changed;
        n &= DCD_changed;
        return (n);
 }
@@ -2350,32 +2185,15 @@ int MoxaPortDCDON(int port)
 {
        int n;
 
-       if (moxaChkPort[port] == 0)
+       if (moxa_ports[port].chkPort == 0)
                return (0);
-       if (moxaDCDState[port] & DCD_oldstate)
+       if (moxa_ports[port].DCDState & DCD_oldstate)
                n = 1;
        else
                n = 0;
        return (n);
 }
 
-
-/*
-   int MoxaDumpMem(int port, unsigned char * buffer, int len)
-   {
-   int          i;
-   unsigned long                baseAddr,ofsAddr,ofs;
-
-   baseAddr = moxaBaseAddr[port / MAX_PORTS_PER_BOARD];
-   ofs = baseAddr + DynPage_addr + pageofs;
-   if (len > 0x2000L)
-   len = 0x2000L;
-   for (i = 0; i < len; i++)
-   buffer[i] = readb(ofs+i);
-   }
- */
-
-
 int MoxaPortWriteData(int port, unsigned char * buffer, int len)
 {
        int c, total, i;
@@ -2385,8 +2203,8 @@ int MoxaPortWriteData(int port, unsigned char * buffer, int len)
        ushort pageno, pageofs, bufhead;
        void __iomem *baseAddr, *ofsAddr, *ofs;
 
-       ofsAddr = moxaTableAddr[port];
-       baseAddr = moxaBaseAddr[port / MAX_PORTS_PER_BOARD];
+       ofsAddr = moxa_ports[port].tableAddr;
+       baseAddr = moxa_boards[port / MAX_PORTS_PER_BOARD].basemem;
        tx_mask = readw(ofsAddr + TX_mask);
        spage = readw(ofsAddr + Page_txb);
        epage = readw(ofsAddr + EndPage_txb);
@@ -2448,8 +2266,8 @@ int MoxaPortReadData(int port, struct tty_struct *tty)
        ushort pageno, bufhead;
        void __iomem *baseAddr, *ofsAddr, *ofs;
 
-       ofsAddr = moxaTableAddr[port];
-       baseAddr = moxaBaseAddr[port / MAX_PORTS_PER_BOARD];
+       ofsAddr = moxa_ports[port].tableAddr;
+       baseAddr = moxa_boards[port / MAX_PORTS_PER_BOARD].basemem;
        head = readw(ofsAddr + RXrptr);
        tail = readw(ofsAddr + RXwptr);
        rx_mask = readw(ofsAddr + RX_mask);
@@ -2504,7 +2322,7 @@ int MoxaPortReadData(int port, struct tty_struct *tty)
        }
        if ((readb(ofsAddr + FlagStat) & Xoff_state) && (remain < LowWater)) {
                moxaLowWaterChk = 1;
-               moxaLowChkFlag[port] = 1;
+               moxa_ports[port].lowChkFlag = 1;
        }
        return (total);
 }
@@ -2516,7 +2334,7 @@ int MoxaPortTxQueue(int port)
        ushort rptr, wptr, mask;
        int len;
 
-       ofsAddr = moxaTableAddr[port];
+       ofsAddr = moxa_ports[port].tableAddr;
        rptr = readw(ofsAddr + TXrptr);
        wptr = readw(ofsAddr + TXwptr);
        mask = readw(ofsAddr + TX_mask);
@@ -2530,7 +2348,7 @@ int MoxaPortTxFree(int port)
        ushort rptr, wptr, mask;
        int len;
 
-       ofsAddr = moxaTableAddr[port];
+       ofsAddr = moxa_ports[port].tableAddr;
        rptr = readw(ofsAddr + TXrptr);
        wptr = readw(ofsAddr + TXwptr);
        mask = readw(ofsAddr + TX_mask);
@@ -2544,7 +2362,7 @@ int MoxaPortRxQueue(int port)
        ushort rptr, wptr, mask;
        int len;
 
-       ofsAddr = moxaTableAddr[port];
+       ofsAddr = moxa_ports[port].tableAddr;
        rptr = readw(ofsAddr + RXrptr);
        wptr = readw(ofsAddr + RXwptr);
        mask = readw(ofsAddr + RX_mask);
@@ -2557,7 +2375,7 @@ void MoxaPortTxDisable(int port)
 {
        void __iomem *ofsAddr;
 
-       ofsAddr = moxaTableAddr[port];
+       ofsAddr = moxa_ports[port].tableAddr;
        moxafunc(ofsAddr, FC_SetXoffState, Magic_code);
 }
 
@@ -2565,7 +2383,7 @@ void MoxaPortTxEnable(int port)
 {
        void __iomem *ofsAddr;
 
-       ofsAddr = moxaTableAddr[port];
+       ofsAddr = moxa_ports[port].tableAddr;
        moxafunc(ofsAddr, FC_SetXonState, Magic_code);
 }
 
@@ -2573,8 +2391,8 @@ void MoxaPortTxEnable(int port)
 int MoxaPortResetBrkCnt(int port)
 {
        ushort cnt;
-       cnt = moxaBreakCnt[port];
-       moxaBreakCnt[port] = 0;
+       cnt = moxa_ports[port].breakCnt;
+       moxa_ports[port].breakCnt = 0;
        return (cnt);
 }
 
@@ -2583,7 +2401,7 @@ void MoxaPortSendBreak(int port, int ms100)
 {
        void __iomem *ofsAddr;
 
-       ofsAddr = moxaTableAddr[port];
+       ofsAddr = moxa_ports[port].tableAddr;
        if (ms100) {
                moxafunc(ofsAddr, FC_SendBreak, Magic_code);
                moxadelay(ms100 * (HZ / 10));
@@ -2594,7 +2412,7 @@ void MoxaPortSendBreak(int port, int ms100)
        moxafunc(ofsAddr, FC_StopBreak, Magic_code);
 }
 
-static int moxa_get_serial_info(struct moxa_str *info,
+static int moxa_get_serial_info(struct moxa_port *info,
                                struct serial_struct __user *retinfo)
 {
        struct serial_struct tmp;
@@ -2616,7 +2434,7 @@ static int moxa_get_serial_info(struct moxa_str *info,
 }
 
 
-static int moxa_set_serial_info(struct moxa_str *info,
+static int moxa_set_serial_info(struct moxa_port *info,
                                struct serial_struct __user *new_info)
 {
        struct serial_struct new_serial;
@@ -2713,7 +2531,7 @@ static int moxaloadbios(int cardno, unsigned char __user *tmp, int len)
 
        if(copy_from_user(moxaBuff, tmp, len))
                return -EFAULT;
-       baseAddr = moxaBaseAddr[cardno];
+       baseAddr = moxa_boards[cardno].basemem;
        writeb(HW_reset, baseAddr + Control_reg);       /* reset */
        moxadelay(1);           /* delay 10 ms */
        for (i = 0; i < 4096; i++)
@@ -2729,7 +2547,7 @@ static int moxafindcard(int cardno)
        void __iomem *baseAddr;
        ushort tmp;
 
-       baseAddr = moxaBaseAddr[cardno];
+       baseAddr = moxa_boards[cardno].basemem;
        switch (moxa_boards[cardno].boardType) {
        case MOXA_BOARD_C218_ISA:
        case MOXA_BOARD_C218_PCI:
@@ -2762,7 +2580,7 @@ static int moxaload320b(int cardno, unsigned char __user *tmp, int len)
                return -EINVAL;
        if(copy_from_user(moxaBuff, tmp, len))
                return -EFAULT;
-       baseAddr = moxaBaseAddr[cardno];
+       baseAddr = moxa_boards[cardno].basemem;
        writew(len - 7168 - 2, baseAddr + C320bapi_len);
        writeb(1, baseAddr + Control_reg);      /* Select Page 1 */
        for (i = 0; i < 7168; i++)
@@ -2780,7 +2598,7 @@ static int moxaloadcode(int cardno, unsigned char __user *tmp, int len)
 
        if(copy_from_user(moxaBuff, tmp, len))
                return -EFAULT;
-       baseAddr = moxaBaseAddr[cardno];
+       baseAddr = moxa_boards[cardno].basemem;
        switch (moxa_boards[cardno].boardType) {
        case MOXA_BOARD_C218_ISA:
        case MOXA_BOARD_C218_PCI:
@@ -2790,11 +2608,13 @@ static int moxaloadcode(int cardno, unsigned char __user *tmp, int len)
                        return (retval);
                port = cardno * MAX_PORTS_PER_BOARD;
                for (i = 0; i < moxa_boards[cardno].numPorts; i++, port++) {
-                       moxaChkPort[port] = 1;
-                       moxaCurBaud[port] = 9600L;
-                       moxaDCDState[port] = 0;
-                       moxaTableAddr[port] = baseAddr + Extern_table + Extern_size * i;
-                       ofsAddr = moxaTableAddr[port];
+                       struct moxa_port *p = &moxa_ports[port];
+
+                       p->chkPort = 1;
+                       p->curBaud = 9600L;
+                       p->DCDState = 0;
+                       p->tableAddr = baseAddr + Extern_table + Extern_size * i;
+                       ofsAddr = p->tableAddr;
                        writew(C218rx_mask, ofsAddr + RX_mask);
                        writew(C218tx_mask, ofsAddr + TX_mask);
                        writew(C218rx_spage + i * C218buf_pageno, ofsAddr + Page_rxb);
@@ -2812,11 +2632,13 @@ static int moxaloadcode(int cardno, unsigned char __user *tmp, int len)
                        return (retval);
                port = cardno * MAX_PORTS_PER_BOARD;
                for (i = 0; i < moxa_boards[cardno].numPorts; i++, port++) {
-                       moxaChkPort[port] = 1;
-                       moxaCurBaud[port] = 9600L;
-                       moxaDCDState[port] = 0;
-                       moxaTableAddr[port] = baseAddr + Extern_table + Extern_size * i;
-                       ofsAddr = moxaTableAddr[port];
+                       struct moxa_port *p = &moxa_ports[port];
+
+                       p->chkPort = 1;
+                       p->curBaud = 9600L;
+                       p->DCDState = 0;
+                       p->tableAddr = baseAddr + Extern_table + Extern_size * i;
+                       ofsAddr = p->tableAddr;
                        if (moxa_boards[cardno].numPorts == 8) {
                                writew(C320p8rx_mask, ofsAddr + RX_mask);
                                writew(C320p8tx_mask, ofsAddr + TX_mask);
@@ -2852,7 +2674,7 @@ static int moxaloadcode(int cardno, unsigned char __user *tmp, int len)
                }
                break;
        }
-       loadstat[cardno] = 1;
+       moxa_boards[cardno].loadstat = 1;
        return (0);
 }
 
@@ -2926,9 +2748,9 @@ static int moxaloadc218(int cardno, void __iomem *baseAddr, int len)
                return (-1);
        }
        moxaCard = 1;
-       moxaIntNdx[cardno] = baseAddr + IRQindex;
-       moxaIntPend[cardno] = baseAddr + IRQpending;
-       moxaIntTable[cardno] = baseAddr + IRQtable;
+       moxa_boards[cardno].intNdx = baseAddr + IRQindex;
+       moxa_boards[cardno].intPend = baseAddr + IRQpending;
+       moxa_boards[cardno].intTable = baseAddr + IRQtable;
        return (0);
 }
 
@@ -3021,25 +2843,15 @@ static int moxaloadc320(int cardno, void __iomem *baseAddr, int len, int *numPor
        if (readw(baseAddr + Magic_no) != Magic_code)
                return (-102);
        moxaCard = 1;
-       moxaIntNdx[cardno] = baseAddr + IRQindex;
-       moxaIntPend[cardno] = baseAddr + IRQpending;
-       moxaIntTable[cardno] = baseAddr + IRQtable;
+       moxa_boards[cardno].intNdx = baseAddr + IRQindex;
+       moxa_boards[cardno].intPend = baseAddr + IRQpending;
+       moxa_boards[cardno].intTable = baseAddr + IRQtable;
        return (0);
 }
 
-#if 0
-long MoxaPortGetCurBaud(int port)
-{
-
-       if (moxaChkPort[port] == 0)
-               return (0);
-       return (moxaCurBaud[port]);
-}
-#endif  /*  0  */
-
 static void MoxaSetFifo(int port, int enable)
 {
-       void __iomem *ofsAddr = moxaTableAddr[port];
+       void __iomem *ofsAddr = moxa_ports[port].tableAddr;
 
        if (!enable) {
                moxafunc(ofsAddr, FC_SetRxFIFOTrig, 0);
@@ -3049,132 +2861,3 @@ static void MoxaSetFifo(int port, int enable)
                moxafunc(ofsAddr, FC_SetTxFIFOCnt, 16);
        }
 }
-
-#if 0
-int MoxaPortSetMode(int port, int databits, int stopbits, int parity)
-{
-       void __iomem *ofsAddr;
-       int val;
-
-       val = 0;
-       switch (databits) {
-       case 5:
-               val |= 0;
-               break;
-       case 6:
-               val |= 1;
-               break;
-       case 7:
-               val |= 2;
-               break;
-       case 8:
-               val |= 3;
-               break;
-       default:
-               return (-1);
-       }
-       switch (stopbits) {
-       case 0:
-               val |= 0;
-               break;          /* stop bits 1.5 */
-       case 1:
-               val |= 0;
-               break;
-       case 2:
-               val |= 4;
-               break;
-       default:
-               return (-1);
-       }
-       switch (parity) {
-       case 0:
-               val |= 0x00;
-               break;          /* None  */
-       case 1:
-               val |= 0x08;
-               break;          /* Odd   */
-       case 2:
-               val |= 0x18;
-               break;          /* Even  */
-       case 3:
-               val |= 0x28;
-               break;          /* Mark  */
-       case 4:
-               val |= 0x38;
-               break;          /* Space */
-       default:
-               return (-1);
-       }
-       ofsAddr = moxaTableAddr[port];
-       moxafunc(ofsAddr, FC_SetMode, val);
-       return (0);
-}
-
-int MoxaPortTxBufSize(int port)
-{
-       void __iomem *ofsAddr;
-       int size;
-
-       ofsAddr = moxaTableAddr[port];
-       size = readw(ofsAddr + TX_mask);
-       return (size);
-}
-
-int MoxaPortRxBufSize(int port)
-{
-       void __iomem *ofsAddr;
-       int size;
-
-       ofsAddr = moxaTableAddr[port];
-       size = readw(ofsAddr + RX_mask);
-       return (size);
-}
-
-int MoxaPortRxFree(int port)
-{
-       void __iomem *ofsAddr;
-       ushort rptr, wptr, mask;
-       int len;
-
-       ofsAddr = moxaTableAddr[port];
-       rptr = readw(ofsAddr + RXrptr);
-       wptr = readw(ofsAddr + RXwptr);
-       mask = readw(ofsAddr + RX_mask);
-       len = mask - ((wptr - rptr) & mask);
-       return (len);
-}
-int MoxaPortGetBrkCnt(int port)
-{
-       return (moxaBreakCnt[port]);
-}
-
-void MoxaPortSetXonXoff(int port, int xonValue, int xoffValue)
-{
-       void __iomem *ofsAddr;
-
-       ofsAddr = moxaTableAddr[port];
-       writew(xonValue, ofsAddr + FuncArg);
-       writew(xoffValue, ofsAddr + FuncArg1);
-       writew(FC_SetXonXoff, ofsAddr + FuncCode);
-       wait_finish(ofsAddr);
-}
-
-int MoxaPortIsTxHold(int port)
-{
-       void __iomem *ofsAddr;
-       int val;
-
-       ofsAddr = moxaTableAddr[port];
-       if ((moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_ISA) ||
-           (moxa_boards[port / MAX_PORTS_PER_BOARD].boardType == MOXA_BOARD_C320_PCI)) {
-               moxafunc(ofsAddr, FC_GetCCSR, 0);
-               val = readw(ofsAddr + FuncArg);
-               if (val & 0x04)
-                       return (1);
-       } else {
-               if (readw(ofsAddr + FlagStat) & Tx_flowOff)
-                       return (1);
-       }
-       return (0);
-}
-#endif
index 235e892261124d81c7c131e06f30bc4b713ad558..7ac30612068b674e742fb5577ed169148347f03f 100644 (file)
@@ -291,7 +291,7 @@ uncached_mmap(struct file *file, struct vm_area_struct *vma)
        return mspec_mmap(file, vma, MSPEC_UNCACHED);
 }
 
-static struct file_operations fetchop_fops = {
+static const struct file_operations fetchop_fops = {
        .owner = THIS_MODULE,
        .mmap = fetchop_mmap
 };
@@ -302,7 +302,7 @@ static struct miscdevice fetchop_miscdev = {
        .fops = &fetchop_fops
 };
 
-static struct file_operations cached_fops = {
+static const struct file_operations cached_fops = {
        .owner = THIS_MODULE,
        .mmap = cached_mmap
 };
@@ -313,7 +313,7 @@ static struct miscdevice cached_miscdev = {
        .fops = &cached_fops
 };
 
-static struct file_operations uncached_fops = {
+static const struct file_operations uncached_fops = {
        .owner = THIS_MODULE,
        .mmap = uncached_mmap
 };
index 83f604b19290706f3a04577c463a4cfeec029a0a..a61fb6da5d03f0b757b93c45893f01a8d031ddc8 100644 (file)
@@ -321,8 +321,6 @@ struct mxser_struct {
        unsigned long event;
        int count;              /* # of fd on device */
        int blocked_open;       /* # of blocked opens */
-       long session;           /* Session of opening process */
-       long pgrp;              /* pgrp of opening process */
        unsigned char *xmit_buf;
        int xmit_head;
        int xmit_tail;
@@ -1001,15 +999,12 @@ static int mxser_open(struct tty_struct *tty, struct file *filp)
                mxser_change_speed(info, NULL);
        }
 
-       info->session = process_session(current);
-       info->pgrp = process_group(current);
-
        /*
        status = mxser_get_msr(info->base, 0, info->port);
        mxser_check_modem_status(info, status);
        */
 
-/* unmark here for very high baud rate (ex. 921600 bps) used */
+       /* unmark here for very high baud rate (ex. 921600 bps) used */
        tty->low_latency = 1;
        return 0;
 }
@@ -1254,9 +1249,7 @@ static void mxser_flush_buffer(struct tty_struct *tty)
        spin_unlock_irqrestore(&info->slock, flags);
        /* above added by shinhay */
 
-       wake_up_interruptible(&tty->write_wait);
-       if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup)
-               (tty->ldisc.write_wakeup) (tty);
+       tty_wakeup(tty);
 }
 
 static int mxser_ioctl(struct tty_struct *tty, struct file *file, unsigned int cmd, unsigned long arg)
index 7e188a4d602a7060915a89eda89d95533bfc2636..9fe28497eae9ed51b8780673cd111456b1ff8aec 100644 (file)
 
 #define READ_MOXA_MUST_GDL(baseio)     inb((baseio)+MOXA_MUST_GDL_REGISTER)
 
-
-#ifndef INIT_WORK
-#define INIT_WORK(_work, _func, _data){        \
-       _data->tqueue.routine = _func;\
-       _data->tqueue.data = _data;\
-       }
-#endif
-
 #endif
index 1bb030b3a51a6ec3017cf2d21537ceef4f6f1fbf..9af07e4999d5f0cac406a3f2200adad82b27dcca 100644 (file)
 
 #include "mxser_new.h"
 
-#define        MXSER_VERSION   "2.0"
+#define        MXSER_VERSION   "2.0.1"         /* 1.9.15 */
 #define        MXSERMAJOR       174
 #define        MXSERCUMAJOR     175
 
-#define        MXSER_EVENT_TXLOW       1
-
 #define MXSER_BOARDS           4       /* Max. boards */
 #define MXSER_PORTS_PER_BOARD  8       /* Max. ports per board */
 #define MXSER_PORTS            (MXSER_BOARDS * MXSER_PORTS_PER_BOARD)
-#define MXSER_ISR_PASS_LIMIT   99999L
+#define MXSER_ISR_PASS_LIMIT   100
 
 #define        MXSER_ERR_IOADDR        -1
 #define        MXSER_ERR_IRQ           -2
 #define        MXSER_ERR_IRQ_CONFLIT   -3
 #define        MXSER_ERR_VECTOR        -4
 
+/*CheckIsMoxaMust return value*/
+#define MOXA_OTHER_UART                0x00
+#define MOXA_MUST_MU150_HWID   0x01
+#define MOXA_MUST_MU860_HWID   0x02
+
 #define WAKEUP_CHARS           256
 
 #define UART_MCR_AFE           0x20
@@ -176,6 +179,18 @@ static struct pci_device_id mxser_pcibrds[] = {
 };
 MODULE_DEVICE_TABLE(pci, mxser_pcibrds);
 
+static int mxvar_baud_table[] = {
+       0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400,
+       4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600
+};
+static unsigned int mxvar_baud_table1[] = {
+       0, B50, B75, B110, B134, B150, B200, B300, B600, B1200, B1800, B2400,
+       B4800, B9600, B19200, B38400, B57600, B115200, B230400, B460800, B921600
+};
+#define BAUD_TABLE_NO ARRAY_SIZE(mxvar_baud_table)
+
+#define B_SPEC B2000000
+
 static int ioaddr[MXSER_BOARDS] = { 0, 0, 0, 0 };
 static int ttymajor = MXSERMAJOR;
 static int calloutmajor = MXSERCUMAJOR;
@@ -237,8 +252,7 @@ struct mxser_port {
        long realbaud;
        int type;               /* UART type */
        int flags;              /* defined in tty.h */
-       long session;           /* Session of opening process */
-       long pgrp;              /* pgrp of opening process */
+       int speed;
 
        int x_char;             /* xon/xoff character */
        int IER;                /* Interrupt Enable Register */
@@ -267,14 +281,11 @@ struct mxser_port {
        int xmit_cnt;
 
        struct ktermios normal_termios;
-       struct ktermios callout_termios;
 
        struct mxser_mon mon_data;
 
        spinlock_t slock;
-       struct work_struct tqueue;
        wait_queue_head_t open_wait;
-       wait_queue_head_t close_wait;
        wait_queue_head_t delta_msr_wait;
 };
 
@@ -313,10 +324,9 @@ static int mxvar_diagflag;
 static unsigned char mxser_msr[MXSER_PORTS + 1];
 static struct mxser_mon_ext mon_data_ext;
 static int mxser_set_baud_method[MXSER_PORTS + 1];
-static spinlock_t gm_lock;
 
 #ifdef CONFIG_PCI
-static int CheckIsMoxaMust(int io)
+static int __devinit CheckIsMoxaMust(int io)
 {
        u8 oldmcr, hwid;
        int i;
@@ -360,15 +370,6 @@ static void process_txrx_fifo(struct mxser_port *info)
                        }
 }
 
-static void mxser_do_softint(struct work_struct *work)
-{
-       struct mxser_port *info = container_of(work, struct mxser_port, tqueue);
-       struct tty_struct *tty = info->tty;
-
-       if (test_and_clear_bit(MXSER_EVENT_TXLOW, &info->event))
-               tty_wakeup(tty);
-}
-
 static unsigned char mxser_get_msr(int baseaddr, int mode, int port)
 {
        unsigned char status = 0;
@@ -456,10 +457,10 @@ static int mxser_block_til_ready(struct tty_struct *tty, struct file *filp,
 
 static int mxser_set_baud(struct mxser_port *info, long newspd)
 {
+       unsigned int i;
        int quot = 0;
        unsigned char cval;
        int ret = 0;
-       unsigned long flags;
 
        if (!info->tty || !info->tty->termios)
                return ret;
@@ -471,29 +472,34 @@ static int mxser_set_baud(struct mxser_port *info, long newspd)
                return 0;
 
        info->realbaud = newspd;
-       if (newspd == 134) {
-               quot = (2 * info->baud_base / 269);
-       } else if (newspd) {
-               quot = info->baud_base / newspd;
-               if (quot == 0)
-                       quot = 1;
+       for (i = 0; i < BAUD_TABLE_NO; i++)
+              if (newspd == mxvar_baud_table[i])
+                      break;
+       if (i == BAUD_TABLE_NO) {
+               quot = info->baud_base / info->speed;
+               if (info->speed <= 0 || info->speed > info->max_baud)
+                       quot = 0;
        } else {
-               quot = 0;
+               if (newspd == 134) {
+                       quot = (2 * info->baud_base / 269);
+               } else if (newspd) {
+                       quot = info->baud_base / newspd;
+                       if (quot == 0)
+                               quot = 1;
+               } else {
+                       quot = 0;
+               }
        }
 
        info->timeout = ((info->xmit_fifo_size * HZ * 10 * quot) / info->baud_base);
        info->timeout += HZ / 50;       /* Add .02 seconds of slop */
 
        if (quot) {
-               spin_lock_irqsave(&info->slock, flags);
                info->MCR |= UART_MCR_DTR;
                outb(info->MCR, info->ioaddr + UART_MCR);
-               spin_unlock_irqrestore(&info->slock, flags);
        } else {
-               spin_lock_irqsave(&info->slock, flags);
                info->MCR &= ~UART_MCR_DTR;
                outb(info->MCR, info->ioaddr + UART_MCR);
-               spin_unlock_irqrestore(&info->slock, flags);
                return ret;
        }
 
@@ -505,6 +511,18 @@ static int mxser_set_baud(struct mxser_port *info, long newspd)
        outb(quot >> 8, info->ioaddr + UART_DLM);       /* MS of divisor */
        outb(cval, info->ioaddr + UART_LCR);    /* reset DLAB */
 
+       if (i == BAUD_TABLE_NO) {
+               quot = info->baud_base % info->speed;
+               quot *= 8;
+               if ((quot % info->speed) > (info->speed / 2)) {
+                       quot /= info->speed;
+                       quot++;
+               } else {
+                       quot /= info->speed;
+               }
+               SET_MOXA_MUST_ENUM_VALUE(info->ioaddr, quot);
+       } else
+               SET_MOXA_MUST_ENUM_VALUE(info->ioaddr, 0);
 
        return ret;
 }
@@ -520,7 +538,6 @@ static int mxser_change_speed(struct mxser_port *info,
        int ret = 0;
        unsigned char status;
        long baud;
-       unsigned long flags;
 
        if (!info->tty || !info->tty->termios)
                return ret;
@@ -529,7 +546,10 @@ static int mxser_change_speed(struct mxser_port *info,
                return ret;
 
        if (mxser_set_baud_method[info->tty->index] == 0) {
-               baud = tty_get_baud_rate(info->tty);
+               if ((cflag & CBAUD) == B_SPEC)
+                       baud = info->speed;
+               else
+                       baud = tty_get_baud_rate(info->tty);
                mxser_set_baud(info, baud);
        }
 
@@ -612,8 +632,8 @@ static int mxser_change_speed(struct mxser_port *info,
                                                outb(info->IER, info->ioaddr +
                                                                UART_IER);
                                        }
-                                       set_bit(MXSER_EVENT_TXLOW, &info->event);
-                                       schedule_work(&info->tqueue);                           }
+                                       tty_wakeup(info->tty);
+                               }
                        } else {
                                if (!(status & UART_MSR_CTS)) {
                                        info->tty->hw_stopped = 1;
@@ -668,7 +688,6 @@ static int mxser_change_speed(struct mxser_port *info,
                }
        }
        if (info->board->chip_flag) {
-               spin_lock_irqsave(&info->slock, flags);
                SET_MOXA_MUST_XON1_VALUE(info->ioaddr, START_CHAR(info->tty));
                SET_MOXA_MUST_XOFF1_VALUE(info->ioaddr, STOP_CHAR(info->tty));
                if (I_IXON(info->tty)) {
@@ -681,7 +700,6 @@ static int mxser_change_speed(struct mxser_port *info,
                } else {
                        DISABLE_MOXA_MUST_TX_SOFTWARE_FLOW_CONTROL(info->ioaddr);
                }
-               spin_unlock_irqrestore(&info->slock, flags);
        }
 
 
@@ -708,7 +726,6 @@ static void mxser_check_modem_status(struct mxser_port *port, int status)
        if ((port->flags & ASYNC_CHECK_CD) && (status & UART_MSR_DDCD)) {
                if (status & UART_MSR_DCD)
                        wake_up_interruptible(&port->open_wait);
-               schedule_work(&port->tqueue);
        }
 
        if (port->flags & ASYNC_CTS_FLOW) {
@@ -724,8 +741,7 @@ static void mxser_check_modem_status(struct mxser_port *port, int status)
                                        outb(port->IER, port->ioaddr +
                                                        UART_IER);
                                }
-                               set_bit(MXSER_EVENT_TXLOW, &port->event);
-                               schedule_work(&port->tqueue);
+                               tty_wakeup(port->tty);
                        }
                } else {
                        if (!(status & UART_MSR_CTS)) {
@@ -836,10 +852,10 @@ static int mxser_startup(struct mxser_port *info)
        /*
         * and set the speed of the serial port
         */
-       spin_unlock_irqrestore(&info->slock, flags);
        mxser_change_speed(info, NULL);
-
        info->flags |= ASYNC_INITIALIZED;
+       spin_unlock_irqrestore(&info->slock, flags);
+
        return 0;
 }
 
@@ -909,11 +925,9 @@ static void mxser_shutdown(struct mxser_port *info)
 static int mxser_open(struct tty_struct *tty, struct file *filp)
 {
        struct mxser_port *info;
+       unsigned long flags;
        int retval, line;
 
-       /* initialize driver_data in case something fails */
-       tty->driver_data = NULL;
-
        line = tty->index;
        if (line == MXSER_PORTS)
                return 0;
@@ -928,7 +942,9 @@ static int mxser_open(struct tty_struct *tty, struct file *filp)
        /*
         * Start up serial port
         */
+       spin_lock_irqsave(&info->slock, flags);
        info->count++;
+       spin_unlock_irqrestore(&info->slock, flags);
        retval = mxser_startup(info);
        if (retval)
                return retval;
@@ -937,17 +953,6 @@ static int mxser_open(struct tty_struct *tty, struct file *filp)
        if (retval)
                return retval;
 
-       if ((info->count == 1) && (info->flags & ASYNC_SPLIT_TERMIOS)) {
-               if (tty->driver->subtype == SERIAL_TYPE_NORMAL)
-                       *tty->termios = info->normal_termios;
-               else
-                       *tty->termios = info->callout_termios;
-               mxser_change_speed(info, NULL);
-       }
-
-       info->session = process_session(current);
-       info->pgrp = process_group(current);
-
        /* unmark here for very high baud rate (ex. 921600 bps) used */
        tty->low_latency = 1;
        return 0;
@@ -1054,8 +1059,6 @@ static void mxser_close(struct tty_struct *tty, struct file *filp)
        }
 
        info->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CLOSING);
-       wake_up_interruptible(&info->close_wait);
-
 }
 
 static int mxser_write(struct tty_struct *tty, const unsigned char *buf, int count)
@@ -1222,6 +1225,7 @@ static int mxser_set_serial_info(struct mxser_port *info,
                struct serial_struct __user *new_info)
 {
        struct serial_struct new_serial;
+       unsigned long sl_flags;
        unsigned int flags;
        int retval = 0;
 
@@ -1264,8 +1268,11 @@ static int mxser_set_serial_info(struct mxser_port *info,
        process_txrx_fifo(info);
 
        if (info->flags & ASYNC_INITIALIZED) {
-               if (flags != (info->flags & ASYNC_SPD_MASK))
+               if (flags != (info->flags & ASYNC_SPD_MASK)) {
+                       spin_lock_irqsave(&info->slock, sl_flags);
                        mxser_change_speed(info, NULL);
+                       spin_unlock_irqrestore(&info->slock, sl_flags);
+               }
        } else
                retval = mxser_startup(info);
 
@@ -1373,11 +1380,10 @@ static int mxser_tiocmset(struct tty_struct *tty, struct file *file,
        return 0;
 }
 
-static int mxser_program_mode(int port)
+static int __init mxser_program_mode(int port)
 {
        int id, i, j, n;
 
-       spin_lock(&gm_lock);
        outb(0, port);
        outb(0, port);
        outb(0, port);
@@ -1385,7 +1391,6 @@ static int mxser_program_mode(int port)
        (void)inb(port);
        outb(0, port);
        (void)inb(port);
-       spin_unlock(&gm_lock);
 
        id = inb(port + 1) & 0x1F;
        if ((id != C168_ASIC_ID) &&
@@ -1410,7 +1415,7 @@ static int mxser_program_mode(int port)
        return id;
 }
 
-static void mxser_normal_mode(int port)
+static void __init mxser_normal_mode(int port)
 {
        int i, n;
 
@@ -1443,7 +1448,7 @@ static void mxser_normal_mode(int port)
 #define EN0_PORT       0x010   /* Rcv missed frame error counter RD */
 #define ENC_PAGE0      0x000   /* Select page 0 of chip registers   */
 #define ENC_PAGE3      0x0C0   /* Select page 3 of chip registers   */
-static int mxser_read_register(int port, unsigned short *regs)
+static int __init mxser_read_register(int port, unsigned short *regs)
 {
        int i, k, value, id;
        unsigned int j;
@@ -1644,6 +1649,7 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file,
        struct serial_icounter_struct __user *p_cuser;
        unsigned long templ;
        unsigned long flags;
+       unsigned int i;
        void __user *argp = (void __user *)arg;
        int retval;
 
@@ -1682,6 +1688,36 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file,
                return 0;
        }
 
+       if (cmd == MOXA_SET_SPECIAL_BAUD_RATE) {
+               int speed;
+
+               if (get_user(speed, (int __user *)argp))
+                       return -EFAULT;
+               if (speed <= 0 || speed > info->max_baud)
+                       return -EFAULT;
+               if (!info->tty || !info->tty->termios || !info->ioaddr)
+                       return 0;
+               info->tty->termios->c_cflag &= ~(CBAUD | CBAUDEX);
+               for (i = 0; i < BAUD_TABLE_NO; i++)
+                       if (speed == mxvar_baud_table[i])
+                               break;
+               if (i == BAUD_TABLE_NO) {
+                       info->tty->termios->c_cflag |= B_SPEC;
+               } else if (speed != 0)
+                       info->tty->termios->c_cflag |= mxvar_baud_table1[i];
+
+               info->speed = speed;
+               spin_lock_irqsave(&info->slock, flags);
+               mxser_change_speed(info, NULL);
+               spin_unlock_irqrestore(&info->slock, flags);
+
+               return 0;
+       } else if (cmd == MOXA_GET_SPECIAL_BAUD_RATE) {
+               if (copy_to_user(argp, &info->speed, sizeof(int)))
+                    return -EFAULT;
+               return 0;
+       }
+
        if (cmd != TIOCGSERIAL && cmd != TIOCMIWAIT && cmd != TIOCGICOUNT &&
                        test_bit(TTY_IO_ERROR, &tty->flags))
                return -EIO;
@@ -1799,7 +1835,9 @@ static int mxser_ioctl(struct tty_struct *tty, struct file *file,
                long baud;
                if (get_user(baud, (long __user *)argp))
                        return -EFAULT;
+               spin_lock_irqsave(&info->slock, flags);
                mxser_set_baud(info, baud);
+               spin_unlock_irqrestore(&info->slock, flags);
                return 0;
        }
        case MOXA_ASPP_GETBAUD:
@@ -1976,7 +2014,9 @@ static void mxser_set_termios(struct tty_struct *tty, struct ktermios *old_termi
        if ((tty->termios->c_cflag != old_termios->c_cflag) ||
                        (RELEVANT_IFLAG(tty->termios->c_iflag) != RELEVANT_IFLAG(old_termios->c_iflag))) {
 
+               spin_lock_irqsave(&info->slock, flags);
                mxser_change_speed(info, old_termios);
+               spin_unlock_irqrestore(&info->slock, flags);
 
                if ((old_termios->c_cflag & CRTSCTS) &&
                                !(tty->termios->c_cflag & CRTSCTS)) {
@@ -2066,7 +2106,7 @@ static void mxser_wait_until_sent(struct tty_struct *tty, int timeout)
 /*
  * This routine is called by tty_hangup() when a hangup is signaled.
  */
-void mxser_hangup(struct tty_struct *tty)
+static void mxser_hangup(struct tty_struct *tty)
 {
        struct mxser_port *info = tty->driver_data;
 
@@ -2105,9 +2145,6 @@ static void mxser_receive_chars(struct mxser_port *port, int *status)
        int cnt = 0;
        int recv_room;
        int max = 256;
-       unsigned long flags;
-
-       spin_lock_irqsave(&port->slock, flags);
 
        recv_room = tty->receive_room;
        if ((recv_room == 0) && (!port->ldisc_stop_rx))
@@ -2169,7 +2206,8 @@ intr_old:
                                } else if (*status & UART_LSR_OE) {
                                        flag = TTY_OVERRUN;
                                        port->icount.overrun++;
-                               }
+                               } else
+                                       flag = TTY_BREAK;
                        }
                        tty_insert_flip_char(tty, ch, flag);
                        cnt++;
@@ -2191,7 +2229,6 @@ end_intr:
        mxvar_log.rxcnt[port->tty->index] += cnt;
        port->mon_data.rxcnt += cnt;
        port->mon_data.up_rxcnt += cnt;
-       spin_unlock_irqrestore(&port->slock, flags);
 
        tty_flip_buffer_push(tty);
 }
@@ -2199,9 +2236,6 @@ end_intr:
 static void mxser_transmit_chars(struct mxser_port *port)
 {
        int count, cnt;
-       unsigned long flags;
-
-       spin_lock_irqsave(&port->slock, flags);
 
        if (port->x_char) {
                outb(port->x_char, port->ioaddr + UART_TX);
@@ -2210,11 +2244,11 @@ static void mxser_transmit_chars(struct mxser_port *port)
                port->mon_data.txcnt++;
                port->mon_data.up_txcnt++;
                port->icount.tx++;
-               goto unlock;
+               return;
        }
 
        if (port->xmit_buf == 0)
-               goto unlock;
+               return;
 
        if ((port->xmit_cnt <= 0) || port->tty->stopped ||
                        (port->tty->hw_stopped &&
@@ -2222,7 +2256,7 @@ static void mxser_transmit_chars(struct mxser_port *port)
                        (!port->board->chip_flag))) {
                port->IER &= ~UART_IER_THRI;
                outb(port->IER, port->ioaddr + UART_IER);
-               goto unlock;
+               return;
        }
 
        cnt = port->xmit_cnt;
@@ -2240,16 +2274,13 @@ static void mxser_transmit_chars(struct mxser_port *port)
        port->mon_data.up_txcnt += (cnt - port->xmit_cnt);
        port->icount.tx += (cnt - port->xmit_cnt);
 
-       if (port->xmit_cnt < WAKEUP_CHARS) {
-               set_bit(MXSER_EVENT_TXLOW, &port->event);
-               schedule_work(&port->tqueue);
-       }
+       if (port->xmit_cnt < WAKEUP_CHARS)
+               tty_wakeup(port->tty);
+
        if (port->xmit_cnt <= 0) {
                port->IER &= ~UART_IER_THRI;
                outb(port->IER, port->ioaddr + UART_IER);
        }
-unlock:
-       spin_unlock_irqrestore(&port->slock, flags);
 }
 
 /*
@@ -2261,8 +2292,7 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id)
        struct mxser_board *brd = NULL;
        struct mxser_port *port;
        int max, irqbits, bits, msr;
-       int pass_counter = 0;
-       unsigned int int_cnt;
+       unsigned int int_cnt, pass_counter = 0;
        int handled = IRQ_NONE;
 
        for (i = 0; i < MXSER_BOARDS; i++)
@@ -2276,7 +2306,7 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id)
        if (brd == NULL)
                goto irq_stop;
        max = brd->info->nports;
-       while (1) {
+       while (pass_counter++ < MXSER_ISR_PASS_LIMIT) {
                irqbits = inb(brd->vector) & brd->vector_mask;
                if (irqbits == brd->vector_mask)
                        break;
@@ -2290,12 +2320,16 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id)
                        port = &brd->ports[i];
 
                        int_cnt = 0;
+                       spin_lock(&port->slock);
                        do {
                                iir = inb(port->ioaddr + UART_IIR);
                                if (iir & UART_IIR_NO_INT)
                                        break;
                                iir &= MOXA_MUST_IIR_MASK;
-                               if (!port->tty) {
+                               if (!port->tty ||
+                                               (port->flags & ASYNC_CLOSING) ||
+                                               !(port->flags &
+                                                       ASYNC_INITIALIZED)) {
                                        status = inb(port->ioaddr + UART_LSR);
                                        outb(0x27, port->ioaddr + UART_FCR);
                                        inb(port->ioaddr + UART_MSR);
@@ -2341,9 +2375,8 @@ static irqreturn_t mxser_interrupt(int irq, void *dev_id)
                                                mxser_transmit_chars(port);
                                }
                        } while (int_cnt++ < MXSER_ISR_PASS_LIMIT);
+                       spin_unlock(&port->slock);
                }
-               if (pass_counter++ > MXSER_ISR_PASS_LIMIT)
-                       break;  /* Prevent infinite loops */
        }
 
 irq_stop:
@@ -2385,7 +2418,6 @@ static void mxser_release_res(struct mxser_board *brd, struct pci_dev *pdev,
 #ifdef CONFIG_PCI
                pci_release_region(pdev, 2);
                pci_release_region(pdev, 3);
-               pci_dev_put(pdev);
 #endif
        } else {
                release_region(brd->ports[0].ioaddr, 8 * brd->info->nports);
@@ -2420,11 +2452,10 @@ static int __devinit mxser_initbrd(struct mxser_board *brd,
                info->custom_divisor = info->baud_base * 16;
                info->close_delay = 5 * HZ / 10;
                info->closing_wait = 30 * HZ;
-               INIT_WORK(&info->tqueue, mxser_do_softint);
                info->normal_termios = mxvar_sdriver->init_termios;
                init_waitqueue_head(&info->open_wait);
-               init_waitqueue_head(&info->close_wait);
                init_waitqueue_head(&info->delta_msr_wait);
+               info->speed = 9600;
                memset(&info->mon_data, 0, sizeof(struct mxser_mon));
                info->err_shadow = 0;
                spin_lock_init(&info->slock);
@@ -2433,22 +2464,17 @@ static int __devinit mxser_initbrd(struct mxser_board *brd,
                outb(inb(info->ioaddr + UART_IER) & 0xf0,
                        info->ioaddr + UART_IER);
        }
-       /*
-        * Allocate the IRQ if necessary
-        */
 
-       retval = request_irq(brd->irq, mxser_interrupt,
-                       (brd->ports[0].flags & ASYNC_SHARE_IRQ) ? IRQF_SHARED :
-                       IRQF_DISABLED, "mxser", brd);
+       retval = request_irq(brd->irq, mxser_interrupt, IRQF_SHARED, "mxser",
+                       brd);
        if (retval) {
                printk(KERN_ERR "Board %s: Request irq failed, IRQ (%d) may "
                        "conflict with another device.\n",
                        brd->info->name, brd->irq);
                /* We hold resources, we need to release them. */
                mxser_release_res(brd, pdev, 0);
-               return retval;
        }
-       return 0;
+       return retval;
 }
 
 static int __init mxser_get_ISA_conf(int cap, struct mxser_board *brd)
@@ -2633,8 +2659,9 @@ static int __devinit mxser_probe(struct pci_dev *pdev,
        }
 
        /* mxser_initbrd will hook ISR. */
-       if (mxser_initbrd(brd, pdev) < 0)
-               goto err_relvec;
+       retval = mxser_initbrd(brd, pdev);
+       if (retval)
+               goto err_null;
 
        for (i = 0; i < brd->info->nports; i++)
                tty_register_device(mxvar_sdriver, brd->idx + i, &pdev->dev);
@@ -2642,10 +2669,9 @@ static int __devinit mxser_probe(struct pci_dev *pdev,
        pci_set_drvdata(pdev, brd);
 
        return 0;
-err_relvec:
-       pci_release_region(pdev, 3);
 err_relio:
        pci_release_region(pdev, 2);
+err_null:
        brd->info = NULL;
 err:
        return retval;
@@ -2663,6 +2689,7 @@ static void __devexit mxser_remove(struct pci_dev *pdev)
                tty_unregister_device(mxvar_sdriver, brd->idx + i);
 
        mxser_release_res(brd, pdev, 1);
+       brd->info = NULL;
 }
 
 static struct pci_driver mxser_driver = {
@@ -2684,7 +2711,6 @@ static int __init mxser_module_init(void)
        mxvar_sdriver = alloc_tty_driver(MXSER_PORTS + 1);
        if (!mxvar_sdriver)
                return -ENOMEM;
-       spin_lock_init(&gm_lock);
 
        printk(KERN_INFO "MOXA Smartio/Industio family driver version %s\n",
                MXSER_VERSION);
index a08f0ecb09ba76deaba83d8aff1ed691621ca850..d42f7766c65292cf83f4eb44eb1bbf6ae1ab5ed3 100644 (file)
 #define RS422_MODE             2
 #define RS485_4WIRE_MODE       3
 #define OP_MODE_MASK           3
-// above add by Victor Yu. 01-05-2004
-
-#define TTY_THRESHOLD_THROTTLE  128
-
-#define LO_WATER               (TTY_FLIPBUF_SIZE)
-#define HI_WATER               (TTY_FLIPBUF_SIZE*2*3/4)
-
-// added by James. 03-11-2004.
-#define MOXA_SDS_GETICOUNTER   (MOXA + 68)
-#define MOXA_SDS_RSTICOUNTER   (MOXA + 69)
-// (above) added by James.
 
+#define MOXA_SDS_RSTICOUNTER   (MOXA + 69)
 #define MOXA_ASPP_OQUEUE       (MOXA + 70)
 #define MOXA_ASPP_SETBAUD      (MOXA + 71)
 #define MOXA_ASPP_GETBAUD      (MOXA + 72)
@@ -45,7 +35,8 @@
 #define MOXA_ASPP_LSTATUS      (MOXA + 74)
 #define MOXA_ASPP_MON_EXT      (MOXA + 75)
 #define MOXA_SET_BAUD_METHOD   (MOXA + 76)
-
+#define MOXA_SET_SPECIAL_BAUD_RATE     (MOXA + 77)
+#define MOXA_GET_SPECIAL_BAUD_RATE     (MOXA + 78)
 
 /* --------------------------------------------------- */
 
 #define NPPI_NOTIFY_SW_OVERRUN 0x08
 #define NPPI_NOTIFY_BREAK      0x10
 
-#define NPPI_NOTIFY_CTSHOLD         0x01       // Tx hold by CTS low
-#define NPPI_NOTIFY_DSRHOLD         0x02       // Tx hold by DSR low
-#define NPPI_NOTIFY_XOFFHOLD        0x08       // Tx hold by Xoff received
-#define NPPI_NOTIFY_XOFFXENT        0x10       // Xoff Sent
-
-//CheckIsMoxaMust return value
-#define MOXA_OTHER_UART                        0x00
-#define MOXA_MUST_MU150_HWID           0x01
-#define MOXA_MUST_MU860_HWID           0x02
-
-// follow just for Moxa Must chip define.
-//
-// when LCR register (offset 0x03) write following value,
-// the Must chip will enter enchance mode. And write value
-// on EFR (offset 0x02) bit 6,7 to change bank.
+#define NPPI_NOTIFY_CTSHOLD         0x01       /* Tx hold by CTS low */
+#define NPPI_NOTIFY_DSRHOLD         0x02       /* Tx hold by DSR low */
+#define NPPI_NOTIFY_XOFFHOLD        0x08       /* Tx hold by Xoff received */
+#define NPPI_NOTIFY_XOFFXENT        0x10       /* Xoff Sent */
+
+/* follow just for Moxa Must chip define. */
+/* */
+/* when LCR register (offset 0x03) write following value, */
+/* the Must chip will enter enchance mode. And write value */
+/* on EFR (offset 0x02) bit 6,7 to change bank. */
 #define MOXA_MUST_ENTER_ENCHANCE       0xBF
 
-// when enhance mode enable, access on general bank register
+/* when enhance mode enable, access on general bank register */
 #define MOXA_MUST_GDL_REGISTER         0x07
 #define MOXA_MUST_GDL_MASK             0x7F
 #define MOXA_MUST_GDL_HAS_BAD_DATA     0x80
 
-#define MOXA_MUST_LSR_RERR             0x80    // error in receive FIFO
-// enchance register bank select and enchance mode setting register
-// when LCR register equal to 0xBF
+#define MOXA_MUST_LSR_RERR             0x80    /* error in receive FIFO */
+/* enchance register bank select and enchance mode setting register */
+/* when LCR register equal to 0xBF */
 #define MOXA_MUST_EFR_REGISTER         0x02
-// enchance mode enable
+/* enchance mode enable */
 #define MOXA_MUST_EFR_EFRB_ENABLE      0x10
-// enchance reister bank set 0, 1, 2
+/* enchance reister bank set 0, 1, 2 */
 #define MOXA_MUST_EFR_BANK0            0x00
 #define MOXA_MUST_EFR_BANK1            0x40
 #define MOXA_MUST_EFR_BANK2            0x80
 #define MOXA_MUST_EFR_BANK3            0xC0
 #define MOXA_MUST_EFR_BANK_MASK                0xC0
 
-// set XON1 value register, when LCR=0xBF and change to bank0
+/* set XON1 value register, when LCR=0xBF and change to bank0 */
 #define MOXA_MUST_XON1_REGISTER                0x04
 
-// set XON2 value register, when LCR=0xBF and change to bank0
+/* set XON2 value register, when LCR=0xBF and change to bank0 */
 #define MOXA_MUST_XON2_REGISTER                0x05
 
-// set XOFF1 value register, when LCR=0xBF and change to bank0
+/* set XOFF1 value register, when LCR=0xBF and change to bank0 */
 #define MOXA_MUST_XOFF1_REGISTER       0x06
 
-// set XOFF2 value register, when LCR=0xBF and change to bank0
+/* set XOFF2 value register, when LCR=0xBF and change to bank0 */
 #define MOXA_MUST_XOFF2_REGISTER       0x07
 
 #define MOXA_MUST_RBRTL_REGISTER       0x04
 #define MOXA_MUST_ECR_REGISTER         0x06
 #define MOXA_MUST_CSR_REGISTER         0x07
 
-// good data mode enable
+/* good data mode enable */
 #define MOXA_MUST_FCR_GDA_MODE_ENABLE  0x20
-// only good data put into RxFIFO
+/* only good data put into RxFIFO */
 #define MOXA_MUST_FCR_GDA_ONLY_ENABLE  0x10
 
-// enable CTS interrupt
+/* enable CTS interrupt */
 #define MOXA_MUST_IER_ECTSI            0x80
-// enable RTS interrupt
+/* enable RTS interrupt */
 #define MOXA_MUST_IER_ERTSI            0x40
-// enable Xon/Xoff interrupt
+/* enable Xon/Xoff interrupt */
 #define MOXA_MUST_IER_XINT             0x20
-// enable GDA interrupt
+/* enable GDA interrupt */
 #define MOXA_MUST_IER_EGDAI            0x10
 
 #define MOXA_MUST_RECV_ISR             (UART_IER_RDI | MOXA_MUST_IER_EGDAI)
 
-// GDA interrupt pending
+/* GDA interrupt pending */
 #define MOXA_MUST_IIR_GDA              0x1C
 #define MOXA_MUST_IIR_RDA              0x04
 #define MOXA_MUST_IIR_RTO              0x0C
 #define MOXA_MUST_IIR_LSR              0x06
 
-// recieved Xon/Xoff or specical interrupt pending
+/* recieved Xon/Xoff or specical interrupt pending */
 #define MOXA_MUST_IIR_XSC              0x10
 
-// RTS/CTS change state interrupt pending
+/* RTS/CTS change state interrupt pending */
 #define MOXA_MUST_IIR_RTSCTS           0x20
 #define MOXA_MUST_IIR_MASK             0x3E
 
 #define MOXA_MUST_MCR_XON_ANY          0x80
 #define MOXA_MUST_MCR_TX_XON           0x08
 
-
-// software flow control on chip mask value
+/* software flow control on chip mask value */
 #define MOXA_MUST_EFR_SF_MASK          0x0F
-// send Xon1/Xoff1
+/* send Xon1/Xoff1 */
 #define MOXA_MUST_EFR_SF_TX1           0x08
-// send Xon2/Xoff2
+/* send Xon2/Xoff2 */
 #define MOXA_MUST_EFR_SF_TX2           0x04
-// send Xon1,Xon2/Xoff1,Xoff2
+/* send Xon1,Xon2/Xoff1,Xoff2 */
 #define MOXA_MUST_EFR_SF_TX12          0x0C
-// don't send Xon/Xoff
+/* don't send Xon/Xoff */
 #define MOXA_MUST_EFR_SF_TX_NO         0x00
-// Tx software flow control mask
+/* Tx software flow control mask */
 #define MOXA_MUST_EFR_SF_TX_MASK       0x0C
-// don't receive Xon/Xoff
+/* don't receive Xon/Xoff */
 #define MOXA_MUST_EFR_SF_RX_NO         0x00
-// receive Xon1/Xoff1
+/* receive Xon1/Xoff1 */
 #define MOXA_MUST_EFR_SF_RX1           0x02
-// receive Xon2/Xoff2
+/* receive Xon2/Xoff2 */
 #define MOXA_MUST_EFR_SF_RX2           0x01
-// receive Xon1,Xon2/Xoff1,Xoff2
+/* receive Xon1,Xon2/Xoff1,Xoff2 */
 #define MOXA_MUST_EFR_SF_RX12          0x03
-// Rx software flow control mask
+/* Rx software flow control mask */
 #define MOXA_MUST_EFR_SF_RX_MASK       0x03
 
-//#define MOXA_MUST_MIN_XOFFLIMIT               66
-//#define MOXA_MUST_MIN_XONLIMIT                20
-//#define ID1_RX_TRIG                   120
-
-
-#define CHECK_MOXA_MUST_XOFFLIMIT(info) {      \
-       if ( (info)->IsMoxaMustChipFlag &&      \
-        (info)->HandFlow.XoffLimit < MOXA_MUST_MIN_XOFFLIMIT ) {       \
-               (info)->HandFlow.XoffLimit = MOXA_MUST_MIN_XOFFLIMIT;   \
-               (info)->HandFlow.XonLimit = MOXA_MUST_MIN_XONLIMIT;     \
-       }       \
-}
-
-#define ENABLE_MOXA_MUST_ENCHANCE_MODE(baseio) { \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
+#define ENABLE_MOXA_MUST_ENCHANCE_MODE(baseio) do {            \
+       u8      __oldlcr, __efr;                                \
+       __oldlcr = inb((baseio)+UART_LCR);                      \
        outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr |= MOXA_MUST_EFR_EFRB_ENABLE;     \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
-
-#define DISABLE_MOXA_MUST_ENCHANCE_MODE(baseio) {      \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
+       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);           \
+       __efr |= MOXA_MUST_EFR_EFRB_ENABLE;                     \
+       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);           \
+       outb(__oldlcr, (baseio)+UART_LCR);                      \
+} while (0)
+
+#define DISABLE_MOXA_MUST_ENCHANCE_MODE(baseio) do {           \
+       u8      __oldlcr, __efr;                                \
+       __oldlcr = inb((baseio)+UART_LCR);                      \
        outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_EFRB_ENABLE;    \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
-
-#define SET_MOXA_MUST_XON1_VALUE(baseio, Value) {      \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
+       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);           \
+       __efr &= ~MOXA_MUST_EFR_EFRB_ENABLE;                    \
+       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);           \
+       outb(__oldlcr, (baseio)+UART_LCR);                      \
+} while (0)
+
+#define SET_MOXA_MUST_XON1_VALUE(baseio, Value) do {           \
+       u8      __oldlcr, __efr;                                \
+       __oldlcr = inb((baseio)+UART_LCR);                      \
        outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_BANK_MASK;      \
-       __efr |= MOXA_MUST_EFR_BANK0;   \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
+       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);           \
+       __efr &= ~MOXA_MUST_EFR_BANK_MASK;                      \
+       __efr |= MOXA_MUST_EFR_BANK0;                           \
+       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);           \
        outb((u8)(Value), (baseio)+MOXA_MUST_XON1_REGISTER);    \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
+       outb(__oldlcr, (baseio)+UART_LCR);                      \
+} while (0)
 
-#define SET_MOXA_MUST_XON2_VALUE(baseio, Value) {      \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
+#define SET_MOXA_MUST_XOFF1_VALUE(baseio, Value) do {          \
+       u8      __oldlcr, __efr;                                \
+       __oldlcr = inb((baseio)+UART_LCR);                      \
        outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_BANK_MASK;      \
-       __efr |= MOXA_MUST_EFR_BANK0;   \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
-       outb((u8)(Value), (baseio)+MOXA_MUST_XON2_REGISTER);    \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
-
-#define SET_MOXA_MUST_XOFF1_VALUE(baseio, Value) {     \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
-       outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_BANK_MASK;      \
-       __efr |= MOXA_MUST_EFR_BANK0;   \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
+       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);           \
+       __efr &= ~MOXA_MUST_EFR_BANK_MASK;                      \
+       __efr |= MOXA_MUST_EFR_BANK0;                           \
+       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);           \
        outb((u8)(Value), (baseio)+MOXA_MUST_XOFF1_REGISTER);   \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
+       outb(__oldlcr, (baseio)+UART_LCR);                      \
+} while (0)
 
-#define SET_MOXA_MUST_XOFF2_VALUE(baseio, Value) {     \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
-       outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_BANK_MASK;      \
-       __efr |= MOXA_MUST_EFR_BANK0;   \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
-       outb((u8)(Value), (baseio)+MOXA_MUST_XOFF2_REGISTER);   \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
-
-#define SET_MOXA_MUST_RBRTL_VALUE(baseio, Value) {     \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
-       outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_BANK_MASK;      \
-       __efr |= MOXA_MUST_EFR_BANK1;   \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
-       outb((u8)(Value), (baseio)+MOXA_MUST_RBRTL_REGISTER);   \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
-
-#define SET_MOXA_MUST_RBRTH_VALUE(baseio, Value) {     \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
-       outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_BANK_MASK;      \
-       __efr |= MOXA_MUST_EFR_BANK1;   \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
-       outb((u8)(Value), (baseio)+MOXA_MUST_RBRTH_REGISTER);   \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
-
-#define SET_MOXA_MUST_RBRTI_VALUE(baseio, Value) {     \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
-       outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_BANK_MASK;      \
-       __efr |= MOXA_MUST_EFR_BANK1;   \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
-       outb((u8)(Value), (baseio)+MOXA_MUST_RBRTI_REGISTER);   \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
-
-#define SET_MOXA_MUST_THRTL_VALUE(baseio, Value) {     \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
-       outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_BANK_MASK;      \
-       __efr |= MOXA_MUST_EFR_BANK1;   \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
-       outb((u8)(Value), (baseio)+MOXA_MUST_THRTL_REGISTER);   \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
-
-//#define MOXA_MUST_RBRL_VALUE  4
-#define SET_MOXA_MUST_FIFO_VALUE(info) {       \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((info)->ioaddr+UART_LCR);        \
-       outb(MOXA_MUST_ENTER_ENCHANCE, (info)->ioaddr+UART_LCR);        \
+#define SET_MOXA_MUST_FIFO_VALUE(info) do {                    \
+       u8      __oldlcr, __efr;                                \
+       __oldlcr = inb((info)->ioaddr+UART_LCR);                \
+       outb(MOXA_MUST_ENTER_ENCHANCE, (info)->ioaddr+UART_LCR);\
        __efr = inb((info)->ioaddr+MOXA_MUST_EFR_REGISTER);     \
-       __efr &= ~MOXA_MUST_EFR_BANK_MASK;      \
-       __efr |= MOXA_MUST_EFR_BANK1;   \
+       __efr &= ~MOXA_MUST_EFR_BANK_MASK;                      \
+       __efr |= MOXA_MUST_EFR_BANK1;                           \
        outb(__efr, (info)->ioaddr+MOXA_MUST_EFR_REGISTER);     \
-       outb((u8)((info)->rx_high_water), (info)->ioaddr+MOXA_MUST_RBRTH_REGISTER);     \
-       outb((u8)((info)->rx_trigger), (info)->ioaddr+MOXA_MUST_RBRTI_REGISTER);        \
-       outb((u8)((info)->rx_low_water), (info)->ioaddr+MOXA_MUST_RBRTL_REGISTER);      \
-       outb(__oldlcr, (info)->ioaddr+UART_LCR);        \
-}
-
-
-
-#define SET_MOXA_MUST_ENUM_VALUE(baseio, Value) {      \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
+       outb((u8)((info)->rx_high_water), (info)->ioaddr+       \
+                       MOXA_MUST_RBRTH_REGISTER);              \
+       outb((u8)((info)->rx_trigger), (info)->ioaddr+          \
+                       MOXA_MUST_RBRTI_REGISTER);              \
+       outb((u8)((info)->rx_low_water), (info)->ioaddr+        \
+                       MOXA_MUST_RBRTL_REGISTER);              \
+       outb(__oldlcr, (info)->ioaddr+UART_LCR);                \
+} while (0)
+
+#define SET_MOXA_MUST_ENUM_VALUE(baseio, Value) do {           \
+       u8      __oldlcr, __efr;                                \
+       __oldlcr = inb((baseio)+UART_LCR);                      \
        outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_BANK_MASK;      \
-       __efr |= MOXA_MUST_EFR_BANK2;   \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
+       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);           \
+       __efr &= ~MOXA_MUST_EFR_BANK_MASK;                      \
+       __efr |= MOXA_MUST_EFR_BANK2;                           \
+       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);           \
        outb((u8)(Value), (baseio)+MOXA_MUST_ENUM_REGISTER);    \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
+       outb(__oldlcr, (baseio)+UART_LCR);                      \
+} while (0)
 
-#define GET_MOXA_MUST_HARDWARE_ID(baseio, pId) {       \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
-       outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_BANK_MASK;      \
-       __efr |= MOXA_MUST_EFR_BANK2;   \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
-       *pId = inb((baseio)+MOXA_MUST_HWID_REGISTER);   \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
-
-#define SET_MOXA_MUST_NO_SOFTWARE_FLOW_CONTROL(baseio) {       \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
-       outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_SF_MASK;        \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
-
-#define SET_MOXA_MUST_JUST_TX_SOFTWARE_FLOW_CONTROL(baseio) {  \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
+#define GET_MOXA_MUST_HARDWARE_ID(baseio, pId) do {            \
+       u8      __oldlcr, __efr;                                \
+       __oldlcr = inb((baseio)+UART_LCR);                      \
        outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_SF_MASK;        \
-       __efr |= MOXA_MUST_EFR_SF_TX1;  \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
-
-#define ENABLE_MOXA_MUST_TX_SOFTWARE_FLOW_CONTROL(baseio) {    \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
+       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);           \
+       __efr &= ~MOXA_MUST_EFR_BANK_MASK;                      \
+       __efr |= MOXA_MUST_EFR_BANK2;                           \
+       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);           \
+       *pId = inb((baseio)+MOXA_MUST_HWID_REGISTER);           \
+       outb(__oldlcr, (baseio)+UART_LCR);                      \
+} while (0)
+
+#define SET_MOXA_MUST_NO_SOFTWARE_FLOW_CONTROL(baseio) do {    \
+       u8      __oldlcr, __efr;                                \
+       __oldlcr = inb((baseio)+UART_LCR);                      \
        outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_SF_TX_MASK;     \
-       __efr |= MOXA_MUST_EFR_SF_TX1;  \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
-
-#define DISABLE_MOXA_MUST_TX_SOFTWARE_FLOW_CONTROL(baseio) {   \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
+       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);           \
+       __efr &= ~MOXA_MUST_EFR_SF_MASK;                        \
+       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);           \
+       outb(__oldlcr, (baseio)+UART_LCR);                      \
+} while (0)
+
+#define ENABLE_MOXA_MUST_TX_SOFTWARE_FLOW_CONTROL(baseio) do { \
+       u8      __oldlcr, __efr;                                \
+       __oldlcr = inb((baseio)+UART_LCR);                      \
        outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_SF_TX_MASK;     \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
-
-#define SET_MOXA_MUST_JUST_RX_SOFTWARE_FLOW_CONTROL(baseio) {  \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
+       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);           \
+       __efr &= ~MOXA_MUST_EFR_SF_TX_MASK;                     \
+       __efr |= MOXA_MUST_EFR_SF_TX1;                          \
+       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);           \
+       outb(__oldlcr, (baseio)+UART_LCR);                      \
+} while (0)
+
+#define DISABLE_MOXA_MUST_TX_SOFTWARE_FLOW_CONTROL(baseio) do {        \
+       u8      __oldlcr, __efr;                                \
+       __oldlcr = inb((baseio)+UART_LCR);                      \
        outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_SF_MASK;        \
-       __efr |= MOXA_MUST_EFR_SF_RX1;  \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
-
-#define ENABLE_MOXA_MUST_RX_SOFTWARE_FLOW_CONTROL(baseio) {    \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
+       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);           \
+       __efr &= ~MOXA_MUST_EFR_SF_TX_MASK;                     \
+       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);           \
+       outb(__oldlcr, (baseio)+UART_LCR);                      \
+} while (0)
+
+#define ENABLE_MOXA_MUST_RX_SOFTWARE_FLOW_CONTROL(baseio) do { \
+       u8      __oldlcr, __efr;                                \
+       __oldlcr = inb((baseio)+UART_LCR);                      \
        outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_SF_RX_MASK;     \
-       __efr |= MOXA_MUST_EFR_SF_RX1;  \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
-
-#define DISABLE_MOXA_MUST_RX_SOFTWARE_FLOW_CONTROL(baseio) {   \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
+       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);           \
+       __efr &= ~MOXA_MUST_EFR_SF_RX_MASK;                     \
+       __efr |= MOXA_MUST_EFR_SF_RX1;                          \
+       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);           \
+       outb(__oldlcr, (baseio)+UART_LCR);                      \
+} while (0)
+
+#define DISABLE_MOXA_MUST_RX_SOFTWARE_FLOW_CONTROL(baseio) do {        \
+       u8      __oldlcr, __efr;                                \
+       __oldlcr = inb((baseio)+UART_LCR);                      \
        outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_SF_RX_MASK;     \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
-
-#define ENABLE_MOXA_MUST_TX_RX_SOFTWARE_FLOW_CONTROL(baseio) { \
-       u8      __oldlcr, __efr;        \
-       __oldlcr = inb((baseio)+UART_LCR);      \
-       outb(MOXA_MUST_ENTER_ENCHANCE, (baseio)+UART_LCR);      \
-       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);   \
-       __efr &= ~MOXA_MUST_EFR_SF_MASK;        \
-       __efr |= (MOXA_MUST_EFR_SF_RX1|MOXA_MUST_EFR_SF_TX1);   \
-       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);   \
-       outb(__oldlcr, (baseio)+UART_LCR);      \
-}
-
-#define ENABLE_MOXA_MUST_XON_ANY_FLOW_CONTROL(baseio) {        \
-       u8      __oldmcr;       \
-       __oldmcr = inb((baseio)+UART_MCR);      \
-       __oldmcr |= MOXA_MUST_MCR_XON_ANY;      \
-       outb(__oldmcr, (baseio)+UART_MCR);      \
-}
-
-#define DISABLE_MOXA_MUST_XON_ANY_FLOW_CONTROL(baseio) {       \
-       u8      __oldmcr;       \
-       __oldmcr = inb((baseio)+UART_MCR);      \
-       __oldmcr &= ~MOXA_MUST_MCR_XON_ANY;     \
-       outb(__oldmcr, (baseio)+UART_MCR);      \
-}
-
-#define READ_MOXA_MUST_GDL(baseio)     inb((baseio)+MOXA_MUST_GDL_REGISTER)
-
-
-#ifndef INIT_WORK
-#define INIT_WORK(_work, _func, _data){        \
-       _data->tqueue.routine = _func;\
-       _data->tqueue.data = _data;\
-       }
-#endif
+       __efr = inb((baseio)+MOXA_MUST_EFR_REGISTER);           \
+       __efr &= ~MOXA_MUST_EFR_SF_RX_MASK;                     \
+       outb(__efr, (baseio)+MOXA_MUST_EFR_REGISTER);           \
+       outb(__oldlcr, (baseio)+UART_LCR);                      \
+} while (0)
 
 #endif
index dc6d4184145769b403122715154aa7470886ea00..65f2d3a96b85dd80e9400e9c730482596f009e9f 100644 (file)
 #include <linux/slab.h>
 #include <linux/tty.h>
 #include <linux/errno.h>
-#include <linux/string.h>   /* used in new tty drivers */
-#include <linux/signal.h>   /* used in new tty drivers */
+#include <linux/string.h>      /* used in new tty drivers */
+#include <linux/signal.h>      /* used in new tty drivers */
 #include <linux/ioctl.h>
 #include <linux/n_r3964.h>
 #include <linux/poll.h>
 #include <linux/init.h>
 #include <asm/uaccess.h>
 
-
-//#define DEBUG_QUEUE
+/*#define DEBUG_QUEUE*/
 
 /* Log successful handshake and protocol operations  */
-//#define DEBUG_PROTO_S
+/*#define DEBUG_PROTO_S*/
 
 /* Log handshake and protocol errors: */
-//#define DEBUG_PROTO_E
+/*#define DEBUG_PROTO_E*/
 
 /* Log Linediscipline operations (open, close, read, write...): */
-//#define DEBUG_LDISC
+/*#define DEBUG_LDISC*/
 
 /* Log module and memory operations (init, cleanup; kmalloc, kfree): */
-//#define DEBUG_MODUL
+/*#define DEBUG_MODUL*/
 
 /* Macro helpers for debug output: */
-#define TRACE(format, args...) printk("r3964: " format "\n" , ## args);
+#define TRACE(format, args...) printk("r3964: " format "\n" , ## args)
 
 #ifdef DEBUG_MODUL
-#define TRACE_M(format, args...) printk("r3964: " format "\n" , ## args);
+#define TRACE_M(format, args...) printk("r3964: " format "\n" , ## args)
 #else
-#define TRACE_M(fmt, arg...) /**/
+#define TRACE_M(fmt, arg...) do {} while (0)
 #endif
-
 #ifdef DEBUG_PROTO_S
-#define TRACE_PS(format, args...) printk("r3964: " format "\n" , ## args);
+#define TRACE_PS(format, args...) printk("r3964: " format "\n" , ## args)
 #else
-#define TRACE_PS(fmt, arg...) /**/
+#define TRACE_PS(fmt, arg...) do {} while (0)
 #endif
-
 #ifdef DEBUG_PROTO_E
-#define TRACE_PE(format, args...) printk("r3964: " format "\n" , ## args);
+#define TRACE_PE(format, args...) printk("r3964: " format "\n" , ## args)
 #else
-#define TRACE_PE(fmt, arg...) /**/
+#define TRACE_PE(fmt, arg...) do {} while (0)
 #endif
-
 #ifdef DEBUG_LDISC
-#define TRACE_L(format, args...) printk("r3964: " format "\n" , ## args);
+#define TRACE_L(format, args...) printk("r3964: " format "\n" , ## args)
 #else
-#define TRACE_L(fmt, arg...) /**/
+#define TRACE_L(fmt, arg...) do {} while (0)
 #endif
-
 #ifdef DEBUG_QUEUE
-#define TRACE_Q(format, args...) printk("r3964: " format "\n" , ## args);
+#define TRACE_Q(format, args...) printk("r3964: " format "\n" , ## args)
 #else
-#define TRACE_Q(fmt, arg...) /**/
+#define TRACE_Q(fmt, arg...) do {} while (0)
 #endif
-
 static void add_tx_queue(struct r3964_info *, struct r3964_block_header *);
 static void remove_from_tx_queue(struct r3964_info *pInfo, int error_code);
 static void put_char(struct r3964_info *pInfo, unsigned char ch);
@@ -126,937 +120,830 @@ static void receive_char(struct r3964_info *pInfo, const unsigned char c);
 static void receive_error(struct r3964_info *pInfo, const char flag);
 static void on_timeout(unsigned long priv);
 static int enable_signals(struct r3964_info *pInfo, struct pid *pid, int arg);
-static int read_telegram(struct r3964_info *pInfo, struct pid *pid, unsigned char __user *buf);
+static int read_telegram(struct r3964_info *pInfo, struct pid *pid,
+               unsigned char __user * buf);
 static void add_msg(struct r3964_client_info *pClient, int msg_id, int arg,
-             int error_code, struct r3964_block_header *pBlock);
-static struct r3964_message* remove_msg(struct r3964_info *pInfo, 
-             struct r3964_client_info *pClient);
-static void remove_client_block(struct r3964_info *pInfo, 
-                struct r3964_client_info *pClient);
+               int error_code, struct r3964_block_header *pBlock);
+static struct r3964_message *remove_msg(struct r3964_info *pInfo,
+               struct r3964_client_info *pClient);
+static void remove_client_block(struct r3964_info *pInfo,
+               struct r3964_client_info *pClient);
 
-static int  r3964_open(struct tty_struct *tty);
+static int r3964_open(struct tty_struct *tty);
 static void r3964_close(struct tty_struct *tty);
 static ssize_t r3964_read(struct tty_struct *tty, struct file *file,
-                     unsigned char __user *buf, size_t nr);
-static ssize_t r3964_write(struct tty_struct * tty, struct file * file,
-                      const unsigned char * buf, size_t nr);
-static int r3964_ioctl(struct tty_struct * tty, struct file * file,
-                       unsigned int cmd, unsigned long arg);
-static void r3964_set_termios(struct tty_struct *tty, struct ktermios * old);
-static unsigned int r3964_poll(struct tty_struct * tty, struct file * file,
-                     struct poll_table_struct  *wait);
+               unsigned char __user * buf, size_t nr);
+static ssize_t r3964_write(struct tty_struct *tty, struct file *file,
+               const unsigned char *buf, size_t nr);
+static int r3964_ioctl(struct tty_struct *tty, struct file *file,
+               unsigned int cmd, unsigned long arg);
+static void r3964_set_termios(struct tty_struct *tty, struct ktermios *old);
+static unsigned int r3964_poll(struct tty_struct *tty, struct file *file,
+               struct poll_table_struct *wait);
 static void r3964_receive_buf(struct tty_struct *tty, const unsigned char *cp,
-                              char *fp, int count);
+               char *fp, int count);
 
 static struct tty_ldisc tty_ldisc_N_R3964 = {
-       .owner   = THIS_MODULE,
-       .magic  = TTY_LDISC_MAGIC, 
-       .name   = "R3964",
-       .open   = r3964_open,
-       .close  = r3964_close,
-       .read   = r3964_read,
-       .write  = r3964_write,
-       .ioctl  = r3964_ioctl,
+       .owner = THIS_MODULE,
+       .magic = TTY_LDISC_MAGIC,
+       .name = "R3964",
+       .open = r3964_open,
+       .close = r3964_close,
+       .read = r3964_read,
+       .write = r3964_write,
+       .ioctl = r3964_ioctl,
        .set_termios = r3964_set_termios,
-       .poll   = r3964_poll,            
+       .poll = r3964_poll,
        .receive_buf = r3964_receive_buf,
 };
 
-
-
 static void dump_block(const unsigned char *block, unsigned int length)
 {
-   unsigned int i,j;
-   char linebuf[16*3+1];
-   
-   for(i=0;i<length;i+=16)
-   {
-      for(j=0;(j<16) && (j+i<length);j++)
-      {
-         sprintf(linebuf+3*j,"%02x ",block[i+j]);
-      }
-      linebuf[3*j]='\0';
-      TRACE_PS("%s",linebuf);
-   }
+       unsigned int i, j;
+       char linebuf[16 * 3 + 1];
+
+       for (i = 0; i < length; i += 16) {
+               for (j = 0; (j < 16) && (j + i < length); j++) {
+                       sprintf(linebuf + 3 * j, "%02x ", block[i + j]);
+               }
+               linebuf[3 * j] = '\0';
+               TRACE_PS("%s", linebuf);
+       }
 }
 
-         
-
-
 /*************************************************************
  * Driver initialisation
  *************************************************************/
 
-
 /*************************************************************
  * Module support routines
  *************************************************************/
 
 static void __exit r3964_exit(void)
 {
-   int status;
-   
-   TRACE_M ("cleanup_module()");
-
-   status=tty_unregister_ldisc(N_R3964);
-   
-   if(status!=0)
-   {
-      printk(KERN_ERR "r3964: error unregistering linediscipline: %d\n", status);
-   }
-   else
-   {
-      TRACE_L("linediscipline successfully unregistered");
-   }
-   
+       int status;
+
+       TRACE_M("cleanup_module()");
+
+       status = tty_unregister_ldisc(N_R3964);
+
+       if (status != 0) {
+               printk(KERN_ERR "r3964: error unregistering linediscipline: "
+                               "%d\n", status);
+       } else {
+               TRACE_L("linediscipline successfully unregistered");
+       }
 }
 
 static int __init r3964_init(void)
 {
-   int status;
-   
-   printk ("r3964: Philips r3964 Driver $Revision: 1.10 $\n");
-
-   /*
-    * Register the tty line discipline
-    */
-   
-   status = tty_register_ldisc (N_R3964, &tty_ldisc_N_R3964);
-   if (status == 0)
-     {
-       TRACE_L("line discipline %d registered", N_R3964);
-       TRACE_L("flags=%x num=%x", tty_ldisc_N_R3964.flags, 
-               tty_ldisc_N_R3964.num);
-       TRACE_L("open=%p", tty_ldisc_N_R3964.open);
-       TRACE_L("tty_ldisc_N_R3964 = %p", &tty_ldisc_N_R3964);
-     }
-   else
-     {
-       printk (KERN_ERR "r3964: error registering line discipline: %d\n", status);
-     }
-   return status;
+       int status;
+
+       printk("r3964: Philips r3964 Driver $Revision: 1.10 $\n");
+
+       /*
+        * Register the tty line discipline
+        */
+
+       status = tty_register_ldisc(N_R3964, &tty_ldisc_N_R3964);
+       if (status == 0) {
+               TRACE_L("line discipline %d registered", N_R3964);
+               TRACE_L("flags=%x num=%x", tty_ldisc_N_R3964.flags,
+                       tty_ldisc_N_R3964.num);
+               TRACE_L("open=%p", tty_ldisc_N_R3964.open);
+               TRACE_L("tty_ldisc_N_R3964 = %p", &tty_ldisc_N_R3964);
+       } else {
+               printk(KERN_ERR "r3964: error registering line discipline: "
+                               "%d\n", status);
+       }
+       return status;
 }
 
 module_init(r3964_init);
 module_exit(r3964_exit);
 
-
 /*************************************************************
  * Protocol implementation routines
  *************************************************************/
 
-static void add_tx_queue(struct r3964_info *pInfo, struct r3964_block_header *pHeader)
+static void add_tx_queue(struct r3964_info *pInfo,
+                        struct r3964_block_header *pHeader)
 {
-   unsigned long flags;
-   
-   spin_lock_irqsave(&pInfo->lock, flags);
-
-   pHeader->next = NULL;
-
-   if(pInfo->tx_last == NULL)
-   {
-      pInfo->tx_first = pInfo->tx_last = pHeader;
-   }
-   else
-   {
-      pInfo->tx_last->next = pHeader;
-      pInfo->tx_last = pHeader;
-   }
-   
-   spin_unlock_irqrestore(&pInfo->lock, flags);
-
-   TRACE_Q("add_tx_queue %p, length %d, tx_first = %p", 
-          pHeader, pHeader->length, pInfo->tx_first );
+       unsigned long flags;
+
+       spin_lock_irqsave(&pInfo->lock, flags);
+
+       pHeader->next = NULL;
+
+       if (pInfo->tx_last == NULL) {
+               pInfo->tx_first = pInfo->tx_last = pHeader;
+       } else {
+               pInfo->tx_last->next = pHeader;
+               pInfo->tx_last = pHeader;
+       }
+
+       spin_unlock_irqrestore(&pInfo->lock, flags);
+
+       TRACE_Q("add_tx_queue %p, length %d, tx_first = %p",
+               pHeader, pHeader->length, pInfo->tx_first);
 }
 
 static void remove_from_tx_queue(struct r3964_info *pInfo, int error_code)
 {
-   struct r3964_block_header *pHeader;
-   unsigned long flags;
+       struct r3964_block_header *pHeader;
+       unsigned long flags;
 #ifdef DEBUG_QUEUE
-   struct r3964_block_header *pDump;
+       struct r3964_block_header *pDump;
 #endif
-   
-   pHeader = pInfo->tx_first;
 
-   if(pHeader==NULL)
-      return;
+       pHeader = pInfo->tx_first;
+
+       if (pHeader == NULL)
+               return;
 
 #ifdef DEBUG_QUEUE
-   printk("r3964: remove_from_tx_queue: %p, length %u - ",
-          pHeader, pHeader->length );
-   for(pDump=pHeader;pDump;pDump=pDump->next)
-        printk("%p ", pDump);
-   printk("\n");
+       printk("r3964: remove_from_tx_queue: %p, length %u - ",
+               pHeader, pHeader->length);
+       for (pDump = pHeader; pDump; pDump = pDump->next)
+               printk("%p ", pDump);
+       printk("\n");
 #endif
 
+       if (pHeader->owner) {
+               if (error_code) {
+                       add_msg(pHeader->owner, R3964_MSG_ACK, 0,
+                               error_code, NULL);
+               } else {
+                       add_msg(pHeader->owner, R3964_MSG_ACK, pHeader->length,
+                               error_code, NULL);
+               }
+               wake_up_interruptible(&pInfo->read_wait);
+       }
+
+       spin_lock_irqsave(&pInfo->lock, flags);
+
+       pInfo->tx_first = pHeader->next;
+       if (pInfo->tx_first == NULL) {
+               pInfo->tx_last = NULL;
+       }
+
+       spin_unlock_irqrestore(&pInfo->lock, flags);
+
+       kfree(pHeader);
+       TRACE_M("remove_from_tx_queue - kfree %p", pHeader);
 
-   if(pHeader->owner)
-   {
-      if(error_code)
-      {
-          add_msg(pHeader->owner, R3964_MSG_ACK, 0, 
-                  error_code, NULL);
-      }
-      else
-      {
-          add_msg(pHeader->owner, R3964_MSG_ACK, pHeader->length, 
-                  error_code, NULL);
-      }
-      wake_up_interruptible (&pInfo->read_wait);
-   }
-
-   spin_lock_irqsave(&pInfo->lock, flags);
-
-   pInfo->tx_first = pHeader->next;
-   if(pInfo->tx_first==NULL)
-   {
-      pInfo->tx_last = NULL;
-   }
-
-   spin_unlock_irqrestore(&pInfo->lock, flags);
-
-   kfree(pHeader);
-   TRACE_M("remove_from_tx_queue - kfree %p",pHeader);
-
-   TRACE_Q("remove_from_tx_queue: tx_first = %p, tx_last = %p",
-          pInfo->tx_first, pInfo->tx_last );
+       TRACE_Q("remove_from_tx_queue: tx_first = %p, tx_last = %p",
+               pInfo->tx_first, pInfo->tx_last);
 }
 
-static void add_rx_queue(struct r3964_info *pInfo, struct r3964_block_header *pHeader)
+static void add_rx_queue(struct r3964_info *pInfo,
+                        struct r3964_block_header *pHeader)
 {
-   unsigned long flags;
-   
-   spin_lock_irqsave(&pInfo->lock, flags);
-
-   pHeader->next = NULL;
-
-   if(pInfo->rx_last == NULL)
-   {
-      pInfo->rx_first = pInfo->rx_last = pHeader;
-   }
-   else
-   {
-      pInfo->rx_last->next = pHeader;
-      pInfo->rx_last = pHeader;
-   }
-   pInfo->blocks_in_rx_queue++;
-   
-   spin_unlock_irqrestore(&pInfo->lock, flags);
-
-   TRACE_Q("add_rx_queue: %p, length = %d, rx_first = %p, count = %d",
-          pHeader, pHeader->length,
-          pInfo->rx_first, pInfo->blocks_in_rx_queue);
+       unsigned long flags;
+
+       spin_lock_irqsave(&pInfo->lock, flags);
+
+       pHeader->next = NULL;
+
+       if (pInfo->rx_last == NULL) {
+               pInfo->rx_first = pInfo->rx_last = pHeader;
+       } else {
+               pInfo->rx_last->next = pHeader;
+               pInfo->rx_last = pHeader;
+       }
+       pInfo->blocks_in_rx_queue++;
+
+       spin_unlock_irqrestore(&pInfo->lock, flags);
+
+       TRACE_Q("add_rx_queue: %p, length = %d, rx_first = %p, count = %d",
+               pHeader, pHeader->length,
+               pInfo->rx_first, pInfo->blocks_in_rx_queue);
 }
 
 static void remove_from_rx_queue(struct r3964_info *pInfo,
-                 struct r3964_block_header *pHeader)
+                                struct r3964_block_header *pHeader)
 {
-   unsigned long flags;
-   struct r3964_block_header *pFind;
-   
-   if(pHeader==NULL)
-      return;
-
-   TRACE_Q("remove_from_rx_queue: rx_first = %p, rx_last = %p, count = %d",
-          pInfo->rx_first, pInfo->rx_last, pInfo->blocks_in_rx_queue );
-   TRACE_Q("remove_from_rx_queue: %p, length %u",
-          pHeader, pHeader->length );
-
-   spin_lock_irqsave(&pInfo->lock, flags);
-
-   if(pInfo->rx_first == pHeader)
-   {
-      /* Remove the first block in the linked list: */
-      pInfo->rx_first = pHeader->next;
-      
-      if(pInfo->rx_first==NULL)
-      {
-         pInfo->rx_last = NULL;
-      }
-      pInfo->blocks_in_rx_queue--;
-   }
-   else 
-   {
-      /* Find block to remove: */
-      for(pFind=pInfo->rx_first; pFind; pFind=pFind->next)
-      {
-         if(pFind->next == pHeader) 
-         {
-            /* Got it. */
-            pFind->next = pHeader->next;
-            pInfo->blocks_in_rx_queue--;
-            if(pFind->next==NULL)
-            {
-               /* Oh, removed the last one! */
-               pInfo->rx_last = pFind;
-            }
-            break;
-         }
-      }
-   }
-
-   spin_unlock_irqrestore(&pInfo->lock, flags);
-
-   kfree(pHeader);
-   TRACE_M("remove_from_rx_queue - kfree %p",pHeader);
-
-   TRACE_Q("remove_from_rx_queue: rx_first = %p, rx_last = %p, count = %d",
-          pInfo->rx_first, pInfo->rx_last, pInfo->blocks_in_rx_queue );
+       unsigned long flags;
+       struct r3964_block_header *pFind;
+
+       if (pHeader == NULL)
+               return;
+
+       TRACE_Q("remove_from_rx_queue: rx_first = %p, rx_last = %p, count = %d",
+               pInfo->rx_first, pInfo->rx_last, pInfo->blocks_in_rx_queue);
+       TRACE_Q("remove_from_rx_queue: %p, length %u",
+               pHeader, pHeader->length);
+
+       spin_lock_irqsave(&pInfo->lock, flags);
+
+       if (pInfo->rx_first == pHeader) {
+               /* Remove the first block in the linked list: */
+               pInfo->rx_first = pHeader->next;
+
+               if (pInfo->rx_first == NULL) {
+                       pInfo->rx_last = NULL;
+               }
+               pInfo->blocks_in_rx_queue--;
+       } else {
+               /* Find block to remove: */
+               for (pFind = pInfo->rx_first; pFind; pFind = pFind->next) {
+                       if (pFind->next == pHeader) {
+                               /* Got it. */
+                               pFind->next = pHeader->next;
+                               pInfo->blocks_in_rx_queue--;
+                               if (pFind->next == NULL) {
+                                       /* Oh, removed the last one! */
+                                       pInfo->rx_last = pFind;
+                               }
+                               break;
+                       }
+               }
+       }
+
+       spin_unlock_irqrestore(&pInfo->lock, flags);
+
+       kfree(pHeader);
+       TRACE_M("remove_from_rx_queue - kfree %p", pHeader);
+
+       TRACE_Q("remove_from_rx_queue: rx_first = %p, rx_last = %p, count = %d",
+               pInfo->rx_first, pInfo->rx_last, pInfo->blocks_in_rx_queue);
 }
 
 static void put_char(struct r3964_info *pInfo, unsigned char ch)
 {
-   struct tty_struct *tty = pInfo->tty;
+       struct tty_struct *tty = pInfo->tty;
 
-   if(tty==NULL)
-      return;
+       if (tty == NULL)
+               return;
 
-   if(tty->driver->put_char)
-   {
-      tty->driver->put_char(tty, ch);
-   }
-   pInfo->bcc ^= ch;
+       if (tty->driver->put_char) {
+               tty->driver->put_char(tty, ch);
+       }
+       pInfo->bcc ^= ch;
 }
 
 static void flush(struct r3964_info *pInfo)
 {
-   struct tty_struct *tty = pInfo->tty;
+       struct tty_struct *tty = pInfo->tty;
 
-   if(tty==NULL)
-      return;
+       if (tty == NULL)
+               return;
 
-   if(tty->driver->flush_chars)
-   {
-      tty->driver->flush_chars(tty);
-   }
+       if (tty->driver->flush_chars) {
+               tty->driver->flush_chars(tty);
+       }
 }
 
 static void trigger_transmit(struct r3964_info *pInfo)
 {
-   unsigned long flags;
-   
+       unsigned long flags;
 
-   spin_lock_irqsave(&pInfo->lock, flags);
+       spin_lock_irqsave(&pInfo->lock, flags);
 
-   if((pInfo->state == R3964_IDLE) && (pInfo->tx_first!=NULL))
-   {
-      pInfo->state = R3964_TX_REQUEST;
-      pInfo->nRetry=0;
-      pInfo->flags &= ~R3964_ERROR;
-      mod_timer(&pInfo->tmr, jiffies + R3964_TO_QVZ);
+       if ((pInfo->state == R3964_IDLE) && (pInfo->tx_first != NULL)) {
+               pInfo->state = R3964_TX_REQUEST;
+               pInfo->nRetry = 0;
+               pInfo->flags &= ~R3964_ERROR;
+               mod_timer(&pInfo->tmr, jiffies + R3964_TO_QVZ);
 
-      spin_unlock_irqrestore(&pInfo->lock, flags);
+               spin_unlock_irqrestore(&pInfo->lock, flags);
 
-      TRACE_PS("trigger_transmit - sent STX");
+               TRACE_PS("trigger_transmit - sent STX");
 
-      put_char(pInfo, STX);
-      flush(pInfo);
+               put_char(pInfo, STX);
+               flush(pInfo);
 
-      pInfo->bcc = 0;
-   }
-   else
-   {
-      spin_unlock_irqrestore(&pInfo->lock, flags);
-   }
+               pInfo->bcc = 0;
+       } else {
+               spin_unlock_irqrestore(&pInfo->lock, flags);
+       }
 }
 
 static void retry_transmit(struct r3964_info *pInfo)
 {
-   if(pInfo->nRetry<R3964_MAX_RETRIES)
-   {
-      TRACE_PE("transmission failed. Retry #%d", 
-             pInfo->nRetry);
-      pInfo->bcc = 0;
-      put_char(pInfo, STX);
-      flush(pInfo);
-      pInfo->state = R3964_TX_REQUEST;
-      pInfo->nRetry++;
-      mod_timer(&pInfo->tmr, jiffies + R3964_TO_QVZ);
-   }
-   else
-   {
-      TRACE_PE("transmission failed after %d retries", 
-             R3964_MAX_RETRIES);
-
-      remove_from_tx_queue(pInfo, R3964_TX_FAIL);
-      
-      put_char(pInfo, NAK);
-      flush(pInfo);
-      pInfo->state = R3964_IDLE;
-
-      trigger_transmit(pInfo);
-   }
+       if (pInfo->nRetry < R3964_MAX_RETRIES) {
+               TRACE_PE("transmission failed. Retry #%d", pInfo->nRetry);
+               pInfo->bcc = 0;
+               put_char(pInfo, STX);
+               flush(pInfo);
+               pInfo->state = R3964_TX_REQUEST;
+               pInfo->nRetry++;
+               mod_timer(&pInfo->tmr, jiffies + R3964_TO_QVZ);
+       } else {
+               TRACE_PE("transmission failed after %d retries",
+                        R3964_MAX_RETRIES);
+
+               remove_from_tx_queue(pInfo, R3964_TX_FAIL);
+
+               put_char(pInfo, NAK);
+               flush(pInfo);
+               pInfo->state = R3964_IDLE;
+
+               trigger_transmit(pInfo);
+       }
 }
 
-
 static void transmit_block(struct r3964_info *pInfo)
 {
-   struct tty_struct *tty = pInfo->tty;
-   struct r3964_block_header *pBlock = pInfo->tx_first;
-   int room=0;
-
-   if((tty==NULL) || (pBlock==NULL))
-   {
-      return;
-   }
-
-   if(tty->driver->write_room)
-      room=tty->driver->write_room(tty);
-
-   TRACE_PS("transmit_block %p, room %d, length %d", 
-          pBlock, room, pBlock->length);
-   
-   while(pInfo->tx_position < pBlock->length)
-   {
-      if(room<2)
-         break;
-      if(pBlock->data[pInfo->tx_position]==DLE)
-      {
-         /* send additional DLE char: */
-         put_char(pInfo, DLE);
-      }
-      put_char(pInfo, pBlock->data[pInfo->tx_position++]);
-      
-      room--;
-   }
-
-   if((pInfo->tx_position == pBlock->length) && (room>=3))
-   {
-      put_char(pInfo, DLE);
-      put_char(pInfo, ETX);
-      if(pInfo->flags & R3964_BCC)
-      {
-         put_char(pInfo, pInfo->bcc);
-      }
-      pInfo->state = R3964_WAIT_FOR_TX_ACK;
-      mod_timer(&pInfo->tmr, jiffies + R3964_TO_QVZ);
-   }
-   flush(pInfo);
+       struct tty_struct *tty = pInfo->tty;
+       struct r3964_block_header *pBlock = pInfo->tx_first;
+       int room = 0;
+
+       if ((tty == NULL) || (pBlock == NULL)) {
+               return;
+       }
+
+       if (tty->driver->write_room)
+               room = tty->driver->write_room(tty);
+
+       TRACE_PS("transmit_block %p, room %d, length %d",
+                pBlock, room, pBlock->length);
+
+       while (pInfo->tx_position < pBlock->length) {
+               if (room < 2)
+                       break;
+
+               if (pBlock->data[pInfo->tx_position] == DLE) {
+                       /* send additional DLE char: */
+                       put_char(pInfo, DLE);
+               }
+               put_char(pInfo, pBlock->data[pInfo->tx_position++]);
+
+               room--;
+       }
+
+       if ((pInfo->tx_position == pBlock->length) && (room >= 3)) {
+               put_char(pInfo, DLE);
+               put_char(pInfo, ETX);
+               if (pInfo->flags & R3964_BCC) {
+                       put_char(pInfo, pInfo->bcc);
+               }
+               pInfo->state = R3964_WAIT_FOR_TX_ACK;
+               mod_timer(&pInfo->tmr, jiffies + R3964_TO_QVZ);
+       }
+       flush(pInfo);
 }
 
 static void on_receive_block(struct r3964_info *pInfo)
 {
-   unsigned int length;
-   struct r3964_client_info *pClient;
-   struct r3964_block_header *pBlock;
-   
-   length=pInfo->rx_position;
-
-   /* compare byte checksum characters: */
-   if(pInfo->flags & R3964_BCC)
-   {
-      if(pInfo->bcc!=pInfo->last_rx)
-      {
-         TRACE_PE("checksum error - got %x but expected %x",
-                pInfo->last_rx, pInfo->bcc);
-         pInfo->flags |= R3964_CHECKSUM;
-      }
-   }
-
-   /* check for errors (parity, overrun,...): */
-   if(pInfo->flags & R3964_ERROR)
-   {
-      TRACE_PE("on_receive_block - transmission failed error %x",
-             pInfo->flags & R3964_ERROR);
-      
-      put_char(pInfo, NAK);
-      flush(pInfo);
-      if(pInfo->nRetry<R3964_MAX_RETRIES)
-      {
-         pInfo->state=R3964_WAIT_FOR_RX_REPEAT;
-         pInfo->nRetry++;
-        mod_timer(&pInfo->tmr, jiffies + R3964_TO_RX_PANIC);
-      }
-      else
-      {
-         TRACE_PE("on_receive_block - failed after max retries");
-         pInfo->state=R3964_IDLE;
-      }
-      return;
-   }
-
-   
-   /* received block; submit DLE: */
-   put_char(pInfo, DLE);
-   flush(pInfo);
-   del_timer_sync(&pInfo->tmr);
-   TRACE_PS(" rx success: got %d chars", length);
-
-   /* prepare struct r3964_block_header: */
-   pBlock = kmalloc(length+sizeof(struct r3964_block_header), GFP_KERNEL);
-   TRACE_M("on_receive_block - kmalloc %p",pBlock);
-
-   if(pBlock==NULL)
-      return;
-
-   pBlock->length = length;
-   pBlock->data   = ((unsigned char*)pBlock)+sizeof(struct r3964_block_header);
-   pBlock->locks  = 0;
-   pBlock->next   = NULL;
-   pBlock->owner  = NULL;
-
-   memcpy(pBlock->data, pInfo->rx_buf, length);
-
-   /* queue block into rx_queue: */
-   add_rx_queue(pInfo, pBlock);
-
-   /* notify attached client processes: */
-   for(pClient=pInfo->firstClient; pClient; pClient=pClient->next)
-   {
-      if(pClient->sig_flags & R3964_SIG_DATA)
-      {
-         add_msg(pClient, R3964_MSG_DATA, length, R3964_OK, pBlock);
-      }
-   }
-   wake_up_interruptible (&pInfo->read_wait);
-   
-   pInfo->state = R3964_IDLE;
-
-   trigger_transmit(pInfo);
-}
+       unsigned int length;
+       struct r3964_client_info *pClient;
+       struct r3964_block_header *pBlock;
+
+       length = pInfo->rx_position;
+
+       /* compare byte checksum characters: */
+       if (pInfo->flags & R3964_BCC) {
+               if (pInfo->bcc != pInfo->last_rx) {
+                       TRACE_PE("checksum error - got %x but expected %x",
+                                pInfo->last_rx, pInfo->bcc);
+                       pInfo->flags |= R3964_CHECKSUM;
+               }
+       }
+
+       /* check for errors (parity, overrun,...): */
+       if (pInfo->flags & R3964_ERROR) {
+               TRACE_PE("on_receive_block - transmission failed error %x",
+                        pInfo->flags & R3964_ERROR);
+
+               put_char(pInfo, NAK);
+               flush(pInfo);
+               if (pInfo->nRetry < R3964_MAX_RETRIES) {
+                       pInfo->state = R3964_WAIT_FOR_RX_REPEAT;
+                       pInfo->nRetry++;
+                       mod_timer(&pInfo->tmr, jiffies + R3964_TO_RX_PANIC);
+               } else {
+                       TRACE_PE("on_receive_block - failed after max retries");
+                       pInfo->state = R3964_IDLE;
+               }
+               return;
+       }
+
+       /* received block; submit DLE: */
+       put_char(pInfo, DLE);
+       flush(pInfo);
+       del_timer_sync(&pInfo->tmr);
+       TRACE_PS(" rx success: got %d chars", length);
+
+       /* prepare struct r3964_block_header: */
+       pBlock = kmalloc(length + sizeof(struct r3964_block_header),
+                       GFP_KERNEL);
+       TRACE_M("on_receive_block - kmalloc %p", pBlock);
+
+       if (pBlock == NULL)
+               return;
+
+       pBlock->length = length;
+       pBlock->data = ((unsigned char *)pBlock) +
+                       sizeof(struct r3964_block_header);
+       pBlock->locks = 0;
+       pBlock->next = NULL;
+       pBlock->owner = NULL;
+
+       memcpy(pBlock->data, pInfo->rx_buf, length);
+
+       /* queue block into rx_queue: */
+       add_rx_queue(pInfo, pBlock);
+
+       /* notify attached client processes: */
+       for (pClient = pInfo->firstClient; pClient; pClient = pClient->next) {
+               if (pClient->sig_flags & R3964_SIG_DATA) {
+                       add_msg(pClient, R3964_MSG_DATA, length, R3964_OK,
+                               pBlock);
+               }
+       }
+       wake_up_interruptible(&pInfo->read_wait);
 
+       pInfo->state = R3964_IDLE;
+
+       trigger_transmit(pInfo);
+}
 
 static void receive_char(struct r3964_info *pInfo, const unsigned char c)
 {
-   switch(pInfo->state)
-   {
-      case R3964_TX_REQUEST:
-         if(c==DLE)
-         {
-            TRACE_PS("TX_REQUEST - got DLE");
-
-            pInfo->state = R3964_TRANSMITTING;
-            pInfo->tx_position = 0;
-            
-            transmit_block(pInfo);
-         }
-         else if(c==STX)
-         {
-            if(pInfo->nRetry==0)
-            {
-               TRACE_PE("TX_REQUEST - init conflict");
-               if(pInfo->priority == R3964_SLAVE)
-               {
-                  goto start_receiving;
-               }
-            } 
-            else 
-            {
-               TRACE_PE("TX_REQUEST - secondary init conflict!?"
-                        " Switching to SLAVE mode for next rx.");
-               goto start_receiving;
-            }
-         }
-         else
-         {
-            TRACE_PE("TX_REQUEST - char != DLE: %x", c);
-            retry_transmit(pInfo);
-         }
-         break;
-      case R3964_TRANSMITTING:
-         if(c==NAK)
-         {
-            TRACE_PE("TRANSMITTING - got NAK");
-            retry_transmit(pInfo);
-         }
-         else
-         {
-            TRACE_PE("TRANSMITTING - got invalid char");
-            pInfo->state = R3964_WAIT_ZVZ_BEFORE_TX_RETRY;
-           mod_timer(&pInfo->tmr, jiffies + R3964_TO_ZVZ);
-         }
-         break;
-      case R3964_WAIT_FOR_TX_ACK:
-         if(c==DLE)
-         {
-            TRACE_PS("WAIT_FOR_TX_ACK - got DLE");
-            remove_from_tx_queue(pInfo, R3964_OK);
-            
-            pInfo->state = R3964_IDLE;
-            trigger_transmit(pInfo);
-         }
-         else
-         {
-            retry_transmit(pInfo);
-         }
-         break;
-      case R3964_WAIT_FOR_RX_REPEAT:
-         /* FALLTROUGH */
-      case R3964_IDLE:
-         if(c==STX)
-         {
-            /* Prevent rx_queue from overflow: */
-            if(pInfo->blocks_in_rx_queue >= R3964_MAX_BLOCKS_IN_RX_QUEUE)
-            {
-               TRACE_PE("IDLE - got STX but no space in rx_queue!");
-               pInfo->state=R3964_WAIT_FOR_RX_BUF;
-              mod_timer(&pInfo->tmr, jiffies + R3964_TO_NO_BUF);
-               break;
-            }
+       switch (pInfo->state) {
+       case R3964_TX_REQUEST:
+               if (c == DLE) {
+                       TRACE_PS("TX_REQUEST - got DLE");
+
+                       pInfo->state = R3964_TRANSMITTING;
+                       pInfo->tx_position = 0;
+
+                       transmit_block(pInfo);
+               } else if (c == STX) {
+                       if (pInfo->nRetry == 0) {
+                               TRACE_PE("TX_REQUEST - init conflict");
+                               if (pInfo->priority == R3964_SLAVE) {
+                                       goto start_receiving;
+                               }
+                       } else {
+                               TRACE_PE("TX_REQUEST - secondary init "
+                                       "conflict!? Switching to SLAVE mode "
+                                       "for next rx.");
+                               goto start_receiving;
+                       }
+               } else {
+                       TRACE_PE("TX_REQUEST - char != DLE: %x", c);
+                       retry_transmit(pInfo);
+               }
+               break;
+       case R3964_TRANSMITTING:
+               if (c == NAK) {
+                       TRACE_PE("TRANSMITTING - got NAK");
+                       retry_transmit(pInfo);
+               } else {
+                       TRACE_PE("TRANSMITTING - got invalid char");
+
+                       pInfo->state = R3964_WAIT_ZVZ_BEFORE_TX_RETRY;
+                       mod_timer(&pInfo->tmr, jiffies + R3964_TO_ZVZ);
+               }
+               break;
+       case R3964_WAIT_FOR_TX_ACK:
+               if (c == DLE) {
+                       TRACE_PS("WAIT_FOR_TX_ACK - got DLE");
+                       remove_from_tx_queue(pInfo, R3964_OK);
+
+                       pInfo->state = R3964_IDLE;
+                       trigger_transmit(pInfo);
+               } else {
+                       retry_transmit(pInfo);
+               }
+               break;
+       case R3964_WAIT_FOR_RX_REPEAT:
+               /* FALLTROUGH */
+       case R3964_IDLE:
+               if (c == STX) {
+                       /* Prevent rx_queue from overflow: */
+                       if (pInfo->blocks_in_rx_queue >=
+                           R3964_MAX_BLOCKS_IN_RX_QUEUE) {
+                               TRACE_PE("IDLE - got STX but no space in "
+                                               "rx_queue!");
+                               pInfo->state = R3964_WAIT_FOR_RX_BUF;
+                               mod_timer(&pInfo->tmr,
+                                         jiffies + R3964_TO_NO_BUF);
+                               break;
+                       }
 start_receiving:
-            /* Ok, start receiving: */
-            TRACE_PS("IDLE - got STX");
-            pInfo->rx_position = 0;
-            pInfo->last_rx = 0;
-            pInfo->flags &= ~R3964_ERROR;
-            pInfo->state=R3964_RECEIVING;
-           mod_timer(&pInfo->tmr, jiffies + R3964_TO_ZVZ);
-           pInfo->nRetry = 0;
-            put_char(pInfo, DLE);
-            flush(pInfo);
-            pInfo->bcc = 0;
-         }
-         break;
-      case R3964_RECEIVING:
-         if(pInfo->rx_position < RX_BUF_SIZE)
-         {
-            pInfo->bcc ^= c;
-            
-            if(c==DLE)
-            {
-               if(pInfo->last_rx==DLE)
-               {
-                  pInfo->last_rx = 0;
-                  goto char_to_buf;
-               }
-               pInfo->last_rx = DLE;
-               break;
-            } 
-            else if((c==ETX) && (pInfo->last_rx==DLE))
-            {
-               if(pInfo->flags & R3964_BCC)
-               {
-                  pInfo->state = R3964_WAIT_FOR_BCC;
-                 mod_timer(&pInfo->tmr, jiffies + R3964_TO_ZVZ);
-               }
-               else 
-               {
-                  on_receive_block(pInfo);
-               }
-            }
-            else
-            {
-               pInfo->last_rx = c;
+                       /* Ok, start receiving: */
+                       TRACE_PS("IDLE - got STX");
+                       pInfo->rx_position = 0;
+                       pInfo->last_rx = 0;
+                       pInfo->flags &= ~R3964_ERROR;
+                       pInfo->state = R3964_RECEIVING;
+                       mod_timer(&pInfo->tmr, jiffies + R3964_TO_ZVZ);
+                       pInfo->nRetry = 0;
+                       put_char(pInfo, DLE);
+                       flush(pInfo);
+                       pInfo->bcc = 0;
+               }
+               break;
+       case R3964_RECEIVING:
+               if (pInfo->rx_position < RX_BUF_SIZE) {
+                       pInfo->bcc ^= c;
+
+                       if (c == DLE) {
+                               if (pInfo->last_rx == DLE) {
+                                       pInfo->last_rx = 0;
+                                       goto char_to_buf;
+                               }
+                               pInfo->last_rx = DLE;
+                               break;
+                       } else if ((c == ETX) && (pInfo->last_rx == DLE)) {
+                               if (pInfo->flags & R3964_BCC) {
+                                       pInfo->state = R3964_WAIT_FOR_BCC;
+                                       mod_timer(&pInfo->tmr,
+                                                 jiffies + R3964_TO_ZVZ);
+                               } else {
+                                       on_receive_block(pInfo);
+                               }
+                       } else {
+                               pInfo->last_rx = c;
 char_to_buf:
-               pInfo->rx_buf[pInfo->rx_position++] = c;
-              mod_timer(&pInfo->tmr, jiffies + R3964_TO_ZVZ);
-            }
-         }
-        /* else: overflow-msg? BUF_SIZE>MTU; should not happen? */ 
-         break;
-      case R3964_WAIT_FOR_BCC:
-         pInfo->last_rx = c;
-         on_receive_block(pInfo);
-         break;
-   }
+                               pInfo->rx_buf[pInfo->rx_position++] = c;
+                               mod_timer(&pInfo->tmr, jiffies + R3964_TO_ZVZ);
+                       }
+               }
+               /* else: overflow-msg? BUF_SIZE>MTU; should not happen? */
+               break;
+       case R3964_WAIT_FOR_BCC:
+               pInfo->last_rx = c;
+               on_receive_block(pInfo);
+               break;
+       }
 }
 
 static void receive_error(struct r3964_info *pInfo, const char flag)
 {
-    switch (flag) 
-    {
-    case TTY_NORMAL:
-        break;
-    case TTY_BREAK:
-        TRACE_PE("received break")
-        pInfo->flags |= R3964_BREAK;
-        break;
-    case TTY_PARITY:
-        TRACE_PE("parity error")
-        pInfo->flags |= R3964_PARITY;
-        break;
-    case TTY_FRAME:
-        TRACE_PE("frame error")
-        pInfo->flags |= R3964_FRAME;
-        break;
-    case TTY_OVERRUN:
-        TRACE_PE("frame overrun")
-        pInfo->flags |= R3964_OVERRUN;
-        break;
-    default:
-        TRACE_PE("receive_error - unknown flag %d", flag);
-        pInfo->flags |= R3964_UNKNOWN;
-        break;
-    }
+       switch (flag) {
+       case TTY_NORMAL:
+               break;
+       case TTY_BREAK:
+               TRACE_PE("received break");
+               pInfo->flags |= R3964_BREAK;
+               break;
+       case TTY_PARITY:
+               TRACE_PE("parity error");
+               pInfo->flags |= R3964_PARITY;
+               break;
+       case TTY_FRAME:
+               TRACE_PE("frame error");
+               pInfo->flags |= R3964_FRAME;
+               break;
+       case TTY_OVERRUN:
+               TRACE_PE("frame overrun");
+               pInfo->flags |= R3964_OVERRUN;
+               break;
+       default:
+               TRACE_PE("receive_error - unknown flag %d", flag);
+               pInfo->flags |= R3964_UNKNOWN;
+               break;
+       }
 }
 
 static void on_timeout(unsigned long priv)
 {
-   struct r3964_info *pInfo = (void *)priv;
-
-   switch(pInfo->state)
-   {
-      case R3964_TX_REQUEST:
-         TRACE_PE("TX_REQUEST - timeout");
-         retry_transmit(pInfo);
-         break;
-      case R3964_WAIT_ZVZ_BEFORE_TX_RETRY:
-         put_char(pInfo, NAK);
-         flush(pInfo);
-         retry_transmit(pInfo);
-         break;
-      case R3964_WAIT_FOR_TX_ACK:
-         TRACE_PE("WAIT_FOR_TX_ACK - timeout");
-         retry_transmit(pInfo);
-         break;
-      case R3964_WAIT_FOR_RX_BUF:
-         TRACE_PE("WAIT_FOR_RX_BUF - timeout");
-         put_char(pInfo, NAK);
-         flush(pInfo);
-         pInfo->state=R3964_IDLE;
-         break;
-      case R3964_RECEIVING:
-         TRACE_PE("RECEIVING - timeout after %d chars", 
-                  pInfo->rx_position);
-         put_char(pInfo, NAK);
-         flush(pInfo);
-         pInfo->state=R3964_IDLE;
-         break;
-      case R3964_WAIT_FOR_RX_REPEAT:
-         TRACE_PE("WAIT_FOR_RX_REPEAT - timeout");
-         pInfo->state=R3964_IDLE;
-         break;
-      case R3964_WAIT_FOR_BCC:
-         TRACE_PE("WAIT_FOR_BCC - timeout");
-         put_char(pInfo, NAK);
-         flush(pInfo);
-         pInfo->state=R3964_IDLE;
-         break;
-   }
+       struct r3964_info *pInfo = (void *)priv;
+
+       switch (pInfo->state) {
+       case R3964_TX_REQUEST:
+               TRACE_PE("TX_REQUEST - timeout");
+               retry_transmit(pInfo);
+               break;
+       case R3964_WAIT_ZVZ_BEFORE_TX_RETRY:
+               put_char(pInfo, NAK);
+               flush(pInfo);
+               retry_transmit(pInfo);
+               break;
+       case R3964_WAIT_FOR_TX_ACK:
+               TRACE_PE("WAIT_FOR_TX_ACK - timeout");
+               retry_transmit(pInfo);
+               break;
+       case R3964_WAIT_FOR_RX_BUF:
+               TRACE_PE("WAIT_FOR_RX_BUF - timeout");
+               put_char(pInfo, NAK);
+               flush(pInfo);
+               pInfo->state = R3964_IDLE;
+               break;
+       case R3964_RECEIVING:
+               TRACE_PE("RECEIVING - timeout after %d chars",
+                        pInfo->rx_position);
+               put_char(pInfo, NAK);
+               flush(pInfo);
+               pInfo->state = R3964_IDLE;
+               break;
+       case R3964_WAIT_FOR_RX_REPEAT:
+               TRACE_PE("WAIT_FOR_RX_REPEAT - timeout");
+               pInfo->state = R3964_IDLE;
+               break;
+       case R3964_WAIT_FOR_BCC:
+               TRACE_PE("WAIT_FOR_BCC - timeout");
+               put_char(pInfo, NAK);
+               flush(pInfo);
+               pInfo->state = R3964_IDLE;
+               break;
+       }
 }
 
-static struct r3964_client_info *findClient(
-  struct r3964_info *pInfo, struct pid *pid)
+static struct r3964_client_info *findClient(struct r3964_info *pInfo,
+               struct pid *pid)
 {
-   struct r3964_client_info *pClient;
-   
-   for(pClient=pInfo->firstClient; pClient; pClient=pClient->next)
-   {
-      if(pClient->pid == pid)
-      {
-         return pClient;
-      }
-   }
-   return NULL;
+       struct r3964_client_info *pClient;
+
+       for (pClient = pInfo->firstClient; pClient; pClient = pClient->next) {
+               if (pClient->pid == pid) {
+                       return pClient;
+               }
+       }
+       return NULL;
 }
 
 static int enable_signals(struct r3964_info *pInfo, struct pid *pid, int arg)
 {
-   struct r3964_client_info *pClient;
-   struct r3964_client_info **ppClient;
-   struct r3964_message *pMsg;
-   
-   if((arg & R3964_SIG_ALL)==0)
-   {
-      /* Remove client from client list */
-      for(ppClient=&pInfo->firstClient; *ppClient; ppClient=&(*ppClient)->next)
-      {
-         pClient = *ppClient;
-         
-         if(pClient->pid == pid)
-         {
-            TRACE_PS("removing client %d from client list", pid_nr(pid));
-            *ppClient = pClient->next;
-            while(pClient->msg_count)
-            {
-               pMsg=remove_msg(pInfo, pClient);
-               if(pMsg)
-               {
-                  kfree(pMsg);
-                  TRACE_M("enable_signals - msg kfree %p",pMsg);
-               }
-            }
-           put_pid(pClient->pid);
-            kfree(pClient);
-            TRACE_M("enable_signals - kfree %p",pClient);
-            return 0;
-         }
-      }
-      return -EINVAL;
-   }
-   else
-   {
-      pClient=findClient(pInfo, pid);
-      if(pClient)
-      {
-         /* update signal options */
-         pClient->sig_flags=arg;
-      } 
-      else 
-      {
-         /* add client to client list */
-         pClient=kmalloc(sizeof(struct r3964_client_info), GFP_KERNEL);
-         TRACE_M("enable_signals - kmalloc %p",pClient);
-         if(pClient==NULL)
-            return -ENOMEM;
-
-         TRACE_PS("add client %d to client list", pid_nr(pid));
-        spin_lock_init(&pClient->lock);
-         pClient->sig_flags=arg;
-         pClient->pid = get_pid(pid);
-         pClient->next=pInfo->firstClient;
-         pClient->first_msg = NULL;
-         pClient->last_msg = NULL;
-         pClient->next_block_to_read = NULL;
-         pClient->msg_count = 0;
-         pInfo->firstClient=pClient;
-      }
-   }
-
-   return 0;
+       struct r3964_client_info *pClient;
+       struct r3964_client_info **ppClient;
+       struct r3964_message *pMsg;
+
+       if ((arg & R3964_SIG_ALL) == 0) {
+               /* Remove client from client list */
+               for (ppClient = &pInfo->firstClient; *ppClient;
+                    ppClient = &(*ppClient)->next) {
+                       pClient = *ppClient;
+
+                       if (pClient->pid == pid) {
+                               TRACE_PS("removing client %d from client list",
+                                        pid_nr(pid));
+                               *ppClient = pClient->next;
+                               while (pClient->msg_count) {
+                                       pMsg = remove_msg(pInfo, pClient);
+                                       if (pMsg) {
+                                               kfree(pMsg);
+                                               TRACE_M("enable_signals - msg "
+                                                       "kfree %p", pMsg);
+                                       }
+                               }
+                               put_pid(pClient->pid);
+                               kfree(pClient);
+                               TRACE_M("enable_signals - kfree %p", pClient);
+                               return 0;
+                       }
+               }
+               return -EINVAL;
+       } else {
+               pClient = findClient(pInfo, pid);
+               if (pClient) {
+                       /* update signal options */
+                       pClient->sig_flags = arg;
+               } else {
+                       /* add client to client list */
+                       pClient = kmalloc(sizeof(struct r3964_client_info),
+                                       GFP_KERNEL);
+                       TRACE_M("enable_signals - kmalloc %p", pClient);
+                       if (pClient == NULL)
+                               return -ENOMEM;
+
+                       TRACE_PS("add client %d to client list", pid_nr(pid));
+                       spin_lock_init(&pClient->lock);
+                       pClient->sig_flags = arg;
+                       pClient->pid = get_pid(pid);
+                       pClient->next = pInfo->firstClient;
+                       pClient->first_msg = NULL;
+                       pClient->last_msg = NULL;
+                       pClient->next_block_to_read = NULL;
+                       pClient->msg_count = 0;
+                       pInfo->firstClient = pClient;
+               }
+       }
+
+       return 0;
 }
 
-static int read_telegram(struct r3964_info *pInfo, struct pid *pid, unsigned char __user *buf)
+static int read_telegram(struct r3964_info *pInfo, struct pid *pid,
+                        unsigned char __user * buf)
 {
-    struct r3964_client_info *pClient;
-    struct r3964_block_header *block;
-
-    if(!buf)
-    {
-        return -EINVAL;
-    }
-
-    pClient=findClient(pInfo,pid);
-    if(pClient==NULL)
-    {
-       return -EINVAL;
-    }
-    
-    block=pClient->next_block_to_read;
-    if(!block)
-    {
-       return 0;
-    }
-    else
-    {
-      if (copy_to_user (buf, block->data, block->length))
-       return -EFAULT;
-
-       remove_client_block(pInfo, pClient);
-       return block->length;
-    }
-
-    return -EINVAL;
+       struct r3964_client_info *pClient;
+       struct r3964_block_header *block;
+
+       if (!buf) {
+               return -EINVAL;
+       }
+
+       pClient = findClient(pInfo, pid);
+       if (pClient == NULL) {
+               return -EINVAL;
+       }
+
+       block = pClient->next_block_to_read;
+       if (!block) {
+               return 0;
+       } else {
+               if (copy_to_user(buf, block->data, block->length))
+                       return -EFAULT;
+
+               remove_client_block(pInfo, pClient);
+               return block->length;
+       }
+
+       return -EINVAL;
 }
 
 static void add_msg(struct r3964_client_info *pClient, int msg_id, int arg,
-             int error_code, struct r3964_block_header *pBlock)
+               int error_code, struct r3964_block_header *pBlock)
 {
-   struct r3964_message *pMsg;
-   unsigned long flags;
-   
-   if(pClient->msg_count<R3964_MAX_MSG_COUNT-1)
-   {
+       struct r3964_message *pMsg;
+       unsigned long flags;
+
+       if (pClient->msg_count < R3964_MAX_MSG_COUNT - 1) {
 queue_the_message:
 
-      pMsg = kmalloc(sizeof(struct r3964_message),
-                    error_code?GFP_ATOMIC:GFP_KERNEL);
-      TRACE_M("add_msg - kmalloc %p",pMsg);
-      if(pMsg==NULL) {
-         return;
-      }
-
-      spin_lock_irqsave(&pClient->lock, flags);
-
-      pMsg->msg_id = msg_id;
-      pMsg->arg    = arg;
-      pMsg->error_code = error_code;
-      pMsg->block  = pBlock;
-      pMsg->next   = NULL;
-      
-      if(pClient->last_msg==NULL)
-      {
-         pClient->first_msg=pClient->last_msg=pMsg;
-      }
-      else
-      {
-         pClient->last_msg->next = pMsg;
-         pClient->last_msg=pMsg;
-      }
-
-      pClient->msg_count++;
-
-      if(pBlock!=NULL)
-      {
-         pBlock->locks++;
-      }
-      spin_unlock_irqrestore(&pClient->lock, flags);
-   }
-   else
-   {
-      if((pClient->last_msg->msg_id == R3964_MSG_ACK)
-                && (pClient->last_msg->error_code==R3964_OVERFLOW))
-      {
-         pClient->last_msg->arg++;
-                TRACE_PE("add_msg - inc prev OVERFLOW-msg");
-      }
-      else
-      {
-         msg_id = R3964_MSG_ACK;
-         arg = 0;
-                error_code = R3964_OVERFLOW;
-         pBlock = NULL;
-                TRACE_PE("add_msg - queue OVERFLOW-msg");
-         goto queue_the_message;
-      }
-   }
-   /* Send SIGIO signal to client process: */
-   if(pClient->sig_flags & R3964_USE_SIGIO)
-   {
-      kill_pid(pClient->pid, SIGIO, 1);
-   }
+               pMsg = kmalloc(sizeof(struct r3964_message),
+                               error_code ? GFP_ATOMIC : GFP_KERNEL);
+               TRACE_M("add_msg - kmalloc %p", pMsg);
+               if (pMsg == NULL) {
+                       return;
+               }
+
+               spin_lock_irqsave(&pClient->lock, flags);
+
+               pMsg->msg_id = msg_id;
+               pMsg->arg = arg;
+               pMsg->error_code = error_code;
+               pMsg->block = pBlock;
+               pMsg->next = NULL;
+
+               if (pClient->last_msg == NULL) {
+                       pClient->first_msg = pClient->last_msg = pMsg;
+               } else {
+                       pClient->last_msg->next = pMsg;
+                       pClient->last_msg = pMsg;
+               }
+
+               pClient->msg_count++;
+
+               if (pBlock != NULL) {
+                       pBlock->locks++;
+               }
+               spin_unlock_irqrestore(&pClient->lock, flags);
+       } else {
+               if ((pClient->last_msg->msg_id == R3964_MSG_ACK)
+                   && (pClient->last_msg->error_code == R3964_OVERFLOW)) {
+                       pClient->last_msg->arg++;
+                       TRACE_PE("add_msg - inc prev OVERFLOW-msg");
+               } else {
+                       msg_id = R3964_MSG_ACK;
+                       arg = 0;
+                       error_code = R3964_OVERFLOW;
+                       pBlock = NULL;
+                       TRACE_PE("add_msg - queue OVERFLOW-msg");
+                       goto queue_the_message;
+               }
+       }
+       /* Send SIGIO signal to client process: */
+       if (pClient->sig_flags & R3964_USE_SIGIO) {
+               kill_pid(pClient->pid, SIGIO, 1);
+       }
 }
 
 static struct r3964_message *remove_msg(struct r3964_info *pInfo,
-                       struct r3964_client_info *pClient)
+                                       struct r3964_client_info *pClient)
 {
-   struct r3964_message *pMsg=NULL;
-   unsigned long flags;
-
-   if(pClient->first_msg)
-   {
-      spin_lock_irqsave(&pClient->lock, flags);
-
-      pMsg = pClient->first_msg;
-      pClient->first_msg = pMsg->next;
-      if(pClient->first_msg==NULL)
-      {
-         pClient->last_msg = NULL;
-      }
-      
-      pClient->msg_count--;
-      if(pMsg->block)
-      {
-        remove_client_block(pInfo, pClient);
-        pClient->next_block_to_read = pMsg->block;
-      }
-      spin_unlock_irqrestore(&pClient->lock, flags);
-   }
-   return pMsg;
+       struct r3964_message *pMsg = NULL;
+       unsigned long flags;
+
+       if (pClient->first_msg) {
+               spin_lock_irqsave(&pClient->lock, flags);
+
+               pMsg = pClient->first_msg;
+               pClient->first_msg = pMsg->next;
+               if (pClient->first_msg == NULL) {
+                       pClient->last_msg = NULL;
+               }
+
+               pClient->msg_count--;
+               if (pMsg->block) {
+                       remove_client_block(pInfo, pClient);
+                       pClient->next_block_to_read = pMsg->block;
+               }
+               spin_unlock_irqrestore(&pClient->lock, flags);
+       }
+       return pMsg;
 }
 
-static void remove_client_block(struct r3964_info *pInfo, 
-                struct r3964_client_info *pClient)
+static void remove_client_block(struct r3964_info *pInfo,
+                               struct r3964_client_info *pClient)
 {
-    struct r3964_block_header *block;
-
-    TRACE_PS("remove_client_block PID %d", pid_nr(pClient->pid));
-
-    block=pClient->next_block_to_read;
-    if(block)
-    {
-        block->locks--;
-        if(block->locks==0)
-        {
-            remove_from_rx_queue(pInfo, block);
-        }
-    }
-    pClient->next_block_to_read = NULL;
-}
+       struct r3964_block_header *block;
+
+       TRACE_PS("remove_client_block PID %d", pid_nr(pClient->pid));
 
+       block = pClient->next_block_to_read;
+       if (block) {
+               block->locks--;
+               if (block->locks == 0) {
+                       remove_from_rx_queue(pInfo, block);
+               }
+       }
+       pClient->next_block_to_read = NULL;
+}
 
 /*************************************************************
  * Line discipline routines
@@ -1064,342 +951,318 @@ static void remove_client_block(struct r3964_info *pInfo,
 
 static int r3964_open(struct tty_struct *tty)
 {
-   struct r3964_info *pInfo;
-   
-   TRACE_L("open");
-   TRACE_L("tty=%p, PID=%d, disc_data=%p", 
-          tty, current->pid, tty->disc_data);
-   
-   pInfo=kmalloc(sizeof(struct r3964_info), GFP_KERNEL); 
-   TRACE_M("r3964_open - info kmalloc %p",pInfo);
-
-   if(!pInfo)
-   {
-      printk(KERN_ERR "r3964: failed to alloc info structure\n");
-      return -ENOMEM;
-   }
-
-   pInfo->rx_buf = kmalloc(RX_BUF_SIZE, GFP_KERNEL);
-   TRACE_M("r3964_open - rx_buf kmalloc %p",pInfo->rx_buf);
-
-   if(!pInfo->rx_buf)
-   {
-      printk(KERN_ERR "r3964: failed to alloc receive buffer\n");
-      kfree(pInfo);
-      TRACE_M("r3964_open - info kfree %p",pInfo);
-      return -ENOMEM;
-   }
-   
-   pInfo->tx_buf = kmalloc(TX_BUF_SIZE, GFP_KERNEL);
-   TRACE_M("r3964_open - tx_buf kmalloc %p",pInfo->tx_buf);
-
-   if(!pInfo->tx_buf)
-   {
-      printk(KERN_ERR "r3964: failed to alloc transmit buffer\n");
-      kfree(pInfo->rx_buf);
-      TRACE_M("r3964_open - rx_buf kfree %p",pInfo->rx_buf);
-      kfree(pInfo);
-      TRACE_M("r3964_open - info kfree %p",pInfo);
-      return -ENOMEM;
-   }
-
-   spin_lock_init(&pInfo->lock);
-   pInfo->tty = tty;
-   init_waitqueue_head (&pInfo->read_wait);
-   pInfo->priority = R3964_MASTER;
-   pInfo->rx_first = pInfo->rx_last = NULL;
-   pInfo->tx_first = pInfo->tx_last = NULL;
-   pInfo->rx_position = 0;
-   pInfo->tx_position = 0;
-   pInfo->last_rx = 0;
-   pInfo->blocks_in_rx_queue = 0;
-   pInfo->firstClient=NULL;
-   pInfo->state=R3964_IDLE;
-   pInfo->flags = R3964_DEBUG;
-   pInfo->nRetry = 0;
-   
-   tty->disc_data = pInfo;
-   tty->receive_room = 65536;
-
-   init_timer(&pInfo->tmr);
-   pInfo->tmr.data = (unsigned long)pInfo;
-   pInfo->tmr.function = on_timeout;
-
-   return 0;
+       struct r3964_info *pInfo;
+
+       TRACE_L("open");
+       TRACE_L("tty=%p, PID=%d, disc_data=%p",
+               tty, current->pid, tty->disc_data);
+
+       pInfo = kmalloc(sizeof(struct r3964_info), GFP_KERNEL);
+       TRACE_M("r3964_open - info kmalloc %p", pInfo);
+
+       if (!pInfo) {
+               printk(KERN_ERR "r3964: failed to alloc info structure\n");
+               return -ENOMEM;
+       }
+
+       pInfo->rx_buf = kmalloc(RX_BUF_SIZE, GFP_KERNEL);
+       TRACE_M("r3964_open - rx_buf kmalloc %p", pInfo->rx_buf);
+
+       if (!pInfo->rx_buf) {
+               printk(KERN_ERR "r3964: failed to alloc receive buffer\n");
+               kfree(pInfo);
+               TRACE_M("r3964_open - info kfree %p", pInfo);
+               return -ENOMEM;
+       }
+
+       pInfo->tx_buf = kmalloc(TX_BUF_SIZE, GFP_KERNEL);
+       TRACE_M("r3964_open - tx_buf kmalloc %p", pInfo->tx_buf);
+
+       if (!pInfo->tx_buf) {
+               printk(KERN_ERR "r3964: failed to alloc transmit buffer\n");
+               kfree(pInfo->rx_buf);
+               TRACE_M("r3964_open - rx_buf kfree %p", pInfo->rx_buf);
+               kfree(pInfo);
+               TRACE_M("r3964_open - info kfree %p", pInfo);
+               return -ENOMEM;
+       }
+
+       spin_lock_init(&pInfo->lock);
+       pInfo->tty = tty;
+       init_waitqueue_head(&pInfo->read_wait);
+       pInfo->priority = R3964_MASTER;
+       pInfo->rx_first = pInfo->rx_last = NULL;
+       pInfo->tx_first = pInfo->tx_last = NULL;
+       pInfo->rx_position = 0;
+       pInfo->tx_position = 0;
+       pInfo->last_rx = 0;
+       pInfo->blocks_in_rx_queue = 0;
+       pInfo->firstClient = NULL;
+       pInfo->state = R3964_IDLE;
+       pInfo->flags = R3964_DEBUG;
+       pInfo->nRetry = 0;
+
+       tty->disc_data = pInfo;
+       tty->receive_room = 65536;
+
+       setup_timer(&pInfo->tmr, on_timeout, (unsigned long)pInfo);
+
+       return 0;
 }
 
 static void r3964_close(struct tty_struct *tty)
 {
-   struct r3964_info *pInfo=(struct r3964_info*)tty->disc_data;
-   struct r3964_client_info *pClient, *pNext;
-   struct r3964_message *pMsg;
-   struct r3964_block_header *pHeader, *pNextHeader;
-   unsigned long flags;
-
-   TRACE_L("close");
-
-    /*
-     * Make sure that our task queue isn't activated.  If it
-     * is, take it out of the linked list.
-     */
-    del_timer_sync(&pInfo->tmr);
-
-   /* Remove client-structs and message queues: */
-    pClient=pInfo->firstClient;
-    while(pClient)
-    {
-       pNext=pClient->next;
-       while(pClient->msg_count)
-       {
-          pMsg=remove_msg(pInfo, pClient);
-          if(pMsg)
-          {
-             kfree(pMsg);
-             TRACE_M("r3964_close - msg kfree %p",pMsg);
-          }
-       }
-       put_pid(pClient->pid);
-       kfree(pClient);
-       TRACE_M("r3964_close - client kfree %p",pClient);
-       pClient=pNext;
-    }
-    /* Remove jobs from tx_queue: */
-        spin_lock_irqsave(&pInfo->lock, flags);
-       pHeader=pInfo->tx_first;
-       pInfo->tx_first=pInfo->tx_last=NULL;
+       struct r3964_info *pInfo = (struct r3964_info *)tty->disc_data;
+       struct r3964_client_info *pClient, *pNext;
+       struct r3964_message *pMsg;
+       struct r3964_block_header *pHeader, *pNextHeader;
+       unsigned long flags;
+
+       TRACE_L("close");
+
+       /*
+        * Make sure that our task queue isn't activated.  If it
+        * is, take it out of the linked list.
+        */
+       del_timer_sync(&pInfo->tmr);
+
+       /* Remove client-structs and message queues: */
+       pClient = pInfo->firstClient;
+       while (pClient) {
+               pNext = pClient->next;
+               while (pClient->msg_count) {
+                       pMsg = remove_msg(pInfo, pClient);
+                       if (pMsg) {
+                               kfree(pMsg);
+                               TRACE_M("r3964_close - msg kfree %p", pMsg);
+                       }
+               }
+               put_pid(pClient->pid);
+               kfree(pClient);
+               TRACE_M("r3964_close - client kfree %p", pClient);
+               pClient = pNext;
+       }
+       /* Remove jobs from tx_queue: */
+       spin_lock_irqsave(&pInfo->lock, flags);
+       pHeader = pInfo->tx_first;
+       pInfo->tx_first = pInfo->tx_last = NULL;
        spin_unlock_irqrestore(&pInfo->lock, flags);
-       
-    while(pHeader)
-       {
-          pNextHeader=pHeader->next;
-          kfree(pHeader);
-          pHeader=pNextHeader;
+
+       while (pHeader) {
+               pNextHeader = pHeader->next;
+               kfree(pHeader);
+               pHeader = pNextHeader;
        }
 
-    /* Free buffers: */
-    wake_up_interruptible(&pInfo->read_wait);
-    kfree(pInfo->rx_buf);
-    TRACE_M("r3964_close - rx_buf kfree %p",pInfo->rx_buf);
-    kfree(pInfo->tx_buf);
-    TRACE_M("r3964_close - tx_buf kfree %p",pInfo->tx_buf);
-    kfree(pInfo);
-    TRACE_M("r3964_close - info kfree %p",pInfo);
+       /* Free buffers: */
+       wake_up_interruptible(&pInfo->read_wait);
+       kfree(pInfo->rx_buf);
+       TRACE_M("r3964_close - rx_buf kfree %p", pInfo->rx_buf);
+       kfree(pInfo->tx_buf);
+       TRACE_M("r3964_close - tx_buf kfree %p", pInfo->tx_buf);
+       kfree(pInfo);
+       TRACE_M("r3964_close - info kfree %p", pInfo);
 }
 
 static ssize_t r3964_read(struct tty_struct *tty, struct file *file,
-                         unsigned char __user *buf, size_t nr)
+                         unsigned char __user * buf, size_t nr)
 {
-   struct r3964_info *pInfo=(struct r3964_info*)tty->disc_data;
-   struct r3964_client_info *pClient;
-   struct r3964_message *pMsg;
-   struct r3964_client_message theMsg;
-   DECLARE_WAITQUEUE (wait, current);
-   
-   int count;
-   
-   TRACE_L("read()");
-   pClient=findClient(pInfo, task_pid(current));
-   if(pClient)
-   {
-      pMsg = remove_msg(pInfo, pClient);
-      if(pMsg==NULL)
-      {
-                /* no messages available. */
-         if (file->f_flags & O_NONBLOCK)
-                {
-            return -EAGAIN;
-                }
-         /* block until there is a message: */
-         add_wait_queue(&pInfo->read_wait, &wait);
+       struct r3964_info *pInfo = (struct r3964_info *)tty->disc_data;
+       struct r3964_client_info *pClient;
+       struct r3964_message *pMsg;
+       struct r3964_client_message theMsg;
+       DECLARE_WAITQUEUE(wait, current);
+
+       int count;
+
+       TRACE_L("read()");
+
+       pClient = findClient(pInfo, task_pid(current));
+       if (pClient) {
+               pMsg = remove_msg(pInfo, pClient);
+               if (pMsg == NULL) {
+                       /* no messages available. */
+                       if (file->f_flags & O_NONBLOCK) {
+                               return -EAGAIN;
+                       }
+                       /* block until there is a message: */
+                       add_wait_queue(&pInfo->read_wait, &wait);
 repeat:
-         current->state = TASK_INTERRUPTIBLE;
-         pMsg = remove_msg(pInfo, pClient);
-        if (!pMsg && !signal_pending(current))
-                {
-            schedule();
-            goto repeat;
-         }
-         current->state = TASK_RUNNING;
-         remove_wait_queue(&pInfo->read_wait, &wait);
-      }
-      
-      /* If we still haven't got a message, we must have been signalled */
-
-      if (!pMsg) return -EINTR;
-
-      /* deliver msg to client process: */
-      theMsg.msg_id = pMsg->msg_id;
-      theMsg.arg    = pMsg->arg;
-      theMsg.error_code = pMsg->error_code;
-      count = sizeof(struct r3964_client_message);
-
-      kfree(pMsg);
-      TRACE_M("r3964_read - msg kfree %p",pMsg);
-
-      if (copy_to_user(buf,&theMsg, count))
-       return -EFAULT;
-
-      TRACE_PS("read - return %d", count);
-      return count;
-   }
-   return -EPERM;
+                       current->state = TASK_INTERRUPTIBLE;
+                       pMsg = remove_msg(pInfo, pClient);
+                       if (!pMsg && !signal_pending(current)) {
+                               schedule();
+                               goto repeat;
+                       }
+                       current->state = TASK_RUNNING;
+                       remove_wait_queue(&pInfo->read_wait, &wait);
+               }
+
+               /* If we still haven't got a message, we must have been signalled */
+
+               if (!pMsg)
+                       return -EINTR;
+
+               /* deliver msg to client process: */
+               theMsg.msg_id = pMsg->msg_id;
+               theMsg.arg = pMsg->arg;
+               theMsg.error_code = pMsg->error_code;
+               count = sizeof(struct r3964_client_message);
+
+               kfree(pMsg);
+               TRACE_M("r3964_read - msg kfree %p", pMsg);
+
+               if (copy_to_user(buf, &theMsg, count))
+                       return -EFAULT;
+
+               TRACE_PS("read - return %d", count);
+               return count;
+       }
+       return -EPERM;
 }
 
-static ssize_t r3964_write(struct tty_struct * tty, struct file * file,
+static ssize_t r3964_write(struct tty_struct *tty, struct file *file,
                           const unsigned char *data, size_t count)
 {
-   struct r3964_info *pInfo=(struct r3964_info*)tty->disc_data;
-   struct r3964_block_header *pHeader;
-   struct r3964_client_info *pClient;
-   unsigned char *new_data;
-   
-   TRACE_L("write request, %d characters", count);
+       struct r3964_info *pInfo = (struct r3964_info *)tty->disc_data;
+       struct r3964_block_header *pHeader;
+       struct r3964_client_info *pClient;
+       unsigned char *new_data;
+
+       TRACE_L("write request, %d characters", count);
 /* 
  * Verify the pointers 
  */
 
-   if(!pInfo)
-      return -EIO;
+       if (!pInfo)
+               return -EIO;
 
 /*
  * Ensure that the caller does not wish to send too much.
  */
-   if (count > R3964_MTU) 
-   {
-      if (pInfo->flags & R3964_DEBUG)
-      {
-         TRACE_L (KERN_WARNING
-                 "r3964_write: truncating user packet "
-                 "from %u to mtu %d", count, R3964_MTU);
-      }
-      count = R3964_MTU;
-   }
+       if (count > R3964_MTU) {
+               if (pInfo->flags & R3964_DEBUG) {
+                       TRACE_L(KERN_WARNING "r3964_write: truncating user "
+                               "packet from %u to mtu %d", count, R3964_MTU);
+               }
+               count = R3964_MTU;
+       }
 /*
  * Allocate a buffer for the data and copy it from the buffer with header prepended
  */
-   new_data = kmalloc (count+sizeof(struct r3964_block_header), GFP_KERNEL);
-   TRACE_M("r3964_write - kmalloc %p",new_data);
-   if (new_data == NULL) {
-      if (pInfo->flags & R3964_DEBUG)
-      {
-         printk (KERN_ERR
-               "r3964_write: no memory\n");
-      }
-      return -ENOSPC;
-   }
-   
-   pHeader = (struct r3964_block_header *)new_data;
-   pHeader->data = new_data + sizeof(struct r3964_block_header);
-   pHeader->length = count;
-   pHeader->locks = 0;
-   pHeader->owner = NULL;
-   
-   pClient=findClient(pInfo, task_pid(current));
-   if(pClient)
-   {
-      pHeader->owner = pClient;
-   }
-
-   memcpy(pHeader->data, data, count); /* We already verified this */
-
-   if(pInfo->flags & R3964_DEBUG)
-   {
-      dump_block(pHeader->data, count);
-   }
+       new_data = kmalloc(count + sizeof(struct r3964_block_header),
+                       GFP_KERNEL);
+       TRACE_M("r3964_write - kmalloc %p", new_data);
+       if (new_data == NULL) {
+               if (pInfo->flags & R3964_DEBUG) {
+                       printk(KERN_ERR "r3964_write: no memory\n");
+               }
+               return -ENOSPC;
+       }
+
+       pHeader = (struct r3964_block_header *)new_data;
+       pHeader->data = new_data + sizeof(struct r3964_block_header);
+       pHeader->length = count;
+       pHeader->locks = 0;
+       pHeader->owner = NULL;
+
+       pClient = findClient(pInfo, task_pid(current));
+       if (pClient) {
+               pHeader->owner = pClient;
+       }
+
+       memcpy(pHeader->data, data, count);     /* We already verified this */
+
+       if (pInfo->flags & R3964_DEBUG) {
+               dump_block(pHeader->data, count);
+       }
 
 /*
  * Add buffer to transmit-queue:
  */
-   add_tx_queue(pInfo, pHeader);
-   trigger_transmit(pInfo);
-   
-   return 0;
+       add_tx_queue(pInfo, pHeader);
+       trigger_transmit(pInfo);
+
+       return 0;
 }
 
-static int r3964_ioctl(struct tty_struct * tty, struct file * file,
-               unsigned int cmd, unsigned long arg)
+static int r3964_ioctl(struct tty_struct *tty, struct file *file,
+               unsigned int cmd, unsigned long arg)
 {
-   struct r3964_info *pInfo=(struct r3964_info*)tty->disc_data;
-   if(pInfo==NULL)
-      return -EINVAL;
-   switch(cmd)
-   {
-      case R3964_ENABLE_SIGNALS:
-         return enable_signals(pInfo, task_pid(current), arg);
-      case R3964_SETPRIORITY:
-         if(arg<R3964_MASTER || arg>R3964_SLAVE)
-            return -EINVAL;
-         pInfo->priority = arg & 0xff;
-         return 0;
-      case R3964_USE_BCC:
-             if(arg)
-            pInfo->flags |= R3964_BCC;
-         else
-            pInfo->flags &= ~R3964_BCC;
-         return 0;
-      case R3964_READ_TELEGRAM:
-         return read_telegram(pInfo, task_pid(current), (unsigned char __user *)arg);
-      default:
-         return -ENOIOCTLCMD;
-   }
+       struct r3964_info *pInfo = (struct r3964_info *)tty->disc_data;
+       if (pInfo == NULL)
+               return -EINVAL;
+       switch (cmd) {
+       case R3964_ENABLE_SIGNALS:
+               return enable_signals(pInfo, task_pid(current), arg);
+       case R3964_SETPRIORITY:
+               if (arg < R3964_MASTER || arg > R3964_SLAVE)
+                       return -EINVAL;
+               pInfo->priority = arg & 0xff;
+               return 0;
+       case R3964_USE_BCC:
+               if (arg)
+                       pInfo->flags |= R3964_BCC;
+               else
+                       pInfo->flags &= ~R3964_BCC;
+               return 0;
+       case R3964_READ_TELEGRAM:
+               return read_telegram(pInfo, task_pid(current),
+                               (unsigned char __user *)arg);
+       default:
+               return -ENOIOCTLCMD;
+       }
 }
 
-static void r3964_set_termios(struct tty_struct *tty, struct ktermios * old)
+static void r3964_set_termios(struct tty_struct *tty, struct ktermios *old)
 {
-   TRACE_L("set_termios");
+       TRACE_L("set_termios");
 }
 
 /* Called without the kernel lock held - fine */
-static unsigned int r3964_poll(struct tty_struct * tty, struct file * file,
-                     struct poll_table_struct *wait)
+static unsigned int r3964_poll(struct tty_struct *tty, struct file *file,
+                       struct poll_table_struct *wait)
 {
-   struct r3964_info *pInfo=(struct r3964_info*)tty->disc_data;
-   struct r3964_client_info *pClient;
-   struct r3964_message *pMsg=NULL;
-   unsigned long flags;
-   int result = POLLOUT;
-
-   TRACE_L("POLL");
-
-   pClient=findClient(pInfo, task_pid(current));
-   if(pClient)
-     {
-       poll_wait(file, &pInfo->read_wait, wait);
-       spin_lock_irqsave(&pInfo->lock, flags);
-       pMsg=pClient->first_msg;
-       spin_unlock_irqrestore(&pInfo->lock, flags);
-       if(pMsg)
-          result |= POLLIN | POLLRDNORM;
-     }
-   else
-     {
-       result = -EINVAL;
-     }
-   return result;
+       struct r3964_info *pInfo = (struct r3964_info *)tty->disc_data;
+       struct r3964_client_info *pClient;
+       struct r3964_message *pMsg = NULL;
+       unsigned long flags;
+       int result = POLLOUT;
+
+       TRACE_L("POLL");
+
+       pClient = findClient(pInfo, task_pid(current));
+       if (pClient) {
+               poll_wait(file, &pInfo->read_wait, wait);
+               spin_lock_irqsave(&pInfo->lock, flags);
+               pMsg = pClient->first_msg;
+               spin_unlock_irqrestore(&pInfo->lock, flags);
+               if (pMsg)
+                       result |= POLLIN | POLLRDNORM;
+       } else {
+               result = -EINVAL;
+       }
+       return result;
 }
 
 static void r3964_receive_buf(struct tty_struct *tty, const unsigned char *cp,
-                              char *fp, int count)
+                       char *fp, int count)
 {
-   struct r3964_info *pInfo=(struct r3964_info*)tty->disc_data;
-    const unsigned char *p;
-    char *f, flags = 0;
-    int i;
-
-    for (i=count, p = cp, f = fp; i; i--, p++) {
-        if (f)
-            flags = *f++;
-        if(flags==TTY_NORMAL)
-        {
-            receive_char(pInfo, *p);
-        }
-        else
-        {
-            receive_error(pInfo, flags);
-        }
-        
-    }
+       struct r3964_info *pInfo = (struct r3964_info *)tty->disc_data;
+       const unsigned char *p;
+       char *f, flags = 0;
+       int i;
+
+       for (i = count, p = cp, f = fp; i; i--, p++) {
+               if (f)
+                       flags = *f++;
+               if (flags == TTY_NORMAL) {
+                       receive_char(pInfo, *p);
+               } else {
+                       receive_error(pInfo, flags);
+               }
+
+       }
 }
 
 MODULE_LICENSE("GPL");
index 2bdb0144a22e3f0b4d8675826bdd0ea353ac3079..6ac3ca4c723c2c660c5d084b9c7834035767fbb5 100644 (file)
@@ -579,8 +579,8 @@ static void eraser(unsigned char c, struct tty_struct *tty)
  
 static inline void isig(int sig, struct tty_struct *tty, int flush)
 {
-       if (tty->pgrp > 0)
-               kill_pg(tty->pgrp, sig, 1);
+       if (tty->pgrp)
+               kill_pgrp(tty->pgrp, sig, 1);
        if (flush || !L_NOFLSH(tty)) {
                n_tty_flush_buffer(tty);
                if (tty->driver->flush_buffer)
@@ -1184,13 +1184,13 @@ static int job_control(struct tty_struct *tty, struct file *file)
        /* don't stop on /dev/console */
        if (file->f_op->write != redirected_tty_write &&
            current->signal->tty == tty) {
-               if (tty->pgrp <= 0)
-                       printk("read_chan: tty->pgrp <= 0!\n");
-               else if (process_group(current) != tty->pgrp) {
+               if (!tty->pgrp)
+                       printk("read_chan: no tty->pgrp!\n");
+               else if (task_pgrp(current) != tty->pgrp) {
                        if (is_ignored(SIGTTIN) ||
-                           is_orphaned_pgrp(process_group(current)))
+                           is_current_pgrp_orphaned())
                                return -EIO;
-                       kill_pg(process_group(current), SIGTTIN, 1);
+                       kill_pgrp(task_pgrp(current), SIGTTIN, 1);
                        return -ERESTARTSYS;
                }
        }
index a39f19c35a6a8bd6fa2673f916069039f6142b6a..204deaa0de80edb9f16ca0fd55923b13950924e0 100644 (file)
@@ -37,7 +37,6 @@
 #define NVRAM_VERSION  "1.2"
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/smp_lock.h>
 #include <linux/nvram.h>
 
index 2d264971d839809d70ba8fe780ed3ba6ef89ff33..2604246501e499eda6568527e4c64d8b5a13bc48 100644 (file)
 #define __NWBUTTON_C           /* Tell the header file who we are */
 #include "nwbutton.h"
 
+static void button_sequence_finished (unsigned long parameters);
+
 static int button_press_count;         /* The count of button presses */
-static struct timer_list button_timer; /* Times for the end of a sequence */ 
+/* Times for the end of a sequence */
+static DEFINE_TIMER(button_timer, button_sequence_finished, 0, 0);
 static DECLARE_WAIT_QUEUE_HEAD(button_wait_queue); /* Used for blocking read */
 static char button_output_buffer[32];  /* Stores data to write out of device */
 static int bcount;                     /* The number of bytes in the buffer */
@@ -146,14 +149,8 @@ static void button_sequence_finished (unsigned long parameters)
 
 static irqreturn_t button_handler (int irq, void *dev_id)
 {
-       if (button_press_count) {
-               del_timer (&button_timer);
-       }
        button_press_count++;
-       init_timer (&button_timer);
-       button_timer.function = button_sequence_finished;
-       button_timer.expires = (jiffies + bdelay);
-       add_timer (&button_timer);
+       mod_timer(&button_timer, jiffies + bdelay);
 
        return IRQ_HANDLED;
 }
index 206cf6f50695699be3fe865a5f024c1df9e640fe..ba012c2bdf7a3b8ceb136f32d0d24cede5037725 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/mm.h>
 #include <linux/delay.h>
 #include <linux/proc_fs.h>
-#include <linux/sched.h>
 #include <linux/miscdevice.h>
 #include <linux/spinlock.h>
 #include <linux/rwsem.h>
index 211c93fda6fc6c789bbe5edc55b4c0618ae98661..e91b43a014b09edf096ce80e8d40ec2f1fee4880 100644 (file)
@@ -946,8 +946,7 @@ release_io:
 
 return_with_timer:
        DEBUGP(7, dev, "<- monitor_card (returns with timer)\n");
-       dev->timer.expires = jiffies + dev->mdelay;
-       add_timer(&dev->timer);
+       mod_timer(&dev->timer, jiffies + dev->mdelay);
        clear_bit(LOCK_MONITOR, &dev->flags);
 }
 
@@ -1406,12 +1405,9 @@ 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);
+               setup_timer(&dev->timer, monitor_card, (unsigned long)dev);
                dev->monitor_running = 1;
-               dev->timer.expires = jiffies;
-               dev->timer.data = (unsigned long) dev;
-               dev->timer.function = monitor_card;
-               add_timer(&dev->timer);
+               mod_timer(&dev->timer, jiffies);
        } else
                DEBUGP(5, dev, "monitor already running\n");
        DEBUGP(3, dev, "<- start_monitor\n");
index 9b1ff7e8f896b9257163e6b32549b4cb455dc5f0..0e82968c2f38ee74c30e6c0a779f365d2c5f5a52 100644 (file)
@@ -632,8 +632,7 @@ static int reader_probe(struct pcmcia_device *link)
        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;
+       setup_timer(&dev->poll_timer, cm4040_do_poll, 0);
 
        ret = reader_config(link, i);
        if (ret)
index f108c136800a2ef3b2fcb990cc3d8aabf83b6ffe..8d025e9b5bceea3039f2c53e0dab3186e23ecebf 100644 (file)
@@ -887,10 +887,8 @@ static void bh_transmit(MGSLPC_INFO *info)
        if (debug_level >= DEBUG_LEVEL_BH)
                printk("bh_transmit() entry on %s\n", info->device_name);
 
-       if (tty) {
+       if (tty)
                tty_wakeup(tty);
-               wake_up_interruptible(&tty->write_wait);
-       }
 }
 
 static void bh_status(MGSLPC_INFO *info)
@@ -1363,9 +1361,7 @@ static int startup(MGSLPC_INFO * info)
        
        memset(&info->icount, 0, sizeof(info->icount));
 
-       init_timer(&info->tx_timer);
-       info->tx_timer.data = (unsigned long)info;
-       info->tx_timer.function = tx_timeout;
+       setup_timer(&info->tx_timer, tx_timeout, (unsigned long)info);
 
        /* Allocate and claim adapter resources */
        retval = claim_resources(info);
@@ -1410,7 +1406,7 @@ static void shutdown(MGSLPC_INFO * info)
        wake_up_interruptible(&info->status_event_wait_q);
        wake_up_interruptible(&info->event_wait_q);
 
-       del_timer(&info->tx_timer);     
+       del_timer_sync(&info->tx_timer);
 
        if (info->tx_buf) {
                free_page((unsigned long) info->tx_buf);
@@ -3551,8 +3547,8 @@ static void tx_start(MGSLPC_INFO *info)
                } else {
                        info->tx_active = 1;
                        tx_ready(info);
-                       info->tx_timer.expires = jiffies + msecs_to_jiffies(5000);
-                       add_timer(&info->tx_timer);     
+                       mod_timer(&info->tx_timer, jiffies +
+                                       msecs_to_jiffies(5000));
                }
        }
 
index c07a1b5cd05d3f31204fab9eb7810e9704d96e08..de14aea34e11f215765c8b718efe65ff595e795a 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/module.h>      /* For EXPORT_SYMBOL */
 
 #include <linux/errno.h>
-#include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/tty.h>
 #include <linux/tty_flip.h>
index 13d0b1350a62ed5fb579e727b623cb027e86610c..b9dc7aa1dfb31032b0d83dc5ad7dcb2d9f4cc7d6 100644 (file)
@@ -1117,14 +1117,14 @@ random_ioctl(struct inode * inode, struct file * file,
        }
 }
 
-struct file_operations random_fops = {
+const struct file_operations random_fops = {
        .read  = random_read,
        .write = random_write,
        .poll  = random_poll,
        .ioctl = random_ioctl,
 };
 
-struct file_operations urandom_fops = {
+const struct file_operations urandom_fops = {
        .read  = urandom_read,
        .write = random_write,
        .ioctl = random_ioctl,
index 645e20a06ece382149b0f0eff59812aeed1d6a59..1f0d7c60c94420fb98fd23791bc38ba1b8266b37 100644 (file)
@@ -154,7 +154,7 @@ static int raw_ctl_ioctl(struct inode *inode, struct file *filp,
                        goto out;
                }
 
-               if (rq.raw_minor < 0 || rq.raw_minor >= MAX_RAW_MINORS) {
+               if (rq.raw_minor <= 0 || rq.raw_minor >= MAX_RAW_MINORS) {
                        err = -EINVAL;
                        goto out;
                }
index e79b2ede8510c6cecbffffa1c0ba72f2823de580..85c1618452605819fa2110f9a68cb208dc46df84 100644 (file)
@@ -418,8 +418,7 @@ static void rio_pollfunc(unsigned long data)
        func_enter();
 
        rio_interrupt(0, &p->RIOHosts[data]);
-       p->RIOHosts[data].timer.expires = jiffies + rio_poll;
-       add_timer(&p->RIOHosts[data].timer);
+       mod_timer(&p->RIOHosts[data].timer, jiffies + rio_poll);
 
        func_exit();
 }
@@ -1154,13 +1153,10 @@ static int __init rio_init(void)
                /* Init the timer "always" to make sure that it can safely be
                   deleted when we unload... */
 
-               init_timer(&hp->timer);
+               setup_timer(&hp->timer, rio_pollfunc, i);
                if (!hp->Ivec) {
                        rio_dprintk(RIO_DEBUG_INIT, "Starting polling at %dj intervals.\n", rio_poll);
-                       hp->timer.data = i;
-                       hp->timer.function = rio_pollfunc;
-                       hp->timer.expires = jiffies + rio_poll;
-                       add_timer(&hp->timer);
+                       mod_timer(&hp->timer, jiffies + rio_poll);
                }
        }
 
@@ -1191,7 +1187,7 @@ static void __exit rio_exit(void)
                        rio_dprintk(RIO_DEBUG_INIT, "freed irq %d.\n", hp->Ivec);
                }
                /* It is safe/allowed to del_timer a non-active timer */
-               del_timer(&hp->timer);
+               del_timer_sync(&hp->timer);
                if (hp->Caddr)
                        iounmap(hp->Caddr);
                if (hp->Type == RIO_PCI)
index eeda40c5e189067a547e1db2a5670a6756fc5a74..ebc76342712c1485da63b58eb01d83be38e34a4d 100644 (file)
@@ -162,13 +162,8 @@ void RIOTxEnable(char *en)
 
        rio_spin_unlock_irqrestore(&PortP->portSem, flags);
 
-       if (PortP->gs.xmit_cnt <= (PortP->gs.wakeup_chars + 2 * PKT_MAX_DATA_LEN)) {
-               rio_dprintk(RIO_DEBUG_INTR, "Waking up.... ldisc:%d (%d/%d)....", (int) (PortP->gs.tty->flags & (1 << TTY_DO_WRITE_WAKEUP)), PortP->gs.wakeup_chars, PortP->gs.xmit_cnt);
-               if ((PortP->gs.tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && PortP->gs.tty->ldisc.write_wakeup)
-                       (PortP->gs.tty->ldisc.write_wakeup) (PortP->gs.tty);
-               rio_dprintk(RIO_DEBUG_INTR, "(%d/%d)\n", PortP->gs.wakeup_chars, PortP->gs.xmit_cnt);
-               wake_up_interruptible(&PortP->gs.tty->write_wait);
-       }
+       if (PortP->gs.xmit_cnt <= (PortP->gs.wakeup_chars + 2 * PKT_MAX_DATA_LEN))
+               tty_wakeup(PortP->gs.tty);
 
 }
 
index e2a94bfb2a436dd5d24e68fb8388721351a6acdb..70145254fb9dff9af8acedcc169f791acdc00446 100644 (file)
@@ -1229,7 +1229,6 @@ static void rc_flush_buffer(struct tty_struct *tty)
        port->xmit_cnt = port->xmit_head = port->xmit_tail = 0;
        restore_flags(flags);
        
-       wake_up_interruptible(&tty->write_wait);
        tty_wakeup(tty);
 }
 
@@ -1570,10 +1569,8 @@ static void do_softint(struct work_struct *ugly_api)
        if(!(tty = port->tty)) 
                return;
 
-       if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &port->event)) {
+       if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &port->event))
                tty_wakeup(tty);
-               wake_up_interruptible(&tty->write_wait);
-       }
 }
 
 static const struct tty_operations riscom_ops = {
index e94a62e30fc4f5c01be2343a28468675ba9ca8c8..76357c855ce3b0324c5dd26873ec85cf3971cc78 100644 (file)
 
 /****** RocketPort Local Variables ******/
 
+static void rp_do_poll(unsigned long dummy);
+
 static struct tty_driver *rocket_driver;
 
 static struct rocket_version driver_version = {        
@@ -116,7 +118,7 @@ static struct r_port *rp_table[MAX_RP_PORTS];              /*  The main repository of
 static unsigned int xmit_flags[NUM_BOARDS];           /*  Bit significant, indicates port had data to transmit. */
                                                       /*  eg.  Bit 0 indicates port 0 has xmit data, ...        */
 static atomic_t rp_num_ports_open;                    /*  Number of serial ports open                           */
-static struct timer_list rocket_timer;
+static DEFINE_TIMER(rocket_timer, rp_do_poll, 0, 0);
 
 static unsigned long board1;                          /* ISA addresses, retrieved from rocketport.conf          */
 static unsigned long board2;
@@ -474,7 +476,6 @@ static void rp_do_transmit(struct r_port *info)
 
        if (info->xmit_cnt < WAKEUP_CHARS) {
                tty_wakeup(tty);
-               wake_up_interruptible(&tty->write_wait);
 #ifdef ROCKETPORT_HAVE_POLL_WAIT
                wake_up_interruptible(&tty->poll_wait);
 #endif
@@ -1772,7 +1773,6 @@ static int rp_write(struct tty_struct *tty,
 end:
        if (info->xmit_cnt < WAKEUP_CHARS) {
                tty_wakeup(tty);
-               wake_up_interruptible(&tty->write_wait);
 #ifdef ROCKETPORT_HAVE_POLL_WAIT
                wake_up_interruptible(&tty->poll_wait);
 #endif
@@ -1841,7 +1841,6 @@ static void rp_flush_buffer(struct tty_struct *tty)
        info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
        spin_unlock_irqrestore(&info->slock, flags);
 
-       wake_up_interruptible(&tty->write_wait);
 #ifdef ROCKETPORT_HAVE_POLL_WAIT
        wake_up_interruptible(&tty->poll_wait);
 #endif
@@ -2370,12 +2369,6 @@ static int __init rp_init(void)
        if (!rocket_driver)
                return -ENOMEM;
 
-       /*
-        * Set up the timer channel.
-        */
-       init_timer(&rocket_timer);
-       rocket_timer.function = rp_do_poll;
-
        /*
         * Initialize the array of pointers to our own internal state
         * structures.
index 664f36c98e6acc4f257759aaff8c5586f48653e2..c7dac9b13351d2585aa6e911f7bf873cd89c0547 100644 (file)
@@ -135,7 +135,9 @@ static struct fasync_struct *rtc_async_queue;
 static DECLARE_WAIT_QUEUE_HEAD(rtc_wait);
 
 #ifdef RTC_IRQ
-static struct timer_list rtc_irq_timer;
+static void rtc_dropped_irq(unsigned long data);
+
+static DEFINE_TIMER(rtc_irq_timer, rtc_dropped_irq, 0, 0);
 #endif
 
 static ssize_t rtc_read(struct file *file, char __user *buf,
@@ -150,8 +152,6 @@ static unsigned int rtc_poll(struct file *file, poll_table *wait);
 
 static void get_rtc_alm_time (struct rtc_time *alm_tm);
 #ifdef RTC_IRQ
-static void rtc_dropped_irq(unsigned long data);
-
 static void set_rtc_irq_bit_locked(unsigned char bit);
 static void mask_rtc_irq_bit_locked(unsigned char bit);
 
@@ -282,7 +282,7 @@ irqreturn_t rtc_interrupt(int irq, void *dev_id)
  */
 static ctl_table rtc_table[] = {
        {
-               .ctl_name       = 1,
+               .ctl_name       = CTL_UNNUMBERED,
                .procname       = "max-user-freq",
                .data           = &rtc_max_user_freq,
                .maxlen         = sizeof(int),
@@ -294,9 +294,8 @@ static ctl_table rtc_table[] = {
 
 static ctl_table rtc_root[] = {
        {
-               .ctl_name       = 1,
+               .ctl_name       = CTL_UNNUMBERED,
                .procname       = "rtc",
-               .maxlen         = 0,
                .mode           = 0555,
                .child          = rtc_table,
        },
@@ -307,7 +306,6 @@ static ctl_table dev_root[] = {
        {
                .ctl_name       = CTL_DEV,
                .procname       = "dev",
-               .maxlen         = 0,
                .mode           = 0555,
                .child          = rtc_root,
        },
@@ -318,7 +316,7 @@ static struct ctl_table_header *sysctl_header;
 
 static int __init init_sysctl(void)
 {
-    sysctl_header = register_sysctl_table(dev_root, 0);
+    sysctl_header = register_sysctl_table(dev_root);
     return 0;
 }
 
@@ -454,8 +452,8 @@ static int rtc_do_ioctl(unsigned int cmd, unsigned long arg, int kernel)
 
                spin_lock_irqsave (&rtc_lock, flags);
                if (!(rtc_status & RTC_TIMER_ON)) {
-                       rtc_irq_timer.expires = jiffies + HZ/rtc_freq + 2*HZ/100;
-                       add_timer(&rtc_irq_timer);
+                       mod_timer(&rtc_irq_timer, jiffies + HZ/rtc_freq +
+                                       2*HZ/100);
                        rtc_status |= RTC_TIMER_ON;
                }
                set_rtc_irq_bit_locked(RTC_PIE);
@@ -1084,8 +1082,6 @@ no_irq:
        if (rtc_has_irq == 0)
                goto no_irq2;
 
-       init_timer(&rtc_irq_timer);
-       rtc_irq_timer.function = rtc_dropped_irq;
        spin_lock_irq(&rtc_lock);
        rtc_freq = 1024;
        if (!hpet_set_periodic_freq(rtc_freq)) {
diff --git a/drivers/char/scan_keyb.c b/drivers/char/scan_keyb.c
deleted file mode 100644 (file)
index 2b5bb4f..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- *     $Id: scan_keyb.c,v 1.2 2000/07/04 06:24:42 yaegashi Exp $ 
- *     Copyright (C) 2000 YAEGASHI Takeshi
- *     Generic scan keyboard driver
- */
-
-#include <linux/spinlock.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/tty.h>
-#include <linux/mm.h>
-#include <linux/signal.h>
-#include <linux/init.h>
-#include <linux/kbd_ll.h>
-#include <linux/delay.h>
-#include <linux/random.h>
-#include <linux/poll.h>
-#include <linux/miscdevice.h>
-#include <linux/slab.h>
-#include <linux/kbd_kern.h>
-#include <linux/timer.h>
-
-#define SCANHZ (HZ/20)
-
-struct scan_keyboard {
-       struct scan_keyboard *next;
-       int (*scan)(unsigned char *buffer);
-       const unsigned char *table;
-       unsigned char *s0, *s1;
-       int length;
-};
-
-static int scan_jiffies=0;
-static struct scan_keyboard *keyboards=NULL;
-struct timer_list scan_timer;
-
-static void check_kbd(const unsigned char *table,
-                     unsigned char *new, unsigned char *old, int length)
-{
-       int need_tasklet_schedule=0;
-       unsigned int xor, bit;
-       
-       while(length-->0) {
-               if((xor=*new^*old)==0) {
-                       table+=8;
-               }
-               else {
-                       for(bit=0x01; bit<0x100; bit<<=1) {
-                               if(xor&bit) {
-                                       handle_scancode(*table, !(*new&bit));
-                                       need_tasklet_schedule=1;
-#if 0
-                                       printk("0x%x %s\n", *table, (*new&bit)?"released":"pressed");
-#endif
-                               }
-                               table++;
-                       }
-               }
-               new++; old++;
-       }
-
-       if(need_tasklet_schedule)
-               tasklet_schedule(&keyboard_tasklet);
-}
-
-
-static void scan_kbd(unsigned long dummy)
-{
-       struct scan_keyboard *kbd;
-
-       scan_jiffies++;
-
-       for(kbd=keyboards; kbd!=NULL; kbd=kbd->next) {
-               if(scan_jiffies&1) {
-                       if(!kbd->scan(kbd->s0))
-                               check_kbd(kbd->table,
-                                         kbd->s0, kbd->s1, kbd->length);
-                       else
-                               memcpy(kbd->s0, kbd->s1, kbd->length);
-               }
-               else {
-                       if(!kbd->scan(kbd->s1))
-                               check_kbd(kbd->table,
-                                         kbd->s1, kbd->s0, kbd->length);
-                       else
-                               memcpy(kbd->s1, kbd->s0, kbd->length);
-               }
-               
-       }
-
-       init_timer(&scan_timer);
-       scan_timer.expires = jiffies + SCANHZ;
-       scan_timer.data = 0;
-       scan_timer.function = scan_kbd;
-       add_timer(&scan_timer);
-}
-
-
-int register_scan_keyboard(int (*scan)(unsigned char *buffer),
-                          const unsigned char *table,
-                          int length)
-{
-       struct scan_keyboard *kbd;
-
-       kbd = kmalloc(sizeof(struct scan_keyboard), GFP_KERNEL);
-       if (kbd == NULL)
-               goto error_out;
-
-       kbd->scan=scan;
-       kbd->table=table;
-       kbd->length=length;
-
-       kbd->s0 = kmalloc(length, GFP_KERNEL);
-       if (kbd->s0 == NULL)
-               goto error_free_kbd;
-
-       kbd->s1 = kmalloc(length, GFP_KERNEL);
-       if (kbd->s1 == NULL)
-               goto error_free_s0;
-
-       memset(kbd->s0, -1, kbd->length);
-       memset(kbd->s1, -1, kbd->length);
-       
-       kbd->next=keyboards;
-       keyboards=kbd;
-
-       return 0;
-
- error_free_s0:
-       kfree(kbd->s0);
-
- error_free_kbd:
-       kfree(kbd);
-
- error_out:
-       return -ENOMEM;
-}
-                             
-                             
-void __init scan_kbd_init(void)
-{
-       init_timer(&scan_timer);
-       scan_timer.expires = jiffies + SCANHZ;
-       scan_timer.data = 0;
-       scan_timer.function = scan_kbd;
-       add_timer(&scan_timer);
-
-       printk(KERN_INFO "Generic scan keyboard driver initialized\n");
-}
diff --git a/drivers/char/scan_keyb.h b/drivers/char/scan_keyb.h
deleted file mode 100644 (file)
index b4b6112..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef        __DRIVER_CHAR_SCAN_KEYB_H
-#define        __DRIVER_CHAR_SCAN_KEYB_H
-/*
- *     $Id: scan_keyb.h,v 1.1 2000/06/10 21:45:30 yaegashi Exp $
- *     Copyright (C) 2000 YAEGASHI Takeshi
- *     Generic scan keyboard driver
- */
-
-int register_scan_keyboard(int (*scan)(unsigned char *buffer),
-                          const unsigned char *table,
-                          int length);
-
-void __init scan_kbd_init(void);
-
-#endif
index 75de5f66517aeb81bf3cec37db24baebaa03379a..3c869145bfdcb1169ab41c4a49633051212ab964 100644 (file)
@@ -86,7 +86,6 @@
 #include <linux/module.h>
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
index af50d32ae2c75a97fef06148de07d97c5713ef24..5fd314adc1f28d864805bea180d2f87a77d06741 100644 (file)
@@ -111,12 +111,13 @@ u_char initial_console_speed;
 
 /* This is the per-port data structure */
 struct cyclades_port cy_port[] = {
-      /* CARD#  */
-        {-1 },      /* ttyS0 */
-        {-1 },      /* ttyS1 */
-        {-1 },      /* ttyS2 */
-        {-1 },      /* ttyS3 */
+       /* CARD#  */
+       {-1},                   /* ttyS0 */
+       {-1},                   /* ttyS1 */
+       {-1},                   /* ttyS2 */
+       {-1},                   /* ttyS3 */
 };
+
 #define NR_PORTS        ARRAY_SIZE(cy_port)
 
 /*
@@ -128,42 +129,46 @@ struct cyclades_port cy_port[] = {
  *                                                  HI            VHI
  */
 static int baud_table[] = {
-           0,    50,    75,   110,   134,   150,   200,   300,   600,  1200,
-        1800,  2400,  4800,  9600, 19200, 38400, 57600, 76800,115200,150000,
-        0};
+       0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
+       1800, 2400, 4800, 9600, 19200, 38400, 57600, 76800, 115200, 150000,
+       0
+};
 
 #if 0
-static char baud_co[] = {  /* 25 MHz clock option table */
-        /* value =>    00    01   02    03    04 */
-        /* divide by    8    32   128   512  2048 */
-        0x00,  0x04,  0x04,  0x04,  0x04,  0x04,  0x03,  0x03,  0x03,  0x02,
-        0x02,  0x02,  0x01,  0x01,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00};
+static char baud_co[] = {      /* 25 MHz clock option table */
+       /* value =>    00    01   02    03    04 */
+       /* divide by    8    32   128   512  2048 */
+       0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x02,
+       0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
 
-static char baud_bpr[] = {  /* 25 MHz baud rate period table */
-        0x00,  0xf5,  0xa3,  0x6f,  0x5c,  0x51,  0xf5,  0xa3,  0x51,  0xa3,
-        0x6d,  0x51,  0xa3,  0x51,  0xa3,  0x51,  0x36,  0x29,  0x1b,  0x15};
+static char baud_bpr[] = {     /* 25 MHz baud rate period table */
+       0x00, 0xf5, 0xa3, 0x6f, 0x5c, 0x51, 0xf5, 0xa3, 0x51, 0xa3,
+       0x6d, 0x51, 0xa3, 0x51, 0xa3, 0x51, 0x36, 0x29, 0x1b, 0x15
+};
 #endif
 
 /* I think 166 brd clocks 2401 at 20MHz.... */
 
 /* These values are written directly to tcor, and >> 5 for writing to rcor */
-static u_char baud_co[] = {  /* 20 MHz clock option table */
-        0x00,  0x80,  0x80,  0x80,  0x80,  0x80,  0x80,  0x60,  0x60,  0x40,
-        0x40,  0x40,  0x20,  0x20,  0x00,  0x00,  0x00,  0x00,  0x00,  0x00};
+static u_char baud_co[] = {    /* 20 MHz clock option table */
+       0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x60, 0x60, 0x40,
+       0x40, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
 
 /* These values written directly to tbpr/rbpr */
-static u_char baud_bpr[] = {  /* 20 MHz baud rate period table */
-        0x00,  0xc0,  0x80,  0x58,  0x6c,  0x40,  0xc0,  0x81,  0x40,  0x81,
-        0x57,  0x40,  0x81,  0x40,  0x81,  0x40,  0x2b,  0x20,  0x15,  0x10};
-
-static u_char baud_cor4[] = {  /* receive threshold */
-        0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,  0x0a,
-        0x0a,  0x0a,  0x0a,  0x09,  0x09,  0x08,  0x08,  0x08,  0x08,  0x07};
-
+static u_char baud_bpr[] = {   /* 20 MHz baud rate period table */
+       0x00, 0xc0, 0x80, 0x58, 0x6c, 0x40, 0xc0, 0x81, 0x40, 0x81,
+       0x57, 0x40, 0x81, 0x40, 0x81, 0x40, 0x2b, 0x20, 0x15, 0x10
+};
 
+static u_char baud_cor4[] = {  /* receive threshold */
+       0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+       0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x07
+};
 
 static void shutdown(struct cyclades_port *);
-static int startup (struct cyclades_port *);
+static int startup(struct cyclades_port *);
 static void cy_throttle(struct tty_struct *);
 static void cy_unthrottle(struct tty_struct *);
 static void config_setup(struct cyclades_port *);
@@ -174,16 +179,16 @@ static void show_status(int);
 
 #ifdef CONFIG_REMOTE_DEBUG
 static void debug_setup(void);
-void queueDebugChar (int c);
+void queueDebugChar(int c);
 int getDebugChar(void);
 
 #define DEBUG_PORT     1
 #define DEBUG_LEN      256
 
 typedef struct {
-       int     in;
-       int     out;
-       unsigned char   buf[DEBUG_LEN];
+       int in;
+       int out;
+       unsigned char buf[DEBUG_LEN];
 } debugq;
 
 debugq debugiq;
@@ -196,7 +201,7 @@ debugq debugiq;
  * delay, but this wild guess will do for now.
  */
 
-void my_udelay (long us)
+void my_udelay(long us)
 {
        u_char x;
        volatile u_char *p = &x;
@@ -207,62 +212,73 @@ void my_udelay (long us)
                        x |= *p;
 }
 
-static inline int
-serial_paranoia_check(struct cyclades_port *info, char *name,
-                     const char *routine)
+static inline int serial_paranoia_check(struct cyclades_port *info, char *name,
+               const char *routine)
 {
 #ifdef SERIAL_PARANOIA_CHECK
-    static const char *badmagic =
-       "Warning: bad magic number for serial struct (%s) in %s\n";
-    static const char *badinfo =
-       "Warning: null cyclades_port for (%s) in %s\n";
-    static const char *badrange =
-       "Warning: cyclades_port out of range for (%s) in %s\n";
-
-    if (!info) {
-       printk(badinfo, name, routine);
-       return 1;
-    }
-
-    if( (long)info < (long)(&cy_port[0])
-    || (long)(&cy_port[NR_PORTS]) < (long)info ){
-       printk(badrange, name, routine);
-       return 1;
-    }
-
-    if (info->magic != CYCLADES_MAGIC) {
-       printk(badmagic, name, routine);
-       return 1;
-    }
+       if (!info) {
+               printk("Warning: null cyclades_port for (%s) in %s\n", name,
+                               routine);
+               return 1;
+       }
+
+       if ((long)info < (long)(&cy_port[0])
+           || (long)(&cy_port[NR_PORTS]) < (long)info) {
+               printk("Warning: cyclades_port out of range for (%s) in %s\n",
+                               name, routine);
+               return 1;
+       }
+
+       if (info->magic != CYCLADES_MAGIC) {
+               printk("Warning: bad magic number for serial struct (%s) in "
+                               "%s\n", name, routine);
+               return 1;
+       }
 #endif
        return 0;
-} /* serial_paranoia_check */
+}                              /* serial_paranoia_check */
 
 #if 0
 /* The following diagnostic routines allow the driver to spew
    information on the screen, even (especially!) during interrupts.
  */
-void
-SP(char *data){
-  unsigned long flags;
-    local_irq_save(flags);
-        console_print(data);
-    local_irq_restore(flags);
+void SP(char *data)
+{
+       unsigned long flags;
+       local_irq_save(flags);
+       console_print(data);
+       local_irq_restore(flags);
 }
+
 char scrn[2];
-void
-CP(char data){
-  unsigned long flags;
-    local_irq_save(flags);
-        scrn[0] = data;
-        console_print(scrn);
-    local_irq_restore(flags);
-}/* CP */
+void CP(char data)
+{
+       unsigned long flags;
+       local_irq_save(flags);
+       scrn[0] = data;
+       console_print(scrn);
+       local_irq_restore(flags);
+}                              /* CP */
 
-void CP1(int data) { (data<10)?  CP(data+'0'): CP(data+'A'-10); }/* CP1 */
-void CP2(int data) { CP1((data>>4) & 0x0f); CP1( data & 0x0f); }/* CP2 */
-void CP4(int data) { CP2((data>>8) & 0xff); CP2(data & 0xff); }/* CP4 */
-void CP8(long data) { CP4((data>>16) & 0xffff); CP4(data & 0xffff); }/* CP8 */
+void CP1(int data)
+{
+       (data < 10) ? CP(data + '0') : CP(data + 'A' - 10);
+}                              /* CP1 */
+void CP2(int data)
+{
+       CP1((data >> 4) & 0x0f);
+       CP1(data & 0x0f);
+}                              /* CP2 */
+void CP4(int data)
+{
+       CP2((data >> 8) & 0xff);
+       CP2(data & 0xff);
+}                              /* CP4 */
+void CP8(long data)
+{
+       CP4((data >> 16) & 0xffff);
+       CP4(data & 0xffff);
+}                              /* CP8 */
 #endif
 
 /* This routine waits up to 1000 micro-seconds for the previous
@@ -270,87 +286,78 @@ void CP8(long data) { CP4((data>>16) & 0xffff); CP4(data & 0xffff); }/* CP8 */
    new command.  An error is returned if the previous command
    didn't finish within the time limit.
  */
-u_short
-write_cy_cmd(volatile u_char *base_addr, u_char cmd)
+u_short write_cy_cmd(volatile u_char * base_addr, u_char cmd)
 {
-  unsigned long flags;
-  volatile int  i;
+       unsigned long flags;
+       volatile int i;
 
-    local_irq_save(flags);
+       local_irq_save(flags);
        /* Check to see that the previous command has completed */
-       for(i = 0 ; i < 100 ; i++){
-           if (base_addr[CyCCR] == 0){
-               break;
-           }
-           my_udelay(10L);
+       for (i = 0; i < 100; i++) {
+               if (base_addr[CyCCR] == 0) {
+                       break;
+               }
+               my_udelay(10L);
        }
        /* if the CCR never cleared, the previous command
-           didn't finish within the "reasonable time" */
-       if ( i == 10 ) {
-           local_irq_restore(flags);
-           return (-1);
+          didn't finish within the "reasonable time" */
+       if (i == 10) {
+               local_irq_restore(flags);
+               return (-1);
        }
 
        /* Issue the new command */
        base_addr[CyCCR] = cmd;
-    local_irq_restore(flags);
-    return(0);
-} /* write_cy_cmd */
-
+       local_irq_restore(flags);
+       return (0);
+}                              /* write_cy_cmd */
 
 /* cy_start and cy_stop provide software output flow control as a
    function of XON/XOFF, software CTS, and other such stuff. */
 
-static void
-cy_stop(struct tty_struct *tty)
+static void cy_stop(struct tty_struct *tty)
 {
-  struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
-  volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
-  int channel;
-  unsigned long flags;
+       struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
+       volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
+       int channel;
+       unsigned long flags;
 
 #ifdef SERIAL_DEBUG_OTHER
-    printk("cy_stop %s\n", tty->name); /* */
+       printk("cy_stop %s\n", tty->name);      /* */
 #endif
 
-    if (serial_paranoia_check(info, tty->name, "cy_stop"))
-       return;
-       
-    channel = info->line;
+       if (serial_paranoia_check(info, tty->name, "cy_stop"))
+               return;
 
-    local_irq_save(flags);
-        base_addr[CyCAR] = (u_char)(channel); /* index channel */
-        base_addr[CyIER] &= ~(CyTxMpty|CyTxRdy);
-    local_irq_restore(flags);
+       channel = info->line;
 
-    return;
-} /* cy_stop */
+       local_irq_save(flags);
+       base_addr[CyCAR] = (u_char) (channel);  /* index channel */
+       base_addr[CyIER] &= ~(CyTxMpty | CyTxRdy);
+       local_irq_restore(flags);
+}                              /* cy_stop */
 
-static void
-cy_start(struct tty_struct *tty)
+static void cy_start(struct tty_struct *tty)
 {
-  struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
-  volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
-  int channel;
-  unsigned long flags;
+       struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
+       volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
+       int channel;
+       unsigned long flags;
 
 #ifdef SERIAL_DEBUG_OTHER
-    printk("cy_start %s\n", tty->name); /* */
+       printk("cy_start %s\n", tty->name);     /* */
 #endif
 
-    if (serial_paranoia_check(info, tty->name, "cy_start"))
-       return;
-       
-    channel = info->line;
+       if (serial_paranoia_check(info, tty->name, "cy_start"))
+               return;
 
-    local_irq_save(flags);
-        base_addr[CyCAR] = (u_char)(channel);
-        base_addr[CyIER] |= CyTxMpty;
-    local_irq_restore(flags);
-
-    return;
-} /* cy_start */
+       channel = info->line;
 
+       local_irq_save(flags);
+       base_addr[CyCAR] = (u_char) (channel);
+       base_addr[CyIER] |= CyTxMpty;
+       local_irq_restore(flags);
+}                              /* cy_start */
 
 /*
  * This routine is used by the interrupt handler to schedule
@@ -358,332 +365,332 @@ cy_start(struct tty_struct *tty)
  * (also known as the "bottom half").  This can be called any
  * number of times for any channel without harm.
  */
-static inline void
-cy_sched_event(struct cyclades_port *info, int event)
+static inline void cy_sched_event(struct cyclades_port *info, int event)
 {
-    info->event |= 1 << event; /* remember what kind of event and who */
-    schedule_work(&info->tqueue);
-} /* cy_sched_event */
-
+       info->event |= 1 << event;      /* remember what kind of event and who */
+       schedule_work(&info->tqueue);
+}                              /* cy_sched_event */
 
 /* The real interrupt service routines are called
    whenever the card wants its hand held--chars
    received, out buffer empty, modem change, etc.
  */
-static irqreturn_t
-cd2401_rxerr_interrupt(int irq, void *dev_id)
+static irqreturn_t cd2401_rxerr_interrupt(int irq, void *dev_id)
 {
-    struct tty_struct *tty;
-    struct cyclades_port *info;
-    volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
-    unsigned char err, rfoc;
-    int channel;
-    char data;
-
-    /* determine the channel and change to that context */
-    channel = (u_short ) (base_addr[CyLICR] >> 2);
-    info = &cy_port[channel];
-    info->last_active = jiffies;
-
-    if ((err = base_addr[CyRISR]) & CyTIMEOUT) {
-       /* This is a receive timeout interrupt, ignore it */
-       base_addr[CyREOIR] = CyNOTRANS;
-       return IRQ_HANDLED;
-    }
-
-    /* Read a byte of data if there is any - assume the error
-     * is associated with this character */
+       struct tty_struct *tty;
+       struct cyclades_port *info;
+       volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
+       unsigned char err, rfoc;
+       int channel;
+       char data;
+
+       /* determine the channel and change to that context */
+       channel = (u_short) (base_addr[CyLICR] >> 2);
+       info = &cy_port[channel];
+       info->last_active = jiffies;
+
+       if ((err = base_addr[CyRISR]) & CyTIMEOUT) {
+               /* This is a receive timeout interrupt, ignore it */
+               base_addr[CyREOIR] = CyNOTRANS;
+               return IRQ_HANDLED;
+       }
 
-    if ((rfoc = base_addr[CyRFOC]) != 0)
-       data = base_addr[CyRDR];
-    else
-       data = 0;
+       /* Read a byte of data if there is any - assume the error
+        * is associated with this character */
 
-    /* if there is nowhere to put the data, discard it */
-    if(info->tty == 0) {
+       if ((rfoc = base_addr[CyRFOC]) != 0)
+               data = base_addr[CyRDR];
+       else
+               data = 0;
+
+       /* if there is nowhere to put the data, discard it */
+       if (info->tty == 0) {
+               base_addr[CyREOIR] = rfoc ? 0 : CyNOTRANS;
+               return IRQ_HANDLED;
+       } else {                /* there is an open port for this data */
+               tty = info->tty;
+               if (err & info->ignore_status_mask) {
+                       base_addr[CyREOIR] = rfoc ? 0 : CyNOTRANS;
+                       return IRQ_HANDLED;
+               }
+               if (tty_buffer_request_room(tty, 1) != 0) {
+                       if (err & info->read_status_mask) {
+                               if (err & CyBREAK) {
+                                       tty_insert_flip_char(tty, data,
+                                                            TTY_BREAK);
+                                       if (info->flags & ASYNC_SAK) {
+                                               do_SAK(tty);
+                                       }
+                               } else if (err & CyFRAME) {
+                                       tty_insert_flip_char(tty, data,
+                                                            TTY_FRAME);
+                               } else if (err & CyPARITY) {
+                                       tty_insert_flip_char(tty, data,
+                                                            TTY_PARITY);
+                               } else if (err & CyOVERRUN) {
+                                       tty_insert_flip_char(tty, 0,
+                                                            TTY_OVERRUN);
+                                       /*
+                                          If the flip buffer itself is
+                                          overflowing, we still loose
+                                          the next incoming character.
+                                        */
+                                       if (tty_buffer_request_room(tty, 1) !=
+                                           0) {
+                                               tty_insert_flip_char(tty, data,
+                                                                    TTY_FRAME);
+                                       }
+                                       /* These two conditions may imply */
+                                       /* a normal read should be done. */
+                                       /* else if(data & CyTIMEOUT) */
+                                       /* else if(data & CySPECHAR) */
+                               } else {
+                                       tty_insert_flip_char(tty, 0,
+                                                            TTY_NORMAL);
+                               }
+                       } else {
+                               tty_insert_flip_char(tty, data, TTY_NORMAL);
+                       }
+               } else {
+                       /* there was a software buffer overrun
+                          and nothing could be done about it!!! */
+               }
+       }
+       tty_schedule_flip(tty);
+       /* end of service */
        base_addr[CyREOIR] = rfoc ? 0 : CyNOTRANS;
        return IRQ_HANDLED;
-    }
-    else { /* there is an open port for this data */
-       tty = info->tty;
-       if(err & info->ignore_status_mask){
-           base_addr[CyREOIR] = rfoc ? 0 : CyNOTRANS;
-           return IRQ_HANDLED;
-       }
-       if (tty_buffer_request_room(tty, 1) != 0){
-           if (err & info->read_status_mask){
-               if(err & CyBREAK){
-                   tty_insert_flip_char(tty, data, TTY_BREAK);
-                   if (info->flags & ASYNC_SAK){
-                       do_SAK(tty);
-                   }
-               }else if(err & CyFRAME){
-                   tty_insert_flip_char(tty, data, TTY_FRAME);
-               }else if(err & CyPARITY){
-                   tty_insert_flip_char(tty, data, TTY_PARITY);
-               }else if(err & CyOVERRUN){
-                   tty_insert_flip_char(tty, 0, TTY_OVERRUN);
-                   /*
-                      If the flip buffer itself is
-                      overflowing, we still loose
-                      the next incoming character.
-                    */
-                   if (tty_buffer_request_room(tty, 1) != 0){
-                       tty_insert_flip_char(tty, data, TTY_FRAME);
-                   }
-               /* These two conditions may imply */
-               /* a normal read should be done. */
-               /* else if(data & CyTIMEOUT) */
-               /* else if(data & CySPECHAR) */
-               }else{
-                   tty_insert_flip_char(tty, 0, TTY_NORMAL);
-               }
-           }else{
-               tty_insert_flip_char(tty, data, TTY_NORMAL);
-           }
-       }else{
-           /* there was a software buffer overrun
-              and nothing could be done about it!!! */
-       }
-    }
-    tty_schedule_flip(tty);
-    /* end of service */
-    base_addr[CyREOIR] = rfoc ? 0 : CyNOTRANS;
-    return IRQ_HANDLED;
-} /* cy_rxerr_interrupt */
-
-static irqreturn_t
-cd2401_modem_interrupt(int irq, void *dev_id)
+}                              /* cy_rxerr_interrupt */
+
+static irqreturn_t cd2401_modem_interrupt(int irq, void *dev_id)
 {
-    struct cyclades_port *info;
-    volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
-    int channel;
-    int mdm_change;
-    int mdm_status;
-
-
-    /* determine the channel and change to that context */
-    channel = (u_short ) (base_addr[CyLICR] >> 2);
-    info = &cy_port[channel];
-    info->last_active = jiffies;
-
-    mdm_change = base_addr[CyMISR];
-    mdm_status = base_addr[CyMSVR1];
-
-    if(info->tty == 0){ /* nowhere to put the data, ignore it */
-       ;
-    }else{
-       if((mdm_change & CyDCD)
-       && (info->flags & ASYNC_CHECK_CD)){
-           if(mdm_status & CyDCD){
+       struct cyclades_port *info;
+       volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
+       int channel;
+       int mdm_change;
+       int mdm_status;
+
+       /* determine the channel and change to that context */
+       channel = (u_short) (base_addr[CyLICR] >> 2);
+       info = &cy_port[channel];
+       info->last_active = jiffies;
+
+       mdm_change = base_addr[CyMISR];
+       mdm_status = base_addr[CyMSVR1];
+
+       if (info->tty == 0) {   /* nowhere to put the data, ignore it */
+               ;
+       } else {
+               if ((mdm_change & CyDCD)
+                   && (info->flags & ASYNC_CHECK_CD)) {
+                       if (mdm_status & CyDCD) {
 /* CP('!'); */
-               cy_sched_event(info, Cy_EVENT_OPEN_WAKEUP);
-           } else {
+                               cy_sched_event(info, Cy_EVENT_OPEN_WAKEUP);
+                       } else {
 /* CP('@'); */
-               cy_sched_event(info, Cy_EVENT_HANGUP);
-           }
-       }
-       if((mdm_change & CyCTS)
-       && (info->flags & ASYNC_CTS_FLOW)){
-           if(info->tty->stopped){
-               if(mdm_status & CyCTS){
-                   /* !!! cy_start isn't used because... */
-                   info->tty->stopped = 0;
-                   base_addr[CyIER] |= CyTxMpty;
-                   cy_sched_event(info, Cy_EVENT_WRITE_WAKEUP);
+                               cy_sched_event(info, Cy_EVENT_HANGUP);
+                       }
                }
-           }else{
-               if(!(mdm_status & CyCTS)){
-                   /* !!! cy_stop isn't used because... */
-                   info->tty->stopped = 1;
-                   base_addr[CyIER] &= ~(CyTxMpty|CyTxRdy);
+               if ((mdm_change & CyCTS)
+                   && (info->flags & ASYNC_CTS_FLOW)) {
+                       if (info->tty->stopped) {
+                               if (mdm_status & CyCTS) {
+                                       /* !!! cy_start isn't used because... */
+                                       info->tty->stopped = 0;
+                                       base_addr[CyIER] |= CyTxMpty;
+                                       cy_sched_event(info,
+                                                      Cy_EVENT_WRITE_WAKEUP);
+                               }
+                       } else {
+                               if (!(mdm_status & CyCTS)) {
+                                       /* !!! cy_stop isn't used because... */
+                                       info->tty->stopped = 1;
+                                       base_addr[CyIER] &=
+                                           ~(CyTxMpty | CyTxRdy);
+                               }
+                       }
+               }
+               if (mdm_status & CyDSR) {
                }
-           }
-       }
-       if(mdm_status & CyDSR){
        }
-    }
-    base_addr[CyMEOIR] = 0;
-    return IRQ_HANDLED;
-} /* cy_modem_interrupt */
+       base_addr[CyMEOIR] = 0;
+       return IRQ_HANDLED;
+}                              /* cy_modem_interrupt */
 
-static irqreturn_t
-cd2401_tx_interrupt(int irq, void *dev_id)
+static irqreturn_t cd2401_tx_interrupt(int irq, void *dev_id)
 {
-    struct cyclades_port *info;
-    volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
-    int channel;
-    int char_count, saved_cnt;
-    int outch;
+       struct cyclades_port *info;
+       volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
+       int channel;
+       int char_count, saved_cnt;
+       int outch;
 
-    /* determine the channel and change to that context */
-    channel = (u_short ) (base_addr[CyLICR] >> 2);
+       /* determine the channel and change to that context */
+       channel = (u_short) (base_addr[CyLICR] >> 2);
 
 #ifdef CONFIG_REMOTE_DEBUG
-    if (channel == DEBUG_PORT) {
-       panic ("TxInt on debug port!!!");
-    }
+       if (channel == DEBUG_PORT) {
+               panic("TxInt on debug port!!!");
+       }
 #endif
 
-    info = &cy_port[channel];
+       info = &cy_port[channel];
 
-    /* validate the port number (as configured and open) */
-    if( (channel < 0) || (NR_PORTS <= channel) ){
-       base_addr[CyIER] &= ~(CyTxMpty|CyTxRdy);
-       base_addr[CyTEOIR] = CyNOTRANS;
-       return IRQ_HANDLED;
-    }
-    info->last_active = jiffies;
-    if(info->tty == 0){
-       base_addr[CyIER] &= ~(CyTxMpty|CyTxRdy);
-        if (info->xmit_cnt < WAKEUP_CHARS) {
-           cy_sched_event(info, Cy_EVENT_WRITE_WAKEUP);
-        }
-       base_addr[CyTEOIR] = CyNOTRANS;
-       return IRQ_HANDLED;
-    }
-
-    /* load the on-chip space available for outbound data */
-    saved_cnt = char_count = base_addr[CyTFTC];
-
-    if(info->x_char) { /* send special char */
-       outch = info->x_char;
-       base_addr[CyTDR] = outch;
-       char_count--;
-       info->x_char = 0;
-    }
-
-    if (info->x_break){
-       /*  The Cirrus chip requires the "Embedded Transmit
-           Commands" of start break, delay, and end break
-           sequences to be sent.  The duration of the
-           break is given in TICs, which runs at HZ
-           (typically 100) and the PPR runs at 200 Hz,
-           so the delay is duration * 200/HZ, and thus a
-           break can run from 1/100 sec to about 5/4 sec.
-           Need to check these values - RGH 141095.
-        */
-       base_addr[CyTDR] = 0; /* start break */
-       base_addr[CyTDR] = 0x81;
-       base_addr[CyTDR] = 0; /* delay a bit */
-       base_addr[CyTDR] = 0x82;
-       base_addr[CyTDR] = info->x_break*200/HZ;
-       base_addr[CyTDR] = 0; /* terminate break */
-       base_addr[CyTDR] = 0x83;
-       char_count -= 7;
-       info->x_break = 0;
-    }
-
-    while (char_count > 0){
-       if (!info->xmit_cnt){
-           base_addr[CyIER] &= ~(CyTxMpty|CyTxRdy);
-           break;
-       }
-       if (info->xmit_buf == 0){
-           base_addr[CyIER] &= ~(CyTxMpty|CyTxRdy);
-           break;
-       }
-       if (info->tty->stopped || info->tty->hw_stopped){
-           base_addr[CyIER] &= ~(CyTxMpty|CyTxRdy);
-           break;
-       }
-       /* Because the Embedded Transmit Commands have been
-          enabled, we must check to see if the escape
-          character, NULL, is being sent.  If it is, we
-          must ensure that there is room for it to be
-          doubled in the output stream.  Therefore we
-          no longer advance the pointer when the character
-          is fetched, but rather wait until after the check
-          for a NULL output character. (This is necessary
-          because there may not be room for the two chars
-          needed to send a NULL.
-        */
-       outch = info->xmit_buf[info->xmit_tail];
-       if( outch ){
-           info->xmit_cnt--;
-           info->xmit_tail = (info->xmit_tail + 1)
-                                     & (PAGE_SIZE - 1);
-           base_addr[CyTDR] = outch;
-           char_count--;
-       }else{
-           if(char_count > 1){
-               info->xmit_cnt--;
-               info->xmit_tail = (info->xmit_tail + 1)
-                                         & (PAGE_SIZE - 1);
+       /* validate the port number (as configured and open) */
+       if ((channel < 0) || (NR_PORTS <= channel)) {
+               base_addr[CyIER] &= ~(CyTxMpty | CyTxRdy);
+               base_addr[CyTEOIR] = CyNOTRANS;
+               return IRQ_HANDLED;
+       }
+       info->last_active = jiffies;
+       if (info->tty == 0) {
+               base_addr[CyIER] &= ~(CyTxMpty | CyTxRdy);
+               if (info->xmit_cnt < WAKEUP_CHARS) {
+                       cy_sched_event(info, Cy_EVENT_WRITE_WAKEUP);
+               }
+               base_addr[CyTEOIR] = CyNOTRANS;
+               return IRQ_HANDLED;
+       }
+
+       /* load the on-chip space available for outbound data */
+       saved_cnt = char_count = base_addr[CyTFTC];
+
+       if (info->x_char) {     /* send special char */
+               outch = info->x_char;
                base_addr[CyTDR] = outch;
-               base_addr[CyTDR] = 0;
                char_count--;
-               char_count--;
-           }else{
-               break;
-           }
+               info->x_char = 0;
        }
-    }
 
-    if (info->xmit_cnt < WAKEUP_CHARS) {
-       cy_sched_event(info, Cy_EVENT_WRITE_WAKEUP);
-    }
-    base_addr[CyTEOIR] = (char_count != saved_cnt) ? 0 : CyNOTRANS;
-    return IRQ_HANDLED;
-} /* cy_tx_interrupt */
+       if (info->x_break) {
+               /*  The Cirrus chip requires the "Embedded Transmit
+                  Commands" of start break, delay, and end break
+                  sequences to be sent.  The duration of the
+                  break is given in TICs, which runs at HZ
+                  (typically 100) and the PPR runs at 200 Hz,
+                  so the delay is duration * 200/HZ, and thus a
+                  break can run from 1/100 sec to about 5/4 sec.
+                  Need to check these values - RGH 141095.
+                */
+               base_addr[CyTDR] = 0;   /* start break */
+               base_addr[CyTDR] = 0x81;
+               base_addr[CyTDR] = 0;   /* delay a bit */
+               base_addr[CyTDR] = 0x82;
+               base_addr[CyTDR] = info->x_break * 200 / HZ;
+               base_addr[CyTDR] = 0;   /* terminate break */
+               base_addr[CyTDR] = 0x83;
+               char_count -= 7;
+               info->x_break = 0;
+       }
+
+       while (char_count > 0) {
+               if (!info->xmit_cnt) {
+                       base_addr[CyIER] &= ~(CyTxMpty | CyTxRdy);
+                       break;
+               }
+               if (info->xmit_buf == 0) {
+                       base_addr[CyIER] &= ~(CyTxMpty | CyTxRdy);
+                       break;
+               }
+               if (info->tty->stopped || info->tty->hw_stopped) {
+                       base_addr[CyIER] &= ~(CyTxMpty | CyTxRdy);
+                       break;
+               }
+               /* Because the Embedded Transmit Commands have been
+                  enabled, we must check to see if the escape
+                  character, NULL, is being sent.  If it is, we
+                  must ensure that there is room for it to be
+                  doubled in the output stream.  Therefore we
+                  no longer advance the pointer when the character
+                  is fetched, but rather wait until after the check
+                  for a NULL output character. (This is necessary
+                  because there may not be room for the two chars
+                  needed to send a NULL.
+                */
+               outch = info->xmit_buf[info->xmit_tail];
+               if (outch) {
+                       info->xmit_cnt--;
+                       info->xmit_tail = (info->xmit_tail + 1)
+                           & (PAGE_SIZE - 1);
+                       base_addr[CyTDR] = outch;
+                       char_count--;
+               } else {
+                       if (char_count > 1) {
+                               info->xmit_cnt--;
+                               info->xmit_tail = (info->xmit_tail + 1)
+                                   & (PAGE_SIZE - 1);
+                               base_addr[CyTDR] = outch;
+                               base_addr[CyTDR] = 0;
+                               char_count--;
+                               char_count--;
+                       } else {
+                               break;
+                       }
+               }
+       }
+
+       if (info->xmit_cnt < WAKEUP_CHARS) {
+               cy_sched_event(info, Cy_EVENT_WRITE_WAKEUP);
+       }
+       base_addr[CyTEOIR] = (char_count != saved_cnt) ? 0 : CyNOTRANS;
+       return IRQ_HANDLED;
+}                              /* cy_tx_interrupt */
 
-static irqreturn_t
-cd2401_rx_interrupt(int irq, void *dev_id)
+static irqreturn_t cd2401_rx_interrupt(int irq, void *dev_id)
 {
-    struct tty_struct *tty;
-    struct cyclades_port *info;
-    volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
-    int channel;
-    char data;
-    int char_count;
-    int save_cnt;
-    int len;
-
-    /* determine the channel and change to that context */
-    channel = (u_short ) (base_addr[CyLICR] >> 2);
-    info = &cy_port[channel];
-    info->last_active = jiffies;
-    save_cnt = char_count = base_addr[CyRFOC];
+       struct tty_struct *tty;
+       struct cyclades_port *info;
+       volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
+       int channel;
+       char data;
+       int char_count;
+       int save_cnt;
+       int len;
+
+       /* determine the channel and change to that context */
+       channel = (u_short) (base_addr[CyLICR] >> 2);
+       info = &cy_port[channel];
+       info->last_active = jiffies;
+       save_cnt = char_count = base_addr[CyRFOC];
 
 #ifdef CONFIG_REMOTE_DEBUG
-    if (channel == DEBUG_PORT) {
-       while (char_count--) {
-            data = base_addr[CyRDR];
-           queueDebugChar(data);
-       }
-    }
-    else
+       if (channel == DEBUG_PORT) {
+               while (char_count--) {
+                       data = base_addr[CyRDR];
+                       queueDebugChar(data);
+               }
+       } else
 #endif
-    /* if there is nowhere to put the data, discard it */
-    if(info->tty == 0){
-       while(char_count--){
-           data = base_addr[CyRDR];
-       }
-    }else{ /* there is an open port for this data */
-       tty = info->tty;
-       /* load # characters available from the chip */
+               /* if there is nowhere to put the data, discard it */
+       if (info->tty == 0) {
+               while (char_count--) {
+                       data = base_addr[CyRDR];
+               }
+       } else {                /* there is an open port for this data */
+               tty = info->tty;
+               /* load # characters available from the chip */
 
 #ifdef CYCLOM_ENABLE_MONITORING
-       ++info->mon.int_count;
-       info->mon.char_count += char_count;
-       if (char_count > info->mon.char_max)
-           info->mon.char_max = char_count;
-       info->mon.char_last = char_count;
-#endif
-       len = tty_buffer_request_room(tty, char_count);
-       while(len--){
-           data = base_addr[CyRDR];
-           tty_insert_flip_char(tty, data, TTY_NORMAL);
+               ++info->mon.int_count;
+               info->mon.char_count += char_count;
+               if (char_count > info->mon.char_max)
+                       info->mon.char_max = char_count;
+               info->mon.char_last = char_count;
+#endif
+               len = tty_buffer_request_room(tty, char_count);
+               while (len--) {
+                       data = base_addr[CyRDR];
+                       tty_insert_flip_char(tty, data, TTY_NORMAL);
 #ifdef CYCLOM_16Y_HACK
-           udelay(10L);
+                       udelay(10L);
 #endif
-        }
-       tty_schedule_flip(tty);
-    }
-    /* end of service */
-    base_addr[CyREOIR] = save_cnt ? 0 : CyNOTRANS;
-    return IRQ_HANDLED;
-} /* cy_rx_interrupt */
+               }
+               tty_schedule_flip(tty);
+       }
+       /* end of service */
+       base_addr[CyREOIR] = save_cnt ? 0 : CyNOTRANS;
+       return IRQ_HANDLED;
+}                              /* cy_rx_interrupt */
 
 /*
  * This routine is used to handle the "bottom half" processing for the
@@ -705,192 +712,188 @@ cd2401_rx_interrupt(int irq, void *dev_id)
  * structure) to the bottom half of the driver.  Previous kernels
  * had to poll every port to see if that port needed servicing.
  */
-static void
-do_softint(struct work_struct *ugly_api)
+static void do_softint(struct work_struct *ugly_api)
 {
-  struct cyclades_port *info = container_of(ugly_api, struct cyclades_port, tqueue);
-  struct tty_struct    *tty;
-
-    tty = info->tty;
-    if (!tty)
-       return;
+       struct cyclades_port *info =
+           container_of(ugly_api, struct cyclades_port, tqueue);
+       struct tty_struct *tty;
 
-    if (test_and_clear_bit(Cy_EVENT_HANGUP, &info->event)) {
-       tty_hangup(info->tty);
-       wake_up_interruptible(&info->open_wait);
-       info->flags &= ~ASYNC_NORMAL_ACTIVE;
-    }
-    if (test_and_clear_bit(Cy_EVENT_OPEN_WAKEUP, &info->event)) {
-       wake_up_interruptible(&info->open_wait);
-    }
-    if (test_and_clear_bit(Cy_EVENT_WRITE_WAKEUP, &info->event)) {
-       tty_wakeup(tty);
-    }
-} /* do_softint */
+       tty = info->tty;
+       if (!tty)
+               return;
 
+       if (test_and_clear_bit(Cy_EVENT_HANGUP, &info->event)) {
+               tty_hangup(info->tty);
+               wake_up_interruptible(&info->open_wait);
+               info->flags &= ~ASYNC_NORMAL_ACTIVE;
+       }
+       if (test_and_clear_bit(Cy_EVENT_OPEN_WAKEUP, &info->event)) {
+               wake_up_interruptible(&info->open_wait);
+       }
+       if (test_and_clear_bit(Cy_EVENT_WRITE_WAKEUP, &info->event)) {
+               tty_wakeup(tty);
+       }
+}                              /* do_softint */
 
 /* This is called whenever a port becomes active;
    interrupts are enabled and DTR & RTS are turned on.
  */
-static int
-startup(struct cyclades_port * info)
+static int startup(struct cyclades_port *info)
 {
-  unsigned long flags;
-  volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
-  int channel;
+       unsigned long flags;
+       volatile unsigned char *base_addr = (unsigned char *)BASE_ADDR;
+       int channel;
 
-    if (info->flags & ASYNC_INITIALIZED){
-       return 0;
-    }
+       if (info->flags & ASYNC_INITIALIZED) {
+               return 0;
+       }
 
-    if (!info->type){
-       if (info->tty){
-           set_bit(TTY_IO_ERROR, &info->tty->flags);
+       if (!info->type) {
+               if (info->tty) {
+                       set_bit(TTY_IO_ERROR, &info->tty->flags);
+               }
+               return 0;
        }
-       return 0;
-    }
-    if (!info->xmit_buf){
-       info->xmit_buf = (unsigned char *) get_zeroed_page (GFP_KERNEL);
-       if (!info->xmit_buf){
-           return -ENOMEM;
+       if (!info->xmit_buf) {
+               info->xmit_buf = (unsigned char *)get_zeroed_page(GFP_KERNEL);
+               if (!info->xmit_buf) {
+                       return -ENOMEM;
+               }
        }
-    }
 
-    config_setup(info);
+       config_setup(info);
 
-    channel = info->line;
+       channel = info->line;
 
 #ifdef SERIAL_DEBUG_OPEN
-    printk("startup channel %d\n", channel);
+       printk("startup channel %d\n", channel);
 #endif
 
-    local_irq_save(flags);
-       base_addr[CyCAR] = (u_char)channel;
-       write_cy_cmd(base_addr,CyENB_RCVR|CyENB_XMTR);
+       local_irq_save(flags);
+       base_addr[CyCAR] = (u_char) channel;
+       write_cy_cmd(base_addr, CyENB_RCVR | CyENB_XMTR);
 
-       base_addr[CyCAR] = (u_char)channel; /* !!! Is this needed? */
+       base_addr[CyCAR] = (u_char) channel;    /* !!! Is this needed? */
        base_addr[CyMSVR1] = CyRTS;
 /* CP('S');CP('1'); */
        base_addr[CyMSVR2] = CyDTR;
 
 #ifdef SERIAL_DEBUG_DTR
-        printk("cyc: %d: raising DTR\n", __LINE__);
-        printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1], base_addr[CyMSVR2]);
+       printk("cyc: %d: raising DTR\n", __LINE__);
+       printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1],
+              base_addr[CyMSVR2]);
 #endif
 
        base_addr[CyIER] |= CyRxData;
        info->flags |= ASYNC_INITIALIZED;
 
-       if (info->tty){
-           clear_bit(TTY_IO_ERROR, &info->tty->flags);
+       if (info->tty) {
+               clear_bit(TTY_IO_ERROR, &info->tty->flags);
        }
        info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
 
-    local_irq_restore(flags);
+       local_irq_restore(flags);
 
 #ifdef SERIAL_DEBUG_OPEN
-    printk(" done\n");
+       printk(" done\n");
 #endif
-    return 0;
-} /* startup */
+       return 0;
+}                              /* startup */
 
-void
-start_xmit( struct cyclades_port *info )
+void start_xmit(struct cyclades_port *info)
 {
-  unsigned long flags;
-  volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
-  int channel;
+       unsigned long flags;
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
+       int channel;
 
-    channel = info->line;
-    local_irq_save(flags);
+       channel = info->line;
+       local_irq_save(flags);
        base_addr[CyCAR] = channel;
        base_addr[CyIER] |= CyTxMpty;
-    local_irq_restore(flags);
-} /* start_xmit */
+       local_irq_restore(flags);
+}                              /* start_xmit */
 
 /*
  * This routine shuts down a serial port; interrupts are disabled,
  * and DTR is dropped if the hangup on close termio flag is on.
  */
-static void
-shutdown(struct cyclades_port * info)
+static void shutdown(struct cyclades_port *info)
 {
-  unsigned long flags;
-  volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
-  int channel;
+       unsigned long flags;
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
+       int channel;
 
-    if (!(info->flags & ASYNC_INITIALIZED)){
+       if (!(info->flags & ASYNC_INITIALIZED)) {
 /* CP('$'); */
-       return;
-    }
+               return;
+       }
 
-    channel = info->line;
+       channel = info->line;
 
 #ifdef SERIAL_DEBUG_OPEN
-    printk("shutdown channel %d\n", channel);
+       printk("shutdown channel %d\n", channel);
 #endif
 
-    /* !!! REALLY MUST WAIT FOR LAST CHARACTER TO BE
-       SENT BEFORE DROPPING THE LINE !!!  (Perhaps
-       set some flag that is read when XMTY happens.)
-       Other choices are to delay some fixed interval
-       or schedule some later processing.
-     */
-    local_irq_save(flags);
-       if (info->xmit_buf){
-           free_page((unsigned long) info->xmit_buf);
-           info->xmit_buf = NULL;
+       /* !!! REALLY MUST WAIT FOR LAST CHARACTER TO BE
+          SENT BEFORE DROPPING THE LINE !!!  (Perhaps
+          set some flag that is read when XMTY happens.)
+          Other choices are to delay some fixed interval
+          or schedule some later processing.
+        */
+       local_irq_save(flags);
+       if (info->xmit_buf) {
+               free_page((unsigned long)info->xmit_buf);
+               info->xmit_buf = NULL;
        }
 
-       base_addr[CyCAR] = (u_char)channel;
+       base_addr[CyCAR] = (u_char) channel;
        if (!info->tty || (info->tty->termios->c_cflag & HUPCL)) {
-           base_addr[CyMSVR1] = 0;
+               base_addr[CyMSVR1] = 0;
 /* CP('C');CP('1'); */
-           base_addr[CyMSVR2] = 0;
+               base_addr[CyMSVR2] = 0;
 #ifdef SERIAL_DEBUG_DTR
-            printk("cyc: %d: dropping DTR\n", __LINE__);
-            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1], base_addr[CyMSVR2]);
+               printk("cyc: %d: dropping DTR\n", __LINE__);
+               printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1],
+                      base_addr[CyMSVR2]);
 #endif
-        }
-       write_cy_cmd(base_addr,CyDIS_RCVR);
-         /* it may be appropriate to clear _XMIT at
-           some later date (after testing)!!! */
+       }
+       write_cy_cmd(base_addr, CyDIS_RCVR);
+       /* it may be appropriate to clear _XMIT at
+          some later date (after testing)!!! */
 
-       if (info->tty){
-           set_bit(TTY_IO_ERROR, &info->tty->flags);
+       if (info->tty) {
+               set_bit(TTY_IO_ERROR, &info->tty->flags);
        }
        info->flags &= ~ASYNC_INITIALIZED;
-    local_irq_restore(flags);
+       local_irq_restore(flags);
 
 #ifdef SERIAL_DEBUG_OPEN
-    printk(" done\n");
+       printk(" done\n");
 #endif
-    return;
-} /* shutdown */
+}                              /* shutdown */
 
 /*
  * This routine finds or computes the various line characteristics.
  */
-static void
-config_setup(struct cyclades_port * info)
+static void config_setup(struct cyclades_port *info)
 {
-  unsigned long flags;
-  volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
-  int channel;
-  unsigned cflag;
-  int   i;
-  unsigned char ti, need_init_chan = 0;
-
-    if (!info->tty || !info->tty->termios){
-        return;
-    }
-    if (info->line == -1){
-        return;
-    }
-    cflag = info->tty->termios->c_cflag;
-
-    /* baud rate */
-    i = cflag & CBAUD;
+       unsigned long flags;
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
+       int channel;
+       unsigned cflag;
+       int i;
+       unsigned char ti, need_init_chan = 0;
+
+       if (!info->tty || !info->tty->termios) {
+               return;
+       }
+       if (info->line == -1) {
+               return;
+       }
+       cflag = info->tty->termios->c_cflag;
+
+       /* baud rate */
+       i = cflag & CBAUD;
 #ifdef CBAUDEX
 /* Starting with kernel 1.1.65, there is direct support for
    higher baud rates.  The following code supports those
@@ -900,120 +903,123 @@ config_setup(struct cyclades_port * info)
    is still the possibility of supporting 75 kbit/sec with
    the Cyclades board.)
  */
-    if (i & CBAUDEX) {
-       if (i == B57600)
-           i = 16;
-       else if(i == B115200) 
-           i = 18;
+       if (i & CBAUDEX) {
+               if (i == B57600)
+                       i = 16;
+               else if (i == B115200)
+                       i = 18;
 #ifdef B78600
-       else if(i == B78600) 
-           i = 17;
+               else if (i == B78600)
+                       i = 17;
 #endif
-       else
-           info->tty->termios->c_cflag &= ~CBAUDEX;
-    }
-#endif
-    if (i == 15) {
-           if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
-                   i += 1;
-           if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
-                   i += 3;
-    }
-    /* Don't ever change the speed of the console port.  It will
-     * run at the speed specified in bootinfo, or at 19.2K */
-    /* Actually, it should run at whatever speed 166Bug was using */
-    /* Note info->timeout isn't used at present */
-    if (info != serial_console_info) {
-       info->tbpr = baud_bpr[i]; /* Tx BPR */
-       info->tco = baud_co[i]; /* Tx CO */
-       info->rbpr = baud_bpr[i]; /* Rx BPR */
-       info->rco = baud_co[i] >> 5; /* Rx CO */
-       if (baud_table[i] == 134) {
-            info->timeout = (info->xmit_fifo_size*HZ*30/269) + 2;
-            /* get it right for 134.5 baud */
-       } else if (baud_table[i]) {
-            info->timeout = (info->xmit_fifo_size*HZ*15/baud_table[i]) + 2;
-        /* this needs to be propagated into the card info */
+               else
+                       info->tty->termios->c_cflag &= ~CBAUDEX;
+       }
+#endif
+       if (i == 15) {
+               if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI)
+                       i += 1;
+               if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI)
+                       i += 3;
+       }
+       /* Don't ever change the speed of the console port.  It will
+        * run at the speed specified in bootinfo, or at 19.2K */
+       /* Actually, it should run at whatever speed 166Bug was using */
+       /* Note info->timeout isn't used at present */
+       if (info != serial_console_info) {
+               info->tbpr = baud_bpr[i];       /* Tx BPR */
+               info->tco = baud_co[i]; /* Tx CO */
+               info->rbpr = baud_bpr[i];       /* Rx BPR */
+               info->rco = baud_co[i] >> 5;    /* Rx CO */
+               if (baud_table[i] == 134) {
+                       info->timeout =
+                           (info->xmit_fifo_size * HZ * 30 / 269) + 2;
+                       /* get it right for 134.5 baud */
+               } else if (baud_table[i]) {
+                       info->timeout =
+                           (info->xmit_fifo_size * HZ * 15 / baud_table[i]) +
+                           2;
+                       /* this needs to be propagated into the card info */
+               } else {
+                       info->timeout = 0;
+               }
+       }
+       /* By tradition (is it a standard?) a baud rate of zero
+          implies the line should be/has been closed.  A bit
+          later in this routine such a test is performed. */
+
+       /* byte size and parity */
+       info->cor7 = 0;
+       info->cor6 = 0;
+       info->cor5 = 0;
+       info->cor4 = (info->default_threshold ? info->default_threshold : baud_cor4[i]);        /* receive threshold */
+       /* Following two lines added 101295, RGH. */
+       /* It is obviously wrong to access CyCORx, and not info->corx here,
+        * try and remember to fix it later! */
+       channel = info->line;
+       base_addr[CyCAR] = (u_char) channel;
+       if (C_CLOCAL(info->tty)) {
+               if (base_addr[CyIER] & CyMdmCh)
+                       base_addr[CyIER] &= ~CyMdmCh;   /* without modem intr */
+               /* ignore 1->0 modem transitions */
+               if (base_addr[CyCOR4] & (CyDSR | CyCTS | CyDCD))
+                       base_addr[CyCOR4] &= ~(CyDSR | CyCTS | CyDCD);
+               /* ignore 0->1 modem transitions */
+               if (base_addr[CyCOR5] & (CyDSR | CyCTS | CyDCD))
+                       base_addr[CyCOR5] &= ~(CyDSR | CyCTS | CyDCD);
        } else {
-            info->timeout = 0;
-       }
-    }
-    /* By tradition (is it a standard?) a baud rate of zero
-       implies the line should be/has been closed.  A bit
-       later in this routine such a test is performed. */
-
-    /* byte size and parity */
-    info->cor7 = 0;
-    info->cor6 = 0;
-    info->cor5 = 0;
-    info->cor4 = (info->default_threshold
-                 ? info->default_threshold
-                 : baud_cor4[i]); /* receive threshold */
-    /* Following two lines added 101295, RGH. */
-    /* It is obviously wrong to access CyCORx, and not info->corx here,
-     * try and remember to fix it later! */
-    channel = info->line;
-    base_addr[CyCAR] = (u_char)channel;
-    if (C_CLOCAL(info->tty)) {
-       if (base_addr[CyIER] & CyMdmCh)
-           base_addr[CyIER] &= ~CyMdmCh; /* without modem intr */
-                              /* ignore 1->0 modem transitions */
-       if (base_addr[CyCOR4] & (CyDSR|CyCTS|CyDCD))
-           base_addr[CyCOR4] &= ~(CyDSR|CyCTS|CyDCD);
-                              /* ignore 0->1 modem transitions */
-       if (base_addr[CyCOR5] & (CyDSR|CyCTS|CyDCD))
-           base_addr[CyCOR5] &= ~(CyDSR|CyCTS|CyDCD);
-    } else {
-       if ((base_addr[CyIER] & CyMdmCh) != CyMdmCh)
-           base_addr[CyIER] |= CyMdmCh; /* with modem intr */
-                              /* act on 1->0 modem transitions */
-       if ((base_addr[CyCOR4] & (CyDSR|CyCTS|CyDCD)) != (CyDSR|CyCTS|CyDCD))
-           base_addr[CyCOR4] |= CyDSR|CyCTS|CyDCD;
-                              /* act on 0->1 modem transitions */
-       if ((base_addr[CyCOR5] & (CyDSR|CyCTS|CyDCD)) != (CyDSR|CyCTS|CyDCD))
-           base_addr[CyCOR5] |= CyDSR|CyCTS|CyDCD;
-    }
-    info->cor3 = (cflag & CSTOPB) ? Cy_2_STOP : Cy_1_STOP;
-    info->cor2 = CyETC;
-    switch(cflag & CSIZE){
-    case CS5:
-        info->cor1 = Cy_5_BITS;
-        break;
-    case CS6:
-        info->cor1 = Cy_6_BITS;
-        break;
-    case CS7:
-        info->cor1 = Cy_7_BITS;
-        break;
-    case CS8:
-        info->cor1 = Cy_8_BITS;
-        break;
-    }
-    if (cflag & PARENB){
-        if (cflag & PARODD){
-            info->cor1 |= CyPARITY_O;
-        }else{
-            info->cor1 |= CyPARITY_E;
-        }
-    }else{
-        info->cor1 |= CyPARITY_NONE;
-    }
-       
-    /* CTS flow control flag */
+               if ((base_addr[CyIER] & CyMdmCh) != CyMdmCh)
+                       base_addr[CyIER] |= CyMdmCh;    /* with modem intr */
+               /* act on 1->0 modem transitions */
+               if ((base_addr[CyCOR4] & (CyDSR | CyCTS | CyDCD)) !=
+                   (CyDSR | CyCTS | CyDCD))
+                       base_addr[CyCOR4] |= CyDSR | CyCTS | CyDCD;
+               /* act on 0->1 modem transitions */
+               if ((base_addr[CyCOR5] & (CyDSR | CyCTS | CyDCD)) !=
+                   (CyDSR | CyCTS | CyDCD))
+                       base_addr[CyCOR5] |= CyDSR | CyCTS | CyDCD;
+       }
+       info->cor3 = (cflag & CSTOPB) ? Cy_2_STOP : Cy_1_STOP;
+       info->cor2 = CyETC;
+       switch (cflag & CSIZE) {
+       case CS5:
+               info->cor1 = Cy_5_BITS;
+               break;
+       case CS6:
+               info->cor1 = Cy_6_BITS;
+               break;
+       case CS7:
+               info->cor1 = Cy_7_BITS;
+               break;
+       case CS8:
+               info->cor1 = Cy_8_BITS;
+               break;
+       }
+       if (cflag & PARENB) {
+               if (cflag & PARODD) {
+                       info->cor1 |= CyPARITY_O;
+               } else {
+                       info->cor1 |= CyPARITY_E;
+               }
+       } else {
+               info->cor1 |= CyPARITY_NONE;
+       }
+
+       /* CTS flow control flag */
 #if 0
-    /* Don't complcate matters for now! RGH 141095 */
-    if (cflag & CRTSCTS){
-       info->flags |= ASYNC_CTS_FLOW;
-       info->cor2 |= CyCtsAE;
-    }else{
-       info->flags &= ~ASYNC_CTS_FLOW;
-       info->cor2 &= ~CyCtsAE;
-    }
-#endif
-    if (cflag & CLOCAL)
-       info->flags &= ~ASYNC_CHECK_CD;
-    else
-       info->flags |= ASYNC_CHECK_CD;
+       /* Don't complcate matters for now! RGH 141095 */
+       if (cflag & CRTSCTS) {
+               info->flags |= ASYNC_CTS_FLOW;
+               info->cor2 |= CyCtsAE;
+       } else {
+               info->flags &= ~ASYNC_CTS_FLOW;
+               info->cor2 &= ~CyCtsAE;
+       }
+#endif
+       if (cflag & CLOCAL)
+               info->flags &= ~ASYNC_CHECK_CD;
+       else
+               info->flags |= ASYNC_CHECK_CD;
 
      /***********************************************
        The hardware option, CyRtsAO, presents RTS when
@@ -1025,149 +1031,146 @@ config_setup(struct cyclades_port * info)
        cable.  Contact Marcio Saito for details.
      ***********************************************/
 
-    channel = info->line;
+       channel = info->line;
 
-    local_irq_save(flags);
-       base_addr[CyCAR] = (u_char)channel;
+       local_irq_save(flags);
+       base_addr[CyCAR] = (u_char) channel;
 
        /* CyCMR set once only in mvme167_init_serial() */
        if (base_addr[CyLICR] != channel << 2)
-           base_addr[CyLICR] = channel << 2;
+               base_addr[CyLICR] = channel << 2;
        if (base_addr[CyLIVR] != 0x5c)
-           base_addr[CyLIVR] = 0x5c;
+               base_addr[CyLIVR] = 0x5c;
 
-       /* tx and rx baud rate */
+       /* tx and rx baud rate */
 
        if (base_addr[CyCOR1] != info->cor1)
-           need_init_chan = 1;
+               need_init_chan = 1;
        if (base_addr[CyTCOR] != info->tco)
-           base_addr[CyTCOR] = info->tco;
+               base_addr[CyTCOR] = info->tco;
        if (base_addr[CyTBPR] != info->tbpr)
-           base_addr[CyTBPR] = info->tbpr;
+               base_addr[CyTBPR] = info->tbpr;
        if (base_addr[CyRCOR] != info->rco)
-           base_addr[CyRCOR] = info->rco;
+               base_addr[CyRCOR] = info->rco;
        if (base_addr[CyRBPR] != info->rbpr)
-           base_addr[CyRBPR] = info->rbpr;
+               base_addr[CyRBPR] = info->rbpr;
 
        /* set line characteristics  according configuration */
 
        if (base_addr[CySCHR1] != START_CHAR(info->tty))
-           base_addr[CySCHR1] = START_CHAR(info->tty);
+               base_addr[CySCHR1] = START_CHAR(info->tty);
        if (base_addr[CySCHR2] != STOP_CHAR(info->tty))
-           base_addr[CySCHR2] = STOP_CHAR(info->tty);
+               base_addr[CySCHR2] = STOP_CHAR(info->tty);
        if (base_addr[CySCRL] != START_CHAR(info->tty))
-           base_addr[CySCRL] = START_CHAR(info->tty);
+               base_addr[CySCRL] = START_CHAR(info->tty);
        if (base_addr[CySCRH] != START_CHAR(info->tty))
-           base_addr[CySCRH] = START_CHAR(info->tty);
+               base_addr[CySCRH] = START_CHAR(info->tty);
        if (base_addr[CyCOR1] != info->cor1)
-           base_addr[CyCOR1] = info->cor1;
+               base_addr[CyCOR1] = info->cor1;
        if (base_addr[CyCOR2] != info->cor2)
-           base_addr[CyCOR2] = info->cor2;
+               base_addr[CyCOR2] = info->cor2;
        if (base_addr[CyCOR3] != info->cor3)
-           base_addr[CyCOR3] = info->cor3;
+               base_addr[CyCOR3] = info->cor3;
        if (base_addr[CyCOR4] != info->cor4)
-           base_addr[CyCOR4] = info->cor4;
+               base_addr[CyCOR4] = info->cor4;
        if (base_addr[CyCOR5] != info->cor5)
-           base_addr[CyCOR5] = info->cor5;
+               base_addr[CyCOR5] = info->cor5;
        if (base_addr[CyCOR6] != info->cor6)
-           base_addr[CyCOR6] = info->cor6;
+               base_addr[CyCOR6] = info->cor6;
        if (base_addr[CyCOR7] != info->cor7)
-           base_addr[CyCOR7] = info->cor7;
+               base_addr[CyCOR7] = info->cor7;
 
        if (need_init_chan)
-           write_cy_cmd(base_addr,CyINIT_CHAN);
+               write_cy_cmd(base_addr, CyINIT_CHAN);
 
-       base_addr[CyCAR] = (u_char)channel; /* !!! Is this needed? */
+       base_addr[CyCAR] = (u_char) channel;    /* !!! Is this needed? */
 
        /* 2ms default rx timeout */
        ti = info->default_timeout ? info->default_timeout : 0x02;
        if (base_addr[CyRTPRL] != ti)
-           base_addr[CyRTPRL] = ti;
+               base_addr[CyRTPRL] = ti;
        if (base_addr[CyRTPRH] != 0)
-           base_addr[CyRTPRH] = 0;
+               base_addr[CyRTPRH] = 0;
 
        /* Set up RTS here also ????? RGH 141095 */
-       if(i == 0){ /* baud rate is zero, turn off line */
-           if ((base_addr[CyMSVR2] & CyDTR) == CyDTR)
-               base_addr[CyMSVR2] = 0;
+       if (i == 0) {           /* baud rate is zero, turn off line */
+               if ((base_addr[CyMSVR2] & CyDTR) == CyDTR)
+                       base_addr[CyMSVR2] = 0;
 #ifdef SERIAL_DEBUG_DTR
-            printk("cyc: %d: dropping DTR\n", __LINE__);
-            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1], base_addr[CyMSVR2]);
+               printk("cyc: %d: dropping DTR\n", __LINE__);
+               printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1],
+                      base_addr[CyMSVR2]);
 #endif
-       }else{
-           if ((base_addr[CyMSVR2] & CyDTR) != CyDTR)
-               base_addr[CyMSVR2] = CyDTR;
+       } else {
+               if ((base_addr[CyMSVR2] & CyDTR) != CyDTR)
+                       base_addr[CyMSVR2] = CyDTR;
 #ifdef SERIAL_DEBUG_DTR
-            printk("cyc: %d: raising DTR\n", __LINE__);
-            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1], base_addr[CyMSVR2]);
+               printk("cyc: %d: raising DTR\n", __LINE__);
+               printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1],
+                      base_addr[CyMSVR2]);
 #endif
        }
 
-       if (info->tty){
-           clear_bit(TTY_IO_ERROR, &info->tty->flags);
+       if (info->tty) {
+               clear_bit(TTY_IO_ERROR, &info->tty->flags);
        }
 
-    local_irq_restore(flags);
-
-} /* config_setup */
+       local_irq_restore(flags);
 
+}                              /* config_setup */
 
-static void
-cy_put_char(struct tty_struct *tty, unsigned char ch)
+static void cy_put_char(struct tty_struct *tty, unsigned char ch)
 {
-  struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
-  unsigned long flags;
+       struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
+       unsigned long flags;
 
 #ifdef SERIAL_DEBUG_IO
-    printk("cy_put_char %s(0x%02x)\n", tty->name, ch);
+       printk("cy_put_char %s(0x%02x)\n", tty->name, ch);
 #endif
 
-    if (serial_paranoia_check(info, tty->name, "cy_put_char"))
-       return;
+       if (serial_paranoia_check(info, tty->name, "cy_put_char"))
+               return;
 
-    if (!info->xmit_buf)
-       return;
+       if (!info->xmit_buf)
+               return;
 
-    local_irq_save(flags);
+       local_irq_save(flags);
        if (info->xmit_cnt >= PAGE_SIZE - 1) {
-           local_irq_restore(flags);
-           return;
+               local_irq_restore(flags);
+               return;
        }
 
        info->xmit_buf[info->xmit_head++] = ch;
        info->xmit_head &= PAGE_SIZE - 1;
        info->xmit_cnt++;
-    local_irq_restore(flags);
-} /* cy_put_char */
-
+       local_irq_restore(flags);
+}                              /* cy_put_char */
 
-static void
-cy_flush_chars(struct tty_struct *tty)
+static void cy_flush_chars(struct tty_struct *tty)
 {
-  struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
-  unsigned long flags;
-  volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
-  int channel;
-                               
+       struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
+       unsigned long flags;
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
+       int channel;
+
 #ifdef SERIAL_DEBUG_IO
-    printk("cy_flush_chars %s\n", tty->name); /* */
+       printk("cy_flush_chars %s\n", tty->name);       /* */
 #endif
 
-    if (serial_paranoia_check(info, tty->name, "cy_flush_chars"))
-       return;
+       if (serial_paranoia_check(info, tty->name, "cy_flush_chars"))
+               return;
 
-    if (info->xmit_cnt <= 0 || tty->stopped
-    || tty->hw_stopped || !info->xmit_buf)
-       return;
+       if (info->xmit_cnt <= 0 || tty->stopped
+           || tty->hw_stopped || !info->xmit_buf)
+               return;
 
-    channel = info->line;
+       channel = info->line;
 
-    local_irq_save(flags);
+       local_irq_save(flags);
        base_addr[CyCAR] = channel;
        base_addr[CyIER] |= CyTxMpty;
-    local_irq_restore(flags);
-} /* cy_flush_chars */
-
+       local_irq_restore(flags);
+}                              /* cy_flush_chars */
 
 /* This routine gets called when tty_write has put something into
     the write_queue.  If the port is not already transmitting stuff,
@@ -1175,650 +1178,616 @@ cy_flush_chars(struct tty_struct *tty)
     routine will then ensure that the characters are sent.  If the
     port is already active, there is no need to kick it.
  */
-static int
-cy_write(struct tty_struct * tty,
-           const unsigned char *buf, int count)
+static int cy_write(struct tty_struct *tty, const unsigned char *buf, int count)
 {
-  struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
-  unsigned long flags;
-  int c, total = 0;
+       struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
+       unsigned long flags;
+       int c, total = 0;
 
 #ifdef SERIAL_DEBUG_IO
-    printk("cy_write %s\n", tty->name); /* */
+       printk("cy_write %s\n", tty->name);     /* */
 #endif
 
-    if (serial_paranoia_check(info, tty->name, "cy_write")){
-       return 0;
-    }
-       
-    if (!info->xmit_buf){
-        return 0;
-    }
-
-    while (1) {
-           local_irq_save(flags);
-           c = min_t(int, count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
-                                     SERIAL_XMIT_SIZE - info->xmit_head));
-           if (c <= 0) {
-                   local_irq_restore(flags);
-                   break;
-           }
-
-           memcpy(info->xmit_buf + info->xmit_head, buf, c);
-           info->xmit_head = (info->xmit_head + c) & (SERIAL_XMIT_SIZE-1);
-           info->xmit_cnt += c;
-           local_irq_restore(flags);
-
-           buf += c;
-           count -= c;
-           total += c;
-    }
-
-    if (info->xmit_cnt
-    && !tty->stopped
-    && !tty->hw_stopped ) {
-        start_xmit(info);
-    }
-    return total;
-} /* cy_write */
+       if (serial_paranoia_check(info, tty->name, "cy_write")) {
+               return 0;
+       }
 
+       if (!info->xmit_buf) {
+               return 0;
+       }
 
-static int
-cy_write_room(struct tty_struct *tty)
+       while (1) {
+               local_irq_save(flags);
+               c = min_t(int, count, min(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,
+                                         SERIAL_XMIT_SIZE - info->xmit_head));
+               if (c <= 0) {
+                       local_irq_restore(flags);
+                       break;
+               }
+
+               memcpy(info->xmit_buf + info->xmit_head, buf, c);
+               info->xmit_head =
+                   (info->xmit_head + c) & (SERIAL_XMIT_SIZE - 1);
+               info->xmit_cnt += c;
+               local_irq_restore(flags);
+
+               buf += c;
+               count -= c;
+               total += c;
+       }
+
+       if (info->xmit_cnt && !tty->stopped && !tty->hw_stopped) {
+               start_xmit(info);
+       }
+       return total;
+}                              /* cy_write */
+
+static int cy_write_room(struct tty_struct *tty)
 {
-  struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
-  int  ret;
-                               
+       struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
+       int ret;
+
 #ifdef SERIAL_DEBUG_IO
-    printk("cy_write_room %s\n", tty->name); /* */
+       printk("cy_write_room %s\n", tty->name);        /* */
 #endif
 
-    if (serial_paranoia_check(info, tty->name, "cy_write_room"))
-       return 0;
-    ret = PAGE_SIZE - info->xmit_cnt - 1;
-    if (ret < 0)
-       ret = 0;
-    return ret;
-} /* cy_write_room */
-
+       if (serial_paranoia_check(info, tty->name, "cy_write_room"))
+               return 0;
+       ret = PAGE_SIZE - info->xmit_cnt - 1;
+       if (ret < 0)
+               ret = 0;
+       return ret;
+}                              /* cy_write_room */
 
-static int
-cy_chars_in_buffer(struct tty_struct *tty)
+static int cy_chars_in_buffer(struct tty_struct *tty)
 {
-  struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
-                               
+       struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
+
 #ifdef SERIAL_DEBUG_IO
-    printk("cy_chars_in_buffer %s %d\n", tty->name, info->xmit_cnt); /* */
+       printk("cy_chars_in_buffer %s %d\n", tty->name, info->xmit_cnt);        /* */
 #endif
 
-    if (serial_paranoia_check(info, tty->name, "cy_chars_in_buffer"))
-       return 0;
-
-    return info->xmit_cnt;
-} /* cy_chars_in_buffer */
+       if (serial_paranoia_check(info, tty->name, "cy_chars_in_buffer"))
+               return 0;
 
+       return info->xmit_cnt;
+}                              /* cy_chars_in_buffer */
 
-static void
-cy_flush_buffer(struct tty_struct *tty)
+static void cy_flush_buffer(struct tty_struct *tty)
 {
-  struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
-  unsigned long flags;
-                               
+       struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
+       unsigned long flags;
+
 #ifdef SERIAL_DEBUG_IO
-    printk("cy_flush_buffer %s\n", tty->name); /* */
+       printk("cy_flush_buffer %s\n", tty->name);      /* */
 #endif
 
-    if (serial_paranoia_check(info, tty->name, "cy_flush_buffer"))
-       return;
-    local_irq_save(flags);
+       if (serial_paranoia_check(info, tty->name, "cy_flush_buffer"))
+               return;
+       local_irq_save(flags);
        info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
-    local_irq_restore(flags);
-    tty_wakeup(tty);
-} /* cy_flush_buffer */
-
+       local_irq_restore(flags);
+       tty_wakeup(tty);
+}                              /* cy_flush_buffer */
 
 /* This routine is called by the upper-layer tty layer to signal
    that incoming characters should be throttled or that the
    throttle should be released.
  */
-static void
-cy_throttle(struct tty_struct * tty)
+static void cy_throttle(struct tty_struct *tty)
 {
-  struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
-  unsigned long flags;
-  volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
-  int channel;
+       struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
+       unsigned long flags;
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
+       int channel;
 
 #ifdef SERIAL_DEBUG_THROTTLE
-  char buf[64];
-       
-    printk("throttle %s: %d....\n", tty_name(tty, buf),
-          tty->ldisc.chars_in_buffer(tty));
-    printk("cy_throttle %s\n", tty->name);
+       char buf[64];
+
+       printk("throttle %s: %d....\n", tty_name(tty, buf),
+              tty->ldisc.chars_in_buffer(tty));
+       printk("cy_throttle %s\n", tty->name);
 #endif
 
-    if (serial_paranoia_check(info, tty->name, "cy_nthrottle")){
-           return;
-    }
+       if (serial_paranoia_check(info, tty->name, "cy_nthrottle")) {
+               return;
+       }
 
-    if (I_IXOFF(tty)) {
-       info->x_char = STOP_CHAR(tty);
-           /* Should use the "Send Special Character" feature!!! */
-    }
+       if (I_IXOFF(tty)) {
+               info->x_char = STOP_CHAR(tty);
+               /* Should use the "Send Special Character" feature!!! */
+       }
 
-    channel = info->line;
+       channel = info->line;
 
-    local_irq_save(flags);
-       base_addr[CyCAR] = (u_char)channel;
+       local_irq_save(flags);
+       base_addr[CyCAR] = (u_char) channel;
        base_addr[CyMSVR1] = 0;
-    local_irq_restore(flags);
-
-    return;
-} /* cy_throttle */
-
+       local_irq_restore(flags);
+}                              /* cy_throttle */
 
-static void
-cy_unthrottle(struct tty_struct * tty)
+static void cy_unthrottle(struct tty_struct *tty)
 {
-  struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
-  unsigned long flags;
-  volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
-  int channel;
+       struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
+       unsigned long flags;
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
+       int channel;
 
 #ifdef SERIAL_DEBUG_THROTTLE
-  char buf[64];
-       
-    printk("throttle %s: %d....\n", tty_name(tty, buf),
-          tty->ldisc.chars_in_buffer(tty));
-    printk("cy_unthrottle %s\n", tty->name);
+       char buf[64];
+
+       printk("throttle %s: %d....\n", tty_name(tty, buf),
+              tty->ldisc.chars_in_buffer(tty));
+       printk("cy_unthrottle %s\n", tty->name);
 #endif
 
-    if (serial_paranoia_check(info, tty->name, "cy_nthrottle")){
-           return;
-    }
+       if (serial_paranoia_check(info, tty->name, "cy_nthrottle")) {
+               return;
+       }
 
-    if (I_IXOFF(tty)) {
-       info->x_char = START_CHAR(tty);
-       /* Should use the "Send Special Character" feature!!! */
-    }
+       if (I_IXOFF(tty)) {
+               info->x_char = START_CHAR(tty);
+               /* Should use the "Send Special Character" feature!!! */
+       }
 
-    channel = info->line;
+       channel = info->line;
 
-    local_irq_save(flags);
-       base_addr[CyCAR] = (u_char)channel;
+       local_irq_save(flags);
+       base_addr[CyCAR] = (u_char) channel;
        base_addr[CyMSVR1] = CyRTS;
-    local_irq_restore(flags);
-
-    return;
-} /* cy_unthrottle */
+       local_irq_restore(flags);
+}                              /* cy_unthrottle */
 
 static int
-get_serial_info(struct cyclades_port * info,
-                           struct serial_struct __user * retinfo)
+get_serial_info(struct cyclades_port *info,
+               struct serial_struct __user * retinfo)
 {
-  struct serial_struct tmp;
+       struct serial_struct tmp;
 
 /* CP('g'); */
-    if (!retinfo)
-            return -EFAULT;
-    memset(&tmp, 0, sizeof(tmp));
-    tmp.type = info->type;
-    tmp.line = info->line;
-    tmp.port = info->line;
-    tmp.irq = 0;
-    tmp.flags = info->flags;
-    tmp.baud_base = 0;          /*!!!*/
-    tmp.close_delay = info->close_delay;
-    tmp.custom_divisor = 0;     /*!!!*/
-    tmp.hub6 = 0;               /*!!!*/
-    return copy_to_user(retinfo,&tmp,sizeof(*retinfo)) ? -EFAULT : 0;
-} /* get_serial_info */
+       if (!retinfo)
+               return -EFAULT;
+       memset(&tmp, 0, sizeof(tmp));
+       tmp.type = info->type;
+       tmp.line = info->line;
+       tmp.port = info->line;
+       tmp.irq = 0;
+       tmp.flags = info->flags;
+       tmp.baud_base = 0;      /*!!! */
+       tmp.close_delay = info->close_delay;
+       tmp.custom_divisor = 0; /*!!! */
+       tmp.hub6 = 0;           /*!!! */
+       return copy_to_user(retinfo, &tmp, sizeof(*retinfo)) ? -EFAULT : 0;
+}                              /* get_serial_info */
 
 static int
-set_serial_info(struct cyclades_port * info,
-                           struct serial_struct __user * new_info)
+set_serial_info(struct cyclades_port *info,
+               struct serial_struct __user * new_info)
 {
-  struct serial_struct new_serial;
-  struct cyclades_port old_info;
+       struct serial_struct new_serial;
+       struct cyclades_port old_info;
 
 /* CP('s'); */
-    if (!new_info)
-           return -EFAULT;
-    if (copy_from_user(&new_serial,new_info,sizeof(new_serial)))
-           return -EFAULT;
-    old_info = *info;
+       if (!new_info)
+               return -EFAULT;
+       if (copy_from_user(&new_serial, new_info, sizeof(new_serial)))
+               return -EFAULT;
+       old_info = *info;
+
+       if (!capable(CAP_SYS_ADMIN)) {
+               if ((new_serial.close_delay != info->close_delay) ||
+                   ((new_serial.flags & ASYNC_FLAGS & ~ASYNC_USR_MASK) !=
+                    (info->flags & ASYNC_FLAGS & ~ASYNC_USR_MASK)))
+                       return -EPERM;
+               info->flags = ((info->flags & ~ASYNC_USR_MASK) |
+                              (new_serial.flags & ASYNC_USR_MASK));
+               goto check_and_exit;
+       }
 
-    if (!capable(CAP_SYS_ADMIN)) {
-           if ((new_serial.close_delay != info->close_delay) ||
-               ((new_serial.flags & ASYNC_FLAGS & ~ASYNC_USR_MASK) !=
-                (info->flags & ASYNC_FLAGS & ~ASYNC_USR_MASK)))
-                   return -EPERM;
-           info->flags = ((info->flags & ~ASYNC_USR_MASK) |
-                          (new_serial.flags & ASYNC_USR_MASK));
-           goto check_and_exit;
-    }
+       /*
+        * OK, past this point, all the error checking has been done.
+        * At this point, we start making changes.....
+        */
 
+       info->flags = ((info->flags & ~ASYNC_FLAGS) |
+                      (new_serial.flags & ASYNC_FLAGS));
+       info->close_delay = new_serial.close_delay;
 
-    /*
-     * OK, past this point, all the error checking has been done.
-     * At this point, we start making changes.....
-     */
+check_and_exit:
+       if (info->flags & ASYNC_INITIALIZED) {
+               config_setup(info);
+               return 0;
+       }
+       return startup(info);
+}                              /* set_serial_info */
 
-    info->flags = ((info->flags & ~ASYNC_FLAGS) |
-                   (new_serial.flags & ASYNC_FLAGS));
-    info->close_delay = new_serial.close_delay;
+static int cy_tiocmget(struct tty_struct *tty, struct file *file)
+{
+       struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
+       int channel;
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
+       unsigned long flags;
+       unsigned char status;
 
+       channel = info->line;
 
-check_and_exit:
-    if (info->flags & ASYNC_INITIALIZED){
-       config_setup(info);
-       return 0;
-    }else{
-        return startup(info);
-    }
-} /* set_serial_info */
+       local_irq_save(flags);
+       base_addr[CyCAR] = (u_char) channel;
+       status = base_addr[CyMSVR1] | base_addr[CyMSVR2];
+       local_irq_restore(flags);
 
-static int
-cy_tiocmget(struct tty_struct *tty, struct file *file)
-{
-  struct cyclades_port * info = (struct cyclades_port *)tty->driver_data;
-  int channel;
-  volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
-  unsigned long flags;
-  unsigned char status;
-
-    channel = info->line;
-
-    local_irq_save(flags);
-        base_addr[CyCAR] = (u_char)channel;
-        status = base_addr[CyMSVR1] | base_addr[CyMSVR2];
-    local_irq_restore(flags);
-
-    return    ((status  & CyRTS) ? TIOCM_RTS : 0)
-            | ((status  & CyDTR) ? TIOCM_DTR : 0)
-            | ((status  & CyDCD) ? TIOCM_CAR : 0)
-            | ((status  & CyDSR) ? TIOCM_DSR : 0)
-            | ((status  & CyCTS) ? TIOCM_CTS : 0);
-} /* cy_tiocmget */
+       return ((status & CyRTS) ? TIOCM_RTS : 0)
+           | ((status & CyDTR) ? TIOCM_DTR : 0)
+           | ((status & CyDCD) ? TIOCM_CAR : 0)
+           | ((status & CyDSR) ? TIOCM_DSR : 0)
+           | ((status & CyCTS) ? TIOCM_CTS : 0);
+}                              /* cy_tiocmget */
 
 static int
 cy_tiocmset(struct tty_struct *tty, struct file *file,
            unsigned int set, unsigned int clear)
 {
-  struct cyclades_port * info = (struct cyclades_port *)tty->driver_data;
-  int channel;
-  volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
-  unsigned long flags;
-         
-    channel = info->line;
-
-       if (set & TIOCM_RTS){
-           local_irq_save(flags);
-               base_addr[CyCAR] = (u_char)channel;
+       struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
+       int channel;
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
+       unsigned long flags;
+
+       channel = info->line;
+
+       if (set & TIOCM_RTS) {
+               local_irq_save(flags);
+               base_addr[CyCAR] = (u_char) channel;
                base_addr[CyMSVR1] = CyRTS;
-           local_irq_restore(flags);
+               local_irq_restore(flags);
        }
-       if (set & TIOCM_DTR){
-           local_irq_save(flags);
-           base_addr[CyCAR] = (u_char)channel;
+       if (set & TIOCM_DTR) {
+               local_irq_save(flags);
+               base_addr[CyCAR] = (u_char) channel;
 /* CP('S');CP('2'); */
-           base_addr[CyMSVR2] = CyDTR;
+               base_addr[CyMSVR2] = CyDTR;
 #ifdef SERIAL_DEBUG_DTR
-            printk("cyc: %d: raising DTR\n", __LINE__);
-            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1], base_addr[CyMSVR2]);
+               printk("cyc: %d: raising DTR\n", __LINE__);
+               printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1],
+                      base_addr[CyMSVR2]);
 #endif
-           local_irq_restore(flags);
+               local_irq_restore(flags);
        }
 
-       if (clear & TIOCM_RTS){
-           local_irq_save(flags);
-               base_addr[CyCAR] = (u_char)channel;
+       if (clear & TIOCM_RTS) {
+               local_irq_save(flags);
+               base_addr[CyCAR] = (u_char) channel;
                base_addr[CyMSVR1] = 0;
-           local_irq_restore(flags);
+               local_irq_restore(flags);
        }
-       if (clear & TIOCM_DTR){
-           local_irq_save(flags);
-           base_addr[CyCAR] = (u_char)channel;
+       if (clear & TIOCM_DTR) {
+               local_irq_save(flags);
+               base_addr[CyCAR] = (u_char) channel;
 /* CP('C');CP('2'); */
-           base_addr[CyMSVR2] = 0;
+               base_addr[CyMSVR2] = 0;
 #ifdef SERIAL_DEBUG_DTR
-            printk("cyc: %d: dropping DTR\n", __LINE__);
-            printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1], base_addr[CyMSVR2]);
+               printk("cyc: %d: dropping DTR\n", __LINE__);
+               printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1],
+                      base_addr[CyMSVR2]);
 #endif
-           local_irq_restore(flags);
+               local_irq_restore(flags);
        }
 
-    return 0;
-} /* set_modem_info */
-
-static void
-send_break( struct cyclades_port * info, int duration)
-{ /* Let the transmit ISR take care of this (since it
-     requires stuffing characters into the output stream).
-   */
-    info->x_break = duration;
-    if (!info->xmit_cnt ) {
-       start_xmit(info);
-    }
-} /* send_break */
+       return 0;
+}                              /* set_modem_info */
+
+static void send_break(struct cyclades_port *info, int duration)
+{                              /* Let the transmit ISR take care of this (since it
+                                  requires stuffing characters into the output stream).
+                                */
+       info->x_break = duration;
+       if (!info->xmit_cnt) {
+               start_xmit(info);
+       }
+}                              /* send_break */
 
 static int
-get_mon_info(struct cyclades_port * info, struct cyclades_monitor __user * mon)
+get_mon_info(struct cyclades_port *info, struct cyclades_monitor __user * mon)
 {
 
-   if (copy_to_user(mon, &info->mon, sizeof(struct cyclades_monitor)))
-          return -EFAULT;
-   info->mon.int_count  = 0;
-   info->mon.char_count = 0;
-   info->mon.char_max   = 0;
-   info->mon.char_last  = 0;
-   return 0;
+       if (copy_to_user(mon, &info->mon, sizeof(struct cyclades_monitor)))
+               return -EFAULT;
+       info->mon.int_count = 0;
+       info->mon.char_count = 0;
+       info->mon.char_max = 0;
+       info->mon.char_last = 0;
+       return 0;
 }
 
-static int
-set_threshold(struct cyclades_port * info, unsigned long __user *arg)
+static int set_threshold(struct cyclades_port *info, unsigned long __user * arg)
 {
-   volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
-   unsigned long value;
-   int channel;
-   
-   if (get_user(value, arg))
-          return -EFAULT;
-
-   channel = info->line;
-   info->cor4 &= ~CyREC_FIFO;
-   info->cor4 |= value & CyREC_FIFO;
-   base_addr[CyCOR4] = info->cor4;
-   return 0;
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
+       unsigned long value;
+       int channel;
+
+       if (get_user(value, arg))
+               return -EFAULT;
+
+       channel = info->line;
+       info->cor4 &= ~CyREC_FIFO;
+       info->cor4 |= value & CyREC_FIFO;
+       base_addr[CyCOR4] = info->cor4;
+       return 0;
 }
 
 static int
-get_threshold(struct cyclades_port * info, unsigned long __user *value)
+get_threshold(struct cyclades_port *info, unsigned long __user * value)
 {
-   volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
-   int channel;
-   unsigned long tmp;
-   
-   channel = info->line;
-
-   tmp = base_addr[CyCOR4] & CyREC_FIFO;
-   return put_user(tmp,value);
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
+       int channel;
+       unsigned long tmp;
+
+       channel = info->line;
+
+       tmp = base_addr[CyCOR4] & CyREC_FIFO;
+       return put_user(tmp, value);
 }
 
 static int
-set_default_threshold(struct cyclades_port * info, unsigned long __user *arg)
+set_default_threshold(struct cyclades_port *info, unsigned long __user * arg)
 {
-   unsigned long value;
+       unsigned long value;
 
-   if (get_user(value, arg))
-       return -EFAULT;
+       if (get_user(value, arg))
+               return -EFAULT;
 
-   info->default_threshold = value & 0x0f;
-   return 0;
+       info->default_threshold = value & 0x0f;
+       return 0;
 }
 
 static int
-get_default_threshold(struct cyclades_port * info, unsigned long __user *value)
+get_default_threshold(struct cyclades_port *info, unsigned long __user * value)
 {
-   return put_user(info->default_threshold,value);
+       return put_user(info->default_threshold, value);
 }
 
-static int
-set_timeout(struct cyclades_port * info, unsigned long __user *arg)
+static int set_timeout(struct cyclades_port *info, unsigned long __user * arg)
 {
-   volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
-   int channel;
-   unsigned long value;
-
-   if (get_user(value, arg))
-          return -EFAULT;
-   
-   channel = info->line;
-
-   base_addr[CyRTPRL] = value & 0xff;
-   base_addr[CyRTPRH] = (value >> 8) & 0xff;
-   return 0;
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
+       int channel;
+       unsigned long value;
+
+       if (get_user(value, arg))
+               return -EFAULT;
+
+       channel = info->line;
+
+       base_addr[CyRTPRL] = value & 0xff;
+       base_addr[CyRTPRH] = (value >> 8) & 0xff;
+       return 0;
 }
 
-static int
-get_timeout(struct cyclades_port * info, unsigned long __user *value)
+static int get_timeout(struct cyclades_port *info, unsigned long __user * value)
 {
-   volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
-   int channel;
-   unsigned long tmp;
-   
-   channel = info->line;
-
-   tmp = base_addr[CyRTPRL];
-   return put_user(tmp,value);
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
+       int channel;
+       unsigned long tmp;
+
+       channel = info->line;
+
+       tmp = base_addr[CyRTPRL];
+       return put_user(tmp, value);
 }
 
-static int
-set_default_timeout(struct cyclades_port * info, unsigned long value)
+static int set_default_timeout(struct cyclades_port *info, unsigned long value)
 {
-   info->default_timeout = value & 0xff;
-   return 0;
+       info->default_timeout = value & 0xff;
+       return 0;
 }
 
 static int
-get_default_timeout(struct cyclades_port * info, unsigned long __user *value)
+get_default_timeout(struct cyclades_port *info, unsigned long __user * value)
 {
-   return put_user(info->default_timeout,value);
+       return put_user(info->default_timeout, value);
 }
 
 static int
-cy_ioctl(struct tty_struct *tty, struct file * file,
-            unsigned int cmd, unsigned long arg)
+cy_ioctl(struct tty_struct *tty, struct file *file,
+        unsigned int cmd, unsigned long arg)
 {
-  unsigned long val;
-  struct cyclades_port * info = (struct cyclades_port *)tty->driver_data;
-  int ret_val = 0;
-  void __user *argp = (void __user *)arg;
+       unsigned long val;
+       struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
+       int ret_val = 0;
+       void __user *argp = (void __user *)arg;
 
 #ifdef SERIAL_DEBUG_OTHER
-    printk("cy_ioctl %s, cmd = %x arg = %lx\n", tty->name, cmd, arg); /* */
-#endif
-
-    switch (cmd) {
-        case CYGETMON:
-            ret_val = get_mon_info(info, argp);
-           break;
-        case CYGETTHRESH:
-           ret_val = get_threshold(info, argp);
-           break;
-        case CYSETTHRESH:
-            ret_val = set_threshold(info, argp);
-           break;
-        case CYGETDEFTHRESH:
-           ret_val = get_default_threshold(info, argp);
-           break;
-        case CYSETDEFTHRESH:
-            ret_val = set_default_threshold(info, argp);
-           break;
-        case CYGETTIMEOUT:
-           ret_val = get_timeout(info, argp);
-           break;
-        case CYSETTIMEOUT:
-            ret_val = set_timeout(info, argp);
-           break;
-        case CYGETDEFTIMEOUT:
-           ret_val = get_default_timeout(info, argp);
-           break;
-        case CYSETDEFTIMEOUT:
-            ret_val = set_default_timeout(info, (unsigned long)arg);
-           break;
-        case TCSBRK:    /* SVID version: non-zero arg --> no break */
-           ret_val = tty_check_change(tty);
-           if (ret_val)
-                   break;
-            tty_wait_until_sent(tty,0);
-            if (!arg)
-                send_break(info, HZ/4); /* 1/4 second */
-            break;
-        case TCSBRKP:   /* support for POSIX tcsendbreak() */
-           ret_val = tty_check_change(tty);
-           if (ret_val)
+       printk("cy_ioctl %s, cmd = %x arg = %lx\n", tty->name, cmd, arg);       /* */
+#endif
+
+       switch (cmd) {
+       case CYGETMON:
+               ret_val = get_mon_info(info, argp);
+               break;
+       case CYGETTHRESH:
+               ret_val = get_threshold(info, argp);
+               break;
+       case CYSETTHRESH:
+               ret_val = set_threshold(info, argp);
+               break;
+       case CYGETDEFTHRESH:
+               ret_val = get_default_threshold(info, argp);
+               break;
+       case CYSETDEFTHRESH:
+               ret_val = set_default_threshold(info, argp);
+               break;
+       case CYGETTIMEOUT:
+               ret_val = get_timeout(info, argp);
+               break;
+       case CYSETTIMEOUT:
+               ret_val = set_timeout(info, argp);
+               break;
+       case CYGETDEFTIMEOUT:
+               ret_val = get_default_timeout(info, argp);
+               break;
+       case CYSETDEFTIMEOUT:
+               ret_val = set_default_timeout(info, (unsigned long)arg);
+               break;
+       case TCSBRK:            /* SVID version: non-zero arg --> no break */
+               ret_val = tty_check_change(tty);
+               if (ret_val)
+                       break;
+               tty_wait_until_sent(tty, 0);
+               if (!arg)
+                       send_break(info, HZ / 4);       /* 1/4 second */
+               break;
+       case TCSBRKP:           /* support for POSIX tcsendbreak() */
+               ret_val = tty_check_change(tty);
+               if (ret_val)
+                       break;
+               tty_wait_until_sent(tty, 0);
+               send_break(info, arg ? arg * (HZ / 10) : HZ / 4);
                break;
-            tty_wait_until_sent(tty,0);
-            send_break(info, arg ? arg*(HZ/10) : HZ/4);
-            break;
 
 /* The following commands are incompletely implemented!!! */
-        case TIOCGSOFTCAR:
-            ret_val = put_user(C_CLOCAL(tty) ? 1 : 0, (unsigned long __user *) argp);
-            break;
-        case TIOCSSOFTCAR:
-            ret_val = get_user(val, (unsigned long __user *) argp);
-           if (ret_val)
-                   break;
-            tty->termios->c_cflag =
-                    ((tty->termios->c_cflag & ~CLOCAL) | (val ? CLOCAL : 0));
-            break;
-        case TIOCGSERIAL:
-            ret_val = get_serial_info(info, argp);
-            break;
-        case TIOCSSERIAL:
-            ret_val = set_serial_info(info, argp);
-            break;
-        default:
-           ret_val = -ENOIOCTLCMD;
-    }
+       case TIOCGSOFTCAR:
+               ret_val =
+                   put_user(C_CLOCAL(tty) ? 1 : 0,
+                            (unsigned long __user *)argp);
+               break;
+       case TIOCSSOFTCAR:
+               ret_val = get_user(val, (unsigned long __user *)argp);
+               if (ret_val)
+                       break;
+               tty->termios->c_cflag =
+                   ((tty->termios->c_cflag & ~CLOCAL) | (val ? CLOCAL : 0));
+               break;
+       case TIOCGSERIAL:
+               ret_val = get_serial_info(info, argp);
+               break;
+       case TIOCSSERIAL:
+               ret_val = set_serial_info(info, argp);
+               break;
+       default:
+               ret_val = -ENOIOCTLCMD;
+       }
 
 #ifdef SERIAL_DEBUG_OTHER
-    printk("cy_ioctl done\n");
+       printk("cy_ioctl done\n");
 #endif
 
-    return ret_val;
-} /* cy_ioctl */
-
+       return ret_val;
+}                              /* cy_ioctl */
 
-
-
-static void
-cy_set_termios(struct tty_struct *tty, struct ktermios * old_termios)
+static void cy_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
 {
-  struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
+       struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
 
 #ifdef SERIAL_DEBUG_OTHER
-    printk("cy_set_termios %s\n", tty->name);
+       printk("cy_set_termios %s\n", tty->name);
 #endif
 
-    if (tty->termios->c_cflag == old_termios->c_cflag)
-        return;
-    config_setup(info);
+       if (tty->termios->c_cflag == old_termios->c_cflag)
+               return;
+       config_setup(info);
 
-    if ((old_termios->c_cflag & CRTSCTS) &&
-        !(tty->termios->c_cflag & CRTSCTS)) {
-            tty->stopped = 0;
-            cy_start(tty);
-    }
+       if ((old_termios->c_cflag & CRTSCTS) &&
+           !(tty->termios->c_cflag & CRTSCTS)) {
+               tty->stopped = 0;
+               cy_start(tty);
+       }
 #ifdef tytso_patch_94Nov25_1726
-    if (!(old_termios->c_cflag & CLOCAL) &&
-        (tty->termios->c_cflag & CLOCAL))
-            wake_up_interruptible(&info->open_wait);
+       if (!(old_termios->c_cflag & CLOCAL) &&
+           (tty->termios->c_cflag & CLOCAL))
+               wake_up_interruptible(&info->open_wait);
 #endif
+}                              /* cy_set_termios */
 
-    return;
-} /* cy_set_termios */
-
-
-static void
-cy_close(struct tty_struct * tty, struct file * filp)
+static void cy_close(struct tty_struct *tty, struct file *filp)
 {
-  struct cyclades_port * info = (struct cyclades_port *)tty->driver_data;
+       struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
 
 /* CP('C'); */
 #ifdef SERIAL_DEBUG_OTHER
-    printk("cy_close %s\n", tty->name);
+       printk("cy_close %s\n", tty->name);
 #endif
 
-    if (!info
-    || serial_paranoia_check(info, tty->name, "cy_close")){
-        return;
-    }
+       if (!info || serial_paranoia_check(info, tty->name, "cy_close")) {
+               return;
+       }
 #ifdef SERIAL_DEBUG_OPEN
-    printk("cy_close %s, count = %d\n", tty->name, info->count);
-#endif
-
-    if ((tty->count == 1) && (info->count != 1)) {
-       /*
-        * Uh, oh.  tty->count is 1, which means that the tty
-        * structure will be freed.  Info->count should always
-        * be one in these conditions.  If it's greater than
-        * one, we've got real problems, since it means the
-        * serial port won't be shutdown.
-        */
-       printk("cy_close: bad serial port count; tty->count is 1, "
-          "info->count is %d\n", info->count);
-       info->count = 1;
-    }
+       printk("cy_close %s, count = %d\n", tty->name, info->count);
+#endif
+
+       if ((tty->count == 1) && (info->count != 1)) {
+               /*
+                * Uh, oh.  tty->count is 1, which means that the tty
+                * structure will be freed.  Info->count should always
+                * be one in these conditions.  If it's greater than
+                * one, we've got real problems, since it means the
+                * serial port won't be shutdown.
+                */
+               printk("cy_close: bad serial port count; tty->count is 1, "
+                      "info->count is %d\n", info->count);
+               info->count = 1;
+       }
 #ifdef SERIAL_DEBUG_COUNT
-    printk("cyc: %d: decrementing count to %d\n", __LINE__, info->count - 1);
+       printk("cyc: %d: decrementing count to %d\n", __LINE__,
+              info->count - 1);
 #endif
-    if (--info->count < 0) {
-       printk("cy_close: bad serial port count for ttys%d: %d\n",
-              info->line, info->count);
+       if (--info->count < 0) {
+               printk("cy_close: bad serial port count for ttys%d: %d\n",
+                      info->line, info->count);
 #ifdef SERIAL_DEBUG_COUNT
-    printk("cyc: %d: setting count to 0\n", __LINE__);
+               printk("cyc: %d: setting count to 0\n", __LINE__);
 #endif
-       info->count = 0;
-    }
-    if (info->count)
-       return;
-    info->flags |= ASYNC_CLOSING;
-    if (info->flags & ASYNC_INITIALIZED)
-       tty_wait_until_sent(tty, 3000); /* 30 seconds timeout */
-    shutdown(info);
-    if (tty->driver->flush_buffer)
-       tty->driver->flush_buffer(tty);
-    tty_ldisc_flush(tty);
-    info->event = 0;
-    info->tty = NULL;
-    if (info->blocked_open) {
-       if (info->close_delay) {
-           msleep_interruptible(jiffies_to_msecs(info->close_delay));
+               info->count = 0;
        }
-       wake_up_interruptible(&info->open_wait);
-    }
-    info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
-    wake_up_interruptible(&info->close_wait);
+       if (info->count)
+               return;
+       info->flags |= ASYNC_CLOSING;
+       if (info->flags & ASYNC_INITIALIZED)
+               tty_wait_until_sent(tty, 3000); /* 30 seconds timeout */
+       shutdown(info);
+       if (tty->driver->flush_buffer)
+               tty->driver->flush_buffer(tty);
+       tty_ldisc_flush(tty);
+       info->event = 0;
+       info->tty = NULL;
+       if (info->blocked_open) {
+               if (info->close_delay) {
+                       msleep_interruptible(jiffies_to_msecs
+                                            (info->close_delay));
+               }
+               wake_up_interruptible(&info->open_wait);
+       }
+       info->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CLOSING);
+       wake_up_interruptible(&info->close_wait);
 
 #ifdef SERIAL_DEBUG_OTHER
-    printk("cy_close done\n");
+       printk("cy_close done\n");
 #endif
-
-    return;
-} /* cy_close */
+}                              /* cy_close */
 
 /*
  * cy_hangup() --- called by tty_hangup() when a hangup is signaled.
  */
-void
-cy_hangup(struct tty_struct *tty)
+void cy_hangup(struct tty_struct *tty)
 {
-  struct cyclades_port * info = (struct cyclades_port *)tty->driver_data;
-       
+       struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
+
 #ifdef SERIAL_DEBUG_OTHER
-    printk("cy_hangup %s\n", tty->name); /* */
+       printk("cy_hangup %s\n", tty->name);    /* */
 #endif
 
-    if (serial_paranoia_check(info, tty->name, "cy_hangup"))
-       return;
-    
-    shutdown(info);
+       if (serial_paranoia_check(info, tty->name, "cy_hangup"))
+               return;
+
+       shutdown(info);
 #if 0
-    info->event = 0;
-    info->count = 0;
+       info->event = 0;
+       info->count = 0;
 #ifdef SERIAL_DEBUG_COUNT
-    printk("cyc: %d: setting count to 0\n", __LINE__);
+       printk("cyc: %d: setting count to 0\n", __LINE__);
 #endif
-    info->tty = 0;
+       info->tty = 0;
 #endif
-    info->flags &= ~ASYNC_NORMAL_ACTIVE;
-    wake_up_interruptible(&info->open_wait);
-} /* cy_hangup */
-
-
+       info->flags &= ~ASYNC_NORMAL_ACTIVE;
+       wake_up_interruptible(&info->open_wait);
+}                              /* cy_hangup */
 
 /*
  * ------------------------------------------------------------
@@ -1827,177 +1796,180 @@ cy_hangup(struct tty_struct *tty)
  */
 
 static int
-block_til_ready(struct tty_struct *tty, struct file * filp,
-                           struct cyclades_port *info)
+block_til_ready(struct tty_struct *tty, struct file *filp,
+               struct cyclades_port *info)
 {
-  DECLARE_WAITQUEUE(wait, current);
-  unsigned long flags;
-  int channel;
-  int retval;
-  volatile u_char *base_addr = (u_char *)BASE_ADDR;
-
-    /*
-     * If the device is in the middle of being closed, then block
-     * until it's done, and then try again.
-     */
-    if (info->flags & ASYNC_CLOSING) {
-       interruptible_sleep_on(&info->close_wait);
-       if (info->flags & ASYNC_HUP_NOTIFY){
-           return -EAGAIN;
-       }else{
-           return -ERESTARTSYS;
-       }
-    }
-
-    /*
-     * If non-blocking mode is set, then make the check up front
-     * and then exit.
-     */
-    if (filp->f_flags & O_NONBLOCK) {
-       info->flags |= ASYNC_NORMAL_ACTIVE;
-       return 0;
-    }
-
-    /*
-     * Block waiting for the carrier detect and the line to become
-     * free (i.e., not in use by the callout).  While we are in
-     * this loop, info->count is dropped by one, so that
-     * cy_close() knows when to free things.  We restore it upon
-     * exit, either normal or abnormal.
-     */
-    retval = 0;
-    add_wait_queue(&info->open_wait, &wait);
+       DECLARE_WAITQUEUE(wait, current);
+       unsigned long flags;
+       int channel;
+       int retval;
+       volatile u_char *base_addr = (u_char *) BASE_ADDR;
+
+       /*
+        * If the device is in the middle of being closed, then block
+        * until it's done, and then try again.
+        */
+       if (info->flags & ASYNC_CLOSING) {
+               interruptible_sleep_on(&info->close_wait);
+               if (info->flags & ASYNC_HUP_NOTIFY) {
+                       return -EAGAIN;
+               } else {
+                       return -ERESTARTSYS;
+               }
+       }
+
+       /*
+        * If non-blocking mode is set, then make the check up front
+        * and then exit.
+        */
+       if (filp->f_flags & O_NONBLOCK) {
+               info->flags |= ASYNC_NORMAL_ACTIVE;
+               return 0;
+       }
+
+       /*
+        * Block waiting for the carrier detect and the line to become
+        * free (i.e., not in use by the callout).  While we are in
+        * this loop, info->count is dropped by one, so that
+        * cy_close() knows when to free things.  We restore it upon
+        * exit, either normal or abnormal.
+        */
+       retval = 0;
+       add_wait_queue(&info->open_wait, &wait);
 #ifdef SERIAL_DEBUG_OPEN
-    printk("block_til_ready before block: %s, count = %d\n",
-          tty->name, info->count);/**/
+       printk("block_til_ready before block: %s, count = %d\n",
+              tty->name, info->count);
+       /**/
 #endif
-    info->count--;
+           info->count--;
 #ifdef SERIAL_DEBUG_COUNT
-    printk("cyc: %d: decrementing count to %d\n", __LINE__, info->count);
+       printk("cyc: %d: decrementing count to %d\n", __LINE__, info->count);
 #endif
-    info->blocked_open++;
+       info->blocked_open++;
 
-    channel = info->line;
+       channel = info->line;
 
-    while (1) {
-       local_irq_save(flags);
-       base_addr[CyCAR] = (u_char)channel;
-       base_addr[CyMSVR1] = CyRTS;
+       while (1) {
+               local_irq_save(flags);
+               base_addr[CyCAR] = (u_char) channel;
+               base_addr[CyMSVR1] = CyRTS;
 /* CP('S');CP('4'); */
-       base_addr[CyMSVR2] = CyDTR;
+               base_addr[CyMSVR2] = CyDTR;
 #ifdef SERIAL_DEBUG_DTR
-       printk("cyc: %d: raising DTR\n", __LINE__);
-       printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1], base_addr[CyMSVR2]);
-#endif
-       local_irq_restore(flags);
-       set_current_state(TASK_INTERRUPTIBLE);
-       if (tty_hung_up_p(filp)
-       || !(info->flags & ASYNC_INITIALIZED) ){
-           if (info->flags & ASYNC_HUP_NOTIFY) {
-               retval = -EAGAIN;
-           }else{
-               retval = -ERESTARTSYS;
-           }
-           break;
-       }
-       local_irq_save(flags);
-           base_addr[CyCAR] = (u_char)channel;
+               printk("cyc: %d: raising DTR\n", __LINE__);
+               printk("     status: 0x%x, 0x%x\n", base_addr[CyMSVR1],
+                      base_addr[CyMSVR2]);
+#endif
+               local_irq_restore(flags);
+               set_current_state(TASK_INTERRUPTIBLE);
+               if (tty_hung_up_p(filp)
+                   || !(info->flags & ASYNC_INITIALIZED)) {
+                       if (info->flags & ASYNC_HUP_NOTIFY) {
+                               retval = -EAGAIN;
+                       } else {
+                               retval = -ERESTARTSYS;
+                       }
+                       break;
+               }
+               local_irq_save(flags);
+               base_addr[CyCAR] = (u_char) channel;
 /* CP('L');CP1(1 && C_CLOCAL(tty)); CP1(1 && (base_addr[CyMSVR1] & CyDCD) ); */
-           if (!(info->flags & ASYNC_CLOSING)
-           && (C_CLOCAL(tty)
-               || (base_addr[CyMSVR1] & CyDCD))) {
-                   local_irq_restore(flags);
-                   break;
-           }
-       local_irq_restore(flags);
-       if (signal_pending(current)) {
-           retval = -ERESTARTSYS;
-           break;
-       }
+               if (!(info->flags & ASYNC_CLOSING)
+                   && (C_CLOCAL(tty)
+                       || (base_addr[CyMSVR1] & CyDCD))) {
+                       local_irq_restore(flags);
+                       break;
+               }
+               local_irq_restore(flags);
+               if (signal_pending(current)) {
+                       retval = -ERESTARTSYS;
+                       break;
+               }
 #ifdef SERIAL_DEBUG_OPEN
-       printk("block_til_ready blocking: %s, count = %d\n",
-              tty->name, info->count);/**/
-#endif
-       schedule();
-    }
-    current->state = TASK_RUNNING;
-    remove_wait_queue(&info->open_wait, &wait);
-    if (!tty_hung_up_p(filp)){
-       info->count++;
+               printk("block_til_ready blocking: %s, count = %d\n",
+                      tty->name, info->count);
+               /**/
+#endif
+                   schedule();
+       }
+       current->state = TASK_RUNNING;
+       remove_wait_queue(&info->open_wait, &wait);
+       if (!tty_hung_up_p(filp)) {
+               info->count++;
 #ifdef SERIAL_DEBUG_COUNT
-    printk("cyc: %d: incrementing count to %d\n", __LINE__, info->count);
+               printk("cyc: %d: incrementing count to %d\n", __LINE__,
+                      info->count);
 #endif
-    }
-    info->blocked_open--;
+       }
+       info->blocked_open--;
 #ifdef SERIAL_DEBUG_OPEN
-    printk("block_til_ready after blocking: %s, count = %d\n",
-          tty->name, info->count);/**/
+       printk("block_til_ready after blocking: %s, count = %d\n",
+              tty->name, info->count);
+       /**/
 #endif
-    if (retval)
-           return retval;
-    info->flags |= ASYNC_NORMAL_ACTIVE;
-    return 0;
-} /* block_til_ready */
+           if (retval)
+               return retval;
+       info->flags |= ASYNC_NORMAL_ACTIVE;
+       return 0;
+}                              /* block_til_ready */
 
 /*
  * This routine is called whenever a serial port is opened.  It
  * performs the serial-specific initialization for the tty structure.
  */
-int
-cy_open(struct tty_struct *tty, struct file * filp)
+int cy_open(struct tty_struct *tty, struct file *filp)
 {
-  struct cyclades_port  *info;
-  int retval, line;
+       struct cyclades_port *info;
+       int retval, line;
 
 /* CP('O'); */
-    line = tty->index;
-    if ((line < 0) || (NR_PORTS <= line)){
-        return -ENODEV;
-    }
-    info = &cy_port[line];
-    if (info->line < 0){
-        return -ENODEV;
-    }
+       line = tty->index;
+       if ((line < 0) || (NR_PORTS <= line)) {
+               return -ENODEV;
+       }
+       info = &cy_port[line];
+       if (info->line < 0) {
+               return -ENODEV;
+       }
 #ifdef SERIAL_DEBUG_OTHER
-    printk("cy_open %s\n", tty->name); /* */
+       printk("cy_open %s\n", tty->name);      /* */
 #endif
-    if (serial_paranoia_check(info, tty->name, "cy_open")){
-        return -ENODEV;
-    }
+       if (serial_paranoia_check(info, tty->name, "cy_open")) {
+               return -ENODEV;
+       }
 #ifdef SERIAL_DEBUG_OPEN
-    printk("cy_open %s, count = %d\n", tty->name, info->count);/**/
+       printk("cy_open %s, count = %d\n", tty->name, info->count);
+       /**/
 #endif
-    info->count++;
+           info->count++;
 #ifdef SERIAL_DEBUG_COUNT
-    printk("cyc: %d: incrementing count to %d\n", __LINE__, info->count);
+       printk("cyc: %d: incrementing count to %d\n", __LINE__, info->count);
 #endif
-    tty->driver_data = info;
-    info->tty = tty;
+       tty->driver_data = info;
+       info->tty = tty;
 
-    /*
-     * Start up serial port
-     */
-    retval = startup(info);
-    if (retval){
-       return retval;
-    }
+       /*
+        * Start up serial port
+        */
+       retval = startup(info);
+       if (retval) {
+               return retval;
+       }
 
-    retval = block_til_ready(tty, filp, info);
-    if (retval) {
+       retval = block_til_ready(tty, filp, info);
+       if (retval) {
 #ifdef SERIAL_DEBUG_OPEN
-       printk("cy_open returning after block_til_ready with %d\n",
-              retval);
+               printk("cy_open returning after block_til_ready with %d\n",
+                      retval);
 #endif
-       return retval;
-    }
-
+               return retval;
+       }
 #ifdef SERIAL_DEBUG_OPEN
-    printk("cy_open done\n");/**/
+       printk("cy_open done\n");
+       /**/
 #endif
-    return 0;
-} /* cy_open */
-
-
+           return 0;
+}                              /* cy_open */
 
 /*
  * ---------------------------------------------------------------------
@@ -2012,11 +1984,10 @@ cy_open(struct tty_struct *tty, struct file * filp)
  * number, and identifies which options were configured into this
  * driver.
  */
-static void
-show_version(void)
+static void show_version(void)
 {
-    printk("MVME166/167 cd2401 driver\n");
-} /* show_version */
+       printk("MVME166/167 cd2401 driver\n");
+}                              /* show_version */
 
 /* initialize chips on card -- return number of valid
    chips (which is number of ports/4) */
@@ -2030,10 +2001,9 @@ show_version(void)
  * ... I wonder what I should do if this fails ...
  */
 
-void
-mvme167_serial_console_setup(int cflag)
+void mvme167_serial_console_setup(int cflag)
 {
-       volatile unsigned char* base_addr = (u_char *)BASE_ADDR;
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
        int ch;
        u_char spd;
        u_char rcor, rbpr, badspeed = 0;
@@ -2062,21 +2032,21 @@ mvme167_serial_console_setup(int cflag)
 
        /* OK, we have chosen a speed, now reset and reinitialise */
 
-        my_udelay(20000L);     /* Allow time for any active o/p to complete */
-        if(base_addr[CyCCR] != 0x00){
-            local_irq_restore(flags);
-            /* printk(" chip is never idle (CCR != 0)\n"); */
-            return;
-        }
+       my_udelay(20000L);      /* Allow time for any active o/p to complete */
+       if (base_addr[CyCCR] != 0x00) {
+               local_irq_restore(flags);
+               /* printk(" chip is never idle (CCR != 0)\n"); */
+               return;
+       }
 
-        base_addr[CyCCR] = CyCHIP_RESET;       /* Reset the chip */
-        my_udelay(1000L);
+       base_addr[CyCCR] = CyCHIP_RESET;        /* Reset the chip */
+       my_udelay(1000L);
 
-        if(base_addr[CyGFRCR] == 0x00){
-            local_irq_restore(flags);
-            /* printk(" chip is not responding (GFRCR stayed 0)\n"); */
-            return;
-        }
+       if (base_addr[CyGFRCR] == 0x00) {
+               local_irq_restore(flags);
+               /* printk(" chip is not responding (GFRCR stayed 0)\n"); */
+               return;
+       }
 
        /*
         * System clock is 20Mhz, divided by 2048, so divide by 10 for a 1.0ms
@@ -2085,9 +2055,9 @@ mvme167_serial_console_setup(int cflag)
 
        base_addr[CyTPR] = 10;
 
-       base_addr[CyPILR1] = 0x01;    /* Interrupt level for modem change */
-       base_addr[CyPILR2] = 0x02;    /* Interrupt level for tx ints */
-       base_addr[CyPILR3] = 0x03;    /* Interrupt level for rx ints */
+       base_addr[CyPILR1] = 0x01;      /* Interrupt level for modem change */
+       base_addr[CyPILR2] = 0x02;      /* Interrupt level for tx ints */
+       base_addr[CyPILR3] = 0x03;      /* Interrupt level for rx ints */
 
        /*
         * Attempt to set up all channels to something reasonable, and
@@ -2095,11 +2065,11 @@ mvme167_serial_console_setup(int cflag)
         * the ammount of fiddling we have to do in normal running.
         */
 
-       for (ch = 3; ch >= 0 ; ch--) {
-               base_addr[CyCAR] = (u_char)ch;
+       for (ch = 3; ch >= 0; ch--) {
+               base_addr[CyCAR] = (u_char) ch;
                base_addr[CyIER] = 0;
                base_addr[CyCMR] = CyASYNC;
-               base_addr[CyLICR] = (u_char)ch << 2;
+               base_addr[CyLICR] = (u_char) ch << 2;
                base_addr[CyLIVR] = 0x5c;
                base_addr[CyTCOR] = baud_co[spd];
                base_addr[CyTBPR] = baud_bpr[spd];
@@ -2118,29 +2088,30 @@ mvme167_serial_console_setup(int cflag)
                base_addr[CyCOR7] = 0;
                base_addr[CyRTPRL] = 2;
                base_addr[CyRTPRH] = 0;
-               base_addr[CyMSVR1] = 0;
-               base_addr[CyMSVR2] = 0;
-               write_cy_cmd(base_addr,CyINIT_CHAN|CyDIS_RCVR|CyDIS_XMTR);
+               base_addr[CyMSVR1] = 0;
+               base_addr[CyMSVR2] = 0;
+               write_cy_cmd(base_addr, CyINIT_CHAN | CyDIS_RCVR | CyDIS_XMTR);
        }
 
        /*
         * Now do specials for channel zero....
         */
 
-        base_addr[CyMSVR1] = CyRTS;
-        base_addr[CyMSVR2] = CyDTR;
+       base_addr[CyMSVR1] = CyRTS;
+       base_addr[CyMSVR2] = CyDTR;
        base_addr[CyIER] = CyRxData;
-       write_cy_cmd(base_addr,CyENB_RCVR|CyENB_XMTR);
+       write_cy_cmd(base_addr, CyENB_RCVR | CyENB_XMTR);
 
        local_irq_restore(flags);
 
        my_udelay(20000L);      /* Let it all settle down */
 
-        printk("CD2401 initialised,  chip is rev 0x%02x\n", base_addr[CyGFRCR]);
+       printk("CD2401 initialised,  chip is rev 0x%02x\n", base_addr[CyGFRCR]);
        if (badspeed)
-               printk("  WARNING:  Failed to identify line speed, rcor=%02x,rbpr=%02x\n",
-                                       rcor >> 5, rbpr);
-} /* serial_console_init */
+               printk
+                   ("  WARNING:  Failed to identify line speed, rcor=%02x,rbpr=%02x\n",
+                    rcor >> 5, rbpr);
+}                              /* serial_console_init */
 
 static const struct tty_operations cy_ops = {
        .open = cy_open,
@@ -2161,6 +2132,7 @@ static const struct tty_operations cy_ops = {
        .tiocmget = cy_tiocmget,
        .tiocmset = cy_tiocmset,
 };
+
 /* The serial driver boot-time initialization code!
     Hardware I/O ports are mapped to character special devices on a
     first found, first allocated manner.  That is, this code searches
@@ -2177,214 +2149,214 @@ static const struct tty_operations cy_ops = {
     If there are more cards with more ports than have been statically
     allocated above, a warning is printed and the extra ports are ignored.
  */
-static int __init
-serial167_init(void)
+static int __init serial167_init(void)
 {
-  struct cyclades_port *info;
-  int ret = 0;
-  int good_ports = 0;
-  int port_num = 0;
-  int index;
-  int DefSpeed;
+       struct cyclades_port *info;
+       int ret = 0;
+       int good_ports = 0;
+       int port_num = 0;
+       int index;
+       int DefSpeed;
 #ifdef notyet
-  struct sigaction sa;
+       struct sigaction sa;
 #endif
 
-    if (!(mvme16x_config &MVME16x_CONFIG_GOT_CD2401))
-       return 0;
+       if (!(mvme16x_config & MVME16x_CONFIG_GOT_CD2401))
+               return 0;
 
-    cy_serial_driver = alloc_tty_driver(NR_PORTS);
-    if (!cy_serial_driver)
-       return -ENOMEM;
+       cy_serial_driver = alloc_tty_driver(NR_PORTS);
+       if (!cy_serial_driver)
+               return -ENOMEM;
 
 #if 0
-scrn[1] = '\0';
+       scrn[1] = '\0';
 #endif
 
-    show_version();
+       show_version();
 
-    /* Has "console=0,9600n8" been used in bootinfo to change speed? */
-    if (serial_console_cflag)
-       DefSpeed = serial_console_cflag & 0017;
-    else {
-       DefSpeed = initial_console_speed;
-       serial_console_info = &cy_port[0];
-       serial_console_cflag = DefSpeed | CS8;
+       /* Has "console=0,9600n8" been used in bootinfo to change speed? */
+       if (serial_console_cflag)
+               DefSpeed = serial_console_cflag & 0017;
+       else {
+               DefSpeed = initial_console_speed;
+               serial_console_info = &cy_port[0];
+               serial_console_cflag = DefSpeed | CS8;
 #if 0
-       serial_console = 64; /*callout_driver.minor_start*/
-#endif
-    }
-
-    /* Initialize the tty_driver structure */
-    
-    cy_serial_driver->owner = THIS_MODULE;
-    cy_serial_driver->name = "ttyS";
-    cy_serial_driver->major = TTY_MAJOR;
-    cy_serial_driver->minor_start = 64;
-    cy_serial_driver->type = TTY_DRIVER_TYPE_SERIAL;
-    cy_serial_driver->subtype = SERIAL_TYPE_NORMAL;
-    cy_serial_driver->init_termios = tty_std_termios;
-    cy_serial_driver->init_termios.c_cflag =
-           B9600 | CS8 | CREAD | HUPCL | CLOCAL;
-    cy_serial_driver->flags = TTY_DRIVER_REAL_RAW;
-    tty_set_operations(cy_serial_driver, &cy_ops);
+               serial_console = 64;    /*callout_driver.minor_start */
+#endif
+       }
 
-    ret = tty_register_driver(cy_serial_driver);
-    if (ret) {
-           printk(KERN_ERR "Couldn't register MVME166/7 serial driver\n");
-           put_tty_driver(cy_serial_driver);
-           return ret;
-    }
+       /* Initialize the tty_driver structure */
 
-    port_num = 0;
-    info = cy_port;
-    for (index = 0; index < 1; index++) {
+       cy_serial_driver->owner = THIS_MODULE;
+       cy_serial_driver->name = "ttyS";
+       cy_serial_driver->major = TTY_MAJOR;
+       cy_serial_driver->minor_start = 64;
+       cy_serial_driver->type = TTY_DRIVER_TYPE_SERIAL;
+       cy_serial_driver->subtype = SERIAL_TYPE_NORMAL;
+       cy_serial_driver->init_termios = tty_std_termios;
+       cy_serial_driver->init_termios.c_cflag =
+           B9600 | CS8 | CREAD | HUPCL | CLOCAL;
+       cy_serial_driver->flags = TTY_DRIVER_REAL_RAW;
+       tty_set_operations(cy_serial_driver, &cy_ops);
+
+       ret = tty_register_driver(cy_serial_driver);
+       if (ret) {
+               printk(KERN_ERR "Couldn't register MVME166/7 serial driver\n");
+               put_tty_driver(cy_serial_driver);
+               return ret;
+       }
 
-       good_ports = 4;
+       port_num = 0;
+       info = cy_port;
+       for (index = 0; index < 1; index++) {
 
-       if(port_num < NR_PORTS){
-           while( good_ports-- && port_num < NR_PORTS){
+               good_ports = 4;
+
+               if (port_num < NR_PORTS) {
+                       while (good_ports-- && port_num < NR_PORTS) {
                /*** initialize port ***/
-               info->magic = CYCLADES_MAGIC;
-               info->type = PORT_CIRRUS;
-               info->card = index;
-               info->line = port_num;
-               info->flags = STD_COM_FLAGS;
-               info->tty = NULL;
-               info->xmit_fifo_size = 12;
-               info->cor1 = CyPARITY_NONE|Cy_8_BITS;
-               info->cor2 = CyETC;
-               info->cor3 = Cy_1_STOP;
-               info->cor4 = 0x08; /* _very_ small receive threshold */
-               info->cor5 = 0;
-               info->cor6 = 0;
-               info->cor7 = 0;
-               info->tbpr = baud_bpr[DefSpeed]; /* Tx BPR */
-               info->tco = baud_co[DefSpeed]; /* Tx CO */
-               info->rbpr = baud_bpr[DefSpeed]; /* Rx BPR */
-               info->rco = baud_co[DefSpeed] >> 5; /* Rx CO */
-               info->close_delay = 0;
-               info->x_char = 0;
-               info->event = 0;
-               info->count = 0;
+                               info->magic = CYCLADES_MAGIC;
+                               info->type = PORT_CIRRUS;
+                               info->card = index;
+                               info->line = port_num;
+                               info->flags = STD_COM_FLAGS;
+                               info->tty = NULL;
+                               info->xmit_fifo_size = 12;
+                               info->cor1 = CyPARITY_NONE | Cy_8_BITS;
+                               info->cor2 = CyETC;
+                               info->cor3 = Cy_1_STOP;
+                               info->cor4 = 0x08;      /* _very_ small receive threshold */
+                               info->cor5 = 0;
+                               info->cor6 = 0;
+                               info->cor7 = 0;
+                               info->tbpr = baud_bpr[DefSpeed];        /* Tx BPR */
+                               info->tco = baud_co[DefSpeed];  /* Tx CO */
+                               info->rbpr = baud_bpr[DefSpeed];        /* Rx BPR */
+                               info->rco = baud_co[DefSpeed] >> 5;     /* Rx CO */
+                               info->close_delay = 0;
+                               info->x_char = 0;
+                               info->event = 0;
+                               info->count = 0;
 #ifdef SERIAL_DEBUG_COUNT
-    printk("cyc: %d: setting count to 0\n", __LINE__);
-#endif
-               info->blocked_open = 0;
-               info->default_threshold = 0;
-               info->default_timeout = 0;
-               INIT_WORK(&info->tqueue, do_softint);
-               init_waitqueue_head(&info->open_wait);
-               init_waitqueue_head(&info->close_wait);
-               /* info->session */
-               /* info->pgrp */
+                               printk("cyc: %d: setting count to 0\n",
+                                      __LINE__);
+#endif
+                               info->blocked_open = 0;
+                               info->default_threshold = 0;
+                               info->default_timeout = 0;
+                               INIT_WORK(&info->tqueue, do_softint);
+                               init_waitqueue_head(&info->open_wait);
+                               init_waitqueue_head(&info->close_wait);
+                               /* info->session */
+                               /* info->pgrp */
 /*** !!!!!!!! this may expose new bugs !!!!!!!!! *********/
-               info->read_status_mask = CyTIMEOUT| CySPECHAR| CyBREAK
-                                       | CyPARITY| CyFRAME| CyOVERRUN;
-               /* info->timeout */
-
-               printk("ttyS%d ", info->line);
-               port_num++;info++;
-               if(!(port_num & 7)){
-                   printk("\n               ");
+                               info->read_status_mask =
+                                   CyTIMEOUT | CySPECHAR | CyBREAK | CyPARITY |
+                                   CyFRAME | CyOVERRUN;
+                               /* info->timeout */
+
+                               printk("ttyS%d ", info->line);
+                               port_num++;
+                               info++;
+                               if (!(port_num & 7)) {
+                                       printk("\n               ");
+                               }
+                       }
                }
-           }
-       }
-       printk("\n");
-    }
-    while( port_num < NR_PORTS){
-       info->line = -1;
-       port_num++;info++;
-    }
+               printk("\n");
+       }
+       while (port_num < NR_PORTS) {
+               info->line = -1;
+               port_num++;
+               info++;
+       }
 #ifdef CONFIG_REMOTE_DEBUG
-    debug_setup();
-#endif
-    ret = request_irq(MVME167_IRQ_SER_ERR, cd2401_rxerr_interrupt, 0,
-                               "cd2401_errors", cd2401_rxerr_interrupt);
-    if (ret) {
-           printk(KERN_ERR "Could't get cd2401_errors IRQ");
-           goto cleanup_serial_driver;
-    }
-
-    ret = request_irq(MVME167_IRQ_SER_MODEM, cd2401_modem_interrupt, 0,
-                               "cd2401_modem", cd2401_modem_interrupt);
-    if (ret) {
-           printk(KERN_ERR "Could't get cd2401_modem IRQ");
-           goto cleanup_irq_cd2401_errors;
-    }
-
-    ret = request_irq(MVME167_IRQ_SER_TX, cd2401_tx_interrupt, 0,
-                               "cd2401_txints", cd2401_tx_interrupt);
-    if (ret) {
-           printk(KERN_ERR "Could't get cd2401_txints IRQ");
-           goto cleanup_irq_cd2401_modem;
-    }
-
-    ret = request_irq(MVME167_IRQ_SER_RX, cd2401_rx_interrupt, 0,
-                               "cd2401_rxints", cd2401_rx_interrupt);
-    if (ret) {
-           printk(KERN_ERR "Could't get cd2401_rxints IRQ");
-           goto cleanup_irq_cd2401_txints;
-    }
-
-    /* Now we have registered the interrupt handlers, allow the interrupts */
-
-    pcc2chip[PccSCCMICR] = 0x15;               /* Serial ints are level 5 */
-    pcc2chip[PccSCCTICR] = 0x15;
-    pcc2chip[PccSCCRICR] = 0x15;
-
-    pcc2chip[PccIMLR] = 3;                     /* Allow PCC2 ints above 3!? */
-
-    return 0;
+       debug_setup();
+#endif
+       ret = request_irq(MVME167_IRQ_SER_ERR, cd2401_rxerr_interrupt, 0,
+                         "cd2401_errors", cd2401_rxerr_interrupt);
+       if (ret) {
+               printk(KERN_ERR "Could't get cd2401_errors IRQ");
+               goto cleanup_serial_driver;
+       }
+
+       ret = request_irq(MVME167_IRQ_SER_MODEM, cd2401_modem_interrupt, 0,
+                         "cd2401_modem", cd2401_modem_interrupt);
+       if (ret) {
+               printk(KERN_ERR "Could't get cd2401_modem IRQ");
+               goto cleanup_irq_cd2401_errors;
+       }
+
+       ret = request_irq(MVME167_IRQ_SER_TX, cd2401_tx_interrupt, 0,
+                         "cd2401_txints", cd2401_tx_interrupt);
+       if (ret) {
+               printk(KERN_ERR "Could't get cd2401_txints IRQ");
+               goto cleanup_irq_cd2401_modem;
+       }
+
+       ret = request_irq(MVME167_IRQ_SER_RX, cd2401_rx_interrupt, 0,
+                         "cd2401_rxints", cd2401_rx_interrupt);
+       if (ret) {
+               printk(KERN_ERR "Could't get cd2401_rxints IRQ");
+               goto cleanup_irq_cd2401_txints;
+       }
+
+       /* Now we have registered the interrupt handlers, allow the interrupts */
+
+       pcc2chip[PccSCCMICR] = 0x15;    /* Serial ints are level 5 */
+       pcc2chip[PccSCCTICR] = 0x15;
+       pcc2chip[PccSCCRICR] = 0x15;
+
+       pcc2chip[PccIMLR] = 3;  /* Allow PCC2 ints above 3!? */
+
+       return 0;
 cleanup_irq_cd2401_txints:
-    free_irq(MVME167_IRQ_SER_TX, cd2401_tx_interrupt);
+       free_irq(MVME167_IRQ_SER_TX, cd2401_tx_interrupt);
 cleanup_irq_cd2401_modem:
-    free_irq(MVME167_IRQ_SER_MODEM, cd2401_modem_interrupt);
+       free_irq(MVME167_IRQ_SER_MODEM, cd2401_modem_interrupt);
 cleanup_irq_cd2401_errors:
-    free_irq(MVME167_IRQ_SER_ERR, cd2401_rxerr_interrupt);
+       free_irq(MVME167_IRQ_SER_ERR, cd2401_rxerr_interrupt);
 cleanup_serial_driver:
-    if (tty_unregister_driver(cy_serial_driver))
-           printk(KERN_ERR "Couldn't unregister MVME166/7 serial driver\n");
-    put_tty_driver(cy_serial_driver);
-    return ret;
-} /* serial167_init */
+       if (tty_unregister_driver(cy_serial_driver))
+               printk(KERN_ERR
+                      "Couldn't unregister MVME166/7 serial driver\n");
+       put_tty_driver(cy_serial_driver);
+       return ret;
+}                              /* serial167_init */
 
 module_init(serial167_init);
 
-
 #ifdef CYCLOM_SHOW_STATUS
-static void
-show_status(int line_num)
+static void show_status(int line_num)
 {
-  volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
-  int channel;
-  struct cyclades_port * info;
-  unsigned long flags;
-
-    info = &cy_port[line_num];
-    channel = info->line;
-    printk("  channel %d\n", channel);/**/
-
-    printk(" cy_port\n");
-    printk("  card line flags = %d %d %x\n",
-                 info->card, info->line, info->flags);
-    printk("  *tty read_status_mask timeout xmit_fifo_size = %lx %x %x %x\n",
-                 (long)info->tty, info->read_status_mask,
-                 info->timeout, info->xmit_fifo_size);
-    printk("  cor1,cor2,cor3,cor4,cor5,cor6,cor7 = %x %x %x %x %x %x %x\n",
-             info->cor1, info->cor2, info->cor3, info->cor4, info->cor5,
-                       info->cor6, info->cor7);
-    printk("  tbpr,tco,rbpr,rco = %d %d %d %d\n",
-             info->tbpr, info->tco, info->rbpr, info->rco);
-    printk("  close_delay event count = %d %d %d\n",
-             info->close_delay, info->event, info->count);
-    printk("  x_char blocked_open = %x %x\n",
-             info->x_char, info->blocked_open);
-    printk("  open_wait = %lx %lx %lx\n",
-             (long)info->open_wait);
-
-
-    local_irq_save(flags);
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
+       int channel;
+       struct cyclades_port *info;
+       unsigned long flags;
+
+       info = &cy_port[line_num];
+       channel = info->line;
+       printk("  channel %d\n", channel);
+       /**/ printk(" cy_port\n");
+       printk("  card line flags = %d %d %x\n",
+              info->card, info->line, info->flags);
+       printk
+           ("  *tty read_status_mask timeout xmit_fifo_size = %lx %x %x %x\n",
+            (long)info->tty, info->read_status_mask, info->timeout,
+            info->xmit_fifo_size);
+       printk("  cor1,cor2,cor3,cor4,cor5,cor6,cor7 = %x %x %x %x %x %x %x\n",
+              info->cor1, info->cor2, info->cor3, info->cor4, info->cor5,
+              info->cor6, info->cor7);
+       printk("  tbpr,tco,rbpr,rco = %d %d %d %d\n", info->tbpr, info->tco,
+              info->rbpr, info->rco);
+       printk("  close_delay event count = %d %d %d\n", info->close_delay,
+              info->event, info->count);
+       printk("  x_char blocked_open = %x %x\n", info->x_char,
+              info->blocked_open);
+       printk("  open_wait = %lx %lx %lx\n", (long)info->open_wait);
+
+       local_irq_save(flags);
 
 /* Global Registers */
 
@@ -2398,7 +2370,7 @@ show_status(int line_num)
        printk(" CyMIR %x\n", base_addr[CyMIR]);
        printk(" CyTPR %x\n", base_addr[CyTPR]);
 
-       base_addr[CyCAR] = (u_char)channel;
+       base_addr[CyCAR] = (u_char) channel;
 
 /* Virtual Registers */
 
@@ -2442,11 +2414,10 @@ show_status(int line_num)
        printk(" CyTBPR %x\n", base_addr[CyTBPR]);
        printk(" CyTCOR %x\n", base_addr[CyTCOR]);
 
-    local_irq_restore(flags);
-} /* show_status */
+       local_irq_restore(flags);
+}                              /* show_status */
 #endif
 
-
 #if 0
 /* Dummy routine in mvme16x/config.c for now */
 
@@ -2459,61 +2430,67 @@ void console_setup(char *str, int *ints)
        int cflag = 0;
 
        /* Sanity check. */
-       if (ints[0] > 3 || ints[1] > 3) return;
+       if (ints[0] > 3 || ints[1] > 3)
+               return;
 
        /* Get baud, bits and parity */
        baud = 2400;
        bits = 8;
        parity = 'n';
-       if (ints[2]) baud = ints[2];
+       if (ints[2])
+               baud = ints[2];
        if ((s = strchr(str, ','))) {
                do {
                        s++;
-               } while(*s >= '0' && *s <= '9');
-               if (*s) parity = *s++;
-               if (*s) bits   = *s - '0';
+               } while (*s >= '0' && *s <= '9');
+               if (*s)
+                       parity = *s++;
+               if (*s)
+                       bits = *s - '0';
        }
 
        /* Now construct a cflag setting. */
-       switch(baud) {
-               case 1200:
-                       cflag |= B1200;
-                       break;
-               case 9600:
-                       cflag |= B9600;
-                       break;
-               case 19200:
-                       cflag |= B19200;
-                       break;
-               case 38400:
-                       cflag |= B38400;
-                       break;
-               case 2400:
-               default:
-                       cflag |= B2400;
-                       break;
+       switch (baud) {
+       case 1200:
+               cflag |= B1200;
+               break;
+       case 9600:
+               cflag |= B9600;
+               break;
+       case 19200:
+               cflag |= B19200;
+               break;
+       case 38400:
+               cflag |= B38400;
+               break;
+       case 2400:
+       default:
+               cflag |= B2400;
+               break;
        }
-       switch(bits) {
-               case 7:
-                       cflag |= CS7;
-                       break;
-               default:
-               case 8:
-                       cflag |= CS8;
-                       break;
+       switch (bits) {
+       case 7:
+               cflag |= CS7;
+               break;
+       default:
+       case 8:
+               cflag |= CS8;
+               break;
        }
-       switch(parity) {
-               case 'o': case 'O':
-                       cflag |= PARODD;
-                       break;
-               case 'e': case 'E':
-                       cflag |= PARENB;
-                       break;
+       switch (parity) {
+       case 'o':
+       case 'O':
+               cflag |= PARODD;
+               break;
+       case 'e':
+       case 'E':
+               cflag |= PARENB;
+               break;
        }
 
        serial_console_info = &cy_port[ints[1]];
        serial_console_cflag = cflag;
-       serial_console = ints[1] + 64; /*callout_driver.minor_start*/
+       serial_console = ints[1] + 64;  /*callout_driver.minor_start */
 }
 #endif
 
@@ -2532,9 +2509,10 @@ void console_setup(char *str, int *ints)
  * The console must be locked when we get here.
  */
 
-void serial167_console_write(struct console *co, const char *str, unsigned count)
+void serial167_console_write(struct console *co, const char *str,
+                            unsigned count)
 {
-       volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
        unsigned long flags;
        volatile u_char sink;
        u_char ier;
@@ -2547,7 +2525,7 @@ void serial167_console_write(struct console *co, const char *str, unsigned count
        /* Ensure transmitter is enabled! */
 
        port = 0;
-       base_addr[CyCAR] = (u_char)port;
+       base_addr[CyCAR] = (u_char) port;
        while (base_addr[CyCCR])
                ;
        base_addr[CyCCR] = CyENB_XMTR;
@@ -2556,8 +2534,7 @@ void serial167_console_write(struct console *co, const char *str, unsigned count
        base_addr[CyIER] = CyTxMpty;
 
        while (1) {
-               if (pcc2chip[PccSCCTICR] & 0x20)
-               {
+               if (pcc2chip[PccSCCTICR] & 0x20) {
                        /* We have a Tx int. Acknowledge it */
                        sink = pcc2chip[PccTPIACKR];
                        if ((base_addr[CyLICR] >> 2) == port) {
@@ -2571,18 +2548,15 @@ void serial167_console_write(struct console *co, const char *str, unsigned count
                                        str++;
                                        i++;
                                        do_lf = 0;
-                               }
-                               else if (*str == '\n') {
+                               } else if (*str == '\n') {
                                        base_addr[CyTDR] = '\r';
                                        do_lf = 1;
-                               }
-                               else {
+                               } else {
                                        base_addr[CyTDR] = *str++;
                                        i++;
                                }
                                base_addr[CyTEOIR] = 0;
-                       }
-                       else
+                       } else
                                base_addr[CyTEOIR] = CyNOTRANS;
                }
        }
@@ -2592,45 +2566,44 @@ void serial167_console_write(struct console *co, const char *str, unsigned count
        local_irq_restore(flags);
 }
 
-static struct tty_driver *serial167_console_device(struct console *c, int *index)
+static struct tty_driver *serial167_console_device(struct console *c,
+                                                  int *index)
 {
        *index = c->index;
        return cy_serial_driver;
 }
 
-
 static int __init serial167_console_setup(struct console *co, char *options)
 {
        return 0;
 }
 
-
 static struct console sercons = {
-       .name           = "ttyS",
-       .write          = serial167_console_write,
-       .device         = serial167_console_device,
-       .setup          = serial167_console_setup,
-       .flags          = CON_PRINTBUFFER,
-       .index          = -1,
+       .name = "ttyS",
+       .write = serial167_console_write,
+       .device = serial167_console_device,
+       .setup = serial167_console_setup,
+       .flags = CON_PRINTBUFFER,
+       .index = -1,
 };
 
-
 static int __init serial167_console_init(void)
 {
        if (vme_brdtype == VME_TYPE_MVME166 ||
-                       vme_brdtype == VME_TYPE_MVME167 ||
-                       vme_brdtype == VME_TYPE_MVME177) {
+           vme_brdtype == VME_TYPE_MVME167 ||
+           vme_brdtype == VME_TYPE_MVME177) {
                mvme167_serial_console_setup(0);
                register_console(&sercons);
        }
        return 0;
 }
+
 console_initcall(serial167_console_init);
 
 #ifdef CONFIG_REMOTE_DEBUG
-void putDebugChar (int c)
+void putDebugChar(int c)
 {
-       volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
        unsigned long flags;
        volatile u_char sink;
        u_char ier;
@@ -2641,7 +2614,7 @@ void putDebugChar (int c)
        /* Ensure transmitter is enabled! */
 
        port = DEBUG_PORT;
-       base_addr[CyCAR] = (u_char)port;
+       base_addr[CyCAR] = (u_char) port;
        while (base_addr[CyCCR])
                ;
        base_addr[CyCCR] = CyENB_XMTR;
@@ -2650,16 +2623,14 @@ void putDebugChar (int c)
        base_addr[CyIER] = CyTxMpty;
 
        while (1) {
-               if (pcc2chip[PccSCCTICR] & 0x20)
-               {
+               if (pcc2chip[PccSCCTICR] & 0x20) {
                        /* We have a Tx int. Acknowledge it */
                        sink = pcc2chip[PccTPIACKR];
                        if ((base_addr[CyLICR] >> 2) == port) {
                                base_addr[CyTDR] = c;
                                base_addr[CyTEOIR] = 0;
                                break;
-                       }
-                       else
+                       } else
                                base_addr[CyTEOIR] = CyNOTRANS;
                }
        }
@@ -2671,7 +2642,7 @@ void putDebugChar (int c)
 
 int getDebugChar()
 {
-       volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
        unsigned long flags;
        volatile u_char sink;
        u_char ier;
@@ -2693,7 +2664,7 @@ int getDebugChar()
        /* Ensure receiver is enabled! */
 
        port = DEBUG_PORT;
-       base_addr[CyCAR] = (u_char)port;
+       base_addr[CyCAR] = (u_char) port;
 #if 0
        while (base_addr[CyCCR])
                ;
@@ -2703,31 +2674,30 @@ int getDebugChar()
        base_addr[CyIER] = CyRxData;
 
        while (1) {
-               if (pcc2chip[PccSCCRICR] & 0x20)
-               {
+               if (pcc2chip[PccSCCRICR] & 0x20) {
                        /* We have a Rx int. Acknowledge it */
                        sink = pcc2chip[PccRPIACKR];
                        if ((base_addr[CyLICR] >> 2) == port) {
                                int cnt = base_addr[CyRFOC];
-                               while (cnt-- > 0)
-                               {
+                               while (cnt-- > 0) {
                                        c = base_addr[CyRDR];
                                        if (c == 0)
-                                               printk ("!! debug char is null (cnt=%d) !!", cnt);
+                                               printk
+                                                   ("!! debug char is null (cnt=%d) !!",
+                                                    cnt);
                                        else
-                                               queueDebugChar (c);
+                                               queueDebugChar(c);
                                }
                                base_addr[CyREOIR] = 0;
                                i = debugiq.out;
                                if (i == debugiq.in)
-                                       panic ("Debug input queue empty!");
+                                       panic("Debug input queue empty!");
                                c = debugiq.buf[i];
                                if (++i == DEBUG_LEN)
                                        i = 0;
                                debugiq.out = i;
                                break;
-                       }
-                       else
+                       } else
                                base_addr[CyREOIR] = CyNOTRANS;
                }
        }
@@ -2739,7 +2709,7 @@ int getDebugChar()
        return (c);
 }
 
-void queueDebugChar (int c)
+void queueDebugChar(int c)
 {
        int i;
 
@@ -2751,73 +2721,71 @@ void queueDebugChar (int c)
                debugiq.in = i;
 }
 
-static void
-debug_setup()
+static void debug_setup()
 {
-  unsigned long flags;
-  volatile unsigned char *base_addr = (u_char *)BASE_ADDR;
-  int   i, cflag;
+       unsigned long flags;
+       volatile unsigned char *base_addr = (u_char *) BASE_ADDR;
+       int i, cflag;
 
-    cflag = B19200;
+       cflag = B19200;
 
-    local_irq_save(flags);
+       local_irq_save(flags);
 
-    for (i = 0; i < 4; i++)
-    {
-       base_addr[CyCAR] = i;
-       base_addr[CyLICR] = i << 2;
-    }
+       for (i = 0; i < 4; i++) {
+               base_addr[CyCAR] = i;
+               base_addr[CyLICR] = i << 2;
+       }
 
-    debugiq.in = debugiq.out = 0;
+       debugiq.in = debugiq.out = 0;
 
-    base_addr[CyCAR] = DEBUG_PORT;
+       base_addr[CyCAR] = DEBUG_PORT;
 
-    /* baud rate */
-    i = cflag & CBAUD;
+       /* baud rate */
+       i = cflag & CBAUD;
 
-    base_addr[CyIER] = 0;
+       base_addr[CyIER] = 0;
 
-    base_addr[CyCMR] = CyASYNC;
-    base_addr[CyLICR] = DEBUG_PORT << 2;
-    base_addr[CyLIVR] = 0x5c;
+       base_addr[CyCMR] = CyASYNC;
+       base_addr[CyLICR] = DEBUG_PORT << 2;
+       base_addr[CyLIVR] = 0x5c;
 
-    /* tx and rx baud rate */
+       /* tx and rx baud rate */
 
-    base_addr[CyTCOR] = baud_co[i];
-    base_addr[CyTBPR] = baud_bpr[i];
-    base_addr[CyRCOR] = baud_co[i] >> 5;
-    base_addr[CyRBPR] = baud_bpr[i];
+       base_addr[CyTCOR] = baud_co[i];
+       base_addr[CyTBPR] = baud_bpr[i];
+       base_addr[CyRCOR] = baud_co[i] >> 5;
+       base_addr[CyRBPR] = baud_bpr[i];
 
-    /* set line characteristics  according configuration */
+       /* set line characteristics  according configuration */
 
-    base_addr[CySCHR1] = 0;
-    base_addr[CySCHR2] = 0;
-    base_addr[CySCRL] = 0;
-    base_addr[CySCRH] = 0;
-    base_addr[CyCOR1] = Cy_8_BITS | CyPARITY_NONE;
-    base_addr[CyCOR2] = 0;
-    base_addr[CyCOR3] = Cy_1_STOP;
-    base_addr[CyCOR4] = baud_cor4[i];
-    base_addr[CyCOR5] = 0;
-    base_addr[CyCOR6] = 0;
-    base_addr[CyCOR7] = 0;
+       base_addr[CySCHR1] = 0;
+       base_addr[CySCHR2] = 0;
+       base_addr[CySCRL] = 0;
+       base_addr[CySCRH] = 0;
+       base_addr[CyCOR1] = Cy_8_BITS | CyPARITY_NONE;
+       base_addr[CyCOR2] = 0;
+       base_addr[CyCOR3] = Cy_1_STOP;
+       base_addr[CyCOR4] = baud_cor4[i];
+       base_addr[CyCOR5] = 0;
+       base_addr[CyCOR6] = 0;
+       base_addr[CyCOR7] = 0;
 
-    write_cy_cmd(base_addr,CyINIT_CHAN);
-    write_cy_cmd(base_addr,CyENB_RCVR);
+       write_cy_cmd(base_addr, CyINIT_CHAN);
+       write_cy_cmd(base_addr, CyENB_RCVR);
 
-    base_addr[CyCAR] = DEBUG_PORT; /* !!! Is this needed? */
+       base_addr[CyCAR] = DEBUG_PORT;  /* !!! Is this needed? */
 
-    base_addr[CyRTPRL] = 2;
-    base_addr[CyRTPRH] = 0;
+       base_addr[CyRTPRL] = 2;
+       base_addr[CyRTPRH] = 0;
 
-    base_addr[CyMSVR1] = CyRTS;
-    base_addr[CyMSVR2] = CyDTR;
+       base_addr[CyMSVR1] = CyRTS;
+       base_addr[CyMSVR2] = CyDTR;
 
-    base_addr[CyIER] = CyRxData;
+       base_addr[CyIER] = CyRxData;
 
-    local_irq_restore(flags);
+       local_irq_restore(flags);
 
-} /* debug_setup */
+}                              /* debug_setup */
 
 #endif
 
index 17d54e1331b2ea61475534e8b294cd6e2ebb7e3d..78237577b05ac57790ac34aee0f601b8aae23aa7 100644 (file)
@@ -36,7 +36,6 @@
 #include <linux/module.h>
 #include <linux/input.h>
 #include <linux/pci.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/miscdevice.h>
index 20946f5127e0ca97b8b902fe3e22ae464722bcbf..baf7234b6e662fd8277368ecdf854ca2246de4d6 100644 (file)
@@ -459,10 +459,9 @@ void missed_irq (unsigned long data)
        if (irq) {
                printk (KERN_INFO "Missed interrupt... Calling int from timer. \n");
                sx_interrupt (((struct specialix_board *)data)->irq,
-                             (void*)data, NULL);
+                               (void*)data);
        }
-       missed_irq_timer.expires = jiffies + sx_poll;
-       add_timer (&missed_irq_timer);
+       mod_timer(&missed_irq_timer, jiffies + sx_poll);
 }
 #endif
 
@@ -597,11 +596,8 @@ static int sx_probe(struct specialix_board *bp)
        dprintk (SX_DEBUG_INIT, " GFCR = 0x%02x\n", sx_in_off(bp, CD186x_GFRCR) );
 
 #ifdef SPECIALIX_TIMER
-       init_timer (&missed_irq_timer);
-       missed_irq_timer.function = missed_irq;
-       missed_irq_timer.data = (unsigned long) bp;
-       missed_irq_timer.expires = jiffies + sx_poll;
-       add_timer (&missed_irq_timer);
+       setup_timer(&missed_irq_timer, missed_irq, (unsigned long)bp);
+       mod_timer(&missed_irq_timer, jiffies + sx_poll);
 #endif
 
        printk(KERN_INFO"sx%d: specialix IO8+ board detected at 0x%03x, IRQ %d, CD%d Rev. %c.\n",
@@ -2350,10 +2346,8 @@ static void do_softint(struct work_struct *work)
                return;
        }
 
-       if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &port->event)) {
+       if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &port->event))
                tty_wakeup(tty);
-               //wake_up_interruptible(&tty->write_wait);
-       }
 
        func_exit();
 }
@@ -2561,7 +2555,7 @@ static void __exit specialix_exit_module(void)
                if (sx_board[i].flags & SX_BOARD_PRESENT)
                        sx_release_io_range(&sx_board[i]);
 #ifdef SPECIALIX_TIMER
-       del_timer (&missed_irq_timer);
+       del_timer_sync(&missed_irq_timer);
 #endif
 
        func_exit();
index 3fa625db9e4b133b6caf258ed442d2675dad18c5..ce4db6f523627ebf0f1ca7841e65a30922c12204 100644 (file)
@@ -1148,10 +1148,8 @@ static void mgsl_bh_transmit(struct mgsl_struct *info)
                printk( "%s(%d):mgsl_bh_transmit() entry on %s\n",
                        __FILE__,__LINE__,info->device_name);
 
-       if (tty) {
+       if (tty)
                tty_wakeup(tty);
-               wake_up_interruptible(&tty->write_wait);
-       }
 
        /* if transmitter idle and loopmode_send_done_requested
         * then start echoing RxD to TxD
@@ -1800,9 +1798,7 @@ static int startup(struct mgsl_struct * info)
        
        memset(&info->icount, 0, sizeof(info->icount));
 
-       init_timer(&info->tx_timer);
-       info->tx_timer.data = (unsigned long)info;
-       info->tx_timer.function = mgsl_tx_timeout;
+       setup_timer(&info->tx_timer, mgsl_tx_timeout, (unsigned long)info);
        
        /* Allocate and claim adapter resources */
        retval = mgsl_claim_resources(info);
@@ -1853,7 +1849,7 @@ static void shutdown(struct mgsl_struct * info)
        wake_up_interruptible(&info->status_event_wait_q);
        wake_up_interruptible(&info->event_wait_q);
 
-       del_timer(&info->tx_timer);     
+       del_timer_sync(&info->tx_timer);
 
        if (info->xmit_buf) {
                free_page((unsigned long) info->xmit_buf);
@@ -2340,7 +2336,6 @@ static void mgsl_flush_buffer(struct tty_struct *tty)
        del_timer(&info->tx_timer);     
        spin_unlock_irqrestore(&info->irq_spinlock,flags);
        
-       wake_up_interruptible(&tty->write_wait);
        tty_wakeup(tty);
 }
 
@@ -5713,8 +5708,8 @@ static void usc_start_transmitter( struct mgsl_struct *info )
                        
                        usc_TCmd( info, TCmd_SendFrame );
                        
-                       info->tx_timer.expires = jiffies + msecs_to_jiffies(5000);
-                       add_timer(&info->tx_timer);     
+                       mod_timer(&info->tx_timer, jiffies +
+                                       msecs_to_jiffies(5000));
                }
                info->tx_active = 1;
        }
index 792c79c315e00292abc21e7febea957c171506c0..0a367cd4121ffc0ab127bcc64e4838da82d98c79 100644 (file)
@@ -1045,7 +1045,6 @@ static void flush_buffer(struct tty_struct *tty)
                info->tx_count = 0;
        spin_unlock_irqrestore(&info->lock,flags);
 
-       wake_up_interruptible(&tty->write_wait);
        tty_wakeup(tty);
 }
 
@@ -1826,8 +1825,7 @@ static void rx_async(struct slgt_info *info)
                if (i < count) {
                        /* receive buffer not completed */
                        info->rbuf_index += i;
-                       info->rx_timer.expires = jiffies + 1;
-                       add_timer(&info->rx_timer);
+                       mod_timer(&info->rx_timer, jiffies + 1);
                        break;
                }
 
@@ -1933,10 +1931,8 @@ static void bh_transmit(struct slgt_info *info)
        struct tty_struct *tty = info->tty;
 
        DBGBH(("%s bh_transmit\n", info->device_name));
-       if (tty) {
+       if (tty)
                tty_wakeup(tty);
-               wake_up_interruptible(&tty->write_wait);
-       }
 }
 
 static void dsr_change(struct slgt_info *info)
@@ -3343,13 +3339,8 @@ static struct slgt_info *alloc_dev(int adapter_num, int port_num, struct pci_dev
                info->adapter_num = adapter_num;
                info->port_num = port_num;
 
-               init_timer(&info->tx_timer);
-               info->tx_timer.data = (unsigned long)info;
-               info->tx_timer.function = tx_timeout;
-
-               init_timer(&info->rx_timer);
-               info->rx_timer.data = (unsigned long)info;
-               info->rx_timer.function = rx_timeout;
+               setup_timer(&info->tx_timer, tx_timeout, (unsigned long)info);
+               setup_timer(&info->rx_timer, rx_timeout, (unsigned long)info);
 
                /* Copy configuration info to device instance data */
                info->pdev = pdev;
@@ -3797,10 +3788,9 @@ static void tx_start(struct slgt_info *info)
                                }
                        }
 
-                       if (info->params.mode == MGSL_MODE_HDLC) {
-                               info->tx_timer.expires = jiffies + msecs_to_jiffies(5000);
-                               add_timer(&info->tx_timer);
-                       }
+                       if (info->params.mode == MGSL_MODE_HDLC)
+                               mod_timer(&info->tx_timer, jiffies +
+                                               msecs_to_jiffies(5000));
                } else {
                        tdma_reset(info);
                        /* set 1st descriptor address */
index 8f4d67afe5bf99fe1daea30940640b2c1cbbbe72..ef93d055bdd79dc64ba7889b64e87e2a67f3c597 100644 (file)
@@ -1258,7 +1258,6 @@ static void flush_buffer(struct tty_struct *tty)
        del_timer(&info->tx_timer);
        spin_unlock_irqrestore(&info->lock,flags);
 
-       wake_up_interruptible(&tty->write_wait);
        tty_wakeup(tty);
 }
 
@@ -2127,10 +2126,8 @@ void bh_transmit(SLMP_INFO *info)
                printk( "%s(%d):%s bh_transmit() entry\n",
                        __FILE__,__LINE__,info->device_name);
 
-       if (tty) {
+       if (tty)
                tty_wakeup(tty);
-               wake_up_interruptible(&tty->write_wait);
-       }
 }
 
 void bh_status(SLMP_INFO *info)
@@ -2747,8 +2744,7 @@ static int startup(SLMP_INFO * info)
 
        change_params(info);
 
-       info->status_timer.expires = jiffies + msecs_to_jiffies(10);
-       add_timer(&info->status_timer);
+       mod_timer(&info->status_timer, jiffies + msecs_to_jiffies(10));
 
        if (info->tty)
                clear_bit(TTY_IO_ERROR, &info->tty->flags);
@@ -3844,13 +3840,9 @@ static SLMP_INFO *alloc_dev(int adapter_num, int port_num, struct pci_dev *pdev)
                info->bus_type = MGSL_BUS_TYPE_PCI;
                info->irq_flags = IRQF_SHARED;
 
-               init_timer(&info->tx_timer);
-               info->tx_timer.data = (unsigned long)info;
-               info->tx_timer.function = tx_timeout;
-
-               init_timer(&info->status_timer);
-               info->status_timer.data = (unsigned long)info;
-               info->status_timer.function = status_timeout;
+               setup_timer(&info->tx_timer, tx_timeout, (unsigned long)info);
+               setup_timer(&info->status_timer, status_timeout,
+                               (unsigned long)info);
 
                /* Store the PCI9050 misc control register value because a flaw
                 * in the PCI9050 prevents LCR registers from being read if
@@ -4294,8 +4286,8 @@ void tx_start(SLMP_INFO *info)
                        write_reg(info, TXDMA + DIR, 0x40);             /* enable Tx DMA interrupts (EOM) */
                        write_reg(info, TXDMA + DSR, 0xf2);             /* clear Tx DMA IRQs, enable Tx DMA */
        
-                       info->tx_timer.expires = jiffies + msecs_to_jiffies(5000);
-                       add_timer(&info->tx_timer);
+                       mod_timer(&info->tx_timer, jiffies +
+                                       msecs_to_jiffies(5000));
                }
                else {
                        tx_load_fifo(info);
@@ -5577,10 +5569,7 @@ void status_timeout(unsigned long context)
        if (status)
                isr_io_pin(info,status);
 
-       info->status_timer.data = (unsigned long)info;
-       info->status_timer.function = status_timeout;
-       info->status_timer.expires = jiffies + msecs_to_jiffies(10);
-       add_timer(&info->status_timer);
+       mod_timer(&info->status_timer, jiffies + msecs_to_jiffies(10));
 }
 
 
index 7fd3cd5ddf2190269e206383ece44c481a889f78..1d8c4ae615513e9d6dd54875ba2dbae57a87e0fb 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/workqueue.h>
 #include <linux/kexec.h>
 #include <linux/irq.h>
+#include <linux/hrtimer.h>
 
 #include <asm/ptrace.h>
 #include <asm/irq_regs.h>
@@ -88,9 +89,8 @@ static struct sysrq_key_op sysrq_loglevel_op = {
 #ifdef CONFIG_VT
 static void sysrq_handle_SAK(int key, struct tty_struct *tty)
 {
-       if (tty)
-               do_SAK(tty);
-       reset_vc(vc_cons[fg_console].d);
+       struct work_struct *SAK_work = &vc_cons[fg_console].SAK_work;
+       schedule_work(SAK_work);
 }
 static struct sysrq_key_op sysrq_SAK_op = {
        .handler        = sysrq_handle_SAK,
@@ -159,6 +159,17 @@ static struct sysrq_key_op sysrq_sync_op = {
        .enable_mask    = SYSRQ_ENABLE_SYNC,
 };
 
+static void sysrq_handle_show_timers(int key, struct tty_struct *tty)
+{
+       sysrq_timer_list_show();
+}
+
+static struct sysrq_key_op sysrq_show_timers_op = {
+       .handler        = sysrq_handle_show_timers,
+       .help_msg       = "show-all-timers(Q)",
+       .action_msg     = "Show Pending Timers",
+};
+
 static void sysrq_handle_mountro(int key, struct tty_struct *tty)
 {
        emergency_remount();
@@ -336,7 +347,7 @@ static struct sysrq_key_op *sysrq_key_table[36] = {
        /* o: This will often be registered as 'Off' at init time */
        NULL,                           /* o */
        &sysrq_showregs_op,             /* p */
-       NULL,                           /* q */
+       &sysrq_show_timers_op,          /* q */
        &sysrq_unraw_op,                /* r */
        &sysrq_sync_op,                 /* s */
        &sysrq_showstate_op,            /* t */
index 4fac2bdf62156e48fa036c2516ae42b2019aac33..35e58030d2968d38e7a039ef36a58bdf9fd4b3df 100644 (file)
@@ -29,7 +29,6 @@
 
 #include <linux/module.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/kernel.h>      /* printk() */
 #include <linux/fs.h>          /* everything... */
 #include <linux/errno.h>       /* error codes */
index 07067c31c4ec7344237ce33165e85760b88afebb..5422f999636fffff6e499a9b7242d52f9e733fa9 100644 (file)
@@ -58,7 +58,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/fcntl.h>
 #include <linux/miscdevice.h>
@@ -68,6 +67,7 @@
 #include <linux/init.h>
 #include <linux/stat.h>
 #include <linux/proc_fs.h>
+#include <linux/seq_file.h>
 
 #include <linux/toshiba.h>
 
@@ -298,12 +298,10 @@ static int tosh_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,
  * Print the information for /proc/toshiba
  */
 #ifdef CONFIG_PROC_FS
-static int tosh_get_info(char *buffer, char **start, off_t fpos, int length)
+static int proc_toshiba_show(struct seq_file *m, void *v)
 {
-       char *temp;
        int key;
 
-       temp = buffer;
        key = tosh_fn_status();
 
        /* Arguments
@@ -314,8 +312,7 @@ static int tosh_get_info(char *buffer, char **start, off_t fpos, int length)
             4) BIOS date (in SCI date format)
             5) Fn Key status
        */
-
-       temp += sprintf(temp, "1.1 0x%04x %d.%d %d.%d 0x%04x 0x%02x\n",
+       seq_printf(m, "1.1 0x%04x %d.%d %d.%d 0x%04x 0x%02x\n",
                tosh_id,
                (tosh_sci & 0xff00)>>8,
                tosh_sci & 0xff,
@@ -323,9 +320,21 @@ static int tosh_get_info(char *buffer, char **start, off_t fpos, int length)
                tosh_bios & 0xff,
                tosh_date,
                key);
+       return 0;
+}
 
-       return temp-buffer;
+static int proc_toshiba_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, proc_toshiba_show, NULL);
 }
+
+static const struct file_operations proc_toshiba_fops = {
+       .owner          = THIS_MODULE,
+       .open           = proc_toshiba_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
 #endif
 
 
@@ -508,10 +517,15 @@ static int __init toshiba_init(void)
                return retval;
 
 #ifdef CONFIG_PROC_FS
-       /* register the proc entry */
-       if (create_proc_info_entry("toshiba", 0, NULL, tosh_get_info) == NULL) {
-               misc_deregister(&tosh_device);
-               return -ENOMEM;
+       {
+               struct proc_dir_entry *pde;
+
+               pde = create_proc_entry("toshiba", 0, NULL);
+               if (!pde) {
+                       misc_deregister(&tosh_device);
+                       return -ENOMEM;
+               }
+               pde->proc_fops = &proc_toshiba_fops;
        }
 #endif
 
index 33e1f66e39cb62550a762724b8dcbfd4d7d5326b..e5a254a434f8345696c806b35a8d4b2539ed44fe 100644 (file)
@@ -23,7 +23,6 @@
  *
  */
 
-#include <linux/sched.h>
 #include <linux/poll.h>
 #include <linux/spinlock.h>
 #include "tpm.h"
@@ -1107,9 +1106,8 @@ struct tpm_chip *tpm_register_hardware(struct device *dev, const struct tpm_vend
 
        INIT_WORK(&chip->work, timeout_work);
 
-       init_timer(&chip->user_read_timer);
-       chip->user_read_timer.function = user_reader_timeout;
-       chip->user_read_timer.data = (unsigned long) chip;
+       setup_timer(&chip->user_read_timer, user_reader_timeout,
+                       (unsigned long)chip);
 
        memcpy(&chip->vendor, entry, sizeof(struct tpm_vendor_specific));
 
index 7fca5f470bebf9109313b3e69a458cd6d8cf9003..4eba32b23b297c2f15bd942292c754bcc4d7708b 100644 (file)
@@ -441,7 +441,7 @@ static int tpm_ascii_bios_measurements_open(struct inode *inode,
        return err;
 }
 
-struct file_operations tpm_ascii_bios_measurements_ops = {
+const struct file_operations tpm_ascii_bios_measurements_ops = {
        .open = tpm_ascii_bios_measurements_open,
        .read = seq_read,
        .llseek = seq_lseek,
@@ -474,7 +474,7 @@ static int tpm_binary_bios_measurements_open(struct inode *inode,
        return err;
 }
 
-struct file_operations tpm_binary_bios_measurements_ops = {
+const struct file_operations tpm_binary_bios_measurements_ops = {
        .open = tpm_binary_bios_measurements_open,
        .read = seq_read,
        .llseek = seq_lseek,
index 47a6eacb10bc4c0c49dc54357be1f7adf9e36fd7..5289254e7ab3f1e0d0fdfbf48e411e07fdc9c31a 100644 (file)
@@ -154,7 +154,9 @@ static int tty_release(struct inode *, struct file *);
 int tty_ioctl(struct inode * inode, struct file * file,
              unsigned int cmd, unsigned long arg);
 static int tty_fasync(int fd, struct file * filp, int on);
-static void release_mem(struct tty_struct *tty, int idx);
+static void release_tty(struct tty_struct *tty, int idx);
+static struct pid *__proc_set_tty(struct task_struct *tsk,
+                               struct tty_struct *tty);
 
 /**
  *     alloc_tty_struct        -       allocate a tty object
@@ -1109,17 +1111,17 @@ int tty_check_change(struct tty_struct * tty)
 {
        if (current->signal->tty != tty)
                return 0;
-       if (tty->pgrp <= 0) {
-               printk(KERN_WARNING "tty_check_change: tty->pgrp <= 0!\n");
+       if (!tty->pgrp) {
+               printk(KERN_WARNING "tty_check_change: tty->pgrp == NULL!\n");
                return 0;
        }
-       if (process_group(current) == tty->pgrp)
+       if (task_pgrp(current) == tty->pgrp)
                return 0;
        if (is_ignored(SIGTTOU))
                return 0;
-       if (is_orphaned_pgrp(process_group(current)))
+       if (is_current_pgrp_orphaned())
                return -EIO;
-       (void) kill_pg(process_group(current), SIGTTOU, 1);
+       (void) kill_pgrp(task_pgrp(current), SIGTTOU, 1);
        return -ERESTARTSYS;
 }
 
@@ -1354,8 +1356,8 @@ static void do_tty_hangup(struct work_struct *work)
          tty_release is called */
        
        read_lock(&tasklist_lock);
-       if (tty->session > 0) {
-               do_each_task_pid(tty->session, PIDTYPE_SID, p) {
+       if (tty->session) {
+               do_each_pid_task(tty->session, PIDTYPE_SID, p) {
                        spin_lock_irq(&p->sighand->siglock);
                        if (p->signal->tty == tty)
                                p->signal->tty = NULL;
@@ -1365,16 +1367,17 @@ static void do_tty_hangup(struct work_struct *work)
                        }
                        __group_send_sig_info(SIGHUP, SEND_SIG_PRIV, p);
                        __group_send_sig_info(SIGCONT, SEND_SIG_PRIV, p);
-                       if (tty->pgrp > 0)
-                               p->signal->tty_old_pgrp = tty->pgrp;
+                       put_pid(p->signal->tty_old_pgrp);  /* A noop */
+                       if (tty->pgrp)
+                               p->signal->tty_old_pgrp = get_pid(tty->pgrp);
                        spin_unlock_irq(&p->sighand->siglock);
-               } while_each_task_pid(tty->session, PIDTYPE_SID, p);
+               } while_each_pid_task(tty->session, PIDTYPE_SID, p);
        }
        read_unlock(&tasklist_lock);
 
        tty->flags = 0;
-       tty->session = 0;
-       tty->pgrp = -1;
+       tty->session = NULL;
+       tty->pgrp = NULL;
        tty->ctrl_status = 0;
        /*
         *      If one of the devices matches a console pointer, we
@@ -1459,12 +1462,12 @@ int tty_hung_up_p(struct file * filp)
 
 EXPORT_SYMBOL(tty_hung_up_p);
 
-static void session_clear_tty(pid_t session)
+static void session_clear_tty(struct pid *session)
 {
        struct task_struct *p;
-       do_each_task_pid(session, PIDTYPE_SID, p) {
+       do_each_pid_task(session, PIDTYPE_SID, p) {
                proc_clear_tty(p);
-       } while_each_task_pid(session, PIDTYPE_SID, p);
+       } while_each_pid_task(session, PIDTYPE_SID, p);
 }
 
 /**
@@ -1494,46 +1497,54 @@ static void session_clear_tty(pid_t session)
 void disassociate_ctty(int on_exit)
 {
        struct tty_struct *tty;
-       int tty_pgrp = -1;
-       int session;
+       struct pid *tty_pgrp = NULL;
 
        lock_kernel();
 
        mutex_lock(&tty_mutex);
        tty = get_current_tty();
        if (tty) {
-               tty_pgrp = tty->pgrp;
+               tty_pgrp = get_pid(tty->pgrp);
                mutex_unlock(&tty_mutex);
                /* XXX: here we race, there is nothing protecting tty */
                if (on_exit && tty->driver->type != TTY_DRIVER_TYPE_PTY)
                        tty_vhangup(tty);
-       } else {
-               pid_t old_pgrp = current->signal->tty_old_pgrp;
+       } else if (on_exit) {
+               struct pid *old_pgrp;
+               spin_lock_irq(&current->sighand->siglock);
+               old_pgrp = current->signal->tty_old_pgrp;
+               current->signal->tty_old_pgrp = NULL;
+               spin_unlock_irq(&current->sighand->siglock);
                if (old_pgrp) {
-                       kill_pg(old_pgrp, SIGHUP, on_exit);
-                       kill_pg(old_pgrp, SIGCONT, on_exit);
+                       kill_pgrp(old_pgrp, SIGHUP, on_exit);
+                       kill_pgrp(old_pgrp, SIGCONT, on_exit);
+                       put_pid(old_pgrp);
                }
                mutex_unlock(&tty_mutex);
                unlock_kernel();        
                return;
        }
-       if (tty_pgrp > 0) {
-               kill_pg(tty_pgrp, SIGHUP, on_exit);
+       if (tty_pgrp) {
+               kill_pgrp(tty_pgrp, SIGHUP, on_exit);
                if (!on_exit)
-                       kill_pg(tty_pgrp, SIGCONT, on_exit);
+                       kill_pgrp(tty_pgrp, SIGCONT, on_exit);
+               put_pid(tty_pgrp);
        }
 
        spin_lock_irq(&current->sighand->siglock);
+       tty_pgrp = current->signal->tty_old_pgrp;
        current->signal->tty_old_pgrp = 0;
-       session = process_session(current);
        spin_unlock_irq(&current->sighand->siglock);
+       put_pid(tty_pgrp);
 
        mutex_lock(&tty_mutex);
        /* It is possible that do_tty_hangup has free'd this tty */
        tty = get_current_tty();
        if (tty) {
-               tty->session = 0;
-               tty->pgrp = 0;
+               put_pid(tty->session);
+               put_pid(tty->pgrp);
+               tty->session = NULL;
+               tty->pgrp = NULL;
        } else {
 #ifdef TTY_DEBUG_HANGUP
                printk(KERN_DEBUG "error attempted to write to tty [0x%p]"
@@ -1544,7 +1555,7 @@ void disassociate_ctty(int on_exit)
 
        /* Now clear signal->tty under the lock */
        read_lock(&tasklist_lock);
-       session_clear_tty(session);
+       session_clear_tty(task_session(current));
        read_unlock(&tasklist_lock);
        unlock_kernel();
 }
@@ -1612,7 +1623,6 @@ void start_tty(struct tty_struct *tty)
 
        /* If we have a running line discipline it may need kicking */
        tty_wakeup(tty);
-       wake_up_interruptible(&tty->write_wait);
 }
 
 EXPORT_SYMBOL(start_tty);
@@ -2003,7 +2013,7 @@ static int init_dev(struct tty_driver *driver, int idx,
 
        /* 
         * All structures have been allocated, so now we install them.
-        * Failures after this point use release_mem to clean up, so 
+        * Failures after this point use release_tty to clean up, so
         * there's no need to null out the local pointers.
         */
        if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM)) {
@@ -2024,8 +2034,8 @@ static int init_dev(struct tty_driver *driver, int idx,
 
        /* 
         * Structures all installed ... call the ldisc open routines.
-        * If we fail here just call release_mem to clean up.  No need
-        * to decrement the use counts, as release_mem doesn't care.
+        * If we fail here just call release_tty to clean up.  No need
+        * to decrement the use counts, as release_tty doesn't care.
         */
 
        if (tty->ldisc.open) {
@@ -2095,17 +2105,17 @@ fail_no_mem:
        retval = -ENOMEM;
        goto end_init;
 
-       /* call the tty release_mem routine to clean out this slot */
+       /* call the tty release_tty routine to clean out this slot */
 release_mem_out:
        if (printk_ratelimit())
                printk(KERN_INFO "init_dev: ldisc open failed, "
                                 "clearing slot %d\n", idx);
-       release_mem(tty, idx);
+       release_tty(tty, idx);
        goto end_init;
 }
 
 /**
- *     release_mem             -       release tty structure memory
+ *     release_one_tty         -       release tty structure memory
  *
  *     Releases memory associated with a tty structure, and clears out the
  *     driver table slots. This function is called when a device is no longer
@@ -2117,37 +2127,14 @@ release_mem_out:
  *     of ttys that the driver keeps.
  *             FIXME: should we require tty_mutex is held here ??
  */
-
-static void release_mem(struct tty_struct *tty, int idx)
+static void release_one_tty(struct tty_struct *tty, int idx)
 {
-       struct tty_struct *o_tty;
-       struct ktermios *tp;
        int devpts = tty->driver->flags & TTY_DRIVER_DEVPTS_MEM;
-
-       if ((o_tty = tty->link) != NULL) {
-               if (!devpts)
-                       o_tty->driver->ttys[idx] = NULL;
-               if (o_tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
-                       tp = o_tty->termios;
-                       if (!devpts)
-                               o_tty->driver->termios[idx] = NULL;
-                       kfree(tp);
-
-                       tp = o_tty->termios_locked;
-                       if (!devpts)
-                               o_tty->driver->termios_locked[idx] = NULL;
-                       kfree(tp);
-               }
-               o_tty->magic = 0;
-               o_tty->driver->refcount--;
-               file_list_lock();
-               list_del_init(&o_tty->tty_files);
-               file_list_unlock();
-               free_tty_struct(o_tty);
-       }
+       struct ktermios *tp;
 
        if (!devpts)
                tty->driver->ttys[idx] = NULL;
+
        if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
                tp = tty->termios;
                if (!devpts)
@@ -2160,15 +2147,39 @@ static void release_mem(struct tty_struct *tty, int idx)
                kfree(tp);
        }
 
+
        tty->magic = 0;
        tty->driver->refcount--;
+
        file_list_lock();
        list_del_init(&tty->tty_files);
        file_list_unlock();
-       module_put(tty->driver->owner);
+
        free_tty_struct(tty);
 }
 
+/**
+ *     release_tty             -       release tty structure memory
+ *
+ *     Release both @tty and a possible linked partner (think pty pair),
+ *     and decrement the refcount of the backing module.
+ *
+ *     Locking:
+ *             tty_mutex - sometimes only
+ *             takes the file list lock internally when working on the list
+ *     of ttys that the driver keeps.
+ *             FIXME: should we require tty_mutex is held here ??
+ */
+static void release_tty(struct tty_struct *tty, int idx)
+{
+       struct tty_driver *driver = tty->driver;
+
+       if (tty->link)
+               release_one_tty(tty->link, idx);
+       release_one_tty(tty, idx);
+       module_put(driver->owner);
+}
+
 /*
  * Even releasing the tty structures is a tricky business.. We have
  * to be very careful that the structures are all released at the
@@ -2436,10 +2447,10 @@ static void release_dev(struct file * filp)
                tty_set_termios_ldisc(o_tty,N_TTY); 
        }
        /*
-        * The release_mem function takes care of the details of clearing
+        * The release_tty function takes care of the details of clearing
         * the slots and preserving the termios structure.
         */
-       release_mem(tty, idx);
+       release_tty(tty, idx);
 
 #ifdef CONFIG_UNIX98_PTYS
        /* Make this pty number available for reallocation */
@@ -2481,6 +2492,7 @@ static int tty_open(struct inode * inode, struct file * filp)
        int index;
        dev_t device = inode->i_rdev;
        unsigned short saved_flags = filp->f_flags;
+       struct pid *old_pgrp;
 
        nonseekable_open(inode, filp);
        
@@ -2574,15 +2586,17 @@ got_driver:
                goto retry_open;
        }
 
+       old_pgrp = NULL;
        mutex_lock(&tty_mutex);
        spin_lock_irq(&current->sighand->siglock);
        if (!noctty &&
            current->signal->leader &&
            !current->signal->tty &&
-           tty->session == 0)
-               __proc_set_tty(current, tty);
+           tty->session == NULL)
+               old_pgrp = __proc_set_tty(current, tty);
        spin_unlock_irq(&current->sighand->siglock);
        mutex_unlock(&tty_mutex);
+       put_pid(old_pgrp);
        return 0;
 }
 
@@ -2721,9 +2735,18 @@ static int tty_fasync(int fd, struct file * filp, int on)
                return retval;
 
        if (on) {
+               enum pid_type type;
+               struct pid *pid;
                if (!waitqueue_active(&tty->read_wait))
                        tty->minimum_to_wake = 1;
-               retval = f_setown(filp, (-tty->pgrp) ? : current->pid, 0);
+               if (tty->pgrp) {
+                       pid = tty->pgrp;
+                       type = PIDTYPE_PGID;
+               } else {
+                       pid = task_pid(current);
+                       type = PIDTYPE_PID;
+               }
+               retval = __f_setown(filp, pid, type, 0);
                if (retval)
                        return retval;
        } else {
@@ -2825,10 +2848,10 @@ static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty,
                }
        }
 #endif
-       if (tty->pgrp > 0)
-               kill_pg(tty->pgrp, SIGWINCH, 1);
-       if ((real_tty->pgrp != tty->pgrp) && (real_tty->pgrp > 0))
-               kill_pg(real_tty->pgrp, SIGWINCH, 1);
+       if (tty->pgrp)
+               kill_pgrp(tty->pgrp, SIGWINCH, 1);
+       if ((real_tty->pgrp != tty->pgrp) && real_tty->pgrp)
+               kill_pgrp(real_tty->pgrp, SIGWINCH, 1);
        tty->winsize = tmp_ws;
        real_tty->winsize = tmp_ws;
 done:
@@ -2913,8 +2936,7 @@ static int fionbio(struct file *file, int __user *p)
 static int tiocsctty(struct tty_struct *tty, int arg)
 {
        int ret = 0;
-       if (current->signal->leader &&
-                       (process_session(current) == tty->session))
+       if (current->signal->leader && (task_session(current) == tty->session))
                return ret;
 
        mutex_lock(&tty_mutex);
@@ -2927,7 +2949,7 @@ static int tiocsctty(struct tty_struct *tty, int arg)
                goto unlock;
        }
 
-       if (tty->session > 0) {
+       if (tty->session) {
                /*
                 * This tty is already the controlling
                 * tty for another session group!
@@ -2970,7 +2992,7 @@ static int tiocgpgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t
         */
        if (tty == real_tty && current->signal->tty != real_tty)
                return -ENOTTY;
-       return put_user(real_tty->pgrp, p);
+       return put_user(pid_nr(real_tty->pgrp), p);
 }
 
 /**
@@ -2987,7 +3009,8 @@ static int tiocgpgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t
 
 static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t __user *p)
 {
-       pid_t pgrp;
+       struct pid *pgrp;
+       pid_t pgrp_nr;
        int retval = tty_check_change(real_tty);
 
        if (retval == -EIO)
@@ -2996,16 +3019,26 @@ static int tiocspgrp(struct tty_struct *tty, struct tty_struct *real_tty, pid_t
                return retval;
        if (!current->signal->tty ||
            (current->signal->tty != real_tty) ||
-           (real_tty->session != process_session(current)))
+           (real_tty->session != task_session(current)))
                return -ENOTTY;
-       if (get_user(pgrp, p))
+       if (get_user(pgrp_nr, p))
                return -EFAULT;
-       if (pgrp < 0)
+       if (pgrp_nr < 0)
                return -EINVAL;
-       if (session_of_pgrp(pgrp) != process_session(current))
-               return -EPERM;
-       real_tty->pgrp = pgrp;
-       return 0;
+       rcu_read_lock();
+       pgrp = find_pid(pgrp_nr);
+       retval = -ESRCH;
+       if (!pgrp)
+               goto out_unlock;
+       retval = -EPERM;
+       if (session_of_pgrp(pgrp) != task_session(current))
+               goto out_unlock;
+       retval = 0;
+       put_pid(real_tty->pgrp);
+       real_tty->pgrp = get_pid(pgrp);
+out_unlock:
+       rcu_read_unlock();
+       return retval;
 }
 
 /**
@@ -3028,9 +3061,9 @@ static int tiocgsid(struct tty_struct *tty, struct tty_struct *real_tty, pid_t _
        */
        if (tty == real_tty && current->signal->tty != real_tty)
                return -ENOTTY;
-       if (real_tty->session <= 0)
+       if (!real_tty->session)
                return -ENOTTY;
-       return put_user(real_tty->session, p);
+       return put_user(pid_nr(real_tty->session), p);
 }
 
 /**
@@ -3324,15 +3357,13 @@ int tty_ioctl(struct inode * inode, struct file * file,
  * Nasty bug: do_SAK is being called in interrupt context.  This can
  * deadlock.  We punt it up to process context.  AKPM - 16Mar2001
  */
-static void __do_SAK(struct work_struct *work)
+void __do_SAK(struct tty_struct *tty)
 {
-       struct tty_struct *tty =
-               container_of(work, struct tty_struct, SAK_work);
 #ifdef TTY_SOFT_SAK
        tty_hangup(tty);
 #else
        struct task_struct *g, *p;
-       int session;
+       struct pid *session;
        int             i;
        struct file     *filp;
        struct fdtable *fdt;
@@ -3348,12 +3379,12 @@ static void __do_SAK(struct work_struct *work)
        
        read_lock(&tasklist_lock);
        /* Kill the entire session */
-       do_each_task_pid(session, PIDTYPE_SID, p) {
+       do_each_pid_task(session, PIDTYPE_SID, p) {
                printk(KERN_NOTICE "SAK: killed process %d"
                        " (%s): process_session(p)==tty->session\n",
                        p->pid, p->comm);
                send_sig(SIGKILL, p, 1);
-       } while_each_task_pid(session, PIDTYPE_SID, p);
+       } while_each_pid_task(session, PIDTYPE_SID, p);
        /* Now kill any processes that happen to have the
         * tty open.
         */
@@ -3394,6 +3425,13 @@ static void __do_SAK(struct work_struct *work)
 #endif
 }
 
+static void do_SAK_work(struct work_struct *work)
+{
+       struct tty_struct *tty =
+               container_of(work, struct tty_struct, SAK_work);
+       __do_SAK(tty);
+}
+
 /*
  * The tq handling here is a little racy - tty->SAK_work may already be queued.
  * Fortunately we don't need to worry, because if ->SAK_work is already queued,
@@ -3404,7 +3442,6 @@ void do_SAK(struct tty_struct *tty)
 {
        if (!tty)
                return;
-       PREPARE_WORK(&tty->SAK_work, __do_SAK);
        schedule_work(&tty->SAK_work);
 }
 
@@ -3515,7 +3552,8 @@ static void initialize_tty_struct(struct tty_struct *tty)
        memset(tty, 0, sizeof(struct tty_struct));
        tty->magic = TTY_MAGIC;
        tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
-       tty->pgrp = -1;
+       tty->session = NULL;
+       tty->pgrp = NULL;
        tty->overrun_time = jiffies;
        tty->buf.head = tty->buf.tail = NULL;
        tty_buffer_init(tty);
@@ -3529,7 +3567,7 @@ static void initialize_tty_struct(struct tty_struct *tty)
        mutex_init(&tty->atomic_write_lock);
        spin_lock_init(&tty->read_lock);
        INIT_LIST_HEAD(&tty->tty_files);
-       INIT_WORK(&tty->SAK_work, NULL);
+       INIT_WORK(&tty->SAK_work, do_SAK_work);
 }
 
 /*
@@ -3786,21 +3824,28 @@ void proc_clear_tty(struct task_struct *p)
 }
 EXPORT_SYMBOL(proc_clear_tty);
 
-void __proc_set_tty(struct task_struct *tsk, struct tty_struct *tty)
+static struct pid *__proc_set_tty(struct task_struct *tsk, struct tty_struct *tty)
 {
+       struct pid *old_pgrp;
        if (tty) {
-               tty->session = process_session(tsk);
-               tty->pgrp = process_group(tsk);
+               tty->session = get_pid(task_session(tsk));
+               tty->pgrp = get_pid(task_pgrp(tsk));
        }
+       old_pgrp = tsk->signal->tty_old_pgrp;
        tsk->signal->tty = tty;
-       tsk->signal->tty_old_pgrp = 0;
+       tsk->signal->tty_old_pgrp = NULL;
+       return old_pgrp;
 }
 
 void proc_set_tty(struct task_struct *tsk, struct tty_struct *tty)
 {
+       struct pid *old_pgrp;
+
        spin_lock_irq(&tsk->sighand->siglock);
-       __proc_set_tty(tsk, tty);
+       old_pgrp = __proc_set_tty(tsk, tty);
        spin_unlock_irq(&tsk->sighand->siglock);
+
+       put_pid(old_pgrp);
 }
 
 struct tty_struct *get_current_tty(void)
index dee47f40c6a3878656f5bcacddcabd98c34da676..fd471cb3338fbd1d008c936f5d44cfe5691a952b 100644 (file)
@@ -225,7 +225,7 @@ EXPORT_SYMBOL(tty_termios_input_baud_rate);
 
 /**
  *     tty_termios_encode_baud_rate
- *     @termios: termios structure
+ *     @termios: ktermios structure holding user requested state
  *     @ispeed: input speed
  *     @ospeed: output speed
  *
@@ -233,7 +233,10 @@ EXPORT_SYMBOL(tty_termios_input_baud_rate);
  *     used as a library helper for drivers os that they can report back
  *     the actual speed selected when it differs from the speed requested
  *
- *     For now input and output speed must agree.
+ *     For maximal back compatibility with legacy SYS5/POSIX *nix behaviour
+ *     we need to carefully set the bits when the user does not get the
+ *     desired speed. We allow small margins and preserve as much of possible
+ *     of the input intent to keep compatiblity.
  *
  *     Locking: Caller should hold termios lock. This is already held
  *     when calling this function from the driver termios handler.
@@ -242,32 +245,44 @@ EXPORT_SYMBOL(tty_termios_input_baud_rate);
 void tty_termios_encode_baud_rate(struct ktermios *termios, speed_t ibaud, speed_t obaud)
 {
        int i = 0;
-       int ifound = 0, ofound = 0;
+       int ifound = -1, ofound = -1;
+       int iclose = ibaud/50, oclose = obaud/50;
+       int ibinput = 0;
 
        termios->c_ispeed = ibaud;
        termios->c_ospeed = obaud;
 
+       /* If the user asked for a precise weird speed give a precise weird
+          answer. If they asked for a Bfoo speed they many have problems
+          digesting non-exact replies so fuzz a bit */
+
+       if ((termios->c_cflag & CBAUD) == BOTHER)
+               oclose = 0;
+       if (((termios->c_cflag >> IBSHIFT) & CBAUD) == BOTHER)
+               iclose = 0;
+       if ((termios->c_cflag >> IBSHIFT) & CBAUD)
+               ibinput = 1;    /* An input speed was specified */
+
        termios->c_cflag &= ~CBAUD;
-       /* Identical speed means no input encoding (ie B0 << IBSHIFT)*/
-       if (termios->c_ispeed == termios->c_ospeed)
-               ifound = 1;
 
        do {
-               if (obaud == baud_table[i]) {
+               if (obaud - oclose >= baud_table[i] && obaud + oclose <= baud_table[i]) {
                        termios->c_cflag |= baud_bits[i];
-                       ofound = 1;
-                       /* So that if ibaud == obaud we don't set it */
-                       continue;
+                       ofound = i;
                }
-               if (ibaud == baud_table[i]) {
-                       termios->c_cflag |= (baud_bits[i] << IBSHIFT);
-                       ifound = 1;
+               if (ibaud - iclose >= baud_table[i] && ibaud + iclose <= baud_table[i]) {
+                       /* For the case input == output don't set IBAUD bits if the user didn't do so */
+                       if (ofound != i || ibinput)
+                               termios->c_cflag |= (baud_bits[i] << IBSHIFT);
+                       ifound = i;
                }
        }
        while(++i < n_baud_table);
-       if (!ofound)
+       if (ofound == -1)
                termios->c_cflag |= BOTHER;
-       if (!ifound)
+       /* Set exact input bits only if the input and output differ or the
+          user already did */
+       if (ifound == -1 && (ibaud != obaud  || ibinput))
                termios->c_cflag |= (BOTHER << IBSHIFT);
 }
 
index 26776517f04c7eaa0e705ec83aee988452fa4c6e..791930320a13c21e2a33c2f81b0c18b233463dba 100644 (file)
@@ -25,7 +25,6 @@
 #include <linux/major.h>
 #include <linux/errno.h>
 #include <linux/tty.h>
-#include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/mm.h>
 #include <linux/init.h>
index 9438512b17f1d593d119753d0def60be2b536cda..13faf8d17482a58fdd3dcee95e33769f4bbb6b59 100644 (file)
@@ -872,7 +872,7 @@ free_op:
        return ret;
 }
 
-struct file_operations viotap_fops = {
+const struct file_operations viotap_fops = {
        owner: THIS_MODULE,
        read: viotap_read,
        write: viotap_write,
index e01317cb1a0e08d4799582f5d7ecbad49765ef22..bef6d886d4fb2f6e3e2ea3b69ee1da3e29673b0c 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/kdev_t.h>
 #include <asm/io.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/interrupt.h>
 #include <linux/errno.h>
index 06c32a3e3ca42603df7470008711d9cc7b4fa5e1..c3f8e383933bbb957ffd2f50982558eb5cf08b81 100644 (file)
@@ -136,9 +136,6 @@ const struct consw *conswitchp;
 #define DEFAULT_BELL_PITCH     750
 #define DEFAULT_BELL_DURATION  (HZ/8)
 
-extern void vcs_make_sysfs(struct tty_struct *tty);
-extern void vcs_remove_sysfs(struct tty_struct *tty);
-
 struct vc vc_cons [MAX_NR_CONSOLES];
 
 #ifndef VT_SINGLE_DRIVER
@@ -213,7 +210,7 @@ static int scrollback_delta;
  */
 int (*console_blank_hook)(int);
 
-static struct timer_list console_timer;
+static DEFINE_TIMER(console_timer, blank_screen_t, 0, 0);
 static int blank_state;
 static int blank_timer_expired;
 enum {
@@ -869,8 +866,8 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines)
                ws.ws_col = vc->vc_cols;
                ws.ws_ypixel = vc->vc_scan_lines;
                if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col) &&
-                   vc->vc_tty->pgrp > 0)
-                       kill_pg(vc->vc_tty->pgrp, SIGWINCH, 1);
+                   vc->vc_tty->pgrp)
+                       kill_pgrp(vc->vc_tty->pgrp, SIGWINCH, 1);
                *cws = ws;
        }
 
@@ -2628,8 +2625,6 @@ static int __init con_init(void)
        for (i = 0; i < MAX_NR_CONSOLES; i++)
                con_driver_map[i] = conswitchp;
 
-       init_timer(&console_timer);
-       console_timer.function = blank_screen_t;
        if (blankinterval) {
                blank_state = blank_normal_wait;
                mod_timer(&console_timer, jiffies + blankinterval);
@@ -2640,6 +2635,7 @@ static int __init con_init(void)
         */
        for (currcons = 0; currcons < MIN_NR_CONSOLES; currcons++) {
                vc_cons[currcons].d = vc = alloc_bootmem(sizeof(struct vc_data));
+               INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK);
                visual_init(vc, currcons, 1);
                vc->vc_screenbuf = (unsigned short *)alloc_bootmem(vc->vc_screenbuf_size);
                vc->vc_kmalloced = 0;
index dc8368ebb1ac932c2a8b18427b7197bdab371d82..3a5d301e783b062617f3e7043b42670e33ca2be2 100644 (file)
@@ -672,7 +672,8 @@ int vt_ioctl(struct tty_struct *tty, struct file * file,
                vc->vt_mode = tmp;
                /* the frsig is ignored, so we set it to 0 */
                vc->vt_mode.frsig = 0;
-               put_pid(xchg(&vc->vt_pid, get_pid(task_pid(current))));
+               put_pid(vc->vt_pid);
+               vc->vt_pid = get_pid(task_pid(current));
                /* no switch is required -- saw@shade.msu.ru */
                vc->vt_newvt = -1;
                release_console_sem();
@@ -1063,12 +1064,35 @@ void reset_vc(struct vc_data *vc)
        vc->vt_mode.relsig = 0;
        vc->vt_mode.acqsig = 0;
        vc->vt_mode.frsig = 0;
-       put_pid(xchg(&vc->vt_pid, NULL));
+       put_pid(vc->vt_pid);
+       vc->vt_pid = NULL;
        vc->vt_newvt = -1;
        if (!in_interrupt())    /* Via keyboard.c:SAK() - akpm */
                reset_palette(vc);
 }
 
+void vc_SAK(struct work_struct *work)
+{
+       struct vc *vc_con =
+               container_of(work, struct vc, SAK_work);
+       struct vc_data *vc;
+       struct tty_struct *tty;
+
+       acquire_console_sem();
+       vc = vc_con->d;
+       if (vc) {
+               tty = vc->vc_tty;
+               /*
+                * SAK should also work in all raw modes and reset
+                * them properly.
+                */
+               if (tty)
+                       __do_SAK(tty);
+               reset_vc(vc);
+       }
+       release_console_sem();
+}
+
 /*
  * Performs the back end of a vt switch
  */
index 154d67e591e5c928b6cd59b97a746e994c46b8d8..85269c365a101986d631cd6f0cabdb71272a6fa2 100644 (file)
  *             It can be 1, 2, 10, 20, 110 or 220 seconds.
  */
 
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/types.h>
-#include <linux/miscdevice.h>
-#include <linux/watchdog.h>
-#include <linux/fs.h>
-#include <linux/ioport.h>
-#include <linux/notifier.h>
-#include <linux/reboot.h>
-#include <linux/init.h>
-
-#include <asm/io.h>
-#include <asm/uaccess.h>
-#include <asm/system.h>
+/*
+ *     Includes, defines, variables, module parameters, ...
+ */
 
+/* Includes */
+#include <linux/module.h>              /* For module specific items */
+#include <linux/moduleparam.h>         /* For new moduleparam's */
+#include <linux/types.h>               /* For standard types (like size_t) */
+#include <linux/errno.h>               /* For the -ENODEV/... values */
+#include <linux/kernel.h>              /* For printk/panic/... */
+#include <linux/miscdevice.h>          /* For MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR) */
+#include <linux/watchdog.h>            /* For the watchdog specific items */
+#include <linux/fs.h>                  /* For file operations */
+#include <linux/ioport.h>              /* For io-port access */
+#include <linux/platform_device.h>     /* For platform_driver framework */
+#include <linux/init.h>                        /* For __init/__exit/... */
+
+#include <asm/uaccess.h>               /* For copy_to_user/put_user/... */
+#include <asm/io.h>                    /* For inb/outb/... */
+
+/* Module information */
+#define DRV_NAME "acquirewdt"
+#define PFX DRV_NAME ": "
 #define WATCHDOG_NAME "Acquire WDT"
-#define PFX WATCHDOG_NAME ": "
 #define WATCHDOG_HEARTBEAT 0   /* There is no way to see what the correct time-out period is */
 
+/* internal variables */
+static struct platform_device *acq_platform_device;    /* the watchdog platform device */
 static unsigned long acq_is_open;
 static char expect_close;
 
-/*
- *     You must set these - there is no sane way to probe for this board.
- */
-
-static int wdt_stop = 0x43;
+/* module parameters */
+static int wdt_stop = 0x43;    /* You must set this - there is no sane way to probe for this board. */
 module_param(wdt_stop, int, 0);
 MODULE_PARM_DESC(wdt_stop, "Acquire WDT 'stop' io port (default 0x43)");
 
-static int wdt_start = 0x443;
+static int wdt_start = 0x443;  /* You must set this - there is no sane way to probe for this board. */
 module_param(wdt_start, int, 0);
 MODULE_PARM_DESC(wdt_start, "Acquire WDT 'start' io port (default 0x443)");
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /*
- *     Kernel methods.
+ *     Watchdog Operations
  */
 
 static void acq_keepalive(void)
@@ -103,7 +109,7 @@ static void acq_stop(void)
 }
 
 /*
- *     /dev/watchdog handling.
+ *     /dev/watchdog handling
  */
 
 static ssize_t acq_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
@@ -143,7 +149,7 @@ static int acq_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
        {
                .options = WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE,
                .firmware_version = 1,
-               .identity = "Acquire WDT",
+               .identity = WATCHDOG_NAME,
        };
 
        switch(cmd)
@@ -213,20 +219,6 @@ static int acq_close(struct inode *inode, struct file *file)
        return 0;
 }
 
-/*
- *     Notifier for system down
- */
-
-static int acq_notify_sys(struct notifier_block *this, unsigned long code,
-       void *unused)
-{
-       if(code==SYS_DOWN || code==SYS_HALT) {
-               /* Turn the WDT off */
-               acq_stop();
-       }
-       return NOTIFY_DONE;
-}
-
 /*
  *     Kernel Interfaces
  */
@@ -240,29 +232,20 @@ static const struct file_operations acq_fops = {
        .release        = acq_close,
 };
 
-static struct miscdevice acq_miscdev=
-{
-       .minor = WATCHDOG_MINOR,
-       .name = "watchdog",
-       .fops = &acq_fops,
+static struct miscdevice acq_miscdev = {
+       .minor  = WATCHDOG_MINOR,
+       .name   = "watchdog",
+       .fops   = &acq_fops,
 };
 
 /*
- *     The WDT card needs to learn about soft shutdowns in order to
- *     turn the timebomb registers off.
+ *     Init & exit routines
  */
 
-static struct notifier_block acq_notifier =
-{
-       .notifier_call = acq_notify_sys,
-};
-
-static int __init acq_init(void)
+static int __devinit acq_probe(struct platform_device *dev)
 {
        int ret;
 
-       printk(KERN_INFO "WDT driver for Acquire single board computer initialising.\n");
-
        if (wdt_stop != wdt_start) {
                if (!request_region(wdt_stop, 1, WATCHDOG_NAME)) {
                        printk (KERN_ERR PFX "I/O address 0x%04x already in use\n",
@@ -279,18 +262,11 @@ static int __init acq_init(void)
                goto unreg_stop;
        }
 
-       ret = register_reboot_notifier(&acq_notifier);
-       if (ret != 0) {
-               printk (KERN_ERR PFX "cannot register reboot notifier (err=%d)\n",
-                       ret);
-               goto unreg_regions;
-       }
-
        ret = misc_register(&acq_miscdev);
        if (ret != 0) {
                printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n",
                        WATCHDOG_MINOR, ret);
-               goto unreg_reboot;
+               goto unreg_regions;
        }
 
        printk (KERN_INFO PFX "initialized. (nowayout=%d)\n",
@@ -298,8 +274,6 @@ static int __init acq_init(void)
 
        return 0;
 
-unreg_reboot:
-       unregister_reboot_notifier(&acq_notifier);
 unreg_regions:
        release_region(wdt_start, 1);
 unreg_stop:
@@ -309,13 +283,60 @@ out:
        return ret;
 }
 
-static void __exit acq_exit(void)
+static int __devexit acq_remove(struct platform_device *dev)
 {
        misc_deregister(&acq_miscdev);
-       unregister_reboot_notifier(&acq_notifier);
+       release_region(wdt_start,1);
        if(wdt_stop != wdt_start)
                release_region(wdt_stop,1);
-       release_region(wdt_start,1);
+
+       return 0;
+}
+
+static void acq_shutdown(struct platform_device *dev)
+{
+       /* Turn the WDT off if we have a soft shutdown */
+       acq_stop();
+}
+
+static struct platform_driver acquirewdt_driver = {
+       .probe          = acq_probe,
+       .remove         = __devexit_p(acq_remove),
+       .shutdown       = acq_shutdown,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = DRV_NAME,
+       },
+};
+
+static int __init acq_init(void)
+{
+       int err;
+
+       printk(KERN_INFO "WDT driver for Acquire single board computer initialising.\n");
+
+       err = platform_driver_register(&acquirewdt_driver);
+       if (err)
+               return err;
+
+       acq_platform_device = platform_device_register_simple(DRV_NAME, -1, NULL, 0);
+       if (IS_ERR(acq_platform_device)) {
+               err = PTR_ERR(acq_platform_device);
+               goto unreg_platform_driver;
+       }
+
+       return 0;
+
+unreg_platform_driver:
+       platform_driver_unregister(&acquirewdt_driver);
+       return err;
+}
+
+static void __exit acq_exit(void)
+{
+       platform_device_unregister(acq_platform_device);
+       platform_driver_unregister(&acquirewdt_driver);
+       printk(KERN_INFO PFX "Watchdog Module Unloaded.\n");
 }
 
 module_init(acq_init);
index 9d732769ba0144bd36a720d4362185dc0bb651d1..8121cc247343a220f7f3a21cda05e0cdb6ea0650 100644 (file)
 #include <linux/watchdog.h>
 #include <linux/fs.h>
 #include <linux/ioport.h>
-#include <linux/notifier.h>
-#include <linux/reboot.h>
+#include <linux/platform_device.h>
 #include <linux/init.h>
 
 #include <asm/io.h>
 #include <asm/uaccess.h>
 #include <asm/system.h>
 
+#define DRV_NAME "advantechwdt"
+#define PFX DRV_NAME ": "
 #define WATCHDOG_NAME "Advantech WDT"
-#define PFX WATCHDOG_NAME ": "
 #define WATCHDOG_TIMEOUT 60            /* 60 sec default timeout */
 
+static struct platform_device *advwdt_platform_device; /* the watchdog platform device */
 static unsigned long advwdt_is_open;
 static char adv_expect_close;
 
@@ -75,10 +76,10 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=63, defaul
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /*
- *     Kernel methods.
+ *     Watchdog Operations
  */
 
 static void
@@ -94,6 +95,20 @@ advwdt_disable(void)
        inb_p(wdt_stop);
 }
 
+static int
+advwdt_set_heartbeat(int t)
+{
+       if ((t < 1) || (t > 63))
+               return -EINVAL;
+
+       timeout = t;
+       return 0;
+}
+
+/*
+ *     /dev/watchdog handling
+ */
+
 static ssize_t
 advwdt_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
 {
@@ -126,7 +141,7 @@ advwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
        static struct watchdog_info ident = {
                .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE,
                .firmware_version = 1,
-               .identity = "Advantech WDT",
+               .identity = WATCHDOG_NAME,
        };
 
        switch (cmd) {
@@ -146,9 +161,8 @@ advwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
        case WDIOC_SETTIMEOUT:
          if (get_user(new_timeout, p))
                  return -EFAULT;
-         if ((new_timeout < 1) || (new_timeout > 63))
+         if (advwdt_set_heartbeat(new_timeout))
                  return -EINVAL;
-         timeout = new_timeout;
          advwdt_ping();
          /* Fall */
 
@@ -208,21 +222,6 @@ advwdt_close(struct inode *inode, struct file *file)
        return 0;
 }
 
-/*
- *     Notifier for system down
- */
-
-static int
-advwdt_notify_sys(struct notifier_block *this, unsigned long code,
-       void *unused)
-{
-       if (code == SYS_DOWN || code == SYS_HALT) {
-               /* Turn the WDT off */
-               advwdt_disable();
-       }
-       return NOTIFY_DONE;
-}
-
 /*
  *     Kernel Interfaces
  */
@@ -237,33 +236,20 @@ static const struct file_operations advwdt_fops = {
 };
 
 static struct miscdevice advwdt_miscdev = {
-       .minor = WATCHDOG_MINOR,
-       .name = "watchdog",
-       .fops = &advwdt_fops,
+       .minor  = WATCHDOG_MINOR,
+       .name   = "watchdog",
+       .fops   = &advwdt_fops,
 };
 
 /*
- *     The WDT needs to learn about soft shutdowns in order to
- *     turn the timebomb registers off.
+ *     Init & exit routines
  */
 
-static struct notifier_block advwdt_notifier = {
-       .notifier_call = advwdt_notify_sys,
-};
-
-static int __init
-advwdt_init(void)
+static int __devinit
+advwdt_probe(struct platform_device *dev)
 {
        int ret;
 
-       printk(KERN_INFO "WDT driver for Advantech single board computer initialising.\n");
-
-       if (timeout < 1 || timeout > 63) {
-               timeout = WATCHDOG_TIMEOUT;
-               printk (KERN_INFO PFX "timeout value must be 1<=x<=63, using %d\n",
-                       timeout);
-       }
-
        if (wdt_stop != wdt_start) {
                if (!request_region(wdt_stop, 1, WATCHDOG_NAME)) {
                        printk (KERN_ERR PFX "I/O address 0x%04x already in use\n",
@@ -280,18 +266,18 @@ advwdt_init(void)
                goto unreg_stop;
        }
 
-       ret = register_reboot_notifier(&advwdt_notifier);
-       if (ret != 0) {
-               printk (KERN_ERR PFX "cannot register reboot notifier (err=%d)\n",
-                       ret);
-               goto unreg_regions;
+       /* Check that the heartbeat value is within it's range ; if not reset to the default */
+       if (advwdt_set_heartbeat(timeout)) {
+               advwdt_set_heartbeat(WATCHDOG_TIMEOUT);
+               printk (KERN_INFO PFX "timeout value must be 1<=x<=63, using %d\n",
+                       timeout);
        }
 
        ret = misc_register(&advwdt_miscdev);
        if (ret != 0) {
                printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n",
                        WATCHDOG_MINOR, ret);
-               goto unreg_reboot;
+               goto unreg_regions;
        }
 
        printk (KERN_INFO PFX "initialized. timeout=%d sec (nowayout=%d)\n",
@@ -299,8 +285,6 @@ advwdt_init(void)
 
 out:
        return ret;
-unreg_reboot:
-       unregister_reboot_notifier(&advwdt_notifier);
 unreg_regions:
        release_region(wdt_start, 1);
 unreg_stop:
@@ -309,14 +293,64 @@ unreg_stop:
        goto out;
 }
 
-static void __exit
-advwdt_exit(void)
+static int __devexit
+advwdt_remove(struct platform_device *dev)
 {
        misc_deregister(&advwdt_miscdev);
-       unregister_reboot_notifier(&advwdt_notifier);
+       release_region(wdt_start,1);
        if(wdt_stop != wdt_start)
                release_region(wdt_stop,1);
-       release_region(wdt_start,1);
+
+       return 0;
+}
+
+static void
+advwdt_shutdown(struct platform_device *dev)
+{
+       /* Turn the WDT off if we have a soft shutdown */
+       advwdt_disable();
+}
+
+static struct platform_driver advwdt_driver = {
+       .probe          = advwdt_probe,
+       .remove         = __devexit_p(advwdt_remove),
+       .shutdown       = advwdt_shutdown,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = DRV_NAME,
+       },
+};
+
+static int __init
+advwdt_init(void)
+{
+       int err;
+
+       printk(KERN_INFO "WDT driver for Advantech single board computer initialising.\n");
+
+       err = platform_driver_register(&advwdt_driver);
+       if (err)
+               return err;
+
+       advwdt_platform_device = platform_device_register_simple(DRV_NAME, -1, NULL, 0);
+       if (IS_ERR(advwdt_platform_device)) {
+               err = PTR_ERR(advwdt_platform_device);
+               goto unreg_platform_driver;
+       }
+
+       return 0;
+
+unreg_platform_driver:
+       platform_driver_unregister(&advwdt_driver);
+       return err;
+}
+
+static void __exit
+advwdt_exit(void)
+{
+       platform_device_unregister(advwdt_platform_device);
+       platform_driver_unregister(&advwdt_driver);
+       printk(KERN_INFO PFX "Watchdog Module Unloaded.\n");
 }
 
 module_init(advwdt_init);
index 01b0d132ee41b3890b58cb3a983b87742bf69dff..e3f6a7d0c83d35a84732e2b59203ed3ff03cb234 100644 (file)
@@ -40,7 +40,7 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. (0<timeout<18000, defaul
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /*
  *     ali_start       -       start watchdog countdown
index bf25d0a55a9954f9683a28c301a918cff349c5e1..67aed9f8c362e7a9f87f50aedf93717bad7c345b 100644 (file)
@@ -69,7 +69,7 @@ module_param(use_gpio, int, 0);
 MODULE_PARM_DESC(use_gpio, "Use the gpio watchdog.  (required by old cobalt boards)");
 
 static void wdt_timer_ping(unsigned long);
-static struct timer_list timer;
+static DEFINE_TIMER(timer, wdt_timer_ping, 0, 1);
 static unsigned long next_heartbeat;
 static unsigned long wdt_is_open;
 static char wdt_expect_close;
@@ -78,7 +78,7 @@ static struct pci_dev *alim7101_pmu;
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
 MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
-                __stringify(CONFIG_WATCHDOG_NOWAYOUT) ")");
+                __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /*
  *     Whack the dog
@@ -108,8 +108,7 @@ static void wdt_timer_ping(unsigned long data)
                printk(KERN_WARNING PFX "Heartbeat lost! Will not ping the watchdog\n");
        }
        /* Re-set the timer interval */
-       timer.expires = jiffies + WDT_INTERVAL;
-       add_timer(&timer);
+       mod_timer(&timer, jiffies + WDT_INTERVAL);
 }
 
 /*
@@ -147,9 +146,7 @@ static void wdt_startup(void)
        wdt_change(WDT_ENABLE);
 
        /* Start the timer */
-       timer.expires = jiffies + WDT_INTERVAL;
-       add_timer(&timer);
-
+       mod_timer(&timer, jiffies + WDT_INTERVAL);
 
        printk(KERN_INFO PFX "Watchdog timer is now enabled.\n");
 }
@@ -380,10 +377,6 @@ static int __init alim7101_wdt_init(void)
                        timeout);
        }
 
-       init_timer(&timer);
-       timer.function = wdt_timer_ping;
-       timer.data = 1;
-
        rc = misc_register(&wdt_miscdev);
        if (rc) {
                printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n",
@@ -417,10 +410,8 @@ module_init(alim7101_wdt_init);
 module_exit(alim7101_wdt_unload);
 
 static struct pci_device_id alim7101_pci_tbl[] __devinitdata = {
-       { PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
-         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
-       { PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101,
-         PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
+       { PCI_DEVICE(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533) },
+       { PCI_DEVICE(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101) },
        { }
 };
 
index 00bdabb90f27b958a76ab7b8d39c4b505892411e..bcd7e36ca0aa67b8f9e6e3c461d2b3f12912d0ab 100644 (file)
@@ -80,10 +80,8 @@ static void cpu5wdt_trigger(unsigned long unused)
        outb(1, port + CPU5WDT_TRIGGER_REG);
 
        /* requeue?? */
-       if( cpu5wdt_device.queue && ticks ) {
-               cpu5wdt_device.timer.expires = jiffies + CPU5WDT_INTERVAL;
-               add_timer(&cpu5wdt_device.timer);
-       }
+       if (cpu5wdt_device.queue && ticks)
+               mod_timer(&cpu5wdt_device.timer, jiffies + CPU5WDT_INTERVAL);
        else {
                /* ticks doesn't matter anyway */
                complete(&cpu5wdt_device.stop);
@@ -109,8 +107,7 @@ static void cpu5wdt_start(void)
                outb(1, port + CPU5WDT_MODE_REG);
                outb(0, port + CPU5WDT_RESET_REG);
                outb(0, port + CPU5WDT_ENABLE_REG);
-               cpu5wdt_device.timer.expires = jiffies + CPU5WDT_INTERVAL;
-               add_timer(&cpu5wdt_device.timer);
+               mod_timer(&cpu5wdt_device.timer, jiffies + CPU5WDT_INTERVAL);
        }
        /* if process dies, counter is not decremented */
        cpu5wdt_device.running++;
@@ -245,9 +242,7 @@ static int __devinit cpu5wdt_init(void)
 
        clear_bit(0, &cpu5wdt_device.inuse);
 
-       init_timer(&cpu5wdt_device.timer);
-       cpu5wdt_device.timer.function = cpu5wdt_trigger;
-       cpu5wdt_device.timer.data = 0;
+       setup_timer(&cpu5wdt_device.timer, cpu5wdt_trigger, 0);
 
        cpu5wdt_device.default_ticks = ticks;
 
index e228d6e173cead6243232be6a137c6f275776caa..f70387f01b2b1880ffcbb26b9982d2ba68f55f48 100644 (file)
@@ -73,7 +73,7 @@ static char *ev = "int";
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /*
  * Some symbolic names
index fb64df4d7c8720107f16e360047c93ef2deac0b4..c5982502c03d45a8def683ac7c06cf4d83ad3719 100644 (file)
@@ -91,7 +91,7 @@ MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (1<heartbeat<2046, d
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /*
  * Some i6300ESB specific functions
index e0627d79707b27f6b91d8ccb47506a29f1fad451..a62ef48a15ae8f91c12bf27ba0bc0f2f8cc87fac 100644 (file)
@@ -109,7 +109,7 @@ MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (2<heartbeat<39, def
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /*
  * Some TCO specific functions
index 7eac922df8678cecbcde093a53f7da2d3c886257..3c9684ccd2f936ff248c6efc69abdb6025d90b03 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     intel TCO Watchdog Driver (Used in i82801 and i6300ESB chipsets)
  *
- *     (c) Copyright 2006 Wim Van Sebroeck <wim@iguana.be>.
+ *     (c) Copyright 2006-2007 Wim Van Sebroeck <wim@iguana.be>.
  *
  *     This program is free software; you can redistribute it and/or
  *     modify it under the terms of the GNU General Public License
@@ -49,7 +49,7 @@
 /* Module and version information */
 #define DRV_NAME        "iTCO_wdt"
 #define DRV_VERSION     "1.01"
-#define DRV_RELDATE     "11-Nov-2006"
+#define DRV_RELDATE     "21-Jan-2007"
 #define PFX            DRV_NAME ": "
 
 /* Includes */
@@ -187,7 +187,7 @@ MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (2<heartbeat<39 (TCO
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /* iTCO Vendor Specific Support hooks */
 #ifdef CONFIG_ITCO_VENDOR_SUPPORT
@@ -539,7 +539,7 @@ static int iTCO_wdt_ioctl (struct inode *inode, struct file *file,
  *     Kernel Interfaces
  */
 
-static struct file_operations iTCO_wdt_fops = {
+static const struct file_operations iTCO_wdt_fops = {
        .owner =        THIS_MODULE,
        .llseek =       no_llseek,
        .write =        iTCO_wdt_write,
index c1ed209a138ca3176313abcf3fa4bdcc2de33b9f..c3a60f52ccb97d26931e66ea29384ef43a80c464 100644 (file)
@@ -3,8 +3,8 @@
  *
  *     (c) Copyright 2001 Charles Howes <chowes@vsol.net>
  *
- *      Based on advantechwdt.c which is based on acquirewdt.c which
- *       is based on wdt.c.
+ *     Based on advantechwdt.c which is based on acquirewdt.c which
+ *     is based on wdt.c.
  *
  *     (c) Copyright 2000-2001 Marek Michalkiewicz <marekm@linux.org.pl>
  *
@@ -25,9 +25,9 @@
  *
  *     (c) Copyright 1995    Alan Cox <alan@redhat.com>
  *
- *      14-Dec-2001 Matt Domsch <Matt_Domsch@dell.com>
- *           Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT
- *           Added timeout module option to override default
+ *     14-Dec-2001 Matt Domsch <Matt_Domsch@dell.com>
+ *          Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT
+ *          Added timeout module option to override default
  *
  */
 
 #include <linux/miscdevice.h>
 #include <linux/watchdog.h>
 #include <linux/ioport.h>
-#include <linux/notifier.h>
 #include <linux/fs.h>
-#include <linux/reboot.h>
 #include <linux/init.h>
 #include <linux/spinlock.h>
 #include <linux/moduleparam.h>
+#include <linux/platform_device.h>
 
 #include <asm/io.h>
 #include <asm/uaccess.h>
 #include <asm/system.h>
 
+static struct platform_device *ibwdt_platform_device;
 static unsigned long ibwdt_is_open;
 static spinlock_t ibwdt_lock;
 static char expect_close;
 
-#define PFX "ib700wdt: "
+/* Module information */
+#define DRV_NAME "ib700wdt"
+#define PFX DRV_NAME ": "
 
 /*
  *
@@ -118,20 +120,51 @@ static int wd_margin = WD_TIMO;
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 
 /*
- *     Kernel methods.
+ *     Watchdog Operations
  */
 
 static void
 ibwdt_ping(void)
 {
+       spin_lock(&ibwdt_lock);
+
        /* Write a watchdog value */
        outb_p(wd_margin, WDT_START);
+
+       spin_unlock(&ibwdt_lock);
 }
 
+static void
+ibwdt_disable(void)
+{
+       spin_lock(&ibwdt_lock);
+       outb_p(0, WDT_STOP);
+       spin_unlock(&ibwdt_lock);
+}
+
+static int
+ibwdt_set_heartbeat(int t)
+{
+       int i;
+
+       if ((t < 0) || (t > 30))
+               return -EINVAL;
+
+       for (i = 0x0F; i > -1; i--)
+               if (wd_times[i] > t)
+                       break;
+       wd_margin = i;
+       return 0;
+}
+
+/*
+ *     /dev/watchdog handling
+ */
+
 static ssize_t
 ibwdt_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
 {
@@ -159,7 +192,7 @@ static int
 ibwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
          unsigned long arg)
 {
-       int i, new_margin;
+       int new_margin;
        void __user *argp = (void __user *)arg;
        int __user *p = argp;
 
@@ -176,6 +209,7 @@ ibwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
          break;
 
        case WDIOC_GETSTATUS:
+       case WDIOC_GETBOOTSTATUS:
          return put_user(0, p);
 
        case WDIOC_KEEPALIVE:
@@ -185,18 +219,33 @@ ibwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
        case WDIOC_SETTIMEOUT:
          if (get_user(new_margin, p))
                  return -EFAULT;
-         if ((new_margin < 0) || (new_margin > 30))
+         if (ibwdt_set_heartbeat(new_margin))
                  return -EINVAL;
-         for (i = 0x0F; i > -1; i--)
-                 if (wd_times[i] > new_margin)
-                         break;
-         wd_margin = i;
          ibwdt_ping();
          /* Fall */
 
        case WDIOC_GETTIMEOUT:
          return put_user(wd_times[wd_margin], p);
-         break;
+
+       case WDIOC_SETOPTIONS:
+       {
+         int options, retval = -EINVAL;
+
+         if (get_user(options, p))
+           return -EFAULT;
+
+         if (options & WDIOS_DISABLECARD) {
+           ibwdt_disable();
+           retval = 0;
+         }
+
+         if (options & WDIOS_ENABLECARD) {
+           ibwdt_ping();
+           retval = 0;
+         }
+
+         return retval;
+       }
 
        default:
          return -ENOTTY;
@@ -207,9 +256,7 @@ ibwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
 static int
 ibwdt_open(struct inode *inode, struct file *file)
 {
-       spin_lock(&ibwdt_lock);
        if (test_and_set_bit(0, &ibwdt_is_open)) {
-               spin_unlock(&ibwdt_lock);
                return -EBUSY;
        }
        if (nowayout)
@@ -217,40 +264,23 @@ ibwdt_open(struct inode *inode, struct file *file)
 
        /* Activate */
        ibwdt_ping();
-       spin_unlock(&ibwdt_lock);
        return nonseekable_open(inode, file);
 }
 
 static int
 ibwdt_close(struct inode *inode, struct file *file)
 {
-       spin_lock(&ibwdt_lock);
-       if (expect_close == 42)
-               outb_p(0, WDT_STOP);
-       else
+       if (expect_close == 42) {
+               ibwdt_disable();
+       } else {
                printk(KERN_CRIT PFX "WDT device closed unexpectedly.  WDT will not stop!\n");
-
+               ibwdt_ping();
+       }
        clear_bit(0, &ibwdt_is_open);
        expect_close = 0;
-       spin_unlock(&ibwdt_lock);
        return 0;
 }
 
-/*
- *     Notifier for system down
- */
-
-static int
-ibwdt_notify_sys(struct notifier_block *this, unsigned long code,
-       void *unused)
-{
-       if (code == SYS_DOWN || code == SYS_HALT) {
-               /* Turn the WDT off */
-               outb_p(0, WDT_STOP);
-       }
-       return NOTIFY_DONE;
-}
-
 /*
  *     Kernel Interfaces
  */
@@ -271,26 +301,14 @@ static struct miscdevice ibwdt_miscdev = {
 };
 
 /*
- *     The WDT needs to learn about soft shutdowns in order to
- *     turn the timebomb registers off.
+ *     Init & exit routines
  */
 
-static struct notifier_block ibwdt_notifier = {
-       .notifier_call = ibwdt_notify_sys,
-};
-
-static int __init ibwdt_init(void)
+static int __devinit ibwdt_probe(struct platform_device *dev)
 {
        int res;
 
-       printk(KERN_INFO PFX "WDT driver for IB700 single board computer initialising.\n");
-
        spin_lock_init(&ibwdt_lock);
-       res = misc_register(&ibwdt_miscdev);
-       if (res) {
-               printk (KERN_ERR PFX "failed to register misc device\n");
-               goto out_nomisc;
-       }
 
 #if WDT_START != WDT_STOP
        if (!request_region(WDT_STOP, 1, "IB700 WDT")) {
@@ -305,34 +323,78 @@ static int __init ibwdt_init(void)
                res = -EIO;
                goto out_nostartreg;
        }
-       res = register_reboot_notifier(&ibwdt_notifier);
+
+       res = misc_register(&ibwdt_miscdev);
        if (res) {
-               printk (KERN_ERR PFX "Failed to register reboot notifier.\n");
-               goto out_noreboot;
+               printk (KERN_ERR PFX "failed to register misc device\n");
+               goto out_nomisc;
        }
        return 0;
 
-out_noreboot:
+out_nomisc:
        release_region(WDT_START, 1);
 out_nostartreg:
 #if WDT_START != WDT_STOP
        release_region(WDT_STOP, 1);
 #endif
 out_nostopreg:
-       misc_deregister(&ibwdt_miscdev);
-out_nomisc:
        return res;
 }
 
-static void __exit
-ibwdt_exit(void)
+static int __devexit ibwdt_remove(struct platform_device *dev)
 {
        misc_deregister(&ibwdt_miscdev);
-       unregister_reboot_notifier(&ibwdt_notifier);
+       release_region(WDT_START,1);
 #if WDT_START != WDT_STOP
        release_region(WDT_STOP,1);
 #endif
-       release_region(WDT_START,1);
+       return 0;
+}
+
+static void ibwdt_shutdown(struct platform_device *dev)
+{
+       /* Turn the WDT off if we have a soft shutdown */
+       ibwdt_disable();
+}
+
+static struct platform_driver ibwdt_driver = {
+       .probe          = ibwdt_probe,
+       .remove         = __devexit_p(ibwdt_remove),
+       .shutdown       = ibwdt_shutdown,
+       .driver         = {
+               .owner  = THIS_MODULE,
+               .name   = DRV_NAME,
+       },
+};
+
+static int __init ibwdt_init(void)
+{
+       int err;
+
+       printk(KERN_INFO PFX "WDT driver for IB700 single board computer initialising.\n");
+
+       err = platform_driver_register(&ibwdt_driver);
+       if (err)
+               return err;
+
+       ibwdt_platform_device = platform_device_register_simple(DRV_NAME, -1, NULL, 0);
+       if (IS_ERR(ibwdt_platform_device)) {
+               err = PTR_ERR(ibwdt_platform_device);
+               goto unreg_platform_driver;
+       }
+
+       return 0;
+
+unreg_platform_driver:
+       platform_driver_unregister(&ibwdt_driver);
+       return err;
+}
+
+static void __exit ibwdt_exit(void)
+{
+       platform_device_unregister(ibwdt_platform_device);
+       platform_driver_unregister(&ibwdt_driver);
+       printk(KERN_INFO PFX "Watchdog Module Unloaded.\n");
 }
 
 module_init(ibwdt_init);
index dd6760f1a23ba43ecc40342cc9c1d9da3ef13e9c..8195f5023d853c23406f3cd0abe319b68e745d2c 100644 (file)
@@ -396,7 +396,7 @@ module_init(ibmasr_init);
 module_exit(ibmasr_exit);
 
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 MODULE_DESCRIPTION("IBM Automatic Server Restart driver");
 MODULE_AUTHOR("Andrey Panin");
index 0bc239308989d53dbf7adf8ad537ada06e086b12..788245bdaa7f88635593d4f70ac0d8ee164a4945 100644 (file)
@@ -32,7 +32,7 @@ static int indydog_alive;
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 static void indydog_start(void)
 {
index 4d730fdbd528cac4f84d78997045771a930d7b7b..81fb3dec180f5be0b5076568b3c140caa6393d4f 100644 (file)
@@ -95,7 +95,7 @@ MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 #define PFX "machzwd"
 
@@ -118,12 +118,14 @@ static int action = 0;
 module_param(action, int, 0);
 MODULE_PARM_DESC(action, "after watchdog resets, generate: 0 = RESET(*)  1 = SMI  2 = NMI  3 = SCI");
 
+static void zf_ping(unsigned long data);
+
 static int zf_action = GEN_RESET;
 static unsigned long zf_is_open;
 static char zf_expect_close;
 static spinlock_t zf_lock;
 static spinlock_t zf_port_lock;
-static struct timer_list zf_timer;
+static DEFINE_TIMER(zf_timer, zf_ping, 0, 0);
 static unsigned long next_heartbeat = 0;
 
 
@@ -220,9 +222,7 @@ static void zf_timer_on(void)
        next_heartbeat = jiffies + ZF_USER_TIMEO;
 
        /* start the timer for internal ping */
-       zf_timer.expires = jiffies + ZF_HW_TIMEO;
-
-       add_timer(&zf_timer);
+       mod_timer(&zf_timer, jiffies + ZF_HW_TIMEO);
 
        /* start watchdog timer */
        ctrl_reg = zf_get_control();
@@ -260,8 +260,7 @@ static void zf_ping(unsigned long data)
                zf_set_control(ctrl_reg);
                spin_unlock_irqrestore(&zf_port_lock, flags);
 
-               zf_timer.expires = jiffies + ZF_HW_TIMEO;
-               add_timer(&zf_timer);
+               mod_timer(&zf_timer, jiffies + ZF_HW_TIMEO);
        }else{
                printk(KERN_CRIT PFX ": I will reset your machine\n");
        }
@@ -465,11 +464,6 @@ static int __init zf_init(void)
        zf_set_status(0);
        zf_set_control(0);
 
-       /* this is the timer that will do the hard work */
-       init_timer(&zf_timer);
-       zf_timer.function = zf_ping;
-       zf_timer.data = 0;
-
        return 0;
 
 no_reboot:
index c2dac0aa1d6254906468a35dcbaea932197b416f..f35e2848aa3eb35fd4fb49fc5ade7ced904c2a45 100644 (file)
@@ -56,16 +56,18 @@ static int mixcomwd_ioports[] = { 0x180, 0x280, 0x380, 0x000 };
 #define FLASHCOM_WATCHDOG_OFFSET 0x4
 #define FLASHCOM_ID 0x18
 
+static void mixcomwd_timerfun(unsigned long d);
+
 static unsigned long mixcomwd_opened; /* long req'd for setbit --RR */
 
 static int watchdog_port;
 static int mixcomwd_timer_alive;
-static DEFINE_TIMER(mixcomwd_timer, NULL, 0, 0);
+static DEFINE_TIMER(mixcomwd_timer, mixcomwd_timerfun, 0, 0);
 static char expect_close;
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 static void mixcomwd_ping(void)
 {
@@ -77,7 +79,7 @@ static void mixcomwd_timerfun(unsigned long d)
 {
        mixcomwd_ping();
 
-       mod_timer(&mixcomwd_timer,jiffies+ 5*HZ);
+       mod_timer(&mixcomwd_timer, jiffies + 5 * HZ);
 }
 
 /*
@@ -114,12 +116,8 @@ static int mixcomwd_release(struct inode *inode, struct file *file)
                        printk(KERN_ERR "mixcomwd: release called while internal timer alive");
                        return -EBUSY;
                }
-               init_timer(&mixcomwd_timer);
-               mixcomwd_timer.expires=jiffies + 5 * HZ;
-               mixcomwd_timer.function=mixcomwd_timerfun;
-               mixcomwd_timer.data=0;
                mixcomwd_timer_alive=1;
-               add_timer(&mixcomwd_timer);
+               mod_timer(&mixcomwd_timer, jiffies + 5 * HZ);
        } else {
                printk(KERN_CRIT "mixcomwd: WDT device closed unexpectedly.  WDT will not stop!\n");
        }
@@ -285,7 +283,7 @@ static void __exit mixcomwd_exit(void)
                if(mixcomwd_timer_alive) {
                        printk(KERN_WARNING "mixcomwd: I quit now, hardware will"
                               " probably reboot!\n");
-                       del_timer(&mixcomwd_timer);
+                       del_timer_sync(&mixcomwd_timer);
                        mixcomwd_timer_alive=0;
                }
        }
index 6c6f97332dbb4ef076e2e917d4d0b1a50f3b4591..84074a697dce54dc2124aba8484f5efc969de594 100644 (file)
@@ -230,7 +230,7 @@ omap_wdt_ioctl(struct inode *inode, struct file *file,
        }
 }
 
-static struct file_operations omap_wdt_fops = {
+static const struct file_operations omap_wdt_fops = {
        .owner = THIS_MODULE,
        .write = omap_wdt_write,
        .ioctl = omap_wdt_ioctl,
index 1d447e32af419ed73eff046eff04e85a1e294eb5..3d3deae0d64ba0668f28fb275a082531a7e62e1c 100644 (file)
@@ -526,7 +526,7 @@ static int pc87413_notify_sys(struct notifier_block *this,
 
 /* -- Module's structures ---------------------------------------*/
 
-static struct file_operations pc87413_fops = {
+static const struct file_operations pc87413_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .write          = pc87413_write,
@@ -631,5 +631,5 @@ module_param(timeout, int, 0);
 MODULE_PARM_DESC(timeout, "Watchdog timeout in minutes (default=" __MODULE_STRING(timeout) ").");
 
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
index 8e1e6e48e0a70733f8768a95cce8901409a8d9e0..6e8b5705b5b78f94f77071217b01494c035f5b34 100644 (file)
@@ -2,7 +2,7 @@
  * PC Watchdog Driver
  * by Ken Hollis (khollis@bitgate.com)
  *
- * Permission granted from Simon Machell (73244.1270@compuserve.com)
+ * Permission granted from Simon Machell (smachell@berkprod.com)
  * Written for the Linux Kernel, and GPLed by Ken Hollis
  *
  * 960107      Added request_region routines, modulized the whole thing.
@@ -70,8 +70,8 @@
 #include <asm/io.h>            /* For inb/outb/... */
 
 /* Module and version information */
-#define WATCHDOG_VERSION "1.17"
-#define WATCHDOG_DATE "12 Feb 2006"
+#define WATCHDOG_VERSION "1.18"
+#define WATCHDOG_DATE "21 Jan 2007"
 #define WATCHDOG_DRIVER_NAME "ISA-PC Watchdog"
 #define WATCHDOG_NAME "pcwd"
 #define PFX WATCHDOG_NAME ": "
 #define CMD_ISA_DELAY_TIME_8SECS       0x0C
 #define CMD_ISA_RESET_RELAYS           0x0D
 
+/* Watchdog's Dip Switch heartbeat values */
+static const int heartbeat_tbl [] = {
+       20,     /* OFF-OFF-OFF  = 20 Sec  */
+       40,     /* OFF-OFF-ON   = 40 Sec  */
+       60,     /* OFF-ON-OFF   =  1 Min  */
+       300,    /* OFF-ON-ON    =  5 Min  */
+       600,    /* ON-OFF-OFF   = 10 Min  */
+       1800,   /* ON-OFF-ON    = 30 Min  */
+       3600,   /* ON-ON-OFF    =  1 Hour */
+       7200,   /* ON-ON-ON     =  2 hour */
+};
+
 /*
  * We are using an kernel timer to do the pinging of the watchdog
  * every ~500ms. We try to set the internal heartbeat of the
@@ -167,14 +179,14 @@ static int debug = QUIET;
 module_param(debug, int, 0);
 MODULE_PARM_DESC(debug, "Debug level: 0=Quiet, 1=Verbose, 2=Debug (default=0)");
 
-#define WATCHDOG_HEARTBEAT 60          /* 60 sec default heartbeat */
+#define WATCHDOG_HEARTBEAT 0           /* default heartbeat = delay-time from dip-switches */
 static int heartbeat = WATCHDOG_HEARTBEAT;
 module_param(heartbeat, int, 0);
-MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (2<=heartbeat<=7200, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")");
+MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (2<=heartbeat<=7200 or 0=delay-time from dip-switches, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")");
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /*
  *     Internal functions
@@ -831,9 +843,7 @@ static int __devinit pcwatchdog_init(int base_addr)
        /* clear the "card caused reboot" flag */
        pcwd_clear_status();
 
-       init_timer(&pcwd_private.timer);
-       pcwd_private.timer.function = pcwd_timer_ping;
-       pcwd_private.timer.data = 0;
+       setup_timer(&pcwd_private.timer, pcwd_timer_ping, 0);
 
        /*  Disable the board  */
        pcwd_stop();
@@ -844,6 +854,10 @@ static int __devinit pcwatchdog_init(int base_addr)
        /* Show info about the card itself */
        pcwd_show_card_info();
 
+       /* If heartbeat = 0 then we use the heartbeat from the dip-switches */
+       if (heartbeat == 0)
+               heartbeat = heartbeat_tbl[(pcwd_get_option_switches() & 0x07)];
+
        /* Check that the heartbeat value is within it's range ; if not reset to the default */
        if (pcwd_set_heartbeat(heartbeat)) {
                pcwd_set_heartbeat(WATCHDOG_HEARTBEAT);
index f4872c87106393786bf1d5be663877a8bbe61fca..61a89e9596421376d2047686f7177e32b073ca41 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     Berkshire PCI-PC Watchdog Card Driver
  *
- *     (c) Copyright 2003-2005 Wim Van Sebroeck <wim@iguana.be>.
+ *     (c) Copyright 2003-2007 Wim Van Sebroeck <wim@iguana.be>.
  *
  *     Based on source code of the following authors:
  *       Ken Hollis <kenji@bitgate.com>,
@@ -51,8 +51,8 @@
 #include <asm/io.h>            /* For inb/outb/... */
 
 /* Module and version information */
-#define WATCHDOG_VERSION "1.02"
-#define WATCHDOG_DATE "03 Sep 2005"
+#define WATCHDOG_VERSION "1.03"
+#define WATCHDOG_DATE "21 Jan 2007"
 #define WATCHDOG_DRIVER_NAME "PCI-PC Watchdog"
 #define WATCHDOG_NAME "pcwd_pci"
 #define PFX WATCHDOG_NAME ": "
 #define CMD_WRITE_WATCHDOG_TIMEOUT             0x19
 #define CMD_GET_CLEAR_RESET_COUNT              0x84
 
+/* Watchdog's Dip Switch heartbeat values */
+static const int heartbeat_tbl [] = {
+       5,      /* OFF-OFF-OFF  =  5 Sec  */
+       10,     /* OFF-OFF-ON   = 10 Sec  */
+       30,     /* OFF-ON-OFF   = 30 Sec  */
+       60,     /* OFF-ON-ON    =  1 Min  */
+       300,    /* ON-OFF-OFF   =  5 Min  */
+       600,    /* ON-OFF-ON    = 10 Min  */
+       1800,   /* ON-ON-OFF    = 30 Min  */
+       3600,   /* ON-ON-ON     =  1 hour */
+};
+
 /* We can only use 1 card due to the /dev/watchdog restriction */
 static int cards_found;
 
@@ -119,14 +131,14 @@ static int debug = QUIET;
 module_param(debug, int, 0);
 MODULE_PARM_DESC(debug, "Debug level: 0=Quiet, 1=Verbose, 2=Debug (default=0)");
 
-#define WATCHDOG_HEARTBEAT 2   /* 2 sec default heartbeat */
+#define WATCHDOG_HEARTBEAT 0   /* default heartbeat = delay-time from dip-switches */
 static int heartbeat = WATCHDOG_HEARTBEAT;
 module_param(heartbeat, int, 0);
-MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")");
+MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536 or 0=delay-time from dip-switches, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")");
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /*
  *     Internal functions
@@ -286,7 +298,9 @@ static int pcipcwd_stop(void)
 static int pcipcwd_keepalive(void)
 {
        /* Re-trigger watchdog by writing to port 0 */
+       spin_lock(&pcipcwd_private.io_lock);
        outb_p(0x42, pcipcwd_private.io_addr);  /* send out any data */
+       spin_unlock(&pcipcwd_private.io_lock);
 
        if (debug >= DEBUG)
                printk(KERN_DEBUG PFX "Watchdog keepalive signal send\n");
@@ -373,7 +387,9 @@ static int pcipcwd_get_temperature(int *temperature)
        if (!pcipcwd_private.supports_temp)
                return -ENODEV;
 
+       spin_lock(&pcipcwd_private.io_lock);
        *temperature = inb_p(pcipcwd_private.io_addr);
+       spin_unlock(&pcipcwd_private.io_lock);
 
        /*
         * Convert celsius to fahrenheit, since this was
@@ -711,6 +727,10 @@ static int __devinit pcipcwd_card_init(struct pci_dev *pdev,
        /* Show info about the card itself */
        pcipcwd_show_card_info();
 
+       /* If heartbeat = 0 then we use the heartbeat from the dip-switches */
+       if (heartbeat == 0)
+               heartbeat = heartbeat_tbl[(pcipcwd_get_option_switches() & 0x07)];
+
        /* Check that the heartbeat value is within it's range ; if not reset to the default */
        if (pcipcwd_set_heartbeat(heartbeat)) {
                pcipcwd_set_heartbeat(WATCHDOG_HEARTBEAT);
@@ -798,6 +818,8 @@ static int __init pcipcwd_init_module(void)
 static void __exit pcipcwd_cleanup_module(void)
 {
        pci_unregister_driver(&pcipcwd_driver);
+
+       printk(KERN_INFO PFX "Watchdog Module Unloaded.\n");
 }
 
 module_init(pcipcwd_init_module);
index 2da5ac99687c60fba0660c713fc34370d6762c5c..31037f9c9ffe8b7a2b41e79f512bfeb3eadf202b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     Berkshire USB-PC Watchdog Card Driver
  *
- *     (c) Copyright 2004 Wim Van Sebroeck <wim@iguana.be>.
+ *     (c) Copyright 2004-2007 Wim Van Sebroeck <wim@iguana.be>.
  *
  *     Based on source code of the following authors:
  *       Ken Hollis <kenji@bitgate.com>,
  *     http://www.berkprod.com/ or http://www.pcwatchdog.com/
  */
 
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/types.h>
-#include <linux/delay.h>
-#include <linux/miscdevice.h>
-#include <linux/watchdog.h>
-#include <linux/notifier.h>
-#include <linux/reboot.h>
-#include <linux/fs.h>
-#include <linux/smp_lock.h>
-#include <linux/completion.h>
-#include <asm/uaccess.h>
-#include <linux/usb.h>
-#include <linux/mutex.h>
+#include <linux/module.h>      /* For module specific items */
+#include <linux/moduleparam.h> /* For new moduleparam's */
+#include <linux/types.h>       /* For standard types (like size_t) */
+#include <linux/errno.h>       /* For the -ENODEV/... values */
+#include <linux/kernel.h>      /* For printk/panic/... */
+#include <linux/delay.h>       /* For mdelay function */
+#include <linux/miscdevice.h>  /* For MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR) */
+#include <linux/watchdog.h>    /* For the watchdog specific items */
+#include <linux/notifier.h>    /* For notifier support */
+#include <linux/reboot.h>      /* For reboot_notifier stuff */
+#include <linux/init.h>                /* For __init/__exit/... */
+#include <linux/fs.h>          /* For file operations */
+#include <linux/usb.h>         /* For USB functions */
+#include <linux/slab.h>                /* For kmalloc, ... */
+#include <linux/mutex.h>       /* For mutex locking */
 #include <linux/hid.h>         /* For HID_REQ_SET_REPORT & HID_DT_REPORT */
 
+#include <asm/uaccess.h>       /* For copy_to_user/put_user/... */
+
 
 #ifdef CONFIG_USB_DEBUG
        static int debug = 1;
@@ -57,8 +56,8 @@
 
 
 /* Module and Version Information */
-#define DRIVER_VERSION "1.01"
-#define DRIVER_DATE "15 Mar 2005"
+#define DRIVER_VERSION "1.02"
+#define DRIVER_DATE "21 Jan 2007"
 #define DRIVER_AUTHOR "Wim Van Sebroeck <wim@iguana.be>"
 #define DRIVER_DESC "Berkshire USB-PC Watchdog driver"
 #define DRIVER_LICENSE "GPL"
@@ -75,14 +74,14 @@ MODULE_ALIAS_MISCDEV(TEMP_MINOR);
 module_param(debug, int, 0);
 MODULE_PARM_DESC(debug, "Debug enabled or not");
 
-#define WATCHDOG_HEARTBEAT 2   /* 2 sec default heartbeat */
+#define WATCHDOG_HEARTBEAT 0   /* default heartbeat = delay-time from dip-switches */
 static int heartbeat = WATCHDOG_HEARTBEAT;
 module_param(heartbeat, int, 0);
-MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")");
+MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536 or 0=delay-time from dip-switches, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")");
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /* The vendor and product id's for the USB-PC Watchdog card */
 #define USB_PCWD_VENDOR_ID     0x0c98
@@ -110,6 +109,18 @@ MODULE_DEVICE_TABLE (usb, usb_pcwd_table);
 #define CMD_ENABLE_WATCHDOG            0x30    /* Enable / Disable Watchdog */
 #define CMD_DISABLE_WATCHDOG           CMD_ENABLE_WATCHDOG
 
+/* Watchdog's Dip Switch heartbeat values */
+static const int heartbeat_tbl [] = {
+       5,      /* OFF-OFF-OFF  =  5 Sec  */
+       10,     /* OFF-OFF-ON   = 10 Sec  */
+       30,     /* OFF-ON-OFF   = 30 Sec  */
+       60,     /* OFF-ON-ON    =  1 Min  */
+       300,    /* ON-OFF-OFF   =  5 Min  */
+       600,    /* ON-OFF-ON    = 10 Min  */
+       1800,   /* ON-ON-OFF    = 30 Min  */
+       3600,   /* ON-ON-ON     =  1 hour */
+};
+
 /* We can only use 1 card due to the /dev/watchdog restriction */
 static int cards_found;
 
@@ -682,6 +693,10 @@ static int usb_pcwd_probe(struct usb_interface *interface, const struct usb_devi
                ((option_switches & 0x10) ? "ON" : "OFF"),
                ((option_switches & 0x08) ? "ON" : "OFF"));
 
+       /* If heartbeat = 0 then we use the heartbeat from the dip-switches */
+       if (heartbeat == 0)
+               heartbeat = heartbeat_tbl[(option_switches & 0x07)];
+
        /* Check that the heartbeat value is within it's range ; if not reset to the default */
        if (usb_pcwd_set_heartbeat(usb_pcwd, heartbeat)) {
                usb_pcwd_set_heartbeat(usb_pcwd, WATCHDOG_HEARTBEAT);
index 3a55fc6abcd8fe3a7382111dbf24493c97a31a4d..5991add702b00e32efaf83711ebdb2a60dc8b832 100644 (file)
@@ -238,7 +238,7 @@ static int pnx4008_wdt_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations pnx4008_wdt_fops = {
+static const struct file_operations pnx4008_wdt_fops = {
        .owner = THIS_MODULE,
        .llseek = no_llseek,
        .write = pnx4008_wdt_write,
@@ -283,7 +283,8 @@ static int pnx4008_wdt_probe(struct platform_device *pdev)
        wdt_base = (void __iomem *)IO_ADDRESS(res->start);
 
        wdt_clk = clk_get(&pdev->dev, "wdt_ck");
-       if (!wdt_clk) {
+       if (IS_ERR(wdt_clk)) {
+               ret = PTR_ERR(wdt_clk);
                release_resource(wdt_mem);
                kfree(wdt_mem);
                goto out;
index 7576a13e86bc062d4b0dd92cc7e0b60510354892..5c921e471564778aeffcafe7c3b7afeb37757018 100644 (file)
@@ -95,7 +95,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be disabled once started");
 
 
 /* Kernel interfaces */
-static struct file_operations fops = {
+static const struct file_operations fops = {
        .owner          = THIS_MODULE,
        .open           = wdt_gpi_open,
        .release        = wdt_gpi_release,
@@ -192,7 +192,7 @@ static int wdt_gpi_open(struct inode *inode, struct file *file)
                locked = 0;
        }
 
-       res = request_irq(wd_irq, wdt_gpi_irqhdl, SA_SHIRQ | SA_INTERRUPT,
+       res = request_irq(wd_irq, wdt_gpi_irqhdl, IRQF_SHARED | IRQF_DISABLED,
                          wdt_gpi_name, &miscdev);
        if (unlikely(res))
                return res;
index 18cb050c38624b6eb76bc658849c8cecd107c950..dff6cb5dc9a7a0700c6dc09f2110736505701b06 100644 (file)
@@ -78,7 +78,7 @@ MODULE_PARM_DESC(tmr_margin, "Watchdog tmr_margin in seconds. default=" __MODULE
 
 MODULE_PARM_DESC(tmr_atboot, "Watchdog is started at boot time if set to 1, default=" __MODULE_STRING(CONFIG_S3C2410_WATCHDOG_ATBOOT));
 
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 MODULE_PARM_DESC(soft_noboot, "Watchdog action, set to 1 to ignore reboots, 0 to reboot (default depends on ONLY_TESTING)");
 
@@ -366,13 +366,15 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
        wdt_mem = request_mem_region(res->start, size, pdev->name);
        if (wdt_mem == NULL) {
                printk(KERN_INFO PFX "failed to get memory region\n");
-               return -ENOENT;
+               ret = -ENOENT;
+               goto err_req;
        }
 
        wdt_base = ioremap(res->start, size);
        if (wdt_base == 0) {
                printk(KERN_INFO PFX "failed to ioremap() region\n");
-               return -EINVAL;
+               ret = -EINVAL;
+               goto err_req;
        }
 
        DBG("probe: mapped wdt_base=%p\n", wdt_base);
@@ -380,22 +382,21 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
        res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
        if (res == NULL) {
                printk(KERN_INFO PFX "failed to get irq resource\n");
-               iounmap(wdt_base);
-               return -ENOENT;
+               ret = -ENOENT;
+               goto err_map;
        }
 
        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);
-               iounmap(wdt_base);
-               return ret;
+               goto err_map;
        }
 
        wdt_clock = clk_get(&pdev->dev, "watchdog");
-       if (wdt_clock == NULL) {
+       if (IS_ERR(wdt_clock)) {
                printk(KERN_INFO PFX "failed to find watchdog clock source\n");
-               iounmap(wdt_base);
-               return -ENOENT;
+               ret = PTR_ERR(wdt_clock);
+               goto err_irq;
        }
 
        clk_enable(wdt_clock);
@@ -418,8 +419,7 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
        if (ret) {
                printk (KERN_ERR PFX "cannot register miscdev on minor=%d (%d)\n",
                        WATCHDOG_MINOR, ret);
-               iounmap(wdt_base);
-               return ret;
+               goto err_clk;
        }
 
        if (tmr_atboot && started == 0) {
@@ -434,26 +434,36 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
        }
 
        return 0;
+
+ err_clk:
+       clk_disable(wdt_clock);
+       clk_put(wdt_clock);
+
+ err_irq:
+       free_irq(wdt_irq->start, pdev);
+
+ err_map:
+       iounmap(wdt_base);
+
+ err_req:
+       release_resource(wdt_mem);
+       kfree(wdt_mem);
+
+       return ret;
 }
 
 static int s3c2410wdt_remove(struct platform_device *dev)
 {
-       if (wdt_mem != NULL) {
-               release_resource(wdt_mem);
-               kfree(wdt_mem);
-               wdt_mem = NULL;
-       }
+       release_resource(wdt_mem);
+       kfree(wdt_mem);
+       wdt_mem = NULL;
 
-       if (wdt_irq != NULL) {
-               free_irq(wdt_irq->start, dev);
-               wdt_irq = NULL;
-       }
+       free_irq(wdt_irq->start, dev);
+       wdt_irq = NULL;
 
-       if (wdt_clock != NULL) {
-               clk_disable(wdt_clock);
-               clk_put(wdt_clock);
-               wdt_clock = NULL;
-       }
+       clk_disable(wdt_clock);
+       clk_put(wdt_clock);
+       wdt_clock = NULL;
 
        iounmap(wdt_base);
        misc_deregister(&s3c2410wdt_miscdev);
index c7b2045bc76b5196f6aa04c732c2dd95a4912704..b6282039198c6cdcef656098d31a4570125c721e 100644 (file)
@@ -100,10 +100,10 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. (1<=timeout<=3600, defau
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 static void wdt_timer_ping(unsigned long);
-static struct timer_list timer;
+static DEFINE_TIMER(timer, wdt_timer_ping, 0, 0);
 static unsigned long next_heartbeat;
 static unsigned long wdt_is_open;
 static char wdt_expect_close;
@@ -122,8 +122,7 @@ static void wdt_timer_ping(unsigned long data)
                /* Ping the WDT by reading from wdt_start */
                inb_p(wdt_start);
                /* Re-set the timer interval */
-               timer.expires = jiffies + WDT_INTERVAL;
-               add_timer(&timer);
+               mod_timer(&timer, jiffies + WDT_INTERVAL);
        } else {
                printk(KERN_WARNING PFX "Heartbeat lost! Will not ping the watchdog\n");
        }
@@ -138,8 +137,7 @@ static void wdt_startup(void)
        next_heartbeat = jiffies + (timeout * HZ);
 
        /* Start the timer */
-       timer.expires = jiffies + WDT_INTERVAL;
-       add_timer(&timer);
+       mod_timer(&timer, jiffies + WDT_INTERVAL);
        printk(KERN_INFO PFX "Watchdog timer is now enabled.\n");
 }
 
@@ -363,10 +361,6 @@ static int __init sbc60xxwdt_init(void)
                }
        }
 
-       init_timer(&timer);
-       timer.function = wdt_timer_ping;
-       timer.data = 0;
-
        rc = misc_register(&wdt_miscdev);
        if (rc)
        {
index 41fc6f80c493bef6c83052f8fd44121ec974e483..67ae42685e752f94d5feb19c7c4684467fa296af 100644 (file)
@@ -204,7 +204,7 @@ module_param(timeout, int, 0);
 MODULE_PARM_DESC(timeout, "Index into timeout table (0-63) (default=27 (60s))");
 module_param(nowayout, int, 0);
 MODULE_PARM_DESC(nowayout,
-                "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+                "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /*
  *     Kernel methods.
index 8882b427d24f44d988bd2682fee1559a305eecec..82cbd8809a69b0cc863752f43f8fad58a3164bcf 100644 (file)
@@ -35,7 +35,7 @@ static int epx_c3_alive;
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 #define EPXC3_WATCHDOG_CTL_REG 0x1ee /* write 1 to enable, 0 to disable */
 #define EPXC3_WATCHDOG_PET_REG 0x1ef /* write anything to pet once enabled */
index e3239833e4b0be839bb0223c2fce7f55a34309d6..1e4a8d751a71e8513e8bd23c42f253813bb92447 100644 (file)
@@ -92,7 +92,7 @@ MODULE_PARM_DESC(timeout, "range is 0-255 minutes, default is 1");
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 
 
index caec37ba750a6810e7ea54abb6f73a6e72ef8e69..2676a43895a71f640c19f5120a0d8ff7f2523dbb 100644 (file)
@@ -97,7 +97,7 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. (1<=timeout<=3600, defau
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /*
  * AMD Elan SC520 - Watchdog Timer Registers
@@ -121,7 +121,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CON
 static __u16 __iomem *wdtmrctl;
 
 static void wdt_timer_ping(unsigned long);
-static struct timer_list timer;
+static DEFINE_TIMER(timer, wdt_timer_ping, 0, 0);
 static unsigned long next_heartbeat;
 static unsigned long wdt_is_open;
 static char wdt_expect_close;
@@ -145,8 +145,7 @@ static void wdt_timer_ping(unsigned long data)
                spin_unlock(&wdt_spinlock);
 
                /* Re-set the timer interval */
-               timer.expires = jiffies + WDT_INTERVAL;
-               add_timer(&timer);
+               mod_timer(&timer, jiffies + WDT_INTERVAL);
        } else {
                printk(KERN_WARNING PFX "Heartbeat lost! Will not ping the watchdog\n");
        }
@@ -179,8 +178,7 @@ static int wdt_startup(void)
        next_heartbeat = jiffies + (timeout * HZ);
 
        /* Start the timer */
-       timer.expires = jiffies + WDT_INTERVAL;
-       add_timer(&timer);
+       mod_timer(&timer, jiffies + WDT_INTERVAL);
 
        /* Start the watchdog */
        wdt_config(WDT_ENB | WDT_WRST_ENB | WDT_EXP_SEL_04);
@@ -389,10 +387,6 @@ static int __init sc520_wdt_init(void)
 
        spin_lock_init(&wdt_spinlock);
 
-       init_timer(&timer);
-       timer.function = wdt_timer_ping;
-       timer.data = 0;
-
        /* Check that the timeout value is within it's range ; if not reset to the default */
        if (wdt_set_heartbeat(timeout)) {
                wdt_set_heartbeat(WATCHDOG_TIMEOUT);
index dc403629aeb3d79a4e112798fe4ababfd2751070..cecbedd473a4392436ea150e1446b66c0a4c4601 100644 (file)
@@ -65,10 +65,12 @@ static int clock_division_ratio = WTCSR_CKS_4096;
 
 #define next_ping_period(cks)  msecs_to_jiffies(cks - 4)
 
+static void sh_wdt_ping(unsigned long data);
+
 static unsigned long shwdt_is_open;
 static struct watchdog_info sh_wdt_info;
 static char shwdt_expect_close;
-static struct timer_list timer;
+static DEFINE_TIMER(timer, sh_wdt_ping, 0, 0);
 static unsigned long next_heartbeat;
 
 #define WATCHDOG_HEARTBEAT 30                  /* 30 sec default heartbeat */
@@ -433,10 +435,6 @@ static int __init sh_wdt_init(void)
                       "be 1<=x<=3600, using %d\n", heartbeat);
        }
 
-       init_timer(&timer);
-       timer.function = sh_wdt_ping;
-       timer.data = 0;
-
        rc = register_reboot_notifier(&sh_wdt_notifier);
        if (unlikely(rc)) {
                printk(KERN_ERR PFX "Can't register reboot notifier (err=%d)\n",
index 9f56913b484ff42fea94800f5c7a0111d9d0bee2..d3cb0a76602036a679e5f242ecaffb026bc93f51 100644 (file)
@@ -510,7 +510,7 @@ static int wb_smsc_wdt_notify_sys(struct notifier_block *this, unsigned long cod
 
 /* -- Module's structures ---------------------------------------*/
 
-static struct file_operations wb_smsc_wdt_fops =
+static const struct file_operations wb_smsc_wdt_fops =
 {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
@@ -624,4 +624,4 @@ module_param(timeout, int, 0);
 MODULE_PARM_DESC(timeout, "range is 1-255 units, default is 60");
 
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
index 4067e1f8a36878c7fa6665175051231b2710542f..9c3694909243e80c6877cde927722c260dd246c5 100644 (file)
@@ -59,7 +59,7 @@ MODULE_PARM_DESC(soft_margin, "Watchdog soft_margin in seconds. (0<soft_margin<6
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 #ifdef ONLY_TESTING
 static int soft_noboot = 1;
index 07d4bff27226b378a6d88d3c1fb0abe9f9f8172a..337ee42c90dd757644913cd5a42330f3c20330cc 100644 (file)
@@ -58,7 +58,7 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=63, defaul
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /*
  *     Kernel methods.
index 7768b55487c88e6bf50ba8248c416937b4c88f7d..d9e821d08deb3b7ea21b36be0ec4682389e807e5 100644 (file)
@@ -60,7 +60,7 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=255, defau
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /*
  *     Kernel methods.
@@ -323,7 +323,7 @@ wdt_notify_sys(struct notifier_block *this, unsigned long code,
  *     Kernel Interfaces
  */
 
-static struct file_operations wdt_fops = {
+static const struct file_operations wdt_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .write          = wdt_write,
index b0e5f84d6bafdc24fb9c21742f35b3b0bcdcc965..3c88fe18f4f437e01e88264e340ddea12fe0d207 100644 (file)
@@ -87,10 +87,10 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. (1<=timeout<=3600, defau
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 static void wdt_timer_ping(unsigned long);
-static struct timer_list timer;
+static DEFINE_TIMER(timer, wdt_timer_ping, 0, 0);
 static unsigned long next_heartbeat;
 static unsigned long wdt_is_open;
 static char wdt_expect_close;
@@ -114,8 +114,7 @@ static void wdt_timer_ping(unsigned long data)
                inb_p(WDT_PING);
 
                /* Re-set the timer interval */
-               timer.expires = jiffies + WDT_INTERVAL;
-               add_timer(&timer);
+               mod_timer(&timer, jiffies + WDT_INTERVAL);
 
                spin_unlock(&wdt_spinlock);
 
@@ -155,8 +154,7 @@ static void wdt_startup(void)
        next_heartbeat = jiffies + (timeout * HZ);
 
        /* Start the timer */
-       timer.expires = jiffies + WDT_INTERVAL;
-       add_timer(&timer);
+       mod_timer(&timer, jiffies + WDT_INTERVAL);
 
        wdt_change(WDT_ENABLE);
 
@@ -377,10 +375,6 @@ static int __init w83877f_wdt_init(void)
                goto err_out_region1;
        }
 
-       init_timer(&timer);
-       timer.function = wdt_timer_ping;
-       timer.data = 0;
-
        rc = misc_register(&wdt_miscdev);
        if (rc)
        {
index 2c8d5d8bd4e85303750274d1e9b2907b66c0bdad..15796844289121d9ed3bc2833a6cd6eecb2c9b81 100644 (file)
@@ -59,7 +59,7 @@ MODULE_PARM_DESC(testmode,"Watchdog testmode (1 = no reboot), default=0");
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /*
  * Start the watchdog
index 163e028ef9ed6cee052ee4aa643d8659e17e5bc8..950905d3c39f298ae00b1094b17ddec60231d331 100644 (file)
@@ -65,7 +65,7 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=255, defau
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 static void wafwdt_ping(void)
 {
index 517fbd8643f8f00a2b1970f8b7a63fb023f1fc38..0a3de6a024420b52369b00f19a55ba3844a8b12e 100644 (file)
@@ -64,7 +64,7 @@ MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536,
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /* You must set these - there is no sane way to probe for this board. */
 static int io=0x240;
index 6253041b235bb2ae0c1260e772f86b659bd799cb..7d300ff7ab07ed65df9ce6e8006a449c01dd4600 100644 (file)
@@ -68,7 +68,7 @@ MODULE_PARM_DESC(testmode,"Watchdog testmode (1 = no reboot), default=0");
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 /*
  * Start the watchdog
index ce1261c5cbce9a7423ad0b0d3babcf74cc69dd59..6baf4ae42c9d0e831cfa87e4470c72a7b2b15a4d 100644 (file)
@@ -90,7 +90,7 @@ MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536,
 
 static int nowayout = WATCHDOG_NOWAYOUT;
 module_param(nowayout, int, 0);
-MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
 
 #ifdef CONFIG_WDT_501_PCI
 /* Support for the Fan Tachometer on the PCI-WDT501 */
index b6bcdbbf57b3fe5ab0810fc6221fcab1d9b744ed..ccaa6a39cb4b8195a9f30dafc38a41f6de821028 100644 (file)
  * This file is licensed under the GPL v2.
  */
 
+#include <linux/acpi_pmtmr.h>
 #include <linux/clocksource.h>
 #include <linux/errno.h>
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <asm/io.h>
 
-/* Number of PMTMR ticks expected during calibration run */
-#define PMTMR_TICKS_PER_SEC 3579545
-
 /*
  * The I/O port the PMTMR resides at.
  * The location is detected during setup_arch(),
  */
 u32 pmtmr_ioport __read_mostly;
 
-#define ACPI_PM_MASK CLOCKSOURCE_MASK(24) /* limit it to 24 bits */
-
 static inline u32 read_pmtmr(void)
 {
        /* mask the output to 24 bits */
        return inl(pmtmr_ioport) & ACPI_PM_MASK;
 }
 
-static cycle_t acpi_pm_read_verified(void)
+u32 acpi_pm_read_verified(void)
 {
        u32 v1 = 0, v2 = 0, v3 = 0;
 
@@ -57,7 +53,12 @@ static cycle_t acpi_pm_read_verified(void)
        } while (unlikely((v1 > v2 && v1 < v3) || (v2 > v3 && v2 < v1)
                          || (v3 > v1 && v3 < v2)));
 
-       return (cycle_t)v2;
+       return v2;
+}
+
+static cycle_t acpi_pm_read_slow(void)
+{
+       return (cycle_t)acpi_pm_read_verified();
 }
 
 static cycle_t acpi_pm_read(void)
@@ -72,7 +73,8 @@ static struct clocksource clocksource_acpi_pm = {
        .mask           = (cycle_t)ACPI_PM_MASK,
        .mult           = 0, /*to be caluclated*/
        .shift          = 22,
-       .is_continuous  = 1,
+       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
+
 };
 
 
@@ -87,7 +89,7 @@ __setup("acpi_pm_good", acpi_pm_good_setup);
 
 static inline void acpi_pm_need_workaround(void)
 {
-       clocksource_acpi_pm.read = acpi_pm_read_verified;
+       clocksource_acpi_pm.read = acpi_pm_read_slow;
        clocksource_acpi_pm.rating = 110;
 }
 
index bf4d3d50d1c4e9a7c76c05f9b8476ebf3896f8c2..4f3925ceb36041a8cdbdaab80b0c330eebb28a61 100644 (file)
@@ -31,7 +31,7 @@ static struct clocksource clocksource_cyclone = {
        .mask           = CYCLONE_TIMER_MASK,
        .mult           = 10,
        .shift          = 0,
-       .is_continuous  = 1,
+       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
 };
 
 static int __init init_cyclone_clocksource(void)
index 22915cc46ba7fbe56ef7e52896ce74c9490b8e7a..b92da677aa5d8e23673e192a8c5bcdf67ae46de0 100644 (file)
@@ -57,7 +57,7 @@ static struct clocksource cs_hrt = {
        .rating         = 250,
        .read           = read_hrt,
        .mask           = CLOCKSOURCE_MASK(32),
-       .is_continuous  = 1,
+       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
        /* mult, shift are set based on mhz27 flag */
 };
 
index 491779af8d556963e4e86a742af828bd6ea347e0..d155e81b5c97d5b6dc267d57897eada5a23ecf51 100644 (file)
@@ -16,7 +16,7 @@ config CPU_FREQ
 if CPU_FREQ
 
 config CPU_FREQ_TABLE
-       def_tristate m
+       tristate
 
 config CPU_FREQ_DEBUG
        bool "Enable CPUfreq debugging"
index a45cc89e387a3ee14ba2afcda2cb09ac5303b1f0..f52facc570f57c97841b7a4bd809f6929bbe88a8 100644 (file)
@@ -41,8 +41,67 @@ static struct cpufreq_driver *cpufreq_driver;
 static struct cpufreq_policy *cpufreq_cpu_data[NR_CPUS];
 static DEFINE_SPINLOCK(cpufreq_driver_lock);
 
+/*
+ * cpu_policy_rwsem is a per CPU reader-writer semaphore designed to cure
+ * all cpufreq/hotplug/workqueue/etc related lock issues.
+ *
+ * The rules for this semaphore:
+ * - Any routine that wants to read from the policy structure will
+ *   do a down_read on this semaphore.
+ * - Any routine that will write to the policy structure and/or may take away
+ *   the policy altogether (eg. CPU hotplug), will hold this lock in write
+ *   mode before doing so.
+ *
+ * Additional rules:
+ * - All holders of the lock should check to make sure that the CPU they
+ *   are concerned with are online after they get the lock.
+ * - Governor routines that can be called in cpufreq hotplug path should not
+ *   take this sem as top level hotplug notifier handler takes this.
+ */
+static DEFINE_PER_CPU(int, policy_cpu);
+static DEFINE_PER_CPU(struct rw_semaphore, cpu_policy_rwsem);
+
+#define lock_policy_rwsem(mode, cpu)                                   \
+int lock_policy_rwsem_##mode                                           \
+(int cpu)                                                              \
+{                                                                      \
+       int policy_cpu = per_cpu(policy_cpu, cpu);                      \
+       BUG_ON(policy_cpu == -1);                                       \
+       down_##mode(&per_cpu(cpu_policy_rwsem, policy_cpu));            \
+       if (unlikely(!cpu_online(cpu))) {                               \
+               up_##mode(&per_cpu(cpu_policy_rwsem, policy_cpu));      \
+               return -1;                                              \
+       }                                                               \
+                                                                       \
+       return 0;                                                       \
+}
+
+lock_policy_rwsem(read, cpu);
+EXPORT_SYMBOL_GPL(lock_policy_rwsem_read);
+
+lock_policy_rwsem(write, cpu);
+EXPORT_SYMBOL_GPL(lock_policy_rwsem_write);
+
+void unlock_policy_rwsem_read(int cpu)
+{
+       int policy_cpu = per_cpu(policy_cpu, cpu);
+       BUG_ON(policy_cpu == -1);
+       up_read(&per_cpu(cpu_policy_rwsem, policy_cpu));
+}
+EXPORT_SYMBOL_GPL(unlock_policy_rwsem_read);
+
+void unlock_policy_rwsem_write(int cpu)
+{
+       int policy_cpu = per_cpu(policy_cpu, cpu);
+       BUG_ON(policy_cpu == -1);
+       up_write(&per_cpu(cpu_policy_rwsem, policy_cpu));
+}
+EXPORT_SYMBOL_GPL(unlock_policy_rwsem_write);
+
+
 /* internal prototypes */
 static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event);
+static unsigned int __cpufreq_get(unsigned int cpu);
 static void handle_update(struct work_struct *work);
 
 /**
@@ -415,12 +474,8 @@ static ssize_t store_##file_name                                   \
        if (ret != 1)                                                   \
                return -EINVAL;                                         \
                                                                        \
-       lock_cpu_hotplug();                                             \
-       mutex_lock(&policy->lock);                                      \
        ret = __cpufreq_set_policy(policy, &new_policy);                \
        policy->user_policy.object = policy->object;                    \
-       mutex_unlock(&policy->lock);                                    \
-       unlock_cpu_hotplug();                                           \
                                                                        \
        return ret ? ret : count;                                       \
 }
@@ -434,7 +489,7 @@ store_one(scaling_max_freq,max);
 static ssize_t show_cpuinfo_cur_freq (struct cpufreq_policy * policy,
                                                        char *buf)
 {
-       unsigned int cur_freq = cpufreq_get(policy->cpu);
+       unsigned int cur_freq = __cpufreq_get(policy->cpu);
        if (!cur_freq)
                return sprintf(buf, "<unknown>");
        return sprintf(buf, "%u\n", cur_freq);
@@ -479,18 +534,12 @@ static ssize_t store_scaling_governor (struct cpufreq_policy * policy,
                                                &new_policy.governor))
                return -EINVAL;
 
-       lock_cpu_hotplug();
-
        /* Do not use cpufreq_set_policy here or the user_policy.max
           will be wrongly overridden */
-       mutex_lock(&policy->lock);
        ret = __cpufreq_set_policy(policy, &new_policy);
 
        policy->user_policy.policy = policy->policy;
        policy->user_policy.governor = policy->governor;
-       mutex_unlock(&policy->lock);
-
-       unlock_cpu_hotplug();
 
        if (ret)
                return ret;
@@ -595,11 +644,17 @@ static ssize_t show(struct kobject * kobj, struct attribute * attr ,char * buf)
        policy = cpufreq_cpu_get(policy->cpu);
        if (!policy)
                return -EINVAL;
+
+       if (lock_policy_rwsem_read(policy->cpu) < 0)
+               return -EINVAL;
+
        if (fattr->show)
                ret = fattr->show(policy, buf);
        else
                ret = -EIO;
 
+       unlock_policy_rwsem_read(policy->cpu);
+
        cpufreq_cpu_put(policy);
        return ret;
 }
@@ -613,11 +668,17 @@ static ssize_t store(struct kobject * kobj, struct attribute * attr,
        policy = cpufreq_cpu_get(policy->cpu);
        if (!policy)
                return -EINVAL;
+
+       if (lock_policy_rwsem_write(policy->cpu) < 0)
+               return -EINVAL;
+
        if (fattr->store)
                ret = fattr->store(policy, buf, count);
        else
                ret = -EIO;
 
+       unlock_policy_rwsem_write(policy->cpu);
+
        cpufreq_cpu_put(policy);
        return ret;
 }
@@ -691,8 +752,10 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
        policy->cpu = cpu;
        policy->cpus = cpumask_of_cpu(cpu);
 
-       mutex_init(&policy->lock);
-       mutex_lock(&policy->lock);
+       /* Initially set CPU itself as the policy_cpu */
+       per_cpu(policy_cpu, cpu) = cpu;
+       lock_policy_rwsem_write(cpu);
+
        init_completion(&policy->kobj_unregister);
        INIT_WORK(&policy->update, handle_update);
 
@@ -702,7 +765,7 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
        ret = cpufreq_driver->init(policy);
        if (ret) {
                dprintk("initialization failed\n");
-               mutex_unlock(&policy->lock);
+               unlock_policy_rwsem_write(cpu);
                goto err_out;
        }
 
@@ -716,6 +779,14 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
                 */
                managed_policy = cpufreq_cpu_get(j);
                if (unlikely(managed_policy)) {
+
+                       /* Set proper policy_cpu */
+                       unlock_policy_rwsem_write(cpu);
+                       per_cpu(policy_cpu, cpu) = managed_policy->cpu;
+
+                       if (lock_policy_rwsem_write(cpu) < 0)
+                               goto err_out_driver_exit;
+
                        spin_lock_irqsave(&cpufreq_driver_lock, flags);
                        managed_policy->cpus = policy->cpus;
                        cpufreq_cpu_data[cpu] = managed_policy;
@@ -726,13 +797,13 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
                                                &managed_policy->kobj,
                                                "cpufreq");
                        if (ret) {
-                               mutex_unlock(&policy->lock);
+                               unlock_policy_rwsem_write(cpu);
                                goto err_out_driver_exit;
                        }
 
                        cpufreq_debug_enable_ratelimit();
-                       mutex_unlock(&policy->lock);
                        ret = 0;
+                       unlock_policy_rwsem_write(cpu);
                        goto err_out_driver_exit; /* call driver->exit() */
                }
        }
@@ -746,7 +817,7 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
 
        ret = kobject_register(&policy->kobj);
        if (ret) {
-               mutex_unlock(&policy->lock);
+               unlock_policy_rwsem_write(cpu);
                goto err_out_driver_exit;
        }
        /* set up files for this cpu device */
@@ -761,8 +832,10 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
                sysfs_create_file(&policy->kobj, &scaling_cur_freq.attr);
 
        spin_lock_irqsave(&cpufreq_driver_lock, flags);
-       for_each_cpu_mask(j, policy->cpus)
+       for_each_cpu_mask(j, policy->cpus) {
                cpufreq_cpu_data[j] = policy;
+               per_cpu(policy_cpu, j) = policy->cpu;
+       }
        spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
 
        /* symlink affected CPUs */
@@ -778,14 +851,14 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
                ret = sysfs_create_link(&cpu_sys_dev->kobj, &policy->kobj,
                                        "cpufreq");
                if (ret) {
-                       mutex_unlock(&policy->lock);
+                       unlock_policy_rwsem_write(cpu);
                        goto err_out_unregister;
                }
        }
 
        policy->governor = NULL; /* to assure that the starting sequence is
                                  * run in cpufreq_set_policy */
-       mutex_unlock(&policy->lock);
+       unlock_policy_rwsem_write(cpu);
 
        /* set default policy */
        ret = cpufreq_set_policy(&new_policy);
@@ -826,11 +899,13 @@ module_out:
 
 
 /**
- * cpufreq_remove_dev - remove a CPU device
+ * __cpufreq_remove_dev - remove a CPU device
  *
  * Removes the cpufreq interface for a CPU device.
+ * Caller should already have policy_rwsem in write mode for this CPU.
+ * This routine frees the rwsem before returning.
  */
-static int cpufreq_remove_dev (struct sys_device * sys_dev)
+static int __cpufreq_remove_dev (struct sys_device * sys_dev)
 {
        unsigned int cpu = sys_dev->id;
        unsigned long flags;
@@ -849,6 +924,7 @@ static int cpufreq_remove_dev (struct sys_device * sys_dev)
        if (!data) {
                spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
                cpufreq_debug_enable_ratelimit();
+               unlock_policy_rwsem_write(cpu);
                return -EINVAL;
        }
        cpufreq_cpu_data[cpu] = NULL;
@@ -865,6 +941,7 @@ static int cpufreq_remove_dev (struct sys_device * sys_dev)
                sysfs_remove_link(&sys_dev->kobj, "cpufreq");
                cpufreq_cpu_put(data);
                cpufreq_debug_enable_ratelimit();
+               unlock_policy_rwsem_write(cpu);
                return 0;
        }
 #endif
@@ -873,6 +950,7 @@ static int cpufreq_remove_dev (struct sys_device * sys_dev)
        if (!kobject_get(&data->kobj)) {
                spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
                cpufreq_debug_enable_ratelimit();
+               unlock_policy_rwsem_write(cpu);
                return -EFAULT;
        }
 
@@ -906,10 +984,10 @@ static int cpufreq_remove_dev (struct sys_device * sys_dev)
        spin_unlock_irqrestore(&cpufreq_driver_lock, flags);
 #endif
 
-       mutex_lock(&data->lock);
        if (cpufreq_driver->target)
                __cpufreq_governor(data, CPUFREQ_GOV_STOP);
-       mutex_unlock(&data->lock);
+
+       unlock_policy_rwsem_write(cpu);
 
        kobject_unregister(&data->kobj);
 
@@ -933,6 +1011,18 @@ static int cpufreq_remove_dev (struct sys_device * sys_dev)
 }
 
 
+static int cpufreq_remove_dev (struct sys_device * sys_dev)
+{
+       unsigned int cpu = sys_dev->id;
+       int retval;
+       if (unlikely(lock_policy_rwsem_write(cpu)))
+               BUG();
+
+       retval = __cpufreq_remove_dev(sys_dev);
+       return retval;
+}
+
+
 static void handle_update(struct work_struct *work)
 {
        struct cpufreq_policy *policy =
@@ -980,9 +1070,12 @@ unsigned int cpufreq_quick_get(unsigned int cpu)
        unsigned int ret_freq = 0;
 
        if (policy) {
-               mutex_lock(&policy->lock);
+               if (unlikely(lock_policy_rwsem_read(cpu)))
+                       return ret_freq;
+
                ret_freq = policy->cur;
-               mutex_unlock(&policy->lock);
+
+               unlock_policy_rwsem_read(cpu);
                cpufreq_cpu_put(policy);
        }
 
@@ -991,24 +1084,13 @@ unsigned int cpufreq_quick_get(unsigned int cpu)
 EXPORT_SYMBOL(cpufreq_quick_get);
 
 
-/**
- * cpufreq_get - get the current CPU frequency (in kHz)
- * @cpu: CPU number
- *
- * Get the CPU current (static) CPU frequency
- */
-unsigned int cpufreq_get(unsigned int cpu)
+static unsigned int __cpufreq_get(unsigned int cpu)
 {
-       struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
+       struct cpufreq_policy *policy = cpufreq_cpu_data[cpu];
        unsigned int ret_freq = 0;
 
-       if (!policy)
-               return 0;
-
        if (!cpufreq_driver->get)
-               goto out;
-
-       mutex_lock(&policy->lock);
+               return (ret_freq);
 
        ret_freq = cpufreq_driver->get(cpu);
 
@@ -1022,11 +1104,33 @@ unsigned int cpufreq_get(unsigned int cpu)
                }
        }
 
-       mutex_unlock(&policy->lock);
+       return (ret_freq);
+}
 
-out:
-       cpufreq_cpu_put(policy);
+/**
+ * cpufreq_get - get the current CPU frequency (in kHz)
+ * @cpu: CPU number
+ *
+ * Get the CPU current (static) CPU frequency
+ */
+unsigned int cpufreq_get(unsigned int cpu)
+{
+       unsigned int ret_freq = 0;
+       struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
+
+       if (!policy)
+               goto out;
+
+       if (unlikely(lock_policy_rwsem_read(cpu)))
+               goto out_policy;
+
+       ret_freq = __cpufreq_get(cpu);
 
+       unlock_policy_rwsem_read(cpu);
+
+out_policy:
+       cpufreq_cpu_put(policy);
+out:
        return (ret_freq);
 }
 EXPORT_SYMBOL(cpufreq_get);
@@ -1278,7 +1382,6 @@ EXPORT_SYMBOL(cpufreq_unregister_notifier);
  *********************************************************************/
 
 
-/* Must be called with lock_cpu_hotplug held */
 int __cpufreq_driver_target(struct cpufreq_policy *policy,
                            unsigned int target_freq,
                            unsigned int relation)
@@ -1304,20 +1407,19 @@ int cpufreq_driver_target(struct cpufreq_policy *policy,
        if (!policy)
                return -EINVAL;
 
-       lock_cpu_hotplug();
-       mutex_lock(&policy->lock);
+       if (unlikely(lock_policy_rwsem_write(policy->cpu)))
+               return -EINVAL;
 
        ret = __cpufreq_driver_target(policy, target_freq, relation);
 
-       mutex_unlock(&policy->lock);
-       unlock_cpu_hotplug();
+       unlock_policy_rwsem_write(policy->cpu);
 
        cpufreq_cpu_put(policy);
        return ret;
 }
 EXPORT_SYMBOL_GPL(cpufreq_driver_target);
 
-int cpufreq_driver_getavg(struct cpufreq_policy *policy)
+int __cpufreq_driver_getavg(struct cpufreq_policy *policy)
 {
        int ret = 0;
 
@@ -1325,20 +1427,15 @@ int cpufreq_driver_getavg(struct cpufreq_policy *policy)
        if (!policy)
                return -EINVAL;
 
-       mutex_lock(&policy->lock);
-
        if (cpu_online(policy->cpu) && cpufreq_driver->getavg)
                ret = cpufreq_driver->getavg(policy->cpu);
 
-       mutex_unlock(&policy->lock);
-
        cpufreq_cpu_put(policy);
        return ret;
 }
-EXPORT_SYMBOL_GPL(cpufreq_driver_getavg);
+EXPORT_SYMBOL_GPL(__cpufreq_driver_getavg);
 
 /*
- * Locking: Must be called with the lock_cpu_hotplug() lock held
  * when "event" is CPUFREQ_GOV_LIMITS
  */
 
@@ -1420,9 +1517,7 @@ int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu)
        if (!cpu_policy)
                return -EINVAL;
 
-       mutex_lock(&cpu_policy->lock);
        memcpy(policy, cpu_policy, sizeof(struct cpufreq_policy));
-       mutex_unlock(&cpu_policy->lock);
 
        cpufreq_cpu_put(cpu_policy);
        return 0;
@@ -1433,7 +1528,6 @@ EXPORT_SYMBOL(cpufreq_get_policy);
 /*
  * data   : current policy.
  * policy : policy to be set.
- * Locking: Must be called with the lock_cpu_hotplug() lock held
  */
 static int __cpufreq_set_policy(struct cpufreq_policy *data,
                                struct cpufreq_policy *policy)
@@ -1539,10 +1633,9 @@ int cpufreq_set_policy(struct cpufreq_policy *policy)
        if (!data)
                return -EINVAL;
 
-       lock_cpu_hotplug();
+       if (unlikely(lock_policy_rwsem_write(policy->cpu)))
+               return -EINVAL;
 
-       /* lock this CPU */
-       mutex_lock(&data->lock);
 
        ret = __cpufreq_set_policy(data, policy);
        data->user_policy.min = data->min;
@@ -1550,9 +1643,8 @@ int cpufreq_set_policy(struct cpufreq_policy *policy)
        data->user_policy.policy = data->policy;
        data->user_policy.governor = data->governor;
 
-       mutex_unlock(&data->lock);
+       unlock_policy_rwsem_write(policy->cpu);
 
-       unlock_cpu_hotplug();
        cpufreq_cpu_put(data);
 
        return ret;
@@ -1576,8 +1668,8 @@ int cpufreq_update_policy(unsigned int cpu)
        if (!data)
                return -ENODEV;
 
-       lock_cpu_hotplug();
-       mutex_lock(&data->lock);
+       if (unlikely(lock_policy_rwsem_write(cpu)))
+               return -EINVAL;
 
        dprintk("updating policy for CPU %u\n", cpu);
        memcpy(&policy, data, sizeof(struct cpufreq_policy));
@@ -1602,8 +1694,8 @@ int cpufreq_update_policy(unsigned int cpu)
 
        ret = __cpufreq_set_policy(data, &policy);
 
-       mutex_unlock(&data->lock);
-       unlock_cpu_hotplug();
+       unlock_policy_rwsem_write(cpu);
+
        cpufreq_cpu_put(data);
        return ret;
 }
@@ -1613,31 +1705,28 @@ static int cpufreq_cpu_callback(struct notifier_block *nfb,
                                        unsigned long action, void *hcpu)
 {
        unsigned int cpu = (unsigned long)hcpu;
-       struct cpufreq_policy *policy;
        struct sys_device *sys_dev;
+       struct cpufreq_policy *policy;
 
        sys_dev = get_cpu_sysdev(cpu);
-
        if (sys_dev) {
                switch (action) {
                case CPU_ONLINE:
                        cpufreq_add_dev(sys_dev);
                        break;
                case CPU_DOWN_PREPARE:
-                       /*
-                        * We attempt to put this cpu in lowest frequency
-                        * possible before going down. This will permit
-                        * hardware-managed P-State to switch other related
-                        * threads to min or higher speeds if possible.
-                        */
+                       if (unlikely(lock_policy_rwsem_write(cpu)))
+                               BUG();
+
                        policy = cpufreq_cpu_data[cpu];
                        if (policy) {
-                               cpufreq_driver_target(policy, policy->min,
+                               __cpufreq_driver_target(policy, policy->min,
                                                CPUFREQ_RELATION_H);
                        }
+                       __cpufreq_remove_dev(sys_dev);
                        break;
-               case CPU_DEAD:
-                       cpufreq_remove_dev(sys_dev);
+               case CPU_DOWN_FAILED:
+                       cpufreq_add_dev(sys_dev);
                        break;
                }
        }
@@ -1751,3 +1840,16 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver)
        return 0;
 }
 EXPORT_SYMBOL_GPL(cpufreq_unregister_driver);
+
+static int __init cpufreq_core_init(void)
+{
+       int cpu;
+
+       for_each_possible_cpu(cpu) {
+               per_cpu(policy_cpu, cpu) = -1;
+               init_rwsem(&per_cpu(cpu_policy_rwsem, cpu));
+       }
+       return 0;
+}
+
+core_initcall(cpufreq_core_init);
index eef0270c6f3ddf98b23b3495628a60894199ec10..26f440ccc3fb358e9525ecabee819ae52b7afa26 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/fs.h>
 #include <linux/sysfs.h>
 #include <linux/cpu.h>
-#include <linux/sched.h>
 #include <linux/kmod.h>
 #include <linux/workqueue.h>
 #include <linux/jiffies.h>
@@ -430,14 +429,12 @@ static void dbs_check_cpu(int cpu)
 static void do_dbs_timer(struct work_struct *work)
 { 
        int i;
-       lock_cpu_hotplug();
        mutex_lock(&dbs_mutex);
        for_each_online_cpu(i)
                dbs_check_cpu(i);
        schedule_delayed_work(&dbs_work, 
                        usecs_to_jiffies(dbs_tuners_ins.sampling_rate));
        mutex_unlock(&dbs_mutex);
-       unlock_cpu_hotplug();
 } 
 
 static inline void dbs_timer_init(void)
index f697449327c6fca54f856189801965861855f6a6..d60bcb9d14ccd811c72fee221ebf894e8c695efc 100644 (file)
@@ -52,19 +52,20 @@ static unsigned int def_sampling_rate;
 static void do_dbs_timer(struct work_struct *work);
 
 /* Sampling types */
-enum dbs_sample {DBS_NORMAL_SAMPLE, DBS_SUB_SAMPLE};
+enum {DBS_NORMAL_SAMPLE, DBS_SUB_SAMPLE};
 
 struct cpu_dbs_info_s {
        cputime64_t prev_cpu_idle;
        cputime64_t prev_cpu_wall;
        struct cpufreq_policy *cur_policy;
        struct delayed_work work;
-       enum dbs_sample sample_type;
-       unsigned int enable;
        struct cpufreq_frequency_table *freq_table;
        unsigned int freq_lo;
        unsigned int freq_lo_jiffies;
        unsigned int freq_hi_jiffies;
+       int cpu;
+       unsigned int enable:1,
+                    sample_type:1;
 };
 static DEFINE_PER_CPU(struct cpu_dbs_info_s, cpu_dbs_info);
 
@@ -402,7 +403,7 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
        if (load < (dbs_tuners_ins.up_threshold - 10)) {
                unsigned int freq_next, freq_cur;
 
-               freq_cur = cpufreq_driver_getavg(policy);
+               freq_cur = __cpufreq_driver_getavg(policy);
                if (!freq_cur)
                        freq_cur = policy->cur;
 
@@ -423,9 +424,11 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
 
 static void do_dbs_timer(struct work_struct *work)
 {
-       unsigned int cpu = smp_processor_id();
-       struct cpu_dbs_info_s *dbs_info = &per_cpu(cpu_dbs_info, cpu);
-       enum dbs_sample sample_type = dbs_info->sample_type;
+       struct cpu_dbs_info_s *dbs_info =
+               container_of(work, struct cpu_dbs_info_s, work.work);
+       unsigned int cpu = dbs_info->cpu;
+       int sample_type = dbs_info->sample_type;
+
        /* We want all CPUs to do sampling nearly on same jiffy */
        int delay = usecs_to_jiffies(dbs_tuners_ins.sampling_rate);
 
@@ -434,15 +437,19 @@ static void do_dbs_timer(struct work_struct *work)
 
        delay -= jiffies % delay;
 
-       if (!dbs_info->enable)
+       if (lock_policy_rwsem_write(cpu) < 0)
+               return;
+
+       if (!dbs_info->enable) {
+               unlock_policy_rwsem_write(cpu);
                return;
+       }
+
        /* Common NORMAL_SAMPLE setup */
        dbs_info->sample_type = DBS_NORMAL_SAMPLE;
        if (!dbs_tuners_ins.powersave_bias ||
            sample_type == DBS_NORMAL_SAMPLE) {
-               lock_cpu_hotplug();
                dbs_check_cpu(dbs_info);
-               unlock_cpu_hotplug();
                if (dbs_info->freq_lo) {
                        /* Setup timer for SUB_SAMPLE */
                        dbs_info->sample_type = DBS_SUB_SAMPLE;
@@ -454,26 +461,27 @@ static void do_dbs_timer(struct work_struct *work)
                                        CPUFREQ_RELATION_H);
        }
        queue_delayed_work_on(cpu, kondemand_wq, &dbs_info->work, delay);
+       unlock_policy_rwsem_write(cpu);
 }
 
-static inline void dbs_timer_init(unsigned int cpu)
+static inline void dbs_timer_init(struct cpu_dbs_info_s *dbs_info)
 {
-       struct cpu_dbs_info_s *dbs_info = &per_cpu(cpu_dbs_info, cpu);
        /* We want all CPUs to do sampling nearly on same jiffy */
        int delay = usecs_to_jiffies(dbs_tuners_ins.sampling_rate);
        delay -= jiffies % delay;
 
+       dbs_info->enable = 1;
        ondemand_powersave_bias_init();
-       INIT_DELAYED_WORK_NAR(&dbs_info->work, do_dbs_timer);
        dbs_info->sample_type = DBS_NORMAL_SAMPLE;
-       queue_delayed_work_on(cpu, kondemand_wq, &dbs_info->work, delay);
+       INIT_DELAYED_WORK_NAR(&dbs_info->work, do_dbs_timer);
+       queue_delayed_work_on(dbs_info->cpu, kondemand_wq, &dbs_info->work,
+                             delay);
 }
 
 static inline void dbs_timer_exit(struct cpu_dbs_info_s *dbs_info)
 {
        dbs_info->enable = 0;
        cancel_delayed_work(&dbs_info->work);
-       flush_workqueue(kondemand_wq);
 }
 
 static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
@@ -502,21 +510,9 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
 
                mutex_lock(&dbs_mutex);
                dbs_enable++;
-               if (dbs_enable == 1) {
-                       kondemand_wq = create_workqueue("kondemand");
-                       if (!kondemand_wq) {
-                               printk(KERN_ERR
-                                        "Creation of kondemand failed\n");
-                               dbs_enable--;
-                               mutex_unlock(&dbs_mutex);
-                               return -ENOSPC;
-                       }
-               }
 
                rc = sysfs_create_group(&policy->kobj, &dbs_attr_group);
                if (rc) {
-                       if (dbs_enable == 1)
-                               destroy_workqueue(kondemand_wq);
                        dbs_enable--;
                        mutex_unlock(&dbs_mutex);
                        return rc;
@@ -530,7 +526,7 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
                        j_dbs_info->prev_cpu_idle = get_cpu_idle_time(j);
                        j_dbs_info->prev_cpu_wall = get_jiffies_64();
                }
-               this_dbs_info->enable = 1;
+               this_dbs_info->cpu = cpu;
                /*
                 * Start the timerschedule work, when this governor
                 * is used for first time
@@ -550,7 +546,7 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
 
                        dbs_tuners_ins.sampling_rate = def_sampling_rate;
                }
-               dbs_timer_init(policy->cpu);
+               dbs_timer_init(this_dbs_info);
 
                mutex_unlock(&dbs_mutex);
                break;
@@ -560,9 +556,6 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
                dbs_timer_exit(this_dbs_info);
                sysfs_remove_group(&policy->kobj, &dbs_attr_group);
                dbs_enable--;
-               if (dbs_enable == 0)
-                       destroy_workqueue(kondemand_wq);
-
                mutex_unlock(&dbs_mutex);
 
                break;
@@ -591,12 +584,18 @@ static struct cpufreq_governor cpufreq_gov_dbs = {
 
 static int __init cpufreq_gov_dbs_init(void)
 {
+       kondemand_wq = create_workqueue("kondemand");
+       if (!kondemand_wq) {
+               printk(KERN_ERR "Creation of kondemand failed\n");
+               return -EFAULT;
+       }
        return cpufreq_register_governor(&cpufreq_gov_dbs);
 }
 
 static void __exit cpufreq_gov_dbs_exit(void)
 {
        cpufreq_unregister_governor(&cpufreq_gov_dbs);
+       destroy_workqueue(kondemand_wq);
 }
 
 
@@ -608,3 +607,4 @@ MODULE_LICENSE("GPL");
 
 module_init(cpufreq_gov_dbs_init);
 module_exit(cpufreq_gov_dbs_exit);
+
index 91ad342a6051f19e64f5e00478cf2a5f8ab7e9a7..d1c7cac9316cc4e7729f8445c9ba8ebc07d858b7 100644 (file)
@@ -370,12 +370,10 @@ __exit cpufreq_stats_exit(void)
        cpufreq_unregister_notifier(&notifier_trans_block,
                        CPUFREQ_TRANSITION_NOTIFIER);
        unregister_hotcpu_notifier(&cpufreq_stat_cpu_notifier);
-       lock_cpu_hotplug();
        for_each_online_cpu(cpu) {
                cpufreq_stat_cpu_callback(&cpufreq_stat_cpu_notifier,
                                                CPU_DEAD, (void *)(long)cpu);
        }
-       unlock_cpu_hotplug();
 }
 
 MODULE_AUTHOR ("Zou Nan hai <nanhai.zou@intel.com>");
index 2a4eb0bfaf30d2cd6698a2c72d9e67468e6d08b5..860345c7799ab1188c21945756ec6e696019b10e 100644 (file)
@@ -71,7 +71,6 @@ static int cpufreq_set(unsigned int freq, struct cpufreq_policy *policy)
 
        dprintk("cpufreq_set for cpu %u, freq %u kHz\n", policy->cpu, freq);
 
-       lock_cpu_hotplug();
        mutex_lock(&userspace_mutex);
        if (!cpu_is_managed[policy->cpu])
                goto err;
@@ -94,7 +93,6 @@ static int cpufreq_set(unsigned int freq, struct cpufreq_policy *policy)
 
  err:
        mutex_unlock(&userspace_mutex);
-       unlock_cpu_hotplug();
        return ret;
 }
 
index 31ea405f2eeb5fbe8d8fdb94b0f785f58729208f..0eb62841e9b0bd6f207bdb0c159709318919bff4 100644 (file)
@@ -8,7 +8,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/pci.h>
 #include <linux/pci_ids.h>
 #include <linux/crypto.h>
index c82bc0ed7f143113fcea830717b60f388a46b3dd..8bcc887692ab24e85665d2191e7a6371b489abd8 100644 (file)
@@ -285,8 +285,9 @@ static void do_process_ce(struct mem_ctl_info *mci, u16 error_one,
        if (!pvt->map_type)
                row = 7 - row;
 
-       edac_mc_handle_ce(mci, page, 0, sec1_syndrome, row, channel,
-               "e752x CE");
+       /* e752x mc reads 34:6 of the DRAM linear address */
+       edac_mc_handle_ce(mci, page, offset_in_page(sec1_add << 4),
+                       sec1_syndrome, row, channel, "e752x CE");
 }
 
 static inline void process_ce(struct mem_ctl_info *mci, u16 error_one,
@@ -319,8 +320,10 @@ static void do_process_ue(struct mem_ctl_info *mci, u16 error_one,
                        ((block_page >> 1) & 3) :
                        edac_mc_find_csrow_by_page(mci, block_page);
 
-               edac_mc_handle_ue(mci, block_page, 0, row,
-                       "e752x UE from Read");
+               /* e752x mc reads 34:6 of the DRAM linear address */
+               edac_mc_handle_ue(mci, block_page,
+                                       offset_in_page(error_2b << 4),
+                                       row, "e752x UE from Read");
        }
        if (error_one & 0x0404) {
                error_2b = scrb_add;
@@ -333,8 +336,10 @@ static void do_process_ue(struct mem_ctl_info *mci, u16 error_one,
                        ((block_page >> 1) & 3) :
                        edac_mc_find_csrow_by_page(mci, block_page);
 
-               edac_mc_handle_ue(mci, block_page, 0, row,
-                               "e752x UE from Scruber");
+               /* e752x mc reads 34:6 of the DRAM linear address */
+               edac_mc_handle_ue(mci, block_page,
+                                       offset_in_page(error_2b << 4),
+                                       row, "e752x UE from Scruber");
        }
 }
 
@@ -556,17 +561,17 @@ static void e752x_check_sysbus(struct e752x_error_info *info,
        error32 = (stat32 >> 16) & 0x3ff;
        stat32 = stat32 & 0x3ff;
 
-       if(stat32 & 0x083)
-               sysbus_error(1, stat32 & 0x083, error_found, handle_error);
+       if(stat32 & 0x087)
+               sysbus_error(1, stat32 & 0x087, error_found, handle_error);
 
-       if(stat32 & 0x37c)
-               sysbus_error(0, stat32 & 0x37c, error_found, handle_error);
+       if(stat32 & 0x378)
+               sysbus_error(0, stat32 & 0x378, error_found, handle_error);
 
-       if(error32 & 0x083)
-               sysbus_error(1, error32 & 0x083, error_found, handle_error);
+       if(error32 & 0x087)
+               sysbus_error(1, error32 & 0x087, error_found, handle_error);
 
-       if(error32 & 0x37c)
-               sysbus_error(0, error32 & 0x37c, error_found, handle_error);
+       if(error32 & 0x378)
+               sysbus_error(0, error32 & 0x378, error_found, handle_error);
 }
 
 static void e752x_check_membuf (struct e752x_error_info *info,
@@ -782,7 +787,12 @@ static void e752x_init_csrows(struct mem_ctl_info *mci, struct pci_dev *pdev,
        u8 value;
        u32 dra, drc, cumul_size;
 
-       pci_read_config_dword(pdev, E752X_DRA, &dra);
+       dra = 0;
+       for (index=0; index < 4; index++) {
+               u8 dra_reg;
+               pci_read_config_byte(pdev, E752X_DRA+index, &dra_reg);
+               dra |= dra_reg << (index * 8);
+       }
        pci_read_config_dword(pdev, E752X_DRC, &drc);
        drc_chan = dual_channel_active(ddrcsr);
        drc_drbg = drc_chan + 1;  /* 128 in dual mode, 64 in single */
index 1b4fc922180386cd4107ec42f4328b4f50584be4..7b622300d0e58f2c4ef43fe4e6d99022688f2600 100644 (file)
@@ -927,6 +927,57 @@ static ssize_t mci_reset_counters_store(struct mem_ctl_info *mci,
        return count;
 }
 
+/* memory scrubbing */
+static ssize_t mci_sdram_scrub_rate_store(struct mem_ctl_info *mci,
+                                       const char *data, size_t count)
+{
+       u32 bandwidth = -1;
+
+       if (mci->set_sdram_scrub_rate) {
+
+               memctrl_int_store(&bandwidth, data, count);
+
+               if (!(*mci->set_sdram_scrub_rate)(mci, &bandwidth)) {
+                       edac_printk(KERN_DEBUG, EDAC_MC,
+                               "Scrub rate set successfully, applied: %d\n",
+                               bandwidth);
+               } else {
+                       /* FIXME: error codes maybe? */
+                       edac_printk(KERN_DEBUG, EDAC_MC,
+                               "Scrub rate set FAILED, could not apply: %d\n",
+                               bandwidth);
+               }
+       } else {
+               /* FIXME: produce "not implemented" ERROR for user-side. */
+               edac_printk(KERN_WARNING, EDAC_MC,
+                       "Memory scrubbing 'set'control is not implemented!\n");
+       }
+       return count;
+}
+
+static ssize_t mci_sdram_scrub_rate_show(struct mem_ctl_info *mci, char *data)
+{
+       u32 bandwidth = -1;
+
+       if (mci->get_sdram_scrub_rate) {
+               if (!(*mci->get_sdram_scrub_rate)(mci, &bandwidth)) {
+                       edac_printk(KERN_DEBUG, EDAC_MC,
+                               "Scrub rate successfully, fetched: %d\n",
+                               bandwidth);
+               } else {
+                       /* FIXME: error codes maybe? */
+                       edac_printk(KERN_DEBUG, EDAC_MC,
+                               "Scrub rate fetch FAILED, got: %d\n",
+                               bandwidth);
+               }
+       } else {
+               /* FIXME: produce "not implemented" ERROR for user-side.  */
+               edac_printk(KERN_WARNING, EDAC_MC,
+                       "Memory scrubbing 'get' control is not implemented!\n");
+       }
+       return sprintf(data, "%d\n", bandwidth);
+}
+
 /* default attribute files for the MCI object */
 static ssize_t mci_ue_count_show(struct mem_ctl_info *mci, char *data)
 {
@@ -1033,6 +1084,9 @@ MCIDEV_ATTR(ce_noinfo_count,S_IRUGO,mci_ce_noinfo_show,NULL);
 MCIDEV_ATTR(ue_count,S_IRUGO,mci_ue_count_show,NULL);
 MCIDEV_ATTR(ce_count,S_IRUGO,mci_ce_count_show,NULL);
 
+/* memory scrubber attribute file */
+MCIDEV_ATTR(sdram_scrub_rate,S_IRUGO|S_IWUSR,mci_sdram_scrub_rate_show,mci_sdram_scrub_rate_store);
+
 static struct mcidev_attribute *mci_attr[] = {
        &mci_attr_reset_counters,
        &mci_attr_mc_name,
@@ -1042,6 +1096,7 @@ static struct mcidev_attribute *mci_attr[] = {
        &mci_attr_ce_noinfo_count,
        &mci_attr_ue_count,
        &mci_attr_ce_count,
+       &mci_attr_sdram_scrub_rate,
        NULL
 };
 
@@ -1442,11 +1497,11 @@ int edac_mc_add_mc(struct mem_ctl_info *mci, int mc_idx)
        /* set load time so that error rate can be tracked */
        mci->start_time = jiffies;
 
-        if (edac_create_sysfs_mci_device(mci)) {
-                edac_mc_printk(mci, KERN_WARNING,
+       if (edac_create_sysfs_mci_device(mci)) {
+               edac_mc_printk(mci, KERN_WARNING,
                        "failed to create sysfs device\n");
-                goto fail1;
-        }
+               goto fail1;
+       }
 
        /* Report action taken */
        edac_mc_printk(mci, KERN_INFO, "Giving out device to %s %s: DEV %s\n",
@@ -1703,6 +1758,116 @@ void edac_mc_handle_ue_no_info(struct mem_ctl_info *mci, const char *msg)
 EXPORT_SYMBOL_GPL(edac_mc_handle_ue_no_info);
 
 
+/*************************************************************
+ * On Fully Buffered DIMM modules, this help function is
+ * called to process UE events
+ */
+void edac_mc_handle_fbd_ue(struct mem_ctl_info *mci,
+                               unsigned int csrow,
+                               unsigned int channela,
+                               unsigned int channelb,
+                               char *msg)
+{
+       int len = EDAC_MC_LABEL_LEN * 4;
+       char labels[len + 1];
+       char *pos = labels;
+       int chars;
+
+       if (csrow >= mci->nr_csrows) {
+               /* something is wrong */
+               edac_mc_printk(mci, KERN_ERR,
+                       "INTERNAL ERROR: row out of range (%d >= %d)\n",
+                       csrow, mci->nr_csrows);
+               edac_mc_handle_ue_no_info(mci, "INTERNAL ERROR");
+               return;
+       }
+
+       if (channela >= mci->csrows[csrow].nr_channels) {
+               /* something is wrong */
+               edac_mc_printk(mci, KERN_ERR,
+                       "INTERNAL ERROR: channel-a out of range "
+                       "(%d >= %d)\n",
+                       channela, mci->csrows[csrow].nr_channels);
+               edac_mc_handle_ue_no_info(mci, "INTERNAL ERROR");
+               return;
+       }
+
+       if (channelb >= mci->csrows[csrow].nr_channels) {
+               /* something is wrong */
+               edac_mc_printk(mci, KERN_ERR,
+                       "INTERNAL ERROR: channel-b out of range "
+                       "(%d >= %d)\n",
+                       channelb, mci->csrows[csrow].nr_channels);
+               edac_mc_handle_ue_no_info(mci, "INTERNAL ERROR");
+               return;
+       }
+
+       mci->ue_count++;
+       mci->csrows[csrow].ue_count++;
+
+       /* Generate the DIMM labels from the specified channels */
+       chars = snprintf(pos, len + 1, "%s",
+                        mci->csrows[csrow].channels[channela].label);
+       len -= chars; pos += chars;
+       chars = snprintf(pos, len + 1, "-%s",
+                        mci->csrows[csrow].channels[channelb].label);
+
+       if (log_ue)
+               edac_mc_printk(mci, KERN_EMERG,
+                       "UE row %d, channel-a= %d channel-b= %d "
+                       "labels \"%s\": %s\n", csrow, channela, channelb,
+                       labels, msg);
+
+       if (panic_on_ue)
+               panic("UE row %d, channel-a= %d channel-b= %d "
+                               "labels \"%s\": %s\n", csrow, channela,
+                               channelb, labels, msg);
+}
+EXPORT_SYMBOL(edac_mc_handle_fbd_ue);
+
+/*************************************************************
+ * On Fully Buffered DIMM modules, this help function is
+ * called to process CE events
+ */
+void edac_mc_handle_fbd_ce(struct mem_ctl_info *mci,
+                          unsigned int csrow,
+                          unsigned int channel,
+                          char *msg)
+{
+
+       /* Ensure boundary values */
+       if (csrow >= mci->nr_csrows) {
+               /* something is wrong */
+               edac_mc_printk(mci, KERN_ERR,
+                       "INTERNAL ERROR: row out of range (%d >= %d)\n",
+                       csrow, mci->nr_csrows);
+               edac_mc_handle_ce_no_info(mci, "INTERNAL ERROR");
+               return;
+       }
+       if (channel >= mci->csrows[csrow].nr_channels) {
+               /* something is wrong */
+               edac_mc_printk(mci, KERN_ERR,
+                       "INTERNAL ERROR: channel out of range (%d >= %d)\n",
+                       channel, mci->csrows[csrow].nr_channels);
+               edac_mc_handle_ce_no_info(mci, "INTERNAL ERROR");
+               return;
+       }
+
+       if (log_ce)
+               /* FIXME - put in DIMM location */
+               edac_mc_printk(mci, KERN_WARNING,
+                       "CE row %d, channel %d, label \"%s\": %s\n",
+                       csrow, channel,
+                       mci->csrows[csrow].channels[channel].label,
+                       msg);
+
+       mci->ce_count++;
+       mci->csrows[csrow].ce_count++;
+       mci->csrows[csrow].channels[channel].ce_count++;
+}
+EXPORT_SYMBOL(edac_mc_handle_fbd_ce);
+
+
 /*
  * Iterate over all MC instances and check for ECC, et al, errors
  */
@@ -1806,7 +1971,7 @@ static void __exit edac_mc_exit(void)
        debugf0("%s()\n", __func__);
        kthread_stop(edac_thread);
 
-        /* tear down the sysfs device */
+       /* tear down the sysfs device */
        edac_sysfs_memctrl_teardown();
        edac_sysfs_pci_teardown();
 }
index a1cfd4e3c97df8e3454112bda619446b69623b9a..713444cc41053fae35bcbac5c9e48bf0e22ee499 100644 (file)
@@ -123,7 +123,9 @@ enum mem_type {
        MEM_RDR,                /* Registered single data rate SDRAM */
        MEM_DDR,                /* Double data rate SDRAM */
        MEM_RDDR,               /* Registered Double data rate SDRAM */
-       MEM_RMBS                /* Rambus DRAM */
+       MEM_RMBS,               /* Rambus DRAM */
+       MEM_DDR2,               /* DDR2 RAM */
+       MEM_FB_DDR2,            /* fully buffered DDR2 */
 };
 
 #define MEM_FLAG_EMPTY         BIT(MEM_EMPTY)
@@ -137,6 +139,8 @@ enum mem_type {
 #define MEM_FLAG_DDR           BIT(MEM_DDR)
 #define MEM_FLAG_RDDR          BIT(MEM_RDDR)
 #define MEM_FLAG_RMBS          BIT(MEM_RMBS)
+#define MEM_FLAG_DDR2           BIT(MEM_DDR2)
+#define MEM_FLAG_FB_DDR2        BIT(MEM_FB_DDR2)
 
 /* chipset Error Detection and Correction capabilities and mode */
 enum edac_type {
@@ -315,8 +319,21 @@ struct mem_ctl_info {
        unsigned long scrub_cap;        /* chipset scrub capabilities */
        enum scrub_type scrub_mode;     /* current scrub mode */
 
+       /* Translates sdram memory scrub rate given in bytes/sec to the
+          internal representation and configures whatever else needs
+          to be configured.
+       */
+       int (*set_sdram_scrub_rate) (struct mem_ctl_info *mci, u32 *bw);
+
+       /* Get the current sdram memory scrub rate from the internal
+          representation and converts it to the closest matching
+          bandwith in bytes/sec.
+       */
+       int (*get_sdram_scrub_rate) (struct mem_ctl_info *mci, u32 *bw);
+
        /* pointer to edac checking routine */
        void (*edac_check) (struct mem_ctl_info * mci);
+
        /*
         * Remaps memory pages: controller pages to physical pages.
         * For most MC's, this will be NULL.
@@ -441,6 +458,15 @@ extern void edac_mc_handle_ue(struct mem_ctl_info *mci,
                int row, const char *msg);
 extern void edac_mc_handle_ue_no_info(struct mem_ctl_info *mci,
                const char *msg);
+extern void edac_mc_handle_fbd_ue(struct mem_ctl_info *mci,
+               unsigned int csrow,
+               unsigned int channel0,
+               unsigned int channel1,
+               char *msg);
+extern void edac_mc_handle_fbd_ce(struct mem_ctl_info *mci,
+               unsigned int csrow,
+               unsigned int channel,
+               char *msg);
 
 /*
  * This kmalloc's and initializes all the structures.
index 8700a8076d0482df55c2cd8e379d603e7873e918..bd3918ddf7ac00619046d5d0550428a801f41392 100644 (file)
@@ -6,7 +6,6 @@
 
 #ifdef CONFIG_MODULES
 
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
index b09dfc78e5a2b10d34965ede7329ed7a8a311652..d517734462e6c3cf9bcd23e67d93db029054a4bc 100644 (file)
@@ -22,7 +22,6 @@ static char *version =
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/fcntl.h>
 #include <linux/interrupt.h>
index a6b1ae256e16b4006373233bb18afdce83d09d98..c903ebfab526e6416bbb915654fcc3f391a4575f 100644 (file)
@@ -17,7 +17,6 @@ static char *version =
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/fcntl.h>
 #include <linux/interrupt.h>
index 5c261e1f92b271e17094b05242c93959503dbad4..d8806e4f182984c841603d8d3d365c77d98c6cec 100644 (file)
@@ -233,6 +233,8 @@ edd_show_interface(struct edd_device *edev, char *buf)
 
 /**
  * edd_show_raw_data() - copies raw data to buffer for userspace to parse
+ * @edev: target edd_device
+ * @buf: output buffer
  *
  * Returns: number of bytes written, or -EINVAL on failure
  */
@@ -634,8 +636,8 @@ static decl_subsys(edd,&ktype_edd,NULL);
 
 /**
  * edd_dev_is_type() - is this EDD device a 'type' device?
- * @edev
- * @type - a host bus or interface identifier string per the EDD spec
+ * @edev: target edd_device
+ * @type: a host bus or interface identifier string per the EDD spec
  *
  * Returns 1 (TRUE) if it is a 'type' device, 0 otherwise.
  */
@@ -657,7 +659,7 @@ edd_dev_is_type(struct edd_device *edev, const char *type)
 
 /**
  * edd_get_pci_dev() - finds pci_dev that matches edev
- * @edev - edd_device
+ * @edev: edd_device
  *
  * Returns pci_dev if found, or NULL
  */
index 8c7d48eff7b7a6339db159b901987e5ca12c3815..7452399501b42a0fe006eb5d438126e4ec966933 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/list.h>
 #include <linux/mm.h>
 #include <linux/smp_lock.h>
index 93f93d4fb8aec2126e86131e9077703c4e1e171d..a6a4aa0eee166d3ac029d2e7c49c8a4c714fe2bf 100644 (file)
@@ -727,7 +727,6 @@ int vt8231_detect(struct i2c_adapter *adapter)
        client->addr = isa_address;
        client->adapter = adapter;
        client->driver = &vt8231_driver;
-       client->dev.parent = &adapter->dev;
 
        /* Fill in the remaining client fields and put into the global list */
        strlcpy(client->name, "vt8231", I2C_NAME_SIZE);
index 9367c4cfe936f533f9500cd10f73a2b293dfd538..4d44a2db29ddca1bb0964100d995091b37f26b91 100644 (file)
@@ -183,6 +183,7 @@ config I2C_PIIX4
            ATI IXP200
            ATI IXP300
            ATI IXP400
+           ATI SB600
            Serverworks OSB4
            Serverworks CSB5
            Serverworks CSB6
@@ -341,6 +342,13 @@ config I2C_PARPORT_LIGHT
          This support is also available as a module.  If so, the module 
          will be called i2c-parport-light.
 
+config I2C_PASEMI
+       tristate "PA Semi SMBus interface"
+#      depends on PPC_PASEMI && I2C && PCI
+       depends on I2C && PCI
+       help
+         Supports the PA Semi PWRficient on-chip SMBus interfaces.
+
 config I2C_PROSAVAGE
        tristate "S3/VIA (Pro)Savage"
        depends on I2C && PCI
@@ -499,11 +507,11 @@ config I2C_VIA
          will be called i2c-via.
 
 config I2C_VIAPRO
-       tristate "VIA 82C596/82C686/82xx"
+       tristate "VIA VT82C596/82C686/82xx and CX700"
        depends on I2C && PCI
        help
          If you say yes to this option, support will be included for the VIA
-         82C596/82C686/82xx I2C interfaces.  Specifically, the following
+         VT82C596 and later SMBus interface.  Specifically, the following
          chipsets are supported:
            VT82C596A/B
            VT82C686A/B
@@ -512,6 +520,7 @@ config I2C_VIAPRO
            VT8235
            VT8237R/A
            VT8251
+           CX700
 
          This driver can also be built as a module.  If so, the module
          will be called i2c-viapro.
index 37196c1d0794e830b34b7c16f41ea68774a38940..03505aa44bbf0a8590dbb71f2e78584c3660a992 100644 (file)
@@ -27,6 +27,7 @@ obj-$(CONFIG_I2C_OCORES)      += i2c-ocores.o
 obj-$(CONFIG_I2C_OMAP)         += i2c-omap.o
 obj-$(CONFIG_I2C_PARPORT)      += i2c-parport.o
 obj-$(CONFIG_I2C_PARPORT_LIGHT)        += i2c-parport-light.o
+obj-$(CONFIG_I2C_PASEMI)       += i2c-pasemi.o
 obj-$(CONFIG_I2C_PCA_ISA)      += i2c-pca-isa.o
 obj-$(CONFIG_I2C_PIIX4)                += i2c-piix4.o
 obj-$(CONFIG_I2C_PNX)          += i2c-pnx.o
index e75d339a3481e9dcd03acb7dda20d14ba73352ae..6fd8ad7faa0637e57a3b7c1b4440bfb086827404 100644 (file)
@@ -57,7 +57,6 @@
 #include <linux/pci.h>
 #include <linux/kernel.h>
 #include <linux/stddef.h>
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/ioport.h>
 #include <linux/i2c.h>
@@ -475,6 +474,7 @@ static const struct i2c_algorithm smbus_algorithm = {
 
 static struct i2c_adapter ali1535_adapter = {
        .owner          = THIS_MODULE,
+       .id             = I2C_HW_SMBUS_ALI1535,
        .class          = I2C_CLASS_HWMON,
        .algo           = &smbus_algorithm,
 };
index 8e1e3f8e40a41faff644d63072271edf409dba25..6b68074e518a072d1239c1e1f8ba61287cc4b456 100644 (file)
@@ -314,35 +314,11 @@ static u32 ali1563_func(struct i2c_adapter * a)
 }
 
 
-static void ali1563_enable(struct pci_dev * dev)
-{
-       u16 ctrl;
-
-       pci_read_config_word(dev,ALI1563_SMBBA,&ctrl);
-       ctrl |= 0x7;
-       pci_write_config_word(dev,ALI1563_SMBBA,ctrl);
-}
-
 static int __devinit ali1563_setup(struct pci_dev * dev)
 {
        u16 ctrl;
 
        pci_read_config_word(dev,ALI1563_SMBBA,&ctrl);
-       printk("ali1563: SMBus control = %04x\n",ctrl);
-
-       /* Check if device is even enabled first */
-       if (!(ctrl & ALI1563_SMB_IOEN)) {
-               dev_warn(&dev->dev,"I/O space not enabled, trying manually\n");
-               ali1563_enable(dev);
-       }
-       if (!(ctrl & ALI1563_SMB_IOEN)) {
-               dev_warn(&dev->dev,"I/O space still not enabled, giving up\n");
-               goto Err;
-       }
-       if (!(ctrl & ALI1563_SMB_HOSTEN)) {
-               dev_warn(&dev->dev,"Host Controller not enabled\n");
-               goto Err;
-       }
 
        /* SMB I/O Base in high 12 bits and must be aligned with the
         * size of the I/O space. */
@@ -351,11 +327,31 @@ static int __devinit ali1563_setup(struct pci_dev * dev)
                dev_warn(&dev->dev,"ali1563_smba Uninitialized\n");
                goto Err;
        }
+
+       /* Check if device is enabled */
+       if (!(ctrl & ALI1563_SMB_HOSTEN)) {
+               dev_warn(&dev->dev, "Host Controller not enabled\n");
+               goto Err;
+       }
+       if (!(ctrl & ALI1563_SMB_IOEN)) {
+               dev_warn(&dev->dev, "I/O space not enabled, trying manually\n");
+               pci_write_config_word(dev, ALI1563_SMBBA,
+                                     ctrl | ALI1563_SMB_IOEN);
+               pci_read_config_word(dev, ALI1563_SMBBA, &ctrl);
+               if (!(ctrl & ALI1563_SMB_IOEN)) {
+                       dev_err(&dev->dev, "I/O space still not enabled, "
+                               "giving up\n");
+                       goto Err;
+               }
+       }
+
        if (!request_region(ali1563_smba, ALI1563_SMB_IOSIZE,
                            ali1563_pci_driver.name)) {
-               dev_warn(&dev->dev,"Could not allocate I/O space");
+               dev_err(&dev->dev, "Could not allocate I/O space at 0x%04x\n",
+                       ali1563_smba);
                goto Err;
        }
+       dev_info(&dev->dev, "Found ALi1563 SMBus at 0x%04x\n", ali1563_smba);
 
        return 0;
 Err:
@@ -374,6 +370,7 @@ static const struct i2c_algorithm ali1563_algorithm = {
 
 static struct i2c_adapter ali1563_adapter = {
        .owner  = THIS_MODULE,
+       .id     = I2C_HW_SMBUS_ALI1563,
        .class  = I2C_CLASS_HWMON,
        .algo   = &ali1563_algorithm,
 };
@@ -384,13 +381,18 @@ static int __devinit ali1563_probe(struct pci_dev * dev,
        int error;
 
        if ((error = ali1563_setup(dev)))
-               return error;
+               goto exit;
        ali1563_adapter.dev.parent = &dev->dev;
        sprintf(ali1563_adapter.name,"SMBus ALi 1563 Adapter @ %04x",
                ali1563_smba);
        if ((error = i2c_add_adapter(&ali1563_adapter)))
-               ali1563_shutdown(dev);
-       printk("%s: Returning %d\n",__FUNCTION__,error);
+               goto exit_shutdown;
+       return 0;
+
+exit_shutdown:
+       ali1563_shutdown(dev);
+exit:
+       dev_warn(&dev->dev, "ALi1563 SMBus probe failed (%d)\n", error);
        return error;
 }
 
index 3f11b6e1a3418c5bc5dad86681b7eae67c429af7..e4e0df10681211cffd39a720f8d6c1000b65be72 100644 (file)
@@ -64,7 +64,6 @@
 #include <linux/pci.h>
 #include <linux/kernel.h>
 #include <linux/stddef.h>
-#include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
 #include <linux/i2c.h>
@@ -470,6 +469,7 @@ static const struct i2c_algorithm smbus_algorithm = {
 
 static struct i2c_adapter ali15x3_adapter = {
        .owner          = THIS_MODULE,
+       .id             = I2C_HW_SMBUS_ALI15X3,
        .class          = I2C_CLASS_HWMON,
        .algo           = &smbus_algorithm,
 };
index 08e915730caf94505e44bd27845c193c50dd394f..e5e96c8175660b15f006d9517a2866248e5a4a62 100644 (file)
@@ -184,12 +184,14 @@ static int __init amd756_s4882_init(void)
        s4882_algo[0].smbus_xfer = amd756_access_virt0;
        s4882_adapter[0] = amd756_smbus;
        s4882_adapter[0].algo = s4882_algo;
+       s4882_adapter[0].dev.parent = amd756_smbus.dev.parent;
        for (i = 1; i < 5; i++) {
                s4882_algo[i] = *(amd756_smbus.algo);
                s4882_adapter[i] = amd756_smbus;
                sprintf(s4882_adapter[i].name,
                        "SMBus 8111 adapter (CPU%d)", i-1);
                s4882_adapter[i].algo = s4882_algo+i;
+               s4882_adapter[i].dev.parent = amd756_smbus.dev.parent;
        }
        s4882_algo[1].smbus_xfer = amd756_access_virt1;
        s4882_algo[2].smbus_xfer = amd756_access_virt2;
index 2d21afdc5b1cc7f3961c3e4f480de0444ec4292f..fa6155a54cc36a74680b8ef629e9ae78ece17c5c 100644 (file)
@@ -42,7 +42,6 @@
 #include <linux/kernel.h>
 #include <linux/delay.h>
 #include <linux/stddef.h>
-#include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/i2c.h>
 #include <linux/init.h>
@@ -301,6 +300,7 @@ static const struct i2c_algorithm smbus_algorithm = {
 
 struct i2c_adapter amd756_smbus = {
        .owner          = THIS_MODULE,
+       .id             = I2C_HW_SMBUS_AMD756,
        .class          = I2C_CLASS_HWMON,
        .algo           = &smbus_algorithm,
 };
index 0fbc7186c91ab63f8ac8f6b32365db3a850efc6f..5bba3fb50d711e8d31ceb1938ad4965a33a41c73 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/pci.h>
 #include <linux/kernel.h>
 #include <linux/stddef.h>
-#include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
 #include <linux/i2c.h>
@@ -76,7 +75,8 @@ static unsigned int amd_ec_wait_write(struct amd_smbus *smbus)
                udelay(1);
 
        if (!timeout) {
-               dev_warn(&smbus->dev->dev, "Timeout while waiting for IBF to clear\n");
+               dev_warn(&smbus->dev->dev,
+                        "Timeout while waiting for IBF to clear\n");
                return -1;
        }
 
@@ -91,14 +91,16 @@ static unsigned int amd_ec_wait_read(struct amd_smbus *smbus)
                udelay(1);
 
        if (!timeout) {
-               dev_warn(&smbus->dev->dev, "Timeout while waiting for OBF to set\n");
+               dev_warn(&smbus->dev->dev,
+                        "Timeout while waiting for OBF to set\n");
                return -1;
        }
 
        return 0;
 }
 
-static unsigned int amd_ec_read(struct amd_smbus *smbus, unsigned char address, unsigned char *data)
+static unsigned int amd_ec_read(struct amd_smbus *smbus, unsigned char address,
+               unsigned char *data)
 {
        if (amd_ec_wait_write(smbus))
                return -1;
@@ -115,7 +117,8 @@ static unsigned int amd_ec_read(struct amd_smbus *smbus, unsigned char address,
        return 0;
 }
 
-static unsigned int amd_ec_write(struct amd_smbus *smbus, unsigned char address, unsigned char data)
+static unsigned int amd_ec_write(struct amd_smbus *smbus, unsigned char address,
+               unsigned char data)
 {
        if (amd_ec_wait_write(smbus))
                return -1;
@@ -175,18 +178,19 @@ static unsigned int amd_ec_write(struct amd_smbus *smbus, unsigned char address,
 #define AMD_SMB_PRTCL_PEC              0x80
 
 
-static s32 amd8111_access(struct i2c_adapter * adap, u16 addr, unsigned short flags,
-               char read_write, u8 command, int size, union i2c_smbus_data * data)
+static s32 amd8111_access(struct i2c_adapter * adap, u16 addr,
+               unsigned short flags, char read_write, u8 command, int size,
+               union i2c_smbus_data * data)
 {
        struct amd_smbus *smbus = adap->algo_data;
        unsigned char protocol, len, pec, temp[2];
        int i;
 
-       protocol = (read_write == I2C_SMBUS_READ) ? AMD_SMB_PRTCL_READ : AMD_SMB_PRTCL_WRITE;
+       protocol = (read_write == I2C_SMBUS_READ) ? AMD_SMB_PRTCL_READ
+                                                 : AMD_SMB_PRTCL_WRITE;
        pec = (flags & I2C_CLIENT_PEC) ? AMD_SMB_PRTCL_PEC : 0;
 
        switch (size) {
-
                case I2C_SMBUS_QUICK:
                        protocol |= AMD_SMB_PRTCL_QUICK;
                        read_write = I2C_SMBUS_WRITE;
@@ -208,8 +212,10 @@ static s32 amd8111_access(struct i2c_adapter * adap, u16 addr, unsigned short fl
                case I2C_SMBUS_WORD_DATA:
                        amd_ec_write(smbus, AMD_SMB_CMD, command);
                        if (read_write == I2C_SMBUS_WRITE) {
-                               amd_ec_write(smbus, AMD_SMB_DATA, data->word);
-                               amd_ec_write(smbus, AMD_SMB_DATA + 1, data->word >> 8);
+                               amd_ec_write(smbus, AMD_SMB_DATA,
+                                            data->word & 0xff);
+                               amd_ec_write(smbus, AMD_SMB_DATA + 1,
+                                            data->word >> 8);
                        }
                        protocol |= AMD_SMB_PRTCL_WORD_DATA | pec;
                        break;
@@ -217,27 +223,31 @@ static s32 amd8111_access(struct i2c_adapter * adap, u16 addr, unsigned short fl
                case I2C_SMBUS_BLOCK_DATA:
                        amd_ec_write(smbus, AMD_SMB_CMD, command);
                        if (read_write == I2C_SMBUS_WRITE) {
-                               len = min_t(u8, data->block[0], 32);
+                               len = min_t(u8, data->block[0],
+                                           I2C_SMBUS_BLOCK_MAX);
                                amd_ec_write(smbus, AMD_SMB_BCNT, len);
                                for (i = 0; i < len; i++)
-                                       amd_ec_write(smbus, AMD_SMB_DATA + i, data->block[i + 1]);
+                                       amd_ec_write(smbus, AMD_SMB_DATA + i,
+                                                    data->block[i + 1]);
                        }
                        protocol |= AMD_SMB_PRTCL_BLOCK_DATA | pec;
                        break;
 
                case I2C_SMBUS_I2C_BLOCK_DATA:
-                       len = min_t(u8, data->block[0], 32);
+                       len = min_t(u8, data->block[0],
+                                   I2C_SMBUS_BLOCK_MAX);
                        amd_ec_write(smbus, AMD_SMB_CMD, command);
                        amd_ec_write(smbus, AMD_SMB_BCNT, len);
                        if (read_write == I2C_SMBUS_WRITE)
                                for (i = 0; i < len; i++)
-                                       amd_ec_write(smbus, AMD_SMB_DATA + i, data->block[i + 1]);
+                                       amd_ec_write(smbus, AMD_SMB_DATA + i,
+                                                    data->block[i + 1]);
                        protocol |= AMD_SMB_PRTCL_I2C_BLOCK_DATA;
                        break;
 
                case I2C_SMBUS_PROC_CALL:
                        amd_ec_write(smbus, AMD_SMB_CMD, command);
-                       amd_ec_write(smbus, AMD_SMB_DATA, data->word);
+                       amd_ec_write(smbus, AMD_SMB_DATA, data->word & 0xff);
                        amd_ec_write(smbus, AMD_SMB_DATA + 1, data->word >> 8);
                        protocol = AMD_SMB_PRTCL_PROC_CALL | pec;
                        read_write = I2C_SMBUS_READ;
@@ -248,7 +258,8 @@ static s32 amd8111_access(struct i2c_adapter * adap, u16 addr, unsigned short fl
                        amd_ec_write(smbus, AMD_SMB_CMD, command);
                        amd_ec_write(smbus, AMD_SMB_BCNT, len);
                        for (i = 0; i < len; i++)
-                               amd_ec_write(smbus, AMD_SMB_DATA + i, data->block[i + 1]);
+                               amd_ec_write(smbus, AMD_SMB_DATA + i,
+                                            data->block[i + 1]);
                        protocol = AMD_SMB_PRTCL_BLOCK_PROC_CALL | pec;
                        read_write = I2C_SMBUS_READ;
                        break;
@@ -280,7 +291,6 @@ static s32 amd8111_access(struct i2c_adapter * adap, u16 addr, unsigned short fl
                return 0;
 
        switch (size) {
-
                case I2C_SMBUS_BYTE:
                case I2C_SMBUS_BYTE_DATA:
                        amd_ec_read(smbus, AMD_SMB_DATA, &data->byte);
@@ -296,10 +306,11 @@ static s32 amd8111_access(struct i2c_adapter * adap, u16 addr, unsigned short fl
                case I2C_SMBUS_BLOCK_DATA:
                case I2C_SMBUS_BLOCK_PROC_CALL:
                        amd_ec_read(smbus, AMD_SMB_BCNT, &len);
-                       len = min_t(u8, len, 32);
+                       len = min_t(u8, len, I2C_SMBUS_BLOCK_MAX);
                case I2C_SMBUS_I2C_BLOCK_DATA:
                        for (i = 0; i < len; i++)
-                               amd_ec_read(smbus, AMD_SMB_DATA + i, data->block + i + 1);
+                               amd_ec_read(smbus, AMD_SMB_DATA + i,
+                                           data->block + i + 1);
                        data->block[0] = len;
                        break;
        }
@@ -310,7 +321,8 @@ static s32 amd8111_access(struct i2c_adapter * adap, u16 addr, unsigned short fl
 
 static u32 amd8111_func(struct i2c_adapter *adapter)
 {
-       return  I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | I2C_FUNC_SMBUS_BYTE_DATA |
+       return  I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
+               I2C_FUNC_SMBUS_BYTE_DATA |
                I2C_FUNC_SMBUS_WORD_DATA | I2C_FUNC_SMBUS_BLOCK_DATA |
                I2C_FUNC_SMBUS_PROC_CALL | I2C_FUNC_SMBUS_BLOCK_PROC_CALL |
                I2C_FUNC_SMBUS_I2C_BLOCK | I2C_FUNC_SMBUS_HWPEC_CALC;
@@ -329,12 +341,13 @@ static struct pci_device_id amd8111_ids[] = {
 
 MODULE_DEVICE_TABLE (pci, amd8111_ids);
 
-static int __devinit amd8111_probe(struct pci_dev *dev, const struct pci_device_id *id)
+static int __devinit amd8111_probe(struct pci_dev *dev,
+               const struct pci_device_id *id)
 {
        struct amd_smbus *smbus;
-       int error = -ENODEV;
+       int error;
 
-       if (~pci_resource_flags(dev, 0) & IORESOURCE_IO)
+       if (!(pci_resource_flags(dev, 0) & IORESOURCE_IO))
                return -ENODEV;
 
        smbus = kzalloc(sizeof(struct amd_smbus), GFP_KERNEL);
@@ -345,12 +358,15 @@ static int __devinit amd8111_probe(struct pci_dev *dev, const struct pci_device_
        smbus->base = pci_resource_start(dev, 0);
        smbus->size = pci_resource_len(dev, 0);
 
-       if (!request_region(smbus->base, smbus->size, amd8111_driver.name))
+       if (!request_region(smbus->base, smbus->size, amd8111_driver.name)) {
+               error = -EBUSY;
                goto out_kfree;
+       }
 
        smbus->adapter.owner = THIS_MODULE;
        snprintf(smbus->adapter.name, I2C_NAME_SIZE,
                "SMBus2 AMD8111 adapter at %04x", smbus->base);
+       smbus->adapter.id = I2C_HW_SMBUS_AMD8111;
        smbus->adapter.class = I2C_CLASS_HWMON;
        smbus->adapter.algo = &smbus_algorithm;
        smbus->adapter.algo_data = smbus;
@@ -358,11 +374,11 @@ static int __devinit amd8111_probe(struct pci_dev *dev, const struct pci_device_
        /* set up the driverfs linkage to our parent device */
        smbus->adapter.dev.parent = &dev->dev;
 
+       pci_write_config_dword(smbus->dev, AMD_PCI_MISC, 0);
        error = i2c_add_adapter(&smbus->adapter);
        if (error)
                goto out_release_region;
 
-       pci_write_config_dword(smbus->dev, AMD_PCI_MISC, 0);
        pci_set_drvdata(dev, smbus);
        return 0;
 
@@ -370,10 +386,9 @@ static int __devinit amd8111_probe(struct pci_dev *dev, const struct pci_device_
        release_region(smbus->base, smbus->size);
  out_kfree:
        kfree(smbus);
-       return -1;
+       return error;
 }
 
-
 static void __devexit amd8111_remove(struct pci_dev *dev)
 {
        struct amd_smbus *smbus = pci_get_drvdata(dev);
@@ -395,7 +410,6 @@ static int __init i2c_amd8111_init(void)
        return pci_register_driver(&amd8111_driver);
 }
 
-
 static void __exit i2c_amd8111_exit(void)
 {
        pci_unregister_driver(&amd8111_driver);
index ae625b85447074ee958e734ece3c3761bc4022a2..21f2671f7220ead3dc41d6115d1e25c30ef81088 100644 (file)
@@ -48,7 +48,6 @@
 #include <linux/kernel.h>
 #include <linux/stddef.h>
 #include <linux/delay.h>
-#include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
 #include <linux/i2c.h>
@@ -123,7 +122,7 @@ static int i801_transaction(void)
                        dev_dbg(&I801_dev->dev, "Failed! (%02x)\n", temp);
                        return -1;
                } else {
-                       dev_dbg(&I801_dev->dev, "Successfull!\n");
+                       dev_dbg(&I801_dev->dev, "Successful!\n");
                }
        }
 
@@ -442,6 +441,7 @@ static const struct i2c_algorithm smbus_algorithm = {
 
 static struct i2c_adapter i801_adapter = {
        .owner          = THIS_MODULE,
+       .id             = I2C_HW_SMBUS_I801,
        .class          = I2C_CLASS_HWMON,
        .algo           = &smbus_algorithm,
 };
index 10c98bc88aa6c57465299165f245eaf5270f6469..42e8d94c276fde7e278016aef70d6ffdf23e2baa 100644 (file)
@@ -171,6 +171,7 @@ static struct i2c_algo_bit_data i810_i2c_bit_data = {
 
 static struct i2c_adapter i810_i2c_adapter = {
        .owner          = THIS_MODULE,
+       .id             = I2C_HW_B_I810,
        .name           = "I810/I815 I2C Adapter",
        .algo_data      = &i810_i2c_bit_data,
 };
@@ -186,6 +187,7 @@ static struct i2c_algo_bit_data i810_ddc_bit_data = {
 
 static struct i2c_adapter i810_ddc_adapter = {
        .owner          = THIS_MODULE,
+       .id             = I2C_HW_B_I810,
        .name           = "I810/I815 DDC Adapter",
        .algo_data      = &i810_ddc_bit_data,
 };
index 1898e9987021606c78af90c3b97869066355aa7d..8b14d14e60cad3e3cd1099df6d221dc6ab1b475e 100644 (file)
@@ -727,6 +727,7 @@ static int __devinit iic_probe(struct ocp_device *ocp){
        
        /* Register it with i2c layer */
        adap = &dev->adap;
+       adap->dev.parent = &ocp->dev;
        strcpy(adap->name, "IBM IIC");
        i2c_set_adapdata(adap, dev);
        adap->id = I2C_HW_OCP;
index d108ab4974cc222bfb433b585868ba6b2f48b3af..20ee4f7c53a0ed75b306bece79852b74afc57851 100644 (file)
@@ -36,7 +36,6 @@
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/errno.h>
-#include <linux/sched.h>
 #include <linux/platform_device.h>
 #include <linux/i2c.h>
 
index 8ed59a2dff532124afc6e899f1df3d6a4622f106..5f33bc9c1e02ba7c134121c5beb8880c51f79eb3 100644 (file)
@@ -39,6 +39,7 @@
 #include <linux/i2c.h>
 #include <linux/i2c-isa.h>
 #include <linux/platform_device.h>
+#include <linux/completion.h>
 
 static u32 isa_func(struct i2c_adapter *adapter);
 
index 490173611d6b615013b2d87a7984af9aec7b04d2..a3283b907eb87a947fe30979e27867c34811cfaf 100644 (file)
@@ -520,6 +520,7 @@ mv64xxx_i2c_probe(struct platform_device *pd)
                rc = -ENXIO;
                goto exit_unmap_regs;
        }
+       drv_data->adapter.dev.parent = &pd->dev;
        drv_data->adapter.id = I2C_HW_MV64XXX;
        drv_data->adapter.algo = &mv64xxx_i2c_algo;
        drv_data->adapter.owner = THIS_MODULE;
index ad37c10e7fec38aaea6e2103647f5c0ca895e5ab..1514ec5b77f8e82f72a66ffc27ff8dc3f8414f7b 100644 (file)
@@ -44,7 +44,6 @@
 #include <linux/pci.h>
 #include <linux/kernel.h>
 #include <linux/stddef.h>
-#include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
 #include <linux/i2c.h>
@@ -57,7 +56,6 @@ MODULE_DESCRIPTION("nForce2/3/4/5xx SMBus driver");
 
 
 struct nforce2_smbus {
-       struct pci_dev *dev;
        struct i2c_adapter adapter;
        int base;
        int size;
@@ -230,7 +228,6 @@ static int __devinit nforce2_probe_smb (struct pci_dev *dev, int bar,
                smbus->base = iobase & PCI_BASE_ADDRESS_IO_MASK;
                smbus->size = 64;
        }
-       smbus->dev = dev;
 
        if (!request_region(smbus->base, smbus->size, nforce2_driver.name)) {
                dev_err(&smbus->adapter.dev, "Error requesting region %02x .. %02X for %s\n",
@@ -238,6 +235,7 @@ static int __devinit nforce2_probe_smb (struct pci_dev *dev, int bar,
                return -1;
        }
        smbus->adapter.owner = THIS_MODULE;
+       smbus->adapter.id = I2C_HW_SMBUS_NFORCE2;
        smbus->adapter.class = I2C_CLASS_HWMON;
        smbus->adapter.algo = &smbus_algorithm;
        smbus->adapter.algo_data = smbus;
index f28a76d1c0af2f0ee5bcc30f6dc65a363a0ac23d..e417c2c3ca22af0fa2520878ff07798a417ffad0 100644 (file)
@@ -11,7 +11,6 @@
 
 #include <linux/kernel.h>
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/errno.h>
 #include <linux/platform_device.h>
index 9ddd816d5d0f6609eec3ecddf640f15e2839e24e..ed69d846cb950c18248c5b5d1a3d4335f872efc3 100644 (file)
@@ -88,6 +88,13 @@ static struct adapter_parm adapter_parm[] = {
                .getscl = { 0x40, STAT, 0 },
                .init   = { 0xfc, DATA, 0 },
        },
+       /* type 7: One For All JP1 parallel port adapter */
+       {
+               .setsda = { 0x01, DATA, 0 },
+               .setscl = { 0x02, DATA, 0 },
+               .getsda = { 0x80, STAT, 1 },
+               .init   = { 0x04, DATA, 1 },
+       },
 };
 
 static int type = -1;
@@ -101,4 +108,5 @@ MODULE_PARM_DESC(type,
        " 4 = ADM1032 evaluation board\n"
        " 5 = ADM1025, ADM1030 and ADM1031 evaluation boards\n"
        " 6 = Barco LPT->DVI (K5800236) adapter\n"
+       " 7 = One For All JP1 parallel port adapter\n"
 );
diff --git a/drivers/i2c/busses/i2c-pasemi.c b/drivers/i2c/busses/i2c-pasemi.c
new file mode 100644 (file)
index 0000000..f54fb5d
--- /dev/null
@@ -0,0 +1,426 @@
+/*
+ * Copyright (C) 2006-2007 PA Semi, Inc
+ *
+ * SMBus host driver for PA Semi PWRficient
+ *
+ * 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.
+ *
+ * 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
+ */
+
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/kernel.h>
+#include <linux/stddef.h>
+#include <linux/sched.h>
+#include <linux/i2c.h>
+#include <linux/delay.h>
+#include <asm/io.h>
+
+static struct pci_driver pasemi_smb_driver;
+
+struct pasemi_smbus {
+       struct pci_dev          *dev;
+       struct i2c_adapter       adapter;
+       unsigned long            base;
+       int                      size;
+};
+
+/* Register offsets */
+#define REG_MTXFIFO    0x00
+#define REG_MRXFIFO    0x04
+#define REG_SMSTA      0x14
+#define REG_CTL                0x1c
+
+/* Register defs */
+#define MTXFIFO_READ   0x00000400
+#define MTXFIFO_STOP   0x00000200
+#define MTXFIFO_START  0x00000100
+#define MTXFIFO_DATA_M 0x000000ff
+
+#define MRXFIFO_EMPTY  0x00000100
+#define MRXFIFO_DATA_M 0x000000ff
+
+#define SMSTA_XEN      0x08000000
+
+#define CTL_MRR                0x00000400
+#define CTL_MTR                0x00000200
+#define CTL_CLK_M      0x000000ff
+
+#define CLK_100K_DIV   84
+#define CLK_400K_DIV   21
+
+static inline void reg_write(struct pasemi_smbus *smbus, int reg, int val)
+{
+       dev_dbg(&smbus->dev->dev, "smbus write reg %lx val %08x\n",
+               smbus->base + reg, val);
+       outl(val, smbus->base + reg);
+}
+
+static inline int reg_read(struct pasemi_smbus *smbus, int reg)
+{
+       int ret;
+       ret = inl(smbus->base + reg);
+       dev_dbg(&smbus->dev->dev, "smbus read reg %lx val %08x\n",
+               smbus->base + reg, ret);
+       return ret;
+}
+
+#define TXFIFO_WR(smbus, reg)  reg_write((smbus), REG_MTXFIFO, (reg))
+#define RXFIFO_RD(smbus)       reg_read((smbus), REG_MRXFIFO)
+
+static void pasemi_smb_clear(struct pasemi_smbus *smbus)
+{
+       unsigned int status;
+
+       status = reg_read(smbus, REG_SMSTA);
+       reg_write(smbus, REG_SMSTA, status);
+}
+
+static unsigned int pasemi_smb_waitready(struct pasemi_smbus *smbus)
+{
+       int timeout = 10;
+       unsigned int status;
+
+       status = reg_read(smbus, REG_SMSTA);
+
+       while (!(status & SMSTA_XEN) && timeout--) {
+               msleep(1);
+               status = reg_read(smbus, REG_SMSTA);
+       }
+
+       if (timeout < 0) {
+               dev_warn(&smbus->dev->dev, "Timeout, status 0x%08x\n", status);
+               reg_write(smbus, REG_SMSTA, status);
+               return -ETIME;
+       }
+
+       /* Clear XEN */
+       reg_write(smbus, REG_SMSTA, SMSTA_XEN);
+
+       return 0;
+}
+
+static int pasemi_i2c_xfer_msg(struct i2c_adapter *adapter,
+                              struct i2c_msg *msg, int stop)
+{
+       struct pasemi_smbus *smbus = adapter->algo_data;
+       int read, i, err;
+       u32 rd;
+
+       read = msg->flags & I2C_M_RD ? 1 : 0;
+
+       TXFIFO_WR(smbus, MTXFIFO_START | (msg->addr << 1) | read);
+
+       if (read) {
+               TXFIFO_WR(smbus, msg->len | MTXFIFO_READ |
+                                (stop ? MTXFIFO_STOP : 0));
+
+               err = pasemi_smb_waitready(smbus);
+               if (err)
+                       goto reset_out;
+
+               for (i = 0; i < msg->len; i++) {
+                       rd = RXFIFO_RD(smbus);
+                       if (rd & MRXFIFO_EMPTY) {
+                               err = -ENODATA;
+                               goto reset_out;
+                       }
+                       msg->buf[i] = rd & MRXFIFO_DATA_M;
+               }
+       } else {
+               for (i = 0; i < msg->len - 1; i++)
+                       TXFIFO_WR(smbus, msg->buf[i]);
+
+               TXFIFO_WR(smbus, msg->buf[msg->len] |
+                         (stop ? MTXFIFO_STOP : 0));
+       }
+
+       return 0;
+
+ reset_out:
+       reg_write(smbus, REG_CTL, (CTL_MTR | CTL_MRR |
+                 (CLK_100K_DIV & CTL_CLK_M)));
+       return err;
+}
+
+static int pasemi_i2c_xfer(struct i2c_adapter *adapter,
+                          struct i2c_msg *msgs, int num)
+{
+       struct pasemi_smbus *smbus = adapter->algo_data;
+       int ret, i;
+
+       pasemi_smb_clear(smbus);
+
+       ret = 0;
+
+       for (i = 0; i < num && !ret; i++)
+               ret = pasemi_i2c_xfer_msg(adapter, &msgs[i], (i == (num - 1)));
+
+       return ret ? ret : num;
+}
+
+static int pasemi_smb_xfer(struct i2c_adapter *adapter,
+               u16 addr, unsigned short flags, char read_write, u8 command,
+               int size, union i2c_smbus_data *data)
+{
+       struct pasemi_smbus *smbus = adapter->algo_data;
+       unsigned int rd;
+       int read_flag, err;
+       int len = 0, i;
+
+       /* All our ops take 8-bit shifted addresses */
+       addr <<= 1;
+       read_flag = read_write == I2C_SMBUS_READ;
+
+       pasemi_smb_clear(smbus);
+
+       switch (size) {
+       case I2C_SMBUS_QUICK:
+               TXFIFO_WR(smbus, addr | read_flag | MTXFIFO_START |
+                         MTXFIFO_STOP);
+               break;
+       case I2C_SMBUS_BYTE:
+               TXFIFO_WR(smbus, addr | read_flag | MTXFIFO_START);
+               if (read_write)
+                       TXFIFO_WR(smbus, 1 | MTXFIFO_STOP | MTXFIFO_READ);
+               else
+                       TXFIFO_WR(smbus, MTXFIFO_STOP | command);
+               break;
+       case I2C_SMBUS_BYTE_DATA:
+               TXFIFO_WR(smbus, addr | MTXFIFO_START);
+               TXFIFO_WR(smbus, command);
+               if (read_write) {
+                       TXFIFO_WR(smbus, addr | I2C_SMBUS_READ | MTXFIFO_START);
+                       TXFIFO_WR(smbus, 1 | MTXFIFO_READ | MTXFIFO_STOP);
+               } else {
+                       TXFIFO_WR(smbus, MTXFIFO_STOP | data->byte);
+               }
+               break;
+       case I2C_SMBUS_WORD_DATA:
+               TXFIFO_WR(smbus, addr | MTXFIFO_START);
+               TXFIFO_WR(smbus, command);
+               if (read_write) {
+                       TXFIFO_WR(smbus, addr | I2C_SMBUS_READ | MTXFIFO_START);
+                       TXFIFO_WR(smbus, 2 | MTXFIFO_READ | MTXFIFO_STOP);
+               } else {
+                       TXFIFO_WR(smbus, data->word & MTXFIFO_DATA_M);
+                       TXFIFO_WR(smbus, MTXFIFO_STOP | (data->word >> 8));
+               }
+               break;
+       case I2C_SMBUS_BLOCK_DATA:
+               TXFIFO_WR(smbus, addr | MTXFIFO_START);
+               TXFIFO_WR(smbus, command);
+               if (read_write) {
+                       TXFIFO_WR(smbus, addr | I2C_SMBUS_READ | MTXFIFO_START);
+                       TXFIFO_WR(smbus, 1 | MTXFIFO_READ);
+                       rd = RXFIFO_RD(smbus);
+                       len = min_t(u8, (rd & MRXFIFO_DATA_M),
+                                   I2C_SMBUS_BLOCK_MAX);
+                       TXFIFO_WR(smbus, (len + 1) | MTXFIFO_READ |
+                                        MTXFIFO_STOP);
+               } else {
+                       len = min_t(u8, data->block[0], I2C_SMBUS_BLOCK_MAX);
+                       TXFIFO_WR(smbus, len);
+                       for (i = 1; i < len; i++)
+                               TXFIFO_WR(smbus, data->block[i]);
+                       TXFIFO_WR(smbus, data->block[len] | MTXFIFO_STOP);
+               }
+               break;
+       case I2C_SMBUS_PROC_CALL:
+               read_write = I2C_SMBUS_READ;
+               TXFIFO_WR(smbus, addr | MTXFIFO_START);
+               TXFIFO_WR(smbus, command);
+               TXFIFO_WR(smbus, data->word & MTXFIFO_DATA_M);
+               TXFIFO_WR(smbus, (data->word >> 8) & MTXFIFO_DATA_M);
+               TXFIFO_WR(smbus, addr | I2C_SMBUS_READ | MTXFIFO_START);
+               TXFIFO_WR(smbus, 2 | MTXFIFO_STOP | MTXFIFO_READ);
+               break;
+       case I2C_SMBUS_BLOCK_PROC_CALL:
+               len = min_t(u8, data->block[0], I2C_SMBUS_BLOCK_MAX - 1);
+               read_write = I2C_SMBUS_READ;
+               TXFIFO_WR(smbus, addr | MTXFIFO_START);
+               TXFIFO_WR(smbus, command);
+               TXFIFO_WR(smbus, len);
+               for (i = 1; i <= len; i++)
+                       TXFIFO_WR(smbus, data->block[i]);
+               TXFIFO_WR(smbus, addr | I2C_SMBUS_READ);
+               TXFIFO_WR(smbus, MTXFIFO_READ | 1);
+               rd = RXFIFO_RD(smbus);
+               len = min_t(u8, (rd & MRXFIFO_DATA_M),
+                           I2C_SMBUS_BLOCK_MAX - len);
+               TXFIFO_WR(smbus, (len + 1) | MTXFIFO_READ | MTXFIFO_STOP);
+               break;
+
+       default:
+               dev_warn(&adapter->dev, "Unsupported transaction %d\n", size);
+               return -EINVAL;
+       }
+
+       err = pasemi_smb_waitready(smbus);
+       if (err)
+               goto reset_out;
+
+       if (read_write == I2C_SMBUS_WRITE)
+               return 0;
+
+       switch (size) {
+       case I2C_SMBUS_BYTE:
+       case I2C_SMBUS_BYTE_DATA:
+               rd = RXFIFO_RD(smbus);
+               if (rd & MRXFIFO_EMPTY) {
+                       err = -ENODATA;
+                       goto reset_out;
+               }
+               data->byte = rd & MRXFIFO_DATA_M;
+               break;
+       case I2C_SMBUS_WORD_DATA:
+       case I2C_SMBUS_PROC_CALL:
+               rd = RXFIFO_RD(smbus);
+               if (rd & MRXFIFO_EMPTY) {
+                       err = -ENODATA;
+                       goto reset_out;
+               }
+               data->word = rd & MRXFIFO_DATA_M;
+               rd = RXFIFO_RD(smbus);
+               if (rd & MRXFIFO_EMPTY) {
+                       err = -ENODATA;
+                       goto reset_out;
+               }
+               data->word |= (rd & MRXFIFO_DATA_M) << 8;
+               break;
+       case I2C_SMBUS_BLOCK_DATA:
+       case I2C_SMBUS_BLOCK_PROC_CALL:
+               data->block[0] = len;
+               for (i = 1; i <= len; i ++) {
+                       rd = RXFIFO_RD(smbus);
+                       if (rd & MRXFIFO_EMPTY) {
+                               err = -ENODATA;
+                               goto reset_out;
+                       }
+                       data->block[i] = rd & MRXFIFO_DATA_M;
+               }
+               break;
+       }
+
+       return 0;
+
+ reset_out:
+       reg_write(smbus, REG_CTL, (CTL_MTR | CTL_MRR |
+                 (CLK_100K_DIV & CTL_CLK_M)));
+       return err;
+}
+
+static u32 pasemi_smb_func(struct i2c_adapter *adapter)
+{
+       return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
+              I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
+              I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_PROC_CALL |
+              I2C_FUNC_SMBUS_BLOCK_PROC_CALL | I2C_FUNC_I2C;
+}
+
+static const struct i2c_algorithm smbus_algorithm = {
+       .master_xfer    = pasemi_i2c_xfer,
+       .smbus_xfer     = pasemi_smb_xfer,
+       .functionality  = pasemi_smb_func,
+};
+
+static int __devinit pasemi_smb_probe(struct pci_dev *dev,
+                                     const struct pci_device_id *id)
+{
+       struct pasemi_smbus *smbus;
+       int error;
+
+       if (!(pci_resource_flags(dev, 0) & IORESOURCE_IO))
+               return -ENODEV;
+
+       smbus = kzalloc(sizeof(struct pasemi_smbus), GFP_KERNEL);
+       if (!smbus)
+               return -ENOMEM;
+
+       smbus->dev = dev;
+       smbus->base = pci_resource_start(dev, 0);
+       smbus->size = pci_resource_len(dev, 0);
+
+       if (!request_region(smbus->base, smbus->size,
+                           pasemi_smb_driver.name)) {
+               error = -EBUSY;
+               goto out_kfree;
+       }
+
+       smbus->adapter.owner = THIS_MODULE;
+       snprintf(smbus->adapter.name, I2C_NAME_SIZE,
+                "PA Semi SMBus adapter at 0x%lx", smbus->base);
+       smbus->adapter.class = I2C_CLASS_HWMON;
+       smbus->adapter.algo = &smbus_algorithm;
+       smbus->adapter.algo_data = smbus;
+
+       /* set up the driverfs linkage to our parent device */
+       smbus->adapter.dev.parent = &dev->dev;
+
+       reg_write(smbus, REG_CTL, (CTL_MTR | CTL_MRR |
+                 (CLK_100K_DIV & CTL_CLK_M)));
+
+       error = i2c_add_adapter(&smbus->adapter);
+       if (error)
+               goto out_release_region;
+
+       pci_set_drvdata(dev, smbus);
+
+       return 0;
+
+ out_release_region:
+       release_region(smbus->base, smbus->size);
+ out_kfree:
+       kfree(smbus);
+       return error;
+}
+
+static void __devexit pasemi_smb_remove(struct pci_dev *dev)
+{
+       struct pasemi_smbus *smbus = pci_get_drvdata(dev);
+
+       i2c_del_adapter(&smbus->adapter);
+       release_region(smbus->base, smbus->size);
+       kfree(smbus);
+}
+
+static struct pci_device_id pasemi_smb_ids[] = {
+       { PCI_DEVICE(0x1959, 0xa003) },
+       { 0, }
+};
+
+MODULE_DEVICE_TABLE(pci, pasemi_smb_ids);
+
+static struct pci_driver pasemi_smb_driver = {
+       .name           = "i2c-pasemi",
+       .id_table       = pasemi_smb_ids,
+       .probe          = pasemi_smb_probe,
+       .remove         = __devexit_p(pasemi_smb_remove),
+};
+
+static int __init pasemi_smb_init(void)
+{
+       return pci_register_driver(&pasemi_smb_driver);
+}
+
+static void __exit pasemi_smb_exit(void)
+{
+       pci_unregister_driver(&pasemi_smb_driver);
+}
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR ("Olof Johansson <olof@lixom.net>");
+MODULE_DESCRIPTION("PA Semi PWRficient SMBus driver");
+
+module_init(pasemi_smb_init);
+module_exit(pasemi_smb_exit);
index 30c7a1b38cbd7e5202106b8f060bb55a83f29e5d..d888293c1a9c17a35a48c837c8c141e5711958a8 100644 (file)
@@ -23,6 +23,7 @@
    Supports:
        Intel PIIX4, 440MX
        Serverworks OSB4, CSB5, CSB6, HT-1000
+       ATI IXP200, IXP300, IXP400, SB600
        SMSC Victory66
 
    Note: we assume there can only be one device, with one SMBus interface.
@@ -34,7 +35,6 @@
 #include <linux/kernel.h>
 #include <linux/delay.h>
 #include <linux/stddef.h>
-#include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/i2c.h>
 #include <linux/init.h>
@@ -383,6 +383,7 @@ static const struct i2c_algorithm smbus_algorithm = {
 
 static struct i2c_adapter piix4_adapter = {
        .owner          = THIS_MODULE,
+       .id             = I2C_HW_SMBUS_PIIX4,
        .class          = I2C_CLASS_HWMON,
        .algo           = &smbus_algorithm,
 };
@@ -396,6 +397,8 @@ static struct pci_device_id piix4_ids[] = {
          .driver_data = 0 },
        { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_SMBUS),
          .driver_data = 0 },
+       { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP600_SMBUS),
+         .driver_data = 0 },
        { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_OSB4),
          .driver_data = 0 },
        { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5),
index 648d55533d87e1a53a9b1d6a58bd21a7f17a77ab..1425d2245c827f8f9a103a3f74dfb3a7cfb70df3 100644 (file)
@@ -25,7 +25,6 @@
 #include <linux/types.h>
 #include <linux/i2c.h>
 #include <linux/init.h>
-#include <linux/completion.h>
 #include <linux/device.h>
 #include <linux/platform_device.h>
 #include <asm/prom.h>
index 4ca6de209b8b6225406f459f64969ef7db94fb25..556f244aae769e3b156a39900077dd5af279aa37 100644 (file)
@@ -28,7 +28,6 @@
 #include <linux/init.h>
 #include <linux/time.h>
 #include <linux/interrupt.h>
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/err.h>
index 844b4ff908934895d5be8e8f58162b1e3b28f6ca..b7fb65c301124eb54e786bc5ef33153737028f06 100644 (file)
@@ -145,6 +145,7 @@ static struct i2c_algo_bit_data sav_i2c_bit_data = {
 
 static struct i2c_adapter savage4_i2c_adapter = {
        .owner          = THIS_MODULE,
+       .id             = I2C_HW_B_SAVAGE,
        .name           = "I2C Savage4 adapter",
        .algo_data      = &sav_i2c_bit_data,
 };
index 38bbfd840b6b181c51aab35856ceebfdfb737cdf..d333babe4ad36161a860967e5624519f4c1ec4ba 100644 (file)
@@ -365,6 +365,7 @@ static const struct i2c_algorithm smbus_algorithm = {
 
 static struct i2c_adapter sis5595_adapter = {
        .owner          = THIS_MODULE,
+       .id             = I2C_HW_SMBUS_SIS5595,
        .class          = I2C_CLASS_HWMON,
        .algo           = &smbus_algorithm,
 };
index dec0bafb52ab5cd5f241b7675800048a790c7cd8..172bacf932a6807c21333f2cb3b594b8ed47b855 100644 (file)
@@ -457,6 +457,7 @@ static const struct i2c_algorithm smbus_algorithm = {
 
 static struct i2c_adapter sis630_adapter = {
        .owner          = THIS_MODULE,
+       .id             = I2C_HW_SMBUS_SIS630,
        .class          = I2C_CLASS_HWMON,
        .algo           = &smbus_algorithm,
 };
index 7fd07fbac33681c3f81f49e66acad11660aa3533..73dae449fb235bb738191f246d800f8bb861ce2a 100644 (file)
@@ -37,7 +37,6 @@
 #include <linux/kernel.h>
 #include <linux/delay.h>
 #include <linux/stddef.h>
-#include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/i2c.h>
 #include <linux/init.h>
@@ -249,6 +248,7 @@ static const struct i2c_algorithm smbus_algorithm = {
 
 static struct i2c_adapter sis96x_adapter = {
        .owner          = THIS_MODULE,
+       .id             = I2C_HW_SMBUS_SIS96X,
        .class          = I2C_CLASS_HWMON,
        .algo           = &smbus_algorithm,
 };
index 15d7e00e47e6a7b3edb93d9321eefdcee01f6847..bbcc62151f7c4cf542478bcf6ee8768254aaba64 100644 (file)
@@ -86,6 +86,7 @@ static struct i2c_algo_bit_data bit_data = {
 
 static struct i2c_adapter vt586b_adapter = {
        .owner          = THIS_MODULE,
+       .id             = I2C_HW_B_VIA,
        .class          = I2C_CLASS_HWMON,
        .name           = "VIA i2c",
        .algo_data      = &bit_data,
index efc6bbf0cc0a49818b569208f92f92062acefaf2..03c5fc868548d3d121aca6d879b06e13031594c2 100644 (file)
@@ -4,7 +4,7 @@
     Copyright (c) 1998 - 2002  Frodo Looijaard <frodol@dds.nl>,
     Philip Edelbrock <phil@netroedge.com>, Kyösti Mälkki <kmalkki@cc.hut.fi>,
     Mark D. Studebaker <mdsxyz123@yahoo.com>
-    Copyright (C) 2005  Jean Delvare <khali@linux-fr.org>
+    Copyright (C) 2005 - 2007  Jean Delvare <khali@linux-fr.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
@@ -36,6 +36,7 @@
    VT8237R            0x3227             yes
    VT8237A            0x3337             yes
    VT8251             0x3287             yes
+   CX700              0x8324             yes
 
    Note: we assume there can only be one device, with one SMBus interface.
 */
@@ -306,6 +307,7 @@ static const struct i2c_algorithm smbus_algorithm = {
 
 static struct i2c_adapter vt596_adapter = {
        .owner          = THIS_MODULE,
+       .id             = I2C_HW_SMBUS_VIA2,
        .class          = I2C_CLASS_HWMON,
        .algo           = &smbus_algorithm,
 };
@@ -383,6 +385,7 @@ found:
        dev_dbg(&pdev->dev, "VT596_smba = 0x%X\n", vt596_smba);
 
        switch (pdev->device) {
+       case PCI_DEVICE_ID_VIA_CX700:
        case PCI_DEVICE_ID_VIA_8251:
        case PCI_DEVICE_ID_VIA_8237:
        case PCI_DEVICE_ID_VIA_8237A:
@@ -442,6 +445,8 @@ static struct pci_device_id vt596_ids[] = {
          .driver_data = SMBBA1 },
        { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8251),
          .driver_data = SMBBA3 },
+       { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_CX700),
+         .driver_data = SMBBA3 },
        { 0, }
 };
 
index b0377b81744bcc4d525460b9a8ca8e2eb839d8e2..88a3447e11e1eaf47fb9ddc0b29fc0ab8fb0048f 100644 (file)
@@ -165,6 +165,7 @@ static struct i2c_algo_bit_data voo_i2c_bit_data = {
 
 static struct i2c_adapter voodoo3_i2c_adapter = {
        .owner          = THIS_MODULE,
+       .id             = I2C_HW_B_VOO,
        .class          = I2C_CLASS_TV_ANALOG, 
        .name           = "I2C Voodoo3/Banshee adapter",
        .algo_data      = &voo_i2c_bit_data,
@@ -181,6 +182,7 @@ static struct i2c_algo_bit_data voo_ddc_bit_data = {
 
 static struct i2c_adapter voodoo3_ddc_adapter = {
        .owner          = THIS_MODULE,
+       .id             = I2C_HW_B_VOO,
        .class          = I2C_CLASS_DDC, 
        .name           = "DDC Voodoo3/Banshee adapter",
        .algo_data      = &voo_ddc_bit_data,
index 714bae780953c821792ec410597411f722c7df87..0b082c5a01956d7e98b52329ad920b69693793e3 100644 (file)
@@ -428,7 +428,7 @@ static __init int scx200_acb_probe(struct scx200_acb_iface *iface)
 }
 
 static __init struct scx200_acb_iface *scx200_create_iface(const char *text,
-               int index)
+               struct device *dev, int index)
 {
        struct scx200_acb_iface *iface;
        struct i2c_adapter *adapter;
@@ -446,6 +446,7 @@ static __init struct scx200_acb_iface *scx200_create_iface(const char *text,
        adapter->id = I2C_HW_SMBUS_SCX200;
        adapter->algo = &scx200_acb_algorithm;
        adapter->class = I2C_CLASS_HWMON;
+       adapter->dev.parent = dev;
 
        mutex_init(&iface->mutex);
 
@@ -486,7 +487,7 @@ static __init int scx200_create_pci(const char *text, struct pci_dev *pdev,
        struct scx200_acb_iface *iface;
        int rc;
 
-       iface = scx200_create_iface(text, 0);
+       iface = scx200_create_iface(text, &pdev->dev, 0);
 
        if (iface == NULL)
                return -ENOMEM;
@@ -524,7 +525,7 @@ static int __init scx200_create_isa(const char *text, unsigned long base,
        struct scx200_acb_iface *iface;
        int rc;
 
-       iface = scx200_create_iface(text, index);
+       iface = scx200_create_iface(text, NULL, index);
 
        if (iface == NULL)
                return -ENOMEM;
index 6cd96e43aa72a9d50ebbc8eb8a66c327bca761dc..c3022a023449ec2012b7911c0be94d8f7446869b 100644 (file)
@@ -81,6 +81,7 @@ static struct i2c_algo_bit_data scx200_i2c_data = {
 
 static struct i2c_adapter scx200_i2c_ops = {
        .owner             = THIS_MODULE,
+       .id                = I2C_HW_B_SCX200,
        .algo_data         = &scx200_i2c_data,
        .name   = "NatSemi SCx200 I2C",
 };
index cec3a0c3894dda7912024c769e04057d2a47c5ad..bfce13c8f1ff764d9c6036a8b4cef9cb86cdf106 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/slab.h>
-#include <linux/sched.h>
 #include <linux/jiffies.h>
 #include <linux/i2c.h>
 #include <linux/mutex.h>
index 4ee56def61f277cd019001dd9ffb434053f59f38..214fbb1423c5ba357adda0fa1cd14b1492aa5414 100644 (file)
@@ -308,7 +308,7 @@ static int dbg_tps_open(struct inode *inode, struct file *file)
        return single_open(file, dbg_show, inode->i_private);
 }
 
-static struct file_operations debug_fops = {
+static const struct file_operations debug_fops = {
        .open           = dbg_tps_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index b05378a3d673fb67de094c3c0e4c33e9c7836d87..21fe1406c8b4276b6c0faca6c0ba00826464664c 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/seq_file.h>
 #include <linux/platform_device.h>
 #include <linux/mutex.h>
+#include <linux/completion.h>
 #include <asm/uaccess.h>
 
 
@@ -40,49 +41,72 @@ static LIST_HEAD(drivers);
 static DEFINE_MUTEX(core_lists);
 static DEFINE_IDR(i2c_adapter_idr);
 
+
+/* ------------------------------------------------------------------------- */
+
 /* match always succeeds, as we want the probe() to tell if we really accept this match */
 static int i2c_device_match(struct device *dev, struct device_driver *drv)
 {
        return 1;
 }
 
-static int i2c_bus_suspend(struct device * dev, pm_message_t state)
+static int i2c_device_probe(struct device *dev)
 {
-       int rc = 0;
+       return -ENODEV;
+}
 
-       if (dev->driver && dev->driver->suspend)
-               rc = dev->driver->suspend(dev, state);
-       return rc;
+static int i2c_device_remove(struct device *dev)
+{
+       return 0;
 }
 
-static int i2c_bus_resume(struct device * dev)
+static void i2c_device_shutdown(struct device *dev)
 {
-       int rc = 0;
-       
-       if (dev->driver && dev->driver->resume)
-               rc = dev->driver->resume(dev);
-       return rc;
+       struct i2c_driver *driver;
+
+       if (!dev->driver)
+               return;
+       driver = to_i2c_driver(dev->driver);
+       if (driver->shutdown)
+               driver->shutdown(to_i2c_client(dev));
 }
 
-static int i2c_device_probe(struct device *dev)
+static int i2c_device_suspend(struct device * dev, pm_message_t mesg)
 {
-       return -ENODEV;
+       struct i2c_driver *driver;
+
+       if (!dev->driver)
+               return 0;
+       driver = to_i2c_driver(dev->driver);
+       if (!driver->suspend)
+               return 0;
+       return driver->suspend(to_i2c_client(dev), mesg);
 }
 
-static int i2c_device_remove(struct device *dev)
+static int i2c_device_resume(struct device * dev)
 {
-       return 0;
+       struct i2c_driver *driver;
+
+       if (!dev->driver)
+               return 0;
+       driver = to_i2c_driver(dev->driver);
+       if (!driver->resume)
+               return 0;
+       return driver->resume(to_i2c_client(dev));
 }
 
 struct bus_type i2c_bus_type = {
-       .name =         "i2c",
-       .match =        i2c_device_match,
-       .probe =        i2c_device_probe,
-       .remove =       i2c_device_remove,
-       .suspend =      i2c_bus_suspend,
-       .resume =       i2c_bus_resume,
+       .name           = "i2c",
+       .match          = i2c_device_match,
+       .probe          = i2c_device_probe,
+       .remove         = i2c_device_remove,
+       .shutdown       = i2c_device_shutdown,
+       .suspend        = i2c_device_suspend,
+       .resume         = i2c_device_resume,
 };
 
+/* ------------------------------------------------------------------------- */
+
 void i2c_adapter_dev_release(struct device *dev)
 {
        struct i2c_adapter *adap = dev_to_i2c_adapter(dev);
@@ -193,9 +217,8 @@ int i2c_add_adapter(struct i2c_adapter *adap)
         */
        if (adap->dev.parent == NULL) {
                adap->dev.parent = &platform_bus;
-               printk(KERN_WARNING "**WARNING** I2C adapter driver [%s] "
-                      "forgot to specify physical device; fix it!\n",
-                      adap->name);
+               pr_debug("I2C adapter driver [%s] forgot to specify "
+                        "physical device\n", adap->name);
        }
        sprintf(adap->dev.bus_id, "i2c-%d", adap->nr);
        adap->dev.driver = &i2c_adapter_driver;
index ac5bd2a7ca9906115c1380423d249d3f92adbe84..cb4fa9bef8cd5ef1602a3ddf9bc02d1557d5d744 100644 (file)
@@ -392,7 +392,7 @@ static int i2cdev_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations i2cdev_fops = {
+static const struct file_operations i2cdev_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .read           = i2cdev_read,
index aa049dab3d95c17609f3a1d54621f18a01896749..afb71c66b6f3f94e0517cc641feb01db0a1715b6 100644 (file)
@@ -26,7 +26,6 @@
 
 #include <asm/uaccess.h>
 #include <linux/errno.h>
-#include <linux/sched.h>
 #include <linux/proc_fs.h>
 #include <linux/stat.h>
 #include <linux/mm.h>
@@ -413,7 +412,6 @@ void ide_add_proc_entries(struct proc_dir_entry *dir, ide_proc_entry_t *p, void
        while (p->name != NULL) {
                ent = create_proc_entry(p->name, p->mode, dir);
                if (!ent) return;
-               ent->nlink = 1;
                ent->data = data;
                ent->read_proc = p->read_proc;
                ent->write_proc = p->write_proc;
@@ -549,7 +547,7 @@ static int ide_drivers_open(struct inode *inode, struct file *file)
        return single_open(file, &ide_drivers_show, NULL);
 }
 
-static struct file_operations ide_drivers_operations = {
+static const struct file_operations ide_drivers_operations = {
        .open           = ide_drivers_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index b3bcd1d7315e8780e6d74885a0d1f39862270162..c6eec0413a6c5f323bf67798554a6a794747773e 100644 (file)
@@ -4779,7 +4779,7 @@ static ide_driver_t idetape_driver = {
 /*
  *     Our character device supporting functions, passed to register_chrdev.
  */
-static struct file_operations idetape_fops = {
+static const struct file_operations idetape_fops = {
        .owner          = THIS_MODULE,
        .read           = idetape_chrdev_read,
        .write          = idetape_chrdev_write,
index 7efd28ac21ed41aa8a5363efeaf11079b04c321f..a5023cdbdc58ee1ec757f8ffc855ff791783fff6 100644 (file)
@@ -34,7 +34,6 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/ptrace.h>
 #include <linux/slab.h>
 #include <linux/string.h>
index 0ac9da3a7378b327c21e66c96d2d29765a993d9d..82de2d781f2ea24da3b1c8e0c49d907d03b1d4bb 100644 (file)
@@ -12,7 +12,6 @@
  */
 
 #include <linux/errno.h>
-#include <linux/sched.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
 #include <linux/stddef.h>
index 91c5344a945d5375e14103743990d19ca86c6792..d8ea23710bf0386d25d96d7d0e2a9102c001fb47 100644 (file)
@@ -24,7 +24,6 @@
  */
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/ide.h>
index 55d6ae664fd621639815a6c06b266e4348a19cc3..dee9529aa8e7e3a742e1223fc4bd51d63f87c6fd 100644 (file)
@@ -2147,7 +2147,7 @@ out:
 }
 
 static struct cdev dv1394_cdev;
-static struct file_operations dv1394_fops=
+static const struct file_operations dv1394_fops=
 {
        .owner =        THIS_MODULE,
        .poll =         dv1394_poll,
index 97e5c3dd044d05aacae220ab5b67d02c5fe2bce6..a953135219851292b3803f3b3799ac00be810ac0 100644 (file)
@@ -43,7 +43,6 @@
 
 #include <linux/module.h>
 
-#include <linux/sched.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/errno.h>
index 08bd15d2a7b6cea63a675664ea333e9e0837b376..c6227e51136dbecc5ea7656702bcdda7fb34c9f1 100644 (file)
@@ -10,7 +10,6 @@
  */
 
 #include <linux/pci.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 
 #include "hosts.h"
index 5729e412cc4aaeeb76621a0eb1848e5280eef4ab..e982d60ac4b7dde0f2bbf7542308ff0a219ad4f1 100644 (file)
 #include <asm/pgtable.h>
 #include <asm/page.h>
 #include <asm/irq.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/vmalloc.h>
 #include <linux/init.h>
index fbb7f14ec5097455c628e08c0b4b4910d557af5e..0742befe92270f0d9557072dc59a6b2771e5197c 100644 (file)
@@ -1434,6 +1434,7 @@ static int __devinit add_card(struct pci_dev *dev,
                 i2c_adapter_data = bit_data;
                 i2c_ad->algo_data = &i2c_adapter_data;
                 i2c_adapter_data.data = lynx;
+               i2c_ad->dev.parent = &dev->dev;
 
                PRINTD(KERN_DEBUG, lynx->id,"original eeprom control: %d",
                       reg_read(lynx, SERIAL_EEPROM_CONTROL));
index a77a832828c84220d6d504c9be4d55101e5754ea..aa9ca8385ec769304e0bc928c51d52be92641aa6 100644 (file)
@@ -3013,7 +3013,7 @@ static struct hpsb_highlevel raw1394_highlevel = {
 };
 
 static struct cdev raw1394_cdev;
-static struct file_operations raw1394_fops = {
+static const struct file_operations raw1394_fops = {
        .owner = THIS_MODULE,
        .read = raw1394_read,
        .write = raw1394_write,
index f4d1ec00af652372b1ed37a5a5ffa2401e5dc2d8..95ca26d7527297354021b2b18b2e89637c53dc7b 100644 (file)
@@ -1277,7 +1277,7 @@ static long video1394_compat_ioctl(struct file *f, unsigned cmd, unsigned long a
 #endif
 
 static struct cdev video1394_cdev;
-static struct file_operations video1394_fops=
+static const struct file_operations video1394_fops=
 {
        .owner =        THIS_MODULE,
        .unlocked_ioctl = video1394_ioctl,
index 9edfacee7d8442cb6e5c49db23d493829991d540..66b36de9fa6f531a3a9b329ac3177ad0cceead68 100644 (file)
@@ -38,6 +38,7 @@ source "drivers/infiniband/hw/mthca/Kconfig"
 source "drivers/infiniband/hw/ipath/Kconfig"
 source "drivers/infiniband/hw/ehca/Kconfig"
 source "drivers/infiniband/hw/amso1100/Kconfig"
+source "drivers/infiniband/hw/cxgb3/Kconfig"
 
 source "drivers/infiniband/ulp/ipoib/Kconfig"
 
index 2b5d1098ef45f4c3ba9fa5ccfed4c2aa76b0e7c3..da2066c4f22c03da192a390a5d5893226f6ff7f6 100644 (file)
@@ -3,6 +3,7 @@ obj-$(CONFIG_INFINIBAND_MTHCA)          += hw/mthca/
 obj-$(CONFIG_INFINIBAND_IPATH)         += hw/ipath/
 obj-$(CONFIG_INFINIBAND_EHCA)          += hw/ehca/
 obj-$(CONFIG_INFINIBAND_AMSO1100)      += hw/amso1100/
+obj-$(CONFIG_INFINIBAND_CXGB3)         += hw/cxgb3/
 obj-$(CONFIG_INFINIBAND_IPOIB)         += ulp/ipoib/
 obj-$(CONFIG_INFINIBAND_SRP)           += ulp/srp/
 obj-$(CONFIG_INFINIBAND_ISER)          += ulp/iser/
index d2bb5a9a303fcb7d86f3a38deea2e33e7d8e9c2c..a91001c59b69d66a57770457c2c464ea0c5d14ff 100644 (file)
@@ -373,7 +373,7 @@ static struct notifier_block nb = {
 
 static int addr_init(void)
 {
-       addr_wq = create_singlethread_workqueue("ib_addr_wq");
+       addr_wq = create_singlethread_workqueue("ib_addr");
        if (!addr_wq)
                return -ENOMEM;
 
index 98272fbbfb31e3d1ff4e8a010d6a7f1489a58bf8..558c9a0fc8b968fad2ee02ea199a4d8b640a4638 100644 (file)
@@ -38,7 +38,6 @@
 #include <linux/module.h>
 #include <linux/errno.h>
 #include <linux/slab.h>
-#include <linux/sched.h>       /* INIT_WORK, schedule_work(), flush_scheduled_work() */
 
 #include <rdma/ib_cache.h>
 
index 9e0ab048c878eba5b07d57501762f83c3f1f2356..db88e609bf429f6a1fb9f37527f0c21651d14320 100644 (file)
@@ -71,6 +71,7 @@ static struct workqueue_struct *cma_wq;
 static DEFINE_IDR(sdp_ps);
 static DEFINE_IDR(tcp_ps);
 static DEFINE_IDR(udp_ps);
+static int next_port;
 
 struct cma_device {
        struct list_head        list;
@@ -1722,33 +1723,74 @@ static int cma_alloc_port(struct idr *ps, struct rdma_id_private *id_priv,
                          unsigned short snum)
 {
        struct rdma_bind_list *bind_list;
-       int port, start, ret;
+       int port, ret;
 
        bind_list = kzalloc(sizeof *bind_list, GFP_KERNEL);
        if (!bind_list)
                return -ENOMEM;
 
-       start = snum ? snum : sysctl_local_port_range[0];
+       do {
+               ret = idr_get_new_above(ps, bind_list, snum, &port);
+       } while ((ret == -EAGAIN) && idr_pre_get(ps, GFP_KERNEL));
+
+       if (ret)
+               goto err1;
+
+       if (port != snum) {
+               ret = -EADDRNOTAVAIL;
+               goto err2;
+       }
+
+       bind_list->ps = ps;
+       bind_list->port = (unsigned short) port;
+       cma_bind_port(bind_list, id_priv);
+       return 0;
+err2:
+       idr_remove(ps, port);
+err1:
+       kfree(bind_list);
+       return ret;
+}
 
+static int cma_alloc_any_port(struct idr *ps, struct rdma_id_private *id_priv)
+{
+       struct rdma_bind_list *bind_list;
+       int port, ret;
+
+       bind_list = kzalloc(sizeof *bind_list, GFP_KERNEL);
+       if (!bind_list)
+               return -ENOMEM;
+
+retry:
        do {
-               ret = idr_get_new_above(ps, bind_list, start, &port);
+               ret = idr_get_new_above(ps, bind_list, next_port, &port);
        } while ((ret == -EAGAIN) && idr_pre_get(ps, GFP_KERNEL));
 
        if (ret)
-               goto err;
+               goto err1;
 
-       if ((snum && port != snum) ||
-           (!snum && port > sysctl_local_port_range[1])) {
-               idr_remove(ps, port);
+       if (port > sysctl_local_port_range[1]) {
+               if (next_port != sysctl_local_port_range[0]) {
+                       idr_remove(ps, port);
+                       next_port = sysctl_local_port_range[0];
+                       goto retry;
+               }
                ret = -EADDRNOTAVAIL;
-               goto err;
+               goto err2;
        }
 
+       if (port == sysctl_local_port_range[1])
+               next_port = sysctl_local_port_range[0];
+       else
+               next_port = port + 1;
+
        bind_list->ps = ps;
        bind_list->port = (unsigned short) port;
        cma_bind_port(bind_list, id_priv);
        return 0;
-err:
+err2:
+       idr_remove(ps, port);
+err1:
        kfree(bind_list);
        return ret;
 }
@@ -1811,7 +1853,7 @@ static int cma_get_port(struct rdma_id_private *id_priv)
 
        mutex_lock(&lock);
        if (cma_any_port(&id_priv->id.route.addr.src_addr))
-               ret = cma_alloc_port(ps, id_priv, 0);
+               ret = cma_alloc_any_port(ps, id_priv);
        else
                ret = cma_use_port(ps, id_priv);
        mutex_unlock(&lock);
@@ -2448,7 +2490,11 @@ static int cma_init(void)
 {
        int ret;
 
-       cma_wq = create_singlethread_workqueue("rdma_cm_wq");
+       get_random_bytes(&next_port, sizeof next_port);
+       next_port = (next_port % (sysctl_local_port_range[1] -
+                                 sysctl_local_port_range[0])) +
+                   sysctl_local_port_range[0];
+       cma_wq = create_singlethread_workqueue("rdma_cm");
        if (!cma_wq)
                return -ENOMEM;
 
index 63d2a39fb82c84a83aab4454f6336d81efbc41ae..7fabb425b033a2de2243d50b24164937c0e99e49 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/module.h>
 #include <linux/string.h>
 #include <linux/errno.h>
+#include <linux/kernel.h>
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/mutex.h>
@@ -93,7 +94,7 @@ static int ib_device_check_mandatory(struct ib_device *device)
        };
        int i;
 
-       for (i = 0; i < sizeof mandatory_table / sizeof mandatory_table[0]; ++i) {
+       for (i = 0; i < ARRAY_SIZE(mandatory_table); ++i) {
                if (!*(void **) ((void *) device + mandatory_table[i].offset)) {
                        printk(KERN_WARNING "Device %s is missing mandatory function %s\n",
                               device->name, mandatory_table[i].name);
index f15220a0ee75dda635079975df75dfe406996d05..ee51d79a7ad5048ba97830934ad1961abf5b0376 100644 (file)
@@ -1221,7 +1221,7 @@ static void ib_ucm_release_class_dev(struct class_device *class_dev)
        kfree(dev);
 }
 
-static struct file_operations ucm_fops = {
+static const struct file_operations ucm_fops = {
        .owner   = THIS_MODULE,
        .open    = ib_ucm_open,
        .release = ib_ucm_close,
index e2e8d329b44389cd04230c55853db3f55f75a07b..6b81b98961c7b8014120cfd79cf939f478778e12 100644 (file)
@@ -833,7 +833,7 @@ static int ucma_close(struct inode *inode, struct file *filp)
        return 0;
 }
 
-static struct file_operations ucma_fops = {
+static const struct file_operations ucma_fops = {
        .owner   = THIS_MODULE,
        .open    = ucma_open,
        .release = ucma_close,
index 807fbd6b84140b99152aa52f978412827692bc5e..c069ebeba8e33c18746459830b05c61d8469bd45 100644 (file)
@@ -771,7 +771,7 @@ static int ib_umad_close(struct inode *inode, struct file *filp)
        return 0;
 }
 
-static struct file_operations umad_fops = {
+static const struct file_operations umad_fops = {
        .owner          = THIS_MODULE,
        .read           = ib_umad_read,
        .write          = ib_umad_write,
@@ -846,7 +846,7 @@ static int ib_umad_sm_close(struct inode *inode, struct file *filp)
        return ret;
 }
 
-static struct file_operations umad_sm_fops = {
+static const struct file_operations umad_sm_fops = {
        .owner   = THIS_MODULE,
        .open    = ib_umad_sm_open,
        .release = ib_umad_sm_close
index a617ca7b69236d8e2a35bfbec52bc4b0c55dc16e..f8bc822a3cc3cca4ab26249e48a639670e397636 100644 (file)
@@ -375,7 +375,7 @@ static int ib_uverbs_event_close(struct inode *inode, struct file *filp)
        return 0;
 }
 
-static struct file_operations uverbs_event_fops = {
+static const struct file_operations uverbs_event_fops = {
        .owner   = THIS_MODULE,
        .read    = ib_uverbs_event_read,
        .poll    = ib_uverbs_event_poll,
@@ -679,14 +679,14 @@ static int ib_uverbs_close(struct inode *inode, struct file *filp)
        return 0;
 }
 
-static struct file_operations uverbs_fops = {
+static const struct file_operations uverbs_fops = {
        .owner   = THIS_MODULE,
        .write   = ib_uverbs_write,
        .open    = ib_uverbs_open,
        .release = ib_uverbs_close
 };
 
-static struct file_operations uverbs_mmap_fops = {
+static const struct file_operations uverbs_mmap_fops = {
        .owner   = THIS_MODULE,
        .write   = ib_uverbs_write,
        .mmap    = ib_uverbs_mmap,
index 27fe242ed4353bc33fdb76410c9dcc4fd6cb6b30..59243d9aedd6e93ee07d88a189d2a5878a959b84 100644 (file)
@@ -1073,7 +1073,7 @@ static int __devinit c2_probe(struct pci_dev *pcidev,
             0xffffc000) / sizeof(struct c2_rxp_desc);
 
        /* Request an interrupt line for the driver */
-       ret = request_irq(pcidev->irq, c2_interrupt, SA_SHIRQ, DRV_NAME, c2dev);
+       ret = request_irq(pcidev->irq, c2_interrupt, IRQF_SHARED, DRV_NAME, c2dev);
        if (ret) {
                printk(KERN_ERR PFX "%s: requested IRQ %u is busy\n",
                        pci_name(pcidev), pcidev->irq);
diff --git a/drivers/infiniband/hw/cxgb3/Kconfig b/drivers/infiniband/hw/cxgb3/Kconfig
new file mode 100644 (file)
index 0000000..77977f5
--- /dev/null
@@ -0,0 +1,27 @@
+config INFINIBAND_CXGB3
+       tristate "Chelsio RDMA Driver"
+       depends on CHELSIO_T3 && INFINIBAND && INET
+       select GENERIC_ALLOCATOR
+       ---help---
+         This is an iWARP/RDMA driver for the Chelsio T3 1GbE and
+         10GbE adapters.
+
+         For general information about Chelsio and our products, visit
+         our website at <http://www.chelsio.com>.
+
+         For customer support, please visit our customer support page at
+         <http://www.chelsio.com/support.htm>.
+
+         Please send feedback to <linux-bugs@chelsio.com>.
+
+         To compile this driver as a module, choose M here: the module
+         will be called iw_cxgb3.
+
+config INFINIBAND_CXGB3_DEBUG
+       bool "Verbose debugging output"
+       depends on INFINIBAND_CXGB3
+       default n
+       ---help---
+         This option causes the Chelsio RDMA driver to produce copious
+         amounts of debug messages.  Select this if you are developing
+         the driver or trying to diagnose a problem.
diff --git a/drivers/infiniband/hw/cxgb3/Makefile b/drivers/infiniband/hw/cxgb3/Makefile
new file mode 100644 (file)
index 0000000..0e110f3
--- /dev/null
@@ -0,0 +1,12 @@
+EXTRA_CFLAGS += -I$(TOPDIR)/drivers/net/cxgb3 \
+               -I$(TOPDIR)/drivers/infiniband/hw/cxgb3/core
+
+obj-$(CONFIG_INFINIBAND_CXGB3) += iw_cxgb3.o
+
+iw_cxgb3-y :=  iwch_cm.o iwch_ev.o iwch_cq.o iwch_qp.o iwch_mem.o \
+              iwch_provider.o iwch.o cxio_hal.o cxio_resource.o
+
+ifdef CONFIG_INFINIBAND_CXGB3_DEBUG
+EXTRA_CFLAGS += -DDEBUG
+iw_cxgb3-y += cxio_dbg.o
+endif
diff --git a/drivers/infiniband/hw/cxgb3/cxio_dbg.c b/drivers/infiniband/hw/cxgb3/cxio_dbg.c
new file mode 100644 (file)
index 0000000..5a7306f
--- /dev/null
@@ -0,0 +1,207 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifdef DEBUG
+#include <linux/types.h>
+#include "common.h"
+#include "cxgb3_ioctl.h"
+#include "cxio_hal.h"
+#include "cxio_wr.h"
+
+void cxio_dump_tpt(struct cxio_rdev *rdev, u32 stag)
+{
+       struct ch_mem_range *m;
+       u64 *data;
+       int rc;
+       int size = 32;
+
+       m = kmalloc(sizeof(*m) + size, GFP_ATOMIC);
+       if (!m) {
+               PDBG("%s couldn't allocate memory.\n", __FUNCTION__);
+               return;
+       }
+       m->mem_id = MEM_PMRX;
+       m->addr = (stag>>8) * 32 + rdev->rnic_info.tpt_base;
+       m->len = size;
+       PDBG("%s TPT addr 0x%x len %d\n", __FUNCTION__, m->addr, m->len);
+       rc = rdev->t3cdev_p->ctl(rdev->t3cdev_p, RDMA_GET_MEM, m);
+       if (rc) {
+               PDBG("%s toectl returned error %d\n", __FUNCTION__, rc);
+               kfree(m);
+               return;
+       }
+
+       data = (u64 *)m->buf;
+       while (size > 0) {
+               PDBG("TPT %08x: %016llx\n", m->addr, (unsigned long long) *data);
+               size -= 8;
+               data++;
+               m->addr += 8;
+       }
+       kfree(m);
+}
+
+void cxio_dump_pbl(struct cxio_rdev *rdev, u32 pbl_addr, uint len, u8 shift)
+{
+       struct ch_mem_range *m;
+       u64 *data;
+       int rc;
+       int size, npages;
+
+       shift += 12;
+       npages = (len + (1ULL << shift) - 1) >> shift;
+       size = npages * sizeof(u64);
+
+       m = kmalloc(sizeof(*m) + size, GFP_ATOMIC);
+       if (!m) {
+               PDBG("%s couldn't allocate memory.\n", __FUNCTION__);
+               return;
+       }
+       m->mem_id = MEM_PMRX;
+       m->addr = pbl_addr;
+       m->len = size;
+       PDBG("%s PBL addr 0x%x len %d depth %d\n",
+               __FUNCTION__, m->addr, m->len, npages);
+       rc = rdev->t3cdev_p->ctl(rdev->t3cdev_p, RDMA_GET_MEM, m);
+       if (rc) {
+               PDBG("%s toectl returned error %d\n", __FUNCTION__, rc);
+               kfree(m);
+               return;
+       }
+
+       data = (u64 *)m->buf;
+       while (size > 0) {
+               PDBG("PBL %08x: %016llx\n", m->addr, (unsigned long long) *data);
+               size -= 8;
+               data++;
+               m->addr += 8;
+       }
+       kfree(m);
+}
+
+void cxio_dump_wqe(union t3_wr *wqe)
+{
+       __be64 *data = (__be64 *)wqe;
+       uint size = (uint)(be64_to_cpu(*data) & 0xff);
+
+       if (size == 0)
+               size = 8;
+       while (size > 0) {
+               PDBG("WQE %p: %016llx\n", data,
+                    (unsigned long long) be64_to_cpu(*data));
+               size--;
+               data++;
+       }
+}
+
+void cxio_dump_wce(struct t3_cqe *wce)
+{
+       __be64 *data = (__be64 *)wce;
+       int size = sizeof(*wce);
+
+       while (size > 0) {
+               PDBG("WCE %p: %016llx\n", data,
+                    (unsigned long long) be64_to_cpu(*data));
+               size -= 8;
+               data++;
+       }
+}
+
+void cxio_dump_rqt(struct cxio_rdev *rdev, u32 hwtid, int nents)
+{
+       struct ch_mem_range *m;
+       int size = nents * 64;
+       u64 *data;
+       int rc;
+
+       m = kmalloc(sizeof(*m) + size, GFP_ATOMIC);
+       if (!m) {
+               PDBG("%s couldn't allocate memory.\n", __FUNCTION__);
+               return;
+       }
+       m->mem_id = MEM_PMRX;
+       m->addr = ((hwtid)<<10) + rdev->rnic_info.rqt_base;
+       m->len = size;
+       PDBG("%s RQT addr 0x%x len %d\n", __FUNCTION__, m->addr, m->len);
+       rc = rdev->t3cdev_p->ctl(rdev->t3cdev_p, RDMA_GET_MEM, m);
+       if (rc) {
+               PDBG("%s toectl returned error %d\n", __FUNCTION__, rc);
+               kfree(m);
+               return;
+       }
+
+       data = (u64 *)m->buf;
+       while (size > 0) {
+               PDBG("RQT %08x: %016llx\n", m->addr, (unsigned long long) *data);
+               size -= 8;
+               data++;
+               m->addr += 8;
+       }
+       kfree(m);
+}
+
+void cxio_dump_tcb(struct cxio_rdev *rdev, u32 hwtid)
+{
+       struct ch_mem_range *m;
+       int size = TCB_SIZE;
+       u32 *data;
+       int rc;
+
+       m = kmalloc(sizeof(*m) + size, GFP_ATOMIC);
+       if (!m) {
+               PDBG("%s couldn't allocate memory.\n", __FUNCTION__);
+               return;
+       }
+       m->mem_id = MEM_CM;
+       m->addr = hwtid * size;
+       m->len = size;
+       PDBG("%s TCB %d len %d\n", __FUNCTION__, m->addr, m->len);
+       rc = rdev->t3cdev_p->ctl(rdev->t3cdev_p, RDMA_GET_MEM, m);
+       if (rc) {
+               PDBG("%s toectl returned error %d\n", __FUNCTION__, rc);
+               kfree(m);
+               return;
+       }
+
+       data = (u32 *)m->buf;
+       while (size > 0) {
+               printk("%2u: %08x %08x %08x %08x %08x %08x %08x %08x\n",
+                       m->addr,
+                       *(data+2), *(data+3), *(data),*(data+1),
+                       *(data+6), *(data+7), *(data+4), *(data+5));
+               size -= 32;
+               data += 8;
+               m->addr += 32;
+       }
+       kfree(m);
+}
+#endif
diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.c b/drivers/infiniband/hw/cxgb3/cxio_hal.c
new file mode 100644 (file)
index 0000000..82fa720
--- /dev/null
@@ -0,0 +1,1280 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include <asm/delay.h>
+
+#include <linux/mutex.h>
+#include <linux/netdevice.h>
+#include <linux/sched.h>
+#include <linux/spinlock.h>
+#include <linux/pci.h>
+
+#include "cxio_resource.h"
+#include "cxio_hal.h"
+#include "cxgb3_offload.h"
+#include "sge_defs.h"
+
+static LIST_HEAD(rdev_list);
+static cxio_hal_ev_callback_func_t cxio_ev_cb = NULL;
+
+static inline struct cxio_rdev *cxio_hal_find_rdev_by_name(char *dev_name)
+{
+       struct cxio_rdev *rdev;
+
+       list_for_each_entry(rdev, &rdev_list, entry)
+               if (!strcmp(rdev->dev_name, dev_name))
+                       return rdev;
+       return NULL;
+}
+
+static inline struct cxio_rdev *cxio_hal_find_rdev_by_t3cdev(struct t3cdev
+                                                            *tdev)
+{
+       struct cxio_rdev *rdev;
+
+       list_for_each_entry(rdev, &rdev_list, entry)
+               if (rdev->t3cdev_p == tdev)
+                       return rdev;
+       return NULL;
+}
+
+int cxio_hal_cq_op(struct cxio_rdev *rdev_p, struct t3_cq *cq,
+                  enum t3_cq_opcode op, u32 credit)
+{
+       int ret;
+       struct t3_cqe *cqe;
+       u32 rptr;
+
+       struct rdma_cq_op setup;
+       setup.id = cq->cqid;
+       setup.credits = (op == CQ_CREDIT_UPDATE) ? credit : 0;
+       setup.op = op;
+       ret = rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, RDMA_CQ_OP, &setup);
+
+       if ((ret < 0) || (op == CQ_CREDIT_UPDATE))
+               return ret;
+
+       /*
+        * If the rearm returned an index other than our current index,
+        * then there might be CQE's in flight (being DMA'd).  We must wait
+        * here for them to complete or the consumer can miss a notification.
+        */
+       if (Q_PTR2IDX((cq->rptr), cq->size_log2) != ret) {
+               int i=0;
+
+               rptr = cq->rptr;
+
+               /*
+                * Keep the generation correct by bumping rptr until it
+                * matches the index returned by the rearm - 1.
+                */
+               while (Q_PTR2IDX((rptr+1), cq->size_log2) != ret)
+                       rptr++;
+
+               /*
+                * Now rptr is the index for the (last) cqe that was
+                * in-flight at the time the HW rearmed the CQ.  We
+                * spin until that CQE is valid.
+                */
+               cqe = cq->queue + Q_PTR2IDX(rptr, cq->size_log2);
+               while (!CQ_VLD_ENTRY(rptr, cq->size_log2, cqe)) {
+                       udelay(1);
+                       if (i++ > 1000000) {
+                               BUG_ON(1);
+                               printk(KERN_ERR "%s: stalled rnic\n",
+                                      rdev_p->dev_name);
+                               return -EIO;
+                       }
+               }
+       }
+       return 0;
+}
+
+static inline int cxio_hal_clear_cq_ctx(struct cxio_rdev *rdev_p, u32 cqid)
+{
+       struct rdma_cq_setup setup;
+       setup.id = cqid;
+       setup.base_addr = 0;    /* NULL address */
+       setup.size = 0;         /* disaable the CQ */
+       setup.credits = 0;
+       setup.credit_thres = 0;
+       setup.ovfl_mode = 0;
+       return (rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, RDMA_CQ_SETUP, &setup));
+}
+
+int cxio_hal_clear_qp_ctx(struct cxio_rdev *rdev_p, u32 qpid)
+{
+       u64 sge_cmd;
+       struct t3_modify_qp_wr *wqe;
+       struct sk_buff *skb = alloc_skb(sizeof(*wqe), GFP_KERNEL);
+       if (!skb) {
+               PDBG("%s alloc_skb failed\n", __FUNCTION__);
+               return -ENOMEM;
+       }
+       wqe = (struct t3_modify_qp_wr *) skb_put(skb, sizeof(*wqe));
+       memset(wqe, 0, sizeof(*wqe));
+       build_fw_riwrh((struct fw_riwrh *) wqe, T3_WR_QP_MOD, 3, 1, qpid, 7);
+       wqe->flags = cpu_to_be32(MODQP_WRITE_EC);
+       sge_cmd = qpid << 8 | 3;
+       wqe->sge_cmd = cpu_to_be64(sge_cmd);
+       skb->priority = CPL_PRIORITY_CONTROL;
+       return (cxgb3_ofld_send(rdev_p->t3cdev_p, skb));
+}
+
+int cxio_create_cq(struct cxio_rdev *rdev_p, struct t3_cq *cq)
+{
+       struct rdma_cq_setup setup;
+       int size = (1UL << (cq->size_log2)) * sizeof(struct t3_cqe);
+
+       cq->cqid = cxio_hal_get_cqid(rdev_p->rscp);
+       if (!cq->cqid)
+               return -ENOMEM;
+       cq->sw_queue = kzalloc(size, GFP_KERNEL);
+       if (!cq->sw_queue)
+               return -ENOMEM;
+       cq->queue = dma_alloc_coherent(&(rdev_p->rnic_info.pdev->dev),
+                                            (1UL << (cq->size_log2)) *
+                                            sizeof(struct t3_cqe),
+                                            &(cq->dma_addr), GFP_KERNEL);
+       if (!cq->queue) {
+               kfree(cq->sw_queue);
+               return -ENOMEM;
+       }
+       pci_unmap_addr_set(cq, mapping, cq->dma_addr);
+       memset(cq->queue, 0, size);
+       setup.id = cq->cqid;
+       setup.base_addr = (u64) (cq->dma_addr);
+       setup.size = 1UL << cq->size_log2;
+       setup.credits = 65535;
+       setup.credit_thres = 1;
+       if (rdev_p->t3cdev_p->type == T3B)
+               setup.ovfl_mode = 0;
+       else
+               setup.ovfl_mode = 1;
+       return (rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, RDMA_CQ_SETUP, &setup));
+}
+
+int cxio_resize_cq(struct cxio_rdev *rdev_p, struct t3_cq *cq)
+{
+       struct rdma_cq_setup setup;
+       setup.id = cq->cqid;
+       setup.base_addr = (u64) (cq->dma_addr);
+       setup.size = 1UL << cq->size_log2;
+       setup.credits = setup.size;
+       setup.credit_thres = setup.size;        /* TBD: overflow recovery */
+       setup.ovfl_mode = 1;
+       return (rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, RDMA_CQ_SETUP, &setup));
+}
+
+static u32 get_qpid(struct cxio_rdev *rdev_p, struct cxio_ucontext *uctx)
+{
+       struct cxio_qpid_list *entry;
+       u32 qpid;
+       int i;
+
+       mutex_lock(&uctx->lock);
+       if (!list_empty(&uctx->qpids)) {
+               entry = list_entry(uctx->qpids.next, struct cxio_qpid_list,
+                                  entry);
+               list_del(&entry->entry);
+               qpid = entry->qpid;
+               kfree(entry);
+       } else {
+               qpid = cxio_hal_get_qpid(rdev_p->rscp);
+               if (!qpid)
+                       goto out;
+               for (i = qpid+1; i & rdev_p->qpmask; i++) {
+                       entry = kmalloc(sizeof *entry, GFP_KERNEL);
+                       if (!entry)
+                               break;
+                       entry->qpid = i;
+                       list_add_tail(&entry->entry, &uctx->qpids);
+               }
+       }
+out:
+       mutex_unlock(&uctx->lock);
+       PDBG("%s qpid 0x%x\n", __FUNCTION__, qpid);
+       return qpid;
+}
+
+static void put_qpid(struct cxio_rdev *rdev_p, u32 qpid,
+                    struct cxio_ucontext *uctx)
+{
+       struct cxio_qpid_list *entry;
+
+       entry = kmalloc(sizeof *entry, GFP_KERNEL);
+       if (!entry)
+               return;
+       PDBG("%s qpid 0x%x\n", __FUNCTION__, qpid);
+       entry->qpid = qpid;
+       mutex_lock(&uctx->lock);
+       list_add_tail(&entry->entry, &uctx->qpids);
+       mutex_unlock(&uctx->lock);
+}
+
+void cxio_release_ucontext(struct cxio_rdev *rdev_p, struct cxio_ucontext *uctx)
+{
+       struct list_head *pos, *nxt;
+       struct cxio_qpid_list *entry;
+
+       mutex_lock(&uctx->lock);
+       list_for_each_safe(pos, nxt, &uctx->qpids) {
+               entry = list_entry(pos, struct cxio_qpid_list, entry);
+               list_del_init(&entry->entry);
+               if (!(entry->qpid & rdev_p->qpmask))
+                       cxio_hal_put_qpid(rdev_p->rscp, entry->qpid);
+               kfree(entry);
+       }
+       mutex_unlock(&uctx->lock);
+}
+
+void cxio_init_ucontext(struct cxio_rdev *rdev_p, struct cxio_ucontext *uctx)
+{
+       INIT_LIST_HEAD(&uctx->qpids);
+       mutex_init(&uctx->lock);
+}
+
+int cxio_create_qp(struct cxio_rdev *rdev_p, u32 kernel_domain,
+                  struct t3_wq *wq, struct cxio_ucontext *uctx)
+{
+       int depth = 1UL << wq->size_log2;
+       int rqsize = 1UL << wq->rq_size_log2;
+
+       wq->qpid = get_qpid(rdev_p, uctx);
+       if (!wq->qpid)
+               return -ENOMEM;
+
+       wq->rq = kzalloc(depth * sizeof(u64), GFP_KERNEL);
+       if (!wq->rq)
+               goto err1;
+
+       wq->rq_addr = cxio_hal_rqtpool_alloc(rdev_p, rqsize);
+       if (!wq->rq_addr)
+               goto err2;
+
+       wq->sq = kzalloc(depth * sizeof(struct t3_swsq), GFP_KERNEL);
+       if (!wq->sq)
+               goto err3;
+
+       wq->queue = dma_alloc_coherent(&(rdev_p->rnic_info.pdev->dev),
+                                            depth * sizeof(union t3_wr),
+                                            &(wq->dma_addr), GFP_KERNEL);
+       if (!wq->queue)
+               goto err4;
+
+       memset(wq->queue, 0, depth * sizeof(union t3_wr));
+       pci_unmap_addr_set(wq, mapping, wq->dma_addr);
+       wq->doorbell = (void __iomem *)rdev_p->rnic_info.kdb_addr;
+       if (!kernel_domain)
+               wq->udb = (u64)rdev_p->rnic_info.udbell_physbase +
+                                       (wq->qpid << rdev_p->qpshift);
+       PDBG("%s qpid 0x%x doorbell 0x%p udb 0x%llx\n", __FUNCTION__,
+            wq->qpid, wq->doorbell, (unsigned long long) wq->udb);
+       return 0;
+err4:
+       kfree(wq->sq);
+err3:
+       cxio_hal_rqtpool_free(rdev_p, wq->rq_addr, rqsize);
+err2:
+       kfree(wq->rq);
+err1:
+       put_qpid(rdev_p, wq->qpid, uctx);
+       return -ENOMEM;
+}
+
+int cxio_destroy_cq(struct cxio_rdev *rdev_p, struct t3_cq *cq)
+{
+       int err;
+       err = cxio_hal_clear_cq_ctx(rdev_p, cq->cqid);
+       kfree(cq->sw_queue);
+       dma_free_coherent(&(rdev_p->rnic_info.pdev->dev),
+                         (1UL << (cq->size_log2))
+                         * sizeof(struct t3_cqe), cq->queue,
+                         pci_unmap_addr(cq, mapping));
+       cxio_hal_put_cqid(rdev_p->rscp, cq->cqid);
+       return err;
+}
+
+int cxio_destroy_qp(struct cxio_rdev *rdev_p, struct t3_wq *wq,
+                   struct cxio_ucontext *uctx)
+{
+       dma_free_coherent(&(rdev_p->rnic_info.pdev->dev),
+                         (1UL << (wq->size_log2))
+                         * sizeof(union t3_wr), wq->queue,
+                         pci_unmap_addr(wq, mapping));
+       kfree(wq->sq);
+       cxio_hal_rqtpool_free(rdev_p, wq->rq_addr, (1UL << wq->rq_size_log2));
+       kfree(wq->rq);
+       put_qpid(rdev_p, wq->qpid, uctx);
+       return 0;
+}
+
+static void insert_recv_cqe(struct t3_wq *wq, struct t3_cq *cq)
+{
+       struct t3_cqe cqe;
+
+       PDBG("%s wq %p cq %p sw_rptr 0x%x sw_wptr 0x%x\n", __FUNCTION__,
+            wq, cq, cq->sw_rptr, cq->sw_wptr);
+       memset(&cqe, 0, sizeof(cqe));
+       cqe.header = cpu_to_be32(V_CQE_STATUS(TPT_ERR_SWFLUSH) |
+                                V_CQE_OPCODE(T3_SEND) |
+                                V_CQE_TYPE(0) |
+                                V_CQE_SWCQE(1) |
+                                V_CQE_QPID(wq->qpid) |
+                                V_CQE_GENBIT(Q_GENBIT(cq->sw_wptr,
+                                                      cq->size_log2)));
+       *(cq->sw_queue + Q_PTR2IDX(cq->sw_wptr, cq->size_log2)) = cqe;
+       cq->sw_wptr++;
+}
+
+void cxio_flush_rq(struct t3_wq *wq, struct t3_cq *cq, int count)
+{
+       u32 ptr;
+
+       PDBG("%s wq %p cq %p\n", __FUNCTION__, wq, cq);
+
+       /* flush RQ */
+       PDBG("%s rq_rptr %u rq_wptr %u skip count %u\n", __FUNCTION__,
+           wq->rq_rptr, wq->rq_wptr, count);
+       ptr = wq->rq_rptr + count;
+       while (ptr++ != wq->rq_wptr)
+               insert_recv_cqe(wq, cq);
+}
+
+static void insert_sq_cqe(struct t3_wq *wq, struct t3_cq *cq,
+                         struct t3_swsq *sqp)
+{
+       struct t3_cqe cqe;
+
+       PDBG("%s wq %p cq %p sw_rptr 0x%x sw_wptr 0x%x\n", __FUNCTION__,
+            wq, cq, cq->sw_rptr, cq->sw_wptr);
+       memset(&cqe, 0, sizeof(cqe));
+       cqe.header = cpu_to_be32(V_CQE_STATUS(TPT_ERR_SWFLUSH) |
+                                V_CQE_OPCODE(sqp->opcode) |
+                                V_CQE_TYPE(1) |
+                                V_CQE_SWCQE(1) |
+                                V_CQE_QPID(wq->qpid) |
+                                V_CQE_GENBIT(Q_GENBIT(cq->sw_wptr,
+                                                      cq->size_log2)));
+       cqe.u.scqe.wrid_hi = sqp->sq_wptr;
+
+       *(cq->sw_queue + Q_PTR2IDX(cq->sw_wptr, cq->size_log2)) = cqe;
+       cq->sw_wptr++;
+}
+
+void cxio_flush_sq(struct t3_wq *wq, struct t3_cq *cq, int count)
+{
+       __u32 ptr;
+       struct t3_swsq *sqp = wq->sq + Q_PTR2IDX(wq->sq_rptr, wq->sq_size_log2);
+
+       ptr = wq->sq_rptr + count;
+       sqp += count;
+       while (ptr != wq->sq_wptr) {
+               insert_sq_cqe(wq, cq, sqp);
+               sqp++;
+               ptr++;
+       }
+}
+
+/*
+ * Move all CQEs from the HWCQ into the SWCQ.
+ */
+void cxio_flush_hw_cq(struct t3_cq *cq)
+{
+       struct t3_cqe *cqe, *swcqe;
+
+       PDBG("%s cq %p cqid 0x%x\n", __FUNCTION__, cq, cq->cqid);
+       cqe = cxio_next_hw_cqe(cq);
+       while (cqe) {
+               PDBG("%s flushing hwcq rptr 0x%x to swcq wptr 0x%x\n",
+                    __FUNCTION__, cq->rptr, cq->sw_wptr);
+               swcqe = cq->sw_queue + Q_PTR2IDX(cq->sw_wptr, cq->size_log2);
+               *swcqe = *cqe;
+               swcqe->header |= cpu_to_be32(V_CQE_SWCQE(1));
+               cq->sw_wptr++;
+               cq->rptr++;
+               cqe = cxio_next_hw_cqe(cq);
+       }
+}
+
+static inline int cqe_completes_wr(struct t3_cqe *cqe, struct t3_wq *wq)
+{
+       if (CQE_OPCODE(*cqe) == T3_TERMINATE)
+               return 0;
+
+       if ((CQE_OPCODE(*cqe) == T3_RDMA_WRITE) && RQ_TYPE(*cqe))
+               return 0;
+
+       if ((CQE_OPCODE(*cqe) == T3_READ_RESP) && SQ_TYPE(*cqe))
+               return 0;
+
+       if ((CQE_OPCODE(*cqe) == T3_SEND) && RQ_TYPE(*cqe) &&
+           Q_EMPTY(wq->rq_rptr, wq->rq_wptr))
+               return 0;
+
+       return 1;
+}
+
+void cxio_count_scqes(struct t3_cq *cq, struct t3_wq *wq, int *count)
+{
+       struct t3_cqe *cqe;
+       u32 ptr;
+
+       *count = 0;
+       ptr = cq->sw_rptr;
+       while (!Q_EMPTY(ptr, cq->sw_wptr)) {
+               cqe = cq->sw_queue + (Q_PTR2IDX(ptr, cq->size_log2));
+               if ((SQ_TYPE(*cqe) || (CQE_OPCODE(*cqe) == T3_READ_RESP)) &&
+                   (CQE_QPID(*cqe) == wq->qpid))
+                       (*count)++;
+               ptr++;
+       }
+       PDBG("%s cq %p count %d\n", __FUNCTION__, cq, *count);
+}
+
+void cxio_count_rcqes(struct t3_cq *cq, struct t3_wq *wq, int *count)
+{
+       struct t3_cqe *cqe;
+       u32 ptr;
+
+       *count = 0;
+       PDBG("%s count zero %d\n", __FUNCTION__, *count);
+       ptr = cq->sw_rptr;
+       while (!Q_EMPTY(ptr, cq->sw_wptr)) {
+               cqe = cq->sw_queue + (Q_PTR2IDX(ptr, cq->size_log2));
+               if (RQ_TYPE(*cqe) && (CQE_OPCODE(*cqe) != T3_READ_RESP) &&
+                   (CQE_QPID(*cqe) == wq->qpid) && cqe_completes_wr(cqe, wq))
+                       (*count)++;
+               ptr++;
+       }
+       PDBG("%s cq %p count %d\n", __FUNCTION__, cq, *count);
+}
+
+static int cxio_hal_init_ctrl_cq(struct cxio_rdev *rdev_p)
+{
+       struct rdma_cq_setup setup;
+       setup.id = 0;
+       setup.base_addr = 0;    /* NULL address */
+       setup.size = 1;         /* enable the CQ */
+       setup.credits = 0;
+
+       /* force SGE to redirect to RspQ and interrupt */
+       setup.credit_thres = 0;
+       setup.ovfl_mode = 1;
+       return (rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, RDMA_CQ_SETUP, &setup));
+}
+
+static int cxio_hal_init_ctrl_qp(struct cxio_rdev *rdev_p)
+{
+       int err;
+       u64 sge_cmd, ctx0, ctx1;
+       u64 base_addr;
+       struct t3_modify_qp_wr *wqe;
+       struct sk_buff *skb = alloc_skb(sizeof(*wqe), GFP_KERNEL);
+
+
+       if (!skb) {
+               PDBG("%s alloc_skb failed\n", __FUNCTION__);
+               return -ENOMEM;
+       }
+       err = cxio_hal_init_ctrl_cq(rdev_p);
+       if (err) {
+               PDBG("%s err %d initializing ctrl_cq\n", __FUNCTION__, err);
+               return err;
+       }
+       rdev_p->ctrl_qp.workq = dma_alloc_coherent(
+                                       &(rdev_p->rnic_info.pdev->dev),
+                                       (1 << T3_CTRL_QP_SIZE_LOG2) *
+                                       sizeof(union t3_wr),
+                                       &(rdev_p->ctrl_qp.dma_addr),
+                                       GFP_KERNEL);
+       if (!rdev_p->ctrl_qp.workq) {
+               PDBG("%s dma_alloc_coherent failed\n", __FUNCTION__);
+               return -ENOMEM;
+       }
+       pci_unmap_addr_set(&rdev_p->ctrl_qp, mapping,
+                          rdev_p->ctrl_qp.dma_addr);
+       rdev_p->ctrl_qp.doorbell = (void __iomem *)rdev_p->rnic_info.kdb_addr;
+       memset(rdev_p->ctrl_qp.workq, 0,
+              (1 << T3_CTRL_QP_SIZE_LOG2) * sizeof(union t3_wr));
+
+       mutex_init(&rdev_p->ctrl_qp.lock);
+       init_waitqueue_head(&rdev_p->ctrl_qp.waitq);
+
+       /* update HW Ctrl QP context */
+       base_addr = rdev_p->ctrl_qp.dma_addr;
+       base_addr >>= 12;
+       ctx0 = (V_EC_SIZE((1 << T3_CTRL_QP_SIZE_LOG2)) |
+               V_EC_BASE_LO((u32) base_addr & 0xffff));
+       ctx0 <<= 32;
+       ctx0 |= V_EC_CREDITS(FW_WR_NUM);
+       base_addr >>= 16;
+       ctx1 = (u32) base_addr;
+       base_addr >>= 32;
+       ctx1 |= ((u64) (V_EC_BASE_HI((u32) base_addr & 0xf) | V_EC_RESPQ(0) |
+                       V_EC_TYPE(0) | V_EC_GEN(1) |
+                       V_EC_UP_TOKEN(T3_CTL_QP_TID) | F_EC_VALID)) << 32;
+       wqe = (struct t3_modify_qp_wr *) skb_put(skb, sizeof(*wqe));
+       memset(wqe, 0, sizeof(*wqe));
+       build_fw_riwrh((struct fw_riwrh *) wqe, T3_WR_QP_MOD, 0, 1,
+                      T3_CTL_QP_TID, 7);
+       wqe->flags = cpu_to_be32(MODQP_WRITE_EC);
+       sge_cmd = (3ULL << 56) | FW_RI_SGEEC_START << 8 | 3;
+       wqe->sge_cmd = cpu_to_be64(sge_cmd);
+       wqe->ctx1 = cpu_to_be64(ctx1);
+       wqe->ctx0 = cpu_to_be64(ctx0);
+       PDBG("CtrlQP dma_addr 0x%llx workq %p size %d\n",
+            (unsigned long long) rdev_p->ctrl_qp.dma_addr,
+            rdev_p->ctrl_qp.workq, 1 << T3_CTRL_QP_SIZE_LOG2);
+       skb->priority = CPL_PRIORITY_CONTROL;
+       return (cxgb3_ofld_send(rdev_p->t3cdev_p, skb));
+}
+
+static int cxio_hal_destroy_ctrl_qp(struct cxio_rdev *rdev_p)
+{
+       dma_free_coherent(&(rdev_p->rnic_info.pdev->dev),
+                         (1UL << T3_CTRL_QP_SIZE_LOG2)
+                         * sizeof(union t3_wr), rdev_p->ctrl_qp.workq,
+                         pci_unmap_addr(&rdev_p->ctrl_qp, mapping));
+       return cxio_hal_clear_qp_ctx(rdev_p, T3_CTRL_QP_ID);
+}
+
+/* write len bytes of data into addr (32B aligned address)
+ * If data is NULL, clear len byte of memory to zero.
+ * caller aquires the ctrl_qp lock before the call
+ */
+static int cxio_hal_ctrl_qp_write_mem(struct cxio_rdev *rdev_p, u32 addr,
+                                     u32 len, void *data, int completion)
+{
+       u32 i, nr_wqe, copy_len;
+       u8 *copy_data;
+       u8 wr_len, utx_len;     /* lenght in 8 byte flit */
+       enum t3_wr_flags flag;
+       __be64 *wqe;
+       u64 utx_cmd;
+       addr &= 0x7FFFFFF;
+       nr_wqe = len % 96 ? len / 96 + 1 : len / 96;    /* 96B max per WQE */
+       PDBG("%s wptr 0x%x rptr 0x%x len %d, nr_wqe %d data %p addr 0x%0x\n",
+            __FUNCTION__, rdev_p->ctrl_qp.wptr, rdev_p->ctrl_qp.rptr, len,
+            nr_wqe, data, addr);
+       utx_len = 3;            /* in 32B unit */
+       for (i = 0; i < nr_wqe; i++) {
+               if (Q_FULL(rdev_p->ctrl_qp.rptr, rdev_p->ctrl_qp.wptr,
+                          T3_CTRL_QP_SIZE_LOG2)) {
+                       PDBG("%s ctrl_qp full wtpr 0x%0x rptr 0x%0x, "
+                            "wait for more space i %d\n", __FUNCTION__,
+                            rdev_p->ctrl_qp.wptr, rdev_p->ctrl_qp.rptr, i);
+                       if (wait_event_interruptible(rdev_p->ctrl_qp.waitq,
+                                            !Q_FULL(rdev_p->ctrl_qp.rptr,
+                                                    rdev_p->ctrl_qp.wptr,
+                                                    T3_CTRL_QP_SIZE_LOG2))) {
+                               PDBG("%s ctrl_qp workq interrupted\n",
+                                    __FUNCTION__);
+                               return -ERESTARTSYS;
+                       }
+                       PDBG("%s ctrl_qp wakeup, continue posting work request "
+                            "i %d\n", __FUNCTION__, i);
+               }
+               wqe = (__be64 *)(rdev_p->ctrl_qp.workq + (rdev_p->ctrl_qp.wptr %
+                                               (1 << T3_CTRL_QP_SIZE_LOG2)));
+               flag = 0;
+               if (i == (nr_wqe - 1)) {
+                       /* last WQE */
+                       flag = completion ? T3_COMPLETION_FLAG : 0;
+                       if (len % 32)
+                               utx_len = len / 32 + 1;
+                       else
+                               utx_len = len / 32;
+               }
+
+               /*
+                * Force a CQE to return the credit to the workq in case
+                * we posted more than half the max QP size of WRs
+                */
+               if ((i != 0) &&
+                   (i % (((1 << T3_CTRL_QP_SIZE_LOG2)) >> 1) == 0)) {
+                       flag = T3_COMPLETION_FLAG;
+                       PDBG("%s force completion at i %d\n", __FUNCTION__, i);
+               }
+
+               /* build the utx mem command */
+               wqe += (sizeof(struct t3_bypass_wr) >> 3);
+               utx_cmd = (T3_UTX_MEM_WRITE << 28) | (addr + i * 3);
+               utx_cmd <<= 32;
+               utx_cmd |= (utx_len << 28) | ((utx_len << 2) + 1);
+               *wqe = cpu_to_be64(utx_cmd);
+               wqe++;
+               copy_data = (u8 *) data + i * 96;
+               copy_len = len > 96 ? 96 : len;
+
+               /* clear memory content if data is NULL */
+               if (data)
+                       memcpy(wqe, copy_data, copy_len);
+               else
+                       memset(wqe, 0, copy_len);
+               if (copy_len % 32)
+                       memset(((u8 *) wqe) + copy_len, 0,
+                              32 - (copy_len % 32));
+               wr_len = ((sizeof(struct t3_bypass_wr)) >> 3) + 1 +
+                        (utx_len << 2);
+               wqe = (__be64 *)(rdev_p->ctrl_qp.workq + (rdev_p->ctrl_qp.wptr %
+                             (1 << T3_CTRL_QP_SIZE_LOG2)));
+
+               /* wptr in the WRID[31:0] */
+               ((union t3_wrid *)(wqe+1))->id0.low = rdev_p->ctrl_qp.wptr;
+
+               /*
+                * This must be the last write with a memory barrier
+                * for the genbit
+                */
+               build_fw_riwrh((struct fw_riwrh *) wqe, T3_WR_BP, flag,
+                              Q_GENBIT(rdev_p->ctrl_qp.wptr,
+                                       T3_CTRL_QP_SIZE_LOG2), T3_CTRL_QP_ID,
+                              wr_len);
+               if (flag == T3_COMPLETION_FLAG)
+                       ring_doorbell(rdev_p->ctrl_qp.doorbell, T3_CTRL_QP_ID);
+               len -= 96;
+               rdev_p->ctrl_qp.wptr++;
+       }
+       return 0;
+}
+
+/* IN: stag key, pdid, perm, zbva, to, len, page_size, pbl, and pbl_size
+ * OUT: stag index, actual pbl_size, pbl_addr allocated.
+ * TBD: shared memory region support
+ */
+static int __cxio_tpt_op(struct cxio_rdev *rdev_p, u32 reset_tpt_entry,
+                        u32 *stag, u8 stag_state, u32 pdid,
+                        enum tpt_mem_type type, enum tpt_mem_perm perm,
+                        u32 zbva, u64 to, u32 len, u8 page_size, __be64 *pbl,
+                        u32 *pbl_size, u32 *pbl_addr)
+{
+       int err;
+       struct tpt_entry tpt;
+       u32 stag_idx;
+       u32 wptr;
+       int rereg = (*stag != T3_STAG_UNSET);
+
+       stag_state = stag_state > 0;
+       stag_idx = (*stag) >> 8;
+
+       if ((!reset_tpt_entry) && !(*stag != T3_STAG_UNSET)) {
+               stag_idx = cxio_hal_get_stag(rdev_p->rscp);
+               if (!stag_idx)
+                       return -ENOMEM;
+               *stag = (stag_idx << 8) | ((*stag) & 0xFF);
+       }
+       PDBG("%s stag_state 0x%0x type 0x%0x pdid 0x%0x, stag_idx 0x%x\n",
+            __FUNCTION__, stag_state, type, pdid, stag_idx);
+
+       if (reset_tpt_entry)
+               cxio_hal_pblpool_free(rdev_p, *pbl_addr, *pbl_size << 3);
+       else if (!rereg) {
+               *pbl_addr = cxio_hal_pblpool_alloc(rdev_p, *pbl_size << 3);
+               if (!*pbl_addr) {
+                       return -ENOMEM;
+               }
+       }
+
+       mutex_lock(&rdev_p->ctrl_qp.lock);
+
+       /* write PBL first if any - update pbl only if pbl list exist */
+       if (pbl) {
+
+               PDBG("%s *pdb_addr 0x%x, pbl_base 0x%x, pbl_size %d\n",
+                    __FUNCTION__, *pbl_addr, rdev_p->rnic_info.pbl_base,
+                    *pbl_size);
+               err = cxio_hal_ctrl_qp_write_mem(rdev_p,
+                               (*pbl_addr >> 5),
+                               (*pbl_size << 3), pbl, 0);
+               if (err)
+                       goto ret;
+       }
+
+       /* write TPT entry */
+       if (reset_tpt_entry)
+               memset(&tpt, 0, sizeof(tpt));
+       else {
+               tpt.valid_stag_pdid = cpu_to_be32(F_TPT_VALID |
+                               V_TPT_STAG_KEY((*stag) & M_TPT_STAG_KEY) |
+                               V_TPT_STAG_STATE(stag_state) |
+                               V_TPT_STAG_TYPE(type) | V_TPT_PDID(pdid));
+               BUG_ON(page_size >= 28);
+               tpt.flags_pagesize_qpid = cpu_to_be32(V_TPT_PERM(perm) |
+                               F_TPT_MW_BIND_ENABLE |
+                               V_TPT_ADDR_TYPE((zbva ? TPT_ZBTO : TPT_VATO)) |
+                               V_TPT_PAGE_SIZE(page_size));
+               tpt.rsvd_pbl_addr = reset_tpt_entry ? 0 :
+                                   cpu_to_be32(V_TPT_PBL_ADDR(PBL_OFF(rdev_p, *pbl_addr)>>3));
+               tpt.len = cpu_to_be32(len);
+               tpt.va_hi = cpu_to_be32((u32) (to >> 32));
+               tpt.va_low_or_fbo = cpu_to_be32((u32) (to & 0xFFFFFFFFULL));
+               tpt.rsvd_bind_cnt_or_pstag = 0;
+               tpt.rsvd_pbl_size = reset_tpt_entry ? 0 :
+                                 cpu_to_be32(V_TPT_PBL_SIZE((*pbl_size) >> 2));
+       }
+       err = cxio_hal_ctrl_qp_write_mem(rdev_p,
+                                      stag_idx +
+                                      (rdev_p->rnic_info.tpt_base >> 5),
+                                      sizeof(tpt), &tpt, 1);
+
+       /* release the stag index to free pool */
+       if (reset_tpt_entry)
+               cxio_hal_put_stag(rdev_p->rscp, stag_idx);
+ret:
+       wptr = rdev_p->ctrl_qp.wptr;
+       mutex_unlock(&rdev_p->ctrl_qp.lock);
+       if (!err)
+               if (wait_event_interruptible(rdev_p->ctrl_qp.waitq,
+                                            SEQ32_GE(rdev_p->ctrl_qp.rptr,
+                                                     wptr)))
+                       return -ERESTARTSYS;
+       return err;
+}
+
+/* IN : stag key, pdid, pbl_size
+ * Out: stag index, actaul pbl_size, and pbl_addr allocated.
+ */
+int cxio_allocate_stag(struct cxio_rdev *rdev_p, u32 * stag, u32 pdid,
+                      enum tpt_mem_perm perm, u32 * pbl_size, u32 * pbl_addr)
+{
+       *stag = T3_STAG_UNSET;
+       return (__cxio_tpt_op(rdev_p, 0, stag, 0, pdid, TPT_NON_SHARED_MR,
+                             perm, 0, 0ULL, 0, 0, NULL, pbl_size, pbl_addr));
+}
+
+int cxio_register_phys_mem(struct cxio_rdev *rdev_p, u32 *stag, u32 pdid,
+                          enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len,
+                          u8 page_size, __be64 *pbl, u32 *pbl_size,
+                          u32 *pbl_addr)
+{
+       *stag = T3_STAG_UNSET;
+       return __cxio_tpt_op(rdev_p, 0, stag, 1, pdid, TPT_NON_SHARED_MR, perm,
+                            zbva, to, len, page_size, pbl, pbl_size, pbl_addr);
+}
+
+int cxio_reregister_phys_mem(struct cxio_rdev *rdev_p, u32 *stag, u32 pdid,
+                          enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len,
+                          u8 page_size, __be64 *pbl, u32 *pbl_size,
+                          u32 *pbl_addr)
+{
+       return __cxio_tpt_op(rdev_p, 0, stag, 1, pdid, TPT_NON_SHARED_MR, perm,
+                            zbva, to, len, page_size, pbl, pbl_size, pbl_addr);
+}
+
+int cxio_dereg_mem(struct cxio_rdev *rdev_p, u32 stag, u32 pbl_size,
+                  u32 pbl_addr)
+{
+       return __cxio_tpt_op(rdev_p, 1, &stag, 0, 0, 0, 0, 0, 0ULL, 0, 0, NULL,
+                            &pbl_size, &pbl_addr);
+}
+
+int cxio_allocate_window(struct cxio_rdev *rdev_p, u32 * stag, u32 pdid)
+{
+       u32 pbl_size = 0;
+       *stag = T3_STAG_UNSET;
+       return __cxio_tpt_op(rdev_p, 0, stag, 0, pdid, TPT_MW, 0, 0, 0ULL, 0, 0,
+                            NULL, &pbl_size, NULL);
+}
+
+int cxio_deallocate_window(struct cxio_rdev *rdev_p, u32 stag)
+{
+       return __cxio_tpt_op(rdev_p, 1, &stag, 0, 0, 0, 0, 0, 0ULL, 0, 0, NULL,
+                            NULL, NULL);
+}
+
+int cxio_rdma_init(struct cxio_rdev *rdev_p, struct t3_rdma_init_attr *attr)
+{
+       struct t3_rdma_init_wr *wqe;
+       struct sk_buff *skb = alloc_skb(sizeof(*wqe), GFP_ATOMIC);
+       if (!skb)
+               return -ENOMEM;
+       PDBG("%s rdev_p %p\n", __FUNCTION__, rdev_p);
+       wqe = (struct t3_rdma_init_wr *) __skb_put(skb, sizeof(*wqe));
+       wqe->wrh.op_seop_flags = cpu_to_be32(V_FW_RIWR_OP(T3_WR_INIT));
+       wqe->wrh.gen_tid_len = cpu_to_be32(V_FW_RIWR_TID(attr->tid) |
+                                          V_FW_RIWR_LEN(sizeof(*wqe) >> 3));
+       wqe->wrid.id1 = 0;
+       wqe->qpid = cpu_to_be32(attr->qpid);
+       wqe->pdid = cpu_to_be32(attr->pdid);
+       wqe->scqid = cpu_to_be32(attr->scqid);
+       wqe->rcqid = cpu_to_be32(attr->rcqid);
+       wqe->rq_addr = cpu_to_be32(attr->rq_addr - rdev_p->rnic_info.rqt_base);
+       wqe->rq_size = cpu_to_be32(attr->rq_size);
+       wqe->mpaattrs = attr->mpaattrs;
+       wqe->qpcaps = attr->qpcaps;
+       wqe->ulpdu_size = cpu_to_be16(attr->tcp_emss);
+       wqe->flags = cpu_to_be32(attr->flags);
+       wqe->ord = cpu_to_be32(attr->ord);
+       wqe->ird = cpu_to_be32(attr->ird);
+       wqe->qp_dma_addr = cpu_to_be64(attr->qp_dma_addr);
+       wqe->qp_dma_size = cpu_to_be32(attr->qp_dma_size);
+       wqe->rsvd = 0;
+       skb->priority = 0;      /* 0=>ToeQ; 1=>CtrlQ */
+       return (cxgb3_ofld_send(rdev_p->t3cdev_p, skb));
+}
+
+void cxio_register_ev_cb(cxio_hal_ev_callback_func_t ev_cb)
+{
+       cxio_ev_cb = ev_cb;
+}
+
+void cxio_unregister_ev_cb(cxio_hal_ev_callback_func_t ev_cb)
+{
+       cxio_ev_cb = NULL;
+}
+
+static int cxio_hal_ev_handler(struct t3cdev *t3cdev_p, struct sk_buff *skb)
+{
+       static int cnt;
+       struct cxio_rdev *rdev_p = NULL;
+       struct respQ_msg_t *rsp_msg = (struct respQ_msg_t *) skb->data;
+       PDBG("%d: %s cq_id 0x%x cq_ptr 0x%x genbit %0x overflow %0x an %0x"
+            " se %0x notify %0x cqbranch %0x creditth %0x\n",
+            cnt, __FUNCTION__, RSPQ_CQID(rsp_msg), RSPQ_CQPTR(rsp_msg),
+            RSPQ_GENBIT(rsp_msg), RSPQ_OVERFLOW(rsp_msg), RSPQ_AN(rsp_msg),
+            RSPQ_SE(rsp_msg), RSPQ_NOTIFY(rsp_msg), RSPQ_CQBRANCH(rsp_msg),
+            RSPQ_CREDIT_THRESH(rsp_msg));
+       PDBG("CQE: QPID 0x%0x genbit %0x type 0x%0x status 0x%0x opcode %d "
+            "len 0x%0x wrid_hi_stag 0x%x wrid_low_msn 0x%x\n",
+            CQE_QPID(rsp_msg->cqe), CQE_GENBIT(rsp_msg->cqe),
+            CQE_TYPE(rsp_msg->cqe), CQE_STATUS(rsp_msg->cqe),
+            CQE_OPCODE(rsp_msg->cqe), CQE_LEN(rsp_msg->cqe),
+            CQE_WRID_HI(rsp_msg->cqe), CQE_WRID_LOW(rsp_msg->cqe));
+       rdev_p = (struct cxio_rdev *)t3cdev_p->ulp;
+       if (!rdev_p) {
+               PDBG("%s called by t3cdev %p with null ulp\n", __FUNCTION__,
+                    t3cdev_p);
+               return 0;
+       }
+       if (CQE_QPID(rsp_msg->cqe) == T3_CTRL_QP_ID) {
+               rdev_p->ctrl_qp.rptr = CQE_WRID_LOW(rsp_msg->cqe) + 1;
+               wake_up_interruptible(&rdev_p->ctrl_qp.waitq);
+               dev_kfree_skb_irq(skb);
+       } else if (CQE_QPID(rsp_msg->cqe) == 0xfff8)
+               dev_kfree_skb_irq(skb);
+       else if (cxio_ev_cb)
+               (*cxio_ev_cb) (rdev_p, skb);
+       else
+               dev_kfree_skb_irq(skb);
+       cnt++;
+       return 0;
+}
+
+/* Caller takes care of locking if needed */
+int cxio_rdev_open(struct cxio_rdev *rdev_p)
+{
+       struct net_device *netdev_p = NULL;
+       int err = 0;
+       if (strlen(rdev_p->dev_name)) {
+               if (cxio_hal_find_rdev_by_name(rdev_p->dev_name)) {
+                       return -EBUSY;
+               }
+               netdev_p = dev_get_by_name(rdev_p->dev_name);
+               if (!netdev_p) {
+                       return -EINVAL;
+               }
+               dev_put(netdev_p);
+       } else if (rdev_p->t3cdev_p) {
+               if (cxio_hal_find_rdev_by_t3cdev(rdev_p->t3cdev_p)) {
+                       return -EBUSY;
+               }
+               netdev_p = rdev_p->t3cdev_p->lldev;
+               strncpy(rdev_p->dev_name, rdev_p->t3cdev_p->name,
+                       T3_MAX_DEV_NAME_LEN);
+       } else {
+               PDBG("%s t3cdev_p or dev_name must be set\n", __FUNCTION__);
+               return -EINVAL;
+       }
+
+       list_add_tail(&rdev_p->entry, &rdev_list);
+
+       PDBG("%s opening rnic dev %s\n", __FUNCTION__, rdev_p->dev_name);
+       memset(&rdev_p->ctrl_qp, 0, sizeof(rdev_p->ctrl_qp));
+       if (!rdev_p->t3cdev_p)
+               rdev_p->t3cdev_p = T3CDEV(netdev_p);
+       rdev_p->t3cdev_p->ulp = (void *) rdev_p;
+       err = rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, RDMA_GET_PARAMS,
+                                        &(rdev_p->rnic_info));
+       if (err) {
+               printk(KERN_ERR "%s t3cdev_p(%p)->ctl returned error %d.\n",
+                    __FUNCTION__, rdev_p->t3cdev_p, err);
+               goto err1;
+       }
+       err = rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, GET_PORTS,
+                                   &(rdev_p->port_info));
+       if (err) {
+               printk(KERN_ERR "%s t3cdev_p(%p)->ctl returned error %d.\n",
+                    __FUNCTION__, rdev_p->t3cdev_p, err);
+               goto err1;
+       }
+
+       /*
+        * qpshift is the number of bits to shift the qpid left in order
+        * to get the correct address of the doorbell for that qp.
+        */
+       cxio_init_ucontext(rdev_p, &rdev_p->uctx);
+       rdev_p->qpshift = PAGE_SHIFT -
+                         ilog2(65536 >>
+                                   ilog2(rdev_p->rnic_info.udbell_len >>
+                                             PAGE_SHIFT));
+       rdev_p->qpnr = rdev_p->rnic_info.udbell_len >> PAGE_SHIFT;
+       rdev_p->qpmask = (65536 >> ilog2(rdev_p->qpnr)) - 1;
+       PDBG("%s rnic %s info: tpt_base 0x%0x tpt_top 0x%0x num stags %d "
+            "pbl_base 0x%0x pbl_top 0x%0x rqt_base 0x%0x, rqt_top 0x%0x\n",
+            __FUNCTION__, rdev_p->dev_name, rdev_p->rnic_info.tpt_base,
+            rdev_p->rnic_info.tpt_top, cxio_num_stags(rdev_p),
+            rdev_p->rnic_info.pbl_base,
+            rdev_p->rnic_info.pbl_top, rdev_p->rnic_info.rqt_base,
+            rdev_p->rnic_info.rqt_top);
+       PDBG("udbell_len 0x%0x udbell_physbase 0x%lx kdb_addr %p qpshift %lu "
+            "qpnr %d qpmask 0x%x\n",
+            rdev_p->rnic_info.udbell_len,
+            rdev_p->rnic_info.udbell_physbase, rdev_p->rnic_info.kdb_addr,
+            rdev_p->qpshift, rdev_p->qpnr, rdev_p->qpmask);
+
+       err = cxio_hal_init_ctrl_qp(rdev_p);
+       if (err) {
+               printk(KERN_ERR "%s error %d initializing ctrl_qp.\n",
+                      __FUNCTION__, err);
+               goto err1;
+       }
+       err = cxio_hal_init_resource(rdev_p, cxio_num_stags(rdev_p), 0,
+                                    0, T3_MAX_NUM_QP, T3_MAX_NUM_CQ,
+                                    T3_MAX_NUM_PD);
+       if (err) {
+               printk(KERN_ERR "%s error %d initializing hal resources.\n",
+                      __FUNCTION__, err);
+               goto err2;
+       }
+       err = cxio_hal_pblpool_create(rdev_p);
+       if (err) {
+               printk(KERN_ERR "%s error %d initializing pbl mem pool.\n",
+                      __FUNCTION__, err);
+               goto err3;
+       }
+       err = cxio_hal_rqtpool_create(rdev_p);
+       if (err) {
+               printk(KERN_ERR "%s error %d initializing rqt mem pool.\n",
+                      __FUNCTION__, err);
+               goto err4;
+       }
+       return 0;
+err4:
+       cxio_hal_pblpool_destroy(rdev_p);
+err3:
+       cxio_hal_destroy_resource(rdev_p->rscp);
+err2:
+       cxio_hal_destroy_ctrl_qp(rdev_p);
+err1:
+       list_del(&rdev_p->entry);
+       return err;
+}
+
+void cxio_rdev_close(struct cxio_rdev *rdev_p)
+{
+       if (rdev_p) {
+               cxio_hal_pblpool_destroy(rdev_p);
+               cxio_hal_rqtpool_destroy(rdev_p);
+               list_del(&rdev_p->entry);
+               rdev_p->t3cdev_p->ulp = NULL;
+               cxio_hal_destroy_ctrl_qp(rdev_p);
+               cxio_hal_destroy_resource(rdev_p->rscp);
+       }
+}
+
+int __init cxio_hal_init(void)
+{
+       if (cxio_hal_init_rhdl_resource(T3_MAX_NUM_RI))
+               return -ENOMEM;
+       t3_register_cpl_handler(CPL_ASYNC_NOTIF, cxio_hal_ev_handler);
+       return 0;
+}
+
+void __exit cxio_hal_exit(void)
+{
+       struct cxio_rdev *rdev, *tmp;
+
+       t3_register_cpl_handler(CPL_ASYNC_NOTIF, NULL);
+       list_for_each_entry_safe(rdev, tmp, &rdev_list, entry)
+               cxio_rdev_close(rdev);
+       cxio_hal_destroy_rhdl_resource();
+}
+
+static inline void flush_completed_wrs(struct t3_wq *wq, struct t3_cq *cq)
+{
+       struct t3_swsq *sqp;
+       __u32 ptr = wq->sq_rptr;
+       int count = Q_COUNT(wq->sq_rptr, wq->sq_wptr);
+
+       sqp = wq->sq + Q_PTR2IDX(ptr, wq->sq_size_log2);
+       while (count--)
+               if (!sqp->signaled) {
+                       ptr++;
+                       sqp = wq->sq + Q_PTR2IDX(ptr,  wq->sq_size_log2);
+               } else if (sqp->complete) {
+
+                       /*
+                        * Insert this completed cqe into the swcq.
+                        */
+                       PDBG("%s moving cqe into swcq sq idx %ld cq idx %ld\n",
+                            __FUNCTION__, Q_PTR2IDX(ptr,  wq->sq_size_log2),
+                            Q_PTR2IDX(cq->sw_wptr, cq->size_log2));
+                       sqp->cqe.header |= htonl(V_CQE_SWCQE(1));
+                       *(cq->sw_queue + Q_PTR2IDX(cq->sw_wptr, cq->size_log2))
+                               = sqp->cqe;
+                       cq->sw_wptr++;
+                       sqp->signaled = 0;
+                       break;
+               } else
+                       break;
+}
+
+static inline void create_read_req_cqe(struct t3_wq *wq,
+                                      struct t3_cqe *hw_cqe,
+                                      struct t3_cqe *read_cqe)
+{
+       read_cqe->u.scqe.wrid_hi = wq->oldest_read->sq_wptr;
+       read_cqe->len = wq->oldest_read->read_len;
+       read_cqe->header = htonl(V_CQE_QPID(CQE_QPID(*hw_cqe)) |
+                                V_CQE_SWCQE(SW_CQE(*hw_cqe)) |
+                                V_CQE_OPCODE(T3_READ_REQ) |
+                                V_CQE_TYPE(1));
+}
+
+/*
+ * Return a ptr to the next read wr in the SWSQ or NULL.
+ */
+static inline void advance_oldest_read(struct t3_wq *wq)
+{
+
+       u32 rptr = wq->oldest_read - wq->sq + 1;
+       u32 wptr = Q_PTR2IDX(wq->sq_wptr, wq->sq_size_log2);
+
+       while (Q_PTR2IDX(rptr, wq->sq_size_log2) != wptr) {
+               wq->oldest_read = wq->sq + Q_PTR2IDX(rptr, wq->sq_size_log2);
+
+               if (wq->oldest_read->opcode == T3_READ_REQ)
+                       return;
+               rptr++;
+       }
+       wq->oldest_read = NULL;
+}
+
+/*
+ * cxio_poll_cq
+ *
+ * Caller must:
+ *     check the validity of the first CQE,
+ *     supply the wq assicated with the qpid.
+ *
+ * credit: cq credit to return to sge.
+ * cqe_flushed: 1 iff the CQE is flushed.
+ * cqe: copy of the polled CQE.
+ *
+ * return value:
+ *     0       CQE returned,
+ *    -1       CQE skipped, try again.
+ */
+int cxio_poll_cq(struct t3_wq *wq, struct t3_cq *cq, struct t3_cqe *cqe,
+                    u8 *cqe_flushed, u64 *cookie, u32 *credit)
+{
+       int ret = 0;
+       struct t3_cqe *hw_cqe, read_cqe;
+
+       *cqe_flushed = 0;
+       *credit = 0;
+       hw_cqe = cxio_next_cqe(cq);
+
+       PDBG("%s CQE OOO %d qpid 0x%0x genbit %d type %d status 0x%0x"
+            " opcode 0x%0x len 0x%0x wrid_hi_stag 0x%x wrid_low_msn 0x%x\n",
+            __FUNCTION__, CQE_OOO(*hw_cqe), CQE_QPID(*hw_cqe),
+            CQE_GENBIT(*hw_cqe), CQE_TYPE(*hw_cqe), CQE_STATUS(*hw_cqe),
+            CQE_OPCODE(*hw_cqe), CQE_LEN(*hw_cqe), CQE_WRID_HI(*hw_cqe),
+            CQE_WRID_LOW(*hw_cqe));
+
+       /*
+        * skip cqe's not affiliated with a QP.
+        */
+       if (wq == NULL) {
+               ret = -1;
+               goto skip_cqe;
+       }
+
+       /*
+        * Gotta tweak READ completions:
+        *      1) the cqe doesn't contain the sq_wptr from the wr.
+        *      2) opcode not reflected from the wr.
+        *      3) read_len not reflected from the wr.
+        *      4) cq_type is RQ_TYPE not SQ_TYPE.
+        */
+       if (RQ_TYPE(*hw_cqe) && (CQE_OPCODE(*hw_cqe) == T3_READ_RESP)) {
+
+               /*
+                * Don't write to the HWCQ, so create a new read req CQE
+                * in local memory.
+                */
+               create_read_req_cqe(wq, hw_cqe, &read_cqe);
+               hw_cqe = &read_cqe;
+               advance_oldest_read(wq);
+       }
+
+       /*
+        * T3A: Discard TERMINATE CQEs.
+        */
+       if (CQE_OPCODE(*hw_cqe) == T3_TERMINATE) {
+               ret = -1;
+               wq->error = 1;
+               goto skip_cqe;
+       }
+
+       if (CQE_STATUS(*hw_cqe) || wq->error) {
+               *cqe_flushed = wq->error;
+               wq->error = 1;
+
+               /*
+                * T3A inserts errors into the CQE.  We cannot return
+                * these as work completions.
+                */
+               /* incoming write failures */
+               if ((CQE_OPCODE(*hw_cqe) == T3_RDMA_WRITE)
+                    && RQ_TYPE(*hw_cqe)) {
+                       ret = -1;
+                       goto skip_cqe;
+               }
+               /* incoming read request failures */
+               if ((CQE_OPCODE(*hw_cqe) == T3_READ_RESP) && SQ_TYPE(*hw_cqe)) {
+                       ret = -1;
+                       goto skip_cqe;
+               }
+
+               /* incoming SEND with no receive posted failures */
+               if ((CQE_OPCODE(*hw_cqe) == T3_SEND) && RQ_TYPE(*hw_cqe) &&
+                   Q_EMPTY(wq->rq_rptr, wq->rq_wptr)) {
+                       ret = -1;
+                       goto skip_cqe;
+               }
+               goto proc_cqe;
+       }
+
+       /*
+        * RECV completion.
+        */
+       if (RQ_TYPE(*hw_cqe)) {
+
+               /*
+                * HW only validates 4 bits of MSN.  So we must validate that
+                * the MSN in the SEND is the next expected MSN.  If its not,
+                * then we complete this with TPT_ERR_MSN and mark the wq in
+                * error.
+                */
+               if (unlikely((CQE_WRID_MSN(*hw_cqe) != (wq->rq_rptr + 1)))) {
+                       wq->error = 1;
+                       hw_cqe->header |= htonl(V_CQE_STATUS(TPT_ERR_MSN));
+                       goto proc_cqe;
+               }
+               goto proc_cqe;
+       }
+
+       /*
+        * If we get here its a send completion.
+        *
+        * Handle out of order completion. These get stuffed
+        * in the SW SQ. Then the SW SQ is walked to move any
+        * now in-order completions into the SW CQ.  This handles
+        * 2 cases:
+        *      1) reaping unsignaled WRs when the first subsequent
+        *         signaled WR is completed.
+        *      2) out of order read completions.
+        */
+       if (!SW_CQE(*hw_cqe) && (CQE_WRID_SQ_WPTR(*hw_cqe) != wq->sq_rptr)) {
+               struct t3_swsq *sqp;
+
+               PDBG("%s out of order completion going in swsq at idx %ld\n",
+                    __FUNCTION__,
+                    Q_PTR2IDX(CQE_WRID_SQ_WPTR(*hw_cqe), wq->sq_size_log2));
+               sqp = wq->sq +
+                     Q_PTR2IDX(CQE_WRID_SQ_WPTR(*hw_cqe), wq->sq_size_log2);
+               sqp->cqe = *hw_cqe;
+               sqp->complete = 1;
+               ret = -1;
+               goto flush_wq;
+       }
+
+proc_cqe:
+       *cqe = *hw_cqe;
+
+       /*
+        * Reap the associated WR(s) that are freed up with this
+        * completion.
+        */
+       if (SQ_TYPE(*hw_cqe)) {
+               wq->sq_rptr = CQE_WRID_SQ_WPTR(*hw_cqe);
+               PDBG("%s completing sq idx %ld\n", __FUNCTION__,
+                    Q_PTR2IDX(wq->sq_rptr, wq->sq_size_log2));
+               *cookie = (wq->sq +
+                          Q_PTR2IDX(wq->sq_rptr, wq->sq_size_log2))->wr_id;
+               wq->sq_rptr++;
+       } else {
+               PDBG("%s completing rq idx %ld\n", __FUNCTION__,
+                    Q_PTR2IDX(wq->rq_rptr, wq->rq_size_log2));
+               *cookie = *(wq->rq + Q_PTR2IDX(wq->rq_rptr, wq->rq_size_log2));
+               wq->rq_rptr++;
+       }
+
+flush_wq:
+       /*
+        * Flush any completed cqes that are now in-order.
+        */
+       flush_completed_wrs(wq, cq);
+
+skip_cqe:
+       if (SW_CQE(*hw_cqe)) {
+               PDBG("%s cq %p cqid 0x%x skip sw cqe sw_rptr 0x%x\n",
+                    __FUNCTION__, cq, cq->cqid, cq->sw_rptr);
+               ++cq->sw_rptr;
+       } else {
+               PDBG("%s cq %p cqid 0x%x skip hw cqe rptr 0x%x\n",
+                    __FUNCTION__, cq, cq->cqid, cq->rptr);
+               ++cq->rptr;
+
+               /*
+                * T3A: compute credits.
+                */
+               if (((cq->rptr - cq->wptr) > (1 << (cq->size_log2 - 1)))
+                   || ((cq->rptr - cq->wptr) >= 128)) {
+                       *credit = cq->rptr - cq->wptr;
+                       cq->wptr = cq->rptr;
+               }
+       }
+       return ret;
+}
diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.h b/drivers/infiniband/hw/cxgb3/cxio_hal.h
new file mode 100644 (file)
index 0000000..1b97e80
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef  __CXIO_HAL_H__
+#define  __CXIO_HAL_H__
+
+#include <linux/list.h>
+#include <linux/mutex.h>
+
+#include "t3_cpl.h"
+#include "t3cdev.h"
+#include "cxgb3_ctl_defs.h"
+#include "cxio_wr.h"
+
+#define T3_CTRL_QP_ID    FW_RI_SGEEC_START
+#define T3_CTL_QP_TID   FW_RI_TID_START
+#define T3_CTRL_QP_SIZE_LOG2  8
+#define T3_CTRL_CQ_ID    0
+
+/* TBD */
+#define T3_MAX_NUM_RI (1<<15)
+#define T3_MAX_NUM_QP (1<<15)
+#define T3_MAX_NUM_CQ (1<<15)
+#define T3_MAX_NUM_PD (1<<15)
+#define T3_MAX_PBL_SIZE 256
+#define T3_MAX_RQ_SIZE 1024
+#define T3_MAX_NUM_STAG (1<<15)
+
+#define T3_STAG_UNSET 0xffffffff
+
+#define T3_MAX_DEV_NAME_LEN 32
+
+struct cxio_hal_ctrl_qp {
+       u32 wptr;
+       u32 rptr;
+       struct mutex lock;      /* for the wtpr, can sleep */
+       wait_queue_head_t waitq;/* wait for RspQ/CQE msg */
+       union t3_wr *workq;     /* the work request queue */
+       dma_addr_t dma_addr;    /* pci bus address of the workq */
+       DECLARE_PCI_UNMAP_ADDR(mapping)
+       void __iomem *doorbell;
+};
+
+struct cxio_hal_resource {
+       struct kfifo *tpt_fifo;
+       spinlock_t tpt_fifo_lock;
+       struct kfifo *qpid_fifo;
+       spinlock_t qpid_fifo_lock;
+       struct kfifo *cqid_fifo;
+       spinlock_t cqid_fifo_lock;
+       struct kfifo *pdid_fifo;
+       spinlock_t pdid_fifo_lock;
+};
+
+struct cxio_qpid_list {
+       struct list_head entry;
+       u32 qpid;
+};
+
+struct cxio_ucontext {
+       struct list_head qpids;
+       struct mutex lock;
+};
+
+struct cxio_rdev {
+       char dev_name[T3_MAX_DEV_NAME_LEN];
+       struct t3cdev *t3cdev_p;
+       struct rdma_info rnic_info;
+       struct adap_ports port_info;
+       struct cxio_hal_resource *rscp;
+       struct cxio_hal_ctrl_qp ctrl_qp;
+       void *ulp;
+       unsigned long qpshift;
+       u32 qpnr;
+       u32 qpmask;
+       struct cxio_ucontext uctx;
+       struct gen_pool *pbl_pool;
+       struct gen_pool *rqt_pool;
+       struct list_head entry;
+};
+
+static inline int cxio_num_stags(struct cxio_rdev *rdev_p)
+{
+       return min((int)T3_MAX_NUM_STAG, (int)((rdev_p->rnic_info.tpt_top - rdev_p->rnic_info.tpt_base) >> 5));
+}
+
+typedef void (*cxio_hal_ev_callback_func_t) (struct cxio_rdev * rdev_p,
+                                            struct sk_buff * skb);
+
+#define RSPQ_CQID(rsp) (be32_to_cpu(rsp->cq_ptrid) & 0xffff)
+#define RSPQ_CQPTR(rsp) ((be32_to_cpu(rsp->cq_ptrid) >> 16) & 0xffff)
+#define RSPQ_GENBIT(rsp) ((be32_to_cpu(rsp->flags) >> 16) & 1)
+#define RSPQ_OVERFLOW(rsp) ((be32_to_cpu(rsp->flags) >> 17) & 1)
+#define RSPQ_AN(rsp) ((be32_to_cpu(rsp->flags) >> 18) & 1)
+#define RSPQ_SE(rsp) ((be32_to_cpu(rsp->flags) >> 19) & 1)
+#define RSPQ_NOTIFY(rsp) ((be32_to_cpu(rsp->flags) >> 20) & 1)
+#define RSPQ_CQBRANCH(rsp) ((be32_to_cpu(rsp->flags) >> 21) & 1)
+#define RSPQ_CREDIT_THRESH(rsp) ((be32_to_cpu(rsp->flags) >> 22) & 1)
+
+struct respQ_msg_t {
+       __be32 flags;           /* flit 0 */
+       __be32 cq_ptrid;
+       __be64 rsvd;            /* flit 1 */
+       struct t3_cqe cqe;      /* flits 2-3 */
+};
+
+enum t3_cq_opcode {
+       CQ_ARM_AN = 0x2,
+       CQ_ARM_SE = 0x6,
+       CQ_FORCE_AN = 0x3,
+       CQ_CREDIT_UPDATE = 0x7
+};
+
+int cxio_rdev_open(struct cxio_rdev *rdev);
+void cxio_rdev_close(struct cxio_rdev *rdev);
+int cxio_hal_cq_op(struct cxio_rdev *rdev, struct t3_cq *cq,
+                  enum t3_cq_opcode op, u32 credit);
+int cxio_hal_clear_qp_ctx(struct cxio_rdev *rdev, u32 qpid);
+int cxio_create_cq(struct cxio_rdev *rdev, struct t3_cq *cq);
+int cxio_destroy_cq(struct cxio_rdev *rdev, struct t3_cq *cq);
+int cxio_resize_cq(struct cxio_rdev *rdev, struct t3_cq *cq);
+void cxio_release_ucontext(struct cxio_rdev *rdev, struct cxio_ucontext *uctx);
+void cxio_init_ucontext(struct cxio_rdev *rdev, struct cxio_ucontext *uctx);
+int cxio_create_qp(struct cxio_rdev *rdev, u32 kernel_domain, struct t3_wq *wq,
+                  struct cxio_ucontext *uctx);
+int cxio_destroy_qp(struct cxio_rdev *rdev, struct t3_wq *wq,
+                   struct cxio_ucontext *uctx);
+int cxio_peek_cq(struct t3_wq *wr, struct t3_cq *cq, int opcode);
+int cxio_allocate_stag(struct cxio_rdev *rdev, u32 * stag, u32 pdid,
+                      enum tpt_mem_perm perm, u32 * pbl_size, u32 * pbl_addr);
+int cxio_register_phys_mem(struct cxio_rdev *rdev, u32 * stag, u32 pdid,
+                          enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len,
+                          u8 page_size, __be64 *pbl, u32 *pbl_size,
+                          u32 *pbl_addr);
+int cxio_reregister_phys_mem(struct cxio_rdev *rdev, u32 * stag, u32 pdid,
+                          enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len,
+                          u8 page_size, __be64 *pbl, u32 *pbl_size,
+                          u32 *pbl_addr);
+int cxio_dereg_mem(struct cxio_rdev *rdev, u32 stag, u32 pbl_size,
+                  u32 pbl_addr);
+int cxio_allocate_window(struct cxio_rdev *rdev, u32 * stag, u32 pdid);
+int cxio_deallocate_window(struct cxio_rdev *rdev, u32 stag);
+int cxio_rdma_init(struct cxio_rdev *rdev, struct t3_rdma_init_attr *attr);
+void cxio_register_ev_cb(cxio_hal_ev_callback_func_t ev_cb);
+void cxio_unregister_ev_cb(cxio_hal_ev_callback_func_t ev_cb);
+u32 cxio_hal_get_rhdl(void);
+void cxio_hal_put_rhdl(u32 rhdl);
+u32 cxio_hal_get_pdid(struct cxio_hal_resource *rscp);
+void cxio_hal_put_pdid(struct cxio_hal_resource *rscp, u32 pdid);
+int __init cxio_hal_init(void);
+void __exit cxio_hal_exit(void);
+void cxio_flush_rq(struct t3_wq *wq, struct t3_cq *cq, int count);
+void cxio_flush_sq(struct t3_wq *wq, struct t3_cq *cq, int count);
+void cxio_count_rcqes(struct t3_cq *cq, struct t3_wq *wq, int *count);
+void cxio_count_scqes(struct t3_cq *cq, struct t3_wq *wq, int *count);
+void cxio_flush_hw_cq(struct t3_cq *cq);
+int cxio_poll_cq(struct t3_wq *wq, struct t3_cq *cq, struct t3_cqe *cqe,
+                    u8 *cqe_flushed, u64 *cookie, u32 *credit);
+
+#define MOD "iw_cxgb3: "
+#define PDBG(fmt, args...) pr_debug(MOD fmt, ## args)
+
+#ifdef DEBUG
+void cxio_dump_tpt(struct cxio_rdev *rev, u32 stag);
+void cxio_dump_pbl(struct cxio_rdev *rev, u32 pbl_addr, uint len, u8 shift);
+void cxio_dump_wqe(union t3_wr *wqe);
+void cxio_dump_wce(struct t3_cqe *wce);
+void cxio_dump_rqt(struct cxio_rdev *rdev, u32 hwtid, int nents);
+void cxio_dump_tcb(struct cxio_rdev *rdev, u32 hwtid);
+#endif
+
+#endif
diff --git a/drivers/infiniband/hw/cxgb3/cxio_resource.c b/drivers/infiniband/hw/cxgb3/cxio_resource.c
new file mode 100644 (file)
index 0000000..997aa32
--- /dev/null
@@ -0,0 +1,331 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+/* Crude resource management */
+#include <linux/kernel.h>
+#include <linux/random.h>
+#include <linux/slab.h>
+#include <linux/kfifo.h>
+#include <linux/spinlock.h>
+#include <linux/errno.h>
+#include "cxio_resource.h"
+#include "cxio_hal.h"
+
+static struct kfifo *rhdl_fifo;
+static spinlock_t rhdl_fifo_lock;
+
+#define RANDOM_SIZE 16
+
+static int __cxio_init_resource_fifo(struct kfifo **fifo,
+                                  spinlock_t *fifo_lock,
+                                  u32 nr, u32 skip_low,
+                                  u32 skip_high,
+                                  int random)
+{
+       u32 i, j, entry = 0, idx;
+       u32 random_bytes;
+       u32 rarray[16];
+       spin_lock_init(fifo_lock);
+
+       *fifo = kfifo_alloc(nr * sizeof(u32), GFP_KERNEL, fifo_lock);
+       if (IS_ERR(*fifo))
+               return -ENOMEM;
+
+       for (i = 0; i < skip_low + skip_high; i++)
+               __kfifo_put(*fifo, (unsigned char *) &entry, sizeof(u32));
+       if (random) {
+               j = 0;
+               random_bytes = random32();
+               for (i = 0; i < RANDOM_SIZE; i++)
+                       rarray[i] = i + skip_low;
+               for (i = skip_low + RANDOM_SIZE; i < nr - skip_high; i++) {
+                       if (j >= RANDOM_SIZE) {
+                               j = 0;
+                               random_bytes = random32();
+                       }
+                       idx = (random_bytes >> (j * 2)) & 0xF;
+                       __kfifo_put(*fifo,
+                               (unsigned char *) &rarray[idx],
+                               sizeof(u32));
+                       rarray[idx] = i;
+                       j++;
+               }
+               for (i = 0; i < RANDOM_SIZE; i++)
+                       __kfifo_put(*fifo,
+                               (unsigned char *) &rarray[i],
+                               sizeof(u32));
+       } else
+               for (i = skip_low; i < nr - skip_high; i++)
+                       __kfifo_put(*fifo, (unsigned char *) &i, sizeof(u32));
+
+       for (i = 0; i < skip_low + skip_high; i++)
+               kfifo_get(*fifo, (unsigned char *) &entry, sizeof(u32));
+       return 0;
+}
+
+static int cxio_init_resource_fifo(struct kfifo **fifo, spinlock_t * fifo_lock,
+                                  u32 nr, u32 skip_low, u32 skip_high)
+{
+       return (__cxio_init_resource_fifo(fifo, fifo_lock, nr, skip_low,
+                                         skip_high, 0));
+}
+
+static int cxio_init_resource_fifo_random(struct kfifo **fifo,
+                                  spinlock_t * fifo_lock,
+                                  u32 nr, u32 skip_low, u32 skip_high)
+{
+
+       return (__cxio_init_resource_fifo(fifo, fifo_lock, nr, skip_low,
+                                         skip_high, 1));
+}
+
+static int cxio_init_qpid_fifo(struct cxio_rdev *rdev_p)
+{
+       u32 i;
+
+       spin_lock_init(&rdev_p->rscp->qpid_fifo_lock);
+
+       rdev_p->rscp->qpid_fifo = kfifo_alloc(T3_MAX_NUM_QP * sizeof(u32),
+                                             GFP_KERNEL,
+                                             &rdev_p->rscp->qpid_fifo_lock);
+       if (IS_ERR(rdev_p->rscp->qpid_fifo))
+               return -ENOMEM;
+
+       for (i = 16; i < T3_MAX_NUM_QP; i++)
+               if (!(i & rdev_p->qpmask))
+                       __kfifo_put(rdev_p->rscp->qpid_fifo,
+                                   (unsigned char *) &i, sizeof(u32));
+       return 0;
+}
+
+int cxio_hal_init_rhdl_resource(u32 nr_rhdl)
+{
+       return cxio_init_resource_fifo(&rhdl_fifo, &rhdl_fifo_lock, nr_rhdl, 1,
+                                      0);
+}
+
+void cxio_hal_destroy_rhdl_resource(void)
+{
+       kfifo_free(rhdl_fifo);
+}
+
+/* nr_* must be power of 2 */
+int cxio_hal_init_resource(struct cxio_rdev *rdev_p,
+                          u32 nr_tpt, u32 nr_pbl,
+                          u32 nr_rqt, u32 nr_qpid, u32 nr_cqid, u32 nr_pdid)
+{
+       int err = 0;
+       struct cxio_hal_resource *rscp;
+
+       rscp = kmalloc(sizeof(*rscp), GFP_KERNEL);
+       if (!rscp)
+               return -ENOMEM;
+       rdev_p->rscp = rscp;
+       err = cxio_init_resource_fifo_random(&rscp->tpt_fifo,
+                                     &rscp->tpt_fifo_lock,
+                                     nr_tpt, 1, 0);
+       if (err)
+               goto tpt_err;
+       err = cxio_init_qpid_fifo(rdev_p);
+       if (err)
+               goto qpid_err;
+       err = cxio_init_resource_fifo(&rscp->cqid_fifo, &rscp->cqid_fifo_lock,
+                                     nr_cqid, 1, 0);
+       if (err)
+               goto cqid_err;
+       err = cxio_init_resource_fifo(&rscp->pdid_fifo, &rscp->pdid_fifo_lock,
+                                     nr_pdid, 1, 0);
+       if (err)
+               goto pdid_err;
+       return 0;
+pdid_err:
+       kfifo_free(rscp->cqid_fifo);
+cqid_err:
+       kfifo_free(rscp->qpid_fifo);
+qpid_err:
+       kfifo_free(rscp->tpt_fifo);
+tpt_err:
+       return -ENOMEM;
+}
+
+/*
+ * returns 0 if no resource available
+ */
+static inline u32 cxio_hal_get_resource(struct kfifo *fifo)
+{
+       u32 entry;
+       if (kfifo_get(fifo, (unsigned char *) &entry, sizeof(u32)))
+               return entry;
+       else
+               return 0;       /* fifo emptry */
+}
+
+static inline void cxio_hal_put_resource(struct kfifo *fifo, u32 entry)
+{
+       BUG_ON(kfifo_put(fifo, (unsigned char *) &entry, sizeof(u32)) == 0);
+}
+
+u32 cxio_hal_get_rhdl(void)
+{
+       return cxio_hal_get_resource(rhdl_fifo);
+}
+
+void cxio_hal_put_rhdl(u32 rhdl)
+{
+       cxio_hal_put_resource(rhdl_fifo, rhdl);
+}
+
+u32 cxio_hal_get_stag(struct cxio_hal_resource *rscp)
+{
+       return cxio_hal_get_resource(rscp->tpt_fifo);
+}
+
+void cxio_hal_put_stag(struct cxio_hal_resource *rscp, u32 stag)
+{
+       cxio_hal_put_resource(rscp->tpt_fifo, stag);
+}
+
+u32 cxio_hal_get_qpid(struct cxio_hal_resource *rscp)
+{
+       u32 qpid = cxio_hal_get_resource(rscp->qpid_fifo);
+       PDBG("%s qpid 0x%x\n", __FUNCTION__, qpid);
+       return qpid;
+}
+
+void cxio_hal_put_qpid(struct cxio_hal_resource *rscp, u32 qpid)
+{
+       PDBG("%s qpid 0x%x\n", __FUNCTION__, qpid);
+       cxio_hal_put_resource(rscp->qpid_fifo, qpid);
+}
+
+u32 cxio_hal_get_cqid(struct cxio_hal_resource *rscp)
+{
+       return cxio_hal_get_resource(rscp->cqid_fifo);
+}
+
+void cxio_hal_put_cqid(struct cxio_hal_resource *rscp, u32 cqid)
+{
+       cxio_hal_put_resource(rscp->cqid_fifo, cqid);
+}
+
+u32 cxio_hal_get_pdid(struct cxio_hal_resource *rscp)
+{
+       return cxio_hal_get_resource(rscp->pdid_fifo);
+}
+
+void cxio_hal_put_pdid(struct cxio_hal_resource *rscp, u32 pdid)
+{
+       cxio_hal_put_resource(rscp->pdid_fifo, pdid);
+}
+
+void cxio_hal_destroy_resource(struct cxio_hal_resource *rscp)
+{
+       kfifo_free(rscp->tpt_fifo);
+       kfifo_free(rscp->cqid_fifo);
+       kfifo_free(rscp->qpid_fifo);
+       kfifo_free(rscp->pdid_fifo);
+       kfree(rscp);
+}
+
+/*
+ * PBL Memory Manager.  Uses Linux generic allocator.
+ */
+
+#define MIN_PBL_SHIFT 8                        /* 256B == min PBL size (32 entries) */
+#define PBL_CHUNK 2*1024*1024
+
+u32 cxio_hal_pblpool_alloc(struct cxio_rdev *rdev_p, int size)
+{
+       unsigned long addr = gen_pool_alloc(rdev_p->pbl_pool, size);
+       PDBG("%s addr 0x%x size %d\n", __FUNCTION__, (u32)addr, size);
+       return (u32)addr;
+}
+
+void cxio_hal_pblpool_free(struct cxio_rdev *rdev_p, u32 addr, int size)
+{
+       PDBG("%s addr 0x%x size %d\n", __FUNCTION__, addr, size);
+       gen_pool_free(rdev_p->pbl_pool, (unsigned long)addr, size);
+}
+
+int cxio_hal_pblpool_create(struct cxio_rdev *rdev_p)
+{
+       unsigned long i;
+       rdev_p->pbl_pool = gen_pool_create(MIN_PBL_SHIFT, -1);
+       if (rdev_p->pbl_pool)
+               for (i = rdev_p->rnic_info.pbl_base;
+                    i <= rdev_p->rnic_info.pbl_top - PBL_CHUNK + 1;
+                    i += PBL_CHUNK)
+                       gen_pool_add(rdev_p->pbl_pool, i, PBL_CHUNK, -1);
+       return rdev_p->pbl_pool ? 0 : -ENOMEM;
+}
+
+void cxio_hal_pblpool_destroy(struct cxio_rdev *rdev_p)
+{
+       gen_pool_destroy(rdev_p->pbl_pool);
+}
+
+/*
+ * RQT Memory Manager.  Uses Linux generic allocator.
+ */
+
+#define MIN_RQT_SHIFT 10       /* 1KB == mini RQT size (16 entries) */
+#define RQT_CHUNK 2*1024*1024
+
+u32 cxio_hal_rqtpool_alloc(struct cxio_rdev *rdev_p, int size)
+{
+       unsigned long addr = gen_pool_alloc(rdev_p->rqt_pool, size << 6);
+       PDBG("%s addr 0x%x size %d\n", __FUNCTION__, (u32)addr, size << 6);
+       return (u32)addr;
+}
+
+void cxio_hal_rqtpool_free(struct cxio_rdev *rdev_p, u32 addr, int size)
+{
+       PDBG("%s addr 0x%x size %d\n", __FUNCTION__, addr, size << 6);
+       gen_pool_free(rdev_p->rqt_pool, (unsigned long)addr, size << 6);
+}
+
+int cxio_hal_rqtpool_create(struct cxio_rdev *rdev_p)
+{
+       unsigned long i;
+       rdev_p->rqt_pool = gen_pool_create(MIN_RQT_SHIFT, -1);
+       if (rdev_p->rqt_pool)
+               for (i = rdev_p->rnic_info.rqt_base;
+                    i <= rdev_p->rnic_info.rqt_top - RQT_CHUNK + 1;
+                    i += RQT_CHUNK)
+                       gen_pool_add(rdev_p->rqt_pool, i, RQT_CHUNK, -1);
+       return rdev_p->rqt_pool ? 0 : -ENOMEM;
+}
+
+void cxio_hal_rqtpool_destroy(struct cxio_rdev *rdev_p)
+{
+       gen_pool_destroy(rdev_p->rqt_pool);
+}
diff --git a/drivers/infiniband/hw/cxgb3/cxio_resource.h b/drivers/infiniband/hw/cxgb3/cxio_resource.h
new file mode 100644 (file)
index 0000000..a6bbe83
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef __CXIO_RESOURCE_H__
+#define __CXIO_RESOURCE_H__
+
+#include <linux/kernel.h>
+#include <linux/random.h>
+#include <linux/slab.h>
+#include <linux/kfifo.h>
+#include <linux/spinlock.h>
+#include <linux/errno.h>
+#include <linux/genalloc.h>
+#include "cxio_hal.h"
+
+extern int cxio_hal_init_rhdl_resource(u32 nr_rhdl);
+extern void cxio_hal_destroy_rhdl_resource(void);
+extern int cxio_hal_init_resource(struct cxio_rdev *rdev_p,
+                                 u32 nr_tpt, u32 nr_pbl,
+                                 u32 nr_rqt, u32 nr_qpid, u32 nr_cqid,
+                                 u32 nr_pdid);
+extern u32 cxio_hal_get_stag(struct cxio_hal_resource *rscp);
+extern void cxio_hal_put_stag(struct cxio_hal_resource *rscp, u32 stag);
+extern u32 cxio_hal_get_qpid(struct cxio_hal_resource *rscp);
+extern void cxio_hal_put_qpid(struct cxio_hal_resource *rscp, u32 qpid);
+extern u32 cxio_hal_get_cqid(struct cxio_hal_resource *rscp);
+extern void cxio_hal_put_cqid(struct cxio_hal_resource *rscp, u32 cqid);
+extern void cxio_hal_destroy_resource(struct cxio_hal_resource *rscp);
+
+#define PBL_OFF(rdev_p, a) ( (a) - (rdev_p)->rnic_info.pbl_base )
+extern int cxio_hal_pblpool_create(struct cxio_rdev *rdev_p);
+extern void cxio_hal_pblpool_destroy(struct cxio_rdev *rdev_p);
+extern u32 cxio_hal_pblpool_alloc(struct cxio_rdev *rdev_p, int size);
+extern void cxio_hal_pblpool_free(struct cxio_rdev *rdev_p, u32 addr, int size);
+
+#define RQT_OFF(rdev_p, a) ( (a) - (rdev_p)->rnic_info.rqt_base )
+extern int cxio_hal_rqtpool_create(struct cxio_rdev *rdev_p);
+extern void cxio_hal_rqtpool_destroy(struct cxio_rdev *rdev_p);
+extern u32 cxio_hal_rqtpool_alloc(struct cxio_rdev *rdev_p, int size);
+extern void cxio_hal_rqtpool_free(struct cxio_rdev *rdev_p, u32 addr, int size);
+#endif
diff --git a/drivers/infiniband/hw/cxgb3/cxio_wr.h b/drivers/infiniband/hw/cxgb3/cxio_wr.h
new file mode 100644 (file)
index 0000000..103fc42
--- /dev/null
@@ -0,0 +1,685 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef __CXIO_WR_H__
+#define __CXIO_WR_H__
+
+#include <asm/io.h>
+#include <linux/pci.h>
+#include <linux/timer.h>
+#include "firmware_exports.h"
+
+#define T3_MAX_SGE      4
+
+#define Q_EMPTY(rptr,wptr) ((rptr)==(wptr))
+#define Q_FULL(rptr,wptr,size_log2)  ( (((wptr)-(rptr))>>(size_log2)) && \
+                                      ((rptr)!=(wptr)) )
+#define Q_GENBIT(ptr,size_log2) (!(((ptr)>>size_log2)&0x1))
+#define Q_FREECNT(rptr,wptr,size_log2) ((1UL<<size_log2)-((wptr)-(rptr)))
+#define Q_COUNT(rptr,wptr) ((wptr)-(rptr))
+#define Q_PTR2IDX(ptr,size_log2) (ptr & ((1UL<<size_log2)-1))
+
+static inline void ring_doorbell(void __iomem *doorbell, u32 qpid)
+{
+       writel(((1<<31) | qpid), doorbell);
+}
+
+#define SEQ32_GE(x,y) (!( (((u32) (x)) - ((u32) (y))) & 0x80000000 ))
+
+enum t3_wr_flags {
+       T3_COMPLETION_FLAG = 0x01,
+       T3_NOTIFY_FLAG = 0x02,
+       T3_SOLICITED_EVENT_FLAG = 0x04,
+       T3_READ_FENCE_FLAG = 0x08,
+       T3_LOCAL_FENCE_FLAG = 0x10
+} __attribute__ ((packed));
+
+enum t3_wr_opcode {
+       T3_WR_BP = FW_WROPCODE_RI_BYPASS,
+       T3_WR_SEND = FW_WROPCODE_RI_SEND,
+       T3_WR_WRITE = FW_WROPCODE_RI_RDMA_WRITE,
+       T3_WR_READ = FW_WROPCODE_RI_RDMA_READ,
+       T3_WR_INV_STAG = FW_WROPCODE_RI_LOCAL_INV,
+       T3_WR_BIND = FW_WROPCODE_RI_BIND_MW,
+       T3_WR_RCV = FW_WROPCODE_RI_RECEIVE,
+       T3_WR_INIT = FW_WROPCODE_RI_RDMA_INIT,
+       T3_WR_QP_MOD = FW_WROPCODE_RI_MODIFY_QP
+} __attribute__ ((packed));
+
+enum t3_rdma_opcode {
+       T3_RDMA_WRITE,          /* IETF RDMAP v1.0 ... */
+       T3_READ_REQ,
+       T3_READ_RESP,
+       T3_SEND,
+       T3_SEND_WITH_INV,
+       T3_SEND_WITH_SE,
+       T3_SEND_WITH_SE_INV,
+       T3_TERMINATE,
+       T3_RDMA_INIT,           /* CHELSIO RI specific ... */
+       T3_BIND_MW,
+       T3_FAST_REGISTER,
+       T3_LOCAL_INV,
+       T3_QP_MOD,
+       T3_BYPASS
+} __attribute__ ((packed));
+
+static inline enum t3_rdma_opcode wr2opcode(enum t3_wr_opcode wrop)
+{
+       switch (wrop) {
+               case T3_WR_BP: return T3_BYPASS;
+               case T3_WR_SEND: return T3_SEND;
+               case T3_WR_WRITE: return T3_RDMA_WRITE;
+               case T3_WR_READ: return T3_READ_REQ;
+               case T3_WR_INV_STAG: return T3_LOCAL_INV;
+               case T3_WR_BIND: return T3_BIND_MW;
+               case T3_WR_INIT: return T3_RDMA_INIT;
+               case T3_WR_QP_MOD: return T3_QP_MOD;
+               default: break;
+       }
+       return -1;
+}
+
+
+/* Work request id */
+union t3_wrid {
+       struct {
+               u32 hi;
+               u32 low;
+       } id0;
+       u64 id1;
+};
+
+#define WRID(wrid)             (wrid.id1)
+#define WRID_GEN(wrid)         (wrid.id0.wr_gen)
+#define WRID_IDX(wrid)         (wrid.id0.wr_idx)
+#define WRID_LO(wrid)          (wrid.id0.wr_lo)
+
+struct fw_riwrh {
+       __be32 op_seop_flags;
+       __be32 gen_tid_len;
+};
+
+#define S_FW_RIWR_OP           24
+#define M_FW_RIWR_OP           0xff
+#define V_FW_RIWR_OP(x)                ((x) << S_FW_RIWR_OP)
+#define G_FW_RIWR_OP(x)        ((((x) >> S_FW_RIWR_OP)) & M_FW_RIWR_OP)
+
+#define S_FW_RIWR_SOPEOP       22
+#define M_FW_RIWR_SOPEOP       0x3
+#define V_FW_RIWR_SOPEOP(x)    ((x) << S_FW_RIWR_SOPEOP)
+
+#define S_FW_RIWR_FLAGS                8
+#define M_FW_RIWR_FLAGS                0x3fffff
+#define V_FW_RIWR_FLAGS(x)     ((x) << S_FW_RIWR_FLAGS)
+#define G_FW_RIWR_FLAGS(x)     ((((x) >> S_FW_RIWR_FLAGS)) & M_FW_RIWR_FLAGS)
+
+#define S_FW_RIWR_TID          8
+#define V_FW_RIWR_TID(x)       ((x) << S_FW_RIWR_TID)
+
+#define S_FW_RIWR_LEN          0
+#define V_FW_RIWR_LEN(x)       ((x) << S_FW_RIWR_LEN)
+
+#define S_FW_RIWR_GEN           31
+#define V_FW_RIWR_GEN(x)        ((x)  << S_FW_RIWR_GEN)
+
+struct t3_sge {
+       __be32 stag;
+       __be32 len;
+       __be64 to;
+};
+
+/* If num_sgle is zero, flit 5+ contains immediate data.*/
+struct t3_send_wr {
+       struct fw_riwrh wrh;    /* 0 */
+       union t3_wrid wrid;     /* 1 */
+
+       u8 rdmaop;              /* 2 */
+       u8 reserved[3];
+       __be32 rem_stag;
+       __be32 plen;            /* 3 */
+       __be32 num_sgle;
+       struct t3_sge sgl[T3_MAX_SGE];  /* 4+ */
+};
+
+struct t3_local_inv_wr {
+       struct fw_riwrh wrh;    /* 0 */
+       union t3_wrid wrid;     /* 1 */
+       __be32 stag;            /* 2 */
+       __be32 reserved3;
+};
+
+struct t3_rdma_write_wr {
+       struct fw_riwrh wrh;    /* 0 */
+       union t3_wrid wrid;     /* 1 */
+       u8 rdmaop;              /* 2 */
+       u8 reserved[3];
+       __be32 stag_sink;
+       __be64 to_sink;         /* 3 */
+       __be32 plen;            /* 4 */
+       __be32 num_sgle;
+       struct t3_sge sgl[T3_MAX_SGE];  /* 5+ */
+};
+
+struct t3_rdma_read_wr {
+       struct fw_riwrh wrh;    /* 0 */
+       union t3_wrid wrid;     /* 1 */
+       u8 rdmaop;              /* 2 */
+       u8 reserved[3];
+       __be32 rem_stag;
+       __be64 rem_to;          /* 3 */
+       __be32 local_stag;      /* 4 */
+       __be32 local_len;
+       __be64 local_to;        /* 5 */
+};
+
+enum t3_addr_type {
+       T3_VA_BASED_TO = 0x0,
+       T3_ZERO_BASED_TO = 0x1
+} __attribute__ ((packed));
+
+enum t3_mem_perms {
+       T3_MEM_ACCESS_LOCAL_READ = 0x1,
+       T3_MEM_ACCESS_LOCAL_WRITE = 0x2,
+       T3_MEM_ACCESS_REM_READ = 0x4,
+       T3_MEM_ACCESS_REM_WRITE = 0x8
+} __attribute__ ((packed));
+
+struct t3_bind_mw_wr {
+       struct fw_riwrh wrh;    /* 0 */
+       union t3_wrid wrid;     /* 1 */
+       u16 reserved;           /* 2 */
+       u8 type;
+       u8 perms;
+       __be32 mr_stag;
+       __be32 mw_stag;         /* 3 */
+       __be32 mw_len;
+       __be64 mw_va;           /* 4 */
+       __be32 mr_pbl_addr;     /* 5 */
+       u8 reserved2[3];
+       u8 mr_pagesz;
+};
+
+struct t3_receive_wr {
+       struct fw_riwrh wrh;    /* 0 */
+       union t3_wrid wrid;     /* 1 */
+       u8 pagesz[T3_MAX_SGE];
+       __be32 num_sgle;                /* 2 */
+       struct t3_sge sgl[T3_MAX_SGE];  /* 3+ */
+       __be32 pbl_addr[T3_MAX_SGE];
+};
+
+struct t3_bypass_wr {
+       struct fw_riwrh wrh;
+       union t3_wrid wrid;     /* 1 */
+};
+
+struct t3_modify_qp_wr {
+       struct fw_riwrh wrh;    /* 0 */
+       union t3_wrid wrid;     /* 1 */
+       __be32 flags;           /* 2 */
+       __be32 quiesce;         /* 2 */
+       __be32 max_ird;         /* 3 */
+       __be32 max_ord;         /* 3 */
+       __be64 sge_cmd;         /* 4 */
+       __be64 ctx1;            /* 5 */
+       __be64 ctx0;            /* 6 */
+};
+
+enum t3_modify_qp_flags {
+       MODQP_QUIESCE  = 0x01,
+       MODQP_MAX_IRD  = 0x02,
+       MODQP_MAX_ORD  = 0x04,
+       MODQP_WRITE_EC = 0x08,
+       MODQP_READ_EC  = 0x10,
+};
+
+
+enum t3_mpa_attrs {
+       uP_RI_MPA_RX_MARKER_ENABLE = 0x1,
+       uP_RI_MPA_TX_MARKER_ENABLE = 0x2,
+       uP_RI_MPA_CRC_ENABLE = 0x4,
+       uP_RI_MPA_IETF_ENABLE = 0x8
+} __attribute__ ((packed));
+
+enum t3_qp_caps {
+       uP_RI_QP_RDMA_READ_ENABLE = 0x01,
+       uP_RI_QP_RDMA_WRITE_ENABLE = 0x02,
+       uP_RI_QP_BIND_ENABLE = 0x04,
+       uP_RI_QP_FAST_REGISTER_ENABLE = 0x08,
+       uP_RI_QP_STAG0_ENABLE = 0x10
+} __attribute__ ((packed));
+
+struct t3_rdma_init_attr {
+       u32 tid;
+       u32 qpid;
+       u32 pdid;
+       u32 scqid;
+       u32 rcqid;
+       u32 rq_addr;
+       u32 rq_size;
+       enum t3_mpa_attrs mpaattrs;
+       enum t3_qp_caps qpcaps;
+       u16 tcp_emss;
+       u32 ord;
+       u32 ird;
+       u64 qp_dma_addr;
+       u32 qp_dma_size;
+       u32 flags;
+};
+
+struct t3_rdma_init_wr {
+       struct fw_riwrh wrh;    /* 0 */
+       union t3_wrid wrid;     /* 1 */
+       __be32 qpid;            /* 2 */
+       __be32 pdid;
+       __be32 scqid;           /* 3 */
+       __be32 rcqid;
+       __be32 rq_addr;         /* 4 */
+       __be32 rq_size;
+       u8 mpaattrs;            /* 5 */
+       u8 qpcaps;
+       __be16 ulpdu_size;
+       __be32 flags;           /* bits 31-1 - reservered */
+                               /* bit     0 - set if RECV posted */
+       __be32 ord;             /* 6 */
+       __be32 ird;
+       __be64 qp_dma_addr;     /* 7 */
+       __be32 qp_dma_size;     /* 8 */
+       u32 rsvd;
+};
+
+struct t3_genbit {
+       u64 flit[15];
+       __be64 genbit;
+};
+
+enum rdma_init_wr_flags {
+       RECVS_POSTED = 1,
+};
+
+union t3_wr {
+       struct t3_send_wr send;
+       struct t3_rdma_write_wr write;
+       struct t3_rdma_read_wr read;
+       struct t3_receive_wr recv;
+       struct t3_local_inv_wr local_inv;
+       struct t3_bind_mw_wr bind;
+       struct t3_bypass_wr bypass;
+       struct t3_rdma_init_wr init;
+       struct t3_modify_qp_wr qp_mod;
+       struct t3_genbit genbit;
+       u64 flit[16];
+};
+
+#define T3_SQ_CQE_FLIT   13
+#define T3_SQ_COOKIE_FLIT 14
+
+#define T3_RQ_COOKIE_FLIT 13
+#define T3_RQ_CQE_FLIT   14
+
+static inline enum t3_wr_opcode fw_riwrh_opcode(struct fw_riwrh *wqe)
+{
+       return G_FW_RIWR_OP(be32_to_cpu(wqe->op_seop_flags));
+}
+
+static inline void build_fw_riwrh(struct fw_riwrh *wqe, enum t3_wr_opcode op,
+                                 enum t3_wr_flags flags, u8 genbit, u32 tid,
+                                 u8 len)
+{
+       wqe->op_seop_flags = cpu_to_be32(V_FW_RIWR_OP(op) |
+                                        V_FW_RIWR_SOPEOP(M_FW_RIWR_SOPEOP) |
+                                        V_FW_RIWR_FLAGS(flags));
+       wmb();
+       wqe->gen_tid_len = cpu_to_be32(V_FW_RIWR_GEN(genbit) |
+                                      V_FW_RIWR_TID(tid) |
+                                      V_FW_RIWR_LEN(len));
+       /* 2nd gen bit... */
+       ((union t3_wr *)wqe)->genbit.genbit = cpu_to_be64(genbit);
+}
+
+/*
+ * T3 ULP2_TX commands
+ */
+enum t3_utx_mem_op {
+       T3_UTX_MEM_READ = 2,
+       T3_UTX_MEM_WRITE = 3
+};
+
+/* T3 MC7 RDMA TPT entry format */
+
+enum tpt_mem_type {
+       TPT_NON_SHARED_MR = 0x0,
+       TPT_SHARED_MR = 0x1,
+       TPT_MW = 0x2,
+       TPT_MW_RELAXED_PROTECTION = 0x3
+};
+
+enum tpt_addr_type {
+       TPT_ZBTO = 0,
+       TPT_VATO = 1
+};
+
+enum tpt_mem_perm {
+       TPT_LOCAL_READ = 0x8,
+       TPT_LOCAL_WRITE = 0x4,
+       TPT_REMOTE_READ = 0x2,
+       TPT_REMOTE_WRITE = 0x1
+};
+
+struct tpt_entry {
+       __be32 valid_stag_pdid;
+       __be32 flags_pagesize_qpid;
+
+       __be32 rsvd_pbl_addr;
+       __be32 len;
+       __be32 va_hi;
+       __be32 va_low_or_fbo;
+
+       __be32 rsvd_bind_cnt_or_pstag;
+       __be32 rsvd_pbl_size;
+};
+
+#define S_TPT_VALID            31
+#define V_TPT_VALID(x)         ((x) << S_TPT_VALID)
+#define F_TPT_VALID            V_TPT_VALID(1U)
+
+#define S_TPT_STAG_KEY         23
+#define M_TPT_STAG_KEY         0xFF
+#define V_TPT_STAG_KEY(x)      ((x) << S_TPT_STAG_KEY)
+#define G_TPT_STAG_KEY(x)      (((x) >> S_TPT_STAG_KEY) & M_TPT_STAG_KEY)
+
+#define S_TPT_STAG_STATE       22
+#define V_TPT_STAG_STATE(x)    ((x) << S_TPT_STAG_STATE)
+#define F_TPT_STAG_STATE       V_TPT_STAG_STATE(1U)
+
+#define S_TPT_STAG_TYPE                20
+#define M_TPT_STAG_TYPE                0x3
+#define V_TPT_STAG_TYPE(x)     ((x) << S_TPT_STAG_TYPE)
+#define G_TPT_STAG_TYPE(x)     (((x) >> S_TPT_STAG_TYPE) & M_TPT_STAG_TYPE)
+
+#define S_TPT_PDID             0
+#define M_TPT_PDID             0xFFFFF
+#define V_TPT_PDID(x)          ((x) << S_TPT_PDID)
+#define G_TPT_PDID(x)          (((x) >> S_TPT_PDID) & M_TPT_PDID)
+
+#define S_TPT_PERM             28
+#define M_TPT_PERM             0xF
+#define V_TPT_PERM(x)          ((x) << S_TPT_PERM)
+#define G_TPT_PERM(x)          (((x) >> S_TPT_PERM) & M_TPT_PERM)
+
+#define S_TPT_REM_INV_DIS      27
+#define V_TPT_REM_INV_DIS(x)   ((x) << S_TPT_REM_INV_DIS)
+#define F_TPT_REM_INV_DIS      V_TPT_REM_INV_DIS(1U)
+
+#define S_TPT_ADDR_TYPE                26
+#define V_TPT_ADDR_TYPE(x)     ((x) << S_TPT_ADDR_TYPE)
+#define F_TPT_ADDR_TYPE                V_TPT_ADDR_TYPE(1U)
+
+#define S_TPT_MW_BIND_ENABLE   25
+#define V_TPT_MW_BIND_ENABLE(x)        ((x) << S_TPT_MW_BIND_ENABLE)
+#define F_TPT_MW_BIND_ENABLE    V_TPT_MW_BIND_ENABLE(1U)
+
+#define S_TPT_PAGE_SIZE                20
+#define M_TPT_PAGE_SIZE                0x1F
+#define V_TPT_PAGE_SIZE(x)     ((x) << S_TPT_PAGE_SIZE)
+#define G_TPT_PAGE_SIZE(x)     (((x) >> S_TPT_PAGE_SIZE) & M_TPT_PAGE_SIZE)
+
+#define S_TPT_PBL_ADDR         0
+#define M_TPT_PBL_ADDR         0x1FFFFFFF
+#define V_TPT_PBL_ADDR(x)      ((x) << S_TPT_PBL_ADDR)
+#define G_TPT_PBL_ADDR(x)       (((x) >> S_TPT_PBL_ADDR) & M_TPT_PBL_ADDR)
+
+#define S_TPT_QPID             0
+#define M_TPT_QPID             0xFFFFF
+#define V_TPT_QPID(x)          ((x) << S_TPT_QPID)
+#define G_TPT_QPID(x)          (((x) >> S_TPT_QPID) & M_TPT_QPID)
+
+#define S_TPT_PSTAG            0
+#define M_TPT_PSTAG            0xFFFFFF
+#define V_TPT_PSTAG(x)         ((x) << S_TPT_PSTAG)
+#define G_TPT_PSTAG(x)         (((x) >> S_TPT_PSTAG) & M_TPT_PSTAG)
+
+#define S_TPT_PBL_SIZE         0
+#define M_TPT_PBL_SIZE         0xFFFFF
+#define V_TPT_PBL_SIZE(x)      ((x) << S_TPT_PBL_SIZE)
+#define G_TPT_PBL_SIZE(x)      (((x) >> S_TPT_PBL_SIZE) & M_TPT_PBL_SIZE)
+
+/*
+ * CQE defs
+ */
+struct t3_cqe {
+       __be32 header;
+       __be32 len;
+       union {
+               struct {
+                       __be32 stag;
+                       __be32 msn;
+               } rcqe;
+               struct {
+                       u32 wrid_hi;
+                       u32 wrid_low;
+               } scqe;
+       } u;
+};
+
+#define S_CQE_OOO        31
+#define M_CQE_OOO        0x1
+#define G_CQE_OOO(x)     ((((x) >> S_CQE_OOO)) & M_CQE_OOO)
+#define V_CEQ_OOO(x)     ((x)<<S_CQE_OOO)
+
+#define S_CQE_QPID        12
+#define M_CQE_QPID        0x7FFFF
+#define G_CQE_QPID(x)     ((((x) >> S_CQE_QPID)) & M_CQE_QPID)
+#define V_CQE_QPID(x)    ((x)<<S_CQE_QPID)
+
+#define S_CQE_SWCQE       11
+#define M_CQE_SWCQE       0x1
+#define G_CQE_SWCQE(x)    ((((x) >> S_CQE_SWCQE)) & M_CQE_SWCQE)
+#define V_CQE_SWCQE(x)   ((x)<<S_CQE_SWCQE)
+
+#define S_CQE_GENBIT      10
+#define M_CQE_GENBIT      0x1
+#define G_CQE_GENBIT(x)   (((x) >> S_CQE_GENBIT) & M_CQE_GENBIT)
+#define V_CQE_GENBIT(x)          ((x)<<S_CQE_GENBIT)
+
+#define S_CQE_STATUS      5
+#define M_CQE_STATUS      0x1F
+#define G_CQE_STATUS(x)   ((((x) >> S_CQE_STATUS)) & M_CQE_STATUS)
+#define V_CQE_STATUS(x)   ((x)<<S_CQE_STATUS)
+
+#define S_CQE_TYPE        4
+#define M_CQE_TYPE        0x1
+#define G_CQE_TYPE(x)     ((((x) >> S_CQE_TYPE)) & M_CQE_TYPE)
+#define V_CQE_TYPE(x)     ((x)<<S_CQE_TYPE)
+
+#define S_CQE_OPCODE      0
+#define M_CQE_OPCODE      0xF
+#define G_CQE_OPCODE(x)   ((((x) >> S_CQE_OPCODE)) & M_CQE_OPCODE)
+#define V_CQE_OPCODE(x)   ((x)<<S_CQE_OPCODE)
+
+#define SW_CQE(x)         (G_CQE_SWCQE(be32_to_cpu((x).header)))
+#define CQE_OOO(x)        (G_CQE_OOO(be32_to_cpu((x).header)))
+#define CQE_QPID(x)       (G_CQE_QPID(be32_to_cpu((x).header)))
+#define CQE_GENBIT(x)     (G_CQE_GENBIT(be32_to_cpu((x).header)))
+#define CQE_TYPE(x)       (G_CQE_TYPE(be32_to_cpu((x).header)))
+#define SQ_TYPE(x)       (CQE_TYPE((x)))
+#define RQ_TYPE(x)       (!CQE_TYPE((x)))
+#define CQE_STATUS(x)     (G_CQE_STATUS(be32_to_cpu((x).header)))
+#define CQE_OPCODE(x)     (G_CQE_OPCODE(be32_to_cpu((x).header)))
+
+#define CQE_LEN(x)        (be32_to_cpu((x).len))
+
+/* used for RQ completion processing */
+#define CQE_WRID_STAG(x)  (be32_to_cpu((x).u.rcqe.stag))
+#define CQE_WRID_MSN(x)   (be32_to_cpu((x).u.rcqe.msn))
+
+/* used for SQ completion processing */
+#define CQE_WRID_SQ_WPTR(x)    ((x).u.scqe.wrid_hi)
+#define CQE_WRID_WPTR(x)       ((x).u.scqe.wrid_low)
+
+/* generic accessor macros */
+#define CQE_WRID_HI(x)         ((x).u.scqe.wrid_hi)
+#define CQE_WRID_LOW(x)                ((x).u.scqe.wrid_low)
+
+#define TPT_ERR_SUCCESS                     0x0
+#define TPT_ERR_STAG                        0x1         /* STAG invalid: either the */
+                                                /* STAG is offlimt, being 0, */
+                                                /* or STAG_key mismatch */
+#define TPT_ERR_PDID                        0x2         /* PDID mismatch */
+#define TPT_ERR_QPID                        0x3         /* QPID mismatch */
+#define TPT_ERR_ACCESS                      0x4         /* Invalid access right */
+#define TPT_ERR_WRAP                        0x5         /* Wrap error */
+#define TPT_ERR_BOUND                       0x6         /* base and bounds voilation */
+#define TPT_ERR_INVALIDATE_SHARED_MR        0x7         /* attempt to invalidate a  */
+                                                /* shared memory region */
+#define TPT_ERR_INVALIDATE_MR_WITH_MW_BOUND 0x8         /* attempt to invalidate a  */
+                                                /* shared memory region */
+#define TPT_ERR_ECC                         0x9         /* ECC error detected */
+#define TPT_ERR_ECC_PSTAG                   0xA         /* ECC error detected when  */
+                                                /* reading PSTAG for a MW  */
+                                                /* Invalidate */
+#define TPT_ERR_PBL_ADDR_BOUND              0xB         /* pbl addr out of bounds:  */
+                                                /* software error */
+#define TPT_ERR_SWFLUSH                            0xC  /* SW FLUSHED */
+#define TPT_ERR_CRC                         0x10 /* CRC error */
+#define TPT_ERR_MARKER                      0x11 /* Marker error */
+#define TPT_ERR_PDU_LEN_ERR                 0x12 /* invalid PDU length */
+#define TPT_ERR_OUT_OF_RQE                  0x13 /* out of RQE */
+#define TPT_ERR_DDP_VERSION                 0x14 /* wrong DDP version */
+#define TPT_ERR_RDMA_VERSION                0x15 /* wrong RDMA version */
+#define TPT_ERR_OPCODE                      0x16 /* invalid rdma opcode */
+#define TPT_ERR_DDP_QUEUE_NUM               0x17 /* invalid ddp queue number */
+#define TPT_ERR_MSN                         0x18 /* MSN error */
+#define TPT_ERR_TBIT                        0x19 /* tag bit not set correctly */
+#define TPT_ERR_MO                          0x1A /* MO not 0 for TERMINATE  */
+                                                /* or READ_REQ */
+#define TPT_ERR_MSN_GAP                     0x1B
+#define TPT_ERR_MSN_RANGE                   0x1C
+#define TPT_ERR_IRD_OVERFLOW                0x1D
+#define TPT_ERR_RQE_ADDR_BOUND              0x1E /* RQE addr out of bounds:  */
+                                                /* software error */
+#define TPT_ERR_INTERNAL_ERR                0x1F /* internal error (opcode  */
+                                                /* mismatch) */
+
+struct t3_swsq {
+       __u64                   wr_id;
+       struct t3_cqe           cqe;
+       __u32                   sq_wptr;
+       __be32                  read_len;
+       int                     opcode;
+       int                     complete;
+       int                     signaled;
+};
+
+/*
+ * A T3 WQ implements both the SQ and RQ.
+ */
+struct t3_wq {
+       union t3_wr *queue;             /* DMA accessable memory */
+       dma_addr_t dma_addr;            /* DMA address for HW */
+       DECLARE_PCI_UNMAP_ADDR(mapping) /* unmap kruft */
+       u32 error;                      /* 1 once we go to ERROR */
+       u32 qpid;
+       u32 wptr;                       /* idx to next available WR slot */
+       u32 size_log2;                  /* total wq size */
+       struct t3_swsq *sq;             /* SW SQ */
+       struct t3_swsq *oldest_read;    /* tracks oldest pending read */
+       u32 sq_wptr;                    /* sq_wptr - sq_rptr == count of */
+       u32 sq_rptr;                    /* pending wrs */
+       u32 sq_size_log2;               /* sq size */
+       u64 *rq;                        /* SW RQ (holds consumer wr_ids */
+       u32 rq_wptr;                    /* rq_wptr - rq_rptr == count of */
+       u32 rq_rptr;                    /* pending wrs */
+       u64 *rq_oldest_wr;              /* oldest wr on the SW RQ */
+       u32 rq_size_log2;               /* rq size */
+       u32 rq_addr;                    /* rq adapter address */
+       void __iomem *doorbell;         /* kernel db */
+       u64 udb;                        /* user db if any */
+};
+
+struct t3_cq {
+       u32 cqid;
+       u32 rptr;
+       u32 wptr;
+       u32 size_log2;
+       dma_addr_t dma_addr;
+       DECLARE_PCI_UNMAP_ADDR(mapping)
+       struct t3_cqe *queue;
+       struct t3_cqe *sw_queue;
+       u32 sw_rptr;
+       u32 sw_wptr;
+};
+
+#define CQ_VLD_ENTRY(ptr,size_log2,cqe) (Q_GENBIT(ptr,size_log2) == \
+                                        CQE_GENBIT(*cqe))
+
+static inline void cxio_set_wq_in_error(struct t3_wq *wq)
+{
+       wq->queue->flit[13] = 1;
+}
+
+static inline struct t3_cqe *cxio_next_hw_cqe(struct t3_cq *cq)
+{
+       struct t3_cqe *cqe;
+
+       cqe = cq->queue + (Q_PTR2IDX(cq->rptr, cq->size_log2));
+       if (CQ_VLD_ENTRY(cq->rptr, cq->size_log2, cqe))
+               return cqe;
+       return NULL;
+}
+
+static inline struct t3_cqe *cxio_next_sw_cqe(struct t3_cq *cq)
+{
+       struct t3_cqe *cqe;
+
+       if (!Q_EMPTY(cq->sw_rptr, cq->sw_wptr)) {
+               cqe = cq->sw_queue + (Q_PTR2IDX(cq->sw_rptr, cq->size_log2));
+               return cqe;
+       }
+       return NULL;
+}
+
+static inline struct t3_cqe *cxio_next_cqe(struct t3_cq *cq)
+{
+       struct t3_cqe *cqe;
+
+       if (!Q_EMPTY(cq->sw_rptr, cq->sw_wptr)) {
+               cqe = cq->sw_queue + (Q_PTR2IDX(cq->sw_rptr, cq->size_log2));
+               return cqe;
+       }
+       cqe = cq->queue + (Q_PTR2IDX(cq->rptr, cq->size_log2));
+       if (CQ_VLD_ENTRY(cq->rptr, cq->size_log2, cqe))
+               return cqe;
+       return NULL;
+}
+
+#endif
diff --git a/drivers/infiniband/hw/cxgb3/iwch.c b/drivers/infiniband/hw/cxgb3/iwch.c
new file mode 100644 (file)
index 0000000..4611afa
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+
+#include <rdma/ib_verbs.h>
+
+#include "cxgb3_offload.h"
+#include "iwch_provider.h"
+#include "iwch_user.h"
+#include "iwch.h"
+#include "iwch_cm.h"
+
+#define DRV_VERSION "1.1"
+
+MODULE_AUTHOR("Boyd Faulkner, Steve Wise");
+MODULE_DESCRIPTION("Chelsio T3 RDMA Driver");
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_VERSION(DRV_VERSION);
+
+cxgb3_cpl_handler_func t3c_handlers[NUM_CPL_CMDS];
+
+static void open_rnic_dev(struct t3cdev *);
+static void close_rnic_dev(struct t3cdev *);
+
+struct cxgb3_client t3c_client = {
+       .name = "iw_cxgb3",
+       .add = open_rnic_dev,
+       .remove = close_rnic_dev,
+       .handlers = t3c_handlers,
+       .redirect = iwch_ep_redirect
+};
+
+static LIST_HEAD(dev_list);
+static DEFINE_MUTEX(dev_mutex);
+
+static void rnic_init(struct iwch_dev *rnicp)
+{
+       PDBG("%s iwch_dev %p\n", __FUNCTION__,  rnicp);
+       idr_init(&rnicp->cqidr);
+       idr_init(&rnicp->qpidr);
+       idr_init(&rnicp->mmidr);
+       spin_lock_init(&rnicp->lock);
+
+       rnicp->attr.vendor_id = 0x168;
+       rnicp->attr.vendor_part_id = 7;
+       rnicp->attr.max_qps = T3_MAX_NUM_QP - 32;
+       rnicp->attr.max_wrs = (1UL << 24) - 1;
+       rnicp->attr.max_sge_per_wr = T3_MAX_SGE;
+       rnicp->attr.max_sge_per_rdma_write_wr = T3_MAX_SGE;
+       rnicp->attr.max_cqs = T3_MAX_NUM_CQ - 1;
+       rnicp->attr.max_cqes_per_cq = (1UL << 24) - 1;
+       rnicp->attr.max_mem_regs = cxio_num_stags(&rnicp->rdev);
+       rnicp->attr.max_phys_buf_entries = T3_MAX_PBL_SIZE;
+       rnicp->attr.max_pds = T3_MAX_NUM_PD - 1;
+       rnicp->attr.mem_pgsizes_bitmask = 0x7FFF;       /* 4KB-128MB */
+       rnicp->attr.can_resize_wq = 0;
+       rnicp->attr.max_rdma_reads_per_qp = 8;
+       rnicp->attr.max_rdma_read_resources =
+           rnicp->attr.max_rdma_reads_per_qp * rnicp->attr.max_qps;
+       rnicp->attr.max_rdma_read_qp_depth = 8; /* IRD */
+       rnicp->attr.max_rdma_read_depth =
+           rnicp->attr.max_rdma_read_qp_depth * rnicp->attr.max_qps;
+       rnicp->attr.rq_overflow_handled = 0;
+       rnicp->attr.can_modify_ird = 0;
+       rnicp->attr.can_modify_ord = 0;
+       rnicp->attr.max_mem_windows = rnicp->attr.max_mem_regs - 1;
+       rnicp->attr.stag0_value = 1;
+       rnicp->attr.zbva_support = 1;
+       rnicp->attr.local_invalidate_fence = 1;
+       rnicp->attr.cq_overflow_detection = 1;
+       return;
+}
+
+static void open_rnic_dev(struct t3cdev *tdev)
+{
+       struct iwch_dev *rnicp;
+       static int vers_printed;
+
+       PDBG("%s t3cdev %p\n", __FUNCTION__,  tdev);
+       if (!vers_printed++)
+               printk(KERN_INFO MOD "Chelsio T3 RDMA Driver - version %s\n",
+                      DRV_VERSION);
+       rnicp = (struct iwch_dev *)ib_alloc_device(sizeof(*rnicp));
+       if (!rnicp) {
+               printk(KERN_ERR MOD "Cannot allocate ib device\n");
+               return;
+       }
+       rnicp->rdev.ulp = rnicp;
+       rnicp->rdev.t3cdev_p = tdev;
+
+       mutex_lock(&dev_mutex);
+
+       if (cxio_rdev_open(&rnicp->rdev)) {
+               mutex_unlock(&dev_mutex);
+               printk(KERN_ERR MOD "Unable to open CXIO rdev\n");
+               ib_dealloc_device(&rnicp->ibdev);
+               return;
+       }
+
+       rnic_init(rnicp);
+
+       list_add_tail(&rnicp->entry, &dev_list);
+       mutex_unlock(&dev_mutex);
+
+       if (iwch_register_device(rnicp)) {
+               printk(KERN_ERR MOD "Unable to register device\n");
+               close_rnic_dev(tdev);
+       }
+       printk(KERN_INFO MOD "Initialized device %s\n",
+              pci_name(rnicp->rdev.rnic_info.pdev));
+       return;
+}
+
+static void close_rnic_dev(struct t3cdev *tdev)
+{
+       struct iwch_dev *dev, *tmp;
+       PDBG("%s t3cdev %p\n", __FUNCTION__,  tdev);
+       mutex_lock(&dev_mutex);
+       list_for_each_entry_safe(dev, tmp, &dev_list, entry) {
+               if (dev->rdev.t3cdev_p == tdev) {
+                       list_del(&dev->entry);
+                       iwch_unregister_device(dev);
+                       cxio_rdev_close(&dev->rdev);
+                       idr_destroy(&dev->cqidr);
+                       idr_destroy(&dev->qpidr);
+                       idr_destroy(&dev->mmidr);
+                       ib_dealloc_device(&dev->ibdev);
+                       break;
+               }
+       }
+       mutex_unlock(&dev_mutex);
+}
+
+static int __init iwch_init_module(void)
+{
+       int err;
+
+       err = cxio_hal_init();
+       if (err)
+               return err;
+       err = iwch_cm_init();
+       if (err)
+               return err;
+       cxio_register_ev_cb(iwch_ev_dispatch);
+       cxgb3_register_client(&t3c_client);
+       return 0;
+}
+
+static void __exit iwch_exit_module(void)
+{
+       cxgb3_unregister_client(&t3c_client);
+       cxio_unregister_ev_cb(iwch_ev_dispatch);
+       iwch_cm_term();
+       cxio_hal_exit();
+}
+
+module_init(iwch_init_module);
+module_exit(iwch_exit_module);
diff --git a/drivers/infiniband/hw/cxgb3/iwch.h b/drivers/infiniband/hw/cxgb3/iwch.h
new file mode 100644 (file)
index 0000000..6517ef8
--- /dev/null
@@ -0,0 +1,177 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef __IWCH_H__
+#define __IWCH_H__
+
+#include <linux/mutex.h>
+#include <linux/list.h>
+#include <linux/spinlock.h>
+#include <linux/idr.h>
+
+#include <rdma/ib_verbs.h>
+
+#include "cxio_hal.h"
+#include "cxgb3_offload.h"
+
+struct iwch_pd;
+struct iwch_cq;
+struct iwch_qp;
+struct iwch_mr;
+
+struct iwch_rnic_attributes {
+       u32 vendor_id;
+       u32 vendor_part_id;
+       u32 max_qps;
+       u32 max_wrs;                            /* Max for any SQ/RQ */
+       u32 max_sge_per_wr;
+       u32 max_sge_per_rdma_write_wr;  /* for RDMA Write WR */
+       u32 max_cqs;
+       u32 max_cqes_per_cq;
+       u32 max_mem_regs;
+       u32 max_phys_buf_entries;               /* for phys buf list */
+       u32 max_pds;
+
+       /*
+        * The memory page sizes supported by this RNIC.
+        * Bit position i in bitmap indicates page of
+        * size (4k)^i.  Phys block list mode unsupported.
+        */
+       u32 mem_pgsizes_bitmask;
+       u8 can_resize_wq;
+
+       /*
+        * The maximum number of RDMA Reads that can be outstanding
+        * per QP with this RNIC as the target.
+        */
+       u32 max_rdma_reads_per_qp;
+
+       /*
+        * The maximum number of resources used for RDMA Reads
+        * by this RNIC with this RNIC as the target.
+        */
+       u32 max_rdma_read_resources;
+
+       /*
+        * The max depth per QP for initiation of RDMA Read
+        * by this RNIC.
+        */
+       u32 max_rdma_read_qp_depth;
+
+       /*
+        * The maximum depth for initiation of RDMA Read
+        * operations by this RNIC on all QPs
+        */
+       u32 max_rdma_read_depth;
+       u8 rq_overflow_handled;
+       u32 can_modify_ird;
+       u32 can_modify_ord;
+       u32 max_mem_windows;
+       u32 stag0_value;
+       u8 zbva_support;
+       u8 local_invalidate_fence;
+       u32 cq_overflow_detection;
+};
+
+struct iwch_dev {
+       struct ib_device ibdev;
+       struct cxio_rdev rdev;
+       u32 device_cap_flags;
+       struct iwch_rnic_attributes attr;
+       struct idr cqidr;
+       struct idr qpidr;
+       struct idr mmidr;
+       spinlock_t lock;
+       struct list_head entry;
+};
+
+static inline struct iwch_dev *to_iwch_dev(struct ib_device *ibdev)
+{
+       return container_of(ibdev, struct iwch_dev, ibdev);
+}
+
+static inline int t3b_device(const struct iwch_dev *rhp)
+{
+       return rhp->rdev.t3cdev_p->type == T3B;
+}
+
+static inline int t3a_device(const struct iwch_dev *rhp)
+{
+       return rhp->rdev.t3cdev_p->type == T3A;
+}
+
+static inline struct iwch_cq *get_chp(struct iwch_dev *rhp, u32 cqid)
+{
+       return idr_find(&rhp->cqidr, cqid);
+}
+
+static inline struct iwch_qp *get_qhp(struct iwch_dev *rhp, u32 qpid)
+{
+       return idr_find(&rhp->qpidr, qpid);
+}
+
+static inline struct iwch_mr *get_mhp(struct iwch_dev *rhp, u32 mmid)
+{
+       return idr_find(&rhp->mmidr, mmid);
+}
+
+static inline int insert_handle(struct iwch_dev *rhp, struct idr *idr,
+                               void *handle, u32 id)
+{
+       int ret;
+       u32 newid;
+
+       do {
+               if (!idr_pre_get(idr, GFP_KERNEL)) {
+                       return -ENOMEM;
+               }
+               spin_lock_irq(&rhp->lock);
+               ret = idr_get_new_above(idr, handle, id, &newid);
+               BUG_ON(newid != id);
+               spin_unlock_irq(&rhp->lock);
+       } while (ret == -EAGAIN);
+
+       return ret;
+}
+
+static inline void remove_handle(struct iwch_dev *rhp, struct idr *idr, u32 id)
+{
+       spin_lock_irq(&rhp->lock);
+       idr_remove(idr, id);
+       spin_unlock_irq(&rhp->lock);
+}
+
+extern struct cxgb3_client t3c_client;
+extern cxgb3_cpl_handler_func t3c_handlers[NUM_CPL_CMDS];
+extern void iwch_ev_dispatch(struct cxio_rdev *rdev_p, struct sk_buff *skb);
+
+#endif
diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c
new file mode 100644 (file)
index 0000000..a522b1b
--- /dev/null
@@ -0,0 +1,2081 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include <linux/module.h>
+#include <linux/list.h>
+#include <linux/workqueue.h>
+#include <linux/skbuff.h>
+#include <linux/timer.h>
+#include <linux/notifier.h>
+
+#include <net/neighbour.h>
+#include <net/netevent.h>
+#include <net/route.h>
+
+#include "tcb.h"
+#include "cxgb3_offload.h"
+#include "iwch.h"
+#include "iwch_provider.h"
+#include "iwch_cm.h"
+
+static char *states[] = {
+       "idle",
+       "listen",
+       "connecting",
+       "mpa_wait_req",
+       "mpa_req_sent",
+       "mpa_req_rcvd",
+       "mpa_rep_sent",
+       "fpdu_mode",
+       "aborting",
+       "closing",
+       "moribund",
+       "dead",
+       NULL,
+};
+
+static int ep_timeout_secs = 10;
+module_param(ep_timeout_secs, int, 0444);
+MODULE_PARM_DESC(ep_timeout_secs, "CM Endpoint operation timeout "
+                                  "in seconds (default=10)");
+
+static int mpa_rev = 1;
+module_param(mpa_rev, int, 0444);
+MODULE_PARM_DESC(mpa_rev, "MPA Revision, 0 supports amso1100, "
+                "1 is spec compliant. (default=1)");
+
+static int markers_enabled = 0;
+module_param(markers_enabled, int, 0444);
+MODULE_PARM_DESC(markers_enabled, "Enable MPA MARKERS (default(0)=disabled)");
+
+static int crc_enabled = 1;
+module_param(crc_enabled, int, 0444);
+MODULE_PARM_DESC(crc_enabled, "Enable MPA CRC (default(1)=enabled)");
+
+static int rcv_win = 256 * 1024;
+module_param(rcv_win, int, 0444);
+MODULE_PARM_DESC(rcv_win, "TCP receive window in bytes (default=256)");
+
+static int snd_win = 32 * 1024;
+module_param(snd_win, int, 0444);
+MODULE_PARM_DESC(snd_win, "TCP send window in bytes (default=32KB)");
+
+static unsigned int nocong = 0;
+module_param(nocong, uint, 0444);
+MODULE_PARM_DESC(nocong, "Turn off congestion control (default=0)");
+
+static unsigned int cong_flavor = 1;
+module_param(cong_flavor, uint, 0444);
+MODULE_PARM_DESC(cong_flavor, "TCP Congestion control flavor (default=1)");
+
+static void process_work(struct work_struct *work);
+static struct workqueue_struct *workq;
+static DECLARE_WORK(skb_work, process_work);
+
+static struct sk_buff_head rxq;
+static cxgb3_cpl_handler_func work_handlers[NUM_CPL_CMDS];
+
+static struct sk_buff *get_skb(struct sk_buff *skb, int len, gfp_t gfp);
+static void ep_timeout(unsigned long arg);
+static void connect_reply_upcall(struct iwch_ep *ep, int status);
+
+static void start_ep_timer(struct iwch_ep *ep)
+{
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+       if (timer_pending(&ep->timer)) {
+               PDBG("%s stopped / restarted timer ep %p\n", __FUNCTION__, ep);
+               del_timer_sync(&ep->timer);
+       } else
+               get_ep(&ep->com);
+       ep->timer.expires = jiffies + ep_timeout_secs * HZ;
+       ep->timer.data = (unsigned long)ep;
+       ep->timer.function = ep_timeout;
+       add_timer(&ep->timer);
+}
+
+static void stop_ep_timer(struct iwch_ep *ep)
+{
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+       del_timer_sync(&ep->timer);
+       put_ep(&ep->com);
+}
+
+static void release_tid(struct t3cdev *tdev, u32 hwtid, struct sk_buff *skb)
+{
+       struct cpl_tid_release *req;
+
+       skb = get_skb(skb, sizeof *req, GFP_KERNEL);
+       if (!skb)
+               return;
+       req = (struct cpl_tid_release *) skb_put(skb, sizeof(*req));
+       req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
+       OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_TID_RELEASE, hwtid));
+       skb->priority = CPL_PRIORITY_SETUP;
+       tdev->send(tdev, skb);
+       return;
+}
+
+int iwch_quiesce_tid(struct iwch_ep *ep)
+{
+       struct cpl_set_tcb_field *req;
+       struct sk_buff *skb = get_skb(NULL, sizeof(*req), GFP_KERNEL);
+
+       if (!skb)
+               return -ENOMEM;
+       req = (struct cpl_set_tcb_field *) skb_put(skb, sizeof(*req));
+       req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
+       req->wr.wr_lo = htonl(V_WR_TID(ep->hwtid));
+       OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, ep->hwtid));
+       req->reply = 0;
+       req->cpu_idx = 0;
+       req->word = htons(W_TCB_RX_QUIESCE);
+       req->mask = cpu_to_be64(1ULL << S_TCB_RX_QUIESCE);
+       req->val = cpu_to_be64(1 << S_TCB_RX_QUIESCE);
+
+       skb->priority = CPL_PRIORITY_DATA;
+       ep->com.tdev->send(ep->com.tdev, skb);
+       return 0;
+}
+
+int iwch_resume_tid(struct iwch_ep *ep)
+{
+       struct cpl_set_tcb_field *req;
+       struct sk_buff *skb = get_skb(NULL, sizeof(*req), GFP_KERNEL);
+
+       if (!skb)
+               return -ENOMEM;
+       req = (struct cpl_set_tcb_field *) skb_put(skb, sizeof(*req));
+       req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
+       req->wr.wr_lo = htonl(V_WR_TID(ep->hwtid));
+       OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, ep->hwtid));
+       req->reply = 0;
+       req->cpu_idx = 0;
+       req->word = htons(W_TCB_RX_QUIESCE);
+       req->mask = cpu_to_be64(1ULL << S_TCB_RX_QUIESCE);
+       req->val = 0;
+
+       skb->priority = CPL_PRIORITY_DATA;
+       ep->com.tdev->send(ep->com.tdev, skb);
+       return 0;
+}
+
+static void set_emss(struct iwch_ep *ep, u16 opt)
+{
+       PDBG("%s ep %p opt %u\n", __FUNCTION__, ep, opt);
+       ep->emss = T3C_DATA(ep->com.tdev)->mtus[G_TCPOPT_MSS(opt)] - 40;
+       if (G_TCPOPT_TSTAMP(opt))
+               ep->emss -= 12;
+       if (ep->emss < 128)
+               ep->emss = 128;
+       PDBG("emss=%d\n", ep->emss);
+}
+
+static enum iwch_ep_state state_read(struct iwch_ep_common *epc)
+{
+       unsigned long flags;
+       enum iwch_ep_state state;
+
+       spin_lock_irqsave(&epc->lock, flags);
+       state = epc->state;
+       spin_unlock_irqrestore(&epc->lock, flags);
+       return state;
+}
+
+static inline void __state_set(struct iwch_ep_common *epc,
+                              enum iwch_ep_state new)
+{
+       epc->state = new;
+}
+
+static void state_set(struct iwch_ep_common *epc, enum iwch_ep_state new)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&epc->lock, flags);
+       PDBG("%s - %s -> %s\n", __FUNCTION__, states[epc->state], states[new]);
+       __state_set(epc, new);
+       spin_unlock_irqrestore(&epc->lock, flags);
+       return;
+}
+
+static void *alloc_ep(int size, gfp_t gfp)
+{
+       struct iwch_ep_common *epc;
+
+       epc = kmalloc(size, gfp);
+       if (epc) {
+               memset(epc, 0, size);
+               kref_init(&epc->kref);
+               spin_lock_init(&epc->lock);
+               init_waitqueue_head(&epc->waitq);
+       }
+       PDBG("%s alloc ep %p\n", __FUNCTION__, epc);
+       return epc;
+}
+
+void __free_ep(struct kref *kref)
+{
+       struct iwch_ep_common *epc;
+       epc = container_of(kref, struct iwch_ep_common, kref);
+       PDBG("%s ep %p state %s\n", __FUNCTION__, epc, states[state_read(epc)]);
+       kfree(epc);
+}
+
+static void release_ep_resources(struct iwch_ep *ep)
+{
+       PDBG("%s ep %p tid %d\n", __FUNCTION__, ep, ep->hwtid);
+       cxgb3_remove_tid(ep->com.tdev, (void *)ep, ep->hwtid);
+       dst_release(ep->dst);
+       l2t_release(L2DATA(ep->com.tdev), ep->l2t);
+       if (ep->com.tdev->type == T3B)
+               release_tid(ep->com.tdev, ep->hwtid, NULL);
+       put_ep(&ep->com);
+}
+
+static void process_work(struct work_struct *work)
+{
+       struct sk_buff *skb = NULL;
+       void *ep;
+       struct t3cdev *tdev;
+       int ret;
+
+       while ((skb = skb_dequeue(&rxq))) {
+               ep = *((void **) (skb->cb));
+               tdev = *((struct t3cdev **) (skb->cb + sizeof(void *)));
+               ret = work_handlers[G_OPCODE(ntohl((__force __be32)skb->csum))](tdev, skb, ep);
+               if (ret & CPL_RET_BUF_DONE)
+                       kfree_skb(skb);
+
+               /*
+                * ep was referenced in sched(), and is freed here.
+                */
+               put_ep((struct iwch_ep_common *)ep);
+       }
+}
+
+static int status2errno(int status)
+{
+       switch (status) {
+       case CPL_ERR_NONE:
+               return 0;
+       case CPL_ERR_CONN_RESET:
+               return -ECONNRESET;
+       case CPL_ERR_ARP_MISS:
+               return -EHOSTUNREACH;
+       case CPL_ERR_CONN_TIMEDOUT:
+               return -ETIMEDOUT;
+       case CPL_ERR_TCAM_FULL:
+               return -ENOMEM;
+       case CPL_ERR_CONN_EXIST:
+               return -EADDRINUSE;
+       default:
+               return -EIO;
+       }
+}
+
+/*
+ * Try and reuse skbs already allocated...
+ */
+static struct sk_buff *get_skb(struct sk_buff *skb, int len, gfp_t gfp)
+{
+       if (skb) {
+               BUG_ON(skb_cloned(skb));
+               skb_trim(skb, 0);
+               skb_get(skb);
+       } else {
+               skb = alloc_skb(len, gfp);
+       }
+       return skb;
+}
+
+static struct rtable *find_route(struct t3cdev *dev, __be32 local_ip,
+                                __be32 peer_ip, __be16 local_port,
+                                __be16 peer_port, u8 tos)
+{
+       struct rtable *rt;
+       struct flowi fl = {
+               .oif = 0,
+               .nl_u = {
+                        .ip4_u = {
+                                  .daddr = peer_ip,
+                                  .saddr = local_ip,
+                                  .tos = tos}
+                        },
+               .proto = IPPROTO_TCP,
+               .uli_u = {
+                         .ports = {
+                                   .sport = local_port,
+                                   .dport = peer_port}
+                         }
+       };
+
+       if (ip_route_output_flow(&rt, &fl, NULL, 0))
+               return NULL;
+       return rt;
+}
+
+static unsigned int find_best_mtu(const struct t3c_data *d, unsigned short mtu)
+{
+       int i = 0;
+
+       while (i < d->nmtus - 1 && d->mtus[i + 1] <= mtu)
+               ++i;
+       return i;
+}
+
+static void arp_failure_discard(struct t3cdev *dev, struct sk_buff *skb)
+{
+       PDBG("%s t3cdev %p\n", __FUNCTION__, dev);
+       kfree_skb(skb);
+}
+
+/*
+ * Handle an ARP failure for an active open.
+ */
+static void act_open_req_arp_failure(struct t3cdev *dev, struct sk_buff *skb)
+{
+       printk(KERN_ERR MOD "ARP failure duing connect\n");
+       kfree_skb(skb);
+}
+
+/*
+ * Handle an ARP failure for a CPL_ABORT_REQ.  Change it into a no RST variant
+ * and send it along.
+ */
+static void abort_arp_failure(struct t3cdev *dev, struct sk_buff *skb)
+{
+       struct cpl_abort_req *req = cplhdr(skb);
+
+       PDBG("%s t3cdev %p\n", __FUNCTION__, dev);
+       req->cmd = CPL_ABORT_NO_RST;
+       cxgb3_ofld_send(dev, skb);
+}
+
+static int send_halfclose(struct iwch_ep *ep, gfp_t gfp)
+{
+       struct cpl_close_con_req *req;
+       struct sk_buff *skb;
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+       skb = get_skb(NULL, sizeof(*req), gfp);
+       if (!skb) {
+               printk(KERN_ERR MOD "%s - failed to alloc skb\n", __FUNCTION__);
+               return -ENOMEM;
+       }
+       skb->priority = CPL_PRIORITY_DATA;
+       set_arp_failure_handler(skb, arp_failure_discard);
+       req = (struct cpl_close_con_req *) skb_put(skb, sizeof(*req));
+       req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_CLOSE_CON));
+       req->wr.wr_lo = htonl(V_WR_TID(ep->hwtid));
+       OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_CLOSE_CON_REQ, ep->hwtid));
+       l2t_send(ep->com.tdev, skb, ep->l2t);
+       return 0;
+}
+
+static int send_abort(struct iwch_ep *ep, struct sk_buff *skb, gfp_t gfp)
+{
+       struct cpl_abort_req *req;
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+       skb = get_skb(skb, sizeof(*req), gfp);
+       if (!skb) {
+               printk(KERN_ERR MOD "%s - failed to alloc skb.\n",
+                      __FUNCTION__);
+               return -ENOMEM;
+       }
+       skb->priority = CPL_PRIORITY_DATA;
+       set_arp_failure_handler(skb, abort_arp_failure);
+       req = (struct cpl_abort_req *) skb_put(skb, sizeof(*req));
+       req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_HOST_ABORT_CON_REQ));
+       req->wr.wr_lo = htonl(V_WR_TID(ep->hwtid));
+       OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_ABORT_REQ, ep->hwtid));
+       req->cmd = CPL_ABORT_SEND_RST;
+       l2t_send(ep->com.tdev, skb, ep->l2t);
+       return 0;
+}
+
+static int send_connect(struct iwch_ep *ep)
+{
+       struct cpl_act_open_req *req;
+       struct sk_buff *skb;
+       u32 opt0h, opt0l, opt2;
+       unsigned int mtu_idx;
+       int wscale;
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+
+       skb = get_skb(NULL, sizeof(*req), GFP_KERNEL);
+       if (!skb) {
+               printk(KERN_ERR MOD "%s - failed to alloc skb.\n",
+                      __FUNCTION__);
+               return -ENOMEM;
+       }
+       mtu_idx = find_best_mtu(T3C_DATA(ep->com.tdev), dst_mtu(ep->dst));
+       wscale = compute_wscale(rcv_win);
+       opt0h = V_NAGLE(0) |
+           V_NO_CONG(nocong) |
+           V_KEEP_ALIVE(1) |
+           F_TCAM_BYPASS |
+           V_WND_SCALE(wscale) |
+           V_MSS_IDX(mtu_idx) |
+           V_L2T_IDX(ep->l2t->idx) | V_TX_CHANNEL(ep->l2t->smt_idx);
+       opt0l = V_TOS((ep->tos >> 2) & M_TOS) | V_RCV_BUFSIZ(rcv_win>>10);
+       opt2 = V_FLAVORS_VALID(1) | V_CONG_CONTROL_FLAVOR(cong_flavor);
+       skb->priority = CPL_PRIORITY_SETUP;
+       set_arp_failure_handler(skb, act_open_req_arp_failure);
+
+       req = (struct cpl_act_open_req *) skb_put(skb, sizeof(*req));
+       req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
+       OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_ACT_OPEN_REQ, ep->atid));
+       req->local_port = ep->com.local_addr.sin_port;
+       req->peer_port = ep->com.remote_addr.sin_port;
+       req->local_ip = ep->com.local_addr.sin_addr.s_addr;
+       req->peer_ip = ep->com.remote_addr.sin_addr.s_addr;
+       req->opt0h = htonl(opt0h);
+       req->opt0l = htonl(opt0l);
+       req->params = 0;
+       req->opt2 = htonl(opt2);
+       l2t_send(ep->com.tdev, skb, ep->l2t);
+       return 0;
+}
+
+static void send_mpa_req(struct iwch_ep *ep, struct sk_buff *skb)
+{
+       int mpalen;
+       struct tx_data_wr *req;
+       struct mpa_message *mpa;
+       int len;
+
+       PDBG("%s ep %p pd_len %d\n", __FUNCTION__, ep, ep->plen);
+
+       BUG_ON(skb_cloned(skb));
+
+       mpalen = sizeof(*mpa) + ep->plen;
+       if (skb->data + mpalen + sizeof(*req) > skb->end) {
+               kfree_skb(skb);
+               skb=alloc_skb(mpalen + sizeof(*req), GFP_KERNEL);
+               if (!skb) {
+                       connect_reply_upcall(ep, -ENOMEM);
+                       return;
+               }
+       }
+       skb_trim(skb, 0);
+       skb_reserve(skb, sizeof(*req));
+       skb_put(skb, mpalen);
+       skb->priority = CPL_PRIORITY_DATA;
+       mpa = (struct mpa_message *) skb->data;
+       memset(mpa, 0, sizeof(*mpa));
+       memcpy(mpa->key, MPA_KEY_REQ, sizeof(mpa->key));
+       mpa->flags = (crc_enabled ? MPA_CRC : 0) |
+                    (markers_enabled ? MPA_MARKERS : 0);
+       mpa->private_data_size = htons(ep->plen);
+       mpa->revision = mpa_rev;
+
+       if (ep->plen)
+               memcpy(mpa->private_data, ep->mpa_pkt + sizeof(*mpa), ep->plen);
+
+       /*
+        * Reference the mpa skb.  This ensures the data area
+        * will remain in memory until the hw acks the tx.
+        * Function tx_ack() will deref it.
+        */
+       skb_get(skb);
+       set_arp_failure_handler(skb, arp_failure_discard);
+       skb->h.raw = skb->data;
+       len = skb->len;
+       req = (struct tx_data_wr *) skb_push(skb, sizeof(*req));
+       req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_TX_DATA));
+       req->wr_lo = htonl(V_WR_TID(ep->hwtid));
+       req->len = htonl(len);
+       req->param = htonl(V_TX_PORT(ep->l2t->smt_idx) |
+                          V_TX_SNDBUF(snd_win>>15));
+       req->flags = htonl(F_TX_IMM_ACK|F_TX_INIT);
+       req->sndseq = htonl(ep->snd_seq);
+       BUG_ON(ep->mpa_skb);
+       ep->mpa_skb = skb;
+       l2t_send(ep->com.tdev, skb, ep->l2t);
+       start_ep_timer(ep);
+       state_set(&ep->com, MPA_REQ_SENT);
+       return;
+}
+
+static int send_mpa_reject(struct iwch_ep *ep, const void *pdata, u8 plen)
+{
+       int mpalen;
+       struct tx_data_wr *req;
+       struct mpa_message *mpa;
+       struct sk_buff *skb;
+
+       PDBG("%s ep %p plen %d\n", __FUNCTION__, ep, plen);
+
+       mpalen = sizeof(*mpa) + plen;
+
+       skb = get_skb(NULL, mpalen + sizeof(*req), GFP_KERNEL);
+       if (!skb) {
+               printk(KERN_ERR MOD "%s - cannot alloc skb!\n", __FUNCTION__);
+               return -ENOMEM;
+       }
+       skb_reserve(skb, sizeof(*req));
+       mpa = (struct mpa_message *) skb_put(skb, mpalen);
+       memset(mpa, 0, sizeof(*mpa));
+       memcpy(mpa->key, MPA_KEY_REP, sizeof(mpa->key));
+       mpa->flags = MPA_REJECT;
+       mpa->revision = mpa_rev;
+       mpa->private_data_size = htons(plen);
+       if (plen)
+               memcpy(mpa->private_data, pdata, plen);
+
+       /*
+        * Reference the mpa skb again.  This ensures the data area
+        * will remain in memory until the hw acks the tx.
+        * Function tx_ack() will deref it.
+        */
+       skb_get(skb);
+       skb->priority = CPL_PRIORITY_DATA;
+       set_arp_failure_handler(skb, arp_failure_discard);
+       skb->h.raw = skb->data;
+       req = (struct tx_data_wr *) skb_push(skb, sizeof(*req));
+       req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_TX_DATA));
+       req->wr_lo = htonl(V_WR_TID(ep->hwtid));
+       req->len = htonl(mpalen);
+       req->param = htonl(V_TX_PORT(ep->l2t->smt_idx) |
+                          V_TX_SNDBUF(snd_win>>15));
+       req->flags = htonl(F_TX_IMM_ACK|F_TX_INIT);
+       req->sndseq = htonl(ep->snd_seq);
+       BUG_ON(ep->mpa_skb);
+       ep->mpa_skb = skb;
+       l2t_send(ep->com.tdev, skb, ep->l2t);
+       return 0;
+}
+
+static int send_mpa_reply(struct iwch_ep *ep, const void *pdata, u8 plen)
+{
+       int mpalen;
+       struct tx_data_wr *req;
+       struct mpa_message *mpa;
+       int len;
+       struct sk_buff *skb;
+
+       PDBG("%s ep %p plen %d\n", __FUNCTION__, ep, plen);
+
+       mpalen = sizeof(*mpa) + plen;
+
+       skb = get_skb(NULL, mpalen + sizeof(*req), GFP_KERNEL);
+       if (!skb) {
+               printk(KERN_ERR MOD "%s - cannot alloc skb!\n", __FUNCTION__);
+               return -ENOMEM;
+       }
+       skb->priority = CPL_PRIORITY_DATA;
+       skb_reserve(skb, sizeof(*req));
+       mpa = (struct mpa_message *) skb_put(skb, mpalen);
+       memset(mpa, 0, sizeof(*mpa));
+       memcpy(mpa->key, MPA_KEY_REP, sizeof(mpa->key));
+       mpa->flags = (ep->mpa_attr.crc_enabled ? MPA_CRC : 0) |
+                    (markers_enabled ? MPA_MARKERS : 0);
+       mpa->revision = mpa_rev;
+       mpa->private_data_size = htons(plen);
+       if (plen)
+               memcpy(mpa->private_data, pdata, plen);
+
+       /*
+        * Reference the mpa skb.  This ensures the data area
+        * will remain in memory until the hw acks the tx.
+        * Function tx_ack() will deref it.
+        */
+       skb_get(skb);
+       set_arp_failure_handler(skb, arp_failure_discard);
+       skb->h.raw = skb->data;
+       len = skb->len;
+       req = (struct tx_data_wr *) skb_push(skb, sizeof(*req));
+       req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_TX_DATA));
+       req->wr_lo = htonl(V_WR_TID(ep->hwtid));
+       req->len = htonl(len);
+       req->param = htonl(V_TX_PORT(ep->l2t->smt_idx) |
+                          V_TX_SNDBUF(snd_win>>15));
+       req->flags = htonl(F_TX_MORE | F_TX_IMM_ACK | F_TX_INIT);
+       req->sndseq = htonl(ep->snd_seq);
+       ep->mpa_skb = skb;
+       state_set(&ep->com, MPA_REP_SENT);
+       l2t_send(ep->com.tdev, skb, ep->l2t);
+       return 0;
+}
+
+static int act_establish(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
+{
+       struct iwch_ep *ep = ctx;
+       struct cpl_act_establish *req = cplhdr(skb);
+       unsigned int tid = GET_TID(req);
+
+       PDBG("%s ep %p tid %d\n", __FUNCTION__, ep, tid);
+
+       dst_confirm(ep->dst);
+
+       /* setup the hwtid for this connection */
+       ep->hwtid = tid;
+       cxgb3_insert_tid(ep->com.tdev, &t3c_client, ep, tid);
+
+       ep->snd_seq = ntohl(req->snd_isn);
+
+       set_emss(ep, ntohs(req->tcp_opt));
+
+       /* dealloc the atid */
+       cxgb3_free_atid(ep->com.tdev, ep->atid);
+
+       /* start MPA negotiation */
+       send_mpa_req(ep, skb);
+
+       return 0;
+}
+
+static void abort_connection(struct iwch_ep *ep, struct sk_buff *skb, gfp_t gfp)
+{
+       PDBG("%s ep %p\n", __FILE__, ep);
+       state_set(&ep->com, ABORTING);
+       send_abort(ep, skb, gfp);
+}
+
+static void close_complete_upcall(struct iwch_ep *ep)
+{
+       struct iw_cm_event event;
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+       memset(&event, 0, sizeof(event));
+       event.event = IW_CM_EVENT_CLOSE;
+       if (ep->com.cm_id) {
+               PDBG("close complete delivered ep %p cm_id %p tid %d\n",
+                    ep, ep->com.cm_id, ep->hwtid);
+               ep->com.cm_id->event_handler(ep->com.cm_id, &event);
+               ep->com.cm_id->rem_ref(ep->com.cm_id);
+               ep->com.cm_id = NULL;
+               ep->com.qp = NULL;
+       }
+}
+
+static void peer_close_upcall(struct iwch_ep *ep)
+{
+       struct iw_cm_event event;
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+       memset(&event, 0, sizeof(event));
+       event.event = IW_CM_EVENT_DISCONNECT;
+       if (ep->com.cm_id) {
+               PDBG("peer close delivered ep %p cm_id %p tid %d\n",
+                    ep, ep->com.cm_id, ep->hwtid);
+               ep->com.cm_id->event_handler(ep->com.cm_id, &event);
+       }
+}
+
+static void peer_abort_upcall(struct iwch_ep *ep)
+{
+       struct iw_cm_event event;
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+       memset(&event, 0, sizeof(event));
+       event.event = IW_CM_EVENT_CLOSE;
+       event.status = -ECONNRESET;
+       if (ep->com.cm_id) {
+               PDBG("abort delivered ep %p cm_id %p tid %d\n", ep,
+                    ep->com.cm_id, ep->hwtid);
+               ep->com.cm_id->event_handler(ep->com.cm_id, &event);
+               ep->com.cm_id->rem_ref(ep->com.cm_id);
+               ep->com.cm_id = NULL;
+               ep->com.qp = NULL;
+       }
+}
+
+static void connect_reply_upcall(struct iwch_ep *ep, int status)
+{
+       struct iw_cm_event event;
+
+       PDBG("%s ep %p status %d\n", __FUNCTION__, ep, status);
+       memset(&event, 0, sizeof(event));
+       event.event = IW_CM_EVENT_CONNECT_REPLY;
+       event.status = status;
+       event.local_addr = ep->com.local_addr;
+       event.remote_addr = ep->com.remote_addr;
+
+       if ((status == 0) || (status == -ECONNREFUSED)) {
+               event.private_data_len = ep->plen;
+               event.private_data = ep->mpa_pkt + sizeof(struct mpa_message);
+       }
+       if (ep->com.cm_id) {
+               PDBG("%s ep %p tid %d status %d\n", __FUNCTION__, ep,
+                    ep->hwtid, status);
+               ep->com.cm_id->event_handler(ep->com.cm_id, &event);
+       }
+       if (status < 0) {
+               ep->com.cm_id->rem_ref(ep->com.cm_id);
+               ep->com.cm_id = NULL;
+               ep->com.qp = NULL;
+       }
+}
+
+static void connect_request_upcall(struct iwch_ep *ep)
+{
+       struct iw_cm_event event;
+
+       PDBG("%s ep %p tid %d\n", __FUNCTION__, ep, ep->hwtid);
+       memset(&event, 0, sizeof(event));
+       event.event = IW_CM_EVENT_CONNECT_REQUEST;
+       event.local_addr = ep->com.local_addr;
+       event.remote_addr = ep->com.remote_addr;
+       event.private_data_len = ep->plen;
+       event.private_data = ep->mpa_pkt + sizeof(struct mpa_message);
+       event.provider_data = ep;
+       if (state_read(&ep->parent_ep->com) != DEAD)
+               ep->parent_ep->com.cm_id->event_handler(
+                                               ep->parent_ep->com.cm_id,
+                                               &event);
+       put_ep(&ep->parent_ep->com);
+       ep->parent_ep = NULL;
+}
+
+static void established_upcall(struct iwch_ep *ep)
+{
+       struct iw_cm_event event;
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+       memset(&event, 0, sizeof(event));
+       event.event = IW_CM_EVENT_ESTABLISHED;
+       if (ep->com.cm_id) {
+               PDBG("%s ep %p tid %d\n", __FUNCTION__, ep, ep->hwtid);
+               ep->com.cm_id->event_handler(ep->com.cm_id, &event);
+       }
+}
+
+static int update_rx_credits(struct iwch_ep *ep, u32 credits)
+{
+       struct cpl_rx_data_ack *req;
+       struct sk_buff *skb;
+
+       PDBG("%s ep %p credits %u\n", __FUNCTION__, ep, credits);
+       skb = get_skb(NULL, sizeof(*req), GFP_KERNEL);
+       if (!skb) {
+               printk(KERN_ERR MOD "update_rx_credits - cannot alloc skb!\n");
+               return 0;
+       }
+
+       req = (struct cpl_rx_data_ack *) skb_put(skb, sizeof(*req));
+       req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
+       OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_RX_DATA_ACK, ep->hwtid));
+       req->credit_dack = htonl(V_RX_CREDITS(credits) | V_RX_FORCE_ACK(1));
+       skb->priority = CPL_PRIORITY_ACK;
+       ep->com.tdev->send(ep->com.tdev, skb);
+       return credits;
+}
+
+static void process_mpa_reply(struct iwch_ep *ep, struct sk_buff *skb)
+{
+       struct mpa_message *mpa;
+       u16 plen;
+       struct iwch_qp_attributes attrs;
+       enum iwch_qp_attr_mask mask;
+       int err;
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+
+       /*
+        * Stop mpa timer.  If it expired, then the state has
+        * changed and we bail since ep_timeout already aborted
+        * the connection.
+        */
+       stop_ep_timer(ep);
+       if (state_read(&ep->com) != MPA_REQ_SENT)
+               return;
+
+       /*
+        * If we get more than the supported amount of private data
+        * then we must fail this connection.
+        */
+       if (ep->mpa_pkt_len + skb->len > sizeof(ep->mpa_pkt)) {
+               err = -EINVAL;
+               goto err;
+       }
+
+       /*
+        * copy the new data into our accumulation buffer.
+        */
+       memcpy(&(ep->mpa_pkt[ep->mpa_pkt_len]), skb->data, skb->len);
+       ep->mpa_pkt_len += skb->len;
+
+       /*
+        * if we don't even have the mpa message, then bail.
+        */
+       if (ep->mpa_pkt_len < sizeof(*mpa))
+               return;
+       mpa = (struct mpa_message *) ep->mpa_pkt;
+
+       /* Validate MPA header. */
+       if (mpa->revision != mpa_rev) {
+               err = -EPROTO;
+               goto err;
+       }
+       if (memcmp(mpa->key, MPA_KEY_REP, sizeof(mpa->key))) {
+               err = -EPROTO;
+               goto err;
+       }
+
+       plen = ntohs(mpa->private_data_size);
+
+       /*
+        * Fail if there's too much private data.
+        */
+       if (plen > MPA_MAX_PRIVATE_DATA) {
+               err = -EPROTO;
+               goto err;
+       }
+
+       /*
+        * If plen does not account for pkt size
+        */
+       if (ep->mpa_pkt_len > (sizeof(*mpa) + plen)) {
+               err = -EPROTO;
+               goto err;
+       }
+
+       ep->plen = (u8) plen;
+
+       /*
+        * If we don't have all the pdata yet, then bail.
+        * We'll continue process when more data arrives.
+        */
+       if (ep->mpa_pkt_len < (sizeof(*mpa) + plen))
+               return;
+
+       if (mpa->flags & MPA_REJECT) {
+               err = -ECONNREFUSED;
+               goto err;
+       }
+
+       /*
+        * If we get here we have accumulated the entire mpa
+        * start reply message including private data. And
+        * the MPA header is valid.
+        */
+       state_set(&ep->com, FPDU_MODE);
+       ep->mpa_attr.crc_enabled = (mpa->flags & MPA_CRC) | crc_enabled ? 1 : 0;
+       ep->mpa_attr.recv_marker_enabled = markers_enabled;
+       ep->mpa_attr.xmit_marker_enabled = mpa->flags & MPA_MARKERS ? 1 : 0;
+       ep->mpa_attr.version = mpa_rev;
+       PDBG("%s - crc_enabled=%d, recv_marker_enabled=%d, "
+            "xmit_marker_enabled=%d, version=%d\n", __FUNCTION__,
+            ep->mpa_attr.crc_enabled, ep->mpa_attr.recv_marker_enabled,
+            ep->mpa_attr.xmit_marker_enabled, ep->mpa_attr.version);
+
+       attrs.mpa_attr = ep->mpa_attr;
+       attrs.max_ird = ep->ird;
+       attrs.max_ord = ep->ord;
+       attrs.llp_stream_handle = ep;
+       attrs.next_state = IWCH_QP_STATE_RTS;
+
+       mask = IWCH_QP_ATTR_NEXT_STATE |
+           IWCH_QP_ATTR_LLP_STREAM_HANDLE | IWCH_QP_ATTR_MPA_ATTR |
+           IWCH_QP_ATTR_MAX_IRD | IWCH_QP_ATTR_MAX_ORD;
+
+       /* bind QP and TID with INIT_WR */
+       err = iwch_modify_qp(ep->com.qp->rhp,
+                            ep->com.qp, mask, &attrs, 1);
+       if (!err)
+               goto out;
+err:
+       abort_connection(ep, skb, GFP_KERNEL);
+out:
+       connect_reply_upcall(ep, err);
+       return;
+}
+
+static void process_mpa_request(struct iwch_ep *ep, struct sk_buff *skb)
+{
+       struct mpa_message *mpa;
+       u16 plen;
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+
+       /*
+        * Stop mpa timer.  If it expired, then the state has
+        * changed and we bail since ep_timeout already aborted
+        * the connection.
+        */
+       stop_ep_timer(ep);
+       if (state_read(&ep->com) != MPA_REQ_WAIT)
+               return;
+
+       /*
+        * If we get more than the supported amount of private data
+        * then we must fail this connection.
+        */
+       if (ep->mpa_pkt_len + skb->len > sizeof(ep->mpa_pkt)) {
+               abort_connection(ep, skb, GFP_KERNEL);
+               return;
+       }
+
+       PDBG("%s enter (%s line %u)\n", __FUNCTION__, __FILE__, __LINE__);
+
+       /*
+        * Copy the new data into our accumulation buffer.
+        */
+       memcpy(&(ep->mpa_pkt[ep->mpa_pkt_len]), skb->data, skb->len);
+       ep->mpa_pkt_len += skb->len;
+
+       /*
+        * If we don't even have the mpa message, then bail.
+        * We'll continue process when more data arrives.
+        */
+       if (ep->mpa_pkt_len < sizeof(*mpa))
+               return;
+       PDBG("%s enter (%s line %u)\n", __FUNCTION__, __FILE__, __LINE__);
+       mpa = (struct mpa_message *) ep->mpa_pkt;
+
+       /*
+        * Validate MPA Header.
+        */
+       if (mpa->revision != mpa_rev) {
+               abort_connection(ep, skb, GFP_KERNEL);
+               return;
+       }
+
+       if (memcmp(mpa->key, MPA_KEY_REQ, sizeof(mpa->key))) {
+               abort_connection(ep, skb, GFP_KERNEL);
+               return;
+       }
+
+       plen = ntohs(mpa->private_data_size);
+
+       /*
+        * Fail if there's too much private data.
+        */
+       if (plen > MPA_MAX_PRIVATE_DATA) {
+               abort_connection(ep, skb, GFP_KERNEL);
+               return;
+       }
+
+       /*
+        * If plen does not account for pkt size
+        */
+       if (ep->mpa_pkt_len > (sizeof(*mpa) + plen)) {
+               abort_connection(ep, skb, GFP_KERNEL);
+               return;
+       }
+       ep->plen = (u8) plen;
+
+       /*
+        * If we don't have all the pdata yet, then bail.
+        */
+       if (ep->mpa_pkt_len < (sizeof(*mpa) + plen))
+               return;
+
+       /*
+        * If we get here we have accumulated the entire mpa
+        * start reply message including private data.
+        */
+       ep->mpa_attr.crc_enabled = (mpa->flags & MPA_CRC) | crc_enabled ? 1 : 0;
+       ep->mpa_attr.recv_marker_enabled = markers_enabled;
+       ep->mpa_attr.xmit_marker_enabled = mpa->flags & MPA_MARKERS ? 1 : 0;
+       ep->mpa_attr.version = mpa_rev;
+       PDBG("%s - crc_enabled=%d, recv_marker_enabled=%d, "
+            "xmit_marker_enabled=%d, version=%d\n", __FUNCTION__,
+            ep->mpa_attr.crc_enabled, ep->mpa_attr.recv_marker_enabled,
+            ep->mpa_attr.xmit_marker_enabled, ep->mpa_attr.version);
+
+       state_set(&ep->com, MPA_REQ_RCVD);
+
+       /* drive upcall */
+       connect_request_upcall(ep);
+       return;
+}
+
+static int rx_data(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
+{
+       struct iwch_ep *ep = ctx;
+       struct cpl_rx_data *hdr = cplhdr(skb);
+       unsigned int dlen = ntohs(hdr->len);
+
+       PDBG("%s ep %p dlen %u\n", __FUNCTION__, ep, dlen);
+
+       skb_pull(skb, sizeof(*hdr));
+       skb_trim(skb, dlen);
+
+       switch (state_read(&ep->com)) {
+       case MPA_REQ_SENT:
+               process_mpa_reply(ep, skb);
+               break;
+       case MPA_REQ_WAIT:
+               process_mpa_request(ep, skb);
+               break;
+       case MPA_REP_SENT:
+               break;
+       default:
+               printk(KERN_ERR MOD "%s Unexpected streaming data."
+                      " ep %p state %d tid %d\n",
+                      __FUNCTION__, ep, state_read(&ep->com), ep->hwtid);
+
+               /*
+                * The ep will timeout and inform the ULP of the failure.
+                * See ep_timeout().
+                */
+               break;
+       }
+
+       /* update RX credits */
+       update_rx_credits(ep, dlen);
+
+       return CPL_RET_BUF_DONE;
+}
+
+/*
+ * Upcall from the adapter indicating data has been transmitted.
+ * For us its just the single MPA request or reply.  We can now free
+ * the skb holding the mpa message.
+ */
+static int tx_ack(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
+{
+       struct iwch_ep *ep = ctx;
+       struct cpl_wr_ack *hdr = cplhdr(skb);
+       unsigned int credits = ntohs(hdr->credits);
+       enum iwch_qp_attr_mask  mask;
+
+       PDBG("%s ep %p credits %u\n", __FUNCTION__, ep, credits);
+
+       if (credits == 0)
+               return CPL_RET_BUF_DONE;
+       BUG_ON(credits != 1);
+       BUG_ON(ep->mpa_skb == NULL);
+       kfree_skb(ep->mpa_skb);
+       ep->mpa_skb = NULL;
+       dst_confirm(ep->dst);
+       if (state_read(&ep->com) == MPA_REP_SENT) {
+               struct iwch_qp_attributes attrs;
+
+               /* bind QP to EP and move to RTS */
+               attrs.mpa_attr = ep->mpa_attr;
+               attrs.max_ird = ep->ord;
+               attrs.max_ord = ep->ord;
+               attrs.llp_stream_handle = ep;
+               attrs.next_state = IWCH_QP_STATE_RTS;
+
+               /* bind QP and TID with INIT_WR */
+               mask = IWCH_QP_ATTR_NEXT_STATE |
+                                    IWCH_QP_ATTR_LLP_STREAM_HANDLE |
+                                    IWCH_QP_ATTR_MPA_ATTR |
+                                    IWCH_QP_ATTR_MAX_IRD |
+                                    IWCH_QP_ATTR_MAX_ORD;
+
+               ep->com.rpl_err = iwch_modify_qp(ep->com.qp->rhp,
+                                    ep->com.qp, mask, &attrs, 1);
+
+               if (!ep->com.rpl_err) {
+                       state_set(&ep->com, FPDU_MODE);
+                       established_upcall(ep);
+               }
+
+               ep->com.rpl_done = 1;
+               PDBG("waking up ep %p\n", ep);
+               wake_up(&ep->com.waitq);
+       }
+       return CPL_RET_BUF_DONE;
+}
+
+static int abort_rpl(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
+{
+       struct iwch_ep *ep = ctx;
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+
+       close_complete_upcall(ep);
+       state_set(&ep->com, DEAD);
+       release_ep_resources(ep);
+       return CPL_RET_BUF_DONE;
+}
+
+static int act_open_rpl(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
+{
+       struct iwch_ep *ep = ctx;
+       struct cpl_act_open_rpl *rpl = cplhdr(skb);
+
+       PDBG("%s ep %p status %u errno %d\n", __FUNCTION__, ep, rpl->status,
+            status2errno(rpl->status));
+       connect_reply_upcall(ep, status2errno(rpl->status));
+       state_set(&ep->com, DEAD);
+       if (ep->com.tdev->type == T3B)
+               release_tid(ep->com.tdev, GET_TID(rpl), NULL);
+       cxgb3_free_atid(ep->com.tdev, ep->atid);
+       dst_release(ep->dst);
+       l2t_release(L2DATA(ep->com.tdev), ep->l2t);
+       put_ep(&ep->com);
+       return CPL_RET_BUF_DONE;
+}
+
+static int listen_start(struct iwch_listen_ep *ep)
+{
+       struct sk_buff *skb;
+       struct cpl_pass_open_req *req;
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+       skb = get_skb(NULL, sizeof(*req), GFP_KERNEL);
+       if (!skb) {
+               printk(KERN_ERR MOD "t3c_listen_start failed to alloc skb!\n");
+               return -ENOMEM;
+       }
+
+       req = (struct cpl_pass_open_req *) skb_put(skb, sizeof(*req));
+       req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
+       OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_PASS_OPEN_REQ, ep->stid));
+       req->local_port = ep->com.local_addr.sin_port;
+       req->local_ip = ep->com.local_addr.sin_addr.s_addr;
+       req->peer_port = 0;
+       req->peer_ip = 0;
+       req->peer_netmask = 0;
+       req->opt0h = htonl(F_DELACK | F_TCAM_BYPASS);
+       req->opt0l = htonl(V_RCV_BUFSIZ(rcv_win>>10));
+       req->opt1 = htonl(V_CONN_POLICY(CPL_CONN_POLICY_ASK));
+
+       skb->priority = 1;
+       ep->com.tdev->send(ep->com.tdev, skb);
+       return 0;
+}
+
+static int pass_open_rpl(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
+{
+       struct iwch_listen_ep *ep = ctx;
+       struct cpl_pass_open_rpl *rpl = cplhdr(skb);
+
+       PDBG("%s ep %p status %d error %d\n", __FUNCTION__, ep,
+            rpl->status, status2errno(rpl->status));
+       ep->com.rpl_err = status2errno(rpl->status);
+       ep->com.rpl_done = 1;
+       wake_up(&ep->com.waitq);
+
+       return CPL_RET_BUF_DONE;
+}
+
+static int listen_stop(struct iwch_listen_ep *ep)
+{
+       struct sk_buff *skb;
+       struct cpl_close_listserv_req *req;
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+       skb = get_skb(NULL, sizeof(*req), GFP_KERNEL);
+       if (!skb) {
+               printk(KERN_ERR MOD "%s - failed to alloc skb\n", __FUNCTION__);
+               return -ENOMEM;
+       }
+       req = (struct cpl_close_listserv_req *) skb_put(skb, sizeof(*req));
+       req->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
+       OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_CLOSE_LISTSRV_REQ, ep->stid));
+       skb->priority = 1;
+       ep->com.tdev->send(ep->com.tdev, skb);
+       return 0;
+}
+
+static int close_listsrv_rpl(struct t3cdev *tdev, struct sk_buff *skb,
+                            void *ctx)
+{
+       struct iwch_listen_ep *ep = ctx;
+       struct cpl_close_listserv_rpl *rpl = cplhdr(skb);
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+       ep->com.rpl_err = status2errno(rpl->status);
+       ep->com.rpl_done = 1;
+       wake_up(&ep->com.waitq);
+       return CPL_RET_BUF_DONE;
+}
+
+static void accept_cr(struct iwch_ep *ep, __be32 peer_ip, struct sk_buff *skb)
+{
+       struct cpl_pass_accept_rpl *rpl;
+       unsigned int mtu_idx;
+       u32 opt0h, opt0l, opt2;
+       int wscale;
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+       BUG_ON(skb_cloned(skb));
+       skb_trim(skb, sizeof(*rpl));
+       skb_get(skb);
+       mtu_idx = find_best_mtu(T3C_DATA(ep->com.tdev), dst_mtu(ep->dst));
+       wscale = compute_wscale(rcv_win);
+       opt0h = V_NAGLE(0) |
+           V_NO_CONG(nocong) |
+           V_KEEP_ALIVE(1) |
+           F_TCAM_BYPASS |
+           V_WND_SCALE(wscale) |
+           V_MSS_IDX(mtu_idx) |
+           V_L2T_IDX(ep->l2t->idx) | V_TX_CHANNEL(ep->l2t->smt_idx);
+       opt0l = V_TOS((ep->tos >> 2) & M_TOS) | V_RCV_BUFSIZ(rcv_win>>10);
+       opt2 = V_FLAVORS_VALID(1) | V_CONG_CONTROL_FLAVOR(cong_flavor);
+
+       rpl = cplhdr(skb);
+       rpl->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
+       OPCODE_TID(rpl) = htonl(MK_OPCODE_TID(CPL_PASS_ACCEPT_RPL, ep->hwtid));
+       rpl->peer_ip = peer_ip;
+       rpl->opt0h = htonl(opt0h);
+       rpl->opt0l_status = htonl(opt0l | CPL_PASS_OPEN_ACCEPT);
+       rpl->opt2 = htonl(opt2);
+       rpl->rsvd = rpl->opt2;  /* workaround for HW bug */
+       skb->priority = CPL_PRIORITY_SETUP;
+       l2t_send(ep->com.tdev, skb, ep->l2t);
+
+       return;
+}
+
+static void reject_cr(struct t3cdev *tdev, u32 hwtid, __be32 peer_ip,
+                     struct sk_buff *skb)
+{
+       PDBG("%s t3cdev %p tid %u peer_ip %x\n", __FUNCTION__, tdev, hwtid,
+            peer_ip);
+       BUG_ON(skb_cloned(skb));
+       skb_trim(skb, sizeof(struct cpl_tid_release));
+       skb_get(skb);
+
+       if (tdev->type == T3B)
+               release_tid(tdev, hwtid, skb);
+       else {
+               struct cpl_pass_accept_rpl *rpl;
+
+               rpl = cplhdr(skb);
+               skb->priority = CPL_PRIORITY_SETUP;
+               rpl->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
+               OPCODE_TID(rpl) = htonl(MK_OPCODE_TID(CPL_PASS_ACCEPT_RPL,
+                                                     hwtid));
+               rpl->peer_ip = peer_ip;
+               rpl->opt0h = htonl(F_TCAM_BYPASS);
+               rpl->opt0l_status = htonl(CPL_PASS_OPEN_REJECT);
+               rpl->opt2 = 0;
+               rpl->rsvd = rpl->opt2;
+               tdev->send(tdev, skb);
+       }
+}
+
+static int pass_accept_req(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
+{
+       struct iwch_ep *child_ep, *parent_ep = ctx;
+       struct cpl_pass_accept_req *req = cplhdr(skb);
+       unsigned int hwtid = GET_TID(req);
+       struct dst_entry *dst;
+       struct l2t_entry *l2t;
+       struct rtable *rt;
+       struct iff_mac tim;
+
+       PDBG("%s parent ep %p tid %u\n", __FUNCTION__, parent_ep, hwtid);
+
+       if (state_read(&parent_ep->com) != LISTEN) {
+               printk(KERN_ERR "%s - listening ep not in LISTEN\n",
+                      __FUNCTION__);
+               goto reject;
+       }
+
+       /*
+        * Find the netdev for this connection request.
+        */
+       tim.mac_addr = req->dst_mac;
+       tim.vlan_tag = ntohs(req->vlan_tag);
+       if (tdev->ctl(tdev, GET_IFF_FROM_MAC, &tim) < 0 || !tim.dev) {
+               printk(KERN_ERR
+                       "%s bad dst mac %02x %02x %02x %02x %02x %02x\n",
+                       __FUNCTION__,
+                       req->dst_mac[0],
+                       req->dst_mac[1],
+                       req->dst_mac[2],
+                       req->dst_mac[3],
+                       req->dst_mac[4],
+                       req->dst_mac[5]);
+               goto reject;
+       }
+
+       /* Find output route */
+       rt = find_route(tdev,
+                       req->local_ip,
+                       req->peer_ip,
+                       req->local_port,
+                       req->peer_port, G_PASS_OPEN_TOS(ntohl(req->tos_tid)));
+       if (!rt) {
+               printk(KERN_ERR MOD "%s - failed to find dst entry!\n",
+                      __FUNCTION__);
+               goto reject;
+       }
+       dst = &rt->u.dst;
+       l2t = t3_l2t_get(tdev, dst->neighbour, dst->neighbour->dev);
+       if (!l2t) {
+               printk(KERN_ERR MOD "%s - failed to allocate l2t entry!\n",
+                      __FUNCTION__);
+               dst_release(dst);
+               goto reject;
+       }
+       child_ep = alloc_ep(sizeof(*child_ep), GFP_KERNEL);
+       if (!child_ep) {
+               printk(KERN_ERR MOD "%s - failed to allocate ep entry!\n",
+                      __FUNCTION__);
+               l2t_release(L2DATA(tdev), l2t);
+               dst_release(dst);
+               goto reject;
+       }
+       state_set(&child_ep->com, CONNECTING);
+       child_ep->com.tdev = tdev;
+       child_ep->com.cm_id = NULL;
+       child_ep->com.local_addr.sin_family = PF_INET;
+       child_ep->com.local_addr.sin_port = req->local_port;
+       child_ep->com.local_addr.sin_addr.s_addr = req->local_ip;
+       child_ep->com.remote_addr.sin_family = PF_INET;
+       child_ep->com.remote_addr.sin_port = req->peer_port;
+       child_ep->com.remote_addr.sin_addr.s_addr = req->peer_ip;
+       get_ep(&parent_ep->com);
+       child_ep->parent_ep = parent_ep;
+       child_ep->tos = G_PASS_OPEN_TOS(ntohl(req->tos_tid));
+       child_ep->l2t = l2t;
+       child_ep->dst = dst;
+       child_ep->hwtid = hwtid;
+       init_timer(&child_ep->timer);
+       cxgb3_insert_tid(tdev, &t3c_client, child_ep, hwtid);
+       accept_cr(child_ep, req->peer_ip, skb);
+       goto out;
+reject:
+       reject_cr(tdev, hwtid, req->peer_ip, skb);
+out:
+       return CPL_RET_BUF_DONE;
+}
+
+static int pass_establish(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
+{
+       struct iwch_ep *ep = ctx;
+       struct cpl_pass_establish *req = cplhdr(skb);
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+       ep->snd_seq = ntohl(req->snd_isn);
+
+       set_emss(ep, ntohs(req->tcp_opt));
+
+       dst_confirm(ep->dst);
+       state_set(&ep->com, MPA_REQ_WAIT);
+       start_ep_timer(ep);
+
+       return CPL_RET_BUF_DONE;
+}
+
+static int peer_close(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
+{
+       struct iwch_ep *ep = ctx;
+       struct iwch_qp_attributes attrs;
+       unsigned long flags;
+       int disconnect = 1;
+       int release = 0;
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+       dst_confirm(ep->dst);
+
+       spin_lock_irqsave(&ep->com.lock, flags);
+       switch (ep->com.state) {
+       case MPA_REQ_WAIT:
+               __state_set(&ep->com, CLOSING);
+               break;
+       case MPA_REQ_SENT:
+               __state_set(&ep->com, CLOSING);
+               connect_reply_upcall(ep, -ECONNRESET);
+               break;
+       case MPA_REQ_RCVD:
+
+               /*
+                * We're gonna mark this puppy DEAD, but keep
+                * the reference on it until the ULP accepts or
+                * rejects the CR.
+                */
+               __state_set(&ep->com, CLOSING);
+               get_ep(&ep->com);
+               break;
+       case MPA_REP_SENT:
+               __state_set(&ep->com, CLOSING);
+               ep->com.rpl_done = 1;
+               ep->com.rpl_err = -ECONNRESET;
+               PDBG("waking up ep %p\n", ep);
+               wake_up(&ep->com.waitq);
+               break;
+       case FPDU_MODE:
+               __state_set(&ep->com, CLOSING);
+               attrs.next_state = IWCH_QP_STATE_CLOSING;
+               iwch_modify_qp(ep->com.qp->rhp, ep->com.qp,
+                              IWCH_QP_ATTR_NEXT_STATE, &attrs, 1);
+               peer_close_upcall(ep);
+               break;
+       case ABORTING:
+               disconnect = 0;
+               break;
+       case CLOSING:
+               start_ep_timer(ep);
+               __state_set(&ep->com, MORIBUND);
+               disconnect = 0;
+               break;
+       case MORIBUND:
+               stop_ep_timer(ep);
+               if (ep->com.cm_id && ep->com.qp) {
+                       attrs.next_state = IWCH_QP_STATE_IDLE;
+                       iwch_modify_qp(ep->com.qp->rhp, ep->com.qp,
+                                      IWCH_QP_ATTR_NEXT_STATE, &attrs, 1);
+               }
+               close_complete_upcall(ep);
+               __state_set(&ep->com, DEAD);
+               release = 1;
+               disconnect = 0;
+               break;
+       case DEAD:
+               disconnect = 0;
+               break;
+       default:
+               BUG_ON(1);
+       }
+       spin_unlock_irqrestore(&ep->com.lock, flags);
+       if (disconnect)
+               iwch_ep_disconnect(ep, 0, GFP_KERNEL);
+       if (release)
+               release_ep_resources(ep);
+       return CPL_RET_BUF_DONE;
+}
+
+/*
+ * Returns whether an ABORT_REQ_RSS message is a negative advice.
+ */
+static inline int is_neg_adv_abort(unsigned int status)
+{
+       return status == CPL_ERR_RTX_NEG_ADVICE ||
+              status == CPL_ERR_PERSIST_NEG_ADVICE;
+}
+
+static int peer_abort(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
+{
+       struct cpl_abort_req_rss *req = cplhdr(skb);
+       struct iwch_ep *ep = ctx;
+       struct cpl_abort_rpl *rpl;
+       struct sk_buff *rpl_skb;
+       struct iwch_qp_attributes attrs;
+       int ret;
+       int state;
+
+       if (is_neg_adv_abort(req->status)) {
+               PDBG("%s neg_adv_abort ep %p tid %d\n", __FUNCTION__, ep,
+                    ep->hwtid);
+               t3_l2t_send_event(ep->com.tdev, ep->l2t);
+               return CPL_RET_BUF_DONE;
+       }
+
+       state = state_read(&ep->com);
+       PDBG("%s ep %p state %u\n", __FUNCTION__, ep, state);
+       switch (state) {
+       case CONNECTING:
+               break;
+       case MPA_REQ_WAIT:
+               break;
+       case MPA_REQ_SENT:
+               connect_reply_upcall(ep, -ECONNRESET);
+               break;
+       case MPA_REP_SENT:
+               ep->com.rpl_done = 1;
+               ep->com.rpl_err = -ECONNRESET;
+               PDBG("waking up ep %p\n", ep);
+               wake_up(&ep->com.waitq);
+               break;
+       case MPA_REQ_RCVD:
+
+               /*
+                * We're gonna mark this puppy DEAD, but keep
+                * the reference on it until the ULP accepts or
+                * rejects the CR.
+                */
+               get_ep(&ep->com);
+               break;
+       case MORIBUND:
+               stop_ep_timer(ep);
+       case FPDU_MODE:
+       case CLOSING:
+               if (ep->com.cm_id && ep->com.qp) {
+                       attrs.next_state = IWCH_QP_STATE_ERROR;
+                       ret = iwch_modify_qp(ep->com.qp->rhp,
+                                    ep->com.qp, IWCH_QP_ATTR_NEXT_STATE,
+                                    &attrs, 1);
+                       if (ret)
+                               printk(KERN_ERR MOD
+                                      "%s - qp <- error failed!\n",
+                                      __FUNCTION__);
+               }
+               peer_abort_upcall(ep);
+               break;
+       case ABORTING:
+               break;
+       case DEAD:
+               PDBG("%s PEER_ABORT IN DEAD STATE!!!!\n", __FUNCTION__);
+               return CPL_RET_BUF_DONE;
+       default:
+               BUG_ON(1);
+               break;
+       }
+       dst_confirm(ep->dst);
+
+       rpl_skb = get_skb(skb, sizeof(*rpl), GFP_KERNEL);
+       if (!rpl_skb) {
+               printk(KERN_ERR MOD "%s - cannot allocate skb!\n",
+                      __FUNCTION__);
+               dst_release(ep->dst);
+               l2t_release(L2DATA(ep->com.tdev), ep->l2t);
+               put_ep(&ep->com);
+               return CPL_RET_BUF_DONE;
+       }
+       rpl_skb->priority = CPL_PRIORITY_DATA;
+       rpl = (struct cpl_abort_rpl *) skb_put(rpl_skb, sizeof(*rpl));
+       rpl->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_OFLD_HOST_ABORT_CON_RPL));
+       rpl->wr.wr_lo = htonl(V_WR_TID(ep->hwtid));
+       OPCODE_TID(rpl) = htonl(MK_OPCODE_TID(CPL_ABORT_RPL, ep->hwtid));
+       rpl->cmd = CPL_ABORT_NO_RST;
+       ep->com.tdev->send(ep->com.tdev, rpl_skb);
+       if (state != ABORTING) {
+               state_set(&ep->com, DEAD);
+               release_ep_resources(ep);
+       }
+       return CPL_RET_BUF_DONE;
+}
+
+static int close_con_rpl(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
+{
+       struct iwch_ep *ep = ctx;
+       struct iwch_qp_attributes attrs;
+       unsigned long flags;
+       int release = 0;
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+       BUG_ON(!ep);
+
+       /* The cm_id may be null if we failed to connect */
+       spin_lock_irqsave(&ep->com.lock, flags);
+       switch (ep->com.state) {
+       case CLOSING:
+               start_ep_timer(ep);
+               __state_set(&ep->com, MORIBUND);
+               break;
+       case MORIBUND:
+               stop_ep_timer(ep);
+               if ((ep->com.cm_id) && (ep->com.qp)) {
+                       attrs.next_state = IWCH_QP_STATE_IDLE;
+                       iwch_modify_qp(ep->com.qp->rhp,
+                                            ep->com.qp,
+                                            IWCH_QP_ATTR_NEXT_STATE,
+                                            &attrs, 1);
+               }
+               close_complete_upcall(ep);
+               __state_set(&ep->com, DEAD);
+               release = 1;
+               break;
+       case DEAD:
+       default:
+               BUG_ON(1);
+               break;
+       }
+       spin_unlock_irqrestore(&ep->com.lock, flags);
+       if (release)
+               release_ep_resources(ep);
+       return CPL_RET_BUF_DONE;
+}
+
+/*
+ * T3A does 3 things when a TERM is received:
+ * 1) send up a CPL_RDMA_TERMINATE message with the TERM packet
+ * 2) generate an async event on the QP with the TERMINATE opcode
+ * 3) post a TERMINATE opcde cqe into the associated CQ.
+ *
+ * For (1), we save the message in the qp for later consumer consumption.
+ * For (2), we move the QP into TERMINATE, post a QP event and disconnect.
+ * For (3), we toss the CQE in cxio_poll_cq().
+ *
+ * terminate() handles case (1)...
+ */
+static int terminate(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
+{
+       struct iwch_ep *ep = ctx;
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+       skb_pull(skb, sizeof(struct cpl_rdma_terminate));
+       PDBG("%s saving %d bytes of term msg\n", __FUNCTION__, skb->len);
+       memcpy(ep->com.qp->attr.terminate_buffer, skb->data, skb->len);
+       ep->com.qp->attr.terminate_msg_len = skb->len;
+       ep->com.qp->attr.is_terminate_local = 0;
+       return CPL_RET_BUF_DONE;
+}
+
+static int ec_status(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
+{
+       struct cpl_rdma_ec_status *rep = cplhdr(skb);
+       struct iwch_ep *ep = ctx;
+
+       PDBG("%s ep %p tid %u status %d\n", __FUNCTION__, ep, ep->hwtid,
+            rep->status);
+       if (rep->status) {
+               struct iwch_qp_attributes attrs;
+
+               printk(KERN_ERR MOD "%s BAD CLOSE - Aborting tid %u\n",
+                      __FUNCTION__, ep->hwtid);
+               attrs.next_state = IWCH_QP_STATE_ERROR;
+               iwch_modify_qp(ep->com.qp->rhp,
+                              ep->com.qp, IWCH_QP_ATTR_NEXT_STATE,
+                              &attrs, 1);
+               abort_connection(ep, NULL, GFP_KERNEL);
+       }
+       return CPL_RET_BUF_DONE;
+}
+
+static void ep_timeout(unsigned long arg)
+{
+       struct iwch_ep *ep = (struct iwch_ep *)arg;
+       struct iwch_qp_attributes attrs;
+       unsigned long flags;
+
+       spin_lock_irqsave(&ep->com.lock, flags);
+       PDBG("%s ep %p tid %u state %d\n", __FUNCTION__, ep, ep->hwtid,
+            ep->com.state);
+       switch (ep->com.state) {
+       case MPA_REQ_SENT:
+               connect_reply_upcall(ep, -ETIMEDOUT);
+               break;
+       case MPA_REQ_WAIT:
+               break;
+       case MORIBUND:
+               if (ep->com.cm_id && ep->com.qp) {
+                       attrs.next_state = IWCH_QP_STATE_ERROR;
+                       iwch_modify_qp(ep->com.qp->rhp,
+                                    ep->com.qp, IWCH_QP_ATTR_NEXT_STATE,
+                                    &attrs, 1);
+               }
+               break;
+       default:
+               BUG();
+       }
+       __state_set(&ep->com, CLOSING);
+       spin_unlock_irqrestore(&ep->com.lock, flags);
+       abort_connection(ep, NULL, GFP_ATOMIC);
+       put_ep(&ep->com);
+}
+
+int iwch_reject_cr(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len)
+{
+       int err;
+       struct iwch_ep *ep = to_ep(cm_id);
+       PDBG("%s ep %p tid %u\n", __FUNCTION__, ep, ep->hwtid);
+
+       if (state_read(&ep->com) == DEAD) {
+               put_ep(&ep->com);
+               return -ECONNRESET;
+       }
+       BUG_ON(state_read(&ep->com) != MPA_REQ_RCVD);
+       state_set(&ep->com, CLOSING);
+       if (mpa_rev == 0)
+               abort_connection(ep, NULL, GFP_KERNEL);
+       else {
+               err = send_mpa_reject(ep, pdata, pdata_len);
+               err = send_halfclose(ep, GFP_KERNEL);
+       }
+       return 0;
+}
+
+int iwch_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
+{
+       int err;
+       struct iwch_qp_attributes attrs;
+       enum iwch_qp_attr_mask mask;
+       struct iwch_ep *ep = to_ep(cm_id);
+       struct iwch_dev *h = to_iwch_dev(cm_id->device);
+       struct iwch_qp *qp = get_qhp(h, conn_param->qpn);
+
+       PDBG("%s ep %p tid %u\n", __FUNCTION__, ep, ep->hwtid);
+       if (state_read(&ep->com) == DEAD) {
+               put_ep(&ep->com);
+               return -ECONNRESET;
+       }
+
+       BUG_ON(state_read(&ep->com) != MPA_REQ_RCVD);
+       BUG_ON(!qp);
+
+       if ((conn_param->ord > qp->rhp->attr.max_rdma_read_qp_depth) ||
+           (conn_param->ird > qp->rhp->attr.max_rdma_reads_per_qp)) {
+               abort_connection(ep, NULL, GFP_KERNEL);
+               return -EINVAL;
+       }
+
+       cm_id->add_ref(cm_id);
+       ep->com.cm_id = cm_id;
+       ep->com.qp = qp;
+
+       ep->com.rpl_done = 0;
+       ep->com.rpl_err = 0;
+       ep->ird = conn_param->ird;
+       ep->ord = conn_param->ord;
+       PDBG("%s %d ird %d ord %d\n", __FUNCTION__, __LINE__, ep->ird, ep->ord);
+       get_ep(&ep->com);
+       err = send_mpa_reply(ep, conn_param->private_data,
+                            conn_param->private_data_len);
+       if (err) {
+               ep->com.cm_id = NULL;
+               ep->com.qp = NULL;
+               cm_id->rem_ref(cm_id);
+               abort_connection(ep, NULL, GFP_KERNEL);
+               put_ep(&ep->com);
+               return err;
+       }
+
+       /* bind QP to EP and move to RTS */
+       attrs.mpa_attr = ep->mpa_attr;
+       attrs.max_ird = ep->ord;
+       attrs.max_ord = ep->ord;
+       attrs.llp_stream_handle = ep;
+       attrs.next_state = IWCH_QP_STATE_RTS;
+
+       /* bind QP and TID with INIT_WR */
+       mask = IWCH_QP_ATTR_NEXT_STATE |
+                            IWCH_QP_ATTR_LLP_STREAM_HANDLE |
+                            IWCH_QP_ATTR_MPA_ATTR |
+                            IWCH_QP_ATTR_MAX_IRD |
+                            IWCH_QP_ATTR_MAX_ORD;
+
+       err = iwch_modify_qp(ep->com.qp->rhp,
+                            ep->com.qp, mask, &attrs, 1);
+
+       if (err) {
+               ep->com.cm_id = NULL;
+               ep->com.qp = NULL;
+               cm_id->rem_ref(cm_id);
+               abort_connection(ep, NULL, GFP_KERNEL);
+       } else {
+               state_set(&ep->com, FPDU_MODE);
+               established_upcall(ep);
+       }
+       put_ep(&ep->com);
+       return err;
+}
+
+int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
+{
+       int err = 0;
+       struct iwch_dev *h = to_iwch_dev(cm_id->device);
+       struct iwch_ep *ep;
+       struct rtable *rt;
+
+       ep = alloc_ep(sizeof(*ep), GFP_KERNEL);
+       if (!ep) {
+               printk(KERN_ERR MOD "%s - cannot alloc ep.\n", __FUNCTION__);
+               err = -ENOMEM;
+               goto out;
+       }
+       init_timer(&ep->timer);
+       ep->plen = conn_param->private_data_len;
+       if (ep->plen)
+               memcpy(ep->mpa_pkt + sizeof(struct mpa_message),
+                      conn_param->private_data, ep->plen);
+       ep->ird = conn_param->ird;
+       ep->ord = conn_param->ord;
+       ep->com.tdev = h->rdev.t3cdev_p;
+
+       cm_id->add_ref(cm_id);
+       ep->com.cm_id = cm_id;
+       ep->com.qp = get_qhp(h, conn_param->qpn);
+       BUG_ON(!ep->com.qp);
+       PDBG("%s qpn 0x%x qp %p cm_id %p\n", __FUNCTION__, conn_param->qpn,
+            ep->com.qp, cm_id);
+
+       /*
+        * Allocate an active TID to initiate a TCP connection.
+        */
+       ep->atid = cxgb3_alloc_atid(h->rdev.t3cdev_p, &t3c_client, ep);
+       if (ep->atid == -1) {
+               printk(KERN_ERR MOD "%s - cannot alloc atid.\n", __FUNCTION__);
+               err = -ENOMEM;
+               goto fail2;
+       }
+
+       /* find a route */
+       rt = find_route(h->rdev.t3cdev_p,
+                       cm_id->local_addr.sin_addr.s_addr,
+                       cm_id->remote_addr.sin_addr.s_addr,
+                       cm_id->local_addr.sin_port,
+                       cm_id->remote_addr.sin_port, IPTOS_LOWDELAY);
+       if (!rt) {
+               printk(KERN_ERR MOD "%s - cannot find route.\n", __FUNCTION__);
+               err = -EHOSTUNREACH;
+               goto fail3;
+       }
+       ep->dst = &rt->u.dst;
+
+       /* get a l2t entry */
+       ep->l2t = t3_l2t_get(ep->com.tdev, ep->dst->neighbour,
+                            ep->dst->neighbour->dev);
+       if (!ep->l2t) {
+               printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __FUNCTION__);
+               err = -ENOMEM;
+               goto fail4;
+       }
+
+       state_set(&ep->com, CONNECTING);
+       ep->tos = IPTOS_LOWDELAY;
+       ep->com.local_addr = cm_id->local_addr;
+       ep->com.remote_addr = cm_id->remote_addr;
+
+       /* send connect request to rnic */
+       err = send_connect(ep);
+       if (!err)
+               goto out;
+
+       l2t_release(L2DATA(h->rdev.t3cdev_p), ep->l2t);
+fail4:
+       dst_release(ep->dst);
+fail3:
+       cxgb3_free_atid(ep->com.tdev, ep->atid);
+fail2:
+       put_ep(&ep->com);
+out:
+       return err;
+}
+
+int iwch_create_listen(struct iw_cm_id *cm_id, int backlog)
+{
+       int err = 0;
+       struct iwch_dev *h = to_iwch_dev(cm_id->device);
+       struct iwch_listen_ep *ep;
+
+
+       might_sleep();
+
+       ep = alloc_ep(sizeof(*ep), GFP_KERNEL);
+       if (!ep) {
+               printk(KERN_ERR MOD "%s - cannot alloc ep.\n", __FUNCTION__);
+               err = -ENOMEM;
+               goto fail1;
+       }
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+       ep->com.tdev = h->rdev.t3cdev_p;
+       cm_id->add_ref(cm_id);
+       ep->com.cm_id = cm_id;
+       ep->backlog = backlog;
+       ep->com.local_addr = cm_id->local_addr;
+
+       /*
+        * Allocate a server TID.
+        */
+       ep->stid = cxgb3_alloc_stid(h->rdev.t3cdev_p, &t3c_client, ep);
+       if (ep->stid == -1) {
+               printk(KERN_ERR MOD "%s - cannot alloc atid.\n", __FUNCTION__);
+               err = -ENOMEM;
+               goto fail2;
+       }
+
+       state_set(&ep->com, LISTEN);
+       err = listen_start(ep);
+       if (err)
+               goto fail3;
+
+       /* wait for pass_open_rpl */
+       wait_event(ep->com.waitq, ep->com.rpl_done);
+       err = ep->com.rpl_err;
+       if (!err) {
+               cm_id->provider_data = ep;
+               goto out;
+       }
+fail3:
+       cxgb3_free_stid(ep->com.tdev, ep->stid);
+fail2:
+       put_ep(&ep->com);
+fail1:
+out:
+       return err;
+}
+
+int iwch_destroy_listen(struct iw_cm_id *cm_id)
+{
+       int err;
+       struct iwch_listen_ep *ep = to_listen_ep(cm_id);
+
+       PDBG("%s ep %p\n", __FUNCTION__, ep);
+
+       might_sleep();
+       state_set(&ep->com, DEAD);
+       ep->com.rpl_done = 0;
+       ep->com.rpl_err = 0;
+       err = listen_stop(ep);
+       wait_event(ep->com.waitq, ep->com.rpl_done);
+       cxgb3_free_stid(ep->com.tdev, ep->stid);
+       err = ep->com.rpl_err;
+       cm_id->rem_ref(cm_id);
+       put_ep(&ep->com);
+       return err;
+}
+
+int iwch_ep_disconnect(struct iwch_ep *ep, int abrupt, gfp_t gfp)
+{
+       int ret=0;
+       unsigned long flags;
+       int close = 0;
+
+       spin_lock_irqsave(&ep->com.lock, flags);
+
+       PDBG("%s ep %p state %s, abrupt %d\n", __FUNCTION__, ep,
+            states[ep->com.state], abrupt);
+
+       if (ep->com.state == DEAD) {
+               PDBG("%s already dead ep %p\n", __FUNCTION__, ep);
+               goto out;
+       }
+
+       if (abrupt) {
+               if (ep->com.state != ABORTING) {
+                       ep->com.state = ABORTING;
+                       close = 1;
+               }
+               goto out;
+       }
+
+       switch (ep->com.state) {
+       case MPA_REQ_WAIT:
+       case MPA_REQ_SENT:
+       case MPA_REQ_RCVD:
+       case MPA_REP_SENT:
+       case FPDU_MODE:
+               ep->com.state = CLOSING;
+               close = 1;
+               break;
+       case CLOSING:
+               start_ep_timer(ep);
+               ep->com.state = MORIBUND;
+               close = 1;
+               break;
+       case MORIBUND:
+               break;
+       default:
+               BUG();
+               break;
+       }
+out:
+       spin_unlock_irqrestore(&ep->com.lock, flags);
+       if (close) {
+               if (abrupt)
+                       ret = send_abort(ep, NULL, gfp);
+               else
+                       ret = send_halfclose(ep, gfp);
+       }
+       return ret;
+}
+
+int iwch_ep_redirect(void *ctx, struct dst_entry *old, struct dst_entry *new,
+                    struct l2t_entry *l2t)
+{
+       struct iwch_ep *ep = ctx;
+
+       if (ep->dst != old)
+               return 0;
+
+       PDBG("%s ep %p redirect to dst %p l2t %p\n", __FUNCTION__, ep, new,
+            l2t);
+       dst_hold(new);
+       l2t_release(L2DATA(ep->com.tdev), ep->l2t);
+       ep->l2t = l2t;
+       dst_release(old);
+       ep->dst = new;
+       return 1;
+}
+
+/*
+ * All the CM events are handled on a work queue to have a safe context.
+ */
+static int sched(struct t3cdev *tdev, struct sk_buff *skb, void *ctx)
+{
+       struct iwch_ep_common *epc = ctx;
+
+       get_ep(epc);
+
+       /*
+        * Save ctx and tdev in the skb->cb area.
+        */
+       *((void **) skb->cb) = ctx;
+       *((struct t3cdev **) (skb->cb + sizeof(void *))) = tdev;
+
+       /*
+        * Queue the skb and schedule the worker thread.
+        */
+       skb_queue_tail(&rxq, skb);
+       queue_work(workq, &skb_work);
+       return 0;
+}
+
+int __init iwch_cm_init(void)
+{
+       skb_queue_head_init(&rxq);
+
+       workq = create_singlethread_workqueue("iw_cxgb3");
+       if (!workq)
+               return -ENOMEM;
+
+       /*
+        * All upcalls from the T3 Core go to sched() to
+        * schedule the processing on a work queue.
+        */
+       t3c_handlers[CPL_ACT_ESTABLISH] = sched;
+       t3c_handlers[CPL_ACT_OPEN_RPL] = sched;
+       t3c_handlers[CPL_RX_DATA] = sched;
+       t3c_handlers[CPL_TX_DMA_ACK] = sched;
+       t3c_handlers[CPL_ABORT_RPL_RSS] = sched;
+       t3c_handlers[CPL_ABORT_RPL] = sched;
+       t3c_handlers[CPL_PASS_OPEN_RPL] = sched;
+       t3c_handlers[CPL_CLOSE_LISTSRV_RPL] = sched;
+       t3c_handlers[CPL_PASS_ACCEPT_REQ] = sched;
+       t3c_handlers[CPL_PASS_ESTABLISH] = sched;
+       t3c_handlers[CPL_PEER_CLOSE] = sched;
+       t3c_handlers[CPL_CLOSE_CON_RPL] = sched;
+       t3c_handlers[CPL_ABORT_REQ_RSS] = sched;
+       t3c_handlers[CPL_RDMA_TERMINATE] = sched;
+       t3c_handlers[CPL_RDMA_EC_STATUS] = sched;
+
+       /*
+        * These are the real handlers that are called from a
+        * work queue.
+        */
+       work_handlers[CPL_ACT_ESTABLISH] = act_establish;
+       work_handlers[CPL_ACT_OPEN_RPL] = act_open_rpl;
+       work_handlers[CPL_RX_DATA] = rx_data;
+       work_handlers[CPL_TX_DMA_ACK] = tx_ack;
+       work_handlers[CPL_ABORT_RPL_RSS] = abort_rpl;
+       work_handlers[CPL_ABORT_RPL] = abort_rpl;
+       work_handlers[CPL_PASS_OPEN_RPL] = pass_open_rpl;
+       work_handlers[CPL_CLOSE_LISTSRV_RPL] = close_listsrv_rpl;
+       work_handlers[CPL_PASS_ACCEPT_REQ] = pass_accept_req;
+       work_handlers[CPL_PASS_ESTABLISH] = pass_establish;
+       work_handlers[CPL_PEER_CLOSE] = peer_close;
+       work_handlers[CPL_ABORT_REQ_RSS] = peer_abort;
+       work_handlers[CPL_CLOSE_CON_RPL] = close_con_rpl;
+       work_handlers[CPL_RDMA_TERMINATE] = terminate;
+       work_handlers[CPL_RDMA_EC_STATUS] = ec_status;
+       return 0;
+}
+
+void __exit iwch_cm_term(void)
+{
+       flush_workqueue(workq);
+       destroy_workqueue(workq);
+}
diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.h b/drivers/infiniband/hw/cxgb3/iwch_cm.h
new file mode 100644 (file)
index 0000000..7c810d9
--- /dev/null
@@ -0,0 +1,223 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef _IWCH_CM_H_
+#define _IWCH_CM_H_
+
+#include <linux/inet.h>
+#include <linux/wait.h>
+#include <linux/spinlock.h>
+#include <linux/kref.h>
+
+#include <rdma/ib_verbs.h>
+#include <rdma/iw_cm.h>
+
+#include "cxgb3_offload.h"
+#include "iwch_provider.h"
+
+#define MPA_KEY_REQ "MPA ID Req Frame"
+#define MPA_KEY_REP "MPA ID Rep Frame"
+
+#define MPA_MAX_PRIVATE_DATA   256
+#define MPA_REV                0       /* XXX - amso1100 uses rev 0 ! */
+#define MPA_REJECT             0x20
+#define MPA_CRC                        0x40
+#define MPA_MARKERS            0x80
+#define MPA_FLAGS_MASK         0xE0
+
+#define put_ep(ep) { \
+       PDBG("put_ep (via %s:%u) ep %p refcnt %d\n", __FUNCTION__, __LINE__,  \
+            ep, atomic_read(&((ep)->kref.refcount))); \
+       kref_put(&((ep)->kref), __free_ep); \
+}
+
+#define get_ep(ep) { \
+       PDBG("get_ep (via %s:%u) ep %p, refcnt %d\n", __FUNCTION__, __LINE__, \
+            ep, atomic_read(&((ep)->kref.refcount))); \
+       kref_get(&((ep)->kref));  \
+}
+
+struct mpa_message {
+       u8 key[16];
+       u8 flags;
+       u8 revision;
+       __be16 private_data_size;
+       u8 private_data[0];
+};
+
+struct terminate_message {
+       u8 layer_etype;
+       u8 ecode;
+       __be16 hdrct_rsvd;
+       u8 len_hdrs[0];
+};
+
+#define TERM_MAX_LENGTH (sizeof(struct terminate_message) + 2 + 18 + 28)
+
+enum iwch_layers_types {
+       LAYER_RDMAP             = 0x00,
+       LAYER_DDP               = 0x10,
+       LAYER_MPA               = 0x20,
+       RDMAP_LOCAL_CATA        = 0x00,
+       RDMAP_REMOTE_PROT       = 0x01,
+       RDMAP_REMOTE_OP         = 0x02,
+       DDP_LOCAL_CATA          = 0x00,
+       DDP_TAGGED_ERR          = 0x01,
+       DDP_UNTAGGED_ERR        = 0x02,
+       DDP_LLP                 = 0x03
+};
+
+enum iwch_rdma_ecodes {
+       RDMAP_INV_STAG          = 0x00,
+       RDMAP_BASE_BOUNDS       = 0x01,
+       RDMAP_ACC_VIOL          = 0x02,
+       RDMAP_STAG_NOT_ASSOC    = 0x03,
+       RDMAP_TO_WRAP           = 0x04,
+       RDMAP_INV_VERS          = 0x05,
+       RDMAP_INV_OPCODE        = 0x06,
+       RDMAP_STREAM_CATA       = 0x07,
+       RDMAP_GLOBAL_CATA       = 0x08,
+       RDMAP_CANT_INV_STAG     = 0x09,
+       RDMAP_UNSPECIFIED       = 0xff
+};
+
+enum iwch_ddp_ecodes {
+       DDPT_INV_STAG           = 0x00,
+       DDPT_BASE_BOUNDS        = 0x01,
+       DDPT_STAG_NOT_ASSOC     = 0x02,
+       DDPT_TO_WRAP            = 0x03,
+       DDPT_INV_VERS           = 0x04,
+       DDPU_INV_QN             = 0x01,
+       DDPU_INV_MSN_NOBUF      = 0x02,
+       DDPU_INV_MSN_RANGE      = 0x03,
+       DDPU_INV_MO             = 0x04,
+       DDPU_MSG_TOOBIG         = 0x05,
+       DDPU_INV_VERS           = 0x06
+};
+
+enum iwch_mpa_ecodes {
+       MPA_CRC_ERR             = 0x02,
+       MPA_MARKER_ERR          = 0x03
+};
+
+enum iwch_ep_state {
+       IDLE = 0,
+       LISTEN,
+       CONNECTING,
+       MPA_REQ_WAIT,
+       MPA_REQ_SENT,
+       MPA_REQ_RCVD,
+       MPA_REP_SENT,
+       FPDU_MODE,
+       ABORTING,
+       CLOSING,
+       MORIBUND,
+       DEAD,
+};
+
+struct iwch_ep_common {
+       struct iw_cm_id *cm_id;
+       struct iwch_qp *qp;
+       struct t3cdev *tdev;
+       enum iwch_ep_state state;
+       struct kref kref;
+       spinlock_t lock;
+       struct sockaddr_in local_addr;
+       struct sockaddr_in remote_addr;
+       wait_queue_head_t waitq;
+       int rpl_done;
+       int rpl_err;
+};
+
+struct iwch_listen_ep {
+       struct iwch_ep_common com;
+       unsigned int stid;
+       int backlog;
+};
+
+struct iwch_ep {
+       struct iwch_ep_common com;
+       struct iwch_ep *parent_ep;
+       struct timer_list timer;
+       unsigned int atid;
+       u32 hwtid;
+       u32 snd_seq;
+       struct l2t_entry *l2t;
+       struct dst_entry *dst;
+       struct sk_buff *mpa_skb;
+       struct iwch_mpa_attributes mpa_attr;
+       unsigned int mpa_pkt_len;
+       u8 mpa_pkt[sizeof(struct mpa_message) + MPA_MAX_PRIVATE_DATA];
+       u8 tos;
+       u16 emss;
+       u16 plen;
+       u32 ird;
+       u32 ord;
+};
+
+static inline struct iwch_ep *to_ep(struct iw_cm_id *cm_id)
+{
+       return cm_id->provider_data;
+}
+
+static inline struct iwch_listen_ep *to_listen_ep(struct iw_cm_id *cm_id)
+{
+       return cm_id->provider_data;
+}
+
+static inline int compute_wscale(int win)
+{
+       int wscale = 0;
+
+       while (wscale < 14 && (65535<<wscale) < win)
+               wscale++;
+       return wscale;
+}
+
+/* CM prototypes */
+
+int iwch_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param);
+int iwch_create_listen(struct iw_cm_id *cm_id, int backlog);
+int iwch_destroy_listen(struct iw_cm_id *cm_id);
+int iwch_reject_cr(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len);
+int iwch_accept_cr(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param);
+int iwch_ep_disconnect(struct iwch_ep *ep, int abrupt, gfp_t gfp);
+int iwch_quiesce_tid(struct iwch_ep *ep);
+int iwch_resume_tid(struct iwch_ep *ep);
+void __free_ep(struct kref *kref);
+void iwch_rearp(struct iwch_ep *ep);
+int iwch_ep_redirect(void *ctx, struct dst_entry *old, struct dst_entry *new, struct l2t_entry *l2t);
+
+int __init iwch_cm_init(void);
+void __exit iwch_cm_term(void);
+
+#endif                         /* _IWCH_CM_H_ */
diff --git a/drivers/infiniband/hw/cxgb3/iwch_cq.c b/drivers/infiniband/hw/cxgb3/iwch_cq.c
new file mode 100644 (file)
index 0000000..98b3bdb
--- /dev/null
@@ -0,0 +1,225 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "iwch_provider.h"
+#include "iwch.h"
+
+/*
+ * Get one cq entry from cxio and map it to openib.
+ *
+ * Returns:
+ *     0                       EMPTY;
+ *     1                       cqe returned
+ *     -EAGAIN         caller must try again
+ *     any other -errno        fatal error
+ */
+static int iwch_poll_cq_one(struct iwch_dev *rhp, struct iwch_cq *chp,
+                           struct ib_wc *wc)
+{
+       struct iwch_qp *qhp = NULL;
+       struct t3_cqe cqe, *rd_cqe;
+       struct t3_wq *wq;
+       u32 credit = 0;
+       u8 cqe_flushed;
+       u64 cookie;
+       int ret = 1;
+
+       rd_cqe = cxio_next_cqe(&chp->cq);
+
+       if (!rd_cqe)
+               return 0;
+
+       qhp = get_qhp(rhp, CQE_QPID(*rd_cqe));
+       if (!qhp)
+               wq = NULL;
+       else {
+               spin_lock(&qhp->lock);
+               wq = &(qhp->wq);
+       }
+       ret = cxio_poll_cq(wq, &(chp->cq), &cqe, &cqe_flushed, &cookie,
+                                  &credit);
+       if (t3a_device(chp->rhp) && credit) {
+               PDBG("%s updating %d cq credits on id %d\n", __FUNCTION__,
+                    credit, chp->cq.cqid);
+               cxio_hal_cq_op(&rhp->rdev, &chp->cq, CQ_CREDIT_UPDATE, credit);
+       }
+
+       if (ret) {
+               ret = -EAGAIN;
+               goto out;
+       }
+       ret = 1;
+
+       wc->wr_id = cookie;
+       wc->qp = &qhp->ibqp;
+       wc->vendor_err = CQE_STATUS(cqe);
+
+       PDBG("%s qpid 0x%x type %d opcode %d status 0x%x wrid hi 0x%x "
+            "lo 0x%x cookie 0x%llx\n", __FUNCTION__,
+            CQE_QPID(cqe), CQE_TYPE(cqe),
+            CQE_OPCODE(cqe), CQE_STATUS(cqe), CQE_WRID_HI(cqe),
+            CQE_WRID_LOW(cqe), (unsigned long long) cookie);
+
+       if (CQE_TYPE(cqe) == 0) {
+               if (!CQE_STATUS(cqe))
+                       wc->byte_len = CQE_LEN(cqe);
+               else
+                       wc->byte_len = 0;
+               wc->opcode = IB_WC_RECV;
+       } else {
+               switch (CQE_OPCODE(cqe)) {
+               case T3_RDMA_WRITE:
+                       wc->opcode = IB_WC_RDMA_WRITE;
+                       break;
+               case T3_READ_REQ:
+                       wc->opcode = IB_WC_RDMA_READ;
+                       wc->byte_len = CQE_LEN(cqe);
+                       break;
+               case T3_SEND:
+               case T3_SEND_WITH_SE:
+                       wc->opcode = IB_WC_SEND;
+                       break;
+               case T3_BIND_MW:
+                       wc->opcode = IB_WC_BIND_MW;
+                       break;
+
+               /* these aren't supported yet */
+               case T3_SEND_WITH_INV:
+               case T3_SEND_WITH_SE_INV:
+               case T3_LOCAL_INV:
+               case T3_FAST_REGISTER:
+               default:
+                       printk(KERN_ERR MOD "Unexpected opcode %d "
+                              "in the CQE received for QPID=0x%0x\n",
+                              CQE_OPCODE(cqe), CQE_QPID(cqe));
+                       ret = -EINVAL;
+                       goto out;
+               }
+       }
+
+       if (cqe_flushed)
+               wc->status = IB_WC_WR_FLUSH_ERR;
+       else {
+
+               switch (CQE_STATUS(cqe)) {
+               case TPT_ERR_SUCCESS:
+                       wc->status = IB_WC_SUCCESS;
+                       break;
+               case TPT_ERR_STAG:
+                       wc->status = IB_WC_LOC_ACCESS_ERR;
+                       break;
+               case TPT_ERR_PDID:
+                       wc->status = IB_WC_LOC_PROT_ERR;
+                       break;
+               case TPT_ERR_QPID:
+               case TPT_ERR_ACCESS:
+                       wc->status = IB_WC_LOC_ACCESS_ERR;
+                       break;
+               case TPT_ERR_WRAP:
+                       wc->status = IB_WC_GENERAL_ERR;
+                       break;
+               case TPT_ERR_BOUND:
+                       wc->status = IB_WC_LOC_LEN_ERR;
+                       break;
+               case TPT_ERR_INVALIDATE_SHARED_MR:
+               case TPT_ERR_INVALIDATE_MR_WITH_MW_BOUND:
+                       wc->status = IB_WC_MW_BIND_ERR;
+                       break;
+               case TPT_ERR_CRC:
+               case TPT_ERR_MARKER:
+               case TPT_ERR_PDU_LEN_ERR:
+               case TPT_ERR_OUT_OF_RQE:
+               case TPT_ERR_DDP_VERSION:
+               case TPT_ERR_RDMA_VERSION:
+               case TPT_ERR_DDP_QUEUE_NUM:
+               case TPT_ERR_MSN:
+               case TPT_ERR_TBIT:
+               case TPT_ERR_MO:
+               case TPT_ERR_MSN_RANGE:
+               case TPT_ERR_IRD_OVERFLOW:
+               case TPT_ERR_OPCODE:
+                       wc->status = IB_WC_FATAL_ERR;
+                       break;
+               case TPT_ERR_SWFLUSH:
+                       wc->status = IB_WC_WR_FLUSH_ERR;
+                       break;
+               default:
+                       printk(KERN_ERR MOD "Unexpected cqe_status 0x%x for "
+                              "QPID=0x%0x\n", CQE_STATUS(cqe), CQE_QPID(cqe));
+                       ret = -EINVAL;
+               }
+       }
+out:
+       if (wq)
+               spin_unlock(&qhp->lock);
+       return ret;
+}
+
+int iwch_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc)
+{
+       struct iwch_dev *rhp;
+       struct iwch_cq *chp;
+       unsigned long flags;
+       int npolled;
+       int err = 0;
+
+       chp = to_iwch_cq(ibcq);
+       rhp = chp->rhp;
+
+       spin_lock_irqsave(&chp->lock, flags);
+       for (npolled = 0; npolled < num_entries; ++npolled) {
+#ifdef DEBUG
+               int i=0;
+#endif
+
+               /*
+                * Because T3 can post CQEs that are _not_ associated
+                * with a WR, we might have to poll again after removing
+                * one of these.
+                */
+               do {
+                       err = iwch_poll_cq_one(rhp, chp, wc + npolled);
+#ifdef DEBUG
+                       BUG_ON(++i > 1000);
+#endif
+               } while (err == -EAGAIN);
+               if (err <= 0)
+                       break;
+       }
+       spin_unlock_irqrestore(&chp->lock, flags);
+
+       if (err < 0)
+               return err;
+       else {
+               return npolled;
+       }
+}
diff --git a/drivers/infiniband/hw/cxgb3/iwch_ev.c b/drivers/infiniband/hw/cxgb3/iwch_ev.c
new file mode 100644 (file)
index 0000000..a6efa8f
--- /dev/null
@@ -0,0 +1,231 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include <linux/slab.h>
+#include <linux/mman.h>
+#include <net/sock.h>
+#include "iwch_provider.h"
+#include "iwch.h"
+#include "iwch_cm.h"
+#include "cxio_hal.h"
+#include "cxio_wr.h"
+
+static void post_qp_event(struct iwch_dev *rnicp, struct iwch_cq *chp,
+                         struct respQ_msg_t *rsp_msg,
+                         enum ib_event_type ib_event,
+                         int send_term)
+{
+       struct ib_event event;
+       struct iwch_qp_attributes attrs;
+       struct iwch_qp *qhp;
+
+       printk(KERN_ERR "%s - AE qpid 0x%x opcode %d status 0x%x "
+              "type %d wrid.hi 0x%x wrid.lo 0x%x \n", __FUNCTION__,
+              CQE_QPID(rsp_msg->cqe), CQE_OPCODE(rsp_msg->cqe),
+              CQE_STATUS(rsp_msg->cqe), CQE_TYPE(rsp_msg->cqe),
+              CQE_WRID_HI(rsp_msg->cqe), CQE_WRID_LOW(rsp_msg->cqe));
+
+       spin_lock(&rnicp->lock);
+       qhp = get_qhp(rnicp, CQE_QPID(rsp_msg->cqe));
+
+       if (!qhp) {
+               printk(KERN_ERR "%s unaffiliated error 0x%x qpid 0x%x\n",
+                      __FUNCTION__, CQE_STATUS(rsp_msg->cqe),
+                      CQE_QPID(rsp_msg->cqe));
+               spin_unlock(&rnicp->lock);
+               return;
+       }
+
+       if ((qhp->attr.state == IWCH_QP_STATE_ERROR) ||
+           (qhp->attr.state == IWCH_QP_STATE_TERMINATE)) {
+               PDBG("%s AE received after RTS - "
+                    "qp state %d qpid 0x%x status 0x%x\n", __FUNCTION__,
+                    qhp->attr.state, qhp->wq.qpid, CQE_STATUS(rsp_msg->cqe));
+               spin_unlock(&rnicp->lock);
+               return;
+       }
+
+       atomic_inc(&qhp->refcnt);
+       spin_unlock(&rnicp->lock);
+
+       event.event = ib_event;
+       event.device = chp->ibcq.device;
+       if (ib_event == IB_EVENT_CQ_ERR)
+               event.element.cq = &chp->ibcq;
+       else
+               event.element.qp = &qhp->ibqp;
+
+       if (qhp->ibqp.event_handler)
+               (*qhp->ibqp.event_handler)(&event, qhp->ibqp.qp_context);
+
+       if (qhp->attr.state == IWCH_QP_STATE_RTS) {
+               attrs.next_state = IWCH_QP_STATE_TERMINATE;
+               iwch_modify_qp(qhp->rhp, qhp, IWCH_QP_ATTR_NEXT_STATE,
+                              &attrs, 1);
+               if (send_term)
+                       iwch_post_terminate(qhp, rsp_msg);
+       }
+
+       if (atomic_dec_and_test(&qhp->refcnt))
+               wake_up(&qhp->wait);
+}
+
+void iwch_ev_dispatch(struct cxio_rdev *rdev_p, struct sk_buff *skb)
+{
+       struct iwch_dev *rnicp;
+       struct respQ_msg_t *rsp_msg = (struct respQ_msg_t *) skb->data;
+       struct iwch_cq *chp;
+       struct iwch_qp *qhp;
+       u32 cqid = RSPQ_CQID(rsp_msg);
+
+       rnicp = (struct iwch_dev *) rdev_p->ulp;
+       spin_lock(&rnicp->lock);
+       chp = get_chp(rnicp, cqid);
+       qhp = get_qhp(rnicp, CQE_QPID(rsp_msg->cqe));
+       if (!chp || !qhp) {
+               printk(KERN_ERR MOD "BAD AE cqid 0x%x qpid 0x%x opcode %d "
+                      "status 0x%x type %d wrid.hi 0x%x wrid.lo 0x%x \n",
+                      cqid, CQE_QPID(rsp_msg->cqe),
+                      CQE_OPCODE(rsp_msg->cqe), CQE_STATUS(rsp_msg->cqe),
+                      CQE_TYPE(rsp_msg->cqe), CQE_WRID_HI(rsp_msg->cqe),
+                      CQE_WRID_LOW(rsp_msg->cqe));
+               spin_unlock(&rnicp->lock);
+               goto out;
+       }
+       iwch_qp_add_ref(&qhp->ibqp);
+       atomic_inc(&chp->refcnt);
+       spin_unlock(&rnicp->lock);
+
+       /*
+        * 1) completion of our sending a TERMINATE.
+        * 2) incoming TERMINATE message.
+        */
+       if ((CQE_OPCODE(rsp_msg->cqe) == T3_TERMINATE) &&
+           (CQE_STATUS(rsp_msg->cqe) == 0)) {
+               if (SQ_TYPE(rsp_msg->cqe)) {
+                       PDBG("%s QPID 0x%x ep %p disconnecting\n",
+                            __FUNCTION__, qhp->wq.qpid, qhp->ep);
+                       iwch_ep_disconnect(qhp->ep, 0, GFP_ATOMIC);
+               } else {
+                       PDBG("%s post REQ_ERR AE QPID 0x%x\n", __FUNCTION__,
+                            qhp->wq.qpid);
+                       post_qp_event(rnicp, chp, rsp_msg,
+                                     IB_EVENT_QP_REQ_ERR, 0);
+                       iwch_ep_disconnect(qhp->ep, 0, GFP_ATOMIC);
+               }
+               goto done;
+       }
+
+       /* Bad incoming Read request */
+       if (SQ_TYPE(rsp_msg->cqe) &&
+           (CQE_OPCODE(rsp_msg->cqe) == T3_READ_RESP)) {
+               post_qp_event(rnicp, chp, rsp_msg, IB_EVENT_QP_REQ_ERR, 1);
+               goto done;
+       }
+
+       /* Bad incoming write */
+       if (RQ_TYPE(rsp_msg->cqe) &&
+           (CQE_OPCODE(rsp_msg->cqe) == T3_RDMA_WRITE)) {
+               post_qp_event(rnicp, chp, rsp_msg, IB_EVENT_QP_REQ_ERR, 1);
+               goto done;
+       }
+
+       switch (CQE_STATUS(rsp_msg->cqe)) {
+
+       /* Completion Events */
+       case TPT_ERR_SUCCESS:
+
+               /*
+                * Confirm the destination entry if this is a RECV completion.
+                */
+               if (qhp->ep && SQ_TYPE(rsp_msg->cqe))
+                       dst_confirm(qhp->ep->dst);
+               (*chp->ibcq.comp_handler)(&chp->ibcq, chp->ibcq.cq_context);
+               break;
+
+       case TPT_ERR_STAG:
+       case TPT_ERR_PDID:
+       case TPT_ERR_QPID:
+       case TPT_ERR_ACCESS:
+       case TPT_ERR_WRAP:
+       case TPT_ERR_BOUND:
+       case TPT_ERR_INVALIDATE_SHARED_MR:
+       case TPT_ERR_INVALIDATE_MR_WITH_MW_BOUND:
+               printk(KERN_ERR "%s - CQE Err qpid 0x%x opcode %d status 0x%x "
+                      "type %d wrid.hi 0x%x wrid.lo 0x%x \n", __FUNCTION__,
+                      CQE_QPID(rsp_msg->cqe), CQE_OPCODE(rsp_msg->cqe),
+                      CQE_STATUS(rsp_msg->cqe), CQE_TYPE(rsp_msg->cqe),
+                      CQE_WRID_HI(rsp_msg->cqe), CQE_WRID_LOW(rsp_msg->cqe));
+               (*chp->ibcq.comp_handler)(&chp->ibcq, chp->ibcq.cq_context);
+               post_qp_event(rnicp, chp, rsp_msg, IB_EVENT_QP_ACCESS_ERR, 1);
+               break;
+
+       /* Device Fatal Errors */
+       case TPT_ERR_ECC:
+       case TPT_ERR_ECC_PSTAG:
+       case TPT_ERR_INTERNAL_ERR:
+               post_qp_event(rnicp, chp, rsp_msg, IB_EVENT_DEVICE_FATAL, 1);
+               break;
+
+       /* QP Fatal Errors */
+       case TPT_ERR_OUT_OF_RQE:
+       case TPT_ERR_PBL_ADDR_BOUND:
+       case TPT_ERR_CRC:
+       case TPT_ERR_MARKER:
+       case TPT_ERR_PDU_LEN_ERR:
+       case TPT_ERR_DDP_VERSION:
+       case TPT_ERR_RDMA_VERSION:
+       case TPT_ERR_OPCODE:
+       case TPT_ERR_DDP_QUEUE_NUM:
+       case TPT_ERR_MSN:
+       case TPT_ERR_TBIT:
+       case TPT_ERR_MO:
+       case TPT_ERR_MSN_GAP:
+       case TPT_ERR_MSN_RANGE:
+       case TPT_ERR_RQE_ADDR_BOUND:
+       case TPT_ERR_IRD_OVERFLOW:
+               post_qp_event(rnicp, chp, rsp_msg, IB_EVENT_QP_FATAL, 1);
+               break;
+
+       default:
+               printk(KERN_ERR MOD "Unknown T3 status 0x%x QPID 0x%x\n",
+                      CQE_STATUS(rsp_msg->cqe), qhp->wq.qpid);
+               post_qp_event(rnicp, chp, rsp_msg, IB_EVENT_QP_FATAL, 1);
+               break;
+       }
+done:
+       if (atomic_dec_and_test(&chp->refcnt))
+               wake_up(&chp->wait);
+       iwch_qp_rem_ref(&qhp->ibqp);
+out:
+       dev_kfree_skb_irq(skb);
+}
diff --git a/drivers/infiniband/hw/cxgb3/iwch_mem.c b/drivers/infiniband/hw/cxgb3/iwch_mem.c
new file mode 100644 (file)
index 0000000..2b6cd53
--- /dev/null
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include <asm/byteorder.h>
+
+#include <rdma/iw_cm.h>
+#include <rdma/ib_verbs.h>
+
+#include "cxio_hal.h"
+#include "iwch.h"
+#include "iwch_provider.h"
+
+int iwch_register_mem(struct iwch_dev *rhp, struct iwch_pd *php,
+                                       struct iwch_mr *mhp,
+                                       int shift,
+                                       __be64 *page_list)
+{
+       u32 stag;
+       u32 mmid;
+
+
+       if (cxio_register_phys_mem(&rhp->rdev,
+                                  &stag, mhp->attr.pdid,
+                                  mhp->attr.perms,
+                                  mhp->attr.zbva,
+                                  mhp->attr.va_fbo,
+                                  mhp->attr.len,
+                                  shift-12,
+                                  page_list,
+                                  &mhp->attr.pbl_size, &mhp->attr.pbl_addr))
+               return -ENOMEM;
+       mhp->attr.state = 1;
+       mhp->attr.stag = stag;
+       mmid = stag >> 8;
+       mhp->ibmr.rkey = mhp->ibmr.lkey = stag;
+       insert_handle(rhp, &rhp->mmidr, mhp, mmid);
+       PDBG("%s mmid 0x%x mhp %p\n", __FUNCTION__, mmid, mhp);
+       return 0;
+}
+
+int iwch_reregister_mem(struct iwch_dev *rhp, struct iwch_pd *php,
+                                       struct iwch_mr *mhp,
+                                       int shift,
+                                       __be64 *page_list,
+                                       int npages)
+{
+       u32 stag;
+       u32 mmid;
+
+
+       /* We could support this... */
+       if (npages > mhp->attr.pbl_size)
+               return -ENOMEM;
+
+       stag = mhp->attr.stag;
+       if (cxio_reregister_phys_mem(&rhp->rdev,
+                                  &stag, mhp->attr.pdid,
+                                  mhp->attr.perms,
+                                  mhp->attr.zbva,
+                                  mhp->attr.va_fbo,
+                                  mhp->attr.len,
+                                  shift-12,
+                                  page_list,
+                                  &mhp->attr.pbl_size, &mhp->attr.pbl_addr))
+               return -ENOMEM;
+       mhp->attr.state = 1;
+       mhp->attr.stag = stag;
+       mmid = stag >> 8;
+       mhp->ibmr.rkey = mhp->ibmr.lkey = stag;
+       insert_handle(rhp, &rhp->mmidr, mhp, mmid);
+       PDBG("%s mmid 0x%x mhp %p\n", __FUNCTION__, mmid, mhp);
+       return 0;
+}
+
+int build_phys_page_list(struct ib_phys_buf *buffer_list,
+                                       int num_phys_buf,
+                                       u64 *iova_start,
+                                       u64 *total_size,
+                                       int *npages,
+                                       int *shift,
+                                       __be64 **page_list)
+{
+       u64 mask;
+       int i, j, n;
+
+       mask = 0;
+       *total_size = 0;
+       for (i = 0; i < num_phys_buf; ++i) {
+               if (i != 0 && buffer_list[i].addr & ~PAGE_MASK)
+                       return -EINVAL;
+               if (i != 0 && i != num_phys_buf - 1 &&
+                   (buffer_list[i].size & ~PAGE_MASK))
+                       return -EINVAL;
+               *total_size += buffer_list[i].size;
+               if (i > 0)
+                       mask |= buffer_list[i].addr;
+       }
+
+       if (*total_size > 0xFFFFFFFFULL)
+               return -ENOMEM;
+
+       /* Find largest page shift we can use to cover buffers */
+       for (*shift = PAGE_SHIFT; *shift < 27; ++(*shift))
+               if (num_phys_buf > 1) {
+                       if ((1ULL << *shift) & mask)
+                               break;
+               } else
+                       if (1ULL << *shift >=
+                           buffer_list[0].size +
+                           (buffer_list[0].addr & ((1ULL << *shift) - 1)))
+                               break;
+
+       buffer_list[0].size += buffer_list[0].addr & ((1ULL << *shift) - 1);
+       buffer_list[0].addr &= ~0ull << *shift;
+
+       *npages = 0;
+       for (i = 0; i < num_phys_buf; ++i)
+               *npages += (buffer_list[i].size +
+                       (1ULL << *shift) - 1) >> *shift;
+
+       if (!*npages)
+               return -EINVAL;
+
+       *page_list = kmalloc(sizeof(u64) * *npages, GFP_KERNEL);
+       if (!*page_list)
+               return -ENOMEM;
+
+       n = 0;
+       for (i = 0; i < num_phys_buf; ++i)
+               for (j = 0;
+                    j < (buffer_list[i].size + (1ULL << *shift) - 1) >> *shift;
+                    ++j)
+                       (*page_list)[n++] = cpu_to_be64(buffer_list[i].addr +
+                           ((u64) j << *shift));
+
+       PDBG("%s va 0x%llx mask 0x%llx shift %d len %lld pbl_size %d\n",
+            __FUNCTION__, (unsigned long long) *iova_start,
+            (unsigned long long) mask, *shift, (unsigned long long) *total_size,
+            *npages);
+
+       return 0;
+
+}
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c
new file mode 100644 (file)
index 0000000..6861087
--- /dev/null
@@ -0,0 +1,1203 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/device.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/delay.h>
+#include <linux/errno.h>
+#include <linux/list.h>
+#include <linux/spinlock.h>
+#include <linux/ethtool.h>
+
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/byteorder.h>
+
+#include <rdma/iw_cm.h>
+#include <rdma/ib_verbs.h>
+#include <rdma/ib_smi.h>
+#include <rdma/ib_user_verbs.h>
+
+#include "cxio_hal.h"
+#include "iwch.h"
+#include "iwch_provider.h"
+#include "iwch_cm.h"
+#include "iwch_user.h"
+
+static int iwch_modify_port(struct ib_device *ibdev,
+                           u8 port, int port_modify_mask,
+                           struct ib_port_modify *props)
+{
+       return -ENOSYS;
+}
+
+static struct ib_ah *iwch_ah_create(struct ib_pd *pd,
+                                   struct ib_ah_attr *ah_attr)
+{
+       return ERR_PTR(-ENOSYS);
+}
+
+static int iwch_ah_destroy(struct ib_ah *ah)
+{
+       return -ENOSYS;
+}
+
+static int iwch_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid)
+{
+       return -ENOSYS;
+}
+
+static int iwch_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid)
+{
+       return -ENOSYS;
+}
+
+static int iwch_process_mad(struct ib_device *ibdev,
+                           int mad_flags,
+                           u8 port_num,
+                           struct ib_wc *in_wc,
+                           struct ib_grh *in_grh,
+                           struct ib_mad *in_mad, struct ib_mad *out_mad)
+{
+       return -ENOSYS;
+}
+
+static int iwch_dealloc_ucontext(struct ib_ucontext *context)
+{
+       struct iwch_dev *rhp = to_iwch_dev(context->device);
+       struct iwch_ucontext *ucontext = to_iwch_ucontext(context);
+       struct iwch_mm_entry *mm, *tmp;
+
+       PDBG("%s context %p\n", __FUNCTION__, context);
+       list_for_each_entry_safe(mm, tmp, &ucontext->mmaps, entry)
+               kfree(mm);
+       cxio_release_ucontext(&rhp->rdev, &ucontext->uctx);
+       kfree(ucontext);
+       return 0;
+}
+
+static struct ib_ucontext *iwch_alloc_ucontext(struct ib_device *ibdev,
+                                       struct ib_udata *udata)
+{
+       struct iwch_ucontext *context;
+       struct iwch_dev *rhp = to_iwch_dev(ibdev);
+
+       PDBG("%s ibdev %p\n", __FUNCTION__, ibdev);
+       context = kzalloc(sizeof(*context), GFP_KERNEL);
+       if (!context)
+               return ERR_PTR(-ENOMEM);
+       cxio_init_ucontext(&rhp->rdev, &context->uctx);
+       INIT_LIST_HEAD(&context->mmaps);
+       spin_lock_init(&context->mmap_lock);
+       return &context->ibucontext;
+}
+
+static int iwch_destroy_cq(struct ib_cq *ib_cq)
+{
+       struct iwch_cq *chp;
+
+       PDBG("%s ib_cq %p\n", __FUNCTION__, ib_cq);
+       chp = to_iwch_cq(ib_cq);
+
+       remove_handle(chp->rhp, &chp->rhp->cqidr, chp->cq.cqid);
+       atomic_dec(&chp->refcnt);
+       wait_event(chp->wait, !atomic_read(&chp->refcnt));
+
+       cxio_destroy_cq(&chp->rhp->rdev, &chp->cq);
+       kfree(chp);
+       return 0;
+}
+
+static struct ib_cq *iwch_create_cq(struct ib_device *ibdev, int entries,
+                            struct ib_ucontext *ib_context,
+                            struct ib_udata *udata)
+{
+       struct iwch_dev *rhp;
+       struct iwch_cq *chp;
+       struct iwch_create_cq_resp uresp;
+       struct iwch_create_cq_req ureq;
+       struct iwch_ucontext *ucontext = NULL;
+
+       PDBG("%s ib_dev %p entries %d\n", __FUNCTION__, ibdev, entries);
+       rhp = to_iwch_dev(ibdev);
+       chp = kzalloc(sizeof(*chp), GFP_KERNEL);
+       if (!chp)
+               return ERR_PTR(-ENOMEM);
+
+       if (ib_context) {
+               ucontext = to_iwch_ucontext(ib_context);
+               if (!t3a_device(rhp)) {
+                       if (ib_copy_from_udata(&ureq, udata, sizeof (ureq))) {
+                               kfree(chp);
+                               return ERR_PTR(-EFAULT);
+                       }
+                       chp->user_rptr_addr = (u32 __user *)(unsigned long)ureq.user_rptr_addr;
+               }
+       }
+
+       if (t3a_device(rhp)) {
+
+               /*
+                * T3A: Add some fluff to handle extra CQEs inserted
+                * for various errors.
+                * Additional CQE possibilities:
+                *      TERMINATE,
+                *      incoming RDMA WRITE Failures
+                *      incoming RDMA READ REQUEST FAILUREs
+                * NOTE: We cannot ensure the CQ won't overflow.
+                */
+               entries += 16;
+       }
+       entries = roundup_pow_of_two(entries);
+       chp->cq.size_log2 = ilog2(entries);
+
+       if (cxio_create_cq(&rhp->rdev, &chp->cq)) {
+               kfree(chp);
+               return ERR_PTR(-ENOMEM);
+       }
+       chp->rhp = rhp;
+       chp->ibcq.cqe = (1 << chp->cq.size_log2) - 1;
+       spin_lock_init(&chp->lock);
+       atomic_set(&chp->refcnt, 1);
+       init_waitqueue_head(&chp->wait);
+       insert_handle(rhp, &rhp->cqidr, chp, chp->cq.cqid);
+
+       if (ucontext) {
+               struct iwch_mm_entry *mm;
+
+               mm = kmalloc(sizeof *mm, GFP_KERNEL);
+               if (!mm) {
+                       iwch_destroy_cq(&chp->ibcq);
+                       return ERR_PTR(-ENOMEM);
+               }
+               uresp.cqid = chp->cq.cqid;
+               uresp.size_log2 = chp->cq.size_log2;
+               spin_lock(&ucontext->mmap_lock);
+               uresp.key = ucontext->key;
+               ucontext->key += PAGE_SIZE;
+               spin_unlock(&ucontext->mmap_lock);
+               if (ib_copy_to_udata(udata, &uresp, sizeof (uresp))) {
+                       kfree(mm);
+                       iwch_destroy_cq(&chp->ibcq);
+                       return ERR_PTR(-EFAULT);
+               }
+               mm->key = uresp.key;
+               mm->addr = virt_to_phys(chp->cq.queue);
+               mm->len = PAGE_ALIGN((1UL << uresp.size_log2) *
+                                            sizeof (struct t3_cqe));
+               insert_mmap(ucontext, mm);
+       }
+       PDBG("created cqid 0x%0x chp %p size 0x%0x, dma_addr 0x%0llx\n",
+            chp->cq.cqid, chp, (1 << chp->cq.size_log2),
+            (unsigned long long) chp->cq.dma_addr);
+       return &chp->ibcq;
+}
+
+static int iwch_resize_cq(struct ib_cq *cq, int cqe, struct ib_udata *udata)
+{
+#ifdef notyet
+       struct iwch_cq *chp = to_iwch_cq(cq);
+       struct t3_cq oldcq, newcq;
+       int ret;
+
+       PDBG("%s ib_cq %p cqe %d\n", __FUNCTION__, cq, cqe);
+
+       /* We don't downsize... */
+       if (cqe <= cq->cqe)
+               return 0;
+
+       /* create new t3_cq with new size */
+       cqe = roundup_pow_of_two(cqe+1);
+       newcq.size_log2 = ilog2(cqe);
+
+       /* Dont allow resize to less than the current wce count */
+       if (cqe < Q_COUNT(chp->cq.rptr, chp->cq.wptr)) {
+               return -ENOMEM;
+       }
+
+       /* Quiesce all QPs using this CQ */
+       ret = iwch_quiesce_qps(chp);
+       if (ret) {
+               return ret;
+       }
+
+       ret = cxio_create_cq(&chp->rhp->rdev, &newcq);
+       if (ret) {
+               return ret;
+       }
+
+       /* copy CQEs */
+       memcpy(newcq.queue, chp->cq.queue, (1 << chp->cq.size_log2) *
+                                       sizeof(struct t3_cqe));
+
+       /* old iwch_qp gets new t3_cq but keeps old cqid */
+       oldcq = chp->cq;
+       chp->cq = newcq;
+       chp->cq.cqid = oldcq.cqid;
+
+       /* resize new t3_cq to update the HW context */
+       ret = cxio_resize_cq(&chp->rhp->rdev, &chp->cq);
+       if (ret) {
+               chp->cq = oldcq;
+               return ret;
+       }
+       chp->ibcq.cqe = (1<<chp->cq.size_log2) - 1;
+
+       /* destroy old t3_cq */
+       oldcq.cqid = newcq.cqid;
+       ret = cxio_destroy_cq(&chp->rhp->rdev, &oldcq);
+       if (ret) {
+               printk(KERN_ERR MOD "%s - cxio_destroy_cq failed %d\n",
+                       __FUNCTION__, ret);
+       }
+
+       /* add user hooks here */
+
+       /* resume qps */
+       ret = iwch_resume_qps(chp);
+       return ret;
+#else
+       return -ENOSYS;
+#endif
+}
+
+static int iwch_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify notify)
+{
+       struct iwch_dev *rhp;
+       struct iwch_cq *chp;
+       enum t3_cq_opcode cq_op;
+       int err;
+       unsigned long flag;
+       u32 rptr;
+
+       chp = to_iwch_cq(ibcq);
+       rhp = chp->rhp;
+       if (notify == IB_CQ_SOLICITED)
+               cq_op = CQ_ARM_SE;
+       else
+               cq_op = CQ_ARM_AN;
+       if (chp->user_rptr_addr) {
+               if (get_user(rptr, chp->user_rptr_addr))
+                       return -EFAULT;
+               spin_lock_irqsave(&chp->lock, flag);
+               chp->cq.rptr = rptr;
+       } else
+               spin_lock_irqsave(&chp->lock, flag);
+       PDBG("%s rptr 0x%x\n", __FUNCTION__, chp->cq.rptr);
+       err = cxio_hal_cq_op(&rhp->rdev, &chp->cq, cq_op, 0);
+       spin_unlock_irqrestore(&chp->lock, flag);
+       if (err)
+               printk(KERN_ERR MOD "Error %d rearming CQID 0x%x\n", err,
+                      chp->cq.cqid);
+       return err;
+}
+
+static int iwch_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
+{
+       int len = vma->vm_end - vma->vm_start;
+       u32 key = vma->vm_pgoff << PAGE_SHIFT;
+       struct cxio_rdev *rdev_p;
+       int ret = 0;
+       struct iwch_mm_entry *mm;
+       struct iwch_ucontext *ucontext;
+
+       PDBG("%s pgoff 0x%lx key 0x%x len %d\n", __FUNCTION__, vma->vm_pgoff,
+            key, len);
+
+       if (vma->vm_start & (PAGE_SIZE-1)) {
+               return -EINVAL;
+       }
+
+       rdev_p = &(to_iwch_dev(context->device)->rdev);
+       ucontext = to_iwch_ucontext(context);
+
+       mm = remove_mmap(ucontext, key, len);
+       if (!mm)
+               return -EINVAL;
+       kfree(mm);
+
+       if ((mm->addr >= rdev_p->rnic_info.udbell_physbase) &&
+           (mm->addr < (rdev_p->rnic_info.udbell_physbase +
+                      rdev_p->rnic_info.udbell_len))) {
+
+               /*
+                * Map T3 DB register.
+                */
+               if (vma->vm_flags & VM_READ) {
+                       return -EPERM;
+               }
+
+               vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
+               vma->vm_flags |= VM_DONTCOPY | VM_DONTEXPAND;
+               vma->vm_flags &= ~VM_MAYREAD;
+               ret = io_remap_pfn_range(vma, vma->vm_start,
+                                        mm->addr >> PAGE_SHIFT,
+                                        len, vma->vm_page_prot);
+       } else {
+
+               /*
+                * Map WQ or CQ contig dma memory...
+                */
+               ret = remap_pfn_range(vma, vma->vm_start,
+                                     mm->addr >> PAGE_SHIFT,
+                                     len, vma->vm_page_prot);
+       }
+
+       return ret;
+}
+
+static int iwch_deallocate_pd(struct ib_pd *pd)
+{
+       struct iwch_dev *rhp;
+       struct iwch_pd *php;
+
+       php = to_iwch_pd(pd);
+       rhp = php->rhp;
+       PDBG("%s ibpd %p pdid 0x%x\n", __FUNCTION__, pd, php->pdid);
+       cxio_hal_put_pdid(rhp->rdev.rscp, php->pdid);
+       kfree(php);
+       return 0;
+}
+
+static struct ib_pd *iwch_allocate_pd(struct ib_device *ibdev,
+                              struct ib_ucontext *context,
+                              struct ib_udata *udata)
+{
+       struct iwch_pd *php;
+       u32 pdid;
+       struct iwch_dev *rhp;
+
+       PDBG("%s ibdev %p\n", __FUNCTION__, ibdev);
+       rhp = (struct iwch_dev *) ibdev;
+       pdid = cxio_hal_get_pdid(rhp->rdev.rscp);
+       if (!pdid)
+               return ERR_PTR(-EINVAL);
+       php = kzalloc(sizeof(*php), GFP_KERNEL);
+       if (!php) {
+               cxio_hal_put_pdid(rhp->rdev.rscp, pdid);
+               return ERR_PTR(-ENOMEM);
+       }
+       php->pdid = pdid;
+       php->rhp = rhp;
+       if (context) {
+               if (ib_copy_to_udata(udata, &php->pdid, sizeof (__u32))) {
+                       iwch_deallocate_pd(&php->ibpd);
+                       return ERR_PTR(-EFAULT);
+               }
+       }
+       PDBG("%s pdid 0x%0x ptr 0x%p\n", __FUNCTION__, pdid, php);
+       return &php->ibpd;
+}
+
+static int iwch_dereg_mr(struct ib_mr *ib_mr)
+{
+       struct iwch_dev *rhp;
+       struct iwch_mr *mhp;
+       u32 mmid;
+
+       PDBG("%s ib_mr %p\n", __FUNCTION__, ib_mr);
+       /* There can be no memory windows */
+       if (atomic_read(&ib_mr->usecnt))
+               return -EINVAL;
+
+       mhp = to_iwch_mr(ib_mr);
+       rhp = mhp->rhp;
+       mmid = mhp->attr.stag >> 8;
+       cxio_dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size,
+                      mhp->attr.pbl_addr);
+       remove_handle(rhp, &rhp->mmidr, mmid);
+       if (mhp->kva)
+               kfree((void *) (unsigned long) mhp->kva);
+       PDBG("%s mmid 0x%x ptr %p\n", __FUNCTION__, mmid, mhp);
+       kfree(mhp);
+       return 0;
+}
+
+static struct ib_mr *iwch_register_phys_mem(struct ib_pd *pd,
+                                       struct ib_phys_buf *buffer_list,
+                                       int num_phys_buf,
+                                       int acc,
+                                       u64 *iova_start)
+{
+       __be64 *page_list;
+       int shift;
+       u64 total_size;
+       int npages;
+       struct iwch_dev *rhp;
+       struct iwch_pd *php;
+       struct iwch_mr *mhp;
+       int ret;
+
+       PDBG("%s ib_pd %p\n", __FUNCTION__, pd);
+       php = to_iwch_pd(pd);
+       rhp = php->rhp;
+
+       acc = iwch_convert_access(acc);
+
+
+       mhp = kzalloc(sizeof(*mhp), GFP_KERNEL);
+       if (!mhp)
+               return ERR_PTR(-ENOMEM);
+
+       /* First check that we have enough alignment */
+       if ((*iova_start & ~PAGE_MASK) != (buffer_list[0].addr & ~PAGE_MASK)) {
+               ret = -EINVAL;
+               goto err;
+       }
+
+       if (num_phys_buf > 1 &&
+           ((buffer_list[0].addr + buffer_list[0].size) & ~PAGE_MASK)) {
+               ret = -EINVAL;
+               goto err;
+       }
+
+       ret = build_phys_page_list(buffer_list, num_phys_buf, iova_start,
+                                  &total_size, &npages, &shift, &page_list);
+       if (ret)
+               goto err;
+
+       mhp->rhp = rhp;
+       mhp->attr.pdid = php->pdid;
+       mhp->attr.zbva = 0;
+
+       /* NOTE: TPT perms are backwards from BIND WR perms! */
+       mhp->attr.perms = (acc & 0x1) << 3;
+       mhp->attr.perms |= (acc & 0x2) << 1;
+       mhp->attr.perms |= (acc & 0x4) >> 1;
+       mhp->attr.perms |= (acc & 0x8) >> 3;
+
+       mhp->attr.va_fbo = *iova_start;
+       mhp->attr.page_size = shift - 12;
+
+       mhp->attr.len = (u32) total_size;
+       mhp->attr.pbl_size = npages;
+       ret = iwch_register_mem(rhp, php, mhp, shift, page_list);
+       kfree(page_list);
+       if (ret) {
+               goto err;
+       }
+       return &mhp->ibmr;
+err:
+       kfree(mhp);
+       return ERR_PTR(ret);
+
+}
+
+static int iwch_reregister_phys_mem(struct ib_mr *mr,
+                                    int mr_rereg_mask,
+                                    struct ib_pd *pd,
+                                    struct ib_phys_buf *buffer_list,
+                                    int num_phys_buf,
+                                    int acc, u64 * iova_start)
+{
+
+       struct iwch_mr mh, *mhp;
+       struct iwch_pd *php;
+       struct iwch_dev *rhp;
+       int new_acc;
+       __be64 *page_list = NULL;
+       int shift = 0;
+       u64 total_size;
+       int npages;
+       int ret;
+
+       PDBG("%s ib_mr %p ib_pd %p\n", __FUNCTION__, mr, pd);
+
+       /* There can be no memory windows */
+       if (atomic_read(&mr->usecnt))
+               return -EINVAL;
+
+       mhp = to_iwch_mr(mr);
+       rhp = mhp->rhp;
+       php = to_iwch_pd(mr->pd);
+
+       /* make sure we are on the same adapter */
+       if (rhp != php->rhp)
+               return -EINVAL;
+
+       new_acc = mhp->attr.perms;
+
+       memcpy(&mh, mhp, sizeof *mhp);
+
+       if (mr_rereg_mask & IB_MR_REREG_PD)
+               php = to_iwch_pd(pd);
+       if (mr_rereg_mask & IB_MR_REREG_ACCESS)
+               mh.attr.perms = iwch_convert_access(acc);
+       if (mr_rereg_mask & IB_MR_REREG_TRANS)
+               ret = build_phys_page_list(buffer_list, num_phys_buf,
+                                          iova_start,
+                                          &total_size, &npages,
+                                          &shift, &page_list);
+
+       ret = iwch_reregister_mem(rhp, php, &mh, shift, page_list, npages);
+       kfree(page_list);
+       if (ret) {
+               return ret;
+       }
+       if (mr_rereg_mask & IB_MR_REREG_PD)
+               mhp->attr.pdid = php->pdid;
+       if (mr_rereg_mask & IB_MR_REREG_ACCESS)
+               mhp->attr.perms = acc;
+       if (mr_rereg_mask & IB_MR_REREG_TRANS) {
+               mhp->attr.zbva = 0;
+               mhp->attr.va_fbo = *iova_start;
+               mhp->attr.page_size = shift - 12;
+               mhp->attr.len = (u32) total_size;
+               mhp->attr.pbl_size = npages;
+       }
+
+       return 0;
+}
+
+
+static struct ib_mr *iwch_reg_user_mr(struct ib_pd *pd, struct ib_umem *region,
+                                     int acc, struct ib_udata *udata)
+{
+       __be64 *pages;
+       int shift, n, len;
+       int i, j, k;
+       int err = 0;
+       struct ib_umem_chunk *chunk;
+       struct iwch_dev *rhp;
+       struct iwch_pd *php;
+       struct iwch_mr *mhp;
+       struct iwch_reg_user_mr_resp uresp;
+
+       PDBG("%s ib_pd %p\n", __FUNCTION__, pd);
+       shift = ffs(region->page_size) - 1;
+
+       php = to_iwch_pd(pd);
+       rhp = php->rhp;
+       mhp = kzalloc(sizeof(*mhp), GFP_KERNEL);
+       if (!mhp)
+               return ERR_PTR(-ENOMEM);
+
+       n = 0;
+       list_for_each_entry(chunk, &region->chunk_list, list)
+               n += chunk->nents;
+
+       pages = kmalloc(n * sizeof(u64), GFP_KERNEL);
+       if (!pages) {
+               err = -ENOMEM;
+               goto err;
+       }
+
+       acc = iwch_convert_access(acc);
+
+       i = n = 0;
+
+       list_for_each_entry(chunk, &region->chunk_list, list)
+               for (j = 0; j < chunk->nmap; ++j) {
+                       len = sg_dma_len(&chunk->page_list[j]) >> shift;
+                       for (k = 0; k < len; ++k) {
+                               pages[i++] = cpu_to_be64(sg_dma_address(
+                                       &chunk->page_list[j]) +
+                                       region->page_size * k);
+                       }
+               }
+
+       mhp->rhp = rhp;
+       mhp->attr.pdid = php->pdid;
+       mhp->attr.zbva = 0;
+       mhp->attr.perms = (acc & 0x1) << 3;
+       mhp->attr.perms |= (acc & 0x2) << 1;
+       mhp->attr.perms |= (acc & 0x4) >> 1;
+       mhp->attr.perms |= (acc & 0x8) >> 3;
+       mhp->attr.va_fbo = region->virt_base;
+       mhp->attr.page_size = shift - 12;
+       mhp->attr.len = (u32) region->length;
+       mhp->attr.pbl_size = i;
+       err = iwch_register_mem(rhp, php, mhp, shift, pages);
+       kfree(pages);
+       if (err)
+               goto err;
+
+       if (udata && t3b_device(rhp)) {
+               uresp.pbl_addr = (mhp->attr.pbl_addr -
+                                rhp->rdev.rnic_info.pbl_base) >> 3;
+               PDBG("%s user resp pbl_addr 0x%x\n", __FUNCTION__,
+                    uresp.pbl_addr);
+
+               if (ib_copy_to_udata(udata, &uresp, sizeof (uresp))) {
+                       iwch_dereg_mr(&mhp->ibmr);
+                       err = -EFAULT;
+                       goto err;
+               }
+       }
+
+       return &mhp->ibmr;
+
+err:
+       kfree(mhp);
+       return ERR_PTR(err);
+}
+
+static struct ib_mr *iwch_get_dma_mr(struct ib_pd *pd, int acc)
+{
+       struct ib_phys_buf bl;
+       u64 kva;
+       struct ib_mr *ibmr;
+
+       PDBG("%s ib_pd %p\n", __FUNCTION__, pd);
+
+       /*
+        * T3 only supports 32 bits of size.
+        */
+       bl.size = 0xffffffff;
+       bl.addr = 0;
+       kva = 0;
+       ibmr = iwch_register_phys_mem(pd, &bl, 1, acc, &kva);
+       return ibmr;
+}
+
+static struct ib_mw *iwch_alloc_mw(struct ib_pd *pd)
+{
+       struct iwch_dev *rhp;
+       struct iwch_pd *php;
+       struct iwch_mw *mhp;
+       u32 mmid;
+       u32 stag = 0;
+       int ret;
+
+       php = to_iwch_pd(pd);
+       rhp = php->rhp;
+       mhp = kzalloc(sizeof(*mhp), GFP_KERNEL);
+       if (!mhp)
+               return ERR_PTR(-ENOMEM);
+       ret = cxio_allocate_window(&rhp->rdev, &stag, php->pdid);
+       if (ret) {
+               kfree(mhp);
+               return ERR_PTR(ret);
+       }
+       mhp->rhp = rhp;
+       mhp->attr.pdid = php->pdid;
+       mhp->attr.type = TPT_MW;
+       mhp->attr.stag = stag;
+       mmid = (stag) >> 8;
+       insert_handle(rhp, &rhp->mmidr, mhp, mmid);
+       PDBG("%s mmid 0x%x mhp %p stag 0x%x\n", __FUNCTION__, mmid, mhp, stag);
+       return &(mhp->ibmw);
+}
+
+static int iwch_dealloc_mw(struct ib_mw *mw)
+{
+       struct iwch_dev *rhp;
+       struct iwch_mw *mhp;
+       u32 mmid;
+
+       mhp = to_iwch_mw(mw);
+       rhp = mhp->rhp;
+       mmid = (mw->rkey) >> 8;
+       cxio_deallocate_window(&rhp->rdev, mhp->attr.stag);
+       remove_handle(rhp, &rhp->mmidr, mmid);
+       kfree(mhp);
+       PDBG("%s ib_mw %p mmid 0x%x ptr %p\n", __FUNCTION__, mw, mmid, mhp);
+       return 0;
+}
+
+static int iwch_destroy_qp(struct ib_qp *ib_qp)
+{
+       struct iwch_dev *rhp;
+       struct iwch_qp *qhp;
+       struct iwch_qp_attributes attrs;
+       struct iwch_ucontext *ucontext;
+
+       qhp = to_iwch_qp(ib_qp);
+       rhp = qhp->rhp;
+
+       if (qhp->attr.state == IWCH_QP_STATE_RTS) {
+               attrs.next_state = IWCH_QP_STATE_ERROR;
+               iwch_modify_qp(rhp, qhp, IWCH_QP_ATTR_NEXT_STATE, &attrs, 0);
+       }
+       wait_event(qhp->wait, !qhp->ep);
+
+       remove_handle(rhp, &rhp->qpidr, qhp->wq.qpid);
+
+       atomic_dec(&qhp->refcnt);
+       wait_event(qhp->wait, !atomic_read(&qhp->refcnt));
+
+       ucontext = ib_qp->uobject ? to_iwch_ucontext(ib_qp->uobject->context)
+                                 : NULL;
+       cxio_destroy_qp(&rhp->rdev, &qhp->wq,
+                       ucontext ? &ucontext->uctx : &rhp->rdev.uctx);
+
+       PDBG("%s ib_qp %p qpid 0x%0x qhp %p\n", __FUNCTION__,
+            ib_qp, qhp->wq.qpid, qhp);
+       kfree(qhp);
+       return 0;
+}
+
+static struct ib_qp *iwch_create_qp(struct ib_pd *pd,
+                            struct ib_qp_init_attr *attrs,
+                            struct ib_udata *udata)
+{
+       struct iwch_dev *rhp;
+       struct iwch_qp *qhp;
+       struct iwch_pd *php;
+       struct iwch_cq *schp;
+       struct iwch_cq *rchp;
+       struct iwch_create_qp_resp uresp;
+       int wqsize, sqsize, rqsize;
+       struct iwch_ucontext *ucontext;
+
+       PDBG("%s ib_pd %p\n", __FUNCTION__, pd);
+       if (attrs->qp_type != IB_QPT_RC)
+               return ERR_PTR(-EINVAL);
+       php = to_iwch_pd(pd);
+       rhp = php->rhp;
+       schp = get_chp(rhp, ((struct iwch_cq *) attrs->send_cq)->cq.cqid);
+       rchp = get_chp(rhp, ((struct iwch_cq *) attrs->recv_cq)->cq.cqid);
+       if (!schp || !rchp)
+               return ERR_PTR(-EINVAL);
+
+       /* The RQT size must be # of entries + 1 rounded up to a power of two */
+       rqsize = roundup_pow_of_two(attrs->cap.max_recv_wr);
+       if (rqsize == attrs->cap.max_recv_wr)
+               rqsize = roundup_pow_of_two(attrs->cap.max_recv_wr+1);
+
+       /* T3 doesn't support RQT depth < 16 */
+       if (rqsize < 16)
+               rqsize = 16;
+
+       if (rqsize > T3_MAX_RQ_SIZE)
+               return ERR_PTR(-EINVAL);
+
+       /*
+        * NOTE: The SQ and total WQ sizes don't need to be
+        * a power of two.  However, all the code assumes
+        * they are. EG: Q_FREECNT() and friends.
+        */
+       sqsize = roundup_pow_of_two(attrs->cap.max_send_wr);
+       wqsize = roundup_pow_of_two(rqsize + sqsize);
+       PDBG("%s wqsize %d sqsize %d rqsize %d\n", __FUNCTION__,
+            wqsize, sqsize, rqsize);
+       qhp = kzalloc(sizeof(*qhp), GFP_KERNEL);
+       if (!qhp)
+               return ERR_PTR(-ENOMEM);
+       qhp->wq.size_log2 = ilog2(wqsize);
+       qhp->wq.rq_size_log2 = ilog2(rqsize);
+       qhp->wq.sq_size_log2 = ilog2(sqsize);
+       ucontext = pd->uobject ? to_iwch_ucontext(pd->uobject->context) : NULL;
+       if (cxio_create_qp(&rhp->rdev, !udata, &qhp->wq,
+                          ucontext ? &ucontext->uctx : &rhp->rdev.uctx)) {
+               kfree(qhp);
+               return ERR_PTR(-ENOMEM);
+       }
+       attrs->cap.max_recv_wr = rqsize - 1;
+       attrs->cap.max_send_wr = sqsize;
+       qhp->rhp = rhp;
+       qhp->attr.pd = php->pdid;
+       qhp->attr.scq = ((struct iwch_cq *) attrs->send_cq)->cq.cqid;
+       qhp->attr.rcq = ((struct iwch_cq *) attrs->recv_cq)->cq.cqid;
+       qhp->attr.sq_num_entries = attrs->cap.max_send_wr;
+       qhp->attr.rq_num_entries = attrs->cap.max_recv_wr;
+       qhp->attr.sq_max_sges = attrs->cap.max_send_sge;
+       qhp->attr.sq_max_sges_rdma_write = attrs->cap.max_send_sge;
+       qhp->attr.rq_max_sges = attrs->cap.max_recv_sge;
+       qhp->attr.state = IWCH_QP_STATE_IDLE;
+       qhp->attr.next_state = IWCH_QP_STATE_IDLE;
+
+       /*
+        * XXX - These don't get passed in from the openib user
+        * at create time.  The CM sets them via a QP modify.
+        * Need to fix...  I think the CM should
+        */
+       qhp->attr.enable_rdma_read = 1;
+       qhp->attr.enable_rdma_write = 1;
+       qhp->attr.enable_bind = 1;
+       qhp->attr.max_ord = 1;
+       qhp->attr.max_ird = 1;
+
+       spin_lock_init(&qhp->lock);
+       init_waitqueue_head(&qhp->wait);
+       atomic_set(&qhp->refcnt, 1);
+       insert_handle(rhp, &rhp->qpidr, qhp, qhp->wq.qpid);
+
+       if (udata) {
+
+               struct iwch_mm_entry *mm1, *mm2;
+
+               mm1 = kmalloc(sizeof *mm1, GFP_KERNEL);
+               if (!mm1) {
+                       iwch_destroy_qp(&qhp->ibqp);
+                       return ERR_PTR(-ENOMEM);
+               }
+
+               mm2 = kmalloc(sizeof *mm2, GFP_KERNEL);
+               if (!mm2) {
+                       kfree(mm1);
+                       iwch_destroy_qp(&qhp->ibqp);
+                       return ERR_PTR(-ENOMEM);
+               }
+
+               uresp.qpid = qhp->wq.qpid;
+               uresp.size_log2 = qhp->wq.size_log2;
+               uresp.sq_size_log2 = qhp->wq.sq_size_log2;
+               uresp.rq_size_log2 = qhp->wq.rq_size_log2;
+               spin_lock(&ucontext->mmap_lock);
+               uresp.key = ucontext->key;
+               ucontext->key += PAGE_SIZE;
+               uresp.db_key = ucontext->key;
+               ucontext->key += PAGE_SIZE;
+               spin_unlock(&ucontext->mmap_lock);
+               if (ib_copy_to_udata(udata, &uresp, sizeof (uresp))) {
+                       kfree(mm1);
+                       kfree(mm2);
+                       iwch_destroy_qp(&qhp->ibqp);
+                       return ERR_PTR(-EFAULT);
+               }
+               mm1->key = uresp.key;
+               mm1->addr = virt_to_phys(qhp->wq.queue);
+               mm1->len = PAGE_ALIGN(wqsize * sizeof (union t3_wr));
+               insert_mmap(ucontext, mm1);
+               mm2->key = uresp.db_key;
+               mm2->addr = qhp->wq.udb & PAGE_MASK;
+               mm2->len = PAGE_SIZE;
+               insert_mmap(ucontext, mm2);
+       }
+       qhp->ibqp.qp_num = qhp->wq.qpid;
+       init_timer(&(qhp->timer));
+       PDBG("%s sq_num_entries %d, rq_num_entries %d "
+            "qpid 0x%0x qhp %p dma_addr 0x%llx size %d\n",
+            __FUNCTION__, qhp->attr.sq_num_entries, qhp->attr.rq_num_entries,
+            qhp->wq.qpid, qhp, (unsigned long long) qhp->wq.dma_addr,
+            1 << qhp->wq.size_log2);
+       return &qhp->ibqp;
+}
+
+static int iwch_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
+                     int attr_mask, struct ib_udata *udata)
+{
+       struct iwch_dev *rhp;
+       struct iwch_qp *qhp;
+       enum iwch_qp_attr_mask mask = 0;
+       struct iwch_qp_attributes attrs;
+
+       PDBG("%s ib_qp %p\n", __FUNCTION__, ibqp);
+
+       /* iwarp does not support the RTR state */
+       if ((attr_mask & IB_QP_STATE) && (attr->qp_state == IB_QPS_RTR))
+               attr_mask &= ~IB_QP_STATE;
+
+       /* Make sure we still have something left to do */
+       if (!attr_mask)
+               return 0;
+
+       memset(&attrs, 0, sizeof attrs);
+       qhp = to_iwch_qp(ibqp);
+       rhp = qhp->rhp;
+
+       attrs.next_state = iwch_convert_state(attr->qp_state);
+       attrs.enable_rdma_read = (attr->qp_access_flags &
+                              IB_ACCESS_REMOTE_READ) ?  1 : 0;
+       attrs.enable_rdma_write = (attr->qp_access_flags &
+                               IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
+       attrs.enable_bind = (attr->qp_access_flags & IB_ACCESS_MW_BIND) ? 1 : 0;
+
+
+       mask |= (attr_mask & IB_QP_STATE) ? IWCH_QP_ATTR_NEXT_STATE : 0;
+       mask |= (attr_mask & IB_QP_ACCESS_FLAGS) ?
+                       (IWCH_QP_ATTR_ENABLE_RDMA_READ |
+                        IWCH_QP_ATTR_ENABLE_RDMA_WRITE |
+                        IWCH_QP_ATTR_ENABLE_RDMA_BIND) : 0;
+
+       return iwch_modify_qp(rhp, qhp, mask, &attrs, 0);
+}
+
+void iwch_qp_add_ref(struct ib_qp *qp)
+{
+       PDBG("%s ib_qp %p\n", __FUNCTION__, qp);
+       atomic_inc(&(to_iwch_qp(qp)->refcnt));
+}
+
+void iwch_qp_rem_ref(struct ib_qp *qp)
+{
+       PDBG("%s ib_qp %p\n", __FUNCTION__, qp);
+       if (atomic_dec_and_test(&(to_iwch_qp(qp)->refcnt)))
+               wake_up(&(to_iwch_qp(qp)->wait));
+}
+
+struct ib_qp *iwch_get_qp(struct ib_device *dev, int qpn)
+{
+       PDBG("%s ib_dev %p qpn 0x%x\n", __FUNCTION__, dev, qpn);
+       return (struct ib_qp *)get_qhp(to_iwch_dev(dev), qpn);
+}
+
+
+static int iwch_query_pkey(struct ib_device *ibdev,
+                          u8 port, u16 index, u16 * pkey)
+{
+       PDBG("%s ibdev %p\n", __FUNCTION__, ibdev);
+       *pkey = 0;
+       return 0;
+}
+
+static int iwch_query_gid(struct ib_device *ibdev, u8 port,
+                         int index, union ib_gid *gid)
+{
+       struct iwch_dev *dev;
+
+       PDBG("%s ibdev %p, port %d, index %d, gid %p\n",
+              __FUNCTION__, ibdev, port, index, gid);
+       dev = to_iwch_dev(ibdev);
+       BUG_ON(port == 0 || port > 2);
+       memset(&(gid->raw[0]), 0, sizeof(gid->raw));
+       memcpy(&(gid->raw[0]), dev->rdev.port_info.lldevs[port-1]->dev_addr, 6);
+       return 0;
+}
+
+static int iwch_query_device(struct ib_device *ibdev,
+                            struct ib_device_attr *props)
+{
+
+       struct iwch_dev *dev;
+       PDBG("%s ibdev %p\n", __FUNCTION__, ibdev);
+
+       dev = to_iwch_dev(ibdev);
+       memset(props, 0, sizeof *props);
+       memcpy(&props->sys_image_guid, dev->rdev.t3cdev_p->lldev->dev_addr, 6);
+       props->device_cap_flags = dev->device_cap_flags;
+       props->vendor_id = (u32)dev->rdev.rnic_info.pdev->vendor;
+       props->vendor_part_id = (u32)dev->rdev.rnic_info.pdev->device;
+       props->max_mr_size = ~0ull;
+       props->max_qp = dev->attr.max_qps;
+       props->max_qp_wr = dev->attr.max_wrs;
+       props->max_sge = dev->attr.max_sge_per_wr;
+       props->max_sge_rd = 1;
+       props->max_qp_rd_atom = dev->attr.max_rdma_reads_per_qp;
+       props->max_cq = dev->attr.max_cqs;
+       props->max_cqe = dev->attr.max_cqes_per_cq;
+       props->max_mr = dev->attr.max_mem_regs;
+       props->max_pd = dev->attr.max_pds;
+       props->local_ca_ack_delay = 0;
+
+       return 0;
+}
+
+static int iwch_query_port(struct ib_device *ibdev,
+                          u8 port, struct ib_port_attr *props)
+{
+       PDBG("%s ibdev %p\n", __FUNCTION__, ibdev);
+       props->max_mtu = IB_MTU_4096;
+       props->lid = 0;
+       props->lmc = 0;
+       props->sm_lid = 0;
+       props->sm_sl = 0;
+       props->state = IB_PORT_ACTIVE;
+       props->phys_state = 0;
+       props->port_cap_flags =
+           IB_PORT_CM_SUP |
+           IB_PORT_SNMP_TUNNEL_SUP |
+           IB_PORT_REINIT_SUP |
+           IB_PORT_DEVICE_MGMT_SUP |
+           IB_PORT_VENDOR_CLASS_SUP | IB_PORT_BOOT_MGMT_SUP;
+       props->gid_tbl_len = 1;
+       props->pkey_tbl_len = 1;
+       props->qkey_viol_cntr = 0;
+       props->active_width = 2;
+       props->active_speed = 2;
+       props->max_msg_sz = -1;
+
+       return 0;
+}
+
+static ssize_t show_rev(struct class_device *cdev, char *buf)
+{
+       struct iwch_dev *dev = container_of(cdev, struct iwch_dev,
+                                           ibdev.class_dev);
+       PDBG("%s class dev 0x%p\n", __FUNCTION__, cdev);
+       return sprintf(buf, "%d\n", dev->rdev.t3cdev_p->type);
+}
+
+static ssize_t show_fw_ver(struct class_device *cdev, char *buf)
+{
+       struct iwch_dev *dev = container_of(cdev, struct iwch_dev,
+                                           ibdev.class_dev);
+       struct ethtool_drvinfo info;
+       struct net_device *lldev = dev->rdev.t3cdev_p->lldev;
+
+       PDBG("%s class dev 0x%p\n", __FUNCTION__, cdev);
+       lldev->ethtool_ops->get_drvinfo(lldev, &info);
+       return sprintf(buf, "%s\n", info.fw_version);
+}
+
+static ssize_t show_hca(struct class_device *cdev, char *buf)
+{
+       struct iwch_dev *dev = container_of(cdev, struct iwch_dev,
+                                           ibdev.class_dev);
+       struct ethtool_drvinfo info;
+       struct net_device *lldev = dev->rdev.t3cdev_p->lldev;
+
+       PDBG("%s class dev 0x%p\n", __FUNCTION__, cdev);
+       lldev->ethtool_ops->get_drvinfo(lldev, &info);
+       return sprintf(buf, "%s\n", info.driver);
+}
+
+static ssize_t show_board(struct class_device *cdev, char *buf)
+{
+       struct iwch_dev *dev = container_of(cdev, struct iwch_dev,
+                                           ibdev.class_dev);
+       PDBG("%s class dev 0x%p\n", __FUNCTION__, dev);
+       return sprintf(buf, "%x.%x\n", dev->rdev.rnic_info.pdev->vendor,
+                                      dev->rdev.rnic_info.pdev->device);
+}
+
+static CLASS_DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL);
+static CLASS_DEVICE_ATTR(fw_ver, S_IRUGO, show_fw_ver, NULL);
+static CLASS_DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL);
+static CLASS_DEVICE_ATTR(board_id, S_IRUGO, show_board, NULL);
+
+static struct class_device_attribute *iwch_class_attributes[] = {
+       &class_device_attr_hw_rev,
+       &class_device_attr_fw_ver,
+       &class_device_attr_hca_type,
+       &class_device_attr_board_id
+};
+
+int iwch_register_device(struct iwch_dev *dev)
+{
+       int ret;
+       int i;
+
+       PDBG("%s iwch_dev %p\n", __FUNCTION__, dev);
+       strlcpy(dev->ibdev.name, "cxgb3_%d", IB_DEVICE_NAME_MAX);
+       memset(&dev->ibdev.node_guid, 0, sizeof(dev->ibdev.node_guid));
+       memcpy(&dev->ibdev.node_guid, dev->rdev.t3cdev_p->lldev->dev_addr, 6);
+       dev->ibdev.owner = THIS_MODULE;
+       dev->device_cap_flags =
+           (IB_DEVICE_ZERO_STAG |
+            IB_DEVICE_SEND_W_INV | IB_DEVICE_MEM_WINDOW);
+
+       dev->ibdev.uverbs_cmd_mask =
+           (1ull << IB_USER_VERBS_CMD_GET_CONTEXT) |
+           (1ull << IB_USER_VERBS_CMD_QUERY_DEVICE) |
+           (1ull << IB_USER_VERBS_CMD_QUERY_PORT) |
+           (1ull << IB_USER_VERBS_CMD_ALLOC_PD) |
+           (1ull << IB_USER_VERBS_CMD_DEALLOC_PD) |
+           (1ull << IB_USER_VERBS_CMD_REG_MR) |
+           (1ull << IB_USER_VERBS_CMD_DEREG_MR) |
+           (1ull << IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL) |
+           (1ull << IB_USER_VERBS_CMD_CREATE_CQ) |
+           (1ull << IB_USER_VERBS_CMD_DESTROY_CQ) |
+           (1ull << IB_USER_VERBS_CMD_REQ_NOTIFY_CQ) |
+           (1ull << IB_USER_VERBS_CMD_CREATE_QP) |
+           (1ull << IB_USER_VERBS_CMD_MODIFY_QP) |
+           (1ull << IB_USER_VERBS_CMD_POLL_CQ) |
+           (1ull << IB_USER_VERBS_CMD_DESTROY_QP) |
+           (1ull << IB_USER_VERBS_CMD_POST_SEND) |
+           (1ull << IB_USER_VERBS_CMD_POST_RECV);
+       dev->ibdev.node_type = RDMA_NODE_RNIC;
+       memcpy(dev->ibdev.node_desc, IWCH_NODE_DESC, sizeof(IWCH_NODE_DESC));
+       dev->ibdev.phys_port_cnt = dev->rdev.port_info.nports;
+       dev->ibdev.dma_device = &(dev->rdev.rnic_info.pdev->dev);
+       dev->ibdev.class_dev.dev = &(dev->rdev.rnic_info.pdev->dev);
+       dev->ibdev.query_device = iwch_query_device;
+       dev->ibdev.query_port = iwch_query_port;
+       dev->ibdev.modify_port = iwch_modify_port;
+       dev->ibdev.query_pkey = iwch_query_pkey;
+       dev->ibdev.query_gid = iwch_query_gid;
+       dev->ibdev.alloc_ucontext = iwch_alloc_ucontext;
+       dev->ibdev.dealloc_ucontext = iwch_dealloc_ucontext;
+       dev->ibdev.mmap = iwch_mmap;
+       dev->ibdev.alloc_pd = iwch_allocate_pd;
+       dev->ibdev.dealloc_pd = iwch_deallocate_pd;
+       dev->ibdev.create_ah = iwch_ah_create;
+       dev->ibdev.destroy_ah = iwch_ah_destroy;
+       dev->ibdev.create_qp = iwch_create_qp;
+       dev->ibdev.modify_qp = iwch_ib_modify_qp;
+       dev->ibdev.destroy_qp = iwch_destroy_qp;
+       dev->ibdev.create_cq = iwch_create_cq;
+       dev->ibdev.destroy_cq = iwch_destroy_cq;
+       dev->ibdev.resize_cq = iwch_resize_cq;
+       dev->ibdev.poll_cq = iwch_poll_cq;
+       dev->ibdev.get_dma_mr = iwch_get_dma_mr;
+       dev->ibdev.reg_phys_mr = iwch_register_phys_mem;
+       dev->ibdev.rereg_phys_mr = iwch_reregister_phys_mem;
+       dev->ibdev.reg_user_mr = iwch_reg_user_mr;
+       dev->ibdev.dereg_mr = iwch_dereg_mr;
+       dev->ibdev.alloc_mw = iwch_alloc_mw;
+       dev->ibdev.bind_mw = iwch_bind_mw;
+       dev->ibdev.dealloc_mw = iwch_dealloc_mw;
+
+       dev->ibdev.attach_mcast = iwch_multicast_attach;
+       dev->ibdev.detach_mcast = iwch_multicast_detach;
+       dev->ibdev.process_mad = iwch_process_mad;
+
+       dev->ibdev.req_notify_cq = iwch_arm_cq;
+       dev->ibdev.post_send = iwch_post_send;
+       dev->ibdev.post_recv = iwch_post_receive;
+
+
+       dev->ibdev.iwcm =
+           (struct iw_cm_verbs *) kmalloc(sizeof(struct iw_cm_verbs),
+                                          GFP_KERNEL);
+       dev->ibdev.iwcm->connect = iwch_connect;
+       dev->ibdev.iwcm->accept = iwch_accept_cr;
+       dev->ibdev.iwcm->reject = iwch_reject_cr;
+       dev->ibdev.iwcm->create_listen = iwch_create_listen;
+       dev->ibdev.iwcm->destroy_listen = iwch_destroy_listen;
+       dev->ibdev.iwcm->add_ref = iwch_qp_add_ref;
+       dev->ibdev.iwcm->rem_ref = iwch_qp_rem_ref;
+       dev->ibdev.iwcm->get_qp = iwch_get_qp;
+
+       ret = ib_register_device(&dev->ibdev);
+       if (ret)
+               goto bail1;
+
+       for (i = 0; i < ARRAY_SIZE(iwch_class_attributes); ++i) {
+               ret = class_device_create_file(&dev->ibdev.class_dev,
+                                              iwch_class_attributes[i]);
+               if (ret) {
+                       goto bail2;
+               }
+       }
+       return 0;
+bail2:
+       ib_unregister_device(&dev->ibdev);
+bail1:
+       return ret;
+}
+
+void iwch_unregister_device(struct iwch_dev *dev)
+{
+       int i;
+
+       PDBG("%s iwch_dev %p\n", __FUNCTION__, dev);
+       for (i = 0; i < ARRAY_SIZE(iwch_class_attributes); ++i)
+               class_device_remove_file(&dev->ibdev.class_dev,
+                                        iwch_class_attributes[i]);
+       ib_unregister_device(&dev->ibdev);
+       return;
+}
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.h b/drivers/infiniband/hw/cxgb3/iwch_provider.h
new file mode 100644 (file)
index 0000000..61e3278
--- /dev/null
@@ -0,0 +1,367 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef __IWCH_PROVIDER_H__
+#define __IWCH_PROVIDER_H__
+
+#include <linux/list.h>
+#include <linux/spinlock.h>
+#include <rdma/ib_verbs.h>
+#include <asm/types.h>
+#include "t3cdev.h"
+#include "iwch.h"
+#include "cxio_wr.h"
+#include "cxio_hal.h"
+
+struct iwch_pd {
+       struct ib_pd ibpd;
+       u32 pdid;
+       struct iwch_dev *rhp;
+};
+
+static inline struct iwch_pd *to_iwch_pd(struct ib_pd *ibpd)
+{
+       return container_of(ibpd, struct iwch_pd, ibpd);
+}
+
+struct tpt_attributes {
+       u32 stag;
+       u32 state:1;
+       u32 type:2;
+       u32 rsvd:1;
+       enum tpt_mem_perm perms;
+       u32 remote_invaliate_disable:1;
+       u32 zbva:1;
+       u32 mw_bind_enable:1;
+       u32 page_size:5;
+
+       u32 pdid;
+       u32 qpid;
+       u32 pbl_addr;
+       u32 len;
+       u64 va_fbo;
+       u32 pbl_size;
+};
+
+struct iwch_mr {
+       struct ib_mr ibmr;
+       struct iwch_dev *rhp;
+       u64 kva;
+       struct tpt_attributes attr;
+};
+
+typedef struct iwch_mw iwch_mw_handle;
+
+static inline struct iwch_mr *to_iwch_mr(struct ib_mr *ibmr)
+{
+       return container_of(ibmr, struct iwch_mr, ibmr);
+}
+
+struct iwch_mw {
+       struct ib_mw ibmw;
+       struct iwch_dev *rhp;
+       u64 kva;
+       struct tpt_attributes attr;
+};
+
+static inline struct iwch_mw *to_iwch_mw(struct ib_mw *ibmw)
+{
+       return container_of(ibmw, struct iwch_mw, ibmw);
+}
+
+struct iwch_cq {
+       struct ib_cq ibcq;
+       struct iwch_dev *rhp;
+       struct t3_cq cq;
+       spinlock_t lock;
+       atomic_t refcnt;
+       wait_queue_head_t wait;
+       u32 __user *user_rptr_addr;
+};
+
+static inline struct iwch_cq *to_iwch_cq(struct ib_cq *ibcq)
+{
+       return container_of(ibcq, struct iwch_cq, ibcq);
+}
+
+enum IWCH_QP_FLAGS {
+       QP_QUIESCED = 0x01
+};
+
+struct iwch_mpa_attributes {
+       u8 recv_marker_enabled;
+       u8 xmit_marker_enabled; /* iWARP: enable inbound Read Resp. */
+       u8 crc_enabled;
+       u8 version;     /* 0 or 1 */
+};
+
+struct iwch_qp_attributes {
+       u32 scq;
+       u32 rcq;
+       u32 sq_num_entries;
+       u32 rq_num_entries;
+       u32 sq_max_sges;
+       u32 sq_max_sges_rdma_write;
+       u32 rq_max_sges;
+       u32 state;
+       u8 enable_rdma_read;
+       u8 enable_rdma_write;   /* enable inbound Read Resp. */
+       u8 enable_bind;
+       u8 enable_mmid0_fastreg;        /* Enable STAG0 + Fast-register */
+       /*
+        * Next QP state. If specify the current state, only the
+        * QP attributes will be modified.
+        */
+       u32 max_ord;
+       u32 max_ird;
+       u32 pd; /* IN */
+       u32 next_state;
+       char terminate_buffer[52];
+       u32 terminate_msg_len;
+       u8 is_terminate_local;
+       struct iwch_mpa_attributes mpa_attr;    /* IN-OUT */
+       struct iwch_ep *llp_stream_handle;
+       char *stream_msg_buf;   /* Last stream msg. before Idle -> RTS */
+       u32 stream_msg_buf_len; /* Only on Idle -> RTS */
+};
+
+struct iwch_qp {
+       struct ib_qp ibqp;
+       struct iwch_dev *rhp;
+       struct iwch_ep *ep;
+       struct iwch_qp_attributes attr;
+       struct t3_wq wq;
+       spinlock_t lock;
+       atomic_t refcnt;
+       wait_queue_head_t wait;
+       enum IWCH_QP_FLAGS flags;
+       struct timer_list timer;
+};
+
+static inline int qp_quiesced(struct iwch_qp *qhp)
+{
+       return qhp->flags & QP_QUIESCED;
+}
+
+static inline struct iwch_qp *to_iwch_qp(struct ib_qp *ibqp)
+{
+       return container_of(ibqp, struct iwch_qp, ibqp);
+}
+
+void iwch_qp_add_ref(struct ib_qp *qp);
+void iwch_qp_rem_ref(struct ib_qp *qp);
+struct ib_qp *iwch_get_qp(struct ib_device *dev, int qpn);
+
+struct iwch_ucontext {
+       struct ib_ucontext ibucontext;
+       struct cxio_ucontext uctx;
+       u32 key;
+       spinlock_t mmap_lock;
+       struct list_head mmaps;
+};
+
+static inline struct iwch_ucontext *to_iwch_ucontext(struct ib_ucontext *c)
+{
+       return container_of(c, struct iwch_ucontext, ibucontext);
+}
+
+struct iwch_mm_entry {
+       struct list_head entry;
+       u64 addr;
+       u32 key;
+       unsigned len;
+};
+
+static inline struct iwch_mm_entry *remove_mmap(struct iwch_ucontext *ucontext,
+                                               u32 key, unsigned len)
+{
+       struct list_head *pos, *nxt;
+       struct iwch_mm_entry *mm;
+
+       spin_lock(&ucontext->mmap_lock);
+       list_for_each_safe(pos, nxt, &ucontext->mmaps) {
+
+               mm = list_entry(pos, struct iwch_mm_entry, entry);
+               if (mm->key == key && mm->len == len) {
+                       list_del_init(&mm->entry);
+                       spin_unlock(&ucontext->mmap_lock);
+                       PDBG("%s key 0x%x addr 0x%llx len %d\n", __FUNCTION__,
+                            key, (unsigned long long) mm->addr, mm->len);
+                       return mm;
+               }
+       }
+       spin_unlock(&ucontext->mmap_lock);
+       return NULL;
+}
+
+static inline void insert_mmap(struct iwch_ucontext *ucontext,
+                              struct iwch_mm_entry *mm)
+{
+       spin_lock(&ucontext->mmap_lock);
+       PDBG("%s key 0x%x addr 0x%llx len %d\n", __FUNCTION__,
+            mm->key, (unsigned long long) mm->addr, mm->len);
+       list_add_tail(&mm->entry, &ucontext->mmaps);
+       spin_unlock(&ucontext->mmap_lock);
+}
+
+enum iwch_qp_attr_mask {
+       IWCH_QP_ATTR_NEXT_STATE = 1 << 0,
+       IWCH_QP_ATTR_ENABLE_RDMA_READ = 1 << 7,
+       IWCH_QP_ATTR_ENABLE_RDMA_WRITE = 1 << 8,
+       IWCH_QP_ATTR_ENABLE_RDMA_BIND = 1 << 9,
+       IWCH_QP_ATTR_MAX_ORD = 1 << 11,
+       IWCH_QP_ATTR_MAX_IRD = 1 << 12,
+       IWCH_QP_ATTR_LLP_STREAM_HANDLE = 1 << 22,
+       IWCH_QP_ATTR_STREAM_MSG_BUFFER = 1 << 23,
+       IWCH_QP_ATTR_MPA_ATTR = 1 << 24,
+       IWCH_QP_ATTR_QP_CONTEXT_ACTIVATE = 1 << 25,
+       IWCH_QP_ATTR_VALID_MODIFY = (IWCH_QP_ATTR_ENABLE_RDMA_READ |
+                                    IWCH_QP_ATTR_ENABLE_RDMA_WRITE |
+                                    IWCH_QP_ATTR_MAX_ORD |
+                                    IWCH_QP_ATTR_MAX_IRD |
+                                    IWCH_QP_ATTR_LLP_STREAM_HANDLE |
+                                    IWCH_QP_ATTR_STREAM_MSG_BUFFER |
+                                    IWCH_QP_ATTR_MPA_ATTR |
+                                    IWCH_QP_ATTR_QP_CONTEXT_ACTIVATE)
+};
+
+int iwch_modify_qp(struct iwch_dev *rhp,
+                               struct iwch_qp *qhp,
+                               enum iwch_qp_attr_mask mask,
+                               struct iwch_qp_attributes *attrs,
+                               int internal);
+
+enum iwch_qp_state {
+       IWCH_QP_STATE_IDLE,
+       IWCH_QP_STATE_RTS,
+       IWCH_QP_STATE_ERROR,
+       IWCH_QP_STATE_TERMINATE,
+       IWCH_QP_STATE_CLOSING,
+       IWCH_QP_STATE_TOT
+};
+
+static inline int iwch_convert_state(enum ib_qp_state ib_state)
+{
+       switch (ib_state) {
+       case IB_QPS_RESET:
+       case IB_QPS_INIT:
+               return IWCH_QP_STATE_IDLE;
+       case IB_QPS_RTS:
+               return IWCH_QP_STATE_RTS;
+       case IB_QPS_SQD:
+               return IWCH_QP_STATE_CLOSING;
+       case IB_QPS_SQE:
+               return IWCH_QP_STATE_TERMINATE;
+       case IB_QPS_ERR:
+               return IWCH_QP_STATE_ERROR;
+       default:
+               return -1;
+       }
+}
+
+enum iwch_mem_perms {
+       IWCH_MEM_ACCESS_LOCAL_READ = 1 << 0,
+       IWCH_MEM_ACCESS_LOCAL_WRITE = 1 << 1,
+       IWCH_MEM_ACCESS_REMOTE_READ = 1 << 2,
+       IWCH_MEM_ACCESS_REMOTE_WRITE = 1 << 3,
+       IWCH_MEM_ACCESS_ATOMICS = 1 << 4,
+       IWCH_MEM_ACCESS_BINDING = 1 << 5,
+       IWCH_MEM_ACCESS_LOCAL =
+           (IWCH_MEM_ACCESS_LOCAL_READ | IWCH_MEM_ACCESS_LOCAL_WRITE),
+       IWCH_MEM_ACCESS_REMOTE =
+           (IWCH_MEM_ACCESS_REMOTE_WRITE | IWCH_MEM_ACCESS_REMOTE_READ)
+           /* cannot go beyond 1 << 31 */
+} __attribute__ ((packed));
+
+static inline u32 iwch_convert_access(int acc)
+{
+       return (acc & IB_ACCESS_REMOTE_WRITE ? IWCH_MEM_ACCESS_REMOTE_WRITE : 0)
+           | (acc & IB_ACCESS_REMOTE_READ ? IWCH_MEM_ACCESS_REMOTE_READ : 0) |
+           (acc & IB_ACCESS_LOCAL_WRITE ? IWCH_MEM_ACCESS_LOCAL_WRITE : 0) |
+           (acc & IB_ACCESS_MW_BIND ? IWCH_MEM_ACCESS_BINDING : 0) |
+           IWCH_MEM_ACCESS_LOCAL_READ;
+}
+
+enum iwch_mmid_state {
+       IWCH_STAG_STATE_VALID,
+       IWCH_STAG_STATE_INVALID
+};
+
+enum iwch_qp_query_flags {
+       IWCH_QP_QUERY_CONTEXT_NONE = 0x0,       /* No ctx; Only attrs */
+       IWCH_QP_QUERY_CONTEXT_GET = 0x1,        /* Get ctx + attrs */
+       IWCH_QP_QUERY_CONTEXT_SUSPEND = 0x2,    /* Not Supported */
+
+       /*
+        * Quiesce QP context; Consumer
+        * will NOT replay outstanding WR
+        */
+       IWCH_QP_QUERY_CONTEXT_QUIESCE = 0x4,
+       IWCH_QP_QUERY_CONTEXT_REMOVE = 0x8,
+       IWCH_QP_QUERY_TEST_USERWRITE = 0x32     /* Test special */
+};
+
+int iwch_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
+                     struct ib_send_wr **bad_wr);
+int iwch_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,
+                     struct ib_recv_wr **bad_wr);
+int iwch_bind_mw(struct ib_qp *qp,
+                            struct ib_mw *mw,
+                            struct ib_mw_bind *mw_bind);
+int iwch_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc);
+int iwch_post_terminate(struct iwch_qp *qhp, struct respQ_msg_t *rsp_msg);
+int iwch_register_device(struct iwch_dev *dev);
+void iwch_unregister_device(struct iwch_dev *dev);
+int iwch_quiesce_qps(struct iwch_cq *chp);
+int iwch_resume_qps(struct iwch_cq *chp);
+void stop_read_rep_timer(struct iwch_qp *qhp);
+int iwch_register_mem(struct iwch_dev *rhp, struct iwch_pd *php,
+                                       struct iwch_mr *mhp,
+                                       int shift,
+                                       __be64 *page_list);
+int iwch_reregister_mem(struct iwch_dev *rhp, struct iwch_pd *php,
+                                       struct iwch_mr *mhp,
+                                       int shift,
+                                       __be64 *page_list,
+                                       int npages);
+int build_phys_page_list(struct ib_phys_buf *buffer_list,
+                                       int num_phys_buf,
+                                       u64 *iova_start,
+                                       u64 *total_size,
+                                       int *npages,
+                                       int *shift,
+                                       __be64 **page_list);
+
+
+#define IWCH_NODE_DESC "cxgb3 Chelsio Communications"
+
+#endif
diff --git a/drivers/infiniband/hw/cxgb3/iwch_qp.c b/drivers/infiniband/hw/cxgb3/iwch_qp.c
new file mode 100644 (file)
index 0000000..e066727
--- /dev/null
@@ -0,0 +1,1007 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "iwch_provider.h"
+#include "iwch.h"
+#include "iwch_cm.h"
+#include "cxio_hal.h"
+
+#define NO_SUPPORT -1
+
+static inline int iwch_build_rdma_send(union t3_wr *wqe, struct ib_send_wr *wr,
+                                      u8 * flit_cnt)
+{
+       int i;
+       u32 plen;
+
+       switch (wr->opcode) {
+       case IB_WR_SEND:
+       case IB_WR_SEND_WITH_IMM:
+               if (wr->send_flags & IB_SEND_SOLICITED)
+                       wqe->send.rdmaop = T3_SEND_WITH_SE;
+               else
+                       wqe->send.rdmaop = T3_SEND;
+               wqe->send.rem_stag = 0;
+               break;
+#if 0                          /* Not currently supported */
+       case TYPE_SEND_INVALIDATE:
+       case TYPE_SEND_INVALIDATE_IMMEDIATE:
+               wqe->send.rdmaop = T3_SEND_WITH_INV;
+               wqe->send.rem_stag = cpu_to_be32(wr->wr.rdma.rkey);
+               break;
+       case TYPE_SEND_SE_INVALIDATE:
+               wqe->send.rdmaop = T3_SEND_WITH_SE_INV;
+               wqe->send.rem_stag = cpu_to_be32(wr->wr.rdma.rkey);
+               break;
+#endif
+       default:
+               break;
+       }
+       if (wr->num_sge > T3_MAX_SGE)
+               return -EINVAL;
+       wqe->send.reserved[0] = 0;
+       wqe->send.reserved[1] = 0;
+       wqe->send.reserved[2] = 0;
+       if (wr->opcode == IB_WR_SEND_WITH_IMM) {
+               plen = 4;
+               wqe->send.sgl[0].stag = wr->imm_data;
+               wqe->send.sgl[0].len = __constant_cpu_to_be32(0);
+               wqe->send.num_sgle = __constant_cpu_to_be32(0);
+               *flit_cnt = 5;
+       } else {
+               plen = 0;
+               for (i = 0; i < wr->num_sge; i++) {
+                       if ((plen + wr->sg_list[i].length) < plen) {
+                               return -EMSGSIZE;
+                       }
+                       plen += wr->sg_list[i].length;
+                       wqe->send.sgl[i].stag =
+                           cpu_to_be32(wr->sg_list[i].lkey);
+                       wqe->send.sgl[i].len =
+                           cpu_to_be32(wr->sg_list[i].length);
+                       wqe->send.sgl[i].to = cpu_to_be64(wr->sg_list[i].addr);
+               }
+               wqe->send.num_sgle = cpu_to_be32(wr->num_sge);
+               *flit_cnt = 4 + ((wr->num_sge) << 1);
+       }
+       wqe->send.plen = cpu_to_be32(plen);
+       return 0;
+}
+
+static inline int iwch_build_rdma_write(union t3_wr *wqe, struct ib_send_wr *wr,
+                                       u8 *flit_cnt)
+{
+       int i;
+       u32 plen;
+       if (wr->num_sge > T3_MAX_SGE)
+               return -EINVAL;
+       wqe->write.rdmaop = T3_RDMA_WRITE;
+       wqe->write.reserved[0] = 0;
+       wqe->write.reserved[1] = 0;
+       wqe->write.reserved[2] = 0;
+       wqe->write.stag_sink = cpu_to_be32(wr->wr.rdma.rkey);
+       wqe->write.to_sink = cpu_to_be64(wr->wr.rdma.remote_addr);
+
+       if (wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM) {
+               plen = 4;
+               wqe->write.sgl[0].stag = wr->imm_data;
+               wqe->write.sgl[0].len = __constant_cpu_to_be32(0);
+               wqe->write.num_sgle = __constant_cpu_to_be32(0);
+               *flit_cnt = 6;
+       } else {
+               plen = 0;
+               for (i = 0; i < wr->num_sge; i++) {
+                       if ((plen + wr->sg_list[i].length) < plen) {
+                               return -EMSGSIZE;
+                       }
+                       plen += wr->sg_list[i].length;
+                       wqe->write.sgl[i].stag =
+                           cpu_to_be32(wr->sg_list[i].lkey);
+                       wqe->write.sgl[i].len =
+                           cpu_to_be32(wr->sg_list[i].length);
+                       wqe->write.sgl[i].to =
+                           cpu_to_be64(wr->sg_list[i].addr);
+               }
+               wqe->write.num_sgle = cpu_to_be32(wr->num_sge);
+               *flit_cnt = 5 + ((wr->num_sge) << 1);
+       }
+       wqe->write.plen = cpu_to_be32(plen);
+       return 0;
+}
+
+static inline int iwch_build_rdma_read(union t3_wr *wqe, struct ib_send_wr *wr,
+                                      u8 *flit_cnt)
+{
+       if (wr->num_sge > 1)
+               return -EINVAL;
+       wqe->read.rdmaop = T3_READ_REQ;
+       wqe->read.reserved[0] = 0;
+       wqe->read.reserved[1] = 0;
+       wqe->read.reserved[2] = 0;
+       wqe->read.rem_stag = cpu_to_be32(wr->wr.rdma.rkey);
+       wqe->read.rem_to = cpu_to_be64(wr->wr.rdma.remote_addr);
+       wqe->read.local_stag = cpu_to_be32(wr->sg_list[0].lkey);
+       wqe->read.local_len = cpu_to_be32(wr->sg_list[0].length);
+       wqe->read.local_to = cpu_to_be64(wr->sg_list[0].addr);
+       *flit_cnt = sizeof(struct t3_rdma_read_wr) >> 3;
+       return 0;
+}
+
+/*
+ * TBD: this is going to be moved to firmware. Missing pdid/qpid check for now.
+ */
+static inline int iwch_sgl2pbl_map(struct iwch_dev *rhp,
+                                  struct ib_sge *sg_list, u32 num_sgle,
+                                  u32 * pbl_addr, u8 * page_size)
+{
+       int i;
+       struct iwch_mr *mhp;
+       u32 offset;
+       for (i = 0; i < num_sgle; i++) {
+
+               mhp = get_mhp(rhp, (sg_list[i].lkey) >> 8);
+               if (!mhp) {
+                       PDBG("%s %d\n", __FUNCTION__, __LINE__);
+                       return -EIO;
+               }
+               if (!mhp->attr.state) {
+                       PDBG("%s %d\n", __FUNCTION__, __LINE__);
+                       return -EIO;
+               }
+               if (mhp->attr.zbva) {
+                       PDBG("%s %d\n", __FUNCTION__, __LINE__);
+                       return -EIO;
+               }
+
+               if (sg_list[i].addr < mhp->attr.va_fbo) {
+                       PDBG("%s %d\n", __FUNCTION__, __LINE__);
+                       return -EINVAL;
+               }
+               if (sg_list[i].addr + ((u64) sg_list[i].length) <
+                   sg_list[i].addr) {
+                       PDBG("%s %d\n", __FUNCTION__, __LINE__);
+                       return -EINVAL;
+               }
+               if (sg_list[i].addr + ((u64) sg_list[i].length) >
+                   mhp->attr.va_fbo + ((u64) mhp->attr.len)) {
+                       PDBG("%s %d\n", __FUNCTION__, __LINE__);
+                       return -EINVAL;
+               }
+               offset = sg_list[i].addr - mhp->attr.va_fbo;
+               offset += ((u32) mhp->attr.va_fbo) %
+                         (1UL << (12 + mhp->attr.page_size));
+               pbl_addr[i] = ((mhp->attr.pbl_addr -
+                               rhp->rdev.rnic_info.pbl_base) >> 3) +
+                             (offset >> (12 + mhp->attr.page_size));
+               page_size[i] = mhp->attr.page_size;
+       }
+       return 0;
+}
+
+static inline int iwch_build_rdma_recv(struct iwch_dev *rhp,
+                                                   union t3_wr *wqe,
+                                                   struct ib_recv_wr *wr)
+{
+       int i, err = 0;
+       u32 pbl_addr[4];
+       u8 page_size[4];
+       if (wr->num_sge > T3_MAX_SGE)
+               return -EINVAL;
+       err = iwch_sgl2pbl_map(rhp, wr->sg_list, wr->num_sge, pbl_addr,
+                              page_size);
+       if (err)
+               return err;
+       wqe->recv.pagesz[0] = page_size[0];
+       wqe->recv.pagesz[1] = page_size[1];
+       wqe->recv.pagesz[2] = page_size[2];
+       wqe->recv.pagesz[3] = page_size[3];
+       wqe->recv.num_sgle = cpu_to_be32(wr->num_sge);
+       for (i = 0; i < wr->num_sge; i++) {
+               wqe->recv.sgl[i].stag = cpu_to_be32(wr->sg_list[i].lkey);
+               wqe->recv.sgl[i].len = cpu_to_be32(wr->sg_list[i].length);
+
+               /* to in the WQE == the offset into the page */
+               wqe->recv.sgl[i].to = cpu_to_be64(((u32) wr->sg_list[i].addr) %
+                               (1UL << (12 + page_size[i])));
+
+               /* pbl_addr is the adapters address in the PBL */
+               wqe->recv.pbl_addr[i] = cpu_to_be32(pbl_addr[i]);
+       }
+       for (; i < T3_MAX_SGE; i++) {
+               wqe->recv.sgl[i].stag = 0;
+               wqe->recv.sgl[i].len = 0;
+               wqe->recv.sgl[i].to = 0;
+               wqe->recv.pbl_addr[i] = 0;
+       }
+       return 0;
+}
+
+int iwch_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
+                     struct ib_send_wr **bad_wr)
+{
+       int err = 0;
+       u8 t3_wr_flit_cnt;
+       enum t3_wr_opcode t3_wr_opcode = 0;
+       enum t3_wr_flags t3_wr_flags;
+       struct iwch_qp *qhp;
+       u32 idx;
+       union t3_wr *wqe;
+       u32 num_wrs;
+       unsigned long flag;
+       struct t3_swsq *sqp;
+
+       qhp = to_iwch_qp(ibqp);
+       spin_lock_irqsave(&qhp->lock, flag);
+       if (qhp->attr.state > IWCH_QP_STATE_RTS) {
+               spin_unlock_irqrestore(&qhp->lock, flag);
+               return -EINVAL;
+       }
+       num_wrs = Q_FREECNT(qhp->wq.sq_rptr, qhp->wq.sq_wptr,
+                 qhp->wq.sq_size_log2);
+       if (num_wrs <= 0) {
+               spin_unlock_irqrestore(&qhp->lock, flag);
+               return -ENOMEM;
+       }
+       while (wr) {
+               if (num_wrs == 0) {
+                       err = -ENOMEM;
+                       *bad_wr = wr;
+                       break;
+               }
+               idx = Q_PTR2IDX(qhp->wq.wptr, qhp->wq.size_log2);
+               wqe = (union t3_wr *) (qhp->wq.queue + idx);
+               t3_wr_flags = 0;
+               if (wr->send_flags & IB_SEND_SOLICITED)
+                       t3_wr_flags |= T3_SOLICITED_EVENT_FLAG;
+               if (wr->send_flags & IB_SEND_FENCE)
+                       t3_wr_flags |= T3_READ_FENCE_FLAG;
+               if (wr->send_flags & IB_SEND_SIGNALED)
+                       t3_wr_flags |= T3_COMPLETION_FLAG;
+               sqp = qhp->wq.sq +
+                     Q_PTR2IDX(qhp->wq.sq_wptr, qhp->wq.sq_size_log2);
+               switch (wr->opcode) {
+               case IB_WR_SEND:
+               case IB_WR_SEND_WITH_IMM:
+                       t3_wr_opcode = T3_WR_SEND;
+                       err = iwch_build_rdma_send(wqe, wr, &t3_wr_flit_cnt);
+                       break;
+               case IB_WR_RDMA_WRITE:
+               case IB_WR_RDMA_WRITE_WITH_IMM:
+                       t3_wr_opcode = T3_WR_WRITE;
+                       err = iwch_build_rdma_write(wqe, wr, &t3_wr_flit_cnt);
+                       break;
+               case IB_WR_RDMA_READ:
+                       t3_wr_opcode = T3_WR_READ;
+                       t3_wr_flags = 0; /* T3 reads are always signaled */
+                       err = iwch_build_rdma_read(wqe, wr, &t3_wr_flit_cnt);
+                       if (err)
+                               break;
+                       sqp->read_len = wqe->read.local_len;
+                       if (!qhp->wq.oldest_read)
+                               qhp->wq.oldest_read = sqp;
+                       break;
+               default:
+                       PDBG("%s post of type=%d TBD!\n", __FUNCTION__,
+                            wr->opcode);
+                       err = -EINVAL;
+               }
+               if (err) {
+                       *bad_wr = wr;
+                       break;
+               }
+               wqe->send.wrid.id0.hi = qhp->wq.sq_wptr;
+               sqp->wr_id = wr->wr_id;
+               sqp->opcode = wr2opcode(t3_wr_opcode);
+               sqp->sq_wptr = qhp->wq.sq_wptr;
+               sqp->complete = 0;
+               sqp->signaled = (wr->send_flags & IB_SEND_SIGNALED);
+
+               build_fw_riwrh((void *) wqe, t3_wr_opcode, t3_wr_flags,
+                              Q_GENBIT(qhp->wq.wptr, qhp->wq.size_log2),
+                              0, t3_wr_flit_cnt);
+               PDBG("%s cookie 0x%llx wq idx 0x%x swsq idx %ld opcode %d\n",
+                    __FUNCTION__, (unsigned long long) wr->wr_id, idx,
+                    Q_PTR2IDX(qhp->wq.sq_wptr, qhp->wq.sq_size_log2),
+                    sqp->opcode);
+               wr = wr->next;
+               num_wrs--;
+               ++(qhp->wq.wptr);
+               ++(qhp->wq.sq_wptr);
+       }
+       spin_unlock_irqrestore(&qhp->lock, flag);
+       ring_doorbell(qhp->wq.doorbell, qhp->wq.qpid);
+       return err;
+}
+
+int iwch_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,
+                     struct ib_recv_wr **bad_wr)
+{
+       int err = 0;
+       struct iwch_qp *qhp;
+       u32 idx;
+       union t3_wr *wqe;
+       u32 num_wrs;
+       unsigned long flag;
+
+       qhp = to_iwch_qp(ibqp);
+       spin_lock_irqsave(&qhp->lock, flag);
+       if (qhp->attr.state > IWCH_QP_STATE_RTS) {
+               spin_unlock_irqrestore(&qhp->lock, flag);
+               return -EINVAL;
+       }
+       num_wrs = Q_FREECNT(qhp->wq.rq_rptr, qhp->wq.rq_wptr,
+                           qhp->wq.rq_size_log2) - 1;
+       if (!wr) {
+               spin_unlock_irqrestore(&qhp->lock, flag);
+               return -EINVAL;
+       }
+       while (wr) {
+               idx = Q_PTR2IDX(qhp->wq.wptr, qhp->wq.size_log2);
+               wqe = (union t3_wr *) (qhp->wq.queue + idx);
+               if (num_wrs)
+                       err = iwch_build_rdma_recv(qhp->rhp, wqe, wr);
+               else
+                       err = -ENOMEM;
+               if (err) {
+                       *bad_wr = wr;
+                       break;
+               }
+               qhp->wq.rq[Q_PTR2IDX(qhp->wq.rq_wptr, qhp->wq.rq_size_log2)] =
+                       wr->wr_id;
+               build_fw_riwrh((void *) wqe, T3_WR_RCV, T3_COMPLETION_FLAG,
+                              Q_GENBIT(qhp->wq.wptr, qhp->wq.size_log2),
+                              0, sizeof(struct t3_receive_wr) >> 3);
+               PDBG("%s cookie 0x%llx idx 0x%x rq_wptr 0x%x rw_rptr 0x%x "
+                    "wqe %p \n", __FUNCTION__, (unsigned long long) wr->wr_id,
+                    idx, qhp->wq.rq_wptr, qhp->wq.rq_rptr, wqe);
+               ++(qhp->wq.rq_wptr);
+               ++(qhp->wq.wptr);
+               wr = wr->next;
+               num_wrs--;
+       }
+       spin_unlock_irqrestore(&qhp->lock, flag);
+       ring_doorbell(qhp->wq.doorbell, qhp->wq.qpid);
+       return err;
+}
+
+int iwch_bind_mw(struct ib_qp *qp,
+                            struct ib_mw *mw,
+                            struct ib_mw_bind *mw_bind)
+{
+       struct iwch_dev *rhp;
+       struct iwch_mw *mhp;
+       struct iwch_qp *qhp;
+       union t3_wr *wqe;
+       u32 pbl_addr;
+       u8 page_size;
+       u32 num_wrs;
+       unsigned long flag;
+       struct ib_sge sgl;
+       int err=0;
+       enum t3_wr_flags t3_wr_flags;
+       u32 idx;
+       struct t3_swsq *sqp;
+
+       qhp = to_iwch_qp(qp);
+       mhp = to_iwch_mw(mw);
+       rhp = qhp->rhp;
+
+       spin_lock_irqsave(&qhp->lock, flag);
+       if (qhp->attr.state > IWCH_QP_STATE_RTS) {
+               spin_unlock_irqrestore(&qhp->lock, flag);
+               return -EINVAL;
+       }
+       num_wrs = Q_FREECNT(qhp->wq.sq_rptr, qhp->wq.sq_wptr,
+                           qhp->wq.sq_size_log2);
+       if ((num_wrs) <= 0) {
+               spin_unlock_irqrestore(&qhp->lock, flag);
+               return -ENOMEM;
+       }
+       idx = Q_PTR2IDX(qhp->wq.wptr, qhp->wq.size_log2);
+       PDBG("%s: idx 0x%0x, mw 0x%p, mw_bind 0x%p\n", __FUNCTION__, idx,
+            mw, mw_bind);
+       wqe = (union t3_wr *) (qhp->wq.queue + idx);
+
+       t3_wr_flags = 0;
+       if (mw_bind->send_flags & IB_SEND_SIGNALED)
+               t3_wr_flags = T3_COMPLETION_FLAG;
+
+       sgl.addr = mw_bind->addr;
+       sgl.lkey = mw_bind->mr->lkey;
+       sgl.length = mw_bind->length;
+       wqe->bind.reserved = 0;
+       wqe->bind.type = T3_VA_BASED_TO;
+
+       /* TBD: check perms */
+       wqe->bind.perms = iwch_convert_access(mw_bind->mw_access_flags);
+       wqe->bind.mr_stag = cpu_to_be32(mw_bind->mr->lkey);
+       wqe->bind.mw_stag = cpu_to_be32(mw->rkey);
+       wqe->bind.mw_len = cpu_to_be32(mw_bind->length);
+       wqe->bind.mw_va = cpu_to_be64(mw_bind->addr);
+       err = iwch_sgl2pbl_map(rhp, &sgl, 1, &pbl_addr, &page_size);
+       if (err) {
+               spin_unlock_irqrestore(&qhp->lock, flag);
+               return err;
+       }
+       wqe->send.wrid.id0.hi = qhp->wq.sq_wptr;
+       sqp = qhp->wq.sq + Q_PTR2IDX(qhp->wq.sq_wptr, qhp->wq.sq_size_log2);
+       sqp->wr_id = mw_bind->wr_id;
+       sqp->opcode = T3_BIND_MW;
+       sqp->sq_wptr = qhp->wq.sq_wptr;
+       sqp->complete = 0;
+       sqp->signaled = (mw_bind->send_flags & IB_SEND_SIGNALED);
+       wqe->bind.mr_pbl_addr = cpu_to_be32(pbl_addr);
+       wqe->bind.mr_pagesz = page_size;
+       wqe->flit[T3_SQ_COOKIE_FLIT] = mw_bind->wr_id;
+       build_fw_riwrh((void *)wqe, T3_WR_BIND, t3_wr_flags,
+                      Q_GENBIT(qhp->wq.wptr, qhp->wq.size_log2), 0,
+                               sizeof(struct t3_bind_mw_wr) >> 3);
+       ++(qhp->wq.wptr);
+       ++(qhp->wq.sq_wptr);
+       spin_unlock_irqrestore(&qhp->lock, flag);
+
+       ring_doorbell(qhp->wq.doorbell, qhp->wq.qpid);
+
+       return err;
+}
+
+static inline void build_term_codes(int t3err, u8 *layer_type, u8 *ecode,
+                                   int tagged)
+{
+       switch (t3err) {
+       case TPT_ERR_STAG:
+               if (tagged == 1) {
+                       *layer_type = LAYER_DDP|DDP_TAGGED_ERR;
+                       *ecode = DDPT_INV_STAG;
+               } else if (tagged == 2) {
+                       *layer_type = LAYER_RDMAP|RDMAP_REMOTE_PROT;
+                       *ecode = RDMAP_INV_STAG;
+               }
+               break;
+       case TPT_ERR_PDID:
+       case TPT_ERR_QPID:
+       case TPT_ERR_ACCESS:
+               if (tagged == 1) {
+                       *layer_type = LAYER_DDP|DDP_TAGGED_ERR;
+                       *ecode = DDPT_STAG_NOT_ASSOC;
+               } else if (tagged == 2) {
+                       *layer_type = LAYER_RDMAP|RDMAP_REMOTE_PROT;
+                       *ecode = RDMAP_STAG_NOT_ASSOC;
+               }
+               break;
+       case TPT_ERR_WRAP:
+               *layer_type = LAYER_RDMAP|RDMAP_REMOTE_PROT;
+               *ecode = RDMAP_TO_WRAP;
+               break;
+       case TPT_ERR_BOUND:
+               if (tagged == 1) {
+                       *layer_type = LAYER_DDP|DDP_TAGGED_ERR;
+                       *ecode = DDPT_BASE_BOUNDS;
+               } else if (tagged == 2) {
+                       *layer_type = LAYER_RDMAP|RDMAP_REMOTE_PROT;
+                       *ecode = RDMAP_BASE_BOUNDS;
+               } else {
+                       *layer_type = LAYER_DDP|DDP_UNTAGGED_ERR;
+                       *ecode = DDPU_MSG_TOOBIG;
+               }
+               break;
+       case TPT_ERR_INVALIDATE_SHARED_MR:
+       case TPT_ERR_INVALIDATE_MR_WITH_MW_BOUND:
+               *layer_type = LAYER_RDMAP|RDMAP_REMOTE_OP;
+               *ecode = RDMAP_CANT_INV_STAG;
+               break;
+       case TPT_ERR_ECC:
+       case TPT_ERR_ECC_PSTAG:
+       case TPT_ERR_INTERNAL_ERR:
+               *layer_type = LAYER_RDMAP|RDMAP_LOCAL_CATA;
+               *ecode = 0;
+               break;
+       case TPT_ERR_OUT_OF_RQE:
+               *layer_type = LAYER_DDP|DDP_UNTAGGED_ERR;
+               *ecode = DDPU_INV_MSN_NOBUF;
+               break;
+       case TPT_ERR_PBL_ADDR_BOUND:
+               *layer_type = LAYER_DDP|DDP_TAGGED_ERR;
+               *ecode = DDPT_BASE_BOUNDS;
+               break;
+       case TPT_ERR_CRC:
+               *layer_type = LAYER_MPA|DDP_LLP;
+               *ecode = MPA_CRC_ERR;
+               break;
+       case TPT_ERR_MARKER:
+               *layer_type = LAYER_MPA|DDP_LLP;
+               *ecode = MPA_MARKER_ERR;
+               break;
+       case TPT_ERR_PDU_LEN_ERR:
+               *layer_type = LAYER_DDP|DDP_UNTAGGED_ERR;
+               *ecode = DDPU_MSG_TOOBIG;
+               break;
+       case TPT_ERR_DDP_VERSION:
+               if (tagged) {
+                       *layer_type = LAYER_DDP|DDP_TAGGED_ERR;
+                       *ecode = DDPT_INV_VERS;
+               } else {
+                       *layer_type = LAYER_DDP|DDP_UNTAGGED_ERR;
+                       *ecode = DDPU_INV_VERS;
+               }
+               break;
+       case TPT_ERR_RDMA_VERSION:
+               *layer_type = LAYER_RDMAP|RDMAP_REMOTE_OP;
+               *ecode = RDMAP_INV_VERS;
+               break;
+       case TPT_ERR_OPCODE:
+               *layer_type = LAYER_RDMAP|RDMAP_REMOTE_OP;
+               *ecode = RDMAP_INV_OPCODE;
+               break;
+       case TPT_ERR_DDP_QUEUE_NUM:
+               *layer_type = LAYER_DDP|DDP_UNTAGGED_ERR;
+               *ecode = DDPU_INV_QN;
+               break;
+       case TPT_ERR_MSN:
+       case TPT_ERR_MSN_GAP:
+       case TPT_ERR_MSN_RANGE:
+       case TPT_ERR_IRD_OVERFLOW:
+               *layer_type = LAYER_DDP|DDP_UNTAGGED_ERR;
+               *ecode = DDPU_INV_MSN_RANGE;
+               break;
+       case TPT_ERR_TBIT:
+               *layer_type = LAYER_DDP|DDP_LOCAL_CATA;
+               *ecode = 0;
+               break;
+       case TPT_ERR_MO:
+               *layer_type = LAYER_DDP|DDP_UNTAGGED_ERR;
+               *ecode = DDPU_INV_MO;
+               break;
+       default:
+               *layer_type = LAYER_RDMAP|DDP_LOCAL_CATA;
+               *ecode = 0;
+               break;
+       }
+}
+
+/*
+ * This posts a TERMINATE with layer=RDMA, type=catastrophic.
+ */
+int iwch_post_terminate(struct iwch_qp *qhp, struct respQ_msg_t *rsp_msg)
+{
+       union t3_wr *wqe;
+       struct terminate_message *term;
+       int status;
+       int tagged = 0;
+       struct sk_buff *skb;
+
+       PDBG("%s %d\n", __FUNCTION__, __LINE__);
+       skb = alloc_skb(40, GFP_ATOMIC);
+       if (!skb) {
+               printk(KERN_ERR "%s cannot send TERMINATE!\n", __FUNCTION__);
+               return -ENOMEM;
+       }
+       wqe = (union t3_wr *)skb_put(skb, 40);
+       memset(wqe, 0, 40);
+       wqe->send.rdmaop = T3_TERMINATE;
+
+       /* immediate data length */
+       wqe->send.plen = htonl(4);
+
+       /* immediate data starts here. */
+       term = (struct terminate_message *)wqe->send.sgl;
+       if (rsp_msg) {
+               status = CQE_STATUS(rsp_msg->cqe);
+               if (CQE_OPCODE(rsp_msg->cqe) == T3_RDMA_WRITE)
+                       tagged = 1;
+               if ((CQE_OPCODE(rsp_msg->cqe) == T3_READ_REQ) ||
+                   (CQE_OPCODE(rsp_msg->cqe) == T3_READ_RESP))
+                       tagged = 2;
+       } else {
+               status = TPT_ERR_INTERNAL_ERR;
+       }
+       build_term_codes(status, &term->layer_etype, &term->ecode, tagged);
+       build_fw_riwrh((void *)wqe, T3_WR_SEND,
+                      T3_COMPLETION_FLAG | T3_NOTIFY_FLAG, 1,
+                      qhp->ep->hwtid, 5);
+       skb->priority = CPL_PRIORITY_DATA;
+       return cxgb3_ofld_send(qhp->rhp->rdev.t3cdev_p, skb);
+}
+
+/*
+ * Assumes qhp lock is held.
+ */
+static void __flush_qp(struct iwch_qp *qhp, unsigned long *flag)
+{
+       struct iwch_cq *rchp, *schp;
+       int count;
+
+       rchp = get_chp(qhp->rhp, qhp->attr.rcq);
+       schp = get_chp(qhp->rhp, qhp->attr.scq);
+
+       PDBG("%s qhp %p rchp %p schp %p\n", __FUNCTION__, qhp, rchp, schp);
+       /* take a ref on the qhp since we must release the lock */
+       atomic_inc(&qhp->refcnt);
+       spin_unlock_irqrestore(&qhp->lock, *flag);
+
+       /* locking heirarchy: cq lock first, then qp lock. */
+       spin_lock_irqsave(&rchp->lock, *flag);
+       spin_lock(&qhp->lock);
+       cxio_flush_hw_cq(&rchp->cq);
+       cxio_count_rcqes(&rchp->cq, &qhp->wq, &count);
+       cxio_flush_rq(&qhp->wq, &rchp->cq, count);
+       spin_unlock(&qhp->lock);
+       spin_unlock_irqrestore(&rchp->lock, *flag);
+
+       /* locking heirarchy: cq lock first, then qp lock. */
+       spin_lock_irqsave(&schp->lock, *flag);
+       spin_lock(&qhp->lock);
+       cxio_flush_hw_cq(&schp->cq);
+       cxio_count_scqes(&schp->cq, &qhp->wq, &count);
+       cxio_flush_sq(&qhp->wq, &schp->cq, count);
+       spin_unlock(&qhp->lock);
+       spin_unlock_irqrestore(&schp->lock, *flag);
+
+       /* deref */
+       if (atomic_dec_and_test(&qhp->refcnt))
+               wake_up(&qhp->wait);
+
+       spin_lock_irqsave(&qhp->lock, *flag);
+}
+
+static inline void flush_qp(struct iwch_qp *qhp, unsigned long *flag)
+{
+       if (t3b_device(qhp->rhp))
+               cxio_set_wq_in_error(&qhp->wq);
+       else
+               __flush_qp(qhp, flag);
+}
+
+
+/*
+ * Return non zero if at least one RECV was pre-posted.
+ */
+static inline int rqes_posted(struct iwch_qp *qhp)
+{
+       return fw_riwrh_opcode((struct fw_riwrh *)qhp->wq.queue) == T3_WR_RCV;
+}
+
+static int rdma_init(struct iwch_dev *rhp, struct iwch_qp *qhp,
+                               enum iwch_qp_attr_mask mask,
+                               struct iwch_qp_attributes *attrs)
+{
+       struct t3_rdma_init_attr init_attr;
+       int ret;
+
+       init_attr.tid = qhp->ep->hwtid;
+       init_attr.qpid = qhp->wq.qpid;
+       init_attr.pdid = qhp->attr.pd;
+       init_attr.scqid = qhp->attr.scq;
+       init_attr.rcqid = qhp->attr.rcq;
+       init_attr.rq_addr = qhp->wq.rq_addr;
+       init_attr.rq_size = 1 << qhp->wq.rq_size_log2;
+       init_attr.mpaattrs = uP_RI_MPA_IETF_ENABLE |
+               qhp->attr.mpa_attr.recv_marker_enabled |
+               (qhp->attr.mpa_attr.xmit_marker_enabled << 1) |
+               (qhp->attr.mpa_attr.crc_enabled << 2);
+
+       /*
+        * XXX - The IWCM doesn't quite handle getting these
+        * attrs set before going into RTS.  For now, just turn
+        * them on always...
+        */
+#if 0
+       init_attr.qpcaps = qhp->attr.enableRdmaRead |
+               (qhp->attr.enableRdmaWrite << 1) |
+               (qhp->attr.enableBind << 2) |
+               (qhp->attr.enable_stag0_fastreg << 3) |
+               (qhp->attr.enable_stag0_fastreg << 4);
+#else
+       init_attr.qpcaps = 0x1f;
+#endif
+       init_attr.tcp_emss = qhp->ep->emss;
+       init_attr.ord = qhp->attr.max_ord;
+       init_attr.ird = qhp->attr.max_ird;
+       init_attr.qp_dma_addr = qhp->wq.dma_addr;
+       init_attr.qp_dma_size = (1UL << qhp->wq.size_log2);
+       init_attr.flags = rqes_posted(qhp) ? RECVS_POSTED : 0;
+       PDBG("%s init_attr.rq_addr 0x%x init_attr.rq_size = %d "
+            "flags 0x%x qpcaps 0x%x\n", __FUNCTION__,
+            init_attr.rq_addr, init_attr.rq_size,
+            init_attr.flags, init_attr.qpcaps);
+       ret = cxio_rdma_init(&rhp->rdev, &init_attr);
+       PDBG("%s ret %d\n", __FUNCTION__, ret);
+       return ret;
+}
+
+int iwch_modify_qp(struct iwch_dev *rhp, struct iwch_qp *qhp,
+                               enum iwch_qp_attr_mask mask,
+                               struct iwch_qp_attributes *attrs,
+                               int internal)
+{
+       int ret = 0;
+       struct iwch_qp_attributes newattr = qhp->attr;
+       unsigned long flag;
+       int disconnect = 0;
+       int terminate = 0;
+       int abort = 0;
+       int free = 0;
+       struct iwch_ep *ep = NULL;
+
+       PDBG("%s qhp %p qpid 0x%x ep %p state %d -> %d\n", __FUNCTION__,
+            qhp, qhp->wq.qpid, qhp->ep, qhp->attr.state,
+            (mask & IWCH_QP_ATTR_NEXT_STATE) ? attrs->next_state : -1);
+
+       spin_lock_irqsave(&qhp->lock, flag);
+
+       /* Process attr changes if in IDLE */
+       if (mask & IWCH_QP_ATTR_VALID_MODIFY) {
+               if (qhp->attr.state != IWCH_QP_STATE_IDLE) {
+                       ret = -EIO;
+                       goto out;
+               }
+               if (mask & IWCH_QP_ATTR_ENABLE_RDMA_READ)
+                       newattr.enable_rdma_read = attrs->enable_rdma_read;
+               if (mask & IWCH_QP_ATTR_ENABLE_RDMA_WRITE)
+                       newattr.enable_rdma_write = attrs->enable_rdma_write;
+               if (mask & IWCH_QP_ATTR_ENABLE_RDMA_BIND)
+                       newattr.enable_bind = attrs->enable_bind;
+               if (mask & IWCH_QP_ATTR_MAX_ORD) {
+                       if (attrs->max_ord >
+                           rhp->attr.max_rdma_read_qp_depth) {
+                               ret = -EINVAL;
+                               goto out;
+                       }
+                       newattr.max_ord = attrs->max_ord;
+               }
+               if (mask & IWCH_QP_ATTR_MAX_IRD) {
+                       if (attrs->max_ird >
+                           rhp->attr.max_rdma_reads_per_qp) {
+                               ret = -EINVAL;
+                               goto out;
+                       }
+                       newattr.max_ird = attrs->max_ird;
+               }
+               qhp->attr = newattr;
+       }
+
+       if (!(mask & IWCH_QP_ATTR_NEXT_STATE))
+               goto out;
+       if (qhp->attr.state == attrs->next_state)
+               goto out;
+
+       switch (qhp->attr.state) {
+       case IWCH_QP_STATE_IDLE:
+               switch (attrs->next_state) {
+               case IWCH_QP_STATE_RTS:
+                       if (!(mask & IWCH_QP_ATTR_LLP_STREAM_HANDLE)) {
+                               ret = -EINVAL;
+                               goto out;
+                       }
+                       if (!(mask & IWCH_QP_ATTR_MPA_ATTR)) {
+                               ret = -EINVAL;
+                               goto out;
+                       }
+                       qhp->attr.mpa_attr = attrs->mpa_attr;
+                       qhp->attr.llp_stream_handle = attrs->llp_stream_handle;
+                       qhp->ep = qhp->attr.llp_stream_handle;
+                       qhp->attr.state = IWCH_QP_STATE_RTS;
+
+                       /*
+                        * Ref the endpoint here and deref when we
+                        * disassociate the endpoint from the QP.  This
+                        * happens in CLOSING->IDLE transition or *->ERROR
+                        * transition.
+                        */
+                       get_ep(&qhp->ep->com);
+                       spin_unlock_irqrestore(&qhp->lock, flag);
+                       ret = rdma_init(rhp, qhp, mask, attrs);
+                       spin_lock_irqsave(&qhp->lock, flag);
+                       if (ret)
+                               goto err;
+                       break;
+               case IWCH_QP_STATE_ERROR:
+                       qhp->attr.state = IWCH_QP_STATE_ERROR;
+                       flush_qp(qhp, &flag);
+                       break;
+               default:
+                       ret = -EINVAL;
+                       goto out;
+               }
+               break;
+       case IWCH_QP_STATE_RTS:
+               switch (attrs->next_state) {
+               case IWCH_QP_STATE_CLOSING:
+                       BUG_ON(atomic_read(&qhp->ep->com.kref.refcount) < 2);
+                       qhp->attr.state = IWCH_QP_STATE_CLOSING;
+                       if (!internal) {
+                               abort=0;
+                               disconnect = 1;
+                               ep = qhp->ep;
+                       }
+                       break;
+               case IWCH_QP_STATE_TERMINATE:
+                       qhp->attr.state = IWCH_QP_STATE_TERMINATE;
+                       if (!internal)
+                               terminate = 1;
+                       break;
+               case IWCH_QP_STATE_ERROR:
+                       qhp->attr.state = IWCH_QP_STATE_ERROR;
+                       if (!internal) {
+                               abort=1;
+                               disconnect = 1;
+                               ep = qhp->ep;
+                       }
+                       goto err;
+                       break;
+               default:
+                       ret = -EINVAL;
+                       goto out;
+               }
+               break;
+       case IWCH_QP_STATE_CLOSING:
+               if (!internal) {
+                       ret = -EINVAL;
+                       goto out;
+               }
+               switch (attrs->next_state) {
+                       case IWCH_QP_STATE_IDLE:
+                               qhp->attr.state = IWCH_QP_STATE_IDLE;
+                               qhp->attr.llp_stream_handle = NULL;
+                               put_ep(&qhp->ep->com);
+                               qhp->ep = NULL;
+                               wake_up(&qhp->wait);
+                               break;
+                       case IWCH_QP_STATE_ERROR:
+                               goto err;
+                       default:
+                               ret = -EINVAL;
+                               goto err;
+               }
+               break;
+       case IWCH_QP_STATE_ERROR:
+               if (attrs->next_state != IWCH_QP_STATE_IDLE) {
+                       ret = -EINVAL;
+                       goto out;
+               }
+
+               if (!Q_EMPTY(qhp->wq.sq_rptr, qhp->wq.sq_wptr) ||
+                   !Q_EMPTY(qhp->wq.rq_rptr, qhp->wq.rq_wptr)) {
+                       ret = -EINVAL;
+                       goto out;
+               }
+               qhp->attr.state = IWCH_QP_STATE_IDLE;
+               memset(&qhp->attr, 0, sizeof(qhp->attr));
+               break;
+       case IWCH_QP_STATE_TERMINATE:
+               if (!internal) {
+                       ret = -EINVAL;
+                       goto out;
+               }
+               goto err;
+               break;
+       default:
+               printk(KERN_ERR "%s in a bad state %d\n",
+                      __FUNCTION__, qhp->attr.state);
+               ret = -EINVAL;
+               goto err;
+               break;
+       }
+       goto out;
+err:
+       PDBG("%s disassociating ep %p qpid 0x%x\n", __FUNCTION__, qhp->ep,
+            qhp->wq.qpid);
+
+       /* disassociate the LLP connection */
+       qhp->attr.llp_stream_handle = NULL;
+       ep = qhp->ep;
+       qhp->ep = NULL;
+       qhp->attr.state = IWCH_QP_STATE_ERROR;
+       free=1;
+       wake_up(&qhp->wait);
+       BUG_ON(!ep);
+       flush_qp(qhp, &flag);
+out:
+       spin_unlock_irqrestore(&qhp->lock, flag);
+
+       if (terminate)
+               iwch_post_terminate(qhp, NULL);
+
+       /*
+        * If disconnect is 1, then we need to initiate a disconnect
+        * on the EP.  This can be a normal close (RTS->CLOSING) or
+        * an abnormal close (RTS/CLOSING->ERROR).
+        */
+       if (disconnect)
+               iwch_ep_disconnect(ep, abort, GFP_KERNEL);
+
+       /*
+        * If free is 1, then we've disassociated the EP from the QP
+        * and we need to dereference the EP.
+        */
+       if (free)
+               put_ep(&ep->com);
+
+       PDBG("%s exit state %d\n", __FUNCTION__, qhp->attr.state);
+       return ret;
+}
+
+static int quiesce_qp(struct iwch_qp *qhp)
+{
+       spin_lock_irq(&qhp->lock);
+       iwch_quiesce_tid(qhp->ep);
+       qhp->flags |= QP_QUIESCED;
+       spin_unlock_irq(&qhp->lock);
+       return 0;
+}
+
+static int resume_qp(struct iwch_qp *qhp)
+{
+       spin_lock_irq(&qhp->lock);
+       iwch_resume_tid(qhp->ep);
+       qhp->flags &= ~QP_QUIESCED;
+       spin_unlock_irq(&qhp->lock);
+       return 0;
+}
+
+int iwch_quiesce_qps(struct iwch_cq *chp)
+{
+       int i;
+       struct iwch_qp *qhp;
+
+       for (i=0; i < T3_MAX_NUM_QP; i++) {
+               qhp = get_qhp(chp->rhp, i);
+               if (!qhp)
+                       continue;
+               if ((qhp->attr.rcq == chp->cq.cqid) && !qp_quiesced(qhp)) {
+                       quiesce_qp(qhp);
+                       continue;
+               }
+               if ((qhp->attr.scq == chp->cq.cqid) && !qp_quiesced(qhp))
+                       quiesce_qp(qhp);
+       }
+       return 0;
+}
+
+int iwch_resume_qps(struct iwch_cq *chp)
+{
+       int i;
+       struct iwch_qp *qhp;
+
+       for (i=0; i < T3_MAX_NUM_QP; i++) {
+               qhp = get_qhp(chp->rhp, i);
+               if (!qhp)
+                       continue;
+               if ((qhp->attr.rcq == chp->cq.cqid) && qp_quiesced(qhp)) {
+                       resume_qp(qhp);
+                       continue;
+               }
+               if ((qhp->attr.scq == chp->cq.cqid) && qp_quiesced(qhp))
+                       resume_qp(qhp);
+       }
+       return 0;
+}
diff --git a/drivers/infiniband/hw/cxgb3/iwch_user.h b/drivers/infiniband/hw/cxgb3/iwch_user.h
new file mode 100644 (file)
index 0000000..c4e7fbe
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2006 Chelsio, Inc. All rights reserved.
+ * Copyright (c) 2006 Open Grid Computing, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef __IWCH_USER_H__
+#define __IWCH_USER_H__
+
+#define IWCH_UVERBS_ABI_VERSION        1
+
+/*
+ * Make sure that all structs defined in this file remain laid out so
+ * that they pack the same way on 32-bit and 64-bit architectures (to
+ * avoid incompatibility between 32-bit userspace and 64-bit kernels).
+ * In particular do not use pointer types -- pass pointers in __u64
+ * instead.
+ */
+struct iwch_create_cq_req {
+       __u64 user_rptr_addr;
+};
+
+struct iwch_create_cq_resp {
+       __u64 key;
+       __u32 cqid;
+       __u32 size_log2;
+};
+
+struct iwch_create_qp_resp {
+       __u64 key;
+       __u64 db_key;
+       __u32 qpid;
+       __u32 size_log2;
+       __u32 sq_size_log2;
+       __u32 rq_size_log2;
+};
+
+struct iwch_reg_user_mr_resp {
+       __u32 pbl_addr;
+};
+#endif
diff --git a/drivers/infiniband/hw/cxgb3/tcb.h b/drivers/infiniband/hw/cxgb3/tcb.h
new file mode 100644 (file)
index 0000000..c702dc1
--- /dev/null
@@ -0,0 +1,632 @@
+/*
+ * Copyright (c) 2007 Chelsio, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef _TCB_DEFS_H
+#define _TCB_DEFS_H
+
+#define W_TCB_T_STATE    0
+#define S_TCB_T_STATE    0
+#define M_TCB_T_STATE    0xfULL
+#define V_TCB_T_STATE(x) ((x) << S_TCB_T_STATE)
+
+#define W_TCB_TIMER    0
+#define S_TCB_TIMER    4
+#define M_TCB_TIMER    0x1ULL
+#define V_TCB_TIMER(x) ((x) << S_TCB_TIMER)
+
+#define W_TCB_DACK_TIMER    0
+#define S_TCB_DACK_TIMER    5
+#define M_TCB_DACK_TIMER    0x1ULL
+#define V_TCB_DACK_TIMER(x) ((x) << S_TCB_DACK_TIMER)
+
+#define W_TCB_DEL_FLAG    0
+#define S_TCB_DEL_FLAG    6
+#define M_TCB_DEL_FLAG    0x1ULL
+#define V_TCB_DEL_FLAG(x) ((x) << S_TCB_DEL_FLAG)
+
+#define W_TCB_L2T_IX    0
+#define S_TCB_L2T_IX    7
+#define M_TCB_L2T_IX    0x7ffULL
+#define V_TCB_L2T_IX(x) ((x) << S_TCB_L2T_IX)
+
+#define W_TCB_SMAC_SEL    0
+#define S_TCB_SMAC_SEL    18
+#define M_TCB_SMAC_SEL    0x3ULL
+#define V_TCB_SMAC_SEL(x) ((x) << S_TCB_SMAC_SEL)
+
+#define W_TCB_TOS    0
+#define S_TCB_TOS    20
+#define M_TCB_TOS    0x3fULL
+#define V_TCB_TOS(x) ((x) << S_TCB_TOS)
+
+#define W_TCB_MAX_RT    0
+#define S_TCB_MAX_RT    26
+#define M_TCB_MAX_RT    0xfULL
+#define V_TCB_MAX_RT(x) ((x) << S_TCB_MAX_RT)
+
+#define W_TCB_T_RXTSHIFT    0
+#define S_TCB_T_RXTSHIFT    30
+#define M_TCB_T_RXTSHIFT    0xfULL
+#define V_TCB_T_RXTSHIFT(x) ((x) << S_TCB_T_RXTSHIFT)
+
+#define W_TCB_T_DUPACKS    1
+#define S_TCB_T_DUPACKS    2
+#define M_TCB_T_DUPACKS    0xfULL
+#define V_TCB_T_DUPACKS(x) ((x) << S_TCB_T_DUPACKS)
+
+#define W_TCB_T_MAXSEG    1
+#define S_TCB_T_MAXSEG    6
+#define M_TCB_T_MAXSEG    0xfULL
+#define V_TCB_T_MAXSEG(x) ((x) << S_TCB_T_MAXSEG)
+
+#define W_TCB_T_FLAGS1    1
+#define S_TCB_T_FLAGS1    10
+#define M_TCB_T_FLAGS1    0xffffffffULL
+#define V_TCB_T_FLAGS1(x) ((x) << S_TCB_T_FLAGS1)
+
+#define W_TCB_T_MIGRATION    1
+#define S_TCB_T_MIGRATION    20
+#define M_TCB_T_MIGRATION    0x1ULL
+#define V_TCB_T_MIGRATION(x) ((x) << S_TCB_T_MIGRATION)
+
+#define W_TCB_T_FLAGS2    2
+#define S_TCB_T_FLAGS2    10
+#define M_TCB_T_FLAGS2    0x7fULL
+#define V_TCB_T_FLAGS2(x) ((x) << S_TCB_T_FLAGS2)
+
+#define W_TCB_SND_SCALE    2
+#define S_TCB_SND_SCALE    17
+#define M_TCB_SND_SCALE    0xfULL
+#define V_TCB_SND_SCALE(x) ((x) << S_TCB_SND_SCALE)
+
+#define W_TCB_RCV_SCALE    2
+#define S_TCB_RCV_SCALE    21
+#define M_TCB_RCV_SCALE    0xfULL
+#define V_TCB_RCV_SCALE(x) ((x) << S_TCB_RCV_SCALE)
+
+#define W_TCB_SND_UNA_RAW    2
+#define S_TCB_SND_UNA_RAW    25
+#define M_TCB_SND_UNA_RAW    0x7ffffffULL
+#define V_TCB_SND_UNA_RAW(x) ((x) << S_TCB_SND_UNA_RAW)
+
+#define W_TCB_SND_NXT_RAW    3
+#define S_TCB_SND_NXT_RAW    20
+#define M_TCB_SND_NXT_RAW    0x7ffffffULL
+#define V_TCB_SND_NXT_RAW(x) ((x) << S_TCB_SND_NXT_RAW)
+
+#define W_TCB_RCV_NXT    4
+#define S_TCB_RCV_NXT    15
+#define M_TCB_RCV_NXT    0xffffffffULL
+#define V_TCB_RCV_NXT(x) ((x) << S_TCB_RCV_NXT)
+
+#define W_TCB_RCV_ADV    5
+#define S_TCB_RCV_ADV    15
+#define M_TCB_RCV_ADV    0xffffULL
+#define V_TCB_RCV_ADV(x) ((x) << S_TCB_RCV_ADV)
+
+#define W_TCB_SND_MAX_RAW    5
+#define S_TCB_SND_MAX_RAW    31
+#define M_TCB_SND_MAX_RAW    0x7ffffffULL
+#define V_TCB_SND_MAX_RAW(x) ((x) << S_TCB_SND_MAX_RAW)
+
+#define W_TCB_SND_CWND    6
+#define S_TCB_SND_CWND    26
+#define M_TCB_SND_CWND    0x7ffffffULL
+#define V_TCB_SND_CWND(x) ((x) << S_TCB_SND_CWND)
+
+#define W_TCB_SND_SSTHRESH    7
+#define S_TCB_SND_SSTHRESH    21
+#define M_TCB_SND_SSTHRESH    0x7ffffffULL
+#define V_TCB_SND_SSTHRESH(x) ((x) << S_TCB_SND_SSTHRESH)
+
+#define W_TCB_T_RTT_TS_RECENT_AGE    8
+#define S_TCB_T_RTT_TS_RECENT_AGE    16
+#define M_TCB_T_RTT_TS_RECENT_AGE    0xffffffffULL
+#define V_TCB_T_RTT_TS_RECENT_AGE(x) ((x) << S_TCB_T_RTT_TS_RECENT_AGE)
+
+#define W_TCB_T_RTSEQ_RECENT    9
+#define S_TCB_T_RTSEQ_RECENT    16
+#define M_TCB_T_RTSEQ_RECENT    0xffffffffULL
+#define V_TCB_T_RTSEQ_RECENT(x) ((x) << S_TCB_T_RTSEQ_RECENT)
+
+#define W_TCB_T_SRTT    10
+#define S_TCB_T_SRTT    16
+#define M_TCB_T_SRTT    0xffffULL
+#define V_TCB_T_SRTT(x) ((x) << S_TCB_T_SRTT)
+
+#define W_TCB_T_RTTVAR    11
+#define S_TCB_T_RTTVAR    0
+#define M_TCB_T_RTTVAR    0xffffULL
+#define V_TCB_T_RTTVAR(x) ((x) << S_TCB_T_RTTVAR)
+
+#define W_TCB_TS_LAST_ACK_SENT_RAW    11
+#define S_TCB_TS_LAST_ACK_SENT_RAW    16
+#define M_TCB_TS_LAST_ACK_SENT_RAW    0x7ffffffULL
+#define V_TCB_TS_LAST_ACK_SENT_RAW(x) ((x) << S_TCB_TS_LAST_ACK_SENT_RAW)
+
+#define W_TCB_DIP    12
+#define S_TCB_DIP    11
+#define M_TCB_DIP    0xffffffffULL
+#define V_TCB_DIP(x) ((x) << S_TCB_DIP)
+
+#define W_TCB_SIP    13
+#define S_TCB_SIP    11
+#define M_TCB_SIP    0xffffffffULL
+#define V_TCB_SIP(x) ((x) << S_TCB_SIP)
+
+#define W_TCB_DP    14
+#define S_TCB_DP    11
+#define M_TCB_DP    0xffffULL
+#define V_TCB_DP(x) ((x) << S_TCB_DP)
+
+#define W_TCB_SP    14
+#define S_TCB_SP    27
+#define M_TCB_SP    0xffffULL
+#define V_TCB_SP(x) ((x) << S_TCB_SP)
+
+#define W_TCB_TIMESTAMP    15
+#define S_TCB_TIMESTAMP    11
+#define M_TCB_TIMESTAMP    0xffffffffULL
+#define V_TCB_TIMESTAMP(x) ((x) << S_TCB_TIMESTAMP)
+
+#define W_TCB_TIMESTAMP_OFFSET    16
+#define S_TCB_TIMESTAMP_OFFSET    11
+#define M_TCB_TIMESTAMP_OFFSET    0xfULL
+#define V_TCB_TIMESTAMP_OFFSET(x) ((x) << S_TCB_TIMESTAMP_OFFSET)
+
+#define W_TCB_TX_MAX    16
+#define S_TCB_TX_MAX    15
+#define M_TCB_TX_MAX    0xffffffffULL
+#define V_TCB_TX_MAX(x) ((x) << S_TCB_TX_MAX)
+
+#define W_TCB_TX_HDR_PTR_RAW    17
+#define S_TCB_TX_HDR_PTR_RAW    15
+#define M_TCB_TX_HDR_PTR_RAW    0x1ffffULL
+#define V_TCB_TX_HDR_PTR_RAW(x) ((x) << S_TCB_TX_HDR_PTR_RAW)
+
+#define W_TCB_TX_LAST_PTR_RAW    18
+#define S_TCB_TX_LAST_PTR_RAW    0
+#define M_TCB_TX_LAST_PTR_RAW    0x1ffffULL
+#define V_TCB_TX_LAST_PTR_RAW(x) ((x) << S_TCB_TX_LAST_PTR_RAW)
+
+#define W_TCB_TX_COMPACT    18
+#define S_TCB_TX_COMPACT    17
+#define M_TCB_TX_COMPACT    0x1ULL
+#define V_TCB_TX_COMPACT(x) ((x) << S_TCB_TX_COMPACT)
+
+#define W_TCB_RX_COMPACT    18
+#define S_TCB_RX_COMPACT    18
+#define M_TCB_RX_COMPACT    0x1ULL
+#define V_TCB_RX_COMPACT(x) ((x) << S_TCB_RX_COMPACT)
+
+#define W_TCB_RCV_WND    18
+#define S_TCB_RCV_WND    19
+#define M_TCB_RCV_WND    0x7ffffffULL
+#define V_TCB_RCV_WND(x) ((x) << S_TCB_RCV_WND)
+
+#define W_TCB_RX_HDR_OFFSET    19
+#define S_TCB_RX_HDR_OFFSET    14
+#define M_TCB_RX_HDR_OFFSET    0x7ffffffULL
+#define V_TCB_RX_HDR_OFFSET(x) ((x) << S_TCB_RX_HDR_OFFSET)
+
+#define W_TCB_RX_FRAG0_START_IDX_RAW    20
+#define S_TCB_RX_FRAG0_START_IDX_RAW    9
+#define M_TCB_RX_FRAG0_START_IDX_RAW    0x7ffffffULL
+#define V_TCB_RX_FRAG0_START_IDX_RAW(x) ((x) << S_TCB_RX_FRAG0_START_IDX_RAW)
+
+#define W_TCB_RX_FRAG1_START_IDX_OFFSET    21
+#define S_TCB_RX_FRAG1_START_IDX_OFFSET    4
+#define M_TCB_RX_FRAG1_START_IDX_OFFSET    0x7ffffffULL
+#define V_TCB_RX_FRAG1_START_IDX_OFFSET(x) ((x) << S_TCB_RX_FRAG1_START_IDX_OFFSET)
+
+#define W_TCB_RX_FRAG0_LEN    21
+#define S_TCB_RX_FRAG0_LEN    31
+#define M_TCB_RX_FRAG0_LEN    0x7ffffffULL
+#define V_TCB_RX_FRAG0_LEN(x) ((x) << S_TCB_RX_FRAG0_LEN)
+
+#define W_TCB_RX_FRAG1_LEN    22
+#define S_TCB_RX_FRAG1_LEN    26
+#define M_TCB_RX_FRAG1_LEN    0x7ffffffULL
+#define V_TCB_RX_FRAG1_LEN(x) ((x) << S_TCB_RX_FRAG1_LEN)
+
+#define W_TCB_NEWRENO_RECOVER    23
+#define S_TCB_NEWRENO_RECOVER    21
+#define M_TCB_NEWRENO_RECOVER    0x7ffffffULL
+#define V_TCB_NEWRENO_RECOVER(x) ((x) << S_TCB_NEWRENO_RECOVER)
+
+#define W_TCB_PDU_HAVE_LEN    24
+#define S_TCB_PDU_HAVE_LEN    16
+#define M_TCB_PDU_HAVE_LEN    0x1ULL
+#define V_TCB_PDU_HAVE_LEN(x) ((x) << S_TCB_PDU_HAVE_LEN)
+
+#define W_TCB_PDU_LEN    24
+#define S_TCB_PDU_LEN    17
+#define M_TCB_PDU_LEN    0xffffULL
+#define V_TCB_PDU_LEN(x) ((x) << S_TCB_PDU_LEN)
+
+#define W_TCB_RX_QUIESCE    25
+#define S_TCB_RX_QUIESCE    1
+#define M_TCB_RX_QUIESCE    0x1ULL
+#define V_TCB_RX_QUIESCE(x) ((x) << S_TCB_RX_QUIESCE)
+
+#define W_TCB_RX_PTR_RAW    25
+#define S_TCB_RX_PTR_RAW    2
+#define M_TCB_RX_PTR_RAW    0x1ffffULL
+#define V_TCB_RX_PTR_RAW(x) ((x) << S_TCB_RX_PTR_RAW)
+
+#define W_TCB_CPU_NO    25
+#define S_TCB_CPU_NO    19
+#define M_TCB_CPU_NO    0x7fULL
+#define V_TCB_CPU_NO(x) ((x) << S_TCB_CPU_NO)
+
+#define W_TCB_ULP_TYPE    25
+#define S_TCB_ULP_TYPE    26
+#define M_TCB_ULP_TYPE    0xfULL
+#define V_TCB_ULP_TYPE(x) ((x) << S_TCB_ULP_TYPE)
+
+#define W_TCB_RX_FRAG1_PTR_RAW    25
+#define S_TCB_RX_FRAG1_PTR_RAW    30
+#define M_TCB_RX_FRAG1_PTR_RAW    0x1ffffULL
+#define V_TCB_RX_FRAG1_PTR_RAW(x) ((x) << S_TCB_RX_FRAG1_PTR_RAW)
+
+#define W_TCB_RX_FRAG2_START_IDX_OFFSET_RAW    26
+#define S_TCB_RX_FRAG2_START_IDX_OFFSET_RAW    15
+#define M_TCB_RX_FRAG2_START_IDX_OFFSET_RAW    0x7ffffffULL
+#define V_TCB_RX_FRAG2_START_IDX_OFFSET_RAW(x) ((x) << S_TCB_RX_FRAG2_START_IDX_OFFSET_RAW)
+
+#define W_TCB_RX_FRAG2_PTR_RAW    27
+#define S_TCB_RX_FRAG2_PTR_RAW    10
+#define M_TCB_RX_FRAG2_PTR_RAW    0x1ffffULL
+#define V_TCB_RX_FRAG2_PTR_RAW(x) ((x) << S_TCB_RX_FRAG2_PTR_RAW)
+
+#define W_TCB_RX_FRAG2_LEN_RAW    27
+#define S_TCB_RX_FRAG2_LEN_RAW    27
+#define M_TCB_RX_FRAG2_LEN_RAW    0x7ffffffULL
+#define V_TCB_RX_FRAG2_LEN_RAW(x) ((x) << S_TCB_RX_FRAG2_LEN_RAW)
+
+#define W_TCB_RX_FRAG3_PTR_RAW    28
+#define S_TCB_RX_FRAG3_PTR_RAW    22
+#define M_TCB_RX_FRAG3_PTR_RAW    0x1ffffULL
+#define V_TCB_RX_FRAG3_PTR_RAW(x) ((x) << S_TCB_RX_FRAG3_PTR_RAW)
+
+#define W_TCB_RX_FRAG3_LEN_RAW    29
+#define S_TCB_RX_FRAG3_LEN_RAW    7
+#define M_TCB_RX_FRAG3_LEN_RAW    0x7ffffffULL
+#define V_TCB_RX_FRAG3_LEN_RAW(x) ((x) << S_TCB_RX_FRAG3_LEN_RAW)
+
+#define W_TCB_RX_FRAG3_START_IDX_OFFSET_RAW    30
+#define S_TCB_RX_FRAG3_START_IDX_OFFSET_RAW    2
+#define M_TCB_RX_FRAG3_START_IDX_OFFSET_RAW    0x7ffffffULL
+#define V_TCB_RX_FRAG3_START_IDX_OFFSET_RAW(x) ((x) << S_TCB_RX_FRAG3_START_IDX_OFFSET_RAW)
+
+#define W_TCB_PDU_HDR_LEN    30
+#define S_TCB_PDU_HDR_LEN    29
+#define M_TCB_PDU_HDR_LEN    0xffULL
+#define V_TCB_PDU_HDR_LEN(x) ((x) << S_TCB_PDU_HDR_LEN)
+
+#define W_TCB_SLUSH1    31
+#define S_TCB_SLUSH1    5
+#define M_TCB_SLUSH1    0x7ffffULL
+#define V_TCB_SLUSH1(x) ((x) << S_TCB_SLUSH1)
+
+#define W_TCB_ULP_RAW    31
+#define S_TCB_ULP_RAW    24
+#define M_TCB_ULP_RAW    0xffULL
+#define V_TCB_ULP_RAW(x) ((x) << S_TCB_ULP_RAW)
+
+#define W_TCB_DDP_RDMAP_VERSION    25
+#define S_TCB_DDP_RDMAP_VERSION    30
+#define M_TCB_DDP_RDMAP_VERSION    0x1ULL
+#define V_TCB_DDP_RDMAP_VERSION(x) ((x) << S_TCB_DDP_RDMAP_VERSION)
+
+#define W_TCB_MARKER_ENABLE_RX    25
+#define S_TCB_MARKER_ENABLE_RX    31
+#define M_TCB_MARKER_ENABLE_RX    0x1ULL
+#define V_TCB_MARKER_ENABLE_RX(x) ((x) << S_TCB_MARKER_ENABLE_RX)
+
+#define W_TCB_MARKER_ENABLE_TX    26
+#define S_TCB_MARKER_ENABLE_TX    0
+#define M_TCB_MARKER_ENABLE_TX    0x1ULL
+#define V_TCB_MARKER_ENABLE_TX(x) ((x) << S_TCB_MARKER_ENABLE_TX)
+
+#define W_TCB_CRC_ENABLE    26
+#define S_TCB_CRC_ENABLE    1
+#define M_TCB_CRC_ENABLE    0x1ULL
+#define V_TCB_CRC_ENABLE(x) ((x) << S_TCB_CRC_ENABLE)
+
+#define W_TCB_IRS_ULP    26
+#define S_TCB_IRS_ULP    2
+#define M_TCB_IRS_ULP    0x1ffULL
+#define V_TCB_IRS_ULP(x) ((x) << S_TCB_IRS_ULP)
+
+#define W_TCB_ISS_ULP    26
+#define S_TCB_ISS_ULP    11
+#define M_TCB_ISS_ULP    0x1ffULL
+#define V_TCB_ISS_ULP(x) ((x) << S_TCB_ISS_ULP)
+
+#define W_TCB_TX_PDU_LEN    26
+#define S_TCB_TX_PDU_LEN    20
+#define M_TCB_TX_PDU_LEN    0x3fffULL
+#define V_TCB_TX_PDU_LEN(x) ((x) << S_TCB_TX_PDU_LEN)
+
+#define W_TCB_TX_PDU_OUT    27
+#define S_TCB_TX_PDU_OUT    2
+#define M_TCB_TX_PDU_OUT    0x1ULL
+#define V_TCB_TX_PDU_OUT(x) ((x) << S_TCB_TX_PDU_OUT)
+
+#define W_TCB_CQ_IDX_SQ    27
+#define S_TCB_CQ_IDX_SQ    3
+#define M_TCB_CQ_IDX_SQ    0xffffULL
+#define V_TCB_CQ_IDX_SQ(x) ((x) << S_TCB_CQ_IDX_SQ)
+
+#define W_TCB_CQ_IDX_RQ    27
+#define S_TCB_CQ_IDX_RQ    19
+#define M_TCB_CQ_IDX_RQ    0xffffULL
+#define V_TCB_CQ_IDX_RQ(x) ((x) << S_TCB_CQ_IDX_RQ)
+
+#define W_TCB_QP_ID    28
+#define S_TCB_QP_ID    3
+#define M_TCB_QP_ID    0xffffULL
+#define V_TCB_QP_ID(x) ((x) << S_TCB_QP_ID)
+
+#define W_TCB_PD_ID    28
+#define S_TCB_PD_ID    19
+#define M_TCB_PD_ID    0xffffULL
+#define V_TCB_PD_ID(x) ((x) << S_TCB_PD_ID)
+
+#define W_TCB_STAG    29
+#define S_TCB_STAG    3
+#define M_TCB_STAG    0xffffffffULL
+#define V_TCB_STAG(x) ((x) << S_TCB_STAG)
+
+#define W_TCB_RQ_START    30
+#define S_TCB_RQ_START    3
+#define M_TCB_RQ_START    0x3ffffffULL
+#define V_TCB_RQ_START(x) ((x) << S_TCB_RQ_START)
+
+#define W_TCB_RQ_MSN    30
+#define S_TCB_RQ_MSN    29
+#define M_TCB_RQ_MSN    0x3ffULL
+#define V_TCB_RQ_MSN(x) ((x) << S_TCB_RQ_MSN)
+
+#define W_TCB_RQ_MAX_OFFSET    31
+#define S_TCB_RQ_MAX_OFFSET    7
+#define M_TCB_RQ_MAX_OFFSET    0xfULL
+#define V_TCB_RQ_MAX_OFFSET(x) ((x) << S_TCB_RQ_MAX_OFFSET)
+
+#define W_TCB_RQ_WRITE_PTR    31
+#define S_TCB_RQ_WRITE_PTR    11
+#define M_TCB_RQ_WRITE_PTR    0x3ffULL
+#define V_TCB_RQ_WRITE_PTR(x) ((x) << S_TCB_RQ_WRITE_PTR)
+
+#define W_TCB_INB_WRITE_PERM    31
+#define S_TCB_INB_WRITE_PERM    21
+#define M_TCB_INB_WRITE_PERM    0x1ULL
+#define V_TCB_INB_WRITE_PERM(x) ((x) << S_TCB_INB_WRITE_PERM)
+
+#define W_TCB_INB_READ_PERM    31
+#define S_TCB_INB_READ_PERM    22
+#define M_TCB_INB_READ_PERM    0x1ULL
+#define V_TCB_INB_READ_PERM(x) ((x) << S_TCB_INB_READ_PERM)
+
+#define W_TCB_ORD_L_BIT_VLD    31
+#define S_TCB_ORD_L_BIT_VLD    23
+#define M_TCB_ORD_L_BIT_VLD    0x1ULL
+#define V_TCB_ORD_L_BIT_VLD(x) ((x) << S_TCB_ORD_L_BIT_VLD)
+
+#define W_TCB_RDMAP_OPCODE    31
+#define S_TCB_RDMAP_OPCODE    24
+#define M_TCB_RDMAP_OPCODE    0xfULL
+#define V_TCB_RDMAP_OPCODE(x) ((x) << S_TCB_RDMAP_OPCODE)
+
+#define W_TCB_TX_FLUSH    31
+#define S_TCB_TX_FLUSH    28
+#define M_TCB_TX_FLUSH    0x1ULL
+#define V_TCB_TX_FLUSH(x) ((x) << S_TCB_TX_FLUSH)
+
+#define W_TCB_TX_OOS_RXMT    31
+#define S_TCB_TX_OOS_RXMT    29
+#define M_TCB_TX_OOS_RXMT    0x1ULL
+#define V_TCB_TX_OOS_RXMT(x) ((x) << S_TCB_TX_OOS_RXMT)
+
+#define W_TCB_TX_OOS_TXMT    31
+#define S_TCB_TX_OOS_TXMT    30
+#define M_TCB_TX_OOS_TXMT    0x1ULL
+#define V_TCB_TX_OOS_TXMT(x) ((x) << S_TCB_TX_OOS_TXMT)
+
+#define W_TCB_SLUSH_AUX2    31
+#define S_TCB_SLUSH_AUX2    31
+#define M_TCB_SLUSH_AUX2    0x1ULL
+#define V_TCB_SLUSH_AUX2(x) ((x) << S_TCB_SLUSH_AUX2)
+
+#define W_TCB_RX_FRAG1_PTR_RAW2    25
+#define S_TCB_RX_FRAG1_PTR_RAW2    30
+#define M_TCB_RX_FRAG1_PTR_RAW2    0x1ffffULL
+#define V_TCB_RX_FRAG1_PTR_RAW2(x) ((x) << S_TCB_RX_FRAG1_PTR_RAW2)
+
+#define W_TCB_RX_DDP_FLAGS    26
+#define S_TCB_RX_DDP_FLAGS    15
+#define M_TCB_RX_DDP_FLAGS    0x3ffULL
+#define V_TCB_RX_DDP_FLAGS(x) ((x) << S_TCB_RX_DDP_FLAGS)
+
+#define W_TCB_SLUSH_AUX3    26
+#define S_TCB_SLUSH_AUX3    31
+#define M_TCB_SLUSH_AUX3    0x1ffULL
+#define V_TCB_SLUSH_AUX3(x) ((x) << S_TCB_SLUSH_AUX3)
+
+#define W_TCB_RX_DDP_BUF0_OFFSET    27
+#define S_TCB_RX_DDP_BUF0_OFFSET    8
+#define M_TCB_RX_DDP_BUF0_OFFSET    0x3fffffULL
+#define V_TCB_RX_DDP_BUF0_OFFSET(x) ((x) << S_TCB_RX_DDP_BUF0_OFFSET)
+
+#define W_TCB_RX_DDP_BUF0_LEN    27
+#define S_TCB_RX_DDP_BUF0_LEN    30
+#define M_TCB_RX_DDP_BUF0_LEN    0x3fffffULL
+#define V_TCB_RX_DDP_BUF0_LEN(x) ((x) << S_TCB_RX_DDP_BUF0_LEN)
+
+#define W_TCB_RX_DDP_BUF1_OFFSET    28
+#define S_TCB_RX_DDP_BUF1_OFFSET    20
+#define M_TCB_RX_DDP_BUF1_OFFSET    0x3fffffULL
+#define V_TCB_RX_DDP_BUF1_OFFSET(x) ((x) << S_TCB_RX_DDP_BUF1_OFFSET)
+
+#define W_TCB_RX_DDP_BUF1_LEN    29
+#define S_TCB_RX_DDP_BUF1_LEN    10
+#define M_TCB_RX_DDP_BUF1_LEN    0x3fffffULL
+#define V_TCB_RX_DDP_BUF1_LEN(x) ((x) << S_TCB_RX_DDP_BUF1_LEN)
+
+#define W_TCB_RX_DDP_BUF0_TAG    30
+#define S_TCB_RX_DDP_BUF0_TAG    0
+#define M_TCB_RX_DDP_BUF0_TAG    0xffffffffULL
+#define V_TCB_RX_DDP_BUF0_TAG(x) ((x) << S_TCB_RX_DDP_BUF0_TAG)
+
+#define W_TCB_RX_DDP_BUF1_TAG    31
+#define S_TCB_RX_DDP_BUF1_TAG    0
+#define M_TCB_RX_DDP_BUF1_TAG    0xffffffffULL
+#define V_TCB_RX_DDP_BUF1_TAG(x) ((x) << S_TCB_RX_DDP_BUF1_TAG)
+
+#define S_TF_DACK    10
+#define V_TF_DACK(x) ((x) << S_TF_DACK)
+
+#define S_TF_NAGLE    11
+#define V_TF_NAGLE(x) ((x) << S_TF_NAGLE)
+
+#define S_TF_RECV_SCALE    12
+#define V_TF_RECV_SCALE(x) ((x) << S_TF_RECV_SCALE)
+
+#define S_TF_RECV_TSTMP    13
+#define V_TF_RECV_TSTMP(x) ((x) << S_TF_RECV_TSTMP)
+
+#define S_TF_RECV_SACK    14
+#define V_TF_RECV_SACK(x) ((x) << S_TF_RECV_SACK)
+
+#define S_TF_TURBO    15
+#define V_TF_TURBO(x) ((x) << S_TF_TURBO)
+
+#define S_TF_KEEPALIVE    16
+#define V_TF_KEEPALIVE(x) ((x) << S_TF_KEEPALIVE)
+
+#define S_TF_TCAM_BYPASS    17
+#define V_TF_TCAM_BYPASS(x) ((x) << S_TF_TCAM_BYPASS)
+
+#define S_TF_CORE_FIN    18
+#define V_TF_CORE_FIN(x) ((x) << S_TF_CORE_FIN)
+
+#define S_TF_CORE_MORE    19
+#define V_TF_CORE_MORE(x) ((x) << S_TF_CORE_MORE)
+
+#define S_TF_MIGRATING    20
+#define V_TF_MIGRATING(x) ((x) << S_TF_MIGRATING)
+
+#define S_TF_ACTIVE_OPEN    21
+#define V_TF_ACTIVE_OPEN(x) ((x) << S_TF_ACTIVE_OPEN)
+
+#define S_TF_ASK_MODE    22
+#define V_TF_ASK_MODE(x) ((x) << S_TF_ASK_MODE)
+
+#define S_TF_NON_OFFLOAD    23
+#define V_TF_NON_OFFLOAD(x) ((x) << S_TF_NON_OFFLOAD)
+
+#define S_TF_MOD_SCHD    24
+#define V_TF_MOD_SCHD(x) ((x) << S_TF_MOD_SCHD)
+
+#define S_TF_MOD_SCHD_REASON0    25
+#define V_TF_MOD_SCHD_REASON0(x) ((x) << S_TF_MOD_SCHD_REASON0)
+
+#define S_TF_MOD_SCHD_REASON1    26
+#define V_TF_MOD_SCHD_REASON1(x) ((x) << S_TF_MOD_SCHD_REASON1)
+
+#define S_TF_MOD_SCHD_RX    27
+#define V_TF_MOD_SCHD_RX(x) ((x) << S_TF_MOD_SCHD_RX)
+
+#define S_TF_CORE_PUSH    28
+#define V_TF_CORE_PUSH(x) ((x) << S_TF_CORE_PUSH)
+
+#define S_TF_RCV_COALESCE_ENABLE    29
+#define V_TF_RCV_COALESCE_ENABLE(x) ((x) << S_TF_RCV_COALESCE_ENABLE)
+
+#define S_TF_RCV_COALESCE_PUSH    30
+#define V_TF_RCV_COALESCE_PUSH(x) ((x) << S_TF_RCV_COALESCE_PUSH)
+
+#define S_TF_RCV_COALESCE_LAST_PSH    31
+#define V_TF_RCV_COALESCE_LAST_PSH(x) ((x) << S_TF_RCV_COALESCE_LAST_PSH)
+
+#define S_TF_RCV_COALESCE_HEARTBEAT    32
+#define V_TF_RCV_COALESCE_HEARTBEAT(x) ((x) << S_TF_RCV_COALESCE_HEARTBEAT)
+
+#define S_TF_HALF_CLOSE    33
+#define V_TF_HALF_CLOSE(x) ((x) << S_TF_HALF_CLOSE)
+
+#define S_TF_DACK_MSS    34
+#define V_TF_DACK_MSS(x) ((x) << S_TF_DACK_MSS)
+
+#define S_TF_CCTRL_SEL0    35
+#define V_TF_CCTRL_SEL0(x) ((x) << S_TF_CCTRL_SEL0)
+
+#define S_TF_CCTRL_SEL1    36
+#define V_TF_CCTRL_SEL1(x) ((x) << S_TF_CCTRL_SEL1)
+
+#define S_TF_TCP_NEWRENO_FAST_RECOVERY    37
+#define V_TF_TCP_NEWRENO_FAST_RECOVERY(x) ((x) << S_TF_TCP_NEWRENO_FAST_RECOVERY)
+
+#define S_TF_TX_PACE_AUTO    38
+#define V_TF_TX_PACE_AUTO(x) ((x) << S_TF_TX_PACE_AUTO)
+
+#define S_TF_PEER_FIN_HELD    39
+#define V_TF_PEER_FIN_HELD(x) ((x) << S_TF_PEER_FIN_HELD)
+
+#define S_TF_CORE_URG    40
+#define V_TF_CORE_URG(x) ((x) << S_TF_CORE_URG)
+
+#define S_TF_RDMA_ERROR    41
+#define V_TF_RDMA_ERROR(x) ((x) << S_TF_RDMA_ERROR)
+
+#define S_TF_SSWS_DISABLED    42
+#define V_TF_SSWS_DISABLED(x) ((x) << S_TF_SSWS_DISABLED)
+
+#define S_TF_DUPACK_COUNT_ODD    43
+#define V_TF_DUPACK_COUNT_ODD(x) ((x) << S_TF_DUPACK_COUNT_ODD)
+
+#define S_TF_TX_CHANNEL    44
+#define V_TF_TX_CHANNEL(x) ((x) << S_TF_TX_CHANNEL)
+
+#define S_TF_RX_CHANNEL    45
+#define V_TF_RX_CHANNEL(x) ((x) << S_TF_RX_CHANNEL)
+
+#define S_TF_TX_PACE_FIXED    46
+#define V_TF_TX_PACE_FIXED(x) ((x) << S_TF_TX_PACE_FIXED)
+
+#define S_TF_RDMA_FLM_ERROR    47
+#define V_TF_RDMA_FLM_ERROR(x) ((x) << S_TF_RDMA_FLM_ERROR)
+
+#define S_TF_RX_FLOW_CONTROL_DISABLE    48
+#define V_TF_RX_FLOW_CONTROL_DISABLE(x) ((x) << S_TF_RX_FLOW_CONTROL_DISABLE)
+
+#endif /* _TCB_DEFS_H */
index 9291a86ca0537f279868ded87046d69a6ad18b5f..6ebfa27e4e16edadbe3a44e803a20c264dbb916d 100644 (file)
@@ -134,14 +134,13 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe,
        if (cqe >= 0xFFFFFFFF - 64 - additional_cqe)
                return ERR_PTR(-EINVAL);
 
-       my_cq = kmem_cache_alloc(cq_cache, GFP_KERNEL);
+       my_cq = kmem_cache_zalloc(cq_cache, GFP_KERNEL);
        if (!my_cq) {
                ehca_err(device, "Out of memory for ehca_cq struct device=%p",
                         device);
                return ERR_PTR(-ENOMEM);
        }
 
-       memset(my_cq, 0, sizeof(struct ehca_cq));
        memset(&param, 0, sizeof(struct ehca_alloc_cq_parms));
 
        spin_lock_init(&my_cq->spinlock);
index 5281dec66f127c5667c3ac44aab490d3f644a417..24ceab0bae4a5b9407e6a2b82ff115668830c04d 100644 (file)
@@ -122,7 +122,7 @@ int ehca_create_eq(struct ehca_shca *shca,
        /* register interrupt handlers and initialize work queues */
        if (type == EHCA_EQ) {
                ret = ibmebus_request_irq(NULL, eq->ist, ehca_interrupt_eq,
-                                         SA_INTERRUPT, "ehca_eq",
+                                         IRQF_DISABLED, "ehca_eq",
                                          (void *)shca);
                if (ret < 0)
                        ehca_err(ib_dev, "Can't map interrupt handler.");
@@ -130,7 +130,7 @@ int ehca_create_eq(struct ehca_shca *shca,
                tasklet_init(&eq->interrupt_task, ehca_tasklet_eq, (long)shca);
        } else if (type == EHCA_NEQ) {
                ret = ibmebus_request_irq(NULL, eq->ist, ehca_interrupt_neq,
-                                         SA_INTERRUPT, "ehca_neq",
+                                         IRQF_DISABLED, "ehca_neq",
                                          (void *)shca);
                if (ret < 0)
                        ehca_err(ib_dev, "Can't map interrupt handler.");
index c069be8cbcb291868b0419e8867e48d8b7acc6e2..6c4f9f91b15df3e10f9e417f3deac51abcfd4077 100644 (file)
@@ -756,6 +756,8 @@ void ehca_destroy_comp_pool(void)
                if (cpu_online(i))
                        destroy_comp_task(pool, i);
        }
+       free_percpu(pool->cpu_comp_tasks);
+       kfree(pool);
 #endif
 
        return;
index cfb362a1029caa979394fed9bc8fc54be60812ca..d22ab563633f0ed10c7cb476e5ebe5deec452ed0 100644 (file)
@@ -53,9 +53,8 @@ static struct ehca_mr *ehca_mr_new(void)
 {
        struct ehca_mr *me;
 
-       me = kmem_cache_alloc(mr_cache, GFP_KERNEL);
+       me = kmem_cache_zalloc(mr_cache, GFP_KERNEL);
        if (me) {
-               memset(me, 0, sizeof(struct ehca_mr));
                spin_lock_init(&me->mrlock);
        } else
                ehca_gen_err("alloc failed");
@@ -72,9 +71,8 @@ static struct ehca_mw *ehca_mw_new(void)
 {
        struct ehca_mw *me;
 
-       me = kmem_cache_alloc(mw_cache, GFP_KERNEL);
+       me = kmem_cache_zalloc(mw_cache, GFP_KERNEL);
        if (me) {
-               memset(me, 0, sizeof(struct ehca_mw));
                spin_lock_init(&me->mwlock);
        } else
                ehca_gen_err("alloc failed");
index d5345e5b3cd661a0de94104fb16bd4f1fca33c76..79d0591a80431eb487fad97590f1ecfa83f531b1 100644 (file)
@@ -50,14 +50,13 @@ struct ib_pd *ehca_alloc_pd(struct ib_device *device,
 {
        struct ehca_pd *pd;
 
-       pd = kmem_cache_alloc(pd_cache, GFP_KERNEL);
+       pd = kmem_cache_zalloc(pd_cache, GFP_KERNEL);
        if (!pd) {
                ehca_err(device, "device=%p context=%p out of memory",
                         device, context);
                return ERR_PTR(-ENOMEM);
        }
 
-       memset(pd, 0, sizeof(struct ehca_pd));
        pd->ownpid = current->tgid;
 
        /*
index 95efef921f1d9fed9543ca5b0f889af9c4f74862..df0516f2437989c2cf4d5c6faea9095de26332bf 100644 (file)
@@ -450,13 +450,12 @@ struct ib_qp *ehca_create_qp(struct ib_pd *pd,
        if (pd->uobject && udata)
                context = pd->uobject->context;
 
-       my_qp = kmem_cache_alloc(qp_cache, GFP_KERNEL);
+       my_qp = kmem_cache_zalloc(qp_cache, GFP_KERNEL);
        if (!my_qp) {
                ehca_err(pd->device, "pd=%p not enough memory to alloc qp", pd);
                return ERR_PTR(-ENOMEM);
        }
 
-       memset(my_qp, 0, sizeof(struct ehca_qp));
        memset (&parms, 0, sizeof(struct ehca_alloc_qp_parms));
        spin_lock_init(&my_qp->spinlock_s);
        spin_lock_init(&my_qp->spinlock_r);
index 28c087b824c2846c7d6e971e59359295618587b0..0f13a2182cc7d1bd0707058dc435f07343b2162f 100644 (file)
@@ -59,7 +59,7 @@ static ssize_t ipath_diag_read(struct file *fp, char __user *data,
 static ssize_t ipath_diag_write(struct file *fp, const char __user *data,
                                size_t count, loff_t *off);
 
-static struct file_operations diag_file_ops = {
+static const struct file_operations diag_file_ops = {
        .owner = THIS_MODULE,
        .write = ipath_diag_write,
        .read = ipath_diag_read,
@@ -71,7 +71,7 @@ static ssize_t ipath_diagpkt_write(struct file *fp,
                                   const char __user *data,
                                   size_t count, loff_t *off);
 
-static struct file_operations diagpkt_file_ops = {
+static const struct file_operations diagpkt_file_ops = {
        .owner = THIS_MODULE,
        .write = ipath_diagpkt_write,
 };
index b932bcb67a5edc8a99420dfd80e34bc41e93559e..5d64ff87529715e439ecdd495e8a547bafef5059 100644 (file)
@@ -54,7 +54,7 @@ static ssize_t ipath_write(struct file *, const char __user *, size_t,
 static unsigned int ipath_poll(struct file *, struct poll_table_struct *);
 static int ipath_mmap(struct file *, struct vm_area_struct *);
 
-static struct file_operations ipath_file_ops = {
+static const struct file_operations ipath_file_ops = {
        .owner = THIS_MODULE,
        .write = ipath_write,
        .open = ipath_open,
@@ -2153,7 +2153,7 @@ bail:
 
 static struct class *ipath_class;
 
-static int init_cdev(int minor, char *name, struct file_operations *fops,
+static int init_cdev(int minor, char *name, const struct file_operations *fops,
                     struct cdev **cdevp, struct class_device **class_devp)
 {
        const dev_t dev = MKDEV(IPATH_MAJOR, minor);
@@ -2210,7 +2210,7 @@ done:
        return ret;
 }
 
-int ipath_cdev_init(int minor, char *name, struct file_operations *fops,
+int ipath_cdev_init(int minor, char *name, const struct file_operations *fops,
                    struct cdev **cdevp, struct class_device **class_devp)
 {
        return init_cdev(minor, name, fops, cdevp, class_devp);
index 79a60f020a21a294938b0b6ca11ae13b532a1aee..5b40a846ff95490f61b93ce4d6f7a08d821570fa 100644 (file)
@@ -47,7 +47,7 @@
 static struct super_block *ipath_super;
 
 static int ipathfs_mknod(struct inode *dir, struct dentry *dentry,
-                        int mode, struct file_operations *fops,
+                        int mode, const struct file_operations *fops,
                         void *data)
 {
        int error;
@@ -81,7 +81,7 @@ bail:
 
 static int create_file(const char *name, mode_t mode,
                       struct dentry *parent, struct dentry **dentry,
-                      struct file_operations *fops, void *data)
+                      const struct file_operations *fops, void *data)
 {
        int error;
 
@@ -105,7 +105,7 @@ static ssize_t atomic_stats_read(struct file *file, char __user *buf,
                                       sizeof ipath_stats);
 }
 
-static struct file_operations atomic_stats_ops = {
+static const struct file_operations atomic_stats_ops = {
        .read = atomic_stats_read,
 };
 
@@ -127,7 +127,7 @@ static ssize_t atomic_counters_read(struct file *file, char __user *buf,
                                       sizeof counters);
 }
 
-static struct file_operations atomic_counters_ops = {
+static const struct file_operations atomic_counters_ops = {
        .read = atomic_counters_read,
 };
 
@@ -166,7 +166,7 @@ static ssize_t atomic_node_info_read(struct file *file, char __user *buf,
                                       sizeof nodeinfo);
 }
 
-static struct file_operations atomic_node_info_ops = {
+static const struct file_operations atomic_node_info_ops = {
        .read = atomic_node_info_read,
 };
 
@@ -291,7 +291,7 @@ static ssize_t atomic_port_info_read(struct file *file, char __user *buf,
                                       sizeof portinfo);
 }
 
-static struct file_operations atomic_port_info_ops = {
+static const struct file_operations atomic_port_info_ops = {
        .read = atomic_port_info_read,
 };
 
@@ -394,7 +394,7 @@ bail:
        return ret;
 }
 
-static struct file_operations flash_ops = {
+static const struct file_operations flash_ops = {
        .read = flash_read,
        .write = flash_write,
 };
index 986b2125b8f5826cd4a1fd95b29014a373914f19..6d8d05fb5999e41a77552455c5492b0d30da6e18 100644 (file)
@@ -593,7 +593,7 @@ void ipath_shutdown_device(struct ipath_devdata *);
 void ipath_disarm_senderrbufs(struct ipath_devdata *);
 
 struct file_operations;
-int ipath_cdev_init(int minor, char *name, struct file_operations *fops,
+int ipath_cdev_init(int minor, char *name, const struct file_operations *fops,
                    struct cdev **cdevp, struct class_device **class_devp);
 void ipath_cdev_cleanup(struct cdev **cdevp,
                        struct class_device **class_devp);
index 968d1519761c50f64f28ed03e4f5ff8fd6d1e0b1..71314460b11e63b649c9ad55c423b5de3845ef4c 100644 (file)
@@ -1051,7 +1051,11 @@ int mthca_QUERY_DEV_LIM(struct mthca_dev *dev,
        MTHCA_GET(field, outbox, QUERY_DEV_LIM_MAX_EQ_OFFSET);
        dev_lim->max_eqs = 1 << (field & 0x7);
        MTHCA_GET(field, outbox, QUERY_DEV_LIM_RSVD_MTT_OFFSET);
-       dev_lim->reserved_mtts = 1 << (field >> 4);
+       if (mthca_is_memfree(dev))
+               dev_lim->reserved_mtts = ALIGN((1 << (field >> 4)) * sizeof(u64),
+                                              MTHCA_MTT_SEG_SIZE) / MTHCA_MTT_SEG_SIZE;
+       else
+               dev_lim->reserved_mtts = 1 << (field >> 4);
        MTHCA_GET(field, outbox, QUERY_DEV_LIM_MAX_MRW_SZ_OFFSET);
        dev_lim->max_mrw_sz = 1 << field;
        MTHCA_GET(field, outbox, QUERY_DEV_LIM_RSVD_MRW_OFFSET);
index fe5cecf70feddd6ec1b4c4d79dd32713d558126c..b7e42efaf43df30a5981503af8d80f3111a17038 100644 (file)
@@ -464,6 +464,8 @@ void mthca_uar_free(struct mthca_dev *dev, struct mthca_uar *uar);
 int mthca_pd_alloc(struct mthca_dev *dev, int privileged, struct mthca_pd *pd);
 void mthca_pd_free(struct mthca_dev *dev, struct mthca_pd *pd);
 
+int mthca_write_mtt_size(struct mthca_dev *dev);
+
 struct mthca_mtt *mthca_alloc_mtt(struct mthca_dev *dev, int size);
 void mthca_free_mtt(struct mthca_dev *dev, struct mthca_mtt *mtt);
 int mthca_write_mtt(struct mthca_dev *dev, struct mthca_mtt *mtt,
index 44bc6cc734abf35351780ca37f724cc35d32bd11..0d9b7d06bbc23da3a5405bbf4acd28fabc964fa6 100644 (file)
@@ -379,7 +379,7 @@ static int mthca_load_fw(struct mthca_dev *mdev)
 
        mdev->fw.arbel.fw_icm =
                mthca_alloc_icm(mdev, mdev->fw.arbel.fw_pages,
-                               GFP_HIGHUSER | __GFP_NOWARN);
+                               GFP_HIGHUSER | __GFP_NOWARN, 0);
        if (!mdev->fw.arbel.fw_icm) {
                mthca_err(mdev, "Couldn't allocate FW area, aborting.\n");
                return -ENOMEM;
@@ -412,7 +412,7 @@ err_unmap_fa:
        mthca_UNMAP_FA(mdev, &status);
 
 err_free:
-       mthca_free_icm(mdev, mdev->fw.arbel.fw_icm);
+       mthca_free_icm(mdev, mdev->fw.arbel.fw_icm, 0);
        return err;
 }
 
@@ -441,7 +441,7 @@ static int mthca_init_icm(struct mthca_dev *mdev,
                  (unsigned long long) aux_pages << 2);
 
        mdev->fw.arbel.aux_icm = mthca_alloc_icm(mdev, aux_pages,
-                                                GFP_HIGHUSER | __GFP_NOWARN);
+                                                GFP_HIGHUSER | __GFP_NOWARN, 0);
        if (!mdev->fw.arbel.aux_icm) {
                mthca_err(mdev, "Couldn't allocate aux memory, aborting.\n");
                return -ENOMEM;
@@ -464,10 +464,15 @@ static int mthca_init_icm(struct mthca_dev *mdev,
                goto err_unmap_aux;
        }
 
+       /* CPU writes to non-reserved MTTs, while HCA might DMA to reserved mtts */
+       mdev->limits.reserved_mtts = ALIGN(mdev->limits.reserved_mtts * MTHCA_MTT_SEG_SIZE,
+                                          dma_get_cache_alignment()) / MTHCA_MTT_SEG_SIZE;
+
        mdev->mr_table.mtt_table = mthca_alloc_icm_table(mdev, init_hca->mtt_base,
                                                         MTHCA_MTT_SEG_SIZE,
                                                         mdev->limits.num_mtt_segs,
-                                                        mdev->limits.reserved_mtts, 1);
+                                                        mdev->limits.reserved_mtts,
+                                                        1, 0);
        if (!mdev->mr_table.mtt_table) {
                mthca_err(mdev, "Failed to map MTT context memory, aborting.\n");
                err = -ENOMEM;
@@ -477,7 +482,8 @@ static int mthca_init_icm(struct mthca_dev *mdev,
        mdev->mr_table.mpt_table = mthca_alloc_icm_table(mdev, init_hca->mpt_base,
                                                         dev_lim->mpt_entry_sz,
                                                         mdev->limits.num_mpts,
-                                                        mdev->limits.reserved_mrws, 1);
+                                                        mdev->limits.reserved_mrws,
+                                                        1, 1);
        if (!mdev->mr_table.mpt_table) {
                mthca_err(mdev, "Failed to map MPT context memory, aborting.\n");
                err = -ENOMEM;
@@ -487,7 +493,8 @@ static int mthca_init_icm(struct mthca_dev *mdev,
        mdev->qp_table.qp_table = mthca_alloc_icm_table(mdev, init_hca->qpc_base,
                                                        dev_lim->qpc_entry_sz,
                                                        mdev->limits.num_qps,
-                                                       mdev->limits.reserved_qps, 0);
+                                                       mdev->limits.reserved_qps,
+                                                       0, 0);
        if (!mdev->qp_table.qp_table) {
                mthca_err(mdev, "Failed to map QP context memory, aborting.\n");
                err = -ENOMEM;
@@ -497,7 +504,8 @@ static int mthca_init_icm(struct mthca_dev *mdev,
        mdev->qp_table.eqp_table = mthca_alloc_icm_table(mdev, init_hca->eqpc_base,
                                                         dev_lim->eqpc_entry_sz,
                                                         mdev->limits.num_qps,
-                                                        mdev->limits.reserved_qps, 0);
+                                                        mdev->limits.reserved_qps,
+                                                        0, 0);
        if (!mdev->qp_table.eqp_table) {
                mthca_err(mdev, "Failed to map EQP context memory, aborting.\n");
                err = -ENOMEM;
@@ -507,7 +515,7 @@ static int mthca_init_icm(struct mthca_dev *mdev,
        mdev->qp_table.rdb_table = mthca_alloc_icm_table(mdev, init_hca->rdb_base,
                                                         MTHCA_RDB_ENTRY_SIZE,
                                                         mdev->limits.num_qps <<
-                                                        mdev->qp_table.rdb_shift,
+                                                        mdev->qp_table.rdb_shift, 0,
                                                         0, 0);
        if (!mdev->qp_table.rdb_table) {
                mthca_err(mdev, "Failed to map RDB context memory, aborting\n");
@@ -518,7 +526,8 @@ static int mthca_init_icm(struct mthca_dev *mdev,
        mdev->cq_table.table = mthca_alloc_icm_table(mdev, init_hca->cqc_base,
                                                    dev_lim->cqc_entry_sz,
                                                    mdev->limits.num_cqs,
-                                                   mdev->limits.reserved_cqs, 0);
+                                                   mdev->limits.reserved_cqs,
+                                                   0, 0);
        if (!mdev->cq_table.table) {
                mthca_err(mdev, "Failed to map CQ context memory, aborting.\n");
                err = -ENOMEM;
@@ -530,7 +539,8 @@ static int mthca_init_icm(struct mthca_dev *mdev,
                        mthca_alloc_icm_table(mdev, init_hca->srqc_base,
                                              dev_lim->srq_entry_sz,
                                              mdev->limits.num_srqs,
-                                             mdev->limits.reserved_srqs, 0);
+                                             mdev->limits.reserved_srqs,
+                                             0, 0);
                if (!mdev->srq_table.table) {
                        mthca_err(mdev, "Failed to map SRQ context memory, "
                                  "aborting.\n");
@@ -550,7 +560,7 @@ static int mthca_init_icm(struct mthca_dev *mdev,
                                                      mdev->limits.num_amgms,
                                                      mdev->limits.num_mgms +
                                                      mdev->limits.num_amgms,
-                                                     0);
+                                                     0, 0);
        if (!mdev->mcg_table.table) {
                mthca_err(mdev, "Failed to map MCG context memory, aborting.\n");
                err = -ENOMEM;
@@ -588,7 +598,7 @@ err_unmap_aux:
        mthca_UNMAP_ICM_AUX(mdev, &status);
 
 err_free_aux:
-       mthca_free_icm(mdev, mdev->fw.arbel.aux_icm);
+       mthca_free_icm(mdev, mdev->fw.arbel.aux_icm, 0);
 
        return err;
 }
@@ -609,7 +619,7 @@ static void mthca_free_icms(struct mthca_dev *mdev)
        mthca_unmap_eq_icm(mdev);
 
        mthca_UNMAP_ICM_AUX(mdev, &status);
-       mthca_free_icm(mdev, mdev->fw.arbel.aux_icm);
+       mthca_free_icm(mdev, mdev->fw.arbel.aux_icm, 0);
 }
 
 static int mthca_init_arbel(struct mthca_dev *mdev)
@@ -693,7 +703,7 @@ err_free_icm:
 
 err_stop_fw:
        mthca_UNMAP_FA(mdev, &status);
-       mthca_free_icm(mdev, mdev->fw.arbel.fw_icm);
+       mthca_free_icm(mdev, mdev->fw.arbel.fw_icm, 0);
 
 err_disable:
        if (!(mdev->mthca_flags & MTHCA_FLAG_NO_LAM))
@@ -712,7 +722,7 @@ static void mthca_close_hca(struct mthca_dev *mdev)
                mthca_free_icms(mdev);
 
                mthca_UNMAP_FA(mdev, &status);
-               mthca_free_icm(mdev, mdev->fw.arbel.fw_icm);
+               mthca_free_icm(mdev, mdev->fw.arbel.fw_icm, 0);
 
                if (!(mdev->mthca_flags & MTHCA_FLAG_NO_LAM))
                        mthca_DISABLE_LAM(mdev, &status);
index 6b19645d946c31af877c28d5c8d8c9ddfa4ec94f..0b9d053a599d2c3a328913aceccafb5721ed5698 100644 (file)
@@ -35,6 +35,9 @@
  */
 
 #include <linux/mm.h>
+#include <linux/scatterlist.h>
+
+#include <asm/page.h>
 
 #include "mthca_memfree.h"
 #include "mthca_dev.h"
@@ -58,22 +61,42 @@ struct mthca_user_db_table {
        }                page[0];
 };
 
-void mthca_free_icm(struct mthca_dev *dev, struct mthca_icm *icm)
+static void mthca_free_icm_pages(struct mthca_dev *dev, struct mthca_icm_chunk *chunk)
+{
+       int i;
+
+       if (chunk->nsg > 0)
+               pci_unmap_sg(dev->pdev, chunk->mem, chunk->npages,
+                            PCI_DMA_BIDIRECTIONAL);
+
+       for (i = 0; i < chunk->npages; ++i)
+               __free_pages(chunk->mem[i].page,
+                            get_order(chunk->mem[i].length));
+}
+
+static void mthca_free_icm_coherent(struct mthca_dev *dev, struct mthca_icm_chunk *chunk)
 {
-       struct mthca_icm_chunk *chunk, *tmp;
        int i;
 
+       for (i = 0; i < chunk->npages; ++i) {
+               dma_free_coherent(&dev->pdev->dev, chunk->mem[i].length,
+                                 lowmem_page_address(chunk->mem[i].page),
+                                 sg_dma_address(&chunk->mem[i]));
+       }
+}
+
+void mthca_free_icm(struct mthca_dev *dev, struct mthca_icm *icm, int coherent)
+{
+       struct mthca_icm_chunk *chunk, *tmp;
+
        if (!icm)
                return;
 
        list_for_each_entry_safe(chunk, tmp, &icm->chunk_list, list) {
-               if (chunk->nsg > 0)
-                       pci_unmap_sg(dev->pdev, chunk->mem, chunk->npages,
-                                    PCI_DMA_BIDIRECTIONAL);
-
-               for (i = 0; i < chunk->npages; ++i)
-                       __free_pages(chunk->mem[i].page,
-                                    get_order(chunk->mem[i].length));
+               if (coherent)
+                       mthca_free_icm_coherent(dev, chunk);
+               else
+                       mthca_free_icm_pages(dev, chunk);
 
                kfree(chunk);
        }
@@ -81,12 +104,41 @@ void mthca_free_icm(struct mthca_dev *dev, struct mthca_icm *icm)
        kfree(icm);
 }
 
+static int mthca_alloc_icm_pages(struct scatterlist *mem, int order, gfp_t gfp_mask)
+{
+       mem->page = alloc_pages(gfp_mask, order);
+       if (!mem->page)
+               return -ENOMEM;
+
+       mem->length = PAGE_SIZE << order;
+       mem->offset = 0;
+       return 0;
+}
+
+static int mthca_alloc_icm_coherent(struct device *dev, struct scatterlist *mem,
+                                   int order, gfp_t gfp_mask)
+{
+       void *buf = dma_alloc_coherent(dev, PAGE_SIZE << order, &sg_dma_address(mem),
+                                      gfp_mask);
+       if (!buf)
+               return -ENOMEM;
+
+       sg_set_buf(mem, buf, PAGE_SIZE << order);
+       BUG_ON(mem->offset);
+       sg_dma_len(mem) = PAGE_SIZE << order;
+       return 0;
+}
+
 struct mthca_icm *mthca_alloc_icm(struct mthca_dev *dev, int npages,
-                                 gfp_t gfp_mask)
+                                 gfp_t gfp_mask, int coherent)
 {
        struct mthca_icm *icm;
        struct mthca_icm_chunk *chunk = NULL;
        int cur_order;
+       int ret;
+
+       /* We use sg_set_buf for coherent allocs, which assumes low memory */
+       BUG_ON(coherent && (gfp_mask & __GFP_HIGHMEM));
 
        icm = kmalloc(sizeof *icm, gfp_mask & ~(__GFP_HIGHMEM | __GFP_NOWARN));
        if (!icm)
@@ -112,21 +164,28 @@ struct mthca_icm *mthca_alloc_icm(struct mthca_dev *dev, int npages,
                while (1 << cur_order > npages)
                        --cur_order;
 
-               chunk->mem[chunk->npages].page = alloc_pages(gfp_mask, cur_order);
-               if (chunk->mem[chunk->npages].page) {
-                       chunk->mem[chunk->npages].length = PAGE_SIZE << cur_order;
-                       chunk->mem[chunk->npages].offset = 0;
+               if (coherent)
+                       ret = mthca_alloc_icm_coherent(&dev->pdev->dev,
+                                                      &chunk->mem[chunk->npages],
+                                                      cur_order, gfp_mask);
+               else
+                       ret = mthca_alloc_icm_pages(&chunk->mem[chunk->npages],
+                                                   cur_order, gfp_mask);
 
-                       if (++chunk->npages == MTHCA_ICM_CHUNK_LEN) {
+               if (!ret) {
+                       ++chunk->npages;
+
+                       if (!coherent && chunk->npages == MTHCA_ICM_CHUNK_LEN) {
                                chunk->nsg = pci_map_sg(dev->pdev, chunk->mem,
                                                        chunk->npages,
                                                        PCI_DMA_BIDIRECTIONAL);
 
                                if (chunk->nsg <= 0)
                                        goto fail;
+                       }
 
+                       if (chunk->npages == MTHCA_ICM_CHUNK_LEN)
                                chunk = NULL;
-                       }
 
                        npages -= 1 << cur_order;
                } else {
@@ -136,7 +195,7 @@ struct mthca_icm *mthca_alloc_icm(struct mthca_dev *dev, int npages,
                }
        }
 
-       if (chunk) {
+       if (!coherent && chunk) {
                chunk->nsg = pci_map_sg(dev->pdev, chunk->mem,
                                        chunk->npages,
                                        PCI_DMA_BIDIRECTIONAL);
@@ -148,7 +207,7 @@ struct mthca_icm *mthca_alloc_icm(struct mthca_dev *dev, int npages,
        return icm;
 
 fail:
-       mthca_free_icm(dev, icm);
+       mthca_free_icm(dev, icm, coherent);
        return NULL;
 }
 
@@ -167,7 +226,7 @@ int mthca_table_get(struct mthca_dev *dev, struct mthca_icm_table *table, int ob
 
        table->icm[i] = mthca_alloc_icm(dev, MTHCA_TABLE_CHUNK_SIZE >> PAGE_SHIFT,
                                        (table->lowmem ? GFP_KERNEL : GFP_HIGHUSER) |
-                                       __GFP_NOWARN);
+                                       __GFP_NOWARN, table->coherent);
        if (!table->icm[i]) {
                ret = -ENOMEM;
                goto out;
@@ -175,7 +234,7 @@ int mthca_table_get(struct mthca_dev *dev, struct mthca_icm_table *table, int ob
 
        if (mthca_MAP_ICM(dev, table->icm[i], table->virt + i * MTHCA_TABLE_CHUNK_SIZE,
                          &status) || status) {
-               mthca_free_icm(dev, table->icm[i]);
+               mthca_free_icm(dev, table->icm[i], table->coherent);
                table->icm[i] = NULL;
                ret = -ENOMEM;
                goto out;
@@ -204,16 +263,16 @@ void mthca_table_put(struct mthca_dev *dev, struct mthca_icm_table *table, int o
                mthca_UNMAP_ICM(dev, table->virt + i * MTHCA_TABLE_CHUNK_SIZE,
                                MTHCA_TABLE_CHUNK_SIZE / MTHCA_ICM_PAGE_SIZE,
                                &status);
-               mthca_free_icm(dev, table->icm[i]);
+               mthca_free_icm(dev, table->icm[i], table->coherent);
                table->icm[i] = NULL;
        }
 
        mutex_unlock(&table->mutex);
 }
 
-void *mthca_table_find(struct mthca_icm_table *table, int obj)
+void *mthca_table_find(struct mthca_icm_table *table, int obj, dma_addr_t *dma_handle)
 {
-       int idx, offset, i;
+       int idx, offset, dma_offset, i;
        struct mthca_icm_chunk *chunk;
        struct mthca_icm *icm;
        struct page *page = NULL;
@@ -225,13 +284,22 @@ void *mthca_table_find(struct mthca_icm_table *table, int obj)
 
        idx = (obj & (table->num_obj - 1)) * table->obj_size;
        icm = table->icm[idx / MTHCA_TABLE_CHUNK_SIZE];
-       offset = idx % MTHCA_TABLE_CHUNK_SIZE;
+       dma_offset = offset = idx % MTHCA_TABLE_CHUNK_SIZE;
 
        if (!icm)
                goto out;
 
        list_for_each_entry(chunk, &icm->chunk_list, list) {
                for (i = 0; i < chunk->npages; ++i) {
+                       if (dma_handle && dma_offset >= 0) {
+                               if (sg_dma_len(&chunk->mem[i]) > dma_offset)
+                                       *dma_handle = sg_dma_address(&chunk->mem[i]) +
+                                               dma_offset;
+                               dma_offset -= sg_dma_len(&chunk->mem[i]);
+                       }
+                       /* DMA mapping can merge pages but not split them,
+                        * so if we found the page, dma_handle has already
+                        * been assigned to. */
                        if (chunk->mem[i].length > offset) {
                                page = chunk->mem[i].page;
                                goto out;
@@ -283,7 +351,7 @@ void mthca_table_put_range(struct mthca_dev *dev, struct mthca_icm_table *table,
 struct mthca_icm_table *mthca_alloc_icm_table(struct mthca_dev *dev,
                                              u64 virt, int obj_size,
                                              int nobj, int reserved,
-                                             int use_lowmem)
+                                             int use_lowmem, int use_coherent)
 {
        struct mthca_icm_table *table;
        int num_icm;
@@ -302,6 +370,7 @@ struct mthca_icm_table *mthca_alloc_icm_table(struct mthca_dev *dev,
        table->num_obj  = nobj;
        table->obj_size = obj_size;
        table->lowmem   = use_lowmem;
+       table->coherent = use_coherent;
        mutex_init(&table->mutex);
 
        for (i = 0; i < num_icm; ++i)
@@ -314,12 +383,12 @@ struct mthca_icm_table *mthca_alloc_icm_table(struct mthca_dev *dev,
 
                table->icm[i] = mthca_alloc_icm(dev, chunk_size >> PAGE_SHIFT,
                                                (use_lowmem ? GFP_KERNEL : GFP_HIGHUSER) |
-                                               __GFP_NOWARN);
+                                               __GFP_NOWARN, use_coherent);
                if (!table->icm[i])
                        goto err;
                if (mthca_MAP_ICM(dev, table->icm[i], virt + i * MTHCA_TABLE_CHUNK_SIZE,
                                  &status) || status) {
-                       mthca_free_icm(dev, table->icm[i]);
+                       mthca_free_icm(dev, table->icm[i], table->coherent);
                        table->icm[i] = NULL;
                        goto err;
                }
@@ -339,7 +408,7 @@ err:
                        mthca_UNMAP_ICM(dev, virt + i * MTHCA_TABLE_CHUNK_SIZE,
                                        MTHCA_TABLE_CHUNK_SIZE / MTHCA_ICM_PAGE_SIZE,
                                        &status);
-                       mthca_free_icm(dev, table->icm[i]);
+                       mthca_free_icm(dev, table->icm[i], table->coherent);
                }
 
        kfree(table);
@@ -357,7 +426,7 @@ void mthca_free_icm_table(struct mthca_dev *dev, struct mthca_icm_table *table)
                        mthca_UNMAP_ICM(dev, table->virt + i * MTHCA_TABLE_CHUNK_SIZE,
                                        MTHCA_TABLE_CHUNK_SIZE / MTHCA_ICM_PAGE_SIZE,
                                        &status);
-                       mthca_free_icm(dev, table->icm[i]);
+                       mthca_free_icm(dev, table->icm[i], table->coherent);
                }
 
        kfree(table);
index 6d42947e1dc448c35633a24d3280a25d58cc16da..594144145f45d8ae36c6e5324e14cb1c118b5cf8 100644 (file)
@@ -69,6 +69,7 @@ struct mthca_icm_table {
        int               num_obj;
        int               obj_size;
        int               lowmem;
+       int               coherent;
        struct mutex      mutex;
        struct mthca_icm *icm[0];
 };
@@ -82,17 +83,17 @@ struct mthca_icm_iter {
 struct mthca_dev;
 
 struct mthca_icm *mthca_alloc_icm(struct mthca_dev *dev, int npages,
-                                 gfp_t gfp_mask);
-void mthca_free_icm(struct mthca_dev *dev, struct mthca_icm *icm);
+                                 gfp_t gfp_mask, int coherent);
+void mthca_free_icm(struct mthca_dev *dev, struct mthca_icm *icm, int coherent);
 
 struct mthca_icm_table *mthca_alloc_icm_table(struct mthca_dev *dev,
                                              u64 virt, int obj_size,
                                              int nobj, int reserved,
-                                             int use_lowmem);
+                                             int use_lowmem, int use_coherent);
 void mthca_free_icm_table(struct mthca_dev *dev, struct mthca_icm_table *table);
 int mthca_table_get(struct mthca_dev *dev, struct mthca_icm_table *table, int obj);
 void mthca_table_put(struct mthca_dev *dev, struct mthca_icm_table *table, int obj);
-void *mthca_table_find(struct mthca_icm_table *table, int obj);
+void *mthca_table_find(struct mthca_icm_table *table, int obj, dma_addr_t *dma_handle);
 int mthca_table_get_range(struct mthca_dev *dev, struct mthca_icm_table *table,
                          int start, int end);
 void mthca_table_put_range(struct mthca_dev *dev, struct mthca_icm_table *table,
index f71ffa88db3a1066906ffbf261c9273c80338b06..6037dd3f87dfa16e8a165a9c41adc17538e69b51 100644 (file)
@@ -243,8 +243,8 @@ void mthca_free_mtt(struct mthca_dev *dev, struct mthca_mtt *mtt)
        kfree(mtt);
 }
 
-int mthca_write_mtt(struct mthca_dev *dev, struct mthca_mtt *mtt,
-                   int start_index, u64 *buffer_list, int list_len)
+static int __mthca_write_mtt(struct mthca_dev *dev, struct mthca_mtt *mtt,
+                            int start_index, u64 *buffer_list, int list_len)
 {
        struct mthca_mailbox *mailbox;
        __be64 *mtt_entry;
@@ -295,6 +295,84 @@ out:
        return err;
 }
 
+int mthca_write_mtt_size(struct mthca_dev *dev)
+{
+       if (dev->mr_table.fmr_mtt_buddy != &dev->mr_table.mtt_buddy)
+               /*
+                * Be friendly to WRITE_MTT command
+                * and leave two empty slots for the
+                * index and reserved fields of the
+                * mailbox.
+                */
+               return PAGE_SIZE / sizeof (u64) - 2;
+
+       /* For Arbel, all MTTs must fit in the same page. */
+       return mthca_is_memfree(dev) ? (PAGE_SIZE / sizeof (u64)) : 0x7ffffff;
+}
+
+void mthca_tavor_write_mtt_seg(struct mthca_dev *dev, struct mthca_mtt *mtt,
+                             int start_index, u64 *buffer_list, int list_len)
+{
+       u64 __iomem *mtts;
+       int i;
+
+       mtts = dev->mr_table.tavor_fmr.mtt_base + mtt->first_seg * MTHCA_MTT_SEG_SIZE +
+               start_index * sizeof (u64);
+       for (i = 0; i < list_len; ++i)
+               mthca_write64_raw(cpu_to_be64(buffer_list[i] | MTHCA_MTT_FLAG_PRESENT),
+                                 mtts + i);
+}
+
+void mthca_arbel_write_mtt_seg(struct mthca_dev *dev, struct mthca_mtt *mtt,
+                             int start_index, u64 *buffer_list, int list_len)
+{
+       __be64 *mtts;
+       dma_addr_t dma_handle;
+       int i;
+       int s = start_index * sizeof (u64);
+
+       /* For Arbel, all MTTs must fit in the same page. */
+       BUG_ON(s / PAGE_SIZE != (s + list_len * sizeof(u64) - 1) / PAGE_SIZE);
+       /* Require full segments */
+       BUG_ON(s % MTHCA_MTT_SEG_SIZE);
+
+       mtts = mthca_table_find(dev->mr_table.mtt_table, mtt->first_seg +
+                               s / MTHCA_MTT_SEG_SIZE, &dma_handle);
+
+       BUG_ON(!mtts);
+
+       for (i = 0; i < list_len; ++i)
+               mtts[i] = cpu_to_be64(buffer_list[i] | MTHCA_MTT_FLAG_PRESENT);
+
+       dma_sync_single(&dev->pdev->dev, dma_handle, list_len * sizeof (u64), DMA_TO_DEVICE);
+}
+
+int mthca_write_mtt(struct mthca_dev *dev, struct mthca_mtt *mtt,
+                   int start_index, u64 *buffer_list, int list_len)
+{
+       int size = mthca_write_mtt_size(dev);
+       int chunk;
+
+       if (dev->mr_table.fmr_mtt_buddy != &dev->mr_table.mtt_buddy)
+               return __mthca_write_mtt(dev, mtt, start_index, buffer_list, list_len);
+
+       while (list_len > 0) {
+               chunk = min(size, list_len);
+               if (mthca_is_memfree(dev))
+                       mthca_arbel_write_mtt_seg(dev, mtt, start_index,
+                                                 buffer_list, chunk);
+               else
+                       mthca_tavor_write_mtt_seg(dev, mtt, start_index,
+                                                 buffer_list, chunk);
+
+               list_len    -= chunk;
+               start_index += chunk;
+               buffer_list += chunk;
+       }
+
+       return 0;
+}
+
 static inline u32 tavor_hw_index_to_key(u32 ind)
 {
        return ind;
@@ -524,7 +602,7 @@ int mthca_fmr_alloc(struct mthca_dev *dev, u32 pd,
                if (err)
                        goto err_out_mpt_free;
 
-               mr->mem.arbel.mpt = mthca_table_find(dev->mr_table.mpt_table, key);
+               mr->mem.arbel.mpt = mthca_table_find(dev->mr_table.mpt_table, key, NULL);
                BUG_ON(!mr->mem.arbel.mpt);
        } else
                mr->mem.tavor.mpt = dev->mr_table.tavor_fmr.mpt_base +
@@ -538,7 +616,8 @@ int mthca_fmr_alloc(struct mthca_dev *dev, u32 pd,
 
        if (mthca_is_memfree(dev)) {
                mr->mem.arbel.mtts = mthca_table_find(dev->mr_table.mtt_table,
-                                                     mr->mtt->first_seg);
+                                                     mr->mtt->first_seg,
+                                                     &mr->mem.arbel.dma_handle);
                BUG_ON(!mr->mem.arbel.mtts);
        } else
                mr->mem.tavor.mtts = dev->mr_table.tavor_fmr.mtt_base + mtt_seg;
@@ -712,6 +791,9 @@ int mthca_arbel_map_phys_fmr(struct ib_fmr *ibfmr, u64 *page_list,
                fmr->mem.arbel.mtts[i] = cpu_to_be64(page_list[i] |
                                                     MTHCA_MTT_FLAG_PRESENT);
 
+       dma_sync_single(&dev->pdev->dev, fmr->mem.arbel.dma_handle,
+                       list_len * sizeof(u64), DMA_TO_DEVICE);
+
        fmr->mem.arbel.mpt->key    = cpu_to_be32(key);
        fmr->mem.arbel.mpt->lkey   = cpu_to_be32(key);
        fmr->mem.arbel.mpt->length = cpu_to_be64(list_len * (1ull << fmr->attr.page_shift));
@@ -761,7 +843,7 @@ void mthca_arbel_fmr_unmap(struct mthca_dev *dev, struct mthca_fmr *fmr)
 int mthca_init_mr_table(struct mthca_dev *dev)
 {
        unsigned long addr;
-       int err, i;
+       int mpts, mtts, err, i;
 
        err = mthca_alloc_init(&dev->mr_table.mpt_alloc,
                               dev->limits.num_mpts,
@@ -795,13 +877,21 @@ int mthca_init_mr_table(struct mthca_dev *dev)
                        err = -EINVAL;
                        goto err_fmr_mpt;
                }
+               mpts = mtts = 1 << i;
+       } else {
+               mpts = dev->limits.num_mtt_segs;
+               mtts = dev->limits.num_mpts;
+       }
+
+       if (!mthca_is_memfree(dev) &&
+           (dev->mthca_flags & MTHCA_FLAG_FMR)) {
 
                addr = pci_resource_start(dev->pdev, 4) +
                        ((pci_resource_len(dev->pdev, 4) - 1) &
                         dev->mr_table.mpt_base);
 
                dev->mr_table.tavor_fmr.mpt_base =
-                       ioremap(addr, (1 << i) * sizeof(struct mthca_mpt_entry));
+                       ioremap(addr, mpts * sizeof(struct mthca_mpt_entry));
 
                if (!dev->mr_table.tavor_fmr.mpt_base) {
                        mthca_warn(dev, "MPT ioremap for FMR failed.\n");
@@ -814,19 +904,21 @@ int mthca_init_mr_table(struct mthca_dev *dev)
                         dev->mr_table.mtt_base);
 
                dev->mr_table.tavor_fmr.mtt_base =
-                       ioremap(addr, (1 << i) * MTHCA_MTT_SEG_SIZE);
+                       ioremap(addr, mtts * MTHCA_MTT_SEG_SIZE);
                if (!dev->mr_table.tavor_fmr.mtt_base) {
                        mthca_warn(dev, "MTT ioremap for FMR failed.\n");
                        err = -ENOMEM;
                        goto err_fmr_mtt;
                }
+       }
 
-               err = mthca_buddy_init(&dev->mr_table.tavor_fmr.mtt_buddy, i);
+       if (dev->limits.fmr_reserved_mtts) {
+               err = mthca_buddy_init(&dev->mr_table.tavor_fmr.mtt_buddy, fls(mtts - 1));
                if (err)
                        goto err_fmr_mtt_buddy;
 
                /* Prevent regular MRs from using FMR keys */
-               err = mthca_buddy_alloc(&dev->mr_table.mtt_buddy, i);
+               err = mthca_buddy_alloc(&dev->mr_table.mtt_buddy, fls(mtts - 1));
                if (err)
                        goto err_reserve_fmr;
 
index 58d44aa3c30297a6920c8b292a27cb458b1a7763..26bf86d1cfcd693cf29cdc19bd9704ec916b65de 100644 (file)
@@ -277,7 +277,7 @@ u64 mthca_make_profile(struct mthca_dev *dev,
         * out of the MR pool. They don't use additional memory, but
         * we assign them as part of the HCA profile anyway.
         */
-       if (mthca_is_memfree(dev))
+       if (mthca_is_memfree(dev) || BITS_PER_LONG == 64)
                dev->limits.fmr_reserved_mtts = 0;
        else
                dev->limits.fmr_reserved_mtts = request->fmr_reserved_mtts;
index 7b96751695eac20deb60c8c60e13eb2032a0763f..0725ad7ad9bf7ca43b31f96609311bb2defbfea9 100644 (file)
@@ -1015,6 +1015,7 @@ static struct ib_mr *mthca_reg_user_mr(struct ib_pd *pd, struct ib_umem *region,
        int shift, n, len;
        int i, j, k;
        int err = 0;
+       int write_mtt_size;
 
        shift = ffs(region->page_size) - 1;
 
@@ -1040,6 +1041,8 @@ static struct ib_mr *mthca_reg_user_mr(struct ib_pd *pd, struct ib_umem *region,
 
        i = n = 0;
 
+       write_mtt_size = min(mthca_write_mtt_size(dev), (int) (PAGE_SIZE / sizeof *pages));
+
        list_for_each_entry(chunk, &region->chunk_list, list)
                for (j = 0; j < chunk->nmap; ++j) {
                        len = sg_dma_len(&chunk->page_list[j]) >> shift;
@@ -1047,14 +1050,11 @@ static struct ib_mr *mthca_reg_user_mr(struct ib_pd *pd, struct ib_umem *region,
                                pages[i++] = sg_dma_address(&chunk->page_list[j]) +
                                        region->page_size * k;
                                /*
-                                * Be friendly to WRITE_MTT command
-                                * and leave two empty slots for the
-                                * index and reserved fields of the
-                                * mailbox.
+                                * Be friendly to write_mtt and pass it chunks
+                                * of appropriate size.
                                 */
-                               if (i == PAGE_SIZE / sizeof (u64) - 2) {
-                                       err = mthca_write_mtt(dev, mr->mtt,
-                                                             n, pages, i);
+                               if (i == write_mtt_size) {
+                                       err = mthca_write_mtt(dev, mr->mtt, n, pages, i);
                                        if (err)
                                                goto mtt_done;
                                        n += i;
index 9a5bece3fa5c28eaf9ffb1fda134cb8785d39cac..1d266ac2e094c404d2cd8d3167261c07e20c0f6d 100644 (file)
@@ -89,6 +89,7 @@ struct mthca_fmr {
                struct {
                        struct mthca_mpt_entry *mpt;
                        __be64 *mtts;
+                       dma_addr_t dma_handle;
                } arbel;
        } mem;
 };
index 5f5214c0337d18383ad6f2272b99fbd47f68a69b..224c93dd29eb7ecd9c56e8df0044aaa5c6609277 100644 (file)
@@ -399,7 +399,7 @@ static int to_ib_qp_access_flags(int mthca_flags)
 static void to_ib_ah_attr(struct mthca_dev *dev, struct ib_ah_attr *ib_ah_attr,
                                struct mthca_qp_path *path)
 {
-       memset(ib_ah_attr, 0, sizeof *path);
+       memset(ib_ah_attr, 0, sizeof *ib_ah_attr);
        ib_ah_attr->port_num      = (be32_to_cpu(path->port_pkey) >> 24) & 0x3;
 
        if (ib_ah_attr->port_num == 0 || ib_ah_attr->port_num > dev->limits.num_ports)
index 10684da33d5853e18e0cea25d9b219fbcd2b3b54..61974b0296ca132e26feacb70d10e556f2d706b4 100644 (file)
@@ -116,11 +116,16 @@ static void mthca_arbel_init_srq_context(struct mthca_dev *dev,
                                         struct mthca_srq *srq,
                                         struct mthca_arbel_srq_context *context)
 {
-       int logsize;
+       int logsize, max;
 
        memset(context, 0, sizeof *context);
 
-       logsize = ilog2(srq->max);
+       /*
+        * Put max in a temporary variable to work around gcc bug
+        * triggered by ilog2() on sparc64.
+        */
+       max = srq->max;
+       logsize = ilog2(max);
        context->state_logsize_srqn = cpu_to_be32(logsize << 24 | srq->srqn);
        context->lkey = cpu_to_be32(srq->mr.ibmr.lkey);
        context->db_index = cpu_to_be32(srq->db_index);
index c75322d820d42815cacd872e5574f1432abe695c..af78ccc4ce7108aba6968b5438a0d8adbc7be4f2 100644 (file)
@@ -1,6 +1,6 @@
 config INFINIBAND_IPOIB
        tristate "IP-over-InfiniBand"
-       depends on INFINIBAND && NETDEVICES && INET
+       depends on INFINIBAND && NETDEVICES && INET && (IPV6 || IPV6=n)
        ---help---
          Support for the IP-over-InfiniBand protocol (IPoIB). This
          transports IP packets over InfiniBand so you can use your IB
@@ -8,6 +8,20 @@ config INFINIBAND_IPOIB
 
          See Documentation/infiniband/ipoib.txt for more information
 
+config INFINIBAND_IPOIB_CM
+       bool "IP-over-InfiniBand Connected Mode support"
+       depends on INFINIBAND_IPOIB && EXPERIMENTAL
+       default n
+       ---help---
+         This option enables experimental support for IPoIB connected mode.
+         After enabling this option, you need to switch to connected mode through
+         /sys/class/net/ibXXX/mode to actually create connections, and then increase
+         the interface MTU with e.g. ifconfig ib0 mtu 65520.
+
+         WARNING: Enabling connected mode will trigger some
+         packet drops for multicast and UD mode traffic from this interface,
+         unless you limit mtu for these destinations to 2044.
+
 config INFINIBAND_IPOIB_DEBUG
        bool "IP-over-InfiniBand debugging" if EMBEDDED
        depends on INFINIBAND_IPOIB
index 8935e74ae3f8e9608ced0be86d2e3818db268dd8..98ee38e8c2c4bcc465149ecd3d550bd879ceac2a 100644 (file)
@@ -5,5 +5,6 @@ ib_ipoib-y                                      := ipoib_main.o \
                                                   ipoib_multicast.o \
                                                   ipoib_verbs.o \
                                                   ipoib_vlan.o
+ib_ipoib-$(CONFIG_INFINIBAND_IPOIB_CM)         += ipoib_cm.o
 ib_ipoib-$(CONFIG_INFINIBAND_IPOIB_DEBUG)      += ipoib_fs.o
 
index 07deee8f81ce203e7be98161af36d6cb3a73a6b8..2594db2030b3abef14ac28b9373c3b41999c7c54 100644 (file)
@@ -62,6 +62,10 @@ enum {
 
        IPOIB_ENCAP_LEN           = 4,
 
+       IPOIB_CM_MTU              = 0x10000 - 0x10, /* padding to align header to 16 */
+       IPOIB_CM_BUF_SIZE         = IPOIB_CM_MTU  + IPOIB_ENCAP_LEN,
+       IPOIB_CM_HEAD_SIZE        = IPOIB_CM_BUF_SIZE % PAGE_SIZE,
+       IPOIB_CM_RX_SG            = ALIGN(IPOIB_CM_BUF_SIZE, PAGE_SIZE) / PAGE_SIZE,
        IPOIB_RX_RING_SIZE        = 128,
        IPOIB_TX_RING_SIZE        = 64,
        IPOIB_MAX_QUEUE_SIZE      = 8192,
@@ -81,6 +85,8 @@ enum {
        IPOIB_MCAST_RUN           = 6,
        IPOIB_STOP_REAPER         = 7,
        IPOIB_MCAST_STARTED       = 8,
+       IPOIB_FLAG_NETIF_STOPPED  = 9,
+       IPOIB_FLAG_ADMIN_CM       = 10,
 
        IPOIB_MAX_BACKOFF_SECONDS = 16,
 
@@ -90,6 +96,13 @@ enum {
        IPOIB_MCAST_FLAG_ATTACHED = 3,
 };
 
+#define        IPOIB_OP_RECV   (1ul << 31)
+#ifdef CONFIG_INFINIBAND_IPOIB_CM
+#define        IPOIB_CM_OP_SRQ (1ul << 30)
+#else
+#define        IPOIB_CM_OP_SRQ (0)
+#endif
+
 /* structs */
 
 struct ipoib_header {
@@ -113,6 +126,59 @@ struct ipoib_tx_buf {
        u64             mapping;
 };
 
+struct ib_cm_id;
+
+struct ipoib_cm_data {
+       __be32 qpn; /* High byte MUST be ignored on receive */
+       __be32 mtu;
+};
+
+struct ipoib_cm_rx {
+       struct ib_cm_id     *id;
+       struct ib_qp        *qp;
+       struct list_head     list;
+       struct net_device   *dev;
+       unsigned long        jiffies;
+};
+
+struct ipoib_cm_tx {
+       struct ib_cm_id     *id;
+       struct ib_cq        *cq;
+       struct ib_qp        *qp;
+       struct list_head     list;
+       struct net_device   *dev;
+       struct ipoib_neigh  *neigh;
+       struct ipoib_path   *path;
+       struct ipoib_tx_buf *tx_ring;
+       unsigned             tx_head;
+       unsigned             tx_tail;
+       unsigned long        flags;
+       u32                  mtu;
+       struct ib_wc         ibwc[IPOIB_NUM_WC];
+};
+
+struct ipoib_cm_rx_buf {
+       struct sk_buff *skb;
+       u64 mapping[IPOIB_CM_RX_SG];
+};
+
+struct ipoib_cm_dev_priv {
+       struct ib_srq          *srq;
+       struct ipoib_cm_rx_buf *srq_ring;
+       struct ib_cm_id        *id;
+       struct list_head        passive_ids;
+       struct work_struct      start_task;
+       struct work_struct      reap_task;
+       struct work_struct      skb_task;
+       struct delayed_work     stale_task;
+       struct sk_buff_head     skb_queue;
+       struct list_head        start_list;
+       struct list_head        reap_list;
+       struct ib_wc            ibwc[IPOIB_NUM_WC];
+       struct ib_sge           rx_sge[IPOIB_CM_RX_SG];
+       struct ib_recv_wr       rx_wr;
+};
+
 /*
  * Device private locking: tx_lock protects members used in TX fast
  * path (and we use LLTX so upper layers don't do extra locking).
@@ -179,6 +245,10 @@ struct ipoib_dev_priv {
        struct list_head child_intfs;
        struct list_head list;
 
+#ifdef CONFIG_INFINIBAND_IPOIB_CM
+       struct ipoib_cm_dev_priv cm;
+#endif
+
 #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG
        struct list_head fs_list;
        struct dentry *mcg_dentry;
@@ -212,6 +282,9 @@ struct ipoib_path {
 
 struct ipoib_neigh {
        struct ipoib_ah    *ah;
+#ifdef CONFIG_INFINIBAND_IPOIB_CM
+       struct ipoib_cm_tx *cm;
+#endif
        union ib_gid        dgid;
        struct sk_buff_head queue;
 
@@ -315,6 +388,146 @@ int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey);
 void ipoib_pkey_poll(struct work_struct *work);
 int ipoib_pkey_dev_delay_open(struct net_device *dev);
 
+#ifdef CONFIG_INFINIBAND_IPOIB_CM
+
+#define IPOIB_FLAGS_RC          0x80
+#define IPOIB_FLAGS_UC          0x40
+
+/* We don't support UC connections at the moment */
+#define IPOIB_CM_SUPPORTED(ha)   (ha[0] & (IPOIB_FLAGS_RC))
+
+static inline int ipoib_cm_admin_enabled(struct net_device *dev)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       return IPOIB_CM_SUPPORTED(dev->dev_addr) &&
+               test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
+}
+
+static inline int ipoib_cm_enabled(struct net_device *dev, struct neighbour *n)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       return IPOIB_CM_SUPPORTED(n->ha) &&
+               test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
+}
+
+static inline int ipoib_cm_up(struct ipoib_neigh *neigh)
+
+{
+       return test_bit(IPOIB_FLAG_OPER_UP, &neigh->cm->flags);
+}
+
+static inline struct ipoib_cm_tx *ipoib_cm_get(struct ipoib_neigh *neigh)
+{
+       return neigh->cm;
+}
+
+static inline void ipoib_cm_set(struct ipoib_neigh *neigh, struct ipoib_cm_tx *tx)
+{
+       neigh->cm = tx;
+}
+
+void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_tx *tx);
+int ipoib_cm_dev_open(struct net_device *dev);
+void ipoib_cm_dev_stop(struct net_device *dev);
+int ipoib_cm_dev_init(struct net_device *dev);
+int ipoib_cm_add_mode_attr(struct net_device *dev);
+void ipoib_cm_dev_cleanup(struct net_device *dev);
+struct ipoib_cm_tx *ipoib_cm_create_tx(struct net_device *dev, struct ipoib_path *path,
+                                   struct ipoib_neigh *neigh);
+void ipoib_cm_destroy_tx(struct ipoib_cm_tx *tx);
+void ipoib_cm_skb_too_long(struct net_device* dev, struct sk_buff *skb,
+                          unsigned int mtu);
+void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc);
+#else
+
+struct ipoib_cm_tx;
+
+static inline int ipoib_cm_admin_enabled(struct net_device *dev)
+{
+       return 0;
+}
+static inline int ipoib_cm_enabled(struct net_device *dev, struct neighbour *n)
+
+{
+       return 0;
+}
+
+static inline int ipoib_cm_up(struct ipoib_neigh *neigh)
+
+{
+       return 0;
+}
+
+static inline struct ipoib_cm_tx *ipoib_cm_get(struct ipoib_neigh *neigh)
+{
+       return NULL;
+}
+
+static inline void ipoib_cm_set(struct ipoib_neigh *neigh, struct ipoib_cm_tx *tx)
+{
+}
+
+static inline
+void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_tx *tx)
+{
+       return;
+}
+
+static inline
+int ipoib_cm_dev_open(struct net_device *dev)
+{
+       return 0;
+}
+
+static inline
+void ipoib_cm_dev_stop(struct net_device *dev)
+{
+       return;
+}
+
+static inline
+int ipoib_cm_dev_init(struct net_device *dev)
+{
+       return -ENOSYS;
+}
+
+static inline
+void ipoib_cm_dev_cleanup(struct net_device *dev)
+{
+       return;
+}
+
+static inline
+struct ipoib_cm_tx *ipoib_cm_create_tx(struct net_device *dev, struct ipoib_path *path,
+                                   struct ipoib_neigh *neigh)
+{
+       return NULL;
+}
+
+static inline
+void ipoib_cm_destroy_tx(struct ipoib_cm_tx *tx)
+{
+       return;
+}
+
+static inline
+int ipoib_cm_add_mode_attr(struct net_device *dev)
+{
+       return 0;
+}
+
+static inline void ipoib_cm_skb_too_long(struct net_device* dev, struct sk_buff *skb,
+                                        unsigned int mtu)
+{
+       dev_kfree_skb_any(skb);
+}
+
+static inline void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
+{
+}
+
+#endif
+
 #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG
 void ipoib_create_debug_files(struct net_device *dev);
 void ipoib_delete_debug_files(struct net_device *dev);
@@ -392,4 +605,6 @@ extern int ipoib_debug_level;
 
 #define IPOIB_GID_ARG(gid)     IPOIB_GID_RAW_ARG((gid).raw)
 
+#define IPOIB_QPN(ha) (be32_to_cpup((__be32 *) ha) & 0xffffff)
+
 #endif /* _IPOIB_H */
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
new file mode 100644 (file)
index 0000000..2d48387
--- /dev/null
@@ -0,0 +1,1237 @@
+/*
+ * Copyright (c) 2006 Mellanox Technologies. All rights reserved
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenIB.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * $Id$
+ */
+
+#include <rdma/ib_cm.h>
+#include <rdma/ib_cache.h>
+#include <net/dst.h>
+#include <net/icmp.h>
+#include <linux/icmpv6.h>
+
+#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG_DATA
+static int data_debug_level;
+
+module_param_named(cm_data_debug_level, data_debug_level, int, 0644);
+MODULE_PARM_DESC(cm_data_debug_level,
+                "Enable data path debug tracing for connected mode if > 0");
+#endif
+
+#include "ipoib.h"
+
+#define IPOIB_CM_IETF_ID 0x1000000000000000ULL
+
+#define IPOIB_CM_RX_UPDATE_TIME (256 * HZ)
+#define IPOIB_CM_RX_TIMEOUT     (2 * 256 * HZ)
+#define IPOIB_CM_RX_DELAY       (3 * 256 * HZ)
+#define IPOIB_CM_RX_UPDATE_MASK (0x3)
+
+struct ipoib_cm_id {
+       struct ib_cm_id *id;
+       int flags;
+       u32 remote_qpn;
+       u32 remote_mtu;
+};
+
+static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id,
+                              struct ib_cm_event *event);
+
+static void ipoib_cm_dma_unmap_rx(struct ipoib_dev_priv *priv,
+                                 u64 mapping[IPOIB_CM_RX_SG])
+{
+       int i;
+
+       ib_dma_unmap_single(priv->ca, mapping[0], IPOIB_CM_HEAD_SIZE, DMA_FROM_DEVICE);
+
+       for (i = 0; i < IPOIB_CM_RX_SG - 1; ++i)
+               ib_dma_unmap_single(priv->ca, mapping[i + 1], PAGE_SIZE, DMA_FROM_DEVICE);
+}
+
+static int ipoib_cm_post_receive(struct net_device *dev, int id)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       struct ib_recv_wr *bad_wr;
+       int i, ret;
+
+       priv->cm.rx_wr.wr_id = id | IPOIB_CM_OP_SRQ;
+
+       for (i = 0; i < IPOIB_CM_RX_SG; ++i)
+               priv->cm.rx_sge[i].addr = priv->cm.srq_ring[id].mapping[i];
+
+       ret = ib_post_srq_recv(priv->cm.srq, &priv->cm.rx_wr, &bad_wr);
+       if (unlikely(ret)) {
+               ipoib_warn(priv, "post srq failed for buf %d (%d)\n", id, ret);
+               ipoib_cm_dma_unmap_rx(priv, priv->cm.srq_ring[id].mapping);
+               dev_kfree_skb_any(priv->cm.srq_ring[id].skb);
+               priv->cm.srq_ring[id].skb = NULL;
+       }
+
+       return ret;
+}
+
+static int ipoib_cm_alloc_rx_skb(struct net_device *dev, int id,
+                                u64 mapping[IPOIB_CM_RX_SG])
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       struct sk_buff *skb;
+       int i;
+
+       skb = dev_alloc_skb(IPOIB_CM_HEAD_SIZE + 12);
+       if (unlikely(!skb))
+               return -ENOMEM;
+
+       /*
+        * IPoIB adds a 4 byte header. So we need 12 more bytes to align the
+        * IP header to a multiple of 16.
+        */
+       skb_reserve(skb, 12);
+
+       mapping[0] = ib_dma_map_single(priv->ca, skb->data, IPOIB_CM_HEAD_SIZE,
+                                      DMA_FROM_DEVICE);
+       if (unlikely(ib_dma_mapping_error(priv->ca, mapping[0]))) {
+               dev_kfree_skb_any(skb);
+               return -EIO;
+       }
+
+       for (i = 0; i < IPOIB_CM_RX_SG - 1; i++) {
+               struct page *page = alloc_page(GFP_ATOMIC);
+
+               if (!page)
+                       goto partial_error;
+               skb_fill_page_desc(skb, i, page, 0, PAGE_SIZE);
+
+               mapping[i + 1] = ib_dma_map_page(priv->ca, skb_shinfo(skb)->frags[i].page,
+                                                0, PAGE_SIZE, DMA_TO_DEVICE);
+               if (unlikely(ib_dma_mapping_error(priv->ca, mapping[i + 1])))
+                       goto partial_error;
+       }
+
+       priv->cm.srq_ring[id].skb = skb;
+       return 0;
+
+partial_error:
+
+       ib_dma_unmap_single(priv->ca, mapping[0], IPOIB_CM_HEAD_SIZE, DMA_FROM_DEVICE);
+
+       for (; i >= 0; --i)
+               ib_dma_unmap_single(priv->ca, mapping[i + 1], PAGE_SIZE, DMA_FROM_DEVICE);
+
+       kfree_skb(skb);
+       return -ENOMEM;
+}
+
+static struct ib_qp *ipoib_cm_create_rx_qp(struct net_device *dev,
+                                          struct ipoib_cm_rx *p)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       struct ib_qp_init_attr attr = {
+               .send_cq = priv->cq, /* does not matter, we never send anything */
+               .recv_cq = priv->cq,
+               .srq = priv->cm.srq,
+               .cap.max_send_wr = 1, /* FIXME: 0 Seems not to work */
+               .cap.max_send_sge = 1, /* FIXME: 0 Seems not to work */
+               .sq_sig_type = IB_SIGNAL_ALL_WR,
+               .qp_type = IB_QPT_RC,
+               .qp_context = p,
+       };
+       return ib_create_qp(priv->pd, &attr);
+}
+
+static int ipoib_cm_modify_rx_qp(struct net_device *dev,
+                                 struct ib_cm_id *cm_id, struct ib_qp *qp,
+                                 unsigned psn)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       struct ib_qp_attr qp_attr;
+       int qp_attr_mask, ret;
+
+       qp_attr.qp_state = IB_QPS_INIT;
+       ret = ib_cm_init_qp_attr(cm_id, &qp_attr, &qp_attr_mask);
+       if (ret) {
+               ipoib_warn(priv, "failed to init QP attr for INIT: %d\n", ret);
+               return ret;
+       }
+       ret = ib_modify_qp(qp, &qp_attr, qp_attr_mask);
+       if (ret) {
+               ipoib_warn(priv, "failed to modify QP to INIT: %d\n", ret);
+               return ret;
+       }
+       qp_attr.qp_state = IB_QPS_RTR;
+       ret = ib_cm_init_qp_attr(cm_id, &qp_attr, &qp_attr_mask);
+       if (ret) {
+               ipoib_warn(priv, "failed to init QP attr for RTR: %d\n", ret);
+               return ret;
+       }
+       qp_attr.rq_psn = psn;
+       ret = ib_modify_qp(qp, &qp_attr, qp_attr_mask);
+       if (ret) {
+               ipoib_warn(priv, "failed to modify QP to RTR: %d\n", ret);
+               return ret;
+       }
+       return 0;
+}
+
+static int ipoib_cm_send_rep(struct net_device *dev, struct ib_cm_id *cm_id,
+                            struct ib_qp *qp, struct ib_cm_req_event_param *req,
+                            unsigned psn)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       struct ipoib_cm_data data = {};
+       struct ib_cm_rep_param rep = {};
+
+       data.qpn = cpu_to_be32(priv->qp->qp_num);
+       data.mtu = cpu_to_be32(IPOIB_CM_BUF_SIZE);
+
+       rep.private_data = &data;
+       rep.private_data_len = sizeof data;
+       rep.flow_control = 0;
+       rep.rnr_retry_count = req->rnr_retry_count;
+       rep.target_ack_delay = 20; /* FIXME */
+       rep.srq = 1;
+       rep.qp_num = qp->qp_num;
+       rep.starting_psn = psn;
+       return ib_send_cm_rep(cm_id, &rep);
+}
+
+static int ipoib_cm_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event)
+{
+       struct net_device *dev = cm_id->context;
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       struct ipoib_cm_rx *p;
+       unsigned long flags;
+       unsigned psn;
+       int ret;
+
+       ipoib_dbg(priv, "REQ arrived\n");
+       p = kzalloc(sizeof *p, GFP_KERNEL);
+       if (!p)
+               return -ENOMEM;
+       p->dev = dev;
+       p->id = cm_id;
+       p->qp = ipoib_cm_create_rx_qp(dev, p);
+       if (IS_ERR(p->qp)) {
+               ret = PTR_ERR(p->qp);
+               goto err_qp;
+       }
+
+       psn = random32() & 0xffffff;
+       ret = ipoib_cm_modify_rx_qp(dev, cm_id, p->qp, psn);
+       if (ret)
+               goto err_modify;
+
+       ret = ipoib_cm_send_rep(dev, cm_id, p->qp, &event->param.req_rcvd, psn);
+       if (ret) {
+               ipoib_warn(priv, "failed to send REP: %d\n", ret);
+               goto err_rep;
+       }
+
+       cm_id->context = p;
+       p->jiffies = jiffies;
+       spin_lock_irqsave(&priv->lock, flags);
+       list_add(&p->list, &priv->cm.passive_ids);
+       spin_unlock_irqrestore(&priv->lock, flags);
+       queue_delayed_work(ipoib_workqueue,
+                          &priv->cm.stale_task, IPOIB_CM_RX_DELAY);
+       return 0;
+
+err_rep:
+err_modify:
+       ib_destroy_qp(p->qp);
+err_qp:
+       kfree(p);
+       return ret;
+}
+
+static int ipoib_cm_rx_handler(struct ib_cm_id *cm_id,
+                              struct ib_cm_event *event)
+{
+       struct ipoib_cm_rx *p;
+       struct ipoib_dev_priv *priv;
+       unsigned long flags;
+       int ret;
+
+       switch (event->event) {
+       case IB_CM_REQ_RECEIVED:
+               return ipoib_cm_req_handler(cm_id, event);
+       case IB_CM_DREQ_RECEIVED:
+               p = cm_id->context;
+               ib_send_cm_drep(cm_id, NULL, 0);
+               /* Fall through */
+       case IB_CM_REJ_RECEIVED:
+               p = cm_id->context;
+               priv = netdev_priv(p->dev);
+               spin_lock_irqsave(&priv->lock, flags);
+               if (list_empty(&p->list))
+                       ret = 0; /* Connection is going away already. */
+               else {
+                       list_del_init(&p->list);
+                       ret = -ECONNRESET;
+               }
+               spin_unlock_irqrestore(&priv->lock, flags);
+               if (ret) {
+                       ib_destroy_qp(p->qp);
+                       kfree(p);
+                       return ret;
+               }
+               return 0;
+       default:
+               return 0;
+       }
+}
+/* Adjust length of skb with fragments to match received data */
+static void skb_put_frags(struct sk_buff *skb, unsigned int hdr_space,
+                         unsigned int length)
+{
+       int i, num_frags;
+       unsigned int size;
+
+       /* put header into skb */
+       size = min(length, hdr_space);
+       skb->tail += size;
+       skb->len += size;
+       length -= size;
+
+       num_frags = skb_shinfo(skb)->nr_frags;
+       for (i = 0; i < num_frags; i++) {
+               skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
+
+               if (length == 0) {
+                       /* don't need this page */
+                       __free_page(frag->page);
+                       --skb_shinfo(skb)->nr_frags;
+               } else {
+                       size = min(length, (unsigned) PAGE_SIZE);
+
+                       frag->size = size;
+                       skb->data_len += size;
+                       skb->truesize += size;
+                       skb->len += size;
+                       length -= size;
+               }
+       }
+}
+
+void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       unsigned int wr_id = wc->wr_id & ~IPOIB_CM_OP_SRQ;
+       struct sk_buff *skb;
+       struct ipoib_cm_rx *p;
+       unsigned long flags;
+       u64 mapping[IPOIB_CM_RX_SG];
+
+       ipoib_dbg_data(priv, "cm recv completion: id %d, op %d, status: %d\n",
+                      wr_id, wc->opcode, wc->status);
+
+       if (unlikely(wr_id >= ipoib_recvq_size)) {
+               ipoib_warn(priv, "cm recv completion event with wrid %d (> %d)\n",
+                          wr_id, ipoib_recvq_size);
+               return;
+       }
+
+       skb  = priv->cm.srq_ring[wr_id].skb;
+
+       if (unlikely(wc->status != IB_WC_SUCCESS)) {
+               ipoib_dbg(priv, "cm recv error "
+                          "(status=%d, wrid=%d vend_err %x)\n",
+                          wc->status, wr_id, wc->vendor_err);
+               ++priv->stats.rx_dropped;
+               goto repost;
+       }
+
+       if (!likely(wr_id & IPOIB_CM_RX_UPDATE_MASK)) {
+               p = wc->qp->qp_context;
+               if (time_after_eq(jiffies, p->jiffies + IPOIB_CM_RX_UPDATE_TIME)) {
+                       spin_lock_irqsave(&priv->lock, flags);
+                       p->jiffies = jiffies;
+                       /* Move this entry to list head, but do
+                        * not re-add it if it has been removed. */
+                       if (!list_empty(&p->list))
+                               list_move(&p->list, &priv->cm.passive_ids);
+                       spin_unlock_irqrestore(&priv->lock, flags);
+                       queue_delayed_work(ipoib_workqueue,
+                                          &priv->cm.stale_task, IPOIB_CM_RX_DELAY);
+               }
+       }
+
+       if (unlikely(ipoib_cm_alloc_rx_skb(dev, wr_id, mapping))) {
+               /*
+                * If we can't allocate a new RX buffer, dump
+                * this packet and reuse the old buffer.
+                */
+               ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
+               ++priv->stats.rx_dropped;
+               goto repost;
+       }
+
+       ipoib_cm_dma_unmap_rx(priv, priv->cm.srq_ring[wr_id].mapping);
+       memcpy(priv->cm.srq_ring[wr_id].mapping, mapping, sizeof mapping);
+
+       ipoib_dbg_data(priv, "received %d bytes, SLID 0x%04x\n",
+                      wc->byte_len, wc->slid);
+
+       skb_put_frags(skb, IPOIB_CM_HEAD_SIZE, wc->byte_len);
+
+       skb->protocol = ((struct ipoib_header *) skb->data)->proto;
+       skb->mac.raw = skb->data;
+       skb_pull(skb, IPOIB_ENCAP_LEN);
+
+       dev->last_rx = jiffies;
+       ++priv->stats.rx_packets;
+       priv->stats.rx_bytes += skb->len;
+
+       skb->dev = dev;
+       /* XXX get correct PACKET_ type here */
+       skb->pkt_type = PACKET_HOST;
+       netif_rx_ni(skb);
+
+repost:
+       if (unlikely(ipoib_cm_post_receive(dev, wr_id)))
+               ipoib_warn(priv, "ipoib_cm_post_receive failed "
+                          "for buf %d\n", wr_id);
+}
+
+static inline int post_send(struct ipoib_dev_priv *priv,
+                           struct ipoib_cm_tx *tx,
+                           unsigned int wr_id,
+                           u64 addr, int len)
+{
+       struct ib_send_wr *bad_wr;
+
+       priv->tx_sge.addr             = addr;
+       priv->tx_sge.length           = len;
+
+       priv->tx_wr.wr_id             = wr_id;
+
+       return ib_post_send(tx->qp, &priv->tx_wr, &bad_wr);
+}
+
+void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_tx *tx)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       struct ipoib_tx_buf *tx_req;
+       u64 addr;
+
+       if (unlikely(skb->len > tx->mtu)) {
+               ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
+                          skb->len, tx->mtu);
+               ++priv->stats.tx_dropped;
+               ++priv->stats.tx_errors;
+               ipoib_cm_skb_too_long(dev, skb, tx->mtu - INFINIBAND_ALEN);
+               return;
+       }
+
+       ipoib_dbg_data(priv, "sending packet: head 0x%x length %d connection 0x%x\n",
+                      tx->tx_head, skb->len, tx->qp->qp_num);
+
+       /*
+        * We put the skb into the tx_ring _before_ we call post_send()
+        * because it's entirely possible that the completion handler will
+        * run before we execute anything after the post_send().  That
+        * means we have to make sure everything is properly recorded and
+        * our state is consistent before we call post_send().
+        */
+       tx_req = &tx->tx_ring[tx->tx_head & (ipoib_sendq_size - 1)];
+       tx_req->skb = skb;
+       addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
+       if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
+               ++priv->stats.tx_errors;
+               dev_kfree_skb_any(skb);
+               return;
+       }
+
+       tx_req->mapping = addr;
+
+       if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
+                               addr, skb->len))) {
+               ipoib_warn(priv, "post_send failed\n");
+               ++priv->stats.tx_errors;
+               ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
+               dev_kfree_skb_any(skb);
+       } else {
+               dev->trans_start = jiffies;
+               ++tx->tx_head;
+
+               if (tx->tx_head - tx->tx_tail == ipoib_sendq_size) {
+                       ipoib_dbg(priv, "TX ring 0x%x full, stopping kernel net queue\n",
+                                 tx->qp->qp_num);
+                       netif_stop_queue(dev);
+                       set_bit(IPOIB_FLAG_NETIF_STOPPED, &tx->flags);
+               }
+       }
+}
+
+static void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ipoib_cm_tx *tx,
+                                 struct ib_wc *wc)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       unsigned int wr_id = wc->wr_id;
+       struct ipoib_tx_buf *tx_req;
+       unsigned long flags;
+
+       ipoib_dbg_data(priv, "cm send completion: id %d, op %d, status: %d\n",
+                      wr_id, wc->opcode, wc->status);
+
+       if (unlikely(wr_id >= ipoib_sendq_size)) {
+               ipoib_warn(priv, "cm send completion event with wrid %d (> %d)\n",
+                          wr_id, ipoib_sendq_size);
+               return;
+       }
+
+       tx_req = &tx->tx_ring[wr_id];
+
+       ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
+
+       /* FIXME: is this right? Shouldn't we only increment on success? */
+       ++priv->stats.tx_packets;
+       priv->stats.tx_bytes += tx_req->skb->len;
+
+       dev_kfree_skb_any(tx_req->skb);
+
+       spin_lock_irqsave(&priv->tx_lock, flags);
+       ++tx->tx_tail;
+       if (unlikely(test_bit(IPOIB_FLAG_NETIF_STOPPED, &tx->flags)) &&
+           tx->tx_head - tx->tx_tail <= ipoib_sendq_size >> 1) {
+               clear_bit(IPOIB_FLAG_NETIF_STOPPED, &tx->flags);
+               netif_wake_queue(dev);
+       }
+
+       if (wc->status != IB_WC_SUCCESS &&
+           wc->status != IB_WC_WR_FLUSH_ERR) {
+               struct ipoib_neigh *neigh;
+
+               ipoib_dbg(priv, "failed cm send event "
+                          "(status=%d, wrid=%d vend_err %x)\n",
+                          wc->status, wr_id, wc->vendor_err);
+
+               spin_lock(&priv->lock);
+               neigh = tx->neigh;
+
+               if (neigh) {
+                       neigh->cm = NULL;
+                       list_del(&neigh->list);
+                       if (neigh->ah)
+                               ipoib_put_ah(neigh->ah);
+                       ipoib_neigh_free(dev, neigh);
+
+                       tx->neigh = NULL;
+               }
+
+               /* queue would be re-started anyway when TX is destroyed,
+                * but it makes sense to do it ASAP here. */
+               if (test_and_clear_bit(IPOIB_FLAG_NETIF_STOPPED, &tx->flags))
+                       netif_wake_queue(dev);
+
+               if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) {
+                       list_move(&tx->list, &priv->cm.reap_list);
+                       queue_work(ipoib_workqueue, &priv->cm.reap_task);
+               }
+
+               clear_bit(IPOIB_FLAG_OPER_UP, &tx->flags);
+
+               spin_unlock(&priv->lock);
+       }
+
+       spin_unlock_irqrestore(&priv->tx_lock, flags);
+}
+
+static void ipoib_cm_tx_completion(struct ib_cq *cq, void *tx_ptr)
+{
+       struct ipoib_cm_tx *tx = tx_ptr;
+       int n, i;
+
+       ib_req_notify_cq(cq, IB_CQ_NEXT_COMP);
+       do {
+               n = ib_poll_cq(cq, IPOIB_NUM_WC, tx->ibwc);
+               for (i = 0; i < n; ++i)
+                       ipoib_cm_handle_tx_wc(tx->dev, tx, tx->ibwc + i);
+       } while (n == IPOIB_NUM_WC);
+}
+
+int ipoib_cm_dev_open(struct net_device *dev)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       int ret;
+
+       if (!IPOIB_CM_SUPPORTED(dev->dev_addr))
+               return 0;
+
+       priv->cm.id = ib_create_cm_id(priv->ca, ipoib_cm_rx_handler, dev);
+       if (IS_ERR(priv->cm.id)) {
+               printk(KERN_WARNING "%s: failed to create CM ID\n", priv->ca->name);
+               return IS_ERR(priv->cm.id);
+       }
+
+       ret = ib_cm_listen(priv->cm.id, cpu_to_be64(IPOIB_CM_IETF_ID | priv->qp->qp_num),
+                          0, NULL);
+       if (ret) {
+               printk(KERN_WARNING "%s: failed to listen on ID 0x%llx\n", priv->ca->name,
+                      IPOIB_CM_IETF_ID | priv->qp->qp_num);
+               ib_destroy_cm_id(priv->cm.id);
+               return ret;
+       }
+       return 0;
+}
+
+void ipoib_cm_dev_stop(struct net_device *dev)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       struct ipoib_cm_rx *p;
+       unsigned long flags;
+
+       if (!IPOIB_CM_SUPPORTED(dev->dev_addr))
+               return;
+
+       ib_destroy_cm_id(priv->cm.id);
+       spin_lock_irqsave(&priv->lock, flags);
+       while (!list_empty(&priv->cm.passive_ids)) {
+               p = list_entry(priv->cm.passive_ids.next, typeof(*p), list);
+               list_del_init(&p->list);
+               spin_unlock_irqrestore(&priv->lock, flags);
+               ib_destroy_cm_id(p->id);
+               ib_destroy_qp(p->qp);
+               kfree(p);
+               spin_lock_irqsave(&priv->lock, flags);
+       }
+       spin_unlock_irqrestore(&priv->lock, flags);
+
+       cancel_delayed_work(&priv->cm.stale_task);
+}
+
+static int ipoib_cm_rep_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event)
+{
+       struct ipoib_cm_tx *p = cm_id->context;
+       struct ipoib_dev_priv *priv = netdev_priv(p->dev);
+       struct ipoib_cm_data *data = event->private_data;
+       struct sk_buff_head skqueue;
+       struct ib_qp_attr qp_attr;
+       int qp_attr_mask, ret;
+       struct sk_buff *skb;
+       unsigned long flags;
+
+       p->mtu = be32_to_cpu(data->mtu);
+
+       if (p->mtu < priv->dev->mtu + IPOIB_ENCAP_LEN) {
+               ipoib_warn(priv, "Rejecting connection: mtu %d < device mtu %d + 4\n",
+                          p->mtu, priv->dev->mtu);
+               return -EINVAL;
+       }
+
+       qp_attr.qp_state = IB_QPS_RTR;
+       ret = ib_cm_init_qp_attr(cm_id, &qp_attr, &qp_attr_mask);
+       if (ret) {
+               ipoib_warn(priv, "failed to init QP attr for RTR: %d\n", ret);
+               return ret;
+       }
+
+       qp_attr.rq_psn = 0 /* FIXME */;
+       ret = ib_modify_qp(p->qp, &qp_attr, qp_attr_mask);
+       if (ret) {
+               ipoib_warn(priv, "failed to modify QP to RTR: %d\n", ret);
+               return ret;
+       }
+
+       qp_attr.qp_state = IB_QPS_RTS;
+       ret = ib_cm_init_qp_attr(cm_id, &qp_attr, &qp_attr_mask);
+       if (ret) {
+               ipoib_warn(priv, "failed to init QP attr for RTS: %d\n", ret);
+               return ret;
+       }
+       ret = ib_modify_qp(p->qp, &qp_attr, qp_attr_mask);
+       if (ret) {
+               ipoib_warn(priv, "failed to modify QP to RTS: %d\n", ret);
+               return ret;
+       }
+
+       skb_queue_head_init(&skqueue);
+
+       spin_lock_irqsave(&priv->lock, flags);
+       set_bit(IPOIB_FLAG_OPER_UP, &p->flags);
+       if (p->neigh)
+               while ((skb = __skb_dequeue(&p->neigh->queue)))
+                       __skb_queue_tail(&skqueue, skb);
+       spin_unlock_irqrestore(&priv->lock, flags);
+
+       while ((skb = __skb_dequeue(&skqueue))) {
+               skb->dev = p->dev;
+               if (dev_queue_xmit(skb))
+                       ipoib_warn(priv, "dev_queue_xmit failed "
+                                  "to requeue packet\n");
+       }
+
+       ret = ib_send_cm_rtu(cm_id, NULL, 0);
+       if (ret) {
+               ipoib_warn(priv, "failed to send RTU: %d\n", ret);
+               return ret;
+       }
+       return 0;
+}
+
+static struct ib_qp *ipoib_cm_create_tx_qp(struct net_device *dev, struct ib_cq *cq)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       struct ib_qp_init_attr attr = {};
+       attr.recv_cq = priv->cq;
+       attr.srq = priv->cm.srq;
+       attr.cap.max_send_wr = ipoib_sendq_size;
+       attr.cap.max_send_sge = 1;
+       attr.sq_sig_type = IB_SIGNAL_ALL_WR;
+       attr.qp_type = IB_QPT_RC;
+       attr.send_cq = cq;
+       return ib_create_qp(priv->pd, &attr);
+}
+
+static int ipoib_cm_send_req(struct net_device *dev,
+                            struct ib_cm_id *id, struct ib_qp *qp,
+                            u32 qpn,
+                            struct ib_sa_path_rec *pathrec)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       struct ipoib_cm_data data = {};
+       struct ib_cm_req_param req = {};
+
+       data.qpn = cpu_to_be32(priv->qp->qp_num);
+       data.mtu = cpu_to_be32(IPOIB_CM_BUF_SIZE);
+
+       req.primary_path              = pathrec;
+       req.alternate_path            = NULL;
+       req.service_id                = cpu_to_be64(IPOIB_CM_IETF_ID | qpn);
+       req.qp_num                    = qp->qp_num;
+       req.qp_type                   = qp->qp_type;
+       req.private_data              = &data;
+       req.private_data_len          = sizeof data;
+       req.flow_control              = 0;
+
+       req.starting_psn              = 0; /* FIXME */
+
+       /*
+        * Pick some arbitrary defaults here; we could make these
+        * module parameters if anyone cared about setting them.
+        */
+       req.responder_resources       = 4;
+       req.remote_cm_response_timeout = 20;
+       req.local_cm_response_timeout  = 20;
+       req.retry_count               = 0; /* RFC draft warns against retries */
+       req.rnr_retry_count           = 0; /* RFC draft warns against retries */
+       req.max_cm_retries            = 15;
+       req.srq                       = 1;
+       return ib_send_cm_req(id, &req);
+}
+
+static int ipoib_cm_modify_tx_init(struct net_device *dev,
+                                 struct ib_cm_id *cm_id, struct ib_qp *qp)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       struct ib_qp_attr qp_attr;
+       int qp_attr_mask, ret;
+       ret = ib_find_cached_pkey(priv->ca, priv->port, priv->pkey, &qp_attr.pkey_index);
+       if (ret) {
+               ipoib_warn(priv, "pkey 0x%x not in cache: %d\n", priv->pkey, ret);
+               return ret;
+       }
+
+       qp_attr.qp_state = IB_QPS_INIT;
+       qp_attr.qp_access_flags = IB_ACCESS_LOCAL_WRITE;
+       qp_attr.port_num = priv->port;
+       qp_attr_mask = IB_QP_STATE | IB_QP_ACCESS_FLAGS | IB_QP_PKEY_INDEX | IB_QP_PORT;
+
+       ret = ib_modify_qp(qp, &qp_attr, qp_attr_mask);
+       if (ret) {
+               ipoib_warn(priv, "failed to modify tx QP to INIT: %d\n", ret);
+               return ret;
+       }
+       return 0;
+}
+
+static int ipoib_cm_tx_init(struct ipoib_cm_tx *p, u32 qpn,
+                           struct ib_sa_path_rec *pathrec)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(p->dev);
+       int ret;
+
+       p->tx_ring = kzalloc(ipoib_sendq_size * sizeof *p->tx_ring,
+                               GFP_KERNEL);
+       if (!p->tx_ring) {
+               ipoib_warn(priv, "failed to allocate tx ring\n");
+               ret = -ENOMEM;
+               goto err_tx;
+       }
+
+       p->cq = ib_create_cq(priv->ca, ipoib_cm_tx_completion, NULL, p,
+                            ipoib_sendq_size + 1);
+       if (IS_ERR(p->cq)) {
+               ret = PTR_ERR(p->cq);
+               ipoib_warn(priv, "failed to allocate tx cq: %d\n", ret);
+               goto err_cq;
+       }
+
+       ret = ib_req_notify_cq(p->cq, IB_CQ_NEXT_COMP);
+       if (ret) {
+               ipoib_warn(priv, "failed to request completion notification: %d\n", ret);
+               goto err_req_notify;
+       }
+
+       p->qp = ipoib_cm_create_tx_qp(p->dev, p->cq);
+       if (IS_ERR(p->qp)) {
+               ret = PTR_ERR(p->qp);
+               ipoib_warn(priv, "failed to allocate tx qp: %d\n", ret);
+               goto err_qp;
+       }
+
+       p->id = ib_create_cm_id(priv->ca, ipoib_cm_tx_handler, p);
+       if (IS_ERR(p->id)) {
+               ret = PTR_ERR(p->id);
+               ipoib_warn(priv, "failed to create tx cm id: %d\n", ret);
+               goto err_id;
+       }
+
+       ret = ipoib_cm_modify_tx_init(p->dev, p->id,  p->qp);
+       if (ret) {
+               ipoib_warn(priv, "failed to modify tx qp to rtr: %d\n", ret);
+               goto err_modify;
+       }
+
+       ret = ipoib_cm_send_req(p->dev, p->id, p->qp, qpn, pathrec);
+       if (ret) {
+               ipoib_warn(priv, "failed to send cm req: %d\n", ret);
+               goto err_send_cm;
+       }
+
+       ipoib_dbg(priv, "Request connection 0x%x for gid " IPOIB_GID_FMT " qpn 0x%x\n",
+                 p->qp->qp_num, IPOIB_GID_ARG(pathrec->dgid), qpn);
+
+       return 0;
+
+err_send_cm:
+err_modify:
+       ib_destroy_cm_id(p->id);
+err_id:
+       p->id = NULL;
+       ib_destroy_qp(p->qp);
+err_req_notify:
+err_qp:
+       p->qp = NULL;
+       ib_destroy_cq(p->cq);
+err_cq:
+       p->cq = NULL;
+err_tx:
+       return ret;
+}
+
+static void ipoib_cm_tx_destroy(struct ipoib_cm_tx *p)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(p->dev);
+       struct ipoib_tx_buf *tx_req;
+
+       ipoib_dbg(priv, "Destroy active connection 0x%x head 0x%x tail 0x%x\n",
+                 p->qp ? p->qp->qp_num : 0, p->tx_head, p->tx_tail);
+
+       if (p->id)
+               ib_destroy_cm_id(p->id);
+
+       if (p->qp)
+               ib_destroy_qp(p->qp);
+
+       if (p->cq)
+               ib_destroy_cq(p->cq);
+
+       if (test_bit(IPOIB_FLAG_NETIF_STOPPED, &p->flags))
+               netif_wake_queue(p->dev);
+
+       if (p->tx_ring) {
+               while ((int) p->tx_tail - (int) p->tx_head < 0) {
+                       tx_req = &p->tx_ring[p->tx_tail & (ipoib_sendq_size - 1)];
+                       ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len,
+                                        DMA_TO_DEVICE);
+                       dev_kfree_skb_any(tx_req->skb);
+                       ++p->tx_tail;
+               }
+
+               kfree(p->tx_ring);
+       }
+
+       kfree(p);
+}
+
+static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id,
+                              struct ib_cm_event *event)
+{
+       struct ipoib_cm_tx *tx = cm_id->context;
+       struct ipoib_dev_priv *priv = netdev_priv(tx->dev);
+       struct net_device *dev = priv->dev;
+       struct ipoib_neigh *neigh;
+       unsigned long flags;
+       int ret;
+
+       switch (event->event) {
+       case IB_CM_DREQ_RECEIVED:
+               ipoib_dbg(priv, "DREQ received.\n");
+               ib_send_cm_drep(cm_id, NULL, 0);
+               break;
+       case IB_CM_REP_RECEIVED:
+               ipoib_dbg(priv, "REP received.\n");
+               ret = ipoib_cm_rep_handler(cm_id, event);
+               if (ret)
+                       ib_send_cm_rej(cm_id, IB_CM_REJ_CONSUMER_DEFINED,
+                                      NULL, 0, NULL, 0);
+               break;
+       case IB_CM_REQ_ERROR:
+       case IB_CM_REJ_RECEIVED:
+       case IB_CM_TIMEWAIT_EXIT:
+               ipoib_dbg(priv, "CM error %d.\n", event->event);
+               spin_lock_irqsave(&priv->tx_lock, flags);
+               spin_lock(&priv->lock);
+               neigh = tx->neigh;
+
+               if (neigh) {
+                       neigh->cm = NULL;
+                       list_del(&neigh->list);
+                       if (neigh->ah)
+                               ipoib_put_ah(neigh->ah);
+                       ipoib_neigh_free(dev, neigh);
+
+                       tx->neigh = NULL;
+               }
+
+               if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) {
+                       list_move(&tx->list, &priv->cm.reap_list);
+                       queue_work(ipoib_workqueue, &priv->cm.reap_task);
+               }
+
+               spin_unlock(&priv->lock);
+               spin_unlock_irqrestore(&priv->tx_lock, flags);
+               break;
+       default:
+               break;
+       }
+
+       return 0;
+}
+
+struct ipoib_cm_tx *ipoib_cm_create_tx(struct net_device *dev, struct ipoib_path *path,
+                                      struct ipoib_neigh *neigh)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       struct ipoib_cm_tx *tx;
+
+       tx = kzalloc(sizeof *tx, GFP_ATOMIC);
+       if (!tx)
+               return NULL;
+
+       neigh->cm = tx;
+       tx->neigh = neigh;
+       tx->path = path;
+       tx->dev = dev;
+       list_add(&tx->list, &priv->cm.start_list);
+       set_bit(IPOIB_FLAG_INITIALIZED, &tx->flags);
+       queue_work(ipoib_workqueue, &priv->cm.start_task);
+       return tx;
+}
+
+void ipoib_cm_destroy_tx(struct ipoib_cm_tx *tx)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(tx->dev);
+       if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) {
+               list_move(&tx->list, &priv->cm.reap_list);
+               queue_work(ipoib_workqueue, &priv->cm.reap_task);
+               ipoib_dbg(priv, "Reap connection for gid " IPOIB_GID_FMT "\n",
+                         IPOIB_GID_ARG(tx->neigh->dgid));
+               tx->neigh = NULL;
+       }
+}
+
+static void ipoib_cm_tx_start(struct work_struct *work)
+{
+       struct ipoib_dev_priv *priv = container_of(work, struct ipoib_dev_priv,
+                                                  cm.start_task);
+       struct net_device *dev = priv->dev;
+       struct ipoib_neigh *neigh;
+       struct ipoib_cm_tx *p;
+       unsigned long flags;
+       int ret;
+
+       struct ib_sa_path_rec pathrec;
+       u32 qpn;
+
+       spin_lock_irqsave(&priv->tx_lock, flags);
+       spin_lock(&priv->lock);
+       while (!list_empty(&priv->cm.start_list)) {
+               p = list_entry(priv->cm.start_list.next, typeof(*p), list);
+               list_del_init(&p->list);
+               neigh = p->neigh;
+               qpn = IPOIB_QPN(neigh->neighbour->ha);
+               memcpy(&pathrec, &p->path->pathrec, sizeof pathrec);
+               spin_unlock(&priv->lock);
+               spin_unlock_irqrestore(&priv->tx_lock, flags);
+               ret = ipoib_cm_tx_init(p, qpn, &pathrec);
+               spin_lock_irqsave(&priv->tx_lock, flags);
+               spin_lock(&priv->lock);
+               if (ret) {
+                       neigh = p->neigh;
+                       if (neigh) {
+                               neigh->cm = NULL;
+                               list_del(&neigh->list);
+                               if (neigh->ah)
+                                       ipoib_put_ah(neigh->ah);
+                               ipoib_neigh_free(dev, neigh);
+                       }
+                       list_del(&p->list);
+                       kfree(p);
+               }
+       }
+       spin_unlock(&priv->lock);
+       spin_unlock_irqrestore(&priv->tx_lock, flags);
+}
+
+static void ipoib_cm_tx_reap(struct work_struct *work)
+{
+       struct ipoib_dev_priv *priv = container_of(work, struct ipoib_dev_priv,
+                                                  cm.reap_task);
+       struct ipoib_cm_tx *p;
+       unsigned long flags;
+
+       spin_lock_irqsave(&priv->tx_lock, flags);
+       spin_lock(&priv->lock);
+       while (!list_empty(&priv->cm.reap_list)) {
+               p = list_entry(priv->cm.reap_list.next, typeof(*p), list);
+               list_del(&p->list);
+               spin_unlock(&priv->lock);
+               spin_unlock_irqrestore(&priv->tx_lock, flags);
+               ipoib_cm_tx_destroy(p);
+               spin_lock_irqsave(&priv->tx_lock, flags);
+               spin_lock(&priv->lock);
+       }
+       spin_unlock(&priv->lock);
+       spin_unlock_irqrestore(&priv->tx_lock, flags);
+}
+
+static void ipoib_cm_skb_reap(struct work_struct *work)
+{
+       struct ipoib_dev_priv *priv = container_of(work, struct ipoib_dev_priv,
+                                                  cm.skb_task);
+       struct net_device *dev = priv->dev;
+       struct sk_buff *skb;
+       unsigned long flags;
+
+       unsigned mtu = priv->mcast_mtu;
+
+       spin_lock_irqsave(&priv->tx_lock, flags);
+       spin_lock(&priv->lock);
+       while ((skb = skb_dequeue(&priv->cm.skb_queue))) {
+               spin_unlock(&priv->lock);
+               spin_unlock_irqrestore(&priv->tx_lock, flags);
+               if (skb->protocol == htons(ETH_P_IP))
+                       icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu));
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+               else if (skb->protocol == htons(ETH_P_IPV6))
+                       icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, dev);
+#endif
+               dev_kfree_skb_any(skb);
+               spin_lock_irqsave(&priv->tx_lock, flags);
+               spin_lock(&priv->lock);
+       }
+       spin_unlock(&priv->lock);
+       spin_unlock_irqrestore(&priv->tx_lock, flags);
+}
+
+void ipoib_cm_skb_too_long(struct net_device* dev, struct sk_buff *skb,
+                          unsigned int mtu)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       int e = skb_queue_empty(&priv->cm.skb_queue);
+
+       if (skb->dst)
+               skb->dst->ops->update_pmtu(skb->dst, mtu);
+
+       skb_queue_tail(&priv->cm.skb_queue, skb);
+       if (e)
+               queue_work(ipoib_workqueue, &priv->cm.skb_task);
+}
+
+static void ipoib_cm_stale_task(struct work_struct *work)
+{
+       struct ipoib_dev_priv *priv = container_of(work, struct ipoib_dev_priv,
+                                                  cm.stale_task.work);
+       struct ipoib_cm_rx *p;
+       unsigned long flags;
+
+       spin_lock_irqsave(&priv->lock, flags);
+       while (!list_empty(&priv->cm.passive_ids)) {
+               /* List if sorted by LRU, start from tail,
+                * stop when we see a recently used entry */
+               p = list_entry(priv->cm.passive_ids.prev, typeof(*p), list);
+               if (time_after_eq(jiffies, p->jiffies + IPOIB_CM_RX_TIMEOUT))
+                       break;
+               list_del_init(&p->list);
+               spin_unlock_irqrestore(&priv->lock, flags);
+               ib_destroy_cm_id(p->id);
+               ib_destroy_qp(p->qp);
+               kfree(p);
+               spin_lock_irqsave(&priv->lock, flags);
+       }
+       spin_unlock_irqrestore(&priv->lock, flags);
+}
+
+
+static ssize_t show_mode(struct device *d, struct device_attribute *attr, 
+                        char *buf)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(to_net_dev(d));
+
+       if (test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags))
+               return sprintf(buf, "connected\n");
+       else
+               return sprintf(buf, "datagram\n");
+}
+
+static ssize_t set_mode(struct device *d, struct device_attribute *attr,
+                       const char *buf, size_t count)
+{
+       struct net_device *dev = to_net_dev(d);
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+
+       /* flush paths if we switch modes so that connections are restarted */
+       if (IPOIB_CM_SUPPORTED(dev->dev_addr) && !strcmp(buf, "connected\n")) {
+               set_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
+               ipoib_warn(priv, "enabling connected mode "
+                          "will cause multicast packet drops\n");
+               ipoib_flush_paths(dev);
+               return count;
+       }
+
+       if (!strcmp(buf, "datagram\n")) {
+               clear_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
+               dev->mtu = min(priv->mcast_mtu, dev->mtu);
+               ipoib_flush_paths(dev);
+               return count;
+       }
+
+       return -EINVAL;
+}
+
+static DEVICE_ATTR(mode, S_IWUGO | S_IRUGO, show_mode, set_mode);
+
+int ipoib_cm_add_mode_attr(struct net_device *dev)
+{
+       return device_create_file(&dev->dev, &dev_attr_mode);
+}
+
+int ipoib_cm_dev_init(struct net_device *dev)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       struct ib_srq_init_attr srq_init_attr = {
+               .attr = {
+                       .max_wr  = ipoib_recvq_size,
+                       .max_sge = IPOIB_CM_RX_SG
+               }
+       };
+       int ret, i;
+
+       INIT_LIST_HEAD(&priv->cm.passive_ids);
+       INIT_LIST_HEAD(&priv->cm.reap_list);
+       INIT_LIST_HEAD(&priv->cm.start_list);
+       INIT_WORK(&priv->cm.start_task, ipoib_cm_tx_start);
+       INIT_WORK(&priv->cm.reap_task, ipoib_cm_tx_reap);
+       INIT_WORK(&priv->cm.skb_task, ipoib_cm_skb_reap);
+       INIT_DELAYED_WORK(&priv->cm.stale_task, ipoib_cm_stale_task);
+
+       skb_queue_head_init(&priv->cm.skb_queue);
+
+       priv->cm.srq = ib_create_srq(priv->pd, &srq_init_attr);
+       if (IS_ERR(priv->cm.srq)) {
+               ret = PTR_ERR(priv->cm.srq);
+               priv->cm.srq = NULL;
+               return ret;
+       }
+
+       priv->cm.srq_ring = kzalloc(ipoib_recvq_size * sizeof *priv->cm.srq_ring,
+                                   GFP_KERNEL);
+       if (!priv->cm.srq_ring) {
+               printk(KERN_WARNING "%s: failed to allocate CM ring (%d entries)\n",
+                      priv->ca->name, ipoib_recvq_size);
+               ipoib_cm_dev_cleanup(dev);
+               return -ENOMEM;
+       }
+
+       for (i = 0; i < IPOIB_CM_RX_SG; ++i)
+               priv->cm.rx_sge[i].lkey = priv->mr->lkey;
+
+       priv->cm.rx_sge[0].length = IPOIB_CM_HEAD_SIZE;
+       for (i = 1; i < IPOIB_CM_RX_SG; ++i)
+               priv->cm.rx_sge[i].length = PAGE_SIZE;
+       priv->cm.rx_wr.next = NULL;
+       priv->cm.rx_wr.sg_list = priv->cm.rx_sge;
+       priv->cm.rx_wr.num_sge = IPOIB_CM_RX_SG;
+
+       for (i = 0; i < ipoib_recvq_size; ++i) {
+               if (ipoib_cm_alloc_rx_skb(dev, i, priv->cm.srq_ring[i].mapping)) {
+                       ipoib_warn(priv, "failed to allocate receive buffer %d\n", i);
+                       ipoib_cm_dev_cleanup(dev);
+                       return -ENOMEM;
+               }
+               if (ipoib_cm_post_receive(dev, i)) {
+                       ipoib_warn(priv, "ipoib_ib_post_receive failed for buf %d\n", i);
+                       ipoib_cm_dev_cleanup(dev);
+                       return -EIO;
+               }
+       }
+
+       priv->dev->dev_addr[0] = IPOIB_FLAGS_RC;
+       return 0;
+}
+
+void ipoib_cm_dev_cleanup(struct net_device *dev)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       int i, ret;
+
+       if (!priv->cm.srq)
+               return;
+
+       ipoib_dbg(priv, "Cleanup ipoib connected mode.\n");
+
+       ret = ib_destroy_srq(priv->cm.srq);
+       if (ret)
+               ipoib_warn(priv, "ib_destroy_srq failed: %d\n", ret);
+
+       priv->cm.srq = NULL;
+       if (!priv->cm.srq_ring)
+               return;
+       for (i = 0; i < ipoib_recvq_size; ++i)
+               if (priv->cm.srq_ring[i].skb) {
+                       ipoib_cm_dma_unmap_rx(priv, priv->cm.srq_ring[i].mapping);
+                       dev_kfree_skb_any(priv->cm.srq_ring[i].skb);
+                       priv->cm.srq_ring[i].skb = NULL;
+               }
+       kfree(priv->cm.srq_ring);
+       priv->cm.srq_ring = NULL;
+}
index f1cb83688b318ef62d0cf6240019e23db74676f7..44c174182a829b39a53d80d72c3f38791f398bbc 100644 (file)
@@ -146,7 +146,7 @@ static int ipoib_mcg_open(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations ipoib_mcg_fops = {
+static const struct file_operations ipoib_mcg_fops = {
        .owner   = THIS_MODULE,
        .open    = ipoib_mcg_open,
        .read    = seq_read,
@@ -252,7 +252,7 @@ static int ipoib_path_open(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations ipoib_path_fops = {
+static const struct file_operations ipoib_path_fops = {
        .owner   = THIS_MODULE,
        .open    = ipoib_path_open,
        .read    = seq_read,
index 59d9594ed6d97e0fc243066f42f94c8f8f3c0ca6..f2aa923ddbeaf7a39bbaf2ae11cbf1c2180067da 100644 (file)
@@ -50,8 +50,6 @@ MODULE_PARM_DESC(data_debug_level,
                 "Enable data path debug tracing if > 0");
 #endif
 
-#define        IPOIB_OP_RECV   (1ul << 31)
-
 static DEFINE_MUTEX(pkey_mutex);
 
 struct ipoib_ah *ipoib_create_ah(struct net_device *dev,
@@ -268,10 +266,11 @@ static void ipoib_ib_handle_tx_wc(struct net_device *dev, struct ib_wc *wc)
 
        spin_lock_irqsave(&priv->tx_lock, flags);
        ++priv->tx_tail;
-       if (netif_queue_stopped(dev) &&
-           test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags) &&
-           priv->tx_head - priv->tx_tail <= ipoib_sendq_size >> 1)
+       if (unlikely(test_bit(IPOIB_FLAG_NETIF_STOPPED, &priv->flags)) &&
+           priv->tx_head - priv->tx_tail <= ipoib_sendq_size >> 1) {
+               clear_bit(IPOIB_FLAG_NETIF_STOPPED, &priv->flags);
                netif_wake_queue(dev);
+       }
        spin_unlock_irqrestore(&priv->tx_lock, flags);
 
        if (wc->status != IB_WC_SUCCESS &&
@@ -283,7 +282,9 @@ static void ipoib_ib_handle_tx_wc(struct net_device *dev, struct ib_wc *wc)
 
 static void ipoib_ib_handle_wc(struct net_device *dev, struct ib_wc *wc)
 {
-       if (wc->wr_id & IPOIB_OP_RECV)
+       if (wc->wr_id & IPOIB_CM_OP_SRQ)
+               ipoib_cm_handle_rx_wc(dev, wc);
+       else if (wc->wr_id & IPOIB_OP_RECV)
                ipoib_ib_handle_rx_wc(dev, wc);
        else
                ipoib_ib_handle_tx_wc(dev, wc);
@@ -327,12 +328,12 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb,
        struct ipoib_tx_buf *tx_req;
        u64 addr;
 
-       if (unlikely(skb->len > dev->mtu + INFINIBAND_ALEN)) {
+       if (unlikely(skb->len > priv->mcast_mtu + INFINIBAND_ALEN)) {
                ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
-                          skb->len, dev->mtu + INFINIBAND_ALEN);
+                          skb->len, priv->mcast_mtu + INFINIBAND_ALEN);
                ++priv->stats.tx_dropped;
                ++priv->stats.tx_errors;
-               dev_kfree_skb_any(skb);
+               ipoib_cm_skb_too_long(dev, skb, priv->mcast_mtu);
                return;
        }
 
@@ -372,6 +373,7 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb,
                if (priv->tx_head - priv->tx_tail == ipoib_sendq_size) {
                        ipoib_dbg(priv, "TX ring full, stopping kernel net queue\n");
                        netif_stop_queue(dev);
+                       set_bit(IPOIB_FLAG_NETIF_STOPPED, &priv->flags);
                }
        }
 }
@@ -424,6 +426,13 @@ int ipoib_ib_dev_open(struct net_device *dev)
                return -1;
        }
 
+       ret = ipoib_cm_dev_open(dev);
+       if (ret) {
+               ipoib_warn(priv, "ipoib_ib_post_receives returned %d\n", ret);
+               ipoib_ib_dev_stop(dev);
+               return -1;
+       }
+
        clear_bit(IPOIB_STOP_REAPER, &priv->flags);
        queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, HZ);
 
@@ -509,6 +518,8 @@ int ipoib_ib_dev_stop(struct net_device *dev)
 
        clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 
+       ipoib_cm_dev_stop(dev);
+
        /*
         * Move our QP to the error state and then reinitialize in
         * when all work requests have completed or have been flushed.
index af5ee2ec4499799a80b8e98f4a7a7a02628fbb93..18d27fd352ad9667972b71a6a2242a12ded97d39 100644 (file)
@@ -49,8 +49,6 @@
 
 #include <net/dst.h>
 
-#define IPOIB_QPN(ha) (be32_to_cpup((__be32 *) ha) & 0xffffff)
-
 MODULE_AUTHOR("Roland Dreier");
 MODULE_DESCRIPTION("IP-over-InfiniBand net driver");
 MODULE_LICENSE("Dual BSD/GPL");
@@ -145,6 +143,8 @@ static int ipoib_stop(struct net_device *dev)
 
        netif_stop_queue(dev);
 
+       clear_bit(IPOIB_FLAG_NETIF_STOPPED, &priv->flags);
+
        /*
         * Now flush workqueue to make sure a scheduled task doesn't
         * bring our internal state back up.
@@ -178,8 +178,18 @@ static int ipoib_change_mtu(struct net_device *dev, int new_mtu)
 {
        struct ipoib_dev_priv *priv = netdev_priv(dev);
 
-       if (new_mtu > IPOIB_PACKET_SIZE - IPOIB_ENCAP_LEN)
+       /* dev->mtu > 2K ==> connected mode */
+       if (ipoib_cm_admin_enabled(dev) && new_mtu <= IPOIB_CM_MTU) {
+               if (new_mtu > priv->mcast_mtu)
+                       ipoib_warn(priv, "mtu > %d will cause multicast packet drops.\n",
+                                  priv->mcast_mtu);
+               dev->mtu = new_mtu;
+               return 0;
+       }
+
+       if (new_mtu > IPOIB_PACKET_SIZE - IPOIB_ENCAP_LEN) {
                return -EINVAL;
+       }
 
        priv->admin_mtu = new_mtu;
 
@@ -414,6 +424,20 @@ static void path_rec_completion(int status,
                        memcpy(&neigh->dgid.raw, &path->pathrec.dgid.raw,
                               sizeof(union ib_gid));
 
+                       if (ipoib_cm_enabled(dev, neigh->neighbour)) {
+                               if (!ipoib_cm_get(neigh))
+                                       ipoib_cm_set(neigh, ipoib_cm_create_tx(dev,
+                                                                              path,
+                                                                              neigh));
+                               if (!ipoib_cm_get(neigh)) {
+                                       list_del(&neigh->list);
+                                       if (neigh->ah)
+                                               ipoib_put_ah(neigh->ah);
+                                       ipoib_neigh_free(dev, neigh);
+                                       continue;
+                               }
+                       }
+
                        while ((skb = __skb_dequeue(&neigh->queue)))
                                __skb_queue_tail(&skqueue, skb);
                }
@@ -520,7 +544,25 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev)
                memcpy(&neigh->dgid.raw, &path->pathrec.dgid.raw,
                       sizeof(union ib_gid));
 
-               ipoib_send(dev, skb, path->ah, IPOIB_QPN(skb->dst->neighbour->ha));
+               if (ipoib_cm_enabled(dev, neigh->neighbour)) {
+                       if (!ipoib_cm_get(neigh))
+                               ipoib_cm_set(neigh, ipoib_cm_create_tx(dev, path, neigh));
+                       if (!ipoib_cm_get(neigh)) {
+                               list_del(&neigh->list);
+                               if (neigh->ah)
+                                       ipoib_put_ah(neigh->ah);
+                               ipoib_neigh_free(dev, neigh);
+                               goto err_drop;
+                       }
+                       if (skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE)
+                               __skb_queue_tail(&neigh->queue, skb);
+                       else {
+                               ipoib_warn(priv, "queue length limit %d. Packet drop.\n",
+                                          skb_queue_len(&neigh->queue));
+                               goto err_drop;
+                       }
+               } else
+                       ipoib_send(dev, skb, path->ah, IPOIB_QPN(skb->dst->neighbour->ha));
        } else {
                neigh->ah  = NULL;
 
@@ -538,6 +580,7 @@ err_list:
 
 err_path:
        ipoib_neigh_free(dev, neigh);
+err_drop:
        ++priv->stats.tx_dropped;
        dev_kfree_skb_any(skb);
 
@@ -640,7 +683,12 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
                neigh = *to_ipoib_neigh(skb->dst->neighbour);
 
-               if (likely(neigh->ah)) {
+               if (ipoib_cm_get(neigh)) {
+                       if (ipoib_cm_up(neigh)) {
+                               ipoib_cm_send(dev, skb, ipoib_cm_get(neigh));
+                               goto out;
+                       }
+               } else if (neigh->ah) {
                        if (unlikely(memcmp(&neigh->dgid.raw,
                                            skb->dst->neighbour->ha + 4,
                                            sizeof(union ib_gid)))) {
@@ -805,6 +853,7 @@ struct ipoib_neigh *ipoib_neigh_alloc(struct neighbour *neighbour)
        neigh->neighbour = neighbour;
        *to_ipoib_neigh(neighbour) = neigh;
        skb_queue_head_init(&neigh->queue);
+       ipoib_cm_set(neigh, NULL);
 
        return neigh;
 }
@@ -818,6 +867,8 @@ void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
                ++priv->stats.tx_dropped;
                dev_kfree_skb_any(skb);
        }
+       if (ipoib_cm_get(neigh))
+               ipoib_cm_destroy_tx(ipoib_cm_get(neigh));
        kfree(neigh);
 }
 
@@ -1080,6 +1131,8 @@ static struct net_device *ipoib_add_port(const char *format,
 
        ipoib_create_debug_files(priv->dev);
 
+       if (ipoib_cm_add_mode_attr(priv->dev))
+               goto sysfs_failed;
        if (ipoib_add_pkey_attr(priv->dev))
                goto sysfs_failed;
        if (device_create_file(&priv->dev->dev, &dev_attr_create_child))
index b04b72ca32eda5816e79780ed5553f51d4e53d1e..fea737f520fdfeae5a8a7b85765799552406b379 100644 (file)
@@ -597,7 +597,9 @@ void ipoib_mcast_join_task(struct work_struct *work)
 
        priv->mcast_mtu = ib_mtu_enum_to_int(priv->broadcast->mcmember.mtu) -
                IPOIB_ENCAP_LEN;
-       dev->mtu = min(priv->mcast_mtu, priv->admin_mtu);
+
+       if (!ipoib_cm_admin_enabled(dev))
+               dev->mtu = min(priv->mcast_mtu, priv->admin_mtu);
 
        ipoib_dbg_mcast(priv, "successfully joined all multicast groups\n");
 
index 7b717c648f727bb52ac8d33fcb5bcb6de9cefe5e..3cb551b8875625960654e587facebf02e3fcd838 100644 (file)
@@ -168,35 +168,41 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca)
                .qp_type     = IB_QPT_UD
        };
 
+       int ret, size;
+
        priv->pd = ib_alloc_pd(priv->ca);
        if (IS_ERR(priv->pd)) {
                printk(KERN_WARNING "%s: failed to allocate PD\n", ca->name);
                return -ENODEV;
        }
 
-       priv->cq = ib_create_cq(priv->ca, ipoib_ib_completion, NULL, dev,
-                               ipoib_sendq_size + ipoib_recvq_size + 1);
+       priv->mr = ib_get_dma_mr(priv->pd, IB_ACCESS_LOCAL_WRITE);
+       if (IS_ERR(priv->mr)) {
+               printk(KERN_WARNING "%s: ib_get_dma_mr failed\n", ca->name);
+               goto out_free_pd;
+       }
+
+       size = ipoib_sendq_size + ipoib_recvq_size + 1;
+       ret = ipoib_cm_dev_init(dev);
+       if (!ret)
+               size += ipoib_recvq_size;
+
+       priv->cq = ib_create_cq(priv->ca, ipoib_ib_completion, NULL, dev, size);
        if (IS_ERR(priv->cq)) {
                printk(KERN_WARNING "%s: failed to create CQ\n", ca->name);
-               goto out_free_pd;
+               goto out_free_mr;
        }
 
        if (ib_req_notify_cq(priv->cq, IB_CQ_NEXT_COMP))
                goto out_free_cq;
 
-       priv->mr = ib_get_dma_mr(priv->pd, IB_ACCESS_LOCAL_WRITE);
-       if (IS_ERR(priv->mr)) {
-               printk(KERN_WARNING "%s: ib_get_dma_mr failed\n", ca->name);
-               goto out_free_cq;
-       }
-
        init_attr.send_cq = priv->cq;
        init_attr.recv_cq = priv->cq,
 
        priv->qp = ib_create_qp(priv->pd, &init_attr);
        if (IS_ERR(priv->qp)) {
                printk(KERN_WARNING "%s: failed to create QP\n", ca->name);
-               goto out_free_mr;
+               goto out_free_cq;
        }
 
        priv->dev->dev_addr[1] = (priv->qp->qp_num >> 16) & 0xff;
@@ -212,12 +218,12 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca)
 
        return 0;
 
-out_free_mr:
-       ib_dereg_mr(priv->mr);
-
 out_free_cq:
        ib_destroy_cq(priv->cq);
 
+out_free_mr:
+       ib_dereg_mr(priv->mr);
+
 out_free_pd:
        ib_dealloc_pd(priv->pd);
        return -ENODEV;
@@ -235,12 +241,14 @@ void ipoib_transport_dev_cleanup(struct net_device *dev)
                clear_bit(IPOIB_PKEY_ASSIGNED, &priv->flags);
        }
 
-       if (ib_dereg_mr(priv->mr))
-               ipoib_warn(priv, "ib_dereg_mr failed\n");
-
        if (ib_destroy_cq(priv->cq))
                ipoib_warn(priv, "ib_cq_destroy failed\n");
 
+       ipoib_cm_dev_cleanup(dev);
+
+       if (ib_dereg_mr(priv->mr))
+               ipoib_warn(priv, "ib_dereg_mr failed\n");
+
        if (ib_dealloc_pd(priv->pd))
                ipoib_warn(priv, "ib_dealloc_pd failed\n");
 }
index 085eafe6667cf3626274d4e4f462705a3b993af3..6762988439d1f6fcd96b82aad8a25f51e7bf5a86 100644 (file)
@@ -115,6 +115,8 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey)
 
        ipoib_create_debug_files(priv->dev);
 
+       if (ipoib_cm_add_mode_attr(priv->dev))
+               goto sysfs_failed;
        if (ipoib_add_pkey_attr(priv->dev))
                goto sysfs_failed;
 
index eba18b6ac5e4dc3afe012436f62441f04675eaf9..d226d935b0dcd57afc9c0e3fb921c47f3005bf92 100644 (file)
@@ -29,7 +29,7 @@
 #include <linux/module.h>
 #include <linux/mutex.h>
 #include <linux/spinlock.h>
-#include <linux/sched.h>
+#include <linux/jiffies.h>
 
 #include "fixp-arith.h"
 
index f68dbe6f7f04634ca7bf63688555de65be85f7f0..7b7a546323cfc1c2d65fea2663d1f3f50399f78e 100644 (file)
@@ -151,7 +151,6 @@ static int ns558_isa_probe(int io)
                return -ENOMEM;
        }
 
-       memset(ns558, 0, sizeof(struct ns558));
        ns558->io = io;
        ns558->size = 1 << i;
        ns558->gameport = port;
index 7cf2b4f603a36c278736b7e257e8318285ab2948..efa1b1f75393f747ea8864377518b44b12bb1f82 100644 (file)
@@ -11,7 +11,6 @@
  */
 
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/smp_lock.h>
 #include <linux/input.h>
 #include <linux/module.h>
@@ -482,7 +481,7 @@ static int input_proc_devices_open(struct inode *inode, struct file *file)
        return seq_open(file, &input_devices_seq_ops);
 }
 
-static struct file_operations input_devices_fileops = {
+static const struct file_operations input_devices_fileops = {
        .owner          = THIS_MODULE,
        .open           = input_proc_devices_open,
        .poll           = input_proc_devices_poll,
@@ -533,7 +532,7 @@ static int input_proc_handlers_open(struct inode *inode, struct file *file)
        return seq_open(file, &input_handlers_seq_ops);
 }
 
-static struct file_operations input_handlers_fileops = {
+static const struct file_operations input_handlers_fileops = {
        .owner          = THIS_MODULE,
        .open           = input_proc_handlers_open,
        .read           = seq_read,
@@ -1142,7 +1141,7 @@ static int input_open_file(struct inode *inode, struct file *file)
        return err;
 }
 
-static struct file_operations input_fops = {
+static const struct file_operations input_fops = {
        .owner = THIS_MODULE,
        .open = input_open_file,
 };
index 049f2f544e75e94a9d40aee991df4cf8d45510f4..1b81a72e19d92c7fc7bdfa41a215cbda7039d9a7 100644 (file)
@@ -135,12 +135,12 @@ config KEYBOARD_STOWAWAY
 config KEYBOARD_CORGI
        tristate "Corgi keyboard"
        depends on PXA_SHARPSL
-       default y       
+       default y
        help
-         Say Y here to enable the keyboard on the Sharp Zaurus SL-C7xx 
+         Say Y here to enable the keyboard on the Sharp Zaurus SL-C7xx
          series of PDAs.
 
-         To compile this driver as a module, choose M here: the 
+         To compile this driver as a module, choose M here: the
          module will be called corgikbd.
 
 config KEYBOARD_SPITZ
@@ -214,4 +214,17 @@ config KEYBOARD_AAED2000
          To compile this driver as a module, choose M here: the
          module will be called aaed2000_kbd.
 
+config KEYBOARD_GPIO
+        tristate "Buttons on CPU GPIOs (PXA)"
+        depends on ARCH_PXA
+       help
+         This driver implements support for buttons connected
+         directly to GPIO pins of PXA CPUs.
+
+         Say Y here if your device has buttons connected
+         directly to GPIO pins of the CPU.
+
+         To compile this driver as a module, choose M here: the
+         module will be called gpio-keys.
+
 endif
index 568797907347b9e0ace4898ab425e8a9ba16683d..586a0fe53be604bc1e67c6001b98df90e99b7e2f 100644 (file)
@@ -16,6 +16,7 @@ obj-$(CONFIG_KEYBOARD_CORGI)          += corgikbd.o
 obj-$(CONFIG_KEYBOARD_SPITZ)           += spitzkbd.o
 obj-$(CONFIG_KEYBOARD_HIL)             += hil_kbd.o
 obj-$(CONFIG_KEYBOARD_HIL_OLD)         += hilkbd.o
-obj-$(CONFIG_KEYBOARD_OMAP)             += omap-keypad.o
-obj-$(CONFIG_KEYBOARD_AAED2000)         += aaed2000_kbd.o
+obj-$(CONFIG_KEYBOARD_OMAP)            += omap-keypad.o
+obj-$(CONFIG_KEYBOARD_AAED2000)                += aaed2000_kbd.o
+obj-$(CONFIG_KEYBOARD_GPIO)            += gpio_keys.o
 
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
new file mode 100644 (file)
index 0000000..7ad479e
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ * Driver for keys on GPIO lines capable of generating interrupts.
+ *
+ * Copyright 2005 Phil Blundell
+ *
+ * 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/version.h>
+
+#include <linux/init.h>
+#include <linux/fs.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/sched.h>
+#include <linux/pm.h>
+#include <linux/sysctl.h>
+#include <linux/proc_fs.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/input.h>
+#include <linux/irq.h>
+
+#include <asm/arch/pxa-regs.h>
+#include <asm/arch/hardware.h>
+
+#include <asm/hardware/gpio_keys.h>
+
+static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
+{
+       int i;
+       struct platform_device *pdev = dev_id;
+       struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
+       struct input_dev *input = platform_get_drvdata(pdev);
+
+       for (i = 0; i < pdata->nbuttons; i++) {
+               int gpio = pdata->buttons[i].gpio;
+               if (irq == IRQ_GPIO(gpio)) {
+                       int state = ((GPLR(gpio) & GPIO_bit(gpio)) ? 1 : 0) ^ (pdata->buttons[i].active_low);
+
+                       input_report_key(input, pdata->buttons[i].keycode, state);
+                       input_sync(input);
+               }
+       }
+
+       return IRQ_HANDLED;
+}
+
+static int __devinit gpio_keys_probe(struct platform_device *pdev)
+{
+       struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
+       struct input_dev *input;
+       int i, error;
+
+       input = input_allocate_device();
+       if (!input)
+               return -ENOMEM;
+
+       platform_set_drvdata(pdev, input);
+
+       input->evbit[0] = BIT(EV_KEY);
+
+       input->name = pdev->name;
+       input->phys = "gpio-keys/input0";
+       input->cdev.dev = &pdev->dev;
+       input->private = pdata;
+
+       input->id.bustype = BUS_HOST;
+       input->id.vendor = 0x0001;
+       input->id.product = 0x0001;
+       input->id.version = 0x0100;
+
+       for (i = 0; i < pdata->nbuttons; i++) {
+               int code = pdata->buttons[i].keycode;
+               int irq = IRQ_GPIO(pdata->buttons[i].gpio);
+
+               set_irq_type(irq, IRQ_TYPE_EDGE_BOTH);
+               error = request_irq(irq, gpio_keys_isr, IRQF_SAMPLE_RANDOM,
+                                    pdata->buttons[i].desc ? pdata->buttons[i].desc : "gpio_keys",
+                                    pdev);
+               if (error) {
+                       printk(KERN_ERR "gpio-keys: unable to claim irq %d; error %d\n", irq, ret);
+                       goto fail;
+               }
+               set_bit(code, input->keybit);
+       }
+
+       error = input_register_device(input);
+       if (error) {
+               printk(KERN_ERR "Unable to register gpio-keys input device\n");
+               goto fail;
+       }
+
+       return 0;
+
+ fail:
+       for (i = i - 1; i >= 0; i--)
+               free_irq(IRQ_GPIO(pdata->buttons[i].gpio), pdev);
+
+       input_free_device(input);
+
+       return error;
+}
+
+static int __devexit gpio_keys_remove(struct platform_device *pdev)
+{
+       struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
+       struct input_dev *input = platform_get_drvdata(pdev);
+       int i;
+
+       for (i = 0; i < pdata->nbuttons; i++) {
+               int irq = IRQ_GPIO(pdata->buttons[i].gpio);
+               free_irq(irq, pdev);
+       }
+
+       input_unregister_device(input);
+
+       return 0;
+}
+
+struct platform_driver gpio_keys_device_driver = {
+       .probe          = gpio_keys_probe,
+       .remove         = __devexit_p(gpio_keys_remove),
+       .driver         = {
+               .name   = "gpio-keys",
+       }
+};
+
+static int __init gpio_keys_init(void)
+{
+       return platform_driver_register(&gpio_keys_device_driver);
+}
+
+static void __exit gpio_keys_exit(void)
+{
+       platform_driver_unregister(&gpio_keys_device_driver);
+}
+
+module_init(gpio_keys_init);
+module_exit(gpio_keys_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Phil Blundell <pb@handhelds.org>");
+MODULE_DESCRIPTION("Keyboard driver for CPU GPIOs");
index 35461eab2fafc3f88d454120637562abdff84a85..255a6ec75a4826a66db9d630a0dbd51aa5fdfe69 100644 (file)
@@ -6,10 +6,10 @@
  *  Copyright (C) 1999-2006 Helge Deller <deller@gmx.de>
  *
  *  Very basic HP Human Interface Loop (HIL) driver.
- *  This driver handles the keyboard on HP300 (m68k) and on some 
+ *  This driver handles the keyboard on HP300 (m68k) and on some
  *  HP700 (parisc) series machines.
  *
- * 
+ *
  * This file is subject to the terms and conditions of the GNU General Public
  * License version 2.  See the file COPYING in the main directory of this
  * archive for more details.
@@ -64,9 +64,9 @@ MODULE_LICENSE("GPL v2");
 #endif
 
 
+
 /* HIL helper functions */
+
 #define hil_busy()              (hil_readb(HILBASE + HIL_CMD) & HIL_BUSY)
 #define hil_data_available()    (hil_readb(HILBASE + HIL_CMD) & HIL_DATA_RDY)
 #define hil_status()            (hil_readb(HILBASE + HIL_CMD))
@@ -75,7 +75,7 @@ MODULE_LICENSE("GPL v2");
 #define hil_write_data(x)       do { hil_writeb((x), HILBASE + HIL_DATA); } while (0)
 
 /* HIL constants */
+
 #define        HIL_BUSY                0x02
 #define        HIL_DATA_RDY            0x01
 
@@ -86,10 +86,10 @@ MODULE_LICENSE("GPL v2");
 #define        HIL_INTON               0x5C            /* Turn on interrupts. */
 #define        HIL_INTOFF              0x5D            /* Turn off interrupts. */
 
-#define        HIL_READKBDSADR         0xF9
-#define        HIL_WRITEKBDSADR        0xE9
+#define        HIL_READKBDSADR         0xF9
+#define        HIL_WRITEKBDSADR        0xE9
 
-static unsigned int hphilkeyb_keycode[HIL_KEYCODES_SET1_TBLSIZE] = 
+static unsigned int hphilkeyb_keycode[HIL_KEYCODES_SET1_TBLSIZE] =
        { HIL_KEYCODES_SET1 };
 
 /* HIL structure */
@@ -97,11 +97,11 @@ static struct {
        struct input_dev *dev;
 
        unsigned int curdev;
-       
+
        unsigned char s;
        unsigned char c;
        int valid;
-       
+
        unsigned char data[16];
        unsigned int ptr;
        spinlock_t lock;
@@ -115,7 +115,7 @@ static void poll_finished(void)
        int down;
        int key;
        unsigned char scode;
-       
+
        switch (hil_dev.data[0]) {
        case 0x40:
                down = (hil_dev.data[1] & 1) == 0;
@@ -127,6 +127,7 @@ static void poll_finished(void)
        hil_dev.curdev = 0;
 }
 
+
 static inline void handle_status(unsigned char s, unsigned char c)
 {
        if (c & 0x8) {
@@ -143,6 +144,7 @@ static inline void handle_status(unsigned char s, unsigned char c)
        }
 }
 
+
 static inline void handle_data(unsigned char s, unsigned char c)
 {
        if (hil_dev.curdev) {
@@ -152,13 +154,11 @@ static inline void handle_data(unsigned char s, unsigned char c)
 }
 
 
-/* 
- * Handle HIL interrupts.
- */
+/* handle HIL interrupts */
 static irqreturn_t hil_interrupt(int irq, void *handle)
 {
        unsigned char s, c;
-       
+
        s = hil_status();
        c = hil_read_data();
 
@@ -179,10 +179,8 @@ static irqreturn_t hil_interrupt(int irq, void *handle)
        return IRQ_HANDLED;
 }
 
-/*
- * Send a command to the HIL
- */
 
+/* send a command to the HIL */
 static void hil_do(unsigned char cmd, unsigned char *data, unsigned int len)
 {
        unsigned long flags;
@@ -200,16 +198,14 @@ static void hil_do(unsigned char cmd, unsigned char *data, unsigned int len)
 }
 
 
-/*
- * Initialise HIL. 
- */
-
+/* initialise HIL */
 static int __init
 hil_keyb_init(void)
 {
        unsigned char c;
        unsigned int i, kbid;
        wait_queue_head_t hil_wait;
+       int err;
 
        if (hil_dev.dev) {
                return -ENODEV; /* already initialized */
@@ -219,15 +215,25 @@ hil_keyb_init(void)
        if (!hil_dev.dev)
                return -ENOMEM;
        hil_dev.dev->private = &hil_dev;
-       
+
 #if defined(CONFIG_HP300)
-       if (!hwreg_present((void *)(HILBASE + HIL_DATA)))
-               return -ENODEV;
-       
-       request_region(HILBASE+HIL_DATA, 2, "hil");
+       if (!hwreg_present((void *)(HILBASE + HIL_DATA))) {
+               printk(KERN_ERR "HIL: hardware register was not found\n");
+               err = -ENODEV;
+               goto err1;
+       }
+       if (!request_region(HILBASE + HIL_DATA, 2, "hil")) {
+               printk(KERN_ERR "HIL: IOPORT region already used\n");
+               err = -EIO;
+               goto err1;
+       }
 #endif
-       
-       request_irq(HIL_IRQ, hil_interrupt, 0, "hil", hil_dev.dev_id);
+
+       err = request_irq(HIL_IRQ, hil_interrupt, 0, "hil", hil_dev.dev_id);
+       if (err) {
+               printk(KERN_ERR "HIL: Can't get IRQ\n");
+               goto err2;
+       }
 
        /* Turn on interrupts */
        hil_do(HIL_INTON, NULL, 0);
@@ -239,47 +245,63 @@ hil_keyb_init(void)
        init_waitqueue_head(&hil_wait);
        wait_event_interruptible_timeout(hil_wait, hil_dev.valid, 3*HZ);
        if (!hil_dev.valid) {
-               printk(KERN_WARNING "HIL: timed out, assuming no keyboard present.\n");
+               printk(KERN_WARNING "HIL: timed out, assuming no keyboard present\n");
        }
 
-       c = hil_dev.c; 
+       c = hil_dev.c;
        hil_dev.valid = 0;
        if (c == 0) {
                kbid = -1;
-               printk(KERN_WARNING "HIL: no keyboard present.\n");
+               printk(KERN_WARNING "HIL: no keyboard present\n");
        } else {
                kbid = ffz(~c);
-               /* printk(KERN_INFO "HIL: keyboard found at id %d\n", kbid); */
+               printk(KERN_INFO "HIL: keyboard found at id %d\n", kbid);
        }
 
        /* set it to raw mode */
        c = 0;
        hil_do(HIL_WRITEKBDSADR, &c, 1);
-       
+
        for (i = 0; i < HIL_KEYCODES_SET1_TBLSIZE; i++)
                if (hphilkeyb_keycode[i] != KEY_RESERVED)
                        set_bit(hphilkeyb_keycode[i], hil_dev.dev->keybit);
 
-       hil_dev.dev->evbit[0]    = BIT(EV_KEY) | BIT(EV_REP);
-       hil_dev.dev->ledbit[0]   = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL);
-       hil_dev.dev->keycodemax  = HIL_KEYCODES_SET1_TBLSIZE;
-       hil_dev.dev->keycodesize = sizeof(hphilkeyb_keycode[0]);
-       hil_dev.dev->keycode     = hphilkeyb_keycode;
-       hil_dev.dev->name       = "HIL keyboard";
-       hil_dev.dev->phys       = "hpkbd/input0";
+       hil_dev.dev->evbit[0]   = BIT(EV_KEY) | BIT(EV_REP);
+       hil_dev.dev->ledbit[0]  = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL);
+       hil_dev.dev->keycodemax = HIL_KEYCODES_SET1_TBLSIZE;
+       hil_dev.dev->keycodesize= sizeof(hphilkeyb_keycode[0]);
+       hil_dev.dev->keycode    = hphilkeyb_keycode;
+       hil_dev.dev->name       = "HIL keyboard";
+       hil_dev.dev->phys       = "hpkbd/input0";
 
        hil_dev.dev->id.bustype = BUS_HIL;
        hil_dev.dev->id.vendor  = PCI_VENDOR_ID_HP;
        hil_dev.dev->id.product = 0x0001;
        hil_dev.dev->id.version = 0x0010;
 
-       input_register_device(hil_dev.dev);
+       err = input_register_device(hil_dev.dev);
+       if (err) {
+               printk(KERN_ERR "HIL: Can't register device\n");
+               goto err3;
+       }
        printk(KERN_INFO "input: %s, ID %d at 0x%08lx (irq %d) found and attached\n",
-               hil_dev.dev->name, kbid, HILBASE, HIL_IRQ);
+              hil_dev.dev->name, kbid, HILBASE, HIL_IRQ);
 
        return 0;
+
+err3:
+       hil_do(HIL_INTOFF, NULL, 0);
+       disable_irq(HIL_IRQ);
+       free_irq(HIL_IRQ, hil_dev.dev_id);
+err2:
+       release_region(HILBASE + HIL_DATA, 2);
+err1:
+       input_free_device(hil_dev.dev);
+       hil_dev.dev = NULL;
+       return err;
 }
 
+
 #if defined(CONFIG_PARISC)
 static int __init
 hil_init_chip(struct parisc_device *dev)
@@ -292,7 +314,7 @@ hil_init_chip(struct parisc_device *dev)
        hil_base = dev->hpa.start;
        hil_irq  = dev->irq;
        hil_dev.dev_id = dev;
-       
+
        printk(KERN_INFO "Found HIL bus at 0x%08lx, IRQ %d\n", hil_base, hil_irq);
 
        return hil_keyb_init();
@@ -313,9 +335,6 @@ static struct parisc_driver hil_driver = {
 #endif /* CONFIG_PARISC */
 
 
-
-
-
 static int __init hil_init(void)
 {
 #if defined(CONFIG_PARISC)
@@ -349,4 +368,3 @@ static void __exit hil_exit(void)
 
 module_init(hil_init);
 module_exit(hil_exit);
-
index ba0e88c64e1ef93befa1c6e0f4483845cb88ebb2..41b42587f5e96e330df17404623cef2a74246554 100644 (file)
@@ -50,6 +50,16 @@ config INPUT_WISTRON_BTNS
          To compile this driver as a module, choose M here: the module will
          be called wistron_btns.
 
+config INPUT_ATLAS_BTNS
+       tristate "x86 Atlas button interface"
+       depends on X86 && ACPI
+       help
+         Say Y here for support of Atlas wallmount touchscreen buttons.
+         The events will show up as scancodes F1 through F9 via evdev.
+
+         To compile this driver as a module, choose M here: the module will
+         be called atlas_btns.
+
 config INPUT_IXP4XX_BEEPER
        tristate "IXP4XX Beeper support"
        depends on ARCH_IXP4XX
index 415c49178985d6fe0f4547e3457f090d4a18820a..e0a8d58c9e9b3125a6531f64b0043a66385dfd42 100644 (file)
@@ -9,5 +9,6 @@ obj-$(CONFIG_INPUT_PCSPKR)              += pcspkr.o
 obj-$(CONFIG_INPUT_M68K_BEEP)          += m68kspkr.o
 obj-$(CONFIG_INPUT_UINPUT)             += uinput.o
 obj-$(CONFIG_INPUT_WISTRON_BTNS)       += wistron_btns.o
+obj-$(CONFIG_INPUT_ATLAS_BTNS)         += atlas_btns.o
 obj-$(CONFIG_HP_SDC_RTC)               += hp_sdc_rtc.o
 obj-$(CONFIG_INPUT_IXP4XX_BEEPER)      += ixp4xx-beeper.o
diff --git a/drivers/input/misc/atlas_btns.c b/drivers/input/misc/atlas_btns.c
new file mode 100644 (file)
index 0000000..0acc3a1
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ *  atlas_btns.c - Atlas Wallmount Touchscreen ACPI Extras
+ *
+ *  Copyright (C) 2006 Jaya Kumar
+ *  Based on Toshiba ACPI by John Belmonte and ASUS ACPI
+ *  This work was sponsored by CIS(M) Sdn Bhd.
+ *
+ *  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
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/input.h>
+#include <linux/types.h>
+#include <asm/uaccess.h>
+#include <acpi/acpi_drivers.h>
+
+#define ACPI_ATLAS_NAME                        "Atlas ACPI"
+#define ACPI_ATLAS_CLASS               "Atlas"
+#define ACPI_ATLAS_BUTTON_HID          "ASIM0000"
+
+static struct input_dev *input_dev;
+
+/* button handling code */
+static acpi_status acpi_atlas_button_setup(acpi_handle region_handle,
+                   u32 function, void *handler_context, void **return_context)
+{
+       *return_context =
+               (function != ACPI_REGION_DEACTIVATE) ? handler_context : NULL;
+
+       return AE_OK;
+}
+
+static acpi_status acpi_atlas_button_handler(u32 function,
+                     acpi_physical_address address,
+                     u32 bit_width, acpi_integer *value,
+                     void *handler_context, void *region_context)
+{
+       acpi_status status;
+       int keycode;
+
+       if (function == ACPI_WRITE) {
+               keycode = KEY_F1 + (address & 0x0F);
+               input_report_key(input_dev, keycode, !(address & 0x10));
+               input_sync(input_dev);
+               status = 0;
+       } else {
+               printk(KERN_WARNING "atlas: shrugged on unexpected function"
+                       ":function=%x,address=%lx,value=%x\n",
+                       function, (unsigned long)address, (u32)*value);
+               status = -EINVAL;
+       }
+
+       return status;
+}
+
+static int atlas_acpi_button_add(struct acpi_device *device)
+{
+       acpi_status status;
+       int err;
+
+       input_dev = input_allocate_device();
+       if (!input_dev) {
+               printk(KERN_ERR "atlas: unable to allocate input device\n");
+               return -ENOMEM;
+       }
+
+       input_dev->name = "Atlas ACPI button driver";
+       input_dev->phys = "ASIM0000/atlas/input0";
+       input_dev->id.bustype = BUS_HOST;
+       input_dev->evbit[LONG(EV_KEY)] = BIT(EV_KEY);
+
+       set_bit(KEY_F1, input_dev->keybit);
+       set_bit(KEY_F2, input_dev->keybit);
+       set_bit(KEY_F3, input_dev->keybit);
+       set_bit(KEY_F4, input_dev->keybit);
+       set_bit(KEY_F5, input_dev->keybit);
+       set_bit(KEY_F6, input_dev->keybit);
+       set_bit(KEY_F7, input_dev->keybit);
+       set_bit(KEY_F8, input_dev->keybit);
+       set_bit(KEY_F9, input_dev->keybit);
+
+       err = input_register_device(input_dev);
+       if (err) {
+               printk(KERN_ERR "atlas: couldn't register input device\n");
+               input_free_device(input_dev);
+               return err;
+       }
+
+       /* hookup button handler */
+       status = acpi_install_address_space_handler(device->handle,
+                               0x81, &acpi_atlas_button_handler,
+                               &acpi_atlas_button_setup, device);
+       if (ACPI_FAILURE(status)) {
+               printk(KERN_ERR "Atlas: Error installing addr spc handler\n");
+               input_unregister_device(input_dev);
+               status = -EINVAL;
+       }
+
+       return status;
+}
+
+static int atlas_acpi_button_remove(struct acpi_device *device, int type)
+{
+       acpi_status status;
+
+       status = acpi_remove_address_space_handler(device->handle,
+                               0x81, &acpi_atlas_button_handler);
+       if (ACPI_FAILURE(status)) {
+               printk(KERN_ERR "Atlas: Error removing addr spc handler\n");
+               status = -EINVAL;
+       }
+
+       input_unregister_device(input_dev);
+
+       return status;
+}
+
+static struct acpi_driver atlas_acpi_driver = {
+       .name   = ACPI_ATLAS_NAME,
+       .class  = ACPI_ATLAS_CLASS,
+       .ids    = ACPI_ATLAS_BUTTON_HID,
+       .ops    = {
+               .add    = atlas_acpi_button_add,
+               .remove = atlas_acpi_button_remove,
+       },
+};
+
+static int __init atlas_acpi_init(void)
+{
+       int result;
+
+       if (acpi_disabled)
+               return -ENODEV;
+
+       result = acpi_bus_register_driver(&atlas_acpi_driver);
+       if (result < 0) {
+               printk(KERN_ERR "Atlas ACPI: Unable to register driver\n");
+               return -ENODEV;
+       }
+
+       return 0;
+}
+
+static void __exit atlas_acpi_exit(void)
+{
+       acpi_bus_unregister_driver(&atlas_acpi_driver);
+}
+
+module_init(atlas_acpi_init);
+module_exit(atlas_acpi_exit);
+
+MODULE_AUTHOR("Jaya Kumar");
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Atlas button driver");
+
index 31d5a13bfd6bb3a534b11918676fda5fb06112fe..ab76ea442fa56140a89d58df87cc934e1073ab2f 100644 (file)
@@ -670,7 +670,7 @@ static int hp_sdc_rtc_ioctl(struct inode *inode, struct file *file,
 #endif
 }
 
-static struct file_operations hp_sdc_rtc_fops = {
+static const struct file_operations hp_sdc_rtc_fops = {
         .owner =       THIS_MODULE,
         .llseek =      no_llseek,
         .read =                hp_sdc_rtc_read,
index 9516439b7c78837ed83ede2d6559c194b4aeb50e..42556232c52388f8d85b68ce596292a6a5fe5b64 100644 (file)
@@ -627,7 +627,7 @@ static long uinput_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
        return retval;
 }
 
-static struct file_operations uinput_fops = {
+static const struct file_operations uinput_fops = {
        .owner          = THIS_MODULE,
        .open           = uinput_open,
        .release        = uinput_release,
index 7b9d1c1da41a7d676737e7adc92c1f1700e1d6a1..e1183aeb8ed5ce4708b585acb1b500394d3e628e 100644 (file)
@@ -335,6 +335,17 @@ static struct key_entry keymap_aopen_1559as[] = {
        { KE_END,  0 },
 };
 
+static struct key_entry keymap_fs_amilo_d88x0[] = {
+       { KE_KEY, 0x01, KEY_HELP },
+       { KE_KEY, 0x08, KEY_MUTE },
+       { KE_KEY, 0x31, KEY_MAIL },
+       { KE_KEY, 0x36, KEY_WWW },
+       { KE_KEY, 0x11, KEY_PROG1 },
+       { KE_KEY, 0x12, KEY_PROG2 },
+       { KE_KEY, 0x13, KEY_PROG3 },
+       { KE_END, 0 }
+};
+
 /*
  * If your machine is not here (which is currently rather likely), please send
  * a list of buttons and their key codes (reported when loading this module
@@ -413,6 +424,15 @@ static struct dmi_system_id dmi_ids[] __initdata = {
                },
                .driver_data = keymap_wistron_ms2111
        },
+       {
+               .callback = dmi_matched,
+               .ident = "Fujitsu Siemens Amilo D88x0",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "AMILO D"),
+               },
+               .driver_data = keymap_fs_amilo_d88x0
+       },
        { NULL, }
 };
 
index 13dd96785e397bf81d632993512e9457ae3e0053..701ebd5473cfe8745ca8ef4e82e2f6a7647d352c 100644 (file)
@@ -61,7 +61,7 @@ MODULE_LICENSE("GPL");
 #define INPORT_REG_MODE                0x07
 #define INPORT_RESET           0x80
 
-#ifdef CONFIG_INPUT_ATIXL
+#ifdef CONFIG_MOUSE_ATIXL
 #define INPORT_NAME            "ATI XL Mouse"
 #define INPORT_VENDOR          0x0002
 #define INPORT_SPEED_30HZ      0x01
index f155c1fea04e3bd2e3181106886782011f3d64e7..05d992e514f0bd5452dc0a6f0c9161b01a01c753 100644 (file)
@@ -113,7 +113,7 @@ static int __init pc110pad_init(void)
        dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL);
        if (dev) {
                pci_dev_put(dev);
-               return -ENOENT;
+               return -ENODEV;
        }
 
        if (!request_region(pc110pad_io, 4, "pc110pad")) {
index fbdcfd8eb4e9d9860a2f190d98dcbfb32e175c3d..355efd0423e7df49cd5cbbf35b26eb3da774adf5 100644 (file)
@@ -18,7 +18,6 @@
  */
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/ptrace.h>
 #include <linux/interrupt.h>
 #include <linux/init.h>
index 49e11e2c1d5dd24e08c8c0caab91d270e805c19e..4fa93ff309199e1f041657341eb379aca744aff7 100644 (file)
@@ -59,7 +59,6 @@
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/timer.h>
-#include <linux/sched.h>
 #include <linux/list.h>
 
 MODULE_AUTHOR("Brian S. Julin <bri@calyx.com>");
index 9907ad3bea23252547a6a26c6cfd4d4dafae1269..b57370dc4e3d55956cbb3e03f2721553069e75dc 100644 (file)
@@ -62,7 +62,6 @@
  */
 
 #include <linux/hp_sdc.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/init.h>
 #include <linux/module.h>
index debe9445488c0cfefc221823da9fe205a5515d9f..c3fdfc1f342a2fdd38b35e1294adc77ca0d44d9e 100644 (file)
@@ -371,7 +371,7 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id)
        if (unlikely(i8042_suppress_kbd_ack))
                if (port_no == I8042_KBD_PORT_NO &&
                    (data == 0xfa || data == 0xfe)) {
-                       i8042_suppress_kbd_ack = 0;
+                       i8042_suppress_kbd_ack--;
                        goto out;
                }
 
@@ -543,6 +543,7 @@ static int __devinit i8042_check_aux(void)
 {
        int retval = -1;
        int irq_registered = 0;
+       int aux_loop_broken = 0;
        unsigned long flags;
        unsigned char param;
 
@@ -572,6 +573,8 @@ static int __devinit i8042_check_aux(void)
                if (i8042_command(&param, I8042_CMD_AUX_TEST) ||
                    (param && param != 0xfa && param != 0xff))
                        return -1;
+
+               aux_loop_broken = 1;
        }
 
 /*
@@ -595,7 +598,7 @@ static int __devinit i8042_check_aux(void)
  * used it for a PCI card or somethig else.
  */
 
-       if (i8042_noloop) {
+       if (i8042_noloop || aux_loop_broken) {
 /*
  * Without LOOP command we can't test AUX IRQ delivery. Assume the port
  * is working and hope we are right.
@@ -838,13 +841,14 @@ static long i8042_panic_blink(long count)
        led ^= 0x01 | 0x04;
        while (i8042_read_status() & I8042_STR_IBF)
                DELAY;
-       i8042_suppress_kbd_ack = 1;
+       dbg("%02x -> i8042 (panic blink)", 0xed);
+       i8042_suppress_kbd_ack = 2;
        i8042_write_data(0xed); /* set leds */
        DELAY;
        while (i8042_read_status() & I8042_STR_IBF)
                DELAY;
        DELAY;
-       i8042_suppress_kbd_ack = 1;
+       dbg("%02x -> i8042 (panic blink)", led);
        i8042_write_data(led);
        DELAY;
        last_blink = count;
index 088ebc348ba31da45ddefa6b10a51aabf168185f..887357666c683f0337dfe8dfef3756fd3fe77ad2 100644 (file)
@@ -234,7 +234,7 @@ static unsigned int serio_raw_poll(struct file *file, poll_table *wait)
        return 0;
 }
 
-static struct file_operations serio_raw_fops = {
+static const struct file_operations serio_raw_fops = {
        .owner =        THIS_MODULE,
        .open =         serio_raw_open,
        .release =      serio_raw_release,
index 6b46c9bf1d2045c7bf79a1c2c977bdf92a6db27e..971618059a6f6a25648cf3f031548f1d5bc4a20d 100644 (file)
@@ -12,13 +12,18 @@ menuconfig INPUT_TOUCHSCREEN
 if INPUT_TOUCHSCREEN
 
 config TOUCHSCREEN_ADS7846
-       tristate "ADS 7846 based touchscreens"
+       tristate "ADS 7846/7843 based touchscreens"
        depends on SPI_MASTER
+       depends on HWMON = n || HWMON
        help
          Say Y here if you have a touchscreen interface using the
-         ADS7846 controller, and your board-specific initialization
+         ADS7846 or ADS7843 controller, and your board-specific setup
          code includes that in its table of SPI devices.
 
+         If HWMON is selected, and the driver is told the reference voltage
+         on your board, you will also get hwmon interfaces for the voltage
+         (and on ads7846, temperature) sensors of this chip.
+
          If unsure, say N (but it's safe to say "Y").
 
          To compile this driver as a module, choose M here: the
index c6164b6f476a3ecb5fde27af07ddd05c38557d01..0a26e0663542bf968b517ac6b0e087ff8cf64237 100644 (file)
@@ -17,8 +17,9 @@
  *  it under the terms of the GNU General Public License version 2 as
  *  published by the Free Software Foundation.
  */
-#include <linux/device.h>
+#include <linux/hwmon.h>
 #include <linux/init.h>
+#include <linux/err.h>
 #include <linux/delay.h>
 #include <linux/input.h>
 #include <linux/interrupt.h>
@@ -54,7 +55,8 @@
  * files.
  */
 
-#define        TS_POLL_PERIOD  msecs_to_jiffies(10)
+#define TS_POLL_DELAY  (1 * 1000000)   /* ns delay before the first sample */
+#define TS_POLL_PERIOD (5 * 1000000)   /* ns delay between samples */
 
 /* this driver doesn't aim at the peak continuous sample rate */
 #define        SAMPLE_BITS     (8 /*cmd*/ + 16 /*sample*/ + 2 /* before, after */)
@@ -63,12 +65,12 @@ struct ts_event {
        /* For portability, we can't read 12 bit values using SPI (which
         * would make the controller deliver them as native byteorder u16
         * with msbs zeroed).  Instead, we read them as two 8-bit values,
-        * which need byteswapping then range adjustment.
+        * *** WHICH NEED BYTESWAPPING *** and range adjustment.
         */
-       __be16 x;
-       __be16 y;
-       __be16 z1, z2;
-       int    ignore;
+       u16     x;
+       u16     y;
+       u16     z1, z2;
+       int     ignore;
 };
 
 struct ads7846 {
@@ -76,7 +78,12 @@ struct ads7846 {
        char                    phys[32];
 
        struct spi_device       *spi;
+
+#if defined(CONFIG_HWMON) || defined(CONFIG_HWMON_MODULE)
        struct attribute_group  *attr_group;
+       struct class_device     *hwmon;
+#endif
+
        u16                     model;
        u16                     vref_delay_usecs;
        u16                     x_plate_ohms;
@@ -99,13 +106,16 @@ struct ads7846 {
        u16                     debounce_rep;
 
        spinlock_t              lock;
-       struct timer_list       timer;          /* P: lock */
+       struct hrtimer          timer;
        unsigned                pendown:1;      /* P: lock */
        unsigned                pending:1;      /* P: lock */
 // FIXME remove "irq_disabled"
        unsigned                irq_disabled:1; /* P: lock */
        unsigned                disabled:1;
 
+       int                     (*filter)(void *data, int data_idx, int *val);
+       void                    *filter_data;
+       void                    (*filter_cleanup)(void *data);
        int                     (*get_pendown_state)(void);
 };
 
@@ -142,15 +152,16 @@ struct ads7846 {
 #define        MAX_12BIT       ((1<<12)-1)
 
 /* leave ADC powered up (disables penirq) between differential samples */
-#define        READ_12BIT_DFR(x) (ADS_START | ADS_A2A1A0_d_ ## x \
-       | ADS_12_BIT | ADS_DFR)
+#define        READ_12BIT_DFR(x, adc, vref) (ADS_START | ADS_A2A1A0_d_ ## x \
+       | ADS_12_BIT | ADS_DFR | \
+       (adc ? ADS_PD10_ADC_ON : 0) | (vref ? ADS_PD10_REF_ON : 0))
 
-#define        READ_Y  (READ_12BIT_DFR(y)  | ADS_PD10_ADC_ON)
-#define        READ_Z1 (READ_12BIT_DFR(z1) | ADS_PD10_ADC_ON)
-#define        READ_Z2 (READ_12BIT_DFR(z2) | ADS_PD10_ADC_ON)
+#define        READ_Y(vref)    (READ_12BIT_DFR(y,  1, vref))
+#define        READ_Z1(vref)   (READ_12BIT_DFR(z1, 1, vref))
+#define        READ_Z2(vref)   (READ_12BIT_DFR(z2, 1, vref))
 
-#define        READ_X  (READ_12BIT_DFR(x)  | ADS_PD10_ADC_ON)
-#define        PWRDOWN (READ_12BIT_DFR(y)  | ADS_PD10_PDOWN)   /* LAST */
+#define        READ_X(vref)    (READ_12BIT_DFR(x,  1, vref))
+#define        PWRDOWN         (READ_12BIT_DFR(y,  0, 0))      /* LAST */
 
 /* single-ended samples need to first power up reference voltage;
  * we leave both ADC and VREF powered
@@ -158,14 +169,19 @@ struct ads7846 {
 #define        READ_12BIT_SER(x) (ADS_START | ADS_A2A1A0_ ## x \
        | ADS_12_BIT | ADS_SER)
 
-#define        REF_ON  (READ_12BIT_DFR(x) | ADS_PD10_ALL_ON)
-#define        REF_OFF (READ_12BIT_DFR(y) | ADS_PD10_PDOWN)
+#define        REF_ON  (READ_12BIT_DFR(x, 1, 1))
+#define        REF_OFF (READ_12BIT_DFR(y, 0, 0))
 
 /*--------------------------------------------------------------------------*/
 
 /*
  * Non-touchscreen sensors only use single-ended conversions.
+ * The range is GND..vREF. The ads7843 and ads7835 must use external vREF;
+ * ads7846 lets that pin be unconnected, to use internal vREF.
  */
+static unsigned vREF_mV;
+module_param(vREF_mV, uint, 0);
+MODULE_PARM_DESC(vREF_mV, "external vREF voltage, in milliVolts");
 
 struct ser_req {
        u8                      ref_on;
@@ -193,50 +209,55 @@ static int ads7846_read12_ser(struct device *dev, unsigned command)
        struct ser_req          *req = kzalloc(sizeof *req, GFP_KERNEL);
        int                     status;
        int                     sample;
-       int                     i;
+       int                     use_internal;
 
        if (!req)
                return -ENOMEM;
 
        spi_message_init(&req->msg);
 
-       /* activate reference, so it has time to settle; */
-       req->ref_on = REF_ON;
-       req->xfer[0].tx_buf = &req->ref_on;
-       req->xfer[0].len = 1;
-       req->xfer[1].rx_buf = &req->scratch;
-       req->xfer[1].len = 2;
-
-       /*
-        * for external VREF, 0 usec (and assume it's always on);
-        * for 1uF, use 800 usec;
-        * no cap, 100 usec.
-        */
-       req->xfer[1].delay_usecs = ts->vref_delay_usecs;
+       /* FIXME boards with ads7846 might use external vref instead ... */
+       use_internal = (ts->model == 7846);
+
+       /* maybe turn on internal vREF, and let it settle */
+       if (use_internal) {
+               req->ref_on = REF_ON;
+               req->xfer[0].tx_buf = &req->ref_on;
+               req->xfer[0].len = 1;
+               spi_message_add_tail(&req->xfer[0], &req->msg);
+
+               req->xfer[1].rx_buf = &req->scratch;
+               req->xfer[1].len = 2;
+
+               /* for 1uF, settle for 800 usec; no cap, 100 usec.  */
+               req->xfer[1].delay_usecs = ts->vref_delay_usecs;
+               spi_message_add_tail(&req->xfer[1], &req->msg);
+       }
 
        /* take sample */
        req->command = (u8) command;
        req->xfer[2].tx_buf = &req->command;
        req->xfer[2].len = 1;
+       spi_message_add_tail(&req->xfer[2], &req->msg);
+
        req->xfer[3].rx_buf = &req->sample;
        req->xfer[3].len = 2;
+       spi_message_add_tail(&req->xfer[3], &req->msg);
 
        /* REVISIT:  take a few more samples, and compare ... */
 
-       /* turn off reference */
-       req->ref_off = REF_OFF;
-       req->xfer[4].tx_buf = &req->ref_off;
-       req->xfer[4].len = 1;
-       req->xfer[5].rx_buf = &req->scratch;
-       req->xfer[5].len = 2;
-
-       CS_CHANGE(req->xfer[5]);
-
-       /* group all the transfers together, so we can't interfere with
-        * reading touchscreen state; disable penirq while sampling
-        */
-       for (i = 0; i < 6; i++)
-               spi_message_add_tail(&req->xfer[i], &req->msg);
+       /* maybe off internal vREF */
+       if (use_internal) {
+               req->ref_off = REF_OFF;
+               req->xfer[4].tx_buf = &req->ref_off;
+               req->xfer[4].len = 1;
+               spi_message_add_tail(&req->xfer[4], &req->msg);
+
+               req->xfer[5].rx_buf = &req->scratch;
+               req->xfer[5].len = 2;
+               CS_CHANGE(req->xfer[5]);
+               spi_message_add_tail(&req->xfer[5], &req->msg);
+       }
 
        ts->irq_disabled = 1;
        disable_irq(spi->irq);
@@ -256,25 +277,173 @@ static int ads7846_read12_ser(struct device *dev, unsigned command)
        return status ? status : sample;
 }
 
-#define SHOW(name) static ssize_t \
+#if defined(CONFIG_HWMON) || defined(CONFIG_HWMON_MODULE)
+
+#define SHOW(name, var, adjust) static ssize_t \
 name ## _show(struct device *dev, struct device_attribute *attr, char *buf) \
 { \
+       struct ads7846 *ts = dev_get_drvdata(dev); \
        ssize_t v = ads7846_read12_ser(dev, \
-                       READ_12BIT_SER(name) | ADS_PD10_ALL_ON); \
+                       READ_12BIT_SER(var) | ADS_PD10_ALL_ON); \
        if (v < 0) \
                return v; \
-       return sprintf(buf, "%u\n", (unsigned) v); \
+       return sprintf(buf, "%u\n", adjust(ts, v)); \
 } \
 static DEVICE_ATTR(name, S_IRUGO, name ## _show, NULL);
 
-SHOW(temp0)
-SHOW(temp1)
-SHOW(vaux)
-SHOW(vbatt)
+
+/* Sysfs conventions report temperatures in millidegrees Celcius.
+ * ADS7846 could use the low-accuracy two-sample scheme, but can't do the high
+ * accuracy scheme without calibration data.  For now we won't try either;
+ * userspace sees raw sensor values, and must scale/calibrate appropriately.
+ */
+static inline unsigned null_adjust(struct ads7846 *ts, ssize_t v)
+{
+       return v;
+}
+
+SHOW(temp0, temp0, null_adjust)                /* temp1_input */
+SHOW(temp1, temp1, null_adjust)                /* temp2_input */
+
+
+/* sysfs conventions report voltages in millivolts.  We can convert voltages
+ * if we know vREF.  userspace may need to scale vAUX to match the board's
+ * external resistors; we assume that vBATT only uses the internal ones.
+ */
+static inline unsigned vaux_adjust(struct ads7846 *ts, ssize_t v)
+{
+       unsigned retval = v;
+
+       /* external resistors may scale vAUX into 0..vREF */
+       retval *= vREF_mV;
+       retval = retval >> 12;
+       return retval;
+}
+
+static inline unsigned vbatt_adjust(struct ads7846 *ts, ssize_t v)
+{
+       unsigned retval = vaux_adjust(ts, v);
+
+       /* ads7846 has a resistor ladder to scale this signal down */
+       if (ts->model == 7846)
+               retval *= 4;
+       return retval;
+}
+
+SHOW(in0_input, vaux, vaux_adjust)
+SHOW(in1_input, vbatt, vbatt_adjust)
+
+
+static struct attribute *ads7846_attributes[] = {
+       &dev_attr_temp0.attr,
+       &dev_attr_temp1.attr,
+       &dev_attr_in0_input.attr,
+       &dev_attr_in1_input.attr,
+       NULL,
+};
+
+static struct attribute_group ads7846_attr_group = {
+       .attrs = ads7846_attributes,
+};
+
+static struct attribute *ads7843_attributes[] = {
+       &dev_attr_in0_input.attr,
+       &dev_attr_in1_input.attr,
+       NULL,
+};
+
+static struct attribute_group ads7843_attr_group = {
+       .attrs = ads7843_attributes,
+};
+
+static struct attribute *ads7845_attributes[] = {
+       &dev_attr_in0_input.attr,
+       NULL,
+};
+
+static struct attribute_group ads7845_attr_group = {
+       .attrs = ads7845_attributes,
+};
+
+static int ads784x_hwmon_register(struct spi_device *spi, struct ads7846 *ts)
+{
+       struct class_device *hwmon;
+       int err;
+
+       /* hwmon sensors need a reference voltage */
+       switch (ts->model) {
+       case 7846:
+               if (!vREF_mV) {
+                       dev_dbg(&spi->dev, "assuming 2.5V internal vREF\n");
+                       vREF_mV = 2500;
+               }
+               break;
+       case 7845:
+       case 7843:
+               if (!vREF_mV) {
+                       dev_warn(&spi->dev,
+                               "external vREF for ADS%d not specified\n",
+                               ts->model);
+                       return 0;
+               }
+               break;
+       }
+
+       /* different chips have different sensor groups */
+       switch (ts->model) {
+       case 7846:
+               ts->attr_group = &ads7846_attr_group;
+               break;
+       case 7845:
+               ts->attr_group = &ads7845_attr_group;
+               break;
+       case 7843:
+               ts->attr_group = &ads7843_attr_group;
+               break;
+       default:
+               dev_dbg(&spi->dev, "ADS%d not recognized\n", ts->model);
+               return 0;
+       }
+
+       err = sysfs_create_group(&spi->dev.kobj, ts->attr_group);
+       if (err)
+               return err;
+
+       hwmon = hwmon_device_register(&spi->dev);
+       if (IS_ERR(hwmon)) {
+               sysfs_remove_group(&spi->dev.kobj, ts->attr_group);
+               return PTR_ERR(hwmon);
+       }
+
+       ts->hwmon = hwmon;
+       return 0;
+}
+
+static void ads784x_hwmon_unregister(struct spi_device *spi,
+                                    struct ads7846 *ts)
+{
+       if (ts->hwmon) {
+               sysfs_remove_group(&spi->dev.kobj, ts->attr_group);
+               hwmon_device_unregister(ts->hwmon);
+       }
+}
+
+#else
+static inline int ads784x_hwmon_register(struct spi_device *spi,
+                                        struct ads7846 *ts)
+{
+       return 0;
+}
+
+static inline void ads784x_hwmon_unregister(struct spi_device *spi,
+                                           struct ads7846 *ts)
+{
+}
+#endif
 
 static int is_pen_down(struct device *dev)
 {
-       struct ads7846          *ts = dev_get_drvdata(dev);
+       struct ads7846  *ts = dev_get_drvdata(dev);
 
        return ts->pendown;
 }
@@ -318,46 +487,14 @@ static ssize_t ads7846_disable_store(struct device *dev,
 
 static DEVICE_ATTR(disable, 0664, ads7846_disable_show, ads7846_disable_store);
 
-static struct attribute *ads7846_attributes[] = {
-       &dev_attr_temp0.attr,
-       &dev_attr_temp1.attr,
-       &dev_attr_vbatt.attr,
-       &dev_attr_vaux.attr,
-       &dev_attr_pen_down.attr,
-       &dev_attr_disable.attr,
-       NULL,
-};
-
-static struct attribute_group ads7846_attr_group = {
-       .attrs = ads7846_attributes,
-};
-
-/*
- * ads7843/7845 don't have temperature sensors, and
- * use the other sensors a bit differently too
- */
-
-static struct attribute *ads7843_attributes[] = {
-       &dev_attr_vbatt.attr,
-       &dev_attr_vaux.attr,
+static struct attribute *ads784x_attributes[] = {
        &dev_attr_pen_down.attr,
        &dev_attr_disable.attr,
        NULL,
 };
 
-static struct attribute_group ads7843_attr_group = {
-       .attrs = ads7843_attributes,
-};
-
-static struct attribute *ads7845_attributes[] = {
-       &dev_attr_vaux.attr,
-       &dev_attr_pen_down.attr,
-       &dev_attr_disable.attr,
-       NULL,
-};
-
-static struct attribute_group ads7845_attr_group = {
-       .attrs = ads7845_attributes,
+static struct attribute_group ads784x_attr_group = {
+       .attrs = ads784x_attributes,
 };
 
 /*--------------------------------------------------------------------------*/
@@ -373,25 +510,22 @@ static struct attribute_group ads7845_attr_group = {
 static void ads7846_rx(void *ads)
 {
        struct ads7846          *ts = ads;
-       struct input_dev        *input_dev = ts->input;
        unsigned                Rt;
-       unsigned                sync = 0;
        u16                     x, y, z1, z2;
-       unsigned long           flags;
 
-       /* adjust:  on-wire is a must-ignore bit, a BE12 value, then padding;
-        * built from two 8 bit values written msb-first.
+       /* ads7846_rx_val() did in-place conversion (including byteswap) from
+        * on-the-wire format as part of debouncing to get stable readings.
         */
-       x = (be16_to_cpu(ts->tc.x) >> 3) & 0x0fff;
-       y = (be16_to_cpu(ts->tc.y) >> 3) & 0x0fff;
-       z1 = (be16_to_cpu(ts->tc.z1) >> 3) & 0x0fff;
-       z2 = (be16_to_cpu(ts->tc.z2) >> 3) & 0x0fff;
+       x = ts->tc.x;
+       y = ts->tc.y;
+       z1 = ts->tc.z1;
+       z2 = ts->tc.z2;
 
        /* range filtering */
        if (x == MAX_12BIT)
                x = 0;
 
-       if (likely(x && z1 && !device_suspended(&ts->spi->dev))) {
+       if (likely(x && z1)) {
                /* compute touch pressure resistance using equation #2 */
                Rt = z2;
                Rt -= z1;
@@ -403,100 +537,130 @@ static void ads7846_rx(void *ads)
                Rt = 0;
 
        /* Sample found inconsistent by debouncing or pressure is beyond
-       * the maximum. Don't report it to user space, repeat at least
-       * once more the measurement */
+        * the maximum. Don't report it to user space, repeat at least
+        * once more the measurement
+        */
        if (ts->tc.ignore || Rt > ts->pressure_max) {
-               mod_timer(&ts->timer, jiffies + TS_POLL_PERIOD);
+#ifdef VERBOSE
+               pr_debug("%s: ignored %d pressure %d\n",
+                       ts->spi->dev.bus_id, ts->tc.ignore, Rt);
+#endif
+               hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_PERIOD),
+                             HRTIMER_MODE_REL);
                return;
        }
 
-       /* NOTE:  "pendown" is inferred from pressure; we don't rely on
-        * being able to check nPENIRQ status, or "friendly" trigger modes
-        * (both-edges is much better than just-falling or low-level).
+       /* NOTE: We can't rely on the pressure to determine the pen down
+        * state, even this controller has a pressure sensor.  The pressure
+        * value can fluctuate for quite a while after lifting the pen and
+        * in some cases may not even settle at the expected value.
         *
-        * REVISIT:  some boards may require reading nPENIRQ; it's
-        * needed on 7843.  and 7845 reads pressure differently...
-        *
-        * REVISIT:  the touchscreen might not be connected; this code
-        * won't notice that, even if nPENIRQ never fires ...
+        * The only safe way to check for the pen up condition is in the
+        * timer by reading the pen signal state (it's a GPIO _and_ IRQ).
         */
-       if (!ts->pendown && Rt != 0) {
-               input_report_key(input_dev, BTN_TOUCH, 1);
-               sync = 1;
-       } else if (ts->pendown && Rt == 0) {
-               input_report_key(input_dev, BTN_TOUCH, 0);
-               sync = 1;
-       }
-
        if (Rt) {
-               input_report_abs(input_dev, ABS_X, x);
-               input_report_abs(input_dev, ABS_Y, y);
-               sync = 1;
-       }
-
-       if (sync) {
-               input_report_abs(input_dev, ABS_PRESSURE, Rt);
-               input_sync(input_dev);
-       }
+               struct input_dev *input = ts->input;
 
-#ifdef VERBOSE
-       if (Rt || ts->pendown)
-               pr_debug("%s: %d/%d/%d%s\n", ts->spi->dev.bus_id,
-                       x, y, Rt, Rt ? "" : " UP");
+               if (!ts->pendown) {
+                       input_report_key(input, BTN_TOUCH, 1);
+                       ts->pendown = 1;
+#ifdef VERBOSE
+                       dev_dbg(&ts->spi->dev, "DOWN\n");
 #endif
+               }
+               input_report_abs(input, ABS_X, x);
+               input_report_abs(input, ABS_Y, y);
+               input_report_abs(input, ABS_PRESSURE, Rt);
 
-       spin_lock_irqsave(&ts->lock, flags);
-
-       ts->pendown = (Rt != 0);
-       mod_timer(&ts->timer, jiffies + TS_POLL_PERIOD);
+               input_sync(input);
+#ifdef VERBOSE
+               dev_dbg(&ts->spi->dev, "%4d/%4d/%4d\n", x, y, Rt);
+#endif
+       }
 
-       spin_unlock_irqrestore(&ts->lock, flags);
+       hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_PERIOD),
+                       HRTIMER_MODE_REL);
 }
 
-static void ads7846_debounce(void *ads)
+static int ads7846_debounce(void *ads, int data_idx, int *val)
 {
        struct ads7846          *ts = ads;
-       struct spi_message      *m;
-       struct spi_transfer     *t;
-       int                     val;
-       int                     status;
 
-       m = &ts->msg[ts->msg_idx];
-       t = list_entry(m->transfers.prev, struct spi_transfer, transfer_list);
-       val = (be16_to_cpu(*(__be16 *)t->rx_buf) >> 3) & 0x0fff;
-       if (!ts->read_cnt || (abs(ts->last_read - val) > ts->debounce_tol)) {
+       if (!ts->read_cnt || (abs(ts->last_read - *val) > ts->debounce_tol)) {
+               /* Start over collecting consistent readings. */
+               ts->read_rep = 0;
                /* Repeat it, if this was the first read or the read
                 * wasn't consistent enough. */
                if (ts->read_cnt < ts->debounce_max) {
-                       ts->last_read = val;
+                       ts->last_read = *val;
                        ts->read_cnt++;
+                       return ADS7846_FILTER_REPEAT;
                } else {
                        /* Maximum number of debouncing reached and still
                         * not enough number of consistent readings. Abort
                         * the whole sample, repeat it in the next sampling
                         * period.
                         */
-                       ts->tc.ignore = 1;
                        ts->read_cnt = 0;
-                       /* Last message will contain ads7846_rx() as the
-                        * completion function.
-                        */
-                       m = ts->last_msg;
+                       return ADS7846_FILTER_IGNORE;
                }
-               /* Start over collecting consistent readings. */
-               ts->read_rep = 0;
        } else {
                if (++ts->read_rep > ts->debounce_rep) {
                        /* Got a good reading for this coordinate,
                         * go for the next one. */
-                       ts->tc.ignore = 0;
-                       ts->msg_idx++;
                        ts->read_cnt = 0;
                        ts->read_rep = 0;
-                       m++;
-               } else
+                       return ADS7846_FILTER_OK;
+               } else {
                        /* Read more values that are consistent. */
                        ts->read_cnt++;
+                       return ADS7846_FILTER_REPEAT;
+               }
+       }
+}
+
+static int ads7846_no_filter(void *ads, int data_idx, int *val)
+{
+       return ADS7846_FILTER_OK;
+}
+
+static void ads7846_rx_val(void *ads)
+{
+       struct ads7846 *ts = ads;
+       struct spi_message *m;
+       struct spi_transfer *t;
+       u16 *rx_val;
+       int val;
+       int action;
+       int status;
+
+       m = &ts->msg[ts->msg_idx];
+       t = list_entry(m->transfers.prev, struct spi_transfer, transfer_list);
+       rx_val = t->rx_buf;
+
+       /* adjust:  on-wire is a must-ignore bit, a BE12 value, then padding;
+        * built from two 8 bit values written msb-first.
+        */
+       val = be16_to_cpu(*rx_val) >> 3;
+
+       action = ts->filter(ts->filter_data, ts->msg_idx, &val);
+       switch (action) {
+       case ADS7846_FILTER_REPEAT:
+               break;
+       case ADS7846_FILTER_IGNORE:
+               ts->tc.ignore = 1;
+               /* Last message will contain ads7846_rx() as the
+                * completion function.
+                */
+               m = ts->last_msg;
+               break;
+       case ADS7846_FILTER_OK:
+               *rx_val = val;
+               ts->tc.ignore = 0;
+               m = &ts->msg[++ts->msg_idx];
+               break;
+       default:
+               BUG();
        }
        status = spi_async(ts->spi, m);
        if (status)
@@ -504,21 +668,34 @@ static void ads7846_debounce(void *ads)
                                status);
 }
 
-static void ads7846_timer(unsigned long handle)
+static enum hrtimer_restart ads7846_timer(struct hrtimer *handle)
 {
-       struct ads7846  *ts = (void *)handle;
+       struct ads7846  *ts = container_of(handle, struct ads7846, timer);
        int             status = 0;
 
        spin_lock_irq(&ts->lock);
 
-       if (unlikely(ts->msg_idx && !ts->pendown)) {
+       if (unlikely(!ts->get_pendown_state() ||
+                    device_suspended(&ts->spi->dev))) {
+               if (ts->pendown) {
+                       struct input_dev *input = ts->input;
+
+                       input_report_key(input, BTN_TOUCH, 0);
+                       input_report_abs(input, ABS_PRESSURE, 0);
+                       input_sync(input);
+
+                       ts->pendown = 0;
+#ifdef VERBOSE
+                       dev_dbg(&ts->spi->dev, "UP\n");
+#endif
+               }
+
                /* measurement cycle ended */
                if (!device_suspended(&ts->spi->dev)) {
                        ts->irq_disabled = 0;
                        enable_irq(ts->spi->irq);
                }
                ts->pending = 0;
-               ts->msg_idx = 0;
        } else {
                /* pen is still down, continue with the measurement */
                ts->msg_idx = 0;
@@ -528,6 +705,7 @@ static void ads7846_timer(unsigned long handle)
        }
 
        spin_unlock_irq(&ts->lock);
+       return HRTIMER_NORESTART;
 }
 
 static irqreturn_t ads7846_irq(int irq, void *handle)
@@ -546,7 +724,8 @@ static irqreturn_t ads7846_irq(int irq, void *handle)
                        ts->irq_disabled = 1;
                        disable_irq(ts->spi->irq);
                        ts->pending = 1;
-                       mod_timer(&ts->timer, jiffies);
+                       hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_DELAY),
+                                       HRTIMER_MODE_REL);
                }
        }
        spin_unlock_irqrestore(&ts->lock, flags);
@@ -632,6 +811,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
        struct ads7846_platform_data    *pdata = spi->dev.platform_data;
        struct spi_message              *m;
        struct spi_transfer             *x;
+       int                             vref;
        int                             err;
 
        if (!spi->irq) {
@@ -665,6 +845,10 @@ static int __devinit ads7846_probe(struct spi_device *spi)
         * may not.  So we stick to very-portable 8 bit words, both RX and TX.
         */
        spi->bits_per_word = 8;
+       spi->mode = SPI_MODE_1;
+       err = spi_setup(spi);
+       if (err < 0)
+               return err;
 
        ts = kzalloc(sizeof(struct ads7846), GFP_KERNEL);
        input_dev = input_allocate_device();
@@ -679,8 +863,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
        ts->spi = spi;
        ts->input = input_dev;
 
-       init_timer(&ts->timer);
-       ts->timer.data = (unsigned long) ts;
+       hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
        ts->timer.function = ads7846_timer;
 
        spin_lock_init(&ts->lock);
@@ -689,14 +872,25 @@ static int __devinit ads7846_probe(struct spi_device *spi)
        ts->vref_delay_usecs = pdata->vref_delay_usecs ? : 100;
        ts->x_plate_ohms = pdata->x_plate_ohms ? : 400;
        ts->pressure_max = pdata->pressure_max ? : ~0;
-       if (pdata->debounce_max) {
+
+       if (pdata->filter != NULL) {
+               if (pdata->filter_init != NULL) {
+                       err = pdata->filter_init(pdata, &ts->filter_data);
+                       if (err < 0)
+                               goto err_free_mem;
+               }
+               ts->filter = pdata->filter;
+               ts->filter_cleanup = pdata->filter_cleanup;
+       } else if (pdata->debounce_max) {
                ts->debounce_max = pdata->debounce_max;
+               if (ts->debounce_max < 2)
+                       ts->debounce_max = 2;
                ts->debounce_tol = pdata->debounce_tol;
                ts->debounce_rep = pdata->debounce_rep;
-               if (ts->debounce_rep > ts->debounce_max + 1)
-                       ts->debounce_rep = ts->debounce_max - 1;
+               ts->filter = ads7846_debounce;
+               ts->filter_data = ts;
        } else
-               ts->debounce_tol = ~0;
+               ts->filter = ads7846_no_filter;
        ts->get_pendown_state = pdata->get_pendown_state;
 
        snprintf(ts->phys, sizeof(ts->phys), "%s/input0", spi->dev.bus_id);
@@ -718,6 +912,8 @@ static int __devinit ads7846_probe(struct spi_device *spi)
        input_set_abs_params(input_dev, ABS_PRESSURE,
                        pdata->pressure_min, pdata->pressure_max, 0, 0);
 
+       vref = pdata->keep_vref_on;
+
        /* set up the transfers to read touchscreen state; this assumes we
         * use formula #2 for pressure, not #3.
         */
@@ -727,7 +923,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
        spi_message_init(m);
 
        /* y- still on; turn on only y+ (and ADC) */
-       ts->read_y = READ_Y;
+       ts->read_y = READ_Y(vref);
        x->tx_buf = &ts->read_y;
        x->len = 1;
        spi_message_add_tail(x, m);
@@ -737,7 +933,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
        x->len = 2;
        spi_message_add_tail(x, m);
 
-       m->complete = ads7846_debounce;
+       m->complete = ads7846_rx_val;
        m->context = ts;
 
        m++;
@@ -745,7 +941,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
 
        /* turn y- off, x+ on, then leave in lowpower */
        x++;
-       ts->read_x = READ_X;
+       ts->read_x = READ_X(vref);
        x->tx_buf = &ts->read_x;
        x->len = 1;
        spi_message_add_tail(x, m);
@@ -755,7 +951,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
        x->len = 2;
        spi_message_add_tail(x, m);
 
-       m->complete = ads7846_debounce;
+       m->complete = ads7846_rx_val;
        m->context = ts;
 
        /* turn y+ off, x- on; we'll use formula #2 */
@@ -764,7 +960,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
                spi_message_init(m);
 
                x++;
-               ts->read_z1 = READ_Z1;
+               ts->read_z1 = READ_Z1(vref);
                x->tx_buf = &ts->read_z1;
                x->len = 1;
                spi_message_add_tail(x, m);
@@ -774,14 +970,14 @@ static int __devinit ads7846_probe(struct spi_device *spi)
                x->len = 2;
                spi_message_add_tail(x, m);
 
-               m->complete = ads7846_debounce;
+               m->complete = ads7846_rx_val;
                m->context = ts;
 
                m++;
                spi_message_init(m);
 
                x++;
-               ts->read_z2 = READ_Z2;
+               ts->read_z2 = READ_Z2(vref);
                x->tx_buf = &ts->read_z2;
                x->len = 1;
                spi_message_add_tail(x, m);
@@ -791,7 +987,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
                x->len = 2;
                spi_message_add_tail(x, m);
 
-               m->complete = ads7846_debounce;
+               m->complete = ads7846_rx_val;
                m->context = ts;
        }
 
@@ -820,31 +1016,24 @@ static int __devinit ads7846_probe(struct spi_device *spi)
                        spi->dev.driver->name, ts)) {
                dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq);
                err = -EBUSY;
-               goto err_free_mem;
+               goto err_cleanup_filter;
        }
 
+       err = ads784x_hwmon_register(spi, ts);
+       if (err)
+               goto err_free_irq;
+
        dev_info(&spi->dev, "touchscreen, irq %d\n", spi->irq);
 
-       /* take a first sample, leaving nPENIRQ active; avoid
+       /* take a first sample, leaving nPENIRQ active and vREF off; avoid
         * the touchscreen, in case it's not connected.
         */
        (void) ads7846_read12_ser(&spi->dev,
                          READ_12BIT_SER(vaux) | ADS_PD10_ALL_ON);
 
-       switch (ts->model) {
-       case 7846:
-               ts->attr_group = &ads7846_attr_group;
-               break;
-       case 7845:
-               ts->attr_group = &ads7845_attr_group;
-               break;
-       default:
-               ts->attr_group = &ads7843_attr_group;
-               break;
-       }
-       err = sysfs_create_group(&spi->dev.kobj, ts->attr_group);
+       err = sysfs_create_group(&spi->dev.kobj, &ads784x_attr_group);
        if (err)
-               goto err_free_irq;
+               goto err_remove_hwmon;
 
        err = input_register_device(input_dev);
        if (err)
@@ -853,9 +1042,14 @@ static int __devinit ads7846_probe(struct spi_device *spi)
        return 0;
 
  err_remove_attr_group:
-       sysfs_remove_group(&spi->dev.kobj, ts->attr_group);
+       sysfs_remove_group(&spi->dev.kobj, &ads784x_attr_group);
+ err_remove_hwmon:
+       ads784x_hwmon_unregister(spi, ts);
  err_free_irq:
        free_irq(spi->irq, ts);
+ err_cleanup_filter:
+       if (ts->filter_cleanup)
+               ts->filter_cleanup(ts->filter_data);
  err_free_mem:
        input_free_device(input_dev);
        kfree(ts);
@@ -866,16 +1060,20 @@ static int __devexit ads7846_remove(struct spi_device *spi)
 {
        struct ads7846          *ts = dev_get_drvdata(&spi->dev);
 
+       ads784x_hwmon_unregister(spi, ts);
        input_unregister_device(ts->input);
 
        ads7846_suspend(spi, PMSG_SUSPEND);
 
-       sysfs_remove_group(&spi->dev.kobj, ts->attr_group);
+       sysfs_remove_group(&spi->dev.kobj, &ads784x_attr_group);
 
        free_irq(ts->spi->irq, ts);
        /* suspend left the IRQ disabled */
        enable_irq(ts->spi->irq);
 
+       if (ts->filter_cleanup)
+               ts->filter_cleanup(ts->filter_data);
+
        kfree(ts);
 
        dev_dbg(&spi->dev, "unregistered touchscreen\n");
index a730c461227f78608d8c461195f33b80f11210fb..0300dca8591d9cdb076f0413eee62a6b56823fc8 100644 (file)
@@ -151,6 +151,10 @@ static int tsdev_open(struct inode *inode, struct file *file)
        int i = iminor(inode) - TSDEV_MINOR_BASE;
        struct tsdev_list *list;
 
+       printk(KERN_WARNING "tsdev (compaq touchscreen emulation) is scheduled "
+               "for removal.\nSee Documentation/feature-removal-schedule.txt "
+               "for details.\n");
+
        if (i >= TSDEV_MINORS || !tsdev_table[i & TSDEV_MINOR_MASK])
                return -ENODEV;
 
index d22c0224fde6505e9695e9c702ab42c4e3d7aaf4..db1260f73f10e2aee4ea40dce75c09c62a79f570 100644 (file)
@@ -118,6 +118,15 @@ struct capiminor {
 };
 #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
 
+/* FIXME: The following lock is a sledgehammer-workaround to a
+ * locking issue with the capiminor (and maybe other) data structure(s).
+ * Access to this data is done in a racy way and crashes the machine with
+ * a FritzCard DSL driver; sooner or later. This is a workaround
+ * which trades scalability vs stability, so it doesn't crash the kernel anymore.
+ * The correct (and scalable) fix for the issue seems to require
+ * an API change to the drivers... . */
+static DEFINE_SPINLOCK(workaround_lock);
+
 struct capincci {
        struct capincci *next;
        u32              ncci;
@@ -589,6 +598,7 @@ static void capi_recv_message(struct capi20_appl *ap, struct sk_buff *skb)
 #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
        struct capincci *np;
        u32 ncci;
+       unsigned long flags;
 
        if (CAPIMSG_CMD(skb->data) == CAPI_CONNECT_B3_CONF) {
                u16 info = CAPIMSG_U16(skb->data, 12); // Info field
@@ -603,9 +613,11 @@ static void capi_recv_message(struct capi20_appl *ap, struct sk_buff *skb)
                capincci_alloc(cdev, CAPIMSG_NCCI(skb->data));
                up(&cdev->ncci_list_sem);
        }
+       spin_lock_irqsave(&workaround_lock, flags);
        if (CAPIMSG_COMMAND(skb->data) != CAPI_DATA_B3) {
                skb_queue_tail(&cdev->recvqueue, skb);
                wake_up_interruptible(&cdev->recvwait);
+               spin_unlock_irqrestore(&workaround_lock, flags);
                return;
        }
        ncci = CAPIMSG_CONTROL(skb->data);
@@ -615,6 +627,7 @@ static void capi_recv_message(struct capi20_appl *ap, struct sk_buff *skb)
                printk(KERN_ERR "BUG: capi_signal: ncci not found\n");
                skb_queue_tail(&cdev->recvqueue, skb);
                wake_up_interruptible(&cdev->recvwait);
+               spin_unlock_irqrestore(&workaround_lock, flags);
                return;
        }
 #ifndef CONFIG_ISDN_CAPI_MIDDLEWARE
@@ -625,6 +638,7 @@ static void capi_recv_message(struct capi20_appl *ap, struct sk_buff *skb)
        if (!mp) {
                skb_queue_tail(&cdev->recvqueue, skb);
                wake_up_interruptible(&cdev->recvwait);
+               spin_unlock_irqrestore(&workaround_lock, flags);
                return;
        }
 
@@ -660,6 +674,7 @@ static void capi_recv_message(struct capi20_appl *ap, struct sk_buff *skb)
                wake_up_interruptible(&cdev->recvwait);
        }
 #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */
+       spin_unlock_irqrestore(&workaround_lock, flags);
 }
 
 /* -------- file_operations for capidev ----------------------------- */
@@ -988,7 +1003,7 @@ capi_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations capi_fops =
+static const struct file_operations capi_fops =
 {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
@@ -1006,6 +1021,7 @@ static struct file_operations capi_fops =
 static int capinc_tty_open(struct tty_struct * tty, struct file * file)
 {
        struct capiminor *mp;
+       unsigned long flags;
 
        if ((mp = capiminor_find(iminor(file->f_path.dentry->d_inode))) == 0)
                return -ENXIO;
@@ -1014,6 +1030,7 @@ static int capinc_tty_open(struct tty_struct * tty, struct file * file)
 
        tty->driver_data = (void *)mp;
 
+       spin_lock_irqsave(&workaround_lock, flags);
        if (atomic_read(&mp->ttyopencount) == 0)
                mp->tty = tty;
        atomic_inc(&mp->ttyopencount);
@@ -1021,6 +1038,7 @@ static int capinc_tty_open(struct tty_struct * tty, struct file * file)
        printk(KERN_DEBUG "capinc_tty_open ocount=%d\n", atomic_read(&mp->ttyopencount));
 #endif
        handle_minor_recv(mp);
+       spin_unlock_irqrestore(&workaround_lock, flags);
        return 0;
 }
 
@@ -1054,6 +1072,7 @@ static int capinc_tty_write(struct tty_struct * tty,
 {
        struct capiminor *mp = (struct capiminor *)tty->driver_data;
        struct sk_buff *skb;
+       unsigned long flags;
 
 #ifdef _DEBUG_TTYFUNCS
        printk(KERN_DEBUG "capinc_tty_write(count=%d)\n", count);
@@ -1066,6 +1085,7 @@ static int capinc_tty_write(struct tty_struct * tty,
                return 0;
        }
 
+       spin_lock_irqsave(&workaround_lock, flags);
        skb = mp->ttyskb;
        if (skb) {
                mp->ttyskb = NULL;
@@ -1076,6 +1096,7 @@ static int capinc_tty_write(struct tty_struct * tty,
        skb = alloc_skb(CAPI_DATA_B3_REQ_LEN+count, GFP_ATOMIC);
        if (!skb) {
                printk(KERN_ERR "capinc_tty_write: alloc_skb failed\n");
+               spin_unlock_irqrestore(&workaround_lock, flags);
                return -ENOMEM;
        }
 
@@ -1086,6 +1107,7 @@ static int capinc_tty_write(struct tty_struct * tty,
        mp->outbytes += skb->len;
        (void)handle_minor_send(mp);
        (void)handle_minor_recv(mp);
+       spin_unlock_irqrestore(&workaround_lock, flags);
        return count;
 }
 
@@ -1093,6 +1115,7 @@ static void capinc_tty_put_char(struct tty_struct *tty, unsigned char ch)
 {
        struct capiminor *mp = (struct capiminor *)tty->driver_data;
        struct sk_buff *skb;
+       unsigned long flags;
 
 #ifdef _DEBUG_TTYFUNCS
        printk(KERN_DEBUG "capinc_put_char(%u)\n", ch);
@@ -1105,10 +1128,12 @@ static void capinc_tty_put_char(struct tty_struct *tty, unsigned char ch)
                return;
        }
 
+       spin_lock_irqsave(&workaround_lock, flags);
        skb = mp->ttyskb;
        if (skb) {
                if (skb_tailroom(skb) > 0) {
                        *(skb_put(skb, 1)) = ch;
+                       spin_unlock_irqrestore(&workaround_lock, flags);
                        return;
                }
                mp->ttyskb = NULL;
@@ -1124,12 +1149,14 @@ static void capinc_tty_put_char(struct tty_struct *tty, unsigned char ch)
        } else {
                printk(KERN_ERR "capinc_put_char: char %u lost\n", ch);
        }
+       spin_unlock_irqrestore(&workaround_lock, flags);
 }
 
 static void capinc_tty_flush_chars(struct tty_struct *tty)
 {
        struct capiminor *mp = (struct capiminor *)tty->driver_data;
        struct sk_buff *skb;
+       unsigned long flags;
 
 #ifdef _DEBUG_TTYFUNCS
        printk(KERN_DEBUG "capinc_tty_flush_chars\n");
@@ -1142,6 +1169,7 @@ static void capinc_tty_flush_chars(struct tty_struct *tty)
                return;
        }
 
+       spin_lock_irqsave(&workaround_lock, flags);
        skb = mp->ttyskb;
        if (skb) {
                mp->ttyskb = NULL;
@@ -1150,6 +1178,7 @@ static void capinc_tty_flush_chars(struct tty_struct *tty)
                (void)handle_minor_send(mp);
        }
        (void)handle_minor_recv(mp);
+       spin_unlock_irqrestore(&workaround_lock, flags);
 }
 
 static int capinc_tty_write_room(struct tty_struct *tty)
@@ -1220,12 +1249,15 @@ static void capinc_tty_throttle(struct tty_struct * tty)
 static void capinc_tty_unthrottle(struct tty_struct * tty)
 {
        struct capiminor *mp = (struct capiminor *)tty->driver_data;
+       unsigned long flags;
 #ifdef _DEBUG_TTYFUNCS
        printk(KERN_DEBUG "capinc_tty_unthrottle\n");
 #endif
        if (mp) {
+               spin_lock_irqsave(&workaround_lock, flags);
                mp->ttyinstop = 0;
                handle_minor_recv(mp);
+               spin_unlock_irqrestore(&workaround_lock, flags);
        }
 }
 
@@ -1243,12 +1275,15 @@ static void capinc_tty_stop(struct tty_struct *tty)
 static void capinc_tty_start(struct tty_struct *tty)
 {
        struct capiminor *mp = (struct capiminor *)tty->driver_data;
+       unsigned long flags;
 #ifdef _DEBUG_TTYFUNCS
        printk(KERN_DEBUG "capinc_tty_start\n");
 #endif
        if (mp) {
+               spin_lock_irqsave(&workaround_lock, flags);
                mp->ttyoutstop = 0;
                (void)handle_minor_send(mp);
+               spin_unlock_irqrestore(&workaround_lock, flags);
        }
 }
 
@@ -1456,7 +1491,7 @@ static struct procfsentries {
 
 static void __init proc_init(void)
 {
-    int nelem = sizeof(procfsentries)/sizeof(procfsentries[0]);
+    int nelem = ARRAY_SIZE(procfsentries);
     int i;
 
     for (i=0; i < nelem; i++) {
@@ -1468,7 +1503,7 @@ static void __init proc_init(void)
 
 static void __exit proc_exit(void)
 {
-    int nelem = sizeof(procfsentries)/sizeof(procfsentries[0]);
+    int nelem = ARRAY_SIZE(procfsentries);
     int i;
 
     for (i=nelem-1; i >= 0; i--) {
index c4d438c17dabf0cd1a1bbb06a1fda9953cce25e2..2a49cea0a223e19e41cdeee3e4f900886521949f 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/major.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/fcntl.h>
 #include <linux/fs.h>
@@ -2218,7 +2217,7 @@ static struct procfsentries {
 
 static void __init proc_init(void)
 {
-    int nelem = sizeof(procfsentries)/sizeof(procfsentries[0]);
+    int nelem = ARRAY_SIZE(procfsentries);
     int i;
 
     for (i=0; i < nelem; i++) {
@@ -2230,7 +2229,7 @@ static void __init proc_init(void)
 
 static void __exit proc_exit(void)
 {
-    int nelem = sizeof(procfsentries)/sizeof(procfsentries[0]);
+    int nelem = ARRAY_SIZE(procfsentries);
     int i;
 
     for (i=nelem-1; i >= 0; i--) {
index ca9dc00a45c4aedc9147c4c47877194000c1d36e..31f4fd8b8b0a563e4d058591befc095870725466 100644 (file)
@@ -113,14 +113,14 @@ static int seq_contrstats_open(struct inode *inode, struct file *file)
        return seq_open(file, &seq_contrstats_ops);
 }
 
-static struct file_operations proc_controller_ops = {
+static const struct file_operations proc_controller_ops = {
        .open           = seq_controller_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
        .release        = seq_release,
 };
 
-static struct file_operations proc_contrstats_ops = {
+static const struct file_operations proc_contrstats_ops = {
        .open           = seq_contrstats_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -218,14 +218,14 @@ seq_applstats_open(struct inode *inode, struct file *file)
        return seq_open(file, &seq_applstats_ops);
 }
 
-static struct file_operations proc_applications_ops = {
+static const struct file_operations proc_applications_ops = {
        .open           = seq_applications_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
        .release        = seq_release,
 };
 
-static struct file_operations proc_applstats_ops = {
+static const struct file_operations proc_applstats_ops = {
        .open           = seq_applstats_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -302,7 +302,7 @@ seq_capi_driver_open(struct inode *inode, struct file *file)
        return err;
 }
 
-static struct file_operations proc_driver_ops = {
+static const struct file_operations proc_driver_ops = {
        .open           = seq_capi_driver_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index 06967da7c4a8fd0ee13ce94a8d46cfda8797051d..53a189003355b125b5bf9bb7cbd2b133d4ef9147 100644 (file)
@@ -256,7 +256,7 @@ isdn_divert_ioctl(struct inode *inode, struct file *file,
 
 
 #ifdef CONFIG_PROC_FS
-static struct file_operations isdn_fops =
+static const struct file_operations isdn_fops =
 {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
index 708d47a6484b1bc451bee2c3c90aa4007cb08360..bcbb6502a773da59d181e30255e48663318f8076 100644 (file)
@@ -7,7 +7,13 @@ config ISDN_DRV_GIGASET
        select CRC_CCITT
        select BITREVERSE
        help
-         Say m here if you have a Gigaset or Sinus isdn device.
+         This driver supports the Siemens Gigaset SX205/255 family of
+         ISDN DECT bases, including the predecessors Gigaset 3070/3075
+         and 4170/4175 and their T-Com versions Sinus 45isdn and Sinus
+         721X.
+         If you have one of these devices, say M here and for at least
+         one of the connection specific parts that follow.
+         This will build a module called "gigaset".
 
 if ISDN_DRV_GIGASET!=n
 
@@ -15,14 +21,25 @@ config GIGASET_BASE
        tristate "Gigaset base station support"
        depends on ISDN_DRV_GIGASET && USB
        help
-         Say m here if you need to communicate with the base
-         directly via USB.
+         Say M here if you want to use the USB interface of the Gigaset
+         base for connection to your system.
+         This will build a module called "bas_gigaset".
 
 config GIGASET_M105
        tristate "Gigaset M105 support"
        depends on ISDN_DRV_GIGASET && USB
        help
-         Say m here if you need the driver for the Gigaset M105 device.
+         Say M here if you want to connect to the Gigaset base via DECT
+         using a Gigaset M105 (Sinus 45 Data 2) USB DECT device.
+         This will build a module called "usb_gigaset".
+
+config GIGASET_M101
+       tristate "Gigaset M101 support"
+       depends on ISDN_DRV_GIGASET
+       help
+         Say M here if you want to connect to the Gigaset base via DECT
+         using a Gigaset M101 (Sinus 45 Data 1) RS232 DECT device.
+         This will build a module called "ser_gigaset".
 
 config GIGASET_DEBUG
        bool "Gigaset debugging"
index 9b9acf1a21ad8a4e1dd05e47b3fb701986bb6466..077e297d8c7239b9d6cbd5ee7307cd94f22ace16 100644 (file)
@@ -1,6 +1,8 @@
 gigaset-y := common.o interface.o proc.o ev-layer.o i4l.o
 usb_gigaset-y := usb-gigaset.o asyncdata.o
 bas_gigaset-y := bas-gigaset.o isocdata.o
+ser_gigaset-y := ser-gigaset.o asyncdata.o
 
 obj-$(CONFIG_GIGASET_M105) += usb_gigaset.o gigaset.o
 obj-$(CONFIG_GIGASET_BASE) += bas_gigaset.o gigaset.o
+obj-$(CONFIG_GIGASET_M101) += ser_gigaset.o gigaset.o
index 88e958f176d29f1e493ee463fc29ccdac990718f..ddf5e92be44429cc3b3c679844933b8e11d2a6a5 100644 (file)
  * =====================================================================
  */
 
+/* not set by Kbuild when building both ser_gigaset and usb_gigaset */
+#ifndef KBUILD_MODNAME
+#define KBUILD_MODNAME "asy_gigaset"
+#endif
+
 #include "gigaset.h"
 #include <linux/crc-ccitt.h>
 #include <linux/bitrev.h>
index b5e7f9c7d74e6bd5bac9c0e1126259fa1700038e..63e51dd6debe2a9b279ebb1281852a606f9d3301 100644 (file)
@@ -257,10 +257,10 @@ static inline void dump_urb(enum debuglevel level, const char *tag,
                        urb->transfer_flags);
                gig_dbg(level,
                        "  transfer_buffer=0x%08lx[%d], actual_length=%d, "
-                       "bandwidth=%d, setup_packet=0x%08lx,",
+                       "setup_packet=0x%08lx,",
                        (unsigned long) urb->transfer_buffer,
                        urb->transfer_buffer_length, urb->actual_length,
-                       urb->bandwidth, (unsigned long) urb->setup_packet);
+                       (unsigned long) urb->setup_packet);
                gig_dbg(level,
                        "  start_frame=%d, number_of_packets=%d, interval=%d, "
                        "error_count=%d,",
index 4f75cce6fdff41df1a1375356d4cd0438856bb9c..b460a73a7c8590fb39640598e02376d223256093 100644 (file)
@@ -640,7 +640,6 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels,
                return NULL;
        }
        mutex_init(&cs->mutex);
-       mutex_lock(&cs->mutex);
 
        gig_dbg(DEBUG_INIT, "allocating bcs[0..%d]", channels - 1);
        cs->bcs = kmalloc(channels * sizeof(struct bc_state), GFP_KERNEL);
@@ -738,6 +737,7 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels,
 
        ++cs->cs_init;
 
+       /* set up character device */
        gigaset_if_init(cs);
 
        /* set up device sysfs */
@@ -753,11 +753,9 @@ struct cardstate *gigaset_initcs(struct gigaset_driver *drv, int channels,
        add_timer(&cs->timer);
 
        gig_dbg(DEBUG_INIT, "cs initialized");
-       mutex_unlock(&cs->mutex);
        return cs;
 
 error:
-       mutex_unlock(&cs->mutex);
        gig_dbg(DEBUG_INIT, "failed");
        gigaset_freecs(cs);
        return NULL;
@@ -908,20 +906,7 @@ void gigaset_shutdown(struct cardstate *cs)
        gig_dbg(DEBUG_CMD, "scheduling SHUTDOWN");
        gigaset_schedule_event(cs);
 
-       if (wait_event_interruptible(cs->waitqueue, !cs->waiting)) {
-               warn("%s: aborted", __func__);
-               //FIXME
-       }
-
-       if (atomic_read(&cs->mstate) != MS_LOCKED) {
-               //FIXME?
-               //gigaset_baud_rate(cs, B115200);
-               //gigaset_set_line_ctrl(cs, CS8);
-               //gigaset_set_modem_ctrl(cs, TIOCM_DTR|TIOCM_RTS, 0);
-               //cs->control_state = 0;
-       } else {
-               //FIXME use some saved values?
-       }
+       wait_event(cs->waitqueue, !cs->waiting);
 
        cleanup_cs(cs);
 
@@ -944,10 +929,7 @@ void gigaset_stop(struct cardstate *cs)
        gig_dbg(DEBUG_CMD, "scheduling STOP");
        gigaset_schedule_event(cs);
 
-       if (wait_event_interruptible(cs->waitqueue, !cs->waiting)) {
-               warn("%s: aborted", __func__);
-               //FIXME
-       }
+       wait_event(cs->waitqueue, !cs->waiting);
 
        cleanup_cs(cs);
 
index 44f02dbd1111c7b26602828b6fb15c5faa3238f1..4661e2c722bc792ce9c2be81558c625c04a056e6 100644 (file)
@@ -1015,7 +1015,7 @@ static void finish_shutdown(struct cardstate *cs)
 
        cs->cmd_result = -ENODEV;
        cs->waiting = 0;
-       wake_up_interruptible(&cs->waitqueue);
+       wake_up(&cs->waitqueue);
 }
 
 static void do_shutdown(struct cardstate *cs)
index 458b6462f93779c489440ecce018ead677145d5c..eb50f3dab5f77908ecc6111da0911b1a3370b9c2 100644 (file)
@@ -599,19 +599,9 @@ out:
 static void if_wake(unsigned long data)
 {
        struct cardstate *cs = (struct cardstate *) data;
-       struct tty_struct *tty;
-
-       tty = cs->tty;
-       if (!tty)
-               return;
-
-       if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-           tty->ldisc.write_wakeup) {
-               gig_dbg(DEBUG_IF, "write wakeup call");
-               tty->ldisc.write_wakeup(tty);
-       }
 
-       wake_up_interruptible(&tty->write_wait);
+       if (cs->tty)
+               tty_wakeup(cs->tty);
 }
 
 /*** interface to common ***/
@@ -625,6 +615,8 @@ void gigaset_if_init(struct cardstate *cs)
                return;
 
        tasklet_init(&cs->if_wake_tasklet, &if_wake, (unsigned long) cs);
+
+       mutex_lock(&cs->mutex);
        cs->tty_dev = tty_register_device(drv->tty, cs->minor_index, NULL);
 
        if (!IS_ERR(cs->tty_dev))
@@ -633,6 +625,7 @@ void gigaset_if_init(struct cardstate *cs)
                warn("could not register device to the tty subsystem");
                cs->tty_dev = NULL;
        }
+       mutex_unlock(&cs->mutex);
 }
 
 void gigaset_if_free(struct cardstate *cs)
index df988eb0e36fdd2bf6da36bba74cafd93f3cf6c8..8c0eb522dab14336d8c7140660146375bff03ad0 100644 (file)
@@ -921,6 +921,8 @@ static void cmd_loop(unsigned char *src, int numbytes, struct inbuf_t *inbuf)
                        /* end of line */
                        gig_dbg(DEBUG_TRANSCMD, "%s: End of Command (%d Bytes)",
                                __func__, cbytes);
+                       if (cbytes >= MAX_RESP_SIZE - 1)
+                               dev_warn(cs->dev, "response too large\n");
                        cs->cbytes = cbytes;
                        gigaset_handle_modem_response(cs);
                        cbytes = 0;
@@ -929,8 +931,6 @@ static void cmd_loop(unsigned char *src, int numbytes, struct inbuf_t *inbuf)
                        /* advance in line buffer, checking for overflow */
                        if (cbytes < MAX_RESP_SIZE - 1)
                                cbytes++;
-                       else
-                               dev_warn(cs->dev, "response too large\n");
                }
        }
 
diff --git a/drivers/isdn/gigaset/ser-gigaset.c b/drivers/isdn/gigaset/ser-gigaset.c
new file mode 100644 (file)
index 0000000..c8b7db6
--- /dev/null
@@ -0,0 +1,837 @@
+/* This is the serial hardware link layer (HLL) for the Gigaset 307x isdn
+ * DECT base (aka Sinus 45 isdn) using the RS232 DECT data module M101,
+ * written as a line discipline.
+ *
+ * =====================================================================
+ * 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 "gigaset.h"
+
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/platform_device.h>
+#include <linux/tty.h>
+#include <linux/poll.h>
+
+/* Version Information */
+#define DRIVER_AUTHOR "Tilman Schmidt"
+#define DRIVER_DESC "Serial Driver for Gigaset 307x using Siemens M101"
+
+#define GIGASET_MINORS     1
+#define GIGASET_MINOR      0
+#define GIGASET_MODULENAME "ser_gigaset"
+#define GIGASET_DEVNAME    "ttyGS"
+
+/* length limit according to Siemens 3070usb-protokoll.doc ch. 2.1 */
+#define IF_WRITEBUF 264
+
+MODULE_AUTHOR(DRIVER_AUTHOR);
+MODULE_DESCRIPTION(DRIVER_DESC);
+MODULE_LICENSE("GPL");
+MODULE_ALIAS_LDISC(N_GIGASET_M101);
+
+static int startmode = SM_ISDN;
+module_param(startmode, int, S_IRUGO);
+MODULE_PARM_DESC(startmode, "initial operation mode");
+static int cidmode = 1;
+module_param(cidmode, int, S_IRUGO);
+MODULE_PARM_DESC(cidmode, "stay in CID mode when idle");
+
+static struct gigaset_driver *driver;
+
+struct ser_cardstate {
+       struct platform_device  dev;
+       struct tty_struct       *tty;
+       atomic_t                refcnt;
+       struct mutex            dead_mutex;
+};
+
+static struct platform_driver device_driver = {
+       .driver = {
+               .name = GIGASET_MODULENAME,
+       },
+};
+
+static void flush_send_queue(struct cardstate *);
+
+/* transmit data from current open skb
+ * result: number of bytes sent or error code < 0
+ */
+static int write_modem(struct cardstate *cs)
+{
+       struct tty_struct *tty = cs->hw.ser->tty;
+       struct bc_state *bcs = &cs->bcs[0];     /* only one channel */
+       struct sk_buff *skb = bcs->tx_skb;
+       int sent;
+
+       if (!tty || !tty->driver || !skb)
+               return -EFAULT;
+
+       if (!skb->len) {
+               dev_kfree_skb_any(skb);
+               bcs->tx_skb = NULL;
+               return -EINVAL;
+       }
+
+       set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
+       sent = tty->driver->write(tty, skb->data, skb->len);
+       gig_dbg(DEBUG_OUTPUT, "write_modem: sent %d", sent);
+       if (sent < 0) {
+               /* error */
+               flush_send_queue(cs);
+               return sent;
+       }
+       skb_pull(skb, sent);
+       if (!skb->len) {
+               /* skb sent completely */
+               gigaset_skb_sent(bcs, skb);
+
+               gig_dbg(DEBUG_INTR, "kfree skb (Adr: %lx)!",
+                       (unsigned long) skb);
+               dev_kfree_skb_any(skb);
+               bcs->tx_skb = NULL;
+       }
+       return sent;
+}
+
+/*
+ * transmit first queued command buffer
+ * result: number of bytes sent or error code < 0
+ */
+static int send_cb(struct cardstate *cs)
+{
+       struct tty_struct *tty = cs->hw.ser->tty;
+       struct cmdbuf_t *cb, *tcb;
+       unsigned long flags;
+       int sent = 0;
+
+       if (!tty || !tty->driver)
+               return -EFAULT;
+
+       cb = cs->cmdbuf;
+       if (!cb)
+               return 0;       /* nothing to do */
+
+       if (cb->len) {
+               set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
+               sent = tty->driver->write(tty, cb->buf + cb->offset, cb->len);
+               if (sent < 0) {
+                       /* error */
+                       gig_dbg(DEBUG_OUTPUT, "send_cb: write error %d", sent);
+                       flush_send_queue(cs);
+                       return sent;
+               }
+               cb->offset += sent;
+               cb->len -= sent;
+               gig_dbg(DEBUG_OUTPUT, "send_cb: sent %d, left %u, queued %u",
+                       sent, cb->len, cs->cmdbytes);
+       }
+
+       while (cb && !cb->len) {
+               spin_lock_irqsave(&cs->cmdlock, flags);
+               cs->cmdbytes -= cs->curlen;
+               tcb = cb;
+               cs->cmdbuf = cb = cb->next;
+               if (cb) {
+                       cb->prev = NULL;
+                       cs->curlen = cb->len;
+               } else {
+                       cs->lastcmdbuf = NULL;
+                       cs->curlen = 0;
+               }
+               spin_unlock_irqrestore(&cs->cmdlock, flags);
+
+               if (tcb->wake_tasklet)
+                       tasklet_schedule(tcb->wake_tasklet);
+               kfree(tcb);
+       }
+       return sent;
+}
+
+/*
+ * send queue tasklet
+ * If there is already a skb opened, put data to the transfer buffer
+ * by calling "write_modem".
+ * Otherwise take a new skb out of the queue.
+ */
+static void gigaset_modem_fill(unsigned long data)
+{
+       struct cardstate *cs = (struct cardstate *) data;
+       struct bc_state *bcs;
+       int sent = 0;
+
+       if (!cs || !(bcs = cs->bcs)) {
+               gig_dbg(DEBUG_OUTPUT, "%s: no cardstate", __func__);
+               return;
+       }
+       if (!bcs->tx_skb) {
+               /* no skb is being sent; send command if any */
+               sent = send_cb(cs);
+               gig_dbg(DEBUG_OUTPUT, "%s: send_cb -> %d", __func__, sent);
+               if (sent)
+                       /* something sent or error */
+                       return;
+
+               /* no command to send; get skb */
+               if (!(bcs->tx_skb = skb_dequeue(&bcs->squeue)))
+                       /* no skb either, nothing to do */
+                       return;
+
+               gig_dbg(DEBUG_INTR, "Dequeued skb (Adr: %lx)",
+                       (unsigned long) bcs->tx_skb);
+       }
+
+       /* send skb */
+       gig_dbg(DEBUG_OUTPUT, "%s: tx_skb", __func__);
+       if (write_modem(cs) < 0)
+               gig_dbg(DEBUG_OUTPUT, "%s: write_modem failed", __func__);
+}
+
+/*
+ * throw away all data queued for sending
+ */
+static void flush_send_queue(struct cardstate *cs)
+{
+       struct sk_buff *skb;
+       struct cmdbuf_t *cb;
+       unsigned long flags;
+
+       /* command queue */
+       spin_lock_irqsave(&cs->cmdlock, flags);
+       while ((cb = cs->cmdbuf) != NULL) {
+               cs->cmdbuf = cb->next;
+               if (cb->wake_tasklet)
+                       tasklet_schedule(cb->wake_tasklet);
+               kfree(cb);
+       }
+       cs->cmdbuf = cs->lastcmdbuf = NULL;
+       cs->cmdbytes = cs->curlen = 0;
+       spin_unlock_irqrestore(&cs->cmdlock, flags);
+
+       /* data queue */
+       if (cs->bcs->tx_skb)
+               dev_kfree_skb_any(cs->bcs->tx_skb);
+       while ((skb = skb_dequeue(&cs->bcs->squeue)) != NULL)
+               dev_kfree_skb_any(skb);
+}
+
+
+/* Gigaset Driver Interface */
+/* ======================== */
+
+/*
+ * queue an AT command string for transmission to the Gigaset device
+ * parameters:
+ *     cs              controller state structure
+ *     buf             buffer containing the string to send
+ *     len             number of characters to send
+ *     wake_tasklet    tasklet to run when transmission is complete, or NULL
+ * return value:
+ *     number of bytes queued, or error code < 0
+ */
+static int gigaset_write_cmd(struct cardstate *cs, const unsigned char *buf,
+                             int len, struct tasklet_struct *wake_tasklet)
+{
+       struct cmdbuf_t *cb;
+       unsigned long flags;
+
+       gigaset_dbg_buffer(atomic_read(&cs->mstate) != MS_LOCKED ?
+                            DEBUG_TRANSCMD : DEBUG_LOCKCMD,
+                          "CMD Transmit", len, buf);
+
+       if (len <= 0)
+               return 0;
+
+       if (!(cb = kmalloc(sizeof(struct cmdbuf_t) + len, GFP_ATOMIC))) {
+               dev_err(cs->dev, "%s: out of memory!\n", __func__);
+               return -ENOMEM;
+       }
+
+       memcpy(cb->buf, buf, len);
+       cb->len = len;
+       cb->offset = 0;
+       cb->next = NULL;
+       cb->wake_tasklet = wake_tasklet;
+
+       spin_lock_irqsave(&cs->cmdlock, flags);
+       cb->prev = cs->lastcmdbuf;
+       if (cs->lastcmdbuf)
+               cs->lastcmdbuf->next = cb;
+       else {
+               cs->cmdbuf = cb;
+               cs->curlen = len;
+       }
+       cs->cmdbytes += len;
+       cs->lastcmdbuf = cb;
+       spin_unlock_irqrestore(&cs->cmdlock, flags);
+
+       spin_lock_irqsave(&cs->lock, flags);
+       if (cs->connected)
+               tasklet_schedule(&cs->write_tasklet);
+       spin_unlock_irqrestore(&cs->lock, flags);
+       return len;
+}
+
+/*
+ * tty_driver.write_room interface routine
+ * return number of characters the driver will accept to be written
+ * parameter:
+ *     controller state structure
+ * return value:
+ *     number of characters
+ */
+static int gigaset_write_room(struct cardstate *cs)
+{
+       unsigned bytes;
+
+       bytes = cs->cmdbytes;
+       return bytes < IF_WRITEBUF ? IF_WRITEBUF - bytes : 0;
+}
+
+/*
+ * tty_driver.chars_in_buffer interface routine
+ * return number of characters waiting to be sent
+ * parameter:
+ *     controller state structure
+ * return value:
+ *     number of characters
+ */
+static int gigaset_chars_in_buffer(struct cardstate *cs)
+{
+       return cs->cmdbytes;
+}
+
+/*
+ * implementation of ioctl(GIGASET_BRKCHARS)
+ * parameter:
+ *     controller state structure
+ * return value:
+ *     -EINVAL (unimplemented function)
+ */
+static int gigaset_brkchars(struct cardstate *cs, const unsigned char buf[6])
+{
+       /* not implemented */
+       return -EINVAL;
+}
+
+/*
+ * Open B channel
+ * Called by "do_action" in ev-layer.c
+ */
+static int gigaset_init_bchannel(struct bc_state *bcs)
+{
+       /* nothing to do for M10x */
+       gigaset_bchannel_up(bcs);
+       return 0;
+}
+
+/*
+ * Close B channel
+ * Called by "do_action" in ev-layer.c
+ */
+static int gigaset_close_bchannel(struct bc_state *bcs)
+{
+       /* nothing to do for M10x */
+       gigaset_bchannel_down(bcs);
+       return 0;
+}
+
+/*
+ * Set up B channel structure
+ * This is called by "gigaset_initcs" in common.c
+ */
+static int gigaset_initbcshw(struct bc_state *bcs)
+{
+       /* unused */
+       bcs->hw.ser = NULL;
+       return 1;
+}
+
+/*
+ * Free B channel structure
+ * Called by "gigaset_freebcs" in common.c
+ */
+static int gigaset_freebcshw(struct bc_state *bcs)
+{
+       /* unused */
+       return 1;
+}
+
+/*
+ * Reinitialize B channel structure
+ * This is called by "bcs_reinit" in common.c
+ */
+static void gigaset_reinitbcshw(struct bc_state *bcs)
+{
+       /* nothing to do for M10x */
+}
+
+/*
+ * Free hardware specific device data
+ * This will be called by "gigaset_freecs" in common.c
+ */
+static void gigaset_freecshw(struct cardstate *cs)
+{
+       tasklet_kill(&cs->write_tasklet);
+       if (!cs->hw.ser)
+               return;
+       dev_set_drvdata(&cs->hw.ser->dev.dev, NULL);
+       platform_device_unregister(&cs->hw.ser->dev);
+       kfree(cs->hw.ser);
+       cs->hw.ser = NULL;
+}
+
+static void gigaset_device_release(struct device *dev)
+{
+       struct platform_device *pdev =
+               container_of(dev, struct platform_device, dev);
+
+       /* adapted from platform_device_release() in drivers/base/platform.c */
+       //FIXME is this actually necessary?
+       kfree(dev->platform_data);
+       kfree(pdev->resource);
+}
+
+/*
+ * Set up hardware specific device data
+ * This is called by "gigaset_initcs" in common.c
+ */
+static int gigaset_initcshw(struct cardstate *cs)
+{
+       int rc;
+
+       if (!(cs->hw.ser = kzalloc(sizeof(struct ser_cardstate), GFP_KERNEL))) {
+               err("%s: out of memory!", __func__);
+               return 0;
+       }
+
+       cs->hw.ser->dev.name = GIGASET_MODULENAME;
+       cs->hw.ser->dev.id = cs->minor_index;
+       cs->hw.ser->dev.dev.release = gigaset_device_release;
+       if ((rc = platform_device_register(&cs->hw.ser->dev)) != 0) {
+               err("error %d registering platform device", rc);
+               kfree(cs->hw.ser);
+               cs->hw.ser = NULL;
+               return 0;
+       }
+       dev_set_drvdata(&cs->hw.ser->dev.dev, cs);
+
+       tasklet_init(&cs->write_tasklet,
+                    &gigaset_modem_fill, (unsigned long) cs);
+       return 1;
+}
+
+/*
+ * set modem control lines
+ * Parameters:
+ *     card state structure
+ *     modem control line state ([TIOCM_DTR]|[TIOCM_RTS])
+ * Called by "gigaset_start" and "gigaset_enterconfigmode" in common.c
+ * and by "if_lock" and "if_termios" in interface.c
+ */
+static int gigaset_set_modem_ctrl(struct cardstate *cs, unsigned old_state, unsigned new_state)
+{
+       struct tty_struct *tty = cs->hw.ser->tty;
+       unsigned int set, clear;
+
+       if (!tty || !tty->driver || !tty->driver->tiocmset)
+               return -EFAULT;
+       set = new_state & ~old_state;
+       clear = old_state & ~new_state;
+       if (!set && !clear)
+               return 0;
+       gig_dbg(DEBUG_IF, "tiocmset set %x clear %x", set, clear);
+       return tty->driver->tiocmset(tty, NULL, set, clear);
+}
+
+static int gigaset_baud_rate(struct cardstate *cs, unsigned cflag)
+{
+       return -EINVAL;
+}
+
+static int gigaset_set_line_ctrl(struct cardstate *cs, unsigned cflag)
+{
+       return -EINVAL;
+}
+
+static struct gigaset_ops ops = {
+       gigaset_write_cmd,
+       gigaset_write_room,
+       gigaset_chars_in_buffer,
+       gigaset_brkchars,
+       gigaset_init_bchannel,
+       gigaset_close_bchannel,
+       gigaset_initbcshw,
+       gigaset_freebcshw,
+       gigaset_reinitbcshw,
+       gigaset_initcshw,
+       gigaset_freecshw,
+       gigaset_set_modem_ctrl,
+       gigaset_baud_rate,
+       gigaset_set_line_ctrl,
+       gigaset_m10x_send_skb,  /* asyncdata.c */
+       gigaset_m10x_input,     /* asyncdata.c */
+};
+
+
+/* Line Discipline Interface */
+/* ========================= */
+
+/* helper functions for cardstate refcounting */
+static struct cardstate *cs_get(struct tty_struct *tty)
+{
+       struct cardstate *cs = tty->disc_data;
+
+       if (!cs || !cs->hw.ser) {
+               gig_dbg(DEBUG_ANY, "%s: no cardstate", __func__);
+               return NULL;
+       }
+       atomic_inc(&cs->hw.ser->refcnt);
+       return cs;
+}
+
+static void cs_put(struct cardstate *cs)
+{
+       if (atomic_dec_and_test(&cs->hw.ser->refcnt))
+               mutex_unlock(&cs->hw.ser->dead_mutex);
+}
+
+/*
+ * Called by the tty driver when the line discipline is pushed onto the tty.
+ * Called in process context.
+ */
+static int
+gigaset_tty_open(struct tty_struct *tty)
+{
+       struct cardstate *cs;
+
+       gig_dbg(DEBUG_INIT, "Starting HLL for Gigaset M101");
+
+       info(DRIVER_AUTHOR);
+       info(DRIVER_DESC);
+
+       if (!driver) {
+               err("%s: no driver structure", __func__);
+               return -ENODEV;
+       }
+
+       /* allocate memory for our device state and intialize it */
+       if (!(cs = gigaset_initcs(driver, 1, 1, 0, cidmode,
+                                 GIGASET_MODULENAME)))
+               goto error;
+
+       cs->dev = &cs->hw.ser->dev.dev;
+       cs->hw.ser->tty = tty;
+       mutex_init(&cs->hw.ser->dead_mutex);
+       atomic_set(&cs->hw.ser->refcnt, 1);
+
+       tty->disc_data = cs;
+
+       /* OK.. Initialization of the datastructures and the HW is done.. Now
+        * startup system and notify the LL that we are ready to run
+        */
+       if (startmode == SM_LOCKED)
+               atomic_set(&cs->mstate, MS_LOCKED);
+       if (!gigaset_start(cs)) {
+               tasklet_kill(&cs->write_tasklet);
+               goto error;
+       }
+
+       gig_dbg(DEBUG_INIT, "Startup of HLL done");
+       mutex_lock(&cs->hw.ser->dead_mutex);
+       return 0;
+
+error:
+       gig_dbg(DEBUG_INIT, "Startup of HLL failed");
+       tty->disc_data = NULL;
+       gigaset_freecs(cs);
+       return -ENODEV;
+}
+
+/*
+ * Called by the tty driver when the line discipline is removed.
+ * Called from process context.
+ */
+static void
+gigaset_tty_close(struct tty_struct *tty)
+{
+       struct cardstate *cs = tty->disc_data;
+
+       gig_dbg(DEBUG_INIT, "Stopping HLL for Gigaset M101");
+
+       if (!cs) {
+               gig_dbg(DEBUG_INIT, "%s: no cardstate", __func__);
+               return;
+       }
+
+       /* prevent other callers from entering ldisc methods */
+       tty->disc_data = NULL;
+
+       if (!cs->hw.ser)
+               err("%s: no hw cardstate", __func__);
+       else {
+               /* wait for running methods to finish */
+               if (!atomic_dec_and_test(&cs->hw.ser->refcnt))
+                       mutex_lock(&cs->hw.ser->dead_mutex);
+       }
+
+       /* stop operations */
+       gigaset_stop(cs);
+       tasklet_kill(&cs->write_tasklet);
+       flush_send_queue(cs);
+       cs->dev = NULL;
+       gigaset_freecs(cs);
+
+       gig_dbg(DEBUG_INIT, "Shutdown of HLL done");
+}
+
+/*
+ * Called by the tty driver when the tty line is hung up.
+ * Wait for I/O to driver to complete and unregister ISDN device.
+ * This is already done by the close routine, so just call that.
+ * Called from process context.
+ */
+static int gigaset_tty_hangup(struct tty_struct *tty)
+{
+       gigaset_tty_close(tty);
+       return 0;
+}
+
+/*
+ * Read on the tty.
+ * Unused, received data goes only to the Gigaset driver.
+ */
+static ssize_t
+gigaset_tty_read(struct tty_struct *tty, struct file *file,
+                unsigned char __user *buf, size_t count)
+{
+       return -EAGAIN;
+}
+
+/*
+ * Write on the tty.
+ * Unused, transmit data comes only from the Gigaset driver.
+ */
+static ssize_t
+gigaset_tty_write(struct tty_struct *tty, struct file *file,
+                 const unsigned char *buf, size_t count)
+{
+       return -EAGAIN;
+}
+
+/*
+ * Ioctl on the tty.
+ * Called in process context only.
+ * May be re-entered by multiple ioctl calling threads.
+ */
+static int
+gigaset_tty_ioctl(struct tty_struct *tty, struct file *file,
+                 unsigned int cmd, unsigned long arg)
+{
+       struct cardstate *cs = cs_get(tty);
+       int rc, val;
+       int __user *p = (int __user *)arg;
+
+       if (!cs)
+               return -ENXIO;
+
+       switch (cmd) {
+       case TCGETS:
+       case TCGETA:
+               /* pass through to underlying serial device */
+               rc = n_tty_ioctl(tty, file, cmd, arg);
+               break;
+
+       case TCFLSH:
+               /* flush our buffers and the serial port's buffer */
+               switch (arg) {
+               case TCIFLUSH:
+                       /* no own input buffer to flush */
+                       break;
+               case TCIOFLUSH:
+               case TCOFLUSH:
+                       flush_send_queue(cs);
+                       break;
+               }
+               /* flush the serial port's buffer */
+               rc = n_tty_ioctl(tty, file, cmd, arg);
+               break;
+
+       case FIONREAD:
+               /* unused, always return zero */
+               val = 0;
+               rc = put_user(val, p);
+               break;
+
+       default:
+               rc = -ENOIOCTLCMD;
+       }
+
+       cs_put(cs);
+       return rc;
+}
+
+/*
+ * Poll on the tty.
+ * Unused, always return zero.
+ */
+static unsigned int
+gigaset_tty_poll(struct tty_struct *tty, struct file *file, poll_table *wait)
+{
+       return 0;
+}
+
+/*
+ * Called by the tty driver when a block of data has been received.
+ * Will not be re-entered while running but other ldisc functions
+ * may be called in parallel.
+ * Can be called from hard interrupt level as well as soft interrupt
+ * level or mainline.
+ * Parameters:
+ *     tty     tty structure
+ *     buf     buffer containing received characters
+ *     cflags  buffer containing error flags for received characters (ignored)
+ *     count   number of received characters
+ */
+static void
+gigaset_tty_receive(struct tty_struct *tty, const unsigned char *buf,
+                   char *cflags, int count)
+{
+       struct cardstate *cs = cs_get(tty);
+       unsigned tail, head, n;
+       struct inbuf_t *inbuf;
+
+       if (!cs)
+               return;
+       if (!(inbuf = cs->inbuf)) {
+               dev_err(cs->dev, "%s: no inbuf\n", __func__);
+               cs_put(cs);
+               return;
+       }
+
+       tail = atomic_read(&inbuf->tail);
+       head = atomic_read(&inbuf->head);
+       gig_dbg(DEBUG_INTR, "buffer state: %u -> %u, receive %u bytes",
+               head, tail, count);
+
+       if (head <= tail) {
+               /* possible buffer wraparound */
+               n = min_t(unsigned, count, RBUFSIZE - tail);
+               memcpy(inbuf->data + tail, buf, n);
+               tail = (tail + n) % RBUFSIZE;
+               buf += n;
+               count -= n;
+       }
+
+       if (count > 0) {
+               /* tail < head and some data left */
+               n = head - tail - 1;
+               if (count > n) {
+                       dev_err(cs->dev,
+                               "inbuf overflow, discarding %d bytes\n",
+                               count - n);
+                       count = n;
+               }
+               memcpy(inbuf->data + tail, buf, count);
+               tail += count;
+       }
+
+       gig_dbg(DEBUG_INTR, "setting tail to %u", tail);
+       atomic_set(&inbuf->tail, tail);
+
+       /* Everything was received .. Push data into handler */
+       gig_dbg(DEBUG_INTR, "%s-->BH", __func__);
+       gigaset_schedule_event(cs);
+       cs_put(cs);
+}
+
+/*
+ * Called by the tty driver when there's room for more data to send.
+ */
+static void
+gigaset_tty_wakeup(struct tty_struct *tty)
+{
+       struct cardstate *cs = cs_get(tty);
+
+       clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
+       if (!cs)
+               return;
+       tasklet_schedule(&cs->write_tasklet);
+       cs_put(cs);
+}
+
+static struct tty_ldisc gigaset_ldisc = {
+       .owner          = THIS_MODULE,
+       .magic          = TTY_LDISC_MAGIC,
+       .name           = "ser_gigaset",
+       .open           = gigaset_tty_open,
+       .close          = gigaset_tty_close,
+       .hangup         = gigaset_tty_hangup,
+       .read           = gigaset_tty_read,
+       .write          = gigaset_tty_write,
+       .ioctl          = gigaset_tty_ioctl,
+       .poll           = gigaset_tty_poll,
+       .receive_buf    = gigaset_tty_receive,
+       .write_wakeup   = gigaset_tty_wakeup,
+};
+
+
+/* Initialization / Shutdown */
+/* ========================= */
+
+static int __init ser_gigaset_init(void)
+{
+       int rc;
+
+       gig_dbg(DEBUG_INIT, "%s", __func__);
+       if ((rc = platform_driver_register(&device_driver)) != 0) {
+               err("error %d registering platform driver", rc);
+               return rc;
+       }
+
+       /* allocate memory for our driver state and intialize it */
+       if (!(driver = gigaset_initdriver(GIGASET_MINOR, GIGASET_MINORS,
+                                         GIGASET_MODULENAME, GIGASET_DEVNAME,
+                                         &ops, THIS_MODULE)))
+               goto error;
+
+       if ((rc = tty_register_ldisc(N_GIGASET_M101, &gigaset_ldisc)) != 0) {
+               err("error %d registering line discipline", rc);
+               goto error;
+       }
+
+       return 0;
+
+error:
+       if (driver) {
+               gigaset_freedriver(driver);
+               driver = NULL;
+       }
+       platform_driver_unregister(&device_driver);
+       return rc;
+}
+
+static void __exit ser_gigaset_exit(void)
+{
+       int rc;
+
+       gig_dbg(DEBUG_INIT, "%s", __func__);
+
+       if (driver) {
+               gigaset_freedriver(driver);
+               driver = NULL;
+       }
+
+       if ((rc = tty_unregister_ldisc(N_GIGASET_M101)) != 0)
+               err("error %d unregistering line discipline", rc);
+
+       platform_driver_unregister(&device_driver);
+}
+
+module_init(ser_gigaset_init);
+module_exit(ser_gigaset_exit);
index eba10466ccc61fd58eddd1b230629c7d84058781..a5b941c327f71477eecda3edb0f9b4c02acd4dda 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/ptrace.h>
 #include <linux/slab.h>
 #include <linux/string.h>
index ddd47cdfdb1f498b8c50dfa503099b97d250882a..1e2d38e3d68ccb3f8028b5702c1beeec36982e68 100644 (file)
@@ -29,7 +29,7 @@
 
 static char *revision = "$Revision: 1.1.2.3 $";
 
-#undef CONFIG_B1DMA_DEBUG
+#undef AVM_B1DMA_DEBUG
 
 /* ------------------------------------------------------------- */
 
@@ -391,16 +391,16 @@ static void b1dma_dispatch_tx(avmcard *card)
                        _put_slice(&p, skb->data, len);
                }
                txlen = (u8 *)p - (u8 *)dma->sendbuf.dmabuf;
-#ifdef CONFIG_B1DMA_DEBUG
+#ifdef AVM_B1DMA_DEBUG
                printk(KERN_DEBUG "tx: put msg len=%d\n", txlen);
 #endif
        } else {
                txlen = skb->len-2;
-#ifdef CONFIG_B1DMA_POLLDEBUG
+#ifdef AVM_B1DMA_POLLDEBUG
                if (skb->data[2] == SEND_POLLACK)
                        printk(KERN_INFO "%s: send ack\n", card->name);
 #endif
-#ifdef CONFIG_B1DMA_DEBUG
+#ifdef AVM_B1DMA_DEBUG
                printk(KERN_DEBUG "tx: put 0x%x len=%d\n", 
                       skb->data[2], txlen);
 #endif
@@ -450,7 +450,7 @@ static void b1dma_handle_rx(avmcard *card)
        u32 ApplId, MsgLen, DataB3Len, NCCI, WindowSize;
        u8 b1cmd =  _get_byte(&p);
 
-#ifdef CONFIG_B1DMA_DEBUG
+#ifdef AVM_B1DMA_DEBUG
        printk(KERN_DEBUG "rx: 0x%x %lu\n", b1cmd, (unsigned long)dma->recvlen);
 #endif
        
@@ -515,7 +515,7 @@ static void b1dma_handle_rx(avmcard *card)
                break;
 
        case RECEIVE_START:
-#ifdef CONFIG_B1DMA_POLLDEBUG
+#ifdef AVM_B1DMA_POLLDEBUG
                printk(KERN_INFO "%s: receive poll\n", card->name);
 #endif
                if (!suppress_pollack)
@@ -601,7 +601,7 @@ static void b1dma_handle_interrupt(avmcard *card)
                                rxlen = (dma->recvlen + 3) & ~3;
                                b1dma_writel(card, dma->recvbuf.dmaaddr+4, AMCC_RXPTR);
                                b1dma_writel(card, rxlen, AMCC_RXLEN);
-#ifdef CONFIG_B1DMA_DEBUG
+#ifdef AVM_B1DMA_DEBUG
                        } else {
                                printk(KERN_ERR "%s: rx not complete (%d).\n",
                                        card->name, rxlen);
index 2a3eb38f0ebb34b84da227a339ab5d78755a2187..6f5efa8d78cb24a1a31e5eb117ea5c9b01eeeb80 100644 (file)
@@ -28,8 +28,8 @@
 #include <linux/isdn/capilli.h>
 #include "avmcard.h"
 
-#undef CONFIG_C4_DEBUG
-#undef CONFIG_C4_POLLDEBUG
+#undef AVM_C4_DEBUG
+#undef AVM_C4_POLLDEBUG
 
 /* ------------------------------------------------------------- */
 
@@ -420,7 +420,7 @@ static void c4_dispatch_tx(avmcard *card)
 
        skb = skb_dequeue(&dma->send_queue);
        if (!skb) {
-#ifdef CONFIG_C4_DEBUG
+#ifdef AVM_C4_DEBUG
                printk(KERN_DEBUG "%s: tx underrun\n", card->name);
 #endif
                return;
@@ -444,16 +444,16 @@ static void c4_dispatch_tx(avmcard *card)
                        _put_slice(&p, skb->data, len);
                }
                txlen = (u8 *)p - (u8 *)dma->sendbuf.dmabuf;
-#ifdef CONFIG_C4_DEBUG
+#ifdef AVM_C4_DEBUG
                printk(KERN_DEBUG "%s: tx put msg len=%d\n", card->name, txlen);
 #endif
        } else {
                txlen = skb->len-2;
-#ifdef CONFIG_C4_POLLDEBUG
+#ifdef AVM_C4_POLLDEBUG
                if (skb->data[2] == SEND_POLLACK)
                        printk(KERN_INFO "%s: ack to c4\n", card->name);
 #endif
-#ifdef CONFIG_C4_DEBUG
+#ifdef AVM_C4_DEBUG
                printk(KERN_DEBUG "%s: tx put 0x%x len=%d\n",
                                card->name, skb->data[2], txlen);
 #endif
@@ -508,7 +508,7 @@ static void c4_handle_rx(avmcard *card)
        u32 cidx;
 
 
-#ifdef CONFIG_C4_DEBUG
+#ifdef AVM_C4_DEBUG
        printk(KERN_DEBUG "%s: rx 0x%x len=%lu\n", card->name,
                                b1cmd, (unsigned long)dma->recvlen);
 #endif
@@ -586,7 +586,7 @@ static void c4_handle_rx(avmcard *card)
                break;
 
        case RECEIVE_START:
-#ifdef CONFIG_C4_POLLDEBUG
+#ifdef AVM_C4_POLLDEBUG
                printk(KERN_INFO "%s: poll from c4\n", card->name);
 #endif
                if (!suppress_pollack)
index 0afd7633556d38617ae0774ce4ebb3e41e222e81..ff284aeb8fbb8ed6e843f96ce72beaef07acd78c 100644 (file)
@@ -187,7 +187,7 @@ static diva_card *find_card_by_ctrl(word controller)
  */
 void *TransmitBufferSet(APPL * appl, dword ref)
 {
-       appl->xbuffer_used[ref] = TRUE;
+       appl->xbuffer_used[ref] = true;
        DBG_PRV1(("%d:xbuf_used(%d)", appl->Id, ref + 1))
            return (void *) ref;
 }
@@ -202,7 +202,7 @@ void *TransmitBufferGet(APPL * appl, void *p)
 
 void TransmitBufferFree(APPL * appl, void *p)
 {
-       appl->xbuffer_used[(dword) p] = FALSE;
+       appl->xbuffer_used[(dword) p] = false;
        DBG_PRV1(("%d:xbuf_free(%d)", appl->Id, ((dword) p) + 1))
 }
 
index d835e74ecf186e9ac424e77da54e554c94dc7218..0db9cc661e28b7b224e49fd6a2cf34e191f92250 100644 (file)
@@ -287,7 +287,7 @@ void* diva_maint_finit (void) {
   }
   external_dbg_queue = 0;
 
-  for (i = 1; i < (sizeof(clients)/sizeof(clients[0])); i++) {
+  for (i = 1; i < ARRAY_SIZE(clients); i++) {
     if (clients[i].pmem) {
       diva_os_free (0, clients[i].pmem);
     }
@@ -391,7 +391,7 @@ static void DI_register (void *arg) {
 
   diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "register");
 
-  for (id = 1; id < (sizeof(clients)/sizeof(clients[0])); id++) {
+  for (id = 1; id < ARRAY_SIZE(clients); id++) {
     if (clients[id].hDbg == hDbg) {
       /*
         driver already registered
@@ -494,7 +494,7 @@ static void DI_deregister (pDbgHandle hDbg) {
   diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "read");
   diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "read");
 
-  for (i = 1; i < (sizeof(clients)/sizeof(clients[0])); i++) {
+  for (i = 1; i < ARRAY_SIZE(clients); i++) {
     if (clients[i].hDbg == hDbg) {
       diva_dbg_entry_head_t* pmsg;
       char tmp[256];
@@ -736,7 +736,7 @@ int diva_get_driver_info (dword id, byte* data, int data_length) {
   int to_copy;
 
   if (!data || !id || (data_length < 17) ||
-      (id >= (sizeof(clients)/sizeof(clients[0])))) {
+      (id >= ARRAY_SIZE(clients))) {
     return (-1);
   }
 
@@ -786,7 +786,7 @@ int diva_get_driver_dbg_mask (dword id, byte* data) {
   diva_os_spin_lock_magic_t old_irql;
   int ret = -1;
 
-  if (!data || !id || (id >= (sizeof(clients)/sizeof(clients[0])))) {
+  if (!data || !id || (id >= ARRAY_SIZE(clients))) {
     return (-1);
   }
   diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "driver info");
@@ -809,7 +809,7 @@ int diva_set_driver_dbg_mask (dword id, dword mask) {
   int ret = -1;
   
 
-  if (!id || (id >= (sizeof(clients)/sizeof(clients[0])))) {
+  if (!id || (id >= ARRAY_SIZE(clients))) {
     return (-1);
   }
 
@@ -887,7 +887,7 @@ void diva_mnt_add_xdi_adapter (const DESCRIPTOR* d) {
   diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "register");
   diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "register");
 
-  for (id = 1; id < (sizeof(clients)/sizeof(clients[0])); id++) {
+  for (id = 1; id < ARRAY_SIZE(clients); id++) {
     if (clients[id].hDbg && (clients[id].request == d->request)) {
       diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "register");
       diva_os_leave_spin_lock (&dbg_adapter_lock, &old_irql1, "register");
@@ -1037,7 +1037,7 @@ void diva_mnt_remove_xdi_adapter (const DESCRIPTOR* d) {
   diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "read");
   diva_os_enter_spin_lock (&dbg_q_lock, &old_irql, "read");
 
-  for (i = 1; i < (sizeof(clients)/sizeof(clients[0])); i++) {
+  for (i = 1; i < ARRAY_SIZE(clients); i++) {
     if (clients[i].hDbg && (clients[i].request == d->request)) {
       diva_dbg_entry_head_t* pmsg;
       char tmp[256];
@@ -1115,7 +1115,7 @@ void diva_mnt_remove_xdi_adapter (const DESCRIPTOR* d) {
 void* SuperTraceOpenAdapter   (int AdapterNumber) {
   int i;
 
-  for (i = 1; i < (sizeof(clients)/sizeof(clients[0])); i++) {
+  for (i = 1; i < ARRAY_SIZE(clients); i++) {
     if (clients[i].hDbg && clients[i].request && (clients[i].logical == AdapterNumber)) {
       return (&clients[i]);
     }
@@ -1508,7 +1508,7 @@ static void diva_maint_state_change_notify (void* user_context,
                                        int ch = TraceFilterChannel;
                                        int id = TraceFilterIdent;
 
-                                       if ((id >= 0) && (ch >= 0) && (id < sizeof(clients)/sizeof(clients[0])) &&
+                                       if ((id >= 0) && (ch >= 0) && (id < ARRAY_SIZE(clients)) &&
                                                (clients[id].Dbg.id == (byte)id) && (clients[id].pIdiLib == hLib)) {
                                                if (ch != (int)modem->ChannelNumber) {
                                                        break;
@@ -1555,7 +1555,7 @@ static void diva_maint_state_change_notify (void* user_context,
                                        int ch = TraceFilterChannel;
                                        int id = TraceFilterIdent;
 
-                                       if ((id >= 0) && (ch >= 0) && (id < sizeof(clients)/sizeof(clients[0])) &&
+                                       if ((id >= 0) && (ch >= 0) && (id < ARRAY_SIZE(clients)) &&
                                                (clients[id].Dbg.id == (byte)id) && (clients[id].pIdiLib == hLib)) {
                                                if (ch != (int)fax->ChannelNumber) {
                                                        break;
@@ -1803,7 +1803,7 @@ static void diva_maint_trace_notify (void* user_context,
   /*
     Selective trace
     */
-  if ((id >= 0) && (ch >= 0) && (id < sizeof(clients)/sizeof(clients[0])) &&
+  if ((id >= 0) && (ch >= 0) && (id < ARRAY_SIZE(clients)) &&
       (clients[id].Dbg.id == (byte)id) && (clients[id].pIdiLib == hLib)) {
     const char* p = NULL;
     int ch_value = -1;
@@ -1925,7 +1925,7 @@ int diva_mnt_shutdown_xdi_adapters (void) {
   byte * pmem;
 
 
-  for (i = 1; i < (sizeof(clients)/sizeof(clients[0])); i++) {
+  for (i = 1; i < ARRAY_SIZE(clients); i++) {
     pmem = NULL;
 
     diva_os_enter_spin_lock (&dbg_adapter_lock, &old_irql1, "unload");
@@ -2006,7 +2006,7 @@ int diva_set_trace_filter (int filter_length, const char* filter) {
 
   on = (TraceFilter[0] == 0);
 
-  for (i = 1; i < (sizeof(clients)/sizeof(clients[0])); i++) {
+  for (i = 1; i < ARRAY_SIZE(clients); i++) {
     if (clients[i].hDbg && clients[i].pIdiLib && clients[i].request) {
       client_b_on    = on && ((clients[i].hDbg->dbgMask & DIVA_MGT_DBG_IFC_BCHANNEL) != 0);
       client_atap_on = on && ((clients[i].hDbg->dbgMask & DIVA_MGT_DBG_IFC_AUDIO)    != 0);
@@ -2017,7 +2017,7 @@ int diva_set_trace_filter (int filter_length, const char* filter) {
     }
   }
 
-  for (i = 1; i < (sizeof(clients)/sizeof(clients[0])); i++) {
+  for (i = 1; i < ARRAY_SIZE(clients); i++) {
     if (clients[i].hDbg && clients[i].pIdiLib && clients[i].request && clients[i].request_pending) {
       diva_os_leave_spin_lock (&dbg_q_lock, &old_irql, "write_filter");
       clients[i].request_pending = 0;
index e1df8d98c311cfb32ba39df84f108edca35898c6..ce8df38789087c4f7c85b056ba033644d3a1be00 100644 (file)
@@ -173,16 +173,16 @@ void pr_out(ADAPTER * a)
         xdi_xlog_request (XDI_A_NR(a), this->Id, this->ReqCh, this->MInd,
                           a->IdTypeTable[this->No]);
         a->ram_out(a, &ReqOut->Req, this->MInd);
-        more = TRUE;
+        more = true;
       }
       else {
         xdi_xlog_request (XDI_A_NR(a), this->Id, this->ReqCh, this->Req,
                           a->IdTypeTable[this->No]);
         this->More |=XMOREF;
         a->ram_out(a, &ReqOut->Req, this->Req);
-        more = FALSE;
+        more = false;
         if (a->FlowControlIdTable[this->ReqCh] == this->Id)
-          a->FlowControlSkipTable[this->ReqCh] = TRUE;
+          a->FlowControlSkipTable[this->ReqCh] = true;
         /*
            Note that remove request was sent to the card
            */
@@ -311,7 +311,7 @@ byte pr_dpc(ADAPTER * a)
         /* are marked RNR                                           */
       if(RNRId && RNRId==a->ram_in(a, &IndIn->IndId)) {
         a->ram_out(a, &IndIn->Ind, 0);
-        a->ram_out(a, &IndIn->RNR, TRUE);
+        a->ram_out(a, &IndIn->RNR, true);
       }
       else {
         Ind = a->ram_in(a, &IndIn->Ind);
@@ -331,7 +331,7 @@ byte pr_dpc(ADAPTER * a)
             dtrc(dprintf("RNR"));
             a->ram_out(a, &IndIn->Ind, 0);
             RNRId = a->ram_in(a, &IndIn->IndId);
-            a->ram_out(a, &IndIn->RNR, TRUE);
+            a->ram_out(a, &IndIn->RNR, true);
           }
         }
       }
@@ -340,7 +340,7 @@ byte pr_dpc(ADAPTER * a)
     }
     a->ram_out(a, &PR_RAM->IndOutput, 0);
   }
-  return FALSE;
+  return false;
 }
 byte scom_test_int(ADAPTER * a)
 {
@@ -399,7 +399,7 @@ byte isdn_rc(ADAPTER * a,
           return (0);
         }
         if (extended_info_type == DIVA_RC_TYPE_REMOVE_COMPLETE)
-          a->RcExtensionSupported = TRUE;
+          a->RcExtensionSupported = true;
       }
       a->misc_flags_table[e_no] &= ~DIVA_MISC_FLAGS_REMOVE_PENDING;
       a->misc_flags_table[e_no] &= ~DIVA_MISC_FLAGS_NO_RC_CANCELLING;
@@ -428,7 +428,7 @@ byte isdn_rc(ADAPTER * a,
     }
     if (Rc==OK_FC) {
       a->FlowControlIdTable[Ch] = Id;
-      a->FlowControlSkipTable[Ch] = FALSE;
+      a->FlowControlSkipTable[Ch] = false;
       this->Rc = Rc;
       this->More &= ~(XBUSY | XMOREC);
       this->complete=0xff;
index 77155d9f399bc1d1b46c2323ac4f6bedb48b30db..4aba5c502d8e18759fb274f522244700b4abf752 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/smp_lock.h>
 #include <linux/poll.h>
 #include <asm/uaccess.h>
@@ -164,7 +163,7 @@ static ssize_t divas_maint_read(struct file *file, char __user *buf,
        return (maint_read_write(buf, (int) count));
 }
 
-static struct file_operations divas_maint_fops = {
+static const struct file_operations divas_maint_fops = {
        .owner   = THIS_MODULE,
        .llseek  = no_llseek,
        .read    = divas_maint_read,
index fff0d89c806b47a3a8be7736bd69719045837461..556b19615bc76e2e8a1a0cb7458687f7449370b0 100644 (file)
@@ -131,7 +131,7 @@ static void remove_um_idi_proc(void)
        }
 }
 
-static struct file_operations divas_idi_fops = {
+static const struct file_operations divas_idi_fops = {
        .owner   = THIS_MODULE,
        .llseek  = no_llseek,
        .read    = um_idi_read,
index 91fc92c01afe84930dc5bd5838a9db52ebb1c6d5..5e862e2441171e029954a76a01713bd5aa8adf72 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <asm/uaccess.h>
 #include <asm/io.h>
 #include <linux/ioport.h>
@@ -663,7 +662,7 @@ static unsigned int divas_poll(struct file *file, poll_table * wait)
        return (POLLIN | POLLRDNORM);
 }
 
-static struct file_operations divas_fops = {
+static const struct file_operations divas_fops = {
        .owner   = THIS_MODULE,
        .llseek  = no_llseek,
        .read    = divas_read,
index 6a4373a4f1e8c7715a274eff93db299fdffa8970..0632a260699858cf7bc7a3036d366b34d888eed5 100644 (file)
@@ -113,7 +113,7 @@ static int divas_close(struct inode *inode, struct file *file)
        return (0);
 }
 
-static struct file_operations divas_fops = {
+static const struct file_operations divas_fops = {
        .owner   = THIS_MODULE,
        .llseek  = no_llseek,
        .read    = divas_read,
index f9b00f19afd2e0fd5c993b83f061cb8b8cd890dd..784232a144c8155d15cb4fa206c33a3ace9ebdaa 100644 (file)
@@ -253,7 +253,7 @@ extern APPL   * application;
 
 
 
-static byte remove_started = FALSE;
+static byte remove_started = false;
 static PLCI dummy_plci;
 
 
@@ -456,12 +456,12 @@ word api_put(APPL   * appl, CAPI_MSG   * msg)
 
         return _QUEUE_FULL;
       }
-      c = FALSE;
+      c = false;
       if ((((byte   *) msg) < ((byte   *)(plci->msg_in_queue)))
        || (((byte   *) msg) >= ((byte   *)(plci->msg_in_queue)) + sizeof(plci->msg_in_queue)))
       {
         if (plci->msg_in_write_pos != plci->msg_in_read_pos)
-          c = TRUE;
+          c = true;
       }
       if (msg->header.command == _DATA_B3_R)
       {
@@ -506,13 +506,13 @@ word api_put(APPL   * appl, CAPI_MSG   * msg)
 
             return _QUEUE_FULL;
           }
-          c = TRUE;
+          c = true;
         }
       }
       else
       {
         if (plci->req_in || plci->internal_command)
-          c = TRUE;
+          c = true;
         else
         {
           plci->command = msg->header.command;
@@ -626,10 +626,10 @@ word api_parse(byte   * msg, word length, byte * format, API_PARSE * parms)
       break;
     }
 
-    if(p>length) return TRUE;
+    if(p>length) return true;
   }
   if(parms) parms[i].info = NULL;
-  return FALSE;
+  return false;
 }
 
 void api_save_msg(API_PARSE   *in, byte *format, API_SAVE   *out)
@@ -687,7 +687,7 @@ word api_remove_start(void)
   word j;
 
   if(!remove_started) {
-    remove_started = TRUE;
+    remove_started = true;
     for(i=0;i<max_adapter;i++) {
       if(adapter[i].request) {
         for(j=0;j<adapter[i].max_plci;j++) {
@@ -1080,7 +1080,7 @@ static void plci_remove(PLCI   * plci)
       send_req(plci);
     }
   }
-  ncci_remove (plci, 0, FALSE);
+  ncci_remove (plci, 0, false);
   plci_free_msg_in_queue (plci);
 
   plci->channels = 0;
@@ -1226,7 +1226,7 @@ byte connect_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
       Id = ((word)1<<8)|a->Id;
       sendf(appl,_CONNECT_R|CONFIRM,Id,Number,"w",0);
       sendf(appl, _DISCONNECT_I, Id, 0, "w", _L1_ERROR);
-      return FALSE;
+      return false;
     }
     Info = _OUT_OF_PLCI;
     if((i=get_plci(a)))
@@ -1330,7 +1330,7 @@ byte connect_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
       plci->command = _CONNECT_R;
       plci->number = Number;
       /* x.31 or D-ch free SAPI in LinkLayer? */
-      if(ch==1 && LinkLayer!=3 && LinkLayer!=12) noCh = TRUE;
+      if(ch==1 && LinkLayer!=3 && LinkLayer!=12) noCh = true;
       if((ch==0 || ch==2 || noCh || ch==3 || ch==4) && !Info)
       {
         /* B-channel used for B3 connections (ch==0), or no B channel    */
@@ -1381,7 +1381,7 @@ byte connect_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
             plci->command = 0;
             dbug(1,dprintf("Spoof"));
             send_req(plci);
-            return FALSE;
+            return false;
           }
           if(ch==4)add_p(plci,CHI,p_chi);
           add_s(plci,CPN,&parms[1]);
@@ -1395,11 +1395,11 @@ byte connect_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
             plci->appl = appl;
             sig_req(plci,LISTEN_REQ,0);
             send_req(plci);
-            return FALSE;
+            return false;
           }
         }
         send_req(plci);
-        return FALSE;
+        return false;
       }
       plci->Id = 0;
     }
@@ -1571,7 +1571,7 @@ byte connect_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
 byte connect_a_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * msg)
 {
   dbug(1,dprintf("connect_a_res"));
-  return FALSE;
+  return false;
 }
 
 byte disconnect_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * msg)
@@ -1624,9 +1624,9 @@ byte disconnect_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plc
       }
     }
 
-  if(!appl)  return FALSE;
+  if(!appl)  return false;
   sendf(appl, _DISCONNECT_R|CONFIRM, Id, Number, "w",Info);
-  return FALSE;
+  return false;
 }
 
 byte disconnect_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * msg)
@@ -1702,7 +1702,7 @@ byte listen_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, A
         "w",Info);
 
   if (a) listen_check(a);
-  return FALSE;
+  return false;
 }
 
 byte info_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * msg)
@@ -1739,7 +1739,7 @@ byte info_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APP
       add_s(plci,KEY,&ai_parms[1]);
       sig_req(plci,INFO_REQ,0);
       send_req(plci);
-      return FALSE;
+      return false;
     }
 
     if(plci->State && ai_parms[2].length)
@@ -1769,7 +1769,7 @@ byte info_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APP
     if((i=get_plci(a)))
     {
       rc_plci = &a->plci[i-1];
-      appl->NullCREnable  = TRUE;
+      appl->NullCREnable  = true;
       rc_plci->internal_command = C_NCR_FAC_REQ;
       rc_plci->appl = appl;
       add_p(rc_plci,CAI,"\x01\x80");
@@ -1788,7 +1788,7 @@ byte info_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APP
       add_ai(rc_plci, &msg[1]);
       sig_req(rc_plci,NCR_FACILITY,0);
       send_req(rc_plci);
-      return FALSE;
+      return false;
      /* for application controlled supplementary services    */
     }
   }
@@ -1811,13 +1811,13 @@ byte info_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APP
           Number,
           "w",Info);
   }
-  return FALSE;
+  return false;
 }
 
 byte info_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * msg)
 {
   dbug(1,dprintf("info_res"));
-  return FALSE;
+  return false;
 }
 
 byte alert_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * msg)
@@ -1828,7 +1828,7 @@ byte alert_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, AP
   dbug(1,dprintf("alert_req"));
 
   Info = _WRONG_IDENTIFIER;
-  ret = FALSE;
+  ret = false;
   if(plci) {
     Info = _ALERT_IGNORED;
     if(plci->State!=INC_CON_ALERT) {
@@ -1922,7 +1922,7 @@ byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
             rplci->appl = appl;
             sig_req(rplci,S_SUPPORTED,0);
             send_req(rplci);
-            return FALSE;
+            return false;
             break;
 
           case S_LISTEN:
@@ -1972,7 +1972,7 @@ byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
               add_s(plci,CAI,&ss_parms[1]);
               sig_req(plci,CALL_HOLD,0);
               send_req(plci);
-              return FALSE;
+              return false;
             }
             else Info = 0x3010;                    /* wrong state           */
             break;
@@ -1997,13 +1997,13 @@ byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
                 plci->internal_command = BLOCK_PLCI;
                 plci->command = 0;
                 dbug(1,dprintf("Spoof"));
-                return FALSE;
+                return false;
               }
               else
               {
                 sig_req(plci,CALL_RETRIEVE,0);
                 send_req(plci);
-                return FALSE;
+                return false;
               }
             }
             else Info = 0x3010;                    /* wrong state           */
@@ -2123,7 +2123,7 @@ byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
               add_p(plci,CAI,cai);
               sig_req(plci,S_SERVICE,0);
               send_req(plci);
-              return FALSE;
+              return false;
             }
             else Info = 0x3010;                    /* wrong state           */
             break;
@@ -2265,7 +2265,7 @@ byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
               add_p(rplci,CAI,cai);
               sig_req(rplci,S_SERVICE,0);
               send_req(rplci);
-              return FALSE;
+              return false;
             }
             else
             {
@@ -2291,14 +2291,14 @@ byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
             ss_parms[3].info[3] = (byte)GET_WORD(&(ss_parms[2].info[0]));
             plci->command = 0;
             plci->internal_command = CD_REQ_PEND;
-            appl->CDEnable = TRUE;
+            appl->CDEnable = true;
             cai[0] = 1;
             cai[1] = CALL_DEFLECTION;
             add_p(plci,CAI,cai);
             add_p(plci,CPN,ss_parms[3].info);
             sig_req(plci,S_SERVICE,0);
             send_req(plci);
-            return FALSE;
+            return false;
             break;
 
           case S_CALL_FORWARDING_START:
@@ -2337,7 +2337,7 @@ byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
             add_p(rplci,CPN,ss_parms[6].info);
             sig_req(rplci,S_SERVICE,0);
             send_req(rplci);
-            return FALSE;
+            return false;
             break;
 
           case S_INTERROGATE_DIVERSION:
@@ -2456,7 +2456,7 @@ byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
                         
             sig_req(rplci,S_SERVICE,0);
             send_req(rplci);
-            return FALSE;
+            return false;
             break;
 
           case S_MWI_ACTIVATE:
@@ -2472,7 +2472,7 @@ byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
               {
                 rplci = &a->plci[i-1];
                 rplci->appl = appl;
-                rplci->cr_enquiry=TRUE;
+                rplci->cr_enquiry=true;
                 add_p(rplci,CAI,"\x01\x80");
                 add_p(rplci,UID,"\x06\x43\x61\x70\x69\x32\x30");
                 sig_req(rplci,ASSIGN,DSIG_ID);
@@ -2487,7 +2487,7 @@ byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
             else
             {
               rplci = plci;
-              rplci->cr_enquiry=FALSE;
+              rplci->cr_enquiry=false;
             }
 
             rplci->command = 0;
@@ -2509,7 +2509,7 @@ byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
             add_p(rplci,UID,ss_parms[10].info); /* Time */
             sig_req(rplci,S_SERVICE,0);
             send_req(rplci);
-            return FALSE;
+            return false;
 
           case S_MWI_DEACTIVATE:
             if(api_parse(&parms->info[1],(word)parms->length,"wbwwss",ss_parms))
@@ -2524,7 +2524,7 @@ byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
               {
                 rplci = &a->plci[i-1];
                 rplci->appl = appl;
-                rplci->cr_enquiry=TRUE;
+                rplci->cr_enquiry=true;
                 add_p(rplci,CAI,"\x01\x80");
                 add_p(rplci,UID,"\x06\x43\x61\x70\x69\x32\x30");
                 sig_req(rplci,ASSIGN,DSIG_ID);
@@ -2539,7 +2539,7 @@ byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
             else
             {
               rplci = plci;
-              rplci->cr_enquiry=FALSE;
+              rplci->cr_enquiry=false;
             }
 
             rplci->command = 0;
@@ -2556,7 +2556,7 @@ byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
             add_p(rplci,OAD,ss_parms[5].info); /* Controlling User Number */
             sig_req(rplci,S_SERVICE,0);
             send_req(rplci);
-            return FALSE;
+            return false;
 
           default:
             Info = 0x300E;  /* not supported */
@@ -2597,13 +2597,13 @@ byte facility_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
         Id,
         Number,
         "wws",Info,selector,SSparms);
-  return FALSE;
+  return false;
 }
 
 byte facility_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * msg)
 {
   dbug(1,dprintf("facility_res"));
-  return FALSE;
+  return false;
 }
 
 byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * parms)
@@ -2649,7 +2649,7 @@ byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plc
               Id,
               Number,
               "w",Info);
-        return FALSE;
+        return false;
       }
       plci->requested_options_conn = 0;
 
@@ -2684,7 +2684,7 @@ byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plc
            || (fax_feature_bits & T30_FEATURE_BIT_MORE_DOCUMENTS))
           {
             len = (byte)(&(((T30_INFO *) 0)->universal_6));
-            fax_info_change = FALSE;
+            fax_info_change = false;
             if (ncpi->length >= 4)
             {
               w = GET_WORD(&ncpi->info[3]);
@@ -2693,7 +2693,7 @@ byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plc
                 ((T30_INFO   *)(plci->fax_connect_info_buffer))->resolution =
                   (byte)((((T30_INFO   *)(plci->fax_connect_info_buffer))->resolution & ~T30_RESOLUTION_R8_0770_OR_200) |
                   ((w & 0x0001) ? T30_RESOLUTION_R8_0770_OR_200 : 0));
-                fax_info_change = TRUE;
+                fax_info_change = true;
               }
               fax_control_bits &= ~(T30_CONTROL_BIT_REQUEST_POLLING | T30_CONTROL_BIT_MORE_DOCUMENTS);
               if (w & 0x0002)  /* Fax-polling request */
@@ -2709,7 +2709,7 @@ byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plc
                 if (((byte) w) != ((T30_INFO   *)(plci->fax_connect_info_buffer))->data_format)
                 {
                   ((T30_INFO   *)(plci->fax_connect_info_buffer))->data_format = (byte) w;
-                  fax_info_change = TRUE;
+                  fax_info_change = true;
                 }
 
                 if ((a->man_profile.private_options & (1L << PRIVATE_FAX_SUB_SEP_PWD))
@@ -2781,13 +2781,13 @@ byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plc
                 {
                   len = (byte)(&(((T30_INFO *) 0)->universal_6));
                 }
-                fax_info_change = TRUE;
+                fax_info_change = true;
 
               }
               if (fax_control_bits != GET_WORD(&((T30_INFO   *)plci->fax_connect_info_buffer)->control_bits_low))
               {
                 PUT_WORD (&((T30_INFO   *)plci->fax_connect_info_buffer)->control_bits_low, fax_control_bits);
-                fax_info_change = TRUE;
+                fax_info_change = true;
               }
             }
             if (Info == GOOD)
@@ -2798,12 +2798,12 @@ byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plc
                 if (fax_feature_bits & T30_FEATURE_BIT_MORE_DOCUMENTS)
                 {
                   start_internal_command (Id, plci, fax_connect_info_command);
-                  return FALSE;
+                  return false;
                 }
                 else
                 {
                   start_internal_command (Id, plci, fax_adjust_b23_command);
-                  return FALSE;
+                  return false;
                 }
               }
             }
@@ -2820,7 +2820,7 @@ byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plc
         for (w = 0; w < ncpi->length; w++)
           plci->internal_req_buffer[2+w] = ncpi->info[1+w];
         start_internal_command (Id, plci, rtp_connect_b3_req_command);
-        return FALSE;
+        return false;
       }
 
       if(!Info)
@@ -2837,7 +2837,7 @@ byte connect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plc
         Id,
         Number,
         "w",Info);
-  return FALSE;
+  return false;
 }
 
 byte connect_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * parms)
@@ -2909,7 +2909,7 @@ byte connect_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plc
             plci->fax_connect_info_length = len;
             ((T30_INFO *)(plci->fax_connect_info_buffer))->code = 0;
             start_internal_command (Id, plci, fax_connect_ack_command);
-     return FALSE;
+     return false;
           }
         }
 
@@ -2932,7 +2932,7 @@ byte connect_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plc
         for (w = 0; w < ncpi->length; w++)
           plci->internal_req_buffer[2+w] = ncpi->info[1+w];
         start_internal_command (Id, plci, rtp_connect_b3_res_command);
-        return FALSE;
+        return false;
       }
 
       else
@@ -2945,14 +2945,14 @@ byte connect_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plc
         sendf(appl,_CONNECT_B3_ACTIVE_I,Id,0,"s","");
         if (plci->adjust_b_restore)
         {
-          plci->adjust_b_restore = FALSE;
+          plci->adjust_b_restore = false;
           start_internal_command (Id, plci, adjust_b_restore);
         }
       }
       return 1;
     }
   }
-  return FALSE;
+  return false;
 }
 
 byte connect_b3_a_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * parms)
@@ -2972,7 +2972,7 @@ byte connect_b3_a_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * p
       channel_xmit_xon (plci);
     }
   }
-  return FALSE;
+  return false;
 }
 
 byte disconnect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * parms)
@@ -3004,7 +3004,7 @@ byte disconnect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   *
       {
         plci->send_disc = (byte)ncci;
         plci->command = 0;
-        return FALSE;
+        return false;
       }
       else
       {
@@ -3028,7 +3028,7 @@ byte disconnect_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   *
         Id,
         Number,
         "w",Info);
-  return FALSE;
+  return false;
 }
 
 byte disconnect_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * parms)
@@ -3084,7 +3084,7 @@ byte disconnect_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   *
       }
     }
   }
-  return FALSE;
+  return false;
 }
 
 byte data_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * parms)
@@ -3140,7 +3140,7 @@ byte data_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
       }
 
       send_data(plci);
-      return FALSE;
+      return false;
     }
   }
   if (appl)
@@ -3161,7 +3161,7 @@ byte data_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
           Number,
           "ww",GET_WORD(parms[2].info),Info);
   }
-  return FALSE;
+  return false;
 }
 
 byte data_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * parms)
@@ -3194,7 +3194,7 @@ byte data_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
       }
     }
   }
-  return FALSE;
+  return false;
 }
 
 byte reset_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * parms)
@@ -3235,7 +3235,7 @@ byte reset_b3_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
         Id,
         Number,
         "w",Info);
-  return FALSE;
+  return false;
 }
 
 byte reset_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * parms)
@@ -3254,12 +3254,12 @@ byte reset_b3_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
       {
         a->ncci_state[ncci] = CONNECTED;
         nl_req_ncci(plci,N_RESET_ACK,(byte)ncci);
-        return TRUE;
+        return true;
       }
     break;
     }
   }
-  return FALSE;
+  return false;
 }
 
 byte connect_b3_t90_a_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * parms)
@@ -3292,7 +3292,7 @@ byte connect_b3_t90_a_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI
       return 1;
     }
   }
-  return FALSE;
+  return false;
 }
 
 
@@ -3378,7 +3378,7 @@ byte select_b_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
               plci->internal_command = BLOCK_PLCI; /* lock other commands */
               plci->command = 0;
               dbug(1,dprintf("continue if codec loaded"));
-              return FALSE;
+              return false;
             }
           }
         }
@@ -3407,12 +3407,12 @@ byte select_b_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci,
         else if (plci->call_dir & CALL_DIR_IN)
           plci->call_dir = CALL_DIR_IN | CALL_DIR_ANSWER;
         start_internal_command (Id, plci, select_b_command);
-        return FALSE;
+        return false;
       }
     }
   }
   sendf(appl, _SELECT_B_REQ|CONFIRM, Id, Number, "w", Info);
-  return FALSE;
+  return false;
 }
 
 byte manufacturer_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * plci, APPL   * appl, API_PARSE * parms)
@@ -3489,7 +3489,7 @@ byte manufacturer_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * p
           }
 
           plci->State = LOCAL_CONNECT;
-          plci->manufacturer = TRUE;
+          plci->manufacturer = true;
           plci->command = _MANUFACTURER_R;
           plci->m_command = command;
           plci->number = Number;
@@ -3520,7 +3520,7 @@ byte manufacturer_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * p
                 plci->internal_command = BLOCK_PLCI; /* reject other req meanwhile */
                 plci->command = 0;
                 send_req(plci);
-                return FALSE;
+                return false;
               }
               if(dir==1) {
                 sig_req(plci,CALL_REQ,0);
@@ -3573,7 +3573,7 @@ byte manufacturer_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * p
       }
       else if(req==LAW_REQ)
       {
-        plci->cr_enquiry = TRUE;
+        plci->cr_enquiry = true;
       }
       add_ss(plci,FTY,&m_parms[1]);
       sig_req(plci,req,0);
@@ -3739,7 +3739,7 @@ byte manufacturer_req(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * p
         Id,
         Number,
         "dww",_DI_MANU_ID,command,Info);
-  return FALSE;
+  return false;
 }
 
 
@@ -3760,7 +3760,7 @@ byte manufacturer_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * p
    || (msg[1].length == 0)
    || (GET_DWORD(msg[0].info)!=_DI_MANU_ID))
   {
-    return FALSE;
+    return false;
   }
   indication = GET_WORD(msg[1].info);
   switch (indication)
@@ -3811,7 +3811,7 @@ byte manufacturer_res(dword Id, word Number, DIVA_CAPI_ADAPTER   * a, PLCI   * p
     break;
 
   }
-  return FALSE;
+  return false;
 }
 
 /*------------------------------------------------------------------*/
@@ -3908,14 +3908,14 @@ void   callback(ENTITY   * e)
           plci->nl_req = 0;
       }
       if (plci->nl_req)
-        control_rc (plci, 0, rc, ch, 0, TRUE);
+        control_rc (plci, 0, rc, ch, 0, true);
       else
       {
         if (req == N_XON)
         {
           channel_x_on (plci, ch);
           if (plci->internal_command)
-            control_rc (plci, req, rc, ch, 0, TRUE);
+            control_rc (plci, req, rc, ch, 0, true);
         }
         else
         {
@@ -3931,21 +3931,21 @@ void   callback(ENTITY   * e)
               }
             }
             channel_xmit_xon (plci);
-            control_rc (plci, 0, rc, ch, global_req, TRUE);
+            control_rc (plci, 0, rc, ch, global_req, true);
           }
           else if (plci->data_sent)
           {
             channel_xmit_xon (plci);
-            plci->data_sent = FALSE;
+            plci->data_sent = false;
             plci->NL.XNum = 1;
             data_rc (plci, ch);
             if (plci->internal_command)
-              control_rc (plci, req, rc, ch, 0, TRUE);
+              control_rc (plci, req, rc, ch, 0, true);
           }
           else
           {
             channel_xmit_xon (plci);
-            control_rc (plci, req, rc, ch, 0, TRUE);
+            control_rc (plci, req, rc, ch, 0, true);
           }
         }
       }
@@ -3974,12 +3974,12 @@ void   callback(ENTITY   * e)
         if (rc != ASSIGN_OK)
           e->Id = 0;
         channel_xmit_xon (plci);
-        control_rc (plci, 0, rc, ch, global_req, FALSE);
+        control_rc (plci, 0, rc, ch, global_req, false);
       }
       else
       {
         channel_xmit_xon (plci);
-        control_rc (plci, req, rc, ch, 0, FALSE);
+        control_rc (plci, req, rc, ch, 0, false);
       }
     }
     /*
@@ -4065,8 +4065,8 @@ capi_callback_suffix:
 
     if (plci->li_notify_update)
     {
-      plci->li_notify_update = FALSE;
-      mixer_notify_update (plci, FALSE);
+      plci->li_notify_update = false;
+      mixer_notify_update (plci, false);
     }
 
   }
@@ -4428,7 +4428,7 @@ void control_rc(PLCI   * plci, byte req, byte rc, byte ch, byte global_req, byte
           else
           {
             sendf(appl,_INFO_R|CONFIRM,Id&0xf,Number,"w",_WRONG_STATE);
-            appl->NullCREnable = FALSE;
+            appl->NullCREnable = false;
             plci_remove(plci);
           }
         }
@@ -4441,7 +4441,7 @@ void control_rc(PLCI   * plci, byte req, byte rc, byte ch, byte global_req, byte
           else
           {
             sendf(appl,_INFO_R|CONFIRM,Id&0xf,Number,"w",_WRONG_STATE);
-            appl->NullCREnable = FALSE;
+            appl->NullCREnable = false;
           }
           plci_remove(plci);
         }
@@ -4862,7 +4862,7 @@ void sig_ind(PLCI   * plci)
     byte CF_Ind[] = "\x09\x02\x00\x06\x00\x00\x00\x00\x00\x00";
     byte Interr_Err_Ind[] = "\x0a\x02\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
     byte CONF_Ind[] = "\x09\x16\x00\x06\x00\x00\0x00\0x00\0x00\0x00";
-  byte force_mt_info = FALSE;
+  byte force_mt_info = false;
   byte dir;
   dword d;
   word w;
@@ -4933,7 +4933,7 @@ void sig_ind(PLCI   * plci)
   {
     if(plci->cr_enquiry && plci->appl)
     {
-      plci->cr_enquiry = FALSE;
+      plci->cr_enquiry = false;
       /* d = MANU_ID            */
       /* w = m_command          */
       /* b = total length       */
@@ -5158,7 +5158,7 @@ void sig_ind(PLCI   * plci)
         if(application[i].CDEnable)
         {
           if(application[i].Id) sendf(&application[i],_FACILITY_I,Id,0,"ws",3, SS_Ind);
-          application[i].CDEnable = FALSE;
+          application[i].CDEnable = false;
         }
       }
       break;
@@ -5375,7 +5375,7 @@ void sig_ind(PLCI   * plci)
         if(application[i].CDEnable)
         {
           if(application[i].Id) sendf(&application[i],_FACILITY_I,Id,0,"ws",3, SS_Ind);
-          application[i].CDEnable = FALSE;
+          application[i].CDEnable = false;
         }
       }
       break;
@@ -5730,7 +5730,7 @@ void sig_ind(PLCI   * plci)
                         plci,
                         Id,
                         parms,
-                        SendMultiIE(plci,Id,multi_pi_parms, PI, 0x210, TRUE));
+                        SendMultiIE(plci,Id,multi_pi_parms, PI, 0x210, true));
         }
       }
       clear_c_ind_mask_bit (plci, MAX_APPL);
@@ -6117,38 +6117,38 @@ static void SendSetupInfo(APPL   * appl, PLCI   * plci, dword Id, byte   * * par
         dbug(1,dprintf("CPN "));
         Info_Number = 0x0070;
         Info_Mask   = 0x80;
-        Info_Sent_Flag = TRUE;
+        Info_Sent_Flag = true;
         break;
       case 8:  /* display      */
         dbug(1,dprintf("display(%d)",i));
         Info_Number = 0x0028;
         Info_Mask = 0x04;
-        Info_Sent_Flag = TRUE;
+        Info_Sent_Flag = true;
         break;
       case 16: /* Channel Id */
         dbug(1,dprintf("CHI"));
         Info_Number = 0x0018;
         Info_Mask = 0x100;
-        Info_Sent_Flag = TRUE;
+        Info_Sent_Flag = true;
         mixer_set_bchannel_id (plci, Info_Element);
         break;
       case 19: /* Redirected Number */
         dbug(1,dprintf("RDN"));
         Info_Number = 0x0074;
         Info_Mask = 0x400;
-        Info_Sent_Flag = TRUE;
+        Info_Sent_Flag = true;
         break;
       case 20: /* Redirected Number extended */
         dbug(1,dprintf("RDX"));
         Info_Number = 0x0073;
         Info_Mask = 0x400;
-        Info_Sent_Flag = TRUE;
+        Info_Sent_Flag = true;
         break;
       case 22: /* Redirecing Number  */
         dbug(1,dprintf("RIN"));
         Info_Number = 0x0076;
         Info_Mask = 0x400;
-        Info_Sent_Flag = TRUE;
+        Info_Sent_Flag = true;
         break;
       default:
         Info_Number = 0;
@@ -6312,7 +6312,7 @@ void SendInfo(PLCI   * plci, dword Id, byte   * * parms, byte iesent)
         && plci->adapter->Info_Mask[appl->Id-1] &Info_Mask)
         {
           dbug(1,dprintf("NCR_Ind"));
-          iesent=TRUE;
+          iesent=true;
           sendf(&application[j],_INFO_I,Id&0x0f,0,"wS",Info_Number,Info_Element);
         }
       }
@@ -6330,7 +6330,7 @@ void SendInfo(PLCI   * plci, dword Id, byte   * * parms, byte iesent)
           if(test_c_ind_mask_bit (plci, j))
           {
             dbug(1,dprintf("Ovl_Ind"));
-            iesent=TRUE;
+            iesent=true;
             sendf(&application[j],_INFO_I,Id,0,"wS",Info_Number,Info_Element);
           }
         }
@@ -6340,7 +6340,7 @@ void SendInfo(PLCI   * plci, dword Id, byte   * * parms, byte iesent)
     && plci->adapter->Info_Mask[plci->appl->Id-1] &Info_Mask)
     {
       dbug(1,dprintf("Std_Ind"));
-      iesent=TRUE;
+      iesent=true;
       sendf(plci->appl,_INFO_I,Id,0,"wS",Info_Number,Info_Element);
     }
   }
@@ -6391,7 +6391,7 @@ byte SendMultiIE(PLCI   * plci, dword Id, byte   * * parms, byte ie_type, dword
         && appl->Id
         && plci->adapter->Info_Mask[appl->Id-1] &Info_Mask)
         {
-          iesent = TRUE;
+          iesent = true;
           dbug(1,dprintf("Mlt_NCR_Ind"));
           sendf(&application[j],_INFO_I,Id&0x0f,0,"wS",Info_Number,Info_Element);
         }
@@ -6403,7 +6403,7 @@ byte SendMultiIE(PLCI   * plci, dword Id, byte   * * parms, byte ie_type, dword
       {
         if(test_c_ind_mask_bit (plci, j))
         {
-          iesent = TRUE;
+          iesent = true;
           dbug(1,dprintf("Mlt_Ovl_Ind"));
           sendf(&application[j],_INFO_I,Id,0,"wS",Info_Number,Info_Element);
         }
@@ -6412,7 +6412,7 @@ byte SendMultiIE(PLCI   * plci, dword Id, byte   * * parms, byte ie_type, dword
     else if(Info_Number
     && plci->adapter->Info_Mask[plci->appl->Id-1] &Info_Mask)
     {
-      iesent = TRUE;
+      iesent = true;
       dbug(1,dprintf("Mlt_Std_Ind"));
       sendf(plci->appl,_INFO_I,Id,0,"wS",Info_Number,Info_Element);
     }
@@ -6812,7 +6812,7 @@ void nl_ind(PLCI   * plci)
         }
         if (((plci->NL.Ind & 0x0f) == N_DISC) || ((plci->NL.Ind & 0x0f) == N_DISC_ACK))
         {
-          if (((T30_INFO   *)plci->NL.RBuffer->P)->code < sizeof(fax_info) / sizeof(fax_info[0]))
+         if (((T30_INFO   *)plci->NL.RBuffer->P)->code < ARRAY_SIZE(fax_info))
             info = fax_info[((T30_INFO   *)plci->NL.RBuffer->P)->code];
           else
             info = _FAX_PROTOCOL_ERROR;
@@ -6887,7 +6887,7 @@ void nl_ind(PLCI   * plci)
           (byte)(plci->ncpi_buffer[0] + 1), plci->ncpi_buffer);
         plci->ncpi_state |= NCPI_NEGOTIATE_B3_SENT;
  if (plci->nsf_control_bits & T30_NSF_CONTROL_BIT_NEGOTIATE_RESP)
-   fax_send_edata_ack = FALSE;
+   fax_send_edata_ack = false;
       }
 
       if (a->manufacturer_features & MANUFACTURER_FEATURE_FAX_PAPER_FORMATS)
@@ -6928,7 +6928,7 @@ void nl_ind(PLCI   * plci)
             sendf(plci->appl,_DISCONNECT_B3_I,Id,0,"wS",GOOD,plci->ncpi_buffer);
             a->ncci_state[ncci] = INC_DIS_PENDING;
             plci->ncpi_state = 0;
-     fax_send_edata_ack = FALSE;
+     fax_send_edata_ack = false;
           }
           break;
         }
@@ -7025,7 +7025,7 @@ void nl_ind(PLCI   * plci)
     }
     if (plci->adjust_b_restore)
     {
-      plci->adjust_b_restore = FALSE;
+      plci->adjust_b_restore = false;
       start_internal_command (Id, plci, adjust_b_restore);
     }
     break;
@@ -7041,7 +7041,7 @@ void nl_ind(PLCI   * plci)
         next_internal_command (Id, plci);
     }
     ncci_state = a->ncci_state[ncci];
-    ncci_remove (plci, ncci, FALSE);
+    ncci_remove (plci, ncci, false);
 
         /* with N_DISC or N_DISC_ACK the IDI frees the respective   */
         /* channel, so we cannot store the state in ncci_state! The */
@@ -7288,18 +7288,18 @@ word get_plci(DIVA_CAPI_ADAPTER   * a)
   plci->msg_in_read_pos = MSG_IN_QUEUE_SIZE;
   plci->msg_in_wrap_pos = MSG_IN_QUEUE_SIZE;
 
-  plci->data_sent = FALSE;
+  plci->data_sent = false;
   plci->send_disc = 0;
   plci->sig_global_req = 0;
   plci->sig_remove_id = 0;
   plci->nl_global_req = 0;
   plci->nl_remove_id = 0;
   plci->adv_nl = 0;
-  plci->manufacturer = FALSE;
+  plci->manufacturer = false;
   plci->call_dir = CALL_DIR_OUT | CALL_DIR_ORIGINATE;
   plci->spoofed_msg = 0;
   plci->ptyState = 0;
-  plci->cr_enquiry = FALSE;
+  plci->cr_enquiry = false;
   plci->hangup_flow_ctrl_timer = 0;
 
   plci->ncci_ring_list = 0;
@@ -7972,7 +7972,7 @@ word add_b23(PLCI   * plci, API_PARSE * bp)
 
   if(!bp->length && plci->tel)
   {
-    plci->adv_nl = TRUE;
+    plci->adv_nl = true;
     dbug(1,dprintf("Default adv.Nl"));
     add_p(plci,LLI,lli);
     plci->B2_prot = 1 /*XPARENT*/;
@@ -8022,7 +8022,7 @@ word add_b23(PLCI   * plci, API_PARSE * bp)
   {  
     if(GET_WORD(bp_parms[1].info)!=1
     || GET_WORD(bp_parms[2].info)!=0) return _B2_NOT_SUPPORTED;
-    plci->adv_nl = TRUE;
+    plci->adv_nl = true;
   }
   else if(plci->tel) return _B2_NOT_SUPPORTED;
 
@@ -8840,7 +8840,7 @@ void send_data(PLCI   * plci)
             plci->NL.X = plci->NData;
             plci->NL.ReqCh = a->ncci_ch[ncci];
             dbug(1,dprintf("%x:DREQ(%x:%x)",a->Id,plci->NL.Id,plci->NL.Req));
-            plci->data_sent = TRUE;
+            plci->data_sent = true;
             plci->data_sent_ptr = data->P;
             a->request(&plci->NL);
           }
@@ -8995,10 +8995,10 @@ void IndParse(PLCI   * plci, word * parms_id, byte   ** parms, byte multiIEsize)
 byte ie_compare(byte   * ie1, byte * ie2)
 {
   word i;
-  if(!ie1 || ! ie2) return FALSE;
-  if(!ie1[0]) return FALSE;
-  for(i=0;i<(word)(ie1[0]+1);i++) if(ie1[i]!=ie2[i]) return FALSE;
-  return TRUE;
+  if(!ie1 || ! ie2) return false;
+  if(!ie1[0]) return false;
+  for(i=0;i<(word)(ie1[0]+1);i++) if(ie1[i]!=ie2[i]) return false;
+  return true;
 }
 
 word find_cip(DIVA_CAPI_ADAPTER   * a, byte   * bc, byte   * hlc)
@@ -9151,7 +9151,7 @@ word AdvCodecSupport(DIVA_CAPI_ADAPTER   *a, PLCI   *plci, APPL   *appl, byte ho
         plci->tel=ADV_VOICE;
       }
       a->AdvSignalAppl = appl;
-      a->AdvCodecFLAG = TRUE;
+      a->AdvCodecFLAG = true;
       a->AdvCodecPLCI = splci;
       add_p(splci,CAI,"\x01\x15");
       add_p(splci,LLI,"\x01\x00");
@@ -9183,7 +9183,7 @@ word AdvCodecSupport(DIVA_CAPI_ADAPTER   *a, PLCI   *plci, APPL   *appl, byte ho
         add_p(splci,UID,"\x06\x43\x61\x70\x69\x32\x30");
         sig_req(splci,ASSIGN,0xC0);  /* 0xc0 is the TEL_ID */
         send_req(splci);
-        a->scom_appl_disable = TRUE;
+        a->scom_appl_disable = true;
       }
       else{
         return 0x2001; /* wrong state, no more plcis */
@@ -9411,7 +9411,7 @@ word CapiRelease(word Id)
       }
       if(a->AdvSignalAppl==this)
       {
-        this->NullCREnable = FALSE;
+        this->NullCREnable = false;
         if (a->AdvCodecPLCI)
         {
           plci_remove(a->AdvCodecPLCI);
@@ -9433,7 +9433,7 @@ word CapiRelease(word Id)
 
 static word plci_remove_check(PLCI   *plci)
 {
-  if(!plci) return TRUE;
+  if(!plci) return true;
   if(!plci->NL.Id && c_ind_mask_empty (plci))
   {
     if(plci->Sig.Id == 0xff)
@@ -9446,7 +9446,7 @@ static word plci_remove_check(PLCI   *plci)
       {
         CodecIdCheck(plci->adapter, plci);
         clear_b1_config (plci);
-        ncci_remove (plci, 0, FALSE);
+        ncci_remove (plci, 0, false);
         plci_free_msg_in_queue (plci);
         channel_flow_control_remove (plci);
         plci->Id = 0;
@@ -9456,10 +9456,10 @@ static word plci_remove_check(PLCI   *plci)
         plci->notifiedcall = 0;
       }
       listen_check(plci->adapter);
-      return TRUE;
+      return true;
     }
   }
-  return FALSE;
+  return false;
 }
 
 
@@ -9564,7 +9564,7 @@ static struct
 
 };
 
-#define DTMF_DIGIT_MAP_ENTRIES (sizeof(dtmf_digit_map) / sizeof(dtmf_digit_map[0]))
+#define DTMF_DIGIT_MAP_ENTRIES ARRAY_SIZE(dtmf_digit_map)
 
 
 static void dtmf_enable_receiver (PLCI   *plci, byte enable_mask)
@@ -9815,7 +9815,7 @@ static void dtmf_command (dword Id, PLCI   *plci, byte Rc)
         }
         plci->dtmf_rec_active &= ~mask;
         plci->internal_command = DTMF_COMMAND_2;
-        dtmf_enable_receiver (plci, FALSE);
+        dtmf_enable_receiver (plci, false);
         return;
       }
       Rc = OK;
@@ -10020,7 +10020,7 @@ static byte dtmf_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI
           }
         }
         start_internal_command (Id, plci, dtmf_command);
-        return (FALSE);
+        return (false);
 
 
       case DTMF_SEND_TONE:
@@ -10069,8 +10069,7 @@ static byte dtmf_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI
           PUT_WORD (&result[1], DTMF_INCORRECT_DIGIT);
           break;
         }
-        if (plci->dtmf_send_requests >=
-          sizeof(plci->dtmf_msg_number_queue) / sizeof(plci->dtmf_msg_number_queue[0]))
+        if (plci->dtmf_send_requests >= ARRAY_SIZE(plci->dtmf_msg_number_queue))
         {
           dbug (1, dprintf ("[%06lx] %s,%d: DTMF request overrun",
             UnMapId (Id), (char   *)(FILE_), __LINE__));
@@ -10079,7 +10078,7 @@ static byte dtmf_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI
         }
         api_save_msg (dtmf_parms, "wwws", &plci->saved_msg);
         start_internal_command (Id, plci, dtmf_command);
-        return (FALSE);
+        return (false);
 
       default:
         dbug (1, dprintf ("[%06lx] %s,%d: DTMF unknown request %04x",
@@ -10090,7 +10089,7 @@ static byte dtmf_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI
   }
   sendf (appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
     "wws", Info, SELECTOR_DTMF, result);
-  return (FALSE);
+  return (false);
 }
 
 
@@ -10842,10 +10841,10 @@ static struct
   byte to_pc;
 } xconnect_write_prog[] =
 {
-  { LI_COEF_CH_CH, FALSE, FALSE },
-  { LI_COEF_CH_PC, FALSE, TRUE },
-  { LI_COEF_PC_CH, TRUE, FALSE },
-  { LI_COEF_PC_PC, TRUE, TRUE }
+  { LI_COEF_CH_CH, false, false },
+  { LI_COEF_CH_PC, false, true },
+  { LI_COEF_PC_CH, true, false },
+  { LI_COEF_PC_PC, true, true }
 };
 
 
@@ -10916,7 +10915,7 @@ static byte xconnect_write_coefs_process (dword Id, PLCI   *plci, byte Rc)
   {
     dbug (1, dprintf ("[%06x] %s,%d: Channel id wiped out",
       UnMapId (Id), (char   *)(FILE_), __LINE__));
-    return (TRUE);
+    return (true);
   }
   i = a->li_base + (plci->li_bchannel_id - 1);
   j = plci->li_write_channel;
@@ -10927,7 +10926,7 @@ static byte xconnect_write_coefs_process (dword Id, PLCI   *plci, byte Rc)
     {
       dbug (1, dprintf ("[%06lx] %s,%d: LI write coefs failed %02x",
         UnMapId (Id), (char   *)(FILE_), __LINE__, Rc));
-      return (FALSE);
+      return (false);
     }
   }
   if (li_config_table[i].adapter->manufacturer_features & MANUFACTURER_FEATURE_XCONNECT)
@@ -10969,7 +10968,7 @@ static byte xconnect_write_coefs_process (dword Id, PLCI   *plci, byte Rc)
     {
       plci->internal_command = plci->li_write_command;
       if (plci_nl_busy (plci))
-        return (TRUE);
+        return (true);
       to_ch = (a->li_pri) ? plci->li_bchannel_id - 1 : 0;
       *(p++) = UDATA_REQUEST_XCONNECT_TO;
       do
@@ -11018,9 +11017,9 @@ static byte xconnect_write_coefs_process (dword Id, PLCI   *plci, byte Rc)
             li_config_table[i].coef_table[j] ^= xconnect_write_prog[n].mask << 4;
           }
           n++;
-        } while ((n < sizeof(xconnect_write_prog) / sizeof(xconnect_write_prog[0]))
+        } while ((n < ARRAY_SIZE(xconnect_write_prog))
           && ((p - plci->internal_req_buffer) + 16 < INTERNAL_REQ_BUFFER_SIZE));
-        if (n == sizeof(xconnect_write_prog) / sizeof(xconnect_write_prog[0]))
+        if (n == ARRAY_SIZE(xconnect_write_prog))
         {
           do
           {
@@ -11050,7 +11049,7 @@ static byte xconnect_write_coefs_process (dword Id, PLCI   *plci, byte Rc)
     {
       plci->internal_command = plci->li_write_command;
       if (plci_nl_busy (plci))
-        return (TRUE);
+        return (true);
       if (a->li_pri)
       {
         *(p++) = UDATA_REQUEST_SET_MIXER_COEFS_PRI_SYNC;
@@ -11090,7 +11089,7 @@ static byte xconnect_write_coefs_process (dword Id, PLCI   *plci, byte Rc)
             ch_map[j+1] = (byte)(j+1);
           }
         }
-        for (n = 0; n < sizeof(mixer_write_prog_bri) / sizeof(mixer_write_prog_bri[0]); n++)
+        for (n = 0; n < ARRAY_SIZE(mixer_write_prog_bri); n++)
         {
           i = a->li_base + ch_map[mixer_write_prog_bri[n].to_ch];
           j = a->li_base + ch_map[mixer_write_prog_bri[n].from_ch];
@@ -11127,7 +11126,7 @@ static byte xconnect_write_coefs_process (dword Id, PLCI   *plci, byte Rc)
     {
       plci->internal_command = plci->li_write_command;
       if (plci_nl_busy (plci))
-        return (TRUE);
+        return (true);
       if (j < a->li_base)
         j = a->li_base;
       if (a->li_pri)
@@ -11140,7 +11139,7 @@ static byte xconnect_write_coefs_process (dword Id, PLCI   *plci, byte Rc)
           w |= MIXER_FEATURE_ENABLE_RX_DATA;
         *(p++) = (byte) w;
         *(p++) = (byte)(w >> 8);
-        for (n = 0; n < sizeof(mixer_write_prog_pri) / sizeof(mixer_write_prog_pri[0]); n++)
+        for (n = 0; n < ARRAY_SIZE(mixer_write_prog_pri); n++)
         {
           *(p++) = (byte)((plci->li_bchannel_id - 1) | mixer_write_prog_pri[n].line_flags);
           for (j = a->li_base; j < a->li_base + MIXER_CHANNELS_PRI; j++)
@@ -11196,7 +11195,7 @@ static byte xconnect_write_coefs_process (dword Id, PLCI   *plci, byte Rc)
             ch_map[j+1] = (byte)(j+1);
           }
         }
-        for (n = 0; n < sizeof(mixer_write_prog_bri) / sizeof(mixer_write_prog_bri[0]); n++)
+        for (n = 0; n < ARRAY_SIZE(mixer_write_prog_bri); n++)
         {
           i = a->li_base + ch_map[mixer_write_prog_bri[n].to_ch];
           j = a->li_base + ch_map[mixer_write_prog_bri[n].from_ch];
@@ -11232,7 +11231,7 @@ static byte xconnect_write_coefs_process (dword Id, PLCI   *plci, byte Rc)
     plci->NL.Req = plci->nl_req = (byte) N_UDATA;
     plci->adapter->request (&plci->NL);
   }
-  return (TRUE);
+  return (true);
 }
 
 
@@ -11251,7 +11250,7 @@ static void mixer_notify_update (PLCI   *plci, byte others)
   if (a->profile.Global_Options & GL_LINE_INTERCONNECT_SUPPORTED)
   {
     if (others)
-      plci->li_notify_update = TRUE;
+      plci->li_notify_update = true;
     i = 0;
     do
     {
@@ -11277,7 +11276,7 @@ static void mixer_notify_update (PLCI   *plci, byte others)
        && (notify_plci->State)
        && notify_plci->NL.Id && !notify_plci->nl_remove_id)
       {
-        notify_plci->li_notify_update = TRUE;
+        notify_plci->li_notify_update = true;
         ((CAPI_MSG *) msg)->header.length = 18;
         ((CAPI_MSG *) msg)->header.appl_id = notify_plci->appl->Id;
         ((CAPI_MSG *) msg)->header.command = _FACILITY_R;
@@ -11299,12 +11298,12 @@ static void mixer_notify_update (PLCI   *plci, byte others)
               (char   *)(FILE_), __LINE__,
               (dword)((notify_plci->Id << 8) | UnMapController (notify_plci->adapter->Id)), w));
           }
-          notify_plci->li_notify_update = FALSE;
+          notify_plci->li_notify_update = false;
         }
       }
     } while (others && (notify_plci != NULL));
     if (others)
-      plci->li_notify_update = FALSE;
+      plci->li_notify_update = false;
   }
 }
 
@@ -11318,7 +11317,7 @@ static void mixer_clear_config (PLCI   *plci)
     (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
     (char   *)(FILE_), __LINE__));
 
-  plci->li_notify_update = FALSE;
+  plci->li_notify_update = false;
   plci->li_plci_b_write_pos = 0;
   plci->li_plci_b_read_pos = 0;
   plci->li_plci_b_req_pos = 0;
@@ -12159,7 +12158,7 @@ static byte mixer_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI
         plci_b = li_check_plci_b (Id, plci, plci_b_id, plci_b_write_pos, &result[8]);
         if (plci_b == NULL)
           break;
-        li_update_connect (Id, a, plci, plci_b_id, TRUE, li_flags);
+        li_update_connect (Id, a, plci, plci_b_id, true, li_flags);
         plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_LAST_FLAG;
         plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES-1) ? 0 : plci_b_write_pos + 1;
         plci->li_plci_b_write_pos = plci_b_write_pos;
@@ -12188,7 +12187,7 @@ static byte mixer_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI
         plci_b_write_pos = plci->li_plci_b_write_pos;
         participant_parms_pos = 0;
         result_pos = 7;
-        li2_update_connect (Id, a, plci, UnMapId (Id), TRUE, li_flags);
+        li2_update_connect (Id, a, plci, UnMapId (Id), true, li_flags);
         while (participant_parms_pos < li_req_parms[1].length)
         {
           result[result_pos] = 6;
@@ -12224,7 +12223,7 @@ static byte mixer_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI
           plci_b = li2_check_plci_b (Id, plci, plci_b_id, plci_b_write_pos, &result[result_pos - 2]);
           if (plci_b != NULL)
           {
-            li2_update_connect (Id, a, plci, plci_b_id, TRUE, li_flags);
+            li2_update_connect (Id, a, plci, plci_b_id, true, li_flags);
             plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id |
               ((li_flags & (LI2_FLAG_INTERCONNECT_A_B | LI2_FLAG_INTERCONNECT_B_A |
               LI2_FLAG_PCCONNECT_A_B | LI2_FLAG_PCCONNECT_B_A)) ? 0 : LI_PLCI_B_DISC_FLAG);
@@ -12249,13 +12248,13 @@ static byte mixer_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI
       }
       mixer_calculate_coefs (a);
       plci->li_channel_bits = li_config_table[a->li_base + (plci->li_bchannel_id - 1)].channel;
-      mixer_notify_update (plci, TRUE);
+      mixer_notify_update (plci, true);
       sendf (appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
         "wwS", Info, SELECTOR_LINE_INTERCONNECT, result);
       plci->command = 0;
       plci->li_cmd = GET_WORD (li_parms[0].info);
       start_internal_command (Id, plci, mixer_command);
-      return (FALSE);
+      return (false);
 
     case LI_REQ_DISCONNECT:
       if (li_parms[1].length == 4)
@@ -12283,7 +12282,7 @@ static byte mixer_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI
         plci_b = li_check_plci_b (Id, plci, plci_b_id, plci_b_write_pos, &result[8]);
         if (plci_b == NULL)
           break;
-        li_update_connect (Id, a, plci, plci_b_id, FALSE, 0);
+        li_update_connect (Id, a, plci, plci_b_id, false, 0);
         plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG | LI_PLCI_B_LAST_FLAG;
         plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES-1) ? 0 : plci_b_write_pos + 1;
         plci->li_plci_b_write_pos = plci_b_write_pos;
@@ -12345,7 +12344,7 @@ static byte mixer_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI
           plci_b = li2_check_plci_b (Id, plci, plci_b_id, plci_b_write_pos, &result[result_pos - 2]);
           if (plci_b != NULL)
           {
-            li2_update_connect (Id, a, plci, plci_b_id, FALSE, 0);
+            li2_update_connect (Id, a, plci, plci_b_id, false, 0);
             plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG;
             plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES-1) ? 0 : plci_b_write_pos + 1;
           }
@@ -12368,13 +12367,13 @@ static byte mixer_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI
       }
       mixer_calculate_coefs (a);
       plci->li_channel_bits = li_config_table[a->li_base + (plci->li_bchannel_id - 1)].channel;
-      mixer_notify_update (plci, TRUE);
+      mixer_notify_update (plci, true);
       sendf (appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
         "wwS", Info, SELECTOR_LINE_INTERCONNECT, result);
       plci->command = 0;
       plci->li_cmd = GET_WORD (li_parms[0].info);
       start_internal_command (Id, plci, mixer_command);
-      return (FALSE);
+      return (false);
 
     case LI_REQ_SILENT_UPDATE:
       if (!plci || !plci->State
@@ -12384,7 +12383,7 @@ static byte mixer_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI
       {
         dbug (1, dprintf ("[%06lx] %s,%d: Wrong state",
           UnMapId (Id), (char   *)(FILE_), __LINE__));
-        return (FALSE);
+        return (false);
       }
       plci_b_write_pos = plci->li_plci_b_write_pos;
       if (((plci->li_plci_b_read_pos > plci_b_write_pos) ? plci->li_plci_b_read_pos :
@@ -12392,7 +12391,7 @@ static byte mixer_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI
       {
         dbug (1, dprintf ("[%06lx] %s,%d: LI request overrun",
           UnMapId (Id), (char   *)(FILE_), __LINE__));
-        return (FALSE);
+        return (false);
       }
       i = (plci_b_write_pos == 0) ? LI_PLCI_B_QUEUE_ENTRIES-1 : plci_b_write_pos - 1;
       if ((plci_b_write_pos == plci->li_plci_b_read_pos)
@@ -12408,7 +12407,7 @@ static byte mixer_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI
       plci->command = 0;
       plci->li_cmd = GET_WORD (li_parms[0].info);
       start_internal_command (Id, plci, mixer_command);
-      return (FALSE);
+      return (false);
 
     default:
       dbug (1, dprintf ("[%06lx] %s,%d: LI unknown request %04x",
@@ -12418,7 +12417,7 @@ static byte mixer_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI
   }
   sendf (appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
     "wwS", Info, SELECTOR_LINE_INTERCONNECT, result);
-  return (FALSE);
+  return (false);
 }
 
 
@@ -12523,7 +12522,7 @@ static void mixer_indication_xconnect_from (dword Id, PLCI   *plci, byte   *msg,
     if (!plci->internal_command)
       next_internal_command (Id, plci);
   }
-  mixer_notify_update (plci, TRUE);
+  mixer_notify_update (plci, true);
 }
 
 
@@ -12547,12 +12546,12 @@ static byte mixer_notify_source_removed (PLCI   *plci, dword plci_b_id)
     dbug (1, dprintf ("[%06lx] %s,%d: LI request overrun",
       (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
       (char   *)(FILE_), __LINE__));
-    return (FALSE);
+    return (false);
   }
   plci->li_plci_b_queue[plci_b_write_pos] = plci_b_id | LI_PLCI_B_DISC_FLAG;
   plci_b_write_pos = (plci_b_write_pos == LI_PLCI_B_QUEUE_ENTRIES-1) ? 0 : plci_b_write_pos + 1;
   plci->li_plci_b_write_pos = plci_b_write_pos;
-  return (TRUE);
+  return (true);
 }
 
 
@@ -12596,7 +12595,7 @@ static void mixer_remove (PLCI   *plci)
         }
         mixer_clear_config (plci);
         mixer_calculate_coefs (a);
-        mixer_notify_update (plci, TRUE);
+        mixer_notify_update (plci, true);
       }
       li_config_table[i].plci = NULL;
       plci->li_bchannel_id = 0;
@@ -12883,29 +12882,29 @@ static byte ec_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI   *p
           case EC_ENABLE_OPERATION:
             plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
             start_internal_command (Id, plci, ec_command);
-            return (FALSE);
+            return (false);
 
           case EC_DISABLE_OPERATION:
             plci->ec_idi_options = LEC_ENABLE_ECHO_CANCELLER |
               LEC_MANUAL_DISABLE | LEC_ENABLE_NONLINEAR_PROCESSING |
               LEC_RESET_COEFFICIENTS;
             start_internal_command (Id, plci, ec_command);
-            return (FALSE);
+            return (false);
 
           case EC_FREEZE_COEFFICIENTS:
             plci->ec_idi_options |= LEC_FREEZE_COEFFICIENTS;
             start_internal_command (Id, plci, ec_command);
-            return (FALSE);
+            return (false);
 
           case EC_RESUME_COEFFICIENT_UPDATE:
             plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
             start_internal_command (Id, plci, ec_command);
-            return (FALSE);
+            return (false);
 
           case EC_RESET_COEFFICIENTS:
             plci->ec_idi_options |= LEC_RESET_COEFFICIENTS;
             start_internal_command (Id, plci, ec_command);
-            return (FALSE);
+            return (false);
 
           default:
             dbug (1, dprintf ("[%06lx] %s,%d: EC unknown request %04x",
@@ -12978,14 +12977,14 @@ static byte ec_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI   *p
           case EC_ENABLE_OPERATION:
             plci->ec_idi_options &= ~LEC_FREEZE_COEFFICIENTS;
             start_internal_command (Id, plci, ec_command);
-            return (FALSE);
+            return (false);
 
           case EC_DISABLE_OPERATION:
             plci->ec_idi_options = LEC_ENABLE_ECHO_CANCELLER |
               LEC_MANUAL_DISABLE | LEC_ENABLE_NONLINEAR_PROCESSING |
               LEC_RESET_COEFFICIENTS;
             start_internal_command (Id, plci, ec_command);
-            return (FALSE);
+            return (false);
 
           default:
             dbug (1, dprintf ("[%06lx] %s,%d: EC unknown request %04x",
@@ -12999,7 +12998,7 @@ static byte ec_request (dword Id, word Number, DIVA_CAPI_ADAPTER   *a, PLCI   *p
   sendf (appl, _FACILITY_R | CONFIRM, Id & 0xffffL, Number,
     "wws", Info, (appl->appl_flags & APPL_FLAG_PRIV_EC_SPEC) ?
     PRIV_SELECTOR_ECHO_CANCELLER : SELECTOR_ECHO_CANCELLER, result);
-  return (FALSE);
+  return (false);
 }
 
 
@@ -13178,7 +13177,7 @@ static void adv_voice_write_coefs (PLCI   *plci, word write_command)
         ch_map[j] = (byte)(j + (plci->li_bchannel_id - 1));
         ch_map[j+1] = (byte)(j + (2 - plci->li_bchannel_id));
       }
-      for (n = 0; n < sizeof(mixer_write_prog_bri) / sizeof(mixer_write_prog_bri[0]); n++)
+      for (n = 0; n < ARRAY_SIZE(mixer_write_prog_bri); n++)
       {
         i = a->li_base + ch_map[mixer_write_prog_bri[n].to_ch];
         j = a->li_base + ch_map[mixer_write_prog_bri[n].from_ch];
@@ -13563,7 +13562,7 @@ static void adjust_b_clear (PLCI   *plci)
     (dword)((plci->Id << 8) | UnMapController (plci->adapter->Id)),
     (char   *)(FILE_), __LINE__));
 
-  plci->adjust_b_restore = FALSE;
+  plci->adjust_b_restore = false;
 }
 
 
@@ -13832,7 +13831,7 @@ static word adjust_b_process (dword Id, PLCI   *plci, byte Rc)
     }
     if (plci->adjust_b_mode & ADJUST_B_MODE_USER_CONNECT)
     {
-      plci->adjust_b_restore = TRUE;
+      plci->adjust_b_restore = true;
       break;
     }
     plci->adjust_b_state = ADJUST_B_CONNECT_1;
@@ -14603,7 +14602,7 @@ static void channel_request_xon (PLCI   * plci, byte ch) {
 
 static void channel_xmit_extended_xon (PLCI   * plci) {
   DIVA_CAPI_ADAPTER   * a;
-  int max_ch = sizeof(a->ch_flow_control)/sizeof(a->ch_flow_control[0]);
+  int max_ch = ARRAY_SIZE(a->ch_flow_control);
   int i, one_requested = 0;
 
   if ((!plci) || (!plci->Id) || ((a = plci->adapter) == 0)) {
@@ -14628,7 +14627,7 @@ static void channel_xmit_extended_xon (PLCI   * plci) {
   Try to xmit next X_ON
   */
 static int find_channel_with_pending_x_on (DIVA_CAPI_ADAPTER   * a, PLCI   * plci) {
-  int max_ch = sizeof(a->ch_flow_control)/sizeof(a->ch_flow_control[0]);
+  int max_ch = ARRAY_SIZE(a->ch_flow_control);
   int i;
 
   if (!(plci->adapter->manufacturer_features & MANUFACTURER_FEATURE_XONOFF_FLOW_CONTROL)) {
@@ -14768,19 +14767,19 @@ static void group_optimization(DIVA_CAPI_ADAPTER   * a, PLCI   * plci)
   {
     if(application[i].Id && a->CIP_Mask[i] )
     {
-      for(k=0,busy=FALSE; k<a->max_plci; k++)
+      for(k=0,busy=false; k<a->max_plci; k++)
       {
         if(a->plci[k].Id) 
         {
           auxplci = &a->plci[k];
           if(auxplci->appl == &application[i]) /* application has a busy PLCI */
           {
-            busy = TRUE;
+            busy = true;
             dbug(1,dprintf("Appl 0x%x is busy",i+1));
           }
           else if(test_c_ind_mask_bit (auxplci, i)) /* application has an incoming call pending */
           {
-            busy = TRUE;
+            busy = true;
             dbug(1,dprintf("Appl 0x%x has inc. call pending",i+1));
           }
         }
@@ -14791,13 +14790,13 @@ static void group_optimization(DIVA_CAPI_ADAPTER   * a, PLCI   * plci)
         if(j==MAX_CIP_TYPES)       /* all groups are in use but group still not found */
         {                           /* the MAX_CIP_TYPES group enables all calls because of field overflow */
           appl_number_group_type[i] = MAX_CIP_TYPES;
-          group_found=TRUE;
+          group_found=true;
           dbug(1,dprintf("Field overflow appl 0x%x",i+1));
         }
         else if( (info_mask_group[j]==a->CIP_Mask[i]) && (cip_mask_group[j]==a->Info_Mask[i]) )  
         {                                      /* is group already present ?                  */
           appl_number_group_type[i] = j|0x80;  /* store the group number for each application */
-          group_found=TRUE;
+          group_found=true;
           dbug(1,dprintf("Group 0x%x found with appl 0x%x, CIP=0x%lx",appl_number_group_type[i],i+1,info_mask_group[j]));
         }
         else if(!info_mask_group[j])
@@ -14805,7 +14804,7 @@ static void group_optimization(DIVA_CAPI_ADAPTER   * a, PLCI   * plci)
           appl_number_group_type[i] = j|0x80;  /* store the group number for each application */
           info_mask_group[j] = a->CIP_Mask[i]; /* store the new CIP mask for the new group    */
           cip_mask_group[j] = a->Info_Mask[i]; /* store the new Info_Mask for this new group  */
-          group_found=TRUE;
+          group_found=true;
           dbug(1,dprintf("New Group 0x%x established with appl 0x%x, CIP=0x%lx",appl_number_group_type[i],i+1,info_mask_group[j]));
         }
       }
@@ -14860,7 +14859,7 @@ word CapiRegister(word id)
     }
   }
 
-  if(appls_found) return TRUE;
+  if(appls_found) return true;
   for(i=0; i<max_adapter; i++)                   /* scan all adapters...    */
   {
     a = &adapter[i];
@@ -14889,7 +14888,7 @@ word CapiRegister(word id)
       }
     }
   }
-  return FALSE;
+  return false;
 }
 
 /*------------------------------------------------------------------*/
index a296a846f296c840f794eea7f182cae5af6abc16..903356547b79c715a896253ecd0658e74f6b2c29 100644 (file)
@@ -487,7 +487,7 @@ diva_pri_start_adapter(PISDN_ADAPTER IoAdapter,
        }
        DIVA_OS_MEM_DETACH_ADDRESS(IoAdapter, boot);
 
-       IoAdapter->Initialized = TRUE;
+       IoAdapter->Initialized = true;
 
        /*
           Check Interrupt
@@ -504,7 +504,7 @@ diva_pri_start_adapter(PISDN_ADAPTER IoAdapter,
        if (!IoAdapter->IrqCount) {
                DBG_ERR(("A: A(%d) interrupt test failed",
                         IoAdapter->ANum))
-               IoAdapter->Initialized = FALSE;
+               IoAdapter->Initialized = false;
                IoAdapter->stop(IoAdapter);
                return (-1);
        }
index 2444811e0b3806058c0f3ac57e6cfc898db118e5..ff09f07f440a43017aa24f9ad304abf33968a27f 100644 (file)
 #define        qword  u64
 #endif
 
-#ifndef        TRUE
-#define        TRUE    1
-#endif
-
-#ifndef        FALSE
-#define        FALSE   0
-#endif
-
 #ifndef        NULL
 #define        NULL    ((void *) 0)
 #endif
 #define DIVA_OS_MEM_DETACH_CONFIG(a, x)        do { } while(0)
 #define DIVA_OS_MEM_DETACH_CONTROL(a, x)       do { } while(0)
 
-#if !defined(DIM)
-#define DIM(array)  (sizeof (array)/sizeof ((array)[0]))
-#endif
-
 #define DIVA_INVALID_FILE_HANDLE  ((dword)(-1))
 
 #define DIVAS_CONTAINING_RECORD(address, type, field) \
index 34ab5f7dcabc1daa4087893bde2c58c568687afa..12d91fb9f8cb9503d72bcb09adcd51ebe804fe11 100644 (file)
@@ -340,8 +340,6 @@ config HISAX_HFC_SX
          This enables HiSax support for the HFC-S+, HFC-SP and HFC-PCMCIA
          cards. This code is not finished yet.
 
-#      bool '  TESTEMULATOR (EXPERIMENTAL)' CONFIG_HISAX_TESTEMU
-
 config HISAX_ENTERNOW_PCI
        bool "Formula-n enter:now PCI card"
        depends on HISAX_NETJET && PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K || (MIPS && !CPU_LITTLE_ENDIAN) || FRV))
index 293e27789d54caf983ec2b6d0b53b80548e89e64..c7a3794bdae47c8d65ca003676d290a4524a1c04 100644 (file)
@@ -60,5 +60,4 @@ hisax-$(CONFIG_HISAX_SCT_QUADRO)      += bkm_a8.o isac.o arcofi.o hscx.o
 hisax-$(CONFIG_HISAX_GAZEL)            += gazel.o isac.o arcofi.o hscx.o
 hisax-$(CONFIG_HISAX_W6692)            += w6692.o
 hisax-$(CONFIG_HISAX_ENTERNOW_PCI)     += enternow_pci.o amd7930_fn.o
-#hisax-$(CONFIG_HISAX_TESTEMU)         += testemu.o
 
index 9e70c206779e4619a0af7c811a354d526480eb91..fc6cc2c065b807ac72c44992bb885a1d92e6ec0d 100644 (file)
@@ -14,7 +14,6 @@
 
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/ptrace.h>
 #include <linux/slab.h>
 #include <linux/string.h>
index 17ec0b70ba1d0a9a598770e63284202f797a30b0..da4196f21e0fcc555398e110baa07ffa96830e6a 100644 (file)
@@ -549,10 +549,6 @@ extern int setup_isurf(struct IsdnCard *card);
 extern int setup_saphir(struct IsdnCard *card);
 #endif
 
-#if CARD_TESTEMU
-extern int setup_testemu(struct IsdnCard *card);
-#endif
-
 #if CARD_BKM_A4T
 extern int setup_bkm_a4t(struct IsdnCard *card);
 #endif
@@ -1061,11 +1057,6 @@ static int checkcard(int cardnr, char *id, int *busy_flag, struct module *lockow
                ret = setup_saphir(card);
                break;
 #endif
-#if CARD_TESTEMU
-       case ISDN_CTYPE_TESTEMU:
-               ret = setup_testemu(card);
-               break;
-#endif
 #if    CARD_BKM_A4T
        case ISDN_CTYPE_BKM_A4T:
                ret = setup_bkm_a4t(card);
@@ -1881,7 +1872,7 @@ static struct pci_device_id hisax_pci_tbl[] __devinitdata = {
        {PCI_VENDOR_ID_PLX,      PCI_DEVICE_ID_PLX_DJINN_ITOO,   PCI_ANY_ID, PCI_ANY_ID},
        {PCI_VENDOR_ID_PLX,      PCI_DEVICE_ID_PLX_OLITEC,       PCI_ANY_ID, PCI_ANY_ID},
 #endif
-#ifdef CONFIG_HISAX_QUADRO
+#ifdef CONFIG_HISAX_SCT_QUADRO
        {PCI_VENDOR_ID_PLX,      PCI_DEVICE_ID_PLX_9050,         PCI_ANY_ID, PCI_ANY_ID},
 #endif
 #ifdef CONFIG_HISAX_NICCY
index 79ab9dda7d08984650dd6c980ed2d1ec12acdb08..db7e64424afe02fca1896c1b1edefdced2e2ac72 100644 (file)
@@ -38,7 +38,6 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/ptrace.h>
 #include <linux/slab.h>
 #include <linux/string.h>
index 0279fb323cb14412404f6ea7d6a59714b461961c..ae377e812775a4085f033a46a1ff70a6846d61c7 100644 (file)
@@ -58,7 +58,7 @@ static inline unsigned int serial_in(struct IsdnCardState *cs, int offset)
 static inline unsigned int serial_inp(struct IsdnCardState *cs, int offset)
 {
 #ifdef SERIAL_DEBUG_REG
-#ifdef CONFIG_SERIAL_NOPAUSE_IO
+#ifdef ELSA_SERIAL_NOPAUSE_IO
        u_int val = inb(cs->hw.elsa.base + 8 + offset);
        debugl1(cs,"inp  %s %02x",ModemIn[offset], val);
 #else
@@ -67,7 +67,7 @@ static inline unsigned int serial_inp(struct IsdnCardState *cs, int offset)
 #endif
        return(val);
 #else
-#ifdef CONFIG_SERIAL_NOPAUSE_IO
+#ifdef ELSA_SERIAL_NOPAUSE_IO
        return inb(cs->hw.elsa.base + 8 + offset);
 #else
        return inb_p(cs->hw.elsa.base + 8 + offset);
@@ -87,13 +87,13 @@ static inline void serial_outp(struct IsdnCardState *cs, int offset,
                               int value)
 {
 #ifdef SERIAL_DEBUG_REG
-#ifdef CONFIG_SERIAL_NOPAUSE_IO
+#ifdef ELSA_SERIAL_NOPAUSE_IO
        debugl1(cs,"outp %s %02x",ModemOut[offset], value);
 #else
        debugl1(cs,"outP %s %02x",ModemOut[offset], value);
 #endif
 #endif
-#ifdef CONFIG_SERIAL_NOPAUSE_IO
+#ifdef ELSA_SERIAL_NOPAUSE_IO
        outb(value, cs->hw.elsa.base + 8 + offset);
 #else
        outb_p(value, cs->hw.elsa.base + 8 + offset);
index a2fa4ecb8c883e20fad1f389c3e862022f000a66..ab98e135bcbb689eacb0679a50ca1557089f9d55 100644 (file)
@@ -199,7 +199,7 @@ typedef struct _hfc4s8s_hw {
 /***************************/
 /* inline function defines */
 /***************************/
-#ifdef CONFIG_HISAX_HFC4S8S_PCIMEM     /* inline functions mempry mapped */
+#ifdef HISAX_HFC4S8S_PCIMEM    /* inline functions memory mapped */
 
 /* memory write and dummy IO read to avoid PCI byte merge problems */
 #define Write_hfc8(a,b,c) {(*((volatile u_char *)(a->membase+b)) = c); inb(a->iobase+4);}
@@ -305,7 +305,7 @@ wait_busy(hfc4s8s_hw * a)
 
 #define PCI_ENA_REGIO  0x01
 
-#endif                         /* CONFIG_HISAX_HFC4S8S_PCIMEM */
+#endif                         /* HISAX_HFC4S8S_PCIMEM */
 
 /******************************************************/
 /* function to read critical counter registers that   */
@@ -724,12 +724,12 @@ rx_d_frame(struct hfc4s8s_l1 *l1p, int ech)
                        } else {
                                /* read errornous D frame */
 
-#ifndef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifndef HISAX_HFC4S8S_PCIMEM
                                SetRegAddr(l1p->hw, A_FIFO_DATA0);
 #endif
 
                                while (z1 >= 4) {
-#ifdef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifdef HISAX_HFC4S8S_PCIMEM
                                        Read_hfc32(l1p->hw, A_FIFO_DATA0);
 #else
                                        fRead_hfc32(l1p->hw);
@@ -738,7 +738,7 @@ rx_d_frame(struct hfc4s8s_l1 *l1p, int ech)
                                }
 
                                while (z1--)
-#ifdef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifdef HISAX_HFC4S8S_PCIMEM
                                        Read_hfc8(l1p->hw, A_FIFO_DATA0);
 #else
                                        fRead_hfc8(l1p->hw);
@@ -752,12 +752,12 @@ rx_d_frame(struct hfc4s8s_l1 *l1p, int ech)
 
                cp = skb->data;
 
-#ifndef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifndef HISAX_HFC4S8S_PCIMEM
                SetRegAddr(l1p->hw, A_FIFO_DATA0);
 #endif
 
                while (z1 >= 4) {
-#ifdef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifdef HISAX_HFC4S8S_PCIMEM
                        *((unsigned long *) cp) =
                            Read_hfc32(l1p->hw, A_FIFO_DATA0);
 #else
@@ -768,7 +768,7 @@ rx_d_frame(struct hfc4s8s_l1 *l1p, int ech)
                }
 
                while (z1--)
-#ifdef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifdef HISAX_HFC4S8S_PCIMEM
                        *cp++ = Read_hfc8(l1p->hw, A_FIFO_DATA0);
 #else
                        *cp++ = fRead_hfc8(l1p->hw);
@@ -858,12 +858,12 @@ rx_b_frame(struct hfc4s8s_btype *bch)
                        wait_busy(l1->hw);
                        return;
                }
-#ifndef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifndef HISAX_HFC4S8S_PCIMEM
                SetRegAddr(l1->hw, A_FIFO_DATA0);
 #endif
 
                while (z1 >= 4) {
-#ifdef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifdef HISAX_HFC4S8S_PCIMEM
                        *((unsigned long *) bch->rx_ptr) =
                            Read_hfc32(l1->hw, A_FIFO_DATA0);
 #else
@@ -875,7 +875,7 @@ rx_b_frame(struct hfc4s8s_btype *bch)
                }
 
                while (z1--)
-#ifdef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifdef HISAX_HFC4S8S_PCIMEM
                        *(bch->rx_ptr++) = Read_hfc8(l1->hw, A_FIFO_DATA0);
 #else
                        *(bch->rx_ptr++) = fRead_hfc8(l1->hw);
@@ -939,12 +939,12 @@ tx_d_frame(struct hfc4s8s_l1 *l1p)
        if ((skb = skb_dequeue(&l1p->d_tx_queue))) {
                cp = skb->data;
                cnt = skb->len;
-#ifndef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifndef HISAX_HFC4S8S_PCIMEM
                SetRegAddr(l1p->hw, A_FIFO_DATA0);
 #endif
 
                while (cnt >= 4) {
-#ifdef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifdef HISAX_HFC4S8S_PCIMEM
                        fWrite_hfc32(l1p->hw, A_FIFO_DATA0,
                                     *(unsigned long *) cp);
 #else
@@ -955,7 +955,7 @@ tx_d_frame(struct hfc4s8s_l1 *l1p)
                        cnt -= 4;
                }
 
-#ifdef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifdef HISAX_HFC4S8S_PCIMEM
                while (cnt--)
                        fWrite_hfc8(l1p->hw, A_FIFO_DATA0, *cp++);
 #else
@@ -1036,11 +1036,11 @@ tx_b_frame(struct hfc4s8s_btype *bch)
                cp = skb->data + bch->tx_cnt;
                bch->tx_cnt += cnt;
 
-#ifndef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifndef HISAX_HFC4S8S_PCIMEM
                SetRegAddr(l1->hw, A_FIFO_DATA0);
 #endif
                while (cnt >= 4) {
-#ifdef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifdef HISAX_HFC4S8S_PCIMEM
                        fWrite_hfc32(l1->hw, A_FIFO_DATA0,
                                     *(unsigned long *) cp);
 #else
@@ -1051,7 +1051,7 @@ tx_b_frame(struct hfc4s8s_btype *bch)
                }
 
                while (cnt--)
-#ifdef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifdef HISAX_HFC4S8S_PCIMEM
                        fWrite_hfc8(l1->hw, A_FIFO_DATA0, *cp++);
 #else
                        fWrite_hfc8(l1->hw, *cp++);
@@ -1280,7 +1280,7 @@ hfc4s8s_interrupt(int intno, void *dev_id)
        if (!hw || !(hw->mr.r_irq_ctrl & M_GLOB_IRQ_EN))
                return IRQ_NONE;
 
-#ifndef        CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifndef        HISAX_HFC4S8S_PCIMEM
        /* read current selected regsister */
        old_ioreg = GetRegAddr(hw);
 #endif
@@ -1291,7 +1291,7 @@ hfc4s8s_interrupt(int intno, void *dev_id)
        if (!
            (b = (Read_hfc8(hw, R_STATUS) & (M_MISC_IRQSTA | M_FR_IRQSTA)))
 && !hw->mr.r_irq_statech) {
-#ifndef        CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifndef        HISAX_HFC4S8S_PCIMEM
                SetRegAddr(hw, old_ioreg);
 #endif
                return IRQ_NONE;
@@ -1321,7 +1321,7 @@ hfc4s8s_interrupt(int intno, void *dev_id)
        /* queue the request to allow other cards to interrupt */
        schedule_work(&hw->tqueue);
 
-#ifndef        CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifndef        HISAX_HFC4S8S_PCIMEM
        SetRegAddr(hw, old_ioreg);
 #endif
        return IRQ_HANDLED;
@@ -1470,7 +1470,7 @@ static void
 release_pci_ports(hfc4s8s_hw * hw)
 {
        pci_write_config_word(hw->pdev, PCI_COMMAND, 0);
-#ifdef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifdef HISAX_HFC4S8S_PCIMEM
        if (hw->membase)
                iounmap((void *) hw->membase);
 #else
@@ -1485,7 +1485,7 @@ release_pci_ports(hfc4s8s_hw * hw)
 static void
 enable_pci_ports(hfc4s8s_hw * hw)
 {
-#ifdef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifdef HISAX_HFC4S8S_PCIMEM
        pci_write_config_word(hw->pdev, PCI_COMMAND, PCI_ENA_MEMIO);
 #else
        pci_write_config_word(hw->pdev, PCI_COMMAND, PCI_ENA_REGIO);
@@ -1560,7 +1560,7 @@ setup_instance(hfc4s8s_hw * hw)
                       hw->irq);
                goto out;
        }
-#ifdef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifdef HISAX_HFC4S8S_PCIMEM
        printk(KERN_INFO
               "HFC-4S/8S: found PCI card at membase 0x%p, irq %d\n",
               hw->hw_membase, hw->irq);
@@ -1613,7 +1613,7 @@ hfc4s8s_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        hw->irq = pdev->irq;
        hw->iobase = pci_resource_start(pdev, 0);
 
-#ifdef CONFIG_HISAX_HFC4S8S_PCIMEM
+#ifdef HISAX_HFC4S8S_PCIMEM
        hw->hw_membase = (u_char *) pci_resource_start(pdev, 1);
        hw->membase = ioremap((ulong) hw->hw_membase, 256);
 #else
index 5a6989f23fcf6daa289f6a8ef9e834f6e8262620..9f44d3e69fb0e78ef86362031999f0911e15c337 100644 (file)
@@ -38,7 +38,6 @@
 #include <linux/usb.h>
 #include <linux/kernel.h>
 #include <linux/smp_lock.h>
-#include <linux/sched.h>
 #include "hisax.h"
 #include "hisax_if.h"
 #include "hfc_usb.h"
@@ -183,7 +182,7 @@ typedef struct hfcusb_data {
        int vend_idx;           /* vendor found */
        int b_mode[2];          /* B-channel mode */
        int l1_activated;       /* layer 1 activated */
-       int disc_flag;          /* TRUE if device was disonnected to avoid some USB actions */
+       int disc_flag;          /* 'true' if device was disonnected to avoid some USB actions */
        int packet_size, iso_packet_size;
 
        /* control pipe background handling */
@@ -392,7 +391,7 @@ l1_timer_expire_t3(hfcusb_data * hfc)
        DBG(ISDN_DBG,
            "HFC-S USB: PH_DEACTIVATE | INDICATION sent (T3 expire)");
 #endif
-       hfc->l1_activated = FALSE;
+       hfc->l1_activated = false;
        handle_led(hfc, LED_S0_OFF);
        /* deactivate : */
        queue_control_request(hfc, HFCUSB_STATES, 0x10, 1);
@@ -411,7 +410,7 @@ l1_timer_expire_t4(hfcusb_data * hfc)
        DBG(ISDN_DBG,
            "HFC-S USB: PH_DEACTIVATE | INDICATION sent (T4 expire)");
 #endif
-       hfc->l1_activated = FALSE;
+       hfc->l1_activated = false;
        handle_led(hfc, LED_S0_OFF);
 }
 
@@ -452,7 +451,7 @@ state_handler(hfcusb_data * hfc, __u8 state)
 #ifdef CONFIG_HISAX_DEBUG
                DBG(ISDN_DBG, "HFC-S USB: PH_ACTIVATE | INDICATION sent");
 #endif
-               hfc->l1_activated = TRUE;
+               hfc->l1_activated = true;
                handle_led(hfc, LED_S0_ON);
        } else if (state <= 3 /* && activated */ ) {
                if (old_state == 7 || old_state == 8) {
@@ -472,7 +471,7 @@ state_handler(hfcusb_data * hfc, __u8 state)
                        DBG(ISDN_DBG,
                            "HFC-S USB: PH_DEACTIVATE | INDICATION sent");
 #endif
-                       hfc->l1_activated = FALSE;
+                       hfc->l1_activated = false;
                        handle_led(hfc, LED_S0_OFF);
                }
        }
@@ -622,7 +621,7 @@ tx_iso_complete(struct urb *urb)
        if (fifo->active && !status) {
                transp_mode = 0;
                if (fifon < 4 && hfc->b_mode[fifon / 2] == L1_MODE_TRANS)
-                       transp_mode = TRUE;
+                       transp_mode = true;
 
                /* is FifoFull-threshold set for our channel? */
                threshbit = threshtable[fifon] & hfc->threshold_mask;
@@ -640,7 +639,7 @@ tx_iso_complete(struct urb *urb)
                              tx_iso_complete, urb->context);
                memset(context_iso_urb->buffer, 0,
                       sizeof(context_iso_urb->buffer));
-               frame_complete = FALSE;
+               frame_complete = false;
                /* Generate next Iso Packets */
                for (k = 0; k < num_isoc_packets; ++k) {
                        if (fifo->skbuff) {
@@ -666,7 +665,7 @@ tx_iso_complete(struct urb *urb)
                                                /* add 2 byte flags and 16bit CRC at end of ISDN frame */
                                                fifo->bit_line += 32;
                                        }
-                                       frame_complete = TRUE;
+                                       frame_complete = true;
                                }
 
                                memcpy(context_iso_urb->buffer +
@@ -693,7 +692,7 @@ tx_iso_complete(struct urb *urb)
                        }
 
                        if (frame_complete) {
-                               fifo->delete_flg = TRUE;
+                               fifo->delete_flg = true;
                                fifo->hif->l1l2(fifo->hif,
                                                PH_DATA | CONFIRM,
                                                (void *) (unsigned long) fifo->skbuff->
@@ -701,9 +700,9 @@ tx_iso_complete(struct urb *urb)
                                if (fifo->skbuff && fifo->delete_flg) {
                                        dev_kfree_skb_any(fifo->skbuff);
                                        fifo->skbuff = NULL;
-                                       fifo->delete_flg = FALSE;
+                                       fifo->delete_flg = false;
                                }
-                               frame_complete = FALSE;
+                               frame_complete = false;
                        }
                }
                errcode = usb_submit_urb(urb, GFP_ATOMIC);
@@ -837,7 +836,7 @@ collect_rx_frame(usb_fifo * fifo, __u8 * data, int len, int finish)
        fifon = fifo->fifonum;
        transp_mode = 0;
        if (fifon < 4 && hfc->b_mode[fifon / 2] == L1_MODE_TRANS)
-               transp_mode = TRUE;
+               transp_mode = true;
 
        if (!fifo->skbuff) {
                fifo->skbuff = dev_alloc_skb(fifo->max_size + 3);
@@ -1176,7 +1175,7 @@ hfc_usb_l2l1(struct hisax_if *my_hisax_if, int pr, void *arg)
                        if (fifo->skbuff && fifo->delete_flg) {
                                dev_kfree_skb_any(fifo->skbuff);
                                fifo->skbuff = NULL;
-                               fifo->delete_flg = FALSE;
+                               fifo->delete_flg = false;
                        }
                        fifo->skbuff = arg;     /* we have a new buffer */
                        break;
@@ -1262,8 +1261,8 @@ usb_init(hfcusb_data * hfc)
        hfc->b_mode[0] = L1_MODE_NULL;
        hfc->b_mode[1] = L1_MODE_NULL;
 
-       hfc->l1_activated = FALSE;
-       hfc->disc_flag = FALSE;
+       hfc->l1_activated = false;
+       hfc->disc_flag = false;
        hfc->led_state = 0;
        hfc->led_new_data = 0;
        hfc->old_led_state = 0;
@@ -1404,7 +1403,7 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
 
                        /* check for config EOL element */
                        while (validconf[cfg_used][0]) {
-                               cfg_found = TRUE;
+                               cfg_found = true;
                                vcf = validconf[cfg_used];
                                /* first endpoint descriptor */
                                ep = iface->endpoint;
@@ -1426,7 +1425,7 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
                                                idx++;
                                        attr = ep->desc.bmAttributes;
                                        if (cmptbl[idx] == EP_NUL) {
-                                               cfg_found = FALSE;
+                                               cfg_found = false;
                                        }
                                        if (attr == USB_ENDPOINT_XFER_INT
                                            && cmptbl[idx] == EP_INT)
@@ -1448,7 +1447,7 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
                                                            "HFC-S USB: Interrupt Endpoint interval < %d found - skipping config",
                                                            vcf[17]);
 #endif
-                                               cfg_found = FALSE;
+                                               cfg_found = false;
                                        }
                                        ep++;
                                }
@@ -1456,7 +1455,7 @@ hfc_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
                                        /* all entries must be EP_NOP or EP_NUL for a valid config */
                                        if (cmptbl[i] != EP_NOP
                                            && cmptbl[i] != EP_NUL)
-                                               cfg_found = FALSE;
+                                               cfg_found = false;
                                }
                                if (cfg_found) {
                                        if (cfg_used < small_match) {
@@ -1656,7 +1655,7 @@ hfc_usb_disconnect(struct usb_interface
        hfcusb_data *context = usb_get_intfdata(intf);
        int i;
        printk(KERN_INFO "HFC-S USB: device disconnect\n");
-       context->disc_flag = TRUE;
+       context->disc_flag = true;
        usb_set_intfdata(intf, NULL);
        if (!context)
                return;
index 6349367ed48096a93c436be1e5bfb84deb817873..471f2354dfdedf62b652d445b1bbebea0a270a83 100644 (file)
@@ -12,9 +12,6 @@
 
 #define VERBOSE_USB_DEBUG
 
-#define TRUE  1
-#define FALSE 0
-
 
 /***********/
 /* defines */
index 3f1137e34678f60cfe1a8d7f3102c1de349d9cac..3cd8d5ba239beb8f3a355c6c7edf3e33f87f98d0 100644 (file)
@@ -795,19 +795,6 @@ struct w6692_hw {
        struct timer_list timer;
 };
 
-#ifdef  CONFIG_HISAX_TESTEMU
-struct te_hw {
-       unsigned char *sfifo;
-       unsigned char *sfifo_w;
-       unsigned char *sfifo_r;
-       unsigned char *sfifo_e;
-       int sfifo_cnt;
-       unsigned int stat;
-       wait_queue_head_t rwaitq;
-       wait_queue_head_t swaitq;
-};
-#endif
-
 struct arcofi_msg {
        struct arcofi_msg *next;
        u_char receive;
@@ -916,9 +903,6 @@ struct IsdnCardState {
                struct ix1_hw niccy;
                struct isurf_hw isurf;
                struct saphir_hw saphir;
-#ifdef CONFIG_HISAX_TESTEMU
-               struct te_hw te;
-#endif
                struct bkm_hw ax;
                struct gazel_hw gazel;
                struct w6692_hw w6692;
@@ -1175,15 +1159,6 @@ struct IsdnCardState {
 #define CARD_HSTSAPHIR 0
 #endif
 
-#ifdef CONFIG_HISAX_TESTEMU
-#define        CARD_TESTEMU 1
-#define ISDN_CTYPE_TESTEMU 99
-#undef ISDN_CTYPE_COUNT
-#define  ISDN_CTYPE_COUNT ISDN_CTYPE_TESTEMU
-#else
-#define CARD_TESTEMU 0
-#endif
-
 #ifdef CONFIG_HISAX_BKM_A4T
 #define        CARD_BKM_A4T 1
 #ifndef ISDN_CHIP_ISAC
index 6f1a6583b17d34c9aa2ec9f3e9764bcdf6fd192e..9df9e3548cf15c81be313930feda87739ebfdcfb 100644 (file)
@@ -431,7 +431,6 @@ reterror:
        return(ret);
 }
 
-extern void BChannel_bh(struct BCState *);
 #define B_LL_NOCARRIER 8
 #define B_LL_CONNECT   9
 #define B_LL_OK                10
index 0e88cfabdf109755675d11755df8d54288d24964..172ad4c8c9619dccbbc071e2b3dd65253ce21ce5 100644 (file)
 #define B_XMTBUFREADY  1
 #define B_ACKPENDING   2
 
-extern void debugl1(struct IsdnCardState *cs, char *fmt, ...);
-extern void DChannel_proc_xmt(struct IsdnCardState *cs);
-extern void DChannel_proc_rcv(struct IsdnCardState *cs);
-extern void l1_msg(struct IsdnCardState *cs, int pr, void *arg);
-extern void l1_msg_b(struct PStack *st, int pr, void *arg);
-
-#ifdef L2FRAME_DEBUG
-extern void Logl2Frame(struct IsdnCardState *cs, struct sk_buff *skb, char *buf, int dir);
-#endif
+void debugl1(struct IsdnCardState *cs, char *fmt, ...);
+void DChannel_proc_xmt(struct IsdnCardState *cs);
+void DChannel_proc_rcv(struct IsdnCardState *cs);
+void l1_msg(struct IsdnCardState *cs, int pr, void *arg);
+void l1_msg_b(struct PStack *st, int pr, void *arg);
+void Logl2Frame(struct IsdnCardState *cs, struct sk_buff *skb, char *buf,
+               int dir);
+void BChannel_bh(struct work_struct *work);
index 281fa27d9f003cc0fd72e07efe1e9e7c40c47f5c..935f23356fae645c2a3d91af6e8349778c674212 100644 (file)
@@ -231,18 +231,6 @@ no_l3_proto_spec(struct PStack *st, isdn_ctrl *ic)
        return(-1);
 }
 
-#ifdef CONFIG_HISAX_EURO
-extern void setstack_dss1(struct PStack *st);
-#endif
-
-#ifdef  CONFIG_HISAX_NI1
-extern void setstack_ni1(struct PStack *st);
-#endif
-
-#ifdef CONFIG_HISAX_1TR6
-extern void setstack_1tr6(struct PStack *st);
-#endif
-
 struct l3_process
 *getl3proc(struct PStack *st, int cr)
 {
index 1dbe0297a506e4b391d6591ff77560527cd05240..749498fe6c4b14db730a4a96e6d0883a618c5e56 100644 (file)
@@ -25,13 +25,19 @@ struct stateentry {
 
 #define l3_debug(st, fmt, args...) HiSax_putstatus(st->l1.hardware, "l3 ", fmt, ## args)
 
-extern void newl3state(struct l3_process *pc, int state);
-extern void L3InitTimer(struct l3_process *pc, struct L3Timer *t);
-extern void L3DelTimer(struct L3Timer *t);
-extern int L3AddTimer(struct L3Timer *t, int millisec, int event);
-extern void StopAllL3Timer(struct l3_process *pc);
-extern struct sk_buff *l3_alloc_skb(int len);
-extern struct l3_process *new_l3_process(struct PStack *st, int cr);
-extern void release_l3_process(struct l3_process *p);
-extern struct l3_process *getl3proc(struct PStack *st, int cr);
-extern void l3_msg(struct PStack *st, int pr, void *arg);
+struct PStack;
+
+void newl3state(struct l3_process *pc, int state);
+void L3InitTimer(struct l3_process *pc, struct L3Timer *t);
+void L3DelTimer(struct L3Timer *t);
+int L3AddTimer(struct L3Timer *t, int millisec, int event);
+void StopAllL3Timer(struct l3_process *pc);
+struct sk_buff *l3_alloc_skb(int len);
+struct l3_process *new_l3_process(struct PStack *st, int cr);
+void release_l3_process(struct l3_process *p);
+struct l3_process *getl3proc(struct PStack *st, int cr);
+void l3_msg(struct PStack *st, int pr, void *arg);
+void setstack_dss1(struct PStack *st);
+void setstack_ni1(struct PStack *st);
+void setstack_1tr6(struct PStack *st);
+
index 45debde05fbd111ab2db7cad15e5fefd63cde6d7..439cb530def8833a7c1e17f9e363d3d8341b3518 100644 (file)
@@ -38,7 +38,6 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/ptrace.h>
 #include <linux/slab.h>
 #include <linux/string.h>
index 3e3e18239ec77fa0bbb30e96ae744d6451d1bc2c..ab4bd455450eef1a7b6f5c39968b9416ac4bc459 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/ptrace.h>
 #include <linux/slab.h>
 #include <linux/string.h>
index a1206498a1cf17bb1e39149103aeda8545b79a87..84dccd526ac07dc0488db9f6c60b21031f3c8299 100644 (file)
@@ -14,7 +14,6 @@
  *
  */
 
-#include <linux/sched.h>
 #include <linux/signal.h>
 #include <linux/kernel.h>
 #include <linux/ioport.h>
index 94a935089119b48d1d5f14e51ed195caeda1fc2a..dc477e0aab0ef15c4cf9df56e96405a166f6b8aa 100644 (file)
@@ -367,7 +367,7 @@ hysdn_conf_close(struct inode *ino, struct file *filep)
 /******************************************************/
 /* table for conf filesystem functions defined above. */
 /******************************************************/
-static struct file_operations conf_fops =
+static const struct file_operations conf_fops =
 {
        .llseek         = no_llseek,
        .read           = hysdn_conf_read,
index 375d956884d73faa0c6168c56fa37748a0610dd9..f7e83a86f444cdb37d2bc18b3962212f1bf7a41c 100644 (file)
@@ -383,7 +383,7 @@ hysdn_log_poll(struct file *file, poll_table * wait)
 /**************************************************/
 /* table for log filesystem functions defined above. */
 /**************************************************/
-static struct file_operations log_fops =
+static const struct file_operations log_fops =
 {
        .llseek         = no_llseek,
        .read           = hysdn_log_read,
index 18758772b744e21822e22ad557cdb38d19064484..b7b5aa4748a0984ee46471e9cf707143c8c32593 100644 (file)
@@ -11,7 +11,6 @@
  *
  */
 
-#include <linux/sched.h>
 #include <linux/signal.h>
 #include <linux/kernel.h>
 #include <linux/ioport.h>
index a20f33b4a220f4399dd635dd3af6344f62bb8304..90a23795db7e3a64ea24154c03d53b5a57de375f 100644 (file)
@@ -56,7 +56,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/fcntl.h>
 #include <linux/interrupt.h>
index 6a2ef0a87ed9a5143ba61a396cd35bdfd4908f68..9c926e41b1140fc463ca448960a7bec233b14f70 100644 (file)
@@ -1822,7 +1822,7 @@ isdn_close(struct inode *ino, struct file *filep)
        return 0;
 }
 
-static struct file_operations isdn_fops =
+static const struct file_operations isdn_fops =
 {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
index fc80afe555b9e9063229dca25739aa5b33afe29a..ea5f30d4a5a23377bd2527211081b6bd0ff3e278 100644 (file)
@@ -1261,7 +1261,6 @@ isdn_tty_flush_buffer(struct tty_struct *tty)
        }
        isdn_tty_cleanup_xmit(info);
        info->xmit_count = 0;
-       wake_up_interruptible(&tty->write_wait);
        tty_wakeup(tty);
 }
 
index f151f36c8255d4995efccdf53cd2097ddda406e9..43ecd0f5423567c0dc2026106512383126bf813a 100644 (file)
@@ -15,7 +15,6 @@
  * NULL pointer dereference in cb_in_1 (originally fixed in 2.0)
  */
 
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
 
index bef321d0e51d5a2775ef47fd6ddbcd6b6507bffc..47c59e95898d8be074a30bdc9535100073bfd96d 100644 (file)
@@ -27,7 +27,6 @@
  *              encode our number in CallerPN and ConnectedPN
  */
 
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
 
index 11c1b0b6e390c1e6f0fd919eb5f4a06706cd2c79..8c66bcb953a1e97051b1fc23e7f7e43eb78f957b 100644 (file)
@@ -19,7 +19,6 @@
 
 #include <linux/module.h>
 
-#include <linux/sched.h>
 
 #include <linux/kernel.h>
 
@@ -774,10 +773,6 @@ static void pcbit_logstat(struct pcbit_dev *dev, char *str)
        dev->dev_if->statcallb(&ictl);
 }
        
-extern char * isdn_state_table[];
-extern char * strisdnevent(unsigned short);
-
-
 void pcbit_state_change(struct pcbit_dev * dev, struct pcbit_chan * chan, 
                        unsigned short i, unsigned short ev, unsigned short f)
 {
index 93ca7de5670b1776cf6f0d5cf833db6dab05b320..37e9626cebf6ccdd3d5013aee3a4f8d8be10c385 100644 (file)
@@ -15,7 +15,6 @@
  *              move state/event descriptions to a user space logger
  */
 
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
 
 #include "callbacks.h"
 
 
-extern void pcbit_state_change(struct pcbit_dev *, struct pcbit_chan *, 
-                               unsigned short i, unsigned short ev, 
-                               unsigned short f);
-
-extern struct pcbit_dev * dev_pcbit[MAX_PCBIT_CARDS];
-
 char * isdn_state_table[] = {
   "Closed",
   "Call initiated",
index 6bb587005b8628c57ac7972fea078d137afa022d..0b64f97015d856e157af4fccb9885e8bf3a184a2 100644 (file)
@@ -90,9 +90,12 @@ struct fsm_timer_entry {
        unsigned long timeout;          /* in seconds */
 };
 
+extern char * isdn_state_table[];
+
+void pcbit_fsm_event(struct pcbit_dev *, struct pcbit_chan *,
+                    unsigned short event, struct callb_data *);
+char * strisdnevent(ushort ev);
 
-extern void pcbit_fsm_event(struct pcbit_dev *, struct pcbit_chan *,
-                           unsigned short event, struct callb_data *);
 #endif
 
 
index eafcce5e656a7a796bba72c222ea33ab3ba413ad..5ba2a879df1447e42bcead890600ba9c51ed9800 100644 (file)
@@ -24,7 +24,6 @@
  *              re-write/remove debug printks
  */
 
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
 #undef DEBUG_FRAG
 
 
-
-/*
- *  task queue struct
- */
-
-
-
-/*
- *  Layer 3 packet demultiplexer
- *  drv.c
- */
-
-extern void pcbit_l3_receive(struct pcbit_dev *dev, ulong msg,
-                            struct sk_buff *skb,
-                            ushort hdr_len, ushort refnum);
-
 /*
  *  Prototypes
  */
index 282073a35d6a41f9f7948e32060e3c2cdaf3983d..04ea241ff176fad600990888fe822ab31e09026a 100644 (file)
@@ -11,7 +11,6 @@
 
 #include <linux/module.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
 #include <linux/skbuff.h>
@@ -32,9 +31,6 @@ module_param_array(irq, int, NULL, 0);
 static int num_boards;
 struct pcbit_dev * dev_pcbit[MAX_PCBIT_CARDS];
 
-extern void pcbit_terminate(int board);
-extern int pcbit_init_dev(int board, int mem_base, int irq);
-
 static int __init pcbit_init(void)
 {
        int board;
index 19c18e88ff160be7c315c6c43f32dafbd62cdb79..d76fffc88b8229fcb2e9e4529961cf261e90daa4 100644 (file)
@@ -166,6 +166,12 @@ struct pcbit_ioctl {
 #define L2_RUNNING  5
 #define L2_ERROR    6
 
-extern void pcbit_deliver(struct work_struct *work);
+void pcbit_deliver(struct work_struct *work);
+int pcbit_init_dev(int board, int mem_base, int irq);
+void pcbit_terminate(int board);
+void pcbit_l3_receive(struct pcbit_dev * dev, ulong msg, struct sk_buff * skb,
+                     ushort hdr_len, ushort refnum);
+void pcbit_state_change(struct pcbit_dev * dev, struct pcbit_chan * chan,
+                       unsigned short i, unsigned short ev, unsigned short f);
 
 #endif
index 8e44928cdf1c40d74a5d035a39be96d795421bbf..4fbfa825c3a2b014405274fe1b5946b70b17b1ca 100644 (file)
@@ -26,7 +26,9 @@
 #include <linux/timer.h>
 #include <linux/time.h>
 #include <linux/isdnif.h>
+#include <linux/irqreturn.h>
 #include "message.h"
+#include "scioc.h"
 
 /*
  * Amount of time to wait for a reset to complete
@@ -98,4 +100,32 @@ typedef struct {
        spinlock_t lock;                /* local lock */
 } board;
 
+
+extern board *sc_adapter[];
+extern int cinst;
+
+void memcpy_toshmem(int card, void *dest, const void *src, size_t n);
+void memcpy_fromshmem(int card, void *dest, const void *src, size_t n);
+int get_card_from_id(int driver);
+int indicate_status(int card, int event, ulong Channel, char *Data);
+irqreturn_t interrupt_handler(int interrupt, void *cardptr);
+int sndpkt(int devId, int channel, struct sk_buff *data);
+void rcvpkt(int card, RspMessage *rcvmsg);
+int command(isdn_ctrl *cmd);
+int reset(int card);
+int startproc(int card);
+int send_and_receive(int card, unsigned int procid, unsigned char type,
+                    unsigned char class, unsigned char code,
+                    unsigned char link, unsigned char data_len,
+                    unsigned char *data,  RspMessage *mesgdata, int timeout);
+void flushreadfifo (int card);
+int sendmessage(int card, unsigned int procid, unsigned int type,
+               unsigned int class, unsigned int code, unsigned int link,
+               unsigned int data_len, unsigned int *data);
+int receivemessage(int card, RspMessage *rspmsg);
+int sc_ioctl(int card, scs_ioctl *data);
+int setup_buffers(int card, int c);
+void check_reset(unsigned long data);
+void check_phystat(unsigned long data);
+
 #endif /* CARD_H */
index 04b8a58f03b55441420a1c16082293a740521742..b7bb7cbcf5035bf4bcb14bede0bbd84cc05c2e30 100644 (file)
@@ -31,19 +31,6 @@ static int setl2(int card, unsigned long arg);
 static int setl3(int card, unsigned long arg);
 static int acceptb(int card, unsigned long channel);
 
-extern int cinst;
-extern board *sc_adapter[];
-
-extern int sc_ioctl(int, scs_ioctl *);
-extern int setup_buffers(int, int, unsigned int);
-extern int indicate_status(int, int,ulong,char*);
-extern void check_reset(unsigned long);
-extern int send_and_receive(int, unsigned int, unsigned char, unsigned char,
-                unsigned char, unsigned char, unsigned char, unsigned char *,
-                RspMessage *, int);
-extern int sendmessage(int, unsigned int, unsigned int, unsigned int,
-                unsigned int, unsigned int, unsigned int, unsigned int *);
-
 #ifdef DEBUG
 /*
  * Translate command codes to strings
@@ -208,7 +195,7 @@ static int answer(int card, unsigned long channel)
                return -ENODEV;
        }
 
-       if(setup_buffers(card, channel+1, BUFFER_SIZE)) {
+       if(setup_buffers(card, channel+1)) {
                hangup(card, channel+1);
                return -ENOBUFS;
        }
@@ -297,7 +284,7 @@ static int acceptb(int card, unsigned long channel)
                return -ENODEV;
        }
 
-       if(setup_buffers(card, channel+1, BUFFER_SIZE))
+       if(setup_buffers(card, channel+1))
        {
                hangup(card, channel+1);
                return -ENOBUFS;
index 57367325ef04513f9ef4fa30c81244c58cc41df6..498f4039ece251b1d99c7cf9ab0c929d5d964f42 100644 (file)
@@ -20,9 +20,6 @@
 #include "message.h"
 #include "card.h"
 
-extern int cinst;
-extern board *sc_adapter[];
-
 #ifdef DEBUG
 static char *events[] = { "ISDN_STAT_STAVAIL",
                          "ISDN_STAT_ICALL",
index 150759a5cddf9a97f621ed495b1194399abce666..0bf76344a0d54fcbd00752fc65d2a1b4f390332f 100644 (file)
@@ -35,12 +35,6 @@ module_param_array(irq, int, NULL, 0);
 module_param_array(ram, int, NULL, 0);
 module_param(do_reset, bool, 0);
 
-extern irqreturn_t interrupt_handler(int, void *);
-extern int sndpkt(int, int, int, struct sk_buff *);
-extern int command(isdn_ctrl *);
-extern int indicate_status(int, int, ulong, char*);
-extern int reset(int);
-
 static int identify_board(unsigned long, unsigned int);
 
 static int __init sc_init(void)
index cd17de18cb76df0907659168e516bdb8d3bcc502..bef7963cdd022ebca70e7458621f1f317c401014 100644 (file)
 #include "card.h"
 #include <linux/interrupt.h>
 
-extern int indicate_status(int, int, ulong, char *);
-extern void check_phystat(unsigned long);
-extern int receivemessage(int, RspMessage *);
-extern int sendmessage(int, unsigned int, unsigned int, unsigned int,
-        unsigned int, unsigned int, unsigned int, unsigned int *);
-extern void rcvpkt(int, RspMessage *);
-
-extern int cinst;
-extern board *sc_adapter[];
-
 static int get_card_from_irq(int irq)
 {
        int i;
index 57c4ab96d136465195f89e232e345ee5771e287b..7817d2244921c0898385d165beb02e8664451074 100644 (file)
 #include "card.h"
 #include "scioc.h"
 
-extern int indicate_status(int, int, unsigned long, char *);
-extern int startproc(int);
-extern int reset(int);
-extern int send_and_receive(int, unsigned int, unsigned char,unsigned char,
-               unsigned char,unsigned char, 
-               unsigned char, unsigned char *, RspMessage *, int);
-
-extern board *sc_adapter[];
-
-
 static int GetStatus(int card, boardInfo *);
 
 /*
index 0a0fe6b8039bbe8cea80b815a1526799c31c8376..c5a307e3c496fa1ffab8602035c786b205079c6f 100644 (file)
 #include "message.h"
 #include "card.h"
 
-extern board *sc_adapter[];
-extern unsigned int cinst;
-
-/*
- * Obligatory function prototypes
- */
-extern int indicate_status(int,ulong,char*);
-extern int scm_command(isdn_ctrl *);
-
-
 /*
  * receive a message from the board
  */
index 1e04676b016b212b07d0397b5493c04bb1058c39..92016a2608e9516663c238e0f8ca08493c48199c 100644 (file)
 #include "message.h"
 #include "card.h"
 
-extern board *sc_adapter[];
-extern unsigned int cinst;
-
-extern int get_card_from_id(int);
-extern int indicate_status(int, int,ulong, char*);
-extern void memcpy_toshmem(int, void *, const void *, size_t);
-extern void memcpy_fromshmem(int, void *, const void *, size_t);
-extern int sendmessage(int, unsigned int, unsigned int, unsigned int,
-                unsigned int, unsigned int, unsigned int, unsigned int *);
-
 int sndpkt(int devId, int channel, struct sk_buff *data)
 {
        LLData  ReqLnkWrite;
index d08e650c7b6a1f465e656021eb948098d1be2440..dfb107a6de446dd0dd7956e3278908a58338dba3 100644 (file)
@@ -1,3 +1,6 @@
+#ifndef __ISDN_SC_SCIOC_H__
+#define __ISDN_SC_SCIOC_H__
+
 /*
  * This software may be used and distributed according to the terms
  * of the GNU General Public License, incorporated herein by reference.
@@ -103,3 +106,6 @@ typedef struct {
                POTInfo potsinfo;
        } info;
 } boardInfo;
+
+#endif  /*  __ISDN_SC_SCIOC_H__  */
+
index 6f58862992dbf9079fe978c2f0ccda31fcfd77e1..034d41a61ae1e65b0ba7fe86f339840fba65ba6b 100644 (file)
 #include "hardware.h"
 #include "card.h"
 
-/*
- * Main adapter array
- */
-extern board *sc_adapter[];
-extern int cinst;
-
 /*
  *
  */
index f43282be0adafd0e1b474ccea84cccb24ba9bc7f..cc1b8861be2ab09e6500acd720fcfbbc9b41c166 100644 (file)
 #include "message.h"
 #include "card.h"
 
-extern board *sc_adapter[];
-
-extern void flushreadfifo(int);
-extern int  startproc(int);
-extern int  indicate_status(int, int, unsigned long, char *);
-extern int  sendmessage(int, unsigned int, unsigned int, unsigned int,
-        unsigned int, unsigned int, unsigned int, unsigned int *);
-
 
 /*
  * Write the proper values into the I/O ports following a reset
index 2db1ca4c68008b9f567172cb7741b54326ef4c66..04574a9d4430b9deeb7458e0a037a1b76f1e6b23 100644 (file)
@@ -304,6 +304,7 @@ struct kvm {
        int memory_config_version;
        int busy;
        unsigned long rmap_overflow;
+       struct list_head vm_list;
 };
 
 struct kvm_stat {
@@ -340,6 +341,7 @@ struct kvm_arch_ops {
 
        struct kvm_vcpu *(*vcpu_load)(struct kvm_vcpu *vcpu);
        void (*vcpu_put)(struct kvm_vcpu *vcpu);
+       void (*vcpu_decache)(struct kvm_vcpu *vcpu);
 
        int (*set_guest_debug)(struct kvm_vcpu *vcpu,
                               struct kvm_debug_guest *dbg);
@@ -558,7 +560,7 @@ static inline void load_gs(u16 sel)
 #ifndef load_ldt
 static inline void load_ldt(u16 sel)
 {
-       asm ("lldt %0" : : "g"(sel));
+       asm ("lldt %0" : : "rm"(sel));
 }
 #endif
 
index 099f0afd394d16cf84fee390aa8b42fe6ec22fa4..af866147ff25613ef1e1c4a7e0d0edccca0dc27a 100644 (file)
@@ -34,6 +34,8 @@
 #include <linux/highmem.h>
 #include <linux/file.h>
 #include <asm/desc.h>
+#include <linux/sysdev.h>
+#include <linux/cpu.h>
 
 #include "x86_emulate.h"
 #include "segment_descriptor.h"
@@ -41,6 +43,9 @@
 MODULE_AUTHOR("Qumranet");
 MODULE_LICENSE("GPL");
 
+static DEFINE_SPINLOCK(kvm_lock);
+static LIST_HEAD(vm_list);
+
 struct kvm_arch_ops *kvm_arch_ops;
 struct kvm_stat kvm_stat;
 EXPORT_SYMBOL_GPL(kvm_stat);
@@ -230,9 +235,13 @@ static int kvm_dev_open(struct inode *inode, struct file *filp)
                struct kvm_vcpu *vcpu = &kvm->vcpus[i];
 
                mutex_init(&vcpu->mutex);
+               vcpu->cpu = -1;
                vcpu->kvm = kvm;
                vcpu->mmu.root_hpa = INVALID_PAGE;
                INIT_LIST_HEAD(&vcpu->free_pages);
+               spin_lock(&kvm_lock);
+               list_add(&kvm->vm_list, &vm_list);
+               spin_unlock(&kvm_lock);
        }
        filp->private_data = kvm;
        return 0;
@@ -272,7 +281,9 @@ static void kvm_free_physmem(struct kvm *kvm)
 
 static void kvm_free_vcpu(struct kvm_vcpu *vcpu)
 {
-       vcpu_load(vcpu->kvm, vcpu_slot(vcpu));
+       if (!vcpu_load(vcpu->kvm, vcpu_slot(vcpu)))
+               return;
+
        kvm_mmu_destroy(vcpu);
        vcpu_put(vcpu);
        kvm_arch_ops->vcpu_free(vcpu);
@@ -290,6 +301,9 @@ static int kvm_dev_release(struct inode *inode, struct file *filp)
 {
        struct kvm *kvm = filp->private_data;
 
+       spin_lock(&kvm_lock);
+       list_del(&kvm->vm_list);
+       spin_unlock(&kvm_lock);
        kvm_free_vcpus(kvm);
        kvm_free_physmem(kvm);
        kfree(kvm);
@@ -544,7 +558,6 @@ static int kvm_dev_ioctl_create_vcpu(struct kvm *kvm, int n)
                                           FX_IMAGE_ALIGN);
        vcpu->guest_fx_image = vcpu->host_fx_image + FX_IMAGE_SIZE;
 
-       vcpu->cpu = -1;  /* First load will set up TR */
        r = kvm_arch_ops->vcpu_create(vcpu);
        if (r < 0)
                goto out_free_vcpus;
@@ -1360,6 +1373,9 @@ static int kvm_dev_ioctl_run(struct kvm *kvm, struct kvm_run *kvm_run)
        if (!vcpu)
                return -ENOENT;
 
+       /* re-sync apic's tpr */
+       vcpu->cr8 = kvm_run->cr8;
+
        if (kvm_run->emulated) {
                kvm_arch_ops->skip_emulated_instruction(vcpu);
                kvm_run->emulated = 0;
@@ -2025,6 +2041,64 @@ static struct notifier_block kvm_reboot_notifier = {
        .priority = 0,
 };
 
+/*
+ * Make sure that a cpu that is being hot-unplugged does not have any vcpus
+ * cached on it.
+ */
+static void decache_vcpus_on_cpu(int cpu)
+{
+       struct kvm *vm;
+       struct kvm_vcpu *vcpu;
+       int i;
+
+       spin_lock(&kvm_lock);
+       list_for_each_entry(vm, &vm_list, vm_list)
+               for (i = 0; i < KVM_MAX_VCPUS; ++i) {
+                       vcpu = &vm->vcpus[i];
+                       /*
+                        * If the vcpu is locked, then it is running on some
+                        * other cpu and therefore it is not cached on the
+                        * cpu in question.
+                        *
+                        * If it's not locked, check the last cpu it executed
+                        * on.
+                        */
+                       if (mutex_trylock(&vcpu->mutex)) {
+                               if (vcpu->cpu == cpu) {
+                                       kvm_arch_ops->vcpu_decache(vcpu);
+                                       vcpu->cpu = -1;
+                               }
+                               mutex_unlock(&vcpu->mutex);
+                       }
+               }
+       spin_unlock(&kvm_lock);
+}
+
+static int kvm_cpu_hotplug(struct notifier_block *notifier, unsigned long val,
+                          void *v)
+{
+       int cpu = (long)v;
+
+       switch (val) {
+       case CPU_DEAD:
+       case CPU_UP_CANCELED:
+               decache_vcpus_on_cpu(cpu);
+               smp_call_function_single(cpu, kvm_arch_ops->hardware_disable,
+                                        NULL, 0, 1);
+               break;
+       case CPU_UP_PREPARE:
+               smp_call_function_single(cpu, kvm_arch_ops->hardware_enable,
+                                        NULL, 0, 1);
+               break;
+       }
+       return NOTIFY_OK;
+}
+
+static struct notifier_block kvm_cpu_notifier = {
+       .notifier_call = kvm_cpu_hotplug,
+       .priority = 20, /* must be > scheduler priority */
+};
+
 static __init void kvm_init_debug(void)
 {
        struct kvm_stats_debugfs_item *p;
@@ -2044,6 +2118,30 @@ static void kvm_exit_debug(void)
        debugfs_remove(debugfs_dir);
 }
 
+static int kvm_suspend(struct sys_device *dev, pm_message_t state)
+{
+       decache_vcpus_on_cpu(raw_smp_processor_id());
+       on_each_cpu(kvm_arch_ops->hardware_disable, 0, 0, 1);
+       return 0;
+}
+
+static int kvm_resume(struct sys_device *dev)
+{
+       on_each_cpu(kvm_arch_ops->hardware_enable, 0, 0, 1);
+       return 0;
+}
+
+static struct sysdev_class kvm_sysdev_class = {
+       set_kset_name("kvm"),
+       .suspend = kvm_suspend,
+       .resume = kvm_resume,
+};
+
+static struct sys_device kvm_sysdev = {
+       .id = 0,
+       .cls = &kvm_sysdev_class,
+};
+
 hpa_t bad_page_address;
 
 int kvm_init_arch(struct kvm_arch_ops *ops, struct module *module)
@@ -2071,8 +2169,19 @@ int kvm_init_arch(struct kvm_arch_ops *ops, struct module *module)
            return r;
 
        on_each_cpu(kvm_arch_ops->hardware_enable, NULL, 0, 1);
+       r = register_cpu_notifier(&kvm_cpu_notifier);
+       if (r)
+               goto out_free_1;
        register_reboot_notifier(&kvm_reboot_notifier);
 
+       r = sysdev_class_register(&kvm_sysdev_class);
+       if (r)
+               goto out_free_2;
+
+       r = sysdev_register(&kvm_sysdev);
+       if (r)
+               goto out_free_3;
+
        kvm_chardev_ops.owner = module;
 
        r = misc_register(&kvm_dev);
@@ -2084,7 +2193,13 @@ int kvm_init_arch(struct kvm_arch_ops *ops, struct module *module)
        return r;
 
 out_free:
+       sysdev_unregister(&kvm_sysdev);
+out_free_3:
+       sysdev_class_unregister(&kvm_sysdev_class);
+out_free_2:
        unregister_reboot_notifier(&kvm_reboot_notifier);
+       unregister_cpu_notifier(&kvm_cpu_notifier);
+out_free_1:
        on_each_cpu(kvm_arch_ops->hardware_disable, NULL, 0, 1);
        kvm_arch_ops->hardware_unsetup();
        return r;
@@ -2093,8 +2208,10 @@ out_free:
 void kvm_exit_arch(void)
 {
        misc_deregister(&kvm_dev);
-
+       sysdev_unregister(&kvm_sysdev);
+       sysdev_class_unregister(&kvm_sysdev_class);
        unregister_reboot_notifier(&kvm_reboot_notifier);
+       unregister_cpu_notifier(&kvm_cpu_notifier);
        on_each_cpu(kvm_arch_ops->hardware_disable, NULL, 0, 1);
        kvm_arch_ops->hardware_unsetup();
        kvm_arch_ops = NULL;
index 149fa45fd9a5a016955148fa6f24f8805e63f277..b6b90e9e13013eeab29adc4bc30c5cb1657f5732 100644 (file)
@@ -443,31 +443,17 @@ static int FNAME(page_fault)(struct kvm_vcpu *vcpu, gva_t addr,
 static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t vaddr)
 {
        struct guest_walker walker;
-       pt_element_t guest_pte;
-       gpa_t gpa;
-
-       FNAME(walk_addr)(&walker, vcpu, vaddr, 0, 0, 0);
-       guest_pte = *walker.ptep;
-       FNAME(release_walker)(&walker);
-
-       if (!is_present_pte(guest_pte))
-               return UNMAPPED_GVA;
-
-       if (walker.level == PT_DIRECTORY_LEVEL) {
-               ASSERT((guest_pte & PT_PAGE_SIZE_MASK));
-               ASSERT(PTTYPE == 64 || is_pse(vcpu));
+       gpa_t gpa = UNMAPPED_GVA;
+       int r;
 
-               gpa = (guest_pte & PT_DIR_BASE_ADDR_MASK) | (vaddr &
-                       (PT_LEVEL_MASK(PT_PAGE_TABLE_LEVEL) | ~PAGE_MASK));
+       r = FNAME(walk_addr)(&walker, vcpu, vaddr, 0, 0, 0);
 
-               if (PTTYPE == 32 && is_cpuid_PSE36())
-                       gpa |= (guest_pte & PT32_DIR_PSE36_MASK) <<
-                                       (32 - PT32_DIR_PSE36_SHIFT);
-       } else {
-               gpa = (guest_pte & PT_BASE_ADDR_MASK);
-               gpa |= (vaddr & ~PAGE_MASK);
+       if (r) {
+               gpa = (gpa_t)walker.gfn << PAGE_SHIFT;
+               gpa |= vaddr & ~PAGE_MASK;
        }
 
+       FNAME(release_walker)(&walker);
        return gpa;
 }
 
index 85f61dd1e9367a4129edd43fecbc6b9b524a0717..83da4ea150a335c3543315a7adef7855b1f047ce 100644 (file)
@@ -528,7 +528,13 @@ static void init_vmcb(struct vmcb *vmcb)
        save->cs.attrib = SVM_SELECTOR_READ_MASK | SVM_SELECTOR_P_MASK |
                SVM_SELECTOR_S_MASK | SVM_SELECTOR_CODE_MASK;
        save->cs.limit = 0xffff;
-       save->cs.base = 0xffff0000;
+       /*
+        * cs.base should really be 0xffff0000, but vmx can't handle that, so
+        * be consistent with it.
+        *
+        * Replace when we have real mode working for vmx.
+        */
+       save->cs.base = 0xf0000;
 
        save->gdtr.limit = 0xffff;
        save->idtr.limit = 0xffff;
@@ -603,6 +609,10 @@ static void svm_vcpu_put(struct kvm_vcpu *vcpu)
        put_cpu();
 }
 
+static void svm_vcpu_decache(struct kvm_vcpu *vcpu)
+{
+}
+
 static void svm_cache_regs(struct kvm_vcpu *vcpu)
 {
        vcpu->regs[VCPU_REGS_RAX] = vcpu->svm->vmcb->save.rax;
@@ -723,7 +733,7 @@ static void svm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)
        }
 #endif
        vcpu->svm->cr0 = cr0;
-       vcpu->svm->vmcb->save.cr0 = cr0 | CR0_PG_MASK;
+       vcpu->svm->vmcb->save.cr0 = cr0 | CR0_PG_MASK | CR0_WP_MASK;
        vcpu->cr0 = cr0;
 }
 
@@ -1671,6 +1681,7 @@ static struct kvm_arch_ops svm_arch_ops = {
 
        .vcpu_load = svm_vcpu_load,
        .vcpu_put = svm_vcpu_put,
+       .vcpu_decache = svm_vcpu_decache,
 
        .set_guest_debug = svm_guest_debug,
        .get_msr = svm_get_msr,
index 27e05a77e21a5645e07dada6717609822de7aea5..fd4e91734388204a08e52d05fe0900920a48e866 100644 (file)
@@ -125,6 +125,15 @@ static void __vcpu_clear(void *arg)
                per_cpu(current_vmcs, cpu) = NULL;
 }
 
+static void vcpu_clear(struct kvm_vcpu *vcpu)
+{
+       if (vcpu->cpu != raw_smp_processor_id() && vcpu->cpu != -1)
+               smp_call_function_single(vcpu->cpu, __vcpu_clear, vcpu, 0, 1);
+       else
+               __vcpu_clear(vcpu);
+       vcpu->launched = 0;
+}
+
 static unsigned long vmcs_readl(unsigned long field)
 {
        unsigned long value;
@@ -202,10 +211,8 @@ static struct kvm_vcpu *vmx_vcpu_load(struct kvm_vcpu *vcpu)
 
        cpu = get_cpu();
 
-       if (vcpu->cpu != cpu) {
-               smp_call_function(__vcpu_clear, vcpu, 0, 1);
-               vcpu->launched = 0;
-       }
+       if (vcpu->cpu != cpu)
+               vcpu_clear(vcpu);
 
        if (per_cpu(current_vmcs, cpu) != vcpu->vmcs) {
                u8 error;
@@ -243,6 +250,11 @@ static void vmx_vcpu_put(struct kvm_vcpu *vcpu)
        put_cpu();
 }
 
+static void vmx_vcpu_decache(struct kvm_vcpu *vcpu)
+{
+       vcpu_clear(vcpu);
+}
+
 static unsigned long vmx_get_rflags(struct kvm_vcpu *vcpu)
 {
        return vmcs_readl(GUEST_RFLAGS);
@@ -502,7 +514,7 @@ static __init int vmx_disabled_by_bios(void)
        return (msr & 5) == 1; /* locked but not enabled */
 }
 
-static __init void hardware_enable(void *garbage)
+static void hardware_enable(void *garbage)
 {
        int cpu = raw_smp_processor_id();
        u64 phys_addr = __pa(per_cpu(vmxarea, cpu));
@@ -1375,6 +1387,11 @@ static int handle_external_interrupt(struct kvm_vcpu *vcpu,
        return 1;
 }
 
+static int handle_triple_fault(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+{
+       kvm_run->exit_reason = KVM_EXIT_SHUTDOWN;
+       return 0;
+}
 
 static int get_io_count(struct kvm_vcpu *vcpu, u64 *count)
 {
@@ -1635,6 +1652,7 @@ static int (*kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu,
                                      struct kvm_run *kvm_run) = {
        [EXIT_REASON_EXCEPTION_NMI]           = handle_exception,
        [EXIT_REASON_EXTERNAL_INTERRUPT]      = handle_external_interrupt,
+       [EXIT_REASON_TRIPLE_FAULT]            = handle_triple_fault,
        [EXIT_REASON_IO_INSTRUCTION]          = handle_io,
        [EXIT_REASON_CR_ACCESS]               = handle_cr,
        [EXIT_REASON_DR_ACCESS]               = handle_dr,
@@ -1786,10 +1804,10 @@ again:
                "kvm_vmx_return: "
                /* Save guest registers, load host registers, keep flags */
 #ifdef CONFIG_X86_64
-               "xchg %3,     0(%%rsp) \n\t"
+               "xchg %3,     (%%rsp) \n\t"
                "mov %%rax, %c[rax](%3) \n\t"
                "mov %%rbx, %c[rbx](%3) \n\t"
-               "pushq 0(%%rsp); popq %c[rcx](%3) \n\t"
+               "pushq (%%rsp); popq %c[rcx](%3) \n\t"
                "mov %%rdx, %c[rdx](%3) \n\t"
                "mov %%rsi, %c[rsi](%3) \n\t"
                "mov %%rdi, %c[rdi](%3) \n\t"
@@ -1804,24 +1822,24 @@ again:
                "mov %%r15, %c[r15](%3) \n\t"
                "mov %%cr2, %%rax   \n\t"
                "mov %%rax, %c[cr2](%3) \n\t"
-               "mov 0(%%rsp), %3 \n\t"
+               "mov (%%rsp), %3 \n\t"
 
                "pop  %%rcx; pop  %%r15; pop  %%r14; pop  %%r13; pop  %%r12;"
                "pop  %%r11; pop  %%r10; pop  %%r9;  pop  %%r8;"
                "pop  %%rbp; pop  %%rdi; pop  %%rsi;"
                "pop  %%rdx; pop  %%rbx; pop  %%rax \n\t"
 #else
-               "xchg %3, 0(%%esp) \n\t"
+               "xchg %3, (%%esp) \n\t"
                "mov %%eax, %c[rax](%3) \n\t"
                "mov %%ebx, %c[rbx](%3) \n\t"
-               "pushl 0(%%esp); popl %c[rcx](%3) \n\t"
+               "pushl (%%esp); popl %c[rcx](%3) \n\t"
                "mov %%edx, %c[rdx](%3) \n\t"
                "mov %%esi, %c[rsi](%3) \n\t"
                "mov %%edi, %c[rdi](%3) \n\t"
                "mov %%ebp, %c[rbp](%3) \n\t"
                "mov %%cr2, %%eax  \n\t"
                "mov %%eax, %c[cr2](%3) \n\t"
-               "mov 0(%%esp), %3 \n\t"
+               "mov (%%esp), %3 \n\t"
 
                "pop %%ecx; popa \n\t"
 #endif
@@ -1859,15 +1877,7 @@ again:
        fx_restore(vcpu->host_fx_image);
        vcpu->interrupt_window_open = (vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & 3) == 0;
 
-#ifndef CONFIG_X86_64
        asm ("mov %0, %%ds; mov %0, %%es" : : "r"(__USER_DS));
-#endif
-
-       /*
-        * Profile KVM exit RIPs:
-        */
-       if (unlikely(prof_on == KVM_PROFILING))
-               profile_hit(KVM_PROFILING, (void *)vmcs_readl(GUEST_RIP));
 
        kvm_run->exit_type = 0;
        if (fail) {
@@ -1891,6 +1901,12 @@ again:
 
                        reload_tss();
                }
+               /*
+                * Profile KVM exit RIPs:
+                */
+               if (unlikely(prof_on == KVM_PROFILING))
+                       profile_hit(KVM_PROFILING, (void *)vmcs_readl(GUEST_RIP));
+
                vcpu->launched = 1;
                kvm_run->exit_type = KVM_EXIT_TYPE_VM_EXIT;
                r = kvm_handle_exit(kvm_run, vcpu);
@@ -2012,6 +2028,7 @@ static struct kvm_arch_ops vmx_arch_ops = {
 
        .vcpu_load = vmx_vcpu_load,
        .vcpu_put = vmx_vcpu_put,
+       .vcpu_decache = vmx_vcpu_decache,
 
        .set_guest_debug = set_guest_debug,
        .get_msr = vmx_get_msr,
index 4c0ab151836ae5374c4fd61efc685b03838c38e3..d0dc93df411b2dd940054539cbafab15a049edaa 100644 (file)
@@ -180,6 +180,7 @@ enum vmcs_field {
 
 #define EXIT_REASON_EXCEPTION_NMI       0
 #define EXIT_REASON_EXTERNAL_INTERRUPT  1
+#define EXIT_REASON_TRIPLE_FAULT        2
 
 #define EXIT_REASON_PENDING_INTERRUPT   7
 
index 7cec6de5e2b0704b1a74cfa0d4851d7dda72f983..f729eebf771f80447fd64a42a3919d0fd52d888a 100644 (file)
@@ -885,7 +885,7 @@ out:
        return ret;
 }
 
-static struct file_operations adb_fops = {
+static const struct file_operations adb_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .read           = adb_read,
index 1c7d6f221b557bfad36b42d4014c2fb7dc6ba4bd..b77ef5187d6d0e6488217e9a38c9000ada5d8716 100644 (file)
@@ -574,8 +574,8 @@ static struct adb_request led_request;
 static int leds_pending[16];
 static int leds_req_pending;
 static int pending_devs[16];
-static int pending_led_start=0;
-static int pending_led_end=0;
+static int pending_led_start;
+static int pending_led_end;
 static DEFINE_SPINLOCK(leds_lock);
 
 static void leds_done(struct adb_request *req)
index 2b8a6e821d44b51a52a87854165a5a251484ee81..cdd5a0f72e3c108600b4e49057fd5899bbdd4a7c 100644 (file)
@@ -121,7 +121,7 @@ anslcd_open( struct inode * inode, struct file * file )
        return 0;
 }
 
-struct file_operations anslcd_fops = {
+const struct file_operations anslcd_fops = {
        .write  = anslcd_write,
        .ioctl  = anslcd_ioctl,
        .open   = anslcd_open,
index 4300c628f8af813d58113273f1402baba69bd87c..c5e4d43f97fcbe89c4bf69853cb618d3c5bab578 100644 (file)
@@ -102,7 +102,7 @@ static struct pmu_sleep_notifier apm_sleep_notifier = {
        SLEEP_LEVEL_USERLAND,
 };
 
-static char                    driver_version[] = "0.5";       /* no spaces */
+static const char driver_version[] = "0.5";    /* no spaces */
 
 #ifdef DEBUG
 static char *  apm_event_name[] = {
@@ -501,7 +501,7 @@ static int apm_emu_get_info(char *buf, char **start, off_t fpos, int length)
        return p - buf;
 }
 
-static struct file_operations apm_bios_fops = {
+static const struct file_operations apm_bios_fops = {
        .owner          = THIS_MODULE,
        .read           = do_read,
        .poll           = do_poll,
index ee6b4ca691308e4724bf395564b234780bc8f124..c1fd816e9f09d282b9ec8cd5678dcb2c84ef3f1f 100644 (file)
 
 static struct input_dev *emumousebtn;
 static int emumousebtn_input_register(void);
-static int mouse_emulate_buttons = 0;
+static int mouse_emulate_buttons;
 static int mouse_button2_keycode = KEY_RIGHTCTRL;      /* right control key */
 static int mouse_button3_keycode = KEY_RIGHTALT;       /* right option key */
-static int mouse_last_keycode = 0;
+static int mouse_last_keycode;
 
 #if defined(CONFIG_SYSCTL)
 /* file(s) in /proc/sys/dev/mac_hid */
@@ -138,7 +138,7 @@ int __init mac_hid_init(void)
                return err;
 
 #if defined(CONFIG_SYSCTL)
-       mac_hid_sysctl_header = register_sysctl_table(mac_hid_root_dir, 1);
+       mac_hid_sysctl_header = register_sysctl_table(mac_hid_root_dir);
 #endif /* CONFIG_SYSCTL */
 
        return 0;
index 797cef72258f317a06340a08107e0f357326d73c..026b67f4f659f59fb55e9953dd87ba05952207e5 100644 (file)
@@ -6,7 +6,6 @@
 #include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/delay.h>
-#include <linux/sched.h>
 #include <linux/spinlock.h>
 #include <linux/interrupt.h>
 #include <asm/prom.h>
index 30791875fc975176c96b11b43413f9fb548583fc..b195d753d2edb30a85a0a1d1acfce03e332e1ffe 100644 (file)
@@ -100,7 +100,7 @@ static int nvram_ioctl(struct inode *inode, struct file *file,
        return 0;
 }
 
-struct file_operations nvram_fops = {
+const struct file_operations nvram_fops = {
        .owner          = THIS_MODULE,
        .llseek         = nvram_llseek,
        .read           = read_nvram,
index 6f30459b9385361d0fae5c61f399bafbaa3d67af..3096836d8bd3309e35b459d2684b6688838ff58e 100644 (file)
@@ -1277,7 +1277,7 @@ static int smu_release(struct inode *inode, struct file *file)
 }
 
 
-static struct file_operations smu_device_fops = {
+static const struct file_operations smu_device_fops = {
        .llseek         = no_llseek,
        .read           = smu_read,
        .write          = smu_write,
index 3d3bf1643e73ff98fc863cdd5d2ec6b8b5965291..a7ce559266380596a045657ed14ae12efd4f5bb6 100644 (file)
@@ -48,11 +48,11 @@ static u8 FAN_SPD_SET[2] = {0x30, 0x31};
 
 static u8 default_limits_local[3] = {70, 50, 70};    /* local, sensor1, sensor2 */
 static u8 default_limits_chip[3] = {80, 65, 80};    /* local, sensor1, sensor2 */
-static const char *sensor_location[3] = {NULL, NULL, NULL};
+static const char *sensor_location[3];
 
-static int limit_adjust = 0;
+static int limit_adjust;
 static int fan_speed = -1;
-static int verbose = 0;
+static int verbose;
 
 MODULE_AUTHOR("Colin Leroy <colin@colino.net>");
 MODULE_DESCRIPTION("Driver for ADT746x thermostat in iBook G4 and "
index df66291b1322651a2053637dfa41a9b6818732fc..d58fcf6cca0aec41f68344f9cf99e880193ba9da 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/delay.h>
-#include <linux/sched.h>
 #include <linux/adb.h>
 #include <linux/cuda.h>
 #include <linux/spinlock.h>
@@ -86,7 +85,7 @@ static int data_index;
 #ifdef CONFIG_PPC
 static struct device_node *vias;
 #endif
-static int cuda_fully_inited = 0;
+static int cuda_fully_inited;
 
 #ifdef CONFIG_ADB
 static int cuda_probe(void);
index 5d88d5b0ad9931c3f400efbe5c2ec6c48d6ec0c2..1b3bad62a1be6c623ffcc32f4d8fbb9ac97163d5 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/delay.h>
-#include <linux/sched.h>
 #include <linux/adb.h>
 #include <linux/interrupt.h>
 #include <linux/init.h>
@@ -107,10 +106,10 @@ static enum macii_state {
        awaiting_reply
 } macii_state;
 
-static int need_poll    = 0;
-static int command_byte = 0;
-static int last_reply   = 0;
-static int last_active  = 0;
+static int need_poll;
+static int command_byte;
+static int last_reply;
+static int last_active;
 
 static struct adb_request *current_req;
 static struct adb_request *last_req;
@@ -124,7 +123,7 @@ static int first_byte;
 static int prefix_len;
 static int status = ST_IDLE|TREQ;
 static int last_status;
-static int driver_running = 0;
+static int driver_running;
 
 /* debug level 10 required for ADB logging (should be && debug_adb, ideally) */
 
index 1f0aa5dc9aa576eac1060a6ba3e1da55a9ec24b6..2dc788042707fb6dd6abc78abafc84d678c977cd 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/adb.h>
 #include <linux/cuda.h>
 #include <linux/delay.h>
@@ -63,10 +62,10 @@ static volatile unsigned char *via;
 
 #undef DEBUG_MACIISI_ADB
 
-static struct adb_request* current_req = NULL;
-static struct adb_request* last_req = NULL;
+static struct adb_request* current_req;
+static struct adb_request* last_req;
 static unsigned char maciisi_rbuf[16];
-static unsigned char *reply_ptr = NULL;
+static unsigned char *reply_ptr;
 static int data_index;
 static int reading_reply;
 static int reply_len;
index 8ca75e52f637021ea33f49d3c6a4175506313ecc..b6073bdb50c36a73b73e6851ebe6ba2f414801fb 100644 (file)
@@ -141,13 +141,13 @@ static volatile int adb_int_pending;
 static volatile int disable_poll;
 static struct device_node *vias;
 static int pmu_kind = PMU_UNKNOWN;
-static int pmu_fully_inited = 0;
+static int pmu_fully_inited;
 static int pmu_has_adb;
 static struct device_node *gpio_node;
-static unsigned char __iomem *gpio_reg = NULL;
+static unsigned char __iomem *gpio_reg;
 static int gpio_irq = NO_IRQ;
 static int gpio_irq_enabled = -1;
-static volatile int pmu_suspended = 0;
+static volatile int pmu_suspended;
 static spinlock_t pmu_lock;
 static u8 pmu_intr_mask;
 static int pmu_version;
@@ -169,7 +169,7 @@ static int option_server_mode;
 
 int pmu_battery_count;
 int pmu_cur_battery;
-unsigned int pmu_power_flags;
+unsigned int pmu_power_flags = PMU_PWR_AC_PRESENT;
 struct pmu_battery_info pmu_batteries[PMU_MAX_BATTERIES];
 static int query_batt_timer = BATTERY_POLLING_COUNT;
 static struct adb_request batt_req;
@@ -180,7 +180,7 @@ int asleep;
 BLOCKING_NOTIFIER_HEAD(sleep_notifier_list);
 
 #ifdef CONFIG_ADB
-static int adb_dev_map = 0;
+static int adb_dev_map;
 static int pmu_adb_flags;
 
 static int pmu_probe(void);
@@ -516,7 +516,6 @@ static int __init via_pmu_dev_init(void)
                                        proc_get_irqstats, NULL);
                proc_pmu_options = create_proc_entry("options", 0600, proc_pmu_root);
                if (proc_pmu_options) {
-                       proc_pmu_options->nlink = 1;
                        proc_pmu_options->read_proc = proc_read_options;
                        proc_pmu_options->write_proc = proc_write_options;
                }
@@ -2673,7 +2672,7 @@ pmu_ioctl(struct inode * inode, struct file *filp,
        return error;
 }
 
-static struct file_operations pmu_device_fops = {
+static const struct file_operations pmu_device_fops = {
        .read           = pmu_read,
        .write          = pmu_write,
        .poll           = pmu_fpoll,
@@ -2777,7 +2776,7 @@ pmu_polled_request(struct adb_request *req)
 
 #if defined(CONFIG_PM) && defined(CONFIG_PPC32)
 
-static int pmu_sys_suspended = 0;
+static int pmu_sys_suspended;
 
 static int pmu_sys_suspend(struct sys_device *sysdev, pm_message_t state)
 {
@@ -2817,7 +2816,6 @@ static struct sysdev_class pmu_sysclass = {
 };
 
 static struct sys_device device_pmu = {
-       .id             = 0,
        .cls            = &pmu_sysclass,
 };
 
index 93e6ef9233f9ec6bdb9632c06db15e301e666c9c..356c7216a1795e7b4eb183cda6a349e3efdff133 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/delay.h>
-#include <linux/sched.h>
 #include <linux/miscdevice.h>
 #include <linux/blkdev.h>
 #include <linux/pci.h>
@@ -96,10 +95,10 @@ static int data_index;
 static int data_len;
 static int adb_int_pending;
 static int pmu_adb_flags;
-static int adb_dev_map = 0;
+static int adb_dev_map;
 static struct adb_request bright_req_1, bright_req_2, bright_req_3;
 static int pmu_kind = PMU_UNKNOWN;
-static int pmu_fully_inited = 0;
+static int pmu_fully_inited;
 
 int asleep;
 BLOCKING_NOTIFIER_HEAD(sleep_notifier_list);
@@ -1040,7 +1039,7 @@ static int pmu_ioctl(struct inode * inode, struct file *filp,
        return -EINVAL;
 }
 
-static struct file_operations pmu_device_fops = {
+static const struct file_operations pmu_device_fops = {
        .read           = pmu_read,
        .write          = pmu_write,
        .ioctl          = pmu_ioctl,
index 059704fbb753ada7df4f97da979071de1cac073a..5554adaa58f9be01d37bc5623f63384c084e69de 100644 (file)
@@ -666,7 +666,7 @@ static void bitmap_file_put(struct bitmap *bitmap)
 
        if (file) {
                struct inode *inode = file->f_path.dentry->d_inode;
-               invalidate_inode_pages(inode->i_mapping);
+               invalidate_mapping_pages(inode->i_mapping, 0, -1);
                fput(file);
        }
 }
index cd6a184536a1c3ec6ca35bd3d912fe25e7d0f804..b441d82c338a32156a6d270eaa1f7cb5553178f9 100644 (file)
@@ -1473,7 +1473,7 @@ static int ctl_ioctl(struct inode *inode, struct file *file,
        return r;
 }
 
-static struct file_operations _ctl_fops = {
+static const struct file_operations _ctl_fops = {
        .ioctl   = ctl_ioctl,
        .owner   = THIS_MODULE,
 };
index e8807ea5377d75c508e8f791df89eac8ec7ffd65..05febfd9f0712d0875b52dcb4f2c07cd15ff7c8f 100644 (file)
@@ -4920,7 +4920,7 @@ static unsigned int mdstat_poll(struct file *filp, poll_table *wait)
        return mask;
 }
 
-static struct file_operations md_seq_fops = {
+static const struct file_operations md_seq_fops = {
        .owner          = THIS_MODULE,
        .open           = md_seq_open,
        .read           = seq_read,
@@ -5581,7 +5581,7 @@ static int __init md_init(void)
                            md_probe, NULL, NULL);
 
        register_reboot_notifier(&md_notifier);
-       raid_table_header = register_sysctl_table(raid_root_table, 1);
+       raid_table_header = register_sysctl_table(raid_root_table);
 
        md_geninit();
        return (0);
index d867a6a9e43065335894bf93da8f00bc74a46c67..b8dcfa16526665c03aa6342c47ae296acb9bfb92 100644 (file)
@@ -416,7 +416,7 @@ static ssize_t fops_write(struct file *file, const char __user *data, size_t cou
        }
 }
 
-static struct file_operations video_fops =
+static const struct file_operations video_fops =
 {
        .owner          = THIS_MODULE,
        .open           = fops_open,
index e0bd2d8f0f0c92e08235aa9e15db650d43723f21..5347a406fff7e0e73abe885eff3562ca747a10a6 100644 (file)
@@ -190,6 +190,7 @@ int flexcop_i2c_init(struct flexcop_device *fc)
        fc->i2c_adap.class          = I2C_CLASS_TV_DIGITAL;
        fc->i2c_adap.algo       = &flexcop_algo;
        fc->i2c_adap.algo_data  = NULL;
+       fc->i2c_adap.dev.parent = fc->dev;
 
        if ((ret = i2c_add_adapter(&fc->i2c_adap)) < 0)
                return ret;
index 988499dfddf8d8d17bcffbb6522231f9d1485fd0..fc77de45ca4dc415fdaa77634eda086a2e78945e 100644 (file)
@@ -25,7 +25,6 @@
 #include <linux/vmalloc.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
-#include <linux/sched.h>
 #include <linux/poll.h>
 #include <linux/ioctl.h>
 #include <linux/wait.h>
index 40774feb8953d241566ef2cc79d3e5a11d3fdeb2..826b47f155a02cfae38471272360024da72d37f7 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/device.h>
index 55ba020386c97d32db99f288250c5d603a382789..70df31b0a8a9cdecfae95d3f4dea2efc07ad0b5f 100644 (file)
@@ -27,6 +27,7 @@ int dvb_usb_i2c_init(struct dvb_usb_device *d)
 #endif
        d->i2c_adap.algo      = d->props.i2c_algo;
        d->i2c_adap.algo_data = NULL;
+       d->i2c_adap.dev.parent = &d->udev->dev;
 
        i2c_set_adapdata(&d->i2c_adap, d);
 
index 8c577cf30fb379359dc52841642bf2dd24d844ae..795e6e95915c6d5e5a9d25d2033d30f8f6f1903a 100644 (file)
@@ -31,7 +31,6 @@
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/smp_lock.h>
 #include <linux/fs.h>
index dd9aee314e0a389b72f2347c347c5e45ad8df3ee..4251a97d420e81ee128edf9ec0bab913ddd300f4 100644 (file)
@@ -29,7 +29,6 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/delay.h>
 #include <linux/fs.h>
index 37de2e88a273b9616a8af19129f7cf880682d766..4d7150e15d1e1378c244df17f95569bd15f44843 100644 (file)
@@ -32,7 +32,6 @@
 #include <linux/types.h>
 #include <linux/kernel.h>
 #include <linux/string.h>
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/smp_lock.h>
 #include <linux/fs.h>
index 10cfe3131e72aad0ecdeec292d926b5fcab126eb..dbfd5e7b4be0c3ef40b79ec3a4b48a6c6a2855af 100644 (file)
@@ -26,7 +26,6 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/delay.h>
 #include <linux/fs.h>
index 60820deb900b3958e2cc0c43faaa1b5360eab34f..b60cdc93d6dbddab7031a69128acb3114c5f9852 100644 (file)
@@ -1690,6 +1690,7 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i
 #endif
        ttusb->i2c_adap.algo              = &ttusb_dec_algo;
        ttusb->i2c_adap.algo_data         = NULL;
+       ttusb->i2c_adap.dev.parent        = &udev->dev;
 
        result = i2c_add_adapter(&ttusb->i2c_adap);
        if (result) {
index db865a0667e5ae8caed0fd9d8f75c879120ce2d0..df8d0520d1d1e304e47513552e57ff8c7f45eaf1 100644 (file)
@@ -144,7 +144,7 @@ struct dsbr100_device {
 
 
 /* File system interface */
-static struct file_operations usb_dsbr100_fops = {
+static const struct file_operations usb_dsbr100_fops = {
        .owner =        THIS_MODULE,
        .open =         usb_dsbr100_open,
        .release =      usb_dsbr100_close,
index c4312fa0e2f5278d071ef5eea2fe12ae82bf970a..c7c9d1dc06905cb4074c9def7e5bef4c9e05b9d5 100644 (file)
@@ -216,7 +216,7 @@ static struct pcm20_device pcm20_unit = {
        .muted  = 1,
 };
 
-static struct file_operations pcm20_fops = {
+static const struct file_operations pcm20_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index c1b1db65e66821544b541ca37eed4d9fa2491643..aed11477378bd5bf018a9d7a4eec1e9c960ca86e 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/slab.h>
 #include <linux/fs.h>
 #include <linux/miscdevice.h>
-#include <linux/sched.h>       /* current, TASK_*, schedule_timeout() */
 #include <linux/delay.h>
 #include <asm/uaccess.h>
 #include "miropcm20-rds-core.h"
@@ -105,7 +104,7 @@ static ssize_t rds_f_read(struct file *file, char __user *buffer, size_t length,
        }
 }
 
-static struct file_operations rds_fops = {
+static const struct file_operations rds_fops = {
        .owner          = THIS_MODULE,
        .read           = rds_f_read,
        .open           = rds_f_open,
index 3368a89bfadbe356d0b4a7ed46ee3389ea3a3bef..b2e88ad289778e70c8abd2c09ace6bee3897d151 100644 (file)
@@ -358,7 +358,7 @@ static int rt_ioctl(struct inode *inode, struct file *file,
 
 static struct rt_device rtrack_unit;
 
-static struct file_operations rtrack_fops = {
+static const struct file_operations rtrack_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index 3ba5fa8cf7e611f1a8f616a63a63b734827e744c..19d45cc940b55dc33a4e680628a2a75e09ba85a2 100644 (file)
@@ -314,7 +314,7 @@ static int az_ioctl(struct inode *inode, struct file *file,
 
 static struct az_device aztech_unit;
 
-static struct file_operations aztech_fops = {
+static const struct file_operations aztech_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index 69d4b7919c5aa8b8f3f73783d7fc06d9b14c16ac..8fbf0d8bd2783fcf1ca42238b92fc6eceae16bf0 100644 (file)
@@ -507,7 +507,7 @@ cadet_poll(struct file *file, struct poll_table_struct *wait)
 }
 
 
-static struct file_operations cadet_fops = {
+static const struct file_operations cadet_fops = {
        .owner          = THIS_MODULE,
        .open           = cadet_open,
        .release        = cadet_release,
index eb14106f66fa28a33777ce7c53cf368512ff9ac7..05e5aa77025f992ecba9af5ac5a2a5697677ca16 100644 (file)
@@ -346,7 +346,7 @@ MODULE_DEVICE_TABLE( pci, gemtek_pci_id );
 
 static int mx = 1;
 
-static struct file_operations gemtek_pci_fops = {
+static const struct file_operations gemtek_pci_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index 730fe16126cb9598610e5821d020ce2f8f78f485..36c4be6622c710a6af9de1a680221592022f3476 100644 (file)
@@ -296,7 +296,7 @@ static int gemtek_ioctl(struct inode *inode, struct file *file,
 
 static struct gemtek_device gemtek_unit;
 
-static struct file_operations gemtek_fops = {
+static const struct file_operations gemtek_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index e8ce5f75cf1200630b20cf5981a192c0a39ba4e3..e67b7f2580297b9cad40a80244625197d775500d 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/init.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
-#include <linux/sched.h>
 #include <asm/io.h>
 #include <asm/uaccess.h>
 #include <linux/mutex.h>
@@ -99,7 +98,7 @@ static struct pci_driver maestro_r_driver = {
        .remove         = __devexit_p(maestro_remove),
 };
 
-static struct file_operations maestro_fops = {
+static const struct file_operations maestro_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index c2eeae7a10d02eb37e65f1b430ca3deb959edb38..6beeb74004b1349a90f17f97e3f784b77dfc2663 100644 (file)
@@ -35,7 +35,6 @@
 #include <linux/init.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
-#include <linux/sched.h>
 #include <asm/io.h>
 #include <asm/uaccess.h>
 #include <linux/mutex.h>
@@ -91,7 +90,7 @@ module_param(radio_nr, int, 0);
 static int radio_ioctl(struct inode *inode, struct file *file,
                       unsigned int cmd, unsigned long arg);
 
-static struct file_operations maxiradio_fops = {
+static const struct file_operations maxiradio_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index b9e98483e58d18e9a81c7cb56cd7c9250cd0a1e8..f6683872251ed62dc25f806e731c3ff6424bc269 100644 (file)
@@ -262,7 +262,7 @@ static int rt_ioctl(struct inode *inode, struct file *file,
 
 static struct rt_device rtrack2_unit;
 
-static struct file_operations rtrack2_fops = {
+static const struct file_operations rtrack2_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index ecc854b4ba386d4c241e1195c810f64a7a5d3b49..f4619e4dda4ff8cbf3fba6a4de766928859d1253 100644 (file)
@@ -265,7 +265,7 @@ static int fmi_ioctl(struct inode *inode, struct file *file,
 
 static struct fmi_device fmi_unit;
 
-static struct file_operations fmi_fops = {
+static const struct file_operations fmi_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index 4444dce864a932ddeaad7ec8790ca42354d5c9bd..b96fafe1f9da21407c647aab4862caf87f3e64ee 100644 (file)
@@ -410,7 +410,7 @@ static int fmr2_ioctl(struct inode *inode, struct file *file,
 
 static struct fmr2_device fmr2_unit;
 
-static struct file_operations fmr2_fops = {
+static const struct file_operations fmr2_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index f539491a0d76f31e7cdfa874a075c8e24e71a043..d59a27accb843af3e503195b8187478742ac4b39 100644 (file)
@@ -338,7 +338,7 @@ static int tt_ioctl(struct inode *inode, struct file *file,
 
 static struct tt_device terratec_unit;
 
-static struct file_operations terratec_fops = {
+static const struct file_operations terratec_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index bb03ad5a2033bdb117671ef50d30ba6b72fa8692..6d7f1e7116ead9e24c8d99cd5a2ae4626b6bd5be 100644 (file)
@@ -325,7 +325,7 @@ static int tr_ioctl(struct inode *inode, struct file *file,
        return video_usercopy(inode, file, cmd, arg, tr_do_ioctl);
 }
 
-static struct file_operations trust_fops = {
+static const struct file_operations trust_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index 4a72b4d4e62a70b7c174e6cdac0252f96d84e33a..3031fef178cb491d8ab7f02bc9df062e50d3b863 100644 (file)
@@ -318,7 +318,7 @@ static struct typhoon_device typhoon_unit =
        .mutefreq       = CONFIG_RADIO_TYPHOON_MUTEFREQ,
 };
 
-static struct file_operations typhoon_fops = {
+static const struct file_operations typhoon_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index 671fe1b1e5bcec6a028c71804699db75dfb976d4..ec08491fb7c54dc509c91d9249c771c4b62f7c15 100644 (file)
@@ -373,7 +373,7 @@ static int zol_ioctl(struct inode *inode, struct file *file,
 
 static struct zol_device zoltrix_unit;
 
-static struct file_operations zoltrix_fops =
+static const struct file_operations zoltrix_fops =
 {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
index 48709582a18612400040d91a53e4368cb0cf2081..2aa9ce9206074a449919ea8c9897e5805d41896f 100644 (file)
@@ -42,7 +42,6 @@
 #include <asm/io.h>
 #include <asm/pgtable.h>
 #include <asm/page.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 
 #include <linux/videodev.h>
index 68e7d7aff5e6423b4bf51386473fe6c6d2c62663..a3246a283aa4f1661c6f06b2726eeab1a2992343 100644 (file)
@@ -38,7 +38,6 @@
 #include <asm/io.h>
 #include <asm/pgtable.h>
 #include <asm/page.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 
 #include <linux/videodev.h>
index 4861799eb4308ce7a6384766caf22263eb17a8f3..649f52f9ad27602c8d27956f9384dc3694fb0d2d 100644 (file)
@@ -742,7 +742,7 @@ void ar_release(struct video_device *vfd)
  * Video4Linux Module functions
  *
  ****************************************************************************/
-static struct file_operations ar_fops = {
+static const struct file_operations ar_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index e7b38fdd5e3c9389e2032ca1c8c5103a19a120a1..68673863d5c9347ca3e326e9b429bdc74a6a9be4 100644 (file)
@@ -42,7 +42,6 @@
 #include <asm/io.h>
 #include <asm/pgtable.h>
 #include <asm/page.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 
 #include <linux/videodev.h>
index af3b61d4fa7ddacd95f0ac356cf3170818f75a2c..42e2299dcb223774f8faeb067b847ff4a4804c8a 100644 (file)
@@ -42,7 +42,6 @@
 #include <asm/io.h>
 #include <asm/pgtable.h>
 #include <asm/page.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 
 #include <linux/videodev.h>
index ab8f970760f2f5510bf3b136eb11d3195ca6bb59..41fd09d7d11e4dbbb3b714ac9a54b8e667cf615f 100644 (file)
@@ -3174,7 +3174,7 @@ bttv_mmap(struct file *file, struct vm_area_struct *vma)
        return videobuf_mmap_mapper(bttv_queue(fh),vma);
 }
 
-static struct file_operations bttv_fops =
+static const struct file_operations bttv_fops =
 {
        .owner    = THIS_MODULE,
        .open     = bttv_open,
@@ -3332,7 +3332,7 @@ static unsigned int radio_poll(struct file *file, poll_table *wait)
        return cmd.result;
 }
 
-static struct file_operations radio_fops =
+static const struct file_operations radio_fops =
 {
        .owner    = THIS_MODULE,
        .open     = radio_open,
index 63676e7bd635f6b403a69be86e0e24d602c56337..6fc6b026005617815ad4d22533531798d2da2e4b 100644 (file)
@@ -25,7 +25,6 @@
 #include <linux/errno.h>
 #include <linux/fs.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/kdev_t.h>
 #include <asm/io.h>
index 7d0b6e59c6e2449b3030a70a4584499039a1cd66..7d47cbe6ad25ac23654eb26d5789e5f7d848c843 100644 (file)
@@ -871,7 +871,7 @@ static ssize_t qcam_read(struct file *file, char __user *buf,
        return len;
 }
 
-static struct file_operations qcam_fops = {
+static const struct file_operations qcam_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index a3989bd2f81bb99b94c49127d36d7f277ba53689..925ff17efbbcbedea434bef38134ef0c1a5ecae2 100644 (file)
@@ -684,7 +684,7 @@ static ssize_t qcam_read(struct file *file, char __user *buf,
 }
 
 /* video device template */
-static struct file_operations qcam_fops = {
+static const struct file_operations qcam_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index 3083c8075d13af459e033af0cbe6544340b08358..4dae8925667f77cd2cbfb9919321b3d00d87d265 100644 (file)
@@ -549,6 +549,7 @@ static int cafe_smbus_setup(struct cafe_camera *cam)
        adap->client_unregister = cafe_smbus_detach;
        adap->algo = &cafe_smbus_algo;
        strcpy(adap->name, "cafe_ccic");
+       adap->dev.parent = &cam->pdev->dev;
        i2c_set_adapdata(adap, cam);
        ret = i2c_add_adapter(adap);
        if (ret)
@@ -1715,7 +1716,7 @@ static void cafe_v4l_dev_release(struct video_device *vd)
  * clone it for specific real devices.
  */
 
-static struct file_operations cafe_v4l_fops = {
+static const struct file_operations cafe_v4l_fops = {
        .owner = THIS_MODULE,
        .open = cafe_v4l_open,
        .release = cafe_v4l_release,
@@ -1969,7 +1970,7 @@ static ssize_t cafe_dfs_read_regs(struct file *file,
                        s - cafe_debug_buf);
 }
 
-static struct file_operations cafe_dfs_reg_ops = {
+static const struct file_operations cafe_dfs_reg_ops = {
        .owner = THIS_MODULE,
        .read = cafe_dfs_read_regs,
        .open = cafe_dfs_open
@@ -1995,7 +1996,7 @@ static ssize_t cafe_dfs_read_cam(struct file *file,
                        s - cafe_debug_buf);
 }
 
-static struct file_operations cafe_dfs_cam_ops = {
+static const struct file_operations cafe_dfs_cam_ops = {
        .owner = THIS_MODULE,
        .read = cafe_dfs_read_cam,
        .open = cafe_dfs_open
index 3b31a0dd2f0cde9645f8740753922161130654df..7e8d5ef58b61f09ecd3a5e3ec592354a1f31e2af 100644 (file)
@@ -3791,7 +3791,7 @@ static int cpia_mmap(struct file *file, struct vm_area_struct *vma)
        return 0;
 }
 
-static struct file_operations cpia_fops = {
+static const struct file_operations cpia_fops = {
        .owner          = THIS_MODULE,
        .open           = cpia_open,
        .release        = cpia_close,
index d09f49950f2a4be2a885bdfd130ab02825b075b1..1bda7ad9de117b4bc290c8dfbe57b5d682229d62 100644 (file)
@@ -1924,7 +1924,7 @@ static void reset_camera_struct_v4l(struct camera_data *cam)
 /***
  * The v4l video device structure initialized for this device
  ***/
-static struct file_operations fops_template = {
+static const struct file_operations fops_template = {
        .owner          = THIS_MODULE,
        .open           = cpia2_open,
        .release        = cpia2_close,
index 0cf0360588e6c8d30e562f7945f3a5bdd263d143..9a7a2996f20fb75af0a438e331fc567342481b12 100644 (file)
@@ -1051,7 +1051,7 @@ mpeg_mmap(struct file *file, struct vm_area_struct * vma)
        return videobuf_mmap_mapper(&fh->mpegq, vma);
 }
 
-static struct file_operations mpeg_fops =
+static const struct file_operations mpeg_fops =
 {
        .owner         = THIS_MODULE,
        .open          = mpeg_open,
index 2bd84d351a18eb3bf7e9f2301583ed04a004ed16..063df03dcf2ee54c3f6232b42ca23fc93ce25dd1 100644 (file)
@@ -46,7 +46,6 @@
 #include <linux/pci.h>
 #include <linux/signal.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/interrupt.h>
 #include <linux/vmalloc.h>
index 8613378428fdd45899ed30ef81334e69de78808a..c86a7e06235b35f36411c726f9e83ac2ceb5bbb9 100644 (file)
@@ -1808,7 +1808,7 @@ static irqreturn_t cx8800_irq(int irq, void *dev_id)
 /* ----------------------------------------------------------- */
 /* exported stuff                                              */
 
-static struct file_operations video_fops =
+static const struct file_operations video_fops =
 {
        .owner         = THIS_MODULE,
        .open          = video_open,
@@ -1839,7 +1839,7 @@ static struct video_device cx8800_vbi_template =
        .minor         = -1,
 };
 
-static struct file_operations radio_fops =
+static const struct file_operations radio_fops =
 {
        .owner         = THIS_MODULE,
        .open          = video_open,
index 917021fc29933ab373ba7641c03d1923bee56026..ff4b238090aca8a866e2e2e42b8d242522c40ae8 100644 (file)
@@ -696,7 +696,7 @@ static int dabusb_ioctl (struct inode *inode, struct file *file, unsigned int cm
        return ret;
 }
 
-static struct file_operations dabusb_fops =
+static const struct file_operations dabusb_fops =
 {
        .owner =        THIS_MODULE,
        .llseek =       no_llseek,
index 3ffb5684f127ecaa3e9bc68584df8450370edaf0..55d45b0032cff0cda5a84844aaceeff096547d0f 100644 (file)
@@ -25,7 +25,6 @@
 #include <linux/moduleparam.h>
 #include <linux/init.h>
 #include <linux/delay.h>
-#include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/input.h>
 #include <linux/usb.h>
index 36e72c207a8fd0f6577c01c5bf894289425291a2..bec67609500fd1b1d34dbc6ac2d675af651f4169 100644 (file)
@@ -1480,7 +1480,7 @@ static int em28xx_v4l2_ioctl(struct inode *inode, struct file *filp,
        return ret;
 }
 
-static struct file_operations em28xx_v4l_fops = {
+static const struct file_operations em28xx_v4l_fops = {
        .owner = THIS_MODULE,
        .open = em28xx_v4l2_open,
        .release = em28xx_v4l2_close,
index 86e353b26b53091c8deb0590ee18f272bead6d3a..49792ae8c61c15253b291a0d63e3058e1e3f936f 100644 (file)
@@ -2454,7 +2454,7 @@ static int et61x251_ioctl(struct inode* inode, struct file* filp,
 }
 
 
-static struct file_operations et61x251_fops = {
+static const struct file_operations et61x251_fops = {
        .owner = THIS_MODULE,
        .open =    et61x251_open,
        .release = et61x251_release,
index 7420b79e987abe775d81a5135d9d8e2657a227f2..5c2c4029ff86bd76a3872152b198b58259e73936 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/major.h>
 #include <linux/module.h>
 #include <linux/mm.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 
 #include <linux/videodev.h>
index 59edf58204de311935cc3d807b7d2bd3745c148d..210582d420f861c457977ba18ecab8c36e6ef627 100644 (file)
@@ -31,7 +31,6 @@
 #include <linux/moduleparam.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/timer.h>
 #include <linux/delay.h>
index 616a35da191d335c1ad8195043d1fa9086d66ccb..98681da5e3b91fbbd72d9c665c277eaf22e48cea 100644 (file)
@@ -28,7 +28,6 @@
  */
 #include <linux/module.h>
 #include <linux/pci.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/videodev.h>
 #include <media/v4l2-common.h>
@@ -1748,7 +1747,7 @@ static int meye_mmap(struct file *file, struct vm_area_struct *vma)
        return 0;
 }
 
-static struct file_operations meye_fops = {
+static const struct file_operations meye_fops = {
        .owner          = THIS_MODULE,
        .open           = meye_open,
        .release        = meye_release,
index b4db2cbb5a84246151e0d39ca589e7ceb50f915e..e5edff1059a28f43f8a7487f25ac859a9c306d13 100644 (file)
@@ -4653,7 +4653,7 @@ ov51x_v4l1_mmap(struct file *file, struct vm_area_struct *vma)
        return 0;
 }
 
-static struct file_operations ov511_fops = {
+static const struct file_operations ov511_fops = {
        .owner =        THIS_MODULE,
        .open =         ov51x_v4l1_open,
        .release =      ov51x_v4l1_close,
index 5d681fa8bcb18d80504bb92d1bd58fbd90aabbff..b5a67f0dd19f95b6cb3ef88f87525056bc91139f 100644 (file)
@@ -28,7 +28,6 @@
 #include <linux/ioport.h>
 #include <linux/init.h>
 #include <asm/io.h>
-#include <linux/sched.h>
 #include <linux/videodev.h>
 #include <media/v4l2-common.h>
 #include <linux/mutex.h>
@@ -881,7 +880,7 @@ static ssize_t pms_read(struct file *file, char __user *buf,
        return len;
 }
 
-static struct file_operations pms_fops = {
+static const struct file_operations pms_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index f9bb41d8f4f3375896fe3580ad8ac815a6c3b172..62a7cfca837dae7846a5faf299f88ccb4977527e 100644 (file)
@@ -977,6 +977,7 @@ void pvr2_i2c_core_init(struct pvr2_hdw *hdw)
        memcpy(&hdw->i2c_adap,&pvr2_i2c_adap_template,sizeof(hdw->i2c_adap));
        memcpy(&hdw->i2c_algo,&pvr2_i2c_algo_template,sizeof(hdw->i2c_algo));
        strlcpy(hdw->i2c_adap.name,hdw->name,sizeof(hdw->i2c_adap.name));
+       hdw->i2c_adap.dev.parent = &hdw->usb_dev->dev;
        hdw->i2c_adap.algo = &hdw->i2c_algo;
        hdw->i2c_adap.algo_data = hdw;
        hdw->i2c_pend_mask = 0;
index bb40e90859778e28d763395ee3d9d8c3b8889fbf..6cf17080eb49c5deaf29f53d2feb40700612800e 100644 (file)
@@ -986,7 +986,7 @@ static unsigned int pvr2_v4l2_poll(struct file *file, poll_table *wait)
 }
 
 
-static struct file_operations vdev_fops = {
+static const struct file_operations vdev_fops = {
        .owner      = THIS_MODULE,
        .open       = pvr2_v4l2_open,
        .release    = pvr2_v4l2_release,
index a996aad79276fdfe13ff75c21e13f1627e7a0fb7..9825fd3481085cf3d0c921ad9b7460633acab64d 100644 (file)
@@ -152,7 +152,7 @@ static int  pwc_video_ioctl(struct inode *inode, struct file *file,
                            unsigned int ioctlnr, unsigned long arg);
 static int  pwc_video_mmap(struct file *file, struct vm_area_struct *vma);
 
-static struct file_operations pwc_fops = {
+static const struct file_operations pwc_fops = {
        .owner =        THIS_MODULE,
        .open =         pwc_video_open,
        .release =      pwc_video_close,
index 77bb940a1a4f4159c3a6ceafd41cd839188e5367..76f5f5d49dae8ed162abdf3066e9962af2426aa6 100644 (file)
@@ -40,7 +40,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/init.h>
 #include <linux/i2c.h>
@@ -817,7 +816,7 @@ static void __exit cleanup_saa_5246a (void)
 module_init(init_saa_5246a);
 module_exit(cleanup_saa_5246a);
 
-static struct file_operations saa_fops = {
+static const struct file_operations saa_fops = {
        .owner   = THIS_MODULE,
        .open    = saa5246a_open,
        .release = saa5246a_release,
index bb3fb4387f6500ff04dbadf0e003336798c41dd2..3e84737878a866871fb86fec2244b0ba067b761c 100644 (file)
@@ -699,7 +699,7 @@ static void __exit cleanup_saa_5249 (void)
 module_init(init_saa_5249);
 module_exit(cleanup_saa_5249);
 
-static struct file_operations saa_fops = {
+static const struct file_operations saa_fops = {
        .owner          = THIS_MODULE,
        .open           = saa5249_open,
        .release        = saa5249_release,
index 686fd4746205385c23c8b6b53731e37df5de7287..44dc7479119c3f0fbb2254ec8359b4cb3f03b9dd 100644 (file)
@@ -41,7 +41,6 @@
 #include <asm/io.h>
 #include <asm/pgtable.h>
 #include <asm/page.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 
 #include <linux/videodev.h>
index 90398ab8252e62053a6fcf54e41af77a31500d9a..2ce3321ab995032d7ae1c932fcacc458c7856670 100644 (file)
@@ -44,7 +44,6 @@
 #include <asm/io.h>
 #include <asm/pgtable.h>
 #include <asm/page.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 
 #include <linux/videodev.h>
index 708fae51e8ee61555c18ab4f1bae967a9ec8470a..269d7114a93abc8ebf4995a5cbed7ef58af5ccc1 100644 (file)
@@ -35,7 +35,6 @@
 #include <asm/io.h>
 #include <asm/pgtable.h>
 #include <asm/page.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <asm/uaccess.h>
 #include <linux/videodev.h>
index afc8f352b8e713ea66c9a15a50f0fcb05f24ba31..57f1f5d409e0e0f3f11b1b046c4672f57edd16c8 100644 (file)
@@ -1,6 +1,5 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/timer.h>
 #include <linux/delay.h>
index daaae870a2c4eacdb9956f292aac459fd4968fe6..f521603482cab0ed249995eb740889ef2c2fa4ff 100644 (file)
@@ -319,7 +319,7 @@ static int ts_ioctl(struct inode *inode, struct file *file,
        return video_usercopy(inode, file, cmd, arg, ts_do_ioctl);
 }
 
-static struct file_operations ts_fops =
+static const struct file_operations ts_fops =
 {
        .owner    = THIS_MODULE,
        .open     = ts_open,
index 60b38defd9bccf3d86a1428c7a87dc1544100321..e4252683a597018741ca63b57b5c1730b46891f2 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/moduleparam.h>
 #include <linux/init.h>
 #include <linux/delay.h>
-#include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/input.h>
 
index bfcb860d14cc4605cff0b5828f4ba3fd75a95f02..72444f039e3d932ceb685f9d3c40408df08d3e1f 100644 (file)
@@ -563,7 +563,7 @@ static unsigned int dsp_poll(struct file *file, struct poll_table_struct *wait)
        return mask;
 }
 
-struct file_operations saa7134_dsp_fops = {
+const struct file_operations saa7134_dsp_fops = {
        .owner   = THIS_MODULE,
        .open    = dsp_open,
        .release = dsp_release,
@@ -804,7 +804,7 @@ static int mixer_ioctl(struct inode *inode, struct file *file,
        }
 }
 
-struct file_operations saa7134_mixer_fops = {
+const struct file_operations saa7134_mixer_fops = {
        .owner   = THIS_MODULE,
        .open    = mixer_open,
        .release = mixer_release,
index 830617ea81cc5ca0b6c68fce66fe45be112a1fc8..f2cb630530419e946ce5cbbc139df42a67ad0215 100644 (file)
@@ -2336,7 +2336,7 @@ static int radio_ioctl(struct inode *inode, struct file *file,
        return video_usercopy(inode, file, cmd, arg, radio_do_ioctl);
 }
 
-static struct file_operations video_fops =
+static const struct file_operations video_fops =
 {
        .owner    = THIS_MODULE,
        .open     = video_open,
@@ -2349,7 +2349,7 @@ static struct file_operations video_fops =
        .llseek   = no_llseek,
 };
 
-static struct file_operations radio_fops =
+static const struct file_operations radio_fops =
 {
        .owner    = THIS_MODULE,
        .open     = video_open,
index e88ad7b40c47be8880adfed0c15b6eda922526c7..88cd1297df133f4ec0df4e9bea5928004e12ed72 100644 (file)
@@ -683,8 +683,8 @@ int saa_dsp_writel(struct saa7134_dev *dev, int reg, u32 value);
 /* ----------------------------------------------------------- */
 /* saa7134-oss.c                                               */
 
-extern struct file_operations saa7134_dsp_fops;
-extern struct file_operations saa7134_mixer_fops;
+extern const struct file_operations saa7134_dsp_fops;
+extern const struct file_operations saa7134_mixer_fops;
 
 int saa7134_oss_init1(struct saa7134_dev *dev);
 int saa7134_oss_fini(struct saa7134_dev *dev);
index 9c308410856d9ad211d89fd2907e96ffd1dfa2ab..e0fdb1ab7580e02c1e9a64c32d387b6bb3b9bbc2 100644 (file)
@@ -38,7 +38,6 @@
 #include <asm/io.h>
 #include <asm/pgtable.h>
 #include <asm/page.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 
 #include <linux/videodev.h>
index 746cadb8f1c45d9b1af42ad892b98cc4a695df4b..8615a6081a5d2eeae75143c4b6b1a93444807854 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/major.h>
 #include <linux/module.h>
 #include <linux/mm.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 
 #include <linux/videodev.h>
index 7aeec574d7ce349a99a68ebe9272b5bf45e03fb7..038448f5a9781f3e5ea6463c00d411543fe9e2f4 100644 (file)
@@ -1185,7 +1185,7 @@ static int se401_mmap(struct file *file, struct vm_area_struct *vma)
        return 0;
 }
 
-static struct file_operations se401_fops = {
+static const struct file_operations se401_fops = {
        .owner =        THIS_MODULE,
        .open =         se401_open,
        .release =      se401_close,
index 18458d46c0ffde99ddd64c7a25bd0531d653bb18..04d4c8f28b89a97f8f9c345b66c9a38f95cae14a 100644 (file)
@@ -2736,7 +2736,7 @@ static int sn9c102_ioctl(struct inode* inode, struct file* filp,
 
 /*****************************************************************************/
 
-static struct file_operations sn9c102_fops = {
+static const struct file_operations sn9c102_fops = {
        .owner = THIS_MODULE,
        .open =    sn9c102_open,
        .release = sn9c102_release,
index 525d81288d55aada3b9308d871e1505a6d3edb11..3e736be5de84496305cb1ac53767881be4df6955 100644 (file)
@@ -1901,7 +1901,7 @@ static int saa_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations saa_fops = {
+static const struct file_operations saa_fops = {
        .owner = THIS_MODULE,
        .open = saa_open,
        .release = saa_release,
index a1ec3aca3f918b7ecf816eb81667b087cba69e5e..bf3aa8d2d57e3ccc7ecdcbdf29b4e67e2e041aaa 100644 (file)
@@ -1380,7 +1380,7 @@ static ssize_t stv680_read (struct file *file, char __user *buf,
        return realcount;
 }                              /* stv680_read */
 
-static struct file_operations stv680_fops = {
+static const struct file_operations stv680_fops = {
        .owner =        THIS_MODULE,
        .open =         stv_open,
        .release =      stv_close,
index 78e043ac9ea0e39fa2195d0b9ddba060db56361b..d1ccc064206f89c4b865e64e8da7722312d5bab8 100644 (file)
@@ -38,7 +38,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/timer.h>
 #include <linux/delay.h>
index 827633b3bb4325239ed282e96c44aac306bbbc5d..00f0e8b6e03b96621d5c8d0ad3309611c1650404 100644 (file)
@@ -19,7 +19,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/timer.h>
 #include <linux/delay.h>
index ee4a493032d6406815ebf0d1fd1304ebae3ad158..7be73e3763de4d14439a02a8c651a8aeb947bf0d 100644 (file)
@@ -7,7 +7,6 @@
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/timer.h>
 #include <linux/delay.h>
index 1654576de10e9cd5596178d86f342dd385101ffd..7ea9132a1965f86b28b85ef7a504db74bc2b83cd 100644 (file)
@@ -4,7 +4,6 @@
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/timer.h>
 #include <linux/delay.h>
@@ -228,7 +227,7 @@ static struct i2c_driver driver = {
        .detach_client   = tvmixer_clients,
 };
 
-static struct file_operations tvmixer_fops = {
+static const struct file_operations tvmixer_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .ioctl          = tvmixer_ioctl,
index 76f771b6a32ff458896c12f4bdb17fd643e8d710..14db95e10cfee6d8828b9d607b94369ffbf0f449 100644 (file)
@@ -15,7 +15,6 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/module.h>
 #include <linux/init.h>
 
index 10c58b4a2e5b159195fc64f4e6293626603a0421..95453c108d40e650de7c1ddfb14bb8e59916f59b 100644 (file)
@@ -6,7 +6,6 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/module.h>
 #include <linux/init.h>
 
index b560c9d7c5168f492809ddab1308d64fab75e297..d34d8c8b73767bb0bab4b94c38f01ff22f1d4a55 100644 (file)
@@ -945,7 +945,7 @@ static int usbvideo_find_struct(struct usbvideo *cams)
        return rv;
 }
 
-static struct file_operations usbvideo_fops = {
+static const struct file_operations usbvideo_fops = {
        .owner =  THIS_MODULE,
        .open =   usbvideo_v4l_open,
        .release =usbvideo_v4l_close,
index 08f9559a6bfa475e414f7f3b94a52039b32da74d..876fd276824215d35b29e3a539642c80a1df0e15 100644 (file)
@@ -1234,7 +1234,7 @@ static inline void vicam_create_proc_entry(struct vicam_camera *cam) { }
 static inline void vicam_destroy_proc_entry(void *ptr) { }
 #endif
 
-static struct file_operations vicam_fops = {
+static const struct file_operations vicam_fops = {
        .owner          = THIS_MODULE,
        .open           = vicam_open,
        .release        = vicam_close,
index a807d971e27357accfb2e26128e9db6c7563b54f..901f664dc6db4eae563b9dbb35a6ab7971dcfa9d 100644 (file)
@@ -24,7 +24,6 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/list.h>
 #include <linux/timer.h>
 #include <linux/slab.h>
index 858252c15084a3d562d3cb1c981e4c8853c6823f..609e1fd9c784f7304442f1b856ff01fcb9bde7ea 100644 (file)
@@ -34,7 +34,6 @@
 #include <asm/uaccess.h>
 #include <linux/ioport.h>
 #include <linux/errno.h>
-#include <linux/sched.h>
 #include <linux/usb.h>
 #include <linux/i2c.h>
 #include "usbvision.h"
@@ -258,6 +257,7 @@ int usbvision_init_i2c(struct usb_usbvision *usbvision)
        sprintf(usbvision->i2c_adap.name + strlen(usbvision->i2c_adap.name),
                " #%d", usbvision->vdev->minor & 0x1f);
        PDEBUG(DBG_I2C,"Adaptername: %s", usbvision->i2c_adap.name);
+       usbvision->i2c_adap.dev.parent = &usbvision->dev->dev;
 
        i2c_set_adapdata(&usbvision->i2c_adap, usbvision);
        i2c_set_clientdata(&usbvision->i2c_client, usbvision);
index bdd6301d2a47dc6515f172fb37d03a94de528958..af33653f0db8a18b22097785b50ed7f06cdc75a8 100644 (file)
@@ -46,7 +46,6 @@
 
 #include <linux/version.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/list.h>
 #include <linux/timer.h>
 #include <linux/slab.h>
@@ -1475,7 +1474,7 @@ static int usbvision_vbi_ioctl(struct inode *inode, struct file *file,
 //
 
 // Video template
-static struct file_operations usbvision_fops = {
+static const struct file_operations usbvision_fops = {
        .owner             = THIS_MODULE,
        .open           = usbvision_v4l2_open,
        .release        = usbvision_v4l2_close,
@@ -1496,7 +1495,7 @@ static struct video_device usbvision_video_template = {
 
 
 // Radio template
-static struct file_operations usbvision_radio_fops = {
+static const struct file_operations usbvision_radio_fops = {
        .owner             = THIS_MODULE,
        .open           = usbvision_radio_open,
        .release        = usbvision_radio_close,
@@ -1517,7 +1516,7 @@ static struct video_device usbvision_radio_template=
 
 
 // vbi template
-static struct file_operations usbvision_vbi_fops = {
+static const struct file_operations usbvision_vbi_fops = {
        .owner             = THIS_MODULE,
        .open           = usbvision_vbi_open,
        .release        = usbvision_vbi_close,
index b87d571e046337122bcfd0759a885ac006089482..b8ee37ded3c98c1cedf4cd5b4ee79a3f1e58dec1 100644 (file)
@@ -47,7 +47,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/smp_lock.h>
 #include <linux/mm.h>
 #include <linux/string.h>
index 6a0e8ca7294803056cf29d11716d7ed175b35e5f..a786c1f5b9601a98474f70073cb107df1ff9e0bc 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/smp_lock.h>
 #include <linux/mm.h>
 #include <linux/string.h>
@@ -1561,7 +1560,7 @@ out:
 }
 
 
-static struct file_operations video_fops;
+static const struct file_operations video_fops;
 
 /**
  *     video_register_device - register video4linux devices
@@ -1709,7 +1708,7 @@ void video_unregister_device(struct video_device *vfd)
 /*
  * Video fs operations
  */
-static struct file_operations video_fops=
+static const struct file_operations video_fops=
 {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
index a373c142e74229c9e0c90388d1ab6859d6cec4e0..0c658b74f2c428aabff64c71e106d901e016d15f 100644 (file)
@@ -4390,7 +4390,7 @@ static int vino_ioctl(struct inode *inode, struct file *file,
 // __initdata
 static int vino_init_stage = 0;
 
-static struct file_operations vino_fops = {
+static const struct file_operations vino_fops = {
        .owner          = THIS_MODULE,
        .open           = vino_open,
        .release        = vino_close,
index d4cf5566673149b0708aff82bf42599fa55cc6cb..cfb6b1f0402c0e24885f37b9ad9adcd5a22e0bd3 100644 (file)
@@ -1292,7 +1292,7 @@ vivi_mmap(struct file *file, struct vm_area_struct * vma)
        return ret;
 }
 
-static struct file_operations vivi_fops = {
+static const struct file_operations vivi_fops = {
        .owner          = THIS_MODULE,
        .open           = vivi_open,
        .release        = vivi_release,
index 8d14f308f171a9087a9ff87fc64627489c69664e..47366408637c7928a7a097a9ebffda1aa90125f0 100644 (file)
@@ -183,7 +183,7 @@ static int w9966_v4l_ioctl(struct inode *inode, struct file *file,
 static ssize_t w9966_v4l_read(struct file *file, char __user *buf,
                              size_t count, loff_t *ppos);
 
-static struct file_operations w9966_fops = {
+static const struct file_operations w9966_fops = {
        .owner          = THIS_MODULE,
        .open           = video_exclusive_open,
        .release        = video_exclusive_release,
index 9f403af7b040773ccba4b4bdaa7255ff21ec59de..8f31613b9903897b52fe42f12c9533559d120a5f 100644 (file)
@@ -399,7 +399,7 @@ MODULE_PARM_DESC(specific_debug,
  ****************************************************************************/
 
 /* Video4linux interface */
-static struct file_operations w9968cf_fops;
+static const struct file_operations w9968cf_fops;
 static int w9968cf_open(struct inode*, struct file*);
 static int w9968cf_release(struct inode*, struct file*);
 static int w9968cf_mmap(struct file*, struct vm_area_struct*);
@@ -1573,6 +1573,7 @@ static int w9968cf_i2c_init(struct w9968cf_device* cam)
 
        memcpy(&cam->i2c_adapter, &adap, sizeof(struct i2c_adapter));
        strcpy(cam->i2c_adapter.name, "w9968cf");
+       cam->i2c_adapter.dev.parent = &cam->usbdev->dev;
        i2c_set_adapdata(&cam->i2c_adapter, cam);
 
        DBG(6, "Registering I2C adapter with kernel...")
@@ -3466,7 +3467,7 @@ ioctl_fail:
 }
 
 
-static struct file_operations w9968cf_fops = {
+static const struct file_operations w9968cf_fops = {
        .owner =   THIS_MODULE,
        .open =    w9968cf_open,
        .release = w9968cf_release,
index 52d0f759ee0029dbcda52cbaa64112fe89219ad3..8da7f15f62908a52441cb3fe464c78b1186008d0 100644 (file)
@@ -1871,7 +1871,7 @@ static int zc0301_ioctl(struct inode* inode, struct file* filp,
 }
 
 
-static struct file_operations zc0301_fops = {
+static const struct file_operations zc0301_fops = {
        .owner =   THIS_MODULE,
        .open =    zc0301_open,
        .release = zc0301_release,
index 4d1eb2fba34a8c7d5ec8edd30d76adf1376645fc..73162a3a61dd4182c03921c76595fbdcc53b93ec 100644 (file)
@@ -843,6 +843,7 @@ zoran_register_i2c (struct zoran *zr)
                sizeof(I2C_NAME(&zr->i2c_adapter)) - 1);
        i2c_set_adapdata(&zr->i2c_adapter, zr);
        zr->i2c_adapter.algo_data = &zr->i2c_algo;
+       zr->i2c_adapter.dev.parent = &zr->pci_dev->dev;
        return i2c_bit_add_bus(&zr->i2c_adapter);
 }
 
index 862a984c2155c6d8a739f54f4007f90b1a20f13b..074323733352739dd1384d8c4fed9167ec332807 100644 (file)
@@ -562,7 +562,6 @@ jpg_fbuffer_alloc (struct file *file)
                        jpg_fbuffer_free(file);
                        return -ENOBUFS;
                }
-               memset((void *) mem, 0, PAGE_SIZE);
                fh->jpg_buffers.buffer[i].frag_tab = (u32 *) mem;
                fh->jpg_buffers.buffer[i].frag_tab_bus =
                    virt_to_bus((void *) mem);
@@ -4680,7 +4679,7 @@ zoran_mmap (struct file           *file,
        return 0;
 }
 
-static struct file_operations zoran_fops = {
+static const struct file_operations zoran_fops = {
        .owner = THIS_MODULE,
        .open = zoran_open,
        .release = zoran_close,
index c374c76b37531efcf3b18f5124cf1e7106f7d8a9..446ae8d5c3df97a9aca4e2541dd9ef6e21b7e212 100644 (file)
@@ -186,7 +186,7 @@ static ssize_t zoran_write(struct file *file, const char __user *buffer,
        return count;
 }
 
-static struct file_operations zoran_operations = {
+static const struct file_operations zoran_operations = {
        .open           = zoran_open,
        .read           = seq_read,
        .write          = zoran_write,
index ea31d84705107ca361d7cc0d59992a0aca3e97a3..71037f91c222611e8d9933d441fb29a4337f4096 100644 (file)
@@ -66,7 +66,7 @@ config FUSION_MAX_SGE
 
 config FUSION_CTL
        tristate "Fusion MPT misc device (ioctl) driver"
-       depends on FUSION_SPI || FUSION_FC
+       depends on FUSION_SPI || FUSION_FC || FUSION_SAS
        ---help---
          The Fusion MPT misc device driver provides specialized control
          of MPT adapters via system ioctl calls.  Use of ioctl calls to
index 341691390e86370bec5ccfd37b73b8aa9266c92d..6003b46c8438163367695238695171c3d59cb8e7 100644 (file)
@@ -8,6 +8,9 @@
 #EXTRA_CFLAGS += -DMPT_DEBUG_INIT
 #EXTRA_CFLAGS += -DMPT_DEBUG_EXIT
 #EXTRA_CFLAGS += -DMPT_DEBUG_FAIL
+#EXTRA_CFLAGS += -DMPT_DEBUG_DV
+#EXTRA_CFLAGS += -DMPT_DEBUG_TM
+#EXTRA_CFLAGS += -DMPT_DEBUG_REPLY
 
 #
 # driver/module specifics...
 #CFLAGS_mptbase.o += -DMPT_DEBUG_RESET
 #
 #  For mptscsih:
-#CFLAGS_mptscsih.o += -DMPT_DEBUG_DV
-#CFLAGS_mptscsih.o += -DMPT_DEBUG_NEGO
-#CFLAGS_mptscsih.o += -DMPT_DEBUG_TM
 #CFLAGS_mptscsih.o += -DMPT_DEBUG_SCSI
-#CFLAGS_mptscsih.o += -DMPT_DEBUG_REPLY
 #
 #  For mptctl:
 #CFLAGS_mptctl.o += -DMPT_DEBUG_IOCTL
index 81ad77622dacee63e3b0aa23054d12eadd087812..75223bf24ae86fa8449e19976d09518ba51f7deb 100644 (file)
@@ -1,12 +1,12 @@
 /*
- *  Copyright (c) 2000-2005 LSI Logic Corporation.
+ *  Copyright (c) 2000-2006 LSI Logic Corporation.
  *
  *
  *           Name:  mpi.h
  *          Title:  MPI Message independent structures and definitions
  *  Creation Date:  July 27, 2000
  *
- *    mpi.h Version:  01.05.11
+ *    mpi.h Version:  01.05.12
  *
  *  Version History
  *  ---------------
@@ -77,6 +77,7 @@
  *  08-03-05  01.05.09  Bumped MPI_HEADER_VERSION_UNIT.
  *  08-30-05  01.05.10  Added 2 new IOCStatus codes for Target.
  *  03-27-06  01.05.11  Bumped MPI_HEADER_VERSION_UNIT.
+ *  10-11-06  01.05.12  Bumped MPI_HEADER_VERSION_UNIT.
  *  --------------------------------------------------------------------------
  */
 
 /* Note: The major versions of 0xe0 through 0xff are reserved */
 
 /* versioning for this MPI header set */
-#define MPI_HEADER_VERSION_UNIT             (0x0D)
+#define MPI_HEADER_VERSION_UNIT             (0x0E)
 #define MPI_HEADER_VERSION_DEV              (0x00)
 #define MPI_HEADER_VERSION_UNIT_MASK        (0xFF00)
 #define MPI_HEADER_VERSION_UNIT_SHIFT       (8)
index 47e13e360c10aea30975a44c18e4f9ca36319288..0e4c8e77a81dc7efcc8dbf39f1cd4bf0282a57a1 100644 (file)
@@ -1,12 +1,12 @@
 /*
- *  Copyright (c) 2000-2005 LSI Logic Corporation.
+ *  Copyright (c) 2000-2006 LSI Logic Corporation.
  *
  *
  *           Name:  mpi_cnfg.h
  *          Title:  MPI Config message, structures, and Pages
  *  Creation Date:  July 27, 2000
  *
- *    mpi_cnfg.h Version:  01.05.12
+ *    mpi_cnfg.h Version:  01.05.13
  *
  *  Version History
  *  ---------------
  *                      Added AdditionalControlFlags, MaxTargetPortConnectTime,
  *                      ReportDeviceMissingDelay, and IODeviceMissingDelay
  *                      fields to SAS IO Unit Page 1.
+ *  10-11-06  01.05.13  Added NumForceWWID field and ForceWWID array to
+ *                      Manufacturing Page 5.
+ *                      Added Manufacturing pages 8 through 10.
+ *                      Added defines for supported metadata size bits in
+ *                      CapabilitiesFlags field of IOC Page 6.
+ *                      Added defines for metadata size bits in VolumeSettings
+ *                      field of RAID Volume Page 0.
+ *                      Added SATA Link Reset settings, Enable SATA Asynchronous
+ *                      Notification bit, and HideNonZeroAttachedPhyIdentifiers
+ *                      bit to AdditionalControlFlags field of SAS IO Unit
+ *                      Page 1.
+ *                      Added defines for Enclosure Devices Unmapped and
+ *                      Device Limit Exceeded bits in Status field of SAS IO
+ *                      Unit Page 2.
+ *                      Added more AccessStatus values for SAS Device Page 0.
+ *                      Added bit for SATA Asynchronous Notification Support in
+ *                      Flags field of SAS Device Page 0.
  *  --------------------------------------------------------------------------
  */
 
@@ -654,17 +671,24 @@ typedef struct _CONFIG_PAGE_MANUFACTURING_4
 #define MPI_MANPAGE4_IR_NO_MIX_SAS_SATA                 (0x01)
 
 
+#ifndef MPI_MANPAGE5_NUM_FORCEWWID
+#define MPI_MANPAGE5_NUM_FORCEWWID      (1)
+#endif
+
 typedef struct _CONFIG_PAGE_MANUFACTURING_5
 {
     CONFIG_PAGE_HEADER              Header;             /* 00h */
     U64                             BaseWWID;           /* 04h */
     U8                              Flags;              /* 0Ch */
-    U8                              Reserved1;          /* 0Dh */
+    U8                              NumForceWWID;       /* 0Dh */
     U16                             Reserved2;          /* 0Eh */
+    U32                             Reserved3;          /* 10h */
+    U32                             Reserved4;          /* 14h */
+    U64                             ForceWWID[MPI_MANPAGE5_NUM_FORCEWWID]; /* 18h */
 } CONFIG_PAGE_MANUFACTURING_5, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_5,
   ManufacturingPage5_t, MPI_POINTER pManufacturingPage5_t;
 
-#define MPI_MANUFACTURING5_PAGEVERSION                  (0x01)
+#define MPI_MANUFACTURING5_PAGEVERSION                  (0x02)
 
 /* defines for the Flags field */
 #define MPI_MANPAGE5_TWO_WWID_PER_PHY                   (0x01)
@@ -740,6 +764,36 @@ typedef struct _CONFIG_PAGE_MANUFACTURING_7
 #define MPI_MANPAGE7_FLAG_USE_SLOT_INFO                 (0x00000001)
 
 
+typedef struct _CONFIG_PAGE_MANUFACTURING_8
+{
+    CONFIG_PAGE_HEADER              Header;             /* 00h */
+    U32                             ProductSpecificInfo;/* 04h */
+} CONFIG_PAGE_MANUFACTURING_8, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_8,
+  ManufacturingPage8_t, MPI_POINTER pManufacturingPage8_t;
+
+#define MPI_MANUFACTURING8_PAGEVERSION                  (0x00)
+
+
+typedef struct _CONFIG_PAGE_MANUFACTURING_9
+{
+    CONFIG_PAGE_HEADER              Header;             /* 00h */
+    U32                             ProductSpecificInfo;/* 04h */
+} CONFIG_PAGE_MANUFACTURING_9, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_9,
+  ManufacturingPage9_t, MPI_POINTER pManufacturingPage9_t;
+
+#define MPI_MANUFACTURING6_PAGEVERSION                  (0x00)
+
+
+typedef struct _CONFIG_PAGE_MANUFACTURING_10
+{
+    CONFIG_PAGE_HEADER              Header;             /* 00h */
+    U32                             ProductSpecificInfo;/* 04h */
+} CONFIG_PAGE_MANUFACTURING_10, MPI_POINTER PTR_CONFIG_PAGE_MANUFACTURING_10,
+  ManufacturingPage10_t, MPI_POINTER pManufacturingPage10_t;
+
+#define MPI_MANUFACTURING10_PAGEVERSION                 (0x00)
+
+
 /****************************************************************************
 *   IO Unit Config Pages
 ****************************************************************************/
@@ -1080,10 +1134,14 @@ typedef struct _CONFIG_PAGE_IOC_6
 } CONFIG_PAGE_IOC_6, MPI_POINTER PTR_CONFIG_PAGE_IOC_6,
   IOCPage6_t, MPI_POINTER pIOCPage6_t;
 
-#define MPI_IOCPAGE6_PAGEVERSION                        (0x00)
+#define MPI_IOCPAGE6_PAGEVERSION                        (0x01)
 
 /* IOC Page 6 Capabilities Flags */
 
+#define MPI_IOCPAGE6_CAP_FLAGS_MASK_METADATA_SIZE       (0x00000006)
+#define MPI_IOCPAGE6_CAP_FLAGS_64MB_METADATA_SIZE       (0x00000000)
+#define MPI_IOCPAGE6_CAP_FLAGS_512MB_METADATA_SIZE      (0x00000002)
+
 #define MPI_IOCPAGE6_CAP_FLAGS_GLOBAL_HOT_SPARE         (0x00000001)
 
 
@@ -2160,6 +2218,11 @@ typedef struct _RAID_VOL0_SETTINGS
 #define MPI_RAIDVOL0_SETTING_AUTO_CONFIGURE             (0x0004)
 #define MPI_RAIDVOL0_SETTING_PRIORITY_RESYNC            (0x0008)
 #define MPI_RAIDVOL0_SETTING_FAST_DATA_SCRUBBING_0102   (0x0020) /* obsolete */
+
+#define MPI_RAIDVOL0_SETTING_MASK_METADATA_SIZE         (0x00C0)
+#define MPI_RAIDVOL0_SETTING_64MB_METADATA_SIZE         (0x0000)
+#define MPI_RAIDVOL0_SETTING_512MB_METADATA_SIZE        (0x0040)
+
 #define MPI_RAIDVOL0_SETTING_USE_PRODUCT_ID_SUFFIX      (0x0010)
 #define MPI_RAIDVOL0_SETTING_USE_DEFAULTS               (0x8000)
 
@@ -2203,7 +2266,7 @@ typedef struct _CONFIG_PAGE_RAID_VOL_0
 } CONFIG_PAGE_RAID_VOL_0, MPI_POINTER PTR_CONFIG_PAGE_RAID_VOL_0,
   RaidVolumePage0_t, MPI_POINTER pRaidVolumePage0_t;
 
-#define MPI_RAIDVOLPAGE0_PAGEVERSION                    (0x06)
+#define MPI_RAIDVOLPAGE0_PAGEVERSION                    (0x07)
 
 /* values for RAID Volume Page 0 InactiveStatus field */
 #define MPI_RAIDVOLPAGE0_UNKNOWN_INACTIVE               (0x00)
@@ -2518,7 +2581,7 @@ typedef struct _CONFIG_PAGE_SAS_IO_UNIT_1
 } CONFIG_PAGE_SAS_IO_UNIT_1, MPI_POINTER PTR_CONFIG_PAGE_SAS_IO_UNIT_1,
   SasIOUnitPage1_t, MPI_POINTER pSasIOUnitPage1_t;
 
-#define MPI_SASIOUNITPAGE1_PAGEVERSION      (0x06)
+#define MPI_SASIOUNITPAGE1_PAGEVERSION      (0x07)
 
 /* values for SAS IO Unit Page 1 ControlFlags */
 #define MPI_SAS_IOUNIT1_CONTROL_DEVICE_SELF_TEST            (0x8000)
@@ -2544,7 +2607,13 @@ typedef struct _CONFIG_PAGE_SAS_IO_UNIT_1
 #define MPI_SAS_IOUNIT1_CONTROL_CLEAR_AFFILIATION           (0x0001)
 
 /* values for SAS IO Unit Page 1 AdditionalControlFlags */
-#define MPI_SAS_IOUNIT1_ACONTROL_ALLOW_TABLE_TO_TABLE       (0x0001)
+#define MPI_SAS_IOUNIT1_ACONTROL_SATA_ASYNCHROUNOUS_NOTIFICATION    (0x0040)
+#define MPI_SAS_IOUNIT1_ACONTROL_HIDE_NONZERO_ATTACHED_PHY_IDENT    (0x0020)
+#define MPI_SAS_IOUNIT1_ACONTROL_PORT_ENABLE_ONLY_SATA_LINK_RESET   (0x0010)
+#define MPI_SAS_IOUNIT1_ACONTROL_OTHER_AFFILIATION_SATA_LINK_RESET  (0x0008)
+#define MPI_SAS_IOUNIT1_ACONTROL_SELF_AFFILIATION_SATA_LINK_RESET   (0x0004)
+#define MPI_SAS_IOUNIT1_ACONTROL_NO_AFFILIATION_SATA_LINK_RESET     (0x0002)
+#define MPI_SAS_IOUNIT1_ACONTROL_ALLOW_TABLE_TO_TABLE               (0x0001)
 
 /* defines for SAS IO Unit Page 1 ReportDeviceMissingDelay */
 #define MPI_SAS_IOUNIT1_REPORT_MISSING_TIMEOUT_MASK         (0x7F)
@@ -2585,9 +2654,11 @@ typedef struct _CONFIG_PAGE_SAS_IO_UNIT_2
 } CONFIG_PAGE_SAS_IO_UNIT_2, MPI_POINTER PTR_CONFIG_PAGE_SAS_IO_UNIT_2,
   SasIOUnitPage2_t, MPI_POINTER pSasIOUnitPage2_t;
 
-#define MPI_SASIOUNITPAGE2_PAGEVERSION      (0x05)
+#define MPI_SASIOUNITPAGE2_PAGEVERSION      (0x06)
 
 /* values for SAS IO Unit Page 2 Status field */
+#define MPI_SAS_IOUNIT2_STATUS_DEVICE_LIMIT_EXCEEDED        (0x08)
+#define MPI_SAS_IOUNIT2_STATUS_ENCLOSURE_DEVICES_UNMAPPED   (0x04)
 #define MPI_SAS_IOUNIT2_STATUS_DISABLED_PERSISTENT_MAPPINGS (0x02)
 #define MPI_SAS_IOUNIT2_STATUS_FULL_PERSISTENT_MAPPINGS     (0x01)
 
@@ -2739,24 +2810,38 @@ typedef struct _CONFIG_PAGE_SAS_DEVICE_0
 } CONFIG_PAGE_SAS_DEVICE_0, MPI_POINTER PTR_CONFIG_PAGE_SAS_DEVICE_0,
   SasDevicePage0_t, MPI_POINTER pSasDevicePage0_t;
 
-#define MPI_SASDEVICE0_PAGEVERSION          (0x04)
+#define MPI_SASDEVICE0_PAGEVERSION          (0x05)
 
 /* values for SAS Device Page 0 AccessStatus field */
-#define MPI_SAS_DEVICE0_ASTATUS_NO_ERRORS               (0x00)
-#define MPI_SAS_DEVICE0_ASTATUS_SATA_INIT_FAILED        (0x01)
-#define MPI_SAS_DEVICE0_ASTATUS_SATA_CAPABILITY_FAILED  (0x02)
+#define MPI_SAS_DEVICE0_ASTATUS_NO_ERRORS                   (0x00)
+#define MPI_SAS_DEVICE0_ASTATUS_SATA_INIT_FAILED            (0x01)
+#define MPI_SAS_DEVICE0_ASTATUS_SATA_CAPABILITY_FAILED      (0x02)
+#define MPI_SAS_DEVICE0_ASTATUS_SATA_AFFILIATION_CONFLICT   (0x03)
+/* specific values for SATA Init failures */
+#define MPI_SAS_DEVICE0_ASTATUS_SIF_UNKNOWN                 (0x10)
+#define MPI_SAS_DEVICE0_ASTATUS_SIF_AFFILIATION_CONFLICT    (0x11)
+#define MPI_SAS_DEVICE0_ASTATUS_SIF_DIAG                    (0x12)
+#define MPI_SAS_DEVICE0_ASTATUS_SIF_IDENTIFICATION          (0x13)
+#define MPI_SAS_DEVICE0_ASTATUS_SIF_CHECK_POWER             (0x14)
+#define MPI_SAS_DEVICE0_ASTATUS_SIF_PIO_SN                  (0x15)
+#define MPI_SAS_DEVICE0_ASTATUS_SIF_MDMA_SN                 (0x16)
+#define MPI_SAS_DEVICE0_ASTATUS_SIF_UDMA_SN                 (0x17)
+#define MPI_SAS_DEVICE0_ASTATUS_SIF_ZONING_VIOLATION        (0x18)
+#define MPI_SAS_DEVICE0_ASTATUS_SIF_NOT_ADDRESSABLE         (0x19)
+#define MPI_SAS_DEVICE0_ASTATUS_SIF_MAX                     (0x1F)
 
 /* values for SAS Device Page 0 Flags field */
-#define MPI_SAS_DEVICE0_FLAGS_SATA_SW_PRESERVE          (0x0200)
-#define MPI_SAS_DEVICE0_FLAGS_UNSUPPORTED_DEVICE        (0x0100)
-#define MPI_SAS_DEVICE0_FLAGS_SATA_48BIT_LBA_SUPPORTED  (0x0080)
-#define MPI_SAS_DEVICE0_FLAGS_SATA_SMART_SUPPORTED      (0x0040)
-#define MPI_SAS_DEVICE0_FLAGS_SATA_NCQ_SUPPORTED        (0x0020)
-#define MPI_SAS_DEVICE0_FLAGS_SATA_FUA_SUPPORTED        (0x0010)
-#define MPI_SAS_DEVICE0_FLAGS_PORT_SELECTOR_ATTACH      (0x0008)
-#define MPI_SAS_DEVICE0_FLAGS_MAPPING_PERSISTENT        (0x0004)
-#define MPI_SAS_DEVICE0_FLAGS_DEVICE_MAPPED             (0x0002)
-#define MPI_SAS_DEVICE0_FLAGS_DEVICE_PRESENT            (0x0001)
+#define MPI_SAS_DEVICE0_FLAGS_SATA_ASYNCHRONOUS_NOTIFY      (0x0400)
+#define MPI_SAS_DEVICE0_FLAGS_SATA_SW_PRESERVE              (0x0200)
+#define MPI_SAS_DEVICE0_FLAGS_UNSUPPORTED_DEVICE            (0x0100)
+#define MPI_SAS_DEVICE0_FLAGS_SATA_48BIT_LBA_SUPPORTED      (0x0080)
+#define MPI_SAS_DEVICE0_FLAGS_SATA_SMART_SUPPORTED          (0x0040)
+#define MPI_SAS_DEVICE0_FLAGS_SATA_NCQ_SUPPORTED            (0x0020)
+#define MPI_SAS_DEVICE0_FLAGS_SATA_FUA_SUPPORTED            (0x0010)
+#define MPI_SAS_DEVICE0_FLAGS_PORT_SELECTOR_ATTACH          (0x0008)
+#define MPI_SAS_DEVICE0_FLAGS_MAPPING_PERSISTENT            (0x0004)
+#define MPI_SAS_DEVICE0_FLAGS_DEVICE_MAPPED                 (0x0002)
+#define MPI_SAS_DEVICE0_FLAGS_DEVICE_PRESENT                (0x0001)
 
 /* see mpi_sas.h for values for SAS Device Page 0 DeviceInfo values */
 
index 582cfe7c2aa10a81b823aeda0d025e0bd7687431..d6b4c607453bdde0cd1179e40cab7786e52ee231 100644 (file)
@@ -3,28 +3,28 @@
  MPI Header File Change History
  ==============================
 
- Copyright (c) 2000-2005 LSI Logic Corporation.
+ Copyright (c) 2000-2006 LSI Logic Corporation.
 
  ---------------------------------------
- Header Set Release Version:    01.05.13
- Header Set Release Date:       03-27-06
+ Header Set Release Version:    01.05.14
+ Header Set Release Date:       10-11-06
  ---------------------------------------
 
  Filename               Current version     Prior version
  ----------             ---------------     -------------
- mpi.h                  01.05.11            01.05.10
- mpi_ioc.h              01.05.11            01.05.10
- mpi_cnfg.h             01.05.12            01.05.11
- mpi_init.h             01.05.07            01.05.06
- mpi_targ.h             01.05.06            01.05.05
+ mpi.h                  01.05.12            01.05.11
+ mpi_ioc.h              01.05.12            01.05.11
+ mpi_cnfg.h             01.05.13            01.05.12
+ mpi_init.h             01.05.08            01.05.07
+ mpi_targ.h             01.05.06            01.05.06
  mpi_fc.h               01.05.01            01.05.01
  mpi_lan.h              01.05.01            01.05.01
  mpi_raid.h             01.05.02            01.05.02
  mpi_tool.h             01.05.03            01.05.03
  mpi_inb.h              01.05.01            01.05.01
- mpi_sas.h              01.05.03            01.05.02
+ mpi_sas.h              01.05.04            01.05.03
  mpi_type.h             01.05.02            01.05.02
- mpi_history.txt        01.05.13            01.05.12
+ mpi_history.txt        01.05.14            01.05.13
 
 
  *  Date      Version   Description
@@ -94,6 +94,7 @@ mpi.h
  *  08-03-05  01.05.09  Bumped MPI_HEADER_VERSION_UNIT.
  *  08-30-05  01.05.10  Added 2 new IOCStatus codes for Target.
  *  03-27-06  01.05.11  Bumped MPI_HEADER_VERSION_UNIT.
+ *  10-11-06  01.05.12  Bumped MPI_HEADER_VERSION_UNIT.
  *  --------------------------------------------------------------------------
 
 mpi_ioc.h
@@ -182,6 +183,14 @@ mpi_ioc.h
  *                      Added MPI_EVENT_SAS_INIT_TABLE_OVERFLOW and event
  *                      data structure.
  *                      Added MPI_EXT_IMAGE_TYPE_INITIALIZATION.
+ *  10-11-06  01.05.12  Added MPI_IOCFACTS_EXCEPT_METADATA_UNSUPPORTED.
+ *                      Added MaxInitiators field to PortFacts reply.
+ *                      Added SAS Device Status Change ReasonCode for
+ *                      asynchronous notificaiton.
+ *                      Added MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE and event
+ *                      data structure.
+ *                      Added new ImageType values for FWDownload and FWUpload
+ *                      requests.
  *  --------------------------------------------------------------------------
 
 mpi_cnfg.h
@@ -447,6 +456,23 @@ mpi_cnfg.h
  *                      Added AdditionalControlFlags, MaxTargetPortConnectTime,
  *                      ReportDeviceMissingDelay, and IODeviceMissingDelay
  *                      fields to SAS IO Unit Page 1.
+ *  10-11-06  01.05.13  Added NumForceWWID field and ForceWWID array to
+ *                      Manufacturing Page 5.
+ *                      Added Manufacturing pages 8 through 10.
+ *                      Added defines for supported metadata size bits in
+ *                      CapabilitiesFlags field of IOC Page 6.
+ *                      Added defines for metadata size bits in VolumeSettings
+ *                      field of RAID Volume Page 0.
+ *                      Added SATA Link Reset settings, Enable SATA Asynchronous
+ *                      Notification bit, and HideNonZeroAttachedPhyIdentifiers
+ *                      bit to AdditionalControlFlags field of SAS IO Unit
+ *                      Page 1.
+ *                      Added defines for Enclosure Devices Unmapped and
+ *                      Device Limit Exceeded bits in Status field of SAS IO
+ *                      Unit Page 2.
+ *                      Added more AccessStatus values for SAS Device Page 0.
+ *                      Added bit for SATA Asynchronous Notification Support in
+ *                      Flags field of SAS Device Page 0.
  *  --------------------------------------------------------------------------
 
 mpi_init.h
@@ -490,6 +516,7 @@ mpi_init.h
  *  08-03-05  01.05.06  Fixed some MPI_SCSIIO32_MSGFLGS_ defines to make them
  *                      unique in the first 32 characters.
  *  03-27-06  01.05.07  Added Task Management type of Clear ACA.
+ *  10-11-06  01.05.08  Shortened define for Task Management type of Clear ACA.
  *  --------------------------------------------------------------------------
 
 mpi_targ.h
@@ -638,6 +665,8 @@ mpi_sas.h
  *                      and Remove Device operations to SAS IO Unit Control.
  *                      Added DevHandle field to SAS IO Unit Control request and
  *                      reply.
+ *  10-11-06  01.05.04  Fixed the name of a define for Operation field of SAS IO
+ *                      Unit Control request.
  *  --------------------------------------------------------------------------
 
 mpi_type.h
@@ -653,20 +682,20 @@ mpi_type.h
 
 mpi_history.txt         Parts list history
 
-Filename    01.05.13  01.05.12  01.05.11  01.05.10  01.05.09
-----------  --------  --------  --------  --------  --------
-mpi.h       01.05.11  01.05.10  01.05.09  01.05.08  01.05.07
-mpi_ioc.h   01.05.11  01.05.10  01.05.09  01.05.09  01.05.08
-mpi_cnfg.h  01.05.12  01.05.11  01.05.10  01.05.09  01.05.08
-mpi_init.h  01.05.07  01.05.06  01.05.06  01.05.05  01.05.04
-mpi_targ.h  01.05.06  01.05.05  01.05.05  01.05.05  01.05.04
-mpi_fc.h    01.05.01  01.05.01  01.05.01  01.05.01  01.05.01
-mpi_lan.h   01.05.01  01.05.01  01.05.01  01.05.01  01.05.01
-mpi_raid.h  01.05.02  01.05.02  01.05.02  01.05.02  01.05.02
-mpi_tool.h  01.05.03  01.05.03  01.05.03  01.05.03  01.05.03
-mpi_inb.h   01.05.01  01.05.01  01.05.01  01.05.01  01.05.01
-mpi_sas.h   01.05.03  01.05.02  01.05.01  01.05.01  01.05.01
-mpi_type.h  01.05.02  01.05.02  01.05.01  01.05.01  01.05.01
+Filename    01.05.13   01.05.13   01.05.12   01.05.11   01.05.10   01.05.09
+----------  --------   --------   --------   --------   --------   --------
+mpi.h       01.05.12   01.05.11   01.05.10   01.05.09   01.05.08   01.05.07
+mpi_ioc.h   01.05.12   01.05.11   01.05.10   01.05.09   01.05.09   01.05.08
+mpi_cnfg.h  01.05.13   01.05.12   01.05.11   01.05.10   01.05.09   01.05.08
+mpi_init.h  01.05.08   01.05.07   01.05.06   01.05.06   01.05.05   01.05.04
+mpi_targ.h  01.05.06   01.05.06   01.05.05   01.05.05   01.05.05   01.05.04
+mpi_fc.h    01.05.01   01.05.01   01.05.01   01.05.01   01.05.01   01.05.01
+mpi_lan.h   01.05.01   01.05.01   01.05.01   01.05.01   01.05.01   01.05.01
+mpi_raid.h  01.05.02   01.05.02   01.05.02   01.05.02   01.05.02   01.05.02
+mpi_tool.h  01.05.03   01.05.03   01.05.03   01.05.03   01.05.03   01.05.03
+mpi_inb.h   01.05.01   01.05.01   01.05.01   01.05.01   01.05.01   01.05.01
+mpi_sas.h   01.05.04   01.05.03   01.05.02   01.05.01   01.05.01   01.05.01
+mpi_type.h  01.05.02   01.05.02   01.05.02   01.05.01   01.05.01   01.05.01
 
 Filename    01.05.08   01.05.07   01.05.06   01.05.05   01.05.04   01.05.03
 ----------  --------   --------   --------   --------   --------   --------
index c1c678989a2370335d548d2facd15d70970446df..ec9dff2249a7f429e12bbbedb22f45dc7f7f70d3 100644 (file)
@@ -1,12 +1,12 @@
 /*
- *  Copyright (c) 2000-2005 LSI Logic Corporation.
+ *  Copyright (c) 2000-2006 LSI Logic Corporation.
  *
  *
  *           Name:  mpi_init.h
  *          Title:  MPI initiator mode messages and structures
  *  Creation Date:  June 8, 2000
  *
- *    mpi_init.h Version:  01.05.07
+ *    mpi_init.h Version:  01.05.08
  *
  *  Version History
  *  ---------------
@@ -53,6 +53,7 @@
  *  08-03-05  01.05.06  Fixed some MPI_SCSIIO32_MSGFLGS_ defines to make them
  *                      unique in the first 32 characters.
  *  03-27-06  01.05.07  Added Task Management type of Clear ACA.
+ *  10-11-06  01.05.08  Shortened define for Task Management type of Clear ACA.
  *  --------------------------------------------------------------------------
  */
 
@@ -428,7 +429,7 @@ typedef struct _MSG_SCSI_TASK_MGMT
 #define MPI_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET    (0x05)
 #define MPI_SCSITASKMGMT_TASKTYPE_CLEAR_TASK_SET        (0x06)
 #define MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK            (0x07)
-#define MPI_SCSITASKMGMT_TASKTYPE_CLEAR_ACA             (0x08)
+#define MPI_SCSITASKMGMT_TASKTYPE_CLR_ACA               (0x08)
 
 /* MsgFlags bits */
 #define MPI_SCSITASKMGMT_MSGFLAGS_TARGET_RESET_OPTION   (0x00)
index 18ba407fd3998093694c58c5b2f313aba6cbe008..6c33e335337557c65c452e26abaec840449e254c 100644 (file)
@@ -1,12 +1,12 @@
 /*
- *  Copyright (c) 2000-2005 LSI Logic Corporation.
+ *  Copyright (c) 2000-2006 LSI Logic Corporation.
  *
  *
  *           Name:  mpi_ioc.h
  *          Title:  MPI IOC, Port, Event, FW Download, and FW Upload messages
  *  Creation Date:  August 11, 2000
  *
- *    mpi_ioc.h Version:  01.05.11
+ *    mpi_ioc.h Version:  01.05.12
  *
  *  Version History
  *  ---------------
  *                      Added MPI_EVENT_SAS_INIT_TABLE_OVERFLOW and event
  *                      data structure.
  *                      Added MPI_EXT_IMAGE_TYPE_INITIALIZATION.
+ *  10-11-06  01.05.12  Added MPI_IOCFACTS_EXCEPT_METADATA_UNSUPPORTED.
+ *                      Added MaxInitiators field to PortFacts reply.
+ *                      Added SAS Device Status Change ReasonCode for
+ *                      asynchronous notificaiton.
+ *                      Added MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE and event
+ *                      data structure.
+ *                      Added new ImageType values for FWDownload and FWUpload
+ *                      requests.
  *  --------------------------------------------------------------------------
  */
 
@@ -264,6 +272,7 @@ typedef struct _MSG_IOC_FACTS_REPLY
 #define MPI_IOCFACTS_EXCEPT_RAID_CONFIG_INVALID         (0x0002)
 #define MPI_IOCFACTS_EXCEPT_FW_CHECKSUM_FAIL            (0x0004)
 #define MPI_IOCFACTS_EXCEPT_PERSISTENT_TABLE_FULL       (0x0008)
+#define MPI_IOCFACTS_EXCEPT_METADATA_UNSUPPORTED        (0x0010)
 
 #define MPI_IOCFACTS_FLAGS_FW_DOWNLOAD_BOOT             (0x01)
 #define MPI_IOCFACTS_FLAGS_REPLY_FIFO_HOST_SIGNAL       (0x02)
@@ -328,7 +337,8 @@ typedef struct _MSG_PORT_FACTS_REPLY
      U16                    MaxPostedCmdBuffers;        /* 1Ch */
      U16                    MaxPersistentIDs;           /* 1Eh */
      U16                    MaxLanBuckets;              /* 20h */
-     U16                    Reserved4;                  /* 22h */
+     U8                     MaxInitiators;              /* 22h */
+     U8                     Reserved4;                  /* 23h */
      U32                    Reserved5;                  /* 24h */
 } MSG_PORT_FACTS_REPLY, MPI_POINTER PTR_MSG_PORT_FACTS_REPLY,
   PortFactsReply_t, MPI_POINTER pPortFactsReply_t;
@@ -487,6 +497,7 @@ typedef struct _MSG_EVENT_ACK_REPLY
 #define MPI_EVENT_SAS_INIT_DEVICE_STATUS_CHANGE (0x00000018)
 #define MPI_EVENT_SAS_INIT_TABLE_OVERFLOW       (0x00000019)
 #define MPI_EVENT_SAS_SMP_ERROR                 (0x0000001A)
+#define MPI_EVENT_SAS_EXPANDER_STATUS_CHANGE    (0x0000001B)
 #define MPI_EVENT_LOG_ENTRY_ADDED               (0x00000021)
 
 /* AckRequired field values */
@@ -593,6 +604,7 @@ typedef struct _EVENT_DATA_SAS_DEVICE_STATUS_CHANGE
 #define MPI_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL   (0x0A)
 #define MPI_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL   (0x0B)
 #define MPI_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL       (0x0C)
+#define MPI_EVENT_SAS_DEV_STAT_RC_ASYNC_NOTIFICATION        (0x0D)
 
 
 /* SCSI Event data for Queue Full event */
@@ -895,6 +907,54 @@ typedef struct _EVENT_DATA_SAS_INIT_TABLE_OVERFLOW
   MpiEventDataSasInitTableOverflow_t,
   MPI_POINTER pMpiEventDataSasInitTableOverflow_t;
 
+/* SAS Expander Status Change Event data */
+
+typedef struct _EVENT_DATA_SAS_EXPANDER_STATUS_CHANGE
+{
+    U8                      ReasonCode;             /* 00h */
+    U8                      Reserved1;              /* 01h */
+    U16                     Reserved2;              /* 02h */
+    U8                      PhysicalPort;           /* 04h */
+    U8                      Reserved3;              /* 05h */
+    U16                     EnclosureHandle;        /* 06h */
+    U64                     SASAddress;             /* 08h */
+    U32                     DiscoveryStatus;        /* 10h */
+    U16                     DevHandle;              /* 14h */
+    U16                     ParentDevHandle;        /* 16h */
+    U16                     ExpanderChangeCount;    /* 18h */
+    U16                     ExpanderRouteIndexes;   /* 1Ah */
+    U8                      NumPhys;                /* 1Ch */
+    U8                      SASLevel;               /* 1Dh */
+    U8                      Flags;                  /* 1Eh */
+    U8                      Reserved4;              /* 1Fh */
+} EVENT_DATA_SAS_EXPANDER_STATUS_CHANGE,
+  MPI_POINTER PTR_EVENT_DATA_SAS_EXPANDER_STATUS_CHANGE,
+  MpiEventDataSasExpanderStatusChange_t,
+  MPI_POINTER pMpiEventDataSasExpanderStatusChange_t;
+
+/* values for ReasonCode field of SAS Expander Status Change Event data */
+#define MPI_EVENT_SAS_EXP_RC_ADDED                      (0x00)
+#define MPI_EVENT_SAS_EXP_RC_NOT_RESPONDING             (0x01)
+
+/* values for DiscoveryStatus field of SAS Expander Status Change Event data */
+#define MPI_EVENT_SAS_EXP_DS_LOOP_DETECTED              (0x00000001)
+#define MPI_EVENT_SAS_EXP_DS_UNADDRESSABLE_DEVICE       (0x00000002)
+#define MPI_EVENT_SAS_EXP_DS_MULTIPLE_PORTS             (0x00000004)
+#define MPI_EVENT_SAS_EXP_DS_EXPANDER_ERR               (0x00000008)
+#define MPI_EVENT_SAS_EXP_DS_SMP_TIMEOUT                (0x00000010)
+#define MPI_EVENT_SAS_EXP_DS_OUT_ROUTE_ENTRIES          (0x00000020)
+#define MPI_EVENT_SAS_EXP_DS_INDEX_NOT_EXIST            (0x00000040)
+#define MPI_EVENT_SAS_EXP_DS_SMP_FUNCTION_FAILED        (0x00000080)
+#define MPI_EVENT_SAS_EXP_DS_SMP_CRC_ERROR              (0x00000100)
+#define MPI_EVENT_SAS_EXP_DS_SUBTRACTIVE_LINK           (0x00000200)
+#define MPI_EVENT_SAS_EXP_DS_TABLE_LINK                 (0x00000400)
+#define MPI_EVENT_SAS_EXP_DS_UNSUPPORTED_DEVICE         (0x00000800)
+
+/* values for Flags field of SAS Expander Status Change Event data */
+#define MPI_EVENT_SAS_EXP_FLAGS_ROUTE_TABLE_CONFIG      (0x02)
+#define MPI_EVENT_SAS_EXP_FLAGS_CONFIG_IN_PROGRESS      (0x01)
+
+
 
 /*****************************************************************************
 *
@@ -926,6 +986,10 @@ typedef struct _MSG_FW_DOWNLOAD
 #define MPI_FW_DOWNLOAD_ITYPE_BIOS              (0x02)
 #define MPI_FW_DOWNLOAD_ITYPE_NVDATA            (0x03)
 #define MPI_FW_DOWNLOAD_ITYPE_BOOTLOADER        (0x04)
+#define MPI_FW_DOWNLOAD_ITYPE_MANUFACTURING     (0x06)
+#define MPI_FW_DOWNLOAD_ITYPE_CONFIG_1          (0x07)
+#define MPI_FW_DOWNLOAD_ITYPE_CONFIG_2          (0x08)
+#define MPI_FW_DOWNLOAD_ITYPE_MEGARAID          (0x09)
 
 
 typedef struct _FWDownloadTCSGE
@@ -980,6 +1044,11 @@ typedef struct _MSG_FW_UPLOAD
 #define MPI_FW_UPLOAD_ITYPE_NVDATA          (0x03)
 #define MPI_FW_UPLOAD_ITYPE_BOOTLOADER      (0x04)
 #define MPI_FW_UPLOAD_ITYPE_FW_BACKUP       (0x05)
+#define MPI_FW_UPLOAD_ITYPE_MANUFACTURING   (0x06)
+#define MPI_FW_UPLOAD_ITYPE_CONFIG_1        (0x07)
+#define MPI_FW_UPLOAD_ITYPE_CONFIG_2        (0x08)
+#define MPI_FW_UPLOAD_ITYPE_MEGARAID        (0x09)
+#define MPI_FW_UPLOAD_ITYPE_COMPLETE        (0x0A)
 
 typedef struct _FWUploadTCSGE
 {
index 871ebc08b706133de56ea0ef96f5b248dda12aff..635bbe04513e44ac04893c5b0a3609fdd63d3e9c 100644 (file)
@@ -1,4 +1,3 @@
-
 /***************************************************************************
  *                                                                         *
  *  Copyright 2003 LSI Logic Corporation.  All rights reserved.            *
@@ -14,7 +13,7 @@
 #define IOPI_IOCLOGINFO_H_INCLUDED
 
 #define SAS_LOGINFO_NEXUS_LOSS         0x31170000
-#define SAS_LOGINFO_MASK                       0xFFFF0000
+#define SAS_LOGINFO_MASK               0xFFFF0000
 
 /****************************************************************************/
 /*  IOC LOGINFO defines, 0x00000000 - 0x0FFFFFFF                            */
 /****************************************************************************/
 /* IOP LOGINFO_CODE defines, valid if IOC_LOGINFO_ORIGINATOR = IOP          */
 /****************************************************************************/
-#define IOP_LOGINFO_CODE_INVALID_SAS_ADDRESS            (0x00010000)
-#define IOP_LOGINFO_CODE_UNUSED2                        (0x00020000)
-#define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE            (0x00030000)
-#define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE_RT         (0x00030100) /* Route Table Entry not found */
-#define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE_PN         (0x00030200) /* Invalid Page Number */
-#define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE_FORM       (0x00030300) /* Invalid FORM */
-#define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE_PT         (0x00030400) /* Invalid Page Type */
-#define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE_DNM        (0x00030500) /* Device Not Mapped */
-#define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE_PERSIST    (0x00030600) /* Persistent Page not found */
-#define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE_DEFAULT    (0x00030700) /* Default Page not found */
-
-#define IOP_LOGINFO_CODE_DIAG_MSG_ERROR                 (0x00040000) /* Error handling diag msg - or'd with diag status */
-
-#define IOP_LOGINFO_CODE_TASK_TERMINATED                (0x00050000)
-
-#define IOP_LOGINFO_CODE_ENCL_MGMT_READ_ACTION_ERR0R    (0x00060001) /* Read Action not supported for SEP msg */
-#define IOP_LOGINFO_CODE_ENCL_MGMT_INVALID_BUS_ID_ERR0R (0x00060002) /* Invalid Bus/ID in SEP msg */
-
-#define IOP_LOGINFO_CODE_TARGET_ASSIST_TERMINATED       (0x00070001)
-#define IOP_LOGINFO_CODE_TARGET_STATUS_SEND_TERMINATED  (0x00070002)
-#define IOP_LOGINFO_CODE_TARGET_MODE_ABORT_ALL_IO       (0x00070003)
-#define IOP_LOGINFO_CODE_TARGET_MODE_ABORT_EXACT_IO     (0x00070004)
-#define IOP_LOGINFO_CODE_TARGET_MODE_ABORT_EXACT_IO_REQ (0x00070005)
+#define IOP_LOGINFO_CODE_INVALID_SAS_ADDRESS                 (0x00010000)
+#define IOP_LOGINFO_CODE_UNUSED2                             (0x00020000)
+#define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE                 (0x00030000)
+#define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE_RT              (0x00030100) /* Route Table Entry not found */
+#define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE_PN              (0x00030200) /* Invalid Page Number */
+#define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE_FORM            (0x00030300) /* Invalid FORM */
+#define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE_PT              (0x00030400) /* Invalid Page Type */
+#define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE_DNM             (0x00030500) /* Device Not Mapped */
+#define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE_PERSIST         (0x00030600) /* Persistent Page not found */
+#define IOP_LOGINFO_CODE_CONFIG_INVALID_PAGE_DEFAULT         (0x00030700) /* Default Page not found */
+
+#define IOP_LOGINFO_CODE_FWUPLOAD_NO_FLASH_AVAILABLE         (0x0003E000) /* Tried to upload from flash, but there is none */
+#define IOP_LOGINFO_CODE_FWUPLOAD_UNKNOWN_IMAGE_TYPE         (0x0003E001) /* ImageType field contents were invalid */
+#define IOP_LOGINFO_CODE_FWUPLOAD_WRONG_IMAGE_SIZE           (0x0003E002) /* ImageSize field in TCSGE was bad/offset in MfgPg 4 was wrong */
+#define IOP_LOGINFO_CODE_FWUPLOAD_ENTIRE_FLASH_UPLOAD_FAILED (0x0003E003) /* Error occured while attempting to upload the entire flash */
+#define IOP_LOGINFO_CODE_FWUPLOAD_REGION_UPLOAD_FAILED       (0x0003E004) /* Error occured while attempting to upload single flash region */
+#define IOP_LOGINFO_CODE_FWUPLOAD_DMA_FAILURE                (0x0003E005) /* Problem occured while DMAing FW to host memory */
+
+#define IOP_LOGINFO_CODE_DIAG_MSG_ERROR                      (0x00040000) /* Error handling diag msg - or'd with diag status */
+
+#define IOP_LOGINFO_CODE_TASK_TERMINATED                     (0x00050000)
+
+#define IOP_LOGINFO_CODE_ENCL_MGMT_READ_ACTION_ERR0R         (0x00060001) /* Read Action not supported for SEP msg */
+#define IOP_LOGINFO_CODE_ENCL_MGMT_INVALID_BUS_ID_ERR0R      (0x00060002) /* Invalid Bus/ID in SEP msg */
+
+#define IOP_LOGINFO_CODE_TARGET_ASSIST_TERMINATED            (0x00070001)
+#define IOP_LOGINFO_CODE_TARGET_STATUS_SEND_TERMINATED       (0x00070002)
+#define IOP_LOGINFO_CODE_TARGET_MODE_ABORT_ALL_IO            (0x00070003)
+#define IOP_LOGINFO_CODE_TARGET_MODE_ABORT_EXACT_IO          (0x00070004)
+#define IOP_LOGINFO_CODE_TARGET_MODE_ABORT_EXACT_IO_REQ      (0x00070005)
 
 /****************************************************************************/
 /* PL LOGINFO_CODE defines, valid if IOC_LOGINFO_ORIGINATOR = PL            */
 /****************************************************************************/
-#define PL_LOGINFO_CODE_OPEN_FAILURE                        (0x00010000)
-#define PL_LOG_INFO_CODE_OPEN_FAILURE_NO_DEST_TIME_OUT      (0x00010001)
-#define PL_LOGINFO_CODE_OPEN_FAILURE_BAD_DESTINATION        (0x00010011)
-#define PL_LOGINFO_CODE_OPEN_FAILURE_PROTOCOL_NOT_SUPPORTED (0x00010013)
-#define PL_LOGINFO_CODE_OPEN_FAILURE_STP_RESOURCES_BSY      (0x00010018)
-#define PL_LOGINFO_CODE_OPEN_FAILURE_WRONG_DESTINATION      (0x00010019)
-#define PL_LOGINFO_CODE_OPEN_FAILURE_ORR_TIMEOUT            (0X0001001A)
-#define PL_LOGINFO_CODE_OPEN_FAILURE_PATHWAY_BLOCKED        (0x0001001B)
-#define PL_LOGINFO_CODE_OPEN_FAILURE_AWT_MAXED              (0x0001001C)
-#define PL_LOGINFO_CODE_INVALID_SGL                         (0x00020000)
-#define PL_LOGINFO_CODE_WRONG_REL_OFF_OR_FRAME_LENGTH       (0x00030000)
-#define PL_LOGINFO_CODE_FRAME_XFER_ERROR                    (0x00040000)
-#define PL_LOGINFO_CODE_TX_FM_CONNECTED_LOW                 (0x00050000)
-#define PL_LOGINFO_CODE_SATA_NON_NCQ_RW_ERR_BIT_SET         (0x00060000)
-#define PL_LOGINFO_CODE_SATA_READ_LOG_RECEIVE_DATA_ERR      (0x00070000)
-#define PL_LOGINFO_CODE_SATA_NCQ_FAIL_ALL_CMDS_AFTR_ERR     (0x00080000)
-#define PL_LOGINFO_CODE_SATA_ERR_IN_RCV_SET_DEV_BIT_FIS     (0x00090000)
-#define PL_LOGINFO_CODE_RX_FM_INVALID_MESSAGE               (0x000A0000)
-#define PL_LOGINFO_CODE_RX_CTX_MESSAGE_VALID_ERROR          (0x000B0000)
-#define PL_LOGINFO_CODE_RX_FM_CURRENT_FRAME_ERROR           (0x000C0000)
-#define PL_LOGINFO_CODE_SATA_LINK_DOWN                      (0x000D0000)
-#define PL_LOGINFO_CODE_DISCOVERY_SATA_INIT_W_IOS           (0x000E0000)
-#define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE                 (0x000F0000)
-#define PL_LOGINFO_CODE_CONFIG_PL_NOT_INITIALIZED           (0x000F0001) /* PL not yet initialized, can't do config page req. */
-#define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_PT              (0x000F0100) /* Invalid Page Type */
-#define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_NUM_PHYS        (0x000F0200) /* Invalid Number of Phys */
-#define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_NOT_IMP         (0x000F0300) /* Case Not Handled */
-#define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_NO_DEV          (0x000F0400) /* No Device Found */
-#define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_FORM            (0x000F0500) /* Invalid FORM */
-#define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_PHY             (0x000F0600) /* Invalid Phy */
-#define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_NO_OWNER        (0x000F0700) /* No Owner Found */
-#define PL_LOGINFO_CODE_DSCVRY_SATA_INIT_TIMEOUT            (0x00100000)
-#define PL_LOGINFO_CODE_RESET                               (0x00110000) /* See Sub-Codes below */
-#define PL_LOGINFO_CODE_ABORT                               (0x00120000) /* See Sub-Codes below */
-#define PL_LOGINFO_CODE_IO_NOT_YET_EXECUTED                 (0x00130000)
-#define PL_LOGINFO_CODE_IO_EXECUTED                         (0x00140000)
-#define PL_LOGINFO_CODE_PERS_RESV_OUT_NOT_AFFIL_OWNER       (0x00150000)
-#define PL_LOGINFO_CODE_OPEN_TXDMA_ABORT                    (0x00160000)
-#define PL_LOGINFO_CODE_IO_DEVICE_MISSING_DELAY_RETRY       (0x00170000)
-#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE                    (0x00000100)
-#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_NO_DEST_TIMEOUT    (0x00000101)
-#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_ORR_TIMEOUT        (0x0000011A) /* Open Reject (Retry) Timeout */
-#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_PATHWAY_BLOCKED    (0x0000011B)
-#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_AWT_MAXED          (0x0000011C) /* Arbitration Wait Timer Maxed */
-
-#define PL_LOGINFO_SUB_CODE_TARGET_BUS_RESET                (0x00000120)
-#define PL_LOGINFO_SUB_CODE_TRANSPORT_LAYER                 (0x00000130)  /* Leave lower nibble (1-f) reserved. */
-#define PL_LOGINFO_SUB_CODE_PORT_LAYER                      (0x00000140)  /* Leave lower nibble (1-f) reserved. */
-
-
-#define PL_LOGINFO_SUB_CODE_INVALID_SGL                     (0x00000200)
-#define PL_LOGINFO_SUB_CODE_WRONG_REL_OFF_OR_FRAME_LENGTH   (0x00000300)
-#define PL_LOGINFO_SUB_CODE_FRAME_XFER_ERROR                (0x00000400)
-#define PL_LOGINFO_SUB_CODE_TX_FM_CONNECTED_LOW             (0x00000500)
-#define PL_LOGINFO_SUB_CODE_SATA_NON_NCQ_RW_ERR_BIT_SET     (0x00000600)
-#define PL_LOGINFO_SUB_CODE_SATA_READ_LOG_RECEIVE_DATA_ERR  (0x00000700)
-#define PL_LOGINFO_SUB_CODE_SATA_NCQ_FAIL_ALL_CMDS_AFTR_ERR (0x00000800)
-#define PL_LOGINFO_SUB_CODE_SATA_ERR_IN_RCV_SET_DEV_BIT_FIS (0x00000900)
-#define PL_LOGINFO_SUB_CODE_RX_FM_INVALID_MESSAGE           (0x00000A00)
-#define PL_LOGINFO_SUB_CODE_RX_CTX_MESSAGE_VALID_ERROR      (0x00000B00)
-#define PL_LOGINFO_SUB_CODE_RX_FM_CURRENT_FRAME_ERROR       (0x00000C00)
-#define PL_LOGINFO_SUB_CODE_SATA_LINK_DOWN                  (0x00000D00)
-#define PL_LOGINFO_SUB_CODE_DISCOVERY_SATA_INIT_W_IOS       (0x00000E00)
-#define PL_LOGINFO_SUB_CODE_DISCOVERY_REMOTE_SEP_RESET      (0x00000E01)
-#define PL_LOGINFO_SUB_CODE_SECOND_OPEN                     (0x00000F00)
-#define PL_LOGINFO_SUB_CODE_DSCVRY_SATA_INIT_TIMEOUT        (0x00001000)
-
-
-#define PL_LOGINFO_CODE_ENCL_MGMT_SMP_FRAME_FAILURE         (0x00200000) /* Can't get SMP Frame */
-#define PL_LOGINFO_CODE_ENCL_MGMT_SMP_READ_ERROR            (0x00200010) /* Error occured on SMP Read */
-#define PL_LOGINFO_CODE_ENCL_MGMT_SMP_WRITE_ERROR           (0x00200020) /* Error occured on SMP Write */
-#define PL_LOGINFO_CODE_ENCL_MGMT_NOT_SUPPORTED_ON_ENCL     (0x00200040) /* Encl Mgmt services not available for this WWID */
-#define PL_LOGINFO_CODE_ENCL_MGMT_ADDR_MODE_NOT_SUPPORTED   (0x00200050) /* Address Mode not suppored */
-#define PL_LOGINFO_CODE_ENCL_MGMT_BAD_SLOT_NUM              (0x00200060) /* Invalid Slot Number in SEP Msg */
-#define PL_LOGINFO_CODE_ENCL_MGMT_SGPIO_NOT_PRESENT         (0x00200070) /* SGPIO not present/enabled */
-#define PL_LOGINFO_CODE_ENCL_MGMT_GPIO_NOT_CONFIGURED       (0x00200080) /* GPIO not configured */
-#define PL_LOGINFO_CODE_ENCL_MGMT_GPIO_FRAME_ERROR          (0x00200090) /* GPIO can't allocate a frame */
-#define PL_LOGINFO_CODE_ENCL_MGMT_GPIO_CONFIG_PAGE_ERROR    (0x002000A0) /* GPIO failed config page request */
-#define PL_LOGINFO_CODE_ENCL_MGMT_SES_FRAME_ALLOC_ERROR     (0x002000B0) /* Can't get frame for SES command */
-#define PL_LOGINFO_CODE_ENCL_MGMT_SES_IO_ERROR              (0x002000C0) /* I/O execution error */
-#define PL_LOGINFO_CODE_ENCL_MGMT_SES_RETRIES_EXHAUSTED     (0x002000D0) /* SEP I/O retries exhausted */
-#define PL_LOGINFO_CODE_ENCL_MGMT_SMP_FRAME_ALLOC_ERROR     (0x002000E0) /* Can't get frame for SMP command */
-
-#define PL_LOGINFO_DA_SEP_NOT_PRESENT                       (0x00200100) /* SEP not present when msg received */
-#define PL_LOGINFO_DA_SEP_SINGLE_THREAD_ERROR               (0x00200101) /* Can only accept 1 msg at a time */
-#define PL_LOGINFO_DA_SEP_ISTWI_INTR_IN_IDLE_STATE          (0x00200102) /* ISTWI interrupt recvd. while IDLE */
-#define PL_LOGINFO_DA_SEP_RECEIVED_NACK_FROM_SLAVE          (0x00200103) /* SEP NACK'd, it is busy */
-#define PL_LOGINFO_DA_SEP_DID_NOT_RECEIVE_ACK               (0x00200104) /* SEP didn't rcv. ACK (Last Rcvd Bit = 1) */
-#define PL_LOGINFO_DA_SEP_BAD_STATUS_HDR_CHKSUM             (0x00200105) /* SEP stopped or sent bad chksum in Hdr */
-#define PL_LOGINFO_DA_SEP_STOP_ON_DATA                      (0x00200106) /* SEP stopped while transfering data */
-#define PL_LOGINFO_DA_SEP_STOP_ON_SENSE_DATA                (0x00200107) /* SEP stopped while transfering sense data */
-#define PL_LOGINFO_DA_SEP_UNSUPPORTED_SCSI_STATUS_1         (0x00200108) /* SEP returned unknown scsi status */
-#define PL_LOGINFO_DA_SEP_UNSUPPORTED_SCSI_STATUS_2         (0x00200109) /* SEP returned unknown scsi status */
-#define PL_LOGINFO_DA_SEP_CHKSUM_ERROR_AFTER_STOP           (0x0020010A) /* SEP returned bad chksum after STOP */
-#define PL_LOGINFO_DA_SEP_CHKSUM_ERROR_AFTER_STOP_GETDATA   (0x0020010B) /* SEP returned bad chksum after STOP while gettin data*/
-#define PL_LOGINFO_DA_SEP_UNSUPPORTED_COMMAND               (0x0020010C) /* SEP doesn't support CDB opcode */
+#define PL_LOGINFO_CODE_OPEN_FAILURE                         (0x00010000) /* see SUB_CODE_OPEN_FAIL_ below */
+
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_NO_DEST_TIME_OUT       (0x00000001)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_PATHWAY_BLOCKED        (0x00000002)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_RES_CONTINUE0          (0x00000003)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_RES_CONTINUE1          (0x00000004)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_RES_INITIALIZE0        (0x00000005)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_RES_INITIALIZE1        (0x00000006)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_RES_STOP0              (0x00000007)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_RES_STOP1              (0x00000008)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_RETRY                  (0x00000009)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_BREAK                  (0x0000000A)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_UNUSED_0B              (0x0000000B)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_OPEN_TIMEOUT_EXP       (0x0000000C)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_UNUSED_0D              (0x0000000D)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_DVTBLE_ACCSS_FAIL      (0x0000000E)
+#define PL_LOGINFO_SUB CODE_OPEN_FAIL_BAD_DEST               (0x00000011)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_RATE_NOT_SUPP          (0x00000012)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_PROT_NOT_SUPP          (0x00000013)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_RESERVED_ABANDON0      (0x00000014)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_RESERVED_ABANDON1      (0x00000015)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_RESERVED_ABANDON2      (0x00000016)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_RESERVED_ABANDON3      (0x00000017)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_STP_RESOURCES_BSY      (0x00000018)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_WRONG_DESTINATION      (0x00000019)
+
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_PATH_BLOCKED           (0x0000001B) /* Retry Timeout */
+#define PL_LOGINFO_SUB_CODE_OPEN_FAIL_AWT_MAXED              (0x0000001C) /* Retry Timeout */
+
+
+
+#define PL_LOGINFO_CODE_INVALID_SGL                          (0x00020000)
+#define PL_LOGINFO_CODE_WRONG_REL_OFF_OR_FRAME_LENGTH        (0x00030000)
+#define PL_LOGINFO_CODE_FRAME_XFER_ERROR                     (0x00040000)
+#define PL_LOGINFO_CODE_TX_FM_CONNECTED_LOW                  (0x00050000)
+#define PL_LOGINFO_CODE_SATA_NON_NCQ_RW_ERR_BIT_SET          (0x00060000)
+#define PL_LOGINFO_CODE_SATA_READ_LOG_RECEIVE_DATA_ERR       (0x00070000)
+#define PL_LOGINFO_CODE_SATA_NCQ_FAIL_ALL_CMDS_AFTR_ERR      (0x00080000)
+#define PL_LOGINFO_CODE_SATA_ERR_IN_RCV_SET_DEV_BIT_FIS      (0x00090000)
+#define PL_LOGINFO_CODE_RX_FM_INVALID_MESSAGE                (0x000A0000)
+#define PL_LOGINFO_CODE_RX_CTX_MESSAGE_VALID_ERROR           (0x000B0000)
+#define PL_LOGINFO_CODE_RX_FM_CURRENT_FRAME_ERROR            (0x000C0000)
+#define PL_LOGINFO_CODE_SATA_LINK_DOWN                       (0x000D0000)
+#define PL_LOGINFO_CODE_DISCOVERY_SATA_INIT_W_IOS            (0x000E0000)
+#define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE                  (0x000F0000)
+#define PL_LOGINFO_CODE_CONFIG_PL_NOT_INITIALIZED            (0x000F0001) /* PL not yet initialized, can't do config page req. */
+#define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_PT               (0x000F0100) /* Invalid Page Type */
+#define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_NUM_PHYS         (0x000F0200) /* Invalid Number of Phys */
+#define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_NOT_IMP          (0x000F0300) /* Case Not Handled */
+#define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_NO_DEV           (0x000F0400) /* No Device Found */
+#define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_FORM             (0x000F0500) /* Invalid FORM */
+#define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_PHY              (0x000F0600) /* Invalid Phy */
+#define PL_LOGINFO_CODE_CONFIG_INVALID_PAGE_NO_OWNER         (0x000F0700) /* No Owner Found */
+#define PL_LOGINFO_CODE_DSCVRY_SATA_INIT_TIMEOUT             (0x00100000)
+#define PL_LOGINFO_CODE_RESET                                (0x00110000) /* See Sub-Codes below (PL_LOGINFO_SUB_CODE) */
+#define PL_LOGINFO_CODE_ABORT                                (0x00120000) /* See Sub-Codes below  (PL_LOGINFO_SUB_CODE)*/
+#define PL_LOGINFO_CODE_IO_NOT_YET_EXECUTED                  (0x00130000)
+#define PL_LOGINFO_CODE_IO_EXECUTED                          (0x00140000)
+#define PL_LOGINFO_CODE_PERS_RESV_OUT_NOT_AFFIL_OWNER        (0x00150000)
+#define PL_LOGINFO_CODE_OPEN_TXDMA_ABORT                     (0x00160000)
+#define PL_LOGINFO_CODE_IO_DEVICE_MISSING_DELAY_RETRY        (0x00170000)
+#define PL_LOGINFO_CODE_IO_CANCELLED_DUE_TO_R_ERR            (0x00180000)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE                     (0x00000100)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_NO_DEST_TIMEOUT     (0x00000101)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_SATA_NEG_RATE_2HI   (0x00000102)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_RATE_NOT_SUPPORTED  (0x00000103)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_BREAK               (0x00000104)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_ZONE_VIOLATION      (0x00000114)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_ABANDON0            (0x00000114) /* Open Reject (Zone Violation) - available on SAS-2 devices */
+#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_ABANDON1            (0x00000115)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_ABANDON2            (0x00000116)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_ABANDON3            (0x00000117)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_ORR_TIMEOUT         (0x0000011A) /* Open Reject (Retry) Timeout */
+#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_PATH_BLOCKED        (0x0000011B)
+#define PL_LOGINFO_SUB_CODE_OPEN_FAILURE_AWT_MAXED           (0x0000011C) /* Arbitration Wait Timer Maxed */
+
+#define PL_LOGINFO_SUB_CODE_TARGET_BUS_RESET                 (0x00000120)
+#define PL_LOGINFO_SUB_CODE_TRANSPORT_LAYER                  (0x00000130)  /* Leave lower nibble (1-f) reserved. */
+#define PL_LOGINFO_SUB_CODE_PORT_LAYER                       (0x00000140)  /* Leave lower nibble (1-f) reserved. */
+
+
+#define PL_LOGINFO_SUB_CODE_INVALID_SGL                      (0x00000200)
+#define PL_LOGINFO_SUB_CODE_WRONG_REL_OFF_OR_FRAME_LENGTH    (0x00000300)
+#define PL_LOGINFO_SUB_CODE_FRAME_XFER_ERROR                 (0x00000400) /* Bits 0-3 encode Transport Status Register (offset 0x08) */
+                                                                          /* Bit 0 is Status Bit 0: FrameXferErr */
+                                                                          /* Bit 1 & 2 are Status Bits 16 and 17: FrameXmitErrStatus */
+                                                                          /* Bit 3 is Status Bit 18 WriteDataLenghtGTDataLengthErr */
+
+#define PL_LOGINFO_SUB_CODE_TX_FM_CONNECTED_LOW              (0x00000500)
+#define PL_LOGINFO_SUB_CODE_SATA_NON_NCQ_RW_ERR_BIT_SET      (0x00000600)
+#define PL_LOGINFO_SUB_CODE_SATA_READ_LOG_RECEIVE_DATA_ERR   (0x00000700)
+#define PL_LOGINFO_SUB_CODE_SATA_NCQ_FAIL_ALL_CMDS_AFTR_ERR  (0x00000800)
+#define PL_LOGINFO_SUB_CODE_SATA_ERR_IN_RCV_SET_DEV_BIT_FIS  (0x00000900)
+#define PL_LOGINFO_SUB_CODE_RX_FM_INVALID_MESSAGE            (0x00000A00)
+#define PL_LOGINFO_SUB_CODE_RX_CTX_MESSAGE_VALID_ERROR       (0x00000B00)
+#define PL_LOGINFO_SUB_CODE_RX_FM_CURRENT_FRAME_ERROR        (0x00000C00)
+#define PL_LOGINFO_SUB_CODE_SATA_LINK_DOWN                   (0x00000D00)
+#define PL_LOGINFO_SUB_CODE_DISCOVERY_SATA_INIT_W_IOS        (0x00000E00)
+#define PL_LOGINFO_SUB_CODE_DISCOVERY_REMOTE_SEP_RESET       (0x00000E01)
+#define PL_LOGINFO_SUB_CODE_SECOND_OPEN                      (0x00000F00)
+#define PL_LOGINFO_SUB_CODE_DSCVRY_SATA_INIT_TIMEOUT         (0x00001000)
+
+#define PL_LOGINFO_CODE_ENCL_MGMT_SMP_FRAME_FAILURE          (0x00200000) /* Can't get SMP Frame */
+#define PL_LOGINFO_CODE_ENCL_MGMT_SMP_READ_ERROR             (0x00200010) /* Error occured on SMP Read */
+#define PL_LOGINFO_CODE_ENCL_MGMT_SMP_WRITE_ERROR            (0x00200020) /* Error occured on SMP Write */
+#define PL_LOGINFO_CODE_ENCL_MGMT_NOT_SUPPORTED_ON_ENCL      (0x00200040) /* Encl Mgmt services not available for this WWID */
+#define PL_LOGINFO_CODE_ENCL_MGMT_ADDR_MODE_NOT_SUPPORTED    (0x00200050) /* Address Mode not suppored */
+#define PL_LOGINFO_CODE_ENCL_MGMT_BAD_SLOT_NUM               (0x00200060) /* Invalid Slot Number in SEP Msg */
+#define PL_LOGINFO_CODE_ENCL_MGMT_SGPIO_NOT_PRESENT          (0x00200070) /* SGPIO not present/enabled */
+#define PL_LOGINFO_CODE_ENCL_MGMT_GPIO_NOT_CONFIGURED        (0x00200080) /* GPIO not configured */
+#define PL_LOGINFO_CODE_ENCL_MGMT_GPIO_FRAME_ERROR           (0x00200090) /* GPIO can't allocate a frame */
+#define PL_LOGINFO_CODE_ENCL_MGMT_GPIO_CONFIG_PAGE_ERROR     (0x002000A0) /* GPIO failed config page request */
+#define PL_LOGINFO_CODE_ENCL_MGMT_SES_FRAME_ALLOC_ERROR      (0x002000B0) /* Can't get frame for SES command */
+#define PL_LOGINFO_CODE_ENCL_MGMT_SES_IO_ERROR               (0x002000C0) /* I/O execution error */
+#define PL_LOGINFO_CODE_ENCL_MGMT_SES_RETRIES_EXHAUSTED      (0x002000D0) /* SEP I/O retries exhausted */
+#define PL_LOGINFO_CODE_ENCL_MGMT_SMP_FRAME_ALLOC_ERROR      (0x002000E0) /* Can't get frame for SMP command */
+
+#define PL_LOGINFO_DA_SEP_NOT_PRESENT                        (0x00200100) /* SEP not present when msg received */
+#define PL_LOGINFO_DA_SEP_SINGLE_THREAD_ERROR                (0x00200101) /* Can only accept 1 msg at a time */
+#define PL_LOGINFO_DA_SEP_ISTWI_INTR_IN_IDLE_STATE           (0x00200102) /* ISTWI interrupt recvd. while IDLE */
+#define PL_LOGINFO_DA_SEP_RECEIVED_NACK_FROM_SLAVE           (0x00200103) /* SEP NACK'd, it is busy */
+#define PL_LOGINFO_DA_SEP_DID_NOT_RECEIVE_ACK                (0x00200104) /* SEP didn't rcv. ACK (Last Rcvd Bit = 1) */
+#define PL_LOGINFO_DA_SEP_BAD_STATUS_HDR_CHKSUM              (0x00200105) /* SEP stopped or sent bad chksum in Hdr */
+#define PL_LOGINFO_DA_SEP_STOP_ON_DATA                       (0x00200106) /* SEP stopped while transfering data */
+#define PL_LOGINFO_DA_SEP_STOP_ON_SENSE_DATA                 (0x00200107) /* SEP stopped while transfering sense data */
+#define PL_LOGINFO_DA_SEP_UNSUPPORTED_SCSI_STATUS_1          (0x00200108) /* SEP returned unknown scsi status */
+#define PL_LOGINFO_DA_SEP_UNSUPPORTED_SCSI_STATUS_2          (0x00200109) /* SEP returned unknown scsi status */
+#define PL_LOGINFO_DA_SEP_CHKSUM_ERROR_AFTER_STOP            (0x0020010A) /* SEP returned bad chksum after STOP */
+#define PL_LOGINFO_DA_SEP_CHKSUM_ERROR_AFTER_STOP_GETDATA    (0x0020010B) /* SEP returned bad chksum after STOP while gettin data*/
+#define PL_LOGINFO_DA_SEP_UNSUPPORTED_COMMAND                (0x0020010C) /* SEP doesn't support CDB opcode f/w location 1 */
+#define PL_LOGINFO_DA_SEP_UNSUPPORTED_COMMAND_2              (0x0020010D) /* SEP doesn't support CDB opcode f/w location 2 */
+#define PL_LOGINFO_DA_SEP_UNSUPPORTED_COMMAND_3              (0x0020010E) /* SEP doesn't support CDB opcode f/w location 3 */
 
 
 /****************************************************************************/
index 50b8f0a8f4560d5e222209cb43c2d856e8fa56c2..8e990a0fa7a214287e17eef7ad60adc79739cadd 100644 (file)
@@ -1,12 +1,12 @@
 /*
- *  Copyright (c) 2004 LSI Logic Corporation.
+ *  Copyright (c) 2004-2006 LSI Logic Corporation.
  *
  *
  *           Name:  mpi_sas.h
  *          Title:  MPI Serial Attached SCSI structures and definitions
  *  Creation Date:  August 19, 2004
  *
- *    mpi_sas.h Version:  01.05.03
+ *    mpi_sas.h Version:  01.05.04
  *
  *  Version History
  *  ---------------
@@ -21,6 +21,8 @@
  *                      and Remove Device operations to SAS IO Unit Control.
  *                      Added DevHandle field to SAS IO Unit Control request and
  *                      reply.
+ *  10-11-06  01.05.04  Fixed the name of a define for Operation field of SAS IO
+ *                      Unit Control request.
  *  --------------------------------------------------------------------------
  */
 
@@ -237,7 +239,8 @@ typedef struct _MSG_SAS_IOUNIT_CONTROL_REQUEST
 #define MPI_SAS_OP_SEND_PRIMITIVE               (0x0A)
 #define MPI_SAS_OP_FORCE_FULL_DISCOVERY         (0x0B)
 #define MPI_SAS_OP_TRANSMIT_PORT_SELECT_SIGNAL  (0x0C)
-#define MPI_SAS_OP_TRANSMIT_REMOVE_DEVICE       (0x0D)
+#define MPI_SAS_OP_TRANSMIT_REMOVE_DEVICE       (0x0D)  /* obsolete name */
+#define MPI_SAS_OP_REMOVE_DEVICE                (0x0D)
 
 /* values for the PrimFlags field */
 #define MPI_SAS_PRIMFLAGS_SINGLE                (0x08)
index b3f28a03b6a99f247648c9f12dc19f348d26213f..083acfd91d8bff0dad61188a8195c7b8aa1893e2 100644 (file)
@@ -6,7 +6,7 @@
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
  *  Copyright (c) 1999-2007 LSI Logic Corporation
- *  (mailto:mpt_linux_developer@lsil.com)
+ *  (mailto:mpt_linux_developer@lsi.com)
  *
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -82,6 +82,10 @@ static int mpt_msi_enable;
 module_param(mpt_msi_enable, int, 0);
 MODULE_PARM_DESC(mpt_msi_enable, " MSI Support Enable (default=0)");
 
+static int mpt_channel_mapping;
+module_param(mpt_channel_mapping, int, 0);
+MODULE_PARM_DESC(mpt_channel_mapping, " Mapping id's to channels (default=0)");
+
 #ifdef MFCNT
 static int mfcounter = 0;
 #define PRINT_MF_COUNT 20000
@@ -173,11 +177,14 @@ static void       mpt_get_fw_exp_ver(char *buf, MPT_ADAPTER *ioc);
 
 //int          mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag);
 static int     ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *evReply, int *evHandlers);
-static void    mpt_sp_ioc_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf);
+#ifdef MPT_DEBUG_REPLY
+static void    mpt_iocstatus_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf);
+#endif
 static void    mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info);
 static void    mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info);
 static void    mpt_sas_log_info(MPT_ADAPTER *ioc, u32 log_info);
 static int     mpt_read_ioc_pg_3(MPT_ADAPTER *ioc);
+static void    mpt_inactive_raid_list_free(MPT_ADAPTER *ioc);
 
 /* module entry point */
 static int  __init    fusion_init  (void);
@@ -319,13 +326,11 @@ mpt_reply(MPT_ADAPTER *ioc, u32 pa)
                else if (ioc->bus_type == SAS)
                        mpt_sas_log_info(ioc, log_info);
        }
-       if (ioc_stat & MPI_IOCSTATUS_MASK) {
-               if (ioc->bus_type == SPI &&
-                   cb_idx != mpt_stm_index &&
-                   cb_idx != mpt_lan_index)
-                       mpt_sp_ioc_info(ioc, (u32)ioc_stat, mf);
-       }
 
+#ifdef MPT_DEBUG_REPLY
+       if (ioc_stat & MPI_IOCSTATUS_MASK)
+               mpt_iocstatus_info(ioc, (u32)ioc_stat, mf);
+#endif
 
        /*  Check for (valid) IO callback!  */
        if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS ||
@@ -911,7 +916,7 @@ mpt_add_sge(char *pAddr, u32 flagslength, dma_addr_t dma_addr)
 int
 mpt_send_handshake_request(int handle, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag)
 {
-       int              r = 0;
+       int     r = 0;
        u8      *req_as_bytes;
        int      ii;
 
@@ -1811,6 +1816,13 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
         *      and we try GetLanConfigPages again...
         */
        if ((ret == 0) && (reason == MPT_HOSTEVENT_IOC_BRINGUP)) {
+
+               /*
+                * Initalize link list for inactive raid volumes.
+                */
+               init_MUTEX(&ioc->raid_data.inactive_list_mutex);
+               INIT_LIST_HEAD(&ioc->raid_data.inactive_list);
+
                if (ioc->bus_type == SAS) {
 
                        /* clear persistency table */
@@ -2017,6 +2029,8 @@ mpt_adapter_disable(MPT_ADAPTER *ioc)
        }
 
        kfree(ioc->spi_data.nvram);
+       mpt_inactive_raid_list_free(ioc);
+       kfree(ioc->raid_data.pIocPg2);
        kfree(ioc->raid_data.pIocPg3);
        ioc->spi_data.nvram = NULL;
        ioc->raid_data.pIocPg3 = NULL;
@@ -2413,6 +2427,9 @@ GetIocFacts(MPT_ADAPTER *ioc, int sleepFlag, int reason)
                        facts->FWVersion.Word = le32_to_cpu(facts->FWVersion.Word);
 
                facts->ProductID = le16_to_cpu(facts->ProductID);
+               if ((ioc->facts.ProductID & MPI_FW_HEADER_PID_PROD_MASK)
+                   > MPI_FW_HEADER_PID_PROD_TARGET_SCSI)
+                       ioc->ir_firmware = 1;
                facts->CurrentHostMfaHighAddr =
                                le32_to_cpu(facts->CurrentHostMfaHighAddr);
                facts->GlobalCredits = le16_to_cpu(facts->GlobalCredits);
@@ -2505,6 +2522,7 @@ GetPortFacts(MPT_ADAPTER *ioc, int portnum, int sleepFlag)
        int                      ii;
        int                      req_sz;
        int                      reply_sz;
+       int                      max_id;
 
        /* IOC *must* NOT be in RESET state! */
        if (ioc->last_state == MPI_IOC_STATE_RESET) {
@@ -2552,6 +2570,21 @@ GetPortFacts(MPT_ADAPTER *ioc, int portnum, int sleepFlag)
        pfacts->MaxPersistentIDs = le16_to_cpu(pfacts->MaxPersistentIDs);
        pfacts->MaxLanBuckets = le16_to_cpu(pfacts->MaxLanBuckets);
 
+       max_id = (ioc->bus_type == SAS) ? pfacts->PortSCSIID :
+           pfacts->MaxDevices;
+       ioc->devices_per_bus = (max_id > 255) ? 256 : max_id;
+       ioc->number_of_buses = (ioc->devices_per_bus < 256) ? 1 : max_id/256;
+
+       /*
+        * Place all the devices on channels
+        *
+        * (for debuging)
+        */
+       if (mpt_channel_mapping) {
+               ioc->devices_per_bus = 1;
+               ioc->number_of_buses = (max_id > 255) ? 255 : max_id;
+       }
+
        return 0;
 }
 
@@ -2592,13 +2625,8 @@ SendIocInit(MPT_ADAPTER *ioc, int sleepFlag)
        ddlprintk((MYIOC_s_INFO_FMT "upload_fw %d facts.Flags=%x\n",
                   ioc->name, ioc->upload_fw, ioc->facts.Flags));
 
-       if(ioc->bus_type == SAS)
-               ioc_init.MaxDevices = ioc->facts.MaxDevices;
-       else if(ioc->bus_type == FC)
-               ioc_init.MaxDevices = MPT_MAX_FC_DEVICES;
-       else
-               ioc_init.MaxDevices = MPT_MAX_SCSI_DEVICES;
-       ioc_init.MaxBuses = MPT_MAX_BUS;
+       ioc_init.MaxDevices = (U8)ioc->devices_per_bus;
+       ioc_init.MaxBuses = (U8)ioc->number_of_buses;
        dinitprintk((MYIOC_s_INFO_FMT "facts.MsgVersion=%x\n",
                   ioc->name, ioc->facts.MsgVersion));
        if (ioc->facts.MsgVersion >= MPI_VERSION_01_05) {
@@ -2720,9 +2748,7 @@ SendPortEnable(MPT_ADAPTER *ioc, int portnum, int sleepFlag)
 
        /* RAID FW may take a long time to enable
         */
-       if (((ioc->facts.ProductID & MPI_FW_HEADER_PID_PROD_MASK)
-           > MPI_FW_HEADER_PID_PROD_TARGET_SCSI) ||
-           (ioc->bus_type == SAS)) {
+       if (ioc->ir_firmware || ioc->bus_type == SAS) {
                rc = mpt_handshake_req_reply_wait(ioc, req_sz,
                (u32*)&port_enable, reply_sz, (u16*)&reply_buf,
                300 /*seconds*/, sleepFlag);
@@ -3193,6 +3219,9 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
        u32 diag1val = 0;
 #endif
 
+       /* Clear any existing interrupts */
+       CHIPREG_WRITE32(&ioc->chip->IntStatus, 0);
+
        if (ioc->pcidev->device == MPI_MANUFACTPAGE_DEVID_SAS1078) {
                drsprintk((MYIOC_s_WARN_FMT "%s: Doorbell=%p; 1078 reset "
                        "address=%p\n",  ioc->name, __FUNCTION__,
@@ -3212,7 +3241,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
                                " count=%d\n",
                                ioc->name, doorbell, count));
                        if (doorbell == MPI_IOC_STATE_READY) {
-                               return 0;
+                               return 1;
                        }
 
                        /* wait 1 sec */
@@ -3224,9 +3253,6 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
                return -1;
        }
 
-       /* Clear any existing interrupts */
-       CHIPREG_WRITE32(&ioc->chip->IntStatus, 0);
-
        /* Use "Diagnostic reset" method! (only thing available!) */
        diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic);
 
@@ -3942,7 +3968,7 @@ WaitForDoorbellAck(MPT_ADAPTER *ioc, int howlong, int sleepFlag)
                }
        } else {
                while (--cntdn) {
-                       mdelay (1);
+                       udelay (1000);
                        intstat = CHIPREG_READ32(&ioc->chip->IntStatus);
                        if (! (intstat & MPI_HIS_IOP_DOORBELL_STATUS))
                                break;
@@ -3994,7 +4020,7 @@ WaitForDoorbellInt(MPT_ADAPTER *ioc, int howlong, int sleepFlag)
                        intstat = CHIPREG_READ32(&ioc->chip->IntStatus);
                        if (intstat & MPI_HIS_DOORBELL_INTERRUPT)
                                break;
-                       mdelay(1);
+                       udelay (1000);
                        count++;
                }
        }
@@ -4310,8 +4336,8 @@ mptbase_raid_process_event_data(MPT_ADAPTER *ioc,
        if ((reason >= MPI_EVENT_RAID_RC_PHYSDISK_CREATED &&
             reason <= MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED) ||
            (reason == MPI_EVENT_RAID_RC_SMART_DATA)) {
-               printk(MYIOC_s_INFO_FMT "RAID STATUS CHANGE for PhysDisk %d\n",
-                       ioc->name, disk);
+               printk(MYIOC_s_INFO_FMT "RAID STATUS CHANGE for PhysDisk %d id=%d\n",
+                       ioc->name, disk, volume);
        } else {
                printk(MYIOC_s_INFO_FMT "RAID STATUS CHANGE for VolumeID %d\n",
                        ioc->name, volume);
@@ -4712,7 +4738,187 @@ mpt_readScsiDevicePageHeaders(MPT_ADAPTER *ioc, int portnum)
        return 0;
 }
 
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
+/**
+ * mpt_inactive_raid_list_free
+ *
+ * This clears this link list.
+ *
+ * @ioc - pointer to per adapter structure
+ *
+ **/
+static void
+mpt_inactive_raid_list_free(MPT_ADAPTER *ioc)
+{
+       struct inactive_raid_component_info *component_info, *pNext;
+
+       if (list_empty(&ioc->raid_data.inactive_list))
+               return;
+
+       down(&ioc->raid_data.inactive_list_mutex);
+       list_for_each_entry_safe(component_info, pNext,
+           &ioc->raid_data.inactive_list, list) {
+               list_del(&component_info->list);
+               kfree(component_info);
+       }
+       up(&ioc->raid_data.inactive_list_mutex);
+}
+
+/**
+ * mpt_inactive_raid_volumes
+ *
+ * This sets up link list of phy_disk_nums for devices belonging in an inactive volume
+ *
+ * @ioc - pointer to per adapter structure
+ * @channel - volume channel
+ * @id - volume target id
+ *
+ *
+ **/
+static void
+mpt_inactive_raid_volumes(MPT_ADAPTER *ioc, u8 channel, u8 id)
+{
+       CONFIGPARMS                     cfg;
+       ConfigPageHeader_t              hdr;
+       dma_addr_t                      dma_handle;
+       pRaidVolumePage0_t              buffer = NULL;
+       int                             i;
+       RaidPhysDiskPage0_t             phys_disk;
+       struct inactive_raid_component_info *component_info;
+       int                             handle_inactive_volumes;
+
+       memset(&cfg, 0 , sizeof(CONFIGPARMS));
+       memset(&hdr, 0 , sizeof(ConfigPageHeader_t));
+       hdr.PageType = MPI_CONFIG_PAGETYPE_RAID_VOLUME;
+       cfg.pageAddr = (channel << 8) + id;
+       cfg.cfghdr.hdr = &hdr;
+       cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
+
+       if (mpt_config(ioc, &cfg) != 0)
+               goto out;
+
+       if (!hdr.PageLength)
+               goto out;
+
+       buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4,
+           &dma_handle);
+
+       if (!buffer)
+               goto out;
+
+       cfg.physAddr = dma_handle;
+       cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
+
+       if (mpt_config(ioc, &cfg) != 0)
+               goto out;
+
+       if (!buffer->NumPhysDisks)
+               goto out;
+
+       handle_inactive_volumes =
+          (buffer->VolumeStatus.Flags & MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE ||
+          (buffer->VolumeStatus.Flags & MPI_RAIDVOL0_STATUS_FLAG_ENABLED) == 0 ||
+           buffer->VolumeStatus.State == MPI_RAIDVOL0_STATUS_STATE_FAILED ||
+           buffer->VolumeStatus.State == MPI_RAIDVOL0_STATUS_STATE_MISSING) ? 1 : 0;
+
+       if (!handle_inactive_volumes)
+               goto out;
+
+       down(&ioc->raid_data.inactive_list_mutex);
+       for (i = 0; i < buffer->NumPhysDisks; i++) {
+               if(mpt_raid_phys_disk_pg0(ioc,
+                   buffer->PhysDisk[i].PhysDiskNum, &phys_disk) != 0)
+                       continue;
+
+               if ((component_info = kmalloc(sizeof (*component_info),
+                GFP_KERNEL)) == NULL)
+                       continue;
+
+               component_info->volumeID = id;
+               component_info->volumeBus = channel;
+               component_info->d.PhysDiskNum = phys_disk.PhysDiskNum;
+               component_info->d.PhysDiskBus = phys_disk.PhysDiskBus;
+               component_info->d.PhysDiskID = phys_disk.PhysDiskID;
+               component_info->d.PhysDiskIOC = phys_disk.PhysDiskIOC;
+
+               list_add_tail(&component_info->list,
+                   &ioc->raid_data.inactive_list);
+       }
+       up(&ioc->raid_data.inactive_list_mutex);
+
+ out:
+       if (buffer)
+               pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer,
+                   dma_handle);
+}
+
+/**
+ *     mpt_raid_phys_disk_pg0 - returns phys disk page zero
+ *     @ioc: Pointer to a Adapter Structure
+ *     @phys_disk_num: io unit unique phys disk num generated by the ioc
+ *     @phys_disk: requested payload data returned
+ *
+ *     Return:
+ *     0 on success
+ *     -EFAULT if read of config page header fails or data pointer not NULL
+ *     -ENOMEM if pci_alloc failed
+ **/
+int
+mpt_raid_phys_disk_pg0(MPT_ADAPTER *ioc, u8 phys_disk_num, pRaidPhysDiskPage0_t phys_disk)
+{
+       CONFIGPARMS                     cfg;
+       ConfigPageHeader_t              hdr;
+       dma_addr_t                      dma_handle;
+       pRaidPhysDiskPage0_t            buffer = NULL;
+       int                             rc;
+
+       memset(&cfg, 0 , sizeof(CONFIGPARMS));
+       memset(&hdr, 0 , sizeof(ConfigPageHeader_t));
+
+       hdr.PageType = MPI_CONFIG_PAGETYPE_RAID_PHYSDISK;
+       cfg.cfghdr.hdr = &hdr;
+       cfg.physAddr = -1;
+       cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
+
+       if (mpt_config(ioc, &cfg) != 0) {
+               rc = -EFAULT;
+               goto out;
+       }
+
+       if (!hdr.PageLength) {
+               rc = -EFAULT;
+               goto out;
+       }
+
+       buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4,
+           &dma_handle);
+
+       if (!buffer) {
+               rc = -ENOMEM;
+               goto out;
+       }
+
+       cfg.physAddr = dma_handle;
+       cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
+       cfg.pageAddr = phys_disk_num;
+
+       if (mpt_config(ioc, &cfg) != 0) {
+               rc = -EFAULT;
+               goto out;
+       }
+
+       rc = 0;
+       memcpy(phys_disk, buffer, sizeof(*buffer));
+       phys_disk->MaxLBA = le32_to_cpu(buffer->MaxLBA);
+
+ out:
+
+       if (buffer)
+               pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer,
+                   dma_handle);
+
+       return rc;
+}
+
 /**
  *     mpt_findImVolumes - Identify IDs of hidden disks and RAID Volumes
  *     @ioc: Pointer to a Adapter Strucutre
@@ -4722,21 +4928,27 @@ mpt_readScsiDevicePageHeaders(MPT_ADAPTER *ioc, int portnum)
  *     0 on success
  *     -EFAULT if read of config page header fails or data pointer not NULL
  *     -ENOMEM if pci_alloc failed
- */
+ **/
 int
 mpt_findImVolumes(MPT_ADAPTER *ioc)
 {
        IOCPage2_t              *pIoc2;
        u8                      *mem;
-       ConfigPageIoc2RaidVol_t *pIocRv;
        dma_addr_t               ioc2_dma;
        CONFIGPARMS              cfg;
        ConfigPageHeader_t       header;
-       int                      jj;
        int                      rc = 0;
        int                      iocpage2sz;
-       u8                       nVols, nPhys;
-       u8                       vid, vbus, vioc;
+       int                      i;
+
+       if (!ioc->ir_firmware)
+               return 0;
+
+       /* Free the old page
+        */
+       kfree(ioc->raid_data.pIocPg2);
+       ioc->raid_data.pIocPg2 = NULL;
+       mpt_inactive_raid_list_free(ioc);
 
        /* Read IOCP2 header then the page.
         */
@@ -4764,55 +4976,23 @@ mpt_findImVolumes(MPT_ADAPTER *ioc)
        cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
        cfg.physAddr = ioc2_dma;
        if (mpt_config(ioc, &cfg) != 0)
-               goto done_and_free;
+               goto out;
+
+       mem = kmalloc(iocpage2sz, GFP_KERNEL);
+       if (!mem)
+               goto out;
 
-       if ( (mem = (u8 *)ioc->raid_data.pIocPg2) == NULL ) {
-               mem = kmalloc(iocpage2sz, GFP_ATOMIC);
-               if (mem) {
-                       ioc->raid_data.pIocPg2 = (IOCPage2_t *) mem;
-               } else {
-                       goto done_and_free;
-               }
-       }
        memcpy(mem, (u8 *)pIoc2, iocpage2sz);
+       ioc->raid_data.pIocPg2 = (IOCPage2_t *) mem;
 
-       /* Identify RAID Volume Id's */
-       nVols = pIoc2->NumActiveVolumes;
-       if ( nVols == 0) {
-               /* No RAID Volume.
-                */
-               goto done_and_free;
-       } else {
-               /* At least 1 RAID Volume
-                */
-               pIocRv = pIoc2->RaidVolume;
-               ioc->raid_data.isRaid = 0;
-               for (jj = 0; jj < nVols; jj++, pIocRv++) {
-                       vid = pIocRv->VolumeID;
-                       vbus = pIocRv->VolumeBus;
-                       vioc = pIocRv->VolumeIOC;
-
-                       /* find the match
-                        */
-                       if (vbus == 0) {
-                               ioc->raid_data.isRaid |= (1 << vid);
-                       } else {
-                               /* Error! Always bus 0
-                                */
-                       }
-               }
-       }
+       mpt_read_ioc_pg_3(ioc);
 
-       /* Identify Hidden Physical Disk Id's */
-       nPhys = pIoc2->NumActivePhysDisks;
-       if (nPhys == 0) {
-               /* No physical disks.
-                */
-       } else {
-               mpt_read_ioc_pg_3(ioc);
-       }
+       for (i = 0; i < pIoc2->NumActiveVolumes ; i++)
+               mpt_inactive_raid_volumes(ioc,
+                   pIoc2->RaidVolume[i].VolumeBus,
+                   pIoc2->RaidVolume[i].VolumeID);
 
-done_and_free:
+ out:
        pci_free_consistent(ioc->pcidev, iocpage2sz, pIoc2, ioc2_dma);
 
        return rc;
@@ -4865,7 +5045,7 @@ mpt_read_ioc_pg_3(MPT_ADAPTER *ioc)
        cfg.physAddr = ioc3_dma;
        cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
        if (mpt_config(ioc, &cfg) == 0) {
-               mem = kmalloc(iocpage3sz, GFP_ATOMIC);
+               mem = kmalloc(iocpage3sz, GFP_KERNEL);
                if (mem) {
                        memcpy(mem, (u8 *)pIoc3, iocpage3sz);
                        ioc->raid_data.pIocPg3 = (IOCPage3_t *) mem;
@@ -5679,8 +5859,6 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
        return rc;
 }
 
-# define EVENT_DESCR_STR_SZ            100
-
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 static void
 EventDescriptionStr(u8 event, u32 evData0, char *evStr)
@@ -5708,9 +5886,6 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr)
                break;
        case MPI_EVENT_RESCAN:
                ds = "Bus Rescan Event";
-               /* Ok, do we need to do anything here? As far as
-                  I can tell, this is when a new device gets added
-                  to the loop. */
                break;
        case MPI_EVENT_LINK_STATUS_CHANGE:
                if (evData0 == MPI_EVENT_LINK_STATUS_FAILURE)
@@ -5787,48 +5962,63 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr)
        case MPI_EVENT_SAS_DEVICE_STATUS_CHANGE:
        {
                u8 id = (u8)(evData0);
+               u8 channel = (u8)(evData0 >> 8);
                u8 ReasonCode = (u8)(evData0 >> 16);
                switch (ReasonCode) {
                case MPI_EVENT_SAS_DEV_STAT_RC_ADDED:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: Added: id=%d", id);
+                           "SAS Device Status Change: Added: "
+                           "id=%d channel=%d", id, channel);
                        break;
                case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: Deleted: id=%d", id);
+                           "SAS Device Status Change: Deleted: "
+                           "id=%d channel=%d", id, channel);
                        break;
                case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: SMART Data: id=%d",
-                           id);
+                           "SAS Device Status Change: SMART Data: "
+                           "id=%d channel=%d", id, channel);
                        break;
                case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: No Persistancy: id=%d", id);
+                           "SAS Device Status Change: No Persistancy: "
+                           "id=%d channel=%d", id, channel);
+                       break;
+               case MPI_EVENT_SAS_DEV_STAT_RC_UNSUPPORTED:
+                       snprintf(evStr, EVENT_DESCR_STR_SZ,
+                           "SAS Device Status Change: Unsupported Device "
+                           "Discovered : id=%d channel=%d", id, channel);
                        break;
                case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: Internal Device Reset : id=%d", id);
+                           "SAS Device Status Change: Internal Device "
+                           "Reset : id=%d channel=%d", id, channel);
                        break;
                case MPI_EVENT_SAS_DEV_STAT_RC_TASK_ABORT_INTERNAL:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: Internal Task Abort : id=%d", id);
+                           "SAS Device Status Change: Internal Task "
+                           "Abort : id=%d channel=%d", id, channel);
                        break;
                case MPI_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: Internal Abort Task Set : id=%d", id);
+                           "SAS Device Status Change: Internal Abort "
+                           "Task Set : id=%d channel=%d", id, channel);
                        break;
                case MPI_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: Internal Clear Task Set : id=%d", id);
+                           "SAS Device Status Change: Internal Clear "
+                           "Task Set : id=%d channel=%d", id, channel);
                        break;
                case MPI_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: Internal Query Task : id=%d", id);
+                           "SAS Device Status Change: Internal Query "
+                           "Task : id=%d channel=%d", id, channel);
                        break;
                default:
                        snprintf(evStr, EVENT_DESCR_STR_SZ,
-                           "SAS Device Status Change: Unknown: id=%d", id);
+                           "SAS Device Status Change: Unknown: "
+                           "id=%d channel=%d", id, channel);
                        break;
                }
                break;
@@ -5837,8 +6027,16 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr)
                ds = "Bus Timer Expired";
                break;
        case MPI_EVENT_QUEUE_FULL:
-               ds = "Queue Full";
+       {
+               u16 curr_depth = (u16)(evData0 >> 16);
+               u8 channel = (u8)(evData0 >> 8);
+               u8 id = (u8)(evData0);
+
+               snprintf(evStr, EVENT_DESCR_STR_SZ,
+                  "Queue Full: channel=%d id=%d depth=%d",
+                  channel, id, curr_depth);
                break;
+       }
        case MPI_EVENT_SAS_SES:
                ds = "SAS SES Event";
                break;
@@ -5942,6 +6140,76 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr)
                ds = "SAS Log Entry Added";
                break;
 
+       case MPI_EVENT_SAS_BROADCAST_PRIMITIVE:
+       {
+               u8 phy_num = (u8)(evData0);
+               u8 port_num = (u8)(evData0 >> 8);
+               u8 port_width = (u8)(evData0 >> 16);
+               u8 primative = (u8)(evData0 >> 24);
+               snprintf(evStr, EVENT_DESCR_STR_SZ,
+                   "SAS Broadcase Primative: phy=%d port=%d "
+                   "width=%d primative=0x%02x",
+                   phy_num, port_num, port_width, primative);
+               break;
+       }
+
+       case MPI_EVENT_SAS_INIT_DEVICE_STATUS_CHANGE:
+       {
+               u8 reason = (u8)(evData0);
+               u8 port_num = (u8)(evData0 >> 8);
+               u16 handle = le16_to_cpu(evData0 >> 16);
+
+               snprintf(evStr, EVENT_DESCR_STR_SZ,
+                   "SAS Initiator Device Status Change: reason=0x%02x "
+                   "port=%d handle=0x%04x",
+                   reason, port_num, handle);
+               break;
+       }
+
+       case MPI_EVENT_SAS_INIT_TABLE_OVERFLOW:
+       {
+               u8 max_init = (u8)(evData0);
+               u8 current_init = (u8)(evData0 >> 8);
+
+               snprintf(evStr, EVENT_DESCR_STR_SZ,
+                   "SAS Initiator Device Table Overflow: max initiators=%02d "
+                   "current initators=%02d",
+                   max_init, current_init);
+               break;
+       }
+       case MPI_EVENT_SAS_SMP_ERROR:
+       {
+               u8 status = (u8)(evData0);
+               u8 port_num = (u8)(evData0 >> 8);
+               u8 result = (u8)(evData0 >> 16);
+
+               if (status == MPI_EVENT_SAS_SMP_FUNCTION_RESULT_VALID)
+                       snprintf(evStr, EVENT_DESCR_STR_SZ,
+                           "SAS SMP Error: port=%d result=0x%02x",
+                           port_num, result);
+               else if (status == MPI_EVENT_SAS_SMP_CRC_ERROR)
+                       snprintf(evStr, EVENT_DESCR_STR_SZ,
+                           "SAS SMP Error: port=%d : CRC Error",
+                           port_num);
+               else if (status == MPI_EVENT_SAS_SMP_TIMEOUT)
+                       snprintf(evStr, EVENT_DESCR_STR_SZ,
+                           "SAS SMP Error: port=%d : Timeout",
+                           port_num);
+               else if (status == MPI_EVENT_SAS_SMP_NO_DESTINATION)
+                       snprintf(evStr, EVENT_DESCR_STR_SZ,
+                           "SAS SMP Error: port=%d : No Destination",
+                           port_num);
+               else if (status == MPI_EVENT_SAS_SMP_BAD_DESTINATION)
+                       snprintf(evStr, EVENT_DESCR_STR_SZ,
+                           "SAS SMP Error: port=%d : Bad Destination",
+                           port_num);
+               else
+                       snprintf(evStr, EVENT_DESCR_STR_SZ,
+                           "SAS SMP Error: port=%d : status=0x%02x",
+                           port_num, status);
+               break;
+       }
+
        /*
         *  MPT base "custom" events may be added here...
         */
@@ -6205,10 +6473,11 @@ mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info)
                "Abort",                                        /* 12h */
                "IO Not Yet Executed",                          /* 13h */
                "IO Executed",                                  /* 14h */
-               "Persistent Reservation Out Not Affiliation Owner", /* 15h */
+               "Persistent Reservation Out Not Affiliation "
+                   "Owner",                                    /* 15h */
                "Open Transmit DMA Abort",                      /* 16h */
                "IO Device Missing Delay Retry",                /* 17h */
-               NULL,                                           /* 18h */
+               "IO Cancelled Due to Recieve Error",            /* 18h */
                NULL,                                           /* 19h */
                NULL,                                           /* 1Ah */
                NULL,                                           /* 1Bh */
@@ -6218,6 +6487,96 @@ mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info)
                NULL,                                           /* 1Fh */
                "Enclosure Management"                          /* 20h */
        };
+       static char *ir_code_str[] = {
+               "Raid Action Error",                            /* 00h */
+               NULL,                                           /* 00h */
+               NULL,                                           /* 01h */
+               NULL,                                           /* 02h */
+               NULL,                                           /* 03h */
+               NULL,                                           /* 04h */
+               NULL,                                           /* 05h */
+               NULL,                                           /* 06h */
+               NULL                                            /* 07h */
+       };
+       static char *raid_sub_code_str[] = {
+               NULL,                                           /* 00h */
+               "Volume Creation Failed: Data Passed too "
+                   "Large",                                    /* 01h */
+               "Volume Creation Failed: Duplicate Volumes "
+                   "Attempted",                                /* 02h */
+               "Volume Creation Failed: Max Number "
+                   "Supported Volumes Exceeded",               /* 03h */
+               "Volume Creation Failed: DMA Error",            /* 04h */
+               "Volume Creation Failed: Invalid Volume Type",  /* 05h */
+               "Volume Creation Failed: Error Reading "
+                   "MFG Page 4",                               /* 06h */
+               "Volume Creation Failed: Creating Internal "
+                   "Structures",                               /* 07h */
+               NULL,                                           /* 08h */
+               NULL,                                           /* 09h */
+               NULL,                                           /* 0Ah */
+               NULL,                                           /* 0Bh */
+               NULL,                                           /* 0Ch */
+               NULL,                                           /* 0Dh */
+               NULL,                                           /* 0Eh */
+               NULL,                                           /* 0Fh */
+               "Activation failed: Already Active Volume",     /* 10h */
+               "Activation failed: Unsupported Volume Type",   /* 11h */
+               "Activation failed: Too Many Active Volumes",   /* 12h */
+               "Activation failed: Volume ID in Use",          /* 13h */
+               "Activation failed: Reported Failure",          /* 14h */
+               "Activation failed: Importing a Volume",        /* 15h */
+               NULL,                                           /* 16h */
+               NULL,                                           /* 17h */
+               NULL,                                           /* 18h */
+               NULL,                                           /* 19h */
+               NULL,                                           /* 1Ah */
+               NULL,                                           /* 1Bh */
+               NULL,                                           /* 1Ch */
+               NULL,                                           /* 1Dh */
+               NULL,                                           /* 1Eh */
+               NULL,                                           /* 1Fh */
+               "Phys Disk failed: Too Many Phys Disks",        /* 20h */
+               "Phys Disk failed: Data Passed too Large",      /* 21h */
+               "Phys Disk failed: DMA Error",                  /* 22h */
+               "Phys Disk failed: Invalid <channel:id>",       /* 23h */
+               "Phys Disk failed: Creating Phys Disk Config "
+                   "Page",                                     /* 24h */
+               NULL,                                           /* 25h */
+               NULL,                                           /* 26h */
+               NULL,                                           /* 27h */
+               NULL,                                           /* 28h */
+               NULL,                                           /* 29h */
+               NULL,                                           /* 2Ah */
+               NULL,                                           /* 2Bh */
+               NULL,                                           /* 2Ch */
+               NULL,                                           /* 2Dh */
+               NULL,                                           /* 2Eh */
+               NULL,                                           /* 2Fh */
+               "Compatibility Error: IR Disabled",             /* 30h */
+               "Compatibility Error: Inquiry Comand Failed",   /* 31h */
+               "Compatibility Error: Device not Direct Access "
+                   "Device ",                                  /* 32h */
+               "Compatibility Error: Removable Device Found",  /* 33h */
+               "Compatibility Error: Device SCSI Version not "
+                   "2 or Higher",                              /* 34h */
+               "Compatibility Error: SATA Device, 48 BIT LBA "
+                   "not Supported",                            /* 35h */
+               "Compatibility Error: Device doesn't have "
+                   "512 Byte Block Sizes",                     /* 36h */
+               "Compatibility Error: Volume Type Check Failed", /* 37h */
+               "Compatibility Error: Volume Type is "
+                   "Unsupported by FW",                        /* 38h */
+               "Compatibility Error: Disk Drive too Small for "
+                   "use in Volume",                            /* 39h */
+               "Compatibility Error: Phys Disk for Create "
+                   "Volume not Found",                         /* 3Ah */
+               "Compatibility Error: Too Many or too Few "
+                   "Disks for Volume Type",                    /* 3Bh */
+               "Compatibility Error: Disk stripe Sizes "
+                   "Must be 64KB",                             /* 3Ch */
+               "Compatibility Error: IME Size Limited to < 2TB", /* 3Dh */
+       };
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /**
@@ -6226,7 +6585,7 @@ mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info)
  *     @log_info: U32 LogInfo reply word from the IOC
  *
  *     Refer to lsi/mpi_log_sas.h.
- */
+ **/
 static void
 mpt_sas_log_info(MPT_ADAPTER *ioc, u32 log_info)
 {
@@ -6240,56 +6599,165 @@ union loginfo_type {
        }dw;
 };
        union loginfo_type sas_loginfo;
+       char *originator_desc = NULL;
        char *code_desc = NULL;
+       char *sub_code_desc = NULL;
 
        sas_loginfo.loginfo = log_info;
        if ((sas_loginfo.dw.bus_type != 3 /*SAS*/) &&
            (sas_loginfo.dw.originator < sizeof(originator_str)/sizeof(char*)))
                return;
-       if ((sas_loginfo.dw.originator == 0 /*IOP*/) &&
-           (sas_loginfo.dw.code < sizeof(iop_code_str)/sizeof(char*))) {
-               code_desc = iop_code_str[sas_loginfo.dw.code];
-       }else if ((sas_loginfo.dw.originator == 1 /*PL*/) &&
-           (sas_loginfo.dw.code < sizeof(pl_code_str)/sizeof(char*) )) {
-               code_desc = pl_code_str[sas_loginfo.dw.code];
+
+       originator_desc = originator_str[sas_loginfo.dw.originator];
+
+       switch (sas_loginfo.dw.originator) {
+
+               case 0:  /* IOP */
+                       if (sas_loginfo.dw.code <
+                           sizeof(iop_code_str)/sizeof(char*))
+                               code_desc = iop_code_str[sas_loginfo.dw.code];
+                       break;
+               case 1:  /* PL */
+                       if (sas_loginfo.dw.code <
+                           sizeof(pl_code_str)/sizeof(char*))
+                               code_desc = pl_code_str[sas_loginfo.dw.code];
+                       break;
+               case 2:  /* IR */
+                       if (sas_loginfo.dw.code >=
+                           sizeof(ir_code_str)/sizeof(char*))
+                               break;
+                       code_desc = ir_code_str[sas_loginfo.dw.code];
+                       if (sas_loginfo.dw.subcode >=
+                           sizeof(raid_sub_code_str)/sizeof(char*))
+                       break;
+                       if (sas_loginfo.dw.code == 0)
+                               sub_code_desc =
+                                   raid_sub_code_str[sas_loginfo.dw.subcode];
+                       break;
+               default:
+                       return;
        }
 
-       if (code_desc != NULL)
+       if (sub_code_desc != NULL)
+               printk(MYIOC_s_INFO_FMT
+                       "LogInfo(0x%08x): Originator={%s}, Code={%s},"
+                       " SubCode={%s}\n",
+                       ioc->name, log_info, originator_desc, code_desc,
+                       sub_code_desc);
+       else if (code_desc != NULL)
                printk(MYIOC_s_INFO_FMT
                        "LogInfo(0x%08x): Originator={%s}, Code={%s},"
                        " SubCode(0x%04x)\n",
-                       ioc->name,
-                       log_info,
-                       originator_str[sas_loginfo.dw.originator],
-                       code_desc,
+                       ioc->name, log_info, originator_desc, code_desc,
                        sas_loginfo.dw.subcode);
        else
                printk(MYIOC_s_INFO_FMT
                        "LogInfo(0x%08x): Originator={%s}, Code=(0x%02x),"
                        " SubCode(0x%04x)\n",
-                       ioc->name,
-                       log_info,
-                       originator_str[sas_loginfo.dw.originator],
-                       sas_loginfo.dw.code,
-                       sas_loginfo.dw.subcode);
+                       ioc->name, log_info, originator_desc,
+                       sas_loginfo.dw.code, sas_loginfo.dw.subcode);
 }
 
+#ifdef MPT_DEBUG_REPLY
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /**
- *     mpt_sp_ioc_info - IOC information returned from SCSI Parallel IOC.
+ *     mpt_iocstatus_info_config - IOCSTATUS information for config pages
+ *     @ioc: Pointer to MPT_ADAPTER structure
+ *     ioc_status: U32 IOCStatus word from IOC
+ *     @mf: Pointer to MPT request frame
+ *
+ *     Refer to lsi/mpi.h.
+ **/
+static void
+mpt_iocstatus_info_config(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf)
+{
+       Config_t *pReq = (Config_t *)mf;
+       char extend_desc[EVENT_DESCR_STR_SZ];
+       char *desc = NULL;
+       u32 form;
+       u8 page_type;
+
+       if (pReq->Header.PageType == MPI_CONFIG_PAGETYPE_EXTENDED)
+               page_type = pReq->ExtPageType;
+       else
+               page_type = pReq->Header.PageType;
+
+       /*
+        * ignore invalid page messages for GET_NEXT_HANDLE
+        */
+       form = le32_to_cpu(pReq->PageAddress);
+       if (ioc_status == MPI_IOCSTATUS_CONFIG_INVALID_PAGE) {
+               if (page_type == MPI_CONFIG_EXTPAGETYPE_SAS_DEVICE ||
+                   page_type == MPI_CONFIG_EXTPAGETYPE_SAS_EXPANDER ||
+                   page_type == MPI_CONFIG_EXTPAGETYPE_ENCLOSURE) {
+                       if ((form >> MPI_SAS_DEVICE_PGAD_FORM_SHIFT) ==
+                               MPI_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE)
+                               return;
+               }
+               if (page_type == MPI_CONFIG_PAGETYPE_FC_DEVICE)
+                       if ((form & MPI_FC_DEVICE_PGAD_FORM_MASK) ==
+                               MPI_FC_DEVICE_PGAD_FORM_NEXT_DID)
+                               return;
+       }
+
+       snprintf(extend_desc, EVENT_DESCR_STR_SZ,
+           "type=%02Xh, page=%02Xh, action=%02Xh, form=%08Xh",
+           page_type, pReq->Header.PageNumber, pReq->Action, form);
+
+       switch (ioc_status) {
+
+       case MPI_IOCSTATUS_CONFIG_INVALID_ACTION: /* 0x0020 */
+               desc = "Config Page Invalid Action";
+               break;
+
+       case MPI_IOCSTATUS_CONFIG_INVALID_TYPE:   /* 0x0021 */
+               desc = "Config Page Invalid Type";
+               break;
+
+       case MPI_IOCSTATUS_CONFIG_INVALID_PAGE:   /* 0x0022 */
+               desc = "Config Page Invalid Page";
+               break;
+
+       case MPI_IOCSTATUS_CONFIG_INVALID_DATA:   /* 0x0023 */
+               desc = "Config Page Invalid Data";
+               break;
+
+       case MPI_IOCSTATUS_CONFIG_NO_DEFAULTS:    /* 0x0024 */
+               desc = "Config Page No Defaults";
+               break;
+
+       case MPI_IOCSTATUS_CONFIG_CANT_COMMIT:    /* 0x0025 */
+               desc = "Config Page Can't Commit";
+               break;
+       }
+
+       if (!desc)
+               return;
+
+       printk(MYIOC_s_INFO_FMT "IOCStatus(0x%04X): %s: %s\n",
+           ioc->name, ioc_status, desc, extend_desc);
+}
+
+/**
+ *     mpt_iocstatus_info - IOCSTATUS information returned from IOC.
  *     @ioc: Pointer to MPT_ADAPTER structure
  *     @ioc_status: U32 IOCStatus word from IOC
  *     @mf: Pointer to MPT request frame
  *
  *     Refer to lsi/mpi.h.
- */
+ **/
 static void
-mpt_sp_ioc_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf)
+mpt_iocstatus_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf)
 {
        u32 status = ioc_status & MPI_IOCSTATUS_MASK;
        char *desc = NULL;
 
        switch (status) {
+
+/****************************************************************************/
+/*  Common IOCStatus values for all replies                                 */
+/****************************************************************************/
+
        case MPI_IOCSTATUS_INVALID_FUNCTION: /* 0x0001 */
                desc = "Invalid Function";
                break;
@@ -6322,84 +6790,180 @@ mpt_sp_ioc_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf)
                desc = "Invalid State";
                break;
 
+/****************************************************************************/
+/*  Config IOCStatus values                                                 */
+/****************************************************************************/
+
        case MPI_IOCSTATUS_CONFIG_INVALID_ACTION: /* 0x0020 */
        case MPI_IOCSTATUS_CONFIG_INVALID_TYPE:   /* 0x0021 */
        case MPI_IOCSTATUS_CONFIG_INVALID_PAGE:   /* 0x0022 */
        case MPI_IOCSTATUS_CONFIG_INVALID_DATA:   /* 0x0023 */
        case MPI_IOCSTATUS_CONFIG_NO_DEFAULTS:    /* 0x0024 */
        case MPI_IOCSTATUS_CONFIG_CANT_COMMIT:    /* 0x0025 */
-               /* No message for Config IOCStatus values */
+               mpt_iocstatus_info_config(ioc, status, mf);
                break;
 
+/****************************************************************************/
+/*  SCSIIO Reply (SPI, FCP, SAS) initiator values                           */
+/*                                                                          */
+/*  Look at mptscsih_iocstatus_info_scsiio in mptscsih.c */
+/*                                                                          */
+/****************************************************************************/
+
        case MPI_IOCSTATUS_SCSI_RECOVERED_ERROR: /* 0x0040 */
-               /* No message for recovered error
-               desc = "SCSI Recovered Error";
-               */
+       case MPI_IOCSTATUS_SCSI_DATA_UNDERRUN: /* 0x0045 */
+       case MPI_IOCSTATUS_SCSI_INVALID_BUS: /* 0x0041 */
+       case MPI_IOCSTATUS_SCSI_INVALID_TARGETID: /* 0x0042 */
+       case MPI_IOCSTATUS_SCSI_DEVICE_NOT_THERE: /* 0x0043 */
+       case MPI_IOCSTATUS_SCSI_DATA_OVERRUN: /* 0x0044 */
+       case MPI_IOCSTATUS_SCSI_IO_DATA_ERROR: /* 0x0046 */
+       case MPI_IOCSTATUS_SCSI_PROTOCOL_ERROR: /* 0x0047 */
+       case MPI_IOCSTATUS_SCSI_TASK_TERMINATED: /* 0x0048 */
+       case MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH: /* 0x0049 */
+       case MPI_IOCSTATUS_SCSI_TASK_MGMT_FAILED: /* 0x004A */
+       case MPI_IOCSTATUS_SCSI_IOC_TERMINATED: /* 0x004B */
+       case MPI_IOCSTATUS_SCSI_EXT_TERMINATED: /* 0x004C */
                break;
 
-       case MPI_IOCSTATUS_SCSI_INVALID_BUS: /* 0x0041 */
-               desc = "SCSI Invalid Bus";
+/****************************************************************************/
+/*  SCSI Target values                                                      */
+/****************************************************************************/
+
+       case MPI_IOCSTATUS_TARGET_PRIORITY_IO: /* 0x0060 */
+               desc = "Target: Priority IO";
                break;
 
-       case MPI_IOCSTATUS_SCSI_INVALID_TARGETID: /* 0x0042 */
-               desc = "SCSI Invalid TargetID";
+       case MPI_IOCSTATUS_TARGET_INVALID_PORT: /* 0x0061 */
+               desc = "Target: Invalid Port";
                break;
 
-       case MPI_IOCSTATUS_SCSI_DEVICE_NOT_THERE: /* 0x0043 */
-         {
-               SCSIIORequest_t *pScsiReq = (SCSIIORequest_t *) mf;
-               U8 cdb = pScsiReq->CDB[0];
-               if (cdb != 0x12) { /* Inquiry is issued for device scanning */
-                       desc = "SCSI Device Not There";
-               }
+       case MPI_IOCSTATUS_TARGET_INVALID_IO_INDEX: /* 0x0062 */
+               desc = "Target Invalid IO Index:";
                break;
-         }
 
-       case MPI_IOCSTATUS_SCSI_DATA_OVERRUN: /* 0x0044 */
-               desc = "SCSI Data Overrun";
+       case MPI_IOCSTATUS_TARGET_ABORTED: /* 0x0063 */
+               desc = "Target: Aborted";
                break;
 
-       case MPI_IOCSTATUS_SCSI_DATA_UNDERRUN: /* 0x0045 */
-               /* This error is checked in scsi_io_done(). Skip.
-               desc = "SCSI Data Underrun";
-               */
+       case MPI_IOCSTATUS_TARGET_NO_CONN_RETRYABLE: /* 0x0064 */
+               desc = "Target: No Conn Retryable";
                break;
 
-       case MPI_IOCSTATUS_SCSI_IO_DATA_ERROR: /* 0x0046 */
-               desc = "SCSI I/O Data Error";
+       case MPI_IOCSTATUS_TARGET_NO_CONNECTION: /* 0x0065 */
+               desc = "Target: No Connection";
                break;
 
-       case MPI_IOCSTATUS_SCSI_PROTOCOL_ERROR: /* 0x0047 */
-               desc = "SCSI Protocol Error";
+       case MPI_IOCSTATUS_TARGET_XFER_COUNT_MISMATCH: /* 0x006A */
+               desc = "Target: Transfer Count Mismatch";
                break;
 
-       case MPI_IOCSTATUS_SCSI_TASK_TERMINATED: /* 0x0048 */
-               desc = "SCSI Task Terminated";
+       case MPI_IOCSTATUS_TARGET_STS_DATA_NOT_SENT: /* 0x006B */
+               desc = "Target: STS Data not Sent";
                break;
 
-       case MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH: /* 0x0049 */
-               desc = "SCSI Residual Mismatch";
+       case MPI_IOCSTATUS_TARGET_DATA_OFFSET_ERROR: /* 0x006D */
+               desc = "Target: Data Offset Error";
                break;
 
-       case MPI_IOCSTATUS_SCSI_TASK_MGMT_FAILED: /* 0x004A */
-               desc = "SCSI Task Management Failed";
+       case MPI_IOCSTATUS_TARGET_TOO_MUCH_WRITE_DATA: /* 0x006E */
+               desc = "Target: Too Much Write Data";
                break;
 
-       case MPI_IOCSTATUS_SCSI_IOC_TERMINATED: /* 0x004B */
-               desc = "SCSI IOC Terminated";
+       case MPI_IOCSTATUS_TARGET_IU_TOO_SHORT: /* 0x006F */
+               desc = "Target: IU Too Short";
                break;
 
-       case MPI_IOCSTATUS_SCSI_EXT_TERMINATED: /* 0x004C */
-               desc = "SCSI Ext Terminated";
+       case MPI_IOCSTATUS_TARGET_ACK_NAK_TIMEOUT: /* 0x0070 */
+               desc = "Target: ACK NAK Timeout";
+               break;
+
+       case MPI_IOCSTATUS_TARGET_NAK_RECEIVED: /* 0x0071 */
+               desc = "Target: Nak Received";
+               break;
+
+/****************************************************************************/
+/*  Fibre Channel Direct Access values                                      */
+/****************************************************************************/
+
+       case MPI_IOCSTATUS_FC_ABORTED: /* 0x0066 */
+               desc = "FC: Aborted";
+               break;
+
+       case MPI_IOCSTATUS_FC_RX_ID_INVALID: /* 0x0067 */
+               desc = "FC: RX ID Invalid";
+               break;
+
+       case MPI_IOCSTATUS_FC_DID_INVALID: /* 0x0068 */
+               desc = "FC: DID Invalid";
+               break;
+
+       case MPI_IOCSTATUS_FC_NODE_LOGGED_OUT: /* 0x0069 */
+               desc = "FC: Node Logged Out";
+               break;
+
+       case MPI_IOCSTATUS_FC_EXCHANGE_CANCELED: /* 0x006C */
+               desc = "FC: Exchange Canceled";
+               break;
+
+/****************************************************************************/
+/*  LAN values                                                              */
+/****************************************************************************/
+
+       case MPI_IOCSTATUS_LAN_DEVICE_NOT_FOUND: /* 0x0080 */
+               desc = "LAN: Device not Found";
+               break;
+
+       case MPI_IOCSTATUS_LAN_DEVICE_FAILURE: /* 0x0081 */
+               desc = "LAN: Device Failure";
+               break;
+
+       case MPI_IOCSTATUS_LAN_TRANSMIT_ERROR: /* 0x0082 */
+               desc = "LAN: Transmit Error";
+               break;
+
+       case MPI_IOCSTATUS_LAN_TRANSMIT_ABORTED: /* 0x0083 */
+               desc = "LAN: Transmit Aborted";
+               break;
+
+       case MPI_IOCSTATUS_LAN_RECEIVE_ERROR: /* 0x0084 */
+               desc = "LAN: Receive Error";
+               break;
+
+       case MPI_IOCSTATUS_LAN_RECEIVE_ABORTED: /* 0x0085 */
+               desc = "LAN: Receive Aborted";
+               break;
+
+       case MPI_IOCSTATUS_LAN_PARTIAL_PACKET: /* 0x0086 */
+               desc = "LAN: Partial Packet";
+               break;
+
+       case MPI_IOCSTATUS_LAN_CANCELED: /* 0x0087 */
+               desc = "LAN: Canceled";
+               break;
+
+/****************************************************************************/
+/*  Serial Attached SCSI values                                             */
+/****************************************************************************/
+
+       case MPI_IOCSTATUS_SAS_SMP_REQUEST_FAILED: /* 0x0090 */
+               desc = "SAS: SMP Request Failed";
+               break;
+
+       case MPI_IOCSTATUS_SAS_SMP_DATA_OVERRUN: /* 0x0090 */
+               desc = "SAS: SMP Data Overrun";
                break;
 
        default:
                desc = "Others";
                break;
        }
-       if (desc != NULL)
-               printk(MYIOC_s_INFO_FMT "IOCStatus(0x%04x): %s\n", ioc->name, status, desc);
+
+       if (!desc)
+               return;
+
+       printk(MYIOC_s_INFO_FMT "IOCStatus(0x%04X): %s\n", ioc->name, status, desc);
 }
+#endif
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 EXPORT_SYMBOL(mpt_attach);
@@ -6434,6 +6998,7 @@ EXPORT_SYMBOL(mpt_findImVolumes);
 EXPORT_SYMBOL(mpt_alloc_fw_memory);
 EXPORT_SYMBOL(mpt_free_fw_memory);
 EXPORT_SYMBOL(mptbase_sas_persist_operation);
+EXPORT_SYMBOL(mpt_raid_phys_disk_pg0);
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /**
index e316708f76bd90e8777df1cda033ecb060834353..e3a39272aad6e2f5a059dce85ab9e87b3f5e620b 100644 (file)
@@ -6,7 +6,7 @@
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
  *  Copyright (c) 1999-2007 LSI Logic Corporation
- *  (mailto:mpt_linux_developer@lsil.com)
+ *  (mailto:mpt_linux_developer@lsi.com)
  *
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -75,8 +75,8 @@
 #define COPYRIGHT      "Copyright (c) 1999-2007 " MODULEAUTHOR
 #endif
 
-#define MPT_LINUX_VERSION_COMMON       "3.04.03"
-#define MPT_LINUX_PACKAGE_NAME         "@(#)mptlinux-3.04.03"
+#define MPT_LINUX_VERSION_COMMON       "3.04.04"
+#define MPT_LINUX_PACKAGE_NAME         "@(#)mptlinux-3.04.04"
 #define WHAT_MAGIC_STRING              "@" "(" "#" ")"
 
 #define show_mptmod_ver(s,ver)  \
 #define MPT_SCSI_SG_DEPTH      40
 #endif
 
+/* debug print string length used for events and iocstatus */
+# define EVENT_DESCR_STR_SZ             100
+
 #ifdef __KERNEL__      /* { */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 
@@ -334,8 +337,8 @@ typedef struct _VirtTarget {
        struct scsi_target      *starget;
        u8                       tflags;
        u8                       ioc_id;
-       u8                       target_id;
-       u8                       bus_id;
+       u8                       id;
+       u8                       channel;
        u8                       minSyncFactor; /* 0xFF is async */
        u8                       maxOffset;     /* 0 if async */
        u8                       maxWidth;      /* 0 if narrow, 1 if wide */
@@ -344,13 +347,12 @@ typedef struct _VirtTarget {
        u8                       type;          /* byte 0 of Inquiry data */
        u8                       deleted;       /* target in process of being removed */
        u32                      num_luns;
-       u32                      luns[8];               /* Max LUNs is 256 */
 } VirtTarget;
 
 typedef struct _VirtDevice {
        VirtTarget              *vtarget;
        u8                       configured_lun;
-       u32                      lun;
+       int                      lun;
 } VirtDevice;
 
 /*
@@ -412,7 +414,7 @@ typedef struct _MPT_IOCTL {
        u8                       rsvd;
        u8                       status;        /* current command status */
        u8                       reset;         /* 1 if bus reset allowed */
-       u8                       target;        /* target for reset */
+       u8                       id;            /* target for reset */
        struct mutex             ioctl_mutex;
 } MPT_IOCTL;
 
@@ -483,10 +485,24 @@ typedef   struct _SasCfgData {
                                                 */
 }SasCfgData;
 
+/*
+ * Inactive volume link list of raid component data
+ * @inactive_list
+ */
+struct inactive_raid_component_info {
+       struct   list_head list;
+       u8               volumeID;              /* volume target id */
+       u8               volumeBus;             /* volume channel */
+       IOC_3_PHYS_DISK  d;                     /* phys disk info */
+};
+
 typedef        struct _RaidCfgData {
        IOCPage2_t      *pIocPg2;               /* table of Raid Volumes */
        IOCPage3_t      *pIocPg3;               /* table of physical disks */
-       int              isRaid;                /* bit field, 1 if RAID */
+       struct semaphore        inactive_list_mutex;
+       struct list_head        inactive_list; /* link list for physical
+                                               disk that belong in
+                                               inactive volumes */
 }RaidCfgData;
 
 typedef struct _FcCfgData {
@@ -528,6 +544,8 @@ typedef struct _MPT_ADAPTER
        u32                      mem_phys;      /* == f4020000 (mmap) */
        u32                      pio_mem_phys;  /* Programmed IO (downloadboot) */
        int                      mem_size;      /* mmap memory size */
+       int                      number_of_buses;
+       int                      devices_per_bus;
        int                      alloc_total;
        u32                      last_state;
        int                      active;
@@ -607,6 +625,8 @@ typedef struct _MPT_ADAPTER
        u8                       persist_reply_frame[MPT_DEFAULT_FRAME_SIZE]; /* persist reply */
        LANPage0_t               lan_cnfg_page0;
        LANPage1_t               lan_cnfg_page1;
+
+       u8                       ir_firmware; /* =1 if IR firmware detected */
        /*
         * Description: errata_flag_1064
         * If a PCIX read occurs within 1 or 2 cycles after the chip receives
@@ -790,12 +810,6 @@ typedef struct _mpt_sge {
 #define ddvprintk(x)
 #endif
 
-#ifdef MPT_DEBUG_NEGO
-#define dnegoprintk(x)  printk x
-#else
-#define dnegoprintk(x)
-#endif
-
 #if defined(MPT_DEBUG_DV) || defined(MPT_DEBUG_DV_TINY)
 #define ddvtprintk(x)  printk x
 #else
@@ -957,7 +971,6 @@ typedef struct _MPT_SCSI_HOST {
        int                       port;
        u32                       pad0;
        struct scsi_cmnd        **ScsiLookup;
-       VirtTarget              **Targets;
        MPT_LOCAL_REPLY          *pLocal;               /* used for internal commands */
        struct timer_list         timer;
                /* Pool of memory for holding SCpnts before doing
@@ -981,6 +994,7 @@ typedef struct _MPT_SCSI_HOST {
        int                       scandv_wait_done;
        long                      last_queue_full;
        u16                       tm_iocstatus;
+       struct list_head          target_reset_list;
 } MPT_SCSI_HOST;
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -1046,6 +1060,7 @@ extern void        mpt_alloc_fw_memory(MPT_ADAPTER *ioc, int size);
 extern void     mpt_free_fw_memory(MPT_ADAPTER *ioc);
 extern int      mpt_findImVolumes(MPT_ADAPTER *ioc);
 extern int      mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode);
+extern int      mpt_raid_phys_disk_pg0(MPT_ADAPTER *ioc, u8 phys_disk_num, pRaidPhysDiskPage0_t phys_disk);
 
 /*
  *  Public data decl's...
index 504632da43470fdbbca038e9d7dc46e3f91fdde2..9d0f30478e464d5a08a15ed8bcc07a1ef01fe9c7 100644 (file)
@@ -5,7 +5,7 @@
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
  *  Copyright (c) 1999-2007 LSI Logic Corporation
- *  (mailto:mpt_linux_developer@lsil.com)
+ *  (mailto:mpt_linux_developer@lsi.com)
  *
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -313,7 +313,7 @@ static void mptctl_timeout_expired (MPT_IOCTL *ioctl)
                 */
                dctlprintk((MYIOC_s_INFO_FMT "Calling HardReset! \n",
                         ioctl->ioc->name));
-               mpt_HardResetHandler(ioctl->ioc, NO_SLEEP);
+               mpt_HardResetHandler(ioctl->ioc, CAN_SLEEP);
        }
        return;
 
@@ -361,7 +361,7 @@ static int mptctl_bus_reset(MPT_IOCTL *ioctl)
                        ioctl->ioc->name, mf));
 
        pScsiTm = (SCSITaskMgmt_t *) mf;
-       pScsiTm->TargetID = ioctl->target;
+       pScsiTm->TargetID = ioctl->id;
        pScsiTm->Bus = hd->port;        /* 0 */
        pScsiTm->ChainOffset = 0;
        pScsiTm->Function = MPI_FUNCTION_SCSI_TASK_MGMT;
@@ -1159,15 +1159,12 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
        struct mpt_ioctl_iocinfo *karg;
        MPT_ADAPTER             *ioc;
        struct pci_dev          *pdev;
-       struct Scsi_Host        *sh;
-       MPT_SCSI_HOST           *hd;
        int                     iocnum;
-       int                     numDevices = 0;
-       unsigned int            max_id;
-       int                     ii;
        unsigned int            port;
        int                     cim_rev;
        u8                      revision;
+       struct scsi_device      *sdev;
+       VirtDevice              *vdev;
 
        dctlprintk((": mptctl_getiocinfo called.\n"));
        /* Add of PCI INFO results in unaligned access for
@@ -1257,23 +1254,16 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
 
        /* Get number of devices
          */
-       if ((sh = ioc->sh) != NULL) {
-                /* sh->max_id = maximum target ID + 1
-                */
-               max_id = sh->max_id - 1;
-               hd = (MPT_SCSI_HOST *) sh->hostdata;
-
-               /* Check all of the target structures and
-                * keep a counter.
-                */
-               if (hd && hd->Targets) {
-                       for (ii = 0; ii <= max_id; ii++) {
-                               if (hd->Targets[ii])
-                                       numDevices++;
-                       }
+       karg->numDevices = 0;
+       if (ioc->sh) {
+               shost_for_each_device(sdev, ioc->sh) {
+                       vdev = sdev->hostdata;
+                       if (vdev->vtarget->tflags &
+                           MPT_TARGET_FLAGS_RAID_COMPONENT)
+                               continue;
+                       karg->numDevices++;
                }
        }
-       karg->numDevices = numDevices;
 
        /* Set the BIOS and FW Version
         */
@@ -1319,21 +1309,16 @@ mptctl_gettargetinfo (unsigned long arg)
        struct mpt_ioctl_targetinfo __user *uarg = (void __user *) arg;
        struct mpt_ioctl_targetinfo karg;
        MPT_ADAPTER             *ioc;
-       struct Scsi_Host        *sh;
-       MPT_SCSI_HOST           *hd;
-       VirtTarget              *vdev;
+       VirtDevice              *vdev;
        char                    *pmem;
        int                     *pdata;
-       IOCPage2_t              *pIoc2;
-       IOCPage3_t              *pIoc3;
        int                     iocnum;
        int                     numDevices = 0;
-       unsigned int            max_id;
-       int                     id, jj, indexed_lun, lun_index;
-       u32                     lun;
+       int                     lun;
        int                     maxWordsLeft;
        int                     numBytes;
-       u8                      port, devType, bus_id;
+       u8                      port;
+       struct scsi_device      *sdev;
 
        dctlprintk(("mptctl_gettargetinfo called.\n"));
        if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_targetinfo))) {
@@ -1389,74 +1374,22 @@ mptctl_gettargetinfo (unsigned long arg)
 
        /* Get number of devices
          */
-       if ((sh = ioc->sh) != NULL) {
-
-               max_id = sh->max_id - 1;
-               hd = (MPT_SCSI_HOST *) sh->hostdata;
-
-               /* Check all of the target structures.
-                * Save the Id and increment the counter,
-                * if ptr non-null.
-                * sh->max_id = maximum target ID + 1
-                */
-               if (hd && hd->Targets) {
-                       mpt_findImVolumes(ioc);
-                       pIoc2 = ioc->raid_data.pIocPg2;
-                       for ( id = 0; id <= max_id; ) {
-                               if ( pIoc2 && pIoc2->NumActiveVolumes ) {
-                                       if ( id == pIoc2->RaidVolume[0].VolumeID ) {
-                                               if (maxWordsLeft <= 0) {
-                                                       printk(KERN_ERR "mptctl_gettargetinfo - "
-                       "buffer is full but volume is available on ioc %d\n, numDevices=%d", iocnum, numDevices);
-                                                       goto data_space_full;
-                                               }
-                                               if ( ( pIoc2->RaidVolume[0].Flags & MPI_IOCPAGE2_FLAG_VOLUME_INACTIVE ) == 0 )
-                                                       devType = 0x80;
-                                               else
-                                                       devType = 0xC0;
-                                               bus_id = pIoc2->RaidVolume[0].VolumeBus;
-                                               numDevices++;
-                                               *pdata = ( (devType << 24) | (bus_id << 8) | id );
-                                               dctlprintk((KERN_ERR "mptctl_gettargetinfo - "
-               "volume ioc=%d target=%x numDevices=%d pdata=%p\n", iocnum, *pdata, numDevices, pdata));
-                                               pdata++;
-                                               --maxWordsLeft;
-                                               goto next_id;
-                                       } else {
-                                               pIoc3 = ioc->raid_data.pIocPg3;
-                                               for ( jj = 0; jj < pIoc3->NumPhysDisks; jj++ ) {
-                                                       if ( pIoc3->PhysDisk[jj].PhysDiskID == id )
-                                                               goto next_id;
-                                               }
-                                       }
-                               }
-                               if ( (vdev = hd->Targets[id]) ) {
-                                       for (jj = 0; jj <= MPT_LAST_LUN; jj++) {
-                                               lun_index = (jj >> 5);
-                                               indexed_lun = (jj % 32);
-                                               lun = (1 << indexed_lun);
-                                               if (vdev->luns[lun_index] & lun) {
-                                                       if (maxWordsLeft <= 0) {
-                                                               printk(KERN_ERR "mptctl_gettargetinfo - "
-                       "buffer is full but more targets are available on ioc %d numDevices=%d\n", iocnum, numDevices);
-                                                               goto data_space_full;
-                                                       }
-                                                       bus_id = vdev->bus_id;
-                                                       numDevices++;
-                                                       *pdata = ( (jj << 16) | (bus_id << 8) | id );
-                                                       dctlprintk((KERN_ERR "mptctl_gettargetinfo - "
-               "target ioc=%d target=%x numDevices=%d pdata=%p\n", iocnum, *pdata, numDevices, pdata));
-                                                       pdata++;
-                                                       --maxWordsLeft;
-                                               }
-                                       }
-                               }
-next_id:
-                               id++;
-                       }
+       if (ioc->sh){
+               shost_for_each_device(sdev, ioc->sh) {
+                       if (!maxWordsLeft)
+                               continue;
+                       vdev = sdev->hostdata;
+                       if (vdev->vtarget->tflags &
+                           MPT_TARGET_FLAGS_RAID_COMPONENT)
+                               continue;
+                       lun = (vdev->vtarget->raidVolume) ? 0x80 : vdev->lun;
+                       *pdata = (((u8)lun << 16) + (vdev->vtarget->channel << 8) +
+                           (vdev->vtarget->id ));
+                       pdata++;
+                       numDevices++;
+                       --maxWordsLeft;
                }
        }
-data_space_full:
        karg.numDevices = numDevices;
 
        /* Copy part of the data from kernel memory to user memory
@@ -1821,6 +1754,7 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
        int             msgContext;
        u16             req_idx;
        ulong           timeout;
+       struct scsi_device *sdev;
 
        dctlprintk(("mptctl_do_mpt_command called.\n"));
        bufIn.kptr = bufOut.kptr = NULL;
@@ -1902,14 +1836,13 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
        case MPI_FUNCTION_SCSI_IO_REQUEST:
                if (ioc->sh) {
                        SCSIIORequest_t *pScsiReq = (SCSIIORequest_t *) mf;
-                       VirtTarget      *pTarget = NULL;
-                       MPT_SCSI_HOST   *hd = NULL;
                        int qtag = MPI_SCSIIO_CONTROL_UNTAGGED;
                        int scsidir = 0;
-                       int target = (int) pScsiReq->TargetID;
                        int dataSize;
+                       u32 id;
 
-                       if ((target < 0) || (target >= ioc->sh->max_id)) {
+                       id = (ioc->devices_per_bus == 0) ? 256 : ioc->devices_per_bus;
+                       if (pScsiReq->TargetID > id) {
                                printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
                                        "Target ID out of bounds. \n",
                                        __FILE__, __LINE__);
@@ -1917,6 +1850,14 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
                                goto done_free_mem;
                        }
 
+                       if (pScsiReq->Bus >= ioc->number_of_buses) {
+                               printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
+                                       "Target Bus out of bounds. \n",
+                                       __FILE__, __LINE__);
+                               rc = -ENODEV;
+                               goto done_free_mem;
+                       }
+
                        pScsiReq->MsgFlags &= ~MPI_SCSIIO_MSGFLGS_SENSE_WIDTH;
                        pScsiReq->MsgFlags |= mpt_msg_flags();
 
@@ -1936,13 +1877,15 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
                                cpu_to_le32(ioc->sense_buf_low_dma
                                   + (req_idx * MPT_SENSE_BUFFER_ALLOC));
 
-                       if ((hd = (MPT_SCSI_HOST *) ioc->sh->hostdata)) {
-                               if (hd->Targets)
-                                       pTarget = hd->Targets[target];
-                       }
+                       shost_for_each_device(sdev, ioc->sh) {
+                               struct scsi_target *starget = scsi_target(sdev);
+                               VirtTarget *vtarget = starget->hostdata;
 
-                       if (pTarget &&(pTarget->tflags & MPT_TARGET_FLAGS_Q_YES))
-                               qtag = MPI_SCSIIO_CONTROL_SIMPLEQ;
+                               if ((pScsiReq->TargetID == vtarget->id) &&
+                                   (pScsiReq->Bus == vtarget->channel) &&
+                                   (vtarget->tflags & MPT_TARGET_FLAGS_Q_YES))
+                                       qtag = MPI_SCSIIO_CONTROL_SIMPLEQ;
+                       }
 
                        /* Have the IOCTL driver set the direction based
                         * on the dataOutSize (ordering issue with Sparc).
@@ -1959,7 +1902,7 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
                        pScsiReq->DataLength = cpu_to_le32(dataSize);
 
                        ioc->ioctl->reset = MPTCTL_RESET_OK;
-                       ioc->ioctl->target = target;
+                       ioc->ioctl->id = pScsiReq->TargetID;
 
                } else {
                        printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
@@ -2038,7 +1981,7 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
                        pScsiReq->DataLength = cpu_to_le32(dataSize);
 
                        ioc->ioctl->reset = MPTCTL_RESET_OK;
-                       ioc->ioctl->target = pScsiReq->TargetID;
+                       ioc->ioctl->id = pScsiReq->TargetID;
                } else {
                        printk(KERN_ERR "%s@%d::mptctl_do_mpt_command - "
                                "SCSI driver is not loaded. \n",
@@ -2719,7 +2662,7 @@ mptctl_hp_targetinfo(unsigned long arg)
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 
-static struct file_operations mptctl_fops = {
+static const struct file_operations mptctl_fops = {
        .owner =        THIS_MODULE,
        .llseek =       no_llseek,
        .release =      mptctl_release,
index e65a1cf5eb0b776f26b265641c729aaa80948563..f7e72c5e47de28bbff0263ae1ecb8930bef1aa58 100644 (file)
@@ -6,7 +6,7 @@
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
  *  Copyright (c) 1999-2007 LSI Logic Corporation
- *  (mailto:mpt_linux_developer@lsil.com)
+ *  (mailto:mpt_linux_developer@lsi.com)
  *
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
index c819c23b55b1aeb3ca477fd6c689c9cbc0134ff3..0caaf64039936eb7690e5fbba93291b8c34058c8 100644 (file)
@@ -4,7 +4,7 @@
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
  *  Copyright (c) 1999-2007 LSI Logic Corporation
- *  (mailto:mpt_linux_developer@lsil.com)
+ *  (mailto:mpt_linux_developer@lsi.com)
  *
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -53,7 +53,6 @@
 #include <linux/delay.h>       /* for mdelay */
 #include <linux/interrupt.h>   /* needed for in_interrupt() proto */
 #include <linux/reboot.h>      /* notifier code */
-#include <linux/sched.h>
 #include <linux/workqueue.h>
 #include <linux/sort.h>
 
@@ -86,6 +85,12 @@ MODULE_PARM_DESC(mptfc_dev_loss_tmo, " Initial time the driver programs the "
                                     " return following a device loss event."
                                     "  Default=60.");
 
+/* scsi-mid layer global parmeter is max_report_luns, which is 511 */
+#define MPTFC_MAX_LUN (16895)
+static int max_lun = MPTFC_MAX_LUN;
+module_param(max_lun, int, 0);
+MODULE_PARM_DESC(max_lun, " max lun, default=16895 ");
+
 static int     mptfcDoneCtx = -1;
 static int     mptfcTaskCtx = -1;
 static int     mptfcInternalCtx = -1; /* Used only for internal commands */
@@ -292,10 +297,9 @@ mptfc_GetFcDevPage0(MPT_ADAPTER *ioc, int ioc_port,
        U32                      port_id = 0xffffff;
        int                      num_targ = 0;
        int                      max_bus = ioc->facts.MaxBuses;
-       int                      max_targ = ioc->facts.MaxDevices;
+       int                      max_targ;
 
-       if (max_bus == 0 || max_targ == 0)
-               goto out;
+       max_targ = (ioc->facts.MaxDevices == 0) ? 256 : ioc->facts.MaxDevices;
 
        data_sz = sizeof(FCDevicePage0_t) * max_bus * max_targ;
        p_p0 = p0_array =  kzalloc(data_sz, GFP_KERNEL);
@@ -467,8 +471,8 @@ mptfc_register_dev(MPT_ADAPTER *ioc, int channel, FCDevicePage0_t *pg0)
                        if (ri->starget) {
                                vtarget = ri->starget->hostdata;
                                if (vtarget) {
-                                       vtarget->target_id = pg0->CurrentTargetID;
-                                       vtarget->bus_id = pg0->CurrentBus;
+                                       vtarget->id = pg0->CurrentTargetID;
+                                       vtarget->channel = pg0->CurrentBus;
                                }
                        }
                        *((struct mptfc_rport_info **)rport->dd_data) = ri;
@@ -540,8 +544,8 @@ mptfc_target_alloc(struct scsi_target *starget)
        if (rport) {
                ri = *((struct mptfc_rport_info **)rport->dd_data);
                if (ri) {       /* better be! */
-                       vtarget->target_id = ri->pg0.CurrentTargetID;
-                       vtarget->bus_id = ri->pg0.CurrentBus;
+                       vtarget->id = ri->pg0.CurrentTargetID;
+                       vtarget->channel = ri->pg0.CurrentBus;
                        ri->starget = starget;
                        rc = 0;
                }
@@ -592,7 +596,6 @@ mptfc_slave_alloc(struct scsi_device *sdev)
        if (vtarget->num_luns == 0) {
                vtarget->ioc_id = hd->ioc->id;
                vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
-               hd->Targets[sdev->id] = vtarget;
        }
 
        vdev->vtarget = vtarget;
@@ -630,16 +633,17 @@ mptfc_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
        struct mptfc_rport_info *ri;
        struct fc_rport *rport = starget_to_rport(scsi_target(SCpnt->device));
        int             err;
+       VirtDevice      *vdev = SCpnt->device->hostdata;
 
-       err = fc_remote_port_chkready(rport);
-       if (unlikely(err)) {
-               SCpnt->result = err;
+       if (!vdev || !vdev->vtarget) {
+               SCpnt->result = DID_NO_CONNECT << 16;
                done(SCpnt);
                return 0;
        }
 
-       if (!SCpnt->device->hostdata) { /* vdev */
-               SCpnt->result = DID_NO_CONNECT << 16;
+       err = fc_remote_port_chkready(rport);
+       if (unlikely(err)) {
+               SCpnt->result = err;
                done(SCpnt);
                return 0;
        }
@@ -1143,7 +1147,7 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                printk(MYIOC_s_WARN_FMT
                        "Skipping ioc=%p because SCSI Initiator mode is NOT enabled!\n",
                        ioc->name, ioc);
-               return -ENODEV;
+               return 0;
        }
 
        sh = scsi_host_alloc(&mptfc_driver_template, sizeof(MPT_SCSI_HOST));
@@ -1173,10 +1177,9 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        /* set 16 byte cdb's */
        sh->max_cmd_len = 16;
 
-       sh->max_id = MPT_MAX_FC_DEVICES<256 ? MPT_MAX_FC_DEVICES : 255;
+       sh->max_id = ioc->pfacts->MaxDevices;
+       sh->max_lun = max_lun;
 
-       sh->max_lun = MPT_LAST_LUN + 1;
-       sh->max_channel = 0;
        sh->this_id = ioc->pfacts[0].PortSCSIID;
 
        /* Required entry.
@@ -1230,19 +1233,6 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p\n",
                 ioc->name, hd->ScsiLookup));
 
-       /* Allocate memory for the device structures.
-        * A non-Null pointer at an offset
-        * indicates a device exists.
-        * max_id = 1 + maximum id (hosts.h)
-        */
-       hd->Targets = kcalloc(sh->max_id, sizeof(void *), GFP_ATOMIC);
-       if (!hd->Targets) {
-               error = -ENOMEM;
-               goto out_mptfc_probe;
-       }
-
-       dprintk((KERN_INFO "  vdev @ %p\n", hd->Targets));
-
        /* Clear the TM flags
         */
        hd->tmPending = 0;
index 2936204d8ad629f367cbdc00af8156ffd14bf5a5..b691292ff59969fcafc3607ad7f426cc289d1ec9 100644 (file)
@@ -5,6 +5,7 @@
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
  *  Copyright (c) 2000-2007 LSI Logic Corporation
+ *  (mailto:mpt_linux_developer@lsi.com)
  *
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
index 70ab75e7c263174a3a45020d7c503d21d3c1aa89..fe438bf119f61204b86bc17dc577e86991acfbb7 100644 (file)
@@ -5,6 +5,7 @@
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
  *  Copyright (c) 2000-2007 LSI Logic Corporation
+ *  (mailto:mpt_linux_developer@lsi.com)
  *
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
index 09e9a9d96410942dcfe21bb2d0484ee8f0956693..404c014db1bdaa30538a4f2fff0c25b2151f7e47 100644 (file)
@@ -4,7 +4,7 @@
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
  *  Copyright (c) 1999-2007 LSI Logic Corporation
- *  (mailto:mpt_linux_developer@lsil.com)
+ *  (mailto:mpt_linux_developer@lsi.com)
  *  Copyright (c) 2005-2007 Dell
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -48,7 +48,7 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/errno.h>
-#include <linux/sched.h>
+#include <linux/jiffies.h>
 #include <linux/workqueue.h>
 #include <linux/delay.h>       /* for mdelay */
 
@@ -83,17 +83,31 @@ MODULE_PARM_DESC(mpt_pt_clear,
                " Clear persistency table: enable=1  "
                "(default=MPTSCSIH_PT_CLEAR=0)");
 
+/* scsi-mid layer global parmeter is max_report_luns, which is 511 */
+#define MPTSAS_MAX_LUN (16895)
+static int max_lun = MPTSAS_MAX_LUN;
+module_param(max_lun, int, 0);
+MODULE_PARM_DESC(max_lun, " max lun, default=16895 ");
+
 static int     mptsasDoneCtx = -1;
 static int     mptsasTaskCtx = -1;
 static int     mptsasInternalCtx = -1; /* Used only for internal commands */
 static int     mptsasMgmtCtx = -1;
 
+static void mptsas_hotplug_work(struct work_struct *work);
+
+struct mptsas_target_reset_event {
+       struct list_head        list;
+       EVENT_DATA_SAS_DEVICE_STATUS_CHANGE sas_event_data;
+       u8      target_reset_issued;
+};
 
 enum mptsas_hotplug_action {
        MPTSAS_ADD_DEVICE,
        MPTSAS_DEL_DEVICE,
        MPTSAS_ADD_RAID,
        MPTSAS_DEL_RAID,
+       MPTSAS_ADD_INACTIVE_VOLUME,
        MPTSAS_IGNORE_EVENT,
 };
 
@@ -102,14 +116,15 @@ struct mptsas_hotplug_event {
        MPT_ADAPTER             *ioc;
        enum mptsas_hotplug_action event_type;
        u64                     sas_address;
-       u32                     channel;
-       u32                     id;
+       u                     channel;
+       u                     id;
        u32                     device_info;
        u16                     handle;
        u16                     parent_handle;
        u8                      phy_id;
-       u8                      phys_disk_num;
-       u8                      phys_disk_num_valid;
+       u8                      phys_disk_num_valid;    /* hrc (hidden raid component) */
+       u8                      phys_disk_num;          /* hrc - unique index*/
+       u8                      hidden_raid_component;  /* hrc - don't expose*/
 };
 
 struct mptsas_discovery_event {
@@ -134,6 +149,7 @@ struct mptsas_devinfo {
        u8      port_id;        /* sas physical port this device
                                   is assoc'd with */
        u8      id;             /* logical target id of this device */
+       u32     phys_disk_num;  /* phys disk id, for csmi-ioctls */
        u8      channel;        /* logical bus number of this device */
        u64     sas_address;    /* WWN of this device,
                                   SATA is assigned by HBA,expander */
@@ -153,6 +169,7 @@ struct mptsas_portinfo_details{
 };
 
 struct mptsas_phyinfo {
+       u16     handle;                 /* unique id to address this */
        u8      phy_id;                 /* phy index */
        u8      port_id;                /* firmware port identifier */
        u8      negotiated_link_rate;   /* nego'd link rate for this phy */
@@ -168,7 +185,6 @@ struct mptsas_phyinfo {
 
 struct mptsas_portinfo {
        struct list_head list;
-       u16             handle;         /* unique id to address this */
        u16             num_phys;       /* number of phys */
        struct mptsas_phyinfo *phy_info;
 };
@@ -561,22 +577,273 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
        mutex_unlock(&ioc->sas_topology_mutex);
 }
 
+/**
+ * csmisas_find_vtarget
+ *
+ * @ioc
+ * @volume_id
+ * @volume_bus
+ *
+ **/
+static VirtTarget *
+mptsas_find_vtarget(MPT_ADAPTER *ioc, u8 channel, u8 id)
+{
+       struct scsi_device              *sdev;
+       VirtDevice                      *vdev;
+       VirtTarget                      *vtarget = NULL;
+
+       shost_for_each_device(sdev, ioc->sh) {
+               if ((vdev = sdev->hostdata) == NULL)
+                       continue;
+               if (vdev->vtarget->id == id &&
+                   vdev->vtarget->channel == channel)
+                       vtarget = vdev->vtarget;
+       }
+       return vtarget;
+}
+
+/**
+ * mptsas_target_reset
+ *
+ * Issues TARGET_RESET to end device using handshaking method
+ *
+ * @ioc
+ * @channel
+ * @id
+ *
+ * Returns (1) success
+ *         (0) failure
+ *
+ **/
+static int
+mptsas_target_reset(MPT_ADAPTER *ioc, u8 channel, u8 id)
+{
+       MPT_FRAME_HDR   *mf;
+       SCSITaskMgmt_t  *pScsiTm;
+
+       if ((mf = mpt_get_msg_frame(ioc->TaskCtx, ioc)) == NULL) {
+               dfailprintk((MYIOC_s_WARN_FMT "%s, no msg frames @%d!!\n",
+                   ioc->name,__FUNCTION__, __LINE__));
+               return 0;
+       }
+
+       /* Format the Request
+        */
+       pScsiTm = (SCSITaskMgmt_t *) mf;
+       memset (pScsiTm, 0, sizeof(SCSITaskMgmt_t));
+       pScsiTm->TargetID = id;
+       pScsiTm->Bus = channel;
+       pScsiTm->Function = MPI_FUNCTION_SCSI_TASK_MGMT;
+       pScsiTm->TaskType = MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
+       pScsiTm->MsgFlags = MPI_SCSITASKMGMT_MSGFLAGS_LIPRESET_RESET_OPTION;
+
+       DBG_DUMP_TM_REQUEST_FRAME(mf);
+
+       if (mpt_send_handshake_request(ioc->TaskCtx, ioc,
+           sizeof(SCSITaskMgmt_t), (u32 *)mf, NO_SLEEP)) {
+               mpt_free_msg_frame(ioc, mf);
+               dfailprintk((MYIOC_s_WARN_FMT "%s, tm handshake failed @%d!!\n",
+                   ioc->name,__FUNCTION__, __LINE__));
+               return 0;
+       }
+
+       return 1;
+}
+
+/**
+ * mptsas_target_reset_queue
+ *
+ * Receive request for TARGET_RESET after recieving an firmware
+ * event NOT_RESPONDING_EVENT, then put command in link list
+ * and queue if task_queue already in use.
+ *
+ * @ioc
+ * @sas_event_data
+ *
+ **/
 static void
-mptsas_target_reset(MPT_ADAPTER *ioc, VirtTarget * vtarget)
+mptsas_target_reset_queue(MPT_ADAPTER *ioc,
+    EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data)
 {
-       MPT_SCSI_HOST           *hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
+       MPT_SCSI_HOST   *hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
+       VirtTarget *vtarget = NULL;
+       struct mptsas_target_reset_event *target_reset_list;
+       u8              id, channel;
 
-       if (mptscsih_TMHandler(hd,
-            MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET,
-            vtarget->bus_id, vtarget->target_id, 0, 0, 5) < 0) {
-               hd->tmPending = 0;
-               hd->tmState = TM_STATE_NONE;
-               printk(MYIOC_s_WARN_FMT
-              "Error processing TaskMgmt id=%d TARGET_RESET\n",
-                       ioc->name, vtarget->target_id);
+       id = sas_event_data->TargetID;
+       channel = sas_event_data->Bus;
+
+       if (!(vtarget = mptsas_find_vtarget(ioc, channel, id)))
+               return;
+
+       vtarget->deleted = 1; /* block IO */
+
+       target_reset_list = kzalloc(sizeof(*target_reset_list),
+           GFP_ATOMIC);
+       if (!target_reset_list) {
+               dfailprintk((MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n",
+                   ioc->name,__FUNCTION__, __LINE__));
+               return;
+       }
+
+       memcpy(&target_reset_list->sas_event_data, sas_event_data,
+               sizeof(*sas_event_data));
+       list_add_tail(&target_reset_list->list, &hd->target_reset_list);
+
+       if (hd->resetPending)
+               return;
+
+       if (mptsas_target_reset(ioc, channel, id)) {
+               target_reset_list->target_reset_issued = 1;
+               hd->resetPending = 1;
        }
 }
 
+/**
+ * mptsas_dev_reset_complete
+ *
+ * Completion for TARGET_RESET after NOT_RESPONDING_EVENT,
+ * enable work queue to finish off removing device from upper layers.
+ * then send next TARGET_RESET in the queue.
+ *
+ * @ioc
+ *
+ **/
+static void
+mptsas_dev_reset_complete(MPT_ADAPTER *ioc)
+{
+       MPT_SCSI_HOST   *hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
+        struct list_head *head = &hd->target_reset_list;
+       struct mptsas_target_reset_event *target_reset_list;
+       struct mptsas_hotplug_event *ev;
+       EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *sas_event_data;
+       u8              id, channel;
+       __le64          sas_address;
+
+       if (list_empty(head))
+               return;
+
+       target_reset_list = list_entry(head->next, struct mptsas_target_reset_event, list);
+
+       sas_event_data = &target_reset_list->sas_event_data;
+       id = sas_event_data->TargetID;
+       channel = sas_event_data->Bus;
+       hd->resetPending = 0;
+
+       /*
+        * retry target reset
+        */
+       if (!target_reset_list->target_reset_issued) {
+               if (mptsas_target_reset(ioc, channel, id)) {
+                       target_reset_list->target_reset_issued = 1;
+                       hd->resetPending = 1;
+               }
+               return;
+       }
+
+       /*
+        * enable work queue to remove device from upper layers
+        */
+       list_del(&target_reset_list->list);
+
+       ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
+       if (!ev) {
+               dfailprintk((MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n",
+                   ioc->name,__FUNCTION__, __LINE__));
+               return;
+       }
+
+       INIT_WORK(&ev->work, mptsas_hotplug_work);
+       ev->ioc = ioc;
+       ev->handle = le16_to_cpu(sas_event_data->DevHandle);
+       ev->parent_handle =
+           le16_to_cpu(sas_event_data->ParentDevHandle);
+       ev->channel = channel;
+       ev->id =id;
+       ev->phy_id = sas_event_data->PhyNum;
+       memcpy(&sas_address, &sas_event_data->SASAddress,
+           sizeof(__le64));
+       ev->sas_address = le64_to_cpu(sas_address);
+       ev->device_info = le32_to_cpu(sas_event_data->DeviceInfo);
+       ev->event_type = MPTSAS_DEL_DEVICE;
+       schedule_work(&ev->work);
+       kfree(target_reset_list);
+
+       /*
+        * issue target reset to next device in the queue
+        */
+
+       head = &hd->target_reset_list;
+       if (list_empty(head))
+               return;
+
+       target_reset_list = list_entry(head->next, struct mptsas_target_reset_event,
+           list);
+
+       sas_event_data = &target_reset_list->sas_event_data;
+       id = sas_event_data->TargetID;
+       channel = sas_event_data->Bus;
+
+       if (mptsas_target_reset(ioc, channel, id)) {
+               target_reset_list->target_reset_issued = 1;
+               hd->resetPending = 1;
+       }
+}
+
+/**
+ * mptsas_taskmgmt_complete
+ *
+ * @ioc
+ * @mf
+ * @mr
+ *
+ **/
+static int
+mptsas_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
+{
+       mptsas_dev_reset_complete(ioc);
+       return mptscsih_taskmgmt_complete(ioc, mf, mr);
+}
+
+/**
+ * mptscsih_ioc_reset
+ *
+ * @ioc
+ * @reset_phase
+ *
+ **/
+static int
+mptsas_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
+{
+       MPT_SCSI_HOST   *hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
+       struct mptsas_target_reset_event *target_reset_list, *n;
+       int rc;
+
+       rc = mptscsih_ioc_reset(ioc, reset_phase);
+
+       if (ioc->bus_type != SAS)
+               goto out;
+
+       if (reset_phase != MPT_IOC_POST_RESET)
+               goto out;
+
+       if (!hd || !hd->ioc)
+               goto out;
+
+       if (list_empty(&hd->target_reset_list))
+               goto out;
+
+       /* flush the target_reset_list */
+       list_for_each_entry_safe(target_reset_list, n,
+           &hd->target_reset_list, list) {
+               list_del(&target_reset_list->list);
+               kfree(target_reset_list);
+       }
+
+ out:
+       return rc;
+}
+
 static int
 mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure,
                u32 form, u32 form_specific)
@@ -661,8 +928,7 @@ mptsas_target_alloc(struct scsi_target *starget)
        struct Scsi_Host *host = dev_to_shost(&starget->dev);
        MPT_SCSI_HOST           *hd = (MPT_SCSI_HOST *)host->hostdata;
        VirtTarget              *vtarget;
-       u32                     target_id;
-       u32                     channel;
+       u8                      id, channel;
        struct sas_rphy         *rphy;
        struct mptsas_portinfo  *p;
        int                      i;
@@ -673,15 +939,19 @@ mptsas_target_alloc(struct scsi_target *starget)
 
        vtarget->starget = starget;
        vtarget->ioc_id = hd->ioc->id;
-       vtarget->tflags = MPT_TARGET_FLAGS_Q_YES|MPT_TARGET_FLAGS_VALID_INQUIRY;
-
-       target_id = starget->id;
+       vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
+       id = starget->id;
        channel = 0;
 
-       hd->Targets[target_id] = vtarget;
-
-       if (starget->channel == MPTSAS_RAID_CHANNEL)
+       /*
+        * RAID volumes placed beyond the last expected port.
+        */
+       if (starget->channel == MPTSAS_RAID_CHANNEL) {
+               for (i=0; i < hd->ioc->raid_data.pIocPg2->NumActiveVolumes; i++)
+                       if (id == hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID)
+                               channel = hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeBus;
                goto out;
+       }
 
        rphy = dev_to_rphy(starget->dev.parent);
        mutex_lock(&hd->ioc->sas_topology_mutex);
@@ -690,18 +960,19 @@ mptsas_target_alloc(struct scsi_target *starget)
                        if (p->phy_info[i].attached.sas_address !=
                                        rphy->identify.sas_address)
                                continue;
-                       target_id = p->phy_info[i].attached.id;
+                       id = p->phy_info[i].attached.id;
                        channel = p->phy_info[i].attached.channel;
                        mptsas_set_starget(&p->phy_info[i], starget);
 
                        /*
                         * Exposing hidden raid components
                         */
-                       if (mptscsih_is_phys_disk(hd->ioc, target_id)) {
-                               target_id = mptscsih_raid_id_to_num(hd,
-                                               target_id);
+                       if (mptscsih_is_phys_disk(hd->ioc, channel, id)) {
+                               id = mptscsih_raid_id_to_num(hd->ioc,
+                                               channel, id);
                                vtarget->tflags |=
                                    MPT_TARGET_FLAGS_RAID_COMPONENT;
+                               p->phy_info[i].attached.phys_disk_num = id;
                        }
                        mutex_unlock(&hd->ioc->sas_topology_mutex);
                        goto out;
@@ -713,8 +984,8 @@ mptsas_target_alloc(struct scsi_target *starget)
        return -ENXIO;
 
  out:
-       vtarget->target_id = target_id;
-       vtarget->bus_id = channel;
+       vtarget->id = id;
+       vtarget->channel = channel;
        starget->hostdata = vtarget;
        return 0;
 }
@@ -786,7 +1057,8 @@ mptsas_slave_alloc(struct scsi_device *sdev)
                         * Exposing hidden raid components
                         */
                        if (mptscsih_is_phys_disk(hd->ioc,
-                                       p->phy_info[i].attached.id))
+                           p->phy_info[i].attached.channel,
+                           p->phy_info[i].attached.id))
                                sdev->no_uld_attach = 1;
                        mutex_unlock(&hd->ioc->sas_topology_mutex);
                        goto out;
@@ -808,13 +1080,14 @@ mptsas_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
 {
        VirtDevice      *vdev = SCpnt->device->hostdata;
 
-//     scsi_print_command(SCpnt);
-       if (vdev->vtarget->deleted) {
+       if (!vdev || !vdev->vtarget || vdev->vtarget->deleted) {
                SCpnt->result = DID_NO_CONNECT << 16;
                done(SCpnt);
                return 0;
        }
 
+//     scsi_print_command(SCpnt);
+
        return mptscsih_qcmd(SCpnt,done);
 }
 
@@ -1114,9 +1387,6 @@ mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
                goto out_free_consistent;
        }
 
-       if (port_info->num_phys)
-               port_info->handle =
-                   le16_to_cpu(buffer->PhyData[0].ControllerDevHandle);
        for (i = 0; i < port_info->num_phys; i++) {
                mptsas_print_phy_data(&buffer->PhyData[i]);
                port_info->phy_info[i].phy_id = i;
@@ -1125,6 +1395,8 @@ mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
                port_info->phy_info[i].negotiated_link_rate =
                    buffer->PhyData[i].NegotiatedLinkRate;
                port_info->phy_info[i].portinfo = port_info;
+               port_info->phy_info[i].handle =
+                   le16_to_cpu(buffer->PhyData[i].ControllerDevHandle);
        }
 
  out_free_consistent:
@@ -1261,6 +1533,7 @@ mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info,
        device_info->phy_id = buffer->PhyNum;
        device_info->port_id = buffer->PhysicalPort;
        device_info->id = buffer->TargetID;
+       device_info->phys_disk_num = ~0;
        device_info->channel = buffer->Bus;
        memcpy(&sas_address, &buffer->SASAddress, sizeof(__le64));
        device_info->sas_address = le64_to_cpu(sas_address);
@@ -1325,7 +1598,6 @@ mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info,
 
        /* save config data */
        port_info->num_phys = buffer->NumPhys;
-       port_info->handle = le16_to_cpu(buffer->DevHandle);
        port_info->phy_info = kcalloc(port_info->num_phys,
                sizeof(*port_info->phy_info),GFP_KERNEL);
        if (!port_info->phy_info) {
@@ -1333,8 +1605,11 @@ mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info,
                goto out_free_consistent;
        }
 
-       for (i = 0; i < port_info->num_phys; i++)
+       for (i = 0; i < port_info->num_phys; i++) {
                port_info->phy_info[i].portinfo = port_info;
+               port_info->phy_info[i].handle =
+                   le16_to_cpu(buffer->DevHandle);
+       }
 
  out_free_consistent:
        pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4,
@@ -1702,7 +1977,6 @@ static int
 mptsas_probe_hba_phys(MPT_ADAPTER *ioc)
 {
        struct mptsas_portinfo *port_info, *hba;
-       u32 handle = 0xFFFF;
        int error = -ENOMEM, i;
 
        hba = kzalloc(sizeof(*port_info), GFP_KERNEL);
@@ -1714,34 +1988,36 @@ mptsas_probe_hba_phys(MPT_ADAPTER *ioc)
                goto out_free_port_info;
 
        mutex_lock(&ioc->sas_topology_mutex);
-       ioc->handle = hba->handle;
-       port_info = mptsas_find_portinfo_by_handle(ioc, hba->handle);
+       ioc->handle = hba->phy_info[0].handle;
+       port_info = mptsas_find_portinfo_by_handle(ioc, ioc->handle);
        if (!port_info) {
                port_info = hba;
                list_add_tail(&port_info->list, &ioc->sas_topology);
        } else {
-               port_info->handle = hba->handle;
-               for (i = 0; i < hba->num_phys; i++)
+               for (i = 0; i < hba->num_phys; i++) {
                        port_info->phy_info[i].negotiated_link_rate =
                                hba->phy_info[i].negotiated_link_rate;
+                       port_info->phy_info[i].handle =
+                               hba->phy_info[i].handle;
+                       port_info->phy_info[i].port_id =
+                               hba->phy_info[i].port_id;
+               }
                kfree(hba->phy_info);
                kfree(hba);
                hba = NULL;
        }
        mutex_unlock(&ioc->sas_topology_mutex);
-
        for (i = 0; i < port_info->num_phys; i++) {
                mptsas_sas_phy_pg0(ioc, &port_info->phy_info[i],
                        (MPI_SAS_PHY_PGAD_FORM_PHY_NUMBER <<
                         MPI_SAS_PHY_PGAD_FORM_SHIFT), i);
 
                mptsas_sas_device_pg0(ioc, &port_info->phy_info[i].identify,
-                       (MPI_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE <<
-                        MPI_SAS_DEVICE_PGAD_FORM_SHIFT), handle);
+                       (MPI_SAS_DEVICE_PGAD_FORM_HANDLE <<
+                        MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
+                        port_info->phy_info[i].handle);
                port_info->phy_info[i].identify.phy_id =
-                   port_info->phy_info[i].phy_id;
-               handle = port_info->phy_info[i].identify.handle;
-
+                   port_info->phy_info[i].phy_id = i;
                if (port_info->phy_info[i].attached.handle)
                        mptsas_sas_device_pg0(ioc,
                                &port_info->phy_info[i].attached,
@@ -1777,12 +2053,12 @@ mptsas_probe_expander_phys(MPT_ADAPTER *ioc, u32 *handle)
                goto out;
 
        error = mptsas_sas_expander_pg0(ioc, ex,
-               (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE <<
-                MPI_SAS_EXPAND_PGAD_FORM_SHIFT), *handle);
+           (MPI_SAS_EXPAND_PGAD_FORM_GET_NEXT_HANDLE <<
+            MPI_SAS_EXPAND_PGAD_FORM_SHIFT), *handle);
        if (error)
                goto out_free_port_info;
 
-       *handle = ex->handle;
+       *handle = ex->phy_info[0].handle;
 
        mutex_lock(&ioc->sas_topology_mutex);
        port_info = mptsas_find_portinfo_by_handle(ioc, *handle);
@@ -1790,7 +2066,12 @@ mptsas_probe_expander_phys(MPT_ADAPTER *ioc, u32 *handle)
                port_info = ex;
                list_add_tail(&port_info->list, &ioc->sas_topology);
        } else {
-               port_info->handle = ex->handle;
+               for (i = 0; i < ex->num_phys; i++) {
+                       port_info->phy_info[i].handle =
+                               ex->phy_info[i].handle;
+                       port_info->phy_info[i].port_id =
+                               ex->phy_info[i].port_id;
+               }
                kfree(ex->phy_info);
                kfree(ex);
                ex = NULL;
@@ -1868,8 +2149,6 @@ mptsas_delete_expander_phys(MPT_ADAPTER *ioc)
        struct mptsas_portinfo buffer;
        struct mptsas_portinfo *port_info, *n, *parent;
        struct mptsas_phyinfo *phy_info;
-       struct scsi_target * starget;
-       VirtTarget * vtarget;
        struct sas_port * port;
        int i;
        u64     expander_sas_address;
@@ -1884,26 +2163,8 @@ mptsas_delete_expander_phys(MPT_ADAPTER *ioc)
 
                if (mptsas_sas_expander_pg0(ioc, &buffer,
                     (MPI_SAS_EXPAND_PGAD_FORM_HANDLE <<
-                    MPI_SAS_EXPAND_PGAD_FORM_SHIFT), port_info->handle)) {
-
-                       /*
-                        * Issue target reset to all child end devices
-                        * then mark them deleted to prevent further
-                        * IO going to them.
-                        */
-                       phy_info = port_info->phy_info;
-                       for (i = 0; i < port_info->num_phys; i++, phy_info++) {
-                               starget = mptsas_get_starget(phy_info);
-                               if (!starget)
-                                       continue;
-                               vtarget = starget->hostdata;
-                               if(vtarget->deleted)
-                                       continue;
-                               vtarget->deleted = 1;
-                               mptsas_target_reset(ioc, vtarget);
-                               sas_port_delete(mptsas_get_port(phy_info));
-                               mptsas_port_delete(phy_info->port_details);
-                       }
+                    MPI_SAS_EXPAND_PGAD_FORM_SHIFT),
+                    port_info->phy_info[0].handle)) {
 
                        /*
                         * Obtain the port_info instance to the parent port
@@ -1972,11 +2233,13 @@ mptsas_scan_sas_topology(MPT_ADAPTER *ioc)
        /*
          Reporting RAID volumes.
        */
+       if (!ioc->ir_firmware)
+               goto out;
        if (!ioc->raid_data.pIocPg2)
                goto out;
        if (!ioc->raid_data.pIocPg2->NumActiveVolumes)
                goto out;
-       for (i=0; i<ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
+       for (i = 0; i < ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
                scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL,
                    ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID, 0);
        }
@@ -2030,12 +2293,37 @@ mptsas_find_phyinfo_by_sas_address(MPT_ADAPTER *ioc, u64 sas_address)
        mutex_lock(&ioc->sas_topology_mutex);
        list_for_each_entry(port_info, &ioc->sas_topology, list) {
                for (i = 0; i < port_info->num_phys; i++) {
+                       if (!mptsas_is_end_device(
+                               &port_info->phy_info[i].attached))
+                               continue;
                        if (port_info->phy_info[i].attached.sas_address
                            != sas_address)
                                continue;
+                       phy_info = &port_info->phy_info[i];
+                       break;
+               }
+       }
+       mutex_unlock(&ioc->sas_topology_mutex);
+       return phy_info;
+}
+
+static struct mptsas_phyinfo *
+mptsas_find_phyinfo_by_target(MPT_ADAPTER *ioc, u8 channel, u8 id)
+{
+       struct mptsas_portinfo *port_info;
+       struct mptsas_phyinfo *phy_info = NULL;
+       int i;
+
+       mutex_lock(&ioc->sas_topology_mutex);
+       list_for_each_entry(port_info, &ioc->sas_topology, list) {
+               for (i = 0; i < port_info->num_phys; i++) {
                        if (!mptsas_is_end_device(
                                &port_info->phy_info[i].attached))
                                continue;
+                       if (port_info->phy_info[i].attached.id != id)
+                               continue;
+                       if (port_info->phy_info[i].attached.channel != channel)
+                               continue;
                        phy_info = &port_info->phy_info[i];
                        break;
                }
@@ -2045,7 +2333,7 @@ mptsas_find_phyinfo_by_sas_address(MPT_ADAPTER *ioc, u64 sas_address)
 }
 
 static struct mptsas_phyinfo *
-mptsas_find_phyinfo_by_target(MPT_ADAPTER *ioc, u32 id)
+mptsas_find_phyinfo_by_phys_disk_num(MPT_ADAPTER *ioc, u8 channel, u8 id)
 {
        struct mptsas_portinfo *port_info;
        struct mptsas_phyinfo *phy_info = NULL;
@@ -2054,11 +2342,15 @@ mptsas_find_phyinfo_by_target(MPT_ADAPTER *ioc, u32 id)
        mutex_lock(&ioc->sas_topology_mutex);
        list_for_each_entry(port_info, &ioc->sas_topology, list) {
                for (i = 0; i < port_info->num_phys; i++) {
-                       if (port_info->phy_info[i].attached.id != id)
-                               continue;
                        if (!mptsas_is_end_device(
                                &port_info->phy_info[i].attached))
                                continue;
+                       if (port_info->phy_info[i].attached.phys_disk_num == ~0)
+                               continue;
+                       if (port_info->phy_info[i].attached.phys_disk_num != id)
+                               continue;
+                       if (port_info->phy_info[i].attached.channel != channel)
+                               continue;
                        phy_info = &port_info->phy_info[i];
                        break;
                }
@@ -2094,6 +2386,76 @@ mptsas_reprobe_target(struct scsi_target *starget, int uld_attach)
                        mptsas_reprobe_lun);
 }
 
+static void
+mptsas_adding_inactive_raid_components(MPT_ADAPTER *ioc, u8 channel, u8 id)
+{
+       CONFIGPARMS                     cfg;
+       ConfigPageHeader_t              hdr;
+       dma_addr_t                      dma_handle;
+       pRaidVolumePage0_t              buffer = NULL;
+       RaidPhysDiskPage0_t             phys_disk;
+       int                             i;
+       struct mptsas_hotplug_event     *ev;
+
+       memset(&cfg, 0 , sizeof(CONFIGPARMS));
+       memset(&hdr, 0 , sizeof(ConfigPageHeader_t));
+       hdr.PageType = MPI_CONFIG_PAGETYPE_RAID_VOLUME;
+       cfg.pageAddr = (channel << 8) + id;
+       cfg.cfghdr.hdr = &hdr;
+       cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
+
+       if (mpt_config(ioc, &cfg) != 0)
+               goto out;
+
+       if (!hdr.PageLength)
+               goto out;
+
+       buffer = pci_alloc_consistent(ioc->pcidev, hdr.PageLength * 4,
+           &dma_handle);
+
+       if (!buffer)
+               goto out;
+
+       cfg.physAddr = dma_handle;
+       cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
+
+       if (mpt_config(ioc, &cfg) != 0)
+               goto out;
+
+       if (!(buffer->VolumeStatus.Flags &
+           MPI_RAIDVOL0_STATUS_FLAG_VOLUME_INACTIVE))
+               goto out;
+
+       if (!buffer->NumPhysDisks)
+               goto out;
+
+       for (i = 0; i < buffer->NumPhysDisks; i++) {
+
+               if (mpt_raid_phys_disk_pg0(ioc,
+                   buffer->PhysDisk[i].PhysDiskNum, &phys_disk) != 0)
+                       continue;
+
+               ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
+               if (!ev) {
+                       printk(KERN_WARNING "mptsas: lost hotplug event\n");
+                       goto out;
+               }
+
+               INIT_WORK(&ev->work, mptsas_hotplug_work);
+               ev->ioc = ioc;
+               ev->id = phys_disk.PhysDiskID;
+               ev->channel = phys_disk.PhysDiskBus;
+               ev->phys_disk_num_valid = 1;
+               ev->phys_disk_num = phys_disk.PhysDiskNum;
+               ev->event_type = MPTSAS_ADD_DEVICE;
+               schedule_work(&ev->work);
+       }
+
+ out:
+       if (buffer)
+               pci_free_consistent(ioc->pcidev, hdr.PageLength * 4, buffer,
+                   dma_handle);
+}
 /*
  * Work queue thread to handle SAS hotplug events
  */
@@ -2102,6 +2464,7 @@ mptsas_hotplug_work(struct work_struct *work)
 {
        struct mptsas_hotplug_event *ev =
                container_of(work, struct mptsas_hotplug_event, work);
+
        MPT_ADAPTER *ioc = ev->ioc;
        struct mptsas_phyinfo *phy_info;
        struct sas_rphy *rphy;
@@ -2114,17 +2477,43 @@ mptsas_hotplug_work(struct work_struct *work)
        VirtTarget *vtarget;
        VirtDevice *vdevice;
 
-
        mutex_lock(&ioc->sas_discovery_mutex);
        switch (ev->event_type) {
        case MPTSAS_DEL_DEVICE:
 
-               phy_info = mptsas_find_phyinfo_by_target(ioc, ev->id);
+               phy_info = NULL;
+               if (ev->phys_disk_num_valid) {
+                       if (ev->hidden_raid_component){
+                               if (mptsas_sas_device_pg0(ioc, &sas_device,
+                                   (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
+                                    MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
+                                   (ev->channel << 8) + ev->id)) {
+                                       dfailprintk((MYIOC_s_ERR_FMT
+                                       "%s: exit at line=%d\n", ioc->name,
+                                               __FUNCTION__, __LINE__));
+                                       break;
+                               }
+                               phy_info = mptsas_find_phyinfo_by_sas_address(
+                                   ioc, sas_device.sas_address);
+                       }else
+                               phy_info = mptsas_find_phyinfo_by_phys_disk_num(
+                                   ioc, ev->channel, ev->phys_disk_num);
+               }
+
+               if (!phy_info)
+                       phy_info = mptsas_find_phyinfo_by_target(ioc,
+                           ev->channel, ev->id);
 
                /*
                 * Sanity checks, for non-existing phys and remote rphys.
                 */
-               if (!phy_info || !phy_info->port_details) {
+               if (!phy_info){
+                       dfailprintk((MYIOC_s_ERR_FMT
+                               "%s: exit at line=%d\n", ioc->name,
+                               __FUNCTION__, __LINE__));
+                       break;
+               }
+               if (!phy_info->port_details) {
                        dfailprintk((MYIOC_s_ERR_FMT
                                "%s: exit at line=%d\n", ioc->name,
                                __FUNCTION__, __LINE__));
@@ -2137,6 +2526,7 @@ mptsas_hotplug_work(struct work_struct *work)
                                __FUNCTION__, __LINE__));
                        break;
                }
+
                port = mptsas_get_port(phy_info);
                if (!port) {
                        dfailprintk((MYIOC_s_ERR_FMT
@@ -2159,28 +2549,35 @@ mptsas_hotplug_work(struct work_struct *work)
                        /*
                         * Handling  RAID components
                         */
-                       if (ev->phys_disk_num_valid) {
-                               vtarget->target_id = ev->phys_disk_num;
-                               vtarget->tflags |= MPT_TARGET_FLAGS_RAID_COMPONENT;
+                       if (ev->phys_disk_num_valid &&
+                           ev->hidden_raid_component) {
+                               printk(MYIOC_s_INFO_FMT
+                                   "RAID Hidding: channel=%d, id=%d, "
+                                   "physdsk %d \n", ioc->name, ev->channel,
+                                   ev->id, ev->phys_disk_num);
+                               vtarget->id = ev->phys_disk_num;
+                               vtarget->tflags |=
+                                   MPT_TARGET_FLAGS_RAID_COMPONENT;
                                mptsas_reprobe_target(starget, 1);
-                               break;
+                               phy_info->attached.phys_disk_num =
+                                   ev->phys_disk_num;
+                       break;
                        }
-
-                       vtarget->deleted = 1;
-                       mptsas_target_reset(ioc, vtarget);
                }
 
-               if (phy_info->attached.device_info & MPI_SAS_DEVICE_INFO_SSP_TARGET)
+               if (phy_info->attached.device_info &
+                   MPI_SAS_DEVICE_INFO_SSP_TARGET)
                        ds = "ssp";
-               if (phy_info->attached.device_info & MPI_SAS_DEVICE_INFO_STP_TARGET)
+               if (phy_info->attached.device_info &
+                   MPI_SAS_DEVICE_INFO_STP_TARGET)
                        ds = "stp";
-               if (phy_info->attached.device_info & MPI_SAS_DEVICE_INFO_SATA_DEVICE)
+               if (phy_info->attached.device_info &
+                   MPI_SAS_DEVICE_INFO_SATA_DEVICE)
                        ds = "sata";
 
                printk(MYIOC_s_INFO_FMT
                       "removing %s device, channel %d, id %d, phy %d\n",
                       ioc->name, ds, ev->channel, ev->id, phy_info->phy_id);
-
 #ifdef MPT_DEBUG_SAS_WIDE
                dev_printk(KERN_DEBUG, &port->dev,
                    "delete port (%d)\n", port->port_identifier);
@@ -2198,14 +2595,14 @@ mptsas_hotplug_work(struct work_struct *work)
                 */
                if (mptsas_sas_device_pg0(ioc, &sas_device,
                    (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
-                    MPI_SAS_DEVICE_PGAD_FORM_SHIFT), ev->id)) {
+                    MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
+                       (ev->channel << 8) + ev->id)) {
                                dfailprintk((MYIOC_s_ERR_FMT
                                        "%s: exit at line=%d\n", ioc->name,
                                        __FUNCTION__, __LINE__));
                        break;
                }
 
-               ssleep(2);
                __mptsas_discovery_work(ioc);
 
                phy_info = mptsas_find_phyinfo_by_sas_address(ioc,
@@ -2219,7 +2616,8 @@ mptsas_hotplug_work(struct work_struct *work)
                }
 
                starget = mptsas_get_starget(phy_info);
-               if (starget) {
+               if (starget && (!ev->hidden_raid_component)){
+
                        vtarget = starget->hostdata;
 
                        if (!vtarget) {
@@ -2232,9 +2630,15 @@ mptsas_hotplug_work(struct work_struct *work)
                         * Handling  RAID components
                         */
                        if (vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT) {
-                               vtarget->tflags &= ~MPT_TARGET_FLAGS_RAID_COMPONENT;
-                               vtarget->target_id = ev->id;
+                               printk(MYIOC_s_INFO_FMT
+                                   "RAID Exposing: channel=%d, id=%d, "
+                                   "physdsk %d \n", ioc->name, ev->channel,
+                                   ev->id, ev->phys_disk_num);
+                               vtarget->tflags &=
+                                   ~MPT_TARGET_FLAGS_RAID_COMPONENT;
+                               vtarget->id = ev->id;
                                mptsas_reprobe_target(starget, 0);
+                               phy_info->attached.phys_disk_num = ~0;
                        }
                        break;
                }
@@ -2243,8 +2647,10 @@ mptsas_hotplug_work(struct work_struct *work)
                        dfailprintk((MYIOC_s_ERR_FMT
                                "%s: exit at line=%d\n", ioc->name,
                                __FUNCTION__, __LINE__));
+                       if (ev->channel) printk("%d\n", __LINE__);
                        break;
                }
+
                port = mptsas_get_port(phy_info);
                if (!port) {
                        dfailprintk((MYIOC_s_ERR_FMT
@@ -2252,15 +2658,17 @@ mptsas_hotplug_work(struct work_struct *work)
                                __FUNCTION__, __LINE__));
                        break;
                }
-
                memcpy(&phy_info->attached, &sas_device,
                    sizeof(struct mptsas_devinfo));
 
-               if (phy_info->attached.device_info & MPI_SAS_DEVICE_INFO_SSP_TARGET)
+               if (phy_info->attached.device_info &
+                   MPI_SAS_DEVICE_INFO_SSP_TARGET)
                        ds = "ssp";
-               if (phy_info->attached.device_info & MPI_SAS_DEVICE_INFO_STP_TARGET)
+               if (phy_info->attached.device_info &
+                   MPI_SAS_DEVICE_INFO_STP_TARGET)
                        ds = "stp";
-               if (phy_info->attached.device_info & MPI_SAS_DEVICE_INFO_SATA_DEVICE)
+               if (phy_info->attached.device_info &
+                   MPI_SAS_DEVICE_INFO_SATA_DEVICE)
                        ds = "sata";
 
                printk(MYIOC_s_INFO_FMT
@@ -2301,19 +2709,21 @@ mptsas_hotplug_work(struct work_struct *work)
                break;
        case MPTSAS_DEL_RAID:
                sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL,
-                   ev->id, 0);
+                   ev->id, 0);
                if (!sdev)
                        break;
                printk(MYIOC_s_INFO_FMT
                       "removing raid volume, channel %d, id %d\n",
                       ioc->name, MPTSAS_RAID_CHANNEL, ev->id);
                vdevice = sdev->hostdata;
-               vdevice->vtarget->deleted = 1;
-               mptsas_target_reset(ioc, vdevice->vtarget);
                scsi_remove_device(sdev);
                scsi_device_put(sdev);
                mpt_findImVolumes(ioc);
                break;
+       case MPTSAS_ADD_INACTIVE_VOLUME:
+               mptsas_adding_inactive_raid_components(ioc,
+                   ev->channel, ev->id);
+               break;
        case MPTSAS_IGNORE_EVENT:
        default:
                break;
@@ -2321,7 +2731,6 @@ mptsas_hotplug_work(struct work_struct *work)
 
        mutex_unlock(&ioc->sas_discovery_mutex);
        kfree(ev);
-
 }
 
 static void
@@ -2339,8 +2748,12 @@ mptsas_send_sas_event(MPT_ADAPTER *ioc,
                return;
 
        switch (sas_event_data->ReasonCode) {
-       case MPI_EVENT_SAS_DEV_STAT_RC_ADDED:
        case MPI_EVENT_SAS_DEV_STAT_RC_NOT_RESPONDING:
+
+               mptsas_target_reset_queue(ioc, sas_event_data);
+               break;
+
+       case MPI_EVENT_SAS_DEV_STAT_RC_ADDED:
                ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
                if (!ev) {
                        printk(KERN_WARNING "mptsas: lost hotplug event\n");
@@ -2375,15 +2788,20 @@ mptsas_send_sas_event(MPT_ADAPTER *ioc,
                    mptsas_persist_clear_table);
                schedule_work(&ioc->sas_persist_task);
                break;
+       /*
+        * TODO, handle other events
+        */
        case MPI_EVENT_SAS_DEV_STAT_RC_SMART_DATA:
-       /* TODO */
+       case MPI_EVENT_SAS_DEV_STAT_RC_UNSUPPORTED:
        case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET:
-       /* TODO */
+       case MPI_EVENT_SAS_DEV_STAT_RC_TASK_ABORT_INTERNAL:
+       case MPI_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL:
+       case MPI_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL:
+       case MPI_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL:
        default:
                break;
        }
 }
-
 static void
 mptsas_send_raid_event(MPT_ADAPTER *ioc,
                EVENT_DATA_RAID *raid_event_data)
@@ -2404,31 +2822,36 @@ mptsas_send_raid_event(MPT_ADAPTER *ioc,
        INIT_WORK(&ev->work, mptsas_hotplug_work);
        ev->ioc = ioc;
        ev->id = raid_event_data->VolumeID;
+       ev->channel = raid_event_data->VolumeBus;
        ev->event_type = MPTSAS_IGNORE_EVENT;
 
        switch (raid_event_data->ReasonCode) {
        case MPI_EVENT_RAID_RC_PHYSDISK_DELETED:
+               ev->phys_disk_num_valid = 1;
+               ev->phys_disk_num = raid_event_data->PhysDiskNum;
                ev->event_type = MPTSAS_ADD_DEVICE;
                break;
        case MPI_EVENT_RAID_RC_PHYSDISK_CREATED:
-               ioc->raid_data.isRaid = 1;
                ev->phys_disk_num_valid = 1;
                ev->phys_disk_num = raid_event_data->PhysDiskNum;
+               ev->hidden_raid_component = 1;
                ev->event_type = MPTSAS_DEL_DEVICE;
                break;
        case MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED:
                switch (state) {
                case MPI_PD_STATE_ONLINE:
-                       ioc->raid_data.isRaid = 1;
+               case MPI_PD_STATE_NOT_COMPATIBLE:
                        ev->phys_disk_num_valid = 1;
                        ev->phys_disk_num = raid_event_data->PhysDiskNum;
+                       ev->hidden_raid_component = 1;
                        ev->event_type = MPTSAS_ADD_DEVICE;
                        break;
                case MPI_PD_STATE_MISSING:
-               case MPI_PD_STATE_NOT_COMPATIBLE:
                case MPI_PD_STATE_OFFLINE_AT_HOST_REQUEST:
                case MPI_PD_STATE_FAILED_AT_HOST_REQUEST:
                case MPI_PD_STATE_OFFLINE_FOR_ANOTHER_REASON:
+                       ev->phys_disk_num_valid = 1;
+                       ev->phys_disk_num = raid_event_data->PhysDiskNum;
                        ev->event_type = MPTSAS_DEL_DEVICE;
                        break;
                default:
@@ -2485,6 +2908,35 @@ mptsas_send_discovery_event(MPT_ADAPTER *ioc,
        schedule_work(&ev->work);
 };
 
+/*
+ * mptsas_send_ir2_event - handle exposing hidden disk when
+ * an inactive raid volume is added
+ *
+ * @ioc: Pointer to MPT_ADAPTER structure
+ * @ir2_data
+ *
+ */
+static void
+mptsas_send_ir2_event(MPT_ADAPTER *ioc, PTR_MPI_EVENT_DATA_IR2 ir2_data)
+{
+       struct mptsas_hotplug_event *ev;
+
+       if (ir2_data->ReasonCode !=
+           MPI_EVENT_IR2_RC_FOREIGN_CFG_DETECTED)
+               return;
+
+       ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
+       if (!ev)
+               return;
+
+       INIT_WORK(&ev->work, mptsas_hotplug_work);
+       ev->ioc = ioc;
+       ev->id = ir2_data->TargetID;
+       ev->channel = ir2_data->Bus;
+       ev->event_type = MPTSAS_ADD_INACTIVE_VOLUME;
+
+       schedule_work(&ev->work);
+};
 
 static int
 mptsas_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *reply)
@@ -2524,6 +2976,10 @@ mptsas_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *reply)
                mptsas_send_discovery_event(ioc,
                        (EVENT_DATA_SAS_DISCOVERY *)reply->Data);
                break;
+       case MPI_EVENT_IR2:
+               mptsas_send_ir2_event(ioc,
+                   (PTR_MPI_EVENT_DATA_IR2)reply->Data);
+               break;
        default:
                rc = mptscsih_event_process(ioc, reply);
                break;
@@ -2611,12 +3067,11 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        /* set 16 byte cdb's */
        sh->max_cmd_len = 16;
 
-       sh->max_id = ioc->pfacts->MaxDevices + 1;
+       sh->max_id = ioc->pfacts[0].PortSCSIID;
+       sh->max_lun = max_lun;
 
        sh->transportt = mptsas_transport_template;
 
-       sh->max_lun = MPT_LAST_LUN + 1;
-       sh->max_channel = 0;
        sh->this_id = ioc->pfacts[0].PortSCSIID;
 
        /* Required entry.
@@ -2659,8 +3114,6 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                sh->sg_tablesize = numSGE;
        }
 
-       spin_unlock_irqrestore(&ioc->FreeQlock, flags);
-
        hd = (MPT_SCSI_HOST *) sh->hostdata;
        hd->ioc = ioc;
 
@@ -2676,19 +3129,6 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p\n",
                 ioc->name, hd->ScsiLookup));
 
-       /* Allocate memory for the device structures.
-        * A non-Null pointer at an offset
-        * indicates a device exists.
-        * max_id = 1 + maximum id (hosts.h)
-        */
-       hd->Targets = kcalloc(sh->max_id, sizeof(void *), GFP_ATOMIC);
-       if (!hd->Targets) {
-               error = -ENOMEM;
-               goto out_mptsas_probe;
-       }
-
-       dprintk((KERN_INFO "  vtarget @ %p\n", hd->Targets));
-
        /* Clear the TM flags
         */
        hd->tmPending = 0;
@@ -2713,15 +3153,17 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
        ioc->sas_data.ptClear = mpt_pt_clear;
 
+       init_waitqueue_head(&hd->scandv_waitq);
+       hd->scandv_wait_done = 0;
+       hd->last_queue_full = 0;
+       INIT_LIST_HEAD(&hd->target_reset_list);
+       spin_unlock_irqrestore(&ioc->FreeQlock, flags);
+
        if (ioc->sas_data.ptClear==1) {
                mptbase_sas_persist_operation(
                    ioc, MPI_SAS_OP_CLEAR_ALL_PERSISTENT);
        }
 
-       init_waitqueue_head(&hd->scandv_waitq);
-       hd->scandv_wait_done = 0;
-       hd->last_queue_full = 0;
-
        error = scsi_add_host(sh, &ioc->pcidev->dev);
        if (error) {
                dprintk((KERN_ERR MYNAM
@@ -2745,7 +3187,7 @@ static void __devexit mptsas_remove(struct pci_dev *pdev)
        struct mptsas_portinfo *p, *n;
        int i;
 
-       ioc->sas_discovery_ignore_events=1;
+       ioc->sas_discovery_ignore_events = 1;
        sas_remove_host(ioc->sh);
 
        mutex_lock(&ioc->sas_topology_mutex);
@@ -2800,7 +3242,7 @@ mptsas_init(void)
                return -ENODEV;
 
        mptsasDoneCtx = mpt_register(mptscsih_io_done, MPTSAS_DRIVER);
-       mptsasTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSAS_DRIVER);
+       mptsasTaskCtx = mpt_register(mptsas_taskmgmt_complete, MPTSAS_DRIVER);
        mptsasInternalCtx =
                mpt_register(mptscsih_scandv_complete, MPTSAS_DRIVER);
        mptsasMgmtCtx = mpt_register(mptsas_mgmt_done, MPTSAS_DRIVER);
@@ -2810,7 +3252,7 @@ mptsas_init(void)
                  ": Registered for IOC event notifications\n"));
        }
 
-       if (mpt_reset_register(mptsasDoneCtx, mptscsih_ioc_reset) == 0) {
+       if (mpt_reset_register(mptsasDoneCtx, mptsas_ioc_reset) == 0) {
                dprintk((KERN_INFO MYNAM
                  ": Registered for IOC reset notifications\n"));
        }
index f0cca3ea93b20b8d4f72279480ac56e81e681b13..2a3e9e66d4ef7ed49c535597da34a8073417c219 100644 (file)
@@ -4,7 +4,7 @@
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
  *  Copyright (c) 1999-2007 LSI Logic Corporation
- *  (mailto:mpt_linux_developer@lsil.com)
+ *  (mailto:mpt_linux_developer@lsi.com)
  *
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -54,7 +54,6 @@
 #include <linux/delay.h>       /* for mdelay */
 #include <linux/interrupt.h>   /* needed for in_interrupt() proto */
 #include <linux/reboot.h>      /* notifier code */
-#include <linux/sched.h>
 #include <linux/workqueue.h>
 
 #include <scsi/scsi.h>
@@ -79,43 +78,6 @@ MODULE_LICENSE("GPL");
 MODULE_VERSION(my_VERSION);
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-
-typedef struct _BIG_SENSE_BUF {
-       u8              data[MPT_SENSE_BUFFER_ALLOC];
-} BIG_SENSE_BUF;
-
-#define MPT_SCANDV_GOOD                        (0x00000000) /* must be 0 */
-#define MPT_SCANDV_DID_RESET           (0x00000001)
-#define MPT_SCANDV_SENSE               (0x00000002)
-#define MPT_SCANDV_SOME_ERROR          (0x00000004)
-#define MPT_SCANDV_SELECTION_TIMEOUT   (0x00000008)
-#define MPT_SCANDV_ISSUE_SENSE         (0x00000010)
-#define MPT_SCANDV_FALLBACK            (0x00000020)
-
-#define MPT_SCANDV_MAX_RETRIES         (10)
-
-#define MPT_ICFLAG_BUF_CAP     0x01    /* ReadBuffer Read Capacity format */
-#define MPT_ICFLAG_ECHO                0x02    /* ReadBuffer Echo buffer format */
-#define MPT_ICFLAG_EBOS                0x04    /* ReadBuffer Echo buffer has EBOS */
-#define MPT_ICFLAG_PHYS_DISK   0x08    /* Any SCSI IO but do Phys Disk Format */
-#define MPT_ICFLAG_TAGGED_CMD  0x10    /* Do tagged IO */
-#define MPT_ICFLAG_DID_RESET   0x20    /* Bus Reset occurred with this command */
-#define MPT_ICFLAG_RESERVED    0x40    /* Reserved has been issued */
-
-typedef struct _internal_cmd {
-       char            *data;          /* data pointer */
-       dma_addr_t      data_dma;       /* data dma address */
-       int             size;           /* transfer size */
-       u8              cmd;            /* SCSI Op Code */
-       u8              bus;            /* bus number */
-       u8              id;             /* SCSI ID (virtual) */
-       u8              lun;
-       u8              flags;          /* Bit Field - See above */
-       u8              physDiskNum;    /* Phys disk number, -1 else */
-       u8              rsvd2;
-       u8              rsvd;
-} INTERNAL_CMD;
-
 /*
  *  Other private/forward protos...
  */
@@ -131,14 +93,11 @@ static int mptscsih_tm_pending_wait(MPT_SCSI_HOST * hd);
 static int     mptscsih_tm_wait_for_completion(MPT_SCSI_HOST * hd, ulong timeout );
 static int     SCPNT_TO_LOOKUP_IDX(struct scsi_cmnd *sc);
 
-static int     mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, int ctx2abort, ulong timeout);
+static int     mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int ctx2abort, ulong timeout);
 
 int            mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset);
 int            mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply);
 
-static void    mptscsih_initTarget(MPT_SCSI_HOST *hd, VirtTarget *vtarget, struct scsi_device *sdev);
-static void    mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *vtarget, struct scsi_device *sdev);
-static int     mptscsih_writeIOCPage4(MPT_SCSI_HOST *hd, int target_id, int bus);
 int            mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *r);
 static int     mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *iocmd);
 static void    mptscsih_synchronize_cache(MPT_SCSI_HOST *hd, VirtDevice *vdevice);
@@ -517,16 +476,100 @@ mptscsih_issue_sep_command(MPT_ADAPTER *ioc, VirtTarget *vtarget,
 
        SEPMsg = (SEPRequest_t *)mf;
        SEPMsg->Function = MPI_FUNCTION_SCSI_ENCLOSURE_PROCESSOR;
-       SEPMsg->Bus = vtarget->bus_id;
-       SEPMsg->TargetID = vtarget->target_id;
+       SEPMsg->Bus = vtarget->channel;
+       SEPMsg->TargetID = vtarget->id;
        SEPMsg->Action = MPI_SEP_REQ_ACTION_WRITE_STATUS;
        SEPMsg->SlotStatus = SlotStatus;
        devtverboseprintk((MYIOC_s_WARN_FMT
-           "Sending SEP cmd=%x id=%d bus=%d\n",
-           ioc->name, SlotStatus, SEPMsg->TargetID, SEPMsg->Bus));
+           "Sending SEP cmd=%x channel=%d id=%d\n",
+           ioc->name, SlotStatus, SEPMsg->Bus, SEPMsg->TargetID));
        mpt_put_msg_frame(ioc->DoneCtx, ioc, mf);
 }
 
+#ifdef MPT_DEBUG_REPLY
+/**
+ *     mptscsih_iocstatus_info_scsiio - IOCSTATUS information for SCSIIO
+ *     @ioc: Pointer to MPT_ADAPTER structure
+ *     @ioc_status: U32 IOCStatus word from IOC
+ *     @scsi_status: U8 sam status from target
+ *     @scsi_state: U8 scsi state
+ *     @sc: original scsi cmnd pointer
+ *     @mf: Pointer to MPT request frame
+ *
+ *     Refer to lsi/mpi.h.
+ **/
+static void
+mptscsih_iocstatus_info_scsiio(MPT_ADAPTER *ioc, u32 ioc_status,
+    u8 scsi_status, u8 scsi_state, struct scsi_cmnd *sc)
+{
+       char extend_desc[EVENT_DESCR_STR_SZ];
+       char *desc = NULL;
+
+       switch (ioc_status) {
+
+       case MPI_IOCSTATUS_SCSI_INVALID_BUS: /* 0x0041 */
+               desc = "SCSI Invalid Bus";
+               break;
+
+       case MPI_IOCSTATUS_SCSI_INVALID_TARGETID: /* 0x0042 */
+               desc = "SCSI Invalid TargetID";
+               break;
+
+       case MPI_IOCSTATUS_SCSI_DEVICE_NOT_THERE: /* 0x0043 */
+               /*
+                * Inquiry is issued for device scanning
+                */
+               if (sc->cmnd[0] != 0x12)
+                       desc = "SCSI Device Not There";
+               break;
+
+       case MPI_IOCSTATUS_SCSI_DATA_OVERRUN: /* 0x0044 */
+               desc = "SCSI Data Overrun";
+               break;
+
+       case MPI_IOCSTATUS_SCSI_IO_DATA_ERROR: /* 0x0046 */
+               desc = "SCSI I/O Data Error";
+               break;
+
+       case MPI_IOCSTATUS_SCSI_PROTOCOL_ERROR: /* 0x0047 */
+               desc = "SCSI Protocol Error";
+               break;
+
+       case MPI_IOCSTATUS_SCSI_TASK_TERMINATED: /* 0x0048 */
+               desc = "SCSI Task Terminated";
+               break;
+
+       case MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH: /* 0x0049 */
+               desc = "SCSI Residual Mismatch";
+               break;
+
+       case MPI_IOCSTATUS_SCSI_TASK_MGMT_FAILED: /* 0x004A */
+               desc = "SCSI Task Management Failed";
+               break;
+
+       case MPI_IOCSTATUS_SCSI_IOC_TERMINATED: /* 0x004B */
+               desc = "SCSI IOC Terminated";
+               break;
+
+       case MPI_IOCSTATUS_SCSI_EXT_TERMINATED: /* 0x004C */
+               desc = "SCSI Ext Terminated";
+               break;
+       }
+
+       if (!desc)
+               return;
+
+       snprintf(extend_desc, EVENT_DESCR_STR_SZ,
+           "[%d:%d:%d:%d] cmd=%02Xh, sam_status=%02Xh state=%02Xh",
+               sc->device->host->host_no,
+               sc->device->channel, sc->device->id, sc->device->lun,
+               sc->cmnd[0], scsi_status, scsi_state);
+
+       printk(MYIOC_s_INFO_FMT "IOCStatus(0x%04X): %s: %s\n",
+           ioc->name, ioc_status, desc, extend_desc);
+}
+#endif
+
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
  *     mptscsih_io_done - Main SCSI IO callback routine registered to
@@ -613,12 +656,14 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
                u32      xfer_cnt;
                u16      status;
                u8       scsi_state, scsi_status;
+               u32      log_info;
 
                status = le16_to_cpu(pScsiReply->IOCStatus) & MPI_IOCSTATUS_MASK;
                scsi_state = pScsiReply->SCSIState;
                scsi_status = pScsiReply->SCSIStatus;
                xfer_cnt = le32_to_cpu(pScsiReply->TransferCount);
                sc->resid = sc->request_bufflen - xfer_cnt;
+               log_info = le32_to_cpu(pScsiReply->IOCLogInfo);
 
                /*
                 *  if we get a data underrun indication, yet no data was
@@ -633,13 +678,6 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
                        status = MPI_IOCSTATUS_SUCCESS;
                }
 
-               dreplyprintk((KERN_NOTICE "Reply ha=%d id=%d lun=%d:\n"
-                       "IOCStatus=%04xh SCSIState=%02xh SCSIStatus=%02xh\n"
-                       "resid=%d bufflen=%d xfer_cnt=%d\n",
-                       ioc->id, sc->device->id, sc->device->lun,
-                       status, scsi_state, scsi_status, sc->resid,
-                       sc->request_bufflen, xfer_cnt));
-
                if (scsi_state & MPI_SCSI_STATE_AUTOSENSE_VALID)
                        mptscsih_copy_sense_data(sc, hd, mf, pScsiReply);
 
@@ -648,9 +686,10 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
                 */
                if (scsi_state & MPI_SCSI_STATE_RESPONSE_INFO_VALID &&
                    pScsiReply->ResponseInfo) {
-                       printk(KERN_NOTICE "ha=%d id=%d lun=%d: "
+                       printk(KERN_NOTICE "[%d:%d:%d:%d] "
                        "FCP_ResponseInfo=%08xh\n",
-                       ioc->id, sc->device->id, sc->device->lun,
+                       sc->device->host->host_no, sc->device->channel,
+                       sc->device->id, sc->device->lun,
                        le32_to_cpu(pScsiReply->ResponseInfo));
                }
 
@@ -695,9 +734,8 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
                        if ( ioc->bus_type == SAS ) {
                                u16 ioc_status = le16_to_cpu(pScsiReply->IOCStatus);
                                if (ioc_status & MPI_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) {
-                                       u32 log_info = le32_to_cpu(mr->u.reply.IOCLogInfo);
-                                       log_info &=SAS_LOGINFO_MASK;
-                                       if (log_info == SAS_LOGINFO_NEXUS_LOSS) {
+                                       if ((log_info & SAS_LOGINFO_MASK)
+                                           == SAS_LOGINFO_NEXUS_LOSS) {
                                                sc->result = (DID_BUS_BUSY << 16);
                                                break;
                                        }
@@ -735,7 +773,8 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
                        else /* Sufficient data transfer occurred */
                                sc->result = (DID_OK << 16) | scsi_status;
                        dreplyprintk((KERN_NOTICE
-                           "RESIDUAL_MISMATCH: result=%x on id=%d\n", sc->result, sc->device->id));
+                           "RESIDUAL_MISMATCH: result=%x on channel=%d id=%d\n",
+                           sc->result, sc->device->channel, sc->device->id));
                        break;
 
                case MPI_IOCSTATUS_SCSI_DATA_UNDERRUN:          /* 0x0045 */
@@ -848,7 +887,28 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
 
                }       /* switch(status) */
 
-               dreplyprintk((KERN_NOTICE "  sc->result is %08xh\n", sc->result));
+#ifdef MPT_DEBUG_REPLY
+               if (sc->result) {
+
+                       mptscsih_iocstatus_info_scsiio(ioc, status,
+                           scsi_status, scsi_state, sc);
+
+                       dreplyprintk(("%s: [%d:%d:%d:%d] cmd=0x%02x "
+                           "result=0x%08x\n\tiocstatus=0x%04X "
+                           "scsi_state=0x%02X scsi_status=0x%02X "
+                           "loginfo=0x%08X\n", __FUNCTION__,
+                           sc->device->host->host_no, sc->device->channel, sc->device->id,
+                           sc->device->lun, sc->cmnd[0], sc->result, status,
+                           scsi_state, scsi_status, log_info));
+
+                       dreplyprintk(("%s: [%d:%d:%d:%d] resid=%d "
+                           "bufflen=%d xfer_cnt=%d\n", __FUNCTION__,
+                           sc->device->host->host_no, sc->device->channel, sc->device->id,
+                           sc->device->lun, sc->resid, sc->request_bufflen,
+                           xfer_cnt));
+               }
+#endif
+
        } /* end of address reply case */
 
        /* Unmap the DMA buffers, if any. */
@@ -955,9 +1015,10 @@ mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, VirtDevice *vdevice)
        int              ii;
        int              max = hd->ioc->req_depth;
        struct scsi_cmnd *sc;
+       struct scsi_lun  lun;
 
-       dsprintk((KERN_INFO MYNAM ": search_running target %d lun %d max %d\n",
-                       vdevice->vtarget->target_id, vdevice->lun, max));
+       dsprintk((KERN_INFO MYNAM ": search_running channel %d id %d lun %d max %d\n",
+           vdevice->vtarget->channel, vdevice->vtarget->id, vdevice->lun, max));
 
        for (ii=0; ii < max; ii++) {
                if ((sc = hd->ScsiLookup[ii]) != NULL) {
@@ -965,10 +1026,14 @@ mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, VirtDevice *vdevice)
                        mf = (SCSIIORequest_t *)MPT_INDEX_2_MFPTR(hd->ioc, ii);
                        if (mf == NULL)
                                continue;
-                       dsprintk(( "search_running: found (sc=%p, mf = %p) target %d, lun %d \n",
-                                       hd->ScsiLookup[ii], mf, mf->TargetID, mf->LUN[1]));
-                       if ((mf->TargetID != ((u8)vdevice->vtarget->target_id)) || (mf->LUN[1] != ((u8) vdevice->lun)))
+                       int_to_scsilun(vdevice->lun, &lun);
+                       if ((mf->Bus != vdevice->vtarget->channel) ||
+                           (mf->TargetID != vdevice->vtarget->id) ||
+                           memcmp(lun.scsi_lun, mf->LUN, 8))
                                continue;
+                       dsprintk(( "search_running: found (sc=%p, mf = %p) "
+                           "channel %d id %d, lun %d \n", hd->ScsiLookup[ii],
+                           mf, mf->Bus, mf->TargetID, vdevice->lun));
 
                        /* Cleanup
                         */
@@ -1065,12 +1130,6 @@ mptscsih_remove(struct pci_dev *pdev)
                hd->ScsiLookup = NULL;
        }
 
-       /*
-        * Free pointer array.
-        */
-       kfree(hd->Targets);
-       hd->Targets = NULL;
-
        dprintk((MYIOC_s_INFO_FMT
            "Free'd ScsiLookup (%d) memory\n",
            hd->ioc->name, sz1));
@@ -1317,14 +1376,6 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
                return SCSI_MLQUEUE_HOST_BUSY;
        }
 
-       if ((hd->ioc->bus_type == SPI) &&
-           vdev->vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT &&
-           mptscsih_raid_id_to_num(hd, SCpnt->device->id) < 0) {
-               SCpnt->result = DID_NO_CONNECT << 16;
-               done(SCpnt);
-               return 0;
-       }
-
        /*
         *  Put together a MPT SCSI request...
         */
@@ -1368,8 +1419,8 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
 
        /* Use the above information to set up the message frame
         */
-       pScsiReq->TargetID = (u8) vdev->vtarget->target_id;
-       pScsiReq->Bus = vdev->vtarget->bus_id;
+       pScsiReq->TargetID = (u8) vdev->vtarget->id;
+       pScsiReq->Bus = vdev->vtarget->channel;
        pScsiReq->ChainOffset = 0;
        if (vdev->vtarget->tflags &  MPT_TARGET_FLAGS_RAID_COMPONENT)
                pScsiReq->Function = MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH;
@@ -1379,14 +1430,7 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
        pScsiReq->SenseBufferLength = MPT_SENSE_BUFFER_SIZE;
        pScsiReq->Reserved = 0;
        pScsiReq->MsgFlags = mpt_msg_flags();
-       pScsiReq->LUN[0] = 0;
-       pScsiReq->LUN[1] = lun;
-       pScsiReq->LUN[2] = 0;
-       pScsiReq->LUN[3] = 0;
-       pScsiReq->LUN[4] = 0;
-       pScsiReq->LUN[5] = 0;
-       pScsiReq->LUN[6] = 0;
-       pScsiReq->LUN[7] = 0;
+       int_to_scsilun(SCpnt->device->lun, (struct scsi_lun *)pScsiReq->LUN);
        pScsiReq->Control = cpu_to_le32(scsictl);
 
        /*
@@ -1491,14 +1535,14 @@ mptscsih_freeChainBuffers(MPT_ADAPTER *ioc, int req_idx)
  */
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/*
+/**
  *     mptscsih_TMHandler - Generic handler for SCSI Task Management.
  *     Fall through to mpt_HardResetHandler if: not operational, too many
  *     failed TM requests or handshake failure.
  *
  *     @ioc: Pointer to MPT_ADAPTER structure
  *     @type: Task Management type
- *     @target: Logical Target ID for reset (if appropriate)
+ *     @id: Logical Target ID for reset (if appropriate)
  *     @lun: Logical Unit for reset (if appropriate)
  *     @ctx2abort: Context for the task to be aborted (if appropriate)
  *
@@ -1507,28 +1551,17 @@ mptscsih_freeChainBuffers(MPT_ADAPTER *ioc, int req_idx)
  *     Remark: With old EH code, at most 1 SCSI TaskMgmt function per IOC
  *     will be active.
  *
- *     Returns 0 for SUCCESS or -1 if FAILED.
- */
+ *     Returns 0 for SUCCESS, or FAILED.
+ **/
 int
-mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, int ctx2abort, ulong timeout)
+mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int ctx2abort, ulong timeout)
 {
        MPT_ADAPTER     *ioc;
        int              rc = -1;
-       int              doTask = 1;
        u32              ioc_raw_state;
        unsigned long    flags;
 
-       /* If FW is being reloaded currently, return success to
-        * the calling function.
-        */
-       if (hd == NULL)
-               return 0;
-
        ioc = hd->ioc;
-       if (ioc == NULL) {
-               printk(KERN_ERR MYNAM " TMHandler" " NULL ioc!\n");
-               return FAILED;
-       }
        dtmprintk((MYIOC_s_INFO_FMT "TMHandler Entered!\n", ioc->name));
 
        // SJR - CHECKME - Can we avoid this here?
@@ -1541,8 +1574,10 @@ mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, in
        spin_unlock_irqrestore(&ioc->diagLock, flags);
 
        /*  Wait a fixed amount of time for the TM pending flag to be cleared.
-        *  If we time out and not bus reset, then we return a FAILED status to the caller.
-        *  The call to mptscsih_tm_pending_wait() will set the pending flag if we are
+        *  If we time out and not bus reset, then we return a FAILED status
+        *  to the caller.
+        *  The call to mptscsih_tm_pending_wait() will set the pending flag
+        *  if we are
         *  successful. Otherwise, reload the FW.
         */
        if (mptscsih_tm_pending_wait(hd) == FAILED) {
@@ -1552,18 +1587,16 @@ mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, in
                           hd->ioc->name, hd->tmPending));
                        return FAILED;
                } else if (type == MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET) {
-                       dtmprintk((KERN_INFO MYNAM ": %s: TMHandler target reset: "
-                          "Timed out waiting for last TM (%d) to complete! \n",
-                          hd->ioc->name, hd->tmPending));
+                       dtmprintk((KERN_INFO MYNAM ": %s: TMHandler target "
+                               "reset: Timed out waiting for last TM (%d) "
+                               "to complete! \n", hd->ioc->name,
+                               hd->tmPending));
                        return FAILED;
                } else if (type == MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS) {
                        dtmprintk((KERN_INFO MYNAM ": %s: TMHandler bus reset: "
                           "Timed out waiting for last TM (%d) to complete! \n",
                           hd->ioc->name, hd->tmPending));
-                       if (hd->tmPending & (1 << MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS))
-                               return FAILED;
-
-                       doTask = 0;
+                       return FAILED;
                }
        } else {
                spin_lock_irqsave(&hd->ioc->FreeQlock, flags);
@@ -1571,47 +1604,40 @@ mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, in
                spin_unlock_irqrestore(&hd->ioc->FreeQlock, flags);
        }
 
-       /* Is operational?
-        */
        ioc_raw_state = mpt_GetIocState(hd->ioc, 0);
 
-#ifdef MPT_DEBUG_RESET
        if ((ioc_raw_state & MPI_IOC_STATE_MASK) != MPI_IOC_STATE_OPERATIONAL) {
                printk(MYIOC_s_WARN_FMT
-                       "TM Handler: IOC Not operational(0x%x)!\n",
-                       hd->ioc->name, ioc_raw_state);
-       }
-#endif
-
-       if (doTask && ((ioc_raw_state & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_OPERATIONAL)
-                               && !(ioc_raw_state & MPI_DOORBELL_ACTIVE)) {
-
-               /* Isse the Task Mgmt request.
-                */
-               if (hd->hard_resets < -1)
-                       hd->hard_resets++;
-               rc = mptscsih_IssueTaskMgmt(hd, type, channel, target, lun, ctx2abort, timeout);
-               if (rc) {
-                       printk(MYIOC_s_INFO_FMT "Issue of TaskMgmt failed!\n", hd->ioc->name);
-               } else {
-                       dtmprintk((MYIOC_s_INFO_FMT "Issue of TaskMgmt Successful!\n", hd->ioc->name));
-               }
+                       "TM Handler for type=%x: IOC Not operational (0x%x)!\n",
+                       ioc->name, type, ioc_raw_state);
+               printk(KERN_WARNING " Issuing HardReset!!\n");
+               if (mpt_HardResetHandler(ioc, CAN_SLEEP) < 0)
+                       printk((KERN_WARNING "TMHandler: HardReset "
+                               "FAILED!!\n"));
+               return FAILED;
        }
 
-       /* Only fall through to the HRH if this is a bus reset
-        */
-       if ((type == MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS) && (rc ||
-               ioc->reload_fw || (ioc->alt_ioc && ioc->alt_ioc->reload_fw))) {
-               dtmprintk((MYIOC_s_INFO_FMT "Calling HardReset! \n",
-                        hd->ioc->name));
-               rc = mpt_HardResetHandler(hd->ioc, CAN_SLEEP);
+       if (ioc_raw_state & MPI_DOORBELL_ACTIVE) {
+               printk(MYIOC_s_WARN_FMT
+                       "TM Handler for type=%x: ioc_state: "
+                       "DOORBELL_ACTIVE (0x%x)!\n",
+                       ioc->name, type, ioc_raw_state);
+               return FAILED;
        }
 
-       /*
-        * Check IOCStatus from TM reply message
+       /* Isse the Task Mgmt request.
         */
-        if (hd->tm_iocstatus != MPI_IOCSTATUS_SUCCESS)
-               rc = FAILED;
+       if (hd->hard_resets < -1)
+               hd->hard_resets++;
+
+       rc = mptscsih_IssueTaskMgmt(hd, type, channel, id, lun,
+           ctx2abort, timeout);
+       if (rc)
+               printk(MYIOC_s_INFO_FMT "Issue of TaskMgmt failed!\n",
+                      hd->ioc->name);
+       else
+               dtmprintk((MYIOC_s_INFO_FMT "Issue of TaskMgmt Successful!\n",
+                          hd->ioc->name));
 
        dtmprintk((MYIOC_s_INFO_FMT "TMHandler rc = %d!\n", hd->ioc->name, rc));
 
@@ -1620,11 +1646,11 @@ mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, in
 
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/*
+/**
  *     mptscsih_IssueTaskMgmt - Generic send Task Management function.
  *     @hd: Pointer to MPT_SCSI_HOST structure
  *     @type: Task Management type
- *     @target: Logical Target ID for reset (if appropriate)
+ *     @id: Logical Target ID for reset (if appropriate)
  *     @lun: Logical Unit for reset (if appropriate)
  *     @ctx2abort: Context for the task to be aborted (if appropriate)
  *
@@ -1633,11 +1659,11 @@ mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, in
  *
  *     Not all fields are meaningfull for all task types.
  *
- *     Returns 0 for SUCCESS, -999 for "no msg frames",
- *     else other non-zero value returned.
- */
+ *     Returns 0 for SUCCESS, or FAILED.
+ *
+ **/
 static int
-mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, int ctx2abort, ulong timeout)
+mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int ctx2abort, ulong timeout)
 {
        MPT_FRAME_HDR   *mf;
        SCSITaskMgmt_t  *pScsiTm;
@@ -1657,7 +1683,7 @@ mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun
        /* Format the Request
         */
        pScsiTm = (SCSITaskMgmt_t *) mf;
-       pScsiTm->TargetID = target;
+       pScsiTm->TargetID = id;
        pScsiTm->Bus = channel;
        pScsiTm->ChainOffset = 0;
        pScsiTm->Function = MPI_FUNCTION_SCSI_TASK_MGMT;
@@ -1668,42 +1694,59 @@ mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun
        pScsiTm->MsgFlags = (type == MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS)
                     ? MPI_SCSITASKMGMT_MSGFLAGS_LIPRESET_RESET_OPTION : 0;
 
-       for (ii= 0; ii < 8; ii++) {
-               pScsiTm->LUN[ii] = 0;
-       }
-       pScsiTm->LUN[1] = lun;
+       int_to_scsilun(lun, (struct scsi_lun *)pScsiTm->LUN);
 
        for (ii=0; ii < 7; ii++)
                pScsiTm->Reserved2[ii] = 0;
 
        pScsiTm->TaskMsgContext = ctx2abort;
 
-       dtmprintk((MYIOC_s_INFO_FMT "IssueTaskMgmt: ctx2abort (0x%08x) type=%d\n",
-                       hd->ioc->name, ctx2abort, type));
+       dtmprintk((MYIOC_s_INFO_FMT "IssueTaskMgmt: ctx2abort (0x%08x) "
+               "type=%d\n", hd->ioc->name, ctx2abort, type));
 
        DBG_DUMP_TM_REQUEST_FRAME((u32 *)pScsiTm);
 
        if ((retval = mpt_send_handshake_request(hd->ioc->TaskCtx, hd->ioc,
-               sizeof(SCSITaskMgmt_t), (u32*)pScsiTm,
-               CAN_SLEEP)) != 0) {
-               dfailprintk((MYIOC_s_ERR_FMT "_send_handshake FAILED!"
-                       " (hd %p, ioc %p, mf %p) \n", hd->ioc->name, hd,
-                       hd->ioc, mf));
-               mpt_free_msg_frame(hd->ioc, mf);
-               return retval;
+               sizeof(SCSITaskMgmt_t), (u32*)pScsiTm, CAN_SLEEP)) != 0) {
+               dfailprintk((MYIOC_s_ERR_FMT "send_handshake FAILED!"
+                       " (hd %p, ioc %p, mf %p, rc=%d) \n", hd->ioc->name, hd,
+                       hd->ioc, mf, retval));
+               goto fail_out;
        }
 
        if(mptscsih_tm_wait_for_completion(hd, timeout) == FAILED) {
-               dfailprintk((MYIOC_s_ERR_FMT "_wait_for_completion FAILED!"
+               dfailprintk((MYIOC_s_ERR_FMT "task management request TIMED OUT!"
                        " (hd %p, ioc %p, mf %p) \n", hd->ioc->name, hd,
                        hd->ioc, mf));
-               mpt_free_msg_frame(hd->ioc, mf);
                dtmprintk((MYIOC_s_INFO_FMT "Calling HardReset! \n",
                         hd->ioc->name));
                retval = mpt_HardResetHandler(hd->ioc, CAN_SLEEP);
+               dtmprintk((MYIOC_s_INFO_FMT "rc=%d \n",
+                        hd->ioc->name, retval));
+               goto fail_out;
        }
 
+       /*
+        * Handle success case, see if theres a non-zero ioc_status.
+        */
+       if (hd->tm_iocstatus == MPI_IOCSTATUS_SUCCESS ||
+          hd->tm_iocstatus == MPI_IOCSTATUS_SCSI_TASK_TERMINATED ||
+          hd->tm_iocstatus == MPI_IOCSTATUS_SCSI_IOC_TERMINATED)
+               retval = 0;
+       else
+               retval = FAILED;
+
        return retval;
+
+ fail_out:
+
+       /*
+        * Free task managment mf, and corresponding tm flags
+        */
+       mpt_free_msg_frame(hd->ioc, mf);
+       hd->tmPending = 0;
+       hd->tmState = TM_STATE_NONE;
+       return FAILED;
 }
 
 static int
@@ -1728,7 +1771,7 @@ mptscsih_get_tm_timeout(MPT_ADAPTER *ioc)
  *     (linux scsi_host_template.eh_abort_handler routine)
  *
  *     Returns SUCCESS or FAILED.
- */
+ **/
 int
 mptscsih_abort(struct scsi_cmnd * SCpnt)
 {
@@ -1764,9 +1807,8 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
                return SUCCESS;
        }
 
-       if (hd->resetPending) {
+       if (hd->resetPending)
                return FAILED;
-       }
 
        if (hd->timeouts < -1)
                hd->timeouts++;
@@ -1789,13 +1831,12 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
 
        vdev = SCpnt->device->hostdata;
        retval = mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK,
-               vdev->vtarget->bus_id, vdev->vtarget->target_id, vdev->lun,
+               vdev->vtarget->channel, vdev->vtarget->id, vdev->lun,
                ctx2abort, mptscsih_get_tm_timeout(hd->ioc));
 
        if (SCPNT_TO_LOOKUP_IDX(SCpnt) == scpnt_idx &&
-           SCpnt->serial_number == sn) {
+           SCpnt->serial_number == sn)
                retval = FAILED;
-       }
 
        printk (KERN_WARNING MYNAM ": %s: task abort: %s (sc=%p)\n",
                hd->ioc->name,
@@ -1803,12 +1844,8 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
 
        if (retval == 0)
                return SUCCESS;
-
-       if(retval != FAILED ) {
-               hd->tmPending = 0;
-               hd->tmState = TM_STATE_NONE;
-       }
-       return FAILED;
+       else
+               return FAILED;
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -1819,7 +1856,7 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
  *     (linux scsi_host_template.eh_dev_reset_handler routine)
  *
  *     Returns SUCCESS or FAILED.
- */
+ **/
 int
 mptscsih_dev_reset(struct scsi_cmnd * SCpnt)
 {
@@ -1845,7 +1882,7 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt)
 
        vdev = SCpnt->device->hostdata;
        retval = mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET,
-               vdev->vtarget->bus_id, vdev->vtarget->target_id,
+               vdev->vtarget->channel, vdev->vtarget->id,
                0, 0, mptscsih_get_tm_timeout(hd->ioc));
 
        printk (KERN_WARNING MYNAM ": %s: target reset: %s (sc=%p)\n",
@@ -1854,14 +1891,11 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt)
 
        if (retval == 0)
                return SUCCESS;
-
-       if(retval != FAILED ) {
-               hd->tmPending = 0;
-               hd->tmState = TM_STATE_NONE;
-       }
-       return FAILED;
+       else
+               return FAILED;
 }
 
+
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /**
  *     mptscsih_bus_reset - Perform a SCSI BUS_RESET!  new_eh variant
@@ -1870,7 +1904,7 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt)
  *     (linux scsi_host_template.eh_bus_reset_handler routine)
  *
  *     Returns SUCCESS or FAILED.
- */
+ **/
 int
 mptscsih_bus_reset(struct scsi_cmnd * SCpnt)
 {
@@ -1896,7 +1930,7 @@ mptscsih_bus_reset(struct scsi_cmnd * SCpnt)
 
        vdev = SCpnt->device->hostdata;
        retval = mptscsih_TMHandler(hd, MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS,
-               vdev->vtarget->bus_id, 0, 0, 0, mptscsih_get_tm_timeout(hd->ioc));
+               vdev->vtarget->channel, 0, 0, 0, mptscsih_get_tm_timeout(hd->ioc));
 
        printk (KERN_WARNING MYNAM ": %s: bus reset: %s (sc=%p)\n",
                hd->ioc->name,
@@ -1904,12 +1938,8 @@ mptscsih_bus_reset(struct scsi_cmnd * SCpnt)
 
        if (retval == 0)
                return SUCCESS;
-
-       if(retval != FAILED ) {
-               hd->tmPending = 0;
-               hd->tmState = TM_STATE_NONE;
-       }
-       return FAILED;
+       else
+               return FAILED;
 }
 
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -1992,7 +2022,6 @@ mptscsih_tm_pending_wait(MPT_SCSI_HOST * hd)
 /**
  *     mptscsih_tm_wait_for_completion - wait for completion of TM task
  *     @hd: Pointer to MPT host structure.
- *     @timeout: timeout in seconds
  *
  *     Returns {SUCCESS,FAILED}.
  */
@@ -2066,7 +2095,7 @@ mptscsih_taskmgmt_response_code(MPT_ADAPTER *ioc, u8 response_code)
  *     load/init time via the mpt_register() API call.
  *
  *     Returns 1 indicating alloc'd request frame ptr should be freed.
- */
+ **/
 int
 mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
 {
@@ -2076,78 +2105,85 @@ mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *m
        unsigned long            flags;
        u16                      iocstatus;
        u8                       tmType;
+       u32                      termination_count;
 
        dtmprintk((MYIOC_s_WARN_FMT "TaskMgmt completed (mf=%p,mr=%p)\n",
-                       ioc->name, mf, mr));
-       if (ioc->sh) {
-               /* Depending on the thread, a timer is activated for
-                * the TM request.  Delete this timer on completion of TM.
-                * Decrement count of outstanding TM requests.
-                */
-               hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
-       } else {
-               dtmprintk((MYIOC_s_WARN_FMT "TaskMgmt Complete: NULL Scsi Host Ptr\n",
-                       ioc->name));
+           ioc->name, mf, mr));
+       if (!ioc->sh) {
+               dtmprintk((MYIOC_s_WARN_FMT
+                   "TaskMgmt Complete: NULL Scsi Host Ptr\n", ioc->name));
                return 1;
        }
 
        if (mr == NULL) {
-               dtmprintk((MYIOC_s_WARN_FMT "ERROR! TaskMgmt Reply: NULL Request %p\n",
-                       ioc->name, mf));
+               dtmprintk((MYIOC_s_WARN_FMT
+                   "ERROR! TaskMgmt Reply: NULL Request %p\n", ioc->name, mf));
                return 1;
-       } else {
-               pScsiTmReply = (SCSITaskMgmtReply_t*)mr;
-               pScsiTmReq = (SCSITaskMgmt_t*)mf;
-
-               /* Figure out if this was ABORT_TASK, TARGET_RESET, or BUS_RESET! */
-               tmType = pScsiTmReq->TaskType;
+       }
 
-               if (ioc->facts.MsgVersion >= MPI_VERSION_01_05 &&
-                   pScsiTmReply->ResponseCode)
-                       mptscsih_taskmgmt_response_code(ioc,
-                           pScsiTmReply->ResponseCode);
+       hd = (MPT_SCSI_HOST *)ioc->sh->hostdata;
+       pScsiTmReply = (SCSITaskMgmtReply_t*)mr;
+       pScsiTmReq = (SCSITaskMgmt_t*)mf;
+       tmType = pScsiTmReq->TaskType;
+       iocstatus = le16_to_cpu(pScsiTmReply->IOCStatus) & MPI_IOCSTATUS_MASK;
+       termination_count = le32_to_cpu(pScsiTmReply->TerminationCount);
+
+       if (ioc->facts.MsgVersion >= MPI_VERSION_01_05 &&
+           pScsiTmReply->ResponseCode)
+               mptscsih_taskmgmt_response_code(ioc,
+                   pScsiTmReply->ResponseCode);
+       DBG_DUMP_TM_REPLY_FRAME((u32 *)pScsiTmReply);
+
+#if defined(MPT_DEBUG_REPLY) || defined(MPT_DEBUG_TM)
+       printk("%s: ha=%d [%d:%d:0] task_type=0x%02X "
+           "iocstatus=0x%04X\n\tloginfo=0x%08X response_code=0x%02X "
+           "term_cmnds=%d\n", __FUNCTION__, ioc->id, pScsiTmReply->Bus,
+           pScsiTmReply->TargetID, pScsiTmReq->TaskType,
+           le16_to_cpu(pScsiTmReply->IOCStatus),
+           le32_to_cpu(pScsiTmReply->IOCLogInfo),pScsiTmReply->ResponseCode,
+           le32_to_cpu(pScsiTmReply->TerminationCount));
+#endif
+       if (!iocstatus) {
+               dtmprintk((MYIOC_s_WARN_FMT " TaskMgmt SUCCESS\n", ioc->name));
+                       hd->abortSCpnt = NULL;
+               goto out;
+       }
 
-               dtmprintk((MYIOC_s_WARN_FMT "  TaskType = %d, TerminationCount=%d\n",
-                               ioc->name, tmType, le32_to_cpu(pScsiTmReply->TerminationCount)));
-               DBG_DUMP_TM_REPLY_FRAME((u32 *)pScsiTmReply);
+       /* Error?  (anything non-zero?) */
 
-               iocstatus = le16_to_cpu(pScsiTmReply->IOCStatus) & MPI_IOCSTATUS_MASK;
-               hd->tm_iocstatus = iocstatus;
-               dtmprintk((MYIOC_s_WARN_FMT "  SCSI TaskMgmt (%d) IOCStatus=%04x IOCLogInfo=%08x\n",
-                       ioc->name, tmType, iocstatus, le32_to_cpu(pScsiTmReply->IOCLogInfo)));
-               /* Error?  (anything non-zero?) */
-               if (iocstatus) {
+       /* clear flags and continue.
+        */
+       switch (tmType) {
 
-                       /* clear flags and continue.
-                        */
-                       if (tmType == MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK)
-                               hd->abortSCpnt = NULL;
+       case MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK:
+               if (termination_count == 1)
+                       iocstatus = MPI_IOCSTATUS_SCSI_TASK_TERMINATED;
+               hd->abortSCpnt = NULL;
+               break;
 
-                       /* If an internal command is present
-                        * or the TM failed - reload the FW.
-                        * FC FW may respond FAILED to an ABORT
-                        */
-                       if (tmType == MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS) {
-                               if ((hd->cmdPtr) ||
-                                   (iocstatus == MPI_IOCSTATUS_SCSI_TASK_MGMT_FAILED)) {
-                                       if (mpt_HardResetHandler(ioc, NO_SLEEP) < 0) {
-                                               printk((KERN_WARNING
-                                                       " Firmware Reload FAILED!!\n"));
-                                       }
-                               }
-                       }
-               } else {
-                       dtmprintk((MYIOC_s_WARN_FMT " TaskMgmt SUCCESS\n", ioc->name));
+       case MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS:
 
-                       hd->abortSCpnt = NULL;
+               /* If an internal command is present
+                * or the TM failed - reload the FW.
+                * FC FW may respond FAILED to an ABORT
+                */
+               if (iocstatus == MPI_IOCSTATUS_SCSI_TASK_MGMT_FAILED ||
+                   hd->cmdPtr)
+                       if (mpt_HardResetHandler(ioc, NO_SLEEP) < 0)
+                               printk((KERN_WARNING " Firmware Reload FAILED!!\n"));
+               break;
 
-               }
+       case MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET:
+       default:
+               break;
        }
 
+ out:
        spin_lock_irqsave(&ioc->FreeQlock, flags);
        hd->tmPending = 0;
-       spin_unlock_irqrestore(&ioc->FreeQlock, flags);
        hd->tmState = TM_STATE_NONE;
+       hd->tm_iocstatus = iocstatus;
+       spin_unlock_irqrestore(&ioc->FreeQlock, flags);
 
        return 1;
 }
@@ -2191,7 +2227,7 @@ mptscsih_bios_param(struct scsi_device * sdev, struct block_device *bdev,
 
        dprintk((KERN_NOTICE
                ": bios_param: Id=%i Lun=%i Channel=%i CHS=%i/%i/%i\n",
-               sdev->id, sdev->lun,sdev->channel,(int)cylinders,heads,sectors));
+               sdev->id, sdev->lun, sdev->channel, (int)cylinders, heads, sectors));
 
        return 0;
 }
@@ -2200,115 +2236,78 @@ mptscsih_bios_param(struct scsi_device * sdev, struct block_device *bdev,
  *
  */
 int
-mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id)
+mptscsih_is_phys_disk(MPT_ADAPTER *ioc, u8 channel, u8 id)
 {
+       struct inactive_raid_component_info *component_info;
        int i;
+       int rc = 0;
 
-       if (!ioc->raid_data.isRaid || !ioc->raid_data.pIocPg3)
-               return 0;
+       if (!ioc->raid_data.pIocPg3)
+               goto out;
        for (i = 0; i < ioc->raid_data.pIocPg3->NumPhysDisks; i++) {
-                if (id == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID)
-                        return 1;
-        }
-        return 0;
-}
-EXPORT_SYMBOL(mptscsih_is_phys_disk);
-
-int
-mptscsih_raid_id_to_num(MPT_SCSI_HOST *hd, uint physdiskid)
-{
-       int i;
-
-       if (!hd->ioc->raid_data.isRaid || !hd->ioc->raid_data.pIocPg3)
-               return -ENXIO;
-
-       for (i = 0; i < hd->ioc->raid_data.pIocPg3->NumPhysDisks; i++) {
-               if (physdiskid ==
-                   hd->ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID)
-                       return hd->ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskNum;
+               if ((id == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID) &&
+                   (channel == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskBus)) {
+                       rc = 1;
+                       goto out;
+               }
        }
 
-       return -ENXIO;
-}
-EXPORT_SYMBOL(mptscsih_raid_id_to_num);
+       /*
+        * Check inactive list for matching phys disks
+        */
+       if (list_empty(&ioc->raid_data.inactive_list))
+               goto out;
 
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/*
- *     OS entry point to allow host driver to alloc memory
- *     for each scsi target. Called once per device the bus scan.
- *     Return non-zero if allocation fails.
- */
-int
-mptscsih_target_alloc(struct scsi_target *starget)
-{
-       VirtTarget              *vtarget;
+       down(&ioc->raid_data.inactive_list_mutex);
+       list_for_each_entry(component_info, &ioc->raid_data.inactive_list,
+           list) {
+               if ((component_info->d.PhysDiskID == id) &&
+                   (component_info->d.PhysDiskBus == channel))
+                       rc = 1;
+       }
+       up(&ioc->raid_data.inactive_list_mutex);
 
-       vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL);
-       if (!vtarget)
-               return -ENOMEM;
-       starget->hostdata = vtarget;
-       vtarget->starget = starget;
-       return 0;
+ out:
+       return rc;
 }
+EXPORT_SYMBOL(mptscsih_is_phys_disk);
 
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/*
- *     OS entry point to allow host driver to alloc memory
- *     for each scsi device. Called once per device the bus scan.
- *     Return non-zero if allocation fails.
- */
-int
-mptscsih_slave_alloc(struct scsi_device *sdev)
+u8
+mptscsih_raid_id_to_num(MPT_ADAPTER *ioc, u8 channel, u8 id)
 {
-       struct Scsi_Host        *host = sdev->host;
-       MPT_SCSI_HOST           *hd = (MPT_SCSI_HOST *)host->hostdata;
-       VirtTarget              *vtarget;
-       VirtDevice              *vdev;
-       struct scsi_target      *starget;
+       struct inactive_raid_component_info *component_info;
+       int i;
+       int rc = -ENXIO;
 
-       vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
-       if (!vdev) {
-               printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n",
-                               hd->ioc->name, sizeof(VirtDevice));
-               return -ENOMEM;
+       if (!ioc->raid_data.pIocPg3)
+               goto out;
+       for (i = 0; i < ioc->raid_data.pIocPg3->NumPhysDisks; i++) {
+               if ((id == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskID) &&
+                   (channel == ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskBus)) {
+                       rc = ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskNum;
+                       goto out;
+               }
        }
 
-       vdev->lun = sdev->lun;
-       sdev->hostdata = vdev;
-
-       starget = scsi_target(sdev);
-       vtarget = starget->hostdata;
+       /*
+        * Check inactive list for matching phys disks
+        */
+       if (list_empty(&ioc->raid_data.inactive_list))
+               goto out;
 
-       vdev->vtarget = vtarget;
-
-       if (vtarget->num_luns == 0) {
-               hd->Targets[sdev->id] = vtarget;
-               vtarget->ioc_id = hd->ioc->id;
-               vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
-               vtarget->target_id = sdev->id;
-               vtarget->bus_id = sdev->channel;
-               if (hd->ioc->bus_type == SPI && sdev->channel == 0 &&
-                   hd->ioc->raid_data.isRaid & (1 << sdev->id)) {
-                       vtarget->raidVolume = 1;
-                       ddvtprintk((KERN_INFO
-                                   "RAID Volume @ id %d\n", sdev->id));
-               }
+       down(&ioc->raid_data.inactive_list_mutex);
+       list_for_each_entry(component_info, &ioc->raid_data.inactive_list,
+           list) {
+               if ((component_info->d.PhysDiskID == id) &&
+                   (component_info->d.PhysDiskBus == channel))
+                       rc = component_info->d.PhysDiskNum;
        }
-       vtarget->num_luns++;
-       return 0;
-}
+       up(&ioc->raid_data.inactive_list_mutex);
 
-/*
- *     OS entry point to allow for host driver to free allocated memory
- *     Called if no device present or device being unloaded
- */
-void
-mptscsih_target_destroy(struct scsi_target *starget)
-{
-       if (starget->hostdata)
-               kfree(starget->hostdata);
-       starget->hostdata = NULL;
+ out:
+       return rc;
 }
+EXPORT_SYMBOL(mptscsih_raid_id_to_num);
 
 /*
  *     OS entry point to allow for host driver to free allocated memory
@@ -2328,11 +2327,7 @@ mptscsih_slave_destroy(struct scsi_device *sdev)
        vdevice = sdev->hostdata;
 
        mptscsih_search_running_cmds(hd, vdevice);
-       vtarget->luns[0] &= ~(1 << vdevice->lun);
        vtarget->num_luns--;
-       if (vtarget->num_luns == 0) {
-               hd->Targets[sdev->id] = NULL;
-       }
        mptscsih_synchronize_cache(hd, vdevice);
        kfree(vdevice);
        sdev->hostdata = NULL;
@@ -2394,15 +2389,14 @@ mptscsih_slave_configure(struct scsi_device *sdev)
        VirtDevice              *vdevice;
        struct scsi_target      *starget;
        MPT_SCSI_HOST           *hd = (MPT_SCSI_HOST *)sh->hostdata;
-       int                     indexed_lun, lun_index;
 
        starget = scsi_target(sdev);
        vtarget = starget->hostdata;
        vdevice = sdev->hostdata;
 
        dsprintk((MYIOC_s_INFO_FMT
-               "device @ %p, id=%d, LUN=%d, channel=%d\n",
-               hd->ioc->name, sdev, sdev->id, sdev->lun, sdev->channel));
+               "device @ %p, channel=%d, id=%d, lun=%d\n",
+               hd->ioc->name, sdev, sdev->channel, sdev->id, sdev->lun));
        if (hd->ioc->bus_type == SPI)
                dsprintk((MYIOC_s_INFO_FMT
                    "sdtr %d wdtr %d ppr %d inq length=%d\n",
@@ -2415,11 +2409,7 @@ mptscsih_slave_configure(struct scsi_device *sdev)
                goto slave_configure_exit;
        }
 
-       vdevice->configured_lun=1;
-       lun_index = (vdevice->lun >> 5);  /* 32 luns per lun_index */
-       indexed_lun = (vdevice->lun % 32);
-       vtarget->luns[lun_index] |= (1 << indexed_lun);
-       mptscsih_initTarget(hd, vtarget, sdev);
+       vdevice->configured_lun = 1;
        mptscsih_change_queue_depth(sdev, MPT_SCSI_CMD_PER_DEV_HIGH);
 
        dsprintk((MYIOC_s_INFO_FMT
@@ -2681,285 +2671,6 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
        return 1;               /* currently means nothing really */
 }
 
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/*
- *     mptscsih_initTarget - Target, LUN alloc/free functionality.
- *     @hd: Pointer to MPT_SCSI_HOST structure
- *     @vtarget: per target private data
- *     @sdev: SCSI device
- *
- *     NOTE: It's only SAFE to call this routine if data points to
- *     sane & valid STANDARD INQUIRY data!
- *
- *     Allocate and initialize memory for this target.
- *     Save inquiry data.
- *
- */
-static void
-mptscsih_initTarget(MPT_SCSI_HOST *hd, VirtTarget *vtarget,
-                   struct scsi_device *sdev)
-{
-       dinitprintk((MYIOC_s_INFO_FMT "initTarget bus=%d id=%d lun=%d hd=%p\n",
-               hd->ioc->name, vtarget->bus_id, vtarget->target_id,
-               sdev->lun, hd));
-
-       /* Is LUN supported? If so, upper 2 bits will be 0
-       * in first byte of inquiry data.
-       */
-       if (sdev->inq_periph_qual != 0)
-               return;
-
-       if (vtarget == NULL)
-               return;
-
-       vtarget->type = sdev->type;
-
-       if (hd->ioc->bus_type != SPI)
-               return;
-
-       if ((sdev->type == TYPE_PROCESSOR) && (hd->ioc->spi_data.Saf_Te)) {
-               /* Treat all Processors as SAF-TE if
-                * command line option is set */
-               vtarget->tflags |= MPT_TARGET_FLAGS_SAF_TE_ISSUED;
-               mptscsih_writeIOCPage4(hd, vtarget->target_id, vtarget->bus_id);
-       }else if ((sdev->type == TYPE_PROCESSOR) &&
-               !(vtarget->tflags & MPT_TARGET_FLAGS_SAF_TE_ISSUED )) {
-               if (sdev->inquiry_len > 49 ) {
-                       if (sdev->inquiry[44] == 'S' &&
-                           sdev->inquiry[45] == 'A' &&
-                           sdev->inquiry[46] == 'F' &&
-                           sdev->inquiry[47] == '-' &&
-                           sdev->inquiry[48] == 'T' &&
-                           sdev->inquiry[49] == 'E' ) {
-                               vtarget->tflags |= MPT_TARGET_FLAGS_SAF_TE_ISSUED;
-                               mptscsih_writeIOCPage4(hd, vtarget->target_id, vtarget->bus_id);
-                       }
-               }
-       }
-       mptscsih_setTargetNegoParms(hd, vtarget, sdev);
-}
-
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/*
- *  Update the target negotiation parameters based on the
- *  the Inquiry data, adapter capabilities, and NVRAM settings.
- *
- */
-static void
-mptscsih_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target,
-                           struct scsi_device *sdev)
-{
-       SpiCfgData *pspi_data = &hd->ioc->spi_data;
-       int  id = (int) target->target_id;
-       int  nvram;
-       u8 width = MPT_NARROW;
-       u8 factor = MPT_ASYNC;
-       u8 offset = 0;
-       u8 nfactor;
-       u8 noQas = 1;
-
-       target->negoFlags = pspi_data->noQas;
-
-       /* noQas == 0 => device supports QAS. */
-
-       if (sdev->scsi_level < SCSI_2) {
-               width = 0;
-               factor = MPT_ULTRA2;
-               offset = pspi_data->maxSyncOffset;
-               target->tflags &= ~MPT_TARGET_FLAGS_Q_YES;
-       } else {
-               if (scsi_device_wide(sdev)) {
-                       width = 1;
-               }
-
-               if (scsi_device_sync(sdev)) {
-                       factor = pspi_data->minSyncFactor;
-                       if (!scsi_device_dt(sdev))
-                                       factor = MPT_ULTRA2;
-                       else {
-                               if (!scsi_device_ius(sdev) &&
-                                   !scsi_device_qas(sdev))
-                                       factor = MPT_ULTRA160;
-                               else {
-                                       factor = MPT_ULTRA320;
-                                       if (scsi_device_qas(sdev)) {
-                                               ddvtprintk((KERN_INFO "Enabling QAS due to byte56=%02x on id=%d!\n", scsi_device_qas(sdev), id));
-                                               noQas = 0;
-                                       }
-                                       if (sdev->type == TYPE_TAPE &&
-                                           scsi_device_ius(sdev))
-                                               target->negoFlags |= MPT_TAPE_NEGO_IDP;
-                               }
-                       }
-                       offset = pspi_data->maxSyncOffset;
-
-                       /* If RAID, never disable QAS
-                        * else if non RAID, do not disable
-                        *   QAS if bit 1 is set
-                        * bit 1 QAS support, non-raid only
-                        * bit 0 IU support
-                        */
-                       if (target->raidVolume == 1) {
-                               noQas = 0;
-                       }
-               } else {
-                       factor = MPT_ASYNC;
-                       offset = 0;
-               }
-       }
-
-       if (!sdev->tagged_supported) {
-               target->tflags &= ~MPT_TARGET_FLAGS_Q_YES;
-       }
-
-       /* Update tflags based on NVRAM settings. (SCSI only)
-        */
-       if (pspi_data->nvram && (pspi_data->nvram[id] != MPT_HOST_NVRAM_INVALID)) {
-               nvram = pspi_data->nvram[id];
-               nfactor = (nvram & MPT_NVRAM_SYNC_MASK) >> 8;
-
-               if (width)
-                       width = nvram & MPT_NVRAM_WIDE_DISABLE ? 0 : 1;
-
-               if (offset > 0) {
-                       /* Ensure factor is set to the
-                        * maximum of: adapter, nvram, inquiry
-                        */
-                       if (nfactor) {
-                               if (nfactor < pspi_data->minSyncFactor )
-                                       nfactor = pspi_data->minSyncFactor;
-
-                               factor = max(factor, nfactor);
-                               if (factor == MPT_ASYNC)
-                                       offset = 0;
-                       } else {
-                               offset = 0;
-                               factor = MPT_ASYNC;
-               }
-               } else {
-                       factor = MPT_ASYNC;
-               }
-       }
-
-       /* Make sure data is consistent
-        */
-       if ((!width) && (factor < MPT_ULTRA2)) {
-               factor = MPT_ULTRA2;
-       }
-
-       /* Save the data to the target structure.
-        */
-       target->minSyncFactor = factor;
-       target->maxOffset = offset;
-       target->maxWidth = width;
-
-       target->tflags |= MPT_TARGET_FLAGS_VALID_NEGO;
-
-       /* Disable unused features.
-        */
-       if (!width)
-               target->negoFlags |= MPT_TARGET_NO_NEGO_WIDE;
-
-       if (!offset)
-               target->negoFlags |= MPT_TARGET_NO_NEGO_SYNC;
-
-       if ( factor > MPT_ULTRA320 )
-               noQas = 0;
-
-       if (noQas && (pspi_data->noQas == 0)) {
-               pspi_data->noQas |= MPT_TARGET_NO_NEGO_QAS;
-               target->negoFlags |= MPT_TARGET_NO_NEGO_QAS;
-
-               /* Disable QAS in a mixed configuration case
-                */
-
-               ddvtprintk((KERN_INFO "Disabling QAS due to noQas=%02x on id=%d!\n", noQas, id));
-       }
-}
-
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/*
- *  SCSI Config Page functionality ...
- */
-
-/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
-/*     mptscsih_writeIOCPage4  - write IOC Page 4
- *     @hd: Pointer to a SCSI Host Structure
- *     @target_id: write IOC Page4 for this ID & Bus
- *
- *     Return: -EAGAIN if unable to obtain a Message Frame
- *             or 0 if success.
- *
- *     Remark: We do not wait for a return, write pages sequentially.
- */
-static int
-mptscsih_writeIOCPage4(MPT_SCSI_HOST *hd, int target_id, int bus)
-{
-       MPT_ADAPTER             *ioc = hd->ioc;
-       Config_t                *pReq;
-       IOCPage4_t              *IOCPage4Ptr;
-       MPT_FRAME_HDR           *mf;
-       dma_addr_t               dataDma;
-       u16                      req_idx;
-       u32                      frameOffset;
-       u32                      flagsLength;
-       int                      ii;
-
-       /* Get a MF for this command.
-        */
-       if ((mf = mpt_get_msg_frame(ioc->DoneCtx, ioc)) == NULL) {
-               dfailprintk((MYIOC_s_WARN_FMT "writeIOCPage4 : no msg frames!\n",
-                                       ioc->name));
-               return -EAGAIN;
-       }
-
-       /* Set the request and the data pointers.
-        * Place data at end of MF.
-        */
-       pReq = (Config_t *)mf;
-
-       req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx);
-       frameOffset = ioc->req_sz - sizeof(IOCPage4_t);
-
-       /* Complete the request frame (same for all requests).
-        */
-       pReq->Action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
-       pReq->Reserved = 0;
-       pReq->ChainOffset = 0;
-       pReq->Function = MPI_FUNCTION_CONFIG;
-       pReq->ExtPageLength = 0;
-       pReq->ExtPageType = 0;
-       pReq->MsgFlags = 0;
-       for (ii=0; ii < 8; ii++) {
-               pReq->Reserved2[ii] = 0;
-       }
-
-               IOCPage4Ptr = ioc->spi_data.pIocPg4;
-               dataDma = ioc->spi_data.IocPg4_dma;
-               ii = IOCPage4Ptr->ActiveSEP++;
-               IOCPage4Ptr->SEP[ii].SEPTargetID = target_id;
-               IOCPage4Ptr->SEP[ii].SEPBus = bus;
-               pReq->Header = IOCPage4Ptr->Header;
-       pReq->PageAddress = cpu_to_le32(target_id | (bus << 8 ));
-
-       /* Add a SGE to the config request.
-        */
-       flagsLength = MPT_SGE_FLAGS_SSIMPLE_WRITE |
-               (IOCPage4Ptr->Header.PageLength + ii) * 4;
-
-       mpt_add_sge((char *)&pReq->PageBufferSGE, flagsLength, dataDma);
-
-       dinitprintk((MYIOC_s_INFO_FMT
-               "writeIOCPage4: MaxSEP=%d ActiveSEP=%d id=%d bus=%d\n",
-                       ioc->name, IOCPage4Ptr->MaxSEP, IOCPage4Ptr->ActiveSEP, target_id, bus));
-
-       mpt_put_msg_frame(ioc->DoneCtx, ioc, mf);
-
-       return 0;
-}
-
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
 /*
  *  Bus Scan and Domain Validation functionality ...
@@ -3343,7 +3054,7 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)
                pScsiReq->Function = MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH;
        } else {
                pScsiReq->TargetID = io->id;
-               pScsiReq->Bus = io->bus;
+               pScsiReq->Bus = io->channel;
                pScsiReq->ChainOffset = 0;
                pScsiReq->Function = MPI_FUNCTION_SCSI_IO_REQUEST;
        }
@@ -3356,9 +3067,7 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)
        pScsiReq->MsgFlags = mpt_msg_flags();
        /* MsgContext set in mpt_get_msg_fram call  */
 
-       for (ii=0; ii < 8; ii++)
-               pScsiReq->LUN[ii] = 0;
-       pScsiReq->LUN[1] = io->lun;
+       int_to_scsilun(io->lun, (struct scsi_lun *)pScsiReq->LUN);
 
        if (io->flags & MPT_ICFLAG_TAGGED_CMD)
                pScsiReq->Control = cpu_to_le32(dir | MPI_SCSIIO_CONTROL_SIMPLEQ);
@@ -3379,7 +3088,7 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)
                                           + (my_idx * MPT_SENSE_BUFFER_ALLOC));
 
        ddvprintk((MYIOC_s_INFO_FMT "Sending Command 0x%x for (%d:%d:%d)\n",
-                       hd->ioc->name, cmd, io->bus, io->id, io->lun));
+                       hd->ioc->name, cmd, io->channel, io->id, io->lun));
 
        if (dir == MPI_SCSIIO_CONTROL_READ) {
                mpt_add_sge((char *) &pScsiReq->SGL,
@@ -3462,9 +3171,9 @@ mptscsih_synchronize_cache(MPT_SCSI_HOST *hd, VirtDevice *vdevice)
        iocmd.data_dma = -1;
        iocmd.size = 0;
        iocmd.rsvd = iocmd.rsvd2 = 0;
-       iocmd.bus = vdevice->vtarget->bus_id;
-       iocmd.id = vdevice->vtarget->target_id;
-       iocmd.lun = (u8)vdevice->lun;
+       iocmd.channel = vdevice->vtarget->channel;
+       iocmd.id = vdevice->vtarget->id;
+       iocmd.lun = vdevice->lun;
 
        if ((vdevice->vtarget->type == TYPE_DISK) &&
            (vdevice->configured_lun))
@@ -3480,9 +3189,6 @@ EXPORT_SYMBOL(mptscsih_resume);
 EXPORT_SYMBOL(mptscsih_proc_info);
 EXPORT_SYMBOL(mptscsih_info);
 EXPORT_SYMBOL(mptscsih_qcmd);
-EXPORT_SYMBOL(mptscsih_target_alloc);
-EXPORT_SYMBOL(mptscsih_slave_alloc);
-EXPORT_SYMBOL(mptscsih_target_destroy);
 EXPORT_SYMBOL(mptscsih_slave_destroy);
 EXPORT_SYMBOL(mptscsih_slave_configure);
 EXPORT_SYMBOL(mptscsih_abort);
index 187c8af0890b3e6590b61aa9783d0b3238fd2ad9..843c01a6aa0ecc817571629e49dd7bf28ec21ce6 100644 (file)
@@ -6,7 +6,7 @@
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
  *  Copyright (c) 1999-2007 LSI Logic Corporation
- *  (mailto:mpt_linux_developer@lsil.com)
+ *  (mailto:mpt_linux_developer@lsi.com)
  *
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
  *     SCSI Public stuff...
  */
 
+#define MPT_SCANDV_GOOD                        (0x00000000) /* must be 0 */
+#define MPT_SCANDV_DID_RESET           (0x00000001)
+#define MPT_SCANDV_SENSE               (0x00000002)
+#define MPT_SCANDV_SOME_ERROR          (0x00000004)
+#define MPT_SCANDV_SELECTION_TIMEOUT   (0x00000008)
+#define MPT_SCANDV_ISSUE_SENSE         (0x00000010)
+#define MPT_SCANDV_FALLBACK            (0x00000020)
+
+#define MPT_SCANDV_MAX_RETRIES         (10)
+
+#define MPT_ICFLAG_BUF_CAP     0x01    /* ReadBuffer Read Capacity format */
+#define MPT_ICFLAG_ECHO                0x02    /* ReadBuffer Echo buffer format */
+#define MPT_ICFLAG_EBOS                0x04    /* ReadBuffer Echo buffer has EBOS */
+#define MPT_ICFLAG_PHYS_DISK   0x08    /* Any SCSI IO but do Phys Disk Format */
+#define MPT_ICFLAG_TAGGED_CMD  0x10    /* Do tagged IO */
+#define MPT_ICFLAG_DID_RESET   0x20    /* Bus Reset occurred with this command */
+#define MPT_ICFLAG_RESERVED    0x40    /* Reserved has been issued */
+
 #define MPT_SCSI_CMD_PER_DEV_HIGH      64
 #define MPT_SCSI_CMD_PER_DEV_LOW       32
 
 #define MPTSCSIH_SAF_TE                 0
 #define MPTSCSIH_PT_CLEAR               0
 
-
 #endif
 
+typedef struct _internal_cmd {
+       char            *data;          /* data pointer */
+       dma_addr_t      data_dma;       /* data dma address */
+       int             size;           /* transfer size */
+       u8              cmd;            /* SCSI Op Code */
+       u8              channel;        /* bus number */
+       u8              id;             /* SCSI ID (virtual) */
+       int             lun;
+       u8              flags;          /* Bit Field - See above */
+       u8              physDiskNum;    /* Phys disk number, -1 else */
+       u8              rsvd2;
+       u8              rsvd;
+} INTERNAL_CMD;
+
 extern void mptscsih_remove(struct pci_dev *);
 extern void mptscsih_shutdown(struct pci_dev *);
 #ifdef CONFIG_PM
@@ -81,9 +112,6 @@ extern int mptscsih_resume(struct pci_dev *pdev);
 extern int mptscsih_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, int length, int func);
 extern const char * mptscsih_info(struct Scsi_Host *SChost);
 extern int mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *));
-extern int mptscsih_target_alloc(struct scsi_target *starget);
-extern int mptscsih_slave_alloc(struct scsi_device *device);
-extern void mptscsih_target_destroy(struct scsi_target *starget);
 extern void mptscsih_slave_destroy(struct scsi_device *device);
 extern int mptscsih_slave_configure(struct scsi_device *device);
 extern int mptscsih_abort(struct scsi_cmnd * SCpnt);
@@ -98,6 +126,6 @@ extern int mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pE
 extern int mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset);
 extern int mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth);
 extern void mptscsih_timer_expired(unsigned long data);
-extern int mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, int ctx2abort, ulong timeout);
-extern int mptscsih_raid_id_to_num(MPT_SCSI_HOST *hd, uint physdiskid);
-extern int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, int id);
+extern int mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int ctx2abort, ulong timeout);
+extern u8 mptscsih_raid_id_to_num(MPT_ADAPTER *ioc, u8 channel, u8 id);
+extern int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, u8 channel, u8 id);
index 203c661d2c79c782324b849fa57589289da95e09..85f21b54cb7de6702e89d4fb6728fa25e37e0e3c 100644 (file)
@@ -4,7 +4,7 @@
  *      running LSI Logic Fusion MPT (Message Passing Technology) firmware.
  *
  *  Copyright (c) 1999-2007 LSI Logic Corporation
- *  (mailto:mpt_linux_developer@lsil.com)
+ *  (mailto:mpt_linux_developer@lsi.com)
  *
  */
 /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -54,7 +54,6 @@
 #include <linux/delay.h>       /* for mdelay */
 #include <linux/interrupt.h>   /* needed for in_interrupt() proto */
 #include <linux/reboot.h>      /* notifier code */
-#include <linux/sched.h>
 #include <linux/workqueue.h>
 #include <linux/raid_class.h>
 
@@ -65,6 +64,7 @@
 #include <scsi/scsi_tcq.h>
 #include <scsi/scsi_transport.h>
 #include <scsi/scsi_transport_spi.h>
+#include <scsi/scsi_dbg.h>
 
 #include "mptbase.h"
 #include "mptscsih.h"
@@ -95,25 +95,339 @@ static int mptspiDoneCtx = -1;
 static int     mptspiTaskCtx = -1;
 static int     mptspiInternalCtx = -1; /* Used only for internal commands */
 
+/**
+ *     mptspi_setTargetNegoParms  - Update the target negotiation
+ *     parameters based on the the Inquiry data, adapter capabilities,
+ *     and NVRAM settings
+ *
+ *     @hd: Pointer to a SCSI Host Structure
+ *     @vtarget: per target private data
+ *     @sdev: SCSI device
+ *
+ **/
+static void
+mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target,
+                           struct scsi_device *sdev)
+{
+       SpiCfgData *pspi_data = &hd->ioc->spi_data;
+       int  id = (int) target->id;
+       int  nvram;
+       u8 width = MPT_NARROW;
+       u8 factor = MPT_ASYNC;
+       u8 offset = 0;
+       u8 nfactor;
+       u8 noQas = 1;
+
+       target->negoFlags = pspi_data->noQas;
+
+       if (sdev->scsi_level < SCSI_2) {
+               width = 0;
+               factor = MPT_ULTRA2;
+               offset = pspi_data->maxSyncOffset;
+               target->tflags &= ~MPT_TARGET_FLAGS_Q_YES;
+       } else {
+               if (scsi_device_wide(sdev))
+                       width = 1;
+
+               if (scsi_device_sync(sdev)) {
+                       factor = pspi_data->minSyncFactor;
+                       if (!scsi_device_dt(sdev))
+                                       factor = MPT_ULTRA2;
+                       else {
+                               if (!scsi_device_ius(sdev) &&
+                                   !scsi_device_qas(sdev))
+                                       factor = MPT_ULTRA160;
+                               else {
+                                       factor = MPT_ULTRA320;
+                                       if (scsi_device_qas(sdev)) {
+                                               ddvprintk((KERN_INFO "Enabling QAS due to byte56=%02x on id=%d!\n", scsi_device_qas(sdev), id));
+                                               noQas = 0;
+                                       }
+                                       if (sdev->type == TYPE_TAPE &&
+                                           scsi_device_ius(sdev))
+                                               target->negoFlags |= MPT_TAPE_NEGO_IDP;
+                               }
+                       }
+                       offset = pspi_data->maxSyncOffset;
+
+                       /* If RAID, never disable QAS
+                        * else if non RAID, do not disable
+                        *   QAS if bit 1 is set
+                        * bit 1 QAS support, non-raid only
+                        * bit 0 IU support
+                        */
+                       if (target->raidVolume == 1)
+                               noQas = 0;
+               } else {
+                       factor = MPT_ASYNC;
+                       offset = 0;
+               }
+       }
+
+       if (!sdev->tagged_supported)
+               target->tflags &= ~MPT_TARGET_FLAGS_Q_YES;
+
+       /* Update tflags based on NVRAM settings. (SCSI only)
+        */
+       if (pspi_data->nvram && (pspi_data->nvram[id] != MPT_HOST_NVRAM_INVALID)) {
+               nvram = pspi_data->nvram[id];
+               nfactor = (nvram & MPT_NVRAM_SYNC_MASK) >> 8;
+
+               if (width)
+                       width = nvram & MPT_NVRAM_WIDE_DISABLE ? 0 : 1;
+
+               if (offset > 0) {
+                       /* Ensure factor is set to the
+                        * maximum of: adapter, nvram, inquiry
+                        */
+                       if (nfactor) {
+                               if (nfactor < pspi_data->minSyncFactor )
+                                       nfactor = pspi_data->minSyncFactor;
+
+                               factor = max(factor, nfactor);
+                               if (factor == MPT_ASYNC)
+                                       offset = 0;
+                       } else {
+                               offset = 0;
+                               factor = MPT_ASYNC;
+               }
+               } else {
+                       factor = MPT_ASYNC;
+               }
+       }
+
+       /* Make sure data is consistent
+        */
+       if ((!width) && (factor < MPT_ULTRA2))
+               factor = MPT_ULTRA2;
+
+       /* Save the data to the target structure.
+        */
+       target->minSyncFactor = factor;
+       target->maxOffset = offset;
+       target->maxWidth = width;
+
+       target->tflags |= MPT_TARGET_FLAGS_VALID_NEGO;
+
+       /* Disable unused features.
+        */
+       if (!width)
+               target->negoFlags |= MPT_TARGET_NO_NEGO_WIDE;
+
+       if (!offset)
+               target->negoFlags |= MPT_TARGET_NO_NEGO_SYNC;
+
+       if ( factor > MPT_ULTRA320 )
+               noQas = 0;
+
+       if (noQas && (pspi_data->noQas == 0)) {
+               pspi_data->noQas |= MPT_TARGET_NO_NEGO_QAS;
+               target->negoFlags |= MPT_TARGET_NO_NEGO_QAS;
+
+               /* Disable QAS in a mixed configuration case
+                */
+
+               ddvprintk((KERN_INFO "Disabling QAS due to noQas=%02x on id=%d!\n", noQas, id));
+       }
+}
+
+/**
+ *     mptspi_writeIOCPage4  - write IOC Page 4
+ *     @hd: Pointer to a SCSI Host Structure
+ *     @channel:
+ *     @id: write IOC Page4 for this ID & Bus
+ *
+ *     Return: -EAGAIN if unable to obtain a Message Frame
+ *             or 0 if success.
+ *
+ *     Remark: We do not wait for a return, write pages sequentially.
+ **/
+static int
+mptspi_writeIOCPage4(MPT_SCSI_HOST *hd, u8 channel , u8 id)
+{
+       MPT_ADAPTER             *ioc = hd->ioc;
+       Config_t                *pReq;
+       IOCPage4_t              *IOCPage4Ptr;
+       MPT_FRAME_HDR           *mf;
+       dma_addr_t               dataDma;
+       u16                      req_idx;
+       u32                      frameOffset;
+       u32                      flagsLength;
+       int                      ii;
+
+       /* Get a MF for this command.
+        */
+       if ((mf = mpt_get_msg_frame(ioc->DoneCtx, ioc)) == NULL) {
+               dfailprintk((MYIOC_s_WARN_FMT "writeIOCPage4 : no msg frames!\n",
+                                       ioc->name));
+               return -EAGAIN;
+       }
+
+       /* Set the request and the data pointers.
+        * Place data at end of MF.
+        */
+       pReq = (Config_t *)mf;
+
+       req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx);
+       frameOffset = ioc->req_sz - sizeof(IOCPage4_t);
+
+       /* Complete the request frame (same for all requests).
+        */
+       pReq->Action = MPI_CONFIG_ACTION_PAGE_WRITE_CURRENT;
+       pReq->Reserved = 0;
+       pReq->ChainOffset = 0;
+       pReq->Function = MPI_FUNCTION_CONFIG;
+       pReq->ExtPageLength = 0;
+       pReq->ExtPageType = 0;
+       pReq->MsgFlags = 0;
+       for (ii=0; ii < 8; ii++) {
+               pReq->Reserved2[ii] = 0;
+       }
+
+       IOCPage4Ptr = ioc->spi_data.pIocPg4;
+       dataDma = ioc->spi_data.IocPg4_dma;
+       ii = IOCPage4Ptr->ActiveSEP++;
+       IOCPage4Ptr->SEP[ii].SEPTargetID = id;
+       IOCPage4Ptr->SEP[ii].SEPBus = channel;
+       pReq->Header = IOCPage4Ptr->Header;
+       pReq->PageAddress = cpu_to_le32(id | (channel << 8 ));
+
+       /* Add a SGE to the config request.
+        */
+       flagsLength = MPT_SGE_FLAGS_SSIMPLE_WRITE |
+               (IOCPage4Ptr->Header.PageLength + ii) * 4;
+
+       mpt_add_sge((char *)&pReq->PageBufferSGE, flagsLength, dataDma);
+
+       ddvprintk((MYIOC_s_INFO_FMT
+               "writeIOCPage4: MaxSEP=%d ActiveSEP=%d id=%d bus=%d\n",
+                       ioc->name, IOCPage4Ptr->MaxSEP, IOCPage4Ptr->ActiveSEP, id, channel));
+
+       mpt_put_msg_frame(ioc->DoneCtx, ioc, mf);
+
+       return 0;
+}
+
+/**
+ *     mptspi_initTarget - Target, LUN alloc/free functionality.
+ *     @hd: Pointer to MPT_SCSI_HOST structure
+ *     @vtarget: per target private data
+ *     @sdev: SCSI device
+ *
+ *     NOTE: It's only SAFE to call this routine if data points to
+ *     sane & valid STANDARD INQUIRY data!
+ *
+ *     Allocate and initialize memory for this target.
+ *     Save inquiry data.
+ *
+ **/
+static void
+mptspi_initTarget(MPT_SCSI_HOST *hd, VirtTarget *vtarget,
+                   struct scsi_device *sdev)
+{
+
+       /* Is LUN supported? If so, upper 2 bits will be 0
+       * in first byte of inquiry data.
+       */
+       if (sdev->inq_periph_qual != 0)
+               return;
+
+       if (vtarget == NULL)
+               return;
+
+       vtarget->type = sdev->type;
+
+       if ((sdev->type == TYPE_PROCESSOR) && (hd->ioc->spi_data.Saf_Te)) {
+               /* Treat all Processors as SAF-TE if
+                * command line option is set */
+               vtarget->tflags |= MPT_TARGET_FLAGS_SAF_TE_ISSUED;
+               mptspi_writeIOCPage4(hd, vtarget->channel, vtarget->id);
+       }else if ((sdev->type == TYPE_PROCESSOR) &&
+               !(vtarget->tflags & MPT_TARGET_FLAGS_SAF_TE_ISSUED )) {
+               if (sdev->inquiry_len > 49 ) {
+                       if (sdev->inquiry[44] == 'S' &&
+                           sdev->inquiry[45] == 'A' &&
+                           sdev->inquiry[46] == 'F' &&
+                           sdev->inquiry[47] == '-' &&
+                           sdev->inquiry[48] == 'T' &&
+                           sdev->inquiry[49] == 'E' ) {
+                               vtarget->tflags |= MPT_TARGET_FLAGS_SAF_TE_ISSUED;
+                               mptspi_writeIOCPage4(hd, vtarget->channel, vtarget->id);
+                       }
+               }
+       }
+       mptspi_setTargetNegoParms(hd, vtarget, sdev);
+}
+
+/**
+ *     mptspi_is_raid - Determines whether target is belonging to volume
+ *     @hd: Pointer to a SCSI HOST structure
+ *     @id: target device id
+ *
+ *     Return:
+ *             non-zero = true
+ *             zero = false
+ *
+ */
+static int
+mptspi_is_raid(struct _MPT_SCSI_HOST *hd, u32 id)
+{
+       int i, rc = 0;
+
+       if (!hd->ioc->raid_data.pIocPg2)
+               goto out;
+
+       if (!hd->ioc->raid_data.pIocPg2->NumActiveVolumes)
+               goto out;
+       for (i=0; i < hd->ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
+               if (hd->ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID == id) {
+                       rc = 1;
+                       goto out;
+               }
+       }
+
+ out:
+       return rc;
+}
+
 static int mptspi_target_alloc(struct scsi_target *starget)
 {
        struct Scsi_Host *shost = dev_to_shost(&starget->dev);
        struct _MPT_SCSI_HOST *hd = (struct _MPT_SCSI_HOST *)shost->hostdata;
-       int ret;
+       VirtTarget              *vtarget;
 
        if (hd == NULL)
                return -ENODEV;
 
-       ret = mptscsih_target_alloc(starget);
-       if (ret)
-               return ret;
+       vtarget = kzalloc(sizeof(VirtTarget), GFP_KERNEL);
+       if (!vtarget)
+               return -ENOMEM;
+
+       vtarget->ioc_id = hd->ioc->id;
+       vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
+       vtarget->id = (u8)starget->id;
+       vtarget->channel = (u8)starget->channel;
+       vtarget->starget = starget;
+       starget->hostdata = vtarget;
+
+       if (starget->channel == 1) {
+               if (mptscsih_is_phys_disk(hd->ioc, 0, starget->id) == 0)
+                       return 0;
+               vtarget->tflags |= MPT_TARGET_FLAGS_RAID_COMPONENT;
+               /* The real channel for this device is zero */
+               vtarget->channel = 0;
+               /* The actual physdisknum (for RAID passthrough) */
+               vtarget->id = mptscsih_raid_id_to_num(hd->ioc, 0,
+                   starget->id);
+       }
 
-       /* if we're a device on virtual channel 1 and we're not part
-        * of an array, just return here (otherwise the setup below
-        * may actually affect a real physical device on channel 0 */
-       if (starget->channel == 1 &&
-           mptscsih_raid_id_to_num(hd, starget->id) < 0)
-               return 0;
+       if (starget->channel == 0 &&
+           mptspi_is_raid(hd, starget->id)) {
+               vtarget->raidVolume = 1;
+               ddvprintk((KERN_INFO
+                   "RAID Volume @ channel=%d id=%d\n", starget->channel,
+                   starget->id));
+       }
 
        if (hd->ioc->spi_data.nvram &&
            hd->ioc->spi_data.nvram[starget->id] != MPT_HOST_NVRAM_INVALID) {
@@ -132,6 +446,64 @@ static int mptspi_target_alloc(struct scsi_target *starget)
        return 0;
 }
 
+void
+mptspi_target_destroy(struct scsi_target *starget)
+{
+       if (starget->hostdata)
+               kfree(starget->hostdata);
+       starget->hostdata = NULL;
+}
+
+/**
+ *     mptspi_print_write_nego - negotiation parameters debug info that is being sent
+ *     @hd: Pointer to a SCSI HOST structure
+ *     @starget: SCSI target
+ *     @ii: negotiation parameters
+ *
+ */
+static void
+mptspi_print_write_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget, u32 ii)
+{
+       ddvprintk((MYIOC_s_INFO_FMT "id=%d Requested = 0x%08x"
+           " ( %s factor = 0x%02x @ offset = 0x%02x %s%s%s%s%s%s%s%s)\n",
+           hd->ioc->name, starget->id, ii,
+           ii & MPI_SCSIDEVPAGE0_NP_WIDE ? "Wide ": "",
+           ((ii >> 8) & 0xFF), ((ii >> 16) & 0xFF),
+           ii & MPI_SCSIDEVPAGE0_NP_IU ? "IU ": "",
+           ii & MPI_SCSIDEVPAGE0_NP_DT ? "DT ": "",
+           ii & MPI_SCSIDEVPAGE0_NP_QAS ? "QAS ": "",
+           ii & MPI_SCSIDEVPAGE0_NP_HOLD_MCS ? "HOLDMCS ": "",
+           ii & MPI_SCSIDEVPAGE0_NP_WR_FLOW ? "WRFLOW ": "",
+           ii & MPI_SCSIDEVPAGE0_NP_RD_STRM ? "RDSTRM ": "",
+           ii & MPI_SCSIDEVPAGE0_NP_RTI ? "RTI ": "",
+           ii & MPI_SCSIDEVPAGE0_NP_PCOMP_EN ? "PCOMP ": ""));
+}
+
+/**
+ *     mptspi_print_read_nego - negotiation parameters debug info that is being read
+ *     @hd: Pointer to a SCSI HOST structure
+ *     @starget: SCSI target
+ *     @ii: negotiation parameters
+ *
+ */
+static void
+mptspi_print_read_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget, u32 ii)
+{
+       ddvprintk((MYIOC_s_INFO_FMT "id=%d Read = 0x%08x"
+           " ( %s factor = 0x%02x @ offset = 0x%02x %s%s%s%s%s%s%s%s)\n",
+           hd->ioc->name, starget->id, ii,
+           ii & MPI_SCSIDEVPAGE0_NP_WIDE ? "Wide ": "",
+           ((ii >> 8) & 0xFF), ((ii >> 16) & 0xFF),
+           ii & MPI_SCSIDEVPAGE0_NP_IU ? "IU ": "",
+           ii & MPI_SCSIDEVPAGE0_NP_DT ? "DT ": "",
+           ii & MPI_SCSIDEVPAGE0_NP_QAS ? "QAS ": "",
+           ii & MPI_SCSIDEVPAGE0_NP_HOLD_MCS ? "HOLDMCS ": "",
+           ii & MPI_SCSIDEVPAGE0_NP_WR_FLOW ? "WRFLOW ": "",
+           ii & MPI_SCSIDEVPAGE0_NP_RD_STRM ? "RDSTRM ": "",
+           ii & MPI_SCSIDEVPAGE0_NP_RTI ? "RTI ": "",
+           ii & MPI_SCSIDEVPAGE0_NP_PCOMP_EN ? "PCOMP ": ""));
+}
+
 static int mptspi_read_spi_device_pg0(struct scsi_target *starget,
                             struct _CONFIG_PAGE_SCSI_DEVICE_0 *pass_pg0)
 {
@@ -147,7 +519,7 @@ static int mptspi_read_spi_device_pg0(struct scsi_target *starget,
 
        /* No SPI parameters for RAID devices */
        if (starget->channel == 0 &&
-           (hd->ioc->raid_data.isRaid & (1 << starget->id)))
+           mptspi_is_raid(hd, starget->id))
                return -1;
 
        size = ioc->spi_data.sdp0length * 4;
@@ -185,6 +557,8 @@ static int mptspi_read_spi_device_pg0(struct scsi_target *starget,
        err = 0;
        memcpy(pass_pg0, pg0, size);
 
+       mptspi_print_read_nego(hd, starget, le32_to_cpu(pg0->NegotiatedParameters));
+
  out_free:
        dma_free_coherent(&ioc->pcidev->dev, size, pg0, pg0_dma);
        return err;
@@ -233,7 +607,7 @@ static void mptspi_read_parameters(struct scsi_target *starget)
 }
 
 static int
-mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, int disk)
+mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id)
 {
        MpiRaidActionRequest_t  *pReq;
        MPT_FRAME_HDR           *mf;
@@ -253,8 +627,8 @@ mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, int disk)
        pReq->Reserved1 = 0;
        pReq->ChainOffset = 0;
        pReq->Function = MPI_FUNCTION_RAID_ACTION;
-       pReq->VolumeID = disk;
-       pReq->VolumeBus = 0;
+       pReq->VolumeID = id;
+       pReq->VolumeBus = channel;
        pReq->PhysDiskNum = 0;
        pReq->MsgFlags = 0;
        pReq->Reserved2 = 0;
@@ -263,8 +637,8 @@ mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, int disk)
        mpt_add_sge((char *)&pReq->ActionDataSGE,
                MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1);
 
-       ddvprintk((MYIOC_s_INFO_FMT "RAID Volume action %x id %d\n",
-                       hd->ioc->name, action, io->id));
+       ddvprintk((MYIOC_s_INFO_FMT "RAID Volume action=%x channel=%d id=%d\n",
+                       hd->ioc->name, pReq->Action, channel, id));
 
        hd->pLocal = NULL;
        hd->timer.expires = jiffies + HZ*10; /* 10 second timeout */
@@ -292,12 +666,12 @@ static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,
 
        /* no DV on RAID devices */
        if (sdev->channel == 0 &&
-           (hd->ioc->raid_data.isRaid & (1 << sdev->id)))
+           mptspi_is_raid(hd, sdev->id))
                return;
 
        /* If this is a piece of a RAID, then quiesce first */
        if (sdev->channel == 1 &&
-           mptscsih_quiesce_raid(hd, 1, vtarget->target_id) < 0) {
+           mptscsih_quiesce_raid(hd, 1, vtarget->channel, vtarget->id) < 0) {
                starget_printk(KERN_ERR, scsi_target(sdev),
                               "Integrated RAID quiesce failed\n");
                return;
@@ -306,7 +680,7 @@ static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,
        spi_dv_device(sdev);
 
        if (sdev->channel == 1 &&
-           mptscsih_quiesce_raid(hd, 0, vtarget->target_id) < 0)
+           mptscsih_quiesce_raid(hd, 0, vtarget->channel, vtarget->id) < 0)
                starget_printk(KERN_ERR, scsi_target(sdev),
                               "Integrated RAID resume failed\n");
 
@@ -317,54 +691,89 @@ static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd,
 
 static int mptspi_slave_alloc(struct scsi_device *sdev)
 {
-       int ret;
        MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)sdev->host->hostdata;
-       /* gcc doesn't see that all uses of this variable occur within
-        * the if() statements, so stop it from whining */
-       int physdisknum = 0;
-
-       if (sdev->channel == 1) {
-               physdisknum = mptscsih_raid_id_to_num(hd, sdev->id);
+       VirtTarget              *vtarget;
+       VirtDevice              *vdev;
+       struct scsi_target      *starget;
 
-               if (physdisknum < 0)
-                       return physdisknum;
+       if (sdev->channel == 1 &&
+               mptscsih_is_phys_disk(hd->ioc, 0, sdev->id) == 0)
+                       return -ENXIO;
+
+       vdev = kzalloc(sizeof(VirtDevice), GFP_KERNEL);
+       if (!vdev) {
+               printk(MYIOC_s_ERR_FMT "slave_alloc kmalloc(%zd) FAILED!\n",
+                               hd->ioc->name, sizeof(VirtDevice));
+               return -ENOMEM;
        }
 
-       ret = mptscsih_slave_alloc(sdev);
+       vdev->lun = sdev->lun;
+       sdev->hostdata = vdev;
 
-       if (ret)
-               return ret;
+       starget = scsi_target(sdev);
+       vtarget = starget->hostdata;
+       vdev->vtarget = vtarget;
+       vtarget->num_luns++;
 
-       if (sdev->channel == 1) {
-               VirtDevice *vdev = sdev->hostdata;
+       if (sdev->channel == 1)
                sdev->no_uld_attach = 1;
-               vdev->vtarget->tflags |= MPT_TARGET_FLAGS_RAID_COMPONENT;
-               /* The real channel for this device is zero */
-               vdev->vtarget->bus_id = 0;
-               /* The actual physdisknum (for RAID passthrough) */
-               vdev->vtarget->target_id = physdisknum;
-       }
 
        return 0;
 }
 
 static int mptspi_slave_configure(struct scsi_device *sdev)
 {
-       int ret = mptscsih_slave_configure(sdev);
        struct _MPT_SCSI_HOST *hd =
                (struct _MPT_SCSI_HOST *)sdev->host->hostdata;
+       VirtTarget *vtarget = scsi_target(sdev)->hostdata;
+       int ret = mptscsih_slave_configure(sdev);
 
        if (ret)
                return ret;
 
+       mptspi_initTarget(hd, vtarget, sdev);
+
+       ddvprintk((MYIOC_s_INFO_FMT "id=%d min_period=0x%02x"
+               " max_offset=0x%02x max_width=%d\n", hd->ioc->name,
+               sdev->id, spi_min_period(scsi_target(sdev)),
+               spi_max_offset(scsi_target(sdev)),
+               spi_max_width(scsi_target(sdev))));
+
        if ((sdev->channel == 1 ||
-            !(hd->ioc->raid_data.isRaid & (1 << sdev->id))) &&
+            !(mptspi_is_raid(hd, sdev->id))) &&
            !spi_initial_dv(sdev->sdev_target))
                mptspi_dv_device(hd, sdev);
 
        return 0;
 }
 
+static int
+mptspi_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
+{
+       struct _MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata;
+       VirtDevice      *vdev = SCpnt->device->hostdata;
+
+       if (!vdev || !vdev->vtarget) {
+               SCpnt->result = DID_NO_CONNECT << 16;
+               done(SCpnt);
+               return 0;
+       }
+
+       if (SCpnt->device->channel == 1 &&
+               mptscsih_is_phys_disk(hd->ioc, 0, SCpnt->device->id) == 0) {
+               SCpnt->result = DID_NO_CONNECT << 16;
+               done(SCpnt);
+               return 0;
+       }
+
+#ifdef MPT_DEBUG_DV
+       if (spi_dv_pending(scsi_target(SCpnt->device)))
+               scsi_print_command(SCpnt);
+#endif
+
+       return mptscsih_qcmd(SCpnt,done);
+}
+
 static void mptspi_slave_destroy(struct scsi_device *sdev)
 {
        struct scsi_target *starget = scsi_target(sdev);
@@ -392,11 +801,11 @@ static struct scsi_host_template mptspi_driver_template = {
        .proc_info                      = mptscsih_proc_info,
        .name                           = "MPT SPI Host",
        .info                           = mptscsih_info,
-       .queuecommand                   = mptscsih_qcmd,
+       .queuecommand                   = mptspi_qcmd,
        .target_alloc                   = mptspi_target_alloc,
        .slave_alloc                    = mptspi_slave_alloc,
        .slave_configure                = mptspi_slave_configure,
-       .target_destroy                 = mptscsih_target_destroy,
+       .target_destroy                 = mptspi_target_destroy,
        .slave_destroy                  = mptspi_slave_destroy,
        .change_queue_depth             = mptscsih_change_queue_depth,
        .eh_abort_handler               = mptscsih_abort,
@@ -427,7 +836,7 @@ static int mptspi_write_spi_device_pg1(struct scsi_target *starget,
 
        /* don't allow updating nego parameters on RAID devices */
        if (starget->channel == 0 &&
-           (hd->ioc->raid_data.isRaid & (1 << starget->id)))
+           mptspi_is_raid(hd, starget->id))
                return -1;
 
        size = ioc->spi_data.sdp1length * 4;
@@ -460,6 +869,8 @@ static int mptspi_write_spi_device_pg1(struct scsi_target *starget,
        pg1->Header.PageNumber = hdr.PageNumber;
        pg1->Header.PageType = hdr.PageType;
 
+       mptspi_print_write_nego(hd, starget, le32_to_cpu(pg1->RequestedParameters));
+
        if (mpt_config(ioc, &cfg)) {
                starget_printk(KERN_ERR, starget, "mpt_config failed\n");
                goto out_free;
@@ -672,9 +1083,9 @@ static void mpt_work_wrapper(struct work_struct *work)
                if (sdev->channel != 1)
                        continue;
 
-               /* The target_id is the raid PhysDiskNum, even if
+               /* The id is the raid PhysDiskNum, even if
                 * starget->id is the actual target address */
-               if(vtarget->target_id != disk)
+               if(vtarget->id != disk)
                        continue;
 
                starget_printk(KERN_INFO, vtarget->starget,
@@ -727,7 +1138,7 @@ mptspi_deny_binding(struct scsi_target *starget)
 {
        struct _MPT_SCSI_HOST *hd =
                (struct _MPT_SCSI_HOST *)dev_to_shost(starget->dev.parent)->hostdata;
-       return ((hd->ioc->raid_data.isRaid & (1 << starget->id)) &&
+       return ((mptspi_is_raid(hd, starget->id)) &&
                starget->channel == 0) ? 1 : 0;
 }
 
@@ -945,14 +1356,13 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
         * max_lun = 1 + actual last lun,
         *      see hosts.h :o(
         */
-       sh->max_id = MPT_MAX_SCSI_DEVICES;
+       sh->max_id = ioc->devices_per_bus;
 
        sh->max_lun = MPT_LAST_LUN + 1;
        /*
         * If RAID Firmware Detected, setup virtual channel
         */
-       if ((ioc->facts.ProductID & MPI_FW_HEADER_PID_PROD_MASK)
-           > MPI_FW_HEADER_PID_PROD_TARGET_SCSI)
+       if (ioc->ir_firmware)
                sh->max_channel = 1;
        else
                sh->max_channel = 0;
@@ -1009,20 +1419,6 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p\n",
                 ioc->name, hd->ScsiLookup));
 
-       /* Allocate memory for the device structures.
-        * A non-Null pointer at an offset
-        * indicates a device exists.
-        * max_id = 1 + maximum id (hosts.h)
-        */
-       hd->Targets = kcalloc(sh->max_id * (sh->max_channel + 1),
-                             sizeof(void *), GFP_ATOMIC);
-       if (!hd->Targets) {
-               error = -ENOMEM;
-               goto out_mptspi_probe;
-       }
-
-       dprintk((KERN_INFO "  vdev @ %p\n", hd->Targets));
-
        /* Clear the TM flags
         */
        hd->tmPending = 0;
index e33d446e74939df3875e619e59fde8ae638c13d0..8ba275a12773194bab96a96fcb336e7edb0d510d 100644 (file)
@@ -1111,7 +1111,7 @@ static int cfg_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations config_fops = {
+static const struct file_operations config_fops = {
        .owner = THIS_MODULE,
        .llseek = no_llseek,
        .ioctl = i2o_cfg_ioctl,
index a61cb17c5c12646cab01c5e0dc6026b5d76b6b05..06892ac2286e4e5ef37edda3b028522f3797201d 100644 (file)
@@ -1703,133 +1703,133 @@ static int i2o_seq_open_dev_name(struct inode *inode, struct file *file)
        return single_open(file, i2o_seq_show_dev_name, PDE(inode)->data);
 };
 
-static struct file_operations i2o_seq_fops_lct = {
+static const struct file_operations i2o_seq_fops_lct = {
        .open = i2o_seq_open_lct,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_hrt = {
+static const struct file_operations i2o_seq_fops_hrt = {
        .open = i2o_seq_open_hrt,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_status = {
+static const struct file_operations i2o_seq_fops_status = {
        .open = i2o_seq_open_status,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_hw = {
+static const struct file_operations i2o_seq_fops_hw = {
        .open = i2o_seq_open_hw,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_ddm_table = {
+static const struct file_operations i2o_seq_fops_ddm_table = {
        .open = i2o_seq_open_ddm_table,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_driver_store = {
+static const struct file_operations i2o_seq_fops_driver_store = {
        .open = i2o_seq_open_driver_store,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_drivers_stored = {
+static const struct file_operations i2o_seq_fops_drivers_stored = {
        .open = i2o_seq_open_drivers_stored,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_groups = {
+static const struct file_operations i2o_seq_fops_groups = {
        .open = i2o_seq_open_groups,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_phys_device = {
+static const struct file_operations i2o_seq_fops_phys_device = {
        .open = i2o_seq_open_phys_device,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_claimed = {
+static const struct file_operations i2o_seq_fops_claimed = {
        .open = i2o_seq_open_claimed,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_users = {
+static const struct file_operations i2o_seq_fops_users = {
        .open = i2o_seq_open_users,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_priv_msgs = {
+static const struct file_operations i2o_seq_fops_priv_msgs = {
        .open = i2o_seq_open_priv_msgs,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_authorized_users = {
+static const struct file_operations i2o_seq_fops_authorized_users = {
        .open = i2o_seq_open_authorized_users,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_dev_name = {
+static const struct file_operations i2o_seq_fops_dev_name = {
        .open = i2o_seq_open_dev_name,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_dev_identity = {
+static const struct file_operations i2o_seq_fops_dev_identity = {
        .open = i2o_seq_open_dev_identity,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_ddm_identity = {
+static const struct file_operations i2o_seq_fops_ddm_identity = {
        .open = i2o_seq_open_ddm_identity,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_uinfo = {
+static const struct file_operations i2o_seq_fops_uinfo = {
        .open = i2o_seq_open_uinfo,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_sgl_limits = {
+static const struct file_operations i2o_seq_fops_sgl_limits = {
        .open = i2o_seq_open_sgl_limits,
        .read = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
 };
 
-static struct file_operations i2o_seq_fops_sensors = {
+static const struct file_operations i2o_seq_fops_sensors = {
        .open = i2o_seq_open_sensors,
        .read = seq_read,
        .llseek = seq_lseek,
index bedae4ad3f74f1d916a0e2a7b555e39474244b31..80b199fa0aa9b7173fc684b1866de7c1c2e46b2f 100644 (file)
@@ -107,4 +107,19 @@ config MSI_LAPTOP
 
          If you have an MSI S270 laptop, say Y or M here.
 
+config SONY_LAPTOP
+       tristate "Sony Laptop Extras"
+       depends on X86 && ACPI
+       select BACKLIGHT_CLASS_DEVICE
+         ---help---
+         This mini-driver drives the SNC device present in the ACPI BIOS of
+         the Sony Vaio laptops.
+
+         It gives access to some extra laptop functionalities. In its current
+         form, this driver let the user set or query the screen brightness
+         through the backlight subsystem and remove/apply power to some
+         devices.
+
+         Read <file:Documentation/sony-laptop.txt> for more information.
+
 endmenu
index 35da53c409c02c8f43b0bf81539e7988c2387c08..7793ccd7904962c699340c53e8ef1cfa6389e9b1 100644 (file)
@@ -11,3 +11,4 @@ obj-$(CONFIG_LKDTM)           += lkdtm.o
 obj-$(CONFIG_TIFM_CORE)        += tifm_core.o
 obj-$(CONFIG_TIFM_7XX1)        += tifm_7xx1.o
 obj-$(CONFIG_SGI_IOC4)         += ioc4.o
+obj-$(CONFIG_SONY_LAPTOP)      += sony-laptop.o
index 861c39935f99f7127e48a6d15527e412343f6e28..e4e2b707a3531f0ae8371ac7f730ce27917f65ee 100644 (file)
@@ -1088,11 +1088,6 @@ static int __init asus_laptop_init(void)
        if (acpi_disabled)
                return -ENODEV;
 
-       if (!acpi_specific_hotkey_enabled) {
-               printk(ASUS_ERR "Using generic hotkey driver\n");
-               return -ENODEV;
-       }
-
        result = acpi_bus_register_driver(&asus_hotk_driver);
        if (result < 0)
                return result;
index 11a801be71c88f9b39cd04c41336fdf1c25d6ee0..ca86f113f36af4a5494e6256d6ae70de71e9eeaf 100644 (file)
@@ -169,7 +169,7 @@ static struct platform_driver hdpu_cpustate_driver = {
 /*
  *     The various file operations we support.
  */
-static struct file_operations cpustate_fops = {
+static const struct file_operations cpustate_fops = {
       owner:THIS_MODULE,
       open:cpustate_open,
       release:cpustate_release,
index ea9d5f233c83037568350a82224d5870bda6a7ba..6a51e99a8079995adfb9183a0af21108eb0705ff 100644 (file)
@@ -72,11 +72,9 @@ static int hdpu_nexus_probe(struct platform_device *pdev)
                printk("Could not map slot id\n");
        hdpu_slot_id = create_proc_entry("sky_slot_id", 0666, &proc_root);
        hdpu_slot_id->read_proc = hdpu_slot_id_read;
-       hdpu_slot_id->nlink = 1;
 
        hdpu_chassis_id = create_proc_entry("sky_chassis_id", 0666, &proc_root);
        hdpu_chassis_id->read_proc = hdpu_chassis_id_read;
-       hdpu_chassis_id->nlink = 1;
        return 0;
 }
 
index b99dc507de2e4fffd7f2e19e6084cdd7b52b8694..c436d3de8b8b129d5efdf329fd5934df4a72ab86 100644 (file)
@@ -156,7 +156,7 @@ static struct inode *ibmasmfs_make_inode(struct super_block *sb, int mode)
 static struct dentry *ibmasmfs_create_file (struct super_block *sb,
                        struct dentry *parent,
                        const char *name,
-                       struct file_operations *fops,
+                       const struct file_operations *fops,
                        void *data,
                        int mode)
 {
@@ -581,28 +581,28 @@ static ssize_t remote_settings_file_write(struct file *file, const char __user *
        return count;
 }
 
-static struct file_operations command_fops = {
+static const struct file_operations command_fops = {
        .open =         command_file_open,
        .release =      command_file_close,
        .read =         command_file_read,
        .write =        command_file_write,
 };
 
-static struct file_operations event_fops = {
+static const struct file_operations event_fops = {
        .open =         event_file_open,
        .release =      event_file_close,
        .read =         event_file_read,
        .write =        event_file_write,
 };
 
-static struct file_operations r_heartbeat_fops = {
+static const struct file_operations r_heartbeat_fops = {
        .open =         r_heartbeat_file_open,
        .release =      r_heartbeat_file_close,
        .read =         r_heartbeat_file_read,
        .write =        r_heartbeat_file_write,
 };
 
-static struct file_operations remote_settings_fops = {
+static const struct file_operations remote_settings_fops = {
        .open =         remote_settings_file_open,
        .release =      remote_settings_file_close,
        .read =         remote_settings_file_read,
index b995a15b7526a43d12439ce955fb91579d4cff72..6a5a05d1f3923d81ee54ce2df63a0e2fca7f4d37 100644 (file)
@@ -309,7 +309,7 @@ ioc4_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
                ret = -ENODEV;
                goto out_pci;
        }
-       if (!request_region(idd->idd_bar0, sizeof(struct ioc4_misc_regs),
+       if (!request_mem_region(idd->idd_bar0, sizeof(struct ioc4_misc_regs),
                            "ioc4_misc")) {
                printk(KERN_WARNING
                       "%s: Unable to request IOC4 misc region "
@@ -379,7 +379,7 @@ ioc4_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
        return 0;
 
 out_misc_region:
-       release_region(idd->idd_bar0, sizeof(struct ioc4_misc_regs));
+       release_mem_region(idd->idd_bar0, sizeof(struct ioc4_misc_regs));
 out_pci:
        kfree(idd);
 out_idd:
@@ -418,7 +418,7 @@ ioc4_remove(struct pci_dev *pdev)
                       "Device removal may be incomplete.\n",
                       __FUNCTION__, pci_name(idd->idd_pdev));
        }
-       release_region(idd->idd_bar0, sizeof(struct ioc4_misc_regs));
+       release_mem_region(idd->idd_bar0, sizeof(struct ioc4_misc_regs));
 
        /* Disable IOC4 and relinquish */
        pci_disable_device(pdev);
diff --git a/drivers/misc/sony-laptop.c b/drivers/misc/sony-laptop.c
new file mode 100644 (file)
index 0000000..cabbed0
--- /dev/null
@@ -0,0 +1,562 @@
+/*
+ * ACPI Sony Notebook Control Driver (SNC)
+ *
+ * Copyright (C) 2004-2005 Stelian Pop <stelian@popies.net>
+ * Copyright (C) 2007 Mattia Dongili <malattia@linux.it>
+ *
+ * Parts of this driver inspired from asus_acpi.c and ibm_acpi.c
+ * which are copyrighted by their respective authors.
+ *
+ * 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/moduleparam.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/backlight.h>
+#include <linux/platform_device.h>
+#include <linux/err.h>
+#include <acpi/acpi_drivers.h>
+#include <acpi/acpi_bus.h>
+#include <asm/uaccess.h>
+
+#define ACPI_SNC_CLASS         "sony"
+#define ACPI_SNC_HID           "SNY5001"
+#define ACPI_SNC_DRIVER_NAME   "ACPI Sony Notebook Control Driver v0.4"
+
+/* the device uses 1-based values, while the backlight subsystem uses
+   0-based values */
+#define SONY_MAX_BRIGHTNESS    8
+
+#define LOG_PFX                        KERN_WARNING "sony-laptop: "
+
+MODULE_AUTHOR("Stelian Pop, Mattia Dongili");
+MODULE_DESCRIPTION(ACPI_SNC_DRIVER_NAME);
+MODULE_LICENSE("GPL");
+
+static int debug;
+module_param(debug, int, 0);
+MODULE_PARM_DESC(debug, "set this to 1 (and RTFM) if you want to help "
+                "the development of this driver");
+
+static ssize_t sony_acpi_show(struct device *, struct device_attribute *,
+                             char *);
+static ssize_t sony_acpi_store(struct device *, struct device_attribute *,
+                              const char *, size_t);
+static int boolean_validate(const int, const int);
+static int brightness_default_validate(const int, const int);
+
+#define SNC_VALIDATE_IN                0
+#define SNC_VALIDATE_OUT       1
+
+struct sony_acpi_value {
+       char *name;             /* name of the entry */
+       char **acpiget;         /* names of the ACPI get function */
+       char **acpiset;         /* names of the ACPI set function */
+       int (*validate)(const int, const int);  /* input/output validation */
+       int value;              /* current setting */
+       int valid;              /* Has ever been set */
+       int debug;              /* active only in debug mode ? */
+       struct device_attribute devattr;        /* sysfs atribute */
+};
+
+#define HANDLE_NAMES(_name, _values...) \
+       static char *snc_##_name[] = { _values, NULL }
+
+#define SONY_ACPI_VALUE(_name, _getters, _setters, _validate, _debug) \
+       { \
+               .name           = __stringify(_name), \
+               .acpiget        = _getters, \
+               .acpiset        = _setters, \
+               .validate       = _validate, \
+               .debug          = _debug, \
+               .devattr        = __ATTR(_name, 0, sony_acpi_show, sony_acpi_store), \
+       }
+
+#define SONY_ACPI_VALUE_NULL   { .name = NULL }
+
+HANDLE_NAMES(fnkey_get, "GHKE");
+
+HANDLE_NAMES(brightness_def_get, "GPBR");
+HANDLE_NAMES(brightness_def_set, "SPBR");
+
+HANDLE_NAMES(cdpower_get, "GCDP");
+HANDLE_NAMES(cdpower_set, "SCDP", "CDPW");
+
+HANDLE_NAMES(audiopower_get, "GAZP");
+HANDLE_NAMES(audiopower_set, "AZPW");
+
+HANDLE_NAMES(lanpower_get, "GLNP");
+HANDLE_NAMES(lanpower_set, "LNPW");
+
+HANDLE_NAMES(PID_get, "GPID");
+
+HANDLE_NAMES(CTR_get, "GCTR");
+HANDLE_NAMES(CTR_set, "SCTR");
+
+HANDLE_NAMES(PCR_get, "GPCR");
+HANDLE_NAMES(PCR_set, "SPCR");
+
+HANDLE_NAMES(CMI_get, "GCMI");
+HANDLE_NAMES(CMI_set, "SCMI");
+
+static struct sony_acpi_value sony_acpi_values[] = {
+       SONY_ACPI_VALUE(brightness_default, snc_brightness_def_get,
+                       snc_brightness_def_set, brightness_default_validate, 0),
+       SONY_ACPI_VALUE(fnkey, snc_fnkey_get, NULL, NULL, 0),
+       SONY_ACPI_VALUE(cdpower, snc_cdpower_get, snc_cdpower_set, boolean_validate, 0),
+       SONY_ACPI_VALUE(audiopower, snc_audiopower_get, snc_audiopower_set,
+                       boolean_validate, 0),
+       SONY_ACPI_VALUE(lanpower, snc_lanpower_get, snc_lanpower_set,
+                       boolean_validate, 1),
+       /* unknown methods */
+       SONY_ACPI_VALUE(PID, snc_PID_get, NULL, NULL, 1),
+       SONY_ACPI_VALUE(CTR, snc_CTR_get, snc_CTR_set, NULL, 1),
+       SONY_ACPI_VALUE(PCR, snc_PCR_get, snc_PCR_set, NULL, 1),
+       SONY_ACPI_VALUE(CMI, snc_CMI_get, snc_CMI_set, NULL, 1),
+       SONY_ACPI_VALUE_NULL
+};
+
+static acpi_handle sony_acpi_handle;
+static struct acpi_device *sony_acpi_acpi_device = NULL;
+
+/*
+ * acpi_evaluate_object wrappers
+ */
+static int acpi_callgetfunc(acpi_handle handle, char *name, int *result)
+{
+       struct acpi_buffer output;
+       union acpi_object out_obj;
+       acpi_status status;
+
+       output.length = sizeof(out_obj);
+       output.pointer = &out_obj;
+
+       status = acpi_evaluate_object(handle, name, NULL, &output);
+       if ((status == AE_OK) && (out_obj.type == ACPI_TYPE_INTEGER)) {
+               *result = out_obj.integer.value;
+               return 0;
+       }
+
+       printk(LOG_PFX "acpi_callreadfunc failed\n");
+
+       return -1;
+}
+
+static int acpi_callsetfunc(acpi_handle handle, char *name, int value,
+                           int *result)
+{
+       struct acpi_object_list params;
+       union acpi_object in_obj;
+       struct acpi_buffer output;
+       union acpi_object out_obj;
+       acpi_status status;
+
+       params.count = 1;
+       params.pointer = &in_obj;
+       in_obj.type = ACPI_TYPE_INTEGER;
+       in_obj.integer.value = value;
+
+       output.length = sizeof(out_obj);
+       output.pointer = &out_obj;
+
+       status = acpi_evaluate_object(handle, name, &params, &output);
+       if (status == AE_OK) {
+               if (result != NULL) {
+                       if (out_obj.type != ACPI_TYPE_INTEGER) {
+                               printk(LOG_PFX "acpi_evaluate_object bad "
+                                      "return type\n");
+                               return -1;
+                       }
+                       *result = out_obj.integer.value;
+               }
+               return 0;
+       }
+
+       printk(LOG_PFX "acpi_evaluate_object failed\n");
+
+       return -1;
+}
+
+/*
+ * sony_acpi_values input/output validate functions
+ */
+
+/* brightness_default_validate:
+ *
+ * manipulate input output values to keep consistency with the
+ * backlight framework for which brightness values are 0-based.
+ */
+static int brightness_default_validate(const int direction, const int value)
+{
+       switch (direction) {
+               case SNC_VALIDATE_OUT:
+                       return value - 1;
+               case SNC_VALIDATE_IN:
+                       if (value >= 0 && value < SONY_MAX_BRIGHTNESS)
+                               return value + 1;
+       }
+       return -EINVAL;
+}
+
+/* boolean_validate:
+ *
+ * on input validate boolean values 0/1, on output just pass the
+ * received value.
+ */
+static int boolean_validate(const int direction, const int value)
+{
+       if (direction == SNC_VALIDATE_IN) {
+               if (value != 0 && value != 1)
+                       return -EINVAL;
+       }
+       return value;
+}
+
+/*
+ * Sysfs show/store common to all sony_acpi_values
+ */
+static ssize_t sony_acpi_show(struct device *dev, struct device_attribute *attr,
+                             char *buffer)
+{
+       int value;
+       struct sony_acpi_value *item =
+           container_of(attr, struct sony_acpi_value, devattr);
+
+       if (!*item->acpiget)
+               return -EIO;
+
+       if (acpi_callgetfunc(sony_acpi_handle, *item->acpiget, &value) < 0)
+               return -EIO;
+
+       if (item->validate)
+               value = item->validate(SNC_VALIDATE_OUT, value);
+
+       return snprintf(buffer, PAGE_SIZE, "%d\n", value);
+}
+
+static ssize_t sony_acpi_store(struct device *dev,
+                              struct device_attribute *attr,
+                              const char *buffer, size_t count)
+{
+       int value;
+       struct sony_acpi_value *item =
+           container_of(attr, struct sony_acpi_value, devattr);
+
+       if (!item->acpiset)
+               return -EIO;
+
+       if (count > 31)
+               return -EINVAL;
+
+       value = simple_strtoul(buffer, NULL, 10);
+
+       if (item->validate)
+               value = item->validate(SNC_VALIDATE_IN, value);
+
+       if (value < 0)
+               return value;
+
+       if (acpi_callsetfunc(sony_acpi_handle, *item->acpiset, value, NULL) < 0)
+               return -EIO;
+       item->value = value;
+       item->valid = 1;
+       return count;
+}
+
+/*
+ * Platform device
+ */
+static struct platform_driver sncpf_driver = {
+       .driver = {
+                  .name = "sony-laptop",
+                  .owner = THIS_MODULE,
+                  }
+};
+static struct platform_device *sncpf_device;
+
+static int sony_snc_pf_add(void)
+{
+       acpi_handle handle;
+       struct sony_acpi_value *item;
+       int ret = 0;
+
+       ret = platform_driver_register(&sncpf_driver);
+       if (ret)
+               goto out;
+
+       sncpf_device = platform_device_alloc("sony-laptop", -1);
+       if (!sncpf_device) {
+               ret = -ENOMEM;
+               goto out_platform_registered;
+       }
+
+       ret = platform_device_add(sncpf_device);
+       if (ret)
+               goto out_platform_alloced;
+
+       for (item = sony_acpi_values; item->name; ++item) {
+
+               if (!debug && item->debug)
+                       continue;
+
+               /* find the available acpiget as described in the DSDT */
+               for (; item->acpiget && *item->acpiget; ++item->acpiget) {
+                       if (ACPI_SUCCESS(acpi_get_handle(sony_acpi_handle,
+                                                        *item->acpiget,
+                                                        &handle))) {
+                               if (debug)
+                                       printk(LOG_PFX "Found %s getter: %s\n",
+                                              item->name, *item->acpiget);
+                               item->devattr.attr.mode |= S_IRUGO;
+                               break;
+                       }
+               }
+
+               /* find the available acpiset as described in the DSDT */
+               for (; item->acpiset && *item->acpiset; ++item->acpiset) {
+                       if (ACPI_SUCCESS(acpi_get_handle(sony_acpi_handle,
+                                                        *item->acpiset,
+                                                        &handle))) {
+                               if (debug)
+                                       printk(LOG_PFX "Found %s setter: %s\n",
+                                              item->name, *item->acpiset);
+                               item->devattr.attr.mode |= S_IWUSR;
+                               break;
+                       }
+               }
+
+               if (item->devattr.attr.mode != 0) {
+                       ret =
+                           device_create_file(&sncpf_device->dev,
+                                              &item->devattr);
+                       if (ret)
+                               goto out_sysfs;
+               }
+       }
+
+       return 0;
+
+      out_sysfs:
+       for (item = sony_acpi_values; item->name; ++item) {
+               device_remove_file(&sncpf_device->dev, &item->devattr);
+       }
+       platform_device_del(sncpf_device);
+      out_platform_alloced:
+       platform_device_put(sncpf_device);
+      out_platform_registered:
+       platform_driver_unregister(&sncpf_driver);
+      out:
+       return ret;
+}
+
+static void sony_snc_pf_remove(void)
+{
+       struct sony_acpi_value *item;
+
+       for (item = sony_acpi_values; item->name; ++item) {
+               device_remove_file(&sncpf_device->dev, &item->devattr);
+       }
+
+       platform_device_del(sncpf_device);
+       platform_device_put(sncpf_device);
+       platform_driver_unregister(&sncpf_driver);
+}
+
+/*
+ * Backlight device
+ */
+static int sony_backlight_update_status(struct backlight_device *bd)
+{
+       return acpi_callsetfunc(sony_acpi_handle, "SBRT",
+                               bd->props->brightness + 1, NULL);
+}
+
+static int sony_backlight_get_brightness(struct backlight_device *bd)
+{
+       int value;
+
+       if (acpi_callgetfunc(sony_acpi_handle, "GBRT", &value))
+               return 0;
+       /* brightness levels are 1-based, while backlight ones are 0-based */
+       return value - 1;
+}
+
+static struct backlight_device *sony_backlight_device;
+static struct backlight_properties sony_backlight_properties = {
+       .owner = THIS_MODULE,
+       .update_status = sony_backlight_update_status,
+       .get_brightness = sony_backlight_get_brightness,
+       .max_brightness = SONY_MAX_BRIGHTNESS - 1,
+};
+
+/*
+ * ACPI callbacks
+ */
+static void sony_acpi_notify(acpi_handle handle, u32 event, void *data)
+{
+       if (debug)
+               printk(LOG_PFX "sony_acpi_notify, event: %d\n", event);
+       acpi_bus_generate_event(sony_acpi_acpi_device, 1, event);
+}
+
+static acpi_status sony_walk_callback(acpi_handle handle, u32 level,
+                                     void *context, void **return_value)
+{
+       struct acpi_namespace_node *node;
+       union acpi_operand_object *operand;
+
+       node = (struct acpi_namespace_node *)handle;
+       operand = (union acpi_operand_object *)node->object;
+
+       printk(LOG_PFX "method: name: %4.4s, args %X\n", node->name.ascii,
+              (u32) operand->method.param_count);
+
+       return AE_OK;
+}
+
+/*
+ * ACPI device
+ */
+static int sony_acpi_resume(struct acpi_device *device)
+{
+       struct sony_acpi_value *item;
+
+       for (item = sony_acpi_values; item->name; item++) {
+               int ret;
+
+               if (!item->valid)
+                       continue;
+               ret = acpi_callsetfunc(sony_acpi_handle, *item->acpiset,
+                                      item->value, NULL);
+               if (ret < 0) {
+                       printk("%s: %d\n", __FUNCTION__, ret);
+                       break;
+               }
+       }
+       return 0;
+}
+
+static int sony_acpi_add(struct acpi_device *device)
+{
+       acpi_status status;
+       int result;
+       acpi_handle handle;
+
+       sony_acpi_acpi_device = device;
+
+       sony_acpi_handle = device->handle;
+
+       if (debug) {
+               status = acpi_walk_namespace(ACPI_TYPE_METHOD, sony_acpi_handle,
+                                            1, sony_walk_callback, NULL, NULL);
+               if (ACPI_FAILURE(status)) {
+                       printk(LOG_PFX "unable to walk acpi resources\n");
+                       result = -ENODEV;
+                       goto outwalk;
+               }
+       }
+
+       status = acpi_install_notify_handler(sony_acpi_handle,
+                                            ACPI_DEVICE_NOTIFY,
+                                            sony_acpi_notify, NULL);
+       if (ACPI_FAILURE(status)) {
+               printk(LOG_PFX "unable to install notify handler\n");
+               result = -ENODEV;
+               goto outwalk;
+       }
+
+       if (ACPI_SUCCESS(acpi_get_handle(sony_acpi_handle, "GBRT", &handle))) {
+               sony_backlight_device = backlight_device_register("sony", NULL,
+                                                                 NULL,
+                                                                 &sony_backlight_properties);
+
+               if (IS_ERR(sony_backlight_device)) {
+                       printk(LOG_PFX "unable to register backlight device\n");
+                       sony_backlight_device = NULL;
+               } else
+                       sony_backlight_properties.brightness =
+                           sony_backlight_get_brightness
+                           (sony_backlight_device);
+       }
+
+       if (sony_snc_pf_add())
+               goto outbacklight;
+
+       printk(KERN_INFO ACPI_SNC_DRIVER_NAME " successfully installed\n");
+
+       return 0;
+
+      outbacklight:
+       if (sony_backlight_device)
+               backlight_device_unregister(sony_backlight_device);
+
+       status = acpi_remove_notify_handler(sony_acpi_handle,
+                                           ACPI_DEVICE_NOTIFY,
+                                           sony_acpi_notify);
+       if (ACPI_FAILURE(status))
+               printk(LOG_PFX "unable to remove notify handler\n");
+      outwalk:
+       return result;
+}
+
+static int sony_acpi_remove(struct acpi_device *device, int type)
+{
+       acpi_status status;
+
+       if (sony_backlight_device)
+               backlight_device_unregister(sony_backlight_device);
+
+       sony_acpi_acpi_device = NULL;
+
+       status = acpi_remove_notify_handler(sony_acpi_handle,
+                                           ACPI_DEVICE_NOTIFY,
+                                           sony_acpi_notify);
+       if (ACPI_FAILURE(status))
+               printk(LOG_PFX "unable to remove notify handler\n");
+
+       sony_snc_pf_remove();
+
+       printk(KERN_INFO ACPI_SNC_DRIVER_NAME " successfully removed\n");
+
+       return 0;
+}
+
+static struct acpi_driver sony_acpi_driver = {
+       .name = ACPI_SNC_DRIVER_NAME,
+       .class = ACPI_SNC_CLASS,
+       .ids = ACPI_SNC_HID,
+       .ops = {
+               .add = sony_acpi_add,
+               .remove = sony_acpi_remove,
+               .resume = sony_acpi_resume,
+               },
+};
+
+static int __init sony_acpi_init(void)
+{
+       return acpi_bus_register_driver(&sony_acpi_driver);
+}
+
+static void __exit sony_acpi_exit(void)
+{
+       acpi_bus_unregister_driver(&sony_acpi_driver);
+}
+
+module_init(sony_acpi_init);
+module_exit(sony_acpi_exit);
index e21e490fedb04dc40b215a8715e93a9ffdb1cc7c..bc60e2fc3c2cc8e6342a74403cdd2b5687b7c8a0 100644 (file)
@@ -367,7 +367,7 @@ static int tifm_7xx1_probe(struct pci_dev *dev,
        if (!fm->addr)
                goto err_out_free;
 
-       rc = request_irq(dev->irq, tifm_7xx1_isr, SA_SHIRQ, DRIVER_NAME, fm);
+       rc = request_irq(dev->irq, tifm_7xx1_isr, IRQF_SHARED, DRIVER_NAME, fm);
        if (rc)
                goto err_out_unmap;
 
index 05ba8ace70e7801071a2a614ad4e9d74d13f1502..86439a0bb271c2e815bd940e21d19e67bcaaf572 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 
-#include <linux/sched.h>
 #include <linux/kernel.h>
 #include <linux/fs.h>
 #include <linux/errno.h>
index 4bf1fea5e2c405acccfa1b7ebbc069a2d323a787..7522f76b15ec48db85c9c3091dfb4a933d2ca3ab 100644 (file)
@@ -22,9 +22,6 @@
 #include "sdhci.h"
 
 #define DRIVER_NAME "sdhci"
-#define DRIVER_VERSION "0.12"
-
-#define BUGMAIL "<sdhci-devel@list.drzeus.cx>"
 
 #define DBG(f, x...) \
        pr_debug(DRIVER_NAME " [%s()]: " f, __func__,## x)
@@ -154,8 +151,7 @@ static void sdhci_reset(struct sdhci_host *host, u8 mask)
        /* hw clears the bit when it's done */
        while (readb(host->ioaddr + SDHCI_SOFTWARE_RESET) & mask) {
                if (timeout == 0) {
-                       printk(KERN_ERR "%s: Reset 0x%x never completed. "
-                               "Please report this to " BUGMAIL ".\n",
+                       printk(KERN_ERR "%s: Reset 0x%x never completed.\n",
                                mmc_hostname(host->mmc), (int)mask);
                        sdhci_dumpregs(host);
                        return;
@@ -474,12 +470,11 @@ static void sdhci_finish_data(struct sdhci_host *host)
 
        if ((data->error == MMC_ERR_NONE) && blocks) {
                printk(KERN_ERR "%s: Controller signalled completion even "
-                       "though there were blocks left. Please report this "
-                       "to " BUGMAIL ".\n", mmc_hostname(host->mmc));
+                       "though there were blocks left.\n",
+                       mmc_hostname(host->mmc));
                data->error = MMC_ERR_FAILED;
        } else if (host->size != 0) {
-               printk(KERN_ERR "%s: %d bytes were left untransferred. "
-                       "Please report this to " BUGMAIL ".\n",
+               printk(KERN_ERR "%s: %d bytes were left untransferred.\n",
                        mmc_hostname(host->mmc), host->size);
                data->error = MMC_ERR_FAILED;
        }
@@ -526,8 +521,7 @@ static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)
        while (readl(host->ioaddr + SDHCI_PRESENT_STATE) & mask) {
                if (timeout == 0) {
                        printk(KERN_ERR "%s: Controller never released "
-                               "inhibit bit(s). Please report this to "
-                               BUGMAIL ".\n", mmc_hostname(host->mmc));
+                               "inhibit bit(s).\n", mmc_hostname(host->mmc));
                        sdhci_dumpregs(host);
                        cmd->error = MMC_ERR_FAILED;
                        tasklet_schedule(&host->finish_tasklet);
@@ -548,8 +542,7 @@ static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)
        sdhci_set_transfer_mode(host, cmd->data);
 
        if ((cmd->flags & MMC_RSP_136) && (cmd->flags & MMC_RSP_BUSY)) {
-               printk(KERN_ERR "%s: Unsupported response type! "
-                       "Please report this to " BUGMAIL ".\n",
+               printk(KERN_ERR "%s: Unsupported response type!\n",
                        mmc_hostname(host->mmc));
                cmd->error = MMC_ERR_INVALID;
                tasklet_schedule(&host->finish_tasklet);
@@ -647,9 +640,8 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
        while (!((clk = readw(host->ioaddr + SDHCI_CLOCK_CONTROL))
                & SDHCI_CLOCK_INT_STABLE)) {
                if (timeout == 0) {
-                       printk(KERN_ERR "%s: Internal clock never stabilised. "
-                               "Please report this to " BUGMAIL ".\n",
-                               mmc_hostname(host->mmc));
+                       printk(KERN_ERR "%s: Internal clock never "
+                               "stabilised.\n", mmc_hostname(host->mmc));
                        sdhci_dumpregs(host);
                        return;
                }
@@ -899,9 +891,8 @@ static void sdhci_timeout_timer(unsigned long data)
        spin_lock_irqsave(&host->lock, flags);
 
        if (host->mrq) {
-               printk(KERN_ERR "%s: Timeout waiting for hardware interrupt. "
-                       "Please report this to " BUGMAIL ".\n",
-                       mmc_hostname(host->mmc));
+               printk(KERN_ERR "%s: Timeout waiting for hardware "
+                       "interrupt.\n", mmc_hostname(host->mmc));
                sdhci_dumpregs(host);
 
                if (host->data) {
@@ -935,8 +926,6 @@ static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask)
                printk(KERN_ERR "%s: Got command interrupt even though no "
                        "command operation was in progress.\n",
                        mmc_hostname(host->mmc));
-               printk(KERN_ERR "%s: Please report this to " BUGMAIL ".\n",
-                       mmc_hostname(host->mmc));
                sdhci_dumpregs(host);
                return;
        }
@@ -972,8 +961,6 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
                printk(KERN_ERR "%s: Got data interrupt even though no "
                        "data operation was in progress.\n",
                        mmc_hostname(host->mmc));
-               printk(KERN_ERR "%s: Please report this to " BUGMAIL ".\n",
-                       mmc_hostname(host->mmc));
                sdhci_dumpregs(host);
 
                return;
@@ -1045,8 +1032,7 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id)
        intmask &= SDHCI_INT_BUS_POWER;
 
        if (intmask) {
-               printk(KERN_ERR "%s: Unexpected interrupt 0x%08x. Please "
-                       "report this to " BUGMAIL ".\n",
+               printk(KERN_ERR "%s: Unexpected interrupt 0x%08x.\n",
                        mmc_hostname(host->mmc), intmask);
                sdhci_dumpregs(host);
 
@@ -1528,8 +1514,7 @@ static struct pci_driver sdhci_driver = {
 static int __init sdhci_drv_init(void)
 {
        printk(KERN_INFO DRIVER_NAME
-               ": Secure Digital Host Controller Interface driver, "
-               DRIVER_VERSION "\n");
+               ": Secure Digital Host Controller Interface driver\n");
        printk(KERN_INFO DRIVER_NAME ": Copyright(c) Pierre Ossman\n");
 
        return pci_register_driver(&sdhci_driver);
@@ -1551,7 +1536,6 @@ module_param(debug_quirks, uint, 0444);
 
 MODULE_AUTHOR("Pierre Ossman <drzeus@drzeus.cx>");
 MODULE_DESCRIPTION("Secure Digital Host Controller Interface driver");
-MODULE_VERSION(DRIVER_VERSION);
 MODULE_LICENSE("GPL");
 
 MODULE_PARM_DESC(debug_nodma, "Forcefully disable DMA transfers. (default 0)");
index e65f8a0a9349c4145711938a9a6a3de5e158413e..0581d09c58fc6424a075cf36b9ad25560bbe872c 100644 (file)
@@ -36,8 +36,8 @@ module_param(fixed_timeout, bool, 0644);
 #define TIFM_MMCSD_INAB       0x0080   /* abort / initialize command */
 #define TIFM_MMCSD_READ       0x8000
 
-#define TIFM_MMCSD_DATAMASK   0x001d   /* set bits: EOFB, BRS, CB, EOC */
-#define TIFM_MMCSD_ERRMASK    0x41e0   /* set bits: CERR, CCRC, CTO, DCRC, DTO */
+#define TIFM_MMCSD_DATAMASK   0x401d   /* set bits: CERR, EOFB, BRS, CB, EOC */
+#define TIFM_MMCSD_ERRMASK    0x01e0   /* set bits: CCRC, CTO, DCRC, DTO */
 #define TIFM_MMCSD_EOC        0x0001   /* end of command phase  */
 #define TIFM_MMCSD_CB         0x0004   /* card enter busy state */
 #define TIFM_MMCSD_BRS        0x0008   /* block received/sent   */
@@ -242,7 +242,7 @@ change_state:
        case IDLE:
                return;
        case CMD:
-               if (host_status & TIFM_MMCSD_EOC) {
+               if (host_status & (TIFM_MMCSD_EOC | TIFM_MMCSD_CERR)) {
                        tifm_sd_fetch_resp(cmd, sock);
                        if (cmd->data) {
                                host->state = BRS;
@@ -341,10 +341,7 @@ static void tifm_sd_signal_irq(struct tifm_dev *sock,
                        goto done;
 
                if (host_status & TIFM_MMCSD_ERRMASK) {
-                       if (host_status & TIFM_MMCSD_CERR)
-                               error_code = MMC_ERR_FAILED;
-                       else if (host_status
-                                & (TIFM_MMCSD_CTO | TIFM_MMCSD_DTO))
+                       if (host_status & (TIFM_MMCSD_CTO | TIFM_MMCSD_DTO))
                                error_code = MMC_ERR_TIMEOUT;
                        else if (host_status
                                 & (TIFM_MMCSD_CCRC | TIFM_MMCSD_DCRC))
index a44d8777ab9f21011074a9beffa4e718d7a34acf..05ccfc43168fb2c173305bcb003c765e6eafd24a 100644 (file)
@@ -42,7 +42,6 @@
 #include "wbsd.h"
 
 #define DRIVER_NAME "wbsd"
-#define DRIVER_VERSION "1.6"
 
 #define DBG(x...) \
        pr_debug(DRIVER_NAME ": " x)
@@ -344,7 +343,6 @@ static inline void wbsd_dma_to_sg(struct wbsd_host *host, struct mmc_data *data)
                        memcpy(sgbuf, dmabuf, size);
                else
                        memcpy(sgbuf, dmabuf, sg[i].length);
-               kunmap_atomic(sgbuf, KM_BIO_SRC_IRQ);
                dmabuf += sg[i].length;
 
                if (size < sg[i].length)
@@ -2101,8 +2099,7 @@ static int __init wbsd_drv_init(void)
        int result;
 
        printk(KERN_INFO DRIVER_NAME
-               ": Winbond W83L51xD SD/MMC card interface driver, "
-               DRIVER_VERSION "\n");
+               ": Winbond W83L51xD SD/MMC card interface driver\n");
        printk(KERN_INFO DRIVER_NAME ": Copyright(c) Pierre Ossman\n");
 
 #ifdef CONFIG_PNP
@@ -2166,7 +2163,6 @@ 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);
 
 #ifdef CONFIG_PNP
 MODULE_PARM_DESC(nopnp, "Scan for device instead of relying on PNP. (default 0)");
index d8e7a026ba5ae945a83da21485f4a34dac71ef2d..2e51496c248e0b718273ec3715d5c16b2c689ff8 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <asm/io.h>
 #include <asm/byteorder.h>
 
index 6d917a4daa9db24b4d9e7cb23281e1842cef9283..f9f2ce7806b0b3edc21a5d6763736f56329a4ee8 100644 (file)
@@ -278,7 +278,8 @@ static void block2mtd_free_device(struct block2mtd_dev *dev)
        kfree(dev->mtd.name);
 
        if (dev->blkdev) {
-               invalidate_inode_pages(dev->blkdev->bd_inode->i_mapping);
+               invalidate_mapping_pages(dev->blkdev->bd_inode->i_mapping,
+                                       0, -1);
                close_bdev_excl(dev->blkdev);
        }
 
index 0e2a9326f717da9f18213b2032195e0529b7c132..fe71a12c26279b53dffeb5e9e13aeb91a02cc3da 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/pci.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/types.h>
 #include <linux/bitops.h>
index 92dbb47f2ac35597e5e4d18cc39bd079eb6dc0ed..ba4db686285af6ef6406007b44da1c2347fb0aa1 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/pci.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/types.h>
 #include <linux/bitops.h>
index cd3db72bef96ae92cfd9a69ee688d20d5759bc33..52b5d638077faa69a23113640472baed2c8fa7ca 100644 (file)
@@ -32,7 +32,6 @@
 #include <linux/pci.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/types.h>
 
index 354e1657cc26aae7e33e17439d6be18e85107548..a4873ab84e6bcc9fd73ef1cf8c17353e9b474b25 100644 (file)
@@ -86,7 +86,6 @@
 #include <linux/module.h>
 #include <asm/uaccess.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/ptrace.h>
 #include <linux/slab.h>
index 5f49248a48564398a82239c569bf860b5d431da0..d293add1857cfba358a033ff0247e7c755ef42c1 100644 (file)
@@ -35,7 +35,6 @@
 #include <asm/uaccess.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/ptrace.h>
 #include <linux/slab.h>
 #include <linux/string.h>
index 24235d4f1d23219255da945d14afe2493a742ef6..c815d0f38577281f3b033570d2ac1607a361e15f 100644 (file)
@@ -61,7 +61,6 @@
 /*#define PSYCHO_DEBUG */
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/ptrace.h>
 #include <linux/slab.h>
 #include <linux/string.h>
index 8f6006f1a519480c3fbba9581294b901bc2571b9..acf3ba223298e2ff06ba79a769bd1a8ffb7a7911 100644 (file)
@@ -34,7 +34,6 @@
 #include <linux/pci.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/nftl.h>
index 3013d0883b97212eb4ff1ea80c655872ec8cef75..61a994ea8af1f884b078e9253039819a1a42b1d6 100644 (file)
@@ -759,7 +759,7 @@ static int mtd_ioctl(struct inode *inode, struct file *file,
        return ret;
 } /* memory_ioctl */
 
-static struct file_operations mtd_fops = {
+static const struct file_operations mtd_fops = {
        .owner          = THIS_MODULE,
        .llseek         = mtd_lseek,
        .read           = mtd_read,
index 7070110aba2a62fb9650a6c14c2e49e38f98ea37..c153b64a830063f719e363917aacdd69fc7afff8 100644 (file)
@@ -8,7 +8,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/ptrace.h>
 #include <linux/slab.h>
 #include <linux/string.h>
index 65f9bd3ceebfb6d707d2d7301568fe3786bacb0f..08cb060dfa3d64aea2da088ac56f17de7c883aae 100644 (file)
@@ -597,7 +597,8 @@ static int __devinit cafe_nand_probe(struct pci_dev *pdev,
                cafe_writel(cafe, 0xffffffff, NAND_TIMING3);
        }
        cafe_writel(cafe, 0xffffffff, NAND_IRQ_MASK);
-       err = request_irq(pdev->irq, &cafe_nand_interrupt, SA_SHIRQ, "CAFE NAND", mtd);
+       err = request_irq(pdev->irq, &cafe_nand_interrupt, IRQF_SHARED,
+                         "CAFE NAND", mtd);
        if (err) {
                dev_warn(&pdev->dev, "Could not register IRQ %d\n", pdev->irq);
 
index 4b1ba4fcfcd3235ad231259aa1ddae23b11b8599..e6ef7d7f9f14a316c1b058ff08acbb1637dfcf2c 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/pci.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/hdreg.h>
 
index 2d5ba076471c29d3b62a43c3765780711eb5d4af..1b3d11ed6cff5a3980d4f3fe4997feee7e628e11 100644 (file)
@@ -500,7 +500,7 @@ int lance_open (struct net_device *dev)
        int res;
 
         /* Install the Interrupt handler. Or we could shunt this out to specific drivers? */
-        if (request_irq(lp->irq, lance_interrupt, SA_SHIRQ, lp->name, dev))
+        if (request_irq(lp->irq, lance_interrupt, IRQF_SHARED, lp->name, dev))
                 return -EAGAIN;
 
         res = lance_reset(dev);
index aa9dd8f11269aeb3fe9a692ba89bcc205a70a156..4218075c8aa38e47b878386c9627169659cbbb54 100644 (file)
@@ -338,7 +338,8 @@ static void com20020_set_mc_list(struct net_device *dev)
 }
 
 #if defined(CONFIG_ARCNET_COM20020_PCI_MODULE) || \
-    defined(CONFIG_ARCNET_COM20020_ISA_MODULE)
+    defined(CONFIG_ARCNET_COM20020_ISA_MODULE) || \
+    defined(CONFIG_ARCNET_COM20020_CS_MODULE)
 EXPORT_SYMBOL(com20020_check);
 EXPORT_SYMBOL(com20020_found);
 #endif
index d6da3ce9ad7967776716827d5e8474fe7a2599f1..a2921882eba8559e5c342f24e4afeed265587012 100644 (file)
@@ -33,7 +33,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/fcntl.h>
 #include <linux/interrupt.h>
index 4fc234785d56069b47ce25261a0c8c8a148f29de..841178343a07104f5856c32ded46cada9feb82e9 100644 (file)
@@ -48,7 +48,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/fcntl.h>
 #include <linux/interrupt.h>
index 72c41f5907f252f517bdfdf451b02167b13b8962..61f574aa3a991eede306c19dbb5fe4972289a889 100644 (file)
@@ -28,7 +28,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/fcntl.h>
 #include <linux/interrupt.h>
index f0b6879a1c7d31463ab03da8682f8e23b68366c8..69ae229b680e25ee5226528736bcd8c111e66da5 100644 (file)
@@ -37,7 +37,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/timer.h>
 #include <linux/errno.h>
index 8ce8fec615bad67d99a7e6ad9e288cd5fe5ec5dc..a7c8f98a890c12bae0f8e8ac1e47a9037476f01f 100644 (file)
@@ -35,7 +35,6 @@
 
 #include <linux/kernel.h>
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/fcntl.h>
 #include <linux/interrupt.h>
@@ -3120,7 +3119,7 @@ static int bond_info_open(struct inode *inode, struct file *file)
        return res;
 }
 
-static struct file_operations bond_info_fops = {
+static const struct file_operations bond_info_fops = {
        .owner   = THIS_MODULE,
        .open    = bond_info_open,
        .read    = seq_read,
index 878f7aabeeac2b1a27324e3a2a89bef0371343c4..a122baa5c7bb937ebcc5c436d5710fe785ae3b61 100644 (file)
@@ -22,7 +22,6 @@
  */
 #include <linux/kernel.h>
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/device.h>
 #include <linux/sysdev.h>
 #include <linux/fs.h>
index a03d781f6d0a459c56f6009d56ce64ed355e72fb..8eb57127600090d4d44a8fdcaaba41ca1ccb0d04 100644 (file)
 #include <linux/module.h>
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/types.h>
 #include <linux/fcntl.h>
index c67f7d3c2f92a8195ca2f5f2837526452b759d1e..43583ed655ab8a3171b5dc9be25c26078a10a79d 100644 (file)
@@ -757,7 +757,8 @@ static int cxgb_up(struct adapter *adap)
                                      t3_intr_handler(adap,
                                                      adap->sge.qs[0].rspq.
                                                      polling),
-                                     (adap->flags & USING_MSI) ? 0 : SA_SHIRQ,
+                                     (adap->flags & USING_MSI) ?
+                                      0 : IRQF_SHARED,
                                      adap->name, adap)))
                goto irq_err;
 
index 9de2d38a5321f6d40194a0a2eb061685b9773331..38b2fa424b2d9bdd756565a3c1c49eaa0da6aa3a 100644 (file)
@@ -882,7 +882,7 @@ static int ehea_reg_interrupts(struct net_device *dev)
                         , "%s-recv%d", dev->name, i);
                ret = ibmebus_request_irq(NULL, pr->recv_eq->attr.ist1,
                                          ehea_recv_irq_handler,
-                                         SA_INTERRUPT, pr->int_recv_name, pr);
+                                         IRQF_DISABLED, pr->int_recv_name, pr);
                if (ret) {
                        ehea_error("failed registering irq for ehea_recv_int:"
                                   "port_res_nr:%d, ist=%X", i,
@@ -899,7 +899,7 @@ static int ehea_reg_interrupts(struct net_device *dev)
 
        ret = ibmebus_request_irq(NULL, port->qp_eq->attr.ist1,
                                  ehea_qp_aff_irq_handler,
-                                 SA_INTERRUPT, port->int_aff_name, port);
+                                 IRQF_DISABLED, port->int_aff_name, port);
        if (ret) {
                ehea_error("failed registering irq for qp_aff_irq_handler:"
                           "ist=%X", port->qp_eq->attr.ist1);
@@ -916,7 +916,7 @@ static int ehea_reg_interrupts(struct net_device *dev)
                         "%s-send%d", dev->name, i);
                ret = ibmebus_request_irq(NULL, pr->send_eq->attr.ist1,
                                          ehea_send_irq_handler,
-                                         SA_INTERRUPT, pr->int_send_name,
+                                         IRQF_DISABLED, pr->int_send_name,
                                          pr);
                if (ret) {
                        ehea_error("failed registering irq for ehea_send "
@@ -2539,7 +2539,7 @@ static int __devinit ehea_probe(struct ibmebus_dev *dev,
                     (unsigned long)adapter);
 
        ret = ibmebus_request_irq(NULL, adapter->neq->attr.ist1,
-                                 ehea_interrupt_neq, SA_INTERRUPT,
+                                 ehea_interrupt_neq, IRQF_DISABLED,
                                  "ehea_neq", adapter);
        if (ret) {
                dev_err(&dev->ofdev.dev, "requesting NEQ IRQ failed");
index 790d9dbe42ddf127b4e9f6794d8b26cb60cdbb6c..e492eb84f94811bd8037bd56a3730441acf87e29 100644 (file)
@@ -4,7 +4,6 @@
 
 #include <linux/kernel.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/ptrace.h>
 #include <linux/errno.h>
index 8e7a56fadfd2b1e29ba0eed297338a36ec609c44..77f747a5afa71aaf5d964c26a89d792339e46faa 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/ptrace.h>
 #include <linux/errno.h>
index d3c16b85d9a41fa405b1f2da83ff144f08b521fd..e79700abf7b651aec8c87609cf13e42cf8dcdeaa 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/ptrace.h>
 #include <linux/errno.h>
index 889d3a13e95e4ef36ca3efedb35cc7fb3afdac37..4a05c14bf7ec3a4fda1504757e8bd15b62df7936 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/ptrace.h>
 #include <linux/errno.h>
index 1ff2597b8495b7fbd54d5a8d62a3ea11e7c1a623..8545e84fc9a07a1bdf370ed7df3a177bf2822131 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/ptrace.h>
 #include <linux/errno.h>
index ff6839477306fa15c14bee44f350551c888872b5..cdcfb96f360f3c81f30bc8babb3668e80da12de0 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/ptrace.h>
 #include <linux/errno.h>
index afd7fca7c6c419290b628bdc6a7cda98784f1e4c..65925b5a224f761afdb169762e376f7d4c3890a0 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/ptrace.h>
 #include <linux/errno.h>
index 0b9b8b5c847cee9597c31e4e9c3dfff9c54d5322..f91447837fd49a709b5f62f4911a42db8ccd89f4 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/ptrace.h>
 #include <linux/errno.h>
index baaae3dbf2e6c2eb0d2931f8e18a0f4bb9c8f54e..235b177fb9acb1253efa7ce98aaf8bdeebaefaed 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/ptrace.h>
 #include <linux/errno.h>
index baa35144134c8a1459a7d104bc6e74db6123f4aa..1be4a84dce0edc84207261b08ceb9bc5bf860ae9 100644 (file)
@@ -65,7 +65,6 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/unistd.h>
index 0d6943d6709638764e885400be50db4b283f1b49..7b411c1514db364c1c662d7abb3e90a4c8ea6356 100644 (file)
@@ -16,7 +16,6 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/slab.h>
index ff684d4be96d657797474046f6fec8843c9830c9..bcc6b82f4a33b6a9385ef66197a556fdf3b82149 100644 (file)
@@ -17,7 +17,6 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/unistd.h>
index 9dd387fb3d741b1190b88191bc0eae5de92d483f..45ffb5d0ca33d54ec64c020dd2bf01ab44df0d15 100644 (file)
@@ -20,7 +20,6 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/unistd.h>
index 5b788d84011fc0ba06c204fca5ac21312f2ead9d..d2542697e298d198b9431d7f42ee1d76682f898e 100644 (file)
@@ -459,7 +459,7 @@ static int bpq_info_open(struct inode *inode, struct file *file)
        return seq_open(file, &bpq_seqops);
 }
 
-static struct file_operations bpq_info_fops = {
+static const struct file_operations bpq_info_fops = {
        .owner = THIS_MODULE,
        .open = bpq_info_open,
        .read = seq_read,
index 2ce047e9d2625455331a76092dcb60c186b9cbec..6fdaad5a457750e21adaad56dd185d928c4a92b2 100644 (file)
@@ -2083,7 +2083,7 @@ static int scc_net_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &scc_net_seq_ops);
 }
 
-static struct file_operations scc_net_seq_fops = {
+static const struct file_operations scc_net_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = scc_net_seq_open,
        .read    = seq_read,
index 6d74f08720d5cf0e53656dfb5a00dfa03579f235..08f27119a8076fbff08caddb35780fdb89b3becb 100644 (file)
@@ -804,7 +804,7 @@ static int yam_info_open(struct inode *inode, struct file *file)
        return seq_open(file, &yam_seqops);
 }
 
-static struct file_operations yam_info_fops = {
+static const struct file_operations yam_info_fops = {
        .owner = THIS_MODULE,
        .open = yam_info_open,
        .read = seq_read,
index ffeafb28f782036dff1255ce92fff70efbae68fb..dd8ad87468258152417592bcc4042e0f93434bc7 100644 (file)
@@ -21,7 +21,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/interrupt.h>
index 99343b5836b87bfce57e48046570c61ecc4ffc0b..458db0538a9af6f0f1aa3c9659ee2519d8ac57de 100644 (file)
@@ -1156,7 +1156,7 @@ static int ibmveth_proc_open(struct inode *inode, struct file *file)
        return rc;
 }
 
-static struct file_operations ibmveth_proc_fops = {
+static const struct file_operations ibmveth_proc_fops = {
        .owner   = THIS_MODULE,
        .open    = ibmveth_proc_open,
        .read    = seq_read,
index ebed168b7da674125d6b63091defa12f58e21225..809906d94762ba2d11c1e0e855768cab1a515901 100644 (file)
@@ -34,7 +34,6 @@
 #include <linux/module.h>
 #include <linux/delay.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 
 #include <net/irda/irda.h>
 
index e2b1af6184500aa9c3709647495ddadca405cf60..3457e9d8b6671ec7a7ffc322efba0c29011bd9e6 100644 (file)
@@ -385,7 +385,7 @@ static int vlsi_seq_open(struct inode *inode, struct file *file)
        return single_open(file, vlsi_seq_show, PDE(inode)->data);
 }
 
-static struct file_operations vlsi_proc_fops = {
+static const struct file_operations vlsi_proc_fops = {
        .owner   = THIS_MODULE,
        .open    = vlsi_seq_open,
        .read    = seq_read,
index e67361e2bf5dc9f29ca7bbbd182c416cbc33bc85..a41418b3c518ae2d54346ec89738fa5680ead3a4 100644 (file)
@@ -1077,7 +1077,7 @@ static int __devinit macb_probe(struct platform_device *pdev)
        }
 
        dev->irq = platform_get_irq(pdev, 0);
-       err = request_irq(dev->irq, macb_interrupt, SA_SAMPLE_RANDOM,
+       err = request_irq(dev->irq, macb_interrupt, IRQF_SAMPLE_RANDOM,
                          dev->name, dev);
        if (err) {
                printk(KERN_ERR
index e1d97cdf649eeb6a8d9ac4167dfb0bd4f7dda0da..d38b7c723620af0f23b904b2750a11767b5e4231 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 
-#include <linux/sched.h>
 #include <linux/kernel.h> /* printk() */
 #include <linux/delay.h>
 #include <linux/slab.h>
index c9469985bd713b61e4fc6d987aed10ec3bf51d34..f42b9e201937928d156159419d2fd06320083954 100644 (file)
@@ -10,7 +10,6 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/netdevice.h>
-#include <linux/sched.h>
 #include <linux/etherdevice.h>
 #include <linux/netdevice.h>
 #include <linux/platform_device.h>
index 69c1b9d23a1aecaa99d2b6d752f9d5c1cf9e749c..36ba6a1aa3637f08da4f736fa37ce17e9cceba6f 100644 (file)
@@ -619,8 +619,8 @@ static int netxen_nic_open(struct net_device *netdev)
                }
                adapter->irq = adapter->ahw.pdev->irq;
                err = request_irq(adapter->ahw.pdev->irq, &netxen_intr,
-                                 SA_SHIRQ | SA_SAMPLE_RANDOM, netdev->name,
-                                 adapter);
+                                 IRQF_SHARED | IRQF_SAMPLE_RANDOM,
+                                 netdev->name, adapter);
                if (err) {
                        printk(KERN_ERR "request_irq failed with: %d\n", err);
                        netxen_free_hw_resources(adapter);
index ae60e6e4107c09b502c3c111617add99c2f90d32..a1bd599c8a5b5014c1465cd4e7f56be3701567a5 100644 (file)
@@ -14,7 +14,6 @@
  *
  */
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/unistd.h>
index aa7983f55838b5c844cebccb6f4a8bb5bfe4257f..519baa38be8dcf767eac87b6f19843ef4ae21e52 100644 (file)
@@ -14,7 +14,6 @@
  *
  */
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/unistd.h>
index 86135397f430b089b1abb0a1dd696fa4bc64e2a3..66da91bb1388945bac1d2c0c259bf3616a6b1e4d 100644 (file)
@@ -14,7 +14,6 @@
  *
  */
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/unistd.h>
index 69d2325f848c7ee55690f3dc7074cd7bd9142726..4cf3324ba166405ef45a86f4161cc97ac16802fb 100644 (file)
@@ -14,7 +14,6 @@
  *
  */
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/unistd.h>
index 0ad253282d0d0c8388503efcf7d7e6e9304fbb60..f4d4eb659cadec5ba3d58b145711bb043fb5193d 100644 (file)
@@ -14,7 +14,6 @@
  *
  */
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/unistd.h>
index cf6660c93ffa57aeca305f53abe0a500ca38a0f4..b31ce278bf35be071e6aa5cbbfe528c36086c00f 100644 (file)
@@ -14,7 +14,6 @@
  *
  */
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/unistd.h>
index 9765fa6614676d1d62009cf38342e0969136b755..c94a1fb3a4bee56bcb9bf9d8235b3453cfce7195 100644 (file)
@@ -16,7 +16,6 @@
  *
  */
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/unistd.h>
index a4d7529ef41515d464282c883fe6c191b8b4366d..fdf45fdb67319255e6220f4c72c7c042c55155e2 100644 (file)
@@ -15,7 +15,6 @@
  *
  */
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/unistd.h>
index 2b50e1739aa54deaa3ebae7105d3ea866769b377..23062d0672314a3e5a9fb8d130cab45e43acc824 100644 (file)
@@ -14,7 +14,6 @@
  *
  */
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/unistd.h>
index c6de566188e4d6db66667b1855031d90b9dc8524..11b575f89856b55d0307c06513cc4695909cba2a 100644 (file)
@@ -83,7 +83,7 @@ struct ppp_file {
        int             dead;           /* unit/channel has been shut down */
 };
 
-#define PF_TO_X(pf, X)         ((X *)((char *)(pf) - offsetof(X, file)))
+#define PF_TO_X(pf, X)         container_of(pf, X, file)
 
 #define PF_TO_PPP(pf)          PF_TO_X(pf, struct ppp)
 #define PF_TO_CHANNEL(pf)      PF_TO_X(pf, struct channel)
@@ -834,7 +834,7 @@ static int ppp_unattached_ioctl(struct ppp_file *pf, struct file *file,
        return err;
 }
 
-static struct file_operations ppp_device_fops = {
+static const struct file_operations ppp_device_fops = {
        .owner          = THIS_MODULE,
        .read           = ppp_read,
        .write          = ppp_write,
index 315d5c3fc66a0d9480bbc871f14b1b442cc78870..860bb0f60f688892e27e2cdb76837a421f08066b 100644 (file)
@@ -1043,7 +1043,7 @@ static int pppoe_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &pppoe_seq_ops);
 }
 
-static struct file_operations pppoe_seq_fops = {
+static const struct file_operations pppoe_seq_fops = {
        .owner          = THIS_MODULE,
        .open           = pppoe_seq_open,
        .read           = seq_read,
index 2429b274f0b0dd5ae6d4355bac15d777741be051..a142cdfd947b961f0420ce74a0339de272c5b8b0 100755 (executable)
@@ -3228,7 +3228,7 @@ static int ql_adapter_up(struct ql3_adapter *qdev)
 {
        struct net_device *ndev = qdev->ndev;
        int err;
-       unsigned long irq_flags = SA_SAMPLE_RANDOM | SA_SHIRQ;
+       unsigned long irq_flags = IRQF_SAMPLE_RANDOM | IRQF_SHARED;
        unsigned long hw_flags;
 
        if (ql_alloc_mem_resources(qdev)) {
@@ -3247,7 +3247,7 @@ static int ql_adapter_up(struct ql3_adapter *qdev)
                } else {
                        printk(KERN_INFO PFX "%s: MSI Enabled...\n", qdev->ndev->name);
                        set_bit(QL_MSI_ENABLED,&qdev->flags);
-                       irq_flags &= ~SA_SHIRQ;
+                       irq_flags &= ~IRQF_SHARED;
                }
        }
 
index 8646b64994abadee6b2e38bcf0b7fe4209d1d6da..e8e0d94e9bddfa9c1935b7752f8daa303e5387d7 100644 (file)
@@ -59,7 +59,6 @@
 #include <linux/stddef.h>
 #include <linux/ioctl.h>
 #include <linux/timex.h>
-#include <linux/sched.h>
 #include <linux/ethtool.h>
 #include <linux/workqueue.h>
 #include <linux/if_vlan.h>
index 7f800feaa9a2efb9ec81fd447dcbc443ed85aa9c..4a926f20b6ea9e8603e1f5d5967a937f402da406 100644 (file)
@@ -1035,7 +1035,7 @@ static int sc92031_open(struct net_device *dev)
        priv->tx_head = priv->tx_tail = 0;
 
        err = request_irq(pdev->irq, sc92031_interrupt,
-                       SA_SHIRQ, dev->name, dev);
+                       IRQF_SHARED, dev->name, dev);
        if (unlikely(err < 0))
                goto out_request_irq;
 
index d21991ee88c492fc5899ff449e038a8dc68f9d1d..701ba4f3b69d865a87a51ae9eebf8698d6c91edc 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/module.h>
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
index e136bae619705d19cd243d7f57f5d096d2ef8421..81a1c2e1a3f5c98fd75404f51d7b04aafa82426d 100644 (file)
@@ -4,7 +4,7 @@
  * Copyright (C) 2001, 2002, 2003, 2004 David S. Miller (davem@redhat.com)
  * Copyright (C) 2001, 2002, 2003 Jeff Garzik (jgarzik@pobox.com)
  * Copyright (C) 2004 Sun Microsystems Inc.
- * Copyright (C) 2005 Broadcom Corporation.
+ * Copyright (C) 2005-2007 Broadcom Corporation.
  *
  * Firmware is:
  *     Derived from proprietary unpublished source code,
@@ -64,8 +64,8 @@
 
 #define DRV_MODULE_NAME                "tg3"
 #define PFX DRV_MODULE_NAME    ": "
-#define DRV_MODULE_VERSION     "3.72"
-#define DRV_MODULE_RELDATE     "January 8, 2007"
+#define DRV_MODULE_VERSION     "3.73"
+#define DRV_MODULE_RELDATE     "February 12, 2007"
 
 #define TG3_DEF_MAC_MODE       0
 #define TG3_DEF_RX_MODE                0
@@ -1175,8 +1175,18 @@ static void tg3_nvram_unlock(struct tg3 *);
 
 static void tg3_power_down_phy(struct tg3 *tp)
 {
-       if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
+       if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) {
+               if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
+                       u32 sg_dig_ctrl = tr32(SG_DIG_CTRL);
+                       u32 serdes_cfg = tr32(MAC_SERDES_CFG);
+
+                       sg_dig_ctrl |=
+                               SG_DIG_USING_HW_AUTONEG | SG_DIG_SOFT_RESET;
+                       tw32(SG_DIG_CTRL, sg_dig_ctrl);
+                       tw32(MAC_SERDES_CFG, serdes_cfg | (1 << 15));
+               }
                return;
+       }
 
        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
                u32 val;
@@ -1340,7 +1350,8 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state)
 
                tw32_wait_f(TG3PCI_CLOCK_CTRL, base_val | CLOCK_CTRL_ALTCLK |
                            CLOCK_CTRL_PWRDOWN_PLL133, 40);
-       } else if (tp->tg3_flags2 & TG3_FLG2_5780_CLASS) {
+       } else if ((tp->tg3_flags2 & TG3_FLG2_5780_CLASS) ||
+                  (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)) {
                /* do nothing */
        } else if (!((tp->tg3_flags2 & TG3_FLG2_5750_PLUS) &&
                     (tp->tg3_flags & TG3_FLAG_ENABLE_ASF))) {
@@ -3724,13 +3735,23 @@ out:
        tg3_full_unlock(tp);
 }
 
+static void tg3_dump_short_state(struct tg3 *tp)
+{
+       printk(KERN_ERR PFX "DEBUG: MAC_TX_STATUS[%08x] MAC_RX_STATUS[%08x]\n",
+              tr32(MAC_TX_STATUS), tr32(MAC_RX_STATUS));
+       printk(KERN_ERR PFX "DEBUG: RDMAC_STATUS[%08x] WDMAC_STATUS[%08x]\n",
+              tr32(RDMAC_STATUS), tr32(WDMAC_STATUS));
+}
+
 static void tg3_tx_timeout(struct net_device *dev)
 {
        struct tg3 *tp = netdev_priv(dev);
 
-       if (netif_msg_tx_err(tp))
+       if (netif_msg_tx_err(tp)) {
                printk(KERN_ERR PFX "%s: transmit timed out, resetting\n",
                       dev->name);
+               tg3_dump_short_state(tp);
+       }
 
        schedule_work(&tp->reset_task);
 }
@@ -6583,8 +6604,9 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
                u32 tmp;
 
                /* Clear CRC stats. */
-               if (!tg3_readphy(tp, 0x1e, &tmp)) {
-                       tg3_writephy(tp, 0x1e, tmp | 0x8000);
+               if (!tg3_readphy(tp, MII_TG3_TEST1, &tmp)) {
+                       tg3_writephy(tp, MII_TG3_TEST1,
+                                    tmp | MII_TG3_TEST1_CRC_EN);
                        tg3_readphy(tp, 0x14, &tmp);
                }
        }
@@ -7408,8 +7430,9 @@ static unsigned long calc_crc_errors(struct tg3 *tp)
                u32 val;
 
                spin_lock_bh(&tp->lock);
-               if (!tg3_readphy(tp, 0x1e, &val)) {
-                       tg3_writephy(tp, 0x1e, val | 0x8000);
+               if (!tg3_readphy(tp, MII_TG3_TEST1, &val)) {
+                       tg3_writephy(tp, MII_TG3_TEST1,
+                                    val | MII_TG3_TEST1_CRC_EN);
                        tg3_readphy(tp, 0x14, &val);
                } else
                        val = 0;
@@ -10779,7 +10802,9 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
        if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
                if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
                    GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787) {
-                       tp->tg3_flags2 |= TG3_FLG2_PHY_JITTER_BUG;
+                       if (tp->pdev->device != PCI_DEVICE_ID_TIGON3_5756 &&
+                           tp->pdev->device != PCI_DEVICE_ID_TIGON3_5722)
+                               tp->tg3_flags2 |= TG3_FLG2_PHY_JITTER_BUG;
                        if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5755M)
                                tp->tg3_flags2 |= TG3_FLG2_PHY_ADJUST_TRIM;
                } else if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906)
@@ -11314,6 +11339,7 @@ static int __devinit tg3_test_dma(struct tg3 *tp)
                if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
                    GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
                        u32 ccval = (tr32(TG3PCI_CLOCK_CTRL) & 0x1f);
+                       u32 read_water = 0x7;
 
                        /* If the 5704 is behind the EPB bridge, we can
                         * do the less restrictive ONE_DMA workaround for
@@ -11325,8 +11351,13 @@ static int __devinit tg3_test_dma(struct tg3 *tp)
                        else if (ccval == 0x6 || ccval == 0x7)
                                tp->dma_rwctrl |= DMA_RWCTRL_ONE_DMA;
 
+                       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703)
+                               read_water = 4;
                        /* Set bit 23 to enable PCIX hw bug fix */
-                       tp->dma_rwctrl |= 0x009f0000;
+                       tp->dma_rwctrl |=
+                               (read_water << DMA_RWCTRL_READ_WATER_SHIFT) |
+                               (0x3 << DMA_RWCTRL_WRITE_WATER_SHIFT) |
+                               (1 << 23);
                } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780) {
                        /* 5780 always in PCIX mode */
                        tp->dma_rwctrl |= 0x00144000;
@@ -12016,6 +12047,9 @@ static int tg3_suspend(struct pci_dev *pdev, pm_message_t state)
        tp->tg3_flags &= ~TG3_FLAG_INIT_COMPLETE;
        tg3_full_unlock(tp);
 
+       /* Save MSI address and data for resume.  */
+       pci_save_state(pdev);
+
        err = tg3_set_power_state(tp, pci_choose_state(pdev, state));
        if (err) {
                tg3_full_lock(tp, 0);
index 80f59ac7ec58b3fd8ff7c7783bf2ee5e57da3038..45d477e8f3744f4f10d3ab7ff952b5676804dd63 100644 (file)
 
 #define MII_TG3_TEST1                  0x1e
 #define MII_TG3_TEST1_TRIM_EN          0x0010
+#define MII_TG3_TEST1_CRC_EN           0x8000
 
 /* There are two ways to manage the TX descriptors on the tigon3.
  * Either the descriptors are in host DMA'able memory, or they
index 893808ab3742ed86ac818b6336399d256d2a75c5..d92c5c597e16261d6acc97bbe9d87872552ef135 100644 (file)
@@ -38,7 +38,6 @@
 #include <linux/etherdevice.h>
 #include <linux/skbuff.h>
 #include <linux/slab.h>
-#include <linux/sched.h>
 #include <linux/spinlock.h>
 #include <linux/delay.h>
 #include <linux/crc32.h>
index 151a2e10e4f3dc980720dcbd277dd240ea84174a..5643d1e84ed6752d8dc12164423354ba0725aa70 100644 (file)
@@ -744,7 +744,7 @@ static int tun_chr_close(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations tun_fops = {
+static const struct file_operations tun_fops = {
        .owner  = THIS_MODULE,
        .llseek = no_llseek,
        .read  = do_sync_read,
index 31c97a6591a44cdc3b10b3f5f5ac0fb7f3f500e9..a2fc2bbcf97f71c623baab814250d61463d7a95a 100644 (file)
@@ -3939,8 +3939,8 @@ static void ugeth_phy_startup_timer(unsigned long data)
        /* Grab the PHY interrupt, if necessary/possible */
        if (ugeth->ug_info->board_flags & FSL_UGETH_BRD_HAS_PHY_INTR) {
                if (request_irq(ugeth->ug_info->phy_interrupt,
-                               phy_interrupt,
-                               SA_SHIRQ, "phy_interrupt", mii_info->dev) < 0) {
+                               phy_interrupt, IRQF_SHARED,
+                               "phy_interrupt", mii_info->dev) < 0) {
                        ugeth_err("%s: Can't get IRQ %d (PHY)",
                                  mii_info->dev->name,
                                  ugeth->ug_info->phy_interrupt);
index 6fda6d88be499d1ce0e79ccc98eb0818f8f713dd..9373d895b9ec5926d67b4d7c180eec34432cb95b 100644 (file)
@@ -18,7 +18,6 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/errno.h>
 #include <linux/slab.h>
index 6c7dfb50143f7247a0f11fa2422b5b46e08c4417..e91b5a84a20a5ce2adb3e03f3a4fccc8b6c92589 100644 (file)
@@ -311,7 +311,7 @@ static int cosa_chardev_ioctl(struct inode *inode, struct file *file,
 static int cosa_fasync(struct inode *inode, struct file *file, int on);
 #endif
 
-static struct file_operations cosa_fops = {
+static const struct file_operations cosa_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .read           = cosa_read,
index e6d005726aadea2875fca2e747cee73aaa9225db..d347d59db656057cffdc3c27260d8866188374be 100644 (file)
@@ -53,7 +53,6 @@
 #include <linux/kernel.h>      /* printk(), and other useful stuff */
 #include <linux/stddef.h>      /* offsetof(), etc. */
 #include <linux/errno.h>       /* return codes */
-#include <linux/sched.h>       /* for jiffies, HZ, etc. */
 #include <linux/cycx_drv.h>    /* API definitions */
 #include <linux/cycx_cfm.h>    /* CYCX firmware module definitions */
 #include <linux/delay.h>       /* udelay, msleep_interruptible */
index a6b9c33b68e45b91bb502ad043fbe220467adf84..ca06a00d9d864967c604c1582a346d80d512b367 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/fcntl.h>
 #include <linux/in.h>
index 44a22701da9734df0155a7323cc574ee6752c071..b08055abe83a3982345bde47937567af90b2e121 100644 (file)
@@ -4430,53 +4430,53 @@ static int proc_BSSList_open( struct inode *inode, struct file *file );
 static int proc_config_open( struct inode *inode, struct file *file );
 static int proc_wepkey_open( struct inode *inode, struct file *file );
 
-static struct file_operations proc_statsdelta_ops = {
+static const struct file_operations proc_statsdelta_ops = {
        .read           = proc_read,
        .open           = proc_statsdelta_open,
        .release        = proc_close
 };
 
-static struct file_operations proc_stats_ops = {
+static const struct file_operations proc_stats_ops = {
        .read           = proc_read,
        .open           = proc_stats_open,
        .release        = proc_close
 };
 
-static struct file_operations proc_status_ops = {
+static const struct file_operations proc_status_ops = {
        .read           = proc_read,
        .open           = proc_status_open,
        .release        = proc_close
 };
 
-static struct file_operations proc_SSID_ops = {
+static const struct file_operations proc_SSID_ops = {
        .read           = proc_read,
        .write          = proc_write,
        .open           = proc_SSID_open,
        .release        = proc_close
 };
 
-static struct file_operations proc_BSSList_ops = {
+static const struct file_operations proc_BSSList_ops = {
        .read           = proc_read,
        .write          = proc_write,
        .open           = proc_BSSList_open,
        .release        = proc_close
 };
 
-static struct file_operations proc_APList_ops = {
+static const struct file_operations proc_APList_ops = {
        .read           = proc_read,
        .write          = proc_write,
        .open           = proc_APList_open,
        .release        = proc_close
 };
 
-static struct file_operations proc_config_ops = {
+static const struct file_operations proc_config_ops = {
        .read           = proc_read,
        .write          = proc_write,
        .open           = proc_config_open,
        .release        = proc_close
 };
 
-static struct file_operations proc_wepkey_ops = {
+static const struct file_operations proc_wepkey_ops = {
        .read           = proc_read,
        .write          = proc_write,
        .open           = proc_wepkey_open,
index 5fa985435ffa2f9f56d1aed7019fab856e49c841..015abd928ab0b156ad49562b6107810e32f774b8 100644 (file)
@@ -1216,7 +1216,7 @@ static ctl_table arlan_table[MAX_ARLANS + 1] =
 static ctl_table arlan_root_table[] =
 {
        {
-               .ctl_name       = 254,
+               .ctl_name       = CTL_ARLAN,
                .procname       = "arlan",
                .maxlen         = 0,
                .mode           = 0555,
@@ -1244,7 +1244,7 @@ int __init init_arlan_proc(void)
                return 0;
        for (i = 0; i < MAX_ARLANS && arlan_device[i]; i++)
                arlan_table[i].ctl_name = i + 1;
-       arlan_device_sysctl_header = register_sysctl_table(arlan_root_table, 0);
+       arlan_device_sysctl_header = register_sysctl_table(arlan_root_table);
        if (!arlan_device_sysctl_header)
                return -1;
 
index 10bcb48e80d0e8635c3e90493a66934966e525ae..23eba698aec545fb45408aab1b49586fd1c776a8 100644 (file)
@@ -42,7 +42,6 @@
 #include <linux/init.h>
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/ptrace.h>
 #include <linux/slab.h>
 #include <linux/string.h>
index b9df06a06ea96105f3a033c3a54377229ee6c66e..35dbe455451306886ee42670648184046416c7f4 100644 (file)
@@ -355,37 +355,37 @@ out_up:
 #undef fappend
 
 
-static struct file_operations devinfo_fops = {
+static const struct file_operations devinfo_fops = {
        .read = devinfo_read_file,
        .write = write_file_dummy,
        .open = open_file_generic,
 };
 
-static struct file_operations spromdump_fops = {
+static const struct file_operations spromdump_fops = {
        .read = spromdump_read_file,
        .write = write_file_dummy,
        .open = open_file_generic,
 };
 
-static struct file_operations drvinfo_fops = {
+static const struct file_operations drvinfo_fops = {
        .read = drvinfo_read_file,
        .write = write_file_dummy,
        .open = open_file_generic,
 };
 
-static struct file_operations tsf_fops = {
+static const struct file_operations tsf_fops = {
        .read = tsf_read_file,
        .write = tsf_write_file,
        .open = open_file_generic,
 };
 
-static struct file_operations txstat_fops = {
+static const struct file_operations txstat_fops = {
        .read = txstat_read_file,
        .write = write_file_dummy,
        .open = open_file_generic,
 };
 
-static struct file_operations restart_fops = {
+static const struct file_operations restart_fops = {
        .write = restart_write_file,
        .open = open_file_generic,
 };
index a659442b9c15e09e978f1c2c0264536df51cc884..d2ca949174fe925c1b5a75a698e0ef27a8537bd5 100644 (file)
@@ -33,7 +33,6 @@
 #include <net/ieee80211softmac.h>
 #include <net/ieee80211softmac_wx.h>
 #include <linux/capability.h>
-#include <linux/sched.h> /* for capable() */
 #include <linux/delay.h>
 
 #include "bcm43xx.h"
index ce3a8bac66ffb55d6d145b544d1b46e133caeaf6..f5ce1c6063d823ed52dead7b417179783c1a4fec 100644 (file)
@@ -1160,7 +1160,7 @@ static int strip_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &strip_seq_ops);
 }
 
-static struct file_operations strip_seq_fops = {
+static const struct file_operations strip_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = strip_seq_open,
        .read    = seq_read,
index 04d641714d347f0f7e00243a5918c5eb7b6d8a6d..00e937e9240e5b9196de3a6faf08b925842595e6 100644 (file)
@@ -181,7 +181,7 @@ out:
        return retval;
 }
  
-struct file_operations event_buffer_fops = {
+const struct file_operations event_buffer_fops = {
        .open           = event_buffer_open,
        .release        = event_buffer_release,
        .read           = event_buffer_read,
index 92416276e57702d7321d972d9fb571aa528a19a8..9b6a4ebd03e39c65a3ba0cdcf6c336f023109a37 100644 (file)
@@ -41,7 +41,7 @@ void wake_up_buffer_waiter(void);
 /* add data to the event buffer */
 void add_event_entry(unsigned long data);
  
-extern struct file_operations event_buffer_fops;
+extern const struct file_operations event_buffer_fops;
  
 /* mutex between sync_cpu_buffers() and the
  * file reading code.
index a72006c08f2befc1496eec4b9c72cb850ff4f040..ef953ba5ab6b239d1b08d8ec4a423b2dca21d17a 100644 (file)
@@ -44,7 +44,7 @@ static ssize_t depth_write(struct file * file, char const __user * buf, size_t c
 }
 
 
-static struct file_operations depth_fops = {
+static const struct file_operations depth_fops = {
        .read           = depth_read,
        .write          = depth_write
 };
@@ -56,7 +56,7 @@ static ssize_t pointer_size_read(struct file * file, char __user * buf, size_t c
 }
 
 
-static struct file_operations pointer_size_fops = {
+static const struct file_operations pointer_size_fops = {
        .read           = pointer_size_read,
 };
 
@@ -67,7 +67,7 @@ static ssize_t cpu_type_read(struct file * file, char __user * buf, size_t count
 }
  
  
-static struct file_operations cpu_type_fops = {
+static const struct file_operations cpu_type_fops = {
        .read           = cpu_type_read,
 };
  
@@ -101,7 +101,7 @@ static ssize_t enable_write(struct file * file, char const __user * buf, size_t
 }
 
  
-static struct file_operations enable_fops = {
+static const struct file_operations enable_fops = {
        .read           = enable_read,
        .write          = enable_write,
 };
@@ -114,7 +114,7 @@ static ssize_t dump_write(struct file * file, char const __user * buf, size_t co
 }
 
 
-static struct file_operations dump_fops = {
+static const struct file_operations dump_fops = {
        .write          = dump_write,
 };
  
index 5756401fb15bb2e13d272ef87f4ce6f3752ab8cd..6e67b42ca46d49f008eeccfe821c51bd98f6d4b7 100644 (file)
@@ -115,14 +115,14 @@ static int default_open(struct inode * inode, struct file * filp)
 }
 
 
-static struct file_operations ulong_fops = {
+static const struct file_operations ulong_fops = {
        .read           = ulong_read_file,
        .write          = ulong_write_file,
        .open           = default_open,
 };
 
 
-static struct file_operations ulong_ro_fops = {
+static const struct file_operations ulong_ro_fops = {
        .read           = ulong_read_file,
        .open           = default_open,
 };
@@ -182,7 +182,7 @@ static ssize_t atomic_read_file(struct file * file, char __user * buf, size_t co
 }
  
 
-static struct file_operations atomic_ro_fops = {
+static const struct file_operations atomic_ro_fops = {
        .read           = atomic_read_file,
        .open           = default_open,
 };
index fe3f5f5365c555abdef1546e7e0868b79bc8bea3..894fdb9d44c0b832ddd5d2a23f2ceedaa71d0b16 100644 (file)
@@ -1091,7 +1091,7 @@ static int ccio_proc_info_open(struct inode *inode, struct file *file)
        return single_open(file, &ccio_proc_info, NULL);
 }
 
-static struct file_operations ccio_proc_info_fops = {
+static const struct file_operations ccio_proc_info_fops = {
        .owner = THIS_MODULE,
        .open = ccio_proc_info_open,
        .read = seq_read,
@@ -1127,7 +1127,7 @@ static int ccio_proc_bitmap_open(struct inode *inode, struct file *file)
        return single_open(file, &ccio_proc_bitmap_info, NULL);
 }
 
-static struct file_operations ccio_proc_bitmap_fops = {
+static const struct file_operations ccio_proc_bitmap_fops = {
        .owner = THIS_MODULE,
        .open = ccio_proc_bitmap_open,
        .read = seq_read,
index e97cecbc4d183e6b0772e824747e2de8d4341e69..309076b39853be3a0f51a565dec251f9156c82ba 100644 (file)
@@ -33,7 +33,6 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/pci.h>
-#include <linux/sched.h>
 #include <linux/spinlock.h>
 #include <linux/eisa.h>
 
index e13aafa70bf528d0401770c88b3bce7815f4e35f..86e9c84a965e3e4f815266734c1c030078a3d0c6 100644 (file)
@@ -97,7 +97,7 @@ static int eisa_eeprom_release(struct inode *inode, struct file *file)
 /*
  *     The various file operations we support.
  */
-static struct file_operations eisa_eeprom_fops = {
+static const struct file_operations eisa_eeprom_fops = {
        .owner =        THIS_MODULE,
        .llseek =       eisa_eeprom_llseek,
        .read =         eisa_eeprom_read,
index 8dac2ba82bb95ee748d6b69d5f56e02f4b30e329..9a731c101d102ed11305372a6416b9b92ac3d76c 100644 (file)
@@ -252,7 +252,6 @@ static int __init led_create_procfs(void)
        proc_pdc_root->owner = THIS_MODULE;
        ent = create_proc_entry("led", S_IFREG|S_IRUGO|S_IWUSR, proc_pdc_root);
        if (!ent) return -1;
-       ent->nlink = 1;
        ent->data = (void *)LED_NOLCD; /* LED */
        ent->read_proc = led_proc_read;
        ent->write_proc = led_proc_write;
@@ -262,7 +261,6 @@ static int __init led_create_procfs(void)
        {
                ent = create_proc_entry("lcd", S_IFREG|S_IRUGO|S_IWUSR, proc_pdc_root);
                if (!ent) return -1;
-               ent->nlink = 1;
                ent->data = (void *)LED_HASLCD; /* LCD */
                ent->read_proc = led_proc_read;
                ent->write_proc = led_proc_write;
index f1e7ccd5475bb413888272112e1937d67e4d5f36..76a29dadd519d79c7f1a6d04c57529cb38c5fead 100644 (file)
@@ -1799,7 +1799,7 @@ sba_proc_open(struct inode *i, struct file *f)
        return single_open(f, &sba_proc_info, NULL);
 }
 
-static struct file_operations sba_proc_fops = {
+static const struct file_operations sba_proc_fops = {
        .owner = THIS_MODULE,
        .open = sba_proc_open,
        .read = seq_read,
@@ -1831,7 +1831,7 @@ sba_proc_bitmap_open(struct inode *i, struct file *f)
        return single_open(f, &sba_proc_bitmap_info, NULL);
 }
 
-static struct file_operations sba_proc_bitmap_fops = {
+static const struct file_operations sba_proc_bitmap_fops = {
        .owner = THIS_MODULE,
        .open = sba_proc_bitmap_open,
        .read = seq_read,
index e60b4bf6bae8f754e48daa268846407b0404096d..316c06f4423c381ba05792840750b683d4ba4add 100644 (file)
@@ -37,7 +37,6 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/ptrace.h>
 #include <linux/slab.h>
 #include <linux/string.h>
index a7c5ead9a3d38ab146811f4077a5499c5e0f8e74..17bf9937d276d66e792adaf17763c5550e65a716 100644 (file)
@@ -23,7 +23,6 @@
 
 #include <linux/module.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/interrupt.h>
index 2e744a274517c517b31889e0553451427e28a209..bdbdab9285cacfbb6839c24cbbf9f11239e5796f 100644 (file)
@@ -233,12 +233,12 @@ static int do_hardware_modes (ctl_table *table, int write,
        return copy_to_user(result, buffer, len) ? -EFAULT : 0;
 }
 
-#define PARPORT_PORT_DIR(child) { 0, NULL, NULL, 0, 0555, child }
-#define PARPORT_PARPORT_DIR(child) { DEV_PARPORT, "parport", \
-                                     NULL, 0, 0555, child }
-#define PARPORT_DEV_DIR(child) { CTL_DEV, "dev", NULL, 0, 0555, child }
-#define PARPORT_DEVICES_ROOT_DIR  { DEV_PARPORT_DEVICES, "devices", \
-                                    NULL, 0, 0555, NULL }
+#define PARPORT_PORT_DIR(CHILD) { .ctl_name = 0, .procname = NULL, .mode = 0555, .child = CHILD }
+#define PARPORT_PARPORT_DIR(CHILD) { .ctl_name = DEV_PARPORT, .procname = "parport", \
+                                     .mode = 0555, .child = CHILD }
+#define PARPORT_DEV_DIR(CHILD) { .ctl_name = CTL_DEV, .procname = "dev", .mode = 0555, .child = CHILD }
+#define PARPORT_DEVICES_ROOT_DIR  { .ctl_name = DEV_PARPORT_DEVICES, .procname = "devices", \
+                                    .mode = 0555, .child = NULL }
 
 static const unsigned long parport_min_timeslice_value =
 PARPORT_MIN_TIMESLICE_VALUE;
@@ -263,50 +263,118 @@ struct parport_sysctl_table {
 };
 
 static const struct parport_sysctl_table parport_sysctl_template = {
-       NULL,
+       .sysctl_header = NULL,
         {
-               { DEV_PARPORT_SPINTIME, "spintime",
-                 NULL, sizeof(int), 0644, NULL,
-                 &proc_dointvec_minmax, NULL, NULL,
-                 (void*) &parport_min_spintime_value,
-                 (void*) &parport_max_spintime_value },
-               { DEV_PARPORT_BASE_ADDR, "base-addr",
-                 NULL, 0, 0444, NULL,
-                 &do_hardware_base_addr },
-               { DEV_PARPORT_IRQ, "irq",
-                 NULL, 0, 0444, NULL,
-                 &do_hardware_irq },
-               { DEV_PARPORT_DMA, "dma",
-                 NULL, 0, 0444, NULL,
-                 &do_hardware_dma },
-               { DEV_PARPORT_MODES, "modes",
-                 NULL, 0, 0444, NULL,
-                 &do_hardware_modes },
+               {
+                       .ctl_name       = DEV_PARPORT_SPINTIME,
+                       .procname       = "spintime",
+                       .data           = NULL,
+                       .maxlen         = sizeof(int),
+                       .mode           = 0644,
+                       .proc_handler   = &proc_dointvec_minmax,
+                       .extra1         = (void*) &parport_min_spintime_value,
+                       .extra2         = (void*) &parport_max_spintime_value
+               },
+               {
+                       .ctl_name       = DEV_PARPORT_BASE_ADDR,
+                       .procname       = "base-addr",
+                       .data           = NULL,
+                       .maxlen         = 0,
+                       .mode           = 0444,
+                       .proc_handler   = &do_hardware_base_addr
+               },
+               {
+                       .ctl_name       = DEV_PARPORT_IRQ,
+                       .procname       = "irq",
+                       .data           = NULL,
+                       .maxlen         = 0,
+                       .mode           = 0444,
+                       .proc_handler   = &do_hardware_irq
+               },
+               {
+                       .ctl_name       = DEV_PARPORT_DMA,
+                       .procname       = "dma",
+                       .data           = NULL,
+                       .maxlen         = 0,
+                       .mode           = 0444,
+                       .proc_handler   = &do_hardware_dma
+               },
+               {
+                       .ctl_name       = DEV_PARPORT_MODES,
+                       .procname       = "modes",
+                       .data           = NULL,
+                       .maxlen         = 0,
+                       .mode           = 0444,
+                       .proc_handler   = &do_hardware_modes
+               },
                PARPORT_DEVICES_ROOT_DIR,
 #ifdef CONFIG_PARPORT_1284
-               { DEV_PARPORT_AUTOPROBE, "autoprobe",
-                 NULL, 0, 0444, NULL,
-                 &do_autoprobe },
-               { DEV_PARPORT_AUTOPROBE + 1, "autoprobe0",
-                NULL, 0, 0444, NULL,
-                &do_autoprobe },
-               { DEV_PARPORT_AUTOPROBE + 2, "autoprobe1",
-                 NULL, 0, 0444, NULL,
-                 &do_autoprobe },
-               { DEV_PARPORT_AUTOPROBE + 3, "autoprobe2",
-                 NULL, 0, 0444, NULL,
-                 &do_autoprobe },
-               { DEV_PARPORT_AUTOPROBE + 4, "autoprobe3",
-                 NULL, 0, 0444, NULL,
-                 &do_autoprobe },
+               {
+                       .ctl_name       = DEV_PARPORT_AUTOPROBE,
+                       .procname       = "autoprobe",
+                       .data           = NULL,
+                       .maxlen         = 0,
+                       .mode           = 0444,
+                       .proc_handler   = &do_autoprobe
+               },
+               {
+                       .ctl_name       = DEV_PARPORT_AUTOPROBE + 1,
+                       .procname       = "autoprobe0",
+                       .data           = NULL,
+                       .maxlen         = 0,
+                       .mode           = 0444,
+                       .proc_handler   =  &do_autoprobe
+               },
+               {
+                       .ctl_name       = DEV_PARPORT_AUTOPROBE + 2,
+                       .procname       = "autoprobe1",
+                       .data           = NULL,
+                       .maxlen         = 0,
+                       .mode           = 0444,
+                       .proc_handler   = &do_autoprobe
+               },
+               {
+                       .ctl_name       = DEV_PARPORT_AUTOPROBE + 3,
+                       .procname       = "autoprobe2",
+                       .data           = NULL,
+                       .maxlen         = 0,
+                       .mode           = 0444,
+                       .proc_handler   = &do_autoprobe
+               },
+               {
+                       .ctl_name       = DEV_PARPORT_AUTOPROBE + 4,
+                       .procname       = "autoprobe3",
+                       .data           = NULL,
+                       .maxlen         = 0,
+                       .mode           = 0444,
+                       .proc_handler   = &do_autoprobe
+               },
 #endif /* IEEE 1284 support */
-               {0}
+               {}
        },
-       { {DEV_PARPORT_DEVICES_ACTIVE, "active", NULL, 0, 0444, NULL,
-         &do_active_device }, {0}},
-       { PARPORT_PORT_DIR(NULL), {0}},
-       { PARPORT_PARPORT_DIR(NULL), {0}},
-       { PARPORT_DEV_DIR(NULL), {0}}
+       {
+               {
+                       .ctl_name       = DEV_PARPORT_DEVICES_ACTIVE,
+                       .procname       = "active",
+                       .data           = NULL,
+                       .maxlen         = 0,
+                       .mode           = 0444,
+                       .proc_handler   = &do_active_device
+               },
+               {}
+       },
+       {
+               PARPORT_PORT_DIR(NULL),
+               {}
+       },
+       {
+               PARPORT_PARPORT_DIR(NULL),
+               {}
+       },
+       {
+               PARPORT_DEV_DIR(NULL),
+               {}
+       }
 };
 
 struct parport_device_sysctl_table
@@ -322,19 +390,46 @@ struct parport_device_sysctl_table
 
 static const struct parport_device_sysctl_table
 parport_device_sysctl_template = {
-       NULL,
+       .sysctl_header = NULL,
+       {
+               {
+                       .ctl_name       = DEV_PARPORT_DEVICE_TIMESLICE,
+                       .procname       = "timeslice",
+                       .data           = NULL,
+                       .maxlen         = sizeof(int),
+                       .mode           = 0644,
+                       .proc_handler   = &proc_doulongvec_ms_jiffies_minmax,
+                       .extra1         = (void*) &parport_min_timeslice_value,
+                       .extra2         = (void*) &parport_max_timeslice_value
+               },
+       },
+       {
+               {
+                       .ctl_name       = 0,
+                       .procname       = NULL,
+                       .data           = NULL,
+                       .maxlen         = 0,
+                       .mode           = 0555,
+                       .child          = NULL
+               },
+               {}
+       },
        {
-               { DEV_PARPORT_DEVICE_TIMESLICE, "timeslice",
-                 NULL, sizeof(int), 0644, NULL,
-                 &proc_doulongvec_ms_jiffies_minmax, NULL, NULL,
-                 (void*) &parport_min_timeslice_value,
-                 (void*) &parport_max_timeslice_value },
+               PARPORT_DEVICES_ROOT_DIR,
+               {}
+       },
+       {
+               PARPORT_PORT_DIR(NULL),
+               {}
        },
-       { {0, NULL, NULL, 0, 0555, NULL}, {0}},
-       { PARPORT_DEVICES_ROOT_DIR, {0}},
-       { PARPORT_PORT_DIR(NULL), {0}},
-       { PARPORT_PARPORT_DIR(NULL), {0}},
-       { PARPORT_DEV_DIR(NULL), {0}}
+       {
+               PARPORT_PARPORT_DIR(NULL),
+               {}
+       },
+       {
+               PARPORT_DEV_DIR(NULL),
+               {}
+       }
 };
 
 struct parport_default_sysctl_table
@@ -351,28 +446,47 @@ extern int parport_default_spintime;
 
 static struct parport_default_sysctl_table
 parport_default_sysctl_table = {
-       NULL,
+       .sysctl_header  = NULL,
+       {
+               {
+                       .ctl_name       = DEV_PARPORT_DEFAULT_TIMESLICE,
+                       .procname       = "timeslice",
+                       .data           = &parport_default_timeslice,
+                       .maxlen         = sizeof(parport_default_timeslice),
+                       .mode           = 0644,
+                       .proc_handler   = &proc_doulongvec_ms_jiffies_minmax,
+                       .extra1         = (void*) &parport_min_timeslice_value,
+                       .extra2         = (void*) &parport_max_timeslice_value
+               },
+               {
+                       .ctl_name       = DEV_PARPORT_DEFAULT_SPINTIME,
+                       .procname       = "spintime",
+                       .data           = &parport_default_spintime,
+                       .maxlen         = sizeof(parport_default_spintime),
+                       .mode           = 0644,
+                       .proc_handler   = &proc_dointvec_minmax,
+                       .extra1         = (void*) &parport_min_spintime_value,
+                       .extra2         = (void*) &parport_max_spintime_value
+               },
+               {}
+       },
        {
-               { DEV_PARPORT_DEFAULT_TIMESLICE, "timeslice",
-                 &parport_default_timeslice,
-                 sizeof(parport_default_timeslice), 0644, NULL,
-                 &proc_doulongvec_ms_jiffies_minmax, NULL, NULL,
-                 (void*) &parport_min_timeslice_value,
-                 (void*) &parport_max_timeslice_value },
-               { DEV_PARPORT_DEFAULT_SPINTIME, "spintime",
-                 &parport_default_spintime,
-                 sizeof(parport_default_spintime), 0644, NULL,
-                 &proc_dointvec_minmax, NULL, NULL,
-                 (void*) &parport_min_spintime_value,
-                 (void*) &parport_max_spintime_value },
-               {0}
+               {
+                       .ctl_name       = DEV_PARPORT_DEFAULT,
+                       .procname       = "default",
+                       .mode           = 0555,
+                       .child          = parport_default_sysctl_table.vars
+               },
+               {}
        },
-       { { DEV_PARPORT_DEFAULT, "default", NULL, 0, 0555,
-           parport_default_sysctl_table.vars },{0}},
        {
-       PARPORT_PARPORT_DIR(parport_default_sysctl_table.default_dir), 
-       {0}},
-       { PARPORT_DEV_DIR(parport_default_sysctl_table.parport_dir), {0}}
+               PARPORT_PARPORT_DIR(parport_default_sysctl_table.default_dir),
+               {}
+       },
+       {
+               PARPORT_DEV_DIR(parport_default_sysctl_table.parport_dir),
+               {}
+       }
 };
 
 
@@ -404,7 +518,7 @@ int parport_proc_register(struct parport *port)
        t->parport_dir[0].child = t->port_dir;
        t->dev_dir[0].child = t->parport_dir;
 
-       t->sysctl_header = register_sysctl_table(t->dev_dir, 0);
+       t->sysctl_header = register_sysctl_table(t->dev_dir);
        if (t->sysctl_header == NULL) {
                kfree(t);
                t = NULL;
@@ -460,7 +574,7 @@ int parport_device_proc_register(struct pardevice *device)
        t->device_dir[0].child = t->vars;
        t->vars[0].data = &device->timeslice;
 
-       t->sysctl_header = register_sysctl_table(t->dev_dir, 0);
+       t->sysctl_header = register_sysctl_table(t->dev_dir);
        if (t->sysctl_header == NULL) {
                kfree(t);
                t = NULL;
@@ -483,7 +597,7 @@ int parport_device_proc_unregister(struct pardevice *device)
 static int __init parport_default_proc_register(void)
 {
        parport_default_sysctl_table.sysctl_header =
-               register_sysctl_table(parport_default_sysctl_table.dev_dir, 0);
+               register_sysctl_table(parport_default_sysctl_table.dev_dir);
        return 0;
 }
 
index 3cfb0a3575e660938abc6070c9048563ddd7c287..5ea5bc70cb8215cf078bd38fe77ba82f34e80554 100644 (file)
@@ -4,7 +4,7 @@
 config PCI_MSI
        bool "Message Signaled Interrupts (MSI and MSI-X)"
        depends on PCI
-       depends on (X86_LOCAL_APIC && X86_IO_APIC) || IA64
+       depends on (X86_LOCAL_APIC && X86_IO_APIC) || IA64 || SPARC64
        help
           This allows device drivers to enable MSI (Message Signaled
           Interrupts).  Message Signaled Interrupts enable a device to
index 634f74d919d3d1c8fbc9e0bc5dadc99d5bb5d5b5..a13abf55d7844adba846c7c99c2e23d376e05fec 100644 (file)
@@ -202,7 +202,7 @@ static int release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations debug_ops = {
+static const struct file_operations debug_ops = {
        .owner = THIS_MODULE,
        .open = open,
        .llseek = lseek,
index 05e4f5a1927ac38fa16e629151dcd676705c417d..600ed7b67ae7fab1f748d2d99cfee8a3dc516de4 100644 (file)
@@ -28,7 +28,6 @@
  */
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/mm.h>
 #include <linux/slab.h>
index 84c757ba06644e618a1d925c8d4e99007ef40cbe..8b44cff2c1767f3bef0287eb394b68c9988b9d60 100644 (file)
@@ -744,6 +744,104 @@ int pci_enable_device(struct pci_dev *dev)
        return pci_enable_device_bars(dev, (1 << PCI_NUM_RESOURCES) - 1);
 }
 
+/*
+ * Managed PCI resources.  This manages device on/off, intx/msi/msix
+ * on/off and BAR regions.  pci_dev itself records msi/msix status, so
+ * there's no need to track it separately.  pci_devres is initialized
+ * when a device is enabled using managed PCI device enable interface.
+ */
+struct pci_devres {
+       unsigned int disable:1;
+       unsigned int orig_intx:1;
+       unsigned int restore_intx:1;
+       u32 region_mask;
+};
+
+static void pcim_release(struct device *gendev, void *res)
+{
+       struct pci_dev *dev = container_of(gendev, struct pci_dev, dev);
+       struct pci_devres *this = res;
+       int i;
+
+       if (dev->msi_enabled)
+               pci_disable_msi(dev);
+       if (dev->msix_enabled)
+               pci_disable_msix(dev);
+
+       for (i = 0; i < DEVICE_COUNT_RESOURCE; i++)
+               if (this->region_mask & (1 << i))
+                       pci_release_region(dev, i);
+
+       if (this->restore_intx)
+               pci_intx(dev, this->orig_intx);
+
+       if (this->disable)
+               pci_disable_device(dev);
+}
+
+static struct pci_devres * get_pci_dr(struct pci_dev *pdev)
+{
+       struct pci_devres *dr, *new_dr;
+
+       dr = devres_find(&pdev->dev, pcim_release, NULL, NULL);
+       if (dr)
+               return dr;
+
+       new_dr = devres_alloc(pcim_release, sizeof(*new_dr), GFP_KERNEL);
+       if (!new_dr)
+               return NULL;
+       return devres_get(&pdev->dev, new_dr, NULL, NULL);
+}
+
+static struct pci_devres * find_pci_dr(struct pci_dev *pdev)
+{
+       if (pci_is_managed(pdev))
+               return devres_find(&pdev->dev, pcim_release, NULL, NULL);
+       return NULL;
+}
+
+/**
+ * pcim_enable_device - Managed pci_enable_device()
+ * @pdev: PCI device to be initialized
+ *
+ * Managed pci_enable_device().
+ */
+int pcim_enable_device(struct pci_dev *pdev)
+{
+       struct pci_devres *dr;
+       int rc;
+
+       dr = get_pci_dr(pdev);
+       if (unlikely(!dr))
+               return -ENOMEM;
+       WARN_ON(!!dr->disable);
+
+       rc = pci_enable_device(pdev);
+       if (!rc) {
+               pdev->is_managed = 1;
+               dr->disable = 1;
+       }
+       return rc;
+}
+
+/**
+ * pcim_pin_device - Pin managed PCI device
+ * @pdev: PCI device to pin
+ *
+ * Pin managed PCI device @pdev.  Pinned device won't be disabled on
+ * driver detach.  @pdev must have been enabled with
+ * pcim_enable_device().
+ */
+void pcim_pin_device(struct pci_dev *pdev)
+{
+       struct pci_devres *dr;
+
+       dr = find_pci_dr(pdev);
+       WARN_ON(!dr || !dr->disable);
+       if (dr)
+               dr->disable = 0;
+}
+
 /**
  * pcibios_disable_device - disable arch specific PCI resources for device dev
  * @dev: the PCI device to disable
@@ -767,8 +865,13 @@ void __attribute__ ((weak)) pcibios_disable_device (struct pci_dev *dev) {}
 void
 pci_disable_device(struct pci_dev *dev)
 {
+       struct pci_devres *dr;
        u16 pci_command;
 
+       dr = find_pci_dr(dev);
+       if (dr)
+               dr->disable = 0;
+
        if (atomic_sub_return(1, &dev->enable_cnt) != 0)
                return;
 
@@ -867,6 +970,8 @@ pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge)
  */
 void pci_release_region(struct pci_dev *pdev, int bar)
 {
+       struct pci_devres *dr;
+
        if (pci_resource_len(pdev, bar) == 0)
                return;
        if (pci_resource_flags(pdev, bar) & IORESOURCE_IO)
@@ -875,6 +980,10 @@ void pci_release_region(struct pci_dev *pdev, int bar)
        else if (pci_resource_flags(pdev, bar) & IORESOURCE_MEM)
                release_mem_region(pci_resource_start(pdev, bar),
                                pci_resource_len(pdev, bar));
+
+       dr = find_pci_dr(pdev);
+       if (dr)
+               dr->region_mask &= ~(1 << bar);
 }
 
 /**
@@ -893,6 +1002,8 @@ void pci_release_region(struct pci_dev *pdev, int bar)
  */
 int pci_request_region(struct pci_dev *pdev, int bar, const char *res_name)
 {
+       struct pci_devres *dr;
+
        if (pci_resource_len(pdev, bar) == 0)
                return 0;
                
@@ -906,7 +1017,11 @@ int pci_request_region(struct pci_dev *pdev, int bar, const char *res_name)
                                        pci_resource_len(pdev, bar), res_name))
                        goto err_out;
        }
-       
+
+       dr = find_pci_dr(pdev);
+       if (dr)
+               dr->region_mask |= 1 << bar;
+
        return 0;
 
 err_out:
@@ -1144,7 +1259,15 @@ pci_intx(struct pci_dev *pdev, int enable)
        }
 
        if (new != pci_command) {
+               struct pci_devres *dr;
+
                pci_write_config_word(pdev, PCI_COMMAND, new);
+
+               dr = find_pci_dr(pdev);
+               if (dr && !dr->restore_intx) {
+                       dr->restore_intx = 1;
+                       dr->orig_intx = !enable;
+               }
        }
 }
 
@@ -1226,6 +1349,8 @@ device_initcall(pci_init);
 EXPORT_SYMBOL_GPL(pci_restore_bars);
 EXPORT_SYMBOL(pci_enable_device_bars);
 EXPORT_SYMBOL(pci_enable_device);
+EXPORT_SYMBOL(pcim_enable_device);
+EXPORT_SYMBOL(pcim_pin_device);
 EXPORT_SYMBOL(pci_disable_device);
 EXPORT_SYMBOL(pci_find_capability);
 EXPORT_SYMBOL(pci_bus_find_capability);
index 6f5fabbd14e58f77453c112e9c77850af1d38b52..b164de050d4f2635e129070a3eca66b31343023b 100644 (file)
@@ -220,7 +220,7 @@ static int __devinit aer_probe (struct pcie_device *dev,
        }
 
        /* Request IRQ ISR */
-       if ((status = request_irq(dev->irq, aer_irq, SA_SHIRQ, "aerdrv",
+       if ((status = request_irq(dev->irq, aer_irq, IRQF_SHARED, "aerdrv",
                                dev))) {
                printk(KERN_DEBUG "%s: Request ISR fails on PCIE device[%s]\n",
                        __FUNCTION__, device->bus_id);
index 4a6760a3b31f23a38ad80e4d2a0f3813bc7c5a78..ed87aa59f0b1320f6289eb3d6d3ba2e3ca9f1453 100644 (file)
@@ -287,7 +287,7 @@ static int proc_bus_pci_release(struct inode *inode, struct file *file)
 }
 #endif /* HAVE_PCI_MMAP */
 
-static struct file_operations proc_bus_pci_operations = {
+static const struct file_operations proc_bus_pci_operations = {
        .llseek         = proc_bus_pci_lseek,
        .read           = proc_bus_pci_read,
        .write          = proc_bus_pci_write,
@@ -456,7 +456,7 @@ static int proc_bus_pci_dev_open(struct inode *inode, struct file *file)
 {
        return seq_open(file, &proc_bus_pci_devices_op);
 }
-static struct file_operations proc_bus_pci_dev_operations = {
+static const struct file_operations proc_bus_pci_dev_operations = {
        .open           = proc_bus_pci_dev_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index 11217bda4b9ef1c98003bd50f16d92a90c42db39..1e6eda25c0d82c800cf260a832209ee70899d9b7 100644 (file)
@@ -871,7 +871,7 @@ static void __devinit quirk_sb600_sata(struct pci_dev *pdev)
                pci_write_config_byte(pdev, 0xa, 6);
                pci_write_config_byte(pdev, 0x40, tmp);
 
-               pdev->class = 0x010601;
+               pdev->class = PCI_CLASS_STORAGE_SATA_AHCI;
        }
 }
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP600_SATA, quirk_sb600_sata);
index 87fafc08cb9d6a3f31f861c29d260d842ae141d0..9d37fec27f24668d1ede8229439b82bb36561b61 100644 (file)
@@ -7,7 +7,6 @@
  * magic northbridge registers..
  */
 
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/pci.h>
 #include <linux/smp_lock.h>
index 3334f22a86c0617f3a16471db8ffb064fadecbf9..b3186283753423971255294795b76b329841f5c3 100644 (file)
@@ -11,7 +11,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/platform_device.h>
 #include <linux/errno.h>
 #include <linux/init.h>
index 912c03e5eb0a3d66448da64a26416d3d8a546dcf..d154dee76e7f5af7689cd9e644c3b111c859dd5b 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/timer.h>
 #include <linux/slab.h>
 #include <linux/mm.h>
-#include <linux/sched.h>
 #include <linux/pci.h>
 #include <linux/ioport.h>
 #include <asm/io.h>
index 72ff2f615b3367a40765efce691568b123562472..71b33707117fb8b73c3518135cfc0b70a01b18e0 100644 (file)
@@ -40,7 +40,6 @@
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/timer.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
index 3c22ac4625c21ef1bec7c386cf2f2ca0c00beb16..e4a94108aab9578b0897510c6bc6e9a5196e1b5a 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/timer.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
index 4dbef07623764f421e2a01d7713d650b4df42aef..67d28ee80f220bc4e119b1ac2ebe9639e2459c46 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/timer.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
index 3b72be880401398d93b6465c82333aa84af5e585..d059c9196172330ca02b307bc6ea51236fa73f0b 100644 (file)
@@ -46,7 +46,6 @@
 
 #include <linux/kernel.h>
 #include <linux/errno.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/timer.h>
 #include <linux/ioport.h>
index e65a6b8188f6c896d715f56b71f09b05618a7a3c..76f7cbc62a8b95311ccc52ad610b45fecb39ff79 100644 (file)
@@ -11,7 +11,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/platform_device.h>
 #include <linux/errno.h>
 #include <linux/init.h>
index 88494149e9101d069ebdd0c96ec0c3c0a82940a3..27523c5f4dad50a9fd9de15ff768257945716d99 100644 (file)
@@ -765,7 +765,7 @@ free_out:
 
 /*====================================================================*/
 
-static struct file_operations ds_fops = {
+static const struct file_operations ds_fops = {
        .owner          = THIS_MODULE,
        .open           = ds_open,
        .release        = ds_release,
index a92f11143c433df11b7f14f51ef9e39d3bd0c360..5e9b9a3fd027c062f4276dba2b090f4865e4d77b 100644 (file)
@@ -16,7 +16,6 @@
  */
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/device.h>
 #include <linux/errno.h>
 #include <linux/init.h>
index 19b1e127622060dc9a0eacff062f0ec9c2bd852e..62bfc7566ec2a927396bbe48f993b5502fd63d16 100644 (file)
@@ -14,7 +14,6 @@
  */
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/device.h>
 #include <linux/errno.h>
 #include <linux/init.h>
index eb89928f2338a52077f47b1c34158aaf20ed16c5..549a1529fe35800e9c6034a6a4940dcf3460caab 100644 (file)
@@ -7,7 +7,6 @@
  */
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/device.h>
 #include <linux/init.h>
 #include <linux/delay.h>
index 64fd5e37f2d22d12617bc6066dcaab33a6e95098..e5491879acd9191a962293b0c83b12b65637b4e1 100644 (file)
@@ -6,7 +6,6 @@
  */
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/device.h>
 #include <linux/interrupt.h>
 #include <linux/init.h>
index 7a87298bae993f0cadc5676a377f4ae2b65851c9..af485ae386024fbf560d260b52a83db25e1a5b2f 100644 (file)
@@ -6,7 +6,6 @@
  */
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/device.h>
 #include <linux/errno.h>
 #include <linux/init.h>
index 5e34b3e8e5db4acb3e3a3f888e1ce646421403ff..5bc9e9532b9d78f48f00ecd94fdcd5211118bd46 100644 (file)
@@ -5,7 +5,6 @@
  */
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/device.h>
 #include <linux/errno.h>
 #include <linux/init.h>
index 7bc9e59c761f732c5b2fa737a996db4fc031460a..9456f5478d09251178534d354a947ffd38032be3 100644 (file)
@@ -6,7 +6,6 @@
  */
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/device.h>
 #include <linux/init.h>
 
index c2ecf1185e9e02f7df4aebe937d1c4aadc11fd3b..04d6f7f75f7806b6ea8fc66f4bc34b4163bbb3c3 100644 (file)
@@ -6,7 +6,6 @@
  */
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/device.h>
 #include <linux/init.h>
 
index e90d8e8c5fd686068aab91962cad29d89c5f10ad..206e26c918076bd578497429b7c1788997a0f661 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/spinlock.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/platform_device.h>
 
index a61d768f6e0ef063a0c9a631cac70f2add6c8d3b..20853a03202d16b2b6c8321ab715651d8274839f 100644 (file)
@@ -12,7 +12,6 @@
  */
 #include <linux/init.h>
 #include <linux/pci.h>
-#include <linux/sched.h>
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
index 6b8c4cfd02a697a5f8e8f6dc68ab4ae7ed890b0d..31a633f6554769c46cd5676d13a758a104137738 100644 (file)
@@ -1,4 +1,3 @@
-extern struct bus_type pnp_bus_type;
 extern spinlock_t pnp_lock;
 void *pnp_alloc(long size);
 int pnp_interface_attach_device(struct pnp_dev *dev);
index d21f3c1e72fc1fed3066e71e5674a799c8951bfd..40b724ebe23bd1ce8e1bba713beb022df61b7036 100644 (file)
@@ -85,7 +85,7 @@ static ssize_t isapnp_proc_bus_read(struct file *file, char __user *buf, size_t
        return nbytes;
 }
 
-static struct file_operations isapnp_proc_bus_file_operations =
+static const struct file_operations isapnp_proc_bus_file_operations =
 {
        .llseek         = isapnp_proc_bus_lseek,
        .read           = isapnp_proc_bus_read,
index ad27e5e0101fd178bc9dbeeb84a94e855f0fc89e..b04767ce273e977d873cf19726afff22b6f87cb3 100644 (file)
@@ -2,17 +2,5 @@
 # Plug and Play ACPI configuration
 #
 config PNPACPI
-       bool "Plug and Play ACPI support"
-       depends on PNP && ACPI
-       default y
-       ---help---
-         Linux uses the PNPACPI to autodetect built-in
-         mainboard resources (e.g. parallel port resources).
-
-          Some features (e.g. real hotplug) are not currently
-          implemented.
-
-          If you would like the kernel to detect and allocate resources to
-          your mainboard devices (on some systems they are disabled by the
-          BIOS) say Y here.  Also the PNPACPI can help prevent resource
-          conflicts between mainboard devices and other bus devices.
+       bool
+       default (PNP && ACPI)
index 95b79685a9d1e1f72dbe6b36f68748c60c7bd034..3c2ab8394e3f987b71a555461e98c3c0b1a58e3e 100644 (file)
@@ -530,7 +530,6 @@ pnpbios_parse_compatible_ids(unsigned char *p, unsigned char *end, struct pnp_de
                        dev_id =  kzalloc(sizeof (struct pnp_id), GFP_KERNEL);
                        if (!dev_id)
                                return NULL;
-                       memset(dev_id, 0, sizeof(struct pnp_id));
                        pnpid32_to_pnpid(p[1] | p[2] << 8 | p[3] << 16 | p[4] << 24,id);
                        memcpy(&dev_id->id, id, 7);
                        pnp_add_id(dev_id, dev);
index d547cf50ca9dc913a51a0ae2ba52f1e2e2509dd0..96958c03cf61f54fa8be4c54d4a8acfcb91d5541 100644 (file)
@@ -1 +1,2 @@
 obj-$(CONFIG_PS3_VUART) += vuart.o
+obj-$(CONFIG_PS3_PS3AV) += ps3av.o ps3av_cmd.o
diff --git a/drivers/ps3/ps3av.c b/drivers/ps3/ps3av.c
new file mode 100644 (file)
index 0000000..1926b4d
--- /dev/null
@@ -0,0 +1,974 @@
+/*
+ * Copyright (C) 2006 Sony Computer Entertainment Inc.
+ * Copyright 2006, 2007 Sony Corporation
+ *
+ * AV backend support for PS3
+ *
+ * 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.
+ *
+ * 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/delay.h>
+#include <linux/notifier.h>
+#include <linux/reboot.h>
+#include <linux/kernel.h>
+#include <linux/ioctl.h>
+#include <asm/lv1call.h>
+#include <asm/ps3av.h>
+#include <asm/ps3.h>
+
+#include "vuart.h"
+
+#define BUFSIZE          4096  /* vuart buf size */
+#define PS3AV_BUF_SIZE   512   /* max packet size */
+
+static int timeout = 5000;     /* in msec ( 5 sec ) */
+module_param(timeout, int, 0644);
+
+static struct ps3av ps3av;
+
+static struct ps3_vuart_port_device ps3av_dev = {
+       .match_id = PS3_MATCH_ID_AV_SETTINGS
+};
+
+/* color space */
+#define YUV444 PS3AV_CMD_VIDEO_CS_YUV444_8
+#define RGB8   PS3AV_CMD_VIDEO_CS_RGB_8
+/* format */
+#define XRGB   PS3AV_CMD_VIDEO_FMT_X8R8G8B8
+/* aspect */
+#define A_N    PS3AV_CMD_AV_ASPECT_4_3
+#define A_W    PS3AV_CMD_AV_ASPECT_16_9
+static const struct avset_video_mode {
+       u32 cs;
+       u32 fmt;
+       u32 vid;
+       u32 aspect;
+       u32 x;
+       u32 y;
+       u32 interlace;
+       u32 freq;
+} video_mode_table[] = {
+       {     0, }, /* auto */
+       {YUV444, XRGB, PS3AV_CMD_VIDEO_VID_480I,       A_N,  720,  480, 1, 60},
+       {YUV444, XRGB, PS3AV_CMD_VIDEO_VID_480P,       A_N,  720,  480, 0, 60},
+       {YUV444, XRGB, PS3AV_CMD_VIDEO_VID_720P_60HZ,  A_N, 1280,  720, 0, 60},
+       {YUV444, XRGB, PS3AV_CMD_VIDEO_VID_1080I_60HZ, A_W, 1920, 1080, 1, 60},
+       {YUV444, XRGB, PS3AV_CMD_VIDEO_VID_1080P_60HZ, A_W, 1920, 1080, 0, 60},
+       {YUV444, XRGB, PS3AV_CMD_VIDEO_VID_576I,       A_N,  720,  576, 1, 50},
+       {YUV444, XRGB, PS3AV_CMD_VIDEO_VID_576P,       A_N,  720,  576, 0, 50},
+       {YUV444, XRGB, PS3AV_CMD_VIDEO_VID_720P_50HZ,  A_N, 1280,  720, 0, 50},
+       {YUV444, XRGB, PS3AV_CMD_VIDEO_VID_1080I_50HZ, A_W, 1920, 1080, 1, 50},
+       {YUV444, XRGB, PS3AV_CMD_VIDEO_VID_1080P_50HZ, A_W, 1920, 1080, 0, 50},
+       {  RGB8, XRGB, PS3AV_CMD_VIDEO_VID_WXGA,       A_W, 1280,  768, 0, 60},
+       {  RGB8, XRGB, PS3AV_CMD_VIDEO_VID_SXGA,       A_N, 1280, 1024, 0, 60},
+       {  RGB8, XRGB, PS3AV_CMD_VIDEO_VID_WUXGA,      A_W, 1920, 1200, 0, 60},
+};
+
+/* supported CIDs */
+static u32 cmd_table[] = {
+       /* init */
+       PS3AV_CID_AV_INIT,
+       PS3AV_CID_AV_FIN,
+       PS3AV_CID_VIDEO_INIT,
+       PS3AV_CID_AUDIO_INIT,
+
+       /* set */
+       PS3AV_CID_AV_ENABLE_EVENT,
+       PS3AV_CID_AV_DISABLE_EVENT,
+
+       PS3AV_CID_AV_VIDEO_CS,
+       PS3AV_CID_AV_VIDEO_MUTE,
+       PS3AV_CID_AV_VIDEO_DISABLE_SIG,
+       PS3AV_CID_AV_AUDIO_PARAM,
+       PS3AV_CID_AV_AUDIO_MUTE,
+       PS3AV_CID_AV_HDMI_MODE,
+       PS3AV_CID_AV_TV_MUTE,
+
+       PS3AV_CID_VIDEO_MODE,
+       PS3AV_CID_VIDEO_FORMAT,
+       PS3AV_CID_VIDEO_PITCH,
+
+       PS3AV_CID_AUDIO_MODE,
+       PS3AV_CID_AUDIO_MUTE,
+       PS3AV_CID_AUDIO_ACTIVE,
+       PS3AV_CID_AUDIO_INACTIVE,
+       PS3AV_CID_AVB_PARAM,
+
+       /* get */
+       PS3AV_CID_AV_GET_HW_CONF,
+       PS3AV_CID_AV_GET_MONITOR_INFO,
+
+       /* event */
+       PS3AV_CID_EVENT_UNPLUGGED,
+       PS3AV_CID_EVENT_PLUGGED,
+       PS3AV_CID_EVENT_HDCP_DONE,
+       PS3AV_CID_EVENT_HDCP_FAIL,
+       PS3AV_CID_EVENT_HDCP_AUTH,
+       PS3AV_CID_EVENT_HDCP_ERROR,
+
+       0
+};
+
+#define PS3AV_EVENT_CMD_MASK           0x10000000
+#define PS3AV_EVENT_ID_MASK            0x0000ffff
+#define PS3AV_CID_MASK                 0xffffffff
+#define PS3AV_REPLY_BIT                0x80000000
+
+#define ps3av_event_get_port_id(cid)   ((cid >> 16) & 0xff)
+
+static u32 *ps3av_search_cmd_table(u32 cid, u32 mask)
+{
+       u32 *table;
+       int i;
+
+       table = cmd_table;
+       for (i = 0;; table++, i++) {
+               if ((*table & mask) == (cid & mask))
+                       break;
+               if (*table == 0)
+                       return NULL;
+       }
+       return table;
+}
+
+static int ps3av_parse_event_packet(const struct ps3av_reply_hdr *hdr)
+{
+       u32 *table;
+
+       if (hdr->cid & PS3AV_EVENT_CMD_MASK) {
+               table = ps3av_search_cmd_table(hdr->cid, PS3AV_EVENT_CMD_MASK);
+               if (table)
+                       dev_dbg(&ps3av_dev.core,
+                               "recv event packet cid:%08x port:0x%x size:%d\n",
+                               hdr->cid, ps3av_event_get_port_id(hdr->cid),
+                               hdr->size);
+               else
+                       printk(KERN_ERR
+                              "%s: failed event packet, cid:%08x size:%d\n",
+                              __FUNCTION__, hdr->cid, hdr->size);
+               return 1;       /* receive event packet */
+       }
+       return 0;
+}
+
+static int ps3av_send_cmd_pkt(const struct ps3av_send_hdr *send_buf,
+                             struct ps3av_reply_hdr *recv_buf, int write_len,
+                             int read_len)
+{
+       int res;
+       u32 cmd;
+       int event;
+
+       if (!ps3av.available)
+               return -ENODEV;
+
+       /* send pkt */
+       res = ps3av_vuart_write(ps3av.dev, send_buf, write_len);
+       if (res < 0) {
+               dev_dbg(&ps3av_dev.core,
+                       "%s: ps3av_vuart_write() failed (result=%d)\n",
+                       __FUNCTION__, res);
+               return res;
+       }
+
+       /* recv pkt */
+       cmd = send_buf->cid;
+       do {
+               /* read header */
+               res = ps3av_vuart_read(ps3av.dev, recv_buf, PS3AV_HDR_SIZE,
+                                      timeout);
+               if (res != PS3AV_HDR_SIZE) {
+                       dev_dbg(&ps3av_dev.core,
+                               "%s: ps3av_vuart_read() failed (result=%d)\n",
+                               __FUNCTION__, res);
+                       return res;
+               }
+
+               /* read body */
+               res = ps3av_vuart_read(ps3av.dev, &recv_buf->cid,
+                                      recv_buf->size, timeout);
+               if (res < 0) {
+                       dev_dbg(&ps3av_dev.core,
+                               "%s: ps3av_vuart_read() failed (result=%d)\n",
+                               __FUNCTION__, res);
+                       return res;
+               }
+               res += PS3AV_HDR_SIZE;  /* total len */
+               event = ps3av_parse_event_packet(recv_buf);
+               /* ret > 0 event packet */
+       } while (event);
+
+       if ((cmd | PS3AV_REPLY_BIT) != recv_buf->cid) {
+               dev_dbg(&ps3av_dev.core, "%s: reply err (result=%x)\n",
+                       __FUNCTION__, recv_buf->cid);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+static int ps3av_process_reply_packet(struct ps3av_send_hdr *cmd_buf,
+                                     const struct ps3av_reply_hdr *recv_buf,
+                                     int user_buf_size)
+{
+       int return_len;
+
+       if (recv_buf->version != PS3AV_VERSION) {
+               dev_dbg(&ps3av_dev.core, "reply_packet invalid version:%x\n",
+                       recv_buf->version);
+               return -EFAULT;
+       }
+       return_len = recv_buf->size + PS3AV_HDR_SIZE;
+       if (return_len > user_buf_size)
+               return_len = user_buf_size;
+       memcpy(cmd_buf, recv_buf, return_len);
+       return 0;               /* success */
+}
+
+void ps3av_set_hdr(u32 cid, u16 size, struct ps3av_send_hdr *hdr)
+{
+       hdr->version = PS3AV_VERSION;
+       hdr->size = size - PS3AV_HDR_SIZE;
+       hdr->cid = cid;
+}
+
+int ps3av_do_pkt(u32 cid, u16 send_len, size_t usr_buf_size,
+                struct ps3av_send_hdr *buf)
+{
+       int res = 0;
+       union {
+               struct ps3av_reply_hdr reply_hdr;
+               u8 raw[PS3AV_BUF_SIZE];
+       } recv_buf;
+
+       u32 *table;
+
+       BUG_ON(!ps3av.available);
+
+       if (down_interruptible(&ps3av.sem))
+               return -ERESTARTSYS;
+
+       table = ps3av_search_cmd_table(cid, PS3AV_CID_MASK);
+       BUG_ON(!table);
+       BUG_ON(send_len < PS3AV_HDR_SIZE);
+       BUG_ON(usr_buf_size < send_len);
+       BUG_ON(usr_buf_size > PS3AV_BUF_SIZE);
+
+       /* create header */
+       ps3av_set_hdr(cid, send_len, buf);
+
+       /* send packet via vuart */
+       res = ps3av_send_cmd_pkt(buf, &recv_buf.reply_hdr, send_len,
+                                usr_buf_size);
+       if (res < 0) {
+               printk(KERN_ERR
+                      "%s: ps3av_send_cmd_pkt() failed (result=%d)\n",
+                      __FUNCTION__, res);
+               goto err;
+       }
+
+       /* process reply packet */
+       res = ps3av_process_reply_packet(buf, &recv_buf.reply_hdr,
+                                        usr_buf_size);
+       if (res < 0) {
+               printk(KERN_ERR "%s: put_return_status() failed (result=%d)\n",
+                      __FUNCTION__, res);
+               goto err;
+       }
+
+       up(&ps3av.sem);
+       return 0;
+
+      err:
+       up(&ps3av.sem);
+       printk(KERN_ERR "%s: failed cid:%x res:%d\n", __FUNCTION__, cid, res);
+       return res;
+}
+
+static int ps3av_set_av_video_mute(u32 mute)
+{
+       int i, num_of_av_port, res;
+
+       num_of_av_port = ps3av.av_hw_conf.num_of_hdmi +
+                        ps3av.av_hw_conf.num_of_avmulti;
+       /* video mute on */
+       for (i = 0; i < num_of_av_port; i++) {
+               res = ps3av_cmd_av_video_mute(1, &ps3av.av_port[i], mute);
+               if (res < 0)
+                       return -1;
+       }
+
+       return 0;
+}
+
+static int ps3av_set_video_disable_sig(void)
+{
+       int i, num_of_hdmi_port, num_of_av_port, res;
+
+       num_of_hdmi_port = ps3av.av_hw_conf.num_of_hdmi;
+       num_of_av_port = ps3av.av_hw_conf.num_of_hdmi +
+                        ps3av.av_hw_conf.num_of_avmulti;
+
+       /* tv mute */
+       for (i = 0; i < num_of_hdmi_port; i++) {
+               res = ps3av_cmd_av_tv_mute(ps3av.av_port[i],
+                                          PS3AV_CMD_MUTE_ON);
+               if (res < 0)
+                       return -1;
+       }
+       msleep(100);
+
+       /* video mute on */
+       for (i = 0; i < num_of_av_port; i++) {
+               res = ps3av_cmd_av_video_disable_sig(ps3av.av_port[i]);
+               if (res < 0)
+                       return -1;
+               if (i < num_of_hdmi_port) {
+                       res = ps3av_cmd_av_tv_mute(ps3av.av_port[i],
+                                                  PS3AV_CMD_MUTE_OFF);
+                       if (res < 0)
+                               return -1;
+               }
+       }
+       msleep(300);
+
+       return 0;
+}
+
+static int ps3av_set_audio_mute(u32 mute)
+{
+       int i, num_of_av_port, num_of_opt_port, res;
+
+       num_of_av_port = ps3av.av_hw_conf.num_of_hdmi +
+                        ps3av.av_hw_conf.num_of_avmulti;
+       num_of_opt_port = ps3av.av_hw_conf.num_of_spdif;
+
+       for (i = 0; i < num_of_av_port; i++) {
+               res = ps3av_cmd_av_audio_mute(1, &ps3av.av_port[i], mute);
+               if (res < 0)
+                       return -1;
+       }
+       for (i = 0; i < num_of_opt_port; i++) {
+               res = ps3av_cmd_audio_mute(1, &ps3av.opt_port[i], mute);
+               if (res < 0)
+                       return -1;
+       }
+
+       return 0;
+}
+
+int ps3av_set_audio_mode(u32 ch, u32 fs, u32 word_bits, u32 format, u32 source)
+{
+       struct ps3av_pkt_avb_param avb_param;
+       int i, num_of_audio, vid, res;
+       struct ps3av_pkt_audio_mode audio_mode;
+       u32 len = 0;
+
+       num_of_audio = ps3av.av_hw_conf.num_of_hdmi +
+                      ps3av.av_hw_conf.num_of_avmulti +
+                      ps3av.av_hw_conf.num_of_spdif;
+
+       avb_param.num_of_video_pkt = 0;
+       avb_param.num_of_audio_pkt = PS3AV_AVB_NUM_AUDIO;       /* always 0 */
+       avb_param.num_of_av_video_pkt = 0;
+       avb_param.num_of_av_audio_pkt = ps3av.av_hw_conf.num_of_hdmi;
+
+       vid = video_mode_table[ps3av.ps3av_mode].vid;
+
+       /* audio mute */
+       ps3av_set_audio_mute(PS3AV_CMD_MUTE_ON);
+
+       /* audio inactive */
+       res = ps3av_cmd_audio_active(0, ps3av.audio_port);
+       if (res < 0)
+               dev_dbg(&ps3av_dev.core,
+                       "ps3av_cmd_audio_active OFF failed\n");
+
+       /* audio_pkt */
+       for (i = 0; i < num_of_audio; i++) {
+               ps3av_cmd_set_audio_mode(&audio_mode, ps3av.av_port[i], ch, fs,
+                                        word_bits, format, source);
+               if (i < ps3av.av_hw_conf.num_of_hdmi) {
+                       /* hdmi only */
+                       len += ps3av_cmd_set_av_audio_param(&avb_param.buf[len],
+                                                           ps3av.av_port[i],
+                                                           &audio_mode, vid);
+               }
+               /* audio_mode pkt should be sent separately */
+               res = ps3av_cmd_audio_mode(&audio_mode);
+               if (res < 0)
+                       dev_dbg(&ps3av_dev.core,
+                               "ps3av_cmd_audio_mode failed, port:%x\n", i);
+       }
+
+       /* send command using avb pkt */
+       len += offsetof(struct ps3av_pkt_avb_param, buf);
+       res = ps3av_cmd_avb_param(&avb_param, len);
+       if (res < 0)
+               dev_dbg(&ps3av_dev.core, "ps3av_cmd_avb_param failed\n");
+
+       /* audio mute */
+       ps3av_set_audio_mute(PS3AV_CMD_MUTE_OFF);
+
+       /* audio active */
+       res = ps3av_cmd_audio_active(1, ps3av.audio_port);
+       if (res < 0)
+               dev_dbg(&ps3av_dev.core, "ps3av_cmd_audio_active ON failed\n");
+
+       return 0;
+}
+
+EXPORT_SYMBOL_GPL(ps3av_set_audio_mode);
+
+static int ps3av_set_videomode(void)
+{
+       /* av video mute */
+       ps3av_set_av_video_mute(PS3AV_CMD_MUTE_ON);
+
+       /* wake up ps3avd to do the actual video mode setting */
+       up(&ps3av.ping);
+
+       return 0;
+}
+
+static void ps3av_set_videomode_cont(u32 id, u32 old_id)
+{
+       struct ps3av_pkt_avb_param avb_param;
+       int i;
+       u32 len = 0, av_video_cs;
+       const struct avset_video_mode *video_mode;
+       int res;
+
+       video_mode = &video_mode_table[id & PS3AV_MODE_MASK];
+
+       avb_param.num_of_video_pkt = PS3AV_AVB_NUM_VIDEO;       /* num of head */
+       avb_param.num_of_audio_pkt = 0;
+       avb_param.num_of_av_video_pkt = ps3av.av_hw_conf.num_of_hdmi +
+                                       ps3av.av_hw_conf.num_of_avmulti;
+       avb_param.num_of_av_audio_pkt = 0;
+
+       /* video signal off */
+       ps3av_set_video_disable_sig();
+
+       /* Retail PS3 product doesn't support this */
+       if (id & PS3AV_MODE_HDCP_OFF) {
+               res = ps3av_cmd_av_hdmi_mode(PS3AV_CMD_AV_HDMI_HDCP_OFF);
+               if (res == PS3AV_STATUS_UNSUPPORTED_HDMI_MODE)
+                       dev_dbg(&ps3av_dev.core, "Not supported\n");
+               else if (res)
+                       dev_dbg(&ps3av_dev.core,
+                               "ps3av_cmd_av_hdmi_mode failed\n");
+       } else if (old_id & PS3AV_MODE_HDCP_OFF) {
+               res = ps3av_cmd_av_hdmi_mode(PS3AV_CMD_AV_HDMI_MODE_NORMAL);
+               if (res < 0 && res != PS3AV_STATUS_UNSUPPORTED_HDMI_MODE)
+                       dev_dbg(&ps3av_dev.core,
+                               "ps3av_cmd_av_hdmi_mode failed\n");
+       }
+
+       /* video_pkt */
+       for (i = 0; i < avb_param.num_of_video_pkt; i++)
+               len += ps3av_cmd_set_video_mode(&avb_param.buf[len],
+                                               ps3av.head[i], video_mode->vid,
+                                               video_mode->fmt, id);
+       /* av_video_pkt */
+       for (i = 0; i < avb_param.num_of_av_video_pkt; i++) {
+               if (id & PS3AV_MODE_DVI || id & PS3AV_MODE_RGB)
+                       av_video_cs = RGB8;
+               else
+                       av_video_cs = video_mode->cs;
+#ifndef PS3AV_HDMI_YUV
+               if (ps3av.av_port[i] == PS3AV_CMD_AVPORT_HDMI_0 ||
+                   ps3av.av_port[i] == PS3AV_CMD_AVPORT_HDMI_1)
+                       av_video_cs = RGB8;     /* use RGB for HDMI */
+#endif
+               len += ps3av_cmd_set_av_video_cs(&avb_param.buf[len],
+                                                ps3av.av_port[i],
+                                                video_mode->vid, av_video_cs,
+                                                video_mode->aspect, id);
+       }
+       /* send command using avb pkt */
+       len += offsetof(struct ps3av_pkt_avb_param, buf);
+       res = ps3av_cmd_avb_param(&avb_param, len);
+       if (res == PS3AV_STATUS_NO_SYNC_HEAD)
+               printk(KERN_WARNING
+                      "%s: Command failed. Please try your request again. \n",
+                      __FUNCTION__);
+       else if (res)
+               dev_dbg(&ps3av_dev.core, "ps3av_cmd_avb_param failed\n");
+
+       msleep(1500);
+       /* av video mute */
+       ps3av_set_av_video_mute(PS3AV_CMD_MUTE_OFF);
+}
+
+static int ps3avd(void *p)
+{
+       struct ps3av *info = p;
+
+       daemonize("ps3avd");
+       while (1) {
+               down(&info->ping);
+               ps3av_set_videomode_cont(info->ps3av_mode,
+                                        info->ps3av_mode_old);
+               up(&info->pong);
+       }
+       return 0;
+}
+
+static int ps3av_vid2table_id(int vid)
+{
+       int i;
+
+       for (i = 1; i < ARRAY_SIZE(video_mode_table); i++)
+               if (video_mode_table[i].vid == vid)
+                       return i;
+       return -1;
+}
+
+static int ps3av_resbit2vid(u32 res_50, u32 res_60)
+{
+       int vid = -1;
+
+       if (res_50 > res_60) {  /* if res_50 == res_60, res_60 will be used */
+               if (res_50 & PS3AV_RESBIT_1920x1080P)
+                       vid = PS3AV_CMD_VIDEO_VID_1080P_50HZ;
+               else if (res_50 & PS3AV_RESBIT_1920x1080I)
+                       vid = PS3AV_CMD_VIDEO_VID_1080I_50HZ;
+               else if (res_50 & PS3AV_RESBIT_1280x720P)
+                       vid = PS3AV_CMD_VIDEO_VID_720P_50HZ;
+               else if (res_50 & PS3AV_RESBIT_720x576P)
+                       vid = PS3AV_CMD_VIDEO_VID_576P;
+               else
+                       vid = -1;
+       } else {
+               if (res_60 & PS3AV_RESBIT_1920x1080P)
+                       vid = PS3AV_CMD_VIDEO_VID_1080P_60HZ;
+               else if (res_60 & PS3AV_RESBIT_1920x1080I)
+                       vid = PS3AV_CMD_VIDEO_VID_1080I_60HZ;
+               else if (res_60 & PS3AV_RESBIT_1280x720P)
+                       vid = PS3AV_CMD_VIDEO_VID_720P_60HZ;
+               else if (res_60 & PS3AV_RESBIT_720x480P)
+                       vid = PS3AV_CMD_VIDEO_VID_480P;
+               else
+                       vid = -1;
+       }
+       return vid;
+}
+
+static int ps3av_hdmi_get_vid(struct ps3av_info_monitor *info)
+{
+       u32 res_50, res_60;
+       int vid = -1;
+
+       if (info->monitor_type != PS3AV_MONITOR_TYPE_HDMI)
+               return -1;
+
+       /* check native resolution */
+       res_50 = info->res_50.native & PS3AV_RES_MASK_50;
+       res_60 = info->res_60.native & PS3AV_RES_MASK_60;
+       if (res_50 || res_60) {
+               vid = ps3av_resbit2vid(res_50, res_60);
+               return vid;
+       }
+
+       /* check resolution */
+       res_50 = info->res_50.res_bits & PS3AV_RES_MASK_50;
+       res_60 = info->res_60.res_bits & PS3AV_RES_MASK_60;
+       if (res_50 || res_60) {
+               vid = ps3av_resbit2vid(res_50, res_60);
+               return vid;
+       }
+
+       if (ps3av.region & PS3AV_REGION_60)
+               vid = PS3AV_DEFAULT_HDMI_VID_REG_60;
+       else
+               vid = PS3AV_DEFAULT_HDMI_VID_REG_50;
+       return vid;
+}
+
+static int ps3av_auto_videomode(struct ps3av_pkt_av_get_hw_conf *av_hw_conf,
+                               int boot)
+{
+       int i, res, vid = -1, dvi = 0, rgb = 0;
+       struct ps3av_pkt_av_get_monitor_info monitor_info;
+       struct ps3av_info_monitor *info;
+
+       /* get vid for hdmi */
+       for (i = 0; i < av_hw_conf->num_of_hdmi; i++) {
+               res = ps3av_cmd_video_get_monitor_info(&monitor_info,
+                                                      PS3AV_CMD_AVPORT_HDMI_0 +
+                                                      i);
+               if (res < 0)
+                       return -1;
+
+               ps3av_cmd_av_monitor_info_dump(&monitor_info);
+               info = &monitor_info.info;
+               /* check DVI */
+               if (info->monitor_type == PS3AV_MONITOR_TYPE_DVI) {
+                       dvi = PS3AV_MODE_DVI;
+                       break;
+               }
+               /* check HDMI */
+               vid = ps3av_hdmi_get_vid(info);
+               if (vid != -1) {
+                       /* got valid vid */
+                       break;
+               }
+       }
+
+       if (dvi) {
+               /* DVI mode */
+               vid = PS3AV_DEFAULT_DVI_VID;
+       } else if (vid == -1) {
+               /* no HDMI interface or HDMI is off */
+               if (ps3av.region & PS3AV_REGION_60)
+                       vid = PS3AV_DEFAULT_AVMULTI_VID_REG_60;
+               else
+                       vid = PS3AV_DEFAULT_AVMULTI_VID_REG_50;
+               if (ps3av.region & PS3AV_REGION_RGB)
+                       rgb = PS3AV_MODE_RGB;
+       } else if (boot) {
+               /* HDMI: using DEFAULT HDMI_VID while booting up */
+               info = &monitor_info.info;
+               if (ps3av.region & PS3AV_REGION_60) {
+                       if (info->res_60.res_bits & PS3AV_RESBIT_720x480P)
+                               vid = PS3AV_DEFAULT_HDMI_VID_REG_60;
+                       else if (info->res_50.res_bits & PS3AV_RESBIT_720x576P)
+                               vid = PS3AV_DEFAULT_HDMI_VID_REG_50;
+                       else {
+                               /* default */
+                               vid = PS3AV_DEFAULT_HDMI_VID_REG_60;
+                       }
+               } else {
+                       if (info->res_50.res_bits & PS3AV_RESBIT_720x576P)
+                               vid = PS3AV_DEFAULT_HDMI_VID_REG_50;
+                       else if (info->res_60.res_bits & PS3AV_RESBIT_720x480P)
+                               vid = PS3AV_DEFAULT_HDMI_VID_REG_60;
+                       else {
+                               /* default */
+                               vid = PS3AV_DEFAULT_HDMI_VID_REG_50;
+                       }
+               }
+       }
+
+       return (ps3av_vid2table_id(vid) | dvi | rgb);
+}
+
+static int ps3av_get_hw_conf(struct ps3av *ps3av)
+{
+       int i, j, k, res;
+
+       /* get av_hw_conf */
+       res = ps3av_cmd_av_get_hw_conf(&ps3av->av_hw_conf);
+       if (res < 0)
+               return -1;
+
+       ps3av_cmd_av_hw_conf_dump(&ps3av->av_hw_conf);
+
+       for (i = 0; i < PS3AV_HEAD_MAX; i++)
+               ps3av->head[i] = PS3AV_CMD_VIDEO_HEAD_A + i;
+       for (i = 0; i < PS3AV_OPT_PORT_MAX; i++)
+               ps3av->opt_port[i] = PS3AV_CMD_AVPORT_SPDIF_0 + i;
+       for (i = 0; i < ps3av->av_hw_conf.num_of_hdmi; i++)
+               ps3av->av_port[i] = PS3AV_CMD_AVPORT_HDMI_0 + i;
+       for (j = 0; j < ps3av->av_hw_conf.num_of_avmulti; j++)
+               ps3av->av_port[i + j] = PS3AV_CMD_AVPORT_AVMULTI_0 + j;
+       for (k = 0; k < ps3av->av_hw_conf.num_of_spdif; k++)
+               ps3av->av_port[i + j + k] = PS3AV_CMD_AVPORT_SPDIF_0 + k;
+
+       /* set all audio port */
+       ps3av->audio_port = PS3AV_CMD_AUDIO_PORT_HDMI_0
+           | PS3AV_CMD_AUDIO_PORT_HDMI_1
+           | PS3AV_CMD_AUDIO_PORT_AVMULTI_0
+           | PS3AV_CMD_AUDIO_PORT_SPDIF_0 | PS3AV_CMD_AUDIO_PORT_SPDIF_1;
+
+       return 0;
+}
+
+/* set mode using id */
+int ps3av_set_video_mode(u32 id, int boot)
+{
+       int size;
+       u32 option;
+
+       size = ARRAY_SIZE(video_mode_table);
+       if ((id & PS3AV_MODE_MASK) > size - 1 || id < 0) {
+               dev_dbg(&ps3av_dev.core, "%s: error id :%d\n", __FUNCTION__,
+                       id);
+               return -EINVAL;
+       }
+
+       /* auto mode */
+       option = id & ~PS3AV_MODE_MASK;
+       if ((id & PS3AV_MODE_MASK) == 0) {
+               id = ps3av_auto_videomode(&ps3av.av_hw_conf, boot);
+               if (id < 1) {
+                       printk(KERN_ERR "%s: invalid id :%d\n", __FUNCTION__,
+                              id);
+                       return -EINVAL;
+               }
+               id |= option;
+       }
+
+       /* set videomode */
+       down(&ps3av.pong);
+       ps3av.ps3av_mode_old = ps3av.ps3av_mode;
+       ps3av.ps3av_mode = id;
+       if (ps3av_set_videomode())
+               ps3av.ps3av_mode = ps3av.ps3av_mode_old;
+
+       return 0;
+}
+
+EXPORT_SYMBOL_GPL(ps3av_set_video_mode);
+
+int ps3av_set_mode(u32 id, int boot)
+{
+       int res;
+
+       res = ps3av_set_video_mode(id, boot);
+       if (res)
+               return res;
+
+       res = ps3av_set_audio_mode(PS3AV_CMD_AUDIO_NUM_OF_CH_2,
+                                  PS3AV_CMD_AUDIO_FS_48K,
+                                  PS3AV_CMD_AUDIO_WORD_BITS_16,
+                                  PS3AV_CMD_AUDIO_FORMAT_PCM,
+                                  PS3AV_CMD_AUDIO_SOURCE_SERIAL);
+       if (res)
+               return res;
+
+       return 0;
+}
+
+EXPORT_SYMBOL_GPL(ps3av_set_mode);
+
+int ps3av_get_mode(void)
+{
+       return ps3av.ps3av_mode;
+}
+
+EXPORT_SYMBOL_GPL(ps3av_get_mode);
+
+int ps3av_get_scanmode(int id)
+{
+       int size;
+
+       id = id & PS3AV_MODE_MASK;
+       size = ARRAY_SIZE(video_mode_table);
+       if (id > size - 1 || id < 0) {
+               printk(KERN_ERR "%s: invalid mode %d\n", __FUNCTION__, id);
+               return -EINVAL;
+       }
+       return video_mode_table[id].interlace;
+}
+
+EXPORT_SYMBOL_GPL(ps3av_get_scanmode);
+
+int ps3av_get_refresh_rate(int id)
+{
+       int size;
+
+       id = id & PS3AV_MODE_MASK;
+       size = ARRAY_SIZE(video_mode_table);
+       if (id > size - 1 || id < 0) {
+               printk(KERN_ERR "%s: invalid mode %d\n", __FUNCTION__, id);
+               return -EINVAL;
+       }
+       return video_mode_table[id].freq;
+}
+
+EXPORT_SYMBOL_GPL(ps3av_get_refresh_rate);
+
+/* get resolution by video_mode */
+int ps3av_video_mode2res(u32 id, u32 *xres, u32 *yres)
+{
+       int size;
+
+       id = id & PS3AV_MODE_MASK;
+       size = ARRAY_SIZE(video_mode_table);
+       if (id > size - 1 || id < 0) {
+               printk(KERN_ERR "%s: invalid mode %d\n", __FUNCTION__, id);
+               return -EINVAL;
+       }
+       *xres = video_mode_table[id].x;
+       *yres = video_mode_table[id].y;
+       return 0;
+}
+
+EXPORT_SYMBOL_GPL(ps3av_video_mode2res);
+
+/* mute */
+int ps3av_video_mute(int mute)
+{
+       return ps3av_set_av_video_mute(mute ? PS3AV_CMD_MUTE_ON
+                                           : PS3AV_CMD_MUTE_OFF);
+}
+
+EXPORT_SYMBOL_GPL(ps3av_video_mute);
+
+int ps3av_audio_mute(int mute)
+{
+       return ps3av_set_audio_mute(mute ? PS3AV_CMD_MUTE_ON
+                                        : PS3AV_CMD_MUTE_OFF);
+}
+
+EXPORT_SYMBOL_GPL(ps3av_audio_mute);
+
+int ps3av_dev_open(void)
+{
+       int status = 0;
+
+       mutex_lock(&ps3av.mutex);
+       if (!ps3av.open_count++) {
+               status = lv1_gpu_open(0);
+               if (status) {
+                       printk(KERN_ERR "%s: lv1_gpu_open failed %d\n",
+                              __FUNCTION__, status);
+                       ps3av.open_count--;
+               }
+       }
+       mutex_unlock(&ps3av.mutex);
+
+       return status;
+}
+
+EXPORT_SYMBOL_GPL(ps3av_dev_open);
+
+int ps3av_dev_close(void)
+{
+       int status = 0;
+
+       mutex_lock(&ps3av.mutex);
+       if (ps3av.open_count <= 0) {
+               printk(KERN_ERR "%s: GPU already closed\n", __FUNCTION__);
+               status = -1;
+       } else if (!--ps3av.open_count) {
+               status = lv1_gpu_close();
+               if (status)
+                       printk(KERN_WARNING "%s: lv1_gpu_close failed %d\n",
+                              __FUNCTION__, status);
+       }
+       mutex_unlock(&ps3av.mutex);
+
+       return status;
+}
+
+EXPORT_SYMBOL_GPL(ps3av_dev_close);
+
+static int ps3av_probe(struct ps3_vuart_port_device *dev)
+{
+       int res;
+       u32 id;
+
+       dev_dbg(&ps3av_dev.core, "init ...\n");
+       dev_dbg(&ps3av_dev.core, "  timeout=%d\n", timeout);
+
+       memset(&ps3av, 0, sizeof(ps3av));
+
+       init_MUTEX(&ps3av.sem);
+       init_MUTEX_LOCKED(&ps3av.ping);
+       init_MUTEX(&ps3av.pong);
+       mutex_init(&ps3av.mutex);
+       ps3av.ps3av_mode = 0;
+       ps3av.dev = dev;
+       kernel_thread(ps3avd, &ps3av, CLONE_KERNEL);
+
+       ps3av.available = 1;
+       switch (ps3_os_area_get_av_multi_out()) {
+       case PS3_PARAM_AV_MULTI_OUT_NTSC:
+               ps3av.region = PS3AV_REGION_60;
+               break;
+       case PS3_PARAM_AV_MULTI_OUT_PAL_YCBCR:
+       case PS3_PARAM_AV_MULTI_OUT_SECAM:
+               ps3av.region = PS3AV_REGION_50;
+               break;
+       case PS3_PARAM_AV_MULTI_OUT_PAL_RGB:
+               ps3av.region = PS3AV_REGION_50 | PS3AV_REGION_RGB;
+               break;
+       default:
+               ps3av.region = PS3AV_REGION_60;
+               break;
+       }
+
+       /* init avsetting modules */
+       res = ps3av_cmd_init();
+       if (res < 0)
+               printk(KERN_ERR "%s: ps3av_cmd_init failed %d\n", __FUNCTION__,
+                      res);
+
+       ps3av_get_hw_conf(&ps3av);
+       id = ps3av_auto_videomode(&ps3av.av_hw_conf, 1);
+       mutex_lock(&ps3av.mutex);
+       ps3av.ps3av_mode = id;
+       mutex_unlock(&ps3av.mutex);
+
+       dev_dbg(&ps3av_dev.core, "init...done\n");
+
+       return 0;
+}
+
+static int ps3av_remove(struct ps3_vuart_port_device *dev)
+{
+       if (ps3av.available) {
+               ps3av_cmd_fin();
+               ps3av.available = 0;
+       }
+
+       return 0;
+}
+
+static void ps3av_shutdown(struct ps3_vuart_port_device *dev)
+{
+       ps3av_remove(dev);
+}
+
+static struct ps3_vuart_port_driver ps3av_driver = {
+       .match_id = PS3_MATCH_ID_AV_SETTINGS,
+       .core = {
+               .name = "ps3_av",
+       },
+       .probe = ps3av_probe,
+       .remove = ps3av_remove,
+       .shutdown = ps3av_shutdown,
+};
+
+static int ps3av_module_init(void)
+{
+       int error = ps3_vuart_port_driver_register(&ps3av_driver);
+       if (error) {
+               printk(KERN_ERR
+                      "%s: ps3_vuart_port_driver_register failed %d\n",
+                      __FUNCTION__, error);
+               return error;
+       }
+
+       error = ps3_vuart_port_device_register(&ps3av_dev);
+       if (error)
+               printk(KERN_ERR
+                      "%s: ps3_vuart_port_device_register failed %d\n",
+                      __FUNCTION__, error);
+
+       return error;
+}
+
+static void __exit ps3av_module_exit(void)
+{
+       device_unregister(&ps3av_dev.core);
+       ps3_vuart_port_driver_unregister(&ps3av_driver);
+}
+
+subsys_initcall(ps3av_module_init);
+module_exit(ps3av_module_exit);
diff --git a/drivers/ps3/ps3av_cmd.c b/drivers/ps3/ps3av_cmd.c
new file mode 100644 (file)
index 0000000..21c97c8
--- /dev/null
@@ -0,0 +1,1020 @@
+/*
+ * Copyright (C) 2006 Sony Computer Entertainment Inc.
+ * Copyright 2006, 2007 Sony Corporation
+ *
+ * AV backend support for PS3
+ *
+ * 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.
+ *
+ * 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/kernel.h>
+#include <linux/delay.h>
+#include <asm/ps3av.h>
+#include <asm/ps3fb.h>
+#include <asm/ps3.h>
+
+#include "vuart.h"
+
+static const struct video_fmt {
+       u32 format;
+       u32 order;
+} ps3av_video_fmt_table[] = {
+       { PS3AV_CMD_VIDEO_FORMAT_ARGB_8BIT, PS3AV_CMD_VIDEO_ORDER_RGB },
+       { PS3AV_CMD_VIDEO_FORMAT_ARGB_8BIT, PS3AV_CMD_VIDEO_ORDER_BGR },
+};
+
+static const struct {
+       int cs;
+       u32 av;
+       u32 bl;
+} ps3av_cs_video2av_table[] = {
+       {
+               .cs = PS3AV_CMD_VIDEO_CS_RGB_8,
+               .av = PS3AV_CMD_AV_CS_RGB_8,
+               .bl = PS3AV_CMD_AV_CS_8
+       }, {
+               .cs = PS3AV_CMD_VIDEO_CS_RGB_10,
+               .av = PS3AV_CMD_AV_CS_RGB_8,
+               .bl = PS3AV_CMD_AV_CS_8
+       }, {
+               .cs = PS3AV_CMD_VIDEO_CS_RGB_12,
+               .av = PS3AV_CMD_AV_CS_RGB_8,
+               .bl = PS3AV_CMD_AV_CS_8
+       }, {
+               .cs = PS3AV_CMD_VIDEO_CS_YUV444_8,
+               .av = PS3AV_CMD_AV_CS_YUV444_8,
+               .bl = PS3AV_CMD_AV_CS_8
+       }, {
+               .cs = PS3AV_CMD_VIDEO_CS_YUV444_10,
+               .av = PS3AV_CMD_AV_CS_YUV444_8,
+               .bl = PS3AV_CMD_AV_CS_10
+       }, {
+               .cs = PS3AV_CMD_VIDEO_CS_YUV444_12,
+               .av = PS3AV_CMD_AV_CS_YUV444_8,
+               .bl = PS3AV_CMD_AV_CS_10
+       }, {
+               .cs = PS3AV_CMD_VIDEO_CS_YUV422_8,
+               .av = PS3AV_CMD_AV_CS_YUV422_8,
+               .bl = PS3AV_CMD_AV_CS_10
+       }, {
+               .cs = PS3AV_CMD_VIDEO_CS_YUV422_10,
+               .av = PS3AV_CMD_AV_CS_YUV422_8,
+               .bl = PS3AV_CMD_AV_CS_10
+       }, {
+               .cs = PS3AV_CMD_VIDEO_CS_YUV422_12,
+               .av = PS3AV_CMD_AV_CS_YUV422_8,
+               .bl = PS3AV_CMD_AV_CS_12
+       }, {
+               .cs = PS3AV_CMD_VIDEO_CS_XVYCC_8,
+               .av = PS3AV_CMD_AV_CS_XVYCC_8,
+               .bl = PS3AV_CMD_AV_CS_12
+       }, {
+               .cs = PS3AV_CMD_VIDEO_CS_XVYCC_10,
+               .av = PS3AV_CMD_AV_CS_XVYCC_8,
+               .bl = PS3AV_CMD_AV_CS_12
+       }, {
+               .cs = PS3AV_CMD_VIDEO_CS_XVYCC_12,
+               .av = PS3AV_CMD_AV_CS_XVYCC_8,
+               .bl = PS3AV_CMD_AV_CS_12
+       }
+};
+
+static u32 ps3av_cs_video2av(int cs)
+{
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(ps3av_cs_video2av_table); i++)
+               if (ps3av_cs_video2av_table[i].cs == cs)
+                       return ps3av_cs_video2av_table[i].av;
+
+       return PS3AV_CMD_AV_CS_RGB_8;
+}
+
+static u32 ps3av_cs_video2av_bitlen(int cs)
+{
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(ps3av_cs_video2av_table); i++)
+               if (ps3av_cs_video2av_table[i].cs == cs)
+                       return ps3av_cs_video2av_table[i].bl;
+
+       return PS3AV_CMD_AV_CS_8;
+}
+
+static const struct {
+       int vid;
+       u32 av;
+} ps3av_vid_video2av_table[] = {
+       { PS3AV_CMD_VIDEO_VID_480I, PS3AV_CMD_AV_VID_480I },
+       { PS3AV_CMD_VIDEO_VID_480P, PS3AV_CMD_AV_VID_480P },
+       { PS3AV_CMD_VIDEO_VID_576I, PS3AV_CMD_AV_VID_576I },
+       { PS3AV_CMD_VIDEO_VID_576P, PS3AV_CMD_AV_VID_576P },
+       { PS3AV_CMD_VIDEO_VID_1080I_60HZ, PS3AV_CMD_AV_VID_1080I_60HZ },
+       { PS3AV_CMD_VIDEO_VID_720P_60HZ, PS3AV_CMD_AV_VID_720P_60HZ },
+       { PS3AV_CMD_VIDEO_VID_1080P_60HZ, PS3AV_CMD_AV_VID_1080P_60HZ },
+       { PS3AV_CMD_VIDEO_VID_1080I_50HZ, PS3AV_CMD_AV_VID_1080I_50HZ },
+       { PS3AV_CMD_VIDEO_VID_720P_50HZ, PS3AV_CMD_AV_VID_720P_50HZ },
+       { PS3AV_CMD_VIDEO_VID_1080P_50HZ, PS3AV_CMD_AV_VID_1080P_50HZ },
+       { PS3AV_CMD_VIDEO_VID_WXGA, PS3AV_CMD_AV_VID_WXGA },
+       { PS3AV_CMD_VIDEO_VID_SXGA, PS3AV_CMD_AV_VID_SXGA },
+       { PS3AV_CMD_VIDEO_VID_WUXGA, PS3AV_CMD_AV_VID_WUXGA }
+};
+
+static u32 ps3av_vid_video2av(int vid)
+{
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(ps3av_vid_video2av_table); i++)
+               if (ps3av_vid_video2av_table[i].vid == vid)
+                       return ps3av_vid_video2av_table[i].av;
+
+       return PS3AV_CMD_AV_VID_480P;
+}
+
+int ps3av_cmd_init(void)
+{
+       int res;
+       struct ps3av_pkt_av_init av_init;
+       struct ps3av_pkt_video_init video_init;
+       struct ps3av_pkt_audio_init audio_init;
+
+       /* video init */
+       memset(&video_init, 0, sizeof(video_init));
+
+       res = ps3av_do_pkt(PS3AV_CID_VIDEO_INIT, sizeof(video_init.send_hdr),
+                          sizeof(video_init), &video_init.send_hdr);
+       if (res < 0)
+               return res;
+
+       res = get_status(&video_init);
+       if (res) {
+               printk(KERN_ERR "PS3AV_CID_VIDEO_INIT: failed %x\n", res);
+               return res;
+       }
+
+       /* audio init */
+       memset(&audio_init, 0, sizeof(audio_init));
+
+       res = ps3av_do_pkt(PS3AV_CID_AUDIO_INIT, sizeof(audio_init.send_hdr),
+                          sizeof(audio_init), &audio_init.send_hdr);
+       if (res < 0)
+               return res;
+
+       res = get_status(&audio_init);
+       if (res) {
+               printk(KERN_ERR "PS3AV_CID_AUDIO_INIT: failed %x\n", res);
+               return res;
+       }
+
+       /* av init */
+       memset(&av_init, 0, sizeof(av_init));
+       av_init.event_bit = 0;
+
+       res = ps3av_do_pkt(PS3AV_CID_AV_INIT, sizeof(av_init), sizeof(av_init),
+                          &av_init.send_hdr);
+       if (res < 0)
+               return res;
+
+       res = get_status(&av_init);
+       if (res)
+               printk(KERN_ERR "PS3AV_CID_AV_INIT: failed %x\n", res);
+
+       return res;
+}
+
+int ps3av_cmd_fin(void)
+{
+       int res;
+       struct ps3av_pkt_av_fin av_fin;
+
+       memset(&av_fin, 0, sizeof(av_fin));
+
+       res = ps3av_do_pkt(PS3AV_CID_AV_FIN, sizeof(av_fin.send_hdr),
+                          sizeof(av_fin), &av_fin.send_hdr);
+       if (res < 0)
+               return res;
+
+       res = get_status(&av_fin);
+       if (res)
+               printk(KERN_ERR "PS3AV_CID_AV_FIN: failed %x\n", res);
+
+       return res;
+}
+
+int ps3av_cmd_av_video_mute(int num_of_port, u32 *port, u32 mute)
+{
+       int i, send_len, res;
+       struct ps3av_pkt_av_video_mute av_video_mute;
+
+       if (num_of_port > PS3AV_MUTE_PORT_MAX)
+               return -EINVAL;
+
+       memset(&av_video_mute, 0, sizeof(av_video_mute));
+       for (i = 0; i < num_of_port; i++) {
+               av_video_mute.mute[i].avport = port[i];
+               av_video_mute.mute[i].mute = mute;
+       }
+
+       send_len = sizeof(av_video_mute.send_hdr) +
+           sizeof(struct ps3av_av_mute) * num_of_port;
+       res = ps3av_do_pkt(PS3AV_CID_AV_VIDEO_MUTE, send_len,
+                          sizeof(av_video_mute), &av_video_mute.send_hdr);
+       if (res < 0)
+               return res;
+
+       res = get_status(&av_video_mute);
+       if (res)
+               printk(KERN_ERR "PS3AV_CID_AV_VIDEO_MUTE: failed %x\n", res);
+
+       return res;
+}
+
+int ps3av_cmd_av_video_disable_sig(u32 port)
+{
+       int res;
+       struct ps3av_pkt_av_video_disable_sig av_video_sig;
+
+       memset(&av_video_sig, 0, sizeof(av_video_sig));
+       av_video_sig.avport = port;
+
+       res = ps3av_do_pkt(PS3AV_CID_AV_VIDEO_DISABLE_SIG,
+                          sizeof(av_video_sig), sizeof(av_video_sig),
+                          &av_video_sig.send_hdr);
+       if (res < 0)
+               return res;
+
+       res = get_status(&av_video_sig);
+       if (res)
+               printk(KERN_ERR
+                      "PS3AV_CID_AV_VIDEO_DISABLE_SIG: failed %x port:%x\n",
+                      res, port);
+
+       return res;
+}
+
+int ps3av_cmd_av_tv_mute(u32 avport, u32 mute)
+{
+       int res;
+       struct ps3av_pkt_av_tv_mute tv_mute;
+
+       memset(&tv_mute, 0, sizeof(tv_mute));
+       tv_mute.avport = avport;
+       tv_mute.mute = mute;
+
+       res = ps3av_do_pkt(PS3AV_CID_AV_TV_MUTE, sizeof(tv_mute),
+                          sizeof(tv_mute), &tv_mute.send_hdr);
+       if (res < 0)
+               return res;
+
+       res = get_status(&tv_mute);
+       if (res)
+               printk(KERN_ERR "PS3AV_CID_AV_TV_MUTE: failed %x port:%x\n",
+                      res, avport);
+
+       return res;
+}
+
+int ps3av_cmd_enable_event(void)
+{
+       int res;
+       struct ps3av_pkt_av_event av_event;
+
+       memset(&av_event, 0, sizeof(av_event));
+       av_event.event_bit = PS3AV_CMD_EVENT_BIT_UNPLUGGED |
+           PS3AV_CMD_EVENT_BIT_PLUGGED | PS3AV_CMD_EVENT_BIT_HDCP_DONE;
+
+       res = ps3av_do_pkt(PS3AV_CID_AV_ENABLE_EVENT, sizeof(av_event),
+                          sizeof(av_event), &av_event.send_hdr);
+       if (res < 0)
+               return res;
+
+       res = get_status(&av_event);
+       if (res)
+               printk(KERN_ERR "PS3AV_CID_AV_ENABLE_EVENT: failed %x\n", res);
+
+       return res;
+}
+
+int ps3av_cmd_av_hdmi_mode(u8 mode)
+{
+       int res;
+       struct ps3av_pkt_av_hdmi_mode hdmi_mode;
+
+       memset(&hdmi_mode, 0, sizeof(hdmi_mode));
+       hdmi_mode.mode = mode;
+
+       res = ps3av_do_pkt(PS3AV_CID_AV_HDMI_MODE, sizeof(hdmi_mode),
+                          sizeof(hdmi_mode), &hdmi_mode.send_hdr);
+       if (res < 0)
+               return res;
+
+       res = get_status(&hdmi_mode);
+       if (res && res != PS3AV_STATUS_UNSUPPORTED_HDMI_MODE)
+               printk(KERN_ERR "PS3AV_CID_AV_HDMI_MODE: failed %x\n", res);
+
+       return res;
+}
+
+u32 ps3av_cmd_set_av_video_cs(void *p, u32 avport, int video_vid, int cs_out,
+                             int aspect, u32 id)
+{
+       struct ps3av_pkt_av_video_cs *av_video_cs;
+
+       av_video_cs = (struct ps3av_pkt_av_video_cs *)p;
+       if (video_vid == -1)
+               video_vid = PS3AV_CMD_VIDEO_VID_720P_60HZ;
+       if (cs_out == -1)
+               cs_out = PS3AV_CMD_VIDEO_CS_YUV444_8;
+       if (aspect == -1)
+               aspect = 0;
+
+       memset(av_video_cs, 0, sizeof(*av_video_cs));
+       ps3av_set_hdr(PS3AV_CID_AV_VIDEO_CS, sizeof(*av_video_cs),
+                     &av_video_cs->send_hdr);
+       av_video_cs->avport = avport;
+       /* should be same as video_mode.resolution */
+       av_video_cs->av_vid = ps3av_vid_video2av(video_vid);
+       av_video_cs->av_cs_out = ps3av_cs_video2av(cs_out);
+       /* should be same as video_mode.video_cs_out */
+       av_video_cs->av_cs_in = ps3av_cs_video2av(PS3AV_CMD_VIDEO_CS_RGB_8);
+       av_video_cs->bitlen_out = ps3av_cs_video2av_bitlen(cs_out);
+       av_video_cs->aspect = aspect;
+       if (id & PS3AV_MODE_DITHER) {
+               av_video_cs->dither = PS3AV_CMD_AV_DITHER_ON
+                   | PS3AV_CMD_AV_DITHER_8BIT;
+       } else {
+               /* default off */
+               av_video_cs->dither = PS3AV_CMD_AV_DITHER_OFF;
+       }
+
+       return sizeof(*av_video_cs);
+}
+
+u32 ps3av_cmd_set_video_mode(void *p, u32 head, int video_vid, int video_fmt,
+                            u32 id)
+{
+       struct ps3av_pkt_video_mode *video_mode;
+       u32 x, y;
+
+       video_mode = (struct ps3av_pkt_video_mode *)p;
+       if (video_vid == -1)
+               video_vid = PS3AV_CMD_VIDEO_VID_720P_60HZ;
+       if (video_fmt == -1)
+               video_fmt = PS3AV_CMD_VIDEO_FMT_X8R8G8B8;
+
+       if (ps3av_video_mode2res(id, &x, &y))
+               return 0;
+
+       /* video mode */
+       memset(video_mode, 0, sizeof(*video_mode));
+       ps3av_set_hdr(PS3AV_CID_VIDEO_MODE, sizeof(*video_mode),
+                     &video_mode->send_hdr);
+       video_mode->video_head = head;
+       if (video_vid == PS3AV_CMD_VIDEO_VID_480I
+           && head == PS3AV_CMD_VIDEO_HEAD_B)
+               video_mode->video_vid = PS3AV_CMD_VIDEO_VID_480I_A;
+       else
+               video_mode->video_vid = video_vid;
+       video_mode->width = (u16) x;
+       video_mode->height = (u16) y;
+       video_mode->pitch = video_mode->width * 4;      /* line_length */
+       video_mode->video_out_format = PS3AV_CMD_VIDEO_OUT_FORMAT_RGB_12BIT;
+       video_mode->video_format = ps3av_video_fmt_table[video_fmt].format;
+       video_mode->video_order = ps3av_video_fmt_table[video_fmt].order;
+
+       pr_debug("%s: video_mode:vid:%x width:%d height:%d pitch:%d out_format:%d format:%x order:%x\n",
+               __FUNCTION__, video_vid, video_mode->width, video_mode->height,
+               video_mode->pitch, video_mode->video_out_format,
+               video_mode->video_format, video_mode->video_order);
+       return sizeof(*video_mode);
+}
+
+int ps3av_cmd_video_format_black(u32 head, u32 video_fmt, u32 mute)
+{
+       int res;
+       struct ps3av_pkt_video_format video_format;
+
+       memset(&video_format, 0, sizeof(video_format));
+       video_format.video_head = head;
+       if (mute != PS3AV_CMD_MUTE_OFF)
+               video_format.video_format = PS3AV_CMD_VIDEO_FORMAT_BLACK;
+       else
+               video_format.video_format =
+                   ps3av_video_fmt_table[video_fmt].format;
+       video_format.video_order = ps3av_video_fmt_table[video_fmt].order;
+
+       res = ps3av_do_pkt(PS3AV_CID_VIDEO_FORMAT, sizeof(video_format),
+                          sizeof(video_format), &video_format.send_hdr);
+       if (res < 0)
+               return res;
+
+       res = get_status(&video_format);
+       if (res)
+               printk(KERN_ERR "PS3AV_CID_VIDEO_FORMAT: failed %x\n", res);
+
+       return res;
+}
+
+
+int ps3av_cmd_av_audio_mute(int num_of_port, u32 *port, u32 mute)
+{
+       int i, res;
+       struct ps3av_pkt_av_audio_mute av_audio_mute;
+
+       if (num_of_port > PS3AV_MUTE_PORT_MAX)
+               return -EINVAL;
+
+       /* audio mute */
+       memset(&av_audio_mute, 0, sizeof(av_audio_mute));
+       for (i = 0; i < num_of_port; i++) {
+               av_audio_mute.mute[i].avport = port[i];
+               av_audio_mute.mute[i].mute = mute;
+       }
+
+       res = ps3av_do_pkt(PS3AV_CID_AV_AUDIO_MUTE,
+                          sizeof(av_audio_mute.send_hdr) +
+                          sizeof(struct ps3av_av_mute) * num_of_port,
+                          sizeof(av_audio_mute), &av_audio_mute.send_hdr);
+       if (res < 0)
+               return res;
+
+       res = get_status(&av_audio_mute);
+       if (res)
+               printk(KERN_ERR "PS3AV_CID_AV_AUDIO_MUTE: failed %x\n", res);
+
+       return res;
+}
+
+static const struct {
+       u32 fs;
+       u8 mclk;
+} ps3av_cnv_mclk_table[] = {
+       { PS3AV_CMD_AUDIO_FS_44K, PS3AV_CMD_AV_MCLK_512 },
+       { PS3AV_CMD_AUDIO_FS_48K, PS3AV_CMD_AV_MCLK_512 },
+       { PS3AV_CMD_AUDIO_FS_88K, PS3AV_CMD_AV_MCLK_256 },
+       { PS3AV_CMD_AUDIO_FS_96K, PS3AV_CMD_AV_MCLK_256 },
+       { PS3AV_CMD_AUDIO_FS_176K, PS3AV_CMD_AV_MCLK_128 },
+       { PS3AV_CMD_AUDIO_FS_192K, PS3AV_CMD_AV_MCLK_128 }
+};
+
+static u8 ps3av_cnv_mclk(u32 fs)
+{
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(ps3av_cnv_mclk_table); i++)
+               if (ps3av_cnv_mclk_table[i].fs == fs)
+                       return ps3av_cnv_mclk_table[i].mclk;
+
+       printk(KERN_ERR "%s failed, fs:%x\n", __FUNCTION__, fs);
+       return 0;
+}
+
+#define BASE   PS3AV_CMD_AUDIO_FS_44K
+
+static const u32 ps3av_ns_table[][5] = {
+                                       /*   D1,    D2,    D3,    D4,    D5 */
+       [PS3AV_CMD_AUDIO_FS_44K-BASE]   {  6272,  6272, 17836, 17836,  8918 },
+       [PS3AV_CMD_AUDIO_FS_48K-BASE]   {  6144,  6144, 11648, 11648,  5824 },
+       [PS3AV_CMD_AUDIO_FS_88K-BASE]   { 12544, 12544, 35672, 35672, 17836 },
+       [PS3AV_CMD_AUDIO_FS_96K-BASE]   { 12288, 12288, 23296, 23296, 11648 },
+       [PS3AV_CMD_AUDIO_FS_176K-BASE]  { 25088, 25088, 71344, 71344, 35672 },
+       [PS3AV_CMD_AUDIO_FS_192K-BASE]  { 24576, 24576, 46592, 46592, 23296 }
+};
+
+static void ps3av_cnv_ns(u8 *ns, u32 fs, u32 video_vid)
+{
+       u32 av_vid, ns_val;
+       u8 *p = ns;
+       int d;
+
+       d = ns_val = 0;
+       av_vid = ps3av_vid_video2av(video_vid);
+       switch (av_vid) {
+       case PS3AV_CMD_AV_VID_480I:
+       case PS3AV_CMD_AV_VID_576I:
+               d = 0;
+               break;
+       case PS3AV_CMD_AV_VID_480P:
+       case PS3AV_CMD_AV_VID_576P:
+               d = 1;
+               break;
+       case PS3AV_CMD_AV_VID_1080I_60HZ:
+       case PS3AV_CMD_AV_VID_1080I_50HZ:
+               d = 2;
+               break;
+       case PS3AV_CMD_AV_VID_720P_60HZ:
+       case PS3AV_CMD_AV_VID_720P_50HZ:
+               d = 3;
+               break;
+       case PS3AV_CMD_AV_VID_1080P_60HZ:
+       case PS3AV_CMD_AV_VID_1080P_50HZ:
+       case PS3AV_CMD_AV_VID_WXGA:
+       case PS3AV_CMD_AV_VID_SXGA:
+       case PS3AV_CMD_AV_VID_WUXGA:
+               d = 4;
+               break;
+       default:
+               printk(KERN_ERR "%s failed, vid:%x\n", __FUNCTION__,
+                      video_vid);
+               break;
+       }
+
+       if (fs < PS3AV_CMD_AUDIO_FS_44K || fs > PS3AV_CMD_AUDIO_FS_192K)
+               printk(KERN_ERR "%s failed, fs:%x\n", __FUNCTION__, fs);
+       else
+               ns_val = ps3av_ns_table[PS3AV_CMD_AUDIO_FS_44K-BASE][d];
+
+       *p++ = ns_val & 0x000000FF;
+       *p++ = (ns_val & 0x0000FF00) >> 8;
+       *p = (ns_val & 0x00FF0000) >> 16;
+}
+
+#undef BASE
+
+static u8 ps3av_cnv_enable(u32 source, u8 *enable)
+{
+       u8 *p, ret = 0;
+
+       if (source == PS3AV_CMD_AUDIO_SOURCE_SPDIF) {
+               ret = 0x03;
+       } else if (source == PS3AV_CMD_AUDIO_SOURCE_SERIAL) {
+               p = enable;
+               ret = ((p[0] << 4) + (p[1] << 5) + (p[2] << 6) + (p[3] << 7)) |
+                     0x01;
+       } else
+               printk(KERN_ERR "%s failed, source:%x\n", __FUNCTION__,
+                      source);
+       return ret;
+}
+
+static u8 ps3av_cnv_fifomap(u8 *map)
+{
+       u8 *p, ret = 0;
+
+       p = map;
+       ret = p[0] + (p[1] << 2) + (p[2] << 4) + (p[3] << 6);
+       return ret;
+}
+
+static u8 ps3av_cnv_inputlen(u32 word_bits)
+{
+       u8 ret = 0;
+
+       switch (word_bits) {
+       case PS3AV_CMD_AUDIO_WORD_BITS_16:
+               ret = PS3AV_CMD_AV_INPUTLEN_16;
+               break;
+       case PS3AV_CMD_AUDIO_WORD_BITS_20:
+               ret = PS3AV_CMD_AV_INPUTLEN_20;
+               break;
+       case PS3AV_CMD_AUDIO_WORD_BITS_24:
+               ret = PS3AV_CMD_AV_INPUTLEN_24;
+               break;
+       default:
+               printk(KERN_ERR "%s failed, word_bits:%x\n", __FUNCTION__,
+                      word_bits);
+               break;
+       }
+       return ret;
+}
+
+static u8 ps3av_cnv_layout(u32 num_of_ch)
+{
+       if (num_of_ch > PS3AV_CMD_AUDIO_NUM_OF_CH_8) {
+               printk(KERN_ERR "%s failed, num_of_ch:%x\n", __FUNCTION__,
+                      num_of_ch);
+               return 0;
+       }
+
+       return num_of_ch == PS3AV_CMD_AUDIO_NUM_OF_CH_2 ? 0x0 : 0x1;
+}
+
+static void ps3av_cnv_info(struct ps3av_audio_info_frame *info,
+                          const struct ps3av_pkt_audio_mode *mode)
+{
+       info->pb1.cc = mode->audio_num_of_ch + 1;       /* CH2:0x01 --- CH8:0x07 */
+       info->pb1.ct = 0;
+       info->pb2.sf = 0;
+       info->pb2.ss = 0;
+
+       info->pb3 = 0;          /* check mode->audio_format ?? */
+       info->pb4 = mode->audio_layout;
+       info->pb5.dm = mode->audio_downmix;
+       info->pb5.lsv = mode->audio_downmix_level;
+}
+
+static void ps3av_cnv_chstat(u8 *chstat, u8 *cs_info)
+{
+       memcpy(chstat, cs_info, 5);
+}
+
+u32 ps3av_cmd_set_av_audio_param(void *p, u32 port,
+                                const struct ps3av_pkt_audio_mode *audio_mode,
+                                u32 video_vid)
+{
+       struct ps3av_pkt_av_audio_param *param;
+
+       param = (struct ps3av_pkt_av_audio_param *)p;
+
+       memset(param, 0, sizeof(*param));
+       ps3av_set_hdr(PS3AV_CID_AV_AUDIO_PARAM, sizeof(*param),
+                     &param->send_hdr);
+
+       param->avport = port;
+       param->mclk = ps3av_cnv_mclk(audio_mode->audio_fs) | 0x80;
+       ps3av_cnv_ns(param->ns, audio_mode->audio_fs, video_vid);
+       param->enable = ps3av_cnv_enable(audio_mode->audio_source,
+                                        audio_mode->audio_enable);
+       param->swaplr = 0x09;
+       param->fifomap = ps3av_cnv_fifomap(audio_mode->audio_map);
+       param->inputctrl = 0x49;
+       param->inputlen = ps3av_cnv_inputlen(audio_mode->audio_word_bits);
+       param->layout = ps3av_cnv_layout(audio_mode->audio_num_of_ch);
+       ps3av_cnv_info(&param->info, audio_mode);
+       ps3av_cnv_chstat(param->chstat, audio_mode->audio_cs_info);
+
+       return sizeof(*param);
+}
+
+/* default cs val */
+static const u8 ps3av_mode_cs_info[] = {
+       0x00, 0x09, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00
+};
+
+#define CS_44  0x00
+#define CS_48  0x02
+#define CS_88  0x08
+#define CS_96  0x0a
+#define CS_176 0x0c
+#define CS_192 0x0e
+#define CS_MASK        0x0f
+#define CS_BIT 0x40
+
+void ps3av_cmd_set_audio_mode(struct ps3av_pkt_audio_mode *audio, u32 avport,
+                             u32 ch, u32 fs, u32 word_bits, u32 format,
+                             u32 source)
+{
+       int spdif_through, spdif_bitstream;
+       int i;
+
+       if (!(ch | fs | format | word_bits | source)) {
+               ch = PS3AV_CMD_AUDIO_NUM_OF_CH_2;
+               fs = PS3AV_CMD_AUDIO_FS_48K;
+               word_bits = PS3AV_CMD_AUDIO_WORD_BITS_16;
+               format = PS3AV_CMD_AUDIO_FORMAT_PCM;
+               source = PS3AV_CMD_AUDIO_SOURCE_SERIAL;
+       }
+       spdif_through = spdif_bitstream = 0;    /* XXX not supported */
+
+       /* audio mode */
+       memset(audio, 0, sizeof(*audio));
+       ps3av_set_hdr(PS3AV_CID_AUDIO_MODE, sizeof(*audio), &audio->send_hdr);
+
+       audio->avport = (u8) avport;
+       audio->mask = 0x0FFF;   /* XXX set all */
+       audio->audio_num_of_ch = ch;
+       audio->audio_fs = fs;
+       audio->audio_word_bits = word_bits;
+       audio->audio_format = format;
+       audio->audio_source = source;
+
+       switch (ch) {
+       case PS3AV_CMD_AUDIO_NUM_OF_CH_8:
+               audio->audio_enable[3] = 1;
+               /* fall through */
+       case PS3AV_CMD_AUDIO_NUM_OF_CH_6:
+               audio->audio_enable[2] = 1;
+               audio->audio_enable[1] = 1;
+               /* fall through */
+       case PS3AV_CMD_AUDIO_NUM_OF_CH_2:
+       default:
+               audio->audio_enable[0] = 1;
+       }
+
+       /* audio swap L/R */
+       for (i = 0; i < 4; i++)
+               audio->audio_swap[i] = PS3AV_CMD_AUDIO_SWAP_0;  /* no swap */
+
+       /* audio serial input mapping */
+       audio->audio_map[0] = PS3AV_CMD_AUDIO_MAP_OUTPUT_0;
+       audio->audio_map[1] = PS3AV_CMD_AUDIO_MAP_OUTPUT_1;
+       audio->audio_map[2] = PS3AV_CMD_AUDIO_MAP_OUTPUT_2;
+       audio->audio_map[3] = PS3AV_CMD_AUDIO_MAP_OUTPUT_3;
+
+       /* audio speaker layout */
+       if (avport == PS3AV_CMD_AVPORT_HDMI_0 ||
+           avport == PS3AV_CMD_AVPORT_HDMI_1) {
+               switch (ch) {
+               case PS3AV_CMD_AUDIO_NUM_OF_CH_8:
+                       audio->audio_layout = PS3AV_CMD_AUDIO_LAYOUT_8CH;
+                       break;
+               case PS3AV_CMD_AUDIO_NUM_OF_CH_6:
+                       audio->audio_layout = PS3AV_CMD_AUDIO_LAYOUT_6CH;
+                       break;
+               case PS3AV_CMD_AUDIO_NUM_OF_CH_2:
+               default:
+                       audio->audio_layout = PS3AV_CMD_AUDIO_LAYOUT_2CH;
+                       break;
+               }
+       } else {
+               audio->audio_layout = PS3AV_CMD_AUDIO_LAYOUT_2CH;
+       }
+
+       /* audio downmix permission */
+       audio->audio_downmix = PS3AV_CMD_AUDIO_DOWNMIX_PERMITTED;
+       /* audio downmix level shift (0:0dB to 15:15dB) */
+       audio->audio_downmix_level = 0; /* 0dB */
+
+       /* set ch status */
+       for (i = 0; i < 8; i++)
+               audio->audio_cs_info[i] = ps3av_mode_cs_info[i];
+
+       switch (fs) {
+       case PS3AV_CMD_AUDIO_FS_44K:
+               audio->audio_cs_info[3] &= ~CS_MASK;
+               audio->audio_cs_info[3] |= CS_44;
+               break;
+       case PS3AV_CMD_AUDIO_FS_88K:
+               audio->audio_cs_info[3] &= ~CS_MASK;
+               audio->audio_cs_info[3] |= CS_88;
+               break;
+       case PS3AV_CMD_AUDIO_FS_96K:
+               audio->audio_cs_info[3] &= ~CS_MASK;
+               audio->audio_cs_info[3] |= CS_96;
+               break;
+       case PS3AV_CMD_AUDIO_FS_176K:
+               audio->audio_cs_info[3] &= ~CS_MASK;
+               audio->audio_cs_info[3] |= CS_176;
+               break;
+       case PS3AV_CMD_AUDIO_FS_192K:
+               audio->audio_cs_info[3] &= ~CS_MASK;
+               audio->audio_cs_info[3] |= CS_192;
+               break;
+       default:
+               break;
+       }
+
+       /* pass through setting */
+       if (spdif_through &&
+           (avport == PS3AV_CMD_AVPORT_SPDIF_0 ||
+            avport == PS3AV_CMD_AVPORT_SPDIF_1)) {
+               audio->audio_word_bits = PS3AV_CMD_AUDIO_WORD_BITS_16;
+               audio->audio_source = PS3AV_CMD_AUDIO_SOURCE_SPDIF;
+               if (spdif_bitstream) {
+                       audio->audio_format = PS3AV_CMD_AUDIO_FORMAT_BITSTREAM;
+                       audio->audio_cs_info[0] |= CS_BIT;
+               }
+       }
+}
+
+int ps3av_cmd_audio_mode(struct ps3av_pkt_audio_mode *audio_mode)
+{
+       int res;
+
+       res = ps3av_do_pkt(PS3AV_CID_AUDIO_MODE, sizeof(*audio_mode),
+                          sizeof(*audio_mode), &audio_mode->send_hdr);
+       if (res < 0)
+               return res;
+
+       res = get_status(audio_mode);
+       if (res)
+               printk(KERN_ERR "PS3AV_CID_AUDIO_MODE: failed %x\n", res);
+
+       return res;
+}
+
+int ps3av_cmd_audio_mute(int num_of_port, u32 *port, u32 mute)
+{
+       int i, res;
+       struct ps3av_pkt_audio_mute audio_mute;
+
+       if (num_of_port > PS3AV_OPT_PORT_MAX)
+               return -EINVAL;
+
+       /* audio mute */
+       memset(&audio_mute, 0, sizeof(audio_mute));
+       for (i = 0; i < num_of_port; i++) {
+               audio_mute.mute[i].avport = port[i];
+               audio_mute.mute[i].mute = mute;
+       }
+
+       res = ps3av_do_pkt(PS3AV_CID_AUDIO_MUTE,
+                          sizeof(audio_mute.send_hdr) +
+                          sizeof(struct ps3av_audio_mute) * num_of_port,
+                          sizeof(audio_mute), &audio_mute.send_hdr);
+       if (res < 0)
+               return res;
+
+       res = get_status(&audio_mute);
+       if (res)
+               printk(KERN_ERR "PS3AV_CID_AUDIO_MUTE: failed %x\n", res);
+
+       return res;
+}
+
+int ps3av_cmd_audio_active(int active, u32 port)
+{
+       int res;
+       struct ps3av_pkt_audio_active audio_active;
+       u32 cid;
+
+       /* audio active */
+       memset(&audio_active, 0, sizeof(audio_active));
+       audio_active.audio_port = port;
+       cid = active ? PS3AV_CID_AUDIO_ACTIVE : PS3AV_CID_AUDIO_INACTIVE;
+
+       res = ps3av_do_pkt(cid, sizeof(audio_active), sizeof(audio_active),
+                          &audio_active.send_hdr);
+       if (res < 0)
+               return res;
+
+       res = get_status(&audio_active);
+       if (res)
+               printk(KERN_ERR "PS3AV_CID_AUDIO_ACTIVE:%x failed %x\n", cid,
+                      res);
+
+       return res;
+}
+
+int ps3av_cmd_avb_param(struct ps3av_pkt_avb_param *avb, u32 send_len)
+{
+       int res;
+
+       ps3fb_flip_ctl(0);      /* flip off */
+
+       /* avb packet */
+       res = ps3av_do_pkt(PS3AV_CID_AVB_PARAM, send_len, sizeof(*avb),
+                          &avb->send_hdr);
+       if (res < 0)
+               goto out;
+
+       res = get_status(avb);
+       if (res)
+               pr_debug("%s: PS3AV_CID_AVB_PARAM: failed %x\n", __FUNCTION__,
+                        res);
+
+      out:
+       ps3fb_flip_ctl(1);      /* flip on */
+       return res;
+}
+
+int ps3av_cmd_av_get_hw_conf(struct ps3av_pkt_av_get_hw_conf *hw_conf)
+{
+       int res;
+
+       memset(hw_conf, 0, sizeof(*hw_conf));
+
+       res = ps3av_do_pkt(PS3AV_CID_AV_GET_HW_CONF, sizeof(hw_conf->send_hdr),
+                          sizeof(*hw_conf), &hw_conf->send_hdr);
+       if (res < 0)
+               return res;
+
+       res = get_status(hw_conf);
+       if (res)
+               printk(KERN_ERR "PS3AV_CID_AV_GET_HW_CONF: failed %x\n", res);
+
+       return res;
+}
+
+int ps3av_cmd_video_get_monitor_info(struct ps3av_pkt_av_get_monitor_info *info,
+                                    u32 avport)
+{
+       int res;
+
+       memset(info, 0, sizeof(*info));
+       info->avport = avport;
+
+       res = ps3av_do_pkt(PS3AV_CID_AV_GET_MONITOR_INFO,
+                          sizeof(info->send_hdr) + sizeof(info->avport) +
+                          sizeof(info->reserved),
+                          sizeof(*info), &info->send_hdr);
+       if (res < 0)
+               return res;
+
+       res = get_status(info);
+       if (res)
+               printk(KERN_ERR "PS3AV_CID_AV_GET_MONITOR_INFO: failed %x\n",
+                      res);
+
+       return res;
+}
+
+#ifdef PS3AV_DEBUG
+void ps3av_cmd_av_hw_conf_dump(const struct ps3av_pkt_av_get_hw_conf *hw_conf)
+{
+       printk("av_h_conf:num of hdmi:%d\n", hw_conf->num_of_hdmi);
+       printk("av_h_conf:num of avmulti:%d\n", hw_conf->num_of_avmulti);
+       printk("av_h_conf:num of spdif:%d\n", hw_conf->num_of_spdif);
+}
+
+void ps3av_cmd_av_monitor_info_dump(const struct ps3av_pkt_av_get_monitor_info *monitor_info)
+{
+       const struct ps3av_info_monitor *info = &monitor_info->info;
+       const struct ps3av_info_audio *audio = info->audio;
+       int i;
+
+       printk("Monitor Info: size%d\n", monitor_info->send_hdr.size);
+
+       printk("avport:%02x\n", info->avport);
+       printk("monitor_id:");
+       for (i = 0; i < 10; i++)
+               printk("%02x ", info->monitor_id[i]);
+       printk("\nmonitor_type:%02x\n", info->monitor_type);
+       printk("monitor_name:");
+       for (i = 0; i < 16; i++)
+               printk("%c", info->monitor_name[i]);
+
+       /* resolution */
+       printk("\nresolution_60: bits:%08x native:%08x\n",
+              info->res_60.res_bits, info->res_60.native);
+       printk("resolution_50: bits:%08x native:%08x\n",
+              info->res_50.res_bits, info->res_50.native);
+       printk("resolution_other: bits:%08x native:%08x\n",
+              info->res_other.res_bits, info->res_other.native);
+       printk("resolution_vesa: bits:%08x native:%08x\n",
+              info->res_vesa.res_bits, info->res_vesa.native);
+
+       /* color space */
+       printk("color space    rgb:%02x\n", info->cs.rgb);
+       printk("color space yuv444:%02x\n", info->cs.yuv444);
+       printk("color space yuv422:%02x\n", info->cs.yuv422);
+
+       /* color info */
+       printk("color info   red:X %04x Y %04x\n",
+              info->color.red_x, info->color.red_y);
+       printk("color info green:X %04x Y %04x\n",
+              info->color.green_x, info->color.green_y);
+       printk("color info  blue:X %04x Y %04x\n",
+              info->color.blue_x, info->color.blue_y);
+       printk("color info white:X %04x Y %04x\n",
+              info->color.white_x, info->color.white_y);
+       printk("color info gamma: %08x\n", info->color.gamma);
+
+       /* other info */
+       printk("supported_AI:%02x\n", info->supported_ai);
+       printk("speaker_info:%02x\n", info->speaker_info);
+       printk("num of audio:%02x\n", info->num_of_audio_block);
+
+       /* audio block */
+       for (i = 0; i < info->num_of_audio_block; i++) {
+               printk("audio[%d] type:%02x max_ch:%02x fs:%02x sbit:%02x\n",
+                      i, audio->type, audio->max_num_of_ch, audio->fs,
+                      audio->sbit);
+               audio++;
+       }
+}
+#endif /* PS3AV_DEBUG */
+
+#define PS3AV_AV_LAYOUT_0 (PS3AV_CMD_AV_LAYOUT_32 \
+               | PS3AV_CMD_AV_LAYOUT_44 \
+               | PS3AV_CMD_AV_LAYOUT_48)
+
+#define PS3AV_AV_LAYOUT_1 (PS3AV_AV_LAYOUT_0 \
+               | PS3AV_CMD_AV_LAYOUT_88 \
+               | PS3AV_CMD_AV_LAYOUT_96 \
+               | PS3AV_CMD_AV_LAYOUT_176 \
+               | PS3AV_CMD_AV_LAYOUT_192)
+
+/************************* vuart ***************************/
+
+#define POLLING_INTERVAL  25   /* in msec */
+
+int ps3av_vuart_write(struct ps3_vuart_port_device *dev, const void *buf,
+                     unsigned long size)
+{
+       int error = ps3_vuart_write(dev, buf, size);
+       return error ? error : size;
+}
+
+int ps3av_vuart_read(struct ps3_vuart_port_device *dev, void *buf,
+                    unsigned long size, int timeout)
+{
+       int error;
+       int loopcnt = 0;
+
+       timeout = (timeout + POLLING_INTERVAL - 1) / POLLING_INTERVAL;
+       while (loopcnt++ <= timeout) {
+               error = ps3_vuart_read(dev, buf, size);
+               if (!error)
+                       return size;
+               if (error != -EAGAIN) {
+                       printk(KERN_ERR "%s: ps3_vuart_read failed %d\n",
+                              __FUNCTION__, error);
+                       return error;
+               }
+               msleep(POLLING_INTERVAL);
+       }
+       return -EWOULDBLOCK;
+}
index a72da8f651f8e65850a284133a1840ba93cd29b3..ef8fd4c308757d34efc524d276055aeaaa4c653b 100644 (file)
@@ -867,6 +867,22 @@ static int ps3_vuart_remove(struct device *_dev)
        return 0;
 }
 
+static void ps3_vuart_shutdown(struct device *_dev)
+{
+       struct ps3_vuart_port_device *dev = to_ps3_vuart_port_device(_dev);
+       struct ps3_vuart_port_driver *drv =
+               to_ps3_vuart_port_driver(_dev->driver);
+
+       dev_dbg(&dev->core, "%s:%d: %s\n", __func__, __LINE__,
+               dev->core.bus_id);
+
+       if (drv->shutdown)
+               drv->shutdown(dev);
+       else
+               dev_dbg(&dev->core, "%s:%d: %s no shutdown method\n", __func__,
+                       __LINE__, dev->core.bus_id);
+}
+
 /**
  * ps3_vuart - The vuart instance.
  *
@@ -878,6 +894,7 @@ struct bus_type ps3_vuart = {
        .match = ps3_vuart_match,
        .probe = ps3_vuart_probe,
        .remove = ps3_vuart_remove,
+       .shutdown = ps3_vuart_shutdown,
 };
 
 int __init ps3_vuart_init(void)
index 11c421cf7a0342aaff8beaaddb5ae64ceaa57eed..2cbf728a3a0bfaec295ea31a1d580390d13ed4a4 100644 (file)
@@ -30,6 +30,7 @@ struct ps3_vuart_port_driver {
        struct device_driver core;
        int (*probe)(struct ps3_vuart_port_device *);
        int (*remove)(struct ps3_vuart_port_device *);
+       void (*shutdown)(struct ps3_vuart_port_device *);
        int (*tx_event)(struct ps3_vuart_port_device *dev);
        int (*rx_event)(struct ps3_vuart_port_device *dev);
        int (*disconnect_event)(struct ps3_vuart_port_device *dev);
index 7bf7b2c88245358e023b1ddc8d97a19999b1a047..f935c1f71a583db4dff6d14937e972096717f0b7 100644 (file)
@@ -326,14 +326,17 @@ static struct rio_dev *rio_setup_device(struct rio_net *net,
        rio_mport_read_config_32(port, destid, hopcount, RIO_DST_OPS_CAR,
                                 &rdev->dst_ops);
 
-       if (rio_device_has_destid(port, rdev->src_ops, rdev->dst_ops)
-           && do_enum) {
-               rio_set_device_id(port, destid, hopcount, next_destid);
-               rdev->destid = next_destid++;
-               if (next_destid == port->host_deviceid)
-                       next_destid++;
+       if (rio_device_has_destid(port, rdev->src_ops, rdev->dst_ops)) {
+               if (do_enum) {
+                       rio_set_device_id(port, destid, hopcount, next_destid);
+                       rdev->destid = next_destid++;
+                       if (next_destid == port->host_deviceid)
+                               next_destid++;
+               } else
+                       rdev->destid = rio_get_device_id(port, destid, hopcount);
        } else
-               rdev->destid = rio_get_device_id(port, destid, hopcount);
+               /* Switch device has an associated destID */
+               rdev->destid = RIO_INVALID_DESTID;
 
        /* If a PE has both switch and other functions, show it as a switch */
        if (rio_is_switch(rdev)) {
@@ -347,7 +350,7 @@ static struct rio_dev *rio_setup_device(struct rio_net *net,
                }
                rswitch->switchid = next_switchid;
                rswitch->hopcount = hopcount;
-               rswitch->destid = 0xffff;
+               rswitch->destid = destid;
                /* Initialize switch route table */
                for (rdid = 0; rdid < RIO_MAX_ROUTE_ENTRIES; rdid++)
                        rswitch->route_table[rdid] = RIO_INVALID_ROUTE;
@@ -422,7 +425,7 @@ rio_sport_is_active(struct rio_mport *port, u16 destid, u8 hopcount, int sport)
 /**
  * rio_route_add_entry- Add a route entry to a switch routing table
  * @mport: Master port to send transaction
- * @rdev: Switch device
+ * @rswitch: Switch device
  * @table: Routing table ID
  * @route_destid: Destination ID to be routed
  * @route_port: Port number to be routed
@@ -434,18 +437,18 @@ rio_sport_is_active(struct rio_mport *port, u16 destid, u8 hopcount, int sport)
  * %RIO_GLOBAL_TABLE in @table. Returns %0 on success or %-EINVAL
  * on failure.
  */
-static int rio_route_add_entry(struct rio_mport *mport, struct rio_dev *rdev,
+static int rio_route_add_entry(struct rio_mport *mport, struct rio_switch *rswitch,
                               u16 table, u16 route_destid, u8 route_port)
 {
-       return rdev->rswitch->add_entry(mport, rdev->rswitch->destid,
-                                       rdev->rswitch->hopcount, table,
+       return rswitch->add_entry(mport, rswitch->destid,
+                                       rswitch->hopcount, table,
                                        route_destid, route_port);
 }
 
 /**
  * rio_route_get_entry- Read a route entry in a switch routing table
  * @mport: Master port to send transaction
- * @rdev: Switch device
+ * @rswitch: Switch device
  * @table: Routing table ID
  * @route_destid: Destination ID to be routed
  * @route_port: Pointer to read port number into
@@ -458,11 +461,11 @@ static int rio_route_add_entry(struct rio_mport *mport, struct rio_dev *rdev,
  * on failure.
  */
 static int
-rio_route_get_entry(struct rio_mport *mport, struct rio_dev *rdev, u16 table,
+rio_route_get_entry(struct rio_mport *mport, struct rio_switch *rswitch, u16 table,
                    u16 route_destid, u8 * route_port)
 {
-       return rdev->rswitch->get_entry(mport, rdev->rswitch->destid,
-                                       rdev->rswitch->hopcount, table,
+       return rswitch->get_entry(mport, rswitch->destid,
+                                       rswitch->hopcount, table,
                                        route_destid, route_port);
 }
 
@@ -552,6 +555,8 @@ static int rio_enum_peer(struct rio_net *net, struct rio_mport *port,
        int port_num;
        int num_ports;
        int cur_destid;
+       int sw_destid;
+       int sw_inport;
        struct rio_dev *rdev;
        u16 destid;
        int tmp;
@@ -594,15 +599,17 @@ static int rio_enum_peer(struct rio_net *net, struct rio_mport *port,
 
        if (rio_is_switch(rdev)) {
                next_switchid++;
+               sw_inport = rio_get_swpinfo_inport(port, RIO_ANY_DESTID, hopcount);
+               rio_route_add_entry(port, rdev->rswitch, RIO_GLOBAL_TABLE,
+                                   port->host_deviceid, sw_inport);
+               rdev->rswitch->route_table[port->host_deviceid] = sw_inport;
 
                for (destid = 0; destid < next_destid; destid++) {
-                       rio_route_add_entry(port, rdev, RIO_GLOBAL_TABLE,
-                                           destid, rio_get_swpinfo_inport(port,
-                                                                          RIO_ANY_DESTID,
-                                                                          hopcount));
-                       rdev->rswitch->route_table[destid] =
-                           rio_get_swpinfo_inport(port, RIO_ANY_DESTID,
-                                                  hopcount);
+                       if (destid == port->host_deviceid)
+                               continue;
+                       rio_route_add_entry(port, rdev->rswitch, RIO_GLOBAL_TABLE,
+                                           destid, sw_inport);
+                       rdev->rswitch->route_table[destid] = sw_inport;
                }
 
                num_ports =
@@ -610,9 +617,9 @@ static int rio_enum_peer(struct rio_net *net, struct rio_mport *port,
                pr_debug(
                    "RIO: found %s (vid %4.4x did %4.4x) with %d ports\n",
                    rio_name(rdev), rdev->vid, rdev->did, num_ports);
+               sw_destid = next_destid;
                for (port_num = 0; port_num < num_ports; port_num++) {
-                       if (rio_get_swpinfo_inport
-                           (port, RIO_ANY_DESTID, hopcount) == port_num)
+                       if (sw_inport == port_num)
                                continue;
 
                        cur_destid = next_destid;
@@ -622,7 +629,7 @@ static int rio_enum_peer(struct rio_net *net, struct rio_mport *port,
                                pr_debug(
                                    "RIO: scanning device on port %d\n",
                                    port_num);
-                               rio_route_add_entry(port, rdev,
+                               rio_route_add_entry(port, rdev->rswitch,
                                                    RIO_GLOBAL_TABLE,
                                                    RIO_ANY_DESTID, port_num);
 
@@ -633,7 +640,9 @@ static int rio_enum_peer(struct rio_net *net, struct rio_mport *port,
                                if (next_destid > cur_destid) {
                                        for (destid = cur_destid;
                                             destid < next_destid; destid++) {
-                                               rio_route_add_entry(port, rdev,
+                                               if (destid == port->host_deviceid)
+                                                       continue;
+                                               rio_route_add_entry(port, rdev->rswitch,
                                                                    RIO_GLOBAL_TABLE,
                                                                    destid,
                                                                    port_num);
@@ -641,10 +650,18 @@ static int rio_enum_peer(struct rio_net *net, struct rio_mport *port,
                                                    route_table[destid] =
                                                    port_num;
                                        }
-                                       rdev->rswitch->destid = cur_destid;
                                }
                        }
                }
+
+               /* Check for empty switch */
+               if (next_destid == sw_destid) {
+                       next_destid++;
+                       if (next_destid == port->host_deviceid)
+                               next_destid++;
+               }
+
+               rdev->rswitch->destid = sw_destid;
        } else
                pr_debug("RIO: found %s (vid %4.4x did %4.4x)\n",
                    rio_name(rdev), rdev->vid, rdev->did);
@@ -721,7 +738,7 @@ rio_disc_peer(struct rio_net *net, struct rio_mport *port, u16 destid,
                                    port_num);
                                for (ndestid = 0; ndestid < RIO_ANY_DESTID;
                                     ndestid++) {
-                                       rio_route_get_entry(port, rdev,
+                                       rio_route_get_entry(port, rdev->rswitch,
                                                            RIO_GLOBAL_TABLE,
                                                            ndestid,
                                                            &route_port);
@@ -797,6 +814,44 @@ static struct rio_net __devinit *rio_alloc_net(struct rio_mport *port)
        return net;
 }
 
+/**
+ * rio_update_route_tables- Updates route tables in switches
+ * @port: Master port associated with the RIO network
+ *
+ * For each enumerated device, ensure that each switch in a system
+ * has correct routing entries. Add routes for devices that where
+ * unknown dirung the first enumeration pass through the switch.
+ */
+static void rio_update_route_tables(struct rio_mport *port)
+{
+       struct rio_dev *rdev;
+       struct rio_switch *rswitch;
+       u8 sport;
+       u16 destid;
+
+       list_for_each_entry(rdev, &rio_devices, global_list) {
+
+               destid = (rio_is_switch(rdev))?rdev->rswitch->destid:rdev->destid;
+
+               list_for_each_entry(rswitch, &rio_switches, node) {
+
+                       if (rio_is_switch(rdev) && (rdev->rswitch == rswitch))
+                               continue;
+
+                       if (RIO_INVALID_ROUTE == rswitch->route_table[destid]) {
+
+                               sport = rio_get_swpinfo_inport(port,
+                                               rswitch->destid, rswitch->hopcount);
+
+                               if (rswitch->add_entry) {
+                                       rio_route_add_entry(port, rswitch, RIO_GLOBAL_TABLE, destid, sport);
+                                       rswitch->route_table[destid] = sport;
+                               }
+                       }
+               }
+       }
+}
+
 /**
  * rio_enum_mport- Start enumeration through a master port
  * @mport: Master port to send transactions
@@ -838,6 +893,7 @@ int rio_enum_mport(struct rio_mport *mport)
                        rc = -EBUSY;
                        goto out;
                }
+               rio_update_route_tables(mport);
                rio_clear_locks(mport);
        } else {
                printk(KERN_INFO "RIO: master port %d link inactive\n",
@@ -865,8 +921,8 @@ static void rio_build_route_tables(void)
            if (rio_is_switch(rdev))
                for (i = 0; i < RIO_MAX_ROUTE_ENTRIES; i++) {
                        if (rio_route_get_entry
-                           (rdev->net->hport, rdev, RIO_GLOBAL_TABLE, i,
-                            &sport) < 0)
+                           (rdev->net->hport, rdev->rswitch, RIO_GLOBAL_TABLE,
+                            i, &sport) < 0)
                                continue;
                        rdev->rswitch->route_table[i] = sport;
                }
index 5687b8fcbf93d4f62e7a666704dc512cf06b3397..eed91434417d7d39e86a2bca4602700e8dfe3177 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/rio.h>
 #include <linux/rio_drv.h>
 #include <linux/stat.h>
-#include <linux/sched.h>       /* for capable() */
 
 #include "rio.h"
 
index 09660e2ab051d6d9e9a313686fc894ca4cbfe6e3..4bbca500d3d212bf264ddff889da7c05b258b5f5 100644 (file)
@@ -1,4 +1,4 @@
-\#
+#
 # RTC class/drivers configuration
 #
 
@@ -95,6 +95,29 @@ config RTC_INTF_DEV_UIE_EMUL
 comment "RTC drivers"
        depends on RTC_CLASS
 
+# this 'CMOS' RTC driver is arch dependent because <asm-generic/rtc.h>
+# requires <asm/mc146818rtc.h> defining CMOS_READ/CMOS_WRITE, and a
+# global rtc_lock ... it's not yet just another platform_device.
+
+config RTC_DRV_CMOS
+       tristate "PC-style 'CMOS' real time clock"
+       depends on RTC_CLASS && (X86_PC || ALPHA || ARM26 || ARM \
+               || M32R || ATARI || POWERPC)
+       help
+         Say "yes" here to get direct support for the real time clock
+         found in every PC or ACPI-based system, and some other boards.
+         Specifically the original MC146818, compatibles like those in
+         PC south bridges, the DS12887 or M48T86, some multifunction
+         or LPC bus chips, and so on.
+
+         Your system will need to define the platform device used by
+         this driver, otherwise it won't be accessible.  This means
+         you can safely enable this driver if you don't know whether
+         or not your board has this kind of hardware.
+
+         This driver can also be built as a module. If so, the module
+         will be called rtc-cmos.
+
 config RTC_DRV_X1205
        tristate "Xicor/Intersil X1205"
        depends on RTC_CLASS && I2C
index e6beedacc96614ad329b82a9167d2e7b989e5de2..92bfe1b3a5faccb4122a7823cbf3720dc0d897eb 100644 (file)
@@ -15,6 +15,7 @@ obj-$(CONFIG_RTC_INTF_SYSFS)  += rtc-sysfs.o
 obj-$(CONFIG_RTC_INTF_PROC)    += rtc-proc.o
 obj-$(CONFIG_RTC_INTF_DEV)     += rtc-dev.o
 
+obj-$(CONFIG_RTC_DRV_CMOS)     += rtc-cmos.o
 obj-$(CONFIG_RTC_DRV_X1205)    += rtc-x1205.o
 obj-$(CONFIG_RTC_DRV_ISL1208)  += rtc-isl1208.o
 obj-$(CONFIG_RTC_DRV_TEST)     += rtc-test.o
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c
new file mode 100644 (file)
index 0000000..85bf795
--- /dev/null
@@ -0,0 +1,725 @@
+/*
+ * RTC class driver for "CMOS RTC":  PCs, ACPI, etc
+ *
+ * Copyright (C) 1996 Paul Gortmaker (drivers/char/rtc.c)
+ * Copyright (C) 2006 David Brownell (convert to new framework)
+ *
+ * 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.
+ */
+
+/*
+ * The original "cmos clock" chip was an MC146818 chip, now obsolete.
+ * That defined the register interface now provided by all PCs, some
+ * non-PC systems, and incorporated into ACPI.  Modern PC chipsets
+ * integrate an MC146818 clone in their southbridge, and boards use
+ * that instead of discrete clones like the DS12887 or M48T86.  There
+ * are also clones that connect using the LPC bus.
+ *
+ * That register API is also used directly by various other drivers
+ * (notably for integrated NVRAM), infrastructure (x86 has code to
+ * bypass the RTC framework, directly reading the RTC during boot
+ * and updating minutes/seconds for systems using NTP synch) and
+ * utilities (like userspace 'hwclock', if no /dev node exists).
+ *
+ * So **ALL** calls to CMOS_READ and CMOS_WRITE must be done with
+ * interrupts disabled, holding the global rtc_lock, to exclude those
+ * other drivers and utilities on correctly configured systems.
+ */
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/spinlock.h>
+#include <linux/platform_device.h>
+#include <linux/mod_devicetable.h>
+
+/* this is for "generic access to PC-style RTC" using CMOS_READ/CMOS_WRITE */
+#include <asm-generic/rtc.h>
+
+
+struct cmos_rtc {
+       struct rtc_device       *rtc;
+       struct device           *dev;
+       int                     irq;
+       struct resource         *iomem;
+
+       u8                      suspend_ctrl;
+
+       /* newer hardware extends the original register set */
+       u8                      day_alrm;
+       u8                      mon_alrm;
+       u8                      century;
+};
+
+/* both platform and pnp busses use negative numbers for invalid irqs */
+#define is_valid_irq(n)                ((n) >= 0)
+
+static const char driver_name[] = "rtc_cmos";
+
+/*----------------------------------------------------------------*/
+
+static int cmos_read_time(struct device *dev, struct rtc_time *t)
+{
+       /* REVISIT:  if the clock has a "century" register, use
+        * that instead of the heuristic in get_rtc_time().
+        * That'll make Y3K compatility (year > 2070) easy!
+        */
+       get_rtc_time(t);
+       return 0;
+}
+
+static int cmos_set_time(struct device *dev, struct rtc_time *t)
+{
+       /* REVISIT:  set the "century" register if available
+        *
+        * NOTE: this ignores the issue whereby updating the seconds
+        * takes effect exactly 500ms after we write the register.
+        * (Also queueing and other delays before we get this far.)
+        */
+       return set_rtc_time(t);
+}
+
+static int cmos_read_alarm(struct device *dev, struct rtc_wkalrm *t)
+{
+       struct cmos_rtc *cmos = dev_get_drvdata(dev);
+       unsigned char   rtc_control;
+
+       if (!is_valid_irq(cmos->irq))
+               return -EIO;
+
+       /* Basic alarms only support hour, minute, and seconds fields.
+        * Some also support day and month, for alarms up to a year in
+        * the future.
+        */
+       t->time.tm_mday = -1;
+       t->time.tm_mon = -1;
+
+       spin_lock_irq(&rtc_lock);
+       t->time.tm_sec = CMOS_READ(RTC_SECONDS_ALARM);
+       t->time.tm_min = CMOS_READ(RTC_MINUTES_ALARM);
+       t->time.tm_hour = CMOS_READ(RTC_HOURS_ALARM);
+
+       if (cmos->day_alrm) {
+               t->time.tm_mday = CMOS_READ(cmos->day_alrm);
+               if (!t->time.tm_mday)
+                       t->time.tm_mday = -1;
+
+               if (cmos->mon_alrm) {
+                       t->time.tm_mon = CMOS_READ(cmos->mon_alrm);
+                       if (!t->time.tm_mon)
+                               t->time.tm_mon = -1;
+               }
+       }
+
+       rtc_control = CMOS_READ(RTC_CONTROL);
+       spin_unlock_irq(&rtc_lock);
+
+       /* REVISIT this assumes PC style usage:  always BCD */
+
+       if (((unsigned)t->time.tm_sec) < 0x60)
+               t->time.tm_sec = BCD2BIN(t->time.tm_sec);
+       else
+               t->time.tm_sec = -1;
+       if (((unsigned)t->time.tm_min) < 0x60)
+               t->time.tm_min = BCD2BIN(t->time.tm_min);
+       else
+               t->time.tm_min = -1;
+       if (((unsigned)t->time.tm_hour) < 0x24)
+               t->time.tm_hour = BCD2BIN(t->time.tm_hour);
+       else
+               t->time.tm_hour = -1;
+
+       if (cmos->day_alrm) {
+               if (((unsigned)t->time.tm_mday) <= 0x31)
+                       t->time.tm_mday = BCD2BIN(t->time.tm_mday);
+               else
+                       t->time.tm_mday = -1;
+               if (cmos->mon_alrm) {
+                       if (((unsigned)t->time.tm_mon) <= 0x12)
+                               t->time.tm_mon = BCD2BIN(t->time.tm_mon) - 1;
+                       else
+                               t->time.tm_mon = -1;
+               }
+       }
+       t->time.tm_year = -1;
+
+       t->enabled = !!(rtc_control & RTC_AIE);
+       t->pending = 0;
+
+       return 0;
+}
+
+static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t)
+{
+       struct cmos_rtc *cmos = dev_get_drvdata(dev);
+       unsigned char   mon, mday, hrs, min, sec;
+       unsigned char   rtc_control, rtc_intr;
+
+       if (!is_valid_irq(cmos->irq))
+               return -EIO;
+
+       /* REVISIT this assumes PC style usage:  always BCD */
+
+       /* Writing 0xff means "don't care" or "match all".  */
+
+       mon = t->time.tm_mon;
+       mon = (mon < 12) ? BIN2BCD(mon) : 0xff;
+       mon++;
+
+       mday = t->time.tm_mday;
+       mday = (mday >= 1 && mday <= 31) ? BIN2BCD(mday) : 0xff;
+
+       hrs = t->time.tm_hour;
+       hrs = (hrs < 24) ? BIN2BCD(hrs) : 0xff;
+
+       min = t->time.tm_min;
+       min = (min < 60) ? BIN2BCD(min) : 0xff;
+
+       sec = t->time.tm_sec;
+       sec = (sec < 60) ? BIN2BCD(sec) : 0xff;
+
+       spin_lock_irq(&rtc_lock);
+
+       /* next rtc irq must not be from previous alarm setting */
+       rtc_control = CMOS_READ(RTC_CONTROL);
+       rtc_control &= ~RTC_AIE;
+       CMOS_WRITE(rtc_control, RTC_CONTROL);
+       rtc_intr = CMOS_READ(RTC_INTR_FLAGS);
+       if (rtc_intr)
+               rtc_update_irq(&cmos->rtc->class_dev, 1, rtc_intr);
+
+       /* update alarm */
+       CMOS_WRITE(hrs, RTC_HOURS_ALARM);
+       CMOS_WRITE(min, RTC_MINUTES_ALARM);
+       CMOS_WRITE(sec, RTC_SECONDS_ALARM);
+
+       /* the system may support an "enhanced" alarm */
+       if (cmos->day_alrm) {
+               CMOS_WRITE(mday, cmos->day_alrm);
+               if (cmos->mon_alrm)
+                       CMOS_WRITE(mon, cmos->mon_alrm);
+       }
+
+       if (t->enabled) {
+               rtc_control |= RTC_AIE;
+               CMOS_WRITE(rtc_control, RTC_CONTROL);
+               rtc_intr = CMOS_READ(RTC_INTR_FLAGS);
+               if (rtc_intr)
+                       rtc_update_irq(&cmos->rtc->class_dev, 1, rtc_intr);
+       }
+
+       spin_unlock_irq(&rtc_lock);
+
+       return 0;
+}
+
+static int cmos_set_freq(struct device *dev, int freq)
+{
+       struct cmos_rtc *cmos = dev_get_drvdata(dev);
+       int             f;
+       unsigned long   flags;
+
+       if (!is_valid_irq(cmos->irq))
+               return -ENXIO;
+
+       /* 0 = no irqs; 1 = 2^15 Hz ... 15 = 2^0 Hz */
+       f = ffs(freq);
+       if (f != 0) {
+               if (f-- > 16 || freq != (1 << f))
+                       return -EINVAL;
+               f = 16 - f;
+       }
+
+       spin_lock_irqsave(&rtc_lock, flags);
+       CMOS_WRITE(RTC_REF_CLCK_32KHZ | f, RTC_FREQ_SELECT);
+       spin_unlock_irqrestore(&rtc_lock, flags);
+
+       return 0;
+}
+
+#if defined(CONFIG_RTC_INTF_DEV) || defined(CONFIG_RTC_INTF_DEV_MODULE)
+
+static int
+cmos_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
+{
+       struct cmos_rtc *cmos = dev_get_drvdata(dev);
+       unsigned char   rtc_control, rtc_intr;
+       unsigned long   flags;
+
+       switch (cmd) {
+       case RTC_AIE_OFF:
+       case RTC_AIE_ON:
+       case RTC_UIE_OFF:
+       case RTC_UIE_ON:
+       case RTC_PIE_OFF:
+       case RTC_PIE_ON:
+               if (!is_valid_irq(cmos->irq))
+                       return -EINVAL;
+               break;
+       default:
+               return -ENOIOCTLCMD;
+       }
+
+       spin_lock_irqsave(&rtc_lock, flags);
+       rtc_control = CMOS_READ(RTC_CONTROL);
+       switch (cmd) {
+       case RTC_AIE_OFF:       /* alarm off */
+               rtc_control &= ~RTC_AIE;
+               break;
+       case RTC_AIE_ON:        /* alarm on */
+               rtc_control |= RTC_AIE;
+               break;
+       case RTC_UIE_OFF:       /* update off */
+               rtc_control &= ~RTC_UIE;
+               break;
+       case RTC_UIE_ON:        /* update on */
+               rtc_control |= RTC_UIE;
+               break;
+       case RTC_PIE_OFF:       /* periodic off */
+               rtc_control &= ~RTC_PIE;
+               break;
+       case RTC_PIE_ON:        /* periodic on */
+               rtc_control |= RTC_PIE;
+               break;
+       }
+       CMOS_WRITE(rtc_control, RTC_CONTROL);
+       rtc_intr = CMOS_READ(RTC_INTR_FLAGS);
+       if (rtc_intr)
+               rtc_update_irq(&cmos->rtc->class_dev, 1, rtc_intr);
+       spin_unlock_irqrestore(&rtc_lock, flags);
+       return 0;
+}
+
+#else
+#define        cmos_rtc_ioctl  NULL
+#endif
+
+#if defined(CONFIG_RTC_INTF_PROC) || defined(CONFIG_RTC_INTF_PROC_MODULE)
+
+static int cmos_procfs(struct device *dev, struct seq_file *seq)
+{
+       struct cmos_rtc *cmos = dev_get_drvdata(dev);
+       unsigned char   rtc_control, valid;
+
+       spin_lock_irq(&rtc_lock);
+       rtc_control = CMOS_READ(RTC_CONTROL);
+       valid = CMOS_READ(RTC_VALID);
+       spin_unlock_irq(&rtc_lock);
+
+       /* NOTE:  at least ICH6 reports battery status using a different
+        * (non-RTC) bit; and SQWE is ignored on many current systems.
+        */
+       return seq_printf(seq,
+                       "periodic_IRQ\t: %s\n"
+                       "update_IRQ\t: %s\n"
+                       // "square_wave\t: %s\n"
+                       // "BCD\t\t: %s\n"
+                       "DST_enable\t: %s\n"
+                       "periodic_freq\t: %d\n"
+                       "batt_status\t: %s\n",
+                       (rtc_control & RTC_PIE) ? "yes" : "no",
+                       (rtc_control & RTC_UIE) ? "yes" : "no",
+                       // (rtc_control & RTC_SQWE) ? "yes" : "no",
+                       // (rtc_control & RTC_DM_BINARY) ? "no" : "yes",
+                       (rtc_control & RTC_DST_EN) ? "yes" : "no",
+                       cmos->rtc->irq_freq,
+                       (valid & RTC_VRT) ? "okay" : "dead");
+}
+
+#else
+#define        cmos_procfs     NULL
+#endif
+
+static const struct rtc_class_ops cmos_rtc_ops = {
+       .ioctl          = cmos_rtc_ioctl,
+       .read_time      = cmos_read_time,
+       .set_time       = cmos_set_time,
+       .read_alarm     = cmos_read_alarm,
+       .set_alarm      = cmos_set_alarm,
+       .proc           = cmos_procfs,
+       .irq_set_freq   = cmos_set_freq,
+};
+
+/*----------------------------------------------------------------*/
+
+static struct cmos_rtc cmos_rtc;
+
+static irqreturn_t cmos_interrupt(int irq, void *p)
+{
+       u8              irqstat;
+
+       spin_lock(&rtc_lock);
+       irqstat = CMOS_READ(RTC_INTR_FLAGS);
+       spin_unlock(&rtc_lock);
+
+       if (irqstat) {
+               /* NOTE: irqstat may have e.g. RTC_PF set
+                * even when RTC_PIE is clear...
+                */
+               rtc_update_irq(p, 1, irqstat);
+               return IRQ_HANDLED;
+       } else
+               return IRQ_NONE;
+}
+
+#ifdef CONFIG_PNPACPI
+#define        is_pnpacpi()    1
+#define        INITSECTION
+
+#else
+#define        is_pnpacpi()    0
+#define        INITSECTION     __init
+#endif
+
+static int INITSECTION
+cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
+{
+       struct cmos_rtc_board_info      *info = dev->platform_data;
+       int                             retval = 0;
+       unsigned char                   rtc_control;
+
+       /* there can be only one ... */
+       if (cmos_rtc.dev)
+               return -EBUSY;
+
+       if (!ports)
+               return -ENODEV;
+
+       cmos_rtc.irq = rtc_irq;
+       cmos_rtc.iomem = ports;
+
+       /* For ACPI systems the info comes from the FADT.  On others,
+        * board specific setup provides it as appropriate.
+        */
+       if (info) {
+               cmos_rtc.day_alrm = info->rtc_day_alarm;
+               cmos_rtc.mon_alrm = info->rtc_mon_alarm;
+               cmos_rtc.century = info->rtc_century;
+       }
+
+       cmos_rtc.rtc = rtc_device_register(driver_name, dev,
+                               &cmos_rtc_ops, THIS_MODULE);
+       if (IS_ERR(cmos_rtc.rtc))
+               return PTR_ERR(cmos_rtc.rtc);
+
+       cmos_rtc.dev = dev;
+       dev_set_drvdata(dev, &cmos_rtc);
+
+       /* platform and pnp busses handle resources incompatibly.
+        *
+        * REVISIT for non-x86 systems we may need to handle io memory
+        * resources: ioremap them, and request_mem_region().
+        */
+       if (is_pnpacpi()) {
+               retval = request_resource(&ioport_resource, ports);
+               if (retval < 0) {
+                       dev_dbg(dev, "i/o registers already in use\n");
+                       goto cleanup0;
+               }
+       }
+       rename_region(ports, cmos_rtc.rtc->class_dev.class_id);
+
+       spin_lock_irq(&rtc_lock);
+
+       /* force periodic irq to CMOS reset default of 1024Hz;
+        *
+        * REVISIT it's been reported that at least one x86_64 ALI mobo
+        * doesn't use 32KHz here ... for portability we might need to
+        * do something about other clock frequencies.
+        */
+       CMOS_WRITE(RTC_REF_CLCK_32KHZ | 0x06, RTC_FREQ_SELECT);
+       cmos_rtc.rtc->irq_freq = 1024;
+
+       /* disable irqs.
+        *
+        * NOTE after changing RTC_xIE bits we always read INTR_FLAGS;
+        * allegedly some older rtcs need that to handle irqs properly
+        */
+       rtc_control = CMOS_READ(RTC_CONTROL);
+       rtc_control &= ~(RTC_PIE | RTC_AIE | RTC_UIE);
+       CMOS_WRITE(rtc_control, RTC_CONTROL);
+       CMOS_READ(RTC_INTR_FLAGS);
+
+       spin_unlock_irq(&rtc_lock);
+
+       /* FIXME teach the alarm code how to handle binary mode;
+        * <asm-generic/rtc.h> doesn't know 12-hour mode either.
+        */
+       if (!(rtc_control & RTC_24H) || (rtc_control & (RTC_DM_BINARY))) {
+               dev_dbg(dev, "only 24-hr BCD mode supported\n");
+               retval = -ENXIO;
+               goto cleanup1;
+       }
+
+       if (is_valid_irq(rtc_irq))
+               retval = request_irq(rtc_irq, cmos_interrupt, IRQF_DISABLED,
+                               cmos_rtc.rtc->class_dev.class_id,
+                               &cmos_rtc.rtc->class_dev);
+       if (retval < 0) {
+               dev_dbg(dev, "IRQ %d is already in use\n", rtc_irq);
+               goto cleanup1;
+       }
+
+       /* REVISIT optionally make 50 or 114 bytes NVRAM available,
+        * like rtc-ds1553, rtc-ds1742 ... this will often include
+        * registers for century, and day/month alarm.
+        */
+
+       pr_info("%s: alarms up to one %s%s\n",
+                       cmos_rtc.rtc->class_dev.class_id,
+                       is_valid_irq(rtc_irq)
+                               ?  (cmos_rtc.mon_alrm
+                                       ? "year"
+                                       : (cmos_rtc.day_alrm
+                                               ? "month" : "day"))
+                               : "no",
+                       cmos_rtc.century ? ", y3k" : ""
+                       );
+
+       return 0;
+
+cleanup1:
+       rename_region(ports, NULL);
+cleanup0:
+       rtc_device_unregister(cmos_rtc.rtc);
+       return retval;
+}
+
+static void cmos_do_shutdown(void)
+{
+       unsigned char   rtc_control;
+
+       spin_lock_irq(&rtc_lock);
+       rtc_control = CMOS_READ(RTC_CONTROL);
+       rtc_control &= ~(RTC_PIE|RTC_AIE|RTC_UIE);
+       CMOS_WRITE(rtc_control, RTC_CONTROL);
+       CMOS_READ(RTC_INTR_FLAGS);
+       spin_unlock_irq(&rtc_lock);
+}
+
+static void __exit cmos_do_remove(struct device *dev)
+{
+       struct cmos_rtc *cmos = dev_get_drvdata(dev);
+
+       cmos_do_shutdown();
+
+       if (is_pnpacpi())
+               release_resource(cmos->iomem);
+       rename_region(cmos->iomem, NULL);
+
+       if (is_valid_irq(cmos->irq))
+               free_irq(cmos->irq, &cmos_rtc.rtc->class_dev);
+
+       rtc_device_unregister(cmos_rtc.rtc);
+
+       cmos_rtc.dev = NULL;
+       dev_set_drvdata(dev, NULL);
+}
+
+#ifdef CONFIG_PM
+
+static int cmos_suspend(struct device *dev, pm_message_t mesg)
+{
+       struct cmos_rtc *cmos = dev_get_drvdata(dev);
+       int             do_wake = device_may_wakeup(dev);
+       unsigned char   tmp, irqstat;
+
+       /* only the alarm might be a wakeup event source */
+       spin_lock_irq(&rtc_lock);
+       cmos->suspend_ctrl = tmp = CMOS_READ(RTC_CONTROL);
+       if (tmp & (RTC_PIE|RTC_AIE|RTC_UIE)) {
+               if (do_wake)
+                       tmp &= ~(RTC_PIE|RTC_UIE);
+               else
+                       tmp &= ~(RTC_PIE|RTC_AIE|RTC_UIE);
+               CMOS_WRITE(tmp, RTC_CONTROL);
+               irqstat = CMOS_READ(RTC_INTR_FLAGS);
+       } else
+               irqstat = 0;
+       spin_unlock_irq(&rtc_lock);
+
+       if (irqstat)
+               rtc_update_irq(&cmos->rtc->class_dev, 1, irqstat);
+
+       /* ACPI HOOK:  enable ACPI_EVENT_RTC when (tmp & RTC_AIE)
+        * ... it'd be best if we could do that under rtc_lock.
+        */
+
+       pr_debug("%s: suspend%s, ctrl %02x\n",
+                       cmos_rtc.rtc->class_dev.class_id,
+                       (tmp & RTC_AIE) ? ", alarm may wake" : "",
+                       tmp);
+
+       return 0;
+}
+
+static int cmos_resume(struct device *dev)
+{
+       struct cmos_rtc *cmos = dev_get_drvdata(dev);
+       unsigned char   tmp = cmos->suspend_ctrl;
+
+       /* REVISIT:  a mechanism to resync the system clock (jiffies)
+        * on resume should be portable between platforms ...
+        */
+
+       /* re-enable any irqs previously active */
+       if (tmp & (RTC_PIE|RTC_AIE|RTC_UIE)) {
+
+               /* ACPI HOOK:  disable ACPI_EVENT_RTC when (tmp & RTC_AIE) */
+
+               spin_lock_irq(&rtc_lock);
+               CMOS_WRITE(tmp, RTC_CONTROL);
+               tmp = CMOS_READ(RTC_INTR_FLAGS);
+               spin_unlock_irq(&rtc_lock);
+               if (tmp)
+                       rtc_update_irq(&cmos->rtc->class_dev, 1, tmp);
+       }
+
+       pr_debug("%s: resume, ctrl %02x\n",
+                       cmos_rtc.rtc->class_dev.class_id,
+                       cmos->suspend_ctrl);
+
+
+       return 0;
+}
+
+#else
+#define        cmos_suspend    NULL
+#define        cmos_resume     NULL
+#endif
+
+/*----------------------------------------------------------------*/
+
+/* The "CMOS" RTC normally lives on the platform_bus.  On ACPI systems,
+ * the device node may alternatively be created as a PNP device.
+ */
+
+#ifdef CONFIG_PNPACPI
+
+#include <linux/pnp.h>
+
+static int __devinit
+cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
+{
+       /* REVISIT paranoia argues for a shutdown notifier, since PNP
+        * drivers can't provide shutdown() methods to disable IRQs.
+        * Or better yet, fix PNP to allow those methods...
+        */
+       return cmos_do_probe(&pnp->dev,
+                       &pnp->res.port_resource[0],
+                       pnp->res.irq_resource[0].start);
+}
+
+static void __exit cmos_pnp_remove(struct pnp_dev *pnp)
+{
+       cmos_do_remove(&pnp->dev);
+}
+
+#ifdef CONFIG_PM
+
+static int cmos_pnp_suspend(struct pnp_dev *pnp, pm_message_t mesg)
+{
+       return cmos_suspend(&pnp->dev, mesg);
+}
+
+static int cmos_pnp_resume(struct pnp_dev *pnp)
+{
+       return cmos_resume(&pnp->dev);
+}
+
+#else
+#define        cmos_pnp_suspend        NULL
+#define        cmos_pnp_resume         NULL
+#endif
+
+
+static const struct pnp_device_id rtc_ids[] = {
+       { .id = "PNP0b00", },
+       { .id = "PNP0b01", },
+       { .id = "PNP0b02", },
+       { },
+};
+MODULE_DEVICE_TABLE(pnp, rtc_ids);
+
+static struct pnp_driver cmos_pnp_driver = {
+       .name           = (char *) driver_name,
+       .id_table       = rtc_ids,
+       .probe          = cmos_pnp_probe,
+       .remove         = __exit_p(cmos_pnp_remove),
+
+       /* flag ensures resume() gets called, and stops syslog spam */
+       .flags          = PNP_DRIVER_RES_DO_NOT_CHANGE,
+       .suspend        = cmos_pnp_suspend,
+       .resume         = cmos_pnp_resume,
+};
+
+static int __init cmos_init(void)
+{
+       return pnp_register_driver(&cmos_pnp_driver);
+}
+module_init(cmos_init);
+
+static void __exit cmos_exit(void)
+{
+       pnp_unregister_driver(&cmos_pnp_driver);
+}
+module_exit(cmos_exit);
+
+#else  /* no PNPACPI */
+
+/*----------------------------------------------------------------*/
+
+/* Platform setup should have set up an RTC device, when PNPACPI is
+ * unavailable ... this is the normal case, common even on PCs.
+ */
+
+static int __init cmos_platform_probe(struct platform_device *pdev)
+{
+       return cmos_do_probe(&pdev->dev,
+                       platform_get_resource(pdev, IORESOURCE_IO, 0),
+                       platform_get_irq(pdev, 0));
+}
+
+static int __exit cmos_platform_remove(struct platform_device *pdev)
+{
+       cmos_do_remove(&pdev->dev);
+       return 0;
+}
+
+static void cmos_platform_shutdown(struct platform_device *pdev)
+{
+       cmos_do_shutdown();
+}
+
+static struct platform_driver cmos_platform_driver = {
+       .remove         = __exit_p(cmos_platform_remove),
+       .shutdown       = cmos_platform_shutdown,
+       .driver = {
+               .name           = (char *) driver_name,
+               .suspend        = cmos_suspend,
+               .resume         = cmos_resume,
+       }
+};
+
+static int __init cmos_init(void)
+{
+       return platform_driver_probe(&cmos_platform_driver,
+                       cmos_platform_probe);
+}
+module_init(cmos_init);
+
+static void __exit cmos_exit(void)
+{
+       platform_driver_unregister(&cmos_platform_driver);
+}
+module_exit(cmos_exit);
+
+
+#endif /* !PNPACPI */
+
+MODULE_AUTHOR("David Brownell");
+MODULE_DESCRIPTION("Driver for PC-style 'CMOS' RTCs");
+MODULE_LICENSE("GPL");
index 82f2ac87ccd4722c8a4f9dbef562ddae1f6f6064..137330b8636b1192ec2965ee22defd28a600a4db 100644 (file)
@@ -384,7 +384,7 @@ static int rtc_dev_fasync(int fd, struct file *file, int on)
        return fasync_helper(fd, file, on, &rtc->async_queue);
 }
 
-static struct file_operations rtc_dev_fops = {
+static const struct file_operations rtc_dev_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .read           = rtc_dev_read,
index 001eb1123a657707a581b0915ec919e435a95dd7..e27176c0e18fb0cd2ec6f11457d0f7c3ce4664ff 100644 (file)
@@ -297,7 +297,7 @@ static struct bin_attribute ds1553_nvram_attr = {
        .write = ds1553_nvram_write,
 };
 
-static int __init ds1553_rtc_probe(struct platform_device *pdev)
+static int __devinit ds1553_rtc_probe(struct platform_device *pdev)
 {
        struct rtc_device *rtc;
        struct resource *res;
index 205fa28593b769820f966ec25e5f122a6745bdaa..dfef1637bfb8a1a69dc1848d75e2b490a458ddaf 100644 (file)
@@ -199,7 +199,7 @@ static int ds1672_probe(struct i2c_adapter *adapter, int address, int kind)
        struct i2c_client *client;
        struct rtc_device *rtc;
 
-       dev_dbg(adapter->class_dev.dev, "%s\n", __FUNCTION__);
+       dev_dbg(&adapter->dev, "%s\n", __FUNCTION__);
 
        if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {
                err = -ENODEV;
index 17633bfa848028ba04970d22d05e59a236ed9081..d68288b389dc18b041c07060dac49da774da5df1 100644 (file)
@@ -165,7 +165,7 @@ static struct bin_attribute ds1742_nvram_attr = {
        .write = ds1742_nvram_write,
 };
 
-static int __init ds1742_rtc_probe(struct platform_device *pdev)
+static int __devinit ds1742_rtc_probe(struct platform_device *pdev)
 {
        struct rtc_device *rtc;
        struct resource *res;
index d59880d44fba26e3555c46d000c13a65e12d3ec4..9de8d67f4f8d8ac71bcbc4c198d4b496d8c4dc27 100644 (file)
@@ -417,13 +417,13 @@ static int __devinit omap_rtc_probe(struct platform_device *pdev)
                rtc_write(OMAP_RTC_STATUS_ALARM, OMAP_RTC_STATUS_REG);
 
        /* handle periodic and alarm irqs */
-       if (request_irq(omap_rtc_timer, rtc_irq, SA_INTERRUPT,
+       if (request_irq(omap_rtc_timer, rtc_irq, IRQF_DISABLED,
                        rtc->class_dev.class_id, &rtc->class_dev)) {
                pr_debug("%s: RTC timer interrupt IRQ%d already claimed\n",
                        pdev->name, omap_rtc_timer);
                goto fail0;
        }
-       if (request_irq(omap_rtc_alarm, rtc_irq, SA_INTERRUPT,
+       if (request_irq(omap_rtc_alarm, rtc_irq, IRQF_DISABLED,
                        rtc->class_dev.class_id, &rtc->class_dev)) {
                pr_debug("%s: RTC alarm interrupt IRQ%d already claimed\n",
                        pdev->name, omap_rtc_alarm);
index 038118bbfaea3f512c756414a68e5f27818a1d9c..0242d803ebe5b21d43c42d6954d601ed05372194 100644 (file)
@@ -279,7 +279,7 @@ static int pcf8563_probe(struct i2c_adapter *adapter, int address, int kind)
 
        int err = 0;
 
-       dev_dbg(adapter->class_dev.dev, "%s\n", __FUNCTION__);
+       dev_dbg(&adapter->dev, "%s\n", __FUNCTION__);
 
        if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {
                err = -ENODEV;
index c272afd62173245b3d6d503fd9703a8102891329..1bd624fc685c8c70722acdef390e30a86ef9318e 100644 (file)
@@ -96,7 +96,7 @@ static int rtc_proc_release(struct inode *inode, struct file *file)
        return res;
 }
 
-static struct file_operations rtc_proc_fops = {
+static const struct file_operations rtc_proc_fops = {
        .open           = rtc_proc_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index e7851e3739abd11030cdf0a724da2436315164dd..09bbe575647b09bd9a5acdfb94cd78c97807fe94 100644 (file)
@@ -499,7 +499,7 @@ static int rs5c372_probe(struct i2c_adapter *adapter, int address, int kind)
        struct rs5c372 *rs5c372;
        struct rtc_time tm;
 
-       dev_dbg(adapter->class_dev.dev, "%s\n", __FUNCTION__);
+       dev_dbg(&adapter->dev, "%s\n", __FUNCTION__);
 
        if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {
                err = -ENODEV;
index f406a2b55aea829b48e05b53180e40e8b1a48a04..9a79a24a74874189deab5885af6ea98c6de50746 100644 (file)
@@ -350,7 +350,7 @@ static int s3c_rtc_open(struct device *dev)
        int ret;
 
        ret = request_irq(s3c_rtc_alarmno, s3c_rtc_alarmirq,
-                         SA_INTERRUPT,  "s3c2410-rtc alarm", rtc_dev);
+                         IRQF_DISABLED,  "s3c2410-rtc alarm", rtc_dev);
 
        if (ret) {
                dev_err(dev, "IRQ%d error %d\n", s3c_rtc_alarmno, ret);
@@ -358,7 +358,7 @@ static int s3c_rtc_open(struct device *dev)
        }
 
        ret = request_irq(s3c_rtc_tickno, s3c_rtc_tickirq,
-                         SA_INTERRUPT,  "s3c2410-rtc tick", rtc_dev);
+                         IRQF_DISABLED,  "s3c2410-rtc tick", rtc_dev);
 
        if (ret) {
                dev_err(dev, "IRQ%d error %d\n", s3c_rtc_tickno, ret);
index 2ddd0cf071404ef4473256d38775036f33d4e3c5..899ab8c514facbda5965be87bff5422b8aa0ebf0 100644 (file)
@@ -78,6 +78,92 @@ static struct attribute_group rtc_attr_group = {
        .attrs = rtc_attrs,
 };
 
+
+static ssize_t
+rtc_sysfs_show_wakealarm(struct class_device *dev, char *buf)
+{
+       ssize_t retval;
+       unsigned long alarm;
+       struct rtc_wkalrm alm;
+
+       /* Don't show disabled alarms; but the RTC could leave the
+        * alarm enabled after it's already triggered.  Alarms are
+        * conceptually one-shot, even though some common hardware
+        * (PCs) doesn't actually work that way.
+        *
+        * REVISIT maybe we should require RTC implementations to
+        * disable the RTC alarm after it triggers, for uniformity.
+        */
+       retval = rtc_read_alarm(dev, &alm);
+       if (retval == 0 && alm.enabled) {
+               rtc_tm_to_time(&alm.time, &alarm);
+               retval = sprintf(buf, "%lu\n", alarm);
+       }
+
+       return retval;
+}
+
+static ssize_t
+rtc_sysfs_set_wakealarm(struct class_device *dev, const char *buf, size_t n)
+{
+       ssize_t retval;
+       unsigned long now, alarm;
+       struct rtc_wkalrm alm;
+
+       /* Only request alarms that trigger in the future.  Disable them
+        * by writing another time, e.g. 0 meaning Jan 1 1970 UTC.
+        */
+       retval = rtc_read_time(dev, &alm.time);
+       if (retval < 0)
+               return retval;
+       rtc_tm_to_time(&alm.time, &now);
+
+       alarm = simple_strtoul(buf, NULL, 0);
+       if (alarm > now) {
+               /* Avoid accidentally clobbering active alarms; we can't
+                * entirely prevent that here, without even the minimal
+                * locking from the /dev/rtcN api.
+                */
+               retval = rtc_read_alarm(dev, &alm);
+               if (retval < 0)
+                       return retval;
+               if (alm.enabled)
+                       return -EBUSY;
+
+               alm.enabled = 1;
+       } else {
+               alm.enabled = 0;
+
+               /* Provide a valid future alarm time.  Linux isn't EFI,
+                * this time won't be ignored when disabling the alarm.
+                */
+               alarm = now + 300;
+       }
+       rtc_time_to_tm(alarm, &alm.time);
+
+       retval = rtc_set_alarm(dev, &alm);
+       return (retval < 0) ? retval : n;
+}
+static const CLASS_DEVICE_ATTR(wakealarm, S_IRUGO | S_IWUSR,
+               rtc_sysfs_show_wakealarm, rtc_sysfs_set_wakealarm);
+
+
+/* The reason to trigger an alarm with no process watching it (via sysfs)
+ * is its side effect:  waking from a system state like suspend-to-RAM or
+ * suspend-to-disk.  So: no attribute unless that side effect is possible.
+ * (Userspace may disable that mechanism later.)
+ */
+static inline int rtc_does_wakealarm(struct class_device *class_dev)
+{
+       struct rtc_device *rtc;
+
+       if (!device_can_wakeup(class_dev->dev))
+               return 0;
+       rtc = to_rtc_device(class_dev);
+       return rtc->ops->set_alarm != NULL;
+}
+
+
 static int rtc_sysfs_add_device(struct class_device *class_dev,
                                        struct class_interface *class_intf)
 {
@@ -87,8 +173,18 @@ static int rtc_sysfs_add_device(struct class_device *class_dev,
 
        err = sysfs_create_group(&class_dev->kobj, &rtc_attr_group);
        if (err)
-               dev_err(class_dev->dev,
-                       "failed to create sysfs attributes\n");
+               dev_err(class_dev->dev, "failed to create %s\n",
+                               "sysfs attributes");
+       else if (rtc_does_wakealarm(class_dev)) {
+               /* not all RTCs support both alarms and wakeup */
+               err = class_device_create_file(class_dev,
+                                       &class_device_attr_wakealarm);
+               if (err) {
+                       dev_err(class_dev->dev, "failed to create %s\n",
+                                       "alarm attribute");
+                       sysfs_remove_group(&class_dev->kobj, &rtc_attr_group);
+               }
+       }
 
        return err;
 }
@@ -96,6 +192,9 @@ static int rtc_sysfs_add_device(struct class_device *class_dev,
 static void rtc_sysfs_remove_device(struct class_device *class_dev,
                                struct class_interface *class_intf)
 {
+       if (rtc_does_wakealarm(class_dev))
+               class_device_remove_file(class_dev,
+                               &class_device_attr_wakealarm);
        sysfs_remove_group(&class_dev->kobj, &rtc_attr_group);
 }
 
index 019ae255b0c8b2d143aae18a6d5ebbdb05b135d2..513d1a611aaba46edb1343ae0bb2ceab58683680 100644 (file)
@@ -506,7 +506,7 @@ static int x1205_probe(struct i2c_adapter *adapter, int address, int kind)
        struct i2c_client *client;
        struct rtc_device *rtc;
 
-       dev_dbg(adapter->class_dev.dev, "%s\n", __FUNCTION__);
+       dev_dbg(&adapter->dev, "%s\n", __FUNCTION__);
 
        if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {
                err = -ENODEV;
index 6cedc914077e7c3f33e7385a5c84be73ba3c2e8a..4b8a95fba1e5dc706e4e5e8b2bbfaf0185f57cad 100644 (file)
@@ -650,7 +650,7 @@ static unsigned int dasd_eer_poll(struct file *filp, poll_table *ptable)
        return mask;
 }
 
-static struct file_operations dasd_eer_fops = {
+static const struct file_operations dasd_eer_fops = {
        .open           = &dasd_eer_open,
        .release        = &dasd_eer_close,
        .read           = &dasd_eer_read,
index 8b7e11815d7044fa4ba1490cb2fe5859f4137126..8b3b0f4a157c09aaa23299a6cdbdfc8be2f1406f 100644 (file)
@@ -147,7 +147,7 @@ static int dasd_devices_open(struct inode *inode, struct file *file)
        return seq_open(file, &dasd_devices_seq_ops);
 }
 
-static struct file_operations dasd_devices_file_ops = {
+static const struct file_operations dasd_devices_file_ops = {
        .open           = dasd_devices_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index e1a746269c4ccd9b5da42397a7da08daeae5be31..ef36f2132aa43fb994ee878a46022f5776c64ed0 100644 (file)
@@ -493,7 +493,7 @@ fs3270_close(struct inode *inode, struct file *filp)
        return 0;
 }
 
-static struct file_operations fs3270_fops = {
+static const struct file_operations fs3270_fops = {
        .owner           = THIS_MODULE,         /* owner */
        .read            = fs3270_read,         /* read */
        .write           = fs3270_write,        /* write */
index 3a1a958fb5f2843a2132e1a487af739d06417915..8df7b1323c053177f078c9e06798cd5a75909a7f 100644 (file)
@@ -547,7 +547,7 @@ static unsigned int mon_poll(struct file *filp, struct poll_table_struct *p)
        return 0;
 }
 
-static struct file_operations mon_fops = {
+static const struct file_operations mon_fops = {
        .owner   = THIS_MODULE,
        .open    = &mon_open,
        .release = &mon_close,
index 9e451acc6491fa50c22bc1c5f09592568fa5c054..268598ef3efe9ada78e23881b416ce6ef933b44e 100644 (file)
@@ -255,7 +255,7 @@ out_error:
        return rc;
 }
 
-static struct file_operations monwrite_fops = {
+static const struct file_operations monwrite_fops = {
        .owner   = THIS_MODULE,
        .open    = &monwrite_open,
        .release = &monwrite_close,
index 90536f60bf502f0410c13607d0b0555c494ae374..076816b9d52874776ddb576dca5c3b6773a0ebe9 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/tty.h>
 #include <linux/tty_driver.h>
 #include <linux/tty_flip.h>
-#include <linux/sched.h>
 #include <linux/wait.h>
 #include <linux/slab.h>
 #include <linux/err.h>
index 544f137d70d7e184a04172330ddae4ce1d6561d6..f77dc33b5f8dfb0c83685ab4a11b472162f7d0fe 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/tty.h>
 #include <linux/tty_driver.h>
 #include <linux/tty_flip.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/mm.h>
 #include <linux/major.h>
index 9faea04e11e9db2090ac7d7a0d9172c7e092d8f2..b830a8cbef7873baca2b68f886df21e0c044855e 100644 (file)
@@ -39,7 +39,7 @@ static int tapechar_ioctl(struct inode *, struct file *, unsigned int,
 static long tapechar_compat_ioctl(struct file *, unsigned int,
                          unsigned long);
 
-static struct file_operations tape_fops =
+static const struct file_operations tape_fops =
 {
        .owner = THIS_MODULE,
        .read = tapechar_read,
index 56b87618b100c1d33b8829d3f9bd184f7c80f7b6..2e0d29730b67590639f8e0dba84b48ae90ebd5b5 100644 (file)
@@ -36,7 +36,7 @@ static struct class *tape_class;
 struct tape_class_device *register_tape_dev(
        struct device *         device,
        dev_t                   dev,
-       struct file_operations *fops,
+       const struct file_operations *fops,
        char *                  device_name,
        char *                  mode_name)
 {
index 3d0ca054cdee75fb2b51dfcad55f92889216874b..a8bd9b47fad62ac022aa9a88517b5b65f917a8ca 100644 (file)
@@ -52,7 +52,7 @@ struct tape_class_device {
 struct tape_class_device *register_tape_dev(
        struct device *         device,
        dev_t                   dev,
-       struct file_operations *fops,
+       const struct file_operations *fops,
        char *                  device_name,
        char *                  node_name
 );
index 655d375ab22bc626fdc9ad3aba7197dcd2b9e736..cea49f001f89cbea1fadc0c541e0f08b2d888491 100644 (file)
@@ -109,7 +109,7 @@ static int tape_proc_open(struct inode *inode, struct file *file)
        return seq_open(file, &tape_proc_seq);
 }
 
-static struct file_operations tape_proc_ops =
+static const struct file_operations tape_proc_ops =
 {
        .open           = tape_proc_open,
        .read           = seq_read,
index a420cd099041b1f660d1d5fee056bf501b911096..fce3dac5cb3ee38236ed8bff32a8e475153b2f18 100644 (file)
@@ -173,7 +173,7 @@ static long vmcp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
        }
 }
 
-static struct file_operations vmcp_fops = {
+static const struct file_operations vmcp_fops = {
        .owner          = THIS_MODULE,
        .open           = &vmcp_open,
        .release        = &vmcp_release,
index 8432a76b961ed2932b8c318272eb38ff0beb3014..b87d3b019936d7a215710a3e1b6f7c3419e90482 100644 (file)
@@ -88,7 +88,7 @@ static int vmlogrdr_release(struct inode *, struct file *);
 static ssize_t vmlogrdr_read (struct file *filp, char __user *data,
                              size_t count, loff_t * ppos);
 
-static struct file_operations vmlogrdr_fops = {
+static const struct file_operations vmlogrdr_fops = {
        .owner   = THIS_MODULE,
        .open    = vmlogrdr_open,
        .release = vmlogrdr_release,
index 4b868f72fe89efd4a3befcf73bfdd5ef85e34ac2..680b9b58b80ea0ce6479b8085cdf9b70767289fd 100644 (file)
@@ -228,7 +228,7 @@ static ssize_t vmwdt_write(struct file *f, const char __user *buf,
        return count;
 }
 
-static struct file_operations vmwdt_fops = {
+static const struct file_operations vmwdt_fops = {
        .open    = &vmwdt_open,
        .release = &vmwdt_close,
        .ioctl   = &vmwdt_ioctl,
index aa65df4dfcedf174aaa337d2fe42105c5c9cc731..ec0404874fada1f004c01f2ebfbc54a81c87de22 100644 (file)
@@ -364,7 +364,7 @@ cio_ignore_proc_open(struct inode *inode, struct file *file)
        return seq_open(file, &cio_ignore_proc_seq_ops);
 }
 
-static struct file_operations cio_ignore_proc_fops = {
+static const struct file_operations cio_ignore_proc_fops = {
        .open    = cio_ignore_proc_open,
        .read    = seq_read,
        .llseek  = seq_lseek,
index f17275917fe55a6598e1120b316e8e7695d76c45..997f46874537fda00c4d0fc6f05da99fdf889883 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <linux/module.h>
 #include <linux/init.h>
+#include <linux/kernel.h>
 
 #include <asm/ccwdev.h>
 #include <asm/delay.h>
@@ -138,7 +139,7 @@ VM_virtual_device_info (__u16 devno, struct senseid *ps)
                ps->cu_model = 0x60;
                return;
        }
-       for (i = 0; i < sizeof(vm_devices) / sizeof(vm_devices[0]); i++)
+       for (i = 0; i < ARRAY_SIZE(vm_devices); i++)
                if (diag_data.vrdcvcla == vm_devices[i].vrdcvcla &&
                    diag_data.vrdcvtyp == vm_devices[i].vrdcvtyp) {
                        ps->cu_type = vm_devices[i].cu_type;
index d7b25b8f71d236e9c783fcafedfaa853a074344d..7c7775aae38ab7b8675f7a808c103a4909f378b8 100644 (file)
@@ -23,8 +23,7 @@
 #include "chsc.h"
 #include "device.h"
 
-int
-ccw_device_set_options(struct ccw_device *cdev, unsigned long flags)
+int ccw_device_set_options_mask(struct ccw_device *cdev, unsigned long flags)
 {
        /*
        * The flag usage is mutal exclusive ...
@@ -39,6 +38,33 @@ ccw_device_set_options(struct ccw_device *cdev, unsigned long flags)
        return 0;
 }
 
+int ccw_device_set_options(struct ccw_device *cdev, unsigned long flags)
+{
+       /*
+       * The flag usage is mutal exclusive ...
+       */
+       if (((flags & CCWDEV_EARLY_NOTIFICATION) &&
+           (flags & CCWDEV_REPORT_ALL)) ||
+           ((flags & CCWDEV_EARLY_NOTIFICATION) &&
+            cdev->private->options.repall) ||
+           ((flags & CCWDEV_REPORT_ALL) &&
+            cdev->private->options.fast))
+               return -EINVAL;
+       cdev->private->options.fast |= (flags & CCWDEV_EARLY_NOTIFICATION) != 0;
+       cdev->private->options.repall |= (flags & CCWDEV_REPORT_ALL) != 0;
+       cdev->private->options.pgroup |= (flags & CCWDEV_DO_PATHGROUP) != 0;
+       cdev->private->options.force |= (flags & CCWDEV_ALLOW_FORCE) != 0;
+       return 0;
+}
+
+void ccw_device_clear_options(struct ccw_device *cdev, unsigned long flags)
+{
+       cdev->private->options.fast &= (flags & CCWDEV_EARLY_NOTIFICATION) == 0;
+       cdev->private->options.repall &= (flags & CCWDEV_REPORT_ALL) == 0;
+       cdev->private->options.pgroup &= (flags & CCWDEV_DO_PATHGROUP) == 0;
+       cdev->private->options.force &= (flags & CCWDEV_ALLOW_FORCE) == 0;
+}
+
 int
 ccw_device_clear(struct ccw_device *cdev, unsigned long intparm)
 {
@@ -601,7 +627,9 @@ _ccw_device_get_device_number(struct ccw_device *cdev)
 
 
 MODULE_LICENSE("GPL");
+EXPORT_SYMBOL(ccw_device_set_options_mask);
 EXPORT_SYMBOL(ccw_device_set_options);
+EXPORT_SYMBOL(ccw_device_clear_options);
 EXPORT_SYMBOL(ccw_device_clear);
 EXPORT_SYMBOL(ccw_device_halt);
 EXPORT_SYMBOL(ccw_device_resume);
index d726cd5777dedbf789cda3a2188cb0a522a8be90..5b1e3ff26c0ba24e990b983a2501ade1e3449c4c 100644 (file)
@@ -3194,7 +3194,7 @@ qdio_establish(struct qdio_initialize *init_data)
 
        spin_lock_irqsave(get_ccwdev_lock(cdev),saveflags);
 
-       ccw_device_set_options(cdev, 0);
+       ccw_device_set_options_mask(cdev, 0);
        result=ccw_device_start_timeout(cdev,&irq_ptr->ccw,
                                        QDIO_DOING_ESTABLISH,0, 0,
                                        QDIO_ESTABLISH_TIMEOUT);
index b9e59bc9435aea3e3c6ad0dea4e903cde728b21a..99761391f34090f89564d22dd2f8c94ad39bc99a 100644 (file)
@@ -807,7 +807,7 @@ static long zcrypt_compat_ioctl(struct file *filp, unsigned int cmd,
 /**
  * Misc device file operations.
  */
-static struct file_operations zcrypt_fops = {
+static const struct file_operations zcrypt_fops = {
        .owner          = THIS_MODULE,
        .read           = zcrypt_read,
        .write          = zcrypt_write,
@@ -1063,7 +1063,6 @@ int __init zcrypt_api_init(void)
                rc = -ENOMEM;
                goto out_misc;
        }
-       zcrypt_entry->nlink = 1;
        zcrypt_entry->data = NULL;
        zcrypt_entry->read_proc = zcrypt_status_read;
        zcrypt_entry->write_proc = zcrypt_status_write;
index 5a84fbbc6611de06d3c51ce4a9c98218854e1848..0d6d5fcc128b8231d3b53d87ae762a4a83075bd8 100644 (file)
@@ -45,7 +45,6 @@
 #include <linux/types.h>
 #include <linux/interrupt.h>
 #include <linux/timer.h>
-#include <linux/sched.h>
 #include <linux/bitops.h>
 
 #include <linux/signal.h>
index b97dd15bdb9a1ecb7d0b15b3c6ffcbc49ff12200..ecca1046714efd213f57fce49a69bca391faf047 100644 (file)
@@ -1511,8 +1511,7 @@ lcs_txbuffer_cb(struct lcs_channel *channel, struct lcs_buffer *buffer)
        LCS_DBF_TEXT(5, trace, "txbuffcb");
        /* Put buffer back to pool. */
        lcs_release_buffer(channel, buffer);
-       card = (struct lcs_card *)
-               ((char *) channel - offsetof(struct lcs_card, write));
+       card = container_of(channel, struct lcs_card, write);
        if (netif_queue_stopped(card->dev) && netif_carrier_ok(card->dev))
                netif_wake_queue(card->dev);
        spin_lock(&card->lock);
@@ -1810,8 +1809,7 @@ lcs_get_frames_cb(struct lcs_channel *channel, struct lcs_buffer *buffer)
                LCS_DBF_TEXT(4, trace, "-eiogpkt");
                return;
        }
-       card = (struct lcs_card *)
-               ((char *) channel - offsetof(struct lcs_card, read));
+       card = container_of(channel, struct lcs_card, read);
        offset = 0;
        while (lcs_hdr->offset != 0) {
                if (lcs_hdr->offset <= 0 ||
index 6387b483f2bfe32fb7c7875fa28fe5b742222e67..594320ca1b7c96ae7e69284017e6d77edb0e691e 100644 (file)
@@ -41,7 +41,6 @@
 #include <linux/types.h>
 #include <linux/interrupt.h>
 #include <linux/timer.h>
-#include <linux/sched.h>
 #include <linux/bitops.h>
 
 #include <linux/signal.h>
index faa768e5925715075b7c998b6fed9464edb1936e..81f805cc5ee7a3e2723952d00e0a502f43dc3ff2 100644 (file)
@@ -161,7 +161,7 @@ qeth_procfile_open(struct inode *inode, struct file *file)
        return seq_open(file, &qeth_procfile_seq_ops);
 }
 
-static struct file_operations qeth_procfile_fops = {
+static const struct file_operations qeth_procfile_fops = {
        .owner   = THIS_MODULE,
        .open    = qeth_procfile_open,
        .read    = seq_read,
@@ -273,7 +273,7 @@ qeth_perf_procfile_open(struct inode *inode, struct file *file)
        return seq_open(file, &qeth_perf_procfile_seq_ops);
 }
 
-static struct file_operations qeth_perf_procfile_fops = {
+static const struct file_operations qeth_perf_procfile_fops = {
        .owner   = THIS_MODULE,
        .open    = qeth_perf_procfile_open,
        .read    = seq_read,
index 39a8852667909b3d0c57e282f9b0ae72bf46078d..1f9554e0801392e043ff2ac1e120ed44c8da7644 100644 (file)
@@ -60,7 +60,7 @@ static long zfcp_cfdc_dev_ioctl(struct file *, unsigned int, unsigned long);
        _IOWR(ZFCP_CFDC_IOC_MAGIC, 0, struct zfcp_cfdc_sense_data)
 
 
-static struct file_operations zfcp_cfdc_fops = {
+static const struct file_operations zfcp_cfdc_fops = {
        .unlocked_ioctl = zfcp_cfdc_dev_ioctl,
 #ifdef CONFIG_COMPAT
        .compat_ioctl = zfcp_cfdc_dev_ioctl
index 88642dec080c086e36023dcd6ffc877032d3e63e..421da1e7c0ead283aaf6046ef108e981017c6887 100644 (file)
@@ -838,32 +838,28 @@ zfcp_erp_action_exists(struct zfcp_erp_action *erp_action)
  *             and does appropriate preparations (dismiss fsf request, ...)
  *
  * locks:      called under erp_lock (disabled interrupts)
- *
- * returns:    0
  */
-static int
+static void
 zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *erp_action)
 {
-       int retval = 0;
-       struct zfcp_fsf_req *fsf_req = NULL;
        struct zfcp_adapter *adapter = erp_action->adapter;
 
        if (erp_action->fsf_req) {
                /* take lock to ensure that request is not deleted meanwhile */
                spin_lock(&adapter->req_list_lock);
-               if ((!zfcp_reqlist_ismember(adapter,
-                                           erp_action->fsf_req->req_id)) &&
-                   (fsf_req->erp_action == erp_action)) {
+               if (zfcp_reqlist_ismember(adapter,
+                                           erp_action->fsf_req->req_id)) {
                        /* fsf_req still exists */
                        debug_text_event(adapter->erp_dbf, 3, "a_ca_req");
-                       debug_event(adapter->erp_dbf, 3, &fsf_req,
+                       debug_event(adapter->erp_dbf, 3, &erp_action->fsf_req,
                                    sizeof (unsigned long));
                        /* dismiss fsf_req of timed out/dismissed erp_action */
                        if (erp_action->status & (ZFCP_STATUS_ERP_DISMISSED |
                                                  ZFCP_STATUS_ERP_TIMEDOUT)) {
                                debug_text_event(adapter->erp_dbf, 3,
                                                 "a_ca_disreq");
-                               fsf_req->status |= ZFCP_STATUS_FSFREQ_DISMISSED;
+                               erp_action->fsf_req->status |=
+                                       ZFCP_STATUS_FSFREQ_DISMISSED;
                        }
                        if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) {
                                ZFCP_LOG_NORMAL("error: erp step timed out "
@@ -876,11 +872,11 @@ zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *erp_action)
                         * then keep it running asynchronously and don't mess
                         * with the association of erp_action and fsf_req.
                         */
-                       if (fsf_req->status & (ZFCP_STATUS_FSFREQ_COMPLETED |
+                       if (erp_action->fsf_req->status &
+                                       (ZFCP_STATUS_FSFREQ_COMPLETED |
                                               ZFCP_STATUS_FSFREQ_DISMISSED)) {
                                /* forget about association between fsf_req
                                   and erp_action */
-                               fsf_req->erp_action = NULL;
                                erp_action->fsf_req = NULL;
                        }
                } else {
@@ -894,8 +890,6 @@ zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *erp_action)
                spin_unlock(&adapter->req_list_lock);
        } else
                debug_text_event(adapter->erp_dbf, 3, "a_ca_noreq");
-
-       return retval;
 }
 
 /**
index cda0cc095ad1bb9b862d7c9049a17d76dc38807b..01386ac688a27887e32cd75dfa336a2c4611f5d9 100644 (file)
@@ -89,7 +89,7 @@ extern int  zfcp_fsf_control_file(struct zfcp_adapter *, struct zfcp_fsf_req **,
                                  u32, u32, struct zfcp_sg_list *);
 extern void zfcp_fsf_start_timer(struct zfcp_fsf_req *, unsigned long);
 extern void zfcp_erp_start_timer(struct zfcp_fsf_req *);
-extern int  zfcp_fsf_req_dismiss_all(struct zfcp_adapter *);
+extern void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *);
 extern int  zfcp_fsf_status_read(struct zfcp_adapter *, int);
 extern int zfcp_fsf_req_create(struct zfcp_adapter *, u32, int, mempool_t *,
                               unsigned long *, struct zfcp_fsf_req **);
index 4b3ae3f22e78c448c21d28318adf3726e95c8c28..ef16f7ca4bb1cf1001010cf2c41854391edc6b09 100644 (file)
@@ -176,28 +176,25 @@ static void zfcp_fsf_req_dismiss(struct zfcp_adapter *adapter,
 /**
  * zfcp_fsf_req_dismiss_all - dismiss all remaining fsf requests
  */
-int zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter)
+void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter)
 {
        struct zfcp_fsf_req *request, *tmp;
        unsigned long flags;
+       LIST_HEAD(remove_queue);
        unsigned int i, counter;
 
        spin_lock_irqsave(&adapter->req_list_lock, flags);
        atomic_set(&adapter->reqs_active, 0);
-       for (i=0; i<REQUEST_LIST_SIZE; i++) {
-               if (list_empty(&adapter->req_list[i]))
-                       continue;
-
-               counter = 0;
-               list_for_each_entry_safe(request, tmp,
-                                        &adapter->req_list[i], list) {
-                       zfcp_fsf_req_dismiss(adapter, request, counter);
-                       counter++;
-               }
-       }
+       for (i=0; i<REQUEST_LIST_SIZE; i++)
+               list_splice_init(&adapter->req_list[i], &remove_queue);
+
        spin_unlock_irqrestore(&adapter->req_list_lock, flags);
 
-       return 0;
+       counter = 0;
+       list_for_each_entry_safe(request, tmp, &remove_queue, list) {
+               zfcp_fsf_req_dismiss(adapter, request, counter);
+               counter++;
+       }
 }
 
 /*
index ac7d1258efee13610244b8e7a81feaf4a0348c7f..a39ee80c9715749b7a1089fa99260128557fe8e9 100644 (file)
@@ -846,7 +846,7 @@ static int bpp_ioctl(struct inode *inode, struct file *f, unsigned int cmd,
       return errno;
 }
 
-static struct file_operations bpp_fops = {
+static const struct file_operations bpp_fops = {
        .owner =        THIS_MODULE,
        .read =         bpp_read,
        .write =        bpp_write,
index ad1c7db96cb4d8eb7bc38f561ff5535f3dd168c7..022e869c44ddf77373370e4b0ee57e49342b9508 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/major.h>
 #include <linux/init.h>
 #include <linux/miscdevice.h>
-#include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/ioport.h>
 #include <linux/timer.h>
@@ -459,7 +458,7 @@ static irqreturn_t wd_interrupt(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static struct file_operations wd_fops = {
+static const struct file_operations wd_fops = {
        .owner =        THIS_MODULE,
        .ioctl =        wd_ioctl,
        .compat_ioctl = wd_compat_ioctl,
index a4909e0c7f83877d435869735fa8ecffd30d3808..2d14a29effe4783645c520014d2f85fcb7897401 100644 (file)
@@ -166,7 +166,7 @@ static long d7s_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
        return error;
 }
 
-static struct file_operations d7s_fops = {
+static const struct file_operations d7s_fops = {
        .owner =                THIS_MODULE,
        .unlocked_ioctl =       d7s_ioctl,
        .compat_ioctl =         d7s_ioctl,
index fff4660cdf96e34880f7242d0fdecc588c05536a..2cea4f5d2084b13f85da8114ef554ced2c47b5d9 100644 (file)
@@ -705,7 +705,7 @@ envctrl_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations envctrl_fops = {
+static const struct file_operations envctrl_fops = {
        .owner =                THIS_MODULE,
        .read =                 envctrl_read,
        .unlocked_ioctl =       envctrl_ioctl,
index fa2418f7ad393c78af158a4540fa80cf6213d297..6e99507aeb12c23fba03c52a56697f58d0d216c9 100644 (file)
@@ -142,7 +142,7 @@ flash_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations flash_fops = {
+static const struct file_operations flash_fops = {
        /* no write to the Flash, use mmap
         * and play flash dependent tricks.
         */
index 14631ac11bc7744e95b0276eee662671ca5a522a..512857a23169b4645e1228b7fb46159015cc72df 100644 (file)
@@ -431,7 +431,7 @@ static int jsf_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations jsf_fops = {
+static const struct file_operations jsf_fops = {
        .owner =        THIS_MODULE,
        .llseek =       jsf_lseek,
        .read =         jsf_read,
index 4e2a0e2dcc2e9da9bdde64f2582588694d06f22f..eec28c142a590f28f7a9be87d4fbf7f74641d1ea 100644 (file)
@@ -31,7 +31,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/slab.h>
 #include <linux/string.h>
@@ -704,7 +703,7 @@ static int openprom_release(struct inode * inode, struct file * file)
        return 0;
 }
 
-static struct file_operations openprom_fops = {
+static const struct file_operations openprom_fops = {
        .owner =        THIS_MODULE,
        .llseek =       no_llseek,
        .ioctl =        openprom_ioctl,
index 2a9cc82044292d074b5b3a35d3e8d86f06a43587..a2fc6b8c1334a830dc2808cdc32b8beefd42fbe2 100644 (file)
@@ -193,7 +193,7 @@ static ssize_t riowd_write(struct file *file, const char __user *buf, size_t cou
        return 0;
 }
 
-static struct file_operations riowd_fops = {
+static const struct file_operations riowd_fops = {
        .owner =        THIS_MODULE,
        .ioctl =        riowd_ioctl,
        .open =         riowd_open,
index 9b988baf0b5191304ca00ac042851b055f002bd7..94d185829119bcd7e85a18b4cffd55d4046b4321 100644 (file)
@@ -233,7 +233,7 @@ static int rtc_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations rtc_fops = {
+static const struct file_operations rtc_fops = {
        .owner =        THIS_MODULE,
        .llseek =       no_llseek,
        .ioctl =        rtc_ioctl,
index b30372f17f1cb94d9ee924d79ff49ac4b78e4a31..45cf5bc0bbee210f1d3b9106a80194e4937aef66 100644 (file)
@@ -5,7 +5,6 @@
  */
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
@@ -224,7 +223,7 @@ static irqreturn_t uctrl_interrupt(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static struct file_operations uctrl_fops = {
+static const struct file_operations uctrl_fops = {
        .owner =        THIS_MODULE,
        .llseek =       no_llseek,
        .ioctl =        uctrl_ioctl,
index 386e7de0b7e3c47a38efdda9ed01def8fc6839d6..8bfb67ccdcd46fef77963273ac055f8e1b539638 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/string.h>
 #include <linux/slab.h>
 #include <linux/errno.h>
-#include <linux/sched.h>
 #include <linux/fs.h>
 #include <linux/smp_lock.h>
 #include <linux/delay.h>
@@ -44,7 +43,7 @@
 #include "vfc.h"
 #include <asm/vfc_ioctls.h>
 
-static struct file_operations vfc_fops;
+static const struct file_operations vfc_fops;
 struct vfc_dev **vfc_dev_lst;
 static char vfcstr[]="vfc";
 static unsigned char saa9051_init_array[VFC_SAA9051_NR] = {
@@ -633,7 +632,7 @@ static int vfc_mmap(struct file *file, struct vm_area_struct *vma)
 }
 
 
-static struct file_operations vfc_fops = {
+static const struct file_operations vfc_fops = {
        .owner =        THIS_MODULE,
        .llseek =       no_llseek,
        .ioctl =        vfc_ioctl,
index 98fcbb3d5560bad9463109915e64f75222558853..6349dd617f85cdd8807288597feda9d0cf736834 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/pci.h>
+#include <linux/device.h>
 
 #include <asm/system.h>
 #include <asm/sbus.h>
 #include <asm/bpp.h>
 #include <asm/irq.h>
 
+static ssize_t
+show_sbusobppath_attr(struct device * dev, struct device_attribute * attr, char * buf)
+{
+       struct sbus_dev *sbus;
+
+       sbus = to_sbus_device(dev);
+
+       return snprintf (buf, PAGE_SIZE, "%s\n", sbus->ofdev.node->full_name);
+}
+
+static DEVICE_ATTR(obppath, S_IRUSR | S_IRGRP | S_IROTH, show_sbusobppath_attr, NULL);
+
 struct sbus_bus *sbus_root;
 
 static void __init fill_sbus_device(struct device_node *dp, struct sbus_dev *sdev)
 {
        unsigned long base;
        void *pval;
-       int len;
+       int len, err;
 
        sdev->prom_node = dp->node;
        strcpy(sdev->prom_name, dp->name);
@@ -66,6 +79,9 @@ static void __init fill_sbus_device(struct device_node *dp, struct sbus_dev *sde
        if (of_device_register(&sdev->ofdev) != 0)
                printk(KERN_DEBUG "sbus: device registration error for %s!\n",
                       dp->path_component_name);
+
+       /* WE HAVE BEEN INVADED BY ALIENS! */
+       err = sysfs_create_file(&sdev->ofdev.dev.kobj, &dev_attr_obppath.attr);
 }
 
 static void __init sbus_bus_ranges_init(struct device_node *dp, struct sbus_bus *sbus)
index b091a0fc4eb09fba778206bb9fa53890c524f54f..eb766c3af1c816f30b61c43c0e30a9914c1160c5 100644 (file)
@@ -197,7 +197,7 @@ static struct class_device_attribute *twa_host_attrs[] = {
 };
 
 /* File operations struct for character device */
-static struct file_operations twa_fops = {
+static const struct file_operations twa_fops = {
        .owner          = THIS_MODULE,
        .ioctl          = twa_chrdev_ioctl,
        .open           = twa_chrdev_open,
index e1b44d6c0c32e52e3741b10606573facd6d2d938..bf5d63e1beeeb441ff2f4a82dae2813ef5502964 100644 (file)
@@ -1040,7 +1040,7 @@ static int tw_chrdev_open(struct inode *inode, struct file *file)
 } /* End tw_chrdev_open() */
 
 /* File operations struct for character device */
-static struct file_operations tw_fops = {
+static const struct file_operations tw_fops = {
        .owner          = THIS_MODULE,
        .ioctl          = tw_chrdev_ioctl,
        .open           = tw_chrdev_open,
index 68103e508db7077455dd437db6eae86797d63c0c..cb02656eb54c1e9592fd552f1014a556981ca8e0 100644 (file)
 #include <linux/delay.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/proc_fs.h>
 #include <linux/blkdev.h>
@@ -667,12 +666,30 @@ NCR_700_chip_setup(struct Scsi_Host *host)
        __u8 min_xferp = (hostdata->chip710 ? NCR_710_MIN_XFERP : NCR_700_MIN_XFERP);
 
        if(hostdata->chip710) {
-               __u8 burst_disable = hostdata->burst_disable
-                       ? BURST_DISABLE : 0;
+               __u8 burst_disable = 0;
+               __u8 burst_length = 0;
+
+               switch (hostdata->burst_length) {
+                       case 1:
+                               burst_length = BURST_LENGTH_1;
+                               break;
+                       case 2:
+                               burst_length = BURST_LENGTH_2;
+                               break;
+                       case 4:
+                               burst_length = BURST_LENGTH_4;
+                               break;
+                       case 8:
+                               burst_length = BURST_LENGTH_8;
+                               break;
+                       default:
+                               burst_disable = BURST_DISABLE;
+                               break;
+               }
                dcntl_extra = COMPAT_700_MODE;
 
                NCR_700_writeb(dcntl_extra, host, DCNTL_REG);
-               NCR_700_writeb(BURST_LENGTH_8  | hostdata->dmode_extra,
+               NCR_700_writeb(burst_length | hostdata->dmode_extra,
                               host, DMODE_710_REG);
                NCR_700_writeb(burst_disable | (hostdata->differential ? 
                                                DIFF : 0), host, CTEST7_REG);
index f38822db4210886f8654c33bd03a3e2dd15635b9..841e1bb27d57eb54ae0142c2c64e4009fdb1cc51 100644 (file)
@@ -203,7 +203,7 @@ struct NCR_700_Host_Parameters {
        __u32   force_le_on_be:1;
 #endif
        __u32   chip710:1;      /* set if really a 710 not 700 */
-       __u32   burst_disable:1;        /* set to 1 to disable 710 bursting */
+       __u32   burst_length:4; /* set to 0 to disable 710 bursting */
 
        /* NOTHING BELOW HERE NEEDS ALTERING */
        __u32   fast:1;         /* if we can alter the SCSI bus clock
index 640536ef77dcc398ec663cfe39830ba3e2c41e6b..93b41f45638a92411e7719c6c368bbcc7a0d86cf 100644 (file)
@@ -3099,7 +3099,6 @@ allocate_cmd (Scsi_Cmnd *cmd) {
         real = get_zeroed_page(GFP_ATOMIC);
         if (real == 0)
                return NULL;
-        memset((void *)real, 0, 4096);
         cache_push(virt_to_phys((void *)real), 4096);
         cache_clear(virt_to_phys((void *)real), 4096);
         kernel_set_cachemode((void *)real, 4096, IOMAP_NOCACHE_SER);
@@ -4400,7 +4399,7 @@ abort_connected (struct Scsi_Host *host) {
  * account the current synchronous offset) 
  */
 
-    sstat = (NCR53c8x0_read8 (SSTAT2_REG);
+    sstat = NCR53c8x0_read8 (SSTAT2_REG);
     offset = OFFSET (sstat & SSTAT2_FF_MASK) >> SSTAT2_FF_SHIFT;
     phase = sstat & SSTAT2_PHASE_MASK;
 
@@ -5423,7 +5422,7 @@ insn_to_offset (Scsi_Cmnd *cmd, u32 *insn) {
                     --buffers, offset += segment->length, ++segment)
 #if 0
                    printk("scsi%d: comparing 0x%p to 0x%p\n", 
-                       cmd->device->host->host_no, saved, page_address(segment->page+segment->offset);
+                       cmd->device->host->host_no, saved, page_address(segment->page+segment->offset));
 #else
                    ;
 #endif
index 3075204915c867b532509788e18668393840dd0b..e874b8944875c77cb1d41df5004fbfa5eae08e9f 100644 (file)
@@ -192,7 +192,7 @@ static void BusLogic_InitializeCCBs(struct BusLogic_HostAdapter *HostAdapter, vo
   BusLogic_CreateInitialCCBs allocates the initial CCBs for Host Adapter.
 */
 
-static boolean __init BusLogic_CreateInitialCCBs(struct BusLogic_HostAdapter *HostAdapter)
+static bool __init BusLogic_CreateInitialCCBs(struct BusLogic_HostAdapter *HostAdapter)
 {
        int BlockSize = BusLogic_CCB_AllocationGroupSize * sizeof(struct BusLogic_CCB);
        void *BlockPointer;
@@ -238,7 +238,7 @@ static void BusLogic_DestroyCCBs(struct BusLogic_HostAdapter *HostAdapter)
   multiple host adapters share the same IRQ Channel.
 */
 
-static void BusLogic_CreateAdditionalCCBs(struct BusLogic_HostAdapter *HostAdapter, int AdditionalCCBs, boolean SuccessMessageP)
+static void BusLogic_CreateAdditionalCCBs(struct BusLogic_HostAdapter *HostAdapter, int AdditionalCCBs, bool SuccessMessageP)
 {
        int BlockSize = BusLogic_CCB_AllocationGroupSize * sizeof(struct BusLogic_CCB);
        int PreviouslyAllocated = HostAdapter->AllocatedCCBs;
@@ -362,10 +362,8 @@ static int BusLogic_Command(struct BusLogic_HostAdapter *HostAdapter, enum BusLo
           interrupt could occur if the IRQ Channel was previously enabled by another
           BusLogic Host Adapter or another driver sharing the same IRQ Channel.
         */
-       if (!HostAdapter->IRQ_ChannelAcquired) {
+       if (!HostAdapter->IRQ_ChannelAcquired)
                local_irq_save(ProcessorFlags);
-               local_irq_disable();
-       }
        /*
           Wait for the Host Adapter Ready bit to be set and the Command/Parameter
           Register Busy bit to be reset in the Status Register.
@@ -639,9 +637,9 @@ static int __init BusLogic_InitializeMultiMasterProbeInfo(struct BusLogic_HostAd
        struct BusLogic_ProbeInfo *PrimaryProbeInfo = &BusLogic_ProbeInfoList[BusLogic_ProbeInfoCount];
        int NonPrimaryPCIMultiMasterIndex = BusLogic_ProbeInfoCount + 1;
        int NonPrimaryPCIMultiMasterCount = 0, PCIMultiMasterCount = 0;
-       boolean ForceBusDeviceScanningOrder = false;
-       boolean ForceBusDeviceScanningOrderChecked = false;
-       boolean StandardAddressSeen[6];
+       bool ForceBusDeviceScanningOrder = false;
+       bool ForceBusDeviceScanningOrderChecked = false;
+       bool StandardAddressSeen[6];
        struct pci_dev *PCI_Device = NULL;
        int i;
        if (BusLogic_ProbeInfoCount >= BusLogic_MaxHostAdapters)
@@ -1011,7 +1009,7 @@ static void __init BusLogic_InitializeProbeInfoList(struct BusLogic_HostAdapter
   BusLogic_Failure prints a standardized error message, and then returns false.
 */
 
-static boolean BusLogic_Failure(struct BusLogic_HostAdapter *HostAdapter, char *ErrorMessage)
+static bool BusLogic_Failure(struct BusLogic_HostAdapter *HostAdapter, char *ErrorMessage)
 {
        BusLogic_AnnounceDriver(HostAdapter);
        if (HostAdapter->HostAdapterBusType == BusLogic_PCI_Bus) {
@@ -1030,7 +1028,7 @@ static boolean BusLogic_Failure(struct BusLogic_HostAdapter *HostAdapter, char *
   BusLogic_ProbeHostAdapter probes for a BusLogic Host Adapter.
 */
 
-static boolean __init BusLogic_ProbeHostAdapter(struct BusLogic_HostAdapter *HostAdapter)
+static bool __init BusLogic_ProbeHostAdapter(struct BusLogic_HostAdapter *HostAdapter)
 {
        union BusLogic_StatusRegister StatusRegister;
        union BusLogic_InterruptRegister InterruptRegister;
@@ -1101,8 +1099,8 @@ static boolean __init BusLogic_ProbeHostAdapter(struct BusLogic_HostAdapter *Hos
   SCSI Bus Reset.
 */
 
-static boolean BusLogic_HardwareResetHostAdapter(struct BusLogic_HostAdapter
-                                                *HostAdapter, boolean HardReset)
+static bool BusLogic_HardwareResetHostAdapter(struct BusLogic_HostAdapter
+                                                *HostAdapter, bool HardReset)
 {
        union BusLogic_StatusRegister StatusRegister;
        int TimeoutCounter;
@@ -1205,11 +1203,11 @@ static boolean BusLogic_HardwareResetHostAdapter(struct BusLogic_HostAdapter
   Host Adapter.
 */
 
-static boolean __init BusLogic_CheckHostAdapter(struct BusLogic_HostAdapter *HostAdapter)
+static bool __init BusLogic_CheckHostAdapter(struct BusLogic_HostAdapter *HostAdapter)
 {
        struct BusLogic_ExtendedSetupInformation ExtendedSetupInformation;
        unsigned char RequestedReplyLength;
-       boolean Result = true;
+       bool Result = true;
        /*
           FlashPoint Host Adapters do not require this protection.
         */
@@ -1239,7 +1237,7 @@ static boolean __init BusLogic_CheckHostAdapter(struct BusLogic_HostAdapter *Hos
   from Host Adapter and initializes the Host Adapter structure.
 */
 
-static boolean __init BusLogic_ReadHostAdapterConfiguration(struct BusLogic_HostAdapter
+static bool __init BusLogic_ReadHostAdapterConfiguration(struct BusLogic_HostAdapter
                                                            *HostAdapter)
 {
        struct BusLogic_BoardID BoardID;
@@ -1686,14 +1684,14 @@ static boolean __init BusLogic_ReadHostAdapterConfiguration(struct BusLogic_Host
   Host Adapter.
 */
 
-static boolean __init BusLogic_ReportHostAdapterConfiguration(struct BusLogic_HostAdapter
+static bool __init BusLogic_ReportHostAdapterConfiguration(struct BusLogic_HostAdapter
                                                              *HostAdapter)
 {
        unsigned short AllTargetsMask = (1 << HostAdapter->MaxTargetDevices) - 1;
        unsigned short SynchronousPermitted, FastPermitted;
        unsigned short UltraPermitted, WidePermitted;
        unsigned short DisconnectPermitted, TaggedQueuingPermitted;
-       boolean CommonSynchronousNegotiation, CommonTaggedQueueDepth;
+       bool CommonSynchronousNegotiation, CommonTaggedQueueDepth;
        char SynchronousString[BusLogic_MaxTargetDevices + 1];
        char WideString[BusLogic_MaxTargetDevices + 1];
        char DisconnectString[BusLogic_MaxTargetDevices + 1];
@@ -1835,7 +1833,7 @@ static boolean __init BusLogic_ReportHostAdapterConfiguration(struct BusLogic_Ho
   Host Adapter.
 */
 
-static boolean __init BusLogic_AcquireResources(struct BusLogic_HostAdapter *HostAdapter)
+static bool __init BusLogic_AcquireResources(struct BusLogic_HostAdapter *HostAdapter)
 {
        if (HostAdapter->IRQ_Channel == 0) {
                BusLogic_Error("NO LEGAL INTERRUPT CHANNEL ASSIGNED - DETACHING\n", HostAdapter);
@@ -1903,7 +1901,7 @@ static void BusLogic_ReleaseResources(struct BusLogic_HostAdapter *HostAdapter)
   of the Host Adapter from its initial power on or hard reset state.
 */
 
-static boolean BusLogic_InitializeHostAdapter(struct BusLogic_HostAdapter
+static bool BusLogic_InitializeHostAdapter(struct BusLogic_HostAdapter
                                              *HostAdapter)
 {
        struct BusLogic_ExtendedMailboxRequest ExtendedMailboxRequest;
@@ -2002,7 +2000,7 @@ static boolean BusLogic_InitializeHostAdapter(struct BusLogic_HostAdapter
   through Host Adapter.
 */
 
-static boolean __init BusLogic_TargetDeviceInquiry(struct BusLogic_HostAdapter
+static bool __init BusLogic_TargetDeviceInquiry(struct BusLogic_HostAdapter
                                                   *HostAdapter)
 {
        u16 InstalledDevices;
@@ -2739,7 +2737,7 @@ static irqreturn_t BusLogic_InterruptHandler(int IRQ_Channel, void *DeviceIdenti
   already have been acquired by the caller.
 */
 
-static boolean BusLogic_WriteOutgoingMailbox(struct BusLogic_HostAdapter
+static bool BusLogic_WriteOutgoingMailbox(struct BusLogic_HostAdapter
                                             *HostAdapter, enum BusLogic_ActionCode ActionCode, struct BusLogic_CCB *CCB)
 {
        struct BusLogic_OutgoingMailbox *NextOutgoingMailbox;
@@ -3058,7 +3056,7 @@ static int BusLogic_AbortCommand(struct scsi_cmnd *Command)
   currently executing SCSI Commands as having been Reset.
 */
 
-static int BusLogic_ResetHostAdapter(struct BusLogic_HostAdapter *HostAdapter, boolean HardReset)
+static int BusLogic_ResetHostAdapter(struct BusLogic_HostAdapter *HostAdapter, bool HardReset)
 {
        struct BusLogic_CCB *CCB;
        int TargetID;
@@ -3309,7 +3307,7 @@ Target    Requested Completed  Requested Completed  Requested Completed\n\
 static void BusLogic_Message(enum BusLogic_MessageLevel MessageLevel, char *Format, struct BusLogic_HostAdapter *HostAdapter, ...)
 {
        static char Buffer[BusLogic_LineBufferSize];
-       static boolean BeginningOfLine = true;
+       static bool BeginningOfLine = true;
        va_list Arguments;
        int Length = 0;
        va_start(Arguments, HostAdapter);
@@ -3347,7 +3345,7 @@ static void BusLogic_Message(enum BusLogic_MessageLevel MessageLevel, char *Form
   and updates the pointer if the keyword is recognized and false otherwise.
 */
 
-static boolean __init BusLogic_ParseKeyword(char **StringPointer, char *Keyword)
+static bool __init BusLogic_ParseKeyword(char **StringPointer, char *Keyword)
 {
        char *Pointer = *StringPointer;
        while (*Keyword != '\0') {
index cca6d45eee4da90a13e6b8dba1210f4fcf38accc..bfbfb5c3a8f65281a42db90626925ce94da92f4f 100644 (file)
@@ -233,12 +233,6 @@ enum BusLogic_BIOS_DiskGeometryTranslation {
 } PACKED;
 
 
-/*
-  Define a Boolean data type.
-*/
-
-typedef bool boolean;
-
 /*
   Define a 10^18 Statistics Byte Counter data type.
 */
@@ -269,19 +263,19 @@ struct BusLogic_ProbeInfo {
 */
 
 struct BusLogic_ProbeOptions {
-       boolean NoProbe:1;      /* Bit 0 */
-       boolean NoProbeISA:1;   /* Bit 1 */
-       boolean NoProbePCI:1;   /* Bit 2 */
-       boolean NoSortPCI:1;    /* Bit 3 */
-       boolean MultiMasterFirst:1;     /* Bit 4 */
-       boolean FlashPointFirst:1;      /* Bit 5 */
-       boolean LimitedProbeISA:1;      /* Bit 6 */
-       boolean Probe330:1;     /* Bit 7 */
-       boolean Probe334:1;     /* Bit 8 */
-       boolean Probe230:1;     /* Bit 9 */
-       boolean Probe234:1;     /* Bit 10 */
-       boolean Probe130:1;     /* Bit 11 */
-       boolean Probe134:1;     /* Bit 12 */
+       bool NoProbe:1;         /* Bit 0 */
+       bool NoProbeISA:1;      /* Bit 1 */
+       bool NoProbePCI:1;      /* Bit 2 */
+       bool NoSortPCI:1;       /* Bit 3 */
+       bool MultiMasterFirst:1;/* Bit 4 */
+       bool FlashPointFirst:1; /* Bit 5 */
+       bool LimitedProbeISA:1; /* Bit 6 */
+       bool Probe330:1;        /* Bit 7 */
+       bool Probe334:1;        /* Bit 8 */
+       bool Probe230:1;        /* Bit 9 */
+       bool Probe234:1;        /* Bit 10 */
+       bool Probe130:1;        /* Bit 11 */
+       bool Probe134:1;        /* Bit 12 */
 };
 
 /*
@@ -289,10 +283,10 @@ struct BusLogic_ProbeOptions {
 */
 
 struct BusLogic_GlobalOptions {
-       boolean TraceProbe:1;   /* Bit 0 */
-       boolean TraceHardwareReset:1;   /* Bit 1 */
-       boolean TraceConfiguration:1;   /* Bit 2 */
-       boolean TraceErrors:1;  /* Bit 3 */
+       bool TraceProbe:1;      /* Bit 0 */
+       bool TraceHardwareReset:1;      /* Bit 1 */
+       bool TraceConfiguration:1;      /* Bit 2 */
+       bool TraceErrors:1;     /* Bit 3 */
 };
 
 /*
@@ -300,7 +294,7 @@ struct BusLogic_GlobalOptions {
 */
 
 struct BusLogic_LocalOptions {
-       boolean InhibitTargetInquiry:1; /* Bit 0 */
+       bool InhibitTargetInquiry:1;    /* Bit 0 */
 };
 
 /*
@@ -322,10 +316,10 @@ union BusLogic_ControlRegister {
        unsigned char All;
        struct {
                unsigned char:4;        /* Bits 0-3 */
-               boolean SCSIBusReset:1; /* Bit 4 */
-               boolean InterruptReset:1;       /* Bit 5 */
-               boolean SoftReset:1;    /* Bit 6 */
-               boolean HardReset:1;    /* Bit 7 */
+               bool SCSIBusReset:1;    /* Bit 4 */
+               bool InterruptReset:1;  /* Bit 5 */
+               bool SoftReset:1;       /* Bit 6 */
+               bool HardReset:1;       /* Bit 7 */
        } cr;
 };
 
@@ -336,14 +330,14 @@ union BusLogic_ControlRegister {
 union BusLogic_StatusRegister {
        unsigned char All;
        struct {
-               boolean CommandInvalid:1;       /* Bit 0 */
-               boolean Reserved:1;     /* Bit 1 */
-               boolean DataInRegisterReady:1;  /* Bit 2 */
-               boolean CommandParameterRegisterBusy:1; /* Bit 3 */
-               boolean HostAdapterReady:1;     /* Bit 4 */
-               boolean InitializationRequired:1;       /* Bit 5 */
-               boolean DiagnosticFailure:1;    /* Bit 6 */
-               boolean DiagnosticActive:1;     /* Bit 7 */
+               bool CommandInvalid:1;          /* Bit 0 */
+               bool Reserved:1;                /* Bit 1 */
+               bool DataInRegisterReady:1;     /* Bit 2 */
+               bool CommandParameterRegisterBusy:1;    /* Bit 3 */
+               bool HostAdapterReady:1;        /* Bit 4 */
+               bool InitializationRequired:1;  /* Bit 5 */
+               bool DiagnosticFailure:1;       /* Bit 6 */
+               bool DiagnosticActive:1;        /* Bit 7 */
        } sr;
 };
 
@@ -354,12 +348,12 @@ union BusLogic_StatusRegister {
 union BusLogic_InterruptRegister {
        unsigned char All;
        struct {
-               boolean IncomingMailboxLoaded:1;        /* Bit 0 */
-               boolean OutgoingMailboxAvailable:1;     /* Bit 1 */
-               boolean CommandComplete:1;      /* Bit 2 */
-               boolean ExternalBusReset:1;     /* Bit 3 */
+               bool IncomingMailboxLoaded:1;   /* Bit 0 */
+               bool OutgoingMailboxAvailable:1;/* Bit 1 */
+               bool CommandComplete:1;         /* Bit 2 */
+               bool ExternalBusReset:1;        /* Bit 3 */
                unsigned char Reserved:3;       /* Bits 4-6 */
-               boolean InterruptValid:1;       /* Bit 7 */
+               bool InterruptValid:1;          /* Bit 7 */
        } ir;
 };
 
@@ -373,7 +367,7 @@ union BusLogic_GeometryRegister {
                enum BusLogic_BIOS_DiskGeometryTranslation Drive0Geometry:2;    /* Bits 0-1 */
                enum BusLogic_BIOS_DiskGeometryTranslation Drive1Geometry:2;    /* Bits 2-3 */
                unsigned char:3;        /* Bits 4-6 */
-               boolean ExtendedTranslationEnabled:1;   /* Bit 7 */
+               bool ExtendedTranslationEnabled:1;      /* Bit 7 */
        } gr;
 };
 
@@ -445,16 +439,16 @@ struct BusLogic_BoardID {
 
 struct BusLogic_Configuration {
        unsigned char:5;        /* Byte 0 Bits 0-4 */
-       boolean DMA_Channel5:1; /* Byte 0 Bit 5 */
-       boolean DMA_Channel6:1; /* Byte 0 Bit 6 */
-       boolean DMA_Channel7:1; /* Byte 0 Bit 7 */
-       boolean IRQ_Channel9:1; /* Byte 1 Bit 0 */
-       boolean IRQ_Channel10:1;        /* Byte 1 Bit 1 */
-       boolean IRQ_Channel11:1;        /* Byte 1 Bit 2 */
-       boolean IRQ_Channel12:1;        /* Byte 1 Bit 3 */
+       bool DMA_Channel5:1;    /* Byte 0 Bit 5 */
+       bool DMA_Channel6:1;    /* Byte 0 Bit 6 */
+       bool DMA_Channel7:1;    /* Byte 0 Bit 7 */
+       bool IRQ_Channel9:1;    /* Byte 1 Bit 0 */
+       bool IRQ_Channel10:1;   /* Byte 1 Bit 1 */
+       bool IRQ_Channel11:1;   /* Byte 1 Bit 2 */
+       bool IRQ_Channel12:1;   /* Byte 1 Bit 3 */
        unsigned char:1;        /* Byte 1 Bit 4 */
-       boolean IRQ_Channel14:1;        /* Byte 1 Bit 5 */
-       boolean IRQ_Channel15:1;        /* Byte 1 Bit 6 */
+       bool IRQ_Channel14:1;   /* Byte 1 Bit 5 */
+       bool IRQ_Channel15:1;   /* Byte 1 Bit 6 */
        unsigned char:1;        /* Byte 1 Bit 7 */
        unsigned char HostAdapterID:4;  /* Byte 2 Bits 0-3 */
        unsigned char:4;        /* Byte 2 Bits 4-7 */
@@ -467,12 +461,12 @@ struct BusLogic_Configuration {
 struct BusLogic_SynchronousValue {
        unsigned char Offset:4; /* Bits 0-3 */
        unsigned char TransferPeriod:3; /* Bits 4-6 */
-       boolean Synchronous:1;  /* Bit 7 */
+       bool Synchronous:1;     /* Bit 7 */
 };
 
 struct BusLogic_SetupInformation {
-       boolean SynchronousInitiationEnabled:1; /* Byte 0 Bit 0 */
-       boolean ParityCheckingEnabled:1;        /* Byte 0 Bit 1 */
+       bool SynchronousInitiationEnabled:1;    /* Byte 0 Bit 0 */
+       bool ParityCheckingEnabled:1;           /* Byte 0 Bit 1 */
        unsigned char:6;        /* Byte 0 Bits 2-7 */
        unsigned char BusTransferRate;  /* Byte 1 */
        unsigned char PreemptTimeOnBus; /* Byte 2 */
@@ -523,13 +517,13 @@ enum BusLogic_ISACompatibleIOPort {
 struct BusLogic_PCIHostAdapterInformation {
        enum BusLogic_ISACompatibleIOPort ISACompatibleIOPort;  /* Byte 0 */
        unsigned char PCIAssignedIRQChannel;    /* Byte 1 */
-       boolean LowByteTerminated:1;    /* Byte 2 Bit 0 */
-       boolean HighByteTerminated:1;   /* Byte 2 Bit 1 */
+       bool LowByteTerminated:1;       /* Byte 2 Bit 0 */
+       bool HighByteTerminated:1;      /* Byte 2 Bit 1 */
        unsigned char:2;        /* Byte 2 Bits 2-3 */
-       boolean JP1:1;          /* Byte 2 Bit 4 */
-       boolean JP2:1;          /* Byte 2 Bit 5 */
-       boolean JP3:1;          /* Byte 2 Bit 6 */
-       boolean GenericInfoValid:1;     /* Byte 2 Bit 7 */
+       bool JP1:1;             /* Byte 2 Bit 4 */
+       bool JP2:1;             /* Byte 2 Bit 5 */
+       bool JP3:1;             /* Byte 2 Bit 6 */
+       bool GenericInfoValid:1;/* Byte 2 Bit 7 */
        unsigned char:8;        /* Byte 3 */
 };
 
@@ -545,17 +539,17 @@ struct BusLogic_ExtendedSetupInformation {
        u32 BaseMailboxAddress; /* Bytes 5-8 */
        struct {
                unsigned char:2;        /* Byte 9 Bits 0-1 */
-               boolean FastOnEISA:1;   /* Byte 9 Bit 2 */
+               bool FastOnEISA:1;      /* Byte 9 Bit 2 */
                unsigned char:3;        /* Byte 9 Bits 3-5 */
-               boolean LevelSensitiveInterrupt:1;      /* Byte 9 Bit 6 */
+               bool LevelSensitiveInterrupt:1; /* Byte 9 Bit 6 */
                unsigned char:1;        /* Byte 9 Bit 7 */
        } Misc;
        unsigned char FirmwareRevision[3];      /* Bytes 10-12 */
-       boolean HostWideSCSI:1; /* Byte 13 Bit 0 */
-       boolean HostDifferentialSCSI:1; /* Byte 13 Bit 1 */
-       boolean HostSupportsSCAM:1;     /* Byte 13 Bit 2 */
-       boolean HostUltraSCSI:1;        /* Byte 13 Bit 3 */
-       boolean HostSmartTermination:1; /* Byte 13 Bit 4 */
+       bool HostWideSCSI:1;            /* Byte 13 Bit 0 */
+       bool HostDifferentialSCSI:1;    /* Byte 13 Bit 1 */
+       bool HostSupportsSCAM:1;        /* Byte 13 Bit 2 */
+       bool HostUltraSCSI:1;           /* Byte 13 Bit 3 */
+       bool HostSmartTermination:1;    /* Byte 13 Bit 4 */
        unsigned char:3;        /* Byte 13 Bits 5-7 */
 } PACKED;
 
@@ -590,35 +584,35 @@ struct BusLogic_AutoSCSIData {
        unsigned char InformationByteCount;     /* Byte 2 */
        unsigned char HostAdapterType[6];       /* Bytes 3-8 */
        unsigned char:8;        /* Byte 9 */
-       boolean FloppyEnabled:1;        /* Byte 10 Bit 0 */
-       boolean FloppySecondary:1;      /* Byte 10 Bit 1 */
-       boolean LevelSensitiveInterrupt:1;      /* Byte 10 Bit 2 */
+       bool FloppyEnabled:1;           /* Byte 10 Bit 0 */
+       bool FloppySecondary:1;         /* Byte 10 Bit 1 */
+       bool LevelSensitiveInterrupt:1; /* Byte 10 Bit 2 */
        unsigned char:2;        /* Byte 10 Bits 3-4 */
        unsigned char SystemRAMAreaForBIOS:3;   /* Byte 10 Bits 5-7 */
        unsigned char DMA_Channel:7;    /* Byte 11 Bits 0-6 */
-       boolean DMA_AutoConfiguration:1;        /* Byte 11 Bit 7 */
+       bool DMA_AutoConfiguration:1;   /* Byte 11 Bit 7 */
        unsigned char IRQ_Channel:7;    /* Byte 12 Bits 0-6 */
-       boolean IRQ_AutoConfiguration:1;        /* Byte 12 Bit 7 */
+       bool IRQ_AutoConfiguration:1;   /* Byte 12 Bit 7 */
        unsigned char DMA_TransferRate; /* Byte 13 */
        unsigned char SCSI_ID;  /* Byte 14 */
-       boolean LowByteTerminated:1;    /* Byte 15 Bit 0 */
-       boolean ParityCheckingEnabled:1;        /* Byte 15 Bit 1 */
-       boolean HighByteTerminated:1;   /* Byte 15 Bit 2 */
-       boolean NoisyCablingEnvironment:1;      /* Byte 15 Bit 3 */
-       boolean FastSynchronousNegotiation:1;   /* Byte 15 Bit 4 */
-       boolean BusResetEnabled:1;      /* Byte 15 Bit 5 */
-        boolean:1;             /* Byte 15 Bit 6 */
-       boolean ActiveNegationEnabled:1;        /* Byte 15 Bit 7 */
+       bool LowByteTerminated:1;       /* Byte 15 Bit 0 */
+       bool ParityCheckingEnabled:1;   /* Byte 15 Bit 1 */
+       bool HighByteTerminated:1;      /* Byte 15 Bit 2 */
+       bool NoisyCablingEnvironment:1; /* Byte 15 Bit 3 */
+       bool FastSynchronousNegotiation:1;      /* Byte 15 Bit 4 */
+       bool BusResetEnabled:1;         /* Byte 15 Bit 5 */
+        bool:1;                /* Byte 15 Bit 6 */
+       bool ActiveNegationEnabled:1;   /* Byte 15 Bit 7 */
        unsigned char BusOnDelay;       /* Byte 16 */
        unsigned char BusOffDelay;      /* Byte 17 */
-       boolean HostAdapterBIOSEnabled:1;       /* Byte 18 Bit 0 */
-       boolean BIOSRedirectionOfINT19Enabled:1;        /* Byte 18 Bit 1 */
-       boolean ExtendedTranslationEnabled:1;   /* Byte 18 Bit 2 */
-       boolean MapRemovableAsFixedEnabled:1;   /* Byte 18 Bit 3 */
-        boolean:1;             /* Byte 18 Bit 4 */
-       boolean BIOSSupportsMoreThan2DrivesEnabled:1;   /* Byte 18 Bit 5 */
-       boolean BIOSInterruptModeEnabled:1;     /* Byte 18 Bit 6 */
-       boolean FlopticalSupportEnabled:1;      /* Byte 19 Bit 7 */
+       bool HostAdapterBIOSEnabled:1;          /* Byte 18 Bit 0 */
+       bool BIOSRedirectionOfINT19Enabled:1;   /* Byte 18 Bit 1 */
+       bool ExtendedTranslationEnabled:1;      /* Byte 18 Bit 2 */
+       bool MapRemovableAsFixedEnabled:1;      /* Byte 18 Bit 3 */
+        bool:1;                /* Byte 18 Bit 4 */
+       bool BIOSSupportsMoreThan2DrivesEnabled:1;      /* Byte 18 Bit 5 */
+       bool BIOSInterruptModeEnabled:1;        /* Byte 18 Bit 6 */
+       bool FlopticalSupportEnabled:1;         /* Byte 19 Bit 7 */
        unsigned short DeviceEnabled;   /* Bytes 19-20 */
        unsigned short WidePermitted;   /* Bytes 21-22 */
        unsigned short FastPermitted;   /* Bytes 23-24 */
@@ -628,22 +622,22 @@ struct BusLogic_AutoSCSIData {
        unsigned short IgnoreInBIOSScan;        /* Bytes 31-32 */
        unsigned char PCIInterruptPin:2;        /* Byte 33 Bits 0-1 */
        unsigned char HostAdapterIOPortAddress:2;       /* Byte 33 Bits 2-3 */
-       boolean StrictRoundRobinModeEnabled:1;  /* Byte 33 Bit 4 */
-       boolean VESABusSpeedGreaterThan33MHz:1; /* Byte 33 Bit 5 */
-       boolean VESABurstWriteEnabled:1;        /* Byte 33 Bit 6 */
-       boolean VESABurstReadEnabled:1; /* Byte 33 Bit 7 */
+       bool StrictRoundRobinModeEnabled:1;     /* Byte 33 Bit 4 */
+       bool VESABusSpeedGreaterThan33MHz:1;    /* Byte 33 Bit 5 */
+       bool VESABurstWriteEnabled:1;   /* Byte 33 Bit 6 */
+       bool VESABurstReadEnabled:1;    /* Byte 33 Bit 7 */
        unsigned short UltraPermitted;  /* Bytes 34-35 */
        unsigned int:32;        /* Bytes 36-39 */
        unsigned char:8;        /* Byte 40 */
        unsigned char AutoSCSIMaximumLUN;       /* Byte 41 */
-        boolean:1;             /* Byte 42 Bit 0 */
-       boolean SCAM_Dominant:1;        /* Byte 42 Bit 1 */
-       boolean SCAM_Enabled:1; /* Byte 42 Bit 2 */
-       boolean SCAM_Level2:1;  /* Byte 42 Bit 3 */
+        bool:1;                /* Byte 42 Bit 0 */
+       bool SCAM_Dominant:1;   /* Byte 42 Bit 1 */
+       bool SCAM_Enabled:1;    /* Byte 42 Bit 2 */
+       bool SCAM_Level2:1;     /* Byte 42 Bit 3 */
        unsigned char:4;        /* Byte 42 Bits 4-7 */
-       boolean INT13ExtensionEnabled:1;        /* Byte 43 Bit 0 */
-        boolean:1;             /* Byte 43 Bit 1 */
-       boolean CDROMBootEnabled:1;     /* Byte 43 Bit 2 */
+       bool INT13ExtensionEnabled:1;   /* Byte 43 Bit 0 */
+        bool:1;                /* Byte 43 Bit 1 */
+       bool CDROMBootEnabled:1;        /* Byte 43 Bit 2 */
        unsigned char:5;        /* Byte 43 Bits 3-7 */
        unsigned char BootTargetID:4;   /* Byte 44 Bits 0-3 */
        unsigned char BootChannel:4;    /* Byte 44 Bits 4-7 */
@@ -852,7 +846,7 @@ struct BusLogic_CCB {
        enum BusLogic_CCB_Opcode Opcode;        /* Byte 0 */
        unsigned char:3;        /* Byte 1 Bits 0-2 */
        enum BusLogic_DataDirection DataDirection:2;    /* Byte 1 Bits 3-4 */
-       boolean TagEnable:1;    /* Byte 1 Bit 5 */
+       bool TagEnable:1;       /* Byte 1 Bit 5 */
        enum BusLogic_QueueTag QueueTag:2;      /* Byte 1 Bits 6-7 */
        unsigned char CDB_Length;       /* Byte 2 */
        unsigned char SenseDataLength;  /* Byte 3 */
@@ -864,7 +858,7 @@ struct BusLogic_CCB {
        enum BusLogic_TargetDeviceStatus TargetDeviceStatus;    /* Byte 15 */
        unsigned char TargetID; /* Byte 16 */
        unsigned char LogicalUnit:5;    /* Byte 17 Bits 0-4 */
-       boolean LegacyTagEnable:1;      /* Byte 17 Bit 5 */
+       bool LegacyTagEnable:1; /* Byte 17 Bit 5 */
        enum BusLogic_QueueTag LegacyQueueTag:2;        /* Byte 17 Bits 6-7 */
        SCSI_CDB_T CDB;         /* Bytes 18-29 */
        unsigned char:8;        /* Byte 30 */
@@ -939,13 +933,13 @@ struct BusLogic_DriverOptions {
 */
 
 struct BusLogic_TargetFlags {
-       boolean TargetExists:1;
-       boolean TaggedQueuingSupported:1;
-       boolean WideTransfersSupported:1;
-       boolean TaggedQueuingActive:1;
-       boolean WideTransfersActive:1;
-       boolean CommandSuccessfulFlag:1;
-       boolean TargetInfoReported:1;
+       bool TargetExists:1;
+       bool TaggedQueuingSupported:1;
+       bool WideTransfersSupported:1;
+       bool TaggedQueuingActive:1;
+       bool WideTransfersActive:1;
+       bool CommandSuccessfulFlag:1;
+       bool TargetInfoReported:1;
 };
 
 /*
@@ -992,7 +986,7 @@ typedef unsigned int FlashPoint_CardHandle_T;
 
 struct FlashPoint_Info {
        u32 BaseAddress;        /* Bytes 0-3 */
-       boolean Present;        /* Byte 4 */
+       bool Present;           /* Byte 4 */
        unsigned char IRQ_Channel;      /* Byte 5 */
        unsigned char SCSI_ID;  /* Byte 6 */
        unsigned char SCSI_LUN; /* Byte 7 */
@@ -1002,15 +996,15 @@ struct FlashPoint_Info {
        unsigned short UltraPermitted;  /* Bytes 14-15 */
        unsigned short DisconnectPermitted;     /* Bytes 16-17 */
        unsigned short WidePermitted;   /* Bytes 18-19 */
-       boolean ParityCheckingEnabled:1;        /* Byte 20 Bit 0 */
-       boolean HostWideSCSI:1; /* Byte 20 Bit 1 */
-       boolean HostSoftReset:1;        /* Byte 20 Bit 2 */
-       boolean ExtendedTranslationEnabled:1;   /* Byte 20 Bit 3 */
-       boolean LowByteTerminated:1;    /* Byte 20 Bit 4 */
-       boolean HighByteTerminated:1;   /* Byte 20 Bit 5 */
-       boolean ReportDataUnderrun:1;   /* Byte 20 Bit 6 */
-       boolean SCAM_Enabled:1; /* Byte 20 Bit 7 */
-       boolean SCAM_Level2:1;  /* Byte 21 Bit 0 */
+       bool ParityCheckingEnabled:1;   /* Byte 20 Bit 0 */
+       bool HostWideSCSI:1;            /* Byte 20 Bit 1 */
+       bool HostSoftReset:1;           /* Byte 20 Bit 2 */
+       bool ExtendedTranslationEnabled:1;      /* Byte 20 Bit 3 */
+       bool LowByteTerminated:1;       /* Byte 20 Bit 4 */
+       bool HighByteTerminated:1;      /* Byte 20 Bit 5 */
+       bool ReportDataUnderrun:1;      /* Byte 20 Bit 6 */
+       bool SCAM_Enabled:1;    /* Byte 20 Bit 7 */
+       bool SCAM_Level2:1;     /* Byte 21 Bit 0 */
        unsigned char:7;        /* Byte 21 Bits 1-7 */
        unsigned char Family;   /* Byte 22 */
        unsigned char BusType;  /* Byte 23 */
@@ -1044,29 +1038,29 @@ struct BusLogic_HostAdapter {
        unsigned char IRQ_Channel;
        unsigned char DMA_Channel;
        unsigned char SCSI_ID;
-       boolean IRQ_ChannelAcquired:1;
-       boolean DMA_ChannelAcquired:1;
-       boolean ExtendedTranslationEnabled:1;
-       boolean ParityCheckingEnabled:1;
-       boolean BusResetEnabled:1;
-       boolean LevelSensitiveInterrupt:1;
-       boolean HostWideSCSI:1;
-       boolean HostDifferentialSCSI:1;
-       boolean HostSupportsSCAM:1;
-       boolean HostUltraSCSI:1;
-       boolean ExtendedLUNSupport:1;
-       boolean TerminationInfoValid:1;
-       boolean LowByteTerminated:1;
-       boolean HighByteTerminated:1;
-       boolean BounceBuffersRequired:1;
-       boolean StrictRoundRobinModeSupport:1;
-       boolean SCAM_Enabled:1;
-       boolean SCAM_Level2:1;
-       boolean HostAdapterInitialized:1;
-       boolean HostAdapterExternalReset:1;
-       boolean HostAdapterInternalError:1;
-       boolean ProcessCompletedCCBsActive;
-       volatile boolean HostAdapterCommandCompleted;
+       bool IRQ_ChannelAcquired:1;
+       bool DMA_ChannelAcquired:1;
+       bool ExtendedTranslationEnabled:1;
+       bool ParityCheckingEnabled:1;
+       bool BusResetEnabled:1;
+       bool LevelSensitiveInterrupt:1;
+       bool HostWideSCSI:1;
+       bool HostDifferentialSCSI:1;
+       bool HostSupportsSCAM:1;
+       bool HostUltraSCSI:1;
+       bool ExtendedLUNSupport:1;
+       bool TerminationInfoValid:1;
+       bool LowByteTerminated:1;
+       bool HighByteTerminated:1;
+       bool BounceBuffersRequired:1;
+       bool StrictRoundRobinModeSupport:1;
+       bool SCAM_Enabled:1;
+       bool SCAM_Level2:1;
+       bool HostAdapterInitialized:1;
+       bool HostAdapterExternalReset:1;
+       bool HostAdapterInternalError:1;
+       bool ProcessCompletedCCBsActive;
+       volatile bool HostAdapterCommandCompleted;
        unsigned short HostAdapterScatterGatherLimit;
        unsigned short DriverScatterGatherLimit;
        unsigned short MaxTargetDevices;
@@ -1141,25 +1135,25 @@ struct SCSI_Inquiry {
        unsigned char PeripheralDeviceType:5;   /* Byte 0 Bits 0-4 */
        unsigned char PeripheralQualifier:3;    /* Byte 0 Bits 5-7 */
        unsigned char DeviceTypeModifier:7;     /* Byte 1 Bits 0-6 */
-       boolean RMB:1;          /* Byte 1 Bit 7 */
+       bool RMB:1;             /* Byte 1 Bit 7 */
        unsigned char ANSI_ApprovedVersion:3;   /* Byte 2 Bits 0-2 */
        unsigned char ECMA_Version:3;   /* Byte 2 Bits 3-5 */
        unsigned char ISO_Version:2;    /* Byte 2 Bits 6-7 */
        unsigned char ResponseDataFormat:4;     /* Byte 3 Bits 0-3 */
        unsigned char:2;        /* Byte 3 Bits 4-5 */
-       boolean TrmIOP:1;       /* Byte 3 Bit 6 */
-       boolean AENC:1;         /* Byte 3 Bit 7 */
+       bool TrmIOP:1;          /* Byte 3 Bit 6 */
+       bool AENC:1;            /* Byte 3 Bit 7 */
        unsigned char AdditionalLength; /* Byte 4 */
        unsigned char:8;        /* Byte 5 */
        unsigned char:8;        /* Byte 6 */
-       boolean SftRe:1;        /* Byte 7 Bit 0 */
-       boolean CmdQue:1;       /* Byte 7 Bit 1 */
-        boolean:1;             /* Byte 7 Bit 2 */
-       boolean Linked:1;       /* Byte 7 Bit 3 */
-       boolean Sync:1;         /* Byte 7 Bit 4 */
-       boolean WBus16:1;       /* Byte 7 Bit 5 */
-       boolean WBus32:1;       /* Byte 7 Bit 6 */
-       boolean RelAdr:1;       /* Byte 7 Bit 7 */
+       bool SftRe:1;           /* Byte 7 Bit 0 */
+       bool CmdQue:1;          /* Byte 7 Bit 1 */
+        bool:1;                /* Byte 7 Bit 2 */
+       bool Linked:1;          /* Byte 7 Bit 3 */
+       bool Sync:1;            /* Byte 7 Bit 4 */
+       bool WBus16:1;          /* Byte 7 Bit 5 */
+       bool WBus32:1;          /* Byte 7 Bit 6 */
+       bool RelAdr:1;          /* Byte 7 Bit 7 */
        unsigned char VendorIdentification[8];  /* Bytes 8-15 */
        unsigned char ProductIdentification[16];        /* Bytes 16-31 */
        unsigned char ProductRevisionLevel[4];  /* Bytes 32-35 */
@@ -1348,7 +1342,7 @@ static int BusLogic_ProcDirectoryInfo(struct Scsi_Host *, char *, char **, off_t
 static int BusLogic_SlaveConfigure(struct scsi_device *);
 static void BusLogic_QueueCompletedCCB(struct BusLogic_CCB *);
 static irqreturn_t BusLogic_InterruptHandler(int, void *);
-static int BusLogic_ResetHostAdapter(struct BusLogic_HostAdapter *, boolean HardReset);
+static int BusLogic_ResetHostAdapter(struct BusLogic_HostAdapter *, bool HardReset);
 static void BusLogic_Message(enum BusLogic_MessageLevel, char *, struct BusLogic_HostAdapter *, ...);
 static int __init BusLogic_Setup(char *);
 
index 7c00680495867d0a81a2f81d379a270fb1ff846a..a7f916c0c9cdcc618476eecf3dcca083065d8d9c 100644 (file)
@@ -7609,7 +7609,7 @@ FlashPoint__AbortCCB(FlashPoint_CardHandle_T CardHandle,
        FlashPoint_AbortCCB(CardHandle, (struct sccb *)CCB);
 }
 
-static inline boolean
+static inline bool
 FlashPoint__InterruptPending(FlashPoint_CardHandle_T CardHandle)
 {
        return FlashPoint_InterruptPending(CardHandle);
@@ -7640,7 +7640,7 @@ extern FlashPoint_CardHandle_T
 FlashPoint_HardwareResetHostAdapter(struct FlashPoint_Info *);
 extern void FlashPoint_StartCCB(FlashPoint_CardHandle_T, struct BusLogic_CCB *);
 extern int FlashPoint_AbortCCB(FlashPoint_CardHandle_T, struct BusLogic_CCB *);
-extern boolean FlashPoint_InterruptPending(FlashPoint_CardHandle_T);
+extern bool FlashPoint_InterruptPending(FlashPoint_CardHandle_T);
 extern int FlashPoint_HandleInterrupt(FlashPoint_CardHandle_T);
 extern void FlashPoint_ReleaseHostAdapter(FlashPoint_CardHandle_T);
 
index 7869c34a4a3eed46f82c281adc238aa48e5591df..5bf3f07870ba14f86a5805e3e9f13260420ba564 100644 (file)
@@ -973,6 +973,15 @@ config SCSI_LASI700
          many PA-RISC workstations & servers.  If you do not know whether you
          have a Lasi chip, it is safe to say "Y" here.
 
+config SCSI_SNI_53C710
+       tristate "SNI RM SCSI support for 53c710"
+       depends on SNI_RM && SCSI
+       select SCSI_SPI_ATTRS
+       select 53C700_LE_ON_BE
+       help
+         This is a driver for the onboard SCSI controller found in older
+         SNI RM workstations & servers.
+
 config 53C700_LE_ON_BE
        bool
        depends on SCSI_LASI700
index bd7c9888f7f40ca31052e1fa62796fbb08fb9e37..79ecf4ebe6ebea59b3b662f88ae6fae2d15a526c 100644 (file)
@@ -124,6 +124,7 @@ obj-$(CONFIG_JAZZ_ESP)              += NCR53C9x.o   jazz_esp.o
 obj-$(CONFIG_SUN3X_ESP)                += NCR53C9x.o   sun3x_esp.o
 obj-$(CONFIG_SCSI_FCAL)                += fcal.o
 obj-$(CONFIG_SCSI_LASI700)     += 53c700.o lasi700.o
+obj-$(CONFIG_SCSI_SNI_53C710)  += 53c700.o sni_53c710.o
 obj-$(CONFIG_SCSI_NSP32)       += nsp32.o
 obj-$(CONFIG_SCSI_IPR)         += ipr.o
 obj-$(CONFIG_SCSI_SRP)         += libsrp.o
index 8578555d58fd08f79a4515af12c7f9e990d8cdd4..7c0b17f8690331fdb39390d29c939118fd2c3d0d 100644 (file)
@@ -41,7 +41,6 @@
 
 #include <linux/errno.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/proc_fs.h>
 #include <linux/stat.h>
index 9859cd17fc574ffe4d7791ab7369039f07241f14..f12864abed2f1c99cf52803a989178bee09df122 100644 (file)
@@ -200,6 +200,7 @@ NCR_D700_probe_one(struct NCR_D700_private *p, int siop, int irq,
        hostdata->base = ioport_map(region, 64);
        hostdata->differential = (((1<<siop) & differential) != 0);
        hostdata->clock = NCR_D700_CLOCK_MHZ;
+       hostdata->burst_length = 8;
 
        /* and register the siop */
        host = NCR_700_detect(&NCR_D700_driver_template, hostdata, p->dev);
index f77016d31cabc2966af6714af61add4add1f4ffc..b7c5385e2efe2fb8c04d8892d936b46ae5570137 100644 (file)
@@ -1,7 +1,6 @@
 #include <linux/types.h>
 #include <linux/mm.h>
 #include <linux/blkdev.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
 
index 1299bc8edef18b3a435a004e307418fea27598ba..796f1c4d772e1f5933b700c0b23826fb5f6ed43d 100644 (file)
@@ -1,7 +1,6 @@
 #include <linux/types.h>
 #include <linux/mm.h>
 #include <linux/blkdev.h>
-#include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
 #include <linux/spinlock.h>
index 28d133a3094f85ca11824311660561d1f488154b..f1cca4ee541006c6767b5242f124dfcefcc6d6a0 100644 (file)
@@ -3,6 +3,6 @@
 obj-$(CONFIG_SCSI_AACRAID) := aacraid.o
 
 aacraid-objs   := linit.o aachba.o commctrl.o comminit.o commsup.o \
-                  dpcsup.o rx.o sa.o rkt.o
+                  dpcsup.o rx.o sa.o rkt.o nark.o
 
 EXTRA_CFLAGS   := -Idrivers/scsi
index 426cd6f49f5db6ad1ddcd01de7bbd2e7850d3b47..d789e61bdc49f8cb1e6df119f93bcf8b4ec74b9a 100644 (file)
@@ -26,7 +26,6 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/pci.h>
 #include <linux/spinlock.h>
 #include <linux/slab.h>
@@ -170,9 +169,9 @@ int acbsize = -1;
 module_param(acbsize, int, S_IRUGO|S_IWUSR);
 MODULE_PARM_DESC(acbsize, "Request a specific adapter control block (FIB) size. Valid values are 512, 2048, 4096 and 8192. Default is to use suggestion from Firmware.");
 
-int expose_physicals = 0;
+int expose_physicals = -1;
 module_param(expose_physicals, int, S_IRUGO|S_IWUSR);
-MODULE_PARM_DESC(expose_physicals, "Expose physical components of the arrays. 0=off, 1=on");
+MODULE_PARM_DESC(expose_physicals, "Expose physical components of the arrays. -1=protect 0=off, 1=on");
 /**
  *     aac_get_config_status   -       check the adapter configuration
  *     @common: adapter to query
@@ -706,6 +705,309 @@ static void set_sense(u8 *sense_buf, u8 sense_key, u8 sense_code,
        }
 }
 
+static int aac_bounds_32(struct aac_dev * dev, struct scsi_cmnd * cmd, u64 lba)
+{
+       if (lba & 0xffffffff00000000LL) {
+               int cid = scmd_id(cmd);
+               dprintk((KERN_DEBUG "aacraid: Illegal lba\n"));
+               cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 |
+                       SAM_STAT_CHECK_CONDITION;
+               set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
+                           HARDWARE_ERROR,
+                           SENCODE_INTERNAL_TARGET_FAILURE,
+                           ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
+                           0, 0);
+               memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
+                 (sizeof(dev->fsa_dev[cid].sense_data) > sizeof(cmd->sense_buffer))
+                   ? sizeof(cmd->sense_buffer)
+                   : sizeof(dev->fsa_dev[cid].sense_data));
+               cmd->scsi_done(cmd);
+               return 1;
+       }
+       return 0;
+}
+
+static int aac_bounds_64(struct aac_dev * dev, struct scsi_cmnd * cmd, u64 lba)
+{
+       return 0;
+}
+
+static void io_callback(void *context, struct fib * fibptr);
+
+static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count)
+{
+       u16 fibsize;
+       struct aac_raw_io *readcmd;
+       aac_fib_init(fib);
+       readcmd = (struct aac_raw_io *) fib_data(fib);
+       readcmd->block[0] = cpu_to_le32((u32)(lba&0xffffffff));
+       readcmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32));
+       readcmd->count = cpu_to_le32(count<<9);
+       readcmd->cid = cpu_to_le16(scmd_id(cmd));
+       readcmd->flags = cpu_to_le16(1);
+       readcmd->bpTotal = 0;
+       readcmd->bpComplete = 0;
+
+       aac_build_sgraw(cmd, &readcmd->sg);
+       fibsize = sizeof(struct aac_raw_io) + ((le32_to_cpu(readcmd->sg.count) - 1) * sizeof (struct sgentryraw));
+       BUG_ON(fibsize > (fib->dev->max_fib_size - sizeof(struct aac_fibhdr)));
+       /*
+        *      Now send the Fib to the adapter
+        */
+       return aac_fib_send(ContainerRawIo,
+                         fib,
+                         fibsize,
+                         FsaNormal,
+                         0, 1,
+                         (fib_callback) io_callback,
+                         (void *) cmd);
+}
+
+static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count)
+{
+       u16 fibsize;
+       struct aac_read64 *readcmd;
+       aac_fib_init(fib);
+       readcmd = (struct aac_read64 *) fib_data(fib);
+       readcmd->command = cpu_to_le32(VM_CtHostRead64);
+       readcmd->cid = cpu_to_le16(scmd_id(cmd));
+       readcmd->sector_count = cpu_to_le16(count);
+       readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
+       readcmd->pad   = 0;
+       readcmd->flags = 0;
+
+       aac_build_sg64(cmd, &readcmd->sg);
+       fibsize = sizeof(struct aac_read64) +
+               ((le32_to_cpu(readcmd->sg.count) - 1) *
+                sizeof (struct sgentry64));
+       BUG_ON (fibsize > (fib->dev->max_fib_size -
+                               sizeof(struct aac_fibhdr)));
+       /*
+        *      Now send the Fib to the adapter
+        */
+       return aac_fib_send(ContainerCommand64,
+                         fib,
+                         fibsize,
+                         FsaNormal,
+                         0, 1,
+                         (fib_callback) io_callback,
+                         (void *) cmd);
+}
+
+static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count)
+{
+       u16 fibsize;
+       struct aac_read *readcmd;
+       aac_fib_init(fib);
+       readcmd = (struct aac_read *) fib_data(fib);
+       readcmd->command = cpu_to_le32(VM_CtBlockRead);
+       readcmd->cid = cpu_to_le16(scmd_id(cmd));
+       readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
+       readcmd->count = cpu_to_le32(count * 512);
+
+       aac_build_sg(cmd, &readcmd->sg);
+       fibsize = sizeof(struct aac_read) +
+                       ((le32_to_cpu(readcmd->sg.count) - 1) *
+                        sizeof (struct sgentry));
+       BUG_ON (fibsize > (fib->dev->max_fib_size -
+                               sizeof(struct aac_fibhdr)));
+       /*
+        *      Now send the Fib to the adapter
+        */
+       return aac_fib_send(ContainerCommand,
+                         fib,
+                         fibsize,
+                         FsaNormal,
+                         0, 1,
+                         (fib_callback) io_callback,
+                         (void *) cmd);
+}
+
+static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count)
+{
+       u16 fibsize;
+       struct aac_raw_io *writecmd;
+       aac_fib_init(fib);
+       writecmd = (struct aac_raw_io *) fib_data(fib);
+       writecmd->block[0] = cpu_to_le32((u32)(lba&0xffffffff));
+       writecmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32));
+       writecmd->count = cpu_to_le32(count<<9);
+       writecmd->cid = cpu_to_le16(scmd_id(cmd));
+       writecmd->flags = 0;
+       writecmd->bpTotal = 0;
+       writecmd->bpComplete = 0;
+
+       aac_build_sgraw(cmd, &writecmd->sg);
+       fibsize = sizeof(struct aac_raw_io) + ((le32_to_cpu(writecmd->sg.count) - 1) * sizeof (struct sgentryraw));
+       BUG_ON(fibsize > (fib->dev->max_fib_size - sizeof(struct aac_fibhdr)));
+       /*
+        *      Now send the Fib to the adapter
+        */
+       return aac_fib_send(ContainerRawIo,
+                         fib,
+                         fibsize,
+                         FsaNormal,
+                         0, 1,
+                         (fib_callback) io_callback,
+                         (void *) cmd);
+}
+
+static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count)
+{
+       u16 fibsize;
+       struct aac_write64 *writecmd;
+       aac_fib_init(fib);
+       writecmd = (struct aac_write64 *) fib_data(fib);
+       writecmd->command = cpu_to_le32(VM_CtHostWrite64);
+       writecmd->cid = cpu_to_le16(scmd_id(cmd));
+       writecmd->sector_count = cpu_to_le16(count);
+       writecmd->block = cpu_to_le32((u32)(lba&0xffffffff));
+       writecmd->pad   = 0;
+       writecmd->flags = 0;
+
+       aac_build_sg64(cmd, &writecmd->sg);
+       fibsize = sizeof(struct aac_write64) +
+               ((le32_to_cpu(writecmd->sg.count) - 1) *
+                sizeof (struct sgentry64));
+       BUG_ON (fibsize > (fib->dev->max_fib_size -
+                               sizeof(struct aac_fibhdr)));
+       /*
+        *      Now send the Fib to the adapter
+        */
+       return aac_fib_send(ContainerCommand64,
+                         fib,
+                         fibsize,
+                         FsaNormal,
+                         0, 1,
+                         (fib_callback) io_callback,
+                         (void *) cmd);
+}
+
+static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count)
+{
+       u16 fibsize;
+       struct aac_write *writecmd;
+       aac_fib_init(fib);
+       writecmd = (struct aac_write *) fib_data(fib);
+       writecmd->command = cpu_to_le32(VM_CtBlockWrite);
+       writecmd->cid = cpu_to_le16(scmd_id(cmd));
+       writecmd->block = cpu_to_le32((u32)(lba&0xffffffff));
+       writecmd->count = cpu_to_le32(count * 512);
+       writecmd->sg.count = cpu_to_le32(1);
+       /* ->stable is not used - it did mean which type of write */
+
+       aac_build_sg(cmd, &writecmd->sg);
+       fibsize = sizeof(struct aac_write) +
+               ((le32_to_cpu(writecmd->sg.count) - 1) *
+                sizeof (struct sgentry));
+       BUG_ON (fibsize > (fib->dev->max_fib_size -
+                               sizeof(struct aac_fibhdr)));
+       /*
+        *      Now send the Fib to the adapter
+        */
+       return aac_fib_send(ContainerCommand,
+                         fib,
+                         fibsize,
+                         FsaNormal,
+                         0, 1,
+                         (fib_callback) io_callback,
+                         (void *) cmd);
+}
+
+static struct aac_srb * aac_scsi_common(struct fib * fib, struct scsi_cmnd * cmd)
+{
+       struct aac_srb * srbcmd;
+       u32 flag;
+       u32 timeout;
+
+       aac_fib_init(fib);
+       switch(cmd->sc_data_direction){
+       case DMA_TO_DEVICE:
+               flag = SRB_DataOut;
+               break;
+       case DMA_BIDIRECTIONAL:
+               flag = SRB_DataIn | SRB_DataOut;
+               break;
+       case DMA_FROM_DEVICE:
+               flag = SRB_DataIn;
+               break;
+       case DMA_NONE:
+       default:        /* shuts up some versions of gcc */
+               flag = SRB_NoDataXfer;
+               break;
+       }
+
+       srbcmd = (struct aac_srb*) fib_data(fib);
+       srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi);
+       srbcmd->channel  = cpu_to_le32(aac_logical_to_phys(scmd_channel(cmd)));
+       srbcmd->id       = cpu_to_le32(scmd_id(cmd));
+       srbcmd->lun      = cpu_to_le32(cmd->device->lun);
+       srbcmd->flags    = cpu_to_le32(flag);
+       timeout = cmd->timeout_per_command/HZ;
+       if (timeout == 0)
+               timeout = 1;
+       srbcmd->timeout  = cpu_to_le32(timeout);  // timeout in seconds
+       srbcmd->retry_limit = 0; /* Obsolete parameter */
+       srbcmd->cdb_size = cpu_to_le32(cmd->cmd_len);
+       return srbcmd;
+}
+
+static void aac_srb_callback(void *context, struct fib * fibptr);
+
+static int aac_scsi_64(struct fib * fib, struct scsi_cmnd * cmd)
+{
+       u16 fibsize;
+       struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
+
+       aac_build_sg64(cmd, (struct sgmap64*) &srbcmd->sg);
+       srbcmd->count = cpu_to_le32(cmd->request_bufflen);
+
+       memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
+       memcpy(srbcmd->cdb, cmd->cmnd, cmd->cmd_len);
+       /*
+        *      Build Scatter/Gather list
+        */
+       fibsize = sizeof (struct aac_srb) - sizeof (struct sgentry) +
+               ((le32_to_cpu(srbcmd->sg.count) & 0xff) *
+                sizeof (struct sgentry64));
+       BUG_ON (fibsize > (fib->dev->max_fib_size -
+                               sizeof(struct aac_fibhdr)));
+
+       /*
+        *      Now send the Fib to the adapter
+        */
+       return aac_fib_send(ScsiPortCommand64, fib,
+                               fibsize, FsaNormal, 0, 1,
+                                 (fib_callback) aac_srb_callback,
+                                 (void *) cmd);
+}
+
+static int aac_scsi_32(struct fib * fib, struct scsi_cmnd * cmd)
+{
+       u16 fibsize;
+       struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
+
+       aac_build_sg(cmd, (struct sgmap*)&srbcmd->sg);
+       srbcmd->count = cpu_to_le32(cmd->request_bufflen);
+
+       memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
+       memcpy(srbcmd->cdb, cmd->cmnd, cmd->cmd_len);
+       /*
+        *      Build Scatter/Gather list
+        */
+       fibsize = sizeof (struct aac_srb) +
+               (((le32_to_cpu(srbcmd->sg.count) & 0xff) - 1) *
+                sizeof (struct sgentry));
+       BUG_ON (fibsize > (fib->dev->max_fib_size -
+                               sizeof(struct aac_fibhdr)));
+
+       /*
+        *      Now send the Fib to the adapter
+        */
+       return aac_fib_send(ScsiPortCommand, fib, fibsize, FsaNormal, 0, 1,
+                                 (fib_callback) aac_srb_callback, (void *) cmd);
+}
+
 int aac_get_adapter_info(struct aac_dev* dev)
 {
        struct fib* fibptr;
@@ -874,14 +1176,27 @@ int aac_get_adapter_info(struct aac_dev* dev)
                }
        }
        /* 
-        * 57 scatter gather elements 
+        * Deal with configuring for the individualized limits of each packet
+        * interface.
         */
-       if (!(dev->raw_io_interface)) {
+       dev->a_ops.adapter_scsi = (dev->dac_support)
+                               ? aac_scsi_64
+                               : aac_scsi_32;
+       if (dev->raw_io_interface) {
+               dev->a_ops.adapter_bounds = (dev->raw_io_64)
+                                       ? aac_bounds_64
+                                       : aac_bounds_32;
+               dev->a_ops.adapter_read = aac_read_raw_io;
+               dev->a_ops.adapter_write = aac_write_raw_io;
+       } else {
+               dev->a_ops.adapter_bounds = aac_bounds_32;
                dev->scsi_host_ptr->sg_tablesize = (dev->max_fib_size -
                        sizeof(struct aac_fibhdr) -
                        sizeof(struct aac_write) + sizeof(struct sgentry)) /
                                sizeof(struct sgentry);
                if (dev->dac_support) {
+                       dev->a_ops.adapter_read = aac_read_block64;
+                       dev->a_ops.adapter_write = aac_write_block64;
                        /* 
                         * 38 scatter gather elements 
                         */
@@ -891,6 +1206,9 @@ int aac_get_adapter_info(struct aac_dev* dev)
                                sizeof(struct aac_write64) +
                                sizeof(struct sgentry64)) /
                                        sizeof(struct sgentry64);
+               } else {
+                       dev->a_ops.adapter_read = aac_read_block;
+                       dev->a_ops.adapter_write = aac_write_block;
                }
                dev->scsi_host_ptr->max_sectors = AAC_MAX_32BIT_SGBCOUNT;
                if(!(dev->adapter_info.options & AAC_OPT_NEW_COMM)) {
@@ -1004,8 +1322,6 @@ static int aac_read(struct scsi_cmnd * scsicmd, int cid)
        u64 lba;
        u32 count;
        int status;
-
-       u16 fibsize;
        struct aac_dev *dev;
        struct fib * cmd_fibcontext;
 
@@ -1059,23 +1375,8 @@ static int aac_read(struct scsi_cmnd * scsicmd, int cid)
        }
        dprintk((KERN_DEBUG "aac_read[cpu %d]: lba = %llu, t = %ld.\n",
          smp_processor_id(), (unsigned long long)lba, jiffies));
-       if ((!(dev->raw_io_interface) || !(dev->raw_io_64)) &&
-               (lba & 0xffffffff00000000LL)) {
-               dprintk((KERN_DEBUG "aac_read: Illegal lba\n"));
-               scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | 
-                       SAM_STAT_CHECK_CONDITION;
-               set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
-                           HARDWARE_ERROR,
-                           SENCODE_INTERNAL_TARGET_FAILURE,
-                           ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
-                           0, 0);
-               memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
-                 (sizeof(dev->fsa_dev[cid].sense_data) > sizeof(scsicmd->sense_buffer))
-                   ? sizeof(scsicmd->sense_buffer)
-                   : sizeof(dev->fsa_dev[cid].sense_data));
-               scsicmd->scsi_done(scsicmd);
+       if (aac_adapter_bounds(dev,scsicmd,lba))
                return 0;
-       }
        /*
         *      Alocate and initialize a Fib
         */
@@ -1083,85 +1384,7 @@ static int aac_read(struct scsi_cmnd * scsicmd, int cid)
                return -1;
        }
 
-       aac_fib_init(cmd_fibcontext);
-
-       if (dev->raw_io_interface) {
-               struct aac_raw_io *readcmd;
-               readcmd = (struct aac_raw_io *) fib_data(cmd_fibcontext);
-               readcmd->block[0] = cpu_to_le32((u32)(lba&0xffffffff));
-               readcmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32));
-               readcmd->count = cpu_to_le32(count<<9);
-               readcmd->cid = cpu_to_le16(cid);
-               readcmd->flags = cpu_to_le16(1);
-               readcmd->bpTotal = 0;
-               readcmd->bpComplete = 0;
-               
-               aac_build_sgraw(scsicmd, &readcmd->sg);
-               fibsize = sizeof(struct aac_raw_io) + ((le32_to_cpu(readcmd->sg.count) - 1) * sizeof (struct sgentryraw));
-               BUG_ON(fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr)));
-               /*
-                *      Now send the Fib to the adapter
-                */
-               status = aac_fib_send(ContainerRawIo,
-                         cmd_fibcontext, 
-                         fibsize, 
-                         FsaNormal, 
-                         0, 1, 
-                         (fib_callback) io_callback, 
-                         (void *) scsicmd);
-       } else if (dev->dac_support == 1) {
-               struct aac_read64 *readcmd;
-               readcmd = (struct aac_read64 *) fib_data(cmd_fibcontext);
-               readcmd->command = cpu_to_le32(VM_CtHostRead64);
-               readcmd->cid = cpu_to_le16(cid);
-               readcmd->sector_count = cpu_to_le16(count);
-               readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
-               readcmd->pad   = 0;
-               readcmd->flags = 0; 
-
-               aac_build_sg64(scsicmd, &readcmd->sg);
-               fibsize = sizeof(struct aac_read64) + 
-                       ((le32_to_cpu(readcmd->sg.count) - 1) * 
-                        sizeof (struct sgentry64));
-               BUG_ON (fibsize > (dev->max_fib_size - 
-                                       sizeof(struct aac_fibhdr)));
-               /*
-                *      Now send the Fib to the adapter
-                */
-               status = aac_fib_send(ContainerCommand64,
-                         cmd_fibcontext, 
-                         fibsize, 
-                         FsaNormal, 
-                         0, 1, 
-                         (fib_callback) io_callback, 
-                         (void *) scsicmd);
-       } else {
-               struct aac_read *readcmd;
-               readcmd = (struct aac_read *) fib_data(cmd_fibcontext);
-               readcmd->command = cpu_to_le32(VM_CtBlockRead);
-               readcmd->cid = cpu_to_le32(cid);
-               readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
-               readcmd->count = cpu_to_le32(count * 512);
-
-               aac_build_sg(scsicmd, &readcmd->sg);
-               fibsize = sizeof(struct aac_read) + 
-                       ((le32_to_cpu(readcmd->sg.count) - 1) * 
-                        sizeof (struct sgentry));
-               BUG_ON (fibsize > (dev->max_fib_size -
-                                       sizeof(struct aac_fibhdr)));
-               /*
-                *      Now send the Fib to the adapter
-                */
-               status = aac_fib_send(ContainerCommand,
-                         cmd_fibcontext, 
-                         fibsize, 
-                         FsaNormal, 
-                         0, 1, 
-                         (fib_callback) io_callback, 
-                         (void *) scsicmd);
-       }
-
-       
+       status = aac_adapter_read(cmd_fibcontext, scsicmd, lba, count);
 
        /*
         *      Check that the command queued to the controller
@@ -1187,7 +1410,6 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid)
        u64 lba;
        u32 count;
        int status;
-       u16 fibsize;
        struct aac_dev *dev;
        struct fib * cmd_fibcontext;
 
@@ -1227,22 +1449,8 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid)
        }
        dprintk((KERN_DEBUG "aac_write[cpu %d]: lba = %llu, t = %ld.\n",
          smp_processor_id(), (unsigned long long)lba, jiffies));
-       if ((!(dev->raw_io_interface) || !(dev->raw_io_64))
-        && (lba & 0xffffffff00000000LL)) {
-               dprintk((KERN_DEBUG "aac_write: Illegal lba\n"));
-               scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
-               set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
-                           HARDWARE_ERROR,
-                           SENCODE_INTERNAL_TARGET_FAILURE,
-                           ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
-                           0, 0);
-               memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
-                 (sizeof(dev->fsa_dev[cid].sense_data) > sizeof(scsicmd->sense_buffer))
-                   ? sizeof(scsicmd->sense_buffer)
-                   : sizeof(dev->fsa_dev[cid].sense_data));
-               scsicmd->scsi_done(scsicmd);
+       if (aac_adapter_bounds(dev,scsicmd,lba))
                return 0;
-       }
        /*
         *      Allocate and initialize a Fib then setup a BlockWrite command
         */
@@ -1251,85 +1459,8 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid)
                scsicmd->scsi_done(scsicmd);
                return 0;
        }
-       aac_fib_init(cmd_fibcontext);
 
-       if (dev->raw_io_interface) {
-               struct aac_raw_io *writecmd;
-               writecmd = (struct aac_raw_io *) fib_data(cmd_fibcontext);
-               writecmd->block[0] = cpu_to_le32((u32)(lba&0xffffffff));
-               writecmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32));
-               writecmd->count = cpu_to_le32(count<<9);
-               writecmd->cid = cpu_to_le16(cid);
-               writecmd->flags = 0; 
-               writecmd->bpTotal = 0;
-               writecmd->bpComplete = 0;
-               
-               aac_build_sgraw(scsicmd, &writecmd->sg);
-               fibsize = sizeof(struct aac_raw_io) + ((le32_to_cpu(writecmd->sg.count) - 1) * sizeof (struct sgentryraw));
-               BUG_ON(fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr)));
-               /*
-                *      Now send the Fib to the adapter
-                */
-               status = aac_fib_send(ContainerRawIo,
-                         cmd_fibcontext, 
-                         fibsize, 
-                         FsaNormal, 
-                         0, 1, 
-                         (fib_callback) io_callback, 
-                         (void *) scsicmd);
-       } else if (dev->dac_support == 1) {
-               struct aac_write64 *writecmd;
-               writecmd = (struct aac_write64 *) fib_data(cmd_fibcontext);
-               writecmd->command = cpu_to_le32(VM_CtHostWrite64);
-               writecmd->cid = cpu_to_le16(cid);
-               writecmd->sector_count = cpu_to_le16(count); 
-               writecmd->block = cpu_to_le32((u32)(lba&0xffffffff));
-               writecmd->pad   = 0;
-               writecmd->flags = 0;
-
-               aac_build_sg64(scsicmd, &writecmd->sg);
-               fibsize = sizeof(struct aac_write64) + 
-                       ((le32_to_cpu(writecmd->sg.count) - 1) * 
-                        sizeof (struct sgentry64));
-               BUG_ON (fibsize > (dev->max_fib_size -
-                                       sizeof(struct aac_fibhdr)));
-               /*
-                *      Now send the Fib to the adapter
-                */
-               status = aac_fib_send(ContainerCommand64,
-                         cmd_fibcontext, 
-                         fibsize, 
-                         FsaNormal, 
-                         0, 1, 
-                         (fib_callback) io_callback, 
-                         (void *) scsicmd);
-       } else {
-               struct aac_write *writecmd;
-               writecmd = (struct aac_write *) fib_data(cmd_fibcontext);
-               writecmd->command = cpu_to_le32(VM_CtBlockWrite);
-               writecmd->cid = cpu_to_le32(cid);
-               writecmd->block = cpu_to_le32((u32)(lba&0xffffffff));
-               writecmd->count = cpu_to_le32(count * 512);
-               writecmd->sg.count = cpu_to_le32(1);
-               /* ->stable is not used - it did mean which type of write */
-
-               aac_build_sg(scsicmd, &writecmd->sg);
-               fibsize = sizeof(struct aac_write) + 
-                       ((le32_to_cpu(writecmd->sg.count) - 1) * 
-                        sizeof (struct sgentry));
-               BUG_ON (fibsize > (dev->max_fib_size -
-                                       sizeof(struct aac_fibhdr)));
-               /*
-                *      Now send the Fib to the adapter
-                */
-               status = aac_fib_send(ContainerCommand,
-                         cmd_fibcontext, 
-                         fibsize, 
-                         FsaNormal, 
-                         0, 1, 
-                         (fib_callback) io_callback, 
-                         (void *) scsicmd);
-       }
+       status = aac_adapter_write(cmd_fibcontext, scsicmd, lba, count);
 
        /*
         *      Check that the command queued to the controller
@@ -2099,10 +2230,6 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
        struct fib* cmd_fibcontext;
        struct aac_dev* dev;
        int status;
-       struct aac_srb *srbcmd;
-       u16 fibsize;
-       u32 flag;
-       u32 timeout;
 
        dev = (struct aac_dev *)scsicmd->device->host->hostdata;
        if (scmd_id(scsicmd) >= dev->maximum_num_physicals ||
@@ -2112,88 +2239,14 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
                return 0;
        }
 
-       switch(scsicmd->sc_data_direction){
-       case DMA_TO_DEVICE:
-               flag = SRB_DataOut;
-               break;
-       case DMA_BIDIRECTIONAL:
-               flag = SRB_DataIn | SRB_DataOut;
-               break;
-       case DMA_FROM_DEVICE:
-               flag = SRB_DataIn;
-               break;
-       case DMA_NONE:
-       default:        /* shuts up some versions of gcc */
-               flag = SRB_NoDataXfer;
-               break;
-       }
-
-
        /*
         *      Allocate and initialize a Fib then setup a BlockWrite command
         */
        if (!(cmd_fibcontext = aac_fib_alloc(dev))) {
                return -1;
        }
-       aac_fib_init(cmd_fibcontext);
-
-       srbcmd = (struct aac_srb*) fib_data(cmd_fibcontext);
-       srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi);
-       srbcmd->channel  = cpu_to_le32(aac_logical_to_phys(scmd_channel(scsicmd)));
-       srbcmd->id   = cpu_to_le32(scmd_id(scsicmd));
-       srbcmd->lun      = cpu_to_le32(scsicmd->device->lun);
-       srbcmd->flags    = cpu_to_le32(flag);
-       timeout = scsicmd->timeout_per_command/HZ;
-       if(timeout == 0){
-               timeout = 1;
-       }
-       srbcmd->timeout  = cpu_to_le32(timeout);  // timeout in seconds
-       srbcmd->retry_limit = 0; /* Obsolete parameter */
-       srbcmd->cdb_size = cpu_to_le32(scsicmd->cmd_len);
-       
-       if( dev->dac_support == 1 ) {
-               aac_build_sg64(scsicmd, (struct sgmap64*) &srbcmd->sg);
-               srbcmd->count = cpu_to_le32(scsicmd->request_bufflen);
-
-               memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
-               memcpy(srbcmd->cdb, scsicmd->cmnd, scsicmd->cmd_len);
-               /*
-                *      Build Scatter/Gather list
-                */
-               fibsize = sizeof (struct aac_srb) - sizeof (struct sgentry) +
-                       ((le32_to_cpu(srbcmd->sg.count) & 0xff) * 
-                        sizeof (struct sgentry64));
-               BUG_ON (fibsize > (dev->max_fib_size -
-                                       sizeof(struct aac_fibhdr)));
+       status = aac_adapter_scsi(cmd_fibcontext, scsicmd);
 
-               /*
-                *      Now send the Fib to the adapter
-                */
-               status = aac_fib_send(ScsiPortCommand64, cmd_fibcontext,
-                               fibsize, FsaNormal, 0, 1,
-                                 (fib_callback) aac_srb_callback, 
-                                 (void *) scsicmd);
-       } else {
-               aac_build_sg(scsicmd, (struct sgmap*)&srbcmd->sg);
-               srbcmd->count = cpu_to_le32(scsicmd->request_bufflen);
-
-               memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
-               memcpy(srbcmd->cdb, scsicmd->cmnd, scsicmd->cmd_len);
-               /*
-                *      Build Scatter/Gather list
-                */
-               fibsize = sizeof (struct aac_srb) + 
-                       (((le32_to_cpu(srbcmd->sg.count) & 0xff) - 1) * 
-                        sizeof (struct sgentry));
-               BUG_ON (fibsize > (dev->max_fib_size -
-                                       sizeof(struct aac_fibhdr)));
-
-               /*
-                *      Now send the Fib to the adapter
-                */
-               status = aac_fib_send(ScsiPortCommand, cmd_fibcontext, fibsize, FsaNormal, 0, 1,
-                                 (fib_callback) aac_srb_callback, (void *) scsicmd);
-       }
        /*
         *      Check that the command queued to the controller
         */
index 4f8b4c53d435867da99381898093ab5cc393dec5..39ecd0d22eb0dcc5e1b6397ec98ee84903a0c8da 100644 (file)
@@ -5,6 +5,7 @@
 #define _nblank(x) #x
 #define nblank(x) _nblank(x)[0]
 
+#include <linux/interrupt.h>
 
 /*------------------------------------------------------------------------------
  *              D E F I N E S
@@ -485,16 +486,28 @@ enum aac_log_level {
 
 struct aac_dev;
 struct fib;
+struct scsi_cmnd;
 
 struct adapter_ops
 {
+       /* Low level operations */
        void (*adapter_interrupt)(struct aac_dev *dev);
        void (*adapter_notify)(struct aac_dev *dev, u32 event);
        void (*adapter_disable_int)(struct aac_dev *dev);
+       void (*adapter_enable_int)(struct aac_dev *dev);
        int  (*adapter_sync_cmd)(struct aac_dev *dev, u32 command, u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6, u32 *status, u32 *r1, u32 *r2, u32 *r3, u32 *r4);
        int  (*adapter_check_health)(struct aac_dev *dev);
-       int  (*adapter_send)(struct fib * fib);
+       /* Transport operations */
        int  (*adapter_ioremap)(struct aac_dev * dev, u32 size);
+       irqreturn_t (*adapter_intr)(int irq, void *dev_id);
+       /* Packet operations */
+       int  (*adapter_deliver)(struct fib * fib);
+       int  (*adapter_bounds)(struct aac_dev * dev, struct scsi_cmnd * cmd, u64 lba);
+       int  (*adapter_read)(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count);
+       int  (*adapter_write)(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count);
+       int  (*adapter_scsi)(struct fib * fib, struct scsi_cmnd * cmd);
+       /* Administrative operations */
+       int  (*adapter_comm)(struct aac_dev * dev, int comm);
 };
 
 /*
@@ -1018,7 +1031,9 @@ struct aac_dev
        u8                      nondasd_support; 
        u8                      dac_support;
        u8                      raid_scsi_mode;
-       u8                      new_comm_interface;
+       u8                      comm_interface;
+#      define AAC_COMM_PRODUCER 0
+#      define AAC_COMM_MESSAGE  1
        /* macro side-effects BEWARE */
 #      define                  raw_io_interface \
          init->InitStructRevision==cpu_to_le32(ADAPTER_INIT_STRUCT_REVISION_4)
@@ -1036,18 +1051,36 @@ struct aac_dev
 #define aac_adapter_disable_int(dev) \
        (dev)->a_ops.adapter_disable_int(dev)
 
+#define aac_adapter_enable_int(dev) \
+       (dev)->a_ops.adapter_enable_int(dev)
+
 #define aac_adapter_sync_cmd(dev, command, p1, p2, p3, p4, p5, p6, status, r1, r2, r3, r4) \
        (dev)->a_ops.adapter_sync_cmd(dev, command, p1, p2, p3, p4, p5, p6, status, r1, r2, r3, r4)
 
 #define aac_adapter_check_health(dev) \
        (dev)->a_ops.adapter_check_health(dev)
 
-#define aac_adapter_send(fib) \
-       ((fib)->dev)->a_ops.adapter_send(fib)
-
 #define aac_adapter_ioremap(dev, size) \
        (dev)->a_ops.adapter_ioremap(dev, size)
 
+#define aac_adapter_deliver(fib) \
+       ((fib)->dev)->a_ops.adapter_deliver(fib)
+
+#define aac_adapter_bounds(dev,cmd,lba) \
+       dev->a_ops.adapter_bounds(dev,cmd,lba)
+
+#define aac_adapter_read(fib,cmd,lba,count) \
+       ((fib)->dev)->a_ops.adapter_read(fib,cmd,lba,count)
+
+#define aac_adapter_write(fib,cmd,lba,count) \
+       ((fib)->dev)->a_ops.adapter_write(fib,cmd,lba,count)
+
+#define aac_adapter_scsi(fib,cmd) \
+       ((fib)->dev)->a_ops.adapter_scsi(fib,cmd)
+
+#define aac_adapter_comm(dev,comm) \
+       (dev)->a_ops.adapter_comm(dev, comm)
+
 #define FIB_CONTEXT_FLAG_TIMED_OUT             (0x00000001)
 
 /*
@@ -1767,7 +1800,6 @@ static inline u32 cap_to_cyls(sector_t capacity, u32 divisor)
        return (u32)capacity;
 }
 
-struct scsi_cmnd;
 /* SCp.phase values */
 #define AAC_OWNER_MIDLEVEL     0x101
 #define AAC_OWNER_LOWLEVEL     0x102
@@ -1794,7 +1826,9 @@ int aac_dev_ioctl(struct aac_dev *dev, int cmd, void __user *arg);
 int aac_do_ioctl(struct aac_dev * dev, int cmd, void __user *arg);
 int aac_rx_init(struct aac_dev *dev);
 int aac_rkt_init(struct aac_dev *dev);
+int aac_nark_init(struct aac_dev *dev);
 int aac_sa_init(struct aac_dev *dev);
+int aac_queue_get(struct aac_dev * dev, u32 * index, u32 qid, struct hw_fib * hw_fib, int wait, struct fib * fibptr, unsigned long *nonotify);
 unsigned int aac_response_normal(struct aac_queue * q);
 unsigned int aac_command_normal(struct aac_queue * q);
 unsigned int aac_intr_normal(struct aac_dev * dev, u32 Index);
index da1d3a9212f8083da498919fb956bc0c44b9eea7..e21070f4eac16a68c74926fbde4006fbc14dedba 100644 (file)
@@ -31,7 +31,6 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/pci.h>
 #include <linux/spinlock.h>
 #include <linux/slab.h>
index 6d305b2f854e2fad06e869ac05c996351cb21c7e..ae34768987a4d28a565b9ab40001a4fce378fdf2 100644 (file)
@@ -32,7 +32,6 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/pci.h>
 #include <linux/spinlock.h>
 #include <linux/slab.h>
@@ -95,7 +94,7 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
        init->HostPhysMemPages = cpu_to_le32(AAC_MAX_HOSTPHYSMEMPAGES);
 
        init->InitFlags = 0;
-       if (dev->new_comm_interface) {
+       if (dev->comm_interface == AAC_COMM_MESSAGE) {
                init->InitFlags = cpu_to_le32(INITFLAGS_NEW_COMM_SUPPORTED);
                dprintk((KERN_WARNING"aacraid: New Comm Interface enabled\n"));
        }
@@ -297,21 +296,23 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
                - sizeof(struct aac_fibhdr)
                - sizeof(struct aac_write) + sizeof(struct sgentry))
                        / sizeof(struct sgentry);
-       dev->new_comm_interface = 0;
+       dev->comm_interface = AAC_COMM_PRODUCER;
        dev->raw_io_64 = 0;
        if ((!aac_adapter_sync_cmd(dev, GET_ADAPTER_PROPERTIES,
                0, 0, 0, 0, 0, 0, status+0, status+1, status+2, NULL, NULL)) &&
                        (status[0] == 0x00000001)) {
                if (status[1] & AAC_OPT_NEW_COMM_64)
                        dev->raw_io_64 = 1;
-               if (status[1] & AAC_OPT_NEW_COMM)
-                       dev->new_comm_interface = dev->a_ops.adapter_send != 0;
-               if (dev->new_comm_interface && (status[2] > dev->base_size)) {
+               if (dev->a_ops.adapter_comm &&
+                   (status[1] & AAC_OPT_NEW_COMM))
+                       dev->comm_interface = AAC_COMM_MESSAGE;
+               if ((dev->comm_interface == AAC_COMM_MESSAGE) &&
+                   (status[2] > dev->base_size)) {
                        aac_adapter_ioremap(dev, 0);
                        dev->base_size = status[2];
                        if (aac_adapter_ioremap(dev, status[2])) {
                                /* remap failed, go back ... */
-                               dev->new_comm_interface = 0;
+                               dev->comm_interface = AAC_COMM_PRODUCER;
                                if (aac_adapter_ioremap(dev, AAC_MIN_FOOTPRINT_SIZE)) {
                                        printk(KERN_WARNING
                                          "aacraid: unable to map adapter.\n");
index 4893a6d06a332ac6f32500f3e0ebc3a1a7183838..1b97f60652ba2cacdcf9bc9c4d3170c4d6f92adf 100644 (file)
@@ -317,7 +317,7 @@ static int aac_get_entry (struct aac_dev * dev, u32 qid, struct aac_entry **entr
  *     success.
  */
 
-static int aac_queue_get(struct aac_dev * dev, u32 * index, u32 qid, struct hw_fib * hw_fib, int wait, struct fib * fibptr, unsigned long *nonotify)
+int aac_queue_get(struct aac_dev * dev, u32 * index, u32 qid, struct hw_fib * hw_fib, int wait, struct fib * fibptr, unsigned long *nonotify)
 {
        struct aac_entry * entry = NULL;
        int map = 0;
@@ -387,7 +387,6 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size,
 {
        struct aac_dev * dev = fibptr->dev;
        struct hw_fib * hw_fib = fibptr->hw_fib;
-       struct aac_queue * q;
        unsigned long flags = 0;
        unsigned long qflags;
 
@@ -469,38 +468,10 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size,
 
        if (!dev->queues)
                return -EBUSY;
-       q = &dev->queues->queue[AdapNormCmdQueue];
 
        if(wait)
                spin_lock_irqsave(&fibptr->event_lock, flags);
-       spin_lock_irqsave(q->lock, qflags);
-       if (dev->new_comm_interface) {
-               unsigned long count = 10000000L; /* 50 seconds */
-               q->numpending++;
-               spin_unlock_irqrestore(q->lock, qflags);
-               while (aac_adapter_send(fibptr) != 0) {
-                       if (--count == 0) {
-                               if (wait)
-                                       spin_unlock_irqrestore(&fibptr->event_lock, flags);
-                               spin_lock_irqsave(q->lock, qflags);
-                               q->numpending--;
-                               spin_unlock_irqrestore(q->lock, qflags);
-                               return -ETIMEDOUT;
-                       }
-                       udelay(5);
-               }
-       } else {
-               u32 index;
-               unsigned long nointr = 0;
-               aac_queue_get( dev, &index, AdapNormCmdQueue, hw_fib, 1, fibptr, &nointr);
-
-               q->numpending++;
-               *(q->headers.producer) = cpu_to_le32(index + 1);
-               spin_unlock_irqrestore(q->lock, qflags);
-               dprintk((KERN_DEBUG "aac_fib_send: inserting a queue entry at index %d.\n",index));
-               if (!(nointr & aac_config.irq_mod))
-                       aac_adapter_notify(dev, AdapNormCmdQueue);
-       }
+       aac_adapter_deliver(fibptr);
 
        /*
         *      If the caller wanted us to wait for response wait now. 
@@ -520,6 +491,7 @@ int aac_fib_send(u16 command, struct fib *fibptr, unsigned long size,
                        while (down_trylock(&fibptr->event_wait)) {
                                int blink;
                                if (--count == 0) {
+                                       struct aac_queue * q = &dev->queues->queue[AdapNormCmdQueue];
                                        spin_lock_irqsave(q->lock, qflags);
                                        q->numpending--;
                                        spin_unlock_irqrestore(q->lock, qflags);
@@ -659,7 +631,7 @@ int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size)
        unsigned long qflags;
 
        if (hw_fib->header.XferState == 0) {
-               if (dev->new_comm_interface)
+               if (dev->comm_interface == AAC_COMM_MESSAGE)
                        kfree (hw_fib);
                return 0;
        }
@@ -667,7 +639,7 @@ int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size)
         *      If we plan to do anything check the structure type first.
         */ 
        if ( hw_fib->header.StructType != FIB_MAGIC ) {
-               if (dev->new_comm_interface)
+               if (dev->comm_interface == AAC_COMM_MESSAGE)
                        kfree (hw_fib);
                return -EINVAL;
        }
@@ -679,7 +651,7 @@ int aac_fib_adapter_complete(struct fib *fibptr, unsigned short size)
         *      send the completed cdb to the adapter.
         */
        if (hw_fib->header.XferState & cpu_to_le32(SentFromAdapter)) {
-               if (dev->new_comm_interface) {
+               if (dev->comm_interface == AAC_COMM_MESSAGE) {
                        kfree (hw_fib);
                } else {
                        u32 index;
index 8335f07b77205700c9184109d3a0039efdd1566f..d38b628be1ada395311d5b18265b66bcd1022c5d 100644 (file)
@@ -32,7 +32,6 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/pci.h>
 #include <linux/spinlock.h>
 #include <linux/slab.h>
index d2cf875af59b6139fa99f63257b1e189fc22551a..0f948c2fb6097a7585e8b144699fca5799ed3659 100644 (file)
@@ -157,6 +157,7 @@ static struct pci_device_id aac_pci_tbl[] = {
        { 0x9005, 0x0285, 0x17aa, PCI_ANY_ID, 0, 0, 58 }, /* Legend Catchall */
        { 0x9005, 0x0285, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 59 }, /* Adaptec Catch All */
        { 0x9005, 0x0286, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 60 }, /* Adaptec Rocket Catch All */
+       { 0x9005, 0x0288, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 61 }, /* Adaptec NEMER/ARK Catch All */
        { 0,}
 };
 MODULE_DEVICE_TABLE(pci, aac_pci_tbl);
@@ -230,7 +231,8 @@ static struct aac_driver_ident aac_drivers[] = {
        { aac_rx_init, "aacraid",  "DELL    ", "RAID            ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG }, /* Dell Catchall */
        { aac_rx_init, "aacraid",  "Legend  ", "RAID            ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG }, /* Legend Catchall */
        { aac_rx_init, "aacraid",  "ADAPTEC ", "RAID            ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG }, /* Adaptec Catch All */
-       { aac_rkt_init, "aacraid", "ADAPTEC ", "RAID            ", 2 } /* Adaptec Rocket Catch All */
+       { aac_rkt_init, "aacraid", "ADAPTEC ", "RAID            ", 2 }, /* Adaptec Rocket Catch All */
+       { aac_nark_init, "aacraid", "ADAPTEC ", "RAID            ", 2 } /* Adaptec NEMER/ARK Catch All */
 };
 
 /**
@@ -396,11 +398,15 @@ static int aac_slave_configure(struct scsi_device *sdev)
                sdev->skip_ms_page_3f = 1;
        }
        if ((sdev->type == TYPE_DISK) &&
-                       !expose_physicals &&
                        (sdev_channel(sdev) != CONTAINER_CHANNEL)) {
-               struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata;
-               if (!aac->raid_scsi_mode || (sdev_channel(sdev) != 2))
-                       sdev->no_uld_attach = 1;
+               if (expose_physicals == 0)
+                       return -ENXIO;
+               if (expose_physicals < 0) {
+                       struct aac_dev *aac =
+                               (struct aac_dev *)sdev->host->hostdata;
+                       if (!aac->raid_scsi_mode || (sdev_channel(sdev) != 2))
+                               sdev->no_uld_attach = 1;
+               }
        }
        if (sdev->tagged_supported && (sdev->type == TYPE_DISK) &&
                        (sdev_channel(sdev) == CONTAINER_CHANNEL)) {
@@ -768,7 +774,7 @@ static struct class_device_attribute *aac_attrs[] = {
 };
 
 
-static struct file_operations aac_cfg_fops = {
+static const struct file_operations aac_cfg_fops = {
        .owner          = THIS_MODULE,
        .ioctl          = aac_cfg_ioctl,
 #ifdef CONFIG_COMPAT
@@ -804,7 +810,6 @@ static struct scsi_host_template aac_driver_template = {
        .emulated                       = 1,
 };
 
-
 static int __devinit aac_probe_one(struct pci_dev *pdev,
                const struct pci_device_id *id)
 {
diff --git a/drivers/scsi/aacraid/nark.c b/drivers/scsi/aacraid/nark.c
new file mode 100644 (file)
index 0000000..c76b611
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ *     Adaptec AAC series RAID controller driver
+ *     (c) Copyright 2001 Red Hat Inc. <alan@redhat.com>
+ *
+ * based on the old aacraid driver that is..
+ * Adaptec aacraid device driver for Linux.
+ *
+ * Copyright (c) 2000 Adaptec, Inc. (aacraid@adaptec.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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Module Name:
+ *  nark.c
+ *
+ * Abstract: Hardware Device Interface for NEMER/ARK
+ *
+ */
+
+#include <linux/pci.h>
+#include <linux/blkdev.h>
+
+#include <scsi/scsi_host.h>
+
+#include "aacraid.h"
+
+/**
+ *     aac_nark_ioremap
+ *     @size: mapping resize request
+ *
+ */
+static int aac_nark_ioremap(struct aac_dev * dev, u32 size)
+{
+       if (!size) {
+               iounmap(dev->regs.rx);
+               dev->regs.rx = NULL;
+               iounmap(dev->base);
+               dev->base = NULL;
+               return 0;
+       }
+       dev->scsi_host_ptr->base = pci_resource_start(dev->pdev, 2);
+       dev->regs.rx = ioremap((u64)pci_resource_start(dev->pdev, 0) |
+         ((u64)pci_resource_start(dev->pdev, 1) << 32),
+         sizeof(struct rx_registers) - sizeof(struct rx_inbound));
+       dev->base = NULL;
+       if (dev->regs.rx == NULL)
+               return -1;
+       dev->base = ioremap(dev->scsi_host_ptr->base, size);
+       if (dev->base == NULL) {
+               iounmap(dev->regs.rx);
+               dev->regs.rx = NULL;
+               return -1;
+       }
+       dev->IndexRegs = &((struct rx_registers __iomem *)dev->base)->IndexRegs;
+       return 0;
+}
+
+/**
+ *     aac_nark_init   -       initialize an NEMER/ARK Split Bar card
+ *     @dev: device to configure
+ *
+ */
+
+int aac_nark_init(struct aac_dev * dev)
+{
+       extern int _aac_rx_init(struct aac_dev *dev);
+       extern int aac_rx_select_comm(struct aac_dev *dev, int comm);
+
+       /*
+        *      Fill in the function dispatch table.
+        */
+       dev->a_ops.adapter_ioremap = aac_nark_ioremap;
+       dev->a_ops.adapter_comm = aac_rx_select_comm;
+
+       return _aac_rx_init(dev);
+}
index 643f23b5ded884a2e11b79df58e36eaa27d66dc0..d953c3fe998aa99c159bca641903c5e48a7e9d8f 100644 (file)
 
 #include "aacraid.h"
 
+#define AAC_NUM_IO_FIB_RKT      (246 - AAC_NUM_MGT_FIB)
+
+/**
+ *     aac_rkt_select_comm     -       Select communications method
+ *     @dev: Adapter
+ *     @comm: communications method
+ */
+
+static int aac_rkt_select_comm(struct aac_dev *dev, int comm)
+{
+       int retval;
+       extern int aac_rx_select_comm(struct aac_dev *dev, int comm);
+       retval = aac_rx_select_comm(dev, comm);
+       if (comm == AAC_COMM_MESSAGE) {
+               /*
+                * FIB Setup has already been done, but we can minimize the
+                * damage by at least ensuring the OS never issues more
+                * commands than we can handle. The Rocket adapters currently
+                * can only handle 246 commands and 8 AIFs at the same time,
+                * and in fact do notify us accordingly if we negotiate the
+                * FIB size. The problem that causes us to add this check is
+                * to ensure that we do not overdo it with the adapter when a
+                * hard coded FIB override is being utilized. This special
+                * case warrants this half baked, but convenient, check here.
+                */
+               if (dev->scsi_host_ptr->can_queue > AAC_NUM_IO_FIB_RKT) {
+                       dev->init->MaxIoCommands =
+                               cpu_to_le32(AAC_NUM_IO_FIB_RKT + AAC_NUM_MGT_FIB);
+                       dev->scsi_host_ptr->can_queue = AAC_NUM_IO_FIB_RKT;
+               }
+       }
+       return retval;
+}
+
 /**
  *     aac_rkt_ioremap
  *     @size: mapping resize request
@@ -63,39 +97,13 @@ static int aac_rkt_ioremap(struct aac_dev * dev, u32 size)
 
 int aac_rkt_init(struct aac_dev *dev)
 {
-       int retval;
        extern int _aac_rx_init(struct aac_dev *dev);
-       extern void aac_rx_start_adapter(struct aac_dev *dev);
 
        /*
         *      Fill in the function dispatch table.
         */
        dev->a_ops.adapter_ioremap = aac_rkt_ioremap;
+       dev->a_ops.adapter_comm = aac_rkt_select_comm;
 
-       retval = _aac_rx_init(dev);
-       if (retval)
-               return retval;
-       if (dev->new_comm_interface) {
-               /*
-                * FIB Setup has already been done, but we can minimize the
-                * damage by at least ensuring the OS never issues more
-                * commands than we can handle. The Rocket adapters currently
-                * can only handle 246 commands and 8 AIFs at the same time,
-                * and in fact do notify us accordingly if we negotiate the
-                * FIB size. The problem that causes us to add this check is
-                * to ensure that we do not overdo it with the adapter when a
-                * hard coded FIB override is being utilized. This special
-                * case warrants this half baked, but convenient, check here.
-                */
-               if (dev->scsi_host_ptr->can_queue > (246 - AAC_NUM_MGT_FIB)) {
-                       dev->init->MaxIoCommands = cpu_to_le32(246);
-                       dev->scsi_host_ptr->can_queue = 246 - AAC_NUM_MGT_FIB;
-               }
-       }
-       /*
-        *      Tell the adapter that all is configured, and it can start
-        *      accepting requests
-        */
-       aac_rx_start_adapter(dev);
-       return 0;
+       return _aac_rx_init(dev);
 }
index dcc8b0ea7a9d213b4605857c574702a059cbb869..d242e2611d672dc4df6a2a985187483cd99a2384 100644 (file)
@@ -31,7 +31,6 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/pci.h>
 #include <linux/spinlock.h>
 #include <linux/slab.h>
 
 #include "aacraid.h"
 
-static irqreturn_t aac_rx_intr(int irq, void *dev_id)
+static irqreturn_t aac_rx_intr_producer(int irq, void *dev_id)
 {
        struct aac_dev *dev = dev_id;
+       unsigned long bellbits;
+       u8 intstat = rx_readb(dev, MUnit.OISR);
 
-       dprintk((KERN_DEBUG "aac_rx_intr(%d,%p)\n", irq, dev_id));
-       if (dev->new_comm_interface) {
-               u32 Index = rx_readl(dev, MUnit.OutboundQueue);
-               if (Index == 0xFFFFFFFFL)
-                       Index = rx_readl(dev, MUnit.OutboundQueue);
-               if (Index != 0xFFFFFFFFL) {
-                       do {
-                               if (aac_intr_normal(dev, Index)) {
-                                       rx_writel(dev, MUnit.OutboundQueue, Index);
-                                       rx_writel(dev, MUnit.ODR, DoorBellAdapterNormRespReady);
-                               }
-                               Index = rx_readl(dev, MUnit.OutboundQueue);
-                       } while (Index != 0xFFFFFFFFL);
-                       return IRQ_HANDLED;
+       /*
+        *      Read mask and invert because drawbridge is reversed.
+        *      This allows us to only service interrupts that have
+        *      been enabled.
+        *      Check to see if this is our interrupt.  If it isn't just return
+        */
+       if (intstat & ~(dev->OIMR)) {
+               bellbits = rx_readl(dev, OutboundDoorbellReg);
+               if (bellbits & DoorBellPrintfReady) {
+                       aac_printf(dev, readl (&dev->IndexRegs->Mailbox[5]));
+                       rx_writel(dev, MUnit.ODR,DoorBellPrintfReady);
+                       rx_writel(dev, InboundDoorbellReg,DoorBellPrintfDone);
                }
-       } else {
-               unsigned long bellbits;
-               u8 intstat;
-               intstat = rx_readb(dev, MUnit.OISR);
-               /*
-                *      Read mask and invert because drawbridge is reversed.
-                *      This allows us to only service interrupts that have 
-                *      been enabled.
-                *      Check to see if this is our interrupt.  If it isn't just return
-                */
-               if (intstat & ~(dev->OIMR)) 
-               {
-                       bellbits = rx_readl(dev, OutboundDoorbellReg);
-                       if (bellbits & DoorBellPrintfReady) {
-                               aac_printf(dev, readl (&dev->IndexRegs->Mailbox[5]));
-                               rx_writel(dev, MUnit.ODR,DoorBellPrintfReady);
-                               rx_writel(dev, InboundDoorbellReg,DoorBellPrintfDone);
-                       }
-                       else if (bellbits & DoorBellAdapterNormCmdReady) {
-                               rx_writel(dev, MUnit.ODR, DoorBellAdapterNormCmdReady);
-                               aac_command_normal(&dev->queues->queue[HostNormCmdQueue]);
-                       }
-                       else if (bellbits & DoorBellAdapterNormRespReady) {
-                               rx_writel(dev, MUnit.ODR,DoorBellAdapterNormRespReady);
-                               aac_response_normal(&dev->queues->queue[HostNormRespQueue]);
-                       }
-                       else if (bellbits & DoorBellAdapterNormCmdNotFull) {
-                               rx_writel(dev, MUnit.ODR, DoorBellAdapterNormCmdNotFull);
-                       }
-                       else if (bellbits & DoorBellAdapterNormRespNotFull) {
-                               rx_writel(dev, MUnit.ODR, DoorBellAdapterNormCmdNotFull);
-                               rx_writel(dev, MUnit.ODR, DoorBellAdapterNormRespNotFull);
-                       }
-                       return IRQ_HANDLED;
+               else if (bellbits & DoorBellAdapterNormCmdReady) {
+                       rx_writel(dev, MUnit.ODR, DoorBellAdapterNormCmdReady);
+                       aac_command_normal(&dev->queues->queue[HostNormCmdQueue]);
+               }
+               else if (bellbits & DoorBellAdapterNormRespReady) {
+                       rx_writel(dev, MUnit.ODR,DoorBellAdapterNormRespReady);
+                       aac_response_normal(&dev->queues->queue[HostNormRespQueue]);
+               }
+               else if (bellbits & DoorBellAdapterNormCmdNotFull) {
+                       rx_writel(dev, MUnit.ODR, DoorBellAdapterNormCmdNotFull);
                }
+               else if (bellbits & DoorBellAdapterNormRespNotFull) {
+                       rx_writel(dev, MUnit.ODR, DoorBellAdapterNormCmdNotFull);
+                       rx_writel(dev, MUnit.ODR, DoorBellAdapterNormRespNotFull);
+               }
+               return IRQ_HANDLED;
+       }
+       return IRQ_NONE;
+}
+
+static irqreturn_t aac_rx_intr_message(int irq, void *dev_id)
+{
+       struct aac_dev *dev = dev_id;
+       u32 Index = rx_readl(dev, MUnit.OutboundQueue);
+       if (Index == 0xFFFFFFFFL)
+               Index = rx_readl(dev, MUnit.OutboundQueue);
+       if (Index != 0xFFFFFFFFL) {
+               do {
+                       if (aac_intr_normal(dev, Index)) {
+                               rx_writel(dev, MUnit.OutboundQueue, Index);
+                               rx_writel(dev, MUnit.ODR, DoorBellAdapterNormRespReady);
+                       }
+                       Index = rx_readl(dev, MUnit.OutboundQueue);
+               } while (Index != 0xFFFFFFFFL);
+               return IRQ_HANDLED;
        }
        return IRQ_NONE;
 }
@@ -114,6 +113,26 @@ static void aac_rx_disable_interrupt(struct aac_dev *dev)
        rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xff);
 }
 
+/**
+ *     aac_rx_enable_interrupt_producer        -       Enable interrupts
+ *     @dev: Adapter
+ */
+
+static void aac_rx_enable_interrupt_producer(struct aac_dev *dev)
+{
+       rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xfb);
+}
+
+/**
+ *     aac_rx_enable_interrupt_message -       Enable interrupts
+ *     @dev: Adapter
+ */
+
+static void aac_rx_enable_interrupt_message(struct aac_dev *dev)
+{
+       rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xf7);
+}
+
 /**
  *     rx_sync_cmd     -       send a command and wait
  *     @dev: Adapter
@@ -189,10 +208,7 @@ static int rx_sync_cmd(struct aac_dev *dev, u32 command,
                /*
                 *      Restore interrupt mask even though we timed out
                 */
-               if (dev->new_comm_interface)
-                       rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xf7);
-               else
-                       rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xfb);
+               aac_adapter_enable_int(dev);
                return -ETIMEDOUT;
        }
        /*
@@ -215,10 +231,7 @@ static int rx_sync_cmd(struct aac_dev *dev, u32 command,
        /*
         *      Restore interrupt mask
         */
-       if (dev->new_comm_interface)
-               rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xf7);
-       else
-               rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xfb);
+       aac_adapter_enable_int(dev);
        return 0;
 
 }
@@ -360,35 +373,72 @@ static int aac_rx_check_health(struct aac_dev *dev)
 }
 
 /**
- *     aac_rx_send
+ *     aac_rx_deliver_producer
  *     @fib: fib to issue
  *
  *     Will send a fib, returning 0 if successful.
  */
-static int aac_rx_send(struct fib * fib)
+static int aac_rx_deliver_producer(struct fib * fib)
 {
-       u64 addr = fib->hw_fib_pa;
        struct aac_dev *dev = fib->dev;
-       volatile void __iomem *device = dev->regs.rx;
+       struct aac_queue *q = &dev->queues->queue[AdapNormCmdQueue];
+       unsigned long qflags;
        u32 Index;
+       unsigned long nointr = 0;
 
-       dprintk((KERN_DEBUG "%p->aac_rx_send(%p->%llx)\n", dev, fib, addr));
-       Index = rx_readl(dev, MUnit.InboundQueue);
-       if (Index == 0xFFFFFFFFL)
+       spin_lock_irqsave(q->lock, qflags);
+       aac_queue_get( dev, &Index, AdapNormCmdQueue, fib->hw_fib, 1, fib, &nointr);
+
+       q->numpending++;
+       *(q->headers.producer) = cpu_to_le32(Index + 1);
+       spin_unlock_irqrestore(q->lock, qflags);
+       if (!(nointr & aac_config.irq_mod))
+               aac_adapter_notify(dev, AdapNormCmdQueue);
+
+       return 0;
+}
+
+/**
+ *     aac_rx_deliver_message
+ *     @fib: fib to issue
+ *
+ *     Will send a fib, returning 0 if successful.
+ */
+static int aac_rx_deliver_message(struct fib * fib)
+{
+       struct aac_dev *dev = fib->dev;
+       struct aac_queue *q = &dev->queues->queue[AdapNormCmdQueue];
+       unsigned long qflags;
+       u32 Index;
+       u64 addr;
+       volatile void __iomem *device;
+
+       unsigned long count = 10000000L; /* 50 seconds */
+       spin_lock_irqsave(q->lock, qflags);
+       q->numpending++;
+       spin_unlock_irqrestore(q->lock, qflags);
+       for(;;) {
                Index = rx_readl(dev, MUnit.InboundQueue);
-       dprintk((KERN_DEBUG "Index = 0x%x\n", Index));
-       if (Index == 0xFFFFFFFFL)
-               return Index;
+               if (Index == 0xFFFFFFFFL)
+                       Index = rx_readl(dev, MUnit.InboundQueue);
+               if (Index != 0xFFFFFFFFL)
+                       break;
+               if (--count == 0) {
+                       spin_lock_irqsave(q->lock, qflags);
+                       q->numpending--;
+                       spin_unlock_irqrestore(q->lock, qflags);
+                       return -ETIMEDOUT;
+               }
+               udelay(5);
+       }
        device = dev->base + Index;
-       dprintk((KERN_DEBUG "entry = %x %x %u\n", (u32)(addr & 0xffffffff),
-         (u32)(addr >> 32), (u32)le16_to_cpu(fib->hw_fib->header.Size)));
+       addr = fib->hw_fib_pa;
        writel((u32)(addr & 0xffffffff), device);
        device += sizeof(u32);
        writel((u32)(addr >> 32), device);
        device += sizeof(u32);
        writel(le16_to_cpu(fib->hw_fib->header.Size), device);
        rx_writel(dev, MUnit.InboundQueue, Index);
-       dprintk((KERN_DEBUG "aac_rx_send - return 0\n"));
        return 0;
 }
 
@@ -429,6 +479,31 @@ static int aac_rx_restart_adapter(struct aac_dev *dev)
        return 0;
 }
 
+/**
+ *     aac_rx_select_comm      -       Select communications method
+ *     @dev: Adapter
+ *     @comm: communications method
+ */
+
+int aac_rx_select_comm(struct aac_dev *dev, int comm)
+{
+       switch (comm) {
+       case AAC_COMM_PRODUCER:
+               dev->a_ops.adapter_enable_int = aac_rx_enable_interrupt_producer;
+               dev->a_ops.adapter_intr = aac_rx_intr_producer;
+               dev->a_ops.adapter_deliver = aac_rx_deliver_producer;
+               break;
+       case AAC_COMM_MESSAGE:
+               dev->a_ops.adapter_enable_int = aac_rx_enable_interrupt_message;
+               dev->a_ops.adapter_intr = aac_rx_intr_message;
+               dev->a_ops.adapter_deliver = aac_rx_deliver_message;
+               break;
+       default:
+               return 1;
+       }
+       return 0;
+}
+
 /**
  *     aac_rx_init     -       initialize an i960 based AAC card
  *     @dev: device to configure
@@ -489,40 +564,42 @@ int _aac_rx_init(struct aac_dev *dev)
                }
                msleep(1);
        }
-       if (request_irq(dev->scsi_host_ptr->irq, aac_rx_intr, IRQF_SHARED|IRQF_DISABLED, "aacraid", (void *)dev)<0)
-       {
-               printk(KERN_ERR "%s%d: Interrupt unavailable.\n", name, instance);
-               goto error_iounmap;
-       }
        /*
-        *      Fill in the function dispatch table.
+        *      Fill in the common function dispatch table.
         */
        dev->a_ops.adapter_interrupt = aac_rx_interrupt_adapter;
        dev->a_ops.adapter_disable_int = aac_rx_disable_interrupt;
        dev->a_ops.adapter_notify = aac_rx_notify_adapter;
        dev->a_ops.adapter_sync_cmd = rx_sync_cmd;
        dev->a_ops.adapter_check_health = aac_rx_check_health;
-       dev->a_ops.adapter_send = aac_rx_send;
 
        /*
         *      First clear out all interrupts.  Then enable the one's that we
         *      can handle.
         */
-       rx_writeb(dev, MUnit.OIMR, 0xff);
+       aac_adapter_comm(dev, AAC_COMM_PRODUCER);
+       aac_adapter_disable_int(dev);
        rx_writel(dev, MUnit.ODR, 0xffffffff);
-       rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xfb);
+       aac_adapter_enable_int(dev);
 
        if (aac_init_adapter(dev) == NULL)
-               goto error_irq;
-       if (dev->new_comm_interface)
-               rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xf7);
+               goto error_iounmap;
+       aac_adapter_comm(dev, dev->comm_interface);
+       if (request_irq(dev->scsi_host_ptr->irq, dev->a_ops.adapter_intr,
+                       IRQF_SHARED|IRQF_DISABLED, "aacraid", dev) < 0) {
+               printk(KERN_ERR "%s%d: Interrupt unavailable.\n",
+                       name, instance);
+               goto error_iounmap;
+       }
+       aac_adapter_enable_int(dev);
+       /*
+        *      Tell the adapter that all is configured, and it can
+        * start accepting requests
+        */
+       aac_rx_start_adapter(dev);
 
        return 0;
 
-error_irq:
-       rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xff);
-       free_irq(dev->scsi_host_ptr->irq, (void *)dev);
-
 error_iounmap:
 
        return -1;
@@ -530,20 +607,11 @@ error_iounmap:
 
 int aac_rx_init(struct aac_dev *dev)
 {
-       int retval;
-
        /*
         *      Fill in the function dispatch table.
         */
        dev->a_ops.adapter_ioremap = aac_rx_ioremap;
+       dev->a_ops.adapter_comm = aac_rx_select_comm;
 
-       retval = _aac_rx_init(dev);
-       if (!retval) {
-               /*
-                *      Tell the adapter that all is configured, and it can
-                * start accepting requests
-                */
-               aac_rx_start_adapter(dev);
-       }
-       return retval;
+       return _aac_rx_init(dev);
 }
index 511b0a938fb18b4ebcd488b1fe5087e385bc0cdd..6f1a1780efce4e8e4a4a2f82564e81f498ad299f 100644 (file)
@@ -31,7 +31,6 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/pci.h>
 #include <linux/spinlock.h>
 #include <linux/slab.h>
@@ -91,6 +90,17 @@ static void aac_sa_disable_interrupt (struct aac_dev *dev)
        sa_writew(dev, SaDbCSR.PRISETIRQMASK, 0xffff);
 }
 
+/**
+ *     aac_sa_enable_interrupt -       enable interrupt
+ *     @dev: Which adapter to enable.
+ */
+
+static void aac_sa_enable_interrupt (struct aac_dev *dev)
+{
+       sa_writew(dev, SaDbCSR.PRICLEARIRQMASK, (PrintfReady | DOORBELL_1 |
+                               DOORBELL_2 | DOORBELL_3 | DOORBELL_4));
+}
+
 /**
  *     aac_sa_notify_adapter           -       handle adapter notification
  *     @dev:   Adapter that notification is for
@@ -347,32 +357,36 @@ int aac_sa_init(struct aac_dev *dev)
                msleep(1);
        }
 
-       if (request_irq(dev->scsi_host_ptr->irq, aac_sa_intr, IRQF_SHARED|IRQF_DISABLED, "aacraid", (void *)dev ) < 0) {
-               printk(KERN_WARNING "%s%d: Interrupt unavailable.\n", name, instance);
-               goto error_iounmap;
-       }
-
        /*
         *      Fill in the function dispatch table.
         */
 
        dev->a_ops.adapter_interrupt = aac_sa_interrupt_adapter;
        dev->a_ops.adapter_disable_int = aac_sa_disable_interrupt;
+       dev->a_ops.adapter_enable_int = aac_sa_enable_interrupt;
        dev->a_ops.adapter_notify = aac_sa_notify_adapter;
        dev->a_ops.adapter_sync_cmd = sa_sync_cmd;
        dev->a_ops.adapter_check_health = aac_sa_check_health;
+       dev->a_ops.adapter_intr = aac_sa_intr;
        dev->a_ops.adapter_ioremap = aac_sa_ioremap;
 
        /*
         *      First clear out all interrupts.  Then enable the one's that 
         *      we can handle.
         */
-       sa_writew(dev, SaDbCSR.PRISETIRQMASK, 0xffff);
-       sa_writew(dev, SaDbCSR.PRICLEARIRQMASK, (PrintfReady | DOORBELL_1 | 
-                               DOORBELL_2 | DOORBELL_3 | DOORBELL_4));
+       aac_adapter_disable_int(dev);
+       aac_adapter_enable_int(dev);
 
        if(aac_init_adapter(dev) == NULL)
                goto error_irq;
+       if (request_irq(dev->scsi_host_ptr->irq, dev->a_ops.adapter_intr,
+                       IRQF_SHARED|IRQF_DISABLED,
+                       "aacraid", (void *)dev ) < 0) {
+               printk(KERN_WARNING "%s%d: Interrupt unavailable.\n",
+                       name, instance);
+               goto error_iounmap;
+       }
+       aac_adapter_enable_int(dev);
 
        /*
         *      Tell the adapter that all is configure, and it can start 
@@ -382,7 +396,7 @@ int aac_sa_init(struct aac_dev *dev)
        return 0;
 
 error_irq:
-       sa_writew(dev, SaDbCSR.PRISETIRQMASK, 0xffff);
+       aac_sa_disable_interrupt(dev);
        free_irq(dev->scsi_host_ptr->irq, (void *)dev);
 
 error_iounmap:
index 306bec355e45c9abc80b03631c23c64616983346..9b3303b64113780b6eff7abfc296b30036fb2b84 100644 (file)
@@ -4403,7 +4403,7 @@ advansys_detect(struct scsi_host_template *tpnt)
                         ASC_DBG1(1,
                                 "advansys_detect: probing I/O port 0x%x...\n",
                             iop);
-                        if (check_region(iop, ASC_IOADR_GAP) != 0) {
+                       if (!request_region(iop, ASC_IOADR_GAP, "advansys")){
                             printk(
 "AdvanSys SCSI: specified I/O Port 0x%X is busy\n", iop);
                             /* Don't try this I/O port twice. */
@@ -4413,6 +4413,7 @@ advansys_detect(struct scsi_host_template *tpnt)
                             printk(
 "AdvanSys SCSI: specified I/O Port 0x%X has no adapter\n", iop);
                             /* Don't try this I/O port twice. */
+                           release_region(iop, ASC_IOADR_GAP);
                             asc_ioport[ioport] = 0;
                             goto ioport_try_again;
                         } else {
@@ -4431,6 +4432,7 @@ advansys_detect(struct scsi_host_template *tpnt)
                                   * 'ioport' past this board.
                                   */
                                  ioport++;
+                                release_region(iop, ASC_IOADR_GAP);
                                  goto ioport_try_again;
                             }
                         }
@@ -9740,13 +9742,14 @@ AscSearchIOPortAddr11(
     }
     for (; i < ASC_IOADR_TABLE_MAX_IX; i++) {
         iop_base = _asc_def_iop_base[i];
-        if (check_region(iop_base, ASC_IOADR_GAP) != 0) {
+       if (!request_region(iop_base, ASC_IOADR_GAP, "advansys")){
             ASC_DBG1(1,
                "AscSearchIOPortAddr11: check_region() failed I/O port 0x%x\n",
                      iop_base);
             continue;
         }
         ASC_DBG1(1, "AscSearchIOPortAddr11: probing I/O port 0x%x\n", iop_base);
+       release_region(iop_base, ASC_IOADR_GAP);
         if (AscFindSignature(iop_base)) {
             return (iop_base);
         }
index 0cec742d12e9dc52bf4f895d2a20ec1feece0cae..4b4d1233ce8a95e60e885b9575b505dc4f34d9e1 100644 (file)
  **************************************************************************/
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <asm/irq.h>
 #include <linux/io.h>
 #include <linux/blkdev.h>
index 170a4344cbb2a62ee9446dd57e40339a1b7d98ff..27adbb294ac1db21cc0b962714f29020a89805bb 100644 (file)
@@ -1337,9 +1337,6 @@ int       ahd_pci_test_register_access(struct ahd_softc *);
 /************************** SCB and SCB queue management **********************/
 void           ahd_qinfifo_requeue_tail(struct ahd_softc *ahd,
                                         struct scb *scb);
-int            ahd_match_scb(struct ahd_softc *ahd, struct scb *scb,
-                             int target, char channel, int lun,
-                             u_int tag, role_t role);
 
 /****************************** Initialization ********************************/
 struct ahd_softc       *ahd_alloc(void *platform_arg, char *name);
index 07a86a30f676c4d2c64afec835ce44f01201a697..9ddc6e4a74b040d497620675f0cd5dfcf7256078 100644 (file)
@@ -262,6 +262,9 @@ static void         ahd_update_coalescing_values(struct ahd_softc *ahd,
                                                     u_int mincmds);
 static int             ahd_verify_vpd_cksum(struct vpd_config *vpd);
 static int             ahd_wait_seeprom(struct ahd_softc *ahd);
+static int             ahd_match_scb(struct ahd_softc *ahd, struct scb *scb,
+                                     int target, char channel, int lun,
+                                     u_int tag, role_t role);
 
 /******************************** Private Inlines *****************************/
 
@@ -7256,7 +7259,7 @@ ahd_busy_tcl(struct ahd_softc *ahd, u_int tcl, u_int scbid)
 }
 
 /************************** SCB and SCB queue management **********************/
-int
+static int
 ahd_match_scb(struct ahd_softc *ahd, struct scb *scb, int target,
              char channel, int lun, u_int tag, role_t role)
 {
index 9bfcca5ede088c0c78a8645525376e3b1cf0eb45..c7fe478f481377d4b7add47574c6c3463dbd7b7a 100644 (file)
@@ -1126,15 +1126,6 @@ ahd_linux_register_host(struct ahd_softc *ahd, struct scsi_host_template *templa
        return 0;
 }
 
-uint64_t
-ahd_linux_get_memsize(void)
-{
-       struct sysinfo si;
-
-       si_meminfo(&si);
-       return ((uint64_t)si.totalram << PAGE_SHIFT);
-}
-
 /*
  * Place the SCSI bus into a known state by either resetting it,
  * or forcing transfer negotiations on the next command to any
index 3a67fc578d78051f6f43b4643e26e54eb4b356b2..147c83c456a57cdfbd20206dba14c50b8c68daa3 100644 (file)
@@ -496,8 +496,6 @@ ahd_insb(struct ahd_softc * ahd, long port, uint8_t *array, int count)
 int            ahd_linux_register_host(struct ahd_softc *,
                                        struct scsi_host_template *);
 
-uint64_t       ahd_linux_get_memsize(void);
-
 /*************************** Pretty Printing **********************************/
 struct info_str {
        char *buffer;
index 1a3ab6aa856bb158e79574a4856e8374bbeb5127..c62ce41f2793750627130b0367547e3cf6fab736 100644 (file)
@@ -132,6 +132,7 @@ ahd_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        struct           ahd_pci_identity *entry;
        char            *name;
        int              error;
+       struct device   *dev = &pdev->dev;
 
        pci = pdev;
        entry = ahd_find_pci_device(pci);
@@ -161,20 +162,18 @@ ahd_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        pci_set_master(pdev);
 
        if (sizeof(dma_addr_t) > 4) {
-               uint64_t   memsize;
-               const uint64_t mask_39bit = 0x7FFFFFFFFFULL;
+               const u64 required_mask = dma_get_required_mask(dev);
 
-               memsize = ahd_linux_get_memsize();
-
-               if (memsize >= 0x8000000000ULL
-                && pci_set_dma_mask(pdev, DMA_64BIT_MASK) == 0) {
+               if (required_mask > DMA_39BIT_MASK &&
+                   dma_set_mask(dev, DMA_64BIT_MASK) == 0)
                        ahd->flags |= AHD_64BIT_ADDRESSING;
-               } else if (memsize > 0x80000000
-                       && pci_set_dma_mask(pdev, mask_39bit) == 0) {
+               else if (required_mask > DMA_32BIT_MASK &&
+                        dma_set_mask(dev, DMA_39BIT_MASK) == 0)
                        ahd->flags |= AHD_39BIT_ADDRESSING;
-               }
+               else
+                       dma_set_mask(dev, DMA_32BIT_MASK);
        } else {
-               pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+               dma_set_mask(dev, DMA_32BIT_MASK);
        }
        ahd->dev_softc = pci;
        error = ahd_pci_config(ahd, entry);
index 2cf7bb3123f099c732ba665c514b085ee0eb60e1..8d72bbae96ad1a59a3777b662d8e47b640abc0c1 100644 (file)
@@ -88,7 +88,7 @@ ahd_compose_id(u_int device, u_int vendor, u_int subdevice, u_int subvendor)
 
 #define SUBID_9005_LEGACYCONN_FUNC(id) ((id) & 0x20)
 
-#define SUBID_9005_SEEPTYPE(id) ((id) & 0x0C0) >> 6)
+#define SUBID_9005_SEEPTYPE(id) (((id) & 0x0C0) >> 6)
 #define                SUBID_9005_SEEPTYPE_NONE        0x0
 #define                SUBID_9005_SEEPTYPE_4K          0x1
 
index 7d1fec620948bd11f1c90c043fbb88b450a5b6e1..a988d5abf7022eb8b8bac46785798ffedf3eff1a 100644 (file)
 #include <linux/kernel.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
-#include <linux/sched.h>
 #include <linux/pci.h>
 #include <linux/proc_fs.h>
 #include <linux/blkdev.h>
index 6f8901b748f737c676d0c22226f06117e09a545e..c520e5b41fb52288982d73ac2ce46362407938d5 100644 (file)
 
 static inline int asd_get_ddb(struct asd_ha_struct *asd_ha)
 {
-       unsigned long flags;
        int ddb, i;
 
-       spin_lock_irqsave(&asd_ha->hw_prof.ddb_lock, flags);
        ddb = FIND_FREE_DDB(asd_ha);
        if (ddb >= asd_ha->hw_prof.max_ddbs) {
                ddb = -ENOMEM;
-               spin_unlock_irqrestore(&asd_ha->hw_prof.ddb_lock, flags);
                goto out;
        }
        SET_DDB(ddb, asd_ha);
-       spin_unlock_irqrestore(&asd_ha->hw_prof.ddb_lock, flags);
 
        for (i = 0; i < sizeof(struct asd_ddb_ssp_smp_target_port); i+= 4)
                asd_ddbsite_write_dword(asd_ha, ddb, i, 0);
@@ -77,14 +73,10 @@ out:
 
 static inline void asd_free_ddb(struct asd_ha_struct *asd_ha, int ddb)
 {
-       unsigned long flags;
-
        if (!ddb || ddb >= 0xFFFF)
                return;
        asd_ddbsite_write_byte(asd_ha, ddb, DDB_TYPE, DDB_TYPE_UNUSED);
-       spin_lock_irqsave(&asd_ha->hw_prof.ddb_lock, flags);
        CLEAR_DDB(ddb, asd_ha);
-       spin_unlock_irqrestore(&asd_ha->hw_prof.ddb_lock, flags);
 }
 
 static inline void asd_set_ddb_type(struct domain_device *dev)
@@ -320,8 +312,11 @@ out:
 
 int asd_dev_found(struct domain_device *dev)
 {
+       unsigned long flags;
        int res = 0;
+       struct asd_ha_struct *asd_ha = dev->port->ha->lldd_ha;
 
+       spin_lock_irqsave(&asd_ha->hw_prof.ddb_lock, flags);
        switch (dev->dev_type) {
        case SATA_PM:
                res = asd_init_sata_pm_ddb(dev);
@@ -335,14 +330,18 @@ int asd_dev_found(struct domain_device *dev)
                else
                        res = asd_init_initiator_ddb(dev);
        }
+       spin_unlock_irqrestore(&asd_ha->hw_prof.ddb_lock, flags);
+
        return res;
 }
 
 void asd_dev_gone(struct domain_device *dev)
 {
        int ddb, sister_ddb;
+       unsigned long flags;
        struct asd_ha_struct *asd_ha = dev->port->ha->lldd_ha;
 
+       spin_lock_irqsave(&asd_ha->hw_prof.ddb_lock, flags);
        ddb = (int) (unsigned long) dev->lldd_dev;
        sister_ddb = asd_ddbsite_read_word(asd_ha, ddb, SISTER_DDB);
 
@@ -350,4 +349,5 @@ void asd_dev_gone(struct domain_device *dev)
                asd_free_ddb(asd_ha, sister_ddb);
        asd_free_ddb(asd_ha, ddb);
        dev->lldd_dev = NULL;
+       spin_unlock_irqrestore(&asd_ha->hw_prof.ddb_lock, flags);
 }
index e6ade5996d9592ebaf5ab6454d59aac8cfb965a9..6bd8e3059d27d8a551b823c7dc54007f956d3380 100644 (file)
@@ -556,7 +556,7 @@ static void asd_dump_lseq_state(struct asd_ha_struct *asd_ha, int lseq)
        PRINT_LMIP_word(asd_ha, lseq, Q_TGTXFR_TAIL);
        PRINT_LMIP_byte(asd_ha, lseq, LINK_NUMBER);
        PRINT_LMIP_byte(asd_ha, lseq, SCRATCH_FLAGS);
-       PRINT_LMIP_qword(asd_ha, lseq, CONNECTION_STATE);
+       PRINT_LMIP_dword(asd_ha, lseq, CONNECTION_STATE);
        PRINT_LMIP_word(asd_ha, lseq, CONCTL);
        PRINT_LMIP_byte(asd_ha, lseq, CONSTAT);
        PRINT_LMIP_byte(asd_ha, lseq, CONNECTION_MODES);
index da94e126ca832d5e4d157c65c3b34acaab20620c..0cd7eed9196c44eec8065fd71be58d9c2359af0c 100644 (file)
@@ -1052,10 +1052,9 @@ static inline struct asd_ascb *asd_ascb_alloc(struct asd_ha_struct *asd_ha,
        struct asd_ascb *ascb;
        unsigned long flags;
 
-       ascb = kmem_cache_alloc(asd_ascb_cache, gfp_flags);
+       ascb = kmem_cache_zalloc(asd_ascb_cache, gfp_flags);
 
        if (ascb) {
-               memset(ascb, 0, sizeof(*ascb));
                ascb->dma_scb.size = sizeof(struct scb);
                ascb->dma_scb.vaddr = dma_pool_alloc(asd_ha->scb_pool,
                                                     gfp_flags,
index fbc82b00a418cf8ff6d43603a36ca75f2a83fa81..27852b43b9044a829ffc2d3c4bc3ff5fe09885a4 100644 (file)
@@ -38,7 +38,7 @@
 #include "aic94xx_seq.h"
 
 /* The format is "version.release.patchlevel" */
-#define ASD_DRIVER_VERSION "1.0.2"
+#define ASD_DRIVER_VERSION "1.0.3"
 
 static int use_msi = 0;
 module_param_named(use_msi, use_msi, int, S_IRUGO);
@@ -57,6 +57,8 @@ MODULE_PARM_DESC(collector, "\n"
 char sas_addr_str[2*SAS_ADDR_SIZE + 1] = "";
 
 static struct scsi_transport_template *aic94xx_transport_template;
+static int asd_scan_finished(struct Scsi_Host *, unsigned long);
+static void asd_scan_start(struct Scsi_Host *);
 
 static struct scsi_host_template aic94xx_sht = {
        .module                 = THIS_MODULE,
@@ -66,6 +68,8 @@ static struct scsi_host_template aic94xx_sht = {
        .target_alloc           = sas_target_alloc,
        .slave_configure        = sas_slave_configure,
        .slave_destroy          = sas_slave_destroy,
+       .scan_finished          = asd_scan_finished,
+       .scan_start             = asd_scan_start,
        .change_queue_depth     = sas_change_queue_depth,
        .change_queue_type      = sas_change_queue_type,
        .bios_param             = sas_bios_param,
@@ -75,6 +79,8 @@ static struct scsi_host_template aic94xx_sht = {
        .sg_tablesize           = SG_ALL,
        .max_sectors            = SCSI_DEFAULT_MAX_SECTORS,
        .use_clustering         = ENABLE_CLUSTERING,
+       .eh_device_reset_handler        = sas_eh_device_reset_handler,
+       .eh_bus_reset_handler   = sas_eh_bus_reset_handler,
 };
 
 static int __devinit asd_map_memio(struct asd_ha_struct *asd_ha)
@@ -234,7 +240,7 @@ static int __devinit asd_common_setup(struct asd_ha_struct *asd_ha)
        }
        /* Provide some sane default values. */
        asd_ha->hw_prof.max_scbs = 512;
-       asd_ha->hw_prof.max_ddbs = 128;
+       asd_ha->hw_prof.max_ddbs = ASD_MAX_DDBS;
        asd_ha->hw_prof.num_phys = ASD_MAX_PHYS;
        /* All phys are enabled, by default. */
        asd_ha->hw_prof.enabled_phys = 0xFF;
@@ -526,6 +532,7 @@ static int asd_register_sas_ha(struct asd_ha_struct *asd_ha)
        asd_ha->sas_ha.num_phys= ASD_MAX_PHYS;
 
        asd_ha->sas_ha.lldd_queue_size = asd_ha->seq.can_queue;
+       asd_ha->sas_ha.lldd_max_execute_num = lldd_max_execute_num;
 
        return sas_register_ha(&asd_ha->sas_ha);
 }
@@ -646,7 +653,7 @@ static int __devinit asd_pci_probe(struct pci_dev *dev,
        if (use_msi)
                pci_enable_msi(asd_ha->pcidev);
 
-       err = request_irq(asd_ha->pcidev->irq, asd_hw_isr, SA_SHIRQ,
+       err = request_irq(asd_ha->pcidev->irq, asd_hw_isr, IRQF_SHARED,
                          ASD_DRIVER_NAME, asd_ha);
        if (err) {
                asd_printk("couldn't get irq %d for %s\n",
@@ -671,21 +678,10 @@ static int __devinit asd_pci_probe(struct pci_dev *dev,
        if (err)
                goto Err_reg_sas;
 
-       err = asd_enable_phys(asd_ha, asd_ha->hw_prof.enabled_phys);
-       if (err) {
-               asd_printk("coudln't enable phys, err:%d\n", err);
-               goto Err_en_phys;
-       }
-       ASD_DPRINTK("enabled phys\n");
-       /* give the phy enabling interrupt event time to come in (1s
-        * is empirically about all it takes) */
-       ssleep(1);
-       /* Wait for discovery to finish */
-       scsi_flush_work(asd_ha->sas_ha.core.shost);
+       scsi_scan_host(shost);
 
        return 0;
-Err_en_phys:
-       asd_unregister_sas_ha(asd_ha);
+
 Err_reg_sas:
        asd_remove_dev_attrs(asd_ha);
 Err_dev_attrs:
@@ -778,6 +774,28 @@ static void __devexit asd_pci_remove(struct pci_dev *dev)
        return;
 }
 
+static void asd_scan_start(struct Scsi_Host *shost)
+{
+       struct asd_ha_struct *asd_ha;
+       int err;
+
+       asd_ha = SHOST_TO_SAS_HA(shost)->lldd_ha;
+       err = asd_enable_phys(asd_ha, asd_ha->hw_prof.enabled_phys);
+       if (err)
+               asd_printk("Couldn't enable phys, err:%d\n", err);
+}
+
+static int asd_scan_finished(struct Scsi_Host *shost, unsigned long time)
+{
+       /* give the phy enabling interrupt event time to come in (1s
+        * is empirically about all it takes) */
+       if (time < HZ)
+               return 0;
+       /* Wait for discovery to finish */
+       scsi_flush_work(shost);
+       return 1;
+}
+
 static ssize_t asd_version_show(struct device_driver *driver, char *buf)
 {
        return snprintf(buf, PAGE_SIZE, "%s\n", ASD_DRIVER_VERSION);
@@ -885,6 +903,7 @@ static void __exit aic94xx_exit(void)
        asd_remove_driver_attrs(&aic94xx_pci_driver.driver);
        pci_unregister_driver(&aic94xx_pci_driver);
        sas_release_transport(aic94xx_transport_template);
+       asd_release_firmware();
        asd_destroy_global_caches();
        asd_printk("%s version %s unloaded\n", ASD_DRIVER_DESCRIPTION,
                   ASD_DRIVER_VERSION);
index a11f4e6d8bd93698260a7c574deda49bfb325d5e..a43e8cdf4ee4fce658899fc5713a1d77219412b4 100644 (file)
 #define LmSEQ_SAS_RESET_MODE(LinkNum)          (LmSCRATCH(LinkNum) + 0x0074)
 #define LmSEQ_LINK_RESET_RETRY_COUNT(LinkNum)  (LmSCRATCH(LinkNum) + 0x0075)
 #define LmSEQ_NUM_LINK_RESET_RETRIES(LinkNum)  (LmSCRATCH(LinkNum) + 0x0076)
-#define LmSEQ_OOB_INT_ENABLES(LinkNum)         (LmSCRATCH(LinkNum) + 0x007A)
+#define LmSEQ_OOB_INT_ENABLES(LinkNum)         (LmSCRATCH(LinkNum) + 0x0078)
+#define LmSEQ_NOTIFY_TIMER_DOWN_COUNT(LinkNum) (LmSCRATCH(LinkNum) + 0x007A)
 #define LmSEQ_NOTIFY_TIMER_TIMEOUT(LinkNum)    (LmSCRATCH(LinkNum) + 0x007C)
-#define LmSEQ_NOTIFY_TIMER_DOWN_COUNT(LinkNum) (LmSCRATCH(LinkNum) + 0x007E)
+#define LmSEQ_NOTIFY_TIMER_INITIAL_COUNT(LinkNum) (LmSCRATCH(LinkNum) + 0x007E)
 
 /* Mode dependent scratch page 1, mode 0 and mode 1 */
 #define LmSEQ_SG_LIST_PTR_ADDR0(LinkNum)        (LmSCRATCH(LinkNum) + 0x0020)
index 9050e93bfd5e9be8bf9dbe49843b71315058c1d3..fa7c5290257d708f52ba5b1053bd3d8412c2a21b 100644 (file)
@@ -34,6 +34,7 @@
  * domain that this sequencer can maintain low-level connections for
  * us.  They are be 64 bytes.
  */
+#define ASD_MAX_DDBS   128
 
 struct asd_ddb_ssp_smp_target_port {
        u8     conn_type;         /* byte 0 */
index 75ed6b0569d1ad9243e8be51e265f7df144abbd6..8f43ff772f2378290d99af151a409b7dd19d6792 100644 (file)
@@ -413,40 +413,6 @@ void asd_invalidate_edb(struct asd_ascb *ascb, int edb_id)
        }
 }
 
-/* hard reset a phy later */
-static void do_phy_reset_later(struct work_struct *work)
-{
-       struct sas_phy *sas_phy =
-               container_of(work, struct sas_phy, reset_work);
-       int error;
-
-       ASD_DPRINTK("%s: About to hard reset phy %d\n", __FUNCTION__,
-                   sas_phy->identify.phy_identifier);
-       /* Reset device port */
-       error = sas_phy_reset(sas_phy, 1);
-       if (error)
-               ASD_DPRINTK("%s: Hard reset of phy %d failed (%d).\n",
-                           __FUNCTION__, sas_phy->identify.phy_identifier, error);
-}
-
-static void phy_reset_later(struct sas_phy *sas_phy, struct Scsi_Host *shost)
-{
-       INIT_WORK(&sas_phy->reset_work, do_phy_reset_later);
-       queue_work(shost->work_q, &sas_phy->reset_work);
-}
-
-/* start up the ABORT TASK tmf... */
-static void task_kill_later(struct asd_ascb *ascb)
-{
-       struct asd_ha_struct *asd_ha = ascb->ha;
-       struct sas_ha_struct *sas_ha = &asd_ha->sas_ha;
-       struct Scsi_Host *shost = sas_ha->core.shost;
-       struct sas_task *task = ascb->uldd_task;
-
-       INIT_WORK(&task->abort_work, sas_task_abort);
-       queue_work(shost->work_q, &task->abort_work);
-}
-
 static void escb_tasklet_complete(struct asd_ascb *ascb,
                                  struct done_list_struct *dl)
 {
@@ -479,26 +445,55 @@ static void escb_tasklet_complete(struct asd_ascb *ascb,
        case REQ_TASK_ABORT: {
                struct asd_ascb *a, *b;
                u16 tc_abort;
+               struct domain_device *failed_dev = NULL;
+
+               ASD_DPRINTK("%s: REQ_TASK_ABORT, reason=0x%X\n",
+                           __FUNCTION__, dl->status_block[3]);
 
+               /*
+                * Find the task that caused the abort and abort it first.
+                * The sequencer won't put anything on the done list until
+                * that happens.
+                */
                tc_abort = *((u16*)(&dl->status_block[1]));
                tc_abort = le16_to_cpu(tc_abort);
 
-               ASD_DPRINTK("%s: REQ_TASK_ABORT, reason=0x%X\n",
-                           __FUNCTION__, dl->status_block[3]);
+               list_for_each_entry_safe(a, b, &asd_ha->seq.pend_q, list) {
+                       struct sas_task *task = ascb->uldd_task;
 
-               /* Find the pending task and abort it. */
-               list_for_each_entry_safe(a, b, &asd_ha->seq.pend_q, list)
-                       if (a->tc_index == tc_abort) {
-                               task_kill_later(a);
+                       if (task && a->tc_index == tc_abort) {
+                               failed_dev = task->dev;
+                               sas_task_abort(task);
                                break;
                        }
+               }
+
+               if (!failed_dev) {
+                       ASD_DPRINTK("%s: Can't find task (tc=%d) to abort!\n",
+                                   __FUNCTION__, tc_abort);
+                       goto out;
+               }
+
+               /*
+                * Now abort everything else for that device (hba?) so
+                * that the EH will wake up and do something.
+                */
+               list_for_each_entry_safe(a, b, &asd_ha->seq.pend_q, list) {
+                       struct sas_task *task = ascb->uldd_task;
+
+                       if (task &&
+                           task->dev == failed_dev &&
+                           a->tc_index != tc_abort)
+                               sas_task_abort(task);
+               }
+
                goto out;
        }
        case REQ_DEVICE_RESET: {
-               struct Scsi_Host *shost = sas_ha->core.shost;
-               struct sas_phy *dev_phy;
                struct asd_ascb *a;
                u16 conn_handle;
+               unsigned long flags;
+               struct sas_task *last_dev_task = NULL;
 
                conn_handle = *((u16*)(&dl->status_block[1]));
                conn_handle = le16_to_cpu(conn_handle);
@@ -506,32 +501,47 @@ static void escb_tasklet_complete(struct asd_ascb *ascb,
                ASD_DPRINTK("%s: REQ_DEVICE_RESET, reason=0x%X\n", __FUNCTION__,
                            dl->status_block[3]);
 
-               /* Kill all pending tasks and reset the device */
-               dev_phy = NULL;
+               /* Find the last pending task for the device... */
                list_for_each_entry(a, &asd_ha->seq.pend_q, list) {
-                       struct sas_task *task;
-                       struct domain_device *dev;
                        u16 x;
+                       struct domain_device *dev;
+                       struct sas_task *task = a->uldd_task;
 
-                       task = a->uldd_task;
                        if (!task)
                                continue;
                        dev = task->dev;
 
                        x = (unsigned long)dev->lldd_dev;
-                       if (x == conn_handle) {
-                               dev_phy = dev->port->phy;
-                               task_kill_later(a);
-                       }
+                       if (x == conn_handle)
+                               last_dev_task = task;
                }
 
-               /* Reset device port */
-               if (!dev_phy) {
-                       ASD_DPRINTK("%s: No pending commands; can't reset.\n",
-                                   __FUNCTION__);
+               if (!last_dev_task) {
+                       ASD_DPRINTK("%s: Device reset for idle device %d?\n",
+                                   __FUNCTION__, conn_handle);
                        goto out;
                }
-               phy_reset_later(dev_phy, shost);
+
+               /* ...and set the reset flag */
+               spin_lock_irqsave(&last_dev_task->task_state_lock, flags);
+               last_dev_task->task_state_flags |= SAS_TASK_NEED_DEV_RESET;
+               spin_unlock_irqrestore(&last_dev_task->task_state_lock, flags);
+
+               /* Kill all pending tasks for the device */
+               list_for_each_entry(a, &asd_ha->seq.pend_q, list) {
+                       u16 x;
+                       struct domain_device *dev;
+                       struct sas_task *task = a->uldd_task;
+
+                       if (!task)
+                               continue;
+                       dev = task->dev;
+
+                       x = (unsigned long)dev->lldd_dev;
+                       if (x == conn_handle)
+                               sas_task_abort(task);
+               }
+
                goto out;
        }
        case SIGNAL_NCQ_ERROR:
index e5a0ec37e9544caf9703be97d618e7ab2a7c23be..5b0932f6147389c5c0919a799036b75b2b69b3ed 100644 (file)
@@ -427,7 +427,7 @@ struct asd_manuf_sec {
 
 struct asd_manuf_phy_desc {
        u8    state;         /* low 4 bits */
-#define MS_PHY_STATE_ENABLEABLE 0
+#define MS_PHY_STATE_ENABLED    0
 #define MS_PHY_STATE_REPORTED   1
 #define MS_PHY_STATE_HIDDEN     2
        u8    phy_id;
@@ -756,11 +756,11 @@ static void *asd_find_ll_by_id(void * const start, const u8 id0, const u8 id1)
  *
  * HIDDEN phys do not count in the total count.  REPORTED phys cannot
  * be enabled but are reported and counted towards the total.
- * ENEBLEABLE phys are enabled by default and count towards the total.
+ * ENABLED phys are enabled by default and count towards the total.
  * The absolute total phy number is ASD_MAX_PHYS.  hw_prof->num_phys
  * merely specifies the number of phys the host adapter decided to
  * report.  E.g., it is possible for phys 0, 1 and 2 to be HIDDEN,
- * phys 3, 4 and 5 to be REPORTED and phys 6 and 7 to be ENEBLEABLE.
+ * phys 3, 4 and 5 to be REPORTED and phys 6 and 7 to be ENABLED.
  * In this case ASD_MAX_PHYS is 8, hw_prof->num_phys is 5, and only 2
  * are actually enabled (enabled by default, max number of phys
  * enableable in this case).
@@ -816,8 +816,8 @@ static int asd_ms_get_phy_params(struct asd_ha_struct *asd_ha,
                        asd_ha->hw_prof.enabled_phys &= ~(1 << i);
                        rep_phys++;
                        continue;
-               case MS_PHY_STATE_ENABLEABLE:
-                       ASD_DPRINTK("ms: phy%d: ENEBLEABLE\n", i);
+               case MS_PHY_STATE_ENABLED:
+                       ASD_DPRINTK("ms: phy%d: ENABLED\n", i);
                        asd_ha->hw_prof.enabled_phys |= (1 << i);
                        en_phys++;
                        break;
index 845112539d05bd02617e3abae81e83a80ab75a35..eae7a247becebf8d6f512dcd7fba384aa5aa7957 100644 (file)
@@ -810,6 +810,8 @@ static void asd_init_lseq_mdp(struct asd_ha_struct *asd_ha,  int lseq)
        /* No delay for the first NOTIFY to be sent to the attached target. */
        asd_write_reg_word(asd_ha, LmSEQ_NOTIFY_TIMER_DOWN_COUNT(lseq),
                           ASD_NOTIFY_DOWN_COUNT);
+       asd_write_reg_word(asd_ha, LmSEQ_NOTIFY_TIMER_INITIAL_COUNT(lseq),
+                          ASD_NOTIFY_DOWN_COUNT);
 
        /* LSEQ Mode dependent, mode 0 and 1, page 1 setup. */
        for (i = 0; i < 2; i++) {
@@ -907,6 +909,16 @@ static void asd_init_scb_sites(struct asd_ha_struct *asd_ha)
                for (i = 0; i < ASD_SCB_SIZE; i += 4)
                        asd_scbsite_write_dword(asd_ha, site_no, i, 0);
 
+               /* Initialize SCB Site Opcode field to invalid. */
+               asd_scbsite_write_byte(asd_ha, site_no,
+                                      offsetof(struct scb_header, opcode),
+                                      0xFF);
+
+               /* Initialize SCB Site Flags field to mean a response
+                * frame has been received.  This means inadvertent
+                * frames received to be dropped. */
+               asd_scbsite_write_byte(asd_ha, site_no, 0x49, 0x01);
+
                /* Workaround needed by SEQ to fix a SATA issue is to exclude
                 * certain SCB sites from the free list. */
                if (!SCB_SITE_VALID(site_no))
@@ -922,16 +934,6 @@ static void asd_init_scb_sites(struct asd_ha_struct *asd_ha)
                /* Q_NEXT field of the last SCB is invalidated. */
                asd_scbsite_write_word(asd_ha, site_no, 0, first_scb_site_no);
 
-               /* Initialize SCB Site Opcode field to invalid. */
-               asd_scbsite_write_byte(asd_ha, site_no,
-                                      offsetof(struct scb_header, opcode),
-                                      0xFF);
-
-               /* Initialize SCB Site Flags field to mean a response
-                * frame has been received.  This means inadvertent
-                * frames received to be dropped. */
-               asd_scbsite_write_byte(asd_ha, site_no, 0x49, 0x01);
-
                first_scb_site_no = site_no;
                max_scbs++;
        }
@@ -1173,6 +1175,16 @@ static void asd_init_ddb_0(struct asd_ha_struct *asd_ha)
        set_bit(0, asd_ha->hw_prof.ddb_bitmap);
 }
 
+static void asd_seq_init_ddb_sites(struct asd_ha_struct *asd_ha)
+{
+       unsigned int i;
+       unsigned int ddb_site;
+
+       for (ddb_site = 0 ; ddb_site < ASD_MAX_DDBS; ddb_site++)
+               for (i = 0; i < sizeof(struct asd_ddb_ssp_smp_target_port); i+= 4)
+                       asd_ddbsite_write_dword(asd_ha, ddb_site, i, 0);
+}
+
 /**
  * asd_seq_setup_seqs -- setup and initialize central and link sequencers
  * @asd_ha: pointer to host adapter structure
@@ -1182,6 +1194,9 @@ static void asd_seq_setup_seqs(struct asd_ha_struct *asd_ha)
        int             lseq;
        u8              lseq_mask;
 
+       /* Initialize DDB sites */
+       asd_seq_init_ddb_sites(asd_ha);
+
        /* Initialize SCB sites. Done first to compute some values which
         * the rest of the init code depends on. */
        asd_init_scb_sites(asd_ha);
@@ -1232,6 +1247,13 @@ static int asd_seq_start_lseq(struct asd_ha_struct *asd_ha, int lseq)
        return asd_seq_unpause_lseq(asd_ha, lseq);
 }
 
+int asd_release_firmware(void)
+{
+       if (sequencer_fw)
+               release_firmware(sequencer_fw);
+       return 0;
+}
+
 static int asd_request_firmware(struct asd_ha_struct *asd_ha)
 {
        int err, i;
@@ -1375,7 +1397,9 @@ void asd_update_port_links(struct asd_ha_struct *asd_ha, struct asd_phy *phy)
        u8  phy_is_up;
        u8  mask;
        int i, err;
+       unsigned long flags;
 
+       spin_lock_irqsave(&asd_ha->hw_prof.ddb_lock, flags);
        for_each_phy(phy_mask, mask, i)
                asd_ddbsite_write_byte(asd_ha, 0,
                                       offsetof(struct asd_ddb_seq_shared,
@@ -1395,6 +1419,7 @@ void asd_update_port_links(struct asd_ha_struct *asd_ha, struct asd_phy *phy)
                        break;
                }
        }
+       spin_unlock_irqrestore(&asd_ha->hw_prof.ddb_lock, flags);
 
        if (err)
                asd_printk("couldn't update DDB 0:error:%d\n", err);
index 9e715e5496af93b4a585b9764a645d7dcbd2db86..9437ff0ae3a4f6ce9852c8c08a2b48588db3ea2b 100644 (file)
@@ -63,6 +63,7 @@ int asd_pause_lseq(struct asd_ha_struct *asd_ha, u8 lseq_mask);
 int asd_unpause_lseq(struct asd_ha_struct *asd_ha, u8 lseq_mask);
 int asd_init_seqs(struct asd_ha_struct *asd_ha);
 int asd_start_seqs(struct asd_ha_struct *asd_ha);
+int asd_release_firmware(void);
 
 void asd_update_port_links(struct asd_ha_struct *asd_ha, struct asd_phy *phy);
 #endif
index d202ed5a6709560b5793bcb53c6314b1ea3b967d..e2ad5bed94035c0dd594c237e0c59a8dba3dd1c1 100644 (file)
@@ -349,6 +349,7 @@ Again:
 
        spin_lock_irqsave(&task->task_state_lock, flags);
        task->task_state_flags &= ~SAS_TASK_STATE_PENDING;
+       task->task_state_flags &= ~SAS_TASK_AT_INITIATOR;
        task->task_state_flags |= SAS_TASK_STATE_DONE;
        if (unlikely((task->task_state_flags & SAS_TASK_STATE_ABORTED))) {
                spin_unlock_irqrestore(&task->task_state_lock, flags);
@@ -557,6 +558,7 @@ int asd_execute_task(struct sas_task *task, const int num,
        struct sas_task *t = task;
        struct asd_ascb *ascb = NULL, *a;
        struct asd_ha_struct *asd_ha = task->dev->port->ha->lldd_ha;
+       unsigned long flags;
 
        res = asd_can_queue(asd_ha, num);
        if (res)
@@ -599,6 +601,10 @@ int asd_execute_task(struct sas_task *task, const int num,
                }
                if (res)
                        goto out_err_unmap;
+
+               spin_lock_irqsave(&t->task_state_lock, flags);
+               t->task_state_flags |= SAS_TASK_AT_INITIATOR;
+               spin_unlock_irqrestore(&t->task_state_lock, flags);
        }
        list_del_init(&alist);
 
@@ -617,6 +623,9 @@ out_err_unmap:
                        if (a == b)
                                break;
                        t = a->uldd_task;
+                       spin_lock_irqsave(&t->task_state_lock, flags);
+                       t->task_state_flags &= ~SAS_TASK_AT_INITIATOR;
+                       spin_unlock_irqrestore(&t->task_state_lock, flags);
                        switch (t->task_proto) {
                        case SATA_PROTO:
                        case SAS_PROTO_STP:
index 61234384503b6ac28bb82216d26cd474a84009e1..9a14a6d9727548039051e3999f0a8817e076cfce 100644 (file)
@@ -566,9 +566,7 @@ static int asd_initiate_ssp_tmf(struct domain_device *dev, u8 *lun,
                res = TMF_RESP_FUNC_ESUPP;
                break;
        default:
-               ASD_DPRINTK("%s: converting result 0x%x to TMF_RESP_FUNC_FAILED\n",
-                           __FUNCTION__, res);
-               res = TMF_RESP_FUNC_FAILED;
+               /* Allow TMF response codes to propagate upwards */
                break;
        }
 out_err:
index 9099d531d5a4402cb401ee0f97bf6f2efe96e51d..d5d3c4d5a253966986eedbfd0ed0a618153ac2aa 100644 (file)
@@ -10,7 +10,6 @@
 #include <linux/types.h>
 #include <linux/mm.h>
 #include <linux/blkdev.h>
-#include <linux/sched.h>
 #include <linux/zorro.h>
 #include <linux/stat.h>
 
index 086cc97eee8c31e393cc19949eb8cc93391ca47f..8b46158cc0454a31e7ebd7128aa54d946ad33877 100644 (file)
@@ -322,7 +322,7 @@ static int arcmsr_probe(struct pci_dev *pdev,
                goto out_iounmap;
 
        error = request_irq(pdev->irq, arcmsr_do_interrupt,
-                       SA_INTERRUPT | SA_SHIRQ, "arcmsr", acb);
+                       IRQF_DISABLED | IRQF_SHARED, "arcmsr", acb);
        if (error)
                goto out_free_ccb_pool;
 
index 9cf902b7a12686923e036905d43acd2138eebcdd..eceacf6d49eacb6da78c9c9e180f3e05ef641345 100644 (file)
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/signal.h>
 #include <linux/errno.h>
index 4385e9e3ded68abbe895189866e415c989f5c5f5..7e132c5bacf83a705bdfcf767b5e93c78de7155e 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/proc_fs.h>
 #include <linux/unistd.h>
 #include <linux/stat.h>
index 3bdfc36481ae8f8e7c8b0ea1c7ddba83f4465db7..cf9a21cea6d9309b88aa4cb69b2d2addc53aa7a1 100644 (file)
@@ -5,7 +5,6 @@
  */
 #include <linux/module.h>
 #include <linux/signal.h>
-#include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
 #include <linux/blkdev.h>
index 19edd9c853d9fe35fd9406afedb3e58c49aa4c28..d2d51dc51ab83727f8761ab7c25425ac32ad77a3 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/proc_fs.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
index 6adcccbf444b1a34b5ec0c0f2fa1b2abea6bb20e..378e7af0c5d6760750fe18c9105b1707fdf05527 100644 (file)
@@ -23,7 +23,6 @@
 
 #include <linux/module.h>
 #include <linux/signal.h>
-#include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
 #include <linux/init.h>
index 3f876fb754693c7ab61496ad49dcda5f66656dd0..4677152142d92566b8f9f5efcb4dd40fc05b4797 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/proc_fs.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
index e05f0c2fc9123a7948216d785c0c6d36e172b533..2969cc0ff2599229e8e092de1d35f86c30daa6df 100644 (file)
@@ -39,7 +39,6 @@
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/proc_fs.h>
 #include <linux/delay.h>
 #include <linux/bitops.h>
index d806b024c3bda264126f0b679389c11c91a5a8d9..c21b8392c92837ec2af15d43acbb8acdd1bbe22d 100644 (file)
@@ -6,7 +6,6 @@
 
 #include <linux/module.h>
 #include <linux/signal.h>
-#include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
 #include <linux/blkdev.h>
index ce159c15bc86eae5e711136616e8f68aaf20f985..f9cd20bfb95890f9ae79cb1d162e41865bf12f4f 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/proc_fs.h>
 #include <linux/delay.h>
 #include <linux/interrupt.h>
index dfb1bcfae82ebe834812e3dd8738b227110fc8c9..642de7b2b7a2596bdeac54bc1ea05105ad6c08ae 100644 (file)
@@ -86,7 +86,6 @@
 #include <linux/delay.h>
 #include <linux/mm.h>
 #include <linux/blkdev.h>
-#include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/init.h>
 #include <linux/nvram.h>
index 2958b8c2bfb7080aff8830f0a705a05bb59043f6..599b400a3c432267689c1e8155906355f2a9bbbd 100644 (file)
@@ -6,7 +6,6 @@
 #include <linux/types.h>
 #include <linux/mm.h>
 #include <linux/blkdev.h>
-#include <linux/sched.h>
 #include <linux/zorro.h>
 
 #include <asm/setup.h>
index f6caa43077680b3a87d1621e3006f40883a1eb35..2a2cc6cf1182a9cdaa2ebf0df1c2b9e15b4b37e3 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/init.h>
 #include <linux/fs.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/major.h>
 #include <linux/string.h>
@@ -129,7 +128,7 @@ static struct scsi_driver ch_template =
        },
 };
 
-static struct file_operations changer_fops =
+static const struct file_operations changer_fops =
 {
        .owner        = THIS_MODULE,
        .open         = ch_open,
index 365db537a28da81ddee1d7a1403a50ddc02a0383..cd36e81b2d9348223847dea27dd37c61cf6b7dd0 100644 (file)
@@ -116,7 +116,7 @@ static int sys_tbl_len = 0;
 static adpt_hba* hba_chain = NULL;
 static int hba_count = 0;
 
-static struct file_operations adpt_fops = {
+static const struct file_operations adpt_fops = {
        .ioctl          = adpt_ioctl,
        .open           = adpt_open,
        .release        = adpt_close
index 54756722dd5f74c000fde0fb1661eec92fe512c0..9d52e45c7d36170a47f6e7da98ee179093a28336 100644 (file)
@@ -75,7 +75,6 @@
 #include <asm/system.h>
 #include <linux/module.h>
 #include <linux/signal.h>
-#include <linux/sched.h>
 #include <linux/blkdev.h>
 #include <linux/delay.h>
 #include <linux/stat.h>
index 2dbb66d2f0a7398c791e3f51be5f256d06182cf9..f33ad01064a9d8b0f8696331bd6d90da1fbbef3a 100644 (file)
@@ -48,7 +48,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/ioport.h>
 #include <linux/slab.h>
index cdd893bb4e28156e43a1d83b5eda37592b2b1bd6..880f70d24e6511e9fe92d5db66abe27b8aab4487 100644 (file)
 #include <asm/system.h>
 #include <asm/io.h>
 #include <linux/signal.h>
-#include <linux/sched.h>
 #include <linux/blkdev.h>
 #include "scsi.h"
 #include <scsi/scsi_host.h>
index 4c698a71f66ff0b54c6dda5c3859f3b96ff04331..8c81cec852982cf1a116991e42cd22ec07360d00 100644 (file)
 #include <linux/ctype.h>
 #include <linux/ioport.h>
 #include <linux/delay.h>
-#include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/in.h>
 #include <linux/proc_fs.h>
@@ -687,7 +686,7 @@ MODULE_AUTHOR("Achim Leubner");
 MODULE_LICENSE("GPL");
 
 /* ioctl interface */
-static struct file_operations gdth_fops = {
+static const struct file_operations gdth_fops = {
     .ioctl   = gdth_ioctl,
     .open    = gdth_open,
     .release = gdth_close,
index 2f6c1137a6e5ffb5fa45c39728be80e954b0bb4f..37741e9b5c3b297380f4203376041333b4958ad2 100644 (file)
@@ -1,7 +1,6 @@
 #include <linux/types.h>
 #include <linux/mm.h>
 #include <linux/blkdev.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
 
index e28260f05d6be7fa511824d9cf6815ec0d280b11..4368ca0e8270b7a4b9b8d75596dcbb79d906c0c6 100644 (file)
@@ -580,7 +580,7 @@ static int crq_queue_create(struct crq_queue *queue, struct srp_target *target)
        }
 
        err = request_irq(vport->dma_dev->irq, &ibmvstgt_interrupt,
-                         SA_INTERRUPT, "ibmvstgt", target);
+                         IRQF_DISABLED, "ibmvstgt", target);
        if (err)
                goto req_irq_failed;
 
index d561663fb4e41cfcce5716a9be8adf362a10f7a6..7e7635ca78f1835c12db4db76fd4bcccf69be0b7 100644 (file)
 #include <linux/string.h>
 #include <linux/interrupt.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/jiffies.h>
 #include <linux/dma-mapping.h>
index 821386c7b57639e8c1ad5098a3de4635a6a57429..95045e33710d488b758374d17956f0f4074b837a 100644 (file)
@@ -595,10 +595,8 @@ static int ipr_save_pcix_cmd_reg(struct ipr_ioa_cfg *ioa_cfg)
 {
        int pcix_cmd_reg = pci_find_capability(ioa_cfg->pdev, PCI_CAP_ID_PCIX);
 
-       if (pcix_cmd_reg == 0) {
-               dev_err(&ioa_cfg->pdev->dev, "Failed to save PCI-X command register\n");
-               return -EIO;
-       }
+       if (pcix_cmd_reg == 0)
+               return 0;
 
        if (pci_read_config_word(ioa_cfg->pdev, pcix_cmd_reg + PCI_X_CMD,
                                 &ioa_cfg->saved_pcix_cmd_reg) != PCIBIOS_SUCCESSFUL) {
@@ -627,10 +625,6 @@ static int ipr_set_pcix_cmd_reg(struct ipr_ioa_cfg *ioa_cfg)
                        dev_err(&ioa_cfg->pdev->dev, "Failed to setup PCI-X command register\n");
                        return -EIO;
                }
-       } else {
-               dev_err(&ioa_cfg->pdev->dev,
-                       "Failed to setup PCI-X command register\n");
-               return -EIO;
        }
 
        return 0;
@@ -6314,7 +6308,6 @@ static int ipr_reset_restore_cfg_space(struct ipr_cmnd *ipr_cmd)
        int rc;
 
        ENTER;
-       pci_unblock_user_cfg_access(ioa_cfg->pdev);
        rc = pci_restore_state(ioa_cfg->pdev);
 
        if (rc != PCIBIOS_SUCCESSFUL) {
@@ -6354,6 +6347,24 @@ static int ipr_reset_restore_cfg_space(struct ipr_cmnd *ipr_cmd)
        return IPR_RC_JOB_CONTINUE;
 }
 
+/**
+ * ipr_reset_bist_done - BIST has completed on the adapter.
+ * @ipr_cmd:   ipr command struct
+ *
+ * Description: Unblock config space and resume the reset process.
+ *
+ * Return value:
+ *     IPR_RC_JOB_CONTINUE
+ **/
+static int ipr_reset_bist_done(struct ipr_cmnd *ipr_cmd)
+{
+       ENTER;
+       pci_unblock_user_cfg_access(ipr_cmd->ioa_cfg->pdev);
+       ipr_cmd->job_step = ipr_reset_restore_cfg_space;
+       LEAVE;
+       return IPR_RC_JOB_CONTINUE;
+}
+
 /**
  * ipr_reset_start_bist - Run BIST on the adapter.
  * @ipr_cmd:   ipr command struct
@@ -6376,7 +6387,7 @@ static int ipr_reset_start_bist(struct ipr_cmnd *ipr_cmd)
                ipr_cmd->ioasa.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR);
                rc = IPR_RC_JOB_CONTINUE;
        } else {
-               ipr_cmd->job_step = ipr_reset_restore_cfg_space;
+               ipr_cmd->job_step = ipr_reset_bist_done;
                ipr_reset_start_timer(ipr_cmd, IPR_WAIT_FOR_BIST_TIMEOUT);
                rc = IPR_RC_JOB_RETURN;
        }
@@ -7166,9 +7177,6 @@ ipr_get_chip_cfg(const struct pci_device_id *dev_id)
 {
        int i;
 
-       if (dev_id->driver_data)
-               return (const struct ipr_chip_cfg_t *)dev_id->driver_data;
-
        for (i = 0; i < ARRAY_SIZE(ipr_chip); i++)
                if (ipr_chip[i].vendor == dev_id->vendor &&
                    ipr_chip[i].device == dev_id->device)
@@ -7517,62 +7525,43 @@ static void ipr_shutdown(struct pci_dev *pdev)
 
 static struct pci_device_id ipr_pci_table[] __devinitdata = {
        { PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE,
-               PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_5702,
-               0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] },
+               PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_5702, 0, 0, 0 },
        { PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE,
-               PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_5703,
-             0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] },
+               PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_5703, 0, 0, 0 },
        { PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE,
-               PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_573D,
-             0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] },
+               PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_573D, 0, 0, 0 },
        { PCI_VENDOR_ID_MYLEX, PCI_DEVICE_ID_IBM_GEMSTONE,
-               PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_573E,
-             0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] },
+               PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_573E, 0, 0, 0 },
        { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE,
-               PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_571B,
-             0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] },
+               PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_571B, 0, 0, 0 },
        { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_CITRINE,
-               PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572E,
-             0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] },
+               PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572E, 0, 0, 0 },
        { 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, IPR_SUBS_DEV_ID_571A, 0, 0, 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_IBM, IPR_SUBS_DEV_ID_575B, 0, 0, 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_IBM, IPR_SUBS_DEV_ID_572A, 0, 0, 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, IPR_SUBS_DEV_ID_572B, 0, 0, 0 },
        { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_OBSIDIAN,
-             PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_575C,
-             0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] },
+             PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_575C, 0, 0, 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, IPR_SUBS_DEV_ID_572A, 0, 0, 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, IPR_SUBS_DEV_ID_572B, 0, 0, 0 },
        { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN,
-             PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_575C,
-             0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] },
+             PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_575C, 0, 0, 0 },
        { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_OBSIDIAN_E,
-             PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57B7,
-             0, 0, (kernel_ulong_t)&ipr_chip_cfg[0] },
+             PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_57B7, 0, 0, 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_IBM, IPR_SUBS_DEV_ID_2780, 0, 0, 0 },
        { 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_IBM, IPR_SUBS_DEV_ID_571E, 0, 0, 0 },
        { 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] },
+               PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_571F, 0, 0, 0 },
        { PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_SCAMP,
-               PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572F,
-               0, 0, (kernel_ulong_t)&ipr_chip_cfg[1] },
+               PCI_VENDOR_ID_IBM, IPR_SUBS_DEV_ID_572F, 0, 0, 0 },
        { }
 };
 MODULE_DEVICE_TABLE(pci, ipr_pci_table);
index 9f62a1d4d5118b0e197d15ea44d2ba07ff5f9424..88f285de97bb22ab45c607c8026da1dd0438830e 100644 (file)
@@ -37,8 +37,8 @@
 /*
  * Literals
  */
-#define IPR_DRIVER_VERSION "2.3.0"
-#define IPR_DRIVER_DATE "(November 8, 2006)"
+#define IPR_DRIVER_VERSION "2.3.1"
+#define IPR_DRIVER_DATE "(January 23, 2007)"
 
 /*
  * IPR_MAX_CMD_PER_LUN: This defines the maximum number of outstanding
index f0871c3ac3d98d279a7d465c487b3b7bd70da65d..5c32a69e41badc764b7b5143fdf24a703895a46c 100644 (file)
@@ -38,7 +38,6 @@
 #include <linux/stat.h>
 #include <linux/mm.h>
 #include <linux/blkdev.h>
-#include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/dma-mapping.h>
 
@@ -123,6 +122,7 @@ lasi700_probe(struct parisc_device *dev)
                hostdata->force_le_on_be = 0;
                hostdata->chip710 = 1;
                hostdata->dmode_extra = DMODE_FC2;
+               hostdata->burst_length = 8;
        }
 
        host = NCR_700_detect(&lasi700_template, hostdata, &dev->dev);
index fb7df7b758112b59359e6bc2d37b8afe11f18c66..a65598b1e5363b386c6a235f8d7c3e61ffe834bb 100644 (file)
@@ -548,7 +548,7 @@ int sas_discover_sata(struct domain_device *dev)
 
        res = sas_notify_lldd_dev_found(dev);
        if (res)
-               return res;
+               goto out_err2;
 
        switch (dev->dev_type) {
        case SATA_DEV:
@@ -560,11 +560,23 @@ int sas_discover_sata(struct domain_device *dev)
        default:
                break;
        }
+       if (res)
+               goto out_err;
 
        sas_notify_lldd_dev_gone(dev);
-       if (!res) {
-               sas_notify_lldd_dev_found(dev);
-       }
+       res = sas_notify_lldd_dev_found(dev);
+       if (res)
+               goto out_err2;
+
+       res = sas_rphy_add(dev->rphy);
+       if (res)
+               goto out_err;
+
+       return res;
+
+out_err:
+       sas_notify_lldd_dev_gone(dev);
+out_err2:
        return res;
 }
 
@@ -580,21 +592,17 @@ int sas_discover_end_dev(struct domain_device *dev)
 
        res = sas_notify_lldd_dev_found(dev);
        if (res)
-               return res;
+               goto out_err2;
 
        res = sas_rphy_add(dev->rphy);
        if (res)
                goto out_err;
 
-       /* do this to get the end device port attributes which will have
-        * been scanned in sas_rphy_add */
-       sas_notify_lldd_dev_gone(dev);
-       sas_notify_lldd_dev_found(dev);
-
        return 0;
 
 out_err:
        sas_notify_lldd_dev_gone(dev);
+out_err2:
        return res;
 }
 
@@ -649,6 +657,7 @@ void sas_unregister_domain_devices(struct asd_sas_port *port)
  */
 static void sas_discover_domain(struct work_struct *work)
 {
+       struct domain_device *dev;
        int error = 0;
        struct sas_discovery_event *ev =
                container_of(work, struct sas_discovery_event, work);
@@ -658,35 +667,42 @@ static void sas_discover_domain(struct work_struct *work)
                        &port->disc.pending);
 
        if (port->port_dev)
-               return ;
-       else {
-               error = sas_get_port_device(port);
-               if (error)
-                       return;
-       }
+               return;
+
+       error = sas_get_port_device(port);
+       if (error)
+               return;
+       dev = port->port_dev;
 
        SAS_DPRINTK("DOING DISCOVERY on port %d, pid:%d\n", port->id,
                    current->pid);
 
-       switch (port->port_dev->dev_type) {
+       switch (dev->dev_type) {
        case SAS_END_DEV:
-               error = sas_discover_end_dev(port->port_dev);
+               error = sas_discover_end_dev(dev);
                break;
        case EDGE_DEV:
        case FANOUT_DEV:
-               error = sas_discover_root_expander(port->port_dev);
+               error = sas_discover_root_expander(dev);
                break;
        case SATA_DEV:
        case SATA_PM:
-               error = sas_discover_sata(port->port_dev);
+               error = sas_discover_sata(dev);
                break;
        default:
-               SAS_DPRINTK("unhandled device %d\n", port->port_dev->dev_type);
+               SAS_DPRINTK("unhandled device %d\n", dev->dev_type);
                break;
        }
 
        if (error) {
-               kfree(port->port_dev); /* not kobject_register-ed yet */
+               sas_rphy_free(dev->rphy);
+               dev->rphy = NULL;
+
+               spin_lock(&port->dev_list_lock);
+               list_del_init(&dev->dev_list_node);
+               spin_unlock(&port->dev_list_lock);
+
+               kfree(dev); /* not kobject_register-ed yet */
                port->port_dev = NULL;
        }
 
@@ -726,7 +742,7 @@ int sas_discover_event(struct asd_sas_port *port, enum discover_event ev)
        BUG_ON(ev >= DISC_NUM_EVENTS);
 
        sas_queue_event(ev, &disc->disc_event_lock, &disc->pending,
-                       &disc->disc_work[ev].work, port->ha->core.shost);
+                       &disc->disc_work[ev].work, port->ha);
 
        return 0;
 }
index d83392ee6823f09dab380b1008d2e2bbbf0031ba..9db30fb5caf2e1be01aa27b5433aa78d63889eb4 100644 (file)
@@ -31,7 +31,7 @@ static void notify_ha_event(struct sas_ha_struct *sas_ha, enum ha_event event)
        BUG_ON(event >= HA_NUM_EVENTS);
 
        sas_queue_event(event, &sas_ha->event_lock, &sas_ha->pending,
-                       &sas_ha->ha_events[event].work, sas_ha->core.shost);
+                       &sas_ha->ha_events[event].work, sas_ha);
 }
 
 static void notify_port_event(struct asd_sas_phy *phy, enum port_event event)
@@ -41,7 +41,7 @@ static void notify_port_event(struct asd_sas_phy *phy, enum port_event event)
        BUG_ON(event >= PORT_NUM_EVENTS);
 
        sas_queue_event(event, &ha->event_lock, &phy->port_events_pending,
-                       &phy->port_events[event].work, ha->core.shost);
+                       &phy->port_events[event].work, ha);
 }
 
 static void notify_phy_event(struct asd_sas_phy *phy, enum phy_event event)
@@ -51,7 +51,7 @@ static void notify_phy_event(struct asd_sas_phy *phy, enum phy_event event)
        BUG_ON(event >= PHY_NUM_EVENTS);
 
        sas_queue_event(event, &ha->event_lock, &phy->phy_events_pending,
-                       &phy->phy_events[event].work, ha->core.shost);
+                       &phy->phy_events[event].work, ha);
 }
 
 int sas_init_events(struct sas_ha_struct *sas_ha)
index d31e6fa466f79668f151c0d0c301bbccf27c848f..dc70c180e1155ee98c88ab0e7b03975190145d87 100644 (file)
@@ -667,8 +667,9 @@ static struct domain_device *sas_ex_discover_end_dev(
        return child;
 
  out_list_del:
+       sas_rphy_free(child->rphy);
+       child->rphy = NULL;
        list_del(&child->dev_list_node);
-       sas_rphy_free(rphy);
  out_free:
        sas_port_delete(phy->port);
  out_err:
@@ -677,6 +678,29 @@ static struct domain_device *sas_ex_discover_end_dev(
        return NULL;
 }
 
+/* See if this phy is part of a wide port */
+static int sas_ex_join_wide_port(struct domain_device *parent, int phy_id)
+{
+       struct ex_phy *phy = &parent->ex_dev.ex_phy[phy_id];
+       int i;
+
+       for (i = 0; i < parent->ex_dev.num_phys; i++) {
+               struct ex_phy *ephy = &parent->ex_dev.ex_phy[i];
+
+               if (ephy == phy)
+                       continue;
+
+               if (!memcmp(phy->attached_sas_addr, ephy->attached_sas_addr,
+                           SAS_ADDR_SIZE) && ephy->port) {
+                       sas_port_add_phy(ephy->port, phy->phy);
+                       phy->phy_state = PHY_DEVICE_DISCOVERED;
+                       return 0;
+               }
+       }
+
+       return -ENODEV;
+}
+
 static struct domain_device *sas_ex_discover_expander(
        struct domain_device *parent, int phy_id)
 {
@@ -809,6 +833,13 @@ static int sas_ex_discover_dev(struct domain_device *dev, int phy_id)
                return res;
        }
 
+       res = sas_ex_join_wide_port(dev, phy_id);
+       if (!res) {
+               SAS_DPRINTK("Attaching ex phy%d to wide port %016llx\n",
+                           phy_id, SAS_ADDR(ex_phy->attached_sas_addr));
+               return res;
+       }
+
        switch (ex_phy->attached_dev_type) {
        case SAS_END_DEV:
                child = sas_ex_discover_end_dev(dev, phy_id);
@@ -1431,14 +1462,23 @@ int sas_discover_root_expander(struct domain_device *dev)
        int res;
        struct sas_expander_device *ex = rphy_to_expander_device(dev->rphy);
 
-       sas_rphy_add(dev->rphy);
+       res = sas_rphy_add(dev->rphy);
+       if (res)
+               goto out_err;
 
        ex->level = dev->port->disc.max_level; /* 0 */
        res = sas_discover_expander(dev);
-       if (!res)
-               sas_ex_bfs_disc(dev->port);
+       if (res)
+               goto out_err2;
+
+       sas_ex_bfs_disc(dev->port);
 
        return res;
+
+out_err2:
+       sas_rphy_remove(dev->rphy);
+out_err:
+       return res;
 }
 
 /* ---------- Domain revalidation ---------- */
index 2f0c07fc3f48c1da732c37e4862727b976595432..965698c8b7bff407cf2157922b93e7895ede92e7 100644 (file)
@@ -87,6 +87,9 @@ int sas_register_ha(struct sas_ha_struct *sas_ha)
        else if (sas_ha->lldd_queue_size == -1)
                sas_ha->lldd_queue_size = 128; /* Sanity */
 
+       sas_ha->state = SAS_HA_REGISTERED;
+       spin_lock_init(&sas_ha->state_lock);
+
        error = sas_register_phys(sas_ha);
        if (error) {
                printk(KERN_NOTICE "couldn't register sas phys:%d\n", error);
@@ -127,12 +130,22 @@ Undo_phys:
 
 int sas_unregister_ha(struct sas_ha_struct *sas_ha)
 {
+       unsigned long flags;
+
+       /* Set the state to unregistered to avoid further
+        * events to be queued */
+       spin_lock_irqsave(&sas_ha->state_lock, flags);
+       sas_ha->state = SAS_HA_UNREGISTERED;
+       spin_unlock_irqrestore(&sas_ha->state_lock, flags);
+       scsi_flush_work(sas_ha->core.shost);
+
+       sas_unregister_ports(sas_ha);
+
        if (sas_ha->lldd_max_execute_num > 1) {
                sas_shutdown_queue(sas_ha);
+               sas_ha->lldd_max_execute_num = 1;
        }
 
-       sas_unregister_ports(sas_ha);
-
        return 0;
 }
 
@@ -146,6 +159,36 @@ static int sas_get_linkerrors(struct sas_phy *phy)
        return sas_smp_get_phy_events(phy);
 }
 
+int sas_phy_enable(struct sas_phy *phy, int enable)
+{
+       int ret;
+       enum phy_func command;
+
+       if (enable)
+               command = PHY_FUNC_LINK_RESET;
+       else
+               command = PHY_FUNC_DISABLE;
+
+       if (scsi_is_sas_phy_local(phy)) {
+               struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
+               struct sas_ha_struct *sas_ha = SHOST_TO_SAS_HA(shost);
+               struct asd_sas_phy *asd_phy = sas_ha->sas_phy[phy->number];
+               struct sas_internal *i =
+                       to_sas_internal(sas_ha->core.shost->transportt);
+
+               if (!enable) {
+                       sas_phy_disconnected(asd_phy);
+                       sas_ha->notify_phy_event(asd_phy, PHYE_LOSS_OF_SIGNAL);
+               }
+               ret = i->dft->lldd_control_phy(asd_phy, command, NULL);
+       } else {
+               struct sas_rphy *rphy = dev_to_rphy(phy->dev.parent);
+               struct domain_device *ddev = sas_find_dev_by_rphy(rphy);
+               ret = sas_smp_phy_control(ddev, phy->number, command, NULL);
+       }
+       return ret;
+}
+
 int sas_phy_reset(struct sas_phy *phy, int hard_reset)
 {
        int ret;
@@ -172,8 +215,8 @@ int sas_phy_reset(struct sas_phy *phy, int hard_reset)
        return ret;
 }
 
-static int sas_set_phy_speed(struct sas_phy *phy,
-                            struct sas_phy_linkrates *rates)
+int sas_set_phy_speed(struct sas_phy *phy,
+                     struct sas_phy_linkrates *rates)
 {
        int ret;
 
@@ -212,6 +255,7 @@ static int sas_set_phy_speed(struct sas_phy *phy,
 }
 
 static struct sas_function_template sft = {
+       .phy_enable = sas_phy_enable,
        .phy_reset = sas_phy_reset,
        .set_phy_speed = sas_set_phy_speed,
        .get_linkerrors = sas_get_linkerrors,
index 137d7e496b6d99ab6d1f6c8cbac094e27d072760..a78638df2018dd50cb8fb420076052252f130ffc 100644 (file)
@@ -80,7 +80,7 @@ void sas_hae_reset(struct work_struct *work);
 static inline void sas_queue_event(int event, spinlock_t *lock,
                                   unsigned long *pending,
                                   struct work_struct *work,
-                                  struct Scsi_Host *shost)
+                                  struct sas_ha_struct *sas_ha)
 {
        unsigned long flags;
 
@@ -91,7 +91,12 @@ static inline void sas_queue_event(int event, spinlock_t *lock,
        }
        __set_bit(event, pending);
        spin_unlock_irqrestore(lock, flags);
-       scsi_queue_work(shost, work);
+
+       spin_lock_irqsave(&sas_ha->state_lock, flags);
+       if (sas_ha->state != SAS_HA_UNREGISTERED) {
+               scsi_queue_work(sas_ha->core.shost, work);
+       }
+       spin_unlock_irqrestore(&sas_ha->state_lock, flags);
 }
 
 static inline void sas_begin_event(int event, spinlock_t *lock,
index 971c37ceecb4a517fbba785e35b951545d4f8208..e1e2d085c920918dc508d4ec8d67dfad98095450 100644 (file)
@@ -42,10 +42,11 @@ static void sas_form_port(struct asd_sas_phy *phy)
        struct asd_sas_port *port = phy->port;
        struct sas_internal *si =
                to_sas_internal(sas_ha->core.shost->transportt);
+       unsigned long flags;
 
        if (port) {
                if (memcmp(port->attached_sas_addr, phy->attached_sas_addr,
-                          SAS_ADDR_SIZE) == 0)
+                          SAS_ADDR_SIZE) != 0)
                        sas_deform_port(phy);
                else {
                        SAS_DPRINTK("%s: phy%d belongs to port%d already(%d)!\n",
@@ -56,7 +57,7 @@ static void sas_form_port(struct asd_sas_phy *phy)
        }
 
        /* find a port */
-       spin_lock(&sas_ha->phy_port_lock);
+       spin_lock_irqsave(&sas_ha->phy_port_lock, flags);
        for (i = 0; i < sas_ha->num_phys; i++) {
                port = sas_ha->sas_port[i];
                spin_lock(&port->phy_list_lock);
@@ -78,7 +79,7 @@ static void sas_form_port(struct asd_sas_phy *phy)
        if (i >= sas_ha->num_phys) {
                printk(KERN_NOTICE "%s: couldn't find a free port, bug?\n",
                       __FUNCTION__);
-               spin_unlock(&sas_ha->phy_port_lock);
+               spin_unlock_irqrestore(&sas_ha->phy_port_lock, flags);
                return;
        }
 
@@ -105,7 +106,7 @@ static void sas_form_port(struct asd_sas_phy *phy)
        } else
                port->linkrate = max(port->linkrate, phy->linkrate);
        spin_unlock(&port->phy_list_lock);
-       spin_unlock(&sas_ha->phy_port_lock);
+       spin_unlock_irqrestore(&sas_ha->phy_port_lock, flags);
 
        if (!port->port) {
                port->port = sas_port_alloc(phy->phy->dev.parent, port->id);
@@ -137,6 +138,7 @@ void sas_deform_port(struct asd_sas_phy *phy)
        struct asd_sas_port *port = phy->port;
        struct sas_internal *si =
                to_sas_internal(sas_ha->core.shost->transportt);
+       unsigned long flags;
 
        if (!port)
                return;           /* done by a phy event */
@@ -155,7 +157,7 @@ void sas_deform_port(struct asd_sas_phy *phy)
        if (si->dft->lldd_port_deformed)
                si->dft->lldd_port_deformed(phy);
 
-       spin_lock(&sas_ha->phy_port_lock);
+       spin_lock_irqsave(&sas_ha->phy_port_lock, flags);
        spin_lock(&port->phy_list_lock);
 
        list_del_init(&phy->port_phy_el);
@@ -174,7 +176,7 @@ void sas_deform_port(struct asd_sas_phy *phy)
                port->phy_mask = 0;
        }
        spin_unlock(&port->phy_list_lock);
-       spin_unlock(&sas_ha->phy_port_lock);
+       spin_unlock_irqrestore(&sas_ha->phy_port_lock, flags);
 
        return;
 }
index 22672d54aa2742d7c515f6c89f818b4159b49a22..897a5e2c55e438a806c6e93072547a7386922832 100644 (file)
@@ -34,6 +34,7 @@
 #include <scsi/scsi_transport_sas.h>
 #include "../scsi_sas_internal.h"
 #include "../scsi_transport_api.h"
+#include "../scsi_priv.h"
 
 #include <linux/err.h>
 #include <linux/blkdev.h>
@@ -130,7 +131,7 @@ static enum task_attribute sas_scsi_get_task_attr(struct scsi_cmnd *cmd)
        if (cmd->request && blk_rq_tagged(cmd->request)) {
                if (cmd->device->ordered_tags &&
                    (cmd->request->cmd_flags & REQ_HARDBARRIER))
-                       ta = TASK_ATTR_HOQ;
+                       ta = TASK_ATTR_ORDERED;
        }
        return ta;
 }
@@ -281,6 +282,7 @@ enum task_disposition {
        TASK_IS_ABORTED,
        TASK_IS_AT_LU,
        TASK_IS_NOT_AT_LU,
+       TASK_ABORT_FAILED,
 };
 
 static enum task_disposition sas_scsi_find_task(struct sas_task *task)
@@ -310,15 +312,6 @@ static enum task_disposition sas_scsi_find_task(struct sas_task *task)
                spin_unlock_irqrestore(&core->task_queue_lock, flags);
        }
 
-       spin_lock_irqsave(&task->task_state_lock, flags);
-       if (task->task_state_flags & SAS_TASK_INITIATOR_ABORTED) {
-               spin_unlock_irqrestore(&task->task_state_lock, flags);
-               SAS_DPRINTK("%s: task 0x%p already aborted\n",
-                           __FUNCTION__, task);
-               return TASK_IS_ABORTED;
-       }
-       spin_unlock_irqrestore(&task->task_state_lock, flags);
-
        for (i = 0; i < 5; i++) {
                SAS_DPRINTK("%s: aborting task 0x%p\n", __FUNCTION__, task);
                res = si->dft->lldd_abort_task(task);
@@ -340,15 +333,21 @@ static enum task_disposition sas_scsi_find_task(struct sas_task *task)
                        SAS_DPRINTK("%s: querying task 0x%p\n",
                                    __FUNCTION__, task);
                        res = si->dft->lldd_query_task(task);
-                       if (res == TMF_RESP_FUNC_SUCC) {
+                       switch (res) {
+                       case TMF_RESP_FUNC_SUCC:
                                SAS_DPRINTK("%s: task 0x%p at LU\n",
                                            __FUNCTION__, task);
                                return TASK_IS_AT_LU;
-                       } else if (res == TMF_RESP_FUNC_COMPLETE) {
+                       case TMF_RESP_FUNC_COMPLETE:
                                SAS_DPRINTK("%s: task 0x%p not at LU\n",
                                            __FUNCTION__, task);
                                return TASK_IS_NOT_AT_LU;
-                       }
+                       case TMF_RESP_FUNC_FAILED:
+                                SAS_DPRINTK("%s: task 0x%p failed to abort\n",
+                                                __FUNCTION__, task);
+                                return TASK_ABORT_FAILED;
+                        }
+
                }
        }
        return res;
@@ -398,35 +397,113 @@ static int sas_recover_I_T(struct domain_device *dev)
        return res;
 }
 
-void sas_scsi_recover_host(struct Scsi_Host *shost)
+/* Find the sas_phy that's attached to this device */
+struct sas_phy *find_local_sas_phy(struct domain_device *dev)
+{
+       struct domain_device *pdev = dev->parent;
+       struct ex_phy *exphy = NULL;
+       int i;
+
+       /* Directly attached device */
+       if (!pdev)
+               return dev->port->phy;
+
+       /* Otherwise look in the expander */
+       for (i = 0; i < pdev->ex_dev.num_phys; i++)
+               if (!memcmp(dev->sas_addr,
+                           pdev->ex_dev.ex_phy[i].attached_sas_addr,
+                           SAS_ADDR_SIZE)) {
+                       exphy = &pdev->ex_dev.ex_phy[i];
+                       break;
+               }
+
+       BUG_ON(!exphy);
+       return exphy->phy;
+}
+
+/* Attempt to send a LUN reset message to a device */
+int sas_eh_device_reset_handler(struct scsi_cmnd *cmd)
+{
+       struct domain_device *dev = cmd_to_domain_dev(cmd);
+       struct sas_internal *i =
+               to_sas_internal(dev->port->ha->core.shost->transportt);
+       struct scsi_lun lun;
+       int res;
+
+       int_to_scsilun(cmd->device->lun, &lun);
+
+       if (!i->dft->lldd_lu_reset)
+               return FAILED;
+
+       res = i->dft->lldd_lu_reset(dev, lun.scsi_lun);
+       if (res == TMF_RESP_FUNC_SUCC || res == TMF_RESP_FUNC_COMPLETE)
+               return SUCCESS;
+
+       return FAILED;
+}
+
+/* Attempt to send a phy (bus) reset */
+int sas_eh_bus_reset_handler(struct scsi_cmnd *cmd)
+{
+       struct domain_device *dev = cmd_to_domain_dev(cmd);
+       struct sas_phy *phy = find_local_sas_phy(dev);
+       int res;
+
+       res = sas_phy_reset(phy, 1);
+       if (res)
+               SAS_DPRINTK("Bus reset of %s failed 0x%x\n",
+                           phy->dev.kobj.k_name,
+                           res);
+       if (res == TMF_RESP_FUNC_SUCC || res == TMF_RESP_FUNC_COMPLETE)
+               return SUCCESS;
+
+       return FAILED;
+}
+
+/* Try to reset a device */
+static int try_to_reset_cmd_device(struct Scsi_Host *shost,
+                                  struct scsi_cmnd *cmd)
+{
+       int res;
+
+       if (!shost->hostt->eh_device_reset_handler)
+               goto try_bus_reset;
+
+       res = shost->hostt->eh_device_reset_handler(cmd);
+       if (res == SUCCESS)
+               return res;
+
+try_bus_reset:
+       if (shost->hostt->eh_bus_reset_handler)
+               return shost->hostt->eh_bus_reset_handler(cmd);
+
+       return FAILED;
+}
+
+static int sas_eh_handle_sas_errors(struct Scsi_Host *shost,
+                                   struct list_head *work_q,
+                                   struct list_head *done_q)
 {
-       struct sas_ha_struct *ha = SHOST_TO_SAS_HA(shost);
-       unsigned long flags;
-       LIST_HEAD(error_q);
        struct scsi_cmnd *cmd, *n;
        enum task_disposition res = TASK_IS_DONE;
-       int tmf_resp;
+       int tmf_resp, need_reset;
        struct sas_internal *i = to_sas_internal(shost->transportt);
+       unsigned long flags;
+       struct sas_ha_struct *ha = SHOST_TO_SAS_HA(shost);
 
-       spin_lock_irqsave(shost->host_lock, flags);
-       list_splice_init(&shost->eh_cmd_q, &error_q);
-       spin_unlock_irqrestore(shost->host_lock, flags);
-
-       SAS_DPRINTK("Enter %s\n", __FUNCTION__);
-
-       /* All tasks on this list were marked SAS_TASK_STATE_ABORTED
-        * by sas_scsi_timed_out() callback.
-        */
 Again:
-       SAS_DPRINTK("going over list...\n");
-       list_for_each_entry_safe(cmd, n, &error_q, eh_entry) {
+       list_for_each_entry_safe(cmd, n, work_q, eh_entry) {
                struct sas_task *task = TO_SAS_TASK(cmd);
-               list_del_init(&cmd->eh_entry);
 
-               if (!task) {
-                       SAS_DPRINTK("%s: taskless cmd?!\n", __FUNCTION__);
+               if (!task)
                        continue;
-               }
+
+               list_del_init(&cmd->eh_entry);
+
+               spin_lock_irqsave(&task->task_state_lock, flags);
+               need_reset = task->task_state_flags & SAS_TASK_NEED_DEV_RESET;
+               spin_unlock_irqrestore(&task->task_state_lock, flags);
+
                SAS_DPRINTK("trying to find task 0x%p\n", task);
                res = sas_scsi_find_task(task);
 
@@ -437,11 +514,15 @@ Again:
                        SAS_DPRINTK("%s: task 0x%p is done\n", __FUNCTION__,
                                    task);
                        task->task_done(task);
+                       if (need_reset)
+                               try_to_reset_cmd_device(shost, cmd);
                        continue;
                case TASK_IS_ABORTED:
                        SAS_DPRINTK("%s: task 0x%p is aborted\n",
                                    __FUNCTION__, task);
                        task->task_done(task);
+                       if (need_reset)
+                               try_to_reset_cmd_device(shost, cmd);
                        continue;
                case TASK_IS_AT_LU:
                        SAS_DPRINTK("task 0x%p is at LU: lu recover\n", task);
@@ -452,11 +533,14 @@ Again:
                                            SAS_ADDR(task->dev),
                                            cmd->device->lun);
                                task->task_done(task);
-                               sas_scsi_clear_queue_lu(&error_q, cmd);
+                               if (need_reset)
+                                       try_to_reset_cmd_device(shost, cmd);
+                               sas_scsi_clear_queue_lu(work_q, cmd);
                                goto Again;
                        }
                        /* fallthrough */
                case TASK_IS_NOT_AT_LU:
+               case TASK_ABORT_FAILED:
                        SAS_DPRINTK("task 0x%p is not at LU: I_T recover\n",
                                    task);
                        tmf_resp = sas_recover_I_T(task->dev);
@@ -464,7 +548,9 @@ Again:
                                SAS_DPRINTK("I_T %016llx recovered\n",
                                            SAS_ADDR(task->dev->sas_addr));
                                task->task_done(task);
-                               sas_scsi_clear_queue_I_T(&error_q, task->dev);
+                               if (need_reset)
+                                       try_to_reset_cmd_device(shost, cmd);
+                               sas_scsi_clear_queue_I_T(work_q, task->dev);
                                goto Again;
                        }
                        /* Hammer time :-) */
@@ -477,7 +563,9 @@ Again:
                                        SAS_DPRINTK("clear nexus port:%d "
                                                    "succeeded\n", port->id);
                                        task->task_done(task);
-                                       sas_scsi_clear_queue_port(&error_q,
+                                       if (need_reset)
+                                               try_to_reset_cmd_device(shost, cmd);
+                                       sas_scsi_clear_queue_port(work_q,
                                                                  port);
                                        goto Again;
                                }
@@ -489,6 +577,8 @@ Again:
                                        SAS_DPRINTK("clear nexus ha "
                                                    "succeeded\n");
                                        task->task_done(task);
+                                       if (need_reset)
+                                               try_to_reset_cmd_device(shost, cmd);
                                        goto out;
                                }
                        }
@@ -502,20 +592,54 @@ Again:
                                    cmd->device->lun);
 
                        task->task_done(task);
+                       if (need_reset)
+                               try_to_reset_cmd_device(shost, cmd);
                        goto clear_q;
                }
        }
 out:
-       scsi_eh_flush_done_q(&ha->eh_done_q);
-       SAS_DPRINTK("--- Exit %s\n", __FUNCTION__);
-       return;
+       return list_empty(work_q);
 clear_q:
        SAS_DPRINTK("--- Exit %s -- clear_q\n", __FUNCTION__);
-       list_for_each_entry_safe(cmd, n, &error_q, eh_entry) {
+       list_for_each_entry_safe(cmd, n, work_q, eh_entry) {
                struct sas_task *task = TO_SAS_TASK(cmd);
                list_del_init(&cmd->eh_entry);
                task->task_done(task);
        }
+       return list_empty(work_q);
+}
+
+void sas_scsi_recover_host(struct Scsi_Host *shost)
+{
+       struct sas_ha_struct *ha = SHOST_TO_SAS_HA(shost);
+       unsigned long flags;
+       LIST_HEAD(eh_work_q);
+
+       spin_lock_irqsave(shost->host_lock, flags);
+       list_splice_init(&shost->eh_cmd_q, &eh_work_q);
+       spin_unlock_irqrestore(shost->host_lock, flags);
+
+       SAS_DPRINTK("Enter %s\n", __FUNCTION__);
+       /*
+        * Deal with commands that still have SAS tasks (i.e. they didn't
+        * complete via the normal sas_task completion mechanism)
+        */
+       if (sas_eh_handle_sas_errors(shost, &eh_work_q, &ha->eh_done_q))
+               goto out;
+
+       /*
+        * Now deal with SCSI commands that completed ok but have a an error
+        * code (and hopefully sense data) attached.  This is roughly what
+        * scsi_unjam_host does, but we skip scsi_eh_abort_cmds because any
+        * command we see here has no sas_task and is thus unknown to the HA.
+        */
+       if (!scsi_eh_get_sense(&eh_work_q, &ha->eh_done_q))
+               scsi_eh_ready_devs(shost, &eh_work_q, &ha->eh_done_q);
+
+out:
+       scsi_eh_flush_done_q(&ha->eh_done_q);
+       SAS_DPRINTK("--- Exit %s\n", __FUNCTION__);
+       return;
 }
 
 enum scsi_eh_timer_return sas_scsi_timed_out(struct scsi_cmnd *cmd)
@@ -524,24 +648,30 @@ enum scsi_eh_timer_return sas_scsi_timed_out(struct scsi_cmnd *cmd)
        unsigned long flags;
 
        if (!task) {
-               SAS_DPRINTK("command 0x%p, task 0x%p, gone: EH_HANDLED\n",
-                           cmd, task);
-               return EH_HANDLED;
+               cmd->timeout_per_command /= 2;
+               SAS_DPRINTK("command 0x%p, task 0x%p, gone: %s\n",
+                           cmd, task, (cmd->timeout_per_command ?
+                           "EH_RESET_TIMER" : "EH_NOT_HANDLED"));
+               if (!cmd->timeout_per_command)
+                       return EH_NOT_HANDLED;
+               return EH_RESET_TIMER;
        }
 
        spin_lock_irqsave(&task->task_state_lock, flags);
-       if (task->task_state_flags & SAS_TASK_INITIATOR_ABORTED) {
-               spin_unlock_irqrestore(&task->task_state_lock, flags);
-               SAS_DPRINTK("command 0x%p, task 0x%p, aborted by initiator: "
-                           "EH_NOT_HANDLED\n", cmd, task);
-               return EH_NOT_HANDLED;
-       }
+       BUG_ON(task->task_state_flags & SAS_TASK_STATE_ABORTED);
        if (task->task_state_flags & SAS_TASK_STATE_DONE) {
                spin_unlock_irqrestore(&task->task_state_lock, flags);
                SAS_DPRINTK("command 0x%p, task 0x%p, timed out: EH_HANDLED\n",
                            cmd, task);
                return EH_HANDLED;
        }
+       if (!(task->task_state_flags & SAS_TASK_AT_INITIATOR)) {
+               spin_unlock_irqrestore(&task->task_state_lock, flags);
+               SAS_DPRINTK("command 0x%p, task 0x%p, not at initiator: "
+                           "EH_RESET_TIMER\n",
+                           cmd, task);
+               return EH_RESET_TIMER;
+       }
        task->task_state_flags |= SAS_TASK_STATE_ABORTED;
        spin_unlock_irqrestore(&task->task_state_lock, flags);
 
@@ -557,8 +687,9 @@ struct domain_device *sas_find_dev_by_rphy(struct sas_rphy *rphy)
        struct sas_ha_struct *ha = SHOST_TO_SAS_HA(shost);
        struct domain_device *found_dev = NULL;
        int i;
+       unsigned long flags;
 
-       spin_lock(&ha->phy_port_lock);
+       spin_lock_irqsave(&ha->phy_port_lock, flags);
        for (i = 0; i < ha->num_phys; i++) {
                struct asd_sas_port *port = ha->sas_port[i];
                struct domain_device *dev;
@@ -574,7 +705,7 @@ struct domain_device *sas_find_dev_by_rphy(struct sas_rphy *rphy)
                spin_unlock(&port->dev_list_lock);
        }
  found:
-       spin_unlock(&ha->phy_port_lock);
+       spin_unlock_irqrestore(&ha->phy_port_lock, flags);
 
        return found_dev;
 }
@@ -623,6 +754,8 @@ int sas_slave_configure(struct scsi_device *scsi_dev)
                scsi_deactivate_tcq(scsi_dev, 1);
        }
 
+       scsi_dev->allow_restart = 1;
+
        return 0;
 }
 
@@ -799,46 +932,42 @@ void sas_shutdown_queue(struct sas_ha_struct *sas_ha)
        spin_unlock_irqrestore(&core->task_queue_lock, flags);
 }
 
-static int do_sas_task_abort(struct sas_task *task)
+/*
+ * Call the LLDD task abort routine directly.  This function is intended for
+ * use by upper layers that need to tell the LLDD to abort a task.
+ */
+int __sas_task_abort(struct sas_task *task)
 {
-       struct scsi_cmnd *sc = task->uldd_task;
        struct sas_internal *si =
                to_sas_internal(task->dev->port->ha->core.shost->transportt);
        unsigned long flags;
        int res;
 
        spin_lock_irqsave(&task->task_state_lock, flags);
-       if (task->task_state_flags & SAS_TASK_STATE_ABORTED) {
+       if (task->task_state_flags & SAS_TASK_STATE_ABORTED ||
+           task->task_state_flags & SAS_TASK_STATE_DONE) {
                spin_unlock_irqrestore(&task->task_state_lock, flags);
-               SAS_DPRINTK("%s: Task %p already aborted.\n", __FUNCTION__,
+               SAS_DPRINTK("%s: Task %p already finished.\n", __FUNCTION__,
                            task);
                return 0;
        }
-
-       task->task_state_flags |= SAS_TASK_INITIATOR_ABORTED;
-       if (!(task->task_state_flags & SAS_TASK_STATE_DONE))
-               task->task_state_flags |= SAS_TASK_STATE_ABORTED;
+       task->task_state_flags |= SAS_TASK_STATE_ABORTED;
        spin_unlock_irqrestore(&task->task_state_lock, flags);
 
        if (!si->dft->lldd_abort_task)
                return -ENODEV;
 
        res = si->dft->lldd_abort_task(task);
+
+       spin_lock_irqsave(&task->task_state_lock, flags);
        if ((task->task_state_flags & SAS_TASK_STATE_DONE) ||
            (res == TMF_RESP_FUNC_COMPLETE))
        {
-               /* SMP commands don't have scsi_cmds(?) */
-               if (!sc) {
-                       task->task_done(task);
-                       return 0;
-               }
-               scsi_req_abort_cmd(sc);
-               scsi_schedule_eh(sc->device->host);
+               spin_unlock_irqrestore(&task->task_state_lock, flags);
+               task->task_done(task);
                return 0;
        }
 
-       spin_lock_irqsave(&task->task_state_lock, flags);
-       task->task_state_flags &= ~SAS_TASK_INITIATOR_ABORTED;
        if (!(task->task_state_flags & SAS_TASK_STATE_DONE))
                task->task_state_flags &= ~SAS_TASK_STATE_ABORTED;
        spin_unlock_irqrestore(&task->task_state_lock, flags);
@@ -846,17 +975,24 @@ static int do_sas_task_abort(struct sas_task *task)
        return -EAGAIN;
 }
 
-void sas_task_abort(struct work_struct *work)
+/*
+ * Tell an upper layer that it needs to initiate an abort for a given task.
+ * This should only ever be called by an LLDD.
+ */
+void sas_task_abort(struct sas_task *task)
 {
-       struct sas_task *task =
-               container_of(work, struct sas_task, abort_work);
-       int i;
+       struct scsi_cmnd *sc = task->uldd_task;
 
-       for (i = 0; i < 5; i++)
-               if (!do_sas_task_abort(task))
+       /* Escape for libsas internal commands */
+       if (!sc) {
+               if (!del_timer(&task->timer))
                        return;
+               task->timer.function(task->timer.data);
+               return;
+       }
 
-       SAS_DPRINTK("%s: Could not kill task!\n", __FUNCTION__);
+       scsi_req_abort_cmd(sc);
+       scsi_schedule_eh(sc->device->host);
 }
 
 EXPORT_SYMBOL_GPL(sas_queuecommand);
@@ -866,5 +1002,9 @@ EXPORT_SYMBOL_GPL(sas_slave_destroy);
 EXPORT_SYMBOL_GPL(sas_change_queue_depth);
 EXPORT_SYMBOL_GPL(sas_change_queue_type);
 EXPORT_SYMBOL_GPL(sas_bios_param);
+EXPORT_SYMBOL_GPL(__sas_task_abort);
 EXPORT_SYMBOL_GPL(sas_task_abort);
 EXPORT_SYMBOL_GPL(sas_phy_reset);
+EXPORT_SYMBOL_GPL(sas_phy_enable);
+EXPORT_SYMBOL_GPL(sas_eh_device_reset_handler);
+EXPORT_SYMBOL_GPL(sas_eh_bus_reset_handler);
index a942a21dd87eaf78610e04f86933ce76b0ef7815..cdbcaa5ad6cfbcd2b7cb89f34828515784bf12e5 100644 (file)
@@ -36,7 +36,6 @@
 
 #include <linux/module.h>
 #include <linux/signal.h>
-#include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
 #include <linux/blkdev.h>
index 77d9d3804ccfd02094a4aba9054081c233ed8427..808a1b8c40431946982847dd446223e396f87b8d 100644 (file)
@@ -92,7 +92,7 @@ static struct mega_hbas mega_hbas[MAX_CONTROLLERS];
 /*
  * The File Operations structure for the serial/ioctl interface of the driver
  */
-static struct file_operations megadev_fops = {
+static const struct file_operations megadev_fops = {
        .owner          = THIS_MODULE,
        .ioctl          = megadev_ioctl,
        .open           = megadev_open,
index 3052869f51f4fadf9eda7c923db07115748664cb..170399ef06f4ac3e7bcd5de6e343765588c6e419 100644 (file)
@@ -748,7 +748,7 @@ typedef struct {
 
 
 /**
- * private_bios_data - bios private data for boot devices
+ * struct private_bios_data - bios private data for boot devices
  * @geometry   : bits 0-3 - BIOS geometry, 0x0001 - 1GB, 0x0010 - 2GB,
  *             0x1000 - 8GB, Others values are invalid
  * @unused     : bits 4-7 are unused
index b50e27e660244ebf6e11a79adb8543557981742b..26e1e6c55654e0a71b4e272eac98ec6a43ec90fd 100644 (file)
 
 /**
  * scb_t - scsi command control block
- * @param ccb          : command control block for individual driver
- * @param list         : list of control blocks
- * @param gp           : general purpose field for LLDs
- * @param sno          : all SCBs have a serial number
- * @param scp          : associated scsi command
- * @param state                : current state of scb
- * @param dma_dir      : direction of data transfer
- * @param dma_type     : transfer with sg list, buffer, or no data transfer
- * @param dev_channel  : actual channel on the device
- * @param dev_target   : actual target on the device
- * @param status       : completion status
+ * @ccb                        : command control block for individual driver
+ * @list               : list of control blocks
+ * @gp                 : general purpose field for LLDs
+ * @sno                        : all SCBs have a serial number
+ * @scp                        : associated scsi command
+ * @state              : current state of scb
+ * @dma_dir            : direction of data transfer
+ * @dma_type           : transfer with sg list, buffer, or no data transfer
+ * @dev_channel                : actual channel on the device
+ * @dev_target         : actual target on the device
+ * @status             : completion status
  *
  * This is our central data structure to issue commands the each driver.
  * Driver specific data structures are maintained in the ccb field.
@@ -99,42 +99,42 @@ typedef struct {
 
 /**
  * struct adapter_t - driver's initialization structure
- * @param dpc_h                        : tasklet handle
- * @param pdev                 : pci configuration pointer for kernel
- * @param host                 : pointer to host structure of mid-layer
- * @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
- * @param kscb_list            : pointer to the bulk of SCBs pointers for IO
- * @param kscb_pool            : pool of free scbs for IO
- * @param kscb_pool_lock       : lock for pool of free scbs
- * @param pend_list            : pending commands list
- * @param pend_list_lock       : exlusion lock for pending commands list
- * @param completed_list       : list of completed commands
- * @param completed_list_lock  : exclusion lock for list of completed commands
- * @param sglen                        : max sg elements supported
- * @param device_ids           : to convert kernel device addr to our devices.
- * @param raid_device          : raid adapter specific pointer
- * @param max_channel          : maximum channel number supported - inclusive
- * @param max_target           : max target supported - inclusive
- * @param max_lun              : max lun supported - inclusive
- * @param unique_id            : unique identifier for each adapter
- * @param irq                  : IRQ for this adapter
- * @param ito                  : internal timeout value, (-1) means no timeout
- * @param ibuf                 : buffer to issue internal commands
- * @param ibuf_dma_h           : dma handle for the above buffer
- * @param uscb_list            : SCB pointers for user cmds, common mgmt module
- * @param uscb_pool            : pool of SCBs for user commands
- * @param uscb_pool_lock       : exclusion lock for these SCBs
- * @param max_cmds             : max outstanding commands
- * @param fw_version           : firmware version
- * @param bios_version         : bios version
- * @param max_cdb_sz           : biggest CDB size supported.
- * @param ha                   : is high availability present - clustering
- * @param init_id              : initiator ID, the default value should be 7
- * @param max_sectors          : max sectors per request
- * @param cmd_per_lun          : max outstanding commands per LUN
- * @param being_detached       : set when unloading, no more mgmt calls
+ * @aram dpc_h                 : tasklet handle
+ * @pdev                       : pci configuration pointer for kernel
+ * @host                       : pointer to host structure of mid-layer
+ * @lock                       : synchronization lock for mid-layer and driver
+ * @quiescent                  : driver is quiescent for now.
+ * @outstanding_cmds           : number of commands pending in the driver
+ * @kscb_list                  : pointer to the bulk of SCBs pointers for IO
+ * @kscb_pool                  : pool of free scbs for IO
+ * @kscb_pool_lock             : lock for pool of free scbs
+ * @pend_list                  : pending commands list
+ * @pend_list_lock             : exclusion lock for pending commands list
+ * @completed_list             : list of completed commands
+ * @completed_list_lock                : exclusion lock for list of completed commands
+ * @sglen                      : max sg elements supported
+ * @device_ids                 : to convert kernel device addr to our devices.
+ * @raid_device                        : raid adapter specific pointer
+ * @max_channel                        : maximum channel number supported - inclusive
+ * @max_target                 : max target supported - inclusive
+ * @max_lun                    : max lun supported - inclusive
+ * @unique_id                  : unique identifier for each adapter
+ * @irq                                : IRQ for this adapter
+ * @ito                                : internal timeout value, (-1) means no timeout
+ * @ibuf                       : buffer to issue internal commands
+ * @ibuf_dma_h                 : dma handle for the above buffer
+ * @uscb_list                  : SCB pointers for user cmds, common mgmt module
+ * @uscb_pool                  : pool of SCBs for user commands
+ * @uscb_pool_lock             : exclusion lock for these SCBs
+ * @max_cmds                   : max outstanding commands
+ * @fw_version                 : firmware version
+ * @bios_version               : bios version
+ * @max_cdb_sz                 : biggest CDB size supported.
+ * @ha                         : is high availability present - clustering
+ * @init_id                    : initiator ID, the default value should be 7
+ * @max_sectors                        : max sectors per request
+ * @cmd_per_lun                        : max outstanding commands per LUN
+ * @being_detached             : set when unloading, no more mgmt calls
  *
  *
  * mraid_setup_device_map() can be called anytime after the device map is
@@ -211,23 +211,23 @@ typedef struct {
 #define SCP2ADAPTER(scp)       (adapter_t *)SCSIHOST2ADAP(SCP2HOST(scp))
 
 
-/**
- * MRAID_GET_DEVICE_MAP - device ids
- * @param adp          - Adapter's soft state
- * @param scp          - mid-layer scsi command pointer
- * @param p_chan       - physical channel on the controller
- * @param target       - target id of the device or logical drive number
- * @param islogical    - set if the command is for the logical drive
- *
- * Macro to retrieve information about device class, logical or physical and
- * the corresponding physical channel and target or logical drive number
- **/
 #define MRAID_IS_LOGICAL(adp, scp)     \
        (SCP2CHANNEL(scp) == (adp)->max_channel) ? 1 : 0
 
 #define MRAID_IS_LOGICAL_SDEV(adp, sdev)       \
        (sdev->channel == (adp)->max_channel) ? 1 : 0
 
+/**
+ * MRAID_GET_DEVICE_MAP - device ids
+ * @adp                        : adapter's soft state
+ * @scp                        : mid-layer scsi command pointer
+ * @p_chan             : physical channel on the controller
+ * @target             : target id of the device or logical drive number
+ * @islogical          : set if the command is for the logical drive
+ *
+ * Macro to retrieve information about device class, logical or physical and
+ * the corresponding physical channel and target or logical drive number
+ */
 #define MRAID_GET_DEVICE_MAP(adp, scp, p_chan, target, islogical)      \
        /*                                                              \
         * Is the request coming for the virtual channel                \
@@ -271,10 +271,10 @@ typedef struct {
 #define ASSERT(expression)
 #endif
 
-/*
+/**
  * struct mraid_pci_blk - structure holds DMA memory block info
- * @param vaddr                : virtual address to a memory block
- * @param dma_addr     : DMA handle to a memory block
+ * @vaddr              : virtual address to a memory block
+ * @dma_addr           : DMA handle to a memory block
  *
  * This structure is filled up for the caller. It is the responsibilty of the
  * caller to allocate this array big enough to store addresses for all
index b8aa34202ec334cd296dc911dac9c754a27875bc..706fa05a187af715c9abc50fbf47cac4f8fcd2f2 100644 (file)
 
 #include "mbox_defs.h"
 
+/*
+ * console messages debug levels
+ */
+#define        CL_ANN          0       /* print unconditionally, announcements */
+#define CL_DLEVEL1     1       /* debug level 1, informative */
+#define CL_DLEVEL2     2       /* debug level 2, verbose */
+#define CL_DLEVEL3     3       /* debug level 3, very verbose */
+
 /**
  * con_log() - console log routine
- * @param level                : indicates the severity of the message.
- * @fparam mt          : format string
+ * @level              : indicates the severity of the message.
+ * @fmt                        : format string
  *
  * con_log displays the error messages on the console based on the current
  * debug level. Also it attaches the appropriate kernel severity level with
  * the message.
- *
- *
- * consolge messages debug levels
  */
-#define        CL_ANN          0       /* print unconditionally, announcements */
-#define CL_DLEVEL1     1       /* debug level 1, informative */
-#define CL_DLEVEL2     2       /* debug level 2, verbose */
-#define CL_DLEVEL3     3       /* debug level 3, very verbose */
-
 #define        con_log(level, fmt) if (LSI_DBGLVL >= level) printk fmt;
 
 /*
@@ -157,14 +157,14 @@ typedef struct uioc {
 /**
  * struct mraid_hba_info - information about the controller
  *
- * @param pci_vendor_id                : PCI vendor id
- * @param pci_device_id                : PCI device id
- * @param subsystem_vendor_id  : PCI subsystem vendor id
- * @param subsystem_device_id  : PCI subsystem device id
- * @param baseport             : base port of hba memory
- * @param pci_bus              : PCI bus
- * @param pci_dev_fn           : PCI device/function values
- * @param irq                  : interrupt vector for the device
+ * @pci_vendor_id              : PCI vendor id
+ * @pci_device_id              : PCI device id
+ * @subsystem_vendor_id                : PCI subsystem vendor id
+ * @subsystem_device_id                : PCI subsystem device id
+ * @baseport                   : base port of hba memory
+ * @pci_bus                    : PCI bus
+ * @pci_dev_fn                 : PCI device/function values
+ * @irq                                : interrupt vector for the device
  *
  * Extended information of 256 bytes about the controller. Align on the single
  * byte boundary so that 32-bit applications can be run on 64-bit platform
index 7bac86dda88f9fdc053105ae149e9c9753125421..04d0b6918c6167749dcac06d8ab9e8152f031995 100644 (file)
  *        2 of the License, or (at your option) any later version.
  *
  * FILE                : megaraid_mbox.c
- * Version     : v2.20.4.9 (Jul 16 2006)
+ * Version     : v2.20.5.1 (Nov 16 2006)
  *
  * Authors:
- *     Atul Mukker             <Atul.Mukker@lsil.com>
- *     Sreenivas Bagalkote     <Sreenivas.Bagalkote@lsil.com>
- *     Manoj Jose              <Manoj.Jose@lsil.com>
- *     Seokmann Ju             <Seokmann.Ju@lsil.com>
+ *     Atul Mukker             <Atul.Mukker@lsi.com>
+ *     Sreenivas Bagalkote     <Sreenivas.Bagalkote@lsi.com>
+ *     Manoj Jose              <Manoj.Jose@lsi.com>
+ *     Seokmann Ju
  *
  * List of supported controllers
  *
@@ -107,6 +107,7 @@ static int megaraid_mbox_support_random_del(adapter_t *);
 static int megaraid_mbox_get_max_sg(adapter_t *);
 static void megaraid_mbox_enum_raid_scsi(adapter_t *);
 static void megaraid_mbox_flush_cache(adapter_t *);
+static int megaraid_mbox_fire_sync_cmd(adapter_t *);
 
 static void megaraid_mbox_display_scb(adapter_t *, scb_t *);
 static void megaraid_mbox_setup_device_map(adapter_t *);
@@ -137,7 +138,7 @@ static int wait_till_fw_empty(adapter_t *);
 
 
 
-MODULE_AUTHOR("sju@lsil.com");
+MODULE_AUTHOR("megaraidlinux@lsi.com");
 MODULE_DESCRIPTION("LSI Logic MegaRAID Mailbox Driver");
 MODULE_LICENSE("GPL");
 MODULE_VERSION(MEGARAID_VERSION);
@@ -146,7 +147,7 @@ MODULE_VERSION(MEGARAID_VERSION);
  * ### modules parameters for driver ###
  */
 
-/**
+/*
  * Set to enable driver to expose unconfigured disk to kernel
  */
 static int megaraid_expose_unconf_disks = 0;
@@ -154,7 +155,7 @@ module_param_named(unconf_disks, megaraid_expose_unconf_disks, int, 0);
 MODULE_PARM_DESC(unconf_disks,
        "Set to expose unconfigured disks to kernel (default=0)");
 
-/**
+/*
  * driver wait time if the adapter's mailbox is busy
  */
 static unsigned int max_mbox_busy_wait = MBOX_BUSY_WAIT;
@@ -162,7 +163,7 @@ module_param_named(busy_wait, max_mbox_busy_wait, int, 0);
 MODULE_PARM_DESC(busy_wait,
        "Max wait for mailbox in microseconds if busy (default=10)");
 
-/**
+/*
  * number of sectors per IO command
  */
 static unsigned int megaraid_max_sectors = MBOX_MAX_SECTORS;
@@ -170,7 +171,7 @@ module_param_named(max_sectors, megaraid_max_sectors, int, 0);
 MODULE_PARM_DESC(max_sectors,
        "Maximum number of sectors per IO command (default=128)");
 
-/**
+/*
  * number of commands per logical unit
  */
 static unsigned int megaraid_cmd_per_lun = MBOX_DEF_CMD_PER_LUN;
@@ -179,7 +180,7 @@ MODULE_PARM_DESC(cmd_per_lun,
        "Maximum number of commands per logical unit (default=64)");
 
 
-/**
+/*
  * Fast driver load option, skip scanning for physical devices during load.
  * This would result in non-disk devices being skipped during driver load
  * time. These can be later added though, using /proc/scsi/scsi
@@ -190,7 +191,7 @@ MODULE_PARM_DESC(fast_load,
        "Faster loading of the driver, skips physical devices! (default=0)");
 
 
-/**
+/*
  * mraid_debug level - threshold for amount of information to be displayed by
  * the driver. This level can be changed through modules parameters, ioctl or
  * sysfs/proc interface. By default, print the announcement messages only.
@@ -337,7 +338,7 @@ static struct device_attribute *megaraid_sdev_attrs[] = {
  *
  * Return value:
  *     actual depth set
- **/
+ */
 static int megaraid_change_queue_depth(struct scsi_device *sdev, int qdepth)
 {
        if (qdepth > MBOX_MAX_SCSI_CMDS)
@@ -369,8 +370,8 @@ static struct scsi_host_template megaraid_template_g = {
  * megaraid_init - module load hook
  *
  * We register ourselves as hotplug enabled module and let PCI subsystem
- * discover our adaters
- **/
+ * discover our adapters.
+ */
 static int __init
 megaraid_init(void)
 {
@@ -405,7 +406,7 @@ megaraid_init(void)
 /**
  * megaraid_exit - driver unload entry point
  *
- * We simply unwrap the megaraid_init routine here
+ * We simply unwrap the megaraid_init routine here.
  */
 static void __exit
 megaraid_exit(void)
@@ -421,12 +422,12 @@ megaraid_exit(void)
 
 /**
  * megaraid_probe_one - PCI hotplug entry point
- * @param pdev : handle to this controller's PCI configuration space
- * @param id   : pci device id of the class of controllers
+ * @pdev       : handle to this controller's PCI configuration space
+ * @id         : pci device id of the class of controllers
  *
  * This routine should be called whenever a new adapter is detected by the
  * PCI hotplug susbsytem.
- **/
+ */
 static int __devinit
 megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
 {
@@ -542,16 +543,15 @@ out_probe_one:
 
 
 /**
- * megaraid_detach_one - release the framework resources and call LLD release
- * routine
- * @param pdev : handle for our PCI cofiguration space
+ * megaraid_detach_one - release framework resources and call LLD release routine
+ * @pdev       : handle for our PCI cofiguration space
  *
  * This routine is called during driver unload. We free all the allocated
  * resources and call the corresponding LLD so that it can also release all
  * its resources.
  *
- * This routine is also called from the PCI hotplug system
- **/
+ * This routine is also called from the PCI hotplug system.
+ */
 static void
 megaraid_detach_one(struct pci_dev *pdev)
 {
@@ -615,9 +615,9 @@ megaraid_detach_one(struct pci_dev *pdev)
 
 /**
  * megaraid_mbox_shutdown - PCI shutdown for megaraid HBA
- * @param device       : generice driver model device
+ * @pdev               : generic driver model device
  *
- * Shutdown notification, perform flush cache
+ * Shutdown notification, perform flush cache.
  */
 static void
 megaraid_mbox_shutdown(struct pci_dev *pdev)
@@ -643,10 +643,10 @@ megaraid_mbox_shutdown(struct pci_dev *pdev)
 
 /**
  * megaraid_io_attach - attach a device with the IO subsystem
- * @param adapter      : controller's soft state
+ * @adapter            : controller's soft state
  *
- * Attach this device with the IO subsystem
- **/
+ * Attach this device with the IO subsystem.
+ */
 static int
 megaraid_io_attach(adapter_t *adapter)
 {
@@ -695,10 +695,10 @@ megaraid_io_attach(adapter_t *adapter)
 
 /**
  * megaraid_io_detach - detach a device from the IO subsystem
- * @param adapter      : controller's soft state
+ * @adapter            : controller's soft state
  *
- * Detach this device from the IO subsystem
- **/
+ * Detach this device from the IO subsystem.
+ */
 static void
 megaraid_io_detach(adapter_t *adapter)
 {
@@ -722,13 +722,13 @@ megaraid_io_detach(adapter_t *adapter)
 
 /**
  * megaraid_init_mbox - initialize controller
- * @param adapter      - our soft state
+ * @adapter            : our soft state
  *
- * . Allocate 16-byte aligned mailbox memory for firmware handshake
- * . Allocate controller's memory resources
- * . Find out all initialization data
- * . Allocate memory required for all the commands
- * . Use internal library of FW routines, build up complete soft state
+ * - Allocate 16-byte aligned mailbox memory for firmware handshake
+ * - Allocate controller's memory resources
+ * - Find out all initialization data
+ * - Allocate memory required for all the commands
+ * - Use internal library of FW routines, build up complete soft state
  */
 static int __devinit
 megaraid_init_mbox(adapter_t *adapter)
@@ -779,33 +779,39 @@ megaraid_init_mbox(adapter_t *adapter)
                goto out_release_regions;
        }
 
-       //
-       // Setup the rest of the soft state using the library of FW routines
-       //
+       /* initialize the mutual exclusion lock for the mailbox */
+       spin_lock_init(&raid_dev->mailbox_lock);
 
-       // request IRQ and register the interrupt service routine
+       /* allocate memory required for commands */
+       if (megaraid_alloc_cmd_packets(adapter) != 0)
+               goto out_iounmap;
+
+       /*
+        * Issue SYNC cmd to flush the pending cmds in the adapter
+        * and initialize its internal state
+        */
+
+       if (megaraid_mbox_fire_sync_cmd(adapter))
+               con_log(CL_ANN, ("megaraid: sync cmd failed\n"));
+
+       /*
+        * Setup the rest of the soft state using the library of
+        * FW routines
+        */
+
+       /* request IRQ and register the interrupt service routine */
        if (request_irq(adapter->irq, megaraid_isr, IRQF_SHARED, "megaraid",
                adapter)) {
 
                con_log(CL_ANN, (KERN_WARNING
                        "megaraid: Couldn't register IRQ %d!\n", adapter->irq));
+               goto out_alloc_cmds;
 
-               goto out_iounmap;
-       }
-
-
-       // initialize the mutual exclusion lock for the mailbox
-       spin_lock_init(&raid_dev->mailbox_lock);
-
-       // allocate memory required for commands
-       if (megaraid_alloc_cmd_packets(adapter) != 0) {
-               goto out_free_irq;
        }
 
        // Product info
-       if (megaraid_mbox_product_info(adapter) != 0) {
-               goto out_alloc_cmds;
-       }
+       if (megaraid_mbox_product_info(adapter) != 0)
+               goto out_free_irq;
 
        // Do we support extended CDBs
        adapter->max_cdb_sz = 10;
@@ -874,9 +880,8 @@ megaraid_init_mbox(adapter_t *adapter)
         * Allocate resources required to issue FW calls, when sysfs is
         * accessed
         */
-       if (megaraid_sysfs_alloc_resources(adapter) != 0) {
-               goto out_alloc_cmds;
-       }
+       if (megaraid_sysfs_alloc_resources(adapter) != 0)
+               goto out_free_irq;
 
        // Set the DMA mask to 64-bit. All supported controllers as capable of
        // DMA in this range
@@ -920,10 +925,10 @@ megaraid_init_mbox(adapter_t *adapter)
 
 out_free_sysfs_res:
        megaraid_sysfs_free_resources(adapter);
-out_alloc_cmds:
-       megaraid_free_cmd_packets(adapter);
 out_free_irq:
        free_irq(adapter->irq, adapter);
+out_alloc_cmds:
+       megaraid_free_cmd_packets(adapter);
 out_iounmap:
        iounmap(raid_dev->baseaddr);
 out_release_regions:
@@ -937,7 +942,7 @@ out_free_raid_dev:
 
 /**
  * megaraid_fini_mbox - undo controller initialization
- * @param adapter      : our soft state
+ * @adapter            : our soft state
  */
 static void
 megaraid_fini_mbox(adapter_t *adapter)
@@ -967,12 +972,12 @@ megaraid_fini_mbox(adapter_t *adapter)
 
 /**
  * megaraid_alloc_cmd_packets - allocate shared mailbox
- * @param adapter      : soft state of the raid controller
+ * @adapter            : soft state of the raid controller
  *
  * Allocate and align the shared mailbox. This maibox is used to issue
  * all the commands. For IO based controllers, the mailbox is also regsitered
  * with the FW. Allocate memory for all commands as well.
- * This is our big allocator
+ * This is our big allocator.
  */
 static int
 megaraid_alloc_cmd_packets(adapter_t *adapter)
@@ -1132,9 +1137,9 @@ out_free_common_mbox:
 
 /**
  * megaraid_free_cmd_packets - free memory
- * @param adapter      : soft state of the raid controller
+ * @adapter            : soft state of the raid controller
  *
- * Release memory resources allocated for commands
+ * Release memory resources allocated for commands.
  */
 static void
 megaraid_free_cmd_packets(adapter_t *adapter)
@@ -1156,10 +1161,10 @@ megaraid_free_cmd_packets(adapter_t *adapter)
 
 /**
  * megaraid_mbox_setup_dma_pools - setup dma pool for command packets
- * @param adapter      : HBA soft state
+ * @adapter            : HBA soft state
  *
- * setup the dma pools for mailbox, passthru and extended passthru structures,
- * and scatter-gather lists
+ * Setup the dma pools for mailbox, passthru and extended passthru structures,
+ * and scatter-gather lists.
  */
 static int
 megaraid_mbox_setup_dma_pools(adapter_t *adapter)
@@ -1252,10 +1257,10 @@ fail_setup_dma_pool:
 
 /**
  * megaraid_mbox_teardown_dma_pools - teardown dma pools for command packets
- * @param adapter      : HBA soft state
+ * @adapter            : HBA soft state
  *
- * teardown the dma pool for mailbox, passthru and extended passthru
- * structures, and scatter-gather lists
+ * Teardown the dma pool for mailbox, passthru and extended passthru
+ * structures, and scatter-gather lists.
  */
 static void
 megaraid_mbox_teardown_dma_pools(adapter_t *adapter)
@@ -1300,10 +1305,11 @@ megaraid_mbox_teardown_dma_pools(adapter_t *adapter)
 /**
  * megaraid_alloc_scb - detach and return a scb from the free list
  * @adapter    : controller's soft state
+ * @scp                : pointer to the scsi command to be executed
  *
- * return the scb from the head of the free list. NULL if there are none
- * available
- **/
+ * Return the scb from the head of the free list. %NULL if there are none
+ * available.
+ */
 static scb_t *
 megaraid_alloc_scb(adapter_t *adapter, struct scsi_cmnd *scp)
 {
@@ -1337,11 +1343,11 @@ megaraid_alloc_scb(adapter_t *adapter, struct scsi_cmnd *scp)
  * @adapter    : controller's soft state
  * @scb                : scb to be freed
  *
- * return the scb back to the free list of scbs. The caller must 'flush' the
+ * Return the scb back to the free list of scbs. The caller must 'flush' the
  * SCB before calling us. E.g., performing pci_unamp and/or pci_sync etc.
  * NOTE NOTE: Make sure the scb is not on any list before calling this
  * routine.
- **/
+ */
 static inline void
 megaraid_dealloc_scb(adapter_t *adapter, scb_t *scb)
 {
@@ -1362,10 +1368,10 @@ megaraid_dealloc_scb(adapter_t *adapter, scb_t *scb)
 
 /**
  * megaraid_mbox_mksgl - make the scatter-gather list
- * @adapter    - controller's soft state
- * @scb                - scsi control block
+ * @adapter    : controller's soft state
+ * @scb                : scsi control block
  *
- * prepare the scatter-gather list
+ * Prepare the scatter-gather list.
  */
 static int
 megaraid_mbox_mksgl(adapter_t *adapter, scb_t *scb)
@@ -1435,10 +1441,10 @@ megaraid_mbox_mksgl(adapter_t *adapter, scb_t *scb)
 
 /**
  * mbox_post_cmd - issue a mailbox command
- * @adapter    - controller's soft state
- * @scb                - command to be issued
+ * @adapter    : controller's soft state
+ * @scb                : command to be issued
  *
- * post the command to the controller if mailbox is availble.
+ * Post the command to the controller if mailbox is available.
  */
 static int
 mbox_post_cmd(adapter_t *adapter, scb_t *scb)
@@ -1518,7 +1524,7 @@ mbox_post_cmd(adapter_t *adapter, scb_t *scb)
  * Queue entry point for mailbox based controllers.
  */
 static int
-megaraid_queue_command(struct scsi_cmnd *scp, void (* done)(struct scsi_cmnd *))
+megaraid_queue_command(struct scsi_cmnd *scp, void (*done)(struct scsi_cmnd *))
 {
        adapter_t       *adapter;
        scb_t           *scb;
@@ -1548,15 +1554,15 @@ megaraid_queue_command(struct scsi_cmnd *scp, void (* done)(struct scsi_cmnd *))
 }
 
 /**
- * megaraid_mbox_build_cmd - transform the mid-layer scsi command to megaraid
- * firmware lingua
- * @adapter    - controller's soft state
- * @scp                - mid-layer scsi command pointer
- * @busy       - set if request could not be completed because of lack of
+ * megaraid_mbox_build_cmd - transform the mid-layer scsi commands
+ * @adapter    : controller's soft state
+ * @scp                : mid-layer scsi command pointer
+ * @busy       : set if request could not be completed because of lack of
  *             resources
  *
- * convert the command issued by mid-layer to format understood by megaraid
- * firmware. We also complete certain command without sending them to firmware
+ * Transform the mid-layer scsi command to megaraid firmware lingua.
+ * Convert the command issued by mid-layer to format understood by megaraid
+ * firmware. We also complete certain commands without sending them to firmware.
  */
 static scb_t *
 megaraid_mbox_build_cmd(adapter_t *adapter, struct scsi_cmnd *scp, int *busy)
@@ -1937,9 +1943,9 @@ megaraid_mbox_build_cmd(adapter_t *adapter, struct scsi_cmnd *scp, int *busy)
 /**
  * megaraid_mbox_runpendq - execute commands queued in the pending queue
  * @adapter    : controller's soft state
- * @scb                : SCB to be queued in the pending list
+ * @scb_q      : SCB to be queued in the pending list
  *
- * scan the pending list for commands which are not yet issued and try to
+ * Scan the pending list for commands which are not yet issued and try to
  * post to the controller. The SCB can be a null pointer, which would indicate
  * no SCB to be queue, just try to execute the ones in the pending list.
  *
@@ -2012,11 +2018,11 @@ megaraid_mbox_runpendq(adapter_t *adapter, scb_t *scb_q)
 
 /**
  * megaraid_mbox_prepare_pthru - prepare a command for physical devices
- * @adapter    - pointer to controller's soft state
- * @scb                - scsi control block
- * @scp                - scsi command from the mid-layer
+ * @adapter    : pointer to controller's soft state
+ * @scb                : scsi control block
+ * @scp                : scsi command from the mid-layer
  *
- * prepare a command for the scsi physical devices
+ * Prepare a command for the scsi physical devices.
  */
 static void
 megaraid_mbox_prepare_pthru(adapter_t *adapter, scb_t *scb,
@@ -2060,12 +2066,12 @@ megaraid_mbox_prepare_pthru(adapter_t *adapter, scb_t *scb,
 
 /**
  * megaraid_mbox_prepare_epthru - prepare a command for physical devices
- * @adapter    - pointer to controller's soft state
- * @scb                - scsi control block
- * @scp                - scsi command from the mid-layer
+ * @adapter    : pointer to controller's soft state
+ * @scb                : scsi control block
+ * @scp                : scsi command from the mid-layer
  *
- * prepare a command for the scsi physical devices. This rountine prepares
- * commands for devices which can take extended CDBs (>10 bytes)
+ * Prepare a command for the scsi physical devices. This rountine prepares
+ * commands for devices which can take extended CDBs (>10 bytes).
  */
 static void
 megaraid_mbox_prepare_epthru(adapter_t *adapter, scb_t *scb,
@@ -2109,9 +2115,9 @@ megaraid_mbox_prepare_epthru(adapter_t *adapter, scb_t *scb,
 
 /**
  * megaraid_ack_sequence - interrupt ack sequence for memory mapped HBAs
- * @adapter    - controller's soft state
+ * @adapter    : controller's soft state
  *
- * Interrupt ackrowledgement sequence for memory mapped HBAs. Find out the
+ * Interrupt acknowledgement sequence for memory mapped HBAs. Find out the
  * completed command and put them on the completed list for later processing.
  *
  * Returns:    1 if the interrupt is valid, 0 otherwise
@@ -2224,9 +2230,8 @@ megaraid_ack_sequence(adapter_t *adapter)
 
 /**
  * megaraid_isr - isr for memory based mailbox based controllers
- * @irq                - irq
- * @devp       - pointer to our soft state
- * @regs       - unused
+ * @irq                : irq
+ * @devp       : pointer to our soft state
  *
  * Interrupt service routine for memory-mapped mailbox controllers.
  */
@@ -2671,7 +2676,7 @@ megaraid_abort_handler(struct scsi_cmnd *scp)
  * the FW is still live, in which case the outstanding commands counter mut go
  * down to 0. If that happens, also issue the reservation reset command to
  * relinquish (possible) reservations on the logical drives connected to this
- * host
+ * host.
  **/
 static int
 megaraid_reset_handler(struct scsi_cmnd *scp)
@@ -2823,11 +2828,11 @@ megaraid_reset_handler(struct scsi_cmnd *scp)
 
 /**
  * mbox_post_sync_cmd() - blocking command to the mailbox based controllers
- * @adapter    - controller's soft state
- * @raw_mbox   - the mailbox
+ * @adapter    : controller's soft state
+ * @raw_mbox   : the mailbox
  *
  * Issue a scb in synchronous and non-interrupt mode for mailbox based
- * controllers
+ * controllers.
  */
 static int
 mbox_post_sync_cmd(adapter_t *adapter, uint8_t raw_mbox[])
@@ -2955,12 +2960,12 @@ blocked_mailbox:
 
 /**
  * mbox_post_sync_cmd_fast - blocking command to the mailbox based controllers
- * @adapter    - controller's soft state
- * @raw_mbox   - the mailbox
+ * @adapter    : controller's soft state
+ * @raw_mbox   : the mailbox
  *
  * Issue a scb in synchronous and non-interrupt mode for mailbox based
  * controllers. This is a faster version of the synchronous command and
- * therefore can be called in interrupt-context as well
+ * therefore can be called in interrupt-context as well.
  */
 static int
 mbox_post_sync_cmd_fast(adapter_t *adapter, uint8_t raw_mbox[])
@@ -3008,10 +3013,10 @@ mbox_post_sync_cmd_fast(adapter_t *adapter, uint8_t raw_mbox[])
 
 /**
  * megaraid_busywait_mbox() - Wait until the controller's mailbox is available
- * @raid_dev   - RAID device (HBA) soft state
+ * @raid_dev   : RAID device (HBA) soft state
  *
- * wait until the controller's mailbox is available to accept more commands.
- * wait for at most 1 second
+ * Wait until the controller's mailbox is available to accept more commands.
+ * Wait for at most 1 second.
  */
 static int
 megaraid_busywait_mbox(mraid_device_t *raid_dev)
@@ -3032,9 +3037,9 @@ megaraid_busywait_mbox(mraid_device_t *raid_dev)
 
 /**
  * megaraid_mbox_product_info - some static information about the controller
- * @adapter    - our soft state
+ * @adapter    : our soft state
  *
- * issue commands to the controller to grab some parameters required by our
+ * Issue commands to the controller to grab some parameters required by our
  * caller.
  */
 static int
@@ -3157,10 +3162,10 @@ megaraid_mbox_product_info(adapter_t *adapter)
 
 /**
  * megaraid_mbox_extended_cdb - check for support for extended CDBs
- * @adapter    - soft state for the controller
+ * @adapter    : soft state for the controller
  *
- * this routine check whether the controller in question supports extended
- * ( > 10 bytes ) CDBs
+ * This routine check whether the controller in question supports extended
+ * ( > 10 bytes ) CDBs.
  */
 static int
 megaraid_mbox_extended_cdb(adapter_t *adapter)
@@ -3193,8 +3198,8 @@ megaraid_mbox_extended_cdb(adapter_t *adapter)
 
 /**
  * megaraid_mbox_support_ha - Do we support clustering
- * @adapter    - soft state for the controller
- * @init_id    - ID of the initiator
+ * @adapter    : soft state for the controller
+ * @init_id    : ID of the initiator
  *
  * Determine if the firmware supports clustering and the ID of the initiator.
  */
@@ -3236,9 +3241,9 @@ megaraid_mbox_support_ha(adapter_t *adapter, uint16_t *init_id)
 
 /**
  * megaraid_mbox_support_random_del - Do we support random deletion
- * @adapter    - soft state for the controller
+ * @adapter    : soft state for the controller
  *
- * Determine if the firmware supports random deletion
+ * Determine if the firmware supports random deletion.
  * Return:     1 is operation supported, 0 otherwise
  */
 static int
@@ -3271,10 +3276,10 @@ megaraid_mbox_support_random_del(adapter_t *adapter)
 
 /**
  * megaraid_mbox_get_max_sg - maximum sg elements supported by the firmware
- * @adapter    - soft state for the controller
+ * @adapter    : soft state for the controller
  *
  * Find out the maximum number of scatter-gather elements supported by the
- * firmware
+ * firmware.
  */
 static int
 megaraid_mbox_get_max_sg(adapter_t *adapter)
@@ -3311,10 +3316,10 @@ megaraid_mbox_get_max_sg(adapter_t *adapter)
 
 /**
  * megaraid_mbox_enum_raid_scsi - enumerate the RAID and SCSI channels
- * @adapter    - soft state for the controller
+ * @adapter    : soft state for the controller
  *
- * Enumerate the RAID and SCSI channels for ROMB platoforms so that channels
- * can be exported as regular SCSI channels
+ * Enumerate the RAID and SCSI channels for ROMB platforms so that channels
+ * can be exported as regular SCSI channels.
  */
 static void
 megaraid_mbox_enum_raid_scsi(adapter_t *adapter)
@@ -3348,9 +3353,9 @@ megaraid_mbox_enum_raid_scsi(adapter_t *adapter)
 
 /**
  * megaraid_mbox_flush_cache - flush adapter and disks cache
- * @param adapter      : soft state for the controller
+ * @adapter            : soft state for the controller
  *
- * Flush adapter cache followed by disks cache
+ * Flush adapter cache followed by disks cache.
  */
 static void
 megaraid_mbox_flush_cache(adapter_t *adapter)
@@ -3379,14 +3384,92 @@ megaraid_mbox_flush_cache(adapter_t *adapter)
 }
 
 
+/**
+ * megaraid_mbox_fire_sync_cmd - fire the sync cmd
+ * @adapter            : soft state for the controller
+ *
+ * Clears the pending cmds in FW and reinits its RAID structs.
+ */
+static int
+megaraid_mbox_fire_sync_cmd(adapter_t *adapter)
+{
+       mbox_t  *mbox;
+       uint8_t raw_mbox[sizeof(mbox_t)];
+       mraid_device_t  *raid_dev = ADAP2RAIDDEV(adapter);
+       mbox64_t *mbox64;
+       int     status = 0;
+       int i;
+       uint32_t dword;
+
+       mbox = (mbox_t *)raw_mbox;
+
+       memset((caddr_t)raw_mbox, 0, sizeof(mbox_t));
+
+       raw_mbox[0] = 0xFF;
+
+       mbox64  = raid_dev->mbox64;
+       mbox    = raid_dev->mbox;
+
+       /* Wait until mailbox is free */
+       if (megaraid_busywait_mbox(raid_dev) != 0) {
+               status = 1;
+               goto blocked_mailbox;
+       }
+
+       /* Copy mailbox data into host structure */
+       memcpy((caddr_t)mbox, (caddr_t)raw_mbox, 16);
+       mbox->cmdid             = 0xFE;
+       mbox->busy              = 1;
+       mbox->poll              = 0;
+       mbox->ack               = 0;
+       mbox->numstatus         = 0;
+       mbox->status            = 0;
+
+       wmb();
+       WRINDOOR(raid_dev, raid_dev->mbox_dma | 0x1);
+
+       /* Wait for maximum 1 min for status to post.
+        * If the Firmware SUPPORTS the ABOVE COMMAND,
+        * mbox->cmd will be set to 0
+        * else
+        * the firmware will reject the command with
+        * mbox->numstatus set to 1
+        */
+
+       i = 0;
+       status = 0;
+       while (!mbox->numstatus && mbox->cmd == 0xFF) {
+               rmb();
+               msleep(1);
+               i++;
+               if (i > 1000 * 60) {
+                       status = 1;
+                       break;
+               }
+       }
+       if (mbox->numstatus == 1)
+               status = 1; /*cmd not supported*/
+
+       /* Check for interrupt line */
+       dword = RDOUTDOOR(raid_dev);
+       WROUTDOOR(raid_dev, dword);
+       WRINDOOR(raid_dev,2);
+
+       return status;
+
+blocked_mailbox:
+       con_log(CL_ANN, (KERN_WARNING "megaraid: blocked mailbox\n"));
+       return status;
+}
+
 /**
  * megaraid_mbox_display_scb - display SCB information, mostly debug purposes
- * @param adapter      : controllers' soft state
- * @param scb          : SCB to be displayed
- * @param level        : debug level for console print
+ * @adapter            : controller's soft state
+ * @scb                        : SCB to be displayed
+ * @level              : debug level for console print
  *
  * Diplay information about the given SCB iff the current debug level is
- * verbose
+ * verbose.
  */
 static void
 megaraid_mbox_display_scb(adapter_t *adapter, scb_t *scb)
@@ -3434,7 +3517,7 @@ megaraid_mbox_display_scb(adapter_t *adapter, scb_t *scb)
  * scsi addresses and megaraid scsi and logical drive addresses. We export
  * scsi devices on their actual addresses, whereas the logical drives are
  * exported on a virtual scsi channel.
- **/
+ */
 static void
 megaraid_mbox_setup_device_map(adapter_t *adapter)
 {
@@ -3472,7 +3555,7 @@ megaraid_mbox_setup_device_map(adapter_t *adapter)
 
 /**
  * megaraid_cmm_register - register with the mangement module
- * @param adapter      : HBA soft state
+ * @adapter            : HBA soft state
  *
  * Register with the management module, which allows applications to issue
  * ioctl calls to the drivers. This interface is used by the management module
@@ -3562,11 +3645,11 @@ megaraid_cmm_register(adapter_t *adapter)
 
 /**
  * megaraid_cmm_unregister - un-register with the mangement module
- * @param adapter      : HBA soft state
+ * @adapter            : HBA soft state
  *
  * Un-register with the management module.
  * FIXME: mgmt module must return failure for unregister if it has pending
- * commands in LLD
+ * commands in LLD.
  */
 static int
 megaraid_cmm_unregister(adapter_t *adapter)
@@ -3579,9 +3662,9 @@ megaraid_cmm_unregister(adapter_t *adapter)
 
 /**
  * megaraid_mbox_mm_handler - interface for CMM to issue commands to LLD
- * @param drvr_data    : LLD specific data
- * @param kioc         : CMM interface packet
- * @param action       : command action
+ * @drvr_data          : LLD specific data
+ * @kioc               : CMM interface packet
+ * @action             : command action
  *
  * This routine is invoked whenever the Common Mangement Module (CMM) has a
  * command for us. The 'action' parameter specifies if this is a new command
@@ -3634,8 +3717,8 @@ megaraid_mbox_mm_handler(unsigned long drvr_data, uioc_t *kioc, uint32_t action)
 
 /**
  * megaraid_mbox_mm_command - issues commands routed through CMM
- * @param adapter      : HBA soft state
- * @param kioc         : management command packet
+ * @adapter            : HBA soft state
+ * @kioc               : management command packet
  *
  * Issues commands, which are routed through the management module.
  */
@@ -3804,8 +3887,8 @@ megaraid_mbox_mm_done(adapter_t *adapter, scb_t *scb)
 
 /**
  * gather_hbainfo - HBA characteristics for the applications
- * @param adapter      : HBA soft state
- * @param hinfo                : pointer to the caller's host info strucuture
+ * @adapter            : HBA soft state
+ * @hinfo              : pointer to the caller's host info strucuture
  */
 static int
 gather_hbainfo(adapter_t *adapter, mraid_hba_info_t *hinfo)
@@ -3839,16 +3922,15 @@ gather_hbainfo(adapter_t *adapter, mraid_hba_info_t *hinfo)
 
 /**
  * megaraid_sysfs_alloc_resources - allocate sysfs related resources
+ * @adapter    : controller's soft state
  *
  * Allocate packets required to issue FW calls whenever the sysfs attributes
  * are read. These attributes would require up-to-date information from the
  * FW. Also set up resources for mutual exclusion to share these resources and
  * the wait queue.
  *
- * @param adapter : controller's soft state
- *
- * @return 0 on success
- * @return -ERROR_CODE on failure
+ * Return 0 on success.
+ * Return -ERROR_CODE on failure.
  */
 static int
 megaraid_sysfs_alloc_resources(adapter_t *adapter)
@@ -3885,10 +3967,9 @@ megaraid_sysfs_alloc_resources(adapter_t *adapter)
 
 /**
  * megaraid_sysfs_free_resources - free sysfs related resources
+ * @adapter    : controller's soft state
  *
  * Free packets allocated for sysfs FW commands
- *
- * @param adapter : controller's soft state
  */
 static void
 megaraid_sysfs_free_resources(adapter_t *adapter)
@@ -3907,10 +3988,9 @@ megaraid_sysfs_free_resources(adapter_t *adapter)
 
 /**
  * megaraid_sysfs_get_ldmap_done - callback for get ldmap
+ * @uioc       : completed packet
  *
  * Callback routine called in the ISR/tasklet context for get ldmap call
- *
- * @param uioc : completed packet
  */
 static void
 megaraid_sysfs_get_ldmap_done(uioc_t *uioc)
@@ -3926,12 +4006,11 @@ megaraid_sysfs_get_ldmap_done(uioc_t *uioc)
 
 /**
  * megaraid_sysfs_get_ldmap_timeout - timeout handling for get ldmap
+ * @data       : timed out packet
  *
  * Timeout routine to recover and return to application, in case the adapter
- * has stopped responding. A timeout of 60 seconds for this command seem like
- * a good value
- *
- * @param uioc : timed out packet
+ * has stopped responding. A timeout of 60 seconds for this command seems like
+ * a good value.
  */
 static void
 megaraid_sysfs_get_ldmap_timeout(unsigned long data)
@@ -3948,6 +4027,7 @@ megaraid_sysfs_get_ldmap_timeout(unsigned long data)
 
 /**
  * megaraid_sysfs_get_ldmap - get update logical drive map
+ * @adapter    : controller's soft state
  *
  * This routine will be called whenever user reads the logical drive
  * attributes, go get the current logical drive mapping table from the
@@ -3959,10 +4039,8 @@ megaraid_sysfs_get_ldmap_timeout(unsigned long data)
  * standalone libary. For now, this should suffice since there is no other
  * user of this interface.
  *
- * @param adapter : controller's soft state
- *
- * @return 0 on success
- * @return -1 on failure
+ * Return 0 on success.
+ * Return -1 on failure.
  */
 static int
 megaraid_sysfs_get_ldmap(adapter_t *adapter)
@@ -4064,13 +4142,12 @@ megaraid_sysfs_get_ldmap(adapter_t *adapter)
 
 /**
  * megaraid_sysfs_show_app_hndl - display application handle for this adapter
+ * @cdev       : class device object representation for the host
+ * @buf                : buffer to send data to
  *
  * Display the handle used by the applications while executing management
  * tasks on the adapter. We invoke a management module API to get the adapter
  * handle, since we do not interface with applications directly.
- *
- * @param cdev : class device object representation for the host
- * @param buf  : buffer to send data to
  */
 static ssize_t
 megaraid_sysfs_show_app_hndl(struct class_device *cdev, char *buf)
@@ -4087,16 +4164,18 @@ megaraid_sysfs_show_app_hndl(struct class_device *cdev, char *buf)
 
 /**
  * megaraid_sysfs_show_ldnum - display the logical drive number for this device
+ * @dev                : device object representation for the scsi device
+ * @attr       : device attribute to show
+ * @buf                : buffer to send data to
  *
  * Display the logical drive number for the device in question, if it a valid
- * logical drive. For physical devices, "-1" is returned
- * The logical drive number is displayed in following format
+ * logical drive. For physical devices, "-1" is returned.
+ *
+ * The logical drive number is displayed in following format:
  *
  * <SCSI ID> <LD NUM> <LD STICKY ID> <APP ADAPTER HANDLE>
- *   <int>     <int>       <int>            <int>
  *
- * @param dev  : device object representation for the scsi device
- * @param buf  : buffer to send data to
+ *   <int>     <int>       <int>            <int>
  */
 static ssize_t
 megaraid_sysfs_show_ldnum(struct device *dev, struct device_attribute *attr, char *buf)
index 2b5a3285f799829b840baf04d603e03dc8835ec9..9de803cebd4badec858161d679a0b85905b9026a 100644 (file)
@@ -21,8 +21,8 @@
 #include "megaraid_ioctl.h"
 
 
-#define MEGARAID_VERSION       "2.20.4.9"
-#define MEGARAID_EXT_VERSION   "(Release Date: Sun Jul 16 12:27:22 EST 2006)"
+#define MEGARAID_VERSION       "2.20.5.1"
+#define MEGARAID_EXT_VERSION   "(Release Date: Thu Nov 16 15:32:35 EST 2006)"
 
 
 /*
@@ -146,27 +146,27 @@ typedef struct {
 
 /**
  * mraid_device_t - adapter soft state structure for mailbox controllers
- * @param una_mbox64           : 64-bit mbox - unaligned
- * @param una_mbox64_dma       : mbox dma addr - unaligned
- * @param mbox                 : 32-bit mbox - aligned
- * @param mbox64               : 64-bit mbox - aligned
- * @param mbox_dma             : mbox dma addr - aligned
- * @param mailbox_lock         : exclusion lock for the mailbox
- * @param baseport             : base port of hba memory
- * @param baseaddr             : mapped addr of hba memory
- * @param mbox_pool            : pool of mailboxes
- * @param mbox_pool_handle     : handle for the mailbox pool memory
- * @param epthru_pool          : a pool for extended passthru commands
- * @param epthru_pool_handle   : handle to the pool above
- * @param sg_pool              : pool of scatter-gather lists for this driver
- * @param sg_pool_handle       : handle to the pool above
- * @param ccb_list             : list of our command control blocks
- * @param uccb_list            : list of cmd control blocks for mgmt module
- * @param umbox64              : array of mailbox for user commands (cmm)
- * @param pdrv_state           : array for state of each physical drive.
- * @param last_disp            : flag used to show device scanning
- * @param hw_error             : set if FW not responding
- * @param fast_load            : If set, skip physical device scanning
+ * @una_mbox64                 : 64-bit mbox - unaligned
+ * @una_mbox64_dma             : mbox dma addr - unaligned
+ * @mbox                       : 32-bit mbox - aligned
+ * @mbox64                     : 64-bit mbox - aligned
+ * @mbox_dma                   : mbox dma addr - aligned
+ * @mailbox_lock               : exclusion lock for the mailbox
+ * @baseport                   : base port of hba memory
+ * @baseaddr                   : mapped addr of hba memory
+ * @mbox_pool                  : pool of mailboxes
+ * @mbox_pool_handle           : handle for the mailbox pool memory
+ * @epthru_pool                        : a pool for extended passthru commands
+ * @epthru_pool_handle         : handle to the pool above
+ * @sg_pool                    : pool of scatter-gather lists for this driver
+ * @sg_pool_handle             : handle to the pool above
+ * @ccb_list                   : list of our command control blocks
+ * @uccb_list                  : list of cmd control blocks for mgmt module
+ * @umbox64                    : array of mailbox for user commands (cmm)
+ * @pdrv_state                 : array for state of each physical drive.
+ * @last_disp                  : flag used to show device scanning
+ * @hw_error                   : set if FW not responding
+ * @fast_load                  : If set, skip physical device scanning
  * @channel_class              : channel class, RAID or SCSI
  * @sysfs_sem                  : semaphore to serialize access to sysfs res.
  * @sysfs_uioc                 : management packet to issue FW calls from sysfs
index d85b9a8f1b8d94e5040e598b35b957f9a90ff1a7..f33a678f0897d749788ec7e2ed35e742019f1c18 100644 (file)
@@ -67,7 +67,7 @@ static struct list_head adapters_list_g;
 
 static wait_queue_head_t wait_q;
 
-static struct file_operations lsi_fops = {
+static const struct file_operations lsi_fops = {
        .open   = mraid_mm_open,
        .ioctl  = mraid_mm_ioctl,
 #ifdef CONFIG_COMPAT
@@ -78,10 +78,10 @@ static struct file_operations lsi_fops = {
 
 /**
  * mraid_mm_open - open routine for char node interface
- * @inod       : unused
+ * @inode      : unused
  * @filep      : unused
  *
- * allow ioctl operations by apps only if they superuser privilege
+ * Allow ioctl operations by apps only if they have superuser privilege.
  */
 static int
 mraid_mm_open(struct inode *inode, struct file *filep)
@@ -214,7 +214,9 @@ mraid_mm_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
 /**
  * mraid_mm_get_adapter - Returns corresponding adapters for the mimd packet
  * @umimd      : User space mimd_t ioctl packet
- * @adapter    : pointer to the adapter (OUT)
+ * @rval       : returned success/error status
+ *
+ * The function return value is a pointer to the located @adapter.
  */
 static mraid_mmadp_t *
 mraid_mm_get_adapter(mimd_t __user *umimd, int *rval)
@@ -252,11 +254,11 @@ mraid_mm_get_adapter(mimd_t __user *umimd, int *rval)
        return adapter;
 }
 
-/*
- * handle_drvrcmd - This routine checks if the opcode is a driver
- *                       cmd and if it is, handles it.
+/**
+ * handle_drvrcmd - Checks if the opcode is a driver cmd and if it is, handles it.
  * @arg                : packet sent by the user app
  * @old_ioctl  : mimd if 1; uioc otherwise
+ * @rval       : pointer for command's returned value (not function status)
  */
 static int
 handle_drvrcmd(void __user *arg, uint8_t old_ioctl, int *rval)
@@ -322,8 +324,8 @@ old_packet:
 
 /**
  * mimd_to_kioc        - Converter from old to new ioctl format
- *
  * @umimd      : user space old MIMD IOCTL
+ * @adp                : adapter softstate
  * @kioc       : kernel space new format IOCTL
  *
  * Routine to convert MIMD interface IOCTL to new interface IOCTL packet. The
@@ -474,7 +476,6 @@ mimd_to_kioc(mimd_t __user *umimd, mraid_mmadp_t *adp, uioc_t *kioc)
 
 /**
  * mraid_mm_attch_buf - Attach a free dma buffer for required size
- *
  * @adp                : Adapter softstate
  * @kioc       : kioc that the buffer needs to be attached to
  * @xferlen    : required length for buffer
@@ -607,7 +608,6 @@ mraid_mm_alloc_kioc(mraid_mmadp_t *adp)
 
 /**
  * mraid_mm_dealloc_kioc - Return kioc to free pool
- *
  * @adp                : Adapter softstate
  * @kioc       : uioc_t node to be returned to free pool
  */
@@ -652,7 +652,6 @@ mraid_mm_dealloc_kioc(mraid_mmadp_t *adp, uioc_t *kioc)
 
 /**
  * lld_ioctl - Routine to issue ioctl to low level drvr
- *
  * @adp                : The adapter handle
  * @kioc       : The ioctl packet with kernel addresses
  */
@@ -705,7 +704,6 @@ lld_ioctl(mraid_mmadp_t *adp, uioc_t *kioc)
 
 /**
  * ioctl_done - callback from the low level driver
- *
  * @kioc       : completed ioctl packet
  */
 static void
@@ -756,9 +754,8 @@ ioctl_done(uioc_t *kioc)
 }
 
 
-/*
- * lld_timedout        : callback from the expired timer
- *
+/**
+ * lld_timedout        - callback from the expired timer
  * @ptr                : ioctl packet that timed out
  */
 static void
@@ -776,8 +773,7 @@ lld_timedout(unsigned long ptr)
 
 
 /**
- * kioc_to_mimd        : Converter from new back to old format
- *
+ * kioc_to_mimd        - Converter from new back to old format
  * @kioc       : Kernel space IOCTL packet (successfully issued)
  * @mimd       : User space MIMD packet
  */
@@ -855,7 +851,6 @@ kioc_to_mimd(uioc_t *kioc, mimd_t __user *mimd)
 
 /**
  * hinfo_to_cinfo - Convert new format hba info into old format
- *
  * @hinfo      : New format, more comprehensive adapter info
  * @cinfo      : Old format adapter info to support mimd_t apps
  */
@@ -878,10 +873,9 @@ hinfo_to_cinfo(mraid_hba_info_t *hinfo, mcontroller_t *cinfo)
 }
 
 
-/*
- * mraid_mm_register_adp - Registration routine for low level drvrs
- *
- * @adp        : Adapter objejct
+/**
+ * mraid_mm_register_adp - Registration routine for low level drivers
+ * @lld_adp    : Adapter objejct
  */
 int
 mraid_mm_register_adp(mraid_mmadp_t *lld_adp)
@@ -1007,15 +1001,14 @@ memalloc_error:
 
 /**
  * mraid_mm_adapter_app_handle - return the application handle for this adapter
+ * @unique_id  : adapter unique identifier
  *
- * For the given driver data, locate the adadpter in our global list and
+ * For the given driver data, locate the adapter in our global list and
  * return the corresponding handle, which is also used by applications to
  * uniquely identify an adapter.
  *
- * @param unique_id : adapter unique identifier
- *
- * @return adapter handle if found in the list
- * @return 0 if adapter could not be located, should never happen though
+ * Return adapter handle if found in the list.
+ * Return 0 if adapter could not be located, should never happen though.
  */
 uint32_t
 mraid_mm_adapter_app_handle(uint32_t unique_id)
@@ -1040,7 +1033,6 @@ mraid_mm_adapter_app_handle(uint32_t unique_id)
 
 /**
  * mraid_mm_setup_dma_pools - Set up dma buffer pools per adapter
- *
  * @adp        : Adapter softstate
  *
  * We maintain a pool of dma buffers per each adapter. Each pool has one
@@ -1093,11 +1085,11 @@ dma_pool_setup_error:
 }
 
 
-/*
+/**
  * mraid_mm_unregister_adp - Unregister routine for low level drivers
- *                               Assume no outstanding ioctls to llds.
- *
  * @unique_id  : UID of the adpater
+ *
+ * Assumes no outstanding ioctls to llds.
  */
 int
 mraid_mm_unregister_adp(uint32_t unique_id)
@@ -1131,7 +1123,6 @@ mraid_mm_unregister_adp(uint32_t unique_id)
 
 /**
  * mraid_mm_free_adp_resources - Free adapter softstate
- *
  * @adp        : Adapter softstate
  */
 static void
@@ -1162,7 +1153,6 @@ mraid_mm_free_adp_resources(mraid_mmadp_t *adp)
 
 /**
  * mraid_mm_teardown_dma_pools - Free all per adapter dma buffers
- *
  * @adp        : Adapter softstate
  */
 static void
@@ -1190,7 +1180,7 @@ mraid_mm_teardown_dma_pools(mraid_mmadp_t *adp)
 }
 
 /**
- * mraid_mm_init       : Module entry point
+ * mraid_mm_init       - Module entry point
  */
 static int __init
 mraid_mm_init(void)
@@ -1214,10 +1204,13 @@ mraid_mm_init(void)
 }
 
 
+#ifdef CONFIG_COMPAT
 /**
- * mraid_mm_compat_ioctl       : 32bit to 64bit ioctl conversion routine
+ * mraid_mm_compat_ioctl       - 32bit to 64bit ioctl conversion routine
+ * @filep      : file operations pointer (ignored)
+ * @cmd                : ioctl command
+ * @arg                : user ioctl packet
  */
-#ifdef CONFIG_COMPAT
 static long
 mraid_mm_compat_ioctl(struct file *filep, unsigned int cmd,
                      unsigned long arg)
@@ -1231,7 +1224,7 @@ mraid_mm_compat_ioctl(struct file *filep, unsigned int cmd,
 #endif
 
 /**
- * mraid_mm_exit       : Module exit point
+ * mraid_mm_exit       - Module exit point
  */
 static void __exit
 mraid_mm_exit(void)
index b5bdd0d7a8bf09b508c361713d1bf4ff2526de6b..15e24fcc84f3b871f9f69c0621419ea91d61e60c 100644 (file)
@@ -2913,7 +2913,7 @@ megasas_mgmt_compat_ioctl(struct file *file, unsigned int cmd,
 /*
  * File operations structure for management interface
  */
-static struct file_operations megasas_mgmt_fops = {
+static const struct file_operations megasas_mgmt_fops = {
        .owner = THIS_MODULE,
        .open = megasas_mgmt_open,
        .release = megasas_mgmt_release,
index 55eddcf8eb156896138d07e75ce79f362e65aadf..cacb3ad92527cd44eac2a31a7b4007fdaac4ee17 100644 (file)
@@ -15,7 +15,7 @@
 #ifndef LSI_MEGARAID_SAS_H
 #define LSI_MEGARAID_SAS_H
 
-/**
+/*
  * MegaRAID SAS Driver meta data
  */
 #define MEGASAS_VERSION                                "00.00.03.05"
@@ -40,7 +40,7 @@
  * "message frames"
  */
 
-/**
+/*
  * FW posts its state in upper 4 bits of outbound_msg_0 register
  */
 #define MFI_STATE_MASK                         0xF0000000
@@ -58,7 +58,7 @@
 
 #define MEGAMFI_FRAME_SIZE                     64
 
-/**
+/*
  * During FW init, clear pending cmds & reset state using inbound_msg_0
  *
  * ABORT       : Abort all pending cmds
@@ -78,7 +78,7 @@
                                                MFI_INIT_MFIMODE| \
                                                MFI_INIT_ABORT
 
-/**
+/*
  * MFI frame flags
  */
 #define MFI_FRAME_POST_IN_REPLY_QUEUE          0x0000
 #define MFI_FRAME_DIR_READ                     0x0010
 #define MFI_FRAME_DIR_BOTH                     0x0018
 
-/**
+/*
  * Definition for cmd_status
  */
 #define MFI_CMD_STATUS_POLL_MODE               0xFF
 
-/**
+/*
  * MFI command opcodes
  */
 #define MFI_CMD_INIT                           0x00
 #define MR_DCMD_CLUSTER_RESET_ALL              0x08010100
 #define MR_DCMD_CLUSTER_RESET_LD               0x08010200
 
-/**
+/*
  * MFI command completion codes
  */
 enum MFI_STAT {
index 1ddd7a11a9588a22330abe898e0045af4a0862d6..be41aadccae569918dd7259c5290133bd1cf3997 100644 (file)
@@ -1,7 +1,6 @@
 #include <linux/types.h>
 #include <linux/mm.h>
 #include <linux/blkdev.h>
-#include <linux/sched.h>
 #include <linux/interrupt.h>
 
 #include <asm/page.h>
index 890e9e232dab9afba81463f0cbe3b04cfbafc406..575fe6f7e0ec6d965f848c62f9733aabbea77a90 100644 (file)
@@ -6,7 +6,6 @@
 #include <linux/types.h>
 #include <linux/mm.h>
 #include <linux/blkdev.h>
-#include <linux/sched.h>
 
 #include <asm/page.h>
 #include <asm/pgtable.h>
index 7c13f6f4a4c653d77596ed9cc005820041068180..f6f561d26bf0c9c317d133e9ee9110444856eb6a 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/timer.h>
index bd6bbf61adb8e082ed99a6407e232531677df892..9668b73872c785e419e656919abc5bdc5424a2a3 100644 (file)
@@ -5522,7 +5522,7 @@ __setup("osst=", osst_setup);
 
 #endif
 
-static struct file_operations osst_fops = {
+static const struct file_operations osst_fops = {
        .owner =        THIS_MODULE,
        .read =         osst_read,
        .write =        osst_write,
index 1434209a8ac54a99dc618310d7065490b2de5988..ee59656599714e25bf47cdd2eb1ed875e252fa54 100644 (file)
 #include <asm/system.h>
 #include <linux/signal.h>
 #include <linux/proc_fs.h>
-#include <linux/sched.h>
 #include <asm/io.h>
 #include <asm/dma.h>
 #include <linux/blkdev.h>
index aad362ba02e0d81f93978bf61a7801775c773181..370802d24acd1157ea6421bcaabdc17c9b079ed0 100644 (file)
@@ -37,7 +37,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/ioport.h>
index a1c5f265069f0b7d6db2b8e6e7688a57f381a40d..4b82b2021981a5598c4861867d6d31236bc8f532 100644 (file)
@@ -34,7 +34,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/ioport.h>
index e16fe361436e845f1a295ba8ae433f3ff7901d2a..c6f8c6e65e057105a9d240cf7db8dbfa21313682 100644 (file)
@@ -31,7 +31,6 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/timer.h>
index 625ca97da52d526893e690a85c805b88f5d2817c..9102cbdf13594321724195fba9f80b907b4d9ca0 100644 (file)
@@ -290,7 +290,6 @@ typedef struct _nsp_hw_data {
 #endif
 } nsp_hw_data;
 
-
 /****************************************************************************
  *
  */
@@ -302,22 +301,13 @@ static int        nsp_cs_config (struct pcmcia_device *link);
 
 /* Linux SCSI subsystem specific functions */
 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 (struct scsi_host_template *sht);
-static        int        nsp_release_old(struct Scsi_Host *shpnt);
-#endif
 static const  char      *nsp_info       (struct Scsi_Host *shpnt);
 static        int        nsp_proc_info  (
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
                                         struct Scsi_Host *host,
-#endif
                                         char   *buffer,
                                         char  **start,
                                         off_t   offset,
                                         int     length,
-#if !(LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))
-                                        int     hostno,
-#endif
                                         int     inout);
 static int nsp_queuecommand(struct scsi_cmnd *SCpnt,
                            void (* done)(struct scsi_cmnd *SCpnt));
@@ -356,7 +346,6 @@ static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht);
 static int  __init nsp_cs_init(void);
 static void __exit nsp_cs_exit(void);
 
-
 /* Debug */
 #ifdef NSP_DEBUG
 static void show_command (struct scsi_cmnd *SCpnt);
@@ -401,7 +390,6 @@ enum _burst_mode {
        BURST_MEM32 = 2,
 };
 
-
 /**************************************************************************
  * SCSI messaage
  */
@@ -413,62 +401,8 @@ enum _burst_mode {
 
 #define MSG_EXT_SDTR         0x01
 
-
-/**************************************************************************
- * Compatibility functions
- */
-
-/* for Kernel 2.4 */
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0))
-#  define scsi_register_host(template)   scsi_register_module(MODULE_SCSI_HA, template)
-#  define scsi_unregister_host(template) scsi_unregister_module(MODULE_SCSI_HA, template)
-#  define scsi_host_put(host)            scsi_unregister(host)
-
-typedef void irqreturn_t;
-#  define IRQ_NONE      /* */
-#  define IRQ_HANDLED   /* */
-#  define IRQ_RETVAL(x) /* */
-
-/* This is ad-hoc version of scsi_host_get_next() */
-static inline struct Scsi_Host *scsi_host_get_next(struct Scsi_Host *host)
-{
-       if (host == NULL) {
-               return scsi_hostlist;
-       } else {
-               return host->next;
-       }
-}
-
-/* This is ad-hoc version of scsi_host_hn_get() */
-static inline struct Scsi_Host *scsi_host_hn_get(unsigned short hostno)
-{
-       struct Scsi_Host *host;
-
-       for (host = scsi_host_get_next(NULL); host != NULL;
-            host = scsi_host_get_next(host)) {
-               if (host->host_no == hostno) {
-                       break;
-               }
-       }
-
-       return host;
-}
-
-static void cs_error(struct pcmcia_device *handle, int func, int ret)
-{
-       error_info_t err = { func, ret };
-       pcmcia_report_error(handle, &err);
-}
-
-/* scatter-gather table */
-#  define BUFFER_ADDR (SCpnt->SCp.buffer->address)
-#endif
-
-/* for Kernel 2.6 */
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
 /* scatter-gather table */
 #  define BUFFER_ADDR ((char *)((unsigned int)(SCpnt->SCp.buffer->page) + SCpnt->SCp.buffer->offset))
-#endif
 
 #endif  /*__nsp_cs__*/
 /* end */
index 9d431fe7f47ff97bf29757e88f608a8540384f08..697cfb76c3a4171412789ab8f563a15223a4c44a 100644 (file)
@@ -34,7 +34,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/ioport.h>
index 5b458d2478f7f92eea58a059cfdc6fa0b8ce0dd6..ffe75c431b2561e7aaa7fd9fbd0d9061eb22a3ca 100644 (file)
@@ -54,7 +54,6 @@
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/ioport.h>
index 1548d42a3b4390781320fde64dddec2ae4316b8b..6777e8a69153a9a7c6eabc671ac4ea8a7ae2d642 100644 (file)
 #include <linux/ioport.h>
 #include <linux/delay.h>
 #include <linux/timer.h>
-#include <linux/sched.h>
 #include <linux/pci.h>
 #include <linux/proc_fs.h>
 #include <linux/stat.h>
index 7b18a6c7b7eb0de125e2cd7bfb2581c786378de5..8081b637d97e06550253eb0ddb12bfba0ef27ba5 100644 (file)
@@ -140,6 +140,8 @@ qla2x00_sysfs_write_nvram(struct kobject *kobj, char *buf, loff_t off,
        ha->isp_ops.write_nvram(ha, (uint8_t *)buf, ha->nvram_base, count);
        spin_unlock_irqrestore(&ha->hardware_lock, flags);
 
+       set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
+
        return (count);
 }
 
@@ -653,6 +655,43 @@ qla2x00_beacon_store(struct class_device *cdev, const char *buf,
        return count;
 }
 
+static ssize_t
+qla2x00_optrom_bios_version_show(struct class_device *cdev, char *buf)
+{
+       scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));
+
+       return snprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->bios_revision[1],
+           ha->bios_revision[0]);
+}
+
+static ssize_t
+qla2x00_optrom_efi_version_show(struct class_device *cdev, char *buf)
+{
+       scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));
+
+       return snprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->efi_revision[1],
+           ha->efi_revision[0]);
+}
+
+static ssize_t
+qla2x00_optrom_fcode_version_show(struct class_device *cdev, char *buf)
+{
+       scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));
+
+       return snprintf(buf, PAGE_SIZE, "%d.%02d\n", ha->fcode_revision[1],
+           ha->fcode_revision[0]);
+}
+
+static ssize_t
+qla2x00_optrom_fw_version_show(struct class_device *cdev, char *buf)
+{
+       scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev));
+
+       return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d %d\n",
+           ha->fw_revision[0], ha->fw_revision[1], ha->fw_revision[2],
+           ha->fw_revision[3]);
+}
+
 static CLASS_DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show,
        NULL);
 static CLASS_DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL);
@@ -669,6 +708,14 @@ static CLASS_DEVICE_ATTR(zio_timer, S_IRUGO | S_IWUSR, qla2x00_zio_timer_show,
     qla2x00_zio_timer_store);
 static CLASS_DEVICE_ATTR(beacon, S_IRUGO | S_IWUSR, qla2x00_beacon_show,
     qla2x00_beacon_store);
+static CLASS_DEVICE_ATTR(optrom_bios_version, S_IRUGO,
+    qla2x00_optrom_bios_version_show, NULL);
+static CLASS_DEVICE_ATTR(optrom_efi_version, S_IRUGO,
+    qla2x00_optrom_efi_version_show, NULL);
+static CLASS_DEVICE_ATTR(optrom_fcode_version, S_IRUGO,
+    qla2x00_optrom_fcode_version_show, NULL);
+static CLASS_DEVICE_ATTR(optrom_fw_version, S_IRUGO,
+    qla2x00_optrom_fw_version_show, NULL);
 
 struct class_device_attribute *qla2x00_host_attrs[] = {
        &class_device_attr_driver_version,
@@ -683,6 +730,10 @@ struct class_device_attribute *qla2x00_host_attrs[] = {
        &class_device_attr_zio,
        &class_device_attr_zio_timer,
        &class_device_attr_beacon,
+       &class_device_attr_optrom_bios_version,
+       &class_device_attr_optrom_efi_version,
+       &class_device_attr_optrom_fcode_version,
+       &class_device_attr_optrom_fw_version,
        NULL,
 };
 
@@ -836,21 +887,24 @@ qla2x00_get_fc_host_stats(struct Scsi_Host *shost)
        link_stat_t stat_buf;
        struct fc_host_statistics *pfc_host_stat;
 
+       rval = QLA_FUNCTION_FAILED;
        pfc_host_stat = &ha->fc_host_stat;
        memset(pfc_host_stat, -1, sizeof(struct fc_host_statistics));
 
        if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) {
                rval = qla24xx_get_isp_stats(ha, (uint32_t *)&stat_buf,
                    sizeof(stat_buf) / 4, mb_stat);
-       } else {
+       } else if (atomic_read(&ha->loop_state) == LOOP_READY &&
+                   !test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) &&
+                   !test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags) &&
+                   !ha->dpc_active) {
+               /* Must be in a 'READY' state for statistics retrieval. */
                rval = qla2x00_get_link_status(ha, ha->loop_id, &stat_buf,
                    mb_stat);
        }
-       if (rval != 0) {
-               qla_printk(KERN_WARNING, ha,
-                   "Unable to retrieve host statistics (%d).\n", mb_stat[0]);
-               return pfc_host_stat;
-       }
+
+       if (rval != QLA_SUCCESS)
+               goto done;
 
        pfc_host_stat->link_failure_count = stat_buf.link_fail_cnt;
        pfc_host_stat->loss_of_sync_count = stat_buf.loss_sync_cnt;
@@ -858,7 +912,7 @@ qla2x00_get_fc_host_stats(struct Scsi_Host *shost)
        pfc_host_stat->prim_seq_protocol_err_count = stat_buf.prim_seq_err_cnt;
        pfc_host_stat->invalid_tx_word_count = stat_buf.inval_xmit_word_cnt;
        pfc_host_stat->invalid_crc_count = stat_buf.inval_crc_cnt;
-
+done:
        return pfc_host_stat;
 }
 
index 2c10130d9e03fe2a037f361ed80ef80963aa8f8b..05f4f2a378eb6d14635f2e8e7ee5f0db904565d4 100644 (file)
@@ -2045,6 +2045,29 @@ struct isp_operations {
                uint32_t, uint32_t);
        int (*write_optrom) (struct scsi_qla_host *, uint8_t *, uint32_t,
                uint32_t);
+
+       int (*get_flash_version) (struct scsi_qla_host *, void *);
+};
+
+/* MSI-X Support *************************************************************/
+
+#define QLA_MSIX_CHIP_REV_24XX 3
+#define QLA_MSIX_FW_MODE(m)    (((m) & (BIT_7|BIT_8|BIT_9)) >> 7)
+#define QLA_MSIX_FW_MODE_1(m)  (QLA_MSIX_FW_MODE(m) == 1)
+
+#define QLA_MSIX_DEFAULT       0x00
+#define QLA_MSIX_RSP_Q         0x01
+
+#define QLA_MSIX_ENTRIES       2
+#define QLA_MIDX_DEFAULT       0
+#define QLA_MIDX_RSP_Q         1
+
+struct scsi_qla_host;
+
+struct qla_msix_entry {
+       int have_irq;
+       uint16_t msix_vector;
+       uint16_t msix_entry;
 };
 
 /*
@@ -2077,6 +2100,7 @@ typedef struct scsi_qla_host {
                uint32_t        enable_lip_full_login   :1;
                uint32_t        enable_target_reset     :1;
                uint32_t        enable_led_scheme       :1;
+               uint32_t        inta_enabled            :1;
                uint32_t        msi_enabled             :1;
                uint32_t        msix_enabled            :1;
                uint32_t        disable_serdes          :1;
@@ -2316,8 +2340,6 @@ typedef struct scsi_qla_host {
 #define MBX_INTR_WAIT  2
 #define MBX_UPDATE_FLASH_ACTIVE        3
 
-       spinlock_t      mbx_reg_lock;   /* Mbx Cmd Register Lock */
-
        struct semaphore mbx_cmd_sem;   /* Serialialize mbx access */
        struct semaphore mbx_intr_sem;  /* Used for completion notification */
 
@@ -2358,6 +2380,7 @@ typedef struct scsi_qla_host {
 
        uint8_t         host_str[16];
        uint32_t        pci_attr;
+       uint16_t        chip_revision;
 
        uint16_t        product_id[4];
 
@@ -2379,6 +2402,15 @@ typedef struct scsi_qla_host {
 #define QLA_SREADING   1
 #define QLA_SWRITING   2
 
+        /* PCI expansion ROM image information. */
+#define ROM_CODE_TYPE_BIOS     0
+#define ROM_CODE_TYPE_FCODE    1
+#define ROM_CODE_TYPE_EFI      3
+       uint8_t         bios_revision[2];
+       uint8_t         efi_revision[2];
+       uint8_t         fcode_revision[16];
+       uint32_t        fw_revision[4];
+
        /* Needed for BEACON */
        uint16_t        beacon_blink_led;
        uint8_t         beacon_color_state;
@@ -2391,6 +2423,8 @@ typedef struct scsi_qla_host {
        uint16_t        zio_mode;
        uint16_t        zio_timer;
        struct fc_host_statistics fc_host_stat;
+
+       struct qla_msix_entry msix_entries[QLA_MSIX_ENTRIES];
 } scsi_qla_host_t;
 
 
index e4dd12f4b80eaf014d84f9e837a9cc8c3901ab12..74544ae4b0e270128de9976c4397b31703802dad 100644 (file)
@@ -224,6 +224,9 @@ extern irqreturn_t qla24xx_intr_handler(int, void *);
 extern void qla2x00_process_response_queue(struct scsi_qla_host *);
 extern void qla24xx_process_response_queue(struct scsi_qla_host *);
 
+extern int qla2x00_request_irqs(scsi_qla_host_t *);
+extern void qla2x00_free_irqs(scsi_qla_host_t *);
+
 /*
  * Global Function Prototypes in qla_sup.c source file.
  */
@@ -259,6 +262,9 @@ extern uint8_t *qla24xx_read_optrom_data(struct scsi_qla_host *, uint8_t *,
 extern int qla24xx_write_optrom_data(struct scsi_qla_host *, uint8_t *,
     uint32_t, uint32_t);
 
+extern int qla2x00_get_flash_version(scsi_qla_host_t *, void *);
+extern int qla24xx_get_flash_version(scsi_qla_host_t *, void *);
+
 /*
  * Global Function Prototypes in qla_dbg.c source file.
  */
index b3dac26ddba3e50767c852aecaf07921bf4f363a..98c01cd5e1a82a954eef3822ecde52689459d84d 100644 (file)
@@ -65,7 +65,7 @@ qla2x00_initialize_adapter(scsi_qla_host_t *ha)
        ha->flags.reset_active = 0;
        atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME);
        atomic_set(&ha->loop_state, LOOP_DOWN);
-       ha->device_flags = 0;
+       ha->device_flags = DFLG_NO_CABLE;
        ha->dpc_flags = 0;
        ha->flags.management_server_logged_in = 0;
        ha->marker_needed = 0;
@@ -77,16 +77,23 @@ qla2x00_initialize_adapter(scsi_qla_host_t *ha)
        qla_printk(KERN_INFO, ha, "Configuring PCI space...\n");
        rval = ha->isp_ops.pci_config(ha);
        if (rval) {
-               DEBUG2(printk("scsi(%ld): Unable to configure PCI space=n",
+               DEBUG2(printk("scsi(%ld): Unable to configure PCI space.\n",
                    ha->host_no));
                return (rval);
        }
 
        ha->isp_ops.reset_chip(ha);
 
+       ha->isp_ops.get_flash_version(ha, ha->request_ring);
+
        qla_printk(KERN_INFO, ha, "Configure NVRAM parameters...\n");
 
-       ha->isp_ops.nvram_config(ha);
+       rval = ha->isp_ops.nvram_config(ha);
+       if (rval) {
+               DEBUG2(printk("scsi(%ld): Unable to verify NVRAM data.\n",
+                   ha->host_no));
+               return rval;
+       }
 
        if (ha->flags.disable_serdes) {
                /* Mask HBA via NVRAM settings? */
@@ -293,6 +300,8 @@ qla24xx_pci_config(scsi_qla_host_t *ha)
        d &= ~PCI_ROM_ADDRESS_ENABLE;
        pci_write_config_dword(ha->pdev, PCI_ROM_ADDRESS, d);
 
+       pci_read_config_word(ha->pdev, PCI_REVISION_ID, &ha->chip_revision);
+
        /* Get PCI bus information. */
        spin_lock_irqsave(&ha->hardware_lock, flags);
        ha->pci_attr = RD_REG_DWORD(&reg->ctrl_status);
@@ -1351,6 +1360,39 @@ qla2x00_configure_hba(scsi_qla_host_t *ha)
        return(rval);
 }
 
+static inline void
+qla2x00_set_model_info(scsi_qla_host_t *ha, uint8_t *model, size_t len, char *def)
+{
+       char *st, *en;
+       uint16_t index;
+
+       if (memcmp(model, BINZERO, len) != 0) {
+               strncpy(ha->model_number, model, len);
+               st = en = ha->model_number;
+               en += len - 1;
+               while (en > st) {
+                       if (*en != 0x20 && *en != 0x00)
+                               break;
+                       *en-- = '\0';
+               }
+
+               index = (ha->pdev->subsystem_device & 0xff);
+               if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_QLOGIC &&
+                   index < QLA_MODEL_NAMES)
+                       ha->model_desc = qla2x00_model_name[index * 2 + 1];
+       } else {
+               index = (ha->pdev->subsystem_device & 0xff);
+               if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_QLOGIC &&
+                   index < QLA_MODEL_NAMES) {
+                       strcpy(ha->model_number,
+                           qla2x00_model_name[index * 2]);
+                       ha->model_desc = qla2x00_model_name[index * 2 + 1];
+               } else {
+                       strcpy(ha->model_number, def);
+               }
+       }
+}
+
 /*
 * NVRAM configuration for ISP 2xxx
 *
@@ -1367,7 +1409,6 @@ qla2x00_configure_hba(scsi_qla_host_t *ha)
 int
 qla2x00_nvram_config(scsi_qla_host_t *ha)
 {
-       int             rval;
        uint8_t         chksum = 0;
        uint16_t        cnt;
        uint8_t         *dptr1, *dptr2;
@@ -1376,8 +1417,6 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
        uint8_t         *ptr = (uint8_t *)ha->request_ring;
        struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
 
-       rval = QLA_SUCCESS;
-
        /* Determine NVRAM starting address. */
        ha->nvram_size = sizeof(nvram_t);
        ha->nvram_base = 0;
@@ -1401,55 +1440,7 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
                qla_printk(KERN_WARNING, ha, "Inconsistent NVRAM detected: "
                    "checksum=0x%x id=%c version=0x%x.\n", chksum, nv->id[0],
                    nv->nvram_version);
-               qla_printk(KERN_WARNING, ha, "Falling back to functioning (yet "
-                   "invalid -- WWPN) defaults.\n");
-
-               /*
-                * Set default initialization control block.
-                */
-               memset(nv, 0, ha->nvram_size);
-               nv->parameter_block_version = ICB_VERSION;
-
-               if (IS_QLA23XX(ha)) {
-                       nv->firmware_options[0] = BIT_2 | BIT_1;
-                       nv->firmware_options[1] = BIT_7 | BIT_5;
-                       nv->add_firmware_options[0] = BIT_5;
-                       nv->add_firmware_options[1] = BIT_5 | BIT_4;
-                       nv->frame_payload_size = __constant_cpu_to_le16(2048);
-                       nv->special_options[1] = BIT_7;
-               } else if (IS_QLA2200(ha)) {
-                       nv->firmware_options[0] = BIT_2 | BIT_1;
-                       nv->firmware_options[1] = BIT_7 | BIT_5;
-                       nv->add_firmware_options[0] = BIT_5;
-                       nv->add_firmware_options[1] = BIT_5 | BIT_4;
-                       nv->frame_payload_size = __constant_cpu_to_le16(1024);
-               } else if (IS_QLA2100(ha)) {
-                       nv->firmware_options[0] = BIT_3 | BIT_1;
-                       nv->firmware_options[1] = BIT_5;
-                       nv->frame_payload_size = __constant_cpu_to_le16(1024);
-               }
-
-               nv->max_iocb_allocation = __constant_cpu_to_le16(256);
-               nv->execution_throttle = __constant_cpu_to_le16(16);
-               nv->retry_count = 8;
-               nv->retry_delay = 1;
-
-               nv->port_name[0] = 33;
-               nv->port_name[3] = 224;
-               nv->port_name[4] = 139;
-
-               nv->login_timeout = 4;
-
-               /*
-                * Set default host adapter parameters
-                */
-               nv->host_p[1] = BIT_2;
-               nv->reset_delay = 5;
-               nv->port_down_retry_count = 8;
-               nv->max_luns_per_target = __constant_cpu_to_le16(8);
-               nv->link_down_timeout = 60;
-
-               rval = 1;
+               return QLA_FUNCTION_FAILED;
        }
 
 #if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_SGI_SN2)
@@ -1489,33 +1480,8 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
                                strcpy(ha->model_number, "QLA2300");
                        }
                } else {
-                       if (rval == 0 &&
-                           memcmp(nv->model_number, BINZERO,
-                                   sizeof(nv->model_number)) != 0) {
-                               char *st, *en;
-
-                               strncpy(ha->model_number, nv->model_number,
-                                   sizeof(nv->model_number));
-                               st = en = ha->model_number;
-                               en += sizeof(nv->model_number) - 1;
-                               while (en > st) {
-                                       if (*en != 0x20 && *en != 0x00)
-                                               break;
-                                       *en-- = '\0';
-                               }
-                       } else {
-                               uint16_t        index;
-
-                               index = (ha->pdev->subsystem_device & 0xff);
-                               if (index < QLA_MODEL_NAMES) {
-                                       strcpy(ha->model_number,
-                                           qla2x00_model_name[index * 2]);
-                                       ha->model_desc =
-                                           qla2x00_model_name[index * 2 + 1];
-                               } else {
-                                       strcpy(ha->model_number, "QLA23xx");
-                               }
-                       }
+                       qla2x00_set_model_info(ha, nv->model_number,
+                           sizeof(nv->model_number), "QLA23xx");
                }
        } else if (IS_QLA2200(ha)) {
                nv->firmware_options[0] |= BIT_2;
@@ -1687,11 +1653,7 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
                }
        }
 
-       if (rval) {
-               DEBUG2_3(printk(KERN_WARNING
-                   "scsi(%ld): NVRAM configuration failed!\n", ha->host_no));
-       }
-       return (rval);
+       return QLA_SUCCESS;
 }
 
 static void
@@ -3107,7 +3069,11 @@ qla2x00_abort_isp(scsi_qla_host_t *ha)
                }
                spin_unlock_irqrestore(&ha->hardware_lock, flags);
 
-               ha->isp_ops.nvram_config(ha);
+               ha->isp_ops.get_flash_version(ha, ha->request_ring);
+
+               rval = ha->isp_ops.nvram_config(ha);
+               if (rval)
+                       goto isp_abort_retry;
 
                if (!qla2x00_restart_isp(ha)) {
                        clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags);
@@ -3137,6 +3103,7 @@ qla2x00_abort_isp(scsi_qla_host_t *ha)
                                }
                        }
                } else {        /* failed the ISP abort */
+isp_abort_retry:
                        ha->flags.online = 1;
                        if (test_bit(ISP_ABORT_RETRY, &ha->dpc_flags)) {
                                if (ha->isp_abort_cnt == 0) {
@@ -3326,7 +3293,6 @@ qla24xx_reset_adapter(scsi_qla_host_t *ha)
 int
 qla24xx_nvram_config(scsi_qla_host_t *ha)
 {
-       int   rval;
        struct init_cb_24xx *icb;
        struct nvram_24xx *nv;
        uint32_t *dptr;
@@ -3334,7 +3300,6 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
        uint32_t chksum;
        uint16_t cnt;
 
-       rval = QLA_SUCCESS;
        icb = (struct init_cb_24xx *)ha->init_cb;
        nv = (struct nvram_24xx *)ha->request_ring;
 
@@ -3367,51 +3332,7 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
                qla_printk(KERN_WARNING, ha, "Inconsistent NVRAM detected: "
                    "checksum=0x%x id=%c version=0x%x.\n", chksum, nv->id[0],
                    le16_to_cpu(nv->nvram_version));
-               qla_printk(KERN_WARNING, ha, "Falling back to functioning (yet "
-                   "invalid -- WWPN) defaults.\n");
-
-               /*
-                * Set default initialization control block.
-                */
-               memset(nv, 0, ha->nvram_size);
-               nv->nvram_version = __constant_cpu_to_le16(ICB_VERSION);
-               nv->version = __constant_cpu_to_le16(ICB_VERSION);
-               nv->frame_payload_size = __constant_cpu_to_le16(2048);
-               nv->execution_throttle = __constant_cpu_to_le16(0xFFFF);
-               nv->exchange_count = __constant_cpu_to_le16(0);
-               nv->hard_address = __constant_cpu_to_le16(124);
-               nv->port_name[0] = 0x21;
-               nv->port_name[1] = 0x00 + PCI_FUNC(ha->pdev->devfn);
-               nv->port_name[2] = 0x00;
-               nv->port_name[3] = 0xe0;
-               nv->port_name[4] = 0x8b;
-               nv->port_name[5] = 0x1c;
-               nv->port_name[6] = 0x55;
-               nv->port_name[7] = 0x86;
-               nv->node_name[0] = 0x20;
-               nv->node_name[1] = 0x00;
-               nv->node_name[2] = 0x00;
-               nv->node_name[3] = 0xe0;
-               nv->node_name[4] = 0x8b;
-               nv->node_name[5] = 0x1c;
-               nv->node_name[6] = 0x55;
-               nv->node_name[7] = 0x86;
-               nv->login_retry_count = __constant_cpu_to_le16(8);
-               nv->interrupt_delay_timer = __constant_cpu_to_le16(0);
-               nv->login_timeout = __constant_cpu_to_le16(0);
-               nv->firmware_options_1 =
-                   __constant_cpu_to_le32(BIT_14|BIT_13|BIT_2|BIT_1);
-               nv->firmware_options_2 = __constant_cpu_to_le32(2 << 4);
-               nv->firmware_options_2 |= __constant_cpu_to_le32(BIT_12);
-               nv->firmware_options_3 = __constant_cpu_to_le32(2 << 13);
-               nv->host_p = __constant_cpu_to_le32(BIT_11|BIT_10);
-               nv->efi_parameters = __constant_cpu_to_le32(0);
-               nv->reset_delay = 5;
-               nv->max_luns_per_target = __constant_cpu_to_le16(128);
-               nv->port_down_retry_count = __constant_cpu_to_le16(30);
-               nv->link_down_timeout = __constant_cpu_to_le16(30);
-
-               rval = 1;
+               return QLA_FUNCTION_FAILED;
        }
 
        /* Reset Initialization control block */
@@ -3438,25 +3359,8 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
        /*
         * Setup driver NVRAM options.
         */
-       if (memcmp(nv->model_name, BINZERO, sizeof(nv->model_name)) != 0) {
-               char *st, *en;
-               uint16_t index;
-
-               strncpy(ha->model_number, nv->model_name,
-                   sizeof(nv->model_name));
-               st = en = ha->model_number;
-               en += sizeof(nv->model_name) - 1;
-               while (en > st) {
-                       if (*en != 0x20 && *en != 0x00)
-                               break;
-                       *en-- = '\0';
-               }
-
-               index = (ha->pdev->subsystem_device & 0xff);
-               if (index < QLA_MODEL_NAMES)
-                       ha->model_desc = qla2x00_model_name[index * 2 + 1];
-       } else
-               strcpy(ha->model_number, "QLA2462");
+       qla2x00_set_model_info(ha, nv->model_name, sizeof(nv->model_name),
+           "QLA2462");
 
        /* Use alternate WWN? */
        if (nv->host_p & __constant_cpu_to_le32(BIT_15)) {
@@ -3575,11 +3479,7 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
                ha->flags.process_response_queue = 1;
        }
 
-       if (rval) {
-               DEBUG2_3(printk(KERN_WARNING
-                   "scsi(%ld): NVRAM configuration failed!\n", ha->host_no));
-       }
-       return (rval);
+       return QLA_SUCCESS;
 }
 
 static int
index 39fd17b05be5ada3d3da55515c2d89bba857cd71..d4885616cd39c19077e72b2f083f563ec5cb2ad9 100644 (file)
@@ -86,12 +86,8 @@ qla2100_intr_handler(int irq, void *dev_id)
 
        if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
            (status & MBX_INTERRUPT) && ha->flags.mbox_int) {
-               spin_lock_irqsave(&ha->mbx_reg_lock, flags);
-
                set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
                up(&ha->mbx_intr_sem);
-
-               spin_unlock_irqrestore(&ha->mbx_reg_lock, flags);
        }
 
        return (IRQ_HANDLED);
@@ -199,12 +195,8 @@ qla2300_intr_handler(int irq, void *dev_id)
 
        if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
            (status & MBX_INTERRUPT) && ha->flags.mbox_int) {
-               spin_lock_irqsave(&ha->mbx_reg_lock, flags);
-
                set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
                up(&ha->mbx_intr_sem);
-
-               spin_unlock_irqrestore(&ha->mbx_reg_lock, flags);
        }
 
        return (IRQ_HANDLED);
@@ -654,10 +646,8 @@ qla2x00_ramp_up_queue_depth(scsi_qla_host_t *ha, srb_t *sp)
            fcport->last_queue_full + ql2xqfullrampup * HZ))
                return;
 
-       spin_unlock_irq(&ha->hardware_lock);
        starget_for_each_device(sdev->sdev_target, fcport,
            qla2x00_adjust_sdev_qdepth_up);
-       spin_lock_irq(&ha->hardware_lock);
 }
 
 /**
@@ -927,10 +917,8 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
 
                        /* Adjust queue depth for all luns on the port. */
                        fcport->last_queue_full = jiffies;
-                       spin_unlock_irq(&ha->hardware_lock);
                        starget_for_each_device(cp->device->sdev_target,
                            fcport, qla2x00_adjust_sdev_qdepth_down);
-                       spin_lock_irq(&ha->hardware_lock);
                        break;
                }
                if (lscsi_status != SS_CHECK_CONDITION)
@@ -995,6 +983,22 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
                if (lscsi_status != 0) {
                        cp->result = DID_OK << 16 | lscsi_status;
 
+                       if (lscsi_status == SAM_STAT_TASK_SET_FULL) {
+                               DEBUG2(printk(KERN_INFO
+                                   "scsi(%ld): QUEUE FULL status detected "
+                                   "0x%x-0x%x.\n", ha->host_no, comp_status,
+                                   scsi_status));
+
+                               /*
+                                * Adjust queue depth for all luns on the
+                                * port.
+                                */
+                               fcport->last_queue_full = jiffies;
+                               starget_for_each_device(
+                                   cp->device->sdev_target, fcport,
+                                   qla2x00_adjust_sdev_qdepth_down);
+                               break;
+                       }
                        if (lscsi_status != SS_CHECK_CONDITION)
                                break;
 
@@ -1482,12 +1486,8 @@ qla24xx_intr_handler(int irq, void *dev_id)
 
        if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
            (status & MBX_INTERRUPT) && ha->flags.mbox_int) {
-               spin_lock_irqsave(&ha->mbx_reg_lock, flags);
-
                set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
                up(&ha->mbx_intr_sem);
-
-               spin_unlock_irqrestore(&ha->mbx_reg_lock, flags);
        }
 
        return IRQ_HANDLED;
@@ -1536,3 +1536,216 @@ qla24xx_ms_entry(scsi_qla_host_t *ha, struct ct_entry_24xx *pkt)
        qla2x00_sp_compl(ha, sp);
 }
 
+static irqreturn_t
+qla24xx_msix_rsp_q(int irq, void *dev_id)
+{
+       scsi_qla_host_t *ha;
+       struct device_reg_24xx __iomem *reg;
+       unsigned long flags;
+
+       ha = dev_id;
+       reg = &ha->iobase->isp24;
+
+       spin_lock_irqsave(&ha->hardware_lock, flags);
+
+       qla24xx_process_response_queue(ha);
+
+       WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
+       RD_REG_DWORD_RELAXED(&reg->hccr);
+
+       spin_unlock_irqrestore(&ha->hardware_lock, flags);
+
+       return IRQ_HANDLED;
+}
+
+static irqreturn_t
+qla24xx_msix_default(int irq, void *dev_id)
+{
+       scsi_qla_host_t *ha;
+       struct device_reg_24xx __iomem *reg;
+       int             status;
+       unsigned long   flags;
+       unsigned long   iter;
+       uint32_t        stat;
+       uint32_t        hccr;
+       uint16_t        mb[4];
+
+       ha = dev_id;
+       reg = &ha->iobase->isp24;
+       status = 0;
+
+       spin_lock_irqsave(&ha->hardware_lock, flags);
+       for (iter = 50; iter--; ) {
+               stat = RD_REG_DWORD(&reg->host_status);
+               if (stat & HSRX_RISC_PAUSED) {
+                       hccr = RD_REG_DWORD(&reg->hccr);
+
+                       qla_printk(KERN_INFO, ha, "RISC paused -- HCCR=%x, "
+                           "Dumping firmware!\n", hccr);
+                       ha->isp_ops.fw_dump(ha, 1);
+                       set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
+                       break;
+               } else if ((stat & HSRX_RISC_INT) == 0)
+                       break;
+
+               switch (stat & 0xff) {
+               case 0x1:
+               case 0x2:
+               case 0x10:
+               case 0x11:
+                       qla24xx_mbx_completion(ha, MSW(stat));
+                       status |= MBX_INTERRUPT;
+
+                       break;
+               case 0x12:
+                       mb[0] = MSW(stat);
+                       mb[1] = RD_REG_WORD(&reg->mailbox1);
+                       mb[2] = RD_REG_WORD(&reg->mailbox2);
+                       mb[3] = RD_REG_WORD(&reg->mailbox3);
+                       qla2x00_async_event(ha, mb);
+                       break;
+               case 0x13:
+                       qla24xx_process_response_queue(ha);
+                       break;
+               default:
+                       DEBUG2(printk("scsi(%ld): Unrecognized interrupt type "
+                           "(%d).\n",
+                           ha->host_no, stat & 0xff));
+                       break;
+               }
+               WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
+               RD_REG_DWORD_RELAXED(&reg->hccr);
+       }
+       spin_unlock_irqrestore(&ha->hardware_lock, flags);
+
+       if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
+           (status & MBX_INTERRUPT) && ha->flags.mbox_int) {
+               set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
+               up(&ha->mbx_intr_sem);
+       }
+
+       return IRQ_HANDLED;
+}
+
+/* Interrupt handling helpers. */
+
+struct qla_init_msix_entry {
+       uint16_t entry;
+       uint16_t index;
+       const char *name;
+       irqreturn_t (*handler)(int, void *);
+};
+
+static struct qla_init_msix_entry imsix_entries[QLA_MSIX_ENTRIES] = {
+       { QLA_MSIX_DEFAULT, QLA_MIDX_DEFAULT,
+               "qla2xxx (default)", qla24xx_msix_default },
+
+       { QLA_MSIX_RSP_Q, QLA_MIDX_RSP_Q,
+               "qla2xxx (rsp_q)", qla24xx_msix_rsp_q },
+};
+
+static void
+qla24xx_disable_msix(scsi_qla_host_t *ha)
+{
+       int i;
+       struct qla_msix_entry *qentry;
+
+       for (i = 0; i < QLA_MSIX_ENTRIES; i++) {
+               qentry = &ha->msix_entries[imsix_entries[i].index];
+               if (qentry->have_irq)
+                       free_irq(qentry->msix_vector, ha);
+       }
+       pci_disable_msix(ha->pdev);
+}
+
+static int
+qla24xx_enable_msix(scsi_qla_host_t *ha)
+{
+       int i, ret;
+       struct msix_entry entries[QLA_MSIX_ENTRIES];
+       struct qla_msix_entry *qentry;
+
+       for (i = 0; i < QLA_MSIX_ENTRIES; i++)
+               entries[i].entry = imsix_entries[i].entry;
+
+       ret = pci_enable_msix(ha->pdev, entries, ARRAY_SIZE(entries));
+       if (ret) {
+               qla_printk(KERN_WARNING, ha,
+                   "MSI-X: Failed to enable support -- %d/%d\n",
+                   QLA_MSIX_ENTRIES, ret);
+               goto msix_out;
+       }
+       ha->flags.msix_enabled = 1;
+
+       for (i = 0; i < QLA_MSIX_ENTRIES; i++) {
+               qentry = &ha->msix_entries[imsix_entries[i].index];
+               qentry->msix_vector = entries[i].vector;
+               qentry->msix_entry = entries[i].entry;
+               qentry->have_irq = 0;
+               ret = request_irq(qentry->msix_vector,
+                   imsix_entries[i].handler, 0, imsix_entries[i].name, ha);
+               if (ret) {
+                       qla_printk(KERN_WARNING, ha,
+                           "MSI-X: Unable to register handler -- %x/%d.\n",
+                           imsix_entries[i].index, ret);
+                       qla24xx_disable_msix(ha);
+                       goto msix_out;
+               }
+               qentry->have_irq = 1;
+       }
+
+msix_out:
+       return ret;
+}
+
+int
+qla2x00_request_irqs(scsi_qla_host_t *ha)
+{
+       int ret;
+
+       /* If possible, enable MSI-X. */
+       if (!IS_QLA2432(ha))
+               goto skip_msix;
+
+        if (ha->chip_revision < QLA_MSIX_CHIP_REV_24XX ||
+           !QLA_MSIX_FW_MODE_1(ha->fw_attributes)) {
+               DEBUG2(qla_printk(KERN_WARNING, ha,
+                   "MSI-X: Unsupported ISP2432 (0x%X, 0x%X).\n",
+                   ha->chip_revision, ha->fw_attributes));
+
+               goto skip_msix;
+       }
+
+       ret = qla24xx_enable_msix(ha);
+       if (!ret) {
+               DEBUG2(qla_printk(KERN_INFO, ha,
+                   "MSI-X: Enabled (0x%X, 0x%X).\n", ha->chip_revision,
+                   ha->fw_attributes));
+               return ret;
+       }
+       qla_printk(KERN_WARNING, ha,
+           "MSI-X: Falling back-to INTa mode -- %d.\n", ret);
+skip_msix:
+       ret = request_irq(ha->pdev->irq, ha->isp_ops.intr_handler,
+           IRQF_DISABLED|IRQF_SHARED, QLA2XXX_DRIVER_NAME, ha);
+       if (!ret) {
+               ha->flags.inta_enabled = 1;
+               ha->host->irq = ha->pdev->irq;
+       } else {
+               qla_printk(KERN_WARNING, ha,
+                   "Failed to reserve interrupt %d already in use.\n",
+                   ha->pdev->irq);
+       }
+
+       return ret;
+}
+
+void
+qla2x00_free_irqs(scsi_qla_host_t *ha)
+{
+
+       if (ha->flags.msix_enabled)
+               qla24xx_disable_msix(ha);
+       else if (ha->flags.inta_enabled)
+               free_irq(ha->host->irq, ha);
+}
index 077e5789beeb0870742c5720e8d13e5a5d58c9bf..83376f6ac3dbb0c108e9ed5fd986dcc879d06739 100644 (file)
@@ -55,7 +55,6 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp)
        uint16_t __iomem *optr;
        uint32_t        cnt;
        uint32_t        mboxes;
-       unsigned long   mbx_flags = 0;
        unsigned long   wait_time;
 
        rval = QLA_SUCCESS;
@@ -81,10 +80,6 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp)
        /* Save mailbox command for debug */
        ha->mcp = mcp;
 
-       /* Try to get mailbox register access */
-       if (!abort_active)
-               spin_lock_irqsave(&ha->mbx_reg_lock, mbx_flags);
-
        DEBUG11(printk("scsi(%ld): prepare to issue mbox cmd=0x%x.\n",
            ha->host_no, mcp->mb[0]));
 
@@ -161,9 +156,6 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp)
                        WRT_REG_WORD(&reg->isp.hccr, HCCR_SET_HOST_INT);
                spin_unlock_irqrestore(&ha->hardware_lock, flags);
 
-               if (!abort_active)
-                       spin_unlock_irqrestore(&ha->mbx_reg_lock, mbx_flags);
-
                /* Wait for either the timer to expire
                 * or the mbox completion interrupt
                 */
@@ -184,8 +176,6 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp)
                else
                        WRT_REG_WORD(&reg->isp.hccr, HCCR_SET_HOST_INT);
                spin_unlock_irqrestore(&ha->hardware_lock, flags);
-               if (!abort_active)
-                       spin_unlock_irqrestore(&ha->mbx_reg_lock, mbx_flags);
 
                wait_time = jiffies + mcp->tov * HZ; /* wait at most tov secs */
                while (!ha->flags.mbox_int) {
@@ -201,9 +191,6 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp)
                } /* while */
        }
 
-       if (!abort_active)
-               spin_lock_irqsave(&ha->mbx_reg_lock, mbx_flags);
-
        /* Check whether we timed out */
        if (ha->flags.mbox_int) {
                uint16_t *iptr2;
@@ -256,9 +243,6 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp)
                rval = QLA_FUNCTION_TIMEOUT;
        }
 
-       if (!abort_active)
-               spin_unlock_irqrestore(&ha->mbx_reg_lock, mbx_flags);
-
        ha->flags.mbox_busy = 0;
 
        /* Clean up */
@@ -1713,7 +1697,7 @@ qla24xx_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain,
        lg->entry_count = 1;
        lg->nport_handle = cpu_to_le16(loop_id);
        lg->control_flags =
-           __constant_cpu_to_le16(LCF_COMMAND_LOGO|LCF_EXPL_LOGO);
+           __constant_cpu_to_le16(LCF_COMMAND_LOGO|LCF_IMPL_LOGO);
        lg->port_id[0] = al_pa;
        lg->port_id[1] = area;
        lg->port_id[2] = domain;
index d6445ae841ba965896c8993fce3ab38ae899f0e4..68f5d24b938b06c28ecf177c6ad6ae71a55a257a 100644 (file)
@@ -1485,6 +1485,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
        ha->isp_ops.fw_dump             = qla2100_fw_dump;
        ha->isp_ops.read_optrom         = qla2x00_read_optrom_data;
        ha->isp_ops.write_optrom        = qla2x00_write_optrom_data;
+       ha->isp_ops.get_flash_version   = qla2x00_get_flash_version;
        if (IS_QLA2100(ha)) {
                host->max_id = MAX_TARGETS_2100;
                ha->mbx_count = MAILBOX_REGISTER_COUNT_2100;
@@ -1550,6 +1551,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
                ha->isp_ops.beacon_on = qla24xx_beacon_on;
                ha->isp_ops.beacon_off = qla24xx_beacon_off;
                ha->isp_ops.beacon_blink = qla24xx_beacon_blink;
+               ha->isp_ops.get_flash_version = qla24xx_get_flash_version;
                ha->gid_list_info_size = 8;
                ha->optrom_size = OPTROM_SIZE_24XX;
        }
@@ -1564,14 +1566,6 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
        INIT_LIST_HEAD(&ha->list);
        INIT_LIST_HEAD(&ha->fcports);
 
-       /*
-        * These locks are used to prevent more than one CPU
-        * from modifying the queue at the same time. The
-        * higher level "host_lock" will reduce most
-        * contention for these locks.
-        */
-       spin_lock_init(&ha->mbx_reg_lock);
-
        qla2x00_config_dma_addressing(ha);
        if (qla2x00_mem_alloc(ha)) {
                qla_printk(KERN_WARNING, ha,
@@ -1615,15 +1609,9 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
        host->max_lun = MAX_LUNS;
        host->transportt = qla2xxx_transport_template;
 
-       ret = request_irq(pdev->irq, ha->isp_ops.intr_handler,
-           IRQF_DISABLED|IRQF_SHARED, QLA2XXX_DRIVER_NAME, ha);
-       if (ret) {
-               qla_printk(KERN_WARNING, ha,
-                   "Failed to reserve interrupt %d already in use.\n",
-                   pdev->irq);
+       ret = qla2x00_request_irqs(ha);
+       if (ret)
                goto probe_failed;
-       }
-       host->irq = pdev->irq;
 
        /* Initialized the timer */
        qla2x00_start_timer(ha, qla2x00_timer, WATCH_INTERVAL);
@@ -1753,9 +1741,7 @@ qla2x00_free_device(scsi_qla_host_t *ha)
 
        qla2x00_mem_free(ha);
 
-       /* Detach interrupts */
-       if (ha->host->irq)
-               free_irq(ha->host->irq, ha);
+       qla2x00_free_irqs(ha);
 
        /* release io space registers  */
        if (ha->iobase)
index 15390ad87456399a774ac65e25a5f519216adf15..ff1dd4175a7f1deb2a8e320e64d98055feca39ef 100644 (file)
@@ -611,7 +611,6 @@ qla24xx_write_flash_data(scsi_qla_host_t *ha, uint32_t *dwptr, uint32_t faddr,
                                            flash_conf_to_access_addr(0x0339),
                                            (fdata & 0xff00) | ((fdata << 16) &
                                            0xff0000) | ((fdata >> 16) & 0xff));
-                               fdata = (faddr & sec_mask) << 2;
                                ret = qla24xx_write_flash_dword(ha, conf_addr,
                                    (fdata & 0xff00) |((fdata << 16) &
                                    0xff0000) | ((fdata >> 16) & 0xff));
@@ -1383,6 +1382,29 @@ qla2x00_get_flash_manufacturer(scsi_qla_host_t *ha, uint8_t *man_id,
        qla2x00_write_flash_byte(ha, 0x5555, 0xf0);
 }
 
+static void
+qla2x00_read_flash_data(scsi_qla_host_t *ha, uint8_t *tmp_buf, uint32_t saddr,
+        uint32_t length)
+{
+       struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
+       uint32_t midpoint, ilength;
+       uint8_t data;
+
+       midpoint = length / 2;
+
+       WRT_REG_WORD(&reg->nvram, 0);
+       RD_REG_WORD(&reg->nvram);
+       for (ilength = 0; ilength < length; saddr++, ilength++, tmp_buf++) {
+               if (ilength == midpoint) {
+                       WRT_REG_WORD(&reg->nvram, NVR_SELECT);
+                       RD_REG_WORD(&reg->nvram);
+               }
+               data = qla2x00_read_flash_byte(ha, saddr);
+               if (saddr % 100)
+                       udelay(10);
+               *tmp_buf = data;
+       }
+}
 
 static inline void
 qla2x00_suspend_hba(struct scsi_qla_host *ha)
@@ -1722,3 +1744,327 @@ qla24xx_write_optrom_data(struct scsi_qla_host *ha, uint8_t *buf,
 
        return rval;
 }
+
+/**
+ * qla2x00_get_fcode_version() - Determine an FCODE image's version.
+ * @ha: HA context
+ * @pcids: Pointer to the FCODE PCI data structure
+ *
+ * The process of retrieving the FCODE version information is at best
+ * described as interesting.
+ *
+ * Within the first 100h bytes of the image an ASCII string is present
+ * which contains several pieces of information including the FCODE
+ * version.  Unfortunately it seems the only reliable way to retrieve
+ * the version is by scanning for another sentinel within the string,
+ * the FCODE build date:
+ *
+ *     ... 2.00.02 10/17/02 ...
+ *
+ * Returns QLA_SUCCESS on successful retrieval of version.
+ */
+static void
+qla2x00_get_fcode_version(scsi_qla_host_t *ha, uint32_t pcids)
+{
+       int ret = QLA_FUNCTION_FAILED;
+       uint32_t istart, iend, iter, vend;
+       uint8_t do_next, rbyte, *vbyte;
+
+       memset(ha->fcode_revision, 0, sizeof(ha->fcode_revision));
+
+       /* Skip the PCI data structure. */
+       istart = pcids +
+           ((qla2x00_read_flash_byte(ha, pcids + 0x0B) << 8) |
+               qla2x00_read_flash_byte(ha, pcids + 0x0A));
+       iend = istart + 0x100;
+       do {
+               /* Scan for the sentinel date string...eeewww. */
+               do_next = 0;
+               iter = istart;
+               while ((iter < iend) && !do_next) {
+                       iter++;
+                       if (qla2x00_read_flash_byte(ha, iter) == '/') {
+                               if (qla2x00_read_flash_byte(ha, iter + 2) ==
+                                   '/')
+                                       do_next++;
+                               else if (qla2x00_read_flash_byte(ha,
+                                   iter + 3) == '/')
+                                       do_next++;
+                       }
+               }
+               if (!do_next)
+                       break;
+
+               /* Backtrack to previous ' ' (space). */
+               do_next = 0;
+               while ((iter > istart) && !do_next) {
+                       iter--;
+                       if (qla2x00_read_flash_byte(ha, iter) == ' ')
+                               do_next++;
+               }
+               if (!do_next)
+                       break;
+
+               /*
+                * Mark end of version tag, and find previous ' ' (space) or
+                * string length (recent FCODE images -- major hack ahead!!!).
+                */
+               vend = iter - 1;
+               do_next = 0;
+               while ((iter > istart) && !do_next) {
+                       iter--;
+                       rbyte = qla2x00_read_flash_byte(ha, iter);
+                       if (rbyte == ' ' || rbyte == 0xd || rbyte == 0x10)
+                               do_next++;
+               }
+               if (!do_next)
+                       break;
+
+               /* Mark beginning of version tag, and copy data. */
+               iter++;
+               if ((vend - iter) &&
+                   ((vend - iter) < sizeof(ha->fcode_revision))) {
+                       vbyte = ha->fcode_revision;
+                       while (iter <= vend) {
+                               *vbyte++ = qla2x00_read_flash_byte(ha, iter);
+                               iter++;
+                       }
+                       ret = QLA_SUCCESS;
+               }
+       } while (0);
+
+       if (ret != QLA_SUCCESS)
+               memset(ha->fcode_revision, 0, sizeof(ha->fcode_revision));
+}
+
+int
+qla2x00_get_flash_version(scsi_qla_host_t *ha, void *mbuf)
+{
+       int ret = QLA_SUCCESS;
+       uint8_t code_type, last_image;
+       uint32_t pcihdr, pcids;
+       uint8_t *dbyte;
+       uint16_t *dcode;
+
+       if (!ha->pio_address || !mbuf)
+               return QLA_FUNCTION_FAILED;
+
+       memset(ha->bios_revision, 0, sizeof(ha->bios_revision));
+       memset(ha->efi_revision, 0, sizeof(ha->efi_revision));
+       memset(ha->fcode_revision, 0, sizeof(ha->fcode_revision));
+       memset(ha->fw_revision, 0, sizeof(ha->fw_revision));
+
+       qla2x00_flash_enable(ha);
+
+       /* Begin with first PCI expansion ROM header. */
+       pcihdr = 0;
+       last_image = 1;
+       do {
+               /* Verify PCI expansion ROM header. */
+               if (qla2x00_read_flash_byte(ha, pcihdr) != 0x55 ||
+                   qla2x00_read_flash_byte(ha, pcihdr + 0x01) != 0xaa) {
+                       /* No signature */
+                       DEBUG2(printk("scsi(%ld): No matching ROM "
+                           "signature.\n", ha->host_no));
+                       ret = QLA_FUNCTION_FAILED;
+                       break;
+               }
+
+               /* Locate PCI data structure. */
+               pcids = pcihdr +
+                   ((qla2x00_read_flash_byte(ha, pcihdr + 0x19) << 8) |
+                       qla2x00_read_flash_byte(ha, pcihdr + 0x18));
+
+               /* Validate signature of PCI data structure. */
+               if (qla2x00_read_flash_byte(ha, pcids) != 'P' ||
+                   qla2x00_read_flash_byte(ha, pcids + 0x1) != 'C' ||
+                   qla2x00_read_flash_byte(ha, pcids + 0x2) != 'I' ||
+                   qla2x00_read_flash_byte(ha, pcids + 0x3) != 'R') {
+                       /* Incorrect header. */
+                       DEBUG2(printk("%s(): PCI data struct not found "
+                           "pcir_adr=%x.\n", __func__, pcids));
+                       ret = QLA_FUNCTION_FAILED;
+                       break;
+               }
+
+               /* Read version */
+               code_type = qla2x00_read_flash_byte(ha, pcids + 0x14);
+               switch (code_type) {
+               case ROM_CODE_TYPE_BIOS:
+                       /* Intel x86, PC-AT compatible. */
+                       ha->bios_revision[0] =
+                           qla2x00_read_flash_byte(ha, pcids + 0x12);
+                       ha->bios_revision[1] =
+                           qla2x00_read_flash_byte(ha, pcids + 0x13);
+                       DEBUG3(printk("%s(): read BIOS %d.%d.\n", __func__,
+                           ha->bios_revision[1], ha->bios_revision[0]));
+                       break;
+               case ROM_CODE_TYPE_FCODE:
+                       /* Open Firmware standard for PCI (FCode). */
+                       /* Eeeewww... */
+                       qla2x00_get_fcode_version(ha, pcids);
+                       break;
+               case ROM_CODE_TYPE_EFI:
+                       /* Extensible Firmware Interface (EFI). */
+                       ha->efi_revision[0] =
+                           qla2x00_read_flash_byte(ha, pcids + 0x12);
+                       ha->efi_revision[1] =
+                           qla2x00_read_flash_byte(ha, pcids + 0x13);
+                       DEBUG3(printk("%s(): read EFI %d.%d.\n", __func__,
+                           ha->efi_revision[1], ha->efi_revision[0]));
+                       break;
+               default:
+                       DEBUG2(printk("%s(): Unrecognized code type %x at "
+                           "pcids %x.\n", __func__, code_type, pcids));
+                       break;
+               }
+
+               last_image = qla2x00_read_flash_byte(ha, pcids + 0x15) & BIT_7;
+
+               /* Locate next PCI expansion ROM. */
+               pcihdr += ((qla2x00_read_flash_byte(ha, pcids + 0x11) << 8) |
+                   qla2x00_read_flash_byte(ha, pcids + 0x10)) * 512;
+       } while (!last_image);
+
+       if (IS_QLA2322(ha)) {
+               /* Read firmware image information. */
+               memset(ha->fw_revision, 0, sizeof(ha->fw_revision));
+               dbyte = mbuf;
+               memset(dbyte, 0, 8);
+               dcode = (uint16_t *)dbyte;
+
+               qla2x00_read_flash_data(ha, dbyte, FA_RISC_CODE_ADDR * 4 + 10,
+                   8);
+               DEBUG3(printk("%s(%ld): dumping fw ver from flash:\n",
+                   __func__, ha->host_no));
+               DEBUG3(qla2x00_dump_buffer((uint8_t *)dbyte, 8));
+
+               if ((dcode[0] == 0xffff && dcode[1] == 0xffff &&
+                   dcode[2] == 0xffff && dcode[3] == 0xffff) ||
+                   (dcode[0] == 0 && dcode[1] == 0 && dcode[2] == 0 &&
+                   dcode[3] == 0)) {
+                       DEBUG2(printk("%s(): Unrecognized fw revision at "
+                           "%x.\n", __func__, FA_RISC_CODE_ADDR * 4));
+               } else {
+                       /* values are in big endian */
+                       ha->fw_revision[0] = dbyte[0] << 16 | dbyte[1];
+                       ha->fw_revision[1] = dbyte[2] << 16 | dbyte[3];
+                       ha->fw_revision[2] = dbyte[4] << 16 | dbyte[5];
+               }
+       }
+
+       qla2x00_flash_disable(ha);
+
+       return ret;
+}
+
+int
+qla24xx_get_flash_version(scsi_qla_host_t *ha, void *mbuf)
+{
+       int ret = QLA_SUCCESS;
+       uint32_t pcihdr, pcids;
+       uint32_t *dcode;
+       uint8_t *bcode;
+       uint8_t code_type, last_image;
+       int i;
+
+       if (!mbuf)
+               return QLA_FUNCTION_FAILED;
+
+       memset(ha->bios_revision, 0, sizeof(ha->bios_revision));
+       memset(ha->efi_revision, 0, sizeof(ha->efi_revision));
+       memset(ha->fcode_revision, 0, sizeof(ha->fcode_revision));
+       memset(ha->fw_revision, 0, sizeof(ha->fw_revision));
+
+       dcode = mbuf;
+
+       /* Begin with first PCI expansion ROM header. */
+       pcihdr = 0;
+       last_image = 1;
+       do {
+               /* Verify PCI expansion ROM header. */
+               qla24xx_read_flash_data(ha, dcode, pcihdr >> 2, 0x20);
+               bcode = mbuf + (pcihdr % 4);
+               if (bcode[0x0] != 0x55 || bcode[0x1] != 0xaa) {
+                       /* No signature */
+                       DEBUG2(printk("scsi(%ld): No matching ROM "
+                           "signature.\n", ha->host_no));
+                       ret = QLA_FUNCTION_FAILED;
+                       break;
+               }
+
+               /* Locate PCI data structure. */
+               pcids = pcihdr + ((bcode[0x19] << 8) | bcode[0x18]);
+
+               qla24xx_read_flash_data(ha, dcode, pcids >> 2, 0x20);
+               bcode = mbuf + (pcihdr % 4);
+
+               /* Validate signature of PCI data structure. */
+               if (bcode[0x0] != 'P' || bcode[0x1] != 'C' ||
+                   bcode[0x2] != 'I' || bcode[0x3] != 'R') {
+                       /* Incorrect header. */
+                       DEBUG2(printk("%s(): PCI data struct not found "
+                           "pcir_adr=%x.\n", __func__, pcids));
+                       ret = QLA_FUNCTION_FAILED;
+                       break;
+               }
+
+               /* Read version */
+               code_type = bcode[0x14];
+               switch (code_type) {
+               case ROM_CODE_TYPE_BIOS:
+                       /* Intel x86, PC-AT compatible. */
+                       ha->bios_revision[0] = bcode[0x12];
+                       ha->bios_revision[1] = bcode[0x13];
+                       DEBUG3(printk("%s(): read BIOS %d.%d.\n", __func__,
+                           ha->bios_revision[1], ha->bios_revision[0]));
+                       break;
+               case ROM_CODE_TYPE_FCODE:
+                       /* Open Firmware standard for PCI (FCode). */
+                       ha->fcode_revision[0] = bcode[0x12];
+                       ha->fcode_revision[1] = bcode[0x13];
+                       DEBUG3(printk("%s(): read FCODE %d.%d.\n", __func__,
+                           ha->fcode_revision[1], ha->fcode_revision[0]));
+                       break;
+               case ROM_CODE_TYPE_EFI:
+                       /* Extensible Firmware Interface (EFI). */
+                       ha->efi_revision[0] = bcode[0x12];
+                       ha->efi_revision[1] = bcode[0x13];
+                       DEBUG3(printk("%s(): read EFI %d.%d.\n", __func__,
+                           ha->efi_revision[1], ha->efi_revision[0]));
+                       break;
+               default:
+                       DEBUG2(printk("%s(): Unrecognized code type %x at "
+                           "pcids %x.\n", __func__, code_type, pcids));
+                       break;
+               }
+
+               last_image = bcode[0x15] & BIT_7;
+
+               /* Locate next PCI expansion ROM. */
+               pcihdr += ((bcode[0x11] << 8) | bcode[0x10]) * 512;
+       } while (!last_image);
+
+       /* Read firmware image information. */
+       memset(ha->fw_revision, 0, sizeof(ha->fw_revision));
+       dcode = mbuf;
+
+       qla24xx_read_flash_data(ha, dcode, FA_RISC_CODE_ADDR + 4, 4);
+       for (i = 0; i < 4; i++)
+               dcode[i] = be32_to_cpu(dcode[i]);
+
+       if ((dcode[0] == 0xffffffff && dcode[1] == 0xffffffff &&
+           dcode[2] == 0xffffffff && dcode[3] == 0xffffffff) ||
+           (dcode[0] == 0 && dcode[1] == 0 && dcode[2] == 0 &&
+           dcode[3] == 0)) {
+               DEBUG2(printk("%s(): Unrecognized fw version at %x.\n",
+                   __func__, FA_RISC_CODE_ADDR));
+       } else {
+               ha->fw_revision[0] = dcode[0];
+               ha->fw_revision[1] = dcode[1];
+               ha->fw_revision[2] = dcode[2];
+               ha->fw_revision[3] = dcode[3];
+       }
+
+       return ret;
+}
index 459e0d6bd2b4d67757a57abd435afa5500dfa94d..61347aee55ce3da85fb49bee3db60a11a5f706ea 100644 (file)
@@ -7,7 +7,7 @@
 /*
  * Driver version
  */
-#define QLA2XXX_VERSION      "8.01.07-k4"
+#define QLA2XXX_VERSION      "8.01.07-k5"
 
 #define QLA_DRIVER_MAJOR_VER   8
 #define QLA_DRIVER_MINOR_VER   1
index 81fb7bd44f0167131a9eb7cc8f21a0d00172d91e..0bfddf893ed0eba06e1362e0a4f06016eafcf86c 100644 (file)
@@ -1270,7 +1270,7 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev,
        INIT_WORK(&ha->dpc_work, qla4xxx_do_dpc);
 
        ret = request_irq(pdev->irq, qla4xxx_intr_handler,
-                         SA_INTERRUPT|SA_SHIRQ, "qla4xxx", ha);
+                         IRQF_DISABLED | IRQF_SHARED, "qla4xxx", ha);
        if (ret) {
                dev_warn(&ha->pdev->dev, "Failed to reserve interrupt %d"
                        " already in use.\n", pdev->irq);
index 24cffd98ee63546ce716e0277812dda9bafd08d2..1c89ee3e69ba972752e1e9acf6b50812783499f2 100644 (file)
@@ -40,7 +40,6 @@
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/slab.h>
@@ -672,27 +671,6 @@ void __scsi_done(struct scsi_cmnd *cmd)
        blk_complete_request(rq);
 }
 
-/*
- * Function:    scsi_retry_command
- *
- * Purpose:     Send a command back to the low level to be retried.
- *
- * Notes:       This command is always executed in the context of the
- *              bottom half handler, or the error handler thread. Low
- *              level drivers should not become re-entrant as a result of
- *              this.
- */
-int scsi_retry_command(struct scsi_cmnd *cmd)
-{
-        /*
-         * Zero the sense information from the last time we tried
-         * this command.
-         */
-       memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer));
-
-       return scsi_queue_insert(cmd, SCSI_MLQUEUE_EH_RETRY);
-}
-
 /*
  * Function:    scsi_finish_command
  *
index 30ee3d72c02151f0b56ca9b69b9c7d10aff7bbff..3e2930b7ee2397bef4207dbf545a75667907893c 100644 (file)
@@ -28,7 +28,6 @@
 #include <linux/module.h>
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/timer.h>
 #include <linux/types.h>
 #include "scsi_logging.h"
 #include "scsi_debug.h"
 
-#define SCSI_DEBUG_VERSION "1.80"
-static const char * scsi_debug_version_date = "20061018";
+#define SCSI_DEBUG_VERSION "1.81"
+static const char * scsi_debug_version_date = "20070104";
 
-/* Additional Sense Code (ASC) used */
+/* Additional Sense Code (ASC) */
 #define NO_ADDITIONAL_SENSE 0x0
 #define LOGICAL_UNIT_NOT_READY 0x4
 #define UNRECOVERED_READ_ERR 0x11
@@ -65,9 +64,13 @@ static const char * scsi_debug_version_date = "20061018";
 #define INVALID_FIELD_IN_PARAM_LIST 0x26
 #define POWERON_RESET 0x29
 #define SAVING_PARAMS_UNSUP 0x39
+#define TRANSPORT_PROBLEM 0x4b
 #define THRESHOLD_EXCEEDED 0x5d
 #define LOW_POWER_COND_ON 0x5e
 
+/* Additional Sense Code Qualifier (ASCQ) */
+#define ACK_NAK_TO 0x3
+
 #define SDEBUG_TAGGED_QUEUING 0 /* 0 | MSG_SIMPLE_TAG | MSG_ORDERED_TAG */
 
 /* Default values for driver parameters */
@@ -95,15 +98,20 @@ static const char * scsi_debug_version_date = "20061018";
 #define SCSI_DEBUG_OPT_MEDIUM_ERR   2
 #define SCSI_DEBUG_OPT_TIMEOUT   4
 #define SCSI_DEBUG_OPT_RECOVERED_ERR   8
+#define SCSI_DEBUG_OPT_TRANSPORT_ERR   16
 /* When "every_nth" > 0 then modulo "every_nth" commands:
  *   - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
  *   - a RECOVERED_ERROR is simulated on successful read and write
  *     commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
+ *   - a TRANSPORT_ERROR is simulated on successful read and write
+ *     commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
  *
  * When "every_nth" < 0 then after "- every_nth" commands:
  *   - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
  *   - a RECOVERED_ERROR is simulated on successful read and write
  *     commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
+ *   - a TRANSPORT_ERROR is simulated on successful read and write
+ *     commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
  * This will continue until some other action occurs (e.g. the user
  * writing a new value (other than -1 or 1) to every_nth via sysfs).
  */
@@ -315,6 +323,7 @@ int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done)
        int target = SCpnt->device->id;
        struct sdebug_dev_info * devip = NULL;
        int inj_recovered = 0;
+       int inj_transport = 0;
        int delay_override = 0;
 
        if (done == NULL)
@@ -352,6 +361,8 @@ int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done)
                        return 0; /* ignore command causing timeout */
                else if (SCSI_DEBUG_OPT_RECOVERED_ERR & scsi_debug_opts)
                        inj_recovered = 1; /* to reads and writes below */
+               else if (SCSI_DEBUG_OPT_TRANSPORT_ERR & scsi_debug_opts)
+                       inj_transport = 1; /* to reads and writes below */
         }
 
        if (devip->wlun) {
@@ -468,7 +479,11 @@ int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done)
                        mk_sense_buffer(devip, RECOVERED_ERROR,
                                        THRESHOLD_EXCEEDED, 0);
                        errsts = check_condition_result;
-               }
+               } else if (inj_transport && (0 == errsts)) {
+                        mk_sense_buffer(devip, ABORTED_COMMAND,
+                                        TRANSPORT_PROBLEM, ACK_NAK_TO);
+                        errsts = check_condition_result;
+                }
                break;
        case REPORT_LUNS:       /* mandatory, ignore unit attention */
                delay_override = 1;
@@ -531,6 +546,9 @@ int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done)
                delay_override = 1;
                errsts = check_readiness(SCpnt, 0, devip);
                break;
+       case WRITE_BUFFER:
+               errsts = check_readiness(SCpnt, 1, devip);
+               break;
        default:
                if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
                        printk(KERN_INFO "scsi_debug: Opcode: 0x%x not "
@@ -954,7 +972,9 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target,
        int alloc_len, n, ret;
 
        alloc_len = (cmd[3] << 8) + cmd[4];
-       arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_KERNEL);
+       arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
+       if (! arr)
+               return DID_REQUEUE << 16;
        if (devip->wlun)
                pq_pdt = 0x1e;  /* present, wlun */
        else if (scsi_debug_no_lun_0 && (0 == devip->lun))
@@ -1217,7 +1237,9 @@ static int resp_report_tgtpgs(struct scsi_cmnd * scp,
        alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8)
                + cmd[9]);
 
-       arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_KERNEL);
+       arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
+       if (! arr)
+               return DID_REQUEUE << 16;
        /*
         * EVPD page 0x88 states we have two ports, one
         * real and a fake port with no device connected.
@@ -1996,6 +2018,8 @@ static int scsi_debug_slave_configure(struct scsi_device * sdp)
        if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN)
                sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN;
        devip = devInfoReg(sdp);
+       if (NULL == devip)
+               return 1;       /* no resources, will be marked offline */
        sdp->hostdata = devip;
        if (sdp->host->cmd_per_lun)
                scsi_adjust_queue_depth(sdp, SDEBUG_TAGGED_QUEUING,
@@ -2044,7 +2068,7 @@ static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev)
                }
        }
        if (NULL == open_devip) { /* try and make a new one */
-               open_devip = kzalloc(sizeof(*open_devip),GFP_KERNEL);
+               open_devip = kzalloc(sizeof(*open_devip),GFP_ATOMIC);
                if (NULL == open_devip) {
                        printk(KERN_ERR "%s: out of memory at line %d\n",
                                __FUNCTION__, __LINE__);
@@ -2388,7 +2412,7 @@ MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
 MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
 MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
 MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
-MODULE_PARM_DESC(opts, "1->noise, 2->medium_error, 4->... (def=0)");
+MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
 MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
 MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=5[SPC-3])");
 MODULE_PARM_DESC(virtual_gb, "virtual gigabyte size (def=0 -> use dev_size_mb)");
@@ -2943,7 +2967,6 @@ static int sdebug_add_adapter(void)
         struct list_head *lh, *lh_sf;
 
         sdbg_host = kzalloc(sizeof(*sdbg_host),GFP_KERNEL);
-
         if (NULL == sdbg_host) {
                 printk(KERN_ERR "%s: out of memory at line %d\n",
                        __FUNCTION__, __LINE__);
index 2ecb6ff42444697d9aa866de4bb00c0d707880b5..b8edcf5b54511be2f10fc9690fd01fbdd4dfb99e 100644 (file)
@@ -359,6 +359,11 @@ static int scsi_check_sense(struct scsi_cmnd *scmd)
                return SUCCESS;
 
        case MEDIUM_ERROR:
+               if (sshdr.asc == 0x11 || /* UNRECOVERED READ ERR */
+                   sshdr.asc == 0x13 || /* AMNF DATA FIELD */
+                   sshdr.asc == 0x14) { /* RECORD NOT FOUND */
+                       return SUCCESS;
+               }
                return NEEDS_RETRY;
 
        case HARDWARE_ERROR:
@@ -452,6 +457,128 @@ static void scsi_eh_done(struct scsi_cmnd *scmd)
                complete(eh_action);
 }
 
+/**
+ * scsi_try_host_reset - ask host adapter to reset itself
+ * @scmd:      SCSI cmd to send hsot reset.
+ **/
+static int scsi_try_host_reset(struct scsi_cmnd *scmd)
+{
+       unsigned long flags;
+       int rtn;
+
+       SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Snd Host RST\n",
+                                         __FUNCTION__));
+
+       if (!scmd->device->host->hostt->eh_host_reset_handler)
+               return FAILED;
+
+       rtn = scmd->device->host->hostt->eh_host_reset_handler(scmd);
+
+       if (rtn == SUCCESS) {
+               if (!scmd->device->host->hostt->skip_settle_delay)
+                       ssleep(HOST_RESET_SETTLE_TIME);
+               spin_lock_irqsave(scmd->device->host->host_lock, flags);
+               scsi_report_bus_reset(scmd->device->host,
+                                     scmd_channel(scmd));
+               spin_unlock_irqrestore(scmd->device->host->host_lock, flags);
+       }
+
+       return rtn;
+}
+
+/**
+ * scsi_try_bus_reset - ask host to perform a bus reset
+ * @scmd:      SCSI cmd to send bus reset.
+ **/
+static int scsi_try_bus_reset(struct scsi_cmnd *scmd)
+{
+       unsigned long flags;
+       int rtn;
+
+       SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Snd Bus RST\n",
+                                         __FUNCTION__));
+
+       if (!scmd->device->host->hostt->eh_bus_reset_handler)
+               return FAILED;
+
+       rtn = scmd->device->host->hostt->eh_bus_reset_handler(scmd);
+
+       if (rtn == SUCCESS) {
+               if (!scmd->device->host->hostt->skip_settle_delay)
+                       ssleep(BUS_RESET_SETTLE_TIME);
+               spin_lock_irqsave(scmd->device->host->host_lock, flags);
+               scsi_report_bus_reset(scmd->device->host,
+                                     scmd_channel(scmd));
+               spin_unlock_irqrestore(scmd->device->host->host_lock, flags);
+       }
+
+       return rtn;
+}
+
+/**
+ * scsi_try_bus_device_reset - Ask host to perform a BDR on a dev
+ * @scmd:      SCSI cmd used to send BDR
+ *
+ * Notes:
+ *    There is no timeout for this operation.  if this operation is
+ *    unreliable for a given host, then the host itself needs to put a
+ *    timer on it, and set the host back to a consistent state prior to
+ *    returning.
+ **/
+static int scsi_try_bus_device_reset(struct scsi_cmnd *scmd)
+{
+       int rtn;
+
+       if (!scmd->device->host->hostt->eh_device_reset_handler)
+               return FAILED;
+
+       rtn = scmd->device->host->hostt->eh_device_reset_handler(scmd);
+       if (rtn == SUCCESS) {
+               scmd->device->was_reset = 1;
+               scmd->device->expecting_cc_ua = 1;
+       }
+
+       return rtn;
+}
+
+static int __scsi_try_to_abort_cmd(struct scsi_cmnd *scmd)
+{
+       if (!scmd->device->host->hostt->eh_abort_handler)
+               return FAILED;
+
+       return scmd->device->host->hostt->eh_abort_handler(scmd);
+}
+
+/**
+ * scsi_try_to_abort_cmd - Ask host to abort a running command.
+ * @scmd:      SCSI cmd to abort from Lower Level.
+ *
+ * Notes:
+ *    This function will not return until the user's completion function
+ *    has been called.  there is no timeout on this operation.  if the
+ *    author of the low-level driver wishes this operation to be timed,
+ *    they can provide this facility themselves.  helper functions in
+ *    scsi_error.c can be supplied to make this easier to do.
+ **/
+static int scsi_try_to_abort_cmd(struct scsi_cmnd *scmd)
+{
+       /*
+        * scsi_done was called just after the command timed out and before
+        * we had a chance to process it. (db)
+        */
+       if (scmd->serial_number == 0)
+               return SUCCESS;
+       return __scsi_try_to_abort_cmd(scmd);
+}
+
+static void scsi_abort_eh_cmnd(struct scsi_cmnd *scmd)
+{
+       if (__scsi_try_to_abort_cmd(scmd) != SUCCESS)
+               if (scsi_try_bus_device_reset(scmd) != SUCCESS)
+                       if (scsi_try_bus_reset(scmd) != SUCCESS)
+                               scsi_try_host_reset(scmd);
+}
+
 /**
  * scsi_send_eh_cmnd  - submit a scsi command as part of error recory
  * @scmd:       SCSI command structure to hijack
@@ -579,13 +706,7 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd,
                        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);
+               scsi_abort_eh_cmnd(scmd);
                rtn = FAILED;
        }
 
@@ -672,8 +793,8 @@ EXPORT_SYMBOL(scsi_eh_finish_cmd);
  *    XXX: Long term this code should go away, but that needs an audit of
  *         all LLDDs first.
  **/
-static int scsi_eh_get_sense(struct list_head *work_q,
-                            struct list_head *done_q)
+int scsi_eh_get_sense(struct list_head *work_q,
+                     struct list_head *done_q)
 {
        struct scsi_cmnd *scmd, *next;
        int rtn;
@@ -715,31 +836,7 @@ static int scsi_eh_get_sense(struct list_head *work_q,
 
        return list_empty(work_q);
 }
-
-/**
- * scsi_try_to_abort_cmd - Ask host to abort a running command.
- * @scmd:      SCSI cmd to abort from Lower Level.
- *
- * Notes:
- *    This function will not return until the user's completion function
- *    has been called.  there is no timeout on this operation.  if the
- *    author of the low-level driver wishes this operation to be timed,
- *    they can provide this facility themselves.  helper functions in
- *    scsi_error.c can be supplied to make this easier to do.
- **/
-static int scsi_try_to_abort_cmd(struct scsi_cmnd *scmd)
-{
-       if (!scmd->device->host->hostt->eh_abort_handler)
-               return FAILED;
-
-       /*
-        * scsi_done was called just after the command timed out and before
-        * we had a chance to process it. (db)
-        */
-       if (scmd->serial_number == 0)
-               return SUCCESS;
-       return scmd->device->host->hostt->eh_abort_handler(scmd);
-}
+EXPORT_SYMBOL_GPL(scsi_eh_get_sense);
 
 /**
  * scsi_eh_tur - Send TUR to device.
@@ -814,32 +911,6 @@ static int scsi_eh_abort_cmds(struct list_head *work_q,
        return list_empty(work_q);
 }
 
-/**
- * scsi_try_bus_device_reset - Ask host to perform a BDR on a dev
- * @scmd:      SCSI cmd used to send BDR       
- *
- * Notes:
- *    There is no timeout for this operation.  if this operation is
- *    unreliable for a given host, then the host itself needs to put a
- *    timer on it, and set the host back to a consistent state prior to
- *    returning.
- **/
-static int scsi_try_bus_device_reset(struct scsi_cmnd *scmd)
-{
-       int rtn;
-
-       if (!scmd->device->host->hostt->eh_device_reset_handler)
-               return FAILED;
-
-       rtn = scmd->device->host->hostt->eh_device_reset_handler(scmd);
-       if (rtn == SUCCESS) {
-               scmd->device->was_reset = 1;
-               scmd->device->expecting_cc_ua = 1;
-       }
-
-       return rtn;
-}
-
 /**
  * scsi_eh_try_stu - Send START_UNIT to device.
  * @scmd:      Scsi cmd to send START_UNIT
@@ -970,64 +1041,6 @@ static int scsi_eh_bus_device_reset(struct Scsi_Host *shost,
        return list_empty(work_q);
 }
 
-/**
- * scsi_try_bus_reset - ask host to perform a bus reset
- * @scmd:      SCSI cmd to send bus reset.
- **/
-static int scsi_try_bus_reset(struct scsi_cmnd *scmd)
-{
-       unsigned long flags;
-       int rtn;
-
-       SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Snd Bus RST\n",
-                                         __FUNCTION__));
-
-       if (!scmd->device->host->hostt->eh_bus_reset_handler)
-               return FAILED;
-
-       rtn = scmd->device->host->hostt->eh_bus_reset_handler(scmd);
-
-       if (rtn == SUCCESS) {
-               if (!scmd->device->host->hostt->skip_settle_delay)
-                       ssleep(BUS_RESET_SETTLE_TIME);
-               spin_lock_irqsave(scmd->device->host->host_lock, flags);
-               scsi_report_bus_reset(scmd->device->host,
-                                     scmd_channel(scmd));
-               spin_unlock_irqrestore(scmd->device->host->host_lock, flags);
-       }
-
-       return rtn;
-}
-
-/**
- * scsi_try_host_reset - ask host adapter to reset itself
- * @scmd:      SCSI cmd to send hsot reset.
- **/
-static int scsi_try_host_reset(struct scsi_cmnd *scmd)
-{
-       unsigned long flags;
-       int rtn;
-
-       SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Snd Host RST\n",
-                                         __FUNCTION__));
-
-       if (!scmd->device->host->hostt->eh_host_reset_handler)
-               return FAILED;
-
-       rtn = scmd->device->host->hostt->eh_host_reset_handler(scmd);
-
-       if (rtn == SUCCESS) {
-               if (!scmd->device->host->hostt->skip_settle_delay)
-                       ssleep(HOST_RESET_SETTLE_TIME);
-               spin_lock_irqsave(scmd->device->host->host_lock, flags);
-               scsi_report_bus_reset(scmd->device->host,
-                                     scmd_channel(scmd));
-               spin_unlock_irqrestore(scmd->device->host->host_lock, flags);
-       }
-
-       return rtn;
-}
-
 /**
  * scsi_eh_bus_reset - send a bus reset 
  * @shost:     scsi host being recovered.
@@ -1411,9 +1424,9 @@ static void scsi_restart_operations(struct Scsi_Host *shost)
  * @eh_done_q: list_head for processed commands.
  *
  **/
-static void scsi_eh_ready_devs(struct Scsi_Host *shost,
-                              struct list_head *work_q,
-                              struct list_head *done_q)
+void scsi_eh_ready_devs(struct Scsi_Host *shost,
+                       struct list_head *work_q,
+                       struct list_head *done_q)
 {
        if (!scsi_eh_stu(shost, work_q, done_q))
                if (!scsi_eh_bus_device_reset(shost, work_q, done_q))
@@ -1421,6 +1434,7 @@ static void scsi_eh_ready_devs(struct Scsi_Host *shost,
                                if (!scsi_eh_host_reset(work_q, done_q))
                                        scsi_eh_offline_sdevs(work_q, done_q);
 }
+EXPORT_SYMBOL_GPL(scsi_eh_ready_devs);
 
 /**
  * scsi_eh_flush_done_q - finish processed commands or retry them.
index f02f48a882a97b4150a7afe9eb403f1ce7f293fb..9f7482d0b59489e7efccc347a8b7ce33208b4cdb 100644 (file)
@@ -388,10 +388,9 @@ int scsi_execute_async(struct scsi_device *sdev, const unsigned char *cmd,
        int err = 0;
        int write = (data_direction == DMA_TO_DEVICE);
 
-       sioc = kmem_cache_alloc(scsi_io_context_cache, gfp);
+       sioc = kmem_cache_zalloc(scsi_io_context_cache, gfp);
        if (!sioc)
                return DRIVER_ERROR << 24;
-       memset(sioc, 0, sizeof(*sioc));
 
        req = blk_get_request(sdev->request_queue, write, gfp);
        if (!req)
@@ -1400,7 +1399,7 @@ static void scsi_softirq_done(struct request *rq)
                        scsi_finish_command(cmd);
                        break;
                case NEEDS_RETRY:
-                       scsi_retry_command(cmd);
+                       scsi_queue_insert(cmd, SCSI_MLQUEUE_EH_RETRY);
                        break;
                case ADD_TO_MLQUEUE:
                        scsi_queue_insert(cmd, SCSI_MLQUEUE_DEVICE_BUSY);
@@ -2250,6 +2249,8 @@ void *scsi_kmap_atomic_sg(struct scatterlist *sg, int sg_count,
        size_t sg_len = 0, len_complete = 0;
        struct page *page;
 
+       WARN_ON(!irqs_disabled());
+
        for (i = 0; i < sg_count; i++) {
                len_complete = sg_len; /* Complete sg-entries */
                sg_len += sg[i].length;
index f458c2f686d2364d4387ea0bc8b4d0afec6f8d4c..ee8efe849bf41c0c906c5a9f0769e9a054d483a2 100644 (file)
@@ -28,7 +28,6 @@ extern int scsi_dispatch_cmd(struct scsi_cmnd *cmd);
 extern int scsi_setup_command_freelist(struct Scsi_Host *shost);
 extern void scsi_destroy_command_freelist(struct Scsi_Host *shost);
 extern void __scsi_done(struct scsi_cmnd *cmd);
-extern int scsi_retry_command(struct scsi_cmnd *cmd);
 #ifdef CONFIG_SCSI_LOGGING
 void scsi_log_send(struct scsi_cmnd *cmd);
 void scsi_log_completion(struct scsi_cmnd *cmd, int disposition);
@@ -58,6 +57,11 @@ extern int scsi_error_handler(void *host);
 extern int scsi_decide_disposition(struct scsi_cmnd *cmd);
 extern void scsi_eh_wakeup(struct Scsi_Host *shost);
 extern int scsi_eh_scmd_add(struct scsi_cmnd *, int);
+void scsi_eh_ready_devs(struct Scsi_Host *shost,
+                       struct list_head *work_q,
+                       struct list_head *done_q);
+int scsi_eh_get_sense(struct list_head *work_q,
+                     struct list_head *done_q);
 
 /* scsi_lib.c */
 extern int scsi_maybe_unblock_host(struct scsi_device *sdev);
index 524a5f7a5193d0a0275120bf5743196c78153a26..69d6e9b198c42fa6aceb7ebace35e19f305deffc 100644 (file)
@@ -308,7 +308,7 @@ static int proc_scsi_open(struct inode *inode, struct file *file)
        return single_open(file, proc_scsi_show, NULL);
 }
 
-static struct file_operations proc_scsi_operations = {
+static const struct file_operations proc_scsi_operations = {
        .open           = proc_scsi_open,
        .read           = seq_read,
        .write          = proc_scsi_write,
index 96b7cbd746a84ac323d92bf6c72d0333515b3fd3..a43b9ec3aefd66f2953841c964cb2fd2c5746106 100644 (file)
@@ -1029,7 +1029,7 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget,
 
                                sdev_printk(KERN_INFO, sdev,
                                        "scsi scan: consider passing scsi_mod."
-                                       "dev_flags=%s:%s:0x240 or 0x800240\n",
+                                       "dev_flags=%s:%s:0x240 or 0x1000240\n",
                                        scsi_inq_str(vend, result, 8, 16),
                                        scsi_inq_str(mod, result, 16, 32));
                        });
index 04d06c25132b39076648429077614efc9879c1c1..6cfaaa2d0c819a1478f4b31a80503a24db71f652 100644 (file)
@@ -41,7 +41,7 @@ static struct ctl_table_header *scsi_table_header;
 
 int __init scsi_init_sysctl(void)
 {
-       scsi_table_header = register_sysctl_table(scsi_root_table, 1);
+       scsi_table_header = register_sysctl_table(scsi_root_table);
        if (!scsi_table_header)
                return -ENOMEM;
        return 0;
index 37bbfbdb870f7adbffb9f688d02898db14c8f2ef..f2344ab8deff882b3dc00f20351626562c0085f3 100644 (file)
@@ -280,7 +280,7 @@ static int tgt_open(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations tgt_fops = {
+static const struct file_operations tgt_fops = {
        .owner          = THIS_MODULE,
        .open           = tgt_open,
        .poll           = tgt_poll,
index 3571ce8934e7af15f8924a832c6be7047fbbecb4..0d3c10f2134c87d94165c1b019be4e8f019b328c 100644 (file)
@@ -26,7 +26,6 @@
  */
 #include <linux/module.h>
 #include <linux/init.h>
-#include <linux/sched.h>       /* workqueue stuff, HZ */
 #include <scsi/scsi_device.h>
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_transport.h>
index 5c0b75bbfa10c9a78e2a9536ce3d12b83f789441..6d39150e205be19593e71406f672bee539ca9368 100644 (file)
@@ -336,6 +336,51 @@ show_sas_device_type(struct class_device *cdev, char *buf)
 }
 static CLASS_DEVICE_ATTR(device_type, S_IRUGO, show_sas_device_type, NULL);
 
+static ssize_t do_sas_phy_enable(struct class_device *cdev,
+               size_t count, int enable)
+{
+       struct sas_phy *phy = transport_class_to_phy(cdev);
+       struct Scsi_Host *shost = dev_to_shost(phy->dev.parent);
+       struct sas_internal *i = to_sas_internal(shost->transportt);
+       int error;
+
+       error = i->f->phy_enable(phy, enable);
+       if (error)
+               return error;
+       phy->enabled = enable;
+       return count;
+};
+
+static ssize_t store_sas_phy_enable(struct class_device *cdev,
+               const char *buf, size_t count)
+{
+       if (count < 1)
+               return -EINVAL;
+
+       switch (buf[0]) {
+       case '0':
+               do_sas_phy_enable(cdev, count, 0);
+               break;
+       case '1':
+               do_sas_phy_enable(cdev, count, 1);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return count;
+}
+
+static ssize_t show_sas_phy_enable(struct class_device *cdev, char *buf)
+{
+       struct sas_phy *phy = transport_class_to_phy(cdev);
+
+       return snprintf(buf, 20, "%d", phy->enabled);
+}
+
+static CLASS_DEVICE_ATTR(enable, S_IRUGO | S_IWUSR, show_sas_phy_enable,
+                        store_sas_phy_enable);
+
 static ssize_t do_sas_phy_reset(struct class_device *cdev,
                size_t count, int hard_reset)
 {
@@ -435,6 +480,7 @@ struct sas_phy *sas_phy_alloc(struct device *parent, int number)
                return NULL;
 
        phy->number = number;
+       phy->enabled = 1;
 
        device_initialize(&phy->dev);
        phy->dev.parent = get_device(parent);
@@ -579,8 +625,19 @@ static void sas_port_release(struct device *dev)
 static void sas_port_create_link(struct sas_port *port,
                                 struct sas_phy *phy)
 {
-       sysfs_create_link(&port->dev.kobj, &phy->dev.kobj, phy->dev.bus_id);
-       sysfs_create_link(&phy->dev.kobj, &port->dev.kobj, "port");
+       int res;
+
+       res = sysfs_create_link(&port->dev.kobj, &phy->dev.kobj,
+                               phy->dev.bus_id);
+       if (res)
+               goto err;
+       res = sysfs_create_link(&phy->dev.kobj, &port->dev.kobj, "port");
+       if (res)
+               goto err;
+       return;
+err:
+       printk(KERN_ERR "%s: Cannot create port links, err=%d\n",
+              __FUNCTION__, res);
 }
 
 static void sas_port_delete_link(struct sas_port *port,
@@ -818,13 +875,20 @@ EXPORT_SYMBOL(sas_port_delete_phy);
 
 void sas_port_mark_backlink(struct sas_port *port)
 {
+       int res;
        struct device *parent = port->dev.parent->parent->parent;
 
        if (port->is_backlink)
                return;
        port->is_backlink = 1;
-       sysfs_create_link(&port->dev.kobj, &parent->kobj,
-                         parent->bus_id);
+       res = sysfs_create_link(&port->dev.kobj, &parent->kobj,
+                               parent->bus_id);
+       if (res)
+               goto err;
+       return;
+err:
+       printk(KERN_ERR "%s: Cannot create port backlink, err=%d\n",
+              __FUNCTION__, res);
 
 }
 EXPORT_SYMBOL(sas_port_mark_backlink);
@@ -1237,7 +1301,7 @@ int sas_rphy_add(struct sas_rphy *rphy)
        if (identify->device_type == SAS_END_DEVICE &&
            rphy->scsi_target_id != -1) {
                scsi_scan_target(&rphy->dev, 0,
-                               rphy->scsi_target_id, ~0, 0);
+                               rphy->scsi_target_id, SCAN_WILD_CARD, 0);
        }
 
        return 0;
@@ -1253,7 +1317,7 @@ EXPORT_SYMBOL(sas_rphy_add);
  * Note:
  *   This function must only be called on a remote
  *   PHY that has not sucessfully been added using
- *   sas_rphy_add().
+ *   sas_rphy_add() (or has been sas_rphy_remove()'d)
  */
 void sas_rphy_free(struct sas_rphy *rphy)
 {
@@ -1272,18 +1336,30 @@ void sas_rphy_free(struct sas_rphy *rphy)
 EXPORT_SYMBOL(sas_rphy_free);
 
 /**
- * sas_rphy_delete  --  remove SAS remote PHY
- * @rphy:      SAS remote PHY to remove
+ * sas_rphy_delete  --  remove and free SAS remote PHY
+ * @rphy:      SAS remote PHY to remove and free
  *
- * Removes the specified SAS remote PHY.
+ * Removes the specified SAS remote PHY and frees it.
  */
 void
 sas_rphy_delete(struct sas_rphy *rphy)
+{
+       sas_rphy_remove(rphy);
+       sas_rphy_free(rphy);
+}
+EXPORT_SYMBOL(sas_rphy_delete);
+
+/**
+ * sas_rphy_remove  --  remove SAS remote PHY
+ * @rphy:      SAS remote phy to remove
+ *
+ * Removes the specified SAS remote PHY.
+ */
+void
+sas_rphy_remove(struct sas_rphy *rphy)
 {
        struct device *dev = &rphy->dev;
        struct sas_port *parent = dev_to_sas_port(dev->parent);
-       struct Scsi_Host *shost = dev_to_shost(parent->dev.parent);
-       struct sas_host_attrs *sas_host = to_sas_host_attrs(shost);
 
        switch (rphy->identify.device_type) {
        case SAS_END_DEVICE:
@@ -1299,17 +1375,10 @@ sas_rphy_delete(struct sas_rphy *rphy)
 
        transport_remove_device(dev);
        device_del(dev);
-       transport_destroy_device(dev);
-
-       mutex_lock(&sas_host->lock);
-       list_del(&rphy->list);
-       mutex_unlock(&sas_host->lock);
 
        parent->rphy = NULL;
-
-       put_device(dev);
 }
-EXPORT_SYMBOL(sas_rphy_delete);
+EXPORT_SYMBOL(sas_rphy_remove);
 
 /**
  * scsi_is_sas_rphy  --  check if a struct device represents a SAS remote PHY
@@ -1389,6 +1458,10 @@ static int sas_user_scan(struct Scsi_Host *shost, uint channel,
        SETUP_TEMPLATE_RW(phy_attrs, field, S_IRUGO | S_IWUSR, 1,       \
                        !i->f->set_phy_speed, S_IRUGO)
 
+#define SETUP_OPTIONAL_PHY_ATTRIBUTE_RW(field, func)                   \
+       SETUP_TEMPLATE_RW(phy_attrs, field, S_IRUGO | S_IWUSR, 1,       \
+                         !i->f->func, S_IRUGO)
+
 #define SETUP_PORT_ATTRIBUTE(field)                                    \
        SETUP_TEMPLATE(port_attrs, field, S_IRUGO, 1)
 
@@ -1396,10 +1469,10 @@ static int sas_user_scan(struct Scsi_Host *shost, uint channel,
        SETUP_TEMPLATE(phy_attrs, field, S_IRUGO, i->f->func)
 
 #define SETUP_PHY_ATTRIBUTE_WRONLY(field)                              \
-       SETUP_TEMPLATE(phy_attrs, field, S_IWUGO, 1)
+       SETUP_TEMPLATE(phy_attrs, field, S_IWUSR, 1)
 
 #define SETUP_OPTIONAL_PHY_ATTRIBUTE_WRONLY(field, func)               \
-       SETUP_TEMPLATE(phy_attrs, field, S_IWUGO, i->f->func)
+       SETUP_TEMPLATE(phy_attrs, field, S_IWUSR, i->f->func)
 
 #define SETUP_END_DEV_ATTRIBUTE(field)                                 \
        SETUP_TEMPLATE(end_dev_attrs, field, S_IRUGO, 1)
@@ -1479,6 +1552,7 @@ sas_attach_transport(struct sas_function_template *ft)
        SETUP_PHY_ATTRIBUTE(phy_reset_problem_count);
        SETUP_OPTIONAL_PHY_ATTRIBUTE_WRONLY(link_reset, phy_reset);
        SETUP_OPTIONAL_PHY_ATTRIBUTE_WRONLY(hard_reset, phy_reset);
+       SETUP_OPTIONAL_PHY_ATTRIBUTE_RW(enable, phy_enable);
        i->phy_attrs[count] = NULL;
 
        count = 0;
@@ -1587,7 +1661,7 @@ static void __exit sas_transport_exit(void)
 }
 
 MODULE_AUTHOR("Christoph Hellwig");
-MODULE_DESCRIPTION("SAS Transphy Attributes");
+MODULE_DESCRIPTION("SAS Transport Attributes");
 MODULE_LICENSE("GPL");
 
 module_init(sas_transport_init);
index 014d7fea1ff375d5a5c982c8d5c2f2d67d3be28b..6f56f8750635eca0e44ec6af2914a40f54b7c123 100644 (file)
@@ -46,7 +46,6 @@
                                 * two cc/ua clears */
 
 /* Private data accessors (keep these out of the header file) */
-#define spi_dv_pending(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_pending)
 #define spi_dv_in_progress(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_in_progress)
 #define spi_dv_mutex(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_mutex)
 
index b781a90d6699038f4f2a0e819ca6d2a93dd619bb..3f048bd6326ddc5ff70b8f031e0ce1e1b4c06404 100644 (file)
@@ -35,7 +35,6 @@
 #include <linux/module.h>
 #include <linux/fs.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/bio.h>
 #include <linux/genhd.h>
index 551baccec5230c57ec2fb3bcdf714d7969fe1fab..018c65f73ac48e8fef3350e17f346fab8cfff2d1 100644 (file)
@@ -123,6 +123,7 @@ sim710_probe_common(struct device *dev, unsigned long base_addr,
        hostdata->differential = differential;
        hostdata->clock = clock;
        hostdata->chip710 = 1;
+       hostdata->burst_length = 8;
 
        /* and register the chip */
        if((host = NCR_700_detect(&sim710_driver_template, hostdata, dev))
diff --git a/drivers/scsi/sni_53c710.c b/drivers/scsi/sni_53c710.c
new file mode 100644 (file)
index 0000000..6bc5051
--- /dev/null
@@ -0,0 +1,159 @@
+/* -*- mode: c; c-basic-offset: 8 -*- */
+
+/* SNI RM driver
+ *
+ * Copyright (C) 2001 by James.Bottomley@HansenPartnership.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., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+**-----------------------------------------------------------------------------
+ */
+
+/*
+ * Based on lasi700.c
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/stat.h>
+#include <linux/mm.h>
+#include <linux/blkdev.h>
+#include <linux/sched.h>
+#include <linux/ioport.h>
+#include <linux/dma-mapping.h>
+#include <linux/platform_device.h>
+
+#include <asm/page.h>
+#include <asm/pgtable.h>
+#include <asm/irq.h>
+#include <asm/delay.h>
+
+#include <scsi/scsi_host.h>
+#include <scsi/scsi_device.h>
+#include <scsi/scsi_transport.h>
+#include <scsi/scsi_transport_spi.h>
+
+#include "53c700.h"
+
+MODULE_AUTHOR("Thomas Bogendörfer");
+MODULE_DESCRIPTION("SNI RM 53c710 SCSI Driver");
+MODULE_LICENSE("GPL");
+
+#define SNIRM710_CLOCK 32
+
+static struct scsi_host_template snirm710_template = {
+       .name           = "SNI RM SCSI 53c710",
+       .proc_name      = "snirm_53c710",
+       .this_id        = 7,
+       .module         = THIS_MODULE,
+};
+
+static int __init snirm710_probe(struct platform_device *dev)
+{
+       unsigned long base;
+       struct NCR_700_Host_Parameters *hostdata;
+       struct Scsi_Host *host;
+       struct  resource *res;
+
+       res = platform_get_resource(dev, IORESOURCE_MEM, 0);
+       if (!res)
+               return -ENODEV;
+
+       base = res->start;
+       hostdata = kzalloc(sizeof(*hostdata), GFP_KERNEL);
+       if (!hostdata) {
+               printk(KERN_ERR "%s: Failed to allocate host data\n",
+                      dev->dev.bus_id);
+               return -ENOMEM;
+       }
+
+       hostdata->dev = &dev->dev;
+       dma_set_mask(&dev->dev, DMA_32BIT_MASK);
+       hostdata->base = ioremap_nocache(CPHYSADDR(base), 0x100);
+       hostdata->differential = 0;
+
+       hostdata->clock = SNIRM710_CLOCK;
+       hostdata->force_le_on_be = 1;
+       hostdata->chip710 = 1;
+       hostdata->burst_length = 4;
+
+       host = NCR_700_detect(&snirm710_template, hostdata, &dev->dev);
+       if (!host)
+               goto out_kfree;
+       host->this_id = 7;
+       host->base = base;
+       host->irq = platform_get_irq(dev, 0);
+       if(request_irq(host->irq, NCR_700_intr, SA_SHIRQ, "snirm710", host)) {
+               printk(KERN_ERR "snirm710: request_irq failed!\n");
+               goto out_put_host;
+       }
+
+       dev_set_drvdata(&dev->dev, host);
+       scsi_scan_host(host);
+
+       return 0;
+
+ out_put_host:
+       scsi_host_put(host);
+ out_kfree:
+       iounmap(hostdata->base);
+       kfree(hostdata);
+       return -ENODEV;
+}
+
+static int __exit snirm710_driver_remove(struct platform_device *dev)
+{
+       struct Scsi_Host *host = dev_get_drvdata(&dev->dev);
+       struct NCR_700_Host_Parameters *hostdata =
+               (struct NCR_700_Host_Parameters *)host->hostdata[0];
+
+       scsi_remove_host(host);
+       NCR_700_release(host);
+       free_irq(host->irq, host);
+       iounmap(hostdata->base);
+       kfree(hostdata);
+
+       return 0;
+}
+
+static struct platform_driver snirm710_driver = {
+       .probe  = snirm710_probe,
+       .remove = __devexit_p(snirm710_driver_remove),
+       .driver = {
+               .name   = "snirm_53c710",
+       },
+};
+
+static int __init snirm710_init(void)
+{
+       int err;
+
+       if ((err = platform_driver_register(&snirm710_driver))) {
+               printk(KERN_ERR "Driver registration failed\n");
+               return err;
+       }
+       return 0;
+}
+
+static void __exit snirm710_exit(void)
+{
+       platform_driver_unregister(&snirm710_driver);
+}
+
+module_init(snirm710_init);
+module_exit(snirm710_exit);
index 89e9b36b17882daecaa73660647abd87ba8d9553..1857d68e7195e5b9c19a20afa3fd1ed6af08e790 100644 (file)
@@ -35,7 +35,6 @@
 #include <linux/module.h>
 #include <linux/fs.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/bio.h>
 #include <linux/string.h>
index 0578ba42718b125ead70d8a9d599934d18f5e1fe..e1589f91706a2f18187b2229599e8a1ecc744e46 100644 (file)
@@ -1,5 +1,4 @@
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/fs.h>
 #include <linux/errno.h>
index 488ec7948a570766856436970a40aa2fd3813528..3d2e02381e92257618050314a2e358957e204221 100644 (file)
@@ -9,7 +9,7 @@
    Steve Hirsch, Andreas Koppenh"ofer, Michael Leodolter, Eyal Lebedinsky,
    Michael Schaefer, J"org Weule, and Eric Youngdale.
 
-   Copyright 1992 - 2006 Kai Makisara
+   Copyright 1992 - 2007 Kai Makisara
    email Kai.Makisara@kolumbus.fi
 
    Some small formal changes - aeb, 950809
@@ -17,7 +17,7 @@
    Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support
  */
 
-static const char *verstr = "20061107";
+static const char *verstr = "20070203";
 
 #include <linux/module.h>
 
@@ -1168,6 +1168,7 @@ static int st_open(struct inode *inode, struct file *filp)
                STps = &(STp->ps[i]);
                STps->rw = ST_IDLE;
        }
+       STp->try_dio_now = STp->try_dio;
        STp->recover_count = 0;
        DEB( STp->nbr_waits = STp->nbr_finished = 0;
             STp->nbr_requests = STp->nbr_dio = STp->nbr_pages = STp->nbr_combinable = 0; )
@@ -1400,9 +1401,9 @@ static int setup_buffering(struct scsi_tape *STp, const char __user *buf,
        struct st_buffer *STbp = STp->buffer;
 
        if (is_read)
-               i = STp->try_dio && try_rdio;
+               i = STp->try_dio_now && try_rdio;
        else
-               i = STp->try_dio && try_wdio;
+               i = STp->try_dio_now && try_wdio;
 
        if (i && ((unsigned long)buf & queue_dma_alignment(
                                        STp->device->request_queue)) == 0) {
@@ -1599,7 +1600,7 @@ st_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
                        STm->do_async_writes && STps->eof < ST_EOM_OK;
 
                if (STp->block_size != 0 && STm->do_buffer_writes &&
-                   !(STp->try_dio && try_wdio) && STps->eof < ST_EOM_OK &&
+                   !(STp->try_dio_now && try_wdio) && STps->eof < ST_EOM_OK &&
                    STbp->buffer_bytes < STbp->buffer_size) {
                        STp->dirty = 1;
                        /* Don't write a buffer that is not full enough. */
@@ -1769,7 +1770,7 @@ static long read_tape(struct scsi_tape *STp, long count,
        if (STp->block_size == 0)
                blks = bytes = count;
        else {
-               if (!(STp->try_dio && try_rdio) && STm->do_read_ahead) {
+               if (!(STp->try_dio_now && try_rdio) && STm->do_read_ahead) {
                        blks = (STp->buffer)->buffer_blocks;
                        bytes = blks * STp->block_size;
                } else {
@@ -1948,10 +1949,12 @@ st_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos)
                goto out;
 
        STm = &(STp->modes[STp->current_mode]);
-       if (!(STm->do_read_ahead) && STp->block_size != 0 &&
-           (count % STp->block_size) != 0) {
-               retval = (-EINVAL);     /* Read must be integral number of blocks */
-               goto out;
+       if (STp->block_size != 0 && (count % STp->block_size) != 0) {
+               if (!STm->do_read_ahead) {
+                       retval = (-EINVAL);     /* Read must be integral number of blocks */
+                       goto out;
+               }
+               STp->try_dio_now = 0;  /* Direct i/o can't handle split blocks */
        }
 
        STps = &(STp->ps[STp->partition]);
@@ -3861,7 +3864,7 @@ __setup("st=", st_setup);
 
 #endif
 
-static struct file_operations st_fops =
+static const struct file_operations st_fops =
 {
        .owner =        THIS_MODULE,
        .read =         st_read,
index 05a5cae126ec06e8c75c632821f8a6d8548236eb..50f3deb1f9ed92fcaf06bcc8c62329e966db8750 100644 (file)
@@ -117,7 +117,8 @@ struct scsi_tape {
        unsigned char cln_sense_value;
        unsigned char cln_sense_mask;
        unsigned char use_pf;                   /* Set Page Format bit in all mode selects? */
-       unsigned char try_dio;                  /* try direct i/o? */
+       unsigned char try_dio;                  /* try direct i/o in general? */
+       unsigned char try_dio_now;              /* try direct i/o before next close? */
        unsigned char c_algo;                   /* compression algorithm */
        unsigned char pos_unknown;                      /* after reset position unknown */
        int tape_type;
index ba6bcdaf2a6afdaf896da7c8a49ab982741d0ca6..69be1324b114ffc274cadd4e805b8e89c4ea1bd3 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/delay.h>
-#include <linux/sched.h>
 #include <linux/time.h>
 #include <linux/pci.h>
 #include <linux/blkdev.h>
index 69ee3e4a820e0dfc1a38b7b2537af29e84fe00bd..5e46d842c6f9b3912092b0efa105da6b785b4657 100644 (file)
@@ -58,7 +58,6 @@
 
 #include <linux/module.h>
 #include <linux/signal.h>
-#include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
 #include <linux/blkdev.h>
index bb0c9fd99e68646617e94fb6aa8cdffc91d7bedd..7cb4a31453e6e3cb73813ddcec50beb2fa8b82fa 100644 (file)
@@ -20,7 +20,6 @@
 
 #include <linux/module.h>
 #include <linux/signal.h>
-#include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
 #include <linux/blkdev.h>
index 32c883f1efa1aecbd5f525af8354f552bf5d1e6c..2ca950582bc336ca0edd1817f702a9feb69efb6c 100644 (file)
@@ -32,7 +32,6 @@
 #include <linux/init.h>
 #include <linux/string.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
 #include <linux/proc_fs.h>
index 0b7a70f61e0d973112c251bd74087b635f26c358..248d60b8d8994f235c1e01102cabb960243a3f37 100644 (file)
 
 #include <asm/system.h>
 #include <linux/signal.h>
-#include <linux/sched.h>
 #include <linux/io.h>
 #include <linux/blkdev.h>
 #include <linux/interrupt.h>
index fa5382e354be71edcd50437386d446979283283b..a583e89238fcf7297b06f6a36b59692badd86ef8 100644 (file)
 #include <linux/module.h>
 #include <linux/delay.h>
 #include <linux/signal.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
 #include <linux/ioport.h>
index 2083454db511d7daf260eb8ceace3f2580cc47bc..835751600e9390c02c44930b0584372686ac7ddf 100644 (file)
@@ -73,7 +73,6 @@
 
 #include <linux/module.h>
 
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/delay.h>
 #include <linux/init.h>
index 5261f0af8b101bcf4e1149caebdb484bbe92aa70..98ec861853280672d0828342184c73025dc555cc 100644 (file)
@@ -364,6 +364,23 @@ serial_out(struct uart_8250_port *up, int offset, int value)
        }
 }
 
+static void
+serial_out_sync(struct uart_8250_port *up, int offset, int value)
+{
+       switch (up->port.iotype) {
+       case UPIO_MEM:
+       case UPIO_MEM32:
+#ifdef CONFIG_SERIAL_8250_AU1X00
+       case UPIO_AU:
+#endif
+               serial_out(up, offset, value);
+               serial_in(up, UART_LCR);        /* safe, no side-effects */
+               break;
+       default:
+               serial_out(up, offset, value);
+       }
+}
+
 /*
  * We used to support using pause I/O for certain machines.  We
  * haven't supported this for a while, but just in case it's badly
@@ -920,12 +937,16 @@ static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
 #ifdef __i386__
                outb(0xff, 0x080);
 #endif
-               scratch2 = serial_inp(up, UART_IER);
+               /*
+                * Mask out IER[7:4] bits for test as some UARTs (e.g. TL
+                * 16C754B) allow only to modify them if an EFR bit is set.
+                */
+               scratch2 = serial_inp(up, UART_IER) & 0x0f;
                serial_outp(up, UART_IER, 0x0F);
 #ifdef __i386__
                outb(0, 0x080);
 #endif
-               scratch3 = serial_inp(up, UART_IER);
+               scratch3 = serial_inp(up, UART_IER) & 0x0f;
                serial_outp(up, UART_IER, scratch);
                if (scratch2 != 0 || scratch3 != 0x0F) {
                        /*
@@ -1041,7 +1062,7 @@ static void autoconfig(struct uart_8250_port *up, unsigned int probeflags)
 #endif
        serial_outp(up, UART_MCR, save_mcr);
        serial8250_clear_fifos(up);
-       (void)serial_in(up, UART_RX);
+       serial_in(up, UART_RX);
        if (up->capabilities & UART_CAP_UUE)
                serial_outp(up, UART_IER, UART_IER_UUE);
        else
@@ -1447,6 +1468,12 @@ static void serial_unlink_irq_chain(struct uart_8250_port *up)
        serial_do_unlink(i, up);
 }
 
+/* Base timer interval for polling */
+static inline int poll_timeout(int timeout)
+{
+       return timeout > 6 ? (timeout / 2 - 2) : 1;
+}
+
 /*
  * This function is used to handle ports that do not have an
  * interrupt.  This doesn't work very well for 16450's, but gives
@@ -1456,16 +1483,51 @@ static void serial_unlink_irq_chain(struct uart_8250_port *up)
 static void serial8250_timeout(unsigned long data)
 {
        struct uart_8250_port *up = (struct uart_8250_port *)data;
-       unsigned int timeout;
        unsigned int iir;
 
        iir = serial_in(up, UART_IIR);
        if (!(iir & UART_IIR_NO_INT))
                serial8250_handle_port(up);
+       mod_timer(&up->timer, jiffies + poll_timeout(up->port.timeout));
+}
+
+static void serial8250_backup_timeout(unsigned long data)
+{
+       struct uart_8250_port *up = (struct uart_8250_port *)data;
+       unsigned int iir, ier = 0;
+
+       /*
+        * Must disable interrupts or else we risk racing with the interrupt
+        * based handler.
+        */
+       if (is_real_interrupt(up->port.irq)) {
+               ier = serial_in(up, UART_IER);
+               serial_out(up, UART_IER, 0);
+       }
+
+       iir = serial_in(up, UART_IIR);
+
+       /*
+        * This should be a safe test for anyone who doesn't trust the
+        * IIR bits on their UART, but it's specifically designed for
+        * the "Diva" UART used on the management processor on many HP
+        * ia64 and parisc boxes.
+        */
+       if ((iir & UART_IIR_NO_INT) && (up->ier & UART_IER_THRI) &&
+           (!uart_circ_empty(&up->port.info->xmit) || up->port.x_char) &&
+           (serial_in(up, UART_LSR) & UART_LSR_THRE)) {
+               iir &= ~(UART_IIR_ID | UART_IIR_NO_INT);
+               iir |= UART_IIR_THRI;
+       }
+
+       if (!(iir & UART_IIR_NO_INT))
+               serial8250_handle_port(up);
+
+       if (is_real_interrupt(up->port.irq))
+               serial_out(up, UART_IER, ier);
 
-       timeout = up->port.timeout;
-       timeout = timeout > 6 ? (timeout / 2 - 2) : 1;
-       mod_timer(&up->timer, jiffies + timeout);
+       /* Standard timer interval plus 0.2s to keep the port running */
+       mod_timer(&up->timer, jiffies + poll_timeout(up->port.timeout) + HZ/5);
 }
 
 static unsigned int serial8250_tx_empty(struct uart_port *port)
@@ -1536,6 +1598,37 @@ static void serial8250_break_ctl(struct uart_port *port, int break_state)
        spin_unlock_irqrestore(&up->port.lock, flags);
 }
 
+#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
+
+/*
+ *     Wait for transmitter & holding register to empty
+ */
+static inline void wait_for_xmitr(struct uart_8250_port *up, int bits)
+{
+       unsigned int status, tmout = 10000;
+
+       /* Wait up to 10ms for the character(s) to be sent. */
+       do {
+               status = serial_in(up, UART_LSR);
+
+               if (status & UART_LSR_BI)
+                       up->lsr_break_flag = UART_LSR_BI;
+
+               if (--tmout == 0)
+                       break;
+               udelay(1);
+       } while ((status & bits) != bits);
+
+       /* Wait up to 1s for flow control if necessary */
+       if (up->port.flags & UPF_CONS_FLOW) {
+               tmout = 1000000;
+               while (!(serial_in(up, UART_MSR) & UART_MSR_CTS) && --tmout) {
+                       udelay(1);
+                       touch_nmi_watchdog();
+               }
+       }
+}
+
 static int serial8250_startup(struct uart_port *port)
 {
        struct uart_8250_port *up = (struct uart_8250_port *)port;
@@ -1609,18 +1702,50 @@ static int serial8250_startup(struct uart_port *port)
                serial_outp(up, UART_LCR, 0);
        }
 
+       if (is_real_interrupt(up->port.irq)) {
+               /*
+                * Test for UARTs that do not reassert THRE when the
+                * transmitter is idle and the interrupt has already
+                * been cleared.  Real 16550s should always reassert
+                * this interrupt whenever the transmitter is idle and
+                * the interrupt is enabled.  Delays are necessary to
+                * allow register changes to become visible.
+                */
+               spin_lock_irqsave(&up->port.lock, flags);
+
+               wait_for_xmitr(up, UART_LSR_THRE);
+               serial_out_sync(up, UART_IER, UART_IER_THRI);
+               udelay(1); /* allow THRE to set */
+               serial_in(up, UART_IIR);
+               serial_out(up, UART_IER, 0);
+               serial_out_sync(up, UART_IER, UART_IER_THRI);
+               udelay(1); /* allow a working UART time to re-assert THRE */
+               iir = serial_in(up, UART_IIR);
+               serial_out(up, UART_IER, 0);
+
+               spin_unlock_irqrestore(&up->port.lock, flags);
+
+               /*
+                * If the interrupt is not reasserted, setup a timer to
+                * kick the UART on a regular basis.
+                */
+               if (iir & UART_IIR_NO_INT) {
+                       pr_debug("ttyS%d - using backup timer\n", port->line);
+                       up->timer.function = serial8250_backup_timeout;
+                       up->timer.data = (unsigned long)up;
+                       mod_timer(&up->timer, jiffies +
+                                 poll_timeout(up->port.timeout) + HZ/5);
+               }
+       }
+
        /*
         * If the "interrupt" for this port doesn't correspond with any
         * hardware interrupt, we use a timer-based system.  The original
         * driver used to do this with IRQ0.
         */
        if (!is_real_interrupt(up->port.irq)) {
-               unsigned int timeout = up->port.timeout;
-
-               timeout = timeout > 6 ? (timeout / 2 - 2) : 1;
-
                up->timer.data = (unsigned long)up;
-               mod_timer(&up->timer, jiffies + timeout);
+               mod_timer(&up->timer, jiffies + poll_timeout(up->port.timeout));
        } else {
                retval = serial_link_irq_chain(up);
                if (retval)
@@ -1736,9 +1861,9 @@ static void serial8250_shutdown(struct uart_port *port)
         */
        (void) serial_in(up, UART_RX);
 
-       if (!is_real_interrupt(up->port.irq))
-               del_timer_sync(&up->timer);
-       else
+       del_timer_sync(&up->timer);
+       up->timer.function = serial8250_timeout;
+       if (is_real_interrupt(up->port.irq))
                serial_unlink_irq_chain(up);
 }
 
@@ -2208,37 +2333,6 @@ serial8250_register_ports(struct uart_driver *drv, struct device *dev)
 
 #ifdef CONFIG_SERIAL_8250_CONSOLE
 
-#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
-
-/*
- *     Wait for transmitter & holding register to empty
- */
-static inline void wait_for_xmitr(struct uart_8250_port *up, int bits)
-{
-       unsigned int status, tmout = 10000;
-
-       /* Wait up to 10ms for the character(s) to be sent. */
-       do {
-               status = serial_in(up, UART_LSR);
-
-               if (status & UART_LSR_BI)
-                       up->lsr_break_flag = UART_LSR_BI;
-
-               if (--tmout == 0)
-                       break;
-               udelay(1);
-       } while ((status & bits) != bits);
-
-       /* Wait up to 1s for flow control if necessary */
-       if (up->port.flags & UPF_CONS_FLOW) {
-               tmout = 1000000;
-               while (!(serial_in(up, UART_MSR) & UART_MSR_CTS) && --tmout) {
-                       udelay(1);
-                       touch_nmi_watchdog();
-               }
-       }
-}
-
 static void serial8250_console_putchar(struct uart_port *port, int ch)
 {
        struct uart_8250_port *up = (struct uart_8250_port *)port;
index ef8cc8a70c6092e018a7e34b98a7c66426140bec..562ba745a044ae7f30d46ace434d6ba4af72b3d6 100644 (file)
@@ -47,11 +47,10 @@ serial_card_probe(struct expansion_card *ec, const struct ecard_id *id)
        unsigned long bus_addr;
        unsigned int i;
 
-       info = kmalloc(sizeof(struct serial_card_info), GFP_KERNEL);
+       info = kzalloc(sizeof(struct serial_card_info), GFP_KERNEL);
        if (!info)
                return -ENOMEM;
 
-       memset(info, 0, sizeof(struct serial_card_info));
        info->num_ports = type->num_ports;
 
        bus_addr = ecard_resource_start(ec, type->type);
index 52e2e64c6649dc25379994f6b1b119bc2d3b768f..6d7d616e9ccde48400049a84f62125d1914358fd 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/pci.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
@@ -677,6 +676,13 @@ static struct pci_serial_quirk pci_serial_quirks[] = {
        /*
         * PLX
         */
+       {
+               .vendor         = PCI_VENDOR_ID_PLX,
+               .device         = PCI_DEVICE_ID_PLX_9030,
+               .subvendor      = PCI_SUBVENDOR_ID_PERLE,
+               .subdevice      = PCI_ANY_ID,
+               .setup          = pci_default_setup,
+       },
        {
                .vendor         = PCI_VENDOR_ID_PLX,
                .device         = PCI_DEVICE_ID_PLX_9050,
@@ -936,6 +942,7 @@ enum pci_board_num_t {
 
        pbn_b2_1_115200,
        pbn_b2_2_115200,
+       pbn_b2_4_115200,
        pbn_b2_8_115200,
 
        pbn_b2_1_460800,
@@ -1249,6 +1256,12 @@ static struct pciserial_board pci_boards[] __devinitdata = {
                .base_baud      = 115200,
                .uart_offset    = 8,
        },
+       [pbn_b2_4_115200] = {
+               .flags          = FL_BASE2,
+               .num_ports      = 4,
+               .base_baud      = 115200,
+               .uart_offset    = 8,
+       },
        [pbn_b2_8_115200] = {
                .flags          = FL_BASE2,
                .num_ports      = 8,
@@ -1614,7 +1627,7 @@ pciserial_init_ports(struct pci_dev *dev, struct pciserial_board *board)
                        nr_ports = rc;
        }
 
-       priv = kmalloc(sizeof(struct serial_private) +
+       priv = kzalloc(sizeof(struct serial_private) +
                       sizeof(unsigned int) * nr_ports,
                       GFP_KERNEL);
        if (!priv) {
@@ -1622,9 +1635,6 @@ pciserial_init_ports(struct pci_dev *dev, struct pciserial_board *board)
                goto err_deinit;
        }
 
-       memset(priv, 0, sizeof(struct serial_private) +
-                       sizeof(unsigned int) * nr_ports);
-
        priv->dev = dev;
        priv->quirk = quirk;
 
@@ -1990,6 +2000,10 @@ static struct pci_device_id serial_pci_tbl[] = {
        {       PCI_VENDOR_ID_PANACOM, PCI_DEVICE_ID_PANACOM_DUALMODEM,
                PCI_ANY_ID, PCI_ANY_ID, 0, 0,
                pbn_panacom2 },
+       {       PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030,
+               PCI_VENDOR_ID_ESDGMBH,
+               PCI_DEVICE_ID_ESDGMBH_CPCIASIO4, 0, 0,
+               pbn_b2_4_115200 },
        {       PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
                PCI_SUBVENDOR_ID_CHASE_PCIFAST,
                PCI_SUBDEVICE_ID_CHASE_PCIFAST4, 0, 0, 
@@ -2378,6 +2392,15 @@ static struct pci_device_id serial_pci_tbl[] = {
                PCI_ANY_ID, PCI_ANY_ID, 0, 0,   /* 135a.0811 */
                pbn_b2_2_115200 },
 
+       /*
+        * Perle PCI-RAS cards
+        */
+       {       PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030,
+               PCI_SUBVENDOR_ID_PERLE, PCI_SUBDEVICE_ID_PCI_RAS4,
+               0, 0, pbn_b2_4_921600 },
+       {       PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9030,
+               PCI_SUBVENDOR_ID_PERLE, PCI_SUBDEVICE_ID_PCI_RAS8,
+               0, 0, pbn_b2_8_921600 },
        /*
         * These entries match devices with class COMMUNICATION_SERIAL,
         * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL
index d3d6b82706b5edbb548211187e96e28956859a4a..cde5db44abf6f136b601f65bf070ac1c31318ded 100644 (file)
@@ -450,11 +450,11 @@ serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
        port.dev = &dev->dev;
 
        line = serial8250_register_port(&port);
+       if (line < 0)
+               return -ENODEV;
 
-       if (line >= 0)
-               pnp_set_drvdata(dev, (void *)((long)line + 1));
-       return line >= 0 ? 0 : -ENODEV;
-
+       pnp_set_drvdata(dev, (void *)((long)line + 1));
+       return 0;
 }
 
 static void __devexit serial_pnp_remove(struct pnp_dev *dev)
index 2978c09860eeff81cbedebf0c52ca8e142bf946c..e8dd71df91651badcfe7c86ea3b08db5c0b340d5 100644 (file)
@@ -686,6 +686,22 @@ config SERIAL_SH_SCI_CONSOLE
        depends on SERIAL_SH_SCI=y
        select SERIAL_CORE_CONSOLE
 
+config SERIAL_PNX8XXX
+       bool "Enable PNX8XXX SoCs' UART Support"
+       depends on MIPS && SOC_PNX8550
+       select SERIAL_CORE
+       help
+         If you have a MIPS-based Philips SoC such as PNX8550 or PNX8330
+         and you want to use serial ports, say Y.  Otherwise, say N.
+
+config SERIAL_PNX8XXX_CONSOLE
+       bool "Enable PNX8XX0 serial console"
+       depends on SERIAL_PNX8XXX
+       select SERIAL_CORE_CONSOLE
+       help
+         If you have a MIPS-based Philips SoC such as PNX8550 or PNX8330
+         and you want to use serial console, say Y. Otherwise, say N.
+
 config SERIAL_CORE
        tristate
 
@@ -916,6 +932,11 @@ config SERIAL_TXX9
 config HAS_TXX9_SERIAL
        bool
 
+config SERIAL_TXX9_NR_UARTS
+       int "Maximum number of TMPTX39XX/49XX SIO ports"
+       depends on SERIAL_TXX9
+       default "6"
+
 config SERIAL_TXX9_CONSOLE
        bool "TMPTX39XX/49XX SIO Console support"
        depends on SERIAL_TXX9=y
@@ -994,4 +1015,14 @@ config SERIAL_NETX_CONSOLE
          If you have enabled the serial port on the Motorola IMX
          CPU you can make it the console by answering Y to this option.
 
+config SERIAL_OF_PLATFORM
+       tristate "Serial port on Open Firmware platform bus"
+       depends on PPC_OF
+       depends on SERIAL_8250
+       help
+         If you have a PowerPC based system that has serial ports
+         on a platform specific bus, you should enable this option.
+         Currently, only 8250 compatible ports are supported, but
+         others can easily be added.
+
 endmenu
index df3632cd7df92e449cdc90bc61dcddc06d692209..6b3560c5749aae039eb015f9f6cf5964ec72ccd3 100644 (file)
@@ -25,6 +25,7 @@ obj-$(CONFIG_SERIAL_AMBA_PL010) += amba-pl010.o
 obj-$(CONFIG_SERIAL_AMBA_PL011) += amba-pl011.o
 obj-$(CONFIG_SERIAL_CLPS711X) += clps711x.o
 obj-$(CONFIG_SERIAL_PXA) += pxa.o
+obj-$(CONFIG_SERIAL_PNX8XXX) += pnx8xxx_uart.o
 obj-$(CONFIG_SERIAL_SA1100) += sa1100.o
 obj-$(CONFIG_SERIAL_S3C2410) += s3c2410.o
 obj-$(CONFIG_SERIAL_SUNCORE) += suncore.o
@@ -58,3 +59,4 @@ obj-$(CONFIG_SERIAL_SGI_IOC3) += ioc3_serial.o
 obj-$(CONFIG_SERIAL_ATMEL) += atmel_serial.o
 obj-$(CONFIG_SERIAL_UARTLITE) += uartlite.o
 obj-$(CONFIG_SERIAL_NETX) += netx-serial.o
+obj-$(CONFIG_SERIAL_OF_PLATFORM) += of_serial.o
index 881f886b91c64ea604a90a2b011f75a0990ea88b..df45a7ac773f8fd5b7409b64bc4b764480dbe0fa 100644 (file)
 
 #define ATMEL_ISR_PASS_LIMIT   256
 
-#define UART_PUT_CR(port,v)    writel(v, (port)->membase + ATMEL_US_CR)
-#define UART_GET_MR(port)      readl((port)->membase + ATMEL_US_MR)
-#define UART_PUT_MR(port,v)    writel(v, (port)->membase + ATMEL_US_MR)
-#define UART_PUT_IER(port,v)   writel(v, (port)->membase + ATMEL_US_IER)
-#define UART_PUT_IDR(port,v)   writel(v, (port)->membase + ATMEL_US_IDR)
-#define UART_GET_IMR(port)     readl((port)->membase + ATMEL_US_IMR)
-#define UART_GET_CSR(port)     readl((port)->membase + ATMEL_US_CSR)
-#define UART_GET_CHAR(port)    readl((port)->membase + ATMEL_US_RHR)
-#define UART_PUT_CHAR(port,v)  writel(v, (port)->membase + ATMEL_US_THR)
-#define UART_GET_BRGR(port)    readl((port)->membase + ATMEL_US_BRGR)
-#define UART_PUT_BRGR(port,v)  writel(v, (port)->membase + ATMEL_US_BRGR)
-#define UART_PUT_RTOR(port,v)  writel(v, (port)->membase + ATMEL_US_RTOR)
-
-// #define UART_GET_CR(port)   readl((port)->membase + ATMEL_US_CR)            // is write-only
+#define UART_PUT_CR(port,v)    __raw_writel(v, (port)->membase + ATMEL_US_CR)
+#define UART_GET_MR(port)      __raw_readl((port)->membase + ATMEL_US_MR)
+#define UART_PUT_MR(port,v)    __raw_writel(v, (port)->membase + ATMEL_US_MR)
+#define UART_PUT_IER(port,v)   __raw_writel(v, (port)->membase + ATMEL_US_IER)
+#define UART_PUT_IDR(port,v)   __raw_writel(v, (port)->membase + ATMEL_US_IDR)
+#define UART_GET_IMR(port)     __raw_readl((port)->membase + ATMEL_US_IMR)
+#define UART_GET_CSR(port)     __raw_readl((port)->membase + ATMEL_US_CSR)
+#define UART_GET_CHAR(port)    __raw_readl((port)->membase + ATMEL_US_RHR)
+#define UART_PUT_CHAR(port,v)  __raw_writel(v, (port)->membase + ATMEL_US_THR)
+#define UART_GET_BRGR(port)    __raw_readl((port)->membase + ATMEL_US_BRGR)
+#define UART_PUT_BRGR(port,v)  __raw_writel(v, (port)->membase + ATMEL_US_BRGR)
+#define UART_PUT_RTOR(port,v)  __raw_writel(v, (port)->membase + ATMEL_US_RTOR)
+
+// #define UART_GET_CR(port)   __raw_readl((port)->membase + ATMEL_US_CR)              // is write-only
 
  /* PDC registers */
-#define UART_PUT_PTCR(port,v)  writel(v, (port)->membase + ATMEL_PDC_PTCR)
-#define UART_GET_PTSR(port)    readl((port)->membase + ATMEL_PDC_PTSR)
-
-#define UART_PUT_RPR(port,v)   writel(v, (port)->membase + ATMEL_PDC_RPR)
-#define UART_GET_RPR(port)     readl((port)->membase + ATMEL_PDC_RPR)
-#define UART_PUT_RCR(port,v)   writel(v, (port)->membase + ATMEL_PDC_RCR)
-#define UART_PUT_RNPR(port,v)  writel(v, (port)->membase + ATMEL_PDC_RNPR)
-#define UART_PUT_RNCR(port,v)  writel(v, (port)->membase + ATMEL_PDC_RNCR)
-
-#define UART_PUT_TPR(port,v)   writel(v, (port)->membase + ATMEL_PDC_TPR)
-#define UART_PUT_TCR(port,v)   writel(v, (port)->membase + ATMEL_PDC_TCR)
-//#define UART_PUT_TNPR(port,v)        writel(v, (port)->membase + ATMEL_PDC_TNPR)
-//#define UART_PUT_TNCR(port,v)        writel(v, (port)->membase + ATMEL_PDC_TNCR)
+#define UART_PUT_PTCR(port,v)  __raw_writel(v, (port)->membase + ATMEL_PDC_PTCR)
+#define UART_GET_PTSR(port)    __raw_readl((port)->membase + ATMEL_PDC_PTSR)
+
+#define UART_PUT_RPR(port,v)   __raw_writel(v, (port)->membase + ATMEL_PDC_RPR)
+#define UART_GET_RPR(port)     __raw_readl((port)->membase + ATMEL_PDC_RPR)
+#define UART_PUT_RCR(port,v)   __raw_writel(v, (port)->membase + ATMEL_PDC_RCR)
+#define UART_PUT_RNPR(port,v)  __raw_writel(v, (port)->membase + ATMEL_PDC_RNPR)
+#define UART_PUT_RNCR(port,v)  __raw_writel(v, (port)->membase + ATMEL_PDC_RNCR)
+
+#define UART_PUT_TPR(port,v)   __raw_writel(v, (port)->membase + ATMEL_PDC_TPR)
+#define UART_PUT_TCR(port,v)   __raw_writel(v, (port)->membase + ATMEL_PDC_TCR)
+//#define UART_PUT_TNPR(port,v)        __raw_writel(v, (port)->membase + ATMEL_PDC_TNPR)
+//#define UART_PUT_TNCR(port,v)        __raw_writel(v, (port)->membase + ATMEL_PDC_TNCR)
 
 static int (*atmel_open_hook)(struct uart_port *);
 static void (*atmel_close_hook)(struct uart_port *);
index 42b050c46abed3c17572b1865e5ba9c2a3432dde..312bef6bd583ce92d1382cfb8bbefbb0ba834f32 100644 (file)
@@ -3173,12 +3173,8 @@ do_softint(void *private_)
        if (!tty)
                return;
 
-       if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) {
-               if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-                   tty->ldisc.write_wakeup)
-                       (tty->ldisc.write_wakeup)(tty);
-               wake_up_interruptible(&tty->write_wait);
-       }
+       if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event))
+               tty_wakeup(tty);
 }
 
 static int
@@ -3798,11 +3794,7 @@ rs_flush_buffer(struct tty_struct *tty)
        info->xmit.head = info->xmit.tail = 0;
        restore_flags(flags);
 
-       wake_up_interruptible(&tty->write_wait);
-
-       if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-           tty->ldisc.write_wakeup)
-               (tty->ldisc.write_wakeup)(tty);
+       tty_wakeup(tty);
 }
 
 /*
index 71e6a24d8c28f18b8c6420ca5ffab0fef011651d..41431d0d5512633f184f6fb8c92cd5aad6ed343a 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/signal.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/interrupt.h>
 #include <linux/tty.h>
@@ -1417,14 +1416,12 @@ static int __devinit icom_alloc_adapter(struct icom_adapter
        struct list_head *tmp;
 
        icom_adapter = (struct icom_adapter *)
-           kmalloc(sizeof(struct icom_adapter), GFP_KERNEL);
+           kzalloc(sizeof(struct icom_adapter), GFP_KERNEL);
 
        if (!icom_adapter) {
                return -ENOMEM;
        }
 
-       memset(icom_adapter, 0, sizeof(struct icom_adapter));
-
        list_for_each(tmp, &icom_adapter_head) {
                cur_adapter_entry =
                    list_entry(tmp, struct icom_adapter,
index 9cc0be932316e86545de429622e9ebbe5f837215..168073f12cec94b9b39b4684bb6f0e37a7e78c0a 100644 (file)
@@ -2019,13 +2019,12 @@ ioc3uart_probe(struct ioc3_submodule *is, struct ioc3_driver_data *idd)
 
        DPRINT_CONFIG(("%s (0x%p, 0x%p)\n", __FUNCTION__, is, idd));
 
-       card_ptr = kmalloc(sizeof(struct ioc3_card), GFP_KERNEL);
+       card_ptr = kzalloc(sizeof(struct ioc3_card), GFP_KERNEL);
        if (!card_ptr) {
                printk(KERN_WARNING "ioc3_attach_one"
                       ": unable to get memory for the IOC3\n");
                return -ENOMEM;
        }
-       memset(card_ptr, 0, sizeof(struct ioc3_card));
        idd->data[is->id] = card_ptr;
        Submodule_slot = is->id;
 
@@ -2040,13 +2039,12 @@ ioc3uart_probe(struct ioc3_submodule *is, struct ioc3_driver_data *idd)
 
        /* Create port structures for each port */
        for (phys_port = 0; phys_port < PORTS_PER_CARD; phys_port++) {
-               port = kmalloc(sizeof(struct ioc3_port), GFP_KERNEL);
+               port = kzalloc(sizeof(struct ioc3_port), GFP_KERNEL);
                if (!port) {
                        printk(KERN_WARNING
                               "IOC3 serial memory not available for port\n");
                        goto out4;
                }
-               memset(port, 0, sizeof(struct ioc3_port));
                spin_lock_init(&port->ip_lock);
 
                /* we need to remember the previous ones, to point back to
index c862f67c985af312b15f11d68cb29390688bfacb..0c179384fb0cae34049bda432e8f349a910d3694 100644 (file)
@@ -1076,13 +1076,12 @@ static int inline ioc4_attach_local(struct ioc4_driver_data *idd)
        /* Create port structures for each port */
        for (port_number = 0; port_number < IOC4_NUM_SERIAL_PORTS;
                                                        port_number++) {
-               port = kmalloc(sizeof(struct ioc4_port), GFP_KERNEL);
+               port = kzalloc(sizeof(struct ioc4_port), GFP_KERNEL);
                if (!port) {
                        printk(KERN_WARNING
                                "IOC4 serial memory not available for port\n");
                        return -ENOMEM;
                }
-               memset(port, 0, sizeof(struct ioc4_port));
                spin_lock_init(&port->ip_lock);
 
                /* we need to remember the previous ones, to point back to
@@ -2685,7 +2684,7 @@ static int ioc4_serial_remove_one(struct ioc4_driver_data *idd)
                free_irq(control->ic_irq, soft);
                if (soft->is_ioc4_serial_addr) {
                        iounmap(soft->is_ioc4_serial_addr);
-                       release_region((unsigned long)
+                       release_mem_region((unsigned long)
                             soft->is_ioc4_serial_addr,
                                sizeof(struct ioc4_serial));
                }
@@ -2790,7 +2789,7 @@ ioc4_serial_attach_one(struct ioc4_driver_data *idd)
        /* request serial registers */
        tmp_addr1 = idd->idd_bar0 + IOC4_SERIAL_OFFSET;
 
-       if (!request_region(tmp_addr1, sizeof(struct ioc4_serial),
+       if (!request_mem_region(tmp_addr1, sizeof(struct ioc4_serial),
                                        "sioc4_uart")) {
                printk(KERN_WARNING
                        "ioc4 (%p): unable to get request region for "
@@ -2811,7 +2810,7 @@ ioc4_serial_attach_one(struct ioc4_driver_data *idd)
                                (void *)serial));
 
        /* Get memory for the new card */
-       control = kmalloc(sizeof(struct ioc4_control), GFP_KERNEL);
+       control = kzalloc(sizeof(struct ioc4_control), GFP_KERNEL);
 
        if (!control) {
                printk(KERN_WARNING "ioc4_attach_one"
@@ -2819,11 +2818,10 @@ ioc4_serial_attach_one(struct ioc4_driver_data *idd)
                ret = -ENOMEM;
                goto out2;
        }
-       memset(control, 0, sizeof(struct ioc4_control));
        idd->idd_serial_data = control;
 
        /* Allocate the soft structure */
-       soft = kmalloc(sizeof(struct ioc4_soft), GFP_KERNEL);
+       soft = kzalloc(sizeof(struct ioc4_soft), GFP_KERNEL);
        if (!soft) {
                printk(KERN_WARNING
                       "ioc4 (%p): unable to get memory for the soft struct\n",
@@ -2831,7 +2829,6 @@ ioc4_serial_attach_one(struct ioc4_driver_data *idd)
                ret = -ENOMEM;
                goto out3;
        }
-       memset(soft, 0, sizeof(struct ioc4_soft));
 
        spin_lock_init(&soft->is_ir_lock);
        soft->is_ioc4_misc_addr = idd->idd_misc_regs;
@@ -2889,7 +2886,7 @@ out3:
 out2:
        if (serial)
                iounmap(serial);
-       release_region(tmp_addr1, sizeof(struct ioc4_serial));
+       release_mem_region(tmp_addr1, sizeof(struct ioc4_serial));
 out1:
 
        return ret;
index 0746c9446ae018c13273505fc5abbd5b1dc6a852..c3abfb39f31650c207b16fe17d6ed778f5932bc9 100644 (file)
@@ -14,7 +14,6 @@
  */
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/delay.h>
 #include <linux/tty.h>
@@ -922,13 +921,7 @@ static int zilog_irq = -1;
 
 static void * __init alloc_one_table(unsigned long size)
 {
-       void *ret;
-
-       ret = kmalloc(size, GFP_KERNEL);
-       if (ret != NULL)
-               memset(ret, 0, size);
-
-       return ret;
+       return kzalloc(size, GFP_KERNEL);
 }
 
 static void __init ip22zilog_alloc_tables(void)
index 244f63be3a03f777819ba5471563af8bd7e4a936..81792e6eeb2d045bf27069a10f58417a84805642 100644 (file)
@@ -71,14 +71,13 @@ static int jsm_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto out_disable_device;
        }
 
-       brd = kmalloc(sizeof(struct jsm_board), GFP_KERNEL);
+       brd = kzalloc(sizeof(struct jsm_board), GFP_KERNEL);
        if (!brd) {
                dev_err(&pdev->dev,
                        "memory allocation for board structure failed\n");
                rc = -ENOMEM;
                goto out_release_regions;
        }
-       memset(brd, 0, sizeof(struct jsm_board));
 
        /* store the info for the board we've found */
        brd->boardnum = adapter_count++;
@@ -152,7 +151,7 @@ static int jsm_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent)
         * Okay to malloc with GFP_KERNEL, we are not at interrupt
         * context, and there are no locks held.
         */
-       brd->flipbuf = kmalloc(MYFLIPLEN, GFP_KERNEL);
+       brd->flipbuf = kzalloc(MYFLIPLEN, GFP_KERNEL);
        if (!brd->flipbuf) {
                /* XXX: leaking all resources from jsm_tty_init and
                        jsm_uart_port_init here! */
@@ -160,7 +159,6 @@ static int jsm_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                retval = -ENOMEM;
                goto out_free_irq;
        }
-       memset(brd->flipbuf, 0, MYFLIPLEN);
 
        pci_set_drvdata(pdev, brd);
 
index 7cf1c60027f842022a72e3f6dfed1c9ee35ea6d1..be22bbdbc8e5e3532cf385e7ea0a7bc2812a6926 100644 (file)
@@ -194,31 +194,28 @@ static int jsm_tty_open(struct uart_port *port)
        /* Drop locks, as malloc with GFP_KERNEL can sleep */
 
        if (!channel->ch_rqueue) {
-               channel->ch_rqueue = (u8 *) kmalloc(RQUEUESIZE, GFP_KERNEL);
+               channel->ch_rqueue = kzalloc(RQUEUESIZE, GFP_KERNEL);
                if (!channel->ch_rqueue) {
                        jsm_printk(INIT, ERR, &channel->ch_bd->pci_dev,
                                "unable to allocate read queue buf");
                        return -ENOMEM;
                }
-               memset(channel->ch_rqueue, 0, RQUEUESIZE);
        }
        if (!channel->ch_equeue) {
-               channel->ch_equeue = (u8 *) kmalloc(EQUEUESIZE, GFP_KERNEL);
+               channel->ch_equeue = kzalloc(EQUEUESIZE, GFP_KERNEL);
                if (!channel->ch_equeue) {
                        jsm_printk(INIT, ERR, &channel->ch_bd->pci_dev,
                                "unable to allocate error queue buf");
                        return -ENOMEM;
                }
-               memset(channel->ch_equeue, 0, EQUEUESIZE);
        }
        if (!channel->ch_wqueue) {
-               channel->ch_wqueue = (u8 *) kmalloc(WQUEUESIZE, GFP_KERNEL);
+               channel->ch_wqueue = kzalloc(WQUEUESIZE, GFP_KERNEL);
                if (!channel->ch_wqueue) {
                        jsm_printk(INIT, ERR, &channel->ch_bd->pci_dev,
                                "unable to allocate write queue buf");
                        return -ENOMEM;
                }
-               memset(channel->ch_wqueue, 0, WQUEUESIZE);
        }
 
        channel->ch_flags &= ~(CH_OPENING);
@@ -392,13 +389,12 @@ int jsm_tty_init(struct jsm_board *brd)
                         * Okay to malloc with GFP_KERNEL, we are not at
                         * interrupt context, and there are no locks held.
                         */
-                       brd->channels[i] = kmalloc(sizeof(struct jsm_channel), GFP_KERNEL);
+                       brd->channels[i] = kzalloc(sizeof(struct jsm_channel), GFP_KERNEL);
                        if (!brd->channels[i]) {
                                jsm_printk(CORE, ERR, &brd->pci_dev,
                                        "%s:%d Unable to allocate memory for channel struct\n",
                                                         __FILE__, __LINE__);
                        }
-                       memset(brd->channels[i], 0, sizeof(struct jsm_channel));
                }
        }
 
index 3c4b6c24371254b1a8a6bcfa27fa922a6069fc9d..955bbd653e22c0c94764c1503c7f3c1818bcdb9a 100644 (file)
@@ -127,8 +127,7 @@ static irqreturn_t mpc52xx_uart_int(int irq,void *dev_id);
 
 #if defined(CONFIG_PPC_MERGE)
 static struct of_device_id mpc52xx_uart_of_match[] = {
-       { .type = "serial", .compatible = "mpc52xx-psc-uart", },
-       { .type = "serial", .compatible = "mpc5200-psc", }, /* Efika only! */
+       { .type = "serial", .compatible = "mpc5200-psc-uart", },
        {},
 };
 #endif
@@ -1068,7 +1067,7 @@ mpc52xx_uart_of_enumerate(void)
                        continue;
 
                /* Is a particular device number requested? */
-               devno = get_property(np, "device_no", NULL);
+               devno = get_property(np, "port-number", NULL);
                mpc52xx_uart_of_assign(of_node_get(np), devno ? *devno : -1);
        }
 
diff --git a/drivers/serial/of_serial.c b/drivers/serial/of_serial.c
new file mode 100644 (file)
index 0000000..09b0b73
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+ *  Serial Port driver for Open Firmware platform devices
+ *
+ *    Copyright (C) 2006 Arnd Bergmann <arnd@arndb.de>, 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/init.h>
+#include <linux/module.h>
+#include <linux/serial_core.h>
+#include <linux/serial_8250.h>
+
+#include <asm/of_platform.h>
+#include <asm/prom.h>
+
+/*
+ * Fill a struct uart_port for a given device node
+ */
+static int __devinit of_platform_serial_setup(struct of_device *ofdev,
+                                       int type, struct uart_port *port)
+{
+       struct resource resource;
+       struct device_node *np = ofdev->node;
+       const unsigned int *clk, *spd;
+       int ret;
+
+       memset(port, 0, sizeof *port);
+       spd = get_property(np, "current-speed", NULL);
+       clk = get_property(np, "clock-frequency", NULL);
+       if (!clk) {
+               dev_warn(&ofdev->dev, "no clock-frequency property set\n");
+               return -ENODEV;
+       }
+
+       ret = of_address_to_resource(np, 0, &resource);
+       if (ret) {
+               dev_warn(&ofdev->dev, "invalid address\n");
+               return ret;
+       }
+
+       spin_lock_init(&port->lock);
+       port->mapbase = resource.start;
+       port->irq = irq_of_parse_and_map(np, 0);
+       port->iotype = UPIO_MEM;
+       port->type = type;
+       port->uartclk = *clk;
+       port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP;
+       port->dev = &ofdev->dev;
+       port->custom_divisor = *clk / (16 * (*spd));
+
+       return 0;
+}
+
+/*
+ * Try to register a serial port
+ */
+static int __devinit of_platform_serial_probe(struct of_device *ofdev,
+                                               const struct of_device_id *id)
+{
+       struct uart_port port;
+       int port_type;
+       int ret;
+
+       if (of_find_property(ofdev->node, "used-by-rtas", NULL))
+               return -EBUSY;
+
+       port_type = (unsigned long)id->data;
+       ret = of_platform_serial_setup(ofdev, port_type, &port);
+       if (ret)
+               goto out;
+
+       switch (port_type) {
+       case PORT_UNKNOWN:
+               dev_info(&ofdev->dev, "Unknown serial port found, "
+                       "attempting to use 8250 driver\n");
+               /* fallthrough */
+       case PORT_8250 ... PORT_MAX_8250:
+               ret = serial8250_register_port(&port);
+               break;
+       default:
+               /* need to add code for these */
+               ret = -ENODEV;
+               break;
+       }
+       if (ret < 0)
+               goto out;
+
+       ofdev->dev.driver_data = (void *)(unsigned long)ret;
+       return 0;
+out:
+       irq_dispose_mapping(port.irq);
+       return ret;
+}
+
+/*
+ * Release a line
+ */
+static int of_platform_serial_remove(struct of_device *ofdev)
+{
+       int line = (unsigned long)ofdev->dev.driver_data;
+       serial8250_unregister_port(line);
+       return 0;
+}
+
+/*
+ * A few common types, add more as needed.
+ */
+static struct of_device_id __devinitdata of_platform_serial_table[] = {
+       { .type = "serial", .compatible = "ns8250",   .data = (void *)PORT_8250, },
+       { .type = "serial", .compatible = "ns16450",  .data = (void *)PORT_16450, },
+       { .type = "serial", .compatible = "ns16550",  .data = (void *)PORT_16550, },
+       { .type = "serial", .compatible = "ns16750",  .data = (void *)PORT_16750, },
+       { .type = "serial",                           .data = (void *)PORT_UNKNOWN, },
+       { /* end of list */ },
+};
+
+static struct of_platform_driver __devinitdata of_platform_serial_driver = {
+       .owner = THIS_MODULE,
+       .name = "of_serial",
+       .probe = of_platform_serial_probe,
+       .remove = of_platform_serial_remove,
+       .match_table = of_platform_serial_table,
+};
+
+static int __init of_platform_serial_init(void)
+{
+       return of_register_platform_driver(&of_platform_serial_driver);
+}
+module_init(of_platform_serial_init);
+
+static void __exit of_platform_serial_exit(void)
+{
+       return of_unregister_platform_driver(&of_platform_serial_driver);
+};
+module_exit(of_platform_serial_exit);
+
+MODULE_AUTHOR("Arnd Bergmann <arnd@arndb.de>");
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Serial Port driver for Open Firmware platform devices");
diff --git a/drivers/serial/pnx8xxx_uart.c b/drivers/serial/pnx8xxx_uart.c
new file mode 100644 (file)
index 0000000..8d01c59
--- /dev/null
@@ -0,0 +1,852 @@
+/*
+ * UART driver for PNX8XXX SoCs
+ *
+ * Author: Per Hallsmark per.hallsmark@mvista.com
+ * Ported to 2.6 kernel by EmbeddedAlley
+ * Reworked by Vitaly Wool <vitalywool@gmail.com>
+ *
+ * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
+ * Copyright (C) 2000 Deep Blue Solutions Ltd.
+ *
+ * This file is licensed under the terms of the GNU General Public License
+ * version 2. This program is licensed "as is" without any warranty of
+ * any kind, whether express or implied.
+ *
+ */
+
+#if defined(CONFIG_SERIAL_PNX8XXX_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
+#define SUPPORT_SYSRQ
+#endif
+
+#include <linux/module.h>
+#include <linux/ioport.h>
+#include <linux/init.h>
+#include <linux/console.h>
+#include <linux/sysrq.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+#include <linux/tty.h>
+#include <linux/tty_flip.h>
+#include <linux/serial_core.h>
+#include <linux/serial.h>
+#include <linux/serial_pnx8xxx.h>
+
+#include <asm/io.h>
+#include <asm/irq.h>
+
+/* We'll be using StrongARM sa1100 serial port major/minor */
+#define SERIAL_PNX8XXX_MAJOR   204
+#define MINOR_START            5
+
+#define NR_PORTS               2
+
+#define PNX8XXX_ISR_PASS_LIMIT 256
+
+/*
+ * Convert from ignore_status_mask or read_status_mask to FIFO
+ * and interrupt status bits
+ */
+#define SM_TO_FIFO(x)  ((x) >> 10)
+#define SM_TO_ISTAT(x) ((x) & 0x000001ff)
+#define FIFO_TO_SM(x)  ((x) << 10)
+#define ISTAT_TO_SM(x) ((x) & 0x000001ff)
+
+/*
+ * This is the size of our serial port register set.
+ */
+#define UART_PORT_SIZE 0x1000
+
+/*
+ * This determines how often we check the modem status signals
+ * for any change.  They generally aren't connected to an IRQ
+ * so we have to poll them.  We also check immediately before
+ * filling the TX fifo incase CTS has been dropped.
+ */
+#define MCTRL_TIMEOUT  (250*HZ/1000)
+
+extern struct pnx8xxx_port pnx8xxx_ports[];
+
+static inline int serial_in(struct pnx8xxx_port *sport, int offset)
+{
+       return (__raw_readl(sport->port.membase + offset));
+}
+
+static inline void serial_out(struct pnx8xxx_port *sport, int offset, int value)
+{
+       __raw_writel(value, sport->port.membase + offset);
+}
+
+/*
+ * Handle any change of modem status signal since we were last called.
+ */
+static void pnx8xxx_mctrl_check(struct pnx8xxx_port *sport)
+{
+       unsigned int status, changed;
+
+       status = sport->port.ops->get_mctrl(&sport->port);
+       changed = status ^ sport->old_status;
+
+       if (changed == 0)
+               return;
+
+       sport->old_status = status;
+
+       if (changed & TIOCM_RI)
+               sport->port.icount.rng++;
+       if (changed & TIOCM_DSR)
+               sport->port.icount.dsr++;
+       if (changed & TIOCM_CAR)
+               uart_handle_dcd_change(&sport->port, status & TIOCM_CAR);
+       if (changed & TIOCM_CTS)
+               uart_handle_cts_change(&sport->port, status & TIOCM_CTS);
+
+       wake_up_interruptible(&sport->port.info->delta_msr_wait);
+}
+
+/*
+ * This is our per-port timeout handler, for checking the
+ * modem status signals.
+ */
+static void pnx8xxx_timeout(unsigned long data)
+{
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)data;
+       unsigned long flags;
+
+       if (sport->port.info) {
+               spin_lock_irqsave(&sport->port.lock, flags);
+               pnx8xxx_mctrl_check(sport);
+               spin_unlock_irqrestore(&sport->port.lock, flags);
+
+               mod_timer(&sport->timer, jiffies + MCTRL_TIMEOUT);
+       }
+}
+
+/*
+ * interrupts disabled on entry
+ */
+static void pnx8xxx_stop_tx(struct uart_port *port)
+{
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)port;
+       u32 ien;
+
+       /* Disable TX intr */
+       ien = serial_in(sport, PNX8XXX_IEN);
+       serial_out(sport, PNX8XXX_IEN, ien & ~PNX8XXX_UART_INT_ALLTX);
+
+       /* Clear all pending TX intr */
+       serial_out(sport, PNX8XXX_ICLR, PNX8XXX_UART_INT_ALLTX);
+}
+
+/*
+ * interrupts may not be disabled on entry
+ */
+static void pnx8xxx_start_tx(struct uart_port *port)
+{
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)port;
+       u32 ien;
+
+       /* Clear all pending TX intr */
+       serial_out(sport, PNX8XXX_ICLR, PNX8XXX_UART_INT_ALLTX);
+
+       /* Enable TX intr */
+       ien = serial_in(sport, PNX8XXX_IEN);
+       serial_out(sport, PNX8XXX_IEN, ien | PNX8XXX_UART_INT_ALLTX);
+}
+
+/*
+ * Interrupts enabled
+ */
+static void pnx8xxx_stop_rx(struct uart_port *port)
+{
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)port;
+       u32 ien;
+
+       /* Disable RX intr */
+       ien = serial_in(sport, PNX8XXX_IEN);
+       serial_out(sport, PNX8XXX_IEN, ien & ~PNX8XXX_UART_INT_ALLRX);
+
+       /* Clear all pending RX intr */
+       serial_out(sport, PNX8XXX_ICLR, PNX8XXX_UART_INT_ALLRX);
+}
+
+/*
+ * Set the modem control timer to fire immediately.
+ */
+static void pnx8xxx_enable_ms(struct uart_port *port)
+{
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)port;
+
+       mod_timer(&sport->timer, jiffies);
+}
+
+static void pnx8xxx_rx_chars(struct pnx8xxx_port *sport)
+{
+       struct tty_struct *tty = sport->port.info->tty;
+       unsigned int status, ch, flg;
+
+       status = FIFO_TO_SM(serial_in(sport, PNX8XXX_FIFO)) |
+                ISTAT_TO_SM(serial_in(sport, PNX8XXX_ISTAT));
+       while (status & FIFO_TO_SM(PNX8XXX_UART_FIFO_RXFIFO)) {
+               ch = serial_in(sport, PNX8XXX_FIFO);
+
+               sport->port.icount.rx++;
+
+               flg = TTY_NORMAL;
+
+               /*
+                * note that the error handling code is
+                * out of the main execution path
+                */
+               if (status & (FIFO_TO_SM(PNX8XXX_UART_FIFO_RXFE |
+                                       PNX8XXX_UART_FIFO_RXPAR) |
+                             ISTAT_TO_SM(PNX8XXX_UART_INT_RXOVRN))) {
+                       if (status & FIFO_TO_SM(PNX8XXX_UART_FIFO_RXPAR))
+                               sport->port.icount.parity++;
+                       else if (status & FIFO_TO_SM(PNX8XXX_UART_FIFO_RXFE))
+                               sport->port.icount.frame++;
+                       if (status & ISTAT_TO_SM(PNX8XXX_UART_INT_RXOVRN))
+                               sport->port.icount.overrun++;
+
+                       status &= sport->port.read_status_mask;
+
+                       if (status & FIFO_TO_SM(PNX8XXX_UART_FIFO_RXPAR))
+                               flg = TTY_PARITY;
+                       else if (status & FIFO_TO_SM(PNX8XXX_UART_FIFO_RXFE))
+                               flg = TTY_FRAME;
+
+#ifdef SUPPORT_SYSRQ
+                       sport->port.sysrq = 0;
+#endif
+               }
+
+               if (uart_handle_sysrq_char(&sport->port, ch))
+                       goto ignore_char;
+
+               uart_insert_char(&sport->port, status,
+                               ISTAT_TO_SM(PNX8XXX_UART_INT_RXOVRN), ch, flg);
+
+       ignore_char:
+               serial_out(sport, PNX8XXX_LCR, serial_in(sport, PNX8XXX_LCR) |
+                               PNX8XXX_UART_LCR_RX_NEXT);
+               status = FIFO_TO_SM(serial_in(sport, PNX8XXX_FIFO)) |
+                        ISTAT_TO_SM(serial_in(sport, PNX8XXX_ISTAT));
+       }
+       tty_flip_buffer_push(tty);
+}
+
+static void pnx8xxx_tx_chars(struct pnx8xxx_port *sport)
+{
+       struct circ_buf *xmit = &sport->port.info->xmit;
+
+       if (sport->port.x_char) {
+               serial_out(sport, PNX8XXX_FIFO, sport->port.x_char);
+               sport->port.icount.tx++;
+               sport->port.x_char = 0;
+               return;
+       }
+
+       /*
+        * Check the modem control lines before
+        * transmitting anything.
+        */
+       pnx8xxx_mctrl_check(sport);
+
+       if (uart_circ_empty(xmit) || uart_tx_stopped(&sport->port)) {
+               pnx8xxx_stop_tx(&sport->port);
+               return;
+       }
+
+       /*
+        * TX while bytes available
+        */
+       while (((serial_in(sport, PNX8XXX_FIFO) &
+                                       PNX8XXX_UART_FIFO_TXFIFO) >> 16) < 16) {
+               serial_out(sport, PNX8XXX_FIFO, xmit->buf[xmit->tail]);
+               xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
+               sport->port.icount.tx++;
+               if (uart_circ_empty(xmit))
+                       break;
+       }
+
+       if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
+               uart_write_wakeup(&sport->port);
+
+       if (uart_circ_empty(xmit))
+               pnx8xxx_stop_tx(&sport->port);
+}
+
+static irqreturn_t pnx8xxx_int(int irq, void *dev_id)
+{
+       struct pnx8xxx_port *sport = dev_id;
+       unsigned int status;
+
+       spin_lock(&sport->port.lock);
+       /* Get the interrupts */
+       status  = serial_in(sport, PNX8XXX_ISTAT) & serial_in(sport, PNX8XXX_IEN);
+
+       /* Break signal received */
+       if (status & PNX8XXX_UART_INT_BREAK) {
+               sport->port.icount.brk++;
+               uart_handle_break(&sport->port);
+       }
+
+       /* Byte received */
+       if (status & PNX8XXX_UART_INT_RX)
+               pnx8xxx_rx_chars(sport);
+
+       /* TX holding register empty - transmit a byte */
+       if (status & PNX8XXX_UART_INT_TX)
+               pnx8xxx_tx_chars(sport);
+
+       /* Clear the ISTAT register */
+       serial_out(sport, PNX8XXX_ICLR, status);
+
+       spin_unlock(&sport->port.lock);
+       return IRQ_HANDLED;
+}
+
+/*
+ * Return TIOCSER_TEMT when transmitter is not busy.
+ */
+static unsigned int pnx8xxx_tx_empty(struct uart_port *port)
+{
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)port;
+
+       return serial_in(sport, PNX8XXX_FIFO) & PNX8XXX_UART_FIFO_TXFIFO_STA ? 0 : TIOCSER_TEMT;
+}
+
+static unsigned int pnx8xxx_get_mctrl(struct uart_port *port)
+{
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)port;
+       unsigned int mctrl = TIOCM_DSR;
+       unsigned int msr;
+
+       /* REVISIT */
+
+       msr = serial_in(sport, PNX8XXX_MCR);
+
+       mctrl |= msr & PNX8XXX_UART_MCR_CTS ? TIOCM_CTS : 0;
+       mctrl |= msr & PNX8XXX_UART_MCR_DCD ? TIOCM_CAR : 0;
+
+       return mctrl;
+}
+
+static void pnx8xxx_set_mctrl(struct uart_port *port, unsigned int mctrl)
+{
+#if    0       /* FIXME */
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)port;
+       unsigned int msr;
+#endif
+}
+
+/*
+ * Interrupts always disabled.
+ */
+static void pnx8xxx_break_ctl(struct uart_port *port, int break_state)
+{
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)port;
+       unsigned long flags;
+       unsigned int lcr;
+
+       spin_lock_irqsave(&sport->port.lock, flags);
+       lcr = serial_in(sport, PNX8XXX_LCR);
+       if (break_state == -1)
+               lcr |= PNX8XXX_UART_LCR_TXBREAK;
+       else
+               lcr &= ~PNX8XXX_UART_LCR_TXBREAK;
+       serial_out(sport, PNX8XXX_LCR, lcr);
+       spin_unlock_irqrestore(&sport->port.lock, flags);
+}
+
+static int pnx8xxx_startup(struct uart_port *port)
+{
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)port;
+       int retval;
+
+       /*
+        * Allocate the IRQ
+        */
+       retval = request_irq(sport->port.irq, pnx8xxx_int, 0,
+                            "pnx8xxx-uart", sport);
+       if (retval)
+               return retval;
+
+       /*
+        * Finally, clear and enable interrupts
+        */
+
+       serial_out(sport, PNX8XXX_ICLR, PNX8XXX_UART_INT_ALLRX |
+                            PNX8XXX_UART_INT_ALLTX);
+
+       serial_out(sport, PNX8XXX_IEN, serial_in(sport, PNX8XXX_IEN) |
+                           PNX8XXX_UART_INT_ALLRX |
+                           PNX8XXX_UART_INT_ALLTX);
+
+       /*
+        * Enable modem status interrupts
+        */
+       spin_lock_irq(&sport->port.lock);
+       pnx8xxx_enable_ms(&sport->port);
+       spin_unlock_irq(&sport->port.lock);
+
+       return 0;
+}
+
+static void pnx8xxx_shutdown(struct uart_port *port)
+{
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)port;
+       int lcr;
+
+       /*
+        * Stop our timer.
+        */
+       del_timer_sync(&sport->timer);
+
+       /*
+        * Disable all interrupts
+        */
+       serial_out(sport, PNX8XXX_IEN, 0);
+
+       /*
+        * Reset the Tx and Rx FIFOS, disable the break condition
+        */
+       lcr = serial_in(sport, PNX8XXX_LCR);
+       lcr &= ~PNX8XXX_UART_LCR_TXBREAK;
+       lcr |= PNX8XXX_UART_LCR_TX_RST | PNX8XXX_UART_LCR_RX_RST;
+       serial_out(sport, PNX8XXX_LCR, lcr);
+
+       /*
+        * Clear all interrupts
+        */
+       serial_out(sport, PNX8XXX_ICLR, PNX8XXX_UART_INT_ALLRX |
+                            PNX8XXX_UART_INT_ALLTX);
+
+       /*
+        * Free the interrupt
+        */
+       free_irq(sport->port.irq, sport);
+}
+
+static void
+pnx8xxx_set_termios(struct uart_port *port, struct ktermios *termios,
+                  struct ktermios *old)
+{
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)port;
+       unsigned long flags;
+       unsigned int lcr_fcr, old_ien, baud, quot;
+       unsigned int old_csize = old ? old->c_cflag & CSIZE : CS8;
+
+       /*
+        * We only support CS7 and CS8.
+        */
+       while ((termios->c_cflag & CSIZE) != CS7 &&
+              (termios->c_cflag & CSIZE) != CS8) {
+               termios->c_cflag &= ~CSIZE;
+               termios->c_cflag |= old_csize;
+               old_csize = CS8;
+       }
+
+       if ((termios->c_cflag & CSIZE) == CS8)
+               lcr_fcr = PNX8XXX_UART_LCR_8BIT;
+       else
+               lcr_fcr = 0;
+
+       if (termios->c_cflag & CSTOPB)
+               lcr_fcr |= PNX8XXX_UART_LCR_2STOPB;
+       if (termios->c_cflag & PARENB) {
+               lcr_fcr |= PNX8XXX_UART_LCR_PAREN;
+               if (!(termios->c_cflag & PARODD))
+                       lcr_fcr |= PNX8XXX_UART_LCR_PAREVN;
+       }
+
+       /*
+        * Ask the core to calculate the divisor for us.
+        */
+       baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
+       quot = uart_get_divisor(port, baud);
+
+       spin_lock_irqsave(&sport->port.lock, flags);
+
+       sport->port.read_status_mask = ISTAT_TO_SM(PNX8XXX_UART_INT_RXOVRN) |
+                               ISTAT_TO_SM(PNX8XXX_UART_INT_EMPTY) |
+                               ISTAT_TO_SM(PNX8XXX_UART_INT_RX);
+       if (termios->c_iflag & INPCK)
+               sport->port.read_status_mask |=
+                       FIFO_TO_SM(PNX8XXX_UART_FIFO_RXFE) |
+                       FIFO_TO_SM(PNX8XXX_UART_FIFO_RXPAR);
+       if (termios->c_iflag & (BRKINT | PARMRK))
+               sport->port.read_status_mask |=
+                       ISTAT_TO_SM(PNX8XXX_UART_INT_BREAK);
+
+       /*
+        * Characters to ignore
+        */
+       sport->port.ignore_status_mask = 0;
+       if (termios->c_iflag & IGNPAR)
+               sport->port.ignore_status_mask |=
+                       FIFO_TO_SM(PNX8XXX_UART_FIFO_RXFE) |
+                       FIFO_TO_SM(PNX8XXX_UART_FIFO_RXPAR);
+       if (termios->c_iflag & IGNBRK) {
+               sport->port.ignore_status_mask |=
+                       ISTAT_TO_SM(PNX8XXX_UART_INT_BREAK);
+               /*
+                * If we're ignoring parity and break indicators,
+                * ignore overruns too (for real raw support).
+                */
+               if (termios->c_iflag & IGNPAR)
+                       sport->port.ignore_status_mask |=
+                               ISTAT_TO_SM(PNX8XXX_UART_INT_RXOVRN);
+       }
+
+       /*
+        * ignore all characters if CREAD is not set
+        */
+       if ((termios->c_cflag & CREAD) == 0)
+               sport->port.ignore_status_mask |=
+                       ISTAT_TO_SM(PNX8XXX_UART_INT_RX);
+
+       del_timer_sync(&sport->timer);
+
+       /*
+        * Update the per-port timeout.
+        */
+       uart_update_timeout(port, termios->c_cflag, baud);
+
+       /*
+        * disable interrupts and drain transmitter
+        */
+       old_ien = serial_in(sport, PNX8XXX_IEN);
+       serial_out(sport, PNX8XXX_IEN, old_ien & ~(PNX8XXX_UART_INT_ALLTX |
+                                       PNX8XXX_UART_INT_ALLRX));
+
+       while (serial_in(sport, PNX8XXX_FIFO) & PNX8XXX_UART_FIFO_TXFIFO_STA)
+               barrier();
+
+       /* then, disable everything */
+       serial_out(sport, PNX8XXX_IEN, 0);
+
+       /* Reset the Rx and Tx FIFOs too */
+       lcr_fcr |= PNX8XXX_UART_LCR_TX_RST;
+       lcr_fcr |= PNX8XXX_UART_LCR_RX_RST;
+
+       /* set the parity, stop bits and data size */
+       serial_out(sport, PNX8XXX_LCR, lcr_fcr);
+
+       /* set the baud rate */
+       quot -= 1;
+       serial_out(sport, PNX8XXX_BAUD, quot);
+
+       serial_out(sport, PNX8XXX_ICLR, -1);
+
+       serial_out(sport, PNX8XXX_IEN, old_ien);
+
+       if (UART_ENABLE_MS(&sport->port, termios->c_cflag))
+               pnx8xxx_enable_ms(&sport->port);
+
+       spin_unlock_irqrestore(&sport->port.lock, flags);
+}
+
+static const char *pnx8xxx_type(struct uart_port *port)
+{
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)port;
+
+       return sport->port.type == PORT_PNX8XXX ? "PNX8XXX" : NULL;
+}
+
+/*
+ * Release the memory region(s) being used by 'port'.
+ */
+static void pnx8xxx_release_port(struct uart_port *port)
+{
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)port;
+
+       release_mem_region(sport->port.mapbase, UART_PORT_SIZE);
+}
+
+/*
+ * Request the memory region(s) being used by 'port'.
+ */
+static int pnx8xxx_request_port(struct uart_port *port)
+{
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)port;
+       return request_mem_region(sport->port.mapbase, UART_PORT_SIZE,
+                       "pnx8xxx-uart") != NULL ? 0 : -EBUSY;
+}
+
+/*
+ * Configure/autoconfigure the port.
+ */
+static void pnx8xxx_config_port(struct uart_port *port, int flags)
+{
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)port;
+
+       if (flags & UART_CONFIG_TYPE &&
+           pnx8xxx_request_port(&sport->port) == 0)
+               sport->port.type = PORT_PNX8XXX;
+}
+
+/*
+ * Verify the new serial_struct (for TIOCSSERIAL).
+ * The only change we allow are to the flags and type, and
+ * even then only between PORT_PNX8XXX and PORT_UNKNOWN
+ */
+static int
+pnx8xxx_verify_port(struct uart_port *port, struct serial_struct *ser)
+{
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)port;
+       int ret = 0;
+
+       if (ser->type != PORT_UNKNOWN && ser->type != PORT_PNX8XXX)
+               ret = -EINVAL;
+       if (sport->port.irq != ser->irq)
+               ret = -EINVAL;
+       if (ser->io_type != SERIAL_IO_MEM)
+               ret = -EINVAL;
+       if (sport->port.uartclk / 16 != ser->baud_base)
+               ret = -EINVAL;
+       if ((void *)sport->port.mapbase != ser->iomem_base)
+               ret = -EINVAL;
+       if (sport->port.iobase != ser->port)
+               ret = -EINVAL;
+       if (ser->hub6 != 0)
+               ret = -EINVAL;
+       return ret;
+}
+
+static struct uart_ops pnx8xxx_pops = {
+       .tx_empty       = pnx8xxx_tx_empty,
+       .set_mctrl      = pnx8xxx_set_mctrl,
+       .get_mctrl      = pnx8xxx_get_mctrl,
+       .stop_tx        = pnx8xxx_stop_tx,
+       .start_tx       = pnx8xxx_start_tx,
+       .stop_rx        = pnx8xxx_stop_rx,
+       .enable_ms      = pnx8xxx_enable_ms,
+       .break_ctl      = pnx8xxx_break_ctl,
+       .startup        = pnx8xxx_startup,
+       .shutdown       = pnx8xxx_shutdown,
+       .set_termios    = pnx8xxx_set_termios,
+       .type           = pnx8xxx_type,
+       .release_port   = pnx8xxx_release_port,
+       .request_port   = pnx8xxx_request_port,
+       .config_port    = pnx8xxx_config_port,
+       .verify_port    = pnx8xxx_verify_port,
+};
+
+
+/*
+ * Setup the PNX8XXX serial ports.
+ *
+ * Note also that we support "console=ttySx" where "x" is either 0 or 1.
+ */
+static void __init pnx8xxx_init_ports(void)
+{
+       static int first = 1;
+       int i;
+
+       if (!first)
+               return;
+       first = 0;
+
+       for (i = 0; i < NR_PORTS; i++) {
+               init_timer(&pnx8xxx_ports[i].timer);
+               pnx8xxx_ports[i].timer.function = pnx8xxx_timeout;
+               pnx8xxx_ports[i].timer.data     = (unsigned long)&pnx8xxx_ports[i];
+               pnx8xxx_ports[i].port.ops = &pnx8xxx_pops;
+       }
+}
+
+#ifdef CONFIG_SERIAL_PNX8XXX_CONSOLE
+
+static void pnx8xxx_console_putchar(struct uart_port *port, int ch)
+{
+       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)port;
+       int status;
+
+       do {
+               /* Wait for UART_TX register to empty */
+               status = serial_in(sport, PNX8XXX_FIFO);
+       } while (status & PNX8XXX_UART_FIFO_TXFIFO);
+       serial_out(sport, PNX8XXX_FIFO, ch);
+}
+
+/*
+ * Interrupts are disabled on entering
+ */static void
+pnx8xxx_console_write(struct console *co, const char *s, unsigned int count)
+{
+       struct pnx8xxx_port *sport = &pnx8xxx_ports[co->index];
+       unsigned int old_ien, status;
+
+       /*
+        *      First, save IEN and then disable interrupts
+        */
+       old_ien = serial_in(sport, PNX8XXX_IEN);
+       serial_out(sport, PNX8XXX_IEN, old_ien & ~(PNX8XXX_UART_INT_ALLTX |
+                                       PNX8XXX_UART_INT_ALLRX));
+
+       uart_console_write(&sport->port, s, count, pnx8xxx_console_putchar);
+
+       /*
+        *      Finally, wait for transmitter to become empty
+        *      and restore IEN
+        */
+       do {
+               /* Wait for UART_TX register to empty */
+               status = serial_in(sport, PNX8XXX_FIFO);
+       } while (status & PNX8XXX_UART_FIFO_TXFIFO);
+
+       /* Clear TX and EMPTY interrupt */
+       serial_out(sport, PNX8XXX_ICLR, PNX8XXX_UART_INT_TX |
+                            PNX8XXX_UART_INT_EMPTY);
+
+       serial_out(sport, PNX8XXX_IEN, old_ien);
+}
+
+static int __init
+pnx8xxx_console_setup(struct console *co, char *options)
+{
+       struct pnx8xxx_port *sport;
+       int baud = 38400;
+       int bits = 8;
+       int parity = 'n';
+       int flow = 'n';
+
+       /*
+        * Check whether an invalid uart number has been specified, and
+        * if so, search for the first available port that does have
+        * console support.
+        */
+       if (co->index == -1 || co->index >= NR_PORTS)
+               co->index = 0;
+       sport = &pnx8xxx_ports[co->index];
+
+       if (options)
+               uart_parse_options(options, &baud, &parity, &bits, &flow);
+
+       return uart_set_options(&sport->port, co, baud, parity, bits, flow);
+}
+
+static struct uart_driver pnx8xxx_reg;
+static struct console pnx8xxx_console = {
+       .name           = "ttyS",
+       .write          = pnx8xxx_console_write,
+       .device         = uart_console_device,
+       .setup          = pnx8xxx_console_setup,
+       .flags          = CON_PRINTBUFFER,
+       .index          = -1,
+       .data           = &pnx8xxx_reg,
+};
+
+static int __init pnx8xxx_rs_console_init(void)
+{
+       pnx8xxx_init_ports();
+       register_console(&pnx8xxx_console);
+       return 0;
+}
+console_initcall(pnx8xxx_rs_console_init);
+
+#define PNX8XXX_CONSOLE        &pnx8xxx_console
+#else
+#define PNX8XXX_CONSOLE        NULL
+#endif
+
+static struct uart_driver pnx8xxx_reg = {
+       .owner                  = THIS_MODULE,
+       .driver_name            = "ttyS",
+       .dev_name               = "ttyS",
+       .major                  = SERIAL_PNX8XXX_MAJOR,
+       .minor                  = MINOR_START,
+       .nr                     = NR_PORTS,
+       .cons                   = PNX8XXX_CONSOLE,
+};
+
+static int pnx8xxx_serial_suspend(struct platform_device *pdev, pm_message_t state)
+{
+       struct pnx8xxx_port *sport = platform_get_drvdata(pdev);
+
+       return uart_suspend_port(&pnx8xxx_reg, &sport->port);
+}
+
+static int pnx8xxx_serial_resume(struct platform_device *pdev)
+{
+       struct pnx8xxx_port *sport = platform_get_drvdata(pdev);
+
+       return uart_resume_port(&pnx8xxx_reg, &sport->port);
+}
+
+static int pnx8xxx_serial_probe(struct platform_device *pdev)
+{
+       struct resource *res = pdev->resource;
+       int i;
+
+       for (i = 0; i < pdev->num_resources; i++, res++) {
+               if (!(res->flags & IORESOURCE_MEM))
+                       continue;
+
+               for (i = 0; i < NR_PORTS; i++) {
+                       if (pnx8xxx_ports[i].port.mapbase != res->start)
+                               continue;
+
+                       pnx8xxx_ports[i].port.dev = &pdev->dev;
+                       uart_add_one_port(&pnx8xxx_reg, &pnx8xxx_ports[i].port);
+                       platform_set_drvdata(pdev, &pnx8xxx_ports[i]);
+                       break;
+               }
+       }
+
+       return 0;
+}
+
+static int pnx8xxx_serial_remove(struct platform_device *pdev)
+{
+       struct pnx8xxx_port *sport = platform_get_drvdata(pdev);
+
+       platform_set_drvdata(pdev, NULL);
+
+       if (sport)
+               uart_remove_one_port(&pnx8xxx_reg, &sport->port);
+
+       return 0;
+}
+
+static struct platform_driver pnx8xxx_serial_driver = {
+       .driver         = {
+               .name   = "pnx8xxx-uart",
+               .owner  = THIS_MODULE,
+       },
+       .probe          = pnx8xxx_serial_probe,
+       .remove         = pnx8xxx_serial_remove,
+       .suspend        = pnx8xxx_serial_suspend,
+       .resume         = pnx8xxx_serial_resume,
+};
+
+static int __init pnx8xxx_serial_init(void)
+{
+       int ret;
+
+       printk(KERN_INFO "Serial: PNX8XXX driver $Revision: 1.2 $\n");
+
+       pnx8xxx_init_ports();
+
+       ret = uart_register_driver(&pnx8xxx_reg);
+       if (ret == 0) {
+               ret = platform_driver_register(&pnx8xxx_serial_driver);
+               if (ret)
+                       uart_unregister_driver(&pnx8xxx_reg);
+       }
+       return ret;
+}
+
+static void __exit pnx8xxx_serial_exit(void)
+{
+       platform_driver_unregister(&pnx8xxx_serial_driver);
+       uart_unregister_driver(&pnx8xxx_reg);
+}
+
+module_init(pnx8xxx_serial_init);
+module_exit(pnx8xxx_serial_exit);
+
+MODULE_AUTHOR("Embedded Alley Solutions, Inc.");
+MODULE_DESCRIPTION("PNX8XXX SoCs serial port driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS_CHARDEV_MAJOR(SERIAL_PNX8XXX_MAJOR);
index f84982e508c7efc7e2eb6bcdca37f95ee22e8b67..0422c0f1f85207715ebe221d182de4f48f85b655 100644 (file)
@@ -1523,9 +1523,8 @@ static struct uart_state *uart_get(struct uart_driver *drv, int line)
        }
 
        if (!state->info) {
-               state->info = kmalloc(sizeof(struct uart_info), GFP_KERNEL);
+               state->info = kzalloc(sizeof(struct uart_info), GFP_KERNEL);
                if (state->info) {
-                       memset(state->info, 0, sizeof(struct uart_info));
                        init_waitqueue_head(&state->info->open_wait);
                        init_waitqueue_head(&state->info->delta_msr_wait);
 
@@ -1660,6 +1659,7 @@ static const char *uart_type(struct uart_port *port)
 static int uart_line_info(char *buf, struct uart_driver *drv, int i)
 {
        struct uart_state *state = drv->state + i;
+       int pm_state;
        struct uart_port *port = state->port;
        char stat_buf[32];
        unsigned int status;
@@ -1682,9 +1682,16 @@ static int uart_line_info(char *buf, struct uart_driver *drv, int i)
 
        if(capable(CAP_SYS_ADMIN))
        {
+               mutex_lock(&state->mutex);
+               pm_state = state->pm_state;
+               if (pm_state)
+                       uart_change_pm(state, 0);
                spin_lock_irq(&port->lock);
                status = port->ops->get_mctrl(port);
                spin_unlock_irq(&port->lock);
+               if (pm_state)
+                       uart_change_pm(state, pm_state);
+               mutex_unlock(&state->mutex);
 
                ret += sprintf(buf + ret, " tx:%d rx:%d",
                                port->icount.tx, port->icount.rx);
@@ -2100,6 +2107,9 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state,
 
                uart_report_port(drv, port);
 
+               /* Power up port for set_mctrl() */
+               uart_change_pm(state, 0);
+
                /*
                 * Ensure that the modem control lines are de-activated.
                 * We probably don't need a spinlock around this, but
@@ -2167,13 +2177,11 @@ int uart_register_driver(struct uart_driver *drv)
         * Maybe we should be using a slab cache for this, especially if
         * we have a large number of ports to handle.
         */
-       drv->state = kmalloc(sizeof(struct uart_state) * drv->nr, GFP_KERNEL);
+       drv->state = kzalloc(sizeof(struct uart_state) * drv->nr, GFP_KERNEL);
        retval = -ENOMEM;
        if (!drv->state)
                goto out;
 
-       memset(drv->state, 0, sizeof(struct uart_state) * drv->nr);
-
        normal  = alloc_tty_driver(drv->nr);
        if (!normal)
                goto out;
index 431433f4dd6d3983a02bb8be5c2b09cd983e8c51..c2f1012449da7f46cb0291d19ed6b54070128324 100644 (file)
@@ -35,7 +35,6 @@
 #include <linux/moduleparam.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/ptrace.h>
 #include <linux/slab.h>
 #include <linux/string.h>
@@ -334,10 +333,9 @@ static int serial_probe(struct pcmcia_device *link)
        DEBUG(0, "serial_attach()\n");
 
        /* Create new serial device */
-       info = kmalloc(sizeof (*info), GFP_KERNEL);
+       info = kzalloc(sizeof (*info), GFP_KERNEL);
        if (!info)
                return -ENOMEM;
-       memset(info, 0, sizeof (*info));
        info->p_dev = link;
        link->priv = info;
 
index 7186a82c47595582dfe3de1dbac4b6bb283585ba..f4440d3293106a9d7930fe3b9a55e10e755dbb78 100644 (file)
@@ -37,6 +37,7 @@
  *     1.06    Do not insert a char caused previous overrun.
  *             Fix some spin_locks.
  *             Do not call uart_add_one_port for absent ports.
+ *     1.07    Use CONFIG_SERIAL_TXX9_NR_UARTS.  Cleanup.
  */
 
 #if defined(CONFIG_SERIAL_TXX9_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
@@ -58,9 +59,8 @@
 #include <linux/mutex.h>
 
 #include <asm/io.h>
-#include <asm/irq.h>
 
-static char *serial_version = "1.06";
+static char *serial_version = "1.07";
 static char *serial_name = "TX39/49 Serial driver";
 
 #define PASS_LIMIT     256
@@ -88,12 +88,7 @@ static char *serial_name = "TX39/49 Serial driver";
 /*
  * Number of serial ports
  */
-#ifdef ENABLE_SERIAL_TXX9_PCI
-#define NR_PCI_BOARDS  4
-#define UART_NR  (4 + NR_PCI_BOARDS)
-#else
-#define UART_NR  4
-#endif
+#define UART_NR  CONFIG_SERIAL_TXX9_NR_UARTS
 
 #define HIGH_BITS_OFFSET       ((sizeof(long)-sizeof(int))*8)
 
@@ -987,6 +982,7 @@ int __init early_serial_txx9_setup(struct uart_port *port)
 }
 
 #ifdef ENABLE_SERIAL_TXX9_PCI
+#ifdef CONFIG_PM
 /**
  *     serial_txx9_suspend_port - suspend one serial port
  *     @line:  serial line number
@@ -1008,6 +1004,7 @@ static void serial_txx9_resume_port(int line)
 {
        uart_resume_port(&serial_txx9_reg, &serial_txx9_ports[line].port);
 }
+#endif
 
 static DEFINE_MUTEX(serial_txx9_mutex);
 
@@ -1118,6 +1115,7 @@ static void __devexit pciserial_txx9_remove_one(struct pci_dev *dev)
        }
 }
 
+#ifdef CONFIG_PM
 static int pciserial_txx9_suspend_one(struct pci_dev *dev, pm_message_t state)
 {
        int line = (int)(long)pci_get_drvdata(dev);
@@ -1142,11 +1140,10 @@ static int pciserial_txx9_resume_one(struct pci_dev *dev)
        }
        return 0;
 }
+#endif
 
-static struct pci_device_id serial_txx9_pci_tbl[] = {
-       {       PCI_VENDOR_ID_TOSHIBA_2, PCI_DEVICE_ID_TOSHIBA_TC86C001_MISC,
-               PCI_ANY_ID, PCI_ANY_ID,
-               0, 0, 0 },
+static const struct pci_device_id serial_txx9_pci_tbl[] = {
+       { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA_2, PCI_DEVICE_ID_TOSHIBA_TC86C001_MISC) },
        { 0, }
 };
 
@@ -1154,8 +1151,10 @@ static struct pci_driver serial_txx9_pci_driver = {
        .name           = "serial_txx9",
        .probe          = pciserial_txx9_init_one,
        .remove         = __devexit_p(pciserial_txx9_remove_one),
+#ifdef CONFIG_PM
        .suspend        = pciserial_txx9_suspend_one,
        .resume         = pciserial_txx9_resume_one,
+#endif
        .id_table       = serial_txx9_pci_tbl,
 };
 
index 145d6236954b4d67b5618e318f3d8c6a2a0f3e0a..deb9ab4b5a0b6b53c3167c842a833e71d4fcc4fe 100644 (file)
@@ -17,7 +17,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/tty.h>
 #include <linux/tty_flip.h>
index 3ec3df21816be03e551f81e2a43cf2ba7d0a9342..96a852aa1903a87e6a888cda7c61587464ab1611 100644 (file)
@@ -17,7 +17,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/spinlock.h>
 #include <linux/errno.h>
 #include <linux/tty.h>
index 244f796dc62595a80f1bc34cea3cfe60b5a8239a..da73205e54cded364297a9df504316229e7f7c6c 100644 (file)
@@ -14,7 +14,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/delay.h>
 #include <linux/tty.h>
index cd6b65333b71a51660471128e4128dd8d90116dc..2dd6eed50aa06ef3721811d364d32086206ee437 100644 (file)
@@ -654,7 +654,7 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
                ret = -ENODEV;
                goto out_pci;
        }
-       if (!request_region(idd->pma, IOC3_PCI_SIZE, "ioc3")) {
+       if (!request_mem_region(idd->pma, IOC3_PCI_SIZE, "ioc3")) {
                printk(KERN_WARNING
                       "%s: Unable to request IOC3 region "
                       "for pci_dev %s.\n",
@@ -744,7 +744,7 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *pci_id)
        return 0;
 
 out_misc_region:
-       release_region(idd->pma, IOC3_PCI_SIZE);
+       release_mem_region(idd->pma, IOC3_PCI_SIZE);
 out_pci:
        kfree(idd);
 out_idd:
@@ -785,7 +785,7 @@ static void ioc3_remove(struct pci_dev *pdev)
        if(idd->dual_irq)
                free_irq(idd->irq_eth, (void *)idd);
        iounmap(idd->vma);
-       release_region(idd->pma, IOC3_PCI_SIZE);
+       release_mem_region(idd->pma, IOC3_PCI_SIZE);
 
        /* Disable IOC3 and relinquish */
        pci_disable_device(pdev);
index d895a1adb428fbb10b32977e6a200a649766ec55..7e54e48efd5cb6af7c9451811871f303bef7c854 100644 (file)
@@ -51,6 +51,13 @@ config SPI_MASTER
 comment "SPI Master Controller Drivers"
        depends on SPI_MASTER
 
+config SPI_ATMEL
+       tristate "Atmel SPI Controller"
+       depends on (ARCH_AT91 || AVR32) && SPI_MASTER
+       help
+         This selects a driver for the Atmel SPI Controller, present on
+         many AT32 (AVR32) and AT91 (ARM) chips.
+
 config SPI_BITBANG
        tristate "Bitbanging SPI master"
        depends on SPI_MASTER && EXPERIMENTAL
@@ -75,6 +82,13 @@ config SPI_BUTTERFLY
          inexpensive battery powered microcontroller evaluation board.
          This same cable can be used to flash new firmware.
 
+config SPI_IMX
+       tristate "Freescale iMX SPI controller"
+       depends on SPI_MASTER && ARCH_IMX && EXPERIMENTAL
+       help
+         This enables using the Freescale iMX SPI controller in master
+         mode.
+
 config SPI_MPC83xx
        tristate "Freescale MPC83xx SPI controller"
        depends on SPI_MASTER && PPC_83xx && EXPERIMENTAL
@@ -87,6 +101,14 @@ config SPI_MPC83xx
          family of PowerPC processors.  The MPC83xx uses a simple set of shift
          registers for data (opposed to the CPM based descriptor model).
 
+config SPI_OMAP_UWIRE
+       tristate "OMAP1 MicroWire"
+       depends on SPI_MASTER && ARCH_OMAP1
+       select SPI_BITBANG
+       help
+         This hooks up to the MicroWire controller on OMAP1 chips.
+
+
 config SPI_PXA2XX
        tristate "PXA2xx SSP SPI master"
        depends on SPI_MASTER && ARCH_PXA && EXPERIMENTAL
@@ -95,6 +117,12 @@ config SPI_PXA2XX
          The driver can be configured to use any SSP port and additional
          documentation can be found a Documentation/spi/pxa2xx.
 
+config SPI_S3C24XX
+       tristate "Samsung S3C24XX series SPI"
+       depends on SPI_MASTER && ARCH_S3C2410 && EXPERIMENTAL
+       help
+         SPI driver for Samsung S3C24XX series ARM SoCs
+
 config SPI_S3C24XX_GPIO
        tristate "Samsung S3C24XX series SPI by GPIO"
        depends on SPI_MASTER && ARCH_S3C2410 && SPI_BITBANG && EXPERIMENTAL
@@ -107,13 +135,6 @@ config SPI_S3C24XX_GPIO
 # Add new SPI master controllers in alphabetical order above this line
 #
 
-
-config SPI_S3C24XX
-       tristate "Samsung S3C24XX series SPI"
-       depends on SPI_MASTER && ARCH_S3C2410 && EXPERIMENTAL
-       help
-         SPI driver for Samsung S3C24XX series ARM SoCs
-
 #
 # There are lots of SPI device types, with sensors and memory
 # being probably the most widely used ones.
@@ -121,6 +142,16 @@ config SPI_S3C24XX
 comment "SPI Protocol Masters"
        depends on SPI_MASTER
 
+config SPI_AT25
+       tristate "SPI EEPROMs from most vendors"
+       depends on SPI_MASTER && SYSFS
+       help
+         Enable this driver to get read/write support to most SPI EEPROMs,
+         after you configure the board init code to know about each eeprom
+         on your target board.
+
+         This driver can also be built as a module.  If so, the module
+         will be called at25.
 
 #
 # Add new SPI protocol masters in alphabetical order above this line
index 8f4cb67997b32afcc5207b49fb7ae2dfcb2654eb..3c280ad892026bedacdb966c3c98a726a7ad4157 100644 (file)
@@ -12,14 +12,18 @@ obj-$(CONFIG_SPI_MASTER)            += spi.o
 
 # SPI master controller drivers (bus)
 obj-$(CONFIG_SPI_BITBANG)              += spi_bitbang.o
+obj-$(CONFIG_SPI_ATMEL)                        += atmel_spi.o
 obj-$(CONFIG_SPI_BUTTERFLY)            += spi_butterfly.o
+obj-$(CONFIG_SPI_IMX)                  += spi_imx.o
 obj-$(CONFIG_SPI_PXA2XX)               += pxa2xx_spi.o
+obj-$(CONFIG_SPI_OMAP_UWIRE)           += omap_uwire.o
 obj-$(CONFIG_SPI_MPC83xx)              += spi_mpc83xx.o
 obj-$(CONFIG_SPI_S3C24XX_GPIO)         += spi_s3c24xx_gpio.o
 obj-$(CONFIG_SPI_S3C24XX)              += spi_s3c24xx.o
 #      ... add above this line ...
 
 # SPI protocol drivers (device/link on bus)
+obj-$(CONFIG_SPI_AT25)         += at25.o
 #      ... add above this line ...
 
 # SPI slave controller drivers (upstream link)
diff --git a/drivers/spi/at25.c b/drivers/spi/at25.c
new file mode 100644 (file)
index 0000000..48e4f48
--- /dev/null
@@ -0,0 +1,381 @@
+/*
+ * at25.c -- support most SPI EEPROMs, such as Atmel AT25 models
+ *
+ * Copyright (C) 2006 David Brownell
+ *
+ * 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/kernel.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/sched.h>
+
+#include <linux/spi/spi.h>
+#include <linux/spi/eeprom.h>
+
+
+struct at25_data {
+       struct spi_device       *spi;
+       struct mutex            lock;
+       struct spi_eeprom       chip;
+       struct bin_attribute    bin;
+       unsigned                addrlen;
+};
+
+#define        AT25_WREN       0x06            /* latch the write enable */
+#define        AT25_WRDI       0x04            /* reset the write enable */
+#define        AT25_RDSR       0x05            /* read status register */
+#define        AT25_WRSR       0x01            /* write status register */
+#define        AT25_READ       0x03            /* read byte(s) */
+#define        AT25_WRITE      0x02            /* write byte(s)/sector */
+
+#define        AT25_SR_nRDY    0x01            /* nRDY = write-in-progress */
+#define        AT25_SR_WEN     0x02            /* write enable (latched) */
+#define        AT25_SR_BP0     0x04            /* BP for software writeprotect */
+#define        AT25_SR_BP1     0x08
+#define        AT25_SR_WPEN    0x80            /* writeprotect enable */
+
+
+#define EE_MAXADDRLEN  3               /* 24 bit addresses, up to 2 MBytes */
+
+/* Specs often allow 5 msec for a page write, sometimes 20 msec;
+ * it's important to recover from write timeouts.
+ */
+#define        EE_TIMEOUT      25
+
+/*-------------------------------------------------------------------------*/
+
+#define        io_limit        PAGE_SIZE       /* bytes */
+
+static ssize_t
+at25_ee_read(
+       struct at25_data        *at25,
+       char                    *buf,
+       unsigned                offset,
+       size_t                  count
+)
+{
+       u8                      command[EE_MAXADDRLEN + 1];
+       u8                      *cp;
+       ssize_t                 status;
+       struct spi_transfer     t[2];
+       struct spi_message      m;
+
+       cp = command;
+       *cp++ = AT25_READ;
+
+       /* 8/16/24-bit address is written MSB first */
+       switch (at25->addrlen) {
+       default:        /* case 3 */
+               *cp++ = offset >> 16;
+       case 2:
+               *cp++ = offset >> 8;
+       case 1:
+       case 0: /* can't happen: for better codegen */
+               *cp++ = offset >> 0;
+       }
+
+       spi_message_init(&m);
+       memset(t, 0, sizeof t);
+
+       t[0].tx_buf = command;
+       t[0].len = at25->addrlen + 1;
+       spi_message_add_tail(&t[0], &m);
+
+       t[1].rx_buf = buf;
+       t[1].len = count;
+       spi_message_add_tail(&t[1], &m);
+
+       mutex_lock(&at25->lock);
+
+       /* Read it all at once.
+        *
+        * REVISIT that's potentially a problem with large chips, if
+        * other devices on the bus need to be accessed regularly or
+        * this chip is clocked very slowly
+        */
+       status = spi_sync(at25->spi, &m);
+       dev_dbg(&at25->spi->dev,
+               "read %Zd bytes at %d --> %d\n",
+               count, offset, (int) status);
+
+       mutex_unlock(&at25->lock);
+       return status ? status : count;
+}
+
+static ssize_t
+at25_bin_read(struct kobject *kobj, char *buf, loff_t off, size_t count)
+{
+       struct device           *dev;
+       struct at25_data        *at25;
+
+       dev = container_of(kobj, struct device, kobj);
+       at25 = dev_get_drvdata(dev);
+
+       if (unlikely(off >= at25->bin.size))
+               return 0;
+       if ((off + count) > at25->bin.size)
+               count = at25->bin.size - off;
+       if (unlikely(!count))
+               return count;
+
+       return at25_ee_read(at25, buf, off, count);
+}
+
+
+static ssize_t
+at25_ee_write(struct at25_data *at25, char *buf, loff_t off, size_t count)
+{
+       ssize_t                 status = 0;
+       unsigned                written = 0;
+       unsigned                buf_size;
+       u8                      *bounce;
+
+       /* Temp buffer starts with command and address */
+       buf_size = at25->chip.page_size;
+       if (buf_size > io_limit)
+               buf_size = io_limit;
+       bounce = kmalloc(buf_size + at25->addrlen + 1, GFP_KERNEL);
+       if (!bounce)
+               return -ENOMEM;
+
+       /* For write, rollover is within the page ... so we write at
+        * most one page, then manually roll over to the next page.
+        */
+       bounce[0] = AT25_WRITE;
+       mutex_lock(&at25->lock);
+       do {
+               unsigned long   timeout, retries;
+               unsigned        segment;
+               unsigned        offset = (unsigned) off;
+               u8              *cp = bounce + 1;
+
+               *cp = AT25_WREN;
+               status = spi_write(at25->spi, cp, 1);
+               if (status < 0) {
+                       dev_dbg(&at25->spi->dev, "WREN --> %d\n",
+                                       (int) status);
+                       break;
+               }
+
+               /* 8/16/24-bit address is written MSB first */
+               switch (at25->addrlen) {
+               default:        /* case 3 */
+                       *cp++ = offset >> 16;
+               case 2:
+                       *cp++ = offset >> 8;
+               case 1:
+               case 0: /* can't happen: for better codegen */
+                       *cp++ = offset >> 0;
+               }
+
+               /* Write as much of a page as we can */
+               segment = buf_size - (offset % buf_size);
+               if (segment > count)
+                       segment = count;
+               memcpy(cp, buf, segment);
+               status = spi_write(at25->spi, bounce,
+                               segment + at25->addrlen + 1);
+               dev_dbg(&at25->spi->dev,
+                               "write %u bytes at %u --> %d\n",
+                               segment, offset, (int) status);
+               if (status < 0)
+                       break;
+
+               /* REVISIT this should detect (or prevent) failed writes
+                * to readonly sections of the EEPROM...
+                */
+
+               /* Wait for non-busy status */
+               timeout = jiffies + msecs_to_jiffies(EE_TIMEOUT);
+               retries = 0;
+               do {
+                       int     sr;
+
+                       sr = spi_w8r8(at25->spi, AT25_RDSR);
+                       if (sr < 0 || (sr & AT25_SR_nRDY)) {
+                               dev_dbg(&at25->spi->dev,
+                                       "rdsr --> %d (%02x)\n", sr, sr);
+                               /* at HZ=100, this is sloooow */
+                               msleep(1);
+                               continue;
+                       }
+                       if (!(sr & AT25_SR_nRDY))
+                               break;
+               } while (retries++ < 3 || time_before_eq(jiffies, timeout));
+
+               if (time_after(jiffies, timeout)) {
+                       dev_err(&at25->spi->dev,
+                               "write %d bytes offset %d, "
+                               "timeout after %u msecs\n",
+                               segment, offset,
+                               jiffies_to_msecs(jiffies -
+                                       (timeout - EE_TIMEOUT)));
+                       status = -ETIMEDOUT;
+                       break;
+               }
+
+               off += segment;
+               buf += segment;
+               count -= segment;
+               written += segment;
+
+       } while (count > 0);
+
+       mutex_unlock(&at25->lock);
+
+       kfree(bounce);
+       return written ? written : status;
+}
+
+static ssize_t
+at25_bin_write(struct kobject *kobj, char *buf, loff_t off, size_t count)
+{
+       struct device           *dev;
+       struct at25_data        *at25;
+
+       dev = container_of(kobj, struct device, kobj);
+       at25 = dev_get_drvdata(dev);
+
+       if (unlikely(off >= at25->bin.size))
+               return -EFBIG;
+       if ((off + count) > at25->bin.size)
+               count = at25->bin.size - off;
+       if (unlikely(!count))
+               return count;
+
+       return at25_ee_write(at25, buf, off, count);
+}
+
+/*-------------------------------------------------------------------------*/
+
+static int at25_probe(struct spi_device *spi)
+{
+       struct at25_data        *at25 = NULL;
+       const struct spi_eeprom *chip;
+       int                     err;
+       int                     sr;
+       int                     addrlen;
+
+       /* Chip description */
+       chip = spi->dev.platform_data;
+       if (!chip) {
+               dev_dbg(&spi->dev, "no chip description\n");
+               err = -ENODEV;
+               goto fail;
+       }
+
+       /* For now we only support 8/16/24 bit addressing */
+       if (chip->flags & EE_ADDR1)
+               addrlen = 1;
+       else if (chip->flags & EE_ADDR2)
+               addrlen = 2;
+       else if (chip->flags & EE_ADDR3)
+               addrlen = 3;
+       else {
+               dev_dbg(&spi->dev, "unsupported address type\n");
+               err = -EINVAL;
+               goto fail;
+       }
+
+       /* Ping the chip ... the status register is pretty portable,
+        * unlike probing manufacturer IDs.  We do expect that system
+        * firmware didn't write it in the past few milliseconds!
+        */
+       sr = spi_w8r8(spi, AT25_RDSR);
+       if (sr < 0 || sr & AT25_SR_nRDY) {
+               dev_dbg(&at25->spi->dev, "rdsr --> %d (%02x)\n", sr, sr);
+               err = -ENXIO;
+               goto fail;
+       }
+
+       if (!(at25 = kzalloc(sizeof *at25, GFP_KERNEL))) {
+               err = -ENOMEM;
+               goto fail;
+       }
+
+       mutex_init(&at25->lock);
+       at25->chip = *chip;
+       at25->spi = spi_dev_get(spi);
+       dev_set_drvdata(&spi->dev, at25);
+       at25->addrlen = addrlen;
+
+       /* Export the EEPROM bytes through sysfs, since that's convenient.
+        * Default to root-only access to the data; EEPROMs often hold data
+        * that's sensitive for read and/or write, like ethernet addresses,
+        * security codes, board-specific manufacturing calibrations, etc.
+        */
+       at25->bin.attr.name = "eeprom";
+       at25->bin.attr.mode = S_IRUSR;
+       at25->bin.attr.owner = THIS_MODULE;
+       at25->bin.read = at25_bin_read;
+
+       at25->bin.size = at25->chip.byte_len;
+       if (!(chip->flags & EE_READONLY)) {
+               at25->bin.write = at25_bin_write;
+               at25->bin.attr.mode |= S_IWUSR;
+       }
+
+       err = sysfs_create_bin_file(&spi->dev.kobj, &at25->bin);
+       if (err)
+               goto fail;
+
+       dev_info(&spi->dev, "%Zd %s %s eeprom%s, pagesize %u\n",
+               (at25->bin.size < 1024)
+                       ? at25->bin.size
+                       : (at25->bin.size / 1024),
+               (at25->bin.size < 1024) ? "Byte" : "KByte",
+               at25->chip.name,
+               (chip->flags & EE_READONLY) ? " (readonly)" : "",
+               at25->chip.page_size);
+       return 0;
+fail:
+       dev_dbg(&spi->dev, "probe err %d\n", err);
+       kfree(at25);
+       return err;
+}
+
+static int __devexit at25_remove(struct spi_device *spi)
+{
+       struct at25_data        *at25;
+
+       at25 = dev_get_drvdata(&spi->dev);
+       sysfs_remove_bin_file(&spi->dev.kobj, &at25->bin);
+       kfree(at25);
+       return 0;
+}
+
+/*-------------------------------------------------------------------------*/
+
+static struct spi_driver at25_driver = {
+       .driver = {
+               .name           = "at25",
+               .owner          = THIS_MODULE,
+       },
+       .probe          = at25_probe,
+       .remove         = __devexit_p(at25_remove),
+};
+
+static int __init at25_init(void)
+{
+       return spi_register_driver(&at25_driver);
+}
+module_init(at25_init);
+
+static void __exit at25_exit(void)
+{
+       spi_unregister_driver(&at25_driver);
+}
+module_exit(at25_exit);
+
+MODULE_DESCRIPTION("Driver for most SPI EEPROMs");
+MODULE_AUTHOR("David Brownell");
+MODULE_LICENSE("GPL");
+
diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c
new file mode 100644 (file)
index 0000000..c2a9fef
--- /dev/null
@@ -0,0 +1,678 @@
+/*
+ * Driver for Atmel AT32 and AT91 SPI Controllers
+ *
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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/clk.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/delay.h>
+#include <linux/dma-mapping.h>
+#include <linux/err.h>
+#include <linux/interrupt.h>
+#include <linux/spi/spi.h>
+
+#include <asm/io.h>
+#include <asm/arch/board.h>
+#include <asm/arch/gpio.h>
+
+#include "atmel_spi.h"
+
+/*
+ * The core SPI transfer engine just talks to a register bank to set up
+ * DMA transfers; transfer queue progress is driven by IRQs.  The clock
+ * framework provides the base clock, subdivided for each spi_device.
+ *
+ * Newer controllers, marked with "new_1" flag, have:
+ *  - CR.LASTXFER
+ *  - SPI_MR.DIV32 may become FDIV or must-be-zero (here: always zero)
+ *  - SPI_SR.TXEMPTY, SPI_SR.NSSR (and corresponding irqs)
+ *  - SPI_CSRx.CSAAT
+ *  - SPI_CSRx.SBCR allows faster clocking
+ */
+struct atmel_spi {
+       spinlock_t              lock;
+
+       void __iomem            *regs;
+       int                     irq;
+       struct clk              *clk;
+       struct platform_device  *pdev;
+       unsigned                new_1:1;
+
+       u8                      stopping;
+       struct list_head        queue;
+       struct spi_transfer     *current_transfer;
+       unsigned long           remaining_bytes;
+
+       void                    *buffer;
+       dma_addr_t              buffer_dma;
+};
+
+#define BUFFER_SIZE            PAGE_SIZE
+#define INVALID_DMA_ADDRESS    0xffffffff
+
+/*
+ * Earlier SPI controllers (e.g. on at91rm9200) have a design bug whereby
+ * they assume that spi slave device state will not change on deselect, so
+ * that automagic deselection is OK.  Not so!  Workaround uses nCSx pins
+ * as GPIOs; or newer controllers have CSAAT and friends.
+ *
+ * Since the CSAAT functionality is a bit weird on newer controllers
+ * as well, we use GPIO to control nCSx pins on all controllers.
+ */
+
+static inline void cs_activate(struct spi_device *spi)
+{
+       unsigned gpio = (unsigned) spi->controller_data;
+       unsigned active = spi->mode & SPI_CS_HIGH;
+
+       dev_dbg(&spi->dev, "activate %u%s\n", gpio, active ? " (high)" : "");
+       gpio_set_value(gpio, active);
+}
+
+static inline void cs_deactivate(struct spi_device *spi)
+{
+       unsigned gpio = (unsigned) spi->controller_data;
+       unsigned active = spi->mode & SPI_CS_HIGH;
+
+       dev_dbg(&spi->dev, "DEactivate %u%s\n", gpio, active ? " (low)" : "");
+       gpio_set_value(gpio, !active);
+}
+
+/*
+ * Submit next transfer for DMA.
+ * lock is held, spi irq is blocked
+ */
+static void atmel_spi_next_xfer(struct spi_master *master,
+                               struct spi_message *msg)
+{
+       struct atmel_spi        *as = spi_master_get_devdata(master);
+       struct spi_transfer     *xfer;
+       u32                     len;
+       dma_addr_t              tx_dma, rx_dma;
+
+       xfer = as->current_transfer;
+       if (!xfer || as->remaining_bytes == 0) {
+               if (xfer)
+                       xfer = list_entry(xfer->transfer_list.next,
+                                       struct spi_transfer, transfer_list);
+               else
+                       xfer = list_entry(msg->transfers.next,
+                                       struct spi_transfer, transfer_list);
+               as->remaining_bytes = xfer->len;
+               as->current_transfer = xfer;
+       }
+
+       len = as->remaining_bytes;
+
+       tx_dma = xfer->tx_dma;
+       rx_dma = xfer->rx_dma;
+
+       /* use scratch buffer only when rx or tx data is unspecified */
+       if (rx_dma == INVALID_DMA_ADDRESS) {
+               rx_dma = as->buffer_dma;
+               if (len > BUFFER_SIZE)
+                       len = BUFFER_SIZE;
+       }
+       if (tx_dma == INVALID_DMA_ADDRESS) {
+               tx_dma = as->buffer_dma;
+               if (len > BUFFER_SIZE)
+                       len = BUFFER_SIZE;
+               memset(as->buffer, 0, len);
+               dma_sync_single_for_device(&as->pdev->dev,
+                               as->buffer_dma, len, DMA_TO_DEVICE);
+       }
+
+       spi_writel(as, RPR, rx_dma);
+       spi_writel(as, TPR, tx_dma);
+
+       as->remaining_bytes -= len;
+       if (msg->spi->bits_per_word > 8)
+               len >>= 1;
+
+       /* REVISIT: when xfer->delay_usecs == 0, the PDC "next transfer"
+        * mechanism might help avoid the IRQ latency between transfers
+        *
+        * We're also waiting for ENDRX before we start the next
+        * transfer because we need to handle some difficult timing
+        * issues otherwise. If we wait for ENDTX in one transfer and
+        * then starts waiting for ENDRX in the next, it's difficult
+        * to tell the difference between the ENDRX interrupt we're
+        * actually waiting for and the ENDRX interrupt of the
+        * previous transfer.
+        *
+        * It should be doable, though. Just not now...
+        */
+       spi_writel(as, TNCR, 0);
+       spi_writel(as, RNCR, 0);
+       spi_writel(as, IER, SPI_BIT(ENDRX) | SPI_BIT(OVRES));
+
+       dev_dbg(&msg->spi->dev,
+               "  start xfer %p: len %u tx %p/%08x rx %p/%08x imr %03x\n",
+               xfer, xfer->len, xfer->tx_buf, xfer->tx_dma,
+               xfer->rx_buf, xfer->rx_dma, spi_readl(as, IMR));
+
+       spi_writel(as, TCR, len);
+       spi_writel(as, RCR, len);
+       spi_writel(as, PTCR, SPI_BIT(TXTEN) | SPI_BIT(RXTEN));
+}
+
+static void atmel_spi_next_message(struct spi_master *master)
+{
+       struct atmel_spi        *as = spi_master_get_devdata(master);
+       struct spi_message      *msg;
+       u32                     mr;
+
+       BUG_ON(as->current_transfer);
+
+       msg = list_entry(as->queue.next, struct spi_message, queue);
+
+       /* Select the chip */
+       mr = spi_readl(as, MR);
+       mr = SPI_BFINS(PCS, ~(1 << msg->spi->chip_select), mr);
+       spi_writel(as, MR, mr);
+       cs_activate(msg->spi);
+
+       atmel_spi_next_xfer(master, msg);
+}
+
+static void
+atmel_spi_dma_map_xfer(struct atmel_spi *as, struct spi_transfer *xfer)
+{
+       xfer->tx_dma = xfer->rx_dma = INVALID_DMA_ADDRESS;
+       if (xfer->tx_buf)
+               xfer->tx_dma = dma_map_single(&as->pdev->dev,
+                               (void *) xfer->tx_buf, xfer->len,
+                               DMA_TO_DEVICE);
+       if (xfer->rx_buf)
+               xfer->rx_dma = dma_map_single(&as->pdev->dev,
+                               xfer->rx_buf, xfer->len,
+                               DMA_FROM_DEVICE);
+}
+
+static void atmel_spi_dma_unmap_xfer(struct spi_master *master,
+                                    struct spi_transfer *xfer)
+{
+       if (xfer->tx_dma != INVALID_DMA_ADDRESS)
+               dma_unmap_single(master->cdev.dev, xfer->tx_dma,
+                                xfer->len, DMA_TO_DEVICE);
+       if (xfer->rx_dma != INVALID_DMA_ADDRESS)
+               dma_unmap_single(master->cdev.dev, xfer->rx_dma,
+                                xfer->len, DMA_FROM_DEVICE);
+}
+
+static void
+atmel_spi_msg_done(struct spi_master *master, struct atmel_spi *as,
+                  struct spi_message *msg, int status)
+{
+       cs_deactivate(msg->spi);
+       list_del(&msg->queue);
+       msg->status = status;
+
+       dev_dbg(master->cdev.dev,
+               "xfer complete: %u bytes transferred\n",
+               msg->actual_length);
+
+       spin_unlock(&as->lock);
+       msg->complete(msg->context);
+       spin_lock(&as->lock);
+
+       as->current_transfer = NULL;
+
+       /* continue if needed */
+       if (list_empty(&as->queue) || as->stopping)
+               spi_writel(as, PTCR, SPI_BIT(RXTDIS) | SPI_BIT(TXTDIS));
+       else
+               atmel_spi_next_message(master);
+}
+
+static irqreturn_t
+atmel_spi_interrupt(int irq, void *dev_id)
+{
+       struct spi_master       *master = dev_id;
+       struct atmel_spi        *as = spi_master_get_devdata(master);
+       struct spi_message      *msg;
+       struct spi_transfer     *xfer;
+       u32                     status, pending, imr;
+       int                     ret = IRQ_NONE;
+
+       spin_lock(&as->lock);
+
+       xfer = as->current_transfer;
+       msg = list_entry(as->queue.next, struct spi_message, queue);
+
+       imr = spi_readl(as, IMR);
+       status = spi_readl(as, SR);
+       pending = status & imr;
+
+       if (pending & SPI_BIT(OVRES)) {
+               int timeout;
+
+               ret = IRQ_HANDLED;
+
+               spi_writel(as, IDR, (SPI_BIT(ENDTX) | SPI_BIT(ENDRX)
+                                    | SPI_BIT(OVRES)));
+
+               /*
+                * When we get an overrun, we disregard the current
+                * transfer. Data will not be copied back from any
+                * bounce buffer and msg->actual_len will not be
+                * updated with the last xfer.
+                *
+                * We will also not process any remaning transfers in
+                * the message.
+                *
+                * First, stop the transfer and unmap the DMA buffers.
+                */
+               spi_writel(as, PTCR, SPI_BIT(RXTDIS) | SPI_BIT(TXTDIS));
+               if (!msg->is_dma_mapped)
+                       atmel_spi_dma_unmap_xfer(master, xfer);
+
+               /* REVISIT: udelay in irq is unfriendly */
+               if (xfer->delay_usecs)
+                       udelay(xfer->delay_usecs);
+
+               dev_warn(master->cdev.dev, "fifo overrun (%u/%u remaining)\n",
+                        spi_readl(as, TCR), spi_readl(as, RCR));
+
+               /*
+                * Clean up DMA registers and make sure the data
+                * registers are empty.
+                */
+               spi_writel(as, RNCR, 0);
+               spi_writel(as, TNCR, 0);
+               spi_writel(as, RCR, 0);
+               spi_writel(as, TCR, 0);
+               for (timeout = 1000; timeout; timeout--)
+                       if (spi_readl(as, SR) & SPI_BIT(TXEMPTY))
+                               break;
+               if (!timeout)
+                       dev_warn(master->cdev.dev,
+                                "timeout waiting for TXEMPTY");
+               while (spi_readl(as, SR) & SPI_BIT(RDRF))
+                       spi_readl(as, RDR);
+
+               /* Clear any overrun happening while cleaning up */
+               spi_readl(as, SR);
+
+               atmel_spi_msg_done(master, as, msg, -EIO);
+       } else if (pending & SPI_BIT(ENDRX)) {
+               ret = IRQ_HANDLED;
+
+               spi_writel(as, IDR, pending);
+
+               if (as->remaining_bytes == 0) {
+                       msg->actual_length += xfer->len;
+
+                       if (!msg->is_dma_mapped)
+                               atmel_spi_dma_unmap_xfer(master, xfer);
+
+                       /* REVISIT: udelay in irq is unfriendly */
+                       if (xfer->delay_usecs)
+                               udelay(xfer->delay_usecs);
+
+                       if (msg->transfers.prev == &xfer->transfer_list) {
+                               /* report completed message */
+                               atmel_spi_msg_done(master, as, msg, 0);
+                       } else {
+                               if (xfer->cs_change) {
+                                       cs_deactivate(msg->spi);
+                                       udelay(1);
+                                       cs_activate(msg->spi);
+                               }
+
+                               /*
+                                * Not done yet. Submit the next transfer.
+                                *
+                                * FIXME handle protocol options for xfer
+                                */
+                               atmel_spi_next_xfer(master, msg);
+                       }
+               } else {
+                       /*
+                        * Keep going, we still have data to send in
+                        * the current transfer.
+                        */
+                       atmel_spi_next_xfer(master, msg);
+               }
+       }
+
+       spin_unlock(&as->lock);
+
+       return ret;
+}
+
+#define MODEBITS (SPI_CPOL | SPI_CPHA | SPI_CS_HIGH)
+
+static int atmel_spi_setup(struct spi_device *spi)
+{
+       struct atmel_spi        *as;
+       u32                     scbr, csr;
+       unsigned int            bits = spi->bits_per_word;
+       unsigned long           bus_hz, sck_hz;
+       unsigned int            npcs_pin;
+       int                     ret;
+
+       as = spi_master_get_devdata(spi->master);
+
+       if (as->stopping)
+               return -ESHUTDOWN;
+
+       if (spi->chip_select > spi->master->num_chipselect) {
+               dev_dbg(&spi->dev,
+                               "setup: invalid chipselect %u (%u defined)\n",
+                               spi->chip_select, spi->master->num_chipselect);
+               return -EINVAL;
+       }
+
+       if (bits == 0)
+               bits = 8;
+       if (bits < 8 || bits > 16) {
+               dev_dbg(&spi->dev,
+                               "setup: invalid bits_per_word %u (8 to 16)\n",
+                               bits);
+               return -EINVAL;
+       }
+
+       if (spi->mode & ~MODEBITS) {
+               dev_dbg(&spi->dev, "setup: unsupported mode bits %x\n",
+                       spi->mode & ~MODEBITS);
+               return -EINVAL;
+       }
+
+       /* speed zero convention is used by some upper layers */
+       bus_hz = clk_get_rate(as->clk);
+       if (spi->max_speed_hz) {
+               /* assume div32/fdiv/mbz == 0 */
+               if (!as->new_1)
+                       bus_hz /= 2;
+               scbr = ((bus_hz + spi->max_speed_hz - 1)
+                       / spi->max_speed_hz);
+               if (scbr >= (1 << SPI_SCBR_SIZE)) {
+                       dev_dbg(&spi->dev, "setup: %d Hz too slow, scbr %u\n",
+                                       spi->max_speed_hz, scbr);
+                       return -EINVAL;
+               }
+       } else
+               scbr = 0xff;
+       sck_hz = bus_hz / scbr;
+
+       csr = SPI_BF(SCBR, scbr) | SPI_BF(BITS, bits - 8);
+       if (spi->mode & SPI_CPOL)
+               csr |= SPI_BIT(CPOL);
+       if (!(spi->mode & SPI_CPHA))
+               csr |= SPI_BIT(NCPHA);
+
+       /* TODO: DLYBS and DLYBCT */
+       csr |= SPI_BF(DLYBS, 10);
+       csr |= SPI_BF(DLYBCT, 10);
+
+       /* chipselect must have been muxed as GPIO (e.g. in board setup) */
+       npcs_pin = (unsigned int)spi->controller_data;
+       if (!spi->controller_state) {
+               ret = gpio_request(npcs_pin, "spi_npcs");
+               if (ret)
+                       return ret;
+               spi->controller_state = (void *)npcs_pin;
+               gpio_direction_output(npcs_pin);
+       }
+
+       dev_dbg(&spi->dev,
+               "setup: %lu Hz bpw %u mode 0x%x -> csr%d %08x\n",
+               sck_hz, bits, spi->mode, spi->chip_select, csr);
+
+       spi_writel(as, CSR0 + 4 * spi->chip_select, csr);
+
+       return 0;
+}
+
+static int atmel_spi_transfer(struct spi_device *spi, struct spi_message *msg)
+{
+       struct atmel_spi        *as;
+       struct spi_transfer     *xfer;
+       unsigned long           flags;
+       struct device           *controller = spi->master->cdev.dev;
+
+       as = spi_master_get_devdata(spi->master);
+
+       dev_dbg(controller, "new message %p submitted for %s\n",
+                       msg, spi->dev.bus_id);
+
+       if (unlikely(list_empty(&msg->transfers)
+                       || !spi->max_speed_hz))
+               return -EINVAL;
+
+       if (as->stopping)
+               return -ESHUTDOWN;
+
+       list_for_each_entry(xfer, &msg->transfers, transfer_list) {
+               if (!(xfer->tx_buf || xfer->rx_buf)) {
+                       dev_dbg(&spi->dev, "missing rx or tx buf\n");
+                       return -EINVAL;
+               }
+
+               /* FIXME implement these protocol options!! */
+               if (xfer->bits_per_word || xfer->speed_hz) {
+                       dev_dbg(&spi->dev, "no protocol options yet\n");
+                       return -ENOPROTOOPT;
+               }
+       }
+
+       /* scrub dcache "early" */
+       if (!msg->is_dma_mapped) {
+               list_for_each_entry(xfer, &msg->transfers, transfer_list)
+                       atmel_spi_dma_map_xfer(as, xfer);
+       }
+
+       list_for_each_entry(xfer, &msg->transfers, transfer_list) {
+               dev_dbg(controller,
+                       "  xfer %p: len %u tx %p/%08x rx %p/%08x\n",
+                       xfer, xfer->len,
+                       xfer->tx_buf, xfer->tx_dma,
+                       xfer->rx_buf, xfer->rx_dma);
+       }
+
+       msg->status = -EINPROGRESS;
+       msg->actual_length = 0;
+
+       spin_lock_irqsave(&as->lock, flags);
+       list_add_tail(&msg->queue, &as->queue);
+       if (!as->current_transfer)
+               atmel_spi_next_message(spi->master);
+       spin_unlock_irqrestore(&as->lock, flags);
+
+       return 0;
+}
+
+static void atmel_spi_cleanup(const struct spi_device *spi)
+{
+       if (spi->controller_state)
+               gpio_free((unsigned int)spi->controller_data);
+}
+
+/*-------------------------------------------------------------------------*/
+
+static int __init atmel_spi_probe(struct platform_device *pdev)
+{
+       struct resource         *regs;
+       int                     irq;
+       struct clk              *clk;
+       int                     ret;
+       struct spi_master       *master;
+       struct atmel_spi        *as;
+
+       regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!regs)
+               return -ENXIO;
+
+       irq = platform_get_irq(pdev, 0);
+       if (irq < 0)
+               return irq;
+
+       clk = clk_get(&pdev->dev, "spi_clk");
+       if (IS_ERR(clk))
+               return PTR_ERR(clk);
+
+       /* setup spi core then atmel-specific driver state */
+       ret = -ENOMEM;
+       master = spi_alloc_master(&pdev->dev, sizeof *as);
+       if (!master)
+               goto out_free;
+
+       master->bus_num = pdev->id;
+       master->num_chipselect = 4;
+       master->setup = atmel_spi_setup;
+       master->transfer = atmel_spi_transfer;
+       master->cleanup = atmel_spi_cleanup;
+       platform_set_drvdata(pdev, master);
+
+       as = spi_master_get_devdata(master);
+
+       as->buffer = dma_alloc_coherent(&pdev->dev, BUFFER_SIZE,
+                                       &as->buffer_dma, GFP_KERNEL);
+       if (!as->buffer)
+               goto out_free;
+
+       spin_lock_init(&as->lock);
+       INIT_LIST_HEAD(&as->queue);
+       as->pdev = pdev;
+       as->regs = ioremap(regs->start, (regs->end - regs->start) + 1);
+       if (!as->regs)
+               goto out_free_buffer;
+       as->irq = irq;
+       as->clk = clk;
+#ifdef CONFIG_ARCH_AT91
+       if (!cpu_is_at91rm9200())
+               as->new_1 = 1;
+#endif
+
+       ret = request_irq(irq, atmel_spi_interrupt, 0,
+                       pdev->dev.bus_id, master);
+       if (ret)
+               goto out_unmap_regs;
+
+       /* Initialize the hardware */
+       clk_enable(clk);
+       spi_writel(as, CR, SPI_BIT(SWRST));
+       spi_writel(as, MR, SPI_BIT(MSTR) | SPI_BIT(MODFDIS));
+       spi_writel(as, PTCR, SPI_BIT(RXTDIS) | SPI_BIT(TXTDIS));
+       spi_writel(as, CR, SPI_BIT(SPIEN));
+
+       /* go! */
+       dev_info(&pdev->dev, "Atmel SPI Controller at 0x%08lx (irq %d)\n",
+                       (unsigned long)regs->start, irq);
+
+       ret = spi_register_master(master);
+       if (ret)
+               goto out_reset_hw;
+
+       return 0;
+
+out_reset_hw:
+       spi_writel(as, CR, SPI_BIT(SWRST));
+       clk_disable(clk);
+       free_irq(irq, master);
+out_unmap_regs:
+       iounmap(as->regs);
+out_free_buffer:
+       dma_free_coherent(&pdev->dev, BUFFER_SIZE, as->buffer,
+                       as->buffer_dma);
+out_free:
+       clk_put(clk);
+       spi_master_put(master);
+       return ret;
+}
+
+static int __exit atmel_spi_remove(struct platform_device *pdev)
+{
+       struct spi_master       *master = platform_get_drvdata(pdev);
+       struct atmel_spi        *as = spi_master_get_devdata(master);
+       struct spi_message      *msg;
+
+       /* reset the hardware and block queue progress */
+       spin_lock_irq(&as->lock);
+       as->stopping = 1;
+       spi_writel(as, CR, SPI_BIT(SWRST));
+       spi_readl(as, SR);
+       spin_unlock_irq(&as->lock);
+
+       /* Terminate remaining queued transfers */
+       list_for_each_entry(msg, &as->queue, queue) {
+               /* REVISIT unmapping the dma is a NOP on ARM and AVR32
+                * but we shouldn't depend on that...
+                */
+               msg->status = -ESHUTDOWN;
+               msg->complete(msg->context);
+       }
+
+       dma_free_coherent(&pdev->dev, BUFFER_SIZE, as->buffer,
+                       as->buffer_dma);
+
+       clk_disable(as->clk);
+       clk_put(as->clk);
+       free_irq(as->irq, master);
+       iounmap(as->regs);
+
+       spi_unregister_master(master);
+
+       return 0;
+}
+
+#ifdef CONFIG_PM
+
+static int atmel_spi_suspend(struct platform_device *pdev, pm_message_t mesg)
+{
+       struct spi_master       *master = platform_get_drvdata(pdev);
+       struct atmel_spi        *as = spi_master_get_devdata(master);
+
+       clk_disable(as->clk);
+       return 0;
+}
+
+static int atmel_spi_resume(struct platform_device *pdev)
+{
+       struct spi_master       *master = platform_get_drvdata(pdev);
+       struct atmel_spi        *as = spi_master_get_devdata(master);
+
+       clk_enable(as->clk);
+       return 0;
+}
+
+#else
+#define        atmel_spi_suspend       NULL
+#define        atmel_spi_resume        NULL
+#endif
+
+
+static struct platform_driver atmel_spi_driver = {
+       .driver         = {
+               .name   = "atmel_spi",
+               .owner  = THIS_MODULE,
+       },
+       .suspend        = atmel_spi_suspend,
+       .resume         = atmel_spi_resume,
+       .remove         = __exit_p(atmel_spi_remove),
+};
+
+static int __init atmel_spi_init(void)
+{
+       return platform_driver_probe(&atmel_spi_driver, atmel_spi_probe);
+}
+module_init(atmel_spi_init);
+
+static void __exit atmel_spi_exit(void)
+{
+       platform_driver_unregister(&atmel_spi_driver);
+}
+module_exit(atmel_spi_exit);
+
+MODULE_DESCRIPTION("Atmel AT32/AT91 SPI Controller driver");
+MODULE_AUTHOR("Haavard Skinnemoen <hskinnemoen@atmel.com>");
+MODULE_LICENSE("GPL");
diff --git a/drivers/spi/atmel_spi.h b/drivers/spi/atmel_spi.h
new file mode 100644 (file)
index 0000000..6e06b6a
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+ * Register definitions for Atmel Serial Peripheral Interface (SPI)
+ *
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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.
+ */
+#ifndef __ATMEL_SPI_H__
+#define __ATMEL_SPI_H__
+
+/* SPI register offsets */
+#define SPI_CR                                 0x0000
+#define SPI_MR                                 0x0004
+#define SPI_RDR                                        0x0008
+#define SPI_TDR                                        0x000c
+#define SPI_SR                                 0x0010
+#define SPI_IER                                        0x0014
+#define SPI_IDR                                        0x0018
+#define SPI_IMR                                        0x001c
+#define SPI_CSR0                               0x0030
+#define SPI_CSR1                               0x0034
+#define SPI_CSR2                               0x0038
+#define SPI_CSR3                               0x003c
+#define SPI_RPR                                        0x0100
+#define SPI_RCR                                        0x0104
+#define SPI_TPR                                        0x0108
+#define SPI_TCR                                        0x010c
+#define SPI_RNPR                               0x0110
+#define SPI_RNCR                               0x0114
+#define SPI_TNPR                               0x0118
+#define SPI_TNCR                               0x011c
+#define SPI_PTCR                               0x0120
+#define SPI_PTSR                               0x0124
+
+/* Bitfields in CR */
+#define SPI_SPIEN_OFFSET                       0
+#define SPI_SPIEN_SIZE                         1
+#define SPI_SPIDIS_OFFSET                      1
+#define SPI_SPIDIS_SIZE                                1
+#define SPI_SWRST_OFFSET                       7
+#define SPI_SWRST_SIZE                         1
+#define SPI_LASTXFER_OFFSET                    24
+#define SPI_LASTXFER_SIZE                      1
+
+/* Bitfields in MR */
+#define SPI_MSTR_OFFSET                                0
+#define SPI_MSTR_SIZE                          1
+#define SPI_PS_OFFSET                          1
+#define SPI_PS_SIZE                            1
+#define SPI_PCSDEC_OFFSET                      2
+#define SPI_PCSDEC_SIZE                                1
+#define SPI_FDIV_OFFSET                                3
+#define SPI_FDIV_SIZE                          1
+#define SPI_MODFDIS_OFFSET                     4
+#define SPI_MODFDIS_SIZE                       1
+#define SPI_LLB_OFFSET                         7
+#define SPI_LLB_SIZE                           1
+#define SPI_PCS_OFFSET                         16
+#define SPI_PCS_SIZE                           4
+#define SPI_DLYBCS_OFFSET                      24
+#define SPI_DLYBCS_SIZE                                8
+
+/* Bitfields in RDR */
+#define SPI_RD_OFFSET                          0
+#define SPI_RD_SIZE                            16
+
+/* Bitfields in TDR */
+#define SPI_TD_OFFSET                          0
+#define SPI_TD_SIZE                            16
+
+/* Bitfields in SR */
+#define SPI_RDRF_OFFSET                                0
+#define SPI_RDRF_SIZE                          1
+#define SPI_TDRE_OFFSET                                1
+#define SPI_TDRE_SIZE                          1
+#define SPI_MODF_OFFSET                                2
+#define SPI_MODF_SIZE                          1
+#define SPI_OVRES_OFFSET                       3
+#define SPI_OVRES_SIZE                         1
+#define SPI_ENDRX_OFFSET                       4
+#define SPI_ENDRX_SIZE                         1
+#define SPI_ENDTX_OFFSET                       5
+#define SPI_ENDTX_SIZE                         1
+#define SPI_RXBUFF_OFFSET                      6
+#define SPI_RXBUFF_SIZE                                1
+#define SPI_TXBUFE_OFFSET                      7
+#define SPI_TXBUFE_SIZE                                1
+#define SPI_NSSR_OFFSET                                8
+#define SPI_NSSR_SIZE                          1
+#define SPI_TXEMPTY_OFFSET                     9
+#define SPI_TXEMPTY_SIZE                       1
+#define SPI_SPIENS_OFFSET                      16
+#define SPI_SPIENS_SIZE                                1
+
+/* Bitfields in CSR0 */
+#define SPI_CPOL_OFFSET                                0
+#define SPI_CPOL_SIZE                          1
+#define SPI_NCPHA_OFFSET                       1
+#define SPI_NCPHA_SIZE                         1
+#define SPI_CSAAT_OFFSET                       3
+#define SPI_CSAAT_SIZE                         1
+#define SPI_BITS_OFFSET                                4
+#define SPI_BITS_SIZE                          4
+#define SPI_SCBR_OFFSET                                8
+#define SPI_SCBR_SIZE                          8
+#define SPI_DLYBS_OFFSET                       16
+#define SPI_DLYBS_SIZE                         8
+#define SPI_DLYBCT_OFFSET                      24
+#define SPI_DLYBCT_SIZE                                8
+
+/* Bitfields in RCR */
+#define SPI_RXCTR_OFFSET                       0
+#define SPI_RXCTR_SIZE                         16
+
+/* Bitfields in TCR */
+#define SPI_TXCTR_OFFSET                       0
+#define SPI_TXCTR_SIZE                         16
+
+/* Bitfields in RNCR */
+#define SPI_RXNCR_OFFSET                       0
+#define SPI_RXNCR_SIZE                         16
+
+/* Bitfields in TNCR */
+#define SPI_TXNCR_OFFSET                       0
+#define SPI_TXNCR_SIZE                         16
+
+/* Bitfields in PTCR */
+#define SPI_RXTEN_OFFSET                       0
+#define SPI_RXTEN_SIZE                         1
+#define SPI_RXTDIS_OFFSET                      1
+#define SPI_RXTDIS_SIZE                                1
+#define SPI_TXTEN_OFFSET                       8
+#define SPI_TXTEN_SIZE                         1
+#define SPI_TXTDIS_OFFSET                      9
+#define SPI_TXTDIS_SIZE                                1
+
+/* Constants for BITS */
+#define SPI_BITS_8_BPT                         0
+#define SPI_BITS_9_BPT                         1
+#define SPI_BITS_10_BPT                                2
+#define SPI_BITS_11_BPT                                3
+#define SPI_BITS_12_BPT                                4
+#define SPI_BITS_13_BPT                                5
+#define SPI_BITS_14_BPT                                6
+#define SPI_BITS_15_BPT                                7
+#define SPI_BITS_16_BPT                                8
+
+/* Bit manipulation macros */
+#define SPI_BIT(name) \
+       (1 << SPI_##name##_OFFSET)
+#define SPI_BF(name,value) \
+       (((value) & ((1 << SPI_##name##_SIZE) - 1)) << SPI_##name##_OFFSET)
+#define SPI_BFEXT(name,value) \
+       (((value) >> SPI_##name##_OFFSET) & ((1 << SPI_##name##_SIZE) - 1))
+#define SPI_BFINS(name,value,old) \
+       ( ((old) & ~(((1 << SPI_##name##_SIZE) - 1) << SPI_##name##_OFFSET)) \
+         | SPI_BF(name,value))
+
+/* Register access macros */
+#define spi_readl(port,reg) \
+       __raw_readl((port)->regs + SPI_##reg)
+#define spi_writel(port,reg,value) \
+       __raw_writel((value), (port)->regs + SPI_##reg)
+
+#endif /* __ATMEL_SPI_H__ */
diff --git a/drivers/spi/omap_uwire.c b/drivers/spi/omap_uwire.c
new file mode 100644 (file)
index 0000000..366af49
--- /dev/null
@@ -0,0 +1,572 @@
+/*
+ * omap_uwire.c -- MicroWire interface driver for OMAP
+ *
+ * Copyright 2003 MontaVista Software Inc. <source@mvista.com>
+ *
+ * Ported to 2.6 OMAP uwire interface.
+ * Copyright (C) 2004 Texas Instruments.
+ *
+ * Generalization patches by Juha Yrjola <juha.yrjola@nokia.com>
+ *
+ * Copyright (C) 2005 David Brownell (ported to 2.6 SPI interface)
+ * Copyright (C) 2006 Nokia
+ *
+ * Many updates by Imre Deak <imre.deak@nokia.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 SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * 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/init.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/workqueue.h>
+#include <linux/interrupt.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+
+#include <linux/spi/spi.h>
+#include <linux/spi/spi_bitbang.h>
+
+#include <asm/system.h>
+#include <asm/irq.h>
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/mach-types.h>
+
+#include <asm/arch/mux.h>
+#include <asm/arch/omap730.h>  /* OMAP730_IO_CONF registers */
+
+
+/* FIXME address is now a platform device resource,
+ * and irqs should show there too...
+ */
+#define UWIRE_BASE_PHYS                0xFFFB3000
+#define UWIRE_BASE             ((void *__iomem)IO_ADDRESS(UWIRE_BASE_PHYS))
+
+/* uWire Registers: */
+#define UWIRE_IO_SIZE 0x20
+#define UWIRE_TDR     0x00
+#define UWIRE_RDR     0x00
+#define UWIRE_CSR     0x01
+#define UWIRE_SR1     0x02
+#define UWIRE_SR2     0x03
+#define UWIRE_SR3     0x04
+#define UWIRE_SR4     0x05
+#define UWIRE_SR5     0x06
+
+/* CSR bits */
+#define        RDRB    (1 << 15)
+#define        CSRB    (1 << 14)
+#define        START   (1 << 13)
+#define        CS_CMD  (1 << 12)
+
+/* SR1 or SR2 bits */
+#define UWIRE_READ_FALLING_EDGE                0x0001
+#define UWIRE_READ_RISING_EDGE         0x0000
+#define UWIRE_WRITE_FALLING_EDGE       0x0000
+#define UWIRE_WRITE_RISING_EDGE                0x0002
+#define UWIRE_CS_ACTIVE_LOW            0x0000
+#define UWIRE_CS_ACTIVE_HIGH           0x0004
+#define UWIRE_FREQ_DIV_2               0x0000
+#define UWIRE_FREQ_DIV_4               0x0008
+#define UWIRE_FREQ_DIV_8               0x0010
+#define UWIRE_CHK_READY                        0x0020
+#define UWIRE_CLK_INVERTED             0x0040
+
+
+struct uwire_spi {
+       struct spi_bitbang      bitbang;
+       struct clk              *ck;
+};
+
+struct uwire_state {
+       unsigned        bits_per_word;
+       unsigned        div1_idx;
+};
+
+/* REVISIT compile time constant for idx_shift? */
+static unsigned int uwire_idx_shift;
+
+static inline void uwire_write_reg(int idx, u16 val)
+{
+       __raw_writew(val, UWIRE_BASE + (idx << uwire_idx_shift));
+}
+
+static inline u16 uwire_read_reg(int idx)
+{
+       return __raw_readw(UWIRE_BASE + (idx << uwire_idx_shift));
+}
+
+static inline void omap_uwire_configure_mode(u8 cs, unsigned long flags)
+{
+       u16     w, val = 0;
+       int     shift, reg;
+
+       if (flags & UWIRE_CLK_INVERTED)
+               val ^= 0x03;
+       val = flags & 0x3f;
+       if (cs & 1)
+               shift = 6;
+       else
+               shift = 0;
+       if (cs <= 1)
+               reg = UWIRE_SR1;
+       else
+               reg = UWIRE_SR2;
+
+       w = uwire_read_reg(reg);
+       w &= ~(0x3f << shift);
+       w |= val << shift;
+       uwire_write_reg(reg, w);
+}
+
+static int wait_uwire_csr_flag(u16 mask, u16 val, int might_not_catch)
+{
+       u16 w;
+       int c = 0;
+       unsigned long max_jiffies = jiffies + HZ;
+
+       for (;;) {
+               w = uwire_read_reg(UWIRE_CSR);
+               if ((w & mask) == val)
+                       break;
+               if (time_after(jiffies, max_jiffies)) {
+                       printk(KERN_ERR "%s: timeout. reg=%#06x "
+                                       "mask=%#06x val=%#06x\n",
+                              __FUNCTION__, w, mask, val);
+                       return -1;
+               }
+               c++;
+               if (might_not_catch && c > 64)
+                       break;
+       }
+       return 0;
+}
+
+static void uwire_set_clk1_div(int div1_idx)
+{
+       u16 w;
+
+       w = uwire_read_reg(UWIRE_SR3);
+       w &= ~(0x03 << 1);
+       w |= div1_idx << 1;
+       uwire_write_reg(UWIRE_SR3, w);
+}
+
+static void uwire_chipselect(struct spi_device *spi, int value)
+{
+       struct  uwire_state *ust = spi->controller_state;
+       u16     w;
+       int     old_cs;
+
+
+       BUG_ON(wait_uwire_csr_flag(CSRB, 0, 0));
+
+       w = uwire_read_reg(UWIRE_CSR);
+       old_cs = (w >> 10) & 0x03;
+       if (value == BITBANG_CS_INACTIVE || old_cs != spi->chip_select) {
+               /* Deselect this CS, or the previous CS */
+               w &= ~CS_CMD;
+               uwire_write_reg(UWIRE_CSR, w);
+       }
+       /* activate specfied chipselect */
+       if (value == BITBANG_CS_ACTIVE) {
+               uwire_set_clk1_div(ust->div1_idx);
+               /* invert clock? */
+               if (spi->mode & SPI_CPOL)
+                       uwire_write_reg(UWIRE_SR4, 1);
+               else
+                       uwire_write_reg(UWIRE_SR4, 0);
+
+               w = spi->chip_select << 10;
+               w |= CS_CMD;
+               uwire_write_reg(UWIRE_CSR, w);
+       }
+}
+
+static int uwire_txrx(struct spi_device *spi, struct spi_transfer *t)
+{
+       struct uwire_state *ust = spi->controller_state;
+       unsigned        len = t->len;
+       unsigned        bits = ust->bits_per_word;
+       unsigned        bytes;
+       u16             val, w;
+       int             status = 0;;
+
+       if (!t->tx_buf && !t->rx_buf)
+               return 0;
+
+       /* Microwire doesn't read and write concurrently */
+       if (t->tx_buf && t->rx_buf)
+               return -EPERM;
+
+       w = spi->chip_select << 10;
+       w |= CS_CMD;
+
+       if (t->tx_buf) {
+               const u8        *buf = t->tx_buf;
+
+               /* NOTE:  DMA could be used for TX transfers */
+
+               /* write one or two bytes at a time */
+               while (len >= 1) {
+                       /* tx bit 15 is first sent; we byteswap multibyte words
+                        * (msb-first) on the way out from memory.
+                        */
+                       val = *buf++;
+                       if (bits > 8) {
+                               bytes = 2;
+                               val |= *buf++ << 8;
+                       } else
+                               bytes = 1;
+                       val <<= 16 - bits;
+
+#ifdef VERBOSE
+                       pr_debug("%s: write-%d =%04x\n",
+                                       spi->dev.bus_id, bits, val);
+#endif
+                       if (wait_uwire_csr_flag(CSRB, 0, 0))
+                               goto eio;
+
+                       uwire_write_reg(UWIRE_TDR, val);
+
+                       /* start write */
+                       val = START | w | (bits << 5);
+
+                       uwire_write_reg(UWIRE_CSR, val);
+                       len -= bytes;
+
+                       /* Wait till write actually starts.
+                        * This is needed with MPU clock 60+ MHz.
+                        * REVISIT: we may not have time to catch it...
+                        */
+                       if (wait_uwire_csr_flag(CSRB, CSRB, 1))
+                               goto eio;
+
+                       status += bytes;
+               }
+
+               /* REVISIT:  save this for later to get more i/o overlap */
+               if (wait_uwire_csr_flag(CSRB, 0, 0))
+                       goto eio;
+
+       } else if (t->rx_buf) {
+               u8              *buf = t->rx_buf;
+
+               /* read one or two bytes at a time */
+               while (len) {
+                       if (bits > 8) {
+                               bytes = 2;
+                       } else
+                               bytes = 1;
+
+                       /* start read */
+                       val = START | w | (bits << 0);
+                       uwire_write_reg(UWIRE_CSR, val);
+                       len -= bytes;
+
+                       /* Wait till read actually starts */
+                       (void) wait_uwire_csr_flag(CSRB, CSRB, 1);
+
+                       if (wait_uwire_csr_flag(RDRB | CSRB,
+                                               RDRB, 0))
+                               goto eio;
+
+                       /* rx bit 0 is last received; multibyte words will
+                        * be properly byteswapped on the way to memory.
+                        */
+                       val = uwire_read_reg(UWIRE_RDR);
+                       val &= (1 << bits) - 1;
+                       *buf++ = (u8) val;
+                       if (bytes == 2)
+                               *buf++ = val >> 8;
+                       status += bytes;
+#ifdef VERBOSE
+                       pr_debug("%s: read-%d =%04x\n",
+                                       spi->dev.bus_id, bits, val);
+#endif
+
+               }
+       }
+       return status;
+eio:
+       return -EIO;
+}
+
+static int uwire_setup_transfer(struct spi_device *spi, struct spi_transfer *t)
+{
+       struct uwire_state      *ust = spi->controller_state;
+       struct uwire_spi        *uwire;
+       unsigned                flags = 0;
+       unsigned                bits;
+       unsigned                hz;
+       unsigned long           rate;
+       int                     div1_idx;
+       int                     div1;
+       int                     div2;
+       int                     status;
+
+       uwire = spi_master_get_devdata(spi->master);
+
+       if (spi->chip_select > 3) {
+               pr_debug("%s: cs%d?\n", spi->dev.bus_id, spi->chip_select);
+               status = -ENODEV;
+               goto done;
+       }
+
+       bits = spi->bits_per_word;
+       if (t != NULL && t->bits_per_word)
+               bits = t->bits_per_word;
+       if (!bits)
+               bits = 8;
+
+       if (bits > 16) {
+               pr_debug("%s: wordsize %d?\n", spi->dev.bus_id, bits);
+               status = -ENODEV;
+               goto done;
+       }
+       ust->bits_per_word = bits;
+
+       /* mode 0..3, clock inverted separately;
+        * standard nCS signaling;
+        * don't treat DI=high as "not ready"
+        */
+       if (spi->mode & SPI_CS_HIGH)
+               flags |= UWIRE_CS_ACTIVE_HIGH;
+
+       if (spi->mode & SPI_CPOL)
+               flags |= UWIRE_CLK_INVERTED;
+
+       switch (spi->mode & (SPI_CPOL | SPI_CPHA)) {
+       case SPI_MODE_0:
+       case SPI_MODE_3:
+               flags |= UWIRE_WRITE_RISING_EDGE | UWIRE_READ_FALLING_EDGE;
+               break;
+       case SPI_MODE_1:
+       case SPI_MODE_2:
+               flags |= UWIRE_WRITE_FALLING_EDGE | UWIRE_READ_RISING_EDGE;
+               break;
+       }
+
+       /* assume it's already enabled */
+       rate = clk_get_rate(uwire->ck);
+
+       hz = spi->max_speed_hz;
+       if (t != NULL && t->speed_hz)
+               hz = t->speed_hz;
+
+       if (!hz) {
+               pr_debug("%s: zero speed?\n", spi->dev.bus_id);
+               status = -EINVAL;
+               goto done;
+       }
+
+       /* F_INT = mpu_xor_clk / DIV1 */
+       for (div1_idx = 0; div1_idx < 4; div1_idx++) {
+               switch (div1_idx) {
+               case 0:
+                       div1 = 2;
+                       break;
+               case 1:
+                       div1 = 4;
+                       break;
+               case 2:
+                       div1 = 7;
+                       break;
+               default:
+               case 3:
+                       div1 = 10;
+                       break;
+               }
+               div2 = (rate / div1 + hz - 1) / hz;
+               if (div2 <= 8)
+                       break;
+       }
+       if (div1_idx == 4) {
+               pr_debug("%s: lowest clock %ld, need %d\n",
+                       spi->dev.bus_id, rate / 10 / 8, hz);
+               status = -EDOM;
+               goto done;
+       }
+
+       /* we have to cache this and reset in uwire_chipselect as this is a
+        * global parameter and another uwire device can change it under
+        * us */
+       ust->div1_idx = div1_idx;
+       uwire_set_clk1_div(div1_idx);
+
+       rate /= div1;
+
+       switch (div2) {
+       case 0:
+       case 1:
+       case 2:
+               flags |= UWIRE_FREQ_DIV_2;
+               rate /= 2;
+               break;
+       case 3:
+       case 4:
+               flags |= UWIRE_FREQ_DIV_4;
+               rate /= 4;
+               break;
+       case 5:
+       case 6:
+       case 7:
+       case 8:
+               flags |= UWIRE_FREQ_DIV_8;
+               rate /= 8;
+               break;
+       }
+       omap_uwire_configure_mode(spi->chip_select, flags);
+       pr_debug("%s: uwire flags %02x, armxor %lu KHz, SCK %lu KHz\n",
+                       __FUNCTION__, flags,
+                       clk_get_rate(uwire->ck) / 1000,
+                       rate / 1000);
+       status = 0;
+done:
+       return status;
+}
+
+static int uwire_setup(struct spi_device *spi)
+{
+       struct uwire_state *ust = spi->controller_state;
+
+       if (ust == NULL) {
+               ust = kzalloc(sizeof(*ust), GFP_KERNEL);
+               if (ust == NULL)
+                       return -ENOMEM;
+               spi->controller_state = ust;
+       }
+
+       return uwire_setup_transfer(spi, NULL);
+}
+
+static void uwire_cleanup(const struct spi_device *spi)
+{
+       kfree(spi->controller_state);
+}
+
+static void uwire_off(struct uwire_spi *uwire)
+{
+       uwire_write_reg(UWIRE_SR3, 0);
+       clk_disable(uwire->ck);
+       clk_put(uwire->ck);
+       spi_master_put(uwire->bitbang.master);
+}
+
+static int uwire_probe(struct platform_device *pdev)
+{
+       struct spi_master       *master;
+       struct uwire_spi        *uwire;
+       int                     status;
+
+       master = spi_alloc_master(&pdev->dev, sizeof *uwire);
+       if (!master)
+               return -ENODEV;
+
+       uwire = spi_master_get_devdata(master);
+       dev_set_drvdata(&pdev->dev, uwire);
+
+       uwire->ck = clk_get(&pdev->dev, "armxor_ck");
+       if (!uwire->ck || IS_ERR(uwire->ck)) {
+               dev_dbg(&pdev->dev, "no mpu_xor_clk ?\n");
+               spi_master_put(master);
+               return -ENODEV;
+       }
+       clk_enable(uwire->ck);
+
+       if (cpu_is_omap730())
+               uwire_idx_shift = 1;
+       else
+               uwire_idx_shift = 2;
+
+       uwire_write_reg(UWIRE_SR3, 1);
+
+       master->bus_num = 2;    /* "official" */
+       master->num_chipselect = 4;
+       master->setup = uwire_setup;
+       master->cleanup = uwire_cleanup;
+
+       uwire->bitbang.master = master;
+       uwire->bitbang.chipselect = uwire_chipselect;
+       uwire->bitbang.setup_transfer = uwire_setup_transfer;
+       uwire->bitbang.txrx_bufs = uwire_txrx;
+
+       status = spi_bitbang_start(&uwire->bitbang);
+       if (status < 0)
+               uwire_off(uwire);
+       return status;
+}
+
+static int uwire_remove(struct platform_device *pdev)
+{
+       struct uwire_spi        *uwire = dev_get_drvdata(&pdev->dev);
+       int                     status;
+
+       // FIXME remove all child devices, somewhere ...
+
+       status = spi_bitbang_stop(&uwire->bitbang);
+       uwire_off(uwire);
+       return status;
+}
+
+static struct platform_driver uwire_driver = {
+       .driver = {
+               .name           = "omap_uwire",
+               .bus            = &platform_bus_type,
+               .owner          = THIS_MODULE,
+       },
+       .probe          = uwire_probe,
+       .remove         = uwire_remove,
+       // suspend ... unuse ck
+       // resume ... use ck
+};
+
+static int __init omap_uwire_init(void)
+{
+       /* FIXME move these into the relevant board init code. also, include
+        * H3 support; it uses tsc2101 like H2 (on a different chipselect).
+        */
+
+       if (machine_is_omap_h2()) {
+               /* defaults: W21 SDO, U18 SDI, V19 SCL */
+               omap_cfg_reg(N14_1610_UWIRE_CS0);
+               omap_cfg_reg(N15_1610_UWIRE_CS1);
+       }
+       if (machine_is_omap_perseus2()) {
+               /* configure pins: MPU_UW_nSCS1, MPU_UW_SDO, MPU_UW_SCLK */
+               int val = omap_readl(OMAP730_IO_CONF_9) & ~0x00EEE000;
+               omap_writel(val | 0x00AAA000, OMAP730_IO_CONF_9);
+       }
+
+       return platform_driver_register(&uwire_driver);
+}
+
+static void __exit omap_uwire_exit(void)
+{
+       platform_driver_unregister(&uwire_driver);
+}
+
+subsys_initcall(omap_uwire_init);
+module_exit(omap_uwire_exit);
+
+MODULE_LICENSE("GPL");
+
index 8b41f9cc2560f9a2a3c94711eed6aa61e85fd409..9f2c887ffa0466cf8d30105ed1ee6d5860fa29f4 100644 (file)
@@ -1214,9 +1214,9 @@ static int setup(struct spi_device *spi)
        return 0;
 }
 
-static void cleanup(const struct spi_device *spi)
+static void cleanup(struct spi_device *spi)
 {
-       struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi);
+       struct chip_data *chip = spi_get_ctldata(spi);
 
        kfree(chip);
 }
index 6307428d2c940aa3c83c170874ce3e783678a1e4..2328128728be696986f8342afa9f0b8c2cfc3e0b 100644 (file)
@@ -32,7 +32,7 @@
  */
 static void spidev_release(struct device *dev)
 {
-       const struct spi_device *spi = to_spi_device(dev);
+       struct spi_device       *spi = to_spi_device(dev);
 
        /* spi masters may cleanup for released devices */
        if (spi->master->cleanup)
index 57289b61d0beadd3dd543b853c233918f22daccc..24a330d82395a6e260c9ae5bdc7bb6132bb7c477 100644 (file)
@@ -210,7 +210,7 @@ int spi_bitbang_setup(struct spi_device *spi)
        if (!cs->txrx_word)
                return -EINVAL;
 
-       retval = spi_bitbang_setup_transfer(spi, NULL);
+       retval = bitbang->setup_transfer(spi, NULL);
        if (retval < 0)
                return retval;
 
@@ -238,7 +238,7 @@ EXPORT_SYMBOL_GPL(spi_bitbang_setup);
 /**
  * spi_bitbang_cleanup - default cleanup for per-word I/O loops
  */
-void spi_bitbang_cleanup(const struct spi_device *spi)
+void spi_bitbang_cleanup(struct spi_device *spi)
 {
        kfree(spi->controller_state);
 }
@@ -442,9 +442,10 @@ EXPORT_SYMBOL_GPL(spi_bitbang_transfer);
  * hardware that basically exposes a shift register) or per-spi_transfer
  * (which takes better advantage of hardware like fifos or DMA engines).
  *
- * Drivers using per-word I/O loops should use (or call) spi_bitbang_setup and
- * spi_bitbang_cleanup to handle those spi master methods.  Those methods are
- * the defaults if the bitbang->txrx_bufs routine isn't initialized.
+ * Drivers using per-word I/O loops should use (or call) spi_bitbang_setup,
+ * spi_bitbang_cleanup and spi_bitbang_setup_transfer to handle those spi
+ * master methods.  Those methods are the defaults if the bitbang->txrx_bufs
+ * routine isn't initialized.
  *
  * This routine registers the spi_master, which will process requests in a
  * dedicated task, keeping IRQs unblocked most of the time.  To stop
diff --git a/drivers/spi/spi_imx.c b/drivers/spi/spi_imx.c
new file mode 100644 (file)
index 0000000..6ccf8a1
--- /dev/null
@@ -0,0 +1,1769 @@
+/*
+ * drivers/spi/spi_imx.c
+ *
+ * Copyright (C) 2006 SWAPP
+ *     Andrea Paterniani <a.paterniani@swapp-eng.it>
+ *
+ * Initial version inspired by:
+ *     linux-2.6.17-rc3-mm1/drivers/spi/pxa2xx_spi.c
+ *
+ * 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.
+ */
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/ioport.h>
+#include <linux/errno.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <linux/dma-mapping.h>
+#include <linux/spi/spi.h>
+#include <linux/workqueue.h>
+#include <linux/delay.h>
+
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/hardware.h>
+#include <asm/delay.h>
+
+#include <asm/arch/hardware.h>
+#include <asm/arch/imx-dma.h>
+#include <asm/arch/spi_imx.h>
+
+/*-------------------------------------------------------------------------*/
+/* SPI Registers offsets from peripheral base address */
+#define SPI_RXDATA             (0x00)
+#define SPI_TXDATA             (0x04)
+#define SPI_CONTROL            (0x08)
+#define SPI_INT_STATUS         (0x0C)
+#define SPI_TEST               (0x10)
+#define SPI_PERIOD             (0x14)
+#define SPI_DMA                        (0x18)
+#define SPI_RESET              (0x1C)
+
+/* SPI Control Register Bit Fields & Masks */
+#define SPI_CONTROL_BITCOUNT_MASK      (0xF)           /* Bit Count Mask */
+#define SPI_CONTROL_BITCOUNT(n)                (((n) - 1) & SPI_CONTROL_BITCOUNT_MASK)
+#define SPI_CONTROL_POL                        (0x1 << 4)      /* Clock Polarity Mask */
+#define SPI_CONTROL_POL_ACT_HIGH       (0x0 << 4)      /* Active high pol. (0=idle) */
+#define SPI_CONTROL_POL_ACT_LOW                (0x1 << 4)      /* Active low pol. (1=idle) */
+#define SPI_CONTROL_PHA                        (0x1 << 5)      /* Clock Phase Mask */
+#define SPI_CONTROL_PHA_0              (0x0 << 5)      /* Clock Phase 0 */
+#define SPI_CONTROL_PHA_1              (0x1 << 5)      /* Clock Phase 1 */
+#define SPI_CONTROL_SSCTL              (0x1 << 6)      /* /SS Waveform Select Mask */
+#define SPI_CONTROL_SSCTL_0            (0x0 << 6)      /* Master: /SS stays low between SPI burst
+                                                          Slave: RXFIFO advanced by BIT_COUNT */
+#define SPI_CONTROL_SSCTL_1            (0x1 << 6)      /* Master: /SS insert pulse between SPI burst
+                                                          Slave: RXFIFO advanced by /SS rising edge */
+#define SPI_CONTROL_SSPOL              (0x1 << 7)      /* /SS Polarity Select Mask */
+#define SPI_CONTROL_SSPOL_ACT_LOW      (0x0 << 7)      /* /SS Active low */
+#define SPI_CONTROL_SSPOL_ACT_HIGH     (0x1 << 7)      /* /SS Active high */
+#define SPI_CONTROL_XCH                        (0x1 << 8)      /* Exchange */
+#define SPI_CONTROL_SPIEN              (0x1 << 9)      /* SPI Module Enable */
+#define SPI_CONTROL_MODE               (0x1 << 10)     /* SPI Mode Select Mask */
+#define SPI_CONTROL_MODE_SLAVE         (0x0 << 10)     /* SPI Mode Slave */
+#define SPI_CONTROL_MODE_MASTER                (0x1 << 10)     /* SPI Mode Master */
+#define SPI_CONTROL_DRCTL              (0x3 << 11)     /* /SPI_RDY Control Mask */
+#define SPI_CONTROL_DRCTL_0            (0x0 << 11)     /* Ignore /SPI_RDY */
+#define SPI_CONTROL_DRCTL_1            (0x1 << 11)     /* /SPI_RDY falling edge triggers input */
+#define SPI_CONTROL_DRCTL_2            (0x2 << 11)     /* /SPI_RDY active low level triggers input */
+#define SPI_CONTROL_DATARATE           (0x7 << 13)     /* Data Rate Mask */
+#define SPI_PERCLK2_DIV_MIN            (0)             /* PERCLK2:4 */
+#define SPI_PERCLK2_DIV_MAX            (7)             /* PERCLK2:512 */
+#define SPI_CONTROL_DATARATE_MIN       (SPI_PERCLK2_DIV_MAX << 13)
+#define SPI_CONTROL_DATARATE_MAX       (SPI_PERCLK2_DIV_MIN << 13)
+#define SPI_CONTROL_DATARATE_BAD       (SPI_CONTROL_DATARATE_MIN + 1)
+
+/* SPI Interrupt/Status Register Bit Fields & Masks */
+#define SPI_STATUS_TE  (0x1 << 0)      /* TXFIFO Empty Status */
+#define SPI_STATUS_TH  (0x1 << 1)      /* TXFIFO Half Status */
+#define SPI_STATUS_TF  (0x1 << 2)      /* TXFIFO Full Status */
+#define SPI_STATUS_RR  (0x1 << 3)      /* RXFIFO Data Ready Status */
+#define SPI_STATUS_RH  (0x1 << 4)      /* RXFIFO Half Status */
+#define SPI_STATUS_RF  (0x1 << 5)      /* RXFIFO Full Status */
+#define SPI_STATUS_RO  (0x1 << 6)      /* RXFIFO Overflow */
+#define SPI_STATUS_BO  (0x1 << 7)      /* Bit Count Overflow */
+#define SPI_STATUS     (0xFF)          /* SPI Status Mask */
+#define SPI_INTEN_TE   (0x1 << 8)      /* TXFIFO Empty Interrupt Enable */
+#define SPI_INTEN_TH   (0x1 << 9)      /* TXFIFO Half Interrupt Enable */
+#define SPI_INTEN_TF   (0x1 << 10)     /* TXFIFO Full Interrupt Enable */
+#define SPI_INTEN_RE   (0x1 << 11)     /* RXFIFO Data Ready Interrupt Enable */
+#define SPI_INTEN_RH   (0x1 << 12)     /* RXFIFO Half Interrupt Enable */
+#define SPI_INTEN_RF   (0x1 << 13)     /* RXFIFO Full Interrupt Enable */
+#define SPI_INTEN_RO   (0x1 << 14)     /* RXFIFO Overflow Interrupt Enable */
+#define SPI_INTEN_BO   (0x1 << 15)     /* Bit Count Overflow Interrupt Enable */
+#define SPI_INTEN      (0xFF << 8)     /* SPI Interrupt Enable Mask */
+
+/* SPI Test Register Bit Fields & Masks */
+#define SPI_TEST_TXCNT         (0xF << 0)      /* TXFIFO Counter */
+#define SPI_TEST_RXCNT_LSB     (4)             /* RXFIFO Counter LSB */
+#define SPI_TEST_RXCNT         (0xF << 4)      /* RXFIFO Counter */
+#define SPI_TEST_SSTATUS       (0xF << 8)      /* State Machine Status */
+#define SPI_TEST_LBC           (0x1 << 14)     /* Loop Back Control */
+
+/* SPI Period Register Bit Fields & Masks */
+#define SPI_PERIOD_WAIT                (0x7FFF << 0)   /* Wait Between Transactions */
+#define SPI_PERIOD_MAX_WAIT    (0x7FFF)        /* Max Wait Between
+                                                       Transactions */
+#define SPI_PERIOD_CSRC                (0x1 << 15)     /* Period Clock Source Mask */
+#define SPI_PERIOD_CSRC_BCLK   (0x0 << 15)     /* Period Clock Source is
+                                                       Bit Clock */
+#define SPI_PERIOD_CSRC_32768  (0x1 << 15)     /* Period Clock Source is
+                                                       32.768 KHz Clock */
+
+/* SPI DMA Register Bit Fields & Masks */
+#define SPI_DMA_RHDMA  (0xF << 4)      /* RXFIFO Half Status */
+#define SPI_DMA_RFDMA  (0x1 << 5)      /* RXFIFO Full Status */
+#define SPI_DMA_TEDMA  (0x1 << 6)      /* TXFIFO Empty Status */
+#define SPI_DMA_THDMA  (0x1 << 7)      /* TXFIFO Half Status */
+#define SPI_DMA_RHDEN  (0x1 << 12)     /* RXFIFO Half DMA Request Enable */
+#define SPI_DMA_RFDEN  (0x1 << 13)     /* RXFIFO Full DMA Request Enable */
+#define SPI_DMA_TEDEN  (0x1 << 14)     /* TXFIFO Empty DMA Request Enable */
+#define SPI_DMA_THDEN  (0x1 << 15)     /* TXFIFO Half DMA Request Enable */
+
+/* SPI Soft Reset Register Bit Fields & Masks */
+#define SPI_RESET_START        (0x1)           /* Start */
+
+/* Default SPI configuration values */
+#define SPI_DEFAULT_CONTROL            \
+(                                      \
+       SPI_CONTROL_BITCOUNT(16) |      \
+       SPI_CONTROL_POL_ACT_HIGH |      \
+       SPI_CONTROL_PHA_0 |             \
+       SPI_CONTROL_SPIEN |             \
+       SPI_CONTROL_SSCTL_1 |           \
+       SPI_CONTROL_MODE_MASTER |       \
+       SPI_CONTROL_DRCTL_0 |           \
+       SPI_CONTROL_DATARATE_MIN        \
+)
+#define SPI_DEFAULT_ENABLE_LOOPBACK    (0)
+#define SPI_DEFAULT_ENABLE_DMA         (0)
+#define SPI_DEFAULT_PERIOD_WAIT                (8)
+/*-------------------------------------------------------------------------*/
+
+
+/*-------------------------------------------------------------------------*/
+/* TX/RX SPI FIFO size */
+#define SPI_FIFO_DEPTH                 (8)
+#define SPI_FIFO_BYTE_WIDTH            (2)
+#define SPI_FIFO_OVERFLOW_MARGIN       (2)
+
+/* DMA burst lenght for half full/empty request trigger */
+#define SPI_DMA_BLR                    (SPI_FIFO_DEPTH * SPI_FIFO_BYTE_WIDTH / 2)
+
+/* Dummy char output to achieve reads.
+   Choosing something different from all zeroes may help pattern recogition
+   for oscilloscope analysis, but may break some drivers. */
+#define SPI_DUMMY_u8                   0
+#define SPI_DUMMY_u16                  ((SPI_DUMMY_u8 << 8) | SPI_DUMMY_u8)
+#define SPI_DUMMY_u32                  ((SPI_DUMMY_u16 << 16) | SPI_DUMMY_u16)
+
+/**
+ * Macro to change a u32 field:
+ * @r : register to edit
+ * @m : bit mask
+ * @v : new value for the field correctly bit-alligned
+*/
+#define u32_EDIT(r, m, v)              r = (r & ~(m)) | (v)
+
+/* Message state */
+#define START_STATE                    ((void*)0)
+#define RUNNING_STATE                  ((void*)1)
+#define DONE_STATE                     ((void*)2)
+#define ERROR_STATE                    ((void*)-1)
+
+/* Queue state */
+#define QUEUE_RUNNING                  (0)
+#define QUEUE_STOPPED                  (1)
+
+#define IS_DMA_ALIGNED(x)              (((u32)(x) & 0x03) == 0)
+/*-------------------------------------------------------------------------*/
+
+
+/*-------------------------------------------------------------------------*/
+/* Driver data structs */
+
+/* Context */
+struct driver_data {
+       /* Driver model hookup */
+       struct platform_device *pdev;
+
+       /* SPI framework hookup */
+       struct spi_master *master;
+
+       /* IMX hookup */
+       struct spi_imx_master *master_info;
+
+       /* Memory resources and SPI regs virtual address */
+       struct resource *ioarea;
+       void __iomem *regs;
+
+       /* SPI RX_DATA physical address */
+       dma_addr_t rd_data_phys;
+
+       /* Driver message queue */
+       struct workqueue_struct *workqueue;
+       struct work_struct work;
+       spinlock_t lock;
+       struct list_head queue;
+       int busy;
+       int run;
+
+       /* Message Transfer pump */
+       struct tasklet_struct pump_transfers;
+
+       /* Current message, transfer and state */
+       struct spi_message *cur_msg;
+       struct spi_transfer *cur_transfer;
+       struct chip_data *cur_chip;
+
+       /* Rd / Wr buffers pointers */
+       size_t len;
+       void *tx;
+       void *tx_end;
+       void *rx;
+       void *rx_end;
+
+       u8 rd_only;
+       u8 n_bytes;
+       int cs_change;
+
+       /* Function pointers */
+       irqreturn_t (*transfer_handler)(struct driver_data *drv_data);
+       void (*cs_control)(u32 command);
+
+       /* DMA setup */
+       int rx_channel;
+       int tx_channel;
+       dma_addr_t rx_dma;
+       dma_addr_t tx_dma;
+       int rx_dma_needs_unmap;
+       int tx_dma_needs_unmap;
+       size_t tx_map_len;
+       u32 dummy_dma_buf ____cacheline_aligned;
+};
+
+/* Runtime state */
+struct chip_data {
+       u32 control;
+       u32 period;
+       u32 test;
+
+       u8 enable_dma:1;
+       u8 bits_per_word;
+       u8 n_bytes;
+       u32 max_speed_hz;
+
+       void (*cs_control)(u32 command);
+};
+/*-------------------------------------------------------------------------*/
+
+
+static void pump_messages(struct work_struct *work);
+
+static int flush(struct driver_data *drv_data)
+{
+       unsigned long limit = loops_per_jiffy << 1;
+       void __iomem *regs = drv_data->regs;
+       volatile u32 d;
+
+       dev_dbg(&drv_data->pdev->dev, "flush\n");
+       do {
+               while (readl(regs + SPI_INT_STATUS) & SPI_STATUS_RR)
+                       d = readl(regs + SPI_RXDATA);
+       } while ((readl(regs + SPI_CONTROL) & SPI_CONTROL_XCH) && limit--);
+
+       return limit;
+}
+
+static void restore_state(struct driver_data *drv_data)
+{
+       void __iomem *regs = drv_data->regs;
+       struct chip_data *chip = drv_data->cur_chip;
+
+       /* Load chip registers */
+       dev_dbg(&drv_data->pdev->dev,
+               "restore_state\n"
+               "    test    = 0x%08X\n"
+               "    control = 0x%08X\n",
+               chip->test,
+               chip->control);
+       writel(chip->test, regs + SPI_TEST);
+       writel(chip->period, regs + SPI_PERIOD);
+       writel(0, regs + SPI_INT_STATUS);
+       writel(chip->control, regs + SPI_CONTROL);
+}
+
+static void null_cs_control(u32 command)
+{
+}
+
+static inline u32 data_to_write(struct driver_data *drv_data)
+{
+       return ((u32)(drv_data->tx_end - drv_data->tx)) / drv_data->n_bytes;
+}
+
+static inline u32 data_to_read(struct driver_data *drv_data)
+{
+       return ((u32)(drv_data->rx_end - drv_data->rx)) / drv_data->n_bytes;
+}
+
+static int write(struct driver_data *drv_data)
+{
+       void __iomem *regs = drv_data->regs;
+       void *tx = drv_data->tx;
+       void *tx_end = drv_data->tx_end;
+       u8 n_bytes = drv_data->n_bytes;
+       u32 remaining_writes;
+       u32 fifo_avail_space;
+       u32 n;
+       u16 d;
+
+       /* Compute how many fifo writes to do */
+       remaining_writes = (u32)(tx_end - tx) / n_bytes;
+       fifo_avail_space = SPI_FIFO_DEPTH -
+                               (readl(regs + SPI_TEST) & SPI_TEST_TXCNT);
+       if (drv_data->rx && (fifo_avail_space > SPI_FIFO_OVERFLOW_MARGIN))
+               /* Fix misunderstood receive overflow */
+               fifo_avail_space -= SPI_FIFO_OVERFLOW_MARGIN;
+       n = min(remaining_writes, fifo_avail_space);
+
+       dev_dbg(&drv_data->pdev->dev,
+               "write type %s\n"
+               "    remaining writes = %d\n"
+               "    fifo avail space = %d\n"
+               "    fifo writes      = %d\n",
+               (n_bytes == 1) ? "u8" : "u16",
+               remaining_writes,
+               fifo_avail_space,
+               n);
+
+       if (n > 0) {
+               /* Fill SPI TXFIFO */
+               if (drv_data->rd_only) {
+                       tx += n * n_bytes;
+                       while (n--)
+                               writel(SPI_DUMMY_u16, regs + SPI_TXDATA);
+               } else {
+                       if (n_bytes == 1) {
+                               while (n--) {
+                                       d = *(u8*)tx;
+                                       writel(d, regs + SPI_TXDATA);
+                                       tx += 1;
+                               }
+                       } else {
+                               while (n--) {
+                                       d = *(u16*)tx;
+                                       writel(d, regs + SPI_TXDATA);
+                                       tx += 2;
+                               }
+                       }
+               }
+
+               /* Trigger transfer */
+               writel(readl(regs + SPI_CONTROL) | SPI_CONTROL_XCH,
+                       regs + SPI_CONTROL);
+
+               /* Update tx pointer */
+               drv_data->tx = tx;
+       }
+
+       return (tx >= tx_end);
+}
+
+static int read(struct driver_data *drv_data)
+{
+       void __iomem *regs = drv_data->regs;
+       void *rx = drv_data->rx;
+       void *rx_end = drv_data->rx_end;
+       u8 n_bytes = drv_data->n_bytes;
+       u32 remaining_reads;
+       u32 fifo_rxcnt;
+       u32 n;
+       u16 d;
+
+       /* Compute how many fifo reads to do */
+       remaining_reads = (u32)(rx_end - rx) / n_bytes;
+       fifo_rxcnt = (readl(regs + SPI_TEST) & SPI_TEST_RXCNT) >>
+                       SPI_TEST_RXCNT_LSB;
+       n = min(remaining_reads, fifo_rxcnt);
+
+       dev_dbg(&drv_data->pdev->dev,
+               "read type %s\n"
+               "    remaining reads = %d\n"
+               "    fifo rx count   = %d\n"
+               "    fifo reads      = %d\n",
+               (n_bytes == 1) ? "u8" : "u16",
+               remaining_reads,
+               fifo_rxcnt,
+               n);
+
+       if (n > 0) {
+               /* Read SPI RXFIFO */
+               if (n_bytes == 1) {
+                       while (n--) {
+                               d = readl(regs + SPI_RXDATA);
+                               *((u8*)rx) = d;
+                               rx += 1;
+                       }
+               } else {
+                       while (n--) {
+                               d = readl(regs + SPI_RXDATA);
+                               *((u16*)rx) = d;
+                               rx += 2;
+                       }
+               }
+
+               /* Update rx pointer */
+               drv_data->rx = rx;
+       }
+
+       return (rx >= rx_end);
+}
+
+static void *next_transfer(struct driver_data *drv_data)
+{
+       struct spi_message *msg = drv_data->cur_msg;
+       struct spi_transfer *trans = drv_data->cur_transfer;
+
+       /* Move to next transfer */
+       if (trans->transfer_list.next != &msg->transfers) {
+               drv_data->cur_transfer =
+                       list_entry(trans->transfer_list.next,
+                                       struct spi_transfer,
+                                       transfer_list);
+               return RUNNING_STATE;
+       }
+
+       return DONE_STATE;
+}
+
+static int map_dma_buffers(struct driver_data *drv_data)
+{
+       struct spi_message *msg;
+       struct device *dev;
+       void *buf;
+
+       drv_data->rx_dma_needs_unmap = 0;
+       drv_data->tx_dma_needs_unmap = 0;
+
+       if (!drv_data->master_info->enable_dma ||
+               !drv_data->cur_chip->enable_dma)
+                       return -1;
+
+       msg = drv_data->cur_msg;
+       dev = &msg->spi->dev;
+       if (msg->is_dma_mapped) {
+               if (drv_data->tx_dma)
+                       /* The caller provided at least dma and cpu virtual
+                          address for write; pump_transfers() will consider the
+                          transfer as write only if cpu rx virtual address is
+                          NULL */
+                       return 0;
+
+               if (drv_data->rx_dma) {
+                       /* The caller provided dma and cpu virtual address to
+                          performe read only transfer -->
+                          use drv_data->dummy_dma_buf for dummy writes to
+                          achive reads */
+                       buf = &drv_data->dummy_dma_buf;
+                       drv_data->tx_map_len = sizeof(drv_data->dummy_dma_buf);
+                       drv_data->tx_dma = dma_map_single(dev,
+                                                       buf,
+                                                       drv_data->tx_map_len,
+                                                       DMA_TO_DEVICE);
+                       if (dma_mapping_error(drv_data->tx_dma))
+                               return -1;
+
+                       drv_data->tx_dma_needs_unmap = 1;
+
+                       /* Flags transfer as rd_only for pump_transfers() DMA
+                          regs programming (should be redundant) */
+                       drv_data->tx = NULL;
+
+                       return 0;
+               }
+       }
+
+       if (!IS_DMA_ALIGNED(drv_data->rx) || !IS_DMA_ALIGNED(drv_data->tx))
+               return -1;
+
+       /* NULL rx means write-only transfer and no map needed
+          since rx DMA will not be used */
+       if (drv_data->rx) {
+               buf = drv_data->rx;
+               drv_data->rx_dma = dma_map_single(
+                                       dev,
+                                       buf,
+                                       drv_data->len,
+                                       DMA_FROM_DEVICE);
+               if (dma_mapping_error(drv_data->rx_dma))
+                       return -1;
+               drv_data->rx_dma_needs_unmap = 1;
+       }
+
+       if (drv_data->tx == NULL) {
+               /* Read only message --> use drv_data->dummy_dma_buf for dummy
+                  writes to achive reads */
+               buf = &drv_data->dummy_dma_buf;
+               drv_data->tx_map_len = sizeof(drv_data->dummy_dma_buf);
+       } else {
+               buf = drv_data->tx;
+               drv_data->tx_map_len = drv_data->len;
+       }
+       drv_data->tx_dma = dma_map_single(dev,
+                                       buf,
+                                       drv_data->tx_map_len,
+                                       DMA_TO_DEVICE);
+       if (dma_mapping_error(drv_data->tx_dma)) {
+               if (drv_data->rx_dma) {
+                       dma_unmap_single(dev,
+                                       drv_data->rx_dma,
+                                       drv_data->len,
+                                       DMA_FROM_DEVICE);
+                       drv_data->rx_dma_needs_unmap = 0;
+               }
+               return -1;
+       }
+       drv_data->tx_dma_needs_unmap = 1;
+
+       return 0;
+}
+
+static void unmap_dma_buffers(struct driver_data *drv_data)
+{
+       struct spi_message *msg = drv_data->cur_msg;
+       struct device *dev = &msg->spi->dev;
+
+       if (drv_data->rx_dma_needs_unmap) {
+               dma_unmap_single(dev,
+                               drv_data->rx_dma,
+                               drv_data->len,
+                               DMA_FROM_DEVICE);
+               drv_data->rx_dma_needs_unmap = 0;
+       }
+       if (drv_data->tx_dma_needs_unmap) {
+               dma_unmap_single(dev,
+                               drv_data->tx_dma,
+                               drv_data->tx_map_len,
+                               DMA_TO_DEVICE);
+               drv_data->tx_dma_needs_unmap = 0;
+       }
+}
+
+/* Caller already set message->status (dma is already blocked) */
+static void giveback(struct spi_message *message, struct driver_data *drv_data)
+{
+       void __iomem *regs = drv_data->regs;
+
+       /* Bring SPI to sleep; restore_state() and pump_transfer()
+          will do new setup */
+       writel(0, regs + SPI_INT_STATUS);
+       writel(0, regs + SPI_DMA);
+
+       drv_data->cs_control(SPI_CS_DEASSERT);
+
+       message->state = NULL;
+       if (message->complete)
+               message->complete(message->context);
+
+       drv_data->cur_msg = NULL;
+       drv_data->cur_transfer = NULL;
+       drv_data->cur_chip = NULL;
+       queue_work(drv_data->workqueue, &drv_data->work);
+}
+
+static void dma_err_handler(int channel, void *data, int errcode)
+{
+       struct driver_data *drv_data = data;
+       struct spi_message *msg = drv_data->cur_msg;
+
+       dev_dbg(&drv_data->pdev->dev, "dma_err_handler\n");
+
+       /* Disable both rx and tx dma channels */
+       imx_dma_disable(drv_data->rx_channel);
+       imx_dma_disable(drv_data->tx_channel);
+
+       if (flush(drv_data) == 0)
+               dev_err(&drv_data->pdev->dev,
+                               "dma_err_handler - flush failed\n");
+
+       unmap_dma_buffers(drv_data);
+
+       msg->state = ERROR_STATE;
+       tasklet_schedule(&drv_data->pump_transfers);
+}
+
+static void dma_tx_handler(int channel, void *data)
+{
+       struct driver_data *drv_data = data;
+
+       dev_dbg(&drv_data->pdev->dev, "dma_tx_handler\n");
+
+       imx_dma_disable(channel);
+
+       /* Now waits for TX FIFO empty */
+       writel(readl(drv_data->regs + SPI_INT_STATUS) | SPI_INTEN_TE,
+                       drv_data->regs + SPI_INT_STATUS);
+}
+
+static irqreturn_t dma_transfer(struct driver_data *drv_data)
+{
+       u32 status;
+       struct spi_message *msg = drv_data->cur_msg;
+       void __iomem *regs = drv_data->regs;
+       unsigned long limit;
+
+       status = readl(regs + SPI_INT_STATUS);
+
+       if ((status & SPI_INTEN_RO) && (status & SPI_STATUS_RO)) {
+               writel(status & ~SPI_INTEN, regs + SPI_INT_STATUS);
+
+               imx_dma_disable(drv_data->rx_channel);
+               unmap_dma_buffers(drv_data);
+
+               if (flush(drv_data) == 0)
+                       dev_err(&drv_data->pdev->dev,
+                               "dma_transfer - flush failed\n");
+
+               dev_warn(&drv_data->pdev->dev,
+                               "dma_transfer - fifo overun\n");
+
+               msg->state = ERROR_STATE;
+               tasklet_schedule(&drv_data->pump_transfers);
+
+               return IRQ_HANDLED;
+       }
+
+       if (status & SPI_STATUS_TE) {
+               writel(status & ~SPI_INTEN_TE, regs + SPI_INT_STATUS);
+
+               if (drv_data->rx) {
+                       /* Wait end of transfer before read trailing data */
+                       limit = loops_per_jiffy << 1;
+                       while ((readl(regs + SPI_CONTROL) & SPI_CONTROL_XCH) &&
+                                       limit--);
+
+                       if (limit == 0)
+                               dev_err(&drv_data->pdev->dev,
+                                       "dma_transfer - end of tx failed\n");
+                       else
+                               dev_dbg(&drv_data->pdev->dev,
+                                       "dma_transfer - end of tx\n");
+
+                       imx_dma_disable(drv_data->rx_channel);
+                       unmap_dma_buffers(drv_data);
+
+                       /* Calculate number of trailing data and read them */
+                       dev_dbg(&drv_data->pdev->dev,
+                               "dma_transfer - test = 0x%08X\n",
+                               readl(regs + SPI_TEST));
+                       drv_data->rx = drv_data->rx_end -
+                                       ((readl(regs + SPI_TEST) &
+                                       SPI_TEST_RXCNT) >>
+                                       SPI_TEST_RXCNT_LSB)*drv_data->n_bytes;
+                       read(drv_data);
+               } else {
+                       /* Write only transfer */
+                       unmap_dma_buffers(drv_data);
+
+                       if (flush(drv_data) == 0)
+                               dev_err(&drv_data->pdev->dev,
+                                       "dma_transfer - flush failed\n");
+               }
+
+               /* End of transfer, update total byte transfered */
+               msg->actual_length += drv_data->len;
+
+               /* Release chip select if requested, transfer delays are
+                  handled in pump_transfers() */
+               if (drv_data->cs_change)
+                       drv_data->cs_control(SPI_CS_DEASSERT);
+
+               /* Move to next transfer */
+               msg->state = next_transfer(drv_data);
+
+               /* Schedule transfer tasklet */
+               tasklet_schedule(&drv_data->pump_transfers);
+
+               return IRQ_HANDLED;
+       }
+
+       /* Opps problem detected */
+       return IRQ_NONE;
+}
+
+static irqreturn_t interrupt_wronly_transfer(struct driver_data *drv_data)
+{
+       struct spi_message *msg = drv_data->cur_msg;
+       void __iomem *regs = drv_data->regs;
+       u32 status;
+       irqreturn_t handled = IRQ_NONE;
+
+       status = readl(regs + SPI_INT_STATUS);
+
+       while (status & SPI_STATUS_TH) {
+               dev_dbg(&drv_data->pdev->dev,
+                       "interrupt_wronly_transfer - status = 0x%08X\n", status);
+
+               /* Pump data */
+               if (write(drv_data)) {
+                       writel(readl(regs + SPI_INT_STATUS) & ~SPI_INTEN,
+                               regs + SPI_INT_STATUS);
+
+                       dev_dbg(&drv_data->pdev->dev,
+                               "interrupt_wronly_transfer - end of tx\n");
+
+                       if (flush(drv_data) == 0)
+                               dev_err(&drv_data->pdev->dev,
+                                       "interrupt_wronly_transfer - "
+                                       "flush failed\n");
+
+                       /* End of transfer, update total byte transfered */
+                       msg->actual_length += drv_data->len;
+
+                       /* Release chip select if requested, transfer delays are
+                          handled in pump_transfers */
+                       if (drv_data->cs_change)
+                               drv_data->cs_control(SPI_CS_DEASSERT);
+
+                       /* Move to next transfer */
+                       msg->state = next_transfer(drv_data);
+
+                       /* Schedule transfer tasklet */
+                       tasklet_schedule(&drv_data->pump_transfers);
+
+                       return IRQ_HANDLED;
+               }
+
+               status = readl(regs + SPI_INT_STATUS);
+
+               /* We did something */
+               handled = IRQ_HANDLED;
+       }
+
+       return handled;
+}
+
+static irqreturn_t interrupt_transfer(struct driver_data *drv_data)
+{
+       struct spi_message *msg = drv_data->cur_msg;
+       void __iomem *regs = drv_data->regs;
+       u32 status;
+       irqreturn_t handled = IRQ_NONE;
+       unsigned long limit;
+
+       status = readl(regs + SPI_INT_STATUS);
+
+       while (status & (SPI_STATUS_TH | SPI_STATUS_RO)) {
+               dev_dbg(&drv_data->pdev->dev,
+                       "interrupt_transfer - status = 0x%08X\n", status);
+
+               if (status & SPI_STATUS_RO) {
+                       writel(readl(regs + SPI_INT_STATUS) & ~SPI_INTEN,
+                               regs + SPI_INT_STATUS);
+
+                       dev_warn(&drv_data->pdev->dev,
+                               "interrupt_transfer - fifo overun\n"
+                               "    data not yet written = %d\n"
+                               "    data not yet read    = %d\n",
+                               data_to_write(drv_data),
+                               data_to_read(drv_data));
+
+                       if (flush(drv_data) == 0)
+                               dev_err(&drv_data->pdev->dev,
+                                       "interrupt_transfer - flush failed\n");
+
+                       msg->state = ERROR_STATE;
+                       tasklet_schedule(&drv_data->pump_transfers);
+
+                       return IRQ_HANDLED;
+               }
+
+               /* Pump data */
+               read(drv_data);
+               if (write(drv_data)) {
+                       writel(readl(regs + SPI_INT_STATUS) & ~SPI_INTEN,
+                               regs + SPI_INT_STATUS);
+
+                       dev_dbg(&drv_data->pdev->dev,
+                               "interrupt_transfer - end of tx\n");
+
+                       /* Read trailing bytes */
+                       limit = loops_per_jiffy << 1;
+                       while ((read(drv_data) == 0) && limit--);
+
+                       if (limit == 0)
+                               dev_err(&drv_data->pdev->dev,
+                                       "interrupt_transfer - "
+                                       "trailing byte read failed\n");
+                       else
+                               dev_dbg(&drv_data->pdev->dev,
+                                       "interrupt_transfer - end of rx\n");
+
+                       /* End of transfer, update total byte transfered */
+                       msg->actual_length += drv_data->len;
+
+                       /* Release chip select if requested, transfer delays are
+                          handled in pump_transfers */
+                       if (drv_data->cs_change)
+                               drv_data->cs_control(SPI_CS_DEASSERT);
+
+                       /* Move to next transfer */
+                       msg->state = next_transfer(drv_data);
+
+                       /* Schedule transfer tasklet */
+                       tasklet_schedule(&drv_data->pump_transfers);
+
+                       return IRQ_HANDLED;
+               }
+
+               status = readl(regs + SPI_INT_STATUS);
+
+               /* We did something */
+               handled = IRQ_HANDLED;
+       }
+
+       return handled;
+}
+
+static irqreturn_t spi_int(int irq, void *dev_id)
+{
+       struct driver_data *drv_data = (struct driver_data *)dev_id;
+
+       if (!drv_data->cur_msg) {
+               dev_err(&drv_data->pdev->dev,
+                       "spi_int - bad message state\n");
+               /* Never fail */
+               return IRQ_HANDLED;
+       }
+
+       return drv_data->transfer_handler(drv_data);
+}
+
+static inline u32 spi_speed_hz(u32 data_rate)
+{
+       return imx_get_perclk2() / (4 << ((data_rate) >> 13));
+}
+
+static u32 spi_data_rate(u32 speed_hz)
+{
+       u32 div;
+       u32 quantized_hz = imx_get_perclk2() >> 2;
+
+       for (div = SPI_PERCLK2_DIV_MIN;
+               div <= SPI_PERCLK2_DIV_MAX;
+               div++, quantized_hz >>= 1) {
+                       if (quantized_hz <= speed_hz)
+                               /* Max available speed LEQ required speed */
+                               return div << 13;
+       }
+       return SPI_CONTROL_DATARATE_BAD;
+}
+
+static void pump_transfers(unsigned long data)
+{
+       struct driver_data *drv_data = (struct driver_data *)data;
+       struct spi_message *message;
+       struct spi_transfer *transfer, *previous;
+       struct chip_data *chip;
+       void __iomem *regs;
+       u32 tmp, control;
+
+       dev_dbg(&drv_data->pdev->dev, "pump_transfer\n");
+
+       message = drv_data->cur_msg;
+
+       /* Handle for abort */
+       if (message->state == ERROR_STATE) {
+               message->status = -EIO;
+               giveback(message, drv_data);
+               return;
+       }
+
+       /* Handle end of message */
+       if (message->state == DONE_STATE) {
+               message->status = 0;
+               giveback(message, drv_data);
+               return;
+       }
+
+       chip = drv_data->cur_chip;
+
+       /* Delay if requested at end of transfer*/
+       transfer = drv_data->cur_transfer;
+       if (message->state == RUNNING_STATE) {
+               previous = list_entry(transfer->transfer_list.prev,
+                                       struct spi_transfer,
+                                       transfer_list);
+               if (previous->delay_usecs)
+                       udelay(previous->delay_usecs);
+       } else {
+               /* START_STATE */
+               message->state = RUNNING_STATE;
+               drv_data->cs_control = chip->cs_control;
+       }
+
+       transfer = drv_data->cur_transfer;
+       drv_data->tx = (void *)transfer->tx_buf;
+       drv_data->tx_end = drv_data->tx + transfer->len;
+       drv_data->rx = transfer->rx_buf;
+       drv_data->rx_end = drv_data->rx + transfer->len;
+       drv_data->rx_dma = transfer->rx_dma;
+       drv_data->tx_dma = transfer->tx_dma;
+       drv_data->len = transfer->len;
+       drv_data->cs_change = transfer->cs_change;
+       drv_data->rd_only = (drv_data->tx == NULL);
+
+       regs = drv_data->regs;
+       control = readl(regs + SPI_CONTROL);
+
+       /* Bits per word setup */
+       tmp = transfer->bits_per_word;
+       if (tmp == 0) {
+               /* Use device setup */
+               tmp = chip->bits_per_word;
+               drv_data->n_bytes = chip->n_bytes;
+       } else
+               /* Use per-transfer setup */
+               drv_data->n_bytes = (tmp <= 8) ? 1 : 2;
+       u32_EDIT(control, SPI_CONTROL_BITCOUNT_MASK, tmp - 1);
+
+       /* Speed setup (surely valid because already checked) */
+       tmp = transfer->speed_hz;
+       if (tmp == 0)
+               tmp = chip->max_speed_hz;
+       tmp = spi_data_rate(tmp);
+       u32_EDIT(control, SPI_CONTROL_DATARATE, tmp);
+
+       writel(control, regs + SPI_CONTROL);
+
+       /* Assert device chip-select */
+       drv_data->cs_control(SPI_CS_ASSERT);
+
+       /* DMA cannot read/write SPI FIFOs other than 16 bits at a time; hence
+          if bits_per_word is less or equal 8 PIO transfers are performed.
+          Moreover DMA is convinient for transfer length bigger than FIFOs
+          byte size. */
+       if ((drv_data->n_bytes == 2) &&
+               (drv_data->len > SPI_FIFO_DEPTH*SPI_FIFO_BYTE_WIDTH) &&
+               (map_dma_buffers(drv_data) == 0)) {
+               dev_dbg(&drv_data->pdev->dev,
+                       "pump dma transfer\n"
+                       "    tx      = %p\n"
+                       "    tx_dma  = %08X\n"
+                       "    rx      = %p\n"
+                       "    rx_dma  = %08X\n"
+                       "    len     = %d\n",
+                       drv_data->tx,
+                       (unsigned int)drv_data->tx_dma,
+                       drv_data->rx,
+                       (unsigned int)drv_data->rx_dma,
+                       drv_data->len);
+
+               /* Ensure we have the correct interrupt handler */
+               drv_data->transfer_handler = dma_transfer;
+
+               /* Trigger transfer */
+               writel(readl(regs + SPI_CONTROL) | SPI_CONTROL_XCH,
+                       regs + SPI_CONTROL);
+
+               /* Setup tx DMA */
+               if (drv_data->tx)
+                       /* Linear source address */
+                       CCR(drv_data->tx_channel) =
+                               CCR_DMOD_FIFO |
+                               CCR_SMOD_LINEAR |
+                               CCR_SSIZ_32 | CCR_DSIZ_16 |
+                               CCR_REN;
+               else
+                       /* Read only transfer -> fixed source address for
+                          dummy write to achive read */
+                       CCR(drv_data->tx_channel) =
+                               CCR_DMOD_FIFO |
+                               CCR_SMOD_FIFO |
+                               CCR_SSIZ_32 | CCR_DSIZ_16 |
+                               CCR_REN;
+
+               imx_dma_setup_single(
+                       drv_data->tx_channel,
+                       drv_data->tx_dma,
+                       drv_data->len,
+                       drv_data->rd_data_phys + 4,
+                       DMA_MODE_WRITE);
+
+               if (drv_data->rx) {
+                       /* Setup rx DMA for linear destination address */
+                       CCR(drv_data->rx_channel) =
+                               CCR_DMOD_LINEAR |
+                               CCR_SMOD_FIFO |
+                               CCR_DSIZ_32 | CCR_SSIZ_16 |
+                               CCR_REN;
+                       imx_dma_setup_single(
+                               drv_data->rx_channel,
+                               drv_data->rx_dma,
+                               drv_data->len,
+                               drv_data->rd_data_phys,
+                               DMA_MODE_READ);
+                       imx_dma_enable(drv_data->rx_channel);
+
+                       /* Enable SPI interrupt */
+                       writel(SPI_INTEN_RO, regs + SPI_INT_STATUS);
+
+                       /* Set SPI to request DMA service on both
+                          Rx and Tx half fifo watermark */
+                       writel(SPI_DMA_RHDEN | SPI_DMA_THDEN, regs + SPI_DMA);
+               } else
+                       /* Write only access -> set SPI to request DMA
+                          service on Tx half fifo watermark */
+                       writel(SPI_DMA_THDEN, regs + SPI_DMA);
+
+               imx_dma_enable(drv_data->tx_channel);
+       } else {
+               dev_dbg(&drv_data->pdev->dev,
+                       "pump pio transfer\n"
+                       "    tx      = %p\n"
+                       "    rx      = %p\n"
+                       "    len     = %d\n",
+                       drv_data->tx,
+                       drv_data->rx,
+                       drv_data->len);
+
+               /* Ensure we have the correct interrupt handler */
+               if (drv_data->rx)
+                       drv_data->transfer_handler = interrupt_transfer;
+               else
+                       drv_data->transfer_handler = interrupt_wronly_transfer;
+
+               /* Enable SPI interrupt */
+               if (drv_data->rx)
+                       writel(SPI_INTEN_TH | SPI_INTEN_RO,
+                               regs + SPI_INT_STATUS);
+               else
+                       writel(SPI_INTEN_TH, regs + SPI_INT_STATUS);
+       }
+}
+
+static void pump_messages(struct work_struct *work)
+{
+       struct driver_data *drv_data =
+                               container_of(work, struct driver_data, work);
+       unsigned long flags;
+
+       /* Lock queue and check for queue work */
+       spin_lock_irqsave(&drv_data->lock, flags);
+       if (list_empty(&drv_data->queue) || drv_data->run == QUEUE_STOPPED) {
+               drv_data->busy = 0;
+               spin_unlock_irqrestore(&drv_data->lock, flags);
+               return;
+       }
+
+       /* Make sure we are not already running a message */
+       if (drv_data->cur_msg) {
+               spin_unlock_irqrestore(&drv_data->lock, flags);
+               return;
+       }
+
+       /* Extract head of queue */
+       drv_data->cur_msg = list_entry(drv_data->queue.next,
+                                       struct spi_message, queue);
+       list_del_init(&drv_data->cur_msg->queue);
+       drv_data->busy = 1;
+       spin_unlock_irqrestore(&drv_data->lock, flags);
+
+       /* Initial message state */
+       drv_data->cur_msg->state = START_STATE;
+       drv_data->cur_transfer = list_entry(drv_data->cur_msg->transfers.next,
+                                               struct spi_transfer,
+                                               transfer_list);
+
+       /* Setup the SPI using the per chip configuration */
+       drv_data->cur_chip = spi_get_ctldata(drv_data->cur_msg->spi);
+       restore_state(drv_data);
+
+       /* Mark as busy and launch transfers */
+       tasklet_schedule(&drv_data->pump_transfers);
+}
+
+static int transfer(struct spi_device *spi, struct spi_message *msg)
+{
+       struct driver_data *drv_data = spi_master_get_devdata(spi->master);
+       u32 min_speed_hz, max_speed_hz, tmp;
+       struct spi_transfer *trans;
+       unsigned long flags;
+
+       msg->actual_length = 0;
+
+       /* Per transfer setup check */
+       min_speed_hz = spi_speed_hz(SPI_CONTROL_DATARATE_MIN);
+       max_speed_hz = spi->max_speed_hz;
+       list_for_each_entry(trans, &msg->transfers, transfer_list) {
+               tmp = trans->bits_per_word;
+               if (tmp > 16) {
+                       dev_err(&drv_data->pdev->dev,
+                               "message rejected : "
+                               "invalid transfer bits_per_word (%d bits)\n",
+                               tmp);
+                       goto msg_rejected;
+               }
+               tmp = trans->speed_hz;
+               if (tmp) {
+                       if (tmp < min_speed_hz) {
+                               dev_err(&drv_data->pdev->dev,
+                                       "message rejected : "
+                                       "device min speed (%d Hz) exceeds "
+                                       "required transfer speed (%d Hz)\n",
+                                       min_speed_hz,
+                                       tmp);
+                               goto msg_rejected;
+                       } else if (tmp > max_speed_hz) {
+                               dev_err(&drv_data->pdev->dev,
+                                       "message rejected : "
+                                       "transfer speed (%d Hz) exceeds "
+                                       "device max speed (%d Hz)\n",
+                                       tmp,
+                                       max_speed_hz);
+                               goto msg_rejected;
+                       }
+               }
+       }
+
+       /* Message accepted */
+       msg->status = -EINPROGRESS;
+       msg->state = START_STATE;
+
+       spin_lock_irqsave(&drv_data->lock, flags);
+       if (drv_data->run == QUEUE_STOPPED) {
+               spin_unlock_irqrestore(&drv_data->lock, flags);
+               return -ESHUTDOWN;
+       }
+
+       list_add_tail(&msg->queue, &drv_data->queue);
+       if (drv_data->run == QUEUE_RUNNING && !drv_data->busy)
+               queue_work(drv_data->workqueue, &drv_data->work);
+
+       spin_unlock_irqrestore(&drv_data->lock, flags);
+       return 0;
+
+msg_rejected:
+       /* Message rejected and not queued */
+       msg->status = -EINVAL;
+       msg->state = ERROR_STATE;
+       if (msg->complete)
+               msg->complete(msg->context);
+       return -EINVAL;
+}
+
+/* On first setup bad values must free chip_data memory since will cause
+   spi_new_device to fail. Bad value setup from protocol driver are simply not
+   applied and notified to the calling driver. */
+static int setup(struct spi_device *spi)
+{
+       struct spi_imx_chip *chip_info;
+       struct chip_data *chip;
+       int first_setup = 0;
+       u32 tmp;
+       int status = 0;
+
+       /* Get controller data */
+       chip_info = spi->controller_data;
+
+       /* Get controller_state */
+       chip = spi_get_ctldata(spi);
+       if (chip == NULL) {
+               first_setup = 1;
+
+               chip = kzalloc(sizeof(struct chip_data), GFP_KERNEL);
+               if (!chip) {
+                       dev_err(&spi->dev,
+                               "setup - cannot allocate controller state");
+                       return -ENOMEM;
+               }
+               chip->control = SPI_DEFAULT_CONTROL;
+
+               if (chip_info == NULL) {
+                       /* spi_board_info.controller_data not is supplied */
+                       chip_info = kzalloc(sizeof(struct spi_imx_chip),
+                                               GFP_KERNEL);
+                       if (!chip_info) {
+                               dev_err(&spi->dev,
+                                       "setup - "
+                                       "cannot allocate controller data");
+                               status = -ENOMEM;
+                               goto err_first_setup;
+                       }
+                       /* Set controller data default value */
+                       chip_info->enable_loopback =
+                                               SPI_DEFAULT_ENABLE_LOOPBACK;
+                       chip_info->enable_dma = SPI_DEFAULT_ENABLE_DMA;
+                       chip_info->ins_ss_pulse = 1;
+                       chip_info->bclk_wait = SPI_DEFAULT_PERIOD_WAIT;
+                       chip_info->cs_control = null_cs_control;
+               }
+       }
+
+       /* Now set controller state based on controller data */
+
+       if (first_setup) {
+               /* SPI loopback */
+               if (chip_info->enable_loopback)
+                       chip->test = SPI_TEST_LBC;
+               else
+                       chip->test = 0;
+
+               /* SPI dma driven */
+               chip->enable_dma = chip_info->enable_dma;
+
+               /* SPI /SS pulse between spi burst */
+               if (chip_info->ins_ss_pulse)
+                       u32_EDIT(chip->control,
+                               SPI_CONTROL_SSCTL, SPI_CONTROL_SSCTL_1);
+               else
+                       u32_EDIT(chip->control,
+                               SPI_CONTROL_SSCTL, SPI_CONTROL_SSCTL_0);
+
+               /* SPI bclk waits between each bits_per_word spi burst */
+               if (chip_info->bclk_wait > SPI_PERIOD_MAX_WAIT) {
+                       dev_err(&spi->dev,
+                               "setup - "
+                               "bclk_wait exceeds max allowed (%d)\n",
+                               SPI_PERIOD_MAX_WAIT);
+                       goto err_first_setup;
+               }
+               chip->period = SPI_PERIOD_CSRC_BCLK |
+                               (chip_info->bclk_wait & SPI_PERIOD_WAIT);
+       }
+
+       /* SPI mode */
+       tmp = spi->mode;
+       if (tmp & SPI_LSB_FIRST) {
+               status = -EINVAL;
+               if (first_setup) {
+                       dev_err(&spi->dev,
+                               "setup - "
+                               "HW doesn't support LSB first transfer\n");
+                       goto err_first_setup;
+               } else {
+                       dev_err(&spi->dev,
+                               "setup - "
+                               "HW doesn't support LSB first transfer, "
+                               "default to MSB first\n");
+                       spi->mode &= ~SPI_LSB_FIRST;
+               }
+       }
+       if (tmp & SPI_CS_HIGH) {
+               u32_EDIT(chip->control,
+                               SPI_CONTROL_SSPOL, SPI_CONTROL_SSPOL_ACT_HIGH);
+       }
+       switch (tmp & SPI_MODE_3) {
+       case SPI_MODE_0:
+               tmp = 0;
+               break;
+       case SPI_MODE_1:
+               tmp = SPI_CONTROL_PHA_1;
+               break;
+       case SPI_MODE_2:
+               tmp = SPI_CONTROL_POL_ACT_LOW;
+               break;
+       default:
+               /* SPI_MODE_3 */
+               tmp = SPI_CONTROL_PHA_1 | SPI_CONTROL_POL_ACT_LOW;
+               break;
+       }
+       u32_EDIT(chip->control, SPI_CONTROL_POL | SPI_CONTROL_PHA, tmp);
+
+       /* SPI word width */
+       tmp = spi->bits_per_word;
+       if (tmp == 0) {
+               tmp = 8;
+               spi->bits_per_word = 8;
+       } else if (tmp > 16) {
+               status = -EINVAL;
+               dev_err(&spi->dev,
+                       "setup - "
+                       "invalid bits_per_word (%d)\n",
+                       tmp);
+               if (first_setup)
+                       goto err_first_setup;
+               else {
+                       /* Undo setup using chip as backup copy */
+                       tmp = chip->bits_per_word;
+                       spi->bits_per_word = tmp;
+               }
+       }
+       chip->bits_per_word = tmp;
+       u32_EDIT(chip->control, SPI_CONTROL_BITCOUNT_MASK, tmp - 1);
+       chip->n_bytes = (tmp <= 8) ? 1 : 2;
+
+       /* SPI datarate */
+       tmp = spi_data_rate(spi->max_speed_hz);
+       if (tmp == SPI_CONTROL_DATARATE_BAD) {
+               status = -EINVAL;
+               dev_err(&spi->dev,
+                       "setup - "
+                       "HW min speed (%d Hz) exceeds required "
+                       "max speed (%d Hz)\n",
+                       spi_speed_hz(SPI_CONTROL_DATARATE_MIN),
+                       spi->max_speed_hz);
+               if (first_setup)
+                       goto err_first_setup;
+               else
+                       /* Undo setup using chip as backup copy */
+                       spi->max_speed_hz = chip->max_speed_hz;
+       } else {
+               u32_EDIT(chip->control, SPI_CONTROL_DATARATE, tmp);
+               /* Actual rounded max_speed_hz */
+               tmp = spi_speed_hz(tmp);
+               spi->max_speed_hz = tmp;
+               chip->max_speed_hz = tmp;
+       }
+
+       /* SPI chip-select management */
+       if (chip_info->cs_control)
+               chip->cs_control = chip_info->cs_control;
+       else
+               chip->cs_control = null_cs_control;
+
+       /* Save controller_state */
+       spi_set_ctldata(spi, chip);
+
+       /* Summary */
+       dev_dbg(&spi->dev,
+               "setup succeded\n"
+               "    loopback enable   = %s\n"
+               "    dma enable        = %s\n"
+               "    insert /ss pulse  = %s\n"
+               "    period wait       = %d\n"
+               "    mode              = %d\n"
+               "    bits per word     = %d\n"
+               "    min speed         = %d Hz\n"
+               "    rounded max speed = %d Hz\n",
+               chip->test & SPI_TEST_LBC ? "Yes" : "No",
+               chip->enable_dma ? "Yes" : "No",
+               chip->control & SPI_CONTROL_SSCTL ? "Yes" : "No",
+               chip->period & SPI_PERIOD_WAIT,
+               spi->mode,
+               spi->bits_per_word,
+               spi_speed_hz(SPI_CONTROL_DATARATE_MIN),
+               spi->max_speed_hz);
+
+err_first_setup:
+       kfree(chip);
+       return status;
+}
+
+static void cleanup(const struct spi_device *spi)
+{
+       struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi);
+       kfree(chip);
+}
+
+static int init_queue(struct driver_data *drv_data)
+{
+       INIT_LIST_HEAD(&drv_data->queue);
+       spin_lock_init(&drv_data->lock);
+
+       drv_data->run = QUEUE_STOPPED;
+       drv_data->busy = 0;
+
+       tasklet_init(&drv_data->pump_transfers,
+                       pump_transfers, (unsigned long)drv_data);
+
+       INIT_WORK(&drv_data->work, pump_messages);
+       drv_data->workqueue = create_singlethread_workqueue(
+                                       drv_data->master->cdev.dev->bus_id);
+       if (drv_data->workqueue == NULL)
+               return -EBUSY;
+
+       return 0;
+}
+
+static int start_queue(struct driver_data *drv_data)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&drv_data->lock, flags);
+
+       if (drv_data->run == QUEUE_RUNNING || drv_data->busy) {
+               spin_unlock_irqrestore(&drv_data->lock, flags);
+               return -EBUSY;
+       }
+
+       drv_data->run = QUEUE_RUNNING;
+       drv_data->cur_msg = NULL;
+       drv_data->cur_transfer = NULL;
+       drv_data->cur_chip = NULL;
+       spin_unlock_irqrestore(&drv_data->lock, flags);
+
+       queue_work(drv_data->workqueue, &drv_data->work);
+
+       return 0;
+}
+
+static int stop_queue(struct driver_data *drv_data)
+{
+       unsigned long flags;
+       unsigned limit = 500;
+       int status = 0;
+
+       spin_lock_irqsave(&drv_data->lock, flags);
+
+       /* This is a bit lame, but is optimized for the common execution path.
+        * A wait_queue on the drv_data->busy could be used, but then the common
+        * execution path (pump_messages) would be required to call wake_up or
+        * friends on every SPI message. Do this instead */
+       drv_data->run = QUEUE_STOPPED;
+       while (!list_empty(&drv_data->queue) && drv_data->busy && limit--) {
+               spin_unlock_irqrestore(&drv_data->lock, flags);
+               msleep(10);
+               spin_lock_irqsave(&drv_data->lock, flags);
+       }
+
+       if (!list_empty(&drv_data->queue) || drv_data->busy)
+               status = -EBUSY;
+
+       spin_unlock_irqrestore(&drv_data->lock, flags);
+
+       return status;
+}
+
+static int destroy_queue(struct driver_data *drv_data)
+{
+       int status;
+
+       status = stop_queue(drv_data);
+       if (status != 0)
+               return status;
+
+       if (drv_data->workqueue)
+               destroy_workqueue(drv_data->workqueue);
+
+       return 0;
+}
+
+static int spi_imx_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct spi_imx_master *platform_info;
+       struct spi_master *master;
+       struct driver_data *drv_data = NULL;
+       struct resource *res;
+       int irq, status = 0;
+
+       platform_info = dev->platform_data;
+       if (platform_info == NULL) {
+               dev_err(&pdev->dev, "probe - no platform data supplied\n");
+               status = -ENODEV;
+               goto err_no_pdata;
+       }
+
+       /* Allocate master with space for drv_data */
+       master = spi_alloc_master(dev, sizeof(struct driver_data));
+       if (!master) {
+               dev_err(&pdev->dev, "probe - cannot alloc spi_master\n");
+               status = -ENOMEM;
+               goto err_no_mem;
+       }
+       drv_data = spi_master_get_devdata(master);
+       drv_data->master = master;
+       drv_data->master_info = platform_info;
+       drv_data->pdev = pdev;
+
+       master->bus_num = pdev->id;
+       master->num_chipselect = platform_info->num_chipselect;
+       master->cleanup = cleanup;
+       master->setup = setup;
+       master->transfer = transfer;
+
+       drv_data->dummy_dma_buf = SPI_DUMMY_u32;
+
+       /* Find and map resources */
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               dev_err(&pdev->dev, "probe - MEM resources not defined\n");
+               status = -ENODEV;
+               goto err_no_iores;
+       }
+       drv_data->ioarea = request_mem_region(res->start,
+                                               res->end - res->start + 1,
+                                               pdev->name);
+       if (drv_data->ioarea == NULL) {
+               dev_err(&pdev->dev, "probe - cannot reserve region\n");
+               status = -ENXIO;
+               goto err_no_iores;
+       }
+       drv_data->regs = ioremap(res->start, res->end - res->start + 1);
+       if (drv_data->regs == NULL) {
+               dev_err(&pdev->dev, "probe - cannot map IO\n");
+               status = -ENXIO;
+               goto err_no_iomap;
+       }
+       drv_data->rd_data_phys = (dma_addr_t)res->start;
+
+       /* Attach to IRQ */
+       irq = platform_get_irq(pdev, 0);
+       if (irq < 0) {
+               dev_err(&pdev->dev, "probe - IRQ resource not defined\n");
+               status = -ENODEV;
+               goto err_no_irqres;
+       }
+       status = request_irq(irq, spi_int, IRQF_DISABLED, dev->bus_id, drv_data);
+       if (status < 0) {
+               dev_err(&pdev->dev, "probe - cannot get IRQ (%d)\n", status);
+               goto err_no_irqres;
+       }
+
+       /* Setup DMA if requested */
+       drv_data->tx_channel = -1;
+       drv_data->rx_channel = -1;
+       if (platform_info->enable_dma) {
+               /* Get rx DMA channel */
+               status = imx_dma_request_by_prio(&drv_data->rx_channel,
+                       "spi_imx_rx", DMA_PRIO_HIGH);
+               if (status < 0) {
+                       dev_err(dev,
+                               "probe - problem (%d) requesting rx channel\n",
+                               status);
+                       goto err_no_rxdma;
+               } else
+                       imx_dma_setup_handlers(drv_data->rx_channel, NULL,
+                                               dma_err_handler, drv_data);
+
+               /* Get tx DMA channel */
+               status = imx_dma_request_by_prio(&drv_data->tx_channel,
+                                               "spi_imx_tx", DMA_PRIO_MEDIUM);
+               if (status < 0) {
+                       dev_err(dev,
+                               "probe - problem (%d) requesting tx channel\n",
+                               status);
+                       imx_dma_free(drv_data->rx_channel);
+                       goto err_no_txdma;
+               } else
+                       imx_dma_setup_handlers(drv_data->tx_channel,
+                                               dma_tx_handler, dma_err_handler,
+                                               drv_data);
+
+               /* Set request source and burst length for allocated channels */
+               switch (drv_data->pdev->id) {
+               case 1:
+                       /* Using SPI1 */
+                       RSSR(drv_data->rx_channel) = DMA_REQ_SPI1_R;
+                       RSSR(drv_data->tx_channel) = DMA_REQ_SPI1_T;
+                       break;
+               case 2:
+                       /* Using SPI2 */
+                       RSSR(drv_data->rx_channel) = DMA_REQ_SPI2_R;
+                       RSSR(drv_data->tx_channel) = DMA_REQ_SPI2_T;
+                       break;
+               default:
+                       dev_err(dev, "probe - bad SPI Id\n");
+                       imx_dma_free(drv_data->rx_channel);
+                       imx_dma_free(drv_data->tx_channel);
+                       status = -ENODEV;
+                       goto err_no_devid;
+               }
+               BLR(drv_data->rx_channel) = SPI_DMA_BLR;
+               BLR(drv_data->tx_channel) = SPI_DMA_BLR;
+       }
+
+       /* Load default SPI configuration */
+       writel(SPI_RESET_START, drv_data->regs + SPI_RESET);
+       writel(0, drv_data->regs + SPI_RESET);
+       writel(SPI_DEFAULT_CONTROL, drv_data->regs + SPI_CONTROL);
+
+       /* Initial and start queue */
+       status = init_queue(drv_data);
+       if (status != 0) {
+               dev_err(&pdev->dev, "probe - problem initializing queue\n");
+               goto err_init_queue;
+       }
+       status = start_queue(drv_data);
+       if (status != 0) {
+               dev_err(&pdev->dev, "probe - problem starting queue\n");
+               goto err_start_queue;
+       }
+
+       /* Register with the SPI framework */
+       platform_set_drvdata(pdev, drv_data);
+       status = spi_register_master(master);
+       if (status != 0) {
+               dev_err(&pdev->dev, "probe - problem registering spi master\n");
+               goto err_spi_register;
+       }
+
+       dev_dbg(dev, "probe succeded\n");
+       return 0;
+
+err_init_queue:
+err_start_queue:
+err_spi_register:
+       destroy_queue(drv_data);
+
+err_no_rxdma:
+err_no_txdma:
+err_no_devid:
+       free_irq(irq, drv_data);
+
+err_no_irqres:
+       iounmap(drv_data->regs);
+
+err_no_iomap:
+       release_resource(drv_data->ioarea);
+       kfree(drv_data->ioarea);
+
+err_no_iores:
+       spi_master_put(master);
+
+err_no_pdata:
+err_no_mem:
+       return status;
+}
+
+static int __devexit spi_imx_remove(struct platform_device *pdev)
+{
+       struct driver_data *drv_data = platform_get_drvdata(pdev);
+       int irq;
+       int status = 0;
+
+       if (!drv_data)
+               return 0;
+
+       tasklet_kill(&drv_data->pump_transfers);
+
+       /* Remove the queue */
+       status = destroy_queue(drv_data);
+       if (status != 0) {
+               dev_err(&pdev->dev, "queue remove failed (%d)\n", status);
+               return status;
+       }
+
+       /* Reset SPI */
+       writel(SPI_RESET_START, drv_data->regs + SPI_RESET);
+       writel(0, drv_data->regs + SPI_RESET);
+
+       /* Release DMA */
+       if (drv_data->master_info->enable_dma) {
+               RSSR(drv_data->rx_channel) = 0;
+               RSSR(drv_data->tx_channel) = 0;
+               imx_dma_free(drv_data->tx_channel);
+               imx_dma_free(drv_data->rx_channel);
+       }
+
+       /* Release IRQ */
+       irq = platform_get_irq(pdev, 0);
+       if (irq >= 0)
+               free_irq(irq, drv_data);
+
+       /* Release map resources */
+       iounmap(drv_data->regs);
+       release_resource(drv_data->ioarea);
+       kfree(drv_data->ioarea);
+
+       /* Disconnect from the SPI framework */
+       spi_unregister_master(drv_data->master);
+       spi_master_put(drv_data->master);
+
+       /* Prevent double remove */
+       platform_set_drvdata(pdev, NULL);
+
+       dev_dbg(&pdev->dev, "remove succeded\n");
+
+       return 0;
+}
+
+static void spi_imx_shutdown(struct platform_device *pdev)
+{
+       struct driver_data *drv_data = platform_get_drvdata(pdev);
+
+       /* Reset SPI */
+       writel(SPI_RESET_START, drv_data->regs + SPI_RESET);
+       writel(0, drv_data->regs + SPI_RESET);
+
+       dev_dbg(&pdev->dev, "shutdown succeded\n");
+}
+
+#ifdef CONFIG_PM
+static int suspend_devices(struct device *dev, void *pm_message)
+{
+       pm_message_t *state = pm_message;
+
+       if (dev->power.power_state.event != state->event) {
+               dev_warn(dev, "pm state does not match request\n");
+               return -1;
+       }
+
+       return 0;
+}
+
+static int spi_imx_suspend(struct platform_device *pdev, pm_message_t state)
+{
+       struct driver_data *drv_data = platform_get_drvdata(pdev);
+       int status = 0;
+
+       status = stop_queue(drv_data);
+       if (status != 0) {
+               dev_warn(&pdev->dev, "suspend cannot stop queue\n");
+               return status;
+       }
+
+       dev_dbg(&pdev->dev, "suspended\n");
+
+       return 0;
+}
+
+static int spi_imx_resume(struct platform_device *pdev)
+{
+       struct driver_data *drv_data = platform_get_drvdata(pdev);
+       int status = 0;
+
+       /* Start the queue running */
+       status = start_queue(drv_data);
+       if (status != 0)
+               dev_err(&pdev->dev, "problem starting queue (%d)\n", status);
+       else
+               dev_dbg(&pdev->dev, "resumed\n");
+
+       return status;
+}
+#else
+#define spi_imx_suspend NULL
+#define spi_imx_resume NULL
+#endif /* CONFIG_PM */
+
+static struct platform_driver driver = {
+       .driver = {
+               .name = "imx-spi",
+               .bus = &platform_bus_type,
+               .owner = THIS_MODULE,
+       },
+       .probe = spi_imx_probe,
+       .remove = __devexit_p(spi_imx_remove),
+       .shutdown = spi_imx_shutdown,
+       .suspend = spi_imx_suspend,
+       .resume = spi_imx_resume,
+};
+
+static int __init spi_imx_init(void)
+{
+       return platform_driver_register(&driver);
+}
+module_init(spi_imx_init);
+
+static void __exit spi_imx_exit(void)
+{
+       platform_driver_unregister(&driver);
+}
+module_exit(spi_imx_exit);
+
+MODULE_AUTHOR("Andrea Paterniani, <a.paterniani@swapp-eng.it>");
+MODULE_DESCRIPTION("iMX SPI Contoller Driver");
+MODULE_LICENSE("GPL");
index 757dec9c7ee9fc89b11d05dd7253ea3993c70eb8..a90c255f079d40477ff56a287353af51117117c0 100644 (file)
@@ -10,7 +10,6 @@
 
 
 #include <linux/errno.h>
-#include <linux/sched.h>
 #include <linux/tty.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
index fc3197273663e93c48f975cded7c748727ad0370..3d72aa5cfc713bb3b66dbe3c6b49ee8ceb25d0df 100644 (file)
@@ -626,10 +626,8 @@ static void do_softint(unsigned long private_)
        if (!tty)
                return;
 
-       if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) {
+       if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event))
                tty_wakeup(tty);
-               wake_up_interruptible(&tty->write_wait);
-       }
 }
 
 static int zs_startup(struct dec_serial * info)
index df4cc1fb5f68df840bfe9382a151862598046343..71cb64e41a1bb6721e47c63de681af7baa0655cf 100644 (file)
@@ -648,9 +648,9 @@ static inline BYTE SLIC_GetState(IXJ *j)
        return j->pld_slicr.bits.state;
 }
 
-static BOOL SLIC_SetState(BYTE byState, IXJ *j)
+static bool SLIC_SetState(BYTE byState, IXJ *j)
 {
-       BOOL fRetVal = FALSE;
+       bool fRetVal = false;
 
        if (j->cardtype == QTI_PHONECARD) {
                if (j->flags.pcmciasct) {
@@ -659,14 +659,14 @@ static BOOL SLIC_SetState(BYTE byState, IXJ *j)
                        case PLD_SLIC_STATE_OC:
                                j->pslic.bits.powerdown = 1;
                                j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
-                               fRetVal = TRUE;
+                               fRetVal = true;
                                break;
                        case PLD_SLIC_STATE_RINGING:
                                if (j->readers || j->writers) {
                                        j->pslic.bits.powerdown = 0;
                                        j->pslic.bits.ring0 = 1;
                                        j->pslic.bits.ring1 = 0;
-                                       fRetVal = TRUE;
+                                       fRetVal = true;
                                }
                                break;
                        case PLD_SLIC_STATE_OHT:        /* On-hook transmit */
@@ -679,14 +679,14 @@ static BOOL SLIC_SetState(BYTE byState, IXJ *j)
                                        j->pslic.bits.powerdown = 1;
                                }
                                j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
-                               fRetVal = TRUE;
+                               fRetVal = true;
                                break;
                        case PLD_SLIC_STATE_APR:        /* Active polarity reversal */
 
                        case PLD_SLIC_STATE_OHTPR:      /* OHT polarity reversal */
 
                        default:
-                               fRetVal = FALSE;
+                               fRetVal = false;
                                break;
                        }
                        j->psccr.bits.dev = 3;
@@ -703,7 +703,7 @@ static BOOL SLIC_SetState(BYTE byState, IXJ *j)
                        j->pld_slicw.bits.c3 = 0;
                        j->pld_slicw.bits.b2en = 0;
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-                       fRetVal = TRUE;
+                       fRetVal = true;
                        break;
                case PLD_SLIC_STATE_RINGING:
                        j->pld_slicw.bits.c1 = 1;
@@ -711,7 +711,7 @@ static BOOL SLIC_SetState(BYTE byState, IXJ *j)
                        j->pld_slicw.bits.c3 = 0;
                        j->pld_slicw.bits.b2en = 1;
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-                       fRetVal = TRUE;
+                       fRetVal = true;
                        break;
                case PLD_SLIC_STATE_ACTIVE:
                        j->pld_slicw.bits.c1 = 0;
@@ -719,7 +719,7 @@ static BOOL SLIC_SetState(BYTE byState, IXJ *j)
                        j->pld_slicw.bits.c3 = 0;
                        j->pld_slicw.bits.b2en = 0;
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-                       fRetVal = TRUE;
+                       fRetVal = true;
                        break;
                case PLD_SLIC_STATE_OHT:        /* On-hook transmit */
 
@@ -728,7 +728,7 @@ static BOOL SLIC_SetState(BYTE byState, IXJ *j)
                        j->pld_slicw.bits.c3 = 0;
                        j->pld_slicw.bits.b2en = 0;
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-                       fRetVal = TRUE;
+                       fRetVal = true;
                        break;
                case PLD_SLIC_STATE_TIPOPEN:
                        j->pld_slicw.bits.c1 = 0;
@@ -736,7 +736,7 @@ static BOOL SLIC_SetState(BYTE byState, IXJ *j)
                        j->pld_slicw.bits.c3 = 1;
                        j->pld_slicw.bits.b2en = 0;
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-                       fRetVal = TRUE;
+                       fRetVal = true;
                        break;
                case PLD_SLIC_STATE_STANDBY:
                        j->pld_slicw.bits.c1 = 1;
@@ -744,7 +744,7 @@ static BOOL SLIC_SetState(BYTE byState, IXJ *j)
                        j->pld_slicw.bits.c3 = 1;
                        j->pld_slicw.bits.b2en = 1;
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-                       fRetVal = TRUE;
+                       fRetVal = true;
                        break;
                case PLD_SLIC_STATE_APR:        /* Active polarity reversal */
 
@@ -753,7 +753,7 @@ static BOOL SLIC_SetState(BYTE byState, IXJ *j)
                        j->pld_slicw.bits.c3 = 1;
                        j->pld_slicw.bits.b2en = 0;
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-                       fRetVal = TRUE;
+                       fRetVal = true;
                        break;
                case PLD_SLIC_STATE_OHTPR:      /* OHT polarity reversal */
 
@@ -762,10 +762,10 @@ static BOOL SLIC_SetState(BYTE byState, IXJ *j)
                        j->pld_slicw.bits.c3 = 1;
                        j->pld_slicw.bits.b2en = 0;
                        outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
-                       fRetVal = TRUE;
+                       fRetVal = true;
                        break;
                default:
-                       fRetVal = FALSE;
+                       fRetVal = false;
                        break;
                }
        }
@@ -4969,7 +4969,8 @@ static int ixj_daa_cid_read(IXJ *j)
 {
        int i;
        BYTES bytes;
-       char CID[ALISDAA_CALLERID_SIZE], mContinue;
+       char CID[ALISDAA_CALLERID_SIZE];
+       bool mContinue;
        char *pIn, *pOut;
 
        if (!SCI_Prepare(j))
@@ -5013,7 +5014,7 @@ static int ixj_daa_cid_read(IXJ *j)
 
        pIn = CID;
        pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
-       mContinue = 1;
+       mContinue = true;
        while (mContinue) {
                if ((pIn[1] & 0x03) == 0x01) {
                        pOut[0] = pIn[0];
@@ -5027,7 +5028,7 @@ static int ixj_daa_cid_read(IXJ *j)
                if ((pIn[4] & 0xc0) == 0x40) {
                        pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
                } else {
-                       mContinue = FALSE;
+                       mContinue = false;
                }
                pIn += 5, pOut += 4;
        }
@@ -6662,7 +6663,7 @@ static int ixj_fasync(int fd, struct file *file_p, int mode)
        return fasync_helper(fd, file_p, mode, &j->async_queue);
 }
 
-static struct file_operations ixj_fops =
+static const struct file_operations ixj_fops =
 {
         .owner          = THIS_MODULE,
         .read           = ixj_enhanced_read,
@@ -7498,7 +7499,7 @@ static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
        return ((inb(wEEPROMAddress) >> 3) & 1);
 }
 
-static BOOL PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
+static bool PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
 {
        BYTE lastLCC;
        WORD wEEPROMAddress = wAddress + 3;
index 8d69bcdc29c95dda937a53652445140f008eba0d..4c32a43b791473eb7a7cda625f5ff3bcffb95668 100644 (file)
 typedef __u16 WORD;
 typedef __u32 DWORD;
 typedef __u8 BYTE;
-typedef __u8 BOOL;
 
 #ifndef IXJMAX
 #define IXJMAX 16
 #endif
 
-#define TRUE 1
-#define FALSE 0
-
 /******************************************************************************
 *
 *  This structure when unioned with the structures below makes simple byte
index 164a5dcf1f1e69a31d01a28348ab393e30100d1d..3e658dc7c2d8fba9710ae34bc0b251750f640674 100644 (file)
@@ -3,7 +3,6 @@
 #include <linux/module.h>
 
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/kernel.h>      /* printk() */
 #include <linux/fs.h>          /* everything... */
 #include <linux/errno.h>       /* error codes */
index e41f49afd0f4792dfe8e3b0290b398590a90d886..4d8c2a5b3297fdb2447f764ac8f5974277d936fd 100644 (file)
@@ -127,7 +127,7 @@ void phone_unregister_device(struct phone_device *pfd)
 }
 
 
-static struct file_operations phone_fops =
+static const struct file_operations phone_fops =
 {
        .owner          = THIS_MODULE,
        .open           = phone_open,
index f39050145f1f9be9f5b47cfa6760eb25fc202c13..36b36e0175fc2bc50b3e75f6bb149d421e95de37 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/platform_device.h>
 #include <linux/delay.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/smp_lock.h>
 #include <linux/errno.h>
index 3c2bc075ef4f31260ddadaa659e7ea840b2e0d1c..7d7909cf25583802d2e5a390507fc2d06fb71b24 100644 (file)
@@ -40,7 +40,6 @@
 #include <linux/kernel.h>
 #include <linux/delay.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/smp_lock.h>
 #include <linux/errno.h>
index 22e3c9443641a8b83e88a92c32ce43c62f3a58b5..04e6b8508fb63f094705dc59ce65e595c0527ba6 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/kernel.h>
 #include <linux/delay.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/smp_lock.h>
 #include <linux/errno.h>
index f04a29a46646c8a38c13432674c62dea1c92b977..c6b6479fa4ddee3ec893288f85d7b66b38d27359 100644 (file)
@@ -1953,7 +1953,7 @@ static void invalidate_sub(struct lun *curlun)
        struct inode    *inode = filp->f_path.dentry->d_inode;
        unsigned long   rc;
 
-       rc = invalidate_inode_pages(inode->i_mapping);
+       rc = invalidate_mapping_pages(inode->i_mapping, 0, -1);
        VLDBG(curlun, "invalidate_inode_pages -> %ld\n", rc);
 }
 
index e873cf4882462fe7aed7e50571cad7fe561e0414..7b3a326b57ab55e7099675857f91a2aeb409be74 100644 (file)
@@ -29,7 +29,6 @@
 #include <linux/pci.h>
 #include <linux/delay.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/smp_lock.h>
 #include <linux/errno.h>
index 7617ff7bd5ac916397822f2f7d007c57bb58cffe..49d737725f7068df54cc8b4022aa3a06c650708d 100644 (file)
@@ -53,7 +53,6 @@
 #include <linux/kernel.h>
 #include <linux/delay.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/smp_lock.h>
 #include <linux/errno.h>
index 140104341db473ba0c513e785202e86bb561d2fb..8f9a2b615422602a25178c03294bad5479796a46 100644 (file)
@@ -28,7 +28,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/delay.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/timer.h>
index 0d225369847d06258c383eb34125abfd14dc3f17..27904a56494ba6c614e1e44fef49d01e559d431f 100644 (file)
@@ -33,7 +33,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/delay.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/timer.h>
@@ -2614,7 +2613,7 @@ lubbock_fail0:
 #endif
        if (vbus_irq) {
                retval = request_irq(vbus_irq, udc_vbus_irq,
-                               SA_INTERRUPT | SA_SAMPLE_RANDOM,
+                               IRQF_DISABLED | IRQF_SAMPLE_RANDOM,
                                driver_name, dev);
                if (retval != 0) {
                        printk(KERN_ERR "%s: can't get irq %i, err %d\n",
index 408c3380d60203254b510c43a728da6214a42c7c..6ec8cf1a3ccb1cd14d39667231da28b36abdecdf 100644 (file)
@@ -1419,7 +1419,6 @@ int __devinit rndis_init (void)
                        return -EIO;
                }
 
-               rndis_connect_state [i]->nlink = 1;
                rndis_connect_state [i]->write_proc = rndis_proc_write;
                rndis_connect_state [i]->read_proc = rndis_proc_read;
                rndis_connect_state [i]->data = (void *)
index 6c742a90922580e37f69ba6bee59017ab3fb93d8..e6c19aa4bef3320be4d2d52d7070cac4da68e6d2 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/kernel.h>
 #include <linux/delay.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/smp_lock.h>
 #include <linux/errno.h>
index ebe04e0d2879de0c8b09a873d27aa20743e4a181..8c85e33f74a4b2f5c4cbba4aa7a0ea9630408635 100644 (file)
@@ -66,7 +66,6 @@
 #include <linux/kernel.h>
 #include <linux/delay.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/smp_lock.h>
 #include <linux/errno.h>
index 282d82efc0b0a0e8280884ad7a041e3561b7bf80..32f7caf24747cb7d18a05ed1be4976d5549d5378 100644 (file)
@@ -7,7 +7,6 @@
 #include <linux/kernel.h>
 #include <linux/delay.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/errno.h>
 #include <linux/unistd.h>
@@ -2163,9 +2162,8 @@ static void etrax_usb_add_to_bulk_sb_list(struct urb *urb, int epid)
 
        maxlen = usb_maxpacket(urb->dev, urb->pipe, usb_pipeout(urb->pipe));
 
-       sb_desc = (USB_SB_Desc_t*)kmem_cache_alloc(usb_desc_cache, SLAB_FLAG);
+       sb_desc = kmem_cache_zalloc(usb_desc_cache, SLAB_FLAG);
        assert(sb_desc != NULL);
-       memset(sb_desc, 0, sizeof(USB_SB_Desc_t));
 
 
        if (usb_pipeout(urb->pipe)) {
index 44c60fba76e166b68a5be67a9b47f6fc7fd5d526..a68ce9d3c525b66df1bf53f5ac477e1395f4ea33 100644 (file)
@@ -78,7 +78,7 @@ static int usb_hcd_ep93xx_probe(const struct hc_driver *driver,
 
        ohci_hcd_init(hcd_to_ohci(hcd));
 
-       retval = usb_add_hcd(hcd, pdev->resource[1].start, SA_INTERRUPT);
+       retval = usb_add_hcd(hcd, pdev->resource[1].start, IRQF_DISABLED);
        if (retval == 0)
                return retval;
 
index 893b172384da65f223dba59ecd46ed8484e08fbb..d601bbb9387bb5205d6c29aed3208a405c186bfc 100644 (file)
@@ -421,7 +421,7 @@ static int __devinit usb_hcd_pnx4008_probe(struct platform_device *pdev)
        ohci_hcd_init(ohci);
 
        dev_info(&pdev->dev, "at 0x%p, irq %d\n", hcd->regs, hcd->irq);
-       ret = usb_add_hcd(hcd, irq, SA_INTERRUPT);
+       ret = usb_add_hcd(hcd, irq, IRQF_DISABLED);
        if (ret == 0)
                return ret;
 
index de45eb0051a7624d52112c19acb6943d252c5164..85fdfd2a7ad0a7d8a33f2d331767dc3b3d2dfe0a 100644 (file)
@@ -107,7 +107,7 @@ int usb_hcd_pnx8550_probe (const struct hc_driver *driver,
 
        ohci_hcd_init(hcd_to_ohci(hcd));
 
-       retval = usb_add_hcd(hcd, dev->resource[1].start, SA_INTERRUPT);
+       retval = usb_add_hcd(hcd, dev->resource[1].start, IRQF_DISABLED);
        if (retval == 0)
                return retval;
 
index ac9f11d19817d93e2fedcaf9cb26496a529df301..2d0e73b200996571a40249eb1181687425153ee1 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/ptrace.h>
 #include <linux/slab.h>
 #include <linux/string.h>
index 49b9d390b95f4f2082a0164ad110f7e1bd3bce25..ded4df30a63131f85e36096bfffca16237c36215 100644 (file)
@@ -28,7 +28,6 @@
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/ioport.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/errno.h>
 #include <linux/unistd.h>
index 2cbb239e63f8863688df8562805816d101b33754..68e66b33e7269bfd1ba3972aadaee6e64b09bd79 100644 (file)
@@ -624,12 +624,10 @@ static inline struct urb_priv *uhci_alloc_urb_priv(struct uhci_hcd *uhci,
 {
        struct urb_priv *urbp;
 
-       urbp = kmem_cache_alloc(uhci_up_cachep, GFP_ATOMIC);
+       urbp = kmem_cache_zalloc(uhci_up_cachep, GFP_ATOMIC);
        if (!urbp)
                return NULL;
 
-       memset((void *)urbp, 0, sizeof(*urbp));
-
        urbp->urb = urb;
        urb->hcpriv = urbp;
        
index 8ccddf74534a8e35db419c35030a58524385b7b9..896cb2b71020d99f2c61a95721add5dc87e54602 100644 (file)
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/signal.h>
 #include <linux/errno.h>
 #include <linux/random.h>
index 9f52429ce6543156d328ef4ac947201bf87a726b..f857935e615c9d70e829b891f706059c4ccd8b09 100644 (file)
@@ -76,7 +76,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/usb/input.h>
-#include <linux/sched.h>
 #include <asm/uaccess.h>
 #include <asm/unaligned.h>
 
index 84983d1b71644a09ef3b7e7b5954f0e7b05968ae..4d8ed3d71a15652ec21939d8b5803ddcfb0995c3 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/list.h>
 #include <linux/mm.h>
 #include <linux/smp_lock.h>
index 5d145058a5cb33cf40a14873b0e363f4b5e23b00..bc7f8e6f8c97a12066b6ec7cf2294de0490ec442 100644 (file)
@@ -57,6 +57,7 @@ static struct hid_ff_initializer inits[] = {
        { 0x46d, 0xc283, hid_lgff_init }, /* Logitech Wingman Force 3d */
        { 0x46d, 0xc295, hid_lgff_init }, /* Logitech MOMO force wheel */
        { 0x46d, 0xc219, hid_lgff_init }, /* Logitech Cordless rumble pad 2 */
+       { 0x46d, 0xca03, hid_lgff_init }, /* Logitech MOMO force wheel */
 #endif
 #ifdef CONFIG_PANTHERLORD_FF
        { 0x810, 0x0001, hid_plff_init },
index 4f4fc3be192e9116f40128b03b12384dbd06e124..4df0968f852e6d7686a6f731b94cef775cd41fb0 100644 (file)
@@ -52,6 +52,7 @@ static const struct dev_type devices[] = {
        { 0x046d, 0xc211, ff_rumble },
        { 0x046d, 0xc219, ff_rumble },
        { 0x046d, 0xc283, ff_joystick },
+       { 0x046d, 0xca03, ff_joystick },
        { 0x0000, 0x0000, ff_joystick }
 };
 
index cbd2d53fefff532223f7f3a00139f0ce09162b76..f5a90e950e6b54cfcd48381f89d8b38e141b1aea 100644 (file)
@@ -24,7 +24,6 @@
 
 #define debug(format, arg...) pr_debug("hid-pidff: " format "\n" , ## arg)
 
-#include <linux/sched.h>
 #include <linux/input.h>
 #include <linux/usb.h>
 
index af2934e016a7e76313816ba480e81a060de5a4b4..75bfab95ab3c4b1a1478c16ac6f0f921ab1663e5 100644 (file)
@@ -644,7 +644,7 @@ exit:
 }
 
 /* file operations needed when we register this driver */
-static struct file_operations adu_fops = {
+static const struct file_operations adu_fops = {
        .owner = THIS_MODULE,
        .read  = adu_read,
        .write = adu_write,
index a7932a72d2988425de04921eba702eabe85e9121..e573c8ba978545d164095dc634407daf4f859c2a 100644 (file)
@@ -281,7 +281,7 @@ static int appledisplay_probe(struct usb_interface *iface,
        /* Register backlight device */
        snprintf(bl_name, sizeof(bl_name), "appledisplay%d",
                atomic_inc_return(&count_displays) - 1);
-       pdata->bd = backlight_device_register(bl_name, NULL, NULL,
+       pdata->bd = backlight_device_register(bl_name, NULL, pdata,
                                                &appledisplay_bl_data);
        if (IS_ERR(pdata->bd)) {
                err("appledisplay: Backlight registration failed");
index 41c0161abdb9eb0dc18ab216b4da10fd40e87001..0c1d66ddb8125fcc04461fd51be5cb4bac89778c 100644 (file)
@@ -1209,7 +1209,7 @@ error_1:
        return retval;
 }
 
-static struct file_operations ftdi_elan_fops = {
+static const struct file_operations ftdi_elan_fops = {
         .owner = THIS_MODULE,
         .llseek = no_llseek,
         .ioctl = ftdi_elan_ioctl,
index 0398908b15d482589eb4225ca192163fd9b3b297..6f8b134a79cb8c89d495cb81ad75fc65401cdc39 100644 (file)
@@ -40,7 +40,6 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/signal.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/poll.h>
 #include <linux/init.h>
index 9148694627d586d16c0445b083dfbfdda8e0f3a8..1730d8642a47dd31276b72ac06be26217d58396f 100644 (file)
@@ -51,7 +51,6 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/signal.h>
-#include <linux/sched.h>
 #include <linux/fs.h>
 #include <linux/tty.h>
 #include <linux/console.h>
index 4206df2d61b70f673d50bf86d6f56647826a80e7..bd357e178e557548b464ed4187055b3be54970d3 100644 (file)
@@ -25,7 +25,6 @@
 
 #include <linux/module.h>
 #include <linux/kmod.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
index e5cdafa258dd5e8955a3e2449fe5f605d9567fc7..5a21f06bf8a54fab20e2bb70dd0f599b4be910c2 100644 (file)
@@ -22,7 +22,6 @@
 // #define     VERBOSE                 // more; success messages
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
index e2fae85851a3e654117f61308866ad888654d150..ae8fb06cf38e2d1eba4bb31267f489eb9366e2ab 100644 (file)
@@ -19,7 +19,6 @@
 
 #include <linux/module.h>
 #include <linux/kmod.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
index 31e5fe363fdc0d2547309c99a8829375867b18f3..d257a8e026d6182b77fea025a60376eb842b063b 100644 (file)
@@ -22,7 +22,6 @@
 // #define     VERBOSE                 // more; success messages
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
index 36a989160a684ccba108d06a706008d5500a8941..de95268ae4b8a3bb17f232f5fb9fe5a0ef11c3d5 100644 (file)
@@ -46,7 +46,6 @@
  */
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <linux/init.h>
index 4936359545134db670434fbba9e011a97f943184..ccebfdef4751f945f7577d7097f9c4540b8b4eb9 100644 (file)
@@ -21,7 +21,6 @@
 // #define     VERBOSE                 // more; success messages
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
index 5d17cdfc7bab00e468f8beafe466533b1815596e..45300939d185403e46bd7a73388c7c4e2e85398e 100644 (file)
@@ -21,7 +21,6 @@
 // #define     VERBOSE                 // more; success messages
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
index be888d2d813ca4293d5b74a816fcbc40915728ca..39a21c74fdf4af34e900900e8ab01fb3d0666df7 100644 (file)
@@ -21,7 +21,6 @@
 // #define     VERBOSE                 // more; success messages
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
index 670262a38a0f25e8471ad9073ac970901f1c981f..ea153dc9b0ac3d620b49e2f91b04e4c0774a98ed 100644 (file)
@@ -6,7 +6,6 @@
  * version 2 as published by the Free Software Foundation.
  */
 
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/signal.h>
 #include <linux/slab.h>
index 6e39e998825914acfaf899c5a9d77e2b13b59d31..43ba61abfcc53283ad352973599b1dbdcf16fbfe 100644 (file)
@@ -34,7 +34,6 @@
 // #define     VERBOSE                 // more; success messages
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
index 144566bda583aa26b029de28ee8eeb7d27a65727..9f98e8ce487ab389694353ae31de484537087cad 100644 (file)
@@ -21,7 +21,6 @@
 // #define     VERBOSE                 // more; success messages
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/init.h>
 #include <linux/netdevice.h>
 #include <linux/ethtool.h>
index 0b0fb51bad3e597ca0b829a746693a6540cd670b..d78692c01cfa3ca9a75749ee9a3fec6f5e92762f 100644 (file)
@@ -616,15 +616,7 @@ static void digi_wakeup_write_lock(struct work_struct *work)
 
 static void digi_wakeup_write( struct usb_serial_port *port )
 {
-
-       struct tty_struct *tty = port->tty;
-
-
-       /* wake up port processes */
-       wake_up_interruptible( &port->write_wait );
-
-       /* wake up line discipline */
-       tty_wakeup(tty);
+       tty_wakeup(port->tty);
 }
 
 
index da514cb785b3a0bb87c16dfff4423fddad411301..dd0b66a6ed5d00825a93c571d867f31abd61a183 100644 (file)
@@ -182,13 +182,8 @@ static void keyspan_pda_wakeup_write(struct work_struct *work)
        struct keyspan_pda_private *priv =
                container_of(work, struct keyspan_pda_private, wakeup_work);
        struct usb_serial_port *port = priv->port;
-       struct tty_struct *tty = port->tty;
 
-       /* wake up port processes */
-       wake_up_interruptible( &port->write_wait );
-
-       /* wake up line discipline */
-       tty_wakeup(tty);
+       tty_wakeup(port->tty);
 }
 
 static void keyspan_pda_request_unthrottle(struct work_struct *work)
index 6109c6704a738299992d741dc31fd9f94baff433..2d588fb82573f998aa6b899dae13a84fceff4e1b 100644 (file)
@@ -269,18 +269,8 @@ static void mos7720_bulk_out_data_callback(struct urb *urb)
 
        tty = mos7720_port->port->tty;
 
-       if (tty && mos7720_port->open) {
-               /* let the tty driver wakeup if it has a special *
-                * write_wakeup function */
-               if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-                    tty->ldisc.write_wakeup)
-                       (tty->ldisc.write_wakeup)(tty);
-
-               /* tell the tty driver that something has changed */
-               wake_up_interruptible(&tty->write_wait);
-       }
-
-       /* schedule_work(&mos7720_port->port->work); */
+       if (tty && mos7720_port->open)
+               tty_wakeup(tty);
 }
 
 /*
index b2264a87617bdfdde5587bd3cee5cc2de82edc87..c6cca859af452706ccc4bc756877df4e81af1fc3 100644 (file)
@@ -755,18 +755,8 @@ static void mos7840_bulk_out_data_callback(struct urb *urb)
 
        tty = mos7840_port->port->tty;
 
-       if (tty && mos7840_port->open) {
-               /* let the tty driver wakeup if it has a special *
-                * write_wakeup function                         */
-
-               if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP))
-                   && tty->ldisc.write_wakeup) {
-                       (tty->ldisc.write_wakeup) (tty);
-               }
-
-               /* tell the tty driver that something has changed */
-               wake_up_interruptible(&tty->write_wait);
-       }
+       if (tty && mos7840_port->open)
+               tty_wakeup(tty);
 
 }
 
index 01d8971ad7db3cfe5830aff3adade86f10e7586a..c87ad1bae1d6327b3f131af80cf04033ebbf78cf 100644 (file)
@@ -50,7 +50,6 @@
  * in that routine.
  */
 
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/slab.h>
 
index 5b06f9240d05caa2b348c7cf55cf520ff2ca2240..3a41740cad97d38b6e04c385fd64dd82f9c85133 100644 (file)
@@ -37,7 +37,6 @@
  * 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <linux/sched.h>
 #include <linux/errno.h>
 
 #include "usb.h"
index 5031aa98f6a977d13760cc9cde790e0e79751018..003fcf5458882d3ec90f07251ea5f7aa2f437d34 100644 (file)
@@ -47,7 +47,6 @@
   * in that routine.
   */
 
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/slab.h>
 
index e3528eca29a54d7ddb67866cc66261db95d18b20..b2ed2a3e6fcae4499bc5d930169bdf16af93ad64 100644 (file)
@@ -41,7 +41,6 @@
  * EF: compute checksum (?)
  */
 
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/slab.h>
 
index 8fcec01dc622f29f9fb3f8e6c50030b523b16730..5e27297c0175cb9017973b5e9e1c82de5c48056a 100644 (file)
@@ -43,7 +43,6 @@
  * 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/slab.h>
 #include <linux/cdrom.h>
index 45fe65d8d7a03d91de405314f052ac377fae2cb5..8874cf2fd279e1046d1ef473f4e2263e099029e0 100644 (file)
@@ -85,6 +85,14 @@ config FB_CFB_IMAGEBLIT
          blitting. This is used by drivers that don't provide their own
          (accelerated) version.
 
+config FB_SVGALIB
+       tristate
+       depends on FB
+       default n
+       ---help---
+         Common utility functions useful to fbdev drivers of VGA-based
+         cards.
+
 config FB_MACMODES
        tristate
        depends on FB
@@ -346,42 +354,6 @@ config FB_AMIGA_AGA
          and CD32. If you intend to run Linux on any of these systems, say Y;
          otherwise say N.
 
-config FB_CYBER
-       tristate "Amiga CyberVision 64 support"
-       depends on FB && ZORRO && BROKEN
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This enables support for the Cybervision 64 graphics card from
-         Phase5. Please note that its use is not all that intuitive (i.e. if
-         you have any questions, be sure to ask!). Say N unless you have a
-         Cybervision 64 or plan to get one before you next recompile the
-         kernel. Please note that this driver DOES NOT support the
-         Cybervision 64/3D card, as they use incompatible video chips.
-
-config FB_VIRGE
-       bool "Amiga CyberVision 64/3D support "
-       depends on (FB = y) && ZORRO && BROKEN
-       select FB_CFB_FILLRECT
-       select FB_CFB_COPYAREA
-       select FB_CFB_IMAGEBLIT
-       help
-         This enables support for the Cybervision 64/3D graphics card from
-         Phase5. Please note that its use is not all that intuitive (i.e. if
-         you have any questions, be sure to ask!). Say N unless you have a
-         Cybervision 64/3D or plan to get one before you next recompile the
-         kernel. Please note that this driver DOES NOT support the older
-         Cybervision 64 card, as they use incompatible video chips.
-
-config FB_RETINAZ3
-       tristate "Amiga Retina Z3 support"
-       depends on (FB = y) && ZORRO && BROKEN
-       help
-         This enables support for the Retina Z3 graphics card. Say N unless
-         you have a Retina Z3 or plan to get one before you next recompile
-         the kernel.
-
 config FB_FM2
        bool "Amiga FrameMaster II/Rainbow II support"
        depends on (FB = y) && ZORRO
@@ -617,10 +589,6 @@ config FB_GBE_MEM
          This is the amount of memory reserved for the framebuffer,
          which can be any value between 1MB and 8MB.
 
-config FB_SUN3
-       bool "Sun3 framebuffer support"
-       depends on (FB = y) && (SUN3 || SUN3X) && BROKEN
-
 config FB_SBUS
        bool "SBUS and UPA framebuffers"
        depends on (FB = y) && SPARC
@@ -629,7 +597,7 @@ config FB_SBUS
 
 config FB_BW2
        bool "BWtwo support"
-       depends on (FB = y) && (SPARC && FB_SBUS || (SUN3 || SUN3X) && FB_SUN3)
+       depends on (FB = y) && (SPARC && FB_SBUS)
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
@@ -638,7 +606,7 @@ config FB_BW2
 
 config FB_CG3
        bool "CGthree support"
-       depends on (FB = y) && (SPARC && FB_SBUS || (SUN3 || SUN3X) && FB_SUN3)
+       depends on (FB = y) && (SPARC && FB_SBUS)
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
@@ -647,7 +615,7 @@ config FB_CG3
 
 config FB_CG6
        bool "CGsix (GX,TurboGX) support"
-       depends on (FB = y) && (SPARC && FB_SBUS || (SUN3 || SUN3X) && FB_SUN3)
+       depends on (FB = y) && (SPARC && FB_SBUS)
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
        help
@@ -1141,11 +1109,16 @@ config FB_ATY_BACKLIGHT
        help
          Say Y here if you want to control the backlight of your display.
 
-config FB_S3TRIO
-       bool "S3 Trio display support"
-       depends on (FB = y) && PPC && BROKEN
-       help
-         If you have a S3 Trio say Y. Say N for S3 Virge.
+config FB_S3
+       tristate "S3 Trio/Virge support"
+       depends on FB && PCI
+       select FB_CFB_FILLRECT
+       select FB_CFB_COPYAREA
+       select FB_CFB_IMAGEBLIT
+       select FB_TILEBLITTING
+       select FB_SVGALIB
+       ---help---
+         Driver for graphics boards with S3 Trio / S3 Virge chip.
 
 config FB_SAVAGE
        tristate "S3 Savage support"
@@ -1625,6 +1598,26 @@ config FB_IBM_GXT4500
          Say Y here to enable support for the IBM GXT4500P display
          adaptor, found on some IBM System P (pSeries) machines.
 
+config FB_PS3
+       bool "PS3 GPU framebuffer driver"
+       depends on FB && PPC_PS3
+       select PS3_PS3AV
+       select FB_CFB_FILLRECT
+       select FB_CFB_COPYAREA
+       select FB_CFB_IMAGEBLIT
+       ---help---
+         Include support for the virtual frame buffer in the PS3 platform.
+
+config FB_PS3_DEFAULT_SIZE_M
+       int "PS3 default frame buffer size (in MiB)"
+       depends on FB_PS3
+       default 18
+       ---help---
+         This is the default size (in MiB) of the virtual frame buffer in
+         the PS3.
+         The default value can be overridden on the kernel command line
+         using the "ps3fb" option (e.g. "ps3fb=9M");
+
 config FB_VIRTUAL
        tristate "Virtual Frame Buffer support (ONLY FOR TESTING!)"
        depends on FB
index 309a26dd164aede2c8bb57874af4bb60e4cb1c92..6801edff36d930ee4adc5163afa947bb8ec5b498 100644 (file)
@@ -17,15 +17,14 @@ obj-$(CONFIG_SYSFS)           += backlight/
 obj-$(CONFIG_FB_CFB_FILLRECT)  += cfbfillrect.o
 obj-$(CONFIG_FB_CFB_COPYAREA)  += cfbcopyarea.o
 obj-$(CONFIG_FB_CFB_IMAGEBLIT) += cfbimgblt.o
+obj-$(CONFIG_FB_SVGALIB)       += svgalib.o
 obj-$(CONFIG_FB_MACMODES)      += macmodes.o
 obj-$(CONFIG_FB_DDC)           += fb_ddc.o
 
 # Hardware specific drivers go first
-obj-$(CONFIG_FB_RETINAZ3)         += retz3fb.o
 obj-$(CONFIG_FB_AMIGA)            += amifb.o c2p.o
 obj-$(CONFIG_FB_ARC)              += arcfb.o
 obj-$(CONFIG_FB_CLPS711X)         += clps711xfb.o
-obj-$(CONFIG_FB_CYBER)            += cyberfb.o
 obj-$(CONFIG_FB_CYBER2000)        += cyber2000fb.o
 obj-$(CONFIG_FB_PM2)              += pm2fb.o
 obj-$(CONFIG_FB_PM3)             += pm3fb.o
@@ -43,17 +42,16 @@ obj-$(CONFIG_FB_GEODE)                += geode/
 obj-$(CONFIG_FB_MBX)             += mbx/
 obj-$(CONFIG_FB_I810)             += vgastate.o
 obj-$(CONFIG_FB_NEOMAGIC)         += neofb.o vgastate.o
-obj-$(CONFIG_FB_VIRGE)            += virgefb.o
 obj-$(CONFIG_FB_3DFX)             += tdfxfb.o
 obj-$(CONFIG_FB_CONTROL)          += controlfb.o
 obj-$(CONFIG_FB_PLATINUM)         += platinumfb.o
 obj-$(CONFIG_FB_VALKYRIE)         += valkyriefb.o
 obj-$(CONFIG_FB_CT65550)          += chipsfb.o
 obj-$(CONFIG_FB_IMSTT)            += imsttfb.o
-obj-$(CONFIG_FB_S3TRIO)           += S3triofb.o
 obj-$(CONFIG_FB_FM2)              += fm2fb.o
 obj-$(CONFIG_FB_CYBLA)            += cyblafb.o
 obj-$(CONFIG_FB_TRIDENT)          += tridentfb.o
+obj-$(CONFIG_FB_S3)               += s3fb.o vgastate.o
 obj-$(CONFIG_FB_STI)              += stifb.o
 obj-$(CONFIG_FB_FFB)              += ffb.o sbuslib.o
 obj-$(CONFIG_FB_CG6)              += cg6.o sbuslib.o
@@ -75,7 +73,6 @@ obj-$(CONFIG_FB_TGA)              += tgafb.o
 obj-$(CONFIG_FB_HP300)            += hpfb.o
 obj-$(CONFIG_FB_G364)             += g364fb.o
 obj-$(CONFIG_FB_SA1100)           += sa1100fb.o
-obj-$(CONFIG_FB_SUN3)             += sun3fb.o
 obj-$(CONFIG_FB_HIT)              += hitfb.o
 obj-$(CONFIG_FB_EPSON1355)       += epson1355fb.o
 obj-$(CONFIG_FB_PVR2)             += pvr2fb.o
@@ -100,6 +97,7 @@ obj-$(CONFIG_FB_S3C2410)       += s3c2410fb.o
 obj-$(CONFIG_FB_PNX4008_DUM)     += pnx4008/
 obj-$(CONFIG_FB_PNX4008_DUM_RGB)  += pnx4008/
 obj-$(CONFIG_FB_IBM_GXT4500)     += gxt4500.o
+obj-$(CONFIG_FB_PS3)             += ps3fb.o
 
 # Platform or fallback drivers go here
 obj-$(CONFIG_FB_VESA)             += vesafb.o
diff --git a/drivers/video/S3triofb.c b/drivers/video/S3triofb.c
deleted file mode 100644 (file)
index b3717c8..0000000
+++ /dev/null
@@ -1,790 +0,0 @@
-/*
- *  linux/drivers/video/S3Triofb.c -- Open Firmware based frame buffer device
- *
- *     Copyright (C) 1997 Peter De Schrijver
- *
- *  This driver is partly based on the PowerMac console driver:
- *
- *     Copyright (C) 1996 Paul Mackerras
- *
- *  and on the Open Firmware based frame buffer device:
- *
- *     Copyright (C) 1997 Geert Uytterhoeven
- *
- *  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.
- */
-
-/*
-       Bugs : + OF dependencies should be removed.
-               + This driver should be merged with the CyberVision driver. The
-                 CyberVision is a Zorro III implementation of the S3Trio64 chip.
-
-*/
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-#include <linux/delay.h>
-#include <linux/interrupt.h>
-#include <linux/fb.h>
-#include <linux/init.h>
-#include <linux/selection.h>
-#include <asm/io.h>
-#include <asm/prom.h>
-#include <asm/pci-bridge.h>
-#include <linux/pci.h>
-
-#include <video/fbcon.h>
-#include <video/fbcon-cfb8.h>
-#include <video/s3blit.h>
-
-
-#define mem_in8(addr)           in_8((void *)(addr))
-#define mem_in16(addr)          in_le16((void *)(addr))
-#define mem_in32(addr)          in_le32((void *)(addr))
-
-#define mem_out8(val, addr)     out_8((void *)(addr), val)
-#define mem_out16(val, addr)    out_le16((void *)(addr), val)
-#define mem_out32(val, addr)    out_le32((void *)(addr), val)
-
-#define IO_OUT16VAL(v, r)       (((v) << 8) | (r))
-
-static struct display disp;
-static struct fb_info fb_info;
-static struct { u_char red, green, blue, pad; } palette[256];
-static char s3trio_name[16] = "S3Trio ";
-static char *s3trio_base;
-
-static struct fb_fix_screeninfo fb_fix;
-static struct fb_var_screeninfo fb_var = { 0, };
-
-
-    /*
-     *  Interface used by the world
-     */
-
-static void __init s3triofb_of_init(struct device_node *dp);
-static int s3trio_get_fix(struct fb_fix_screeninfo *fix, int con,
-                         struct fb_info *info);
-static int s3trio_get_var(struct fb_var_screeninfo *var, int con,
-                         struct fb_info *info);
-static int s3trio_set_var(struct fb_var_screeninfo *var, int con,
-                         struct fb_info *info);
-static int s3trio_get_cmap(struct fb_cmap *cmap, int kspc, int con,
-                          struct fb_info *info);
-static int s3trio_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
-                         u_int transp, struct fb_info *info);
-static int s3trio_pan_display(struct fb_var_screeninfo *var, int con,
-                             struct fb_info *info);
-static void s3triofb_blank(int blank, struct fb_info *info);
-
-    /*
-     *  Interface to the low level console driver
-     */
-
-int s3triofb_init(void);
-static int s3triofbcon_switch(int con, struct fb_info *info);
-static int s3triofbcon_updatevar(int con, struct fb_info *info);
-
-    /*
-     *  Text console acceleration
-     */
-
-#ifdef FBCON_HAS_CFB8
-static struct display_switch fbcon_trio8;
-#endif
-
-    /*
-     *    Accelerated Functions used by the low level console driver
-     */
-
-static void Trio_WaitQueue(u_short fifo);
-static void Trio_WaitBlit(void);
-static void Trio_BitBLT(u_short curx, u_short cury, u_short destx,
-                       u_short desty, u_short width, u_short height,
-                       u_short mode);
-static void Trio_RectFill(u_short x, u_short y, u_short width, u_short height,
-                         u_short mode, u_short color);
-static void Trio_MoveCursor(u_short x, u_short y);
-
-
-    /*
-     *  Internal routines
-     */
-
-static int s3trio_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
-                         u_int *transp, struct fb_info *info);
-
-static struct fb_ops s3trio_ops = {
-       .owner =        THIS_MODULE,
-       .fb_get_fix =   s3trio_get_fix,
-       .fb_get_var =   s3trio_get_var,
-       .fb_set_var =   s3trio_set_var,
-       .fb_get_cmap =  s3trio_get_cmap,
-       .fb_set_cmap =  gen_set_cmap,
-       .fb_setcolreg = s3trio_setcolreg,
-       .fb_pan_display =s3trio_pan_display,
-       .fb_blank =     s3triofb_blank,
-};
-
-    /*
-     *  Get the Fixed Part of the Display
-     */
-
-static int s3trio_get_fix(struct fb_fix_screeninfo *fix, int con,
-                         struct fb_info *info)
-{
-    memcpy(fix, &fb_fix, sizeof(fb_fix));
-    return 0;
-}
-
-
-    /*
-     *  Get the User Defined Part of the Display
-     */
-
-static int s3trio_get_var(struct fb_var_screeninfo *var, int con,
-                         struct fb_info *info)
-{
-    memcpy(var, &fb_var, sizeof(fb_var));
-    return 0;
-}
-
-
-    /*
-     *  Set the User Defined Part of the Display
-     */
-
-static int s3trio_set_var(struct fb_var_screeninfo *var, int con,
-                         struct fb_info *info)
-{
-    if (var->xres > fb_var.xres || var->yres > fb_var.yres ||
-       var->bits_per_pixel > fb_var.bits_per_pixel )
-       /* || var->nonstd || var->vmode != FB_VMODE_NONINTERLACED) */
-       return -EINVAL;
-    if (var->xres_virtual > fb_var.xres_virtual) {
-       outw(IO_OUT16VAL((var->xres_virtual /8) & 0xff, 0x13), 0x3d4);
-       outw(IO_OUT16VAL(((var->xres_virtual /8 ) & 0x300) >> 3, 0x51), 0x3d4);
-       fb_var.xres_virtual = var->xres_virtual;
-       fb_fix.line_length = var->xres_virtual;
-    }
-    fb_var.yres_virtual = var->yres_virtual;
-    memcpy(var, &fb_var, sizeof(fb_var));
-    return 0;
-}
-
-
-    /*
-     *  Pan or Wrap the Display
-     *
-     *  This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag
-     */
-
-static int s3trio_pan_display(struct fb_var_screeninfo *var, int con,
-                             struct fb_info *info)
-{
-    unsigned int base;
-
-    if (var->xoffset > (var->xres_virtual - var->xres))
-       return -EINVAL;
-    if (var->yoffset > (var->yres_virtual - var->yres))
-       return -EINVAL;
-
-    fb_var.xoffset = var->xoffset;
-    fb_var.yoffset = var->yoffset;
-
-    base = var->yoffset * fb_fix.line_length + var->xoffset;
-
-    outw(IO_OUT16VAL((base >> 8) & 0xff, 0x0c),0x03D4);
-    outw(IO_OUT16VAL(base  & 0xff, 0x0d),0x03D4);
-    outw(IO_OUT16VAL((base >> 16) & 0xf, 0x69),0x03D4);
-    return 0;
-}
-
-
-    /*
-     *  Get the Colormap
-     */
-
-static int s3trio_get_cmap(struct fb_cmap *cmap, int kspc, int con,
-                          struct fb_info *info)
-{
-    if (con == info->currcon) /* current console? */
-       return fb_get_cmap(cmap, kspc, s3trio_getcolreg, info);
-    else if (fb_display[con].cmap.len) /* non default colormap? */
-       fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
-    else
-       fb_copy_cmap(fb_default_cmap(1 << fb_display[con].var.bits_per_pixel),
-                    cmap, kspc ? 0 : 2);
-    return 0;
-}
-
-int __init s3triofb_init(void)
-{
-       struct device_node *dp;
-
-       dp = find_devices("S3Trio");
-       if (dp != 0)
-           s3triofb_of_init(dp);
-       return 0;
-}
-
-void __init s3trio_resetaccel(void){
-
-
-#define EC01_ENH_ENB    0x0005
-#define EC01_LAW_ENB    0x0010
-#define EC01_MMIO_ENB   0x0020
-
-#define EC00_RESET      0x8000
-#define EC00_ENABLE     0x4000
-#define MF_MULT_MISC    0xE000
-#define SRC_FOREGROUND  0x0020
-#define SRC_BACKGROUND  0x0000
-#define MIX_SRC                 0x0007
-#define MF_T_CLIP       0x1000
-#define MF_L_CLIP       0x2000
-#define MF_B_CLIP       0x3000
-#define MF_R_CLIP       0x4000
-#define MF_PIX_CONTROL  0xA000
-#define MFA_SRC_FOREGR_MIX      0x0000
-#define MF_PIX_CONTROL  0xA000
-
-       outw(EC00_RESET,  0x42e8);
-       inw(  0x42e8);
-       outw(EC00_ENABLE,  0x42e8);
-       inw(  0x42e8);
-       outw(EC01_ENH_ENB | EC01_LAW_ENB,
-                  0x4ae8);
-       outw(MF_MULT_MISC,  0xbee8); /* 16 bit I/O registers */
-
-       /* Now set some basic accelerator registers */
-       Trio_WaitQueue(0x0400);
-       outw(SRC_FOREGROUND | MIX_SRC, 0xbae8);
-       outw(SRC_BACKGROUND | MIX_SRC,  0xb6e8);/* direct color*/
-       outw(MF_T_CLIP | 0, 0xbee8 );     /* clip virtual area  */
-       outw(MF_L_CLIP | 0, 0xbee8 );
-       outw(MF_R_CLIP | (640 - 1), 0xbee8);
-       outw(MF_B_CLIP | (480 - 1),  0xbee8);
-       Trio_WaitQueue(0x0400);
-       outw(0xffff,  0xaae8);       /* Enable all planes */
-       outw(0xffff, 0xaae8);       /* Enable all planes */
-       outw( MF_PIX_CONTROL | MFA_SRC_FOREGR_MIX,  0xbee8);
-}
-
-int __init s3trio_init(struct device_node *dp){
-
-    u_char bus, dev;
-    unsigned int t32;
-    unsigned short cmd;
-
-       pci_device_loc(dp,&bus,&dev);
-                pcibios_read_config_dword(bus, dev, PCI_VENDOR_ID, &t32);
-                if(t32 == (PCI_DEVICE_ID_S3_TRIO << 16) + PCI_VENDOR_ID_S3) {
-                        pcibios_read_config_dword(bus, dev, PCI_BASE_ADDRESS_0, &t32);
-                        pcibios_read_config_dword(bus, dev, PCI_BASE_ADDRESS_1, &t32);
-                       pcibios_read_config_word(bus, dev, PCI_COMMAND,&cmd);
-
-                       pcibios_write_config_word(bus, dev, PCI_COMMAND, PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
-
-                       pcibios_write_config_dword(bus, dev, PCI_BASE_ADDRESS_0,0xffffffff);
-                        pcibios_read_config_dword(bus, dev, PCI_BASE_ADDRESS_0, &t32);
-
-/* This is a gross hack as OF only maps enough memory for the framebuffer and
-   we want to use MMIO too. We should find out which chunk of address space
-   we can use here */
-                       pcibios_write_config_dword(bus,dev,PCI_BASE_ADDRESS_0,0xc6000000);
-
-                       /* unlock s3 */
-
-                       outb(0x01, 0x3C3);
-
-                       outb(inb(0x03CC) | 1, 0x3c2);
-
-                       outw(IO_OUT16VAL(0x48, 0x38),0x03D4);
-                       outw(IO_OUT16VAL(0xA0, 0x39),0x03D4);
-                       outb(0x33,0x3d4);
-                       outw(IO_OUT16VAL((inb(0x3d5) & ~(0x2 | 0x10 |  0x40)) |
-                                         0x20, 0x33), 0x3d4);
-
-                       outw(IO_OUT16VAL(0x6, 0x8), 0x3c4);
-
-                       /* switch to MMIO only mode */
-
-                       outb(0x58, 0x3d4);
-                       outw(IO_OUT16VAL(inb(0x3d5) | 3 | 0x10, 0x58), 0x3d4);
-                       outw(IO_OUT16VAL(8, 0x53), 0x3d4);
-
-                       /* switch off I/O accesses */
-
-#if 0
-                       pcibios_write_config_word(bus, dev, PCI_COMMAND,
-                                       PCI_COMMAND_IO | PCI_COMMAND_MEMORY);
-#endif
-                       return 1;
-                }
-
-       return 0;
-}
-
-
-    /*
-     *  Initialisation
-     *  We heavily rely on OF for the moment. This needs fixing.
-     */
-
-static void __init s3triofb_of_init(struct device_node *dp)
-{
-    int i, *pp, len;
-    unsigned long address, size;
-    u_long *CursorBase;
-
-    strncat(s3trio_name, dp->name, sizeof(s3trio_name));
-    s3trio_name[sizeof(s3trio_name)-1] = '\0';
-    strcpy(fb_fix.id, s3trio_name);
-
-    if((pp = get_property(dp, "vendor-id", &len)) != NULL
-       && *pp!=PCI_VENDOR_ID_S3) {
-       printk("%s: can't find S3 Trio board\n", dp->full_name);
-       return;
-    }
-
-    if((pp = get_property(dp, "device-id", &len)) != NULL
-       && *pp!=PCI_DEVICE_ID_S3_TRIO) {
-       printk("%s: can't find S3 Trio board\n", dp->full_name);
-       return;
-    }
-
-    if ((pp = get_property(dp, "depth", &len)) != NULL
-       && len == sizeof(int) && *pp != 8) {
-       printk("%s: can't use depth = %d\n", dp->full_name, *pp);
-       return;
-    }
-    if ((pp = get_property(dp, "width", &len)) != NULL
-       && len == sizeof(int))
-       fb_var.xres = fb_var.xres_virtual = *pp;
-    if ((pp = get_property(dp, "height", &len)) != NULL
-       && len == sizeof(int))
-       fb_var.yres = fb_var.yres_virtual = *pp;
-    if ((pp = get_property(dp, "linebytes", &len)) != NULL
-       && len == sizeof(int))
-       fb_fix.line_length = *pp;
-    else
-       fb_fix.line_length = fb_var.xres_virtual;
-    fb_fix.smem_len = fb_fix.line_length*fb_var.yres;
-
-    address = 0xc6000000;
-    size = 64*1024*1024;
-    if (!request_mem_region(address, size, "S3triofb"))
-       return;
-
-    s3trio_init(dp);
-    s3trio_base = ioremap(address, size);
-    fb_fix.smem_start = address;
-    fb_fix.type = FB_TYPE_PACKED_PIXELS;
-    fb_fix.type_aux = 0;
-    fb_fix.accel = FB_ACCEL_S3_TRIO64;
-    fb_fix.mmio_start = address+0x1000000;
-    fb_fix.mmio_len = 0x1000000;
-
-    fb_fix.xpanstep = 1;
-    fb_fix.ypanstep = 1;
-
-    s3trio_resetaccel();
-
-    mem_out8(0x30, s3trio_base+0x1008000 + 0x03D4);
-    mem_out8(0x2d, s3trio_base+0x1008000 + 0x03D4);
-    mem_out8(0x2e, s3trio_base+0x1008000 + 0x03D4);
-
-    mem_out8(0x50, s3trio_base+0x1008000 + 0x03D4);
-
-    /* disable HW cursor */
-
-    mem_out8(0x39, s3trio_base+0x1008000 + 0x03D4);
-    mem_out8(0xa0, s3trio_base+0x1008000 + 0x03D5);
-
-    mem_out8(0x45, s3trio_base+0x1008000 + 0x03D4);
-    mem_out8(0, s3trio_base+0x1008000 + 0x03D5);
-
-    mem_out8(0x4e, s3trio_base+0x1008000 + 0x03D4);
-    mem_out8(0, s3trio_base+0x1008000 + 0x03D5);
-
-    mem_out8(0x4f, s3trio_base+0x1008000 + 0x03D4);
-    mem_out8(0, s3trio_base+0x1008000 + 0x03D5);
-
-    /* init HW cursor */
-
-    CursorBase = (u_long *)(s3trio_base + 2*1024*1024 - 0x400);
-       for (i = 0; i < 8; i++) {
-               *(CursorBase  +(i*4)) = 0xffffff00;
-               *(CursorBase+1+(i*4)) = 0xffff0000;
-               *(CursorBase+2+(i*4)) = 0xffff0000;
-               *(CursorBase+3+(i*4)) = 0xffff0000;
-       }
-       for (i = 8; i < 64; i++) {
-               *(CursorBase  +(i*4)) = 0xffff0000;
-               *(CursorBase+1+(i*4)) = 0xffff0000;
-               *(CursorBase+2+(i*4)) = 0xffff0000;
-               *(CursorBase+3+(i*4)) = 0xffff0000;
-       }
-
-
-    mem_out8(0x4c, s3trio_base+0x1008000 + 0x03D4);
-    mem_out8(((2*1024 - 1)&0xf00)>>8, s3trio_base+0x1008000 + 0x03D5);
-
-    mem_out8(0x4d, s3trio_base+0x1008000 + 0x03D4);
-    mem_out8((2*1024 - 1) & 0xff, s3trio_base+0x1008000 + 0x03D5);
-
-    mem_out8(0x45, s3trio_base+0x1008000 + 0x03D4);
-    mem_in8(s3trio_base+0x1008000 + 0x03D4);
-
-    mem_out8(0x4a, s3trio_base+0x1008000 + 0x03D4);
-    mem_out8(0x80, s3trio_base+0x1008000 + 0x03D5);
-    mem_out8(0x80, s3trio_base+0x1008000 + 0x03D5);
-    mem_out8(0x80, s3trio_base+0x1008000 + 0x03D5);
-
-    mem_out8(0x4b, s3trio_base+0x1008000 + 0x03D4);
-    mem_out8(0x00, s3trio_base+0x1008000 + 0x03D5);
-    mem_out8(0x00, s3trio_base+0x1008000 + 0x03D5);
-    mem_out8(0x00, s3trio_base+0x1008000 + 0x03D5);
-
-    mem_out8(0x45, s3trio_base+0x1008000 + 0x03D4);
-    mem_out8(0, s3trio_base+0x1008000 + 0x03D5);
-
-    /* setup default color table */
-
-       for(i = 0; i < 16; i++) {
-               int j = color_table[i];
-               palette[i].red=default_red[j];
-               palette[i].green=default_grn[j];
-               palette[i].blue=default_blu[j];
-       }
-
-    s3trio_setcolreg(255, 56, 100, 160, 0, NULL /* not used */);
-    s3trio_setcolreg(254, 0, 0, 0, 0, NULL /* not used */);
-    memset((char *)s3trio_base, 0, 640*480);
-
-#if 0
-    Trio_RectFill(0, 0, 90, 90, 7, 1);
-#endif
-
-    fb_fix.visual = FB_VISUAL_PSEUDOCOLOR ;
-    fb_var.xoffset = fb_var.yoffset = 0;
-    fb_var.bits_per_pixel = 8;
-    fb_var.grayscale = 0;
-    fb_var.red.offset = fb_var.green.offset = fb_var.blue.offset = 0;
-    fb_var.red.length = fb_var.green.length = fb_var.blue.length = 8;
-    fb_var.red.msb_right = fb_var.green.msb_right = fb_var.blue.msb_right = 0;
-    fb_var.transp.offset = fb_var.transp.length = fb_var.transp.msb_right = 0;
-    fb_var.nonstd = 0;
-    fb_var.activate = 0;
-    fb_var.height = fb_var.width = -1;
-    fb_var.accel_flags = FB_ACCELF_TEXT;
-#warning FIXME: always obey fb_var.accel_flags
-    fb_var.pixclock = 1;
-    fb_var.left_margin = fb_var.right_margin = 0;
-    fb_var.upper_margin = fb_var.lower_margin = 0;
-    fb_var.hsync_len = fb_var.vsync_len = 0;
-    fb_var.sync = 0;
-    fb_var.vmode = FB_VMODE_NONINTERLACED;
-
-    disp.var = fb_var;
-    disp.cmap.start = 0;
-    disp.cmap.len = 0;
-    disp.cmap.red = disp.cmap.green = disp.cmap.blue = disp.cmap.transp = NULL;
-    disp.visual = fb_fix.visual;
-    disp.type = fb_fix.type;
-    disp.type_aux = fb_fix.type_aux;
-    disp.ypanstep = 0;
-    disp.ywrapstep = 0;
-    disp.line_length = fb_fix.line_length;
-    disp.can_soft_blank = 1;
-    disp.inverse = 0;
-#ifdef FBCON_HAS_CFB8
-    if (fb_var.accel_flags & FB_ACCELF_TEXT)
-       disp.dispsw = &fbcon_trio8;
-    else
-       disp.dispsw = &fbcon_cfb8;
-#else
-    disp.dispsw = &fbcon_dummy;
-#endif
-    disp.scrollmode = fb_var.accel_flags & FB_ACCELF_TEXT ? 0 : SCROLL_YREDRAW;
-
-    strcpy(fb_info.modename, "Trio64 ");
-    strncat(fb_info.modename, dp->full_name, sizeof(fb_info.modename));
-    fb_info.currcon = -1;
-    fb_info.fbops = &s3trio_ops;
-    fb_info.screen_base = s3trio_base; 
-#if 0
-    fb_info.fbvar_num = 1;
-    fb_info.fbvar = &fb_var;
-#endif
-    fb_info.disp = &disp;
-    fb_info.fontname[0] = '\0';
-    fb_info.changevar = NULL;
-    fb_info.switch_con = &s3triofbcon_switch;
-    fb_info.updatevar = &s3triofbcon_updatevar;
-#if 0
-    fb_info.setcmap = &s3triofbcon_setcmap;
-#endif
-
-    fb_info.flags = FBINFO_FLAG_DEFAULT;
-    if (register_framebuffer(&fb_info) < 0) {
-               iounmap(fb_info.screen_base);
-               fb_info.screen_base = NULL;
-               return;
-    }
-
-    printk("fb%d: S3 Trio frame buffer device on %s\n",
-          fb_info.node, dp->full_name);
-}
-
-
-static int s3triofbcon_switch(int con, struct fb_info *info)
-{
-    /* Do we have to save the colormap? */
-    if (fb_display[info->currcon].cmap.len)
-       fb_get_cmap(&fb_display[info->currcon].cmap, 1, s3trio_getcolreg, info);
-
-    info->currcon = con;
-    /* Install new colormap */
-    do_install_cmap(con,info);
-    return 0;
-}
-
-    /*
-     *  Update the `var' structure (called by fbcon.c)
-     */
-
-static int s3triofbcon_updatevar(int con, struct fb_info *info)
-{
-    /* Nothing */
-    return 0;
-}
-
-    /*
-     *  Blank the display.
-     */
-
-static int s3triofb_blank(int blank, struct fb_info *info)
-{
-    unsigned char x;
-
-    mem_out8(0x1, s3trio_base+0x1008000 + 0x03c4);
-    x = mem_in8(s3trio_base+0x1008000 + 0x03c5);
-    mem_out8((x & (~0x20)) | (blank << 5), s3trio_base+0x1008000 + 0x03c5);
-    return 0;  
-}
-
-    /*
-     *  Read a single color register and split it into
-     *  colors/transparent. Return != 0 for invalid regno.
-     */
-
-static int s3trio_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
-                         u_int *transp, struct fb_info *info)
-{
-    if (regno > 255)
-       return 1;
-    *red = (palette[regno].red << 8) | palette[regno].red;
-    *green = (palette[regno].green << 8) | palette[regno].green;
-    *blue = (palette[regno].blue << 8) | palette[regno].blue;
-    *transp = 0;
-    return 0;
-}
-
-
-    /*
-     *  Set a single color register. Return != 0 for invalid regno.
-     */
-
-static int s3trio_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
-                            u_int transp, struct fb_info *info)
-{
-    if (regno > 255)
-       return 1;
-
-    red >>= 8;
-    green >>= 8;
-    blue >>= 8;
-    palette[regno].red = red;
-    palette[regno].green = green;
-    palette[regno].blue = blue;
-
-    mem_out8(regno,s3trio_base+0x1008000 + 0x3c8);
-    mem_out8((red & 0xff) >> 2,s3trio_base+0x1008000 + 0x3c9);
-    mem_out8((green & 0xff) >> 2,s3trio_base+0x1008000 + 0x3c9);
-    mem_out8((blue & 0xff) >> 2,s3trio_base+0x1008000 + 0x3c9);
-
-    return 0;
-}
-
-static void Trio_WaitQueue(u_short fifo) {
-
-       u_short status;
-
-        do
-        {
-               status = mem_in16(s3trio_base + 0x1000000 + 0x9AE8);
-       }  while (!(status & fifo));
-
-}
-
-static void Trio_WaitBlit(void) {
-
-       u_short status;
-
-        do
-        {
-               status = mem_in16(s3trio_base + 0x1000000 + 0x9AE8);
-       }  while (status & 0x200);
-
-}
-
-static void Trio_BitBLT(u_short curx, u_short cury, u_short destx,
-                       u_short desty, u_short width, u_short height,
-                       u_short mode) {
-
-       u_short blitcmd = 0xc011;
-
-       /* Set drawing direction */
-        /* -Y, X maj, -X (default) */
-
-       if (curx > destx)
-               blitcmd |= 0x0020;  /* Drawing direction +X */
-       else {
-               curx  += (width - 1);
-               destx += (width - 1);
-       }
-
-       if (cury > desty)
-               blitcmd |= 0x0080;  /* Drawing direction +Y */
-       else {
-               cury  += (height - 1);
-               desty += (height - 1);
-       }
-
-       Trio_WaitQueue(0x0400);
-
-       outw(0xa000,  0xBEE8);
-       outw(0x60 | mode,  0xBAE8);
-
-       outw(curx,  0x86E8);
-       outw(cury,  0x82E8);
-
-       outw(destx,  0x8EE8);
-       outw(desty,  0x8AE8);
-
-       outw(height - 1,  0xBEE8);
-       outw(width - 1,  0x96E8);
-
-       outw(blitcmd,  0x9AE8);
-
-}
-
-static void Trio_RectFill(u_short x, u_short y, u_short width, u_short height,
-                         u_short mode, u_short color) {
-
-       u_short blitcmd = 0x40b1;
-
-       Trio_WaitQueue(0x0400);
-
-       outw(0xa000,  0xBEE8);
-       outw((0x20 | mode),  0xBAE8);
-       outw(0xe000,  0xBEE8);
-       outw(color,  0xA6E8);
-       outw(x,  0x86E8);
-       outw(y,  0x82E8);
-       outw((height - 1), 0xBEE8);
-       outw((width - 1), 0x96E8);
-       outw(blitcmd,  0x9AE8);
-
-}
-
-
-static void Trio_MoveCursor(u_short x, u_short y) {
-
-       mem_out8(0x39, s3trio_base + 0x1008000 + 0x3d4);
-       mem_out8(0xa0, s3trio_base + 0x1008000 + 0x3d5);
-
-       mem_out8(0x46, s3trio_base + 0x1008000 + 0x3d4);
-       mem_out8((x & 0x0700) >> 8, s3trio_base + 0x1008000 + 0x3d5);
-       mem_out8(0x47, s3trio_base + 0x1008000 + 0x3d4);
-       mem_out8(x & 0x00ff, s3trio_base + 0x1008000 + 0x3d5);
-
-       mem_out8(0x48, s3trio_base + 0x1008000 + 0x3d4);
-       mem_out8((y & 0x0700) >> 8, s3trio_base + 0x1008000 + 0x3d5);
-       mem_out8(0x49, s3trio_base + 0x1008000 + 0x3d4);
-       mem_out8(y & 0x00ff, s3trio_base + 0x1008000 + 0x3d5);
-
-}
-
-
-    /*
-     *  Text console acceleration
-     */
-
-#ifdef FBCON_HAS_CFB8
-static void fbcon_trio8_bmove(struct display *p, int sy, int sx, int dy,
-                             int dx, int height, int width)
-{
-    sx *= 8; dx *= 8; width *= 8;
-    Trio_BitBLT((u_short)sx, (u_short)(sy*fontheight(p)), (u_short)dx,
-                (u_short)(dy*fontheight(p)), (u_short)width,
-                (u_short)(height*fontheight(p)), (u_short)S3_NEW);
-}
-
-static void fbcon_trio8_clear(struct vc_data *conp, struct display *p, int sy,
-                             int sx, int height, int width)
-{
-    unsigned char bg;
-
-    sx *= 8; width *= 8;
-    bg = attr_bgcol_ec(p,conp);
-    Trio_RectFill((u_short)sx,
-                  (u_short)(sy*fontheight(p)),
-                  (u_short)width,
-                  (u_short)(height*fontheight(p)),
-                  (u_short)S3_NEW,
-                  (u_short)bg);
-}
-
-static void fbcon_trio8_putc(struct vc_data *conp, struct display *p, int c,
-                            int yy, int xx)
-{
-    Trio_WaitBlit();
-    fbcon_cfb8_putc(conp, p, c, yy, xx);
-}
-
-static void fbcon_trio8_putcs(struct vc_data *conp, struct display *p,
-                             const unsigned short *s, int count, int yy, int xx)
-{
-    Trio_WaitBlit();
-    fbcon_cfb8_putcs(conp, p, s, count, yy, xx);
-}
-
-static void fbcon_trio8_revc(struct display *p, int xx, int yy)
-{
-    Trio_WaitBlit();
-    fbcon_cfb8_revc(p, xx, yy);
-}
-
-static struct display_switch fbcon_trio8 = {
-   .setup =            fbcon_cfb8_setup,
-   .bmove =            fbcon_trio8_bmove,
-   .clear =            fbcon_trio8_clear,
-   .putc =             fbcon_trio8_putc,
-   .putcs =            fbcon_trio8_putcs,
-   .revc =             fbcon_trio8_revc,
-   .clear_margins =    fbcon_cfb8_clear_margins,
-   .fontwidthmask =    FONTWIDTH(8)
-};
-#endif
-
-MODULE_LICENSE("GPL");
index 602db660bc73d7bb2ef41a8246bd05e10afdd609..bffe2b946344b37881f0fed387965562b357724d 100644 (file)
@@ -49,7 +49,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/mm.h>
index f2ebdd880085a6f69183160fa667062e3c499148..301612cef3544ca4f3bc2b367af620ba6f83b801 100644 (file)
@@ -2566,7 +2566,7 @@ static int __devinit aty_init(struct fb_info *info)
               info->fix.smem_len == 0x80000 ? 'K' : 'M', ramname, xtal, par->pll_limits.pll_max,
               par->pll_limits.mclk, par->pll_limits.xclk);
 
-#if defined(DEBUG) && defined(CONFIG_ATY_CT)
+#if defined(DEBUG) && defined(CONFIG_FB_ATY_CT)
        if (M64_HAS(INTEGRATED)) {
                int i;
                printk("debug atyfb: BUS_CNTL DAC_CNTL MEM_CNTL EXT_MEM_CNTL CRTC_GEN_CNTL "
@@ -2957,8 +2957,6 @@ extern void (*prom_palette) (int);
 static int __devinit atyfb_setup_sparc(struct pci_dev *pdev,
                        struct fb_info *info, unsigned long addr)
 {
-       extern int con_is_present(void);
-
        struct atyfb_par *par = info->par;
        struct pcidev_cookie *pcp;
        char prop[128];
index 1490e5e1c23292a82be44e842ee7ec1cff19cc31..a8f60c33863c6f7df1e239e66de510347a107c22 100644 (file)
@@ -3,7 +3,6 @@
  *  ATI Mach64 Hardware Acceleration
  */
 
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/fb.h>
 #include <video/mach64.h>
index 2045639cb671b1ecded8b03f2104ff868a8741d6..10c988aef58ec13df19580244b1a08651d4b9c8e 100644 (file)
@@ -5,7 +5,6 @@
 
 #include <linux/delay.h>
 #include <linux/fb.h>
-#include <linux/sched.h>
 
 #include <asm/io.h>
 
index e7c5b219ad1b6baa8d01d67086caa816c280c770..5084799207056941f1fc3a6c03aa6529801a2460 100644 (file)
@@ -1,6 +1,5 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/pci.h>
 #include <linux/fb.h>
index ef5c16f7f5a64852b1505fbab982f8f63f6b899e..80a81eccad363aeaf25d21fb805f4972c8bb5fdd 100644 (file)
@@ -468,11 +468,10 @@ int au1100fb_drv_probe(struct device *dev)
                        return -EINVAL;
 
        /* Allocate new device private */
-       if (!(fbdev = kmalloc(sizeof(struct au1100fb_device), GFP_KERNEL))) {
+       if (!(fbdev = kzalloc(sizeof(struct au1100fb_device), GFP_KERNEL))) {
                print_err("fail to allocate device private record");
                return -ENOMEM;
        }
-       memset((void*)fbdev, 0, sizeof(struct au1100fb_device));
 
        fbdev->panel = &known_lcd_panels[drv_info.panel_idx];
 
@@ -549,10 +548,9 @@ int au1100fb_drv_probe(struct device *dev)
        fbdev->info.fbops = &au1100fb_ops;
        fbdev->info.fix = au1100fb_fix;
 
-       if (!(fbdev->info.pseudo_palette = kmalloc(sizeof(u32) * 16, GFP_KERNEL))) {
+       if (!(fbdev->info.pseudo_palette = kzalloc(sizeof(u32) * 16, GFP_KERNEL))) {
                return -ENOMEM;
        }
-       memset(fbdev->info.pseudo_palette, 0, sizeof(u32) * 16);
 
        if (fb_alloc_cmap(&fbdev->info.cmap, AU1100_LCD_NBR_PALETTE_ENTRIES, 0) < 0) {
                print_err("Fail to allocate colormap (%d entries)",
index 31f476a64790e09dd6f005b42cee0800e8c0362f..be3f2c3f132c22d9f148da488aa9a9f5958ad32c 100644 (file)
@@ -60,7 +60,6 @@
 
 #include <linux/module.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/fs.h>
 #include <linux/kernel.h>
 #include <linux/delay.h>       /* MSch: for IRQ probe */
@@ -2071,7 +2070,7 @@ static int fbcon_resize(struct vc_data *vc, unsigned int width,
        y_diff = info->var.yres - var.yres;
        if (x_diff < 0 || x_diff > virt_fw ||
            y_diff < 0 || y_diff > virt_fh) {
-               struct fb_videomode *mode;
+               const struct fb_videomode *mode;
 
                DPRINTK("attempting resize %ix%i\n", var.xres, var.yres);
                mode = fb_find_best_mode(&var, &info->modelist);
@@ -2975,7 +2974,7 @@ static void fbcon_new_modelist(struct fb_info *info)
        int i;
        struct vc_data *vc;
        struct fb_var_screeninfo var;
-       struct fb_videomode *mode;
+       const struct fb_videomode *mode;
 
        for (i = first_fb_vc; i <= last_fb_vc; i++) {
                if (registered_fb[con2fb_map[i]] != info)
index b9386d168c0499a260a99b9b9c3d76fec8828d27..71f24e00fcd041c54212166f30db1c9e23283aa6 100644 (file)
@@ -48,7 +48,7 @@ struct display {
     struct fb_bitfield green;
     struct fb_bitfield blue;
     struct fb_bitfield transp;
-    struct fb_videomode *mode;
+    const struct fb_videomode *mode;
 };
 
 struct fbcon_ops {
index eb4d03fa53915612f40158a82d06f549eec4f595..124ecbe6f88cf37dc00152e393ecddc2b4b568a2 100644 (file)
@@ -27,7 +27,6 @@
  */
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/fs.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
index 4a9bde2c839b41dae6922ff71965928833908b7b..91a20785108aa26b962fd4412afb51ae427476bb 100644 (file)
@@ -35,7 +35,6 @@
 
 #include <linux/module.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/fs.h>
 #include <linux/kernel.h>
 #include <linux/console.h>
index 04c6d928189b82b1c761fafb5ea408267c187958..fd60dba294dabf28882b3d2084fd1bc23ecf8828 100644 (file)
@@ -696,11 +696,10 @@ static int __init control_of_init(struct device_node *dp)
                printk(KERN_ERR "can't get 2 addresses for control\n");
                return -ENXIO;
        }
-       p = kmalloc(sizeof(*p), GFP_KERNEL);
+       p = kzalloc(sizeof(*p), GFP_KERNEL);
        if (p == 0)
                return -ENXIO;
        control_fb = p; /* save it for cleanups */
-       memset(p, 0, sizeof(*p));
 
        /* Map in frame buffer and registers */
        p->fb_orig_base = fb_res.start;
index aae6d9c26e8818646c4a44499f4224b0bd91ab5f..7a6eeda5ae9aabf48bc4032093be88fc08c8eac5 100644 (file)
@@ -1539,16 +1539,21 @@ static int cyberpro_pci_enable_mmio(struct cfb_info *cfb)
        /*
         * Allow the CyberPro to accept PCI burst accesses
         */
-       val = cyber2000_grphr(EXT_BUS_CTL, cfb);
-       if (!(val & EXT_BUS_CTL_PCIBURST_WRITE)) {
-               printk(KERN_INFO "%s: enabling PCI bursts\n", cfb->fb.fix.id);
+       if (cfb->id == ID_CYBERPRO_2010) {
+               printk(KERN_INFO "%s: NOT enabling PCI bursts\n", cfb->fb.fix.id);
+       } else {
+               val = cyber2000_grphr(EXT_BUS_CTL, cfb);
+               if (!(val & EXT_BUS_CTL_PCIBURST_WRITE)) {
+                       printk(KERN_INFO "%s: enabling PCI bursts\n",
+                               cfb->fb.fix.id);
 
-               val |= EXT_BUS_CTL_PCIBURST_WRITE;
+                       val |= EXT_BUS_CTL_PCIBURST_WRITE;
 
-               if (cfb->id == ID_CYBERPRO_5000)
-                       val |= EXT_BUS_CTL_PCIBURST_READ;
+                       if (cfb->id == ID_CYBERPRO_5000)
+                               val |= EXT_BUS_CTL_PCIBURST_READ;
 
-               cyber2000_grphw(EXT_BUS_CTL, val, cfb);
+                       cyber2000_grphw(EXT_BUS_CTL, val, cfb);
+               }
        }
 
        return 0;
diff --git a/drivers/video/cyberfb.c b/drivers/video/cyberfb.c
deleted file mode 100644 (file)
index 0b8d5b1..0000000
+++ /dev/null
@@ -1,2295 +0,0 @@
-/*
-* linux/drivers/video/cyberfb.c -- CyberVision64 frame buffer device
-* $Id: cyberfb.c,v 1.6 1998/09/11 04:54:58 abair Exp $
-*
-*    Copyright (C) 1998 Alan Bair
-*
-* This file is based on two CyberVision64 frame buffer device drivers
-*
-* The second CyberVision64 frame buffer device (cvision.c cvision_core.c):
-*
-*   Copyright (c) 1997 Antonio Santos
-*
-* Released as a patch to 2.1.35, but never included in the source tree.
-* This is based on work from the NetBSD CyberVision64 frame buffer driver 
-* and support files (grf_cv.c, grf_cvreg.h, ite_cv.c):
-* Permission to use the source of this driver was obtained from the
-* author Michael Teske by Alan Bair.
-*
-*   Copyright (c) 1995 Michael Teske
-*
-* The first CyberVision64 frame buffer device (cyberfb.c):
-*
-*    Copyright (C) 1996 Martin Apel
-*                       Geert Uytterhoeven
-*
-* Which is based on the Amiga frame buffer device (amifb.c):
-*
-*    Copyright (C) 1995 Geert Uytterhoeven
-*
-*
-* History:
-*   - 22 Dec 95: Original version by Martin Apel
-*   - 05 Jan 96: Geert: integration into the current source tree
-*   - 01 Aug 98: Alan: Merge in code from cvision.c and cvision_core.c
-* $Log: cyberfb.c,v $
-* Revision 1.6  1998/09/11 04:54:58  abair
-* Update for 2.1.120 change in include file location.
-* Clean up for public release.
-*
-* Revision 1.5  1998/09/03 04:27:13  abair
-* Move cv64_load_video_mode to cyber_set_video so a new video mode is install
-* with each change of the 'var' data.
-*
-* Revision 1.4  1998/09/01 00:31:17  abair
-* Put in a set of default 8,16,24 bpp modes and map cyber8,16 to them.
-* Update operations with 'par' to handle a more complete set of parameter
-* values for encode/decode process.
-*
-* Revision 1.3  1998/08/31 21:31:33  abair
-* Swap 800x490 for 640x480 video mode and more cleanup.
-* Abandon idea to resurrect "custom" mode setting via kernel opts,
-* instead work on making use of fbset program to do this.
-*
-* Revision 1.2  1998/08/31 06:17:08  abair
-* Make updates for changes in cyberfb.c released in 2.1.119
-* and do some cleanup of the code.
-*
-* Revision 1.1  1998/08/29 18:38:31  abair
-* Initial revision
-*
-* Revision 1.3  1998/08/17 06:21:53  abair
-* Remove more redundant code after merging in cvision_core.c
-* Set blanking by colormap to pale red to detect this vs trying to
-* use video blanking. More formating to Linux code style.
-*
-* Revision 1.2  1998/08/15 17:51:37  abair
-* Added cvision_core.c code from 2.1.35 patches.
-* Changed to compile correctly and switch to using initialization
-* code. Added debugging and dropping of duplicate code.
-*
-*
-*
-* This file is subject to the terms and conditions of the GNU General Public
-* License.  See the file COPYING in the main directory of this archive
-* for more details.
-*/
-
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/slab.h>
-#include <linux/delay.h>
-#include <linux/zorro.h>
-#include <linux/fb.h>
-#include <linux/init.h>
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <asm/irq.h>
-#include <asm/pgtable.h>
-#include <asm/amigahw.h>
-#include <asm/io.h>
-
-#include "cyberfb.h"
-#include <video/fbcon.h>
-#include <video/fbcon-cfb8.h>
-#include <video/fbcon-cfb16.h>
-
-/*#define CYBERFBDEBUG*/
-#ifdef CYBERFBDEBUG
-#define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , ## args)
-static void cv64_dump(void);
-#else
-#define DPRINTK(fmt, args...)
-#endif
-
-#define wb_64(regs,reg,dat) (*(((volatile unsigned char *)regs) + reg) = dat)
-#define rb_64(regs, reg) (*(((volatile unsigned char *)regs) + reg))
-
-struct cyberfb_par {
-       struct fb_var_screeninfo var;
-       __u32 type;
-       __u32 type_aux;
-       __u32 visual;
-       __u32 line_length;
-};
-
-static struct cyberfb_par current_par;
-
-static int current_par_valid = 0;
-
-static struct display disp;
-static struct fb_info fb_info;
-
-
-/*
- *    Frame Buffer Name
- */
-
-static char cyberfb_name[16] = "Cybervision";
-
-
-/*
- *    CyberVision Graphics Board
- */
-
-static unsigned char Cyber_colour_table [256][3];
-static unsigned long CyberSize;
-static volatile unsigned char *CyberBase;
-static volatile unsigned char *CyberMem;
-static volatile unsigned char *CyberRegs;
-static unsigned long CyberMem_phys;
-static unsigned long CyberRegs_phys;
-
-/*
- *    Predefined Video Modes
- */
-
-static struct {
-    const char *name;
-    struct fb_var_screeninfo var;
-} cyberfb_predefined[] __initdata = {
-       { "640x480-8", {                /* Default 8 BPP mode (cyber8) */
-               640, 480, 640, 480, 0, 0, 8, 0,
-               {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-               0, 0, -1, -1, FB_ACCELF_TEXT, 39722, 40, 24, 32, 11, 96, 2,
-               FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, 
-               FB_VMODE_NONINTERLACED
-       }}, 
-       { "640x480-16", {               /* Default 16 BPP mode (cyber16) */
-               640, 480, 640, 480, 0, 0, 16, 0,
-               {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-               0, 0, -1, -1, FB_ACCELF_TEXT, 39722, 40, 24, 32, 11, 96, 2,
-               FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, 
-               FB_VMODE_NONINTERLACED
-       }}, 
-       { "640x480-24", {               /* Default 24 BPP mode */
-               640, 480, 640, 480, 0, 0, 24, 0,
-               {16, 8, 0}, {8, 8, 0}, {0, 8, 0}, {0, 0, 0},
-               0, 0, -1, -1, FB_ACCELF_TEXT, 39722, 40, 24, 32, 11, 96, 2,
-               FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, 
-               FB_VMODE_NONINTERLACED
-       }}, 
-       { "800x490-8", {                /* Cybervision 8 bpp */
-               /* NO Acceleration */
-               800, 490, 800, 490, 0, 0, 8, 0,
-               {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-               0, 0, -1, -1, FB_ACCEL_NONE, 33333, 80, 24, 23, 1, 56, 8,
-               FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT,
-               FB_VMODE_NONINTERLACED
-       }},
-/* I can't test these with my monitor, but I suspect they will
- * be OK, since Antonio Santos indicated he had tested them in
- * his system.
- */
-       { "800x600-8", {                /* Cybervision 8 bpp */
-               800, 600, 800, 600, 0, 0, 8, 0,
-               {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-               0, 0, -1, -1, FB_ACCELF_TEXT, 27778, 64, 24, 22, 1, 72, 2,
-               FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT,
-               FB_VMODE_NONINTERLACED
-       }},
-       { "1024x768-8", {               /* Cybervision 8 bpp */
-               1024, 768, 1024, 768, 0, 0, 8, 0,
-               {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-               0, 0, -1, -1, FB_ACCELF_TEXT, 16667, 224, 72, 60, 12, 168, 4,
-               FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT,
-               FB_VMODE_NONINTERLACED
-       }},
-       { "1152x886-8", {               /* Cybervision 8 bpp */
-               1152, 886, 1152, 886, 0, 0, 8, 0,
-               {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-               0, 0, -1, -1, FB_ACCELF_TEXT, 15873, 184, 40, 24, 1, 56, 16,
-               FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT,
-               FB_VMODE_NONINTERLACED
-       }},
-       { "1280x1024-8", {      /* Cybervision 8 bpp */
-               1280, 1024, 1280, 1024, 0, 0, 8, 0,
-               {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-               0, 0, -1, -1, FB_ACCELF_TEXT, 16667, 256, 48, 50, 12, 72, 4,
-               FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT,
-               FB_VMODE_INTERLACED
-       }}
-};
-
-#define NUM_TOTAL_MODES    ARRAY_SIZE(cyberfb_predefined)
-
-static int Cyberfb_inverse = 0;
-
-/*
- *    Some default modes
- */
-
-#define CYBER8_DEFMODE     (0)
-#define CYBER16_DEFMODE    (1)
-
-static struct fb_var_screeninfo cyberfb_default;
-static int cyberfb_usermode __initdata = 0;
-
-/*
- *    Interface used by the world
- */
-
-int cyberfb_setup(char *options);
-
-static int cyberfb_get_fix(struct fb_fix_screeninfo *fix, int con,
-                          struct fb_info *info);
-static int cyberfb_get_var(struct fb_var_screeninfo *var, int con,
-                          struct fb_info *info);
-static int cyberfb_set_var(struct fb_var_screeninfo *var, int con,
-                          struct fb_info *info);
-static int cyberfb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
-                           struct fb_info *info);
-static int cyberfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
-                            u_int transp, struct fb_info *info);
-static int cyberfb_blank(int blank, struct fb_info *info);
-
-/*
- *    Interface to the low level console driver
- */
-
-int cyberfb_init(void);
-static int Cyberfb_switch(int con, struct fb_info *info);
-static int Cyberfb_updatevar(int con, struct fb_info *info);
-
-/*
- *    Text console acceleration
- */
-
-#ifdef FBCON_HAS_CFB8
-static struct display_switch fbcon_cyber8;
-#endif
-
-/*
- *    Accelerated Functions used by the low level console driver
- */
-
-static void Cyber_WaitQueue(u_short fifo);
-static void Cyber_WaitBlit(void);
-static void Cyber_BitBLT(u_short curx, u_short cury, u_short destx,
-                        u_short desty, u_short width, u_short height,
-                        u_short mode);
-static void Cyber_RectFill(u_short x, u_short y, u_short width, u_short height,
-                          u_short mode, u_short color);
-#if 0
-static void Cyber_MoveCursor(u_short x, u_short y);
-#endif
-
-/*
- *   Hardware Specific Routines
- */
-
-static int Cyber_init(void);
-static int Cyber_encode_fix(struct fb_fix_screeninfo *fix,
-                           struct cyberfb_par *par);
-static int Cyber_decode_var(struct fb_var_screeninfo *var,
-                           struct cyberfb_par *par);
-static int Cyber_encode_var(struct fb_var_screeninfo *var,
-                           struct cyberfb_par *par);
-static int Cyber_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
-                          u_int *transp, struct fb_info *info);
-
-/*
- *    Internal routines
- */
-
-static void cyberfb_get_par(struct cyberfb_par *par);
-static void cyberfb_set_par(struct cyberfb_par *par);
-static int do_fb_set_var(struct fb_var_screeninfo *var, int isactive);
-static void cyberfb_set_disp(int con, struct fb_info *info);
-static int get_video_mode(const char *name);
-
-/* For cvision_core.c */
-static unsigned short cv64_compute_clock(unsigned long);
-static int cv_has_4mb (volatile unsigned char *);
-static void cv64_board_init (void);
-static void cv64_load_video_mode (struct fb_var_screeninfo *);
-
-
-/* -------------------- Hardware specific routines ------------------------- */
-
-
-/*
- *    Initialization
- *
- *    Set the default video mode for this chipset. If a video mode was
- *    specified on the command line, it will override the default mode.
- */
-
-static int Cyber_init(void)
-{
-       volatile unsigned char *regs = CyberRegs;
-       volatile unsigned long *CursorBase;
-       int i;
-       DPRINTK("ENTER\n");
-
-/* Init local cmap as greyscale levels */
-       for (i = 0; i < 256; i++) {
-               Cyber_colour_table [i][0] = i;
-               Cyber_colour_table [i][1] = i;
-               Cyber_colour_table [i][2] = i;
-       }
-
-/* Initialize the board and determine fbmem size */
-       cv64_board_init(); 
-#ifdef CYBERFBDEBUG
-       DPRINTK("Register state after initing board\n");
-       cv64_dump();
-#endif
-/* Clear framebuffer memory */
-       DPRINTK("Clear framebuffer memory\n");
-       memset ((char *)CyberMem, 0, CyberSize);
-
-/* Disable hardware cursor */
-       DPRINTK("Disable HW cursor\n");
-       wb_64(regs, S3_CRTC_ADR, S3_REG_LOCK2);
-       wb_64(regs, S3_CRTC_DATA, 0xa0);
-       wb_64(regs, S3_CRTC_ADR, S3_HGC_MODE);
-       wb_64(regs, S3_CRTC_DATA, 0x00);
-       wb_64(regs, S3_CRTC_ADR, S3_HWGC_DX);
-       wb_64(regs, S3_CRTC_DATA, 0x00);
-       wb_64(regs, S3_CRTC_ADR, S3_HWGC_DY);
-       wb_64(regs, S3_CRTC_DATA, 0x00);
-
-/* Initialize hardware cursor */
-       DPRINTK("Init HW cursor\n");
-       CursorBase = (u_long *)((char *)(CyberMem) + CyberSize - 0x400);
-       for (i=0; i < 8; i++)
-       {
-               *(CursorBase  +(i*4)) = 0xffffff00;
-               *(CursorBase+1+(i*4)) = 0xffff0000;
-               *(CursorBase+2+(i*4)) = 0xffff0000;
-               *(CursorBase+3+(i*4)) = 0xffff0000;
-       }
-       for (i=8; i < 64; i++)
-       {
-               *(CursorBase  +(i*4)) = 0xffff0000;
-               *(CursorBase+1+(i*4)) = 0xffff0000;
-               *(CursorBase+2+(i*4)) = 0xffff0000;
-               *(CursorBase+3+(i*4)) = 0xffff0000;
-       }
-
-       cyberfb_setcolreg (255, 56<<8, 100<<8, 160<<8, 0, NULL /* unused */);
-       cyberfb_setcolreg (254, 0, 0, 0, 0, NULL /* unused */);
-
-       DPRINTK("EXIT\n");
-       return 0;
-}
-
-
-/*
- *    This function should fill in the `fix' structure based on the
- *    values in the `par' structure.
- */
-
-static int Cyber_encode_fix(struct fb_fix_screeninfo *fix,
-                           struct cyberfb_par *par)
-{
-       DPRINTK("ENTER\n");
-       memset(fix, 0, sizeof(struct fb_fix_screeninfo));
-       strcpy(fix->id, cyberfb_name);
-       fix->smem_start = CyberMem_phys;
-       fix->smem_len = CyberSize;
-       fix->mmio_start = CyberRegs_phys;
-       fix->mmio_len = 0x10000;
-
-       fix->type = FB_TYPE_PACKED_PIXELS;
-       fix->type_aux = 0;
-       if (par->var.bits_per_pixel == 15 || par->var.bits_per_pixel == 16 ||
-           par->var.bits_per_pixel == 24 || par->var.bits_per_pixel == 32) {
-               fix->visual = FB_VISUAL_DIRECTCOLOR;
-       } else {
-               fix->visual = FB_VISUAL_PSEUDOCOLOR;
-       }
-
-       fix->xpanstep = 0;
-       fix->ypanstep = 0;
-       fix->ywrapstep = 0;
-       fix->line_length = 0;
-       fix->accel = FB_ACCEL_S3_TRIO64;
-
-       DPRINTK("EXIT\n");
-       return(0);
-}
-
-
-/*
-*    Fill the `par' structure based on the values in `var'.
-*    TODO: Verify and adjust values, return -EINVAL if bad.
-*/
-
-static int Cyber_decode_var(struct fb_var_screeninfo *var,
-                           struct cyberfb_par *par)
-{
-       DPRINTK("ENTER\n");
-       par->var.xres = var->xres;
-       par->var.yres = var->yres;
-       par->var.xres_virtual = var->xres_virtual;
-       par->var.yres_virtual = var->yres_virtual;
-       par->var.xoffset = var->xoffset;
-       par->var.yoffset = var->yoffset;
-       par->var.bits_per_pixel = var->bits_per_pixel;
-       par->var.grayscale = var->grayscale;
-       par->var.red = var->red;
-       par->var.green = var->green;
-       par->var.blue = var->blue;
-       par->var.transp = var->transp;
-       par->var.nonstd = var->nonstd;
-       par->var.activate = var->activate;
-       par->var.height = var->height;
-       par->var.width = var->width;
-       if (var->accel_flags & FB_ACCELF_TEXT) {
-               par->var.accel_flags = FB_ACCELF_TEXT;
-       } else {
-               par->var.accel_flags = 0;
-       }
-       par->var.pixclock = var->pixclock;
-       par->var.left_margin = var->left_margin;
-       par->var.right_margin = var->right_margin;
-       par->var.upper_margin = var->upper_margin;
-       par->var.lower_margin = var->lower_margin;
-       par->var.hsync_len = var->hsync_len;
-       par->var.vsync_len = var->vsync_len;
-       par->var.sync = var->sync;
-       par->var.vmode = var->vmode;
-       DPRINTK("EXIT\n");
-       return(0);
-}
-
-/*
-*    Fill the `var' structure based on the values in `par' and maybe
-*    other values read out of the hardware.
-*/
-
-static int Cyber_encode_var(struct fb_var_screeninfo *var,
-                           struct cyberfb_par *par)
-{
-       DPRINTK("ENTER\n");
-       var->xres = par->var.xres;
-       var->yres = par->var.yres;
-       var->xres_virtual = par->var.xres_virtual;
-       var->yres_virtual = par->var.yres_virtual;
-       var->xoffset = par->var.xoffset;
-       var->yoffset = par->var.yoffset;
-
-       var->bits_per_pixel = par->var.bits_per_pixel;
-       var->grayscale = par->var.grayscale;
-
-       var->red = par->var.red;
-       var->green = par->var.green;
-       var->blue = par->var.blue;
-       var->transp = par->var.transp;
-
-       var->nonstd = par->var.nonstd;
-       var->activate = par->var.activate;
-
-       var->height = par->var.height;
-       var->width = par->var.width;
-
-       var->accel_flags = par->var.accel_flags;
-
-       var->pixclock = par->var.pixclock;
-       var->left_margin = par->var.left_margin;
-       var->right_margin = par->var.right_margin;
-       var->upper_margin = par->var.upper_margin;
-       var->lower_margin = par->var.lower_margin;
-       var->hsync_len = par->var.hsync_len;
-       var->vsync_len = par->var.vsync_len;
-       var->sync = par->var.sync;
-       var->vmode = par->var.vmode;
-       
-       DPRINTK("EXIT\n");
-       return(0);
-}
-
-
-/*
- *    Set a single color register. Return != 0 for invalid regno.
- */
-
-static int cyberfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
-                          u_int transp, struct fb_info *info)
-{
-       volatile unsigned char *regs = CyberRegs;
-
-       /*DPRINTK("ENTER\n");*/
-       if (regno > 255) {
-               DPRINTK("EXIT - Register # > 255\n");
-               return (1);
-       }
-
-       wb_64(regs, 0x3c8, (unsigned char) regno);
-
-       red >>= 10;
-       green >>= 10;
-       blue >>= 10;
-
-       Cyber_colour_table [regno][0] = red;
-       Cyber_colour_table [regno][1] = green;
-       Cyber_colour_table [regno][2] = blue;
-
-       wb_64(regs, 0x3c9, red);
-       wb_64(regs, 0x3c9, green);
-       wb_64(regs, 0x3c9, blue);
-
-       /*DPRINTK("EXIT\n");*/
-       return (0);
-}
-
-
-/*
-*    Read a single color register and split it into
-*    colors/transparent. Return != 0 for invalid regno.
-*/
-
-static int Cyber_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
-                          u_int *transp, struct fb_info *info)
-{
-       int t;
-
-       /*DPRINTK("ENTER\n");*/
-       if (regno > 255) {
-               DPRINTK("EXIT - Register # > 255\n");
-               return (1);
-       }
-       /* ARB This shifting & oring seems VERY strange */
-       t       = Cyber_colour_table [regno][0];
-       *red    = (t<<10) | (t<<4) | (t>>2);
-       t       = Cyber_colour_table [regno][1];
-       *green  = (t<<10) | (t<<4) | (t>>2);
-       t       = Cyber_colour_table [regno][2];
-       *blue   = (t<<10) | (t<<4) | (t>>2);
-       *transp = 0;
-       /*DPRINTK("EXIT\n");*/
-       return (0);
-}
-
-
-/*
-*    (Un)Blank the screen
-*    blank: 1 = zero fb cmap
-*           0 = restore fb cmap from local cmap
-*/
-static int cyberfb_blank(int blank, struct fb_info *info)
-{
-       volatile unsigned char *regs = CyberRegs;
-       int i;
-
-       DPRINTK("ENTER\n");
-#if 0
-/* Blank by turning gfx off */
-       gfx_on_off (1, regs);
-#else
-       if (blank) {
-               for (i = 0; i < 256; i++) {
-                       wb_64(regs, 0x3c8, (unsigned char) i);
-                       /* ARB Pale red to detect this blanking method */
-                       wb_64(regs, 0x3c9, 48); 
-                       wb_64(regs, 0x3c9, 0);
-                       wb_64(regs, 0x3c9, 0);
-               }
-       } else {
-               for (i = 0; i < 256; i++) {
-                       wb_64(regs, 0x3c8, (unsigned char) i);
-                       wb_64(regs, 0x3c9, Cyber_colour_table[i][0]);
-                       wb_64(regs, 0x3c9, Cyber_colour_table[i][1]);
-                       wb_64(regs, 0x3c9, Cyber_colour_table[i][2]);
-               }
-       }
-#endif
-       DPRINTK("EXIT\n");
-       return 0;
-}
-
-
-/**************************************************************
- * We are waiting for "fifo" FIFO-slots empty
- */
-static void Cyber_WaitQueue (u_short fifo)
-{
-       unsigned short status;
-
-       DPRINTK("ENTER\n");
-       do {
-               status = *((u_short volatile *)(CyberRegs + S3_GP_STAT));
-       } while (status & fifo);
-       DPRINTK("EXIT\n");
-}
-
-/**************************************************************
- * We are waiting for Hardware (Graphics Engine) not busy
- */
-static void Cyber_WaitBlit (void)
-{
-       unsigned short status;
-
-       DPRINTK("ENTER\n");
-       do {
-               status = *((u_short volatile *)(CyberRegs + S3_GP_STAT));
-       } while (status & S3_HDW_BUSY);
-       DPRINTK("EXIT\n");
-}
-
-/**************************************************************
- * BitBLT - Through the Plane
- */
-static void Cyber_BitBLT (u_short curx, u_short cury, u_short destx,
-                         u_short desty, u_short width, u_short height,
-                         u_short mode)
-{
-       volatile unsigned char *regs = CyberRegs;
-       u_short blitcmd = S3_BITBLT;
-
-       DPRINTK("ENTER\n");
-       /* Set drawing direction */
-       /* -Y, X maj, -X (default) */
-       if (curx > destx) {
-               blitcmd |= 0x0020;  /* Drawing direction +X */
-       } else {
-               curx  += (width - 1);
-               destx += (width - 1);
-       }
-
-       if (cury > desty) {
-               blitcmd |= 0x0080;  /* Drawing direction +Y */
-       } else {
-               cury  += (height - 1);
-               desty += (height - 1);
-       }
-
-       Cyber_WaitQueue (0x8000);
-
-       *((u_short volatile *)(regs + S3_PIXEL_CNTL)) = 0xa000;
-       *((u_short volatile *)(regs + S3_FRGD_MIX)) = (0x0060 | mode);
-
-       *((u_short volatile *)(regs + S3_CUR_X)) = curx;
-       *((u_short volatile *)(regs + S3_CUR_Y)) = cury;
-
-       *((u_short volatile *)(regs + S3_DESTX_DIASTP)) = destx;
-       *((u_short volatile *)(regs + S3_DESTY_AXSTP)) = desty;
-
-       *((u_short volatile *)(regs + S3_MIN_AXIS_PCNT)) = height - 1;
-       *((u_short volatile *)(regs + S3_MAJ_AXIS_PCNT)) = width  - 1;
-
-       *((u_short volatile *)(regs + S3_CMD)) = blitcmd;
-       DPRINTK("EXIT\n");
-}
-
-/**************************************************************
- * Rectangle Fill Solid
- */
-static void Cyber_RectFill (u_short x, u_short y, u_short width,
-                           u_short height, u_short mode, u_short color)
-{
-       volatile unsigned char *regs = CyberRegs;
-       u_short blitcmd = S3_FILLEDRECT;
-
-       DPRINTK("ENTER\n");
-       Cyber_WaitQueue (0x8000);
-
-       *((u_short volatile *)(regs + S3_PIXEL_CNTL)) = 0xa000;
-       *((u_short volatile *)(regs + S3_FRGD_MIX)) = (0x0020 | mode);
-
-       *((u_short volatile *)(regs + S3_MULT_MISC)) = 0xe000;
-       *((u_short volatile *)(regs + S3_FRGD_COLOR)) = color;
-
-       *((u_short volatile *)(regs + S3_CUR_X)) = x;
-       *((u_short volatile *)(regs + S3_CUR_Y)) = y;
-
-       *((u_short volatile *)(regs + S3_MIN_AXIS_PCNT)) = height - 1;
-       *((u_short volatile *)(regs + S3_MAJ_AXIS_PCNT)) = width  - 1;
-
-       *((u_short volatile *)(regs + S3_CMD)) = blitcmd;
-       DPRINTK("EXIT\n");
-}
-
-
-#if 0
-/**************************************************************
- * Move cursor to x, y
- */
-static void Cyber_MoveCursor (u_short x, u_short y)
-{
-       volatile unsigned char *regs = CyberRegs;
-       DPRINTK("ENTER\n");
-       *(regs + S3_CRTC_ADR)  = 0x39;
-       *(regs + S3_CRTC_DATA) = 0xa0;
-
-       *(regs + S3_CRTC_ADR)  = S3_HWGC_ORGX_H;
-       *(regs + S3_CRTC_DATA) = (char)((x & 0x0700) >> 8);
-       *(regs + S3_CRTC_ADR)  = S3_HWGC_ORGX_L;
-       *(regs + S3_CRTC_DATA) = (char)(x & 0x00ff);
-
-       *(regs + S3_CRTC_ADR)  = S3_HWGC_ORGY_H;
-       *(regs + S3_CRTC_DATA) = (char)((y & 0x0700) >> 8);
-       *(regs + S3_CRTC_ADR)  = S3_HWGC_ORGY_L;
-       *(regs + S3_CRTC_DATA) = (char)(y & 0x00ff);
-       DPRINTK("EXIT\n");
-}
-#endif
-
-
-/* -------------------- Generic routines ---------------------------------- */
-
-
-/*
- *    Fill the hardware's `par' structure.
- */
-
-static void cyberfb_get_par(struct cyberfb_par *par)
-{
-       DPRINTK("ENTER\n");
-       if (current_par_valid) {
-               *par = current_par;
-       } else {
-               Cyber_decode_var(&cyberfb_default, par);
-       }
-       DPRINTK("EXIT\n");
-}
-
-
-static void cyberfb_set_par(struct cyberfb_par *par)
-{
-       DPRINTK("ENTER\n");
-       current_par = *par;
-       current_par_valid = 1;
-       DPRINTK("EXIT\n");
-}
-
-
-static void cyber_set_video(struct fb_var_screeninfo *var)
-{
-
-       /* Load the video mode defined by the 'var' data */
-       cv64_load_video_mode (var);
-#ifdef CYBERFBDEBUG
-       DPRINTK("Register state after loading video mode\n");
-       cv64_dump();
-#endif
-}
-
-
-static int do_fb_set_var(struct fb_var_screeninfo *var, int isactive)
-{
-       int err, activate;
-       struct cyberfb_par par;
-
-       DPRINTK("ENTER\n");
-       if ((err = Cyber_decode_var(var, &par))) {
-               DPRINTK("EXIT - decode_var failed\n");
-               return(err);
-       }
-       activate = var->activate;
-       if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW && isactive)
-               cyberfb_set_par(&par);
-       Cyber_encode_var(var, &par);
-       var->activate = activate;
-
-       cyber_set_video(var);
-       DPRINTK("EXIT\n");
-       return 0;
-}
-
-/*
- *    Get the Fixed Part of the Display
- */
-
-static int cyberfb_get_fix(struct fb_fix_screeninfo *fix, int con,
-                          struct fb_info *info)
-{
-       struct cyberfb_par par;
-       int error = 0;
-
-       DPRINTK("ENTER\n");
-       if (con == -1) {
-               cyberfb_get_par(&par);
-       } else {
-               error = Cyber_decode_var(&fb_display[con].var, &par);
-       }
-       DPRINTK("EXIT\n");
-       return(error ? error : Cyber_encode_fix(fix, &par));
-}
-
-
-/*
- *    Get the User Defined Part of the Display
- */
-
-static int cyberfb_get_var(struct fb_var_screeninfo *var, int con,
-                          struct fb_info *info)
-{
-       struct cyberfb_par par;
-       int error = 0;
-
-       DPRINTK("ENTER\n");
-       if (con == -1) {
-               cyberfb_get_par(&par);
-               error = Cyber_encode_var(var, &par);
-               disp.var = *var;   /* ++Andre: don't know if this is the right place */
-       } else {
-               *var = fb_display[con].var;
-       }
-
-       DPRINTK("EXIT\n");
-       return(error);
-}
-
-
-static void cyberfb_set_disp(int con, struct fb_info *info)
-{
-       struct fb_fix_screeninfo fix;
-       struct display *display;
-
-       DPRINTK("ENTER\n");
-       if (con >= 0)
-               display = &fb_display[con];
-       else
-               display = &disp;        /* used during initialization */
-
-       cyberfb_get_fix(&fix, con, info);
-       if (con == -1)
-               con = 0;
-       display->visual = fix.visual;
-       display->type = fix.type;
-       display->type_aux = fix.type_aux;
-       display->ypanstep = fix.ypanstep;
-       display->ywrapstep = fix.ywrapstep;
-       display->can_soft_blank = 1;
-       display->inverse = Cyberfb_inverse;
-       switch (display->var.bits_per_pixel) {
-#ifdef FBCON_HAS_CFB8
-           case 8:
-               if (display->var.accel_flags & FB_ACCELF_TEXT) {
-                   display->dispsw = &fbcon_cyber8;
-#warning FIXME: We should reinit the graphics engine here
-               } else
-                   display->dispsw = &fbcon_cfb8;
-               break;
-#endif
-#ifdef FBCON_HAS_CFB16
-           case 16:
-               display->dispsw = &fbcon_cfb16;
-               break;
-#endif
-           default:
-               display->dispsw = NULL;
-               break;
-       }
-       DPRINTK("EXIT\n");
-}
-
-
-/*
- *    Set the User Defined Part of the Display
- */
-
-static int cyberfb_set_var(struct fb_var_screeninfo *var, int con,
-                          struct fb_info *info)
-{
-       int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp, oldaccel;
-
-       DPRINTK("ENTER\n");
-       if ((err = do_fb_set_var(var, con == info->currcon))) {
-               DPRINTK("EXIT - do_fb_set_var failed\n");
-               return(err);
-       }
-       if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) {
-               oldxres = fb_display[con].var.xres;
-               oldyres = fb_display[con].var.yres;
-               oldvxres = fb_display[con].var.xres_virtual;
-               oldvyres = fb_display[con].var.yres_virtual;
-               oldbpp = fb_display[con].var.bits_per_pixel;
-               oldaccel = fb_display[con].var.accel_flags;
-               fb_display[con].var = *var;
-               if (oldxres != var->xres || oldyres != var->yres ||
-                   oldvxres != var->xres_virtual ||
-                   oldvyres != var->yres_virtual ||
-                   oldbpp != var->bits_per_pixel ||
-                   oldaccel != var->accel_flags) {
-                       cyberfb_set_disp(con, info);
-                       (*fb_info.changevar)(con);
-                       fb_alloc_cmap(&fb_display[con].cmap, 0, 0);
-                       do_install_cmap(con, info);
-               }
-       }
-       var->activate = 0;
-       DPRINTK("EXIT\n");
-       return(0);
-}
-
-
-/*
- *    Get the Colormap
- */
-
-static int cyberfb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
-                           struct fb_info *info)
-{
-       DPRINTK("ENTER\n");
-       if (con == info->currcon) { /* current console? */
-               DPRINTK("EXIT - console is current console\n");
-               return(fb_get_cmap(cmap, kspc, Cyber_getcolreg, info));
-       } else if (fb_display[con].cmap.len) { /* non default colormap? */
-               DPRINTK("Use console cmap\n");
-               fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
-       } else {
-               DPRINTK("Use default cmap\n");
-               fb_copy_cmap(fb_default_cmap(1<<fb_display[con].var.bits_per_pixel),
-                            cmap, kspc ? 0 : 2);
-       }
-       DPRINTK("EXIT\n");
-       return(0);
-}
-
-static struct fb_ops cyberfb_ops = {
-       .owner =        THIS_MODULE,
-       .fb_get_fix =   cyberfb_get_fix,
-       .fb_get_var =   cyberfb_get_var,
-       .fb_set_var =   cyberfb_set_var,
-       .fb_get_cmap =  cyberfb_get_cmap,
-       .fb_set_cmap =  gen_set_cmap,
-       .fb_setcolreg = cyberfb_setcolreg,
-       .fb_blank =     cyberfb_blank,
-};
-
-int __init cyberfb_setup(char *options)
-{
-       char *this_opt;
-       DPRINTK("ENTER\n");
-
-       fb_info.fontname[0] = '\0';
-
-       if (!options || !*options) {
-               DPRINTK("EXIT - no options\n");
-               return 0;
-       }
-
-       while ((this_opt = strsep(&options, ",")) != NULL) {
-               if (!*this_opt)
-                       continue;
-               if (!strcmp(this_opt, "inverse")) {
-                       Cyberfb_inverse = 1;
-                       fb_invert_cmaps();
-               } else if (!strncmp(this_opt, "font:", 5)) {
-                       strcpy(fb_info.fontname, this_opt+5);
-               } else if (!strcmp (this_opt, "cyber8")) {
-                       cyberfb_default = cyberfb_predefined[CYBER8_DEFMODE].var;
-                       cyberfb_usermode = 1;
-               } else if (!strcmp (this_opt, "cyber16")) {
-                       cyberfb_default = cyberfb_predefined[CYBER16_DEFMODE].var;
-                       cyberfb_usermode = 1;
-               } else get_video_mode(this_opt);
-       }
-
-       DPRINTK("default mode: xres=%d, yres=%d, bpp=%d\n",
-               cyberfb_default.xres,
-               cyberfb_default.yres,
-               cyberfb_default.bits_per_pixel);
-       DPRINTK("EXIT\n");
-       return 0;
-}
-
-/*
- *    Initialization
- */
-
-int __init cyberfb_init(void)
-{
-       unsigned long board_addr, board_size;
-       struct cyberfb_par par;
-       struct zorro_dev *z = NULL;
-       DPRINTK("ENTER\n");
-
-       while ((z = zorro_find_device(ZORRO_PROD_PHASE5_CYBERVISION64, z))) {
-           board_addr = z->resource.start;
-           board_size = z->resource.end-z->resource.start+1;
-           CyberMem_phys = board_addr + 0x01400000;
-           CyberRegs_phys = CyberMem_phys + 0x00c00000;
-           if (!request_mem_region(CyberRegs_phys, 0x10000, "S3 Trio64"))
-               continue;
-           if (!request_mem_region(CyberMem_phys, 0x400000, "RAM")) {
-               release_mem_region(CyberRegs_phys, 0x10000);
-               continue;
-           }
-           DPRINTK("board_addr=%08lx\n", board_addr);
-           DPRINTK("board_size=%08lx\n", board_size);
-
-           CyberBase = ioremap(board_addr, board_size);
-           CyberRegs = CyberBase + 0x02000000;
-           CyberMem = CyberBase + 0x01400000;
-           DPRINTK("CyberBase=%08lx CyberRegs=%08lx CyberMem=%08lx\n",
-                   CyberBase, (long unsigned int)CyberRegs, CyberMem);
-
-#ifdef CYBERFBDEBUG
-           DPRINTK("Register state just after mapping memory\n");
-           cv64_dump();
-#endif
-
-           strcpy(fb_info.modename, cyberfb_name);
-           fb_info.changevar = NULL;
-           fb_info.fbops = &cyberfb_ops;
-           fb_info.screen_base = (unsigned char *)CyberMem;
-           fb_info.disp = &disp;
-           fb_info.currcon = -1;
-           fb_info.switch_con = &Cyberfb_switch;
-           fb_info.updatevar = &Cyberfb_updatevar;
-
-           Cyber_init();
-           /* ++Andre: set cyberfb default mode */
-           if (!cyberfb_usermode) {
-                   cyberfb_default = cyberfb_predefined[CYBER8_DEFMODE].var;
-                   DPRINTK("Use default cyber8 mode\n");
-           }
-           Cyber_decode_var(&cyberfb_default, &par);
-           Cyber_encode_var(&cyberfb_default, &par);
-
-           do_fb_set_var(&cyberfb_default, 1);
-           cyberfb_get_var(&fb_display[0].var, -1, &fb_info);
-           cyberfb_set_disp(-1, &fb_info);
-           do_install_cmap(0, &fb_info);
-
-           if (register_framebuffer(&fb_info) < 0) {
-                   DPRINTK("EXIT - register_framebuffer failed\n");
-                       if (CyberBase)
-                               iounmap(CyberBase);
-                   release_mem_region(CyberMem_phys, 0x400000);
-                   release_mem_region(CyberRegs_phys, 0x10000);
-                   return -EINVAL;
-           }
-
-           printk("fb%d: %s frame buffer device, using %ldK of video memory\n",
-                  fb_info.node, fb_info.modename, CyberSize>>10);
-
-           /* TODO: This driver cannot be unloaded yet */
-           DPRINTK("EXIT\n");
-           return 0;
-       }
-       return -ENXIO;
-}
-
-
-static int Cyberfb_switch(int con, struct fb_info *info)
-{
-        DPRINTK("ENTER\n");
-       /* Do we have to save the colormap? */
-       if (fb_display[info->currcon].cmap.len) {
-               fb_get_cmap(&fb_display[info->currcon].cmap, 1, Cyber_getcolreg,
-                           info);
-       }
-
-       do_fb_set_var(&fb_display[con].var, 1);
-       info->currcon = con;
-       /* Install new colormap */
-       do_install_cmap(con, info);
-       DPRINTK("EXIT\n");
-       return(0);
-}
-
-
-/*
- *    Update the `var' structure (called by fbcon.c)
- *
- *    This call looks only at yoffset and the FB_VMODE_YWRAP flag in `var'.
- *    Since it's called by a kernel driver, no range checking is done.
- */
-
-static int Cyberfb_updatevar(int con, struct fb_info *info)
-{
-       DPRINTK("Enter - Exit\n");
-       return(0);
-}
-
-
-/*
- *    Get a Video Mode
- */
-
-static int __init get_video_mode(const char *name)
-{
-       int i;
-
-       DPRINTK("ENTER\n");
-       for (i = 0; i < NUM_TOTAL_MODES; i++) {
-               if (!strcmp(name, cyberfb_predefined[i].name)) {
-                       cyberfb_default = cyberfb_predefined[i].var;
-                       cyberfb_usermode = 1;
-                       DPRINTK("EXIT - Matched predefined mode\n");
-                       return(i);
-               }
-       }
-       return(0);
-}
-
-
-/*
- *    Text console acceleration
- */
-
-#ifdef FBCON_HAS_CFB8
-static void fbcon_cyber8_bmove(struct display *p, int sy, int sx, int dy,
-                              int dx, int height, int width)
-{
-       DPRINTK("ENTER\n");
-       sx *= 8; dx *= 8; width *= 8;
-       Cyber_BitBLT((u_short)sx, (u_short)(sy*fontheight(p)), (u_short)dx,
-                    (u_short)(dy*fontheight(p)), (u_short)width,
-                    (u_short)(height*fontheight(p)), (u_short)S3_NEW);
-       DPRINTK("EXIT\n");
-}
-
-static void fbcon_cyber8_clear(struct vc_data *conp, struct display *p, int sy,
-                              int sx, int height, int width)
-{
-       unsigned char bg;
-
-       DPRINTK("ENTER\n");
-       sx *= 8; width *= 8;
-       bg = attr_bgcol_ec(p,conp);
-       Cyber_RectFill((u_short)sx,
-                      (u_short)(sy*fontheight(p)),
-                      (u_short)width,
-                      (u_short)(height*fontheight(p)),
-                      (u_short)S3_NEW,
-                      (u_short)bg);
-       DPRINTK("EXIT\n");
-}
-
-static void fbcon_cyber8_putc(struct vc_data *conp, struct display *p, int c,
-                             int yy, int xx)
-{
-       DPRINTK("ENTER\n");
-       Cyber_WaitBlit();
-       fbcon_cfb8_putc(conp, p, c, yy, xx);
-       DPRINTK("EXIT\n");
-}
-
-static void fbcon_cyber8_putcs(struct vc_data *conp, struct display *p,
-                              const unsigned short *s, int count,
-                              int yy, int xx)
-{
-       DPRINTK("ENTER\n");
-       Cyber_WaitBlit();
-       fbcon_cfb8_putcs(conp, p, s, count, yy, xx);
-       DPRINTK("EXIT\n");
-}
-
-static void fbcon_cyber8_revc(struct display *p, int xx, int yy)
-{
-       DPRINTK("ENTER\n");
-       Cyber_WaitBlit();
-       fbcon_cfb8_revc(p, xx, yy);
-       DPRINTK("EXIT\n");
-}
-
-static struct display_switch fbcon_cyber8 = {
-       .setup =        fbcon_cfb8_setup,
-       .bmove =        fbcon_cyber8_bmove,
-       .clear =        fbcon_cyber8_clear,
-       .putc =         fbcon_cyber8_putc,
-       .putcs =        fbcon_cyber8_putcs,
-       .revc =         fbcon_cyber8_revc,
-       .clear_margins =fbcon_cfb8_clear_margins,
-       .fontwidthmask =FONTWIDTH(8)
-};
-#endif
-
-
-#ifdef MODULE
-MODULE_LICENSE("GPL");
-
-int init_module(void)
-{
-       return cyberfb_init();
-}
-#endif /* MODULE */
-
-/*
- *
- * Low level initialization routines for the CyberVision64 graphics card
- *
- * Most of the following code is from cvision_core.c
- *
- */
-
-#define MAXPIXELCLOCK 135000000 /* safety */
-
-#ifdef CV_AGGRESSIVE_TIMING
-long cv64_memclk = 55000000;
-#else
-long cv64_memclk = 50000000;
-#endif
-
-/*********************/
-
-static unsigned char clocks[]={
-  0x13, 0x61, 0x6b, 0x6d, 0x51, 0x69, 0x54, 0x69,
-  0x4f, 0x68, 0x6b, 0x6b, 0x18, 0x61, 0x7b, 0x6c,
-  0x51, 0x67, 0x24, 0x62, 0x56, 0x67, 0x77, 0x6a,
-  0x1d, 0x61, 0x53, 0x66, 0x6b, 0x68, 0x79, 0x69,
-  0x7c, 0x69, 0x7f, 0x69, 0x22, 0x61, 0x54, 0x65,
-  0x56, 0x65, 0x58, 0x65, 0x67, 0x66, 0x41, 0x63,
-  0x27, 0x61, 0x13, 0x41, 0x37, 0x62, 0x6b, 0x4d,
-  0x23, 0x43, 0x51, 0x49, 0x79, 0x66, 0x54, 0x49,
-  0x7d, 0x66, 0x34, 0x56, 0x4f, 0x63, 0x1f, 0x42,
-  0x6b, 0x4b, 0x7e, 0x4d, 0x18, 0x41, 0x2a, 0x43,
-  0x7b, 0x4c, 0x74, 0x4b, 0x51, 0x47, 0x65, 0x49,
-  0x24, 0x42, 0x68, 0x49, 0x56, 0x47, 0x75, 0x4a,
-  0x77, 0x4a, 0x31, 0x43, 0x1d, 0x41, 0x71, 0x49,
-  0x53, 0x46, 0x29, 0x42, 0x6b, 0x48, 0x1f, 0x41,
-  0x79, 0x49, 0x6f, 0x48, 0x7c, 0x49, 0x38, 0x43,
-  0x7f, 0x49, 0x5d, 0x46, 0x22, 0x41, 0x53, 0x45,
-  0x54, 0x45, 0x55, 0x45, 0x56, 0x45, 0x57, 0x45,
-  0x58, 0x45, 0x25, 0x41, 0x67, 0x46, 0x5b, 0x45,
-  0x41, 0x43, 0x78, 0x47, 0x27, 0x41, 0x51, 0x44,
-  0x13, 0x21, 0x7d, 0x47, 0x37, 0x42, 0x71, 0x46,
-  0x6b, 0x2d, 0x14, 0x21, 0x23, 0x23, 0x7d, 0x2f,
-  0x51, 0x29, 0x61, 0x2b, 0x79, 0x46, 0x1d, 0x22,
-  0x54, 0x29, 0x45, 0x27, 0x7d, 0x46, 0x7f, 0x46,
-  0x4f, 0x43, 0x2f, 0x41, 0x1f, 0x22, 0x6a, 0x2b,
-  0x6b, 0x2b, 0x5b, 0x29, 0x7e, 0x2d, 0x65, 0x44,
-  0x18, 0x21, 0x5e, 0x29, 0x2a, 0x23, 0x45, 0x26,
-  0x7b, 0x2c, 0x19, 0x21, 0x74, 0x2b, 0x75, 0x2b,
-  0x51, 0x27, 0x3f, 0x25, 0x65, 0x29, 0x40, 0x25,
-  0x24, 0x22, 0x41, 0x25, 0x68, 0x29, 0x42, 0x25,
-  0x56, 0x27, 0x7e, 0x2b, 0x75, 0x2a, 0x1c, 0x21,
-  0x77, 0x2a, 0x4f, 0x26, 0x31, 0x23, 0x6f, 0x29,
-  0x1d, 0x21, 0x32, 0x23, 0x71, 0x29, 0x72, 0x29,
-  0x53, 0x26, 0x69, 0x28, 0x29, 0x22, 0x75, 0x29,
-  0x6b, 0x28, 0x1f, 0x21, 0x1f, 0x21, 0x6d, 0x28,
-  0x79, 0x29, 0x2b, 0x22, 0x6f, 0x28, 0x59, 0x26,
-  0x7c, 0x29, 0x7d, 0x29, 0x38, 0x23, 0x21, 0x21,
-  0x7f, 0x29, 0x39, 0x23, 0x5d, 0x26, 0x75, 0x28,
-  0x22, 0x21, 0x77, 0x28, 0x53, 0x25, 0x6c, 0x27,
-  0x54, 0x25, 0x61, 0x26, 0x55, 0x25, 0x30, 0x22,
-  0x56, 0x25, 0x63, 0x26, 0x57, 0x25, 0x71, 0x27,
-  0x58, 0x25, 0x7f, 0x28, 0x25, 0x21, 0x74, 0x27,
-  0x67, 0x26, 0x40, 0x23, 0x5b, 0x25, 0x26, 0x21,
-  0x41, 0x23, 0x34, 0x22, 0x78, 0x27, 0x6b, 0x26,
-  0x27, 0x21, 0x35, 0x22, 0x51, 0x24, 0x7b, 0x27,
-  0x13, 0x1,  0x13, 0x1,  0x7d, 0x27, 0x4c, 0x9,
-  0x37, 0x22, 0x5b, 0xb,  0x71, 0x26, 0x5c, 0xb,
-  0x6b, 0xd,  0x47, 0x23, 0x14, 0x1,  0x4f, 0x9,
-  0x23, 0x3,  0x75, 0x26, 0x7d, 0xf,  0x1c, 0x2,
-  0x51, 0x9,  0x59, 0x24, 0x61, 0xb,  0x69, 0x25,
-  0x79, 0x26, 0x34, 0x5,  0x1d, 0x2,  0x6b, 0x25,
-  0x54, 0x9,  0x35, 0x5,  0x45, 0x7,  0x6d, 0x25,
-  0x7d, 0x26, 0x16, 0x1,  0x7f, 0x26, 0x77, 0xd,
-  0x4f, 0x23, 0x78, 0xd,  0x2f, 0x21, 0x27, 0x3,
-  0x1f, 0x2,  0x59, 0x9,  0x6a, 0xb,  0x73, 0x25,
-  0x6b, 0xb,  0x63, 0x24, 0x5b, 0x9,  0x20, 0x2,
-  0x7e, 0xd,  0x4b, 0x7,  0x65, 0x24, 0x43, 0x22,
-  0x18, 0x1,  0x6f, 0xb,  0x5e, 0x9,  0x70, 0xb,
-  0x2a, 0x3,  0x33, 0x4,  0x45, 0x6,  0x60, 0x9,
-  0x7b, 0xc,  0x19, 0x1,  0x19, 0x1,  0x7d, 0xc,
-  0x74, 0xb,  0x50, 0x7,  0x75, 0xb,  0x63, 0x9,
-  0x51, 0x7,  0x23, 0x2,  0x3f, 0x5,  0x1a, 0x1,
-  0x65, 0x9,  0x2d, 0x3,  0x40, 0x5,  0x0,  0x0,
-};
-
-/* Console colors */
-unsigned char cvconscolors[16][3] = {  /* background, foreground, hilite */
-  /*  R     G     B  */
-  {0x30, 0x30, 0x30},
-  {0x00, 0x00, 0x00},
-  {0x80, 0x00, 0x00},
-  {0x00, 0x80, 0x00},
-  {0x00, 0x00, 0x80},
-  {0x80, 0x80, 0x00},
-  {0x00, 0x80, 0x80},
-  {0x80, 0x00, 0x80},
-  {0xff, 0xff, 0xff},
-  {0x40, 0x40, 0x40},
-  {0xff, 0x00, 0x00},
-  {0x00, 0xff, 0x00},
-  {0x00, 0x00, 0xff},
-  {0xff, 0xff, 0x00},
-  {0x00, 0xff, 0xff},
-  {0x00, 0x00, 0xff}
-};
-
-/* -------------------- Hardware specific routines ------------------------- */
-
-/* Read Attribute Controller Register=idx */
-inline unsigned char RAttr (volatile unsigned char *regs, short idx)
-{
-       wb_64 (regs, ACT_ADDRESS_W, idx);
-       mb();
-       udelay(100);
-       return (rb_64(regs, ACT_ADDRESS_R));
-}
-
-/* Read Sequencer Register=idx */
-inline unsigned char RSeq (volatile unsigned char *regs, short idx)
-{
-       wb_64 (regs, SEQ_ADDRESS, idx);
-       mb();
-       return (rb_64(regs, SEQ_ADDRESS_R));
-}
-
-/* Read CRT Controller Register=idx */
-inline unsigned char RCrt (volatile unsigned char *regs, short idx)
-{
-       wb_64 (regs, CRT_ADDRESS, idx);
-       mb();
-       return (rb_64(regs, CRT_ADDRESS_R));
-}
-
-/* Read Graphics Controller Register=idx */
-inline unsigned char RGfx (volatile unsigned char *regs, short idx)
-{
-       wb_64 (regs, GCT_ADDRESS, idx);
-       mb();
-       return (rb_64(regs, GCT_ADDRESS_R));
-}
-
-/*
- * Special wakeup/passthrough registers on graphics boards
- */
-
-inline void cv64_write_port (unsigned short bits,
-                            volatile unsigned char *base)
-{
-       volatile unsigned char *addr;
-       static unsigned char cvportbits = 0; /* Mirror port bits here */
-       DPRINTK("ENTER\n");
-
-       addr = base + 0x40001;
-       if (bits & 0x8000) {
-               cvportbits |= bits & 0xff; /* Set bits */
-               DPRINTK("Set bits: %04x\n", bits);
-       } else {
-               bits = bits & 0xff;
-               bits = (~bits) & 0xff;
-               cvportbits &= bits; /* Clear bits */
-               DPRINTK("Clear bits: %04x\n", bits);
-       }
-
-       *addr = cvportbits;
-       DPRINTK("EXIT\n");
-}
-
-/*
- * Monitor switch on CyberVision board
- *
- *  toggle:
- *    0 = CyberVision Signal
- *    1 = Amiga Signal
- *  board = board addr
- *
- */
-inline void cvscreen (int toggle, volatile unsigned char *board)
-{
-       DPRINTK("ENTER\n");
-       if (toggle == 1) {
-               DPRINTK("Show Amiga video\n");
-               cv64_write_port (0x10, board);
-       } else {
-               DPRINTK("Show CyberVision video\n");
-               cv64_write_port (0x8010, board);
-       }
-       DPRINTK("EXIT\n");
-}
-
-/* Control screen display */
-/* toggle: 0 = on, 1 = off */
-/* board = registerbase */
-inline void gfx_on_off(int toggle, volatile unsigned char *regs)
-{
-       int r;
-       DPRINTK("ENTER\n");
-       
-       toggle &= 0x1;
-       toggle = toggle << 5;
-       DPRINTK("Turn display %s\n", (toggle ? "off" : "on"));
-       
-       r = (int) RSeq(regs, SEQ_ID_CLOCKING_MODE);
-       r &= 0xdf;      /* Set bit 5 to 0 */
-       
-       WSeq (regs, SEQ_ID_CLOCKING_MODE, r | toggle);
-       DPRINTK("EXIT\n");
-}
-
-/*
- * Computes M, N, and R values from
- * given input frequency. It uses a table of
- * precomputed values, to keep CPU time low.
- *
- * The return value consist of:
- * lower byte:  Bits 4-0: N Divider Value
- *             Bits 5-6: R Value          for e.g. SR10 or SR12
- * higher byte: Bits 0-6: M divider value  for e.g. SR11 or SR13
- */
-static unsigned short cv64_compute_clock(unsigned long freq)
-{
-       static unsigned char *mnr, *save;       /* M, N + R vals */
-       unsigned long work_freq, r;
-       unsigned short erg;
-       long diff, d2;
-
-       DPRINTK("ENTER\n");
-       if (freq < 12500000 || freq > MAXPIXELCLOCK) {
-               printk("CV64 driver: Illegal clock frequency %ld, using 25MHz\n",
-                      freq);
-               freq = 25000000;
-       }
-       DPRINTK("Freq = %ld\n", freq);
-       mnr = clocks;   /* there the vals are stored */
-       d2 = 0x7fffffff;
-
-       while (*mnr) {  /* mnr vals are 0-terminated */
-               work_freq = (0x37EE * (mnr[0] + 2)) / ((mnr[1] & 0x1F) + 2);
-
-               r = (mnr[1] >> 5) & 0x03;
-               if (r != 0) {
-                       work_freq = work_freq >> r;     /* r is the freq divider */
-               }
-
-               work_freq *= 0x3E8;     /* 2nd part of OSC */
-
-               diff = abs(freq - work_freq);
-
-               if (d2 >= diff) {
-                       d2 = diff;
-                       /* In save are the vals for minimal diff */
-                       save = mnr;
-               }
-               mnr += 2;
-       }
-       erg = *((unsigned short *)save);
-
-       DPRINTK("EXIT\n");
-       return (erg);
-}
-
-static int cv_has_4mb (volatile unsigned char *fb)
-{
-       volatile unsigned long *tr, *tw;
-       DPRINTK("ENTER\n");
-
-       /* write patterns in memory and test if they can be read */
-       tw = (volatile unsigned long *) fb;
-       tr = (volatile unsigned long *) (fb + 0x02000000);
-
-       *tw = 0x87654321;
-       
-       if (*tr != 0x87654321) {
-               DPRINTK("EXIT - <4MB\n");
-               return (0);
-       }
-
-       /* upper memory region */
-       tw = (volatile unsigned long *) (fb + 0x00200000);
-       tr = (volatile unsigned long *) (fb + 0x02200000);
-
-       *tw = 0x87654321;
-
-       if (*tr != 0x87654321) {
-               DPRINTK("EXIT - <4MB\n");
-               return (0);
-       }
-
-       *tw = 0xAAAAAAAA;
-
-       if (*tr != 0xAAAAAAAA) {
-               DPRINTK("EXIT - <4MB\n");
-               return (0);
-       }
-
-       *tw = 0x55555555;
-
-       if (*tr != 0x55555555) {
-               DPRINTK("EXIT - <4MB\n");
-               return (0);
-       }
-
-       DPRINTK("EXIT\n");
-       return (1);
-}
-
-static void cv64_board_init (void)
-{
-       volatile unsigned char *regs = CyberRegs;
-       int i;
-       unsigned int clockpar;
-       unsigned char test;
-       
-       DPRINTK("ENTER\n");
-
-       /*
-        * Special CyberVision 64 board operations
-        */
-       /* Reset board */
-       for (i = 0; i < 6; i++) {
-               cv64_write_port (0xff, CyberBase);
-       }
-       /* Return to operational mode */
-       cv64_write_port (0x8004, CyberBase);
-       
-       /*
-        * Generic (?) S3 chip wakeup
-        */
-       /* Disable I/O & memory decoders, video in setup mode */
-       wb_64 (regs, SREG_VIDEO_SUBS_ENABLE, 0x10);
-       /* Video responds to cmds, addrs & data */
-       wb_64 (regs, SREG_OPTION_SELECT, 0x1);
-       /* Enable I/O & memory decoders, video in operational mode */
-       wb_64 (regs, SREG_VIDEO_SUBS_ENABLE, 0x8);
-       /* VGA color emulation, enable cpu access to display mem */ 
-       wb_64 (regs, GREG_MISC_OUTPUT_W, 0x03);
-       /* Unlock S3 VGA regs */
-       WCrt (regs, CRT_ID_REGISTER_LOCK_1, 0x48); 
-       /* Unlock system control & extension registers */
-       WCrt (regs, CRT_ID_REGISTER_LOCK_2, 0xA5);
-/* GRF - Enable interrupts */
-       /* Enable enhanced regs access, Ready cntl 0 wait states */
-       test = RCrt (regs, CRT_ID_SYSTEM_CONFIG);
-       test = test | 0x01;             /* enable enhanced register access */
-       test = test & 0xEF;             /* clear bit 4, 0 wait state */
-       WCrt (regs, CRT_ID_SYSTEM_CONFIG, test);
-       /*
-        * bit 0=1: Enable enhaced mode functions
-        * bit 2=0: Enhanced mode 8+ bits/pixel
-        * bit 4=1: Enable linear addressing
-        * bit 5=1: Enable MMIO
-        */
-       wb_64 (regs, ECR_ADV_FUNC_CNTL, 0x31);
-       /*
-        * bit 0=1: Color emulation
-        * bit 1=1: Enable CPU access to display memory
-        * bit 5=1: Select high 64K memory page
-        */
-/* GRF - 0xE3 */
-       wb_64 (regs, GREG_MISC_OUTPUT_W, 0x23);
-       
-       /* Cpu base addr */
-       WCrt (regs, CRT_ID_EXT_SYS_CNTL_4, 0x0);
-       
-       /* Reset. This does nothing on Trio, but standard VGA practice */
-       /* WSeq (CyberRegs, SEQ_ID_RESET, 0x03); */
-       /* Character clocks 8 dots wide */
-       WSeq (regs, SEQ_ID_CLOCKING_MODE, 0x01);
-       /* Enable cpu write to all color planes */
-       WSeq (regs, SEQ_ID_MAP_MASK, 0x0F);
-       /* Font table in 1st 8k of plane 2, font A=B disables swtich */
-       WSeq (regs, SEQ_ID_CHAR_MAP_SELECT, 0x0);
-       /* Allow mem access to 256kb */
-       WSeq (regs, SEQ_ID_MEMORY_MODE, 0x2);
-       /* Unlock S3 extensions to VGA Sequencer regs */
-       WSeq (regs, SEQ_ID_UNLOCK_EXT, 0x6);
-       
-       /* Enable 4MB fast page mode */
-       test = RSeq (regs, SEQ_ID_BUS_REQ_CNTL);
-       test = test | 1 << 6;
-       WSeq (regs, SEQ_ID_BUS_REQ_CNTL, test);
-       
-       /* Faster LUT write: 1 DCLK LUT write cycle, RAMDAC clk doubled */
-       WSeq (regs, SEQ_ID_RAMDAC_CNTL, 0xC0);
-
-       /* Clear immediate clock load bit */
-       test = RSeq (regs, SEQ_ID_CLKSYN_CNTL_2);
-       test = test & 0xDF;
-       /* If > 55MHz, enable 2 cycle memory write */
-       if (cv64_memclk >= 55000000) {
-               test |= 0x80;
-       }
-       WSeq (regs, SEQ_ID_CLKSYN_CNTL_2, test);
-
-       /* Set MCLK value */
-       clockpar = cv64_compute_clock (cv64_memclk);
-       test = (clockpar & 0xFF00) >> 8;
-       WSeq (regs, SEQ_ID_MCLK_HI, test);
-       test = clockpar & 0xFF;
-       WSeq (regs, SEQ_ID_MCLK_LO, test);
-
-       /* Chip rev specific: Not in my Trio manual!!! */
-       if (RCrt (regs, CRT_ID_REVISION) == 0x10)
-               WSeq (regs, SEQ_ID_MORE_MAGIC, test);
-
-       /* We now load an 25 MHz, 31kHz, 640x480 standard VGA Mode. */
-
-       /* Set DCLK value */
-       WSeq (regs, SEQ_ID_DCLK_HI, 0x13);
-       WSeq (regs, SEQ_ID_DCLK_LO, 0x41);
-
-       /* Load DCLK (and MCLK?) immediately */
-       test = RSeq (regs, SEQ_ID_CLKSYN_CNTL_2);
-       test = test | 0x22;
-       WSeq (regs, SEQ_ID_CLKSYN_CNTL_2, test);
-
-       /* Enable loading of DCLK */
-       test = rb_64(regs, GREG_MISC_OUTPUT_R);
-       test = test | 0x0C;
-       wb_64 (regs, GREG_MISC_OUTPUT_W, test);
-
-       /* Turn off immediate xCLK load */
-       WSeq (regs, SEQ_ID_CLKSYN_CNTL_2, 0x2);
-
-       /* Horizontal character clock counts */
-       /* 8 LSB of 9 bits = total line - 5 */
-       WCrt (regs, CRT_ID_HOR_TOTAL, 0x5F);
-       /* Active display line */
-       WCrt (regs, CRT_ID_HOR_DISP_ENA_END, 0x4F);
-       /* Blank assertion start */
-       WCrt (regs, CRT_ID_START_HOR_BLANK, 0x50);
-       /* Blank assertion end */
-       WCrt (regs, CRT_ID_END_HOR_BLANK, 0x82);
-       /* HSYNC assertion start */
-       WCrt (regs, CRT_ID_START_HOR_RETR, 0x54);
-       /* HSYNC assertion end */
-       WCrt (regs, CRT_ID_END_HOR_RETR, 0x80);
-       WCrt (regs, CRT_ID_VER_TOTAL, 0xBF);
-       WCrt (regs, CRT_ID_OVERFLOW, 0x1F);
-       WCrt (regs, CRT_ID_PRESET_ROW_SCAN, 0x0);
-       WCrt (regs, CRT_ID_MAX_SCAN_LINE, 0x40);
-       WCrt (regs, CRT_ID_CURSOR_START, 0x00);
-       WCrt (regs, CRT_ID_CURSOR_END, 0x00);
-       WCrt (regs, CRT_ID_START_ADDR_HIGH, 0x00);
-       WCrt (regs, CRT_ID_START_ADDR_LOW, 0x00);
-       WCrt (regs, CRT_ID_CURSOR_LOC_HIGH, 0x00);
-       WCrt (regs, CRT_ID_CURSOR_LOC_LOW, 0x00);
-       WCrt (regs, CRT_ID_START_VER_RETR, 0x9C);
-       WCrt (regs, CRT_ID_END_VER_RETR, 0x0E);
-       WCrt (regs, CRT_ID_VER_DISP_ENA_END, 0x8F);
-       WCrt (regs, CRT_ID_SCREEN_OFFSET, 0x50);
-       WCrt (regs, CRT_ID_UNDERLINE_LOC, 0x00);
-       WCrt (regs, CRT_ID_START_VER_BLANK, 0x96);
-       WCrt (regs, CRT_ID_END_VER_BLANK, 0xB9);
-       WCrt (regs, CRT_ID_MODE_CONTROL, 0xE3);
-       WCrt (regs, CRT_ID_LINE_COMPARE, 0xFF);
-       WCrt (regs, CRT_ID_BACKWAD_COMP_3, 0x10);       /* FIFO enabled */
-       WCrt (regs, CRT_ID_MISC_1, 0x35);
-       WCrt (regs, CRT_ID_DISPLAY_FIFO, 0x5A);
-       WCrt (regs, CRT_ID_EXT_MEM_CNTL_2, 0x70);
-       WCrt (regs, CRT_ID_LAW_POS_LO, 0x40);
-       WCrt (regs, CRT_ID_EXT_MEM_CNTL_3, 0xFF);
-
-       WGfx (regs, GCT_ID_SET_RESET, 0x0);
-       WGfx (regs, GCT_ID_ENABLE_SET_RESET, 0x0);
-       WGfx (regs, GCT_ID_COLOR_COMPARE, 0x0);
-       WGfx (regs, GCT_ID_DATA_ROTATE, 0x0);
-       WGfx (regs, GCT_ID_READ_MAP_SELECT, 0x0);
-       WGfx (regs, GCT_ID_GRAPHICS_MODE, 0x40);
-       WGfx (regs, GCT_ID_MISC, 0x01);
-       WGfx (regs, GCT_ID_COLOR_XCARE, 0x0F);
-       WGfx (regs, GCT_ID_BITMASK, 0xFF);
-
-       /* Colors for text mode */
-       for (i = 0; i < 0xf; i++)
-               WAttr (regs, i, i);
-
-       WAttr (regs, ACT_ID_ATTR_MODE_CNTL, 0x41);
-       WAttr (regs, ACT_ID_OVERSCAN_COLOR, 0x01);
-       WAttr (regs, ACT_ID_COLOR_PLANE_ENA, 0x0F);
-       WAttr (regs, ACT_ID_HOR_PEL_PANNING, 0x0);
-       WAttr (regs, ACT_ID_COLOR_SELECT, 0x0);
-
-       wb_64 (regs, VDAC_MASK, 0xFF);
-
-       *((unsigned long *) (regs + ECR_FRGD_COLOR)) = 0xFF;
-       *((unsigned long *) (regs + ECR_BKGD_COLOR)) = 0;
-
-       /* Colors initially set to grayscale */
-
-       wb_64 (regs, VDAC_ADDRESS_W, 0);
-       for (i = 255; i >= 0; i--) {
-               wb_64(regs, VDAC_DATA, i);
-               wb_64(regs, VDAC_DATA, i);
-               wb_64(regs, VDAC_DATA, i);
-       }
-
-       /* GFx hardware cursor off */
-       WCrt (regs, CRT_ID_HWGC_MODE, 0x00);
-
-       /* Set first to 4MB, so test will work */
-       WCrt (regs, CRT_ID_LAW_CNTL, 0x13);
-       /* Find "correct" size of fbmem of Z3 board */
-       if (cv_has_4mb (CyberMem)) {
-               CyberSize = 1024 * 1024 * 4;
-               WCrt (regs, CRT_ID_LAW_CNTL, 0x13);
-               DPRINTK("4MB board\n");
-       } else {
-               CyberSize = 1024 * 1024 * 2;
-               WCrt (regs, CRT_ID_LAW_CNTL, 0x12);
-               DPRINTK("2MB board\n");
-       }
-
-       /* Initialize graphics engine */
-       Cyber_WaitBlit();
-       vgaw16 (regs, ECR_FRGD_MIX, 0x27);
-       vgaw16 (regs, ECR_BKGD_MIX, 0x07);
-       vgaw16 (regs, ECR_READ_REG_DATA, 0x1000);
-       udelay(200);
-       vgaw16 (regs, ECR_READ_REG_DATA, 0x2000);
-       Cyber_WaitBlit();
-       vgaw16 (regs, ECR_READ_REG_DATA, 0x3FFF);
-       Cyber_WaitBlit();
-       udelay(200);
-       vgaw16 (regs, ECR_READ_REG_DATA, 0x4FFF);
-       Cyber_WaitBlit();
-       vgaw16 (regs, ECR_BITPLANE_WRITE_MASK, ~0);
-       Cyber_WaitBlit();
-       vgaw16 (regs, ECR_READ_REG_DATA, 0xE000);
-       vgaw16 (regs, ECR_CURRENT_Y_POS2, 0x00);
-       vgaw16 (regs, ECR_CURRENT_X_POS2, 0x00);
-       vgaw16 (regs, ECR_READ_REG_DATA, 0xA000);
-       vgaw16 (regs, ECR_DEST_Y__AX_STEP, 0x00);
-       vgaw16 (regs, ECR_DEST_Y2__AX_STEP2, 0x00);
-       vgaw16 (regs, ECR_DEST_X__DIA_STEP, 0x00);
-       vgaw16 (regs, ECR_DEST_X2__DIA_STEP2, 0x00);
-       vgaw16 (regs, ECR_SHORT_STROKE, 0x00);
-       vgaw16 (regs, ECR_DRAW_CMD, 0x01);
-
-       Cyber_WaitBlit();
-
-       vgaw16 (regs, ECR_READ_REG_DATA, 0x4FFF);
-       vgaw16 (regs, ECR_BKGD_COLOR, 0x01);
-       vgaw16 (regs, ECR_FRGD_COLOR, 0x00);
-
-
-       /* Enable video display (set bit 5) */
-/* ARB - Would also seem to write to AR13.
- *       May want to use parts of WAttr to set JUST bit 5
- */
-       WAttr (regs, 0x33, 0);
-       
-/* GRF - function code ended here */
-
-       /* Turn gfx on again */
-       gfx_on_off (0, regs);
-
-       /* Pass-through */
-       cvscreen (0, CyberBase);
-
-       DPRINTK("EXIT\n");
-}
-
-static void cv64_load_video_mode (struct fb_var_screeninfo *video_mode)
-{
-  volatile unsigned char *regs = CyberRegs;
-  int fx, fy;
-  unsigned short mnr;
-  unsigned short HT, HDE, HBS, HBE, HSS, HSE, VDE, VBS, VBE, VSS, VSE, VT;
-  char LACE, DBLSCAN, TEXT, CONSOLE;
-  int cr50, sr15, sr18, clock_mode, test;
-  int m, n;
-  int tfillm, temptym;
-  int hmul;
-       
-  /* ---------------- */
-  int xres, hfront, hsync, hback;
-  int yres, vfront, vsync, vback;
-  int bpp;
-#if 0
-  float freq_f;
-#endif
-  long freq;
-  /* ---------------- */
-       
-  DPRINTK("ENTER\n");
-  TEXT = 0;    /* if depth == 4 */
-  CONSOLE = 0; /* mode num == 255 (console) */
-  fx = fy = 8; /* force 8x8 font */
-
-/* GRF - Disable interrupts */ 
-       
-  gfx_on_off (1, regs);
-       
-  switch (video_mode->bits_per_pixel) {
-  case 15:
-  case 16:
-    hmul = 2;
-    break;
-               
-  default:
-    hmul = 1;
-    break;
-  }
-       
-  bpp = video_mode->bits_per_pixel;
-  xres = video_mode->xres;
-  hfront = video_mode->right_margin;
-  hsync = video_mode->hsync_len;
-  hback = video_mode->left_margin;
-
-  LACE = 0;
-  DBLSCAN = 0;
-
-  if (video_mode->vmode & FB_VMODE_DOUBLE) {
-    yres = video_mode->yres * 2;
-    vfront = video_mode->lower_margin * 2;
-    vsync = video_mode->vsync_len * 2;
-    vback = video_mode->upper_margin * 2;
-    DBLSCAN = 1;
-  } else if (video_mode->vmode & FB_VMODE_INTERLACED) {
-    yres = (video_mode->yres + 1) / 2;
-    vfront = (video_mode->lower_margin + 1) / 2;
-    vsync = (video_mode->vsync_len + 1) / 2;
-    vback = (video_mode->upper_margin + 1) / 2;
-    LACE = 1;
-  } else {
-    yres = video_mode->yres;
-    vfront = video_mode->lower_margin;
-    vsync = video_mode->vsync_len;
-    vback = video_mode->upper_margin;
-  }
-
-  /* ARB Dropping custom setup method from cvision.c */
-#if 0
-  if (cvision_custom_mode) {
-    HBS = hbs / 8 * hmul;
-    HBE = hbe / 8 * hmul;
-    HSS = hss / 8 * hmul;
-    HSE = hse / 8 * hmul;
-    HT  = ht / 8 * hmul - 5;
-               
-    VBS = vbs - 1;
-    VSS = vss;
-    VSE = vse;
-    VBE = vbe;
-    VT  = vt - 2;
-  } else {
-#else
-    {
-#endif
-    HBS = hmul * (xres / 8);
-    HBE = hmul * ((xres/8) + (hfront/8) + (hsync/8) + (hback/8) - 2);
-    HSS = hmul * ((xres/8) + (hfront/8) + 2);
-    HSE = hmul * ((xres/8) + (hfront/8) + (hsync/8) + 1);
-    HT  = hmul * ((xres/8) + (hfront/8) + (hsync/8) + (hback/8));
-       
-    VBS = yres;
-    VBE = yres + vfront + vsync + vback - 2;
-    VSS = yres + vfront - 1;
-    VSE = yres + vfront + vsync - 1;
-    VT  = yres + vfront + vsync + vback - 2;
-  }
-
-  wb_64 (regs, ECR_ADV_FUNC_CNTL, (TEXT ? 0x00 : 0x31));
-       
-  if (TEXT)
-    HDE = ((video_mode->xres + fx - 1) / fx) - 1;
-  else
-    HDE = (video_mode->xres + 3) * hmul / 8 - 1;
-       
-  VDE = video_mode->yres - 1;
-
-  WCrt (regs, CRT_ID_HWGC_MODE, 0x00);
-  WCrt (regs, CRT_ID_EXT_DAC_CNTL, 0x00);
-       
-  WSeq (regs, SEQ_ID_MEMORY_MODE,
-       (TEXT || (video_mode->bits_per_pixel == 1)) ? 0x06 : 0x0e);
-  WGfx (regs, GCT_ID_READ_MAP_SELECT, 0x00);
-  WSeq (regs, SEQ_ID_MAP_MASK,
-       (video_mode->bits_per_pixel == 1) ? 0x01 : 0xFF);
-  WSeq (regs, SEQ_ID_CHAR_MAP_SELECT, 0x00);
-       
-  /* cv64_compute_clock accepts arguments in Hz */
-  /* pixclock is in ps ... convert to Hz */
-       
-#if 0
-  freq_f = (1.0 / (float) video_mode->pixclock) * 1000000000;
-  freq = ((long) freq_f) * 1000;
-#else
-/* freq = (long) ((long long)1000000000000 / (long long) video_mode->pixclock);
- */
-  freq = (1000000000 / video_mode->pixclock) * 1000;
-#endif
-
-  mnr = cv64_compute_clock (freq);
-  WSeq (regs, SEQ_ID_DCLK_HI, ((mnr & 0xFF00) >> 8));
-  WSeq (regs, SEQ_ID_DCLK_LO, (mnr & 0xFF));
-       
-  /* Load display parameters into board */
-  WCrt (regs, CRT_ID_EXT_HOR_OVF,
-       ((HT & 0x100) ? 0x01 : 0x00) |
-       ((HDE & 0x100) ? 0x02 : 0x00) |
-       ((HBS & 0x100) ? 0x04 : 0x00) |
-       /* ((HBE & 0x40) ? 0x08 : 0x00) | */
-       ((HSS & 0x100) ? 0x10 : 0x00) |
-       /* ((HSE & 0x20) ? 0x20 : 0x00) | */
-       (((HT-5) & 0x100) ? 0x40 : 0x00)
-       );
-       
-  WCrt (regs, CRT_ID_EXT_VER_OVF,
-       0x40 |
-       ((VT & 0x400) ? 0x01 : 0x00) |
-       ((VDE & 0x400) ? 0x02 : 0x00) |
-       ((VBS & 0x400) ? 0x04 : 0x00) |
-       ((VSS & 0x400) ? 0x10 : 0x00)
-       );
-       
-  WCrt (regs, CRT_ID_HOR_TOTAL, HT);
-  WCrt (regs, CRT_ID_DISPLAY_FIFO, HT - 5);
-  WCrt (regs, CRT_ID_HOR_DISP_ENA_END, ((HDE >= HBS) ? (HBS - 1) : HDE));
-  WCrt (regs, CRT_ID_START_HOR_BLANK, HBS);
-  WCrt (regs, CRT_ID_END_HOR_BLANK, ((HBE & 0x1F) | 0x80));
-  WCrt (regs, CRT_ID_START_HOR_RETR, HSS);
-  WCrt (regs, CRT_ID_END_HOR_RETR,
-       (HSE & 0x1F) |
-       ((HBE & 0x20) ? 0x80 : 0x00)
-       );
-  WCrt (regs, CRT_ID_VER_TOTAL, VT);
-  WCrt (regs, CRT_ID_OVERFLOW,
-       0x10 |
-       ((VT & 0x100) ? 0x01 : 0x00) |
-       ((VDE & 0x100) ? 0x02 : 0x00) |
-       ((VSS & 0x100) ? 0x04 : 0x00) |
-       ((VBS & 0x100) ? 0x08 : 0x00) |
-       ((VT & 0x200) ? 0x20 : 0x00) |
-       ((VDE & 0x200) ? 0x40 : 0x00) |
-       ((VSS & 0x200) ? 0x80 : 0x00)
-       );
-  WCrt (regs, CRT_ID_MAX_SCAN_LINE,
-       0x40 |
-       (DBLSCAN ? 0x80 : 0x00) |
-       ((VBS & 0x200) ? 0x20 : 0x00) |
-       (TEXT ? ((fy - 1) & 0x1F) : 0x00)
-       );
-       
-  WCrt (regs, CRT_ID_MODE_CONTROL, 0xE3);
-
-  /* Text cursor */
-       
-  if (TEXT) {
-#if 1
-    WCrt (regs, CRT_ID_CURSOR_START, (fy & 0x1f) - 2);
-    WCrt (regs, CRT_ID_CURSOR_END, (fy & 0x1F) - 1);
-#else
-    WCrt (regs, CRT_ID_CURSOR_START, 0x00);
-    WCrt (regs, CRT_ID_CURSOR_END, fy & 0x1F);
-#endif
-    WCrt (regs, CRT_ID_UNDERLINE_LOC, (fy - 1) & 0x1F);
-    WCrt (regs, CRT_ID_CURSOR_LOC_HIGH, 0x00);
-    WCrt (regs, CRT_ID_CURSOR_LOC_LOW, 0x00);
-  }
-       
-  WCrt (regs, CRT_ID_START_ADDR_HIGH, 0x00);
-  WCrt (regs, CRT_ID_START_ADDR_LOW, 0x00);
-  WCrt (regs, CRT_ID_START_VER_RETR, VSS);
-  WCrt (regs, CRT_ID_END_VER_RETR, (VSE & 0x0F));
-  WCrt (regs, CRT_ID_VER_DISP_ENA_END, VDE);
-  WCrt (regs, CRT_ID_START_VER_BLANK, VBS);
-  WCrt (regs, CRT_ID_END_VER_BLANK, VBE);
-  WCrt (regs, CRT_ID_LINE_COMPARE, 0xFF);
-  WCrt (regs, CRT_ID_LACE_RETR_START, HT / 2);
-  WCrt (regs, CRT_ID_LACE_CONTROL, (LACE ? 0x20 : 0x00));
-  WGfx (regs, GCT_ID_GRAPHICS_MODE,
-       ((TEXT || (video_mode->bits_per_pixel == 1)) ? 0x00 : 0x40));
-  WGfx (regs, GCT_ID_MISC, (TEXT ? 0x04 : 0x01));
-  WSeq (regs, SEQ_ID_MEMORY_MODE,
-       ((TEXT || (video_mode->bits_per_pixel == 1)) ? 0x06 : 0x02));
-       
-  wb_64 (regs, VDAC_MASK, 0xFF);
-       
-  /* Blank border */
-  test = RCrt (regs, CRT_ID_BACKWAD_COMP_2);
-  WCrt (regs, CRT_ID_BACKWAD_COMP_2, (test | 0x20));
-       
-  sr15 = RSeq (regs, SEQ_ID_CLKSYN_CNTL_2);
-  sr15 &= 0xEF;
-  sr18 = RSeq (regs, SEQ_ID_RAMDAC_CNTL);
-  sr18 &= 0x7F;
-  clock_mode = 0x00;
-  cr50 = 0x00;
-       
-  test = RCrt (regs, CRT_ID_EXT_MISC_CNTL_2);
-  test &= 0xD;
-       
-  /* Clear roxxler byte-swapping... */
-  cv64_write_port (0x0040, CyberBase);
-  cv64_write_port (0x0020, CyberBase);
-       
-  switch (video_mode->bits_per_pixel) {
-  case 1:
-  case 4:      /* text */
-    HDE = video_mode->xres / 16;
-    break;
-               
-  case 8:
-    if (freq > 80000000) {
-      clock_mode = 0x10 | 0x02;
-      sr15 |= 0x10;
-      sr18 |= 0x80;
-    }
-    HDE = video_mode->xres / 8;
-    cr50 |= 0x00;
-    break;
-               
-  case 15:
-    cv64_write_port (0x8020, CyberBase);
-    clock_mode = 0x30;
-    HDE = video_mode->xres / 4;
-    cr50 |= 0x10;
-    break;
-               
-  case 16:
-    cv64_write_port (0x8020, CyberBase);
-    clock_mode = 0x50;
-    HDE = video_mode->xres / 4;
-    cr50 |= 0x10;
-    break;
-               
-  case 24:
-  case 32:
-    cv64_write_port (0x8040, CyberBase);
-    clock_mode = 0xD0;
-    HDE = video_mode->xres / 2;
-    cr50 |= 0x30;
-    break;
-  }
-
-  WCrt (regs, CRT_ID_EXT_MISC_CNTL_2, clock_mode | test);
-  WSeq (regs, SEQ_ID_CLKSYN_CNTL_2, sr15);
-  WSeq (regs, SEQ_ID_RAMDAC_CNTL, sr18);
-  WCrt (regs, CRT_ID_SCREEN_OFFSET, HDE);
-
-  WCrt (regs, CRT_ID_MISC_1, (TEXT ? 0x05 : 0x35));
-       
-  test = RCrt (regs, CRT_ID_EXT_SYS_CNTL_2);
-  test &= ~0x30;
-  test |= (HDE >> 4) & 0x30;
-  WCrt (regs, CRT_ID_EXT_SYS_CNTL_2, test);
-       
-  /* Set up graphics engine */
-  switch (video_mode->xres) {
-  case 1024:
-    cr50 |= 0x00;
-    break;
-               
-  case 640:
-    cr50 |= 0x40;
-    break;
-               
-  case 800:
-    cr50 |= 0x80;
-    break;
-               
-  case 1280:
-    cr50 |= 0xC0;
-    break;
-               
-  case 1152:
-    cr50 |= 0x01;
-    break;
-               
-  case 1600:
-    cr50 |= 0x81;
-    break;
-               
-  default:     /* XXX */
-    break;
-  }
-       
-  WCrt (regs, CRT_ID_EXT_SYS_CNTL_1, cr50);
-       
-  udelay(100);
-  WAttr (regs, ACT_ID_ATTR_MODE_CNTL, (TEXT ? 0x08 : 0x41));
-  udelay(100);
-  WAttr (regs, ACT_ID_COLOR_PLANE_ENA,
-        (video_mode->bits_per_pixel == 1) ? 0x01 : 0x0F);
-  udelay(100);
-       
-  tfillm = (96 * (cv64_memclk / 1000)) / 240000;
-       
-  switch (video_mode->bits_per_pixel) {
-  case 32:
-  case 24:
-    temptym = (24 * (cv64_memclk / 1000)) / (freq / 1000);
-    break;
-  case 15:
-  case 16:
-    temptym = (48 * (cv64_memclk / 1000)) / (freq / 1000);
-    break;
-  case 4:
-    temptym = (192 * (cv64_memclk / 1000)) / (freq / 1000);
-    break;
-  default:
-    temptym = (96 * (cv64_memclk / 1000)) / (freq / 1000);
-    break;
-  }
-       
-  m = (temptym - tfillm - 9) / 2;
-  if (m < 0)
-    m = 0;
-  m = (m & 0x1F) << 3;
-  if (m < 0x18)
-    m = 0x18;
-  n = 0xFF;
-       
-  WCrt (regs, CRT_ID_EXT_MEM_CNTL_2, m);
-  WCrt (regs, CRT_ID_EXT_MEM_CNTL_3, n);
-  udelay(10);
-       
-  /* Text initialization */
-       
-  if (TEXT) {
-    /* Do text initialization here ! */
-  }
-       
-  if (CONSOLE) {
-    int i;
-    wb_64 (regs, VDAC_ADDRESS_W, 0);
-    for (i = 0; i < 4; i++) {
-      wb_64 (regs, VDAC_DATA, cvconscolors [i][0]);
-      wb_64 (regs, VDAC_DATA, cvconscolors [i][1]);
-      wb_64 (regs, VDAC_DATA, cvconscolors [i][2]);
-    }
-  }
-       
-  WAttr (regs, 0x33, 0);
-       
-  /* Turn gfx on again */
-  gfx_on_off (0, (volatile unsigned char *) regs);
-       
-  /* Pass-through */
-  cvscreen (0, CyberBase);
-
-DPRINTK("EXIT\n");
-}
-
-void cvision_bitblt (u_short sx, u_short sy, u_short dx, u_short dy,
-                    u_short w, u_short h)
-{
-       volatile unsigned char *regs = CyberRegs;
-       unsigned short drawdir = 0;
-       
-       DPRINTK("ENTER\n");
-       if (sx > dx) {
-               drawdir |= 1 << 5;
-       } else {
-               sx += w - 1;
-               dx += w - 1;
-       }
-       
-       if (sy > dy) {
-               drawdir |= 1 << 7;
-       } else {
-               sy += h - 1;
-               dy += h - 1;
-       }
-       
-       Cyber_WaitBlit();
-       vgaw16 (regs, ECR_READ_REG_DATA, 0xA000);
-       vgaw16 (regs, ECR_BKGD_MIX, 0x7);
-       vgaw16 (regs, ECR_FRGD_MIX, 0x67);
-       vgaw16 (regs, ECR_BKGD_COLOR, 0x0);
-       vgaw16 (regs, ECR_FRGD_COLOR, 0x1);
-       vgaw16 (regs, ECR_BITPLANE_READ_MASK, 0x1);
-       vgaw16 (regs, ECR_BITPLANE_WRITE_MASK, 0xFFF);
-       vgaw16 (regs, ECR_CURRENT_Y_POS, sy);
-       vgaw16 (regs, ECR_CURRENT_X_POS, sx);
-       vgaw16 (regs, ECR_DEST_Y__AX_STEP, dy);
-       vgaw16 (regs, ECR_DEST_X__DIA_STEP, dx);
-       vgaw16 (regs, ECR_READ_REG_DATA, h - 1);
-       vgaw16 (regs, ECR_MAJ_AXIS_PIX_CNT, w - 1);
-       vgaw16 (regs, ECR_DRAW_CMD, 0xC051 | drawdir);
-       DPRINTK("EXIT\n");
-}
-
-void cvision_clear (u_short dx, u_short dy, u_short w, u_short h, u_short bg)
-{
-       volatile unsigned char *regs = CyberRegs;
-       DPRINTK("ENTER\n");
-       Cyber_WaitBlit();
-       vgaw16 (regs, ECR_FRGD_MIX, 0x0027);
-       vgaw16 (regs, ECR_FRGD_COLOR, bg);
-       vgaw16 (regs, ECR_READ_REG_DATA, 0xA000);
-       vgaw16 (regs, ECR_CURRENT_Y_POS, dy);
-       vgaw16 (regs, ECR_CURRENT_X_POS, dx);
-       vgaw16 (regs, ECR_READ_REG_DATA, h - 1);
-       vgaw16 (regs, ECR_MAJ_AXIS_PIX_CNT, w - 1);
-       vgaw16 (regs, ECR_DRAW_CMD, 0x40B1);    
-       DPRINTK("EXIT\n");
-}
-
-#ifdef CYBERFBDEBUG
-/*
- * Dump internal settings of CyberVision board
- */
-static void cv64_dump (void)
-{
-       volatile unsigned char *regs = CyberRegs;
-       DPRINTK("ENTER\n");
-        /* Dump the VGA setup values */
-       *(regs + S3_CRTC_ADR) = 0x00;
-       DPRINTK("CR00 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x01;
-       DPRINTK("CR01 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x02;
-       DPRINTK("CR02 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x03;
-       DPRINTK("CR03 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x04;
-       DPRINTK("CR04 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x05;
-       DPRINTK("CR05 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x06;
-       DPRINTK("CR06 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x07;
-       DPRINTK("CR07 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x08;
-       DPRINTK("CR08 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x09;
-       DPRINTK("CR09 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x10;
-       DPRINTK("CR10 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x11;
-       DPRINTK("CR11 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x12;
-       DPRINTK("CR12 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x13;
-       DPRINTK("CR13 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x15;
-       DPRINTK("CR15 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x16;
-       DPRINTK("CR16 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x36;
-       DPRINTK("CR36 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x37;
-       DPRINTK("CR37 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x42;
-       DPRINTK("CR42 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x43;
-       DPRINTK("CR43 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x50;
-       DPRINTK("CR50 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x51;
-       DPRINTK("CR51 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x53;
-       DPRINTK("CR53 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x58;
-       DPRINTK("CR58 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x59;
-       DPRINTK("CR59 = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x5A;
-       DPRINTK("CR5A = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x5D;
-       DPRINTK("CR5D = %x\n", *(regs + S3_CRTC_DATA));
-       *(regs + S3_CRTC_ADR) = 0x5E;
-       DPRINTK("CR5E = %x\n", *(regs + S3_CRTC_DATA));
-       DPRINTK("MISC = %x\n", *(regs + GREG_MISC_OUTPUT_R));
-       *(regs + SEQ_ADDRESS) = 0x01;
-       DPRINTK("SR01 = %x\n", *(regs + SEQ_ADDRESS_R));
-       *(regs + SEQ_ADDRESS) = 0x02;
-       DPRINTK("SR02 = %x\n", *(regs + SEQ_ADDRESS_R));
-       *(regs + SEQ_ADDRESS) = 0x03;
-       DPRINTK("SR03 = %x\n", *(regs + SEQ_ADDRESS_R));
-       *(regs + SEQ_ADDRESS) = 0x09;
-       DPRINTK("SR09 = %x\n", *(regs + SEQ_ADDRESS_R));
-       *(regs + SEQ_ADDRESS) = 0x10;
-       DPRINTK("SR10 = %x\n", *(regs + SEQ_ADDRESS_R));
-       *(regs + SEQ_ADDRESS) = 0x11;
-       DPRINTK("SR11 = %x\n", *(regs + SEQ_ADDRESS_R));
-       *(regs + SEQ_ADDRESS) = 0x12;
-       DPRINTK("SR12 = %x\n", *(regs + SEQ_ADDRESS_R));
-       *(regs + SEQ_ADDRESS) = 0x13;
-       DPRINTK("SR13 = %x\n", *(regs + SEQ_ADDRESS_R));
-       *(regs + SEQ_ADDRESS) = 0x15;
-       DPRINTK("SR15 = %x\n", *(regs + SEQ_ADDRESS_R));
-       
-       return;
-}
-#endif
diff --git a/drivers/video/cyberfb.h b/drivers/video/cyberfb.h
deleted file mode 100644 (file)
index 8435c43..0000000
+++ /dev/null
@@ -1,415 +0,0 @@
-/*
- * linux/arch/m68k/console/cvision.h -- CyberVision64 definitions for the
- *                                      text console driver.
- *
- *   Copyright (c) 1998 Alan Bair
- *
- * This file is based on the initial port to Linux of grf_cvreg.h:
- *
- *   Copyright (c) 1997 Antonio Santos
- *
- * The original work is from the NetBSD CyberVision 64 framebuffer driver 
- * and support files (grf_cv.c, grf_cvreg.h, ite_cv.c):
- * Permission to use the source of this driver was obtained from the
- * author Michael Teske by Alan Bair.
- *
- *   Copyright (c) 1995 Michael Teske
- *
- * History:
- *
- *
- *
- * 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.
- */
-
-/* s3 commands */
-#define S3_BITBLT       0xc011
-#define S3_TWOPOINTLINE 0x2811
-#define S3_FILLEDRECT   0x40b1
-
-#define S3_FIFO_EMPTY 0x0400
-#define S3_HDW_BUSY   0x0200
-
-/* Enhanced register mapping (MMIO mode) */
-
-#define S3_READ_SEL      0xbee8 /* offset f */
-#define S3_MULT_MISC     0xbee8 /* offset e */
-#define S3_ERR_TERM      0x92e8
-#define S3_FRGD_COLOR    0xa6e8
-#define S3_BKGD_COLOR    0xa2e8
-#define S3_PIXEL_CNTL    0xbee8 /* offset a */
-#define S3_FRGD_MIX      0xbae8
-#define S3_BKGD_MIX      0xb6e8
-#define S3_CUR_Y         0x82e8
-#define S3_CUR_X         0x86e8
-#define S3_DESTY_AXSTP   0x8ae8
-#define S3_DESTX_DIASTP  0x8ee8
-#define S3_MIN_AXIS_PCNT 0xbee8 /* offset 0 */
-#define S3_MAJ_AXIS_PCNT 0x96e8
-#define S3_CMD           0x9ae8
-#define S3_GP_STAT       0x9ae8
-#define S3_ADVFUNC_CNTL  0x4ae8
-#define S3_WRT_MASK      0xaae8
-#define S3_RD_MASK       0xaee8
-
-/* Enhanced register mapping (Packed MMIO mode, write only) */
-#define S3_ALT_CURXY     0x8100
-#define S3_ALT_CURXY2    0x8104
-#define S3_ALT_STEP      0x8108
-#define S3_ALT_STEP2     0x810c
-#define S3_ALT_ERR       0x8110
-#define S3_ALT_CMD       0x8118
-#define S3_ALT_MIX       0x8134
-#define S3_ALT_PCNT      0x8148
-#define S3_ALT_PAT       0x8168
-
-/* Drawing modes */
-#define S3_NOTCUR          0x0000
-#define S3_LOGICALZERO     0x0001
-#define S3_LOGICALONE      0x0002
-#define S3_LEAVEASIS       0x0003
-#define S3_NOTNEW          0x0004
-#define S3_CURXORNEW       0x0005
-#define S3_NOT_CURXORNEW   0x0006
-#define S3_NEW             0x0007
-#define S3_NOTCURORNOTNEW  0x0008
-#define S3_CURORNOTNEW     0x0009
-#define S3_NOTCURORNEW     0x000a
-#define S3_CURORNEW        0x000b
-#define S3_CURANDNEW       0x000c
-#define S3_NOTCURANDNEW    0x000d
-#define S3_CURANDNOTNEW    0x000e
-#define S3_NOTCURANDNOTNEW 0x000f
-
-#define S3_CRTC_ADR    0x03d4
-#define S3_CRTC_DATA   0x03d5
-
-#define S3_REG_LOCK2 0x39
-#define S3_HGC_MODE  0x45
-
-#define S3_HWGC_ORGX_H 0x46
-#define S3_HWGC_ORGX_L 0x47
-#define S3_HWGC_ORGY_H 0x48
-#define S3_HWGC_ORGY_L 0x49
-#define S3_HWGC_DX     0x4e
-#define S3_HWGC_DY     0x4f
-
-#define S3_LAW_CTL 0x58
-
-/**************************************************/
-
-/* support for a BitBlt operation. The op-codes are identical
-   to X11 GCs */
-#define        GRFBBOPclear            0x0     /* 0 */
-#define GRFBBOPand             0x1     /* src AND dst */
-#define GRFBBOPandReverse      0x2     /* src AND NOT dst */
-#define GRFBBOPcopy            0x3     /* src */
-#define GRFBBOPandInverted     0x4     /* NOT src AND dst */
-#define        GRFBBOPnoop             0x5     /* dst */
-#define GRFBBOPxor             0x6     /* src XOR dst */
-#define GRFBBOPor              0x7     /* src OR dst */
-#define GRFBBOPnor             0x8     /* NOT src AND NOT dst */
-#define GRFBBOPequiv           0x9     /* NOT src XOR dst */
-#define GRFBBOPinvert          0xa     /* NOT dst */
-#define GRFBBOPorReverse       0xb     /* src OR NOT dst */
-#define GRFBBOPcopyInverted    0xc     /* NOT src */
-#define GRFBBOPorInverted      0xd     /* NOT src OR dst */
-#define GRFBBOPnand            0xe     /* NOT src OR NOT dst */
-#define GRFBBOPset             0xf     /* 1 */
-
-
-/* Write 16 Bit VGA register */
-#define vgaw16(ba, reg, val) \
-*((unsigned short *)  (((volatile unsigned char *)ba)+reg)) = val
-
-/*
- * Defines for the used register addresses (mw)
- *
- * NOTE: There are some registers that have different addresses when
- *       in mono or color mode. We only support color mode, and thus
- *       some addresses won't work in mono-mode!
- *
- * General and VGA-registers taken from retina driver. Fixed a few
- * bugs in it. (SR and GR read address is Port + 1, NOT Port)
- *
- */
-
-/* General Registers: */
-#define GREG_MISC_OUTPUT_R     0x03CC
-#define GREG_MISC_OUTPUT_W     0x03C2  
-#define GREG_FEATURE_CONTROL_R 0x03CA
-#define GREG_FEATURE_CONTROL_W 0x03DA
-#define GREG_INPUT_STATUS0_R   0x03C2
-#define GREG_INPUT_STATUS1_R   0x03DA
-
-/* Setup Registers: */
-#define SREG_OPTION_SELECT     0x0102
-#define SREG_VIDEO_SUBS_ENABLE 0x46E8
-
-/* Attribute Controller: */
-#define ACT_ADDRESS            0x03C0
-#define ACT_ADDRESS_R          0x03C1
-#define ACT_ADDRESS_W          0x03C0
-#define ACT_ADDRESS_RESET      0x03DA
-#define ACT_ID_PALETTE0                0x00
-#define ACT_ID_PALETTE1                0x01
-#define ACT_ID_PALETTE2                0x02
-#define ACT_ID_PALETTE3                0x03
-#define ACT_ID_PALETTE4                0x04
-#define ACT_ID_PALETTE5                0x05
-#define ACT_ID_PALETTE6                0x06
-#define ACT_ID_PALETTE7                0x07
-#define ACT_ID_PALETTE8                0x08
-#define ACT_ID_PALETTE9                0x09
-#define ACT_ID_PALETTE10       0x0A
-#define ACT_ID_PALETTE11       0x0B
-#define ACT_ID_PALETTE12       0x0C
-#define ACT_ID_PALETTE13       0x0D
-#define ACT_ID_PALETTE14       0x0E
-#define ACT_ID_PALETTE15       0x0F
-#define ACT_ID_ATTR_MODE_CNTL  0x10
-#define ACT_ID_OVERSCAN_COLOR  0x11
-#define ACT_ID_COLOR_PLANE_ENA 0x12
-#define ACT_ID_HOR_PEL_PANNING 0x13
-#define ACT_ID_COLOR_SELECT    0x14
-
-/* Graphics Controller: */
-#define GCT_ADDRESS            0x03CE
-#define GCT_ADDRESS_R          0x03CF
-#define GCT_ADDRESS_W          0x03CF
-#define GCT_ID_SET_RESET       0x00
-#define GCT_ID_ENABLE_SET_RESET        0x01
-#define GCT_ID_COLOR_COMPARE   0x02
-#define GCT_ID_DATA_ROTATE     0x03
-#define GCT_ID_READ_MAP_SELECT 0x04
-#define GCT_ID_GRAPHICS_MODE   0x05
-#define GCT_ID_MISC            0x06
-#define GCT_ID_COLOR_XCARE     0x07
-#define GCT_ID_BITMASK         0x08
-
-/* Sequencer: */
-#define SEQ_ADDRESS            0x03C4
-#define SEQ_ADDRESS_R          0x03C5
-#define SEQ_ADDRESS_W          0x03C5
-#define SEQ_ID_RESET           0x00
-#define SEQ_ID_CLOCKING_MODE   0x01
-#define SEQ_ID_MAP_MASK                0x02
-#define SEQ_ID_CHAR_MAP_SELECT 0x03
-#define SEQ_ID_MEMORY_MODE     0x04
-#define SEQ_ID_UNKNOWN1                0x05
-#define SEQ_ID_UNKNOWN2                0x06
-#define SEQ_ID_UNKNOWN3                0x07
-/* S3 extensions */
-#define SEQ_ID_UNLOCK_EXT      0x08
-#define SEQ_ID_EXT_SEQ_REG9    0x09
-#define SEQ_ID_BUS_REQ_CNTL    0x0A
-#define SEQ_ID_EXT_MISC_SEQ    0x0B
-#define SEQ_ID_UNKNOWN4                0x0C
-#define SEQ_ID_EXT_SEQ         0x0D
-#define SEQ_ID_UNKNOWN5                0x0E
-#define SEQ_ID_UNKNOWN6                0x0F
-#define SEQ_ID_MCLK_LO         0x10
-#define SEQ_ID_MCLK_HI         0x11
-#define SEQ_ID_DCLK_LO         0x12
-#define SEQ_ID_DCLK_HI         0x13
-#define SEQ_ID_CLKSYN_CNTL_1   0x14
-#define SEQ_ID_CLKSYN_CNTL_2   0x15
-#define SEQ_ID_CLKSYN_TEST_HI  0x16    /* reserved for S3 testing of the */
-#define SEQ_ID_CLKSYN_TEST_LO  0x17    /*   internal clock synthesizer   */
-#define SEQ_ID_RAMDAC_CNTL     0x18
-#define SEQ_ID_MORE_MAGIC      0x1A
-
-/* CRT Controller: */
-#define CRT_ADDRESS            0x03D4
-#define CRT_ADDRESS_R          0x03D5
-#define CRT_ADDRESS_W          0x03D5
-#define CRT_ID_HOR_TOTAL       0x00
-#define CRT_ID_HOR_DISP_ENA_END        0x01
-#define CRT_ID_START_HOR_BLANK 0x02
-#define CRT_ID_END_HOR_BLANK   0x03
-#define CRT_ID_START_HOR_RETR  0x04
-#define CRT_ID_END_HOR_RETR    0x05
-#define CRT_ID_VER_TOTAL       0x06
-#define CRT_ID_OVERFLOW                0x07
-#define CRT_ID_PRESET_ROW_SCAN 0x08
-#define CRT_ID_MAX_SCAN_LINE   0x09
-#define CRT_ID_CURSOR_START    0x0A
-#define CRT_ID_CURSOR_END      0x0B
-#define CRT_ID_START_ADDR_HIGH 0x0C
-#define CRT_ID_START_ADDR_LOW  0x0D
-#define CRT_ID_CURSOR_LOC_HIGH 0x0E
-#define CRT_ID_CURSOR_LOC_LOW  0x0F
-#define CRT_ID_START_VER_RETR  0x10
-#define CRT_ID_END_VER_RETR    0x11
-#define CRT_ID_VER_DISP_ENA_END        0x12
-#define CRT_ID_SCREEN_OFFSET   0x13
-#define CRT_ID_UNDERLINE_LOC   0x14
-#define CRT_ID_START_VER_BLANK 0x15
-#define CRT_ID_END_VER_BLANK   0x16
-#define CRT_ID_MODE_CONTROL    0x17
-#define CRT_ID_LINE_COMPARE    0x18
-#define CRT_ID_GD_LATCH_RBACK  0x22
-#define CRT_ID_ACT_TOGGLE_RBACK        0x24
-#define CRT_ID_ACT_INDEX_RBACK 0x26
-/* S3 extensions: S3 VGA Registers */
-#define CRT_ID_DEVICE_HIGH     0x2D
-#define CRT_ID_DEVICE_LOW      0x2E
-#define CRT_ID_REVISION        0x2F
-#define CRT_ID_CHIP_ID_REV     0x30
-#define CRT_ID_MEMORY_CONF     0x31
-#define CRT_ID_BACKWAD_COMP_1  0x32
-#define CRT_ID_BACKWAD_COMP_2  0x33
-#define CRT_ID_BACKWAD_COMP_3  0x34
-#define CRT_ID_REGISTER_LOCK   0x35
-#define CRT_ID_CONFIG_1        0x36
-#define CRT_ID_CONFIG_2        0x37
-#define CRT_ID_REGISTER_LOCK_1 0x38
-#define CRT_ID_REGISTER_LOCK_2 0x39
-#define CRT_ID_MISC_1          0x3A
-#define CRT_ID_DISPLAY_FIFO    0x3B
-#define CRT_ID_LACE_RETR_START 0x3C
-/* S3 extensions: System Control Registers  */
-#define CRT_ID_SYSTEM_CONFIG   0x40
-#define CRT_ID_BIOS_FLAG       0x41
-#define CRT_ID_LACE_CONTROL    0x42
-#define CRT_ID_EXT_MODE        0x43
-#define CRT_ID_HWGC_MODE       0x45    /* HWGC = Hardware Graphics Cursor */
-#define CRT_ID_HWGC_ORIGIN_X_HI        0x46
-#define CRT_ID_HWGC_ORIGIN_X_LO        0x47
-#define CRT_ID_HWGC_ORIGIN_Y_HI        0x48
-#define CRT_ID_HWGC_ORIGIN_Y_LO        0x49
-#define CRT_ID_HWGC_FG_STACK   0x4A
-#define CRT_ID_HWGC_BG_STACK   0x4B
-#define CRT_ID_HWGC_START_AD_HI        0x4C
-#define CRT_ID_HWGC_START_AD_LO        0x4D
-#define CRT_ID_HWGC_DSTART_X   0x4E
-#define CRT_ID_HWGC_DSTART_Y   0x4F
-/* S3 extensions: System Extension Registers  */
-#define CRT_ID_EXT_SYS_CNTL_1  0x50
-#define CRT_ID_EXT_SYS_CNTL_2  0x51
-#define CRT_ID_EXT_BIOS_FLAG_1 0x52
-#define CRT_ID_EXT_MEM_CNTL_1  0x53
-#define CRT_ID_EXT_MEM_CNTL_2  0x54
-#define CRT_ID_EXT_DAC_CNTL    0x55
-#define CRT_ID_EX_SYNC_1       0x56
-#define CRT_ID_EX_SYNC_2       0x57
-#define CRT_ID_LAW_CNTL                0x58    /* LAW = Linear Address Window */
-#define CRT_ID_LAW_POS_HI      0x59
-#define CRT_ID_LAW_POS_LO      0x5A
-#define CRT_ID_GOUT_PORT       0x5C
-#define CRT_ID_EXT_HOR_OVF     0x5D
-#define CRT_ID_EXT_VER_OVF     0x5E
-#define CRT_ID_EXT_MEM_CNTL_3  0x60
-#define CRT_ID_EX_SYNC_3       0x63
-#define CRT_ID_EXT_MISC_CNTL   0x65
-#define CRT_ID_EXT_MISC_CNTL_1 0x66
-#define CRT_ID_EXT_MISC_CNTL_2 0x67
-#define CRT_ID_CONFIG_3        0x68
-#define CRT_ID_EXT_SYS_CNTL_3  0x69
-#define CRT_ID_EXT_SYS_CNTL_4  0x6A
-#define CRT_ID_EXT_BIOS_FLAG_3 0x6B
-#define CRT_ID_EXT_BIOS_FLAG_4 0x6C
-
-/* Enhanced Commands Registers: */
-#define ECR_SUBSYSTEM_STAT     0x42E8
-#define ECR_SUBSYSTEM_CNTL     0x42E8
-#define ECR_ADV_FUNC_CNTL      0x4AE8
-#define ECR_CURRENT_Y_POS      0x82E8
-#define ECR_CURRENT_Y_POS2     0x82EA  /* Trio64 only */
-#define ECR_CURRENT_X_POS      0x86E8
-#define ECR_CURRENT_X_POS2     0x86EA  /* Trio64 only */
-#define ECR_DEST_Y__AX_STEP    0x8AE8
-#define ECR_DEST_Y2__AX_STEP2  0x8AEA  /* Trio64 only */
-#define ECR_DEST_X__DIA_STEP   0x8EE8
-#define ECR_DEST_X2__DIA_STEP2 0x8EEA  /* Trio64 only */
-#define ECR_ERR_TERM           0x92E8
-#define ECR_ERR_TERM2          0x92EA  /* Trio64 only */
-#define ECR_MAJ_AXIS_PIX_CNT   0x96E8
-#define ECR_MAJ_AXIS_PIX_CNT2  0x96EA  /* Trio64 only */
-#define ECR_GP_STAT            0x9AE8  /* GP = Graphics Processor */
-#define ECR_DRAW_CMD           0x9AE8
-#define ECR_DRAW_CMD2          0x9AEA  /* Trio64 only */
-#define ECR_SHORT_STROKE       0x9EE8
-#define ECR_BKGD_COLOR         0xA2E8  /* BKGD = Background */
-#define ECR_FRGD_COLOR         0xA6E8  /* FRGD = Foreground */
-#define ECR_BITPLANE_WRITE_MASK        0xAAE8
-#define ECR_BITPLANE_READ_MASK 0xAEE8
-#define ECR_COLOR_COMPARE      0xB2E8
-#define ECR_BKGD_MIX           0xB6E8
-#define ECR_FRGD_MIX           0xBAE8
-#define ECR_READ_REG_DATA      0xBEE8
-#define ECR_ID_MIN_AXIS_PIX_CNT        0x00
-#define ECR_ID_SCISSORS_TOP    0x01
-#define ECR_ID_SCISSORS_LEFT   0x02
-#define ECR_ID_SCISSORS_BUTTOM 0x03
-#define ECR_ID_SCISSORS_RIGHT  0x04
-#define ECR_ID_PIX_CNTL                0x0A
-#define ECR_ID_MULT_CNTL_MISC_2        0x0D
-#define ECR_ID_MULT_CNTL_MISC  0x0E
-#define ECR_ID_READ_SEL                0x0F
-#define ECR_PIX_TRANS          0xE2E8
-#define ECR_PIX_TRANS_EXT      0xE2EA
-#define ECR_PATTERN_Y          0xEAE8  /* Trio64 only */
-#define ECR_PATTERN_X          0xEAEA  /* Trio64 only */
-
-
-/* Pass-through */
-#define PASS_ADDRESS           0x40001
-#define PASS_ADDRESS_W         0x40001
-
-/* Video DAC */
-#define VDAC_ADDRESS           0x03c8
-#define VDAC_ADDRESS_W         0x03c8
-#define VDAC_ADDRESS_R         0x03c7
-#define VDAC_STATE             0x03c7
-#define VDAC_DATA              0x03c9
-#define VDAC_MASK              0x03c6
-
-
-#define WGfx(ba, idx, val) \
-do { wb_64(ba, GCT_ADDRESS, idx); wb_64(ba, GCT_ADDRESS_W , val); } while (0)
-
-#define WSeq(ba, idx, val) \
-do { wb_64(ba, SEQ_ADDRESS, idx); wb_64(ba, SEQ_ADDRESS_W , val); } while (0)
-
-#define WCrt(ba, idx, val) \
-do { wb_64(ba, CRT_ADDRESS, idx); wb_64(ba, CRT_ADDRESS_W , val); } while (0)
-
-#define WAttr(ba, idx, val) \
-do { \
-  unsigned char tmp;\
-  tmp = rb_64(ba, ACT_ADDRESS_RESET);\
-  wb_64(ba, ACT_ADDRESS_W, idx);\
-  wb_64(ba, ACT_ADDRESS_W, val);\
-} while (0)
-
-#define SetTextPlane(ba, m) \
-do { \
-  WGfx(ba, GCT_ID_READ_MAP_SELECT, m & 3 );\
-  WSeq(ba, SEQ_ID_MAP_MASK, (1 << (m & 3)));\
-} while (0)
-
-     /* --------------------------------- */
-     /* prototypes                        */
-     /* --------------------------------- */
-
-inline unsigned char RAttr(volatile unsigned char * board, short idx);
-inline unsigned char RSeq(volatile unsigned char * board, short idx);
-inline unsigned char RCrt(volatile unsigned char * board, short idx);
-inline unsigned char RGfx(volatile unsigned char * board, short idx);
-inline void cv64_write_port(unsigned short bits,
-                           volatile unsigned char *board);
-inline void cvscreen(int toggle, volatile unsigned char *board);
-inline void gfx_on_off(int toggle, volatile unsigned char *board);
-#if 0
-unsigned short cv64_compute_clock(unsigned long freq);
-int cv_has_4mb(volatile unsigned char * fb);
-void cv64_board_init(void);
-void cv64_load_video_mode(struct fb_var_screeninfo *video_mode);
-#endif
-
-void cvision_bitblt(u_short sx, u_short sy, u_short dx, u_short dy, u_short w,
-                   u_short h);
-void cvision_clear(u_short dx, u_short dy, u_short w, u_short h, u_short bg);
index 3cfea315a48ff1305c5202a09dd577c709a79fd1..28225265159a7c42b36239918695d7e20bc1f399 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/compat.h>
 #include <linux/types.h>
 #include <linux/errno.h>
-#include <linux/sched.h>
 #include <linux/smp_lock.h>
 #include <linux/kernel.h>
 #include <linux/major.h>
index 323bdf6fc7d5c10ae1360aadf8a904f4c92a52c5..818fb09105f9885829a392e776a9baa8e548c492 100644 (file)
@@ -175,7 +175,7 @@ static ssize_t store_modes(struct device *device,
 
        acquire_console_sem();
        list_splice(&fb_info->modelist, &old_list);
-       fb_videomode_to_modelist((struct fb_videomode *)buf, i,
+       fb_videomode_to_modelist((const struct fb_videomode *)buf, i,
                                 &fb_info->modelist);
        if (fb_new_modelist(fb_info)) {
                fb_destroy_modelist(&fb_info->modelist);
index 1b981b6356757a7cf9b26ea5f179ddeb6febf559..ca93a75f299740e38d1b2feb258bcbb6f6499b93 100644 (file)
@@ -16,7 +16,6 @@
 
 #include <linux/module.h>
 #include <linux/console.h>
-#include <linux/sched.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/string.h>
index bcf9cea54d8ba7448ad298dd75c13648c48d5047..bb20a2289760bffea5e8064b65cd1ff709970f12 100644 (file)
@@ -401,6 +401,30 @@ static void gx1fb_remove(struct pci_dev *pdev)
        framebuffer_release(info);
 }
 
+#ifndef MODULE
+static void __init gx1fb_setup(char *options)
+{
+       char *this_opt;
+
+       if (!options || !*options)
+               return;
+
+       while ((this_opt = strsep(&options, ","))) {
+               if (!*this_opt)
+                       continue;
+
+               if (!strncmp(this_opt, "mode:", 5))
+                       strlcpy(mode_option, this_opt + 5, sizeof(mode_option));
+               else if (!strncmp(this_opt, "crt:", 4))
+                       crt_option = !!simple_strtoul(this_opt + 4, NULL, 0);
+               else if (!strncmp(this_opt, "panel:", 6))
+                       strlcpy(panel_option, this_opt + 6, sizeof(panel_option));
+               else
+                       strlcpy(mode_option, this_opt, sizeof(mode_option));
+       }
+}
+#endif
+
 static struct pci_device_id gx1fb_id_table[] = {
        { PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_VIDEO,
          PCI_ANY_ID, PCI_ANY_ID, PCI_BASE_CLASS_DISPLAY << 16,
@@ -420,8 +444,11 @@ static struct pci_driver gx1fb_driver = {
 static int __init gx1fb_init(void)
 {
 #ifndef MODULE
-       if (fb_get_options("gx1fb", NULL))
+       char *option = NULL;
+
+       if (fb_get_options("gx1fb", &option))
                return -ENODEV;
+       gx1fb_setup(option);
 #endif
        return pci_register_driver(&gx1fb_driver);
 }
index 3dc49424dc75b43e6cc5d2860c5c258011d3162a..756c0ce85911fa8d5c27b6a2254d52cac6323488 100644 (file)
@@ -13,7 +13,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/mm.h>
index 9ab9b839a0f5e57cbf643c9bd7c238388d33ba9a..b18486ad8e17fc11fbea0d9c9e657602c10a13da 100644 (file)
@@ -7,7 +7,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/mm.h>
index 961f4d40446799ac1fdcbec9f15e533f2ee2abc5..7787c3322ffbf82fcf80abc00189a2a9a45d9c8a 100644 (file)
@@ -10,7 +10,6 @@
  */
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/pci.h>
 #include <linux/fb.h>
index 579195c2bea3030bbd2922158cd3289c683d67cf..aa65ffce915b9a62db0ff615e11c1635578d6139 100644 (file)
@@ -264,7 +264,8 @@ struct i810fb_par {
        struct heap_data         cursor_heap;
        struct vgastate          state;
        struct i810fb_i2c_chan   chan[3];
-       atomic_t                 use_count;
+       struct mutex             open_lock;
+       unsigned int             use_count;
        u32 pseudo_palette[17];
        unsigned long mmio_start_phys;
        u8 __iomem *mmio_start_virtual;
index b55a12d95eb22ebe641add5c6c9e9602803b2793..ab1b8fe34d6db9921d67ab966de098750df96d29 100644 (file)
@@ -1049,7 +1049,7 @@ static int i810_check_params(struct fb_var_screeninfo *var,
                mode_valid = 1;
 
        if (!mode_valid && info->monspecs.modedb_len) {
-               struct fb_videomode *mode;
+               const struct fb_videomode *mode;
 
                mode = fb_find_best_mode(var, &info->modelist);
                if (mode) {
@@ -1235,9 +1235,9 @@ static int i810fb_getcolreg(u8 regno, u8 *red, u8 *green, u8 *blue,
 static int i810fb_open(struct fb_info *info, int user)
 {
        struct i810fb_par *par = info->par;
-       u32 count = atomic_read(&par->use_count);
-       
-       if (count == 0) {
+
+       mutex_lock(&par->open_lock);
+       if (par->use_count == 0) {
                memset(&par->state, 0, sizeof(struct vgastate));
                par->state.flags = VGA_SAVE_CMAP;
                par->state.vgabase = par->mmio_start_virtual;
@@ -1246,7 +1246,8 @@ static int i810fb_open(struct fb_info *info, int user)
                i810_save_vga_state(par);
        }
 
-       atomic_inc(&par->use_count);
+       par->use_count++;
+       mutex_unlock(&par->open_lock);
        
        return 0;
 }
@@ -1254,18 +1255,20 @@ static int i810fb_open(struct fb_info *info, int user)
 static int i810fb_release(struct fb_info *info, int user)
 {
        struct i810fb_par *par = info->par;
-       u32 count;
-       
-       count = atomic_read(&par->use_count);
-       if (count == 0)
+
+       mutex_lock(&par->open_lock);
+       if (par->use_count == 0) {
+               mutex_unlock(&par->open_lock);
                return -EINVAL;
+       }
 
-       if (count == 1) {
+       if (par->use_count == 1) {
                i810_restore_vga_state(par);
                restore_vga(&par->state);
        }
 
-       atomic_dec(&par->use_count);
+       par->use_count--;
+       mutex_unlock(&par->open_lock);
        
        return 0;
 }
@@ -1752,6 +1755,8 @@ static void __devinit i810_init_monspecs(struct fb_info *info)
 static void __devinit i810_init_defaults(struct i810fb_par *par, 
                                      struct fb_info *info)
 {
+       mutex_init(&par->open_lock);
+
        if (voffset) 
                v_offset_default = voffset;
        else if (par->aperture.size > 32 * 1024 * 1024)
@@ -1919,7 +1924,7 @@ static void __devinit i810fb_find_init_mode(struct fb_info *info)
        fb_videomode_to_modelist(specs->modedb, specs->modedb_len,
                                 &info->modelist);
        if (specs->modedb != NULL) {
-               struct fb_videomode *m;
+               const struct fb_videomode *m;
 
                if (xres && yres) {
                        if ((m = fb_find_best_mode(&var, &info->modelist))) {
@@ -2016,11 +2021,10 @@ static int __devinit i810fb_init_pci (struct pci_dev *dev,
        par = info->par;
        par->dev = dev;
 
-       if (!(info->pixmap.addr = kmalloc(8*1024, GFP_KERNEL))) {
+       if (!(info->pixmap.addr = kzalloc(8*1024, GFP_KERNEL))) {
                i810fb_release_resource(info, par);
                return -ENOMEM;
        }
-       memset(info->pixmap.addr, 0, 8*1024);
        info->pixmap.size = 8*1024;
        info->pixmap.buf_align = 8;
        info->pixmap.access_align = 32;
index 655ae0fa99cae55ecac13efe6469908ae8afd619..90592fb591560bfb498087d4b641c5ac8176dbb5 100644 (file)
@@ -370,7 +370,6 @@ static int __init iga_init(struct fb_info *info, struct iga_par *par)
 
 int __init igafb_init(void)
 {
-        extern int con_is_present(void);
         struct fb_info *info;
         struct pci_dev *pdev;
         struct iga_par *par;
@@ -402,12 +401,11 @@ int __init igafb_init(void)
        
        size = sizeof(struct fb_info) + sizeof(struct iga_par) + sizeof(u32)*16;
 
-        info = kmalloc(size, GFP_ATOMIC);
+        info = kzalloc(size, GFP_ATOMIC);
         if (!info) {
                 printk("igafb_init: can't alloc fb_info\n");
                 return -ENOMEM;
         }
-        memset(info, 0, size);
 
        par = (struct iga_par *) (info + 1);
        
@@ -466,7 +464,7 @@ int __init igafb_init(void)
         * one additional region with size == 0. 
         */
 
-       par->mmap_map = kmalloc(4 * sizeof(*par->mmap_map), GFP_ATOMIC);
+       par->mmap_map = kzalloc(4 * sizeof(*par->mmap_map), GFP_ATOMIC);
        if (!par->mmap_map) {
                printk("igafb_init: can't alloc mmap_map\n");
                iounmap((void *)par->io_base);
@@ -475,8 +473,6 @@ int __init igafb_init(void)
                return -ENOMEM;
        }
 
-       memset(par->mmap_map, 0, 4 * sizeof(*par->mmap_map));
-
        /*
         * Set default vmode and cmode from PROM properties.
         */
index 0f9b2fdc28b19f4117c01f4b96e98728936b865c..267c1ff9ebd9b8b841bc448cbf8b0005c9df1710 100644 (file)
@@ -20,7 +20,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/interrupt.h>
index 33bc41f50540e8a419ac216a0d7bdff7d4af7dda..f4ede5f6b588da583e43545566737fc736545104 100644 (file)
@@ -27,7 +27,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/pci.h>
 #include <linux/fb.h>
index 664fc5cf962a42f6f18cda1c5dc9f87ee5c236d0..b75eda84858f62ad62937242903ba36bcf471811 100644 (file)
@@ -540,12 +540,11 @@ intelfb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
        dinfo->pdev  = pdev;
 
        /* Reserve pixmap space. */
-       info->pixmap.addr = kmalloc(64 * 1024, GFP_KERNEL);
+       info->pixmap.addr = kzalloc(64 * 1024, GFP_KERNEL);
        if (info->pixmap.addr == NULL) {
                ERR_MSG("Cannot reserve pixmap memory.\n");
                goto err_out_pixmap;
        }
-       memset(info->pixmap.addr, 0, 64 * 1024);
 
        /* set early this option because it could be changed by tv encoder
           driver */
index a95836839e1e965d29739662a1e7ca95a70edef0..c1eb18bf088392655f81886e9ccc9015ebcf6bd2 100644 (file)
@@ -1990,7 +1990,8 @@ int
 intelfbhw_enable_irq(struct intelfb_info *dinfo, int reenable) {
 
        if (!test_and_set_bit(0, &dinfo->irq_flags)) {
-               if (request_irq(dinfo->pdev->irq, intelfbhw_irq, SA_SHIRQ, "intelfb", dinfo)) {
+               if (request_irq(dinfo->pdev->irq, intelfbhw_irq, IRQF_SHARED,
+                    "intelfb", dinfo)) {
                        clear_bit(0, &dinfo->irq_flags);
                        return -EINVAL;
                }
index f0d614a80f1f797dd394dd1c9d3e7a52406cb5c8..1c5579907397ea7e248ce38d0b227c09e6153a68 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/errno.h>
 #include <linux/string.h>
index 180d94c2b4d232e21d02a5b6d90ff8825018da5a..f7d647dda978a7b404b988cbcfc71bee95dbd43f 100644 (file)
@@ -20,7 +20,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/mm.h>
index fe28848e7b52e201f128d58b56f1a50c23a23526..5ec718a5fe2257c093ccaf74f550ba9100bf4c27 100644 (file)
@@ -115,6 +115,7 @@ static int i2c_bus_reg(struct i2c_bit_adapter* b, struct matrox_fb_info* minfo,
                minfo->fbcon.node);
        i2c_set_adapdata(&b->adapter, b);
        b->adapter.algo_data = &b->bac;
+       b->adapter.dev.parent = &ACCESS_FBINFO(pcidev)->dev;
        b->bac = matrox_i2c_algo_template;
        b->bac.data = b;
        err = i2c_bit_add_bus(&b->adapter);
@@ -146,7 +147,7 @@ static void* i2c_matroxfb_probe(struct matrox_fb_info* minfo) {
        unsigned long flags;
        struct matroxfb_dh_maven_info* m2info;
 
-       m2info = kmalloc(sizeof(*m2info), GFP_KERNEL);
+       m2info = kzalloc(sizeof(*m2info), GFP_KERNEL);
        if (!m2info)
                return NULL;
 
@@ -155,8 +156,6 @@ static void* i2c_matroxfb_probe(struct matrox_fb_info* minfo) {
        matroxfb_DAC_out(PMINFO DAC_XGENIOCTRL, 0x00);
        matroxfb_DAC_unlock_irqrestore(flags);
 
-       memset(m2info, 0, sizeof(*m2info));
-
        switch (ACCESS_FBINFO(chip)) {
                case MGA_2064:
                case MGA_2164:
index 2c9801090faeaa89e95b0c9d2a1ad3822052cc61..03ae55b168ff3a9b8e12a43f0e828c2816d945db 100644 (file)
@@ -694,12 +694,11 @@ static void* matroxfb_crtc2_probe(struct matrox_fb_info* minfo) {
        /* hardware is CRTC2 incapable... */
        if (!ACCESS_FBINFO(devflags.crtc2))
                return NULL;
-       m2info = kmalloc(sizeof(*m2info), GFP_KERNEL);
+       m2info = kzalloc(sizeof(*m2info), GFP_KERNEL);
        if (!m2info) {
                printk(KERN_ERR "matroxfb_crtc2: Not enough memory for CRTC2 control structs\n");
                return NULL;
        }
-       memset(m2info, 0, sizeof(*m2info));
        m2info->primary_dev = MINFO;
        if (matroxfb_dh_registerfb(m2info)) {
                kfree(m2info);
index 38c8d38de4fdd5566d065c6e697aa8c6c57637ca..5e91c2b30af9113edc6fc37d2b22752f59caae62 100644 (file)
@@ -25,7 +25,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/mm.h>
index 472a3ca3d92d18af8826310609172d459ef704bf..15b8b3c4330ec3b3aca5813a985ef87101dcb295 100644 (file)
@@ -170,37 +170,37 @@ static ssize_t misc_read_file(struct file *file, char __user *userbuf,
 }
 
 
-static struct file_operations sysconf_fops = {
+static const struct file_operations sysconf_fops = {
        .read = sysconf_read_file,
        .write = write_file_dummy,
        .open = open_file_generic,
 };
 
-static struct file_operations clock_fops = {
+static const struct file_operations clock_fops = {
        .read = clock_read_file,
        .write = write_file_dummy,
        .open = open_file_generic,
 };
 
-static struct file_operations display_fops = {
+static const struct file_operations display_fops = {
        .read = display_read_file,
        .write = write_file_dummy,
        .open = open_file_generic,
 };
 
-static struct file_operations gsctl_fops = {
+static const struct file_operations gsctl_fops = {
        .read = gsctl_read_file,
        .write = write_file_dummy,
        .open = open_file_generic,
 };
 
-static struct file_operations sdram_fops = {
+static const struct file_operations sdram_fops = {
        .read = sdram_read_file,
        .write = write_file_dummy,
        .open = open_file_generic,
 };
 
-static struct file_operations misc_fops = {
+static const struct file_operations misc_fops = {
        .read = misc_read_file,
        .write = write_file_dummy,
        .open = open_file_generic,
index 5df41f6f2b86064f1b1db8d42a10ec5386ea4f4a..3e517940c5a581cdd30f960803e001176bd4b88d 100644 (file)
@@ -13,7 +13,6 @@
 
 #include <linux/module.h>
 #include <linux/fb.h>
-#include <linux/sched.h>
 
 #undef DEBUG
 
@@ -610,10 +609,8 @@ done:
        diff = refresh;
        best = -1;
        for (i = 0; i < dbsize; i++) {
-               if ((name_matches(db[i], name, namelen) &&
-                       !fb_try_mode(var, info, &db[i], bpp)))
-                       return 1;
-               if (res_specified && res_matches(db[i], xres, yres)) {
+               if (name_matches(db[i], name, namelen) ||
+                   (res_specified && res_matches(db[i], xres, yres))) {
                        if(!fb_try_mode(var, info, &db[i], bpp)) {
                                if(!refresh_specified || db[i].refresh == refresh)
                                        return 1;
@@ -670,7 +667,7 @@ done:
  * @var: pointer to struct fb_var_screeninfo
  */
 void fb_var_to_videomode(struct fb_videomode *mode,
-                        struct fb_var_screeninfo *var)
+                        const struct fb_var_screeninfo *var)
 {
        u32 pixclock, hfreq, htotal, vtotal;
 
@@ -714,17 +711,21 @@ void fb_var_to_videomode(struct fb_videomode *mode,
  * @mode: pointer to struct fb_videomode
  */
 void fb_videomode_to_var(struct fb_var_screeninfo *var,
-                              struct fb_videomode *mode)
+                        const struct fb_videomode *mode)
 {
        var->xres = mode->xres;
        var->yres = mode->yres;
+       var->xres_virtual = mode->xres;
+       var->yres_virtual = mode->yres;
+       var->xoffset = 0;
+       var->yoffset = 0;
        var->pixclock = mode->pixclock;
        var->left_margin = mode->left_margin;
-       var->hsync_len = mode->hsync_len;
-       var->vsync_len = mode->vsync_len;
        var->right_margin = mode->right_margin;
        var->upper_margin = mode->upper_margin;
        var->lower_margin = mode->lower_margin;
+       var->hsync_len = mode->hsync_len;
+       var->vsync_len = mode->vsync_len;
        var->sync = mode->sync;
        var->vmode = mode->vmode & FB_VMODE_MASK;
 }
@@ -737,8 +738,8 @@ void fb_videomode_to_var(struct fb_var_screeninfo *var,
  * RETURNS:
  * 1 if equal, 0 if not
  */
-int fb_mode_is_equal(struct fb_videomode *mode1,
-                    struct fb_videomode *mode2)
+int fb_mode_is_equal(const struct fb_videomode *mode1,
+                    const struct fb_videomode *mode2)
 {
        return (mode1->xres         == mode2->xres &&
                mode1->yres         == mode2->yres &&
@@ -770,8 +771,8 @@ int fb_mode_is_equal(struct fb_videomode *mode1,
  * var->xres and var->yres.  If more than 1 videomode is found, will return
  * the videomode with the highest refresh rate
  */
-struct fb_videomode *fb_find_best_mode(struct fb_var_screeninfo *var,
-                                      struct list_head *head)
+const struct fb_videomode *fb_find_best_mode(const struct fb_var_screeninfo *var,
+                                            struct list_head *head)
 {
        struct list_head *pos;
        struct fb_modelist *modelist;
@@ -808,8 +809,8 @@ struct fb_videomode *fb_find_best_mode(struct fb_var_screeninfo *var,
  * If more than 1 videomode is found, will return the videomode with
  * the closest refresh rate.
  */
-struct fb_videomode *fb_find_nearest_mode(struct fb_videomode *mode,
-                                         struct list_head *head)
+const struct fb_videomode *fb_find_nearest_mode(const struct fb_videomode *mode,
+                                               struct list_head *head)
 {
        struct list_head *pos;
        struct fb_modelist *modelist;
@@ -847,8 +848,8 @@ struct fb_videomode *fb_find_nearest_mode(struct fb_videomode *mode,
  * RETURNS:
  * struct fb_videomode, NULL if none found
  */
-struct fb_videomode *fb_match_mode(struct fb_var_screeninfo *var,
-                                  struct list_head *head)
+const struct fb_videomode *fb_match_mode(const struct fb_var_screeninfo *var,
+                                        struct list_head *head)
 {
        struct list_head *pos;
        struct fb_modelist *modelist;
@@ -872,7 +873,7 @@ struct fb_videomode *fb_match_mode(struct fb_var_screeninfo *var,
  * NOTES:
  * Will only add unmatched mode entries
  */
-int fb_add_videomode(struct fb_videomode *mode, struct list_head *head)
+int fb_add_videomode(const struct fb_videomode *mode, struct list_head *head)
 {
        struct list_head *pos;
        struct fb_modelist *modelist;
@@ -907,7 +908,8 @@ int fb_add_videomode(struct fb_videomode *mode, struct list_head *head)
  * NOTES:
  * Will remove all matching mode entries
  */
-void fb_delete_videomode(struct fb_videomode *mode, struct list_head *head)
+void fb_delete_videomode(const struct fb_videomode *mode,
+                        struct list_head *head)
 {
        struct list_head *pos, *n;
        struct fb_modelist *modelist;
@@ -943,7 +945,7 @@ void fb_destroy_modelist(struct list_head *head)
  * @num: number of entries in array
  * @head: struct list_head of modelist
  */
-void fb_videomode_to_modelist(struct fb_videomode *modedb, int num,
+void fb_videomode_to_modelist(const struct fb_videomode *modedb, int num,
                              struct list_head *head)
 {
        int i;
@@ -956,12 +958,12 @@ void fb_videomode_to_modelist(struct fb_videomode *modedb, int num,
        }
 }
 
-struct fb_videomode *fb_find_best_display(struct fb_monspecs *specs,
-                                         struct list_head *head)
+const struct fb_videomode *fb_find_best_display(const struct fb_monspecs *specs,
+                                               struct list_head *head)
 {
        struct list_head *pos;
        struct fb_modelist *modelist;
-       struct fb_videomode *m, *m1 = NULL, *md = NULL, *best = NULL;
+       const struct fb_videomode *m, *m1 = NULL, *md = NULL, *best = NULL;
        int first = 0;
 
        if (!head->prev || !head->next || list_empty(head))
index deaf820cb38f798542271ef2ebf65277f5efc087..395ccedde9a63b5718afdefb34d3f3c4f7235db8 100644 (file)
@@ -66,7 +66,6 @@
 #include <linux/init.h>
 #ifdef CONFIG_TOSHIBA
 #include <linux/toshiba.h>
-extern int tosh_smm(SMMRegisters *regs);
 #endif
 
 #include <asm/io.h>
@@ -557,14 +556,16 @@ static int
 neofb_open(struct fb_info *info, int user)
 {
        struct neofb_par *par = info->par;
-       int cnt = atomic_read(&par->ref_count);
 
-       if (!cnt) {
+       mutex_lock(&par->open_lock);
+       if (!par->ref_count) {
                memset(&par->state, 0, sizeof(struct vgastate));
                par->state.flags = VGA_SAVE_MODE | VGA_SAVE_FONTS;
                save_vga(&par->state);
        }
-       atomic_inc(&par->ref_count);
+       par->ref_count++;
+       mutex_unlock(&par->open_lock);
+
        return 0;
 }
 
@@ -572,14 +573,18 @@ static int
 neofb_release(struct fb_info *info, int user)
 {
        struct neofb_par *par = info->par;
-       int cnt = atomic_read(&par->ref_count);
 
-       if (!cnt)
+       mutex_lock(&par->open_lock);
+       if (!par->ref_count) {
+               mutex_unlock(&par->open_lock);
                return -EINVAL;
-       if (cnt == 1) {
+       }
+       if (par->ref_count == 1) {
                restore_vga(&par->state);
        }
-       atomic_dec(&par->ref_count);
+       par->ref_count--;
+       mutex_unlock(&par->open_lock);
+
        return 0;
 }
 
@@ -2048,6 +2053,7 @@ static struct fb_info *__devinit neo_alloc_fb_info(struct pci_dev *dev, const st
 
        info->fix.accel = id->driver_data;
 
+       mutex_init(&par->open_lock);
        par->pci_burst = !nopciburst;
        par->lcd_stretch = !nostretch;
        par->libretto = libretto;
index 8454adf2d178abb9cc49bebf56226d17db804c77..b8588973e400936eec3f3dccd2c3400affcf298b 100644 (file)
@@ -12,7 +12,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/pci.h>
 #include <linux/fb.h>
index 181875fe35c662899e5964d52da76d7ca6a483ce..163a774a1b30bdbfb95471b1b56d16dc7edca209 100644 (file)
@@ -12,7 +12,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/pci.h>
 #include <linux/fb.h>
index 538e947610e19374dfa71c66d310f444262ac636..8e5b484db6498253fceaea43d818a13cbaa6970f 100644 (file)
@@ -829,7 +829,7 @@ static int nvidiafb_check_var(struct fb_var_screeninfo *var,
        }
 
        if (!mode_valid) {
-               struct fb_videomode *mode;
+               const struct fb_videomode *mode;
 
                mode = fb_find_best_mode(var, &info->modelist);
                if (mode) {
@@ -1046,10 +1046,10 @@ static int __devinit nvidia_set_fbinfo(struct fb_info *info)
        }
 
        if (specs->modedb != NULL) {
-               struct fb_videomode *modedb;
+               const struct fb_videomode *mode;
 
-               modedb = fb_find_best_display(specs, &info->modelist);
-               fb_videomode_to_var(&nvidiafb_default_var, modedb);
+               mode = fb_find_best_display(specs, &info->modelist);
+               fb_videomode_to_var(&nvidiafb_default_var, mode);
                nvidiafb_default_var.bits_per_pixel = bpp;
        } else if (par->fpWidth && par->fpHeight) {
                char buf[16];
@@ -1205,13 +1205,11 @@ static int __devinit nvidiafb_probe(struct pci_dev *pd,
        par = info->par;
        par->pci_dev = pd;
 
-       info->pixmap.addr = kmalloc(8 * 1024, GFP_KERNEL);
+       info->pixmap.addr = kzalloc(8 * 1024, GFP_KERNEL);
 
        if (info->pixmap.addr == NULL)
                goto err_out_kfree;
 
-       memset(info->pixmap.addr, 0, 8 * 1024);
-
        if (pci_enable_device(pd)) {
                printk(KERN_ERR PFX "cannot enable PCI device\n");
                goto err_out_enable;
@@ -1347,7 +1345,7 @@ err_out:
        return -ENODEV;
 }
 
-static void __exit nvidiafb_remove(struct pci_dev *pd)
+static void __devexit nvidiafb_remove(struct pci_dev *pd)
 {
        struct fb_info *info = pci_get_drvdata(pd);
        struct nvidia_par *par = info->par;
@@ -1433,7 +1431,7 @@ static struct pci_driver nvidiafb_driver = {
        .probe    = nvidiafb_probe,
        .suspend  = nvidiafb_suspend,
        .resume   = nvidiafb_resume,
-       .remove   = __exit_p(nvidiafb_remove),
+       .remove   = __devexit_p(nvidiafb_remove),
 };
 
 /* ------------------------------------------------------------------------- *
index 1d81ef47efd336a1f66536d9190e0b190963b876..bd787e80177d332c29357ab86420337de9a2585e 100644 (file)
@@ -3299,14 +3299,12 @@ static void pm3fb_detect(void)
                fb_info[i].dev = NULL;
        }
 
-       dev =
-           pci_find_device(PCI_VENDOR_ID_3DLABS,
+       dev = pci_get_device(PCI_VENDOR_ID_3DLABS,
                            PCI_DEVICE_ID_3DLABS_PERMEDIA3, dev);
 
        for (i = 0; ((i < PM3_MAX_BOARD) && dev); i++) {
                dev_array[i] = dev;
-               dev =
-                   pci_find_device(PCI_VENDOR_ID_3DLABS,
+               dev = pci_get_device(PCI_VENDOR_ID_3DLABS,
                                    PCI_DEVICE_ID_3DLABS_PERMEDIA3, dev);
        }
 
@@ -3353,7 +3351,7 @@ static void pm3fb_detect(void)
        /* now, initialize... or not */
        for (i = 0; i < PM3_MAX_BOARD; i++) {
                l_fb_info = &(fb_info[i]);
-               if ((l_fb_info->dev) && (!disable[i])) {        /* PCI device was found and not disabled by user */
+               if (l_fb_info->dev && !disable[i]) {    /* PCI device was found and not disabled by user */
                        DPRINTK(2,
                                "found @%lx Vendor %lx Device %lx ; base @ : %lx - %lx - %lx - %lx - %lx - %lx, irq %ld\n",
                                (unsigned long) l_fb_info->dev,
@@ -3608,7 +3606,7 @@ int init_module(void)
 
        pm3fb_init();
 
-       return (0);
+       return 0;
 }
 
 void cleanup_module(void)
@@ -3619,23 +3617,18 @@ void cleanup_module(void)
                struct pm3fb_info *l_fb_info;
                for (i = 0; i < PM3_MAX_BOARD; i++) {
                        l_fb_info = &(fb_info[i]);
-                       if ((l_fb_info->dev != NULL)
-                           && (!(disable[l_fb_info->board_num]))) {
-                               if (l_fb_info->vIOBase !=
-                                   (unsigned char *) -1) {
+                       pci_dev_put(l_fb_info->dev);
+                       if (l_fb_info->dev != NULL  && !(disable[l_fb_info->board_num])) {
+                               if (l_fb_info->vIOBase != (unsigned char *) -1) {
                                        pm3fb_unmapIO(l_fb_info);
                                        release_mem_region(l_fb_info->p_fb,
-                                                          l_fb_info->
-                                                          fb_size);
-                                       release_mem_region(l_fb_info->
-                                                          pIOBase,
-                                                          PM3_REGS_SIZE);
+                                                  l_fb_info->fb_size);
+                                       release_mem_region(l_fb_info->pIOBase,
+                                                  PM3_REGS_SIZE);
                                }
-                               unregister_framebuffer(&l_fb_info->gen.
-                                                      info);
+                               unregister_framebuffer(&l_fb_info->gen.info);
                        }
                }
        }
-       return;
 }
 #endif /* MODULE */
index 68ca3cc40770ccda101cd79097f28a6d6952f980..a864438b6008bcde0d9baba19821f13fff1b6435 100644 (file)
@@ -24,7 +24,6 @@
  */
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/timer.h>
diff --git a/drivers/video/ps3fb.c b/drivers/video/ps3fb.c
new file mode 100644 (file)
index 0000000..81e43cd
--- /dev/null
@@ -0,0 +1,1229 @@
+/*
+ *  linux/drivers/video/ps3fb.c -- PS3 GPU frame buffer device
+ *
+ *     Copyright (C) 2006 Sony Computer Entertainment Inc.
+ *     Copyright 2006, 2007 Sony Corporation
+ *
+ *  This file is based on :
+ *
+ *  linux/drivers/video/vfb.c -- Virtual frame buffer device
+ *
+ *     Copyright (C) 2002 James Simmons
+ *
+ *     Copyright (C) 1997 Geert Uytterhoeven
+ *
+ *  This file is subject to the terms and conditions of the GNU General Public
+ *  License. See the file COPYING in the main directory of this archive for
+ *  more details.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+#include <linux/tty.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/platform_device.h>
+#include <linux/console.h>
+#include <linux/ioctl.h>
+#include <linux/notifier.h>
+#include <linux/reboot.h>
+
+#include <asm/uaccess.h>
+#include <linux/fb.h>
+#include <linux/init.h>
+#include <asm/time.h>
+
+#include <asm/abs_addr.h>
+#include <asm/lv1call.h>
+#include <asm/ps3av.h>
+#include <asm/ps3fb.h>
+#include <asm/ps3.h>
+
+#ifdef PS3FB_DEBUG
+#define DPRINTK(fmt, args...) printk("%s: " fmt, __FUNCTION__ , ##args)
+#else
+#define DPRINTK(fmt, args...)
+#endif
+
+#define L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC   0x101
+#define L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP   0x102
+#define L1GPU_CONTEXT_ATTRIBUTE_FB_SETUP       0x600
+#define L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT                0x601
+#define L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT_SYNC   0x602
+
+#define L1GPU_FB_BLIT_WAIT_FOR_COMPLETION      (1ULL << 32)
+
+#define L1GPU_DISPLAY_SYNC_HSYNC               1
+#define L1GPU_DISPLAY_SYNC_VSYNC               2
+
+#define DDR_SIZE                               (0)     /* used no ddr */
+#define GPU_OFFSET                             (64 * 1024)
+#define GPU_IOIF                               (0x0d000000UL)
+
+#define PS3FB_FULL_MODE_BIT                    0x80
+
+#define GPU_INTR_STATUS_VSYNC_0                        0       /* vsync on head A */
+#define GPU_INTR_STATUS_VSYNC_1                        1       /* vsync on head B */
+#define GPU_INTR_STATUS_FLIP_0                 3       /* flip head A */
+#define GPU_INTR_STATUS_FLIP_1                 4       /* flip head B */
+#define GPU_INTR_STATUS_QUEUE_0                        5       /* queue head A */
+#define GPU_INTR_STATUS_QUEUE_1                        6       /* queue head B */
+
+#define GPU_DRIVER_INFO_VERSION                        0x211
+
+/* gpu internals */
+struct display_head {
+       u64 be_time_stamp;
+       u32 status;
+       u32 offset;
+       u32 res1;
+       u32 res2;
+       u32 field;
+       u32 reserved1;
+
+       u64 res3;
+       u32 raster;
+
+       u64 vblank_count;
+       u32 field_vsync;
+       u32 reserved2;
+};
+
+struct gpu_irq {
+       u32 irq_outlet;
+       u32 status;
+       u32 mask;
+       u32 video_cause;
+       u32 graph_cause;
+       u32 user_cause;
+
+       u32 res1;
+       u64 res2;
+
+       u32 reserved[4];
+};
+
+struct gpu_driver_info {
+       u32 version_driver;
+       u32 version_gpu;
+       u32 memory_size;
+       u32 hardware_channel;
+
+       u32 nvcore_frequency;
+       u32 memory_frequency;
+
+       u32 reserved[1063];
+       struct display_head display_head[8];
+       struct gpu_irq irq;
+};
+
+struct ps3fb_priv {
+       unsigned int irq_no;
+       void *dev;
+
+       u64 context_handle, memory_handle;
+       void *xdr_ea;
+       struct gpu_driver_info *dinfo;
+       struct semaphore sem;
+       u32 res_index;
+
+       u64 vblank_count;       /* frame count */
+       wait_queue_head_t wait_vsync;
+
+       u32 num_frames;         /* num of frame buffers */
+       atomic_t ext_flip;      /* on/off flip with vsync */
+       atomic_t f_count;       /* fb_open count */
+       int is_blanked;
+};
+static struct ps3fb_priv ps3fb;
+
+struct ps3fb_res_table {
+       u32 xres;
+       u32 yres;
+       u32 xoff;
+       u32 yoff;
+       u32 type;
+};
+#define PS3FB_RES_FULL 1
+static const struct ps3fb_res_table ps3fb_res[] = {
+       /* res_x,y   margin_x,y  full */
+       {  720,  480,  72,  48 , 0},
+       {  720,  576,  72,  58 , 0},
+       { 1280,  720,  78,  38 , 0},
+       { 1920, 1080, 116,  58 , 0},
+       /* full mode */
+       {  720,  480,   0,   0 , PS3FB_RES_FULL},
+       {  720,  576,   0,   0 , PS3FB_RES_FULL},
+       { 1280,  720,   0,   0 , PS3FB_RES_FULL},
+       { 1920, 1080,   0,   0 , PS3FB_RES_FULL},
+       /* vesa: normally full mode */
+       { 1280,  768,   0,   0 , 0},
+       { 1280, 1024,   0,   0 , 0},
+       { 1920, 1200,   0,   0 , 0},
+       {    0,    0,   0,   0 , 0} };
+
+/* default resolution */
+#define GPU_RES_INDEX 0                /* 720 x 480 */
+
+static const struct fb_videomode ps3fb_modedb[] = {
+    /* 60 Hz broadcast modes (modes "1" to "5") */
+    {
+        /* 480i */
+        "480i", 60, 576, 384, 74074, 130, 89, 78, 57, 63, 6,
+        FB_SYNC_BROADCAST, FB_VMODE_INTERLACED
+    },    {
+        /* 480p */
+        "480p", 60, 576, 384, 37037, 130, 89, 78, 57, 63, 6,
+        FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED
+    },    {
+        /* 720p */
+        "720p", 60, 1124, 644, 13481, 298, 148, 57, 44, 80, 5,
+        FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED
+    },    {
+        /* 1080i */
+        "1080i", 60, 1688, 964, 13481, 264, 160, 94, 62, 88, 5,
+        FB_SYNC_BROADCAST, FB_VMODE_INTERLACED
+    },    {
+        /* 1080p */
+        "1080p", 60, 1688, 964, 6741, 264, 160, 94, 62, 88, 5,
+        FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED
+    },
+
+    /* 50 Hz broadcast modes (modes "6" to "10") */
+    {
+        /* 576i */
+        "576i", 50, 576, 460, 74074, 142, 83, 97, 63, 63, 5,
+        FB_SYNC_BROADCAST, FB_VMODE_INTERLACED
+    },    {
+        /* 576p */
+        "576p", 50, 576, 460, 37037, 142, 83, 97, 63, 63, 5,
+        FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED
+    },    {
+        /* 720p */
+        "720p", 50, 1124, 644, 13468, 298, 478, 57, 44, 80, 5,
+        FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED
+    },    {
+        /* 1080 */
+        "1080i", 50, 1688, 964, 13468, 264, 600, 94, 62, 88, 5,
+        FB_SYNC_BROADCAST, FB_VMODE_INTERLACED
+    },    {
+        /* 1080p */
+        "1080p", 50, 1688, 964, 6734, 264, 600, 94, 62, 88, 5,
+        FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED
+    },
+
+    /* VESA modes (modes "11" to "13") */
+    {
+       /* WXGA */
+       "wxga", 60, 1280, 768, 12924, 160, 24, 29, 3, 136, 6,
+       0, FB_VMODE_NONINTERLACED,
+       FB_MODE_IS_VESA
+    }, {
+       /* SXGA */
+       "sxga", 60, 1280, 1024, 9259, 248, 48, 38, 1, 112, 3,
+       FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED,
+       FB_MODE_IS_VESA
+    }, {
+       /* WUXGA */
+       "wuxga", 60, 1920, 1200, 6494, 80, 48, 26, 3, 32, 6,
+       FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED,
+       FB_MODE_IS_VESA
+    },
+
+    /* 60 Hz broadcast modes (full resolution versions of modes "1" to "5") */
+    {
+       /* 480if */
+       "480if", 60, 720, 480, 74074, 58, 17, 30, 9, 63, 6,
+       FB_SYNC_BROADCAST, FB_VMODE_INTERLACED
+    }, {
+       /* 480pf */
+       "480pf", 60, 720, 480, 37037, 58, 17, 30, 9, 63, 6,
+       FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED
+    }, {
+       /* 720pf */
+       "720pf", 60, 1280, 720, 13481, 220, 70, 19, 6, 80, 5,
+       FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED
+    }, {
+       /* 1080if */
+       "1080if", 60, 1920, 1080, 13481, 148, 44, 36, 4, 88, 5,
+       FB_SYNC_BROADCAST, FB_VMODE_INTERLACED
+    }, {
+       /* 1080pf */
+       "1080pf", 60, 1920, 1080, 6741, 148, 44, 36, 4, 88, 5,
+       FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED
+    },
+
+    /* 50 Hz broadcast modes (full resolution versions of modes "6" to "10") */
+    {
+       /* 576if */
+       "576if", 50, 720, 576, 74074, 70, 11, 39, 5, 63, 5,
+       FB_SYNC_BROADCAST, FB_VMODE_INTERLACED
+    }, {
+       /* 576pf */
+       "576pf", 50, 720, 576, 37037, 70, 11, 39, 5, 63, 5,
+       FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED
+    }, {
+       /* 720pf */
+       "720pf", 50, 1280, 720, 13468, 220, 400, 19, 6, 80, 5,
+       FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED
+    }, {
+       /* 1080if */
+       "1080f", 50, 1920, 1080, 13468, 148, 484, 36, 4, 88, 5,
+       FB_SYNC_BROADCAST, FB_VMODE_INTERLACED
+    }, {
+       /* 1080pf */
+       "1080pf", 50, 1920, 1080, 6734, 148, 484, 36, 4, 88, 5,
+       FB_SYNC_BROADCAST, FB_VMODE_NONINTERLACED
+    }
+};
+
+
+#define HEAD_A
+#define HEAD_B
+
+#define X_OFF(i)       (ps3fb_res[i].xoff)     /* left/right margin (pixel) */
+#define Y_OFF(i)       (ps3fb_res[i].yoff)     /* top/bottom margin (pixel) */
+#define WIDTH(i)       (ps3fb_res[i].xres)     /* width of FB */
+#define HEIGHT(i)      (ps3fb_res[i].yres)     /* height of FB */
+#define BPP    4               /* number of bytes per pixel */
+#define VP_OFF(i)      (WIDTH(i) * Y_OFF(i) * BPP + X_OFF(i) * BPP)
+#define FB_OFF(i)      (GPU_OFFSET - VP_OFF(i) % GPU_OFFSET)
+
+static int ps3fb_mode = 0;
+module_param(ps3fb_mode, bool, 0);
+
+static char *mode_option __initdata = NULL;
+
+
+static int ps3fb_get_res_table(u32 xres, u32 yres)
+{
+       int full_mode;
+       unsigned int i;
+       u32 x, y, f;
+
+       full_mode = (ps3fb_mode & PS3FB_FULL_MODE_BIT) ? PS3FB_RES_FULL : 0;
+       for (i = 0;; i++) {
+               x = ps3fb_res[i].xres;
+               y = ps3fb_res[i].yres;
+               f = ps3fb_res[i].type;
+
+               if (!x) {
+                       DPRINTK("ERROR: ps3fb_get_res_table()\n");
+                       return -1;
+               }
+
+               if (full_mode == PS3FB_RES_FULL && f != PS3FB_RES_FULL)
+                       continue;
+
+               if (x == xres && (yres == 0 || y == yres))
+                       break;
+
+               x = x - 2 * ps3fb_res[i].xoff;
+               y = y - 2 * ps3fb_res[i].yoff;
+               if (x == xres && (yres == 0 || y == yres))
+                       break;
+       }
+       return i;
+}
+
+static unsigned int ps3fb_find_mode(const struct fb_var_screeninfo *var,
+                                   u32 *line_length)
+{
+       unsigned int i, mode;
+
+       for (i = 0; i < ARRAY_SIZE(ps3fb_modedb); i++)
+               if (var->xres == ps3fb_modedb[i].xres &&
+                   var->yres == ps3fb_modedb[i].yres &&
+                   var->pixclock == ps3fb_modedb[i].pixclock &&
+                   var->hsync_len == ps3fb_modedb[i].hsync_len &&
+                   var->vsync_len == ps3fb_modedb[i].vsync_len &&
+                   var->left_margin == ps3fb_modedb[i].left_margin &&
+                   var->right_margin == ps3fb_modedb[i].right_margin &&
+                   var->upper_margin == ps3fb_modedb[i].upper_margin &&
+                   var->lower_margin == ps3fb_modedb[i].lower_margin &&
+                   var->sync == ps3fb_modedb[i].sync &&
+                   (var->vmode & FB_VMODE_MASK) == ps3fb_modedb[i].vmode) {
+                       /* Cropped broadcast modes use the full line_length */
+                       *line_length =
+                           ps3fb_modedb[i < 10 ? i + 13 : i].xres * 4;
+                       /* Full broadcast modes have the full mode bit set */
+                       mode = i > 12 ? (i - 12) | PS3FB_FULL_MODE_BIT : i + 1;
+
+                       DPRINTK("ps3fb_find_mode: mode %u\n", mode);
+                       return mode;
+               }
+
+       DPRINTK("ps3fb_find_mode: mode not found\n");
+       return 0;
+
+}
+
+static const struct fb_videomode *ps3fb_default_mode(void)
+{
+       u32 mode = ps3fb_mode & PS3AV_MODE_MASK;
+       u32 flags;
+
+       if (mode < 1 || mode > 13)
+               return NULL;
+
+       flags = ps3fb_mode & ~PS3AV_MODE_MASK;
+
+       if (mode <= 10 && flags & PS3FB_FULL_MODE_BIT) {
+               /* Full broadcast mode */
+               return &ps3fb_modedb[mode + 12];
+       }
+
+       return &ps3fb_modedb[mode - 1];
+}
+
+static int ps3fb_sync(u32 frame)
+{
+       int i, status;
+       u32 xres, yres;
+       u64 fb_ioif, offset;
+
+       i = ps3fb.res_index;
+       xres = ps3fb_res[i].xres;
+       yres = ps3fb_res[i].yres;
+
+       if (frame > ps3fb.num_frames - 1) {
+               printk(KERN_WARNING "%s: invalid frame number (%u)\n",
+                      __FUNCTION__, frame);
+               return -EINVAL;
+       }
+       offset = xres * yres * BPP * frame;
+
+       fb_ioif = GPU_IOIF + FB_OFF(i) + offset;
+       status = lv1_gpu_context_attribute(ps3fb.context_handle,
+                                          L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT,
+                                          offset, fb_ioif,
+                                          L1GPU_FB_BLIT_WAIT_FOR_COMPLETION |
+                                          (xres << 16) | yres,
+                                          xres * BPP); /* line_length */
+       if (status)
+               printk(KERN_ERR "%s: lv1_gpu_context_attribute FB_BLIT failed: %d\n",
+                      __FUNCTION__, status);
+#ifdef HEAD_A
+       status = lv1_gpu_context_attribute(ps3fb.context_handle,
+                                          L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP,
+                                          0, offset, 0, 0);
+       if (status)
+               printk(KERN_ERR "%s: lv1_gpu_context_attribute FLIP failed: %d\n",
+                      __FUNCTION__, status);
+#endif
+#ifdef HEAD_B
+       status = lv1_gpu_context_attribute(ps3fb.context_handle,
+                                          L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP,
+                                          1, offset, 0, 0);
+       if (status)
+               printk(KERN_ERR "%s: lv1_gpu_context_attribute FLIP failed: %d\n",
+                      __FUNCTION__, status);
+#endif
+       return 0;
+}
+
+
+static int ps3fb_open(struct fb_info *info, int user)
+{
+       atomic_inc(&ps3fb.f_count);
+       return 0;
+}
+
+static int ps3fb_release(struct fb_info *info, int user)
+{
+       if (atomic_dec_and_test(&ps3fb.f_count)) {
+               if (atomic_read(&ps3fb.ext_flip)) {
+                       atomic_set(&ps3fb.ext_flip, 0);
+                       ps3fb_sync(0);  /* single buffer */
+               }
+       }
+       return 0;
+}
+
+    /*
+     *  Setting the video mode has been split into two parts.
+     *  First part, xxxfb_check_var, must not write anything
+     *  to hardware, it should only verify and adjust var.
+     *  This means it doesn't alter par but it does use hardware
+     *  data from it to check this var.
+     */
+
+static int ps3fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
+{
+       u32 line_length;
+       int mode;
+       int i;
+
+       DPRINTK("var->xres:%u info->var.xres:%u\n", var->xres, info->var.xres);
+       DPRINTK("var->yres:%u info->var.yres:%u\n", var->yres, info->var.yres);
+
+       /* FIXME For now we do exact matches only */
+       mode = ps3fb_find_mode(var, &line_length);
+       if (!mode)
+               return -EINVAL;
+
+       /*
+        *  FB_VMODE_CONUPDATE and FB_VMODE_SMOOTH_XPAN are equal!
+        *  as FB_VMODE_SMOOTH_XPAN is only used internally
+        */
+
+       if (var->vmode & FB_VMODE_CONUPDATE) {
+               var->vmode |= FB_VMODE_YWRAP;
+               var->xoffset = info->var.xoffset;
+               var->yoffset = info->var.yoffset;
+       }
+
+       /* Virtual screen and panning are not supported */
+       if (var->xres_virtual > var->xres || var->yres_virtual > var->yres ||
+           var->xoffset || var->yoffset) {
+               DPRINTK("Virtual screen and panning are not supported\n");
+               return -EINVAL;
+       }
+
+       var->xres_virtual = var->xres;
+       var->yres_virtual = var->yres;
+
+       /* We support ARGB8888 only */
+       if (var->bits_per_pixel > 32 || var->grayscale ||
+           var->red.offset > 16 || var->green.offset > 8 ||
+           var->blue.offset > 0 || var->transp.offset > 24 ||
+           var->red.length > 8 || var->green.length > 8 ||
+           var->blue.length > 8 || var->transp.length > 8 ||
+           var->red.msb_right || var->green.msb_right ||
+           var->blue.msb_right || var->transp.msb_right || var->nonstd) {
+               DPRINTK("We support ARGB8888 only\n");
+               return -EINVAL;
+       }
+
+       var->bits_per_pixel = 32;
+       var->red.offset = 16;
+       var->green.offset = 8;
+       var->blue.offset = 0;
+       var->transp.offset = 24;
+       var->red.length = 8;
+       var->green.length = 8;
+       var->blue.length = 8;
+       var->transp.length = 8;
+       var->red.msb_right = 0;
+       var->green.msb_right = 0;
+       var->blue.msb_right = 0;
+       var->transp.msb_right = 0;
+
+       /* Rotation is not supported */
+       if (var->rotate) {
+               DPRINTK("Rotation is not supported\n");
+               return -EINVAL;
+       }
+
+       /* Memory limit */
+       i = ps3fb_get_res_table(var->xres, var->yres);
+       if (ps3fb_res[i].xres*ps3fb_res[i].yres*BPP > ps3fb_videomemory.size) {
+               DPRINTK("Not enough memory\n");
+               return -ENOMEM;
+       }
+
+       var->height = -1;
+       var->width = -1;
+
+       return 0;
+}
+
+    /*
+     * This routine actually sets the video mode.
+     */
+
+static int ps3fb_set_par(struct fb_info *info)
+{
+       unsigned int mode;
+       int i;
+       unsigned long offset;
+       static int first = 1;
+
+       DPRINTK("xres:%d xv:%d yres:%d yv:%d clock:%d\n",
+               info->var.xres, info->var.xres_virtual,
+               info->var.yres, info->var.yres_virtual, info->var.pixclock);
+       i = ps3fb_get_res_table(info->var.xres, info->var.yres);
+       ps3fb.res_index = i;
+
+       mode = ps3fb_find_mode(&info->var, &info->fix.line_length);
+       if (!mode)
+               return -EINVAL;
+
+       offset = FB_OFF(i) + VP_OFF(i);
+       info->fix.smem_len = ps3fb_videomemory.size - offset;
+       info->screen_base = (char __iomem *)ps3fb.xdr_ea + offset;
+       memset(ps3fb.xdr_ea, 0, ps3fb_videomemory.size);
+
+       ps3fb.num_frames = ps3fb_videomemory.size/
+                          (ps3fb_res[i].xres*ps3fb_res[i].yres*BPP);
+
+       /* Keep the special bits we cannot set using fb_var_screeninfo */
+       ps3fb_mode = (ps3fb_mode & ~PS3AV_MODE_MASK) | mode;
+
+       if (ps3av_set_video_mode(ps3fb_mode, first))
+               return -EINVAL;
+
+       first = 0;
+       return 0;
+}
+
+    /*
+     *  Set a single color register. The values supplied are already
+     *  rounded down to the hardware's capabilities (according to the
+     *  entries in the var structure). Return != 0 for invalid regno.
+     */
+
+static int ps3fb_setcolreg(unsigned int regno, unsigned int red,
+                          unsigned int green, unsigned int blue,
+                          unsigned int transp, struct fb_info *info)
+{
+       if (regno >= 16)
+               return 1;
+
+       red >>= 8;
+       green >>= 8;
+       blue >>= 8;
+       transp >>= 8;
+
+       ((u32 *)info->pseudo_palette)[regno] = transp << 24 | red << 16 |
+                                              green << 8 | blue;
+       return 0;
+}
+
+    /*
+     *  As we have a virtual frame buffer, we need our own mmap function
+     */
+
+static int ps3fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
+{
+       unsigned long size, offset;
+       int i;
+
+       i = ps3fb_get_res_table(info->var.xres, info->var.yres);
+       if (i == -1)
+               return -EINVAL;
+
+       size = vma->vm_end - vma->vm_start;
+       offset = vma->vm_pgoff << PAGE_SHIFT;
+       if (offset + size > info->fix.smem_len)
+               return -EINVAL;
+
+       offset += info->fix.smem_start + FB_OFF(i) + VP_OFF(i);
+       if (remap_pfn_range(vma, vma->vm_start, offset >> PAGE_SHIFT,
+                           size, vma->vm_page_prot))
+               return -EAGAIN;
+
+       printk(KERN_DEBUG "ps3fb: mmap framebuffer P(%lx)->V(%lx)\n", offset,
+              vma->vm_start);
+       return 0;
+}
+
+    /*
+     * Blank the display
+     */
+
+static int ps3fb_blank(int blank, struct fb_info *info)
+{
+       int retval;
+
+       DPRINTK("%s: blank:%d\n", __FUNCTION__, blank);
+       switch (blank) {
+       case FB_BLANK_POWERDOWN:
+       case FB_BLANK_HSYNC_SUSPEND:
+       case FB_BLANK_VSYNC_SUSPEND:
+       case FB_BLANK_NORMAL:
+               retval = ps3av_video_mute(1);   /* mute on */
+               if (!retval)
+                       ps3fb.is_blanked = 1;
+               break;
+
+       default:                /* unblank */
+               retval = ps3av_video_mute(0);   /* mute off */
+               if (!retval)
+                       ps3fb.is_blanked = 0;
+               break;
+       }
+       return retval;
+}
+
+static int ps3fb_get_vblank(struct fb_vblank *vblank)
+{
+       memset(vblank, 0, sizeof(&vblank));
+       vblank->flags = FB_VBLANK_HAVE_VSYNC;
+       return 0;
+}
+
+int ps3fb_wait_for_vsync(u32 crtc)
+{
+       int ret;
+       u64 count;
+
+       count = ps3fb.vblank_count;
+       ret = wait_event_interruptible_timeout(ps3fb.wait_vsync,
+                                              count != ps3fb.vblank_count,
+                                              HZ / 10);
+       if (!ret)
+               return -ETIMEDOUT;
+
+       return 0;
+}
+
+EXPORT_SYMBOL_GPL(ps3fb_wait_for_vsync);
+
+void ps3fb_flip_ctl(int on)
+{
+       if (on) {
+               if (atomic_read(&ps3fb.ext_flip) > 0) {
+                       atomic_dec(&ps3fb.ext_flip);
+               }
+       } else {
+               atomic_inc(&ps3fb.ext_flip);
+       }
+}
+
+EXPORT_SYMBOL_GPL(ps3fb_flip_ctl);
+
+    /*
+     * ioctl
+     */
+
+static int ps3fb_ioctl(struct fb_info *info, unsigned int cmd,
+                      unsigned long arg)
+{
+       void __user *argp = (void __user *)arg;
+       u32 val, old_mode;
+       int retval = -EFAULT;
+
+       switch (cmd) {
+       case FBIOGET_VBLANK:
+               {
+                       struct fb_vblank vblank;
+                       DPRINTK("FBIOGET_VBLANK:\n");
+                       retval = ps3fb_get_vblank(&vblank);
+                       if (retval)
+                               break;
+
+                       if (copy_to_user(argp, &vblank, sizeof(vblank)))
+                               retval = -EFAULT;
+                       break;
+               }
+
+       case FBIO_WAITFORVSYNC:
+               {
+                       u32 crt;
+                       DPRINTK("FBIO_WAITFORVSYNC:\n");
+                       if (get_user(crt, (u32 __user *) arg))
+                               break;
+
+                       retval = ps3fb_wait_for_vsync(crt);
+                       break;
+               }
+
+       case PS3FB_IOCTL_SETMODE:
+               {
+                       const struct fb_videomode *mode;
+                       struct fb_var_screeninfo var;
+
+                       if (copy_from_user(&val, argp, sizeof(val)))
+                               break;
+
+                       DPRINTK("PS3FB_IOCTL_SETMODE:%x\n", val);
+                       retval = -EINVAL;
+                       old_mode = ps3fb_mode;
+                       ps3fb_mode = val;
+                       mode = ps3fb_default_mode();
+                       if (mode) {
+                               var = info->var;
+                               fb_videomode_to_var(&var, mode);
+                               acquire_console_sem();
+                               info->flags |= FBINFO_MISC_USEREVENT;
+                               /* Force, in case only special bits changed */
+                               var.activate |= FB_ACTIVATE_FORCE;
+                               retval = fb_set_var(info, &var);
+                               info->flags &= ~FBINFO_MISC_USEREVENT;
+                               release_console_sem();
+                       }
+                       if (retval)
+                               ps3fb_mode = old_mode;
+                       break;
+               }
+
+       case PS3FB_IOCTL_GETMODE:
+               val = ps3av_get_mode();
+               DPRINTK("PS3FB_IOCTL_GETMODE:%x\n", val);
+               if (!copy_to_user(argp, &val, sizeof(val)))
+                       retval = 0;
+               break;
+
+       case PS3FB_IOCTL_SCREENINFO:
+               {
+                       struct ps3fb_ioctl_res res;
+                       int i = ps3fb.res_index;
+                       DPRINTK("PS3FB_IOCTL_SCREENINFO:\n");
+                       res.xres = ps3fb_res[i].xres;
+                       res.yres = ps3fb_res[i].yres;
+                       res.xoff = ps3fb_res[i].xoff;
+                       res.yoff = ps3fb_res[i].yoff;
+                       res.num_frames = ps3fb.num_frames;
+                       if (!copy_to_user(argp, &res, sizeof(res)))
+                               retval = 0;
+                       break;
+               }
+
+       case PS3FB_IOCTL_ON:
+               DPRINTK("PS3FB_IOCTL_ON:\n");
+               atomic_inc(&ps3fb.ext_flip);
+               retval = 0;
+               break;
+
+       case PS3FB_IOCTL_OFF:
+               DPRINTK("PS3FB_IOCTL_OFF:\n");
+               if (atomic_read(&ps3fb.ext_flip) > 0)
+                       atomic_dec(&ps3fb.ext_flip);
+               retval = 0;
+               break;
+
+       case PS3FB_IOCTL_FSEL:
+               if (copy_from_user(&val, argp, sizeof(val)))
+                       break;
+
+               DPRINTK("PS3FB_IOCTL_FSEL:%d\n", val);
+               retval = ps3fb_sync(val);
+               break;
+
+       default:
+               retval = -ENOIOCTLCMD;
+               break;
+       }
+       return retval;
+}
+
+static int ps3fbd(void *arg)
+{
+       daemonize("ps3fbd");
+       for (;;) {
+               down(&ps3fb.sem);
+               if (atomic_read(&ps3fb.ext_flip) == 0)
+                       ps3fb_sync(0);  /* single buffer */
+       }
+       return 0;
+}
+
+static irqreturn_t ps3fb_vsync_interrupt(int irq, void *ptr)
+{
+       u64 v1;
+       int status;
+       struct display_head *head = &ps3fb.dinfo->display_head[1];
+
+       status = lv1_gpu_context_intr(ps3fb.context_handle, &v1);
+       if (status) {
+               printk(KERN_ERR "%s: lv1_gpu_context_intr failed: %d\n",
+                      __FUNCTION__, status);
+               return IRQ_NONE;
+       }
+
+       if (v1 & (1 << GPU_INTR_STATUS_VSYNC_1)) {
+               /* VSYNC */
+               ps3fb.vblank_count = head->vblank_count;
+               if (!ps3fb.is_blanked)
+                       up(&ps3fb.sem);
+               wake_up_interruptible(&ps3fb.wait_vsync);
+       }
+
+       return IRQ_HANDLED;
+}
+
+#ifndef MODULE
+static int __init ps3fb_setup(char *options)
+{
+       char *this_opt;
+       int mode = 0;
+
+       if (!options || !*options)
+               return 0;       /* no options */
+
+       while ((this_opt = strsep(&options, ",")) != NULL) {
+               if (!*this_opt)
+                       continue;
+               if (!strncmp(this_opt, "mode:", 5))
+                       mode = simple_strtoul(this_opt + 5, NULL, 0);
+               else
+                       mode_option = this_opt;
+       }
+       return mode;
+}
+#endif /* MODULE */
+
+    /*
+     *  Initialisation
+     */
+
+static void ps3fb_platform_release(struct device *device)
+{
+       /* This is called when the reference count goes to zero. */
+}
+
+static int ps3fb_vsync_settings(struct gpu_driver_info *dinfo, void *dev)
+{
+       int error;
+
+       DPRINTK("version_driver:%x\n", dinfo->version_driver);
+       DPRINTK("irq outlet:%x\n", dinfo->irq.irq_outlet);
+       DPRINTK("version_gpu:%x memory_size:%x ch:%x core_freq:%d mem_freq:%d\n",
+               dinfo->version_gpu, dinfo->memory_size, dinfo->hardware_channel,
+               dinfo->nvcore_frequency/1000000, dinfo->memory_frequency/1000000);
+
+       if (dinfo->version_driver != GPU_DRIVER_INFO_VERSION) {
+               printk(KERN_ERR "%s: version_driver err:%x\n", __FUNCTION__,
+                      dinfo->version_driver);
+               return -EINVAL;
+       }
+
+       ps3fb.dev = dev;
+       error = ps3_alloc_irq(PS3_BINDING_CPU_ANY, dinfo->irq.irq_outlet,
+                             &ps3fb.irq_no);
+       if (error) {
+               printk(KERN_ERR "%s: ps3_alloc_irq failed %d\n", __FUNCTION__,
+                      error);
+               return error;
+       }
+
+       error = request_irq(ps3fb.irq_no, ps3fb_vsync_interrupt, IRQF_DISABLED,
+                           "ps3fb vsync", ps3fb.dev);
+       if (error) {
+               printk(KERN_ERR "%s: request_irq failed %d\n", __FUNCTION__,
+                      error);
+               ps3_free_irq(ps3fb.irq_no);
+               return error;
+       }
+
+       dinfo->irq.mask = (1 << GPU_INTR_STATUS_VSYNC_1) |
+                         (1 << GPU_INTR_STATUS_FLIP_1);
+       return 0;
+}
+
+static int ps3fb_xdr_settings(u64 xdr_lpar)
+{
+       int status;
+
+       status = lv1_gpu_context_iomap(ps3fb.context_handle, GPU_IOIF,
+                                      xdr_lpar, ps3fb_videomemory.size, 0);
+       if (status) {
+               printk(KERN_ERR "%s: lv1_gpu_context_iomap failed: %d\n",
+                      __FUNCTION__, status);
+               return -ENXIO;
+       }
+       DPRINTK("video:%p xdr_ea:%p ioif:%lx lpar:%lx phys:%lx size:%lx\n",
+               ps3fb_videomemory.address, ps3fb.xdr_ea, GPU_IOIF, xdr_lpar,
+               virt_to_abs(ps3fb.xdr_ea), ps3fb_videomemory.size);
+
+       status = lv1_gpu_context_attribute(ps3fb.context_handle,
+                                          L1GPU_CONTEXT_ATTRIBUTE_FB_SETUP,
+                                          xdr_lpar, ps3fb_videomemory.size,
+                                          GPU_IOIF, 0);
+       if (status) {
+               printk(KERN_ERR "%s: lv1_gpu_context_attribute FB_SETUP failed: %d\n",
+                      __FUNCTION__, status);
+               return -ENXIO;
+       }
+       return 0;
+}
+
+static struct fb_ops ps3fb_ops = {
+       .fb_open        = ps3fb_open,
+       .fb_release     = ps3fb_release,
+       .fb_check_var   = ps3fb_check_var,
+       .fb_set_par     = ps3fb_set_par,
+       .fb_setcolreg   = ps3fb_setcolreg,
+       .fb_fillrect    = cfb_fillrect,
+       .fb_copyarea    = cfb_copyarea,
+       .fb_imageblit   = cfb_imageblit,
+       .fb_mmap        = ps3fb_mmap,
+       .fb_blank       = ps3fb_blank,
+       .fb_ioctl       = ps3fb_ioctl,
+       .fb_compat_ioctl = ps3fb_ioctl
+};
+
+static struct fb_fix_screeninfo ps3fb_fix __initdata = {
+       .id =           "PS3 FB",
+       .type =         FB_TYPE_PACKED_PIXELS,
+       .visual =       FB_VISUAL_TRUECOLOR,
+       .accel =        FB_ACCEL_NONE,
+};
+
+static int __init ps3fb_probe(struct platform_device *dev)
+{
+       struct fb_info *info;
+       int retval = -ENOMEM;
+       u64 ddr_lpar = 0;
+       u64 lpar_dma_control = 0;
+       u64 lpar_driver_info = 0;
+       u64 lpar_reports = 0;
+       u64 lpar_reports_size = 0;
+       u64 xdr_lpar;
+       int status;
+       unsigned long offset;
+
+       /* get gpu context handle */
+       status = lv1_gpu_memory_allocate(DDR_SIZE, 0, 0, 0, 0,
+                                        &ps3fb.memory_handle, &ddr_lpar);
+       if (status) {
+               printk(KERN_ERR "%s: lv1_gpu_memory_allocate failed: %d\n",
+                      __FUNCTION__, status);
+               goto err;
+       }
+       DPRINTK("ddr:lpar:0x%lx\n", ddr_lpar);
+
+       status = lv1_gpu_context_allocate(ps3fb.memory_handle, 0,
+                                         &ps3fb.context_handle,
+                                         &lpar_dma_control, &lpar_driver_info,
+                                         &lpar_reports, &lpar_reports_size);
+       if (status) {
+               printk(KERN_ERR "%s: lv1_gpu_context_attribute failed: %d\n",
+                      __FUNCTION__, status);
+               goto err_gpu_memory_free;
+       }
+
+       /* vsync interrupt */
+       ps3fb.dinfo = ioremap(lpar_driver_info, 128 * 1024);
+       if (!ps3fb.dinfo) {
+               printk(KERN_ERR "%s: ioremap failed\n", __FUNCTION__);
+               goto err_gpu_context_free;
+       }
+
+       retval = ps3fb_vsync_settings(ps3fb.dinfo, dev);
+       if (retval)
+               goto err_iounmap_dinfo;
+
+       /* xdr frame buffer */
+       ps3fb.xdr_ea = ps3fb_videomemory.address;
+       xdr_lpar = ps3_mm_phys_to_lpar(__pa(ps3fb.xdr_ea));
+       retval = ps3fb_xdr_settings(xdr_lpar);
+       if (retval)
+               goto err_free_irq;
+
+       /*
+        * ps3fb must clear memory to prevent kernel info
+        * leakage into userspace
+        */
+       memset(ps3fb.xdr_ea, 0, ps3fb_videomemory.size);
+       info = framebuffer_alloc(sizeof(u32) * 16, &dev->dev);
+       if (!info)
+               goto err_free_irq;
+
+       offset = FB_OFF(ps3fb.res_index) + VP_OFF(ps3fb.res_index);
+       info->screen_base = (char __iomem *)ps3fb.xdr_ea + offset;
+       info->fbops = &ps3fb_ops;
+
+       info->fix = ps3fb_fix;
+       info->fix.smem_start = virt_to_abs(ps3fb.xdr_ea);
+       info->fix.smem_len = ps3fb_videomemory.size - offset;
+       info->pseudo_palette = info->par;
+       info->par = NULL;
+       info->flags = FBINFO_FLAG_DEFAULT;
+
+       retval = fb_alloc_cmap(&info->cmap, 256, 0);
+       if (retval < 0)
+               goto err_framebuffer_release;
+
+       if (!fb_find_mode(&info->var, info, mode_option, ps3fb_modedb,
+                         ARRAY_SIZE(ps3fb_modedb), ps3fb_default_mode(), 32)) {
+               retval = -EINVAL;
+               goto err_fb_dealloc;
+       }
+
+       fb_videomode_to_modelist(ps3fb_modedb, ARRAY_SIZE(ps3fb_modedb),
+                                &info->modelist);
+
+       retval = register_framebuffer(info);
+       if (retval < 0)
+               goto err_fb_dealloc;
+
+       platform_set_drvdata(dev, info);
+
+       printk(KERN_INFO
+              "fb%d: PS3 frame buffer device, using %ld KiB of video memory\n",
+              info->node, ps3fb_videomemory.size >> 10);
+
+       kernel_thread(ps3fbd, info, CLONE_KERNEL);
+       return 0;
+
+err_fb_dealloc:
+       fb_dealloc_cmap(&info->cmap);
+err_framebuffer_release:
+       framebuffer_release(info);
+err_free_irq:
+       free_irq(ps3fb.irq_no, ps3fb.dev);
+       ps3_free_irq(ps3fb.irq_no);
+err_iounmap_dinfo:
+       iounmap((u8 __iomem *)ps3fb.dinfo);
+err_gpu_context_free:
+       lv1_gpu_context_free(ps3fb.context_handle);
+err_gpu_memory_free:
+       lv1_gpu_memory_free(ps3fb.memory_handle);
+err:
+       return retval;
+}
+
+static void ps3fb_shutdown(struct platform_device *dev)
+{
+       ps3fb_flip_ctl(0);      /* flip off */
+       ps3fb.dinfo->irq.mask = 0;
+       free_irq(ps3fb.irq_no, ps3fb.dev);
+       ps3_free_irq(ps3fb.irq_no);
+       iounmap((u8 __iomem *)ps3fb.dinfo);
+}
+
+void ps3fb_cleanup(void)
+{
+       int status;
+
+       if (ps3fb.irq_no) {
+               free_irq(ps3fb.irq_no, ps3fb.dev);
+               ps3_free_irq(ps3fb.irq_no);
+       }
+       iounmap((u8 __iomem *)ps3fb.dinfo);
+
+       status = lv1_gpu_context_free(ps3fb.context_handle);
+       if (status)
+               DPRINTK("lv1_gpu_context_free failed: %d\n", status);
+
+       status = lv1_gpu_memory_free(ps3fb.memory_handle);
+       if (status)
+               DPRINTK("lv1_gpu_memory_free failed: %d\n", status);
+
+       ps3av_dev_close();
+}
+
+EXPORT_SYMBOL_GPL(ps3fb_cleanup);
+
+static int ps3fb_remove(struct platform_device *dev)
+{
+       struct fb_info *info = platform_get_drvdata(dev);
+
+       if (info) {
+               unregister_framebuffer(info);
+               fb_dealloc_cmap(&info->cmap);
+               framebuffer_release(info);
+       }
+       ps3fb_cleanup();
+       return 0;
+}
+
+static struct platform_driver ps3fb_driver = {
+       .probe  = ps3fb_probe,
+       .remove = ps3fb_remove,
+       .shutdown = ps3fb_shutdown,
+       .driver = { .name = "ps3fb" }
+};
+
+static struct platform_device ps3fb_device = {
+       .name   = "ps3fb",
+       .id     = 0,
+       .dev    = { .release = ps3fb_platform_release }
+};
+
+int ps3fb_set_sync(void)
+{
+       int status;
+
+#ifdef HEAD_A
+       status = lv1_gpu_context_attribute(0x0,
+                                          L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC,
+                                          0, L1GPU_DISPLAY_SYNC_VSYNC, 0, 0);
+       if (status) {
+               printk(KERN_ERR "%s: lv1_gpu_context_attribute DISPLAY_SYNC failed: %d\n",
+                      __FUNCTION__, status);
+               return -1;
+       }
+#endif
+#ifdef HEAD_B
+       status = lv1_gpu_context_attribute(0x0,
+                                          L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC,
+                                          1, L1GPU_DISPLAY_SYNC_VSYNC, 0, 0);
+
+       if (status) {
+               printk(KERN_ERR "%s: lv1_gpu_context_attribute DISPLAY_MODE failed: %d\n",
+                      __FUNCTION__, status);
+               return -1;
+       }
+#endif
+       return 0;
+}
+
+EXPORT_SYMBOL_GPL(ps3fb_set_sync);
+
+static int __init ps3fb_init(void)
+{
+       int error;
+#ifndef MODULE
+       int mode;
+       char *option = NULL;
+
+       if (fb_get_options("ps3fb", &option))
+               goto err;
+#endif
+
+       if (!ps3fb_videomemory.address)
+               goto err;
+
+       error = ps3av_dev_open();
+       if (error) {
+               printk(KERN_ERR "%s: ps3av_dev_open failed\n", __FUNCTION__);
+               goto err;
+       }
+
+       ps3fb_mode = ps3av_get_mode();
+       DPRINTK("ps3av_mode:%d\n", ps3fb_mode);
+#ifndef MODULE
+       mode = ps3fb_setup(option);     /* check boot option */
+       if (mode)
+               ps3fb_mode = mode;
+#endif
+       if (ps3fb_mode > 0) {
+               u32 xres, yres;
+               ps3av_video_mode2res(ps3fb_mode, &xres, &yres);
+               ps3fb.res_index = ps3fb_get_res_table(xres, yres);
+               DPRINTK("res_index:%d\n", ps3fb.res_index);
+       } else
+               ps3fb.res_index = GPU_RES_INDEX;
+
+       atomic_set(&ps3fb.f_count, -1); /* fbcon opens ps3fb */
+       atomic_set(&ps3fb.ext_flip, 0); /* for flip with vsync */
+       init_MUTEX(&ps3fb.sem);
+       init_waitqueue_head(&ps3fb.wait_vsync);
+       ps3fb.num_frames = 1;
+
+       error = platform_driver_register(&ps3fb_driver);
+       if (!error) {
+               error = platform_device_register(&ps3fb_device);
+               if (error)
+                       platform_driver_unregister(&ps3fb_driver);
+       }
+
+       ps3fb_set_sync();
+
+       return error;
+
+err:
+       return -ENXIO;
+}
+
+module_init(ps3fb_init);
+
+#ifdef MODULE
+static void __exit ps3fb_exit(void)
+{
+       platform_device_unregister(&ps3fb_device);
+       platform_driver_unregister(&ps3fb_driver);
+}
+
+module_exit(ps3fb_exit);
+
+MODULE_LICENSE("GPL");
+#endif                         /* MODULE */
diff --git a/drivers/video/retz3fb.c b/drivers/video/retz3fb.c
deleted file mode 100644 (file)
index bc7ffc8..0000000
+++ /dev/null
@@ -1,1588 +0,0 @@
-/*
- * Linux/drivers/video/retz3fb.c -- RetinaZ3 frame buffer device
- *
- *    Copyright (C) 1997 Jes Sorensen
- *
- * This file is based on the CyberVision64 frame buffer device and
- * the generic Cirrus Logic driver.
- *
- * cyberfb.c: Copyright (C) 1996 Martin Apel,
- *                               Geert Uytterhoeven
- * clgen.c:   Copyright (C) 1996 Frank Neumann
- *
- * History:
- *   - 22 Jan 97: Initial work
- *   - 14 Feb 97: Screen initialization works somewhat, still only
- *                8-bit packed pixel is supported.
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file COPYING in the main directory of this archive
- * for more details.
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/slab.h>
-#include <linux/delay.h>
-#include <linux/fb.h>
-#include <linux/zorro.h>
-#include <linux/init.h>
-
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <asm/irq.h>
-#include <asm/pgtable.h>
-#include <asm/io.h>
-
-#include <video/fbcon.h>
-#include <video/fbcon-cfb8.h>
-#include <video/fbcon-cfb16.h>
-
-#include "retz3fb.h"
-
-/* #define DEBUG if(1) */
-#define DEBUG if(0)
-
-/*
- * Reserve space for one pattern line.
- *
- * For the time being we only support 4MB boards!
- */
-
-#define PAT_MEM_SIZE 16*3
-#define PAT_MEM_OFF  (4*1024*1024 - PAT_MEM_SIZE)
-
-struct retz3fb_par {
-       int xres;
-       int yres;
-       int xres_vir;
-       int yres_vir;
-       int xoffset;
-       int yoffset;
-       int bpp;
-
-       struct fb_bitfield red;
-       struct fb_bitfield green;
-       struct fb_bitfield blue;
-       struct fb_bitfield transp;
-
-       int pixclock;
-       int left_margin;        /* time from sync to picture    */
-       int right_margin;       /* time from picture to sync    */
-       int upper_margin;       /* time from sync to picture    */
-       int lower_margin;
-       int hsync_len;  /* length of horizontal sync    */
-       int vsync_len;  /* length of vertical sync      */
-       int vmode;
-
-       int accel;
-};
-
-struct display_data {
-       long h_total;           /* Horizontal Total */
-       long h_sstart;          /* Horizontal Sync Start */
-       long h_sstop;           /* Horizontal Sync Stop */
-       long h_bstart;          /* Horizontal Blank Start */
-       long h_bstop;           /* Horizontal Blank Stop */
-       long h_dispend;         /* Horizontal Display End */
-       long v_total;           /* Vertical Total */
-       long v_sstart;          /* Vertical Sync Start */
-       long v_sstop;           /* Vertical Sync Stop */
-       long v_bstart;          /* Vertical Blank Start */
-       long v_bstop;           /* Vertical Blank Stop */
-       long v_dispend;         /* Horizontal Display End */
-};
-
-struct retz3_fb_info {
-       struct fb_info info;
-       unsigned char *base;
-       unsigned char *fbmem;
-       unsigned long fbsize;
-       volatile unsigned char *regs;
-       unsigned long physfbmem;
-       unsigned long physregs;
-       int current_par_valid; /* set to 0 by memset */
-       int blitbusy;
-       struct display disp;
-       struct retz3fb_par current_par;
-       unsigned char color_table [256][3];
-};
-
-
-static char fontname[40] __initdata = { 0 };
-
-#define retz3info(info) ((struct retz3_fb_info *)(info))
-#define fbinfo(info) ((struct fb_info *)(info))
-
-
-/*
- *    Frame Buffer Name
- */
-
-static char retz3fb_name[16] = "RetinaZ3";
-
-
-/*
- * A small info on how to convert XFree86 timing values into fb
- * timings - by Frank Neumann:
- *
-An XFree86 mode line consists of the following fields:
- "800x600"     50      800  856  976 1040    600  637  643  666
- < name >     DCF       HR  SH1  SH2  HFL     VR  SV1  SV2  VFL
-
-The fields in the fb_var_screeninfo structure are:
-        unsigned long pixclock;         * pixel clock in ps (pico seconds) *
-        unsigned long left_margin;      * time from sync to picture    *
-        unsigned long right_margin;     * time from picture to sync    *
-        unsigned long upper_margin;     * time from sync to picture    *
-        unsigned long lower_margin;
-        unsigned long hsync_len;        * length of horizontal sync    *
-        unsigned long vsync_len;        * length of vertical sync      *
-
-1) Pixelclock:
-   xfree: in MHz
-   fb: In Picoseconds (ps)
-
-   pixclock = 1000000 / DCF
-
-2) horizontal timings:
-   left_margin = HFL - SH2
-   right_margin = SH1 - HR
-   hsync_len = SH2 - SH1
-
-3) vertical timings:
-   upper_margin = VFL - SV2
-   lower_margin = SV1 - VR
-   vsync_len = SV2 - SV1
-
-Good examples for VESA timings can be found in the XFree86 source tree,
-under "programs/Xserver/hw/xfree86/doc/modeDB.txt".
-*/
-
-/*
- *    Predefined Video Modes
- */
-
-static struct {
-    const char *name;
-    struct fb_var_screeninfo var;
-} retz3fb_predefined[] __initdata = {
-    /*
-     * NB: it is very important to adjust the pixel-clock to the color-depth.
-     */
-
-    {
-       "640x480", {            /* 640x480, 8 bpp */
-           640, 480, 640, 480, 0, 0, 8, 0,
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCEL_NONE, 39722, 48, 16, 33, 10, 96, 2,
-           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,FB_VMODE_NONINTERLACED
-       }
-    },
-    /*
-     ModeLine "800x600" 36 800 824 896 1024 600 601 603 625
-             < name > DCF HR  SH1 SH2  HFL VR  SV1 SV2 VFL
-     */
-    {
-       "800x600", {            /* 800x600, 8 bpp */
-           800, 600, 800, 600, 0, 0, 8, 0,
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 27778, 64, 24, 22, 1, 120, 2,
-           FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-       }
-    },
-    {
-       "800x600-60", {         /* 800x600, 8 bpp */
-           800, 600, 800, 600, 0, 0, 8, 0,
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 25000, 88, 40, 23, 1, 128, 4,
-           FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-       }
-    },
-    {
-       "800x600-70", {         /* 800x600, 8 bpp */
-           800, 600, 800, 600, 0, 0, 8, 0,
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 22272, 40, 24, 15, 9, 144, 12,
-           FB_SYNC_COMP_HIGH_ACT, FB_VMODE_NONINTERLACED
-       }
-    },
-    /*
-      ModeLine "1024x768i" 45 1024 1064 1224 1264 768 777 785 817 interlace
-              < name >   DCF HR  SH1  SH2  HFL  VR  SV1 SV2 VFL
-     */
-    {
-       "1024x768i", {          /* 1024x768, 8 bpp, interlaced */
-           1024, 768, 1024, 768, 0, 0, 8, 0,
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 22222, 40, 40, 32, 9, 160, 8,
-           FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_INTERLACED
-       }
-    },
-    {
-       "1024x768", {
-           1024, 768, 1024, 768, 0, 0, 8, 0, 
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0}, 
-           0, 0, -1, -1, FB_ACCEL_NONE, 12500, 92, 112, 31, 2, 204, 4,
-           FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-        }
-    },
-    {
-       "640x480-16", {         /* 640x480, 16 bpp */
-           640, 480, 640, 480, 0, 0, 16, 0,
-           {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-           0, 0, -1, -1, 0, 38461/2, 28, 32, 12, 10, 96, 2,
-           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,FB_VMODE_NONINTERLACED
-       }
-    },
-    {
-       "640x480-24", {         /* 640x480, 24 bpp */
-           640, 480, 640, 480, 0, 0, 24, 0,
-           {8, 8, 8}, {8, 8, 8}, {8, 8, 8}, {0, 0, 0},
-           0, 0, -1, -1, 0, 38461/3, 28, 32, 12, 10, 96, 2,
-           FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,FB_VMODE_NONINTERLACED
-       }
-    },
-};
-
-
-#define NUM_TOTAL_MODES    ARRAY_SIZE(retz3fb_predefined)
-
-static struct fb_var_screeninfo retz3fb_default;
-
-static int z3fb_inverse = 0;
-static int z3fb_mode __initdata = 0;
-
-
-/*
- *    Interface used by the world
- */
-
-int retz3fb_setup(char *options);
-
-static int retz3fb_get_fix(struct fb_fix_screeninfo *fix, int con,
-                          struct fb_info *info);
-static int retz3fb_get_var(struct fb_var_screeninfo *var, int con,
-                          struct fb_info *info);
-static int retz3fb_set_var(struct fb_var_screeninfo *var, int con,
-                          struct fb_info *info);
-static int retz3fb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
-                           struct fb_info *info);
-static int retz3fb_setcolreg(unsigned int regno, unsigned int red,
-                            unsigned int green, unsigned int blue,
-                            unsigned int transp, struct fb_info *info);
-static int retz3fb_blank(int blank, struct fb_info *info);
-
-
-/*
- *    Interface to the low level console driver
- */
-
-int retz3fb_init(void);
-static int z3fb_switch(int con, struct fb_info *info);
-static int z3fb_updatevar(int con, struct fb_info *info);
-
-
-/*
- *    Text console acceleration
- */
-
-#ifdef FBCON_HAS_CFB8
-static struct display_switch fbcon_retz3_8;
-#endif
-
-
-/*
- *    Accelerated Functions used by the low level console driver
- */
-
-static void retz3_bitblt(struct display *p,
-                        unsigned short curx, unsigned short cury, unsigned
-                        short destx, unsigned short desty, unsigned short
-                        width, unsigned short height, unsigned short cmd,
-                        unsigned short mask);
-
-/*
- *   Hardware Specific Routines
- */
-
-static int retz3_encode_fix(struct fb_info *info,
-                           struct fb_fix_screeninfo *fix,
-                           struct retz3fb_par *par);
-static int retz3_decode_var(struct fb_var_screeninfo *var,
-                           struct retz3fb_par *par);
-static int retz3_encode_var(struct fb_var_screeninfo *var,
-                           struct retz3fb_par *par);
-static int retz3_getcolreg(unsigned int regno, unsigned int *red,
-                          unsigned int *green, unsigned int *blue,
-                          unsigned int *transp, struct fb_info *info);
-
-/*
- *    Internal routines
- */
-
-static void retz3fb_get_par(struct fb_info *info, struct retz3fb_par *par);
-static void retz3fb_set_par(struct fb_info *info, struct retz3fb_par *par);
-static int do_fb_set_var(struct fb_info *info,
-                        struct fb_var_screeninfo *var, int isactive);
-static void retz3fb_set_disp(int con, struct fb_info *info);
-static int get_video_mode(const char *name);
-
-
-/* -------------------- Hardware specific routines ------------------------- */
-
-static unsigned short find_fq(unsigned int freq)
-{
-       unsigned long f;
-       long tmp;
-       long prev = 0x7fffffff;
-       long n2, n1 = 3;
-       unsigned long m;
-       unsigned short res = 0;
-
-       if (freq <= 31250000)
-               n2 = 3;
-       else if (freq <= 62500000)
-               n2 = 2;
-       else if (freq <= 125000000)
-               n2 = 1;
-       else if (freq <= 250000000)
-               n2 = 0;
-       else
-               return 0;
-
-
-       do {
-               f = freq >> (10 - n2);
-
-               m = (f * n1) / (14318180/1024);
-
-               if (m > 129)
-                       break;
-
-               tmp =  (((m * 14318180) >> n2) / n1) - freq;
-               if (tmp < 0)
-                       tmp = -tmp;
-
-               if (tmp < prev) {
-                       prev = tmp;
-                       res = (((n2 << 5) | (n1-2)) << 8) | (m-2);
-               }
-
-       } while ( (++n1) <= 21);
-
-       return res;
-}
-
-
-static int retz3_set_video(struct fb_info *info,
-                          struct fb_var_screeninfo *var,
-                          struct retz3fb_par *par)
-{
-       volatile unsigned char *regs = retz3info(info)->regs;
-       unsigned int freq;
-
-       int xres, hfront, hsync, hback;
-       int yres, vfront, vsync, vback;
-       unsigned char tmp;
-       unsigned short best_freq;
-       struct display_data data;
-
-       short clocksel = 0; /* Apparantly this is always zero */
-
-       int bpp = var->bits_per_pixel;
-
-       /*
-        * XXX
-        */
-       if (bpp == 24)
-               return 0;
-
-       if ((bpp != 8) && (bpp != 16) && (bpp != 24))
-               return -EFAULT;
-
-       par->xoffset = 0;
-       par->yoffset = 0;
-
-       xres   = var->xres * bpp / 4;
-       hfront = var->right_margin * bpp / 4;
-       hsync  = var->hsync_len * bpp / 4;
-       hback  = var->left_margin * bpp / 4;
-
-       if (var->vmode & FB_VMODE_DOUBLE)
-       {
-               yres = var->yres * 2;
-               vfront = var->lower_margin * 2;
-               vsync  = var->vsync_len * 2;
-               vback  = var->upper_margin * 2;
-       }
-       else if (var->vmode & FB_VMODE_INTERLACED)
-       {
-               yres   = (var->yres + 1) / 2;
-               vfront = (var->lower_margin + 1) / 2;
-               vsync  = (var->vsync_len + 1) / 2;
-               vback  = (var->upper_margin + 1) / 2;
-       }
-       else
-       {
-               yres   = var->yres; /* -1 ? */
-               vfront = var->lower_margin;
-               vsync  = var->vsync_len;
-               vback  = var->upper_margin;
-       }
-
-       data.h_total    = (hback / 8) + (xres / 8)
-                       + (hfront / 8) + (hsync / 8) - 1 /* + 1 */;
-       data.h_dispend  = ((xres + bpp - 1)/ 8) - 1;
-       data.h_bstart   = xres / 8 - 1 /* + 1 */;
-
-       data.h_bstop    = data.h_total+1 + 2 + 1;
-       data.h_sstart   = (xres / 8) + (hfront / 8) + 1;
-       data.h_sstop    = (xres / 8) + (hfront / 8) + (hsync / 8) + 1;
-
-       data.v_total    = yres + vfront + vsync + vback - 1;
-
-       data.v_dispend  = yres - 1;
-       data.v_bstart   = yres - 1;
-
-       data.v_bstop    = data.v_total;
-       data.v_sstart   = yres + vfront - 1 - 2;
-       data.v_sstop    = yres + vfront + vsync - 1;
-
-#if 0 /* testing */
-
-       printk("HBS: %i\n", data.h_bstart);
-       printk("HSS: %i\n", data.h_sstart);
-       printk("HSE: %i\n", data.h_sstop);
-       printk("HBE: %i\n", data.h_bstop);
-       printk("HT: %i\n", data.h_total);
-
-       printk("hsync: %i\n", hsync);
-       printk("hfront: %i\n", hfront);
-       printk("hback: %i\n", hback);
-
-       printk("VBS: %i\n", data.v_bstart);
-       printk("VSS: %i\n", data.v_sstart);
-       printk("VSE: %i\n", data.v_sstop);
-       printk("VBE: %i\n", data.v_bstop);
-       printk("VT: %i\n", data.v_total);
-
-       printk("vsync: %i\n", vsync);
-       printk("vfront: %i\n", vfront);
-       printk("vback: %i\n", vback);
-#endif
-
-       if (data.v_total >= 1024)
-               printk(KERN_ERR "MAYDAY: v_total >= 1024; bailing out!\n");
-
-       reg_w(regs, GREG_MISC_OUTPUT_W, 0xe3 | ((clocksel & 3) * 0x04));
-       reg_w(regs, GREG_FEATURE_CONTROL_W, 0x00);
-
-       seq_w(regs, SEQ_RESET, 0x00);
-       seq_w(regs, SEQ_RESET, 0x03);   /* reset sequencer logic */
-
-       /*
-        * CLOCKING_MODE bits:
-        * 2: This one is only set for certain text-modes, wonder if
-        *    it may be for EGA-lines? (it was referred to as CLKDIV2)
-        * (The CL drivers sets it to 0x21 with the comment:
-        *  FullBandwidth (video off) and 8/9 dot clock)
-        */
-       seq_w(regs, SEQ_CLOCKING_MODE, 0x01 | 0x00 /* 0x08 */);
-
-       seq_w(regs, SEQ_MAP_MASK, 0x0f);        /* enable writing to plane 0-3 */
-       seq_w(regs, SEQ_CHAR_MAP_SELECT, 0x00); /* doesn't matter in gfx-mode */
-       seq_w(regs, SEQ_MEMORY_MODE, 0x06); /* CL driver says 0x0e for 256 col mode*/
-       seq_w(regs, SEQ_RESET, 0x01);
-       seq_w(regs, SEQ_RESET, 0x03);
-
-       seq_w(regs, SEQ_EXTENDED_ENABLE, 0x05);
-
-       seq_w(regs, SEQ_CURSOR_CONTROL, 0x00);  /* disable cursor */
-       seq_w(regs, SEQ_PRIM_HOST_OFF_HI, 0x00);
-       seq_w(regs, SEQ_PRIM_HOST_OFF_HI, 0x00);
-       seq_w(regs, SEQ_LINEAR_0, 0x4a);
-       seq_w(regs, SEQ_LINEAR_1, 0x00);
-
-       seq_w(regs, SEQ_SEC_HOST_OFF_HI, 0x00);
-       seq_w(regs, SEQ_SEC_HOST_OFF_LO, 0x00);
-       seq_w(regs, SEQ_EXTENDED_MEM_ENA, 0x3 | 0x4 | 0x10 | 0x40);
-
-       /*
-        * The lower 4 bits (0-3) are used to set the font-width for
-        * text-mode - DON'T try to set this for gfx-mode.
-        */
-       seq_w(regs, SEQ_EXT_CLOCK_MODE, 0x10);
-       seq_w(regs, SEQ_EXT_VIDEO_ADDR, 0x03);
-
-       /*
-        * Extended Pixel Control:
-        * bit 0:   text-mode=0, gfx-mode=1 (Graphics Byte ?)
-        * bit 1: (Packed/Nibble Pixel Format ?)
-        * bit 4-5: depth, 0=1-8bpp, 1=9-16bpp, 2=17-24bpp
-        */
-       seq_w(regs, SEQ_EXT_PIXEL_CNTL, 0x01 | (((bpp / 8) - 1) << 4));
-
-       seq_w(regs, SEQ_BUS_WIDTH_FEEDB, 0x04);
-       seq_w(regs, SEQ_COLOR_EXP_WFG, 0x01);
-       seq_w(regs, SEQ_COLOR_EXP_WBG, 0x00);
-       seq_w(regs, SEQ_EXT_RW_CONTROL, 0x00);
-       seq_w(regs, SEQ_MISC_FEATURE_SEL, (0x51 | (clocksel & 8)));
-       seq_w(regs, SEQ_COLOR_KEY_CNTL, 0x40);
-       seq_w(regs, SEQ_COLOR_KEY_MATCH0, 0x00);
-       seq_w(regs, SEQ_COLOR_KEY_MATCH1, 0x00);
-       seq_w(regs, SEQ_COLOR_KEY_MATCH2, 0x00);
-       seq_w(regs, SEQ_CRC_CONTROL, 0x00);
-       seq_w(regs, SEQ_PERF_SELECT, 0x10);
-       seq_w(regs, SEQ_ACM_APERTURE_1, 0x00);
-       seq_w(regs, SEQ_ACM_APERTURE_2, 0x30);
-       seq_w(regs, SEQ_ACM_APERTURE_3, 0x00);
-       seq_w(regs, SEQ_MEMORY_MAP_CNTL, 0x03);
-
-
-       /* unlock register CRT0..CRT7 */
-       crt_w(regs, CRT_END_VER_RETR, (data.v_sstop & 0x0f) | 0x20);
-
-       /* Zuerst zu schreibende Werte nur per printk ausgeben */
-       DEBUG printk("CRT_HOR_TOTAL: %ld\n", data.h_total);
-       crt_w(regs, CRT_HOR_TOTAL, data.h_total & 0xff);
-
-       DEBUG printk("CRT_HOR_DISP_ENA_END: %ld\n", data.h_dispend);
-       crt_w(regs, CRT_HOR_DISP_ENA_END, (data.h_dispend) & 0xff);
-
-       DEBUG printk("CRT_START_HOR_BLANK: %ld\n", data.h_bstart);
-       crt_w(regs, CRT_START_HOR_BLANK, data.h_bstart & 0xff);
-
-       DEBUG printk("CRT_END_HOR_BLANK: 128+%ld\n", data.h_bstop % 32);
-       crt_w(regs, CRT_END_HOR_BLANK,  0x80 | (data.h_bstop & 0x1f));
-
-       DEBUG printk("CRT_START_HOR_RETR: %ld\n", data.h_sstart);
-       crt_w(regs, CRT_START_HOR_RETR, data.h_sstart & 0xff);
-
-       tmp = (data.h_sstop & 0x1f);
-       if (data.h_bstop & 0x20)
-               tmp |= 0x80;
-       DEBUG printk("CRT_END_HOR_RETR: %d\n", tmp);
-       crt_w(regs, CRT_END_HOR_RETR, tmp);
-
-       DEBUG printk("CRT_VER_TOTAL: %ld\n", data.v_total & 0xff);
-       crt_w(regs, CRT_VER_TOTAL, (data.v_total & 0xff));
-
-       tmp = 0x10;  /* LineCompare bit #9 */
-       if (data.v_total & 256)
-               tmp |= 0x01;
-       if (data.v_dispend & 256)
-               tmp |= 0x02;
-       if (data.v_sstart & 256)
-               tmp |= 0x04;
-       if (data.v_bstart & 256)
-               tmp |= 0x08;
-       if (data.v_total & 512)
-               tmp |= 0x20;
-       if (data.v_dispend & 512)
-               tmp |= 0x40;
-       if (data.v_sstart & 512)
-               tmp |= 0x80;
-       DEBUG printk("CRT_OVERFLOW: %d\n", tmp);
-       crt_w(regs, CRT_OVERFLOW, tmp);
-
-       crt_w(regs, CRT_PRESET_ROW_SCAN, 0x00); /* not CL !!! */
-
-       tmp = 0x40; /* LineCompare bit #8 */
-       if (data.v_bstart & 512)
-               tmp |= 0x20;
-       if (var->vmode & FB_VMODE_DOUBLE)
-               tmp |= 0x80;
-       DEBUG printk("CRT_MAX_SCAN_LINE: %d\n", tmp);
-       crt_w(regs, CRT_MAX_SCAN_LINE, tmp);
-
-       crt_w(regs, CRT_CURSOR_START, 0x00);
-       crt_w(regs, CRT_CURSOR_END, 8 & 0x1f); /* font height */
-
-       crt_w(regs, CRT_START_ADDR_HIGH, 0x00);
-       crt_w(regs, CRT_START_ADDR_LOW, 0x00);
-
-       crt_w(regs, CRT_CURSOR_LOC_HIGH, 0x00);
-       crt_w(regs, CRT_CURSOR_LOC_LOW, 0x00);
-
-       DEBUG printk("CRT_START_VER_RETR: %ld\n", data.v_sstart & 0xff);
-       crt_w(regs, CRT_START_VER_RETR, (data.v_sstart & 0xff));
-
-#if 1
-       /* 5 refresh cycles per scanline */
-       DEBUG printk("CRT_END_VER_RETR: 64+32+%ld\n", data.v_sstop % 16);
-       crt_w(regs, CRT_END_VER_RETR, ((data.v_sstop & 0x0f) | 0x40 | 0x20));
-#else
-       DEBUG printk("CRT_END_VER_RETR: 128+32+%ld\n", data.v_sstop % 16);
-       crt_w(regs, CRT_END_VER_RETR, ((data.v_sstop & 0x0f) | 128 | 32));
-#endif
-       DEBUG printk("CRT_VER_DISP_ENA_END: %ld\n", data.v_dispend & 0xff);
-       crt_w(regs, CRT_VER_DISP_ENA_END, (data.v_dispend & 0xff));
-
-       DEBUG printk("CRT_START_VER_BLANK: %ld\n", data.v_bstart & 0xff);
-       crt_w(regs, CRT_START_VER_BLANK, (data.v_bstart & 0xff));
-
-       DEBUG printk("CRT_END_VER_BLANK: %ld\n", data.v_bstop & 0xff);
-       crt_w(regs, CRT_END_VER_BLANK, (data.v_bstop & 0xff));
-
-       DEBUG printk("CRT_MODE_CONTROL: 0xe3\n");
-       crt_w(regs, CRT_MODE_CONTROL, 0xe3);
-
-       DEBUG printk("CRT_LINE_COMPARE: 0xff\n");
-       crt_w(regs, CRT_LINE_COMPARE, 0xff);
-
-       tmp = (var->xres_virtual / 8) * (bpp / 8);
-       crt_w(regs, CRT_OFFSET, tmp);
-
-       crt_w(regs, CRT_UNDERLINE_LOC, 0x07); /* probably font-height - 1 */
-
-       tmp = 0x20;                     /* Enable extended end bits */
-       if (data.h_total & 0x100)
-               tmp |= 0x01;
-       if ((data.h_dispend) & 0x100)
-               tmp |= 0x02;
-       if (data.h_bstart & 0x100)
-               tmp |= 0x04;
-       if (data.h_sstart & 0x100)
-               tmp |= 0x08;
-       if (var->vmode & FB_VMODE_INTERLACED)
-               tmp |= 0x10;
-       DEBUG printk("CRT_EXT_HOR_TIMING1: %d\n", tmp);
-       crt_w(regs, CRT_EXT_HOR_TIMING1, tmp);
-
-       tmp = 0x00;
-       if (((var->xres_virtual / 8) * (bpp / 8)) & 0x100)
-               tmp |= 0x10;
-       crt_w(regs, CRT_EXT_START_ADDR, tmp);
-
-       tmp = 0x00;
-       if (data.h_total & 0x200)
-               tmp |= 0x01;
-       if ((data.h_dispend) & 0x200)
-               tmp |= 0x02;
-       if (data.h_bstart & 0x200)
-               tmp |= 0x04;
-       if (data.h_sstart & 0x200)
-               tmp |= 0x08;
-       tmp |= ((data.h_bstop & 0xc0) >> 2);
-       tmp |= ((data.h_sstop & 0x60) << 1);
-       crt_w(regs, CRT_EXT_HOR_TIMING2, tmp);
-       DEBUG printk("CRT_EXT_HOR_TIMING2: %d\n", tmp);
-
-       tmp = 0x10;                     /* Line compare bit 10 */
-       if (data.v_total & 0x400)
-               tmp |= 0x01;
-       if ((data.v_dispend) & 0x400)
-               tmp |= 0x02;
-       if (data.v_bstart & 0x400)
-               tmp |= 0x04;
-       if (data.v_sstart & 0x400)
-               tmp |= 0x08;
-       tmp |= ((data.v_bstop & 0x300) >> 3);
-       if (data.v_sstop & 0x10)
-               tmp |= 0x80;
-       crt_w(regs, CRT_EXT_VER_TIMING, tmp);
-       DEBUG printk("CRT_EXT_VER_TIMING: %d\n", tmp);
-
-       crt_w(regs, CRT_MONITOR_POWER, 0x00);
-
-       /*
-        * Convert from ps to Hz.
-        */
-       freq = 2000000000 / var->pixclock;
-       freq = freq * 500;
-
-       best_freq = find_fq(freq);
-       pll_w(regs, 0x02, best_freq);
-       best_freq = find_fq(61000000);
-       pll_w(regs, 0x0a, best_freq);
-       pll_w(regs, 0x0e, 0x22);
-
-       gfx_w(regs, GFX_SET_RESET, 0x00);
-       gfx_w(regs, GFX_ENABLE_SET_RESET, 0x00);
-       gfx_w(regs, GFX_COLOR_COMPARE, 0x00);
-       gfx_w(regs, GFX_DATA_ROTATE, 0x00);
-       gfx_w(regs, GFX_READ_MAP_SELECT, 0x00);
-       gfx_w(regs, GFX_GRAPHICS_MODE, 0x00);
-       gfx_w(regs, GFX_MISC, 0x05);
-       gfx_w(regs, GFX_COLOR_XCARE, 0x0f);
-       gfx_w(regs, GFX_BITMASK, 0xff);
-
-       reg_r(regs, ACT_ADDRESS_RESET);
-       attr_w(regs, ACT_PALETTE0 , 0x00);
-       attr_w(regs, ACT_PALETTE1 , 0x01);
-       attr_w(regs, ACT_PALETTE2 , 0x02);
-       attr_w(regs, ACT_PALETTE3 , 0x03);
-       attr_w(regs, ACT_PALETTE4 , 0x04);
-       attr_w(regs, ACT_PALETTE5 , 0x05);
-       attr_w(regs, ACT_PALETTE6 , 0x06);
-       attr_w(regs, ACT_PALETTE7 , 0x07);
-       attr_w(regs, ACT_PALETTE8 , 0x08);
-       attr_w(regs, ACT_PALETTE9 , 0x09);
-       attr_w(regs, ACT_PALETTE10, 0x0a);
-       attr_w(regs, ACT_PALETTE11, 0x0b);
-       attr_w(regs, ACT_PALETTE12, 0x0c);
-       attr_w(regs, ACT_PALETTE13, 0x0d);
-       attr_w(regs, ACT_PALETTE14, 0x0e);
-       attr_w(regs, ACT_PALETTE15, 0x0f);
-       reg_r(regs, ACT_ADDRESS_RESET);
-
-       attr_w(regs, ACT_ATTR_MODE_CNTL, 0x09); /* 0x01 for CL */
-
-       attr_w(regs, ACT_OVERSCAN_COLOR, 0x00);
-       attr_w(regs, ACT_COLOR_PLANE_ENA, 0x0f);
-       attr_w(regs, ACT_HOR_PEL_PANNING, 0x00);
-       attr_w(regs, ACT_COLOR_SELECT, 0x00);
-
-       reg_r(regs, ACT_ADDRESS_RESET);
-       reg_w(regs, ACT_DATA, 0x20);
-
-       reg_w(regs, VDAC_MASK, 0xff);
-
-       /*
-        * Extended palette addressing ???
-        */
-       switch (bpp){
-       case 8:
-               reg_w(regs, 0x83c6, 0x00);
-               break;
-       case 16:
-               reg_w(regs, 0x83c6, 0x60);
-               break;
-       case 24:
-               reg_w(regs, 0x83c6, 0xe0);
-               break;
-       default:
-               printk(KERN_INFO "Illegal color-depth: %i\n", bpp);
-       }
-
-       reg_w(regs, VDAC_ADDRESS, 0x00);
-
-       seq_w(regs, SEQ_MAP_MASK, 0x0f );
-
-       return 0;
-}
-
-
-/*
- *    This function should fill in the `fix' structure based on the
- *    values in the `par' structure.
- */
-
-static int retz3_encode_fix(struct fb_info *info,
-                           struct fb_fix_screeninfo *fix,
-                           struct retz3fb_par *par)
-{
-       struct retz3_fb_info *zinfo = retz3info(info);
-
-       memset(fix, 0, sizeof(struct fb_fix_screeninfo));
-       strcpy(fix->id, retz3fb_name);
-       fix->smem_start = zinfo->physfbmem;
-       fix->smem_len = zinfo->fbsize;
-       fix->mmio_start = zinfo->physregs;
-       fix->mmio_len = 0x00c00000;
-
-       fix->type = FB_TYPE_PACKED_PIXELS;
-       fix->type_aux = 0;
-       if (par->bpp == 8)
-               fix->visual = FB_VISUAL_PSEUDOCOLOR;
-       else
-               fix->visual = FB_VISUAL_TRUECOLOR;
-
-       fix->xpanstep = 0;
-       fix->ypanstep = 0;
-       fix->ywrapstep = 0;
-       fix->line_length = 0;
-
-       fix->accel = FB_ACCEL_NCR_77C32BLT;
-
-       return 0;
-}
-
-
-/*
- *    Get the video params out of `var'. If a value doesn't fit, round
- *    it up, if it's too big, return -EINVAL.
- */
-
-static int retz3_decode_var(struct fb_var_screeninfo *var,
-                           struct retz3fb_par *par)
-{
-       par->xres = var->xres;
-       par->yres = var->yres;
-       par->xres_vir = var->xres_virtual;
-       par->yres_vir = var->yres_virtual;
-       par->bpp = var->bits_per_pixel;
-       par->pixclock = var->pixclock;
-       par->vmode = var->vmode;
-
-       par->red = var->red;
-       par->green = var->green;
-       par->blue = var->blue;
-       par->transp = var->transp;
-
-       par->left_margin = var->left_margin;
-       par->right_margin = var->right_margin;
-       par->upper_margin = var->upper_margin;
-       par->lower_margin = var->lower_margin;
-       par->hsync_len = var->hsync_len;
-       par->vsync_len = var->vsync_len;
-
-       if (var->accel_flags & FB_ACCELF_TEXT)
-           par->accel = FB_ACCELF_TEXT;
-       else
-           par->accel = 0;
-
-       return 0;
-}
-
-
-/*
- *    Fill the `var' structure based on the values in `par' and maybe
- *    other values read out of the hardware.
- */
-
-static int retz3_encode_var(struct fb_var_screeninfo *var,
-                           struct retz3fb_par *par)
-{
-       memset(var, 0, sizeof(struct fb_var_screeninfo));
-       var->xres = par->xres;
-       var->yres = par->yres;
-       var->xres_virtual = par->xres_vir;
-       var->yres_virtual = par->yres_vir;
-       var->xoffset = 0;
-       var->yoffset = 0;
-
-       var->bits_per_pixel = par->bpp;
-       var->grayscale = 0;
-
-       var->red = par->red;
-       var->green = par->green;
-       var->blue = par->blue;
-       var->transp = par->transp;
-
-       var->nonstd = 0;
-       var->activate = 0;
-
-       var->height = -1;
-       var->width = -1;
-
-       var->accel_flags = (par->accel && par->bpp == 8) ? FB_ACCELF_TEXT : 0;
-
-       var->pixclock = par->pixclock;
-
-       var->sync = 0;                          /* ??? */
-       var->left_margin = par->left_margin;
-       var->right_margin = par->right_margin;
-       var->upper_margin = par->upper_margin;
-       var->lower_margin = par->lower_margin;
-       var->hsync_len = par->hsync_len;
-       var->vsync_len = par->vsync_len;
-
-       var->vmode = par->vmode;
-       return 0;
-}
-
-
-/*
- *    Set a single color register. Return != 0 for invalid regno.
- */
-
-static int retz3fb_setcolreg(unsigned int regno, unsigned int red,
-                            unsigned int green, unsigned int blue,
-                            unsigned int transp, struct fb_info *info)
-{
-       struct retz3_fb_info *zinfo = retz3info(info);
-       volatile unsigned char *regs = zinfo->regs;
-
-       /* We'll get to this */
-
-       if (regno > 255)
-               return 1;
-
-       red >>= 10;
-       green >>= 10;
-       blue >>= 10;
-
-       zinfo->color_table[regno][0] = red;
-       zinfo->color_table[regno][1] = green;
-       zinfo->color_table[regno][2] = blue;
-
-       reg_w(regs, VDAC_ADDRESS_W, regno);
-       reg_w(regs, VDAC_DATA, red);
-       reg_w(regs, VDAC_DATA, green);
-       reg_w(regs, VDAC_DATA, blue);
-
-       return 0;
-}
-
-
-/*
- *    Read a single color register and split it into
- *    colors/transparent. Return != 0 for invalid regno.
- */
-
-static int retz3_getcolreg(unsigned int regno, unsigned int *red,
-                          unsigned int *green, unsigned int *blue,
-                          unsigned int *transp, struct fb_info *info)
-{
-       struct retz3_fb_info *zinfo = retz3info(info);
-       int t;
-
-       if (regno > 255)
-               return 1;
-       t       = zinfo->color_table[regno][0];
-       *red    = (t<<10) | (t<<4) | (t>>2);
-       t       = zinfo->color_table[regno][1];
-       *green  = (t<<10) | (t<<4) | (t>>2);
-       t       = zinfo->color_table[regno][2];
-       *blue   = (t<<10) | (t<<4) | (t>>2);
-       *transp = 0;
-       return 0;
-}
-
-
-static inline void retz3_busy(struct display *p)
-{
-       struct retz3_fb_info *zinfo = retz3info(p->fb_info);
-       volatile unsigned char *acm = zinfo->base + ACM_OFFSET;
-       unsigned char blt_status;
-
-       if (zinfo->blitbusy) {
-               do{
-                       blt_status = *((acm) + (ACM_START_STATUS + 2));
-               }while ((blt_status & 1) == 0);
-               zinfo->blitbusy = 0;
-       }
-}
-
-
-static void retz3_bitblt (struct display *p,
-                         unsigned short srcx, unsigned short srcy,
-                         unsigned short destx, unsigned short desty,
-                         unsigned short width, unsigned short height,
-                         unsigned short cmd, unsigned short mask)
-{
-       struct fb_var_screeninfo *var = &p->var;
-       struct retz3_fb_info *zinfo = retz3info(p->fb_info);
-       volatile unsigned long *acm = (unsigned long *)(zinfo->base + ACM_OFFSET);
-       unsigned long *pattern = (unsigned long *)(zinfo->fbmem + PAT_MEM_OFF);
-
-       unsigned short mod;
-       unsigned long tmp;
-       unsigned long pat, src, dst;
-
-       int i, xres_virtual = var->xres_virtual;
-       short bpp = (var->bits_per_pixel & 0xff);
-
-       if (bpp < 8)
-               bpp = 8;
-
-       tmp = mask | (mask << 16);
-
-       retz3_busy(p);
-
-       i = 0;
-       do{
-               *pattern++ = tmp;
-       }while(i++ < bpp/4);
-
-       tmp = cmd << 8;
-       *(acm + ACM_RASTEROP_ROTATION/4) = tmp;
-
-       mod = 0xc0c2;
-
-       pat = 8 * PAT_MEM_OFF;
-       dst = bpp * (destx + desty * xres_virtual);
-
-       /*
-        * Source is not set for clear.
-        */
-       if ((cmd != Z3BLTclear) && (cmd != Z3BLTset)) {
-               src = bpp * (srcx + srcy * xres_virtual);
-
-               if (destx > srcx) {
-                       mod &= ~0x8000;
-                       src += bpp * (width - 1);
-                       dst += bpp * (width - 1);
-                       pat += bpp * 2;
-               }
-               if (desty > srcy) {
-                       mod &= ~0x4000;
-                       src += bpp * (height - 1) * xres_virtual;
-                       dst += bpp * (height - 1) * xres_virtual;
-                       pat += bpp * 4;
-               }
-
-               *(acm + ACM_SOURCE/4) = cpu_to_le32(src);
-       }
-
-       *(acm + ACM_PATTERN/4) = cpu_to_le32(pat);
-
-       *(acm + ACM_DESTINATION/4) = cpu_to_le32(dst);
-
-       tmp = mod << 16;
-       *(acm + ACM_CONTROL/4) = tmp;
-
-       tmp  = width | (height << 16);
-
-       *(acm + ACM_BITMAP_DIMENSION/4) = cpu_to_le32(tmp);
-
-       *(((volatile unsigned char *)acm) + ACM_START_STATUS) = 0x00;
-       *(((volatile unsigned char *)acm) + ACM_START_STATUS) = 0x01;
-       zinfo->blitbusy = 1;
-}
-
-#if 0
-/*
- * Move cursor to x, y
- */
-static void retz3_MoveCursor (unsigned short x, unsigned short y)
-{
-       /* Guess we gotta deal with the cursor at some point */
-}
-#endif
-
-
-/*
- *    Fill the hardware's `par' structure.
- */
-
-static void retz3fb_get_par(struct fb_info *info, struct retz3fb_par *par)
-{
-       struct retz3_fb_info *zinfo = retz3info(info);
-
-       if (zinfo->current_par_valid)
-               *par = zinfo->current_par;
-       else
-               retz3_decode_var(&retz3fb_default, par);
-}
-
-
-static void retz3fb_set_par(struct fb_info *info, struct retz3fb_par *par)
-{
-       struct retz3_fb_info *zinfo = retz3info(info);
-
-       zinfo->current_par = *par;
-       zinfo->current_par_valid = 1;
-}
-
-
-static int do_fb_set_var(struct fb_info *info,
-                        struct fb_var_screeninfo *var, int isactive)
-{
-       int err, activate;
-       struct retz3fb_par par;
-       struct retz3_fb_info *zinfo = retz3info(info);
-
-       if ((err = retz3_decode_var(var, &par)))
-               return err;
-       activate = var->activate;
-
-       /* XXX ... what to do about isactive ? */
-
-       if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW && isactive)
-               retz3fb_set_par(info, &par);
-       retz3_encode_var(var, &par);
-       var->activate = activate;
-
-       retz3_set_video(info, var, &zinfo->current_par);
-
-       return 0;
-}
-
-/*
- *    Get the Fixed Part of the Display
- */
-
-static int retz3fb_get_fix(struct fb_fix_screeninfo *fix, int con,
-                          struct fb_info *info)
-{
-       struct retz3fb_par par;
-       int error = 0;
-
-       if (con == -1)
-               retz3fb_get_par(info, &par);
-       else
-               error = retz3_decode_var(&fb_display[con].var, &par);
-       return(error ? error : retz3_encode_fix(info, fix, &par));
-}
-
-
-/*
- *    Get the User Defined Part of the Display
- */
-
-static int retz3fb_get_var(struct fb_var_screeninfo *var, int con,
-                          struct fb_info *info)
-{
-       struct retz3fb_par par;
-       int error = 0;
-
-       if (con == -1) {
-               retz3fb_get_par(info, &par);
-               error = retz3_encode_var(var, &par);
-       } else
-               *var = fb_display[con].var;
-       return error;
-}
-
-
-static void retz3fb_set_disp(int con, struct fb_info *info)
-{
-       struct fb_fix_screeninfo fix;
-       struct display *display;
-       struct retz3_fb_info *zinfo = retz3info(info);
-
-       if (con >= 0)
-               display = &fb_display[con];
-       else
-               display = &zinfo->disp; /* used during initialization */
-
-       retz3fb_get_fix(&fix, con, info);
-
-       if (con == -1)
-               con = 0;
-
-       display->visual = fix.visual;
-       display->type = fix.type;
-       display->type_aux = fix.type_aux;
-       display->ypanstep = fix.ypanstep;
-       display->ywrapstep = fix.ywrapstep;
-       display->can_soft_blank = 1;
-       display->inverse = z3fb_inverse;
-
-       /*
-        * This seems to be about 20% faster.
-        */
-       display->scrollmode = SCROLL_YREDRAW;
-
-       switch (display->var.bits_per_pixel) {
-#ifdef FBCON_HAS_CFB8
-       case 8:
-               if (display->var.accel_flags & FB_ACCELF_TEXT) {
-                   display->dispsw = &fbcon_retz3_8;
-                   retz3_set_video(info, &display->var, &zinfo->current_par);
-               } else
-                   display->dispsw = &fbcon_cfb8;
-               break;
-#endif
-#ifdef FBCON_HAS_CFB16
-       case 16:
-               display->dispsw = &fbcon_cfb16;
-               break;
-#endif
-       default:
-               display->dispsw = &fbcon_dummy;
-               break;
-       }
-}
-
-
-/*
- *    Set the User Defined Part of the Display
- */
-
-static int retz3fb_set_var(struct fb_var_screeninfo *var, int con,
-                          struct fb_info *info)
-{
-       int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp, oldaccel;
-       struct display *display;
-       struct retz3_fb_info *zinfo = retz3info(info);
-
-       if (con >= 0)
-               display = &fb_display[con];
-       else
-               display = &zinfo->disp; /* used during initialization */
-
-       if ((err = do_fb_set_var(info, var, con == info->currcon)))
-               return err;
-       if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) {
-               oldxres = display->var.xres;
-               oldyres = display->var.yres;
-               oldvxres = display->var.xres_virtual;
-               oldvyres = display->var.yres_virtual;
-               oldbpp = display->var.bits_per_pixel;
-               oldaccel = display->var.accel_flags;
-               display->var = *var;
-
-               if (oldxres != var->xres || oldyres != var->yres ||
-                   oldvxres != var->xres_virtual ||
-                   oldvyres != var->yres_virtual ||
-                   oldbpp != var->bits_per_pixel ||
-                   oldaccel != var->accel_flags) {
-
-                       struct fb_fix_screeninfo fix;
-                       retz3fb_get_fix(&fix, con, info);
-
-                       display->visual = fix.visual;
-                       display->type = fix.type;
-                       display->type_aux = fix.type_aux;
-                       display->ypanstep = fix.ypanstep;
-                       display->ywrapstep = fix.ywrapstep;
-                       display->line_length = fix.line_length;
-                       display->can_soft_blank = 1;
-                       display->inverse = z3fb_inverse;
-                       switch (display->var.bits_per_pixel) {
-#ifdef FBCON_HAS_CFB8
-                       case 8:
-                               if (var->accel_flags & FB_ACCELF_TEXT) {
-                                       display->dispsw = &fbcon_retz3_8;
-                               } else
-                                       display->dispsw = &fbcon_cfb8;
-                               break;
-#endif
-#ifdef FBCON_HAS_CFB16
-                       case 16:
-                               display->dispsw = &fbcon_cfb16;
-                               break;
-#endif
-                       default:
-                               display->dispsw = &fbcon_dummy;
-                               break;
-                       }
-                       /*
-                        * We still need to find a way to tell the X
-                        * server that the video mem has been fiddled with
-                        * so it redraws the entire screen when switching
-                        * between X and a text console.
-                        */
-                       retz3_set_video(info, var, &zinfo->current_par);
-
-                       if (info->changevar)
-                               (*info->changevar)(con);
-               }
-
-               if (oldbpp != var->bits_per_pixel) {
-                       if ((err = fb_alloc_cmap(&display->cmap, 0, 0)))
-                               return err;
-                       do_install_cmap(con, info);
-               }
-       }
-       return 0;
-}
-
-
-/*
- *    Get the Colormap
- */
-
-static int retz3fb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
-                           struct fb_info *info)
-{
-       if (con == info->currcon) /* current console? */
-               return(fb_get_cmap(cmap, kspc, retz3_getcolreg, info));
-       else if (fb_display[con].cmap.len) /* non default colormap? */
-               fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
-       else
-               fb_copy_cmap(fb_default_cmap(1<<fb_display[con].var.bits_per_pixel),
-                            cmap, kspc ? 0 : 2);
-       return 0;
-}
-
-/*
- *    Blank the display.
- */
-
-static int retz3fb_blank(int blank, struct fb_info *info)
-{
-       struct retz3_fb_info *zinfo = retz3info(info);
-       volatile unsigned char *regs = retz3info(info)->regs;
-       short i;
-
-       if (blank)
-               for (i = 0; i < 256; i++){
-                       reg_w(regs, VDAC_ADDRESS_W, i);
-                       reg_w(regs, VDAC_DATA, 0);
-                       reg_w(regs, VDAC_DATA, 0);
-                       reg_w(regs, VDAC_DATA, 0);
-               }
-       else
-               for (i = 0; i < 256; i++){
-                       reg_w(regs, VDAC_ADDRESS_W, i);
-                       reg_w(regs, VDAC_DATA, zinfo->color_table[i][0]);
-                       reg_w(regs, VDAC_DATA, zinfo->color_table[i][1]);
-                       reg_w(regs, VDAC_DATA, zinfo->color_table[i][2]);
-               }
-       return 0;
-}
-
-static struct fb_ops retz3fb_ops = {
-       .owner =        THIS_MODULE,
-       .fb_get_fix =   retz3fb_get_fix,
-       .fb_get_var =   retz3fb_get_var,
-       .fb_set_var =   retz3fb_set_var,
-       .fb_get_cmap =  retz3fb_get_cmap,
-       .fb_set_cmap =  gen_set_cmap,
-       .fb_setcolreg = retz3fb_setcolreg,
-       .fb_blank =     retz3fb_blank,
-};
-
-int __init retz3fb_setup(char *options)
-{
-       char *this_opt;
-
-       if (!options || !*options)
-               return 0;
-
-       while ((this_opt = strsep(&options, ",")) != NULL) {
-               if (!*this_opt)
-                       continue;
-               if (!strcmp(this_opt, "inverse")) {
-                       z3fb_inverse = 1;
-                       fb_invert_cmaps();
-               } else if (!strncmp(this_opt, "font:", 5)) {
-                       strlcpy(fontname, this_opt+5, sizeof(fontname));
-               } else
-                       z3fb_mode = get_video_mode(this_opt);
-       }
-       return 0;
-}
-
-
-/*
- *    Initialization
- */
-
-int __init retz3fb_init(void)
-{
-       unsigned long board_addr, board_size;
-       struct zorro_dev *z = NULL;
-       volatile unsigned char *regs;
-       struct retz3fb_par par;
-       struct retz3_fb_info *zinfo;
-       struct fb_info *fb_info;
-       short i;
-       int res = -ENXIO;
-
-       while ((z = zorro_find_device(ZORRO_PROD_MACROSYSTEMS_RETINA_Z3, z))) {
-               board_addr = z->resource.start;
-               board_size = z->resource.end-z->resource.start+1;
-               if (!request_mem_region(board_addr, 0x0c00000,
-                                       "ncr77c32blt")) {
-                       continue;
-               if (!request_mem_region(board_addr+VIDEO_MEM_OFFSET,
-                                       0x00400000, "RAM"))
-                       release_mem_region(board_addr, 0x00c00000);
-                       continue;
-               }
-               if (!(zinfo = kmalloc(sizeof(struct retz3_fb_info),
-                                     GFP_KERNEL)))
-                       return -ENOMEM;
-               memset(zinfo, 0, sizeof(struct retz3_fb_info));
-
-               zinfo->base = ioremap(board_addr, board_size);
-               zinfo->regs = zinfo->base;
-               zinfo->fbmem = zinfo->base + VIDEO_MEM_OFFSET;
-               /* Get memory size - for now we asume it's a 4MB board */
-               zinfo->fbsize = 0x00400000; /* 4 MB */
-               zinfo->physregs = board_addr;
-               zinfo->physfbmem = board_addr + VIDEO_MEM_OFFSET;
-
-               fb_info = fbinfo(zinfo);
-
-               for (i = 0; i < 256; i++){
-                       for (i = 0; i < 256; i++){
-                               zinfo->color_table[i][0] = i;
-                               zinfo->color_table[i][1] = i;
-                               zinfo->color_table[i][2] = i;
-                       }
-               }
-
-               regs = zinfo->regs;
-               /* Disable hardware cursor */
-               seq_w(regs, SEQ_CURSOR_Y_INDEX, 0x00);
-
-               retz3fb_setcolreg (255, 56<<8, 100<<8, 160<<8, 0, fb_info);
-               retz3fb_setcolreg (254, 0, 0, 0, 0, fb_info);
-
-               strcpy(fb_info->modename, retz3fb_name);
-               fb_info->changevar = NULL;
-               fb_info->fbops = &retz3fb_ops;
-               fb_info->screen_base = zinfo->fbmem;
-               fb_info->disp = &zinfo->disp;
-               fb_info->currcon = -1;
-               fb_info->switch_con = &z3fb_switch;
-               fb_info->updatevar = &z3fb_updatevar;
-               fb_info->flags = FBINFO_FLAG_DEFAULT;
-               strlcpy(fb_info->fontname, fontname, sizeof(fb_info->fontname));
-
-               if (z3fb_mode == -1)
-                       retz3fb_default = retz3fb_predefined[0].var;
-
-               retz3_decode_var(&retz3fb_default, &par);
-               retz3_encode_var(&retz3fb_default, &par);
-
-               do_fb_set_var(fb_info, &retz3fb_default, 0);
-               retz3fb_get_var(&zinfo->disp.var, -1, fb_info);
-
-               retz3fb_set_disp(-1, fb_info);
-
-               do_install_cmap(0, fb_info);
-
-               if (register_framebuffer(fb_info) < 0) {
-                       iounmap(zinfo->base);
-                       return -EINVAL;
-               }
-
-               printk(KERN_INFO "fb%d: %s frame buffer device, using %ldK of "
-                      "video memory\n", fb_info->node,
-                      fb_info->modename, zinfo->fbsize>>10);
-
-               /* FIXME: This driver cannot be unloaded yet */
-               res = 0;
-       }
-       return res;
-}
-
-
-static int z3fb_switch(int con, struct fb_info *info)
-{
-       /* Do we have to save the colormap? */
-       if (fb_display[info->currcon].cmap.len)
-               fb_get_cmap(&fb_display[info->currcon].cmap, 1,
-                           retz3_getcolreg, info);
-
-       do_fb_set_var(info, &fb_display[con].var, 1);
-       info->currcon = con;
-       /* Install new colormap */
-       do_install_cmap(con, info);
-       return 0;
-}
-
-
-/*
- *    Update the `var' structure (called by fbcon.c)
- *
- *    This call looks only at yoffset and the FB_VMODE_YWRAP flag in `var'.
- *    Since it's called by a kernel driver, no range checking is done.
- */
-
-static int z3fb_updatevar(int con, struct fb_info *info)
-{
-       return 0;
-}
-
-/*
- *    Get a Video Mode
- */
-
-static int __init get_video_mode(const char *name)
-{
-       short i;
-
-       for (i = 0; i < NUM_TOTAL_MODES; i++)
-               if (!strcmp(name, retz3fb_predefined[i].name)){
-                       retz3fb_default = retz3fb_predefined[i].var;
-                       return i;
-               }
-       return -1;
-}
-
-
-#ifdef MODULE
-MODULE_LICENSE("GPL");
-
-int init_module(void)
-{
-       return retz3fb_init();
-}
-#endif
-
-
-/*
- *  Text console acceleration
- */
-
-#ifdef FBCON_HAS_CFB8
-static void retz3_8_bmove(struct display *p, int sy, int sx,
-                         int dy, int dx, int height, int width)
-{
-       int fontwidth = fontwidth(p);
-
-       sx *= fontwidth;
-       dx *= fontwidth;
-       width *= fontwidth;
-
-       retz3_bitblt(p,
-                    (unsigned short)sx,
-                    (unsigned short)(sy*fontheight(p)),
-                    (unsigned short)dx,
-                    (unsigned short)(dy*fontheight(p)),
-                    (unsigned short)width,
-                    (unsigned short)(height*fontheight(p)),
-                    Z3BLTcopy,
-                    0xffff);
-}
-
-static void retz3_8_clear(struct vc_data *conp, struct display *p,
-                         int sy, int sx, int height, int width)
-{
-       unsigned short col;
-       int fontwidth = fontwidth(p);
-
-       sx *= fontwidth;
-       width *= fontwidth;
-
-       col = attr_bgcol_ec(p, conp);
-       col &= 0xff;
-       col |= (col << 8);
-
-       retz3_bitblt(p,
-                    (unsigned short)sx,
-                    (unsigned short)(sy*fontheight(p)),
-                    (unsigned short)sx,
-                    (unsigned short)(sy*fontheight(p)),
-                    (unsigned short)width,
-                    (unsigned short)(height*fontheight(p)),
-                    Z3BLTset,
-                    col);
-}
-
-
-static void retz3_putc(struct vc_data *conp, struct display *p, int c,
-                      int yy, int xx)
-{
-       retz3_busy(p);
-       fbcon_cfb8_putc(conp, p, c, yy, xx);
-}
-
-
-static void retz3_putcs(struct vc_data *conp, struct display *p,
-                       const unsigned short *s, int count,
-                       int yy, int xx)
-{
-       retz3_busy(p);
-       fbcon_cfb8_putcs(conp, p, s, count, yy, xx);
-}
-
-
-static void retz3_revc(struct display *p, int xx, int yy)
-{
-       retz3_busy(p);
-       fbcon_cfb8_revc(p, xx, yy);
-}
-
-
-static void retz3_clear_margins(struct vc_data* conp, struct display* p,
-                               int bottom_only)
-{
-       retz3_busy(p);
-       fbcon_cfb8_clear_margins(conp, p, bottom_only);
-}
-
-
-static struct display_switch fbcon_retz3_8 = {
-       .setup          = fbcon_cfb8_setup,
-       .bmove          = retz3_8_bmove,
-       .clear          = retz3_8_clear,
-       .putc           = retz3_putc,
-       .putcs          = retz3_putcs,
-       .revc           = retz3_revc,
-       .clear_margins  = retz3_clear_margins,
-       .fontwidthmask  = FONTWIDTH(8)
-};
-#endif
diff --git a/drivers/video/retz3fb.h b/drivers/video/retz3fb.h
deleted file mode 100644 (file)
index 5cc7510..0000000
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * linux/drivers/video/retz3fb.h -- Defines and macros for the RetinaZ3 frame
- *                                 buffer device
- *
- *    Copyright (C) 1997 Jes Sorensen
- *
- * History:
- *   - 22 Jan 97: Initial work
- *
- *
- * 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.
- */
-
-/*
- * Macros to read and write to registers.
- */
-#define reg_w(regs, reg,dat) (*(regs + reg) = dat)
-#define reg_r(regs, reg) (*(regs + reg))
-
-/*
- * Macro to access the sequencer.
- */
-#define seq_w(regs, sreg, sdat) \
-       do{ reg_w(regs, SEQ_IDX, sreg); reg_w(regs, SEQ_DATA, sdat); } while(0)
-
-/*
- * Macro to access the CRT controller.
- */
-#define crt_w(regs, creg, cdat) \
-       do{ reg_w(regs, CRT_IDX, creg); reg_w(regs, CRT_DATA, cdat); } while(0)
-
-/*
- * Macro to access the graphics controller.
- */
-#define gfx_w(regs, greg, gdat) \
-       do{ reg_w(regs, GFX_IDX, greg); reg_w(regs, GFX_DATA, gdat); } while(0)
-
-/*
- * Macro to access the attribute controller.
- */
-#define attr_w(regs, areg, adat) \
-       do{ reg_w(regs, ACT_IDX, areg); reg_w(regs, ACT_DATA, adat); } while(0)
-
-/*
- * Macro to access the pll.
- */
-#define pll_w(regs, preg, pdat) \
-       do{ reg_w(regs, PLL_IDX, preg); \
-           reg_w(regs, PLL_DATA, (pdat & 0xff)); \
-           reg_w(regs, PLL_DATA, (pdat >> 8));\
-       } while(0)
-
-/*
- * Offsets
- */
-#define VIDEO_MEM_OFFSET       0x00c00000
-#define ACM_OFFSET             0x00b00000
-
-/*
- * Accelerator Control Menu
- */
-#define ACM_PRIMARY_OFFSET     0x00
-#define ACM_SECONDARY_OFFSET   0x04
-#define ACM_MODE_CONTROL       0x08
-#define ACM_CURSOR_POSITION    0x0c
-#define ACM_START_STATUS       0x30
-#define ACM_CONTROL            0x34
-#define ACM_RASTEROP_ROTATION  0x38
-#define ACM_BITMAP_DIMENSION   0x3c
-#define ACM_DESTINATION                0x40
-#define ACM_SOURCE             0x44
-#define ACM_PATTERN            0x48
-#define ACM_FOREGROUND         0x4c
-#define ACM_BACKGROUND         0x50
-
-/*
- * Video DAC addresses
- */
-#define VDAC_ADDRESS           0x03c8
-#define VDAC_ADDRESS_W         0x03c8
-#define VDAC_ADDRESS_R         0x03c7
-#define VDAC_STATE             0x03c7
-#define VDAC_DATA              0x03c9
-#define VDAC_MASK              0x03c6
-
-/*
- * Sequencer
- */
-#define SEQ_IDX                        0x03c4  /* Sequencer Index */
-#define SEQ_DATA               0x03c5
-#define SEQ_RESET              0x00
-#define SEQ_CLOCKING_MODE      0x01
-#define SEQ_MAP_MASK           0x02
-#define SEQ_CHAR_MAP_SELECT    0x03
-#define SEQ_MEMORY_MODE                0x04
-#define SEQ_EXTENDED_ENABLE    0x05    /* NCR extensions */
-#define SEQ_UNKNOWN1           0x06
-#define SEQ_UNKNOWN2           0x07
-#define SEQ_CHIP_ID            0x08
-#define SEQ_UNKNOWN3           0x09
-#define SEQ_CURSOR_COLOR1      0x0a
-#define SEQ_CURSOR_COLOR0      0x0b
-#define SEQ_CURSOR_CONTROL     0x0c
-#define SEQ_CURSOR_X_LOC_HI    0x0d
-#define SEQ_CURSOR_X_LOC_LO    0x0e
-#define SEQ_CURSOR_Y_LOC_HI    0x0f
-#define SEQ_CURSOR_Y_LOC_LO    0x10
-#define SEQ_CURSOR_X_INDEX     0x11
-#define SEQ_CURSOR_Y_INDEX     0x12
-#define SEQ_CURSOR_STORE_HI    0x13
-#define SEQ_CURSOR_STORE_LO    0x14
-#define SEQ_CURSOR_ST_OFF_HI   0x15
-#define SEQ_CURSOR_ST_OFF_LO   0x16
-#define SEQ_CURSOR_PIXELMASK   0x17
-#define SEQ_PRIM_HOST_OFF_HI   0x18
-#define SEQ_PRIM_HOST_OFF_LO   0x19
-#define SEQ_LINEAR_0           0x1a
-#define SEQ_LINEAR_1           0x1b
-#define SEQ_SEC_HOST_OFF_HI    0x1c
-#define SEQ_SEC_HOST_OFF_LO    0x1d
-#define SEQ_EXTENDED_MEM_ENA   0x1e
-#define SEQ_EXT_CLOCK_MODE     0x1f
-#define SEQ_EXT_VIDEO_ADDR     0x20
-#define SEQ_EXT_PIXEL_CNTL     0x21
-#define SEQ_BUS_WIDTH_FEEDB    0x22
-#define SEQ_PERF_SELECT                0x23
-#define SEQ_COLOR_EXP_WFG      0x24
-#define SEQ_COLOR_EXP_WBG      0x25
-#define SEQ_EXT_RW_CONTROL     0x26
-#define SEQ_MISC_FEATURE_SEL   0x27
-#define SEQ_COLOR_KEY_CNTL     0x28
-#define SEQ_COLOR_KEY_MATCH0   0x29
-#define SEQ_COLOR_KEY_MATCH1   0x2a
-#define SEQ_COLOR_KEY_MATCH2   0x2b
-#define SEQ_UNKNOWN6           0x2c
-#define SEQ_CRC_CONTROL                0x2d
-#define SEQ_CRC_DATA_LOW       0x2e
-#define SEQ_CRC_DATA_HIGH      0x2f
-#define SEQ_MEMORY_MAP_CNTL    0x30
-#define SEQ_ACM_APERTURE_1     0x31
-#define SEQ_ACM_APERTURE_2     0x32
-#define SEQ_ACM_APERTURE_3     0x33
-#define SEQ_BIOS_UTILITY_0     0x3e
-#define SEQ_BIOS_UTILITY_1     0x3f
-
-/*
- * Graphics Controller
- */
-#define GFX_IDX                        0x03ce
-#define GFX_DATA               0x03cf
-#define GFX_SET_RESET          0x00
-#define GFX_ENABLE_SET_RESET   0x01
-#define GFX_COLOR_COMPARE      0x02
-#define GFX_DATA_ROTATE                0x03
-#define GFX_READ_MAP_SELECT    0x04
-#define GFX_GRAPHICS_MODE      0x05
-#define GFX_MISC               0x06
-#define GFX_COLOR_XCARE                0x07
-#define GFX_BITMASK            0x08
-
-/*
- * CRT Controller
- */
-#define CRT_IDX                        0x03d4
-#define CRT_DATA               0x03d5
-#define CRT_HOR_TOTAL          0x00
-#define CRT_HOR_DISP_ENA_END   0x01
-#define CRT_START_HOR_BLANK    0x02
-#define CRT_END_HOR_BLANK      0x03
-#define CRT_START_HOR_RETR     0x04
-#define CRT_END_HOR_RETR       0x05
-#define CRT_VER_TOTAL          0x06
-#define CRT_OVERFLOW           0x07
-#define CRT_PRESET_ROW_SCAN    0x08
-#define CRT_MAX_SCAN_LINE      0x09
-#define CRT_CURSOR_START       0x0a
-#define CRT_CURSOR_END         0x0b
-#define CRT_START_ADDR_HIGH    0x0c
-#define CRT_START_ADDR_LOW     0x0d
-#define CRT_CURSOR_LOC_HIGH    0x0e
-#define CRT_CURSOR_LOC_LOW     0x0f
-#define CRT_START_VER_RETR     0x10
-#define CRT_END_VER_RETR       0x11
-#define CRT_VER_DISP_ENA_END   0x12
-#define CRT_OFFSET             0x13
-#define CRT_UNDERLINE_LOC      0x14
-#define CRT_START_VER_BLANK    0x15
-#define CRT_END_VER_BLANK      0x16
-#define CRT_MODE_CONTROL       0x17
-#define CRT_LINE_COMPARE       0x18
-#define CRT_UNKNOWN1           0x19
-#define CRT_UNKNOWN2           0x1a
-#define CRT_UNKNOWN3           0x1b
-#define CRT_UNKNOWN4           0x1c
-#define CRT_UNKNOWN5           0x1d
-#define CRT_UNKNOWN6           0x1e
-#define CRT_UNKNOWN7           0x1f
-#define CRT_UNKNOWN8           0x20
-#define CRT_UNKNOWN9           0x21
-#define CRT_UNKNOWN10          0x22
-#define CRT_UNKNOWN11          0x23
-#define CRT_UNKNOWN12          0x24
-#define CRT_UNKNOWN13          0x25
-#define CRT_UNKNOWN14          0x26
-#define CRT_UNKNOWN15          0x27
-#define CRT_UNKNOWN16          0x28
-#define CRT_UNKNOWN17          0x29
-#define CRT_UNKNOWN18          0x2a
-#define CRT_UNKNOWN19          0x2b
-#define CRT_UNKNOWN20          0x2c
-#define CRT_UNKNOWN21          0x2d
-#define CRT_UNKNOWN22          0x2e
-#define CRT_UNKNOWN23          0x2f
-#define CRT_EXT_HOR_TIMING1    0x30    /* NCR crt extensions */
-#define CRT_EXT_START_ADDR     0x31
-#define CRT_EXT_HOR_TIMING2    0x32
-#define CRT_EXT_VER_TIMING     0x33
-#define CRT_MONITOR_POWER      0x34
-
-/*
- * General Registers
- */
-#define GREG_STATUS0_R         0x03c2
-#define GREG_STATUS1_R         0x03da
-#define GREG_MISC_OUTPUT_R     0x03cc
-#define GREG_MISC_OUTPUT_W     0x03c2  
-#define GREG_FEATURE_CONTROL_R 0x03ca
-#define GREG_FEATURE_CONTROL_W 0x03da
-#define GREG_POS               0x0102
-
-/*
- * Attribute Controller
- */
-#define ACT_IDX                        0x03C0
-#define ACT_ADDRESS_R          0x03C0
-#define ACT_DATA               0x03C0
-#define ACT_ADDRESS_RESET      0x03DA
-#define ACT_PALETTE0           0x00
-#define ACT_PALETTE1           0x01
-#define ACT_PALETTE2           0x02
-#define ACT_PALETTE3           0x03
-#define ACT_PALETTE4           0x04
-#define ACT_PALETTE5           0x05
-#define ACT_PALETTE6           0x06
-#define ACT_PALETTE7           0x07
-#define ACT_PALETTE8           0x08
-#define ACT_PALETTE9           0x09
-#define ACT_PALETTE10          0x0A
-#define ACT_PALETTE11          0x0B
-#define ACT_PALETTE12          0x0C
-#define ACT_PALETTE13          0x0D
-#define ACT_PALETTE14          0x0E
-#define ACT_PALETTE15          0x0F
-#define ACT_ATTR_MODE_CNTL     0x10
-#define ACT_OVERSCAN_COLOR     0x11
-#define ACT_COLOR_PLANE_ENA    0x12
-#define ACT_HOR_PEL_PANNING    0x13
-#define ACT_COLOR_SELECT       0x14
-
-/*
- * PLL
- */
-#define PLL_IDX                        0x83c8
-#define PLL_DATA               0x83c9
-
-/*
- * Blitter operations
- */
-#define        Z3BLTclear              0x00    /* 0 */
-#define Z3BLTand               0x80    /* src AND dst */
-#define Z3BLTandReverse                0x40    /* src AND NOT dst */
-#define Z3BLTcopy              0xc0    /* src */
-#define Z3BLTandInverted       0x20    /* NOT src AND dst */
-#define        Z3BLTnoop               0xa0    /* dst */
-#define Z3BLTxor               0x60    /* src XOR dst */
-#define Z3BLTor                        0xe0    /* src OR dst */
-#define Z3BLTnor               0x10    /* NOT src AND NOT dst */
-#define Z3BLTequiv             0x90    /* NOT src XOR dst */
-#define Z3BLTinvert            0x50    /* NOT dst */
-#define Z3BLTorReverse         0xd0    /* src OR NOT dst */
-#define Z3BLTcopyInverted      0x30    /* NOT src */
-#define Z3BLTorInverted                0xb0    /* NOT src OR dst */
-#define Z3BLTnand              0x70    /* NOT src OR NOT dst */
-#define Z3BLTset               0xf0    /* 1 */
index 1a13966b7d5b04d5aaa3a45a0b72e68638982806..f2e9b742c92fe812471d72b3a607039268d51145 100644 (file)
@@ -894,7 +894,8 @@ out:
        return rc;
 }
 
-static void riva_update_var(struct fb_var_screeninfo *var, struct fb_videomode *modedb)
+static void riva_update_var(struct fb_var_screeninfo *var,
+                           const struct fb_videomode *modedb)
 {
        NVTRACE_ENTER();
        var->xres = var->xres_virtual = modedb->xres;
@@ -1101,10 +1102,10 @@ static int riva_get_cmap_len(const struct fb_var_screeninfo *var)
 static int rivafb_open(struct fb_info *info, int user)
 {
        struct riva_par *par = info->par;
-       int cnt = atomic_read(&par->ref_count);
 
        NVTRACE_ENTER();
-       if (!cnt) {
+       mutex_lock(&par->open_lock);
+       if (!par->ref_count) {
 #ifdef CONFIG_X86
                memset(&par->state, 0, sizeof(struct vgastate));
                par->state.flags = VGA_SAVE_MODE  | VGA_SAVE_FONTS;
@@ -1119,7 +1120,8 @@ static int rivafb_open(struct fb_info *info, int user)
        
                riva_save_state(par, &par->initial_state);
        }
-       atomic_inc(&par->ref_count);
+       par->ref_count++;
+       mutex_unlock(&par->open_lock);
        NVTRACE_LEAVE();
        return 0;
 }
@@ -1127,12 +1129,14 @@ static int rivafb_open(struct fb_info *info, int user)
 static int rivafb_release(struct fb_info *info, int user)
 {
        struct riva_par *par = info->par;
-       int cnt = atomic_read(&par->ref_count);
 
        NVTRACE_ENTER();
-       if (!cnt)
+       mutex_lock(&par->open_lock);
+       if (!par->ref_count) {
+               mutex_unlock(&par->open_lock);
                return -EINVAL;
-       if (cnt == 1) {
+       }
+       if (par->ref_count == 1) {
                par->riva.LockUnlock(&par->riva, 0);
                par->riva.LoadStateExt(&par->riva, &par->initial_state.ext);
                riva_load_state(par, &par->initial_state);
@@ -1141,14 +1145,15 @@ static int rivafb_release(struct fb_info *info, int user)
 #endif
                par->riva.LockUnlock(&par->riva, 1);
        }
-       atomic_dec(&par->ref_count);
+       par->ref_count--;
+       mutex_unlock(&par->open_lock);
        NVTRACE_LEAVE();
        return 0;
 }
 
 static int rivafb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
 {
-       struct fb_videomode *mode;
+       const struct fb_videomode *mode;
        struct riva_par *par = info->par;
        int nom, den;           /* translating from pixels->bytes */
        int mode_valid = 0;
@@ -1980,12 +1985,11 @@ static int __devinit rivafb_probe(struct pci_dev *pd,
        default_par = info->par;
        default_par->pdev = pd;
 
-       info->pixmap.addr = kmalloc(8 * 1024, GFP_KERNEL);
+       info->pixmap.addr = kzalloc(8 * 1024, GFP_KERNEL);
        if (info->pixmap.addr == NULL) {
                ret = -ENOMEM;
                goto err_framebuffer_release;
        }
-       memset(info->pixmap.addr, 0, 8 * 1024);
 
        ret = pci_enable_device(pd);
        if (ret < 0) {
@@ -1999,6 +2003,7 @@ static int __devinit rivafb_probe(struct pci_dev *pd,
                goto err_disable_device;
        }
 
+       mutex_init(&default_par->open_lock);
        default_par->riva.Architecture = riva_get_arch(pd);
 
        default_par->Chipset = (pd->vendor << 16) | pd->device;
index 01b85e3b0ae1efb8ad4b1779109d52ffc311d5fb..0405e839ff939f5dc9e13d33f02dd4f1cd51ca06 100644 (file)
@@ -14,7 +14,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/pci.h>
 #include <linux/fb.h>
index 7fa13fc9c4135837fdef1a7b94e18ef41a2a71ac..48ead6d72f24e9906e2dd33937357cce9687aa89 100644 (file)
@@ -53,7 +53,8 @@ struct riva_par {
 #ifdef CONFIG_X86
        struct vgastate state;
 #endif
-       atomic_t ref_count;
+       struct mutex open_lock;
+       unsigned int ref_count;
        unsigned char *EDID;
        unsigned int Chipset;
        int forceCRTC;
index ccef56d0c15794fced4c4c71b93a2ce21288f0a3..ed3426062a8b5c136784b988f7abaa2c52c043b7 100644 (file)
@@ -791,6 +791,8 @@ static int __init s3c2410fb_probe(struct platform_device *pdev)
 
        info = fbinfo->par;
        info->fb = fbinfo;
+       info->dev = &pdev->dev;
+
        platform_set_drvdata(pdev, fbinfo);
 
        dprintk("devinit\n");
diff --git a/drivers/video/s3fb.c b/drivers/video/s3fb.c
new file mode 100644 (file)
index 0000000..3162c37
--- /dev/null
@@ -0,0 +1,1180 @@
+/*
+ * linux/drivers/video/s3fb.c -- Frame buffer device driver for S3 Trio/Virge
+ *
+ * Copyright (c) 2006-2007 Ondrej Zajicek <santiago@crfreenet.org>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file COPYING in the main directory of this archive for
+ * more details.
+ *
+ * Code is based on David Boucher's viafb (http://davesdomain.org.uk/viafb/)
+ * which is based on the code of neofb.
+ */
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/mm.h>
+#include <linux/tty.h>
+#include <linux/slab.h>
+#include <linux/delay.h>
+#include <linux/fb.h>
+#include <linux/svga.h>
+#include <linux/init.h>
+#include <linux/pci.h>
+#include <linux/console.h> /* Why should fb driver call console functions? because acquire_console_sem() */
+#include <video/vga.h>
+
+#ifdef CONFIG_MTRR
+#include <asm/mtrr.h>
+#endif
+
+struct s3fb_info {
+       int chip, rev, mclk_freq;
+       int mtrr_reg;
+       struct vgastate state;
+       struct mutex open_lock;
+       unsigned int ref_count;
+       u32 pseudo_palette[16];
+};
+
+
+/* ------------------------------------------------------------------------- */
+
+static const struct svga_fb_format s3fb_formats[] = {
+       { 0,  {0, 6, 0},  {0, 6, 0},  {0, 6, 0}, {0, 0, 0}, 0,
+               FB_TYPE_TEXT, FB_AUX_TEXT_SVGA_STEP4,   FB_VISUAL_PSEUDOCOLOR, 8, 16},
+       { 4,  {0, 6, 0},  {0, 6, 0},  {0, 6, 0}, {0, 0, 0}, 0,
+               FB_TYPE_PACKED_PIXELS, 0,               FB_VISUAL_PSEUDOCOLOR, 8, 16},
+       { 4,  {0, 6, 0},  {0, 6, 0},  {0, 6, 0}, {0, 0, 0}, 1,
+               FB_TYPE_INTERLEAVED_PLANES, 1,          FB_VISUAL_PSEUDOCOLOR, 8, 16},
+       { 8,  {0, 6, 0},  {0, 6, 0},  {0, 6, 0}, {0, 0, 0}, 0,
+               FB_TYPE_PACKED_PIXELS, 0,               FB_VISUAL_PSEUDOCOLOR, 4, 8},
+       {16,  {10, 5, 0}, {5, 5, 0},  {0, 5, 0}, {0, 0, 0}, 0,
+               FB_TYPE_PACKED_PIXELS, 0,               FB_VISUAL_TRUECOLOR, 2, 4},
+       {16,  {11, 5, 0}, {5, 6, 0},  {0, 5, 0}, {0, 0, 0}, 0,
+               FB_TYPE_PACKED_PIXELS, 0,               FB_VISUAL_TRUECOLOR, 2, 4},
+       {24,  {16, 8, 0}, {8, 8, 0},  {0, 8, 0}, {0, 0, 0}, 0,
+               FB_TYPE_PACKED_PIXELS, 0,               FB_VISUAL_TRUECOLOR, 1, 2},
+       {32,  {16, 8, 0}, {8, 8, 0},  {0, 8, 0}, {0, 0, 0}, 0,
+               FB_TYPE_PACKED_PIXELS, 0,               FB_VISUAL_TRUECOLOR, 1, 2},
+       SVGA_FORMAT_END
+};
+
+
+static const struct svga_pll s3_pll = {3, 129, 3, 33, 0, 3,
+       60000, 240000, 14318};
+
+static const int s3_memsizes[] = {4096, 0, 3072, 8192, 2048, 6144, 1024, 512};
+
+static const char * const s3_names[] = {"S3 Unknown", "S3 Trio32", "S3 Trio64", "S3 Trio64V+",
+                       "S3 Trio64UV+", "S3 Trio64V2/DX", "S3 Trio64V2/GX",
+                       "S3 Plato/PX", "S3 Aurora64VP", "S3 Virge",
+                       "S3 Virge/VX", "S3 Virge/DX", "S3 Virge/GX",
+                       "S3 Virge/GX2", "S3 Virge/GX2P", "S3 Virge/GX2P"};
+
+#define CHIP_UNKNOWN           0x00
+#define CHIP_732_TRIO32                0x01
+#define CHIP_764_TRIO64                0x02
+#define CHIP_765_TRIO64VP      0x03
+#define CHIP_767_TRIO64UVP     0x04
+#define CHIP_775_TRIO64V2_DX   0x05
+#define CHIP_785_TRIO64V2_GX   0x06
+#define CHIP_551_PLATO_PX      0x07
+#define CHIP_M65_AURORA64VP    0x08
+#define CHIP_325_VIRGE         0x09
+#define CHIP_988_VIRGE_VX      0x0A
+#define CHIP_375_VIRGE_DX      0x0B
+#define CHIP_385_VIRGE_GX      0x0C
+#define CHIP_356_VIRGE_GX2     0x0D
+#define CHIP_357_VIRGE_GX2P    0x0E
+#define CHIP_359_VIRGE_GX2P    0x0F
+
+#define CHIP_XXX_TRIO          0x80
+#define CHIP_XXX_TRIO64V2_DXGX 0x81
+#define CHIP_XXX_VIRGE_DXGX    0x82
+
+#define CHIP_UNDECIDED_FLAG    0x80
+#define CHIP_MASK              0xFF
+
+/* CRT timing register sets */
+
+static const struct vga_regset s3_h_total_regs[]        = {{0x00, 0, 7}, {0x5D, 0, 0}, VGA_REGSET_END};
+static const struct vga_regset s3_h_display_regs[]      = {{0x01, 0, 7}, {0x5D, 1, 1}, VGA_REGSET_END};
+static const struct vga_regset s3_h_blank_start_regs[]  = {{0x02, 0, 7}, {0x5D, 2, 2}, VGA_REGSET_END};
+static const struct vga_regset s3_h_blank_end_regs[]    = {{0x03, 0, 4}, {0x05, 7, 7}, VGA_REGSET_END};
+static const struct vga_regset s3_h_sync_start_regs[]   = {{0x04, 0, 7}, {0x5D, 4, 4}, VGA_REGSET_END};
+static const struct vga_regset s3_h_sync_end_regs[]     = {{0x05, 0, 4}, VGA_REGSET_END};
+
+static const struct vga_regset s3_v_total_regs[]        = {{0x06, 0, 7}, {0x07, 0, 0}, {0x07, 5, 5}, {0x5E, 0, 0}, VGA_REGSET_END};
+static const struct vga_regset s3_v_display_regs[]      = {{0x12, 0, 7}, {0x07, 1, 1}, {0x07, 6, 6}, {0x5E, 1, 1}, VGA_REGSET_END};
+static const struct vga_regset s3_v_blank_start_regs[]  = {{0x15, 0, 7}, {0x07, 3, 3}, {0x09, 5, 5}, {0x5E, 2, 2}, VGA_REGSET_END};
+static const struct vga_regset s3_v_blank_end_regs[]    = {{0x16, 0, 7}, VGA_REGSET_END};
+static const struct vga_regset s3_v_sync_start_regs[]   = {{0x10, 0, 7}, {0x07, 2, 2}, {0x07, 7, 7}, {0x5E, 4, 4}, VGA_REGSET_END};
+static const struct vga_regset s3_v_sync_end_regs[]     = {{0x11, 0, 3}, VGA_REGSET_END};
+
+static const struct vga_regset s3_line_compare_regs[]   = {{0x18, 0, 7}, {0x07, 4, 4}, {0x09, 6, 6}, {0x5E, 6, 6}, VGA_REGSET_END};
+static const struct vga_regset s3_start_address_regs[]  = {{0x0d, 0, 7}, {0x0c, 0, 7}, {0x31, 4, 5}, {0x51, 0, 1}, VGA_REGSET_END};
+static const struct vga_regset s3_offset_regs[]         = {{0x13, 0, 7}, {0x51, 4, 5}, VGA_REGSET_END}; /* set 0x43 bit 2 to 0 */
+
+static const struct svga_timing_regs s3_timing_regs     = {
+       s3_h_total_regs, s3_h_display_regs, s3_h_blank_start_regs,
+       s3_h_blank_end_regs, s3_h_sync_start_regs, s3_h_sync_end_regs,
+       s3_v_total_regs, s3_v_display_regs, s3_v_blank_start_regs,
+       s3_v_blank_end_regs, s3_v_sync_start_regs, s3_v_sync_end_regs,
+};
+
+
+/* ------------------------------------------------------------------------- */
+
+/* Module parameters */
+
+
+static char *mode = "640x480-8@60";
+
+#ifdef CONFIG_MTRR
+static int mtrr = 1;
+#endif
+
+static int fasttext = 1;
+
+
+MODULE_AUTHOR("(c) 2006-2007 Ondrej Zajicek <santiago@crfreenet.org>");
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("fbdev driver for S3 Trio/Virge");
+
+module_param(mode, charp, 0444);
+MODULE_PARM_DESC(mode, "Default video mode ('640x480-8@60', etc)");
+
+#ifdef CONFIG_MTRR
+module_param(mtrr, int, 0444);
+MODULE_PARM_DESC(mtrr, "Enable write-combining with MTRR (1=enable, 0=disable, default=1)");
+#endif
+
+module_param(fasttext, int, 0644);
+MODULE_PARM_DESC(fasttext, "Enable S3 fast text mode (1=enable, 0=disable, default=1)");
+
+
+/* ------------------------------------------------------------------------- */
+
+/* Set font in S3 fast text mode */
+
+static void s3fb_settile_fast(struct fb_info *info, struct fb_tilemap *map)
+{
+       const u8 *font = map->data;
+       u8* fb = (u8 *) info->screen_base;
+       int i, c;
+
+       if ((map->width != 8) || (map->height != 16) ||
+           (map->depth != 1) || (map->length != 256)) {
+               printk(KERN_ERR "fb%d: unsupported font parameters: width %d, height %d, depth %d, length %d\n",
+                       info->node, map->width, map->height, map->depth, map->length);
+               return;
+       }
+
+       fb += 2;
+       for (i = 0; i < map->height; i++) {
+               for (c = 0; c < map->length; c++) {
+                       fb[c * 4] = font[c * map->height + i];
+               }
+               fb += 1024;
+       }
+}
+
+
+
+static struct fb_tile_ops s3fb_tile_ops = {
+       .fb_settile     = svga_settile,
+       .fb_tilecopy    = svga_tilecopy,
+       .fb_tilefill    = svga_tilefill,
+       .fb_tileblit    = svga_tileblit,
+       .fb_tilecursor  = svga_tilecursor,
+};
+
+static struct fb_tile_ops s3fb_fast_tile_ops = {
+       .fb_settile     = s3fb_settile_fast,
+       .fb_tilecopy    = svga_tilecopy,
+       .fb_tilefill    = svga_tilefill,
+       .fb_tileblit    = svga_tileblit,
+       .fb_tilecursor  = svga_tilecursor,
+};
+
+
+/* ------------------------------------------------------------------------- */
+
+/* image data is MSB-first, fb structure is MSB-first too */
+static inline u32 expand_color(u32 c)
+{
+       return ((c & 1) | ((c & 2) << 7) | ((c & 4) << 14) | ((c & 8) << 21)) * 0xFF;
+}
+
+/* s3fb_iplan_imageblit silently assumes that almost everything is 8-pixel aligned */
+static void s3fb_iplan_imageblit(struct fb_info *info, const struct fb_image *image)
+{
+       u32 fg = expand_color(image->fg_color);
+       u32 bg = expand_color(image->bg_color);
+       const u8 *src1, *src;
+       u8 __iomem *dst1;
+       u32 __iomem *dst;
+       u32 val;
+       int x, y;
+
+       src1 = image->data;
+       dst1 = info->screen_base + (image->dy * info->fix.line_length)
+                + ((image->dx / 8) * 4);
+
+       for (y = 0; y < image->height; y++) {
+               src = src1;
+               dst = (u32 __iomem *) dst1;
+               for (x = 0; x < image->width; x += 8) {
+                       val = *(src++) * 0x01010101;
+                       val = (val & fg) | (~val & bg);
+                       fb_writel(val, dst++);
+               }
+               src1 += image->width / 8;
+               dst1 += info->fix.line_length;
+       }
+
+}
+
+/* s3fb_iplan_fillrect silently assumes that almost everything is 8-pixel aligned */
+static void s3fb_iplan_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
+{
+       u32 fg = expand_color(rect->color);
+       u8 __iomem *dst1;
+       u32 __iomem *dst;
+       int x, y;
+
+       dst1 = info->screen_base + (rect->dy * info->fix.line_length)
+                + ((rect->dx / 8) * 4);
+
+       for (y = 0; y < rect->height; y++) {
+               dst = (u32 __iomem *) dst1;
+               for (x = 0; x < rect->width; x += 8) {
+                       fb_writel(fg, dst++);
+               }
+               dst1 += info->fix.line_length;
+       }
+}
+
+
+/* image data is MSB-first, fb structure is high-nibble-in-low-byte-first */
+static inline u32 expand_pixel(u32 c)
+{
+       return (((c &  1) << 24) | ((c &  2) << 27) | ((c &  4) << 14) | ((c &   8) << 17) |
+               ((c & 16) <<  4) | ((c & 32) <<  7) | ((c & 64) >>  6) | ((c & 128) >>  3)) * 0xF;
+}
+
+/* s3fb_cfb4_imageblit silently assumes that almost everything is 8-pixel aligned */
+static void s3fb_cfb4_imageblit(struct fb_info *info, const struct fb_image *image)
+{
+       u32 fg = image->fg_color * 0x11111111;
+       u32 bg = image->bg_color * 0x11111111;
+       const u8 *src1, *src;
+       u8 __iomem *dst1;
+       u32 __iomem *dst;
+       u32 val;
+       int x, y;
+
+       src1 = image->data;
+       dst1 = info->screen_base + (image->dy * info->fix.line_length)
+                + ((image->dx / 8) * 4);
+
+       for (y = 0; y < image->height; y++) {
+               src = src1;
+               dst = (u32 __iomem *) dst1;
+               for (x = 0; x < image->width; x += 8) {
+                       val = expand_pixel(*(src++));
+                       val = (val & fg) | (~val & bg);
+                       fb_writel(val, dst++);
+               }
+               src1 += image->width / 8;
+               dst1 += info->fix.line_length;
+       }
+}
+
+static void s3fb_imageblit(struct fb_info *info, const struct fb_image *image)
+{
+       if ((info->var.bits_per_pixel == 4) && (image->depth == 1)
+           && ((image->width % 8) == 0) && ((image->dx % 8) == 0)) {
+               if (info->fix.type == FB_TYPE_INTERLEAVED_PLANES)
+                       s3fb_iplan_imageblit(info, image);
+               else
+                       s3fb_cfb4_imageblit(info, image);
+       } else
+               cfb_imageblit(info, image);
+}
+
+static void s3fb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
+{
+       if ((info->var.bits_per_pixel == 4)
+           && ((rect->width % 8) == 0) && ((rect->dx % 8) == 0)
+           && (info->fix.type == FB_TYPE_INTERLEAVED_PLANES))
+               s3fb_iplan_fillrect(info, rect);
+        else
+               cfb_fillrect(info, rect);
+}
+
+
+
+/* ------------------------------------------------------------------------- */
+
+
+static void s3_set_pixclock(struct fb_info *info, u32 pixclock)
+{
+       u16 m, n, r;
+       u8 regval;
+
+       svga_compute_pll(&s3_pll, 1000000000 / pixclock, &m, &n, &r, info->node);
+
+       /* Set VGA misc register  */
+       regval = vga_r(NULL, VGA_MIS_R);
+       vga_w(NULL, VGA_MIS_W, regval | VGA_MIS_ENB_PLL_LOAD);
+
+       /* Set S3 clock registers */
+       vga_wseq(NULL, 0x12, ((n - 2) | (r << 5)));
+       vga_wseq(NULL, 0x13, m - 2);
+
+       udelay(1000);
+
+       /* Activate clock - write 0, 1, 0 to seq/15 bit 5 */
+       regval = vga_rseq (NULL, 0x15); /* | 0x80; */
+       vga_wseq(NULL, 0x15, regval & ~(1<<5));
+       vga_wseq(NULL, 0x15, regval |  (1<<5));
+       vga_wseq(NULL, 0x15, regval & ~(1<<5));
+}
+
+
+/* Open framebuffer */
+
+static int s3fb_open(struct fb_info *info, int user)
+{
+       struct s3fb_info *par = info->par;
+
+       mutex_lock(&(par->open_lock));
+       if (par->ref_count == 0) {
+               memset(&(par->state), 0, sizeof(struct vgastate));
+               par->state.flags = VGA_SAVE_MODE | VGA_SAVE_FONTS | VGA_SAVE_CMAP;
+               par->state.num_crtc = 0x70;
+               par->state.num_seq = 0x20;
+               save_vga(&(par->state));
+       }
+
+       par->ref_count++;
+       mutex_unlock(&(par->open_lock));
+
+       return 0;
+}
+
+/* Close framebuffer */
+
+static int s3fb_release(struct fb_info *info, int user)
+{
+       struct s3fb_info *par = info->par;
+
+       mutex_lock(&(par->open_lock));
+       if (par->ref_count == 0) {
+               mutex_unlock(&(par->open_lock));
+               return -EINVAL;
+       }
+
+       if (par->ref_count == 1)
+               restore_vga(&(par->state));
+
+       par->ref_count--;
+       mutex_unlock(&(par->open_lock));
+
+       return 0;
+}
+
+/* Validate passed in var */
+
+static int s3fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
+{
+       struct s3fb_info *par = info->par;
+       int rv, mem, step;
+
+       /* Find appropriate format */
+       rv = svga_match_format (s3fb_formats, var, NULL);
+       if ((rv < 0) || ((par->chip == CHIP_988_VIRGE_VX) ? (rv == 7) : (rv == 6)))
+       {               /* 24bpp on VIRGE VX, 32bpp on others */
+               printk(KERN_ERR "fb%d: unsupported mode requested\n", info->node);
+               return rv;
+       }
+
+       /* Do not allow to have real resoulution larger than virtual */
+       if (var->xres > var->xres_virtual)
+               var->xres_virtual = var->xres;
+
+       if (var->yres > var->yres_virtual)
+               var->yres_virtual = var->yres;
+
+       /* Round up xres_virtual to have proper alignment of lines */
+       step = s3fb_formats[rv].xresstep - 1;
+       var->xres_virtual = (var->xres_virtual+step) & ~step;
+
+       /* Check whether have enough memory */
+       mem = ((var->bits_per_pixel * var->xres_virtual) >> 3) * var->yres_virtual;
+       if (mem > info->screen_size)
+       {
+               printk(KERN_ERR "fb%d: not enough framebuffer memory (%d kB requested , %d kB available)\n",
+                       info->node, mem >> 10, (unsigned int) (info->screen_size >> 10));
+               return -EINVAL;
+       }
+
+       rv = svga_check_timings (&s3_timing_regs, var, info->node);
+       if (rv < 0)
+       {
+               printk(KERN_ERR "fb%d: invalid timings requested\n", info->node);
+               return rv;
+       }
+
+       return 0;
+}
+
+/* Set video mode from par */
+
+static int s3fb_set_par(struct fb_info *info)
+{
+       struct s3fb_info *par = info->par;
+       u32 value, mode, hmul, offset_value, screen_size, multiplex;
+       u32 bpp = info->var.bits_per_pixel;
+
+       if (bpp != 0) {
+               info->fix.ypanstep = 1;
+               info->fix.line_length = (info->var.xres_virtual * bpp) / 8;
+
+               info->flags &= ~FBINFO_MISC_TILEBLITTING;
+               info->tileops = NULL;
+
+               offset_value = (info->var.xres_virtual * bpp) / 64;
+               screen_size = info->var.yres_virtual * info->fix.line_length;
+       } else {
+               info->fix.ypanstep = 16;
+               info->fix.line_length = 0;
+
+               info->flags |= FBINFO_MISC_TILEBLITTING;
+               info->tileops = fasttext ? &s3fb_fast_tile_ops : &s3fb_tile_ops;
+
+               offset_value = info->var.xres_virtual / 16;
+               screen_size = (info->var.xres_virtual * info->var.yres_virtual) / 64;
+       }
+
+       info->var.xoffset = 0;
+       info->var.yoffset = 0;
+       info->var.activate = FB_ACTIVATE_NOW;
+
+       /* Unlock registers */
+       vga_wcrt(NULL, 0x38, 0x48);
+       vga_wcrt(NULL, 0x39, 0xA5);
+       vga_wseq(NULL, 0x08, 0x06);
+       svga_wcrt_mask(0x11, 0x00, 0x80);
+
+       /* Blank screen and turn off sync */
+       svga_wseq_mask(0x01, 0x20, 0x20);
+       svga_wcrt_mask(0x17, 0x00, 0x80);
+
+       /* Set default values */
+       svga_set_default_gfx_regs();
+       svga_set_default_atc_regs();
+       svga_set_default_seq_regs();
+       svga_set_default_crt_regs();
+       svga_wcrt_multi(s3_line_compare_regs, 0xFFFFFFFF);
+       svga_wcrt_multi(s3_start_address_regs, 0);
+
+       /* S3 specific initialization */
+       svga_wcrt_mask(0x58, 0x10, 0x10); /* enable linear framebuffer */
+       svga_wcrt_mask(0x31, 0x08, 0x08); /* enable sequencer access to framebuffer above 256 kB */
+
+/*     svga_wcrt_mask(0x33, 0x08, 0x08); */ /* DDR ?   */
+/*     svga_wcrt_mask(0x43, 0x01, 0x01); */ /* DDR ?   */
+       svga_wcrt_mask(0x33, 0x00, 0x08); /* no DDR ?   */
+       svga_wcrt_mask(0x43, 0x00, 0x01); /* no DDR ?   */
+
+       svga_wcrt_mask(0x5D, 0x00, 0x28); // Clear strange HSlen bits
+
+/*     svga_wcrt_mask(0x58, 0x03, 0x03); */
+
+/*     svga_wcrt_mask(0x53, 0x12, 0x13); */ /* enable MMIO */
+/*     svga_wcrt_mask(0x40, 0x08, 0x08); */ /* enable write buffer */
+
+
+       /* Set the offset register */
+       pr_debug("fb%d: offset register       : %d\n", info->node, offset_value);
+       svga_wcrt_multi(s3_offset_regs, offset_value);
+
+       vga_wcrt(NULL, 0x54, 0x18); /* M parameter */
+       vga_wcrt(NULL, 0x60, 0xff); /* N parameter */
+       vga_wcrt(NULL, 0x61, 0xff); /* L parameter */
+       vga_wcrt(NULL, 0x62, 0xff); /* L parameter */
+
+       vga_wcrt(NULL, 0x3A, 0x35);
+       svga_wattr(0x33, 0x00);
+
+       if (info->var.vmode & FB_VMODE_DOUBLE)
+               svga_wcrt_mask(0x09, 0x80, 0x80);
+       else
+               svga_wcrt_mask(0x09, 0x00, 0x80);
+
+       if (info->var.vmode & FB_VMODE_INTERLACED)
+               svga_wcrt_mask(0x42, 0x20, 0x20);
+       else
+               svga_wcrt_mask(0x42, 0x00, 0x20);
+
+       /* Disable hardware graphics cursor */
+       svga_wcrt_mask(0x45, 0x00, 0x01);
+       /* Disable Streams engine */
+       svga_wcrt_mask(0x67, 0x00, 0x0C);
+
+       mode = svga_match_format(s3fb_formats, &(info->var), &(info->fix));
+
+       /* S3 virge DX hack */
+       if (par->chip == CHIP_375_VIRGE_DX) {
+               vga_wcrt(NULL, 0x86, 0x80);
+               vga_wcrt(NULL, 0x90, 0x00);
+       }
+
+       /* S3 virge VX hack */
+       if (par->chip == CHIP_988_VIRGE_VX) {
+               vga_wcrt(NULL, 0x50, 0x00);
+               vga_wcrt(NULL, 0x67, 0x50);
+
+               vga_wcrt(NULL, 0x63, (mode <= 2) ? 0x90 : 0x09);
+               vga_wcrt(NULL, 0x66, 0x90);
+       }
+
+       svga_wcrt_mask(0x31, 0x00, 0x40);
+       multiplex = 0;
+       hmul = 1;
+
+       /* Set mode-specific register values */
+       switch (mode) {
+       case 0:
+               pr_debug("fb%d: text mode\n", info->node);
+               svga_set_textmode_vga_regs();
+
+               /* Set additional registers like in 8-bit mode */
+               svga_wcrt_mask(0x50, 0x00, 0x30);
+               svga_wcrt_mask(0x67, 0x00, 0xF0);
+
+               /* Disable enhanced mode */
+               svga_wcrt_mask(0x3A, 0x00, 0x30);
+
+               if (fasttext) {
+                       pr_debug("fb%d: high speed text mode set\n", info->node);
+                       svga_wcrt_mask(0x31, 0x40, 0x40);
+               }
+               break;
+       case 1:
+               pr_debug("fb%d: 4 bit pseudocolor\n", info->node);
+               vga_wgfx(NULL, VGA_GFX_MODE, 0x40);
+
+               /* Set additional registers like in 8-bit mode */
+               svga_wcrt_mask(0x50, 0x00, 0x30);
+               svga_wcrt_mask(0x67, 0x00, 0xF0);
+
+               /* disable enhanced mode */
+               svga_wcrt_mask(0x3A, 0x00, 0x30);
+               break;
+       case 2:
+               pr_debug("fb%d: 4 bit pseudocolor, planar\n", info->node);
+
+               /* Set additional registers like in 8-bit mode */
+               svga_wcrt_mask(0x50, 0x00, 0x30);
+               svga_wcrt_mask(0x67, 0x00, 0xF0);
+
+               /* disable enhanced mode */
+               svga_wcrt_mask(0x3A, 0x00, 0x30);
+               break;
+       case 3:
+               pr_debug("fb%d: 8 bit pseudocolor\n", info->node);
+               if (info->var.pixclock > 20000) {
+                       svga_wcrt_mask(0x50, 0x00, 0x30);
+                       svga_wcrt_mask(0x67, 0x00, 0xF0);
+               } else {
+                       svga_wcrt_mask(0x50, 0x00, 0x30);
+                       svga_wcrt_mask(0x67, 0x10, 0xF0);
+                       multiplex = 1;
+               }
+               break;
+       case 4:
+               pr_debug("fb%d: 5/5/5 truecolor\n", info->node);
+               if (par->chip == CHIP_988_VIRGE_VX) {
+                       if (info->var.pixclock > 20000)
+                               svga_wcrt_mask(0x67, 0x20, 0xF0);
+                       else
+                               svga_wcrt_mask(0x67, 0x30, 0xF0);
+               } else {
+                       svga_wcrt_mask(0x50, 0x10, 0x30);
+                       svga_wcrt_mask(0x67, 0x30, 0xF0);
+                       hmul = 2;
+               }
+               break;
+       case 5:
+               pr_debug("fb%d: 5/6/5 truecolor\n", info->node);
+               if (par->chip == CHIP_988_VIRGE_VX) {
+                       if (info->var.pixclock > 20000)
+                               svga_wcrt_mask(0x67, 0x40, 0xF0);
+                       else
+                               svga_wcrt_mask(0x67, 0x50, 0xF0);
+               } else {
+                       svga_wcrt_mask(0x50, 0x10, 0x30);
+                       svga_wcrt_mask(0x67, 0x50, 0xF0);
+                       hmul = 2;
+               }
+               break;
+       case 6:
+               /* VIRGE VX case */
+               pr_debug("fb%d: 8/8/8 truecolor\n", info->node);
+               svga_wcrt_mask(0x67, 0xD0, 0xF0);
+               break;
+       case 7:
+               pr_debug("fb%d: 8/8/8/8 truecolor\n", info->node);
+               svga_wcrt_mask(0x50, 0x30, 0x30);
+               svga_wcrt_mask(0x67, 0xD0, 0xF0);
+               break;
+       default:
+               printk(KERN_ERR "fb%d: unsupported mode - bug\n", info->node);
+               return -EINVAL;
+       }
+
+       if (par->chip != CHIP_988_VIRGE_VX) {
+               svga_wseq_mask(0x15, multiplex ? 0x10 : 0x00, 0x10);
+               svga_wseq_mask(0x18, multiplex ? 0x80 : 0x00, 0x80);
+       }
+
+       s3_set_pixclock(info, info->var.pixclock);
+       svga_set_timings(&s3_timing_regs, &(info->var), hmul, 1,
+                        (info->var.vmode & FB_VMODE_DOUBLE)     ? 2 : 1,
+                        (info->var.vmode & FB_VMODE_INTERLACED) ? 2 : 1,
+                        hmul, info->node);
+
+       /* Set interlaced mode start/end register */
+       value = info->var.xres + info->var.left_margin + info->var.right_margin + info->var.hsync_len;
+       value = ((value * hmul) / 8) - 5;
+       vga_wcrt(NULL, 0x3C, (value + 1) / 2);
+
+       memset((u8*)info->screen_base, 0x00, screen_size);
+       /* Device and screen back on */
+       svga_wcrt_mask(0x17, 0x80, 0x80);
+       svga_wseq_mask(0x01, 0x00, 0x20);
+
+       return 0;
+}
+
+/* Set a colour register */
+
+static int s3fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
+                               u_int transp, struct fb_info *fb)
+{
+       switch (fb->var.bits_per_pixel) {
+       case 0:
+       case 4:
+               if (regno >= 16)
+                       return -EINVAL;
+
+               if ((fb->var.bits_per_pixel == 4) &&
+                   (fb->var.nonstd == 0)) {
+                       outb(0xF0, VGA_PEL_MSK);
+                       outb(regno*16, VGA_PEL_IW);
+               } else {
+                       outb(0x0F, VGA_PEL_MSK);
+                       outb(regno, VGA_PEL_IW);
+               }
+               outb(red >> 10, VGA_PEL_D);
+               outb(green >> 10, VGA_PEL_D);
+               outb(blue >> 10, VGA_PEL_D);
+               break;
+       case 8:
+               if (regno >= 256)
+                       return -EINVAL;
+
+               outb(0xFF, VGA_PEL_MSK);
+               outb(regno, VGA_PEL_IW);
+               outb(red >> 10, VGA_PEL_D);
+               outb(green >> 10, VGA_PEL_D);
+               outb(blue >> 10, VGA_PEL_D);
+               break;
+       case 16:
+               if (regno >= 16)
+                       return -EINVAL;
+
+               if (fb->var.green.length == 5)
+                       ((u32*)fb->pseudo_palette)[regno] = ((red & 0xF800) >> 1) |
+                               ((green & 0xF800) >> 6) | ((blue & 0xF800) >> 11);
+               else if (fb->var.green.length == 6)
+                       ((u32*)fb->pseudo_palette)[regno] = (red & 0xF800) |
+                               ((green & 0xFC00) >> 5) | ((blue & 0xF800) >> 11);
+               else return -EINVAL;
+               break;
+       case 24:
+       case 32:
+               if (regno >= 16)
+                       return -EINVAL;
+
+               ((u32*)fb->pseudo_palette)[regno] = ((transp & 0xFF00) << 16) | ((red & 0xFF00) << 8) |
+                       (green & 0xFF00) | ((blue & 0xFF00) >> 8);
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
+
+/* Set the display blanking state */
+
+static int s3fb_blank(int blank_mode, struct fb_info *info)
+{
+       switch (blank_mode) {
+       case FB_BLANK_UNBLANK:
+               pr_debug("fb%d: unblank\n", info->node);
+               svga_wcrt_mask(0x56, 0x00, 0x06);
+               svga_wseq_mask(0x01, 0x00, 0x20);
+               break;
+       case FB_BLANK_NORMAL:
+               pr_debug("fb%d: blank\n", info->node);
+               svga_wcrt_mask(0x56, 0x00, 0x06);
+               svga_wseq_mask(0x01, 0x20, 0x20);
+               break;
+       case FB_BLANK_HSYNC_SUSPEND:
+               pr_debug("fb%d: hsync\n", info->node);
+               svga_wcrt_mask(0x56, 0x02, 0x06);
+               svga_wseq_mask(0x01, 0x20, 0x20);
+               break;
+       case FB_BLANK_VSYNC_SUSPEND:
+               pr_debug("fb%d: vsync\n", info->node);
+               svga_wcrt_mask(0x56, 0x04, 0x06);
+               svga_wseq_mask(0x01, 0x20, 0x20);
+               break;
+       case FB_BLANK_POWERDOWN:
+               pr_debug("fb%d: sync down\n", info->node);
+               svga_wcrt_mask(0x56, 0x06, 0x06);
+               svga_wseq_mask(0x01, 0x20, 0x20);
+               break;
+       }
+
+       return 0;
+}
+
+
+/* Pan the display */
+
+static int s3fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) {
+
+       unsigned int offset;
+
+       /* Validate the offsets */
+       if ((var->xoffset + var->xres) > var->xres_virtual)
+               return -EINVAL;
+       if ((var->yoffset + var->yres) > var->yres_virtual)
+               return -EINVAL;
+
+       /* Calculate the offset */
+       if (var->bits_per_pixel == 0) {
+               offset = (var->yoffset / 16) * (var->xres_virtual / 2) + (var->xoffset / 2);
+               offset = offset >> 2;
+       } else {
+               offset = (var->yoffset * info->fix.line_length) +
+                        (var->xoffset * var->bits_per_pixel / 8);
+               offset = offset >> 2;
+       }
+
+       /* Set the offset */
+       svga_wcrt_multi(s3_start_address_regs, offset);
+
+       return 0;
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Frame buffer operations */
+
+static struct fb_ops s3fb_ops = {
+       .owner          = THIS_MODULE,
+       .fb_open        = s3fb_open,
+       .fb_release     = s3fb_release,
+       .fb_check_var   = s3fb_check_var,
+       .fb_set_par     = s3fb_set_par,
+       .fb_setcolreg   = s3fb_setcolreg,
+       .fb_blank       = s3fb_blank,
+       .fb_pan_display = s3fb_pan_display,
+       .fb_fillrect    = s3fb_fillrect,
+       .fb_copyarea    = cfb_copyarea,
+       .fb_imageblit   = s3fb_imageblit,
+};
+
+/* ------------------------------------------------------------------------- */
+
+static int __devinit s3_identification(int chip)
+{
+       if (chip == CHIP_XXX_TRIO) {
+               u8 cr30 = vga_rcrt(NULL, 0x30);
+               u8 cr2e = vga_rcrt(NULL, 0x2e);
+               u8 cr2f = vga_rcrt(NULL, 0x2f);
+
+               if ((cr30 == 0xE0) || (cr30 == 0xE1)) {
+                       if (cr2e == 0x10)
+                               return CHIP_732_TRIO32;
+                       if (cr2e == 0x11) {
+                               if (! (cr2f & 0x40))
+                                       return CHIP_764_TRIO64;
+                               else
+                                       return CHIP_765_TRIO64VP;
+                       }
+               }
+       }
+
+       if (chip == CHIP_XXX_TRIO64V2_DXGX) {
+               u8 cr6f = vga_rcrt(NULL, 0x6f);
+
+               if (! (cr6f & 0x01))
+                       return CHIP_775_TRIO64V2_DX;
+               else
+                       return CHIP_785_TRIO64V2_GX;
+       }
+
+       if (chip == CHIP_XXX_VIRGE_DXGX) {
+               u8 cr6f = vga_rcrt(NULL, 0x6f);
+
+               if (! (cr6f & 0x01))
+                       return CHIP_375_VIRGE_DX;
+               else
+                       return CHIP_385_VIRGE_GX;
+       }
+
+       return CHIP_UNKNOWN;
+}
+
+
+/* PCI probe */
+
+static int __devinit s3_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
+{
+       struct fb_info *info;
+       struct s3fb_info *par;
+       int rc;
+       u8 regval, cr38, cr39;
+
+       /* Ignore secondary VGA device because there is no VGA arbitration */
+       if (! svga_primary_device(dev)) {
+               dev_info(&(dev->dev), "ignoring secondary device\n");
+               return -ENODEV;
+       }
+
+       /* Allocate and fill driver data structure */
+       info = framebuffer_alloc(sizeof(struct s3fb_info), NULL);
+       if (!info) {
+               dev_err(&(dev->dev), "cannot allocate memory\n");
+               return -ENOMEM;
+       }
+
+       par = info->par;
+       mutex_init(&par->open_lock);
+
+       info->flags = FBINFO_PARTIAL_PAN_OK | FBINFO_HWACCEL_YPAN;
+       info->fbops = &s3fb_ops;
+
+       /* Prepare PCI device */
+       rc = pci_enable_device(dev);
+       if (rc < 0) {
+               dev_err(&(dev->dev), "cannot enable PCI device\n");
+               goto err_enable_device;
+       }
+
+       rc = pci_request_regions(dev, "s3fb");
+       if (rc < 0) {
+               dev_err(&(dev->dev), "cannot reserve framebuffer region\n");
+               goto err_request_regions;
+       }
+
+
+       info->fix.smem_start = pci_resource_start(dev, 0);
+       info->fix.smem_len = pci_resource_len(dev, 0);
+
+       /* Map physical IO memory address into kernel space */
+       info->screen_base = pci_iomap(dev, 0, 0);
+       if (! info->screen_base) {
+               rc = -ENOMEM;
+               dev_err(&(dev->dev), "iomap for framebuffer failed\n");
+               goto err_iomap;
+       }
+
+       /* Unlock regs */
+       cr38 = vga_rcrt(NULL, 0x38);
+       cr39 = vga_rcrt(NULL, 0x39);
+       vga_wseq(NULL, 0x08, 0x06);
+       vga_wcrt(NULL, 0x38, 0x48);
+       vga_wcrt(NULL, 0x39, 0xA5);
+
+       /* Find how many physical memory there is on card */
+       /* 0x36 register is accessible even if other registers are locked */
+       regval = vga_rcrt(NULL, 0x36);
+       info->screen_size = s3_memsizes[regval >> 5] << 10;
+       info->fix.smem_len = info->screen_size;
+
+       par->chip = id->driver_data & CHIP_MASK;
+       par->rev = vga_rcrt(NULL, 0x2f);
+       if (par->chip & CHIP_UNDECIDED_FLAG)
+               par->chip = s3_identification(par->chip);
+
+       /* Find MCLK frequency */
+       regval = vga_rseq(NULL, 0x10);
+       par->mclk_freq = ((vga_rseq(NULL, 0x11) + 2) * 14318) / ((regval & 0x1F)  + 2);
+       par->mclk_freq = par->mclk_freq >> (regval >> 5);
+
+       /* Restore locks */
+       vga_wcrt(NULL, 0x38, cr38);
+       vga_wcrt(NULL, 0x39, cr39);
+
+       strcpy(info->fix.id, s3_names [par->chip]);
+       info->fix.mmio_start = 0;
+       info->fix.mmio_len = 0;
+       info->fix.type = FB_TYPE_PACKED_PIXELS;
+       info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
+       info->fix.ypanstep = 0;
+       info->fix.accel = FB_ACCEL_NONE;
+       info->pseudo_palette = (void*) (par->pseudo_palette);
+
+       /* Prepare startup mode */
+       rc = fb_find_mode(&(info->var), info, mode, NULL, 0, NULL, 8);
+       if (! ((rc == 1) || (rc == 2))) {
+               rc = -EINVAL;
+               dev_err(&(dev->dev), "mode %s not found\n", mode);
+               goto err_find_mode;
+       }
+
+       rc = fb_alloc_cmap(&info->cmap, 256, 0);
+       if (rc < 0) {
+               dev_err(&(dev->dev), "cannot allocate colormap\n");
+               goto err_alloc_cmap;
+       }
+
+       rc = register_framebuffer(info);
+       if (rc < 0) {
+               dev_err(&(dev->dev), "cannot register framebuffer\n");
+               goto err_reg_fb;
+       }
+
+       printk(KERN_INFO "fb%d: %s on %s, %d MB RAM, %d MHz MCLK\n", info->node, info->fix.id,
+                pci_name(dev), info->fix.smem_len >> 20, (par->mclk_freq + 500) / 1000);
+
+       if (par->chip == CHIP_UNKNOWN)
+               printk(KERN_INFO "fb%d: unknown chip, CR2D=%x, CR2E=%x, CRT2F=%x, CRT30=%x\n",
+                       info->node, vga_rcrt(NULL, 0x2d), vga_rcrt(NULL, 0x2e),
+                       vga_rcrt(NULL, 0x2f), vga_rcrt(NULL, 0x30));
+
+       /* Record a reference to the driver data */
+       pci_set_drvdata(dev, info);
+
+#ifdef CONFIG_MTRR
+       if (mtrr) {
+               par->mtrr_reg = -1;
+               par->mtrr_reg = mtrr_add(info->fix.smem_start, info->fix.smem_len, MTRR_TYPE_WRCOMB, 1);
+       }
+#endif
+
+       return 0;
+
+       /* Error handling */
+err_reg_fb:
+       fb_dealloc_cmap(&info->cmap);
+err_alloc_cmap:
+err_find_mode:
+       pci_iounmap(dev, info->screen_base);
+err_iomap:
+       pci_release_regions(dev);
+err_request_regions:
+/*     pci_disable_device(dev); */
+err_enable_device:
+       framebuffer_release(info);
+       return rc;
+}
+
+
+/* PCI remove */
+
+static void __devexit s3_pci_remove(struct pci_dev *dev)
+{
+       struct fb_info *info = pci_get_drvdata(dev);
+       struct s3fb_info *par = info->par;
+
+       if (info) {
+
+#ifdef CONFIG_MTRR
+               if (par->mtrr_reg >= 0) {
+                       mtrr_del(par->mtrr_reg, 0, 0);
+                       par->mtrr_reg = -1;
+               }
+#endif
+
+               unregister_framebuffer(info);
+               fb_dealloc_cmap(&info->cmap);
+
+               pci_iounmap(dev, info->screen_base);
+               pci_release_regions(dev);
+/*             pci_disable_device(dev); */
+
+               pci_set_drvdata(dev, NULL);
+               framebuffer_release(info);
+       }
+}
+
+/* PCI suspend */
+
+static int s3_pci_suspend(struct pci_dev* dev, pm_message_t state)
+{
+       struct fb_info *info = pci_get_drvdata(dev);
+       struct s3fb_info *par = info->par;
+
+       dev_info(&(dev->dev), "suspend\n");
+
+       acquire_console_sem();
+       mutex_lock(&(par->open_lock));
+
+       if ((state.event == PM_EVENT_FREEZE) || (par->ref_count == 0)) {
+               mutex_unlock(&(par->open_lock));
+               release_console_sem();
+               return 0;
+       }
+
+       fb_set_suspend(info, 1);
+
+       pci_save_state(dev);
+       pci_disable_device(dev);
+       pci_set_power_state(dev, pci_choose_state(dev, state));
+
+       mutex_unlock(&(par->open_lock));
+       release_console_sem();
+
+       return 0;
+}
+
+
+/* PCI resume */
+
+static int s3_pci_resume(struct pci_dev* dev)
+{
+       struct fb_info *info = pci_get_drvdata(dev);
+       struct s3fb_info *par = info->par;
+
+       dev_info(&(dev->dev), "resume\n");
+
+       acquire_console_sem();
+       mutex_lock(&(par->open_lock));
+
+       if (par->ref_count == 0) {
+               mutex_unlock(&(par->open_lock));
+               release_console_sem();
+               return 0;
+       }
+
+       pci_set_power_state(dev, PCI_D0);
+       pci_restore_state(dev);
+       pci_enable_device(dev);
+       pci_set_master(dev);
+
+       s3fb_set_par(info);
+       fb_set_suspend(info, 0);
+
+       mutex_unlock(&(par->open_lock));
+       release_console_sem();
+
+       return 0;
+}
+
+
+/* List of boards that we are trying to support */
+
+static struct pci_device_id s3_devices[] __devinitdata = {
+       {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8810), .driver_data = CHIP_XXX_TRIO},
+       {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8811), .driver_data = CHIP_XXX_TRIO},
+       {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8812), .driver_data = CHIP_M65_AURORA64VP},
+       {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8814), .driver_data = CHIP_767_TRIO64UVP},
+       {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8901), .driver_data = CHIP_XXX_TRIO64V2_DXGX},
+       {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8902), .driver_data = CHIP_551_PLATO_PX},
+
+       {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x5631), .driver_data = CHIP_325_VIRGE},
+       {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x883D), .driver_data = CHIP_988_VIRGE_VX},
+       {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A01), .driver_data = CHIP_XXX_VIRGE_DXGX},
+       {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A10), .driver_data = CHIP_356_VIRGE_GX2},
+       {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A11), .driver_data = CHIP_357_VIRGE_GX2P},
+       {PCI_DEVICE(PCI_VENDOR_ID_S3, 0x8A12), .driver_data = CHIP_359_VIRGE_GX2P},
+
+       {0, 0, 0, 0, 0, 0, 0}
+};
+
+
+MODULE_DEVICE_TABLE(pci, s3_devices);
+
+static struct pci_driver s3fb_pci_driver = {
+       .name           = "s3fb",
+       .id_table       = s3_devices,
+       .probe          = s3_pci_probe,
+       .remove         = __devexit_p(s3_pci_remove),
+       .suspend        = s3_pci_suspend,
+       .resume         = s3_pci_resume,
+};
+
+/* Parse user speficied options */
+
+#ifndef MODULE
+static int  __init s3fb_setup(char *options)
+{
+       char *opt;
+
+       if (!options || !*options)
+               return 0;
+
+       while ((opt = strsep(&options, ",")) != NULL) {
+
+               if (!*opt)
+                       continue;
+#ifdef CONFIG_MTRR
+               else if (!strcmp(opt, "mtrr:"))
+                       mtrr = simple_strtoul(opt + 5, NULL, 0);
+#endif
+               else if (!strcmp(opt, "fasttext:"))
+                       mtrr = simple_strtoul(opt + 9, NULL, 0);
+               else
+                       mode = opt;
+       }
+
+       return 0;
+}
+#endif
+
+/* Cleanup */
+
+static void __exit s3fb_cleanup(void)
+{
+       pr_debug("s3fb: cleaning up\n");
+       pci_unregister_driver(&s3fb_pci_driver);
+}
+
+/* Driver Initialisation */
+
+static int __init s3fb_init(void)
+{
+
+#ifndef MODULE
+       char *option = NULL;
+
+       if (fb_get_options("s3fb", &option))
+               return -ENODEV;
+       s3fb_setup(option);
+#endif
+
+       pr_debug("s3fb: initializing\n");
+       return pci_register_driver(&s3fb_pci_driver);
+}
+
+/* ------------------------------------------------------------------------- */
+
+/* Modularization */
+
+module_init(s3fb_init);
+module_exit(s3fb_cleanup);
index 0b07f6ae3367c286611695c9c7950c9afd2f0d56..48066ef3af05fa2356171a76932e8252b62b05e5 100644 (file)
@@ -110,9 +110,7 @@ struct sa1100fb_info {
 #endif
 };
 
-#define __type_entry(ptr,type,member) ((type *)((char *)(ptr)-offsetof(type,member)))
-
-#define TO_INF(ptr,member)     __type_entry(ptr,struct sa1100fb_info,member)
+#define TO_INF(ptr,member)     container_of(ptr,struct sa1100fb_info,member)
 
 #define SA1100_PALETTE_MODE_VAL(bpp)    (((bpp) & 0x018) << 9)
 
index 1411f3b6a0099871f589554793a483daa27614eb..8db066ccca6b8ccd314120851f5e9245246199da 100644 (file)
@@ -12,7 +12,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/pci.h>
 #include <linux/fb.h>
index 82b3deaae02de532ba7ee3e34f21e47392d5a585..4afa30522fdbb4c375b37057a77b3a04d1bf3097 100644 (file)
@@ -833,7 +833,8 @@ static void savage_set_default_par(struct savagefb_par *par,
        vga_out8(0x3d5, cr66, par);
 }
 
-static void savage_update_var(struct fb_var_screeninfo *var, struct fb_videomode *modedb)
+static void savage_update_var(struct fb_var_screeninfo *var,
+                             const struct fb_videomode *modedb)
 {
        var->xres = var->xres_virtual = modedb->xres;
        var->yres = modedb->yres;
@@ -902,7 +903,7 @@ static int savagefb_check_var(struct fb_var_screeninfo   *var,
        }
 
        if (!mode_valid) {
-               struct fb_videomode *mode;
+               const struct fb_videomode *mode;
 
                mode = fb_find_best_mode(var, &info->modelist);
                if (mode) {
@@ -2206,11 +2207,10 @@ static int __devinit savagefb_probe(struct pci_dev* dev,
                             info->monspecs.modedb, info->monspecs.modedb_len,
                             NULL, 8);
        } else if (info->monspecs.modedb != NULL) {
-               struct fb_videomode *modedb;
+               const struct fb_videomode *mode;
 
-               modedb = fb_find_best_display(&info->monspecs,
-                                             &info->modelist);
-               savage_update_var(&info->var, modedb);
+               mode = fb_find_best_display(&info->monspecs, &info->modelist);
+               savage_update_var(&info->var, mode);
        }
 
        /* maximize virtual vertical length */
index 2ab3868efde30dd39449e103117324eb461d6453..c311ad3c3687c739a558fc9baea8d9393aef756a 100644 (file)
@@ -317,23 +317,23 @@ InitTo310Pointer(struct SiS_Private *SiS_Pr)
 }
 #endif
 
-BOOLEAN
+bool
 SiSInitPtr(struct SiS_Private *SiS_Pr)
 {
    if(SiS_Pr->ChipType < SIS_315H) {
 #ifdef SIS300
       InitTo300Pointer(SiS_Pr);
 #else
-      return FALSE;
+      return false;
 #endif
    } else {
 #ifdef SIS315H
       InitTo310Pointer(SiS_Pr);
 #else
-      return FALSE;
+      return false;
 #endif
    }
-   return TRUE;
+   return true;
 }
 
 /*********************************************/
@@ -345,7 +345,7 @@ static
 #endif
 unsigned short
 SiS_GetModeID(int VGAEngine, unsigned int VBFlags, int HDisplay, int VDisplay,
-               int Depth, BOOLEAN FSTN, int LCDwidth, int LCDheight)
+               int Depth, bool FSTN, int LCDwidth, int LCDheight)
 {
    unsigned short ModeIndex = 0;
 
@@ -483,7 +483,7 @@ SiS_GetModeID(int VGAEngine, unsigned int VBFlags, int HDisplay, int VDisplay,
 
 unsigned short
 SiS_GetModeID_LCD(int VGAEngine, unsigned int VBFlags, int HDisplay, int VDisplay,
-               int Depth, BOOLEAN FSTN, unsigned short CustomT, int LCDwidth, int LCDheight,
+               int Depth, bool FSTN, unsigned short CustomT, int LCDwidth, int LCDheight,
                unsigned int VBFlags2)
 {
    unsigned short ModeIndex = 0;
@@ -873,7 +873,7 @@ SiS_GetModeID_VGA2(int VGAEngine, unsigned int VBFlags, int HDisplay, int VDispl
                break;
    }
 
-   return SiS_GetModeID(VGAEngine, 0, HDisplay, VDisplay, Depth, FALSE, 0, 0);
+   return SiS_GetModeID(VGAEngine, 0, HDisplay, VDisplay, Depth, false, 0, 0);
 }
 
 
@@ -1020,12 +1020,12 @@ SiS_GetSysFlags(struct SiS_Private *SiS_Pr)
 
    /* 661 and newer: NEVER write non-zero to SR11[7:4] */
    /* (SR11 is used for DDC and in enable/disablebridge) */
-   SiS_Pr->SiS_SensibleSR11 = FALSE;
+   SiS_Pr->SiS_SensibleSR11 = false;
    SiS_Pr->SiS_MyCR63 = 0x63;
    if(SiS_Pr->ChipType >= SIS_330) {
       SiS_Pr->SiS_MyCR63 = 0x53;
       if(SiS_Pr->ChipType >= SIS_661) {
-         SiS_Pr->SiS_SensibleSR11 = TRUE;
+         SiS_Pr->SiS_SensibleSR11 = true;
       }
    }
 
@@ -1253,7 +1253,7 @@ SiS_GetModeFlag(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
 /*        HELPER: Determine ROM usage        */
 /*********************************************/
 
-BOOLEAN
+bool
 SiSDetermineROMLayout661(struct SiS_Private *SiS_Pr)
 {
    unsigned char  *ROMAddr  = SiS_Pr->VirtualRomBase;
@@ -1261,16 +1261,16 @@ SiSDetermineROMLayout661(struct SiS_Private *SiS_Pr)
 
    if(SiS_Pr->ChipType >= XGI_20) {
       /* XGI ROMs don't qualify */
-      return FALSE;
+      return false;
    } else if(SiS_Pr->ChipType >= SIS_761) {
       /* I very much assume 761, 340 and newer will use new layout */
-      return TRUE;
+      return true;
    } else if(SiS_Pr->ChipType >= SIS_661) {
       if((ROMAddr[0x1a] == 'N') &&
         (ROMAddr[0x1b] == 'e') &&
         (ROMAddr[0x1c] == 'w') &&
         (ROMAddr[0x1d] == 'V')) {
-        return TRUE;
+        return true;
       }
       romversoffs = ROMAddr[0x16] | (ROMAddr[0x17] << 8);
       if(romversoffs) {
@@ -1280,17 +1280,17 @@ SiSDetermineROMLayout661(struct SiS_Private *SiS_Pr)
         }
       }
       if((romvmaj != 0) || (romvmin >= 92)) {
-        return TRUE;
+        return true;
       }
    } else if(IS_SIS650740) {
       if((ROMAddr[0x1a] == 'N') &&
         (ROMAddr[0x1b] == 'e') &&
         (ROMAddr[0x1c] == 'w') &&
         (ROMAddr[0x1d] == 'V')) {
-        return TRUE;
+        return true;
       }
    }
-   return FALSE;
+   return false;
 }
 
 static void
@@ -1299,8 +1299,8 @@ SiSDetermineROMUsage(struct SiS_Private *SiS_Pr)
    unsigned char  *ROMAddr  = SiS_Pr->VirtualRomBase;
    unsigned short romptr = 0;
 
-   SiS_Pr->SiS_UseROM = FALSE;
-   SiS_Pr->SiS_ROMNew = FALSE;
+   SiS_Pr->SiS_UseROM = false;
+   SiS_Pr->SiS_ROMNew = false;
    SiS_Pr->SiS_PWDOffset = 0;
 
    if(SiS_Pr->ChipType >= XGI_20) return;
@@ -1312,15 +1312,15 @@ SiSDetermineROMUsage(struct SiS_Private *SiS_Pr)
          * of the BIOS image.
          */
         if((ROMAddr[3] == 0xe9) && ((ROMAddr[5] << 8) | ROMAddr[4]) > 0x21a)
-           SiS_Pr->SiS_UseROM = TRUE;
+           SiS_Pr->SiS_UseROM = true;
       } else if(SiS_Pr->ChipType < SIS_315H) {
         /* Sony's VAIO BIOS 1.09 follows the standard, so perhaps
          * the others do as well
          */
-        SiS_Pr->SiS_UseROM = TRUE;
+        SiS_Pr->SiS_UseROM = true;
       } else {
         /* 315/330 series stick to the standard(s) */
-        SiS_Pr->SiS_UseROM = TRUE;
+        SiS_Pr->SiS_UseROM = true;
         if((SiS_Pr->SiS_ROMNew = SiSDetermineROMLayout661(SiS_Pr))) {
            SiS_Pr->SiS_EMIOffset = 14;
            SiS_Pr->SiS_PWDOffset = 17;
@@ -1488,7 +1488,7 @@ SiS_GetVBType(struct SiS_Private *SiS_Pr)
 /*********************************************/
 
 #ifdef SIS_LINUX_KERNEL
-static BOOLEAN
+static bool
 SiS_CheckMemorySize(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
                unsigned short ModeIdIndex)
 {
@@ -1496,10 +1496,10 @@ SiS_CheckMemorySize(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
    unsigned short modeflag = SiS_GetModeFlag(SiS_Pr, ModeNo, ModeIdIndex);
    unsigned short memorysize = ((modeflag & MemoryInfoFlag) >> MemorySizeShift) + 1;
 
-   if(!AdapterMemSize) return TRUE;
+   if(!AdapterMemSize) return true;
 
-   if(AdapterMemSize < memorysize) return FALSE;
-   return TRUE;
+   if(AdapterMemSize < memorysize) return false;
+   return true;
 }
 #endif
 
@@ -1605,7 +1605,7 @@ SiS_ClearBuffer(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
 /*           HELPER: SearchModeID            */
 /*********************************************/
 
-BOOLEAN
+bool
 SiS_SearchModeID(struct SiS_Private *SiS_Pr, unsigned short *ModeNo,
                unsigned short *ModeIdIndex)
 {
@@ -1617,7 +1617,7 @@ SiS_SearchModeID(struct SiS_Private *SiS_Pr, unsigned short *ModeNo,
 
       for((*ModeIdIndex) = 0; ;(*ModeIdIndex)++) {
         if(SiS_Pr->SiS_SModeIDTable[(*ModeIdIndex)].St_ModeID == (*ModeNo)) break;
-        if(SiS_Pr->SiS_SModeIDTable[(*ModeIdIndex)].St_ModeID == 0xFF) return FALSE;
+        if(SiS_Pr->SiS_SModeIDTable[(*ModeIdIndex)].St_ModeID == 0xFF) return false;
       }
 
       if((*ModeNo) == 0x07) {
@@ -1635,11 +1635,11 @@ SiS_SearchModeID(struct SiS_Private *SiS_Pr, unsigned short *ModeNo,
 
       for((*ModeIdIndex) = 0; ;(*ModeIdIndex)++) {
         if(SiS_Pr->SiS_EModeIDTable[(*ModeIdIndex)].Ext_ModeID == (*ModeNo)) break;
-        if(SiS_Pr->SiS_EModeIDTable[(*ModeIdIndex)].Ext_ModeID == 0xFF) return FALSE;
+        if(SiS_Pr->SiS_EModeIDTable[(*ModeIdIndex)].Ext_ModeID == 0xFF) return false;
       }
 
    }
-   return TRUE;
+   return true;
 }
 
 /*********************************************/
@@ -1696,13 +1696,13 @@ SiS_GetRefCRT1CRTC(struct SiS_Private *SiS_Pr, unsigned short Index, int UseWide
 /*           HELPER: LowModeTests            */
 /*********************************************/
 
-static BOOLEAN
+static bool
 SiS_DoLowModeTest(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
 {
    unsigned short temp, temp1, temp2;
 
    if((ModeNo != 0x03) && (ModeNo != 0x10) && (ModeNo != 0x12))
-      return TRUE;
+      return true;
    temp = SiS_GetReg(SiS_Pr->SiS_P3d4,0x11);
    SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x11,0x80);
    temp1 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x00);
@@ -1712,13 +1712,13 @@ SiS_DoLowModeTest(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
    SiS_SetReg(SiS_Pr->SiS_P3d4,0x11,temp);
    if((SiS_Pr->ChipType >= SIS_315H) ||
       (SiS_Pr->ChipType == SIS_300)) {
-      if(temp2 == 0x55) return FALSE;
-      else return TRUE;
+      if(temp2 == 0x55) return false;
+      else return true;
    } else {
-      if(temp2 != 0x55) return TRUE;
+      if(temp2 != 0x55) return true;
       else {
         SiS_SetRegOR(SiS_Pr->SiS_P3d4,0x35,0x01);
-        return FALSE;
+        return false;
       }
    }
 }
@@ -3237,14 +3237,14 @@ static void
 SiS_SetPitch(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn)
 {
    SISPtr pSiS = SISPTR(pScrn);
-   BOOLEAN isslavemode = FALSE;
+   bool isslavemode = false;
 
    if( (pSiS->VBFlags2 & VB2_VIDEOBRIDGE) &&
        ( ((pSiS->VGAEngine == SIS_300_VGA) &&
          (SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0xa0) == 0x20) ||
         ((pSiS->VGAEngine == SIS_315_VGA) &&
          (SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00) & 0x50) == 0x10) ) ) {
-      isslavemode = TRUE;
+      isslavemode = true;
    }
 
    /* We need to set pitch for CRT1 if bridge is in slave mode, too */
@@ -3264,10 +3264,10 @@ SiS_SetPitch(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn)
 
 #ifdef SIS_XORG_XF86
 /* We need pScrn for setting the pitch correctly */
-BOOLEAN
-SiSSetMode(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn, unsigned short ModeNo, BOOLEAN dosetpitch)
+bool
+SiSSetMode(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn, unsigned short ModeNo, bool dosetpitch)
 #else
-BOOLEAN
+bool
 SiSSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
 #endif
 {
@@ -3277,8 +3277,8 @@ SiSSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
 #ifdef SIS_LINUX_KERNEL
    unsigned short KeepLockReg;
 
-   SiS_Pr->UseCustomMode = FALSE;
-   SiS_Pr->CRT1UsesCustomMode = FALSE;
+   SiS_Pr->UseCustomMode = false;
+   SiS_Pr->CRT1UsesCustomMode = false;
 #endif
 
    SiS_Pr->SiS_flag_clearbuffer = 0;
@@ -3317,7 +3317,7 @@ SiSSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
    SiS_UnLockCRT2(SiS_Pr);
 
    if(!SiS_Pr->UseCustomMode) {
-      if(!(SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex))) return FALSE;
+      if(!(SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex))) return false;
    } else {
       ModeIdIndex = 0;
    }
@@ -3347,18 +3347,18 @@ SiSSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
 #ifdef SIS_LINUX_KERNEL
    /* Check memory size (kernel framebuffer driver only) */
    if(!SiS_CheckMemorySize(SiS_Pr, ModeNo, ModeIdIndex)) {
-      return FALSE;
+      return false;
    }
 #endif
 
    SiS_OpenCRTC(SiS_Pr);
 
    if(SiS_Pr->UseCustomMode) {
-      SiS_Pr->CRT1UsesCustomMode = TRUE;
+      SiS_Pr->CRT1UsesCustomMode = true;
       SiS_Pr->CSRClock_CRT1 = SiS_Pr->CSRClock;
       SiS_Pr->CModeFlag_CRT1 = SiS_Pr->CModeFlag;
    } else {
-      SiS_Pr->CRT1UsesCustomMode = FALSE;
+      SiS_Pr->CRT1UsesCustomMode = false;
    }
 
    /* Set mode on CRT1 */
@@ -3445,7 +3445,7 @@ SiSSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
    if(KeepLockReg != 0xA1) SiS_SetReg(SiS_Pr->SiS_P3c4,0x05,0x00);
 #endif
 
-   return TRUE;
+   return true;
 }
 
 /*********************************************/
@@ -3454,14 +3454,14 @@ SiSSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
 /*********************************************/
 
 #ifdef SIS_XORG_XF86
-BOOLEAN
+bool
 SiSBIOSSetMode(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
-               DisplayModePtr mode, BOOLEAN IsCustom)
+               DisplayModePtr mode, bool IsCustom)
 {
    SISPtr pSiS = SISPTR(pScrn);
    unsigned short ModeNo = 0;
 
-   SiS_Pr->UseCustomMode = FALSE;
+   SiS_Pr->UseCustomMode = false;
 
    if((IsCustom) && (SiS_CheckBuildCustomMode(pScrn, mode, pSiS->VBFlags))) {
 
@@ -3475,13 +3475,13 @@ SiSBIOSSetMode(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
 
       /* Don't need vbflags here; checks done earlier */
       ModeNo = SiS_GetModeNumber(pScrn, mode, pSiS->VBFlags);
-      if(!ModeNo) return FALSE;
+      if(!ModeNo) return false;
 
       xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3, "Setting standard mode 0x%x\n", ModeNo);
 
    }
 
-   return(SiSSetMode(SiS_Pr, pScrn, ModeNo, TRUE));
+   return(SiSSetMode(SiS_Pr, pScrn, ModeNo, true));
 }
 
 /*********************************************/
@@ -3489,9 +3489,9 @@ SiSBIOSSetMode(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
 /*           for Dual-Head modes             */
 /*********************************************/
 
-BOOLEAN
+bool
 SiSBIOSSetModeCRT2(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
-               DisplayModePtr mode, BOOLEAN IsCustom)
+               DisplayModePtr mode, bool IsCustom)
 {
    SISIOADDRESS BaseAddr = SiS_Pr->IOAddress;
    SISPtr  pSiS = SISPTR(pScrn);
@@ -3502,7 +3502,7 @@ SiSBIOSSetModeCRT2(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
    unsigned short ModeNo = 0;
    unsigned char  backupreg = 0;
 
-   SiS_Pr->UseCustomMode = FALSE;
+   SiS_Pr->UseCustomMode = false;
 
    /* Remember: Custom modes for CRT2 are ONLY supported
     *     -) on the 30x/B/C, and
@@ -3516,7 +3516,7 @@ SiSBIOSSetModeCRT2(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
    } else {
 
         ModeNo = SiS_GetModeNumber(pScrn, mode, pSiS->VBFlags);
-        if(!ModeNo) return FALSE;
+        if(!ModeNo) return false;
 
    }
 
@@ -3550,10 +3550,10 @@ SiSBIOSSetModeCRT2(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
       if(pSiSEnt->CRT1ModeNo == -1) {
         xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
                "Setting CRT2 mode delayed until after setting CRT1 mode\n");
-        return TRUE;
+        return true;
       }
 #endif
-      pSiSEnt->CRT2ModeSet = TRUE;
+      pSiSEnt->CRT2ModeSet = true;
    }
 #endif
 
@@ -3578,7 +3578,7 @@ SiSBIOSSetModeCRT2(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
    SiS_UnLockCRT2(SiS_Pr);
 
    if(!SiS_Pr->UseCustomMode) {
-      if(!(SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex))) return FALSE;
+      if(!(SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex))) return false;
    } else {
       ModeIdIndex = 0;
    }
@@ -3658,7 +3658,7 @@ SiSBIOSSetModeCRT2(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
 
    SiS_Handle760(SiS_Pr);
 
-   return TRUE;
+   return true;
 }
 
 /*********************************************/
@@ -3666,9 +3666,9 @@ SiSBIOSSetModeCRT2(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
 /*           for Dual-Head modes             */
 /*********************************************/
 
-BOOLEAN
+bool
 SiSBIOSSetModeCRT1(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
-                   DisplayModePtr mode, BOOLEAN IsCustom)
+                   DisplayModePtr mode, bool IsCustom)
 {
    SISIOADDRESS BaseAddr = SiS_Pr->IOAddress;
    SISPtr  pSiS = SISPTR(pScrn);
@@ -3677,10 +3677,10 @@ SiSBIOSSetModeCRT1(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
 #ifdef SISDUALHEAD
    SISEntPtr pSiSEnt = pSiS->entityPrivate;
    unsigned char  backupcr30, backupcr31, backupcr38, backupcr35, backupp40d=0;
-   BOOLEAN backupcustom;
+   bool backupcustom;
 #endif
 
-   SiS_Pr->UseCustomMode = FALSE;
+   SiS_Pr->UseCustomMode = false;
 
    if((IsCustom) && (SiS_CheckBuildCustomMode(pScrn, mode, pSiS->VBFlags))) {
 
@@ -3697,7 +3697,7 @@ SiSBIOSSetModeCRT1(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
    } else {
 
         ModeNo = SiS_GetModeNumber(pScrn, mode, 0); /* don't give VBFlags */
-        if(!ModeNo) return FALSE;
+        if(!ModeNo) return false;
 
         xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
                "Setting standard mode 0x%x on CRT1\n", ModeNo);
@@ -3721,7 +3721,7 @@ SiSBIOSSetModeCRT1(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
    SiS_UnLockCRT2(SiS_Pr);
 
    if(!SiS_Pr->UseCustomMode) {
-      if(!(SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex))) return FALSE;
+      if(!(SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex))) return false;
    } else {
       ModeIdIndex = 0;
    }
@@ -3771,11 +3771,11 @@ SiSBIOSSetModeCRT1(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
 #endif
 
    if(SiS_Pr->UseCustomMode) {
-      SiS_Pr->CRT1UsesCustomMode = TRUE;
+      SiS_Pr->CRT1UsesCustomMode = true;
       SiS_Pr->CSRClock_CRT1 = SiS_Pr->CSRClock;
       SiS_Pr->CModeFlag_CRT1 = SiS_Pr->CModeFlag;
    } else {
-      SiS_Pr->CRT1UsesCustomMode = FALSE;
+      SiS_Pr->CRT1UsesCustomMode = false;
    }
 
    /* Reset CRT2 if changing mode on CRT1 */
@@ -3838,7 +3838,7 @@ SiSBIOSSetModeCRT1(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
    /* Backup/Set ModeNo in BIOS scratch area */
    SiS_GetSetModeID(pScrn,ModeNo);
 
-   return TRUE;
+   return true;
 }
 #endif /* Linux_XF86 */
 
@@ -4082,7 +4082,7 @@ SiS_Generic_ConvertCRData(struct SiS_Private *SiS_Pr, unsigned char *crdata,
                        DisplayModePtr current
 #endif
 #ifdef SIS_LINUX_KERNEL
-                       struct fb_var_screeninfo *var, BOOLEAN writeres
+                       struct fb_var_screeninfo *var, bool writeres
 #endif
 )
 {
index 59d12844b4dd9f2cffcabeb0b3ac126b08ff3b6c..f40a680df86f26fa555ca86b35f32fb0c70dbbad 100644 (file)
@@ -1521,13 +1521,13 @@ static const struct SiS_LVDSCRT1Data SiS_LVDSCRT1640x480_1_H[] =
    0x00}}
 };
 
-BOOLEAN                SiSInitPtr(struct SiS_Private *SiS_Pr);
+bool           SiSInitPtr(struct SiS_Private *SiS_Pr);
 #ifdef SIS_XORG_XF86
 unsigned short SiS_GetModeID(int VGAEngine, unsigned int VBFlags, int HDisplay, int VDisplay,
-                               int Depth, BOOLEAN FSTN, int LCDwith, int LCDheight);
+                               int Depth, bool FSTN, int LCDwith, int LCDheight);
 #endif
 unsigned short SiS_GetModeID_LCD(int VGAEngine, unsigned int VBFlags, int HDisplay,
-                               int VDisplay, int Depth, BOOLEAN FSTN,
+                               int VDisplay, int Depth, bool FSTN,
                                unsigned short CustomT, int LCDwith, int LCDheight,
                                unsigned int VBFlags2);
 unsigned short SiS_GetModeID_TV(int VGAEngine, unsigned int VBFlags, int HDisplay,
@@ -1558,12 +1558,12 @@ void            SiS_SetEnableDstn(struct SiS_Private *SiS_Pr, int enable);
 void           SiS_SetEnableFstn(struct SiS_Private *SiS_Pr, int enable);
 unsigned short SiS_GetModeFlag(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
                                unsigned short ModeIdIndex);
-BOOLEAN                SiSDetermineROMLayout661(struct SiS_Private *SiS_Pr);
+bool           SiSDetermineROMLayout661(struct SiS_Private *SiS_Pr);
 #ifndef SIS_LINUX_KERNEL
 void           SiS_GetVBType(struct SiS_Private *SiS_Pr);
 #endif
 
-BOOLEAN                SiS_SearchModeID(struct SiS_Private *SiS_Pr, unsigned short *ModeNo,
+bool           SiS_SearchModeID(struct SiS_Private *SiS_Pr, unsigned short *ModeNo,
                                unsigned short *ModeIdIndex);
 unsigned short SiS_GetModePtr(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
                                unsigned short ModeIdIndex);
@@ -1581,17 +1581,17 @@ unsigned short  SiS_GetLatencyFactor630(struct SiS_Private *SiS_Pr, unsigned shor
 #endif
 void           SiS_LoadDAC(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex);
 #ifdef SIS_XORG_XF86
-BOOLEAN                SiSSetMode(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn, unsigned short ModeNo,
-                               BOOLEAN dosetpitch);
-BOOLEAN                SiSBIOSSetMode(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
-                               DisplayModePtr mode, BOOLEAN IsCustom);
-BOOLEAN                SiSBIOSSetModeCRT2(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
-                               DisplayModePtr mode, BOOLEAN IsCustom);
-BOOLEAN                SiSBIOSSetModeCRT1(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
-                               DisplayModePtr mode, BOOLEAN IsCustom);
+bool           SiSSetMode(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn, unsigned short ModeNo,
+                               bool dosetpitch);
+bool           SiSBIOSSetMode(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
+                               DisplayModePtr mode, bool IsCustom);
+bool           SiSBIOSSetModeCRT2(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
+                               DisplayModePtr mode, bool IsCustom);
+bool           SiSBIOSSetModeCRT1(struct SiS_Private *SiS_Pr, ScrnInfoPtr pScrn,
+                               DisplayModePtr mode, bool IsCustom);
 #endif
 #ifdef SIS_LINUX_KERNEL
-BOOLEAN                SiSSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo);
+bool           SiSSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo);
 #endif
 void           SiS_CalcCRRegisters(struct SiS_Private *SiS_Pr, int depth);
 void           SiS_CalcLCDACRT1Timing(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
@@ -1602,7 +1602,7 @@ void              SiS_Generic_ConvertCRData(struct SiS_Private *SiS_Pr, unsigned char *crdat
 #endif
 #ifdef SIS_LINUX_KERNEL
 void           SiS_Generic_ConvertCRData(struct SiS_Private *SiS_Pr, unsigned char *crdata, int xres,
-                               int yres, struct fb_var_screeninfo *var, BOOLEAN writeres);
+                               int yres, struct fb_var_screeninfo *var, bool writeres);
 #endif
 
 /* From init301.c: */
@@ -1615,7 +1615,7 @@ extern void               SiS_SetTVMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
                                unsigned short ModeIdIndex);
 extern void            SiS_UnLockCRT2(struct SiS_Private *SiS_Pr);
 extern void            SiS_DisableBridge(struct SiS_Private *);
-extern BOOLEAN         SiS_SetCRT2Group(struct SiS_Private *, unsigned short);
+extern bool            SiS_SetCRT2Group(struct SiS_Private *, unsigned short);
 extern unsigned short  SiS_GetRatePtr(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
                                unsigned short ModeIdIndex);
 extern void            SiS_WaitRetrace1(struct SiS_Private *SiS_Pr);
@@ -1624,8 +1624,8 @@ extern unsigned short     SiS_GetResInfo(struct SiS_Private *SiS_Pr, unsigned short
 extern unsigned short  SiS_GetCH700x(struct SiS_Private *SiS_Pr, unsigned short tempax);
 extern unsigned short  SiS_GetVCLK2Ptr(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
                                unsigned short ModeIdIndex, unsigned short RRTI);
-extern BOOLEAN         SiS_IsVAMode(struct SiS_Private *);
-extern BOOLEAN         SiS_IsDualEdge(struct SiS_Private *);
+extern bool            SiS_IsVAMode(struct SiS_Private *);
+extern bool            SiS_IsDualEdge(struct SiS_Private *);
 
 #ifdef SIS_XORG_XF86
 /* From other modules: */
index 47e1896cffeb83d4b94b5b5a535b338cdf4b0279..da33d801c22e0c114147335701535c2c69e45d88 100644 (file)
@@ -200,7 +200,7 @@ GetLCDStructPtr661_2(struct SiS_Private *SiS_Pr)
 /*           Adjust Rate for CRT2            */
 /*********************************************/
 
-static BOOLEAN
+static bool
 SiS_AdjustCRT2Rate(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
                unsigned short RRTI, unsigned short *i)
 {
@@ -269,7 +269,7 @@ SiS_AdjustCRT2Rate(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned s
    /* Look backwards in table for matching CRT2 mode */
    for(; SiS_Pr->SiS_RefIndex[RRTI + (*i)].ModeID == modeid; (*i)--) {
       infoflag = SiS_Pr->SiS_RefIndex[RRTI + (*i)].Ext_InfoFlag;
-      if(infoflag & checkmask) return TRUE;
+      if(infoflag & checkmask) return true;
       if((*i) == 0) break;
    }
 
@@ -279,9 +279,9 @@ SiS_AdjustCRT2Rate(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned s
    for((*i) = 0; ; (*i)++) {
       if(SiS_Pr->SiS_RefIndex[RRTI + (*i)].ModeID != modeid) break;
       infoflag = SiS_Pr->SiS_RefIndex[RRTI + (*i)].Ext_InfoFlag;
-      if(infoflag & checkmask) return TRUE;
+      if(infoflag & checkmask) return true;
    }
-   return FALSE;
+   return false;
 }
 
 /*********************************************/
@@ -405,7 +405,7 @@ SiS_SaveCRT2Info(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
 /*********************************************/
 
 #ifdef SIS300
-static BOOLEAN
+static bool
 SiS_CR36BIOSWord23b(struct SiS_Private *SiS_Pr)
 {
    unsigned char  *ROMAddr = SiS_Pr->VirtualRomBase;
@@ -415,13 +415,13 @@ SiS_CR36BIOSWord23b(struct SiS_Private *SiS_Pr)
       if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
         temp = 1 << ((SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) >> 4) & 0x0f);
         temp1 = SISGETROMW(0x23b);
-        if(temp1 & temp) return TRUE;
+        if(temp1 & temp) return true;
       }
    }
-   return FALSE;
+   return false;
 }
 
-static BOOLEAN
+static bool
 SiS_CR36BIOSWord23d(struct SiS_Private *SiS_Pr)
 {
    unsigned char  *ROMAddr = SiS_Pr->VirtualRomBase;
@@ -431,10 +431,10 @@ SiS_CR36BIOSWord23d(struct SiS_Private *SiS_Pr)
       if((ROMAddr[0x233] == 0x12) && (ROMAddr[0x234] == 0x34)) {
         temp = 1 << ((SiS_GetReg(SiS_Pr->SiS_P3d4,0x36) >> 4) & 0x0f);
         temp1 = SISGETROMW(0x23d);
-        if(temp1 & temp) return TRUE;
+        if(temp1 & temp) return true;
       }
    }
-   return FALSE;
+   return false;
 }
 #endif
 
@@ -687,38 +687,38 @@ SiS_VBLongWait(struct SiS_Private *SiS_Pr)
 /*********************************************/
 
 #ifdef SIS300
-static BOOLEAN
+static bool
 SiS_Is301B(struct SiS_Private *SiS_Pr)
 {
-   if(SiS_GetReg(SiS_Pr->SiS_Part4Port,0x01) >= 0xb0) return TRUE;
-   return FALSE;
+   if(SiS_GetReg(SiS_Pr->SiS_Part4Port,0x01) >= 0xb0) return true;
+   return false;
 }
 #endif
 
-static BOOLEAN
+static bool
 SiS_CRT2IsLCD(struct SiS_Private *SiS_Pr)
 {
    if(SiS_Pr->ChipType == SIS_730) {
-      if(SiS_GetReg(SiS_Pr->SiS_P3c4,0x13) & 0x20) return TRUE;
+      if(SiS_GetReg(SiS_Pr->SiS_P3c4,0x13) & 0x20) return true;
    }
-   if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x30) & 0x20) return TRUE;
-   return FALSE;
+   if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x30) & 0x20) return true;
+   return false;
 }
 
-BOOLEAN
+bool
 SiS_IsDualEdge(struct SiS_Private *SiS_Pr)
 {
 #ifdef SIS315H
    if(SiS_Pr->ChipType >= SIS_315H) {
       if((SiS_Pr->ChipType != SIS_650) || (SiS_GetReg(SiS_Pr->SiS_P3d4,0x5f) & 0xf0)) {
-        if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x38) & EnableDualEdge) return TRUE;
+        if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x38) & EnableDualEdge) return true;
       }
    }
 #endif
-   return FALSE;
+   return false;
 }
 
-BOOLEAN
+bool
 SiS_IsVAMode(struct SiS_Private *SiS_Pr)
 {
 #ifdef SIS315H
@@ -726,70 +726,70 @@ SiS_IsVAMode(struct SiS_Private *SiS_Pr)
 
    if(SiS_Pr->ChipType >= SIS_315H) {
       flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
-      if((flag & EnableDualEdge) && (flag & SetToLCDA)) return TRUE;
+      if((flag & EnableDualEdge) && (flag & SetToLCDA)) return true;
    }
 #endif
-   return FALSE;
+   return false;
 }
 
 #ifdef SIS315H
-static BOOLEAN
+static bool
 SiS_IsVAorLCD(struct SiS_Private *SiS_Pr)
 {
-   if(SiS_IsVAMode(SiS_Pr))  return TRUE;
-   if(SiS_CRT2IsLCD(SiS_Pr)) return TRUE;
-   return FALSE;
+   if(SiS_IsVAMode(SiS_Pr))  return true;
+   if(SiS_CRT2IsLCD(SiS_Pr)) return true;
+   return false;
 }
 #endif
 
-static BOOLEAN
+static bool
 SiS_IsDualLink(struct SiS_Private *SiS_Pr)
 {
 #ifdef SIS315H
    if(SiS_Pr->ChipType >= SIS_315H) {
       if((SiS_CRT2IsLCD(SiS_Pr)) ||
          (SiS_IsVAMode(SiS_Pr))) {
-        if(SiS_Pr->SiS_LCDInfo & LCDDualLink) return TRUE;
+        if(SiS_Pr->SiS_LCDInfo & LCDDualLink) return true;
       }
    }
 #endif
-   return FALSE;
+   return false;
 }
 
 #ifdef SIS315H
-static BOOLEAN
+static bool
 SiS_TVEnabled(struct SiS_Private *SiS_Pr)
 {
-   if((SiS_GetReg(SiS_Pr->SiS_Part2Port,0x00) & 0x0f) != 0x0c) return TRUE;
+   if((SiS_GetReg(SiS_Pr->SiS_Part2Port,0x00) & 0x0f) != 0x0c) return true;
    if(SiS_Pr->SiS_VBType & VB_SISYPBPR) {
-      if(SiS_GetReg(SiS_Pr->SiS_Part2Port,0x4d) & 0x10) return TRUE;
+      if(SiS_GetReg(SiS_Pr->SiS_Part2Port,0x4d) & 0x10) return true;
    }
-   return FALSE;
+   return false;
 }
 #endif
 
 #ifdef SIS315H
-static BOOLEAN
+static bool
 SiS_LCDAEnabled(struct SiS_Private *SiS_Pr)
 {
-   if(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x13) & 0x04) return TRUE;
-   return FALSE;
+   if(SiS_GetReg(SiS_Pr->SiS_Part1Port,0x13) & 0x04) return true;
+   return false;
 }
 #endif
 
 #ifdef SIS315H
-static BOOLEAN
+static bool
 SiS_WeHaveBacklightCtrl(struct SiS_Private *SiS_Pr)
 {
    if((SiS_Pr->ChipType >= SIS_315H) && (SiS_Pr->ChipType < SIS_661)) {
-      if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x79) & 0x10) return TRUE;
+      if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x79) & 0x10) return true;
    }
-   return FALSE;
+   return false;
 }
 #endif
 
 #ifdef SIS315H
-static BOOLEAN
+static bool
 SiS_IsNotM650orLater(struct SiS_Private *SiS_Pr)
 {
    unsigned short flag;
@@ -798,90 +798,90 @@ SiS_IsNotM650orLater(struct SiS_Private *SiS_Pr)
       flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x5f) & 0xf0;
       /* Check for revision != A0 only */
       if((flag == 0xe0) || (flag == 0xc0) ||
-         (flag == 0xb0) || (flag == 0x90)) return FALSE;
-   } else if(SiS_Pr->ChipType >= SIS_661) return FALSE;
-   return TRUE;
+         (flag == 0xb0) || (flag == 0x90)) return false;
+   } else if(SiS_Pr->ChipType >= SIS_661) return false;
+   return true;
 }
 #endif
 
 #ifdef SIS315H
-static BOOLEAN
+static bool
 SiS_IsYPbPr(struct SiS_Private *SiS_Pr)
 {
    if(SiS_Pr->ChipType >= SIS_315H) {
       /* YPrPb = 0x08 */
-      if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x38) & EnableCHYPbPr) return TRUE;
+      if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x38) & EnableCHYPbPr) return true;
    }
-   return FALSE;
+   return false;
 }
 #endif
 
 #ifdef SIS315H
-static BOOLEAN
+static bool
 SiS_IsChScart(struct SiS_Private *SiS_Pr)
 {
    if(SiS_Pr->ChipType >= SIS_315H) {
       /* Scart = 0x04 */
-      if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x38) & EnableCHScart) return TRUE;
+      if(SiS_GetReg(SiS_Pr->SiS_P3d4,0x38) & EnableCHScart) return true;
    }
-   return FALSE;
+   return false;
 }
 #endif
 
 #ifdef SIS315H
-static BOOLEAN
+static bool
 SiS_IsTVOrYPbPrOrScart(struct SiS_Private *SiS_Pr)
 {
    unsigned short flag;
 
    if(SiS_Pr->ChipType >= SIS_315H) {
       flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
-      if(flag & SetCRT2ToTV)        return TRUE;
+      if(flag & SetCRT2ToTV)        return true;
       flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
-      if(flag & EnableCHYPbPr)      return TRUE;  /* = YPrPb = 0x08 */
-      if(flag & EnableCHScart)      return TRUE;  /* = Scart = 0x04 - TW */
+      if(flag & EnableCHYPbPr)      return true;  /* = YPrPb = 0x08 */
+      if(flag & EnableCHScart)      return true;  /* = Scart = 0x04 - TW */
    } else {
       flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
-      if(flag & SetCRT2ToTV)        return TRUE;
+      if(flag & SetCRT2ToTV)        return true;
    }
-   return FALSE;
+   return false;
 }
 #endif
 
 #ifdef SIS315H
-static BOOLEAN
+static bool
 SiS_IsLCDOrLCDA(struct SiS_Private *SiS_Pr)
 {
    unsigned short flag;
 
    if(SiS_Pr->ChipType >= SIS_315H) {
       flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
-      if(flag & SetCRT2ToLCD) return TRUE;
+      if(flag & SetCRT2ToLCD) return true;
       flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x38);
-      if(flag & SetToLCDA)    return TRUE;
+      if(flag & SetToLCDA)    return true;
    } else {
       flag = SiS_GetReg(SiS_Pr->SiS_P3d4,0x30);
-      if(flag & SetCRT2ToLCD) return TRUE;
+      if(flag & SetCRT2ToLCD) return true;
    }
-   return FALSE;
+   return false;
 }
 #endif
 
-static BOOLEAN
+static bool
 SiS_HaveBridge(struct SiS_Private *SiS_Pr)
 {
    unsigned short flag;
 
    if(SiS_Pr->SiS_IF_DEF_LVDS == 1) {
-      return TRUE;
+      return true;
    } else if(SiS_Pr->SiS_VBType & VB_SISVB) {
       flag = SiS_GetReg(SiS_Pr->SiS_Part4Port,0x00);
-      if((flag == 1) || (flag == 2)) return TRUE;
+      if((flag == 1) || (flag == 2)) return true;
    }
-   return FALSE;
+   return false;
 }
 
-static BOOLEAN
+static bool
 SiS_BridgeIsEnabled(struct SiS_Private *SiS_Pr)
 {
    unsigned short flag;
@@ -890,23 +890,23 @@ SiS_BridgeIsEnabled(struct SiS_Private *SiS_Pr)
       flag = SiS_GetReg(SiS_Pr->SiS_Part1Port,0x00);
       if(SiS_Pr->ChipType < SIS_315H) {
        flag &= 0xa0;
-       if((flag == 0x80) || (flag == 0x20)) return TRUE;
+       if((flag == 0x80) || (flag == 0x20)) return true;
       } else {
        flag &= 0x50;
-       if((flag == 0x40) || (flag == 0x10)) return TRUE;
+       if((flag == 0x40) || (flag == 0x10)) return true;
       }
    }
-   return FALSE;
+   return false;
 }
 
-static BOOLEAN
+static bool
 SiS_BridgeInSlavemode(struct SiS_Private *SiS_Pr)
 {
    unsigned short flag1;
 
    flag1 = SiS_GetReg(SiS_Pr->SiS_P3d4,0x31);
-   if(flag1 & (SetInSlaveMode >> 8)) return TRUE;
-   return FALSE;
+   if(flag1 & (SetInSlaveMode >> 8)) return true;
+   return false;
 }
 
 /*********************************************/
@@ -1461,11 +1461,11 @@ SiS_GetLCDInfoBIOS(struct SiS_Private *SiS_Pr)
 
    if((ROMAddr = GetLCDStructPtr661(SiS_Pr))) {
       if((temp = SISGETROMW(6)) != SiS_Pr->PanelHT) {
-        SiS_Pr->SiS_NeedRomModeData = TRUE;
+        SiS_Pr->SiS_NeedRomModeData = true;
         SiS_Pr->PanelHT  = temp;
       }
       if((temp = SISGETROMW(8)) != SiS_Pr->PanelVT) {
-        SiS_Pr->SiS_NeedRomModeData = TRUE;
+        SiS_Pr->SiS_NeedRomModeData = true;
         SiS_Pr->PanelVT  = temp;
       }
       SiS_Pr->PanelHRS = SISGETROMW(10);
@@ -1516,7 +1516,7 @@ void
 SiS_GetLCDResInfo(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex)
 {
   unsigned short temp,modeflag,resinfo=0,modexres=0,modeyres=0;
-  BOOLEAN panelcanscale = FALSE;
+  bool panelcanscale = false;
 #ifdef SIS300
   unsigned char *ROMAddr = SiS_Pr->VirtualRomBase;
   static const unsigned char SiS300SeriesLCDRes[] =
@@ -1534,10 +1534,10 @@ SiS_GetLCDResInfo(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned sh
   SiS_Pr->PanelHRE        = 999; /* HSync end */
   SiS_Pr->PanelVRS        = 999; /* VSync start */
   SiS_Pr->PanelVRE        = 999; /* VSync end */
-  SiS_Pr->SiS_NeedRomModeData = FALSE;
+  SiS_Pr->SiS_NeedRomModeData = false;
 
   /* Alternative 1600x1200@60 timing for 1600x1200 LCDA */
-  SiS_Pr->Alternate1600x1200 = FALSE;
+  SiS_Pr->Alternate1600x1200 = false;
 
   if(!(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))) return;
 
@@ -1633,7 +1633,7 @@ SiS_GetLCDResInfo(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned sh
       SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
   }
 
-  panelcanscale = (SiS_Pr->SiS_LCDInfo & DontExpandLCD) ? TRUE : FALSE;
+  panelcanscale = (bool)(SiS_Pr->SiS_LCDInfo & DontExpandLCD);
 
   if(!SiS_Pr->UsePanelScaler)          SiS_Pr->SiS_LCDInfo &= ~DontExpandLCD;
   else if(SiS_Pr->UsePanelScaler == 1) SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
@@ -1833,7 +1833,7 @@ SiS_GetLCDResInfo(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned sh
                                  SiS_Pr->PanelHRS =   48; SiS_Pr->PanelHRE =   32;
                                  SiS_Pr->PanelVRS =    2; SiS_Pr->PanelVRE =    4;
                                  SiS_Pr->PanelVCLKIdx315 = VCLK130_315;
-                                 SiS_Pr->Alternate1600x1200 = TRUE;
+                                 SiS_Pr->Alternate1600x1200 = true;
                               }
                            } else if(SiS_Pr->SiS_IF_DEF_LVDS) {
                               SiS_Pr->PanelHT  = 2048; SiS_Pr->PanelVT  = 1320;
@@ -3448,7 +3448,7 @@ SiS_GetCRT2Data301(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned s
 
      } else {
 
-       BOOLEAN gotit = FALSE;
+       bool gotit = false;
 
        if((SiS_Pr->SiS_LCDInfo & DontExpandLCD) && (!(SiS_Pr->SiS_LCDInfo & LCDPass11))) {
 
@@ -3456,7 +3456,7 @@ SiS_GetCRT2Data301(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned s
           SiS_Pr->SiS_VGAVT = SiS_Pr->PanelVT;
           SiS_Pr->SiS_HT    = SiS_Pr->PanelHT;
           SiS_Pr->SiS_VT    = SiS_Pr->PanelVT;
-          gotit = TRUE;
+          gotit = true;
 
        } else if( (!(SiS_Pr->SiS_LCDInfo & DontExpandLCD)) && (romptr) && (ROMAddr) ) {
 
@@ -3474,7 +3474,7 @@ SiS_GetCRT2Data301(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned s
              if(ROMAddr[romptr+9] & 0x80) SiS_Pr->SiS_RVBHRS2 -= tempax;
              else                         SiS_Pr->SiS_RVBHRS2 += tempax;
           }
-          if(SiS_Pr->SiS_VGAHT) gotit = TRUE;
+          if(SiS_Pr->SiS_VGAHT) gotit = true;
           else {
              SiS_Pr->SiS_LCDInfo |= DontExpandLCD;
              SiS_Pr->SiS_LCDInfo &= ~LCDPass11;
@@ -3485,7 +3485,7 @@ SiS_GetCRT2Data301(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned s
              SiS_Pr->SiS_HT      = SiS_Pr->PanelHT;
              SiS_Pr->SiS_VT      = SiS_Pr->PanelVT;
              SiS_Pr->SiS_RVBHRS2 = 0;
-             gotit = TRUE;
+             gotit = true;
           }
 #endif
 
@@ -3960,8 +3960,8 @@ SiS_DisableBridge(struct SiS_Private *SiS_Pr)
 #ifdef SIS315H    /* 315 series */
 
           int didpwd = 0;
-          BOOLEAN custom1 = ((SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
-                             (SiS_Pr->SiS_CustomT == CUT_CLEVO1400)) ? TRUE : FALSE;
+          bool custom1 = (SiS_Pr->SiS_CustomT == CUT_COMPAQ1280) ||
+                         (SiS_Pr->SiS_CustomT == CUT_CLEVO1400);
 
           modenum = SiS_GetReg(SiS_Pr->SiS_P3d4,0x34) & 0x7f;
 
@@ -4313,7 +4313,7 @@ SiS_EnableBridge(struct SiS_Private *SiS_Pr)
   unsigned short temp=0, tempah;
 #ifdef SIS315H
   unsigned short temp1, pushax=0;
-  BOOLEAN delaylong = FALSE;
+  bool delaylong = false;
 #endif
 
   if(SiS_Pr->SiS_VBType & VB_SISVB) {
@@ -4448,7 +4448,7 @@ SiS_EnableBridge(struct SiS_Private *SiS_Pr)
 
            if(!(SiS_GetReg(SiS_Pr->SiS_P3d4,0x31) & 0x40)) {
               SiS_PanelDelayLoop(SiS_Pr, 3, 10);
-              delaylong = TRUE;
+              delaylong = true;
            }
 
         }
@@ -4530,7 +4530,7 @@ SiS_EnableBridge(struct SiS_Private *SiS_Pr)
                        SiS_Pr->EMI_33 = ROMAddr[romptr + SiS_Pr->SiS_EMIOffset + 2];
                        if(ROMAddr[romptr + 1] & 0x10) SiS_Pr->EMI_30 = 0x40;
                        /* emidelay = SISGETROMW((romptr + 0x22)); */
-                       SiS_Pr->HaveEMI = SiS_Pr->HaveEMILCD = SiS_Pr->OverruleEMI = TRUE;
+                       SiS_Pr->HaveEMI = SiS_Pr->HaveEMILCD = SiS_Pr->OverruleEMI = true;
                     }
                  }
 
@@ -4644,7 +4644,7 @@ SiS_EnableBridge(struct SiS_Private *SiS_Pr)
                        SiS_PanelDelayLoop(SiS_Pr, 3, 5);
                        if(delaylong) {
                           SiS_PanelDelayLoop(SiS_Pr, 3, 5);
-                          delaylong = FALSE;
+                          delaylong = false;
                        }
                        SiS_WaitVBRetrace(SiS_Pr);
                        SiS_WaitVBRetrace(SiS_Pr);
@@ -5454,7 +5454,7 @@ SiS_SetGroup1_LVDS(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned s
   unsigned short modeflag, resinfo = 0;
   unsigned short push2, tempax, tempbx, tempcx, temp;
   unsigned int   tempeax = 0, tempebx, tempecx, tempvcfact = 0;
-  BOOLEAN islvds = FALSE, issis  = FALSE, chkdclkfirst = FALSE;
+  bool islvds = false, issis  = false, chkdclkfirst = false;
 #ifdef SIS300
   unsigned short crt2crtc = 0;
 #endif
@@ -5480,17 +5480,17 @@ SiS_SetGroup1_LVDS(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned s
 
   /* is lvds if really LVDS, or 301B-DH with external LVDS transmitter */
   if((SiS_Pr->SiS_IF_DEF_LVDS == 1) || (SiS_Pr->SiS_VBType & VB_NoLCD)) {
-     islvds = TRUE;
+     islvds = true;
   }
 
   /* is really sis if sis bridge, but not 301B-DH */
   if((SiS_Pr->SiS_VBType & VB_SISVB) && (!(SiS_Pr->SiS_VBType & VB_NoLCD))) {
-     issis = TRUE;
+     issis = true;
   }
 
   if((SiS_Pr->ChipType >= SIS_315H) && (islvds) && (!(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA))) {
      if((!SiS_Pr->SiS_IF_DEF_FSTN) && (!SiS_Pr->SiS_IF_DEF_DSTN)) {
-        chkdclkfirst = TRUE;
+        chkdclkfirst = true;
      }
   }
 
@@ -6447,13 +6447,13 @@ SiS_SetGroup2_C_ELV(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned
    SiS_SetRegANDOR(SiS_Pr->SiS_Part2Port,0x4e,0xeb,temp);
 }
 
-static BOOLEAN
+static bool
 SiS_GetCRT2Part2Ptr(struct SiS_Private *SiS_Pr,unsigned short ModeNo,unsigned short ModeIdIndex,
                    unsigned short RefreshRateTableIndex,unsigned short *CRT2Index,
                    unsigned short *ResIndex)
 {
 
-  if(SiS_Pr->ChipType < SIS_315H) return FALSE;
+  if(SiS_Pr->ChipType < SIS_315H) return false;
 
   if(ModeNo <= 0x13)
      (*ResIndex) = SiS_Pr->SiS_SModeIDTable[ModeIdIndex].St_CRT2CRTC;
@@ -6688,7 +6688,7 @@ SiS_SetGroup2(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short
   unsigned short i, j, tempax, tempbx, tempcx, tempch, tempcl, temp;
   unsigned short push2, modeflag, crt2crtc, bridgeoffset;
   unsigned int   longtemp, PhaseIndex;
-  BOOLEAN        newtvphase;
+  bool           newtvphase;
   const unsigned char *TimingPoint;
 #ifdef SIS315H
   unsigned short resindex, CRT2Index;
@@ -6721,11 +6721,11 @@ SiS_SetGroup2(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short
   PhaseIndex  = 0x01; /* SiS_PALPhase */
   TimingPoint = SiS_Pr->SiS_PALTiming;
 
-  newtvphase = FALSE;
+  newtvphase = false;
   if( (SiS_Pr->SiS_VBType & VB_SIS30xBLV) &&
       ( (!(SiS_Pr->SiS_VBInfo & SetInSlaveMode)) ||
        (SiS_Pr->SiS_TVMode & TVSetTVSimuMode) ) ) {
-     newtvphase = TRUE;
+     newtvphase = true;
   }
 
   if(SiS_Pr->SiS_VBInfo & SetCRT2ToHiVision) {
@@ -7754,13 +7754,13 @@ SiS_SetGroup5(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short
 /*     MODIFY CRT1 GROUP FOR SLAVE MODE      */
 /*********************************************/
 
-static BOOLEAN
+static bool
 SiS_GetLVDSCRT1Ptr(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex,
                   unsigned short RefreshRateTableIndex, unsigned short *ResIndex,
                   unsigned short *DisplayType)
  {
   unsigned short modeflag = 0;
-  BOOLEAN checkhd = TRUE;
+  bool checkhd = true;
 
   /* Pass 1:1 not supported here */
 
@@ -7792,7 +7792,7 @@ SiS_GetLVDSCRT1Ptr(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned s
      (*DisplayType = 0);
      switch(SiS_Pr->SiS_LCDResInfo) {
      case Panel_320x240_1: (*DisplayType) = 50;
-                          checkhd = FALSE;
+                          checkhd = false;
                           break;
      case Panel_320x240_2: (*DisplayType) = 14;
                           break;
@@ -7802,7 +7802,7 @@ SiS_GetLVDSCRT1Ptr(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned s
                           break;
      case Panel_1024x600:  (*DisplayType) = 26;
                           break;
-     default: return TRUE;
+     default: return true;
      }
 
      if(checkhd) {
@@ -7815,7 +7815,7 @@ SiS_GetLVDSCRT1Ptr(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned s
 
   }
 
-  return TRUE;
+  return true;
 }
 
 static void
@@ -8654,7 +8654,7 @@ SiS_ChrontelDoSomething1(struct SiS_Private *SiS_Pr)
 /*      MAIN: SET CRT2 REGISTER GROUP        */
 /*********************************************/
 
-BOOLEAN
+bool
 SiS_SetCRT2Group(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
 {
 #ifdef SIS300
@@ -8690,7 +8690,7 @@ SiS_SetCRT2Group(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
    if(SiS_Pr->SiS_VBInfo & DisableCRT2Display) {
       SiS_LockCRT2(SiS_Pr);
       SiS_DisplayOn(SiS_Pr);
-      return TRUE;
+      return true;
    }
 
    SiS_GetCRT2Data(SiS_Pr, ModeNo, ModeIdIndex, RefreshRateTableIndex);
@@ -8828,7 +8828,7 @@ SiS_SetCRT2Group(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
       SiS_LockCRT2(SiS_Pr);
    }
 
-   return TRUE;
+   return true;
 }
 
 
@@ -8908,7 +8908,7 @@ SiS_SetTrumpBlockLoop(struct SiS_Private *SiS_Pr, unsigned char *dataptr)
   return NULL;
 }
 
-static BOOLEAN
+static bool
 SiS_SetTrumpionBlock(struct SiS_Private *SiS_Pr, unsigned char *dataptr)
 {
   SiS_Pr->SiS_DDC_DeviceAddr = 0xF0;           /* DAB (Device Address Byte) */
@@ -8921,14 +8921,14 @@ SiS_SetTrumpionBlock(struct SiS_Private *SiS_Pr, unsigned char *dataptr)
 
   while(*dataptr) {
      dataptr = SiS_SetTrumpBlockLoop(SiS_Pr, dataptr);
-     if(!dataptr) return FALSE;
+     if(!dataptr) return false;
   }
 #ifdef SIS_XORG_XF86
 #ifdef TWDEBUG
   xf86DrvMsg(0, X_INFO, "Trumpion block success\n");
 #endif
 #endif
-  return TRUE;
+  return true;
 }
 #endif
 
@@ -8939,7 +8939,7 @@ SiS_SetTrumpionBlock(struct SiS_Private *SiS_Pr, unsigned char *dataptr)
  * 0x0a, possibly for working around the DDC problems
  */
 
-static BOOLEAN
+static bool
 SiS_SetChReg(struct SiS_Private *SiS_Pr, unsigned short reg, unsigned char val, unsigned short myor)
 {
   unsigned short temp, i;
@@ -8958,9 +8958,9 @@ SiS_SetChReg(struct SiS_Private *SiS_Pr, unsigned short reg, unsigned char val,
      if(temp) continue;                                                        /*    (ERROR: no ack) */
      if(SiS_SetStop(SiS_Pr)) continue;                                 /* Set stop condition */
      SiS_Pr->SiS_ChrontelInit = 1;
-     return TRUE;
+     return true;
   }
-  return FALSE;
+  return false;
 }
 
 /* Write to Chrontel 700x */
@@ -9119,7 +9119,7 @@ static
 #endif
 unsigned short
 SiS_InitDDCRegs(struct SiS_Private *SiS_Pr, unsigned int VBFlags, int VGAEngine,
-                unsigned short adaptnum, unsigned short DDCdatatype, BOOLEAN checkcr32,
+                unsigned short adaptnum, unsigned short DDCdatatype, bool checkcr32,
                unsigned int VBFlags2)
 {
      unsigned char ddcdtype[] = { 0xa0, 0xa0, 0xa0, 0xa2, 0xa6 };
@@ -9287,7 +9287,7 @@ SiS_DoProbeDDC(struct SiS_Private *SiS_Pr)
 {
     unsigned char mask, value;
     unsigned short  temp, ret=0;
-    BOOLEAN failed = FALSE;
+    bool failed = false;
 
     SiS_SetSwitchDDC2(SiS_Pr);
     if(SiS_PrepareDDC(SiS_Pr)) {
@@ -9308,7 +9308,7 @@ SiS_DoProbeDDC(struct SiS_Private *SiS_Pr)
            mask = 0xff;
           value = 0xff;
        } else {
-           failed = TRUE;
+           failed = true;
           ret = 0xFFFF;
 #ifdef SIS_XORG_XF86
 #ifdef TWDEBUG
@@ -9317,7 +9317,7 @@ SiS_DoProbeDDC(struct SiS_Private *SiS_Pr)
 #endif
        }
     }
-    if(failed == FALSE) {
+    if(!failed) {
        temp = (unsigned char)SiS_ReadDDC2Data(SiS_Pr);
        SiS_SendACK(SiS_Pr, 1);
        temp &= mask;
@@ -9431,7 +9431,7 @@ SiS_HandleDDC(struct SiS_Private *SiS_Pr, unsigned int VBFlags, int VGAEngine,
    if((!(VBFlags2 & VB2_VIDEOBRIDGE)) && (adaptnum > 0))
       return 0xFFFF;
 
-   if(SiS_InitDDCRegs(SiS_Pr, VBFlags, VGAEngine, adaptnum, DDCdatatype, FALSE, VBFlags2) == 0xFFFF)
+   if(SiS_InitDDCRegs(SiS_Pr, VBFlags, VGAEngine, adaptnum, DDCdatatype, false, VBFlags2) == 0xFFFF)
       return 0xFFFF;
 
    sr1f = SiS_GetReg(SiS_Pr->SiS_P3c4,0x1f);
@@ -9829,7 +9829,7 @@ SetDelayComp(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
 {
   unsigned char  *ROMAddr = SiS_Pr->VirtualRomBase;
   unsigned short delay=0,index,myindex,temp,romptr=0;
-  BOOLEAN dochiptest = TRUE;
+  bool dochiptest = true;
 
   if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
      SiS_SetRegAND(SiS_Pr->SiS_Part1Port,0x20,0xbf);
@@ -9864,7 +9864,7 @@ SetDelayComp(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
 
   } else if(SiS_Pr->SiS_VBInfo & (SetCRT2ToLCD|SetCRT2ToLCDA)) {  /* ----------        LCD/LCDA */
 
-     BOOLEAN gotitfrompci = FALSE;
+     bool gotitfrompci = false;
 
      /* Could we detect a PDC for LCD or did we get a user-defined? If yes, use it */
 
@@ -9916,22 +9916,22 @@ SetDelayComp(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
      case CUT_COMPAQ1280:
      case CUT_COMPAQ12802:
        if(SiS_Pr->SiS_LCDResInfo == Panel_1280x1024) {
-          gotitfrompci = TRUE;
-          dochiptest = FALSE;
+          gotitfrompci = true;
+          dochiptest = false;
           delay = 0x03;
        }
        break;
      case CUT_CLEVO1400:
      case CUT_CLEVO14002:
-       gotitfrompci = TRUE;
-       dochiptest = FALSE;
+       gotitfrompci = true;
+       dochiptest = false;
        delay = 0x02;
        break;
      case CUT_CLEVO1024:
      case CUT_CLEVO10242:
         if(SiS_Pr->SiS_LCDResInfo == Panel_1024x768) {
-          gotitfrompci = TRUE;
-          dochiptest = FALSE;
+          gotitfrompci = true;
+          dochiptest = false;
           delay = 0x33;
           SiS_SetReg(SiS_Pr->SiS_Part1Port,0x2D,delay);
           delay &= 0x0f;
@@ -10009,7 +10009,7 @@ SetDelayComp(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
 
      if(SiS_Pr->SiS_VBInfo & SetCRT2ToLCDA) {
        SiS_SetRegANDOR(SiS_Pr->SiS_Part1Port,0x2D,0x0F,((delay << 4) & 0xf0));
-       dochiptest = FALSE;
+       dochiptest = false;
      }
 
   } else if(SiS_Pr->SiS_VBInfo & SetCRT2ToTV) {                        /* ------------ TV */
@@ -10043,12 +10043,12 @@ SetDelayComp(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
           case CUT_CLEVO1400:
           case CUT_CLEVO14002:
              delay = 0x02;
-             dochiptest = FALSE;
+             dochiptest = false;
              break;
           case CUT_CLEVO1024:
           case CUT_CLEVO10242:
              delay = 0x03;
-             dochiptest = FALSE;
+             dochiptest = false;
              break;
           default:
               delay = SiS310_TVDelayCompensation_651301LV[index];
@@ -10085,7 +10085,7 @@ SetDelayComp(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
 
      if(SiS_LCDAEnabled(SiS_Pr)) {
        delay &= 0x0f;
-       dochiptest = FALSE;
+       dochiptest = false;
      }
 
   } else return;
@@ -10728,7 +10728,7 @@ SiS_FinalizeLCD(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned shor
              SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1c,0x00);
              SiS_SetReg(SiS_Pr->SiS_Part1Port,0x1d,0x1b);
           }
-          if((SiS_Pr->Backup == TRUE) && (SiS_Pr->Backup_Mode == ModeNo)) {
+          if(SiS_Pr->Backup && (SiS_Pr->Backup_Mode == ModeNo)) {
              SiS_SetReg(SiS_Pr->SiS_Part1Port,0x14,SiS_Pr->Backup_14);
              SiS_SetReg(SiS_Pr->SiS_Part1Port,0x15,SiS_Pr->Backup_15);
              SiS_SetReg(SiS_Pr->SiS_Part1Port,0x16,SiS_Pr->Backup_16);
index 4f3a28699d3753ca7c48be541861ee6c1ca3950d..7708e1e1d99e4509b87785d21b0131f3819eee95 100644 (file)
@@ -363,8 +363,8 @@ void                SiS_LockCRT2(struct SiS_Private *SiS_Pr);
 void           SiS_EnableCRT2(struct SiS_Private *SiS_Pr);
 unsigned short SiS_GetRatePtr(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex);
 void           SiS_WaitRetrace1(struct SiS_Private *SiS_Pr);
-BOOLEAN                SiS_IsDualEdge(struct SiS_Private *SiS_Pr);
-BOOLEAN                SiS_IsVAMode(struct SiS_Private *SiS_Pr);
+bool           SiS_IsDualEdge(struct SiS_Private *SiS_Pr);
+bool           SiS_IsVAMode(struct SiS_Private *SiS_Pr);
 void           SiS_GetVBInfo(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
                        unsigned short ModeIdIndex, int checkcrt2mode);
 void           SiS_SetYPbPr(struct SiS_Private *SiS_Pr);
@@ -379,7 +379,7 @@ void                SiS_DisableBridge(struct SiS_Private *SiS_Pr);
 #ifndef SIS_LINUX_KERNEL
 void           SiS_EnableBridge(struct SiS_Private *SiS_Pr);
 #endif
-BOOLEAN                SiS_SetCRT2Group(struct SiS_Private *SiS_Pr, unsigned short ModeNo);
+bool           SiS_SetCRT2Group(struct SiS_Private *SiS_Pr, unsigned short ModeNo);
 void           SiS_SiS30xBLOn(struct SiS_Private *SiS_Pr);
 void           SiS_SiS30xBLOff(struct SiS_Private *SiS_Pr);
 
@@ -403,7 +403,7 @@ void                SiS_Chrontel701xBLOff(struct SiS_Private *SiS_Pr);
 #endif /* 315 */
 
 #ifdef SIS300
-static  BOOLEAN        SiS_SetTrumpionBlock(struct SiS_Private *SiS_Pr, unsigned char *dataptr);
+static  bool   SiS_SetTrumpionBlock(struct SiS_Private *SiS_Pr, unsigned char *dataptr);
 void           SiS_SetChrontelGPIO(struct SiS_Private *SiS_Pr, unsigned short myvbinfo);
 #endif
 
@@ -416,14 +416,14 @@ unsigned short    SiS_HandleDDC(struct SiS_Private *SiS_Pr, unsigned int VBFlags, i
 #ifdef SIS_XORG_XF86
 unsigned short         SiS_InitDDCRegs(struct SiS_Private *SiS_Pr, unsigned int VBFlags,
                                int VGAEngine, unsigned short adaptnum, unsigned short DDCdatatype,
-                               BOOLEAN checkcr32, unsigned int VBFlags2);
+                               bool checkcr32, unsigned int VBFlags2);
 unsigned short         SiS_ProbeDDC(struct SiS_Private *SiS_Pr);
 unsigned short         SiS_ReadDDC(struct SiS_Private *SiS_Pr, unsigned short DDCdatatype,
                                unsigned char *buffer);
 #else
 static unsigned short  SiS_InitDDCRegs(struct SiS_Private *SiS_Pr, unsigned int VBFlags,
                                int VGAEngine, unsigned short adaptnum, unsigned short DDCdatatype,
-                               BOOLEAN checkcr32, unsigned int VBFlags2);
+                               bool checkcr32, unsigned int VBFlags2);
 static unsigned short  SiS_ProbeDDC(struct SiS_Private *SiS_Pr);
 static unsigned short  SiS_ReadDDC(struct SiS_Private *SiS_Pr, unsigned short DDCdatatype,
                                unsigned char *buffer);
@@ -469,7 +469,7 @@ extern void         SiS_SetRegOR(SISIOADDRESS, unsigned short, unsigned short);
 extern void            SiS_SetRegAND(SISIOADDRESS, unsigned short, unsigned short);
 extern void            SiS_DisplayOff(struct SiS_Private *SiS_Pr);
 extern void            SiS_DisplayOn(struct SiS_Private *SiS_Pr);
-extern BOOLEAN         SiS_SearchModeID(struct SiS_Private *, unsigned short *, unsigned short *);
+extern bool            SiS_SearchModeID(struct SiS_Private *, unsigned short *, unsigned short *);
 extern unsigned short  SiS_GetModeFlag(struct SiS_Private *SiS_Pr, unsigned short ModeNo,
                                unsigned short ModeIdIndex);
 extern unsigned short  SiS_GetModePtr(struct SiS_Private *SiS_Pr, unsigned short ModeNo, unsigned short ModeIdIndex);
index c3884a29f4c5a15fd41679cb34363abfaf04b05c..47a33501549d729f8770e8b90441e43ea23774c7 100644 (file)
@@ -38,14 +38,14 @@ int         sisfb_mode_rate_to_dclock(struct SiS_Private *SiS_Pr,
                        unsigned char modeno, unsigned char rateindex);
 int            sisfb_mode_rate_to_ddata(struct SiS_Private *SiS_Pr, unsigned char modeno,
                        unsigned char rateindex, struct fb_var_screeninfo *var);
-BOOLEAN                sisfb_gettotalfrommode(struct SiS_Private *SiS_Pr, unsigned char modeno,
+bool           sisfb_gettotalfrommode(struct SiS_Private *SiS_Pr, unsigned char modeno,
                        int *htotal, int *vtotal, unsigned char rateindex);
 
-extern BOOLEAN SiSInitPtr(struct SiS_Private *SiS_Pr);
-extern BOOLEAN SiS_SearchModeID(struct SiS_Private *SiS_Pr, unsigned short *ModeNo,
+extern bool    SiSInitPtr(struct SiS_Private *SiS_Pr);
+extern bool    SiS_SearchModeID(struct SiS_Private *SiS_Pr, unsigned short *ModeNo,
                        unsigned short *ModeIdIndex);
 extern void    SiS_Generic_ConvertCRData(struct SiS_Private *SiS_Pr, unsigned char *crdata,
-                       int xres, int yres, struct fb_var_screeninfo *var, BOOLEAN writeres);
+                       int xres, int yres, struct fb_var_screeninfo *var, bool writeres);
 
 int
 sisfb_mode_rate_to_dclock(struct SiS_Private *SiS_Pr, unsigned char modeno,
@@ -131,7 +131,7 @@ sisfb_mode_rate_to_ddata(struct SiS_Private *SiS_Pr, unsigned char modeno,
                        (unsigned char *)&SiS_Pr->SiS_CRT1Table[index].CR[0],
                        SiS_Pr->SiS_RefIndex[RRTI].XRes,
                        SiS_Pr->SiS_RefIndex[RRTI].YRes,
-                       var, FALSE);
+                       var, false);
 
     if(SiS_Pr->SiS_RefIndex[RRTI].Ext_InfoFlag & 0x8000)
        var->sync &= ~FB_SYNC_VERT_HIGH_ACT;
@@ -175,7 +175,7 @@ sisfb_mode_rate_to_ddata(struct SiS_Private *SiS_Pr, unsigned char modeno,
     return 1;
 }
 
-BOOLEAN
+bool
 sisfb_gettotalfrommode(struct SiS_Private *SiS_Pr, unsigned char modeno, int *htotal,
                        int *vtotal, unsigned char rateindex)
 {
@@ -184,7 +184,7 @@ sisfb_gettotalfrommode(struct SiS_Private *SiS_Pr, unsigned char modeno, int *ht
     unsigned short RRTI = 0;
     unsigned char  sr_data, cr_data, cr_data2;
 
-    if(!SiSInitPtr(SiS_Pr)) return FALSE;
+    if(!SiSInitPtr(SiS_Pr)) return false;
 
     if(rateindex > 0) rateindex--;
 
@@ -195,7 +195,7 @@ sisfb_gettotalfrommode(struct SiS_Private *SiS_Pr, unsigned char modeno, int *ht
     }
 #endif
 
-    if(!(SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex))) return FALSE;
+    if(!(SiS_SearchModeID(SiS_Pr, &ModeNo, &ModeIdIndex))) return false;
 
     RRTI = SiS_Pr->SiS_EModeIDTable[ModeIdIndex].REFindex;
     if(SiS_Pr->SiS_RefIndex[RRTI].Ext_InfoFlag & HaveWideTiming) {
@@ -226,7 +226,7 @@ sisfb_gettotalfrommode(struct SiS_Private *SiS_Pr, unsigned char modeno, int *ht
     if(SiS_Pr->SiS_RefIndex[RRTI].Ext_InfoFlag & InterlaceMode)
        *vtotal *= 2;
 
-    return TRUE;
+    return true;
 }
 
 
index a259446ca7fe3f883afb49fee8f67dd787b936d2..7d5ee2145e21440af006df7e259e8aa77cef3184 100644 (file)
@@ -526,7 +526,7 @@ struct sis_video_info {
                u16 vmax;
                u32 dclockmax;
                u8  feature;
-               BOOLEAN datavalid;
+               bool datavalid;
        }               sisfb_thismonitor;
 
        unsigned short  chip_id;        /* PCI ID of chip */
index baaf495a0a6dff7513fd1c054ec8551d59d09910..01197d7402174a113ad103f40c2197be1c809d6d 100644 (file)
@@ -110,7 +110,7 @@ sisfb_setdefaultparms(void)
 /* ------------- Parameter parsing -------------- */
 
 static void __devinit
-sisfb_search_vesamode(unsigned int vesamode, BOOLEAN quiet)
+sisfb_search_vesamode(unsigned int vesamode, bool quiet)
 {
        int i = 0, j = 0;
 
@@ -150,7 +150,7 @@ sisfb_search_vesamode(unsigned int vesamode, BOOLEAN quiet)
 }
 
 static void __devinit
-sisfb_search_mode(char *name, BOOLEAN quiet)
+sisfb_search_mode(char *name, bool quiet)
 {
        unsigned int j = 0, xres = 0, yres = 0, depth = 0, rate = 0;
        int i = 0;
@@ -251,7 +251,7 @@ sisfb_get_vga_mode_from_kernel(void)
                        "sisfb: Using vga mode %s pre-set by kernel as default\n",
                        mymode);
 
-               sisfb_search_mode(mymode, TRUE);
+               sisfb_search_mode(mymode, true);
        }
 #endif
        return;
@@ -307,7 +307,7 @@ static void __init
 sisfb_search_specialtiming(const char *name)
 {
        int i = 0;
-       BOOLEAN found = FALSE;
+       bool found = false;
 
        /* We don't know the hardware specs yet and there is no ivideo */
 
@@ -322,7 +322,7 @@ sisfb_search_specialtiming(const char *name)
                        if(!strnicmp(name,mycustomttable[i].optionName,
                           strlen(mycustomttable[i].optionName))) {
                                sisfb_specialtiming = mycustomttable[i].SpecialID;
-                               found = TRUE;
+                               found = true;
                                printk(KERN_INFO "sisfb: Special timing for %s %s forced (\"%s\")\n",
                                        mycustomttable[i].vendorName,
                                        mycustomttable[i].cardName,
@@ -353,7 +353,7 @@ sisfb_detect_custom_timing(struct sis_video_info *ivideo)
 {
        unsigned char *biosver = NULL;
        unsigned char *biosdate = NULL;
-       BOOLEAN footprint;
+       bool footprint;
        u32 chksum = 0;
        int i, j;
 
@@ -380,16 +380,16 @@ sisfb_detect_custom_timing(struct sis_video_info *ivideo)
                      (mycustomttable[i].bioschksum == chksum)))                &&
                    (mycustomttable[i].pcisubsysvendor == ivideo->subsysvendor) &&
                    (mycustomttable[i].pcisubsyscard == ivideo->subsysdevice) ) {
-                       footprint = TRUE;
+                       footprint = true;
                        for(j = 0; j < 5; j++) {
                                if(mycustomttable[i].biosFootprintAddr[j]) {
                                        if(ivideo->SiS_Pr.UseROM) {
                                                if(ivideo->SiS_Pr.VirtualRomBase[mycustomttable[i].biosFootprintAddr[j]] !=
                                                        mycustomttable[i].biosFootprintData[j]) {
-                                                       footprint = FALSE;
+                                                       footprint = false;
                                                }
                                        } else
-                                               footprint = FALSE;
+                                               footprint = false;
                                }
                        }
                        if(footprint) {
@@ -406,7 +406,7 @@ sisfb_detect_custom_timing(struct sis_video_info *ivideo)
        } while(mycustomttable[i].chipID);
 }
 
-static BOOLEAN __devinit
+static bool __devinit
 sisfb_interpret_edid(struct sisfb_monitor *monitor, u8 *buffer)
 {
        int i, j, xres, yres, refresh, index;
@@ -417,13 +417,13 @@ sisfb_interpret_edid(struct sisfb_monitor *monitor, u8 *buffer)
           buffer[4] != 0xff || buffer[5] != 0xff ||
           buffer[6] != 0xff || buffer[7] != 0x00) {
                printk(KERN_DEBUG "sisfb: Bad EDID header\n");
-               return FALSE;
+               return false;
        }
 
        if(buffer[0x12] != 0x01) {
                printk(KERN_INFO "sisfb: EDID version %d not supported\n",
                        buffer[0x12]);
-               return FALSE;
+               return false;
        }
 
        monitor->feature = buffer[0x18];
@@ -449,7 +449,7 @@ sisfb_interpret_edid(struct sisfb_monitor *monitor, u8 *buffer)
                  monitor->vmin = buffer[j + 5];
                  monitor->vmax = buffer[j + 6];
                  monitor->dclockmax = buffer[j + 9] * 10 * 1000;
-                 monitor->datavalid = TRUE;
+                 monitor->datavalid = true;
                  break;
               }
               j += 18;
@@ -501,7 +501,7 @@ sisfb_interpret_edid(struct sisfb_monitor *monitor, u8 *buffer)
              index += 2;
           }
           if((monitor->hmin <= monitor->hmax) && (monitor->vmin <= monitor->vmax)) {
-             monitor->datavalid = TRUE;
+             monitor->datavalid = true;
           }
        }
 
@@ -514,7 +514,7 @@ sisfb_handle_ddc(struct sis_video_info *ivideo, struct sisfb_monitor *monitor, i
        unsigned short temp, i, realcrtno = crtno;
        unsigned char  buffer[256];
 
-       monitor->datavalid = FALSE;
+       monitor->datavalid = false;
 
        if(crtno) {
           if(ivideo->vbflags & CRT2_LCD)      realcrtno = 1;
@@ -563,7 +563,7 @@ sisfb_handle_ddc(struct sis_video_info *ivideo, struct sisfb_monitor *monitor, i
 
 /* -------------- Mode validation --------------- */
 
-static BOOLEAN
+static bool
 sisfb_verify_rate(struct sis_video_info *ivideo, struct sisfb_monitor *monitor,
                int mode_idx, int rate_idx, int rate)
 {
@@ -571,10 +571,10 @@ sisfb_verify_rate(struct sis_video_info *ivideo, struct sisfb_monitor *monitor,
        unsigned int dclock, hsync;
 
        if(!monitor->datavalid)
-               return TRUE;
+               return true;
 
        if(mode_idx < 0)
-               return FALSE;
+               return false;
 
        /* Skip for 320x200, 320x240, 640x400 */
        switch(sisbios_mode[mode_idx].mode_no[ivideo->mni]) {
@@ -587,34 +587,34 @@ sisfb_verify_rate(struct sis_video_info *ivideo, struct sisfb_monitor *monitor,
        case 0x2f:
        case 0x5d:
        case 0x5e:
-               return TRUE;
+               return true;
 #ifdef CONFIG_FB_SIS_315
        case 0x5a:
        case 0x5b:
-               if(ivideo->sisvga_engine == SIS_315_VGA) return TRUE;
+               if(ivideo->sisvga_engine == SIS_315_VGA) return true;
 #endif
        }
 
        if(rate < (monitor->vmin - 1))
-               return FALSE;
+               return false;
        if(rate > (monitor->vmax + 1))
-               return FALSE;
+               return false;
 
        if(sisfb_gettotalfrommode(&ivideo->SiS_Pr,
                                  sisbios_mode[mode_idx].mode_no[ivideo->mni],
                                  &htotal, &vtotal, rate_idx)) {
                dclock = (htotal * vtotal * rate) / 1000;
                if(dclock > (monitor->dclockmax + 1000))
-                       return FALSE;
+                       return false;
                hsync = dclock / htotal;
                if(hsync < (monitor->hmin - 1))
-                       return FALSE;
+                       return false;
                if(hsync > (monitor->hmax + 1))
-                       return FALSE;
+                       return false;
         } else {
-               return FALSE;
+               return false;
        }
-       return TRUE;
+       return true;
 }
 
 static int
@@ -732,49 +732,49 @@ sisfb_search_refresh_rate(struct sis_video_info *ivideo, unsigned int rate, int
        }
 }
 
-static BOOLEAN
+static bool
 sisfb_bridgeisslave(struct sis_video_info *ivideo)
 {
        unsigned char P1_00;
 
        if(!(ivideo->vbflags2 & VB2_VIDEOBRIDGE))
-               return FALSE;
+               return false;
 
        inSISIDXREG(SISPART1,0x00,P1_00);
        if( ((ivideo->sisvga_engine == SIS_300_VGA) && (P1_00 & 0xa0) == 0x20) ||
            ((ivideo->sisvga_engine == SIS_315_VGA) && (P1_00 & 0x50) == 0x10) ) {
-               return TRUE;
+               return true;
        } else {
-               return FALSE;
+               return false;
        }
 }
 
-static BOOLEAN
+static bool
 sisfballowretracecrt1(struct sis_video_info *ivideo)
 {
        u8 temp;
 
        inSISIDXREG(SISCR,0x17,temp);
        if(!(temp & 0x80))
-               return FALSE;
+               return false;
 
        inSISIDXREG(SISSR,0x1f,temp);
        if(temp & 0xc0)
-               return FALSE;
+               return false;
 
-       return TRUE;
+       return true;
 }
 
-static BOOLEAN
+static bool
 sisfbcheckvretracecrt1(struct sis_video_info *ivideo)
 {
        if(!sisfballowretracecrt1(ivideo))
-               return FALSE;
+               return false;
 
        if(inSISREG(SISINPSTAT) & 0x08)
-               return TRUE;
+               return true;
        else
-               return FALSE;
+               return false;
 }
 
 static void
@@ -791,7 +791,7 @@ sisfbwaitretracecrt1(struct sis_video_info *ivideo)
        while((inSISREG(SISINPSTAT) & 0x08) && --watchdog);
 }
 
-static BOOLEAN
+static bool
 sisfbcheckvretracecrt2(struct sis_video_info *ivideo)
 {
        unsigned char temp, reg;
@@ -799,17 +799,17 @@ sisfbcheckvretracecrt2(struct sis_video_info *ivideo)
        switch(ivideo->sisvga_engine) {
        case SIS_300_VGA: reg = 0x25; break;
        case SIS_315_VGA: reg = 0x30; break;
-       default:          return FALSE;
+       default:          return false;
        }
 
        inSISIDXREG(SISPART1, reg, temp);
        if(temp & 0x02)
-               return TRUE;
+               return true;
        else
-               return FALSE;
+               return false;
 }
 
-static BOOLEAN
+static bool
 sisfb_CheckVBRetrace(struct sis_video_info *ivideo)
 {
        if(ivideo->currentvbflags & VB_DISPTYPE_DISP2) {
@@ -874,7 +874,7 @@ static int
 sisfb_myblank(struct sis_video_info *ivideo, int blank)
 {
        u8 sr01, sr11, sr1f, cr63=0, p2_0, p1_13;
-       BOOLEAN backlight = TRUE;
+       bool backlight = true;
 
        switch(blank) {
                case FB_BLANK_UNBLANK:  /* on */
@@ -884,7 +884,7 @@ sisfb_myblank(struct sis_video_info *ivideo, int blank)
                        cr63  = 0x00;
                        p2_0  = 0x20;
                        p1_13 = 0x00;
-                       backlight = TRUE;
+                       backlight = true;
                        break;
                case FB_BLANK_NORMAL:   /* blank */
                        sr01  = 0x20;
@@ -893,7 +893,7 @@ sisfb_myblank(struct sis_video_info *ivideo, int blank)
                        cr63  = 0x00;
                        p2_0  = 0x20;
                        p1_13 = 0x00;
-                       backlight = TRUE;
+                       backlight = true;
                        break;
                case FB_BLANK_VSYNC_SUSPEND:    /* no vsync */
                        sr01  = 0x20;
@@ -902,7 +902,7 @@ sisfb_myblank(struct sis_video_info *ivideo, int blank)
                        cr63  = 0x40;
                        p2_0  = 0x40;
                        p1_13 = 0x80;
-                       backlight = FALSE;
+                       backlight = false;
                        break;
                case FB_BLANK_HSYNC_SUSPEND:    /* no hsync */
                        sr01  = 0x20;
@@ -911,7 +911,7 @@ sisfb_myblank(struct sis_video_info *ivideo, int blank)
                        cr63  = 0x40;
                        p2_0  = 0x80;
                        p1_13 = 0x40;
-                       backlight = FALSE;
+                       backlight = false;
                        break;
                case FB_BLANK_POWERDOWN:        /* off */
                        sr01  = 0x20;
@@ -920,7 +920,7 @@ sisfb_myblank(struct sis_video_info *ivideo, int blank)
                        cr63  = 0x40;
                        p2_0  = 0xc0;
                        p1_13 = 0xc0;
-                       backlight = FALSE;
+                       backlight = false;
                        break;
                default:
                        return 1;
@@ -1109,11 +1109,11 @@ sisfb_calc_pitch(struct sis_video_info *ivideo, struct fb_var_screeninfo *var)
 static void
 sisfb_set_pitch(struct sis_video_info *ivideo)
 {
-       BOOLEAN isslavemode = FALSE;
+       bool isslavemode = false;
        unsigned short HDisplay1 = ivideo->scrnpitchCRT1 >> 3;
        unsigned short HDisplay2 = ivideo->video_linelength >> 3;
 
-       if(sisfb_bridgeisslave(ivideo)) isslavemode = TRUE;
+       if(sisfb_bridgeisslave(ivideo)) isslavemode = true;
 
        /* We need to set pitch for CRT1 if bridge is in slave mode, too */
        if((ivideo->currentvbflags & VB_DISPTYPE_DISP1) || (isslavemode)) {
@@ -1178,7 +1178,7 @@ sisfb_set_mode(struct sis_video_info *ivideo, int clrscrn)
 
        sisfb_pre_setmode(ivideo);
 
-       if(SiSSetMode(&ivideo->SiS_Pr, modeno) == 0) {
+       if(!SiSSetMode(&ivideo->SiS_Pr, modeno)) {
                printk(KERN_ERR "sisfb: Setting mode[0x%x] failed\n", ivideo->mode_no);
                return -EINVAL;
        }
@@ -1446,7 +1446,7 @@ sisfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
        unsigned int drate = 0, hrate = 0, maxyres;
        int found_mode = 0;
        int refresh_rate, search_idx, tidx;
-       BOOLEAN recalc_clock = FALSE;
+       bool recalc_clock = false;
        u32 pixclock;
 
        htotal = var->left_margin + var->xres + var->right_margin + var->hsync_len;
@@ -1524,7 +1524,7 @@ sisfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
            (var->bits_per_pixel == 8) ) {
                /* Slave modes on LVDS and 301B-DH */
                refresh_rate = 60;
-               recalc_clock = TRUE;
+               recalc_clock = true;
        } else if( (ivideo->current_htotal == htotal) &&
                   (ivideo->current_vtotal == vtotal) &&
                   (ivideo->current_pixclock == pixclock) ) {
@@ -1545,17 +1545,17 @@ sisfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
                } else {
                        refresh_rate = 60;
                }
-               recalc_clock = TRUE;
+               recalc_clock = true;
        } else if((pixclock) && (htotal) && (vtotal)) {
                drate = 1000000000 / pixclock;
                hrate = (drate * 1000) / htotal;
                refresh_rate = (unsigned int) (hrate * 2 / vtotal);
        } else if(ivideo->current_refresh_rate) {
                refresh_rate = ivideo->current_refresh_rate;
-               recalc_clock = TRUE;
+               recalc_clock = true;
        } else {
                refresh_rate = 60;
-               recalc_clock = TRUE;
+               recalc_clock = true;
        }
 
        myrateindex = sisfb_search_refresh_rate(ivideo, refresh_rate, search_idx);
@@ -2181,7 +2181,7 @@ sisfb_detect_VB_connect(struct sis_video_info *ivideo)
 
 /* ------------------ Sensing routines ------------------ */
 
-static BOOLEAN __devinit
+static bool __devinit
 sisfb_test_DDC1(struct sis_video_info *ivideo)
 {
     unsigned short old;
@@ -2191,13 +2191,13 @@ sisfb_test_DDC1(struct sis_video_info *ivideo)
     do {
        if(old != SiS_ReadDDC1Bit(&ivideo->SiS_Pr)) break;
     } while(count--);
-    return (count == -1) ? FALSE : TRUE;
+    return (count != -1);
 }
 
 static void __devinit
 sisfb_sense_crt1(struct sis_video_info *ivideo)
 {
-    BOOLEAN mustwait = FALSE;
+    bool mustwait = false;
     u8  sr1F, cr17;
 #ifdef CONFIG_FB_SIS_315
     u8  cr63=0;
@@ -2208,7 +2208,7 @@ sisfb_sense_crt1(struct sis_video_info *ivideo)
     inSISIDXREG(SISSR,0x1F,sr1F);
     orSISIDXREG(SISSR,0x1F,0x04);
     andSISIDXREG(SISSR,0x1F,0x3F);
-    if(sr1F & 0xc0) mustwait = TRUE;
+    if(sr1F & 0xc0) mustwait = true;
 
 #ifdef CONFIG_FB_SIS_315
     if(ivideo->sisvga_engine == SIS_315_VGA) {
@@ -2222,7 +2222,7 @@ sisfb_sense_crt1(struct sis_video_info *ivideo)
     cr17 &= 0x80;
     if(!cr17) {
        orSISIDXREG(SISCR,0x17,0x80);
-       mustwait = TRUE;
+       mustwait = true;
        outSISIDXREG(SISSR, 0x00, 0x01);
        outSISIDXREG(SISSR, 0x00, 0x03);
     }
@@ -2284,7 +2284,7 @@ SiS_SenseLCD(struct sis_video_info *ivideo)
        u8 reg, cr37 = 0, paneltype = 0;
        u16 xres, yres;
 
-       ivideo->SiS_Pr.PanelSelfDetected = FALSE;
+       ivideo->SiS_Pr.PanelSelfDetected = false;
 
        /* LCD detection only for TMDS bridges */
        if(!(ivideo->vbflags2 & VB2_SISTMDSBRIDGE))
@@ -2361,7 +2361,7 @@ SiS_SenseLCD(struct sis_video_info *ivideo)
        setSISIDXREG(SISCR, 0x37, 0x0c, cr37);
        orSISIDXREG(SISCR, 0x32, 0x08);
 
-       ivideo->SiS_Pr.PanelSelfDetected = TRUE;
+       ivideo->SiS_Pr.PanelSelfDetected = true;
 }
 
 static int __devinit
@@ -3016,7 +3016,7 @@ sisfb_save_pdc_emi(struct sis_video_info *ivideo)
                        int tmp;
                        inSISIDXREG(SISPART1,0x13,tmp);
                        if(tmp & 0x04) {
-                               ivideo->SiS_Pr.SiS_UseLCDA = TRUE;
+                               ivideo->SiS_Pr.SiS_UseLCDA = true;
                                ivideo->detectedlcda = 0x03;
                        }
                }
@@ -3071,9 +3071,9 @@ sisfb_save_pdc_emi(struct sis_video_info *ivideo)
                                inSISIDXREG(SISPART4,0x31,ivideo->SiS_Pr.EMI_31);
                                inSISIDXREG(SISPART4,0x32,ivideo->SiS_Pr.EMI_32);
                                inSISIDXREG(SISPART4,0x33,ivideo->SiS_Pr.EMI_33);
-                               ivideo->SiS_Pr.HaveEMI = TRUE;
+                               ivideo->SiS_Pr.HaveEMI = true;
                                if((tmp & 0x20) || (ivideo->detectedlcda != 0xff)) {
-                                       ivideo->SiS_Pr.HaveEMILCD = TRUE;
+                                       ivideo->SiS_Pr.HaveEMILCD = true;
                                }
                        }
                }
@@ -3558,8 +3558,8 @@ sisfb_pre_setmode(struct sis_video_info *ivideo)
        }
 #endif
 
-       SiS_SetEnableDstn(&ivideo->SiS_Pr, FALSE);
-       SiS_SetEnableFstn(&ivideo->SiS_Pr, FALSE);
+       SiS_SetEnableDstn(&ivideo->SiS_Pr, false);
+       SiS_SetEnableFstn(&ivideo->SiS_Pr, false);
        ivideo->curFSTN = ivideo->curDSTN = 0;
 
        switch(ivideo->currentvbflags & VB_DISPTYPE_DISP2) {
@@ -3814,8 +3814,8 @@ sisfb_set_TVyposoffset(struct sis_video_info *ivideo, int val)
 static void
 sisfb_post_setmode(struct sis_video_info *ivideo)
 {
-       BOOLEAN crt1isoff = FALSE;
-       BOOLEAN doit = TRUE;
+       bool crt1isoff = false;
+       bool doit = true;
 #if defined(CONFIG_FB_SIS_300) || defined(CONFIG_FB_SIS_315)
        u8 reg;
 #endif
@@ -3834,17 +3834,17 @@ sisfb_post_setmode(struct sis_video_info *ivideo)
 
        /* We can't switch off CRT1 if bridge is in slave mode */
        if(ivideo->vbflags2 & VB2_VIDEOBRIDGE) {
-               if(sisfb_bridgeisslave(ivideo)) doit = FALSE;
+               if(sisfb_bridgeisslave(ivideo)) doit = false;
        } else
                ivideo->sisfb_crt1off = 0;
 
 #ifdef CONFIG_FB_SIS_300
        if(ivideo->sisvga_engine == SIS_300_VGA) {
                if((ivideo->sisfb_crt1off) && (doit)) {
-                       crt1isoff = TRUE;
+                       crt1isoff = true;
                        reg = 0x00;
                } else {
-                       crt1isoff = FALSE;
+                       crt1isoff = false;
                        reg = 0x80;
                }
                setSISIDXREG(SISCR, 0x17, 0x7f, reg);
@@ -3853,11 +3853,11 @@ sisfb_post_setmode(struct sis_video_info *ivideo)
 #ifdef CONFIG_FB_SIS_315
        if(ivideo->sisvga_engine == SIS_315_VGA) {
                if((ivideo->sisfb_crt1off) && (doit)) {
-                       crt1isoff = TRUE;
+                       crt1isoff = true;
                        reg  = 0x40;
                        reg1 = 0xc0;
                } else {
-                       crt1isoff = FALSE;
+                       crt1isoff = false;
                        reg  = 0x00;
                        reg1 = 0x00;
                }
@@ -4004,9 +4004,9 @@ sisfb_setup(char *options)
                } else if(!strnicmp(this_opt, "tvstandard:",11)) {
                        sisfb_search_tvstd(this_opt + 11);
                } else if(!strnicmp(this_opt, "mode:", 5)) {
-                       sisfb_search_mode(this_opt + 5, FALSE);
+                       sisfb_search_mode(this_opt + 5, false);
                } else if(!strnicmp(this_opt, "vesa:", 5)) {
-                       sisfb_search_vesamode(simple_strtoul(this_opt + 5, NULL, 0), FALSE);
+                       sisfb_search_vesamode(simple_strtoul(this_opt + 5, NULL, 0), false);
                } else if(!strnicmp(this_opt, "rate:", 5)) {
                        sisfb_parm_rate = simple_strtoul(this_opt + 5, NULL, 0);
                } else if(!strnicmp(this_opt, "forcecrt1:", 10)) {
@@ -4062,7 +4062,7 @@ sisfb_setup(char *options)
                           sisfb_lvdshl = temp;
                        }
                } else if(this_opt[0] >= '0' && this_opt[0] <= '9') {
-                       sisfb_search_mode(this_opt, TRUE);
+                       sisfb_search_mode(this_opt, true);
 #if !defined(__i386__) && !defined(__x86_64__)
                } else if(!strnicmp(this_opt, "resetcard", 9)) {
                        sisfb_resetcard = 1;
@@ -4564,9 +4564,9 @@ sisfb_post_sis300(struct pci_dev *pdev)
        sisfb_sense_crt1(ivideo);
 
        /* Set default mode, don't clear screen */
-       ivideo->SiS_Pr.SiS_UseOEM = FALSE;
-       SiS_SetEnableDstn(&ivideo->SiS_Pr, FALSE);
-       SiS_SetEnableFstn(&ivideo->SiS_Pr, FALSE);
+       ivideo->SiS_Pr.SiS_UseOEM = false;
+       SiS_SetEnableDstn(&ivideo->SiS_Pr, false);
+       SiS_SetEnableFstn(&ivideo->SiS_Pr, false);
        ivideo->curFSTN = ivideo->curDSTN = 0;
        ivideo->SiS_Pr.VideoMemorySize = 8 << 20;
        SiSSetMode(&ivideo->SiS_Pr, 0x2e | 0x80);
@@ -5680,9 +5680,9 @@ sisfb_post_xgi(struct pci_dev *pdev)
        } else {
 
                /* Set default mode, don't clear screen */
-               ivideo->SiS_Pr.SiS_UseOEM = FALSE;
-               SiS_SetEnableDstn(&ivideo->SiS_Pr, FALSE);
-               SiS_SetEnableFstn(&ivideo->SiS_Pr, FALSE);
+               ivideo->SiS_Pr.SiS_UseOEM = false;
+               SiS_SetEnableDstn(&ivideo->SiS_Pr, false);
+               SiS_SetEnableFstn(&ivideo->SiS_Pr, false);
                ivideo->curFSTN = ivideo->curDSTN = 0;
                ivideo->SiS_Pr.VideoMemorySize = 8 << 20;
                SiSSetMode(&ivideo->SiS_Pr, 0x2e | 0x80);
@@ -5723,9 +5723,9 @@ sisfb_post_xgi(struct pci_dev *pdev)
        }
 
        /* Set default mode, don't clear screen */
-       ivideo->SiS_Pr.SiS_UseOEM = FALSE;
-       SiS_SetEnableDstn(&ivideo->SiS_Pr, FALSE);
-       SiS_SetEnableFstn(&ivideo->SiS_Pr, FALSE);
+       ivideo->SiS_Pr.SiS_UseOEM = false;
+       SiS_SetEnableDstn(&ivideo->SiS_Pr, false);
+       SiS_SetEnableFstn(&ivideo->SiS_Pr, false);
        ivideo->curFSTN = ivideo->curDSTN = 0;
        SiSSetMode(&ivideo->SiS_Pr, 0x2e | 0x80);
 
@@ -5819,7 +5819,7 @@ sisfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        ivideo->detectedpdca = 0xff;
        ivideo->detectedlcda = 0xff;
 
-       ivideo->sisfb_thismonitor.datavalid = FALSE;
+       ivideo->sisfb_thismonitor.datavalid = false;
 
        ivideo->current_base = 0;
 
@@ -5871,21 +5871,21 @@ sisfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        ivideo->SiS_Pr.SiS_Backup70xx = 0xff;
        ivideo->SiS_Pr.SiS_CHOverScan = -1;
-       ivideo->SiS_Pr.SiS_ChSW = FALSE;
-       ivideo->SiS_Pr.SiS_UseLCDA = FALSE;
-       ivideo->SiS_Pr.HaveEMI = FALSE;
-       ivideo->SiS_Pr.HaveEMILCD = FALSE;
-       ivideo->SiS_Pr.OverruleEMI = FALSE;
-       ivideo->SiS_Pr.SiS_SensibleSR11 = FALSE;
+       ivideo->SiS_Pr.SiS_ChSW = false;
+       ivideo->SiS_Pr.SiS_UseLCDA = false;
+       ivideo->SiS_Pr.HaveEMI = false;
+       ivideo->SiS_Pr.HaveEMILCD = false;
+       ivideo->SiS_Pr.OverruleEMI = false;
+       ivideo->SiS_Pr.SiS_SensibleSR11 = false;
        ivideo->SiS_Pr.SiS_MyCR63 = 0x63;
        ivideo->SiS_Pr.PDC  = -1;
        ivideo->SiS_Pr.PDCA = -1;
-       ivideo->SiS_Pr.DDCPortMixup = FALSE;
+       ivideo->SiS_Pr.DDCPortMixup = false;
 #ifdef CONFIG_FB_SIS_315
        if(ivideo->chip >= SIS_330) {
                ivideo->SiS_Pr.SiS_MyCR63 = 0x53;
                if(ivideo->chip >= SIS_661) {
-                       ivideo->SiS_Pr.SiS_SensibleSR11 = TRUE;
+                       ivideo->SiS_Pr.SiS_SensibleSR11 = true;
                }
        }
 #endif
@@ -5969,7 +5969,7 @@ sisfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                do {
                        if(mychswtable[i].subsysVendor == ivideo->subsysvendor &&
                           mychswtable[i].subsysCard   == ivideo->subsysdevice) {
-                               ivideo->SiS_Pr.SiS_ChSW = TRUE;
+                               ivideo->SiS_Pr.SiS_ChSW = true;
                                printk(KERN_DEBUG "sisfb: Identified [%s %s] "
                                        "requiring Chrontel/GPIO setup\n",
                                        mychswtable[i].vendorName,
@@ -6018,20 +6018,20 @@ sisfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        /* Search and copy ROM image */
        ivideo->bios_abase = NULL;
        ivideo->SiS_Pr.VirtualRomBase = NULL;
-       ivideo->SiS_Pr.UseROM = FALSE;
-       ivideo->haveXGIROM = ivideo->SiS_Pr.SiS_XGIROM = FALSE;
+       ivideo->SiS_Pr.UseROM = false;
+       ivideo->haveXGIROM = ivideo->SiS_Pr.SiS_XGIROM = false;
        if(ivideo->sisfb_userom) {
                ivideo->SiS_Pr.VirtualRomBase = sisfb_find_rom(pdev);
                ivideo->bios_abase = ivideo->SiS_Pr.VirtualRomBase;
-               ivideo->SiS_Pr.UseROM = (ivideo->SiS_Pr.VirtualRomBase) ? TRUE : FALSE;
+               ivideo->SiS_Pr.UseROM = (bool)(ivideo->SiS_Pr.VirtualRomBase);
                printk(KERN_INFO "sisfb: Video ROM %sfound\n",
                        ivideo->SiS_Pr.UseROM ? "" : "not ");
                if((ivideo->SiS_Pr.UseROM) && (ivideo->chip >= XGI_20)) {
-                  ivideo->SiS_Pr.UseROM = FALSE;
-                  ivideo->haveXGIROM = ivideo->SiS_Pr.SiS_XGIROM = TRUE;
+                  ivideo->SiS_Pr.UseROM = false;
+                  ivideo->haveXGIROM = ivideo->SiS_Pr.SiS_XGIROM = true;
                   if( (ivideo->revision_id == 2) &&
                       (!(ivideo->bios_abase[0x1d1] & 0x01)) ) {
-                       ivideo->SiS_Pr.DDCPortMixup = TRUE;
+                       ivideo->SiS_Pr.DDCPortMixup = true;
                   }
                }
        } else {
@@ -6677,9 +6677,9 @@ static int __init sisfb_init_module(void)
                sisfb_search_tvstd(tvstandard);
 
        if(mode)
-               sisfb_search_mode(mode, FALSE);
+               sisfb_search_mode(mode, false);
        else if(vesa != -1)
-               sisfb_search_vesamode(vesa, FALSE);
+               sisfb_search_vesamode(vesa, false);
 
        sisfb_crt1off = (crt1off == 0) ? 1 : 0;
 
index 88e4f1e414706cb444568c6adc390f4f5131cdd5..3e3b7fa05d6c3d27ff54dc8bfc2d18f702069a57 100644 (file)
@@ -411,54 +411,54 @@ static const struct _sis_vrate {
        u16 xres;
        u16 yres;
        u16 refresh;
-       BOOLEAN SiS730valid32bpp;
+       bool SiS730valid32bpp;
 } sisfb_vrate[] = {
-       {1,  320,  200,  70,  TRUE},
-       {1,  320,  240,  60,  TRUE},
-       {1,  400,  300,  60,  TRUE},
-       {1,  512,  384,  60,  TRUE},
-       {1,  640,  400,  72,  TRUE},
-       {1,  640,  480,  60,  TRUE}, {2,  640,  480,  72,  TRUE}, {3,  640,  480,  75,  TRUE},
-       {4,  640,  480,  85,  TRUE}, {5,  640,  480, 100,  TRUE}, {6,  640,  480, 120,  TRUE},
-       {7,  640,  480, 160,  TRUE}, {8,  640,  480, 200,  TRUE},
-       {1,  720,  480,  60,  TRUE},
-       {1,  720,  576,  58,  TRUE},
-       {1,  768,  576,  58,  TRUE},
-       {1,  800,  480,  60,  TRUE}, {2,  800,  480,  75,  TRUE}, {3,  800,  480,  85,  TRUE},
-       {1,  800,  600,  56,  TRUE}, {2,  800,  600,  60,  TRUE}, {3,  800,  600,  72,  TRUE},
-       {4,  800,  600,  75,  TRUE}, {5,  800,  600,  85,  TRUE}, {6,  800,  600, 105,  TRUE},
-       {7,  800,  600, 120,  TRUE}, {8,  800,  600, 160,  TRUE},
-       {1,  848,  480,  39,  TRUE}, {2,  848,  480,  60,  TRUE},
-       {1,  856,  480,  39,  TRUE}, {2,  856,  480,  60,  TRUE},
-       {1,  960,  540,  60,  TRUE},
-       {1,  960,  600,  60,  TRUE},
-       {1, 1024,  576,  60,  TRUE}, {2, 1024,  576,  75,  TRUE}, {3, 1024,  576,  85,  TRUE},
-       {1, 1024,  600,  60,  TRUE},
-       {1, 1024,  768,  43,  TRUE}, {2, 1024,  768,  60,  TRUE}, {3, 1024,  768,  70, FALSE},
-       {4, 1024,  768,  75, FALSE}, {5, 1024,  768,  85,  TRUE}, {6, 1024,  768, 100,  TRUE},
-       {7, 1024,  768, 120,  TRUE},
-       {1, 1152,  768,  60,  TRUE},
-       {1, 1152,  864,  60,  TRUE}, {2, 1152,  864,  75,  TRUE}, {3, 1152,  864,  84,  TRUE},
-       {1, 1280,  720,  60,  TRUE}, {2, 1280,  720,  75,  TRUE}, {3, 1280,  720,  85,  TRUE},
-       {1, 1280,  768,  60,  TRUE},
-       {1, 1280,  800,  60,  TRUE},
-       {1, 1280,  854,  60,  TRUE},
-       {1, 1280,  960,  60,  TRUE}, {2, 1280,  960,  85,  TRUE},
-       {1, 1280, 1024,  43,  TRUE}, {2, 1280, 1024,  60,  TRUE}, {3, 1280, 1024,  75,  TRUE},
-       {4, 1280, 1024,  85,  TRUE},
-       {1, 1360,  768,  60,  TRUE},
-       {1, 1360, 1024,  59,  TRUE},
-       {1, 1400, 1050,  60,  TRUE}, {2, 1400, 1050,  75,  TRUE},
-       {1, 1600, 1200,  60,  TRUE}, {2, 1600, 1200,  65,  TRUE}, {3, 1600, 1200,  70,  TRUE},
-       {4, 1600, 1200,  75,  TRUE}, {5, 1600, 1200,  85,  TRUE}, {6, 1600, 1200, 100,  TRUE},
-       {7, 1600, 1200, 120,  TRUE},
-       {1, 1680, 1050,  60,  TRUE},
-       {1, 1920, 1080,  30,  TRUE},
-       {1, 1920, 1440,  60,  TRUE}, {2, 1920, 1440,  65,  TRUE}, {3, 1920, 1440,  70,  TRUE},
-       {4, 1920, 1440,  75,  TRUE}, {5, 1920, 1440,  85,  TRUE}, {6, 1920, 1440, 100,  TRUE},
-       {1, 2048, 1536,  60,  TRUE}, {2, 2048, 1536,  65,  TRUE}, {3, 2048, 1536,  70,  TRUE},
-       {4, 2048, 1536,  75,  TRUE}, {5, 2048, 1536,  85,  TRUE},
-       {0,    0,    0,   0, FALSE}
+       {1,  320,  200,  70,  true},
+       {1,  320,  240,  60,  true},
+       {1,  400,  300,  60,  true},
+       {1,  512,  384,  60,  true},
+       {1,  640,  400,  72,  true},
+       {1,  640,  480,  60,  true}, {2,  640,  480,  72,  true}, {3,  640,  480,  75,  true},
+       {4,  640,  480,  85,  true}, {5,  640,  480, 100,  true}, {6,  640,  480, 120,  true},
+       {7,  640,  480, 160,  true}, {8,  640,  480, 200,  true},
+       {1,  720,  480,  60,  true},
+       {1,  720,  576,  58,  true},
+       {1,  768,  576,  58,  true},
+       {1,  800,  480,  60,  true}, {2,  800,  480,  75,  true}, {3,  800,  480,  85,  true},
+       {1,  800,  600,  56,  true}, {2,  800,  600,  60,  true}, {3,  800,  600,  72,  true},
+       {4,  800,  600,  75,  true}, {5,  800,  600,  85,  true}, {6,  800,  600, 105,  true},
+       {7,  800,  600, 120,  true}, {8,  800,  600, 160,  true},
+       {1,  848,  480,  39,  true}, {2,  848,  480,  60,  true},
+       {1,  856,  480,  39,  true}, {2,  856,  480,  60,  true},
+       {1,  960,  540,  60,  true},
+       {1,  960,  600,  60,  true},
+       {1, 1024,  576,  60,  true}, {2, 1024,  576,  75,  true}, {3, 1024,  576,  85,  true},
+       {1, 1024,  600,  60,  true},
+       {1, 1024,  768,  43,  true}, {2, 1024,  768,  60,  true}, {3, 1024,  768,  70, false},
+       {4, 1024,  768,  75, false}, {5, 1024,  768,  85,  true}, {6, 1024,  768, 100,  true},
+       {7, 1024,  768, 120,  true},
+       {1, 1152,  768,  60,  true},
+       {1, 1152,  864,  60,  true}, {2, 1152,  864,  75,  true}, {3, 1152,  864,  84,  true},
+       {1, 1280,  720,  60,  true}, {2, 1280,  720,  75,  true}, {3, 1280,  720,  85,  true},
+       {1, 1280,  768,  60,  true},
+       {1, 1280,  800,  60,  true},
+       {1, 1280,  854,  60,  true},
+       {1, 1280,  960,  60,  true}, {2, 1280,  960,  85,  true},
+       {1, 1280, 1024,  43,  true}, {2, 1280, 1024,  60,  true}, {3, 1280, 1024,  75,  true},
+       {4, 1280, 1024,  85,  true},
+       {1, 1360,  768,  60,  true},
+       {1, 1360, 1024,  59,  true},
+       {1, 1400, 1050,  60,  true}, {2, 1400, 1050,  75,  true},
+       {1, 1600, 1200,  60,  true}, {2, 1600, 1200,  65,  true}, {3, 1600, 1200,  70,  true},
+       {4, 1600, 1200,  75,  true}, {5, 1600, 1200,  85,  true}, {6, 1600, 1200, 100,  true},
+       {7, 1600, 1200, 120,  true},
+       {1, 1680, 1050,  60,  true},
+       {1, 1920, 1080,  30,  true},
+       {1, 1920, 1440,  60,  true}, {2, 1920, 1440,  65,  true}, {3, 1920, 1440,  70,  true},
+       {4, 1920, 1440,  75,  true}, {5, 1920, 1440,  85,  true}, {6, 1920, 1440, 100,  true},
+       {1, 2048, 1536,  60,  true}, {2, 2048, 1536,  65,  true}, {3, 2048, 1536,  70,  true},
+       {4, 2048, 1536,  75,  true}, {5, 2048, 1536,  85,  true},
+       {0,    0,    0,   0, false}
 };
 
 static struct _sisfbddcsmodes {
@@ -691,7 +691,7 @@ extern int  sisfb_initaccel(struct sis_video_info *ivideo);
 extern void    sisfb_syncaccel(struct sis_video_info *ivideo);
 
 /* Internal general routines */
-static void    sisfb_search_mode(char *name, BOOLEAN quiet);
+static void    sisfb_search_mode(char *name, bool quiet);
 static int     sisfb_validate_mode(struct sis_video_info *ivideo, int modeindex, u32 vbflags);
 static u8      sisfb_search_refresh_rate(struct sis_video_info *ivideo, unsigned int rate,
                                int index);
@@ -702,10 +702,10 @@ static int        sisfb_do_set_var(struct fb_var_screeninfo *var, int isactive,
                                struct fb_info *info);
 static void    sisfb_pre_setmode(struct sis_video_info *ivideo);
 static void    sisfb_post_setmode(struct sis_video_info *ivideo);
-static BOOLEAN sisfb_CheckVBRetrace(struct sis_video_info *ivideo);
-static BOOLEAN sisfbcheckvretracecrt2(struct sis_video_info *ivideo);
-static BOOLEAN sisfbcheckvretracecrt1(struct sis_video_info *ivideo);
-static BOOLEAN sisfb_bridgeisslave(struct sis_video_info *ivideo);
+static bool    sisfb_CheckVBRetrace(struct sis_video_info *ivideo);
+static bool    sisfbcheckvretracecrt2(struct sis_video_info *ivideo);
+static bool    sisfbcheckvretracecrt1(struct sis_video_info *ivideo);
+static bool    sisfb_bridgeisslave(struct sis_video_info *ivideo);
 static void    sisfb_detect_VB_connect(struct sis_video_info *ivideo);
 static void    sisfb_get_VB_type(struct sis_video_info *ivideo);
 static void    sisfb_set_TVxposoffset(struct sis_video_info *ivideo, int val);
@@ -737,20 +737,20 @@ static void               sisfb_free_node(struct SIS_HEAP *memheap, struct SIS_OH *poh);
 
 /* Routines from init.c/init301.c */
 extern unsigned short  SiS_GetModeID_LCD(int VGAEngine, unsigned int VBFlags, int HDisplay,
-                               int VDisplay, int Depth, BOOLEAN FSTN, unsigned short CustomT,
+                               int VDisplay, int Depth, bool FSTN, unsigned short CustomT,
                                int LCDwith, int LCDheight, unsigned int VBFlags2);
 extern unsigned short  SiS_GetModeID_TV(int VGAEngine, unsigned int VBFlags, int HDisplay,
                                int VDisplay, int Depth, unsigned int VBFlags2);
 extern unsigned short  SiS_GetModeID_VGA2(int VGAEngine, unsigned int VBFlags, int HDisplay,
                                int VDisplay, int Depth, unsigned int VBFlags2);
 extern void            SiSRegInit(struct SiS_Private *SiS_Pr, SISIOADDRESS BaseAddr);
-extern BOOLEAN         SiSSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo);
+extern bool            SiSSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo);
 extern void            SiS_SetEnableDstn(struct SiS_Private *SiS_Pr, int enable);
 extern void            SiS_SetEnableFstn(struct SiS_Private *SiS_Pr, int enable);
 
-extern BOOLEAN         SiSDetermineROMLayout661(struct SiS_Private *SiS_Pr);
+extern bool            SiSDetermineROMLayout661(struct SiS_Private *SiS_Pr);
 
-extern BOOLEAN         sisfb_gettotalfrommode(struct SiS_Private *SiS_Pr, unsigned char modeno,
+extern bool            sisfb_gettotalfrommode(struct SiS_Private *SiS_Pr, unsigned char modeno,
                                int *htotal, int *vtotal, unsigned char rateindex);
 extern int             sisfb_mode_rate_to_dclock(struct SiS_Private *SiS_Pr,
                                unsigned char modeno, unsigned char rateindex);
index 05d08b7889a1aca636b516b032341cbade9582a6..b532fbd2b04c1c2612937a030c0f3747ee931199 100644 (file)
 #include <linux/version.h>
 #endif
 
-#ifndef FALSE
-#define FALSE   0
-#endif
-
-#ifndef TRUE
-#define TRUE    1
-#endif
-
-#ifndef BOOLEAN
-typedef unsigned int BOOLEAN;
-#endif
-
 #define SISIOMEMTYPE
 
 #ifdef SIS_LINUX_KERNEL
index 9ae32923c142d08fdc3721f7ee9eda6bf71bf66a..705c85360526138c1fb236a41cf89c7f8f7be446 100644 (file)
@@ -240,7 +240,7 @@ struct SiS_Private
        void                            *ivideo;
 #endif
        unsigned char                   *VirtualRomBase;
-       BOOLEAN                         UseROM;
+       bool                            UseROM;
 #ifdef SIS_LINUX_KERNEL
        unsigned char SISIOMEMTYPE      *VideoMemoryAddress;
        unsigned int                    VideoMemorySize;
@@ -283,24 +283,24 @@ struct SiS_Private
 #ifdef SIS_XORG_XF86
        unsigned short                  SiS_CP1, SiS_CP2, SiS_CP3, SiS_CP4;
 #endif
-       BOOLEAN                         SiS_UseROM;
-       BOOLEAN                         SiS_ROMNew;
-       BOOLEAN                         SiS_XGIROM;
-       BOOLEAN                         SiS_NeedRomModeData;
-       BOOLEAN                         PanelSelfDetected;
-       BOOLEAN                         DDCPortMixup;
+       bool                            SiS_UseROM;
+       bool                            SiS_ROMNew;
+       bool                            SiS_XGIROM;
+       bool                            SiS_NeedRomModeData;
+       bool                            PanelSelfDetected;
+       bool                            DDCPortMixup;
        int                             SiS_CHOverScan;
-       BOOLEAN                         SiS_CHSOverScan;
-       BOOLEAN                         SiS_ChSW;
-       BOOLEAN                         SiS_UseLCDA;
+       bool                            SiS_CHSOverScan;
+       bool                            SiS_ChSW;
+       bool                            SiS_UseLCDA;
        int                             SiS_UseOEM;
        unsigned int                    SiS_CustomT;
        int                             SiS_UseWide, SiS_UseWideCRT2;
        int                             SiS_TVBlue;
        unsigned short                  SiS_Backup70xx;
-       BOOLEAN                         HaveEMI;
-       BOOLEAN                         HaveEMILCD;
-       BOOLEAN                         OverruleEMI;
+       bool                            HaveEMI;
+       bool                            HaveEMILCD;
+       bool                            OverruleEMI;
        unsigned char                   EMI_30,EMI_31,EMI_32,EMI_33;
        unsigned short                  SiS_EMIOffset;
        unsigned short                  SiS_PWDOffset;
@@ -352,7 +352,7 @@ struct SiS_Private
        unsigned short                  SiS_DDC_ReadAddr;
        unsigned short                  SiS_DDC_SecAddr;
        unsigned short                  SiS_ChrontelInit;
-       BOOLEAN                         SiS_SensibleSR11;
+       bool                            SiS_SensibleSR11;
        unsigned short                  SiS661LCD2TableSize;
 
        unsigned short                  SiS_PanelMinLVDS;
@@ -494,10 +494,10 @@ struct SiS_Private
        unsigned short                  PanelVRS,  PanelVRE;
        unsigned short                  PanelVCLKIdx300;
        unsigned short                  PanelVCLKIdx315;
-       BOOLEAN                         Alternate1600x1200;
+       bool                            Alternate1600x1200;
 
-       BOOLEAN                         UseCustomMode;
-       BOOLEAN                         CRT1UsesCustomMode;
+       bool                            UseCustomMode;
+       bool                            CRT1UsesCustomMode;
        unsigned short                  CHDisplay;
        unsigned short                  CHSyncStart;
        unsigned short                  CHSyncEnd;
@@ -523,7 +523,7 @@ struct SiS_Private
 
        int                             LVDSHL;
 
-       BOOLEAN                         Backup;
+       bool                            Backup;
        unsigned char                   Backup_Mode;
        unsigned char                   Backup_14;
        unsigned char                   Backup_15;
@@ -542,12 +542,12 @@ struct SiS_Private
        int                             CenterScreen;
 
        unsigned short                  CP_Vendor, CP_Product;
-       BOOLEAN                         CP_HaveCustomData;
+       bool                            CP_HaveCustomData;
        int                             CP_PreferredX, CP_PreferredY, CP_PreferredIndex;
        int                             CP_MaxX, CP_MaxY, CP_MaxClock;
        unsigned char                   CP_PrefSR2B, CP_PrefSR2C;
        unsigned short                  CP_PrefClock;
-       BOOLEAN                         CP_Supports64048075;
+       bool                            CP_Supports64048075;
        int                             CP_HDisplay[7], CP_VDisplay[7]; /* For Custom LCD panel dimensions */
        int                             CP_HTotal[7], CP_VTotal[7];
        int                             CP_HSyncStart[7], CP_VSyncStart[7];
@@ -555,8 +555,8 @@ struct SiS_Private
        int                             CP_HBlankStart[7], CP_VBlankStart[7];
        int                             CP_HBlankEnd[7], CP_VBlankEnd[7];
        int                             CP_Clock[7];
-       BOOLEAN                         CP_DataValid[7];
-       BOOLEAN                         CP_HSync_P[7], CP_VSync_P[7], CP_SyncValid[7];
+       bool                            CP_DataValid[7];
+       bool                            CP_HSync_P[7], CP_VSync_P[7], CP_SyncValid[7];
 };
 
 #endif
diff --git a/drivers/video/sun3fb.c b/drivers/video/sun3fb.c
deleted file mode 100644 (file)
index f80356d..0000000
+++ /dev/null
@@ -1,702 +0,0 @@
-/*
- *  linux/drivers/video/sun3fb.c -- Frame buffer driver for Sun3
- *
- * (C) 1998 Thomas Bogendoerfer
- *
- * This driver is bases on sbusfb.c, which is
- *
- *     Copyright (C) 1998 Jakub Jelinek
- *
- *  This driver is partly based on the Open Firmware console driver
- *
- *     Copyright (C) 1997 Geert Uytterhoeven
- *
- *  and SPARC console subsystem
- *
- *      Copyright (C) 1995 Peter Zaitcev (zaitcev@yahoo.com)
- *      Copyright (C) 1995-1997 David S. Miller (davem@caip.rutgers.edu)
- *      Copyright (C) 1995-1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
- *      Copyright (C) 1996 Dave Redman (djhr@tadpole.co.uk)
- *      Copyright (C) 1996-1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
- *      Copyright (C) 1996 Eddie C. Dost (ecd@skynet.be)
- *
- *  This file is subject to the terms and conditions of the GNU General Public
- *  License. See the file COPYING in the main directory of this archive for
- *  more details.
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/slab.h>
-#include <linux/vmalloc.h>
-#include <linux/delay.h>
-#include <linux/interrupt.h>
-#include <linux/fb.h>
-#include <linux/selection.h>
-#include <linux/init.h>
-#include <linux/console.h>
-#include <linux/kd.h>
-#include <linux/vt_kern.h>
-
-#include <asm/uaccess.h>
-#include <asm/pgtable.h>       /* io_remap_page_range() */
-
-#ifdef CONFIG_SUN3
-#include <asm/oplib.h>
-#include <asm/machines.h>
-#include <asm/idprom.h>
-
-#define CGFOUR_OBMEM_ADDR 0x1f300000
-#define BWTWO_OBMEM_ADDR 0x1f000000
-#define BWTWO_OBMEM50_ADDR 0x00100000
-
-#endif
-#ifdef CONFIG_SUN3X
-#include <asm/sun3x.h>
-#endif
-#include <video/sbusfb.h>
-
-#define DEFAULT_CURSOR_BLINK_RATE       (2*HZ/5)
-
-#define CURSOR_SHAPE                   1
-#define CURSOR_BLINK                   2
-
-#define mymemset(x,y) memset(x,0,y)
-
-    /*
-     *  Interface used by the world
-     */
-
-int sun3fb_init(void);
-void sun3fb_setup(char *options);
-
-static char fontname[40] __initdata = { 0 };
-static int curblink __initdata = 1;
-
-static int sun3fb_get_fix(struct fb_fix_screeninfo *fix, int con,
-                       struct fb_info *info);
-static int sun3fb_get_var(struct fb_var_screeninfo *var, int con,
-                       struct fb_info *info);
-static int sun3fb_set_var(struct fb_var_screeninfo *var, int con,
-                       struct fb_info *info);
-static int sun3fb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
-                       struct fb_info *info);
-static int sun3fb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
-                       struct fb_info *info);
-static int sun3fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
-                           u_int transp, struct fb_info *info);
-static int sun3fb_blank(int blank, struct fb_info *info);
-static void sun3fb_cursor(struct display *p, int mode, int x, int y);
-static void sun3fb_clear_margin(struct display *p, int s);
-
-    /*
-     *  Interface to the low level console driver
-     */
-
-static int sun3fbcon_switch(int con, struct fb_info *info);
-static int sun3fbcon_updatevar(int con, struct fb_info *info);
-
-    /*
-     *  Internal routines
-     */
-
-static int sun3fb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
-                           u_int *transp, struct fb_info *info);
-
-static struct fb_ops sun3fb_ops = {
-       .owner =        THIS_MODULE,
-       .fb_get_fix =   sun3fb_get_fix,
-       .fb_get_var =   sun3fb_get_var,
-       .fb_set_var =   sun3fb_set_var,
-       .fb_get_cmap =  sun3fb_get_cmap,
-       .fb_set_cmap =  sun3fb_set_cmap,
-       .fb_setcolreg = sun3fb_setcolreg,
-       .fb_blank =     sun3fb_blank,
-};
-
-static void sun3fb_clear_margin(struct display *p, int s)
-{
-       struct fb_info_sbusfb *fb = sbusfbinfod(p);
-       
-       return;
-
-       if (fb->switch_from_graph)
-               (*fb->switch_from_graph)(fb);
-       if (fb->fill) {
-               unsigned short rects [16];
-
-               rects [0] = 0;
-               rects [1] = 0;
-               rects [2] = fb->var.xres_virtual;
-               rects [3] = fb->y_margin;
-               rects [4] = 0;
-               rects [5] = fb->y_margin;
-               rects [6] = fb->x_margin;
-               rects [7] = fb->var.yres_virtual;
-               rects [8] = fb->var.xres_virtual - fb->x_margin;
-               rects [9] = fb->y_margin;
-               rects [10] = fb->var.xres_virtual;
-               rects [11] = fb->var.yres_virtual;
-               rects [12] = fb->x_margin;
-               rects [13] = fb->var.yres_virtual - fb->y_margin;
-               rects [14] = fb->var.xres_virtual - fb->x_margin;
-               rects [15] = fb->var.yres_virtual;
-               (*fb->fill)(fb, p, s, 4, rects);
-       } else {
-               unsigned char *fb_base = fb->info.screen_base, *q;
-               int skip_bytes = fb->y_margin * fb->var.xres_virtual;
-               int scr_size = fb->var.xres_virtual * fb->var.yres_virtual;
-               int h, he, incr, size;
-
-               he = fb->var.yres;
-               if (fb->var.bits_per_pixel == 1) {
-                       fb_base -= (skip_bytes + fb->x_margin) / 8;
-                       skip_bytes /= 8;
-                       scr_size /= 8;
-                       mymemset (fb_base, skip_bytes - fb->x_margin / 8);
-                       mymemset (fb_base + scr_size - skip_bytes + fb->x_margin / 8, skip_bytes - fb->x_margin / 8);
-                       incr = fb->var.xres_virtual / 8;
-                       size = fb->x_margin / 8 * 2;
-                       for (q = fb_base + skip_bytes - fb->x_margin / 8, h = 0;
-                            h <= he; q += incr, h++)
-                               mymemset (q, size);
-               } else {
-                       fb_base -= (skip_bytes + fb->x_margin);
-                       memset (fb_base, attr_bgcol(p,s), skip_bytes - fb->x_margin);
-                       memset (fb_base + scr_size - skip_bytes + fb->x_margin, attr_bgcol(p,s), skip_bytes - fb->x_margin);
-                       incr = fb->var.xres_virtual;
-                       size = fb->x_margin * 2;
-                       for (q = fb_base + skip_bytes - fb->x_margin, h = 0;
-                            h <= he; q += incr, h++)
-                               memset (q, attr_bgcol(p,s), size);
-               }
-       }
-}
-
-static void sun3fb_disp_setup(struct display *p)
-{
-       struct fb_info_sbusfb *fb = sbusfbinfod(p);
-
-       if (fb->setup)
-               fb->setup(p);   
-       sun3fb_clear_margin(p, 0);
-}
-
-    /*
-     *  Get the Fixed Part of the Display
-     */
-
-static int sun3fb_get_fix(struct fb_fix_screeninfo *fix, int con,
-                         struct fb_info *info)
-{
-       struct fb_info_sbusfb *fb = sbusfbinfo(info);
-
-       memcpy(fix, &fb->fix, sizeof(struct fb_fix_screeninfo));
-       return 0;
-}
-
-    /*
-     *  Get the User Defined Part of the Display
-     */
-
-static int sun3fb_get_var(struct fb_var_screeninfo *var, int con,
-                         struct fb_info *info)
-{
-       struct fb_info_sbusfb *fb = sbusfbinfo(info);
-
-       memcpy(var, &fb->var, sizeof(struct fb_var_screeninfo));
-       return 0;
-}
-
-    /*
-     *  Set the User Defined Part of the Display
-     */
-
-static int sun3fb_set_var(struct fb_var_screeninfo *var, int con,
-                       struct fb_info *info)
-{
-       struct fb_info_sbusfb *fb = sbusfbinfo(info);
-
-       if (var->xres > fb->var.xres || var->yres > fb->var.yres ||
-           var->xres_virtual > fb->var.xres_virtual ||
-           var->yres_virtual > fb->var.yres_virtual ||
-           var->bits_per_pixel != fb->var.bits_per_pixel ||
-           var->nonstd ||
-           (var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
-               return -EINVAL;
-       memcpy(var, &fb->var, sizeof(struct fb_var_screeninfo));
-       return 0;
-}
-
-    /*
-     *  Hardware cursor
-     */
-     
-static unsigned char hw_cursor_cmap[2] = { 0, 0xff };
-
-static void
-sun3fb_cursor_timer_handler(unsigned long dev_addr)
-{
-       struct fb_info_sbusfb *fb = (struct fb_info_sbusfb *)dev_addr;
-        
-       if (!fb->setcursor) return;
-                                
-       if (fb->cursor.mode & CURSOR_BLINK) {
-               fb->cursor.enable ^= 1;
-               fb->setcursor(fb);
-       }
-       
-       fb->cursor.timer.expires = jiffies + fb->cursor.blink_rate;
-       add_timer(&fb->cursor.timer);
-}
-
-static void sun3fb_cursor(struct display *p, int mode, int x, int y)
-{
-       struct fb_info_sbusfb *fb = sbusfbinfod(p);
-       
-       switch (mode) {
-       case CM_ERASE:
-               fb->cursor.mode &= ~CURSOR_BLINK;
-               fb->cursor.enable = 0;
-               (*fb->setcursor)(fb);
-               break;
-                                 
-       case CM_MOVE:
-       case CM_DRAW:
-               if (fb->cursor.mode & CURSOR_SHAPE) {
-                       fb->cursor.size.fbx = fontwidth(p);
-                       fb->cursor.size.fby = fontheight(p);
-                       fb->cursor.chot.fbx = 0;
-                       fb->cursor.chot.fby = 0;
-                       fb->cursor.enable = 1;
-                       memset (fb->cursor.bits, 0, sizeof (fb->cursor.bits));
-                       fb->cursor.bits[0][fontheight(p) - 2] = (0xffffffff << (32 - fontwidth(p)));
-                       fb->cursor.bits[1][fontheight(p) - 2] = (0xffffffff << (32 - fontwidth(p)));
-                       fb->cursor.bits[0][fontheight(p) - 1] = (0xffffffff << (32 - fontwidth(p)));
-                       fb->cursor.bits[1][fontheight(p) - 1] = (0xffffffff << (32 - fontwidth(p)));
-                       (*fb->setcursormap) (fb, hw_cursor_cmap, hw_cursor_cmap, hw_cursor_cmap);
-                       (*fb->setcurshape) (fb);
-               }
-               fb->cursor.mode = CURSOR_BLINK;
-               if (fontwidthlog(p))
-                       fb->cursor.cpos.fbx = (x << fontwidthlog(p)) + fb->x_margin;
-               else
-                       fb->cursor.cpos.fbx = (x * fontwidth(p)) + fb->x_margin;
-               if (fontheightlog(p))
-                       fb->cursor.cpos.fby = (y << fontheightlog(p)) + fb->y_margin;
-               else
-                       fb->cursor.cpos.fby = (y * fontheight(p)) + fb->y_margin;
-               (*fb->setcursor)(fb);
-               break;
-       }
-}
-
-    /*
-     *  Get the Colormap
-     */
-
-static int sun3fb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
-                        struct fb_info *info)
-{
-       if (con == info->currcon) /* current console? */
-               return fb_get_cmap(cmap, kspc, sun3fb_getcolreg, info);
-       else if (fb_display[con].cmap.len) /* non default colormap? */
-               fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
-       else
-               fb_copy_cmap(fb_default_cmap(1<<fb_display[con].var.bits_per_pixel), cmap, kspc ? 0 : 2);
-       return 0;
-}
-
-    /*
-     *  Set the Colormap
-     */
-
-static int sun3fb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
-                        struct fb_info *info)
-{
-       int err;
-
-       if (!fb_display[con].cmap.len) {        /* no colormap allocated? */
-               if ((err = fb_alloc_cmap(&fb_display[con].cmap, 1<<fb_display[con].var.bits_per_pixel, 0)))
-                       return err;
-       }
-       if (con == info->currcon) {                     /* current console? */
-               err = fb_set_cmap(cmap, kspc, info);
-               if (!err) {
-                       struct fb_info_sbusfb *fb = sbusfbinfo(info);
-                       
-                       if (fb->loadcmap)
-                               (*fb->loadcmap)(fb, &fb_display[con], cmap->start, cmap->len);
-               }
-               return err;
-       } else
-               fb_copy_cmap(cmap, &fb_display[con].cmap, kspc ? 0 : 1);
-       return 0;
-}
-
-    /*
-     *  Setup: parse used options
-     */
-
-void __init sun3fb_setup(char *options)
-{
-       char *p;
-       
-       for (p = options;;) {
-               if (!strncmp(p, "font=", 5)) {
-                       int i;
-                       
-                       for (i = 0; i < sizeof(fontname) - 1; i++)
-                               if (p[i+5] == ' ' || !p[i+5])
-                                       break;
-                       memcpy(fontname, p+5, i);
-                       fontname[i] = 0;
-               } else if (!strncmp(p, "noblink", 7))
-                       curblink = 0;
-               while (*p && *p != ' ' && *p != ',') p++;
-               if (*p != ',') break;
-               p++;
-       }
-
-       return;
-}
-
-static int sun3fbcon_switch(int con, struct fb_info *info)
-{
-       int x_margin, y_margin;
-       struct fb_info_sbusfb *fb = sbusfbinfo(info);
-       int lastconsole;
-    
-       /* Do we have to save the colormap? */
-       if (fb_display[info->currcon].cmap.len)
-               fb_get_cmap(&fb_display[info->currcon].cmap, 1, sun3fb_getcolreg, info);
-
-       if (info->display_fg) {
-               lastconsole = info->display_fg->vc_num;
-               if (lastconsole != con && 
-                   (fontwidth(&fb_display[lastconsole]) != fontwidth(&fb_display[con]) ||
-                    fontheight(&fb_display[lastconsole]) != fontheight(&fb_display[con])))
-                       fb->cursor.mode |= CURSOR_SHAPE;
-       }
-       x_margin = (fb_display[con].var.xres_virtual - fb_display[con].var.xres) / 2;
-       y_margin = (fb_display[con].var.yres_virtual - fb_display[con].var.yres) / 2;
-       if (fb->margins)
-               fb->margins(fb, &fb_display[con], x_margin, y_margin);
-       if (fb->graphmode || fb->x_margin != x_margin || fb->y_margin != y_margin) {
-               fb->x_margin = x_margin; fb->y_margin = y_margin;
-               sun3fb_clear_margin(&fb_display[con], 0);
-       }
-       info->currcon = con;
-       /* Install new colormap */
-       do_install_cmap(con, info);
-       return 0;
-}
-
-    /*
-     *  Update the `var' structure (called by fbcon.c)
-     */
-
-static int sun3fbcon_updatevar(int con, struct fb_info *info)
-{
-       /* Nothing */
-       return 0;
-}
-
-    /*
-     *  Blank the display.
-     */
-
-static int sun3fb_blank(int blank, struct fb_info *info)
-{
-    struct fb_info_sbusfb *fb = sbusfbinfo(info);
-    
-    if (blank && fb->blank)
-       return fb->blank(fb);
-    else if (!blank && fb->unblank)
-       return fb->unblank(fb);
-    return 0;
-}
-
-    /*
-     *  Read a single color register and split it into
-     *  colors/transparent. Return != 0 for invalid regno.
-     */
-
-static int sun3fb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
-                         u_int *transp, struct fb_info *info)
-{
-       struct fb_info_sbusfb *fb = sbusfbinfo(info);
-
-       if (!fb->color_map || regno > 255)
-               return 1;
-       *red = (fb->color_map CM(regno, 0)<<8) | fb->color_map CM(regno, 0);
-       *green = (fb->color_map CM(regno, 1)<<8) | fb->color_map CM(regno, 1);
-       *blue = (fb->color_map CM(regno, 2)<<8) | fb->color_map CM(regno, 2);
-       *transp = 0;
-       return 0;
-}
-
-
-    /*
-     *  Set a single color register. The values supplied are already
-     *  rounded down to the hardware's capabilities (according to the
-     *  entries in the var structure). Return != 0 for invalid regno.
-     */
-
-static int sun3fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
-                           u_int transp, struct fb_info *info)
-{
-       struct fb_info_sbusfb *fb = sbusfbinfo(info);
-
-       if (!fb->color_map || regno > 255)
-               return 1;
-       red >>= 8;
-       green >>= 8;
-       blue >>= 8;
-       fb->color_map CM(regno, 0) = red;
-       fb->color_map CM(regno, 1) = green;
-       fb->color_map CM(regno, 2) = blue;
-       return 0;
-}
-
-static int sun3fb_set_font(struct display *p, int width, int height)
-{
-       int w = p->var.xres_virtual, h = p->var.yres_virtual;
-       int depth = p->var.bits_per_pixel;
-       struct fb_info_sbusfb *fb = sbusfbinfod(p);
-       int x_margin, y_margin;
-       
-       if (depth > 8) depth = 8;
-       x_margin = (w % width) / 2;
-       y_margin = (h % height) / 2;
-
-       p->var.xres = w - 2*x_margin;
-       p->var.yres = h - 2*y_margin;
-       
-       fb->cursor.mode |= CURSOR_SHAPE;
-       
-       if (fb->margins)
-               fb->margins(fb, p, x_margin, y_margin);
-       if (fb->x_margin != x_margin || fb->y_margin != y_margin) {
-               fb->x_margin = x_margin; fb->y_margin = y_margin;
-               sun3fb_clear_margin(p, 0);
-       }
-
-       return 1;
-}
-
-void sun3fb_palette(int enter)
-{
-       int i;
-       struct display *p;
-       
-       for (i = 0; i < MAX_NR_CONSOLES; i++) {
-               p = &fb_display[i];
-               if (p->dispsw && p->dispsw->setup == sun3fb_disp_setup &&
-                   p->fb_info->display_fg &&
-                   p->fb_info->display_fg->vc_num == i) {
-                       struct fb_info_sbusfb *fb = sbusfbinfod(p);
-
-                       if (fb->restore_palette) {
-                               if (enter)
-                                       fb->restore_palette(fb);
-                               else if (vc_cons[i].d->vc_mode != KD_GRAPHICS)
-                                        vc_cons[i].d->vc_sw->con_set_palette(vc_cons[i].d, color_table);
-                       }
-               }
-       }
-}
-
-    /*
-     *  Initialisation
-     */
-static int __init sun3fb_init_fb(int fbtype, unsigned long addr)
-{
-       static struct sbus_dev sdb;
-       struct fb_fix_screeninfo *fix;
-       struct fb_var_screeninfo *var;
-       struct display *disp;
-       struct fb_info_sbusfb *fb;
-       struct fbtype *type;
-       int linebytes, w, h, depth;
-       char *p = NULL;
-       
-       fb = kmalloc(sizeof(struct fb_info_sbusfb), GFP_ATOMIC);
-       if (!fb)
-               return -ENOMEM;
-       
-       memset(fb, 0, sizeof(struct fb_info_sbusfb));
-       fix = &fb->fix;
-       var = &fb->var;
-       disp = &fb->disp;
-       type = &fb->type;
-       
-       sdb.reg_addrs[0].phys_addr = addr;
-       fb->sbdp = &sdb;
-
-       type->fb_type = fbtype;
-       
-       type->fb_height = h = 900;
-       type->fb_width  = w = 1152;
-sizechange:
-       type->fb_depth  = depth = (fbtype == FBTYPE_SUN2BW) ? 1 : 8;
-       linebytes = w * depth / 8;
-       type->fb_size   = PAGE_ALIGN((linebytes) * h);
-/*     
-       fb->x_margin = (w & 7) / 2;
-       fb->y_margin = (h & 15) / 2;
-*/
-       fb->x_margin = fb->y_margin = 0;
-
-       var->xres_virtual = w;
-       var->yres_virtual = h;
-       var->xres = w - 2*fb->x_margin;
-       var->yres = h - 2*fb->y_margin;
-       
-       var->bits_per_pixel = depth;
-       var->height = var->width = -1;
-       var->pixclock = 10000;
-       var->vmode = FB_VMODE_NONINTERLACED;
-       var->red.length = var->green.length = var->blue.length = 8;
-
-       fix->line_length = linebytes;
-       fix->smem_len = type->fb_size;
-       fix->type = FB_TYPE_PACKED_PIXELS;
-       fix->visual = FB_VISUAL_PSEUDOCOLOR;
-       
-       fb->info.fbops = &sun3fb_ops;
-       fb->info.disp = disp;
-       fb->info.currcon = -1;
-       strcpy(fb->info.fontname, fontname);
-       fb->info.changevar = NULL;
-       fb->info.switch_con = &sun3fbcon_switch;
-       fb->info.updatevar = &sun3fbcon_updatevar;
-       fb->info.flags = FBINFO_FLAG_DEFAULT;
-       
-       fb->cursor.hwsize.fbx = 32;
-       fb->cursor.hwsize.fby = 32;
-       
-       if (depth > 1 && !fb->color_map) {
-               if((fb->color_map = kmalloc(256 * 3, GFP_ATOMIC))==NULL)
-                       return -ENOMEM;
-       }
-                       
-       switch(fbtype) {
-#ifdef CONFIG_FB_CGSIX
-       case FBTYPE_SUNFAST_COLOR:
-               p = cgsixfb_init(fb); break;
-#endif
-#ifdef CONFIG_FB_BWTWO
-       case FBTYPE_SUN2BW:
-               p = bwtwofb_init(fb); break;
-#endif
-#ifdef CONFIG_FB_CGTHREE
-       case FBTYPE_SUN4COLOR:
-       case FBTYPE_SUN3COLOR:
-               type->fb_size = 0x100000;
-               p = cgthreefb_init(fb); break;
-#endif
-       }
-       fix->smem_start = (unsigned long)fb->info.screen_base;  // FIXME
-       
-       if (!p) {
-               kfree(fb);
-               return -ENODEV;
-       }
-       
-       if (p == SBUSFBINIT_SIZECHANGE)
-               goto sizechange;
-
-       disp->dispsw = &fb->dispsw;
-       if (fb->setcursor) {
-               fb->dispsw.cursor = sun3fb_cursor;
-               if (curblink) {
-                       fb->cursor.blink_rate = DEFAULT_CURSOR_BLINK_RATE;
-                       init_timer(&fb->cursor.timer);
-                       fb->cursor.timer.expires = jiffies + fb->cursor.blink_rate;
-                       fb->cursor.timer.data = (unsigned long)fb;
-                       fb->cursor.timer.function = sun3fb_cursor_timer_handler;
-                       add_timer(&fb->cursor.timer);
-               }
-       }
-       fb->cursor.mode = CURSOR_SHAPE;
-       fb->dispsw.set_font = sun3fb_set_font;
-       fb->setup = fb->dispsw.setup;
-       fb->dispsw.setup = sun3fb_disp_setup;
-       fb->dispsw.clear_margins = NULL;
-
-       disp->var = *var;
-       disp->visual = fix->visual;
-       disp->type = fix->type;
-       disp->type_aux = fix->type_aux;
-       disp->line_length = fix->line_length;
-       
-       if (fb->blank)
-               disp->can_soft_blank = 1;
-
-       sun3fb_set_var(var, -1, &fb->info);
-
-       if (register_framebuffer(&fb->info) < 0) {
-               kfree(fb);
-               return -EINVAL;
-       }
-       printk("fb%d: %s\n", fb->info.node, p);
-
-       return 0;
-}
-
-
-int __init sun3fb_init(void)
-{
-       extern int con_is_present(void);
-       unsigned long addr;
-       char p4id;
-       
-       if (!con_is_present()) return -ENODEV;
-#ifdef CONFIG_SUN3
-        switch(*(romvec->pv_fbtype))
-        {
-       case FBTYPE_SUN2BW:
-               addr = 0xfe20000;
-               return sun3fb_init_fb(FBTYPE_SUN2BW, addr);
-       case FBTYPE_SUN3COLOR:
-       case FBTYPE_SUN4COLOR:
-               if(idprom->id_machtype != (SM_SUN3|SM_3_60)) {
-                       printk("sun3fb: cgthree/four only supported on 3/60\n");
-                       return -ENODEV;
-               }
-               
-               addr = CGFOUR_OBMEM_ADDR;
-               return sun3fb_init_fb(*(romvec->pv_fbtype), addr);
-       default:
-               printk("sun3fb: unsupported framebuffer\n");
-               return -ENODEV;
-       }
-#else
-       addr = SUN3X_VIDEO_BASE;
-       p4id = *(char *)SUN3X_VIDEO_P4ID;
-
-       p4id = (p4id == 0x45) ? p4id : (p4id & 0xf0);
-       switch (p4id) {
-               case 0x00:
-                       return sun3fb_init_fb(FBTYPE_SUN2BW, addr);
-#if 0 /* not yet */
-               case 0x40:
-                       return sun3fb_init_fb(FBTYPE_SUN4COLOR, addr);
-                       break;
-               case 0x45:
-                       return sun3fb_init_fb(FBTYPE_SUN8COLOR, addr);
-                       break;
-#endif
-               case 0x60:
-                       return sun3fb_init_fb(FBTYPE_SUNFAST_COLOR, addr);
-       }
-#endif                 
-       
-       return -ENODEV;
-}
-
-MODULE_LICENSE("GPL");
diff --git a/drivers/video/svgalib.c b/drivers/video/svgalib.c
new file mode 100644 (file)
index 0000000..68b30d9
--- /dev/null
@@ -0,0 +1,632 @@
+/*
+ * Common utility functions for VGA-based graphics cards.
+ *
+ * Copyright (c) 2006-2007 Ondrej Zajicek <santiago@crfreenet.org>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file COPYING in the main directory of this archive for
+ * more details.
+ *
+ * Some parts are based on David Boucher's viafb (http://davesdomain.org.uk/viafb/)
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/fb.h>
+#include <linux/svga.h>
+#include <linux/slab.h>
+#include <asm/types.h>
+#include <asm/io.h>
+
+
+/* Write a CRT register value spread across multiple registers */
+void svga_wcrt_multi(const struct vga_regset *regset, u32 value) {
+
+       u8 regval, bitval, bitnum;
+
+       while (regset->regnum != VGA_REGSET_END_VAL) {
+               regval = vga_rcrt(NULL, regset->regnum);
+               bitnum = regset->lowbit;
+               while (bitnum <= regset->highbit) {
+                       bitval = 1 << bitnum;
+                       regval = regval & ~bitval;
+                       if (value & 1) regval = regval | bitval;
+                       bitnum ++;
+                       value = value >> 1;
+               }
+               vga_wcrt(NULL, regset->regnum, regval);
+               regset ++;
+       }
+}
+
+/* Write a sequencer register value spread across multiple registers */
+void svga_wseq_multi(const struct vga_regset *regset, u32 value) {
+
+       u8 regval, bitval, bitnum;
+
+       while (regset->regnum != VGA_REGSET_END_VAL) {
+               regval = vga_rseq(NULL, regset->regnum);
+               bitnum = regset->lowbit;
+               while (bitnum <= regset->highbit) {
+                       bitval = 1 << bitnum;
+                       regval = regval & ~bitval;
+                       if (value & 1) regval = regval | bitval;
+                       bitnum ++;
+                       value = value >> 1;
+               }
+               vga_wseq(NULL, regset->regnum, regval);
+               regset ++;
+       }
+}
+
+static unsigned int svga_regset_size(const struct vga_regset *regset)
+{
+       u8 count = 0;
+
+       while (regset->regnum != VGA_REGSET_END_VAL) {
+               count += regset->highbit - regset->lowbit + 1;
+               regset ++;
+       }
+       return 1 << count;
+}
+
+
+/* ------------------------------------------------------------------------- */
+
+
+/* Set graphics controller registers to sane values */
+void svga_set_default_gfx_regs(void)
+{
+       /* All standard GFX registers (GR00 - GR08) */
+       vga_wgfx(NULL, VGA_GFX_SR_VALUE, 0x00);
+       vga_wgfx(NULL, VGA_GFX_SR_ENABLE, 0x00);
+       vga_wgfx(NULL, VGA_GFX_COMPARE_VALUE, 0x00);
+       vga_wgfx(NULL, VGA_GFX_DATA_ROTATE, 0x00);
+       vga_wgfx(NULL, VGA_GFX_PLANE_READ, 0x00);
+       vga_wgfx(NULL, VGA_GFX_MODE, 0x00);
+/*     vga_wgfx(NULL, VGA_GFX_MODE, 0x20); */
+/*     vga_wgfx(NULL, VGA_GFX_MODE, 0x40); */
+       vga_wgfx(NULL, VGA_GFX_MISC, 0x05);
+/*     vga_wgfx(NULL, VGA_GFX_MISC, 0x01); */
+       vga_wgfx(NULL, VGA_GFX_COMPARE_MASK, 0x0F);
+       vga_wgfx(NULL, VGA_GFX_BIT_MASK, 0xFF);
+}
+
+/* Set attribute controller registers to sane values */
+void svga_set_default_atc_regs(void)
+{
+       u8 count;
+
+       vga_r(NULL, 0x3DA);
+       vga_w(NULL, VGA_ATT_W, 0x00);
+
+       /* All standard ATC registers (AR00 - AR14) */
+       for (count = 0; count <= 0xF; count ++)
+               svga_wattr(count, count);
+
+       svga_wattr(VGA_ATC_MODE, 0x01);
+/*     svga_wattr(VGA_ATC_MODE, 0x41); */
+       svga_wattr(VGA_ATC_OVERSCAN, 0x00);
+       svga_wattr(VGA_ATC_PLANE_ENABLE, 0x0F);
+       svga_wattr(VGA_ATC_PEL, 0x00);
+       svga_wattr(VGA_ATC_COLOR_PAGE, 0x00);
+
+       vga_r(NULL, 0x3DA);
+       vga_w(NULL, VGA_ATT_W, 0x20);
+}
+
+/* Set sequencer registers to sane values */
+void svga_set_default_seq_regs(void)
+{
+       /* Standard sequencer registers (SR01 - SR04), SR00 is not set */
+       vga_wseq(NULL, VGA_SEQ_CLOCK_MODE, VGA_SR01_CHAR_CLK_8DOTS);
+       vga_wseq(NULL, VGA_SEQ_PLANE_WRITE, VGA_SR02_ALL_PLANES);
+       vga_wseq(NULL, VGA_SEQ_CHARACTER_MAP, 0x00);
+/*     vga_wseq(NULL, VGA_SEQ_MEMORY_MODE, VGA_SR04_EXT_MEM | VGA_SR04_SEQ_MODE | VGA_SR04_CHN_4M); */
+       vga_wseq(NULL, VGA_SEQ_MEMORY_MODE, VGA_SR04_EXT_MEM | VGA_SR04_SEQ_MODE);
+}
+
+/* Set CRTC registers to sane values */
+void svga_set_default_crt_regs(void)
+{
+       /* Standard CRT registers CR03 CR08 CR09 CR14 CR17 */
+       svga_wcrt_mask(0x03, 0x80, 0x80);       /* Enable vertical retrace EVRA */
+       vga_wcrt(NULL, VGA_CRTC_PRESET_ROW, 0);
+       svga_wcrt_mask(VGA_CRTC_MAX_SCAN, 0, 0x1F);
+       vga_wcrt(NULL, VGA_CRTC_UNDERLINE, 0);
+       vga_wcrt(NULL, VGA_CRTC_MODE, 0xE3);
+}
+
+void svga_set_textmode_vga_regs(void)
+{
+       /* svga_wseq_mask(0x1, 0x00, 0x01); */   /* Switch 8/9 pixel per char */
+       vga_wseq(NULL, VGA_SEQ_MEMORY_MODE,     VGA_SR04_EXT_MEM);
+       vga_wseq(NULL, VGA_SEQ_PLANE_WRITE,     0x03);
+
+       vga_wcrt(NULL, VGA_CRTC_MAX_SCAN,       0x0f); /* 0x4f */
+       vga_wcrt(NULL, VGA_CRTC_UNDERLINE,      0x1f);
+       svga_wcrt_mask(VGA_CRTC_MODE,           0x23, 0x7f);
+
+       vga_wcrt(NULL, VGA_CRTC_CURSOR_START,   0x0d);
+       vga_wcrt(NULL, VGA_CRTC_CURSOR_END,     0x0e);
+       vga_wcrt(NULL, VGA_CRTC_CURSOR_HI,      0x00);
+       vga_wcrt(NULL, VGA_CRTC_CURSOR_LO,      0x00);
+
+       vga_wgfx(NULL, VGA_GFX_MODE,            0x10); /* Odd/even memory mode */
+       vga_wgfx(NULL, VGA_GFX_MISC,            0x0E); /* Misc graphics register - text mode enable */
+       vga_wgfx(NULL, VGA_GFX_COMPARE_MASK,    0x00);
+
+       vga_r(NULL, 0x3DA);
+       vga_w(NULL, VGA_ATT_W, 0x00);
+
+       svga_wattr(0x10, 0x0C);                 /* Attribute Mode Control Register - text mode, blinking and line graphics */
+       svga_wattr(0x13, 0x08);                 /* Horizontal Pixel Panning Register  */
+
+       vga_r(NULL, 0x3DA);
+       vga_w(NULL, VGA_ATT_W, 0x20);
+}
+
+#if 0
+void svga_dump_var(struct fb_var_screeninfo *var, int node)
+{
+       pr_debug("fb%d: var.vmode         : 0x%X\n", node, var->vmode);
+       pr_debug("fb%d: var.xres          : %d\n", node, var->xres);
+       pr_debug("fb%d: var.yres          : %d\n", node, var->yres);
+       pr_debug("fb%d: var.bits_per_pixel: %d\n", node, var->bits_per_pixel);
+       pr_debug("fb%d: var.xres_virtual  : %d\n", node, var->xres_virtual);
+       pr_debug("fb%d: var.yres_virtual  : %d\n", node, var->yres_virtual);
+       pr_debug("fb%d: var.left_margin   : %d\n", node, var->left_margin);
+       pr_debug("fb%d: var.right_margin  : %d\n", node, var->right_margin);
+       pr_debug("fb%d: var.upper_margin  : %d\n", node, var->upper_margin);
+       pr_debug("fb%d: var.lower_margin  : %d\n", node, var->lower_margin);
+       pr_debug("fb%d: var.hsync_len     : %d\n", node, var->hsync_len);
+       pr_debug("fb%d: var.vsync_len     : %d\n", node, var->vsync_len);
+       pr_debug("fb%d: var.sync          : 0x%X\n", node, var->sync);
+       pr_debug("fb%d: var.pixclock      : %d\n\n", node, var->pixclock);
+}
+#endif  /*  0  */
+
+
+/* ------------------------------------------------------------------------- */
+
+
+void svga_settile(struct fb_info *info, struct fb_tilemap *map)
+{
+       const u8 *font = map->data;
+       u8* fb = (u8 *) info->screen_base;
+       int i, c;
+
+       if ((map->width != 8) || (map->height != 16) ||
+           (map->depth != 1) || (map->length != 256)) {
+               printk(KERN_ERR "fb%d: unsupported font parameters: width %d, height %d, depth %d, length %d\n",
+                       info->node, map->width, map->height, map->depth, map->length);
+               return;
+       }
+
+       fb += 2;
+       for (c = 0; c < map->length; c++) {
+               for (i = 0; i < map->height; i++) {
+                       fb[i * 4] = font[i];
+               }
+               fb += 128;
+               font += map->height;
+       }
+}
+
+/* Copy area in text (tileblit) mode */
+void svga_tilecopy(struct fb_info *info, struct fb_tilearea *area)
+{
+       int dx, dy;
+       /*  colstride is halved in this function because u16 are used */
+       int colstride = 1 << (info->fix.type_aux & FB_AUX_TEXT_SVGA_MASK);
+       int rowstride = colstride * (info->var.xres_virtual / 8);
+       u16 *fb = (u16 *) info->screen_base;
+       u16 *src, *dst;
+
+       if ((area->sy > area->dy) ||
+           ((area->sy == area->dy) && (area->sx > area->dx))) {
+               src = fb + area->sx * colstride + area->sy * rowstride;
+               dst = fb + area->dx * colstride + area->dy * rowstride;
+           } else {
+               src = fb + (area->sx + area->width - 1) * colstride
+                        + (area->sy + area->height - 1) * rowstride;
+               dst = fb + (area->dx + area->width - 1) * colstride
+                        + (area->dy + area->height - 1) * rowstride;
+
+               colstride = -colstride;
+               rowstride = -rowstride;
+           }
+
+       for (dy = 0; dy < area->height; dy++) {
+               u16* src2 = src;
+               u16* dst2 = dst;
+               for (dx = 0; dx < area->width; dx++) {
+                       *dst2 = *src2;
+                       src2 += colstride;
+                       dst2 += colstride;
+               }
+               src += rowstride;
+               dst += rowstride;
+       }
+}
+
+/* Fill area in text (tileblit) mode */
+void svga_tilefill(struct fb_info *info, struct fb_tilerect *rect)
+{
+       int dx, dy;
+       int colstride = 2 << (info->fix.type_aux & FB_AUX_TEXT_SVGA_MASK);
+       int rowstride = colstride * (info->var.xres_virtual / 8);
+       int attr = (0x0F & rect->bg) << 4 | (0x0F & rect->fg);
+       u8  *fb = (u8 *) info->screen_base;
+       fb += rect->sx * colstride + rect->sy * rowstride;
+
+       for (dy = 0; dy < rect->height; dy++) {
+               u8* fb2 = fb;
+               for (dx = 0; dx < rect->width; dx++) {
+                       fb2[0] = rect->index;
+                       fb2[1] = attr;
+                       fb2 += colstride;
+               }
+               fb += rowstride;
+       }
+}
+
+/* Write text in text (tileblit) mode */
+void svga_tileblit(struct fb_info *info, struct fb_tileblit *blit)
+{
+       int dx, dy, i;
+       int colstride = 2 << (info->fix.type_aux & FB_AUX_TEXT_SVGA_MASK);
+       int rowstride = colstride * (info->var.xres_virtual / 8);
+       int attr = (0x0F & blit->bg) << 4 | (0x0F & blit->fg);
+       u8* fb = (u8 *) info->screen_base;
+       fb += blit->sx * colstride + blit->sy * rowstride;
+
+       i=0;
+       for (dy=0; dy < blit->height; dy ++) {
+               u8* fb2 = fb;
+               for (dx = 0; dx < blit->width; dx ++) {
+                       fb2[0] = blit->indices[i];
+                       fb2[1] = attr;
+                       fb2 += colstride;
+                       i ++;
+                       if (i == blit->length) return;
+               }
+               fb += rowstride;
+       }
+
+}
+
+/* Set cursor in text (tileblit) mode */
+void svga_tilecursor(struct fb_info *info, struct fb_tilecursor *cursor)
+{
+       u8 cs = 0x0d;
+       u8 ce = 0x0e;
+       u16 pos =  cursor->sx + (info->var.xoffset /  8)
+               + (cursor->sy + (info->var.yoffset / 16))
+                  * (info->var.xres_virtual / 8);
+
+       if (! cursor -> mode)
+               return;
+
+       svga_wcrt_mask(0x0A, 0x20, 0x20); /* disable cursor */
+
+       if (cursor -> shape == FB_TILE_CURSOR_NONE)
+               return;
+
+       switch (cursor -> shape) {
+       case FB_TILE_CURSOR_UNDERLINE:
+               cs = 0x0d;
+               break;
+       case FB_TILE_CURSOR_LOWER_THIRD:
+               cs = 0x09;
+               break;
+       case FB_TILE_CURSOR_LOWER_HALF:
+               cs = 0x07;
+               break;
+       case FB_TILE_CURSOR_TWO_THIRDS:
+               cs = 0x05;
+               break;
+       case FB_TILE_CURSOR_BLOCK:
+               cs = 0x01;
+               break;
+       }
+
+       /* set cursor position */
+       vga_wcrt(NULL, 0x0E, pos >> 8);
+       vga_wcrt(NULL, 0x0F, pos & 0xFF);
+
+       vga_wcrt(NULL, 0x0B, ce); /* set cursor end */
+       vga_wcrt(NULL, 0x0A, cs); /* set cursor start and enable it */
+}
+
+
+/* ------------------------------------------------------------------------- */
+
+
+/*
+ *  Compute PLL settings (M, N, R)
+ *  F_VCO = (F_BASE * M) / N
+ *  F_OUT = F_VCO / (2^R)
+ */
+
+static inline u32 abs_diff(u32 a, u32 b)
+{
+       return (a > b) ? (a - b) : (b - a);
+}
+
+int svga_compute_pll(const struct svga_pll *pll, u32 f_wanted, u16 *m, u16 *n, u16 *r, int node)
+{
+       u16 am, an, ar;
+       u32 f_vco, f_current, delta_current, delta_best;
+
+       pr_debug("fb%d: ideal frequency: %d kHz\n", node, (unsigned int) f_wanted);
+
+       ar = pll->r_max;
+       f_vco = f_wanted << ar;
+
+       /* overflow check */
+       if ((f_vco >> ar) != f_wanted)
+               return -EINVAL;
+
+       /* It is usually better to have greater VCO clock
+          because of better frequency stability.
+          So first try r_max, then r smaller. */
+       while ((ar > pll->r_min) && (f_vco > pll->f_vco_max)) {
+               ar--;
+               f_vco = f_vco >> 1;
+       }
+
+       /* VCO bounds check */
+       if ((f_vco < pll->f_vco_min) || (f_vco > pll->f_vco_max))
+               return -EINVAL;
+
+       delta_best = 0xFFFFFFFF;
+       *m = 0;
+       *n = 0;
+       *r = ar;
+
+       am = pll->m_min;
+       an = pll->n_min;
+
+       while ((am <= pll->m_max) && (an <= pll->n_max)) {
+               f_current = (pll->f_base * am) / an;
+               delta_current = abs_diff (f_current, f_vco);
+
+               if (delta_current < delta_best) {
+                       delta_best = delta_current;
+                       *m = am;
+                       *n = an;
+               }
+
+               if (f_current <= f_vco) {
+                       am ++;
+               } else {
+                       an ++;
+               }
+       }
+
+       f_current = (pll->f_base * *m) / *n;
+       pr_debug("fb%d: found frequency: %d kHz (VCO %d kHz)\n", node, (int) (f_current >> ar), (int) f_current);
+       pr_debug("fb%d: m = %d n = %d r = %d\n", node, (unsigned int) *m, (unsigned int) *n, (unsigned int) *r);
+       return 0;
+}
+
+
+/* ------------------------------------------------------------------------- */
+
+
+/* Check CRT timing values */
+int svga_check_timings(const struct svga_timing_regs *tm, struct fb_var_screeninfo *var, int node)
+{
+       u32 value;
+
+       var->xres         = (var->xres+7)&~7;
+       var->left_margin  = (var->left_margin+7)&~7;
+       var->right_margin = (var->right_margin+7)&~7;
+       var->hsync_len    = (var->hsync_len+7)&~7;
+
+       /* Check horizontal total */
+       value = var->xres + var->left_margin + var->right_margin + var->hsync_len;
+       if (((value / 8) - 5) >= svga_regset_size (tm->h_total_regs))
+               return -EINVAL;
+
+       /* Check horizontal display and blank start */
+       value = var->xres;
+       if (((value / 8) - 1) >= svga_regset_size (tm->h_display_regs))
+               return -EINVAL;
+       if (((value / 8) - 1) >= svga_regset_size (tm->h_blank_start_regs))
+               return -EINVAL;
+
+       /* Check horizontal sync start */
+       value = var->xres + var->right_margin;
+       if (((value / 8) - 1) >= svga_regset_size (tm->h_sync_start_regs))
+               return -EINVAL;
+
+       /* Check horizontal blank end (or length) */
+       value = var->left_margin + var->right_margin + var->hsync_len;
+       if ((value == 0) || ((value / 8) >= svga_regset_size (tm->h_blank_end_regs)))
+               return -EINVAL;
+
+       /* Check horizontal sync end (or length) */
+       value = var->hsync_len;
+       if ((value == 0) || ((value / 8) >= svga_regset_size (tm->h_sync_end_regs)))
+               return -EINVAL;
+
+       /* Check vertical total */
+       value = var->yres + var->upper_margin + var->lower_margin + var->vsync_len;
+       if ((value - 1) >= svga_regset_size(tm->v_total_regs))
+               return -EINVAL;
+
+       /* Check vertical display and blank start */
+       value = var->yres;
+       if ((value - 1) >= svga_regset_size(tm->v_display_regs))
+               return -EINVAL;
+       if ((value - 1) >= svga_regset_size(tm->v_blank_start_regs))
+               return -EINVAL;
+
+       /* Check vertical sync start */
+       value = var->yres + var->lower_margin;
+       if ((value - 1) >= svga_regset_size(tm->v_sync_start_regs))
+               return -EINVAL;
+
+       /* Check vertical blank end (or length) */
+       value = var->upper_margin + var->lower_margin + var->vsync_len;
+       if ((value == 0) || (value >= svga_regset_size (tm->v_blank_end_regs)))
+               return -EINVAL;
+
+       /* Check vertical sync end  (or length) */
+       value = var->vsync_len;
+       if ((value == 0) || (value >= svga_regset_size (tm->v_sync_end_regs)))
+               return -EINVAL;
+
+       return 0;
+}
+
+/* Set CRT timing registers */
+void svga_set_timings(const struct svga_timing_regs *tm, struct fb_var_screeninfo *var,
+                       u32 hmul, u32 hdiv, u32 vmul, u32 vdiv, u32 hborder, int node)
+{
+       u8 regval;
+       u32 value;
+
+       value = var->xres + var->left_margin + var->right_margin + var->hsync_len;
+       value = (value * hmul) / hdiv;
+       pr_debug("fb%d: horizontal total      : %d\n", node, value);
+       svga_wcrt_multi(tm->h_total_regs, (value / 8) - 5);
+
+       value = var->xres;
+       value = (value * hmul) / hdiv;
+       pr_debug("fb%d: horizontal display    : %d\n", node, value);
+       svga_wcrt_multi(tm->h_display_regs, (value / 8) - 1);
+
+       value = var->xres;
+       value = (value * hmul) / hdiv;
+       pr_debug("fb%d: horizontal blank start: %d\n", node, value);
+       svga_wcrt_multi(tm->h_blank_start_regs, (value / 8) - 1 + hborder);
+
+       value = var->xres + var->left_margin + var->right_margin + var->hsync_len;
+       value = (value * hmul) / hdiv;
+       pr_debug("fb%d: horizontal blank end  : %d\n", node, value);
+       svga_wcrt_multi(tm->h_blank_end_regs, (value / 8) - 1 - hborder);
+
+       value = var->xres + var->right_margin;
+       value = (value * hmul) / hdiv;
+       pr_debug("fb%d: horizontal sync start : %d\n", node, value);
+       svga_wcrt_multi(tm->h_sync_start_regs, (value / 8));
+
+       value = var->xres + var->right_margin + var->hsync_len;
+       value = (value * hmul) / hdiv;
+       pr_debug("fb%d: horizontal sync end   : %d\n", node, value);
+       svga_wcrt_multi(tm->h_sync_end_regs, (value / 8));
+
+       value = var->yres + var->upper_margin + var->lower_margin + var->vsync_len;
+       value = (value * vmul) / vdiv;
+       pr_debug("fb%d: vertical total        : %d\n", node, value);
+       svga_wcrt_multi(tm->v_total_regs, value - 2);
+
+       value = var->yres;
+       value = (value * vmul) / vdiv;
+       pr_debug("fb%d: vertical display      : %d\n", node, value);
+       svga_wcrt_multi(tm->v_display_regs, value - 1);
+
+       value = var->yres;
+       value = (value * vmul) / vdiv;
+       pr_debug("fb%d: vertical blank start  : %d\n", node, value);
+       svga_wcrt_multi(tm->v_blank_start_regs, value);
+
+       value = var->yres + var->upper_margin + var->lower_margin + var->vsync_len;
+       value = (value * vmul) / vdiv;
+       pr_debug("fb%d: vertical blank end    : %d\n", node, value);
+       svga_wcrt_multi(tm->v_blank_end_regs, value - 2);
+
+       value = var->yres + var->lower_margin;
+       value = (value * vmul) / vdiv;
+       pr_debug("fb%d: vertical sync start   : %d\n", node, value);
+       svga_wcrt_multi(tm->v_sync_start_regs, value);
+
+       value = var->yres + var->lower_margin + var->vsync_len;
+       value = (value * vmul) / vdiv;
+       pr_debug("fb%d: vertical sync end     : %d\n", node, value);
+       svga_wcrt_multi(tm->v_sync_end_regs, value);
+
+       /* Set horizontal and vertical sync pulse polarity in misc register */
+
+       regval = vga_r(NULL, VGA_MIS_R);
+       if (var->sync & FB_SYNC_HOR_HIGH_ACT) {
+               pr_debug("fb%d: positive horizontal sync\n", node);
+               regval = regval & ~0x80;
+       } else {
+               pr_debug("fb%d: negative horizontal sync\n", node);
+               regval = regval | 0x80;
+       }
+       if (var->sync & FB_SYNC_VERT_HIGH_ACT) {
+               pr_debug("fb%d: positive vertical sync\n", node);
+               regval = regval & ~0x40;
+       } else {
+               pr_debug("fb%d: negative vertical sync\n\n", node);
+               regval = regval | 0x40;
+       }
+       vga_w(NULL, VGA_MIS_W, regval);
+}
+
+
+/* ------------------------------------------------------------------------- */
+
+
+int svga_match_format(const struct svga_fb_format *frm, struct fb_var_screeninfo *var, struct fb_fix_screeninfo *fix)
+{
+       int i = 0;
+
+       while (frm->bits_per_pixel != SVGA_FORMAT_END_VAL)
+       {
+               if ((var->bits_per_pixel == frm->bits_per_pixel) &&
+                   (var->red.length     <= frm->red.length)     &&
+                   (var->green.length   <= frm->green.length)   &&
+                   (var->blue.length    <= frm->blue.length)    &&
+                   (var->transp.length  <= frm->transp.length)  &&
+                   (var->nonstd         == frm->nonstd)) {
+                       var->bits_per_pixel = frm->bits_per_pixel;
+                       var->red            = frm->red;
+                       var->green          = frm->green;
+                       var->blue           = frm->blue;
+                       var->transp         = frm->transp;
+                       var->nonstd         = frm->nonstd;
+                       if (fix != NULL) {
+                               fix->type      = frm->type;
+                               fix->type_aux  = frm->type_aux;
+                               fix->visual    = frm->visual;
+                               fix->xpanstep  = frm->xpanstep;
+                       }
+                       return i;
+               }
+               i++;
+               frm++;
+       }
+       return -EINVAL;
+}
+
+
+EXPORT_SYMBOL(svga_wcrt_multi);
+EXPORT_SYMBOL(svga_wseq_multi);
+
+EXPORT_SYMBOL(svga_set_default_gfx_regs);
+EXPORT_SYMBOL(svga_set_default_atc_regs);
+EXPORT_SYMBOL(svga_set_default_seq_regs);
+EXPORT_SYMBOL(svga_set_default_crt_regs);
+EXPORT_SYMBOL(svga_set_textmode_vga_regs);
+
+EXPORT_SYMBOL(svga_settile);
+EXPORT_SYMBOL(svga_tilecopy);
+EXPORT_SYMBOL(svga_tilefill);
+EXPORT_SYMBOL(svga_tileblit);
+EXPORT_SYMBOL(svga_tilecursor);
+
+EXPORT_SYMBOL(svga_compute_pll);
+EXPORT_SYMBOL(svga_check_timings);
+EXPORT_SYMBOL(svga_set_timings);
+EXPORT_SYMBOL(svga_match_format);
+
+MODULE_AUTHOR("Ondrej Zajicek <santiago@crfreenet.org>");
+MODULE_DESCRIPTION("Common utility functions for VGA-based graphics cards");
+MODULE_LICENSE("GPL");
index 4b88fab83b74bdbc008e8c3e86910e5549c79dac..7478d0e3e21153e998dc23800bd4c31bd44dc9cd 100644 (file)
@@ -13,7 +13,6 @@
 
 #include <linux/module.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/mm.h>
@@ -43,8 +42,9 @@ static void tgafb_imageblit(struct fb_info *, const struct fb_image *);
 static void tgafb_fillrect(struct fb_info *, const struct fb_fillrect *);
 static void tgafb_copyarea(struct fb_info *, const struct fb_copyarea *);
 
-static int tgafb_pci_register(struct pci_dev *, const struct pci_device_id *);
-static void tgafb_pci_unregister(struct pci_dev *);
+static int __devinit tgafb_pci_register(struct pci_dev *,
+                                       const struct pci_device_id *);
+static void __devexit tgafb_pci_unregister(struct pci_dev *);
 
 static const char *mode_option = "640x480@60";
 
@@ -70,9 +70,10 @@ static struct fb_ops tgafb_ops = {
  */
 
 static struct pci_device_id const tgafb_pci_table[] = {
-       { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TGA, PCI_ANY_ID, PCI_ANY_ID,
-         0, 0, 0 }
+       { PCI_DEVICE(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TGA) },
+       { }
 };
+MODULE_DEVICE_TABLE(pci, tgafb_pci_table);
 
 static struct pci_driver tgafb_driver = {
        .name                   = "tgafb",
@@ -99,6 +100,12 @@ tgafb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
                if (var->bits_per_pixel != 32)
                        return -EINVAL;
        }
+       var->red.length = var->green.length = var->blue.length = 8;
+       if (var->bits_per_pixel == 32) {
+               var->red.offset = 16;
+               var->green.offset = 8;
+               var->blue.offset = 0;
+       }
 
        if (var->xres_virtual != var->xres || var->yres_virtual != var->yres)
                return -EINVAL;
@@ -137,10 +144,10 @@ tgafb_set_par(struct fb_info *info)
                0x00000303
        };
        static unsigned int const mode_presets[4] = {
-               0x00002000,
-               0x00002300,
+               0x00000000,
+               0x00000300,
                0xffffffff,
-               0x00002300
+               0x00000300
        };
        static unsigned int const base_addr_presets[4] = {
                0x00000000,
@@ -152,7 +159,7 @@ tgafb_set_par(struct fb_info *info)
        struct tga_par *par = (struct tga_par *) info->par;
        u32 htimings, vtimings, pll_freq;
        u8 tga_type;
-       int i, j;
+       int i;
 
        /* Encode video timings.  */
        htimings = (((info->var.xres/4) & TGA_HORIZ_ACT_LSB)
@@ -190,7 +197,9 @@ tgafb_set_par(struct fb_info *info)
        while (TGA_READ_REG(par, TGA_CMD_STAT_REG) & 1) /* wait for not busy */
                continue;
        mb();
-       TGA_WRITE_REG(par, deep_presets[tga_type], TGA_DEEP_REG);
+       TGA_WRITE_REG(par, deep_presets[tga_type] |
+                          (par->sync_on_green ? 0x0 : 0x00010000),
+                     TGA_DEEP_REG);
        while (TGA_READ_REG(par, TGA_CMD_STAT_REG) & 1) /* wait for not busy */
                continue;
        mb();
@@ -227,8 +236,10 @@ tgafb_set_par(struct fb_info *info)
                BT485_WRITE(par, 0x00, BT485_ADDR_PAL_WRITE);
                TGA_WRITE_REG(par, BT485_DATA_PAL, TGA_RAMDAC_SETUP_REG);
 
+#ifdef CONFIG_HW_CONSOLE
                for (i = 0; i < 16; i++) {
-                       j = color_table[i];
+                       int j = color_table[i];
+
                        TGA_WRITE_REG(par, default_red[j]|(BT485_DATA_PAL<<8),
                                      TGA_RAMDAC_REG);
                        TGA_WRITE_REG(par, default_grn[j]|(BT485_DATA_PAL<<8),
@@ -236,24 +247,27 @@ tgafb_set_par(struct fb_info *info)
                        TGA_WRITE_REG(par, default_blu[j]|(BT485_DATA_PAL<<8),
                                      TGA_RAMDAC_REG);
                }
-               for (i = 0; i < 240*3; i += 4) {
-                       TGA_WRITE_REG(par, 0x55|(BT485_DATA_PAL<<8),
+               for (i = 0; i < 240 * 3; i += 4) {
+#else
+               for (i = 0; i < 256 * 3; i += 4) {
+#endif
+                       TGA_WRITE_REG(par, 0x55 | (BT485_DATA_PAL << 8),
                                      TGA_RAMDAC_REG);
-                       TGA_WRITE_REG(par, 0x00|(BT485_DATA_PAL<<8),
+                       TGA_WRITE_REG(par, 0x00 | (BT485_DATA_PAL << 8),
                                      TGA_RAMDAC_REG);
-                       TGA_WRITE_REG(par, 0x00|(BT485_DATA_PAL<<8),
+                       TGA_WRITE_REG(par, 0x00 | (BT485_DATA_PAL << 8),
                                      TGA_RAMDAC_REG);
-                       TGA_WRITE_REG(par, 0x00|(BT485_DATA_PAL<<8),
+                       TGA_WRITE_REG(par, 0x00 | (BT485_DATA_PAL << 8),
                                      TGA_RAMDAC_REG);
                }
 
        } else { /* 24-plane or 24plusZ */
 
-               /* Init BT463 registers.  */
+               /* Init BT463 RAMDAC registers.  */
                BT463_WRITE(par, BT463_REG_ACC, BT463_CMD_REG_0, 0x40);
                BT463_WRITE(par, BT463_REG_ACC, BT463_CMD_REG_1, 0x08);
                BT463_WRITE(par, BT463_REG_ACC, BT463_CMD_REG_2,
-                           (par->sync_on_green ? 0x80 : 0x40));
+                           (par->sync_on_green ? 0xc0 : 0x40));
 
                BT463_WRITE(par, BT463_REG_ACC, BT463_READ_MASK_0, 0xff);
                BT463_WRITE(par, BT463_REG_ACC, BT463_READ_MASK_1, 0xff);
@@ -267,26 +281,24 @@ tgafb_set_par(struct fb_info *info)
 
                /* Fill the palette.  */
                BT463_LOAD_ADDR(par, 0x0000);
-               TGA_WRITE_REG(par, BT463_PALETTE<<2, TGA_RAMDAC_REG);
+               TGA_WRITE_REG(par, BT463_PALETTE << 2, TGA_RAMDAC_SETUP_REG);
 
+#ifdef CONFIG_HW_CONSOLE
                for (i = 0; i < 16; i++) {
-                       j = color_table[i];
-                       TGA_WRITE_REG(par, default_red[j]|(BT463_PALETTE<<10),
-                                     TGA_RAMDAC_REG);
-                       TGA_WRITE_REG(par, default_grn[j]|(BT463_PALETTE<<10),
-                                     TGA_RAMDAC_REG);
-                       TGA_WRITE_REG(par, default_blu[j]|(BT463_PALETTE<<10),
-                                     TGA_RAMDAC_REG);
+                       int j = color_table[i];
+
+                       TGA_WRITE_REG(par, default_red[j], TGA_RAMDAC_REG);
+                       TGA_WRITE_REG(par, default_grn[j], TGA_RAMDAC_REG);
+                       TGA_WRITE_REG(par, default_blu[j], TGA_RAMDAC_REG);
                }
-               for (i = 0; i < 512*3; i += 4) {
-                       TGA_WRITE_REG(par, 0x55|(BT463_PALETTE<<10),
-                                     TGA_RAMDAC_REG);
-                       TGA_WRITE_REG(par, 0x00|(BT463_PALETTE<<10),
-                                     TGA_RAMDAC_REG);
-                       TGA_WRITE_REG(par, 0x00|(BT463_PALETTE<<10),
-                                     TGA_RAMDAC_REG);
-                       TGA_WRITE_REG(par, 0x00|(BT463_PALETTE<<10),
-                                     TGA_RAMDAC_REG);
+               for (i = 0; i < 512 * 3; i += 4) {
+#else
+               for (i = 0; i < 528 * 3; i += 4) {
+#endif
+                       TGA_WRITE_REG(par, 0x55, TGA_RAMDAC_REG);
+                       TGA_WRITE_REG(par, 0x00, TGA_RAMDAC_REG);
+                       TGA_WRITE_REG(par, 0x00, TGA_RAMDAC_REG);
+                       TGA_WRITE_REG(par, 0x00, TGA_RAMDAC_REG);
                }
 
                /* Fill window type table after start of vertical retrace.  */
@@ -299,15 +311,12 @@ tgafb_set_par(struct fb_info *info)
                TGA_WRITE_REG(par, 0x01, TGA_INTR_STAT_REG);
 
                BT463_LOAD_ADDR(par, BT463_WINDOW_TYPE_BASE);
-               TGA_WRITE_REG(par, BT463_REG_ACC<<2, TGA_RAMDAC_SETUP_REG);
+               TGA_WRITE_REG(par, BT463_REG_ACC << 2, TGA_RAMDAC_SETUP_REG);
 
                for (i = 0; i < 16; i++) {
-                       TGA_WRITE_REG(par, 0x00|(BT463_REG_ACC<<10),
-                                     TGA_RAMDAC_REG);
-                       TGA_WRITE_REG(par, 0x01|(BT463_REG_ACC<<10),
-                                     TGA_RAMDAC_REG);
-                       TGA_WRITE_REG(par, 0x80|(BT463_REG_ACC<<10),
-                                     TGA_RAMDAC_REG);
+                       TGA_WRITE_REG(par, 0x00, TGA_RAMDAC_REG);
+                       TGA_WRITE_REG(par, 0x01, TGA_RAMDAC_REG);
+                       TGA_WRITE_REG(par, 0x00, TGA_RAMDAC_REG);
                }
 
        }
@@ -435,9 +444,16 @@ tgafb_setcolreg(unsigned regno, unsigned red, unsigned green, unsigned blue,
                TGA_WRITE_REG(par, red|(BT485_DATA_PAL<<8),TGA_RAMDAC_REG);
                TGA_WRITE_REG(par, green|(BT485_DATA_PAL<<8),TGA_RAMDAC_REG);
                TGA_WRITE_REG(par, blue|(BT485_DATA_PAL<<8),TGA_RAMDAC_REG);
-       } else if (regno < 16) {
-               u32 value = (red << 16) | (green << 8) | blue;
-               ((u32 *)info->pseudo_palette)[regno] = value;
+       } else {
+               if (regno < 16) {
+                       u32 value = (regno << 16) | (regno << 8) | regno;
+                       ((u32 *)info->pseudo_palette)[regno] = value;
+               }
+               BT463_LOAD_ADDR(par, regno);
+               TGA_WRITE_REG(par, BT463_PALETTE << 2, TGA_RAMDAC_SETUP_REG);
+               TGA_WRITE_REG(par, red, TGA_RAMDAC_REG);
+               TGA_WRITE_REG(par, green, TGA_RAMDAC_REG);
+               TGA_WRITE_REG(par, blue, TGA_RAMDAC_REG);
        }
 
        return 0;
@@ -885,7 +901,7 @@ copyarea_line_8bpp(struct fb_info *info, u32 dy, u32 sy,
 
        n64 = (height * width) / 64;
 
-       if (dy < sy) {
+       if (sy < dy) {
                spos = (sy + height) * width;
                dpos = (dy + height) * width;
 
@@ -933,7 +949,7 @@ copyarea_line_32bpp(struct fb_info *info, u32 dy, u32 sy,
 
        n16 = (height * width) / 16;
 
-       if (dy < sy) {
+       if (sy < dy) {
                src = tga_fb + (sy + height) * width * 4;
                dst = tga_fb + (dy + height) * width * 4;
 
@@ -1317,7 +1333,7 @@ tgafb_init_fix(struct fb_info *info)
        info->fix.type_aux = 0;
        info->fix.visual = (tga_type == TGA_TYPE_8PLANE
                            ? FB_VISUAL_PSEUDOCOLOR
-                           : FB_VISUAL_TRUECOLOR);
+                           : FB_VISUAL_DIRECTCOLOR);
 
        info->fix.line_length = par->xres * (par->bits_per_pixel >> 3);
        info->fix.smem_start = (size_t) par->tga_fb_base;
@@ -1342,14 +1358,10 @@ tgafb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
                TGA_24PLUSZ_FB_OFFSET
        };
 
-       struct all_info {
-               struct fb_info info;
-               struct tga_par par;
-               u32 pseudo_palette[16];
-       } *all;
-
        void __iomem *mem_base;
        unsigned long bar0_start, bar0_len;
+       struct fb_info *info;
+       struct tga_par *par;
        u8 tga_type;
        int ret;
 
@@ -1360,13 +1372,14 @@ tgafb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        /* Allocate the fb and par structures.  */
-       all = kmalloc(sizeof(*all), GFP_KERNEL);
-       if (!all) {
+       info = framebuffer_alloc(sizeof(struct tga_par), &pdev->dev);
+       if (!info) {
                printk(KERN_ERR "tgafb: Cannot allocate memory\n");
                return -ENOMEM;
        }
-       memset(all, 0, sizeof(*all));
-       pci_set_drvdata(pdev, all);
+
+       par = info->par;
+       pci_set_drvdata(pdev, info);
 
        /* Request the mem regions.  */
        bar0_start = pci_resource_start(pdev, 0);
@@ -1386,25 +1399,23 @@ tgafb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        /* Grab info about the card.  */
        tga_type = (readl(mem_base) >> 12) & 0x0f;
-       all->par.pdev = pdev;
-       all->par.tga_mem_base = mem_base;
-       all->par.tga_fb_base = mem_base + fb_offset_presets[tga_type];
-       all->par.tga_regs_base = mem_base + TGA_REGS_OFFSET;
-       all->par.tga_type = tga_type;
-       pci_read_config_byte(pdev, PCI_REVISION_ID, &all->par.tga_chip_rev);
+       par->pdev = pdev;
+       par->tga_mem_base = mem_base;
+       par->tga_fb_base = mem_base + fb_offset_presets[tga_type];
+       par->tga_regs_base = mem_base + TGA_REGS_OFFSET;
+       par->tga_type = tga_type;
+       pci_read_config_byte(pdev, PCI_REVISION_ID, &par->tga_chip_rev);
 
        /* Setup framebuffer.  */
-       all->info.flags = FBINFO_DEFAULT | FBINFO_HWACCEL_COPYAREA |
-                          FBINFO_HWACCEL_IMAGEBLIT | FBINFO_HWACCEL_FILLRECT;
-       all->info.fbops = &tgafb_ops;
-       all->info.screen_base = all->par.tga_fb_base;
-       all->info.par = &all->par;
-       all->info.pseudo_palette = all->pseudo_palette;
+       info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_COPYAREA |
+                     FBINFO_HWACCEL_IMAGEBLIT | FBINFO_HWACCEL_FILLRECT;
+       info->fbops = &tgafb_ops;
+       info->screen_base = par->tga_fb_base;
+       info->pseudo_palette = (void *)(par + 1);
 
        /* This should give a reasonable default video mode.  */
 
-       ret = fb_find_mode(&all->info.var, &all->info, mode_option,
-                          NULL, 0, NULL,
+       ret = fb_find_mode(&info->var, info, mode_option, NULL, 0, NULL,
                           tga_type == TGA_TYPE_8PLANE ? 8 : 32);
        if (ret == 0 || ret == 4) {
                printk(KERN_ERR "tgafb: Could not find valid video mode\n");
@@ -1412,29 +1423,28 @@ tgafb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto err1;
        }
 
-       if (fb_alloc_cmap(&all->info.cmap, 256, 0)) {
+       if (fb_alloc_cmap(&info->cmap, 256, 0)) {
                printk(KERN_ERR "tgafb: Could not allocate color map\n");
                ret = -ENOMEM;
                goto err1;
        }
 
-       tgafb_set_par(&all->info);
-       tgafb_init_fix(&all->info);
+       tgafb_set_par(info);
+       tgafb_init_fix(info);
 
-       all->info.device = &pdev->dev;
-       if (register_framebuffer(&all->info) < 0) {
+       if (register_framebuffer(info) < 0) {
                printk(KERN_ERR "tgafb: Could not register framebuffer\n");
                ret = -EINVAL;
                goto err1;
        }
 
        printk(KERN_INFO "tgafb: DC21030 [TGA] detected, rev=0x%02x\n",
-              all->par.tga_chip_rev);
+              par->tga_chip_rev);
        printk(KERN_INFO "tgafb: at PCI bus %d, device %d, function %d\n",
               pdev->bus->number, PCI_SLOT(pdev->devfn),
               PCI_FUNC(pdev->devfn));
        printk(KERN_INFO "fb%d: %s frame buffer device at 0x%lx\n",
-              all->info.node, all->info.fix.id, bar0_start);
+              info->node, info->fix.id, bar0_start);
 
        return 0;
 
@@ -1443,11 +1453,11 @@ tgafb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
                iounmap(mem_base);
        release_mem_region(bar0_start, bar0_len);
  err0:
-       kfree(all);
+       framebuffer_release(info);
        return ret;
 }
 
-static void __exit
+static void __devexit
 tgafb_pci_unregister(struct pci_dev *pdev)
 {
        struct fb_info *info = pci_get_drvdata(pdev);
@@ -1456,22 +1466,21 @@ tgafb_pci_unregister(struct pci_dev *pdev)
        if (!info)
                return;
        unregister_framebuffer(info);
+       fb_dealloc_cmap(&info->cmap);
        iounmap(par->tga_mem_base);
        release_mem_region(pci_resource_start(pdev, 0),
                           pci_resource_len(pdev, 0));
-       kfree(info);
+       framebuffer_release(info);
 }
 
-#ifdef MODULE
-static void __exit
+static void __devexit
 tgafb_exit(void)
 {
        pci_unregister_driver(&tgafb_driver);
 }
-#endif /* MODULE */
 
 #ifndef MODULE
-int __init
+static int __devinit
 tgafb_setup(char *arg)
 {
        char *this_opt;
@@ -1493,7 +1502,7 @@ tgafb_setup(char *arg)
 }
 #endif /* !MODULE */
 
-int __init
+static int __devinit
 tgafb_init(void)
 {
 #ifndef MODULE
@@ -1511,10 +1520,7 @@ tgafb_init(void)
  */
 
 module_init(tgafb_init);
-
-#ifdef MODULE
 module_exit(tgafb_exit);
-#endif
 
 MODULE_DESCRIPTION("framebuffer driver for TGA chipset");
 MODULE_LICENSE("GPL");
index 6aff63d5b295f97211a88ef84243f16613d4c7a1..ec4c7dc54a66972dbc662e0137b468d2bda088aa 100644 (file)
@@ -70,7 +70,8 @@ struct vga16fb_par {
                unsigned char   ClockingMode;     /* Seq-Controller:01h */
        } vga_state;
        struct vgastate state;
-       atomic_t ref_count;
+       struct mutex open_lock;
+       unsigned int ref_count;
        int palette_blanked, vesa_blanked, mode, isVGA;
        u8 misc, pel_msk, vss, clkdiv;
        u8 crtc[VGA_CRT_C];
@@ -300,28 +301,33 @@ static void vga16fb_clock_chip(struct vga16fb_par *par,
 static int vga16fb_open(struct fb_info *info, int user)
 {
        struct vga16fb_par *par = info->par;
-       int cnt = atomic_read(&par->ref_count);
 
-       if (!cnt) {
+       mutex_lock(&par->open_lock);
+       if (!par->ref_count) {
                memset(&par->state, 0, sizeof(struct vgastate));
                par->state.flags = VGA_SAVE_FONTS | VGA_SAVE_MODE |
                        VGA_SAVE_CMAP;
                save_vga(&par->state);
        }
-       atomic_inc(&par->ref_count);
+       par->ref_count++;
+       mutex_unlock(&par->open_lock);
+
        return 0;
 }
 
 static int vga16fb_release(struct fb_info *info, int user)
 {
        struct vga16fb_par *par = info->par;
-       int cnt = atomic_read(&par->ref_count);
 
-       if (!cnt)
+       mutex_lock(&par->open_lock);
+       if (!par->ref_count) {
+               mutex_unlock(&par->open_lock);
                return -EINVAL;
-       if (cnt == 1)
+       }
+       if (par->ref_count == 1)
                restore_vga(&par->state);
-       atomic_dec(&par->ref_count);
+       par->ref_count--;
+       mutex_unlock(&par->open_lock);
 
        return 0;
 }
@@ -1357,6 +1363,7 @@ static int __init vga16fb_probe(struct platform_device *dev)
        printk(KERN_INFO "vga16fb: mapped to 0x%p\n", info->screen_base);
        par = info->par;
 
+       mutex_init(&par->open_lock);
        par->isVGA = ORIG_VIDEO_ISVGA;
        par->palette_blanked = 0;
        par->vesa_blanked = 0;
diff --git a/drivers/video/virgefb.c b/drivers/video/virgefb.c
deleted file mode 100644 (file)
index b9fb6fb..0000000
+++ /dev/null
@@ -1,2526 +0,0 @@
-/*
- * linux/drivers/video/virgefb.c -- CyberVision64/3D frame buffer device
- *
- *    Copyright (C) 1997 André Heynatz
- *
- *
- * This file is based on the CyberVision frame buffer device (cyberfb.c):
- *
- *    Copyright (C) 1996 Martin Apel
- *                       Geert Uytterhoeven
- *
- * Zorro II additions :
- *
- *    Copyright (C) 1998-2000 Christian T. Steigies
- *
- * Initialization additions :
- *
- *    Copyright (C) 1998-2000 Ken Tyler
- *
- * Parts of the Initialization code are based on Cyberfb.c by Allan Bair,
- * and on the NetBSD CyberVision64 frame buffer driver by Michael Teske who gave
- * permission for its use.
- *
- * Many thanks to Frank Mariak for his assistance with ZORRO 2 access and other
- * mysteries.
- *
- *
- *
- * 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.
- */
-
-#undef VIRGEFBDEBUG
-#undef VIRGEFBDUMP
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/mm.h>
-#include <linux/slab.h>
-#include <linux/delay.h>
-#include <linux/zorro.h>
-#include <linux/fb.h>
-#include <linux/init.h>
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <asm/amigahw.h>
-#include <asm/io.h>
-#include <asm/irq.h>
-#include <video/fbcon.h>
-#include <video/fbcon-cfb8.h>
-#include <video/fbcon-cfb16.h>
-#include <video/fbcon-cfb32.h>
-
-#include "virgefb.h"
-
-#ifdef VIRGEFBDEBUG
-#define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , ## args)
-#else
-#define DPRINTK(fmt, args...)
-#endif
-
-#ifdef VIRGEFBDUMP
-static void cv64_dump(void);
-#define DUMP cv64_dump()
-#else
-#define DUMP
-#endif
-
-/*
- *     Macros for register access and zorro control
- */
-
-static inline void mb_inline(void) { mb(); }   /* for use in comma expressions */
-
-/* Set zorro 2 map */
-
-#define SelectIO \
-       mb(); \
-       if (on_zorro2) { \
-               (*(volatile u16 *)((u8 *)(vcode_switch_base + 0x04)) = 0x01); \
-               mb(); \
-       }
-
-#define        SelectMMIO \
-       mb(); \
-       if (on_zorro2) { \
-               (*(volatile u16 *)((u8 *)(vcode_switch_base + 0x04)) = 0x02); \
-               mb(); \
-       }
-
-#define        SelectCFG \
-       mb(); \
-       if (on_zorro2) { \
-               (*(volatile u16 *)((u8 *)(vcode_switch_base + 0x04)) = 0x03); \
-               mb(); \
-       }
-
-/* Set pass through, 0 = amiga, !=0 = cv64/3d */
-
-#define SetVSwitch(x) \
-       mb(); \
-       (*(volatile u16 *)((u8 *)(vcode_switch_base)) = \
-       (u16)(x ? 0 : 1)); \
-       mb();
-
-/* Zorro2 endian 'aperture' */
-
-#define ENDIAN_BYTE    2
-#define ENDIAN_WORD    1
-#define ENDIAN_LONG    0
-
-#define Select_Zorro2_FrameBuffer(x) \
-       do { \
-               if (on_zorro2) { \
-                       mb(); \
-                       (*(volatile u16 *)((u8 *)(vcode_switch_base + 0x08)) = \
-                       (x * 0x40)); \
-                       mb(); \
-               } \
-       } while (0)
-
-/* SetPortVal - only used for interrupt enable (not yet implemented) */
-
-#if 0
-#define SetPortVal(x) \
-       mb(); \
-       (*(volatile u16 *)((u8 *)(vcode_switch_base + 0x0c)) = \
-       (u16)x); \
-       mb();
-#endif
-
-/* IO access */
-
-#define byte_access_io(x)      (((x) & 0x3ffc) | (((x) & 3)^3) | (((x) & 3) <<14))
-#define byte_access_mmio(x)    (((x) & 0xfffc) | (((x) & 3)^3))
-
-/* Write 8 bit VGA register - used once for chip wakeup */
-
-#define wb_vgaio(reg, dat) \
-       SelectIO; \
-       (*(volatile u8 *)(vgaio_regs + ((u32)byte_access_io(reg) & 0xffff)) = \
-       (dat & 0xff)); \
-       SelectMMIO;
-
-/* Read 8 bit VGA register - only used in dump (SelectIO not needed on read ?) */
-
-#ifdef VIRGEFBDUMP
-#define rb_vgaio(reg) \
-       ({ \
-       u8 __zzyzx; \
-       SelectIO; \
-       __zzyzx = (*(volatile u8 *)((vgaio_regs)+(u32)byte_access_io(reg))); \
-       SelectMMIO; \
-       __zzyzx; \
-       })
-#endif
-
-/* MMIO access */
-
-/* Read 8 bit MMIO register */
-
-#define rb_mmio(reg) \
-       (mb_inline(), \
-       (*(volatile u8 *)(mmio_regs + 0x8000 + (u32)byte_access_mmio(reg))))
-
-/* Write 8 bit MMIO register */
-
-#define wb_mmio(reg,dat) \
-       mb(); \
-       (*(volatile u8 *)(mmio_regs + 0x8000 + (byte_access_mmio((reg) & 0xffff))) = \
-       (dat & 0xff)); \
-       mb();
-
-/* Read 32 bit MMIO register */
-
-#define rl_mmio(reg) \
-       (mb_inline(), \
-       (*((volatile u32 *)((u8 *)((mmio_regs + (on_zorro2 ? 0x20000 : 0)) + (reg))))))
-
-/* Write 32 bit MMIO register */
-
-#define wl_mmio(reg,dat) \
-       mb(); \
-       ((*(volatile u32 *)((u8 *)((mmio_regs + (on_zorro2 ? 0x20000 : 0)) + (reg)))) = \
-       (u32)(dat)); \
-       mb();
-
-/* Write to virge graphics register */
-
-#define wgfx(reg, dat) do { wb_mmio(GCT_ADDRESS, (reg)); wb_mmio(GCT_ADDRESS_W, (dat)); } while (0)
-
-/* Write to virge sequencer register */
-
-#define wseq(reg, dat) do { wb_mmio(SEQ_ADDRESS, (reg)); wb_mmio(SEQ_ADDRESS_W, (dat)); } while (0)
-
-/* Write to virge CRT controller register */
-
-#define wcrt(reg, dat) do { wb_mmio(CRT_ADDRESS, (reg)); wb_mmio(CRT_ADDRESS_W, (dat)); } while (0)
-
-/* Write to virge attribute register */
-
-#define watr(reg, dat) \
-       do { \
-               volatile unsigned char watr_tmp; \
-               watr_tmp = rb_mmio(ACT_ADDRESS_RESET); \
-               wb_mmio(ACT_ADDRESS_W, (reg)); \
-               wb_mmio(ACT_ADDRESS_W, (dat)); \
-               udelay(10); \
-       } while (0)
-
-/* end of macros */
-
-struct virgefb_par {
-   struct fb_var_screeninfo var;
-   __u32 type;
-   __u32 type_aux;
-   __u32 visual;
-   __u32 line_length;
-};
-
-static struct virgefb_par current_par;
-
-static int current_par_valid = 0;
-
-static struct display disp;
-static struct fb_info fb_info;
-
-static union {
-#ifdef FBCON_HAS_CFB16
-    u16 cfb16[16];
-#endif
-#ifdef FBCON_HAS_CFB32
-    u32 cfb32[16];
-#endif
-} fbcon_cmap;
-
-/*
- *    Switch for Chipset Independency
- */
-
-static struct fb_hwswitch {
-
-   /* Initialisation */
-
-   int (*init)(void);
-
-   /* Display Control */
-
-   int (*encode_fix)(struct fb_fix_screeninfo *fix, struct virgefb_par *par);
-   int (*decode_var)(struct fb_var_screeninfo *var, struct virgefb_par *par);
-   int (*encode_var)(struct fb_var_screeninfo *var, struct virgefb_par *par);
-   int (*getcolreg)(u_int regno, u_int *red, u_int *green, u_int *blue,
-                    u_int *transp, struct fb_info *info);
-   void (*blank)(int blank);
-} *fbhw;
-
-static unsigned char blit_maybe_busy = 0;
-
-/*
- *    Frame Buffer Name
- */
-
-static char virgefb_name[16] = "CyberVision/3D";
-
-/*
- *    CyberVision64/3d Graphics Board
- */
-
-static unsigned char virgefb_colour_table [256][3];
-static unsigned long v_ram;
-static unsigned long v_ram_size;
-static volatile unsigned char *mmio_regs;
-static volatile unsigned char *vgaio_regs;
-
-static unsigned long v_ram_phys;
-static unsigned long mmio_regs_phys;
-static unsigned long vcode_switch_base;
-static unsigned char on_zorro2;
-
-/*
- * Offsets from start of video ram to appropriate ZIII aperture
- */
-
-#ifdef FBCON_HAS_CFB8
-#define CYBMEM_OFFSET_8  0x800000      /* BGRX */
-#endif
-#ifdef FBCON_HAS_CFB16
-#define CYBMEM_OFFSET_16 0x400000      /* GBXR */
-#endif
-#ifdef FBCON_HAS_CFB32
-#define CYBMEM_OFFSET_32 0x000000      /* XRGB */
-#endif
-
-/*
- *    MEMCLOCK was 32MHz, 64MHz works, 72MHz doesn't (on my board)
- */
-
-#define MEMCLOCK 50000000
-
-/*
- *    Predefined Video Modes
- */
-
-static struct {
-    const char *name;
-    struct fb_var_screeninfo var;
-} virgefb_predefined[] __initdata = {
-#ifdef FBCON_HAS_CFB8
-    {
-       "640x480-8", {          /* Cybervision 8 bpp */
-           640, 480, 640, 480, 0, 0, 8, 0,
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 31250, 160, 136, 82, 61, 88, 2,
-           0, FB_VMODE_NONINTERLACED
-           }
-    }, {
-       "768x576-8", {          /* Cybervision 8 bpp */
-           768, 576, 768, 576, 0, 0, 8, 0,
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 29411, 144, 112, 32, 15, 64, 2,
-           0, FB_VMODE_NONINTERLACED
-           }
-    }, {
-       "800x600-8", {          /* Cybervision 8 bpp */
-           800, 600, 800, 600, 0, 0, 8, 0,
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 28571, 168, 104, 22, 1, 48, 2,
-           0, FB_VMODE_NONINTERLACED
-           }
-    }, {
-  #if 0 
-       "1024x768-8", {         /* Cybervision 8 bpp */
-           1024, 768, 1024, 768, 0, 0, 8, 0,
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 20833, 272, 168, 39, 2, 72, 1,
-           0, FB_VMODE_NONINTERLACED
-           }
-  #else
-       "1024x768-8", {
-           1024, 768, 1024, 768, 0, 0, 8, 0,
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-   #if 0
-           0, 0, -1, -1, FB_ACCELF_TEXT, 12500, 184, 40, 40, 2, 96, 1,
-           FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-           }
-    #else
-           0, 0, -1, -1, FB_ACCELF_TEXT, 12699, 176, 16, 28, 1, 96, 3,
-           FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-           }
-    #endif
-  #endif
-    }, {
-       "1152x886-8", {         /* Cybervision 8 bpp */
-           1152, 886, 1152, 886, 0, 0, 8, 0,
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 19230, 280, 168, 45, 1, 64, 10,
-           0, FB_VMODE_NONINTERLACED
-           }
-    }, {
-       "1280x1024-8", {        /* Cybervision 8 bpp */
-           1280, 1024, 1280, 1024, 0, 0, 8, 0,
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-  #if 0
-           0, 0, -1, -1, FB_ACCELF_TEXT, 17857, 232, 232, 71, 15, 176, 12,
-           }
-  #else
-           0, 0, -1, -1, FB_ACCELF_TEXT, 7414, 232, 64, 38, 1, 112, 3,
-           FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-           }
-  #endif
-    }, {
-       "1600x1200-8", {        /* Cybervision 8 bpp */
-           1600, 1200, 1600, 1200, 0, 0, 8, 0,
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-  #if 0
-           0, 0, -1, -1, FB_ACCELF_TEXT, 13698, 336, 224, 77, 15, 176, 12,
-           0, FB_VMODE_NONINTERLACED
-           }
-  #else
-           0, 0, -1, -1, FB_ACCELF_TEXT, 6411, 256, 32, 52, 10, 160, 8,
-           FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-           }
-  #endif
-    },
-#endif
-
-#ifdef FBCON_HAS_CFB16
-    {
-       "640x480-16", {         /* Cybervision 16 bpp */
-           640, 480, 640, 480, 0, 0, 16, 0,
-           {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 31250, 152, 144, 82, 61, 88, 2,
-           0, FB_VMODE_NONINTERLACED
-           }
-    }, {
-       "768x576-16", {         /* Cybervision 16 bpp */
-           768, 576, 768, 576, 0, 0, 16, 0,
-           {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 29411, 144, 112, 32, 15, 64, 2,
-           0, FB_VMODE_NONINTERLACED
-           }
-    }, {
-       "800x600-16", {         /* Cybervision 16 bpp */
-           800, 600, 800, 600, 0, 0, 16, 0,
-           {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 28571, 168, 104, 22, 1, 48, 2,
-           0, FB_VMODE_NONINTERLACED
-           }
-    }, {
-#if 0
-       "1024x768-16", {        /* Cybervision 16 bpp */
-           1024, 768, 1024, 768, 0, 0, 16, 0,
-           {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 20833, 272, 168, 39, 2, 72, 1,
-           0, FB_VMODE_NONINTERLACED
-           }
-#else
-         "1024x768-16", {
-             1024, 768, 1024, 768, 0, 0, 16, 0,
-             {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-             0, 0, -1, -1, FB_ACCELF_TEXT, 12500, 184, 40, 40, 2, 96, 1,
-             FB_SYNC_COMP_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-         }
-#endif
-    }, {
-       "1152x886-16", {        /* Cybervision 16 bpp */
-           1152, 886, 1152, 886, 0, 0, 16, 0,
-           {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 19230, 280, 168, 45, 1, 64, 10,
-           0, FB_VMODE_NONINTERLACED
-           }
-    }, {
-       "1280x1024-16", {       /* Cybervision 16 bpp */
-           1280, 1024, 1280, 1024, 0, 0, 16, 0,
-           {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 17857, 232, 232, 71, 15, 176, 12,
-           0, FB_VMODE_NONINTERLACED
-           }
-    }, {
-       "1600x1200-16", {       /* Cybervision 16 bpp */
-           1600, 1200, 1600, 1200, 0, 0, 16, 0,
-           {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 13698, 336, 224, 77, 15, 176, 12,
-           0, FB_VMODE_NONINTERLACED
-           }
-    },
-#endif
-
-#ifdef FBCON_HAS_CFB32
-    {
-       "640x480-32", {         /* Cybervision 32 bpp */
-           640, 480, 640, 480, 0, 0, 32, 0,
-           {16, 8, 0}, {8, 8, 0}, {0, 8, 0}, {24, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 31250, 160, 136, 82, 61, 88, 2,
-           0, FB_VMODE_NONINTERLACED
-           }
-     }, {
-       "768x576-32", {         /* Cybervision 32 bpp */
-           768, 576, 768, 576, 0, 0, 32, 0,
-           {16, 8, 0}, {8, 8, 0}, {0, 8, 0}, {24, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 29411, 144, 112, 32, 15, 64, 2,
-           0, FB_VMODE_NONINTERLACED
-           }
-     }, {
-       "800x600-32", {         /* Cybervision 32 bpp */
-           800, 600, 800, 600, 0, 0, 32, 0,
-           {16, 8, 0}, {8, 8, 0}, {0, 8, 0}, {24, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 28571, 168, 104, 22, 1, 48, 2,
-           0, FB_VMODE_NONINTERLACED
-           }
-     }, {
-       "1024x768-32", {        /* Cybervision 32 bpp */
-           1024, 768, 1024, 768, 0, 0, 32, 0,
-           {16, 8, 0}, {8, 8, 0}, {0, 8, 0}, {24, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 20833, 272, 168, 39, 2, 72, 1,
-           0, FB_VMODE_NONINTERLACED
-           }
-    }, {
-       "1152x886-32", {        /* Cybervision 32 bpp */
-           1152, 886, 1152, 886, 0, 0, 32, 0,
-           {16, 8, 0}, {8, 8, 0}, {0, 8, 0}, {24, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 19230, 280, 168, 45, 1, 64, 10,
-           0, FB_VMODE_NONINTERLACED
-           }
-    }, {
-       "1280x1024-32", {       /* Cybervision 32 bpp */
-           1280, 1024, 1280, 1024, 0, 0, 32, 0,
-           {16, 8, 0}, {8, 8, 0}, {0, 8, 0}, {24, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 17857, 232, 232, 71, 15, 176, 12,
-           0, FB_VMODE_NONINTERLACED
-           }
-    }, {
-       "1600x1200-32", {       /* Cybervision 32 bpp */
-           1600, 1200, 1600, 1200, 0, 0, 32, 0,
-           {16, 8, 0}, {8, 8, 0}, {0, 8, 0}, {24, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 13698, 336, 224, 77, 15, 176, 12,
-           0, FB_VMODE_NONINTERLACED
-           }
-    },
-#endif
-
-/* interlaced modes */
-
-#ifdef FBCON_HAS_CFB8
-    {
-       "1024x768-8i", {        /* Cybervision 8 bpp */
-           1024, 768, 1024, 768, 0, 0, 8, 0,
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 20833, 272, 168, 39, 2, 72, 1,
-           0, FB_VMODE_INTERLACED
-           }
-    }, {
-       "1280x1024-8i", {       /* Cybervision 8 bpp */
-           1280, 1024, 1280, 1024, 0, 0, 8, 0,
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 17857, 232, 232, 71, 15, 176, 12,
-           0, FB_VMODE_INTERLACED
-           }
-    }, {
-       "1600x1200-8i", {       /* Cybervision 8 bpp */
-           1600, 1200, 1600, 1200, 0, 0, 8, 0,
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 13698, 336, 224, 77, 15, 176, 12,
-           0, FB_VMODE_INTERLACED
-           }
-    },
-#endif
-
-#ifdef FBCON_HAS_CFB16
-    {
-       "1024x768-16i", {       /* Cybervision 16 bpp */
-           1024, 768, 1024, 768, 0, 0, 16, 0,
-           {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 20833, 272, 168, 39, 2, 72, 1,
-           0, FB_VMODE_INTERLACED
-           }
-    }, {
-       "1280x1024-16i", {      /* Cybervision 16 bpp */
-           1280, 1024, 1280, 1024, 0, 0, 16, 0,
-           {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 17857, 232, 232, 71, 15, 176, 12,
-           0, FB_VMODE_INTERLACED
-           }
-    }, {
-       "1600x1200-16i", {      /* Cybervision 16 bpp */
-           1600, 1200, 1600, 1200, 0, 0, 16, 0,
-           {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 13698, 336, 224, 77, 15, 176, 12,
-           0, FB_VMODE_INTERLACED
-           }
-    },
-#endif
-
-#ifdef FBCON_HAS_CFB32
-    {
-       "1024x768-32i", {       /* Cybervision 32 bpp */
-           1024, 768, 1024, 768, 0, 0, 32, 0,
-           {16, 8, 0}, {8, 8, 0}, {0, 8, 0}, {24, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 22222, 216, 144, 39, 2, 72, 1,
-           0, FB_VMODE_INTERLACED
-           }
-    }, {
-       "1280x1024-32i", {      /* Cybervision 32 bpp */
-           1280, 1024, 1280, 1024, 0, 0, 32, 0,
-           {16, 8, 0}, {8, 8, 0}, {0, 8, 0}, {23, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 17857, 232, 232, 71, 15, 176, 12,
-           0, FB_VMODE_INTERLACED
-           }
-    }, {
-       "1600x1200-32i", {      /* Cybervision 32 bpp */
-           1600, 1200, 1600, 1200, 0, 0, 32, 0,
-           {16, 8, 0}, {8, 8, 0}, {0, 8, 0}, {24, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 13698, 336, 224, 77, 15, 176, 12,
-           0, FB_VMODE_INTERLACED
-           }
-    },
-#endif
-
-/* doublescan modes */
-
-#ifdef FBCON_HAS_CFB8
-    {
-       "320x240-8d", {         /* Cybervision 8 bpp */
-           320, 240, 320, 240, 0, 0, 8, 0,
-           {0, 8, 0}, {0, 8, 0}, {0, 8, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 59259, 80, 80, 45, 26, 32, 1,
-           0, FB_VMODE_DOUBLE
-           }
-    },
-#endif
-
-#ifdef FBCON_HAS_CFB16
-    {
-       "320x240-16d", {        /* Cybervision 16 bpp */
-           320, 240, 320, 240, 0, 0, 16, 0,
-           {11, 5, 0}, {5, 6, 0}, {0, 5, 0}, {0, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 59259, 80, 80, 45, 26, 32, 1,
-           0, FB_VMODE_DOUBLE
-           }
-    },
-#endif
-
-#ifdef FBCON_HAS_CFB32
-    {
-       "320x240-32d", {        /* Cybervision 32 bpp */
-           320, 240, 320, 240, 0, 0, 32, 0,
-           {16, 8, 0}, {8, 8, 0}, {0, 8, 0}, {24, 0, 0},
-           0, 0, -1, -1, FB_ACCELF_TEXT, 59259, 80, 80, 45, 26, 32, 1,
-           0, FB_VMODE_DOUBLE
-           }
-    },
-#endif
-};
-
-#define NUM_TOTAL_MODES        ARRAY_SIZE(virgefb_predefined)
-
-/*
- *    Default to 800x600 for video=virge8:, virge16: or virge32:
- */
-
-#ifdef FBCON_HAS_CFB8
-#define VIRGE8_DEFMODE (2)
-#endif
-
-#ifdef FBCON_HAS_CFB16
-#define VIRGE16_DEFMODE        (9)
-#endif
-
-#ifdef FBCON_HAS_CFB32
-#define VIRGE32_DEFMODE        (16)
-#endif
-
-static struct fb_var_screeninfo virgefb_default;
-static int virgefb_inverse = 0;
-
-/*
- *    Interface used by the world
- */
-
-int virgefb_setup(char*);
-static int virgefb_get_fix(struct fb_fix_screeninfo *fix, int con,
-                          struct fb_info *info);
-static int virgefb_get_var(struct fb_var_screeninfo *var, int con,
-                          struct fb_info *info);
-static int virgefb_set_var(struct fb_var_screeninfo *var, int con,
-                          struct fb_info *info);
-static int virgefb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
-                          struct fb_info *info);
-static int virgefb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
-                            u_int transp, struct fb_info *info);
-static int virgefb_blank(int blank, struct fb_info *info);
-
-/*
- *    Interface to the low level console driver
- */
-
-int virgefb_init(void);
-static int virgefb_switch(int con, struct fb_info *info);
-static int virgefb_updatevar(int con, struct fb_info *info);
-
-/*
- *    Text console acceleration
- */
-
-#ifdef FBCON_HAS_CFB8
-static struct display_switch fbcon_virge8;
-#endif
-
-#ifdef FBCON_HAS_CFB16
-static struct display_switch fbcon_virge16;
-#endif
-
-#ifdef FBCON_HAS_CFB32
-static struct display_switch fbcon_virge32;
-#endif
-
-/*
- *   Hardware Specific Routines
- */
-
-static int virge_init(void);
-static int virgefb_encode_fix(struct fb_fix_screeninfo *fix,
-                               struct virgefb_par *par);
-static int virgefb_decode_var(struct fb_var_screeninfo *var,
-                               struct virgefb_par *par);
-static int virgefb_encode_var(struct fb_var_screeninfo *var,
-                               struct virgefb_par *par);
-static int virgefb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
-                               u_int *transp, struct fb_info *info);
-static void virgefb_gfx_on_off(int blank);
-static inline void virgefb_wait_for_idle(void);
-static void virgefb_BitBLT(u_short curx, u_short cury, u_short destx, u_short desty,
-               u_short width, u_short height, u_short stride, u_short depth);
-static void virgefb_RectFill(u_short x, u_short y, u_short width, u_short height,
-               u_short color, u_short stride, u_short depth);
-
-/*
- *    Internal routines
- */
-
-static void virgefb_get_par(struct virgefb_par *par);
-static void virgefb_set_par(struct virgefb_par *par);
-static int virgefb_do_fb_set_var(struct fb_var_screeninfo *var, int isactive);
-static void virgefb_set_disp(int con, struct fb_info *info);
-static int virgefb_get_video_mode(const char *name);
-static void virgefb_set_video(struct fb_var_screeninfo *var);
-
-/*
- *    Additions for Initialization
- */
-
-static void virgefb_load_video_mode(struct fb_var_screeninfo *video_mode);
-static int cv3d_has_4mb(void);
-static unsigned short virgefb_compute_clock(unsigned long freq);
-static inline unsigned char rattr(short);
-static inline unsigned char rseq(short);
-static inline unsigned char rcrt(short);
-static inline unsigned char rgfx(short);
-static inline void gfx_on_off(int toggle);
-static void virgefb_pci_init(void);
-
-/* -------------------- Hardware specific routines ------------------------- */
-
-/*
- *     Functions for register access
- */
-
-/* Read attribute controller register */
-
-static inline unsigned char rattr(short idx)
-{
-       volatile unsigned char rattr_tmp;
-
-       rattr_tmp = rb_mmio(ACT_ADDRESS_RESET);
-       wb_mmio(ACT_ADDRESS_W, idx);
-       return (rb_mmio(ACT_ADDRESS_R));
-}
-
-/* Read sequencer register */
-
-static inline unsigned char rseq(short idx)
-{
-       wb_mmio(SEQ_ADDRESS, idx);
-       return (rb_mmio(SEQ_ADDRESS_R));
-}
-
-/* Read CRT controller register */
-
-static inline unsigned char rcrt(short idx)
-{
-       wb_mmio(CRT_ADDRESS, idx);
-       return (rb_mmio(CRT_ADDRESS_R));
-}
-
-/* Read graphics controller register */
-
-static inline unsigned char rgfx(short idx)
-{
-       wb_mmio(GCT_ADDRESS, idx);
-       return (rb_mmio(GCT_ADDRESS_R));
-}
-
-
-/*
- *     Initialization
- */
-
-/* PCI init */
-
-void virgefb_pci_init(void) {
-
-       DPRINTK("ENTER\n");
-
-       SelectCFG;
-
-       if (on_zorro2) {
-               *((short *)(vgaio_regs + 0x00000010)) = 0;
-               *((long  *)(vgaio_regs + 0x00000004)) = 0x02000003;
-       } else {
-               *((short *)(vgaio_regs + 0x000e0010)) = 0;
-               *((long  *)(vgaio_regs + 0x000e0004)) = 0x02000003;
-       }
-
-       /* SelectIO is in wb_vgaio macro */
-       wb_vgaio(SREG_VIDEO_SUBS_ENABLE, 0x01);
-       /* SelectMMIO is in wb_vgaio macro */
-
-       DPRINTK("EXIT\n");
-
-       return;
-}
-
-/* 
- * Initalize all mode independent regs, find mem size and clear mem
-*/
-
-static int virge_init(void)
-{
-       int i;
-       unsigned char tmp;
-
-       DPRINTK("ENTER\n");
-
-       virgefb_pci_init();
-
-       wb_mmio(GREG_MISC_OUTPUT_W, 0x07);      /* colour, ram enable, clk sel */
-
-       wseq(SEQ_ID_UNLOCK_EXT, 0x06);          /* unlock extensions */
-       tmp = rb_mmio(GREG_MISC_OUTPUT_R);
-       wcrt(CRT_ID_REGISTER_LOCK_1, 0x48);     /* unlock CR2D to CR3F */
-
-       wcrt(CRT_ID_BACKWAD_COMP_1, 0x00);      /* irq disable */
-
-       wcrt(CRT_ID_REGISTER_LOCK_2, 0xa5);     /* unlock CR40 to CRFF and more */
-       wcrt(CRT_ID_REGISTER_LOCK,0x00);        /* unlock h and v timing */
-       wcrt(CRT_ID_SYSTEM_CONFIG, 0x01);       /* unlock enhanced programming registers */
-
-       wb_mmio(GREG_FEATURE_CONTROL_W, 0x00);
-
-       wcrt(CRT_ID_EXT_MISC_CNTL, 0x00);       /* b2 = 0 to allow VDAC mmio access */
-#if 0
-       /* write strap options ... ? */
-       wcrt(CRT_ID_CONFIG_1, 0x08);
-       wcrt(CRT_ID_CONFIG_2, 0xff);            /* 0x0x2 bit needs to be set ?? */
-       wcrt(CRT_ID_CONFIG_3, 0x0f);
-       wcrt(CRT_ID_CONFIG_4, 0x1a);
-#endif
-       wcrt(CRT_ID_EXT_MISC_CNTL_1, 0x82);      /* PCI DE and software reset S3D engine */
-       /* EXT_MISC_CNTL_1, CR66 bit 0 should be the same as bit 0 MR_ADVANCED_FUNCTION_CONTROL - check */
-       wl_mmio(MR_ADVANCED_FUNCTION_CONTROL, 0x00000011); /* enhanced mode, linear addressing */
-
-/* crtc registers */
-
-       wcrt(CRT_ID_PRESET_ROW_SCAN, 0x00);
-
-       /* Disable h/w cursor */
-
-       wcrt(CRT_ID_CURSOR_START, 0x00);
-       wcrt(CRT_ID_CURSOR_END, 0x00);
-       wcrt(CRT_ID_START_ADDR_HIGH, 0x00);
-       wcrt(CRT_ID_START_ADDR_LOW, 0x00);
-       wcrt(CRT_ID_CURSOR_LOC_HIGH, 0x00);
-       wcrt(CRT_ID_CURSOR_LOC_LOW, 0x00);
-       wcrt(CRT_ID_EXT_MODE, 0x00);
-       wcrt(CRT_ID_HWGC_MODE, 0x00);
-       wcrt(CRT_ID_HWGC_ORIGIN_X_HI, 0x00);
-       wcrt(CRT_ID_HWGC_ORIGIN_X_LO, 0x00);
-       wcrt(CRT_ID_HWGC_ORIGIN_Y_HI, 0x00);
-       wcrt(CRT_ID_HWGC_ORIGIN_Y_LO, 0x00);
-       i = rcrt(CRT_ID_HWGC_MODE);
-       wcrt(CRT_ID_HWGC_FG_STACK, 0x00);
-       wcrt(CRT_ID_HWGC_FG_STACK, 0x00);
-       wcrt(CRT_ID_HWGC_FG_STACK, 0x00);
-       wcrt(CRT_ID_HWGC_BG_STACK, 0x00);
-       wcrt(CRT_ID_HWGC_BG_STACK, 0x00);
-       wcrt(CRT_ID_HWGC_BG_STACK, 0x00);
-       wcrt(CRT_ID_HWGC_START_AD_HI, 0x00);
-       wcrt(CRT_ID_HWGC_START_AD_LO, 0x00);
-       wcrt(CRT_ID_HWGC_DSTART_X, 0x00);
-       wcrt(CRT_ID_HWGC_DSTART_Y, 0x00);
-
-       wcrt(CRT_ID_UNDERLINE_LOC, 0x00);
-
-       wcrt(CRT_ID_MODE_CONTROL, 0xe3);
-       wcrt(CRT_ID_BACKWAD_COMP_2, 0x22);      /* blank bdr bit 5 blanking only on 8 bit */
-
-       wcrt(CRT_ID_EX_SYNC_1, 0x00);
-
-       /* memory */
-
-       wcrt(CRT_ID_EXT_SYS_CNTL_3, 0x00);
-       wcrt(CRT_ID_MEMORY_CONF, 0x08);         /* config enhanced map */
-       wcrt(CRT_ID_EXT_MEM_CNTL_1, 0x08);      /* MMIO Select (0x0c works as well)*/
-       wcrt(CRT_ID_EXT_MEM_CNTL_2, 0x02);      /* why 02 big endian 00 works ? */
-       wcrt(CRT_ID_EXT_MEM_CNTL_4, 0x9f);      /* config big endian - 0x00 ?  */
-       wcrt(CRT_ID_LAW_POS_HI, 0x00);
-       wcrt(CRT_ID_LAW_POS_LO, 0x00);
-       wcrt(CRT_ID_EXT_MISC_CNTL_1, 0x81);
-       wcrt(CRT_ID_MISC_1, 0x90);              /* must follow CRT_ID_EXT_MISC_CNTL_1 */
-       wcrt(CRT_ID_LAW_CNTL, 0x13);            /* force 4 Meg for test */
-       if (cv3d_has_4mb()) {
-               v_ram_size = 0x00400000;
-               wcrt(CRT_ID_LAW_CNTL, 0x13);    /* 4 MB */
-       } else {
-               v_ram_size = 0x00200000;
-               wcrt(CRT_ID_LAW_CNTL, 0x12);    /* 2 MB */
-       }
-
-       if (on_zorro2)
-               v_ram_size -= 0x60000;          /* we need some space for the registers */
-
-       wcrt(CRT_ID_EXT_SYS_CNTL_4, 0x00);
-       wcrt(CRT_ID_EXT_DAC_CNTL, 0x00);        /* 0x10 for X11 cursor mode */
-
-/* sequencer registers */
-
-       wseq(SEQ_ID_CLOCKING_MODE, 0x01);       /* 8 dot clock */
-       wseq(SEQ_ID_MAP_MASK, 0xff);
-       wseq(SEQ_ID_CHAR_MAP_SELECT, 0x00);
-       wseq(SEQ_ID_MEMORY_MODE, 0x02);
-       wseq(SEQ_ID_RAMDAC_CNTL, 0x00);
-       wseq(SEQ_ID_SIGNAL_SELECT, 0x00);
-       wseq(SEQ_ID_EXT_SEQ_REG9, 0x00);        /* MMIO and PIO reg access enabled */
-       wseq(SEQ_ID_EXT_MISC_SEQ, 0x00);
-       wseq(SEQ_ID_CLKSYN_CNTL_1, 0x00);
-       wseq(SEQ_ID_EXT_SEQ, 0x00);
-
-/* graphic registers */
-
-       wgfx(GCT_ID_SET_RESET, 0x00);
-       wgfx(GCT_ID_ENABLE_SET_RESET, 0x00);
-       wgfx(GCT_ID_COLOR_COMPARE, 0x00);
-       wgfx(GCT_ID_DATA_ROTATE, 0x00);
-       wgfx(GCT_ID_READ_MAP_SELECT, 0x00);
-       wgfx(GCT_ID_GRAPHICS_MODE, 0x40);
-       wgfx(GCT_ID_MISC, 0x01);
-       wgfx(GCT_ID_COLOR_XCARE, 0x0f);
-       wgfx(GCT_ID_BITMASK, 0xff);
-
-/* attribute  registers */
-
-       for(i = 0; i <= 15; i++)
-               watr(ACT_ID_PALETTE0 + i, i);
-       watr(ACT_ID_ATTR_MODE_CNTL, 0x41);
-       watr(ACT_ID_OVERSCAN_COLOR, 0xff);
-       watr(ACT_ID_COLOR_PLANE_ENA, 0x0f);
-       watr(ACT_ID_HOR_PEL_PANNING, 0x00);
-       watr(ACT_ID_COLOR_SELECT, 0x00);
-
-       wb_mmio(VDAC_MASK, 0xff);
-
-/* init local cmap as greyscale levels */
-
-       for (i = 0; i < 256; i++) {
-               virgefb_colour_table [i][0] = i;
-               virgefb_colour_table [i][1] = i;
-               virgefb_colour_table [i][2] = i;
-       }
-
-/* clear framebuffer memory */
-
-       memset((char*)v_ram, 0x00, v_ram_size);
-
-       DPRINTK("EXIT\n");
-       return 0;
-}
-
-
-/*
- *    This function should fill in the `fix' structure based on the
- *    values in the `par' structure.
- */
-
-static int virgefb_encode_fix(struct fb_fix_screeninfo *fix,
-                           struct virgefb_par *par)
-{
-       DPRINTK("ENTER set video phys addr\n");
-
-       memset(fix, 0, sizeof(struct fb_fix_screeninfo));
-       strcpy(fix->id, virgefb_name);
-       if (on_zorro2)
-               fix->smem_start = v_ram_phys;
-       switch (par->var.bits_per_pixel) {
-#ifdef FBCON_HAS_CFB8
-               case 8:
-                       if (on_zorro2)
-                               Select_Zorro2_FrameBuffer(ENDIAN_BYTE);
-                       else
-                               fix->smem_start = (v_ram_phys + CYBMEM_OFFSET_8);
-                       break;
-#endif
-#ifdef FBCON_HAS_CFB16
-               case 16:
-                       if (on_zorro2)
-                               Select_Zorro2_FrameBuffer(ENDIAN_WORD);
-                       else
-                               fix->smem_start = (v_ram_phys + CYBMEM_OFFSET_16);
-                       break;
-#endif
-#ifdef FBCON_HAS_CFB32
-               case 32:
-                       if (on_zorro2)
-                               Select_Zorro2_FrameBuffer(ENDIAN_LONG);
-                       else
-                               fix->smem_start = (v_ram_phys + CYBMEM_OFFSET_32);
-                       break;
-#endif
-       }
-
-       fix->smem_len = v_ram_size;
-       fix->mmio_start = mmio_regs_phys;
-       fix->mmio_len = 0x10000; /* TODO: verify this for the CV64/3D */
-
-       fix->type = FB_TYPE_PACKED_PIXELS;
-       fix->type_aux = 0;
-       if (par->var.bits_per_pixel == 8)
-               fix->visual = FB_VISUAL_PSEUDOCOLOR;
-       else
-               fix->visual = FB_VISUAL_TRUECOLOR;
-
-       fix->xpanstep = 0;
-       fix->ypanstep = 0;
-       fix->ywrapstep = 0;
-       fix->line_length = par->var.xres_virtual*par->var.bits_per_pixel/8;
-       fix->accel = FB_ACCEL_S3_VIRGE;
-       DPRINTK("EXIT v_ram_phys = 0x%8.8lx\n", (unsigned long)fix->smem_start);
-       return 0;
-}
-
-
-/*
- *     Fill the `par' structure based on the values in `var'.
- *     TODO: Verify and adjust values, return -EINVAL if bad.
- */
-
-static int virgefb_decode_var(struct fb_var_screeninfo *var,
-                           struct virgefb_par *par)
-{
-       DPRINTK("ENTER\n");
-       par->var.xres = var->xres;
-       par->var.yres = var->yres;
-       par->var.xres_virtual = var->xres_virtual;
-       par->var.yres_virtual = var->yres_virtual;
-       /* roundup and validate */
-       par->var.xres = (par->var.xres+7) & ~7;
-       par->var.xres_virtual = (par->var.xres_virtual+7) & ~7;
-       if (par->var.xres_virtual < par->var.xres)
-               par->var.xres_virtual = par->var.xres;
-       if (par->var.yres_virtual < par->var.yres)
-               par->var.yres_virtual = par->var.yres;
-       par->var.xoffset = var->xoffset;
-       par->var.yoffset = var->yoffset;
-       par->var.bits_per_pixel = var->bits_per_pixel;
-       if (par->var.bits_per_pixel <= 8)
-               par->var.bits_per_pixel = 8;
-       else if (par->var.bits_per_pixel <= 16)
-               par->var.bits_per_pixel = 16;
-       else
-               par->var.bits_per_pixel = 32;
-#ifndef FBCON_HAS_CFB32
-       if (par->var.bits_per_pixel == 32)
-               par->var.bits_per_pixel = 16;
-#endif
-#ifndef FBCON_HAS_CFB16
-       if (par->var.bits_per_pixel == 16)
-               par->var.bits_per_pixel = 8;
-#endif
-       par->var.grayscale = var->grayscale;
-       par->var.red = var->red;
-       par->var.green = var->green;
-       par->var.blue = var->blue;
-       par->var.transp = var->transp;
-       par->var.nonstd = var->nonstd;
-       par->var.activate = var->activate;
-       par->var.height = var->height;
-       par->var.width = var->width;
-       if (var->accel_flags & FB_ACCELF_TEXT) {
-               par->var.accel_flags = FB_ACCELF_TEXT;
-       } else {
-               par->var.accel_flags = 0;
-       }
-       par->var.pixclock = var->pixclock;
-       par->var.left_margin = var->left_margin;
-       par->var.right_margin = var->right_margin;
-       par->var.upper_margin = var->upper_margin;
-       par->var.lower_margin = var->lower_margin;
-       par->var.hsync_len = var->hsync_len;
-       par->var.vsync_len = var->vsync_len;
-       par->var.sync = var->sync;
-       par->var.vmode = var->vmode;
-       DPRINTK("EXIT\n");
-       return 0;
-}
-
-/*
- *     Fill the `var' structure based on the values in `par' and maybe
- *     other values read out of the hardware.
- */
-
-static int virgefb_encode_var(struct fb_var_screeninfo *var,
-                               struct virgefb_par *par)
-{
-       DPRINTK("ENTER\n");
-       memset(var, 0, sizeof(struct fb_var_screeninfo));       /* need this ? */
-       var->xres = par->var.xres;
-       var->yres = par->var.yres;
-       var->xres_virtual = par->var.xres_virtual;
-       var->yres_virtual = par->var.yres_virtual;
-       var->xoffset = par->var.xoffset;
-       var->yoffset = par->var.yoffset;
-       var->bits_per_pixel = par->var.bits_per_pixel;
-       var->grayscale = par->var.grayscale;
-       var->red = par->var.red;
-       var->green = par->var.green;
-       var->blue = par->var.blue;
-       var->transp = par->var.transp;
-       var->nonstd = par->var.nonstd;
-       var->activate = par->var.activate;
-       var->height = par->var.height;
-       var->width = par->var.width;
-       var->accel_flags = par->var.accel_flags;
-       var->pixclock = par->var.pixclock;
-       var->left_margin = par->var.left_margin;
-       var->right_margin = par->var.right_margin;
-       var->upper_margin = par->var.upper_margin;
-       var->lower_margin = par->var.lower_margin;
-       var->hsync_len = par->var.hsync_len;
-       var->vsync_len = par->var.vsync_len;
-       var->sync = par->var.sync;
-       var->vmode = par->var.vmode;
-       DPRINTK("EXIT\n");
-       return 0;
-}
-
-/*
- *    Set a single color register. The values supplied are already
- *    rounded down to the hardware's capabilities (according to the
- *    entries in the var structure). Return != 0 for invalid regno.
- */
-
-static int virgefb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
-                            u_int transp, struct fb_info *info)
-{
-       DPRINTK("ENTER\n");
-       if (((current_par.var.bits_per_pixel==8) && (regno>255)) ||
-               ((current_par.var.bits_per_pixel!=8) && (regno>15))) {
-                       DPRINTK("EXIT\n");
-                       return 1;
-       }
-       if (((current_par.var.bits_per_pixel==8) && (regno<256)) ||
-                       ((current_par.var.bits_per_pixel!=8) && (regno<16))) {
-               virgefb_colour_table [regno][0] = red >> 10;
-               virgefb_colour_table [regno][1] = green >> 10;
-               virgefb_colour_table [regno][2] = blue >> 10;
-       }
-
-       switch (current_par.var.bits_per_pixel) {
-#ifdef FBCON_HAS_CFB8
-               case 8:
-                       wb_mmio(VDAC_ADDRESS_W, (unsigned char)regno);
-                       wb_mmio(VDAC_DATA, ((unsigned char)(red >> 10)));
-                       wb_mmio(VDAC_DATA, ((unsigned char)(green >> 10)));
-                       wb_mmio(VDAC_DATA, ((unsigned char)(blue >> 10)));
-                       break;
-#endif
-#ifdef FBCON_HAS_CFB16
-               case 16:
-                       fbcon_cmap.cfb16[regno] =
-                               ((red  & 0xf800) |
-                               ((green & 0xfc00) >> 5) |
-                               ((blue  & 0xf800) >> 11));
-                       break;
-#endif
-#ifdef FBCON_HAS_CFB32
-               case 32:
-                       fbcon_cmap.cfb32[regno] =
-                               /* transp = 0's or 1's  ? */
-                               (((red  & 0xff00) << 8) |
-                               ((green & 0xff00) >> 0) |
-                               ((blue  & 0xff00) >> 8));
-                       break;
-#endif
-       }
-       DPRINTK("EXIT\n");
-       return 0;
-}
-
-
-/*
- *    Read a single color register and split it into
- *    colors/transparent. Return != 0 for invalid regno.
- */
-
-static int virgefb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,
-                          u_int *transp, struct fb_info *info)
-{
-       int t;
-
-       DPRINTK("ENTER\n");
-       if (regno > 255) {
-               DPRINTK("EXIT\n");
-               return 1;
-       }
-       if (((current_par.var.bits_per_pixel==8) && (regno<256)) ||
-                       ((current_par.var.bits_per_pixel!=8) && (regno<16))) {
-
-               t = virgefb_colour_table [regno][0];
-               *red = (t<<10) | (t<<4) | (t>>2);
-               t = virgefb_colour_table [regno][1];
-               *green = (t<<10) | (t<<4) | (t>>2);
-               t = virgefb_colour_table [regno][2];
-               *blue = (t<<10) | (t<<4) | (t>>2);
-       }
-       *transp = 0;
-       DPRINTK("EXIT\n");
-       return 0;
-}
-
-
-/*
- *    (Un)Blank the screen
- */
-
-static void virgefb_gfx_on_off(int blank)
-{
-       DPRINTK("ENTER\n");
-       gfx_on_off(blank);
-       DPRINTK("EXIT\n");
-}
-
-/*
- * CV3D low-level support
- */
-
-
-static inline void wait_3d_fifo_slots(int n)   /* WaitQueue */
-{
-       do {
-               mb();
-       } while (((rl_mmio(MR_SUBSYSTEM_STATUS_R) >> 8) & 0x1f) < (n + 2));
-}
-
-static inline void virgefb_wait_for_idle(void) /* WaitIdle */
-{
-       while(!(rl_mmio(MR_SUBSYSTEM_STATUS_R) & 0x2000)) ;
-       blit_maybe_busy = 0;
-}
-
- /*
-  * BitBLT - Through the Plane
-  */
-
-static void virgefb_BitBLT(u_short curx, u_short cury, u_short destx, u_short desty,
-                       u_short width, u_short height, u_short stride, u_short depth)
-{
-       unsigned int blitcmd = S3V_BITBLT | S3V_DRAW | S3V_BLT_COPY;
-
-       switch (depth) {
-#ifdef FBCON_HAS_CFB8
-               case 8 :
-                       blitcmd |= S3V_DST_8BPP;
-                       break;
-#endif
-#ifdef FBCON_HAS_CFB16
-               case 16 :
-                       blitcmd |= S3V_DST_16BPP;
-                       break;
-#endif
-#ifdef FBCON_HAS_CFB32
-               case 32 :
-                       /* 32 bit uses 2 by 16 bit values, see fbcon_virge32_bmove */
-                       blitcmd |= S3V_DST_16BPP;
-                       break;
-#endif
-       }
-
-       /* Set drawing direction */
-       /* -Y, X maj, -X (default) */
-       if (curx > destx) {
-               blitcmd |= (1 << 25);  /* Drawing direction +X */
-       } else {
-               curx  += (width - 1);
-               destx += (width - 1);
-       }
-
-       if (cury > desty) {
-               blitcmd |= (1 << 26);  /* Drawing direction +Y */
-       } else {
-               cury  += (height - 1);
-               desty += (height - 1);
-       }
-
-       wait_3d_fifo_slots(8);          /* wait on fifo slots for 8 writes */
-
-       if (blit_maybe_busy)
-               virgefb_wait_for_idle();
-       blit_maybe_busy = 1;
-
-       wl_mmio(BLT_PATTERN_COLOR, 1);  /* pattern fb color */
-       wl_mmio(BLT_MONO_PATTERN_0, ~0);
-       wl_mmio(BLT_MONO_PATTERN_1, ~0);
-       wl_mmio(BLT_SIZE_X_Y, ((width << 16) | height));
-       wl_mmio(BLT_SRC_X_Y, ((curx << 16)  | cury));
-       wl_mmio(BLT_DEST_X_Y, ((destx << 16) | desty));
-       wl_mmio(BLT_SRC_DEST_STRIDE, (((stride << 16) | stride) /* & 0x0ff80ff8 */)); /* why is this needed now ? */
-       wl_mmio(BLT_COMMAND_SET, blitcmd);
-}
-
-/*
- * Rectangle Fill Solid
- */
-
-static void virgefb_RectFill(u_short x, u_short y, u_short width, u_short height,
-                       u_short color,  u_short stride, u_short depth)
-{
-       unsigned int blitcmd = S3V_RECTFILL | S3V_DRAW |
-               S3V_BLT_CLEAR | S3V_MONO_PAT | (1 << 26) | (1 << 25);
-
-       switch (depth) {
-#ifdef FBCON_HAS_CFB8
-               case 8 :
-                       blitcmd |= S3V_DST_8BPP;
-                       break;
-#endif
-#ifdef FBCON_HAS_CFB16
-               case 16 :
-                       blitcmd |= S3V_DST_16BPP;
-                       break;
-#endif
-#ifdef FBCON_HAS_CFB32
-               case 32 :
-                       /* 32 bit uses 2 times 16 bit values, see fbcon_virge32_clear */
-                       blitcmd |= S3V_DST_16BPP;
-                       break;
-#endif
-       }
-
-       wait_3d_fifo_slots(5);          /* wait on fifo slots for 5 writes */
-
-       if (blit_maybe_busy)
-               virgefb_wait_for_idle();
-       blit_maybe_busy = 1;
-
-       wl_mmio(BLT_PATTERN_COLOR, (color & 0xff));
-       wl_mmio(BLT_SIZE_X_Y, ((width << 16) | height));
-       wl_mmio(BLT_DEST_X_Y, ((x << 16) | y));
-       wl_mmio(BLT_SRC_DEST_STRIDE, (((stride << 16) | stride) /* & 0x0ff80ff8 */));
-       wl_mmio(BLT_COMMAND_SET, blitcmd);
-}
-
-/*
- * Move cursor to x, y
- */
-
-#if 0
-static void virgefb_move_cursor(u_short x, u_short y)
-{
-       DPRINTK("Yuck .... MoveCursor on a 3D\n");
-       return 0;
-}
-#endif
-
-/* -------------------- Interfaces to hardware functions -------------------- */
-
-static struct fb_hwswitch virgefb_hw_switch = {
-       .init           = virge_init,
-       .encode_fix     = virgefb_encode_fix,
-       .decode_var     = virgefb_decode_var,
-       .encode_var     = virgefb_encode_var,
-       .getcolreg      = virgefb_getcolreg,
-       .blank          = virgefb_gfx_on_off
-};
-
-
-/* -------------------- Generic routines ------------------------------------ */
-
-
-/*
- *    Fill the hardware's `par' structure.
- */
-
-static void virgefb_get_par(struct virgefb_par *par)
-{
-       DPRINTK("ENTER\n");
-       if (current_par_valid) {
-               *par = current_par;
-       } else {
-               fbhw->decode_var(&virgefb_default, par);
-       }
-       DPRINTK("EXIT\n");
-}
-
-
-static void virgefb_set_par(struct virgefb_par *par)
-{
-       DPRINTK("ENTER\n");
-       current_par = *par;
-       current_par_valid = 1;
-       DPRINTK("EXIT\n");
-}
-
-
-static void virgefb_set_video(struct fb_var_screeninfo *var)
-{
-/* Set clipping rectangle to current screen size */
-
-       unsigned int clip;
-
-       DPRINTK("ENTER\n");
-       wait_3d_fifo_slots(4);
-       clip = ((0 << 16) | (var->xres - 1));
-       wl_mmio(BLT_CLIP_LEFT_RIGHT, clip);
-       clip = ((0 << 16) | (var->yres - 1));
-       wl_mmio(BLT_CLIP_TOP_BOTTOM, clip);
-       wl_mmio(BLT_SRC_BASE, 0);               /* seems we need to clear these two */
-       wl_mmio(BLT_DEST_BASE, 0);
-
-/* Load the video mode defined by the 'var' data */
-
-       virgefb_load_video_mode(var);
-       DPRINTK("EXIT\n");
-}
-
-/*
-Merge these two functions, Geert's suggestion.
-static int virgefb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info);
-static int virgefb_do_fb_set_var(struct fb_var_screeninfo *var, int isactive);
-*/
-
-static int virgefb_do_fb_set_var(struct fb_var_screeninfo *var, int isactive)
-{
-       int err, activate;
-       struct virgefb_par par;
-
-       DPRINTK("ENTER\n");
-       if ((err = fbhw->decode_var(var, &par))) {
-               DPRINTK("EXIT\n");
-               return (err);
-       }
-
-       activate = var->activate;
-       if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW && isactive)
-               virgefb_set_par(&par);
-       fbhw->encode_var(var, &par);
-       var->activate = activate;
-        if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW && isactive)
-               virgefb_set_video(var);
-       DPRINTK("EXIT\n");
-       return 0;
-}
-
-
-/*
- *    Get the Fixed Part of the Display
- */
-
-static int virgefb_get_fix(struct fb_fix_screeninfo *fix, int con,
-                          struct fb_info *info)
-{
-       struct virgefb_par par;
-       int error = 0;
-
-       DPRINTK("ENTER\n");
-       if (con == -1)
-               virgefb_get_par(&par);
-       else
-               error = fbhw->decode_var(&fb_display[con].var, &par);
-
-       if (!error)
-               error = fbhw->encode_fix(fix, &par);
-       DPRINTK("EXIT\n");
-       return(error);
-}
-
-
-/*
- *    Get the User Defined Part of the Display
- */
-
-static int virgefb_get_var(struct fb_var_screeninfo *var, int con,
-                          struct fb_info *info)
-{
-       struct virgefb_par par;
-       int error = 0;
-
-       DPRINTK("ENTER\n");
-       if (con == -1) {
-               virgefb_get_par(&par);
-               error = fbhw->encode_var(var, &par);
-               disp.var = *var;   /* ++Andre: don't know if this is the right place */
-       } else {
-               *var = fb_display[con].var;
-       }
-       DPRINTK("EXIT\n");
-       return(error);
-}
-
-static void virgefb_set_disp(int con, struct fb_info *info)
-{
-       struct fb_fix_screeninfo fix;
-       struct display *display;
-
-       DPRINTK("ENTER\n");
-       if (con >= 0)
-               display = &fb_display[con];
-       else
-               display = &disp;        /* used during initialization */
-
-       virgefb_get_fix(&fix, con, info);
-       if (con == -1)
-               con = 0;
-       if(on_zorro2) {
-               info->screen_base = (char*)v_ram;
-       } else {
-               switch (display->var.bits_per_pixel) {
-#ifdef FBCON_HAS_CFB8
-                       case 8:
-                               info->screen_base = (char*)(v_ram + CYBMEM_OFFSET_8);
-                               break;
-#endif
-#ifdef FBCON_HAS_CFB16
-                       case 16:
-                               info->screen_base = (char*)(v_ram + CYBMEM_OFFSET_16);
-                               break;
-#endif
-#ifdef FBCON_HAS_CFB32
-                       case 32:
-                               info->screen_base = (char*)(v_ram + CYBMEM_OFFSET_32);
-                               break;
-#endif
-               }
-       }
-       display->visual = fix.visual;
-       display->type = fix.type;
-       display->type_aux = fix.type_aux;
-       display->ypanstep = fix.ypanstep;
-       display->ywrapstep = fix.ywrapstep;
-       display->can_soft_blank = 1;
-       display->inverse = virgefb_inverse;
-       display->line_length = display->var.xres_virtual*
-                              display->var.bits_per_pixel/8;
-
-       switch (display->var.bits_per_pixel) {
-#ifdef FBCON_HAS_CFB8
-               case 8:
-                       if (display->var.accel_flags & FB_ACCELF_TEXT) {
-                               display->dispsw = &fbcon_virge8;
-#warning FIXME: We should reinit the graphics engine here
-                       } else
-                               display->dispsw = &fbcon_cfb8;
-                       break;
-#endif
-#ifdef FBCON_HAS_CFB16
-               case 16:
-                       if (display->var.accel_flags & FB_ACCELF_TEXT) {
-                               display->dispsw = &fbcon_virge16;
-                       } else
-                               display->dispsw = &fbcon_cfb16;
-                       display->dispsw_data = &fbcon_cmap.cfb16;
-                       break;
-#endif
-#ifdef FBCON_HAS_CFB32
-               case 32:
-                       if (display->var.accel_flags & FB_ACCELF_TEXT) {
-                               display->dispsw = &fbcon_virge32;
-                       } else
-                               display->dispsw = &fbcon_cfb32;
-                       display->dispsw_data = &fbcon_cmap.cfb32;
-                       break;
-#endif
-               default:
-                       display->dispsw = &fbcon_dummy;
-                       break;
-       }
-       DPRINTK("EXIT v_ram virt = 0x%8.8lx\n",(unsigned long)display->screen_base);
-}
-
-
-/*
- *    Set the User Defined Part of the Display
- */
-
-static int virgefb_set_var(struct fb_var_screeninfo *var, int con,
-                          struct fb_info *info)
-{
-       int err, oldxres, oldyres, oldvxres, oldvyres, oldbpp, oldaccel;
-
-       DPRINTK("ENTER\n");
-
-       if ((err = virgefb_do_fb_set_var(var, con == info->currcon))) {
-               DPRINTK("EXIT\n");
-               return(err);
-       }
-       if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) {
-               oldxres = fb_display[con].var.xres;
-               oldyres = fb_display[con].var.yres;
-               oldvxres = fb_display[con].var.xres_virtual;
-               oldvyres = fb_display[con].var.yres_virtual;
-               oldbpp = fb_display[con].var.bits_per_pixel;
-               oldaccel = fb_display[con].var.accel_flags;
-               fb_display[con].var = *var;
-               if (oldxres != var->xres || oldyres != var->yres ||
-                   oldvxres != var->xres_virtual ||
-                   oldvyres != var->yres_virtual ||
-                   oldbpp != var->bits_per_pixel ||
-                   oldaccel != var->accel_flags) {
-                       virgefb_set_disp(con, info);
-                       if (fb_info.changevar)
-                               (*fb_info.changevar)(con);
-                       fb_alloc_cmap(&fb_display[con].cmap, 0, 0);
-                       do_install_cmap(con, info);
-               }
-       }
-       var->activate = 0;
-       DPRINTK("EXIT\n");
-       return 0;
-}
-
-
-/*
- *    Get the Colormap
- */
-
-static int virgefb_get_cmap(struct fb_cmap *cmap, int kspc, int con,
-                           struct fb_info *info)
-{
-       DPRINTK("ENTER\n");
-       if (con == info->currcon) { /* current console? */
-               DPRINTK("EXIT - console is current console, fb_get_cmap\n");
-               return(fb_get_cmap(cmap, kspc, fbhw->getcolreg, info));
-       } else if (fb_display[con].cmap.len) { /* non default colormap? */
-               DPRINTK("Use console cmap\n");
-               fb_copy_cmap(&fb_display[con].cmap, cmap, kspc ? 0 : 2);
-       } else {
-               DPRINTK("Use default cmap\n");
-               fb_copy_cmap(fb_default_cmap(fb_display[con].var.bits_per_pixel==8 ? 256 : 16),
-                            cmap, kspc ? 0 : 2);
-       }
-       DPRINTK("EXIT\n");
-       return 0;
-}
-
-static struct fb_ops virgefb_ops = {
-       .owner =        THIS_MODULE,
-       .fb_get_fix =   virgefb_get_fix,
-       .fb_get_var =   virgefb_get_var,
-       .fb_set_var =   virgefb_set_var,
-       .fb_get_cmap =  virgefb_get_cmap,
-       .fb_set_cmap =  gen_set_cmap,
-       .fb_setcolreg = virgefb_setcolreg,
-       .fb_blank =     virgefb_blank,
-};
-
-int __init virgefb_setup(char *options)
-{
-       char *this_opt;
-       fb_info.fontname[0] = '\0';
-
-       DPRINTK("ENTER\n");
-       if (!options || !*options) {
-               DPRINTK("EXIT\n");
-               return 0;
-       }
-
-       while ((this_opt = strsep(&options, ",")) != NULL) {
-               if (!*this_opt)
-                       continue;
-               if (!strcmp(this_opt, "inverse")) {
-                       virgefb_inverse = 1;
-                       fb_invert_cmaps();
-               } else if (!strncmp(this_opt, "font:", 5))
-                       strcpy(fb_info.fontname, this_opt+5);
-#ifdef FBCON_HAS_CFB8
-               else if (!strcmp (this_opt, "virge8")){
-                       virgefb_default = virgefb_predefined[VIRGE8_DEFMODE].var;
-               }
-#endif
-#ifdef FBCON_HAS_CFB16
-               else if (!strcmp (this_opt, "virge16")){
-                       virgefb_default = virgefb_predefined[VIRGE16_DEFMODE].var;
-               }
-#endif
-#ifdef FBCON_HAS_CFB32
-               else if (!strcmp (this_opt, "virge32")){
-                       virgefb_default = virgefb_predefined[VIRGE32_DEFMODE].var;
-               }
-#endif
-               else
-                       virgefb_get_video_mode(this_opt);
-       }
-
-       printk(KERN_INFO "mode : xres=%d, yres=%d, bpp=%d\n", virgefb_default.xres,
-                       virgefb_default.yres, virgefb_default.bits_per_pixel);
-       DPRINTK("EXIT\n");
-       return 0;
-}
-
-
-/*
- *    Get a Video Mode
- */
-
-static int __init virgefb_get_video_mode(const char *name)
-{
-       int i;
-
-       DPRINTK("ENTER\n");
-       for (i = 0; i < NUM_TOTAL_MODES; i++) {
-               if (!strcmp(name, virgefb_predefined[i].name)) {
-                       virgefb_default = virgefb_predefined[i].var;
-                       DPRINTK("EXIT\n");
-                       return(i);
-               }
-       }
-       /* ++Andre: set virgefb default mode */
-
-/* prefer 16 bit depth, 8 if no 16, if no 8 or 16 use 32 */
-
-#ifdef FBCON_HAS_CFB32
-       virgefb_default = virgefb_predefined[VIRGE32_DEFMODE].var;
-#endif
-#ifdef FBCON_HAS_CFB8
-       virgefb_default = virgefb_predefined[VIRGE8_DEFMODE].var;
-#endif
-#ifdef FBCON_HAS_CFB16
-       virgefb_default = virgefb_predefined[VIRGE16_DEFMODE].var;
-#endif
-       DPRINTK("EXIT\n");
-       return 0;
-}
-
-/*
- *    Initialization
- */
-
-int __init virgefb_init(void)
-{
-       struct virgefb_par par;
-       unsigned long board_addr, board_size;
-       struct zorro_dev *z = NULL;
-
-       DPRINTK("ENTER\n");
-
-       z = zorro_find_device(ZORRO_PROD_PHASE5_CYBERVISION64_3D, NULL);
-       if (!z)
-               return -ENODEV;
-
-       board_addr = z->resource.start;
-       if (board_addr < 0x01000000) {
-
-               /* board running in Z2 space. This includes the video memory
-                   as well as the S3 register set */
-
-               on_zorro2 = 1;
-               board_size = 0x00400000;
-
-               if (!request_mem_region(board_addr, board_size, "S3 ViRGE"))
-                       return -ENOMEM;
-
-               v_ram_phys = board_addr;
-               v_ram = ZTWO_VADDR(v_ram_phys);
-               mmio_regs_phys = (unsigned long)(board_addr + 0x003c0000);
-               vgaio_regs = (unsigned char *) ZTWO_VADDR(board_addr + 0x003c0000);
-               mmio_regs = (unsigned char *)ZTWO_VADDR(mmio_regs_phys);
-               vcode_switch_base = (unsigned long) ZTWO_VADDR(board_addr + 0x003a0000);
-               printk(KERN_INFO "CV3D detected running in Z2 mode.\n");
-
-       } else {
-
-               /* board running in Z3 space. Separate video memory (3 apertures)
-                  and S3 register set */
-
-               on_zorro2 = 0;
-               board_size = 0x01000000;
-
-               if (!request_mem_region(board_addr, board_size, "S3 ViRGE"))
-                       return -ENOMEM;
-
-               v_ram_phys  = board_addr + 0x04000000;
-               v_ram = (unsigned long)ioremap(v_ram_phys, 0x01000000);
-               mmio_regs_phys = board_addr + 0x05000000;
-               vgaio_regs = (unsigned char *)ioremap(board_addr +0x0c000000, 0x00100000); /* includes PCI regs */
-               mmio_regs = ioremap(mmio_regs_phys, 0x00010000);
-               vcode_switch_base = (unsigned long)ioremap(board_addr + 0x08000000, 0x1000);
-               printk(KERN_INFO "CV3D detected running in Z3 mode\n");
-       }
-
-#if defined (VIRGEFBDEBUG)
-       DPRINTK("board_addr     : 0x%8.8lx\n",board_addr);
-       DPRINTK("board_size     : 0x%8.8lx\n",board_size);
-       DPRINTK("mmio_regs_phy  : 0x%8.8lx\n",mmio_regs_phys);
-       DPRINTK("v_ram_phys     : 0x%8.8lx\n",v_ram_phys);
-       DPRINTK("vgaio_regs     : 0x%8.8lx\n",(unsigned long)vgaio_regs);
-       DPRINTK("mmio_regs      : 0x%8.8lx\n",(unsigned long)mmio_regs);
-       DPRINTK("v_ram          : 0x%8.8lx\n",v_ram);
-       DPRINTK("vcode sw base  : 0x%8.8lx\n",vcode_switch_base);
-#endif
-       fbhw = &virgefb_hw_switch;
-       strcpy(fb_info.modename, virgefb_name);
-       fb_info.changevar = NULL;
-       fb_info.fbops = &virgefb_ops;
-       fb_info.disp = &disp;
-       fb_info.currcon = -1;
-       fb_info.switch_con = &virgefb_switch;
-       fb_info.updatevar = &virgefb_updatevar;
-       fb_info.flags = FBINFO_FLAG_DEFAULT;
-       fbhw->init();
-       fbhw->decode_var(&virgefb_default, &par);
-       fbhw->encode_var(&virgefb_default, &par);
-       virgefb_do_fb_set_var(&virgefb_default, 1);
-       virgefb_get_var(&fb_display[0].var, -1, &fb_info);
-       virgefb_set_disp(-1, &fb_info);
-       do_install_cmap(0, &fb_info);
-
-       if (register_framebuffer(&fb_info) < 0) {
-               #warning release resources
-               printk(KERN_ERR "virgefb.c: register_framebuffer failed\n");
-               DPRINTK("EXIT\n");
-               goto out_unmap;
-       }
-
-       printk(KERN_INFO "fb%d: %s frame buffer device, using %ldK of video memory\n",
-              fb_info.node, fb_info.modename, v_ram_size>>10);
-
-       /* TODO: This driver cannot be unloaded yet */
-
-       DPRINTK("EXIT\n");
-       return 0;
-
-out_unmap:
-       if (board_addr >= 0x01000000) {
-               if (v_ram)
-                       iounmap((void*)v_ram);
-               if (vgaio_regs)
-                       iounmap(vgaio_regs);
-               if (mmio_regs)
-                       iounmap(mmio_regs);
-               if (vcode_switch_base)
-                       iounmap((void*)vcode_switch_base);
-               v_ram = vcode_switch_base = 0;
-               vgaio_regs = mmio_regs = NULL;
-       }
-       return -EINVAL;
-}
-
-
-static int virgefb_switch(int con, struct fb_info *info)
-{
-       DPRINTK("ENTER\n");
-       /* Do we have to save the colormap? */
-       if (fb_display[info->currcon].cmap.len)
-               fb_get_cmap(&fb_display[info->currcon].cmap, 1,
-                           fbhw->getcolreg, info);
-       virgefb_do_fb_set_var(&fb_display[con].var, 1);
-       info->currcon = con;
-       /* Install new colormap */
-       do_install_cmap(con, info);
-       DPRINTK("EXIT\n");
-       return 0;
-}
-
-
-/*
- *    Update the `var' structure (called by fbcon.c)
- *
- *    This call looks only at yoffset and the FB_VMODE_YWRAP flag in `var'.
- *    Since it's called by a kernel driver, no range checking is done.
- */
-
-static int virgefb_updatevar(int con, struct fb_info *info)
-{
-       DPRINTK("ENTER\n");
-       return 0;
-       DPRINTK("EXIT\n");
-}
-
-/*
- *    Blank the display.
- */
-
-static int virgefb_blank(int blank, struct fb_info *info)
-{
-       DPRINTK("ENTER\n");
-       fbhw->blank(blank);
-       DPRINTK("EXIT\n");
-       return 0;
-}
-
-
-/*
- *    Text console acceleration
- */
-
-#ifdef FBCON_HAS_CFB8
-static void fbcon_virge8_bmove(struct display *p, int sy, int sx, int dy,
-                              int dx, int height, int width)
-{
-        sx *= 8; dx *= 8; width *= 8;
-        virgefb_BitBLT((u_short)sx, (u_short)(sy*fontheight(p)), (u_short)dx,
-                       (u_short)(dy*fontheight(p)), (u_short)width,
-                       (u_short)(height*fontheight(p)), (u_short)p->next_line, 8);
-}
-
-static void fbcon_virge8_clear(struct vc_data *conp, struct display *p, int sy,
-                              int sx, int height, int width)
-{
-        unsigned char bg;
-
-        sx *= 8; width *= 8;
-        bg = attr_bgcol_ec(p,conp);
-        virgefb_RectFill((u_short)sx, (u_short)(sy*fontheight(p)),
-                         (u_short)width, (u_short)(height*fontheight(p)),
-                         (u_short)bg, (u_short)p->next_line, 8);
-}
-
-static void fbcon_virge8_putc(struct vc_data *conp, struct display *p, int c, int yy,
-                              int xx)
-{
-       if (blit_maybe_busy)
-               virgefb_wait_for_idle();
-       fbcon_cfb8_putc(conp, p, c, yy, xx);
-}
-
-static void fbcon_virge8_putcs(struct vc_data *conp, struct display *p,
-                      const unsigned short *s, int count, int yy, int xx)
-{
-       if (blit_maybe_busy)
-               virgefb_wait_for_idle();
-       fbcon_cfb8_putcs(conp, p, s, count, yy, xx);
-}
-
-static void fbcon_virge8_revc(struct display *p, int xx, int yy)
-{
-       if (blit_maybe_busy)
-               virgefb_wait_for_idle();
-       fbcon_cfb8_revc(p, xx, yy);
-}
-
-static void fbcon_virge8_clear_margins(struct vc_data *conp, struct display *p,
-                              int bottom_only)
-{
-       if (blit_maybe_busy)
-               virgefb_wait_for_idle();
-       fbcon_cfb8_clear_margins(conp, p, bottom_only);
-}
-
-static struct display_switch fbcon_virge8 = {
-       .setup          = fbcon_cfb8_setup,
-       .bmove          = fbcon_virge8_bmove,
-       .clear          = fbcon_virge8_clear,
-       .putc           = fbcon_virge8_putc,
-       .putcs          = fbcon_virge8_putcs,
-       .revc           = fbcon_virge8_revc,
-       .clear_margins  = fbcon_virge8_clear_margins,
-       .fontwidthmask  = FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
-};
-#endif
-
-#ifdef FBCON_HAS_CFB16
-static void fbcon_virge16_bmove(struct display *p, int sy, int sx, int dy,
-                               int dx, int height, int width)
-{
-        sx *= 8; dx *= 8; width *= 8;
-        virgefb_BitBLT((u_short)sx, (u_short)(sy*fontheight(p)), (u_short)dx,
-                       (u_short)(dy*fontheight(p)), (u_short)width,
-                       (u_short)(height*fontheight(p)), (u_short)p->next_line, 16);
-}
-
-static void fbcon_virge16_clear(struct vc_data *conp, struct display *p, int sy,
-                               int sx, int height, int width)
-{
-        unsigned char bg;
-
-        sx *= 8; width *= 8;
-        bg = attr_bgcol_ec(p,conp);
-        virgefb_RectFill((u_short)sx, (u_short)(sy*fontheight(p)),
-                         (u_short)width, (u_short)(height*fontheight(p)),
-                         (u_short)bg, (u_short)p->next_line, 16);
-}
-
-static void fbcon_virge16_putc(struct vc_data *conp, struct display *p, int c, int yy,
-                              int xx)
-{
-       if (blit_maybe_busy)
-               virgefb_wait_for_idle();
-       fbcon_cfb16_putc(conp, p, c, yy, xx);
-}
-
-static void fbcon_virge16_putcs(struct vc_data *conp, struct display *p,
-                      const unsigned short *s, int count, int yy, int xx)
-{
-       if (blit_maybe_busy)
-               virgefb_wait_for_idle();
-       fbcon_cfb16_putcs(conp, p, s, count, yy, xx);
-}
-
-static void fbcon_virge16_revc(struct display *p, int xx, int yy)
-{
-       if (blit_maybe_busy)
-               virgefb_wait_for_idle();
-       fbcon_cfb16_revc(p, xx, yy);
-}
-
-static void fbcon_virge16_clear_margins(struct vc_data *conp, struct display *p,
-                              int bottom_only)
-{
-       if (blit_maybe_busy)
-               virgefb_wait_for_idle();
-       fbcon_cfb16_clear_margins(conp, p, bottom_only);
-}
-
-static struct display_switch fbcon_virge16 = {
-       .setup          = fbcon_cfb16_setup,
-       .bmove          = fbcon_virge16_bmove,
-       .clear          = fbcon_virge16_clear,
-       .putc           = fbcon_virge16_putc,
-       .putcs          = fbcon_virge16_putcs,
-       .revc           = fbcon_virge16_revc,
-       .clear_margins  = fbcon_virge16_clear_margins,
-       .fontwidthmask  = FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
-};
-#endif
-
-#ifdef FBCON_HAS_CFB32
-static void fbcon_virge32_bmove(struct display *p, int sy, int sx, int dy,
-                              int dx, int height, int width)
-{
-        sx *= 16; dx *= 16; width *= 16;       /* doubled these values to do 32 bit blit */
-        virgefb_BitBLT((u_short)sx, (u_short)(sy*fontheight(p)), (u_short)dx,
-                       (u_short)(dy*fontheight(p)), (u_short)width,
-                       (u_short)(height*fontheight(p)), (u_short)p->next_line, 16);
-}
-
-static void fbcon_virge32_clear(struct vc_data *conp, struct display *p, int sy,
-                              int sx, int height, int width)
-{
-        unsigned char bg;
-
-        sx *= 16; width *= 16;                 /* doubled these values to do 32 bit blit */
-        bg = attr_bgcol_ec(p,conp);
-        virgefb_RectFill((u_short)sx, (u_short)(sy*fontheight(p)),
-                         (u_short)width, (u_short)(height*fontheight(p)),
-                         (u_short)bg, (u_short)p->next_line, 16);
-}
-
-static void fbcon_virge32_putc(struct vc_data *conp, struct display *p, int c, int yy,
-                              int xx)
-{
-       if (blit_maybe_busy)
-               virgefb_wait_for_idle();
-       fbcon_cfb32_putc(conp, p, c, yy, xx);
-}
-
-static void fbcon_virge32_putcs(struct vc_data *conp, struct display *p,
-                      const unsigned short *s, int count, int yy, int xx)
-{
-       if (blit_maybe_busy)
-               virgefb_wait_for_idle();
-       fbcon_cfb32_putcs(conp, p, s, count, yy, xx);
-}
-
-static void fbcon_virge32_revc(struct display *p, int xx, int yy)
-{
-       if (blit_maybe_busy)
-               virgefb_wait_for_idle();
-       fbcon_cfb32_revc(p, xx, yy);
-}
-
-static void fbcon_virge32_clear_margins(struct vc_data *conp, struct display *p,
-                              int bottom_only)
-{
-       if (blit_maybe_busy)
-               virgefb_wait_for_idle();
-       fbcon_cfb32_clear_margins(conp, p, bottom_only);
-}
-
-static struct display_switch fbcon_virge32 = {
-       .setup          = fbcon_cfb32_setup,
-       .bmove          = fbcon_virge32_bmove,
-       .clear          = fbcon_virge32_clear,
-       .putc           = fbcon_virge32_putc,
-       .putcs          = fbcon_virge32_putcs,
-       .revc           = fbcon_virge32_revc,
-       .clear_margins  = fbcon_virge32_clear_margins,
-       .fontwidthmask  = FONTWIDTH(4)|FONTWIDTH(8)|FONTWIDTH(12)|FONTWIDTH(16)
-};
-#endif
-
-#ifdef MODULE
-MODULE_LICENSE("GPL");
-
-int init_module(void)
-{
-       return virgefb_init();
-}
-#endif /* MODULE */
-
-static int cv3d_has_4mb(void)
-{
-       /* cyberfb version didn't work, neither does this (not reliably)
-       forced to return 4MB */
-#if 0
-       volatile unsigned long *t0, *t2;
-#endif
-       DPRINTK("ENTER\n");
-#if 0
-       /* write patterns in memory and test if they can be read */
-       t0 = (volatile unsigned long *)v_ram;
-       t2 = (volatile unsigned long *)(v_ram + 0x00200000);
-       *t0 = 0x87654321;
-       *t2 = 0x12345678;
-
-       if (*t0 != 0x87654321) {
-               /* read of first location failed */
-               DPRINTK("EXIT - 0MB !\n");
-               return 0;
-       }
-
-       if (*t2 == 0x87654321) {
-               /* should read 0x12345678 if 4MB */
-               DPRINTK("EXIT - 2MB(a) \n");
-               return 0;
-       }
-
-       if (*t2 != 0x12345678) {
-               /* upper 2MB read back match failed */
-               DPRINTK("EXIT - 2MB(b)\n");
-               return 0;
-       }
-
-       /* may have 4MB */
-
-       *t2 = 0xAAAAAAAA;
-
-       if(*t2 != 0xAAAAAAAA) {
-               /* upper 2MB read back match failed */
-               DPRINTK("EXIT - 2MB(c)\n");
-               return 0;
-       }
-
-       *t2 = 0x55555555;
-
-       if(*t2 != 0x55555555) {
-               /* upper 2MB read back match failed */
-               DPRINTK("EXIT - 2MB(d)\n");
-               return 0;
-       }
-
-#endif
-       DPRINTK("EXIT - 4MB\n");
-       return 1;
-}
-
-
-/*
- * Computes M, N, and R pll params for freq arg.
- * Returns 16 bits - hi 0MMMMMM lo 0RRNNNNN
- */
-
-#define REFCLOCK 14318000
-
-static unsigned short virgefb_compute_clock(unsigned long freq)
-{
-
-       unsigned char m, n, r, rpwr;
-       unsigned long diff, ftry, save = ~0UL;
-       unsigned short mnr;
-
-       DPRINTK("ENTER\n");
-
-       for (r = 0, rpwr = 1 ; r < 4 ; r++, rpwr *= 2) {
-               if ((135000000 <= (rpwr * freq)) && ((rpwr * freq) <= 270000000)) {
-                       for (n = 1 ; n < 32 ; n++) {
-                               m = ((freq * (n + 2) * rpwr)/REFCLOCK) - 2;
-                               if (m == 0 || m >127)
-                                       break;
-                               ftry = ((REFCLOCK / (n + 2)) * (m + 2)) / rpwr;
-                               if (ftry > freq)
-                                       diff = ftry - freq;
-                               else
-                                       diff = freq - ftry;
-                               if (diff < save) {
-                                       save = diff;
-                                       mnr =  (m << 8) | (r<<5) | (n & 0x7f);
-                               }
-                       }
-               }
-       }
-       if (save == ~0UL)
-               printk("Can't compute clock PLL values for %ld Hz clock\n", freq);
-       DPRINTK("EXIT\n");
-       return(mnr);
-}
-
-static void virgefb_load_video_mode(struct fb_var_screeninfo *video_mode)
-{
-       unsigned char lace, dblscan, tmp;
-       unsigned short mnr;
-       unsigned short HT, HDE, HBS, HBW, HSS, HSW;
-       unsigned short VT, VDE, VBS, VBW, VSS, VSW;
-       unsigned short SCO;
-       int cr11;
-       int cr67;
-       int hmul;
-       int xres, xres_virtual, hfront, hsync, hback;
-       int yres, vfront, vsync, vback;
-       int bpp;
-       int i;
-       long freq;
-
-       DPRINTK("ENTER : %dx%d-%d\n",video_mode->xres, video_mode->yres,
-                               video_mode->bits_per_pixel);
-
-       bpp = video_mode->bits_per_pixel;
-       xres = video_mode->xres;
-       xres_virtual = video_mode->xres_virtual;
-       hfront = video_mode->right_margin;
-       hsync = video_mode->hsync_len;
-       hback = video_mode->left_margin;
-
-       lace = 0;
-       dblscan = 0;
-
-       if (video_mode->vmode & FB_VMODE_DOUBLE) {
-               yres = video_mode->yres * 2;
-               vfront = video_mode->lower_margin * 2;
-               vsync = video_mode->vsync_len * 2;
-               vback = video_mode->upper_margin * 2;
-               dblscan = 1;
-       } else if (video_mode->vmode & FB_VMODE_INTERLACED) {
-               yres = (video_mode->yres + 1) / 2;
-               vfront = (video_mode->lower_margin + 1) / 2;
-               vsync = (video_mode->vsync_len + 1) / 2;
-               vback = (video_mode->upper_margin + 1) / 2;
-               lace = 1;
-       } else {
-               yres = video_mode->yres;
-               vfront = video_mode->lower_margin;
-               vsync = video_mode->vsync_len;
-               vback = video_mode->upper_margin;
-       }
-
-       switch (bpp) {
-               case 8:
-                       video_mode->red.offset = 0;
-                       video_mode->green.offset = 0;
-                       video_mode->blue.offset = 0;
-                       video_mode->transp.offset = 0;
-                       video_mode->red.length = 8;
-                       video_mode->green.length = 8;
-                       video_mode->blue.length = 8;
-                       video_mode->transp.length = 0;
-                       hmul = 1;
-                       cr67 = 0x00;
-                       SCO = xres_virtual / 8;
-                       break;
-               case 16:
-                       video_mode->red.offset = 11;
-                       video_mode->green.offset = 5;
-                       video_mode->blue.offset = 0;
-                       video_mode->transp.offset = 0;
-                       video_mode->red.length = 5;
-                       video_mode->green.length = 6;
-                       video_mode->blue.length = 5;
-                       video_mode->transp.length = 0;
-                       hmul = 2;
-                       cr67 = 0x50;
-                       SCO = xres_virtual / 4;
-                       break;
-               case 32:
-                       video_mode->red.offset = 16;
-                       video_mode->green.offset = 8;
-                       video_mode->blue.offset = 0;
-                       video_mode->transp.offset = 24;
-                       video_mode->red.length = 8;
-                       video_mode->green.length = 8;
-                       video_mode->blue.length = 8;
-                       video_mode->transp.length = 8;
-                       hmul = 1;
-                       cr67 = 0xd0;
-                       SCO = xres_virtual / 2;
-                       break;
-       }
-
-       HT  = (((xres + hfront + hsync + hback) / 8) * hmul) - 5;
-       HDE = ((xres / 8) * hmul) - 1;
-       HBS = (xres / 8) * hmul;
-       HSS = ((xres + hfront) / 8) * hmul;
-       HSW = (hsync / 8) * hmul;
-       HBW = (((hfront + hsync + hback) / 8) * hmul) - 2;
-
-       VT  = yres + vfront + vsync + vback - 2;
-       VDE = yres - 1;
-       VBS = yres - 1;
-       VSS = yres + vfront;
-       VSW = vsync;
-       VBW = vfront + vsync + vback - 2;
-
-#ifdef VIRGEFBDEBUG
-       DPRINTK("HDE       : 0x%4.4x, %4.4d\n", HDE, HDE);
-       DPRINTK("HBS       : 0x%4.4x, %4.4d\n", HBS, HBS);
-       DPRINTK("HSS       : 0x%4.4x, %4.4d\n", HSS, HSS);
-       DPRINTK("HSW       : 0x%4.4x, %4.4d\n", HSW, HSW);
-       DPRINTK("HBW       : 0x%4.4x, %4.4d\n", HBW, HBW);
-       DPRINTK("HSS + HSW : 0x%4.4x, %4.4d\n", HSS+HSW, HSS+HSW);
-       DPRINTK("HBS + HBW : 0x%4.4x, %4.4d\n", HBS+HBW, HBS+HBW);
-       DPRINTK("HT        : 0x%4.4x, %4.4d\n", HT, HT);
-       DPRINTK("VDE       : 0x%4.4x, %4.4d\n", VDE, VDE);
-       DPRINTK("VBS       : 0x%4.4x, %4.4d\n", VBS, VBS);
-       DPRINTK("VSS       : 0x%4.4x, %4.4d\n", VSS, VSS);
-       DPRINTK("VSW       : 0x%4.4x, %4.4d\n", VSW, VSW);
-       DPRINTK("VBW       : 0x%4.4x, %4.4d\n", VBW, VBW);
-       DPRINTK("VT        : 0x%4.4x, %4.4d\n", VT, VT);
-#endif
-
-/* turn gfx off, don't mess up the display */
-
-       gfx_on_off(1);
-
-/* H and V sync polarity */
-
-       tmp = rb_mmio(GREG_MISC_OUTPUT_R) & 0x2f;               /* colour, ram enable, clk sr12/s13 sel */
-       if (!(video_mode->sync & FB_SYNC_HOR_HIGH_ACT))
-               tmp |= 0x40;                                    /* neg H sync polarity */
-       if (!(video_mode->sync & FB_SYNC_VERT_HIGH_ACT))
-               tmp |= 0x80;                                    /* neg V sync polarity */
-       tmp |= 0x0c;                                            /* clk from sr12/sr13 */
-       wb_mmio(GREG_MISC_OUTPUT_W, tmp);
-
-/* clocks */
-
-       wseq(SEQ_ID_BUS_REQ_CNTL, 0xc0);                        /* 2 clk mem wr and /RAS1 */
-       wseq(SEQ_ID_CLKSYN_CNTL_2, 0x80);                       /* b7 is 2 mem clk wr */
-       mnr = virgefb_compute_clock(MEMCLOCK);
-       DPRINTK("mem clock %d, m %d, n %d, r %d.\n", MEMCLOCK, ((mnr>>8)&0x7f), (mnr&0x1f), ((mnr >> 5)&0x03));
-       wseq(SEQ_ID_MCLK_LO, (mnr & 0x7f));
-       wseq(SEQ_ID_MCLK_HI, ((mnr & 0x7f00) >> 8));
-       freq = (1000000000 / video_mode->pixclock) * 1000;      /* pixclock is in ps ... convert to Hz */
-       mnr = virgefb_compute_clock(freq);
-       DPRINTK("dot clock %ld, m %d, n %d, r %d.\n", freq, ((mnr>>8)&0x7f), (mnr&0x1f), ((mnr>>5)&0x03));
-       wseq(SEQ_ID_DCLK_LO, (mnr & 0x7f));
-       wseq(SEQ_ID_DCLK_HI, ((mnr & 0x7f00) >> 8));
-       wseq(SEQ_ID_CLKSYN_CNTL_2, 0xa0);
-       wseq(SEQ_ID_CLKSYN_CNTL_2, 0x80);
-       udelay(100);
-
-/* load display parameters into board */
-
-       /* not sure about sync and blanking extensions bits in cr5d and cr5 */
-
-       wcrt(CRT_ID_EXT_HOR_OVF,                        /* 0x5d */
-               ((HT & 0x100) ?         0x01 : 0x00) |
-               ((HDE & 0x100) ?        0x02 : 0x00) |
-               ((HBS & 0x100) ?        0x04 : 0x00) |
-       /*      (((HBS + HBW) & 0x40) ? 0x08 : 0x00) |  */
-               ((HSS & 0x100) ?        0x10 : 0x00) |
-       /*      (((HSS + HSW) & 0x20) ? 0x20 : 0x00) |  */
-               ((HSW >= 0x20) ?        0x20 : 0x00) |
-               (((HT-5) & 0x100) ?     0x40 : 0x00));
-
-       wcrt(CRT_ID_EXT_VER_OVF,                        /* 0x5e */
-               ((VT & 0x400) ? 0x01 : 0x00) |
-               ((VDE & 0x400) ? 0x02 : 0x00) |
-               ((VBS & 0x400) ? 0x04 : 0x00) |
-               ((VSS & 0x400) ? 0x10 : 0x00) |
-               0x40);                                  /* line compare */
-
-       wcrt(CRT_ID_START_VER_RETR, VSS);
-       cr11 = rcrt(CRT_ID_END_VER_RETR) | 0x20;        /* vert interrupt flag */
-       wcrt(CRT_ID_END_VER_RETR, ((cr11 & 0x20) | ((VSS + VSW) & 0x0f)));      /* keeps vert irq enable state, also has unlock bit cr0 to 7 */
-       wcrt(CRT_ID_VER_DISP_ENA_END, VDE);
-       wcrt(CRT_ID_START_VER_BLANK, VBS);
-       wcrt(CRT_ID_END_VER_BLANK, VBS + VBW);          /* might be +/- 1 out */
-       wcrt(CRT_ID_HOR_TOTAL, HT);
-       wcrt(CRT_ID_DISPLAY_FIFO, HT - 5);
-       wcrt(CRT_ID_BACKWAD_COMP_3, 0x10);              /* enable display fifo */
-       wcrt(CRT_ID_HOR_DISP_ENA_END, HDE);
-       wcrt(CRT_ID_START_HOR_BLANK , HBS);
-       wcrt(CRT_ID_END_HOR_BLANK, (HBS + HBW) & 0x1f);
-       wcrt(CRT_ID_START_HOR_RETR, HSS);
-       wcrt(CRT_ID_END_HOR_RETR,                       /* cr5 */
-               ((HSS + HSW) & 0x1f) |
-               (((HBS + HBW) & 0x20) ? 0x80 : 0x00));
-       wcrt(CRT_ID_VER_TOTAL, VT);
-       wcrt(CRT_ID_OVERFLOW,
-               ((VT & 0x100) ? 0x01 : 0x00) |
-               ((VDE & 0x100) ? 0x02 : 0x00) |
-               ((VSS & 0x100) ? 0x04 : 0x00) |
-               ((VBS & 0x100) ? 0x08 : 0x00) |
-               0x10 |
-               ((VT & 0x200) ? 0x20 : 0x00) |
-               ((VDE & 0x200) ? 0x40 : 0x00) |
-               ((VSS & 0x200) ? 0x80 : 0x00));
-       wcrt(CRT_ID_MAX_SCAN_LINE,
-               (dblscan ? 0x80 : 0x00) |
-               0x40 |
-               ((VBS & 0x200) ? 0x20 : 0x00));
-       wcrt(CRT_ID_LINE_COMPARE, 0xff);
-       wcrt(CRT_ID_LACE_RETR_START, HT / 2);           /* (HT-5)/2 ? */
-       wcrt(CRT_ID_LACE_CONTROL, (lace ? 0x20 : 0x00));
-
-       wcrt(CRT_ID_SCREEN_OFFSET, SCO);
-       wcrt(CRT_ID_EXT_SYS_CNTL_2, (SCO >> 4) & 0x30 );
-
-       /* wait for vert sync before cr67 update */
-
-       for (i=0; i < 10000; i++) {
-               udelay(10);
-               mb();
-               if (rb_mmio(GREG_INPUT_STATUS1_R) & 0x08)
-                       break;
-       }
-
-       wl_mmio(0x8200, 0x0000c000);    /* fifo control  (0x00110400 ?) */
-       wcrt(CRT_ID_EXT_MISC_CNTL_2, cr67);
-
-/* enable video */
-
-       tmp = rb_mmio(ACT_ADDRESS_RESET);
-       wb_mmio(ACT_ADDRESS_W, ((bpp == 8) ? 0x20 : 0x00));     /* set b5, ENB PLT in attr idx reg) */
-       tmp = rb_mmio(ACT_ADDRESS_RESET);
-
-/* turn gfx on again */
-
-       gfx_on_off(0);
-
-/* pass-through */
-
-       SetVSwitch(1);          /* cv3d */
-
-       DUMP;
-       DPRINTK("EXIT\n");
-}
-
-static inline void gfx_on_off(int toggle)
-{
-       unsigned char tmp;
-
-       DPRINTK("ENTER gfx %s\n", (toggle ? "off" : "on"));
-
-       toggle = (toggle & 0x01) << 5;
-       tmp = rseq(SEQ_ID_CLOCKING_MODE) & (~(0x01 << 5));
-       wseq(SEQ_ID_CLOCKING_MODE, tmp | toggle);
-
-       DPRINTK("EXIT\n");
-}
-
-#if defined (VIRGEFBDUMP)
-
-/*
- * Dump board registers
- */
-
-static void cv64_dump(void)
-{
-       int i;
-       u8 c, b;
-        u16 w;
-       u32 l;
-
-       /* crt, seq, gfx and atr regs */
-
-       SelectMMIO;
-
-       printk("\n");
-       for (i = 0; i <= 0x6f; i++) {
-               wb_mmio(CRT_ADDRESS, i);
-               printk("crt idx : 0x%2.2x : 0x%2.2x\n", i, rb_mmio(CRT_ADDRESS_R));
-       }
-       for (i = 0; i <= 0x1c; i++) {
-               wb_mmio(SEQ_ADDRESS, i);
-               printk("seq idx : 0x%2.2x : 0x%2.2x\n", i, rb_mmio(SEQ_ADDRESS_R));
-       }
-       for (i = 0; i <= 8; i++) {
-               wb_mmio(GCT_ADDRESS, i);
-               printk("gfx idx : 0x%2.2x : 0x%2.2x\n", i, rb_mmio(GCT_ADDRESS_R));
-       }
-       for (i = 0; i <= 0x14; i++) {
-               c = rb_mmio(ACT_ADDRESS_RESET);
-               wb_mmio(ACT_ADDRESS_W, i);
-               printk("atr idx : 0x%2.2x : 0x%2.2x\n", i, rb_mmio(ACT_ADDRESS_R));
-       }
-
-       /* re-enable video access to palette */
-
-       c = rb_mmio(ACT_ADDRESS_RESET);
-       udelay(10);
-       wb_mmio(ACT_ADDRESS_W, 0x20);
-       c = rb_mmio(ACT_ADDRESS_RESET);
-       udelay(10);
-
-       /* general regs */
-
-       printk("0x3cc(w 0x3c2) : 0x%2.2x\n", rb_mmio(0x3cc));   /* GREG_MISC_OUTPUT READ */
-       printk("0x3c2(-------) : 0x%2.2x\n", rb_mmio(0x3c2));   /* GREG_INPUT_STATUS 0 READ */
-       printk("0x3c3(w 0x3c3) : 0x%2.2x\n", rb_vgaio(0x3c3));  /* GREG_VIDEO_SUBS_ENABLE */
-       printk("0x3ca(w 0x3da) : 0x%2.2x\n", rb_vgaio(0x3ca));  /* GREG_FEATURE_CONTROL read */
-       printk("0x3da(-------) : 0x%2.2x\n", rb_mmio(0x3da));   /* GREG_INPUT_STATUS 1 READ */
-
-       /* engine regs */
-
-       for (i = 0x8180; i <= 0x8200; i = i + 4)
-               printk("0x%8.8x : 0x%8.8x\n", i, rl_mmio(i));
-
-       i = 0x8504;
-       printk("0x%8.8x : 0x%8.8x\n", i, rl_mmio(i));
-       i = 0x850c;
-       printk("0x%8.8x : 0x%8.8x\n", i, rl_mmio(i));
-       for (i = 0xa4d4; i <= 0xa50c; i = i + 4)
-               printk("0x%8.8x : 0x%8.8x\n", i, rl_mmio(i));
-
-       /* PCI regs */
-
-       SelectCFG;
-
-       for (c = 0; c < 0x08; c = c + 2) {
-               w = (*((u16 *)((u32)(vgaio_regs + c + (on_zorro2 ? 0 : 0x000e0000)) ^ 2)));
-               printk("pci 0x%2.2x : 0x%4.4x\n", c, w);
-       }
-       c = 8;
-       l = (*((u32 *)((u32)(vgaio_regs + c + (on_zorro2 ? 0 : 0x000e0000)))));
-       printk("pci 0x%2.2x : 0x%8.8x\n", c, l);
-       c = 0x0d;
-       b = (*((u8 *)((u32)(vgaio_regs + c + (on_zorro2 ? 0 : 0x000e0000)) ^ 3)));
-       printk("pci 0x%2.2x : 0x%2.2x\n", c, b);
-       c = 0x10;
-       l = (*((u32 *)((u32)(vgaio_regs + c + (on_zorro2 ? 0 : 0x000e0000)))));
-       printk("pci 0x%2.2x : 0x%8.8x\n", c, l);
-       c = 0x30;
-       l = (*((u32 *)((u32)(vgaio_regs + c + (on_zorro2 ? 0 : 0x000e0000)))));
-       printk("pci 0x%2.2x : 0x%8.8x\n", c, l);
-       c = 0x3c;
-       b = (*((u8 *)((u32)(vgaio_regs + c + (on_zorro2 ? 0 : 0x000e0000)) ^ 3)));
-       printk("pci 0x%2.2x : 0x%2.2x\n", c, b);
-       c = 0x3d;
-       b = (*((u8 *)((u32)(vgaio_regs + c + (on_zorro2 ? 0 : 0x000e0000)) ^ 3)));
-       printk("pci 0x%2.2x : 0x%2.2x\n", c, b);
-       c = 0x3e;
-       w = (*((u16 *)((u32)(vgaio_regs + c + (on_zorro2 ? 0 : 0x000e0000)) ^ 2)));
-       printk("pci 0x%2.2x : 0x%4.4x\n", c, w);
-       SelectMMIO;
-}
-#endif
diff --git a/drivers/video/virgefb.h b/drivers/video/virgefb.h
deleted file mode 100644 (file)
index 157d66d..0000000
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * linux/drivers/video/virgefb.h -- CyberVision64 definitions for the
- *                                  text console driver.
- *
- *   Copyright (c) 1998 Alan Bair
- *
- * This file is based on the initial port to Linux of grf_cvreg.h:
- *
- *   Copyright (c) 1997 Antonio Santos
- *
- * The original work is from the NetBSD CyberVision 64 framebuffer driver 
- * and support files (grf_cv.c, grf_cvreg.h, ite_cv.c):
- * Permission to use the source of this driver was obtained from the
- * author Michael Teske by Alan Bair.
- *
- *   Copyright (c) 1995 Michael Teske
- *
- * History:
- *
- *
- *
- * 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.
- */
-
-/* Enhanced register mapping (MMIO mode) */
-
-#define S3_CRTC_ADR    0x03d4
-#define S3_CRTC_DATA   0x03d5
-
-#define S3_REG_LOCK2   0x39
-#define S3_HGC_MODE    0x45
-
-#define S3_HWGC_ORGX_H 0x46
-#define S3_HWGC_ORGX_L 0x47
-#define S3_HWGC_ORGY_H 0x48
-#define S3_HWGC_ORGY_L 0x49
-#define S3_HWGC_DX     0x4e
-#define S3_HWGC_DY     0x4f
-
-#define S3_LAW_CTL     0x58
-
-/**************************************************/
-
-/*
- * Defines for the used register addresses (mw)
- *
- * NOTE: There are some registers that have different addresses when
- *       in mono or color mode. We only support color mode, and thus
- *       some addresses won't work in mono-mode!
- *
- * General and VGA-registers taken from retina driver. Fixed a few
- * bugs in it. (SR and GR read address is Port + 1, NOT Port)
- *
- */
-
-/* General Registers: */
-#define GREG_MISC_OUTPUT_R     0x03CC
-#define GREG_MISC_OUTPUT_W     0x03C2  
-#define GREG_FEATURE_CONTROL_R 0x03CA 
-#define GREG_FEATURE_CONTROL_W 0x03DA
-#define GREG_INPUT_STATUS0_R   0x03C2
-#define GREG_INPUT_STATUS1_R   0x03DA
-
-/* Setup Registers: */
-#define SREG_VIDEO_SUBS_ENABLE 0x03C3  /* virge */
-
-/* Attribute Controller: */
-#define ACT_ADDRESS            0x03C0
-#define ACT_ADDRESS_R          0x03C1
-#define ACT_ADDRESS_W          0x03C0
-#define ACT_ADDRESS_RESET      0x03DA
-#define ACT_ID_PALETTE0                0x00
-#define ACT_ID_PALETTE1                0x01
-#define ACT_ID_PALETTE2                0x02
-#define ACT_ID_PALETTE3                0x03
-#define ACT_ID_PALETTE4                0x04
-#define ACT_ID_PALETTE5                0x05
-#define ACT_ID_PALETTE6                0x06
-#define ACT_ID_PALETTE7                0x07
-#define ACT_ID_PALETTE8                0x08
-#define ACT_ID_PALETTE9                0x09
-#define ACT_ID_PALETTE10       0x0A
-#define ACT_ID_PALETTE11       0x0B
-#define ACT_ID_PALETTE12       0x0C
-#define ACT_ID_PALETTE13       0x0D
-#define ACT_ID_PALETTE14       0x0E
-#define ACT_ID_PALETTE15       0x0F
-#define ACT_ID_ATTR_MODE_CNTL  0x10
-#define ACT_ID_OVERSCAN_COLOR  0x11
-#define ACT_ID_COLOR_PLANE_ENA 0x12
-#define ACT_ID_HOR_PEL_PANNING 0x13
-#define ACT_ID_COLOR_SELECT    0x14    /* virge PX_PADD  pixel padding register */
-
-/* Graphics Controller: */
-#define GCT_ADDRESS            0x03CE
-#define GCT_ADDRESS_R          0x03CF
-#define GCT_ADDRESS_W          0x03CF
-#define GCT_ID_SET_RESET       0x00
-#define GCT_ID_ENABLE_SET_RESET        0x01
-#define GCT_ID_COLOR_COMPARE   0x02
-#define GCT_ID_DATA_ROTATE     0x03
-#define GCT_ID_READ_MAP_SELECT 0x04
-#define GCT_ID_GRAPHICS_MODE   0x05
-#define GCT_ID_MISC            0x06
-#define GCT_ID_COLOR_XCARE     0x07
-#define GCT_ID_BITMASK         0x08
-
-/* Sequencer: */
-#define SEQ_ADDRESS            0x03C4
-#define SEQ_ADDRESS_R          0x03C5
-#define SEQ_ADDRESS_W          0x03C5
-#define SEQ_ID_RESET           0x00
-#define SEQ_ID_CLOCKING_MODE   0x01
-#define SEQ_ID_MAP_MASK                0x02
-#define SEQ_ID_CHAR_MAP_SELECT 0x03
-#define SEQ_ID_MEMORY_MODE     0x04
-#define SEQ_ID_UNKNOWN1                0x05
-#define SEQ_ID_UNKNOWN2                0x06
-#define SEQ_ID_UNKNOWN3                0x07
-/* S3 extensions */
-#define SEQ_ID_UNLOCK_EXT      0x08
-#define SEQ_ID_EXT_SEQ_REG9    0x09    /* b7 = 1 extended reg access by MMIO only */
-#define SEQ_ID_BUS_REQ_CNTL    0x0A
-#define SEQ_ID_EXT_MISC_SEQ    0x0B
-#define SEQ_ID_UNKNOWN4                0x0C
-#define SEQ_ID_EXT_SEQ         0x0D
-#define SEQ_ID_UNKNOWN5                0x0E
-#define SEQ_ID_UNKNOWN6                0x0F
-#define SEQ_ID_MCLK_LO         0x10
-#define SEQ_ID_MCLK_HI         0x11
-#define SEQ_ID_DCLK_LO         0x12
-#define SEQ_ID_DCLK_HI         0x13
-#define SEQ_ID_CLKSYN_CNTL_1   0x14
-#define SEQ_ID_CLKSYN_CNTL_2   0x15
-#define SEQ_ID_CLKSYN_TEST_HI  0x16    /* reserved for S3 testing of the */
-#define SEQ_ID_CLKSYN_TEST_LO  0x17    /* internal clock synthesizer   */
-#define SEQ_ID_RAMDAC_CNTL     0x18
-#define SEQ_ID_MORE_MAGIC      0x1A
-#define SEQ_ID_SIGNAL_SELECT   0x1C    /* new for virge */
-
-/* CRT Controller: */
-#define CRT_ADDRESS            0x03D4
-#define CRT_ADDRESS_R          0x03D5
-#define CRT_ADDRESS_W          0x03D5
-#define CRT_ID_HOR_TOTAL       0x00
-#define CRT_ID_HOR_DISP_ENA_END        0x01
-#define CRT_ID_START_HOR_BLANK 0x02
-#define CRT_ID_END_HOR_BLANK   0x03
-#define CRT_ID_START_HOR_RETR  0x04
-#define CRT_ID_END_HOR_RETR    0x05
-#define CRT_ID_VER_TOTAL       0x06
-#define CRT_ID_OVERFLOW                0x07
-#define CRT_ID_PRESET_ROW_SCAN 0x08
-#define CRT_ID_MAX_SCAN_LINE   0x09
-#define CRT_ID_CURSOR_START    0x0A
-#define CRT_ID_CURSOR_END      0x0B
-#define CRT_ID_START_ADDR_HIGH 0x0C
-#define CRT_ID_START_ADDR_LOW  0x0D
-#define CRT_ID_CURSOR_LOC_HIGH 0x0E
-#define CRT_ID_CURSOR_LOC_LOW  0x0F
-#define CRT_ID_START_VER_RETR  0x10
-#define CRT_ID_END_VER_RETR    0x11
-#define CRT_ID_VER_DISP_ENA_END        0x12
-#define CRT_ID_SCREEN_OFFSET   0x13
-#define CRT_ID_UNDERLINE_LOC   0x14
-#define CRT_ID_START_VER_BLANK 0x15
-#define CRT_ID_END_VER_BLANK   0x16
-#define CRT_ID_MODE_CONTROL    0x17
-#define CRT_ID_LINE_COMPARE    0x18
-#define CRT_ID_GD_LATCH_RBACK  0x22
-#define CRT_ID_ACT_TOGGLE_RBACK        0x24
-#define CRT_ID_ACT_INDEX_RBACK 0x26
-/* S3 extensions: S3 VGA Registers */
-#define CRT_ID_DEVICE_HIGH     0x2D
-#define CRT_ID_DEVICE_LOW      0x2E
-#define CRT_ID_REVISION        0x2F
-#define CRT_ID_CHIP_ID_REV     0x30
-#define CRT_ID_MEMORY_CONF     0x31
-#define CRT_ID_BACKWAD_COMP_1  0x32
-#define CRT_ID_BACKWAD_COMP_2  0x33
-#define CRT_ID_BACKWAD_COMP_3  0x34
-#define CRT_ID_REGISTER_LOCK   0x35
-#define CRT_ID_CONFIG_1        0x36
-#define CRT_ID_CONFIG_2        0x37
-#define CRT_ID_REGISTER_LOCK_1 0x38
-#define CRT_ID_REGISTER_LOCK_2 0x39
-#define CRT_ID_MISC_1          0x3A
-#define CRT_ID_DISPLAY_FIFO    0x3B
-#define CRT_ID_LACE_RETR_START 0x3C
-/* S3 extensions: System Control Registers  */
-#define CRT_ID_SYSTEM_CONFIG   0x40
-#define CRT_ID_BIOS_FLAG       0x41
-#define CRT_ID_LACE_CONTROL    0x42
-#define CRT_ID_EXT_MODE        0x43
-#define CRT_ID_HWGC_MODE       0x45    /* HWGC = Hardware Graphics Cursor */
-#define CRT_ID_HWGC_ORIGIN_X_HI        0x46
-#define CRT_ID_HWGC_ORIGIN_X_LO        0x47
-#define CRT_ID_HWGC_ORIGIN_Y_HI        0x48
-#define CRT_ID_HWGC_ORIGIN_Y_LO        0x49
-#define CRT_ID_HWGC_FG_STACK   0x4A
-#define CRT_ID_HWGC_BG_STACK   0x4B
-#define CRT_ID_HWGC_START_AD_HI        0x4C
-#define CRT_ID_HWGC_START_AD_LO        0x4D
-#define CRT_ID_HWGC_DSTART_X   0x4E
-#define CRT_ID_HWGC_DSTART_Y   0x4F
-/* S3 extensions: System Extension Registers  */
-#define CRT_ID_EXT_SYS_CNTL_1  0x50    /* NOT a virge register */
-#define CRT_ID_EXT_SYS_CNTL_2  0x51
-#define CRT_ID_EXT_BIOS_FLAG_1 0x52
-#define CRT_ID_EXT_MEM_CNTL_1  0x53
-#define CRT_ID_EXT_MEM_CNTL_2  0x54
-#define CRT_ID_EXT_DAC_CNTL    0x55
-#define CRT_ID_EX_SYNC_1       0x56
-#define CRT_ID_EX_SYNC_2       0x57
-#define CRT_ID_LAW_CNTL                0x58    /* LAW = Linear Address Window */
-#define CRT_ID_LAW_POS_HI      0x59
-#define CRT_ID_LAW_POS_LO      0x5A
-#define CRT_ID_GOUT_PORT       0x5C
-#define CRT_ID_EXT_HOR_OVF     0x5D
-#define CRT_ID_EXT_VER_OVF     0x5E
-#define CRT_ID_EXT_MEM_CNTL_3  0x60    /* NOT a virge register */
-#define CRT_ID_EXT_MEM_CNTL_4  0x61
-#define CRT_ID_EX_SYNC_3       0x63    /* NOT a virge register */
-#define CRT_ID_EXT_MISC_CNTL   0x65
-#define CRT_ID_EXT_MISC_CNTL_1 0x66
-#define CRT_ID_EXT_MISC_CNTL_2 0x67
-#define CRT_ID_CONFIG_3        0x68
-#define CRT_ID_EXT_SYS_CNTL_3  0x69
-#define CRT_ID_EXT_SYS_CNTL_4  0x6A
-#define CRT_ID_EXT_BIOS_FLAG_3 0x6B
-#define CRT_ID_EXT_BIOS_FLAG_4 0x6C
-/* S3 virge extensions: more System Extension Registers  */
-#define CRT_ID_EXT_BIOS_FLAG_5 0x6D
-#define CRT_ID_EXT_DAC_TEST    0x6E
-#define CRT_ID_CONFIG_4        0x6F
-
-/* Video DAC */
-#define VDAC_ADDRESS           0x03c8
-#define VDAC_ADDRESS_W         0x03c8
-#define VDAC_ADDRESS_R         0x03c7
-#define VDAC_STATE             0x03c7
-#define VDAC_DATA              0x03c9
-#define VDAC_MASK              0x03c6
-
-/* Miscellaneous Registers */
-#define MR_SUBSYSTEM_STATUS_R          0x8504  /* new for virge */
-#define MR_SUBSYSTEM_CNTL_W            0x8504  /* new for virge */
-#define MR_ADVANCED_FUNCTION_CONTROL   0x850C  /* new for virge */
-
-/* Blitter  */
-#define BLT_COMMAND_SET                0xA500
-#define BLT_SIZE_X_Y           0xA504
-#define BLT_SRC_X_Y            0xA508
-#define BLT_DEST_X_Y           0xA50C
-
-#define BLT_SRC_BASE           0xa4d4
-#define BLT_DEST_BASE          0xa4d8
-#define BLT_CLIP_LEFT_RIGHT    0xa4dc
-#define BLT_CLIP_TOP_BOTTOM    0xa4e0
-#define BLT_SRC_DEST_STRIDE    0xa4e4
-#define BLT_MONO_PATTERN_0     0xa4e8
-#define BLT_MONO_PATTERN_1     0xa4ec
-#define BLT_PATTERN_COLOR      0xa4f4
-
-#define L2D_COMMAND_SET                0xA900
-#define L2D_CLIP_LEFT_RIGHT    0xA8DC
-#define L2D_CLIP_TOP_BOTTOM    0xA8E0
-
-#define P2D_COMMAND_SET                0xAD00
-#define P2D_CLIP_LEFT_RIGHT    0xACDC
-#define P2D_CLIP_TOP_BOTTOM    0xACE0
-
-#define CMD_NOP                (0xf << 27)     /* %1111 << 27, was 0x07 */ 
-#define S3V_BITBLT     (0x0 << 27)
-#define S3V_RECTFILL   (0x2 << 27)
-#define S3V_AUTOEXE    0x01
-#define S3V_HWCLIP     0x02
-#define S3V_DRAW       0x20
-#define S3V_DST_8BPP   0x00
-#define S3V_DST_16BPP  0x04
-#define S3V_DST_24BPP  0x08
-#define S3V_MONO_PAT   0x100
-
-#define S3V_BLT_COPY   (0xcc<<17)
-#define S3V_BLT_CLEAR  (0x00<<17)
-#define S3V_BLT_SET    (0xff<<17)
index b022fffd8c5181fe10a65f55438159df2ed61ea1..732db4780042b6da2ecde6d7b7b2687c342cfc55 100644 (file)
@@ -141,7 +141,7 @@ static inline int w1_convert_temp(u8 rom[9], u8 fid)
 {
        int i;
 
-       for (i=0; i<sizeof(w1_therm_families)/sizeof(w1_therm_families[0]); ++i)
+       for (i = 0; i < ARRAY_SIZE(w1_therm_families); ++i)
                if (w1_therm_families[i].f->fid == fid)
                        return w1_therm_families[i].convert(rom);
 
@@ -238,7 +238,7 @@ static int __init w1_therm_init(void)
 {
        int err, i;
 
-       for (i=0; i<sizeof(w1_therm_families)/sizeof(w1_therm_families[0]); ++i) {
+       for (i = 0; i < ARRAY_SIZE(w1_therm_families); ++i) {
                err = w1_register_family(w1_therm_families[i].f);
                if (err)
                        w1_therm_families[i].broken = 1;
@@ -251,7 +251,7 @@ static void __exit w1_therm_fini(void)
 {
        int i;
 
-       for (i=0; i<sizeof(w1_therm_families)/sizeof(w1_therm_families[0]); ++i)
+       for (i = 0; i < ARRAY_SIZE(w1_therm_families); ++i)
                if (!w1_therm_families[i].broken)
                        w1_unregister_family(w1_therm_families[i].f);
 }
index 60b05bc1564254ab49af9c6b284d96888828e7bb..b3ce8859a586e58a6beb69b5aaa6fa4a86b7e288 100644 (file)
@@ -75,7 +75,7 @@ proc_bus_zorro_read(struct file *file, char __user *buf, size_t nbytes, loff_t *
        return nbytes;
 }
 
-static struct file_operations proc_bus_zorro_operations = {
+static const struct file_operations proc_bus_zorro_operations = {
        .llseek         = proc_bus_zorro_lseek,
        .read           = proc_bus_zorro_read,
 };
index 9f17b0cacdd02e42cf5e3c658a99e62f0738f120..6c78343cf69023e5220c6a50127b33325c0f1c97 100644 (file)
@@ -110,7 +110,7 @@ static int v9fs_file_lock(struct file *filp, int cmd, struct file_lock *fl)
 
        if ((IS_SETLK(cmd) || IS_SETLKW(cmd)) && fl->fl_type != F_UNLCK) {
                filemap_write_and_wait(inode->i_mapping);
-               invalidate_inode_pages(&inode->i_data);
+               invalidate_mapping_pages(&inode->i_data, 0, -1);
        }
 
        return res;
@@ -234,7 +234,7 @@ v9fs_file_write(struct file *filp, const char __user * data,
                total += result;
        } while (count);
 
-               invalidate_inode_pages2(inode->i_mapping);
+       invalidate_inode_pages2(inode->i_mapping);
        return total;
 }
 
index 378767c07bf11f746d1387e11dcebc087912adbd..5cf22134826bded20a24b57be206f2ff3624f3b4 100644 (file)
 #include "v9fs_vfs.h"
 #include "fid.h"
 
-static struct inode_operations v9fs_dir_inode_operations;
-static struct inode_operations v9fs_dir_inode_operations_ext;
-static struct inode_operations v9fs_file_inode_operations;
-static struct inode_operations v9fs_symlink_inode_operations;
+static const struct inode_operations v9fs_dir_inode_operations;
+static const struct inode_operations v9fs_dir_inode_operations_ext;
+static const struct inode_operations v9fs_file_inode_operations;
+static const struct inode_operations v9fs_symlink_inode_operations;
 
 /**
  * unixmode2p9mode - convert unix mode bits to plan 9
@@ -1303,7 +1303,7 @@ v9fs_vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
        return retval;
 }
 
-static struct inode_operations v9fs_dir_inode_operations_ext = {
+static const struct inode_operations v9fs_dir_inode_operations_ext = {
        .create = v9fs_vfs_create,
        .lookup = v9fs_vfs_lookup,
        .symlink = v9fs_vfs_symlink,
@@ -1318,7 +1318,7 @@ static struct inode_operations v9fs_dir_inode_operations_ext = {
        .setattr = v9fs_vfs_setattr,
 };
 
-static struct inode_operations v9fs_dir_inode_operations = {
+static const struct inode_operations v9fs_dir_inode_operations = {
        .create = v9fs_vfs_create,
        .lookup = v9fs_vfs_lookup,
        .unlink = v9fs_vfs_unlink,
@@ -1330,12 +1330,12 @@ static struct inode_operations v9fs_dir_inode_operations = {
        .setattr = v9fs_vfs_setattr,
 };
 
-static struct inode_operations v9fs_file_inode_operations = {
+static const struct inode_operations v9fs_file_inode_operations = {
        .getattr = v9fs_vfs_getattr,
        .setattr = v9fs_vfs_setattr,
 };
 
-static struct inode_operations v9fs_symlink_inode_operations = {
+static const struct inode_operations v9fs_symlink_inode_operations = {
        .readlink = v9fs_vfs_readlink,
        .follow_link = v9fs_vfs_follow_link,
        .put_link = v9fs_vfs_put_link,
index 63320d4e15d260fc0e7800d2bc0d2a54141666ff..0ec42f6654571b5c8aab77bd4d36d43abd058547 100644 (file)
@@ -45,7 +45,7 @@
 #include "fid.h"
 
 static void v9fs_clear_inode(struct inode *);
-static struct super_operations v9fs_super_ops;
+static const struct super_operations v9fs_super_ops;
 
 /**
  * v9fs_clear_inode - release an inode
@@ -263,7 +263,7 @@ v9fs_umount_begin(struct vfsmount *vfsmnt, int flags)
                v9fs_session_cancel(v9ses);
 }
 
-static struct super_operations v9fs_super_ops = {
+static const struct super_operations v9fs_super_ops = {
        .statfs = simple_statfs,
        .clear_inode = v9fs_clear_inode,
        .show_options = v9fs_show_options,
index 5e8e9d9ccb331ffe1a88c32f402a70eefca4ad18..a722b5a3f752f1701c4f172fb1ac94dd8c576836 100644 (file)
@@ -674,12 +674,6 @@ config ZISOFS
          necessary to create such a filesystem.  Say Y here if you want to be
          able to read such compressed CD-ROMs.
 
-config ZISOFS_FS
-# for fs/nls/Config.in
-       tristate
-       depends on ZISOFS
-       default ISO9660_FS
-
 config UDF_FS
        tristate "UDF file system support"
        help
@@ -1094,7 +1088,7 @@ config AFFS_FS
 
 config ECRYPT_FS
        tristate "eCrypt filesystem layer support (EXPERIMENTAL)"
-       depends on EXPERIMENTAL && KEYS && CRYPTO
+       depends on EXPERIMENTAL && KEYS && CRYPTO && NET
        help
          Encrypted filesystem that operates on the VFS layer.  See
          <file:Documentation/ecryptfs.txt> to learn more about
@@ -1870,20 +1864,14 @@ config CIFS
          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). 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.
+         support for OS/2 and Windows ME and similar servers is provided as well.
 
          The intent of the cifs module is to provide an advanced
-         network file system client for mounting to CIFS compliant servers, 
+         network file system client for mounting to CIFS compliant servers,
          including support for dfs (hierarchical name space), secure per-user
          session establishment, safe distributed caching (oplock), optional
-         packet signing, Unicode and other internationalization improvements, 
-         and optional Winbind (nsswitch) integration. You do not need to enable
-         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 from this machine, say Y.
+         packet signing, Unicode and other internationalization improvements. 
+         If you need to mount to Samba or Windows from this machine, say Y.
 
 config CIFS_STATS
         bool "CIFS statistics"
@@ -1976,14 +1964,13 @@ config CIFS_EXPERIMENTAL
          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.
+           experimental and currently include DFS support and directory 
+           change notification ie fcntl(F_DNOTIFY), as well as the upcall
+           mechanism which will be used for Kerberos session negotiation
+           and uid remapping.  Some of these features also may depend on 
+           setting a value of 1 to 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 "Kerberos/SPNEGO advanced session setup (EXPERIMENTAL)"
index 29217ff36d446a673dbabde26823b948aa6ce89b..936f2af39c433e12dfb8966b8716c3a90d7f1d2c 100644 (file)
@@ -84,7 +84,7 @@ void __adfs_error(struct super_block *sb, const char *function,
  */
 
 /* dir_*.c */
-extern struct inode_operations adfs_dir_inode_operations;
+extern const struct inode_operations adfs_dir_inode_operations;
 extern const struct file_operations adfs_dir_operations;
 extern struct dentry_operations adfs_dentry_operations;
 extern struct adfs_dir_ops adfs_f_dir_ops;
@@ -93,7 +93,7 @@ extern struct adfs_dir_ops adfs_fplus_dir_ops;
 extern int adfs_dir_update(struct super_block *sb, struct object_info *obj);
 
 /* file.c */
-extern struct inode_operations adfs_file_inode_operations;
+extern const struct inode_operations adfs_file_inode_operations;
 extern const struct file_operations adfs_file_operations;
 
 static inline __u32 signed_asl(__u32 val, signed int shift)
index 2b8903893d3f76be76ec4aa564b506b79c00d503..fc1a8dc64d78a8c8fcd03533739fe83f4b10b25d 100644 (file)
@@ -295,7 +295,7 @@ adfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
 /*
  * directories can handle most operations...
  */
-struct inode_operations adfs_dir_inode_operations = {
+const struct inode_operations adfs_dir_inode_operations = {
        .lookup         = adfs_lookup,
        .setattr        = adfs_notify_change,
 };
index 6101ea679cb1bf7772ba5da5342d7fb6def023ee..f544a285592343d4ac4cb9d1455a2c4e602cc2b9 100644 (file)
@@ -36,6 +36,6 @@ const struct file_operations adfs_file_operations = {
        .sendfile       = generic_file_sendfile,
 };
 
-struct inode_operations adfs_file_inode_operations = {
+const struct inode_operations adfs_file_inode_operations = {
        .setattr        = adfs_notify_change,
 };
index 5023351a7afe652fcd9af92e9201b7cc2029081c..2e5f2c8371ee3839acf853d7b2f3d22a08a9fe0c 100644 (file)
@@ -254,7 +254,7 @@ static void destroy_inodecache(void)
        kmem_cache_destroy(adfs_inode_cachep);
 }
 
-static struct super_operations adfs_sops = {
+static const struct super_operations adfs_sops = {
        .alloc_inode    = adfs_alloc_inode,
        .destroy_inode  = adfs_destroy_inode,
        .write_inode    = adfs_write_inode,
index 1dc8438ef389591a4dc79ce9545e444189f19e79..7db2d287e9f39576c1d18d595988ddc87eb51843 100644 (file)
@@ -188,9 +188,9 @@ extern void   affs_dir_truncate(struct inode *);
 
 /* jump tables */
 
-extern struct inode_operations  affs_file_inode_operations;
-extern struct inode_operations  affs_dir_inode_operations;
-extern struct inode_operations   affs_symlink_inode_operations;
+extern const struct inode_operations    affs_file_inode_operations;
+extern const struct inode_operations    affs_dir_inode_operations;
+extern const struct inode_operations   affs_symlink_inode_operations;
 extern const struct file_operations     affs_file_operations;
 extern const struct file_operations     affs_file_operations_ofs;
 extern const struct file_operations     affs_dir_operations;
index cad3ee340063238177b3f9c0976b20994c9b0820..6e3f282424b035a59b5add052ce5df098b90eb5f 100644 (file)
@@ -26,7 +26,7 @@ const struct file_operations affs_dir_operations = {
 /*
  * directories can handle most operations...
  */
-struct inode_operations affs_dir_inode_operations = {
+const struct inode_operations affs_dir_inode_operations = {
        .create         = affs_create,
        .lookup         = affs_lookup,
        .link           = affs_link,
index 05b5e22de759e10513301ac7b441bc4127c3b492..4aa8079e71be8c7c9ffb7f92d88cd1ce852a38af 100644 (file)
@@ -38,7 +38,7 @@ const struct file_operations affs_file_operations = {
        .sendfile       = generic_file_sendfile,
 };
 
-struct inode_operations affs_file_inode_operations = {
+const struct inode_operations affs_file_inode_operations = {
        .truncate       = affs_truncate,
        .setattr        = affs_notify_change,
 };
index 44d439cb69f491a2dc7b5012c014ae429de4c0fb..fce6848a4641a91a4d5341e69f0106ec99d02e36 100644 (file)
@@ -12,7 +12,7 @@
 
 #include "affs.h"
 
-extern struct inode_operations affs_symlink_inode_operations;
+extern const struct inode_operations affs_symlink_inode_operations;
 extern struct timezone sys_tz;
 
 void
index 3de93e799949cc9289ece4a0b13486221d2a136b..a324045d8554aed593fd2947c4eaa76ff5b79f7f 100644 (file)
@@ -112,7 +112,7 @@ static void destroy_inodecache(void)
        kmem_cache_destroy(affs_inode_cachep);
 }
 
-static struct super_operations affs_sops = {
+static const struct super_operations affs_sops = {
        .alloc_inode    = affs_alloc_inode,
        .destroy_inode  = affs_destroy_inode,
        .read_inode     = affs_read_inode,
index f802256a59330d96d537ac513f636b01a81eb79c..41782539c907b0cd1697ac161e20cfec22a76202 100644 (file)
@@ -70,7 +70,7 @@ const struct address_space_operations affs_symlink_aops = {
        .readpage       = affs_symlink_readpage,
 };
 
-struct inode_operations affs_symlink_inode_operations = {
+const struct inode_operations affs_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = page_follow_link_light,
        .put_link       = page_put_link,
index bfc1fd22d5b10578088aaf12e527e87c7bf163ee..1fc5783727596ca4b239f8e10bdcb891ef1f21c5 100644 (file)
@@ -10,7 +10,6 @@
  */
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <rxrpc/peer.h>
 #include <rxrpc/connection.h>
index 4acd0413405568c6d6f9623bbdfd755637574b14..b6dc2ebe47a885cea444ccb8f2ed1fa7586faf40 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/fs.h>
 #include <linux/pagemap.h>
@@ -37,7 +36,7 @@ const struct file_operations afs_dir_file_operations = {
        .readdir        = afs_dir_readdir,
 };
 
-struct inode_operations afs_dir_inode_operations = {
+const struct inode_operations afs_dir_inode_operations = {
        .lookup         = afs_dir_lookup,
        .getattr        = afs_inode_getattr,
 #if 0 /* TODO */
index 2e8c42639eaa54803887b441758d6e176b4cb58b..b17634541f677f573971f426aa59bb40c862ac4a 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/fs.h>
 #include <linux/pagemap.h>
@@ -30,7 +29,7 @@ static int afs_file_readpage(struct file *file, struct page *page);
 static void afs_file_invalidatepage(struct page *page, unsigned long offset);
 static int afs_file_releasepage(struct page *page, gfp_t gfp_flags);
 
-struct inode_operations afs_file_inode_operations = {
+const struct inode_operations afs_file_inode_operations = {
        .getattr        = afs_inode_getattr,
 };
 
index 6f37754906c201cb49940b2efbd57b5c6b9a978f..9d9bca6c28b5be5542c421d47df747595dcedeea 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/fs.h>
 #include <linux/pagemap.h>
index e88b3b65ae494a2861c8447b0592e9a7abcc353c..5151d5da2c2fb58ecbf493699c2da019ba6cb3d6 100644 (file)
@@ -63,14 +63,14 @@ extern struct cachefs_index_def afs_cache_cell_index_def;
 /*
  * dir.c
  */
-extern struct inode_operations afs_dir_inode_operations;
+extern const struct inode_operations afs_dir_inode_operations;
 extern const struct file_operations afs_dir_file_operations;
 
 /*
  * file.c
  */
 extern const struct address_space_operations afs_fs_aops;
-extern struct inode_operations afs_file_inode_operations;
+extern const struct inode_operations afs_file_inode_operations;
 
 #ifdef AFS_CACHING_SUPPORT
 extern int afs_cache_get_page_cookie(struct page *page,
@@ -104,7 +104,7 @@ extern struct cachefs_netfs afs_cache_netfs;
 /*
  * mntpt.c
  */
-extern struct inode_operations afs_mntpt_inode_operations;
+extern const struct inode_operations afs_mntpt_inode_operations;
 extern const struct file_operations afs_mntpt_file_operations;
 extern struct afs_timer afs_mntpt_expiry_timer;
 extern struct afs_timer_ops afs_mntpt_expiry_timer_ops;
index 913c689bdb357d3a8550ab573cd4a69386820575..f2704ba5385735f598f4378a7591d05042ac7214 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/completion.h>
 #include <rxrpc/rxrpc.h>
 #include <rxrpc/transport.h>
index 8f74e845082659fd1efc291f7f37f6f1026ef274..68495f0de7b39bcadd574d11fed907816ce8f88a 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/fs.h>
 #include <linux/pagemap.h>
@@ -36,7 +35,7 @@ const struct file_operations afs_mntpt_file_operations = {
        .open           = afs_mntpt_open,
 };
 
-struct inode_operations afs_mntpt_inode_operations = {
+const struct inode_operations afs_mntpt_inode_operations = {
        .lookup         = afs_mntpt_lookup,
        .follow_link    = afs_mntpt_follow_link,
        .readlink       = page_readlink,
index 86463ec9ccb496cea5907ec1de2075c982d4849d..ae6b85b1e484b26494546f0eaa136de071dea69c 100644 (file)
@@ -9,7 +9,6 @@
  * 2 of the License, or (at your option) any later version.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/module.h>
 #include <linux/proc_fs.h>
index 18d9b77ba40fe5ff081da9d95de551dd4978071a..eb7e32349da3e4354c884af376c6ffcbff509b71 100644 (file)
@@ -56,7 +56,7 @@ struct file_system_type afs_fs_type = {
        .fs_flags       = FS_BINARY_MOUNTDATA,
 };
 
-static struct super_operations afs_super_ops = {
+static const struct super_operations afs_super_ops = {
        .statfs         = simple_statfs,
        .alloc_inode    = afs_alloc_inode,
        .drop_inode     = generic_delete_inode,
index 55991e4132a7f30f778a7f86862b8992c59bafca..0b4ee0a5c83e809f07ca6a0a049e9521226782c0 100644 (file)
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -132,7 +132,7 @@ static int aio_setup_ring(struct kioctx *ctx)
        dprintk("attempting mmap of %lu bytes\n", info->mmap_size);
        down_write(&ctx->mm->mmap_sem);
        info->mmap_base = do_mmap(NULL, 0, info->mmap_size, 
-                                 PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE,
+                                 PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE,
                                  0);
        if (IS_ERR((void *)info->mmap_base)) {
                up_write(&ctx->mm->mmap_sem);
@@ -211,11 +211,10 @@ static struct kioctx *ioctx_alloc(unsigned nr_events)
        if ((unsigned long)nr_events > aio_max_nr)
                return ERR_PTR(-EAGAIN);
 
-       ctx = kmem_cache_alloc(kioctx_cachep, GFP_KERNEL);
+       ctx = kmem_cache_zalloc(kioctx_cachep, GFP_KERNEL);
        if (!ctx)
                return ERR_PTR(-ENOMEM);
 
-       memset(ctx, 0, sizeof(*ctx));
        ctx->max_reqs = nr_events;
        mm = ctx->mm = current->mm;
        atomic_inc(&mm->mm_count);
index 906ba5ce22617b12d7d3000eaab056f495b4159d..4ef544434b515d85511bf86c95a6322f520921a0 100644 (file)
@@ -142,8 +142,8 @@ struct autofs_dir_ent *autofs_expire(struct super_block *,struct autofs_sb_info
 
 /* Operations structures */
 
-extern struct inode_operations autofs_root_inode_operations;
-extern struct inode_operations autofs_symlink_inode_operations;
+extern const struct inode_operations autofs_root_inode_operations;
+extern const struct inode_operations autofs_symlink_inode_operations;
 extern const struct file_operations autofs_root_operations;
 
 /* Initializing function */
index f968d134280807bf7aaafb50d6aeb22a6a45d304..aa0b61ff827078c8045d8a141a0d1a7a27fbdce0 100644 (file)
@@ -52,7 +52,7 @@ out_kill_sb:
 
 static void autofs_read_inode(struct inode *inode);
 
-static struct super_operations autofs_sops = {
+static const struct super_operations autofs_sops = {
        .read_inode     = autofs_read_inode,
        .statfs         = simple_statfs,
 };
index e698c51d2b02f167b151dfb04e515870b8dd2c31..f2597205939d5efc6b56031a7569687c4f7063f1 100644 (file)
@@ -32,7 +32,7 @@ const struct file_operations autofs_root_operations = {
        .ioctl          = autofs_root_ioctl,
 };
 
-struct inode_operations autofs_root_inode_operations = {
+const struct inode_operations autofs_root_inode_operations = {
         .lookup                = autofs_root_lookup,
         .unlink                = autofs_root_unlink,
         .symlink       = autofs_root_symlink,
index c74f2eb6577521ffec6f01bb1a7f0d21f66af5c1..7ce9cb2c9ce21f74db531eef41d5df420feca5af 100644 (file)
@@ -20,7 +20,7 @@ static void *autofs_follow_link(struct dentry *dentry, struct nameidata *nd)
        return NULL;
 }
 
-struct inode_operations autofs_symlink_inode_operations = {
+const struct inode_operations autofs_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = autofs_follow_link
 };
index 216b1a364ccb76dc782573d87c85eaa72b89588c..6b4cec3f272ff091a893e85e0ee927459422ef22 100644 (file)
@@ -168,11 +168,11 @@ int autofs4_expire_multi(struct super_block *, struct vfsmount *,
 
 /* Operations structures */
 
-extern struct inode_operations autofs4_symlink_inode_operations;
-extern struct inode_operations autofs4_dir_inode_operations;
-extern struct inode_operations autofs4_root_inode_operations;
-extern struct inode_operations autofs4_indirect_root_inode_operations;
-extern struct inode_operations autofs4_direct_root_inode_operations;
+extern const struct inode_operations autofs4_symlink_inode_operations;
+extern const struct inode_operations autofs4_dir_inode_operations;
+extern const struct inode_operations autofs4_root_inode_operations;
+extern const struct inode_operations autofs4_indirect_root_inode_operations;
+extern const struct inode_operations autofs4_direct_root_inode_operations;
 extern const struct file_operations autofs4_dir_operations;
 extern const struct file_operations autofs4_root_operations;
 
index e8f6c5ad3e904a785c9a8fb73eac9af0b0b18633..5e458e096ef6a6d845a60158c987b3422f41d2a7 100644 (file)
@@ -196,7 +196,7 @@ static int autofs4_show_options(struct seq_file *m, struct vfsmount *mnt)
        return 0;
 }
 
-static struct super_operations autofs4_sops = {
+static const struct super_operations autofs4_sops = {
        .statfs         = simple_statfs,
        .show_options   = autofs4_show_options,
 };
index 8d05b9f7578dc8dcaf65dcaa4bbb71a0d69e3191..47fee96c21828de22ad5b5c78acfd8bf0e16c611 100644 (file)
@@ -47,7 +47,7 @@ const struct file_operations autofs4_dir_operations = {
        .readdir        = autofs4_dir_readdir,
 };
 
-struct inode_operations autofs4_indirect_root_inode_operations = {
+const struct inode_operations autofs4_indirect_root_inode_operations = {
        .lookup         = autofs4_lookup,
        .unlink         = autofs4_dir_unlink,
        .symlink        = autofs4_dir_symlink,
@@ -55,7 +55,7 @@ struct inode_operations autofs4_indirect_root_inode_operations = {
        .rmdir          = autofs4_dir_rmdir,
 };
 
-struct inode_operations autofs4_direct_root_inode_operations = {
+const struct inode_operations autofs4_direct_root_inode_operations = {
        .lookup         = autofs4_lookup,
        .unlink         = autofs4_dir_unlink,
        .mkdir          = autofs4_dir_mkdir,
@@ -63,7 +63,7 @@ struct inode_operations autofs4_direct_root_inode_operations = {
        .follow_link    = autofs4_follow_link,
 };
 
-struct inode_operations autofs4_dir_inode_operations = {
+const struct inode_operations autofs4_dir_inode_operations = {
        .lookup         = autofs4_lookup,
        .unlink         = autofs4_dir_unlink,
        .symlink        = autofs4_dir_symlink,
index 2ea2c98fd84bdc6ee03e3fda05a1d66425204caf..b4ea82934d2e3a7a8f2707cbac630b5627faca84 100644 (file)
@@ -19,7 +19,7 @@ static void *autofs4_follow_link(struct dentry *dentry, struct nameidata *nd)
        return NULL;
 }
 
-struct inode_operations autofs4_symlink_inode_operations = {
+const struct inode_operations autofs4_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = autofs4_follow_link
 };
index 869f5193ecc248321d1c2468d7de6090cb70954b..efeab2fab40b743e55718de1c365ec278804664c 100644 (file)
@@ -291,7 +291,7 @@ static int bad_inode_removexattr(struct dentry *dentry, const char *name)
        return -EIO;
 }
 
-static struct inode_operations bad_inode_ops =
+static const struct inode_operations bad_inode_ops =
 {
        .create         = bad_inode_create,
        .lookup         = bad_inode_lookup,
index 481e59b9d91cda482d5e89a4a7990c5b1c8b51b2..cc6cc8ed2e3963ca813ae31ba7b9169ff399038f 100644 (file)
@@ -68,7 +68,7 @@ static const struct file_operations befs_dir_operations = {
        .readdir        = befs_readdir,
 };
 
-static struct inode_operations befs_dir_inode_operations = {
+static const struct inode_operations befs_dir_inode_operations = {
        .lookup         = befs_lookup,
 };
 
@@ -78,7 +78,7 @@ static const struct address_space_operations befs_aops = {
        .bmap           = befs_bmap,
 };
 
-static struct inode_operations befs_symlink_inode_operations = {
+static const struct inode_operations befs_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = befs_follow_link,
        .put_link       = befs_put_link,
index 31973bbbf0574d285c71e309cbdbc36de83d0784..130f6c66c5ba09dab89de3b7865ac09a6c96ae25 100644 (file)
@@ -48,12 +48,12 @@ static inline struct bfs_inode_info *BFS_I(struct inode *inode)
 
 
 /* file.c */
-extern struct inode_operations bfs_file_inops;
+extern const struct inode_operations bfs_file_inops;
 extern const struct file_operations bfs_file_operations;
 extern const struct address_space_operations bfs_aops;
 
 /* dir.c */
-extern struct inode_operations bfs_dir_inops;
+extern const struct inode_operations bfs_dir_inops;
 extern const struct file_operations bfs_dir_operations;
 
 #endif /* _FS_BFS_BFS_H */
index 2a746e688df556519b8d597c999ab2205562ab9f..097f1497f743a2063e66c9511d947e6917251996 100644 (file)
@@ -260,7 +260,7 @@ end_rename:
        return error;
 }
 
-struct inode_operations bfs_dir_inops = {
+const struct inode_operations bfs_dir_inops = {
        .create                 = bfs_create,
        .lookup                 = bfs_lookup,
        .link                   = bfs_link,
index a9164a87f8deebfee1ceefd1f722bb0baac75491..ef4d1fa04e654f3f792840cff4db34ab82b9a1f0 100644 (file)
@@ -164,4 +164,4 @@ const struct address_space_operations bfs_aops = {
        .bmap           = bfs_bmap,
 };
 
-struct inode_operations bfs_file_inops;
+const struct inode_operations bfs_file_inops;
index 134c99941a639915e10a630674ccacd760bd0c6f..93d6219243ad96b449370c78e7f3aaf8e9139e9e 100644 (file)
@@ -270,7 +270,7 @@ static void destroy_inodecache(void)
        kmem_cache_destroy(bfs_inode_cachep);
 }
 
-static struct super_operations bfs_sops = {
+static const struct super_operations bfs_sops = {
        .alloc_inode    = bfs_alloc_inode,
        .destroy_inode  = bfs_destroy_inode,
        .read_inode     = bfs_read_inode,
index 669dbe5b0317707f65e9ce374864cf789b9276f9..51db1182b27e4470edbc6945574aa1158a110bea 100644 (file)
@@ -76,7 +76,8 @@ static struct linux_binfmt elf_format = {
                .load_binary    = load_elf_binary,
                .load_shlib     = load_elf_library,
                .core_dump      = elf_core_dump,
-               .min_coredump   = ELF_EXEC_PAGESIZE
+               .min_coredump   = ELF_EXEC_PAGESIZE,
+               .hasvdso        = 1
 };
 
 #define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE)
index a4d933a51208c5bcbfdd182b2412c3b1d369c140..5810aa1339fdeb5d6d98dd857328998bcde733e5 100644 (file)
@@ -372,7 +372,7 @@ static int load_elf_fdpic_binary(struct linux_binprm *bprm,
        down_write(&current->mm->mmap_sem);
        current->mm->start_brk = do_mmap(NULL, 0, stack_size,
                                         PROT_READ | PROT_WRITE | PROT_EXEC,
-                                        MAP_PRIVATE | MAP_ANON | MAP_GROWSDOWN,
+                                        MAP_PRIVATE | MAP_ANONYMOUS | MAP_GROWSDOWN,
                                         0);
 
        if (IS_ERR_VALUE(current->mm->start_brk)) {
index c2e08252af35d5dd3140ff32d1cf79bbfd3521c7..e6f57990b121650647663f95f33727280cf22c4d 100644 (file)
@@ -719,7 +719,7 @@ static const struct file_operations bm_status_operations = {
 
 /* Superblock handling */
 
-static struct super_operations s_ops = {
+static const struct super_operations s_ops = {
        .statfs         = simple_statfs,
        .clear_inode    = bm_clear_inode,
 };
index fc7028b685f29ab94d5db4ef26dbb897573c6af5..0c59b703e9d56f8b104f4ad556e235db904573ac 100644 (file)
@@ -489,7 +489,7 @@ static void bdev_clear_inode(struct inode *inode)
        spin_unlock(&bdev_lock);
 }
 
-static struct super_operations bdev_sops = {
+static const struct super_operations bdev_sops = {
        .statfs = simple_statfs,
        .alloc_inode = bdev_alloc_inode,
        .destroy_inode = bdev_destroy_inode,
index 1ad674fd348c4bfe6f130bc9a958a3c38338619c..f99c509697cd7b11865b6d40f8abda1bd349d7a1 100644 (file)
@@ -78,6 +78,7 @@ EXPORT_SYMBOL(__lock_buffer);
 
 void fastcall unlock_buffer(struct buffer_head *bh)
 {
+       smp_mb__before_clear_bit();
        clear_buffer_locked(bh);
        smp_mb__after_clear_bit();
        wake_up_bit(&bh->b_state, BH_Lock);
@@ -345,7 +346,7 @@ void invalidate_bdev(struct block_device *bdev, int destroy_dirty_buffers)
         * We really want to use invalidate_inode_pages2() for
         * that, but not until that's cleaned up.
         */
-       invalidate_inode_pages(mapping);
+       invalidate_mapping_pages(mapping, 0, -1);
 }
 
 /*
@@ -1282,11 +1283,11 @@ static void bh_lru_install(struct buffer_head *bh)
  * Look up the bh in this cpu's LRU.  If it's there, move it to the head.
  */
 static struct buffer_head *
-lookup_bh_lru(struct block_device *bdev, sector_t block, int size)
+lookup_bh_lru(struct block_device *bdev, sector_t block, unsigned size)
 {
        struct buffer_head *ret = NULL;
        struct bh_lru *lru;
-       int i;
+       unsigned int i;
 
        check_irqs_on();
        bh_lru_lock();
@@ -1318,7 +1319,7 @@ lookup_bh_lru(struct block_device *bdev, sector_t block, int size)
  * NULL
  */
 struct buffer_head *
-__find_get_block(struct block_device *bdev, sector_t block, int size)
+__find_get_block(struct block_device *bdev, sector_t block, unsigned size)
 {
        struct buffer_head *bh = lookup_bh_lru(bdev, block, size);
 
@@ -1346,7 +1347,7 @@ EXPORT_SYMBOL(__find_get_block);
  * attempt is failing.  FIXME, perhaps?
  */
 struct buffer_head *
-__getblk(struct block_device *bdev, sector_t block, int size)
+__getblk(struct block_device *bdev, sector_t block, unsigned size)
 {
        struct buffer_head *bh = __find_get_block(bdev, block, size);
 
@@ -1360,7 +1361,7 @@ EXPORT_SYMBOL(__getblk);
 /*
  * Do async read-ahead on a buffer..
  */
-void __breadahead(struct block_device *bdev, sector_t block, int size)
+void __breadahead(struct block_device *bdev, sector_t block, unsigned size)
 {
        struct buffer_head *bh = __getblk(bdev, block, size);
        if (likely(bh)) {
@@ -1380,7 +1381,7 @@ EXPORT_SYMBOL(__breadahead);
  *  It returns NULL if the block was unreadable.
  */
 struct buffer_head *
-__bread(struct block_device *bdev, sector_t block, int size)
+__bread(struct block_device *bdev, sector_t block, unsigned size)
 {
        struct buffer_head *bh = __getblk(bdev, block, size);
 
@@ -1439,6 +1440,7 @@ static void discard_buffer(struct buffer_head * bh)
        clear_buffer_req(bh);
        clear_buffer_new(bh);
        clear_buffer_delay(bh);
+       clear_buffer_unwritten(bh);
        unlock_buffer(bh);
 }
 
@@ -1822,6 +1824,7 @@ static int __block_prepare_write(struct inode *inode, struct page *page,
                        continue; 
                }
                if (!buffer_uptodate(bh) && !buffer_delay(bh) &&
+                   !buffer_unwritten(bh) &&
                     (block_start < from || block_end > to)) {
                        ll_rw_block(READ, 1, &bh);
                        *wait_bh++=bh;
@@ -2543,7 +2546,7 @@ int block_truncate_page(struct address_space *mapping,
        if (PageUptodate(page))
                set_buffer_uptodate(bh);
 
-       if (!buffer_uptodate(bh) && !buffer_delay(bh)) {
+       if (!buffer_uptodate(bh) && !buffer_delay(bh) && !buffer_unwritten(bh)) {
                err = -EIO;
                ll_rw_block(READ, 1, &bh);
                wait_on_buffer(bh);
index a885f46ca001f117a9b8bc3bd4ac0e140b5c9e3e..e6194e2b9bb9cbf39c9c85f23d346d55716293a1 100644 (file)
@@ -108,6 +108,13 @@ __register_chrdev_region(unsigned int major, unsigned int baseminor,
        /* temporary */
        if (major == 0) {
                for (i = ARRAY_SIZE(chrdevs)-1; i > 0; i--) {
+                       /*
+                        * Disallow the LANANA-assigned LOCAL/EXPERIMENTAL
+                        * majors
+                        */
+                       if ((60 <= i && i <= 63) || (120 <= i && i <= 127) ||
+                                       (240 <= i && i <= 254))
+                               continue;
                        if (chrdevs[i] == NULL)
                                break;
                }
index 85e3850bf2c92a29e212bc7c6b576a5a04eb27c5..5fe13593b57faec72a1c9211de31b31f667ae759 100644 (file)
@@ -1,8 +1,15 @@
 Version 1.47
 ------------
 Fix oops in list_del during mount caused by unaligned string.
+Fix file corruption which could occur on some large file
+copies caused by writepages page i/o completion bug.
 Seek to SEEK_END forces check for update of file size for non-cached
-files.
+files. Allow file size to be updated on remote extend of locally open,
+non-cached file.  Fix reconnect to newer Samba servers (or other servers
+which support the CIFS Unix/POSIX extensions) so that we again tell the
+server the Unix/POSIX cifs capabilities which we support (SetFSInfo).
+Add experimental support for new POSIX Open/Mkdir (which returns
+stat information on the open, and allows setting the mode).
 
 Version 1.46
 ------------
index fc34c74ec4bef91ed0c686ebe451b8787db26375..68372946dc92ba07e9ff6b0fe0a47126e2d99e8e 100644 (file)
@@ -128,3 +128,11 @@ negotiated size) and send larger write sizes to modern servers.
 
 4) More exhaustively test against less common servers.  More testing
 against Windows 9x, Windows ME servers.
+
+DOS attrs - returned as pseudo-xattr in Samba format (check VFAT and NTFS for this too)
+
+mount check for unmatched uids - and uid override
+
+Add mount option for Linux extension disable per mount, and partial disable per mount (uid off, symlink/fifo/mknod on but what about posix acls?) 
+
+Free threads at umount --force that are stuck on the sesSem
index 93ef09971d2fafb9f92ecd0eed6034c9661f1192..e8287c4c6eb33c416c56ea6ac41e3cccd3ae31d1 100644 (file)
@@ -64,7 +64,7 @@ extern struct task_struct * oplockThread; /* remove sparse warning */
 struct task_struct * oplockThread = NULL;
 extern struct task_struct * dnotifyThread; /* remove sparse warning */
 struct task_struct * dnotifyThread = NULL;
-static struct super_operations cifs_super_ops; 
+static const struct super_operations cifs_super_ops;
 unsigned int CIFSMaxBufSize = CIFS_MAX_MSGSIZE;
 module_param(CIFSMaxBufSize, int, 0);
 MODULE_PARM_DESC(CIFSMaxBufSize,"Network buffer size (not including header). Default: 16384 Range: 8192 to 130048");
@@ -453,7 +453,7 @@ static int cifs_remount(struct super_block *sb, int *flags, char *data)
        return 0;
 }
 
-static struct super_operations cifs_super_ops = {
+static const struct super_operations cifs_super_ops = {
        .read_inode = cifs_read_inode,
        .put_super = cifs_put_super,
        .statfs = cifs_statfs,
@@ -533,7 +533,7 @@ static struct file_system_type cifs_fs_type = {
        .kill_sb = kill_anon_super,
        /*  .fs_flags */
 };
-struct inode_operations cifs_dir_inode_ops = {
+const struct inode_operations cifs_dir_inode_ops = {
        .create = cifs_create,
        .lookup = cifs_lookup,
        .getattr = cifs_getattr,
@@ -555,7 +555,7 @@ struct inode_operations cifs_dir_inode_ops = {
 #endif
 };
 
-struct inode_operations cifs_file_inode_ops = {
+const struct inode_operations cifs_file_inode_ops = {
 /*     revalidate:cifs_revalidate, */
        .setattr = cifs_setattr,
        .getattr = cifs_getattr, /* do we need this anymore? */
@@ -569,7 +569,7 @@ struct inode_operations cifs_file_inode_ops = {
 #endif 
 };
 
-struct inode_operations cifs_symlink_inode_ops = {
+const struct inode_operations cifs_symlink_inode_ops = {
        .readlink = generic_readlink, 
        .follow_link = cifs_follow_link,
        .put_link = cifs_put_link,
index 8aa66dcf13bd2f342dd19d72e148bc91725151cc..c97c08eb481a38b926a63f039b27ad57068c2b78 100644 (file)
@@ -36,13 +36,13 @@ extern const struct address_space_operations cifs_addr_ops;
 extern const struct address_space_operations cifs_addr_ops_smallbuf;
 
 /* Functions related to super block operations */
-/* extern struct super_operations cifs_super_ops;*/
+/* extern const struct super_operations cifs_super_ops;*/
 extern void cifs_read_inode(struct inode *);
 extern void cifs_delete_inode(struct inode *);
 /* extern void cifs_write_inode(struct inode *); *//* BB not needed yet */
 
 /* Functions related to inodes */
-extern struct inode_operations cifs_dir_inode_ops;
+extern const struct inode_operations cifs_dir_inode_ops;
 extern int cifs_create(struct inode *, struct dentry *, int, 
                       struct nameidata *);
 extern struct dentry * cifs_lookup(struct inode *, struct dentry *,
@@ -58,8 +58,8 @@ extern int cifs_revalidate(struct dentry *);
 extern int cifs_getattr(struct vfsmount *, struct dentry *, struct kstat *);
 extern int cifs_setattr(struct dentry *, struct iattr *);
 
-extern struct inode_operations cifs_file_inode_ops;
-extern struct inode_operations cifs_symlink_inode_ops;
+extern const struct inode_operations cifs_file_inode_ops;
+extern const struct inode_operations cifs_symlink_inode_ops;
 
 /* Functions related to files and directories */
 extern const struct file_operations cifs_file_ops;
@@ -100,5 +100,5 @@ extern ssize_t      cifs_getxattr(struct dentry *, const char *, void *, size_t);
 extern ssize_t cifs_listxattr(struct dentry *, char *, size_t);
 extern int cifs_ioctl (struct inode * inode, struct file * filep,
                       unsigned int command, unsigned long arg);
-#define CIFS_VERSION   "1.47"
+#define CIFS_VERSION   "1.48"
 #endif                         /* _CIFSFS_H */
index 068ef51edbf710c08a4793ec3b78033a5df675d9..7d9505491b16e2a7fa83147b711fa9f53a0ec848 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *   fs/cifs/cifspdu.h
  *
- *   Copyright (c) International Business Machines  Corp., 2002,2005
+ *   Copyright (c) International Business Machines  Corp., 2002,2007
  *   Author(s): Steve French (sfrench@us.ibm.com)
  *
  *   This library is free software; you can redistribute it and/or modify
@@ -544,7 +544,8 @@ typedef union smb_com_session_setup_andx {
 /*      unsigned char  * NativeOS;      */
 /*     unsigned char  * NativeLanMan;  */
 /*      unsigned char  * PrimaryDomain; */
-       } __attribute__((packed)) resp; /* NTLM response with or without extended sec*/
+       } __attribute__((packed)) resp; /* NTLM response 
+                                          (with or without extended sec) */
 
        struct {                /* request format */
                struct smb_hdr hdr;     /* wct = 10 */
@@ -795,6 +796,8 @@ typedef struct smb_com_openx_rsp {
        __u16  ByteCount;
 } __attribute__((packed)) OPENX_RSP; 
 
+/* For encoding of POSIX Open Request - see trans2 function 0x209 data struct */
+
 /* Legacy write request for older servers */
 typedef struct smb_com_writex_req {
         struct smb_hdr hdr;     /* wct = 12 */
@@ -1352,11 +1355,13 @@ struct smb_t2_rsp {
 #define SMB_QUERY_FILE_UNIX_BASIC       0x200
 #define SMB_QUERY_FILE_UNIX_LINK        0x201
 #define SMB_QUERY_POSIX_ACL             0x204
-#define SMB_QUERY_XATTR                 0x205
+#define SMB_QUERY_XATTR                 0x205  /* e.g. system EA name space */
 #define SMB_QUERY_ATTR_FLAGS            0x206  /* append,immutable etc. */
 #define SMB_QUERY_POSIX_PERMISSION      0x207
 #define SMB_QUERY_POSIX_LOCK            0x208
-/* #define SMB_POSIX_OPEN              0x209 */
+/* #define SMB_POSIX_OPEN               0x209 */
+/* #define SMB_POSIX_UNLINK             0x20a */
+#define SMB_QUERY_FILE__UNIX_INFO2      0x20b
 #define SMB_QUERY_FILE_INTERNAL_INFO    0x3ee
 #define SMB_QUERY_FILE_ACCESS_INFO      0x3f0
 #define SMB_QUERY_FILE_NAME_INFO2       0x3f1 /* 0x30 bytes */
@@ -1377,8 +1382,10 @@ struct smb_t2_rsp {
 #define SMB_SET_ATTR_FLAGS              0x206  /* append, immutable etc. */
 #define SMB_SET_POSIX_LOCK              0x208
 #define SMB_POSIX_OPEN                  0x209
+#define SMB_POSIX_UNLINK                0x20a
+#define SMB_SET_FILE_UNIX_INFO2
 #define SMB_SET_FILE_BASIC_INFO2        0x3ec
-#define SMB_SET_FILE_RENAME_INFORMATION 0x3f2 /* BB check if qpathinfo level too */
+#define SMB_SET_FILE_RENAME_INFORMATION 0x3f2 /* BB check if qpathinfo too */
 #define SMB_FILE_ALL_INFO2              0x3fa
 #define SMB_SET_FILE_ALLOCATION_INFO2   0x3fb
 #define SMB_SET_FILE_END_OF_FILE_INFO2  0x3fc
@@ -1428,7 +1435,7 @@ typedef struct smb_com_transaction2_qpi_rsp {
        struct smb_hdr hdr;     /* wct = 10 + SetupCount */
        struct trans2_resp t2;
        __u16 ByteCount;
-       __u16 Reserved2;        /* parameter word reserved - present for infolevels > 100 */
+       __u16 Reserved2; /* parameter word is present for infolevels > 100 */
 } __attribute__((packed)) TRANSACTION2_QPI_RSP;
 
 typedef struct smb_com_transaction2_spi_req {
@@ -1461,7 +1468,7 @@ typedef struct smb_com_transaction2_spi_rsp {
        struct smb_hdr hdr;     /* wct = 10 + SetupCount */
        struct trans2_resp t2;
        __u16 ByteCount;
-       __u16 Reserved2;        /* parameter word reserved - present for infolevels > 100 */
+       __u16 Reserved2; /* parameter word is present for infolevels > 100 */
 } __attribute__((packed)) TRANSACTION2_SPI_RSP;
 
 struct set_file_rename {
@@ -1627,6 +1634,7 @@ typedef struct smb_com_transaction2_fnext_rsp_parms {
 #define SMB_QUERY_FS_ATTRIBUTE_INFO 0x105
 #define SMB_QUERY_CIFS_UNIX_INFO    0x200
 #define SMB_QUERY_POSIX_FS_INFO     0x201
+#define SMB_QUERY_POSIX_WHO_AM_I    0x202
 #define SMB_QUERY_LABEL_INFO        0x3ea
 #define SMB_QUERY_FS_QUOTA_INFO     0x3ee
 #define SMB_QUERY_FS_FULL_SIZE_INFO 0x3ef
@@ -1659,9 +1667,21 @@ typedef struct smb_com_transaction_qfsi_rsp {
        struct smb_hdr hdr;     /* wct = 10 + SetupCount */
        struct trans2_resp t2;
        __u16 ByteCount;
-       __u8 Pad;               /* may be three bytes *//* followed by data area */
+       __u8 Pad;       /* may be three bytes? *//* followed by data area */
 } __attribute__((packed)) TRANSACTION2_QFSI_RSP;
 
+typedef struct whoami_rsp_data { /* Query level 0x202 */
+       __u32 flags; /* 0 = Authenticated user 1 = GUEST */
+       __u32 mask; /* which flags bits server understands ie 0x0001 */
+       __u64 unix_user_id;
+       __u64 unix_user_gid;
+       __u32 number_of_supplementary_gids; /* may be zero */
+       __u32 number_of_sids; /* may be zero */
+       __u32 length_of_sid_array; /* in bytes - may be zero */
+       __u32 pad; /* reserved - MBZ */
+       /* __u64 gid_array[0]; */  /* may be empty */
+       /* __u8 * psid_list */  /* may be empty */
+} __attribute__((packed)) WHOAMI_RSP_DATA;
 
 /* SETFSInfo Levels */
 #define SMB_SET_CIFS_UNIX_INFO    0x200
@@ -1858,8 +1878,11 @@ typedef struct {
 #define CIFS_UNIX_XATTR_CAP             0x00000004 /* support new namespace   */
 #define CIFS_UNIX_EXTATTR_CAP           0x00000008 /* support chattr/chflag   */
 #define CIFS_UNIX_POSIX_PATHNAMES_CAP   0x00000010 /* Allow POSIX path chars  */
+#define CIFS_UNIX_POSIX_PATH_OPS_CAP    0x00000020 /* Allow new POSIX path based
+                                                     calls including posix open
+                                                     and posix unlink */ 
 #ifdef CONFIG_CIFS_POSIX
-#define CIFS_UNIX_CAP_MASK              0x0000001b
+#define CIFS_UNIX_CAP_MASK              0x0000003b
 #else 
 #define CIFS_UNIX_CAP_MASK              0x00000013
 #endif /* CONFIG_CIFS_POSIX */
@@ -1946,7 +1969,7 @@ typedef struct { /* data block encoding of response to level 263 QPathInfo */
        __le32 AlignmentRequirement;
        __le32 FileNameLength;
        char FileName[1];
-} __attribute__((packed)) FILE_ALL_INFO;               /* level 0x107 QPathInfo */
+} __attribute__((packed)) FILE_ALL_INFO;       /* level 0x107 QPathInfo */
 
 /* defines for enumerating possible values of the Unix type field below */
 #define UNIX_FILE      0
@@ -1970,11 +1993,11 @@ typedef struct {
        __u64 UniqueId;
        __le64 Permissions;
        __le64 Nlinks;
-} __attribute__((packed)) FILE_UNIX_BASIC_INFO;                /* level 0x200 QPathInfo */
+} __attribute__((packed)) FILE_UNIX_BASIC_INFO;        /* level 0x200 QPathInfo */
 
 typedef struct {
        char LinkDest[1];
-} __attribute__((packed)) FILE_UNIX_LINK_INFO;         /* level 0x201 QPathInfo */
+} __attribute__((packed)) FILE_UNIX_LINK_INFO; /* level 0x201 QPathInfo */
 
 /* The following three structures are needed only for
        setting time to NT4 and some older servers via
@@ -2011,7 +2034,7 @@ typedef struct {
        __le64 ChangeTime;
        __le32 Attributes;
        __u32 Pad;
-} __attribute__((packed)) FILE_BASIC_INFO;             /* size info, level 0x101 */
+} __attribute__((packed)) FILE_BASIC_INFO;     /* size info, level 0x101 */
 
 struct file_allocation_info {
        __le64 AllocationSize; /* Note old Samba srvr rounds this up too much */
@@ -2020,7 +2043,7 @@ struct file_allocation_info {
 
 struct file_end_of_file_info {
        __le64 FileSize;                /* offset to end of file */
-} __attribute__((packed));     /* size info, level 0x104 for set, 0x106 for query */
+} __attribute__((packed)); /* size info, level 0x104 for set, 0x106 for query */
 
 struct file_alt_name_info {
        __u8   alt_name[1];
@@ -2075,6 +2098,19 @@ struct cifs_posix_acl { /* access conrol list  (ACL) */
 
 /* end of POSIX ACL definitions */
 
+typedef struct {
+       __u32 OpenFlags; /* same as NT CreateX */
+       __u32 PosixOpenFlags;
+       __u32 Mode;
+       __u16 Level; /* reply level requested (see QPathInfo levels) */
+       __u16 Pad;  /* reserved - MBZ */
+} __attribute__((packed)) OPEN_PSX_REQ; /* level 0x209 SetPathInfo data */
+
+typedef struct {
+       /* reply varies based on requested level */
+} __attribute__((packed)) OPEN_PSX_RSP; /* level 0x209 SetPathInfo data */
+
+
 struct file_internal_info {
        __u64  UniqueId; /* inode number */
 } __attribute__((packed));      /* level 0x3ee */
@@ -2238,7 +2274,8 @@ struct data_blob {
        1) PosixCreateX - to set and return the mode, inode#, device info and
        perhaps add a CreateDevice - to create Pipes and other special .inodes
        Also note POSIX open flags
-       2) Close - to return the last write time to do cache across close more safely
+       2) Close - to return the last write time to do cache across close 
+               more safely
        3) FindFirst return unique inode number - what about resume key, two 
        forms short (matches readdir) and full (enough info to cache inodes)
        4) Mkdir - set mode
@@ -2273,7 +2310,8 @@ struct data_blob {
        TRANSACTION2 (18 cases)
                SMB_SET_FILE_END_OF_FILE_INFO2 SMB_SET_PATH_END_OF_FILE_INFO2
                (BB verify that never need to set allocation size)
-               SMB_SET_FILE_BASIC_INFO2 (setting times - BB can it be done via Unix ext?)
+               SMB_SET_FILE_BASIC_INFO2 (setting times - BB can it be done via
+                        Unix ext?)
        
        COPY (note support for copy across directories) - FUTURE, OPTIONAL
        setting/getting OS/2 EAs - FUTURE (BB can this handle
@@ -2293,13 +2331,13 @@ struct data_blob {
        T2 QUERY_PATH_INFO (SMB_QUERY_FILE_UNIX_BASIC) - BB check for missing inode fields
                                        Actually need QUERY_FILE_UNIX_INFO since has inode num
                                        BB what about a) blksize/blkbits/blocks
-                                                                 b) i_version
-                                                                 c) i_rdev
-                                                                 d) notify mask?
-                                                                 e) generation
-                                                                 f) size_seqcount
+                                                         b) i_version
+                                                         c) i_rdev
+                                                         d) notify mask?
+                                                         e) generation
+                                                         f) size_seqcount
        T2 FIND_FIRST/FIND_NEXT FIND_FILE_UNIX
-       TRANS2_GET_DFS_REFERRAL                           - OPTIONAL but recommended
+       TRANS2_GET_DFS_REFERRAL                   - OPTIONAL but recommended
        T2_QFS_INFO QueryDevice/AttributeInfo - OPTIONAL
        
        
@@ -2338,7 +2376,7 @@ typedef struct file_xattr_info {
        __u32 xattr_value_len;
        char  xattr_name[0];
        /* followed by xattr_value[xattr_value_len], no pad */
-} __attribute__((packed)) FILE_XATTR_INFO;     /* extended attribute, info level 0x205 */
+} __attribute__((packed)) FILE_XATTR_INFO; /* extended attribute, info level 0x205 */
 
 
 /* flags for chattr command */
index f1f8225102f0a6dead4670ef95c6fa42fe0917e3..6148b82170c40a129b017e9ae4793148126525f1 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/nls.h>
 
 struct statfs;
+struct smb_vol;
 
 /*
  *****************************************************************
@@ -57,7 +58,7 @@ extern int SendReceiveBlockingLock(const unsigned int /* xid */ ,
                                int * /* bytes returned */);
 extern int checkSMB(struct smb_hdr *smb, __u16 mid, unsigned int length);
 extern int is_valid_oplock_break(struct smb_hdr *smb, struct TCP_Server_Info *);
-extern int is_size_safe_to_change(struct cifsInodeInfo *);
+extern int is_size_safe_to_change(struct cifsInodeInfo *, __u64 eof);
 extern struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *);
 extern unsigned int smbCalcSize(struct smb_hdr *ptr);
 extern unsigned int smbCalcSize_LE(struct smb_hdr *ptr);
@@ -147,6 +148,8 @@ extern int get_dfs_path(int xid, struct cifsSesInfo *pSesInfo,
                        unsigned int *pnum_referrals, 
                        unsigned char ** preferrals,
                        int remap);
+extern void reset_cifs_unix_caps(int xid, struct cifsTconInfo *tcon,
+                                struct super_block * sb, struct smb_vol * vol);
 extern int CIFSSMBQFSInfo(const int xid, struct cifsTconInfo *tcon,
                        struct kstatfs *FSData);
 extern int SMBOldQFSInfo(const int xid, struct cifsTconInfo *tcon,
index 472e33e0f3cfd7fc3914d8dc78b41b82fa91aa64..b8e91470c27f895e8b583741cfc5d30ff7062cde 100644 (file)
@@ -158,9 +158,15 @@ small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
                                                        nls_codepage);
                        if(!rc && (tcon->tidStatus == CifsNeedReconnect)) {
                                mark_open_files_invalid(tcon);
-                               rc = CIFSTCon(0, tcon->ses, tcon->treeName, tcon
-                                       , nls_codepage);
+                               rc = CIFSTCon(0, tcon->ses, tcon->treeName, 
+                                             tcon, nls_codepage);
                                up(&tcon->ses->sesSem);
+                               /* tell server which Unix caps we support */
+                               if (tcon->ses->capabilities & CAP_UNIX)
+                                       reset_cifs_unix_caps(0 /* no xid */,
+                                               tcon, 
+                                               NULL /* we do not know sb */,
+                                               NULL /* no vol info */);        
                                /* BB FIXME add code to check if wsize needs
                                   update due to negotiated smb buffer size
                                   shrinking */
@@ -298,6 +304,12 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
                                rc = CIFSTCon(0, tcon->ses, tcon->treeName,
                                              tcon, nls_codepage);
                                up(&tcon->ses->sesSem);
+                               /* tell server which Unix caps we support */
+                               if (tcon->ses->capabilities & CAP_UNIX)
+                                       reset_cifs_unix_caps(0 /* no xid */,
+                                               tcon, 
+                                               NULL /* do not know sb */,
+                                               NULL /* no vol info */);
                                /* BB FIXME add code to check if wsize needs
                                update due to negotiated smb buffer size
                                shrinking */
index 2caca06b4bae214327c3fccc7a046f6a0269ac37..20ba7dcc99599a20a3716bb7ddfd4b36d65454af 100644 (file)
@@ -1613,6 +1613,76 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
        return rc;
 }
 
+void reset_cifs_unix_caps(int xid, struct cifsTconInfo * tcon, 
+                         struct super_block * sb, struct smb_vol * vol_info)
+{
+       /* if we are reconnecting then should we check to see if
+        * any requested capabilities changed locally e.g. via
+        * remount but we can not do much about it here
+        * if they have (even if we could detect it by the following)
+        * Perhaps we could add a backpointer to array of sb from tcon
+        * or if we change to make all sb to same share the same
+        * sb as NFS - then we only have one backpointer to sb.
+        * What if we wanted to mount the server share twice once with
+        * and once without posixacls or posix paths? */
+       __u64 saved_cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
+          
+        
+       if(!CIFSSMBQFSUnixInfo(xid, tcon)) {
+               __u64 cap = le64_to_cpu(tcon->fsUnixInfo.Capability);
+               
+               /* check for reconnect case in which we do not
+                  want to change the mount behavior if we can avoid it */
+               if(vol_info == NULL) {
+                       /* turn off POSIX ACL and PATHNAMES if not set 
+                          originally at mount time */
+                       if ((saved_cap & CIFS_UNIX_POSIX_ACL_CAP) == 0)
+                               cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
+                       if ((saved_cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) == 0)
+                               cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
+                               
+
+                        
+                       
+               }
+               
+               cap &= CIFS_UNIX_CAP_MASK;
+               if(vol_info && vol_info->no_psx_acl)
+                       cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
+               else if(CIFS_UNIX_POSIX_ACL_CAP & cap) {
+                       cFYI(1,("negotiated posix acl support"));
+                       if(sb)
+                               sb->s_flags |= MS_POSIXACL;
+               }
+
+               if(vol_info && vol_info->posix_paths == 0)
+                       cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
+               else if(cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
+                       cFYI(1,("negotiate posix pathnames"));
+                       if(sb)
+                               CIFS_SB(sb)->mnt_cifs_flags |= 
+                                       CIFS_MOUNT_POSIX_PATHS;
+               }
+                       
+               cFYI(1,("Negotiate caps 0x%x",(int)cap));
+#ifdef CONFIG_CIFS_DEBUG2
+               if(cap & CIFS_UNIX_FCNTL_CAP)
+                       cFYI(1,("FCNTL cap"));
+               if(cap & CIFS_UNIX_EXTATTR_CAP)
+                       cFYI(1,("EXTATTR cap"));
+               if(cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
+                       cFYI(1,("POSIX path cap"));
+               if(cap & CIFS_UNIX_XATTR_CAP)
+                       cFYI(1,("XATTR cap"));
+               if(cap & CIFS_UNIX_POSIX_ACL_CAP)
+                       cFYI(1,("POSIX ACL cap"));
+#endif /* CIFS_DEBUG2 */
+               if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
+                       cFYI(1,("setting capabilities failed"));
+               }
+       }
+}
+
 int
 cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
           char *mount_data, const char *devname)
@@ -1928,20 +1998,25 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
                        if (tcon == NULL)
                                rc = -ENOMEM;
                        else {
-                               /* check for null share name ie connect to dfs root */
+                               /* check for null share name ie connecting to 
+                                * dfs root */
 
-                               /* BB check if this works for exactly length three strings */
+                               /* BB check if this works for exactly length 
+                                * three strings */
                                if ((strchr(volume_info.UNC + 3, '\\') == NULL)
                                    && (strchr(volume_info.UNC + 3, '/') ==
                                        NULL)) {
                                        rc = connect_to_dfs_path(xid, pSesInfo,
-                                                       "", cifs_sb->local_nls,
-                                                       cifs_sb->mnt_cifs_flags & 
-                                                         CIFS_MOUNT_MAP_SPECIAL_CHR);
+                                               "", cifs_sb->local_nls,
+                                               cifs_sb->mnt_cifs_flags & 
+                                                 CIFS_MOUNT_MAP_SPECIAL_CHR);
                                        kfree(volume_info.UNC);
                                        FreeXid(xid);
                                        return -ENODEV;
                                } else {
+                                       /* BB Do we need to wrap sesSem around
+                                        * this TCon call and Unix SetFS as
+                                        * we do on SessSetup and reconnect? */
                                        rc = CIFSTCon(xid, pSesInfo, 
                                                volume_info.UNC,
                                                tcon, cifs_sb->local_nls);
@@ -1962,6 +2037,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
                        sb->s_maxbytes = (u64) 1 << 31; /* 2 GB */
        }
 
+       /* BB FIXME fix time_gran to be larger for LANMAN sessions */
        sb->s_time_gran = 100;
 
 /* on error free sesinfo and tcon struct if needed */
@@ -2006,45 +2082,11 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
                /* do not care if following two calls succeed - informational */
                CIFSSMBQFSDeviceInfo(xid, tcon);
                CIFSSMBQFSAttributeInfo(xid, tcon);
-
-               if (tcon->ses->capabilities & CAP_UNIX) {
-                       if(!CIFSSMBQFSUnixInfo(xid, tcon)) {
-                               __u64 cap = 
-                                      le64_to_cpu(tcon->fsUnixInfo.Capability);
-                               cap &= CIFS_UNIX_CAP_MASK;
-                               if(volume_info.no_psx_acl)
-                                       cap &= ~CIFS_UNIX_POSIX_ACL_CAP;
-                               else if(CIFS_UNIX_POSIX_ACL_CAP & cap) {
-                                       cFYI(1,("negotiated posix acl support"));
-                                       sb->s_flags |= MS_POSIXACL;
-                               }
-
-                               if(volume_info.posix_paths == 0)
-                                       cap &= ~CIFS_UNIX_POSIX_PATHNAMES_CAP;
-                               else if(cap & CIFS_UNIX_POSIX_PATHNAMES_CAP) {
-                                       cFYI(1,("negotiate posix pathnames"));
-                                       cifs_sb->mnt_cifs_flags |= 
-                                               CIFS_MOUNT_POSIX_PATHS;
-                               }
-                                       
-                               cFYI(1,("Negotiate caps 0x%x",(int)cap));
-#ifdef CONFIG_CIFS_DEBUG2
-                               if(cap & CIFS_UNIX_FCNTL_CAP)
-                                       cFYI(1,("FCNTL cap"));
-                               if(cap & CIFS_UNIX_EXTATTR_CAP)
-                                       cFYI(1,("EXTATTR cap"));
-                               if(cap & CIFS_UNIX_POSIX_PATHNAMES_CAP)
-                                       cFYI(1,("POSIX path cap"));
-                               if(cap & CIFS_UNIX_XATTR_CAP)
-                                       cFYI(1,("XATTR cap"));
-                               if(cap & CIFS_UNIX_POSIX_ACL_CAP)
-                                       cFYI(1,("POSIX ACL cap"));
-#endif /* CIFS_DEBUG2 */
-                               if (CIFSSMBSetFSUnixInfo(xid, tcon, cap)) {
-                                       cFYI(1,("setting capabilities failed"));
-                               }
-                       }
-               }
+               
+               /* tell server which Unix caps we support */
+               if (tcon->ses->capabilities & CAP_UNIX)
+                       reset_cifs_unix_caps(xid, tcon, sb, &volume_info);
+               
                if (!(tcon->ses->capabilities & CAP_LARGE_WRITE_X))
                        cifs_sb->wsize = min(cifs_sb->wsize,
                                             (tcon->ses->server->maxBuf -
index e9dcf5ee29a25bb42e765c57b5a916b84cd777c8..07ff9351e9ee71d5586f47827f92f1f9c1f7b4ff 100644 (file)
@@ -1954,7 +1954,7 @@ static int cifs_readpage(struct file *file, struct page *page)
    refreshing the inode only on increases in the file size 
    but this is tricky to do without racing with writebehind
    page caching in the current Linux kernel design */
-int is_size_safe_to_change(struct cifsInodeInfo *cifsInode)
+int is_size_safe_to_change(struct cifsInodeInfo *cifsInode, __u64 end_of_file)
 {
        struct cifsFileInfo *open_file = NULL;
 
@@ -1976,6 +1976,9 @@ int is_size_safe_to_change(struct cifsInodeInfo *cifsInode)
                        return 1;
                }
 
+               if(i_size_read(&cifsInode->vfs_inode) < end_of_file)
+                       return 1;
+
                return 0;
        } else
                return 1;
index c4fa91b8b62fb042c73df37f3a21ceadc3e840f9..3f5bc83dc3d1eabd97991f18a2cfaf53a0b8a5ba 100644 (file)
@@ -140,7 +140,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
                inode->i_gid = le64_to_cpu(findData.Gid);
                inode->i_nlink = le64_to_cpu(findData.Nlinks);
 
-               if (is_size_safe_to_change(cifsInfo)) {
+               if (is_size_safe_to_change(cifsInfo, end_of_file)) {
                /* can not safely change the file size here if the
                   client is writing to it due to potential races */
 
@@ -491,8 +491,8 @@ int cifs_get_inode_info(struct inode **pinode,
                /* BB add code here -
                   validate if device or weird share or device type? */
                }
-               if (is_size_safe_to_change(cifsInfo)) {
-                       /* can not safely change the file size here if the
+               if (is_size_safe_to_change(cifsInfo, le64_to_cpu(pfindData->EndOfFile))) {
+                       /* can not safely shrink the file size here if the
                           client is writing to it due to potential races */
                        i_size_write(inode,le64_to_cpu(pfindData->EndOfFile));
 
index 782940be550f48b59077e944d5306df27c33036b..c6220bd271656055395e67dd94f2d9158f87b2d7 100644 (file)
@@ -222,7 +222,7 @@ static void fill_in_inode(struct inode *tmp_inode, int new_buf_type,
                atomic_set(&cifsInfo->inUse, 1);
        }
 
-       if (is_size_safe_to_change(cifsInfo)) {
+       if (is_size_safe_to_change(cifsInfo, end_of_file)) {
                /* can not safely change the file size here if the 
                client is writing to it due to potential races */
                i_size_write(tmp_inode, end_of_file);
@@ -351,10 +351,10 @@ static void unix_fill_in_inode(struct inode *tmp_inode,
        tmp_inode->i_gid = le64_to_cpu(pfindData->Gid);
        tmp_inode->i_nlink = le64_to_cpu(pfindData->Nlinks);
 
-       if (is_size_safe_to_change(cifsInfo)) {
+       if (is_size_safe_to_change(cifsInfo, end_of_file)) {
                /* can not safely change the file size here if the 
                client is writing to it due to potential races */
-               i_size_write(tmp_inode,end_of_file);
+               i_size_write(tmp_inode, end_of_file);
 
        /* 512 bytes (2**9) is the fake blocksize that must be used */
        /* for this calculation, not the real blocksize */
index 4c9fecbfa91f1a82f09e531de40eb00612017bb0..28c872747f8170f45aa490987cfae07a80f7eee5 100644 (file)
@@ -16,7 +16,7 @@ static inline int coda_fideq(struct CodaFid *fid1, struct CodaFid *fid2)
        return memcmp(fid1, fid2, sizeof(*fid1)) == 0;
 }
 
-static struct inode_operations coda_symlink_inode_operations = {
+static const struct inode_operations coda_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = page_follow_link_light,
        .put_link       = page_put_link,
index 0c6f7f3b3dd7c36d9ba646b08cac3dc02cbae81f..9ddf5ed62162fdf767fbf30ff3d2f0cff82ad8e7 100644 (file)
@@ -66,7 +66,7 @@ static struct dentry_operations coda_dentry_operations =
        .d_delete       = coda_dentry_delete,
 };
 
-struct inode_operations coda_dir_inode_operations =
+const struct inode_operations coda_dir_inode_operations =
 {
        .create         = coda_create,
        .lookup         = coda_lookup,
index 01395defed85becda2176a54dfc089721f80a266..614175a3b02e9cd7eb6cdd89bc151912cc187cc4 100644 (file)
@@ -90,7 +90,7 @@ static int coda_remount(struct super_block *sb, int *flags, char *data)
 }
 
 /* exported operations */
-static struct super_operations coda_super_operations =
+static const struct super_operations coda_super_operations =
 {
        .alloc_inode    = coda_alloc_inode,
        .destroy_inode  = coda_destroy_inode,
@@ -271,7 +271,7 @@ int coda_setattr(struct dentry *de, struct iattr *iattr)
        return error;
 }
 
-struct inode_operations coda_file_inode_operations = {
+const struct inode_operations coda_file_inode_operations = {
        .permission     = coda_permission,
        .getattr        = coda_getattr,
        .setattr        = coda_setattr,
index 214822be87bdd424c07a9cc116d74a4ca6e5eada..2bf3026adc803065c02e1a80912cc0b2ffe7e266 100644 (file)
@@ -30,7 +30,7 @@ static int coda_pioctl(struct inode * inode, struct file * filp,
                        unsigned int cmd, unsigned long user_data);
 
 /* exported from this file */
-struct inode_operations coda_ioctl_inode_operations =
+const struct inode_operations coda_ioctl_inode_operations =
 {
        .permission     = coda_ioctl_permission,
        .setattr        = coda_setattr,
index 1c82e9a7d7c8a799698e404e1b50b31031ac3021..c57a1fa7cf232eb73b554acc4d95c1669f0a67ab 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/mm.h>
 #include <linux/sysctl.h>
 #include <linux/proc_fs.h>
+#include <linux/seq_file.h>
 #include <linux/slab.h>
 #include <linux/stat.h>
 #include <linux/ctype.h>
@@ -32,8 +33,6 @@
 
 static struct ctl_table_header *fs_table_header;
 
-#define FS_CODA         1       /* Coda file system */
-
 #define CODA_TIMEOUT    3       /* timeout on upcalls to become intrble */
 #define CODA_HARD       5       /* mount type "hard" or "soft" */
 #define CODA_VFS        6       /* vfs statistics */
@@ -84,15 +83,11 @@ static int do_reset_coda_cache_inv_stats( ctl_table * table, int write,
        return 0;
 }
 
-static int coda_vfs_stats_get_info( char * buffer, char ** start,
-                                   off_t offset, int length)
+static int proc_vfs_stats_show(struct seq_file *m, void *v)
 {
-       int len=0;
-       off_t begin;
        struct coda_vfs_stats * ps = & coda_vfs_stat;
   
-  /* this works as long as we are below 1024 characters! */
-       len += sprintf( buffer,
+       seq_printf(m,
                        "Coda VFS statistics\n"
                        "===================\n\n"
                        "File Operations:\n"
@@ -132,28 +127,14 @@ static int coda_vfs_stats_get_info( char * buffer, char ** start,
                        ps->rmdir,
                        ps->rename,
                        ps->permission); 
-
-       begin = offset;
-       *start = buffer + begin;
-       len -= begin;
-
-       if ( len > length )
-               len = length;
-       if ( len < 0 )
-               len = 0;
-
-       return len;
+       return 0;
 }
 
-static int coda_cache_inv_stats_get_info( char * buffer, char ** start,
-                                         off_t offset, int length)
+static int proc_cache_inv_stats_show(struct seq_file *m, void *v)
 {
-       int len=0;
-       off_t begin;
        struct coda_cache_inv_stats * ps = & coda_cache_inv_stat;
   
-       /* this works as long as we are below 1024 characters! */
-       len += sprintf( buffer,
+       seq_printf(m,
                        "Coda cache invalidation statistics\n"
                        "==================================\n\n"
                        "flush\t\t%9d\n"
@@ -170,31 +151,87 @@ static int coda_cache_inv_stats_get_info( char * buffer, char ** start,
                        ps->zap_vnode,
                        ps->purge_fid,
                        ps->replace );
-  
-       begin = offset;
-       *start = buffer + begin;
-       len -= begin;
+       return 0;
+}
 
-       if ( len > length )
-               len = length;
-       if ( len < 0 )
-               len = 0;
+static int proc_vfs_stats_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, proc_vfs_stats_show, NULL);
+}
 
-       return len;
+static int proc_cache_inv_stats_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, proc_cache_inv_stats_show, NULL);
 }
 
+static const struct file_operations proc_vfs_stats_fops = {
+       .owner          = THIS_MODULE,
+       .open           = proc_vfs_stats_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
+static const struct file_operations proc_cache_inv_stats_fops = {
+       .owner          = THIS_MODULE,
+       .open           = proc_cache_inv_stats_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
 static ctl_table coda_table[] = {
-       {CODA_TIMEOUT, "timeout", &coda_timeout, sizeof(int), 0644, NULL, &proc_dointvec},
-       {CODA_HARD, "hard", &coda_hard, sizeof(int), 0644, NULL, &proc_dointvec},
-       {CODA_VFS, "vfs_stats", NULL, 0, 0644, NULL, &do_reset_coda_vfs_stats},
-       {CODA_CACHE_INV, "cache_inv_stats", NULL, 0, 0644, NULL, &do_reset_coda_cache_inv_stats},
-       {CODA_FAKE_STATFS, "fake_statfs", &coda_fake_statfs, sizeof(int), 0600, NULL, &proc_dointvec},
-       { 0 }
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "timeout",
+               .data           = &coda_timeout,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "hard",
+               .data           = &coda_hard,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "vfs_stats",
+               .data           = NULL,
+               .maxlen         = 0,
+               .mode           = 0644,
+               .proc_handler   = &do_reset_coda_vfs_stats
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "cache_inv_stats",
+               .data           = NULL,
+               .maxlen         = 0,
+               .mode           = 0644,
+               .proc_handler   = &do_reset_coda_cache_inv_stats
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "fake_statfs",
+               .data           = &coda_fake_statfs,
+               .maxlen         = sizeof(int),
+               .mode           = 0600,
+               .proc_handler   = &proc_dointvec
+       },
+       {}
 };
 
 static ctl_table fs_table[] = {
-       {FS_CODA, "coda",    NULL, 0, 0555, coda_table},
-       {0}
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "coda",
+               .mode           = 0555,
+               .child          = coda_table
+       },
+       {}
 };
 
 
@@ -212,9 +249,6 @@ static struct proc_dir_entry* proc_fs_coda;
 
 #endif
 
-#define coda_proc_create(name,get_info) \
-       create_proc_info_entry(name, 0, proc_fs_coda, get_info)
-
 void coda_sysctl_init(void)
 {
        reset_coda_vfs_stats();
@@ -223,15 +257,21 @@ void coda_sysctl_init(void)
 #ifdef CONFIG_PROC_FS
        proc_fs_coda = proc_mkdir("coda", proc_root_fs);
        if (proc_fs_coda) {
+               struct proc_dir_entry *pde;
+
                proc_fs_coda->owner = THIS_MODULE;
-               coda_proc_create("vfs_stats", coda_vfs_stats_get_info);
-               coda_proc_create("cache_inv_stats", coda_cache_inv_stats_get_info);
+               pde = create_proc_entry("vfs_stats", 0, proc_fs_coda);
+               if (pde)
+                       pde->proc_fops = &proc_vfs_stats_fops;
+               pde = create_proc_entry("cache_inv_stats", 0, proc_fs_coda);
+               if (pde)
+                       pde->proc_fops = &proc_cache_inv_stats_fops;
        }
 #endif
 
 #ifdef CONFIG_SYSCTL
        if ( !fs_table_header )
-               fs_table_header = register_sysctl_table(fs_table, 0);
+               fs_table_header = register_sysctl_table(fs_table);
 #endif 
 }
 
index f92cd303d2c9599a2837ee012814aabc15153891..7b48c034b312128cbf64fe2094aa7155b5323fdb 100644 (file)
@@ -75,8 +75,8 @@ extern struct super_block * configfs_sb;
 extern const struct file_operations configfs_dir_operations;
 extern const struct file_operations configfs_file_operations;
 extern const struct file_operations bin_fops;
-extern struct inode_operations configfs_dir_inode_operations;
-extern struct inode_operations configfs_symlink_inode_operations;
+extern const struct inode_operations configfs_dir_inode_operations;
+extern const struct inode_operations configfs_symlink_inode_operations;
 
 extern int configfs_symlink(struct inode *dir, struct dentry *dentry,
                            const char *symname);
index 1814ba446809ac79ea6ab911a60ac42d1e36d33d..34750d5e4ff2c4b0b6b3bc841fdcb016db5f5d62 100644 (file)
@@ -72,11 +72,10 @@ static struct configfs_dirent *configfs_new_dirent(struct configfs_dirent * pare
 {
        struct configfs_dirent * sd;
 
-       sd = kmem_cache_alloc(configfs_dir_cachep, GFP_KERNEL);
+       sd = kmem_cache_zalloc(configfs_dir_cachep, GFP_KERNEL);
        if (!sd)
                return NULL;
 
-       memset(sd, 0, sizeof(*sd));
        atomic_set(&sd->s_count, 1);
        INIT_LIST_HEAD(&sd->s_links);
        INIT_LIST_HEAD(&sd->s_children);
@@ -931,7 +930,7 @@ static int configfs_rmdir(struct inode *dir, struct dentry *dentry)
        return 0;
 }
 
-struct inode_operations configfs_dir_inode_operations = {
+const struct inode_operations configfs_dir_inode_operations = {
        .mkdir          = configfs_mkdir,
        .rmdir          = configfs_rmdir,
        .symlink        = configfs_symlink,
index fb18917954a91f95643b38352adab17a42e98600..2ec9beac17cffd55a83a41dad48a586f5cc44df4 100644 (file)
@@ -49,7 +49,7 @@ static struct backing_dev_info configfs_backing_dev_info = {
        .capabilities   = BDI_CAP_NO_ACCT_DIRTY | BDI_CAP_NO_WRITEBACK,
 };
 
-static struct inode_operations configfs_inode_operations ={
+static const struct inode_operations configfs_inode_operations ={
        .setattr        = configfs_setattr,
 };
 
index ed678529ebb2a8b58fdc86c277e3eea83aca96c9..6f573004cd7dac9556a03ecbdb58577f01f76d4d 100644 (file)
@@ -41,7 +41,7 @@ struct super_block * configfs_sb = NULL;
 struct kmem_cache *configfs_dir_cachep;
 static int configfs_mnt_count = 0;
 
-static struct super_operations configfs_ops = {
+static const struct super_operations configfs_ops = {
        .statfs         = simple_statfs,
        .drop_inode     = generic_delete_inode,
 };
index fb65e0800a86b66fa6afe2bad9a99c624daddebf..22700d2857daa36b62173fdedc5960d317ade1e9 100644 (file)
@@ -272,7 +272,7 @@ static void configfs_put_link(struct dentry *dentry, struct nameidata *nd,
        }
 }
 
-struct inode_operations configfs_symlink_inode_operations = {
+const struct inode_operations configfs_symlink_inode_operations = {
        .follow_link = configfs_follow_link,
        .readlink = generic_readlink,
        .put_link = configfs_put_link,
index 6db03fb089dcaa3fdd2dc43d1784e158e3ec4ea7..facd0c89be8f6ecd60c4da3fa0b46f528fdb079a 100644 (file)
@@ -27,8 +27,8 @@
 
 #include <asm/uaccess.h>
 
-static struct super_operations cramfs_ops;
-static struct inode_operations cramfs_dir_inode_operations;
+static const struct super_operations cramfs_ops;
+static const struct inode_operations cramfs_dir_inode_operations;
 static const struct file_operations cramfs_directory_operations;
 static const struct address_space_operations cramfs_aops;
 
@@ -518,11 +518,11 @@ static const struct file_operations cramfs_directory_operations = {
        .readdir        = cramfs_readdir,
 };
 
-static struct inode_operations cramfs_dir_inode_operations = {
+static const struct inode_operations cramfs_dir_inode_operations = {
        .lookup         = cramfs_lookup,
 };
 
-static struct super_operations cramfs_ops = {
+static const struct super_operations cramfs_ops = {
        .put_super      = cramfs_put_super,
        .remount_fs     = cramfs_remount,
        .statfs         = cramfs_statfs,
index bf3901ab1744b25355ca54ea82deb578f8aeffc0..8d130cc8532248893f2bf5e9af3cf152ad08d3b5 100644 (file)
@@ -254,7 +254,7 @@ static ssize_t read_file_blob(struct file *file, char __user *user_buf,
                        blob->size);
 }
 
-static struct file_operations fops_blob = {
+static const struct file_operations fops_blob = {
        .read =         read_file_blob,
        .open =         default_open,
 };
index 5f7b5a6025bfec943dc390f02bcaa92ef7201b1e..643e57b622bd64c9e88d09f61355e55fd0220a8e 100644 (file)
@@ -91,7 +91,7 @@ static int devpts_remount(struct super_block *sb, int *flags, char *data)
        return 0;
 }
 
-static struct super_operations devpts_sops = {
+static const struct super_operations devpts_sops = {
        .statfs         = simple_statfs,
        .remount_fs     = devpts_remount,
 };
index ca94a837a5bba1d92b0478ecfced67c2538aab89..61ba670b9e025fde7f8cedb28fd96ceee483de67 100644 (file)
@@ -287,7 +287,7 @@ static int rsb_open(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations rsb_fops = {
+static const struct file_operations rsb_fops = {
        .owner   = THIS_MODULE,
        .open    = rsb_open,
        .read    = seq_read,
@@ -331,7 +331,7 @@ static ssize_t waiters_read(struct file *file, char __user *userbuf,
        return rv;
 }
 
-static struct file_operations waiters_fops = {
+static const struct file_operations waiters_fops = {
        .owner   = THIS_MODULE,
        .open    = waiters_open,
        .read    = waiters_read
index 5352b03ff5aa81f9af31c081965f7ae8dd81f90e..f858fef6e41cf32167b3b5d6634458fc62e8d1e7 100644 (file)
@@ -76,9 +76,7 @@ struct dlm_lkb *allocate_lkb(struct dlm_ls *ls)
 {
        struct dlm_lkb *lkb;
 
-       lkb = kmem_cache_alloc(lkb_cache, GFP_KERNEL);
-       if (lkb)
-               memset(lkb, 0, sizeof(*lkb));
+       lkb = kmem_cache_zalloc(lkb_cache, GFP_KERNEL);
        return lkb;
 }
 
index d378b7fe2a1ea6d4dc7846a6e95e46dff051f8b0..40db61dc95f2550f09d592bcd2b2e751fca85291 100644 (file)
@@ -25,7 +25,7 @@
 
 static const char *name_prefix="dlm";
 static struct miscdevice ctl_device;
-static struct file_operations device_fops;
+static const struct file_operations device_fops;
 
 #ifdef CONFIG_COMPAT
 
@@ -759,7 +759,7 @@ static int ctl_device_close(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations device_fops = {
+static const struct file_operations device_fops = {
        .open    = device_open,
        .release = device_close,
        .read    = device_read,
@@ -768,7 +768,7 @@ static struct file_operations device_fops = {
        .owner   = THIS_MODULE,
 };
 
-static struct file_operations ctl_device_fops = {
+static const struct file_operations ctl_device_fops = {
        .open    = ctl_device_open,
        .release = ctl_device_close,
        .write   = device_write,
index 0952cc474d9a57e08b495315200a73d9c93889e7..b16f991662c1b5d58db4dde3fc982125a015472f 100644 (file)
@@ -79,6 +79,7 @@
 #include <linux/buffer_head.h>
 #include <linux/capability.h>
 #include <linux/quotaops.h>
+#include <linux/writeback.h> /* for inode_lock, oddly enough.. */
 
 #include <asm/uaccess.h>
 
@@ -600,11 +601,10 @@ static struct dquot *get_empty_dquot(struct super_block *sb, int type)
 {
        struct dquot *dquot;
 
-       dquot = kmem_cache_alloc(dquot_cachep, GFP_NOFS);
+       dquot = kmem_cache_zalloc(dquot_cachep, GFP_NOFS);
        if(!dquot)
                return NODQUOT;
 
-       memset((caddr_t)dquot, 0, sizeof(struct dquot));
        mutex_init(&dquot->dq_lock);
        INIT_LIST_HEAD(&dquot->dq_free);
        INIT_LIST_HEAD(&dquot->dq_inuse);
@@ -688,23 +688,27 @@ static int dqinit_needed(struct inode *inode, int type)
 /* This routine is guarded by dqonoff_mutex mutex */
 static void add_dquot_ref(struct super_block *sb, int type)
 {
-       struct list_head *p;
+       struct inode *inode;
 
 restart:
-       file_list_lock();
-       list_for_each(p, &sb->s_files) {
-               struct file *filp = list_entry(p, struct file, f_u.fu_list);
-               struct inode *inode = filp->f_path.dentry->d_inode;
-               if (filp->f_mode & FMODE_WRITE && dqinit_needed(inode, type)) {
-                       struct dentry *dentry = dget(filp->f_path.dentry);
-                       file_list_unlock();
-                       sb->dq_op->initialize(inode, type);
-                       dput(dentry);
-                       /* As we may have blocked we had better restart... */
-                       goto restart;
-               }
+       spin_lock(&inode_lock);
+       list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
+               if (!atomic_read(&inode->i_writecount))
+                       continue;
+               if (!dqinit_needed(inode, type))
+                       continue;
+               if (inode->i_state & (I_FREEING|I_WILL_FREE))
+                       continue;
+
+               __iget(inode);
+               spin_unlock(&inode_lock);
+
+               sb->dq_op->initialize(inode, type);
+               iput(inode);
+               /* As we may have blocked we had better restart... */
+               goto restart;
        }
-       file_list_unlock();
+       spin_unlock(&inode_lock);
 }
 
 /* Return 0 if dqput() won't block (note that 1 doesn't necessarily mean blocking) */
@@ -756,15 +760,30 @@ static void put_dquot_list(struct list_head *tofree_head)
        }
 }
 
+static void remove_dquot_ref(struct super_block *sb, int type,
+               struct list_head *tofree_head)
+{
+       struct inode *inode;
+
+       spin_lock(&inode_lock);
+       list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
+               if (!IS_NOQUOTA(inode))
+                       remove_inode_dquot_ref(inode, type, tofree_head);
+       }
+       spin_unlock(&inode_lock);
+}
+
 /* Gather all references from inodes and drop them */
 static void drop_dquot_ref(struct super_block *sb, int type)
 {
        LIST_HEAD(tofree_head);
 
-       down_write(&sb_dqopt(sb)->dqptr_sem);
-       remove_dquot_ref(sb, type, &tofree_head);
-       up_write(&sb_dqopt(sb)->dqptr_sem);
-       put_dquot_list(&tofree_head);
+       if (sb->dq_op) {
+               down_write(&sb_dqopt(sb)->dqptr_sem);
+               remove_dquot_ref(sb, type, &tofree_head);
+               up_write(&sb_dqopt(sb)->dqptr_sem);
+               put_dquot_list(&tofree_head);
+       }
 }
 
 static inline void dquot_incr_inodes(struct dquot *dquot, unsigned long number)
@@ -1822,7 +1841,7 @@ static int __init dquot_init(void)
 
        printk(KERN_NOTICE "VFS: Disk quotas %s\n", __DQUOT_VERSION__);
 
-       register_sysctl_table(sys_table, 0);
+       register_sysctl_table(sys_table);
 
        dquot_cachep = kmem_cache_create("dquot", 
                        sizeof(struct dquot), sizeof(unsigned long) * 4,
index 4e4762389bdc560d993dfb42b3db9b664396e77f..03ea7696fe39435183b1b7a32770857fd39915c3 100644 (file)
@@ -20,7 +20,7 @@ static void drop_pagecache_sb(struct super_block *sb)
        list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
                if (inode->i_state & (I_FREEING|I_WILL_FREE))
                        continue;
-               invalidate_inode_pages(inode->i_mapping);
+               invalidate_mapping_pages(inode->i_mapping, 0, -1);
        }
        spin_unlock(&inode_lock);
 }
index ca6562451eeb29472a07589258f1553032443551..1f1107237eab166c460c03fd11841b658ca2c7c0 100644 (file)
@@ -4,4 +4,4 @@
 
 obj-$(CONFIG_ECRYPT_FS) += ecryptfs.o
 
-ecryptfs-objs := dentry.o file.o inode.o main.o super.o mmap.o crypto.o keystore.o debug.o
+ecryptfs-objs := dentry.o file.o inode.o main.o super.o mmap.o crypto.o keystore.o messaging.o netlink.o debug.o
index a86a55ccf87488a9757cf8fb7ccb05143338f794..6ac630625b70821274c4b8c753fbc90bc1daaec1 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 1997-2004 Erez Zadok
  * Copyright (C) 2001-2004 Stony Brook University
- * Copyright (C) 2004-2006 International Business Machines Corp.
+ * Copyright (C) 2004-2007 International Business Machines Corp.
  *   Author(s): Michael A. Halcrow <mahalcro@us.ibm.com>
  *             Michael C. Thompson <mcthomps@us.ibm.com>
  *
@@ -207,7 +207,7 @@ ecryptfs_init_crypt_stat(struct ecryptfs_crypt_stat *crypt_stat)
        mutex_init(&crypt_stat->cs_mutex);
        mutex_init(&crypt_stat->cs_tfm_mutex);
        mutex_init(&crypt_stat->cs_hash_tfm_mutex);
-       ECRYPTFS_SET_FLAG(crypt_stat->flags, ECRYPTFS_STRUCT_INITIALIZED);
+       crypt_stat->flags |= ECRYPTFS_STRUCT_INITIALIZED;
 }
 
 /**
@@ -305,8 +305,7 @@ static int encrypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat,
        int rc = 0;
 
        BUG_ON(!crypt_stat || !crypt_stat->tfm
-              || !ECRYPTFS_CHECK_FLAG(crypt_stat->flags,
-                                      ECRYPTFS_STRUCT_INITIALIZED));
+              || !(crypt_stat->flags & ECRYPTFS_STRUCT_INITIALIZED));
        if (unlikely(ecryptfs_verbosity > 0)) {
                ecryptfs_printk(KERN_DEBUG, "Key size [%d]; key:\n",
                                crypt_stat->key_size);
@@ -429,10 +428,10 @@ static int ecryptfs_read_in_page(struct ecryptfs_page_crypt_context *ctx,
                        goto out;
                }
        } else {
-               rc = ecryptfs_grab_and_map_lower_page(lower_page, NULL,
-                                                     lower_inode,
-                                                     lower_page_idx);
-               if (rc) {
+               *lower_page = grab_cache_page(lower_inode->i_mapping,
+                                             lower_page_idx);
+               if (!(*lower_page)) {
+                       rc = -EINVAL;
                        ecryptfs_printk(
                                KERN_ERR, "Error attempting to grab and map "
                                "lower page with index [0x%.16x]; rc = [%d]\n",
@@ -485,7 +484,7 @@ int ecryptfs_encrypt_page(struct ecryptfs_page_crypt_context *ctx)
        lower_inode = ecryptfs_inode_to_lower(ctx->page->mapping->host);
        inode_info = ecryptfs_inode_to_private(ctx->page->mapping->host);
        crypt_stat = &inode_info->crypt_stat;
-       if (!ECRYPTFS_CHECK_FLAG(crypt_stat->flags, ECRYPTFS_ENCRYPTED)) {
+       if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) {
                rc = ecryptfs_copy_page_to_lower(ctx->page, lower_inode,
                                                 ctx->param.lower_file);
                if (rc)
@@ -617,7 +616,7 @@ int ecryptfs_decrypt_page(struct file *file, struct page *page)
        crypt_stat = &(ecryptfs_inode_to_private(
                               page->mapping->host)->crypt_stat);
        lower_inode = ecryptfs_inode_to_lower(page->mapping->host);
-       if (!ECRYPTFS_CHECK_FLAG(crypt_stat->flags, ECRYPTFS_ENCRYPTED)) {
+       if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) {
                rc = ecryptfs_do_readpage(file, page, page->index);
                if (rc)
                        ecryptfs_printk(KERN_ERR, "Error attempting to copy "
@@ -863,7 +862,10 @@ void ecryptfs_set_default_sizes(struct ecryptfs_crypt_stat *crypt_stat)
                        ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE;
        } else
                crypt_stat->header_extent_size = PAGE_CACHE_SIZE;
-       crypt_stat->num_header_extents_at_front = 1;
+       if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR)
+               crypt_stat->num_header_extents_at_front = 0;
+       else
+               crypt_stat->num_header_extents_at_front = 1;
 }
 
 /**
@@ -879,7 +881,7 @@ int ecryptfs_compute_root_iv(struct ecryptfs_crypt_stat *crypt_stat)
 
        BUG_ON(crypt_stat->iv_bytes > MD5_DIGEST_SIZE);
        BUG_ON(crypt_stat->iv_bytes <= 0);
-       if (!ECRYPTFS_CHECK_FLAG(crypt_stat->flags, ECRYPTFS_KEY_VALID)) {
+       if (!(crypt_stat->flags & ECRYPTFS_KEY_VALID)) {
                rc = -EINVAL;
                ecryptfs_printk(KERN_WARNING, "Session key not valid; "
                                "cannot generate root IV\n");
@@ -896,8 +898,7 @@ int ecryptfs_compute_root_iv(struct ecryptfs_crypt_stat *crypt_stat)
 out:
        if (rc) {
                memset(crypt_stat->root_iv, 0, crypt_stat->iv_bytes);
-               ECRYPTFS_SET_FLAG(crypt_stat->flags,
-                                 ECRYPTFS_SECURITY_WARNING);
+               crypt_stat->flags |= ECRYPTFS_SECURITY_WARNING;
        }
        return rc;
 }
@@ -905,7 +906,7 @@ out:
 static void ecryptfs_generate_new_key(struct ecryptfs_crypt_stat *crypt_stat)
 {
        get_random_bytes(crypt_stat->key, crypt_stat->key_size);
-       ECRYPTFS_SET_FLAG(crypt_stat->flags, ECRYPTFS_KEY_VALID);
+       crypt_stat->flags |= ECRYPTFS_KEY_VALID;
        ecryptfs_compute_root_iv(crypt_stat);
        if (unlikely(ecryptfs_verbosity > 0)) {
                ecryptfs_printk(KERN_DEBUG, "Generated new session key:\n");
@@ -914,6 +915,22 @@ static void ecryptfs_generate_new_key(struct ecryptfs_crypt_stat *crypt_stat)
        }
 }
 
+/**
+ * ecryptfs_copy_mount_wide_flags_to_inode_flags
+ *
+ * This function propagates the mount-wide flags to individual inode
+ * flags.
+ */
+static void ecryptfs_copy_mount_wide_flags_to_inode_flags(
+       struct ecryptfs_crypt_stat *crypt_stat,
+       struct ecryptfs_mount_crypt_stat *mount_crypt_stat)
+{
+       if (mount_crypt_stat->flags & ECRYPTFS_XATTR_METADATA_ENABLED)
+               crypt_stat->flags |= ECRYPTFS_METADATA_IN_XATTR;
+       if (mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED)
+               crypt_stat->flags |= ECRYPTFS_VIEW_AS_ENCRYPTED;
+}
+
 /**
  * ecryptfs_set_default_crypt_stat_vals
  * @crypt_stat
@@ -924,10 +941,12 @@ static void ecryptfs_set_default_crypt_stat_vals(
        struct ecryptfs_crypt_stat *crypt_stat,
        struct ecryptfs_mount_crypt_stat *mount_crypt_stat)
 {
+       ecryptfs_copy_mount_wide_flags_to_inode_flags(crypt_stat,
+                                                     mount_crypt_stat);
        ecryptfs_set_default_sizes(crypt_stat);
        strcpy(crypt_stat->cipher, ECRYPTFS_DEFAULT_CIPHER);
        crypt_stat->key_size = ECRYPTFS_DEFAULT_KEY_BYTES;
-       ECRYPTFS_CLEAR_FLAG(crypt_stat->flags, ECRYPTFS_KEY_VALID);
+       crypt_stat->flags &= ~(ECRYPTFS_KEY_VALID);
        crypt_stat->file_version = ECRYPTFS_FILE_VERSION;
        crypt_stat->mount_crypt_stat = mount_crypt_stat;
 }
@@ -967,8 +986,10 @@ int ecryptfs_new_file_context(struct dentry *ecryptfs_dentry)
        if (mount_crypt_stat->global_auth_tok) {
                ecryptfs_printk(KERN_DEBUG, "Initializing context for new "
                                "file using mount_crypt_stat\n");
-               ECRYPTFS_SET_FLAG(crypt_stat->flags, ECRYPTFS_ENCRYPTED);
-               ECRYPTFS_SET_FLAG(crypt_stat->flags, ECRYPTFS_KEY_VALID);
+               crypt_stat->flags |= ECRYPTFS_ENCRYPTED;
+               crypt_stat->flags |= ECRYPTFS_KEY_VALID;
+               ecryptfs_copy_mount_wide_flags_to_inode_flags(crypt_stat,
+                                                             mount_crypt_stat);
                memcpy(crypt_stat->keysigs[crypt_stat->num_keysigs++],
                       mount_crypt_stat->global_auth_tok_sig,
                       ECRYPTFS_SIG_SIZE_HEX);
@@ -1001,7 +1022,7 @@ int ecryptfs_new_file_context(struct dentry *ecryptfs_dentry)
  *
  * Returns one if marker found; zero if not found
  */
-int contains_ecryptfs_marker(char *data)
+static int contains_ecryptfs_marker(char *data)
 {
        u32 m_1, m_2;
 
@@ -1027,7 +1048,8 @@ struct ecryptfs_flag_map_elem {
 /* Add support for additional flags by adding elements here. */
 static struct ecryptfs_flag_map_elem ecryptfs_flag_map[] = {
        {0x00000001, ECRYPTFS_ENABLE_HMAC},
-       {0x00000002, ECRYPTFS_ENCRYPTED}
+       {0x00000002, ECRYPTFS_ENCRYPTED},
+       {0x00000004, ECRYPTFS_METADATA_IN_XATTR}
 };
 
 /**
@@ -1050,11 +1072,9 @@ static int ecryptfs_process_flags(struct ecryptfs_crypt_stat *crypt_stat,
        for (i = 0; i < ((sizeof(ecryptfs_flag_map)
                          / sizeof(struct ecryptfs_flag_map_elem))); i++)
                if (flags & ecryptfs_flag_map[i].file_flag) {
-                       ECRYPTFS_SET_FLAG(crypt_stat->flags,
-                                         ecryptfs_flag_map[i].local_flag);
+                       crypt_stat->flags |= ecryptfs_flag_map[i].local_flag;
                } else
-                       ECRYPTFS_CLEAR_FLAG(crypt_stat->flags,
-                                           ecryptfs_flag_map[i].local_flag);
+                       crypt_stat->flags &= ~(ecryptfs_flag_map[i].local_flag);
        /* Version is in top 8 bits of the 32-bit flag vector */
        crypt_stat->file_version = ((flags >> 24) & 0xFF);
        (*bytes_read) = 4;
@@ -1091,8 +1111,7 @@ write_ecryptfs_flags(char *page_virt, struct ecryptfs_crypt_stat *crypt_stat,
 
        for (i = 0; i < ((sizeof(ecryptfs_flag_map)
                          / sizeof(struct ecryptfs_flag_map_elem))); i++)
-               if (ECRYPTFS_CHECK_FLAG(crypt_stat->flags,
-                                       ecryptfs_flag_map[i].local_flag))
+               if (crypt_stat->flags & ecryptfs_flag_map[i].local_flag)
                        flags |= ecryptfs_flag_map[i].file_flag;
        /* Version is in top 8 bits of the 32-bit flag vector */
        flags |= ((((u8)crypt_stat->file_version) << 24) & 0xFF000000);
@@ -1187,8 +1206,8 @@ int ecryptfs_cipher_code_to_string(char *str, u16 cipher_code)
  *
  * Returns zero on success; non-zero otherwise
  */
-int ecryptfs_read_header_region(char *data, struct dentry *dentry,
-                               struct vfsmount *mnt)
+static int ecryptfs_read_header_region(char *data, struct dentry *dentry,
+                                      struct vfsmount *mnt)
 {
        struct file *lower_file;
        mm_segment_t oldfs;
@@ -1217,9 +1236,25 @@ out:
        return rc;
 }
 
-static void
-write_header_metadata(char *virt, struct ecryptfs_crypt_stat *crypt_stat,
-                     size_t *written)
+int ecryptfs_read_and_validate_header_region(char *data, struct dentry *dentry,
+                                            struct vfsmount *mnt)
+{
+       int rc;
+
+       rc = ecryptfs_read_header_region(data, dentry, mnt);
+       if (rc)
+               goto out;
+       if (!contains_ecryptfs_marker(data + ECRYPTFS_FILE_SIZE_BYTES))
+               rc = -EINVAL;
+out:
+       return rc;
+}
+
+
+void
+ecryptfs_write_header_metadata(char *virt,
+                              struct ecryptfs_crypt_stat *crypt_stat,
+                              size_t *written)
 {
        u32 header_extent_size;
        u16 num_header_extents_at_front;
@@ -1268,9 +1303,9 @@ struct kmem_cache *ecryptfs_header_cache_2;
  *
  * Returns zero on success
  */
-int ecryptfs_write_headers_virt(char *page_virt,
-                               struct ecryptfs_crypt_stat *crypt_stat,
-                               struct dentry *ecryptfs_dentry)
+static int ecryptfs_write_headers_virt(char *page_virt, size_t *size,
+                                      struct ecryptfs_crypt_stat *crypt_stat,
+                                      struct dentry *ecryptfs_dentry)
 {
        int rc;
        size_t written;
@@ -1281,7 +1316,8 @@ int ecryptfs_write_headers_virt(char *page_virt,
        offset += written;
        write_ecryptfs_flags((page_virt + offset), crypt_stat, &written);
        offset += written;
-       write_header_metadata((page_virt + offset), crypt_stat, &written);
+       ecryptfs_write_header_metadata((page_virt + offset), crypt_stat,
+                                      &written);
        offset += written;
        rc = ecryptfs_generate_key_packet_set((page_virt + offset), crypt_stat,
                                              ecryptfs_dentry, &written,
@@ -1289,11 +1325,70 @@ int ecryptfs_write_headers_virt(char *page_virt,
        if (rc)
                ecryptfs_printk(KERN_WARNING, "Error generating key packet "
                                "set; rc = [%d]\n", rc);
+       if (size) {
+               offset += written;
+               *size = offset;
+       }
+       return rc;
+}
+
+static int ecryptfs_write_metadata_to_contents(struct ecryptfs_crypt_stat *crypt_stat,
+                                              struct file *lower_file,
+                                              char *page_virt)
+{
+       mm_segment_t oldfs;
+       int current_header_page;
+       int header_pages;
+       ssize_t size;
+       int rc = 0;
+
+       lower_file->f_pos = 0;
+       oldfs = get_fs();
+       set_fs(get_ds());
+       size = vfs_write(lower_file, (char __user *)page_virt, PAGE_CACHE_SIZE,
+                        &lower_file->f_pos);
+       if (size < 0) {
+               rc = (int)size;
+               printk(KERN_ERR "Error attempting to write lower page; "
+                      "rc = [%d]\n", rc);
+               set_fs(oldfs);
+               goto out;
+       }
+       header_pages = ((crypt_stat->header_extent_size
+                        * crypt_stat->num_header_extents_at_front)
+                       / PAGE_CACHE_SIZE);
+       memset(page_virt, 0, PAGE_CACHE_SIZE);
+       current_header_page = 1;
+       while (current_header_page < header_pages) {
+               size = vfs_write(lower_file, (char __user *)page_virt,
+                                PAGE_CACHE_SIZE, &lower_file->f_pos);
+               if (size < 0) {
+                       rc = (int)size;
+                       printk(KERN_ERR "Error attempting to write lower page; "
+                              "rc = [%d]\n", rc);
+                       set_fs(oldfs);
+                       goto out;
+               }
+               current_header_page++;
+       }
+       set_fs(oldfs);
+out:
+       return rc;
+}
+
+static int ecryptfs_write_metadata_to_xattr(struct dentry *ecryptfs_dentry,
+                                           struct ecryptfs_crypt_stat *crypt_stat,
+                                           char *page_virt, size_t size)
+{
+       int rc;
+
+       rc = ecryptfs_setxattr(ecryptfs_dentry, ECRYPTFS_XATTR_NAME, page_virt,
+                              size, 0);
        return rc;
 }
 
 /**
- * ecryptfs_write_headers
+ * ecryptfs_write_metadata
  * @lower_file: The lower file struct, which was returned from dentry_open
  *
  * Write the file headers out.  This will likely involve a userspace
@@ -1304,22 +1399,18 @@ int ecryptfs_write_headers_virt(char *page_virt,
  *
  * Returns zero on success; non-zero on error
  */
-int ecryptfs_write_headers(struct dentry *ecryptfs_dentry,
-                          struct file *lower_file)
+int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry,
+                           struct file *lower_file)
 {
-       mm_segment_t oldfs;
        struct ecryptfs_crypt_stat *crypt_stat;
        char *page_virt;
-       int current_header_page;
-       int header_pages;
+       size_t size;
        int rc = 0;
 
        crypt_stat = &ecryptfs_inode_to_private(
                ecryptfs_dentry->d_inode)->crypt_stat;
-       if (likely(ECRYPTFS_CHECK_FLAG(crypt_stat->flags,
-                                      ECRYPTFS_ENCRYPTED))) {
-               if (!ECRYPTFS_CHECK_FLAG(crypt_stat->flags,
-                                        ECRYPTFS_KEY_VALID)) {
+       if (likely(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) {
+               if (!(crypt_stat->flags & ECRYPTFS_KEY_VALID)) {
                        ecryptfs_printk(KERN_DEBUG, "Key is "
                                        "invalid; bailing out\n");
                        rc = -EINVAL;
@@ -1332,54 +1423,42 @@ int ecryptfs_write_headers(struct dentry *ecryptfs_dentry,
                goto out;
        }
        /* Released in this function */
-       page_virt = kmem_cache_alloc(ecryptfs_header_cache_0, GFP_USER);
+       page_virt = kmem_cache_zalloc(ecryptfs_header_cache_0, GFP_USER);
        if (!page_virt) {
                ecryptfs_printk(KERN_ERR, "Out of memory\n");
                rc = -ENOMEM;
                goto out;
        }
-       memset(page_virt, 0, PAGE_CACHE_SIZE);
-       rc = ecryptfs_write_headers_virt(page_virt, crypt_stat,
-                                        ecryptfs_dentry);
+       rc = ecryptfs_write_headers_virt(page_virt, &size, crypt_stat,
+                                        ecryptfs_dentry);
        if (unlikely(rc)) {
                ecryptfs_printk(KERN_ERR, "Error whilst writing headers\n");
                memset(page_virt, 0, PAGE_CACHE_SIZE);
                goto out_free;
        }
-       ecryptfs_printk(KERN_DEBUG,
-                       "Writing key packet set to underlying file\n");
-       lower_file->f_pos = 0;
-       oldfs = get_fs();
-       set_fs(get_ds());
-       ecryptfs_printk(KERN_DEBUG, "Calling lower_file->f_op->"
-                       "write() w/ header page; lower_file->f_pos = "
-                       "[0x%.16x]\n", lower_file->f_pos);
-       lower_file->f_op->write(lower_file, (char __user *)page_virt,
-                               PAGE_CACHE_SIZE, &lower_file->f_pos);
-       header_pages = ((crypt_stat->header_extent_size
-                        * crypt_stat->num_header_extents_at_front)
-                       / PAGE_CACHE_SIZE);
-       memset(page_virt, 0, PAGE_CACHE_SIZE);
-       current_header_page = 1;
-       while (current_header_page < header_pages) {
-               ecryptfs_printk(KERN_DEBUG, "Calling lower_file->f_op->"
-                               "write() w/ zero'd page; lower_file->f_pos = "
-                               "[0x%.16x]\n", lower_file->f_pos);
-               lower_file->f_op->write(lower_file, (char __user *)page_virt,
-                                       PAGE_CACHE_SIZE, &lower_file->f_pos);
-               current_header_page++;
+       if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR)
+               rc = ecryptfs_write_metadata_to_xattr(ecryptfs_dentry,
+                                                     crypt_stat, page_virt,
+                                                     size);
+       else
+               rc = ecryptfs_write_metadata_to_contents(crypt_stat, lower_file,
+                                                        page_virt);
+       if (rc) {
+               printk(KERN_ERR "Error writing metadata out to lower file; "
+                      "rc = [%d]\n", rc);
+               goto out_free;
        }
-       set_fs(oldfs);
-       ecryptfs_printk(KERN_DEBUG,
-                       "Done writing key packet set to underlying file.\n");
 out_free:
        kmem_cache_free(ecryptfs_header_cache_0, page_virt);
 out:
        return rc;
 }
 
+#define ECRYPTFS_DONT_VALIDATE_HEADER_SIZE 0
+#define ECRYPTFS_VALIDATE_HEADER_SIZE 1
 static int parse_header_metadata(struct ecryptfs_crypt_stat *crypt_stat,
-                                char *virt, int *bytes_read)
+                                char *virt, int *bytes_read,
+                                int validate_header_size)
 {
        int rc = 0;
        u32 header_extent_size;
@@ -1394,9 +1473,10 @@ static int parse_header_metadata(struct ecryptfs_crypt_stat *crypt_stat,
        crypt_stat->num_header_extents_at_front =
                (int)num_header_extents_at_front;
        (*bytes_read) = 6;
-       if ((crypt_stat->header_extent_size
-            * crypt_stat->num_header_extents_at_front)
-           < ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE) {
+       if ((validate_header_size == ECRYPTFS_VALIDATE_HEADER_SIZE)
+           && ((crypt_stat->header_extent_size
+                * crypt_stat->num_header_extents_at_front)
+               < ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE)) {
                rc = -EINVAL;
                ecryptfs_printk(KERN_WARNING, "Invalid header extent size: "
                                "[%d]\n", crypt_stat->header_extent_size);
@@ -1427,7 +1507,8 @@ static void set_default_header_data(struct ecryptfs_crypt_stat *crypt_stat)
  */
 static int ecryptfs_read_headers_virt(char *page_virt,
                                      struct ecryptfs_crypt_stat *crypt_stat,
-                                     struct dentry *ecryptfs_dentry)
+                                     struct dentry *ecryptfs_dentry,
+                                     int validate_header_size)
 {
        int rc = 0;
        int offset;
@@ -1461,7 +1542,7 @@ static int ecryptfs_read_headers_virt(char *page_virt,
        offset += bytes_read;
        if (crypt_stat->file_version >= 1) {
                rc = parse_header_metadata(crypt_stat, (page_virt + offset),
-                                          &bytes_read);
+                                          &bytes_read, validate_header_size);
                if (rc) {
                        ecryptfs_printk(KERN_WARNING, "Error reading header "
                                        "metadata; rc = [%d]\n", rc);
@@ -1476,12 +1557,60 @@ out:
 }
 
 /**
- * ecryptfs_read_headers
+ * ecryptfs_read_xattr_region
+ *
+ * Attempts to read the crypto metadata from the extended attribute
+ * region of the lower file.
+ */
+int ecryptfs_read_xattr_region(char *page_virt, struct dentry *ecryptfs_dentry)
+{
+       ssize_t size;
+       int rc = 0;
+
+       size = ecryptfs_getxattr(ecryptfs_dentry, ECRYPTFS_XATTR_NAME,
+                                page_virt, ECRYPTFS_DEFAULT_EXTENT_SIZE);
+       if (size < 0) {
+               printk(KERN_DEBUG "Error attempting to read the [%s] "
+                      "xattr from the lower file; return value = [%zd]\n",
+                      ECRYPTFS_XATTR_NAME, size);
+               rc = -EINVAL;
+               goto out;
+       }
+out:
+       return rc;
+}
+
+int ecryptfs_read_and_validate_xattr_region(char *page_virt,
+                                           struct dentry *ecryptfs_dentry)
+{
+       int rc;
+
+       rc = ecryptfs_read_xattr_region(page_virt, ecryptfs_dentry);
+       if (rc)
+               goto out;
+       if (!contains_ecryptfs_marker(page_virt + ECRYPTFS_FILE_SIZE_BYTES)) {
+               printk(KERN_WARNING "Valid data found in [%s] xattr, but "
+                       "the marker is invalid\n", ECRYPTFS_XATTR_NAME);
+               rc = -EINVAL;
+       }
+out:
+       return rc;
+}
+
+/**
+ * ecryptfs_read_metadata
+ *
+ * Common entry point for reading file metadata. From here, we could
+ * retrieve the header information from the header region of the file,
+ * the xattr region of the file, or some other repostory that is
+ * stored separately from the file itself. The current implementation
+ * supports retrieving the metadata information from the file contents
+ * and from the xattr region.
  *
  * Returns zero if valid headers found and parsed; non-zero otherwise
  */
-int ecryptfs_read_headers(struct dentry *ecryptfs_dentry,
-                         struct file *lower_file)
+int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry,
+                          struct file *lower_file)
 {
        int rc = 0;
        char *page_virt = NULL;
@@ -1489,7 +1618,12 @@ int ecryptfs_read_headers(struct dentry *ecryptfs_dentry,
        ssize_t bytes_read;
        struct ecryptfs_crypt_stat *crypt_stat =
            &ecryptfs_inode_to_private(ecryptfs_dentry->d_inode)->crypt_stat;
+       struct ecryptfs_mount_crypt_stat *mount_crypt_stat =
+               &ecryptfs_superblock_to_private(
+                       ecryptfs_dentry->d_sb)->mount_crypt_stat;
 
+       ecryptfs_copy_mount_wide_flags_to_inode_flags(crypt_stat,
+                                                     mount_crypt_stat);
        /* Read the first page from the underlying file */
        page_virt = kmem_cache_alloc(ecryptfs_header_cache_1, GFP_USER);
        if (!page_virt) {
@@ -1510,11 +1644,36 @@ int ecryptfs_read_headers(struct dentry *ecryptfs_dentry,
                goto out;
        }
        rc = ecryptfs_read_headers_virt(page_virt, crypt_stat,
-                                       ecryptfs_dentry);
+                                       ecryptfs_dentry,
+                                       ECRYPTFS_VALIDATE_HEADER_SIZE);
        if (rc) {
-               ecryptfs_printk(KERN_DEBUG, "Valid eCryptfs headers not "
-                               "found\n");
-               rc = -EINVAL;
+               rc = ecryptfs_read_xattr_region(page_virt,
+                                               ecryptfs_dentry);
+               if (rc) {
+                       printk(KERN_DEBUG "Valid eCryptfs headers not found in "
+                              "file header region or xattr region\n");
+                       rc = -EINVAL;
+                       goto out;
+               }
+               rc = ecryptfs_read_headers_virt(page_virt, crypt_stat,
+                                               ecryptfs_dentry,
+                                               ECRYPTFS_DONT_VALIDATE_HEADER_SIZE);
+               if (rc) {
+                       printk(KERN_DEBUG "Valid eCryptfs headers not found in "
+                              "file xattr region either\n");
+                       rc = -EINVAL;
+               }
+               if (crypt_stat->mount_crypt_stat->flags
+                   & ECRYPTFS_XATTR_METADATA_ENABLED) {
+                       crypt_stat->flags |= ECRYPTFS_METADATA_IN_XATTR;
+               } else {
+                       printk(KERN_WARNING "Attempt to access file with "
+                              "crypto metadata only in the extended attribute "
+                              "region, but eCryptfs was mounted without "
+                              "xattr support enabled. eCryptfs will not treat "
+                              "this like an encrypted file.\n");
+                       rc = -EINVAL;
+               }
        }
 out:
        if (page_virt) {
index 61f8e894284f36822f08d7036b871778b498ad9a..434c7efd80f814eea18662354d371fa9af0178ae 100644 (file)
@@ -36,7 +36,7 @@ void ecryptfs_dump_auth_tok(struct ecryptfs_auth_tok *auth_tok)
 
        ecryptfs_printk(KERN_DEBUG, "Auth tok at mem loc [%p]:\n",
                        auth_tok);
-       if (ECRYPTFS_CHECK_FLAG(auth_tok->flags, ECRYPTFS_PRIVATE_KEY)) {
+       if (auth_tok->flags & ECRYPTFS_PRIVATE_KEY) {
                ecryptfs_printk(KERN_DEBUG, " * private key type\n");
                ecryptfs_printk(KERN_DEBUG, " * (NO PRIVATE KEY SUPPORT "
                                "IN ECRYPTFS VERSION 0.1)\n");
@@ -46,8 +46,8 @@ void ecryptfs_dump_auth_tok(struct ecryptfs_auth_tok *auth_tok)
                                ECRYPTFS_SALT_SIZE);
                salt[ECRYPTFS_SALT_SIZE * 2] = '\0';
                ecryptfs_printk(KERN_DEBUG, " * salt = [%s]\n", salt);
-               if (ECRYPTFS_CHECK_FLAG(auth_tok->token.password.flags,
-                                       ECRYPTFS_PERSISTENT_PASSWORD)) {
+               if (auth_tok->token.password.flags &
+                   ECRYPTFS_PERSISTENT_PASSWORD) {
                        ecryptfs_printk(KERN_DEBUG, " * persistent\n");
                }
                memcpy(sig, auth_tok->token.password.signature,
index 0f897109759baa627ed07c087658e0185672de29..403e3bad1455ae95a079a919306ecfe13cf73793 100644 (file)
@@ -4,8 +4,10 @@
  *
  * Copyright (C) 1997-2003 Erez Zadok
  * Copyright (C) 2001-2003 Stony Brook University
- * Copyright (C) 2004-2006 International Business Machines Corp.
+ * Copyright (C) 2004-2007 International Business Machines Corp.
  *   Author(s): Michael A. Halcrow <mahalcro@us.ibm.com>
+ *              Trevor S. Highland <trevor.highland@gmail.com>
+ *              Tyler Hicks <tyhicks@ou.edu>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
 #include <linux/fs_stack.h>
 #include <linux/namei.h>
 #include <linux/scatterlist.h>
+#include <linux/hash.h>
 
 /* Version verification for shared data structures w/ userspace */
 #define ECRYPTFS_VERSION_MAJOR 0x00
 #define ECRYPTFS_VERSION_MINOR 0x04
-#define ECRYPTFS_SUPPORTED_FILE_VERSION 0x01
+#define ECRYPTFS_SUPPORTED_FILE_VERSION 0x02
 /* These flags indicate which features are supported by the kernel
  * module; userspace tools such as the mount helper read
  * ECRYPTFS_VERSIONING_MASK from a sysfs handle in order to determine
  * how to behave. */
-#define ECRYPTFS_VERSIONING_PASSPHRASE 0x00000001
-#define ECRYPTFS_VERSIONING_PUBKEY 0x00000002
+#define ECRYPTFS_VERSIONING_PASSPHRASE            0x00000001
+#define ECRYPTFS_VERSIONING_PUBKEY                0x00000002
 #define ECRYPTFS_VERSIONING_PLAINTEXT_PASSTHROUGH 0x00000004
-#define ECRYPTFS_VERSIONING_POLICY 0x00000008
+#define ECRYPTFS_VERSIONING_POLICY                0x00000008
+#define ECRYPTFS_VERSIONING_XATTR                 0x00000010
 #define ECRYPTFS_VERSIONING_MASK (ECRYPTFS_VERSIONING_PASSPHRASE \
-                                  | ECRYPTFS_VERSIONING_PLAINTEXT_PASSTHROUGH)
-
+                                 | ECRYPTFS_VERSIONING_PLAINTEXT_PASSTHROUGH \
+                                 | ECRYPTFS_VERSIONING_PUBKEY \
+                                 | ECRYPTFS_VERSIONING_XATTR)
 #define ECRYPTFS_MAX_PASSWORD_LENGTH 64
 #define ECRYPTFS_MAX_PASSPHRASE_BYTES ECRYPTFS_MAX_PASSWORD_LENGTH
 #define ECRYPTFS_SALT_SIZE 8
 #define ECRYPTFS_MAX_KEY_BYTES 64
 #define ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES 512
 #define ECRYPTFS_DEFAULT_IV_BYTES 16
-#define ECRYPTFS_FILE_VERSION 0x01
+#define ECRYPTFS_FILE_VERSION 0x02
 #define ECRYPTFS_DEFAULT_HEADER_EXTENT_SIZE 8192
 #define ECRYPTFS_DEFAULT_EXTENT_SIZE 4096
 #define ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE 8192
+#define ECRYPTFS_DEFAULT_MSG_CTX_ELEMS 32
+#define ECRYPTFS_DEFAULT_SEND_TIMEOUT HZ
+#define ECRYPTFS_MAX_MSG_CTX_TTL (HZ*3)
+#define ECRYPTFS_NLMSG_HELO 100
+#define ECRYPTFS_NLMSG_QUIT 101
+#define ECRYPTFS_NLMSG_REQUEST 102
+#define ECRYPTFS_NLMSG_RESPONSE 103
+#define ECRYPTFS_MAX_PKI_NAME_BYTES 16
+#define ECRYPTFS_DEFAULT_NUM_USERS 4
+#define ECRYPTFS_MAX_NUM_USERS 32768
+#define ECRYPTFS_TRANSPORT_NETLINK 0
+#define ECRYPTFS_TRANSPORT_CONNECTOR 1
+#define ECRYPTFS_TRANSPORT_RELAYFS 2
+#define ECRYPTFS_DEFAULT_TRANSPORT ECRYPTFS_TRANSPORT_NETLINK
+#define ECRYPTFS_XATTR_NAME "user.ecryptfs"
 
 #define RFC2440_CIPHER_DES3_EDE 0x02
 #define RFC2440_CIPHER_CAST_5 0x03
@@ -74,9 +94,7 @@
 #define RFC2440_CIPHER_TWOFISH 0x0a
 #define RFC2440_CIPHER_CAST_6 0x0b
 
-#define ECRYPTFS_SET_FLAG(flag_bit_vector, flag) (flag_bit_vector |= (flag))
-#define ECRYPTFS_CLEAR_FLAG(flag_bit_vector, flag) (flag_bit_vector &= ~(flag))
-#define ECRYPTFS_CHECK_FLAG(flag_bit_vector, flag) (flag_bit_vector & (flag))
+#define RFC2440_CIPHER_RSA 0x01
 
 /**
  * For convenience, we may need to pass around the encrypted session
@@ -114,6 +132,14 @@ struct ecryptfs_password {
 
 enum ecryptfs_token_types {ECRYPTFS_PASSWORD, ECRYPTFS_PRIVATE_KEY};
 
+struct ecryptfs_private_key {
+       u32 key_size;
+       u32 data_len;
+       u8 signature[ECRYPTFS_PASSWORD_SIG_SIZE + 1];
+       char pki_type[ECRYPTFS_MAX_PKI_NAME_BYTES + 1];
+       u8 data[];
+};
+
 /* May be a password or a private key */
 struct ecryptfs_auth_tok {
        u16 version; /* 8-bit major and 8-bit minor */
@@ -123,7 +149,7 @@ struct ecryptfs_auth_tok {
        u8 reserved[32];
        union {
                struct ecryptfs_password password;
-               /* Private key is in future eCryptfs releases */
+               struct ecryptfs_private_key private_key;
        } token;
 } __attribute__ ((packed));
 
@@ -177,8 +203,13 @@ ecryptfs_get_key_payload_data(struct key *key)
 #define ECRYPTFS_DEFAULT_CIPHER "aes"
 #define ECRYPTFS_DEFAULT_KEY_BYTES 16
 #define ECRYPTFS_DEFAULT_HASH "md5"
+#define ECRYPTFS_TAG_1_PACKET_TYPE 0x01
 #define ECRYPTFS_TAG_3_PACKET_TYPE 0x8C
 #define ECRYPTFS_TAG_11_PACKET_TYPE 0xED
+#define ECRYPTFS_TAG_64_PACKET_TYPE 0x40
+#define ECRYPTFS_TAG_65_PACKET_TYPE 0x41
+#define ECRYPTFS_TAG_66_PACKET_TYPE 0x42
+#define ECRYPTFS_TAG_67_PACKET_TYPE 0x43
 #define MD5_DIGEST_SIZE 16
 
 /**
@@ -195,6 +226,8 @@ struct ecryptfs_crypt_stat {
 #define ECRYPTFS_ENABLE_HMAC        0x00000020
 #define ECRYPTFS_ENCRYPT_IV_PAGES   0x00000040
 #define ECRYPTFS_KEY_VALID          0x00000080
+#define ECRYPTFS_METADATA_IN_XATTR  0x00000100
+#define ECRYPTFS_VIEW_AS_ENCRYPTED  0x00000200
        u32 flags;
        unsigned int file_version;
        size_t iv_bytes;
@@ -241,6 +274,8 @@ struct ecryptfs_dentry_info {
 struct ecryptfs_mount_crypt_stat {
        /* Pointers to memory we do not own, do not free these */
 #define ECRYPTFS_PLAINTEXT_PASSTHROUGH_ENABLED 0x00000001
+#define ECRYPTFS_XATTR_METADATA_ENABLED        0x00000002
+#define ECRYPTFS_ENCRYPTED_VIEW_ENABLED        0x00000004
        u32 flags;
        struct ecryptfs_auth_tok *global_auth_tok;
        struct key *global_auth_tok_key;
@@ -271,6 +306,33 @@ struct ecryptfs_auth_tok_list_item {
        struct ecryptfs_auth_tok auth_tok;
 };
 
+struct ecryptfs_message {
+       u32 index;
+       u32 data_len;
+       u8 data[];
+};
+
+struct ecryptfs_msg_ctx {
+#define ECRYPTFS_MSG_CTX_STATE_FREE      0x0001
+#define ECRYPTFS_MSG_CTX_STATE_PENDING   0x0002
+#define ECRYPTFS_MSG_CTX_STATE_DONE      0x0003
+       u32 state;
+       unsigned int index;
+       unsigned int counter;
+       struct ecryptfs_message *msg;
+       struct task_struct *task;
+       struct list_head node;
+       struct mutex mux;
+};
+
+extern unsigned int ecryptfs_transport;
+
+struct ecryptfs_daemon_id {
+       pid_t pid;
+       uid_t uid;
+       struct hlist_node id_chain;
+};
+
 static inline struct ecryptfs_file_info *
 ecryptfs_file_to_private(struct file *file)
 {
@@ -384,13 +446,16 @@ void __ecryptfs_printk(const char *fmt, ...);
 
 extern const struct file_operations ecryptfs_main_fops;
 extern const struct file_operations ecryptfs_dir_fops;
-extern struct inode_operations ecryptfs_main_iops;
-extern struct inode_operations ecryptfs_dir_iops;
-extern struct inode_operations ecryptfs_symlink_iops;
-extern struct super_operations ecryptfs_sops;
+extern const struct inode_operations ecryptfs_main_iops;
+extern const struct inode_operations ecryptfs_dir_iops;
+extern const struct inode_operations ecryptfs_symlink_iops;
+extern const struct super_operations ecryptfs_sops;
 extern struct dentry_operations ecryptfs_dops;
 extern struct address_space_operations ecryptfs_aops;
 extern int ecryptfs_verbosity;
+extern unsigned int ecryptfs_message_buf_len;
+extern signed long ecryptfs_message_wait_timeout;
+extern unsigned int ecryptfs_number_of_users;
 
 extern struct kmem_cache *ecryptfs_auth_tok_list_item_cache;
 extern struct kmem_cache *ecryptfs_file_info_cache;
@@ -400,7 +465,9 @@ extern struct kmem_cache *ecryptfs_sb_info_cache;
 extern struct kmem_cache *ecryptfs_header_cache_0;
 extern struct kmem_cache *ecryptfs_header_cache_1;
 extern struct kmem_cache *ecryptfs_header_cache_2;
+extern struct kmem_cache *ecryptfs_xattr_cache;
 extern struct kmem_cache *ecryptfs_lower_page_cache;
+extern struct kmem_cache *ecryptfs_key_record_cache;
 
 int ecryptfs_interpose(struct dentry *hidden_dentry,
                       struct dentry *this_dentry, struct super_block *sb,
@@ -426,9 +493,13 @@ int ecryptfs_init_crypt_ctx(struct ecryptfs_crypt_stat *crypt_stat);
 int ecryptfs_crypto_api_algify_cipher_name(char **algified_name,
                                           char *cipher_name,
                                           char *chaining_modifier);
-int ecryptfs_write_inode_size_to_header(struct file *lower_file,
-                                       struct inode *lower_inode,
-                                       struct inode *inode);
+#define ECRYPTFS_LOWER_I_MUTEX_NOT_HELD 0
+#define ECRYPTFS_LOWER_I_MUTEX_HELD 1
+int ecryptfs_write_inode_size_to_metadata(struct file *lower_file,
+                                         struct inode *lower_inode,
+                                         struct inode *inode,
+                                         struct dentry *ecryptfs_dentry,
+                                         int lower_i_mutex_held);
 int ecryptfs_get_lower_page(struct page **lower_page, struct inode *lower_inode,
                            struct file *lower_file,
                            unsigned long lower_page_index, int byte_offset,
@@ -441,26 +512,20 @@ int ecryptfs_copy_page_to_lower(struct page *page, struct inode *lower_inode,
                                struct file *lower_file);
 int ecryptfs_do_readpage(struct file *file, struct page *page,
                         pgoff_t lower_page_index);
-int ecryptfs_grab_and_map_lower_page(struct page **lower_page,
-                                    char **lower_virt,
-                                    struct inode *lower_inode,
-                                    unsigned long lower_page_index);
 int ecryptfs_writepage_and_release_lower_page(struct page *lower_page,
                                              struct inode *lower_inode,
                                              struct writeback_control *wbc);
 int ecryptfs_encrypt_page(struct ecryptfs_page_crypt_context *ctx);
 int ecryptfs_decrypt_page(struct file *file, struct page *page);
-int ecryptfs_write_headers(struct dentry *ecryptfs_dentry,
+int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry,
+                           struct file *lower_file);
+int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry,
                           struct file *lower_file);
-int ecryptfs_write_headers_virt(char *page_virt,
-                               struct ecryptfs_crypt_stat *crypt_stat,
-                               struct dentry *ecryptfs_dentry);
-int ecryptfs_read_headers(struct dentry *ecryptfs_dentry,
-                         struct file *lower_file);
 int ecryptfs_new_file_context(struct dentry *ecryptfs_dentry);
-int contains_ecryptfs_marker(char *data);
-int ecryptfs_read_header_region(char *data, struct dentry *dentry,
-                               struct vfsmount *mnt);
+int ecryptfs_read_and_validate_header_region(char *data, struct dentry *dentry,
+                                            struct vfsmount *mnt);
+int ecryptfs_read_and_validate_xattr_region(char *page_virt,
+                                           struct dentry *ecryptfs_dentry);
 u16 ecryptfs_code_for_cipher_string(struct ecryptfs_crypt_stat *crypt_stat);
 int ecryptfs_cipher_code_to_string(char *str, u16 cipher_code);
 void ecryptfs_set_default_sizes(struct ecryptfs_crypt_stat *crypt_stat);
@@ -483,5 +548,37 @@ int ecryptfs_open_lower_file(struct file **lower_file,
                             struct dentry *lower_dentry,
                             struct vfsmount *lower_mnt, int flags);
 int ecryptfs_close_lower_file(struct file *lower_file);
+ssize_t ecryptfs_getxattr(struct dentry *dentry, const char *name, void *value,
+                         size_t size);
+int
+ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value,
+                 size_t size, int flags);
+int ecryptfs_read_xattr_region(char *page_virt, struct dentry *ecryptfs_dentry);
+int ecryptfs_process_helo(unsigned int transport, uid_t uid, pid_t pid);
+int ecryptfs_process_quit(uid_t uid, pid_t pid);
+int ecryptfs_process_response(struct ecryptfs_message *msg, uid_t uid,
+                             pid_t pid, u32 seq);
+int ecryptfs_send_message(unsigned int transport, char *data, int data_len,
+                         struct ecryptfs_msg_ctx **msg_ctx);
+int ecryptfs_wait_for_response(struct ecryptfs_msg_ctx *msg_ctx,
+                              struct ecryptfs_message **emsg);
+int ecryptfs_init_messaging(unsigned int transport);
+void ecryptfs_release_messaging(unsigned int transport);
+
+int ecryptfs_send_netlink(char *data, int data_len,
+                         struct ecryptfs_msg_ctx *msg_ctx, u16 msg_type,
+                         u16 msg_flags, pid_t daemon_pid);
+int ecryptfs_init_netlink(void);
+void ecryptfs_release_netlink(void);
+
+int ecryptfs_send_connector(char *data, int data_len,
+                           struct ecryptfs_msg_ctx *msg_ctx, u16 msg_type,
+                           u16 msg_flags, pid_t daemon_pid);
+int ecryptfs_init_connector(void);
+void ecryptfs_release_connector(void);
+void
+ecryptfs_write_header_metadata(char *virt,
+                              struct ecryptfs_crypt_stat *crypt_stat,
+                              size_t *written);
 
 #endif /* #ifndef ECRYPTFS_KERNEL_H */
index c5a2e5298f155c0744f653ba8bbc6018f03179ed..bd969adf70d72bd8cc5335e3f8a47e06c220be52 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 1997-2004 Erez Zadok
  * Copyright (C) 2001-2004 Stony Brook University
- * Copyright (C) 2004-2006 International Business Machines Corp.
+ * Copyright (C) 2004-2007 International Business Machines Corp.
  *   Author(s): Michael A. Halcrow <mhalcrow@us.ibm.com>
  *             Michael C. Thompson <mcthomps@us.ibm.com>
  *
@@ -250,8 +250,19 @@ static int ecryptfs_open(struct inode *inode, struct file *file)
        struct ecryptfs_file_info *file_info;
        int lower_flags;
 
+       mount_crypt_stat = &ecryptfs_superblock_to_private(
+               ecryptfs_dentry->d_sb)->mount_crypt_stat;
+       if ((mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED)
+           && ((file->f_flags & O_WRONLY) || (file->f_flags & O_RDWR)
+               || (file->f_flags & O_CREAT) || (file->f_flags & O_TRUNC)
+               || (file->f_flags & O_APPEND))) {
+               printk(KERN_WARNING "Mount has encrypted view enabled; "
+                      "files may only be read\n");
+               rc = -EPERM;
+               goto out;
+       }
        /* Released in ecryptfs_release or end of function if failure */
-       file_info = kmem_cache_alloc(ecryptfs_file_info_cache, GFP_KERNEL);
+       file_info = kmem_cache_zalloc(ecryptfs_file_info_cache, GFP_KERNEL);
        ecryptfs_set_file_private(file, file_info);
        if (!file_info) {
                ecryptfs_printk(KERN_ERR,
@@ -259,17 +270,14 @@ static int ecryptfs_open(struct inode *inode, struct file *file)
                rc = -ENOMEM;
                goto out;
        }
-       memset(file_info, 0, sizeof(*file_info));
        lower_dentry = ecryptfs_dentry_to_lower(ecryptfs_dentry);
        crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;
-       mount_crypt_stat = &ecryptfs_superblock_to_private(
-               ecryptfs_dentry->d_sb)->mount_crypt_stat;
        mutex_lock(&crypt_stat->cs_mutex);
-       if (!ECRYPTFS_CHECK_FLAG(crypt_stat->flags, ECRYPTFS_POLICY_APPLIED)) {
+       if (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED)) {
                ecryptfs_printk(KERN_DEBUG, "Setting flags for stat...\n");
                /* Policy code enabled in future release */
-               ECRYPTFS_SET_FLAG(crypt_stat->flags, ECRYPTFS_POLICY_APPLIED);
-               ECRYPTFS_SET_FLAG(crypt_stat->flags, ECRYPTFS_ENCRYPTED);
+               crypt_stat->flags |= ECRYPTFS_POLICY_APPLIED;
+               crypt_stat->flags |= ECRYPTFS_ENCRYPTED;
        }
        mutex_unlock(&crypt_stat->cs_mutex);
        lower_flags = file->f_flags;
@@ -289,31 +297,14 @@ static int ecryptfs_open(struct inode *inode, struct file *file)
        lower_inode = lower_dentry->d_inode;
        if (S_ISDIR(ecryptfs_dentry->d_inode->i_mode)) {
                ecryptfs_printk(KERN_DEBUG, "This is a directory\n");
-               ECRYPTFS_CLEAR_FLAG(crypt_stat->flags, ECRYPTFS_ENCRYPTED);
+               crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED);
                rc = 0;
                goto out;
        }
        mutex_lock(&crypt_stat->cs_mutex);
-       if (i_size_read(lower_inode) < ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE) {
-               if (!(mount_crypt_stat->flags
-                     & ECRYPTFS_PLAINTEXT_PASSTHROUGH_ENABLED)) {
-                       rc = -EIO;
-                       printk(KERN_WARNING "Attempt to read file that is "
-                              "not in a valid eCryptfs format, and plaintext "
-                              "passthrough mode is not enabled; returning "
-                              "-EIO\n");
-                       mutex_unlock(&crypt_stat->cs_mutex);
-                       goto out_puts;
-               }
-               crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED);
-               rc = 0;
-               mutex_unlock(&crypt_stat->cs_mutex);
-               goto out;
-       } else if (!ECRYPTFS_CHECK_FLAG(crypt_stat->flags,
-                                       ECRYPTFS_POLICY_APPLIED)
-                  || !ECRYPTFS_CHECK_FLAG(crypt_stat->flags,
-                                          ECRYPTFS_KEY_VALID)) {
-               rc = ecryptfs_read_headers(ecryptfs_dentry, lower_file);
+       if (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED)
+           || !(crypt_stat->flags & ECRYPTFS_KEY_VALID)) {
+               rc = ecryptfs_read_metadata(ecryptfs_dentry, lower_file);
                if (rc) {
                        ecryptfs_printk(KERN_DEBUG,
                                        "Valid headers not found\n");
@@ -327,9 +318,8 @@ static int ecryptfs_open(struct inode *inode, struct file *file)
                                mutex_unlock(&crypt_stat->cs_mutex);
                                goto out_puts;
                        }
-                       ECRYPTFS_CLEAR_FLAG(crypt_stat->flags,
-                                           ECRYPTFS_ENCRYPTED);
                        rc = 0;
+                       crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED);
                        mutex_unlock(&crypt_stat->cs_mutex);
                        goto out;
                }
index 11f5e5076aefdfc28ab40359b0fee3cca291e871..9fa7e0b27a96ee57ae08187e17b6872b79d39fd4 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 1997-2004 Erez Zadok
  * Copyright (C) 2001-2004 Stony Brook University
- * Copyright (C) 2004-2006 International Business Machines Corp.
+ * Copyright (C) 2004-2007 International Business Machines Corp.
  *   Author(s): Michael A. Halcrow <mahalcro@us.ibm.com>
  *              Michael C. Thompsion <mcthomps@us.ibm.com>
  *
@@ -161,17 +161,17 @@ static int grow_file(struct dentry *ecryptfs_dentry, struct file *lower_file,
        ecryptfs_set_file_lower(&fake_file, lower_file);
        rc = ecryptfs_fill_zeros(&fake_file, 1);
        if (rc) {
-               ECRYPTFS_SET_FLAG(
-                       ecryptfs_inode_to_private(inode)->crypt_stat.flags,
-                       ECRYPTFS_SECURITY_WARNING);
+               ecryptfs_inode_to_private(inode)->crypt_stat.flags |=
+                       ECRYPTFS_SECURITY_WARNING;
                ecryptfs_printk(KERN_WARNING, "Error attempting to fill zeros "
                                "in file; rc = [%d]\n", rc);
                goto out;
        }
        i_size_write(inode, 0);
-       ecryptfs_write_inode_size_to_header(lower_file, lower_inode, inode);
-       ECRYPTFS_SET_FLAG(ecryptfs_inode_to_private(inode)->crypt_stat.flags,
-                         ECRYPTFS_NEW_FILE);
+       ecryptfs_write_inode_size_to_metadata(lower_file, lower_inode, inode,
+                                             ecryptfs_dentry,
+                                             ECRYPTFS_LOWER_I_MUTEX_NOT_HELD);
+       ecryptfs_inode_to_private(inode)->crypt_stat.flags |= ECRYPTFS_NEW_FILE;
 out:
        return rc;
 }
@@ -199,7 +199,7 @@ static int ecryptfs_initialize_file(struct dentry *ecryptfs_dentry)
                        lower_dentry->d_name.name);
        inode = ecryptfs_dentry->d_inode;
        crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;
-       lower_flags = ((O_CREAT | O_WRONLY | O_TRUNC) & O_ACCMODE) | O_RDWR;
+       lower_flags = ((O_CREAT | O_TRUNC) & O_ACCMODE) | O_RDWR;
 #if BITS_PER_LONG != 32
        lower_flags |= O_LARGEFILE;
 #endif
@@ -214,10 +214,10 @@ static int ecryptfs_initialize_file(struct dentry *ecryptfs_dentry)
        lower_inode = lower_dentry->d_inode;
        if (S_ISDIR(ecryptfs_dentry->d_inode->i_mode)) {
                ecryptfs_printk(KERN_DEBUG, "This is a directory\n");
-               ECRYPTFS_CLEAR_FLAG(crypt_stat->flags, ECRYPTFS_ENCRYPTED);
+               crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED);
                goto out_fput;
        }
-       ECRYPTFS_SET_FLAG(crypt_stat->flags, ECRYPTFS_NEW_FILE);
+       crypt_stat->flags |= ECRYPTFS_NEW_FILE;
        ecryptfs_printk(KERN_DEBUG, "Initializing crypto context\n");
        rc = ecryptfs_new_file_context(ecryptfs_dentry);
        if (rc) {
@@ -225,7 +225,7 @@ static int ecryptfs_initialize_file(struct dentry *ecryptfs_dentry)
                                "context\n");
                goto out_fput;
        }
-       rc = ecryptfs_write_headers(ecryptfs_dentry, lower_file);
+       rc = ecryptfs_write_metadata(ecryptfs_dentry, lower_file);
        if (rc) {
                ecryptfs_printk(KERN_DEBUG, "Error writing headers\n");
                goto out_fput;
@@ -287,6 +287,7 @@ static struct dentry *ecryptfs_lookup(struct inode *dir, struct dentry *dentry,
        char *encoded_name;
        unsigned int encoded_namelen;
        struct ecryptfs_crypt_stat *crypt_stat = NULL;
+       struct ecryptfs_mount_crypt_stat *mount_crypt_stat;
        char *page_virt = NULL;
        struct inode *lower_inode;
        u64 file_size;
@@ -361,34 +362,44 @@ static struct dentry *ecryptfs_lookup(struct inode *dir, struct dentry *dentry,
                goto out;
        }
        /* Released in this function */
-       page_virt =
-           (char *)kmem_cache_alloc(ecryptfs_header_cache_2,
-                                    GFP_USER);
+       page_virt = kmem_cache_zalloc(ecryptfs_header_cache_2,
+                                     GFP_USER);
        if (!page_virt) {
                rc = -ENOMEM;
                ecryptfs_printk(KERN_ERR,
                                "Cannot ecryptfs_kmalloc a page\n");
                goto out_dput;
        }
-       memset(page_virt, 0, PAGE_CACHE_SIZE);
-       rc = ecryptfs_read_header_region(page_virt, lower_dentry, nd->mnt);
        crypt_stat = &ecryptfs_inode_to_private(dentry->d_inode)->crypt_stat;
-       if (!ECRYPTFS_CHECK_FLAG(crypt_stat->flags, ECRYPTFS_POLICY_APPLIED))
+       if (!(crypt_stat->flags & ECRYPTFS_POLICY_APPLIED))
                ecryptfs_set_default_sizes(crypt_stat);
+       rc = ecryptfs_read_and_validate_header_region(page_virt, lower_dentry,
+                                                     nd->mnt);
        if (rc) {
-               rc = 0;
-               ecryptfs_printk(KERN_WARNING, "Error reading header region;"
-                               " assuming unencrypted\n");
-       } else {
-               if (!contains_ecryptfs_marker(page_virt
-                                             + ECRYPTFS_FILE_SIZE_BYTES)) {
+               rc = ecryptfs_read_and_validate_xattr_region(page_virt, dentry);
+               if (rc) {
+                       printk(KERN_DEBUG "Valid metadata not found in header "
+                              "region or xattr region; treating file as "
+                              "unencrypted\n");
+                       rc = 0;
                        kmem_cache_free(ecryptfs_header_cache_2, page_virt);
                        goto out;
                }
+               crypt_stat->flags |= ECRYPTFS_METADATA_IN_XATTR;
+       }
+       mount_crypt_stat = &ecryptfs_superblock_to_private(
+               dentry->d_sb)->mount_crypt_stat;
+       if (mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED) {
+               if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR)
+                       file_size = (crypt_stat->header_extent_size
+                                    + i_size_read(lower_dentry->d_inode));
+               else
+                       file_size = i_size_read(lower_dentry->d_inode);
+       } else {
                memcpy(&file_size, page_virt, sizeof(file_size));
                file_size = be64_to_cpu(file_size);
-               i_size_write(dentry->d_inode, (loff_t)file_size);
        }
+       i_size_write(dentry->d_inode, (loff_t)file_size);
        kmem_cache_free(ecryptfs_header_cache_2, page_virt);
        goto out;
 
@@ -782,20 +793,26 @@ int ecryptfs_truncate(struct dentry *dentry, loff_t new_length)
                        goto out_fput;
                }
                i_size_write(inode, new_length);
-               rc = ecryptfs_write_inode_size_to_header(lower_file,
-                                                        lower_dentry->d_inode,
-                                                        inode);
+               rc = ecryptfs_write_inode_size_to_metadata(
+                       lower_file, lower_dentry->d_inode, inode, dentry,
+                       ECRYPTFS_LOWER_I_MUTEX_NOT_HELD);
                if (rc) {
-                       ecryptfs_printk(KERN_ERR,
-                                       "Problem with ecryptfs_write"
-                                       "_inode_size\n");
+                       printk(KERN_ERR "Problem with "
+                              "ecryptfs_write_inode_size_to_metadata; "
+                              "rc = [%d]\n", rc);
                        goto out_fput;
                }
        } else { /* new_length < i_size_read(inode) */
                vmtruncate(inode, new_length);
-               ecryptfs_write_inode_size_to_header(lower_file,
-                                                   lower_dentry->d_inode,
-                                                   inode);
+               rc = ecryptfs_write_inode_size_to_metadata(
+                       lower_file, lower_dentry->d_inode, inode, dentry,
+                       ECRYPTFS_LOWER_I_MUTEX_NOT_HELD);
+               if (rc) {
+                       printk(KERN_ERR "Problem with "
+                              "ecryptfs_write_inode_size_to_metadata; "
+                              "rc = [%d]\n", rc);
+                       goto out_fput;
+               }
                /* We are reducing the size of the ecryptfs file, and need to
                 * know if we need to reduce the size of the lower file. */
                lower_size_before_truncate =
@@ -882,7 +899,7 @@ out:
        return rc;
 }
 
-static int
+int
 ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value,
                  size_t size, int flags)
 {
@@ -902,7 +919,7 @@ out:
        return rc;
 }
 
-static ssize_t
+ssize_t
 ecryptfs_getxattr(struct dentry *dentry, const char *name, void *value,
                  size_t size)
 {
@@ -972,7 +989,7 @@ int ecryptfs_inode_set(struct inode *inode, void *lower_inode)
        return 0;
 }
 
-struct inode_operations ecryptfs_symlink_iops = {
+const struct inode_operations ecryptfs_symlink_iops = {
        .readlink = ecryptfs_readlink,
        .follow_link = ecryptfs_follow_link,
        .put_link = ecryptfs_put_link,
@@ -984,7 +1001,7 @@ struct inode_operations ecryptfs_symlink_iops = {
        .removexattr = ecryptfs_removexattr
 };
 
-struct inode_operations ecryptfs_dir_iops = {
+const struct inode_operations ecryptfs_dir_iops = {
        .create = ecryptfs_create,
        .lookup = ecryptfs_lookup,
        .link = ecryptfs_link,
@@ -1002,7 +1019,7 @@ struct inode_operations ecryptfs_dir_iops = {
        .removexattr = ecryptfs_removexattr
 };
 
-struct inode_operations ecryptfs_main_iops = {
+const struct inode_operations ecryptfs_main_iops = {
        .permission = ecryptfs_permission,
        .setattr = ecryptfs_setattr,
        .setxattr = ecryptfs_setxattr,
index 745c0f1bfbbdcbd1a2bd4ff2db8848bc572df1fe..b550dea8eee6bf8828e6383633c37685e4c3b950 100644 (file)
@@ -7,6 +7,7 @@
  * Copyright (C) 2004-2006 International Business Machines Corp.
  *   Author(s): Michael A. Halcrow <mhalcrow@us.ibm.com>
  *              Michael C. Thompson <mcthomps@us.ibm.com>
+ *              Trevor S. Highland <trevor.highland@gmail.com>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -25,7 +26,6 @@
  */
 
 #include <linux/string.h>
-#include <linux/sched.h>
 #include <linux/syscalls.h>
 #include <linux/pagemap.h>
 #include <linux/key.h>
@@ -64,26 +64,6 @@ int process_request_key_err(long err_code)
        return rc;
 }
 
-static void wipe_auth_tok_list(struct list_head *auth_tok_list_head)
-{
-       struct list_head *walker;
-       struct ecryptfs_auth_tok_list_item *auth_tok_list_item;
-
-       walker = auth_tok_list_head->next;
-       while (walker != auth_tok_list_head) {
-               auth_tok_list_item =
-                   list_entry(walker, struct ecryptfs_auth_tok_list_item,
-                              list);
-               walker = auth_tok_list_item->list.next;
-               memset(auth_tok_list_item, 0,
-                      sizeof(struct ecryptfs_auth_tok_list_item));
-               kmem_cache_free(ecryptfs_auth_tok_list_item_cache,
-                               auth_tok_list_item);
-       }
-}
-
-struct kmem_cache *ecryptfs_auth_tok_list_item_cache;
-
 /**
  * parse_packet_length
  * @data: Pointer to memory containing length at offset
@@ -102,12 +82,12 @@ static int parse_packet_length(unsigned char *data, size_t *size,
        (*size) = 0;
        if (data[0] < 192) {
                /* One-byte length */
-               (*size) = data[0];
+               (*size) = (unsigned char)data[0];
                (*length_size) = 1;
        } else if (data[0] < 224) {
                /* Two-byte length */
-               (*size) = ((data[0] - 192) * 256);
-               (*size) += (data[1] + 192);
+               (*size) = (((unsigned char)(data[0]) - 192) * 256);
+               (*size) += ((unsigned char)(data[1]) + 192);
                (*length_size) = 2;
        } else if (data[0] == 255) {
                /* Five-byte length; we're not supposed to see this */
@@ -154,6 +134,499 @@ static int write_packet_length(char *dest, size_t size,
        return rc;
 }
 
+static int
+write_tag_64_packet(char *signature, struct ecryptfs_session_key *session_key,
+                   char **packet, size_t *packet_len)
+{
+       size_t i = 0;
+       size_t data_len;
+       size_t packet_size_len;
+       char *message;
+       int rc;
+
+       /*
+        *              ***** TAG 64 Packet Format *****
+        *    | Content Type                       | 1 byte       |
+        *    | Key Identifier Size                | 1 or 2 bytes |
+        *    | Key Identifier                     | arbitrary    |
+        *    | Encrypted File Encryption Key Size | 1 or 2 bytes |
+        *    | Encrypted File Encryption Key      | arbitrary    |
+        */
+       data_len = (5 + ECRYPTFS_SIG_SIZE_HEX
+                   + session_key->encrypted_key_size);
+       *packet = kmalloc(data_len, GFP_KERNEL);
+       message = *packet;
+       if (!message) {
+               ecryptfs_printk(KERN_ERR, "Unable to allocate memory\n");
+               rc = -ENOMEM;
+               goto out;
+       }
+       message[i++] = ECRYPTFS_TAG_64_PACKET_TYPE;
+       rc = write_packet_length(&message[i], ECRYPTFS_SIG_SIZE_HEX,
+                                &packet_size_len);
+       if (rc) {
+               ecryptfs_printk(KERN_ERR, "Error generating tag 64 packet "
+                               "header; cannot generate packet length\n");
+               goto out;
+       }
+       i += packet_size_len;
+       memcpy(&message[i], signature, ECRYPTFS_SIG_SIZE_HEX);
+       i += ECRYPTFS_SIG_SIZE_HEX;
+       rc = write_packet_length(&message[i], session_key->encrypted_key_size,
+                                &packet_size_len);
+       if (rc) {
+               ecryptfs_printk(KERN_ERR, "Error generating tag 64 packet "
+                               "header; cannot generate packet length\n");
+               goto out;
+       }
+       i += packet_size_len;
+       memcpy(&message[i], session_key->encrypted_key,
+              session_key->encrypted_key_size);
+       i += session_key->encrypted_key_size;
+       *packet_len = i;
+out:
+       return rc;
+}
+
+static int
+parse_tag_65_packet(struct ecryptfs_session_key *session_key, u16 *cipher_code,
+                   struct ecryptfs_message *msg)
+{
+       size_t i = 0;
+       char *data;
+       size_t data_len;
+       size_t m_size;
+       size_t message_len;
+       u16 checksum = 0;
+       u16 expected_checksum = 0;
+       int rc;
+
+       /*
+        *              ***** TAG 65 Packet Format *****
+        *         | Content Type             | 1 byte       |
+        *         | Status Indicator         | 1 byte       |
+        *         | File Encryption Key Size | 1 or 2 bytes |
+        *         | File Encryption Key      | arbitrary    |
+        */
+       message_len = msg->data_len;
+       data = msg->data;
+       if (message_len < 4) {
+               rc = -EIO;
+               goto out;
+       }
+       if (data[i++] != ECRYPTFS_TAG_65_PACKET_TYPE) {
+               ecryptfs_printk(KERN_ERR, "Type should be ECRYPTFS_TAG_65\n");
+               rc = -EIO;
+               goto out;
+       }
+       if (data[i++]) {
+               ecryptfs_printk(KERN_ERR, "Status indicator has non-zero value "
+                               "[%d]\n", data[i-1]);
+               rc = -EIO;
+               goto out;
+       }
+       rc = parse_packet_length(&data[i], &m_size, &data_len);
+       if (rc) {
+               ecryptfs_printk(KERN_WARNING, "Error parsing packet length; "
+                               "rc = [%d]\n", rc);
+               goto out;
+       }
+       i += data_len;
+       if (message_len < (i + m_size)) {
+               ecryptfs_printk(KERN_ERR, "The received netlink message is "
+                               "shorter than expected\n");
+               rc = -EIO;
+               goto out;
+       }
+       if (m_size < 3) {
+               ecryptfs_printk(KERN_ERR,
+                               "The decrypted key is not long enough to "
+                               "include a cipher code and checksum\n");
+               rc = -EIO;
+               goto out;
+       }
+       *cipher_code = data[i++];
+       /* The decrypted key includes 1 byte cipher code and 2 byte checksum */
+       session_key->decrypted_key_size = m_size - 3;
+       if (session_key->decrypted_key_size > ECRYPTFS_MAX_KEY_BYTES) {
+               ecryptfs_printk(KERN_ERR, "key_size [%d] larger than "
+                               "the maximum key size [%d]\n",
+                               session_key->decrypted_key_size,
+                               ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES);
+               rc = -EIO;
+               goto out;
+       }
+       memcpy(session_key->decrypted_key, &data[i],
+              session_key->decrypted_key_size);
+       i += session_key->decrypted_key_size;
+       expected_checksum += (unsigned char)(data[i++]) << 8;
+       expected_checksum += (unsigned char)(data[i++]);
+       for (i = 0; i < session_key->decrypted_key_size; i++)
+               checksum += session_key->decrypted_key[i];
+       if (expected_checksum != checksum) {
+               ecryptfs_printk(KERN_ERR, "Invalid checksum for file "
+                               "encryption  key; expected [%x]; calculated "
+                               "[%x]\n", expected_checksum, checksum);
+               rc = -EIO;
+       }
+out:
+       return rc;
+}
+
+
+static int
+write_tag_66_packet(char *signature, size_t cipher_code,
+                   struct ecryptfs_crypt_stat *crypt_stat, char **packet,
+                   size_t *packet_len)
+{
+       size_t i = 0;
+       size_t j;
+       size_t data_len;
+       size_t checksum = 0;
+       size_t packet_size_len;
+       char *message;
+       int rc;
+
+       /*
+        *              ***** TAG 66 Packet Format *****
+        *         | Content Type             | 1 byte       |
+        *         | Key Identifier Size      | 1 or 2 bytes |
+        *         | Key Identifier           | arbitrary    |
+        *         | File Encryption Key Size | 1 or 2 bytes |
+        *         | File Encryption Key      | arbitrary    |
+        */
+       data_len = (5 + ECRYPTFS_SIG_SIZE_HEX + crypt_stat->key_size);
+       *packet = kmalloc(data_len, GFP_KERNEL);
+       message = *packet;
+       if (!message) {
+               ecryptfs_printk(KERN_ERR, "Unable to allocate memory\n");
+               rc = -ENOMEM;
+               goto out;
+       }
+       message[i++] = ECRYPTFS_TAG_66_PACKET_TYPE;
+       rc = write_packet_length(&message[i], ECRYPTFS_SIG_SIZE_HEX,
+                                &packet_size_len);
+       if (rc) {
+               ecryptfs_printk(KERN_ERR, "Error generating tag 66 packet "
+                               "header; cannot generate packet length\n");
+               goto out;
+       }
+       i += packet_size_len;
+       memcpy(&message[i], signature, ECRYPTFS_SIG_SIZE_HEX);
+       i += ECRYPTFS_SIG_SIZE_HEX;
+       /* The encrypted key includes 1 byte cipher code and 2 byte checksum */
+       rc = write_packet_length(&message[i], crypt_stat->key_size + 3,
+                                &packet_size_len);
+       if (rc) {
+               ecryptfs_printk(KERN_ERR, "Error generating tag 66 packet "
+                               "header; cannot generate packet length\n");
+               goto out;
+       }
+       i += packet_size_len;
+       message[i++] = cipher_code;
+       memcpy(&message[i], crypt_stat->key, crypt_stat->key_size);
+       i += crypt_stat->key_size;
+       for (j = 0; j < crypt_stat->key_size; j++)
+               checksum += crypt_stat->key[j];
+       message[i++] = (checksum / 256) % 256;
+       message[i++] = (checksum % 256);
+       *packet_len = i;
+out:
+       return rc;
+}
+
+static int
+parse_tag_67_packet(struct ecryptfs_key_record *key_rec,
+                   struct ecryptfs_message *msg)
+{
+       size_t i = 0;
+       char *data;
+       size_t data_len;
+       size_t message_len;
+       int rc;
+
+       /*
+        *              ***** TAG 65 Packet Format *****
+        *    | Content Type                       | 1 byte       |
+        *    | Status Indicator                   | 1 byte       |
+        *    | Encrypted File Encryption Key Size | 1 or 2 bytes |
+        *    | Encrypted File Encryption Key      | arbitrary    |
+        */
+       message_len = msg->data_len;
+       data = msg->data;
+       /* verify that everything through the encrypted FEK size is present */
+       if (message_len < 4) {
+               rc = -EIO;
+               goto out;
+       }
+       if (data[i++] != ECRYPTFS_TAG_67_PACKET_TYPE) {
+               ecryptfs_printk(KERN_ERR, "Type should be ECRYPTFS_TAG_67\n");
+               rc = -EIO;
+               goto out;
+       }
+       if (data[i++]) {
+               ecryptfs_printk(KERN_ERR, "Status indicator has non zero value"
+                               " [%d]\n", data[i-1]);
+               rc = -EIO;
+               goto out;
+       }
+       rc = parse_packet_length(&data[i], &key_rec->enc_key_size, &data_len);
+       if (rc) {
+               ecryptfs_printk(KERN_WARNING, "Error parsing packet length; "
+                               "rc = [%d]\n", rc);
+               goto out;
+       }
+       i += data_len;
+       if (message_len < (i + key_rec->enc_key_size)) {
+               ecryptfs_printk(KERN_ERR, "message_len [%d]; max len is [%d]\n",
+                               message_len, (i + key_rec->enc_key_size));
+               rc = -EIO;
+               goto out;
+       }
+       if (key_rec->enc_key_size > ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES) {
+               ecryptfs_printk(KERN_ERR, "Encrypted key_size [%d] larger than "
+                               "the maximum key size [%d]\n",
+                               key_rec->enc_key_size,
+                               ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES);
+               rc = -EIO;
+               goto out;
+       }
+       memcpy(key_rec->enc_key, &data[i], key_rec->enc_key_size);
+out:
+       return rc;
+}
+
+/**
+ * decrypt_pki_encrypted_session_key - Decrypt the session key with
+ * the given auth_tok.
+ *
+ * Returns Zero on success; non-zero error otherwise.
+ */
+static int decrypt_pki_encrypted_session_key(
+       struct ecryptfs_mount_crypt_stat *mount_crypt_stat,
+       struct ecryptfs_auth_tok *auth_tok,
+       struct ecryptfs_crypt_stat *crypt_stat)
+{
+       u16 cipher_code = 0;
+       struct ecryptfs_msg_ctx *msg_ctx;
+       struct ecryptfs_message *msg = NULL;
+       char *netlink_message;
+       size_t netlink_message_length;
+       int rc;
+
+       rc = write_tag_64_packet(mount_crypt_stat->global_auth_tok_sig,
+                                &(auth_tok->session_key),
+                                &netlink_message, &netlink_message_length);
+       if (rc) {
+               ecryptfs_printk(KERN_ERR, "Failed to write tag 64 packet");
+               goto out;
+       }
+       rc = ecryptfs_send_message(ecryptfs_transport, netlink_message,
+                                  netlink_message_length, &msg_ctx);
+       if (rc) {
+               ecryptfs_printk(KERN_ERR, "Error sending netlink message\n");
+               goto out;
+       }
+       rc = ecryptfs_wait_for_response(msg_ctx, &msg);
+       if (rc) {
+               ecryptfs_printk(KERN_ERR, "Failed to receive tag 65 packet "
+                               "from the user space daemon\n");
+               rc = -EIO;
+               goto out;
+       }
+       rc = parse_tag_65_packet(&(auth_tok->session_key),
+                                &cipher_code, msg);
+       if (rc) {
+               printk(KERN_ERR "Failed to parse tag 65 packet; rc = [%d]\n",
+                      rc);
+               goto out;
+       }
+       auth_tok->session_key.flags |= ECRYPTFS_CONTAINS_DECRYPTED_KEY;
+       memcpy(crypt_stat->key, auth_tok->session_key.decrypted_key,
+              auth_tok->session_key.decrypted_key_size);
+       crypt_stat->key_size = auth_tok->session_key.decrypted_key_size;
+       rc = ecryptfs_cipher_code_to_string(crypt_stat->cipher, cipher_code);
+       if (rc) {
+               ecryptfs_printk(KERN_ERR, "Cipher code [%d] is invalid\n",
+                               cipher_code)
+               goto out;
+       }
+       crypt_stat->flags |= ECRYPTFS_KEY_VALID;
+       if (ecryptfs_verbosity > 0) {
+               ecryptfs_printk(KERN_DEBUG, "Decrypted session key:\n");
+               ecryptfs_dump_hex(crypt_stat->key,
+                                 crypt_stat->key_size);
+       }
+out:
+       if (msg)
+               kfree(msg);
+       return rc;
+}
+
+static void wipe_auth_tok_list(struct list_head *auth_tok_list_head)
+{
+       struct list_head *walker;
+       struct ecryptfs_auth_tok_list_item *auth_tok_list_item;
+
+       walker = auth_tok_list_head->next;
+       while (walker != auth_tok_list_head) {
+               auth_tok_list_item =
+                   list_entry(walker, struct ecryptfs_auth_tok_list_item,
+                              list);
+               walker = auth_tok_list_item->list.next;
+               memset(auth_tok_list_item, 0,
+                      sizeof(struct ecryptfs_auth_tok_list_item));
+               kmem_cache_free(ecryptfs_auth_tok_list_item_cache,
+                               auth_tok_list_item);
+       }
+       auth_tok_list_head->next = NULL;
+}
+
+struct kmem_cache *ecryptfs_auth_tok_list_item_cache;
+
+
+/**
+ * parse_tag_1_packet
+ * @crypt_stat: The cryptographic context to modify based on packet
+ *              contents.
+ * @data: The raw bytes of the packet.
+ * @auth_tok_list: eCryptfs parses packets into authentication tokens;
+ *                 a new authentication token will be placed at the end
+ *                 of this list for this packet.
+ * @new_auth_tok: Pointer to a pointer to memory that this function
+ *                allocates; sets the memory address of the pointer to
+ *                NULL on error. This object is added to the
+ *                auth_tok_list.
+ * @packet_size: This function writes the size of the parsed packet
+ *               into this memory location; zero on error.
+ *
+ * Returns zero on success; non-zero on error.
+ */
+static int
+parse_tag_1_packet(struct ecryptfs_crypt_stat *crypt_stat,
+                  unsigned char *data, struct list_head *auth_tok_list,
+                  struct ecryptfs_auth_tok **new_auth_tok,
+                  size_t *packet_size, size_t max_packet_size)
+{
+       size_t body_size;
+       struct ecryptfs_auth_tok_list_item *auth_tok_list_item;
+       size_t length_size;
+       int rc = 0;
+
+       (*packet_size) = 0;
+       (*new_auth_tok) = NULL;
+
+       /* we check that:
+        *   one byte for the Tag 1 ID flag
+        *   two bytes for the body size
+        * do not exceed the maximum_packet_size
+        */
+       if (unlikely((*packet_size) + 3 > max_packet_size)) {
+               ecryptfs_printk(KERN_ERR, "Packet size exceeds max\n");
+               rc = -EINVAL;
+               goto out;
+       }
+       /* check for Tag 1 identifier - one byte */
+       if (data[(*packet_size)++] != ECRYPTFS_TAG_1_PACKET_TYPE) {
+               ecryptfs_printk(KERN_ERR, "Enter w/ first byte != 0x%.2x\n",
+                               ECRYPTFS_TAG_1_PACKET_TYPE);
+               rc = -EINVAL;
+               goto out;
+       }
+       /* Released: wipe_auth_tok_list called in ecryptfs_parse_packet_set or
+        * at end of function upon failure */
+       auth_tok_list_item =
+               kmem_cache_alloc(ecryptfs_auth_tok_list_item_cache,
+                                GFP_KERNEL);
+       if (!auth_tok_list_item) {
+               ecryptfs_printk(KERN_ERR, "Unable to allocate memory\n");
+               rc = -ENOMEM;
+               goto out;
+       }
+       memset(auth_tok_list_item, 0,
+              sizeof(struct ecryptfs_auth_tok_list_item));
+       (*new_auth_tok) = &auth_tok_list_item->auth_tok;
+       /* check for body size - one to two bytes
+        *
+        *              ***** TAG 1 Packet Format *****
+        *    | version number                     | 1 byte       |
+        *    | key ID                             | 8 bytes      |
+        *    | public key algorithm               | 1 byte       |
+        *    | encrypted session key              | arbitrary    |
+        */
+       rc = parse_packet_length(&data[(*packet_size)], &body_size,
+                                &length_size);
+       if (rc) {
+               ecryptfs_printk(KERN_WARNING, "Error parsing packet length; "
+                               "rc = [%d]\n", rc);
+               goto out_free;
+       }
+       if (unlikely(body_size < (0x02 + ECRYPTFS_SIG_SIZE))) {
+               ecryptfs_printk(KERN_WARNING, "Invalid body size ([%d])\n",
+                               body_size);
+               rc = -EINVAL;
+               goto out_free;
+       }
+       (*packet_size) += length_size;
+       if (unlikely((*packet_size) + body_size > max_packet_size)) {
+               ecryptfs_printk(KERN_ERR, "Packet size exceeds max\n");
+               rc = -EINVAL;
+               goto out_free;
+       }
+       /* Version 3 (from RFC2440) - one byte */
+       if (unlikely(data[(*packet_size)++] != 0x03)) {
+               ecryptfs_printk(KERN_DEBUG, "Unknown version number "
+                               "[%d]\n", data[(*packet_size) - 1]);
+               rc = -EINVAL;
+               goto out_free;
+       }
+       /* Read Signature */
+       ecryptfs_to_hex((*new_auth_tok)->token.private_key.signature,
+                       &data[(*packet_size)], ECRYPTFS_SIG_SIZE);
+       *packet_size += ECRYPTFS_SIG_SIZE;
+       /* This byte is skipped because the kernel does not need to
+        * know which public key encryption algorithm was used */
+       (*packet_size)++;
+       (*new_auth_tok)->session_key.encrypted_key_size =
+               body_size - (0x02 + ECRYPTFS_SIG_SIZE);
+       if ((*new_auth_tok)->session_key.encrypted_key_size
+           > ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES) {
+               ecryptfs_printk(KERN_ERR, "Tag 1 packet contains key larger "
+                               "than ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES");
+               rc = -EINVAL;
+               goto out;
+       }
+       ecryptfs_printk(KERN_DEBUG, "Encrypted key size = [%d]\n",
+                       (*new_auth_tok)->session_key.encrypted_key_size);
+       memcpy((*new_auth_tok)->session_key.encrypted_key,
+              &data[(*packet_size)], (body_size - 0x02 - ECRYPTFS_SIG_SIZE));
+       (*packet_size) += (*new_auth_tok)->session_key.encrypted_key_size;
+       (*new_auth_tok)->session_key.flags &=
+               ~ECRYPTFS_CONTAINS_DECRYPTED_KEY;
+       (*new_auth_tok)->session_key.flags |=
+               ECRYPTFS_CONTAINS_ENCRYPTED_KEY;
+       (*new_auth_tok)->token_type = ECRYPTFS_PRIVATE_KEY;
+       (*new_auth_tok)->flags |= ECRYPTFS_PRIVATE_KEY;
+       /* TODO: Why are we setting this flag here? Don't we want the
+        * userspace to decrypt the session key? */
+       (*new_auth_tok)->session_key.flags &=
+               ~(ECRYPTFS_USERSPACE_SHOULD_TRY_TO_DECRYPT);
+       (*new_auth_tok)->session_key.flags &=
+               ~(ECRYPTFS_USERSPACE_SHOULD_TRY_TO_ENCRYPT);
+       list_add(&auth_tok_list_item->list, auth_tok_list);
+       goto out;
+out_free:
+       (*new_auth_tok) = NULL;
+       memset(auth_tok_list_item, 0,
+              sizeof(struct ecryptfs_auth_tok_list_item));
+       kmem_cache_free(ecryptfs_auth_tok_list_item_cache,
+                       auth_tok_list_item);
+out:
+       if (rc)
+               (*packet_size) = 0;
+       return rc;
+}
+
 /**
  * parse_tag_3_packet
  * @crypt_stat: The cryptographic context to modify based on packet
@@ -178,10 +651,10 @@ parse_tag_3_packet(struct ecryptfs_crypt_stat *crypt_stat,
                   struct ecryptfs_auth_tok **new_auth_tok,
                   size_t *packet_size, size_t max_packet_size)
 {
-       int rc = 0;
        size_t body_size;
        struct ecryptfs_auth_tok_list_item *auth_tok_list_item;
        size_t length_size;
+       int rc = 0;
 
        (*packet_size) = 0;
        (*new_auth_tok) = NULL;
@@ -207,14 +680,12 @@ parse_tag_3_packet(struct ecryptfs_crypt_stat *crypt_stat,
        /* Released: wipe_auth_tok_list called in ecryptfs_parse_packet_set or
         * at end of function upon failure */
        auth_tok_list_item =
-           kmem_cache_alloc(ecryptfs_auth_tok_list_item_cache, GFP_KERNEL);
+           kmem_cache_zalloc(ecryptfs_auth_tok_list_item_cache, GFP_KERNEL);
        if (!auth_tok_list_item) {
                ecryptfs_printk(KERN_ERR, "Unable to allocate memory\n");
                rc = -ENOMEM;
                goto out;
        }
-       memset(auth_tok_list_item, 0,
-              sizeof(struct ecryptfs_auth_tok_list_item));
        (*new_auth_tok) = &auth_tok_list_item->auth_tok;
 
        /* check for body size - one to two bytes */
@@ -321,10 +792,10 @@ parse_tag_3_packet(struct ecryptfs_crypt_stat *crypt_stat,
        (*new_auth_tok)->token_type = ECRYPTFS_PASSWORD;
        /* TODO: Parametarize; we might actually want userspace to
         * decrypt the session key. */
-       ECRYPTFS_CLEAR_FLAG((*new_auth_tok)->session_key.flags,
-                           ECRYPTFS_USERSPACE_SHOULD_TRY_TO_DECRYPT);
-       ECRYPTFS_CLEAR_FLAG((*new_auth_tok)->session_key.flags,
-                           ECRYPTFS_USERSPACE_SHOULD_TRY_TO_ENCRYPT);
+       (*new_auth_tok)->session_key.flags &=
+                           ~(ECRYPTFS_USERSPACE_SHOULD_TRY_TO_DECRYPT);
+       (*new_auth_tok)->session_key.flags &=
+                           ~(ECRYPTFS_USERSPACE_SHOULD_TRY_TO_ENCRYPT);
        list_add(&auth_tok_list_item->list, auth_tok_list);
        goto out;
 out_free:
@@ -360,9 +831,9 @@ parse_tag_11_packet(unsigned char *data, unsigned char *contents,
                    size_t max_contents_bytes, size_t *tag_11_contents_size,
                    size_t *packet_size, size_t max_packet_size)
 {
-       int rc = 0;
        size_t body_size;
        size_t length_size;
+       int rc = 0;
 
        (*packet_size) = 0;
        (*tag_11_contents_size) = 0;
@@ -461,7 +932,6 @@ static int decrypt_session_key(struct ecryptfs_auth_tok *auth_tok,
        struct ecryptfs_password *password_s_ptr;
        struct scatterlist src_sg[2], dst_sg[2];
        struct mutex *tfm_mutex = NULL;
-       /* TODO: Use virt_to_scatterlist for these */
        char *encrypted_session_key;
        char *session_key;
        struct blkcipher_desc desc = {
@@ -470,8 +940,7 @@ static int decrypt_session_key(struct ecryptfs_auth_tok *auth_tok,
        int rc = 0;
 
        password_s_ptr = &auth_tok->token.password;
-       if (ECRYPTFS_CHECK_FLAG(password_s_ptr->flags,
-                               ECRYPTFS_SESSION_KEY_ENCRYPTION_KEY_SET))
+       if (password_s_ptr->flags & ECRYPTFS_SESSION_KEY_ENCRYPTION_KEY_SET)
                ecryptfs_printk(KERN_DEBUG, "Session key encryption key "
                                "set; skipping key generation\n");
        ecryptfs_printk(KERN_DEBUG, "Session key encryption key (size [%d])"
@@ -553,7 +1022,7 @@ static int decrypt_session_key(struct ecryptfs_auth_tok *auth_tok,
        auth_tok->session_key.flags |= ECRYPTFS_CONTAINS_DECRYPTED_KEY;
        memcpy(crypt_stat->key, auth_tok->session_key.decrypted_key,
               auth_tok->session_key.decrypted_key_size);
-       ECRYPTFS_SET_FLAG(crypt_stat->flags, ECRYPTFS_KEY_VALID);
+       crypt_stat->flags |= ECRYPTFS_KEY_VALID;
        ecryptfs_printk(KERN_DEBUG, "Decrypted session key:\n");
        if (ecryptfs_verbosity > 0)
                ecryptfs_dump_hex(crypt_stat->key,
@@ -589,7 +1058,6 @@ int ecryptfs_parse_packet_set(struct ecryptfs_crypt_stat *crypt_stat,
                              struct dentry *ecryptfs_dentry)
 {
        size_t i = 0;
-       int rc = 0;
        size_t found_auth_tok = 0;
        size_t next_packet_is_auth_tok_packet;
        char sig[ECRYPTFS_SIG_SIZE_HEX];
@@ -605,6 +1073,7 @@ int ecryptfs_parse_packet_set(struct ecryptfs_crypt_stat *crypt_stat,
        unsigned char sig_tmp_space[ECRYPTFS_SIG_SIZE];
        size_t tag_11_contents_size;
        size_t tag_11_packet_size;
+       int rc = 0;
 
        INIT_LIST_HEAD(&auth_tok_list);
        /* Parse the header to find as many packets as we can, these will be
@@ -656,8 +1125,21 @@ int ecryptfs_parse_packet_set(struct ecryptfs_crypt_stat *crypt_stat,
                                        sig_tmp_space, tag_11_contents_size);
                        new_auth_tok->token.password.signature[
                                ECRYPTFS_PASSWORD_SIG_SIZE] = '\0';
-                       ECRYPTFS_SET_FLAG(crypt_stat->flags,
-                                         ECRYPTFS_ENCRYPTED);
+                       crypt_stat->flags |= ECRYPTFS_ENCRYPTED;
+                       break;
+               case ECRYPTFS_TAG_1_PACKET_TYPE:
+                       rc = parse_tag_1_packet(crypt_stat,
+                                               (unsigned char *)&src[i],
+                                               &auth_tok_list, &new_auth_tok,
+                                               &packet_size, max_packet_size);
+                       if (rc) {
+                               ecryptfs_printk(KERN_ERR, "Error parsing "
+                                               "tag 1 packet\n");
+                               rc = -EIO;
+                               goto out_wipe_list;
+                       }
+                       i += packet_size;
+                       crypt_stat->flags |= ECRYPTFS_ENCRYPTED;
                        break;
                case ECRYPTFS_TAG_11_PACKET_TYPE:
                        ecryptfs_printk(KERN_WARNING, "Invalid packet set "
@@ -706,31 +1188,46 @@ int ecryptfs_parse_packet_set(struct ecryptfs_crypt_stat *crypt_stat,
                        goto leave_list;
                        /* TODO: Transfer the common salt into the
                         * crypt_stat salt */
+               } else if ((candidate_auth_tok->token_type
+                           == ECRYPTFS_PRIVATE_KEY)
+                          && !strncmp(candidate_auth_tok->token.private_key.signature,
+                                    sig, ECRYPTFS_SIG_SIZE_HEX)) {
+                       found_auth_tok = 1;
+                       goto leave_list;
                }
        }
-leave_list:
        if (!found_auth_tok) {
                ecryptfs_printk(KERN_ERR, "Could not find authentication "
                                "token on temporary list for sig [%.*s]\n",
                                ECRYPTFS_SIG_SIZE_HEX, sig);
                rc = -EIO;
                goto out_wipe_list;
-       } else {
+       }
+leave_list:
+       rc = -ENOTSUPP;
+       if (candidate_auth_tok->token_type == ECRYPTFS_PRIVATE_KEY) {
+               memcpy(&(candidate_auth_tok->token.private_key),
+                      &(chosen_auth_tok->token.private_key),
+                      sizeof(struct ecryptfs_private_key));
+               rc = decrypt_pki_encrypted_session_key(mount_crypt_stat,
+                                                      candidate_auth_tok,
+                                                      crypt_stat);
+       } else if (candidate_auth_tok->token_type == ECRYPTFS_PASSWORD) {
                memcpy(&(candidate_auth_tok->token.password),
                       &(chosen_auth_tok->token.password),
                       sizeof(struct ecryptfs_password));
                rc = decrypt_session_key(candidate_auth_tok, crypt_stat);
-               if (rc) {
-                       ecryptfs_printk(KERN_ERR, "Error decrypting the "
-                                       "session key\n");
-                       goto out_wipe_list;
-               }
-               rc = ecryptfs_compute_root_iv(crypt_stat);
-               if (rc) {
-                       ecryptfs_printk(KERN_ERR, "Error computing "
-                                       "the root IV\n");
-                       goto out_wipe_list;
-               }
+       }
+       if (rc) {
+               ecryptfs_printk(KERN_ERR, "Error decrypting the "
+                               "session key; rc = [%d]\n", rc);
+               goto out_wipe_list;
+       }
+       rc = ecryptfs_compute_root_iv(crypt_stat);
+       if (rc) {
+               ecryptfs_printk(KERN_ERR, "Error computing "
+                               "the root IV\n");
+               goto out_wipe_list;
        }
        rc = ecryptfs_init_crypt_ctx(crypt_stat);
        if (rc) {
@@ -743,6 +1240,145 @@ out_wipe_list:
 out:
        return rc;
 }
+static int
+pki_encrypt_session_key(struct ecryptfs_auth_tok *auth_tok,
+                       struct ecryptfs_crypt_stat *crypt_stat,
+                       struct ecryptfs_key_record *key_rec)
+{
+       struct ecryptfs_msg_ctx *msg_ctx = NULL;
+       char *netlink_payload;
+       size_t netlink_payload_length;
+       struct ecryptfs_message *msg;
+       int rc;
+
+       rc = write_tag_66_packet(auth_tok->token.private_key.signature,
+                                ecryptfs_code_for_cipher_string(crypt_stat),
+                                crypt_stat, &netlink_payload,
+                                &netlink_payload_length);
+       if (rc) {
+               ecryptfs_printk(KERN_ERR, "Error generating tag 66 packet\n");
+               goto out;
+       }
+       rc = ecryptfs_send_message(ecryptfs_transport, netlink_payload,
+                                  netlink_payload_length, &msg_ctx);
+       if (rc) {
+               ecryptfs_printk(KERN_ERR, "Error sending netlink message\n");
+               goto out;
+       }
+       rc = ecryptfs_wait_for_response(msg_ctx, &msg);
+       if (rc) {
+               ecryptfs_printk(KERN_ERR, "Failed to receive tag 67 packet "
+                               "from the user space daemon\n");
+               rc = -EIO;
+               goto out;
+       }
+       rc = parse_tag_67_packet(key_rec, msg);
+       if (rc)
+               ecryptfs_printk(KERN_ERR, "Error parsing tag 67 packet\n");
+       kfree(msg);
+out:
+       if (netlink_payload)
+               kfree(netlink_payload);
+       return rc;
+}
+/**
+ * write_tag_1_packet - Write an RFC2440-compatible tag 1 (public key) packet
+ * @dest: Buffer into which to write the packet
+ * @max: Maximum number of bytes that can be writtn
+ * @packet_size: This function will write the number of bytes that end
+ *               up constituting the packet; set to zero on error
+ *
+ * Returns zero on success; non-zero on error.
+ */
+static int
+write_tag_1_packet(char *dest, size_t max, struct ecryptfs_auth_tok *auth_tok,
+                  struct ecryptfs_crypt_stat *crypt_stat,
+                  struct ecryptfs_mount_crypt_stat *mount_crypt_stat,
+                  struct ecryptfs_key_record *key_rec, size_t *packet_size)
+{
+       size_t i;
+       size_t encrypted_session_key_valid = 0;
+       size_t key_rec_size;
+       size_t packet_size_length;
+       int rc = 0;
+
+       (*packet_size) = 0;
+       ecryptfs_from_hex(key_rec->sig, auth_tok->token.private_key.signature,
+                         ECRYPTFS_SIG_SIZE);
+       encrypted_session_key_valid = 0;
+       for (i = 0; i < crypt_stat->key_size; i++)
+               encrypted_session_key_valid |=
+                       auth_tok->session_key.encrypted_key[i];
+       if (encrypted_session_key_valid) {
+               memcpy(key_rec->enc_key,
+                      auth_tok->session_key.encrypted_key,
+                      auth_tok->session_key.encrypted_key_size);
+               goto encrypted_session_key_set;
+       }
+       if (auth_tok->session_key.encrypted_key_size == 0)
+               auth_tok->session_key.encrypted_key_size =
+                       auth_tok->token.private_key.key_size;
+       rc = pki_encrypt_session_key(auth_tok, crypt_stat, key_rec);
+       if (rc) {
+               ecryptfs_printk(KERN_ERR, "Failed to encrypt session key "
+                               "via a pki");
+               goto out;
+       }
+       if (ecryptfs_verbosity > 0) {
+               ecryptfs_printk(KERN_DEBUG, "Encrypted key:\n");
+               ecryptfs_dump_hex(key_rec->enc_key, key_rec->enc_key_size);
+       }
+encrypted_session_key_set:
+       /* Now we have a valid key_rec.  Append it to the
+        * key_rec set. */
+       key_rec_size = (sizeof(struct ecryptfs_key_record)
+                       - ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES
+                       + (key_rec->enc_key_size));
+       /* TODO: Include a packet size limit as a parameter to this
+        * function once we have multi-packet headers (for versions
+        * later than 0.1 */
+       if (key_rec_size >= ECRYPTFS_MAX_KEYSET_SIZE) {
+               ecryptfs_printk(KERN_ERR, "Keyset too large\n");
+               rc = -EINVAL;
+               goto out;
+       }
+       /*              ***** TAG 1 Packet Format *****
+        *    | version number                     | 1 byte       |
+        *    | key ID                             | 8 bytes      |
+        *    | public key algorithm               | 1 byte       |
+        *    | encrypted session key              | arbitrary    |
+        */
+       if ((0x02 + ECRYPTFS_SIG_SIZE + key_rec->enc_key_size) >= max) {
+               ecryptfs_printk(KERN_ERR,
+                               "Authentication token is too large\n");
+               rc = -EINVAL;
+               goto out;
+       }
+       dest[(*packet_size)++] = ECRYPTFS_TAG_1_PACKET_TYPE;
+       /* This format is inspired by OpenPGP; see RFC 2440
+        * packet tag 1 */
+       rc = write_packet_length(&dest[(*packet_size)],
+                                (0x02 + ECRYPTFS_SIG_SIZE +
+                                key_rec->enc_key_size),
+                                &packet_size_length);
+       if (rc) {
+               ecryptfs_printk(KERN_ERR, "Error generating tag 1 packet "
+                               "header; cannot generate packet length\n");
+               goto out;
+       }
+       (*packet_size) += packet_size_length;
+       dest[(*packet_size)++] = 0x03; /* version 3 */
+       memcpy(&dest[(*packet_size)], key_rec->sig, ECRYPTFS_SIG_SIZE);
+       (*packet_size) += ECRYPTFS_SIG_SIZE;
+       dest[(*packet_size)++] = RFC2440_CIPHER_RSA;
+       memcpy(&dest[(*packet_size)], key_rec->enc_key,
+              key_rec->enc_key_size);
+       (*packet_size) += key_rec->enc_key_size;
+out:
+       if (rc)
+               (*packet_size) = 0;
+       return rc;
+}
 
 /**
  * write_tag_11_packet
@@ -758,8 +1394,8 @@ static int
 write_tag_11_packet(char *dest, int max, char *contents, size_t contents_length,
                    size_t *packet_length)
 {
-       int rc = 0;
        size_t packet_size_length;
+       int rc = 0;
 
        (*packet_length) = 0;
        if ((13 + contents_length) > max) {
@@ -817,7 +1453,6 @@ write_tag_3_packet(char *dest, size_t max, struct ecryptfs_auth_tok *auth_tok,
                   struct ecryptfs_key_record *key_rec, size_t *packet_size)
 {
        size_t i;
-       size_t signature_is_valid = 0;
        size_t encrypted_session_key_valid = 0;
        char session_key_encryption_key[ECRYPTFS_MAX_KEY_BYTES];
        struct scatterlist dest_sg[2];
@@ -833,19 +1468,14 @@ write_tag_3_packet(char *dest, size_t max, struct ecryptfs_auth_tok *auth_tok,
        int rc = 0;
 
        (*packet_size) = 0;
-       /* Check for a valid signature on the auth_tok */
-       for (i = 0; i < ECRYPTFS_SIG_SIZE_HEX; i++)
-               signature_is_valid |= auth_tok->token.password.signature[i];
-       if (!signature_is_valid)
-               BUG();
-       ecryptfs_from_hex((*key_rec).sig, auth_tok->token.password.signature,
+       ecryptfs_from_hex(key_rec->sig, auth_tok->token.password.signature,
                          ECRYPTFS_SIG_SIZE);
        encrypted_session_key_valid = 0;
        for (i = 0; i < crypt_stat->key_size; i++)
                encrypted_session_key_valid |=
                        auth_tok->session_key.encrypted_key[i];
        if (encrypted_session_key_valid) {
-               memcpy((*key_rec).enc_key,
+               memcpy(key_rec->enc_key,
                       auth_tok->session_key.encrypted_key,
                       auth_tok->session_key.encrypted_key_size);
                goto encrypted_session_key_set;
@@ -858,10 +1488,10 @@ write_tag_3_packet(char *dest, size_t max, struct ecryptfs_auth_tok *auth_tok,
                memset((crypt_stat->key + 24), 0, 8);
                auth_tok->session_key.encrypted_key_size = 32;
        }
-       (*key_rec).enc_key_size =
+       key_rec->enc_key_size =
                auth_tok->session_key.encrypted_key_size;
-       if (ECRYPTFS_CHECK_FLAG(auth_tok->token.password.flags,
-                               ECRYPTFS_SESSION_KEY_ENCRYPTION_KEY_SET)) {
+       if (auth_tok->token.password.flags &
+           ECRYPTFS_SESSION_KEY_ENCRYPTION_KEY_SET) {
                ecryptfs_printk(KERN_DEBUG, "Using previously generated "
                                "session key encryption key of size [%d]\n",
                                auth_tok->token.password.
@@ -879,15 +1509,15 @@ write_tag_3_packet(char *dest, size_t max, struct ecryptfs_auth_tok *auth_tok,
                ecryptfs_dump_hex(session_key_encryption_key, 16);
        }
        rc = virt_to_scatterlist(crypt_stat->key,
-                                (*key_rec).enc_key_size, src_sg, 2);
+                                key_rec->enc_key_size, src_sg, 2);
        if (!rc) {
                ecryptfs_printk(KERN_ERR, "Error generating scatterlist "
                                "for crypt_stat session key\n");
                rc = -ENOMEM;
                goto out;
        }
-       rc = virt_to_scatterlist((*key_rec).enc_key,
-                                (*key_rec).enc_key_size, dest_sg, 2);
+       rc = virt_to_scatterlist(key_rec->enc_key,
+                                key_rec->enc_key_size, dest_sg, 2);
        if (!rc) {
                ecryptfs_printk(KERN_ERR, "Error generating scatterlist "
                                "for crypt_stat encrypted session key\n");
@@ -943,14 +1573,14 @@ write_tag_3_packet(char *dest, size_t max, struct ecryptfs_auth_tok *auth_tok,
                mutex_unlock(tfm_mutex);
        ecryptfs_printk(KERN_DEBUG, "This should be the encrypted key:\n");
        if (ecryptfs_verbosity > 0)
-               ecryptfs_dump_hex((*key_rec).enc_key,
-                                 (*key_rec).enc_key_size);
+               ecryptfs_dump_hex(key_rec->enc_key,
+                                 key_rec->enc_key_size);
 encrypted_session_key_set:
        /* Now we have a valid key_rec.  Append it to the
         * key_rec set. */
        key_rec_size = (sizeof(struct ecryptfs_key_record)
                        - ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES
-                       + ((*key_rec).enc_key_size));
+                       + (key_rec->enc_key_size));
        /* TODO: Include a packet size limit as a parameter to this
         * function once we have multi-packet headers (for versions
         * later than 0.1 */
@@ -962,7 +1592,7 @@ encrypted_session_key_set:
        /* TODO: Packet size limit */
        /* We have 5 bytes of surrounding packet data */
        if ((0x05 + ECRYPTFS_SALT_SIZE
-            + (*key_rec).enc_key_size) >= max) {
+            + key_rec->enc_key_size) >= max) {
                ecryptfs_printk(KERN_ERR, "Authentication token is too "
                                "large\n");
                rc = -EINVAL;
@@ -974,7 +1604,7 @@ encrypted_session_key_set:
        /* ver+cipher+s2k+hash+salt+iter+enc_key */
        rc = write_packet_length(&dest[(*packet_size)],
                                 (0x05 + ECRYPTFS_SALT_SIZE
-                                 + (*key_rec).enc_key_size),
+                                 + key_rec->enc_key_size),
                                 &packet_size_length);
        if (rc) {
                ecryptfs_printk(KERN_ERR, "Error generating tag 3 packet "
@@ -997,9 +1627,9 @@ encrypted_session_key_set:
               ECRYPTFS_SALT_SIZE);
        (*packet_size) += ECRYPTFS_SALT_SIZE;   /* salt */
        dest[(*packet_size)++] = 0x60;  /* hash iterations (65536) */
-       memcpy(&dest[(*packet_size)], (*key_rec).enc_key,
-              (*key_rec).enc_key_size);
-       (*packet_size) += (*key_rec).enc_key_size;
+       memcpy(&dest[(*packet_size)], key_rec->enc_key,
+              key_rec->enc_key_size);
+       (*packet_size) += key_rec->enc_key_size;
 out:
        if (desc.tfm && !tfm_mutex)
                crypto_free_blkcipher(desc.tfm);
@@ -1008,6 +1638,8 @@ out:
        return rc;
 }
 
+struct kmem_cache *ecryptfs_key_record_cache;
+
 /**
  * ecryptfs_generate_key_packet_set
  * @dest: Virtual address from which to write the key record set
@@ -1029,52 +1661,60 @@ ecryptfs_generate_key_packet_set(char *dest_base,
                                 struct dentry *ecryptfs_dentry, size_t *len,
                                 size_t max)
 {
-       int rc = 0;
        struct ecryptfs_auth_tok *auth_tok;
        struct ecryptfs_mount_crypt_stat *mount_crypt_stat =
                &ecryptfs_superblock_to_private(
                        ecryptfs_dentry->d_sb)->mount_crypt_stat;
        size_t written;
-       struct ecryptfs_key_record key_rec;
+       struct ecryptfs_key_record *key_rec;
+       int rc = 0;
 
        (*len) = 0;
+       key_rec = kmem_cache_alloc(ecryptfs_key_record_cache, GFP_KERNEL);
+       if (!key_rec) {
+               rc = -ENOMEM;
+               goto out;
+       }
        if (mount_crypt_stat->global_auth_tok) {
                auth_tok = mount_crypt_stat->global_auth_tok;
                if (auth_tok->token_type == ECRYPTFS_PASSWORD) {
                        rc = write_tag_3_packet((dest_base + (*len)),
                                                max, auth_tok,
-                                               crypt_stat, &key_rec,
+                                               crypt_stat, key_rec,
                                                &written);
                        if (rc) {
                                ecryptfs_printk(KERN_WARNING, "Error "
                                                "writing tag 3 packet\n");
-                               goto out;
+                               goto out_free;
                        }
                        (*len) += written;
                        /* Write auth tok signature packet */
                        rc = write_tag_11_packet(
                                (dest_base + (*len)),
                                (max - (*len)),
-                               key_rec.sig, ECRYPTFS_SIG_SIZE, &written);
+                               key_rec->sig, ECRYPTFS_SIG_SIZE, &written);
                        if (rc) {
                                ecryptfs_printk(KERN_ERR, "Error writing "
                                                "auth tok signature packet\n");
-                               goto out;
+                               goto out_free;
+                       }
+                       (*len) += written;
+               } else if (auth_tok->token_type == ECRYPTFS_PRIVATE_KEY) {
+                       rc = write_tag_1_packet(dest_base + (*len),
+                                               max, auth_tok,
+                                               crypt_stat,mount_crypt_stat,
+                                               key_rec, &written);
+                       if (rc) {
+                               ecryptfs_printk(KERN_WARNING, "Error "
+                                               "writing tag 1 packet\n");
+                               goto out_free;
                        }
                        (*len) += written;
                } else {
                        ecryptfs_printk(KERN_WARNING, "Unsupported "
                                        "authentication token type\n");
                        rc = -EINVAL;
-                       goto out;
-               }
-               if (rc) {
-                       ecryptfs_printk(KERN_WARNING, "Error writing "
-                                       "authentication token packet with sig "
-                                       "= [%s]\n",
-                                       mount_crypt_stat->global_auth_tok_sig);
-                       rc = -EIO;
-                       goto out;
+                       goto out_free;
                }
        } else
                BUG();
@@ -1084,6 +1724,9 @@ ecryptfs_generate_key_packet_set(char *dest_base,
                ecryptfs_printk(KERN_ERR, "Error writing boundary byte\n");
                rc = -EIO;
        }
+
+out_free:
+       kmem_cache_free(ecryptfs_key_record_cache, key_rec);
 out:
        if (rc)
                (*len) = 0;
index d0541ae8faba9f4df3c6420aba382a5a497baf51..80044d196fe06b7b82ae3c6dc0cacaddc3e1a2f6 100644 (file)
@@ -3,9 +3,10 @@
  *
  * Copyright (C) 1997-2003 Erez Zadok
  * Copyright (C) 2001-2003 Stony Brook University
- * Copyright (C) 2004-2006 International Business Machines Corp.
+ * Copyright (C) 2004-2007 International Business Machines Corp.
  *   Author(s): Michael A. Halcrow <mahalcro@us.ibm.com>
  *              Michael C. Thompson <mcthomps@us.ibm.com>
+ *              Tyler Hicks <tyhicks@ou.edu>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -48,6 +49,43 @@ MODULE_PARM_DESC(ecryptfs_verbosity,
                 "Initial verbosity level (0 or 1; defaults to "
                 "0, which is Quiet)");
 
+/**
+ * Module parameter that defines the number of netlink message buffer
+ * elements
+ */
+unsigned int ecryptfs_message_buf_len = ECRYPTFS_DEFAULT_MSG_CTX_ELEMS;
+
+module_param(ecryptfs_message_buf_len, uint, 0);
+MODULE_PARM_DESC(ecryptfs_message_buf_len,
+                "Number of message buffer elements");
+
+/**
+ * Module parameter that defines the maximum guaranteed amount of time to wait
+ * for a response through netlink.  The actual sleep time will be, more than
+ * likely, a small amount greater than this specified value, but only less if
+ * the netlink message successfully arrives.
+ */
+signed long ecryptfs_message_wait_timeout = ECRYPTFS_MAX_MSG_CTX_TTL / HZ;
+
+module_param(ecryptfs_message_wait_timeout, long, 0);
+MODULE_PARM_DESC(ecryptfs_message_wait_timeout,
+                "Maximum number of seconds that an operation will "
+                "sleep while waiting for a message response from "
+                "userspace");
+
+/**
+ * Module parameter that is an estimate of the maximum number of users
+ * that will be concurrently using eCryptfs. Set this to the right
+ * value to balance performance and memory use.
+ */
+unsigned int ecryptfs_number_of_users = ECRYPTFS_DEFAULT_NUM_USERS;
+
+module_param(ecryptfs_number_of_users, uint, 0);
+MODULE_PARM_DESC(ecryptfs_number_of_users, "An estimate of the number of "
+                "concurrent users of eCryptfs");
+
+unsigned int ecryptfs_transport = ECRYPTFS_DEFAULT_TRANSPORT;
+
 void __ecryptfs_printk(const char *fmt, ...)
 {
        va_list args;
@@ -124,7 +162,8 @@ out:
 enum { ecryptfs_opt_sig, ecryptfs_opt_ecryptfs_sig, ecryptfs_opt_debug,
        ecryptfs_opt_ecryptfs_debug, ecryptfs_opt_cipher,
        ecryptfs_opt_ecryptfs_cipher, ecryptfs_opt_ecryptfs_key_bytes,
-       ecryptfs_opt_passthrough, ecryptfs_opt_err };
+       ecryptfs_opt_passthrough, ecryptfs_opt_xattr_metadata,
+       ecryptfs_opt_encrypted_view, ecryptfs_opt_err };
 
 static match_table_t tokens = {
        {ecryptfs_opt_sig, "sig=%s"},
@@ -135,6 +174,8 @@ static match_table_t tokens = {
        {ecryptfs_opt_ecryptfs_cipher, "ecryptfs_cipher=%s"},
        {ecryptfs_opt_ecryptfs_key_bytes, "ecryptfs_key_bytes=%u"},
        {ecryptfs_opt_passthrough, "ecryptfs_passthrough"},
+       {ecryptfs_opt_xattr_metadata, "ecryptfs_xattr_metadata"},
+       {ecryptfs_opt_encrypted_view, "ecryptfs_encrypted_view"},
        {ecryptfs_opt_err, NULL}
 };
 
@@ -275,6 +316,16 @@ static int ecryptfs_parse_options(struct super_block *sb, char *options)
                        mount_crypt_stat->flags |=
                                ECRYPTFS_PLAINTEXT_PASSTHROUGH_ENABLED;
                        break;
+               case ecryptfs_opt_xattr_metadata:
+                       mount_crypt_stat->flags |=
+                               ECRYPTFS_XATTR_METADATA_ENABLED;
+                       break;
+               case ecryptfs_opt_encrypted_view:
+                       mount_crypt_stat->flags |=
+                               ECRYPTFS_XATTR_METADATA_ENABLED;
+                       mount_crypt_stat->flags |=
+                               ECRYPTFS_ENCRYPTED_VIEW_ENABLED;
+                       break;
                case ecryptfs_opt_err:
                default:
                        ecryptfs_printk(KERN_WARNING,
@@ -347,9 +398,10 @@ static int ecryptfs_parse_options(struct super_block *sb, char *options)
                rc = -EINVAL;
                goto out;
        }
-       if (auth_tok->token_type != ECRYPTFS_PASSWORD) {
+       if (auth_tok->token_type != ECRYPTFS_PASSWORD
+           && auth_tok->token_type != ECRYPTFS_PRIVATE_KEY) {
                ecryptfs_printk(KERN_ERR, "Invalid auth_tok structure "
-                               "returned from key\n");
+                               "returned from key query\n");
                rc = -EINVAL;
                goto out;
        }
@@ -378,15 +430,13 @@ ecryptfs_fill_super(struct super_block *sb, void *raw_data, int silent)
 
        /* Released in ecryptfs_put_super() */
        ecryptfs_set_superblock_private(sb,
-                                       kmem_cache_alloc(ecryptfs_sb_info_cache,
+                                       kmem_cache_zalloc(ecryptfs_sb_info_cache,
                                                         GFP_KERNEL));
        if (!ecryptfs_superblock_to_private(sb)) {
                ecryptfs_printk(KERN_WARNING, "Out of memory\n");
                rc = -ENOMEM;
                goto out;
        }
-       memset(ecryptfs_superblock_to_private(sb), 0,
-              sizeof(struct ecryptfs_sb_info));
        sb->s_op = &ecryptfs_sops;
        /* Released through deactivate_super(sb) from get_sb_nodev */
        sb->s_root = d_alloc(NULL, &(const struct qstr) {
@@ -402,7 +452,7 @@ ecryptfs_fill_super(struct super_block *sb, void *raw_data, int silent)
        /* Released in d_release when dput(sb->s_root) is called */
        /* through deactivate_super(sb) from get_sb_nodev() */
        ecryptfs_set_dentry_private(sb->s_root,
-                                   kmem_cache_alloc(ecryptfs_dentry_info_cache,
+                                   kmem_cache_zalloc(ecryptfs_dentry_info_cache,
                                                     GFP_KERNEL));
        if (!ecryptfs_dentry_to_private(sb->s_root)) {
                ecryptfs_printk(KERN_ERR,
@@ -410,8 +460,6 @@ ecryptfs_fill_super(struct super_block *sb, void *raw_data, int silent)
                rc = -ENOMEM;
                goto out;
        }
-       memset(ecryptfs_dentry_to_private(sb->s_root), 0,
-              sizeof(struct ecryptfs_dentry_info));
        rc = 0;
 out:
        /* Should be able to rely on deactivate_super called from
@@ -593,11 +641,21 @@ static struct ecryptfs_cache_info {
                .name = "ecryptfs_headers_2",
                .size = PAGE_CACHE_SIZE,
        },
+       {
+               .cache = &ecryptfs_xattr_cache,
+               .name = "ecryptfs_xattr_cache",
+               .size = PAGE_CACHE_SIZE,
+       },
        {
                .cache = &ecryptfs_lower_page_cache,
                .name = "ecryptfs_lower_page_cache",
                .size = PAGE_CACHE_SIZE,
        },
+       {
+               .cache = &ecryptfs_key_record_cache,
+               .name = "ecryptfs_key_record_cache",
+               .size = sizeof(struct ecryptfs_key_record),
+       },
 };
 
 static void ecryptfs_free_kmem_caches(void)
@@ -699,7 +757,8 @@ static struct ecryptfs_version_str_map_elem {
        {ECRYPTFS_VERSIONING_PASSPHRASE, "passphrase"},
        {ECRYPTFS_VERSIONING_PUBKEY, "pubkey"},
        {ECRYPTFS_VERSIONING_PLAINTEXT_PASSTHROUGH, "plaintext passthrough"},
-       {ECRYPTFS_VERSIONING_POLICY, "policy"}
+       {ECRYPTFS_VERSIONING_POLICY, "policy"},
+       {ECRYPTFS_VERSIONING_XATTR, "metadata in extended attribute"}
 };
 
 static ssize_t version_str_show(struct ecryptfs_obj *obj, char *buff)
@@ -798,6 +857,11 @@ static int __init ecryptfs_init(void)
                ecryptfs_free_kmem_caches();
                goto out;
        }
+       rc = ecryptfs_init_messaging(ecryptfs_transport);
+       if (rc) {
+               ecryptfs_printk(KERN_ERR, "Failure occured while attempting to "
+                               "initialize the eCryptfs netlink socket\n");
+       }
 out:
        return rc;
 }
@@ -809,6 +873,7 @@ static void __exit ecryptfs_exit(void)
        sysfs_remove_file(&ecryptfs_subsys.kset.kobj,
                          &sysfs_attr_version_str.attr);
        subsystem_unregister(&ecryptfs_subsys);
+       ecryptfs_release_messaging(ecryptfs_transport);
        unregister_filesystem(&ecryptfs_fs_type);
        ecryptfs_free_kmem_caches();
 }
diff --git a/fs/ecryptfs/messaging.c b/fs/ecryptfs/messaging.c
new file mode 100644 (file)
index 0000000..3baf253
--- /dev/null
@@ -0,0 +1,516 @@
+/**
+ * eCryptfs: Linux filesystem encryption layer
+ *
+ * Copyright (C) 2004-2006 International Business Machines Corp.
+ *   Author(s): Michael A. Halcrow <mhalcrow@us.ibm.com>
+ *             Tyler Hicks <tyhicks@ou.edu>
+ *
+ * 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.
+ *
+ * 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.
+ */
+
+#include "ecryptfs_kernel.h"
+
+static LIST_HEAD(ecryptfs_msg_ctx_free_list);
+static LIST_HEAD(ecryptfs_msg_ctx_alloc_list);
+static struct mutex ecryptfs_msg_ctx_lists_mux;
+
+static struct hlist_head *ecryptfs_daemon_id_hash;
+static struct mutex ecryptfs_daemon_id_hash_mux;
+static int ecryptfs_hash_buckets;
+#define ecryptfs_uid_hash(uid) \
+        hash_long((unsigned long)uid, ecryptfs_hash_buckets)
+
+static unsigned int ecryptfs_msg_counter;
+static struct ecryptfs_msg_ctx *ecryptfs_msg_ctx_arr;
+
+/**
+ * ecryptfs_acquire_free_msg_ctx
+ * @msg_ctx: The context that was acquired from the free list
+ *
+ * Acquires a context element from the free list and locks the mutex
+ * on the context.  Returns zero on success; non-zero on error or upon
+ * failure to acquire a free context element.  Be sure to lock the
+ * list mutex before calling.
+ */
+static int ecryptfs_acquire_free_msg_ctx(struct ecryptfs_msg_ctx **msg_ctx)
+{
+       struct list_head *p;
+       int rc;
+
+       if (list_empty(&ecryptfs_msg_ctx_free_list)) {
+               ecryptfs_printk(KERN_WARNING, "The eCryptfs free "
+                               "context list is empty.  It may be helpful to "
+                               "specify the ecryptfs_message_buf_len "
+                               "parameter to be greater than the current "
+                               "value of [%d]\n", ecryptfs_message_buf_len);
+               rc = -ENOMEM;
+               goto out;
+       }
+       list_for_each(p, &ecryptfs_msg_ctx_free_list) {
+               *msg_ctx = list_entry(p, struct ecryptfs_msg_ctx, node);
+               if (mutex_trylock(&(*msg_ctx)->mux)) {
+                       (*msg_ctx)->task = current;
+                       rc = 0;
+                       goto out;
+               }
+       }
+       rc = -ENOMEM;
+out:
+       return rc;
+}
+
+/**
+ * ecryptfs_msg_ctx_free_to_alloc
+ * @msg_ctx: The context to move from the free list to the alloc list
+ *
+ * Be sure to lock the list mutex and the context mutex before
+ * calling.
+ */
+static void ecryptfs_msg_ctx_free_to_alloc(struct ecryptfs_msg_ctx *msg_ctx)
+{
+       list_move(&msg_ctx->node, &ecryptfs_msg_ctx_alloc_list);
+       msg_ctx->state = ECRYPTFS_MSG_CTX_STATE_PENDING;
+       msg_ctx->counter = ++ecryptfs_msg_counter;
+}
+
+/**
+ * ecryptfs_msg_ctx_alloc_to_free
+ * @msg_ctx: The context to move from the alloc list to the free list
+ *
+ * Be sure to lock the list mutex and the context mutex before
+ * calling.
+ */
+static void ecryptfs_msg_ctx_alloc_to_free(struct ecryptfs_msg_ctx *msg_ctx)
+{
+       list_move(&(msg_ctx->node), &ecryptfs_msg_ctx_free_list);
+       if (msg_ctx->msg)
+               kfree(msg_ctx->msg);
+       msg_ctx->state = ECRYPTFS_MSG_CTX_STATE_FREE;
+}
+
+/**
+ * ecryptfs_find_daemon_id
+ * @uid: The user id which maps to the desired daemon id
+ * @id: If return value is zero, points to the desired daemon id
+ *      pointer
+ *
+ * Search the hash list for the given user id.  Returns zero if the
+ * user id exists in the list; non-zero otherwise.  The daemon id hash
+ * mutex should be held before calling this function.
+ */
+static int ecryptfs_find_daemon_id(uid_t uid, struct ecryptfs_daemon_id **id)
+{
+       struct hlist_node *elem;
+       int rc;
+
+       hlist_for_each_entry(*id, elem,
+                            &ecryptfs_daemon_id_hash[ecryptfs_uid_hash(uid)],
+                            id_chain) {
+               if ((*id)->uid == uid) {
+                       rc = 0;
+                       goto out;
+               }
+       }
+       rc = -EINVAL;
+out:
+       return rc;
+}
+
+static int ecryptfs_send_raw_message(unsigned int transport, u16 msg_type,
+                                    pid_t pid)
+{
+       int rc;
+
+       switch(transport) {
+       case ECRYPTFS_TRANSPORT_NETLINK:
+               rc = ecryptfs_send_netlink(NULL, 0, NULL, msg_type, 0, pid);
+               break;
+       case ECRYPTFS_TRANSPORT_CONNECTOR:
+       case ECRYPTFS_TRANSPORT_RELAYFS:
+       default:
+               rc = -ENOSYS;
+       }
+       return rc;
+}
+
+/**
+ * ecryptfs_process_helo
+ * @transport: The underlying transport (netlink, etc.)
+ * @uid: The user ID owner of the message
+ * @pid: The process ID for the userspace program that sent the
+ *       message
+ *
+ * Adds the uid and pid values to the daemon id hash.  If a uid
+ * already has a daemon pid registered, the daemon will be
+ * unregistered before the new daemon id is put into the hash list.
+ * Returns zero after adding a new daemon id to the hash list;
+ * non-zero otherwise.
+ */
+int ecryptfs_process_helo(unsigned int transport, uid_t uid, pid_t pid)
+{
+       struct ecryptfs_daemon_id *new_id;
+       struct ecryptfs_daemon_id *old_id;
+       int rc;
+
+       mutex_lock(&ecryptfs_daemon_id_hash_mux);
+       new_id = kmalloc(sizeof(*new_id), GFP_KERNEL);
+       if (!new_id) {
+               rc = -ENOMEM;
+               ecryptfs_printk(KERN_ERR, "Failed to allocate memory; unable "
+                               "to register daemon [%d] for user [%d]\n",
+                               pid, uid);
+               goto unlock;
+       }
+       if (!ecryptfs_find_daemon_id(uid, &old_id)) {
+               printk(KERN_WARNING "Received request from user [%d] "
+                      "to register daemon [%d]; unregistering daemon "
+                      "[%d]\n", uid, pid, old_id->pid);
+               hlist_del(&old_id->id_chain);
+               rc = ecryptfs_send_raw_message(transport, ECRYPTFS_NLMSG_QUIT,
+                                              old_id->pid);
+               if (rc)
+                       printk(KERN_WARNING "Failed to send QUIT "
+                              "message to daemon [%d]; rc = [%d]\n",
+                              old_id->pid, rc);
+               kfree(old_id);
+       }
+       new_id->uid = uid;
+       new_id->pid = pid;
+       hlist_add_head(&new_id->id_chain,
+                      &ecryptfs_daemon_id_hash[ecryptfs_uid_hash(uid)]);
+       rc = 0;
+unlock:
+       mutex_unlock(&ecryptfs_daemon_id_hash_mux);
+       return rc;
+}
+
+/**
+ * ecryptfs_process_quit
+ * @uid: The user ID owner of the message
+ * @pid: The process ID for the userspace program that sent the
+ *       message
+ *
+ * Deletes the corresponding daemon id for the given uid and pid, if
+ * it is the registered that is requesting the deletion. Returns zero
+ * after deleting the desired daemon id; non-zero otherwise.
+ */
+int ecryptfs_process_quit(uid_t uid, pid_t pid)
+{
+       struct ecryptfs_daemon_id *id;
+       int rc;
+
+       mutex_lock(&ecryptfs_daemon_id_hash_mux);
+       if (ecryptfs_find_daemon_id(uid, &id)) {
+               rc = -EINVAL;
+               ecryptfs_printk(KERN_ERR, "Received request from user [%d] to "
+                               "unregister unrecognized daemon [%d]\n", uid,
+                               pid);
+               goto unlock;
+       }
+       if (id->pid != pid) {
+               rc = -EINVAL;
+               ecryptfs_printk(KERN_WARNING, "Received request from user [%d] "
+                               "with pid [%d] to unregister daemon [%d]\n",
+                               uid, pid, id->pid);
+               goto unlock;
+       }
+       hlist_del(&id->id_chain);
+       kfree(id);
+       rc = 0;
+unlock:
+       mutex_unlock(&ecryptfs_daemon_id_hash_mux);
+       return rc;
+}
+
+/**
+ * ecryptfs_process_reponse
+ * @msg: The ecryptfs message received; the caller should sanity check
+ *       msg->data_len
+ * @pid: The process ID of the userspace application that sent the
+ *       message
+ * @seq: The sequence number of the message
+ *
+ * Processes a response message after sending a operation request to
+ * userspace. Returns zero upon delivery to desired context element;
+ * non-zero upon delivery failure or error.
+ */
+int ecryptfs_process_response(struct ecryptfs_message *msg, uid_t uid,
+                             pid_t pid, u32 seq)
+{
+       struct ecryptfs_daemon_id *id;
+       struct ecryptfs_msg_ctx *msg_ctx;
+       int msg_size;
+       int rc;
+
+       if (msg->index >= ecryptfs_message_buf_len) {
+               rc = -EINVAL;
+               ecryptfs_printk(KERN_ERR, "Attempt to reference "
+                               "context buffer at index [%d]; maximum "
+                               "allowable is [%d]\n", msg->index,
+                               (ecryptfs_message_buf_len - 1));
+               goto out;
+       }
+       msg_ctx = &ecryptfs_msg_ctx_arr[msg->index];
+       mutex_lock(&msg_ctx->mux);
+       if (ecryptfs_find_daemon_id(msg_ctx->task->euid, &id)) {
+               rc = -EBADMSG;
+               ecryptfs_printk(KERN_WARNING, "User [%d] received a "
+                               "message response from process [%d] but does "
+                               "not have a registered daemon\n",
+                               msg_ctx->task->euid, pid);
+               goto wake_up;
+       }
+       if (msg_ctx->task->euid != uid) {
+               rc = -EBADMSG;
+               ecryptfs_printk(KERN_WARNING, "Received message from user "
+                               "[%d]; expected message from user [%d]\n",
+                               uid, msg_ctx->task->euid);
+               goto unlock;
+       }
+       if (id->pid != pid) {
+               rc = -EBADMSG;
+               ecryptfs_printk(KERN_ERR, "User [%d] received a "
+                               "message response from an unrecognized "
+                               "process [%d]\n", msg_ctx->task->euid, pid);
+               goto unlock;
+       }
+       if (msg_ctx->state != ECRYPTFS_MSG_CTX_STATE_PENDING) {
+               rc = -EINVAL;
+               ecryptfs_printk(KERN_WARNING, "Desired context element is not "
+                               "pending a response\n");
+               goto unlock;
+       } else if (msg_ctx->counter != seq) {
+               rc = -EINVAL;
+               ecryptfs_printk(KERN_WARNING, "Invalid message sequence; "
+                               "expected [%d]; received [%d]\n",
+                               msg_ctx->counter, seq);
+               goto unlock;
+       }
+       msg_size = sizeof(*msg) + msg->data_len;
+       msg_ctx->msg = kmalloc(msg_size, GFP_KERNEL);
+       if (!msg_ctx->msg) {
+               rc = -ENOMEM;
+               ecryptfs_printk(KERN_ERR, "Failed to allocate memory\n");
+               goto unlock;
+       }
+       memcpy(msg_ctx->msg, msg, msg_size);
+       msg_ctx->state = ECRYPTFS_MSG_CTX_STATE_DONE;
+       rc = 0;
+wake_up:
+       wake_up_process(msg_ctx->task);
+unlock:
+       mutex_unlock(&msg_ctx->mux);
+out:
+       return rc;
+}
+
+/**
+ * ecryptfs_send_message
+ * @transport: The transport over which to send the message (i.e.,
+ *             netlink)
+ * @data: The data to send
+ * @data_len: The length of data
+ * @msg_ctx: The message context allocated for the send
+ */
+int ecryptfs_send_message(unsigned int transport, char *data, int data_len,
+                         struct ecryptfs_msg_ctx **msg_ctx)
+{
+       struct ecryptfs_daemon_id *id;
+       int rc;
+
+       mutex_lock(&ecryptfs_daemon_id_hash_mux);
+       if (ecryptfs_find_daemon_id(current->euid, &id)) {
+               mutex_unlock(&ecryptfs_daemon_id_hash_mux);
+               rc = -ENOTCONN;
+               ecryptfs_printk(KERN_ERR, "User [%d] does not have a daemon "
+                               "registered\n", current->euid);
+               goto out;
+       }
+       mutex_unlock(&ecryptfs_daemon_id_hash_mux);
+       mutex_lock(&ecryptfs_msg_ctx_lists_mux);
+       rc = ecryptfs_acquire_free_msg_ctx(msg_ctx);
+       if (rc) {
+               mutex_unlock(&ecryptfs_msg_ctx_lists_mux);
+               ecryptfs_printk(KERN_WARNING, "Could not claim a free "
+                               "context element\n");
+               goto out;
+       }
+       ecryptfs_msg_ctx_free_to_alloc(*msg_ctx);
+       mutex_unlock(&(*msg_ctx)->mux);
+       mutex_unlock(&ecryptfs_msg_ctx_lists_mux);
+       switch (transport) {
+       case ECRYPTFS_TRANSPORT_NETLINK:
+               rc = ecryptfs_send_netlink(data, data_len, *msg_ctx,
+                                          ECRYPTFS_NLMSG_REQUEST, 0, id->pid);
+               break;
+       case ECRYPTFS_TRANSPORT_CONNECTOR:
+       case ECRYPTFS_TRANSPORT_RELAYFS:
+       default:
+               rc = -ENOSYS;
+       }
+       if (rc) {
+               printk(KERN_ERR "Error attempting to send message to userspace "
+                      "daemon; rc = [%d]\n", rc);
+       }
+out:
+       return rc;
+}
+
+/**
+ * ecryptfs_wait_for_response
+ * @msg_ctx: The context that was assigned when sending a message
+ * @msg: The incoming message from userspace; not set if rc != 0
+ *
+ * Sleeps until awaken by ecryptfs_receive_message or until the amount
+ * of time exceeds ecryptfs_message_wait_timeout.  If zero is
+ * returned, msg will point to a valid message from userspace; a
+ * non-zero value is returned upon failure to receive a message or an
+ * error occurs.
+ */
+int ecryptfs_wait_for_response(struct ecryptfs_msg_ctx *msg_ctx,
+                              struct ecryptfs_message **msg)
+{
+       signed long timeout = ecryptfs_message_wait_timeout * HZ;
+       int rc = 0;
+
+sleep:
+       timeout = schedule_timeout_interruptible(timeout);
+       mutex_lock(&ecryptfs_msg_ctx_lists_mux);
+       mutex_lock(&msg_ctx->mux);
+       if (msg_ctx->state != ECRYPTFS_MSG_CTX_STATE_DONE) {
+               if (timeout) {
+                       mutex_unlock(&msg_ctx->mux);
+                       mutex_unlock(&ecryptfs_msg_ctx_lists_mux);
+                       goto sleep;
+               }
+               rc = -ENOMSG;
+       } else {
+               *msg = msg_ctx->msg;
+               msg_ctx->msg = NULL;
+       }
+       ecryptfs_msg_ctx_alloc_to_free(msg_ctx);
+       mutex_unlock(&msg_ctx->mux);
+       mutex_unlock(&ecryptfs_msg_ctx_lists_mux);
+       return rc;
+}
+
+int ecryptfs_init_messaging(unsigned int transport)
+{
+       int i;
+       int rc = 0;
+
+       if (ecryptfs_number_of_users > ECRYPTFS_MAX_NUM_USERS) {
+               ecryptfs_number_of_users = ECRYPTFS_MAX_NUM_USERS;
+               ecryptfs_printk(KERN_WARNING, "Specified number of users is "
+                               "too large, defaulting to [%d] users\n",
+                               ecryptfs_number_of_users);
+       }
+       mutex_init(&ecryptfs_daemon_id_hash_mux);
+       mutex_lock(&ecryptfs_daemon_id_hash_mux);
+       ecryptfs_hash_buckets = 0;
+       while (ecryptfs_number_of_users >> ++ecryptfs_hash_buckets);
+       ecryptfs_daemon_id_hash = kmalloc(sizeof(struct hlist_head)
+                                         * ecryptfs_hash_buckets, GFP_KERNEL);
+       if (!ecryptfs_daemon_id_hash) {
+               rc = -ENOMEM;
+               ecryptfs_printk(KERN_ERR, "Failed to allocate memory\n");
+               goto out;
+       }
+       for (i = 0; i < ecryptfs_hash_buckets; i++)
+               INIT_HLIST_HEAD(&ecryptfs_daemon_id_hash[i]);
+       mutex_unlock(&ecryptfs_daemon_id_hash_mux);
+
+       ecryptfs_msg_ctx_arr = kmalloc((sizeof(struct ecryptfs_msg_ctx)
+                                     * ecryptfs_message_buf_len), GFP_KERNEL);
+       if (!ecryptfs_msg_ctx_arr) {
+               rc = -ENOMEM;
+               ecryptfs_printk(KERN_ERR, "Failed to allocate memory\n");
+               goto out;
+       }
+       mutex_init(&ecryptfs_msg_ctx_lists_mux);
+       mutex_lock(&ecryptfs_msg_ctx_lists_mux);
+       ecryptfs_msg_counter = 0;
+       for (i = 0; i < ecryptfs_message_buf_len; i++) {
+               INIT_LIST_HEAD(&ecryptfs_msg_ctx_arr[i].node);
+               mutex_init(&ecryptfs_msg_ctx_arr[i].mux);
+               mutex_lock(&ecryptfs_msg_ctx_arr[i].mux);
+               ecryptfs_msg_ctx_arr[i].index = i;
+               ecryptfs_msg_ctx_arr[i].state = ECRYPTFS_MSG_CTX_STATE_FREE;
+               ecryptfs_msg_ctx_arr[i].counter = 0;
+               ecryptfs_msg_ctx_arr[i].task = NULL;
+               ecryptfs_msg_ctx_arr[i].msg = NULL;
+               list_add_tail(&ecryptfs_msg_ctx_arr[i].node,
+                             &ecryptfs_msg_ctx_free_list);
+               mutex_unlock(&ecryptfs_msg_ctx_arr[i].mux);
+       }
+       mutex_unlock(&ecryptfs_msg_ctx_lists_mux);
+       switch(transport) {
+       case ECRYPTFS_TRANSPORT_NETLINK:
+               rc = ecryptfs_init_netlink();
+               if (rc)
+                       ecryptfs_release_messaging(transport);
+               break;
+       case ECRYPTFS_TRANSPORT_CONNECTOR:
+       case ECRYPTFS_TRANSPORT_RELAYFS:
+       default:
+               rc = -ENOSYS;
+       }
+out:
+       return rc;
+}
+
+void ecryptfs_release_messaging(unsigned int transport)
+{
+       if (ecryptfs_msg_ctx_arr) {
+               int i;
+
+               mutex_lock(&ecryptfs_msg_ctx_lists_mux);
+               for (i = 0; i < ecryptfs_message_buf_len; i++) {
+                       mutex_lock(&ecryptfs_msg_ctx_arr[i].mux);
+                       if (ecryptfs_msg_ctx_arr[i].msg)
+                               kfree(ecryptfs_msg_ctx_arr[i].msg);
+                       mutex_unlock(&ecryptfs_msg_ctx_arr[i].mux);
+               }
+               kfree(ecryptfs_msg_ctx_arr);
+               mutex_unlock(&ecryptfs_msg_ctx_lists_mux);
+       }
+       if (ecryptfs_daemon_id_hash) {
+               struct hlist_node *elem;
+               struct ecryptfs_daemon_id *id;
+               int i;
+
+               mutex_lock(&ecryptfs_daemon_id_hash_mux);
+               for (i = 0; i < ecryptfs_hash_buckets; i++) {
+                       hlist_for_each_entry(id, elem,
+                                            &ecryptfs_daemon_id_hash[i],
+                                            id_chain) {
+                               hlist_del(elem);
+                               kfree(id);
+                       }
+               }
+               kfree(ecryptfs_daemon_id_hash);
+               mutex_unlock(&ecryptfs_daemon_id_hash_mux);
+       }
+       switch(transport) {
+       case ECRYPTFS_TRANSPORT_NETLINK:
+               ecryptfs_release_netlink();
+               break;
+       case ECRYPTFS_TRANSPORT_CONNECTOR:
+       case ECRYPTFS_TRANSPORT_RELAYFS:
+       default:
+               break;
+       }
+       return;
+}
index 06843d24f2398de852b6e6b0d4fec9b7c30e58fb..3a6f65c3f14fc2fb26aa77df1ba8f10cae7198b7 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (C) 1997-2003 Erez Zadok
  * Copyright (C) 2001-2003 Stony Brook University
- * Copyright (C) 2004-2006 International Business Machines Corp.
+ * Copyright (C) 2004-2007 International Business Machines Corp.
  *   Author(s): Michael A. Halcrow <mahalcro@us.ibm.com>
  *
  * This program is free software; you can redistribute it and/or
@@ -234,22 +234,13 @@ int ecryptfs_do_readpage(struct file *file, struct page *page,
                goto out;
        }
        wait_on_page_locked(lower_page);
-       page_data = (char *)kmap(page);
-       if (!page_data) {
-               rc = -ENOMEM;
-               ecryptfs_printk(KERN_ERR, "Error mapping page\n");
-               goto out;
-       }
-       lower_page_data = (char *)kmap(lower_page);
-       if (!lower_page_data) {
-               rc = -ENOMEM;
-               ecryptfs_printk(KERN_ERR, "Error mapping page\n");
-               kunmap(page);
-               goto out;
-       }
+       page_data = kmap_atomic(page, KM_USER0);
+       lower_page_data = kmap_atomic(lower_page, KM_USER1);
        memcpy(page_data, lower_page_data, PAGE_CACHE_SIZE);
-       kunmap(lower_page);
-       kunmap(page);
+       kunmap_atomic(lower_page_data, KM_USER1);
+       flush_dcache_page(lower_page);
+       kunmap_atomic(page_data, KM_USER0);
+       flush_dcache_page(page);
        rc = 0;
 out:
        if (likely(lower_page))
@@ -260,6 +251,33 @@ out:
                ClearPageUptodate(page);
        return rc;
 }
+/**
+ *   Header Extent:
+ *     Octets 0-7:        Unencrypted file size (big-endian)
+ *     Octets 8-15:       eCryptfs special marker
+ *     Octets 16-19:      Flags
+ *      Octet 16:         File format version number (between 0 and 255)
+ *      Octets 17-18:     Reserved
+ *      Octet 19:         Bit 1 (lsb): Reserved
+ *                        Bit 2: Encrypted?
+ *                        Bits 3-8: Reserved
+ *     Octets 20-23:      Header extent size (big-endian)
+ *     Octets 24-25:      Number of header extents at front of file
+ *                        (big-endian)
+ *     Octet  26:         Begin RFC 2440 authentication token packet set
+ */
+static void set_header_info(char *page_virt,
+                           struct ecryptfs_crypt_stat *crypt_stat)
+{
+       size_t written;
+       int save_num_header_extents_at_front =
+               crypt_stat->num_header_extents_at_front;
+
+       crypt_stat->num_header_extents_at_front = 1;
+       ecryptfs_write_header_metadata(page_virt + 20, crypt_stat, &written);
+       crypt_stat->num_header_extents_at_front =
+               save_num_header_extents_at_front;
+}
 
 /**
  * ecryptfs_readpage
@@ -279,8 +297,8 @@ static int ecryptfs_readpage(struct file *file, struct page *page)
        crypt_stat = &ecryptfs_inode_to_private(file->f_path.dentry->d_inode)
                        ->crypt_stat;
        if (!crypt_stat
-           || !ECRYPTFS_CHECK_FLAG(crypt_stat->flags, ECRYPTFS_ENCRYPTED)
-           || ECRYPTFS_CHECK_FLAG(crypt_stat->flags, ECRYPTFS_NEW_FILE)) {
+           || !(crypt_stat->flags & ECRYPTFS_ENCRYPTED)
+           || (crypt_stat->flags & ECRYPTFS_NEW_FILE)) {
                ecryptfs_printk(KERN_DEBUG,
                                "Passing through unencrypted page\n");
                rc = ecryptfs_do_readpage(file, page, page->index);
@@ -289,10 +307,51 @@ static int ecryptfs_readpage(struct file *file, struct page *page)
                                        "[%d]\n", rc);
                        goto out;
                }
+       } else if (crypt_stat->flags & ECRYPTFS_VIEW_AS_ENCRYPTED) {
+               if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) {
+                       int num_pages_in_header_region =
+                               (crypt_stat->header_extent_size
+                                / PAGE_CACHE_SIZE);
+
+                       if (page->index < num_pages_in_header_region) {
+                               char *page_virt;
+
+                               page_virt = kmap_atomic(page, KM_USER0);
+                               memset(page_virt, 0, PAGE_CACHE_SIZE);
+                               if (page->index == 0) {
+                                       rc = ecryptfs_read_xattr_region(
+                                               page_virt, file->f_path.dentry);
+                                       set_header_info(page_virt, crypt_stat);
+                               }
+                               kunmap_atomic(page_virt, KM_USER0);
+                               flush_dcache_page(page);
+                               if (rc) {
+                                       printk(KERN_ERR "Error reading xattr "
+                                              "region\n");
+                                       goto out;
+                               }
+                       } else {
+                               rc = ecryptfs_do_readpage(
+                                       file, page,
+                                       (page->index
+                                        - num_pages_in_header_region));
+                               if (rc) {
+                                       printk(KERN_ERR "Error reading page; "
+                                              "rc = [%d]\n", rc);
+                                       goto out;
+                               }
+                       }
+               } else {
+                       rc = ecryptfs_do_readpage(file, page, page->index);
+                       if (rc) {
+                               printk(KERN_ERR "Error reading page; rc = "
+                                      "[%d]\n", rc);
+                               goto out;
+                       }
+               }
        } else {
                rc = ecryptfs_decrypt_page(file, page);
                if (rc) {
-
                        ecryptfs_printk(KERN_ERR, "Error decrypting page; "
                                        "rc = [%d]\n", rc);
                        goto out;
@@ -308,30 +367,27 @@ out:
        return rc;
 }
 
+/**
+ * Called with lower inode mutex held.
+ */
 static int fill_zeros_to_end_of_page(struct page *page, unsigned int to)
 {
        struct inode *inode = page->mapping->host;
        int end_byte_in_page;
-       int rc = 0;
        char *page_virt;
 
-       if ((i_size_read(inode) / PAGE_CACHE_SIZE) == page->index) {
-               end_byte_in_page = i_size_read(inode) % PAGE_CACHE_SIZE;
-               if (to > end_byte_in_page)
-                       end_byte_in_page = to;
-               page_virt = kmap(page);
-               if (!page_virt) {
-                       rc = -ENOMEM;
-                       ecryptfs_printk(KERN_WARNING,
-                                       "Could not map page\n");
-                       goto out;
-               }
-               memset((page_virt + end_byte_in_page), 0,
-                      (PAGE_CACHE_SIZE - end_byte_in_page));
-               kunmap(page);
-       }
+       if ((i_size_read(inode) / PAGE_CACHE_SIZE) != page->index)
+               goto out;
+       end_byte_in_page = i_size_read(inode) % PAGE_CACHE_SIZE;
+       if (to > end_byte_in_page)
+               end_byte_in_page = to;
+       page_virt = kmap_atomic(page, KM_USER0);
+       memset((page_virt + end_byte_in_page), 0,
+              (PAGE_CACHE_SIZE - end_byte_in_page));
+       kunmap_atomic(page_virt, KM_USER0);
+       flush_dcache_page(page);
 out:
-       return rc;
+       return 0;
 }
 
 static int ecryptfs_prepare_write(struct file *file, struct page *page,
@@ -339,7 +395,6 @@ static int ecryptfs_prepare_write(struct file *file, struct page *page,
 {
        int rc = 0;
 
-       kmap(page);
        if (from == 0 && to == PAGE_CACHE_SIZE)
                goto out;       /* If we are writing a full page, it will be
                                   up to date. */
@@ -349,30 +404,6 @@ out:
        return rc;
 }
 
-int ecryptfs_grab_and_map_lower_page(struct page **lower_page,
-                                    char **lower_virt,
-                                    struct inode *lower_inode,
-                                    unsigned long lower_page_index)
-{
-       int rc = 0;
-
-       (*lower_page) = grab_cache_page(lower_inode->i_mapping,
-                                       lower_page_index);
-       if (!(*lower_page)) {
-               ecryptfs_printk(KERN_ERR, "grab_cache_page for "
-                               "lower_page_index = [0x%.16x] failed\n",
-                               lower_page_index);
-               rc = -EINVAL;
-               goto out;
-       }
-       if (lower_virt)
-               (*lower_virt) = kmap((*lower_page));
-       else
-               kmap((*lower_page));
-out:
-       return rc;
-}
-
 int ecryptfs_writepage_and_release_lower_page(struct page *lower_page,
                                              struct inode *lower_inode,
                                              struct writeback_control *wbc)
@@ -391,11 +422,8 @@ out:
        return rc;
 }
 
-static void ecryptfs_unmap_and_release_lower_page(struct page *lower_page)
+static void ecryptfs_release_lower_page(struct page *lower_page)
 {
-       kunmap(lower_page);
-       ecryptfs_printk(KERN_DEBUG, "Unlocking lower page with index = "
-                       "[0x%.16x]\n", lower_page->index);
        unlock_page(lower_page);
        page_cache_release(lower_page);
 }
@@ -407,10 +435,9 @@ static void ecryptfs_unmap_and_release_lower_page(struct page *lower_page)
  *
  * Returns zero on success; non-zero on error.
  */
-int
-ecryptfs_write_inode_size_to_header(struct file *lower_file,
-                                   struct inode *lower_inode,
-                                   struct inode *inode)
+static int ecryptfs_write_inode_size_to_header(struct file *lower_file,
+                                              struct inode *lower_inode,
+                                              struct inode *inode)
 {
        int rc = 0;
        struct page *header_page;
@@ -418,11 +445,11 @@ ecryptfs_write_inode_size_to_header(struct file *lower_file,
        const struct address_space_operations *lower_a_ops;
        u64 file_size;
 
-       rc = ecryptfs_grab_and_map_lower_page(&header_page, &header_virt,
-                                             lower_inode, 0);
-       if (rc) {
-               ecryptfs_printk(KERN_ERR, "grab_cache_page for header page "
-                               "failed\n");
+       header_page = grab_cache_page(lower_inode->i_mapping, 0);
+       if (!header_page) {
+               ecryptfs_printk(KERN_ERR, "grab_cache_page for "
+                               "lower_page_index 0 failed\n");
+               rc = -EINVAL;
                goto out;
        }
        lower_a_ops = lower_inode->i_mapping->a_ops;
@@ -430,18 +457,95 @@ ecryptfs_write_inode_size_to_header(struct file *lower_file,
        file_size = (u64)i_size_read(inode);
        ecryptfs_printk(KERN_DEBUG, "Writing size: [0x%.16x]\n", file_size);
        file_size = cpu_to_be64(file_size);
+       header_virt = kmap_atomic(header_page, KM_USER0);
        memcpy(header_virt, &file_size, sizeof(u64));
+       kunmap_atomic(header_virt, KM_USER0);
+       flush_dcache_page(header_page);
        rc = lower_a_ops->commit_write(lower_file, header_page, 0, 8);
        if (rc < 0)
                ecryptfs_printk(KERN_ERR, "Error commiting header page "
                                "write\n");
-       ecryptfs_unmap_and_release_lower_page(header_page);
+       ecryptfs_release_lower_page(header_page);
        lower_inode->i_mtime = lower_inode->i_ctime = CURRENT_TIME;
        mark_inode_dirty_sync(inode);
 out:
        return rc;
 }
 
+static int ecryptfs_write_inode_size_to_xattr(struct inode *lower_inode,
+                                             struct inode *inode,
+                                             struct dentry *ecryptfs_dentry,
+                                             int lower_i_mutex_held)
+{
+       ssize_t size;
+       void *xattr_virt;
+       struct dentry *lower_dentry;
+       u64 file_size;
+       int rc;
+
+       xattr_virt = kmem_cache_alloc(ecryptfs_xattr_cache, GFP_KERNEL);
+       if (!xattr_virt) {
+               printk(KERN_ERR "Out of memory whilst attempting to write "
+                      "inode size to xattr\n");
+               rc = -ENOMEM;
+               goto out;
+       }
+       lower_dentry = ecryptfs_dentry_to_lower(ecryptfs_dentry);
+       if (!lower_dentry->d_inode->i_op->getxattr) {
+               printk(KERN_WARNING
+                      "No support for setting xattr in lower filesystem\n");
+               rc = -ENOSYS;
+               kmem_cache_free(ecryptfs_xattr_cache, xattr_virt);
+               goto out;
+       }
+       if (!lower_i_mutex_held)
+               mutex_lock(&lower_dentry->d_inode->i_mutex);
+       size = lower_dentry->d_inode->i_op->getxattr(lower_dentry,
+                                                    ECRYPTFS_XATTR_NAME,
+                                                    xattr_virt,
+                                                    PAGE_CACHE_SIZE);
+       if (!lower_i_mutex_held)
+               mutex_unlock(&lower_dentry->d_inode->i_mutex);
+       if (size < 0)
+               size = 8;
+       file_size = (u64)i_size_read(inode);
+       file_size = cpu_to_be64(file_size);
+       memcpy(xattr_virt, &file_size, sizeof(u64));
+       if (!lower_i_mutex_held)
+               mutex_lock(&lower_dentry->d_inode->i_mutex);
+       rc = lower_dentry->d_inode->i_op->setxattr(lower_dentry,
+                                                  ECRYPTFS_XATTR_NAME,
+                                                  xattr_virt, size, 0);
+       if (!lower_i_mutex_held)
+               mutex_unlock(&lower_dentry->d_inode->i_mutex);
+       if (rc)
+               printk(KERN_ERR "Error whilst attempting to write inode size "
+                      "to lower file xattr; rc = [%d]\n", rc);
+       kmem_cache_free(ecryptfs_xattr_cache, xattr_virt);
+out:
+       return rc;
+}
+
+int
+ecryptfs_write_inode_size_to_metadata(struct file *lower_file,
+                                     struct inode *lower_inode,
+                                     struct inode *inode,
+                                     struct dentry *ecryptfs_dentry,
+                                     int lower_i_mutex_held)
+{
+       struct ecryptfs_crypt_stat *crypt_stat;
+
+       crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;
+       if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR)
+               return ecryptfs_write_inode_size_to_xattr(lower_inode, inode,
+                                                         ecryptfs_dentry,
+                                                         lower_i_mutex_held);
+       else
+               return ecryptfs_write_inode_size_to_header(lower_file,
+                                                          lower_inode,
+                                                          inode);
+}
+
 int ecryptfs_get_lower_page(struct page **lower_page, struct inode *lower_inode,
                            struct file *lower_file,
                            unsigned long lower_page_index, int byte_offset,
@@ -449,10 +553,10 @@ int ecryptfs_get_lower_page(struct page **lower_page, struct inode *lower_inode,
 {
        int rc = 0;
 
-       rc = ecryptfs_grab_and_map_lower_page(lower_page, NULL, lower_inode,
-                                             lower_page_index);
-       if (rc) {
-               ecryptfs_printk(KERN_ERR, "Error attempting to grab and map "
+       *lower_page = grab_cache_page(lower_inode->i_mapping, lower_page_index);
+       if (!(*lower_page)) {
+               rc = -EINVAL;
+               ecryptfs_printk(KERN_ERR, "Error attempting to grab "
                                "lower page with index [0x%.16x]\n",
                                lower_page_index);
                goto out;
@@ -468,7 +572,7 @@ int ecryptfs_get_lower_page(struct page **lower_page, struct inode *lower_inode,
        }
 out:
        if (rc && (*lower_page)) {
-               ecryptfs_unmap_and_release_lower_page(*lower_page);
+               ecryptfs_release_lower_page(*lower_page);
                (*lower_page) = NULL;
        }
        return rc;
@@ -493,7 +597,7 @@ ecryptfs_commit_lower_page(struct page *lower_page, struct inode *lower_inode,
                                "Error committing write; rc = [%d]\n", rc);
        } else
                rc = 0;
-       ecryptfs_unmap_and_release_lower_page(lower_page);
+       ecryptfs_release_lower_page(lower_page);
        return rc;
 }
 
@@ -528,89 +632,7 @@ out:
        return rc;
 }
 
-static int
-process_new_file(struct ecryptfs_crypt_stat *crypt_stat,
-                struct file *file, struct inode *inode)
-{
-       struct page *header_page;
-       const struct address_space_operations *lower_a_ops;
-       struct inode *lower_inode;
-       struct file *lower_file;
-       char *header_virt;
-       int rc = 0;
-       int current_header_page = 0;
-       int header_pages;
-       int more_header_data_to_be_written = 1;
-
-       lower_inode = ecryptfs_inode_to_lower(inode);
-       lower_file = ecryptfs_file_to_lower(file);
-       lower_a_ops = lower_inode->i_mapping->a_ops;
-       header_pages = ((crypt_stat->header_extent_size
-                        * crypt_stat->num_header_extents_at_front)
-                       / PAGE_CACHE_SIZE);
-       BUG_ON(header_pages < 1);
-       while (current_header_page < header_pages) {
-               rc = ecryptfs_grab_and_map_lower_page(&header_page,
-                                                     &header_virt,
-                                                     lower_inode,
-                                                     current_header_page);
-               if (rc) {
-                       ecryptfs_printk(KERN_ERR, "grab_cache_page for "
-                                       "header page [%d] failed; rc = [%d]\n",
-                                       current_header_page, rc);
-                       goto out;
-               }
-               rc = lower_a_ops->prepare_write(lower_file, header_page, 0,
-                                               PAGE_CACHE_SIZE);
-               if (rc) {
-                       ecryptfs_printk(KERN_ERR, "Error preparing to write "
-                                       "header page out; rc = [%d]\n", rc);
-                       goto out;
-               }
-               memset(header_virt, 0, PAGE_CACHE_SIZE);
-               if (more_header_data_to_be_written) {
-                       rc = ecryptfs_write_headers_virt(header_virt,
-                                                        crypt_stat,
-                                                        file->f_dentry);
-                       if (rc) {
-                               ecryptfs_printk(KERN_WARNING, "Error "
-                                               "generating header; rc = "
-                                               "[%d]\n", rc);
-                               rc = -EIO;
-                               memset(header_virt, 0, PAGE_CACHE_SIZE);
-                               ecryptfs_unmap_and_release_lower_page(
-                                       header_page);
-                               goto out;
-                       }
-                       if (current_header_page == 0)
-                               memset(header_virt, 0, 8);
-                       more_header_data_to_be_written = 0;
-               }
-               rc = lower_a_ops->commit_write(lower_file, header_page, 0,
-                                              PAGE_CACHE_SIZE);
-               ecryptfs_unmap_and_release_lower_page(header_page);
-               if (rc < 0) {
-                       ecryptfs_printk(KERN_ERR,
-                                       "Error commiting header page write; "
-                                       "rc = [%d]\n", rc);
-                       break;
-               }
-               current_header_page++;
-       }
-       if (rc >= 0) {
-               rc = 0;
-               ecryptfs_printk(KERN_DEBUG, "lower_inode->i_blocks = "
-                               "[0x%.16x]\n", lower_inode->i_blocks);
-               i_size_write(inode, 0);
-               lower_inode->i_mtime = lower_inode->i_ctime = CURRENT_TIME;
-               mark_inode_dirty_sync(inode);
-       }
-       ecryptfs_printk(KERN_DEBUG, "Clearing ECRYPTFS_NEW_FILE flag in "
-                       "crypt_stat at memory location [%p]\n", crypt_stat);
-       ECRYPTFS_CLEAR_FLAG(crypt_stat->flags, ECRYPTFS_NEW_FILE);
-out:
-       return rc;
-}
+struct kmem_cache *ecryptfs_xattr_cache;
 
 /**
  * ecryptfs_commit_write
@@ -640,15 +662,10 @@ static int ecryptfs_commit_write(struct file *file, struct page *page,
        mutex_lock(&lower_inode->i_mutex);
        crypt_stat = &ecryptfs_inode_to_private(file->f_path.dentry->d_inode)
                                ->crypt_stat;
-       if (ECRYPTFS_CHECK_FLAG(crypt_stat->flags, ECRYPTFS_NEW_FILE)) {
+       if (crypt_stat->flags & ECRYPTFS_NEW_FILE) {
                ecryptfs_printk(KERN_DEBUG, "ECRYPTFS_NEW_FILE flag set in "
                        "crypt_stat at memory location [%p]\n", crypt_stat);
-               rc = process_new_file(crypt_stat, file, inode);
-               if (rc) {
-                       ecryptfs_printk(KERN_ERR, "Error processing new "
-                                       "file; rc = [%d]\n", rc);
-                       goto out;
-               }
+               crypt_stat->flags &= ~(ECRYPTFS_NEW_FILE);
        } else
                ecryptfs_printk(KERN_DEBUG, "Not a new file\n");
        ecryptfs_printk(KERN_DEBUG, "Calling fill_zeros_to_end_of_page"
@@ -670,7 +687,6 @@ static int ecryptfs_commit_write(struct file *file, struct page *page,
                                "index [0x%.16x])\n", page->index);
                goto out;
        }
-       rc = 0;
        inode->i_blocks = lower_inode->i_blocks;
        pos = (page->index << PAGE_CACHE_SHIFT) + to;
        if (pos > i_size_read(inode)) {
@@ -678,11 +694,15 @@ static int ecryptfs_commit_write(struct file *file, struct page *page,
                ecryptfs_printk(KERN_DEBUG, "Expanded file size to "
                                "[0x%.16x]\n", i_size_read(inode));
        }
-       ecryptfs_write_inode_size_to_header(lower_file, lower_inode, inode);
+       rc = ecryptfs_write_inode_size_to_metadata(lower_file, lower_inode,
+                                                  inode, file->f_dentry,
+                                                  ECRYPTFS_LOWER_I_MUTEX_HELD);
+       if (rc)
+               printk(KERN_ERR "Error writing inode size to metadata; "
+                      "rc = [%d]\n", rc);
        lower_inode->i_mtime = lower_inode->i_ctime = CURRENT_TIME;
        mark_inode_dirty_sync(inode);
 out:
-       kunmap(page); /* mapped in prior call (prepare_write) */
        if (rc < 0)
                ClearPageUptodate(page);
        else
@@ -707,6 +727,7 @@ int write_zeros(struct file *file, pgoff_t index, int start, int num_zeros)
 {
        int rc = 0;
        struct page *tmp_page;
+       char *tmp_page_virt;
 
        tmp_page = ecryptfs_get1page(file, index);
        if (IS_ERR(tmp_page)) {
@@ -715,28 +736,27 @@ int write_zeros(struct file *file, pgoff_t index, int start, int num_zeros)
                rc = PTR_ERR(tmp_page);
                goto out;
        }
-       kmap(tmp_page);
        rc = ecryptfs_prepare_write(file, tmp_page, start, start + num_zeros);
        if (rc) {
                ecryptfs_printk(KERN_ERR, "Error preparing to write zero's "
                                "to remainder of page at index [0x%.16x]\n",
                                index);
-               kunmap(tmp_page);
                page_cache_release(tmp_page);
                goto out;
        }
-       memset(((char *)page_address(tmp_page) + start), 0, num_zeros);
+       tmp_page_virt = kmap_atomic(tmp_page, KM_USER0);
+       memset(((char *)tmp_page_virt + start), 0, num_zeros);
+       kunmap_atomic(tmp_page_virt, KM_USER0);
+       flush_dcache_page(tmp_page);
        rc = ecryptfs_commit_write(file, tmp_page, start, start + num_zeros);
        if (rc < 0) {
                ecryptfs_printk(KERN_ERR, "Error attempting to write zero's "
                                "to remainder of page at index [0x%.16x]\n",
                                index);
-               kunmap(tmp_page);
                page_cache_release(tmp_page);
                goto out;
        }
        rc = 0;
-       kunmap(tmp_page);
        page_cache_release(tmp_page);
 out:
        return rc;
diff --git a/fs/ecryptfs/netlink.c b/fs/ecryptfs/netlink.c
new file mode 100644 (file)
index 0000000..e3aa225
--- /dev/null
@@ -0,0 +1,255 @@
+/**
+ * eCryptfs: Linux filesystem encryption layer
+ *
+ * Copyright (C) 2004-2006 International Business Machines Corp.
+ *   Author(s): Michael A. Halcrow <mhalcrow@us.ibm.com>
+ *             Tyler Hicks <tyhicks@ou.edu>
+ *
+ * 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.
+ *
+ * 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.
+ */
+
+#include <net/sock.h>
+#include <linux/hash.h>
+#include <linux/random.h>
+#include "ecryptfs_kernel.h"
+
+static struct sock *ecryptfs_nl_sock;
+
+/**
+ * ecryptfs_send_netlink
+ * @data: The data to include as the payload
+ * @data_len: The byte count of the data
+ * @msg_ctx: The netlink context that will be used to handle the
+ *          response message
+ * @msg_type: The type of netlink message to send
+ * @msg_flags: The flags to include in the netlink header
+ * @daemon_pid: The process id of the daemon to send the message to
+ *
+ * Sends the data to the specified daemon pid and uses the netlink
+ * context element to store the data needed for validation upon
+ * receiving the response.  The data and the netlink context can be
+ * null if just sending a netlink header is sufficient.  Returns zero
+ * upon sending the message; non-zero upon error.
+ */
+int ecryptfs_send_netlink(char *data, int data_len,
+                         struct ecryptfs_msg_ctx *msg_ctx, u16 msg_type,
+                         u16 msg_flags, pid_t daemon_pid)
+{
+       struct sk_buff *skb;
+       struct nlmsghdr *nlh;
+       struct ecryptfs_message *msg;
+       size_t payload_len;
+       int rc;
+
+       payload_len = ((data && data_len) ? (sizeof(*msg) + data_len) : 0);
+       skb = alloc_skb(NLMSG_SPACE(payload_len), GFP_KERNEL);
+       if (!skb) {
+               rc = -ENOMEM;
+               ecryptfs_printk(KERN_ERR, "Failed to allocate socket buffer\n");
+               goto out;
+       }
+       nlh = NLMSG_PUT(skb, daemon_pid, msg_ctx ? msg_ctx->counter : 0,
+                       msg_type, payload_len);
+       nlh->nlmsg_flags = msg_flags;
+       if (msg_ctx && payload_len) {
+               msg = (struct ecryptfs_message *)NLMSG_DATA(nlh);
+               msg->index = msg_ctx->index;
+               msg->data_len = data_len;
+               memcpy(msg->data, data, data_len);
+       }
+       rc = netlink_unicast(ecryptfs_nl_sock, skb, daemon_pid, 0);
+       if (rc < 0) {
+               ecryptfs_printk(KERN_ERR, "Failed to send eCryptfs netlink "
+                               "message; rc = [%d]\n", rc);
+               goto out;
+       }
+       rc = 0;
+       goto out;
+nlmsg_failure:
+       rc = -EMSGSIZE;
+       kfree_skb(skb);
+out:
+       return rc;
+}
+
+/**
+ * ecryptfs_process_nl_reponse
+ * @skb: The socket buffer containing the netlink message of state
+ *       RESPONSE
+ *
+ * Processes a response message after sending a operation request to
+ * userspace.  Attempts to assign the msg to a netlink context element
+ * at the index specified in the msg.  The sk_buff and nlmsghdr must
+ * be validated before this function. Returns zero upon delivery to
+ * desired context element; non-zero upon delivery failure or error.
+ */
+static int ecryptfs_process_nl_response(struct sk_buff *skb)
+{
+       struct nlmsghdr *nlh = (struct nlmsghdr*)skb->data;
+       struct ecryptfs_message *msg = NLMSG_DATA(nlh);
+       int rc;
+
+       if (skb->len - NLMSG_HDRLEN - sizeof(*msg) != msg->data_len) {
+               rc = -EINVAL;
+               ecryptfs_printk(KERN_ERR, "Received netlink message with "
+                               "incorrectly specified data length\n");
+               goto out;
+       }
+       rc = ecryptfs_process_response(msg, NETLINK_CREDS(skb)->uid,
+                                      NETLINK_CREDS(skb)->pid, nlh->nlmsg_seq);
+       if (rc)
+               printk(KERN_ERR
+                      "Error processing response message; rc = [%d]\n", rc);
+out:
+       return rc;
+}
+
+/**
+ * ecryptfs_process_nl_helo
+ * @skb: The socket buffer containing the nlmsghdr in HELO state
+ *
+ * Gets uid and pid of the skb and adds the values to the daemon id
+ * hash. Returns zero after adding a new daemon id to the hash list;
+ * non-zero otherwise.
+ */
+static int ecryptfs_process_nl_helo(struct sk_buff *skb)
+{
+       int rc;
+
+       rc = ecryptfs_process_helo(ECRYPTFS_TRANSPORT_NETLINK,
+                                  NETLINK_CREDS(skb)->uid,
+                                  NETLINK_CREDS(skb)->pid);
+       if (rc)
+               printk(KERN_WARNING "Error processing HELO; rc = [%d]\n", rc);
+       return rc;
+}
+
+/**
+ * ecryptfs_process_nl_quit
+ * @skb: The socket buffer containing the nlmsghdr in QUIT state
+ *
+ * Gets uid and pid of the skb and deletes the corresponding daemon
+ * id, if it is the registered that is requesting the
+ * deletion. Returns zero after deleting the desired daemon id;
+ * non-zero otherwise.
+ */
+static int ecryptfs_process_nl_quit(struct sk_buff *skb)
+{
+       int rc;
+
+       rc = ecryptfs_process_quit(NETLINK_CREDS(skb)->uid,
+                                  NETLINK_CREDS(skb)->pid);
+       if (rc)
+               printk(KERN_WARNING
+                      "Error processing QUIT message; rc = [%d]\n", rc);
+       return rc;
+}
+
+/**
+ * ecryptfs_receive_nl_message
+ *
+ * Callback function called by netlink system when a message arrives.
+ * If the message looks to be valid, then an attempt is made to assign
+ * it to its desired netlink context element and wake up the process
+ * that is waiting for a response.
+ */
+static void ecryptfs_receive_nl_message(struct sock *sk, int len)
+{
+       struct sk_buff *skb;
+       struct nlmsghdr *nlh;
+       int rc = 0;     /* skb_recv_datagram requires this */
+
+receive:
+       skb = skb_recv_datagram(sk, 0, 0, &rc);
+       if (rc == -EINTR)
+               goto receive;
+       else if (rc < 0) {
+               ecryptfs_printk(KERN_ERR, "Error occurred while "
+                               "receiving eCryptfs netlink message; "
+                               "rc = [%d]\n", rc);
+               return;
+       }
+       nlh = (struct nlmsghdr *)skb->data;
+       if (!NLMSG_OK(nlh, skb->len)) {
+               ecryptfs_printk(KERN_ERR, "Received corrupt netlink "
+                               "message\n");
+               goto free;
+       }
+       switch (nlh->nlmsg_type) {
+               case ECRYPTFS_NLMSG_RESPONSE:
+                       if (ecryptfs_process_nl_response(skb)) {
+                               ecryptfs_printk(KERN_WARNING, "Failed to "
+                                               "deliver netlink response to "
+                                               "requesting operation\n");
+                       }
+                       break;
+               case ECRYPTFS_NLMSG_HELO:
+                       if (ecryptfs_process_nl_helo(skb)) {
+                               ecryptfs_printk(KERN_WARNING, "Failed to "
+                                               "fulfill HELO request\n");
+                       }
+                       break;
+               case ECRYPTFS_NLMSG_QUIT:
+                       if (ecryptfs_process_nl_quit(skb)) {
+                               ecryptfs_printk(KERN_WARNING, "Failed to "
+                                               "fulfill QUIT request\n");
+                       }
+                       break;
+               default:
+                       ecryptfs_printk(KERN_WARNING, "Dropping netlink "
+                                       "message of unrecognized type [%d]\n",
+                                       nlh->nlmsg_type);
+                       break;
+       }
+free:
+       kfree_skb(skb);
+}
+
+/**
+ * ecryptfs_init_netlink
+ *
+ * Initializes the daemon id hash list, netlink context array, and
+ * necessary locks.  Returns zero upon success; non-zero upon error.
+ */
+int ecryptfs_init_netlink(void)
+{
+       int rc;
+
+       ecryptfs_nl_sock = netlink_kernel_create(NETLINK_ECRYPTFS, 0,
+                                                ecryptfs_receive_nl_message,
+                                                THIS_MODULE);
+       if (!ecryptfs_nl_sock) {
+               rc = -EIO;
+               ecryptfs_printk(KERN_ERR, "Failed to create netlink socket\n");
+               goto out;
+       }
+       ecryptfs_nl_sock->sk_sndtimeo = ECRYPTFS_DEFAULT_SEND_TIMEOUT;
+       rc = 0;
+out:
+       return rc;
+}
+
+/**
+ * ecryptfs_release_netlink
+ *
+ * Frees all memory used by the netlink context array and releases the
+ * netlink socket.
+ */
+void ecryptfs_release_netlink(void)
+{
+       if (ecryptfs_nl_sock && ecryptfs_nl_sock->sk_socket)
+               sock_release(ecryptfs_nl_sock->sk_socket);
+       ecryptfs_nl_sock = NULL;
+}
index eaa5daaf106eec9aebb1271a1e3ae554a813c0a1..7b3f0cc09a6fd4eeaa6157f4eecaba2df6b6a6e1 100644 (file)
@@ -168,7 +168,7 @@ out:
        return rc;
 }
 
-struct super_operations ecryptfs_sops = {
+const struct super_operations ecryptfs_sops = {
        .alloc_inode = ecryptfs_alloc_inode,
        .destroy_inode = ecryptfs_destroy_inode,
        .drop_inode = generic_delete_inode,
index b46c488eefc881d707a99c375b77a741ffbb3b0d..dfb5cb400217c983dba9a6503ca1f098db07758e 100644 (file)
@@ -15,7 +15,7 @@ const struct file_operations efs_dir_operations = {
        .readdir        = efs_readdir,
 };
 
-struct inode_operations efs_dir_inode_operations = {
+const struct inode_operations efs_dir_inode_operations = {
        .lookup         = efs_lookup,
 };
 
index dfebf21289f4904a7ae784e1ab4c57ce97bafd6e..c2235e46edcd6fe12053d6fa4f77626751fc5b69 100644 (file)
@@ -105,7 +105,7 @@ static int efs_remount(struct super_block *sb, int *flags, char *data)
        return 0;
 }
 
-static struct super_operations efs_superblock_operations = {
+static const struct super_operations efs_superblock_operations = {
        .alloc_inode    = efs_alloc_inode,
        .destroy_inode  = efs_destroy_inode,
        .read_inode     = efs_read_inode,
index 11fe93f7363c9dfb0cd05f52992ac0e6dd6bba9c..7e36c6f6f538adaf0bf4559e6de3b49579141c8e 100644 (file)
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -405,12 +405,10 @@ int setup_arg_pages(struct linux_binprm *bprm,
                bprm->loader += stack_base;
        bprm->exec += stack_base;
 
-       mpnt = kmem_cache_alloc(vm_area_cachep, GFP_KERNEL);
+       mpnt = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL);
        if (!mpnt)
                return -ENOMEM;
 
-       memset(mpnt, 0, sizeof(*mpnt));
-
        down_write(&mm->mmap_sem);
        {
                mpnt->vm_mm = mm;
index 0b02ba9642d2e817cb908f0ae10a37c6ae8366c4..e89bfc8cf957f73ae8de1682482464efcb7672ae 100644 (file)
@@ -368,6 +368,14 @@ struct ext2_dir_entry_2 * ext2_find_entry (struct inode * dir,
                }
                if (++n >= npages)
                        n = 0;
+               /* next page is past the blocks we've got */
+               if (unlikely(n > (dir->i_blocks >> (PAGE_CACHE_SHIFT - 9)))) {
+                       ext2_error(dir->i_sb, __FUNCTION__,
+                               "dir %lu size %lld exceeds block count %llu",
+                               dir->i_ino, dir->i_size,
+                               (unsigned long long)dir->i_blocks);
+                       goto out;
+               }
        } while (n != start);
 out:
        return NULL;
index c19ac153f56b72c38d564de76a4616a4f599d9e6..e2a0ea50af1dc6039ad22dc75b62a99ac78002fc 100644 (file)
@@ -158,7 +158,7 @@ extern void ext2_write_super (struct super_block *);
 extern const struct file_operations ext2_dir_operations;
 
 /* file.c */
-extern struct inode_operations ext2_file_inode_operations;
+extern const struct inode_operations ext2_file_inode_operations;
 extern const struct file_operations ext2_file_operations;
 extern const struct file_operations ext2_xip_file_operations;
 
@@ -168,9 +168,9 @@ extern const struct address_space_operations ext2_aops_xip;
 extern const struct address_space_operations ext2_nobh_aops;
 
 /* namei.c */
-extern struct inode_operations ext2_dir_inode_operations;
-extern struct inode_operations ext2_special_inode_operations;
+extern const struct inode_operations ext2_dir_inode_operations;
+extern const struct inode_operations ext2_special_inode_operations;
 
 /* symlink.c */
-extern struct inode_operations ext2_fast_symlink_inode_operations;
-extern struct inode_operations ext2_symlink_inode_operations;
+extern const struct inode_operations ext2_fast_symlink_inode_operations;
+extern const struct inode_operations ext2_symlink_inode_operations;
index 2dba473c524ad33282402305b6b1afe837caf5d3..566d4e2d3852353d4e54032c417b6bd593d72fa2 100644 (file)
@@ -75,7 +75,7 @@ const struct file_operations ext2_xip_file_operations = {
 };
 #endif
 
-struct inode_operations ext2_file_inode_operations = {
+const struct inode_operations ext2_file_inode_operations = {
        .truncate       = ext2_truncate,
 #ifdef CONFIG_EXT2_FS_XATTR
        .setxattr       = generic_setxattr,
index e1af5b4cf80c100c26ce08a559bbdab12de8753b..e69beed839acb9bccbfc9f1f68c6bb2be9fdb5de 100644 (file)
@@ -373,7 +373,7 @@ out:
        return err;
 }
 
-struct inode_operations ext2_dir_inode_operations = {
+const struct inode_operations ext2_dir_inode_operations = {
        .create         = ext2_create,
        .lookup         = ext2_lookup,
        .link           = ext2_link,
@@ -393,7 +393,7 @@ struct inode_operations ext2_dir_inode_operations = {
        .permission     = ext2_permission,
 };
 
-struct inode_operations ext2_special_inode_operations = {
+const struct inode_operations ext2_special_inode_operations = {
 #ifdef CONFIG_EXT2_FS_XATTR
        .setxattr       = generic_setxattr,
        .getxattr       = generic_getxattr,
index 6347c2dbdd819ad405082e83cbaa2966be185d77..a046a419d8afd65a87671a7963da8b2cf3a0b887 100644 (file)
@@ -231,7 +231,7 @@ static ssize_t ext2_quota_read(struct super_block *sb, int type, char *data, siz
 static ssize_t ext2_quota_write(struct super_block *sb, int type, const char *data, size_t len, loff_t off);
 #endif
 
-static struct super_operations ext2_sops = {
+static const struct super_operations ext2_sops = {
        .alloc_inode    = ext2_alloc_inode,
        .destroy_inode  = ext2_destroy_inode,
        .read_inode     = ext2_read_inode,
@@ -708,10 +708,14 @@ static int ext2_fill_super(struct super_block *sb, void *data, int silent)
                set_opt(sbi->s_mount_opt, GRPID);
        if (def_mount_opts & EXT2_DEFM_UID16)
                set_opt(sbi->s_mount_opt, NO_UID32);
+#ifdef CONFIG_EXT2_FS_XATTR
        if (def_mount_opts & EXT2_DEFM_XATTR_USER)
                set_opt(sbi->s_mount_opt, XATTR_USER);
+#endif
+#ifdef CONFIG_EXT2_FS_POSIX_ACL
        if (def_mount_opts & EXT2_DEFM_ACL)
                set_opt(sbi->s_mount_opt, POSIX_ACL);
+#endif
        
        if (le16_to_cpu(sbi->s_es->s_errors) == EXT2_ERRORS_PANIC)
                set_opt(sbi->s_mount_opt, ERRORS_PANIC);
index 1e67d87cfa913b58c648a586235816350481fed5..4e2426e22bbe6377d6f853d9fed196afdd9971cf 100644 (file)
@@ -28,7 +28,7 @@ static void *ext2_follow_link(struct dentry *dentry, struct nameidata *nd)
        return NULL;
 }
 
-struct inode_operations ext2_symlink_inode_operations = {
+const struct inode_operations ext2_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = page_follow_link_light,
        .put_link       = page_put_link,
@@ -40,7 +40,7 @@ struct inode_operations ext2_symlink_inode_operations = {
 #endif
 };
  
-struct inode_operations ext2_fast_symlink_inode_operations = {
+const struct inode_operations ext2_fast_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = ext2_follow_link,
 #ifdef CONFIG_EXT2_FS_XATTR
index 881f6365c41a329724b0a93fec4028eebec66d29..1e6f13864536e7180a465ace2ce6555256d7292f 100644 (file)
@@ -125,7 +125,7 @@ const struct file_operations ext3_file_operations = {
        .splice_write   = generic_file_splice_write,
 };
 
-struct inode_operations ext3_file_inode_operations = {
+const struct inode_operations ext3_file_inode_operations = {
        .truncate       = ext3_truncate,
        .setattr        = ext3_setattr,
 #ifdef CONFIG_EXT3_FS_XATTR
index deeb27b5ba833d25009c33c3c31752fec8d79dd3..c30e149fbd2e682a8f13cdddefee32becb61941c 100644 (file)
@@ -11,7 +11,6 @@
 
 #include <linux/fs.h>
 #include <linux/jbd.h>
-#include <linux/sched.h>
 #include <linux/ext3_fs.h>
 #include <linux/cryptohash.h>
 
index beaf25f5112fd9f427a393bac3b9f12b634e14de..8a824f4ce5c608d231a6862b5a1c86de167d0882 100644 (file)
@@ -947,7 +947,7 @@ out:
 static int ext3_get_block(struct inode *inode, sector_t iblock,
                        struct buffer_head *bh_result, int create)
 {
-       handle_t *handle = journal_current_handle();
+       handle_t *handle = ext3_journal_current_handle();
        int ret = 0;
        unsigned max_blocks = bh_result->b_size >> inode->i_blkbits;
 
@@ -1717,7 +1717,7 @@ static ssize_t ext3_direct_IO(int rw, struct kiocb *iocb,
        /*
         * Reacquire the handle: ext3_get_block() can restart the transaction
         */
-       handle = journal_current_handle();
+       handle = ext3_journal_current_handle();
 
 out_stop:
        if (handle) {
index 4df39c4315e170c64e12ca6755f456d6b19b1e39..49159f13cc1f900d4b514a265ea3e97cbaf811a4 100644 (file)
@@ -1618,21 +1618,6 @@ static int ext3_delete_entry (handle_t *handle,
        return -ENOENT;
 }
 
-/*
- * ext3_mark_inode_dirty is somewhat expensive, so unlike ext2 we
- * do not perform it in these functions.  We perform it at the call site,
- * if it is needed.
- */
-static inline void ext3_inc_count(handle_t *handle, struct inode *inode)
-{
-       inc_nlink(inode);
-}
-
-static inline void ext3_dec_count(handle_t *handle, struct inode *inode)
-{
-       drop_nlink(inode);
-}
-
 static int ext3_add_nondir(handle_t *handle,
                struct dentry *dentry, struct inode *inode)
 {
@@ -1642,7 +1627,7 @@ static int ext3_add_nondir(handle_t *handle,
                d_instantiate(dentry, inode);
                return 0;
        }
-       ext3_dec_count(handle, inode);
+       drop_nlink(inode);
        iput(inode);
        return err;
 }
@@ -2163,7 +2148,7 @@ retry:
                err = __page_symlink(inode, symname, l,
                                mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS);
                if (err) {
-                       ext3_dec_count(handle, inode);
+                       drop_nlink(inode);
                        ext3_mark_inode_dirty(handle, inode);
                        iput (inode);
                        goto out_stop;
@@ -2191,6 +2176,12 @@ static int ext3_link (struct dentry * old_dentry,
 
        if (inode->i_nlink >= EXT3_LINK_MAX)
                return -EMLINK;
+       /*
+        * Return -ENOENT if we've raced with unlink and i_nlink is 0.  Doing
+        * otherwise has the potential to corrupt the orphan inode list.
+        */
+       if (inode->i_nlink == 0)
+               return -ENOENT;
 
 retry:
        handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) +
@@ -2202,7 +2193,7 @@ retry:
                handle->h_sync = 1;
 
        inode->i_ctime = CURRENT_TIME_SEC;
-       ext3_inc_count(handle, inode);
+       inc_nlink(inode);
        atomic_inc(&inode->i_count);
 
        err = ext3_add_nondir(handle, dentry, inode);
@@ -2374,7 +2365,7 @@ end_rename:
 /*
  * directories can handle most operations...
  */
-struct inode_operations ext3_dir_inode_operations = {
+const struct inode_operations ext3_dir_inode_operations = {
        .create         = ext3_create,
        .lookup         = ext3_lookup,
        .link           = ext3_link,
@@ -2394,7 +2385,7 @@ struct inode_operations ext3_dir_inode_operations = {
        .permission     = ext3_permission,
 };
 
-struct inode_operations ext3_special_inode_operations = {
+const struct inode_operations ext3_special_inode_operations = {
        .setattr        = ext3_setattr,
 #ifdef CONFIG_EXT3_FS_XATTR
        .setxattr       = generic_setxattr,
index b73cba12f79c0512cb62362a3d5181217b184e22..ecf89904c1134800e609486cee2c74ff489e1f90 100644 (file)
@@ -11,7 +11,6 @@
 
 #define EXT3FS_DEBUG
 
-#include <linux/sched.h>
 #include <linux/smp_lock.h>
 #include <linux/ext3_jbd.h>
 
index b34886734a44d0417221231ba454bd6aa5aba2a5..4a4fcd6868c7c483ae99be2ac947d7416150bfe6 100644 (file)
@@ -639,7 +639,7 @@ static struct quotactl_ops ext3_qctl_operations = {
 };
 #endif
 
-static struct super_operations ext3_sops = {
+static const struct super_operations ext3_sops = {
        .alloc_inode    = ext3_alloc_inode,
        .destroy_inode  = ext3_destroy_inode,
        .read_inode     = ext3_read_inode,
@@ -1459,10 +1459,14 @@ static int ext3_fill_super (struct super_block *sb, void *data, int silent)
                set_opt(sbi->s_mount_opt, GRPID);
        if (def_mount_opts & EXT3_DEFM_UID16)
                set_opt(sbi->s_mount_opt, NO_UID32);
+#ifdef CONFIG_EXT3_FS_XATTR
        if (def_mount_opts & EXT3_DEFM_XATTR_USER)
                set_opt(sbi->s_mount_opt, XATTR_USER);
+#endif
+#ifdef CONFIG_EXT3_FS_POSIX_ACL
        if (def_mount_opts & EXT3_DEFM_ACL)
                set_opt(sbi->s_mount_opt, POSIX_ACL);
+#endif
        if ((def_mount_opts & EXT3_DEFM_JMODE) == EXT3_DEFM_JMODE_DATA)
                sbi->s_mount_opt |= EXT3_MOUNT_JOURNAL_DATA;
        else if ((def_mount_opts & EXT3_DEFM_JMODE) == EXT3_DEFM_JMODE_ORDERED)
@@ -2344,6 +2348,22 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data)
                                err = -EROFS;
                                goto restore_opts;
                        }
+
+                       /*
+                        * If we have an unprocessed orphan list hanging
+                        * around from a previously readonly bdev mount,
+                        * require a full umount/remount for now.
+                        */
+                       if (es->s_last_orphan) {
+                               printk(KERN_WARNING "EXT3-fs: %s: couldn't "
+                                      "remount RDWR because of unprocessed "
+                                      "orphan inode list.  Please "
+                                      "umount/remount instead.\n",
+                                      sb->s_id);
+                               err = -EINVAL;
+                               goto restore_opts;
+                       }
+
                        /*
                         * Mounting a RDONLY partition read-write, so reread
                         * and store the current valid flag.  (It may have
index 4f79122cde670558c39a6886623c7522286b9854..ff7b4ccd898383715e9db7348bd95e9ce4162cee 100644 (file)
@@ -30,7 +30,7 @@ static void * ext3_follow_link(struct dentry *dentry, struct nameidata *nd)
        return NULL;
 }
 
-struct inode_operations ext3_symlink_inode_operations = {
+const struct inode_operations ext3_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = page_follow_link_light,
        .put_link       = page_put_link,
@@ -42,7 +42,7 @@ struct inode_operations ext3_symlink_inode_operations = {
 #endif
 };
 
-struct inode_operations ext3_fast_symlink_inode_operations = {
+const struct inode_operations ext3_fast_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = ext3_follow_link,
 #ifdef CONFIG_EXT3_FS_XATTR
index 3bbc24b587858b97f6ebb0b492b65091158b77c2..3c6c1fd2be902524eb1901776aa8a0b45db4a167 100644 (file)
@@ -125,7 +125,7 @@ const struct file_operations ext4_file_operations = {
        .splice_write   = generic_file_splice_write,
 };
 
-struct inode_operations ext4_file_inode_operations = {
+const struct inode_operations ext4_file_inode_operations = {
        .truncate       = ext4_truncate,
        .setattr        = ext4_setattr,
 #ifdef CONFIG_EXT4DEV_FS_XATTR
index a67966385e0639a9323c155021ed677993136ba3..1555024e3b36b26a56f8a7c47f191740171f9934 100644 (file)
@@ -11,7 +11,6 @@
 
 #include <linux/fs.h>
 #include <linux/jbd2.h>
-#include <linux/sched.h>
 #include <linux/ext4_fs.h>
 #include <linux/cryptohash.h>
 
index a127cc03c9fa2868739ded1b98c7cd6d0d7ecc8b..fbff4b9e122a91781f84cef27db159b9b8534746 100644 (file)
@@ -946,7 +946,7 @@ out:
 static int ext4_get_block(struct inode *inode, sector_t iblock,
                        struct buffer_head *bh_result, int create)
 {
-       handle_t *handle = journal_current_handle();
+       handle_t *handle = ext4_journal_current_handle();
        int ret = 0;
        unsigned max_blocks = bh_result->b_size >> inode->i_blkbits;
 
@@ -1716,7 +1716,7 @@ static ssize_t ext4_direct_IO(int rw, struct kiocb *iocb,
        /*
         * Reacquire the handle: ext4_get_block() can restart the transaction
         */
-       handle = journal_current_handle();
+       handle = ext4_journal_current_handle();
 
 out_stop:
        if (handle) {
index e5a74a5ac261f228ffaf4b057857f8d03f7a62c2..e7e1d79a7d75496c3f0bff48eb6680a6ff2703e9 100644 (file)
@@ -1616,21 +1616,6 @@ static int ext4_delete_entry (handle_t *handle,
        return -ENOENT;
 }
 
-/*
- * ext4_mark_inode_dirty is somewhat expensive, so unlike ext2 we
- * do not perform it in these functions.  We perform it at the call site,
- * if it is needed.
- */
-static inline void ext4_inc_count(handle_t *handle, struct inode *inode)
-{
-       inc_nlink(inode);
-}
-
-static inline void ext4_dec_count(handle_t *handle, struct inode *inode)
-{
-       drop_nlink(inode);
-}
-
 static int ext4_add_nondir(handle_t *handle,
                struct dentry *dentry, struct inode *inode)
 {
@@ -1640,7 +1625,7 @@ static int ext4_add_nondir(handle_t *handle,
                d_instantiate(dentry, inode);
                return 0;
        }
-       ext4_dec_count(handle, inode);
+       drop_nlink(inode);
        iput(inode);
        return err;
 }
@@ -2161,7 +2146,7 @@ retry:
                err = __page_symlink(inode, symname, l,
                                mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS);
                if (err) {
-                       ext4_dec_count(handle, inode);
+                       drop_nlink(inode);
                        ext4_mark_inode_dirty(handle, inode);
                        iput (inode);
                        goto out_stop;
@@ -2189,6 +2174,12 @@ static int ext4_link (struct dentry * old_dentry,
 
        if (inode->i_nlink >= EXT4_LINK_MAX)
                return -EMLINK;
+       /*
+        * Return -ENOENT if we've raced with unlink and i_nlink is 0.  Doing
+        * otherwise has the potential to corrupt the orphan inode list.
+        */
+       if (inode->i_nlink == 0)
+               return -ENOENT;
 
 retry:
        handle = ext4_journal_start(dir, EXT4_DATA_TRANS_BLOCKS(dir->i_sb) +
@@ -2200,7 +2191,7 @@ retry:
                handle->h_sync = 1;
 
        inode->i_ctime = CURRENT_TIME_SEC;
-       ext4_inc_count(handle, inode);
+       inc_nlink(inode);
        atomic_inc(&inode->i_count);
 
        err = ext4_add_nondir(handle, dentry, inode);
@@ -2372,7 +2363,7 @@ end_rename:
 /*
  * directories can handle most operations...
  */
-struct inode_operations ext4_dir_inode_operations = {
+const struct inode_operations ext4_dir_inode_operations = {
        .create         = ext4_create,
        .lookup         = ext4_lookup,
        .link           = ext4_link,
@@ -2392,7 +2383,7 @@ struct inode_operations ext4_dir_inode_operations = {
        .permission     = ext4_permission,
 };
 
-struct inode_operations ext4_special_inode_operations = {
+const struct inode_operations ext4_special_inode_operations = {
        .setattr        = ext4_setattr,
 #ifdef CONFIG_EXT4DEV_FS_XATTR
        .setxattr       = generic_setxattr,
index 4fe49c3661b286990b76b2bc939325804565f9b6..ea99f6c97f565fe0e2911c8a082265380ad9551c 100644 (file)
@@ -11,7 +11,6 @@
 
 #define EXT4FS_DEBUG
 
-#include <linux/sched.h>
 #include <linux/smp_lock.h>
 #include <linux/ext4_jbd2.h>
 
index 486a641ca71b94fa0ed745a246d57285d01611e1..61c4718e4a5391239191e2043c3a6a3e56e0f0c9 100644 (file)
@@ -690,7 +690,7 @@ static struct quotactl_ops ext4_qctl_operations = {
 };
 #endif
 
-static struct super_operations ext4_sops = {
+static const struct super_operations ext4_sops = {
        .alloc_inode    = ext4_alloc_inode,
        .destroy_inode  = ext4_destroy_inode,
        .read_inode     = ext4_read_inode,
@@ -1518,10 +1518,14 @@ static int ext4_fill_super (struct super_block *sb, void *data, int silent)
                set_opt(sbi->s_mount_opt, GRPID);
        if (def_mount_opts & EXT4_DEFM_UID16)
                set_opt(sbi->s_mount_opt, NO_UID32);
+#ifdef CONFIG_EXT4DEV_FS_XATTR
        if (def_mount_opts & EXT4_DEFM_XATTR_USER)
                set_opt(sbi->s_mount_opt, XATTR_USER);
+#endif
+#ifdef CONFIG_EXT4DEV_FS_POSIX_ACL
        if (def_mount_opts & EXT4_DEFM_ACL)
                set_opt(sbi->s_mount_opt, POSIX_ACL);
+#endif
        if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_DATA)
                sbi->s_mount_opt |= EXT4_MOUNT_JOURNAL_DATA;
        else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_ORDERED)
@@ -2419,6 +2423,22 @@ static int ext4_remount (struct super_block * sb, int * flags, char * data)
                                err = -EROFS;
                                goto restore_opts;
                        }
+
+                       /*
+                        * If we have an unprocessed orphan list hanging
+                        * around from a previously readonly bdev mount,
+                        * require a full umount/remount for now.
+                        */
+                       if (es->s_last_orphan) {
+                               printk(KERN_WARNING "EXT4-fs: %s: couldn't "
+                                      "remount RDWR because of unprocessed "
+                                      "orphan inode list.  Please "
+                                      "umount/remount instead.\n",
+                                      sb->s_id);
+                               err = -EINVAL;
+                               goto restore_opts;
+                       }
+
                        /*
                         * Mounting a RDONLY partition read-write, so reread
                         * and store the current valid flag.  (It may have
index fcf527286d7517999fede004d2e321b1356f0c3a..e6f9da4287c455d5975a87668d90dff7e1dcd766 100644 (file)
@@ -30,7 +30,7 @@ static void * ext4_follow_link(struct dentry *dentry, struct nameidata *nd)
        return NULL;
 }
 
-struct inode_operations ext4_symlink_inode_operations = {
+const struct inode_operations ext4_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = page_follow_link_light,
        .put_link       = page_put_link,
@@ -42,7 +42,7 @@ struct inode_operations ext4_symlink_inode_operations = {
 #endif
 };
 
-struct inode_operations ext4_fast_symlink_inode_operations = {
+const struct inode_operations ext4_fast_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = ext4_follow_link,
 #ifdef CONFIG_EXT4DEV_FS_XATTR
index c1237b70c1fee7c11f06182f67d20b5a9f6a700f..55d3c7461c5b9acb50b851fae64df4a68dcd3d01 100644 (file)
@@ -312,7 +312,7 @@ int fat_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
 }
 EXPORT_SYMBOL_GPL(fat_getattr);
 
-struct inode_operations fat_file_inode_operations = {
+const struct inode_operations fat_file_inode_operations = {
        .truncate       = fat_truncate,
        .setattr        = fat_notify_change,
        .getattr        = fat_getattr,
index a9e4688582a2599a7c1df7f3579aa15fe4632a87..7610735442178f8081a50004ce45977a9e671994 100644 (file)
@@ -618,7 +618,7 @@ int fat_sync_inode(struct inode *inode)
 EXPORT_SYMBOL_GPL(fat_sync_inode);
 
 static int fat_show_options(struct seq_file *m, struct vfsmount *mnt);
-static struct super_operations fat_sops = {
+static const struct super_operations fat_sops = {
        .alloc_inode    = fat_alloc_inode,
        .destroy_inode  = fat_destroy_inode,
        .write_inode    = fat_write_inode,
@@ -1151,7 +1151,7 @@ static int fat_read_root(struct inode *inode)
  * Read the super block of an MS-DOS FS.
  */
 int fat_fill_super(struct super_block *sb, void *data, int silent,
-                  struct inode_operations *fs_dir_inode_ops, int isvfat)
+                  const struct inode_operations *fs_dir_inode_ops, int isvfat)
 {
        struct inode *root_inode = NULL;
        struct buffer_head *bh;
index e3fa77c6ed56dce64e3fe68892022edaa85d0e56..7a4f61aa05f8a63697be13231d69316ef5c365a9 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/kmod.h>
 #include <linux/init.h>
 #include <linux/module.h>
-#include <linux/sched.h>       /* for 'current' */
 #include <asm/uaccess.h>
 
 /*
index 1cf1fe8466a2c9f0efbb28e06e3cfe0c4f21c99e..91ccee8723f7cdd9cbacb3f3a070624e2053ca20 100644 (file)
@@ -62,7 +62,7 @@ extern void                   vxfs_read_inode(struct inode *);
 extern void                    vxfs_clear_inode(struct inode *);
 
 /* vxfs_lookup.c */
-extern struct inode_operations vxfs_dir_inode_ops;
+extern const struct inode_operations   vxfs_dir_inode_ops;
 extern const struct file_operations    vxfs_dir_operations;
 
 /* vxfs_olt.c */
index 4e25f3fbed86c71d7a92722ea00bfbb82711860f..24b5a775ff960493a60df4d6c1cb36bdf54010be 100644 (file)
@@ -48,7 +48,7 @@ static int    vxfs_immed_readpage(struct file *, struct page *);
  * Unliked all other operations we do not go through the pagecache,
  * but do all work directly on the inode.
  */
-struct inode_operations vxfs_immed_symlink_iops = {
+const struct inode_operations vxfs_immed_symlink_iops = {
        .readlink =             generic_readlink,
        .follow_link =          vxfs_immed_follow_link,
 };
index 0b7ae897cb781ab9c55beff17bda465dec9b6a48..098a915fd9a1da65aeb0902350bee828fab46996 100644 (file)
@@ -44,7 +44,7 @@
 extern const struct address_space_operations vxfs_aops;
 extern const struct address_space_operations vxfs_immed_aops;
 
-extern struct inode_operations vxfs_immed_symlink_iops;
+extern const struct inode_operations vxfs_immed_symlink_iops;
 
 struct kmem_cache              *vxfs_inode_cachep;
 
index 3995d7fbedab6b18be5a48d04c1f3edd446527f3..bf86e5444ea6d705a99682b83987b586a40a1e04 100644 (file)
@@ -52,7 +52,7 @@
 static struct dentry * vxfs_lookup(struct inode *, struct dentry *, struct nameidata *);
 static int             vxfs_readdir(struct file *, void *, filldir_t);
 
-struct inode_operations vxfs_dir_inode_ops = {
+const struct inode_operations vxfs_dir_inode_ops = {
        .lookup =               vxfs_lookup,
 };
 
index ac28b0835ffc611a0236f3ba745744ba1ca05390..647d600f0bc82d7399732e83f8c2f71d5ab625b3 100644 (file)
@@ -59,7 +59,7 @@ static void           vxfs_put_super(struct super_block *);
 static int             vxfs_statfs(struct dentry *, struct kstatfs *);
 static int             vxfs_remount(struct super_block *, int *, char *);
 
-static struct super_operations vxfs_super_ops = {
+static const struct super_operations vxfs_super_ops = {
        .read_inode =           vxfs_read_inode,
        .clear_inode =          vxfs_clear_inode,
        .put_super =            vxfs_put_super,
index 1794305f9ed86696f7505afdb90f591f32181e1c..105d4a271e073b0c7d60660057d9716d798f9d1d 100644 (file)
@@ -73,7 +73,7 @@ static struct dentry *fuse_ctl_add_dentry(struct dentry *parent,
                                          struct fuse_conn *fc,
                                          const char *name,
                                          int mode, int nlink,
-                                         struct inode_operations *iop,
+                                         const struct inode_operations *iop,
                                          const struct file_operations *fop)
 {
        struct dentry *dentry;
index 40080477ceb4fa5a2fed48f0da0c446c10614bb5..406bf61ed510ffbe66def51015943de76d1c3094 100644 (file)
@@ -1242,7 +1242,7 @@ static int fuse_removexattr(struct dentry *entry, const char *name)
        return err;
 }
 
-static struct inode_operations fuse_dir_inode_operations = {
+static const struct inode_operations fuse_dir_inode_operations = {
        .lookup         = fuse_lookup,
        .mkdir          = fuse_mkdir,
        .symlink        = fuse_symlink,
@@ -1270,7 +1270,7 @@ static const struct file_operations fuse_dir_operations = {
        .fsync          = fuse_dir_fsync,
 };
 
-static struct inode_operations fuse_common_inode_operations = {
+static const struct inode_operations fuse_common_inode_operations = {
        .setattr        = fuse_setattr,
        .permission     = fuse_permission,
        .getattr        = fuse_getattr,
@@ -1280,7 +1280,7 @@ static struct inode_operations fuse_common_inode_operations = {
        .removexattr    = fuse_removexattr,
 };
 
-static struct inode_operations fuse_symlink_inode_operations = {
+static const struct inode_operations fuse_symlink_inode_operations = {
        .setattr        = fuse_setattr,
        .follow_link    = fuse_follow_link,
        .put_link       = fuse_put_link,
index f63efe1337ece4b2547bc62461436d1c84b58867..2fd06927e851674e14968cda55898ec832ab2ac0 100644 (file)
@@ -69,7 +69,7 @@ void fuse_finish_open(struct inode *inode, struct file *file,
        if (outarg->open_flags & FOPEN_DIRECT_IO)
                file->f_op = &fuse_direct_io_file_operations;
        if (!(outarg->open_flags & FOPEN_KEEP_CACHE))
-               invalidate_inode_pages(inode->i_mapping);
+               invalidate_mapping_pages(inode->i_mapping, 0, -1);
        ff->fh = outarg->fh;
        file->private_data = ff;
 }
index 12450d2b320e771b13b7191403e9c4dd1f8dbf82..5ab8e50e78085823677d6c86075593b2aae92ea3 100644 (file)
@@ -112,7 +112,7 @@ void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr)
 {
        struct fuse_conn *fc = get_fuse_conn(inode);
        if (S_ISREG(inode->i_mode) && i_size_read(inode) != attr->size)
-               invalidate_inode_pages(inode->i_mapping);
+               invalidate_mapping_pages(inode->i_mapping, 0, -1);
 
        inode->i_ino     = attr->ino;
        inode->i_mode    = (inode->i_mode & S_IFMT) + (attr->mode & 07777);
@@ -446,7 +446,7 @@ static struct inode *get_root_inode(struct super_block *sb, unsigned mode)
        return fuse_iget(sb, 1, 0, &attr);
 }
 
-static struct super_operations fuse_super_operations = {
+static const struct super_operations fuse_super_operations = {
        .alloc_inode    = fuse_alloc_inode,
        .destroy_inode  = fuse_destroy_inode,
        .read_inode     = fuse_read_inode,
index 113f6c9110c745c31a6759a613ef628b4a3f68cb..c53a5d2d0590ea0a90fc38ff5d470df88736b57e 100644 (file)
@@ -7,7 +7,6 @@
  * of the GNU General Public License version 2.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
index c93ca8f361b55fa09bcd72cd9a2d21e1a3014393..82a1ac7895a2d02926eaded3be2182b993c1d8bf 100644 (file)
@@ -53,7 +53,6 @@
  * but never before the maximum hash table size has been reached.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/buffer_head.h>
index cd747c00f670363db6f2dbe41164858e56b4778f..c1f44009853f26a65930e28536055f406660494f 100644 (file)
@@ -7,7 +7,6 @@
  * of the GNU General Public License version 2.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
index 0c83c7f4dda85f4d7c12cce58c4cf1dbcb8db9a6..5b83ca6acab1e5f93829722844a7333f43c305fd 100644 (file)
@@ -7,7 +7,6 @@
  * of the GNU General Public License version 2.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
index c4b0391b7aa23cbb5433d2235cc202793cf5797e..46af553555135f362d47a957faeb0418d7f8a46f 100644 (file)
@@ -7,7 +7,6 @@
  * of the GNU General Public License version 2.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
index e30673dd37e017565d801492dda8248754c8e6a8..cfcc39b86a5369287e78b6f658c41374964122ee 100644 (file)
@@ -7,7 +7,6 @@
  * of the GNU General Public License version 2.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
index 3799f19b282f06b422ecff9cc9b02b37acdd00dc..1dd4215b83d02133592033949bced668548102cc 100644 (file)
@@ -264,7 +264,7 @@ static unsigned int dev_poll(struct file *file, poll_table *wait)
        return 0;
 }
 
-static struct file_operations dev_fops = {
+static const struct file_operations dev_fops = {
        .read    = dev_read,
        .write   = dev_write,
        .poll    = dev_poll,
index 7c1a9e22a526e0c0203d8d1426c2125fe81fcf70..6e8a59809abf835e7a14f80a54293ca93a055e53 100644 (file)
@@ -7,7 +7,6 @@
  * of the GNU General Public License version 2.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
index 0e34d9918973126c710c227bf35197bac57c30cc..e62d4f620c5841c73b177f2022324b09442e1a13 100644 (file)
@@ -282,8 +282,7 @@ void gfs2_attach_bufdata(struct gfs2_glock *gl, struct buffer_head *bh,
                return;
        }
 
-       bd = kmem_cache_alloc(gfs2_bufdata_cachep, GFP_NOFS | __GFP_NOFAIL),
-       memset(bd, 0, sizeof(struct gfs2_bufdata));
+       bd = kmem_cache_zalloc(gfs2_bufdata_cachep, GFP_NOFS | __GFP_NOFAIL),
        bd->bd_bh = bh;
        bd->bd_gl = gl;
 
index ef3092e29607c5db08289597305388449ffff7b0..32caecd20300f757671b01e0e972d04a109e9a06 100644 (file)
@@ -7,7 +7,6 @@
  * of the GNU General Public License version 2.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
index f2495f1e21adc0fde6f4a51ff73ff1fa8376bb43..d9ecfd23a49e339e1b74bdc0dc5aab9f3f38fcfb 100644 (file)
@@ -7,7 +7,6 @@
  * of the GNU General Public License version 2.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
index 9187eb174b43a0c91547bbbe36760a8cd9d65789..c6bac6b694204b010cad1bd18460f5fa38b522a5 100644 (file)
@@ -7,7 +7,6 @@
  * of the GNU General Public License version 2.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
index 4855e8cca62269e01b1c5e70433771747c64b95c..1de05b63d43affea74c9c1ebf6d7da81de64d599 100644 (file)
@@ -7,7 +7,6 @@
  * of the GNU General Public License version 2.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
index c996aa739a0515f5c11229591a83805a4abb6f99..b50180e227790115f0e6b12570b0c9bedc14614c 100644 (file)
@@ -7,7 +7,6 @@
  * of the GNU General Public License version 2.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
index f40a84807d75468f5b9a302d9b3bf9d1a07f2618..d85f6e05cb955d99cebcad6aa3bd660871cef49f 100644 (file)
@@ -7,7 +7,6 @@
  * of the GNU General Public License version 2.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
@@ -1115,7 +1114,7 @@ static int gfs2_removexattr(struct dentry *dentry, const char *name)
        return gfs2_ea_remove(GFS2_I(dentry->d_inode), &er);
 }
 
-struct inode_operations gfs2_file_iops = {
+const struct inode_operations gfs2_file_iops = {
        .permission = gfs2_permission,
        .setattr = gfs2_setattr,
        .getattr = gfs2_getattr,
@@ -1125,7 +1124,7 @@ struct inode_operations gfs2_file_iops = {
        .removexattr = gfs2_removexattr,
 };
 
-struct inode_operations gfs2_dev_iops = {
+const struct inode_operations gfs2_dev_iops = {
        .permission = gfs2_permission,
        .setattr = gfs2_setattr,
        .getattr = gfs2_getattr,
@@ -1135,7 +1134,7 @@ struct inode_operations gfs2_dev_iops = {
        .removexattr = gfs2_removexattr,
 };
 
-struct inode_operations gfs2_dir_iops = {
+const struct inode_operations gfs2_dir_iops = {
        .create = gfs2_create,
        .lookup = gfs2_lookup,
        .link = gfs2_link,
@@ -1154,7 +1153,7 @@ struct inode_operations gfs2_dir_iops = {
        .removexattr = gfs2_removexattr,
 };
 
-struct inode_operations gfs2_symlink_iops = {
+const struct inode_operations gfs2_symlink_iops = {
        .readlink = gfs2_readlink,
        .follow_link = gfs2_follow_link,
        .permission = gfs2_permission,
index b15acb4fd34c9bbda673e345c066d74396c2ebb4..34f0caac1a030f2453a7e84df95cc3a6509c4098 100644 (file)
@@ -12,9 +12,9 @@
 
 #include <linux/fs.h>
 
-extern struct inode_operations gfs2_file_iops;
-extern struct inode_operations gfs2_dir_iops;
-extern struct inode_operations gfs2_symlink_iops;
-extern struct inode_operations gfs2_dev_iops;
+extern const struct inode_operations gfs2_file_iops;
+extern const struct inode_operations gfs2_dir_iops;
+extern const struct inode_operations gfs2_symlink_iops;
+extern const struct inode_operations gfs2_dev_iops;
 
 #endif /* __OPS_INODE_DOT_H__ */
index 47369d0112147d8c7fb814234bf2f4cd9bdd80e4..b89999d3a7679cb0c17c30dfd78a750df826cea4 100644 (file)
@@ -468,7 +468,7 @@ static void gfs2_destroy_inode(struct inode *inode)
        kmem_cache_free(gfs2_inode_cachep, inode);
 }
 
-struct super_operations gfs2_super_ops = {
+const struct super_operations gfs2_super_ops = {
        .alloc_inode            = gfs2_alloc_inode,
        .destroy_inode          = gfs2_destroy_inode,
        .write_inode            = gfs2_write_inode,
index 9de73f042f78a53d87449bdbe421413e86fa2eb7..442a274c62724afc31e0f274ec61f4f551539bb9 100644 (file)
@@ -12,6 +12,6 @@
 
 #include <linux/fs.h>
 
-extern struct super_operations gfs2_super_ops;
+extern const struct super_operations gfs2_super_ops;
 
 #endif /* __OPS_SUPER_DOT_H__ */
index 14b380fb060290a77f24a96872e8b6b439707128..aa0dbd2aac1bd31bdd3cb4ebf8265fe9b874d47d 100644 (file)
@@ -7,7 +7,6 @@
  * of the GNU General Public License version 2.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
index d0c806b85c864387cffec4a7a82a9dd8d5deb329..8bc182c7e2ef22c2bad269743f15bab5f27a4914 100644 (file)
@@ -7,7 +7,6 @@
  * of the GNU General Public License version 2.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
index ff0846528d5475cb9cc6ec5021c8aad42a96128c..8d9c08b5c4b600bab2bee1cf635bb9849847740e 100644 (file)
@@ -7,7 +7,6 @@
  * of the GNU General Public License version 2.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
index e5707a9f78c2091901813acee8d4db23a1e06029..601eaa1b9ed63f9c50dc72b104af2985cf01a276 100644 (file)
@@ -7,7 +7,6 @@
  * of the GNU General Public License version 2.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/completion.h>
index e2e0358da335f51503fb8527a32d115c2f56204a..7c69b98a2e45b679cc97b87e00247fa40442c2d8 100644 (file)
@@ -320,7 +320,7 @@ const struct file_operations hfs_dir_operations = {
        .release        = hfs_dir_release,
 };
 
-struct inode_operations hfs_dir_inode_operations = {
+const struct inode_operations hfs_dir_inode_operations = {
        .create         = hfs_create,
        .lookup         = hfs_lookup,
        .unlink         = hfs_unlink,
index 88099ab1a180121449cfc04d7ca3a0d26b9366ef..1445e3a56ed45695428a1633a344c2f5f6462d1b 100644 (file)
@@ -83,8 +83,6 @@
 
 /*======== HFS structures as they appear on the disk ========*/
 
-#define __packed __attribute__ ((packed))
-
 /* Pascal-style string of up to 31 characters */
 struct hfs_name {
        u8 len;
index 735332dfd1b8a70283d1c02b0de09b3272b485d7..147374b6f67525871efd8f7abb8320bd838a3be4 100644 (file)
@@ -170,7 +170,7 @@ extern void hfs_cat_build_key(struct super_block *, btree_key *, u32, struct qst
 
 /* dir.c */
 extern const struct file_operations hfs_dir_operations;
-extern struct inode_operations hfs_dir_inode_operations;
+extern const struct inode_operations hfs_dir_inode_operations;
 
 /* extent.c */
 extern int hfs_ext_keycmp(const btree_key *, const btree_key *);
index 5cb7f8fee8d6501d53e8a1931a07feafb502f8c6..fafcba593871889efb1e193e4b818515e40725ca 100644 (file)
@@ -18,7 +18,7 @@
 #include "btree.h"
 
 static const struct file_operations hfs_file_operations;
-static struct inode_operations hfs_file_inode_operations;
+static const struct inode_operations hfs_file_inode_operations;
 
 /*================ Variable-like macros ================*/
 
@@ -612,7 +612,7 @@ static const struct file_operations hfs_file_operations = {
        .release        = hfs_file_release,
 };
 
-static struct inode_operations hfs_file_inode_operations = {
+static const struct inode_operations hfs_file_inode_operations = {
        .lookup         = hfs_file_lookup,
        .truncate       = hfs_file_truncate,
        .setattr        = hfs_inode_setattr,
index a3698796600439413d4d0536cd9edf8f2184201a..623f509f1d47cfcbbac098372180b93e99150904 100644 (file)
@@ -154,7 +154,7 @@ static void hfs_destroy_inode(struct inode *inode)
        kmem_cache_free(hfs_inode_cachep, HFS_I(inode));
 }
 
-static struct super_operations hfs_super_operations = {
+static const struct super_operations hfs_super_operations = {
        .alloc_inode    = hfs_alloc_inode,
        .destroy_inode  = hfs_destroy_inode,
        .write_inode    = hfs_write_inode,
index f2d7c49ce7595d16ed12e3ae834dbe6e93b54c6d..ba117c445e78d8127e9835fd37a1bd50c07791f0 100644 (file)
@@ -8,7 +8,6 @@
  * Handling of catalog records
  */
 
-#include <linux/sched.h>
 
 #include "hfsplus_fs.h"
 #include "hfsplus_raw.h"
index e886ac8460d375ccda11f4a005aefffe34b60bcd..80b5682a2273446f72ba062bd744f31800f1f36a 100644 (file)
@@ -10,7 +10,6 @@
 
 #include <linux/errno.h>
 #include <linux/fs.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/random.h>
 
@@ -471,7 +470,7 @@ static int hfsplus_rename(struct inode *old_dir, struct dentry *old_dentry,
        return res;
 }
 
-struct inode_operations hfsplus_dir_inode_operations = {
+const struct inode_operations hfsplus_dir_inode_operations = {
        .lookup         = hfsplus_lookup,
        .create         = hfsplus_create,
        .link           = hfsplus_link,
index 49205531a5006b0ce731908628c5d485afeed77c..fe99fe8db61a3cb279885cee2c73cf5743704604 100644 (file)
@@ -15,8 +15,6 @@
 
 #include <linux/types.h>
 
-#define __packed __attribute__ ((packed))
-
 /* Some constants */
 #define HFSPLUS_SECTOR_SIZE        512
 #define HFSPLUS_SECTOR_SHIFT         9
index 75e8c4d8aac35d31ab65bbd01e5bb36d8a86c383..642012ac337013e06acbb74334ce20b3b9915c2f 100644 (file)
@@ -268,10 +268,10 @@ static int hfsplus_file_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-extern struct inode_operations hfsplus_dir_inode_operations;
+extern const struct inode_operations hfsplus_dir_inode_operations;
 extern struct file_operations hfsplus_dir_operations;
 
-static struct inode_operations hfsplus_file_inode_operations = {
+static const struct inode_operations hfsplus_file_inode_operations = {
        .lookup         = hfsplus_file_lookup,
        .truncate       = hfsplus_file_truncate,
        .permission     = hfsplus_permission,
index 0f513c6bf8434adfc311c57e6829e9b3c23663e6..1a97f9293447c559758a1b4b00bdc05e1281e855 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/init.h>
 #include <linux/pagemap.h>
 #include <linux/fs.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/vfs.h>
 #include <linux/nls.h>
@@ -260,7 +259,7 @@ static int hfsplus_remount(struct super_block *sb, int *flags, char *data)
        return 0;
 }
 
-static struct super_operations hfsplus_sops = {
+static const struct super_operations hfsplus_sops = {
        .alloc_inode    = hfsplus_alloc_inode,
        .destroy_inode  = hfsplus_destroy_inode,
        .read_inode     = hfsplus_read_inode,
index 69a376f35a687796fb753d963f0c8df9c818c7d7..e965eb11d76fa4e92034ceb0bcba4e69f1f0271d 100644 (file)
@@ -52,8 +52,8 @@ static int append = 0;
 
 #define HOSTFS_SUPER_MAGIC 0x00c0ffee
 
-static struct inode_operations hostfs_iops;
-static struct inode_operations hostfs_dir_iops;
+static const struct inode_operations hostfs_iops;
+static const struct inode_operations hostfs_dir_iops;
 static const struct address_space_operations hostfs_link_aops;
 
 #ifndef MODULE
@@ -309,7 +309,7 @@ static void hostfs_read_inode(struct inode *inode)
        read_inode(inode);
 }
 
-static struct super_operations hostfs_sbops = {
+static const struct super_operations hostfs_sbops = {
        .alloc_inode    = hostfs_alloc_inode,
        .drop_inode     = generic_delete_inode,
        .delete_inode   = hostfs_delete_inode,
@@ -880,7 +880,7 @@ int hostfs_getattr(struct vfsmount *mnt, struct dentry *dentry,
        return(0);
 }
 
-static struct inode_operations hostfs_iops = {
+static const struct inode_operations hostfs_iops = {
        .create         = hostfs_create,
        .link           = hostfs_link,
        .unlink         = hostfs_unlink,
@@ -894,7 +894,7 @@ static struct inode_operations hostfs_iops = {
        .getattr        = hostfs_getattr,
 };
 
-static struct inode_operations hostfs_dir_iops = {
+static const struct inode_operations hostfs_dir_iops = {
        .create         = hostfs_create,
        .lookup         = hostfs_lookup,
        .link           = hostfs_link,
index fb4c8915010a4a99c9daf905f58522026b37895c..b4eafc0f1e54b40007b9831a6661012cfaa0ebe0 100644 (file)
@@ -132,7 +132,7 @@ const struct file_operations hpfs_file_ops =
        .sendfile       = generic_file_sendfile,
 };
 
-struct inode_operations hpfs_file_iops =
+const struct inode_operations hpfs_file_iops =
 {
        .truncate       = hpfs_truncate,
        .setattr        = hpfs_notify_change,
index 1c07aa82d32787ef3e7751c1f04c11ce0e8e8483..42ff60ccf2a9f63b50643da396b6918a67fa3e10 100644 (file)
@@ -266,7 +266,7 @@ void hpfs_set_ea(struct inode *, struct fnode *, char *, char *, int);
 
 int hpfs_file_fsync(struct file *, struct dentry *, int);
 extern const struct file_operations hpfs_file_ops;
-extern struct inode_operations hpfs_file_iops;
+extern const struct inode_operations hpfs_file_iops;
 extern const struct address_space_operations hpfs_aops;
 
 /* inode.c */
@@ -302,7 +302,7 @@ void hpfs_decide_conv(struct inode *, unsigned char *, unsigned);
 
 /* namei.c */
 
-extern struct inode_operations hpfs_dir_iops;
+extern const struct inode_operations hpfs_dir_iops;
 extern const struct address_space_operations hpfs_symlink_aops;
 
 static inline struct hpfs_inode_info *hpfs_i(struct inode *inode)
index 2507e7393f3c6733ebda781bfea8be1d8459e927..9953cf9a2f16fa1f5b45709c142d2699452c9576 100644 (file)
@@ -659,7 +659,7 @@ end1:
        return err;
 }
 
-struct inode_operations hpfs_dir_iops =
+const struct inode_operations hpfs_dir_iops =
 {
        .create         = hpfs_create,
        .lookup         = hpfs_lookup,
index d4abc1a1d56648b82ab3c8f8d8c8043ab03c95d9..e0174e338526547d24d255578b0b3adb3ced67b5 100644 (file)
@@ -426,7 +426,7 @@ static int hpfs_remount_fs(struct super_block *s, int *flags, char *data)
 
 /* Super operations */
 
-static struct super_operations hpfs_sops =
+static const struct super_operations hpfs_sops =
 {
        .alloc_inode    = hpfs_alloc_inode,
        .destroy_inode  = hpfs_destroy_inode,
index afd340a45da461ea47e7cc4ef4d8736417441511..affb7412125e3598b165a5cb3aad71e90227dec7 100644 (file)
@@ -43,7 +43,7 @@ static inline struct hppfs_inode_info *HPPFS_I(struct inode *inode)
 
 #define HPPFS_SUPER_MAGIC 0xb00000ee
 
-static struct super_operations hppfs_sbops;
+static const struct super_operations hppfs_sbops;
 
 static int is_pid(struct dentry *dentry)
 {
@@ -212,7 +212,7 @@ static struct dentry *hppfs_lookup(struct inode *ino, struct dentry *dentry,
        return(ERR_PTR(err));
 }
 
-static struct inode_operations hppfs_file_iops = {
+static const struct inode_operations hppfs_file_iops = {
 };
 
 static ssize_t read_proc(struct file *file, char __user *buf, ssize_t count,
@@ -649,7 +649,7 @@ static void hppfs_destroy_inode(struct inode *inode)
        kfree(HPPFS_I(inode));
 }
 
-static struct super_operations hppfs_sbops = {
+static const struct super_operations hppfs_sbops = {
        .alloc_inode    = hppfs_alloc_inode,
        .destroy_inode  = hppfs_destroy_inode,
        .read_inode     = hppfs_read_inode,
@@ -693,11 +693,11 @@ static void* hppfs_follow_link(struct dentry *dentry, struct nameidata *nd)
        return ret;
 }
 
-static struct inode_operations hppfs_dir_iops = {
+static const struct inode_operations hppfs_dir_iops = {
        .lookup         = hppfs_lookup,
 };
 
-static struct inode_operations hppfs_link_iops = {
+static const struct inode_operations hppfs_link_iops = {
        .readlink       = hppfs_readlink,
        .follow_link    = hppfs_follow_link,
 };
index e6bd553fdc4cf29214e6f2b3a7fe50817e9e8d80..8c718a3d413f46cd71a9fcf26387842abaf42c84 100644 (file)
 /* some random number */
 #define HUGETLBFS_MAGIC        0x958458f6
 
-static struct super_operations hugetlbfs_ops;
+static const struct super_operations hugetlbfs_ops;
 static const struct address_space_operations hugetlbfs_aops;
 const struct file_operations hugetlbfs_file_operations;
-static struct inode_operations hugetlbfs_dir_inode_operations;
-static struct inode_operations hugetlbfs_inode_operations;
+static const struct inode_operations hugetlbfs_dir_inode_operations;
+static const struct inode_operations hugetlbfs_inode_operations;
 
 static struct backing_dev_info hugetlbfs_backing_dev_info = {
        .ra_pages       = 0,    /* No readahead */
@@ -563,7 +563,7 @@ const struct file_operations hugetlbfs_file_operations = {
        .get_unmapped_area      = hugetlb_get_unmapped_area,
 };
 
-static struct inode_operations hugetlbfs_dir_inode_operations = {
+static const struct inode_operations hugetlbfs_dir_inode_operations = {
        .create         = hugetlbfs_create,
        .lookup         = simple_lookup,
        .link           = simple_link,
@@ -576,11 +576,11 @@ static struct inode_operations hugetlbfs_dir_inode_operations = {
        .setattr        = hugetlbfs_setattr,
 };
 
-static struct inode_operations hugetlbfs_inode_operations = {
+static const struct inode_operations hugetlbfs_inode_operations = {
        .setattr        = hugetlbfs_setattr,
 };
 
-static struct super_operations hugetlbfs_ops = {
+static const struct super_operations hugetlbfs_ops = {
        .alloc_inode    = hugetlbfs_alloc_inode,
        .destroy_inode  = hugetlbfs_destroy_inode,
        .statfs         = hugetlbfs_statfs,
index bf21dc6d0dbd752d243a2d3b6d92d2d554dc0381..5abb097ab1b0d998421cdc1cbad6319e5e04b00a 100644 (file)
@@ -414,7 +414,8 @@ static void prune_icache(int nr_to_scan)
                        __iget(inode);
                        spin_unlock(&inode_lock);
                        if (remove_inode_buffers(inode))
-                               reap += invalidate_inode_pages(&inode->i_data);
+                               reap += invalidate_mapping_pages(&inode->i_data,
+                                                               0, -1);
                        iput(inode);
                        spin_lock(&inode_lock);
 
@@ -709,7 +710,7 @@ EXPORT_SYMBOL(iunique);
 struct inode *igrab(struct inode *inode)
 {
        spin_lock(&inode_lock);
-       if (!(inode->i_state & (I_FREEING|I_WILL_FREE)))
+       if (!(inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE)))
                __iget(inode);
        else
                /*
@@ -999,7 +1000,7 @@ EXPORT_SYMBOL(remove_inode_hash);
  */
 void generic_delete_inode(struct inode *inode)
 {
-       struct super_operations *op = inode->i_sb->s_op;
+       const struct super_operations *op = inode->i_sb->s_op;
 
        list_del_init(&inode->i_list);
        list_del_init(&inode->i_sb_list);
@@ -1092,7 +1093,7 @@ EXPORT_SYMBOL_GPL(generic_drop_inode);
  */
 static inline void iput_final(struct inode *inode)
 {
-       struct super_operations *op = inode->i_sb->s_op;
+       const struct super_operations *op = inode->i_sb->s_op;
        void (*drop)(struct inode *) = generic_drop_inode;
 
        if (op && op->drop_inode)
@@ -1112,7 +1113,7 @@ static inline void iput_final(struct inode *inode)
 void iput(struct inode *inode)
 {
        if (inode) {
-               struct super_operations *op = inode->i_sb->s_op;
+               const struct super_operations *op = inode->i_sb->s_op;
 
                BUG_ON(inode->i_state == I_CLEAR);
 
@@ -1160,11 +1161,9 @@ void touch_atime(struct vfsmount *mnt, struct dentry *dentry)
        struct inode *inode = dentry->d_inode;
        struct timespec now;
 
-       if (IS_RDONLY(inode))
-               return;
        if (inode->i_flags & S_NOATIME)
                return;
-       if (inode->i_sb->s_flags & MS_NOATIME)
+       if (IS_NOATIME(inode))
                return;
        if ((inode->i_sb->s_flags & MS_NODIRATIME) && S_ISDIR(inode->i_mode))
                return;
@@ -1252,33 +1251,6 @@ int inode_needs_sync(struct inode *inode)
 
 EXPORT_SYMBOL(inode_needs_sync);
 
-/*
- *     Quota functions that want to walk the inode lists..
- */
-#ifdef CONFIG_QUOTA
-
-void remove_dquot_ref(struct super_block *sb, int type,
-                       struct list_head *tofree_head)
-{
-       struct inode *inode;
-
-       if (!sb->dq_op)
-               return; /* nothing to do */
-       spin_lock(&inode_lock); /* This lock is for inodes code */
-
-       /*
-        * We don't have to lock against quota code - test IS_QUOTAINIT is
-        * just for speedup...
-        */
-       list_for_each_entry(inode, &sb->s_inodes, i_sb_list)
-               if (!IS_NOQUOTA(inode))
-                       remove_inode_dquot_ref(inode, type, tofree_head);
-
-       spin_unlock(&inode_lock);
-}
-
-#endif
-
 int inode_wait(void *word)
 {
        schedule();
index 55f6da55b7c0ec36f8e76307c512999570103e4e..9f2224f65a18b9df2831ce2d71365f0c283c47b9 100644 (file)
@@ -455,8 +455,16 @@ static ssize_t inotify_read(struct file *file, char __user *buf,
                        break;
 
                kevent = inotify_dev_get_event(dev);
-               if (event_size + kevent->event.len > count)
+               if (event_size + kevent->event.len > count) {
+                       if (ret == 0 && count > 0) {
+                               /*
+                                * could not get a single event because we
+                                * didn't have enough buffer space.
+                                */
+                               ret = -EINVAL;
+                       }
                        break;
+               }
 
                if (copy_to_user(buf, &kevent->event, event_size)) {
                        ret = -EFAULT;
index 89e8da112a75e46cfa6aa6bef831266b07edf835..10d2c211d18b28414aa8b0f26dcfe489fa0ddfe9 100644 (file)
@@ -60,6 +60,7 @@ asmlinkage long sys_ioprio_set(int which, int who, int ioprio)
        int data = IOPRIO_PRIO_DATA(ioprio);
        struct task_struct *p, *g;
        struct user_struct *user;
+       struct pid *pgrp;
        int ret;
 
        switch (class) {
@@ -98,12 +99,14 @@ asmlinkage long sys_ioprio_set(int which, int who, int ioprio)
                        break;
                case IOPRIO_WHO_PGRP:
                        if (!who)
-                               who = process_group(current);
-                       do_each_task_pid(who, PIDTYPE_PGID, p) {
+                               pgrp = task_pgrp(current);
+                       else
+                               pgrp = find_pid(who);
+                       do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
                                ret = set_task_ioprio(p, ioprio);
                                if (ret)
                                        break;
-                       } while_each_task_pid(who, PIDTYPE_PGID, p);
+                       } while_each_pid_task(pgrp, PIDTYPE_PGID, p);
                        break;
                case IOPRIO_WHO_USER:
                        if (!who)
@@ -167,6 +170,7 @@ asmlinkage long sys_ioprio_get(int which, int who)
 {
        struct task_struct *g, *p;
        struct user_struct *user;
+       struct pid *pgrp;
        int ret = -ESRCH;
        int tmpio;
 
@@ -182,8 +186,10 @@ asmlinkage long sys_ioprio_get(int which, int who)
                        break;
                case IOPRIO_WHO_PGRP:
                        if (!who)
-                               who = process_group(current);
-                       do_each_task_pid(who, PIDTYPE_PGID, p) {
+                               pgrp = task_pgrp(current);
+                       else
+                               pgrp = find_pid(who);
+                       do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
                                tmpio = get_task_ioprio(p);
                                if (tmpio < 0)
                                        continue;
@@ -191,7 +197,7 @@ asmlinkage long sys_ioprio_get(int which, int who)
                                        ret = tmpio;
                                else
                                        ret = ioprio_best(ret, tmpio);
-                       } while_each_task_pid(who, PIDTYPE_PGID, p);
+                       } while_each_pid_task(pgrp, PIDTYPE_PGID, p);
                        break;
                case IOPRIO_WHO_USER:
                        if (!who)
index 4af2548f97a97d4b6149208148302886b55933a8..0e94c31cad9bca5879cda7784c57a33a0a55f4ae 100644 (file)
@@ -24,7 +24,7 @@ const struct file_operations isofs_dir_operations =
 /*
  * directories can handle most operations...
  */
-struct inode_operations isofs_dir_inode_operations =
+const struct inode_operations isofs_dir_inode_operations =
 {
        .lookup         = isofs_lookup,
 };
index ea55b6c469ecdc8f0cb97a050f5b1d9ad0d04038..64a96cdfe3a4499f852df2897d7e2532405efa71 100644 (file)
@@ -106,7 +106,7 @@ static int isofs_remount(struct super_block *sb, int *flags, char *data)
        return 0;
 }
 
-static struct super_operations isofs_sops = {
+static const struct super_operations isofs_sops = {
        .alloc_inode    = isofs_alloc_inode,
        .destroy_inode  = isofs_destroy_inode,
        .read_inode     = isofs_read_inode,
index e6308c8b57359e728be75de3e23d9e1b2cb974fb..efe2872cd4e3179067073e98ac6a296776c38117 100644 (file)
@@ -174,7 +174,7 @@ isofs_normalize_block_and_offset(struct iso_directory_record* de,
        }
 }
 
-extern struct inode_operations isofs_dir_inode_operations;
+extern const struct inode_operations isofs_dir_inode_operations;
 extern const struct file_operations isofs_dir_operations;
 extern const struct address_space_operations isofs_symlink_aops;
 extern struct export_operations isofs_export_ops;
index 43baa1afa0218842ce0ded1007cec8d9f8c5ecf5..9602b925da082695adba8fbc64dfcd9197b5c5b2 100644 (file)
 
 static int jffs_remove(struct inode *dir, struct dentry *dentry, int type);
 
-static struct super_operations jffs_ops;
+static const struct super_operations jffs_ops;
 static const struct file_operations jffs_file_operations;
-static struct inode_operations jffs_file_inode_operations;
+static const struct inode_operations jffs_file_inode_operations;
 static const struct file_operations jffs_dir_operations;
-static struct inode_operations jffs_dir_inode_operations;
+static const struct inode_operations jffs_dir_inode_operations;
 static const struct address_space_operations jffs_address_operations;
 
 struct kmem_cache     *node_cache = NULL;
@@ -296,7 +296,7 @@ jffs_setattr(struct dentry *dentry, struct iattr *iattr)
                inode->i_blocks = (inode->i_size + 511) >> 9;
 
                if (len) {
-                       invalidate_inode_pages(inode->i_mapping);
+                       invalidate_mapping_pages(inode->i_mapping, 0, -1);
                }
                inode->i_ctime = CURRENT_TIME_SEC;
                inode->i_mtime = inode->i_ctime;
@@ -1518,7 +1518,7 @@ jffs_file_write(struct file *filp, const char *buf, size_t count,
        }
        inode->i_ctime = inode->i_mtime = CURRENT_TIME_SEC;
        mark_inode_dirty(inode);
-       invalidate_inode_pages(inode->i_mapping);
+       invalidate_mapping_pages(inode->i_mapping, 0, -1);
 
  out_isem:
        return err;
@@ -1642,7 +1642,7 @@ static const struct file_operations jffs_file_operations =
 };
 
 
-static struct inode_operations jffs_file_inode_operations =
+static const struct inode_operations jffs_file_inode_operations =
 {
        .lookup         = jffs_lookup,          /* lookup */
        .setattr        = jffs_setattr,
@@ -1655,7 +1655,7 @@ static const struct file_operations jffs_dir_operations =
 };
 
 
-static struct inode_operations jffs_dir_inode_operations =
+static const struct inode_operations jffs_dir_inode_operations =
 {
        .create         = jffs_create,
        .lookup         = jffs_lookup,
@@ -1774,7 +1774,7 @@ static int jffs_remount(struct super_block *sb, int *flags, char *data)
        return 0;
 }
 
-static struct super_operations jffs_ops =
+static const struct super_operations jffs_ops =
 {
        .read_inode     = jffs_read_inode,
        .delete_inode   = jffs_delete_inode,
index 3681d0728ac7901f2179534ebec0f4d9c88afcf8..0c1fc6e20b4321af24ecb92a22b4cdce926caaa6 100644 (file)
@@ -16,7 +16,6 @@
 #endif
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/zlib.h>
 #include <linux/zutil.h>
index da6034d50718dad0f06bac3c5004f60d0124479d..9fa2e27f06413f7d490ecc552213d99dbe432f73 100644 (file)
@@ -13,7 +13,6 @@
 
 #include <linux/kernel.h>
 #include <linux/slab.h>
-#include <linux/sched.h>
 #include <linux/fs.h>
 #include <linux/crc32.h>
 #include <linux/jffs2.h>
@@ -46,7 +45,7 @@ const struct file_operations jffs2_dir_operations =
 };
 
 
-struct inode_operations jffs2_dir_inode_operations =
+const struct inode_operations jffs2_dir_inode_operations =
 {
        .create =       jffs2_create,
        .lookup =       jffs2_lookup,
index 242875f77cb38261fec2c2da5e35e3db08b15773..e82eeaf7590d59891ae21560307d461786b02e9f 100644 (file)
@@ -54,7 +54,7 @@ const struct file_operations jffs2_file_operations =
 
 /* jffs2_file_inode_operations */
 
-struct inode_operations jffs2_file_inode_operations =
+const struct inode_operations jffs2_file_inode_operations =
 {
        .permission =   jffs2_permission,
        .setattr =      jffs2_setattr,
index 9f41fc01a371b7b1a87d1eff853db3cc46d0018c..e07a0edcdb4f5c7fc24b15028bdfb8d177b8a14e 100644 (file)
@@ -153,11 +153,11 @@ void jffs2_garbage_collect_trigger(struct jffs2_sb_info *c);
 
 /* dir.c */
 extern const struct file_operations jffs2_dir_operations;
-extern struct inode_operations jffs2_dir_inode_operations;
+extern const struct inode_operations jffs2_dir_inode_operations;
 
 /* file.c */
 extern const struct file_operations jffs2_file_operations;
-extern struct inode_operations jffs2_file_inode_operations;
+extern const struct inode_operations jffs2_file_inode_operations;
 extern const struct address_space_operations jffs2_file_address_operations;
 int jffs2_fsync(struct file *, struct dentry *, int);
 int jffs2_do_readpage_unlock (struct inode *inode, struct page *pg);
@@ -166,7 +166,7 @@ int jffs2_do_readpage_unlock (struct inode *inode, struct page *pg);
 int jffs2_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
 
 /* symlink.c */
-extern struct inode_operations jffs2_symlink_inode_operations;
+extern const struct inode_operations jffs2_symlink_inode_operations;
 
 /* fs.c */
 int jffs2_setattr (struct dentry *, struct iattr *);
index 25265965bdc1f67254dc51463510e19af07ec7aa..30f888414ce77f1ce5534d9e23650a2ca8b4f0d3 100644 (file)
@@ -14,7 +14,6 @@
  */
 
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/mtd/mtd.h>
 #include <linux/pagemap.h>
index 08a0e6c49e61d77b4d51b03714108df0b0840462..cc7e8e71ad467c77f326942179c2587b0a125a7f 100644 (file)
@@ -66,7 +66,7 @@ static int jffs2_sync_fs(struct super_block *sb, int wait)
        return 0;
 }
 
-static struct super_operations jffs2_super_operations =
+static const struct super_operations jffs2_super_operations =
 {
        .alloc_inode =  jffs2_alloc_inode,
        .destroy_inode =jffs2_destroy_inode,
index b90d5aa3d96972a14fbd144c933cd894a4df69ca..7e4882c8a7ed2418de322a49952b9f5df8bcf10c 100644 (file)
@@ -20,7 +20,7 @@
 
 static void *jffs2_follow_link(struct dentry *dentry, struct nameidata *nd);
 
-struct inode_operations jffs2_symlink_inode_operations =
+const struct inode_operations jffs2_symlink_inode_operations =
 {
        .readlink =     generic_readlink,
        .follow_link =  jffs2_follow_link,
index aa9132d04920f679c47b2c1d0e1eed56851ded77..f7f8eff19b7b2c4358fc58053b827fb5becd8d37 100644 (file)
@@ -88,7 +88,7 @@ static int jfs_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-struct inode_operations jfs_file_inode_operations = {
+const struct inode_operations jfs_file_inode_operations = {
        .truncate       = jfs_truncate,
        .setxattr       = jfs_setxattr,
        .getxattr       = jfs_getxattr,
index 0d06ccfaff0e7cf69935e556643f6176c99d4c4b..6802837f757ee17c7bc6914e8f2d03228c23f870 100644 (file)
@@ -35,10 +35,10 @@ extern void jfs_set_inode_flags(struct inode *);
 extern int jfs_get_block(struct inode *, sector_t, struct buffer_head *, int);
 
 extern const struct address_space_operations jfs_aops;
-extern struct inode_operations jfs_dir_inode_operations;
+extern const struct inode_operations jfs_dir_inode_operations;
 extern const struct file_operations jfs_dir_operations;
-extern struct inode_operations jfs_file_inode_operations;
+extern const struct inode_operations jfs_file_inode_operations;
 extern const struct file_operations jfs_file_operations;
-extern struct inode_operations jfs_symlink_inode_operations;
+extern const struct inode_operations jfs_symlink_inode_operations;
 extern struct dentry_operations jfs_ci_dentry_operations;
 #endif                         /* _H_JFS_INODE */
index 7ab47561b68df5cbc68c603798cc297a88076b46..41c20477126237384bcf4421a0a6ae42765adbe7 100644 (file)
@@ -1503,7 +1503,7 @@ struct dentry *jfs_get_parent(struct dentry *dentry)
        return parent;
 }
 
-struct inode_operations jfs_dir_inode_operations = {
+const struct inode_operations jfs_dir_inode_operations = {
        .create         = jfs_create,
        .lookup         = jfs_lookup,
        .link           = jfs_link,
index 846ac8f34513e64f49eefc11d446b8b8bfbad37a..52d73d54a931c50024e9658279fa5331a59c3e0d 100644 (file)
@@ -46,7 +46,7 @@ MODULE_LICENSE("GPL");
 
 static struct kmem_cache * jfs_inode_cachep;
 
-static struct super_operations jfs_super_operations;
+static const struct super_operations jfs_super_operations;
 static struct export_operations jfs_export_operations;
 static struct file_system_type jfs_fs_type;
 
@@ -716,7 +716,7 @@ out:
 
 #endif
 
-static struct super_operations jfs_super_operations = {
+static const struct super_operations jfs_super_operations = {
        .alloc_inode    = jfs_alloc_inode,
        .destroy_inode  = jfs_destroy_inode,
        .read_inode     = jfs_read_inode,
index cee43f36f51d526843271398356dfb3bef030ce0..4af1a05aad0af2445658df5cbbf765c61d37b627 100644 (file)
@@ -29,7 +29,7 @@ static void *jfs_follow_link(struct dentry *dentry, struct nameidata *nd)
        return NULL;
 }
 
-struct inode_operations jfs_symlink_inode_operations = {
+const struct inode_operations jfs_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = jfs_follow_link,
        .setxattr       = jfs_setxattr,
index 503898d5c4a748226e2f17e2cd9c8ab4ee081b87..7d487047dbb8814ea1d5f0a01c9e30c630d9a322 100644 (file)
@@ -186,7 +186,7 @@ const struct file_operations simple_dir_operations = {
        .fsync          = simple_sync_file,
 };
 
-struct inode_operations simple_dir_inode_operations = {
+const struct inode_operations simple_dir_inode_operations = {
        .lookup         = simple_lookup,
 };
 
@@ -195,11 +195,11 @@ struct inode_operations simple_dir_inode_operations = {
  * will never be mountable)
  */
 int get_sb_pseudo(struct file_system_type *fs_type, char *name,
-       struct super_operations *ops, unsigned long magic,
+       const struct super_operations *ops, unsigned long magic,
        struct vfsmount *mnt)
 {
        struct super_block *s = sget(fs_type, NULL, set_anon_super, NULL);
-       static struct super_operations default_ops = {.statfs = simple_statfs};
+       static const struct super_operations default_ops = {.statfs = simple_statfs};
        struct dentry *dentry;
        struct inode *root;
        struct qstr d_name = {.name = name, .len = strlen(name)};
index 0b4acc1c5e7da2a87a4f626f957b913dae5faff3..a5c019e1a44762bb63601accb17bb6b7a2671552 100644 (file)
@@ -361,7 +361,6 @@ static int __nlm_async_call(struct nlm_rqst *req, u32 proc, struct rpc_message *
 {
        struct nlm_host *host = req->a_host;
        struct rpc_clnt *clnt;
-       int status = -ENOLCK;
 
        dprintk("lockd: call procedure %d on %s (async)\n",
                        (int)proc, host->h_name);
@@ -373,12 +372,10 @@ static int __nlm_async_call(struct nlm_rqst *req, u32 proc, struct rpc_message *
        msg->rpc_proc = &clnt->cl_procinfo[proc];
 
         /* bootstrap and kick off the async RPC call */
-        status = rpc_call_async(clnt, msg, RPC_TASK_ASYNC, tk_ops, req);
-       if (status == 0)
-               return 0;
+        return rpc_call_async(clnt, msg, RPC_TASK_ASYNC, tk_ops, req);
 out_err:
-       nlm_release_call(req);
-       return status;
+       tk_ops->rpc_release(req);
+       return -ENOLCK;
 }
 
 int nlm_async_call(struct nlm_rqst *req, u32 proc, const struct rpc_call_ops *tk_ops)
index 3d4610c2a2665f9ce7236988f6bd40c52d3623bd..ad21c0713efa705ad7aeb5a18f165a46a934453f 100644 (file)
@@ -9,7 +9,6 @@
  */
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/in.h>
 #include <linux/sunrpc/clnt.h>
@@ -192,7 +191,7 @@ struct nlm_host *
 nlmsvc_lookup_host(struct svc_rqst *rqstp,
                        const char *hostname, int hostname_len)
 {
-       return nlm_lookup_host(1, &rqstp->rq_addr,
+       return nlm_lookup_host(1, svc_addr_in(rqstp),
                               rqstp->rq_prot, rqstp->rq_vers,
                               hostname, hostname_len);
 }
index 8ca18085e68d0e796d0089b3b932aabddf835d3f..50cb8daba4e5c7962282bcdbe6fa55cd7558ea1d 100644 (file)
@@ -141,6 +141,7 @@ lockd(struct svc_rqst *rqstp)
         */
        while ((nlmsvc_users || !signalled()) && nlmsvc_pid == current->pid) {
                long timeout = MAX_SCHEDULE_TIMEOUT;
+               char buf[RPC_MAX_ADDRBUFLEN];
 
                if (signalled()) {
                        flush_signals(current);
@@ -175,11 +176,10 @@ lockd(struct svc_rqst *rqstp)
                        break;
                }
 
-               dprintk("lockd: request from %08x\n",
-                       (unsigned)ntohl(rqstp->rq_addr.sin_addr.s_addr));
+               dprintk("lockd: request from %s\n",
+                               svc_print_addr(rqstp, buf, sizeof(buf)));
 
                svc_process(rqstp);
-
        }
 
        flush_signals(current);
@@ -223,23 +223,29 @@ static int find_socket(struct svc_serv *serv, int proto)
        return found;
 }
 
+/*
+ * Make any sockets that are needed but not present.
+ * If nlm_udpport or nlm_tcpport were set as module
+ * options, make those sockets unconditionally
+ */
 static int make_socks(struct svc_serv *serv, int proto)
 {
-       /* Make any sockets that are needed but not present.
-        * If nlm_udpport or nlm_tcpport were set as module
-        * options, make those sockets unconditionally
-        */
-       static int              warned;
+       static int warned;
        int err = 0;
+
        if (proto == IPPROTO_UDP || nlm_udpport)
                if (!find_socket(serv, IPPROTO_UDP))
-                       err = svc_makesock(serv, IPPROTO_UDP, nlm_udpport);
-       if (err == 0 && (proto == IPPROTO_TCP || nlm_tcpport))
+                       err = svc_makesock(serv, IPPROTO_UDP, nlm_udpport,
+                                               SVC_SOCK_DEFAULTS);
+       if (err >= 0 && (proto == IPPROTO_TCP || nlm_tcpport))
                if (!find_socket(serv, IPPROTO_TCP))
-                       err= svc_makesock(serv, IPPROTO_TCP, nlm_tcpport);
-       if (!err)
+                       err = svc_makesock(serv, IPPROTO_TCP, nlm_tcpport,
+                                               SVC_SOCK_DEFAULTS);
+
+       if (err >= 0) {
                warned = 0;
-       else if (warned++ == 0)
+               err = 0;
+       } else if (warned++ == 0)
                printk(KERN_WARNING
                       "lockd_up: makesock failed, error=%d\n", err);
        return err;
@@ -506,7 +512,7 @@ module_param(nsm_use_hostnames, bool, 0644);
 
 static int __init init_nlm(void)
 {
-       nlm_sysctl_table = register_sysctl_table(nlm_sysctl_root, 0);
+       nlm_sysctl_table = register_sysctl_table(nlm_sysctl_root);
        return nlm_sysctl_table ? 0 : -ENOMEM;
 }
 
index f67146a8199a0a98149407080dd83582357dc52f..47a66aa5d55b479c52a4ec5ce59f6bbb8c84df85 100644 (file)
@@ -224,7 +224,7 @@ nlm4svc_proc_granted(struct svc_rqst *rqstp, struct nlm_args *argp,
        resp->cookie = argp->cookie;
 
        dprintk("lockd: GRANTED       called\n");
-       resp->status = nlmclnt_grant(&rqstp->rq_addr, &argp->lock);
+       resp->status = nlmclnt_grant(svc_addr_in(rqstp), &argp->lock);
        dprintk("lockd: GRANTED       status %d\n", ntohl(resp->status));
        return rpc_success;
 }
@@ -421,15 +421,16 @@ static __be32
 nlm4svc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
                                              void              *resp)
 {
-       struct sockaddr_in      saddr = rqstp->rq_addr;
+       struct sockaddr_in      saddr;
+
+       memcpy(&saddr, svc_addr_in(rqstp), sizeof(saddr));
 
        dprintk("lockd: SM_NOTIFY     called\n");
        if (saddr.sin_addr.s_addr != htonl(INADDR_LOOPBACK)
         || ntohs(saddr.sin_port) >= 1024) {
-               printk(KERN_WARNING
-                       "lockd: rejected NSM callback from %08x:%d\n",
-                       ntohl(rqstp->rq_addr.sin_addr.s_addr),
-                       ntohs(rqstp->rq_addr.sin_port));
+               char buf[RPC_MAX_ADDRBUFLEN];
+               printk(KERN_WARNING "lockd: rejected NSM callback from %s\n",
+                               svc_print_addr(rqstp, buf, sizeof(buf)));
                return rpc_system_err;
        }
 
index c7db0a5bccdc19bcff9134efe7df604e55cdab22..cf51f849e76c86732af645b5ab79ea12a002b021 100644 (file)
@@ -593,9 +593,7 @@ callback:
 
        /* Call the client */
        kref_get(&block->b_count);
-       if (nlm_async_call(block->b_call, NLMPROC_GRANTED_MSG,
-                                               &nlmsvc_grant_ops) < 0)
-               nlmsvc_release_block(block);
+       nlm_async_call(block->b_call, NLMPROC_GRANTED_MSG, &nlmsvc_grant_ops);
 }
 
 /*
index 3707c3a23e9330173b1d50fdbb1548691064f688..31cb48425733033529d4a7e7ba63014773b1226b 100644 (file)
@@ -253,7 +253,7 @@ nlmsvc_proc_granted(struct svc_rqst *rqstp, struct nlm_args *argp,
        resp->cookie = argp->cookie;
 
        dprintk("lockd: GRANTED       called\n");
-       resp->status = nlmclnt_grant(&rqstp->rq_addr, &argp->lock);
+       resp->status = nlmclnt_grant(svc_addr_in(rqstp), &argp->lock);
        dprintk("lockd: GRANTED       status %d\n", ntohl(resp->status));
        return rpc_success;
 }
@@ -452,15 +452,16 @@ static __be32
 nlmsvc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
                                              void              *resp)
 {
-       struct sockaddr_in      saddr = rqstp->rq_addr;
+       struct sockaddr_in      saddr;
+
+       memcpy(&saddr, svc_addr_in(rqstp), sizeof(saddr));
 
        dprintk("lockd: SM_NOTIFY     called\n");
        if (saddr.sin_addr.s_addr != htonl(INADDR_LOOPBACK)
         || ntohs(saddr.sin_port) >= 1024) {
-               printk(KERN_WARNING
-                       "lockd: rejected NSM callback from %08x:%d\n",
-                       ntohl(rqstp->rq_addr.sin_addr.s_addr),
-                       ntohs(rqstp->rq_addr.sin_port));
+               char buf[RPC_MAX_ADDRBUFLEN];
+               printk(KERN_WARNING "lockd: rejected NSM callback from %s\n",
+                               svc_print_addr(rqstp, buf, sizeof(buf)));
                return rpc_system_err;
        }
 
index df6b1075b5494dd380dbe374e0be88239e8b93e8..c4a554df7b7e63bb77c3678c9fb3b9eb8ba725c3 100644 (file)
@@ -26,14 +26,14 @@ static unsigned long count_free(struct buffer_head *map[], unsigned numblocks, _
        for (i=0; i<numblocks-1; i++) {
                if (!(bh=map[i])) 
                        return(0);
-               for (j=0; j<BLOCK_SIZE; j++)
+               for (j=0; j<bh->b_size; j++)
                        sum += nibblemap[bh->b_data[j] & 0xf]
                                + nibblemap[(bh->b_data[j]>>4) & 0xf];
        }
 
        if (numblocks==0 || !(bh=map[numblocks-1]))
                return(0);
-       i = ((numbits-(numblocks-1)*BLOCK_SIZE*8)/16)*2;
+       i = ((numbits - (numblocks-1) * bh->b_size * 8) / 16) * 2;
        for (j=0; j<i; j++) {
                sum += nibblemap[bh->b_data[j] & 0xf]
                        + nibblemap[(bh->b_data[j]>>4) & 0xf];
@@ -48,28 +48,29 @@ static unsigned long count_free(struct buffer_head *map[], unsigned numblocks, _
        return(sum);
 }
 
-void minix_free_block(struct inode * inode, int block)
+void minix_free_block(struct inode *inode, unsigned long block)
 {
-       struct super_block * sb = inode->i_sb;
-       struct minix_sb_info * sbi = minix_sb(sb);
-       struct buffer_head * bh;
-       unsigned int bit,zone;
+       struct super_block *sb = inode->i_sb;
+       struct minix_sb_info *sbi = minix_sb(sb);
+       struct buffer_head *bh;
+       int k = sb->s_blocksize_bits + 3;
+       unsigned long bit, zone;
 
        if (block < sbi->s_firstdatazone || block >= sbi->s_nzones) {
                printk("Trying to free block not in datazone\n");
                return;
        }
        zone = block - sbi->s_firstdatazone + 1;
-       bit = zone & 8191;
-       zone >>= 13;
+       bit = zone & ((1<<k) - 1);
+       zone >>= k;
        if (zone >= sbi->s_zmap_blocks) {
                printk("minix_free_block: nonexistent bitmap buffer\n");
                return;
        }
        bh = sbi->s_zmap[zone];
        lock_kernel();
-       if (!minix_test_and_clear_bit(bit,bh->b_data))
-               printk("free_block (%s:%d): bit already cleared\n",
+       if (!minix_test_and_clear_bit(bit, bh->b_data))
+               printk("minix_free_block (%s:%lu): bit already cleared\n",
                       sb->s_id, block);
        unlock_kernel();
        mark_buffer_dirty(bh);
@@ -79,6 +80,7 @@ void minix_free_block(struct inode * inode, int block)
 int minix_new_block(struct inode * inode)
 {
        struct minix_sb_info *sbi = minix_sb(inode->i_sb);
+       int bits_per_zone = 8 * inode->i_sb->s_blocksize;
        int i;
 
        for (i = 0; i < sbi->s_zmap_blocks; i++) {
@@ -86,11 +88,12 @@ int minix_new_block(struct inode * inode)
                int j;
 
                lock_kernel();
-               if ((j = minix_find_first_zero_bit(bh->b_data, 8192)) < 8192) {
-                       minix_set_bit(j,bh->b_data);
+               j = minix_find_first_zero_bit(bh->b_data, bits_per_zone);
+               if (j < bits_per_zone) {
+                       minix_set_bit(j, bh->b_data);
                        unlock_kernel();
                        mark_buffer_dirty(bh);
-                       j += i*8192 + sbi->s_firstdatazone-1;
+                       j += i * bits_per_zone + sbi->s_firstdatazone-1;
                        if (j < sbi->s_firstdatazone || j >= sbi->s_nzones)
                                break;
                        return j;
@@ -137,6 +140,7 @@ minix_V2_raw_inode(struct super_block *sb, ino_t ino, struct buffer_head **bh)
        int block;
        struct minix_sb_info *sbi = minix_sb(sb);
        struct minix2_inode *p;
+       int minix2_inodes_per_block = sb->s_blocksize / sizeof(struct minix2_inode);
 
        *bh = NULL;
        if (!ino || ino > sbi->s_ninodes) {
@@ -146,14 +150,14 @@ minix_V2_raw_inode(struct super_block *sb, ino_t ino, struct buffer_head **bh)
        }
        ino--;
        block = 2 + sbi->s_imap_blocks + sbi->s_zmap_blocks +
-                ino / MINIX2_INODES_PER_BLOCK;
+                ino / minix2_inodes_per_block;
        *bh = sb_bread(sb, block);
        if (!*bh) {
                printk("Unable to read inode block\n");
                return NULL;
        }
        p = (void *)(*bh)->b_data;
-       return p + ino % MINIX2_INODES_PER_BLOCK;
+       return p + ino % minix2_inodes_per_block;
 }
 
 /* Clear the link count and mode of a deleted inode on disk. */
@@ -185,26 +189,30 @@ static void minix_clear_inode(struct inode *inode)
 
 void minix_free_inode(struct inode * inode)
 {
+       struct super_block *sb = inode->i_sb;
        struct minix_sb_info *sbi = minix_sb(inode->i_sb);
-       struct buffer_head * bh;
-       unsigned long ino;
+       struct buffer_head *bh;
+       int k = sb->s_blocksize_bits + 3;
+       unsigned long ino, bit;
 
        ino = inode->i_ino;
        if (ino < 1 || ino > sbi->s_ninodes) {
                printk("minix_free_inode: inode 0 or nonexistent inode\n");
                goto out;
        }
-       if ((ino >> 13) >= sbi->s_imap_blocks) {
+       bit = ino & ((1<<k) - 1);
+       ino >>= k;
+       if (ino >= sbi->s_imap_blocks) {
                printk("minix_free_inode: nonexistent imap in superblock\n");
                goto out;
        }
 
        minix_clear_inode(inode);       /* clear on-disk copy */
 
-       bh = sbi->s_imap[ino >> 13];
+       bh = sbi->s_imap[ino];
        lock_kernel();
-       if (!minix_test_and_clear_bit(ino & 8191, bh->b_data))
-               printk("minix_free_inode: bit %lu already cleared\n", ino);
+       if (!minix_test_and_clear_bit(bit, bh->b_data))
+               printk("minix_free_inode: bit %lu already cleared\n", bit);
        unlock_kernel();
        mark_buffer_dirty(bh);
  out:
@@ -217,35 +225,38 @@ struct inode * minix_new_inode(const struct inode * dir, int * error)
        struct minix_sb_info *sbi = minix_sb(sb);
        struct inode *inode = new_inode(sb);
        struct buffer_head * bh;
-       int i,j;
+       int bits_per_zone = 8 * sb->s_blocksize;
+       unsigned long j;
+       int i;
 
        if (!inode) {
                *error = -ENOMEM;
                return NULL;
        }
-       j = 8192;
+       j = bits_per_zone;
        bh = NULL;
        *error = -ENOSPC;
        lock_kernel();
        for (i = 0; i < sbi->s_imap_blocks; i++) {
                bh = sbi->s_imap[i];
-               if ((j = minix_find_first_zero_bit(bh->b_data, 8192)) < 8192)
+               j = minix_find_first_zero_bit(bh->b_data, bits_per_zone);
+               if (j < bits_per_zone)
                        break;
        }
-       if (!bh || j >= 8192) {
+       if (!bh || j >= bits_per_zone) {
                unlock_kernel();
                iput(inode);
                return NULL;
        }
-       if (minix_test_and_set_bit(j,bh->b_data)) {     /* shouldn't happen */
-               printk("new_inode: bit already set\n");
+       if (minix_test_and_set_bit(j, bh->b_data)) {    /* shouldn't happen */
                unlock_kernel();
+               printk("minix_new_inode: bit already set\n");
                iput(inode);
                return NULL;
        }
        unlock_kernel();
        mark_buffer_dirty(bh);
-       j += i*8192;
+       j += i * bits_per_zone;
        if (!j || j > sbi->s_ninodes) {
                iput(inode);
                return NULL;
index ab782c4086f5b0c5833780f186634ace32f8439f..cb4cb571fddfc507f20a26b19b341efd8fdb2465 100644 (file)
@@ -4,6 +4,8 @@
  *  Copyright (C) 1991, 1992 Linus Torvalds
  *
  *  minix directory handling functions
+ *
+ *  Updated to filesystem version 3 by Daniel Aragones
  */
 
 #include "minix.h"
@@ -11,6 +13,7 @@
 #include <linux/smp_lock.h>
 
 typedef struct minix_dir_entry minix_dirent;
+typedef struct minix3_dir_entry minix3_dirent;
 
 static int minix_readdir(struct file *, void *, filldir_t);
 
@@ -89,6 +92,8 @@ static int minix_readdir(struct file * filp, void * dirent, filldir_t filldir)
        unsigned long npages = dir_pages(inode);
        struct minix_sb_info *sbi = minix_sb(sb);
        unsigned chunk_size = sbi->s_dirsize;
+       char *name;
+       __u32 inumber;
 
        lock_kernel();
 
@@ -105,16 +110,24 @@ static int minix_readdir(struct file * filp, void * dirent, filldir_t filldir)
                kaddr = (char *)page_address(page);
                p = kaddr+offset;
                limit = kaddr + minix_last_byte(inode, n) - chunk_size;
-               for ( ; p <= limit ; p = minix_next_entry(p, sbi)) {
-                       minix_dirent *de = (minix_dirent *)p;
-                       if (de->inode) {
+               for ( ; p <= limit; p = minix_next_entry(p, sbi)) {
+                       if (sbi->s_version == MINIX_V3) {
+                               minix3_dirent *de3 = (minix3_dirent *)p;
+                               name = de3->name;
+                               inumber = de3->inode;
+                       } else {
+                               minix_dirent *de = (minix_dirent *)p;
+                               name = de->name;
+                               inumber = de->inode;
+                       }
+                       if (inumber) {
                                int over;
-                               unsigned l = strnlen(de->name,sbi->s_namelen);
 
+                               unsigned l = strnlen(name, sbi->s_namelen);
                                offset = p - kaddr;
-                               over = filldir(dirent, de->name, l,
-                                               (n<<PAGE_CACHE_SHIFT) | offset,
-                                               de->inode, DT_UNKNOWN);
+                               over = filldir(dirent, name, l,
+                                       (n << PAGE_CACHE_SHIFT) | offset,
+                                       inumber, DT_UNKNOWN);
                                if (over) {
                                        dir_put_page(page);
                                        goto done;
@@ -156,23 +169,34 @@ minix_dirent *minix_find_entry(struct dentry *dentry, struct page **res_page)
        unsigned long n;
        unsigned long npages = dir_pages(dir);
        struct page *page = NULL;
-       struct minix_dir_entry *de;
+       char *p;
 
+       char *namx;
+       __u32 inumber;
        *res_page = NULL;
 
        for (n = 0; n < npages; n++) {
-               char *kaddr;
+               char *kaddr, *limit;
+
                page = dir_get_page(dir, n);
                if (IS_ERR(page))
                        continue;
 
                kaddr = (char*)page_address(page);
-               de = (struct minix_dir_entry *) kaddr;
-               kaddr += minix_last_byte(dir, n) - sbi->s_dirsize;
-               for ( ; (char *) de <= kaddr ; de = minix_next_entry(de,sbi)) {
-                       if (!de->inode)
+               limit = kaddr + minix_last_byte(dir, n) - sbi->s_dirsize;
+               for (p = kaddr; p <= limit; p = minix_next_entry(p, sbi)) {
+                       if (sbi->s_version == MINIX_V3) {
+                               minix3_dirent *de3 = (minix3_dirent *)p;
+                               namx = de3->name;
+                               inumber = de3->inode;
+                       } else {
+                               minix_dirent *de = (minix_dirent *)p;
+                               namx = de->name;
+                               inumber = de->inode;
+                       }
+                       if (!inumber)
                                continue;
-                       if (namecompare(namelen,sbi->s_namelen,name,de->name))
+                       if (namecompare(namelen, sbi->s_namelen, name, namx))
                                goto found;
                }
                dir_put_page(page);
@@ -181,7 +205,7 @@ minix_dirent *minix_find_entry(struct dentry *dentry, struct page **res_page)
 
 found:
        *res_page = page;
-       return de;
+       return (minix_dirent *)p;
 }
 
 int minix_add_link(struct dentry *dentry, struct inode *inode)
@@ -192,12 +216,15 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
        struct super_block * sb = dir->i_sb;
        struct minix_sb_info * sbi = minix_sb(sb);
        struct page *page = NULL;
-       struct minix_dir_entry * de;
        unsigned long npages = dir_pages(dir);
        unsigned long n;
-       char *kaddr;
+       char *kaddr, *p;
+       minix_dirent *de;
+       minix3_dirent *de3;
        unsigned from, to;
        int err;
+       char *namx = NULL;
+       __u32 inumber;
 
        /*
         * We take care of directory expansion in the same loop
@@ -205,7 +232,7 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
         * to protect that region.
         */
        for (n = 0; n <= npages; n++) {
-               char *dir_end;
+               char *limit, *dir_end;
 
                page = dir_get_page(dir, n);
                err = PTR_ERR(page);
@@ -214,20 +241,30 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
                lock_page(page);
                kaddr = (char*)page_address(page);
                dir_end = kaddr + minix_last_byte(dir, n);
-               de = (minix_dirent *)kaddr;
-               kaddr += PAGE_CACHE_SIZE - sbi->s_dirsize;
-               while ((char *)de <= kaddr) {
-                       if ((char *)de == dir_end) {
+               limit = kaddr + PAGE_CACHE_SIZE - sbi->s_dirsize;
+               for (p = kaddr; p <= limit; p = minix_next_entry(p, sbi)) {
+                       de = (minix_dirent *)p;
+                       de3 = (minix3_dirent *)p;
+                       if (sbi->s_version == MINIX_V3) {
+                               namx = de3->name;
+                               inumber = de3->inode;
+                       } else {
+                               namx = de->name;
+                               inumber = de->inode;
+                       }
+                       if (p == dir_end) {
                                /* We hit i_size */
-                               de->inode = 0;
+                               if (sbi->s_version == MINIX_V3)
+                                       de3->inode = 0;
+                               else
+                                       de->inode = 0;
                                goto got_it;
                        }
-                       if (!de->inode)
+                       if (!inumber)
                                goto got_it;
                        err = -EEXIST;
-                       if (namecompare(namelen,sbi->s_namelen,name,de->name))
+                       if (namecompare(namelen, sbi->s_namelen, name, namx))
                                goto out_unlock;
-                       de = minix_next_entry(de, sbi);
                }
                unlock_page(page);
                dir_put_page(page);
@@ -236,14 +273,19 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
        return -EINVAL;
 
 got_it:
-       from = (char*)de - (char*)page_address(page);
+       from = p - (char*)page_address(page);
        to = from + sbi->s_dirsize;
        err = page->mapping->a_ops->prepare_write(NULL, page, from, to);
        if (err)
                goto out_unlock;
-       memcpy (de->name, name, namelen);
-       memset (de->name + namelen, 0, sbi->s_dirsize - namelen - 2);
-       de->inode = inode->i_ino;
+       memcpy (namx, name, namelen);
+       if (sbi->s_version == MINIX_V3) {
+               memset (namx + namelen, 0, sbi->s_dirsize - namelen - 4);
+               de3->inode = inode->i_ino;
+       } else {
+               memset (namx + namelen, 0, sbi->s_dirsize - namelen - 2);
+               de->inode = inode->i_ino;
+       }
        err = dir_commit_chunk(page, from, to);
        dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC;
        mark_inode_dirty(dir);
@@ -283,8 +325,7 @@ int minix_make_empty(struct inode *inode, struct inode *dir)
 {
        struct address_space *mapping = inode->i_mapping;
        struct page *page = grab_cache_page(mapping, 0);
-       struct minix_sb_info * sbi = minix_sb(inode->i_sb);
-       struct minix_dir_entry * de;
+       struct minix_sb_info *sbi = minix_sb(inode->i_sb);
        char *kaddr;
        int err;
 
@@ -299,12 +340,23 @@ int minix_make_empty(struct inode *inode, struct inode *dir)
        kaddr = kmap_atomic(page, KM_USER0);
        memset(kaddr, 0, PAGE_CACHE_SIZE);
 
-       de = (struct minix_dir_entry *)kaddr;
-       de->inode = inode->i_ino;
-       strcpy(de->name,".");
-       de = minix_next_entry(de, sbi);
-       de->inode = dir->i_ino;
-       strcpy(de->name,"..");
+       if (sbi->s_version == MINIX_V3) {
+               minix3_dirent *de3 = (minix3_dirent *)kaddr;
+
+               de3->inode = inode->i_ino;
+               strcpy(de3->name, ".");
+               de3 = minix_next_entry(de3, sbi);
+               de3->inode = dir->i_ino;
+               strcpy(de3->name, "..");
+       } else {
+               minix_dirent *de = (minix_dirent *)kaddr;
+
+               de->inode = inode->i_ino;
+               strcpy(de->name, ".");
+               de = minix_next_entry(de, sbi);
+               de->inode = dir->i_ino;
+               strcpy(de->name, "..");
+       }
        kunmap_atomic(kaddr, KM_USER0);
 
        err = dir_commit_chunk(page, 0, 2 * sbi->s_dirsize);
@@ -321,33 +373,41 @@ int minix_empty_dir(struct inode * inode)
        struct page *page = NULL;
        unsigned long i, npages = dir_pages(inode);
        struct minix_sb_info *sbi = minix_sb(inode->i_sb);
+       char *name;
+       __u32 inumber;
 
        for (i = 0; i < npages; i++) {
-               char *kaddr;
-               minix_dirent * de;
-               page = dir_get_page(inode, i);
+               char *p, *kaddr, *limit;
 
+               page = dir_get_page(inode, i);
                if (IS_ERR(page))
                        continue;
 
                kaddr = (char *)page_address(page);
-               de = (minix_dirent *)kaddr;
-               kaddr += minix_last_byte(inode, i) - sbi->s_dirsize;
+               limit = kaddr + minix_last_byte(inode, i) - sbi->s_dirsize;
+               for (p = kaddr; p <= limit; p = minix_next_entry(p, sbi)) {
+                       if (sbi->s_version == MINIX_V3) {
+                               minix3_dirent *de3 = (minix3_dirent *)p;
+                               name = de3->name;
+                               inumber = de3->inode;
+                       } else {
+                               minix_dirent *de = (minix_dirent *)p;
+                               name = de->name;
+                               inumber = de->inode;
+                       }
 
-               while ((char *)de <= kaddr) {
-                       if (de->inode != 0) {
+                       if (inumber != 0) {
                                /* check for . and .. */
-                               if (de->name[0] != '.')
+                               if (name[0] != '.')
                                        goto not_empty;
-                               if (!de->name[1]) {
-                                       if (de->inode != inode->i_ino)
+                               if (!name[1]) {
+                                       if (inumber != inode->i_ino)
                                                goto not_empty;
-                               } else if (de->name[1] != '.')
+                               } else if (name[1] != '.')
                                        goto not_empty;
-                               else if (de->name[2])
+                               else if (name[2])
                                        goto not_empty;
                        }
-                       de = minix_next_entry(de, sbi);
                }
                dir_put_page(page);
        }
index 40eac2e60d25deb803bebfbd4712e5caae5a65b6..f92baa1d757053cd7f1b3964bf73cafcd74f7047 100644 (file)
@@ -26,7 +26,7 @@ const struct file_operations minix_file_operations = {
        .sendfile       = generic_file_sendfile,
 };
 
-struct inode_operations minix_file_inode_operations = {
+const struct inode_operations minix_file_inode_operations = {
        .truncate       = minix_truncate,
        .getattr        = minix_getattr,
 };
index 629e09b38c5cf67b23a4fe1eee0190616f44ccb6..92e383af3709c89dc14531a05856684ff809d9cf 100644 (file)
@@ -7,6 +7,7 @@
  *     Minix V2 fs support.
  *
  *  Modified for 680x0 by Andreas Schwab
+ *  Updated to filesystem version 3 by Daniel Aragones
  */
 
 #include <linux/module.h>
@@ -36,7 +37,8 @@ static void minix_put_super(struct super_block *sb)
        struct minix_sb_info *sbi = minix_sb(sb);
 
        if (!(sb->s_flags & MS_RDONLY)) {
-               sbi->s_ms->s_state = sbi->s_mount_state;
+               if (sbi->s_version != MINIX_V3)  /* s_state is now out from V3 sb */
+                       sbi->s_ms->s_state = sbi->s_mount_state;
                mark_buffer_dirty(sbi->s_sbh);
        }
        for (i = 0; i < sbi->s_imap_blocks; i++)
@@ -93,7 +95,7 @@ static void destroy_inodecache(void)
        kmem_cache_destroy(minix_inode_cachep);
 }
 
-static struct super_operations minix_sops = {
+static const struct super_operations minix_sops = {
        .alloc_inode    = minix_alloc_inode,
        .destroy_inode  = minix_destroy_inode,
        .read_inode     = minix_read_inode,
@@ -117,12 +119,17 @@ static int minix_remount (struct super_block * sb, int * flags, char * data)
                    !(sbi->s_mount_state & MINIX_VALID_FS))
                        return 0;
                /* Mounting a rw partition read-only. */
-               ms->s_state = sbi->s_mount_state;
+               if (sbi->s_version != MINIX_V3)
+                       ms->s_state = sbi->s_mount_state;
                mark_buffer_dirty(sbi->s_sbh);
        } else {
                /* Mount a partition which is read-only, read-write. */
-               sbi->s_mount_state = ms->s_state;
-               ms->s_state &= ~MINIX_VALID_FS;
+               if (sbi->s_version != MINIX_V3) {
+                       sbi->s_mount_state = ms->s_state;
+                       ms->s_state &= ~MINIX_VALID_FS;
+               } else {
+                       sbi->s_mount_state = MINIX_VALID_FS;
+               }
                mark_buffer_dirty(sbi->s_sbh);
 
                if (!(sbi->s_mount_state & MINIX_VALID_FS))
@@ -140,7 +147,8 @@ static int minix_fill_super(struct super_block *s, void *data, int silent)
        struct buffer_head *bh;
        struct buffer_head **map;
        struct minix_super_block *ms;
-       int i, block;
+       struct minix3_super_block *m3s = NULL;
+       unsigned long i, block;
        struct inode *root_inode;
        struct minix_sb_info *sbi;
 
@@ -192,6 +200,22 @@ static int minix_fill_super(struct super_block *s, void *data, int silent)
                sbi->s_dirsize = 32;
                sbi->s_namelen = 30;
                sbi->s_link_max = MINIX2_LINK_MAX;
+       } else if ( *(__u16 *)(bh->b_data + 24) == MINIX3_SUPER_MAGIC) {
+               m3s = (struct minix3_super_block *) bh->b_data;
+               s->s_magic = m3s->s_magic;
+               sbi->s_imap_blocks = m3s->s_imap_blocks;
+               sbi->s_zmap_blocks = m3s->s_zmap_blocks;
+               sbi->s_firstdatazone = m3s->s_firstdatazone;
+               sbi->s_log_zone_size = m3s->s_log_zone_size;
+               sbi->s_max_size = m3s->s_max_size;
+               sbi->s_ninodes = m3s->s_ninodes;
+               sbi->s_nzones = m3s->s_zones;
+               sbi->s_dirsize = 64;
+               sbi->s_namelen = 60;
+               sbi->s_version = MINIX_V3;
+               sbi->s_link_max = MINIX2_LINK_MAX;
+               sbi->s_mount_state = MINIX_VALID_FS;
+               sb_set_blocksize(s, m3s->s_blocksize);
        } else
                goto out_no_fs;
 
@@ -236,7 +260,8 @@ static int minix_fill_super(struct super_block *s, void *data, int silent)
                s->s_root->d_op = &minix_dentry_operations;
 
        if (!(s->s_flags & MS_RDONLY)) {
-               ms->s_state &= ~MINIX_VALID_FS;
+               if (sbi->s_version != MINIX_V3) /* s_state is now out from V3 sb */
+                       ms->s_state &= ~MINIX_VALID_FS;
                mark_buffer_dirty(bh);
        }
        if (!(sbi->s_mount_state & MINIX_VALID_FS))
@@ -278,8 +303,8 @@ out_illegal_sb:
 
 out_no_fs:
        if (!silent)
-               printk("VFS: Can't find a Minix or Minix V2 filesystem "
-                       "on device %s\n", s->s_id);
+               printk("VFS: Can't find a Minix filesystem V1 | V2 | V3 "
+                      "on device %s.\n", s->s_id);
 out_release:
        brelse(bh);
        goto out;
@@ -344,7 +369,7 @@ static const struct address_space_operations minix_aops = {
        .bmap = minix_bmap
 };
 
-static struct inode_operations minix_symlink_inode_operations = {
+static const struct inode_operations minix_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = page_follow_link_light,
        .put_link       = page_put_link,
@@ -537,12 +562,14 @@ int minix_sync_inode(struct inode * inode)
 
 int minix_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
 {
+       struct inode *dir = dentry->d_parent->d_inode;
+       struct super_block *sb = dir->i_sb;
        generic_fillattr(dentry->d_inode, stat);
        if (INODE_VERSION(dentry->d_inode) == MINIX_V1)
-               stat->blocks = (BLOCK_SIZE / 512) * V1_minix_blocks(stat->size);
+               stat->blocks = (BLOCK_SIZE / 512) * V1_minix_blocks(stat->size, sb);
        else
-               stat->blocks = (BLOCK_SIZE / 512) * V2_minix_blocks(stat->size);
-       stat->blksize = BLOCK_SIZE;
+               stat->blocks = (sb->s_blocksize / 512) * V2_minix_blocks(stat->size, sb);
+       stat->blksize = sb->s_blocksize;
        return 0;
 }
 
index 429baf8de105419c49308447d8978348892701b9..a731cabf1540e0d0f12bff4f88ea23d40e78dd7a 100644 (file)
@@ -23,7 +23,7 @@ static inline int verify_chain(Indirect *from, Indirect *to)
 
 static inline block_t *block_end(struct buffer_head *bh)
 {
-       return (block_t *)((char*)bh->b_data + BLOCK_SIZE);
+       return (block_t *)((char*)bh->b_data + bh->b_size);
 }
 
 static inline Indirect *get_branch(struct inode *inode,
@@ -85,7 +85,7 @@ static int alloc_branch(struct inode *inode,
                branch[n].key = cpu_to_block(nr);
                bh = sb_getblk(inode->i_sb, parent);
                lock_buffer(bh);
-               memset(bh->b_data, 0, BLOCK_SIZE);
+               memset(bh->b_data, 0, bh->b_size);
                branch[n].bh = bh;
                branch[n].p = (block_t*) bh->b_data + offsets[n];
                *branch[n].p = branch[n].key;
@@ -292,6 +292,7 @@ static void free_branches(struct inode *inode, block_t *p, block_t *q, int depth
 
 static inline void truncate (struct inode * inode)
 {
+       struct super_block *sb = inode->i_sb;
        block_t *idata = i_data(inode);
        int offsets[DEPTH];
        Indirect chain[DEPTH];
@@ -301,7 +302,7 @@ static inline void truncate (struct inode * inode)
        int first_whole;
        long iblock;
 
-       iblock = (inode->i_size + BLOCK_SIZE-1) >> 10;
+       iblock = (inode->i_size + sb->s_blocksize -1) >> sb->s_blocksize_bits;
        block_truncate_page(inode->i_mapping, inode->i_size, get_block);
 
        n = block_to_path(inode, iblock, offsets);
@@ -346,15 +347,16 @@ do_indirects:
        mark_inode_dirty(inode);
 }
 
-static inline unsigned nblocks(loff_t size)
+static inline unsigned nblocks(loff_t size, struct super_block *sb)
 {
+       int k = sb->s_blocksize_bits - 10;
        unsigned blocks, res, direct = DIRECT, i = DEPTH;
-       blocks = (size + BLOCK_SIZE - 1) >> BLOCK_SIZE_BITS;
+       blocks = (size + sb->s_blocksize - 1) >> (BLOCK_SIZE_BITS + k);
        res = blocks;
        while (--i && blocks > direct) {
                blocks -= direct;
-               blocks += BLOCK_SIZE/sizeof(block_t) - 1;
-               blocks /= BLOCK_SIZE/sizeof(block_t);
+               blocks += sb->s_blocksize/sizeof(block_t) - 1;
+               blocks /= sb->s_blocksize/sizeof(block_t);
                res += blocks;
                direct = 1;
        }
index 656b1347a25bee35577d0d2cb73a190f9f3adac2..1a5f3bf0bcecde761fc78da91ea49a439ed44d99 100644 (file)
@@ -55,7 +55,7 @@ void V1_minix_truncate(struct inode * inode)
        truncate(inode);
 }
 
-unsigned V1_minix_blocks(loff_t size)
+unsigned V1_minix_blocks(loff_t size, struct super_block *sb)
 {
-       return nblocks(size);
+       return nblocks(size, sb);
 }
index 9adcdc754e0fc2da58b7496b472789d41a910445..ad8f0dec4ef46e2b3e6201dea67ddf6a0182ac94 100644 (file)
@@ -23,10 +23,11 @@ static inline block_t *i_data(struct inode *inode)
 static int block_to_path(struct inode * inode, long block, int offsets[DEPTH])
 {
        int n = 0;
+       struct super_block *sb = inode->i_sb;
 
        if (block < 0) {
                printk("minix_bmap: block<0\n");
-       } else if (block >= (minix_sb(inode->i_sb)->s_max_size/BLOCK_SIZE)) {
+       } else if (block >= (minix_sb(inode->i_sb)->s_max_size/sb->s_blocksize)) {
                printk("minix_bmap: block>big\n");
        } else if (block < 7) {
                offsets[n++] = block;
@@ -60,7 +61,7 @@ void V2_minix_truncate(struct inode * inode)
        truncate(inode);
 }
 
-unsigned V2_minix_blocks(loff_t size)
+unsigned V2_minix_blocks(loff_t size, struct super_block *sb)
 {
-       return nblocks(size);
+       return nblocks(size, sb);
 }
index c55b77cdcc8e2af21e447a168e5cbb4ad26c6d42..73ef84f8fb0bb7fff4583b9a96c6b0a81dcee0cb 100644 (file)
@@ -7,11 +7,10 @@
  * truncated. Else they will be disallowed (ENAMETOOLONG).
  */
 #define NO_TRUNCATE 1
-
 #define INODE_VERSION(inode)   minix_sb(inode->i_sb)->s_version
-
 #define MINIX_V1               0x0001          /* original minix fs */
 #define MINIX_V2               0x0002          /* minix V2 fs */
+#define MINIX_V3               0x0003          /* minix V3 fs */
 
 /*
  * minix fs inode data in memory
@@ -52,12 +51,10 @@ extern struct inode * minix_new_inode(const struct inode * dir, int * error);
 extern void minix_free_inode(struct inode * inode);
 extern unsigned long minix_count_free_inodes(struct minix_sb_info *sbi);
 extern int minix_new_block(struct inode * inode);
-extern void minix_free_block(struct inode * inode, int block);
+extern void minix_free_block(struct inode *inode, unsigned long block);
 extern unsigned long minix_count_free_blocks(struct minix_sb_info *sbi);
-
 extern int minix_getattr(struct vfsmount *, struct dentry *, struct kstat *);
 
-extern void V2_minix_truncate(struct inode *);
 extern void V1_minix_truncate(struct inode *);
 extern void V2_minix_truncate(struct inode *);
 extern void minix_truncate(struct inode *);
@@ -65,8 +62,8 @@ extern int minix_sync_inode(struct inode *);
 extern void minix_set_inode(struct inode *, dev_t);
 extern int V1_minix_get_block(struct inode *, long, struct buffer_head *, int);
 extern int V2_minix_get_block(struct inode *, long, struct buffer_head *, int);
-extern unsigned V1_minix_blocks(loff_t);
-extern unsigned V2_minix_blocks(loff_t);
+extern unsigned V1_minix_blocks(loff_t, struct super_block *);
+extern unsigned V2_minix_blocks(loff_t, struct super_block *);
 
 extern struct minix_dir_entry *minix_find_entry(struct dentry*, struct page**);
 extern int minix_add_link(struct dentry*, struct inode*);
@@ -76,11 +73,10 @@ extern int minix_empty_dir(struct inode*);
 extern void minix_set_link(struct minix_dir_entry*, struct page*, struct inode*);
 extern struct minix_dir_entry *minix_dotdot(struct inode*, struct page**);
 extern ino_t minix_inode_by_name(struct dentry*);
-
 extern int minix_sync_file(struct file *, struct dentry *, int);
 
-extern struct inode_operations minix_file_inode_operations;
-extern struct inode_operations minix_dir_inode_operations;
+extern const struct inode_operations minix_file_inode_operations;
+extern const struct inode_operations minix_dir_inode_operations;
 extern const struct file_operations minix_file_operations;
 extern const struct file_operations minix_dir_operations;
 extern struct dentry_operations minix_dentry_operations;
index 299bb66e3bde55a880435c5dee0c315cfbdced0d..f4aa7a9390406b9f27cbd2fc9aaa4ddbc48dcf8d 100644 (file)
@@ -291,7 +291,7 @@ out:
 /*
  * directories can handle most operations...
  */
-struct inode_operations minix_dir_inode_operations = {
+const struct inode_operations minix_dir_inode_operations = {
        .create         = minix_create,
        .lookup         = minix_lookup,
        .link           = minix_link,
index 452461955cbdced2ba1c4df8d936966fbb08e848..30f7d0ae221551b95024ceae92ae9078f30b5484 100644 (file)
@@ -646,7 +646,7 @@ out:
        return err;
 }
 
-static struct inode_operations msdos_dir_inode_operations = {
+static const struct inode_operations msdos_dir_inode_operations = {
        .create         = msdos_create,
        .lookup         = msdos_lookup,
        .unlink         = msdos_unlink,
index e4f108f082303c99023c3b950e8f8f3202551a4c..ee60cc4d3453209723d6f70982e7083d7cb39477 100644 (file)
@@ -2688,10 +2688,11 @@ int __page_symlink(struct inode *inode, const char *symname, int len,
 {
        struct address_space *mapping = inode->i_mapping;
        struct page *page;
-       int err = -ENOMEM;
+       int err;
        char *kaddr;
 
 retry:
+       err = -ENOMEM;
        page = find_or_create_page(mapping, 0, gfp_mask);
        if (!page)
                goto fail;
@@ -2744,7 +2745,7 @@ int page_symlink(struct inode *inode, const char *symname, int len)
                        mapping_gfp_mask(inode->i_mapping));
 }
 
-struct inode_operations page_symlink_inode_operations = {
+const struct inode_operations page_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = page_follow_link_light,
        .put_link       = page_put_link,
index 5ef336c1103c2c4a4ecbb5c9bf96cf8923e15454..fd999cab7b57c07b7729aabb3d96d938e3d8f0d1 100644 (file)
@@ -53,9 +53,8 @@ static inline unsigned long hash(struct vfsmount *mnt, struct dentry *dentry)
 
 struct vfsmount *alloc_vfsmnt(const char *name)
 {
-       struct vfsmount *mnt = kmem_cache_alloc(mnt_cache, GFP_KERNEL);
+       struct vfsmount *mnt = kmem_cache_zalloc(mnt_cache, GFP_KERNEL);
        if (mnt) {
-               memset(mnt, 0, sizeof(struct vfsmount));
                atomic_set(&mnt->mnt_count, 1);
                INIT_LIST_HEAD(&mnt->mnt_hash);
                INIT_LIST_HEAD(&mnt->mnt_child);
index 73747772c3bb23434ea8bdc2cb4a9630fffea3f2..011ef0b6d2d48eb9fcc391fc9180ceb4d34d4f6a 100644 (file)
@@ -58,7 +58,7 @@ const struct file_operations ncp_dir_operations =
 #endif
 };
 
-struct inode_operations ncp_dir_inode_operations =
+const struct inode_operations ncp_dir_inode_operations =
 {
        .create         = ncp_create,
        .lookup         = ncp_lookup,
index b91fea03b1c3e9d0cd50c9eee699c543b0ff6095..6b1f6d27099a8f3a1a962928c543039d662b401e 100644 (file)
@@ -297,7 +297,7 @@ const struct file_operations ncp_file_operations =
        .fsync          = ncp_fsync,
 };
 
-struct inode_operations ncp_file_inode_operations =
+const struct inode_operations ncp_file_inode_operations =
 {
        .setattr        = ncp_notify_change,
 };
index 67a90bf795d57ef439b5fc1b3f46e09cfc6b78f1..14939ddf74f16b0c2fed361fdfb06f685d4c05b6 100644 (file)
@@ -90,7 +90,7 @@ static int ncp_remount(struct super_block *sb, int *flags, char* data)
        return 0;
 }
 
-static struct super_operations ncp_sops =
+static const struct super_operations ncp_sops =
 {
        .alloc_inode    = ncp_alloc_inode,
        .destroy_inode  = ncp_destroy_inode,
@@ -229,7 +229,7 @@ static void ncp_set_attr(struct inode *inode, struct ncp_entry_info *nwinfo)
 }
 
 #if defined(CONFIG_NCPFS_EXTRAS) || defined(CONFIG_NCPFS_NFS_NS)
-static struct inode_operations ncp_symlink_inode_operations = {
+static const struct inode_operations ncp_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = page_follow_link_light,
        .put_link       = page_put_link,
index 7933e2e99dbc2a4d448591aa87d17f937d816619..75f309c8741a066ff8c7b8443452a4b8d98b8740 100644 (file)
@@ -71,6 +71,8 @@ static void nfs_callback_svc(struct svc_rqst *rqstp)
        complete(&nfs_callback_info.started);
 
        for(;;) {
+               char buf[RPC_MAX_ADDRBUFLEN];
+
                if (signalled()) {
                        if (nfs_callback_info.users == 0)
                                break;
@@ -88,8 +90,8 @@ static void nfs_callback_svc(struct svc_rqst *rqstp)
                                        __FUNCTION__, -err);
                        break;
                }
-               dprintk("%s: request from %u.%u.%u.%u\n", __FUNCTION__,
-                               NIPQUAD(rqstp->rq_addr.sin_addr.s_addr));
+               dprintk("%s: request from %s\n", __FUNCTION__,
+                               svc_print_addr(rqstp, buf, sizeof(buf)));
                svc_process(rqstp);
        }
 
@@ -106,7 +108,6 @@ static void nfs_callback_svc(struct svc_rqst *rqstp)
 int nfs_callback_up(void)
 {
        struct svc_serv *serv;
-       struct svc_sock *svsk;
        int ret = 0;
 
        lock_kernel();
@@ -119,17 +120,14 @@ int nfs_callback_up(void)
        ret = -ENOMEM;
        if (!serv)
                goto out_err;
-       /* FIXME: We don't want to register this socket with the portmapper */
-       ret = svc_makesock(serv, IPPROTO_TCP, nfs_callback_set_tcpport);
-       if (ret < 0)
+
+       ret = svc_makesock(serv, IPPROTO_TCP, nfs_callback_set_tcpport,
+                                                       SVC_SOCK_ANONYMOUS);
+       if (ret <= 0)
                goto out_destroy;
-       if (!list_empty(&serv->sv_permsocks)) {
-               svsk = list_entry(serv->sv_permsocks.next,
-                               struct svc_sock, sk_list);
-               nfs_callback_tcpport = ntohs(inet_sk(svsk->sk_sk)->sport);
-               dprintk ("Callback port = 0x%x\n", nfs_callback_tcpport);
-       } else
-               BUG();
+       nfs_callback_tcpport = ret;
+       dprintk("Callback port = 0x%x\n", nfs_callback_tcpport);
+
        ret = svc_create_thread(nfs_callback_svc, serv);
        if (ret < 0)
                goto out_destroy;
@@ -140,6 +138,8 @@ out:
        unlock_kernel();
        return ret;
 out_destroy:
+       dprintk("Couldn't create callback socket or server thread; err = %d\n",
+               ret);
        svc_destroy(serv);
 out_err:
        nfs_callback_info.users--;
@@ -166,15 +166,19 @@ void nfs_callback_down(void)
 
 static int nfs_callback_authenticate(struct svc_rqst *rqstp)
 {
-       struct sockaddr_in *addr = &rqstp->rq_addr;
+       struct sockaddr_in *addr = svc_addr_in(rqstp);
        struct nfs_client *clp;
+       char buf[RPC_MAX_ADDRBUFLEN];
 
        /* Don't talk to strangers */
        clp = nfs_find_client(addr, 4);
        if (clp == NULL)
                return SVC_DROP;
-       dprintk("%s: %u.%u.%u.%u NFSv4 callback!\n", __FUNCTION__, NIPQUAD(addr->sin_addr));
+
+       dprintk("%s: %s NFSv4 callback!\n", __FUNCTION__,
+                       svc_print_addr(rqstp, buf, sizeof(buf)));
        nfs_put_client(clp);
+
        switch (rqstp->rq_authop->flavour) {
                case RPC_AUTH_NULL:
                        if (rqstp->rq_proc != CB_NULL)
index f8ea1f51f59094ad69ac7ec684884f5a05df7312..849a2029975da9ddc1fac7f1da14fb52561c1106 100644 (file)
@@ -176,7 +176,7 @@ static __be32 decode_getattr_args(struct svc_rqst *rqstp, struct xdr_stream *xdr
        status = decode_fh(xdr, &args->fh);
        if (unlikely(status != 0))
                goto out;
-       args->addr = &rqstp->rq_addr;
+       args->addr = svc_addr_in(rqstp);
        status = decode_bitmap(xdr, args->bitmap);
 out:
        dprintk("%s: exit with status = %d\n", __FUNCTION__, status);
@@ -188,7 +188,7 @@ static __be32 decode_recall_args(struct svc_rqst *rqstp, struct xdr_stream *xdr,
        __be32 *p;
        __be32 status;
 
-       args->addr = &rqstp->rq_addr;
+       args->addr = svc_addr_in(rqstp);
        status = decode_stateid(xdr, &args->stateid);
        if (unlikely(status != 0))
                goto out;
index 23ab145daa2d2289cd6721457b3f555a9d16cbaf..2190e6c2792e6f7ed1383f49b1e2f96c6565ef3d 100644 (file)
@@ -394,7 +394,8 @@ static void nfs_init_timeout_values(struct rpc_timeout *to, int proto,
 static int nfs_create_rpc_client(struct nfs_client *clp, int proto,
                                                unsigned int timeo,
                                                unsigned int retrans,
-                                               rpc_authflavor_t flavor)
+                                               rpc_authflavor_t flavor,
+                                               int flags)
 {
        struct rpc_timeout      timeparms;
        struct rpc_clnt         *clnt = NULL;
@@ -407,6 +408,7 @@ static int nfs_create_rpc_client(struct nfs_client *clp, int proto,
                .program        = &nfs_program,
                .version        = clp->rpc_ops->version,
                .authflavor     = flavor,
+               .flags          = flags,
        };
 
        if (!IS_ERR(clp->cl_rpcclient))
@@ -548,7 +550,7 @@ static int nfs_init_client(struct nfs_client *clp, const struct nfs_mount_data *
         * - RFC 2623, sec 2.3.2
         */
        error = nfs_create_rpc_client(clp, proto, data->timeo, data->retrans,
-                       RPC_AUTH_UNIX);
+                                       RPC_AUTH_UNIX, 0);
        if (error < 0)
                goto error;
        nfs_mark_client_ready(clp, NFS_CS_READY);
@@ -868,7 +870,8 @@ static int nfs4_init_client(struct nfs_client *clp,
        /* Check NFS protocol revision and initialize RPC op vector */
        clp->rpc_ops = &nfs_v4_clientops;
 
-       error = nfs_create_rpc_client(clp, proto, timeo, retrans, authflavour);
+       error = nfs_create_rpc_client(clp, proto, timeo, retrans, authflavour,
+                                       RPC_CLNT_CREATE_DISCRTRY);
        if (error < 0)
                goto error;
        memcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr));
@@ -1030,7 +1033,7 @@ error:
  * Create an NFS4 referral server record
  */
 struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data,
-                                              struct nfs_fh *fh)
+                                              struct nfs_fh *mntfh)
 {
        struct nfs_client *parent_client;
        struct nfs_server *server, *parent_server;
@@ -1069,8 +1072,13 @@ struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data,
        BUG_ON(!server->nfs_client->rpc_ops);
        BUG_ON(!server->nfs_client->rpc_ops->file_inode_ops);
 
+       /* Probe the root fh to retrieve its FSID and filehandle */
+       error = nfs4_path_walk(server, mntfh, data->mnt_path);
+       if (error < 0)
+               goto error;
+
        /* probe the filesystem info for this server filesystem */
-       error = nfs_probe_fsinfo(server, fh, &fattr);
+       error = nfs_probe_fsinfo(server, mntfh, &fattr);
        if (error < 0)
                goto error;
 
@@ -1173,7 +1181,7 @@ static struct seq_operations nfs_server_list_ops = {
        .show   = nfs_server_list_show,
 };
 
-static struct file_operations nfs_server_list_fops = {
+static const struct file_operations nfs_server_list_fops = {
        .open           = nfs_server_list_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -1193,7 +1201,7 @@ static struct seq_operations nfs_volume_list_ops = {
        .show   = nfs_volume_list_show,
 };
 
-static struct file_operations nfs_volume_list_fops = {
+static const struct file_operations nfs_volume_list_fops = {
        .open           = nfs_volume_list_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index d9ba8cb0ee75b22b8618f1fe9f75dd13b2cb9259..92d8ec859e224170a20cc24c728b3af582b4c60e 100644 (file)
@@ -65,7 +65,7 @@ const struct file_operations nfs_dir_operations = {
        .fsync          = nfs_fsync_dir,
 };
 
-struct inode_operations nfs_dir_inode_operations = {
+const struct inode_operations nfs_dir_inode_operations = {
        .create         = nfs_create,
        .lookup         = nfs_lookup,
        .link           = nfs_link,
@@ -81,7 +81,7 @@ struct inode_operations nfs_dir_inode_operations = {
 };
 
 #ifdef CONFIG_NFS_V3
-struct inode_operations nfs3_dir_inode_operations = {
+const struct inode_operations nfs3_dir_inode_operations = {
        .create         = nfs_create,
        .lookup         = nfs_lookup,
        .link           = nfs_link,
@@ -104,7 +104,7 @@ struct inode_operations nfs3_dir_inode_operations = {
 #ifdef CONFIG_NFS_V4
 
 static struct dentry *nfs_atomic_lookup(struct inode *, struct dentry *, struct nameidata *);
-struct inode_operations nfs4_dir_inode_operations = {
+const struct inode_operations nfs4_dir_inode_operations = {
        .create         = nfs_create,
        .lookup         = nfs_atomic_lookup,
        .link           = nfs_link,
@@ -637,7 +637,7 @@ int nfs_fsync_dir(struct file *filp, struct dentry *dentry, int datasync)
  * In the case it has, we assume that the dentries are untrustworthy
  * and may need to be looked up again.
  */
-static inline int nfs_check_verifier(struct inode *dir, struct dentry *dentry)
+static int nfs_check_verifier(struct inode *dir, struct dentry *dentry)
 {
        if (IS_ROOT(dentry))
                return 1;
@@ -652,6 +652,12 @@ static inline void nfs_set_verifier(struct dentry * dentry, unsigned long verf)
        dentry->d_fsdata = (void *)verf;
 }
 
+static void nfs_refresh_verifier(struct dentry * dentry, unsigned long verf)
+{
+       if (time_after(verf, (unsigned long)dentry->d_fsdata))
+               nfs_set_verifier(dentry, verf);
+}
+
 /*
  * Whenever an NFS operation succeeds, we know that the dentry
  * is valid, so we update the revalidation timestamp.
@@ -785,7 +791,7 @@ static int nfs_lookup_revalidate(struct dentry * dentry, struct nameidata *nd)
                goto out_bad;
 
        nfs_renew_times(dentry);
-       nfs_set_verifier(dentry, verifier);
+       nfs_refresh_verifier(dentry, verifier);
  out_valid:
        unlock_kernel();
        dput(parent);
@@ -1085,7 +1091,7 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd)
        verifier = nfs_save_change_attribute(dir);
        ret = nfs4_open_revalidate(dir, dentry, openflags, nd);
        if (!ret)
-               nfs_set_verifier(dentry, verifier);
+               nfs_refresh_verifier(dentry, verifier);
        unlock_kernel();
 out:
        dput(parent);
@@ -1123,8 +1129,21 @@ static struct dentry *nfs_readdir_lookup(nfs_readdir_descriptor_t *desc)
        }
        name.hash = full_name_hash(name.name, name.len);
        dentry = d_lookup(parent, &name);
-       if (dentry != NULL)
-               return dentry;
+       if (dentry != NULL) {
+               /* Is this a positive dentry that matches the readdir info? */
+               if (dentry->d_inode != NULL &&
+                               (NFS_FILEID(dentry->d_inode) == entry->ino ||
+                               d_mountpoint(dentry))) {
+                       if (!desc->plus || entry->fh->size == 0)
+                               return dentry;
+                       if (nfs_compare_fh(NFS_FH(dentry->d_inode),
+                                               entry->fh) == 0)
+                               goto out_renew;
+               }
+               /* No, so d_drop to allow one to be created */
+               d_drop(dentry);
+               dput(dentry);
+       }
        if (!desc->plus || !(entry->fattr->valid & NFS_ATTR_FATTR))
                return NULL;
        /* Note: caller is already holding the dir->i_mutex! */
@@ -1149,6 +1168,10 @@ static struct dentry *nfs_readdir_lookup(nfs_readdir_descriptor_t *desc)
        nfs_renew_times(dentry);
        nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
        return dentry;
+out_renew:
+       nfs_renew_times(dentry);
+       nfs_refresh_verifier(dentry, nfs_save_change_attribute(dir));
+       return dentry;
 }
 
 /*
@@ -1443,6 +1466,8 @@ static int nfs_unlink(struct inode *dir, struct dentry *dentry)
        if (atomic_read(&dentry->d_count) > 1) {
                spin_unlock(&dentry->d_lock);
                spin_unlock(&dcache_lock);
+               /* Start asynchronous writeout of the inode */
+               write_inode_now(dentry->d_inode, 0);
                error = nfs_sillyrename(dir, dentry);
                unlock_kernel();
                return error;
@@ -1684,7 +1709,7 @@ out:
        if (!error) {
                d_move(old_dentry, new_dentry);
                nfs_renew_times(new_dentry);
-               nfs_set_verifier(new_dentry, nfs_save_change_attribute(new_dir));
+               nfs_refresh_verifier(new_dentry, nfs_save_change_attribute(new_dir));
        }
 
        /* new dentry created? */
index bd21d7fde650a57722e8afbda83402d352b8e07a..b1c98ea39b72bc430f6aba881aa9d80dc81bd7f3 100644 (file)
@@ -309,7 +309,8 @@ static ssize_t nfs_direct_read_schedule(struct nfs_direct_req *dreq, unsigned lo
 
                rpc_execute(&data->task);
 
-               dfprintk(VFS, "NFS: %5u initiated direct read call (req %s/%Ld, %zu bytes @ offset %Lu)\n",
+               dprintk("NFS: %5u initiated direct read call "
+                       "(req %s/%Ld, %zu bytes @ offset %Lu)\n",
                                data->task.tk_pid,
                                inode->i_sb->s_id,
                                (long long)NFS_FILEID(inode),
@@ -639,7 +640,8 @@ static ssize_t nfs_direct_write_schedule(struct nfs_direct_req *dreq, unsigned l
 
                rpc_execute(&data->task);
 
-               dfprintk(VFS, "NFS: %5u initiated direct write call (req %s/%Ld, %zu bytes @ offset %Lu)\n",
+               dprintk("NFS: %5u initiated direct write call "
+                       "(req %s/%Ld, %zu bytes @ offset %Lu)\n",
                                data->task.tk_pid,
                                inode->i_sb->s_id,
                                (long long)NFS_FILEID(inode),
@@ -797,7 +799,7 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, const struct iovec *iov,
        const char __user *buf = iov[0].iov_base;
        size_t count = iov[0].iov_len;
 
-       dfprintk(VFS, "nfs: direct write(%s/%s, %lu@%Ld)\n",
+       dprintk("nfs: direct write(%s/%s, %lu@%Ld)\n",
                file->f_path.dentry->d_parent->d_name.name,
                file->f_path.dentry->d_name.name,
                (unsigned long) count, (long long) pos);
index 9e4a2b70995a2fc1694b5d34cbb23d88d98c1e15..8e66b5a2d490129bb918a10ecf5e811a7488783e 100644 (file)
@@ -68,14 +68,14 @@ const struct file_operations nfs_file_operations = {
        .check_flags    = nfs_check_flags,
 };
 
-struct inode_operations nfs_file_inode_operations = {
+const struct inode_operations nfs_file_inode_operations = {
        .permission     = nfs_permission,
        .getattr        = nfs_getattr,
        .setattr        = nfs_setattr,
 };
 
 #ifdef CONFIG_NFS_V3
-struct inode_operations nfs3_file_inode_operations = {
+const struct inode_operations nfs3_file_inode_operations = {
        .permission     = nfs_permission,
        .getattr        = nfs_getattr,
        .setattr        = nfs_setattr,
index 8391bd7a83ce46b81b9480f6710e7cbe37512ae3..6ef268f7c300a2458a74e4292efec297b21de3b0 100644 (file)
@@ -135,17 +135,15 @@ int nfs4_path_walk(struct nfs_server *server,
        struct nfs_fh lastfh;
        struct qstr name;
        int ret;
-       //int referral_count = 0;
 
        dprintk("--> nfs4_path_walk(,,%s)\n", path);
 
        fsinfo.fattr = &fattr;
        nfs_fattr_init(&fattr);
 
-       if (*path++ != '/') {
-               dprintk("nfs4_get_root: Path does not begin with a slash\n");
-               return -EINVAL;
-       }
+       /* Eat leading slashes */
+       while (*path == '/')
+               path++;
 
        /* Start by getting the root filehandle from the server */
        ret = server->nfs_client->rpc_ops->getroot(server, mntfh, &fsinfo);
@@ -160,6 +158,7 @@ int nfs4_path_walk(struct nfs_server *server,
                return -ENOTDIR;
        }
 
+       /* FIXME: It is quite valid for the server to return a referral here */
        if (fattr.valid & NFS_ATTR_FATTR_V4_REFERRAL) {
                printk(KERN_ERR "nfs4_get_root:"
                       " getroot obtained referral\n");
@@ -187,6 +186,7 @@ eat_dot_dir:
                goto eat_dot_dir;
        }
 
+       /* FIXME: Why shouldn't the user be able to use ".." in the path? */
        if (path[0] == '.' && path[1] == '.' && (path[2] == '/' || !path[2])
            ) {
                printk(KERN_ERR "nfs4_get_root:"
@@ -212,6 +212,7 @@ eat_dot_dir:
                return -ENOTDIR;
        }
 
+       /* FIXME: Referrals are quite valid here too */
        if (fattr.valid & NFS_ATTR_FATTR_V4_REFERRAL) {
                printk(KERN_ERR "nfs4_get_root:"
                       " lookupfh obtained referral\n");
index d83498282837168fc9d1256f4f72c09f8b33ca40..af53c02f473bd5825ccd1abac7d6a748239eef48 100644 (file)
@@ -65,13 +65,18 @@ nfs_fattr_to_ino_t(struct nfs_fattr *fattr)
 
 int nfs_write_inode(struct inode *inode, int sync)
 {
-       int flags = sync ? FLUSH_SYNC : 0;
        int ret;
 
-       ret = nfs_commit_inode(inode, flags);
-       if (ret < 0)
-               return ret;
-       return 0;
+       if (sync) {
+               ret = filemap_fdatawait(inode->i_mapping);
+               if (ret == 0)
+                       ret = nfs_commit_inode(inode, FLUSH_SYNC);
+       } else
+               ret = nfs_commit_inode(inode, 0);
+       if (ret >= 0)
+               return 0;
+       __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
+       return ret;
 }
 
 void nfs_clear_inode(struct inode *inode)
@@ -235,6 +240,7 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr)
 
        if (inode->i_state & I_NEW) {
                struct nfs_inode *nfsi = NFS_I(inode);
+               unsigned long now = jiffies;
 
                /* We set i_ino for the few things that still rely on it,
                 * such as stat(2) */
@@ -271,7 +277,8 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr)
                        init_special_inode(inode, inode->i_mode, fattr->rdev);
 
                nfsi->read_cache_jiffies = fattr->time_start;
-               nfsi->last_updated = jiffies;
+               nfsi->last_updated = now;
+               nfsi->cache_change_attribute = now;
                inode->i_atime = fattr->atime;
                inode->i_mtime = fattr->mtime;
                inode->i_ctime = fattr->ctime;
@@ -290,7 +297,7 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr)
                        inode->i_blocks = fattr->du.nfs2.blocks;
                }
                nfsi->attrtimeo = NFS_MINATTRTIMEO(inode);
-               nfsi->attrtimeo_timestamp = jiffies;
+               nfsi->attrtimeo_timestamp = now;
                memset(nfsi->cookieverf, 0, sizeof(nfsi->cookieverf));
                nfsi->access_cache = RB_ROOT;
 
@@ -783,20 +790,21 @@ void nfs_end_data_update(struct inode *inode)
 static void nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr *fattr)
 {
        struct nfs_inode *nfsi = NFS_I(inode);
+       unsigned long now = jiffies;
 
        /* If we have atomic WCC data, we may update some attributes */
        if ((fattr->valid & NFS_ATTR_WCC) != 0) {
                if (timespec_equal(&inode->i_ctime, &fattr->pre_ctime)) {
                        memcpy(&inode->i_ctime, &fattr->ctime, sizeof(inode->i_ctime));
-                       nfsi->cache_change_attribute = jiffies;
+                       nfsi->cache_change_attribute = now;
                }
                if (timespec_equal(&inode->i_mtime, &fattr->pre_mtime)) {
                        memcpy(&inode->i_mtime, &fattr->mtime, sizeof(inode->i_mtime));
-                       nfsi->cache_change_attribute = jiffies;
+                       nfsi->cache_change_attribute = now;
                }
                if (inode->i_size == fattr->pre_size && nfsi->npages == 0) {
                        inode->i_size = fattr->size;
-                       nfsi->cache_change_attribute = jiffies;
+                       nfsi->cache_change_attribute = now;
                }
        }
 }
@@ -934,6 +942,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
        struct nfs_inode *nfsi = NFS_I(inode);
        loff_t cur_isize, new_isize;
        unsigned int    invalid = 0;
+       unsigned long now = jiffies;
        int data_stable;
 
        dfprintk(VFS, "NFS: %s(%s/%ld ct=%d info=0x%x)\n",
@@ -959,7 +968,11 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
         * Update the read time so we don't revalidate too often.
         */
        nfsi->read_cache_jiffies = fattr->time_start;
-       nfsi->last_updated = jiffies;
+       nfsi->last_updated = now;
+
+       /* Fix a wraparound issue with nfsi->cache_change_attribute */
+       if (time_before(now, nfsi->cache_change_attribute))
+               nfsi->cache_change_attribute = now - 600*HZ;
 
        /* Are we racing with known updates of the metadata on the server? */
        data_stable = nfs_verify_change_attribute(inode, fattr->time_start);
@@ -985,7 +998,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
                        inode->i_size = new_isize;
                        invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA;
                }
-               nfsi->cache_change_attribute = jiffies;
+               nfsi->cache_change_attribute = now;
                dprintk("NFS: isize change on server for file %s/%ld\n",
                                inode->i_sb->s_id, inode->i_ino);
        }
@@ -996,14 +1009,14 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
                dprintk("NFS: mtime change on server for file %s/%ld\n",
                                inode->i_sb->s_id, inode->i_ino);
                invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA;
-               nfsi->cache_change_attribute = jiffies;
+               nfsi->cache_change_attribute = now;
        }
 
        /* If ctime has changed we should definitely clear access+acl caches */
        if (!timespec_equal(&inode->i_ctime, &fattr->ctime)) {
                invalid |= NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
                memcpy(&inode->i_ctime, &fattr->ctime, sizeof(inode->i_ctime));
-               nfsi->cache_change_attribute = jiffies;
+               nfsi->cache_change_attribute = now;
        }
        memcpy(&inode->i_atime, &fattr->atime, sizeof(inode->i_atime));
 
@@ -1032,18 +1045,18 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
                                inode->i_sb->s_id, inode->i_ino);
                nfsi->change_attr = fattr->change_attr;
                invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
-               nfsi->cache_change_attribute = jiffies;
+               nfsi->cache_change_attribute = now;
        }
 
        /* Update attrtimeo value if we're out of the unstable period */
        if (invalid & NFS_INO_INVALID_ATTR) {
                nfs_inc_stats(inode, NFSIOS_ATTRINVALIDATE);
                nfsi->attrtimeo = NFS_MINATTRTIMEO(inode);
-               nfsi->attrtimeo_timestamp = jiffies;
-       } else if (time_after(jiffies, nfsi->attrtimeo_timestamp+nfsi->attrtimeo)) {
+               nfsi->attrtimeo_timestamp = now;
+       } else if (time_after(now, nfsi->attrtimeo_timestamp+nfsi->attrtimeo)) {
                if ((nfsi->attrtimeo <<= 1) > NFS_MAXATTRTIMEO(inode))
                        nfsi->attrtimeo = NFS_MAXATTRTIMEO(inode);
-               nfsi->attrtimeo_timestamp = jiffies;
+               nfsi->attrtimeo_timestamp = now;
        }
        /* Don't invalidate the data if we were to blame */
        if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)
@@ -1122,7 +1135,6 @@ struct inode *nfs_alloc_inode(struct super_block *sb)
                return NULL;
        nfsi->flags = 0UL;
        nfsi->cache_validity = 0UL;
-       nfsi->cache_change_attribute = jiffies;
 #ifdef CONFIG_NFS_V3_ACL
        nfsi->acl_access = ERR_PTR(-EAGAIN);
        nfsi->acl_default = ERR_PTR(-EAGAIN);
index a28f6ce2e131e4df24e40223ebdc36d7d986da6f..6610f2b0207743a26693a43db49b63b0d8c058b2 100644 (file)
@@ -107,10 +107,6 @@ extern __be32 *nfs4_decode_dirent(__be32 *p, struct nfs_entry *entry, int plus);
 /* nfs4proc.c */
 #ifdef CONFIG_NFS_V4
 extern struct rpc_procinfo nfs4_procedures[];
-
-extern int nfs4_proc_fs_locations(struct inode *dir, struct dentry *dentry,
-                                 struct nfs4_fs_locations *fs_locations,
-                                 struct page *page);
 #endif
 
 /* dir.c */
index 371b804e7cc8a66e2e6f20c00356799e5b6c51cc..7f86e65182e450b528ab7e0a6811ece68c516b56 100644 (file)
@@ -155,12 +155,12 @@ out_follow:
        goto out;
 }
 
-struct inode_operations nfs_mountpoint_inode_operations = {
+const struct inode_operations nfs_mountpoint_inode_operations = {
        .follow_link    = nfs_follow_mountpoint,
        .getattr        = nfs_getattr,
 };
 
-struct inode_operations nfs_referral_inode_operations = {
+const struct inode_operations nfs_referral_inode_operations = {
        .follow_link    = nfs_follow_mountpoint,
 };
 
index acd8fe9762d3fc7abd6c626439dc6cb50105a0b7..7d0371e2bad53228b8d2cbee4e95b9bf3fe75b25 100644 (file)
@@ -253,29 +253,6 @@ static int nfs3_proc_readlink(struct inode *inode, struct page *page,
        return status;
 }
 
-static int nfs3_proc_read(struct nfs_read_data *rdata)
-{
-       int                     flags = rdata->flags;
-       struct inode *          inode = rdata->inode;
-       struct nfs_fattr *      fattr = rdata->res.fattr;
-       struct rpc_message      msg = {
-               .rpc_proc       = &nfs3_procedures[NFS3PROC_READ],
-               .rpc_argp       = &rdata->args,
-               .rpc_resp       = &rdata->res,
-               .rpc_cred       = rdata->cred,
-       };
-       int                     status;
-
-       dprintk("NFS call  read %d @ %Ld\n", rdata->args.count,
-                       (long long) rdata->args.offset);
-       nfs_fattr_init(fattr);
-       status = rpc_call_sync(NFS_CLIENT(inode), &msg, flags);
-       if (status >= 0)
-               nfs_refresh_inode(inode, fattr);
-       dprintk("NFS reply read: %d\n", status);
-       return status;
-}
-
 /*
  * Create a regular file.
  * For now, we don't implement O_EXCL.
@@ -855,7 +832,6 @@ const struct nfs_rpc_ops nfs_v3_clientops = {
        .lookup         = nfs3_proc_lookup,
        .access         = nfs3_proc_access,
        .readlink       = nfs3_proc_readlink,
-       .read           = nfs3_proc_read,
        .create         = nfs3_proc_create,
        .remove         = nfs3_proc_remove,
        .unlink_setup   = nfs3_proc_unlink_setup,
index c26cd978c7cce4f3b8576e62bbdd03860c6ce3f0..cf3a17eb5c09e0ec5e88e97fd078ab872b092457 100644 (file)
@@ -151,7 +151,7 @@ struct nfs4_state_recovery_ops {
 };
 
 extern struct dentry_operations nfs4_dentry_operations;
-extern struct inode_operations nfs4_dir_inode_operations;
+extern const struct inode_operations nfs4_dir_inode_operations;
 
 /* inode.c */
 extern ssize_t nfs4_getxattr(struct dentry *, const char *, void *, size_t);
@@ -169,7 +169,7 @@ extern int nfs4_do_close(struct inode *inode, struct nfs4_state *state);
 extern struct dentry *nfs4_atomic_open(struct inode *, struct dentry *, struct nameidata *);
 extern int nfs4_open_revalidate(struct inode *, struct dentry *, int, struct nameidata *);
 extern int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle);
-extern int nfs4_proc_fs_locations(struct inode *dir, struct dentry *dentry,
+extern int nfs4_proc_fs_locations(struct inode *dir, struct qstr *name,
                struct nfs4_fs_locations *fs_locations, struct page *page);
 
 extern struct nfs4_state_recovery_ops nfs4_reboot_recovery_ops;
index b872779d7cd5de2d73bc50172490c2028144a910..dd5fef20c702785859dc514e4bd3bc1e6f067f82 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/vfs.h>
 #include <linux/inet.h>
 #include "internal.h"
+#include "nfs4_fs.h"
 
 #define NFSDBG_FACILITY                NFSDBG_VFS
 
@@ -130,7 +131,6 @@ static struct vfsmount *nfs_follow_referral(const struct vfsmount *mnt_parent,
                .authflavor = NFS_SB(mnt_parent->mnt_sb)->client->cl_auth->au_flavor,
        };
        char *page = NULL, *page2 = NULL;
-       char *devname;
        int loc, s, error;
 
        if (locations == NULL || locations->nlocations <= 0)
@@ -154,12 +154,6 @@ static struct vfsmount *nfs_follow_referral(const struct vfsmount *mnt_parent,
                goto out;
        }
 
-       devname = nfs_devname(mnt_parent, dentry, page, PAGE_SIZE);
-       if (IS_ERR(devname)) {
-               mnt = (struct vfsmount *)devname;
-               goto out;
-       }
-
        loc = 0;
        while (loc < locations->nlocations && IS_ERR(mnt)) {
                const struct nfs4_fs_location *location = &locations->locations[loc];
@@ -194,7 +188,11 @@ static struct vfsmount *nfs_follow_referral(const struct vfsmount *mnt_parent,
                        addr.sin_port = htons(NFS_PORT);
                        mountdata.addr = &addr;
 
-                       mnt = vfs_kern_mount(&nfs4_referral_fs_type, 0, devname, &mountdata);
+                       snprintf(page, PAGE_SIZE, "%s:%s",
+                                       mountdata.hostname,
+                                       mountdata.mnt_path);
+
+                       mnt = vfs_kern_mount(&nfs4_referral_fs_type, 0, page, &mountdata);
                        if (!IS_ERR(mnt)) {
                                break;
                        }
@@ -242,7 +240,7 @@ struct vfsmount *nfs_do_refmount(const struct vfsmount *mnt_parent, struct dentr
        dprintk("%s: getting locations for %s/%s\n",
                __FUNCTION__, parent->d_name.name, dentry->d_name.name);
 
-       err = nfs4_proc_fs_locations(parent->d_inode, dentry, fs_locations, page);
+       err = nfs4_proc_fs_locations(parent->d_inode, &dentry->d_name, fs_locations, page);
        dput(parent);
        if (err != 0 ||
            fs_locations->nlocations <= 0 ||
index b3fd29baadc391ff61c822bde3e056e8b3b339e3..f52cf5c33c6c83adcde94ed37202adaf3a0d969f 100644 (file)
@@ -1140,7 +1140,6 @@ static void nfs4_close_done(struct rpc_task *task, void *data)
                        break;
                case -NFS4ERR_STALE_STATEID:
                case -NFS4ERR_EXPIRED:
-                       nfs4_schedule_state_recovery(server->nfs_client);
                        break;
                default:
                        if (nfs4_async_handle_error(task, server) == -EAGAIN) {
@@ -1424,7 +1423,6 @@ static int nfs4_get_referral(struct inode *dir, struct qstr *name, struct nfs_fa
        int status = -ENOMEM;
        struct page *page = NULL;
        struct nfs4_fs_locations *locations = NULL;
-       struct dentry dentry = {};
 
        page = alloc_page(GFP_KERNEL);
        if (page == NULL)
@@ -1433,9 +1431,7 @@ static int nfs4_get_referral(struct inode *dir, struct qstr *name, struct nfs_fa
        if (locations == NULL)
                goto out;
 
-       dentry.d_name.name = name->name;
-       dentry.d_name.len = name->len;
-       status = nfs4_proc_fs_locations(dir, &dentry, locations, page);
+       status = nfs4_proc_fs_locations(dir, name, locations, page);
        if (status != 0)
                goto out;
        /* Make sure server returned a different fsid for the referral */
@@ -1737,44 +1733,6 @@ static int nfs4_proc_readlink(struct inode *inode, struct page *page,
        return err;
 }
 
-static int _nfs4_proc_read(struct nfs_read_data *rdata)
-{
-       int flags = rdata->flags;
-       struct inode *inode = rdata->inode;
-       struct nfs_fattr *fattr = rdata->res.fattr;
-       struct nfs_server *server = NFS_SERVER(inode);
-       struct rpc_message msg = {
-               .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_READ],
-               .rpc_argp       = &rdata->args,
-               .rpc_resp       = &rdata->res,
-               .rpc_cred       = rdata->cred,
-       };
-       unsigned long timestamp = jiffies;
-       int status;
-
-       dprintk("NFS call  read %d @ %Ld\n", rdata->args.count,
-                       (long long) rdata->args.offset);
-
-       nfs_fattr_init(fattr);
-       status = rpc_call_sync(server->client, &msg, flags);
-       if (!status)
-               renew_lease(server, timestamp);
-       dprintk("NFS reply read: %d\n", status);
-       return status;
-}
-
-static int nfs4_proc_read(struct nfs_read_data *rdata)
-{
-       struct nfs4_exception exception = { };
-       int err;
-       do {
-               err = nfs4_handle_exception(NFS_SERVER(rdata->inode),
-                               _nfs4_proc_read(rdata),
-                               &exception);
-       } while (exception.retry);
-       return err;
-}
-
 /*
  * Got race?
  * We will need to arrange for the VFS layer to provide an atomic open.
@@ -2753,11 +2711,15 @@ static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs_client *clp)
 
        might_sleep();
 
+       rwsem_acquire(&clp->cl_sem.dep_map, 0, 0, _RET_IP_);
+
        rpc_clnt_sigmask(clnt, &oldset);
        res = wait_on_bit(&clp->cl_state, NFS4CLNT_STATE_RECOVER,
                        nfs4_wait_bit_interruptible,
                        TASK_INTERRUPTIBLE);
        rpc_clnt_sigunmask(clnt, &oldset);
+
+       rwsem_release(&clp->cl_sem.dep_map, 1, _RET_IP_);
        return res;
 }
 
@@ -2996,7 +2958,6 @@ int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4
                switch (err) {
                        case -NFS4ERR_STALE_STATEID:
                        case -NFS4ERR_EXPIRED:
-                               nfs4_schedule_state_recovery(server->nfs_client);
                        case 0:
                                return 0;
                }
@@ -3150,12 +3111,10 @@ static void nfs4_locku_done(struct rpc_task *task, void *data)
                        break;
                case -NFS4ERR_STALE_STATEID:
                case -NFS4ERR_EXPIRED:
-                       nfs4_schedule_state_recovery(calldata->server->nfs_client);
                        break;
                default:
-                       if (nfs4_async_handle_error(task, calldata->server) == -EAGAIN) {
+                       if (nfs4_async_handle_error(task, calldata->server) == -EAGAIN)
                                rpc_restart_call(task);
-                       }
        }
 }
 
@@ -3585,7 +3544,7 @@ ssize_t nfs4_listxattr(struct dentry *dentry, char *buf, size_t buflen)
        return len;
 }
 
-int nfs4_proc_fs_locations(struct inode *dir, struct dentry *dentry,
+int nfs4_proc_fs_locations(struct inode *dir, struct qstr *name,
                struct nfs4_fs_locations *fs_locations, struct page *page)
 {
        struct nfs_server *server = NFS_SERVER(dir);
@@ -3595,7 +3554,7 @@ int nfs4_proc_fs_locations(struct inode *dir, struct dentry *dentry,
        };
        struct nfs4_fs_locations_arg args = {
                .dir_fh = NFS_FH(dir),
-               .name = &dentry->d_name,
+               .name = name,
                .page = page,
                .bitmask = bitmask,
        };
@@ -3607,7 +3566,7 @@ int nfs4_proc_fs_locations(struct inode *dir, struct dentry *dentry,
        int status;
 
        dprintk("%s: start\n", __FUNCTION__);
-       fs_locations->fattr.valid = 0;
+       nfs_fattr_init(&fs_locations->fattr);
        fs_locations->server = server;
        fs_locations->nlocations = 0;
        status = rpc_call_sync(server->client, &msg, 0);
@@ -3625,7 +3584,7 @@ struct nfs4_state_recovery_ops nfs4_network_partition_recovery_ops = {
        .recover_lock   = nfs4_lock_expired,
 };
 
-static struct inode_operations nfs4_file_inode_operations = {
+static const struct inode_operations nfs4_file_inode_operations = {
        .permission     = nfs_permission,
        .getattr        = nfs_getattr,
        .setattr        = nfs_setattr,
@@ -3646,7 +3605,6 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
        .lookup         = nfs4_proc_lookup,
        .access         = nfs4_proc_access,
        .readlink       = nfs4_proc_readlink,
-       .read           = nfs4_proc_read,
        .create         = nfs4_proc_create,
        .remove         = nfs4_proc_remove,
        .unlink_setup   = nfs4_proc_unlink_setup,
index 823298561c0a9a7904695ce554899165d26f7403..f5f4430fb2a4c0ba3d488878a9007f26397cae43 100644 (file)
@@ -43,7 +43,6 @@
  * child task framework of the RPC layer?
  */
 
-#include <linux/sched.h>
 #include <linux/smp_lock.h>
 #include <linux/mm.h>
 #include <linux/pagemap.h>
index 0cf3fa312a332f565e8b57914eed5c60197caa21..f02d522fd78862a5195c5f461d8546cbe24863bf 100644 (file)
@@ -387,8 +387,10 @@ static int nfs4_stat_to_errno(int);
                                decode_putfh_maxsz + \
                                op_decode_hdr_maxsz + 12)
 #define NFS4_enc_server_caps_sz (compound_encode_hdr_maxsz + \
+                               encode_putfh_maxsz + \
                                encode_getattr_maxsz)
 #define NFS4_dec_server_caps_sz (compound_decode_hdr_maxsz + \
+                               decode_putfh_maxsz + \
                                decode_getattr_maxsz)
 #define NFS4_enc_delegreturn_sz        (compound_encode_hdr_maxsz + \
                                encode_putfh_maxsz + \
index 560536ad74a49fd500077882b211655c26424b85..1dcf56de948276c5bef2c62ff91303c30c652611 100644 (file)
@@ -186,35 +186,6 @@ static int nfs_proc_readlink(struct inode *inode, struct page *page,
        return status;
 }
 
-static int nfs_proc_read(struct nfs_read_data *rdata)
-{
-       int                     flags = rdata->flags;
-       struct inode *          inode = rdata->inode;
-       struct nfs_fattr *      fattr = rdata->res.fattr;
-       struct rpc_message      msg = {
-               .rpc_proc       = &nfs_procedures[NFSPROC_READ],
-               .rpc_argp       = &rdata->args,
-               .rpc_resp       = &rdata->res,
-               .rpc_cred       = rdata->cred,
-       };
-       int                     status;
-
-       dprintk("NFS call  read %d @ %Ld\n", rdata->args.count,
-                       (long long) rdata->args.offset);
-       nfs_fattr_init(fattr);
-       status = rpc_call_sync(NFS_CLIENT(inode), &msg, flags);
-       if (status >= 0) {
-               nfs_refresh_inode(inode, fattr);
-               /* Emulate the eof flag, which isn't normally needed in NFSv2
-                * as it is guaranteed to always return the file attributes
-                */
-               if (rdata->args.offset + rdata->args.count >= fattr->size)
-                       rdata->res.eof = 1;
-       }
-       dprintk("NFS reply read: %d\n", status);
-       return status;
-}
-
 static int
 nfs_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
                int flags, struct nameidata *nd)
@@ -666,7 +637,6 @@ const struct nfs_rpc_ops nfs_v2_clientops = {
        .lookup         = nfs_proc_lookup,
        .access         = NULL,                /* access */
        .readlink       = nfs_proc_readlink,
-       .read           = nfs_proc_read,
        .create         = nfs_proc_create,
        .remove         = nfs_proc_remove,
        .unlink_setup   = nfs_proc_unlink_setup,
index a9c26521a9e2d8a13965e364dae9ac8392cecdb1..6ab4d5a9edf2e70f633b23e14b8e7b3c65716875 100644 (file)
@@ -5,14 +5,6 @@
  *
  * Partial copy of Linus' read cache modifications to fs/nfs/file.c
  * modified for async RPC by okir@monad.swb.de
- *
- * We do an ugly hack here in order to return proper error codes to the
- * user program when a read request failed: since generic_file_read
- * only checks the return value of inode->i_op->readpage() which is always 0
- * for async RPC, we set the error bit of the page to 1 when an error occurs,
- * and make nfs_readpage transmit requests synchronously when encountering this.
- * This is only a small problem, though, since we now retry all operations
- * within the RPC code when root squashing is suspected.
  */
 
 #include <linux/time.h>
@@ -122,93 +114,6 @@ static void nfs_readpage_truncate_uninitialised_page(struct nfs_read_data *data)
        }
 }
 
-/*
- * Read a page synchronously.
- */
-static int nfs_readpage_sync(struct nfs_open_context *ctx, struct inode *inode,
-               struct page *page)
-{
-       unsigned int    rsize = NFS_SERVER(inode)->rsize;
-       unsigned int    count = PAGE_CACHE_SIZE;
-       int result = -ENOMEM;
-       struct nfs_read_data *rdata;
-
-       rdata = nfs_readdata_alloc(count);
-       if (!rdata)
-               goto out_unlock;
-
-       memset(rdata, 0, sizeof(*rdata));
-       rdata->flags = (IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0);
-       rdata->cred = ctx->cred;
-       rdata->inode = inode;
-       INIT_LIST_HEAD(&rdata->pages);
-       rdata->args.fh = NFS_FH(inode);
-       rdata->args.context = ctx;
-       rdata->args.pages = &page;
-       rdata->args.pgbase = 0UL;
-       rdata->args.count = rsize;
-       rdata->res.fattr = &rdata->fattr;
-
-       dprintk("NFS: nfs_readpage_sync(%p)\n", page);
-
-       /*
-        * This works now because the socket layer never tries to DMA
-        * into this buffer directly.
-        */
-       do {
-               if (count < rsize)
-                       rdata->args.count = count;
-               rdata->res.count = rdata->args.count;
-               rdata->args.offset = page_offset(page) + rdata->args.pgbase;
-
-               dprintk("NFS: nfs_proc_read(%s, (%s/%Ld), %Lu, %u)\n",
-                       NFS_SERVER(inode)->nfs_client->cl_hostname,
-                       inode->i_sb->s_id,
-                       (long long)NFS_FILEID(inode),
-                       (unsigned long long)rdata->args.pgbase,
-                       rdata->args.count);
-
-               lock_kernel();
-               result = NFS_PROTO(inode)->read(rdata);
-               unlock_kernel();
-
-               /*
-                * Even if we had a partial success we can't mark the page
-                * cache valid.
-                */
-               if (result < 0) {
-                       if (result == -EISDIR)
-                               result = -EINVAL;
-                       goto io_error;
-               }
-               count -= result;
-               rdata->args.pgbase += result;
-               nfs_add_stats(inode, NFSIOS_SERVERREADBYTES, result);
-
-               /* Note: result == 0 should only happen if we're caching
-                * a write that extends the file and punches a hole.
-                */
-               if (rdata->res.eof != 0 || result == 0)
-                       break;
-       } while (count);
-       spin_lock(&inode->i_lock);
-       NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATIME;
-       spin_unlock(&inode->i_lock);
-
-       if (rdata->res.eof || rdata->res.count == rdata->args.count) {
-               SetPageUptodate(page);
-               if (rdata->res.eof && count != 0)
-                       memclear_highpage_flush(page, rdata->args.pgbase, count);
-       }
-       result = 0;
-
-io_error:
-       nfs_readdata_free(rdata);
-out_unlock:
-       unlock_page(page);
-       return result;
-}
-
 static int nfs_readpage_async(struct nfs_open_context *ctx, struct inode *inode,
                struct page *page)
 {
@@ -278,7 +183,7 @@ static void nfs_read_rpcsetup(struct nfs_page *req, struct nfs_read_data *data,
 
        data->task.tk_cookie = (unsigned long)inode;
 
-       dprintk("NFS: %4d initiated read call (req %s/%Ld, %u bytes @ offset %Lu)\n",
+       dprintk("NFS: %5u initiated read call (req %s/%Ld, %u bytes @ offset %Lu)\n",
                        data->task.tk_pid,
                        inode->i_sb->s_id,
                        (long long)NFS_FILEID(inode),
@@ -452,7 +357,7 @@ int nfs_readpage_result(struct rpc_task *task, struct nfs_read_data *data)
 {
        int status;
 
-       dprintk("%s: %4d, (status %d)\n", __FUNCTION__, task->tk_pid,
+       dprintk("NFS: %s: %5u, (status %d)\n", __FUNCTION__, task->tk_pid,
                        task->tk_status);
 
        status = NFS_PROTO(data->inode)->read_done(task, data);
@@ -621,15 +526,9 @@ int nfs_readpage(struct file *file, struct page *page)
        } else
                ctx = get_nfs_open_context((struct nfs_open_context *)
                                file->private_data);
-       if (!IS_SYNC(inode)) {
-               error = nfs_readpage_async(ctx, inode, page);
-               goto out;
-       }
 
-       error = nfs_readpage_sync(ctx, inode, page);
-       if (error < 0 && IS_SWAPFILE(inode))
-               printk("Aiee.. nfs swap-in of page failed!\n");
-out:
+       error = nfs_readpage_async(ctx, inode, page);
+
        put_nfs_open_context(ctx);
        return error;
 
index 28108c82b88742d6e325a0736f820bf8e044910e..bb516a2cfbafa4f50446b4ca5e99e1d8c6303831 100644 (file)
@@ -44,6 +44,7 @@
 #include <linux/vfs.h>
 #include <linux/inet.h>
 #include <linux/nfs_xdr.h>
+#include <linux/magic.h>
 
 #include <asm/system.h>
 #include <asm/uaccess.h>
@@ -81,7 +82,7 @@ struct file_system_type nfs_xdev_fs_type = {
        .fs_flags       = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
 };
 
-static struct super_operations nfs_sops = {
+static const struct super_operations nfs_sops = {
        .alloc_inode    = nfs_alloc_inode,
        .destroy_inode  = nfs_destroy_inode,
        .write_inode    = nfs_write_inode,
@@ -125,7 +126,7 @@ struct file_system_type nfs4_referral_fs_type = {
        .fs_flags       = FS_RENAME_DOES_D_MOVE|FS_REVAL_DOT|FS_BINARY_MOUNTDATA,
 };
 
-static struct super_operations nfs4_sops = {
+static const struct super_operations nfs4_sops = {
        .alloc_inode    = nfs_alloc_inode,
        .destroy_inode  = nfs_destroy_inode,
        .write_inode    = nfs_write_inode,
@@ -1044,7 +1045,7 @@ static int nfs4_referral_get_sb(struct file_system_type *fs_type, int flags,
                nfs4_fill_super(s);
        }
 
-       mntroot = nfs4_get_root(s, data->fh);
+       mntroot = nfs4_get_root(s, &mntfh);
        if (IS_ERR(mntroot)) {
                error = PTR_ERR(mntroot);
                goto error_splat_super;
index 525c136c7d8ce34ff341151cd9c7230bff8cc5b1..f4a0548b9ce858a5921192a19cba0dfba5dac191 100644 (file)
@@ -78,7 +78,7 @@ read_failed:
 /*
  * symlinks can't do much...
  */
-struct inode_operations nfs_symlink_inode_operations = {
+const struct inode_operations nfs_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = nfs_follow_link,
        .put_link       = page_put_link,
index 3ea50ac648209dc28ad6ed1aa632f3a9f0df1ff9..fcdcafbb32939931c111d3fe75458d71f6f676ff 100644 (file)
@@ -75,7 +75,7 @@ static ctl_table nfs_cb_sysctl_root[] = {
 
 int nfs_register_sysctl(void)
 {
-       nfs_callback_sysctl_table = register_sysctl_table(nfs_cb_sysctl_root, 0);
+       nfs_callback_sysctl_table = register_sysctl_table(nfs_cb_sysctl_root);
        if (nfs_callback_sysctl_table == NULL)
                return -ENOMEM;
        return 0;
index 345492e78643846a6a5f356ad4ab3e7c91c6a94d..febdade91670562b003a43fd3e0ee8ad900445eb 100644 (file)
@@ -1,47 +1,7 @@
 /*
  * linux/fs/nfs/write.c
  *
- * Writing file data over NFS.
- *
- * We do it like this: When a (user) process wishes to write data to an
- * NFS file, a write request is allocated that contains the RPC task data
- * plus some info on the page to be written, and added to the inode's
- * write chain. If the process writes past the end of the page, an async
- * RPC call to write the page is scheduled immediately; otherwise, the call
- * is delayed for a few seconds.
- *
- * Just like readahead, no async I/O is performed if wsize < PAGE_SIZE.
- *
- * Write requests are kept on the inode's writeback list. Each entry in
- * that list references the page (portion) to be written. When the
- * cache timeout has expired, the RPC task is woken up, and tries to
- * lock the page. As soon as it manages to do so, the request is moved
- * from the writeback list to the writelock list.
- *
- * Note: we must make sure never to confuse the inode passed in the
- * write_page request with the one in page->inode. As far as I understand
- * it, these are different when doing a swap-out.
- *
- * To understand everything that goes on here and in the NFS read code,
- * one should be aware that a page is locked in exactly one of the following
- * cases:
- *
- *  -  A write request is in progress.
- *  -  A user process is in generic_file_write/nfs_update_page
- *  -  A user process is in generic_file_read
- *
- * Also note that because of the way pages are invalidated in
- * nfs_revalidate_inode, the following assertions hold:
- *
- *  -  If a page is dirty, there will be no read requests (a page will
- *     not be re-read unless invalidated by nfs_revalidate_inode).
- *  -  If the page is not uptodate, there will be no pending write
- *     requests, and no process will be in nfs_update_page.
- *
- * FIXME: Interaction with the vmscan routines is not optimal yet.
- * Either vmscan must be made nfs-savvy, or we need a different page
- * reclaim concept that supports something like FS-independent
- * buffer_heads with a b_ops-> field.
+ * Write file data over NFS.
  *
  * Copyright (C) 1996, 1997, Olaf Kirch <okir@monad.swb.de>
  */
@@ -79,7 +39,6 @@ static struct nfs_page * nfs_update_request(struct nfs_open_context*,
                                            unsigned int, unsigned int);
 static void nfs_mark_request_dirty(struct nfs_page *req);
 static int nfs_wait_on_write_congestion(struct address_space *, int);
-static int nfs_wait_on_requests(struct inode *, unsigned long, unsigned int);
 static long nfs_flush_mapping(struct address_space *mapping, struct writeback_control *wbc, int how);
 static const struct rpc_call_ops nfs_write_partial_ops;
 static const struct rpc_call_ops nfs_write_full_ops;
@@ -194,6 +153,13 @@ static void nfs_grow_file(struct page *page, unsigned int offset, unsigned int c
        i_size_write(inode, end);
 }
 
+/* A writeback failed: mark the page as bad, and invalidate the page cache */
+static void nfs_set_pageerror(struct page *page)
+{
+       SetPageError(page);
+       nfs_zap_mapping(page->mapping->host, page->mapping);
+}
+
 /* We can set the PG_uptodate flag if we see that a write request
  * covers the full page.
  */
@@ -323,7 +289,7 @@ static int nfs_writepage_locked(struct page *page, struct writeback_control *wbc
                err = 0;
 out:
        if (!wbc->for_writepages)
-               nfs_flush_mapping(page->mapping, wbc, wb_priority(wbc));
+               nfs_flush_mapping(page->mapping, wbc, FLUSH_STABLE|wb_priority(wbc));
        return err;
 }
 
@@ -360,14 +326,7 @@ int nfs_writepages(struct address_space *mapping, struct writeback_control *wbc)
        if (err < 0)
                goto out;
        nfs_add_stats(inode, NFSIOS_WRITEPAGES, err);
-       if (!wbc->nonblocking && wbc->sync_mode == WB_SYNC_ALL) {
-               err = nfs_wait_on_requests(inode, 0, 0);
-               if (err < 0)
-                       goto out;
-       }
-       err = nfs_commit_inode(inode, wb_priority(wbc));
-       if (err > 0)
-               err = 0;
+       err = 0;
 out:
        clear_bit(BDI_write_congested, &bdi->state);
        wake_up_all(&nfs_write_congestion);
@@ -516,17 +475,6 @@ static int nfs_wait_on_requests_locked(struct inode *inode, unsigned long idx_st
        return res;
 }
 
-static int nfs_wait_on_requests(struct inode *inode, unsigned long idx_start, unsigned int npages)
-{
-       struct nfs_inode *nfsi = NFS_I(inode);
-       int ret;
-
-       spin_lock(&nfsi->req_lock);
-       ret = nfs_wait_on_requests_locked(inode, idx_start, npages);
-       spin_unlock(&nfsi->req_lock);
-       return ret;
-}
-
 static void nfs_cancel_dirty_list(struct list_head *head)
 {
        struct nfs_page *req;
@@ -773,7 +721,7 @@ int nfs_updatepage(struct file *file, struct page *page,
         dprintk("NFS:      nfs_updatepage returns %d (isize %Ld)\n",
                        status, (long long)i_size_read(inode));
        if (status < 0)
-               ClearPageUptodate(page);
+               nfs_set_pageerror(page);
        return status;
 }
 
@@ -852,7 +800,8 @@ static void nfs_write_rpcsetup(struct nfs_page *req,
        data->task.tk_priority = flush_task_priority(how);
        data->task.tk_cookie = (unsigned long)inode;
 
-       dprintk("NFS: %4d initiated write call (req %s/%Ld, %u bytes @ offset %Lu)\n",
+       dprintk("NFS: %5u initiated write call "
+               "(req %s/%Ld, %u bytes @ offset %Lu)\n",
                data->task.tk_pid,
                inode->i_sb->s_id,
                (long long)NFS_FILEID(inode),
@@ -1034,8 +983,7 @@ static void nfs_writeback_done_partial(struct rpc_task *task, void *calldata)
                return;
 
        if (task->tk_status < 0) {
-               ClearPageUptodate(page);
-               SetPageError(page);
+               nfs_set_pageerror(page);
                req->wb_context->error = task->tk_status;
                dprintk(", error = %d\n", task->tk_status);
        } else {
@@ -1092,8 +1040,7 @@ static void nfs_writeback_done_full(struct rpc_task *task, void *calldata)
                        (long long)req_offset(req));
 
                if (task->tk_status < 0) {
-                       ClearPageUptodate(page);
-                       SetPageError(page);
+                       nfs_set_pageerror(page);
                        req->wb_context->error = task->tk_status;
                        end_page_writeback(page);
                        nfs_inode_remove_request(req);
@@ -1134,7 +1081,7 @@ int nfs_writeback_done(struct rpc_task *task, struct nfs_write_data *data)
        struct nfs_writeres     *resp = &data->res;
        int status;
 
-       dprintk("NFS: %4d nfs_writeback_done (status %d)\n",
+       dprintk("NFS: %5u nfs_writeback_done (status %d)\n",
                task->tk_pid, task->tk_status);
 
        /*
@@ -1250,7 +1197,7 @@ static void nfs_commit_rpcsetup(struct list_head *head,
        data->task.tk_priority = flush_task_priority(how);
        data->task.tk_cookie = (unsigned long)inode;
        
-       dprintk("NFS: %4d initiated commit call\n", data->task.tk_pid);
+       dprintk("NFS: %5u initiated commit call\n", data->task.tk_pid);
 }
 
 /*
@@ -1291,7 +1238,7 @@ static void nfs_commit_done(struct rpc_task *task, void *calldata)
        struct nfs_write_data   *data = calldata;
        struct nfs_page         *req;
 
-        dprintk("NFS: %4d nfs_commit_done (status %d)\n",
+        dprintk("NFS: %5u nfs_commit_done (status %d)\n",
                                 task->tk_pid, task->tk_status);
 
        /* Call the NFS version-specific code */
@@ -1516,6 +1463,8 @@ int nfs_wb_page_priority(struct inode *inode, struct page *page, int how)
                if (ret < 0)
                        goto out;
        }
+       if (!PagePrivate(page))
+               return 0;
        ret = nfs_sync_mapping_wait(page->mapping, &wbc, how);
        if (ret >= 0)
                return 0;
index 49c310b849239cecc236c9a039352ea40cffa728..6f24768272a1f05dcdd9657d3bb22755c06e9dce 100644 (file)
@@ -16,7 +16,6 @@
 
 #include <linux/unistd.h>
 #include <linux/slab.h>
-#include <linux/sched.h>
 #include <linux/stat.h>
 #include <linux/in.h>
 #include <linux/seq_file.h>
@@ -190,18 +189,17 @@ static int expkey_show(struct seq_file *m,
                       struct cache_head *h)
 {
        struct svc_expkey *ek ;
+       int i;
 
        if (h ==NULL) {
                seq_puts(m, "#domain fsidtype fsid [path]\n");
                return 0;
        }
        ek = container_of(h, struct svc_expkey, h);
-       seq_printf(m, "%s %d 0x%08x", ek->ek_client->name,
-                  ek->ek_fsidtype, ek->ek_fsid[0]);
-       if (ek->ek_fsidtype != 1)
-               seq_printf(m, "%08x", ek->ek_fsid[1]);
-       if (ek->ek_fsidtype == 2)
-               seq_printf(m, "%08x", ek->ek_fsid[2]);
+       seq_printf(m, "%s %d 0x", ek->ek_client->name,
+                  ek->ek_fsidtype);
+       for (i=0; i < key_len(ek->ek_fsidtype)/4; i++)
+               seq_printf(m, "%08x", ek->ek_fsid[i]);
        if (test_bit(CACHE_VALID, &h->flags) && 
            !test_bit(CACHE_NEGATIVE, &h->flags)) {
                seq_printf(m, " ");
@@ -232,9 +230,8 @@ static inline void expkey_init(struct cache_head *cnew,
        kref_get(&item->ek_client->ref);
        new->ek_client = item->ek_client;
        new->ek_fsidtype = item->ek_fsidtype;
-       new->ek_fsid[0] = item->ek_fsid[0];
-       new->ek_fsid[1] = item->ek_fsid[1];
-       new->ek_fsid[2] = item->ek_fsid[2];
+
+       memcpy(new->ek_fsid, item->ek_fsid, sizeof(new->ek_fsid));
 }
 
 static inline void expkey_update(struct cache_head *cnew,
@@ -363,7 +360,7 @@ static struct svc_export *svc_export_update(struct svc_export *new,
                                            struct svc_export *old);
 static struct svc_export *svc_export_lookup(struct svc_export *);
 
-static int check_export(struct inode *inode, int flags)
+static int check_export(struct inode *inode, int flags, unsigned char *uuid)
 {
 
        /* We currently export only dirs and regular files.
@@ -376,12 +373,13 @@ static int check_export(struct inode *inode, int flags)
        /* There are two requirements on a filesystem to be exportable.
         * 1:  We must be able to identify the filesystem from a number.
         *       either a device number (so FS_REQUIRES_DEV needed)
-        *       or an FSID number (so NFSEXP_FSID needed).
+        *       or an FSID number (so NFSEXP_FSID or ->uuid is needed).
         * 2:  We must be able to find an inode from a filehandle.
         *       This means that s_export_op must be set.
         */
        if (!(inode->i_sb->s_type->fs_flags & FS_REQUIRES_DEV) &&
-           !(flags & NFSEXP_FSID)) {
+           !(flags & NFSEXP_FSID) &&
+           uuid == NULL) {
                dprintk("exp_export: export of non-dev fs without fsid\n");
                return -EINVAL;
        }
@@ -406,10 +404,6 @@ fsloc_parse(char **mesg, char *buf, struct nfsd4_fs_locations *fsloc)
        int len;
        int migrated, i, err;
 
-       len = qword_get(mesg, buf, PAGE_SIZE);
-       if (len != 5 || memcmp(buf, "fsloc", 5))
-               return 0;
-
        /* listsize */
        err = get_int(mesg, &fsloc->locations_count);
        if (err)
@@ -520,6 +514,8 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen)
        exp.ex_fslocs.locations_count = 0;
        exp.ex_fslocs.migrated = 0;
 
+       exp.ex_uuid = NULL;
+
        /* flags */
        err = get_int(&mesg, &an_int);
        if (err == -ENOENT)
@@ -543,12 +539,33 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen)
                if (err) goto out;
                exp.ex_fsid = an_int;
 
-               err = check_export(nd.dentry->d_inode, exp.ex_flags);
-               if (err) goto out;
+               while ((len = qword_get(&mesg, buf, PAGE_SIZE)) > 0) {
+                       if (strcmp(buf, "fsloc") == 0)
+                               err = fsloc_parse(&mesg, buf, &exp.ex_fslocs);
+                       else if (strcmp(buf, "uuid") == 0) {
+                               /* expect a 16 byte uuid encoded as \xXXXX... */
+                               len = qword_get(&mesg, buf, PAGE_SIZE);
+                               if (len != 16)
+                                       err  = -EINVAL;
+                               else {
+                                       exp.ex_uuid =
+                                               kmemdup(buf, 16, GFP_KERNEL);
+                                       if (exp.ex_uuid == NULL)
+                                               err = -ENOMEM;
+                               }
+                       } else
+                               /* quietly ignore unknown words and anything
+                                * following. Newer user-space can try to set
+                                * new values, then see what the result was.
+                                */
+                               break;
+                       if (err)
+                               goto out;
+               }
 
-               err = fsloc_parse(&mesg, buf, &exp.ex_fslocs);
-               if (err)
-                       goto out;
+               err = check_export(nd.dentry->d_inode, exp.ex_flags,
+                                  exp.ex_uuid);
+               if (err) goto out;
        }
 
        expp = svc_export_lookup(&exp);
@@ -562,6 +579,8 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen)
        else
                exp_put(expp);
  out:
+       nfsd4_fslocs_free(&exp.ex_fslocs);
+       kfree(exp.ex_uuid);
        kfree(exp.ex_path);
        if (nd.dentry)
                path_release(&nd);
@@ -591,9 +610,19 @@ static int svc_export_show(struct seq_file *m,
        seq_escape(m, exp->ex_client->name, " \t\n\\");
        seq_putc(m, '(');
        if (test_bit(CACHE_VALID, &h->flags) && 
-           !test_bit(CACHE_NEGATIVE, &h->flags))
+           !test_bit(CACHE_NEGATIVE, &h->flags)) {
                exp_flags(m, exp->ex_flags, exp->ex_fsid,
                          exp->ex_anon_uid, exp->ex_anon_gid, &exp->ex_fslocs);
+               if (exp->ex_uuid) {
+                       int i;
+                       seq_puts(m, ",uuid=");
+                       for (i=0; i<16; i++) {
+                               if ((i&3) == 0 && i)
+                                       seq_putc(m, ':');
+                               seq_printf(m, "%02x", exp->ex_uuid[i]);
+                       }
+               }
+       }
        seq_puts(m, ")\n");
        return 0;
 }
@@ -630,6 +659,8 @@ static void export_update(struct cache_head *cnew, struct cache_head *citem)
        new->ex_anon_uid = item->ex_anon_uid;
        new->ex_anon_gid = item->ex_anon_gid;
        new->ex_fsid = item->ex_fsid;
+       new->ex_uuid = item->ex_uuid;
+       item->ex_uuid = NULL;
        new->ex_path = item->ex_path;
        item->ex_path = NULL;
        new->ex_fslocs.locations = item->ex_fslocs.locations;
@@ -752,11 +783,11 @@ exp_get_key(svc_client *clp, dev_t dev, ino_t ino)
        u32 fsidv[3];
        
        if (old_valid_dev(dev)) {
-               mk_fsid_v0(fsidv, dev, ino);
-               return exp_find_key(clp, 0, fsidv, NULL);
+               mk_fsid(FSID_DEV, fsidv, dev, ino, 0, NULL);
+               return exp_find_key(clp, FSID_DEV, fsidv, NULL);
        }
-       mk_fsid_v3(fsidv, dev, ino);
-       return exp_find_key(clp, 3, fsidv, NULL);
+       mk_fsid(FSID_ENCODE_DEV, fsidv, dev, ino, 0, NULL);
+       return exp_find_key(clp, FSID_ENCODE_DEV, fsidv, NULL);
 }
 
 /*
@@ -767,9 +798,9 @@ exp_get_fsid_key(svc_client *clp, int fsid)
 {
        u32 fsidv[2];
 
-       mk_fsid_v1(fsidv, fsid);
+       mk_fsid(FSID_NUM, fsidv, 0, 0, fsid, NULL);
 
-       return exp_find_key(clp, 1, fsidv, NULL);
+       return exp_find_key(clp, FSID_NUM, fsidv, NULL);
 }
 
 svc_export *
@@ -883,8 +914,8 @@ static int exp_fsid_hash(svc_client *clp, struct svc_export *exp)
        if ((exp->ex_flags & NFSEXP_FSID) == 0)
                return 0;
 
-       mk_fsid_v1(fsid, exp->ex_fsid);
-       return exp_set_key(clp, 1, fsid, exp);
+       mk_fsid(FSID_NUM, fsid, 0, 0, exp->ex_fsid, NULL);
+       return exp_set_key(clp, FSID_NUM, fsid, exp);
 }
 
 static int exp_hash(struct auth_domain *clp, struct svc_export *exp)
@@ -894,11 +925,11 @@ static int exp_hash(struct auth_domain *clp, struct svc_export *exp)
        dev_t dev = inode->i_sb->s_dev;
 
        if (old_valid_dev(dev)) {
-               mk_fsid_v0(fsid, dev, inode->i_ino);
-               return exp_set_key(clp, 0, fsid, exp);
+               mk_fsid(FSID_DEV, fsid, dev, inode->i_ino, 0, NULL);
+               return exp_set_key(clp, FSID_DEV, fsid, exp);
        }
-       mk_fsid_v3(fsid, dev, inode->i_ino);
-       return exp_set_key(clp, 3, fsid, exp);
+       mk_fsid(FSID_ENCODE_DEV, fsid, dev, inode->i_ino, 0, NULL);
+       return exp_set_key(clp, FSID_ENCODE_DEV, fsid, exp);
 }
 
 static void exp_unhash(struct svc_export *exp)
@@ -977,7 +1008,7 @@ exp_export(struct nfsctl_export *nxp)
                goto finish;
        }
 
-       err = check_export(nd.dentry->d_inode, nxp->ex_flags);
+       err = check_export(nd.dentry->d_inode, nxp->ex_flags, NULL);
        if (err) goto finish;
 
        err = -ENOMEM;
@@ -1170,9 +1201,9 @@ exp_pseudoroot(struct auth_domain *clp, struct svc_fh *fhp,
        __be32 rv;
        u32 fsidv[2];
 
-       mk_fsid_v1(fsidv, 0);
+       mk_fsid(FSID_NUM, fsidv, 0, 0, 0, NULL);
 
-       exp = exp_find(clp, 1, fsidv, creq);
+       exp = exp_find(clp, FSID_NUM, fsidv, creq);
        if (IS_ERR(exp))
                return nfserrno(PTR_ERR(exp));
        if (exp == NULL)
index e695660921ec30adfd6f0ebb3546120ee536964e..6f677988c71d74c60edcda3002233ffba9d807ed 100644 (file)
@@ -149,6 +149,27 @@ decode_sattr3(__be32 *p, struct iattr *iap)
        return p;
 }
 
+static __be32 *encode_fsid(__be32 *p, struct svc_fh *fhp)
+{
+       u64 f;
+       switch(fsid_source(fhp)) {
+       default:
+       case FSIDSOURCE_DEV:
+               p = xdr_encode_hyper(p, (u64)huge_encode_dev
+                                    (fhp->fh_dentry->d_inode->i_sb->s_dev));
+               break;
+       case FSIDSOURCE_FSID:
+               p = xdr_encode_hyper(p, (u64) fhp->fh_export->ex_fsid);
+               break;
+       case FSIDSOURCE_UUID:
+               f = ((u64*)fhp->fh_export->ex_uuid)[0];
+               f ^= ((u64*)fhp->fh_export->ex_uuid)[1];
+               p = xdr_encode_hyper(p, f);
+               break;
+       }
+       return p;
+}
+
 static __be32 *
 encode_fattr3(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp,
              struct kstat *stat)
@@ -169,10 +190,7 @@ encode_fattr3(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp,
        p = xdr_encode_hyper(p, ((u64)stat->blocks) << 9);
        *p++ = htonl((u32) MAJOR(stat->rdev));
        *p++ = htonl((u32) MINOR(stat->rdev));
-       if (is_fsid(fhp, rqstp->rq_reffh))
-               p = xdr_encode_hyper(p, (u64) fhp->fh_export->ex_fsid);
-       else
-               p = xdr_encode_hyper(p, (u64) huge_encode_dev(stat->dev));
+       p = encode_fsid(p, fhp);
        p = xdr_encode_hyper(p, (u64) stat->ino);
        p = encode_time3(p, &stat->atime);
        lease_get_mtime(dentry->d_inode, &time); 
@@ -203,10 +221,7 @@ encode_saved_post_attr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)
        p = xdr_encode_hyper(p, ((u64)fhp->fh_post_blocks) << 9);
        *p++ = fhp->fh_post_rdev[0];
        *p++ = fhp->fh_post_rdev[1];
-       if (is_fsid(fhp, rqstp->rq_reffh))
-               p = xdr_encode_hyper(p, (u64) fhp->fh_export->ex_fsid);
-       else
-               p = xdr_encode_hyper(p, (u64)huge_encode_dev(inode->i_sb->s_dev));
+       p = encode_fsid(p, fhp);
        p = xdr_encode_hyper(p, (u64) inode->i_ino);
        p = encode_time3(p, &fhp->fh_post_atime);
        p = encode_time3(p, &fhp->fh_post_mtime);
index 5d94555cdc836a4f9ce2f0e998e2d5a734e1ca00..832673b14587da06496a34b35e8a4046439bc502 100644 (file)
 
 /* flags used to simulate posix default ACLs */
 #define NFS4_INHERITANCE_FLAGS (NFS4_ACE_FILE_INHERIT_ACE \
-               | NFS4_ACE_DIRECTORY_INHERIT_ACE | NFS4_ACE_INHERIT_ONLY_ACE)
+               | NFS4_ACE_DIRECTORY_INHERIT_ACE)
 
-#define NFS4_SUPPORTED_FLAGS (NFS4_INHERITANCE_FLAGS | NFS4_ACE_IDENTIFIER_GROUP)
+#define NFS4_SUPPORTED_FLAGS (NFS4_INHERITANCE_FLAGS \
+               | NFS4_ACE_INHERIT_ONLY_ACE \
+               | NFS4_ACE_IDENTIFIER_GROUP)
 
 #define MASK_EQUAL(mask1, mask2) \
        ( ((mask1) & NFS4_ACE_MASK_ALL) == ((mask2) & NFS4_ACE_MASK_ALL) )
@@ -87,12 +89,19 @@ mask_from_posix(unsigned short perm, unsigned int flags)
 }
 
 static u32
-deny_mask(u32 allow_mask, unsigned int flags)
+deny_mask_from_posix(unsigned short perm, u32 flags)
 {
-       u32 ret = ~allow_mask & ~NFS4_MASK_UNSUPP;
-       if (!(flags & NFS4_ACL_DIR))
-               ret &= ~NFS4_ACE_DELETE_CHILD;
-       return ret;
+       u32 mask = 0;
+
+       if (perm & ACL_READ)
+               mask |= NFS4_READ_MODE;
+       if (perm & ACL_WRITE)
+               mask |= NFS4_WRITE_MODE;
+       if ((perm & ACL_WRITE) && (flags & NFS4_ACL_DIR))
+               mask |= NFS4_ACE_DELETE_CHILD;
+       if (perm & ACL_EXECUTE)
+               mask |= NFS4_EXECUTE_MODE;
+       return mask;
 }
 
 /* XXX: modify functions to return NFS errors; they're only ever
@@ -126,108 +135,151 @@ struct ace_container {
 };
 
 static short ace2type(struct nfs4_ace *);
-static int _posix_to_nfsv4_one(struct posix_acl *, struct nfs4_acl *, unsigned int);
-static struct posix_acl *_nfsv4_to_posix_one(struct nfs4_acl *, unsigned int);
-int nfs4_acl_add_ace(struct nfs4_acl *, u32, u32, u32, int, uid_t);
-static int nfs4_acl_split(struct nfs4_acl *, struct nfs4_acl *);
+static void _posix_to_nfsv4_one(struct posix_acl *, struct nfs4_acl *,
+                               unsigned int);
+void nfs4_acl_add_ace(struct nfs4_acl *, u32, u32, u32, int, uid_t);
 
 struct nfs4_acl *
 nfs4_acl_posix_to_nfsv4(struct posix_acl *pacl, struct posix_acl *dpacl,
                        unsigned int flags)
 {
        struct nfs4_acl *acl;
-       int error = -EINVAL;
+       int size = 0;
 
-       if ((pacl != NULL &&
-               (posix_acl_valid(pacl) < 0 || pacl->a_count == 0)) ||
-           (dpacl != NULL &&
-               (posix_acl_valid(dpacl) < 0 || dpacl->a_count == 0)))
-               goto out_err;
-
-       acl = nfs4_acl_new();
-       if (acl == NULL) {
-               error = -ENOMEM;
-               goto out_err;
+       if (pacl) {
+               if (posix_acl_valid(pacl) < 0)
+                       return ERR_PTR(-EINVAL);
+               size += 2*pacl->a_count;
        }
-
-       if (pacl != NULL) {
-               error = _posix_to_nfsv4_one(pacl, acl,
-                                               flags & ~NFS4_ACL_TYPE_DEFAULT);
-               if (error < 0)
-                       goto out_acl;
+       if (dpacl) {
+               if (posix_acl_valid(dpacl) < 0)
+                       return ERR_PTR(-EINVAL);
+               size += 2*dpacl->a_count;
        }
 
-       if (dpacl != NULL) {
-               error = _posix_to_nfsv4_one(dpacl, acl,
-                                               flags | NFS4_ACL_TYPE_DEFAULT);
-               if (error < 0)
-                       goto out_acl;
-       }
+       /* Allocate for worst case: one (deny, allow) pair each: */
+       acl = nfs4_acl_new(size);
+       if (acl == NULL)
+               return ERR_PTR(-ENOMEM);
 
-       return acl;
+       if (pacl)
+               _posix_to_nfsv4_one(pacl, acl, flags & ~NFS4_ACL_TYPE_DEFAULT);
 
-out_acl:
-       nfs4_acl_free(acl);
-out_err:
-       acl = ERR_PTR(error);
+       if (dpacl)
+               _posix_to_nfsv4_one(dpacl, acl, flags | NFS4_ACL_TYPE_DEFAULT);
 
        return acl;
 }
 
-static int
-nfs4_acl_add_pair(struct nfs4_acl *acl, int eflag, u32 mask, int whotype,
-               uid_t owner, unsigned int flags)
+struct posix_acl_summary {
+       unsigned short owner;
+       unsigned short users;
+       unsigned short group;
+       unsigned short groups;
+       unsigned short other;
+       unsigned short mask;
+};
+
+static void
+summarize_posix_acl(struct posix_acl *acl, struct posix_acl_summary *pas)
 {
-       int error;
-
-       error = nfs4_acl_add_ace(acl, NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE,
-                                eflag, mask, whotype, owner);
-       if (error < 0)
-               return error;
-       error = nfs4_acl_add_ace(acl, NFS4_ACE_ACCESS_DENIED_ACE_TYPE,
-                               eflag, deny_mask(mask, flags), whotype, owner);
-       return error;
+       struct posix_acl_entry *pa, *pe;
+       pas->users = 0;
+       pas->groups = 0;
+       pas->mask = 07;
+
+       pe = acl->a_entries + acl->a_count;
+
+       FOREACH_ACL_ENTRY(pa, acl, pe) {
+               switch (pa->e_tag) {
+                       case ACL_USER_OBJ:
+                               pas->owner = pa->e_perm;
+                               break;
+                       case ACL_GROUP_OBJ:
+                               pas->group = pa->e_perm;
+                               break;
+                       case ACL_USER:
+                               pas->users |= pa->e_perm;
+                               break;
+                       case ACL_GROUP:
+                               pas->groups |= pa->e_perm;
+                               break;
+                       case ACL_OTHER:
+                               pas->other = pa->e_perm;
+                               break;
+                       case ACL_MASK:
+                               pas->mask = pa->e_perm;
+                               break;
+               }
+       }
+       /* We'll only care about effective permissions: */
+       pas->users &= pas->mask;
+       pas->group &= pas->mask;
+       pas->groups &= pas->mask;
 }
 
 /* We assume the acl has been verified with posix_acl_valid. */
-static int
+static void
 _posix_to_nfsv4_one(struct posix_acl *pacl, struct nfs4_acl *acl,
                                                unsigned int flags)
 {
-       struct posix_acl_entry *pa, *pe, *group_owner_entry;
-       int error = -EINVAL;
-       u32 mask, mask_mask;
+       struct posix_acl_entry *pa, *group_owner_entry;
+       struct nfs4_ace *ace;
+       struct posix_acl_summary pas;
+       unsigned short deny;
        int eflag = ((flags & NFS4_ACL_TYPE_DEFAULT) ?
                                        NFS4_INHERITANCE_FLAGS : 0);
 
        BUG_ON(pacl->a_count < 3);
-       pe = pacl->a_entries + pacl->a_count;
-       pa = pe - 2; /* if mask entry exists, it's second from the last. */
-       if (pa->e_tag == ACL_MASK)
-               mask_mask = deny_mask(mask_from_posix(pa->e_perm, flags), flags);
-       else
-               mask_mask = 0;
+       summarize_posix_acl(pacl, &pas);
 
        pa = pacl->a_entries;
-       BUG_ON(pa->e_tag != ACL_USER_OBJ);
-       mask = mask_from_posix(pa->e_perm, flags | NFS4_ACL_OWNER);
-       error = nfs4_acl_add_pair(acl, eflag, mask, NFS4_ACL_WHO_OWNER, 0, flags);
-       if (error < 0)
-               goto out;
-       pa++;
+       ace = acl->aces + acl->naces;
 
-       while (pa->e_tag == ACL_USER) {
-               mask = mask_from_posix(pa->e_perm, flags);
-               error = nfs4_acl_add_ace(acl, NFS4_ACE_ACCESS_DENIED_ACE_TYPE,
-                               eflag,  mask_mask, NFS4_ACL_WHO_NAMED, pa->e_id);
-               if (error < 0)
-                       goto out;
+       /* We could deny everything not granted by the owner: */
+       deny = ~pas.owner;
+       /*
+        * but it is equivalent (and simpler) to deny only what is not
+        * granted by later entries:
+        */
+       deny &= pas.users | pas.group | pas.groups | pas.other;
+       if (deny) {
+               ace->type = NFS4_ACE_ACCESS_DENIED_ACE_TYPE;
+               ace->flag = eflag;
+               ace->access_mask = deny_mask_from_posix(deny, flags);
+               ace->whotype = NFS4_ACL_WHO_OWNER;
+               ace++;
+               acl->naces++;
+       }
 
+       ace->type = NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE;
+       ace->flag = eflag;
+       ace->access_mask = mask_from_posix(pa->e_perm, flags | NFS4_ACL_OWNER);
+       ace->whotype = NFS4_ACL_WHO_OWNER;
+       ace++;
+       acl->naces++;
+       pa++;
 
-               error = nfs4_acl_add_pair(acl, eflag, mask,
-                               NFS4_ACL_WHO_NAMED, pa->e_id, flags);
-               if (error < 0)
-                       goto out;
+       while (pa->e_tag == ACL_USER) {
+               deny = ~(pa->e_perm & pas.mask);
+               deny &= pas.groups | pas.group | pas.other;
+               if (deny) {
+                       ace->type = NFS4_ACE_ACCESS_DENIED_ACE_TYPE;
+                       ace->flag = eflag;
+                       ace->access_mask = deny_mask_from_posix(deny, flags);
+                       ace->whotype = NFS4_ACL_WHO_NAMED;
+                       ace->who = pa->e_id;
+                       ace++;
+                       acl->naces++;
+               }
+               ace->type = NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE;
+               ace->flag = eflag;
+               ace->access_mask = mask_from_posix(pa->e_perm & pas.mask,
+                                                  flags);
+               ace->whotype = NFS4_ACL_WHO_NAMED;
+               ace->who = pa->e_id;
+               ace++;
+               acl->naces++;
                pa++;
        }
 
@@ -236,67 +288,65 @@ _posix_to_nfsv4_one(struct posix_acl *pacl, struct nfs4_acl *acl,
 
        /* allow ACEs */
 
-       if (pacl->a_count > 3) {
-               BUG_ON(pa->e_tag != ACL_GROUP_OBJ);
-               error = nfs4_acl_add_ace(acl, NFS4_ACE_ACCESS_DENIED_ACE_TYPE,
-                               NFS4_ACE_IDENTIFIER_GROUP | eflag, mask_mask,
-                               NFS4_ACL_WHO_GROUP, 0);
-               if (error < 0)
-                       goto out;
-       }
        group_owner_entry = pa;
-       mask = mask_from_posix(pa->e_perm, flags);
-       error = nfs4_acl_add_ace(acl, NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE,
-                       NFS4_ACE_IDENTIFIER_GROUP | eflag, mask,
-                       NFS4_ACL_WHO_GROUP, 0);
-       if (error < 0)
-               goto out;
+
+       ace->type = NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE;
+       ace->flag = eflag;
+       ace->access_mask = mask_from_posix(pas.group, flags);
+       ace->whotype = NFS4_ACL_WHO_GROUP;
+       ace++;
+       acl->naces++;
        pa++;
 
        while (pa->e_tag == ACL_GROUP) {
-               mask = mask_from_posix(pa->e_perm, flags);
-               error = nfs4_acl_add_ace(acl, NFS4_ACE_ACCESS_DENIED_ACE_TYPE,
-                               NFS4_ACE_IDENTIFIER_GROUP | eflag, mask_mask,
-                               NFS4_ACL_WHO_NAMED, pa->e_id);
-               if (error < 0)
-                       goto out;
-
-               error = nfs4_acl_add_ace(acl, NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE,
-                               NFS4_ACE_IDENTIFIER_GROUP | eflag, mask,
-                               NFS4_ACL_WHO_NAMED, pa->e_id);
-               if (error < 0)
-                       goto out;
+               ace->type = NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE;
+               ace->flag = eflag | NFS4_ACE_IDENTIFIER_GROUP;
+               ace->access_mask = mask_from_posix(pa->e_perm & pas.mask,
+                                                  flags);
+               ace->whotype = NFS4_ACL_WHO_NAMED;
+               ace->who = pa->e_id;
+               ace++;
+               acl->naces++;
                pa++;
        }
 
        /* deny ACEs */
 
        pa = group_owner_entry;
-       mask = mask_from_posix(pa->e_perm, flags);
-       error = nfs4_acl_add_ace(acl, NFS4_ACE_ACCESS_DENIED_ACE_TYPE,
-                       NFS4_ACE_IDENTIFIER_GROUP | eflag,
-                       deny_mask(mask, flags), NFS4_ACL_WHO_GROUP, 0);
-       if (error < 0)
-               goto out;
+
+       deny = ~pas.group & pas.other;
+       if (deny) {
+               ace->type = NFS4_ACE_ACCESS_DENIED_ACE_TYPE;
+               ace->flag = eflag | NFS4_ACE_IDENTIFIER_GROUP;
+               ace->access_mask = deny_mask_from_posix(deny, flags);
+               ace->whotype = NFS4_ACL_WHO_GROUP;
+               ace++;
+               acl->naces++;
+       }
        pa++;
+
        while (pa->e_tag == ACL_GROUP) {
-               mask = mask_from_posix(pa->e_perm, flags);
-               error = nfs4_acl_add_ace(acl, NFS4_ACE_ACCESS_DENIED_ACE_TYPE,
-                               NFS4_ACE_IDENTIFIER_GROUP | eflag,
-                               deny_mask(mask, flags), NFS4_ACL_WHO_NAMED, pa->e_id);
-               if (error < 0)
-                       goto out;
+               deny = ~(pa->e_perm & pas.mask);
+               deny &= pas.other;
+               if (deny) {
+                       ace->type = NFS4_ACE_ACCESS_DENIED_ACE_TYPE;
+                       ace->flag = eflag | NFS4_ACE_IDENTIFIER_GROUP;
+                       ace->access_mask = mask_from_posix(deny, flags);
+                       ace->whotype = NFS4_ACL_WHO_NAMED;
+                       ace->who = pa->e_id;
+                       ace++;
+                       acl->naces++;
+               }
                pa++;
        }
 
        if (pa->e_tag == ACL_MASK)
                pa++;
-       BUG_ON(pa->e_tag != ACL_OTHER);
-       mask = mask_from_posix(pa->e_perm, flags);
-       error = nfs4_acl_add_pair(acl, eflag, mask, NFS4_ACL_WHO_EVERYONE, 0, flags);
-
-out:
-       return error;
+       ace->type = NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE;
+       ace->flag = eflag;
+       ace->access_mask = mask_from_posix(pa->e_perm, flags);
+       ace->whotype = NFS4_ACL_WHO_EVERYONE;
+       acl->naces++;
 }
 
 static void
@@ -342,46 +392,6 @@ sort_pacl(struct posix_acl *pacl)
        return;
 }
 
-int
-nfs4_acl_nfsv4_to_posix(struct nfs4_acl *acl, struct posix_acl **pacl,
-               struct posix_acl **dpacl, unsigned int flags)
-{
-       struct nfs4_acl *dacl;
-       int error = -ENOMEM;
-
-       *pacl = NULL;
-       *dpacl = NULL;
-
-       dacl = nfs4_acl_new();
-       if (dacl == NULL)
-               goto out;
-
-       error = nfs4_acl_split(acl, dacl);
-       if (error)
-               goto out_acl;
-
-       *pacl = _nfsv4_to_posix_one(acl, flags);
-       if (IS_ERR(*pacl)) {
-               error = PTR_ERR(*pacl);
-               *pacl = NULL;
-               goto out_acl;
-       }
-
-       *dpacl = _nfsv4_to_posix_one(dacl, flags);
-       if (IS_ERR(*dpacl)) {
-               error = PTR_ERR(*dpacl);
-               *dpacl = NULL;
-       }
-out_acl:
-       if (error) {
-               posix_acl_release(*pacl);
-               *pacl = NULL;
-       }
-       nfs4_acl_free(dacl);
-out:
-       return error;
-}
-
 /*
  * While processing the NFSv4 ACE, this maintains bitmasks representing
  * which permission bits have been allowed and which denied to a given
@@ -406,6 +416,7 @@ struct posix_ace_state_array {
  * calculated so far: */
 
 struct posix_acl_state {
+       int empty;
        struct posix_ace_state owner;
        struct posix_ace_state group;
        struct posix_ace_state other;
@@ -421,6 +432,7 @@ init_state(struct posix_acl_state *state, int cnt)
        int alloc;
 
        memset(state, 0, sizeof(struct posix_acl_state));
+       state->empty = 1;
        /*
         * In the worst case, each individual acl could be for a distinct
         * named user or group, but we don't no which, so we allocate
@@ -488,6 +500,20 @@ posix_state_to_acl(struct posix_acl_state *state, unsigned int flags)
        int nace;
        int i, error = 0;
 
+       /*
+        * ACLs with no ACEs are treated differently in the inheritable
+        * and effective cases: when there are no inheritable ACEs, we
+        * set a zero-length default posix acl:
+        */
+       if (state->empty && (flags & NFS4_ACL_TYPE_DEFAULT)) {
+               pacl = posix_acl_alloc(0, GFP_KERNEL);
+               return pacl ? pacl : ERR_PTR(-ENOMEM);
+       }
+       /*
+        * When there are no effective ACEs, the following will end
+        * up setting a 3-element effective posix ACL with all
+        * permissions zero.
+        */
        nace = 4 + state->users->n + state->groups->n;
        pacl = posix_acl_alloc(nace, GFP_KERNEL);
        if (!pacl)
@@ -603,6 +629,8 @@ static void process_one_v4_ace(struct posix_acl_state *state,
        u32 mask = ace->access_mask;
        int i;
 
+       state->empty = 0;
+
        switch (ace2type(ace)) {
        case ACL_USER_OBJ:
                if (ace->type == NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE) {
@@ -666,75 +694,62 @@ static void process_one_v4_ace(struct posix_acl_state *state,
        }
 }
 
-static struct posix_acl *
-_nfsv4_to_posix_one(struct nfs4_acl *n4acl, unsigned int flags)
+int nfs4_acl_nfsv4_to_posix(struct nfs4_acl *acl, struct posix_acl **pacl,
+                           struct posix_acl **dpacl, unsigned int flags)
 {
-       struct posix_acl_state state;
-       struct posix_acl *pacl;
+       struct posix_acl_state effective_acl_state, default_acl_state;
        struct nfs4_ace *ace;
        int ret;
 
-       ret = init_state(&state, n4acl->naces);
+       ret = init_state(&effective_acl_state, acl->naces);
        if (ret)
-               return ERR_PTR(ret);
-
-       list_for_each_entry(ace, &n4acl->ace_head, l_ace)
-               process_one_v4_ace(&state, ace);
-
-       pacl = posix_state_to_acl(&state, flags);
-
-       free_state(&state);
-
-       if (!IS_ERR(pacl))
-               sort_pacl(pacl);
-       return pacl;
-}
-
-static int
-nfs4_acl_split(struct nfs4_acl *acl, struct nfs4_acl *dacl)
-{
-       struct list_head *h, *n;
-       struct nfs4_ace *ace;
-       int error = 0;
-
-       list_for_each_safe(h, n, &acl->ace_head) {
-               ace = list_entry(h, struct nfs4_ace, l_ace);
-
+               return ret;
+       ret = init_state(&default_acl_state, acl->naces);
+       if (ret)
+               goto out_estate;
+       ret = -EINVAL;
+       for (ace = acl->aces; ace < acl->aces + acl->naces; ace++) {
                if (ace->type != NFS4_ACE_ACCESS_ALLOWED_ACE_TYPE &&
                    ace->type != NFS4_ACE_ACCESS_DENIED_ACE_TYPE)
-                       return -EINVAL;
-
+                       goto out_dstate;
                if (ace->flag & ~NFS4_SUPPORTED_FLAGS)
-                       return -EINVAL;
-
-               switch (ace->flag & NFS4_INHERITANCE_FLAGS) {
-               case 0:
-                       /* Leave this ace in the effective acl: */
+                       goto out_dstate;
+               if ((ace->flag & NFS4_INHERITANCE_FLAGS) == 0) {
+                       process_one_v4_ace(&effective_acl_state, ace);
                        continue;
-               case NFS4_INHERITANCE_FLAGS:
-                       /* Add this ace to the default acl and remove it
-                        * from the effective acl: */
-                       error = nfs4_acl_add_ace(dacl, ace->type, ace->flag,
-                               ace->access_mask, ace->whotype, ace->who);
-                       if (error)
-                               return error;
-                       list_del(h);
-                       kfree(ace);
-                       acl->naces--;
-                       break;
-               case NFS4_INHERITANCE_FLAGS & ~NFS4_ACE_INHERIT_ONLY_ACE:
-                       /* Add this ace to the default, but leave it in
-                        * the effective acl as well: */
-                       error = nfs4_acl_add_ace(dacl, ace->type, ace->flag,
-                               ace->access_mask, ace->whotype, ace->who);
-                       if (error)
-                               return error;
-                       break;
-               default:
-                       return -EINVAL;
                }
+               if (!(flags & NFS4_ACL_DIR))
+                       goto out_dstate;
+               /*
+                * Note that when only one of FILE_INHERIT or DIRECTORY_INHERIT
+                * is set, we're effectively turning on the other.  That's OK,
+                * according to rfc 3530.
+                */
+               process_one_v4_ace(&default_acl_state, ace);
+
+               if (!(ace->flag & NFS4_ACE_INHERIT_ONLY_ACE))
+                       process_one_v4_ace(&effective_acl_state, ace);
        }
-       return 0;
+       *pacl = posix_state_to_acl(&effective_acl_state, flags);
+       if (IS_ERR(*pacl)) {
+               ret = PTR_ERR(*pacl);
+               goto out_dstate;
+       }
+       *dpacl = posix_state_to_acl(&default_acl_state,
+                                               flags | NFS4_ACL_TYPE_DEFAULT);
+       if (IS_ERR(*dpacl)) {
+               ret = PTR_ERR(*dpacl);
+               posix_acl_release(*pacl);
+               goto out_dstate;
+       }
+       sort_pacl(*pacl);
+       sort_pacl(*dpacl);
+       ret = 0;
+out_dstate:
+       free_state(&default_acl_state);
+out_estate:
+       free_state(&effective_acl_state);
+       return ret;
 }
 
 static short
@@ -759,48 +774,22 @@ EXPORT_SYMBOL(nfs4_acl_posix_to_nfsv4);
 EXPORT_SYMBOL(nfs4_acl_nfsv4_to_posix);
 
 struct nfs4_acl *
-nfs4_acl_new(void)
+nfs4_acl_new(int n)
 {
        struct nfs4_acl *acl;
 
-       if ((acl = kmalloc(sizeof(*acl), GFP_KERNEL)) == NULL)
+       acl = kmalloc(sizeof(*acl) + n*sizeof(struct nfs4_ace), GFP_KERNEL);
+       if (acl == NULL)
                return NULL;
-
        acl->naces = 0;
-       INIT_LIST_HEAD(&acl->ace_head);
-
        return acl;
 }
 
 void
-nfs4_acl_free(struct nfs4_acl *acl)
-{
-       struct list_head *h;
-       struct nfs4_ace *ace;
-
-       if (!acl)
-               return;
-
-       while (!list_empty(&acl->ace_head)) {
-               h = acl->ace_head.next;
-               list_del(h);
-               ace = list_entry(h, struct nfs4_ace, l_ace);
-               kfree(ace);
-       }
-
-       kfree(acl);
-
-       return;
-}
-
-int
 nfs4_acl_add_ace(struct nfs4_acl *acl, u32 type, u32 flag, u32 access_mask,
                int whotype, uid_t who)
 {
-       struct nfs4_ace *ace;
-
-       if ((ace = kmalloc(sizeof(*ace), GFP_KERNEL)) == NULL)
-               return -ENOMEM;
+       struct nfs4_ace *ace = acl->aces + acl->naces;
 
        ace->type = type;
        ace->flag = flag;
@@ -808,10 +797,7 @@ nfs4_acl_add_ace(struct nfs4_acl *acl, u32 type, u32 flag, u32 access_mask,
        ace->whotype = whotype;
        ace->who = who;
 
-       list_add_tail(&ace->l_ace, &acl->ace_head);
        acl->naces++;
-
-       return 0;
 }
 
 static struct {
@@ -865,7 +851,6 @@ nfs4_acl_write_who(int who, char *p)
 }
 
 EXPORT_SYMBOL(nfs4_acl_new);
-EXPORT_SYMBOL(nfs4_acl_free);
 EXPORT_SYMBOL(nfs4_acl_add_ace);
 EXPORT_SYMBOL(nfs4_acl_get_whotype);
 EXPORT_SYMBOL(nfs4_acl_write_who);
index f57655a7a2b66b9ae1b1567e9d5500b581a5c9ae..fb14d68eacab846db08f92bbcdca7a1aff56e43c 100644 (file)
@@ -387,7 +387,6 @@ nfsd4_probe_callback(struct nfs4_client *clp)
                .address        = (struct sockaddr *)&addr,
                .addrsize       = sizeof(addr),
                .timeout        = &timeparms,
-               .servername     = clp->cl_name.data,
                .program        = program,
                .version        = nfs_cb_version[1]->number,
                .authflavor     = RPC_AUTH_UNIX,        /* XXX: need AUTH_GSS... */
@@ -397,6 +396,7 @@ nfsd4_probe_callback(struct nfs4_client *clp)
                .rpc_proc       = &nfs4_cb_procedures[NFSPROC4_CLNT_CB_NULL],
                .rpc_argp       = clp,
        };
+       char clientname[16];
        int status;
 
        if (atomic_read(&cb->cb_set))
@@ -419,6 +419,11 @@ nfsd4_probe_callback(struct nfs4_client *clp)
        memset(program->stats, 0, sizeof(cb->cb_stat));
        program->stats->program = program;
 
+       /* Just here to make some printk's more useful: */
+       snprintf(clientname, sizeof(clientname),
+               "%u.%u.%u.%u", NIPQUAD(addr.sin_addr));
+       args.servername = clientname;
+
        /* Create RPC client */
        cb->cb_client = rpc_create(&args);
        if (IS_ERR(cb->cb_client)) {
index b1902ebaab4158d03cbe1482426d89de80f76fd7..e4a83d727afda0e2f85e293783dce44b2e351fd5 100644 (file)
@@ -50,7 +50,6 @@
 #include <linux/sunrpc/cache.h>
 #include <linux/nfsd_idmap.h>
 #include <linux/list.h>
-#include <linux/sched.h>
 #include <linux/time.h>
 #include <linux/seq_file.h>
 #include <linux/sunrpc/svcauth.h>
index 9de89df961f42afe3ddd4c79dcc61a9b8aa634b9..9e4067999209e4bd847f334ab121f1b2bd4deef5 100644 (file)
@@ -714,7 +714,7 @@ __be32
 nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                  struct nfsd4_setclientid *setclid)
 {
-       __be32                  ip_addr = rqstp->rq_addr.sin_addr.s_addr;
+       struct sockaddr_in      *sin = svc_addr_in(rqstp);
        struct xdr_netobj       clname = { 
                .len = setclid->se_namelen,
                .data = setclid->se_name,
@@ -749,7 +749,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                 */
                status = nfserr_clid_inuse;
                if (!cmp_creds(&conf->cl_cred, &rqstp->rq_cred)
-                               || conf->cl_addr != ip_addr) {
+                               || conf->cl_addr != sin->sin_addr.s_addr) {
                        printk("NFSD: setclientid: string in use by client"
                        "(clientid %08x/%08x)\n",
                        conf->cl_clientid.cl_boot, conf->cl_clientid.cl_id);
@@ -769,7 +769,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                if (new == NULL)
                        goto out;
                copy_verf(new, &clverifier);
-               new->cl_addr = ip_addr;
+               new->cl_addr = sin->sin_addr.s_addr;
                copy_cred(&new->cl_cred,&rqstp->rq_cred);
                gen_clid(new);
                gen_confirm(new);
@@ -801,7 +801,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                if (new == NULL)
                        goto out;
                copy_verf(new,&conf->cl_verifier);
-               new->cl_addr = ip_addr;
+               new->cl_addr = sin->sin_addr.s_addr;
                copy_cred(&new->cl_cred,&rqstp->rq_cred);
                copy_clid(new, conf);
                gen_confirm(new);
@@ -820,7 +820,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                if (new == NULL)
                        goto out;
                copy_verf(new,&clverifier);
-               new->cl_addr = ip_addr;
+               new->cl_addr = sin->sin_addr.s_addr;
                copy_cred(&new->cl_cred,&rqstp->rq_cred);
                gen_clid(new);
                gen_confirm(new);
@@ -847,7 +847,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                if (new == NULL)
                        goto out;
                copy_verf(new,&clverifier);
-               new->cl_addr = ip_addr;
+               new->cl_addr = sin->sin_addr.s_addr;
                copy_cred(&new->cl_cred,&rqstp->rq_cred);
                gen_clid(new);
                gen_confirm(new);
@@ -881,7 +881,7 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
                         struct nfsd4_compound_state *cstate,
                         struct nfsd4_setclientid_confirm *setclientid_confirm)
 {
-       __be32 ip_addr = rqstp->rq_addr.sin_addr.s_addr;
+       struct sockaddr_in *sin = svc_addr_in(rqstp);
        struct nfs4_client *conf, *unconf;
        nfs4_verifier confirm = setclientid_confirm->sc_confirm; 
        clientid_t * clid = &setclientid_confirm->sc_clientid;
@@ -900,9 +900,9 @@ nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
        unconf = find_unconfirmed_client(clid);
 
        status = nfserr_clid_inuse;
-       if (conf && conf->cl_addr != ip_addr)
+       if (conf && conf->cl_addr != sin->sin_addr.s_addr)
                goto out;
-       if (unconf && unconf->cl_addr != ip_addr)
+       if (unconf && unconf->cl_addr != sin->sin_addr.s_addr)
                goto out;
 
        if ((conf && unconf) && 
index 18aa9440df14400eaf63f3d2d7cdedfff8b1952d..5d090f11f2bee92c3e371fbd0ae982df7d6a758d 100644 (file)
@@ -199,24 +199,22 @@ defer_free(struct nfsd4_compoundargs *argp,
 
 static char *savemem(struct nfsd4_compoundargs *argp, __be32 *p, int nbytes)
 {
-       void *new = NULL;
        if (p == argp->tmp) {
-               new = kmalloc(nbytes, GFP_KERNEL);
-               if (!new) return NULL;
-               p = new;
+               p = kmalloc(nbytes, GFP_KERNEL);
+               if (!p)
+                       return NULL;
                memcpy(p, argp->tmp, nbytes);
        } else {
                BUG_ON(p != argp->tmpp);
                argp->tmpp = NULL;
        }
        if (defer_free(argp, kfree, p)) {
-               kfree(new);
+               kfree(p);
                return NULL;
        } else
                return (char *)p;
 }
 
-
 static __be32
 nfsd4_decode_bitmap(struct nfsd4_compoundargs *argp, u32 *bmval)
 {
@@ -255,7 +253,7 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, struct iattr *ia
                return status;
 
        /*
-        * According to spec, unsupported attributes return ERR_NOTSUPP;
+        * According to spec, unsupported attributes return ERR_ATTRNOTSUPP;
         * read-only attributes return ERR_INVAL.
         */
        if ((bmval[0] & ~NFSD_SUPPORTED_ATTRS_WORD0) || (bmval[1] & ~NFSD_SUPPORTED_ATTRS_WORD1))
@@ -273,42 +271,42 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, struct iattr *ia
                iattr->ia_valid |= ATTR_SIZE;
        }
        if (bmval[0] & FATTR4_WORD0_ACL) {
-               int nace, i;
-               struct nfs4_ace ace;
+               int nace;
+               struct nfs4_ace *ace;
 
                READ_BUF(4); len += 4;
                READ32(nace);
 
-               *acl = nfs4_acl_new();
+               if (nace > NFS4_ACL_MAX)
+                       return nfserr_resource;
+
+               *acl = nfs4_acl_new(nace);
                if (*acl == NULL) {
                        host_err = -ENOMEM;
                        goto out_nfserr;
                }
-               defer_free(argp, (void (*)(const void *))nfs4_acl_free, *acl);
+               defer_free(argp, kfree, *acl);
 
-               for (i = 0; i < nace; i++) {
+               (*acl)->naces = nace;
+               for (ace = (*acl)->aces; ace < (*acl)->aces + nace; ace++) {
                        READ_BUF(16); len += 16;
-                       READ32(ace.type);
-                       READ32(ace.flag);
-                       READ32(ace.access_mask);
+                       READ32(ace->type);
+                       READ32(ace->flag);
+                       READ32(ace->access_mask);
                        READ32(dummy32);
                        READ_BUF(dummy32);
                        len += XDR_QUADLEN(dummy32) << 2;
                        READMEM(buf, dummy32);
-                       ace.whotype = nfs4_acl_get_whotype(buf, dummy32);
+                       ace->whotype = nfs4_acl_get_whotype(buf, dummy32);
                        host_err = 0;
-                       if (ace.whotype != NFS4_ACL_WHO_NAMED)
-                               ace.who = 0;
-                       else if (ace.flag & NFS4_ACE_IDENTIFIER_GROUP)
+                       if (ace->whotype != NFS4_ACL_WHO_NAMED)
+                               ace->who = 0;
+                       else if (ace->flag & NFS4_ACE_IDENTIFIER_GROUP)
                                host_err = nfsd_map_name_to_gid(argp->rqstp,
-                                               buf, dummy32, &ace.who);
+                                               buf, dummy32, &ace->who);
                        else
                                host_err = nfsd_map_name_to_uid(argp->rqstp,
-                                               buf, dummy32, &ace.who);
-                       if (host_err)
-                               goto out_nfserr;
-                       host_err = nfs4_acl_add_ace(*acl, ace.type, ace.flag,
-                                ace.access_mask, ace.whotype, ace.who);
+                                               buf, dummy32, &ace->who);
                        if (host_err)
                                goto out_nfserr;
                }
@@ -1563,14 +1561,20 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
                if (exp->ex_fslocs.migrated) {
                        WRITE64(NFS4_REFERRAL_FSID_MAJOR);
                        WRITE64(NFS4_REFERRAL_FSID_MINOR);
-               } else if (is_fsid(fhp, rqstp->rq_reffh)) {
+               } else switch(fsid_source(fhp)) {
+               case FSIDSOURCE_FSID:
                        WRITE64((u64)exp->ex_fsid);
                        WRITE64((u64)0);
-               } else {
+                       break;
+               case FSIDSOURCE_DEV:
                        WRITE32(0);
                        WRITE32(MAJOR(stat.dev));
                        WRITE32(0);
                        WRITE32(MINOR(stat.dev));
+                       break;
+               case FSIDSOURCE_UUID:
+                       WRITEMEM(exp->ex_uuid, 16);
+                       break;
                }
        }
        if (bmval0 & FATTR4_WORD0_UNIQUE_HANDLES) {
@@ -1590,7 +1594,6 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
        }
        if (bmval0 & FATTR4_WORD0_ACL) {
                struct nfs4_ace *ace;
-               struct list_head *h;
 
                if (acl == NULL) {
                        if ((buflen -= 4) < 0)
@@ -1603,9 +1606,7 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
                        goto out_resource;
                WRITE32(acl->naces);
 
-               list_for_each(h, &acl->ace_head) {
-                       ace = list_entry(h, struct nfs4_ace, l_ace);
-
+               for (ace = acl->aces; ace < acl->aces + acl->naces; ace++) {
                        if ((buflen -= 4*3) < 0)
                                goto out_resource;
                        WRITE32(ace->type);
@@ -1815,7 +1816,7 @@ out_acl:
        status = nfs_ok;
 
 out:
-       nfs4_acl_free(acl);
+       kfree(acl);
        if (fhp == &tempfh)
                fh_put(&tempfh);
        return status;
index f90d70475854f5b85f2f20a5bc61a1821a6cae37..578f2c9d56bec09899d4dc1c0ca135320e7c6bf9 100644 (file)
@@ -185,7 +185,7 @@ nfsd_cache_lookup(struct svc_rqst *rqstp, int type)
        rp->c_state = RC_INPROG;
        rp->c_xid = xid;
        rp->c_proc = proc;
-       rp->c_addr = rqstp->rq_addr;
+       memcpy(&rp->c_addr, svc_addr_in(rqstp), sizeof(rp->c_addr));
        rp->c_prot = proto;
        rp->c_vers = vers;
        rp->c_timestamp = jiffies;
index eedf2e3990a9a8f3d0bdad85faa119f4eef4ef97..71c686dc7257140f3c12c7cd0549d93af3f48816 100644 (file)
@@ -123,7 +123,7 @@ static ssize_t nfsctl_transaction_write(struct file *file, const char __user *bu
                return PTR_ERR(data);
 
        rv =  write_op[ino](file, data, size);
-       if (rv>0) {
+       if (rv >= 0) {
                simple_transaction_set(file, rv);
                rv = size;
        }
index c59d6fbb7a6bedb71446f33808bcb90ebf667670..c2660cbfcd96edac59b82419fd31c347c1b05f59 100644 (file)
@@ -9,7 +9,6 @@
  * ... and again Southern-Winter 2001 to support export_operations
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/smp_lock.h>
 #include <linux/fs.h>
@@ -20,6 +19,7 @@
 #include <linux/mount.h>
 #include <asm/pgtable.h>
 
+#include <linux/sunrpc/clnt.h>
 #include <linux/sunrpc/svc.h>
 #include <linux/nfsd/nfsd.h>
 
@@ -118,9 +118,6 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access)
 
        dprintk("nfsd: fh_verify(%s)\n", SVCFH_fmt(fhp));
 
-       /* keep this filehandle for possible reference  when encoding attributes */
-       rqstp->rq_reffh = fh;
-
        if (!fhp->fh_dentry) {
                __u32 *datap=NULL;
                __u32 tfh[3];           /* filehandle fragment for oldstyle filehandles */
@@ -145,10 +142,10 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access)
                        }
                        len = key_len(fh->fh_fsid_type) / 4;
                        if (len == 0) goto out;
-                       if  (fh->fh_fsid_type == 2) {
+                       if  (fh->fh_fsid_type == FSID_MAJOR_MINOR) {
                                /* deprecated, convert to type 3 */
-                               len = 3;
-                               fh->fh_fsid_type = 3;
+                               len = key_len(FSID_ENCODE_DEV)/4;
+                               fh->fh_fsid_type = FSID_ENCODE_DEV;
                                fh->fh_fsid[0] = new_encode_dev(MKDEV(ntohl(fh->fh_fsid[0]), ntohl(fh->fh_fsid[1])));
                                fh->fh_fsid[1] = fh->fh_fsid[2];
                        }
@@ -163,8 +160,9 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access)
                        /* assume old filehandle format */
                        xdev = old_decode_dev(fh->ofh_xdev);
                        xino = u32_to_ino_t(fh->ofh_xino);
-                       mk_fsid_v0(tfh, xdev, xino);
-                       exp = exp_find(rqstp->rq_client, 0, tfh, &rqstp->rq_chandle);
+                       mk_fsid(FSID_DEV, tfh, xdev, xino, 0, NULL);
+                       exp = exp_find(rqstp->rq_client, FSID_DEV, tfh,
+                                      &rqstp->rq_chandle);
                }
 
                if (IS_ERR(exp) && (PTR_ERR(exp) == -EAGAIN
@@ -180,10 +178,10 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access)
                /* Check if the request originated from a secure port. */
                error = nfserr_perm;
                if (!rqstp->rq_secure && EX_SECURE(exp)) {
+                       char buf[RPC_MAX_ADDRBUFLEN];
                        printk(KERN_WARNING
-                              "nfsd: request from insecure port (%u.%u.%u.%u:%d)!\n",
-                              NIPQUAD(rqstp->rq_addr.sin_addr.s_addr),
-                              ntohs(rqstp->rq_addr.sin_port));
+                              "nfsd: request from insecure port %s!\n",
+                              svc_print_addr(rqstp, buf, sizeof(buf)));
                        goto out;
                }
 
@@ -211,7 +209,7 @@ fh_verify(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, int access)
                                fileid_type = 2;
                } else
                        fileid_type = fh->fh_fileid_type;
-               
+
                if (fileid_type == 0)
                        dentry = dget(exp->ex_dentry);
                else {
@@ -291,7 +289,7 @@ static inline int _fh_update(struct dentry *dentry, struct svc_export *exp,
                             __u32 *datap, int *maxsize)
 {
        struct export_operations *nop = exp->ex_mnt->mnt_sb->s_export_op;
-       
+
        if (dentry == exp->ex_dentry) {
                *maxsize = 0;
                return 0;
@@ -316,7 +314,8 @@ static inline void _fh_update_old(struct dentry *dentry,
 }
 
 __be32
-fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, struct svc_fh *ref_fh)
+fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry,
+          struct svc_fh *ref_fh)
 {
        /* ref_fh is a reference file handle.
         * if it is non-null and for the same filesystem, then we should compose
@@ -326,12 +325,13 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, st
         *
         */
 
-       u8 ref_fh_version = 0;
-       u8 ref_fh_fsid_type = 0;
+       u8 version = 1;
+       u8 fsid_type = 0;
        struct inode * inode = dentry->d_inode;
        struct dentry *parent = dentry->d_parent;
        __u32 *datap;
        dev_t ex_dev = exp->ex_dentry->d_inode->i_sb->s_dev;
+       int root_export = (exp->ex_dentry == exp->ex_dentry->d_sb->s_root);
 
        dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %s/%s, ino=%ld)\n",
                MAJOR(ex_dev), MINOR(ex_dev),
@@ -339,57 +339,64 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, st
                parent->d_name.name, dentry->d_name.name,
                (inode ? inode->i_ino : 0));
 
+       /* Choose filehandle version and fsid type based on
+        * the reference filehandle (if it is in the same export)
+        * or the export options.
+        */
        if (ref_fh && ref_fh->fh_export == exp) {
-               ref_fh_version = ref_fh->fh_handle.fh_version;
-               if (ref_fh_version == 0xca)
-                       ref_fh_fsid_type = 0;
+               version = ref_fh->fh_handle.fh_version;
+               if (version == 0xca)
+                       fsid_type = FSID_DEV;
                else
-                       ref_fh_fsid_type = ref_fh->fh_handle.fh_fsid_type;
-               if (ref_fh_fsid_type > 3)
-                       ref_fh_fsid_type = 0;
-
-               /* make sure ref_fh type works for given export */
-               if (ref_fh_fsid_type == 1 &&
-                   !(exp->ex_flags & NFSEXP_FSID)) {
-                       /* if we don't have an fsid, we cannot provide one... */
-                       ref_fh_fsid_type = 0;
+                       fsid_type = ref_fh->fh_handle.fh_fsid_type;
+               /* We know this version/type works for this export
+                * so there is no need for further checks.
+                */
+       } else if (exp->ex_uuid) {
+               if (fhp->fh_maxsize >= 64) {
+                       if (root_export)
+                               fsid_type = FSID_UUID16;
+                       else
+                               fsid_type = FSID_UUID16_INUM;
+               } else {
+                       if (root_export)
+                               fsid_type = FSID_UUID8;
+                       else
+                               fsid_type = FSID_UUID4_INUM;
                }
        } else if (exp->ex_flags & NFSEXP_FSID)
-               ref_fh_fsid_type = 1;
-
-       if (!old_valid_dev(ex_dev) && ref_fh_fsid_type == 0) {
+               fsid_type = FSID_NUM;
+       else if (!old_valid_dev(ex_dev))
                /* for newer device numbers, we must use a newer fsid format */
-               ref_fh_version = 1;
-               ref_fh_fsid_type = 3;
-       }
-       if (old_valid_dev(ex_dev) &&
-           (ref_fh_fsid_type == 2 || ref_fh_fsid_type == 3))
-               /* must use type1 for smaller device numbers */
-               ref_fh_fsid_type = 0;
+               fsid_type = FSID_ENCODE_DEV;
+       else
+               fsid_type = FSID_DEV;
 
        if (ref_fh == fhp)
                fh_put(ref_fh);
 
        if (fhp->fh_locked || fhp->fh_dentry) {
                printk(KERN_ERR "fh_compose: fh %s/%s not initialized!\n",
-                       parent->d_name.name, dentry->d_name.name);
+                      parent->d_name.name, dentry->d_name.name);
        }
        if (fhp->fh_maxsize < NFS_FHSIZE)
                printk(KERN_ERR "fh_compose: called with maxsize %d! %s/%s\n",
-                      fhp->fh_maxsize, parent->d_name.name, dentry->d_name.name);
+                      fhp->fh_maxsize,
+                      parent->d_name.name, dentry->d_name.name);
 
        fhp->fh_dentry = dget(dentry); /* our internal copy */
        fhp->fh_export = exp;
        cache_get(&exp->h);
 
-       if (ref_fh_version == 0xca) {
+       if (version == 0xca) {
                /* old style filehandle please */
                memset(&fhp->fh_handle.fh_base, 0, NFS_FHSIZE);
                fhp->fh_handle.fh_size = NFS_FHSIZE;
                fhp->fh_handle.ofh_dcookie = 0xfeebbaca;
                fhp->fh_handle.ofh_dev =  old_encode_dev(ex_dev);
                fhp->fh_handle.ofh_xdev = fhp->fh_handle.ofh_dev;
-               fhp->fh_handle.ofh_xino = ino_t_to_u32(exp->ex_dentry->d_inode->i_ino);
+               fhp->fh_handle.ofh_xino =
+                       ino_t_to_u32(exp->ex_dentry->d_inode->i_ino);
                fhp->fh_handle.ofh_dirino = ino_t_to_u32(parent_ino(dentry));
                if (inode)
                        _fh_update_old(dentry, exp, &fhp->fh_handle);
@@ -398,38 +405,12 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, st
                fhp->fh_handle.fh_version = 1;
                fhp->fh_handle.fh_auth_type = 0;
                datap = fhp->fh_handle.fh_auth+0;
-               fhp->fh_handle.fh_fsid_type = ref_fh_fsid_type;
-               switch (ref_fh_fsid_type) {
-                       case 0:
-                               /*
-                                * fsid_type 0:
-                                * 2byte major, 2byte minor, 4byte inode
-                                */
-                               mk_fsid_v0(datap, ex_dev,
-                                       exp->ex_dentry->d_inode->i_ino);
-                               break;
-                       case 1:
-                               /* fsid_type 1 == 4 bytes filesystem id */
-                               mk_fsid_v1(datap, exp->ex_fsid);
-                               break;
-                       case 2:
-                               /*
-                                * fsid_type 2:
-                                * 4byte major, 4byte minor, 4byte inode
-                                */
-                               mk_fsid_v2(datap, ex_dev,
-                                       exp->ex_dentry->d_inode->i_ino);
-                               break;
-                       case 3:
-                               /*
-                                * fsid_type 3:
-                                * 4byte devicenumber, 4byte inode
-                                */
-                               mk_fsid_v3(datap, ex_dev,
-                                       exp->ex_dentry->d_inode->i_ino);
-                               break;
-               }
-               len = key_len(ref_fh_fsid_type);
+               fhp->fh_handle.fh_fsid_type = fsid_type;
+               mk_fsid(fsid_type, datap, ex_dev,
+                       exp->ex_dentry->d_inode->i_ino,
+                       exp->ex_fsid, exp->ex_uuid);
+
+               len = key_len(fsid_type);
                datap += len/4;
                fhp->fh_handle.fh_size = 4 + len;
 
@@ -456,7 +437,7 @@ fh_update(struct svc_fh *fhp)
 {
        struct dentry *dentry;
        __u32 *datap;
-       
+
        if (!fhp->fh_dentry)
                goto out_bad;
 
@@ -533,3 +514,22 @@ char * SVCFH_fmt(struct svc_fh *fhp)
                fh->fh_base.fh_pad[5]);
        return buf;
 }
+
+enum fsid_source fsid_source(struct svc_fh *fhp)
+{
+       if (fhp->fh_handle.fh_version != 1)
+               return FSIDSOURCE_DEV;
+       switch(fhp->fh_handle.fh_fsid_type) {
+       case FSID_DEV:
+       case FSID_ENCODE_DEV:
+       case FSID_MAJOR_MINOR:
+               return FSIDSOURCE_DEV;
+       case FSID_NUM:
+               return FSIDSOURCE_FSID;
+       default:
+               if (fhp->fh_export->ex_flags & NFSEXP_FSID)
+                       return FSIDSOURCE_FSID;
+               else
+                       return FSIDSOURCE_UUID;
+       }
+}
index ec983b777680ded981c59dbb65c81ebb0c5637dc..5cc2eec981b8763012794ef1f4da0ab5cc50df3d 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/unistd.h>
 #include <linux/slab.h>
 
+#include <linux/sunrpc/clnt.h>
 #include <linux/sunrpc/svc.h>
 #include <linux/nfsd/nfsd.h>
 #include <linux/nfsd/cache.h>
@@ -147,10 +148,10 @@ nfsd_proc_read(struct svc_rqst *rqstp, struct nfsd_readargs *argp,
         */
 
        if (NFSSVC_MAXBLKSIZE_V2 < argp->count) {
+               char buf[RPC_MAX_ADDRBUFLEN];
                printk(KERN_NOTICE
-                       "oversized read request from %u.%u.%u.%u:%d (%d bytes)\n",
-                               NIPQUAD(rqstp->rq_addr.sin_addr.s_addr),
-                               ntohs(rqstp->rq_addr.sin_port),
+                       "oversized read request from %s (%d bytes)\n",
+                               svc_print_addr(rqstp, buf, sizeof(buf)),
                                argp->count);
                argp->count = NFSSVC_MAXBLKSIZE_V2;
        }
index fbf5d51947ea3e252185457e33cc163dbf30d660..d7759ce6ed94a64ac260da20e2fe8fde94d1e618 100644 (file)
@@ -235,7 +235,8 @@ static int nfsd_init_socks(int port)
 
        error = lockd_up(IPPROTO_UDP);
        if (error >= 0) {
-               error = svc_makesock(nfsd_serv, IPPROTO_UDP, port);
+               error = svc_makesock(nfsd_serv, IPPROTO_UDP, port,
+                                       SVC_SOCK_DEFAULTS);
                if (error < 0)
                        lockd_down();
        }
@@ -245,7 +246,8 @@ static int nfsd_init_socks(int port)
 #ifdef CONFIG_NFSD_TCP
        error = lockd_up(IPPROTO_TCP);
        if (error >= 0) {
-               error = svc_makesock(nfsd_serv, IPPROTO_TCP, port);
+               error = svc_makesock(nfsd_serv, IPPROTO_TCP, port,
+                                       SVC_SOCK_DEFAULTS);
                if (error < 0)
                        lockd_down();
        }
index 6555c50d9006966f37f659f39e837c30a53c7c03..0c24b9e24fe866683a357f1a9e8b08bcb2fbe30c 100644 (file)
@@ -153,6 +153,7 @@ encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp,
        struct dentry   *dentry = fhp->fh_dentry;
        int type;
        struct timespec time;
+       u32 f;
 
        type = (stat->mode & S_IFMT);
 
@@ -173,10 +174,22 @@ encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp,
        else
                *p++ = htonl(0xffffffff);
        *p++ = htonl((u32) stat->blocks);
-       if (is_fsid(fhp, rqstp->rq_reffh))
-               *p++ = htonl((u32) fhp->fh_export->ex_fsid);
-       else
+       switch (fsid_source(fhp)) {
+       default:
+       case FSIDSOURCE_DEV:
                *p++ = htonl(new_encode_dev(stat->dev));
+               break;
+       case FSIDSOURCE_FSID:
+               *p++ = htonl((u32) fhp->fh_export->ex_fsid);
+               break;
+       case FSIDSOURCE_UUID:
+               f = ((u32*)fhp->fh_export->ex_uuid)[0];
+               f ^= ((u32*)fhp->fh_export->ex_uuid)[1];
+               f ^= ((u32*)fhp->fh_export->ex_uuid)[2];
+               f ^= ((u32*)fhp->fh_export->ex_uuid)[3];
+               *p++ = htonl(f);
+               break;
+       }
        *p++ = htonl((u32) stat->ino);
        *p++ = htonl((u32) stat->atime.tv_sec);
        *p++ = htonl(stat->atime.tv_nsec ? stat->atime.tv_nsec / 1000 : 0);
index 8283236c6a0f1f8034f5006ed484cf4b2bb758eb..7e6aa245b5d5f30b270c5336267eb77760be41ac 100644 (file)
@@ -466,7 +466,10 @@ out:
        posix_acl_release(dpacl);
        return (error);
 out_nfserr:
-       error = nfserrno(host_error);
+       if (host_error == -EOPNOTSUPP)
+               error = nfserr_attrnotsupp;
+       else
+               error = nfserrno(host_error);
        goto out;
 }
 
index c577d8e1bd95d530604386e293f4ec5dd3884ce9..7659cc1929953cb0045d9451b1614e76a52e9b03 100644 (file)
@@ -1921,7 +1921,7 @@ s64 ntfs_attr_extend_allocation(ntfs_inode *ni, s64 new_alloc_size,
        u32 attr_len = 0; /* Silence stupid gcc warning. */
        bool mp_rebuilt;
 
-#ifdef NTFS_DEBUG
+#ifdef DEBUG
        read_lock_irqsave(&ni->size_lock, flags);
        allocated_size = ni->allocated_size;
        read_unlock_irqrestore(&ni->size_lock, flags);
index 076c9420c257dc6d0e8842135d7a87f6dcc74a61..d69c4595ccd0755611c2a0409d00e001a6e2b389 100644 (file)
@@ -2328,7 +2328,7 @@ const struct file_operations ntfs_file_ops = {
                                                    the data source. */
 };
 
-struct inode_operations ntfs_file_inode_ops = {
+const struct inode_operations ntfs_file_inode_ops = {
 #ifdef NTFS_RW
        .truncate       = ntfs_truncate_vfs,
        .setattr        = ntfs_setattr,
@@ -2337,4 +2337,4 @@ struct inode_operations ntfs_file_inode_ops = {
 
 const struct file_operations ntfs_empty_file_ops = {};
 
-struct inode_operations ntfs_empty_inode_ops = {};
+const struct inode_operations ntfs_empty_inode_ops = {};
index eddb2247cec5897319eb719805e19e62295c008b..bff01a54675ae1e04cbaa3d39648239cec11055b 100644 (file)
@@ -359,7 +359,7 @@ err_out:
 /**
  * Inode operations for directories.
  */
-struct inode_operations ntfs_dir_inode_ops = {
+const struct inode_operations ntfs_dir_inode_ops = {
        .lookup = ntfs_lookup,  /* VFS: Lookup directory. */
 };
 
index a12847ae467d3a595dc020d646b7912b5f2cbc4e..d73f5a9ac341b62d658ecf81dd8d3eebf142c685 100644 (file)
@@ -61,13 +61,13 @@ extern const struct address_space_operations ntfs_aops;
 extern const struct address_space_operations ntfs_mst_aops;
 
 extern const struct  file_operations ntfs_file_ops;
-extern struct inode_operations ntfs_file_inode_ops;
+extern const struct inode_operations ntfs_file_inode_ops;
 
 extern const struct  file_operations ntfs_dir_ops;
-extern struct inode_operations ntfs_dir_inode_ops;
+extern const struct inode_operations ntfs_dir_inode_ops;
 
 extern const struct  file_operations ntfs_empty_file_ops;
-extern struct inode_operations ntfs_empty_inode_ops;
+extern const struct inode_operations ntfs_empty_inode_ops;
 
 extern struct export_operations ntfs_export_ops;
 
index babf94d90deff8dd4a51e624055c2132c00265a5..1594c90b71641af88986d6fee2c526b3c21eddcf 100644 (file)
@@ -2699,7 +2699,7 @@ static int ntfs_statfs(struct dentry *dentry, struct kstatfs *sfs)
 /**
  * The complete super operations.
  */
-static struct super_operations ntfs_sops = {
+static const struct super_operations ntfs_sops = {
        .alloc_inode    = ntfs_alloc_big_inode,   /* VFS: Allocate new inode. */
        .destroy_inode  = ntfs_destroy_big_inode, /* VFS: Deallocate inode. */
 #ifdef NTFS_RW
index 1c23138d00b340287664ee3587e6518e368a905a..4847fbfb0107af9a687dccdd4a77f9c3690bdf02 100644 (file)
 #include "sysctl.h"
 #include "debug.h"
 
-#define FS_NTFS        1
-
 /* Definition of the ntfs sysctl. */
 static ctl_table ntfs_sysctls[] = {
-       { FS_NTFS, "ntfs-debug",                /* Binary and text IDs. */
-         &debug_msgs,sizeof(debug_msgs),       /* Data pointer and size. */
-         0644, NULL, &proc_dointvec },         /* Mode, child, proc handler. */
-       { 0 }
+       {
+               .ctl_name       = CTL_UNNUMBERED,       /* Binary and text IDs. */
+               .procname       = "ntfs-debug",
+               .data           = &debug_msgs,          /* Data pointer and size. */
+               .maxlen         = sizeof(debug_msgs),
+               .mode           = 0644,                 /* Mode, proc handler. */
+               .proc_handler   = &proc_dointvec
+       },
+       {}
 };
 
 /* Define the parent directory /proc/sys/fs. */
 static ctl_table sysctls_root[] = {
-       { CTL_FS, "fs", NULL, 0, 0555, ntfs_sysctls },
-       { 0 }
+       {
+               .ctl_name       = CTL_FS,
+               .procname       = "fs",
+               .mode           = 0555,
+               .child          = ntfs_sysctls
+       },
+       {}
 };
 
 /* Storage for the sysctls header. */
@@ -62,17 +70,9 @@ int ntfs_sysctl(int add)
 {
        if (add) {
                BUG_ON(sysctls_root_table);
-               sysctls_root_table = register_sysctl_table(sysctls_root, 0);
+               sysctls_root_table = register_sysctl_table(sysctls_root);
                if (!sysctls_root_table)
                        return -ENOMEM;
-#ifdef CONFIG_PROC_FS
-               /*
-                * If the proc filesystem is in use and we are a module, need
-                * to set the owner of our proc entry to our module. In the
-                * non-modular case, THIS_MODULE is NULL, so this is ok.
-                */
-               ntfs_sysctls[0].de->owner = THIS_MODULE;
-#endif
        } else {
                BUG_ON(!sysctls_root_table);
                unregister_sysctl_table(sysctls_root_table);
index b17333a0606b55cf641ae90c3997918e7ef64992..9f5ad0f01ce0d885e787003d07c4fa0907139dc0 100644 (file)
@@ -55,7 +55,7 @@ static ctl_table ocfs2_nm_table[] = {
 
 static ctl_table ocfs2_mod_table[] = {
        {
-               .ctl_name       = KERN_OCFS2_NM,
+               .ctl_name       = FS_OCFS2_NM,
                .procname       = "nm",
                .data           = NULL,
                .maxlen         = 0,
@@ -67,7 +67,7 @@ static ctl_table ocfs2_mod_table[] = {
 
 static ctl_table ocfs2_kern_table[] = {
        {
-               .ctl_name       = KERN_OCFS2,
+               .ctl_name       = FS_OCFS2,
                .procname       = "ocfs2",
                .data           = NULL,
                .maxlen         = 0,
@@ -922,7 +922,7 @@ static int __init init_o2nm(void)
        o2hb_init();
        o2net_init();
 
-       ocfs2_table_header = register_sysctl_table(ocfs2_root_table, 0);
+       ocfs2_table_header = register_sysctl_table(ocfs2_root_table);
        if (!ocfs2_table_header) {
                printk(KERN_ERR "nodemanager: unable to register sysctl\n");
                ret = -ENOMEM; /* or something. */
index 8fb23cacc2f5f15308b7288321a503eb5322fa0d..070522138ae26c1b10f0f50683a48b5c53f5bf8e 100644 (file)
@@ -33,8 +33,7 @@
 #include <linux/configfs.h>
 #include <linux/rbtree.h>
 
-#define KERN_OCFS2             988
-#define KERN_OCFS2_NM          1
+#define FS_OCFS2_NM            1
 
 const char *o2nm_get_hb_ctl_path(void);
 
index b7f0ba97a1a2ff6acc8d7a76659704838073b0d6..de952eba29a92fd3aa35240f6ebcaca83feded43 100644 (file)
 #define MLOG_MASK_PREFIX ML_DLMFS
 #include "cluster/masklog.h"
 
-static struct super_operations dlmfs_ops;
-static struct file_operations dlmfs_file_operations;
-static struct inode_operations dlmfs_dir_inode_operations;
-static struct inode_operations dlmfs_root_inode_operations;
-static struct inode_operations dlmfs_file_inode_operations;
+static const struct super_operations dlmfs_ops;
+static const struct file_operations dlmfs_file_operations;
+static const struct inode_operations dlmfs_dir_inode_operations;
+static const struct inode_operations dlmfs_root_inode_operations;
+static const struct inode_operations dlmfs_file_inode_operations;
 static struct kmem_cache *dlmfs_inode_cache;
 
 struct workqueue_struct *user_dlm_worker;
@@ -540,27 +540,27 @@ static int dlmfs_fill_super(struct super_block * sb,
        return 0;
 }
 
-static struct file_operations dlmfs_file_operations = {
+static const struct file_operations dlmfs_file_operations = {
        .open           = dlmfs_file_open,
        .release        = dlmfs_file_release,
        .read           = dlmfs_file_read,
        .write          = dlmfs_file_write,
 };
 
-static struct inode_operations dlmfs_dir_inode_operations = {
+static const struct inode_operations dlmfs_dir_inode_operations = {
        .create         = dlmfs_create,
        .lookup         = simple_lookup,
        .unlink         = dlmfs_unlink,
 };
 
 /* this way we can restrict mkdir to only the toplevel of the fs. */
-static struct inode_operations dlmfs_root_inode_operations = {
+static const struct inode_operations dlmfs_root_inode_operations = {
        .lookup         = simple_lookup,
        .mkdir          = dlmfs_mkdir,
        .rmdir          = simple_rmdir,
 };
 
-static struct super_operations dlmfs_ops = {
+static const struct super_operations dlmfs_ops = {
        .statfs         = simple_statfs,
        .alloc_inode    = dlmfs_alloc_inode,
        .destroy_inode  = dlmfs_destroy_inode,
@@ -568,7 +568,7 @@ static struct super_operations dlmfs_ops = {
        .drop_inode     = generic_delete_inode,
 };
 
-static struct inode_operations dlmfs_file_inode_operations = {
+static const struct inode_operations dlmfs_file_inode_operations = {
        .getattr        = simple_getattr,
 };
 
index 10953a508f2f3dfdd158102b25d367250834d5ff..f2cd3bf9efb2f6b2dff8b44c44592355e2b44a6e 100644 (file)
@@ -1365,13 +1365,13 @@ bail:
        return ret;
 }
 
-struct inode_operations ocfs2_file_iops = {
+const struct inode_operations ocfs2_file_iops = {
        .setattr        = ocfs2_setattr,
        .getattr        = ocfs2_getattr,
        .permission     = ocfs2_permission,
 };
 
-struct inode_operations ocfs2_special_file_iops = {
+const struct inode_operations ocfs2_special_file_iops = {
        .setattr        = ocfs2_setattr,
        .getattr        = ocfs2_getattr,
        .permission     = ocfs2_permission,
index 601a453f18a85d3e4ba0bb7d1d9848c0f7f9f3fa..cc973f01f6cee2264ffc0b3cad78c7ce52bbd1be 100644 (file)
@@ -28,8 +28,8 @@
 
 extern const struct file_operations ocfs2_fops;
 extern const struct file_operations ocfs2_dops;
-extern struct inode_operations ocfs2_file_iops;
-extern struct inode_operations ocfs2_special_file_iops;
+extern const struct inode_operations ocfs2_file_iops;
+extern const struct inode_operations ocfs2_special_file_iops;
 struct ocfs2_alloc_context;
 
 enum ocfs2_alloc_restarted {
index f3d7803b4b46f18622cbb6156a25f80fa6b89a82..f7fa52bb3f6b66c2a94d5a1188946f028c1b8a97 100644 (file)
@@ -2306,7 +2306,7 @@ leave:
        return status;
 }
 
-struct inode_operations ocfs2_dir_iops = {
+const struct inode_operations ocfs2_dir_iops = {
        .create         = ocfs2_create,
        .lookup         = ocfs2_lookup,
        .link           = ocfs2_link,
index 8425944fcccdf360eeef212b7ca056686b62f564..0975c7b7212bfdecfc9570c66c8865d6ce34060d 100644 (file)
@@ -26,7 +26,7 @@
 #ifndef OCFS2_NAMEI_H
 #define OCFS2_NAMEI_H
 
-extern struct inode_operations ocfs2_dir_iops;
+extern const struct inode_operations ocfs2_dir_iops;
 
 struct dentry *ocfs2_get_parent(struct dentry *child);
 
index 6e300a88a47e8253a2d8dfc82d9d4c76112cb69b..6534f92424dd213a4471a8da553439f9843daa37 100644 (file)
@@ -116,7 +116,7 @@ static void ocfs2_destroy_inode(struct inode *inode);
 
 static unsigned long long ocfs2_max_file_offset(unsigned int blockshift);
 
-static struct super_operations ocfs2_sops = {
+static const struct super_operations ocfs2_sops = {
        .statfs         = ocfs2_statfs,
        .alloc_inode    = ocfs2_alloc_inode,
        .destroy_inode  = ocfs2_destroy_inode,
index 03b0191534d56b1a7ce4e51bb1c9a16c0d83042b..40dc1a51f4a97a5bfba7d3da17707956a8e95390 100644 (file)
@@ -170,12 +170,12 @@ bail:
        return ERR_PTR(status);
 }
 
-struct inode_operations ocfs2_symlink_inode_operations = {
+const struct inode_operations ocfs2_symlink_inode_operations = {
        .readlink       = page_readlink,
        .follow_link    = ocfs2_follow_link,
        .getattr        = ocfs2_getattr,
 };
-struct inode_operations ocfs2_fast_symlink_inode_operations = {
+const struct inode_operations ocfs2_fast_symlink_inode_operations = {
        .readlink       = ocfs2_readlink,
        .follow_link    = ocfs2_follow_link,
        .getattr        = ocfs2_getattr,
index 1ea9e4d9e9eb09b805331b4f00320983502a6fa3..65a6c9c6ad51d1018147cff4685743dd22bae935 100644 (file)
@@ -26,8 +26,8 @@
 #ifndef OCFS2_SYMLINK_H
 #define OCFS2_SYMLINK_H
 
-extern struct inode_operations ocfs2_symlink_inode_operations;
-extern struct inode_operations ocfs2_fast_symlink_inode_operations;
+extern const struct inode_operations ocfs2_symlink_inode_operations;
+extern const struct inode_operations ocfs2_fast_symlink_inode_operations;
 
 /*
  * Test whether an inode is a fast symlink.
index 99c0bc37ba09b91dd2cf99e819261e621634342f..bde1c164417d8f3bdf66f63241358ad90bd47f6d 100644 (file)
@@ -169,7 +169,7 @@ static const struct file_operations openprom_operations = {
 
 static struct dentry *openpromfs_lookup(struct inode *, struct dentry *, struct nameidata *);
 
-static struct inode_operations openprom_inode_operations = {
+static const struct inode_operations openprom_inode_operations = {
        .lookup         = openpromfs_lookup,
 };
 
@@ -364,7 +364,7 @@ static int openprom_remount(struct super_block *sb, int *flags, char *data)
        return 0;
 }
 
-static struct super_operations openprom_sops = { 
+static const struct super_operations openprom_sops = {
        .alloc_inode    = openprom_alloc_inode,
        .destroy_inode  = openprom_destroy_inode,
        .read_inode     = openprom_read_inode,
index 3d73d94d93a7dd9321cdfe5d9750fcf25a836df5..ac32a2e8540c4fb2ac34c1c27286f1a0d624fbd1 100644 (file)
@@ -365,7 +365,7 @@ void delete_partition(struct gendisk *disk, int part)
        kobject_put(&p->kobj);
 }
 
-void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len)
+void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len, int flags)
 {
        struct hd_struct *p;
 
@@ -390,6 +390,15 @@ void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len)
        if (!disk->part_uevent_suppress)
                kobject_uevent(&p->kobj, KOBJ_ADD);
        sysfs_create_link(&p->kobj, &block_subsys.kset.kobj, "subsystem");
+       if (flags & ADDPART_FLAG_WHOLEDISK) {
+               static struct attribute addpartattr = {
+                       .name = "whole_disk",
+                       .mode = S_IRUSR | S_IRGRP | S_IROTH,
+                       .owner = THIS_MODULE,
+               };
+
+               sysfs_create_file(&p->kobj, &addpartattr);
+       }
        partition_sysfs_add_subdir(p);
        disk->part[part-1] = p;
 }
@@ -543,9 +552,9 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
                        printk(" %s: p%d exceeds device capacity\n",
                                disk->disk_name, p);
                }
-               add_partition(disk, p, from, size);
+               add_partition(disk, p, from, size, state->parts[p].flags);
 #ifdef CONFIG_BLK_DEV_MD
-               if (state->parts[p].flags)
+               if (state->parts[p].flags & ADDPART_FLAG_RAID)
                        md_autodetect_dev(bdev->bd_dev+p);
 #endif
        }
index 8c7af1777819e2b2d5cdeabc49ef87298ca89c19..4ccec4cd1367a304bac2c784d0ba7e794b3e98cc 100644 (file)
@@ -63,15 +63,25 @@ msdos_magic_present(unsigned char *p)
 #define AIX_LABEL_MAGIC4       0xC1
 static int aix_magic_present(unsigned char *p, struct block_device *bdev)
 {
+       struct partition *pt = (struct partition *) (p + 0x1be);
        Sector sect;
        unsigned char *d;
-       int ret = 0;
+       int slot, ret = 0;
 
-       if (p[0] != AIX_LABEL_MAGIC1 &&
-               p[1] != AIX_LABEL_MAGIC2 &&
-               p[2] != AIX_LABEL_MAGIC3 &&
-               p[3] != AIX_LABEL_MAGIC4)
+       if (!(p[0] == AIX_LABEL_MAGIC1 &&
+               p[1] == AIX_LABEL_MAGIC2 &&
+               p[2] == AIX_LABEL_MAGIC3 &&
+               p[3] == AIX_LABEL_MAGIC4))
                return 0;
+       /* Assume the partition table is valid if Linux partitions exists */
+       for (slot = 1; slot <= 4; slot++, pt++) {
+               if (pt->sys_ind == LINUX_SWAP_PARTITION ||
+                       pt->sys_ind == LINUX_RAID_PARTITION ||
+                       pt->sys_ind == LINUX_DATA_PARTITION ||
+                       pt->sys_ind == LINUX_LVM_PARTITION ||
+                       is_extended_partition(pt))
+                       return 0;
+       }
        d = read_dev_sector(bdev, 7, &sect);
        if (d) {
                if (d[0] == '_' && d[1] == 'L' && d[2] == 'V' && d[3] == 'M')
@@ -155,7 +165,7 @@ parse_extended(struct parsed_partitions *state, struct block_device *bdev,
 
                        put_partition(state, state->next, next, size);
                        if (SYS_IND(p) == LINUX_RAID_PARTITION)
-                               state->parts[state->next].flags = 1;
+                               state->parts[state->next].flags = ADDPART_FLAG_RAID;
                        loopct = 0;
                        if (++state->next == state->limit)
                                goto done;
index 6fa4ff8951042f8f0becd6318b5991668933de5b..ed5ac83fe83ab0f5ec0333b986b693e2ce70743f 100644 (file)
@@ -72,7 +72,7 @@ int sgi_partition(struct parsed_partitions *state, struct block_device *bdev)
                if (blocks) {
                        put_partition(state, slot, start, blocks);
                        if (be32_to_cpu(p->type) == LINUX_RAID_PARTITION)
-                               state->parts[slot].flags = 1;
+                               state->parts[slot].flags = ADDPART_FLAG_RAID;
                }
                slot++;
        }
index 0a5927c806ca7dbf2aaa244b577159b779a602d6..123f8b46c8ba7cfbfd3676b37b00a8fa07070e38 100644 (file)
@@ -80,8 +80,11 @@ int sun_partition(struct parsed_partitions *state, struct block_device *bdev)
                num_sectors = be32_to_cpu(p->num_sectors);
                if (num_sectors) {
                        put_partition(state, slot, st_sector, num_sectors);
+                       state->parts[slot].flags = 0;
                        if (label->infos[i].id == LINUX_RAID_PARTITION)
-                               state->parts[slot].flags = 1;
+                               state->parts[slot].flags |= ADDPART_FLAG_RAID;
+                       if (label->infos[i].id == SUN_WHOLE_DISK)
+                               state->parts[slot].flags |= ADDPART_FLAG_WHOLEDISK;
                }
                slot++;
        }
index f6c7762725727b49af2e7b4afbdff56a2440f822..a6b3a8f878f0e2eb2aef668b7a3cec03c4402f5a 100644 (file)
@@ -8,7 +8,7 @@ proc-y                  := nommu.o task_nommu.o
 proc-$(CONFIG_MMU)     := mmu.o task_mmu.o
 
 proc-y       += inode.o root.o base.o generic.o array.o \
-               proc_tty.o proc_misc.o
+               proc_tty.o proc_misc.o proc_sysctl.o
 
 proc-$(CONFIG_PROC_KCORE)      += kcore.o
 proc-$(CONFIG_PROC_VMCORE)     += vmcore.o
index 70e4fab117b154ec0379aea1f924e5f021195e7e..07c9cdbcdcac6f6a2be5fa40f97a340b2f5980a4 100644 (file)
@@ -351,7 +351,7 @@ static int do_task_stat(struct task_struct *task, char * buffer, int whole)
                struct signal_struct *sig = task->signal;
 
                if (sig->tty) {
-                       tty_pgrp = sig->tty->pgrp;
+                       tty_pgrp = pid_nr(sig->tty->pgrp);
                        tty_nr = new_encode_dev(tty_devnum(sig->tty));
                }
 
index 1a979ea3b379931973f79c4b70703df3f237c714..4f5745af8c193809f37d9f2cfa78be383d42ef9c 100644 (file)
@@ -93,8 +93,8 @@ struct pid_entry {
        int len;
        char *name;
        mode_t mode;
-       struct inode_operations *iop;
-       struct file_operations *fop;
+       const struct inode_operations *iop;
+       const struct file_operations *fop;
        union proc_op op;
 };
 
@@ -352,7 +352,7 @@ static int proc_setattr(struct dentry *dentry, struct iattr *attr)
        return error;
 }
 
-static struct inode_operations proc_def_inode_operations = {
+static const struct inode_operations proc_def_inode_operations = {
        .setattr        = proc_setattr,
 };
 
@@ -424,7 +424,7 @@ static unsigned mounts_poll(struct file *file, poll_table *wait)
        return res;
 }
 
-static struct file_operations proc_mounts_operations = {
+static const struct file_operations proc_mounts_operations = {
        .open           = mounts_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -462,7 +462,7 @@ static int mountstats_open(struct inode *inode, struct file *file)
        return ret;
 }
 
-static struct file_operations proc_mountstats_operations = {
+static const struct file_operations proc_mountstats_operations = {
        .open           = mountstats_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -501,7 +501,7 @@ out_no_task:
        return length;
 }
 
-static struct file_operations proc_info_file_operations = {
+static const struct file_operations proc_info_file_operations = {
        .read           = proc_info_read,
 };
 
@@ -646,7 +646,7 @@ static loff_t mem_lseek(struct file * file, loff_t offset, int orig)
        return file->f_pos;
 }
 
-static struct file_operations proc_mem_operations = {
+static const struct file_operations proc_mem_operations = {
        .llseek         = mem_lseek,
        .read           = mem_read,
        .write          = mem_write,
@@ -710,7 +710,7 @@ static ssize_t oom_adjust_write(struct file *file, const char __user *buf,
        return end - buffer;
 }
 
-static struct file_operations proc_oom_adjust_operations = {
+static const struct file_operations proc_oom_adjust_operations = {
        .read           = oom_adjust_read,
        .write          = oom_adjust_write,
 };
@@ -777,7 +777,7 @@ out_free_page:
        return length;
 }
 
-static struct file_operations proc_loginuid_operations = {
+static const struct file_operations proc_loginuid_operations = {
        .read           = proc_loginuid_read,
        .write          = proc_loginuid_write,
 };
@@ -849,7 +849,7 @@ out_no_task:
        return result;
 }
 
-static struct file_operations proc_seccomp_operations = {
+static const struct file_operations proc_seccomp_operations = {
        .read           = seccomp_read,
        .write          = seccomp_write,
 };
@@ -908,7 +908,7 @@ static ssize_t proc_fault_inject_write(struct file * file,
        return end - buffer;
 }
 
-static struct file_operations proc_fault_inject_operations = {
+static const struct file_operations proc_fault_inject_operations = {
        .read           = proc_fault_inject_read,
        .write          = proc_fault_inject_write,
 };
@@ -980,7 +980,7 @@ out:
        return error;
 }
 
-static struct inode_operations proc_pid_link_inode_operations = {
+static const struct inode_operations proc_pid_link_inode_operations = {
        .readlink       = proc_pid_readlink,
        .follow_link    = proc_pid_follow_link,
        .setattr        = proc_setattr,
@@ -1408,7 +1408,7 @@ out_no_task:
        return retval;
 }
 
-static struct file_operations proc_fd_operations = {
+static const struct file_operations proc_fd_operations = {
        .read           = generic_read_dir,
        .readdir        = proc_readfd,
 };
@@ -1416,7 +1416,7 @@ static struct file_operations proc_fd_operations = {
 /*
  * proc directories can do almost nothing..
  */
-static struct inode_operations proc_fd_inode_operations = {
+static const struct inode_operations proc_fd_inode_operations = {
        .lookup         = proc_lookupfd,
        .setattr        = proc_setattr,
 };
@@ -1623,7 +1623,7 @@ out_no_task:
        return length;
 }
 
-static struct file_operations proc_pid_attr_operations = {
+static const struct file_operations proc_pid_attr_operations = {
        .read           = proc_pid_attr_read,
        .write          = proc_pid_attr_write,
 };
@@ -1644,7 +1644,7 @@ static int proc_attr_dir_readdir(struct file * filp,
                                   attr_dir_stuff,ARRAY_SIZE(attr_dir_stuff));
 }
 
-static struct file_operations proc_attr_dir_operations = {
+static const struct file_operations proc_attr_dir_operations = {
        .read           = generic_read_dir,
        .readdir        = proc_attr_dir_readdir,
 };
@@ -1656,7 +1656,7 @@ static struct dentry *proc_attr_dir_lookup(struct inode *dir,
                                  attr_dir_stuff, ARRAY_SIZE(attr_dir_stuff));
 }
 
-static struct inode_operations proc_attr_dir_inode_operations = {
+static const struct inode_operations proc_attr_dir_inode_operations = {
        .lookup         = proc_attr_dir_lookup,
        .getattr        = pid_getattr,
        .setattr        = proc_setattr,
@@ -1682,7 +1682,7 @@ static void *proc_self_follow_link(struct dentry *dentry, struct nameidata *nd)
        return ERR_PTR(vfs_follow_link(nd,tmp));
 }
 
-static struct inode_operations proc_self_inode_operations = {
+static const struct inode_operations proc_self_inode_operations = {
        .readlink       = proc_self_readlink,
        .follow_link    = proc_self_follow_link,
 };
@@ -1810,17 +1810,21 @@ static int proc_base_fill_cache(struct file *filp, void *dirent, filldir_t filld
 static int proc_pid_io_accounting(struct task_struct *task, char *buffer)
 {
        return sprintf(buffer,
+#ifdef CONFIG_TASK_XACCT
                        "rchar: %llu\n"
                        "wchar: %llu\n"
                        "syscr: %llu\n"
                        "syscw: %llu\n"
+#endif
                        "read_bytes: %llu\n"
                        "write_bytes: %llu\n"
                        "cancelled_write_bytes: %llu\n",
+#ifdef CONFIG_TASK_XACCT
                        (unsigned long long)task->rchar,
                        (unsigned long long)task->wchar,
                        (unsigned long long)task->syscr,
                        (unsigned long long)task->syscw,
+#endif
                        (unsigned long long)task->ioac.read_bytes,
                        (unsigned long long)task->ioac.write_bytes,
                        (unsigned long long)task->ioac.cancelled_write_bytes);
@@ -1830,8 +1834,8 @@ static int proc_pid_io_accounting(struct task_struct *task, char *buffer)
 /*
  * Thread groups
  */
-static struct file_operations proc_task_operations;
-static struct inode_operations proc_task_inode_operations;
+static const struct file_operations proc_task_operations;
+static const struct inode_operations proc_task_inode_operations;
 
 static struct pid_entry tgid_base_stuff[] = {
        DIR("task",       S_IRUGO|S_IXUGO, task),
@@ -1890,7 +1894,7 @@ static int proc_tgid_base_readdir(struct file * filp,
                                   tgid_base_stuff,ARRAY_SIZE(tgid_base_stuff));
 }
 
-static struct file_operations proc_tgid_base_operations = {
+static const struct file_operations proc_tgid_base_operations = {
        .read           = generic_read_dir,
        .readdir        = proc_tgid_base_readdir,
 };
@@ -1900,7 +1904,7 @@ static struct dentry *proc_tgid_base_lookup(struct inode *dir, struct dentry *de
                                  tgid_base_stuff, ARRAY_SIZE(tgid_base_stuff));
 }
 
-static struct inode_operations proc_tgid_base_inode_operations = {
+static const struct inode_operations proc_tgid_base_inode_operations = {
        .lookup         = proc_tgid_base_lookup,
        .getattr        = pid_getattr,
        .setattr        = proc_setattr,
@@ -2173,12 +2177,12 @@ static struct dentry *proc_tid_base_lookup(struct inode *dir, struct dentry *den
                                  tid_base_stuff, ARRAY_SIZE(tid_base_stuff));
 }
 
-static struct file_operations proc_tid_base_operations = {
+static const struct file_operations proc_tid_base_operations = {
        .read           = generic_read_dir,
        .readdir        = proc_tid_base_readdir,
 };
 
-static struct inode_operations proc_tid_base_inode_operations = {
+static const struct inode_operations proc_tid_base_inode_operations = {
        .lookup         = proc_tid_base_lookup,
        .getattr        = pid_getattr,
        .setattr        = proc_setattr,
@@ -2404,13 +2408,13 @@ static int proc_task_getattr(struct vfsmount *mnt, struct dentry *dentry, struct
        return 0;
 }
 
-static struct inode_operations proc_task_inode_operations = {
+static const struct inode_operations proc_task_inode_operations = {
        .lookup         = proc_task_lookup,
        .getattr        = proc_task_getattr,
        .setattr        = proc_setattr,
 };
 
-static struct file_operations proc_task_operations = {
+static const struct file_operations proc_task_operations = {
        .read           = generic_read_dir,
        .readdir        = proc_task_readdir,
 };
index 853cb877d5f3e42b2c617f972a6292bc03912ee8..775fb21294d821419ed6b7e0939d963dd6d00e87 100644 (file)
@@ -32,14 +32,14 @@ static loff_t proc_file_lseek(struct file *, loff_t, int);
 
 DEFINE_SPINLOCK(proc_subdir_lock);
 
-int proc_match(int len, const char *name, struct proc_dir_entry *de)
+static int proc_match(int len, const char *name, struct proc_dir_entry *de)
 {
        if (de->namelen != len)
                return 0;
        return !memcmp(name, de->name, len);
 }
 
-static struct file_operations proc_file_operations = {
+static const struct file_operations proc_file_operations = {
        .llseek         = proc_file_lseek,
        .read           = proc_file_read,
        .write          = proc_file_write,
@@ -265,7 +265,7 @@ static int proc_getattr(struct vfsmount *mnt, struct dentry *dentry,
        return 0;
 }
 
-static struct inode_operations proc_file_inode_operations = {
+static const struct inode_operations proc_file_inode_operations = {
        .setattr        = proc_notify_change,
 };
 
@@ -357,7 +357,7 @@ static void *proc_follow_link(struct dentry *dentry, struct nameidata *nd)
        return NULL;
 }
 
-static struct inode_operations proc_link_inode_operations = {
+static const struct inode_operations proc_link_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = proc_follow_link,
 };
@@ -497,7 +497,7 @@ out:        unlock_kernel();
  * use the in-memory "struct proc_dir_entry" tree to parse
  * the /proc directory.
  */
-static struct file_operations proc_dir_operations = {
+static const struct file_operations proc_dir_operations = {
        .read                   = generic_read_dir,
        .readdir                = proc_readdir,
 };
@@ -505,7 +505,7 @@ static struct file_operations proc_dir_operations = {
 /*
  * proc directories can do almost nothing..
  */
-static struct inode_operations proc_dir_inode_operations = {
+static const struct inode_operations proc_dir_inode_operations = {
        .lookup         = proc_lookup,
        .getattr        = proc_getattr,
        .setattr        = proc_notify_change,
index e26945ba685b5c80f0abdca78f4631db7d64f992..c372eb151a3aa7a0198f6705159bb18b4471617f 100644 (file)
@@ -132,7 +132,7 @@ static int proc_remount(struct super_block *sb, int *flags, char *data)
        return 0;
 }
 
-static struct super_operations proc_sops = { 
+static const struct super_operations proc_sops = {
        .alloc_inode    = proc_alloc_inode,
        .destroy_inode  = proc_destroy_inode,
        .read_inode     = proc_read_inode,
@@ -161,6 +161,7 @@ struct inode *proc_get_inode(struct super_block *sb, unsigned int ino,
        if (!inode)
                goto out_ino;
 
+       PROC_I(inode)->fd = 0;
        PROC_I(inode)->pde = de;
        if (de) {
                if (de->mode) {
index 987c773dbb20a04f002ac03ae5f8ee522ba57cce..c932aa65e19816e85ca78d95b2795e80513e0409 100644 (file)
@@ -11,6 +11,8 @@
 
 #include <linux/proc_fs.h>
 
+extern int proc_sys_init(void);
+
 struct vmalloc_info {
        unsigned long   used;
        unsigned long   largest_chunk;
@@ -38,13 +40,13 @@ extern int proc_tgid_stat(struct task_struct *, char *);
 extern int proc_pid_status(struct task_struct *, char *);
 extern int proc_pid_statm(struct task_struct *, char *);
 
-extern struct file_operations proc_maps_operations;
-extern struct file_operations proc_numa_maps_operations;
-extern struct file_operations proc_smaps_operations;
+extern const struct file_operations proc_maps_operations;
+extern const struct file_operations proc_numa_maps_operations;
+extern const struct file_operations proc_smaps_operations;
 
-extern struct file_operations proc_maps_operations;
-extern struct file_operations proc_numa_maps_operations;
-extern struct file_operations proc_smaps_operations;
+extern const struct file_operations proc_maps_operations;
+extern const struct file_operations proc_numa_maps_operations;
+extern const struct file_operations proc_smaps_operations;
 
 
 void free_proc_entry(struct proc_dir_entry *de);
index 5ec67257e5f92426e94f41c40f1d42a36692583a..22f789de390941797102693a7a80c635a7f381ce 100644 (file)
@@ -128,7 +128,7 @@ static int proc_nommu_vma_list_open(struct inode *inode, struct file *file)
        return seq_open(file, &proc_nommu_vma_list_seqop);
 }
 
-static struct file_operations proc_nommu_vma_list_operations = {
+static const struct file_operations proc_nommu_vma_list_operations = {
        .open    = proc_nommu_vma_list_open,
        .read    = seq_read,
        .llseek  = seq_lseek,
index b37ce33f67eaf1c24b96bac8a2147e4ac94c2a08..e2c4c0a5c90d40ff8ac2d28715956a8cbf65dd6c 100644 (file)
@@ -121,16 +121,11 @@ static int meminfo_read_proc(char *page, char **start, off_t off,
 {
        struct sysinfo i;
        int len;
-       unsigned long inactive;
-       unsigned long active;
-       unsigned long free;
        unsigned long committed;
        unsigned long allowed;
        struct vmalloc_info vmi;
        long cached;
 
-       get_zone_counts(&active, &inactive, &free);
-
 /*
  * display in kilobytes.
  */
@@ -187,8 +182,8 @@ static int meminfo_read_proc(char *page, char **start, off_t off,
                K(i.bufferram),
                K(cached),
                K(total_swapcache_pages),
-               K(active),
-               K(inactive),
+               K(global_page_state(NR_ACTIVE)),
+               K(global_page_state(NR_INACTIVE)),
 #ifdef CONFIG_HIGHMEM
                K(i.totalhigh),
                K(i.freehigh),
@@ -228,7 +223,7 @@ static int fragmentation_open(struct inode *inode, struct file *file)
        return seq_open(file, &fragmentation_op);
 }
 
-static struct file_operations fragmentation_file_operations = {
+static const struct file_operations fragmentation_file_operations = {
        .open           = fragmentation_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -241,7 +236,7 @@ static int zoneinfo_open(struct inode *inode, struct file *file)
        return seq_open(file, &zoneinfo_op);
 }
 
-static struct file_operations proc_zoneinfo_file_operations = {
+static const struct file_operations proc_zoneinfo_file_operations = {
        .open           = zoneinfo_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -266,7 +261,7 @@ static int cpuinfo_open(struct inode *inode, struct file *file)
        return seq_open(file, &cpuinfo_op);
 }
 
-static struct file_operations proc_cpuinfo_operations = {
+static const struct file_operations proc_cpuinfo_operations = {
        .open           = cpuinfo_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -325,7 +320,7 @@ static int devinfo_open(struct inode *inode, struct file *filp)
        return seq_open(filp, &devinfo_ops);
 }
 
-static struct file_operations proc_devinfo_operations = {
+static const struct file_operations proc_devinfo_operations = {
        .open           = devinfo_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -337,7 +332,7 @@ static int vmstat_open(struct inode *inode, struct file *file)
 {
        return seq_open(file, &vmstat_op);
 }
-static struct file_operations proc_vmstat_file_operations = {
+static const struct file_operations proc_vmstat_file_operations = {
        .open           = vmstat_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -368,7 +363,7 @@ static int partitions_open(struct inode *inode, struct file *file)
 {
        return seq_open(file, &partitions_op);
 }
-static struct file_operations proc_partitions_operations = {
+static const struct file_operations proc_partitions_operations = {
        .open           = partitions_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -380,7 +375,7 @@ static int diskstats_open(struct inode *inode, struct file *file)
 {
        return seq_open(file, &diskstats_op);
 }
-static struct file_operations proc_diskstats_operations = {
+static const struct file_operations proc_diskstats_operations = {
        .open           = diskstats_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -394,7 +389,7 @@ static int modules_open(struct inode *inode, struct file *file)
 {
        return seq_open(file, &modules_op);
 }
-static struct file_operations proc_modules_operations = {
+static const struct file_operations proc_modules_operations = {
        .open           = modules_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -409,7 +404,7 @@ static int slabinfo_open(struct inode *inode, struct file *file)
 {
        return seq_open(file, &slabinfo_op);
 }
-static struct file_operations proc_slabinfo_operations = {
+static const struct file_operations proc_slabinfo_operations = {
        .open           = slabinfo_open,
        .read           = seq_read,
        .write          = slabinfo_write,
@@ -443,7 +438,7 @@ static int slabstats_release(struct inode *inode, struct file *file)
        return seq_release(inode, file);
 }
 
-static struct file_operations proc_slabstats_operations = {
+static const struct file_operations proc_slabstats_operations = {
        .open           = slabstats_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -556,7 +551,7 @@ static int stat_open(struct inode *inode, struct file *file)
                kfree(buf);
        return res;
 }
-static struct file_operations proc_stat_operations = {
+static const struct file_operations proc_stat_operations = {
        .open           = stat_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -598,7 +593,7 @@ static int interrupts_open(struct inode *inode, struct file *filp)
        return seq_open(filp, &int_seq_ops);
 }
 
-static struct file_operations proc_interrupts_operations = {
+static const struct file_operations proc_interrupts_operations = {
        .open           = interrupts_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -655,7 +650,7 @@ static ssize_t write_sysrq_trigger(struct file *file, const char __user *buf,
        return count;
 }
 
-static struct file_operations proc_sysrq_trigger_operations = {
+static const struct file_operations proc_sysrq_trigger_operations = {
        .write          = write_sysrq_trigger,
 };
 #endif
@@ -672,7 +667,6 @@ void create_seq_entry(char *name, mode_t mode, const struct file_operations *f)
 
 void __init proc_misc_init(void)
 {
-       struct proc_dir_entry *entry;
        static struct {
                char *name;
                int (*read_proc)(char*,char**,off_t,int,int*,void*);
@@ -700,9 +694,12 @@ void __init proc_misc_init(void)
 
        /* And now for trickier ones */
 #ifdef CONFIG_PRINTK
-       entry = create_proc_entry("kmsg", S_IRUSR, &proc_root);
-       if (entry)
-               entry->proc_fops = &proc_kmsg_operations;
+       {
+               struct proc_dir_entry *entry;
+               entry = create_proc_entry("kmsg", S_IRUSR, &proc_root);
+               if (entry)
+                       entry->proc_fops = &proc_kmsg_operations;
+       }
 #endif
        create_seq_entry("devices", 0, &proc_devinfo_operations);
        create_seq_entry("cpuinfo", 0, &proc_cpuinfo_operations);
@@ -743,8 +740,11 @@ void __init proc_misc_init(void)
                proc_vmcore->proc_fops = &proc_vmcore_operations;
 #endif
 #ifdef CONFIG_MAGIC_SYSRQ
-       entry = create_proc_entry("sysrq-trigger", S_IWUSR, NULL);
-       if (entry)
-               entry->proc_fops = &proc_sysrq_trigger_operations;
+       {
+               struct proc_dir_entry *entry;
+               entry = create_proc_entry("sysrq-trigger", S_IWUSR, NULL);
+               if (entry)
+                       entry->proc_fops = &proc_sysrq_trigger_operations;
+       }
 #endif
 }
diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c
new file mode 100644 (file)
index 0000000..20e8cbb
--- /dev/null
@@ -0,0 +1,479 @@
+/*
+ * /proc/sys support
+ */
+
+#include <linux/sysctl.h>
+#include <linux/proc_fs.h>
+#include <linux/security.h>
+#include "internal.h"
+
+static struct dentry_operations proc_sys_dentry_operations;
+static const struct file_operations proc_sys_file_operations;
+static struct inode_operations proc_sys_inode_operations;
+
+static void proc_sys_refresh_inode(struct inode *inode, struct ctl_table *table)
+{
+       /* Refresh the cached information bits in the inode */
+       if (table) {
+               inode->i_uid = 0;
+               inode->i_gid = 0;
+               inode->i_mode = table->mode;
+               if (table->proc_handler) {
+                       inode->i_mode |= S_IFREG;
+                       inode->i_nlink = 1;
+               } else {
+                       inode->i_mode |= S_IFDIR;
+                       inode->i_nlink = 0;     /* It is too hard to figure out */
+               }
+       }
+}
+
+static struct inode *proc_sys_make_inode(struct inode *dir, struct ctl_table *table)
+{
+       struct inode *inode;
+       struct proc_inode *dir_ei, *ei;
+       int depth;
+
+       inode = new_inode(dir->i_sb);
+       if (!inode)
+               goto out;
+
+       /* A directory is always one deeper than it's parent */
+       dir_ei = PROC_I(dir);
+       depth = dir_ei->fd + 1;
+
+       ei = PROC_I(inode);
+       ei->fd = depth;
+       inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
+       inode->i_op = &proc_sys_inode_operations;
+       inode->i_fop = &proc_sys_file_operations;
+       inode->i_flags |= S_PRIVATE; /* tell selinux to ignore this inode */
+       proc_sys_refresh_inode(inode, table);
+out:
+       return inode;
+}
+
+static struct dentry *proc_sys_ancestor(struct dentry *dentry, int depth)
+{
+       for (;;) {
+               struct proc_inode *ei;
+
+               ei = PROC_I(dentry->d_inode);
+               if (ei->fd == depth)
+                       break; /* found */
+
+               dentry = dentry->d_parent;
+       }
+       return dentry;
+}
+
+static struct ctl_table *proc_sys_lookup_table_one(struct ctl_table *table,
+                                                       struct qstr *name)
+{
+       int len;
+       for ( ; table->ctl_name || table->procname; table++) {
+
+               if (!table->procname)
+                       continue;
+
+               len = strlen(table->procname);
+               if (len != name->len)
+                       continue;
+
+               if (memcmp(table->procname, name->name, len) != 0)
+                       continue;
+
+               /* I have a match */
+               return table;
+       }
+       return NULL;
+}
+
+static struct ctl_table *proc_sys_lookup_table(struct dentry *dentry,
+                                               struct ctl_table *table)
+{
+       struct dentry *ancestor;
+       struct proc_inode *ei;
+       int depth, i;
+
+       ei = PROC_I(dentry->d_inode);
+       depth = ei->fd;
+
+       if (depth == 0)
+               return table;
+
+       for (i = 1; table && (i <= depth); i++) {
+               ancestor = proc_sys_ancestor(dentry, i);
+               table = proc_sys_lookup_table_one(table, &ancestor->d_name);
+               if (table)
+                       table = table->child;
+       }
+       return table;
+
+}
+static struct ctl_table *proc_sys_lookup_entry(struct dentry *dparent,
+                                               struct qstr *name,
+                                               struct ctl_table *table)
+{
+       table = proc_sys_lookup_table(dparent, table);
+       if (table)
+               table = proc_sys_lookup_table_one(table, name);
+       return table;
+}
+
+static struct ctl_table *do_proc_sys_lookup(struct dentry *parent,
+                                               struct qstr *name,
+                                               struct ctl_table_header **ptr)
+{
+       struct ctl_table_header *head;
+       struct ctl_table *table = NULL;
+
+       for (head = sysctl_head_next(NULL); head;
+                       head = sysctl_head_next(head)) {
+               table = proc_sys_lookup_entry(parent, name, head->ctl_table);
+               if (table)
+                       break;
+       }
+       *ptr = head;
+       return table;
+}
+
+static struct dentry *proc_sys_lookup(struct inode *dir, struct dentry *dentry,
+                                       struct nameidata *nd)
+{
+       struct ctl_table_header *head;
+       struct inode *inode;
+       struct dentry *err;
+       struct ctl_table *table;
+
+       err = ERR_PTR(-ENOENT);
+       table = do_proc_sys_lookup(dentry->d_parent, &dentry->d_name, &head);
+       if (!table)
+               goto out;
+
+       err = ERR_PTR(-ENOMEM);
+       inode = proc_sys_make_inode(dir, table);
+       if (!inode)
+               goto out;
+
+       err = NULL;
+       dentry->d_op = &proc_sys_dentry_operations;
+       d_add(dentry, inode);
+
+out:
+       sysctl_head_finish(head);
+       return err;
+}
+
+static ssize_t proc_sys_read(struct file *filp, char __user *buf,
+                               size_t count, loff_t *ppos)
+{
+       struct dentry *dentry = filp->f_dentry;
+       struct ctl_table_header *head;
+       struct ctl_table *table;
+       ssize_t error, res;
+
+       table = do_proc_sys_lookup(dentry->d_parent, &dentry->d_name, &head);
+       /* Has the sysctl entry disappeared on us? */
+       error = -ENOENT;
+       if (!table)
+               goto out;
+
+       /* Has the sysctl entry been replaced by a directory? */
+       error = -EISDIR;
+       if (!table->proc_handler)
+               goto out;
+
+       /*
+        * At this point we know that the sysctl was not unregistered
+        * and won't be until we finish.
+        */
+       error = -EPERM;
+       if (sysctl_perm(table, MAY_READ))
+               goto out;
+
+       /* careful: calling conventions are nasty here */
+       res = count;
+       error = table->proc_handler(table, 0, filp, buf, &res, ppos);
+       if (!error)
+               error = res;
+out:
+       sysctl_head_finish(head);
+
+       return error;
+}
+
+static ssize_t proc_sys_write(struct file *filp, const char __user *buf,
+                               size_t count, loff_t *ppos)
+{
+       struct dentry *dentry = filp->f_dentry;
+       struct ctl_table_header *head;
+       struct ctl_table *table;
+       ssize_t error, res;
+
+       table = do_proc_sys_lookup(dentry->d_parent, &dentry->d_name, &head);
+       /* Has the sysctl entry disappeared on us? */
+       error = -ENOENT;
+       if (!table)
+               goto out;
+
+       /* Has the sysctl entry been replaced by a directory? */
+       error = -EISDIR;
+       if (!table->proc_handler)
+               goto out;
+
+       /*
+        * At this point we know that the sysctl was not unregistered
+        * and won't be until we finish.
+        */
+       error = -EPERM;
+       if (sysctl_perm(table, MAY_WRITE))
+               goto out;
+
+       /* careful: calling conventions are nasty here */
+       res = count;
+       error = table->proc_handler(table, 1, filp, (char __user *)buf,
+                                   &res, ppos);
+       if (!error)
+               error = res;
+out:
+       sysctl_head_finish(head);
+
+       return error;
+}
+
+
+static int proc_sys_fill_cache(struct file *filp, void *dirent,
+                               filldir_t filldir, struct ctl_table *table)
+{
+       struct ctl_table_header *head;
+       struct ctl_table *child_table = NULL;
+       struct dentry *child, *dir = filp->f_path.dentry;
+       struct inode *inode;
+       struct qstr qname;
+       ino_t ino = 0;
+       unsigned type = DT_UNKNOWN;
+       int ret;
+
+       qname.name = table->procname;
+       qname.len  = strlen(table->procname);
+       qname.hash = full_name_hash(qname.name, qname.len);
+
+       /* Suppress duplicates.
+        * Only fill a directory entry if it is the value that
+        * an ordinary lookup of that name returns.  Hide all
+        * others.
+        *
+        * If we ever cache this translation in the dcache
+        * I should do a dcache lookup first.  But for now
+        * it is just simpler not to.
+        */
+       ret = 0;
+       child_table = do_proc_sys_lookup(dir, &qname, &head);
+       sysctl_head_finish(head);
+       if (child_table != table)
+               return 0;
+
+       child = d_lookup(dir, &qname);
+       if (!child) {
+               struct dentry *new;
+               new = d_alloc(dir, &qname);
+               if (new) {
+                       inode = proc_sys_make_inode(dir->d_inode, table);
+                       if (!inode)
+                               child = ERR_PTR(-ENOMEM);
+                       else {
+                               new->d_op = &proc_sys_dentry_operations;
+                               d_add(new, inode);
+                       }
+                       if (child)
+                               dput(new);
+                       else
+                               child = new;
+               }
+       }
+       if (!child || IS_ERR(child) || !child->d_inode)
+               goto end_instantiate;
+       inode = child->d_inode;
+       if (inode) {
+               ino  = inode->i_ino;
+               type = inode->i_mode >> 12;
+       }
+       dput(child);
+end_instantiate:
+       if (!ino)
+               ino= find_inode_number(dir, &qname);
+       if (!ino)
+               ino = 1;
+       return filldir(dirent, qname.name, qname.len, filp->f_pos, ino, type);
+}
+
+static int proc_sys_readdir(struct file *filp, void *dirent, filldir_t filldir)
+{
+       struct dentry *dentry = filp->f_dentry;
+       struct inode *inode = dentry->d_inode;
+       struct ctl_table_header *head = NULL;
+       struct ctl_table *table;
+       unsigned long pos;
+       int ret;
+
+       ret = -ENOTDIR;
+       if (!S_ISDIR(inode->i_mode))
+               goto out;
+
+       ret = 0;
+       /* Avoid a switch here: arm builds fail with missing __cmpdi2 */
+       if (filp->f_pos == 0) {
+               if (filldir(dirent, ".", 1, filp->f_pos,
+                               inode->i_ino, DT_DIR) < 0)
+                       goto out;
+               filp->f_pos++;
+       }
+       if (filp->f_pos == 1) {
+               if (filldir(dirent, "..", 2, filp->f_pos,
+                               parent_ino(dentry), DT_DIR) < 0)
+                       goto out;
+               filp->f_pos++;
+       }
+       pos = 2;
+
+       /* - Find each instance of the directory
+        * - Read all entries in each instance
+        * - Before returning an entry to user space lookup the entry
+        *   by name and if I find a different entry don't return
+        *   this one because it means it is a buried dup.
+        * For sysctl this should only happen for directory entries.
+        */
+       for (head = sysctl_head_next(NULL); head; head = sysctl_head_next(head)) {
+               table = proc_sys_lookup_table(dentry, head->ctl_table);
+
+               if (!table)
+                       continue;
+
+               for (; table->ctl_name || table->procname; table++, pos++) {
+                       /* Can't do anything without a proc name */
+                       if (!table->procname)
+                               continue;
+
+                       if (pos < filp->f_pos)
+                               continue;
+
+                       if (proc_sys_fill_cache(filp, dirent, filldir, table) < 0)
+                               goto out;
+                       filp->f_pos = pos + 1;
+               }
+       }
+       ret = 1;
+out:
+       sysctl_head_finish(head);
+       return ret;
+}
+
+static int proc_sys_permission(struct inode *inode, int mask, struct nameidata *nd)
+{
+       /*
+        * sysctl entries that are not writeable,
+        * are _NOT_ writeable, capabilities or not.
+        */
+       struct ctl_table_header *head;
+       struct ctl_table *table;
+       struct dentry *dentry;
+       int mode;
+       int depth;
+       int error;
+
+       head = NULL;
+       depth = PROC_I(inode)->fd;
+
+       /* First check the cached permissions, in case we don't have
+        * enough information to lookup the sysctl table entry.
+        */
+       error = -EACCES;
+       mode = inode->i_mode;
+
+       if (current->euid == 0)
+               mode >>= 6;
+       else if (in_group_p(0))
+               mode >>= 3;
+
+       if ((mode & mask & (MAY_READ|MAY_WRITE|MAY_EXEC)) == mask)
+               error = 0;
+
+       /* If we can't get a sysctl table entry the permission
+        * checks on the cached mode will have to be enough.
+        */
+       if (!nd || !depth)
+               goto out;
+
+       dentry = nd->dentry;
+       table = do_proc_sys_lookup(dentry->d_parent, &dentry->d_name, &head);
+
+       /* If the entry does not exist deny permission */
+       error = -EACCES;
+       if (!table)
+               goto out;
+
+       /* Use the permissions on the sysctl table entry */
+       error = sysctl_perm(table, mask);
+out:
+       sysctl_head_finish(head);
+       return error;
+}
+
+static int proc_sys_setattr(struct dentry *dentry, struct iattr *attr)
+{
+       struct inode *inode = dentry->d_inode;
+       int error;
+
+       if (attr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID))
+               return -EPERM;
+
+       error = inode_change_ok(inode, attr);
+       if (!error) {
+               error = security_inode_setattr(dentry, attr);
+               if (!error)
+                       error = inode_setattr(inode, attr);
+       }
+
+       return error;
+}
+
+/* I'm lazy and don't distinguish between files and directories,
+ * until access time.
+ */
+static const struct file_operations proc_sys_file_operations = {
+       .read           = proc_sys_read,
+       .write          = proc_sys_write,
+       .readdir        = proc_sys_readdir,
+};
+
+static struct inode_operations proc_sys_inode_operations = {
+       .lookup         = proc_sys_lookup,
+       .permission     = proc_sys_permission,
+       .setattr        = proc_sys_setattr,
+};
+
+static int proc_sys_revalidate(struct dentry *dentry, struct nameidata *nd)
+{
+       struct ctl_table_header *head;
+       struct ctl_table *table;
+       table = do_proc_sys_lookup(dentry->d_parent, &dentry->d_name, &head);
+       proc_sys_refresh_inode(dentry->d_inode, table);
+       sysctl_head_finish(head);
+       return !!table;
+}
+
+static struct dentry_operations proc_sys_dentry_operations = {
+       .d_revalidate   = proc_sys_revalidate,
+};
+
+static struct proc_dir_entry *proc_sys_root;
+
+int proc_sys_init(void)
+{
+       proc_sys_root = proc_mkdir("sys", NULL);
+       proc_sys_root->proc_iops = &proc_sys_inode_operations;
+       proc_sys_root->proc_fops = &proc_sys_file_operations;
+       proc_sys_root->nlink = 0;
+       return 0;
+}
index 15c4455b09eb33200adcc2c6984123fd7592083d..c1bbfbeb035e4e5b72a9eb64a1bdb507496b93ce 100644 (file)
@@ -138,7 +138,7 @@ static int tty_drivers_open(struct inode *inode, struct file *file)
        return seq_open(file, &tty_drivers_op);
 }
 
-static struct file_operations proc_tty_drivers_operations = {
+static const struct file_operations proc_tty_drivers_operations = {
        .open           = tty_drivers_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index 64d242b6dcfac60e2aa16b24f85f2d2dbb239836..5834a744c2a96fec843290a83a38c090f34618d5 100644 (file)
 
 struct proc_dir_entry *proc_net, *proc_net_stat, *proc_bus, *proc_root_fs, *proc_root_driver;
 
-#ifdef CONFIG_SYSCTL
-struct proc_dir_entry *proc_sys_root;
-#endif
-
 static int proc_get_sb(struct file_system_type *fs_type,
        int flags, const char *dev_name, void *data, struct vfsmount *mnt)
 {
@@ -70,13 +66,6 @@ void __init proc_root_init(void)
 
 #ifdef CONFIG_SYSVIPC
        proc_mkdir("sysvipc", NULL);
-#endif
-#ifdef CONFIG_SYSCTL
-       proc_sys_root = proc_mkdir("sys", NULL);
-#endif
-#if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)
-       proc_mkdir("sys/fs", NULL);
-       proc_mkdir("sys/fs/binfmt_misc", NULL);
 #endif
        proc_root_fs = proc_mkdir("fs", NULL);
        proc_root_driver = proc_mkdir("driver", NULL);
@@ -90,6 +79,9 @@ void __init proc_root_init(void)
        proc_device_tree_init();
 #endif
        proc_bus = proc_mkdir("bus", NULL);
+#ifdef CONFIG_SYSCTL
+       proc_sys_init();
+#endif
 }
 
 static int proc_root_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat
@@ -136,7 +128,7 @@ static int proc_root_readdir(struct file * filp,
  * <pid> directories. Thus we don't use the generic
  * directory handling functions for that..
  */
-static struct file_operations proc_root_operations = {
+static const struct file_operations proc_root_operations = {
        .read            = generic_read_dir,
        .readdir         = proc_root_readdir,
 };
@@ -144,7 +136,7 @@ static struct file_operations proc_root_operations = {
 /*
  * proc root can do almost nothing..
  */
-static struct inode_operations proc_root_inode_operations = {
+static const struct inode_operations proc_root_inode_operations = {
        .lookup         = proc_root_lookup,
        .getattr        = proc_root_getattr,
 };
index 55ade0d1562160000060c0b35b860b6ff018229a..7445980c8022fa10fd1371a5ecd3be4720cbe7bf 100644 (file)
@@ -434,7 +434,7 @@ static int maps_open(struct inode *inode, struct file *file)
        return do_maps_open(inode, file, &proc_pid_maps_op);
 }
 
-struct file_operations proc_maps_operations = {
+const struct file_operations proc_maps_operations = {
        .open           = maps_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -456,7 +456,7 @@ static int numa_maps_open(struct inode *inode, struct file *file)
        return do_maps_open(inode, file, &proc_pid_numa_maps_op);
 }
 
-struct file_operations proc_numa_maps_operations = {
+const struct file_operations proc_numa_maps_operations = {
        .open           = numa_maps_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -469,7 +469,7 @@ static int smaps_open(struct inode *inode, struct file *file)
        return do_maps_open(inode, file, &proc_pid_smaps_op);
 }
 
-struct file_operations proc_smaps_operations = {
+const struct file_operations proc_smaps_operations = {
        .open           = smaps_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index fcc5caf93f554594aa3a9873abef5c22b67abfa6..7cddf6b8635aa612362042e4b3609a270a61555c 100644 (file)
@@ -220,7 +220,7 @@ static int maps_open(struct inode *inode, struct file *file)
        return ret;
 }
 
-struct file_operations proc_maps_operations = {
+const struct file_operations proc_maps_operations = {
        .open           = maps_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index c94db1db7a71cdcdb70de74d64fc0edae029e0de..ea9ffefb48add56ddace16e202e80d49b97859c5 100644 (file)
@@ -87,7 +87,7 @@ const struct file_operations qnx4_dir_operations =
        .fsync          = file_fsync,
 };
 
-struct inode_operations qnx4_dir_inode_operations =
+const struct inode_operations qnx4_dir_inode_operations =
 {
        .lookup         = qnx4_lookup,
 #ifdef CONFIG_QNX4FS_RW
index 467e5ac7280e739eb65a3ee63267ef5e46fbef20..44649981bbc8b08b7c1830d903432bb3fb583701 100644 (file)
@@ -33,7 +33,7 @@ const struct file_operations qnx4_file_operations =
 #endif
 };
 
-struct inode_operations qnx4_file_inode_operations =
+const struct inode_operations qnx4_file_inode_operations =
 {
 #ifdef CONFIG_QNX4FS_RW
        .truncate       = qnx4_truncate,
index c047dc654d5c4999ead8383f190b2013d6f14d11..83bc8e7824cd6b967b6a760e46c535d601e03d15 100644 (file)
@@ -30,7 +30,7 @@
 #define QNX4_VERSION  4
 #define QNX4_BMNAME   ".bitmap"
 
-static struct super_operations qnx4_sops;
+static const struct super_operations qnx4_sops;
 
 #ifdef CONFIG_QNX4FS_RW
 
@@ -129,7 +129,7 @@ static void qnx4_read_inode(struct inode *);
 static int qnx4_remount(struct super_block *sb, int *flags, char *data);
 static int qnx4_statfs(struct dentry *, struct kstatfs *);
 
-static struct super_operations qnx4_sops =
+static const struct super_operations qnx4_sops =
 {
        .alloc_inode    = qnx4_alloc_inode,
        .destroy_inode  = qnx4_destroy_inode,
index 54ebbc84207f162f2f58a8d00a1e8403088d5fc0..2f14774a124fc05e5c995f1c9dd02926440de009 100644 (file)
@@ -31,7 +31,7 @@ const struct address_space_operations ramfs_aops = {
        .readpage       = simple_readpage,
        .prepare_write  = simple_prepare_write,
        .commit_write   = simple_commit_write,
-       .set_page_dirty = __set_page_dirty_nobuffers,
+       .set_page_dirty = __set_page_dirty_no_writeback,
 };
 
 const struct file_operations ramfs_file_operations = {
@@ -45,6 +45,6 @@ const struct file_operations ramfs_file_operations = {
        .llseek         = generic_file_llseek,
 };
 
-struct inode_operations ramfs_file_inode_operations = {
+const struct inode_operations ramfs_file_inode_operations = {
        .getattr        = simple_getattr,
 };
index e9d6c47332826501c2857514c6ba334366856791..d3fd7c6732d289ba8aa46a6452e9c35a5156ad0a 100644 (file)
@@ -32,7 +32,7 @@ const struct address_space_operations ramfs_aops = {
        .readpage               = simple_readpage,
        .prepare_write          = simple_prepare_write,
        .commit_write           = simple_commit_write,
-       .set_page_dirty = __set_page_dirty_nobuffers,
+       .set_page_dirty         = __set_page_dirty_no_writeback,
 };
 
 const struct file_operations ramfs_file_operations = {
@@ -47,7 +47,7 @@ const struct file_operations ramfs_file_operations = {
        .llseek                 = generic_file_llseek,
 };
 
-struct inode_operations ramfs_file_inode_operations = {
+const struct inode_operations ramfs_file_inode_operations = {
        .setattr                = ramfs_nommu_setattr,
        .getattr                = simple_getattr,
 };
index 2faf4cdf61b0d126713eb7b7eddb692517730504..ff1f7639707b13c74f90737cf7db579050f2e04e 100644 (file)
@@ -40,8 +40,8 @@
 /* some random number */
 #define RAMFS_MAGIC    0x858458f6
 
-static struct super_operations ramfs_ops;
-static struct inode_operations ramfs_dir_inode_operations;
+static const struct super_operations ramfs_ops;
+static const struct inode_operations ramfs_dir_inode_operations;
 
 static struct backing_dev_info ramfs_backing_dev_info = {
        .ra_pages       = 0,    /* No readahead */
@@ -143,7 +143,7 @@ static int ramfs_symlink(struct inode * dir, struct dentry *dentry, const char *
        return error;
 }
 
-static struct inode_operations ramfs_dir_inode_operations = {
+static const struct inode_operations ramfs_dir_inode_operations = {
        .create         = ramfs_create,
        .lookup         = simple_lookup,
        .link           = simple_link,
@@ -155,7 +155,7 @@ static struct inode_operations ramfs_dir_inode_operations = {
        .rename         = simple_rename,
 };
 
-static struct super_operations ramfs_ops = {
+static const struct super_operations ramfs_ops = {
        .statfs         = simple_statfs,
        .drop_inode     = generic_delete_inode,
 };
index c2bb58e74653351797d75c654b855b1fa72b4ed5..af7cc074a47621af7d160786515dec5280697f3c 100644 (file)
@@ -12,4 +12,4 @@
 
 extern const struct address_space_operations ramfs_aops;
 extern const struct file_operations ramfs_file_operations;
-extern struct inode_operations ramfs_file_inode_operations;
+extern const struct inode_operations ramfs_file_inode_operations;
index 707ac21700d31d26ee85d85734e4c3138853dd70..1f8dc373ede7755124a0d5da510f05beb7ce784f 100644 (file)
@@ -197,13 +197,13 @@ int rw_verify_area(int read_write, struct file *file, loff_t *ppos, size_t count
        struct inode *inode;
        loff_t pos;
 
+       inode = file->f_path.dentry->d_inode;
        if (unlikely((ssize_t) count < 0))
                goto Einval;
        pos = *ppos;
        if (unlikely((pos < 0) || (loff_t) (pos + count) < 0))
                goto Einval;
 
-       inode = file->f_path.dentry->d_inode;
        if (unlikely(inode->i_flock && MANDATORY_LOCK(inode))) {
                int retval = locks_mandatory_area(
                        read_write == READ ? FLOCK_VERIFY_READ : FLOCK_VERIFY_WRITE,
@@ -274,9 +274,9 @@ ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
                                ret = do_sync_read(file, buf, count, pos);
                        if (ret > 0) {
                                fsnotify_access(file->f_path.dentry);
-                               current->rchar += ret;
+                               add_rchar(current, ret);
                        }
-                       current->syscr++;
+                       inc_syscr(current);
                }
        }
 
@@ -332,9 +332,9 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
                                ret = do_sync_write(file, buf, count, pos);
                        if (ret > 0) {
                                fsnotify_modify(file->f_path.dentry);
-                               current->wchar += ret;
+                               add_wchar(current, ret);
                        }
-                       current->syscw++;
+                       inc_syscw(current);
                }
        }
 
@@ -675,8 +675,8 @@ sys_readv(unsigned long fd, const struct iovec __user *vec, unsigned long vlen)
        }
 
        if (ret > 0)
-               current->rchar += ret;
-       current->syscr++;
+               add_rchar(current, ret);
+       inc_syscr(current);
        return ret;
 }
 
@@ -696,8 +696,8 @@ sys_writev(unsigned long fd, const struct iovec __user *vec, unsigned long vlen)
        }
 
        if (ret > 0)
-               current->wchar += ret;
-       current->syscw++;
+               add_wchar(current, ret);
+       inc_syscw(current);
        return ret;
 }
 
@@ -779,12 +779,12 @@ static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos,
        retval = in_file->f_op->sendfile(in_file, ppos, count, file_send_actor, out_file);
 
        if (retval > 0) {
-               current->rchar += retval;
-               current->wchar += retval;
+               add_rchar(current, retval);
+               add_wchar(current, retval);
        }
-       current->syscr++;
-       current->syscw++;
 
+       inc_syscr(current);
+       inc_syscw(current);
        if (*ppos > max)
                retval = -EOVERFLOW;
 
index fba304e64de81d51805d52434b152a6fc8aed50b..f85c5cf4934ce3a3869e15c8f5cb9d432a05461c 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/time.h>
 #include <linux/reiserfs_fs.h>
 #include <linux/buffer_head.h>
+#include <linux/kernel.h>
 
 #ifdef CONFIG_REISERFS_CHECK
 
@@ -1756,7 +1757,7 @@ static void store_thrown(struct tree_balance *tb, struct buffer_head *bh)
        if (buffer_dirty(bh))
                reiserfs_warning(tb->tb_sb,
                                 "store_thrown deals with dirty buffer");
-       for (i = 0; i < sizeof(tb->thrown) / sizeof(tb->thrown[0]); i++)
+       for (i = 0; i < ARRAY_SIZE(tb->thrown); i++)
                if (!tb->thrown[i]) {
                        tb->thrown[i] = bh;
                        get_bh(bh);     /* free_thrown puts this */
@@ -1769,7 +1770,7 @@ static void free_thrown(struct tree_balance *tb)
 {
        int i;
        b_blocknr_t blocknr;
-       for (i = 0; i < sizeof(tb->thrown) / sizeof(tb->thrown[0]); i++) {
+       for (i = 0; i < ARRAY_SIZE(tb->thrown); i++) {
                if (tb->thrown[i]) {
                        blocknr = tb->thrown[i]->b_blocknr;
                        if (buffer_dirty(tb->thrown[i]))
index 5109f1d5e7ffcbe2eb08340221439b440fd5ba57..abfada2f52db7b2a54f282d968e3a634199df0ad 100644 (file)
@@ -1556,7 +1556,7 @@ const struct file_operations reiserfs_file_operations = {
        .splice_write = generic_file_splice_write,
 };
 
-struct inode_operations reiserfs_file_inode_operations = {
+const struct inode_operations reiserfs_file_inode_operations = {
        .truncate = reiserfs_vfs_truncate_file,
        .setattr = reiserfs_setattr,
        .setxattr = reiserfs_setxattr,
index 23f5cd5bbf564253d4012c82b60490facc56e40f..a2161840bc7c00837e36c6446cb6cf5623f2a5da 100644 (file)
@@ -1525,7 +1525,7 @@ static int reiserfs_rename(struct inode *old_dir, struct dentry *old_dentry,
 /*
  * directories can handle most operations...
  */
-struct inode_operations reiserfs_dir_inode_operations = {
+const struct inode_operations reiserfs_dir_inode_operations = {
        //&reiserfs_dir_operations,   /* default_file_ops */
        .create = reiserfs_create,
        .lookup = reiserfs_lookup,
@@ -1548,7 +1548,7 @@ struct inode_operations reiserfs_dir_inode_operations = {
  * symlink operations.. same as page_symlink_inode_operations, with xattr
  * stuff added
  */
-struct inode_operations reiserfs_symlink_inode_operations = {
+const struct inode_operations reiserfs_symlink_inode_operations = {
        .readlink = generic_readlink,
        .follow_link = page_follow_link_light,
        .put_link = page_put_link,
@@ -1564,7 +1564,7 @@ struct inode_operations reiserfs_symlink_inode_operations = {
 /*
  * special file operations.. just xattr/acl stuff
  */
-struct inode_operations reiserfs_special_inode_operations = {
+const struct inode_operations reiserfs_special_inode_operations = {
        .setattr = reiserfs_setattr,
        .setxattr = reiserfs_setxattr,
        .getxattr = reiserfs_getxattr,
index 58ad4551a7c144d07a42d74843a5f568bb4f9366..f13a7f164dc65e225eb36e93fa3cf6e7c10d22f0 100644 (file)
@@ -593,7 +593,7 @@ static ssize_t reiserfs_quota_read(struct super_block *, int, char *, size_t,
                                   loff_t);
 #endif
 
-static struct super_operations reiserfs_sops = {
+static const struct super_operations reiserfs_sops = {
        .alloc_inode = reiserfs_alloc_inode,
        .destroy_inode = reiserfs_destroy_inode,
        .write_inode = reiserfs_write_inode,
index d3e243a6f609eb5a9536a2851e5e0713590fe077..fd601014813ea52e68611746fca2d19afd8ae4e9 100644 (file)
@@ -110,7 +110,7 @@ romfs_checksum(void *data, int size)
        return sum;
 }
 
-static struct super_operations romfs_ops;
+static const struct super_operations romfs_ops;
 
 static int romfs_fill_super(struct super_block *s, void *data, int silent)
 {
@@ -468,7 +468,7 @@ static const struct file_operations romfs_dir_operations = {
        .readdir        = romfs_readdir,
 };
 
-static struct inode_operations romfs_dir_inode_operations = {
+static const struct inode_operations romfs_dir_inode_operations = {
        .lookup         = romfs_lookup,
 };
 
@@ -598,7 +598,7 @@ static int romfs_remount(struct super_block *sb, int *flags, char *data)
        return 0;
 }
 
-static struct super_operations romfs_ops = {
+static const struct super_operations romfs_ops = {
        .alloc_inode    = romfs_alloc_inode,
        .destroy_inode  = romfs_destroy_inode,
        .read_inode     = romfs_read_inode,
index b1e58d1ac9ca84090a4519e56a3d2692660f04b3..50136b1a3eca126d92bbb66b94c90a4f7ba0f6ad 100644 (file)
@@ -42,7 +42,7 @@ const struct file_operations smb_dir_operations =
        .open           = smb_dir_open,
 };
 
-struct inode_operations smb_dir_inode_operations =
+const struct inode_operations smb_dir_inode_operations =
 {
        .create         = smb_create,
        .lookup         = smb_lookup,
@@ -54,7 +54,7 @@ struct inode_operations smb_dir_inode_operations =
        .setattr        = smb_notify_change,
 };
 
-struct inode_operations smb_dir_inode_operations_unix =
+const struct inode_operations smb_dir_inode_operations_unix =
 {
        .create         = smb_create,
        .lookup         = smb_lookup,
index e50533a7951754e2c55ab5176f23f1f3fe582004..f161797160c41a591e4de16913b2efe4cea36072 100644 (file)
@@ -418,7 +418,7 @@ const struct file_operations smb_file_operations =
        .sendfile       = smb_file_sendfile,
 };
 
-struct inode_operations smb_file_inode_operations =
+const struct inode_operations smb_file_inode_operations =
 {
        .permission     = smb_file_permission,
        .getattr        = smb_getattr,
index 84dfe3f3482e3448851e808554fed11cfcf6f7a2..5faba4f1c9abe7deb370d24b74412bad148468f7 100644 (file)
@@ -98,7 +98,7 @@ static int smb_remount(struct super_block *sb, int *flags, char *data)
        return 0;
 }
 
-static struct super_operations smb_sops =
+static const struct super_operations smb_sops =
 {
        .alloc_inode    = smb_alloc_inode,
        .destroy_inode  = smb_destroy_inode,
index 34fb462b23795c63581648ab69149faaf7bedfd4..03f456c1b7d44cb6e5e7e9167fe9ece483ef2394 100644 (file)
@@ -36,8 +36,8 @@ extern int smb_proc_link(struct smb_sb_info *server, struct dentry *dentry, stru
 extern void smb_install_null_ops(struct smb_ops *ops);
 /* dir.c */
 extern const struct file_operations smb_dir_operations;
-extern struct inode_operations smb_dir_inode_operations;
-extern struct inode_operations smb_dir_inode_operations_unix;
+extern const struct inode_operations smb_dir_inode_operations;
+extern const struct inode_operations smb_dir_inode_operations_unix;
 extern void smb_new_dentry(struct dentry *dentry);
 extern void smb_renew_times(struct dentry *dentry);
 /* cache.c */
@@ -65,7 +65,7 @@ extern int smb_notify_change(struct dentry *dentry, struct iattr *attr);
 /* file.c */
 extern const struct address_space_operations smb_file_aops;
 extern const struct file_operations smb_file_operations;
-extern struct inode_operations smb_file_inode_operations;
+extern const struct inode_operations smb_file_inode_operations;
 /* ioctl.c */
 extern int smb_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
 /* smbiod.c */
@@ -84,4 +84,4 @@ extern int smb_request_send_server(struct smb_sb_info *server);
 extern int smb_request_recv(struct smb_sb_info *server);
 /* symlink.c */
 extern int smb_symlink(struct inode *inode, struct dentry *dentry, const char *oldname);
-extern struct inode_operations smb_link_inode_operations;
+extern const struct inode_operations smb_link_inode_operations;
index a4bcae8a9aff23f0835e996427d38036afb73c47..42261dbdf60f172270dff8c70c1942c50a2ce0b3 100644 (file)
@@ -61,7 +61,7 @@ static struct smb_request *smb_do_alloc_request(struct smb_sb_info *server,
        struct smb_request *req;
        unsigned char *buf = NULL;
 
-       req = kmem_cache_alloc(req_cachep, GFP_KERNEL);
+       req = kmem_cache_zalloc(req_cachep, GFP_KERNEL);
        VERBOSE("allocating request: %p\n", req);
        if (!req)
                goto out;
@@ -74,7 +74,6 @@ static struct smb_request *smb_do_alloc_request(struct smb_sb_info *server,
                }
        }
 
-       memset(req, 0, sizeof(struct smb_request));
        req->rq_buffer = buf;
        req->rq_bufsize = bufsize;
        req->rq_server = server;
index cdc53c4fb3813448ef6c7c0dba700b7ad38c4752..fea20ceb8a5f8fab59f4afe7421614231274d0e8 100644 (file)
@@ -6,7 +6,6 @@
  *  Please add a note about your changes to smbfs in the ChangeLog file.
  */
 
-#include <linux/sched.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/fcntl.h>
@@ -62,7 +61,7 @@ static void smb_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
                __putname(s);
 }
 
-struct inode_operations smb_link_inode_operations =
+const struct inode_operations smb_link_inode_operations =
 {
        .readlink       = generic_readlink,
        .follow_link    = smb_follow_link,
index 3e7458c2bb76c6d46b44a57718cb3b30a9d317fe..60b1e50cbf536c25aa6c667567448cf0b4705514 100644 (file)
@@ -285,7 +285,7 @@ int fsync_super(struct super_block *sb)
  */
 void generic_shutdown_super(struct super_block *sb)
 {
-       struct super_operations *sop = sb->s_op;
+       const struct super_operations *sop = sb->s_op;
 
        if (sb->s_root) {
                shrink_dcache_for_umount(sb);
index 9dcdf556c99c1d2b68f9bde966f2b4d393b05555..8813990304fe58f8b12449b6f99471887f1920ee 100644 (file)
@@ -37,11 +37,10 @@ static struct sysfs_dirent * __sysfs_new_dirent(void * element)
 {
        struct sysfs_dirent * sd;
 
-       sd = kmem_cache_alloc(sysfs_dir_cachep, GFP_KERNEL);
+       sd = kmem_cache_zalloc(sysfs_dir_cachep, GFP_KERNEL);
        if (!sd)
                return NULL;
 
-       memset(sd, 0, sizeof(*sd));
        atomic_set(&sd->s_count, 1);
        atomic_set(&sd->s_event, 1);
        INIT_LIST_HEAD(&sd->s_children);
@@ -297,7 +296,7 @@ static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,
        return ERR_PTR(err);
 }
 
-struct inode_operations sysfs_dir_inode_operations = {
+const struct inode_operations sysfs_dir_inode_operations = {
        .lookup         = sysfs_lookup,
        .setattr        = sysfs_setattr,
 };
index 542d2bcc73df16583a0b9449c6ee6f052275076e..dd1344b007f59baf3b0d5ba05fadecd83f8d0604 100644 (file)
@@ -29,7 +29,7 @@ static struct backing_dev_info sysfs_backing_dev_info = {
        .capabilities   = BDI_CAP_NO_ACCT_DIRTY | BDI_CAP_NO_WRITEBACK,
 };
 
-static struct inode_operations sysfs_inode_operations ={
+static const struct inode_operations sysfs_inode_operations ={
        .setattr        = sysfs_setattr,
 };
 
index f6a87a8248838128b48c786661eebde4d19f348d..23a48a38e6af01455575083f8242ef4538f76cac 100644 (file)
@@ -21,7 +21,7 @@ struct kmem_cache *sysfs_dir_cachep;
 
 static void sysfs_clear_inode(struct inode *inode);
 
-static struct super_operations sysfs_ops = {
+static const struct super_operations sysfs_ops = {
        .statfs         = simple_statfs,
        .drop_inode     = sysfs_delete_inode,
        .clear_inode    = sysfs_clear_inode,
index 4869f611192fef555379df137d8598858d26436a..7b9c5bfde920fb1ea30af8f81d4313f84bf981ec 100644 (file)
@@ -181,7 +181,7 @@ static void sysfs_put_link(struct dentry *dentry, struct nameidata *nd, void *co
                free_page((unsigned long)page);
 }
 
-struct inode_operations sysfs_symlink_inode_operations = {
+const struct inode_operations sysfs_symlink_inode_operations = {
        .readlink = generic_readlink,
        .follow_link = sysfs_follow_link,
        .put_link = sysfs_put_link,
index fe1cbfd208ed9828993623c9aaa16949cd379db3..d976b0005549e9deb720352298550dfed644a839 100644 (file)
@@ -26,8 +26,8 @@ extern struct super_block * sysfs_sb;
 extern const struct file_operations sysfs_dir_operations;
 extern const struct file_operations sysfs_file_operations;
 extern const struct file_operations bin_fops;
-extern struct inode_operations sysfs_dir_inode_operations;
-extern struct inode_operations sysfs_symlink_inode_operations;
+extern const struct inode_operations sysfs_dir_inode_operations;
+extern const struct inode_operations sysfs_symlink_inode_operations;
 
 struct sysfs_symlink {
        char * link_name;
index 47a4b728f15b49bfdf84d7b30d17568e08a13b1c..0732ddb9020beddba8e0c8caf0a71a43ed3c7eb8 100644 (file)
@@ -30,7 +30,7 @@ const struct file_operations sysv_file_operations = {
        .sendfile       = generic_file_sendfile,
 };
 
-struct inode_operations sysv_file_inode_operations = {
+const struct inode_operations sysv_file_inode_operations = {
        .truncate       = sysv_truncate,
        .getattr        = sysv_getattr,
 };
index ead9864567e39d237364868ee710632adcd4175a..9311cac186fe1c1f04c6eb502226100fb9c4fd39 100644 (file)
@@ -142,7 +142,7 @@ static inline void write3byte(struct sysv_sb_info *sbi,
        }
 }
 
-static struct inode_operations sysv_symlink_inode_operations = {
+static const struct inode_operations sysv_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = page_follow_link_light,
        .put_link       = page_put_link,
@@ -327,7 +327,7 @@ static void init_once(void *p, struct kmem_cache *cachep, unsigned long flags)
                inode_init_once(&si->vfs_inode);
 }
 
-struct super_operations sysv_sops = {
+const struct super_operations sysv_sops = {
        .alloc_inode    = sysv_alloc_inode,
        .destroy_inode  = sysv_destroy_inode,
        .read_inode     = sysv_read_inode,
index f7c08db8e34c80225000cd10b7722e5d8ef82eb6..4e48abbd2b5de63ff1e93f7c5599a9b917f18e43 100644 (file)
@@ -292,7 +292,7 @@ out:
 /*
  * directories can handle most operations...
  */
-struct inode_operations sysv_dir_inode_operations = {
+const struct inode_operations sysv_dir_inode_operations = {
        .create         = sysv_create,
        .lookup         = sysv_lookup,
        .link           = sysv_link,
index b85ce61d635ce2a41865f3f324d5fdd9095244ca..00d2f8a43e4eaefea0e35ba6108ef561d2852b52 100644 (file)
@@ -14,7 +14,7 @@ static void *sysv_follow_link(struct dentry *dentry, struct nameidata *nd)
        return NULL;
 }
 
-struct inode_operations sysv_fast_symlink_inode_operations = {
+const struct inode_operations sysv_fast_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = sysv_follow_link,
 };
index dcb18b2171feafbb7d2d13d1d45bcb2e312fe77e..5b4fedf17cc4de1d71b5a5804692ac4f44824e57 100644 (file)
@@ -159,13 +159,13 @@ extern struct sysv_dir_entry *sysv_dotdot(struct inode *, struct page **);
 extern ino_t sysv_inode_by_name(struct dentry *);
 
 
-extern struct inode_operations sysv_file_inode_operations;
-extern struct inode_operations sysv_dir_inode_operations;
-extern struct inode_operations sysv_fast_symlink_inode_operations;
+extern const struct inode_operations sysv_file_inode_operations;
+extern const struct inode_operations sysv_dir_inode_operations;
+extern const struct inode_operations sysv_fast_symlink_inode_operations;
 extern const struct file_operations sysv_file_operations;
 extern const struct file_operations sysv_dir_operations;
 extern const struct address_space_operations sysv_aops;
-extern struct super_operations sysv_sops;
+extern const struct super_operations sysv_sops;
 extern struct dentry_operations sysv_dentry_operations;
 
 
index d81f2db7b0e3cc47fe445e1ce8486493250619d9..40d5047defea912289f85c40c300afb4ac9aaa81 100644 (file)
@@ -263,6 +263,6 @@ const struct file_operations udf_file_operations = {
        .sendfile               = generic_file_sendfile,
 };
 
-struct inode_operations udf_file_inode_operations = {
+const struct inode_operations udf_file_inode_operations = {
        .truncate               = udf_truncate,
 };
index 73163325e5ec36ba628209cc146cf808d3f94abc..fe361cd19a98912ce1fec1f280d06d758ddec298 100644 (file)
@@ -1308,7 +1308,7 @@ end_rename:
        return retval;
 }
 
-struct inode_operations udf_dir_inode_operations = {
+const struct inode_operations udf_dir_inode_operations = {
        .lookup                         = udf_lookup,
        .create                         = udf_create,
        .link                           = udf_link,
index 1dbc2955f02e5493879cdfda7f9b154910941504..8672b88f7ff29a9419afcc5b7b696b63570b63a8 100644 (file)
@@ -160,7 +160,7 @@ static void destroy_inodecache(void)
 }
 
 /* Superblock operations */
-static struct super_operations udf_sb_ops = {
+static const struct super_operations udf_sb_ops = {
        .alloc_inode            = udf_alloc_inode,
        .destroy_inode          = udf_destroy_inode,
        .write_inode            = udf_write_inode,
index 1033b7cf29393e6d23c8e4e1f011db7476de1381..ee1dece1f6f513d9411e9a573a151dc65469f10a 100644 (file)
@@ -42,9 +42,9 @@ struct task_struct;
 struct buffer_head;
 struct super_block;
 
-extern struct inode_operations udf_dir_inode_operations;
+extern const struct inode_operations udf_dir_inode_operations;
 extern const struct file_operations udf_dir_operations;
-extern struct inode_operations udf_file_inode_operations;
+extern const struct inode_operations udf_file_inode_operations;
 extern const struct file_operations udf_file_operations;
 extern const struct address_space_operations udf_aops;
 extern const struct address_space_operations udf_adinicb_aops;
index 638f4c585e89a404f0bb87ee5ddea0bd2cf3fc9f..bcc44084e0049fca554e28d87a02c12ec2ab8bc0 100644 (file)
@@ -4,6 +4,8 @@
  * Copyright (C) 1998
  * Daniel Pirkl <daniel.pirkl@email.cz>
  * Charles University, Faculty of Mathematics and Physics
+ *
+ * UFS2 write support Evgeniy Dushistov <dushistov@mail.ru>, 2007
  */
 
 #include <linux/fs.h>
 #include <linux/quotaops.h>
 #include <linux/buffer_head.h>
 #include <linux/capability.h>
-#include <linux/sched.h>
 #include <linux/bitops.h>
 #include <asm/byteorder.h>
 
 #include "swab.h"
 #include "util.h"
 
-static unsigned ufs_add_fragments (struct inode *, unsigned, unsigned, unsigned, int *);
-static unsigned ufs_alloc_fragments (struct inode *, unsigned, unsigned, unsigned, int *);
-static unsigned ufs_alloccg_block (struct inode *, struct ufs_cg_private_info *, unsigned, int *);
-static unsigned ufs_bitmap_search (struct super_block *, struct ufs_cg_private_info *, unsigned, unsigned);
+#define INVBLOCK ((u64)-1L)
+
+static u64 ufs_add_fragments(struct inode *, u64, unsigned, unsigned, int *);
+static u64 ufs_alloc_fragments(struct inode *, unsigned, u64, unsigned, int *);
+static u64 ufs_alloccg_block(struct inode *, struct ufs_cg_private_info *, u64, int *);
+static u64 ufs_bitmap_search (struct super_block *, struct ufs_cg_private_info *, u64, unsigned);
 static unsigned char ufs_fragtable_8fpb[], ufs_fragtable_other[];
 static void ufs_clusteracct(struct super_block *, struct ufs_cg_private_info *, unsigned, int);
 
 /*
  * Free 'count' fragments from fragment number 'fragment'
  */
-void ufs_free_fragments(struct inode *inode, unsigned fragment, unsigned count)
+void ufs_free_fragments(struct inode *inode, u64 fragment, unsigned count)
 {
        struct super_block * sb;
        struct ufs_sb_private_info * uspi;
        struct ufs_super_block_first * usb1;
        struct ufs_cg_private_info * ucpi;
        struct ufs_cylinder_group * ucg;
-       unsigned cgno, bit, end_bit, bbase, blkmap, i, blkno, cylno;
+       unsigned cgno, bit, end_bit, bbase, blkmap, i;
+       u64 blkno;
        
        sb = inode->i_sb;
        uspi = UFS_SB(sb)->s_uspi;
        usb1 = ubh_get_usb_first(uspi);
        
-       UFSD("ENTER, fragment %u, count %u\n", fragment, count);
+       UFSD("ENTER, fragment %llu, count %u\n",
+            (unsigned long long)fragment, count);
        
        if (ufs_fragnum(fragment) + count > uspi->s_fpg)
                ufs_error (sb, "ufs_free_fragments", "internal error");
        
        lock_super(sb);
        
-       cgno = ufs_dtog(fragment);
-       bit = ufs_dtogd(fragment);
+       cgno = ufs_dtog(uspi, fragment);
+       bit = ufs_dtogd(uspi, fragment);
        if (cgno >= uspi->s_ncg) {
                ufs_panic (sb, "ufs_free_fragments", "freeing blocks are outside device");
                goto failed;
@@ -101,9 +106,13 @@ void ufs_free_fragments(struct inode *inode, unsigned fragment, unsigned count)
                fs32_add(sb, &ucg->cg_cs.cs_nbfree, 1);
                uspi->cs_total.cs_nbfree++;
                fs32_add(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nbfree, 1);
-               cylno = ufs_cbtocylno (bbase);
-               fs16_add(sb, &ubh_cg_blks(ucpi, cylno, ufs_cbtorpos(bbase)), 1);
-               fs32_add(sb, &ubh_cg_blktot(ucpi, cylno), 1);
+               if (uspi->fs_magic != UFS2_MAGIC) {
+                       unsigned cylno = ufs_cbtocylno (bbase);
+
+                       fs16_add(sb, &ubh_cg_blks(ucpi, cylno,
+                                                 ufs_cbtorpos(bbase)), 1);
+                       fs32_add(sb, &ubh_cg_blktot(ucpi, cylno), 1);
+               }
        }
        
        ubh_mark_buffer_dirty (USPI_UBH(uspi));
@@ -127,24 +136,27 @@ failed:
 /*
  * Free 'count' fragments from fragment number 'fragment' (free whole blocks)
  */
-void ufs_free_blocks(struct inode *inode, unsigned fragment, unsigned count)
+void ufs_free_blocks(struct inode *inode, u64 fragment, unsigned count)
 {
        struct super_block * sb;
        struct ufs_sb_private_info * uspi;
        struct ufs_super_block_first * usb1;
        struct ufs_cg_private_info * ucpi;
        struct ufs_cylinder_group * ucg;
-       unsigned overflow, cgno, bit, end_bit, blkno, i, cylno;
+       unsigned overflow, cgno, bit, end_bit, i;
+       u64 blkno;
        
        sb = inode->i_sb;
        uspi = UFS_SB(sb)->s_uspi;
        usb1 = ubh_get_usb_first(uspi);
 
-       UFSD("ENTER, fragment %u, count %u\n", fragment, count);
+       UFSD("ENTER, fragment %llu, count %u\n",
+            (unsigned long long)fragment, count);
        
        if ((fragment & uspi->s_fpbmask) || (count & uspi->s_fpbmask)) {
                ufs_error (sb, "ufs_free_blocks", "internal error, "
-                       "fragment %u, count %u\n", fragment, count);
+                          "fragment %llu, count %u\n",
+                          (unsigned long long)fragment, count);
                goto failed;
        }
 
@@ -152,8 +164,8 @@ void ufs_free_blocks(struct inode *inode, unsigned fragment, unsigned count)
        
 do_more:
        overflow = 0;
-       cgno = ufs_dtog (fragment);
-       bit = ufs_dtogd (fragment);
+       cgno = ufs_dtog(uspi, fragment);
+       bit = ufs_dtogd(uspi, fragment);
        if (cgno >= uspi->s_ncg) {
                ufs_panic (sb, "ufs_free_blocks", "freeing blocks are outside device");
                goto failed_unlock;
@@ -187,9 +199,14 @@ do_more:
                fs32_add(sb, &ucg->cg_cs.cs_nbfree, 1);
                uspi->cs_total.cs_nbfree++;
                fs32_add(sb, &UFS_SB(sb)->fs_cs(cgno).cs_nbfree, 1);
-               cylno = ufs_cbtocylno(i);
-               fs16_add(sb, &ubh_cg_blks(ucpi, cylno, ufs_cbtorpos(i)), 1);
-               fs32_add(sb, &ubh_cg_blktot(ucpi, cylno), 1);
+
+               if (uspi->fs_magic != UFS2_MAGIC) {
+                       unsigned cylno = ufs_cbtocylno(i);
+
+                       fs16_add(sb, &ubh_cg_blks(ucpi, cylno,
+                                                 ufs_cbtorpos(i)), 1);
+                       fs32_add(sb, &ubh_cg_blktot(ucpi, cylno), 1);
+               }
        }
 
        ubh_mark_buffer_dirty (USPI_UBH(uspi));
@@ -308,15 +325,19 @@ static void ufs_clear_frags(struct inode *inode, sector_t beg, unsigned int n,
        }
 }
 
-unsigned ufs_new_fragments(struct inode * inode, __fs32 * p, unsigned fragment,
-                          unsigned goal, unsigned count, int * err, struct page *locked_page)
+u64 ufs_new_fragments(struct inode *inode, void *p, u64 fragment,
+                          u64 goal, unsigned count, int *err,
+                          struct page *locked_page)
 {
        struct super_block * sb;
        struct ufs_sb_private_info * uspi;
        struct ufs_super_block_first * usb1;
-       unsigned cgno, oldcount, newcount, tmp, request, result;
+       unsigned cgno, oldcount, newcount;
+       u64 tmp, request, result;
        
-       UFSD("ENTER, ino %lu, fragment %u, goal %u, count %u\n", inode->i_ino, fragment, goal, count);
+       UFSD("ENTER, ino %lu, fragment %llu, goal %llu, count %u\n",
+            inode->i_ino, (unsigned long long)fragment,
+            (unsigned long long)goal, count);
        
        sb = inode->i_sb;
        uspi = UFS_SB(sb)->s_uspi;
@@ -324,11 +345,12 @@ unsigned ufs_new_fragments(struct inode * inode, __fs32 * p, unsigned fragment,
        *err = -ENOSPC;
 
        lock_super (sb);
-       
-       tmp = fs32_to_cpu(sb, *p);
+       tmp = ufs_data_ptr_to_cpu(sb, p);
+
        if (count + ufs_fragnum(fragment) > uspi->s_fpb) {
-               ufs_warning (sb, "ufs_new_fragments", "internal warning"
-                       " fragment %u, count %u", fragment, count);
+               ufs_warning(sb, "ufs_new_fragments", "internal warning"
+                           " fragment %llu, count %u",
+                           (unsigned long long)fragment, count);
                count = uspi->s_fpb - ufs_fragnum(fragment); 
        }
        oldcount = ufs_fragnum (fragment);
@@ -339,10 +361,12 @@ unsigned ufs_new_fragments(struct inode * inode, __fs32 * p, unsigned fragment,
         */
        if (oldcount) {
                if (!tmp) {
-                       ufs_error (sb, "ufs_new_fragments", "internal error, "
-                               "fragment %u, tmp %u\n", fragment, tmp);
-                       unlock_super (sb);
-                       return (unsigned)-1;
+                       ufs_error(sb, "ufs_new_fragments", "internal error, "
+                                 "fragment %llu, tmp %llu\n",
+                                 (unsigned long long)fragment,
+                                 (unsigned long long)tmp);
+                       unlock_super(sb);
+                       return INVBLOCK;
                }
                if (fragment < UFS_I(inode)->i_lastfrag) {
                        UFSD("EXIT (ALREADY ALLOCATED)\n");
@@ -372,7 +396,7 @@ unsigned ufs_new_fragments(struct inode * inode, __fs32 * p, unsigned fragment,
        if (goal == 0) 
                cgno = ufs_inotocg (inode->i_ino);
        else
-               cgno = ufs_dtog (goal);
+               cgno = ufs_dtog(uspi, goal);
         
        /*
         * allocate new fragment
@@ -380,14 +404,16 @@ unsigned ufs_new_fragments(struct inode * inode, __fs32 * p, unsigned fragment,
        if (oldcount == 0) {
                result = ufs_alloc_fragments (inode, cgno, goal, count, err);
                if (result) {
-                       *p = cpu_to_fs32(sb, result);
+                       ufs_cpu_to_data_ptr(sb, p, result);
                        *err = 0;
-                       UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count);
-                       ufs_clear_frags(inode, result + oldcount, newcount - oldcount,
-                                       locked_page != NULL);
+                       UFS_I(inode)->i_lastfrag =
+                               max_t(u32, UFS_I(inode)->i_lastfrag,
+                                     fragment + count);
+                       ufs_clear_frags(inode, result + oldcount,
+                                       newcount - oldcount, locked_page != NULL);
                }
                unlock_super(sb);
-               UFSD("EXIT, result %u\n", result);
+               UFSD("EXIT, result %llu\n", (unsigned long long)result);
                return result;
        }
 
@@ -401,7 +427,7 @@ unsigned ufs_new_fragments(struct inode * inode, __fs32 * p, unsigned fragment,
                ufs_clear_frags(inode, result + oldcount, newcount - oldcount,
                                locked_page != NULL);
                unlock_super(sb);
-               UFSD("EXIT, result %u\n", result);
+               UFSD("EXIT, result %llu\n", (unsigned long long)result);
                return result;
        }
 
@@ -433,15 +459,14 @@ unsigned ufs_new_fragments(struct inode * inode, __fs32 * p, unsigned fragment,
                                locked_page != NULL);
                ufs_change_blocknr(inode, fragment - oldcount, oldcount, tmp,
                                   result, locked_page);
-
-               *p = cpu_to_fs32(sb, result);
+               ufs_cpu_to_data_ptr(sb, p, result);
                *err = 0;
                UFS_I(inode)->i_lastfrag = max_t(u32, UFS_I(inode)->i_lastfrag, fragment + count);
                unlock_super(sb);
                if (newcount < request)
                        ufs_free_fragments (inode, result + newcount, request - newcount);
                ufs_free_fragments (inode, tmp, oldcount);
-               UFSD("EXIT, result %u\n", result);
+               UFSD("EXIT, result %llu\n", (unsigned long long)result);
                return result;
        }
 
@@ -450,9 +475,8 @@ unsigned ufs_new_fragments(struct inode * inode, __fs32 * p, unsigned fragment,
        return 0;
 }              
 
-static unsigned
-ufs_add_fragments (struct inode * inode, unsigned fragment,
-                  unsigned oldcount, unsigned newcount, int * err)
+static u64 ufs_add_fragments(struct inode *inode, u64 fragment,
+                            unsigned oldcount, unsigned newcount, int *err)
 {
        struct super_block * sb;
        struct ufs_sb_private_info * uspi;
@@ -461,14 +485,15 @@ ufs_add_fragments (struct inode * inode, unsigned fragment,
        struct ufs_cylinder_group * ucg;
        unsigned cgno, fragno, fragoff, count, fragsize, i;
        
-       UFSD("ENTER, fragment %u, oldcount %u, newcount %u\n", fragment, oldcount, newcount);
+       UFSD("ENTER, fragment %llu, oldcount %u, newcount %u\n",
+            (unsigned long long)fragment, oldcount, newcount);
        
        sb = inode->i_sb;
        uspi = UFS_SB(sb)->s_uspi;
        usb1 = ubh_get_usb_first (uspi);
        count = newcount - oldcount;
        
-       cgno = ufs_dtog(fragment);
+       cgno = ufs_dtog(uspi, fragment);
        if (fs32_to_cpu(sb, UFS_SB(sb)->fs_cs(cgno).cs_nffree) < count)
                return 0;
        if ((ufs_fragnum (fragment) + newcount) > uspi->s_fpb)
@@ -483,7 +508,7 @@ ufs_add_fragments (struct inode * inode, unsigned fragment,
                return 0;
        }
 
-       fragno = ufs_dtogd (fragment);
+       fragno = ufs_dtogd(uspi, fragment);
        fragoff = ufs_fragnum (fragno);
        for (i = oldcount; i < newcount; i++)
                if (ubh_isclr (UCPI_UBH(ucpi), ucpi->c_freeoff, fragno + i))
@@ -521,7 +546,7 @@ ufs_add_fragments (struct inode * inode, unsigned fragment,
        }
        sb->s_dirt = 1;
 
-       UFSD("EXIT, fragment %u\n", fragment);
+       UFSD("EXIT, fragment %llu\n", (unsigned long long)fragment);
        
        return fragment;
 }
@@ -534,17 +559,19 @@ ufs_add_fragments (struct inode * inode, unsigned fragment,
                if (fs32_to_cpu(sb, ucg->cg_frsum[k])) \
                        goto cg_found; 
 
-static unsigned ufs_alloc_fragments (struct inode * inode, unsigned cgno,
-       unsigned goal, unsigned count, int * err)
+static u64 ufs_alloc_fragments(struct inode *inode, unsigned cgno,
+                              u64 goal, unsigned count, int *err)
 {
        struct super_block * sb;
        struct ufs_sb_private_info * uspi;
        struct ufs_super_block_first * usb1;
        struct ufs_cg_private_info * ucpi;
        struct ufs_cylinder_group * ucg;
-       unsigned oldcg, i, j, k, result, allocsize;
+       unsigned oldcg, i, j, k, allocsize;
+       u64 result;
        
-       UFSD("ENTER, ino %lu, cgno %u, goal %u, count %u\n", inode->i_ino, cgno, goal, count);
+       UFSD("ENTER, ino %lu, cgno %u, goal %llu, count %u\n",
+            inode->i_ino, cgno, (unsigned long long)goal, count);
 
        sb = inode->i_sb;
        uspi = UFS_SB(sb)->s_uspi;
@@ -593,7 +620,7 @@ cg_found:
 
        if (count == uspi->s_fpb) {
                result = ufs_alloccg_block (inode, ucpi, goal, err);
-               if (result == (unsigned)-1)
+               if (result == INVBLOCK)
                        return 0;
                goto succed;
        }
@@ -604,9 +631,9 @@ cg_found:
        
        if (allocsize == uspi->s_fpb) {
                result = ufs_alloccg_block (inode, ucpi, goal, err);
-               if (result == (unsigned)-1)
+               if (result == INVBLOCK)
                        return 0;
-               goal = ufs_dtogd (result);
+               goal = ufs_dtogd(uspi, result);
                for (i = count; i < uspi->s_fpb; i++)
                        ubh_setbit (UCPI_UBH(ucpi), ucpi->c_freeoff, goal + i);
                i = uspi->s_fpb - count;
@@ -620,7 +647,7 @@ cg_found:
        }
 
        result = ufs_bitmap_search (sb, ucpi, goal, allocsize);
-       if (result == (unsigned)-1)
+       if (result == INVBLOCK)
                return 0;
        if(DQUOT_ALLOC_BLOCK(inode, count)) {
                *err = -EDQUOT;
@@ -647,20 +674,21 @@ succed:
        sb->s_dirt = 1;
 
        result += cgno * uspi->s_fpg;
-       UFSD("EXIT3, result %u\n", result);
+       UFSD("EXIT3, result %llu\n", (unsigned long long)result);
        return result;
 }
 
-static unsigned ufs_alloccg_block (struct inode * inode,
-       struct ufs_cg_private_info * ucpi, unsigned goal, int * err)
+static u64 ufs_alloccg_block(struct inode *inode,
+                            struct ufs_cg_private_info *ucpi,
+                            u64 goal, int *err)
 {
        struct super_block * sb;
        struct ufs_sb_private_info * uspi;
        struct ufs_super_block_first * usb1;
        struct ufs_cylinder_group * ucg;
-       unsigned result, cylno, blkno;
+       u64 result, blkno;
 
-       UFSD("ENTER, goal %u\n", goal);
+       UFSD("ENTER, goal %llu\n", (unsigned long long)goal);
 
        sb = inode->i_sb;
        uspi = UFS_SB(sb)->s_uspi;
@@ -672,7 +700,7 @@ static unsigned ufs_alloccg_block (struct inode * inode,
                goto norot;
        }
        goal = ufs_blknum (goal);
-       goal = ufs_dtogd (goal);
+       goal = ufs_dtogd(uspi, goal);
        
        /*
         * If the requested block is available, use it.
@@ -684,8 +712,8 @@ static unsigned ufs_alloccg_block (struct inode * inode,
        
 norot: 
        result = ufs_bitmap_search (sb, ucpi, goal, uspi->s_fpb);
-       if (result == (unsigned)-1)
-               return (unsigned)-1;
+       if (result == INVBLOCK)
+               return INVBLOCK;
        ucpi->c_rotor = result;
 gotit:
        blkno = ufs_fragstoblks(result);
@@ -694,17 +722,22 @@ gotit:
                ufs_clusteracct (sb, ucpi, blkno, -1);
        if(DQUOT_ALLOC_BLOCK(inode, uspi->s_fpb)) {
                *err = -EDQUOT;
-               return (unsigned)-1;
+               return INVBLOCK;
        }
 
        fs32_sub(sb, &ucg->cg_cs.cs_nbfree, 1);
        uspi->cs_total.cs_nbfree--;
        fs32_sub(sb, &UFS_SB(sb)->fs_cs(ucpi->c_cgx).cs_nbfree, 1);
-       cylno = ufs_cbtocylno(result);
-       fs16_sub(sb, &ubh_cg_blks(ucpi, cylno, ufs_cbtorpos(result)), 1);
-       fs32_sub(sb, &ubh_cg_blktot(ucpi, cylno), 1);
+
+       if (uspi->fs_magic != UFS2_MAGIC) {
+               unsigned cylno = ufs_cbtocylno((unsigned)result);
+
+               fs16_sub(sb, &ubh_cg_blks(ucpi, cylno,
+                                         ufs_cbtorpos((unsigned)result)), 1);
+               fs32_sub(sb, &ubh_cg_blktot(ucpi, cylno), 1);
+       }
        
-       UFSD("EXIT, result %u\n", result);
+       UFSD("EXIT, result %llu\n", (unsigned long long)result);
 
        return result;
 }
@@ -744,9 +777,9 @@ static unsigned ubh_scanc(struct ufs_sb_private_info *uspi,
  * @goal: near which block we want find new one
  * @count: specified size
  */
-static unsigned ufs_bitmap_search(struct super_block *sb,
-                                 struct ufs_cg_private_info *ucpi,
-                                 unsigned goal, unsigned count)
+static u64 ufs_bitmap_search(struct super_block *sb,
+                            struct ufs_cg_private_info *ucpi,
+                            u64 goal, unsigned count)
 {
        /*
         * Bit patterns for identifying fragments in the block map
@@ -761,16 +794,18 @@ static unsigned ufs_bitmap_search(struct super_block *sb,
        struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi;
        struct ufs_super_block_first *usb1;
        struct ufs_cylinder_group *ucg;
-       unsigned start, length, loc, result;
+       unsigned start, length, loc;
        unsigned pos, want, blockmap, mask, end;
+       u64 result;
 
-       UFSD("ENTER, cg %u, goal %u, count %u\n", ucpi->c_cgx, goal, count);
+       UFSD("ENTER, cg %u, goal %llu, count %u\n", ucpi->c_cgx,
+            (unsigned long long)goal, count);
 
        usb1 = ubh_get_usb_first (uspi);
        ucg = ubh_get_ucg(UCPI_UBH(ucpi));
 
        if (goal)
-               start = ufs_dtogd(goal) >> 3;
+               start = ufs_dtogd(uspi, goal) >> 3;
        else
                start = ucpi->c_frotor >> 3;
                
@@ -790,7 +825,7 @@ static unsigned ufs_bitmap_search(struct super_block *sb,
                                  " length %u, count %u, freeoff %u\n",
                                  ucpi->c_cgx, start, length, count,
                                  ucpi->c_freeoff);
-                       return (unsigned)-1;
+                       return INVBLOCK;
                }
                start = 0;
        }
@@ -808,7 +843,8 @@ static unsigned ufs_bitmap_search(struct super_block *sb,
                want = want_arr[count];
                for (pos = 0; pos <= uspi->s_fpb - count; pos++) {
                        if ((blockmap & mask) == want) {
-                               UFSD("EXIT, result %u\n", result);
+                               UFSD("EXIT, result %llu\n",
+                                    (unsigned long long)result);
                                return result + pos;
                        }
                        mask <<= 1;
@@ -819,7 +855,7 @@ static unsigned ufs_bitmap_search(struct super_block *sb,
        ufs_error(sb, "ufs_bitmap_search", "block not in map on cg %u\n",
                  ucpi->c_cgx);
        UFSD("EXIT (FAILED)\n");
-       return (unsigned)-1;
+       return INVBLOCK;
 }
 
 static void ufs_clusteracct(struct super_block * sb,
index a6c0ca9f48bff1ba6d087413a5accbdcaf1fa370..4890ddf1518e347a45ef00bc451b55891022ff10 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/fs.h>
 #include <linux/ufs_fs.h>
 #include <linux/smp_lock.h>
-#include <linux/sched.h>
 
 #include "swab.h"
 #include "util.h"
index 2ad1259c6ecaacd7f6130859c42cb8654fb0e991..b868878009b68515730a8c43b9690b001d59fbfa 100644 (file)
@@ -18,6 +18,9 @@
  *  Stephen Tweedie (sct@dcs.ed.ac.uk), 1993
  *  Big-endian to little-endian byte-swapping/bitmaps by
  *        David S. Miller (davem@caip.rutgers.edu), 1995
+ *
+ * UFS2 write support added by
+ * Evgeniy Dushistov <dushistov@mail.ru>, 2007
  */
 
 #include <linux/fs.h>
@@ -125,6 +128,47 @@ void ufs_free_inode (struct inode * inode)
        UFSD("EXIT\n");
 }
 
+/*
+ * Nullify new chunk of inodes,
+ * BSD people also set ui_gen field of inode
+ * during nullification, but we not care about
+ * that because of linux ufs do not support NFS
+ */
+static void ufs2_init_inodes_chunk(struct super_block *sb,
+                                  struct ufs_cg_private_info *ucpi,
+                                  struct ufs_cylinder_group *ucg)
+{
+       struct buffer_head *bh;
+       struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi;
+       sector_t beg = uspi->s_sbbase +
+               ufs_inotofsba(ucpi->c_cgx * uspi->s_ipg +
+                             fs32_to_cpu(sb, ucg->cg_u.cg_u2.cg_initediblk));
+       sector_t end = beg + uspi->s_fpb;
+
+       UFSD("ENTER cgno %d\n", ucpi->c_cgx);
+
+       for (; beg < end; ++beg) {
+               bh = sb_getblk(sb, beg);
+               lock_buffer(bh);
+               memset(bh->b_data, 0, sb->s_blocksize);
+               set_buffer_uptodate(bh);
+               mark_buffer_dirty(bh);
+               unlock_buffer(bh);
+               if (sb->s_flags & MS_SYNCHRONOUS)
+                       sync_dirty_buffer(bh);
+               brelse(bh);
+       }
+
+       fs32_add(sb, &ucg->cg_u.cg_u2.cg_initediblk, uspi->s_inopb);
+       ubh_mark_buffer_dirty(UCPI_UBH(ucpi));
+       if (sb->s_flags & MS_SYNCHRONOUS) {
+               ubh_ll_rw_block(SWRITE, UCPI_UBH(ucpi));
+               ubh_wait_on_buffer(UCPI_UBH(ucpi));
+       }
+
+       UFSD("EXIT\n");
+}
+
 /*
  * There are two policies for allocating an inode.  If the new inode is
  * a directory, then a forward search is made for a block group with both
@@ -146,6 +190,7 @@ struct inode * ufs_new_inode(struct inode * dir, int mode)
        struct inode * inode;
        unsigned cg, bit, i, j, start;
        struct ufs_inode_info *ufsi;
+       int err = -ENOSPC;
 
        UFSD("ENTER\n");
        
@@ -198,13 +243,15 @@ struct inode * ufs_new_inode(struct inode * dir, int mode)
                        goto cg_found;
                }
        }
-       
+
        goto failed;
 
 cg_found:
        ucpi = ufs_load_cylinder (sb, cg);
-       if (!ucpi)
+       if (!ucpi) {
+               err = -EIO;
                goto failed;
+       }
        ucg = ubh_get_ucg(UCPI_UBH(ucpi));
        if (!ufs_cg_chkmagic(sb, ucg)) 
                ufs_panic (sb, "ufs_new_inode", "internal error, bad cg magic number");
@@ -216,6 +263,7 @@ cg_found:
                if (!(bit < start)) {
                        ufs_error (sb, "ufs_new_inode",
                            "cylinder group %u corrupted - error in inode bitmap\n", cg);
+                       err = -EIO;
                        goto failed;
                }
        }
@@ -224,9 +272,18 @@ cg_found:
                ubh_setbit (UCPI_UBH(ucpi), ucpi->c_iusedoff, bit);
        else {
                ufs_panic (sb, "ufs_new_inode", "internal error");
+               err = -EIO;
                goto failed;
        }
-       
+
+       if (uspi->fs_magic == UFS2_MAGIC) {
+               u32 initediblk = fs32_to_cpu(sb, ucg->cg_u.cg_u2.cg_initediblk);
+
+               if (bit + uspi->s_inopb > initediblk &&
+                   initediblk < fs32_to_cpu(sb, ucg->cg_u.cg_u2.cg_niblk))
+                       ufs2_init_inodes_chunk(sb, ucpi, ucg);
+       }
+
        fs32_sub(sb, &ucg->cg_cs.cs_nifree, 1);
        uspi->cs_total.cs_nifree--;
        fs32_sub(sb, &sbi->fs_cs(cg).cs_nifree, 1);
@@ -236,7 +293,6 @@ cg_found:
                uspi->cs_total.cs_ndir++;
                fs32_add(sb, &sbi->fs_cs(cg).cs_ndir, 1);
        }
-
        ubh_mark_buffer_dirty (USPI_UBH(uspi));
        ubh_mark_buffer_dirty (UCPI_UBH(ucpi));
        if (sb->s_flags & MS_SYNCHRONOUS) {
@@ -245,6 +301,7 @@ cg_found:
        }
        sb->s_dirt = 1;
 
+       inode->i_ino = cg * uspi->s_ipg + bit;
        inode->i_mode = mode;
        inode->i_uid = current->fsuid;
        if (dir->i_mode & S_ISGID) {
@@ -254,39 +311,72 @@ cg_found:
        } else
                inode->i_gid = current->fsgid;
 
-       inode->i_ino = cg * uspi->s_ipg + bit;
        inode->i_blocks = 0;
+       inode->i_generation = 0;
        inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC;
        ufsi->i_flags = UFS_I(dir)->i_flags;
        ufsi->i_lastfrag = 0;
-       ufsi->i_gen = 0;
        ufsi->i_shadow = 0;
        ufsi->i_osync = 0;
        ufsi->i_oeftflag = 0;
        ufsi->i_dir_start_lookup = 0;
        memset(&ufsi->i_u1, 0, sizeof(ufsi->i_u1));
-
        insert_inode_hash(inode);
        mark_inode_dirty(inode);
 
+       if (uspi->fs_magic == UFS2_MAGIC) {
+               struct buffer_head *bh;
+               struct ufs2_inode *ufs2_inode;
+
+               /*
+                * setup birth date, we do it here because of there is no sense
+                * to hold it in struct ufs_inode_info, and lose 64 bit
+                */
+               bh = sb_bread(sb, uspi->s_sbbase + ufs_inotofsba(inode->i_ino));
+               if (!bh) {
+                       ufs_warning(sb, "ufs_read_inode",
+                                   "unable to read inode %lu\n",
+                                   inode->i_ino);
+                       err = -EIO;
+                       goto fail_remove_inode;
+               }
+               lock_buffer(bh);
+               ufs2_inode = (struct ufs2_inode *)bh->b_data;
+               ufs2_inode += ufs_inotofsbo(inode->i_ino);
+               ufs2_inode->ui_birthtime.tv_sec =
+                       cpu_to_fs32(sb, CURRENT_TIME_SEC.tv_sec);
+               ufs2_inode->ui_birthtime.tv_usec = 0;
+               mark_buffer_dirty(bh);
+               unlock_buffer(bh);
+               if (sb->s_flags & MS_SYNCHRONOUS)
+                       sync_dirty_buffer(bh);
+               brelse(bh);
+       }
+
        unlock_super (sb);
 
        if (DQUOT_ALLOC_INODE(inode)) {
                DQUOT_DROP(inode);
-               inode->i_flags |= S_NOQUOTA;
-               inode->i_nlink = 0;
-               iput(inode);
-               return ERR_PTR(-EDQUOT);
+               err = -EDQUOT;
+               goto fail_without_unlock;
        }
 
        UFSD("allocating inode %lu\n", inode->i_ino);
        UFSD("EXIT\n");
        return inode;
 
+fail_remove_inode:
+       unlock_super(sb);
+fail_without_unlock:
+       inode->i_flags |= S_NOQUOTA;
+       inode->i_nlink = 0;
+       iput(inode);
+       UFSD("EXIT (FAILED): err %d\n", err);
+       return ERR_PTR(err);
 failed:
        unlock_super (sb);
        make_bad_inode(inode);
        iput (inode);
-       UFSD("EXIT (FAILED)\n");
-       return ERR_PTR(-ENOSPC);
+       UFSD("EXIT (FAILED): err %d\n", err);
+       return ERR_PTR(err);
 }
index 4295ca91cf8581f60711f6420f37cada76984e91..fb34ad03e22404af08871ea66267c7df1542e636 100644 (file)
@@ -170,7 +170,7 @@ out:
  * @locked_page - for ufs_new_fragments()
  */
 static struct buffer_head *
-ufs_inode_getfrag(struct inode *inode, unsigned int fragment,
+ufs_inode_getfrag(struct inode *inode, u64 fragment,
                  sector_t new_fragment, unsigned int required, int *err,
                  long *phys, int *new, struct page *locked_page)
 {
@@ -178,12 +178,12 @@ ufs_inode_getfrag(struct inode *inode, unsigned int fragment,
        struct super_block *sb = inode->i_sb;
        struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi;
        struct buffer_head * result;
-       unsigned block, blockoff, lastfrag, lastblock, lastblockoff;
-       unsigned tmp, goal;
-       __fs32 * p, * p2;
+       unsigned blockoff, lastblockoff;
+       u64 tmp, goal, lastfrag, block, lastblock;
+       void *p, *p2;
 
-       UFSD("ENTER, ino %lu, fragment %u, new_fragment %llu, required %u, "
-            "metadata %d\n", inode->i_ino, fragment,
+       UFSD("ENTER, ino %lu, fragment %llu, new_fragment %llu, required %u, "
+            "metadata %d\n", inode->i_ino, (unsigned long long)fragment,
             (unsigned long long)new_fragment, required, !phys);
 
         /* TODO : to be done for write support
@@ -193,17 +193,20 @@ ufs_inode_getfrag(struct inode *inode, unsigned int fragment,
 
        block = ufs_fragstoblks (fragment);
        blockoff = ufs_fragnum (fragment);
-       p = ufsi->i_u1.i_data + block;
+       p = ufs_get_direct_data_ptr(uspi, ufsi, block);
+
        goal = 0;
 
 repeat:
-       tmp = fs32_to_cpu(sb, *p);
+       tmp = ufs_data_ptr_to_cpu(sb, p);
+
        lastfrag = ufsi->i_lastfrag;
        if (tmp && fragment < lastfrag) {
                if (!phys) {
                        result = sb_getblk(sb, uspi->s_sbbase + tmp + blockoff);
-                       if (tmp == fs32_to_cpu(sb, *p)) {
-                               UFSD("EXIT, result %u\n", tmp + blockoff);
+                       if (tmp == ufs_data_ptr_to_cpu(sb, p)) {
+                               UFSD("EXIT, result %llu\n",
+                                    (unsigned long long)tmp + blockoff);
                                return result;
                        }
                        brelse (result);
@@ -224,10 +227,11 @@ repeat:
                 * We must reallocate last allocated block
                 */
                if (lastblockoff) {
-                       p2 = ufsi->i_u1.i_data + lastblock;
-                       tmp = ufs_new_fragments (inode, p2, lastfrag, 
-                                                fs32_to_cpu(sb, *p2), uspi->s_fpb - lastblockoff,
-                                                err, locked_page);
+                       p2 = ufs_get_direct_data_ptr(uspi, ufsi, lastblock);
+                       tmp = ufs_new_fragments(inode, p2, lastfrag,
+                                               ufs_data_ptr_to_cpu(sb, p2),
+                                               uspi->s_fpb - lastblockoff,
+                                               err, locked_page);
                        if (!tmp) {
                                if (lastfrag != ufsi->i_lastfrag)
                                        goto repeat;
@@ -237,27 +241,31 @@ repeat:
                        lastfrag = ufsi->i_lastfrag;
                        
                }
-               tmp = fs32_to_cpu(sb, ufsi->i_u1.i_data[lastblock]);
+               tmp = ufs_data_ptr_to_cpu(sb,
+                                        ufs_get_direct_data_ptr(uspi, ufsi,
+                                                                lastblock));
                if (tmp)
                        goal = tmp + uspi->s_fpb;
                tmp = ufs_new_fragments (inode, p, fragment - blockoff, 
                                         goal, required + blockoff,
                                         err,
                                         phys != NULL ? locked_page : NULL);
-       }
+       } else if (lastblock == block) {
        /*
         * We will extend last allocated block
         */
-       else if (lastblock == block) {
-               tmp = ufs_new_fragments(inode, p, fragment - (blockoff - lastblockoff),
-                                       fs32_to_cpu(sb, *p), required +  (blockoff - lastblockoff),
+               tmp = ufs_new_fragments(inode, p, fragment -
+                                       (blockoff - lastblockoff),
+                                       ufs_data_ptr_to_cpu(sb, p),
+                                       required +  (blockoff - lastblockoff),
                                        err, phys != NULL ? locked_page : NULL);
        } else /* (lastblock > block) */ {
        /*
         * We will allocate new block before last allocated block
         */
                if (block) {
-                       tmp = fs32_to_cpu(sb, ufsi->i_u1.i_data[block-1]);
+                       tmp = ufs_data_ptr_to_cpu(sb,
+                                                ufs_get_direct_data_ptr(uspi, ufsi, block - 1));
                        if (tmp)
                                goal = tmp + uspi->s_fpb;
                }
@@ -266,7 +274,7 @@ repeat:
                                        phys != NULL ? locked_page : NULL);
        }
        if (!tmp) {
-               if ((!blockoff && *p) || 
+               if ((!blockoff && ufs_data_ptr_to_cpu(sb, p)) ||
                    (blockoff && lastfrag != ufsi->i_lastfrag))
                        goto repeat;
                *err = -ENOSPC;
@@ -286,7 +294,7 @@ repeat:
        if (IS_SYNC(inode))
                ufs_sync_inode (inode);
        mark_inode_dirty(inode);
-       UFSD("EXIT, result %u\n", tmp + blockoff);
+       UFSD("EXIT, result %llu\n", (unsigned long long)tmp + blockoff);
        return result;
 
      /* This part : To be implemented ....
@@ -320,20 +328,22 @@ repeat2:
  */
 static struct buffer_head *
 ufs_inode_getblock(struct inode *inode, struct buffer_head *bh,
-                 unsigned int fragment, sector_t new_fragment, int *err,
+                 u64 fragment, sector_t new_fragment, int *err,
                  long *phys, int *new, struct page *locked_page)
 {
        struct super_block *sb = inode->i_sb;
        struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi;
        struct buffer_head * result;
-       unsigned tmp, goal, block, blockoff;
-       __fs32 * p;
+       unsigned blockoff;
+       u64 tmp, goal, block;
+       void *p;
 
        block = ufs_fragstoblks (fragment);
        blockoff = ufs_fragnum (fragment);
 
-       UFSD("ENTER, ino %lu, fragment %u, new_fragment %llu, metadata %d\n",
-            inode->i_ino, fragment, (unsigned long long)new_fragment, !phys);
+       UFSD("ENTER, ino %lu, fragment %llu, new_fragment %llu, metadata %d\n",
+            inode->i_ino, (unsigned long long)fragment,
+            (unsigned long long)new_fragment, !phys);
 
        result = NULL;
        if (!bh)
@@ -344,14 +354,16 @@ ufs_inode_getblock(struct inode *inode, struct buffer_head *bh,
                if (!buffer_uptodate(bh))
                        goto out;
        }
-
-       p = (__fs32 *) bh->b_data + block;
+       if (uspi->fs_magic == UFS2_MAGIC)
+               p = (__fs64 *)bh->b_data + block;
+       else
+               p = (__fs32 *)bh->b_data + block;
 repeat:
-       tmp = fs32_to_cpu(sb, *p);
+       tmp = ufs_data_ptr_to_cpu(sb, p);
        if (tmp) {
                if (!phys) {
                        result = sb_getblk(sb, uspi->s_sbbase + tmp + blockoff);
-                       if (tmp == fs32_to_cpu(sb, *p))
+                       if (tmp == ufs_data_ptr_to_cpu(sb, p))
                                goto out;
                        brelse (result);
                        goto repeat;
@@ -361,14 +373,16 @@ repeat:
                }
        }
 
-       if (block && (tmp = fs32_to_cpu(sb, ((__fs32*)bh->b_data)[block-1])))
+       if (block && (uspi->fs_magic == UFS2_MAGIC ?
+                     (tmp = fs64_to_cpu(sb, ((__fs64 *)bh->b_data)[block-1])) :
+                     (tmp = fs32_to_cpu(sb, ((__fs32 *)bh->b_data)[block-1]))))
                goal = tmp + uspi->s_fpb;
        else
                goal = bh->b_blocknr + uspi->s_fpb;
        tmp = ufs_new_fragments(inode, p, ufs_blknum(new_fragment), goal,
                                uspi->s_fpb, err, locked_page);
        if (!tmp) {
-               if (fs32_to_cpu(sb, *p))
+               if (ufs_data_ptr_to_cpu(sb, p))
                        goto repeat;
                goto out;
        }               
@@ -386,7 +400,7 @@ repeat:
                sync_dirty_buffer(bh);
        inode->i_ctime = CURRENT_TIME_SEC;
        mark_inode_dirty(inode);
-       UFSD("result %u\n", tmp + blockoff);
+       UFSD("result %llu\n", (unsigned long long)tmp + blockoff);
 out:
        brelse (bh);
        UFSD("EXIT\n");
@@ -616,8 +630,8 @@ static void ufs1_read_inode(struct inode *inode, struct ufs_inode *ufs_inode)
        inode->i_atime.tv_nsec = 0;
        inode->i_ctime.tv_nsec = 0;
        inode->i_blocks = fs32_to_cpu(sb, ufs_inode->ui_blocks);
+       inode->i_generation = fs32_to_cpu(sb, ufs_inode->ui_gen);
        ufsi->i_flags = fs32_to_cpu(sb, ufs_inode->ui_flags);
-       ufsi->i_gen = fs32_to_cpu(sb, ufs_inode->ui_gen);
        ufsi->i_shadow = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_shadow);
        ufsi->i_oeftflag = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_oeftflag);
 
@@ -661,8 +675,8 @@ static void ufs2_read_inode(struct inode *inode, struct ufs2_inode *ufs2_inode)
        inode->i_atime.tv_nsec = 0;
        inode->i_ctime.tv_nsec = 0;
        inode->i_blocks = fs64_to_cpu(sb, ufs2_inode->ui_blocks);
+       inode->i_generation = fs32_to_cpu(sb, ufs2_inode->ui_gen);
        ufsi->i_flags = fs32_to_cpu(sb, ufs2_inode->ui_flags);
-       ufsi->i_gen = fs32_to_cpu(sb, ufs2_inode->ui_gen);
        /*
        ufsi->i_shadow = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_shadow);
        ufsi->i_oeftflag = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_oeftflag);
@@ -731,34 +745,11 @@ bad_inode:
        make_bad_inode(inode);
 }
 
-static int ufs_update_inode(struct inode * inode, int do_sync)
+static void ufs1_update_inode(struct inode *inode, struct ufs_inode *ufs_inode)
 {
-       struct ufs_inode_info *ufsi = UFS_I(inode);
-       struct super_block * sb;
-       struct ufs_sb_private_info * uspi;
-       struct buffer_head * bh;
-       struct ufs_inode * ufs_inode;
-       unsigned i;
-       unsigned flags;
-
-       UFSD("ENTER, ino %lu\n", inode->i_ino);
-
-       sb = inode->i_sb;
-       uspi = UFS_SB(sb)->s_uspi;
-       flags = UFS_SB(sb)->s_flags;
-
-       if (inode->i_ino < UFS_ROOTINO || 
-           inode->i_ino > (uspi->s_ncg * uspi->s_ipg)) {
-               ufs_warning (sb, "ufs_read_inode", "bad inode number (%lu)\n", inode->i_ino);
-               return -1;
-       }
-
-       bh = sb_bread(sb, ufs_inotofsba(inode->i_ino));
-       if (!bh) {
-               ufs_warning (sb, "ufs_read_inode", "unable to read inode %lu\n", inode->i_ino);
-               return -1;
-       }
-       ufs_inode = (struct ufs_inode *) (bh->b_data + ufs_inotofsbo(inode->i_ino) * sizeof(struct ufs_inode));
+       struct super_block *sb = inode->i_sb;
+       struct ufs_inode_info *ufsi = UFS_I(inode);
+       unsigned i;
 
        ufs_inode->ui_mode = cpu_to_fs16(sb, inode->i_mode);
        ufs_inode->ui_nlink = cpu_to_fs16(sb, inode->i_nlink);
@@ -775,9 +766,9 @@ static int ufs_update_inode(struct inode * inode, int do_sync)
        ufs_inode->ui_mtime.tv_usec = 0;
        ufs_inode->ui_blocks = cpu_to_fs32(sb, inode->i_blocks);
        ufs_inode->ui_flags = cpu_to_fs32(sb, ufsi->i_flags);
-       ufs_inode->ui_gen = cpu_to_fs32(sb, ufsi->i_gen);
+       ufs_inode->ui_gen = cpu_to_fs32(sb, inode->i_generation);
 
-       if ((flags & UFS_UID_MASK) == UFS_UID_EFT) {
+       if ((UFS_SB(sb)->s_flags & UFS_UID_MASK) == UFS_UID_EFT) {
                ufs_inode->ui_u3.ui_sun.ui_shadow = cpu_to_fs32(sb, ufsi->i_shadow);
                ufs_inode->ui_u3.ui_sun.ui_oeftflag = cpu_to_fs32(sb, ufsi->i_oeftflag);
        }
@@ -796,6 +787,78 @@ static int ufs_update_inode(struct inode * inode, int do_sync)
 
        if (!inode->i_nlink)
                memset (ufs_inode, 0, sizeof(struct ufs_inode));
+}
+
+static void ufs2_update_inode(struct inode *inode, struct ufs2_inode *ufs_inode)
+{
+       struct super_block *sb = inode->i_sb;
+       struct ufs_inode_info *ufsi = UFS_I(inode);
+       unsigned i;
+
+       UFSD("ENTER\n");
+       ufs_inode->ui_mode = cpu_to_fs16(sb, inode->i_mode);
+       ufs_inode->ui_nlink = cpu_to_fs16(sb, inode->i_nlink);
+
+       ufs_inode->ui_uid = cpu_to_fs32(sb, inode->i_uid);
+       ufs_inode->ui_gid = cpu_to_fs32(sb, inode->i_gid);
+
+       ufs_inode->ui_size = cpu_to_fs64(sb, inode->i_size);
+       ufs_inode->ui_atime.tv_sec = cpu_to_fs32(sb, inode->i_atime.tv_sec);
+       ufs_inode->ui_atime.tv_usec = 0;
+       ufs_inode->ui_ctime.tv_sec = cpu_to_fs32(sb, inode->i_ctime.tv_sec);
+       ufs_inode->ui_ctime.tv_usec = 0;
+       ufs_inode->ui_mtime.tv_sec = cpu_to_fs32(sb, inode->i_mtime.tv_sec);
+       ufs_inode->ui_mtime.tv_usec = 0;
+
+       ufs_inode->ui_blocks = cpu_to_fs64(sb, inode->i_blocks);
+       ufs_inode->ui_flags = cpu_to_fs32(sb, ufsi->i_flags);
+       ufs_inode->ui_gen = cpu_to_fs32(sb, inode->i_generation);
+
+       if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
+               /* ufs_inode->ui_u2.ui_addr.ui_db[0] = cpu_to_fs32(sb, inode->i_rdev); */
+               ufs_inode->ui_u2.ui_addr.ui_db[0] = ufsi->i_u1.u2_i_data[0];
+       } else if (inode->i_blocks) {
+               for (i = 0; i < (UFS_NDADDR + UFS_NINDIR); i++)
+                       ufs_inode->ui_u2.ui_addr.ui_db[i] = ufsi->i_u1.u2_i_data[i];
+       } else {
+               for (i = 0; i < (UFS_NDADDR + UFS_NINDIR) * 4; i++)
+                       ufs_inode->ui_u2.ui_symlink[i] = ufsi->i_u1.i_symlink[i];
+       }
+
+       if (!inode->i_nlink)
+               memset (ufs_inode, 0, sizeof(struct ufs2_inode));
+       UFSD("EXIT\n");
+}
+
+static int ufs_update_inode(struct inode * inode, int do_sync)
+{
+       struct super_block *sb = inode->i_sb;
+       struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi;
+       struct buffer_head * bh;
+
+       UFSD("ENTER, ino %lu\n", inode->i_ino);
+
+       if (inode->i_ino < UFS_ROOTINO ||
+           inode->i_ino > (uspi->s_ncg * uspi->s_ipg)) {
+               ufs_warning (sb, "ufs_read_inode", "bad inode number (%lu)\n", inode->i_ino);
+               return -1;
+       }
+
+       bh = sb_bread(sb, ufs_inotofsba(inode->i_ino));
+       if (!bh) {
+               ufs_warning (sb, "ufs_read_inode", "unable to read inode %lu\n", inode->i_ino);
+               return -1;
+       }
+       if (uspi->fs_magic == UFS2_MAGIC) {
+               struct ufs2_inode *ufs2_inode = (struct ufs2_inode *)bh->b_data;
+
+               ufs2_update_inode(inode,
+                                 ufs2_inode + ufs_inotofsbo(inode->i_ino));
+       } else {
+               struct ufs_inode *ufs_inode = (struct ufs_inode *) bh->b_data;
+
+               ufs1_update_inode(inode, ufs_inode + ufs_inotofsbo(inode->i_ino));
+       }
                
        mark_buffer_dirty(bh);
        if (do_sync)
index e84c0ecf07304f0f8222e3c438f4e1b8bb5bed34..a059ccd064eaa317f257ac1ac73ec3a28ba9867e 100644 (file)
@@ -355,7 +355,7 @@ out:
        return err;
 }
 
-struct inode_operations ufs_dir_inode_operations = {
+const struct inode_operations ufs_dir_inode_operations = {
        .create         = ufs_create,
        .lookup         = ufs_lookup,
        .link           = ufs_link,
index 209be95e9d188385d2fc6cf25b1c18e61fb8b87a..b5a6461ec66b3fbc52dcb708cb5f7cbbeccfd0bd 100644 (file)
@@ -61,6 +61,8 @@
  * UFS2 (of FreeBSD 5.x) support added by
  * Niraj Kumar <niraj17@iitbombay.org>, Jan 2004
  *
+ * UFS2 write support added by
+ * Evgeniy Dushistov <dushistov@mail.ru>, 2007
  */
 
 
 /*
  * Print contents of ufs_super_block, useful for debugging
  */
-static void ufs_print_super_stuff(struct super_block *sb, unsigned flags,
+static void ufs_print_super_stuff(struct super_block *sb,
                                  struct ufs_super_block_first *usb1,
                                  struct ufs_super_block_second *usb2,
                                  struct ufs_super_block_third *usb3)
 {
+       u32 magic = fs32_to_cpu(sb, usb3->fs_magic);
+
        printk("ufs_print_super_stuff\n");
-       printk("  magic:     0x%x\n", fs32_to_cpu(sb, usb3->fs_magic));
-       if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) {
+       printk("  magic:     0x%x\n", magic);
+       if (fs32_to_cpu(sb, usb3->fs_magic) == UFS2_MAGIC) {
                printk("  fs_size:   %llu\n", (unsigned long long)
                       fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_size));
                printk("  fs_dsize:  %llu\n", (unsigned long long)
@@ -117,6 +121,12 @@ static void ufs_print_super_stuff(struct super_block *sb, unsigned flags,
                printk("  cs_nbfree(No of free blocks):  %llu\n",
                       (unsigned long long)
                       fs64_to_cpu(sb, usb2->fs_un.fs_u2.cs_nbfree));
+               printk(KERN_INFO"  cs_nifree(Num of free inodes): %llu\n",
+                      (unsigned long long)
+                      fs64_to_cpu(sb, usb3->fs_un1.fs_u2.cs_nifree));
+               printk(KERN_INFO"  cs_nffree(Num of free frags): %llu\n",
+                      (unsigned long long)
+                      fs64_to_cpu(sb, usb3->fs_un1.fs_u2.cs_nffree));
        } else {
                printk(" sblkno:      %u\n", fs32_to_cpu(sb, usb1->fs_sblkno));
                printk(" cblkno:      %u\n", fs32_to_cpu(sb, usb1->fs_cblkno));
@@ -199,11 +209,11 @@ static void ufs_print_cylinder_stuff(struct super_block *sb,
        printk("\n");
 }
 #else
-#  define ufs_print_super_stuff(sb, flags, usb1, usb2, usb3) /**/
+#  define ufs_print_super_stuff(sb, usb1, usb2, usb3) /**/
 #  define ufs_print_cylinder_stuff(sb, cg) /**/
 #endif /* CONFIG_UFS_DEBUG */
 
-static struct super_operations ufs_super_ops;
+static const struct super_operations ufs_super_ops;
 
 static char error_buf[1024];
 
@@ -422,7 +432,6 @@ static int ufs_read_cylinder_structures(struct super_block *sb)
 {
        struct ufs_sb_info *sbi = UFS_SB(sb);
        struct ufs_sb_private_info *uspi = sbi->s_uspi;
-       unsigned flags = sbi->s_flags;
        struct ufs_buffer_head * ubh;
        unsigned char * base, * space;
        unsigned size, blks, i;
@@ -446,11 +455,7 @@ static int ufs_read_cylinder_structures(struct super_block *sb)
                if (i + uspi->s_fpb > blks)
                        size = (blks - i) * uspi->s_fsize;
 
-               if ((flags & UFS_TYPE_MASK) == UFS_TYPE_UFS2) 
-                       ubh = ubh_bread(sb,
-                               fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_csaddr) + i, size);
-               else 
-                       ubh = ubh_bread(sb, uspi->s_csaddr + i, size);
+               ubh = ubh_bread(sb, uspi->s_csaddr + i, size);
                
                if (!ubh)
                        goto failed;
@@ -545,6 +550,7 @@ static void ufs_put_cstotal(struct super_block *sb)
                        cpu_to_fs32(sb, uspi->cs_total.cs_nffree);
        }
        ubh_mark_buffer_dirty(USPI_UBH(uspi));
+       ufs_print_super_stuff(sb, usb1, usb2, usb3);
        UFSD("EXIT\n");
 }
 
@@ -572,7 +578,9 @@ static void ufs_put_super_internal(struct super_block *sb)
                size = uspi->s_bsize;
                if (i + uspi->s_fpb > blks)
                        size = (blks - i) * uspi->s_fsize;
+
                ubh = ubh_bread(sb, uspi->s_csaddr + i, size);
+
                ubh_memcpyubh (ubh, space, size);
                space += size;
                ubh_mark_buffer_uptodate (ubh, 1);
@@ -674,10 +682,6 @@ static int ufs_fill_super(struct super_block *sb, void *data, int silent)
                uspi->s_sbsize = super_block_size = 1536;
                uspi->s_sbbase =  0;
                flags |= UFS_TYPE_UFS2 | UFS_DE_44BSD | UFS_UID_44BSD | UFS_ST_44BSD | UFS_CG_44BSD;
-               if (!(sb->s_flags & MS_RDONLY)) {
-                       printk(KERN_INFO "ufstype=ufs2 is supported read-only\n");
-                       sb->s_flags |= MS_RDONLY;
-               }
                break;
                
        case UFS_MOUNT_UFSTYPE_SUN:
@@ -890,7 +894,7 @@ magic_found:
        }
 
 
-       ufs_print_super_stuff(sb, flags, usb1, usb2, usb3);
+       ufs_print_super_stuff(sb, usb1, usb2, usb3);
 
        /*
         * Check, if file system was correctly unmounted.
@@ -973,7 +977,12 @@ magic_found:
        uspi->s_npsect = ufs_get_fs_npsect(sb, usb1, usb3);
        uspi->s_interleave = fs32_to_cpu(sb, usb1->fs_interleave);
        uspi->s_trackskew = fs32_to_cpu(sb, usb1->fs_trackskew);
-       uspi->s_csaddr = fs32_to_cpu(sb, usb1->fs_csaddr);
+
+       if (uspi->fs_magic == UFS2_MAGIC)
+               uspi->s_csaddr = fs64_to_cpu(sb, usb3->fs_un1.fs_u2.fs_csaddr);
+       else
+               uspi->s_csaddr = fs32_to_cpu(sb, usb1->fs_csaddr);
+
        uspi->s_cssize = fs32_to_cpu(sb, usb1->fs_cssize);
        uspi->s_cgsize = fs32_to_cpu(sb, usb1->fs_cgsize);
        uspi->s_ntrak = fs32_to_cpu(sb, usb1->fs_ntrak);
@@ -1060,7 +1069,6 @@ static void ufs_write_super(struct super_block *sb)
        unsigned flags;
 
        lock_kernel();
-
        UFSD("ENTER\n");
        flags = UFS_SB(sb)->s_flags;
        uspi = UFS_SB(sb)->s_uspi;
@@ -1156,7 +1164,8 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
 #else
                if (ufstype != UFS_MOUNT_UFSTYPE_SUN && 
                    ufstype != UFS_MOUNT_UFSTYPE_44BSD &&
-                   ufstype != UFS_MOUNT_UFSTYPE_SUNx86) {
+                   ufstype != UFS_MOUNT_UFSTYPE_SUNx86 &&
+                   ufstype != UFS_MOUNT_UFSTYPE_UFS2) {
                        printk("this ufstype is read-only supported\n");
                        return -EINVAL;
                }
@@ -1255,7 +1264,7 @@ static ssize_t ufs_quota_read(struct super_block *, int, char *,size_t, loff_t);
 static ssize_t ufs_quota_write(struct super_block *, int, const char *, size_t, loff_t);
 #endif
 
-static struct super_operations ufs_super_ops = {
+static const struct super_operations ufs_super_ops = {
        .alloc_inode    = ufs_alloc_inode,
        .destroy_inode  = ufs_destroy_inode,
        .read_inode     = ufs_read_inode,
index 337512ed57814ac1949c440ef89c2e1389ad2cfc..d8549f807e8003ef06abc6c79a34799829b7d204 100644 (file)
@@ -36,7 +36,7 @@ static void *ufs_follow_link(struct dentry *dentry, struct nameidata *nd)
        return NULL;
 }
 
-struct inode_operations ufs_fast_symlink_inode_operations = {
+const struct inode_operations ufs_fast_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .follow_link    = ufs_follow_link,
 };
index 0437b0a6fe97f5ea9c5096f1a43ed4f554c4b475..749581fa7729fe2e20add00e0ae587bc33267edb 100644 (file)
@@ -30,8 +30,8 @@
  */
 
 /*
- * Modified to avoid infinite loop on 2006 by
- * Evgeniy Dushistov <dushistov@mail.ru>
+ * Adoptation to use page cache and UFS2 write support by
+ * Evgeniy Dushistov <dushistov@mail.ru>, 2006-2007
  */
 
 #include <linux/errno.h>
 #define DIRECT_FRAGMENT ((inode->i_size + uspi->s_fsize - 1) >> uspi->s_fshift)
 
 
-static int ufs_trunc_direct (struct inode * inode)
+static int ufs_trunc_direct(struct inode *inode)
 {
        struct ufs_inode_info *ufsi = UFS_I(inode);
        struct super_block * sb;
        struct ufs_sb_private_info * uspi;
-       __fs32 * p;
-       unsigned frag1, frag2, frag3, frag4, block1, block2;
+       void *p;
+       u64 frag1, frag2, frag3, frag4, block1, block2;
        unsigned frag_to_free, free_count;
        unsigned i, tmp;
        int retry;
@@ -91,13 +91,16 @@ static int ufs_trunc_direct (struct inode * inode)
        if (frag2 > frag3) {
                frag2 = frag4;
                frag3 = frag4 = 0;
-       }
-       else if (frag2 < frag3) {
+       } else if (frag2 < frag3) {
                block1 = ufs_fragstoblks (frag2);
                block2 = ufs_fragstoblks (frag3);
        }
 
-       UFSD("frag1 %u, frag2 %u, block1 %u, block2 %u, frag3 %u, frag4 %u\n", frag1, frag2, block1, block2, frag3, frag4);
+       UFSD("frag1 %llu, frag2 %llu, block1 %llu, block2 %llu, frag3 %llu,"
+            " frag4 %llu\n",
+            (unsigned long long)frag1, (unsigned long long)frag2,
+            (unsigned long long)block1, (unsigned long long)block2,
+            (unsigned long long)frag3, (unsigned long long)frag4);
 
        if (frag1 >= frag2)
                goto next1;             
@@ -105,8 +108,8 @@ static int ufs_trunc_direct (struct inode * inode)
        /*
         * Free first free fragments
         */
-       p = ufsi->i_u1.i_data + ufs_fragstoblks (frag1);
-       tmp = fs32_to_cpu(sb, *p);
+       p = ufs_get_direct_data_ptr(uspi, ufsi, ufs_fragstoblks(frag1));
+       tmp = ufs_data_ptr_to_cpu(sb, p);
        if (!tmp )
                ufs_panic (sb, "ufs_trunc_direct", "internal error");
        frag2 -= frag1;
@@ -121,12 +124,11 @@ next1:
         * Free whole blocks
         */
        for (i = block1 ; i < block2; i++) {
-               p = ufsi->i_u1.i_data + i;
-               tmp = fs32_to_cpu(sb, *p);
+               p = ufs_get_direct_data_ptr(uspi, ufsi, i);
+               tmp = ufs_data_ptr_to_cpu(sb, p);
                if (!tmp)
                        continue;
-
-               *p = 0;
+               ufs_data_ptr_clear(uspi, p);
 
                if (free_count == 0) {
                        frag_to_free = tmp;
@@ -150,13 +152,12 @@ next1:
        /*
         * Free last free fragments
         */
-       p = ufsi->i_u1.i_data + ufs_fragstoblks (frag3);
-       tmp = fs32_to_cpu(sb, *p);
+       p = ufs_get_direct_data_ptr(uspi, ufsi, ufs_fragstoblks(frag3));
+       tmp = ufs_data_ptr_to_cpu(sb, p);
        if (!tmp )
                ufs_panic(sb, "ufs_truncate_direct", "internal error");
        frag4 = ufs_fragnum (frag4);
-
-       *p = 0;
+       ufs_data_ptr_clear(uspi, p);
 
        ufs_free_fragments (inode, tmp, frag4);
        mark_inode_dirty(inode);
@@ -167,17 +168,20 @@ next1:
 }
 
 
-static int ufs_trunc_indirect (struct inode * inode, unsigned offset, __fs32 *p)
+static int ufs_trunc_indirect(struct inode *inode, u64 offset, void *p)
 {
        struct super_block * sb;
        struct ufs_sb_private_info * uspi;
        struct ufs_buffer_head * ind_ubh;
-       __fs32 * ind;
-       unsigned indirect_block, i, tmp;
-       unsigned frag_to_free, free_count;
+       void *ind;
+       u64 tmp, indirect_block, i, frag_to_free;
+       unsigned free_count;
        int retry;
 
-       UFSD("ENTER\n");
+       UFSD("ENTER: ino %lu, offset %llu, p: %p\n",
+            inode->i_ino, (unsigned long long)offset, p);
+
+       BUG_ON(!p);
                
        sb = inode->i_sb;
        uspi = UFS_SB(sb)->s_uspi;
@@ -186,27 +190,27 @@ static int ufs_trunc_indirect (struct inode * inode, unsigned offset, __fs32 *p)
        free_count = 0;
        retry = 0;
        
-       tmp = fs32_to_cpu(sb, *p);
+       tmp = ufs_data_ptr_to_cpu(sb, p);
        if (!tmp)
                return 0;
        ind_ubh = ubh_bread(sb, tmp, uspi->s_bsize);
-       if (tmp != fs32_to_cpu(sb, *p)) {
+       if (tmp != ufs_data_ptr_to_cpu(sb, p)) {
                ubh_brelse (ind_ubh);
                return 1;
        }
        if (!ind_ubh) {
-               *p = 0;
+               ufs_data_ptr_clear(uspi, p);
                return 0;
        }
 
        indirect_block = (DIRECT_BLOCK > offset) ? (DIRECT_BLOCK - offset) : 0;
        for (i = indirect_block; i < uspi->s_apb; i++) {
-               ind = ubh_get_addr32 (ind_ubh, i);
-               tmp = fs32_to_cpu(sb, *ind);
+               ind = ubh_get_data_ptr(uspi, ind_ubh, i);
+               tmp = ufs_data_ptr_to_cpu(sb, ind);
                if (!tmp)
                        continue;
 
-               *ind = 0;
+               ufs_data_ptr_clear(uspi, ind);
                ubh_mark_buffer_dirty(ind_ubh);
                if (free_count == 0) {
                        frag_to_free = tmp;
@@ -226,11 +230,12 @@ static int ufs_trunc_indirect (struct inode * inode, unsigned offset, __fs32 *p)
                ufs_free_blocks (inode, frag_to_free, free_count);
        }
        for (i = 0; i < uspi->s_apb; i++)
-               if (*ubh_get_addr32(ind_ubh,i))
+               if (!ufs_is_data_ptr_zero(uspi,
+                                         ubh_get_data_ptr(uspi, ind_ubh, i)))
                        break;
        if (i >= uspi->s_apb) {
-               tmp = fs32_to_cpu(sb, *p);
-               *p = 0;
+               tmp = ufs_data_ptr_to_cpu(sb, p);
+               ufs_data_ptr_clear(uspi, p);
 
                ufs_free_blocks (inode, tmp, uspi->s_fpb);
                mark_inode_dirty(inode);
@@ -248,13 +253,13 @@ static int ufs_trunc_indirect (struct inode * inode, unsigned offset, __fs32 *p)
        return retry;
 }
 
-static int ufs_trunc_dindirect (struct inode *inode, unsigned offset, __fs32 *p)
+static int ufs_trunc_dindirect(struct inode *inode, u64 offset, void *p)
 {
        struct super_block * sb;
        struct ufs_sb_private_info * uspi;
-       struct ufs_buffer_head * dind_bh;
-       unsigned i, tmp, dindirect_block;
-       __fs32 * dind;
+       struct ufs_buffer_head *dind_bh;
+       u64 i, tmp, dindirect_block;
+       void *dind;
        int retry = 0;
        
        UFSD("ENTER\n");
@@ -266,22 +271,22 @@ static int ufs_trunc_dindirect (struct inode *inode, unsigned offset, __fs32 *p)
                ? ((DIRECT_BLOCK - offset) >> uspi->s_apbshift) : 0;
        retry = 0;
        
-       tmp = fs32_to_cpu(sb, *p);
+       tmp = ufs_data_ptr_to_cpu(sb, p);
        if (!tmp)
                return 0;
        dind_bh = ubh_bread(sb, tmp, uspi->s_bsize);
-       if (tmp != fs32_to_cpu(sb, *p)) {
+       if (tmp != ufs_data_ptr_to_cpu(sb, p)) {
                ubh_brelse (dind_bh);
                return 1;
        }
        if (!dind_bh) {
-               *p = 0;
+               ufs_data_ptr_clear(uspi, p);
                return 0;
        }
 
        for (i = dindirect_block ; i < uspi->s_apb ; i++) {
-               dind = ubh_get_addr32 (dind_bh, i);
-               tmp = fs32_to_cpu(sb, *dind);
+               dind = ubh_get_data_ptr(uspi, dind_bh, i);
+               tmp = ufs_data_ptr_to_cpu(sb, dind);
                if (!tmp)
                        continue;
                retry |= ufs_trunc_indirect (inode, offset + (i << uspi->s_apbshift), dind);
@@ -289,11 +294,12 @@ static int ufs_trunc_dindirect (struct inode *inode, unsigned offset, __fs32 *p)
        }
 
        for (i = 0; i < uspi->s_apb; i++)
-               if (*ubh_get_addr32 (dind_bh, i))
+               if (!ufs_is_data_ptr_zero(uspi,
+                                         ubh_get_data_ptr(uspi, dind_bh, i)))
                        break;
        if (i >= uspi->s_apb) {
-               tmp = fs32_to_cpu(sb, *p);
-               *p = 0;
+               tmp = ufs_data_ptr_to_cpu(sb, p);
+               ufs_data_ptr_clear(uspi, p);
 
                ufs_free_blocks(inode, tmp, uspi->s_fpb);
                mark_inode_dirty(inode);
@@ -311,34 +317,33 @@ static int ufs_trunc_dindirect (struct inode *inode, unsigned offset, __fs32 *p)
        return retry;
 }
 
-static int ufs_trunc_tindirect (struct inode * inode)
+static int ufs_trunc_tindirect(struct inode *inode)
 {
+       struct super_block *sb = inode->i_sb;
+       struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi;
        struct ufs_inode_info *ufsi = UFS_I(inode);
-       struct super_block * sb;
-       struct ufs_sb_private_info * uspi;
        struct ufs_buffer_head * tind_bh;
-       unsigned tindirect_block, tmp, i;
-       __fs32 * tind, * p;
+       u64 tindirect_block, tmp, i;
+       void *tind, *p;
        int retry;
        
        UFSD("ENTER\n");
 
-       sb = inode->i_sb;
-       uspi = UFS_SB(sb)->s_uspi;
        retry = 0;
        
        tindirect_block = (DIRECT_BLOCK > (UFS_NDADDR + uspi->s_apb + uspi->s_2apb))
                ? ((DIRECT_BLOCK - UFS_NDADDR - uspi->s_apb - uspi->s_2apb) >> uspi->s_2apbshift) : 0;
-       p = ufsi->i_u1.i_data + UFS_TIND_BLOCK;
-       if (!(tmp = fs32_to_cpu(sb, *p)))
+
+       p = ufs_get_direct_data_ptr(uspi, ufsi, UFS_TIND_BLOCK);
+       if (!(tmp = ufs_data_ptr_to_cpu(sb, p)))
                return 0;
        tind_bh = ubh_bread (sb, tmp, uspi->s_bsize);
-       if (tmp != fs32_to_cpu(sb, *p)) {
+       if (tmp != ufs_data_ptr_to_cpu(sb, p)) {
                ubh_brelse (tind_bh);
                return 1;
        }
        if (!tind_bh) {
-               *p = 0;
+               ufs_data_ptr_clear(uspi, p);
                return 0;
        }
 
@@ -349,11 +354,12 @@ static int ufs_trunc_tindirect (struct inode * inode)
                ubh_mark_buffer_dirty(tind_bh);
        }
        for (i = 0; i < uspi->s_apb; i++)
-               if (*ubh_get_addr32 (tind_bh, i))
+               if (!ufs_is_data_ptr_zero(uspi,
+                                         ubh_get_data_ptr(uspi, tind_bh, i)))
                        break;
        if (i >= uspi->s_apb) {
-               tmp = fs32_to_cpu(sb, *p);
-               *p = 0;
+               tmp = ufs_data_ptr_to_cpu(sb, p);
+               ufs_data_ptr_clear(uspi, p);
 
                ufs_free_blocks(inode, tmp, uspi->s_fpb);
                mark_inode_dirty(inode);
@@ -375,7 +381,8 @@ static int ufs_alloc_lastblock(struct inode *inode)
        int err = 0;
        struct address_space *mapping = inode->i_mapping;
        struct ufs_sb_private_info *uspi = UFS_SB(inode->i_sb)->s_uspi;
-       unsigned lastfrag, i, end;
+       unsigned i, end;
+       sector_t lastfrag;
        struct page *lastpage;
        struct buffer_head *bh;
 
@@ -430,7 +437,9 @@ int ufs_truncate(struct inode *inode, loff_t old_i_size)
        struct ufs_sb_private_info *uspi = UFS_SB(sb)->s_uspi;
        int retry, err = 0;
        
-       UFSD("ENTER\n");
+       UFSD("ENTER: ino %lu, i_size: %llu, old_i_size: %llu\n",
+            inode->i_ino, (unsigned long long)i_size_read(inode),
+            (unsigned long long)old_i_size);
 
        if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
              S_ISLNK(inode->i_mode)))
@@ -450,10 +459,12 @@ int ufs_truncate(struct inode *inode, loff_t old_i_size)
        lock_kernel();
        while (1) {
                retry = ufs_trunc_direct(inode);
-               retry |= ufs_trunc_indirect (inode, UFS_IND_BLOCK,
-                       (__fs32 *) &ufsi->i_u1.i_data[UFS_IND_BLOCK]);
-               retry |= ufs_trunc_dindirect (inode, UFS_IND_BLOCK + uspi->s_apb,
-                       (__fs32 *) &ufsi->i_u1.i_data[UFS_DIND_BLOCK]);
+               retry |= ufs_trunc_indirect(inode, UFS_IND_BLOCK,
+                                           ufs_get_direct_data_ptr(uspi, ufsi,
+                                                                   UFS_IND_BLOCK));
+               retry |= ufs_trunc_dindirect(inode, UFS_IND_BLOCK + uspi->s_apb,
+                                            ufs_get_direct_data_ptr(uspi, ufsi,
+                                                                    UFS_DIND_BLOCK));
                retry |= ufs_trunc_tindirect (inode);
                if (!retry)
                        break;
@@ -502,6 +513,6 @@ static int ufs_setattr(struct dentry *dentry, struct iattr *attr)
        return inode_setattr(inode, attr);
 }
 
-struct inode_operations ufs_file_inode_operations = {
+const struct inode_operations ufs_file_inode_operations = {
        .setattr = ufs_setattr,
 };
index 7dd12bb1d62bdf9a9f2223e0d5840097831d4960..06d344839c42477f85141a9b6a6a3d95c4a33ca7 100644 (file)
@@ -305,8 +305,22 @@ static inline void *get_usb_offset(struct ufs_sb_private_info *uspi,
        (((__fs32*)((ubh)->bh[(begin) >> (uspi->s_fshift-2)]->b_data)) + \
        ((begin) & ((uspi->s_fsize>>2) - 1)))
 
+#define ubh_get_addr64(ubh,begin) \
+       (((__fs64*)((ubh)->bh[(begin) >> (uspi->s_fshift-3)]->b_data)) + \
+       ((begin) & ((uspi->s_fsize>>3) - 1)))
+
 #define ubh_get_addr ubh_get_addr8
 
+static inline void *ubh_get_data_ptr(struct ufs_sb_private_info *uspi,
+                                    struct ufs_buffer_head *ubh,
+                                    u64 blk)
+{
+       if (uspi->fs_magic == UFS2_MAGIC)
+               return ubh_get_addr64(ubh, blk);
+       else
+               return ubh_get_addr32(ubh, blk);
+}
+
 #define ubh_blkmap(ubh,begin,bit) \
        ((*ubh_get_addr(ubh, (begin) + ((bit) >> 3)) >> ((bit) & 7)) & (0xff >> (UFS_MAXFRAG - uspi->s_fpb)))
 
@@ -507,3 +521,46 @@ static inline void ufs_fragacct (struct super_block * sb, unsigned blockmap,
        if (fragsize > 0 && fragsize < uspi->s_fpb)
                fs32_add(sb, &fraglist[fragsize], cnt);
 }
+
+static inline void *ufs_get_direct_data_ptr(struct ufs_sb_private_info *uspi,
+                                           struct ufs_inode_info *ufsi,
+                                           unsigned blk)
+{
+       BUG_ON(blk > UFS_TIND_BLOCK);
+       return uspi->fs_magic == UFS2_MAGIC ?
+               (void *)&ufsi->i_u1.u2_i_data[blk] :
+               (void *)&ufsi->i_u1.i_data[blk];
+}
+
+static inline u64 ufs_data_ptr_to_cpu(struct super_block *sb, void *p)
+{
+       return UFS_SB(sb)->s_uspi->fs_magic == UFS2_MAGIC ?
+               fs64_to_cpu(sb, *(__fs64 *)p) :
+               fs32_to_cpu(sb, *(__fs32 *)p);
+}
+
+static inline void ufs_cpu_to_data_ptr(struct super_block *sb, void *p, u64 val)
+{
+       if (UFS_SB(sb)->s_uspi->fs_magic == UFS2_MAGIC)
+               *(__fs64 *)p = cpu_to_fs64(sb, val);
+       else
+               *(__fs32 *)p = cpu_to_fs32(sb, val);
+}
+
+static inline void ufs_data_ptr_clear(struct ufs_sb_private_info *uspi,
+                                     void *p)
+{
+       if (uspi->fs_magic == UFS2_MAGIC)
+               *(__fs64 *)p = 0;
+       else
+               *(__fs32 *)p = 0;
+}
+
+static inline int ufs_is_data_ptr_zero(struct ufs_sb_private_info *uspi,
+                                      void *p)
+{
+       if (uspi->fs_magic == UFS2_MAGIC)
+               return *(__fs64 *)p == 0;
+       else
+               return *(__fs32 *)p == 0;
+}
index 0afd745a37cd7aeacef9c64d8470af619c77189a..c28add2fbe95eebce0ec79de64e8389be793ea26 100644 (file)
@@ -996,7 +996,7 @@ error_inode:
        goto out;
 }
 
-static struct inode_operations vfat_dir_inode_operations = {
+static const struct inode_operations vfat_dir_inode_operations = {
        .create         = vfat_create,
        .lookup         = vfat_lookup,
        .unlink         = vfat_unlink,
index 789a2559bd54a6da7a8166a60e27489e53d29938..c6ad7c7e3ee9eaa58c4a7994c316f4f4a24fd45a 100644 (file)
@@ -6,7 +6,6 @@
  */
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/fs.h>
 #include <linux/posix_acl_xattr.h>
index 004baf6006110ae7cd8beee0f1e7f90f618c5550..ed2b16dff91434f2bd0b90d35dec3921c447cb27 100644 (file)
@@ -15,7 +15,6 @@
  * along with this program; if not, write the Free Software Foundation,
  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/vmalloc.h>
 #include <linux/highmem.h>
index 32e1ce0f04c94b0d7b130c2fc94360f667cb1e89..af168a1a98c1bf5ad6a56e1f2f513bca584f632d 100644 (file)
@@ -31,15 +31,13 @@ typedef struct {
        do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0)
 #define mrlock_init(mrp, t,n,s)        mrinit(mrp, n)
 #define mrfree(mrp)            do { } while (0)
-#define mraccess(mrp)          mraccessf(mrp, 0)
-#define mrupdate(mrp)          mrupdatef(mrp, 0)
 
-static inline void mraccessf(mrlock_t *mrp, int flags)
+static inline void mraccess(mrlock_t *mrp)
 {
        down_read(&mrp->mr_lock);
 }
 
-static inline void mrupdatef(mrlock_t *mrp, int flags)
+static inline void mrupdate(mrlock_t *mrp)
 {
        down_write(&mrp->mr_lock);
        mrp->mr_writer = 1;
index 7b54461695e2de979924c14cfe79a1c56d2587ef..143ffc851c9d21376b1c928394544d59443b87e9 100644 (file)
@@ -56,8 +56,6 @@ xfs_count_page_state(
        do {
                if (buffer_uptodate(bh) && !buffer_mapped(bh))
                        (*unmapped) = 1;
-               else if (buffer_unwritten(bh) && !buffer_delay(bh))
-                       clear_buffer_unwritten(bh);
                else if (buffer_unwritten(bh))
                        (*unwritten) = 1;
                else if (buffer_delay(bh))
@@ -249,7 +247,7 @@ xfs_map_blocks(
        return -error;
 }
 
-STATIC inline int
+STATIC_INLINE int
 xfs_iomap_valid(
        xfs_iomap_t             *iomapp,
        loff_t                  offset)
@@ -1272,7 +1270,6 @@ __xfs_get_blocks(
                        if (direct)
                                bh_result->b_private = inode;
                        set_buffer_unwritten(bh_result);
-                       set_buffer_delay(bh_result);
                }
        }
 
@@ -1283,13 +1280,18 @@ __xfs_get_blocks(
        bh_result->b_bdev = iomap.iomap_target->bt_bdev;
 
        /*
-        * If we previously allocated a block out beyond eof and we are
-        * now coming back to use it then we will need to flag it as new
-        * even if it has a disk address.
+        * If we previously allocated a block out beyond eof and we are now
+        * coming back to use it then we will need to flag it as new even if it
+        * has a disk address.
+        *
+        * With sub-block writes into unwritten extents we also need to mark
+        * the buffer as new so that the unwritten parts of the buffer gets
+        * correctly zeroed.
         */
        if (create &&
            ((!buffer_mapped(bh_result) && !buffer_uptodate(bh_result)) ||
-            (offset >= i_size_read(inode)) || (iomap.iomap_flags & IOMAP_NEW)))
+            (offset >= i_size_read(inode)) ||
+            (iomap.iomap_flags & (IOMAP_NEW|IOMAP_UNWRITTEN))))
                set_buffer_new(bh_result);
 
        if (iomap.iomap_flags & IOMAP_DELAY) {
index 4fb01ffdfd1a06163263186b967a2e04f7f90743..e2bea6a661f07462f92d82d71a54cfd459a0ce45 100644 (file)
 #include <linux/backing-dev.h>
 #include <linux/freezer.h>
 
-STATIC kmem_zone_t *xfs_buf_zone;
-STATIC kmem_shaker_t xfs_buf_shake;
+static kmem_zone_t *xfs_buf_zone;
+static kmem_shaker_t xfs_buf_shake;
 STATIC int xfsbufd(void *);
 STATIC int xfsbufd_wakeup(int, gfp_t);
 STATIC void xfs_buf_delwri_queue(xfs_buf_t *, int);
 
-STATIC struct workqueue_struct *xfslogd_workqueue;
+static struct workqueue_struct *xfslogd_workqueue;
 struct workqueue_struct *xfsdatad_workqueue;
 
 #ifdef XFS_BUF_TRACE
@@ -139,7 +139,7 @@ page_region_mask(
        return mask;
 }
 
-STATIC inline void
+STATIC_INLINE void
 set_page_region(
        struct page     *page,
        size_t          offset,
@@ -151,7 +151,7 @@ set_page_region(
                SetPageUptodate(page);
 }
 
-STATIC inline int
+STATIC_INLINE int
 test_page_region(
        struct page     *page,
        size_t          offset,
@@ -171,9 +171,9 @@ typedef struct a_list {
        struct a_list   *next;
 } a_list_t;
 
-STATIC a_list_t                *as_free_head;
-STATIC int             as_list_len;
-STATIC DEFINE_SPINLOCK(as_lock);
+static a_list_t                *as_free_head;
+static int             as_list_len;
+static DEFINE_SPINLOCK(as_lock);
 
 /*
  *     Try to batch vunmaps because they are costly.
@@ -1085,7 +1085,7 @@ xfs_buf_iostart(
        return status;
 }
 
-STATIC __inline__ int
+STATIC_INLINE int
 _xfs_buf_iolocked(
        xfs_buf_t               *bp)
 {
@@ -1095,7 +1095,7 @@ _xfs_buf_iolocked(
        return 0;
 }
 
-STATIC __inline__ void
+STATIC_INLINE void
 _xfs_buf_ioend(
        xfs_buf_t               *bp,
        int                     schedule)
@@ -1426,8 +1426,8 @@ xfs_free_bufhash(
 /*
  *     buftarg list for delwrite queue processing
  */
-STATIC LIST_HEAD(xfs_buftarg_list);
-STATIC DEFINE_SPINLOCK(xfs_buftarg_lock);
+LIST_HEAD(xfs_buftarg_list);
+static DEFINE_SPINLOCK(xfs_buftarg_lock);
 
 STATIC void
 xfs_register_buftarg(
@@ -1679,21 +1679,60 @@ xfsbufd_wakeup(
        return 0;
 }
 
+/*
+ * Move as many buffers as specified to the supplied list
+ * idicating if we skipped any buffers to prevent deadlocks.
+ */
+STATIC int
+xfs_buf_delwri_split(
+       xfs_buftarg_t   *target,
+       struct list_head *list,
+       unsigned long   age)
+{
+       xfs_buf_t       *bp, *n;
+       struct list_head *dwq = &target->bt_delwrite_queue;
+       spinlock_t      *dwlk = &target->bt_delwrite_lock;
+       int             skipped = 0;
+       int             force;
+
+       force = test_and_clear_bit(XBT_FORCE_FLUSH, &target->bt_flags);
+       INIT_LIST_HEAD(list);
+       spin_lock(dwlk);
+       list_for_each_entry_safe(bp, n, dwq, b_list) {
+               XB_TRACE(bp, "walkq1", (long)xfs_buf_ispin(bp));
+               ASSERT(bp->b_flags & XBF_DELWRI);
+
+               if (!xfs_buf_ispin(bp) && !xfs_buf_cond_lock(bp)) {
+                       if (!force &&
+                           time_before(jiffies, bp->b_queuetime + age)) {
+                               xfs_buf_unlock(bp);
+                               break;
+                       }
+
+                       bp->b_flags &= ~(XBF_DELWRI|_XBF_DELWRI_Q|
+                                        _XBF_RUN_QUEUES);
+                       bp->b_flags |= XBF_WRITE;
+                       list_move_tail(&bp->b_list, list);
+               } else
+                       skipped++;
+       }
+       spin_unlock(dwlk);
+
+       return skipped;
+
+}
+
 STATIC int
 xfsbufd(
-       void                    *data)
+       void            *data)
 {
-       struct list_head        tmp;
-       unsigned long           age;
-       xfs_buftarg_t           *target = (xfs_buftarg_t *)data;
-       xfs_buf_t               *bp, *n;
-       struct list_head        *dwq = &target->bt_delwrite_queue;
-       spinlock_t              *dwlk = &target->bt_delwrite_lock;
-       int                     count;
+       struct list_head tmp;
+       xfs_buftarg_t   *target = (xfs_buftarg_t *)data;
+       int             count;
+       xfs_buf_t       *bp;
 
        current->flags |= PF_MEMALLOC;
 
-       INIT_LIST_HEAD(&tmp);
        do {
                if (unlikely(freezing(current))) {
                        set_bit(XBT_FORCE_SLEEP, &target->bt_flags);
@@ -1705,37 +1744,17 @@ xfsbufd(
                schedule_timeout_interruptible(
                        xfs_buf_timer_centisecs * msecs_to_jiffies(10));
 
-               count = 0;
-               age = xfs_buf_age_centisecs * msecs_to_jiffies(10);
-               spin_lock(dwlk);
-               list_for_each_entry_safe(bp, n, dwq, b_list) {
-                       XB_TRACE(bp, "walkq1", (long)xfs_buf_ispin(bp));
-                       ASSERT(bp->b_flags & XBF_DELWRI);
-
-                       if (!xfs_buf_ispin(bp) && !xfs_buf_cond_lock(bp)) {
-                               if (!test_bit(XBT_FORCE_FLUSH,
-                                               &target->bt_flags) &&
-                                   time_before(jiffies,
-                                               bp->b_queuetime + age)) {
-                                       xfs_buf_unlock(bp);
-                                       break;
-                               }
-
-                               bp->b_flags &= ~(XBF_DELWRI|_XBF_DELWRI_Q|
-                                                _XBF_RUN_QUEUES);
-                               bp->b_flags |= XBF_WRITE;
-                               list_move_tail(&bp->b_list, &tmp);
-                               count++;
-                       }
-               }
-               spin_unlock(dwlk);
+               xfs_buf_delwri_split(target, &tmp,
+                               xfs_buf_age_centisecs * msecs_to_jiffies(10));
 
+               count = 0;
                while (!list_empty(&tmp)) {
                        bp = list_entry(tmp.next, xfs_buf_t, b_list);
                        ASSERT(target == bp->b_target);
 
                        list_del_init(&bp->b_list);
                        xfs_buf_iostrategy(bp);
+                       count++;
                }
 
                if (as_list_len > 0)
@@ -1743,7 +1762,6 @@ xfsbufd(
                if (count)
                        blk_run_address_space(target->bt_mapping);
 
-               clear_bit(XBT_FORCE_FLUSH, &target->bt_flags);
        } while (!kthread_should_stop());
 
        return 0;
@@ -1756,40 +1774,24 @@ xfsbufd(
  */
 int
 xfs_flush_buftarg(
-       xfs_buftarg_t           *target,
-       int                     wait)
+       xfs_buftarg_t   *target,
+       int             wait)
 {
-       struct list_head        tmp;
-       xfs_buf_t               *bp, *n;
-       int                     pincount = 0;
-       struct list_head        *dwq = &target->bt_delwrite_queue;
-       spinlock_t              *dwlk = &target->bt_delwrite_lock;
+       struct list_head tmp;
+       xfs_buf_t       *bp, *n;
+       int             pincount = 0;
 
        xfs_buf_runall_queues(xfsdatad_workqueue);
        xfs_buf_runall_queues(xfslogd_workqueue);
 
-       INIT_LIST_HEAD(&tmp);
-       spin_lock(dwlk);
-       list_for_each_entry_safe(bp, n, dwq, b_list) {
-               ASSERT(bp->b_target == target);
-               ASSERT(bp->b_flags & (XBF_DELWRI | _XBF_DELWRI_Q));
-               XB_TRACE(bp, "walkq2", (long)xfs_buf_ispin(bp));
-               if (xfs_buf_ispin(bp)) {
-                       pincount++;
-                       continue;
-               }
-
-               list_move_tail(&bp->b_list, &tmp);
-       }
-       spin_unlock(dwlk);
+       set_bit(XBT_FORCE_FLUSH, &target->bt_flags);
+       pincount = xfs_buf_delwri_split(target, &tmp, 0);
 
        /*
         * Dropped the delayed write list lock, now walk the temporary list
         */
        list_for_each_entry_safe(bp, n, &tmp, b_list) {
-               xfs_buf_lock(bp);
-               bp->b_flags &= ~(XBF_DELWRI|_XBF_DELWRI_Q|_XBF_RUN_QUEUES);
-               bp->b_flags |= XBF_WRITE;
+               ASSERT(target == bp->b_target);
                if (wait)
                        bp->b_flags &= ~XBF_ASYNC;
                else
index 9dd235cb01070623795c7e880c58636465ae17b6..9e8ef8fef39fff7f5c58d00209b42bdd0d60569e 100644 (file)
@@ -69,8 +69,8 @@ typedef enum {
 } xfs_buf_flags_t;
 
 typedef enum {
-       XBT_FORCE_SLEEP = (0 << 1),
-       XBT_FORCE_FLUSH = (1 << 1),
+       XBT_FORCE_SLEEP = 0,
+       XBT_FORCE_FLUSH = 1,
 } xfs_buftarg_flags_t;
 
 typedef struct xfs_bufhash {
index 5fb75d9151f20899f69c1608728f393843a0371d..e3a5fedac1bad6166b94e92bae3dbcb8ac10565b 100644 (file)
@@ -24,7 +24,7 @@
 #include "xfs_mount.h"
 #include "xfs_export.h"
 
-STATIC struct dentry dotdot = { .d_name.name = "..", .d_name.len = 2, };
+static struct dentry dotdot = { .d_name.name = "..", .d_name.len = 2, };
 
 /*
  * XFS encodes and decodes the fileid portion of NFS filehandles
index d26f5cd2ba70ec0cd9c73471a0eb1d23b544c529..cb51dc9613555b6c8a37160b0d45d727359235bd 100644 (file)
@@ -46,7 +46,7 @@ static struct vm_operations_struct xfs_file_vm_ops;
 static struct vm_operations_struct xfs_dmapi_file_vm_ops;
 #endif
 
-STATIC inline ssize_t
+STATIC_INLINE ssize_t
 __xfs_file_read(
        struct kiocb            *iocb,
        const struct iovec      *iov,
@@ -84,7 +84,7 @@ xfs_file_aio_read_invis(
        return __xfs_file_read(iocb, iov, nr_segs, IO_ISAIO|IO_INVIS, pos);
 }
 
-STATIC inline ssize_t
+STATIC_INLINE ssize_t
 __xfs_file_write(
        struct kiocb            *iocb,
        const struct iovec      *iov,
index f011c9cd0d6211b3635661d3f76a6125c70b53e7..ff5c41ff8d40cd8c67d7609383cac2a8ff529d25 100644 (file)
@@ -41,8 +41,6 @@
 #include "xfs_error.h"
 #include "xfs_rw.h"
 #include "xfs_acl.h"
-#include "xfs_cap.h"
-#include "xfs_mac.h"
 #include "xfs_attr.h"
 #include "xfs_bmap.h"
 #include "xfs_buf_item.h"
@@ -355,7 +353,6 @@ STATIC int
 xfs_readlink_by_handle(
        xfs_mount_t             *mp,
        void                    __user *arg,
-       struct file             *parfilp,
        struct inode            *parinode)
 {
        int                     error;
@@ -388,7 +385,7 @@ xfs_readlink_by_handle(
        aiov.iov_len    = olen;
        aiov.iov_base   = hreq.ohandle;
 
-       auio.uio_iov    = &aiov;
+       auio.uio_iov    = (struct kvec *)&aiov;
        auio.uio_iovcnt = 1;
        auio.uio_offset = 0;
        auio.uio_segflg = UIO_USERSPACE;
@@ -406,7 +403,6 @@ STATIC int
 xfs_fssetdm_by_handle(
        xfs_mount_t             *mp,
        void                    __user *arg,
-       struct file             *parfilp,
        struct inode            *parinode)
 {
        int                     error;
@@ -448,7 +444,6 @@ STATIC int
 xfs_attrlist_by_handle(
        xfs_mount_t             *mp,
        void                    __user *arg,
-       struct file             *parfilp,
        struct inode            *parinode)
 {
        int                     error;
@@ -569,7 +564,6 @@ STATIC int
 xfs_attrmulti_by_handle(
        xfs_mount_t             *mp,
        void                    __user *arg,
-       struct file             *parfilp,
        struct inode            *parinode)
 {
        int                     error;
@@ -689,7 +683,6 @@ xfs_ioc_xattr(
 STATIC int
 xfs_ioc_getbmap(
        bhv_desc_t              *bdp,
-       struct file             *filp,
        int                     flags,
        unsigned int            cmd,
        void                    __user *arg);
@@ -788,7 +781,7 @@ xfs_ioctl(
 
        case XFS_IOC_GETBMAP:
        case XFS_IOC_GETBMAPA:
-               return xfs_ioc_getbmap(bdp, filp, ioflags, cmd, arg);
+               return xfs_ioc_getbmap(bdp, ioflags, cmd, arg);
 
        case XFS_IOC_GETBMAPX:
                return xfs_ioc_getbmapx(bdp, arg);
@@ -802,16 +795,16 @@ xfs_ioctl(
                return xfs_open_by_handle(mp, arg, filp, inode);
 
        case XFS_IOC_FSSETDM_BY_HANDLE:
-               return xfs_fssetdm_by_handle(mp, arg, filp, inode);
+               return xfs_fssetdm_by_handle(mp, arg, inode);
 
        case XFS_IOC_READLINK_BY_HANDLE:
-               return xfs_readlink_by_handle(mp, arg, filp, inode);
+               return xfs_readlink_by_handle(mp, arg, inode);
 
        case XFS_IOC_ATTRLIST_BY_HANDLE:
-               return xfs_attrlist_by_handle(mp, arg, filp, inode);
+               return xfs_attrlist_by_handle(mp, arg, inode);
 
        case XFS_IOC_ATTRMULTI_BY_HANDLE:
-               return xfs_attrmulti_by_handle(mp, arg, filp, inode);
+               return xfs_attrmulti_by_handle(mp, arg, inode);
 
        case XFS_IOC_SWAPEXT: {
                error = xfs_swapext((struct xfs_swapext __user *)arg);
@@ -1095,11 +1088,6 @@ xfs_ioc_fsgeometry(
 /*
  * Linux extended inode flags interface.
  */
-#define LINUX_XFLAG_SYNC       0x00000008 /* Synchronous updates */
-#define LINUX_XFLAG_IMMUTABLE  0x00000010 /* Immutable file */
-#define LINUX_XFLAG_APPEND     0x00000020 /* writes to file may only append */
-#define LINUX_XFLAG_NODUMP     0x00000040 /* do not dump file */
-#define LINUX_XFLAG_NOATIME    0x00000080 /* do not update atime */
 
 STATIC unsigned int
 xfs_merge_ioc_xflags(
@@ -1108,23 +1096,23 @@ xfs_merge_ioc_xflags(
 {
        unsigned int    xflags = start;
 
-       if (flags & LINUX_XFLAG_IMMUTABLE)
+       if (flags & FS_IMMUTABLE_FL)
                xflags |= XFS_XFLAG_IMMUTABLE;
        else
                xflags &= ~XFS_XFLAG_IMMUTABLE;
-       if (flags & LINUX_XFLAG_APPEND)
+       if (flags & FS_APPEND_FL)
                xflags |= XFS_XFLAG_APPEND;
        else
                xflags &= ~XFS_XFLAG_APPEND;
-       if (flags & LINUX_XFLAG_SYNC)
+       if (flags & FS_SYNC_FL)
                xflags |= XFS_XFLAG_SYNC;
        else
                xflags &= ~XFS_XFLAG_SYNC;
-       if (flags & LINUX_XFLAG_NOATIME)
+       if (flags & FS_NOATIME_FL)
                xflags |= XFS_XFLAG_NOATIME;
        else
                xflags &= ~XFS_XFLAG_NOATIME;
-       if (flags & LINUX_XFLAG_NODUMP)
+       if (flags & FS_NODUMP_FL)
                xflags |= XFS_XFLAG_NODUMP;
        else
                xflags &= ~XFS_XFLAG_NODUMP;
@@ -1139,15 +1127,15 @@ xfs_di2lxflags(
        unsigned int    flags = 0;
 
        if (di_flags & XFS_DIFLAG_IMMUTABLE)
-               flags |= LINUX_XFLAG_IMMUTABLE;
+               flags |= FS_IMMUTABLE_FL;
        if (di_flags & XFS_DIFLAG_APPEND)
-               flags |= LINUX_XFLAG_APPEND;
+               flags |= FS_APPEND_FL;
        if (di_flags & XFS_DIFLAG_SYNC)
-               flags |= LINUX_XFLAG_SYNC;
+               flags |= FS_SYNC_FL;
        if (di_flags & XFS_DIFLAG_NOATIME)
-               flags |= LINUX_XFLAG_NOATIME;
+               flags |= FS_NOATIME_FL;
        if (di_flags & XFS_DIFLAG_NODUMP)
-               flags |= LINUX_XFLAG_NODUMP;
+               flags |= FS_NODUMP_FL;
        return flags;
 }
 
@@ -1247,9 +1235,9 @@ xfs_ioc_xattr(
                        break;
                }
 
-               if (flags & ~(LINUX_XFLAG_IMMUTABLE | LINUX_XFLAG_APPEND | \
-                             LINUX_XFLAG_NOATIME | LINUX_XFLAG_NODUMP | \
-                             LINUX_XFLAG_SYNC)) {
+               if (flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL | \
+                             FS_NOATIME_FL | FS_NODUMP_FL | \
+                             FS_SYNC_FL)) {
                        error = -EOPNOTSUPP;
                        break;
                }
@@ -1281,7 +1269,6 @@ xfs_ioc_xattr(
 STATIC int
 xfs_ioc_getbmap(
        bhv_desc_t              *bdp,
-       struct file             *filp,
        int                     ioflags,
        unsigned int            cmd,
        void                    __user *arg)
index 3ba814ae3bba536c2eaeb99e2e530ffc4239e7b1..0b5fa124bef2a8d53b88af18169020df11f0a68c 100644 (file)
@@ -43,8 +43,6 @@
 #include "xfs_itable.h"
 #include "xfs_rw.h"
 #include "xfs_acl.h"
-#include "xfs_cap.h"
-#include "xfs_mac.h"
 #include "xfs_attr.h"
 #include "xfs_buf_item.h"
 #include "xfs_utils.h"
@@ -250,13 +248,13 @@ xfs_init_security(
  *
  * XXX(hch):  nfsd is broken, better fix it instead.
  */
-STATIC inline int
+STATIC_INLINE int
 xfs_has_fs_struct(struct task_struct *task)
 {
        return (task->fs != init_task.fs);
 }
 
-STATIC inline void
+STATIC void
 xfs_cleanup_inode(
        bhv_vnode_t     *dvp,
        bhv_vnode_t     *vp,
@@ -815,7 +813,7 @@ xfs_vn_removexattr(
 }
 
 
-struct inode_operations xfs_inode_operations = {
+const struct inode_operations xfs_inode_operations = {
        .permission             = xfs_vn_permission,
        .truncate               = xfs_vn_truncate,
        .getattr                = xfs_vn_getattr,
@@ -826,7 +824,7 @@ struct inode_operations xfs_inode_operations = {
        .removexattr            = xfs_vn_removexattr,
 };
 
-struct inode_operations xfs_dir_inode_operations = {
+const struct inode_operations xfs_dir_inode_operations = {
        .create                 = xfs_vn_create,
        .lookup                 = xfs_vn_lookup,
        .link                   = xfs_vn_link,
@@ -845,7 +843,7 @@ struct inode_operations xfs_dir_inode_operations = {
        .removexattr            = xfs_vn_removexattr,
 };
 
-struct inode_operations xfs_symlink_inode_operations = {
+const struct inode_operations xfs_symlink_inode_operations = {
        .readlink               = generic_readlink,
        .follow_link            = xfs_vn_follow_link,
        .put_link               = xfs_vn_put_link,
index ad6173da567813c428ce5c159f180faedf61a097..95a69398fce03b572c53b69ea05123844a62c4ef 100644 (file)
@@ -18,9 +18,9 @@
 #ifndef __XFS_IOPS_H__
 #define __XFS_IOPS_H__
 
-extern struct inode_operations xfs_inode_operations;
-extern struct inode_operations xfs_dir_inode_operations;
-extern struct inode_operations xfs_symlink_inode_operations;
+extern const struct inode_operations xfs_inode_operations;
+extern const struct inode_operations xfs_dir_inode_operations;
+extern const struct inode_operations xfs_symlink_inode_operations;
 
 extern const struct file_operations xfs_file_operations;
 extern const struct file_operations xfs_dir_file_operations;
index 2b0e0018738a09ab31a19b89152b63ac8e804053..715adad7dd4dd07607edda8aae8e30bb31697899 100644 (file)
 #undef  HAVE_PERCPU_SB /* per cpu superblock counters are a 2.6 feature */
 #endif
 
-/*
- * State flag for unwritten extent buffers.
- *
- * We need to be able to distinguish between these and delayed
- * allocate buffers within XFS.  The generic IO path code does
- * not need to distinguish - we use the BH_Delay flag for both
- * delalloc and these ondisk-uninitialised buffers.
- */
-BUFFER_FNS(PrivateStart, unwritten);
-
 #define restricted_chown       xfs_params.restrict_chown.val
 #define irix_sgid_inherit      xfs_params.sgid_inherit.val
 #define irix_symlink_mode      xfs_params.symlink_mode.val
index 65e79b471d49570f825033d31843327e2d7c50f2..ff8d64eba9f8d4e20ba3457276b22ab655ab9993 100644 (file)
@@ -43,8 +43,6 @@
 #include "xfs_itable.h"
 #include "xfs_rw.h"
 #include "xfs_acl.h"
-#include "xfs_cap.h"
-#include "xfs_mac.h"
 #include "xfs_attr.h"
 #include "xfs_inode_item.h"
 #include "xfs_buf_item.h"
@@ -134,13 +132,11 @@ STATIC int
 xfs_iozero(
        struct inode            *ip,    /* inode                        */
        loff_t                  pos,    /* offset in file               */
-       size_t                  count,  /* size of data to zero         */
-       loff_t                  end_size)       /* max file size to set */
+       size_t                  count)  /* size of data to zero         */
 {
        unsigned                bytes;
        struct page             *page;
        struct address_space    *mapping;
-       char                    *kaddr;
        int                     status;
 
        mapping = ip->i_mapping;
@@ -158,26 +154,21 @@ xfs_iozero(
                if (!page)
                        break;
 
-               kaddr = kmap(page);
                status = mapping->a_ops->prepare_write(NULL, page, offset,
                                                        offset + bytes);
-               if (status) {
+               if (status)
                        goto unlock;
-               }
 
-               memset((void *) (kaddr + offset), 0, bytes);
-               flush_dcache_page(page);
+               memclear_highpage_flush(page, offset, bytes);
+
                status = mapping->a_ops->commit_write(NULL, page, offset,
                                                        offset + bytes);
                if (!status) {
                        pos += bytes;
                        count -= bytes;
-                       if (pos > i_size_read(ip))
-                               i_size_write(ip, pos < end_size ? pos : end_size);
                }
 
 unlock:
-               kunmap(page);
                unlock_page(page);
                page_cache_release(page);
                if (status)
@@ -449,8 +440,8 @@ STATIC int                          /* error (positive) */
 xfs_zero_last_block(
        struct inode    *ip,
        xfs_iocore_t    *io,
-       xfs_fsize_t     isize,
-       xfs_fsize_t     end_size)
+       xfs_fsize_t     offset,
+       xfs_fsize_t     isize)
 {
        xfs_fileoff_t   last_fsb;
        xfs_mount_t     *mp = io->io_mount;
@@ -459,7 +450,6 @@ xfs_zero_last_block(
        int             zero_len;
        int             error = 0;
        xfs_bmbt_irec_t imap;
-       loff_t          loff;
 
        ASSERT(ismrlocked(io->io_lock, MR_UPDATE) != 0);
 
@@ -494,9 +484,10 @@ xfs_zero_last_block(
         */
        XFS_IUNLOCK(mp, io, XFS_ILOCK_EXCL| XFS_EXTSIZE_RD);
 
-       loff = XFS_FSB_TO_B(mp, last_fsb);
        zero_len = mp->m_sb.sb_blocksize - zero_offset;
-       error = xfs_iozero(ip, loff + zero_offset, zero_len, end_size);
+       if (isize + zero_len > offset)
+               zero_len = offset - isize;
+       error = xfs_iozero(ip, isize, zero_len);
 
        XFS_ILOCK(mp, io, XFS_ILOCK_EXCL|XFS_EXTSIZE_RD);
        ASSERT(error >= 0);
@@ -519,14 +510,15 @@ xfs_zero_eof(
        bhv_vnode_t     *vp,
        xfs_iocore_t    *io,
        xfs_off_t       offset,         /* starting I/O offset */
-       xfs_fsize_t     isize,          /* current inode size */
-       xfs_fsize_t     end_size)       /* terminal inode size */
+       xfs_fsize_t     isize)          /* current inode size */
 {
        struct inode    *ip = vn_to_inode(vp);
        xfs_fileoff_t   start_zero_fsb;
        xfs_fileoff_t   end_zero_fsb;
        xfs_fileoff_t   zero_count_fsb;
        xfs_fileoff_t   last_fsb;
+       xfs_fileoff_t   zero_off;
+       xfs_fsize_t     zero_len;
        xfs_mount_t     *mp = io->io_mount;
        int             nimaps;
        int             error = 0;
@@ -540,7 +532,7 @@ xfs_zero_eof(
         * First handle zeroing the block on which isize resides.
         * We only zero a part of that block so it is handled specially.
         */
-       error = xfs_zero_last_block(ip, io, isize, end_size);
+       error = xfs_zero_last_block(ip, io, offset, isize);
        if (error) {
                ASSERT(ismrlocked(io->io_lock, MR_UPDATE));
                ASSERT(ismrlocked(io->io_iolock, MR_UPDATE));
@@ -601,10 +593,13 @@ xfs_zero_eof(
                 */
                XFS_IUNLOCK(mp, io, XFS_ILOCK_EXCL|XFS_EXTSIZE_RD);
 
-               error = xfs_iozero(ip,
-                                  XFS_FSB_TO_B(mp, start_zero_fsb),
-                                  XFS_FSB_TO_B(mp, imap.br_blockcount),
-                                  end_size);
+               zero_off = XFS_FSB_TO_B(mp, start_zero_fsb);
+               zero_len = XFS_FSB_TO_B(mp, imap.br_blockcount);
+
+               if ((zero_off + zero_len) > offset)
+                       zero_len = offset - zero_off;
+
+               error = xfs_iozero(ip, zero_off, zero_len);
                if (error) {
                        goto out_lock;
                }
@@ -783,8 +778,7 @@ start:
         */
 
        if (pos > isize) {
-               error = xfs_zero_eof(BHV_TO_VNODE(bdp), io, pos,
-                                       isize, pos + count);
+               error = xfs_zero_eof(BHV_TO_VNODE(bdp), io, pos, isize);
                if (error) {
                        xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock);
                        goto out_unlock_mutex;
index c77e62efb7420d1bebd3445e55409d426d72fb20..7ac51b1d2161c6b9d2033dc3d3ea96d3e1ff38d7 100644 (file)
@@ -83,7 +83,7 @@ extern int xfs_bdstrat_cb(struct xfs_buf *);
 extern int xfs_dev_is_read_only(struct xfs_mount *, char *);
 
 extern int xfs_zero_eof(struct bhv_vnode *, struct xfs_iocore *, xfs_off_t,
-                               xfs_fsize_t, xfs_fsize_t);
+                               xfs_fsize_t);
 extern ssize_t xfs_read(struct bhv_desc *, struct kiocb *,
                                const struct iovec *, unsigned int,
                                loff_t *, int, struct cred *);
index b93265b7c79ccd8f4238f4fd1a6c651d370ee067..1a4103ca593c9e285c3c9740686b793bcf541737 100644 (file)
@@ -43,8 +43,6 @@
 #include "xfs_itable.h"
 #include "xfs_rw.h"
 #include "xfs_acl.h"
-#include "xfs_cap.h"
-#include "xfs_mac.h"
 #include "xfs_attr.h"
 #include "xfs_buf_item.h"
 #include "xfs_utils.h"
 #include <linux/kthread.h>
 #include <linux/freezer.h>
 
-STATIC struct quotactl_ops xfs_quotactl_operations;
-STATIC struct super_operations xfs_super_operations;
-STATIC kmem_zone_t *xfs_vnode_zone;
-STATIC kmem_zone_t *xfs_ioend_zone;
+static struct quotactl_ops xfs_quotactl_operations;
+static struct super_operations xfs_super_operations;
+static kmem_zone_t *xfs_vnode_zone;
+static kmem_zone_t *xfs_ioend_zone;
 mempool_t *xfs_ioend_pool;
 
 STATIC struct xfs_mount_args *
@@ -121,7 +119,7 @@ xfs_max_file_offset(
        return (((__uint64_t)pagefactor) << bitshift) - 1;
 }
 
-STATIC __inline__ void
+STATIC_INLINE void
 xfs_set_inodeops(
        struct inode            *inode)
 {
@@ -147,7 +145,7 @@ xfs_set_inodeops(
        }
 }
 
-STATIC __inline__ void
+STATIC_INLINE void
 xfs_revalidate_inode(
        xfs_mount_t             *mp,
        bhv_vnode_t             *vp,
@@ -553,7 +551,6 @@ vfs_sync_worker(
                error = bhv_vfs_sync(vfsp, SYNC_FSDATA | SYNC_BDFLUSH | \
                                        SYNC_ATTR | SYNC_REFCACHE, NULL);
        vfsp->vfs_sync_seq++;
-       wmb();
        wake_up(&vfsp->vfs_wait_single_sync_task);
 }
 
@@ -659,9 +656,17 @@ xfs_fs_sync_super(
        int                     error;
        int                     flags;
 
-       if (unlikely(sb->s_frozen == SB_FREEZE_WRITE))
-               flags = SYNC_QUIESCE;
-       else
+       if (unlikely(sb->s_frozen == SB_FREEZE_WRITE)) {
+               /*
+                * First stage of freeze - no more writers will make progress
+                * now we are here, so we flush delwri and delalloc buffers
+                * here, then wait for all I/O to complete.  Data is frozen at
+                * that point. Metadata is not frozen, transactions can still
+                * occur here so don't bother flushing the buftarg (i.e
+                * SYNC_QUIESCE) because it'll just get dirty again.
+                */
+               flags = SYNC_FSDATA | SYNC_DELWRI | SYNC_WAIT | SYNC_IOWAIT;
+       } else
                flags = SYNC_FSDATA | (wait ? SYNC_WAIT : 0);
 
        error = bhv_vfs_sync(vfsp, flags, NULL);
@@ -873,7 +878,7 @@ xfs_fs_get_sb(
                           mnt);
 }
 
-STATIC struct super_operations xfs_super_operations = {
+static struct super_operations xfs_super_operations = {
        .alloc_inode            = xfs_fs_alloc_inode,
        .destroy_inode          = xfs_fs_destroy_inode,
        .write_inode            = xfs_fs_write_inode,
@@ -887,7 +892,7 @@ STATIC struct super_operations xfs_super_operations = {
        .show_options           = xfs_fs_show_options,
 };
 
-STATIC struct quotactl_ops xfs_quotactl_operations = {
+static struct quotactl_ops xfs_quotactl_operations = {
        .quota_sync             = xfs_fs_quotasync,
        .get_xstate             = xfs_fs_getxstate,
        .set_xstate             = xfs_fs_setxstate,
index af246532fbfba80dad9487de25f8375b01fdccc9..cd6eaa44aa2be069875dd56c5d1eb6847d291e8b 100644 (file)
@@ -54,102 +54,204 @@ xfs_stats_clear_proc_handler(
 }
 #endif /* CONFIG_PROC_FS */
 
-STATIC ctl_table xfs_table[] = {
-       {XFS_RESTRICT_CHOWN, "restrict_chown", &xfs_params.restrict_chown.val,
-       sizeof(int), 0644, NULL, &proc_dointvec_minmax,
-       &sysctl_intvec, NULL,
-       &xfs_params.restrict_chown.min, &xfs_params.restrict_chown.max},
-
-       {XFS_SGID_INHERIT, "irix_sgid_inherit", &xfs_params.sgid_inherit.val,
-       sizeof(int), 0644, NULL, &proc_dointvec_minmax,
-       &sysctl_intvec, NULL,
-       &xfs_params.sgid_inherit.min, &xfs_params.sgid_inherit.max},
-
-       {XFS_SYMLINK_MODE, "irix_symlink_mode", &xfs_params.symlink_mode.val,
-       sizeof(int), 0644, NULL, &proc_dointvec_minmax,
-       &sysctl_intvec, NULL,
-       &xfs_params.symlink_mode.min, &xfs_params.symlink_mode.max},
-
-       {XFS_PANIC_MASK, "panic_mask", &xfs_params.panic_mask.val,
-       sizeof(int), 0644, NULL, &proc_dointvec_minmax,
-       &sysctl_intvec, NULL,
-       &xfs_params.panic_mask.min, &xfs_params.panic_mask.max},
-
-       {XFS_ERRLEVEL, "error_level", &xfs_params.error_level.val,
-       sizeof(int), 0644, NULL, &proc_dointvec_minmax,
-       &sysctl_intvec, NULL,
-       &xfs_params.error_level.min, &xfs_params.error_level.max},
-
-       {XFS_SYNCD_TIMER, "xfssyncd_centisecs", &xfs_params.syncd_timer.val,
-       sizeof(int), 0644, NULL, &proc_dointvec_minmax,
-       &sysctl_intvec, NULL,
-       &xfs_params.syncd_timer.min, &xfs_params.syncd_timer.max},
-
-       {XFS_INHERIT_SYNC, "inherit_sync", &xfs_params.inherit_sync.val,
-       sizeof(int), 0644, NULL, &proc_dointvec_minmax,
-       &sysctl_intvec, NULL,
-       &xfs_params.inherit_sync.min, &xfs_params.inherit_sync.max},
-
-       {XFS_INHERIT_NODUMP, "inherit_nodump", &xfs_params.inherit_nodump.val,
-       sizeof(int), 0644, NULL, &proc_dointvec_minmax,
-       &sysctl_intvec, NULL,
-       &xfs_params.inherit_nodump.min, &xfs_params.inherit_nodump.max},
-
-       {XFS_INHERIT_NOATIME, "inherit_noatime", &xfs_params.inherit_noatim.val,
-       sizeof(int), 0644, NULL, &proc_dointvec_minmax,
-       &sysctl_intvec, NULL,
-       &xfs_params.inherit_noatim.min, &xfs_params.inherit_noatim.max},
-
-       {XFS_BUF_TIMER, "xfsbufd_centisecs", &xfs_params.xfs_buf_timer.val,
-       sizeof(int), 0644, NULL, &proc_dointvec_minmax,
-       &sysctl_intvec, NULL,
-       &xfs_params.xfs_buf_timer.min, &xfs_params.xfs_buf_timer.max},
-
-       {XFS_BUF_AGE, "age_buffer_centisecs", &xfs_params.xfs_buf_age.val,
-       sizeof(int), 0644, NULL, &proc_dointvec_minmax,
-       &sysctl_intvec, NULL,
-       &xfs_params.xfs_buf_age.min, &xfs_params.xfs_buf_age.max},
-
-       {XFS_INHERIT_NOSYM, "inherit_nosymlinks", &xfs_params.inherit_nosym.val,
-       sizeof(int), 0644, NULL, &proc_dointvec_minmax,
-       &sysctl_intvec, NULL,
-       &xfs_params.inherit_nosym.min, &xfs_params.inherit_nosym.max},
-
-       {XFS_ROTORSTEP, "rotorstep", &xfs_params.rotorstep.val,
-       sizeof(int), 0644, NULL, &proc_dointvec_minmax,
-       &sysctl_intvec, NULL,
-       &xfs_params.rotorstep.min, &xfs_params.rotorstep.max},
-
-       {XFS_INHERIT_NODFRG, "inherit_nodefrag", &xfs_params.inherit_nodfrg.val,
-       sizeof(int), 0644, NULL, &proc_dointvec_minmax,
-       &sysctl_intvec, NULL,
-       &xfs_params.inherit_nodfrg.min, &xfs_params.inherit_nodfrg.max},
+static ctl_table xfs_table[] = {
+       {
+               .ctl_name       = XFS_RESTRICT_CHOWN,
+               .procname       = "restrict_chown",
+               .data           = &xfs_params.restrict_chown.val,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xfs_params.restrict_chown.min,
+               .extra2         = &xfs_params.restrict_chown.max
+       },
+       {
+               .ctl_name       = XFS_SGID_INHERIT,
+               .procname       = "irix_sgid_inherit",
+               .data           = &xfs_params.sgid_inherit.val,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xfs_params.sgid_inherit.min,
+               .extra2         = &xfs_params.sgid_inherit.max
+       },
+       {
+               .ctl_name       = XFS_SYMLINK_MODE,
+               .procname       = "irix_symlink_mode",
+               .data           = &xfs_params.symlink_mode.val,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xfs_params.symlink_mode.min,
+               .extra2         = &xfs_params.symlink_mode.max
+       },
+       {
+               .ctl_name       = XFS_PANIC_MASK,
+               .procname       = "panic_mask",
+               .data           = &xfs_params.panic_mask.val,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xfs_params.panic_mask.min,
+               .extra2         = &xfs_params.panic_mask.max
+       },
 
+       {
+               .ctl_name       = XFS_ERRLEVEL,
+               .procname       = "error_level",
+               .data           = &xfs_params.error_level.val,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xfs_params.error_level.min,
+               .extra2         = &xfs_params.error_level.max
+       },
+       {
+               .ctl_name       = XFS_SYNCD_TIMER,
+               .procname       = "xfssyncd_centisecs",
+               .data           = &xfs_params.syncd_timer.val,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xfs_params.syncd_timer.min,
+               .extra2         = &xfs_params.syncd_timer.max
+       },
+       {
+               .ctl_name       = XFS_INHERIT_SYNC,
+               .procname       = "inherit_sync",
+               .data           = &xfs_params.inherit_sync.val,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xfs_params.inherit_sync.min,
+               .extra2         = &xfs_params.inherit_sync.max
+       },
+       {
+               .ctl_name       = XFS_INHERIT_NODUMP,
+               .procname       = "inherit_nodump",
+               .data           = &xfs_params.inherit_nodump.val,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xfs_params.inherit_nodump.min,
+               .extra2         = &xfs_params.inherit_nodump.max
+       },
+       {
+               .ctl_name       = XFS_INHERIT_NOATIME,
+               .procname       = "inherit_noatime",
+               .data           = &xfs_params.inherit_noatim.val,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xfs_params.inherit_noatim.min,
+               .extra2         = &xfs_params.inherit_noatim.max
+       },
+       {
+               .ctl_name       = XFS_BUF_TIMER,
+               .procname       = "xfsbufd_centisecs",
+               .data           = &xfs_params.xfs_buf_timer.val,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xfs_params.xfs_buf_timer.min,
+               .extra2         = &xfs_params.xfs_buf_timer.max
+       },
+       {
+               .ctl_name       = XFS_BUF_AGE,
+               .procname       = "age_buffer_centisecs",
+               .data           = &xfs_params.xfs_buf_age.val,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xfs_params.xfs_buf_age.min,
+               .extra2         = &xfs_params.xfs_buf_age.max
+       },
+       {
+               .ctl_name       = XFS_INHERIT_NOSYM,
+               .procname       = "inherit_nosymlinks",
+               .data           = &xfs_params.inherit_nosym.val,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xfs_params.inherit_nosym.min,
+               .extra2         = &xfs_params.inherit_nosym.max
+       },
+       {
+               .ctl_name       = XFS_ROTORSTEP,
+               .procname       = "rotorstep",
+               .data           = &xfs_params.rotorstep.val,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xfs_params.rotorstep.min,
+               .extra2         = &xfs_params.rotorstep.max
+       },
+       {
+               .ctl_name       = XFS_INHERIT_NODFRG,
+               .procname       = "inherit_nodefrag",
+               .data           = &xfs_params.inherit_nodfrg.val,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_minmax,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xfs_params.inherit_nodfrg.min,
+               .extra2         = &xfs_params.inherit_nodfrg.max
+       },
        /* please keep this the last entry */
 #ifdef CONFIG_PROC_FS
-       {XFS_STATS_CLEAR, "stats_clear", &xfs_params.stats_clear.val,
-       sizeof(int), 0644, NULL, &xfs_stats_clear_proc_handler,
-       &sysctl_intvec, NULL,
-       &xfs_params.stats_clear.min, &xfs_params.stats_clear.max},
+       {
+               .ctl_name       = XFS_STATS_CLEAR,
+               .procname       = "stats_clear",
+               .data           = &xfs_params.stats_clear.val,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = &xfs_stats_clear_proc_handler,
+               .strategy       = &sysctl_intvec,
+               .extra1         = &xfs_params.stats_clear.min,
+               .extra2         = &xfs_params.stats_clear.max
+       },
 #endif /* CONFIG_PROC_FS */
 
-       {0}
+       {}
 };
 
-STATIC ctl_table xfs_dir_table[] = {
-       {FS_XFS, "xfs", NULL, 0, 0555, xfs_table},
-       {0}
+static ctl_table xfs_dir_table[] = {
+       {
+               .ctl_name       = FS_XFS,
+               .procname       = "xfs",
+               .mode           = 0555,
+               .child          = xfs_table
+       },
+       {}
 };
 
-STATIC ctl_table xfs_root_table[] = {
-       {CTL_FS, "fs",  NULL, 0, 0555, xfs_dir_table},
-       {0}
+static ctl_table xfs_root_table[] = {
+       {
+               .ctl_name       = CTL_FS,
+               .procname       = "fs",
+               .mode           = 0555,
+               .child          = xfs_dir_table
+       },
+       {}
 };
 
 void
 xfs_sysctl_register(void)
 {
-       xfs_table_header = register_sysctl_table(xfs_root_table, 1);
+       xfs_table_header = register_sysctl_table(xfs_root_table);
 }
 
 void
index da255bdf526036995fcb50340c96f89aff8f81e6..e2c2ce98ab5bed792ebd9ee6d6ba8093dbbdcb6f 100644 (file)
@@ -91,7 +91,7 @@ typedef enum {
 #define SYNC_FSDATA            0x0020  /* flush fs data (e.g. superblocks) */
 #define SYNC_REFCACHE          0x0040  /* prune some of the nfs ref cache */
 #define SYNC_REMOUNT           0x0080  /* remount readonly, no dummy LRs */
-#define SYNC_QUIESCE           0x0100  /* quiesce fileystem for a snapshot */
+#define SYNC_IOWAIT            0x0100  /* wait for all I/O to complete */
 
 #define SHUTDOWN_META_IO_ERROR 0x0001  /* write attempt to metadata failed */
 #define SHUTDOWN_LOG_IO_ERROR  0x0002  /* write attempt to the log failed */
index 553fa731ade5e5320a5cf85d73450ef5b10c69f1..ada24baf88de47dd6b8c150191ab6f2408589810 100644 (file)
@@ -26,7 +26,7 @@ DEFINE_SPINLOCK(vnumber_lock);
  */
 #define NVSYNC                  37
 #define vptosync(v)             (&vsync[((unsigned long)v) % NVSYNC])
-STATIC wait_queue_head_t vsync[NVSYNC];
+static wait_queue_head_t vsync[NVSYNC];
 
 void
 vn_init(void)
index 515f5fdea57a0af1317bf4d03827685dfbd2fb00..b76118cf48978b72f28368f54f080da6623b8e45 100644 (file)
@@ -489,14 +489,14 @@ static inline struct bhv_vnode *vn_grab(struct bhv_vnode *vp)
 #define VN_LOCK(vp)            mutex_spinlock(&(vp)->v_lock)
 #define VN_UNLOCK(vp, s)       mutex_spinunlock(&(vp)->v_lock, s)
 
-static __inline__ void vn_flagset(struct bhv_vnode *vp, uint flag)
+STATIC_INLINE void vn_flagset(struct bhv_vnode *vp, uint flag)
 {
        spin_lock(&vp->v_lock);
        vp->v_flag |= flag;
        spin_unlock(&vp->v_lock);
 }
 
-static __inline__ uint vn_flagclr(struct bhv_vnode *vp, uint flag)
+STATIC_INLINE uint vn_flagclr(struct bhv_vnode *vp, uint flag)
 {
        uint    cleared;
 
index 3aa771531856219a47f936013c1fcf046ef09eaa..4adaf13aac6f783fa67aa8071e2cf934473d7bd4 100644 (file)
@@ -43,8 +43,6 @@
 #include "xfs_itable.h"
 #include "xfs_rw.h"
 #include "xfs_acl.h"
-#include "xfs_cap.h"
-#include "xfs_mac.h"
 #include "xfs_attr.h"
 #include "xfs_buf_item.h"
 #include "xfs_trans_space.h"
@@ -484,7 +482,7 @@ xfs_qm_dqalloc(
 
        xfs_trans_bhold(tp, bp);
 
-       if ((error = xfs_bmap_finish(tpp, &flist, firstblock, &committed))) {
+       if ((error = xfs_bmap_finish(tpp, &flist, &committed))) {
                goto error1;
        }
 
index 33ad5af386e03ed21cfee5b747341af6e5fd8d3e..ddb61fe22a5c7ed9914879bdad603d34390c0f64 100644 (file)
@@ -43,8 +43,6 @@
 #include "xfs_itable.h"
 #include "xfs_rw.h"
 #include "xfs_acl.h"
-#include "xfs_cap.h"
-#include "xfs_mac.h"
 #include "xfs_attr.h"
 #include "xfs_buf_item.h"
 #include "xfs_trans_priv.h"
@@ -399,7 +397,7 @@ xfs_qm_dquot_logitem_committing(
 /*
  * This is the ops vector for dquots
  */
-STATIC struct xfs_item_ops xfs_dquot_item_ops = {
+static struct xfs_item_ops xfs_dquot_item_ops = {
        .iop_size       = (uint(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_size,
        .iop_format     = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
                                        xfs_qm_dquot_logitem_format,
@@ -606,7 +604,7 @@ xfs_qm_qoffend_logitem_committing(xfs_qoff_logitem_t *qip, xfs_lsn_t commit_lsn)
        return;
 }
 
-STATIC struct xfs_item_ops xfs_qm_qoffend_logitem_ops = {
+static struct xfs_item_ops xfs_qm_qoffend_logitem_ops = {
        .iop_size       = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_size,
        .iop_format     = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
                                        xfs_qm_qoff_logitem_format,
@@ -628,7 +626,7 @@ STATIC struct xfs_item_ops xfs_qm_qoffend_logitem_ops = {
 /*
  * This is the ops vector shared by all quotaoff-start log items.
  */
-STATIC struct xfs_item_ops xfs_qm_qoff_logitem_ops = {
+static struct xfs_item_ops xfs_qm_qoff_logitem_ops = {
        .iop_size       = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_size,
        .iop_format     = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
                                        xfs_qm_qoff_logitem_format,
index 7c6a3a50379e2a543fac68acf60774909fc9097c..1de2acdc7f70eab902b24c403b54962bb6b95d74 100644 (file)
@@ -44,8 +44,6 @@
 #include "xfs_bmap.h"
 #include "xfs_rw.h"
 #include "xfs_acl.h"
-#include "xfs_cap.h"
-#include "xfs_mac.h"
 #include "xfs_attr.h"
 #include "xfs_buf_item.h"
 #include "xfs_trans_space.h"
@@ -64,10 +62,10 @@ uint                ndquot;
 
 kmem_zone_t    *qm_dqzone;
 kmem_zone_t    *qm_dqtrxzone;
-STATIC kmem_shaker_t   xfs_qm_shaker;
+static kmem_shaker_t   xfs_qm_shaker;
 
-STATIC cred_t  xfs_zerocr;
-STATIC xfs_inode_t     xfs_zeroino;
+static cred_t  xfs_zerocr;
+static xfs_inode_t     xfs_zeroino;
 
 STATIC void    xfs_qm_list_init(xfs_dqlist_t *, char *, int);
 STATIC void    xfs_qm_list_destroy(xfs_dqlist_t *);
index db8872be8c87cfa5b8cef85569511db2c225f58b..d2cdb8a2aad6a9ad1722675c4359ccd362fda637 100644 (file)
@@ -44,8 +44,6 @@
 #include "xfs_error.h"
 #include "xfs_rw.h"
 #include "xfs_acl.h"
-#include "xfs_cap.h"
-#include "xfs_mac.h"
 #include "xfs_attr.h"
 #include "xfs_buf_item.h"
 #include "xfs_qm.h"
@@ -384,7 +382,7 @@ xfs_qm_dqrele_null(
 }
 
 
-STATIC struct xfs_qmops xfs_qmcore_xfs = {
+static struct xfs_qmops xfs_qmcore_xfs = {
        .xfs_qminit             = xfs_qm_newmount,
        .xfs_qmdone             = xfs_qm_unmount_quotadestroy,
        .xfs_qmmount            = xfs_qm_endmount,
index 6f858fb81a369edfdb99deee3f14e7d782806364..709f5f545cf5cfc6eebd259d836b84584b997b2e 100644 (file)
@@ -43,8 +43,6 @@
 #include "xfs_error.h"
 #include "xfs_rw.h"
 #include "xfs_acl.h"
-#include "xfs_cap.h"
-#include "xfs_mac.h"
 #include "xfs_attr.h"
 #include "xfs_buf_item.h"
 #include "xfs_qm.h"
index ed620c4d15941396e5bec0cc27cb0628a0b7dbc6..716f562aa8b2f036c46c7dd1951b0185ae04d5d0 100644 (file)
@@ -46,8 +46,6 @@
 #include "xfs_error.h"
 #include "xfs_rw.h"
 #include "xfs_acl.h"
-#include "xfs_cap.h"
-#include "xfs_mac.h"
 #include "xfs_attr.h"
 #include "xfs_buf_item.h"
 #include "xfs_utils.h"
@@ -134,7 +132,7 @@ xfs_qm_quotactl(
                break;
 
        case Q_XQUOTASYNC:
-               return (xfs_sync_inodes(mp, SYNC_DELWRI, 0, NULL));
+               return (xfs_sync_inodes(mp, SYNC_DELWRI, NULL));
 
        default:
                break;
index 0242e9666e8e087b3180938aefca3f198df28724..d7491e7b1f3bca3c1a29d13585b9f914f9cf761f 100644 (file)
@@ -43,8 +43,6 @@
 #include "xfs_error.h"
 #include "xfs_rw.h"
 #include "xfs_acl.h"
-#include "xfs_cap.h"
-#include "xfs_mac.h"
 #include "xfs_attr.h"
 #include "xfs_buf_item.h"
 #include "xfs_trans_priv.h"
index 4363512d2f90e569b07e1dd67824d25e3e464cf4..08bbd3cb87aefb055088902550405c49a92be228 100644 (file)
@@ -19,7 +19,7 @@
 #include "debug.h"
 #include "spin.h"
 
-static char            message[256];   /* keep it off the stack */
+static char            message[1024];  /* keep it off the stack */
 static DEFINE_SPINLOCK(xfs_err_lock);
 
 /* Translate from CE_FOO to KERN_FOO, err_level(CE_FOO) == KERN_FOO */
@@ -44,13 +44,14 @@ cmn_err(register int level, char *fmt, ...)
        spin_lock_irqsave(&xfs_err_lock,flags);
        va_start(ap, fmt);
        if (*fmt == '!') fp++;
-       len = vsprintf(message, fp, ap);
-       if (level != CE_DEBUG && message[len-1] != '\n')
-               strcat(message, "\n");
-       printk("%s%s", err_level[level], message);
+       len = vsnprintf(message, sizeof(message), fp, ap);
+       if (len >= sizeof(message))
+               len = sizeof(message) - 1;
+       if (message[len-1] == '\n')
+               message[len-1] = 0;
+       printk("%s%s\n", err_level[level], message);
        va_end(ap);
        spin_unlock_irqrestore(&xfs_err_lock,flags);
-
        BUG_ON(level == CE_PANIC);
 }
 
@@ -64,11 +65,13 @@ icmn_err(register int level, char *fmt, va_list ap)
        if(level > XFS_MAX_ERR_LEVEL)
                level = XFS_MAX_ERR_LEVEL;
        spin_lock_irqsave(&xfs_err_lock,flags);
-       len = vsprintf(message, fmt, ap);
-       if (level != CE_DEBUG && message[len-1] != '\n')
-               strcat(message, "\n");
+       len = vsnprintf(message, sizeof(message), fmt, ap);
+       if (len >= sizeof(message))
+               len = sizeof(message) - 1;
+       if (message[len-1] == '\n')
+               message[len-1] = 0;
+       printk("%s%s\n", err_level[level], message);
        spin_unlock_irqrestore(&xfs_err_lock,flags);
-       printk("%s%s", err_level[level], message);
        BUG_ON(level == CE_PANIC);
 }
 
index 4f54dca662a89ca646f9ff27a51d129a1c42a4de..2a70cc605ae34b5298ed8e4ebd0a912d9153fd37 100644 (file)
@@ -38,13 +38,37 @@ extern void assfail(char *expr, char *f, int l);
 
 #ifndef DEBUG
 # define ASSERT(expr)  ((void)0)
-#else
+
+#ifndef STATIC
+# define STATIC static noinline
+#endif
+
+#ifndef STATIC_INLINE
+# define STATIC_INLINE static inline
+#endif
+
+#else /* DEBUG */
+
 # define ASSERT(expr)  ASSERT_ALWAYS(expr)
 extern unsigned long random(void);
-#endif
 
 #ifndef STATIC
-# define STATIC static
+# define STATIC noinline
 #endif
 
+/*
+ * We stop inlining of inline functions in debug mode.
+ * Unfortunately, this means static inline in header files
+ * get multiple definitions, so they need to remain static.
+ * This then gives tonnes of warnings about unused but defined
+ * functions, so we need to add the unused attribute to prevent
+ * these spurious warnings.
+ */
+#ifndef STATIC_INLINE
+# define STATIC_INLINE static __attribute__ ((unused)) noinline
+#endif
+
+#endif /* DEBUG */
+
+
 #endif  /* __XFS_SUPPORT_DEBUG_H__ */
index 977879c24ff527b4a8e5d6062027d2747559278b..324e413deadd5a2b52bcf71249546fcd1e7ad692 100644 (file)
@@ -55,7 +55,7 @@ enum uio_seg {
 };
 
 struct uio {
-       struct iovec    *uio_iov;   /* pointer to array of iovecs */
+       struct kvec     *uio_iov;   /* pointer to array of iovecs */
        int             uio_iovcnt; /* number of iovecs in array */
        xfs_off_t       uio_offset; /* offset in file this uio corresponds to */
        int             uio_resid;  /* residual i/o count */
@@ -63,7 +63,7 @@ struct uio {
 };
 
 typedef struct uio uio_t;
-typedef struct iovec iovec_t;
+typedef struct kvec iovec_t;
 
 extern int     xfs_uio_read (caddr_t, size_t, uio_t *);
 
index 4b0cb474be4c3906c79fa6e997f8b2e1e3c15639..4ca4beb7bb546b6fce761d4d8cc29fefdbb7732b 100644 (file)
@@ -31,7 +31,6 @@
 #include "xfs_inode.h"
 #include "xfs_btree.h"
 #include "xfs_acl.h"
-#include "xfs_mac.h"
 #include "xfs_attr.h"
 
 #include <linux/capability.h>
index bce81c7a4fdc4212a6db024c8900add19e6938b8..5bd1a2c8bd0712a4ba05828802b8d7fb763727e2 100644 (file)
@@ -58,7 +58,6 @@ typedef       struct xfs_btree_sblock xfs_alloc_block_t;
 /*
  * Real block structures have a size equal to the disk block size.
  */
-#define        XFS_ALLOC_BLOCK_SIZE(lev,cur)   (1 << (cur)->bc_blocklog)
 #define        XFS_ALLOC_BLOCK_MAXRECS(lev,cur) ((cur)->bc_mp->m_alloc_mxr[lev != 0])
 #define        XFS_ALLOC_BLOCK_MINRECS(lev,cur) ((cur)->bc_mp->m_alloc_mnr[lev != 0])
 
@@ -87,16 +86,13 @@ typedef     struct xfs_btree_sblock xfs_alloc_block_t;
  * Record, key, and pointer address macros for btree blocks.
  */
 #define        XFS_ALLOC_REC_ADDR(bb,i,cur)    \
-       XFS_BTREE_REC_ADDR(XFS_ALLOC_BLOCK_SIZE(0,cur), xfs_alloc, \
-                               bb, i, XFS_ALLOC_BLOCK_MAXRECS(0, cur))
+       XFS_BTREE_REC_ADDR(xfs_alloc, bb, i)
 
 #define        XFS_ALLOC_KEY_ADDR(bb,i,cur)    \
-       XFS_BTREE_KEY_ADDR(XFS_ALLOC_BLOCK_SIZE(1,cur), xfs_alloc, \
-                               bb, i, XFS_ALLOC_BLOCK_MAXRECS(1, cur))
+       XFS_BTREE_KEY_ADDR(xfs_alloc, bb, i)
 
 #define        XFS_ALLOC_PTR_ADDR(bb,i,cur)    \
-       XFS_BTREE_PTR_ADDR(XFS_ALLOC_BLOCK_SIZE(1,cur), xfs_alloc, \
-                               bb, i, XFS_ALLOC_BLOCK_MAXRECS(1, cur))
+       XFS_BTREE_PTR_ADDR(xfs_alloc, bb, i, XFS_ALLOC_BLOCK_MAXRECS(1, cur))
 
 /*
  * Decrement cursor by one record at the level.
index 9ada7bdbae5219a0803aac3b8c5f55a8d2f095c1..9d358ffce4e5101d999570b3af021be3705d797b 100644 (file)
@@ -57,9 +57,9 @@
  */
 
 #define ATTR_SYSCOUNT  2
-STATIC struct attrnames posix_acl_access;
-STATIC struct attrnames posix_acl_default;
-STATIC struct attrnames *attr_system_names[ATTR_SYSCOUNT];
+static struct attrnames posix_acl_access;
+static struct attrnames posix_acl_default;
+static struct attrnames *attr_system_names[ATTR_SYSCOUNT];
 
 /*========================================================================
  * Function prototypes for the kernel.
@@ -198,19 +198,15 @@ xfs_attr_set_int(xfs_inode_t *dp, const char *name, int namelen,
        if ((error = XFS_QM_DQATTACH(mp, dp, 0)))
                return (error);
 
-       /*
-        * Determine space new attribute will use, and if it would be
-        * "local" or "remote" (note: local != inline).
-        */
-       size = xfs_attr_leaf_newentsize(namelen, valuelen,
-                                       mp->m_sb.sb_blocksize, &local);
-
        /*
         * If the inode doesn't have an attribute fork, add one.
         * (inode must not be locked when we call this routine)
         */
        if (XFS_IFORK_Q(dp) == 0) {
-               if ((error = xfs_bmap_add_attrfork(dp, size, rsvd)))
+               int sf_size = sizeof(xfs_attr_sf_hdr_t) +
+                             XFS_ATTR_SF_ENTSIZE_BYNAME(namelen, valuelen);
+
+               if ((error = xfs_bmap_add_attrfork(dp, sf_size, rsvd)))
                        return(error);
        }
 
@@ -231,6 +227,13 @@ xfs_attr_set_int(xfs_inode_t *dp, const char *name, int namelen,
        args.addname = 1;
        args.oknoent = 1;
 
+       /*
+        * Determine space new attribute will use, and if it would be
+        * "local" or "remote" (note: local != inline).
+        */
+       size = xfs_attr_leaf_newentsize(namelen, valuelen,
+                                       mp->m_sb.sb_blocksize, &local);
+
        nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK);
        if (local) {
                if (size > (mp->m_sb.sb_blocksize >> 1)) {
@@ -346,7 +349,7 @@ xfs_attr_set_int(xfs_inode_t *dp, const char *name, int namelen,
                error = xfs_attr_shortform_to_leaf(&args);
                if (!error) {
                        error = xfs_bmap_finish(&args.trans, args.flist,
-                                               *args.firstblock, &committed);
+                                               &committed);
                }
                if (error) {
                        ASSERT(committed);
@@ -973,7 +976,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
                error = xfs_attr_leaf_to_node(args);
                if (!error) {
                        error = xfs_bmap_finish(&args->trans, args->flist,
-                                               *args->firstblock, &committed);
+                                               &committed);
                }
                if (error) {
                        ASSERT(committed);
@@ -1074,7 +1077,6 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
                        if (!error) {
                                error = xfs_bmap_finish(&args->trans,
                                                        args->flist,
-                                                       *args->firstblock,
                                                        &committed);
                        }
                        if (error) {
@@ -1152,7 +1154,7 @@ xfs_attr_leaf_removename(xfs_da_args_t *args)
                /* bp is gone due to xfs_da_shrink_inode */
                if (!error) {
                        error = xfs_bmap_finish(&args->trans, args->flist,
-                                               *args->firstblock, &committed);
+                                               &committed);
                }
                if (error) {
                        ASSERT(committed);
@@ -1307,7 +1309,6 @@ restart:
                        if (!error) {
                                error = xfs_bmap_finish(&args->trans,
                                                        args->flist,
-                                                       *args->firstblock,
                                                        &committed);
                        }
                        if (error) {
@@ -1347,7 +1348,7 @@ restart:
                error = xfs_da_split(state);
                if (!error) {
                        error = xfs_bmap_finish(&args->trans, args->flist,
-                                               *args->firstblock, &committed);
+                                               &committed);
                }
                if (error) {
                        ASSERT(committed);
@@ -1459,7 +1460,6 @@ restart:
                        if (!error) {
                                error = xfs_bmap_finish(&args->trans,
                                                        args->flist,
-                                                       *args->firstblock,
                                                        &committed);
                        }
                        if (error) {
@@ -1594,7 +1594,7 @@ xfs_attr_node_removename(xfs_da_args_t *args)
                error = xfs_da_join(state);
                if (!error) {
                        error = xfs_bmap_finish(&args->trans, args->flist,
-                                               *args->firstblock, &committed);
+                                               &committed);
                }
                if (error) {
                        ASSERT(committed);
@@ -1646,7 +1646,6 @@ xfs_attr_node_removename(xfs_da_args_t *args)
                        if (!error) {
                                error = xfs_bmap_finish(&args->trans,
                                                        args->flist,
-                                                       *args->firstblock,
                                                        &committed);
                        }
                        if (error) {
@@ -2090,7 +2089,7 @@ xfs_attr_rmtval_set(xfs_da_args_t *args)
                                  args->flist, NULL);
                if (!error) {
                        error = xfs_bmap_finish(&args->trans, args->flist,
-                                               *args->firstblock, &committed);
+                                               &committed);
                }
                if (error) {
                        ASSERT(committed);
@@ -2246,7 +2245,7 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args)
                                    NULL, &done);
                if (!error) {
                        error = xfs_bmap_finish(&args->trans, args->flist,
-                                               *args->firstblock, &committed);
+                                               &committed);
                }
                if (error) {
                        ASSERT(committed);
@@ -2477,7 +2476,7 @@ posix_acl_default_exists(
        return xfs_acl_vhasacl_default(vp);
 }
 
-STATIC struct attrnames posix_acl_access = {
+static struct attrnames posix_acl_access = {
        .attr_name      = "posix_acl_access",
        .attr_namelen   = sizeof("posix_acl_access") - 1,
        .attr_get       = posix_acl_access_get,
@@ -2486,7 +2485,7 @@ STATIC struct attrnames posix_acl_access = {
        .attr_exists    = posix_acl_access_exists,
 };
 
-STATIC struct attrnames posix_acl_default = {
+static struct attrnames posix_acl_default = {
        .attr_name      = "posix_acl_default",
        .attr_namelen   = sizeof("posix_acl_default") - 1,
        .attr_get       = posix_acl_default_get,
@@ -2495,7 +2494,7 @@ STATIC struct attrnames posix_acl_default = {
        .attr_exists    = posix_acl_default_exists,
 };
 
-STATIC struct attrnames *attr_system_names[] =
+static struct attrnames *attr_system_names[] =
        { &posix_acl_access, &posix_acl_default };
 
 
index 9719bbef122ce355c20894a51d424e4b264be933..8eab73e8340ac223c00d617750845d1cee7c8fbd 100644 (file)
@@ -94,7 +94,7 @@ STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index);
  * Namespace helper routines
  *========================================================================*/
 
-STATIC inline attrnames_t *
+STATIC_INLINE attrnames_t *
 xfs_attr_flags_namesp(int flags)
 {
        return ((flags & XFS_ATTR_SECURE) ? &attr_secure:
@@ -105,7 +105,7 @@ xfs_attr_flags_namesp(int flags)
  * If namespace bits don't match return 0.
  * If all match then return 1.
  */
-STATIC inline int
+STATIC_INLINE int
 xfs_attr_namesp_match(int arg_flags, int ondisk_flags)
 {
        return XFS_ATTR_NSP_ONDISK(ondisk_flags) == XFS_ATTR_NSP_ARGS_TO_ONDISK(arg_flags);
@@ -116,7 +116,7 @@ xfs_attr_namesp_match(int arg_flags, int ondisk_flags)
  * then return 0.
  * If all match or are overridable then return 1.
  */
-STATIC inline int
+STATIC_INLINE int
 xfs_attr_namesp_match_overrides(int arg_flags, int ondisk_flags)
 {
        if (((arg_flags & ATTR_SECURE) == 0) !=
@@ -150,6 +150,7 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes)
        int offset;
        int minforkoff; /* lower limit on valid forkoff locations */
        int maxforkoff; /* upper limit on valid forkoff locations */
+       int dsize;      
        xfs_mount_t *mp = dp->i_mount;
 
        offset = (XFS_LITINO(mp) - bytes) >> 3; /* rounded down */
@@ -169,8 +170,43 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes)
                return 0;
        }
 
-       /* data fork btree root can have at least this many key/ptr pairs */
-       minforkoff = MAX(dp->i_df.if_bytes, XFS_BMDR_SPACE_CALC(MINDBTPTRS));
+       dsize = dp->i_df.if_bytes;
+       
+       switch (dp->i_d.di_format) {
+       case XFS_DINODE_FMT_EXTENTS:
+               /* 
+                * If there is no attr fork and the data fork is extents, 
+                * determine if creating the default attr fork will result 
+                * in the extents form migrating to btree. If so, the 
+                * minimum offset only needs to be the space required for 
+                * the btree root.
+                */ 
+               if (!dp->i_d.di_forkoff && dp->i_df.if_bytes > mp->m_attroffset)
+                       dsize = XFS_BMDR_SPACE_CALC(MINDBTPTRS);
+               break;
+               
+       case XFS_DINODE_FMT_BTREE:
+               /*
+                * If have data btree then keep forkoff if we have one,
+                * otherwise we are adding a new attr, so then we set 
+                * minforkoff to where the btree root can finish so we have 
+                * plenty of room for attrs
+                */
+               if (dp->i_d.di_forkoff) {
+                       if (offset < dp->i_d.di_forkoff) 
+                               return 0;
+                       else 
+                               return dp->i_d.di_forkoff;
+               } else
+                       dsize = XFS_BMAP_BROOT_SPACE(dp->i_df.if_broot);
+               break;
+       }
+       
+       /* 
+        * A data fork btree root must have space for at least 
+        * MINDBTPTRS key/ptr pairs if the data fork is small or empty.
+        */
+       minforkoff = MAX(dsize, XFS_BMDR_SPACE_CALC(MINDBTPTRS));
        minforkoff = roundup(minforkoff, 8) >> 3;
 
        /* attr fork btree root can have at least this many key/ptr pairs */
@@ -336,7 +372,8 @@ xfs_attr_shortform_remove(xfs_da_args_t *args)
         */
        totsize -= size;
        if (totsize == sizeof(xfs_attr_sf_hdr_t) && !args->addname &&
-           (mp->m_flags & XFS_MOUNT_ATTR2)) {
+           (mp->m_flags & XFS_MOUNT_ATTR2) && 
+           (dp->i_d.di_format != XFS_DINODE_FMT_BTREE)) {
                /*
                 * Last attribute now removed, revert to original
                 * inode format making all literal area available
@@ -355,7 +392,8 @@ xfs_attr_shortform_remove(xfs_da_args_t *args)
                dp->i_d.di_forkoff = xfs_attr_shortform_bytesfit(dp, totsize);
                ASSERT(dp->i_d.di_forkoff);
                ASSERT(totsize > sizeof(xfs_attr_sf_hdr_t) || args->addname ||
-                       !(mp->m_flags & XFS_MOUNT_ATTR2));
+                       !(mp->m_flags & XFS_MOUNT_ATTR2) ||
+                       dp->i_d.di_format == XFS_DINODE_FMT_BTREE);
                dp->i_afp->if_ext_max =
                        XFS_IFORK_ASIZE(dp) / (uint)sizeof(xfs_bmbt_rec_t);
                dp->i_df.if_ext_max =
@@ -748,6 +786,7 @@ xfs_attr_shortform_allfit(xfs_dabuf_t *bp, xfs_inode_t *dp)
                                + be16_to_cpu(name_loc->valuelen);
        }
        if ((dp->i_mount->m_flags & XFS_MOUNT_ATTR2) &&
+           (dp->i_d.di_format != XFS_DINODE_FMT_BTREE) &&
            (bytes == sizeof(struct xfs_attr_sf_hdr)))
                return(-1);
        return(xfs_attr_shortform_bytesfit(dp, bytes));
@@ -786,6 +825,7 @@ xfs_attr_leaf_to_shortform(xfs_dabuf_t *bp, xfs_da_args_t *args, int forkoff)
 
        if (forkoff == -1) {
                ASSERT(dp->i_mount->m_flags & XFS_MOUNT_ATTR2);
+               ASSERT(dp->i_d.di_format != XFS_DINODE_FMT_BTREE);
 
                /*
                 * Last attribute was removed, revert to original
index 43be6a7e47c6ed1a1b582cb8d91416ae84fa8c25..1afe07f67e3b2e9ea0e0e8d02eb0a99e2478e0eb 100644 (file)
@@ -29,7 +29,7 @@
 /*
  * Index of high bit number in byte, -1 for none set, 0..7 otherwise.
  */
-STATIC const char xfs_highbit[256] = {
+static const char xfs_highbit[256] = {
        -1, 0, 1, 1, 2, 2, 2, 2,                        /* 00 .. 07 */
        3, 3, 3, 3, 3, 3, 3, 3,                 /* 08 .. 0f */
        4, 4, 4, 4, 4, 4, 4, 4,                 /* 10 .. 17 */
index 498ad50d1f452807eba88e042f55341ea4498c3d..87795188cedf31dd4d7edaa3a27848b5bf1330df 100644 (file)
@@ -185,16 +185,6 @@ xfs_bmap_btree_to_extents(
        int                     *logflagsp, /* inode logging flags */
        int                     whichfork); /* data or attr fork */
 
-#ifdef DEBUG
-/*
- * Check that the extents list for the inode ip is in the right order.
- */
-STATIC void
-xfs_bmap_check_extents(
-       xfs_inode_t             *ip,            /* incore inode pointer */
-       int                     whichfork);     /* data or attr fork */
-#endif
-
 /*
  * Called by xfs_bmapi to update file extent records and the btree
  * after removing space (or undoing a delayed allocation).
@@ -410,7 +400,6 @@ xfs_bmap_count_leaves(
 STATIC int
 xfs_bmap_disk_count_leaves(
        xfs_ifork_t             *ifp,
-       xfs_mount_t             *mp,
        xfs_extnum_t            idx,
        xfs_bmbt_block_t        *block,
        int                     numrecs,
@@ -684,7 +673,7 @@ xfs_bmap_add_extent(
                ASSERT(nblks <= da_old);
                if (nblks < da_old)
                        xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS,
-                               (int)(da_old - nblks), rsvd);
+                               (int64_t)(da_old - nblks), rsvd);
        }
        /*
         * Clear out the allocated field, done with it now in any case.
@@ -1209,7 +1198,7 @@ xfs_bmap_add_extent_delay_real(
                diff = (int)(temp + temp2 - STARTBLOCKVAL(PREV.br_startblock) -
                        (cur ? cur->bc_private.b.allocated : 0));
                if (diff > 0 &&
-                   xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, -diff, rsvd)) {
+                   xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, -((int64_t)diff), rsvd)) {
                        /*
                         * Ick gross gag me with a spoon.
                         */
@@ -1220,7 +1209,7 @@ xfs_bmap_add_extent_delay_real(
                                        diff--;
                                        if (!diff ||
                                            !xfs_mod_incore_sb(ip->i_mount,
-                                                   XFS_SBS_FDBLOCKS, -diff, rsvd))
+                                                   XFS_SBS_FDBLOCKS, -((int64_t)diff), rsvd))
                                                break;
                                }
                                if (temp2) {
@@ -1228,7 +1217,7 @@ xfs_bmap_add_extent_delay_real(
                                        diff--;
                                        if (!diff ||
                                            !xfs_mod_incore_sb(ip->i_mount,
-                                                   XFS_SBS_FDBLOCKS, -diff, rsvd))
+                                                   XFS_SBS_FDBLOCKS, -((int64_t)diff), rsvd))
                                                break;
                                }
                        }
@@ -2015,7 +2004,7 @@ xfs_bmap_add_extent_hole_delay(
        if (oldlen != newlen) {
                ASSERT(oldlen > newlen);
                xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS,
-                       (int)(oldlen - newlen), rsvd);
+                       (int64_t)(oldlen - newlen), rsvd);
                /*
                 * Nothing to do for disk quota accounting here.
                 */
@@ -3359,7 +3348,7 @@ xfs_bmap_del_extent(
         */
        ASSERT(da_old >= da_new);
        if (da_old > da_new)
-               xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, (int)(da_old - da_new),
+               xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, (int64_t)(da_old - da_new),
                        rsvd);
        if (delta) {
                /* DELTA: report the original extent. */
@@ -3543,6 +3532,7 @@ xfs_bmap_forkoff_reset(
        if (whichfork == XFS_ATTR_FORK &&
            (ip->i_d.di_format != XFS_DINODE_FMT_DEV) &&
            (ip->i_d.di_format != XFS_DINODE_FMT_UUID) &&
+           (ip->i_d.di_format != XFS_DINODE_FMT_BTREE) &&
            ((mp->m_attroffset >> 3) > ip->i_d.di_forkoff)) {
                ip->i_d.di_forkoff = mp->m_attroffset >> 3;
                ip->i_df.if_ext_max = XFS_IFORK_DSIZE(ip) /
@@ -4079,7 +4069,7 @@ xfs_bmap_add_attrfork(
                } else
                        XFS_SB_UNLOCK(mp, s);
        }
-       if ((error = xfs_bmap_finish(&tp, &flist, firstblock, &committed)))
+       if ((error = xfs_bmap_finish(&tp, &flist, &committed)))
                goto error2;
        error = xfs_trans_commit(tp, XFS_TRANS_PERM_LOG_RES, NULL);
        ASSERT(ip->i_df.if_ext_max ==
@@ -4212,7 +4202,6 @@ int                                               /* error */
 xfs_bmap_finish(
        xfs_trans_t             **tp,           /* transaction pointer addr */
        xfs_bmap_free_t         *flist,         /* i/o: list extents to free */
-       xfs_fsblock_t           firstblock,     /* controlled ag for allocs */
        int                     *committed)     /* xact committed or not */
 {
        xfs_efd_log_item_t      *efd;           /* extent free data */
@@ -4533,8 +4522,7 @@ xfs_bmap_read_extents(
                        error0);
                if (level == 0)
                        break;
-               pp = XFS_BTREE_PTR_ADDR(mp->m_sb.sb_blocksize, xfs_bmbt, block,
-                       1, mp->m_bmap_dmxr[1]);
+               pp = XFS_BTREE_PTR_ADDR(xfs_bmbt, block, 1, mp->m_bmap_dmxr[1]);
                bno = be64_to_cpu(*pp);
                XFS_WANT_CORRUPTED_GOTO(XFS_FSB_SANITY_CHECK(mp, bno), error0);
                xfs_trans_brelse(tp, bp);
@@ -4577,8 +4565,7 @@ xfs_bmap_read_extents(
                /*
                 * Copy records into the extent records.
                 */
-               frp = XFS_BTREE_REC_ADDR(mp->m_sb.sb_blocksize, xfs_bmbt,
-                       block, 1, mp->m_bmap_dmxr[0]);
+               frp = XFS_BTREE_REC_ADDR(xfs_bmbt, block, 1);
                start = i;
                for (j = 0; j < num_recs; j++, i++, frp++) {
                        trp = xfs_iext_get_ext(ifp, i);
@@ -4929,28 +4916,28 @@ xfs_bmapi(
                                if (rt) {
                                        error = xfs_mod_incore_sb(mp,
                                                        XFS_SBS_FREXTENTS,
-                                                       -(extsz), (flags &
+                                                       -((int64_t)extsz), (flags &
                                                        XFS_BMAPI_RSVBLOCKS));
                                } else {
                                        error = xfs_mod_incore_sb(mp,
                                                        XFS_SBS_FDBLOCKS,
-                                                       -(alen), (flags &
+                                                       -((int64_t)alen), (flags &
                                                        XFS_BMAPI_RSVBLOCKS));
                                }
                                if (!error) {
                                        error = xfs_mod_incore_sb(mp,
                                                        XFS_SBS_FDBLOCKS,
-                                                       -(indlen), (flags &
+                                                       -((int64_t)indlen), (flags &
                                                        XFS_BMAPI_RSVBLOCKS));
                                        if (error && rt)
                                                xfs_mod_incore_sb(mp,
                                                        XFS_SBS_FREXTENTS,
-                                                       extsz, (flags &
+                                                       (int64_t)extsz, (flags &
                                                        XFS_BMAPI_RSVBLOCKS));
                                        else if (error)
                                                xfs_mod_incore_sb(mp,
                                                        XFS_SBS_FDBLOCKS,
-                                                       alen, (flags &
+                                                       (int64_t)alen, (flags &
                                                        XFS_BMAPI_RSVBLOCKS));
                                }
 
@@ -5616,13 +5603,13 @@ xfs_bunmapi(
                                rtexts = XFS_FSB_TO_B(mp, del.br_blockcount);
                                do_div(rtexts, mp->m_sb.sb_rextsize);
                                xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS,
-                                               (int)rtexts, rsvd);
+                                               (int64_t)rtexts, rsvd);
                                (void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp,
                                        NULL, ip, -((long)del.br_blockcount), 0,
                                        XFS_QMOPT_RES_RTBLKS);
                        } else {
                                xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS,
-                                               (int)del.br_blockcount, rsvd);
+                                               (int64_t)del.br_blockcount, rsvd);
                                (void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp,
                                        NULL, ip, -((long)del.br_blockcount), 0,
                                        XFS_QMOPT_RES_REGBLKS);
@@ -6048,32 +6035,6 @@ xfs_bmap_eof(
 }
 
 #ifdef DEBUG
-/*
- * Check that the extents list for the inode ip is in the right order.
- */
-STATIC void
-xfs_bmap_check_extents(
-       xfs_inode_t             *ip,            /* incore inode pointer */
-       int                     whichfork)      /* data or attr fork */
-{
-       xfs_bmbt_rec_t          *ep;            /* current extent entry */
-       xfs_extnum_t            idx;            /* extent record index */
-       xfs_ifork_t             *ifp;           /* inode fork pointer */
-       xfs_extnum_t            nextents;       /* number of extents in list */
-       xfs_bmbt_rec_t          *nextp;         /* next extent entry */
-
-       ifp = XFS_IFORK_PTR(ip, whichfork);
-       ASSERT(ifp->if_flags & XFS_IFEXTENTS);
-       nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
-       ep = xfs_iext_get_ext(ifp, 0);
-       for (idx = 0; idx < nextents - 1; idx++) {
-               nextp = xfs_iext_get_ext(ifp, idx + 1);
-               xfs_btree_check_rec(XFS_BTNUM_BMAP, (void *)ep,
-                       (void *)(nextp));
-               ep = nextp;
-       }
-}
-
 STATIC
 xfs_buf_t *
 xfs_bmap_get_bp(
@@ -6156,8 +6117,7 @@ xfs_check_block(
                if (root) {
                        keyp = XFS_BMAP_BROOT_KEY_ADDR(block, i, sz);
                } else {
-                       keyp = XFS_BTREE_KEY_ADDR(mp->m_sb.sb_blocksize,
-                               xfs_bmbt, block, i, dmxr);
+                       keyp = XFS_BTREE_KEY_ADDR(xfs_bmbt, block, i);
                }
 
                if (prevp) {
@@ -6172,15 +6132,14 @@ xfs_check_block(
                if (root) {
                        pp = XFS_BMAP_BROOT_PTR_ADDR(block, i, sz);
                } else {
-                       pp = XFS_BTREE_PTR_ADDR(mp->m_sb.sb_blocksize,
-                               xfs_bmbt, block, i, dmxr);
+                       pp = XFS_BTREE_PTR_ADDR(xfs_bmbt, block, i, dmxr);
                }
                for (j = i+1; j <= be16_to_cpu(block->bb_numrecs); j++) {
                        if (root) {
                                thispa = XFS_BMAP_BROOT_PTR_ADDR(block, j, sz);
                        } else {
-                               thispa = XFS_BTREE_PTR_ADDR(mp->m_sb.sb_blocksize,
-                                       xfs_bmbt, block, j, dmxr);
+                               thispa = XFS_BTREE_PTR_ADDR(xfs_bmbt, block, j,
+                                                           dmxr);
                        }
                        if (*thispa == *pp) {
                                cmn_err(CE_WARN, "%s: thispa(%d) == pp(%d) %Ld",
@@ -6267,8 +6226,7 @@ xfs_bmap_check_leaf_extents(
                 */
 
                xfs_check_block(block, mp, 0, 0);
-               pp = XFS_BTREE_PTR_ADDR(mp->m_sb.sb_blocksize, xfs_bmbt, block,
-                       1, mp->m_bmap_dmxr[1]);
+               pp = XFS_BTREE_PTR_ADDR(xfs_bmbt, block, 1, mp->m_bmap_dmxr[1]);
                bno = be64_to_cpu(*pp);
                XFS_WANT_CORRUPTED_GOTO(XFS_FSB_SANITY_CHECK(mp, bno), error0);
                if (bp_release) {
@@ -6305,11 +6263,9 @@ xfs_bmap_check_leaf_extents(
                 * conform with the first entry in this one.
                 */
 
-               ep = XFS_BTREE_REC_ADDR(mp->m_sb.sb_blocksize, xfs_bmbt,
-                       block, 1, mp->m_bmap_dmxr[0]);
+               ep = XFS_BTREE_REC_ADDR(xfs_bmbt, block, 1);
                for (j = 1; j < num_recs; j++) {
-                       nextp = XFS_BTREE_REC_ADDR(mp->m_sb.sb_blocksize, xfs_bmbt,
-                               block, j + 1, mp->m_bmap_dmxr[0]);
+                       nextp = XFS_BTREE_REC_ADDR(xfs_bmbt, block, j + 1);
                        if (lastp) {
                                xfs_btree_check_rec(XFS_BTNUM_BMAP,
                                        (void *)lastp, (void *)ep);
@@ -6454,8 +6410,7 @@ xfs_bmap_count_tree(
                }
 
                /* Dive to the next level */
-               pp = XFS_BTREE_PTR_ADDR(mp->m_sb.sb_blocksize,
-                       xfs_bmbt, block, 1, mp->m_bmap_dmxr[1]);
+               pp = XFS_BTREE_PTR_ADDR(xfs_bmbt, block, 1, mp->m_bmap_dmxr[1]);
                bno = be64_to_cpu(*pp);
                if (unlikely((error =
                     xfs_bmap_count_tree(mp, tp, ifp, bno, level, count)) < 0)) {
@@ -6470,7 +6425,7 @@ xfs_bmap_count_tree(
                for (;;) {
                        nextbno = be64_to_cpu(block->bb_rightsib);
                        numrecs = be16_to_cpu(block->bb_numrecs);
-                       if (unlikely(xfs_bmap_disk_count_leaves(ifp, mp,
+                       if (unlikely(xfs_bmap_disk_count_leaves(ifp,
                                        0, block, numrecs, count) < 0)) {
                                xfs_trans_brelse(tp, bp);
                                XFS_ERROR_REPORT("xfs_bmap_count_tree(2)",
@@ -6518,7 +6473,6 @@ xfs_bmap_count_leaves(
 int
 xfs_bmap_disk_count_leaves(
        xfs_ifork_t             *ifp,
-       xfs_mount_t             *mp,
        xfs_extnum_t            idx,
        xfs_bmbt_block_t        *block,
        int                     numrecs,
@@ -6528,8 +6482,7 @@ xfs_bmap_disk_count_leaves(
        xfs_bmbt_rec_t  *frp;
 
        for (b = 1; b <= numrecs; b++) {
-               frp = XFS_BTREE_REC_ADDR(mp->m_sb.sb_blocksize,
-                       xfs_bmbt, block, idx + b, mp->m_bmap_dmxr[0]);
+               frp = XFS_BTREE_REC_ADDR(xfs_bmbt, block, idx + b);
                *count += xfs_bmbt_disk_get_blockcount(frp);
        }
        return 0;
index 80e93409b78dbfb7122b246487cb27e60df7b7eb..4f24c7e39b318aaab33de505336bc78ba3b41994 100644 (file)
@@ -202,7 +202,6 @@ int                                         /* error */
 xfs_bmap_finish(
        struct xfs_trans        **tp,           /* transaction pointer addr */
        xfs_bmap_free_t         *flist,         /* i/o: list extents to free */
-       xfs_fsblock_t           firstblock,     /* controlled a.g. for allocs */
        int                     *committed);    /* xact committed or not */
 
 /*
index a7b835bf870ae123b0e5839d0fc0dc51687f0326..0bf192fea3eb3fe59807b4a00cb1c0cb84670b6a 100644 (file)
@@ -678,47 +678,6 @@ error0:
        return error;
 }
 
-#ifdef DEBUG
-/*
- * Get the data from the pointed-to record.
- */
-int
-xfs_bmbt_get_rec(
-       xfs_btree_cur_t         *cur,
-       xfs_fileoff_t           *off,
-       xfs_fsblock_t           *bno,
-       xfs_filblks_t           *len,
-       xfs_exntst_t            *state,
-       int                     *stat)
-{
-       xfs_bmbt_block_t        *block;
-       xfs_buf_t               *bp;
-#ifdef DEBUG
-       int                     error;
-#endif
-       int                     ptr;
-       xfs_bmbt_rec_t          *rp;
-
-       block = xfs_bmbt_get_block(cur, 0, &bp);
-       ptr = cur->bc_ptrs[0];
-#ifdef DEBUG
-       if ((error = xfs_btree_check_lblock(cur, block, 0, bp)))
-               return error;
-#endif
-       if (ptr > be16_to_cpu(block->bb_numrecs) || ptr <= 0) {
-               *stat = 0;
-               return 0;
-       }
-       rp = XFS_BMAP_REC_IADDR(block, ptr, cur);
-       *off = xfs_bmbt_disk_get_startoff(rp);
-       *bno = xfs_bmbt_disk_get_startblock(rp);
-       *len = xfs_bmbt_disk_get_blockcount(rp);
-       *state = xfs_bmbt_disk_get_state(rp);
-       *stat = 1;
-       return 0;
-}
-#endif
-
 /*
  * Insert one record/level.  Return information to the caller
  * allowing the next level up to proceed if necessary.
@@ -1731,9 +1690,9 @@ xfs_bmdr_to_bmbt(
        rblock->bb_leftsib = cpu_to_be64(NULLDFSBNO);
        rblock->bb_rightsib = cpu_to_be64(NULLDFSBNO);
        dmxr = (int)XFS_BTREE_BLOCK_MAXRECS(dblocklen, xfs_bmdr, 0);
-       fkp = XFS_BTREE_KEY_ADDR(dblocklen, xfs_bmdr, dblock, 1, dmxr);
+       fkp = XFS_BTREE_KEY_ADDR(xfs_bmdr, dblock, 1);
        tkp = XFS_BMAP_BROOT_KEY_ADDR(rblock, 1, rblocklen);
-       fpp = XFS_BTREE_PTR_ADDR(dblocklen, xfs_bmdr, dblock, 1, dmxr);
+       fpp = XFS_BTREE_PTR_ADDR(xfs_bmdr, dblock, 1, dmxr);
        tpp = XFS_BMAP_BROOT_PTR_ADDR(rblock, 1, rblocklen);
        dmxr = be16_to_cpu(dblock->bb_numrecs);
        memcpy(tkp, fkp, sizeof(*fkp) * dmxr);
@@ -1862,7 +1821,7 @@ xfs_bmbt_delete(
  * xfs_bmbt_get_startblock, xfs_bmbt_get_blockcount and xfs_bmbt_get_state.
  */
 
-STATIC __inline__ void
+STATIC_INLINE void
 __xfs_bmbt_get_all(
                __uint64_t l0,
                __uint64_t l1,
@@ -2015,30 +1974,6 @@ xfs_bmbt_disk_get_blockcount(
        return (xfs_filblks_t)(INT_GET(r->l1, ARCH_CONVERT) & XFS_MASK64LO(21));
 }
 
-/*
- * Extract the startblock field from an on disk bmap extent record.
- */
-xfs_fsblock_t
-xfs_bmbt_disk_get_startblock(
-       xfs_bmbt_rec_t  *r)
-{
-#if XFS_BIG_BLKNOS
-       return (((xfs_fsblock_t)INT_GET(r->l0, ARCH_CONVERT) & XFS_MASK64LO(9)) << 43) |
-              (((xfs_fsblock_t)INT_GET(r->l1, ARCH_CONVERT)) >> 21);
-#else
-#ifdef DEBUG
-       xfs_dfsbno_t    b;
-
-       b = (((xfs_dfsbno_t)INT_GET(r->l0, ARCH_CONVERT) & XFS_MASK64LO(9)) << 43) |
-           (((xfs_dfsbno_t)INT_GET(r->l1, ARCH_CONVERT)) >> 21);
-       ASSERT((b >> 32) == 0 || ISNULLDSTARTBLOCK(b));
-       return (xfs_fsblock_t)b;
-#else  /* !DEBUG */
-       return (xfs_fsblock_t)(((xfs_dfsbno_t)INT_GET(r->l1, ARCH_CONVERT)) >> 21);
-#endif /* DEBUG */
-#endif /* XFS_BIG_BLKNOS */
-}
-
 /*
  * Extract the startoff field from a disk format bmap extent record.
  */
@@ -2049,17 +1984,6 @@ xfs_bmbt_disk_get_startoff(
        return ((xfs_fileoff_t)INT_GET(r->l0, ARCH_CONVERT) &
                 XFS_MASK64LO(64 - BMBT_EXNTFLAG_BITLEN)) >> 9;
 }
-
-xfs_exntst_t
-xfs_bmbt_disk_get_state(
-       xfs_bmbt_rec_t  *r)
-{
-       int     ext_flag;
-
-       ext_flag = (int)((INT_GET(r->l0, ARCH_CONVERT)) >> (64 - BMBT_EXNTFLAG_BITLEN));
-       return xfs_extent_state(xfs_bmbt_disk_get_blockcount(r),
-                               ext_flag);
-}
 #endif /* XFS_NATIVE_HOST */
 
 
@@ -2684,9 +2608,9 @@ xfs_bmbt_to_bmdr(
        dblock->bb_numrecs = rblock->bb_numrecs;
        dmxr = (int)XFS_BTREE_BLOCK_MAXRECS(dblocklen, xfs_bmdr, 0);
        fkp = XFS_BMAP_BROOT_KEY_ADDR(rblock, 1, rblocklen);
-       tkp = XFS_BTREE_KEY_ADDR(dblocklen, xfs_bmdr, dblock, 1, dmxr);
+       tkp = XFS_BTREE_KEY_ADDR(xfs_bmdr, dblock, 1);
        fpp = XFS_BMAP_BROOT_PTR_ADDR(rblock, 1, rblocklen);
-       tpp = XFS_BTREE_PTR_ADDR(dblocklen, xfs_bmdr, dblock, 1, dmxr);
+       tpp = XFS_BTREE_PTR_ADDR(xfs_bmdr, dblock, 1, dmxr);
        dmxr = be16_to_cpu(dblock->bb_numrecs);
        memcpy(tkp, fkp, sizeof(*fkp) * dmxr);
        memcpy(tpp, fpp, sizeof(*fpp) * dmxr);
index 49539de9525bc7aa71f93b553b734497c22748fb..a77b1b753d0cf5ca86c4f31dad4935100bafb691 100644 (file)
@@ -175,19 +175,11 @@ typedef struct xfs_btree_lblock xfs_bmbt_block_t;
 
 #define XFS_BUF_TO_BMBT_BLOCK(bp)      ((xfs_bmbt_block_t *)XFS_BUF_PTR(bp))
 
-#define XFS_BMAP_IBLOCK_SIZE(lev,cur)  (1 << (cur)->bc_blocklog)
 #define XFS_BMAP_RBLOCK_DSIZE(lev,cur) ((cur)->bc_private.b.forksize)
 #define XFS_BMAP_RBLOCK_ISIZE(lev,cur) \
        ((int)XFS_IFORK_PTR((cur)->bc_private.b.ip, \
                    (cur)->bc_private.b.whichfork)->if_broot_bytes)
 
-#define XFS_BMAP_BLOCK_DSIZE(lev,cur)  \
-       (((lev) == (cur)->bc_nlevels - 1 ? \
-               XFS_BMAP_RBLOCK_DSIZE(lev,cur) : XFS_BMAP_IBLOCK_SIZE(lev,cur)))
-#define XFS_BMAP_BLOCK_ISIZE(lev,cur)  \
-       (((lev) == (cur)->bc_nlevels - 1 ? \
-               XFS_BMAP_RBLOCK_ISIZE(lev,cur) : XFS_BMAP_IBLOCK_SIZE(lev,cur)))
-
 #define XFS_BMAP_BLOCK_DMAXRECS(lev,cur) \
        (((lev) == (cur)->bc_nlevels - 1 ? \
                XFS_BTREE_BLOCK_MAXRECS(XFS_BMAP_RBLOCK_DSIZE(lev,cur), \
@@ -210,37 +202,21 @@ typedef struct xfs_btree_lblock xfs_bmbt_block_t;
                                xfs_bmbt, (lev) == 0) : \
                        ((cur)->bc_mp->m_bmap_dmnr[(lev) != 0])))
 
-#define XFS_BMAP_REC_DADDR(bb,i,cur)   \
-       (XFS_BTREE_REC_ADDR(XFS_BMAP_BLOCK_DSIZE(                       \
-                       be16_to_cpu((bb)->bb_level), cur),              \
-                       xfs_bmbt, bb, i, XFS_BMAP_BLOCK_DMAXRECS(       \
-                               be16_to_cpu((bb)->bb_level), cur)))
-#define XFS_BMAP_REC_IADDR(bb,i,cur)   \
-       (XFS_BTREE_REC_ADDR(XFS_BMAP_BLOCK_ISIZE(                       \
-                       be16_to_cpu((bb)->bb_level), cur),              \
-                       xfs_bmbt, bb, i, XFS_BMAP_BLOCK_IMAXRECS(       \
-                               be16_to_cpu((bb)->bb_level), cur)))
+#define XFS_BMAP_REC_DADDR(bb,i,cur)   (XFS_BTREE_REC_ADDR(xfs_bmbt, bb, i))
+
+#define XFS_BMAP_REC_IADDR(bb,i,cur)   (XFS_BTREE_REC_ADDR(xfs_bmbt, bb, i))
 
 #define XFS_BMAP_KEY_DADDR(bb,i,cur)   \
-       (XFS_BTREE_KEY_ADDR(XFS_BMAP_BLOCK_DSIZE(                       \
-                       be16_to_cpu((bb)->bb_level), cur),              \
-                       xfs_bmbt, bb, i, XFS_BMAP_BLOCK_DMAXRECS(       \
-                               be16_to_cpu((bb)->bb_level), cur)))
+       (XFS_BTREE_KEY_ADDR(xfs_bmbt, bb, i))
+
 #define XFS_BMAP_KEY_IADDR(bb,i,cur)   \
-       (XFS_BTREE_KEY_ADDR(XFS_BMAP_BLOCK_ISIZE(                       \
-                       be16_to_cpu((bb)->bb_level), cur),              \
-                       xfs_bmbt, bb, i, XFS_BMAP_BLOCK_IMAXRECS(       \
-                               be16_to_cpu((bb)->bb_level), cur)))
+       (XFS_BTREE_KEY_ADDR(xfs_bmbt, bb, i))
 
 #define XFS_BMAP_PTR_DADDR(bb,i,cur)   \
-       (XFS_BTREE_PTR_ADDR(XFS_BMAP_BLOCK_DSIZE(                       \
-                       be16_to_cpu((bb)->bb_level), cur),              \
-                       xfs_bmbt, bb, i, XFS_BMAP_BLOCK_DMAXRECS(       \
+       (XFS_BTREE_PTR_ADDR(xfs_bmbt, bb, i, XFS_BMAP_BLOCK_DMAXRECS(   \
                                be16_to_cpu((bb)->bb_level), cur)))
 #define XFS_BMAP_PTR_IADDR(bb,i,cur)   \
-       (XFS_BTREE_PTR_ADDR(XFS_BMAP_BLOCK_ISIZE(                       \
-                       be16_to_cpu((bb)->bb_level), cur),              \
-                       xfs_bmbt, bb, i, XFS_BMAP_BLOCK_IMAXRECS(       \
+       (XFS_BTREE_PTR_ADDR(xfs_bmbt, bb, i, XFS_BMAP_BLOCK_IMAXRECS(   \
                                be16_to_cpu((bb)->bb_level), cur)))
 
 /*
@@ -248,11 +224,11 @@ typedef struct xfs_btree_lblock xfs_bmbt_block_t;
  * we don't have a cursor.
  */
 #define XFS_BMAP_BROOT_REC_ADDR(bb,i,sz) \
-       (XFS_BTREE_REC_ADDR(sz,xfs_bmbt,bb,i,XFS_BMAP_BROOT_MAXRECS(sz)))
+       (XFS_BTREE_REC_ADDR(xfs_bmbt,bb,i))
 #define XFS_BMAP_BROOT_KEY_ADDR(bb,i,sz) \
-       (XFS_BTREE_KEY_ADDR(sz,xfs_bmbt,bb,i,XFS_BMAP_BROOT_MAXRECS(sz)))
+       (XFS_BTREE_KEY_ADDR(xfs_bmbt,bb,i))
 #define XFS_BMAP_BROOT_PTR_ADDR(bb,i,sz) \
-       (XFS_BTREE_PTR_ADDR(sz,xfs_bmbt,bb,i,XFS_BMAP_BROOT_MAXRECS(sz)))
+       (XFS_BTREE_PTR_ADDR(xfs_bmbt,bb,i,XFS_BMAP_BROOT_MAXRECS(sz)))
 
 #define XFS_BMAP_BROOT_NUMRECS(bb)     be16_to_cpu((bb)->bb_numrecs)
 #define XFS_BMAP_BROOT_MAXRECS(sz)     XFS_BTREE_BLOCK_MAXRECS(sz,xfs_bmbt,0)
@@ -315,15 +291,11 @@ extern xfs_exntst_t xfs_bmbt_get_state(xfs_bmbt_rec_t *r);
 
 #ifndef XFS_NATIVE_HOST
 extern void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s);
-extern xfs_exntst_t xfs_bmbt_disk_get_state(xfs_bmbt_rec_t *r);
 extern xfs_filblks_t xfs_bmbt_disk_get_blockcount(xfs_bmbt_rec_t *r);
-extern xfs_fsblock_t xfs_bmbt_disk_get_startblock(xfs_bmbt_rec_t *r);
 extern xfs_fileoff_t xfs_bmbt_disk_get_startoff(xfs_bmbt_rec_t *r);
 #else
 #define xfs_bmbt_disk_get_all(r, s)    xfs_bmbt_get_all(r, s)
-#define xfs_bmbt_disk_get_state(r)     xfs_bmbt_get_state(r)
 #define xfs_bmbt_disk_get_blockcount(r)        xfs_bmbt_get_blockcount(r)
-#define xfs_bmbt_disk_get_startblock(r)        xfs_bmbt_get_blockcount(r)
 #define xfs_bmbt_disk_get_startoff(r)  xfs_bmbt_get_startoff(r)
 #endif /* XFS_NATIVE_HOST */
 
@@ -364,15 +336,6 @@ extern void xfs_bmbt_to_bmdr(xfs_bmbt_block_t *, int, xfs_bmdr_block_t *, int);
 extern int xfs_bmbt_update(struct xfs_btree_cur *, xfs_fileoff_t,
                                xfs_fsblock_t, xfs_filblks_t, xfs_exntst_t);
 
-#ifdef DEBUG
-/*
- * Get the data from the pointed-to record.
- */
-extern int xfs_bmbt_get_rec(struct xfs_btree_cur *, xfs_fileoff_t *,
-                               xfs_fsblock_t *, xfs_filblks_t *,
-                               xfs_exntst_t *, int *);
-#endif
-
 #endif /* __KERNEL__ */
 
 #endif /* __XFS_BMAP_BTREE_H__ */
index 892b06c542637219d46be0f67798fa0e545fd43d..4e27d55a1e7302130b092c5b388f6c24b68a9d83 100644 (file)
@@ -122,13 +122,13 @@ extern const __uint32_t   xfs_magics[];
  * Given block size, type prefix, block pointer, and index of requested entry
  * (first entry numbered 1).
  */
-#define        XFS_BTREE_REC_ADDR(bsz,t,bb,i,mxr)      \
+#define        XFS_BTREE_REC_ADDR(t,bb,i)      \
        ((t ## _rec_t *)((char *)(bb) + sizeof(t ## _block_t) + \
         ((i) - 1) * sizeof(t ## _rec_t)))
-#define        XFS_BTREE_KEY_ADDR(bsz,t,bb,i,mxr)      \
+#define        XFS_BTREE_KEY_ADDR(t,bb,i)      \
        ((t ## _key_t *)((char *)(bb) + sizeof(t ## _block_t) + \
         ((i) - 1) * sizeof(t ## _key_t)))
-#define        XFS_BTREE_PTR_ADDR(bsz,t,bb,i,mxr)      \
+#define        XFS_BTREE_PTR_ADDR(t,bb,i,mxr)  \
        ((t ## _ptr_t *)((char *)(bb) + sizeof(t ## _block_t) + \
         (mxr) * sizeof(t ## _key_t) + ((i) - 1) * sizeof(t ## _ptr_t)))
 
index 7a55c248ea706a405fa4eddd1fb8d80a5f0c4d0b..6c1bddc04e316557e47d9cf148468791c9b23e61 100644 (file)
@@ -660,7 +660,7 @@ xfs_buf_item_committing(xfs_buf_log_item_t *bip, xfs_lsn_t commit_lsn)
 /*
  * This is the ops vector shared by all buf log items.
  */
-STATIC struct xfs_item_ops xfs_buf_item_ops = {
+static struct xfs_item_ops xfs_buf_item_ops = {
        .iop_size       = (uint(*)(xfs_log_item_t*))xfs_buf_item_size,
        .iop_format     = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
                                        xfs_buf_item_format,
index 07c708c2b529d4dc988880f5ea8f28f9a8db68e0..d7e13614306635bfae1f31bfbd1728e0ff3c1e36 100644 (file)
 /*
  * This is the structure used to lay out a buf log item in the
  * log.  The data map describes which 128 byte chunks of the buffer
- * have been logged.  This structure works only on buffers that
- * reside up to the first TB in the filesystem.  These buffers are
- * generated only by pre-6.2 systems and are known as XFS_LI_6_1_BUF.
- */
-typedef struct xfs_buf_log_format_v1 {
-       unsigned short  blf_type;       /* buf log item type indicator */
-       unsigned short  blf_size;       /* size of this item */
-       __int32_t       blf_blkno;      /* starting blkno of this buf */
-       ushort          blf_flags;      /* misc state */
-       ushort          blf_len;        /* number of blocks in this buf */
-       unsigned int    blf_map_size;   /* size of data bitmap in words */
-       unsigned int    blf_data_map[1];/* variable size bitmap of */
-                                       /*   regions of buffer in this item */
-} xfs_buf_log_format_v1_t;
-
-/*
- * This is a form of the above structure with a 64 bit blkno field.
+ * have been logged.
  * For 6.2 and beyond, this is XFS_LI_BUF.  We use this to log everything.
  */
 typedef struct xfs_buf_log_format_t {
diff --git a/fs/xfs/xfs_cap.h b/fs/xfs/xfs_cap.h
deleted file mode 100644 (file)
index 7a0e482..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
- * 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.
- *
- * This program is distributed in the hope that it would 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 the Free Software Foundation,
- * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-#ifndef __XFS_CAP_H__
-#define __XFS_CAP_H__
-
-/*
- * Capabilities
- */
-typedef __uint64_t xfs_cap_value_t;
-
-typedef struct xfs_cap_set {
-       xfs_cap_value_t cap_effective;  /* use in capability checks */
-       xfs_cap_value_t cap_permitted;  /* combined with file attrs */
-       xfs_cap_value_t cap_inheritable;/* pass through exec */
-} xfs_cap_set_t;
-
-/* On-disk XFS extended attribute names */
-#define SGI_CAP_FILE   "SGI_CAP_FILE"
-#define SGI_CAP_FILE_SIZE      (sizeof(SGI_CAP_FILE)-1)
-#define SGI_CAP_LINUX  "SGI_CAP_LINUX"
-#define SGI_CAP_LINUX_SIZE     (sizeof(SGI_CAP_LINUX)-1)
-
-/*
- * For Linux, we take the bitfields directly from capability.h
- * and no longer attempt to keep this attribute ondisk compatible
- * with IRIX.  Since this attribute is only set on executables,
- * it just doesn't make much sense to try.  We do use a different
- * named attribute though, to avoid confusion.
- */
-
-#ifdef __KERNEL__
-
-#ifdef CONFIG_FS_POSIX_CAP
-
-#include <linux/posix_cap_xattr.h>
-
-struct bhv_vnode;
-
-extern int xfs_cap_vhascap(struct bhv_vnode *);
-extern int xfs_cap_vset(struct bhv_vnode *, void *, size_t);
-extern int xfs_cap_vget(struct bhv_vnode *, void *, size_t);
-extern int xfs_cap_vremove(struct bhv_vnode *);
-
-#define _CAP_EXISTS            xfs_cap_vhascap
-
-#else
-#define xfs_cap_vset(v,p,sz)   (-EOPNOTSUPP)
-#define xfs_cap_vget(v,p,sz)   (-EOPNOTSUPP)
-#define xfs_cap_vremove(v)     (-EOPNOTSUPP)
-#define _CAP_EXISTS            (NULL)
-#endif
-
-#endif /* __KERNEL__ */
-
-#endif  /* __XFS_CAP_H__ */
index a68bc1f1a313c8862106adedf30ef84d65b92cd8..aea37df4aa629361064f36f8e388d0a244248022 100644 (file)
@@ -1090,8 +1090,7 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result)
                if (blk->magic == XFS_DA_NODE_MAGIC) {
                        node = blk->bp->data;
                        max = be16_to_cpu(node->hdr.count);
-                       btreehashval = node->btree[max-1].hashval;
-                       blk->hashval = be32_to_cpu(btreehashval);
+                       blk->hashval = be32_to_cpu(node->btree[max-1].hashval);
 
                        /*
                         * Binary search.  (note: small blocks will skip loop)
@@ -2166,21 +2165,6 @@ xfs_da_reada_buf(
                return rval;
 }
 
-/*
- * Calculate the number of bits needed to hold i different values.
- */
-uint
-xfs_da_log2_roundup(uint i)
-{
-       uint rval;
-
-       for (rval = 0; rval < NBBY * sizeof(i); rval++) {
-               if ((1 << rval) >= i)
-                       break;
-       }
-       return(rval);
-}
-
 kmem_zone_t *xfs_da_state_zone;        /* anchor for state struct zone */
 kmem_zone_t *xfs_dabuf_zone;           /* dabuf zone */
 
index 4ab865ec8b82e18ef91f048c1605f85f405c4899..44dabf02f2a3ca99c844101fa213a000949fed0f 100644 (file)
@@ -249,7 +249,6 @@ int xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno,
                                          xfs_dabuf_t *dead_buf);
 
 uint xfs_da_hashname(const uchar_t *name_string, int name_length);
-uint xfs_da_log2_roundup(uint i);
 xfs_da_state_t *xfs_da_state_alloc(void);
 void xfs_da_state_free(xfs_da_state_t *state);
 
index 50d0faea371d26502de68c8aa86c4fe86f0b5a70..b847e6a7a3f03ba3a5e0f8e200414e97347e0609 100644 (file)
@@ -41,7 +41,6 @@
 #include "xfs_itable.h"
 #include "xfs_dfrag.h"
 #include "xfs_error.h"
-#include "xfs_mac.h"
 #include "xfs_rw.h"
 
 /*
index b95681b03d816087d9eb94a4aada2f3fe0f952de..b1af54464f0078006146cc790d664a6989f68350 100644 (file)
@@ -131,32 +131,6 @@ xfs_errortag_add(int error_tag, xfs_mount_t *mp)
        return 1;
 }
 
-int
-xfs_errortag_clear(int error_tag, xfs_mount_t *mp)
-{
-       int i;
-       int64_t fsid;
-
-       memcpy(&fsid, mp->m_fixedfsid, sizeof(xfs_fsid_t));
-
-       for (i = 0; i < XFS_NUM_INJECT_ERROR; i++) {
-               if (xfs_etest_fsid[i] == fsid && xfs_etest[i] == error_tag) {
-                       xfs_etest[i] = 0;
-                       xfs_etest_fsid[i] = 0LL;
-                       kmem_free(xfs_etest_fsname[i],
-                                 strlen(xfs_etest_fsname[i]) + 1);
-                       xfs_etest_fsname[i] = NULL;
-                       cmn_err(CE_WARN, "Cleared XFS error tag #%d",
-                               error_tag);
-                       return 0;
-               }
-       }
-
-       cmn_err(CE_WARN, "XFS error tag %d not on", error_tag);
-
-       return 1;
-}
-
 int
 xfs_errortag_clearall_umount(int64_t fsid, char *fsname, int loud)
 {
index 0893e16b7d834a20a7cf9ef96189336fabcbaa90..5599ada456a128798f1593609819119085a9b40e 100644 (file)
@@ -144,7 +144,6 @@ extern void xfs_error_test_init(void);
 #endif /* __ANSI_CPP__ */
 
 extern int xfs_errortag_add(int error_tag, xfs_mount_t *mp);
-extern int xfs_errortag_clear(int error_tag, xfs_mount_t *mp);
 extern int xfs_errortag_clearall(xfs_mount_t *mp);
 extern int xfs_errortag_clearall_umount(int64_t fsid, char *fsname, int loud);
 #else
@@ -180,6 +179,6 @@ extern void xfs_fs_cmn_err(int level, struct xfs_mount *mp, char *fmt, ...);
        xfs_fs_cmn_err(level, mp, fmt "  Unmount and run xfs_repair.", ## args)
 
 #define xfs_fs_mount_cmn_err(f, fmt, args...) \
-       ((f & XFS_MFSI_QUIET)? cmn_err(CE_WARN, "XFS: " fmt, ## args) : (void)0)
+       ((f & XFS_MFSI_QUIET)? (void)0 : cmn_err(CE_WARN, "XFS: " fmt, ## args))
 
 #endif /* __XFS_ERROR_H__ */
index 6dba78199faf54e40fcc36fcdf9a61cbe865b436..3b14427ee123238d04dbc62fd6c2aa61b0eec33c 100644 (file)
@@ -227,7 +227,7 @@ xfs_efi_item_committing(xfs_efi_log_item_t *efip, xfs_lsn_t lsn)
 /*
  * This is the ops vector shared by all efi log items.
  */
-STATIC struct xfs_item_ops xfs_efi_item_ops = {
+static struct xfs_item_ops xfs_efi_item_ops = {
        .iop_size       = (uint(*)(xfs_log_item_t*))xfs_efi_item_size,
        .iop_format     = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
                                        xfs_efi_item_format,
@@ -525,7 +525,7 @@ xfs_efd_item_committing(xfs_efd_log_item_t *efip, xfs_lsn_t lsn)
 /*
  * This is the ops vector shared by all efd log items.
  */
-STATIC struct xfs_item_ops xfs_efd_item_ops = {
+static struct xfs_item_ops xfs_efd_item_ops = {
        .iop_size       = (uint(*)(xfs_log_item_t*))xfs_efd_item_size,
        .iop_format     = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
                                        xfs_efd_item_format,
index c064e72ada9e2beaa32f5d7d43525901de91efa0..32c37c1c47ab341fed758b6e5fb8bea04742906d 100644 (file)
@@ -250,8 +250,7 @@ xfs_growfs_data_private(
                block->bb_numrecs = cpu_to_be16(1);
                block->bb_leftsib = cpu_to_be32(NULLAGBLOCK);
                block->bb_rightsib = cpu_to_be32(NULLAGBLOCK);
-               arec = XFS_BTREE_REC_ADDR(mp->m_sb.sb_blocksize, xfs_alloc,
-                       block, 1, mp->m_alloc_mxr[0]);
+               arec = XFS_BTREE_REC_ADDR(xfs_alloc, block, 1);
                arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp));
                arec->ar_blockcount = cpu_to_be32(
                        agsize - be32_to_cpu(arec->ar_startblock));
@@ -272,8 +271,7 @@ xfs_growfs_data_private(
                block->bb_numrecs = cpu_to_be16(1);
                block->bb_leftsib = cpu_to_be32(NULLAGBLOCK);
                block->bb_rightsib = cpu_to_be32(NULLAGBLOCK);
-               arec = XFS_BTREE_REC_ADDR(mp->m_sb.sb_blocksize, xfs_alloc,
-                       block, 1, mp->m_alloc_mxr[0]);
+               arec = XFS_BTREE_REC_ADDR(xfs_alloc, block, 1);
                arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp));
                arec->ar_blockcount = cpu_to_be32(
                        agsize - be32_to_cpu(arec->ar_startblock));
@@ -460,7 +458,7 @@ xfs_fs_counts(
 {
        unsigned long   s;
 
-       xfs_icsb_sync_counters_lazy(mp);
+       xfs_icsb_sync_counters_flags(mp, XFS_ICSB_LAZY_COUNT);
        s = XFS_SB_LOCK(mp);
        cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp);
        cnt->freertx = mp->m_sb.sb_frextents;
@@ -491,7 +489,7 @@ xfs_reserve_blocks(
        __uint64_t              *inval,
        xfs_fsop_resblks_t      *outval)
 {
-       __int64_t               lcounter, delta;
+       __int64_t               lcounter, delta, fdblks_delta;
        __uint64_t              request;
        unsigned long           s;
 
@@ -504,17 +502,35 @@ xfs_reserve_blocks(
        }
 
        request = *inval;
+
+       /*
+        * With per-cpu counters, this becomes an interesting
+        * problem. we needto work out if we are freeing or allocation
+        * blocks first, then we can do the modification as necessary.
+        *
+        * We do this under the XFS_SB_LOCK so that if we are near
+        * ENOSPC, we will hold out any changes while we work out
+        * what to do. This means that the amount of free space can
+        * change while we do this, so we need to retry if we end up
+        * trying to reserve more space than is available.
+        *
+        * We also use the xfs_mod_incore_sb() interface so that we
+        * don't have to care about whether per cpu counter are
+        * enabled, disabled or even compiled in....
+        */
+retry:
        s = XFS_SB_LOCK(mp);
+       xfs_icsb_sync_counters_flags(mp, XFS_ICSB_SB_LOCKED);
 
        /*
         * If our previous reservation was larger than the current value,
         * then move any unused blocks back to the free pool.
         */
-
+       fdblks_delta = 0;
        if (mp->m_resblks > request) {
                lcounter = mp->m_resblks_avail - request;
                if (lcounter  > 0) {            /* release unused blocks */
-                       mp->m_sb.sb_fdblocks += lcounter;
+                       fdblks_delta = lcounter;
                        mp->m_resblks_avail -= lcounter;
                }
                mp->m_resblks = request;
@@ -522,24 +538,50 @@ xfs_reserve_blocks(
                __int64_t       free;
 
                free =  mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp);
+               if (!free)
+                       goto out; /* ENOSPC and fdblks_delta = 0 */
+
                delta = request - mp->m_resblks;
                lcounter = free - delta;
                if (lcounter < 0) {
                        /* We can't satisfy the request, just get what we can */
                        mp->m_resblks += free;
                        mp->m_resblks_avail += free;
+                       fdblks_delta = -free;
                        mp->m_sb.sb_fdblocks = XFS_ALLOC_SET_ASIDE(mp);
                } else {
+                       fdblks_delta = -delta;
                        mp->m_sb.sb_fdblocks =
                                lcounter + XFS_ALLOC_SET_ASIDE(mp);
                        mp->m_resblks = request;
                        mp->m_resblks_avail += delta;
                }
        }
-
+out:
        outval->resblks = mp->m_resblks;
        outval->resblks_avail = mp->m_resblks_avail;
        XFS_SB_UNLOCK(mp, s);
+
+       if (fdblks_delta) {
+               /*
+                * If we are putting blocks back here, m_resblks_avail is
+                * already at it's max so this will put it in the free pool.
+                *
+                * If we need space, we'll either succeed in getting it
+                * from the free block count or we'll get an enospc. If
+                * we get a ENOSPC, it means things changed while we were
+                * calculating fdblks_delta and so we should try again to
+                * see if there is anything left to reserve.
+                *
+                * Don't set the reserved flag here - we don't want to reserve
+                * the extra reserve blocks from the reserve.....
+                */
+               int error;
+               error = xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, fdblks_delta, 0);
+               if (error == ENOSPC)
+                       goto retry;
+       }
+
        return 0;
 }
 
index a446e5a115c6bad4f60ece30a66d325f7da6a41f..b5feb3e77116258a21eff655dc62304951fb35d2 100644 (file)
@@ -342,7 +342,7 @@ xfs_ialloc_ag_alloc(
        return 0;
 }
 
-STATIC __inline xfs_agnumber_t
+STATIC_INLINE xfs_agnumber_t
 xfs_ialloc_next_ag(
        xfs_mount_t     *mp)
 {
index 2c0e49893ff72731a06d51f81ea216b061014fd7..bf8e9aff272e3765e3ebbdfe39d0962ae68e594e 100644 (file)
@@ -89,7 +89,6 @@ typedef       struct xfs_btree_sblock xfs_inobt_block_t;
 /*
  * Real block structures have a size equal to the disk block size.
  */
-#define        XFS_INOBT_BLOCK_SIZE(lev,cur)   (1 << (cur)->bc_blocklog)
 #define        XFS_INOBT_BLOCK_MAXRECS(lev,cur) ((cur)->bc_mp->m_inobt_mxr[lev != 0])
 #define        XFS_INOBT_BLOCK_MINRECS(lev,cur) ((cur)->bc_mp->m_inobt_mnr[lev != 0])
 #define        XFS_INOBT_IS_LAST_REC(cur)      \
@@ -110,14 +109,13 @@ typedef   struct xfs_btree_sblock xfs_inobt_block_t;
  * Record, key, and pointer address macros for btree blocks.
  */
 #define XFS_INOBT_REC_ADDR(bb,i,cur) \
-       (XFS_BTREE_REC_ADDR(XFS_INOBT_BLOCK_SIZE(0,cur), xfs_inobt, bb, \
-                               i, XFS_INOBT_BLOCK_MAXRECS(0, cur)))
+       (XFS_BTREE_REC_ADDR(xfs_inobt, bb, i))
+
 #define        XFS_INOBT_KEY_ADDR(bb,i,cur) \
-       (XFS_BTREE_KEY_ADDR(XFS_INOBT_BLOCK_SIZE(1,cur), xfs_inobt, bb, \
-                               i, XFS_INOBT_BLOCK_MAXRECS(1, cur)))
+       (XFS_BTREE_KEY_ADDR(xfs_inobt, bb, i))
 
 #define        XFS_INOBT_PTR_ADDR(bb,i,cur) \
-       (XFS_BTREE_PTR_ADDR(XFS_INOBT_BLOCK_SIZE(1,cur), xfs_inobt, bb, \
+       (XFS_BTREE_PTR_ADDR(xfs_inobt, bb, \
                                i, XFS_INOBT_BLOCK_MAXRECS(1, cur)))
 
 /*
index 44dfac5212856567195068f9570e65f8857709c5..3da9829c19d5e80af53be627dc8b5b1a0b594ee0 100644 (file)
@@ -47,7 +47,6 @@
 #include "xfs_utils.h"
 #include "xfs_dir2_trace.h"
 #include "xfs_quota.h"
-#include "xfs_mac.h"
 #include "xfs_acl.h"
 
 
@@ -1699,8 +1698,7 @@ xfs_itruncate_finish(
                 * Duplicate the transaction that has the permanent
                 * reservation and commit the old transaction.
                 */
-               error = xfs_bmap_finish(tp, &free_list, first_block,
-                                       &committed);
+               error = xfs_bmap_finish(tp, &free_list, &committed);
                ntp = *tp;
                if (error) {
                        /*
@@ -1810,7 +1808,7 @@ xfs_igrow_start(
         * and any blocks between the old and new file sizes.
         */
        error = xfs_zero_eof(XFS_ITOV(ip), &ip->i_iocore, new_size,
-                            ip->i_d.di_size, new_size);
+                            ip->i_d.di_size);
        return error;
 }
 
@@ -2125,7 +2123,7 @@ xfs_iunlink_remove(
        return 0;
 }
 
-static __inline__ int xfs_inode_clean(xfs_inode_t *ip)
+STATIC_INLINE int xfs_inode_clean(xfs_inode_t *ip)
 {
        return (((ip->i_itemp == NULL) ||
                !(ip->i_itemp->ili_format.ilf_fields & XFS_ILOG_ALL)) &&
@@ -2707,10 +2705,24 @@ xfs_idestroy(
        ktrace_free(ip->i_dir_trace);
 #endif
        if (ip->i_itemp) {
-               /* XXXdpd should be able to assert this but shutdown
-                * is leaving the AIL behind. */
-               ASSERT(((ip->i_itemp->ili_item.li_flags & XFS_LI_IN_AIL) == 0) ||
-                      XFS_FORCED_SHUTDOWN(ip->i_mount));
+               /*
+                * Only if we are shutting down the fs will we see an
+                * inode still in the AIL. If it is there, we should remove
+                * it to prevent a use-after-free from occurring.
+                */
+               xfs_mount_t     *mp = ip->i_mount;
+               xfs_log_item_t  *lip = &ip->i_itemp->ili_item;
+               int             s;
+
+               ASSERT(((lip->li_flags & XFS_LI_IN_AIL) == 0) ||
+                                      XFS_FORCED_SHUTDOWN(ip->i_mount));
+               if (lip->li_flags & XFS_LI_IN_AIL) {
+                       AIL_LOCK(mp, s);
+                       if (lip->li_flags & XFS_LI_IN_AIL)
+                               xfs_trans_delete_ail(mp, lip, s);
+                       else
+                               AIL_UNLOCK(mp, s);
+               }
                xfs_inode_item_destroy(ip);
        }
        kmem_zone_free(xfs_inode_zone, ip);
index a7a92251eb564d84c3898d407b01b04baf7c673f..565d470a6b4a074e1b17bd422eebd53005e2c146 100644 (file)
@@ -887,7 +887,7 @@ xfs_inode_item_committing(
 /*
  * This is the ops vector shared by all buf log items.
  */
-STATIC struct xfs_item_ops xfs_inode_item_ops = {
+static struct xfs_item_ops xfs_inode_item_ops = {
        .iop_size       = (uint(*)(xfs_log_item_t*))xfs_inode_item_size,
        .iop_format     = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*))
                                        xfs_inode_item_format,
index 19655124da782299a409eee8bb78ed26f676ceae..cc6a7b5a99129226e91c123429f83e78bd42ab66 100644 (file)
@@ -43,8 +43,6 @@
 #include "xfs_itable.h"
 #include "xfs_rw.h"
 #include "xfs_acl.h"
-#include "xfs_cap.h"
-#include "xfs_mac.h"
 #include "xfs_attr.h"
 #include "xfs_buf_item.h"
 #include "xfs_trans_space.h"
@@ -542,7 +540,7 @@ xfs_iomap_write_direct(
        /*
         * Complete the transaction
         */
-       error = xfs_bmap_finish(&tp, &free_list, firstfsb, &committed);
+       error = xfs_bmap_finish(&tp, &free_list, &committed);
        if (error)
                goto error0;
        error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES, NULL);
@@ -838,8 +836,7 @@ xfs_iomap_write_allocate(
                        if (error)
                                goto trans_cancel;
 
-                       error = xfs_bmap_finish(&tp, &free_list,
-                                       first_block, &committed);
+                       error = xfs_bmap_finish(&tp, &free_list, &committed);
                        if (error)
                                goto trans_cancel;
 
@@ -947,8 +944,7 @@ xfs_iomap_write_unwritten(
                if (error)
                        goto error_on_bmapi_transaction;
 
-               error = xfs_bmap_finish(&(tp), &(free_list),
-                               firstfsb, &committed);
+               error = xfs_bmap_finish(&(tp), &(free_list), &committed);
                if (error)
                        goto error_on_bmapi_transaction;
 
index 3cb678e3a132997804998f7dbfea787b4a75a15a..ca74d3f5910e75cd4810a083651c7073b71ddb3b 100644 (file)
@@ -1514,7 +1514,6 @@ xlog_recover_reorder_trans(
 {
        xlog_recover_item_t     *first_item, *itemq, *itemq_next;
        xfs_buf_log_format_t    *buf_f;
-       xfs_buf_log_format_v1_t *obuf_f;
        ushort                  flags = 0;
 
        first_item = itemq = trans->r_itemq;
@@ -1522,29 +1521,16 @@ xlog_recover_reorder_trans(
        do {
                itemq_next = itemq->ri_next;
                buf_f = (xfs_buf_log_format_t *)itemq->ri_buf[0].i_addr;
-               switch (ITEM_TYPE(itemq)) {
-               case XFS_LI_BUF:
-                       flags = buf_f->blf_flags;
-                       break;
-               case XFS_LI_6_1_BUF:
-               case XFS_LI_5_3_BUF:
-                       obuf_f = (xfs_buf_log_format_v1_t*)buf_f;
-                       flags = obuf_f->blf_flags;
-                       break;
-               }
 
                switch (ITEM_TYPE(itemq)) {
                case XFS_LI_BUF:
-               case XFS_LI_6_1_BUF:
-               case XFS_LI_5_3_BUF:
+                       flags = buf_f->blf_flags;
                        if (!(flags & XFS_BLI_CANCEL)) {
                                xlog_recover_insert_item_frontq(&trans->r_itemq,
                                                                itemq);
                                break;
                        }
                case XFS_LI_INODE:
-               case XFS_LI_6_1_INODE:
-               case XFS_LI_5_3_INODE:
                case XFS_LI_DQUOT:
                case XFS_LI_QUOTAOFF:
                case XFS_LI_EFD:
@@ -1583,7 +1569,6 @@ xlog_recover_do_buffer_pass1(
        xfs_buf_cancel_t        *nextp;
        xfs_buf_cancel_t        *prevp;
        xfs_buf_cancel_t        **bucket;
-       xfs_buf_log_format_v1_t *obuf_f;
        xfs_daddr_t             blkno = 0;
        uint                    len = 0;
        ushort                  flags = 0;
@@ -1594,13 +1579,6 @@ xlog_recover_do_buffer_pass1(
                len = buf_f->blf_len;
                flags = buf_f->blf_flags;
                break;
-       case XFS_LI_6_1_BUF:
-       case XFS_LI_5_3_BUF:
-               obuf_f = (xfs_buf_log_format_v1_t*)buf_f;
-               blkno = (xfs_daddr_t) obuf_f->blf_blkno;
-               len = obuf_f->blf_len;
-               flags = obuf_f->blf_flags;
-               break;
        }
 
        /*
@@ -1746,7 +1724,6 @@ xlog_recover_do_buffer_pass2(
        xlog_t                  *log,
        xfs_buf_log_format_t    *buf_f)
 {
-       xfs_buf_log_format_v1_t *obuf_f;
        xfs_daddr_t             blkno = 0;
        ushort                  flags = 0;
        uint                    len = 0;
@@ -1757,13 +1734,6 @@ xlog_recover_do_buffer_pass2(
                flags = buf_f->blf_flags;
                len = buf_f->blf_len;
                break;
-       case XFS_LI_6_1_BUF:
-       case XFS_LI_5_3_BUF:
-               obuf_f = (xfs_buf_log_format_v1_t*)buf_f;
-               blkno = (xfs_daddr_t) obuf_f->blf_blkno;
-               flags = obuf_f->blf_flags;
-               len = (xfs_daddr_t) obuf_f->blf_len;
-               break;
        }
 
        return xlog_check_buffer_cancelled(log, blkno, len, flags);
@@ -1799,7 +1769,6 @@ xlog_recover_do_inode_buffer(
        int                     inodes_per_buf;
        xfs_agino_t             *logged_nextp;
        xfs_agino_t             *buffer_nextp;
-       xfs_buf_log_format_v1_t *obuf_f;
        unsigned int            *data_map = NULL;
        unsigned int            map_size = 0;
 
@@ -1808,12 +1777,6 @@ xlog_recover_do_inode_buffer(
                data_map = buf_f->blf_data_map;
                map_size = buf_f->blf_map_size;
                break;
-       case XFS_LI_6_1_BUF:
-       case XFS_LI_5_3_BUF:
-               obuf_f = (xfs_buf_log_format_v1_t*)buf_f;
-               data_map = obuf_f->blf_data_map;
-               map_size = obuf_f->blf_map_size;
-               break;
        }
        /*
         * Set the variables corresponding to the current region to
@@ -1912,7 +1875,6 @@ xlog_recover_do_reg_buffer(
        int                     i;
        int                     bit;
        int                     nbits;
-       xfs_buf_log_format_v1_t *obuf_f;
        unsigned int            *data_map = NULL;
        unsigned int            map_size = 0;
        int                     error;
@@ -1922,12 +1884,6 @@ xlog_recover_do_reg_buffer(
                data_map = buf_f->blf_data_map;
                map_size = buf_f->blf_map_size;
                break;
-       case XFS_LI_6_1_BUF:
-       case XFS_LI_5_3_BUF:
-               obuf_f = (xfs_buf_log_format_v1_t*)buf_f;
-               data_map = obuf_f->blf_data_map;
-               map_size = obuf_f->blf_map_size;
-               break;
        }
        bit = 0;
        i = 1;  /* 0 is the buf format structure */
@@ -2160,7 +2116,6 @@ xlog_recover_do_buffer_trans(
        int                     pass)
 {
        xfs_buf_log_format_t    *buf_f;
-       xfs_buf_log_format_v1_t *obuf_f;
        xfs_mount_t             *mp;
        xfs_buf_t               *bp;
        int                     error;
@@ -2197,13 +2152,6 @@ xlog_recover_do_buffer_trans(
                len = buf_f->blf_len;
                flags = buf_f->blf_flags;
                break;
-       case XFS_LI_6_1_BUF:
-       case XFS_LI_5_3_BUF:
-               obuf_f = (xfs_buf_log_format_v1_t*)buf_f;
-               blkno = obuf_f->blf_blkno;
-               len = obuf_f->blf_len;
-               flags = obuf_f->blf_flags;
-               break;
        default:
                xfs_fs_cmn_err(CE_ALERT, log->l_mp,
                        "xfs_log_recover: unknown buffer type 0x%x, logdev %s",
@@ -2830,9 +2778,7 @@ xlog_recover_do_trans(
                 * where xfs_daddr_t is 32-bits but mount will warn us
                 * off a > 1 TB filesystem before we get here.
                 */
-               if ((ITEM_TYPE(item) == XFS_LI_BUF) ||
-                   (ITEM_TYPE(item) == XFS_LI_6_1_BUF) ||
-                   (ITEM_TYPE(item) == XFS_LI_5_3_BUF)) {
+               if ((ITEM_TYPE(item) == XFS_LI_BUF)) {
                        if  ((error = xlog_recover_do_buffer_trans(log, item,
                                                                 pass)))
                                break;
@@ -3902,6 +3848,9 @@ xlog_do_recover(
        ASSERT(XFS_SB_GOOD_VERSION(sbp));
        xfs_buf_relse(bp);
 
+       /* We've re-read the superblock so re-initialize per-cpu counters */
+       xfs_icsb_reinit_counters(log->l_mp);
+
        xlog_recover_check_summary(log);
 
        /* Normal transactions can now occur */
diff --git a/fs/xfs/xfs_mac.h b/fs/xfs/xfs_mac.h
deleted file mode 100644 (file)
index 18e0e98..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 2001-2002,2005 Silicon Graphics, Inc.
- * 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.
- *
- * This program is distributed in the hope that it would 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 the Free Software Foundation,
- * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-#ifndef __XFS_MAC_H__
-#define __XFS_MAC_H__
-
-/*
- * Mandatory Access Control
- *
- * Layout of a composite MAC label:
- * ml_list contains the list of categories (MSEN) followed by the list of
- * divisions (MINT). This is actually a header for the data structure which
- * will have an ml_list with more than one element.
- *
- *      -------------------------------
- *      | ml_msen_type | ml_mint_type |
- *      -------------------------------
- *      | ml_level     | ml_grade     |
- *      -------------------------------
- *      | ml_catcount                 |
- *      -------------------------------
- *      | ml_divcount                 |
- *      -------------------------------
- *      | category 1                  |
- *      | . . .                       |
- *      | category N                  | (where N = ml_catcount)
- *      -------------------------------
- *      | division 1                  |
- *      | . . .                       |
- *      | division M                  | (where M = ml_divcount)
- *      -------------------------------
- */
-#define XFS_MAC_MAX_SETS       250
-typedef struct xfs_mac_label {
-       __uint8_t       ml_msen_type;   /* MSEN label type */
-       __uint8_t       ml_mint_type;   /* MINT label type */
-       __uint8_t       ml_level;       /* Hierarchical level */
-       __uint8_t       ml_grade;       /* Hierarchical grade */
-       __uint16_t      ml_catcount;    /* Category count */
-       __uint16_t      ml_divcount;    /* Division count */
-                                       /* Category set, then Division set */
-       __uint16_t      ml_list[XFS_MAC_MAX_SETS];
-} xfs_mac_label_t;
-
-/* MSEN label type names. Choose an upper case ASCII character.  */
-#define XFS_MSEN_ADMIN_LABEL   'A'     /* Admin: low<admin != tcsec<high */
-#define XFS_MSEN_EQUAL_LABEL   'E'     /* Wildcard - always equal */
-#define XFS_MSEN_HIGH_LABEL    'H'     /* System High - always dominates */
-#define XFS_MSEN_MLD_HIGH_LABEL        'I'     /* System High, multi-level dir */
-#define XFS_MSEN_LOW_LABEL     'L'     /* System Low - always dominated */
-#define XFS_MSEN_MLD_LABEL     'M'     /* TCSEC label on a multi-level dir */
-#define XFS_MSEN_MLD_LOW_LABEL 'N'     /* System Low, multi-level dir */
-#define XFS_MSEN_TCSEC_LABEL   'T'     /* TCSEC label */
-#define XFS_MSEN_UNKNOWN_LABEL 'U'     /* unknown label */
-
-/* MINT label type names. Choose a lower case ASCII character.  */
-#define XFS_MINT_BIBA_LABEL    'b'     /* Dual of a TCSEC label */
-#define XFS_MINT_EQUAL_LABEL   'e'     /* Wildcard - always equal */
-#define XFS_MINT_HIGH_LABEL    'h'     /* High Grade - always dominates */
-#define XFS_MINT_LOW_LABEL     'l'     /* Low Grade - always dominated */
-
-/* On-disk XFS extended attribute names */
-#define SGI_MAC_FILE   "SGI_MAC_FILE"
-#define SGI_MAC_FILE_SIZE      (sizeof(SGI_MAC_FILE)-1)
-
-
-#ifdef __KERNEL__
-
-#ifdef CONFIG_FS_POSIX_MAC
-
-/* NOT YET IMPLEMENTED */
-
-#define MACEXEC                00100
-#define MACWRITE       00200
-#define MACREAD                00400
-
-struct xfs_inode;
-extern int  xfs_mac_iaccess(struct xfs_inode *, mode_t, cred_t *);
-
-#define _MAC_XFS_IACCESS(i,m,c) (xfs_mac_iaccess(i,m,c))
-#define _MAC_VACCESS(v,c,m)    (xfs_mac_vaccess(v,c,m))
-#define _MAC_EXISTS            xfs_mac_vhaslabel
-
-#else
-#define _MAC_XFS_IACCESS(i,m,c)        (0)
-#define _MAC_VACCESS(v,c,m)    (0)
-#define _MAC_EXISTS            (NULL)
-#endif
-
-#endif /* __KERNEL__ */
-
-#endif /* __XFS_MAC_H__ */
index 9dfae18d995f5f5654c4230ec1de58530c73ba8c..3bed0cf0d8afa2eaa87a98b00be0a10034c701b7 100644 (file)
@@ -52,21 +52,19 @@ STATIC void xfs_unmountfs_wait(xfs_mount_t *);
 
 #ifdef HAVE_PERCPU_SB
 STATIC void    xfs_icsb_destroy_counters(xfs_mount_t *);
-STATIC void    xfs_icsb_balance_counter(xfs_mount_t *, xfs_sb_field_t, int);
+STATIC void    xfs_icsb_balance_counter(xfs_mount_t *, xfs_sb_field_t,
+                                               int, int);
 STATIC void    xfs_icsb_sync_counters(xfs_mount_t *);
 STATIC int     xfs_icsb_modify_counters(xfs_mount_t *, xfs_sb_field_t,
-                                               int, int);
-STATIC int     xfs_icsb_modify_counters_locked(xfs_mount_t *, xfs_sb_field_t,
-                                               int, int);
+                                               int64_t, int);
 STATIC int     xfs_icsb_disable_counter(xfs_mount_t *, xfs_sb_field_t);
 
 #else
 
 #define xfs_icsb_destroy_counters(mp)                  do { } while (0)
-#define xfs_icsb_balance_counter(mp, a, b)             do { } while (0)
+#define xfs_icsb_balance_counter(mp, a, b, c)          do { } while (0)
 #define xfs_icsb_sync_counters(mp)                     do { } while (0)
 #define xfs_icsb_modify_counters(mp, a, b, c)          do { } while (0)
-#define xfs_icsb_modify_counters_locked(mp, a, b, c)   do { } while (0)
 
 #endif
 
@@ -545,9 +543,8 @@ xfs_readsb(xfs_mount_t *mp, int flags)
                ASSERT(XFS_BUF_VALUSEMA(bp) <= 0);
        }
 
-       xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0);
-       xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0);
-       xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0);
+       /* Initialize per-cpu counters */
+       xfs_icsb_reinit_counters(mp);
 
        mp->m_sb_bp = bp;
        xfs_buf_relse(bp);
@@ -1254,8 +1251,11 @@ xfs_mod_sb(xfs_trans_t *tp, __int64_t fields)
  * The SB_LOCK must be held when this routine is called.
  */
 int
-xfs_mod_incore_sb_unlocked(xfs_mount_t *mp, xfs_sb_field_t field,
-                       int delta, int rsvd)
+xfs_mod_incore_sb_unlocked(
+       xfs_mount_t     *mp,
+       xfs_sb_field_t  field,
+       int64_t         delta,
+       int             rsvd)
 {
        int             scounter;       /* short counter for 32 bit fields */
        long long       lcounter;       /* long counter for 64 bit fields */
@@ -1287,7 +1287,6 @@ xfs_mod_incore_sb_unlocked(xfs_mount_t *mp, xfs_sb_field_t field,
                mp->m_sb.sb_ifree = lcounter;
                return 0;
        case XFS_SBS_FDBLOCKS:
-
                lcounter = (long long)
                        mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp);
                res_used = (long long)(mp->m_resblks - mp->m_resblks_avail);
@@ -1418,7 +1417,11 @@ xfs_mod_incore_sb_unlocked(xfs_mount_t *mp, xfs_sb_field_t field,
  * routine to do the work.
  */
 int
-xfs_mod_incore_sb(xfs_mount_t *mp, xfs_sb_field_t field, int delta, int rsvd)
+xfs_mod_incore_sb(
+       xfs_mount_t     *mp,
+       xfs_sb_field_t  field,
+       int64_t         delta,
+       int             rsvd)
 {
        unsigned long   s;
        int     status;
@@ -1485,9 +1488,11 @@ xfs_mod_incore_sb_batch(xfs_mount_t *mp, xfs_mod_sb_t *msb, uint nmsb, int rsvd)
                case XFS_SBS_IFREE:
                case XFS_SBS_FDBLOCKS:
                        if (!(mp->m_flags & XFS_MOUNT_NO_PERCPU_SB)) {
-                               status = xfs_icsb_modify_counters_locked(mp,
+                               XFS_SB_UNLOCK(mp, s);
+                               status = xfs_icsb_modify_counters(mp,
                                                        msbp->msb_field,
                                                        msbp->msb_delta, rsvd);
+                               s = XFS_SB_LOCK(mp);
                                break;
                        }
                        /* FALLTHROUGH */
@@ -1521,11 +1526,12 @@ xfs_mod_incore_sb_batch(xfs_mount_t *mp, xfs_mod_sb_t *msb, uint nmsb, int rsvd)
                        case XFS_SBS_IFREE:
                        case XFS_SBS_FDBLOCKS:
                                if (!(mp->m_flags & XFS_MOUNT_NO_PERCPU_SB)) {
-                                       status =
-                                           xfs_icsb_modify_counters_locked(mp,
+                                       XFS_SB_UNLOCK(mp, s);
+                                       status = xfs_icsb_modify_counters(mp,
                                                        msbp->msb_field,
                                                        -(msbp->msb_delta),
                                                        rsvd);
+                                       s = XFS_SB_LOCK(mp);
                                        break;
                                }
                                /* FALLTHROUGH */
@@ -1733,14 +1739,17 @@ xfs_icsb_cpu_notify(
                memset(cntp, 0, sizeof(xfs_icsb_cnts_t));
                break;
        case CPU_ONLINE:
-               xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0);
-               xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0);
-               xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0);
+               xfs_icsb_lock(mp);
+               xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0, 0);
+               xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0, 0);
+               xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0, 0);
+               xfs_icsb_unlock(mp);
                break;
        case CPU_DEAD:
                /* Disable all the counters, then fold the dead cpu's
                 * count into the total on the global superblock and
                 * re-enable the counters. */
+               xfs_icsb_lock(mp);
                s = XFS_SB_LOCK(mp);
                xfs_icsb_disable_counter(mp, XFS_SBS_ICOUNT);
                xfs_icsb_disable_counter(mp, XFS_SBS_IFREE);
@@ -1752,10 +1761,14 @@ xfs_icsb_cpu_notify(
 
                memset(cntp, 0, sizeof(xfs_icsb_cnts_t));
 
-               xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, XFS_ICSB_SB_LOCKED);
-               xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, XFS_ICSB_SB_LOCKED);
-               xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, XFS_ICSB_SB_LOCKED);
+               xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT,
+                                        XFS_ICSB_SB_LOCKED, 0);
+               xfs_icsb_balance_counter(mp, XFS_SBS_IFREE,
+                                        XFS_ICSB_SB_LOCKED, 0);
+               xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS,
+                                        XFS_ICSB_SB_LOCKED, 0);
                XFS_SB_UNLOCK(mp, s);
+               xfs_icsb_unlock(mp);
                break;
        }
 
@@ -1784,6 +1797,9 @@ xfs_icsb_init_counters(
                cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i);
                memset(cntp, 0, sizeof(xfs_icsb_cnts_t));
        }
+
+       mutex_init(&mp->m_icsb_mutex);
+
        /*
         * start with all counters disabled so that the
         * initial balance kicks us off correctly
@@ -1792,6 +1808,22 @@ xfs_icsb_init_counters(
        return 0;
 }
 
+void
+xfs_icsb_reinit_counters(
+       xfs_mount_t     *mp)
+{
+       xfs_icsb_lock(mp);
+       /*
+        * start with all counters disabled so that the
+        * initial balance kicks us off correctly
+        */
+       mp->m_icsb_counters = -1;
+       xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0, 0);
+       xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0, 0);
+       xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0, 0);
+       xfs_icsb_unlock(mp);
+}
+
 STATIC void
 xfs_icsb_destroy_counters(
        xfs_mount_t     *mp)
@@ -1800,9 +1832,10 @@ xfs_icsb_destroy_counters(
                unregister_hotcpu_notifier(&mp->m_icsb_notifier);
                free_percpu(mp->m_sb_cnts);
        }
+       mutex_destroy(&mp->m_icsb_mutex);
 }
 
-STATIC inline void
+STATIC_INLINE void
 xfs_icsb_lock_cntr(
        xfs_icsb_cnts_t *icsbp)
 {
@@ -1811,7 +1844,7 @@ xfs_icsb_lock_cntr(
        }
 }
 
-STATIC inline void
+STATIC_INLINE void
 xfs_icsb_unlock_cntr(
        xfs_icsb_cnts_t *icsbp)
 {
@@ -1819,7 +1852,7 @@ xfs_icsb_unlock_cntr(
 }
 
 
-STATIC inline void
+STATIC_INLINE void
 xfs_icsb_lock_all_counters(
        xfs_mount_t     *mp)
 {
@@ -1832,7 +1865,7 @@ xfs_icsb_lock_all_counters(
        }
 }
 
-STATIC inline void
+STATIC_INLINE void
 xfs_icsb_unlock_all_counters(
        xfs_mount_t     *mp)
 {
@@ -1888,6 +1921,17 @@ xfs_icsb_disable_counter(
 
        ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS));
 
+       /*
+        * If we are already disabled, then there is nothing to do
+        * here. We check before locking all the counters to avoid
+        * the expensive lock operation when being called in the
+        * slow path and the counter is already disabled. This is
+        * safe because the only time we set or clear this state is under
+        * the m_icsb_mutex.
+        */
+       if (xfs_icsb_counter_disabled(mp, field))
+               return 0;
+
        xfs_icsb_lock_all_counters(mp);
        if (!test_and_set_bit(field, &mp->m_icsb_counters)) {
                /* drain back to superblock */
@@ -1948,8 +1992,8 @@ xfs_icsb_enable_counter(
        xfs_icsb_unlock_all_counters(mp);
 }
 
-STATIC void
-xfs_icsb_sync_counters_int(
+void
+xfs_icsb_sync_counters_flags(
        xfs_mount_t     *mp,
        int             flags)
 {
@@ -1981,40 +2025,39 @@ STATIC void
 xfs_icsb_sync_counters(
        xfs_mount_t     *mp)
 {
-       xfs_icsb_sync_counters_int(mp, 0);
-}
-
-/*
- * lazy addition used for things like df, background sb syncs, etc
- */
-void
-xfs_icsb_sync_counters_lazy(
-       xfs_mount_t     *mp)
-{
-       xfs_icsb_sync_counters_int(mp, XFS_ICSB_LAZY_COUNT);
+       xfs_icsb_sync_counters_flags(mp, 0);
 }
 
 /*
  * Balance and enable/disable counters as necessary.
  *
- * Thresholds for re-enabling counters are somewhat magic.
- * inode counts are chosen to be the same number as single
- * on disk allocation chunk per CPU, and free blocks is
- * something far enough zero that we aren't going thrash
- * when we get near ENOSPC.
+ * Thresholds for re-enabling counters are somewhat magic.  inode counts are
+ * chosen to be the same number as single on disk allocation chunk per CPU, and
+ * free blocks is something far enough zero that we aren't going thrash when we
+ * get near ENOSPC. We also need to supply a minimum we require per cpu to
+ * prevent looping endlessly when xfs_alloc_space asks for more than will
+ * be distributed to a single CPU but each CPU has enough blocks to be
+ * reenabled.
+ *
+ * Note that we can be called when counters are already disabled.
+ * xfs_icsb_disable_counter() optimises the counter locking in this case to
+ * prevent locking every per-cpu counter needlessly.
  */
-#define XFS_ICSB_INO_CNTR_REENABLE     64
+
+#define XFS_ICSB_INO_CNTR_REENABLE     (uint64_t)64
 #define XFS_ICSB_FDBLK_CNTR_REENABLE(mp) \
-               (512 + XFS_ALLOC_SET_ASIDE(mp))
+               (uint64_t)(512 + XFS_ALLOC_SET_ASIDE(mp))
 STATIC void
 xfs_icsb_balance_counter(
        xfs_mount_t     *mp,
        xfs_sb_field_t  field,
-       int             flags)
+       int             flags,
+       int             min_per_cpu)
 {
        uint64_t        count, resid;
        int             weight = num_online_cpus();
        int             s;
+       uint64_t        min = (uint64_t)min_per_cpu;
 
        if (!(flags & XFS_ICSB_SB_LOCKED))
                s = XFS_SB_LOCK(mp);
@@ -2027,19 +2070,19 @@ xfs_icsb_balance_counter(
        case XFS_SBS_ICOUNT:
                count = mp->m_sb.sb_icount;
                resid = do_div(count, weight);
-               if (count < XFS_ICSB_INO_CNTR_REENABLE)
+               if (count < max(min, XFS_ICSB_INO_CNTR_REENABLE))
                        goto out;
                break;
        case XFS_SBS_IFREE:
                count = mp->m_sb.sb_ifree;
                resid = do_div(count, weight);
-               if (count < XFS_ICSB_INO_CNTR_REENABLE)
+               if (count < max(min, XFS_ICSB_INO_CNTR_REENABLE))
                        goto out;
                break;
        case XFS_SBS_FDBLOCKS:
                count = mp->m_sb.sb_fdblocks;
                resid = do_div(count, weight);
-               if (count < XFS_ICSB_FDBLK_CNTR_REENABLE(mp))
+               if (count < max(min, XFS_ICSB_FDBLK_CNTR_REENABLE(mp)))
                        goto out;
                break;
        default:
@@ -2054,32 +2097,39 @@ out:
                XFS_SB_UNLOCK(mp, s);
 }
 
-STATIC int
-xfs_icsb_modify_counters_int(
+int
+xfs_icsb_modify_counters(
        xfs_mount_t     *mp,
        xfs_sb_field_t  field,
-       int             delta,
-       int             rsvd,
-       int             flags)
+       int64_t         delta,
+       int             rsvd)
 {
        xfs_icsb_cnts_t *icsbp;
        long long       lcounter;       /* long counter for 64 bit fields */
-       int             cpu, s, locked = 0;
-       int             ret = 0, balance_done = 0;
+       int             cpu, ret = 0, s;
 
+       might_sleep();
 again:
        cpu = get_cpu();
-       icsbp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, cpu),
-       xfs_icsb_lock_cntr(icsbp);
+       icsbp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, cpu);
+
+       /*
+        * if the counter is disabled, go to slow path
+        */
        if (unlikely(xfs_icsb_counter_disabled(mp, field)))
                goto slow_path;
+       xfs_icsb_lock_cntr(icsbp);
+       if (unlikely(xfs_icsb_counter_disabled(mp, field))) {
+               xfs_icsb_unlock_cntr(icsbp);
+               goto slow_path;
+       }
 
        switch (field) {
        case XFS_SBS_ICOUNT:
                lcounter = icsbp->icsb_icount;
                lcounter += delta;
                if (unlikely(lcounter < 0))
-                       goto slow_path;
+                       goto balance_counter;
                icsbp->icsb_icount = lcounter;
                break;
 
@@ -2087,7 +2137,7 @@ again:
                lcounter = icsbp->icsb_ifree;
                lcounter += delta;
                if (unlikely(lcounter < 0))
-                       goto slow_path;
+                       goto balance_counter;
                icsbp->icsb_ifree = lcounter;
                break;
 
@@ -2097,7 +2147,7 @@ again:
                lcounter = icsbp->icsb_fdblocks - XFS_ALLOC_SET_ASIDE(mp);
                lcounter += delta;
                if (unlikely(lcounter < 0))
-                       goto slow_path;
+                       goto balance_counter;
                icsbp->icsb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp);
                break;
        default:
@@ -2106,72 +2156,78 @@ again:
        }
        xfs_icsb_unlock_cntr(icsbp);
        put_cpu();
-       if (locked)
-               XFS_SB_UNLOCK(mp, s);
        return 0;
 
-       /*
-        * The slow path needs to be run with the SBLOCK
-        * held so that we prevent other threads from
-        * attempting to run this path at the same time.
-        * this provides exclusion for the balancing code,
-        * and exclusive fallback if the balance does not
-        * provide enough resources to continue in an unlocked
-        * manner.
-        */
 slow_path:
-       xfs_icsb_unlock_cntr(icsbp);
        put_cpu();
 
-       /* need to hold superblock incase we need
-        * to disable a counter */
-       if (!(flags & XFS_ICSB_SB_LOCKED)) {
-               s = XFS_SB_LOCK(mp);
-               locked = 1;
-               flags |= XFS_ICSB_SB_LOCKED;
-       }
-       if (!balance_done) {
-               xfs_icsb_balance_counter(mp, field, flags);
-               balance_done = 1;
+       /*
+        * serialise with a mutex so we don't burn lots of cpu on
+        * the superblock lock. We still need to hold the superblock
+        * lock, however, when we modify the global structures.
+        */
+       xfs_icsb_lock(mp);
+
+       /*
+        * Now running atomically.
+        *
+        * If the counter is enabled, someone has beaten us to rebalancing.
+        * Drop the lock and try again in the fast path....
+        */
+       if (!(xfs_icsb_counter_disabled(mp, field))) {
+               xfs_icsb_unlock(mp);
                goto again;
-       } else {
-               /*
-                * we might not have enough on this local
-                * cpu to allocate for a bulk request.
-                * We need to drain this field from all CPUs
-                * and disable the counter fastpath
-                */
-               xfs_icsb_disable_counter(mp, field);
        }
 
+       /*
+        * The counter is currently disabled. Because we are
+        * running atomically here, we know a rebalance cannot
+        * be in progress. Hence we can go straight to operating
+        * on the global superblock. We do not call xfs_mod_incore_sb()
+        * here even though we need to get the SB_LOCK. Doing so
+        * will cause us to re-enter this function and deadlock.
+        * Hence we get the SB_LOCK ourselves and then call
+        * xfs_mod_incore_sb_unlocked() as the unlocked path operates
+        * directly on the global counters.
+        */
+       s = XFS_SB_LOCK(mp);
        ret = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd);
+       XFS_SB_UNLOCK(mp, s);
 
-       if (locked)
-               XFS_SB_UNLOCK(mp, s);
+       /*
+        * Now that we've modified the global superblock, we
+        * may be able to re-enable the distributed counters
+        * (e.g. lots of space just got freed). After that
+        * we are done.
+        */
+       if (ret != ENOSPC)
+               xfs_icsb_balance_counter(mp, field, 0, 0);
+       xfs_icsb_unlock(mp);
        return ret;
-}
 
-STATIC int
-xfs_icsb_modify_counters(
-       xfs_mount_t     *mp,
-       xfs_sb_field_t  field,
-       int             delta,
-       int             rsvd)
-{
-       return xfs_icsb_modify_counters_int(mp, field, delta, rsvd, 0);
-}
+balance_counter:
+       xfs_icsb_unlock_cntr(icsbp);
+       put_cpu();
 
-/*
- * Called when superblock is already locked
- */
-STATIC int
-xfs_icsb_modify_counters_locked(
-       xfs_mount_t     *mp,
-       xfs_sb_field_t  field,
-       int             delta,
-       int             rsvd)
-{
-       return xfs_icsb_modify_counters_int(mp, field, delta,
-                                               rsvd, XFS_ICSB_SB_LOCKED);
+       /*
+        * We may have multiple threads here if multiple per-cpu
+        * counters run dry at the same time. This will mean we can
+        * do more balances than strictly necessary but it is not
+        * the common slowpath case.
+        */
+       xfs_icsb_lock(mp);
+
+       /*
+        * running atomically.
+        *
+        * This will leave the counter in the correct state for future
+        * accesses. After the rebalance, we simply try again and our retry
+        * will either succeed through the fast path or slow path without
+        * another balance operation being required.
+        */
+       xfs_icsb_balance_counter(mp, field, 0, delta);
+       xfs_icsb_unlock(mp);
+       goto again;
 }
+
 #endif
index e5f396ff9a3d57f45bb3174449f9cfbd752adf19..82304b94646db94cd4a2b85c88fef0d1bce26a03 100644 (file)
@@ -18,6 +18,7 @@
 #ifndef __XFS_MOUNT_H__
 #define        __XFS_MOUNT_H__
 
+
 typedef struct xfs_trans_reservations {
        uint    tr_write;       /* extent alloc trans */
        uint    tr_itruncate;   /* truncate trans */
@@ -306,11 +307,13 @@ typedef struct xfs_icsb_cnts {
 #define XFS_ICSB_LAZY_COUNT    (1 << 1)        /* accuracy not needed */
 
 extern int     xfs_icsb_init_counters(struct xfs_mount *);
-extern void    xfs_icsb_sync_counters_lazy(struct xfs_mount *);
+extern void    xfs_icsb_reinit_counters(struct xfs_mount *);
+extern void    xfs_icsb_sync_counters_flags(struct xfs_mount *, int);
 
 #else
 #define xfs_icsb_init_counters(mp)     (0)
-#define xfs_icsb_sync_counters_lazy(mp)        do { } while (0)
+#define xfs_icsb_reinit_counters(mp)   do { } while (0)
+#define xfs_icsb_sync_counters_flags(mp, flags)        do { } while (0)
 #endif
 
 typedef struct xfs_mount {
@@ -419,6 +422,7 @@ typedef struct xfs_mount {
        xfs_icsb_cnts_t         *m_sb_cnts;     /* per-cpu superblock counters */
        unsigned long           m_icsb_counters; /* disabled per-cpu counters */
        struct notifier_block   m_icsb_notifier; /* hotplug cpu notifier */
+       struct mutex            m_icsb_mutex;   /* balancer sync lock */
 #endif
 } xfs_mount_t;
 
@@ -562,12 +566,33 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d)
        return (xfs_agblock_t) do_div(ld, mp->m_sb.sb_agblocks);
 }
 
+/*
+ * Per-cpu superblock locking functions
+ */
+#ifdef HAVE_PERCPU_SB
+STATIC_INLINE void
+xfs_icsb_lock(xfs_mount_t *mp)
+{
+       mutex_lock(&mp->m_icsb_mutex);
+}
+
+STATIC_INLINE void
+xfs_icsb_unlock(xfs_mount_t *mp)
+{
+       mutex_unlock(&mp->m_icsb_mutex);
+}
+#else
+#define xfs_icsb_lock(mp)
+#define xfs_icsb_unlock(mp)
+#endif
+
 /*
  * This structure is for use by the xfs_mod_incore_sb_batch() routine.
+ * xfs_growfs can specify a few fields which are more than int limit
  */
 typedef struct xfs_mod_sb {
        xfs_sb_field_t  msb_field;      /* Field to modify, see below */
-       int             msb_delta;      /* Change to make to specified field */
+       int64_t         msb_delta;      /* Change to make to specified field */
 } xfs_mod_sb_t;
 
 #define        XFS_MOUNT_ILOCK(mp)     mutex_lock(&((mp)->m_ilock))
@@ -585,17 +610,17 @@ extern int        xfs_unmountfs(xfs_mount_t *, struct cred *);
 extern void    xfs_unmountfs_close(xfs_mount_t *, struct cred *);
 extern int     xfs_unmountfs_writesb(xfs_mount_t *);
 extern int     xfs_unmount_flush(xfs_mount_t *, int);
-extern int     xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int, int);
+extern int     xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int);
 extern int     xfs_mod_incore_sb_unlocked(xfs_mount_t *, xfs_sb_field_t,
-                       int, int);
+                       int64_t, int);
 extern int     xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *,
                        uint, int);
 extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int);
 extern int     xfs_readsb(xfs_mount_t *, int);
 extern void    xfs_freesb(xfs_mount_t *);
 extern void    xfs_do_force_shutdown(bhv_desc_t *, int, char *, int);
-extern int     xfs_syncsub(xfs_mount_t *, int, int, int *);
-extern int     xfs_sync_inodes(xfs_mount_t *, int, int, int *);
+extern int     xfs_syncsub(xfs_mount_t *, int, int *);
+extern int     xfs_sync_inodes(xfs_mount_t *, int, int *);
 extern xfs_agnumber_t  xfs_initialize_perag(struct bhv_vfs *, xfs_mount_t *,
                                                xfs_agnumber_t);
 extern void    xfs_xlatesb(void *, struct xfs_sb *, int, __int64_t);
index d98171deaa1ce8c983b3302c75080b78db8a10b2..4c6573d784cd4bfd48cb0887c0ae664fcb11b965 100644 (file)
@@ -565,7 +565,7 @@ xfs_rename(
                IHOLD(target_ip);
        IHOLD(src_ip);
 
-       error = xfs_bmap_finish(&tp, &free_list, first_block, &committed);
+       error = xfs_bmap_finish(&tp, &free_list, &committed);
        if (error) {
                xfs_bmap_cancel(&free_list);
                xfs_trans_cancel(tp, (XFS_TRANS_RELEASE_LOG_RES |
index 880c73271c05fac890f3e0dcdd53a4805ae26be0..6fff19dc3cf96e8cb6d00fabe3dd88d176847f46 100644 (file)
@@ -147,7 +147,7 @@ xfs_growfs_rt_alloc(
                /*
                 * Free any blocks freed up in the transaction, then commit.
                 */
-               error = xfs_bmap_finish(&tp, &flist, firstblock, &committed);
+               error = xfs_bmap_finish(&tp, &flist, &committed);
                if (error)
                        goto error_exit;
                xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES, NULL);
@@ -913,57 +913,6 @@ xfs_rtcheck_alloc_range(
 }
 #endif
 
-#ifdef DEBUG
-/*
- * Check whether the given block in the bitmap has the given value.
- */
-STATIC int                             /* 1 for matches, 0 for not */
-xfs_rtcheck_bit(
-       xfs_mount_t     *mp,            /* file system mount structure */
-       xfs_trans_t     *tp,            /* transaction pointer */
-       xfs_rtblock_t   start,          /* bit (block) to check */
-       int             val)            /* 1 for free, 0 for allocated */
-{
-       int             bit;            /* bit number in the word */
-       xfs_rtblock_t   block;          /* bitmap block number */
-       xfs_buf_t       *bp;            /* buf for the block */
-       xfs_rtword_t    *bufp;          /* pointer into the buffer */
-       /* REFERENCED */
-       int             error;          /* error value */
-       xfs_rtword_t    wdiff;          /* difference between bit & expected */
-       int             word;           /* word number in the buffer */
-       xfs_rtword_t    wval;           /* word value from buffer */
-
-       block = XFS_BITTOBLOCK(mp, start);
-       error = xfs_rtbuf_get(mp, tp, block, 0, &bp);
-       bufp = (xfs_rtword_t *)XFS_BUF_PTR(bp);
-       word = XFS_BITTOWORD(mp, start);
-       bit = (int)(start & (XFS_NBWORD - 1));
-       wval = bufp[word];
-       xfs_trans_brelse(tp, bp);
-       wdiff = (wval ^ -val) & ((xfs_rtword_t)1 << bit);
-       return !wdiff;
-}
-#endif /* DEBUG */
-
-#if 0
-/*
- * Check that the given extent (block range) is free already.
- */
-STATIC int                             /* error */
-xfs_rtcheck_free_range(
-       xfs_mount_t     *mp,            /* file system mount point */
-       xfs_trans_t     *tp,            /* transaction pointer */
-       xfs_rtblock_t   bno,            /* starting block number of extent */
-       xfs_extlen_t    len,            /* length of extent */
-       int             *stat)          /* out: 1 for free, 0 for not */
-{
-       xfs_rtblock_t   new;            /* dummy for xfs_rtcheck_range */
-
-       return xfs_rtcheck_range(mp, tp, bno, len, 1, &new, stat);
-}
-#endif
-
 /*
  * Check that the given range is either all allocated (val = 0) or
  * all free (val = 1).
@@ -2382,60 +2331,3 @@ xfs_rtpick_extent(
        *pick = b;
        return 0;
 }
-
-#ifdef DEBUG
-/*
- * Debug code: print out the value of a range in the bitmap.
- */
-void
-xfs_rtprint_range(
-       xfs_mount_t     *mp,            /* file system mount structure */
-       xfs_trans_t     *tp,            /* transaction pointer */
-       xfs_rtblock_t   start,          /* starting block to print */
-       xfs_extlen_t    len)            /* length to print */
-{
-       xfs_extlen_t    i;              /* block number in the extent */
-
-       cmn_err(CE_DEBUG, "%Ld: ", (long long)start);
-       for (i = 0; i < len; i++)
-               cmn_err(CE_DEBUG, "%d", xfs_rtcheck_bit(mp, tp, start + i, 1));
-       cmn_err(CE_DEBUG, "\n");
-}
-
-/*
- * Debug code: print the summary file.
- */
-void
-xfs_rtprint_summary(
-       xfs_mount_t     *mp,            /* file system mount structure */
-       xfs_trans_t     *tp)            /* transaction pointer */
-{
-       xfs_suminfo_t   c;              /* summary data */
-       xfs_rtblock_t   i;              /* bitmap block number */
-       int             l;              /* summary information level */
-       int             p;              /* flag for printed anything */
-       xfs_fsblock_t   sb;             /* summary block number */
-       xfs_buf_t       *sumbp;         /* summary block buffer */
-
-       sumbp = NULL;
-       for (l = 0; l < mp->m_rsumlevels; l++) {
-               for (p = 0, i = 0; i < mp->m_sb.sb_rbmblocks; i++) {
-                       (void)xfs_rtget_summary(mp, tp, l, i, &sumbp, &sb, &c);
-                       if (c) {
-                               if (!p) {
-                                       cmn_err(CE_DEBUG, "%Ld-%Ld:", 1LL << l,
-                                               XFS_RTMIN((1LL << l) +
-                                                         ((1LL << l) - 1LL),
-                                                        mp->m_sb.sb_rextents));
-                                       p = 1;
-                               }
-                               cmn_err(CE_DEBUG, " %Ld:%d", (long long)i, c);
-                       }
-               }
-               if (p)
-                       cmn_err(CE_DEBUG, "\n");
-       }
-       if (sumbp)
-               xfs_trans_brelse(tp, sumbp);
-}
-#endif /* DEBUG */
index 0e0b4d2ec2028597acac80927f01a4f21c804837..799c1f87126318bf54e0fcf9b4f59c088a9ee2fd 100644 (file)
@@ -133,24 +133,6 @@ xfs_rtpick_extent(
        xfs_extlen_t            len,    /* allocation length (rtextents) */
        xfs_rtblock_t           *pick); /* result rt extent */
 
-/*
- * Debug code: print out the value of a range in the bitmap.
- */
-void
-xfs_rtprint_range(
-       struct xfs_mount        *mp,    /* file system mount structure */
-       struct xfs_trans        *tp,    /* transaction pointer */
-       xfs_rtblock_t           start,  /* starting block to print */
-       xfs_extlen_t            len);   /* length to print */
-
-/*
- * Debug code: print the summary file.
- */
-void
-xfs_rtprint_summary(
-       struct xfs_mount        *mp,    /* file system mount structure */
-       struct xfs_trans        *tp);   /* transaction pointer */
-
 /*
  * Grow the realtime area of the filesystem.
  */
index defb2febaaf5c68d5cb3663cbb764150fecff0e2..1ea7c0ca6ae0f8d5ec63d8ab6aca7706b13e1626 100644 (file)
@@ -42,7 +42,6 @@
 #include "xfs_attr.h"
 #include "xfs_bmap.h"
 #include "xfs_acl.h"
-#include "xfs_mac.h"
 #include "xfs_error.h"
 #include "xfs_buf_item.h"
 #include "xfs_rw.h"
index ee2721e0de4d7fd700e22e8a3b635255c14696cc..301ff9445b6f84cb570833ec1990df768fbed779 100644 (file)
@@ -339,7 +339,7 @@ xfs_trans_reserve(
         */
        if (blocks > 0) {
                error = xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FDBLOCKS,
-                                         -blocks, rsvd);
+                                         -((int64_t)blocks), rsvd);
                if (error != 0) {
                        current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS);
                        return (XFS_ERROR(ENOSPC));
@@ -380,7 +380,7 @@ xfs_trans_reserve(
         */
        if (rtextents > 0) {
                error = xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FREXTENTS,
-                                         -rtextents, rsvd);
+                                         -((int64_t)rtextents), rsvd);
                if (error) {
                        error = XFS_ERROR(ENOSPC);
                        goto undo_log;
@@ -410,7 +410,7 @@ undo_log:
 undo_blocks:
        if (blocks > 0) {
                (void) xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FDBLOCKS,
-                                        blocks, rsvd);
+                                        (int64_t)blocks, rsvd);
                tp->t_blk_res = 0;
        }
 
@@ -432,7 +432,7 @@ void
 xfs_trans_mod_sb(
        xfs_trans_t     *tp,
        uint            field,
-       long            delta)
+       int64_t         delta)
 {
 
        switch (field) {
@@ -663,62 +663,62 @@ xfs_trans_unreserve_and_mod_sb(
        if (tp->t_flags & XFS_TRANS_SB_DIRTY) {
                if (tp->t_icount_delta != 0) {
                        msbp->msb_field = XFS_SBS_ICOUNT;
-                       msbp->msb_delta = (int)tp->t_icount_delta;
+                       msbp->msb_delta = tp->t_icount_delta;
                        msbp++;
                }
                if (tp->t_ifree_delta != 0) {
                        msbp->msb_field = XFS_SBS_IFREE;
-                       msbp->msb_delta = (int)tp->t_ifree_delta;
+                       msbp->msb_delta = tp->t_ifree_delta;
                        msbp++;
                }
                if (tp->t_fdblocks_delta != 0) {
                        msbp->msb_field = XFS_SBS_FDBLOCKS;
-                       msbp->msb_delta = (int)tp->t_fdblocks_delta;
+                       msbp->msb_delta = tp->t_fdblocks_delta;
                        msbp++;
                }
                if (tp->t_frextents_delta != 0) {
                        msbp->msb_field = XFS_SBS_FREXTENTS;
-                       msbp->msb_delta = (int)tp->t_frextents_delta;
+                       msbp->msb_delta = tp->t_frextents_delta;
                        msbp++;
                }
                if (tp->t_dblocks_delta != 0) {
                        msbp->msb_field = XFS_SBS_DBLOCKS;
-                       msbp->msb_delta = (int)tp->t_dblocks_delta;
+                       msbp->msb_delta = tp->t_dblocks_delta;
                        msbp++;
                }
                if (tp->t_agcount_delta != 0) {
                        msbp->msb_field = XFS_SBS_AGCOUNT;
-                       msbp->msb_delta = (int)tp->t_agcount_delta;
+                       msbp->msb_delta = tp->t_agcount_delta;
                        msbp++;
                }
                if (tp->t_imaxpct_delta != 0) {
                        msbp->msb_field = XFS_SBS_IMAX_PCT;
-                       msbp->msb_delta = (int)tp->t_imaxpct_delta;
+                       msbp->msb_delta = tp->t_imaxpct_delta;
                        msbp++;
                }
                if (tp->t_rextsize_delta != 0) {
                        msbp->msb_field = XFS_SBS_REXTSIZE;
-                       msbp->msb_delta = (int)tp->t_rextsize_delta;
+                       msbp->msb_delta = tp->t_rextsize_delta;
                        msbp++;
                }
                if (tp->t_rbmblocks_delta != 0) {
                        msbp->msb_field = XFS_SBS_RBMBLOCKS;
-                       msbp->msb_delta = (int)tp->t_rbmblocks_delta;
+                       msbp->msb_delta = tp->t_rbmblocks_delta;
                        msbp++;
                }
                if (tp->t_rblocks_delta != 0) {
                        msbp->msb_field = XFS_SBS_RBLOCKS;
-                       msbp->msb_delta = (int)tp->t_rblocks_delta;
+                       msbp->msb_delta = tp->t_rblocks_delta;
                        msbp++;
                }
                if (tp->t_rextents_delta != 0) {
                        msbp->msb_field = XFS_SBS_REXTENTS;
-                       msbp->msb_delta = (int)tp->t_rextents_delta;
+                       msbp->msb_delta = tp->t_rextents_delta;
                        msbp++;
                }
                if (tp->t_rextslog_delta != 0) {
                        msbp->msb_field = XFS_SBS_REXTSLOG;
-                       msbp->msb_delta = (int)tp->t_rextslog_delta;
+                       msbp->msb_delta = tp->t_rextslog_delta;
                        msbp++;
                }
        }
index c68e00105d238daeedc3aa036e0f234dd38f8a3d..f1d7ab236726ce20ec98160cdb3541d6f5da50ed 100644 (file)
@@ -39,13 +39,9 @@ typedef struct xfs_trans_header {
 /*
  * Log item types.
  */
-#define        XFS_LI_5_3_BUF          0x1234  /* v1 bufs, 1-block inode buffers */
-#define        XFS_LI_5_3_INODE        0x1235  /* 1-block inode buffers */
 #define        XFS_LI_EFI              0x1236
 #define        XFS_LI_EFD              0x1237
 #define        XFS_LI_IUNLINK          0x1238
-#define        XFS_LI_6_1_INODE        0x1239  /* 4K non-aligned inode bufs */
-#define        XFS_LI_6_1_BUF          0x123a  /* v1, 4K inode buffers */
 #define        XFS_LI_INODE            0x123b  /* aligned ino chunks, var-size ibufs */
 #define        XFS_LI_BUF              0x123c  /* v2 bufs, variable sized inode bufs */
 #define        XFS_LI_DQUOT            0x123d
@@ -354,25 +350,25 @@ typedef struct xfs_trans {
        xfs_trans_callback_t    t_callback;     /* transaction callback */
        void                    *t_callarg;     /* callback arg */
        unsigned int            t_flags;        /* misc flags */
-       long                    t_icount_delta; /* superblock icount change */
-       long                    t_ifree_delta;  /* superblock ifree change */
-       long                    t_fdblocks_delta; /* superblock fdblocks chg */
-       long                    t_res_fdblocks_delta; /* on-disk only chg */
-       long                    t_frextents_delta;/* superblock freextents chg*/
-       long                    t_res_frextents_delta; /* on-disk only chg */
+       int64_t                 t_icount_delta; /* superblock icount change */
+       int64_t                 t_ifree_delta;  /* superblock ifree change */
+       int64_t                 t_fdblocks_delta; /* superblock fdblocks chg */
+       int64_t                 t_res_fdblocks_delta; /* on-disk only chg */
+       int64_t                 t_frextents_delta;/* superblock freextents chg*/
+       int64_t                 t_res_frextents_delta; /* on-disk only chg */
 #ifdef DEBUG
-       long                    t_ag_freeblks_delta; /* debugging counter */
-       long                    t_ag_flist_delta; /* debugging counter */
-       long                    t_ag_btree_delta; /* debugging counter */
+       int64_t                 t_ag_freeblks_delta; /* debugging counter */
+       int64_t                 t_ag_flist_delta; /* debugging counter */
+       int64_t                 t_ag_btree_delta; /* debugging counter */
 #endif
-       long                    t_dblocks_delta;/* superblock dblocks change */
-       long                    t_agcount_delta;/* superblock agcount change */
-       long                    t_imaxpct_delta;/* superblock imaxpct change */
-       long                    t_rextsize_delta;/* superblock rextsize chg */
-       long                    t_rbmblocks_delta;/* superblock rbmblocks chg */
-       long                    t_rblocks_delta;/* superblock rblocks change */
-       long                    t_rextents_delta;/* superblocks rextents chg */
-       long                    t_rextslog_delta;/* superblocks rextslog chg */
+       int64_t                 t_dblocks_delta;/* superblock dblocks change */
+       int64_t                 t_agcount_delta;/* superblock agcount change */
+       int64_t                 t_imaxpct_delta;/* superblock imaxpct change */
+       int64_t                 t_rextsize_delta;/* superblock rextsize chg */
+       int64_t                 t_rbmblocks_delta;/* superblock rbmblocks chg */
+       int64_t                 t_rblocks_delta;/* superblock rblocks change */
+       int64_t                 t_rextents_delta;/* superblocks rextents chg */
+       int64_t                 t_rextslog_delta;/* superblocks rextslog chg */
        unsigned int            t_items_free;   /* log item descs free */
        xfs_log_item_chunk_t    t_items;        /* first log item desc chunk */
        xfs_trans_header_t      t_header;       /* header for in-log trans */
@@ -936,9 +932,9 @@ typedef struct xfs_trans {
 #define        xfs_trans_set_sync(tp)          ((tp)->t_flags |= XFS_TRANS_SYNC)
 
 #ifdef DEBUG
-#define        xfs_trans_agblocks_delta(tp, d) ((tp)->t_ag_freeblks_delta += (long)d)
-#define        xfs_trans_agflist_delta(tp, d)  ((tp)->t_ag_flist_delta += (long)d)
-#define        xfs_trans_agbtree_delta(tp, d)  ((tp)->t_ag_btree_delta += (long)d)
+#define        xfs_trans_agblocks_delta(tp, d) ((tp)->t_ag_freeblks_delta += (int64_t)d)
+#define        xfs_trans_agflist_delta(tp, d)  ((tp)->t_ag_flist_delta += (int64_t)d)
+#define        xfs_trans_agbtree_delta(tp, d)  ((tp)->t_ag_btree_delta += (int64_t)d)
 #else
 #define        xfs_trans_agblocks_delta(tp, d)
 #define        xfs_trans_agflist_delta(tp, d)
@@ -954,7 +950,7 @@ xfs_trans_t *_xfs_trans_alloc(struct xfs_mount *, uint);
 xfs_trans_t    *xfs_trans_dup(xfs_trans_t *);
 int            xfs_trans_reserve(xfs_trans_t *, uint, uint, uint,
                                  uint, uint);
-void           xfs_trans_mod_sb(xfs_trans_t *, uint, long);
+void           xfs_trans_mod_sb(xfs_trans_t *, uint, int64_t);
 struct xfs_buf *xfs_trans_get_buf(xfs_trans_t *, struct xfs_buftarg *, xfs_daddr_t,
                                   int, uint);
 int            xfs_trans_read_buf(struct xfs_mount *, xfs_trans_t *,
index fc39b166d403e609e356008f05c23fcb682d8b28..ceb4f6e999608ea25e3984e7d4e5100ed9a75c1b 100644 (file)
@@ -90,7 +90,7 @@ xfs_trans_push_ail(
        int                     flush_log;
        SPLDECL(s);
 
-#define        XFS_TRANS_PUSH_AIL_RESTARTS     10
+#define        XFS_TRANS_PUSH_AIL_RESTARTS     1000
 
        AIL_LOCK(mp,s);
        lip = xfs_trans_first_ail(mp, &gen);
index 62336a4cc5a4c72339932fdc91dcf8dd2323f38a..29f72f613782a6a1a2d09bc6570e880d65af313a 100644 (file)
@@ -640,7 +640,7 @@ xfs_quiesce_fs(
         * we can write the unmount record.
         */
        do {
-               xfs_syncsub(mp, SYNC_REMOUNT|SYNC_ATTR|SYNC_WAIT, 0, NULL);
+               xfs_syncsub(mp, SYNC_REMOUNT|SYNC_ATTR|SYNC_WAIT, NULL);
                pincount = xfs_flush_buftarg(mp->m_ddev_targp, 1);
                if (!pincount) {
                        delay(50);
@@ -806,7 +806,7 @@ xfs_statvfs(
 
        statp->f_type = XFS_SB_MAGIC;
 
-       xfs_icsb_sync_counters_lazy(mp);
+       xfs_icsb_sync_counters_flags(mp, XFS_ICSB_LAZY_COUNT);
        s = XFS_SB_LOCK(mp);
        statp->f_bsize = sbp->sb_blocksize;
        lsize = sbp->sb_logstart ? sbp->sb_logblocks : 0;
@@ -872,6 +872,10 @@ xfs_statvfs(
  *                    this by simply making sure the log gets flushed
  *                    if SYNC_BDFLUSH is set, and by actually writing it
  *                    out otherwise.
+ *     SYNC_IOWAIT  - The caller wants us to wait for all data I/O to complete
+ *                    before we return (including direct I/O). Forms the drain
+ *                    side of the write barrier needed to safely quiesce the
+ *                    filesystem.
  *
  */
 /*ARGSUSED*/
@@ -883,27 +887,20 @@ xfs_sync(
 {
        xfs_mount_t     *mp = XFS_BHVTOM(bdp);
 
-       if (unlikely(flags == SYNC_QUIESCE))
-               return xfs_quiesce_fs(mp);
-       else
-               return xfs_syncsub(mp, flags, 0, NULL);
+       return xfs_syncsub(mp, flags, NULL);
 }
 
 /*
  * xfs sync routine for internal use
  *
  * This routine supports all of the flags defined for the generic vfs_sync
- * interface as explained above under xfs_sync.  In the interests of not
- * changing interfaces within the 6.5 family, additional internally-
- * required functions are specified within a separate xflags parameter,
- * only available by calling this routine.
+ * interface as explained above under xfs_sync.
  *
  */
 int
 xfs_sync_inodes(
        xfs_mount_t     *mp,
        int             flags,
-       int             xflags,
        int             *bypassed)
 {
        xfs_inode_t     *ip = NULL;
@@ -1176,6 +1173,13 @@ xfs_sync_inodes(
                        }
 
                }
+               /*
+                * When freezing, we need to wait ensure all I/O (including direct
+                * I/O) is complete to ensure no further data modification can take
+                * place after this point
+                */
+               if (flags & SYNC_IOWAIT)
+                       vn_iowait(vp);
 
                if (flags & SYNC_BDFLUSH) {
                        if ((flags & SYNC_ATTR) &&
@@ -1412,17 +1416,13 @@ xfs_sync_inodes(
  * xfs sync routine for internal use
  *
  * This routine supports all of the flags defined for the generic vfs_sync
- * interface as explained above under xfs_sync.  In the interests of not
- * changing interfaces within the 6.5 family, additional internally-
- * required functions are specified within a separate xflags parameter,
- * only available by calling this routine.
+ * interface as explained above under xfs_sync.
  *
  */
 int
 xfs_syncsub(
        xfs_mount_t     *mp,
        int             flags,
-       int             xflags,
        int             *bypassed)
 {
        int             error = 0;
@@ -1444,7 +1444,7 @@ xfs_syncsub(
                if (flags & SYNC_BDFLUSH)
                        xfs_finish_reclaim_all(mp, 1);
                else
-                       error = xfs_sync_inodes(mp, flags, xflags, bypassed);
+                       error = xfs_sync_inodes(mp, flags, bypassed);
        }
 
        /*
@@ -1958,15 +1958,26 @@ xfs_showargs(
        return 0;
 }
 
+/*
+ * Second stage of a freeze. The data is already frozen, now we have to take
+ * care of the metadata. New transactions are already blocked, so we need to
+ * wait for any remaining transactions to drain out before proceding.
+ */
 STATIC void
 xfs_freeze(
        bhv_desc_t      *bdp)
 {
        xfs_mount_t     *mp = XFS_BHVTOM(bdp);
 
+       /* wait for all modifications to complete */
        while (atomic_read(&mp->m_active_trans) > 0)
                delay(100);
 
+       /* flush inodes and push all remaining buffers out to disk */
+       xfs_quiesce_fs(mp);
+
+       ASSERT_ALWAYS(atomic_read(&mp->m_active_trans) == 0);
+
        /* Push the superblock and write an unmount record */
        xfs_log_unmount_write(mp);
        xfs_unmountfs_writesb(mp);
index bda774a04b8f1c89d3d256bdd98d1b84e8a83adb..52c41714ec54c5a76cb5dbfe16a51233e44bf85f 100644 (file)
@@ -51,7 +51,6 @@
 #include "xfs_refcache.h"
 #include "xfs_trans_space.h"
 #include "xfs_log_priv.h"
-#include "xfs_mac.h"
 
 STATIC int
 xfs_open(
@@ -1381,7 +1380,7 @@ xfs_inactive_symlink_rmt(
        /*
         * Commit the first transaction.  This logs the EFI and the inode.
         */
-       if ((error = xfs_bmap_finish(&tp, &free_list, first_block, &committed)))
+       if ((error = xfs_bmap_finish(&tp, &free_list, &committed)))
                goto error1;
        /*
         * The transaction must have been committed, since there were
@@ -1790,8 +1789,7 @@ xfs_inactive(
                 * Just ignore errors at this point.  There is
                 * nothing we can do except to try to keep going.
                 */
-               (void) xfs_bmap_finish(&tp,  &free_list, first_block,
-                                      &committed);
+               (void) xfs_bmap_finish(&tp,  &free_list, &committed);
                (void) xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES, NULL);
        }
        /*
@@ -2022,7 +2020,7 @@ xfs_create(
        IHOLD(ip);
        vp = XFS_ITOV(ip);
 
-       error = xfs_bmap_finish(&tp, &free_list, first_block, &committed);
+       error = xfs_bmap_finish(&tp, &free_list, &committed);
        if (error) {
                xfs_bmap_cancel(&free_list);
                goto abort_rele;
@@ -2507,7 +2505,7 @@ xfs_remove(
                xfs_trans_set_sync(tp);
        }
 
-       error = xfs_bmap_finish(&tp, &free_list, first_block, &committed);
+       error = xfs_bmap_finish(&tp, &free_list, &committed);
        if (error) {
                REMOVE_DEBUG_TRACE(__LINE__);
                goto error_rele;
@@ -2715,7 +2713,7 @@ xfs_link(
                xfs_trans_set_sync(tp);
        }
 
-       error = xfs_bmap_finish (&tp, &free_list, first_block, &committed);
+       error = xfs_bmap_finish (&tp, &free_list, &committed);
        if (error) {
                xfs_bmap_cancel(&free_list);
                goto abort_return;
@@ -2932,7 +2930,7 @@ xfs_mkdir(
                xfs_trans_set_sync(tp);
        }
 
-       error = xfs_bmap_finish(&tp, &free_list, first_block, &committed);
+       error = xfs_bmap_finish(&tp, &free_list, &committed);
        if (error) {
                IRELE(cdp);
                goto error2;
@@ -3183,7 +3181,7 @@ xfs_rmdir(
                xfs_trans_set_sync(tp);
        }
 
-       error = xfs_bmap_finish (&tp, &free_list, first_block, &committed);
+       error = xfs_bmap_finish (&tp, &free_list, &committed);
        if (error) {
                xfs_bmap_cancel(&free_list);
                xfs_trans_cancel(tp, (XFS_TRANS_RELEASE_LOG_RES |
@@ -3533,7 +3531,7 @@ xfs_symlink(
         */
        IHOLD(ip);
 
-       error = xfs_bmap_finish(&tp, &free_list, first_block, &committed);
+       error = xfs_bmap_finish(&tp, &free_list, &committed);
        if (error) {
                goto error2;
        }
@@ -4145,7 +4143,7 @@ retry:
                /*
                 * Complete the transaction
                 */
-               error = xfs_bmap_finish(&tp, &free_list, firstfsb, &committed);
+               error = xfs_bmap_finish(&tp, &free_list, &committed);
                if (error) {
                        goto error0;
                }
@@ -4452,7 +4450,7 @@ xfs_free_file_space(
                /*
                 * complete the transaction
                 */
-               error = xfs_bmap_finish(&tp, &free_list, firstfsb, &committed);
+               error = xfs_bmap_finish(&tp, &free_list, &committed);
                if (error) {
                        goto error0;
                }
index ce7c9d653910598c29cce2baa2dcbb28b8cbb83b..73967c8152d325012db1f690f9cd6744caec2f76 100644 (file)
@@ -253,7 +253,8 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
 
 void acpi_ex_release_all_mutexes(struct acpi_thread_state *thread);
 
-void acpi_ex_unlink_mutex(union acpi_operand_object *obj_desc);
+void acpi_ex_unlink_mutex(union acpi_operand_object *obj_desc,
+                         struct acpi_thread_state *thread);
 
 /*
  * exprep - ACPI AML execution - prep utilities
index 04e9735a674214fb49aab10f3b75d273e3f44e0d..5206d61d74a6039eac0852145eb956b842554d6a 100644 (file)
@@ -155,7 +155,7 @@ struct acpi_object_event {
 struct acpi_object_mutex {
        ACPI_OBJECT_COMMON_HEADER u8 sync_level;        /* 0-15, specified in Mutex() call */
        u16 acquisition_depth;  /* Allow multiple Acquires, same thread */
-       struct acpi_thread_state *owner_thread; /* Current owner of the mutex */
+       acpi_thread_id owner_thread_id; /* Current owner of the mutex */
        acpi_mutex os_mutex;    /* Actual OS synchronization object */
        union acpi_operand_object *prev;        /* Link for list of acquired mutexes */
        union acpi_operand_object *next;        /* Link for list of acquired mutexes */
index 4dc8a5043ef033fd35042be6ad0999233c8db0ad..07a5eb036e96a01967c1d5264b2c5cceffe24373 100644 (file)
@@ -105,12 +105,6 @@ int acpi_ec_ecdt_probe(void);
 
 int acpi_processor_set_thermal_limit(acpi_handle handle, int type);
 
-/* --------------------------------------------------------------------------
-                                    Hot Keys
-   -------------------------------------------------------------------------- */
-
-extern int acpi_specific_hotkey_enabled;
-
 /*--------------------------------------------------------------------------
                                   Dock Station
   -------------------------------------------------------------------------- */
@@ -122,10 +116,24 @@ extern int register_hotplug_dock_device(acpi_handle handle,
        acpi_notify_handler handler, void *context);
 extern void unregister_hotplug_dock_device(acpi_handle handle);
 #else
-#define is_dock_device(h)                      (0)
-#define register_dock_notifier(nb)             (-ENODEV)
-#define unregister_dock_notifier(nb)                   do { } while(0)
-#define register_hotplug_dock_device(h1, h2, c)        (-ENODEV)
-#define unregister_hotplug_dock_device(h)       do { } while(0)
+static inline int is_dock_device(acpi_handle handle)
+{
+       return 0;
+}
+static inline int register_dock_notifier(struct notifier_block *nb)
+{
+       return -ENODEV;
+}
+static inline void unregister_dock_notifier(struct notifier_block *nb)
+{
+}
+static inline int register_hotplug_dock_device(acpi_handle handle,
+                               acpi_notify_handler handler, void *context)
+{
+       return -ENODEV;
+}
+static inline void unregister_hotplug_dock_device(acpi_handle handle)
+{
+}
 #endif
 #endif /*__ACPI_DRIVERS_H__*/
index 781394b9efe0b630621e246450f4bc575f754b94..2785058c82ab0621991b54a243473e49ff3bc2a8 100644 (file)
@@ -240,12 +240,6 @@ acpi_status
 acpi_os_validate_address(u8 space_id,
                         acpi_physical_address address, acpi_size length);
 
-u8 acpi_os_readable(void *pointer, acpi_size length);
-
-#ifdef ACPI_FUTURE_USAGE
-u8 acpi_os_writable(void *pointer, acpi_size length);
-#endif
-
 u64 acpi_os_get_timer(void);
 
 acpi_status acpi_os_signal(u32 function, void *info);
index 7798d2a9f793aaab8005c2a45d3362a35029ea5b..916c0102db5be85430791c1b5c575cbee888be98 100644 (file)
@@ -79,6 +79,7 @@ struct acpi_processor_power {
        u32 bm_activity;
        int count;
        struct acpi_processor_cx states[ACPI_PROCESSOR_MAX_POWER];
+       int timer_broadcast_on_state;
 };
 
 /* Performance Management */
index 5f24c755f577d9fc48add5c52300f377ed2690e4..90d7c35d286703a86a4f1c59061b2212b2de367d 100644 (file)
@@ -49,7 +49,6 @@
 #define MADV_DOFORK    11              /* do inherit across fork */
 
 /* compatibility flags */
-#define MAP_ANON       MAP_ANONYMOUS
 #define MAP_FILE       0
 
 #endif /* __ALPHA_MMAN_H__ */
index 48348fe34c19bc5b6ace3fbfe7a88838033577c9..651ebb141b24c802be33fe1020f42813b9ef3bdd 100644 (file)
@@ -1,6 +1,20 @@
 #ifndef __ALPHA_PERCPU_H
 #define __ALPHA_PERCPU_H
 
+/*
+ * Increase the per cpu area for Alpha so that
+ * modules using percpu area can load.
+ */
+#ifdef CONFIG_MODULES
+# define PERCPU_MODULE_RESERVE 8192
+#else
+# define PERCPU_MODULE_RESERVE 0
+#endif
+
+#define PERCPU_ENOUGH_ROOM \
+       (ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES) + \
+        PERCPU_MODULE_RESERVE)
+
 #include <asm-generic/percpu.h>
 
 #endif /* __ALPHA_PERCPU_H */
index 1cfd27f0ad7310278a062d602a7e24eccba4fb88..39e492c3bfa3fe33c78c20aa796c89888d6b702e 100644 (file)
@@ -66,24 +66,6 @@ struct termio {
 #define _VEOL2 6
 #define _VSWTC 7
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IrDa - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 /*     eof=^D          eol=\0          eol2=\0         erase=del
        werase=^W       kill=^U         reprint=^R      sxtc=\0
index a011d27876a2dd0b2c42df472f199519b46849da..e09d6528fadf85497a0839206d67321bbc511852 100644 (file)
 
 #ifndef __ASSEMBLY__
 /* setup setup routines, called from board init or driver probe() */
+extern int __init_or_module at91_set_GPIO_periph(unsigned pin, int use_pullup);
 extern int __init_or_module at91_set_A_periph(unsigned pin, int use_pullup);
 extern int __init_or_module at91_set_B_periph(unsigned pin, int use_pullup);
 extern int __init_or_module at91_set_gpio_input(unsigned pin, int use_pullup);
@@ -193,7 +194,50 @@ extern int at91_get_gpio_value(unsigned pin);
 /* callable only from core power-management code */
 extern void at91_gpio_suspend(void);
 extern void at91_gpio_resume(void);
-#endif
 
-#endif
+/*-------------------------------------------------------------------------*/
+
+/* wrappers for "new style" GPIO calls. the old AT91-specfic ones should
+ * eventually be removed (along with this errno.h inclusion), and the
+ * gpio request/free calls should probably be implemented.
+ */
+
+#include <asm/errno.h>
+
+static inline int gpio_request(unsigned gpio, const char *label)
+{
+       return 0;
+}
+
+static inline void gpio_free(unsigned gpio)
+{
+}
+
+extern int gpio_direction_input(unsigned gpio);
+extern int gpio_direction_output(unsigned gpio);
 
+static inline int gpio_get_value(unsigned gpio)
+{
+       return at91_get_gpio_value(gpio);
+}
+
+static inline void gpio_set_value(unsigned gpio, int value)
+{
+       at91_set_gpio_value(gpio, value);
+}
+
+#include <asm-generic/gpio.h>          /* cansleep wrappers */
+
+static inline int gpio_to_irq(unsigned gpio)
+{
+       return gpio;
+}
+
+static inline int irq_to_gpio(unsigned irq)
+{
+       return irq;
+}
+
+#endif /* __ASSEMBLY__ */
+
+#endif
diff --git a/include/asm-arm/arch-imx/spi_imx.h b/include/asm-arm/arch-imx/spi_imx.h
new file mode 100644 (file)
index 0000000..2165449
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * include/asm-arm/arch-imx/spi_imx.h
+ *
+ * Copyright (C) 2006 SWAPP
+ *     Andrea Paterniani <a.paterniani@swapp-eng.it>
+ *
+ * Initial version inspired by:
+ *     linux-2.6.17-rc3-mm1/include/asm-arm/arch-pxa/pxa2xx_spi.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.
+ *
+ * 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.
+ */
+
+#ifndef SPI_IMX_H_
+#define SPI_IMX_H_
+
+
+/*-------------------------------------------------------------------------*/
+/**
+ * struct spi_imx_master - device.platform_data for SPI controller devices.
+ * @num_chipselect: chipselects are used to distinguish individual
+ *     SPI slaves, and are numbered from zero to num_chipselects - 1.
+ *     each slave has a chipselect signal, but it's common that not
+ *     every chipselect is connected to a slave.
+ * @enable_dma: if true enables DMA driven transfers.
+*/
+struct spi_imx_master {
+       u8 num_chipselect;
+       u8 enable_dma:1;
+};
+/*-------------------------------------------------------------------------*/
+
+
+/*-------------------------------------------------------------------------*/
+/**
+ * struct spi_imx_chip - spi_board_info.controller_data for SPI
+ * slave devices, copied to spi_device.controller_data.
+ * @enable_loopback : used for test purpouse to internally connect RX and TX
+ *     sections.
+ * @enable_dma : enables dma transfer (provided that controller driver has
+ *     dma enabled too).
+ * @ins_ss_pulse : enable /SS pulse insertion between SPI burst.
+ * @bclk_wait : number of bclk waits between each bits_per_word SPI burst.
+ * @cs_control : function pointer to board-specific function to assert/deassert
+ *     I/O port to control HW generation of devices chip-select.
+*/
+struct spi_imx_chip {
+       u8      enable_loopback:1;
+       u8      enable_dma:1;
+       u8      ins_ss_pulse:1;
+       u16     bclk_wait:15;
+       void (*cs_control)(u32 control);
+};
+
+/* Chip-select state */
+#define SPI_CS_ASSERT                  (1 << 0)
+#define SPI_CS_DEASSERT                        (1 << 1)
+/*-------------------------------------------------------------------------*/
+
+
+#endif /* SPI_IMX_H_*/
index f486b72070eab1b39893264a5730186ca33397f9..3762a6ae6a7f345d1343d1defa43737546b9e445 100644 (file)
@@ -76,4 +76,70 @@ extern void omap_set_gpio_direction(int gpio, int is_input);
 extern void omap_set_gpio_dataout(int gpio, int enable);
 extern int omap_get_gpio_datain(int gpio);
 
+/*-------------------------------------------------------------------------*/
+
+/* wrappers for "new style" GPIO calls. the old OMAP-specfic ones should
+ * eventually be removed (along with this errno.h inclusion), and maybe
+ * gpios should put MPUIOs last too.
+ */
+
+#include <asm/errno.h>
+
+static inline int gpio_request(unsigned gpio, const char *label)
+{
+       return omap_request_gpio(gpio);
+}
+
+static inline void gpio_free(unsigned gpio)
+{
+       omap_free_gpio(gpio);
+}
+
+static inline int __gpio_set_direction(unsigned gpio, int is_input)
+{
+       if (cpu_class_is_omap2()) {
+               if (gpio > OMAP_MAX_GPIO_LINES)
+                       return -EINVAL;
+       } else {
+               if (gpio > (OMAP_MAX_GPIO_LINES + 16 /* MPUIO */))
+                       return -EINVAL;
+       }
+       omap_set_gpio_direction(gpio, is_input);
+       return 0;
+}
+
+static inline int gpio_direction_input(unsigned gpio)
+{
+       return __gpio_set_direction(gpio, 1);
+}
+
+static inline int gpio_direction_output(unsigned gpio)
+{
+       return __gpio_set_direction(gpio, 0);
+}
+
+static inline int gpio_get_value(unsigned gpio)
+{
+       return omap_get_gpio_datain(gpio);
+}
+
+static inline void gpio_set_value(unsigned gpio, int value)
+{
+       omap_set_gpio_dataout(gpio, value);
+}
+
+#include <asm-generic/gpio.h>          /* cansleep wrappers */
+
+static inline int gpio_to_irq(unsigned gpio)
+{
+       return OMAP_GPIO_IRQ(gpio);
+}
+
+static inline int irq_to_gpio(unsigned irq)
+{
+       if (cpu_class_is_omap1() && (irq < (IH_MPUIO_BASE + 16)))
+               return (irq - IH_MPUIO_BASE) + OMAP_MAX_GPIO_LINES;
+       return irq - IH_GPIO_BASE;
+}
+
 #endif
diff --git a/include/asm-arm/arch-pxa/gpio.h b/include/asm-arm/arch-pxa/gpio.h
new file mode 100644 (file)
index 0000000..e67c238
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * linux/include/asm-arm/arch-pxa/gpio.h
+ *
+ * PXA GPIO wrappers for arch-neutral GPIO calls
+ *
+ * Written by Philipp Zabel <philipp.zabel@gmail.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
+ *
+ */
+
+#ifndef __ASM_ARCH_PXA_GPIO_H
+#define __ASM_ARCH_PXA_GPIO_H
+
+#include <asm/arch/pxa-regs.h>
+#include <asm/arch/irqs.h>
+#include <asm/arch/hardware.h>
+
+#include <asm/errno.h>
+
+static inline int gpio_request(unsigned gpio, const char *label)
+{
+       return 0;
+}
+
+static inline void gpio_free(unsigned gpio)
+{
+       return;
+}
+
+static inline int gpio_direction_input(unsigned gpio)
+{
+       if (gpio > PXA_LAST_GPIO)
+               return -EINVAL;
+       pxa_gpio_mode(gpio | GPIO_IN);
+}
+
+static inline int gpio_direction_output(unsigned gpio)
+{
+       if (gpio > PXA_LAST_GPIO)
+               return -EINVAL;
+       pxa_gpio_mode(gpio | GPIO_OUT);
+}
+
+/* REVISIT these macros are correct, but suffer code explosion
+ * for non-constant parameters.  Provide out-line versions too.
+ */
+#define gpio_get_value(gpio) \
+       (GPLR(gpio) & GPIO_bit(gpio))
+
+#define gpio_set_value(gpio,value) \
+       ((value) ? (GPSR(gpio) = GPIO_bit(gpio)):(GPCR(gpio) = GPIO_bit(gpio)))
+
+#include <asm-generic/gpio.h>                  /* cansleep wrappers */
+
+#define gpio_to_irq(gpio)      IRQ_GPIO(gpio)
+#define irq_to_gpio(irq)       IRQ_TO_GPIO(irq)
+
+
+#endif
diff --git a/include/asm-arm/arch-s3c2410/gpio.h b/include/asm-arm/arch-s3c2410/gpio.h
new file mode 100644 (file)
index 0000000..67b8b9a
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * linux/include/asm-arm/arch-pxa/gpio.h
+ *
+ * S3C2400 GPIO wrappers for arch-neutral GPIO calls
+ *
+ * Written by Philipp Zabel <philipp.zabel@gmail.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
+ *
+ */
+
+#ifndef __ASM_ARCH_PXA_GPIO_H
+#define __ASM_ARCH_PXA_GPIO_H
+
+#include <asm/arch/pxa-regs.h>
+#include <asm/arch/irqs.h>
+#include <asm/arch/hardware.h>
+
+#include <asm/errno.h>
+
+static inline int gpio_request(unsigned gpio, const char *label)
+{
+       return 0;
+}
+
+static inline void gpio_free(unsigned gpio)
+{
+       return;
+}
+
+static inline int gpio_direction_input(unsigned gpio)
+{
+       s3c2410_gpio_cfgpin(gpio, S3C2410_GPIO_INPUT);
+       return 0;
+}
+
+static inline int gpio_direction_output(unsigned gpio)
+{
+       s3c2410_gpio_cfgpin(gpio, S3C2410_GPIO_OUTPUT);
+       return 0;
+}
+
+#define gpio_get_value(gpio)           s3c2410_gpio_getpin(gpio)
+#define gpio_set_value(gpio,value)     s3c2410_gpio_setpin(gpio, value)
+
+#include <asm-generic/gpio.h>                  /* cansleep wrappers */
+
+/* FIXME or maybe s3c2400_gpio_getirq() ... */
+#define gpio_to_irq(gpio)              s3c2410_gpio_getirq(gpio)
+
+/* FIXME implement irq_to_gpio() */
+
+#endif
diff --git a/include/asm-arm/arch-sa1100/gpio.h b/include/asm-arm/arch-sa1100/gpio.h
new file mode 100644 (file)
index 0000000..a331fe3
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * linux/include/asm-arm/arch-pxa/gpio.h
+ *
+ * SA1100 GPIO wrappers for arch-neutral GPIO calls
+ *
+ * Written by Philipp Zabel <philipp.zabel@gmail.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
+ *
+ */
+
+#ifndef __ASM_ARCH_SA1100_GPIO_H
+#define __ASM_ARCH_SA1100_GPIO_H
+
+#include <asm/arch/SA-1100.h>
+#include <asm/arch/irqs.h>
+#include <asm/arch/hardware.h>
+
+#include <asm/errno.h>
+
+static inline int gpio_request(unsigned gpio, const char *label)
+{
+       return 0;
+}
+
+static inline void gpio_free(unsigned gpio)
+{
+       return;
+}
+
+static inline int gpio_direction_input(unsigned gpio)
+{
+       if (gpio > GPIO_MAX)
+               return -EINVAL;
+       GPDR = (GPDR_In << gpio) 0
+}
+
+static inline int gpio_direction_output(unsigned gpio)
+{
+       if (gpio > GPIO_MAX)
+               return -EINVAL;
+       GPDR = (GPDR_Out << gpio) 0
+}
+
+#define gpio_get_value(gpio) \
+       (GPLR & GPIO_GPIO(gpio))
+
+#define gpio_set_value(gpio,value) \
+       ((value) ? (GPSR = GPIO_GPIO(gpio)) : (GPCR(gpio) = GPIO_GPIO(gpio)))
+
+#include <asm-generic/gpio.h>                  /* cansleep wrappers */
+
+static inline unsigned gpio_to_irq(unsigned gpio)
+{
+       if (gpio < 11)
+               return IRQ_GPIO0 + gpio;
+       else
+               return IRQ_GPIO11 - 11 + gpio;
+}
+
+static inline unsigned irq_to_gpio(unsigned irq)
+{
+       if (irq < IRQ_GPIO11_27)
+               return irq - IRQ_GPIO0;
+       else
+               return irq - IRQ_GPIO11 + 11;
+}
+
+#endif
diff --git a/include/asm-arm/gpio.h b/include/asm-arm/gpio.h
new file mode 100644 (file)
index 0000000..fff4f80
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef _ARCH_ARM_GPIO_H
+#define _ARCH_ARM_GPIO_H
+
+/* not all ARM platforms necessarily support this API ... */
+#include <asm/arch/gpio.h>
+
+#endif /* _ARCH_ARM_GPIO_H */
diff --git a/include/asm-arm/hardware/gpio_keys.h b/include/asm-arm/hardware/gpio_keys.h
new file mode 100644 (file)
index 0000000..2b217c7
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef _GPIO_KEYS_H
+#define _GPIO_KEYS_H
+
+struct gpio_keys_button {
+       /* Configuration parameters */
+       int keycode;
+       int gpio;
+       int active_low;
+       char *desc;
+};
+
+struct gpio_keys_platform_data {
+       struct gpio_keys_button *buttons;
+       int nbuttons;
+};
+
+#endif
index 861092fbaa53283953bd41c9dbb6e840bb42ff02..800ba5254dafef9bff57c98a19dcb599b0982cbc 100644 (file)
@@ -85,7 +85,6 @@ static inline void __raw_spin_unlock(raw_spinlock_t *lock)
  * Write locks are easy - we just set bit 31.  When unlocking, we can
  * just write zero since the lock is exclusively held.
  */
-#define rwlock_is_locked(x)    (*((volatile unsigned int *)(x)) != 0)
 
 static inline void __raw_write_lock(raw_rwlock_t *rw)
 {
index 7b8f5e8ae063a0ad03e806f943e81aa19ea6cec9..329c324c4040c9c3fcb0a1302465a4ed88d49209 100644 (file)
@@ -49,24 +49,6 @@ struct termio {
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IrDa - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 
 /*
index 5f420a0149f1d5dd133e17890d4a81ac2a8f0c74..c92df958802e304dd60fb92a8a92bbb1facf142b 100644 (file)
@@ -76,10 +76,10 @@ static inline void set_fs(mm_segment_t fs)
 
 /* We use 33-bit arithmetic here... */
 #define __range_ok(addr,size) ({ \
-       unsigned long flag, sum; \
+       unsigned long flag, roksum; \
        __chk_user_ptr(addr);   \
        __asm__("adds %1, %2, %3; sbcccs %1, %1, %0; movcc %0, #0" \
-               : "=&r" (flag), "=&r" (sum) \
+               : "=&r" (flag), "=&r" (roksum) \
                : "r" (addr), "Ir" (size), "0" (current_thread_info()->addr_limit) \
                : "cc"); \
        flag; })
index 7b8f5e8ae063a0ad03e806f943e81aa19ea6cec9..329c324c4040c9c3fcb0a1302465a4ed88d49209 100644 (file)
@@ -49,24 +49,6 @@ struct termio {
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IrDa - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 
 /*
index 19f798e338c974e17d317233950be3f4105af82a..ade76ec02995c96b48a4493aea5812523d3105af 100644 (file)
@@ -34,9 +34,9 @@ static inline void set_fs (mm_segment_t fs)
 }
 
 #define __range_ok(addr,size) ({                                       \
-       unsigned long flag, sum;                                        \
+       unsigned long flag, roksum;                                     \
        __asm__ __volatile__("subs %1, %0, %3; cmpcs %1, %2; movcs %0, #0" \
-               : "=&r" (flag), "=&r" (sum)                             \
+               : "=&r" (flag), "=&r" (roksum)                          \
                : "r" (addr), "Ir" (size), "0" (current_thread_info()->addr_limit)      \
                : "cc");                                                \
        flag; })
index b120ee030c867b97a46d1d314fe376d0f5fbd2e7..1a7b07d436ffe4cde3a3f9f65e4614eed96f5449 100644 (file)
@@ -26,7 +26,9 @@ struct eth_platform_data {
 struct platform_device *
 at32_add_device_eth(unsigned int id, struct eth_platform_data *data);
 
-struct platform_device *at32_add_device_spi(unsigned int id);
+struct spi_board_info;
+struct platform_device *
+at32_add_device_spi(unsigned int id, struct spi_board_info *b, unsigned int n);
 
 struct lcdc_platform_data {
        unsigned long fbmem_start;
index eec47500fa66e2d5514628b5950f014fc4a54d6d..c08e810483936534ba6da061cde31a6050dfb904 100644 (file)
@@ -28,13 +28,13 @@ static __inline__ void * phys_to_virt(unsigned long address)
  * Generic IO read/write.  These perform native-endian accesses.  Note
  * that some architectures will want to re-define __raw_{read,write}w.
  */
-extern void __raw_writesb(unsigned int addr, const void *data, int bytelen);
-extern void __raw_writesw(unsigned int addr, const void *data, int wordlen);
-extern void __raw_writesl(unsigned int addr, const void *data, int longlen);
+extern void __raw_writesb(void __iomem *addr, const void *data, int bytelen);
+extern void __raw_writesw(void __iomem *addr, const void *data, int wordlen);
+extern void __raw_writesl(void __iomem *addr, const void *data, int longlen);
 
-extern void __raw_readsb(unsigned int addr, void *data, int bytelen);
-extern void __raw_readsw(unsigned int addr, void *data, int wordlen);
-extern void __raw_readsl(unsigned int addr, void *data, int longlen);
+extern void __raw_readsb(const void __iomem *addr, void *data, int bytelen);
+extern void __raw_readsw(const void __iomem *addr, void *data, int wordlen);
+extern void __raw_readsl(const void __iomem *addr, void *data, int longlen);
 
 static inline void writeb(unsigned char b, volatile void __iomem *addr)
 {
@@ -252,6 +252,9 @@ extern void __iounmap(void __iomem *addr);
 #define ioremap(offset, size)                  \
        __ioremap((offset), (size), 0)
 
+#define ioremap_nocache(offset, size)          \
+       __ioremap((offset), (size), 0)
+
 #define iounmap(addr)                          \
        __iounmap(addr)
 
@@ -263,6 +266,14 @@ extern void __iounmap(void __iomem *addr);
 #define page_to_bus page_to_phys
 #define bus_to_page phys_to_page
 
+/*
+ * Create a virtual mapping cookie for an IO port range.  There exists
+ * no such thing as port-based I/O on AVR32, so a regular ioremap()
+ * should do what we need.
+ */
+#define ioport_map(port, nr)   ioremap(port, nr)
+#define ioport_unmap(port)     iounmap(port)
+
 #define dma_cache_wback_inv(_start, _size)     \
        flush_dcache_region(_start, _size)
 #define dma_cache_inv(_start, _size)           \
index 615bc0639e5ceb5e5b15f2bd8bd527d8224c9470..0152aba35154b5a8b53644e1466f30cd3748296e 100644 (file)
@@ -46,24 +46,6 @@ struct termio {
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IR - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14      /* synchronous PPP */
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 /*     intr=^C         quit=^\         erase=del       kill=^U
        eof=^D          vtime=\0        vmin=\1         sxtc=\0
index 56ed1f9d348a55f1ad3e534310a63359ec66dc58..8f51204718193751bc131cc4f9ce772c2405a36b 100644 (file)
 #define __NR_getitimer         105
 #define __NR_swapoff           106
 #define __NR_sysinfo           107
-#define __NR_ipc               108
+/* 108 was __NR_ipc for a little while */
 #define __NR_sendfile          109
 #define __NR_setdomainname     110
 #define __NR_uname             111
 #define __NR_vmsplice          264
 #define __NR_epoll_pwait       265
 
+#define __NR_msgget            266
+#define __NR_msgsnd            267
+#define __NR_msgrcv            268
+#define __NR_msgctl            269
+#define __NR_semget            270
+#define __NR_semop             271
+#define __NR_semctl            272
+#define __NR_semtimedop                273
+#define __NR_shmat             274
+#define __NR_shmget            275
+#define __NR_shmdt             276
+#define __NR_shmctl            277
+
 #ifdef __KERNEL__
-#define NR_syscalls            266
+#define NR_syscalls            278
 
 
 #define __ARCH_WANT_IPC_PARSE_VERSION
index a8e1e6cb7cd02f816823b22261808e53bbb290bd..27bfeca1b981a5b8fa343a76796aa38ef8f8c90e 100644 (file)
@@ -30,8 +30,7 @@ static inline int waking_non_zero(struct semaphore *sem)
        unsigned long flags;
        int ret = 0;
 
-       local_save_flags(flags);
-       local_irq_disable();
+       local_irq_save(flags);
        if (read(&sem->waking) > 0) {
                dec(&sem->waking);
                ret = 1;
@@ -46,8 +45,7 @@ static inline int waking_non_zero_interruptible(struct semaphore *sem,
        int ret = 0;
        unsigned long flags;
 
-       local_save_flags(flags);
-       local_irq_disable();
+       local_irq_save(flags);
        if (read(&sem->waking) > 0) {
                dec(&sem->waking);
                ret = 1;
@@ -64,8 +62,7 @@ static inline int waking_non_zero_trylock(struct semaphore *sem)
         int ret = 1;
        unsigned long flags;
 
-       local_save_flags(flags);
-       local_irq_disable();
+       local_irq_save(flags);
        if (read(&sem->waking) <= 0)
                inc(&sem->count);
        else {
index b869f6161aaa1c73e770fb2f238eecc7894654d9..fea0e8d57cb51883f5d0c31202ef33ed089f863d 100644 (file)
@@ -44,8 +44,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz
   /* since Etrax doesn't have any atomic xchg instructions, we need to disable
      irq's (if enabled) and do it with move.d's */
   unsigned long flags,temp;
-  local_save_flags(flags); /* save flags, including irq enable bit */
-  local_irq_disable();             /* shut off irq's */
+  local_irq_save(flags); /* save flags, including irq enable bit and shut off irqs */
   switch (size) {
   case 1:
     *((unsigned char *)&temp) = x;
index 5ce1023c5d7b0b1389e41468c3af8a8eafbfcb0e..c9dbd4d43368c897c73408d5bfff4a5334351a0c 100644 (file)
@@ -40,24 +40,6 @@ struct termio {
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IR - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14      /* synchronous PPP */
-#define N_BT           15      /* bluetooth */
-
 #ifdef __KERNEL__
 
 /*     intr=^C         quit=^\         erase=del       kill=^U
index 8840cf95e8ddc175c0795bf74579b938caea8d38..a62fb58723758faeef174533a1e867356f0da697 100644 (file)
@@ -51,24 +51,6 @@ struct termio {
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IrDa - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 #include <asm-generic/termios.h>
 #endif
index a7f1a55ce6b0a07b2bf7850e4dda29c3eb88d67d..29413d3d460574476c1dc3249efd7b3ca9e2cb32 100644 (file)
@@ -3,7 +3,6 @@
 
 /* This is used for archs that do not support DMA */
 
-
 static inline void *
 dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
                   gfp_t flag)
@@ -19,4 +18,7 @@ dma_free_coherent(struct device *dev, size_t size, void *cpu_addr,
        BUG();
 }
 
+#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
+#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
+
 #endif /* _ASM_GENERIC_DMA_MAPPING_H */
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
new file mode 100644 (file)
index 0000000..2d0aab1
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef _ASM_GENERIC_GPIO_H
+#define _ASM_GENERIC_GPIO_H
+
+/* platforms that don't directly support access to GPIOs through I2C, SPI,
+ * or other blocking infrastructure can use these wrappers.
+ */
+
+static inline int gpio_cansleep(unsigned gpio)
+{
+       return 0;
+}
+
+static inline int gpio_get_value_cansleep(unsigned gpio)
+{
+       might_sleep();
+       return gpio_get_value(gpio);
+}
+
+static inline void gpio_set_value_cansleep(unsigned gpio, int value)
+{
+       might_sleep();
+       gpio_set_value(gpio, value);
+}
+
+#endif /* _ASM_GENERIC_GPIO_H */
index 8078cbd2c0163878b44ace538a39422082b60cb2..30d8d33491dddd86466dc2df917270d8499c5415 100644 (file)
@@ -54,7 +54,7 @@
 #define __page_to_pfn(pg)                                      \
 ({     struct page *__pg = (pg);                               \
        int __sec = page_to_section(__pg);                      \
-       __pg - __section_mem_map_addr(__nr_to_section(__sec));  \
+       (unsigned long)(__pg - __section_mem_map_addr(__nr_to_section(__sec))); \
 })
 
 #define __pfn_to_page(pfn)                             \
index 3b41d2bb70da36bfd8d09a16dfb3f3e4581445b5..5e3dde2ee5adf37f5ccd62fa11f9b3878bc5a653 100644 (file)
@@ -36,7 +36,6 @@
 #define MADV_DOFORK    11              /* do inherit across fork */
 
 /* compatibility flags */
-#define MAP_ANON       MAP_ANONYMOUS
 #define MAP_FILE       0
 
 #endif
index 9d774d07d95b4a3a53d5fb75fac15b076d892a02..00c23433b39f2ad868aefc6f414d2e728398bd15 100644 (file)
@@ -182,6 +182,19 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addres
 #define arch_leave_lazy_mmu_mode()     do {} while (0)
 #endif
 
+/*
+ * A facility to provide batching of the reload of page tables with the
+ * actual context switch code for paravirtualized guests.  By convention,
+ * only one of the lazy modes (CPU, MMU) should be active at any given
+ * time, entry should never be nested, and entry and exits should always
+ * be paired.  This is for sanity of maintaining and reasoning about the
+ * kernel code.
+ */
+#ifndef __HAVE_ARCH_ENTER_LAZY_CPU_MODE
+#define arch_enter_lazy_cpu_mode()     do {} while (0)
+#define arch_leave_lazy_cpu_mode()     do {} while (0)
+#endif
+
 /*
  * When walking page tables, get the address of the next boundary,
  * or the end address of the range if that comes earlier.  Although no
index e2319f992af298c7f8eaff5d0ec945256647b406..fb2925d08c491e21acff0564e960520eac178bb1 100644 (file)
@@ -49,24 +49,6 @@ struct termio {
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IrDa - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 
 /*
index 5e657eb8946c953bc0b58846344653cc9d1eaa9c..449f3f272e070753c25877e5b23445ffbd75ac4f 100644 (file)
@@ -127,6 +127,7 @@ extern int acpi_irq_balance_set(char *str);
 #define acpi_ioapic 0
 static inline void acpi_noirq_set(void) { }
 static inline void acpi_disable_pci(void) { }
+static inline void disable_acpi(void) { }
 
 #endif /* !CONFIG_ACPI */
 
index 41a44319905fa884d58f53384d00376c60d51fb8..cc6b1652249aed9ed4251166b1b9c47a8cd27338 100644 (file)
@@ -43,6 +43,8 @@ extern void generic_apic_probe(void);
 #define apic_write native_apic_write
 #define apic_write_atomic native_apic_write_atomic
 #define apic_read native_apic_read
+#define setup_boot_clock setup_boot_APIC_clock
+#define setup_secondary_clock setup_secondary_APIC_clock
 #endif
 
 static __inline fastcall void native_apic_write(unsigned long reg,
@@ -93,9 +95,7 @@ static inline void ack_APIC_irq(void)
        apic_write_around(APIC_EOI, 0);
 }
 
-extern void (*wait_timer_tick)(void);
-
-extern int get_maxlvt(void);
+extern int lapic_get_maxlvt(void);
 extern void clear_local_APIC(void);
 extern void connect_bsp_APIC (void);
 extern void disconnect_bsp_APIC (int virt_wire_setup);
@@ -111,14 +111,9 @@ extern void smp_local_timer_interrupt (void);
 extern void setup_boot_APIC_clock (void);
 extern void setup_secondary_APIC_clock (void);
 extern int APIC_init_uniprocessor (void);
-extern void disable_APIC_timer(void);
-extern void enable_APIC_timer(void);
 
 extern void enable_NMI_through_LVT0 (void * dummy);
 
-void smp_send_timer_broadcast_ipi(void);
-void switch_APIC_timer_to_ipi(void *cpumask);
-void switch_ipi_to_APIC_timer(void *cpumask);
 #define ARCH_APICTIMER_STOPS_ON_C3     1
 
 extern int timer_over_8254;
index c57441bb290502c449e4217684711a3b11c34a3f..4dd272331361c7eb747305366810fc92c28b3b08 100644 (file)
@@ -211,12 +211,12 @@ static __inline__ int atomic_sub_return(int i, atomic_t *v)
 #define atomic_xchg(v, new) (xchg(&((v)->counter), new))
 
 /**
- * atomic_add_unless - add unless the number is a given value
+ * atomic_add_unless - add unless the number is already 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.
+ * Atomically adds @a to @v, so long as @v was not already @u.
  * Returns non-zero if @v was not @u, and zero otherwise.
  */
 #define atomic_add_unless(v, a, u)                             \
index 1c780fa1e762e966a6f6255dbf0e5bbf4a326e65..273b50629357bf15955b6c433a9d95f19af9dfbe 100644 (file)
@@ -371,7 +371,7 @@ static inline unsigned long ffz(unsigned long word)
  *
  * This is defined the same way as
  * the libc and compiler builtin ffs routines, therefore
- * differs in spirit from the above ffz (man ffs).
+ * differs in spirit from the above ffz() (man ffs).
  */
 static inline int ffs(int x)
 {
@@ -388,7 +388,7 @@ static inline int ffs(int x)
  * fls - find last bit set
  * @x: the word to search
  *
- * This is defined the same way as ffs.
+ * This is defined the same way as ffs().
  */
 static inline int fls(int x)
 {
index 38f1aebbbdb5f5587df51976e13fd1f352fd36eb..c90c7c499302059524699649bf3d428d44bca408 100644 (file)
@@ -160,7 +160,7 @@ static void __init check_config(void)
  * If we configured ourselves for a TSC, we'd better have one!
  */
 #ifdef CONFIG_X86_TSC
-       if (!cpu_has_tsc)
+       if (!cpu_has_tsc && !tsc_disable)
                panic("Kernel compiled for Pentium+, requires TSC feature!");
 #endif
 
index f398cc456448187bff38c53ad81a314d2d063212..050831f34f71ce8f2001872c41b982c61262043e 100644 (file)
@@ -22,7 +22,7 @@ struct Xgt_desc_struct {
 
 extern struct Xgt_desc_struct idt_descr;
 DECLARE_PER_CPU(struct Xgt_desc_struct, cpu_gdt_descr);
-
+extern struct Xgt_desc_struct early_gdt_descr;
 
 static inline struct desc_struct *get_cpu_gdt_table(unsigned int cpu)
 {
index 369035dfe4b6516c8b8b965729fc092500c41a65..8d33c9bb7c1c208681421a322ba37899f54098f4 100644 (file)
@@ -90,8 +90,8 @@ typedef struct user_fxsr_struct elf_fpxregset_t;
        pr_reg[6] = regs->eax;                          \
        pr_reg[7] = regs->xds;                          \
        pr_reg[8] = regs->xes;                          \
-       savesegment(fs,pr_reg[9]);                      \
-       pr_reg[10] = regs->xgs;                         \
+       pr_reg[9] = regs->xfs;                          \
+       savesegment(gs,pr_reg[10]);                     \
        pr_reg[11] = regs->orig_eax;                    \
        pr_reg[12] = regs->eip;                         \
        pr_reg[13] = regs->xcs;                         \
index e47be9a56cc23aa8455e842af5eca1b8e4c58ff4..fc03cf9de5c48fa77238af44ca8feeb78541ba95 100644 (file)
 #define HPET_MIN_PERIOD (100000UL)
 #define HPET_TICK_RATE  (HZ * 100000UL)
 
-extern unsigned long hpet_tick;        /* hpet clks count per tick */
 extern unsigned long hpet_address;     /* hpet memory map physical address */
-extern int hpet_use_timer;
+extern int is_hpet_enabled(void);
 
+#ifdef CONFIG_X86_64
+extern unsigned long hpet_tick;        /* hpet clks count per tick */
+extern int hpet_use_timer;
 extern int hpet_rtc_timer_init(void);
 extern int hpet_enable(void);
-extern int hpet_reenable(void);
-extern int is_hpet_enabled(void);
 extern int is_hpet_capable(void);
 extern int hpet_readl(unsigned long a);
+#else
+extern int hpet_enable(void);
+#endif
 
 #ifdef CONFIG_HPET_EMULATE_RTC
 extern int hpet_mask_rtc_irq_bit(unsigned long bit_mask);
@@ -110,5 +113,10 @@ extern int hpet_rtc_dropped_irq(void);
 extern int hpet_rtc_timer_init(void);
 extern irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id);
 #endif /* CONFIG_HPET_EMULATE_RTC */
+
+#else
+
+static inline int hpet_enable(void) { return 0; }
+
 #endif /* CONFIG_HPET_TIMER */
 #endif /* _I386_HPET_H */
index 015d8df076908038658aebce6f34d84581642793..6cb0dd4dcddef8c1e89791fe78c64aa8185befad 100644 (file)
@@ -1,6 +1,21 @@
 #ifndef __ASM_I8253_H__
 #define __ASM_I8253_H__
 
+#include <linux/clockchips.h>
+
 extern spinlock_t i8253_lock;
 
+extern struct clock_event_device *global_clock_event;
+
+/**
+ * pit_interrupt_hook - hook into timer tick
+ * @regs:      standard registers from interrupt
+ *
+ * Call the global clock event handler.
+ **/
+static inline void pit_interrupt_hook(void)
+{
+       global_clock_event->event_handler(global_clock_event);
+}
+
 #endif /* __ASM_I8253_H__ */
diff --git a/include/asm-i386/idle.h b/include/asm-i386/idle.h
new file mode 100644 (file)
index 0000000..87ab939
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef _ASM_I386_IDLE_H
+#define _ASM_I386_IDLE_H 1
+
+#define IDLE_START 1
+#define IDLE_END 2
+
+struct notifier_block;
+void idle_notifier_register(struct notifier_block *n);
+void idle_notifier_unregister(struct notifier_block *n);
+
+void exit_idle(void);
+void enter_idle(void);
+
+#endif
index 7d606e3364aec30d667c9b21c6c5368671c40ca0..56e5689863aece4257d00395b66d6fa8ae8a489e 100644 (file)
@@ -1,86 +1,16 @@
 /* defines for inline arch setup functions */
+#include <linux/clockchips.h>
 
-#include <asm/apic.h>
 #include <asm/i8259.h>
+#include <asm/i8253.h>
 
 /**
  * do_timer_interrupt_hook - hook into timer tick
- * @regs:      standard registers from interrupt
  *
- * Description:
- *     This hook is called immediately after the timer interrupt is ack'd.
- *     It's primary purpose is to allow architectures that don't possess
- *     individual per CPU clocks (like the CPU APICs supply) to broadcast the
- *     timer interrupt as a means of triggering reschedules etc.
+ * Call the pit clock event handler. see asm/i8253.h
  **/
 
 static inline void do_timer_interrupt_hook(void)
 {
-       do_timer(1);
-#ifndef CONFIG_SMP
-       update_process_times(user_mode_vm(get_irq_regs()));
-#endif
-/*
- * In the SMP case we use the local APIC timer interrupt to do the
- * profiling, except when we simulate SMP mode on a uniprocessor
- * system, in that case we have to call the local interrupt handler.
- */
-#ifndef CONFIG_X86_LOCAL_APIC
-       profile_tick(CPU_PROFILING);
-#else
-       if (!using_apic_timer)
-               smp_local_timer_interrupt();
-#endif
-}
-
-
-/* you can safely undefine this if you don't have the Neptune chipset */
-
-#define BUGGY_NEPTUN_TIMER
-
-/**
- * do_timer_overflow - process a detected timer overflow condition
- * @count:     hardware timer interrupt count on overflow
- *
- * Description:
- *     This call is invoked when the jiffies count has not incremented but
- *     the hardware timer interrupt has.  It means that a timer tick interrupt
- *     came along while the previous one was pending, thus a tick was missed
- **/
-static inline int do_timer_overflow(int count)
-{
-       int i;
-
-       spin_lock(&i8259A_lock);
-       /*
-        * This is tricky when I/O APICs are used;
-        * see do_timer_interrupt().
-        */
-       i = inb(0x20);
-       spin_unlock(&i8259A_lock);
-       
-       /* assumption about timer being IRQ0 */
-       if (i & 0x01) {
-               /*
-                * We cannot detect lost timer interrupts ... 
-                * well, that's why we call them lost, don't we? :)
-                * [hmm, on the Pentium and Alpha we can ... sort of]
-                */
-               count -= LATCH;
-       } else {
-#ifdef BUGGY_NEPTUN_TIMER
-               /*
-                * for the Neptun bug we know that the 'latch'
-                * command doesn't latch the high and low value
-                * of the counter atomically. Thus we have to 
-                * substract 256 from the counter 
-                * ... funny, isnt it? :)
-                */
-               
-               count -= 256;
-#else
-               printk("do_slow_gettimeoffset(): hardware timer problem?\n");
-#endif
-       }
-       return count;
+       pit_interrupt_hook();
 }
index 04e69c104a74616fa18b3e926a31682a520b9cf2..60f9dcc15d5427c64ca4a0edd7d4a3adab6ddee8 100644 (file)
@@ -1,25 +1,18 @@
 /* defines for inline arch setup functions */
+#include <linux/clockchips.h>
+
 #include <asm/voyager.h>
+#include <asm/i8253.h>
 
+/**
+ * do_timer_interrupt_hook - hook into timer tick
+ * @regs:     standard registers from interrupt
+ *
+ * Call the pit clock event handler. see asm/i8253.h
+ **/
 static inline void do_timer_interrupt_hook(void)
 {
-       do_timer(1);
-#ifndef CONFIG_SMP
-       update_process_times(user_mode_vm(irq_regs));
-#endif
-
+       pit_interrupt_hook();
        voyager_timer_interrupt();
 }
 
-static inline int do_timer_overflow(int count)
-{
-       /* can't read the ISR, just assume 1 tick
-          overflow */
-       if(count > LATCH || count < 0) {
-               printk(KERN_ERR "VOYAGER PROBLEM: count is %d, latch is %d\n", count, LATCH);
-               count = LATCH;
-       }
-       count -= LATCH;
-
-       return count;
-}
index 7cc1a973bf00f283c1324f65938a7d9505a78319..b0a02ee34ffd74720747c295077720e86604933c 100644 (file)
@@ -3,3 +3,5 @@ extern void mcheck_init(struct cpuinfo_x86 *c);
 #else
 #define mcheck_init(c) do {} while(0)
 #endif
+
+extern int mce_disabled;
index 68ff102d6f5e9e19a92641ce43e40caff64a3e92..e6aa30f8de5b6d47666894711d39492b2774eaed 100644 (file)
@@ -63,7 +63,7 @@ static inline void switch_mm(struct mm_struct *prev,
 }
 
 #define deactivate_mm(tsk, mm)                 \
-       asm("movl %0,%%fs": :"r" (0));
+       asm("movl %0,%%gs": :"r" (0));
 
 #define activate_mm(prev, next) \
        switch_mm((prev),(next),NULL)
index 770bf6da8c3dd019aca47ca2251195db8e057564..f21349399d142e7c7368ddfb803ec2ad758a0714 100644 (file)
@@ -23,7 +23,6 @@ extern struct mpc_config_intsrc mp_irqs [MAX_IRQ_SOURCES];
 extern int mpc_default_type;
 extern unsigned long mp_lapic_addr;
 extern int pic_mode;
-extern int using_apic_timer;
 
 #ifdef CONFIG_ACPI
 extern void mp_register_lapic (u8 id, u8 enabled);
index 609a3899475c5546c1886e0af21e37ab36596f08..6db40d0583f1083e4b4c2c684e1637abdc9126a2 100644 (file)
@@ -307,4 +307,7 @@ static inline void wrmsrl (unsigned long msr, unsigned long long val)
 #define MSR_CORE_PERF_GLOBAL_CTRL      0x38f
 #define MSR_CORE_PERF_GLOBAL_OVF_CTRL  0x390
 
+/* Geode defined MSRs */
+#define MSR_GEODE_BUSCONT_CONF0         0x1900
+
 #endif /* __ASM_MSR_H */
index 9f06265065f4ae564e508aa7851091bd81630f1c..6317e0a4d73565f9a61dcf0cba131782cc8ce3ba 100644 (file)
@@ -59,90 +59,102 @@ struct paravirt_ops
           convention.  This makes it easier to implement inline
           assembler replacements. */
 
-       void (fastcall *cpuid)(unsigned int *eax, unsigned int *ebx,
+       void (*cpuid)(unsigned int *eax, unsigned int *ebx,
                      unsigned int *ecx, unsigned int *edx);
 
-       unsigned long (fastcall *get_debugreg)(int regno);
-       void (fastcall *set_debugreg)(int regno, unsigned long value);
+       unsigned long (*get_debugreg)(int regno);
+       void (*set_debugreg)(int regno, unsigned long value);
 
-       void (fastcall *clts)(void);
+       void (*clts)(void);
 
-       unsigned long (fastcall *read_cr0)(void);
-       void (fastcall *write_cr0)(unsigned long);
+       unsigned long (*read_cr0)(void);
+       void (*write_cr0)(unsigned long);
 
-       unsigned long (fastcall *read_cr2)(void);
-       void (fastcall *write_cr2)(unsigned long);
+       unsigned long (*read_cr2)(void);
+       void (*write_cr2)(unsigned long);
 
-       unsigned long (fastcall *read_cr3)(void);
-       void (fastcall *write_cr3)(unsigned long);
+       unsigned long (*read_cr3)(void);
+       void (*write_cr3)(unsigned long);
 
-       unsigned long (fastcall *read_cr4_safe)(void);
-       unsigned long (fastcall *read_cr4)(void);
-       void (fastcall *write_cr4)(unsigned long);
+       unsigned long (*read_cr4_safe)(void);
+       unsigned long (*read_cr4)(void);
+       void (*write_cr4)(unsigned long);
 
-       unsigned long (fastcall *save_fl)(void);
-       void (fastcall *restore_fl)(unsigned long);
-       void (fastcall *irq_disable)(void);
-       void (fastcall *irq_enable)(void);
-       void (fastcall *safe_halt)(void);
-       void (fastcall *halt)(void);
-       void (fastcall *wbinvd)(void);
+       unsigned long (*save_fl)(void);
+       void (*restore_fl)(unsigned long);
+       void (*irq_disable)(void);
+       void (*irq_enable)(void);
+       void (*safe_halt)(void);
+       void (*halt)(void);
+       void (*wbinvd)(void);
 
        /* err = 0/-EFAULT.  wrmsr returns 0/-EFAULT. */
-       u64 (fastcall *read_msr)(unsigned int msr, int *err);
-       int (fastcall *write_msr)(unsigned int msr, u64 val);
-
-       u64 (fastcall *read_tsc)(void);
-       u64 (fastcall *read_pmc)(void);
-
-       void (fastcall *load_tr_desc)(void);
-       void (fastcall *load_gdt)(const struct Xgt_desc_struct *);
-       void (fastcall *load_idt)(const struct Xgt_desc_struct *);
-       void (fastcall *store_gdt)(struct Xgt_desc_struct *);
-       void (fastcall *store_idt)(struct Xgt_desc_struct *);
-       void (fastcall *set_ldt)(const void *desc, unsigned entries);
-       unsigned long (fastcall *store_tr)(void);
-       void (fastcall *load_tls)(struct thread_struct *t, unsigned int cpu);
-       void (fastcall *write_ldt_entry)(void *dt, int entrynum,
+       u64 (*read_msr)(unsigned int msr, int *err);
+       int (*write_msr)(unsigned int msr, u64 val);
+
+       u64 (*read_tsc)(void);
+       u64 (*read_pmc)(void);
+
+       void (*load_tr_desc)(void);
+       void (*load_gdt)(const struct Xgt_desc_struct *);
+       void (*load_idt)(const struct Xgt_desc_struct *);
+       void (*store_gdt)(struct Xgt_desc_struct *);
+       void (*store_idt)(struct Xgt_desc_struct *);
+       void (*set_ldt)(const void *desc, unsigned entries);
+       unsigned long (*store_tr)(void);
+       void (*load_tls)(struct thread_struct *t, unsigned int cpu);
+       void (*write_ldt_entry)(void *dt, int entrynum,
                                         u32 low, u32 high);
-       void (fastcall *write_gdt_entry)(void *dt, int entrynum,
+       void (*write_gdt_entry)(void *dt, int entrynum,
                                         u32 low, u32 high);
-       void (fastcall *write_idt_entry)(void *dt, int entrynum,
+       void (*write_idt_entry)(void *dt, int entrynum,
                                         u32 low, u32 high);
-       void (fastcall *load_esp0)(struct tss_struct *tss,
+       void (*load_esp0)(struct tss_struct *tss,
                                   struct thread_struct *thread);
 
-       void (fastcall *set_iopl_mask)(unsigned mask);
+       void (*set_iopl_mask)(unsigned mask);
 
-       void (fastcall *io_delay)(void);
+       void (*io_delay)(void);
        void (*const_udelay)(unsigned long loops);
 
 #ifdef CONFIG_X86_LOCAL_APIC
-       void (fastcall *apic_write)(unsigned long reg, unsigned long v);
-       void (fastcall *apic_write_atomic)(unsigned long reg, unsigned long v);
-       unsigned long (fastcall *apic_read)(unsigned long reg);
+       void (*apic_write)(unsigned long reg, unsigned long v);
+       void (*apic_write_atomic)(unsigned long reg, unsigned long v);
+       unsigned long (*apic_read)(unsigned long reg);
+       void (*setup_boot_clock)(void);
+       void (*setup_secondary_clock)(void);
 #endif
 
-       void (fastcall *flush_tlb_user)(void);
-       void (fastcall *flush_tlb_kernel)(void);
-       void (fastcall *flush_tlb_single)(u32 addr);
-
-       void (fastcall *set_pte)(pte_t *ptep, pte_t pteval);
-       void (fastcall *set_pte_at)(struct mm_struct *mm, u32 addr, pte_t *ptep, pte_t pteval);
-       void (fastcall *set_pmd)(pmd_t *pmdp, pmd_t pmdval);
-       void (fastcall *pte_update)(struct mm_struct *mm, u32 addr, pte_t *ptep);
-       void (fastcall *pte_update_defer)(struct mm_struct *mm, u32 addr, pte_t *ptep);
+       void (*flush_tlb_user)(void);
+       void (*flush_tlb_kernel)(void);
+       void (*flush_tlb_single)(u32 addr);
+
+       void (*alloc_pt)(u32 pfn);
+       void (*alloc_pd)(u32 pfn);
+       void (*alloc_pd_clone)(u32 pfn, u32 clonepfn, u32 start, u32 count);
+       void (*release_pt)(u32 pfn);
+       void (*release_pd)(u32 pfn);
+
+       void (*set_pte)(pte_t *ptep, pte_t pteval);
+       void (*set_pte_at)(struct mm_struct *mm, u32 addr, pte_t *ptep, pte_t pteval);
+       void (*set_pmd)(pmd_t *pmdp, pmd_t pmdval);
+       void (*pte_update)(struct mm_struct *mm, u32 addr, pte_t *ptep);
+       void (*pte_update_defer)(struct mm_struct *mm, u32 addr, pte_t *ptep);
 #ifdef CONFIG_X86_PAE
-       void (fastcall *set_pte_atomic)(pte_t *ptep, pte_t pteval);
-       void (fastcall *set_pte_present)(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte);
-       void (fastcall *set_pud)(pud_t *pudp, pud_t pudval);
-       void (fastcall *pte_clear)(struct mm_struct *mm, unsigned long addr, pte_t *ptep);
-       void (fastcall *pmd_clear)(pmd_t *pmdp);
+       void (*set_pte_atomic)(pte_t *ptep, pte_t pteval);
+       void (*set_pte_present)(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte);
+       void (*set_pud)(pud_t *pudp, pud_t pudval);
+       void (*pte_clear)(struct mm_struct *mm, unsigned long addr, pte_t *ptep);
+       void (*pmd_clear)(pmd_t *pmdp);
 #endif
 
+       void (*set_lazy_mode)(int mode);
+
        /* These two are jmp to, not actually called. */
-       void (fastcall *irq_enable_sysexit)(void);
-       void (fastcall *iret)(void);
+       void (*irq_enable_sysexit)(void);
+       void (*iret)(void);
+
+       void (*startup_ipi_hook)(int phys_apicid, unsigned long start_eip, unsigned long start_esp);
 };
 
 /* Mark a paravirt probe function. */
@@ -313,13 +325,38 @@ static inline unsigned long apic_read(unsigned long reg)
 {
        return paravirt_ops.apic_read(reg);
 }
+
+static inline void setup_boot_clock(void)
+{
+       paravirt_ops.setup_boot_clock();
+}
+
+static inline void setup_secondary_clock(void)
+{
+       paravirt_ops.setup_secondary_clock();
+}
 #endif
 
+#ifdef CONFIG_SMP
+static inline void startup_ipi_hook(int phys_apicid, unsigned long start_eip,
+                                   unsigned long start_esp)
+{
+       return paravirt_ops.startup_ipi_hook(phys_apicid, start_eip, start_esp);
+}
+#endif
 
 #define __flush_tlb() paravirt_ops.flush_tlb_user()
 #define __flush_tlb_global() paravirt_ops.flush_tlb_kernel()
 #define __flush_tlb_single(addr) paravirt_ops.flush_tlb_single(addr)
 
+#define paravirt_alloc_pt(pfn) paravirt_ops.alloc_pt(pfn)
+#define paravirt_release_pt(pfn) paravirt_ops.release_pt(pfn)
+
+#define paravirt_alloc_pd(pfn) paravirt_ops.alloc_pd(pfn)
+#define paravirt_alloc_pd_clone(pfn, clonepfn, start, count) \
+       paravirt_ops.alloc_pd_clone(pfn, clonepfn, start, count)
+#define paravirt_release_pd(pfn) paravirt_ops.release_pd(pfn)
+
 static inline void set_pte(pte_t *ptep, pte_t pteval)
 {
        paravirt_ops.set_pte(ptep, pteval);
@@ -372,6 +409,19 @@ static inline void pmd_clear(pmd_t *pmdp)
 }
 #endif
 
+/* Lazy mode for batching updates / context switch */
+#define PARAVIRT_LAZY_NONE 0
+#define PARAVIRT_LAZY_MMU  1
+#define PARAVIRT_LAZY_CPU  2
+
+#define  __HAVE_ARCH_ENTER_LAZY_CPU_MODE
+#define arch_enter_lazy_cpu_mode() paravirt_ops.set_lazy_mode(PARAVIRT_LAZY_CPU)
+#define arch_leave_lazy_cpu_mode() paravirt_ops.set_lazy_mode(PARAVIRT_LAZY_NONE)
+
+#define  __HAVE_ARCH_ENTER_LAZY_MMU_MODE
+#define arch_enter_lazy_mmu_mode() paravirt_ops.set_lazy_mode(PARAVIRT_LAZY_MMU)
+#define arch_leave_lazy_mmu_mode() paravirt_ops.set_lazy_mode(PARAVIRT_LAZY_NONE)
+
 /* These all sit in the .parainstructions section to tell us what to patch. */
 struct paravirt_patch {
        u8 *instr;              /* original instructions */
index 2ba2736aa109833ef0cc4ae4819cbb4065ccbe95..b12d59a318b7cc46d581e347713e1964a4503ba7 100644 (file)
@@ -39,19 +39,19 @@ extern struct i386_pda _proxy_pda;
                if (0) { T__ tmp__; tmp__ = (val); }                    \
                switch (sizeof(_proxy_pda.field)) {                     \
                case 1:                                                 \
-                       asm(op "b %1,%%gs:%c2"                          \
+                       asm(op "b %1,%%fs:%c2"                          \
                            : "+m" (_proxy_pda.field)                   \
                            :"ri" ((T__)val),                           \
                             "i"(pda_offset(field)));                   \
                        break;                                          \
                case 2:                                                 \
-                       asm(op "w %1,%%gs:%c2"                          \
+                       asm(op "w %1,%%fs:%c2"                          \
                            : "+m" (_proxy_pda.field)                   \
                            :"ri" ((T__)val),                           \
                             "i"(pda_offset(field)));                   \
                        break;                                          \
                case 4:                                                 \
-                       asm(op "l %1,%%gs:%c2"                          \
+                       asm(op "l %1,%%fs:%c2"                          \
                            : "+m" (_proxy_pda.field)                   \
                            :"ri" ((T__)val),                           \
                             "i"(pda_offset(field)));                   \
@@ -65,19 +65,19 @@ extern struct i386_pda _proxy_pda;
                typeof(_proxy_pda.field) ret__;                         \
                switch (sizeof(_proxy_pda.field)) {                     \
                case 1:                                                 \
-                       asm(op "b %%gs:%c1,%0"                          \
+                       asm(op "b %%fs:%c1,%0"                          \
                            : "=r" (ret__)                              \
                            : "i" (pda_offset(field)),                  \
                              "m" (_proxy_pda.field));                  \
                        break;                                          \
                case 2:                                                 \
-                       asm(op "w %%gs:%c1,%0"                          \
+                       asm(op "w %%fs:%c1,%0"                          \
                            : "=r" (ret__)                              \
                            : "i" (pda_offset(field)),                  \
                              "m" (_proxy_pda.field));                  \
                        break;                                          \
                case 4:                                                 \
-                       asm(op "l %%gs:%c1,%0"                          \
+                       asm(op "l %%fs:%c1,%0"                          \
                            : "=r" (ret__)                              \
                            : "i" (pda_offset(field)),                  \
                              "m" (_proxy_pda.field));                  \
index 4b1e61359f89923428a5bb2368374c8d7b44ceb8..c8dc2d0141a71f5bdd1e3bfa7e19bfc9e868e917 100644 (file)
@@ -5,13 +5,31 @@
 #include <linux/threads.h>
 #include <linux/mm.h>          /* for struct page */
 
-#define pmd_populate_kernel(mm, pmd, pte) \
-               set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte)))
+#ifdef CONFIG_PARAVIRT
+#include <asm/paravirt.h>
+#else
+#define paravirt_alloc_pt(pfn) do { } while (0)
+#define paravirt_alloc_pd(pfn) do { } while (0)
+#define paravirt_alloc_pd(pfn) do { } while (0)
+#define paravirt_alloc_pd_clone(pfn, clonepfn, start, count) do { } while (0)
+#define paravirt_release_pt(pfn) do { } while (0)
+#define paravirt_release_pd(pfn) do { } while (0)
+#endif
+
+#define pmd_populate_kernel(mm, pmd, pte)                      \
+do {                                                           \
+       paravirt_alloc_pt(__pa(pte) >> PAGE_SHIFT);             \
+       set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte)));           \
+} while (0)
 
 #define pmd_populate(mm, pmd, pte)                             \
+do {                                                           \
+       paravirt_alloc_pt(page_to_pfn(pte));                    \
        set_pmd(pmd, __pmd(_PAGE_TABLE +                        \
                ((unsigned long long)page_to_pfn(pte) <<        \
-                       (unsigned long long) PAGE_SHIFT)))
+                       (unsigned long long) PAGE_SHIFT)));     \
+} while (0)
+
 /*
  * Allocate and free page tables.
  */
@@ -32,7 +50,11 @@ static inline void pte_free(struct page *pte)
 }
 
 
-#define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte))
+#define __pte_free_tlb(tlb,pte)                                        \
+do {                                                                   \
+       paravirt_release_pt(page_to_pfn(pte));                          \
+       tlb_remove_page((tlb),(pte));                                   \
+} while (0)
 
 #ifdef CONFIG_X86_PAE
 /*
index 359f10b54f59ba7c99297dac910b73e4c0406796..edfbe46a5e13c8042a1b589ee23f2f2c45918a73 100644 (file)
@@ -257,6 +257,14 @@ static inline void __mwait(unsigned long eax, unsigned long ecx)
                : :"a" (eax), "c" (ecx));
 }
 
+static inline void __sti_mwait(unsigned long eax, unsigned long ecx)
+{
+       /* "mwait %eax,%ecx;" */
+       asm volatile(
+               "sti; .byte 0x0f,0x01,0xc9;"
+               : :"a" (eax), "c" (ecx));
+}
+
 extern void mwait_idle_with_hints(unsigned long eax, unsigned long ecx);
 
 /* from system description table in BIOS.  Mostly for MCA use, but
@@ -424,7 +432,7 @@ struct thread_struct {
        .vm86_info = NULL,                                              \
        .sysenter_cs = __KERNEL_CS,                                     \
        .io_bitmap_ptr = NULL,                                          \
-       .gs = __KERNEL_PDA,                                             \
+       .fs = __KERNEL_PDA,                                             \
 }
 
 /*
@@ -442,8 +450,8 @@ struct thread_struct {
 }
 
 #define start_thread(regs, new_eip, new_esp) do {              \
-       __asm__("movl %0,%%fs": :"r" (0));                      \
-       regs->xgs = 0;                                          \
+       __asm__("movl %0,%%gs": :"r" (0));                      \
+       regs->xfs = 0;                                          \
        set_fs(USER_DS);                                        \
        regs->xds = __USER_DS;                                  \
        regs->xes = __USER_DS;                                  \
index bdbc894339b470b55fa6ed7848602bd8e5f4a071..6002597b9e12212b8e0986f9b7070d2d0b5ba041 100644 (file)
@@ -16,8 +16,8 @@ struct pt_regs {
        long eax;
        int  xds;
        int  xes;
-       /* int  xfs; */
-       int  xgs;
+       int  xfs;
+       /* int  xgs; */
        long orig_eax;
        long eip;
        int  xcs;
@@ -49,6 +49,10 @@ static inline int user_mode_vm(struct pt_regs *regs)
 {
        return ((regs->xcs & SEGMENT_RPL_MASK) | (regs->eflags & VM_MASK)) >= USER_RPL;
 }
+static inline int v8086_mode(struct pt_regs *regs)
+{
+       return (regs->eflags & VM_MASK);
+}
 
 #define instruction_pointer(regs) ((regs)->eip)
 #define regs_return_value(regs) ((regs)->eax)
index 3c796af337762629038d39bc4ecc2031c7fff2a6..065f10bfa487c5a1938a5b0785b553e5586c0d3d 100644 (file)
  * The GDT has 32 entries
  */
 #define GDT_ENTRIES 32
-
 #define GDT_SIZE (GDT_ENTRIES * 8)
 
-/* Matches __KERNEL_CS and __USER_CS (they must be 2 entries apart) */
-#define SEGMENT_IS_FLAT_CODE(x)  (((x) & 0xec) == GDT_ENTRY_KERNEL_CS * 8)
-/* Matches PNP_CS32 and PNP_CS16 (they must be consecutive) */
-#define SEGMENT_IS_PNP_CODE(x)   (((x) & 0xf4) == GDT_ENTRY_PNPBIOS_BASE * 8)
-
 /* Simple and small GDT entries for booting only */
 
 #define GDT_ENTRY_BOOT_CS              2
 #ifndef CONFIG_PARAVIRT
 #define get_kernel_rpl()  0
 #endif
+/*
+ * Matching rules for certain types of segments.
+ */
+
+/* Matches only __KERNEL_CS, ignoring PnP / USER / APM segments */
+#define SEGMENT_IS_KERNEL_CODE(x) (((x) & 0xfc) == GDT_ENTRY_KERNEL_CS * 8)
+
+/* Matches __KERNEL_CS and __USER_CS (they must be 2 entries apart) */
+#define SEGMENT_IS_FLAT_CODE(x)  (((x) & 0xec) == GDT_ENTRY_KERNEL_CS * 8)
+
+/* Matches PNP_CS32 and PNP_CS16 (they must be consecutive) */
+#define SEGMENT_IS_PNP_CODE(x)   (((x) & 0xf4) == GDT_ENTRY_PNPBIOS_BASE * 8)
+
 #endif
index 67659dbaf120a8dd4ec816bcde1734736fd20026..0e8077cbfdac7da388789be548d599c0839b8fbf 100644 (file)
@@ -6,7 +6,7 @@
 #ifndef _i386_SETUP_H
 #define _i386_SETUP_H
 
-#define COMMAND_LINE_SIZE 256
+#define COMMAND_LINE_SIZE 2048
 
 #ifdef __KERNEL__
 #include <linux/pfn.h>
@@ -77,6 +77,8 @@ int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map);
 void __init add_memory_region(unsigned long long start,
                              unsigned long long size, int type);
 
+extern unsigned long init_pg_tables_end;
+
 #endif /* __ASSEMBLY__ */
 
 #endif  /*  __KERNEL__  */
index 64fe624c02caa5ed80838428a5366aa385924888..6bf0033a301cee618101682b53e0677d7ce36ac0 100644 (file)
@@ -52,6 +52,11 @@ extern void cpu_exit_clear(void);
 extern void cpu_uninit(void);
 #endif
 
+#ifndef CONFIG_PARAVIRT
+#define startup_ipi_hook(phys_apicid, start_eip, start_esp)            \
+do { } while (0)
+#endif
+
 /*
  * This function is needed by all SMP systems. It must _always_ be valid
  * from the initial startup. We map APIC_BASE very early in page_setup(),
index 03f548536d6b1f421cec52c2438eb36802af2bd0..7c99678a8f863ab546568bb31ae25ac82c15c1f7 100644 (file)
@@ -39,24 +39,6 @@ struct termio {
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IR - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14      /* synchronous PPP */
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 #include <linux/module.h>
 
index ea8065af825a998654e23a92ffc18e60f34885ec..571b4294dc2e84d4029120fd05853a5fa62153ac 100644 (file)
@@ -30,6 +30,7 @@ static inline int native_set_wallclock(unsigned long nowtime)
 
 #ifdef CONFIG_PARAVIRT
 #include <asm/paravirt.h>
+extern unsigned long long native_sched_clock(void);
 #else /* !CONFIG_PARAVIRT */
 
 #define get_wallclock() native_get_wallclock()
index d0ebd05f85169e5711a666d309522077a26986ea..4752c3a6a7089580eaf6b18333f26eadc94e18c8 100644 (file)
@@ -8,6 +8,9 @@ void setup_pit_timer(void);
 /* Modifiers for buggy PIT handling */
 extern int pit_latch_buggy;
 extern int timer_ack;
+extern int no_timer_check;
+extern unsigned long long (*custom_sched_clock)(void);
+extern int no_sync_cmos_clock;
 extern int recalibrate_cpu_khz(void);
 
 #endif
index c13933185c1cc20f1a0b0cfbc01d67f92bee26dc..e997891cc7cc8bfdedf6b9447996e291e5b0a9b1 100644 (file)
@@ -1,48 +1 @@
-/*
- * linux/include/asm-i386/tsc.h
- *
- * i386 TSC related functions
- */
-#ifndef _ASM_i386_TSC_H
-#define _ASM_i386_TSC_H
-
-#include <asm/processor.h>
-
-/*
- * Standard way to access the cycle counter on i586+ CPUs.
- * Currently only used on SMP.
- *
- * If you really have a SMP machine with i486 chips or older,
- * compile for that, and this will just always return zero.
- * That's ok, it just means that the nicer scheduling heuristics
- * won't work for you.
- *
- * We only use the low 32 bits, and we'd simply better make sure
- * that we reschedule before that wraps. Scheduling at least every
- * four billion cycles just basically sounds like a good idea,
- * regardless of how fast the machine is.
- */
-typedef unsigned long long cycles_t;
-
-extern unsigned int cpu_khz;
-extern unsigned int tsc_khz;
-
-static inline cycles_t get_cycles(void)
-{
-       unsigned long long ret = 0;
-
-#ifndef CONFIG_X86_TSC
-       if (!cpu_has_tsc)
-               return 0;
-#endif
-
-#if defined(CONFIG_X86_GENERIC) || defined(CONFIG_X86_TSC)
-       rdtscll(ret);
-#endif
-       return ret;
-}
-
-extern void tsc_init(void);
-extern void mark_tsc_unstable(void);
-
-#endif
+#include <asm-x86_64/tsc.h>
index eef5133b9ce2a03b73b5f4c73f0e771a12b52aa8..70829ae3ad527729cf49e79be5dcd247d1fd9eb5 100644 (file)
@@ -54,10 +54,10 @@ extern struct movsl_mask {
  * This needs 33-bit arithmetic. We have a carry...
  */
 #define __range_ok(addr,size) ({ \
-       unsigned long flag,sum; \
+       unsigned long flag,roksum; \
        __chk_user_ptr(addr); \
        asm("addl %3,%1 ; sbbl %0,%0; cmpl %1,%4; sbbl $0,%0" \
-               :"=&r" (flag), "=r" (sum) \
+               :"=&r" (flag), "=r" (roksum) \
                :"1" (addr),"g" ((int)(size)),"rm" (current_thread_info()->addr_limit.seg)); \
        flag; })
 
diff --git a/include/asm-i386/vmi.h b/include/asm-i386/vmi.h
new file mode 100644 (file)
index 0000000..43c8933
--- /dev/null
@@ -0,0 +1,262 @@
+/*
+ * VMI interface definition
+ *
+ * Copyright (C) 2005, VMware, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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.
+ *
+ * Maintained by: Zachary Amsden zach@vmware.com
+ *
+ */
+#include <linux/types.h>
+
+/*
+ *---------------------------------------------------------------------
+ *
+ *  VMI Option ROM API
+ *
+ *---------------------------------------------------------------------
+ */
+#define VMI_SIGNATURE 0x696d5663   /* "cVmi" */
+
+#define PCI_VENDOR_ID_VMWARE            0x15AD
+#define PCI_DEVICE_ID_VMWARE_VMI        0x0801
+
+/*
+ * We use two version numbers for compatibility, with the major
+ * number signifying interface breakages, and the minor number
+ * interface extensions.
+ */
+#define VMI_API_REV_MAJOR       3
+#define VMI_API_REV_MINOR       0
+
+#define VMI_CALL_CPUID                 0
+#define VMI_CALL_WRMSR                 1
+#define VMI_CALL_RDMSR                 2
+#define VMI_CALL_SetGDT                        3
+#define VMI_CALL_SetLDT                        4
+#define VMI_CALL_SetIDT                        5
+#define VMI_CALL_SetTR                 6
+#define VMI_CALL_GetGDT                        7
+#define VMI_CALL_GetLDT                        8
+#define VMI_CALL_GetIDT                        9
+#define VMI_CALL_GetTR                 10
+#define VMI_CALL_WriteGDTEntry         11
+#define VMI_CALL_WriteLDTEntry         12
+#define VMI_CALL_WriteIDTEntry         13
+#define VMI_CALL_UpdateKernelStack     14
+#define VMI_CALL_SetCR0                        15
+#define VMI_CALL_SetCR2                        16
+#define VMI_CALL_SetCR3                        17
+#define VMI_CALL_SetCR4                        18
+#define VMI_CALL_GetCR0                        19
+#define VMI_CALL_GetCR2                        20
+#define VMI_CALL_GetCR3                        21
+#define VMI_CALL_GetCR4                        22
+#define VMI_CALL_WBINVD                        23
+#define VMI_CALL_SetDR                 24
+#define VMI_CALL_GetDR                 25
+#define VMI_CALL_RDPMC                 26
+#define VMI_CALL_RDTSC                 27
+#define VMI_CALL_CLTS                  28
+#define VMI_CALL_EnableInterrupts      29
+#define VMI_CALL_DisableInterrupts     30
+#define VMI_CALL_GetInterruptMask      31
+#define VMI_CALL_SetInterruptMask      32
+#define VMI_CALL_IRET                  33
+#define VMI_CALL_SYSEXIT               34
+#define VMI_CALL_Halt                  35
+#define VMI_CALL_Reboot                        36
+#define VMI_CALL_Shutdown              37
+#define VMI_CALL_SetPxE                        38
+#define VMI_CALL_SetPxELong            39
+#define VMI_CALL_UpdatePxE             40
+#define VMI_CALL_UpdatePxELong         41
+#define VMI_CALL_MachineToPhysical     42
+#define VMI_CALL_PhysicalToMachine     43
+#define VMI_CALL_AllocatePage          44
+#define VMI_CALL_ReleasePage           45
+#define VMI_CALL_InvalPage             46
+#define VMI_CALL_FlushTLB              47
+#define VMI_CALL_SetLinearMapping      48
+
+#define VMI_CALL_SetIOPLMask           61
+#define VMI_CALL_SetInitialAPState     62
+#define VMI_CALL_APICWrite             63
+#define VMI_CALL_APICRead              64
+#define VMI_CALL_SetLazyMode           73
+
+/*
+ *---------------------------------------------------------------------
+ *
+ * MMU operation flags
+ *
+ *---------------------------------------------------------------------
+ */
+
+/* Flags used by VMI_{Allocate|Release}Page call */
+#define VMI_PAGE_PAE             0x10  /* Allocate PAE shadow */
+#define VMI_PAGE_CLONE           0x20  /* Clone from another shadow */
+#define VMI_PAGE_ZEROED          0x40  /* Page is pre-zeroed */
+
+
+/* Flags shared by Allocate|Release Page and PTE updates */
+#define VMI_PAGE_PT              0x01
+#define VMI_PAGE_PD              0x02
+#define VMI_PAGE_PDP             0x04
+#define VMI_PAGE_PML4            0x08
+
+#define VMI_PAGE_NORMAL          0x00 /* for debugging */
+
+/* Flags used by PTE updates */
+#define VMI_PAGE_CURRENT_AS      0x10 /* implies VMI_PAGE_VA_MASK is valid */
+#define VMI_PAGE_DEFER           0x20 /* may queue update until TLB inval */
+#define VMI_PAGE_VA_MASK         0xfffff000
+
+#ifdef CONFIG_X86_PAE
+#define VMI_PAGE_L1            (VMI_PAGE_PT | VMI_PAGE_PAE | VMI_PAGE_ZEROED)
+#define VMI_PAGE_L2            (VMI_PAGE_PD | VMI_PAGE_PAE | VMI_PAGE_ZEROED)
+#else
+#define VMI_PAGE_L1            (VMI_PAGE_PT | VMI_PAGE_ZEROED)
+#define VMI_PAGE_L2            (VMI_PAGE_PD | VMI_PAGE_ZEROED)
+#endif
+
+/* Flags used by VMI_FlushTLB call */
+#define VMI_FLUSH_TLB            0x01
+#define VMI_FLUSH_GLOBAL         0x02
+
+/*
+ *---------------------------------------------------------------------
+ *
+ *  VMI relocation definitions for ROM call get_reloc
+ *
+ *---------------------------------------------------------------------
+ */
+
+/* VMI Relocation types */
+#define VMI_RELOCATION_NONE     0
+#define VMI_RELOCATION_CALL_REL 1
+#define VMI_RELOCATION_JUMP_REL 2
+#define VMI_RELOCATION_NOP     3
+
+#ifndef __ASSEMBLY__
+struct vmi_relocation_info {
+        unsigned char           *eip;
+        unsigned char           type;
+        unsigned char           reserved[3];
+};
+#endif
+
+
+/*
+ *---------------------------------------------------------------------
+ *
+ *  Generic ROM structures and definitions
+ *
+ *---------------------------------------------------------------------
+ */
+
+#ifndef __ASSEMBLY__
+
+struct vrom_header {
+       u16     rom_signature;  // option ROM signature
+       u8      rom_length;     // ROM length in 512 byte chunks
+       u8      rom_entry[4];   // 16-bit code entry point
+       u8      rom_pad0;       // 4-byte align pad
+       u32     vrom_signature; // VROM identification signature
+       u8      api_version_min;// Minor version of API
+       u8      api_version_maj;// Major version of API
+       u8      jump_slots;     // Number of jump slots
+       u8      reserved1;      // Reserved for expansion
+       u32     virtual_top;    // Hypervisor virtual address start
+       u16     reserved2;      // Reserved for expansion
+       u16     license_offs;   // Offset to License string
+       u16     pci_header_offs;// Offset to PCI OPROM header
+       u16     pnp_header_offs;// Offset to PnP OPROM header
+       u32     rom_pad3;       // PnP reserverd / VMI reserved
+       u8      reserved[96];   // Reserved for headers
+       char    vmi_init[8];    // VMI_Init jump point
+       char    get_reloc[8];   // VMI_GetRelocationInfo jump point
+} __attribute__((packed));
+
+struct pnp_header {
+        char sig[4];
+        char rev;
+        char size;
+        short next;
+        short res;
+        long devID;
+        unsigned short manufacturer_offset;
+        unsigned short product_offset;
+} __attribute__((packed));
+
+struct pci_header {
+        char sig[4];
+        short vendorID;
+        short deviceID;
+        short vpdData;
+        short size;
+        char rev;
+        char class;
+        char subclass;
+        char interface;
+        short chunks;
+        char rom_version_min;
+        char rom_version_maj;
+        char codetype;
+        char lastRom;
+        short reserved;
+} __attribute__((packed));
+
+/* Function prototypes for bootstrapping */
+extern void vmi_init(void);
+extern void vmi_bringup(void);
+extern void vmi_apply_boot_page_allocations(void);
+
+/* State needed to start an application processor in an SMP system. */
+struct vmi_ap_state {
+       u32 cr0;
+       u32 cr2;
+       u32 cr3;
+       u32 cr4;
+
+       u64 efer;
+
+       u32 eip;
+       u32 eflags;
+       u32 eax;
+       u32 ebx;
+       u32 ecx;
+       u32 edx;
+       u32 esp;
+       u32 ebp;
+       u32 esi;
+       u32 edi;
+       u16 cs;
+       u16 ss;
+       u16 ds;
+       u16 es;
+       u16 fs;
+       u16 gs;
+       u16 ldtr;
+
+       u16 gdtr_limit;
+       u32 gdtr_base;
+       u32 idtr_base;
+       u16 idtr_limit;
+};
+
+#endif
diff --git a/include/asm-i386/vmi_time.h b/include/asm-i386/vmi_time.h
new file mode 100644 (file)
index 0000000..c129312
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * VMI Time wrappers
+ *
+ * Copyright (C) 2006, VMware, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 dhecht@vmware.com
+ *
+ */
+
+#ifndef __VMI_TIME_H
+#define __VMI_TIME_H
+
+/*
+ * Raw VMI call indices for timer functions
+ */
+#define VMI_CALL_GetCycleFrequency     66
+#define VMI_CALL_GetCycleCounter       67
+#define VMI_CALL_SetAlarm              68
+#define VMI_CALL_CancelAlarm           69
+#define VMI_CALL_GetWallclockTime      70
+#define VMI_CALL_WallclockUpdated      71
+
+/* Cached VMI timer operations */
+extern struct vmi_timer_ops {
+       u64 (*get_cycle_frequency)(void);
+       u64 (*get_cycle_counter)(int);
+       u64 (*get_wallclock)(void);
+       int (*wallclock_updated)(void);
+       void (*set_alarm)(u32 flags, u64 expiry, u64 period);
+       void (*cancel_alarm)(u32 flags);
+} vmi_timer_ops;
+
+/* Prototypes */
+extern void __init vmi_time_init(void);
+extern unsigned long vmi_get_wallclock(void);
+extern int vmi_set_wallclock(unsigned long now);
+extern unsigned long long vmi_sched_clock(void);
+
+#ifdef CONFIG_X86_LOCAL_APIC
+extern void __init vmi_timer_setup_boot_alarm(void);
+extern void __init vmi_timer_setup_secondary_alarm(void);
+extern void apic_vmi_timer_interrupt(void);
+#endif
+
+#ifdef CONFIG_NO_IDLE_HZ
+extern int vmi_stop_hz_timer(void);
+extern void vmi_account_time_restart_hz_timer(void);
+#endif
+
+/*
+ * When run under a hypervisor, a vcpu is always in one of three states:
+ * running, halted, or ready.  The vcpu is in the 'running' state if it
+ * is executing.  When the vcpu executes the halt interface, the vcpu
+ * enters the 'halted' state and remains halted until there is some work
+ * pending for the vcpu (e.g. an alarm expires, host I/O completes on
+ * behalf of virtual I/O).  At this point, the vcpu enters the 'ready'
+ * state (waiting for the hypervisor to reschedule it).  Finally, at any
+ * time when the vcpu is not in the 'running' state nor the 'halted'
+ * state, it is in the 'ready' state.
+ *
+ * Real time is advances while the vcpu is 'running', 'ready', or
+ * 'halted'.  Stolen time is the time in which the vcpu is in the
+ * 'ready' state.  Available time is the remaining time -- the vcpu is
+ * either 'running' or 'halted'.
+ *
+ * All three views of time are accessible through the VMI cycle
+ * counters.
+ */
+
+/* The cycle counters. */
+#define VMI_CYCLES_REAL         0
+#define VMI_CYCLES_AVAILABLE    1
+#define VMI_CYCLES_STOLEN       2
+
+/* The alarm interface 'flags' bits */
+#define VMI_ALARM_COUNTERS      2
+
+#define VMI_ALARM_COUNTER_MASK  0x000000ff
+
+#define VMI_ALARM_WIRED_IRQ0    0x00000000
+#define VMI_ALARM_WIRED_LVTT    0x00010000
+
+#define VMI_ALARM_IS_ONESHOT    0x00000000
+#define VMI_ALARM_IS_PERIODIC   0x00000100
+
+#define CONFIG_VMI_ALARM_HZ    100
+
+#endif
index ebd5887f4b1a39102e4070b190ee5b55a5500e56..6299b51575bb3f0814f2448eda09a53b62c81fe9 100644 (file)
@@ -8,9 +8,20 @@
 #include <asm/machvec.h>
 
 #define dma_alloc_coherent     platform_dma_alloc_coherent
-#define dma_alloc_noncoherent  platform_dma_alloc_coherent     /* coherent mem. is cheap */
+/* coherent mem. is cheap */
+static inline void *
+dma_alloc_noncoherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
+                     gfp_t flag)
+{
+       return dma_alloc_coherent(dev, size, dma_handle, flag);
+}
 #define dma_free_coherent      platform_dma_free_coherent
-#define dma_free_noncoherent   platform_dma_free_coherent
+static inline void
+dma_free_noncoherent(struct device *dev, size_t size, void *cpu_addr,
+                    dma_addr_t dma_handle)
+{
+       dma_free_coherent(dev, size, cpu_addr, dma_handle);
+}
 #define dma_map_single         platform_dma_map_single
 #define dma_map_sg             platform_dma_map_sg
 #define dma_unmap_single       platform_dma_unmap_single
diff --git a/include/asm-ia64/libata-portmap.h b/include/asm-ia64/libata-portmap.h
new file mode 100644 (file)
index 0000000..0e00c9a
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef __ASM_IA64_LIBATA_PORTMAP_H
+#define __ASM_IA64_LIBATA_PORTMAP_H
+
+#define ATA_PRIMARY_CMD                0x1F0
+#define ATA_PRIMARY_CTL                0x3F6
+#define ATA_PRIMARY_IRQ(dev)   isa_irq_to_vector(14)
+
+#define ATA_SECONDARY_CMD      0x170
+#define ATA_SECONDARY_CTL      0x376
+#define ATA_SECONDARY_IRQ(dev) isa_irq_to_vector(15)
+
+#endif
index ea29b57affcb0eaab83a5d64a9e53e435391e201..4399a44355b3f674a676e4d606a481b80d5a41e6 100644 (file)
@@ -1,6 +1,6 @@
 #ifndef __IA64_SETUP_H
 #define __IA64_SETUP_H
 
-#define COMMAND_LINE_SIZE      512
+#define COMMAND_LINE_SIZE      2048
 
 #endif
index 42c95693240cfb618e7a47ef98656699291110c8..08750c2d3607b0f479e978cac60627d3dc7e0262 100644 (file)
@@ -46,24 +46,6 @@ struct termio {
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IR - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS msgs */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14      /* synchronous PPP */
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 # ifdef __KERNEL__
 
 /*     intr=^C         quit=^\         erase=del       kill=^U
index 4619ba5c372ed2941bf42d4cb1a6198f5bf1eafb..9a4a5d20160addb3f1e07db032b24f347d3d75ad 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_A_OUT_H
 #define _ASM_M32R_A_OUT_H
 
-/* orig : i386 2.4.18 */
-
 struct exec
 {
   unsigned long a_info;                /* Use macros N_MAGIC, etc for access */
index 06a83dc94648f9508782f5a14fef081256dfd9d0..81782c122da451b16fa2b650f8fbfc99d68ac3a2 100644 (file)
@@ -1,4 +1,3 @@
-/* $Id$ */
 /*
  * 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
index 9a56f661bdb35ac9a359441e59ec2db615e6b564..f77214eff1368e858e207bae6c73dd763bda5780 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_BUGS_H
 #define _ASM_M32R_BUGS_H
 
-/* $Id$ */
-
 /*
  * This is included by init/main.c to check for architecture-dependent bugs.
  *
index 3c0b9a2e03bc828b2e3eba1d738586d5bb8e1d8c..10b2c1d11614995f12e23632efa0efbc690a3d6b 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_BYTEORDER_H
 #define _ASM_M32R_BYTEORDER_H
 
-/* $Id$ */
-
 #include <asm/types.h>
 
 #if !defined(__STRICT_ANSI__) || defined(__KERNEL__)
index 9c2b2d9998bc9e13397cb28cc9d21f91e3a42214..40b3ee98193dbf5177299ee1cfb82c673e749a7d 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_CACHE_H
 #define _ASM_M32R_CACHE_H
 
-/* $Id$ */
-
 /* L1 cache line size */
 #define L1_CACHE_SHIFT         4
 #define L1_CACHE_BYTES         (1 << L1_CACHE_SHIFT)
index 56961a9511b2cea9a7f46b04fedc912799c2e05c..78587c958146f84991740a920b7178388b41202a 100644 (file)
@@ -67,4 +67,3 @@ do {                                                          \
        memcpy(dst, src, len)
 
 #endif /* _ASM_M32R_CACHEFLUSH_H */
-
index c19d927ff22d5bd54ff355af2d0196a18edc8846..7859d864f2c24cc3b7e664dc424f469229a3dbe0 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_CURRENT_H
 #define _ASM_M32R_CURRENT_H
 
-/* $Id$ */
-
 #include <linux/thread_info.h>
 
 struct task_struct;
@@ -15,4 +13,3 @@ static __inline__ struct task_struct *get_current(void)
 #define current        (get_current())
 
 #endif /* _ASM_M32R_CURRENT_H */
-
index f285eaee7d2739db9989931e22909af47c564412..164448d23850ec312843ba722d7962822f05444d 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_DELAY_H
 #define _ASM_M32R_DELAY_H
 
-/* $Id$ */
-
 /*
  * Copyright (C) 1993 Linus Torvalds
  *
index 7263b013b67ee031b8b136654d0a561756ecc667..52f6a22dd232c5ddc18af72d76431e4d0cf447f7 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_DMA_H
 #define _ASM_M32R_DMA_H
 
-/* $Id$ */
-
 #include <asm/io.h>
 
 /*
index 7a98520194a79cf0d6901e06dfb603b3399eae84..777149262aada2d5abfcc13a1659f3458b6ee77c 100644 (file)
@@ -1,9 +1,6 @@
 #ifndef _ASM_M32R_ERRNO_H
 #define _ASM_M32R_ERRNO_H
 
-/* $Id$ */
-
 #include <asm-generic/errno.h>
 
 #endif /* _ASM_M32R_ERRNO_H */
-
index c82ebe8f250d6fadc84b913a1a48fc9af13bceab..4672a49e8760546f3b835d627359b9c0d62fd418 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_IDE_H
 #define _ASM_M32R_IDE_H
 
-/* $Id$ */
-
 /*
  *  linux/include/asm-m32r/ide.h
  *
@@ -15,6 +13,7 @@
 
 #ifdef __KERNEL__
 
+#include <asm/m32r.h>
 
 #ifndef MAX_HWIFS
 # ifdef CONFIG_BLK_DEV_IDEPCI
@@ -24,9 +23,6 @@
 # endif
 #endif
 
-#include <asm/m32r.h>
-
-
 #define IDE_ARCH_OBSOLETE_DEFAULTS
 
 static __inline__ int ide_default_irq(unsigned long base)
index b3508292246a65c8918c4679a196f06527d24e04..d23cfc45738a0c4bf3dc193f85114e811dfbda29 100644 (file)
@@ -1,10 +1,6 @@
 #ifndef __ARCH_M32R_IOCTLS_H__
 #define __ARCH_M32R_IOCTLS_H__
 
-/* $Id$ */
-
-/* orig : i386 2.5.67 */
-
 #include <asm/ioctl.h>
 
 /* 0x54 is just a magic number to make these relatively unique ('T') */
@@ -85,4 +81,3 @@
 #define TIOCSER_TEMT    0x01   /* Transmitter physically empty */
 
 #endif /* __ARCH_M32R_IOCTLS_H__ */
-
index 7c77fb0b1467291be0107d2cca24519c50570f8a..8d2d7c8ffdb02cf2518cf98e01b402fc749896d6 100644 (file)
@@ -1,10 +1,6 @@
 #ifndef _ASM_M32R_IPCBUF_H
 #define _ASM_M32R_IPCBUF_H
 
-/* $Id$ */
-
-/* orig : i386 2.4.18 */
-
 /*
  * The ipc64_perm structure for m32r architecture.
  * Note extra padding because this structure is passed back and forth
index 0524d89edb0f4709de3bdc42c5ecf00438f46d5e..fa94dc6410ea1129083a401f01558e5028e05c23 100644 (file)
@@ -1,9 +1,6 @@
 #ifndef __M32R_KMAP_TYPES_H
 #define __M32R_KMAP_TYPES_H
 
-/* Dummy header just to define km_type. */
-
-
 #ifdef CONFIG_DEBUG_HIGHMEM
 # define D(n) __KM_FENCE_##n ,
 #else
@@ -30,4 +27,3 @@ D(13) KM_TYPE_NR
 #undef D
 
 #endif /* __M32R_KMAP_TYPES_H */
-
index cbdbc5891445e25e88658f38bb5a3348eaf57a13..2dc89d68b6d943b4aec5b1366825d52eb4aad565 100644 (file)
@@ -1,3 +1,6 @@
+#ifndef _M32104UT_M32104UT_PLD_H
+#define _M32104UT_M32104UT_PLD_H
+
 /*
  * include/asm-m32r/m32104ut/m32104ut_pld.h
  *
  * this archive for more details.
  */
 
-#ifndef _M32104UT_M32104UT_PLD_H
-#define _M32104UT_M32104UT_PLD_H
-
-
 #if defined(CONFIG_PLAT_M32104UT)
 #define PLD_PLAT_BASE          0x02c00000
 #else
@@ -35,7 +34,7 @@
 #define __reg8
 #define __reg16
 #define __reg32
-#endif /* __ASSEMBLY__ */
+#endif /* __ASSEMBLY__ */
 
 /* CFC */
 #define        PLD_CFRSTCR             __reg16(PLD_BASE + 0x0000)
 #define PLD_SCTXB              __reg16(PLD_BASE + 0x3800c)
 #define PLD_SCRXB              __reg16(PLD_BASE + 0x3800e)
 
-#endif /* _M32104UT_M32104UT_PLD_H */
+#endif /* _M32104UT_M32104UT_PLD_H */
index f1e47ae1f891da668f3a5c1775ffc2faf9af6c84..aae810a4fb2c8bf480ccc5ab145d81d3813afac4 100644 (file)
@@ -1,3 +1,6 @@
+#ifndef _M32700UT_M32700UT_LAN_H
+#define _M32700UT_M32700UT_LAN_H
+
 /*
  * include/asm-m32r/m32700ut/m32700ut_lan.h
  *
@@ -8,14 +11,8 @@
  * 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.
- *
- * $Id$
  */
 
-#ifndef _M32700UT_M32700UT_LAN_H
-#define _M32700UT_M32700UT_LAN_H
-
-
 #ifndef __ASSEMBLY__
 /*
  * C functions use non-cache address.
@@ -23,7 +20,7 @@
 #define M32700UT_LAN_BASE      (0x10000000 /* + NONCACHE_OFFSET */)
 #else
 #define M32700UT_LAN_BASE      (0x10000000 + NONCACHE_OFFSET)
-#endif /* __ASSEMBLY__ */
+#endif /* __ASSEMBLY__ */
 
 /* ICU
  *  ICUISTS:   status register
 #define PLDI2CSTS_BB           0x00000010
 #define PLDI2CSTS_NOACK                0x00000001      /* 0:ack, 1:noack */
 
-#endif /* _M32700UT_M32700UT_LAN_H */
+#endif /* _M32700UT_M32700UT_LAN_H */
index e41c4aa48b4cba16d10f8a2bab9a9feab574d3c9..4c2489079788eaabb26994b4d47fdf4c0919e789 100644 (file)
@@ -1,3 +1,6 @@
+#ifndef _M32700UT_M32700UT_LCD_H
+#define _M32700UT_M32700UT_LCD_H
+
 /*
  * include/asm-m32r/m32700ut/m32700ut_lcd.h
  *
@@ -8,14 +11,8 @@
  * 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.
- *
- * $Id$
  */
 
-#ifndef _M32700UT_M32700UT_LCD_H
-#define _M32700UT_M32700UT_LCD_H
-
-
 #ifndef __ASSEMBLY__
 /*
  * C functions use non-cache address.
@@ -23,7 +20,7 @@
 #define M32700UT_LCD_BASE      (0x10000000 /* + NONCACHE_OFFSET */)
 #else
 #define M32700UT_LCD_BASE      (0x10000000 + NONCACHE_OFFSET)
-#endif /* __ASSEMBLY__ */
+#endif /* __ASSEMBLY__ */
 
 /*
  * ICU
@@ -55,4 +52,4 @@
 #define M32700UT_LCD_ICUCR19   __reg16(M32700UT_LCD_BASE + 0x300036)
 #define M32700UT_LCD_ICUCR21   __reg16(M32700UT_LCD_BASE + 0x30003a)
 
-#endif /* _M32700UT_M32700UT_LCD_H */
+#endif /* _M32700UT_M32700UT_LCD_H */
index a48c22c978ca14b9305cd3403b510c1d8392a727..d39121279a1a411ce4862268bca40e5daf42c574 100644 (file)
@@ -1,3 +1,6 @@
+#ifndef _M32700UT_M32700UT_PLD_H
+#define _M32700UT_M32700UT_PLD_H
+
 /*
  * include/asm-m32r/m32700ut/m32700ut_pld.h
  *
@@ -8,14 +11,8 @@
  * 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.
- *
- * $Id$
  */
 
-#ifndef _M32700UT_M32700UT_PLD_H
-#define _M32700UT_M32700UT_PLD_H
-
-
 #if defined(CONFIG_PLAT_M32700UT_Alpha)
 #define PLD_PLAT_BASE          0x08c00000
 #elif defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_USRV)
@@ -37,7 +34,7 @@
 #define __reg8
 #define __reg16
 #define __reg32
-#endif /* __ASSEMBLY__ */
+#endif /* __ASSEMBLY__ */
 
 /* CFC */
 #define        PLD_CFRSTCR             __reg16(PLD_BASE + 0x0000)
 #define PLD_SCTXB              __reg16(PLD_BASE + 0x3800c)
 #define PLD_SCRXB              __reg16(PLD_BASE + 0x3800e)
 
-#endif /* _M32700UT_M32700UT_PLD.H */
+#endif /* _M32700UT_M32700UT_PLD.H */
index 56a2b12f2bfcfea5eeab087e6d67062e5cb6af80..2624c9db72555196c0926cded6369e77889695dd 100644 (file)
@@ -1,18 +1,17 @@
+#ifndef _MAPPI2_PLD_H
+#define _MAPPI2_PLD_H
+
 /*
  * include/asm-m32r/mappi2/mappi2_pld.h
  *
  * Definitions for Extended IO Logic on MAPPI2 board.
- *  based on m32700ut_pld.h by
+ *  based on m32700ut_pld.h
  *
  * 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.
- *
  */
 
-#ifndef _MAPPI2_PLD_H
-#define _MAPPI2_PLD_H
-
 #ifndef __ASSEMBLY__
 /* FIXME:
  * Some C functions use non-cache address, so can't define non-cache address.
@@ -26,7 +25,7 @@
 #define __reg8
 #define __reg16
 #define __reg32
-#endif /* __ASSEMBLY__ */
+#endif /* __ASSEMBLY__ */
 
 /* CFC */
 #define        PLD_CFRSTCR             __reg16(PLD_BASE + 0x0000)
 
 #endif
 
-#endif /* _MAPPI2_PLD.H */
+#endif /* _MAPPI2_PLD.H */
index 92f10defaef8c7d5b1b93204eee3453240f4ce45..451c40ee70af88cd3bd648486d9e826bb07e11d0 100644 (file)
@@ -1,3 +1,6 @@
+#ifndef _MAPPI3_PLD_H
+#define _MAPPI3_PLD_H
+
 /*
  * include/asm-m32r/mappi3/mappi3_pld.h
  *
@@ -7,12 +10,8 @@
  * 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.
- *
  */
 
-#ifndef _MAPPI3_PLD_H
-#define _MAPPI3_PLD_H
-
 #ifndef __ASSEMBLY__
 /* FIXME:
  * Some C functions use non-cache address, so can't define non-cache address.
@@ -26,7 +25,7 @@
 #define __reg8
 #define __reg16
 #define __reg32
-#endif /* __ASSEMBLY__ */
+#endif /* __ASSEMBLY__ */
 
 /* CFC */
 #define        PLD_CFRSTCR             __reg16(PLD_BASE + 0x0000)
 /* Reset Control */
 #define PLD_REBOOT             __reg16(PLD_BASE + 0x38000)
 
-#endif /* _MAPPI3_PLD.H */
+#endif /* _MAPPI3_PLD.H */
index 755601d053ccfc254d58c54d2a25357f0e68296d..aa1b7bf84f5115afabcb6a1f890e082a17ca3ab4 100644 (file)
@@ -7,7 +7,6 @@
 #include <asm/io.h>
 
 #ifndef RTC_PORT
-// #define RTC_PORT(x) (0x70 + (x))
 #define RTC_PORT(x)    ((x))
 #define RTC_ALWAYS_BCD 1       /* RTC operates in binary mode */
 #endif
@@ -26,7 +25,5 @@ outb_p((val),RTC_PORT(1)); \
 })
 
 #define RTC_IRQ 8
-#if 0
-#endif
 
 #endif /* _ASM_MC146818RTC_H */
index 695a860c024fb0bd6c286f5739516563af831795..516a8973b1302c177643915c35ee248f5631e987 100644 (file)
@@ -3,8 +3,6 @@
 
 #include <asm-generic/mman.h>
 
-/* orig : i386 2.6.0-test6 */
-
 #define MAP_GROWSDOWN  0x0100          /* stack-like segment */
 #define MAP_DENYWRITE  0x0800          /* ETXTBSY */
 #define MAP_EXECUTABLE 0x1000          /* mark it as an executable */
index cf3f6d78ac66ab13bc056b2f01f9389ad71a8ea5..d9bd724479cf0a078ea9b92fa4f73045468a8234 100644 (file)
@@ -1,13 +1,14 @@
 #ifndef _ASM_M32R_MMU_H
 #define _ASM_M32R_MMU_H
 
-
 #if !defined(CONFIG_MMU)
+
 typedef struct {
        struct vm_list_struct   *vmlist;
        unsigned long           end_brk;
 } mm_context_t;
-#else
+
+#else /* CONFIG_MMU */
 
 /* Default "unsigned long" context */
 #ifndef CONFIG_SMP
@@ -16,5 +17,6 @@ typedef unsigned long mm_context_t;
 typedef unsigned long mm_context_t[NR_CPUS];
 #endif
 
-#endif  /* CONFIG_MMU */
-#endif  /* _ASM_M32R_MMU_H */
+#endif /* CONFIG_MMU */
+
+#endif /* _ASM_M32R_MMU_H */
index 542302eb6bcbf97d9e1bd87474c4ce3bbd6ee145..1f40d4a0acf1a4acd6d0a3764f5b9f09b9439a78 100644 (file)
@@ -1,9 +1,7 @@
 #ifndef _ASM_M32R_MMU_CONTEXT_H
 #define _ASM_M32R_MMU_CONTEXT_H
-
 #ifdef __KERNEL__
 
-
 #include <asm/m32r.h>
 
 #define MMU_CONTEXT_ASID_MASK      (0x000000FF)
@@ -11,7 +9,6 @@
 #define MMU_CONTEXT_FIRST_VERSION  (0x00000100)
 #define NO_CONTEXT                 (0x00000000)
 
-
 #ifndef __ASSEMBLY__
 
 #include <asm/atomic.h>
@@ -147,7 +144,7 @@ static inline void switch_mm(struct mm_struct *prev,
 #define activate_mm(prev, next)        \
        switch_mm((prev), (next), NULL)
 
-#else
+#else /* not CONFIG_MMU */
 #define get_mmu_context(mm)             do { } while (0)
 #define init_new_context(tsk,mm)        (0)
 #define destroy_context(mm)             do { } while (0)
@@ -158,11 +155,9 @@ static inline void switch_mm(struct mm_struct *prev,
 #define deactivate_mm(mm,tsk)           do { } while (0)
 #define activate_mm(prev,next)          do { } while (0)
 #define enter_lazy_tlb(mm,tsk)          do { } while (0)
-#endif /* CONFIG_MMU */
-
+#endif /* not CONFIG_MMU */
 
 #endif /* not __ASSEMBLY__ */
 
 #endif /* __KERNEL__ */
-
 #endif /* _ASM_M32R_MMU_CONTEXT_H */
index 3f2541c92a7b06068c9debcb0256ec4864ae1a9c..eb73ee01121525c3a41be140ccf33dd9ee276d13 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_MODULE_H
 #define _ASM_M32R_MODULE_H
 
-/* $Id$ */
-
 struct mod_arch_specific { };
 
 #define Elf_Shdr       Elf32_Shdr
@@ -10,4 +8,3 @@ struct mod_arch_specific { };
 #define Elf_Ehdr       Elf32_Ehdr
 
 #endif /* _ASM_M32R_MODULE_H */
-
index 852ff52af4c2efb30668ecbf5828725eaaa9763c..0d5a877b813e4390c24edfe5e84ca007eb4df660 100644 (file)
@@ -1,10 +1,6 @@
 #ifndef _ASM_M32R_MSGBUF_H
 #define _ASM_M32R_MSGBUF_H
 
-/* $Id$ */
-
-/* orig : i386 2.4.18 */
-
 /*
  * The msqid64_ds structure for m32r architecture.
  * Note extra padding because this structure is passed back and forth
index 7172d3d2e2603aeacc839de4e6cff97637b75aae..210f8056b80532ca8e6a740b5e2895108006d0c9 100644 (file)
@@ -1,10 +1,6 @@
 #ifndef _ASM_M32R_NAMEI_H
 #define _ASM_M32R_NAMEI_H
 
-/* $Id$ */
-
-/* orig : i386 2.4.18 */
-
 /*
  * linux/include/asm-m32r/namei.h
  *
index f53e10187c03f377bf3504b7fb44b820453c5a3c..a5f18dd1ab20b4d1c077d95aff19e057eb51d6cf 100644 (file)
@@ -1,3 +1,6 @@
+#ifndef _OPSPUT_OPSPUT_LAN_H
+#define _OPSPUT_OPSPUT_LAN_H
+
 /*
  * include/asm-m32r/opsput/opsput_lan.h
  *
@@ -8,14 +11,8 @@
  * 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.
- *
- * $Id: opsput_lan.h,v 1.1 2004/07/27 06:54:20 sakugawa Exp $
  */
 
-#ifndef _OPSPUT_OPSPUT_LAN_H
-#define _OPSPUT_OPSPUT_LAN_H
-
-
 #ifndef __ASSEMBLY__
 /*
  * C functions use non-cache address.
@@ -23,7 +20,7 @@
 #define OPSPUT_LAN_BASE        (0x10000000 /* + NONCACHE_OFFSET */)
 #else
 #define OPSPUT_LAN_BASE        (0x10000000 + NONCACHE_OFFSET)
-#endif /* __ASSEMBLY__ */
+#endif /* __ASSEMBLY__ */
 
 /* ICU
  *  ICUISTS:   status register
@@ -52,4 +49,4 @@
 #define OPSPUT_LAN_ICUCR1      __reg16(OPSPUT_LAN_BASE + 0xc0010)
 #define OPSPUT_LAN_ICUCR3      __reg16(OPSPUT_LAN_BASE + 0xc0014)
 
-#endif /* _OPSPUT_OPSPUT_LAN_H */
+#endif /* _OPSPUT_OPSPUT_LAN_H */
index 99f296e1b61b6ee4bc4da2bbaaba0a3eefcdb63e..369c9f0832a6a5dfff94acc871eea2dfc31452bb 100644 (file)
@@ -1,3 +1,6 @@
+#ifndef _OPSPUT_OPSPUT_LCD_H
+#define _OPSPUT_OPSPUT_LCD_H
+
 /*
  * include/asm-m32r/opsput/opsput_lcd.h
  *
@@ -8,14 +11,8 @@
  * 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.
- *
- * $Id: opsput_lcd.h,v 1.1 2004/07/27 06:54:20 sakugawa Exp $
  */
 
-#ifndef _OPSPUT_OPSPUT_LCD_H
-#define _OPSPUT_OPSPUT_LCD_H
-
-
 #ifndef __ASSEMBLY__
 /*
  * C functions use non-cache address.
@@ -23,7 +20,7 @@
 #define OPSPUT_LCD_BASE        (0x10000000 /* + NONCACHE_OFFSET */)
 #else
 #define OPSPUT_LCD_BASE        (0x10000000 + NONCACHE_OFFSET)
-#endif /* __ASSEMBLY__ */
+#endif /* __ASSEMBLY__ */
 
 /*
  * ICU
@@ -55,4 +52,4 @@
 #define OPSPUT_LCD_ICUCR19     __reg16(OPSPUT_LCD_BASE + 0x300036)
 #define OPSPUT_LCD_ICUCR21     __reg16(OPSPUT_LCD_BASE + 0x30003a)
 
-#endif /* _OPSPUT_OPSPUT_LCD_H */
+#endif /* _OPSPUT_OPSPUT_LCD_H */
index a8d6452076f1576dd36c544082c4dcdc56b8056b..3f11ea1aac2d3605dc854be2e596e3b2490ed719 100644 (file)
@@ -1,3 +1,6 @@
+#ifndef _OPSPUT_OPSPUT_PLD_H
+#define _OPSPUT_OPSPUT_PLD_H
+
 /*
  * include/asm-m32r/opsput/opsput_pld.h
  *
@@ -8,14 +11,8 @@
  * 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.
- *
- * $Id: opsput_pld.h,v 1.1 2004/07/27 06:54:20 sakugawa Exp $
  */
 
-#ifndef _OPSPUT_OPSPUT_PLD_H
-#define _OPSPUT_OPSPUT_PLD_H
-
-
 #define PLD_PLAT_BASE          0x1cc00000
 
 #ifndef __ASSEMBLY__
@@ -31,7 +28,7 @@
 #define __reg8
 #define __reg16
 #define __reg32
-#endif /* __ASSEMBLY__ */
+#endif /* __ASSEMBLY__ */
 
 /* CFC */
 #define        PLD_CFRSTCR             __reg16(PLD_BASE + 0x0000)
 #define PLD_SCTXB              __reg16(PLD_BASE + 0x3800c)
 #define PLD_SCRXB              __reg16(PLD_BASE + 0x3800e)
 
-#endif /* _OPSPUT_OPSPUT_PLD.H */
+#endif /* _OPSPUT_OPSPUT_PLD.H */
index 404a4c24007b3b4f5729c86ae90ba5fce8f8e50f..6f6ecf7d14a3550bafd331892704b75a0c51fe8c 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef _ASM_M32R_PAGE_H
 #define _ASM_M32R_PAGE_H
 
-
 /* PAGE_SHIFT determines the page size */
 #define PAGE_SHIFT     12
 #define PAGE_SIZE      (1UL << PAGE_SHIFT)
@@ -57,9 +56,6 @@ typedef struct { unsigned long pgprot; } pgprot_t;
  * and CONFIG_HIGHMEM64G options in the kernel configuration.
  */
 
-
-/* This handles the memory map.. */
-
 #define __MEMORY_START  CONFIG_MEMORY_START
 #define __MEMORY_SIZE   CONFIG_MEMORY_SIZE
 
@@ -92,4 +88,3 @@ typedef struct { unsigned long pgprot; } pgprot_t;
 
 #endif /* __KERNEL__ */
 #endif /* _ASM_M32R_PAGE_H */
-
index 750b938ccb52a5b5459bf254601ce7eaaeeb66bd..3e14026e39cdaf2a479d1a09dabaf9c2d6b514b8 100644 (file)
@@ -1,10 +1,6 @@
 #ifndef _ASM_M32R_PARAM_H
 #define _ASM_M32R_PARAM_H
 
-/* $Id$ */
-
-/* orig : i386 2.5.67 */
-
 #ifdef __KERNEL__
 # define HZ            100             /* Internal kernel timer frequency */
 # define USER_HZ       100             /* .. some user interfaces are in "ticks" */
index 00d7b6f39a33fac151cf1b9ca28877e296901762..fe785d167db6142d2af839368874bca5665254ec 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_PCI_H
 #define _ASM_M32R_PCI_H
 
-/* $Id$ */
-
 #include <asm-generic/pci.h>
 
 #define PCI_DMA_BUS_IS_PHYS    (1)
index e09a86c3cadf44bf4266eece984c47dbf390b804..943ba63c1ebcf7bb365f541b75b05828429c6e54 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_PGALLOC_H
 #define _ASM_M32R_PGALLOC_H
 
-/* $Id$ */
-
 #include <linux/mm.h>
 
 #include <asm/io.h>
@@ -74,4 +72,3 @@ static __inline__ void pte_free(struct page *pte)
 #define check_pgt_cache()      do { } while (0)
 
 #endif /* _ASM_M32R_PGALLOC_H */
-
index 84152760e0b56e90847b9eb49c3772459afbdc09..750925726a10bc73b14b2dcc7f693a6ed141c24a 100644 (file)
@@ -1,9 +1,7 @@
 #ifndef _ASM_M32R_PGTABLE_2LEVEL_H
 #define _ASM_M32R_PGTABLE_2LEVEL_H
-
 #ifdef __KERNEL__
 
-
 /*
  * traditional M32R two-level paging structure:
  */
@@ -77,5 +75,4 @@ static inline pmd_t *pmd_offset(pgd_t * dir, unsigned long address)
 #define pgoff_to_pte(off)      ((pte_t) { (((off) & 0xef) << 2) | (((off) >> 7) << 10) | _PAGE_FILE })
 
 #endif /* __KERNEL__ */
-
 #endif /* _ASM_M32R_PGTABLE_2LEVEL_H */
index 47e7e85a3dc3f26b26dff2ca0d471752e1bd21e8..1caac65d208f244b327f9ea612562e5ebccc6c4b 100644 (file)
@@ -1,10 +1,6 @@
 #ifndef _ASM_M32R_POSIX_TYPES_H
 #define _ASM_M32R_POSIX_TYPES_H
 
-/* $Id$ */
-
-/* orig : i386, sh 2.4.18 */
-
 /*
  * This file is generally used by user-level software, so you need to
  * be a little careful about namespace pollution etc.  Also, we cannot
index 6b2b837c59782b910e3d679a3678f78296a4286f..0340633f3f4d23def1c11f78fa4184faa4df227f 100644 (file)
@@ -1,10 +1,6 @@
-/* $Id: rtc.h,v 1.1.1.1 2004/03/25 04:29:22 hitoshiy Exp $ */
-
 #ifndef __RTC_H__
 #define __RTC_H__
 
-
-
    /* Dallas DS1302 clock/calendar register numbers. */
 #  define RTC_SECONDS      0
 #  define RTC_MINUTES      1
index 09a10e43bf0f3bc7d3ae11a16f2a068262b0b0c5..c2de96cb69ed1940cf58510bfa6ec48977abbc66 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_SCATTERLIST_H
 #define _ASM_M32R_SCATTERLIST_H
 
-/* $Id$ */
-
 struct scatterlist {
     char *  address;    /* Location data is to be transferred to, NULL for
                          * highmem page */
index 6b969e53b8063b39a166ce8a041cf40fddb914ad..5e5d21c4908aed4efd88452abfe5a94032b8b1a6 100644 (file)
@@ -5,4 +5,3 @@
 #include <asm-generic/sections.h>
 
 #endif /* _M32R_SECTIONS_H */
-
index e45db68e6c2d79f751211c0dde863afc9e5cd45b..42b11aeb3249e630403fc0cb8702711624fd536a 100644 (file)
@@ -1,10 +1,6 @@
 #ifndef _ASM_M32R_SEGMENT_H
 #define _ASM_M32R_SEGMENT_H
 
-/* $Id$ */
-
-/* orig : i386 (2.4.18) */
-
 #define __KERNEL_CS    0x10
 #define __KERNEL_DS    0x18
 
index e69018e6ff711435ba9a9df5138ab491722d3778..c9873d6890e283cfd035a1d5be8b3e50981dc1ba 100644 (file)
@@ -1,10 +1,6 @@
 #ifndef _ASM_M32R_SEMBUF_H
 #define _ASM_M32R_SEMBUF_H
 
-/* $Id$ */
-
-/* orig : i386 2.4.18 */
-
 /*
  * The semid64_ds structure for m32r architecture.
  * Note extra padding because this structure is passed back and forth
index 6a0b32202d4e0ee901b3c93f44dcd87d7761a738..c637ab99239452f01ecd0ba853f7935f7299229a 100644 (file)
@@ -1,3 +1,6 @@
+#ifndef _ASM_M32R_SETUP_H
+#define _ASM_M32R_SETUP_H
+
 /*
  * This is set up by the setup-routine at boot-time
  */
@@ -32,3 +35,4 @@ extern unsigned long memory_end;
 
 #endif  /*  __KERNEL__  */
 
+#endif /* _ASM_M32R_SETUP_H */
index b84e897fa87bf6c41bf37ee62a5e43b1fd7f8363..b0cdf0aa7d654ca4a7aa8c0531323eed2c91eeaf 100644 (file)
@@ -1,10 +1,6 @@
 #ifndef _ASM_M32R_SHMBUF_H
 #define _ASM_M32R_SHMBUF_H
 
-/* $Id$ */
-
-/* orig : i386 2.4.18 */
-
 /*
  * The shmid64_ds structure for M32R architecture.
  * Note extra padding because this structure is passed back and forth
index db0019ba955d4458f64164f056cf2f1f7e15317a..35986d81a5285fd5aa23858513cf21b30e922ba7 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_SHMPARAM_H
 #define _ASM_M32R_SHMPARAM_H
 
-/* $Id$ */
-
 #define        SHMLBA PAGE_SIZE                 /* attach addr a multiple of this */
 
 #endif /* _ASM_M32R_SHMPARAM_H */
index 62537dc4dec903cd3f9cfdc1cb08f578df8c24c0..da4a9c36d09b9e224db4de75ff2f765acfb9cc64 100644 (file)
@@ -1,9 +1,6 @@
 #ifndef _ASM_M32R_SIGCONTEXT_H
 #define _ASM_M32R_SIGCONTEXT_H
 
-/* $Id$ */
-
-
 struct sigcontext {
        /* CPU registers */
        /* Saved main processor registers. */
index 482202f2e77fac5425fe2d8fba8be28d61ca188e..7d9cd9ebfd0e50c8d700b32f766835c61ab5fab8 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _M32R_SIGINFO_H
 #define _M32R_SIGINFO_H
 
-/* $Id$ */
-
 #include <asm-generic/siginfo.h>
 
 #endif /* _M32R_SIGINFO_H */
index 65423bed32b1cadecac621de7f19b460d22c793a..937258686ba54982ebb7b94149a513ba21090241 100644 (file)
@@ -1,10 +1,6 @@
 #ifndef _ASM_M32R_SIGNAL_H
 #define _ASM_M32R_SIGNAL_H
 
-/* $Id$ */
-
-/* orig : i386 2.4.18 */
-
 #include <linux/types.h>
 #include <linux/time.h>
 #include <linux/compiler.h>
index 650d2558c304c1e271e034c54246e8203f6bc3e5..abd937ac5239ae91503275cea548652bf020db23 100644 (file)
@@ -1,9 +1,6 @@
 #ifndef _ASM_M32R_SMP_H
 #define _ASM_M32R_SMP_H
 
-/* $Id$ */
-
-
 #ifdef CONFIG_SMP
 #ifndef __ASSEMBLY__
 
index 147a118442ac4fbd26d8af977a64533befe56842..f89962e231fedf296af9c4d3e76c55dc47f1da13 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_SOCKIOS_H
 #define _ASM_M32R_SOCKIOS_H
 
-/* $Id$ */
-
 /* Socket-level I/O control calls. */
 #define FIOSETOWN      0x8901
 #define SIOCSPGRP      0x8902
index 7e9941c45f4022e6ce30107de393a08e58c1eb92..83f52105c0e4a33f5ab282a78f9c25ce6f05a3bb 100644 (file)
@@ -20,4 +20,4 @@ typedef struct {
 
 #define __RAW_RW_LOCK_UNLOCKED         { RW_LOCK_BIAS }
 
-#endif
+#endif /* _ASM_M32R_SPINLOCK_TYPES_H */
index 05748fef4c8e232cf8069fa0eec7d62515a29313..da4518f82d6d31d71609d7a670924cbe79c88c2a 100644 (file)
@@ -1,10 +1,6 @@
 #ifndef _ASM_M32R_STAT_H
 #define _ASM_M32R_STAT_H
 
-/* $Id$ */
-
-/* orig : i386 2.4.18 */
-
 #include <asm/byteorder.h>
 
 struct __old_kernel_stat {
index cb54bcc2e677800bed20d8df4aced75e76e20d25..e61e2b0bfc1f4c423a84ca6e6c6b6de2905d4e24 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_STRING_H
 #define _ASM_M32R_STRING_H
 
-/* $Id$ */
-
 #define  __HAVE_ARCH_STRLEN
 extern size_t strlen(const char * s);
 
index d8d4b2c7a7d459400e4949203e68e4f39e70c28c..25f316f2b78dc8420efb405e94465fc56c81236f 100644 (file)
@@ -1,11 +1,8 @@
 #ifndef _ASM_M32R_SYSCALL_H
 #define _ASM_M32R_SYSCALL_H
 
-/* $Id$ */
-
 /* Definitions for the system call vector.  */
 #define SYSCALL_VECTOR          "2"
 #define SYSCALL_VECTOR_ADDRESS  "0xa0"
 
 #endif /* _ASM_M32R_SYSCALL_H */
-
index 4ce0619f6989024855782484766eb0adfa88cc78..99ee09889ff78578ca1c913e1c75a1ce4b65f319 100644 (file)
@@ -339,4 +339,4 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size)
 
 #define arch_align_stack(x) (x)
 
-#endif  /* _ASM_M32R_SYSTEM_H */
+#endif /* _ASM_M32R_SYSTEM_H */
index faf2bd0504c15153b84baa49ab3c507bdb738184..e402641dfbad20d8b2f5ac13711dcbf3fda54a2d 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_TERMBITS_H
 #define _ASM_M32R_TERMBITS_H
 
-/* $Id$ */
-
 #include <linux/posix_types.h>
 
 typedef unsigned char  cc_t;
@@ -184,4 +182,4 @@ struct ktermios {
 #define        TCSADRAIN       1
 #define        TCSAFLUSH       2
 
-#endif  /* _ASM_M32R_TERMBITS_H */
+#endif /* _ASM_M32R_TERMBITS_H */
index fc99d2e178d8c3c7878288e7ab09a2c2b1dcba1b..4943dd8db44de0e854a970ab6e92d54ccc2fb7d7 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _M32R_TERMIOS_H
 #define _M32R_TERMIOS_H
 
-/* orig : i386 2.6.0-test5 */
-
 #include <asm/termbits.h>
 #include <asm/ioctls.h>
 
@@ -41,24 +39,6 @@ struct termio {
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IR - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14      /* synchronous PPP */
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 #include <linux/module.h>
 
index 019441c1d7a0ef4feaff5523a6435d58283057ab..bb9fe4feb12d51847cf0a42de2183699b270b41c 100644 (file)
@@ -1,15 +1,12 @@
 #ifndef _ASM_M32R_TIMEX_H
 #define _ASM_M32R_TIMEX_H
 
-/* $Id$ */
-
 /*
  * linux/include/asm-m32r/timex.h
  *
  * m32r architecture timex specifications
  */
 
-
 #define CLOCK_TICK_RATE        (CONFIG_BUS_CLOCK / CONFIG_TIMER_DIVIDE)
 #define CLOCK_TICK_FACTOR      20      /* Factor of both 1000000 and CLOCK_TICK_RATE */
 
index ae4494960593312b5c8d4813192c7f9e0639b421..3d37ac002bcc6e2a9329de1df0a644297aee9249 100644 (file)
@@ -98,4 +98,3 @@ static __inline__ void __flush_tlb_all(void)
 extern void update_mmu_cache(struct vm_area_struct *, unsigned long, pte_t);
 
 #endif /* _ASM_M32R_TLBFLUSH_H */
-
index fcf24c64c3ba4650d001dbf9dfa770583df51bed..27d3eb539c50ddf16bbea835d11fcd7359bbf703 100644 (file)
@@ -3,10 +3,6 @@
 
 #ifndef __ASSEMBLY__
 
-/* $Id$ */
-
-/* orig : i386 2.4.18 */
-
 typedef unsigned short umode_t;
 
 /*
@@ -59,4 +55,4 @@ typedef u64 dma64_addr_t;
 
 #endif /* __KERNEL__ */
 
-#endif  /* _ASM_M32R_TYPES_H */
+#endif /* _ASM_M32R_TYPES_H */
index 26e978c7e3b40a060c0d3e80f1ef41cf5923635a..bd8c83765a5c66361c8bfc35e0ee172ec5cd3f87 100644 (file)
@@ -68,7 +68,7 @@ static inline void set_fs(mm_segment_t s)
  * This needs 33-bit arithmetic. We have a carry...
  */
 #define __range_ok(addr,size) ({                                       \
-       unsigned long flag, sum;                                        \
+       unsigned long flag, roksum;                                     \
        __chk_user_ptr(addr);                                           \
        asm (                                                           \
                "       cmpu    %1, %1    ; clear cbit\n"               \
@@ -76,7 +76,7 @@ static inline void set_fs(mm_segment_t s)
                "       subx    %0, %0\n"                               \
                "       cmpu    %4, %1\n"                               \
                "       subx    %0, %5\n"                               \
-               : "=&r" (flag), "=r" (sum)                              \
+               : "=&r" (flag), "=r" (roksum)                           \
                : "1" (addr), "r" ((int)(size)),                        \
                  "r" (current_thread_info()->addr_limit.seg), "r" (0)  \
                : "cbit" );                                             \
index 2de709a5c53c16b91f2fb52fe0d4cb2e27484524..09324741eec39780f483212f00fda95b75c5ffa9 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_UCONTEXT_H
 #define _ASM_M32R_UCONTEXT_H
 
-/* orig : i386 2.4.18 */
-
 struct ucontext {
        unsigned long     uc_flags;
        struct ucontext  *uc_link;
index 3aef9ac8d3aa06ee716805fc4522563ee8607427..fccc180c3913ff84a67af1139d0bc43a3eeed3a5 100644 (file)
@@ -1,10 +1,6 @@
 #ifndef _ASM_M32R_UNALIGNED_H
 #define _ASM_M32R_UNALIGNED_H
 
-/* $Id$ */
-
-/* orig : generic 2.4.18 */
-
 /*
  * For the benefit of those who are trying to port Linux to another
  * architecture, here are some C-language equivalents.
@@ -12,7 +8,6 @@
 
 #include <asm/string.h>
 
-
 #define get_unaligned(ptr) \
   ({ __typeof__(*(ptr)) __tmp; memmove(&__tmp, (ptr), sizeof(*(ptr))); __tmp; })
 
@@ -21,5 +16,4 @@
      memmove((ptr), &__tmp, sizeof(*(ptr)));           \
      (void)0; })
 
-
-#endif  /* _ASM_M32R_UNALIGNED_H */
+#endif /* _ASM_M32R_UNALIGNED_H */
index 5b66bd3c6ed663cd6cb9d9dd4f7cba21eaec66f7..cbbd53762ea64f17e71ff772c2bc5429eb6cd14f 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_UNISTD_H
 #define _ASM_M32R_UNISTD_H
 
-/* $Id$ */
-
 /*
  * This file contains the system call numbers.
  */
index 1ad4ded8483b48a1af31452fe8b7a2370c1e3fba..035258d713d00f5ebb2508fda4261f956d7855e6 100644 (file)
@@ -1,12 +1,6 @@
 #ifndef _ASM_M32R_USER_H
 #define _ASM_M32R_USER_H
 
-/* $Id$ */
-
-/* orig : sh 2.4.18
- * mod  : remove fpu registers
- */
-
 #include <linux/types.h>
 #include <asm/ptrace.h>
 #include <asm/page.h>
index 533163447cc9d3f711d256c144bb6095b982b0f9..a1b63061c06fee0a28571f13d100f72e95fe8f4e 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_VGA_H
 #define _ASM_M32R_VGA_H
 
-/* $Id$ */
-
 /*
  *     Access to VGA videoram
  *
@@ -19,4 +17,4 @@
 #define vga_readb(x) (*(x))
 #define vga_writeb(x,y) (*(y) = (x))
 
-#endif  /* _ASM_M32R_VGA_H */
+#endif /* _ASM_M32R_VGA_H */
index fd960dc9bf7663f1758d5f4ed7f58356372d8c30..6d525259df3ed0e1effb85afc62ef886ca9c9fe2 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _ASM_M32R_XOR_H
 #define _ASM_M32R_XOR_H
 
-/* $Id$ */
-
 #include <asm-generic/xor.h>
 
 #endif  /* _ASM_M32R_XOR_H */
index 7ac6259b68dfbfeac50c5cb20304828b31e03395..ddfab96403cb93fdc1d6f4897cccaf0cc74672bf 100644 (file)
@@ -226,6 +226,21 @@ extern unsigned int fp_debugprint;
        .previous
 .endm
 
+/* work around binutils idiocy */
+old_gas=-1
+.irp    gas_ident.x .x
+old_gas=old_gas+1
+.endr
+.if !old_gas
+.irp   m b,w,l
+.macro getuser.\m src,dest,label,addr
+       getuser .\m,\src,\dest,\label,\addr
+.endm
+.macro putuser.\m src,dest,label,addr
+       putuser .\m,\src,\dest,\label,\addr
+.endm
+.endr
+.endif
 
 .macro movestack       nr,arg1,arg2,arg3,arg4,arg5
        .if     \nr
index 857f0c9a9120c650ed05ecbbf8e857dadf312449..00edabd7616869015ce4751f190de23483738d2b 100644 (file)
@@ -49,24 +49,6 @@ struct termio {
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IrDa - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 
 /*
index d7c0b109bd457c55d2baeb80132a1bad6b8f9ff6..8c56ccab4849ca0c86dfba77281d0e52d6ee0b4e 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef _M68K_USER_H
 #define _M68K_USER_H
 
-#include <asm/page.h>
-
 /* Core file format: The core file is written in such a way that gdb
    can understand it and provide useful information to the user (under
    linux we use the 'trad-core' bfd).  There are quite a number of
index c1a2409bb52a171fc1c1c0b9070b7791f350e812..8578869a8bcfb4556d3e50a62312b0c5abc3f8ee 100644 (file)
@@ -69,7 +69,10 @@ static __inline__ void atomic_add(int i, atomic_t * v)
                "1:     ll      %0, %1          # atomic_add            \n"
                "       addu    %0, %2                                  \n"
                "       sc      %0, %1                                  \n"
-               "       beqz    %0, 1b                                  \n"
+               "       beqz    %0, 2f                                  \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "       .previous                                       \n"
                "       .set    mips0                                   \n"
                : "=&r" (temp), "=m" (v->counter)
                : "Ir" (i), "m" (v->counter));
@@ -111,7 +114,10 @@ static __inline__ void atomic_sub(int i, atomic_t * v)
                "1:     ll      %0, %1          # atomic_sub            \n"
                "       subu    %0, %2                                  \n"
                "       sc      %0, %1                                  \n"
-               "       beqz    %0, 1b                                  \n"
+               "       beqz    %0, 2f                                  \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "       .previous                                       \n"
                "       .set    mips0                                   \n"
                : "=&r" (temp), "=m" (v->counter)
                : "Ir" (i), "m" (v->counter));
@@ -155,8 +161,11 @@ static __inline__ int atomic_add_return(int i, atomic_t * v)
                "1:     ll      %1, %2          # atomic_add_return     \n"
                "       addu    %0, %1, %3                              \n"
                "       sc      %0, %2                                  \n"
-               "       beqz    %0, 1b                                  \n"
+               "       beqz    %0, 2f                                  \n"
                "       addu    %0, %1, %3                              \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "       .previous                                       \n"
                "       .set    mips0                                   \n"
                : "=&r" (result), "=&r" (temp), "=m" (v->counter)
                : "Ir" (i), "m" (v->counter)
@@ -204,8 +213,11 @@ static __inline__ int atomic_sub_return(int i, atomic_t * v)
                "1:     ll      %1, %2          # atomic_sub_return     \n"
                "       subu    %0, %1, %3                              \n"
                "       sc      %0, %2                                  \n"
-               "       beqz    %0, 1b                                  \n"
+               "       beqz    %0, 2f                                  \n"
                "       subu    %0, %1, %3                              \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "       .previous                                       \n"
                "       .set    mips0                                   \n"
                : "=&r" (result), "=&r" (temp), "=m" (v->counter)
                : "Ir" (i), "m" (v->counter)
@@ -267,10 +279,13 @@ static __inline__ int atomic_sub_if_positive(int i, atomic_t * v)
                "       bltz    %0, 1f                                  \n"
                "       sc      %0, %2                                  \n"
                "       .set    noreorder                               \n"
-               "       beqz    %0, 1b                                  \n"
+               "       beqz    %0, 2f                                  \n"
                "        subu   %0, %1, %3                              \n"
                "       .set    reorder                                 \n"
                "1:                                                     \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "       .previous                                       \n"
                "       .set    mips0                                   \n"
                : "=&r" (result), "=&r" (temp), "=m" (v->counter)
                : "Ir" (i), "m" (v->counter)
@@ -429,7 +444,10 @@ static __inline__ void atomic64_add(long i, atomic64_t * v)
                "1:     lld     %0, %1          # atomic64_add          \n"
                "       addu    %0, %2                                  \n"
                "       scd     %0, %1                                  \n"
-               "       beqz    %0, 1b                                  \n"
+               "       beqz    %0, 2f                                  \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "       .previous                                       \n"
                "       .set    mips0                                   \n"
                : "=&r" (temp), "=m" (v->counter)
                : "Ir" (i), "m" (v->counter));
@@ -471,7 +489,10 @@ static __inline__ void atomic64_sub(long i, atomic64_t * v)
                "1:     lld     %0, %1          # atomic64_sub          \n"
                "       subu    %0, %2                                  \n"
                "       scd     %0, %1                                  \n"
-               "       beqz    %0, 1b                                  \n"
+               "       beqz    %0, 2f                                  \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "       .previous                                       \n"
                "       .set    mips0                                   \n"
                : "=&r" (temp), "=m" (v->counter)
                : "Ir" (i), "m" (v->counter));
@@ -515,8 +536,11 @@ static __inline__ long atomic64_add_return(long i, atomic64_t * v)
                "1:     lld     %1, %2          # atomic64_add_return   \n"
                "       addu    %0, %1, %3                              \n"
                "       scd     %0, %2                                  \n"
-               "       beqz    %0, 1b                                  \n"
+               "       beqz    %0, 2f                                  \n"
                "       addu    %0, %1, %3                              \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "       .previous                                       \n"
                "       .set    mips0                                   \n"
                : "=&r" (result), "=&r" (temp), "=m" (v->counter)
                : "Ir" (i), "m" (v->counter)
@@ -564,8 +588,11 @@ static __inline__ long atomic64_sub_return(long i, atomic64_t * v)
                "1:     lld     %1, %2          # atomic64_sub_return   \n"
                "       subu    %0, %1, %3                              \n"
                "       scd     %0, %2                                  \n"
-               "       beqz    %0, 1b                                  \n"
+               "       beqz    %0, 2f                                  \n"
                "       subu    %0, %1, %3                              \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "       .previous                                       \n"
                "       .set    mips0                                   \n"
                : "=&r" (result), "=&r" (temp), "=m" (v->counter)
                : "Ir" (i), "m" (v->counter)
@@ -627,10 +654,13 @@ static __inline__ long atomic64_sub_if_positive(long i, atomic64_t * v)
                "       bltz    %0, 1f                                  \n"
                "       scd     %0, %2                                  \n"
                "       .set    noreorder                               \n"
-               "       beqz    %0, 1b                                  \n"
+               "       beqz    %0, 2f                                  \n"
                "        dsubu  %0, %1, %3                              \n"
                "       .set    reorder                                 \n"
                "1:                                                     \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "       .previous                                       \n"
                "       .set    mips0                                   \n"
                : "=&r" (result), "=&r" (temp), "=m" (v->counter)
                : "Ir" (i), "m" (v->counter)
index 06445de1324bd3c058a507d08d0c747d6ab571ae..06c08228a5256cbb3fa9320b102b09eb6e21774d 100644 (file)
@@ -68,7 +68,10 @@ static inline void set_bit(unsigned long nr, volatile unsigned long *addr)
                "1:     " __LL "%0, %1                  # set_bit       \n"
                "       or      %0, %2                                  \n"
                "       " __SC  "%0, %1                                 \n"
-               "       beqz    %0, 1b                                  \n"
+               "       beqz    %0, 2f                                  \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "       .previous                                       \n"
                "       .set    mips0                                   \n"
                : "=&r" (temp), "=m" (*m)
                : "ir" (1UL << (nr & SZLONG_MASK)), "m" (*m));
@@ -116,7 +119,10 @@ static inline void clear_bit(unsigned long nr, volatile unsigned long *addr)
                "1:     " __LL "%0, %1                  # clear_bit     \n"
                "       and     %0, %2                                  \n"
                "       " __SC "%0, %1                                  \n"
-               "       beqz    %0, 1b                                  \n"
+               "       beqz    %0, 2f                                  \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "       .previous                                       \n"
                "       .set    mips0                                   \n"
                : "=&r" (temp), "=m" (*m)
                : "ir" (~(1UL << (nr & SZLONG_MASK))), "m" (*m));
@@ -166,7 +172,10 @@ static inline void change_bit(unsigned long nr, volatile unsigned long *addr)
                "1:     " __LL "%0, %1          # change_bit    \n"
                "       xor     %0, %2                          \n"
                "       " __SC  "%0, %1                         \n"
-               "       beqz    %0, 1b                          \n"
+               "       beqz    %0, 2f                          \n"
+               "       .subsection 2                           \n"
+               "2:     b       1b                              \n"
+               "       .previous                               \n"
                "       .set    mips0                           \n"
                : "=&r" (temp), "=m" (*m)
                : "ir" (1UL << (nr & SZLONG_MASK)), "m" (*m));
@@ -222,8 +231,12 @@ static inline int test_and_set_bit(unsigned long nr,
                "1:     " __LL "%0, %1          # test_and_set_bit      \n"
                "       or      %2, %0, %3                              \n"
                "       " __SC  "%2, %1                                 \n"
-               "       beqz    %2, 1b                                  \n"
+               "       beqz    %2, 2f                                  \n"
                "        and    %2, %0, %3                              \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "        nop                                            \n"
+               "       .previous                                       \n"
                "       .set    pop                                     \n"
                : "=&r" (temp), "=m" (*m), "=&r" (res)
                : "r" (1UL << (nr & SZLONG_MASK)), "m" (*m)
@@ -290,8 +303,12 @@ static inline int test_and_clear_bit(unsigned long nr,
                "       or      %2, %0, %3                              \n"
                "       xor     %2, %3                                  \n"
                "       " __SC  "%2, %1                                 \n"
-               "       beqz    %2, 1b                                  \n"
+               "       beqz    %2, 2f                                  \n"
                "        and    %2, %0, %3                              \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "        nop                                            \n"
+               "       .previous                                       \n"
                "       .set    pop                                     \n"
                : "=&r" (temp), "=m" (*m), "=&r" (res)
                : "r" (1UL << (nr & SZLONG_MASK)), "m" (*m)
@@ -356,8 +373,12 @@ static inline int test_and_change_bit(unsigned long nr,
                "1:     " __LL  "%0, %1         # test_and_change_bit   \n"
                "       xor     %2, %0, %3                              \n"
                "       " __SC  "\t%2, %1                               \n"
-               "       beqz    %2, 1b                                  \n"
+               "       beqz    %2, 2f                                  \n"
                "        and    %2, %0, %3                              \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "        nop                                            \n"
+               "       .previous                                       \n"
                "       .set    pop                                     \n"
                : "=&r" (temp), "=m" (*m), "=&r" (res)
                : "r" (1UL << (nr & SZLONG_MASK)), "m" (*m)
diff --git a/include/asm-mips/compat-signal.h b/include/asm-mips/compat-signal.h
new file mode 100644 (file)
index 0000000..6720770
--- /dev/null
@@ -0,0 +1,55 @@
+#ifndef __ASM_COMPAT_SIGNAL_H
+#define __ASM_COMPAT_SIGNAL_H
+
+#include <linux/bug.h>
+#include <linux/compat.h>
+#include <linux/compiler.h>
+
+static inline int __copy_conv_sigset_to_user(compat_sigset_t __user *d,
+       const sigset_t *s)
+{
+       int err;
+
+       BUG_ON(sizeof(*d) != sizeof(*s));
+       BUG_ON(_NSIG_WORDS != 2);
+
+       err  = __put_user(s->sig[0],       &d->sig[0]);
+       err |= __put_user(s->sig[0] >> 32, &d->sig[1]);
+       err |= __put_user(s->sig[1],       &d->sig[2]);
+       err |= __put_user(s->sig[1] >> 32, &d->sig[3]);
+
+       return err;
+}
+
+static inline int __copy_conv_sigset_from_user(sigset_t *d,
+       const compat_sigset_t __user *s)
+{
+       int err;
+       union sigset_u {
+               sigset_t        s;
+               compat_sigset_t c;
+       } *u = (union sigset_u *) d;
+
+       BUG_ON(sizeof(*d) != sizeof(*s));
+       BUG_ON(_NSIG_WORDS != 2);
+
+       if (unlikely(!access_ok(VERIFY_READ, d, sizeof(*d))))
+               return -EFAULT;
+
+#ifdef CONFIG_CPU_BIG_ENDIAN
+       err  = __get_user(u->c.sig[1], &s->sig[0]);
+       err |= __get_user(u->c.sig[0], &s->sig[1]);
+       err |= __get_user(u->c.sig[3], &s->sig[2]);
+       err |= __get_user(u->c.sig[2], &s->sig[3]);
+#endif
+#ifdef CONFIG_CPU_LITTLE_ENDIAN
+       err  = __get_user(u->c.sig[0], &s->sig[0]);
+       err |= __get_user(u->c.sig[1], &s->sig[1]);
+       err |= __get_user(u->c.sig[2], &s->sig[2]);
+       err |= __get_user(u->c.sig[3], &s->sig[3]);
+#endif
+
+       return err;
+}
+
+#endif /* __ASM_COMPAT_SIGNAL_H */
index 236d1a467cc7fb49ae8dd028c8b66c1d2e3cd471..230b3f1b69b1015b3d639691200f97ebad45052e 100644 (file)
@@ -68,6 +68,7 @@ extern int dma_is_consistent(struct device *dev, dma_addr_t dma_addr);
 extern void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
               enum dma_data_direction direction);
 
+#if 0
 #define ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY
 
 extern int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
@@ -75,5 +76,6 @@ extern int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
 extern void dma_release_declared_memory(struct device *dev);
 extern void * dma_mark_declared_memory_occupied(struct device *dev,
        dma_addr_t device_addr, size_t size);
+#endif
 
 #endif /* _ASM_DMA_MAPPING_H */
diff --git a/include/asm-mips/mach-generic/dma-coherence.h b/include/asm-mips/mach-generic/dma-coherence.h
new file mode 100644 (file)
index 0000000..df71822
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * 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) 2006  Ralf Baechle <ralf@linux-mips.org>
+ *
+ */
+#ifndef __ASM_MACH_GENERIC_DMA_COHERENCE_H
+#define __ASM_MACH_GENERIC_DMA_COHERENCE_H
+
+struct device;
+
+static dma_addr_t plat_map_dma_mem(struct device *dev, void *addr, size_t size)
+{
+       return virt_to_phys(addr);
+}
+
+static dma_addr_t plat_map_dma_mem_page(struct device *dev, struct page *page)
+{
+       return page_to_phys(page);
+}
+
+static unsigned long plat_dma_addr_to_phys(dma_addr_t dma_addr)
+{
+       return dma_addr;
+}
+
+static void plat_unmap_dma_mem(dma_addr_t dma_addr)
+{
+}
+
+static inline int plat_device_is_coherent(struct device *dev)
+{
+#ifdef CONFIG_DMA_COHERENT
+       return 1;
+#endif
+#ifdef CONFIG_DMA_NONCOHERENT
+       return 0;
+#endif
+}
+
+#endif /* __ASM_MACH_GENERIC_DMA_COHERENCE_H */
index 410ab5f6c5636b519c6ecc8c56932e4abcf08d95..b8e6deba352fd90f6685e736a25df7ac5689c912 100644 (file)
@@ -5,6 +5,7 @@
 #ifndef CONFIG_DMA_COHERENT
 /*
  * Total overkill for most systems but need as a safe default.
+ * Set this one if any device in the system might do non-coherent DMA.
  */
 #define ARCH_KMALLOC_MINALIGN  128
 #endif
diff --git a/include/asm-mips/mach-ip27/dma-coherence.h b/include/asm-mips/mach-ip27/dma-coherence.h
new file mode 100644 (file)
index 0000000..659816e
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * 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) 2006  Ralf Baechle <ralf@linux-mips.org>
+ *
+ */
+#ifndef __ASM_MACH_IP27_DMA_COHERENCE_H
+#define __ASM_MACH_IP27_DMA_COHERENCE_H
+
+#include <asm/pci/bridge.h>
+
+#define pdev_to_baddr(pdev, addr) \
+       (BRIDGE_CONTROLLER(pdev->bus)->baddr + (addr))
+#define dev_to_baddr(dev, addr) \
+       pdev_to_baddr(to_pci_dev(dev), (addr))
+
+struct device;
+
+static dma_addr_t plat_map_dma_mem(struct device *dev, void *addr, size_t size)
+{
+       dma_addr_t pa = dev_to_baddr(dev, virt_to_phys(addr));
+
+       return pa;
+}
+
+static dma_addr_t plat_map_dma_mem_page(struct device *dev, struct page *page)
+{
+       dma_addr_t pa = dev_to_baddr(dev, page_to_phys(page));
+
+       return pa;
+}
+
+static unsigned long plat_dma_addr_to_phys(dma_addr_t dma_addr)
+{
+       return dma_addr & (0xffUL << 56);
+}
+
+static void plat_unmap_dma_mem(dma_addr_t dma_addr)
+{
+}
+
+static inline int plat_device_is_coherent(struct device *dev)
+{
+       return 1;               /* IP27 non-cohernet mode is unsupported */
+}
+
+#endif /* __ASM_MACH_IP27_DMA_COHERENCE_H */
diff --git a/include/asm-mips/mach-ip32/dma-coherence.h b/include/asm-mips/mach-ip32/dma-coherence.h
new file mode 100644 (file)
index 0000000..950be17
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * 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) 2006  Ralf Baechle <ralf@linux-mips.org>
+ *
+ */
+#ifndef __ASM_MACH_IP35_DMA_COHERENCE_H
+#define __ASM_MACH_IP35_DMA_COHERENCE_H
+
+#include <asm/ip32/crime.h>
+
+struct device;
+
+/*
+ * Few notes.
+ * 1. CPU sees memory as two chunks: 0-256M@0x0, and the rest @0x40000000+256M
+ * 2. PCI sees memory as one big chunk @0x0 (or we could use 0x40000000 for
+ *    native-endian)
+ * 3. All other devices see memory as one big chunk at 0x40000000
+ * 4. Non-PCI devices will pass NULL as struct device*
+ *
+ * Thus we translate differently, depending on device.
+ */
+
+#define RAM_OFFSET_MASK 0x3fffffffUL
+
+static dma_addr_t plat_map_dma_mem(struct device *dev, void *addr, size_t size)
+{
+       dma_addr_t pa = virt_to_phys(addr) & RAM_OFFSET_MASK;
+
+       if (dev == NULL)
+               pa += CRIME_HI_MEM_BASE;
+
+       return pa;
+}
+
+static dma_addr_t plat_map_dma_mem_page(struct device *dev, struct page *page)
+{
+       dma_addr_t pa;
+
+       pa = page_to_phys(page) & RAM_OFFSET_MASK;
+
+       if (dev == NULL)
+               pa += CRIME_HI_MEM_BASE;
+
+       return pa;
+}
+
+/* This is almost certainly wrong but it's what dma-ip32.c used to use  */
+static unsigned long plat_dma_addr_to_phys(dma_addr_t dma_addr)
+{
+       unsigned long addr = dma_addr & RAM_OFFSET_MASK;
+
+       if (dma_addr >= 256*1024*1024)
+               addr += CRIME_HI_MEM_BASE;
+
+       return addr;
+}
+
+static void plat_unmap_dma_mem(dma_addr_t dma_addr)
+{
+}
+
+static inline int plat_device_is_coherent(struct device *dev)
+{
+       return 0;               /* IP32 is non-cohernet */
+}
+
+#endif /* __ASM_MACH_IP35_DMA_COHERENCE_H */
diff --git a/include/asm-mips/mach-jazz/dma-coherence.h b/include/asm-mips/mach-jazz/dma-coherence.h
new file mode 100644 (file)
index 0000000..d66979a
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * 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) 2006  Ralf Baechle <ralf@linux-mips.org>
+ */
+#ifndef __ASM_MACH_JAZZ_DMA_COHERENCE_H
+#define __ASM_MACH_JAZZ_DMA_COHERENCE_H
+
+#include <asm/jazzdma.h>
+
+struct device;
+
+static dma_addr_t plat_map_dma_mem(struct device *dev, void *addr, size_t size)
+{
+       return vdma_alloc(virt_to_phys(addr), size);
+}
+
+static dma_addr_t plat_map_dma_mem_page(struct device *dev, struct page *page)
+{
+       return vdma_alloc(page_to_phys(page), PAGE_SIZE);
+}
+
+static unsigned long plat_dma_addr_to_phys(dma_addr_t dma_addr)
+{
+       return vdma_log2phys(dma_addr);
+}
+
+static void plat_unmap_dma_mem(dma_addr_t dma_addr)
+{
+       vdma_free(dma_addr);
+}
+
+static inline int plat_device_is_coherent(struct device *dev)
+{
+       return 0;
+}
+
+#endif /* __ASM_MACH_JAZZ_DMA_COHERENCE_H */
index c31a312b9783f93524c7e1af7aadd53520099d10..fdfff0b8ce42575af3f3f78a2842600a84d725e0 100644 (file)
@@ -12,4 +12,7 @@ extern unsigned long mt_fpemul_threshold;
 extern void mips_mt_regdump(unsigned long previous_mvpcontrol_value);
 extern void mips_mt_set_cpuoptions(void);
 
+struct class;
+extern struct class *mt_class;
+
 #endif /* __ASM_MIPS_MT_H */
index 046cf686bee7f74a773877ec658c29e8d8d10e2a..e4d6f1fb1cf765c5ca8e23c3e8438f39ebcc0e2d 100644 (file)
@@ -72,7 +72,6 @@
 #define MADV_DOFORK    11              /* do inherit across fork */
 
 /* compatibility flags */
-#define MAP_ANON       MAP_ANONYMOUS
 #define MAP_FILE       0
 
 #endif /* _ASM_MMAN_H */
index cefa657dd04a86268923122e5bb8fce3ec1fa480..3c175a7e43450ceb7ee3b4a667628ef4043811c5 100644 (file)
@@ -19,7 +19,7 @@
  */
 struct sigcontext {
        unsigned int            sc_regmask;     /* Unused */
-       unsigned int            sc_status;
+       unsigned int            sc_status;      /* Unused */
        unsigned long long      sc_pc;
        unsigned long long      sc_regs[32];
        unsigned long long      sc_fpregs[32];
@@ -76,7 +76,7 @@ struct sigcontext {
 
 struct sigcontext32 {
        __u32           sc_regmask;     /* Unused */
-       __u32           sc_status;
+       __u32           sc_status;      /* Unused */
        __u64           sc_pc;
        __u64           sc_regs[32];
        __u64           sc_fpregs[32];
index fc3217fc1118deabd9c4c40cb3442cdf1573c2ab..f1755d28a36a6f3a44f44bebd3f2f061617e8695 100644 (file)
@@ -3,7 +3,7 @@
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  *
- * Copyright (C) 1999, 2000, 06 by Ralf Baechle
+ * Copyright (C) 1999, 2000, 06 Ralf Baechle (ralf@linux-mips.org)
  * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
  */
 #ifndef _ASM_SPINLOCK_H
@@ -49,11 +49,18 @@ static inline void __raw_spin_lock(raw_spinlock_t *lock)
                __asm__ __volatile__(
                "       .set    noreorder       # __raw_spin_lock       \n"
                "1:     ll      %1, %2                                  \n"
-               "       bnez    %1, 1b                                  \n"
+               "       bnez    %1, 2f                                  \n"
                "        li     %1, 1                                   \n"
                "       sc      %1, %0                                  \n"
-               "       beqz    %1, 1b                                  \n"
+               "       beqz    %1, 2f                                  \n"
                "        nop                                            \n"
+               "       .subsection 2                                   \n"
+               "2:     ll      %1, %2                                  \n"
+               "       bnez    %1, 2b                                  \n"
+               "        li     %1, 1                                   \n"
+               "       b       1b                                      \n"
+               "        nop                                            \n"
+               "       .previous                                       \n"
                "       .set    reorder                                 \n"
                : "=m" (lock->lock), "=&r" (tmp)
                : "m" (lock->lock)
@@ -99,8 +106,12 @@ static inline unsigned int __raw_spin_trylock(raw_spinlock_t *lock)
                "1:     ll      %0, %3                                  \n"
                "       ori     %2, %0, 1                               \n"
                "       sc      %2, %1                                  \n"
-               "       beqz    %2, 1b                                  \n"
+               "       beqz    %2, 2f                                  \n"
                "        andi   %2, %0, 1                               \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "        nop                                            \n"
+               "       .previous                                       \n"
                "       .set    reorder"
                : "=&r" (temp), "=m" (lock->lock), "=&r" (res)
                : "m" (lock->lock)
@@ -154,11 +165,18 @@ static inline void __raw_read_lock(raw_rwlock_t *rw)
                __asm__ __volatile__(
                "       .set    noreorder       # __raw_read_lock       \n"
                "1:     ll      %1, %2                                  \n"
-               "       bltz    %1, 1b                                  \n"
+               "       bltz    %1, 2f                                  \n"
                "        addu   %1, 1                                   \n"
                "       sc      %1, %0                                  \n"
                "       beqz    %1, 1b                                  \n"
                "        nop                                            \n"
+               "       .subsection 2                                   \n"
+               "2:     ll      %1, %2                                  \n"
+               "       bltz    %1, 2b                                  \n"
+               "        addu   %1, 1                                   \n"
+               "       b       1b                                      \n"
+               "        nop                                            \n"
+               "       .previous                                       \n"
                "       .set    reorder                                 \n"
                : "=m" (rw->lock), "=&r" (tmp)
                : "m" (rw->lock)
@@ -192,8 +210,12 @@ static inline void __raw_read_unlock(raw_rwlock_t *rw)
                "1:     ll      %1, %2                                  \n"
                "       sub     %1, 1                                   \n"
                "       sc      %1, %0                                  \n"
-               "       beqz    %1, 1b                                  \n"
+               "       beqz    %1, 2f                                  \n"
+               "        nop                                            \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
                "        nop                                            \n"
+               "       .previous                                       \n"
                "       .set    reorder                                 \n"
                : "=m" (rw->lock), "=&r" (tmp)
                : "m" (rw->lock)
@@ -222,11 +244,18 @@ static inline void __raw_write_lock(raw_rwlock_t *rw)
                __asm__ __volatile__(
                "       .set    noreorder       # __raw_write_lock      \n"
                "1:     ll      %1, %2                                  \n"
-               "       bnez    %1, 1b                                  \n"
+               "       bnez    %1, 2f                                  \n"
                "        lui    %1, 0x8000                              \n"
                "       sc      %1, %0                                  \n"
-               "       beqz    %1, 1b                                  \n"
+               "       beqz    %1, 2f                                  \n"
+               "        nop                                            \n"
+               "       .subsection 2                                   \n"
+               "2:     ll      %1, %2                                  \n"
+               "       bnez    %1, 2b                                  \n"
+               "        lui    %1, 0x8000                              \n"
+               "       b       1b                                      \n"
                "        nop                                            \n"
+               "       .previous                                       \n"
                "       .set    reorder                                 \n"
                : "=m" (rw->lock), "=&r" (tmp)
                : "m" (rw->lock)
@@ -322,12 +351,15 @@ static inline int __raw_write_trylock(raw_rwlock_t *rw)
                "       bnez    %1, 2f                                  \n"
                "       lui     %1, 0x8000                              \n"
                "       sc      %1, %0                                  \n"
-               "       beqz    %1, 1b                                  \n"
-               "        nop                                            \n"
+               "       beqz    %1, 3f                                  \n"
+               "        li     %2, 1                                   \n"
+               "2:                                                     \n"
                __WEAK_ORDERING_MB
-               "       li      %2, 1                                   \n"
+               "       .subsection 2                                   \n"
+               "3:     b       1b                                      \n"
+               "        li     %2, 0                                   \n"
+               "       .previous                                       \n"
                "       .set    reorder                                 \n"
-               "2:                                                     \n"
                : "=m" (rw->lock), "=&r" (tmp), "=&r" (ret)
                : "m" (rw->lock)
                : "memory");
index 5e1289c85ed958f414ec673a535e48b1c056e221..597a3743f6a1896aedf1369afabeb11ebe632c6d 100644 (file)
@@ -110,7 +110,10 @@ static inline unsigned long __xchg_u32(volatile int * m, unsigned int val)
                "       move    %2, %z4                                 \n"
                "       .set    mips3                                   \n"
                "       sc      %2, %1                                  \n"
-               "       beqz    %2, 1b                                  \n"
+               "       beqz    %2, 2f                                  \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "       .previous                                       \n"
                "       .set    mips0                                   \n"
                : "=&r" (retval), "=m" (*m), "=&r" (dummy)
                : "R" (*m), "Jr" (val)
@@ -155,7 +158,10 @@ static inline __u64 __xchg_u64(volatile __u64 * m, __u64 val)
                "1:     lld     %0, %3                  # xchg_u64      \n"
                "       move    %2, %z4                                 \n"
                "       scd     %2, %1                                  \n"
-               "       beqz    %2, 1b                                  \n"
+               "       beqz    %2, 2f                                  \n"
+               "       .subsection 2                                   \n"
+               "2:     b       1b                                      \n"
+               "       .previous                                       \n"
                "       .set    mips0                                   \n"
                : "=&r" (retval), "=m" (*m), "=&r" (dummy)
                : "R" (*m), "Jr" (val)
@@ -232,8 +238,11 @@ static inline unsigned long __cmpxchg_u32(volatile int * m, unsigned long old,
                "       move    $1, %z4                                 \n"
                "       .set    mips3                                   \n"
                "       sc      $1, %1                                  \n"
-               "       beqz    $1, 1b                                  \n"
+               "       beqz    $1, 3f                                  \n"
                "2:                                                     \n"
+               "       .subsection 2                                   \n"
+               "3:     b       1b                                      \n"
+               "       .previous                                       \n"
                "       .set    pop                                     \n"
                : "=&r" (retval), "=R" (*m)
                : "R" (*m), "Jr" (old), "Jr" (new)
@@ -283,8 +292,11 @@ static inline unsigned long __cmpxchg_u64(volatile int * m, unsigned long old,
                "       bne     %0, %z3, 2f                             \n"
                "       move    $1, %z4                                 \n"
                "       scd     $1, %1                                  \n"
-               "       beqz    $1, 1b                                  \n"
+               "       beqz    $1, 3f                                  \n"
                "2:                                                     \n"
+               "       .subsection 2                                   \n"
+               "3:     b       1b                                      \n"
+               "       .previous                                       \n"
                "       .set    pop                                     \n"
                : "=&r" (retval), "=R" (*m)
                : "R" (*m), "Jr" (old), "Jr" (new)
index 4906204d34fe75edbf6dbfb8d71cf9a5fc000166..2ce07f4be369f3637de4e438fa3e274125feeff0 100644 (file)
@@ -87,24 +87,6 @@ struct termio {
 #define TIOCM_OUT2     0x4000
 #define TIOCM_LOOP     0x8000
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6               /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved fo Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IrDa - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14      /* synchronous PPP */
-#define N_HCI          15      /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 
 #include <linux/string.h>
index c12ebc53ef317f4ac6bcd146736b65bde0f4243f..3eff8d8fe28a1fff10417fba1518a5d63fac9d48 100644 (file)
@@ -265,12 +265,14 @@ do {                                                                      \
  */
 #define __get_user_asm_ll32(val, addr)                                 \
 {                                                                      \
-        unsigned long long __gu_tmp;                                   \
+       union {                                                         \
+               unsigned long long      l;                              \
+               __typeof__(*(addr))     t;                              \
+       } __gu_tmp;                                                     \
                                                                        \
        __asm__ __volatile__(                                           \
        "1:     lw      %1, (%3)                                \n"     \
        "2:     lw      %D1, 4(%3)                              \n"     \
-       "       move    %0, $0                                  \n"     \
        "3:     .section        .fixup,\"ax\"                   \n"     \
        "4:     li      %0, %4                                  \n"     \
        "       move    %1, $0                                  \n"     \
@@ -281,9 +283,10 @@ do {                                                                       \
        "       " __UA_ADDR "   1b, 4b                          \n"     \
        "       " __UA_ADDR "   2b, 4b                          \n"     \
        "       .previous                                       \n"     \
-       : "=r" (__gu_err), "=&r" (__gu_tmp)                             \
+       : "=r" (__gu_err), "=&r" (__gu_tmp.l)                           \
        : "0" (0), "r" (addr), "i" (-EFAULT));                          \
-       (val) = (__typeof__(*(addr))) __gu_tmp;                         \
+                                                                       \
+       (val) = __gu_tmp.t;                                             \
 }
 
 /*
index 0ef15ee0f17ef8e21eaaf394838ed3cd5e965bb3..defe752cc996011164ee1600bd04e67441561fed 100644 (file)
@@ -55,7 +55,6 @@
 #define MADV_64M_PAGES  26              /* Use 64 Megabyte pages */
 
 /* compatibility flags */
-#define MAP_ANON       MAP_ANONYMOUS
 #define MAP_FILE       0
 #define MAP_VARIABLE   0
 
index 6965e8f6c3e162ae653bed05d4a17ab97923b27b..5345b34204759d2dc257df39005757537fd4787a 100644 (file)
@@ -39,24 +39,6 @@ struct termio {
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IR - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 
 /*     intr=^C         quit=^\         erase=del       kill=^U
index 703970fb0ec0d5d7bdf6b715c2becb7bbf7bd5f3..4869513b872f44244f0ee3e4aaa820c4312847ce 100644 (file)
@@ -23,6 +23,7 @@ header-y += linkage.h
 header-y += resource.h
 header-y += sigcontext.h
 header-y += statfs.h
+header-y += ps3fb.h
 
 unifdef-y += a.out.h
 unifdef-y += asm-compat.h
index e8c2ebd3dddac8998c92547c7f08e18302af6fa0..35b95773746c7c80c049ed9743a86ce3f6c06676 100644 (file)
 #define CBE_PM_CTR_POLARITY                0x01000000
 #define CBE_PM_CTR_COUNT_CYCLES            0x00800000
 #define CBE_PM_CTR_ENABLE                  0x00400000
+#define PM07_CTR_INPUT_MUX(x)              (((x) & 0x3F) << 26)
+#define PM07_CTR_INPUT_CONTROL(x)          (((x) & 1) << 25)
+#define PM07_CTR_POLARITY(x)               (((x) & 1) << 24)
+#define PM07_CTR_COUNT_CYCLES(x)           (((x) & 1) << 23)
+#define PM07_CTR_ENABLE(x)                 (((x) & 1) << 22)
 
 /* Macros for the pm_status register. */
 #define CBE_PM_CTR_OVERFLOW_INTR(ctr)      (1 << (31 - ((ctr) & 7)))
@@ -89,8 +94,7 @@ extern void cbe_read_trace_buffer(u32 cpu, u64 *buf);
 
 extern void cbe_enable_pm_interrupts(u32 cpu, u32 thread, u32 mask);
 extern void cbe_disable_pm_interrupts(u32 cpu);
-extern u32  cbe_query_pm_interrupts(u32 cpu);
-extern u32  cbe_clear_pm_interrupts(u32 cpu);
+extern u32  cbe_get_and_clear_pm_interrupts(u32 cpu);
 extern void cbe_sync_irq(int node);
 
 /* Utility functions, macros */
@@ -103,11 +107,4 @@ extern u32 cbe_get_hw_thread_id(int cpu);
 #define CBE_COUNT_PROBLEM_MODE          2
 #define CBE_COUNT_ALL_MODES             3
 
-/* Macros for the pm07_control registers. */
-#define PM07_CTR_INPUT_MUX(x)                    (((x) & 0x3F) << 26)
-#define PM07_CTR_INPUT_CONTROL(x)                (((x) & 1) << 25)
-#define PM07_CTR_POLARITY(x)                     (((x) & 1) << 24)
-#define PM07_CTR_COUNT_CYCLES(x)                 (((x) & 1) << 23)
-#define PM07_CTR_ENABLE(x)                       (((x) & 1) << 22)
-
 #endif /* __ASM_CELL_PMU_H__ */
index fd242a22331c622ad141cf1bb4adc098f6b7add3..a0f14eea1da5b7fb7d213e6be8a7abcc1083d138 100644 (file)
 #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_free_dma()           free_dma(FLOPPY_DMA)
+#define fd_disable_dma()        fd_ops->_disable_dma(FLOPPY_DMA)
+#define fd_free_dma()           fd_ops->_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_get_dma_residue()    fd_ops->_get_dma_residue(FLOPPY_DMA)
 #define fd_enable_irq()         enable_irq(FLOPPY_IRQ)
 #define fd_disable_irq()        disable_irq(FLOPPY_IRQ)
 #define fd_cacheflush(addr,size) /* nothing */
-#define fd_request_irq()        request_irq(FLOPPY_IRQ, floppy_interrupt, \
-                                           IRQF_DISABLED, "floppy", NULL)
 #define fd_free_irq()           free_irq(FLOPPY_IRQ, NULL);
 
-#ifdef CONFIG_PCI
-
 #include <linux/pci.h>
 #include <asm/ppc-pci.h>       /* for ppc64_isabridge_dev */
 
-#define fd_dma_setup(addr,size,mode,io) powerpc_fd_dma_setup(addr,size,mode,io)
+#define fd_dma_setup(addr,size,mode,io) fd_ops->_dma_setup(addr,size,mode,io)
+
+static int fd_request_dma(void);
+
+struct fd_dma_ops {
+       void (*_disable_dma)(unsigned int dmanr);
+       void (*_free_dma)(unsigned int dmanr);
+       int (*_get_dma_residue)(unsigned int dummy);
+       int (*_dma_setup)(char *addr, unsigned long size, int mode, int io);
+};
+
+static int virtual_dma_count;
+static int virtual_dma_residue;
+static char *virtual_dma_addr;
+static int virtual_dma_mode;
+static int doing_vdma;
+static struct fd_dma_ops *fd_ops;
+
+static irqreturn_t floppy_hardint(int irq, void *dev_id)
+{
+       unsigned char st;
+       int lcount;
+       char *lptr;
+
+       if (!doing_vdma)
+               return floppy_interrupt(irq, dev_id);
+
+
+       st = 1;
+       for (lcount=virtual_dma_count, lptr=virtual_dma_addr;
+            lcount; lcount--, lptr++) {
+               st=inb(virtual_dma_port+4) & 0xa0 ;
+               if (st != 0xa0)
+                       break;
+               if (virtual_dma_mode)
+                       outb_p(*lptr, virtual_dma_port+5);
+               else
+                       *lptr = inb_p(virtual_dma_port+5);
+       }
+       virtual_dma_count = lcount;
+       virtual_dma_addr = lptr;
+       st = inb(virtual_dma_port+4);
+
+       if (st == 0x20)
+               return IRQ_HANDLED;
+       if (!(st & 0x20)) {
+               virtual_dma_residue += virtual_dma_count;
+               virtual_dma_count=0;
+               doing_vdma = 0;
+               floppy_interrupt(irq, dev_id);
+               return IRQ_HANDLED;
+       }
+       return IRQ_HANDLED;
+}
 
-static __inline__ int powerpc_fd_dma_setup(char *addr, unsigned long size,
-                                          int mode, int io)
+static void vdma_disable_dma(unsigned int dummy)
+{
+       doing_vdma = 0;
+       virtual_dma_residue += virtual_dma_count;
+       virtual_dma_count=0;
+}
+
+static void vdma_nop(unsigned int dummy)
+{
+}
+
+
+static int vdma_get_dma_residue(unsigned int dummy)
+{
+       return virtual_dma_count + virtual_dma_residue;
+}
+
+
+static int fd_request_irq(void)
+{
+       if (can_use_virtual_dma)
+               return request_irq(FLOPPY_IRQ, floppy_hardint,
+                                  IRQF_DISABLED, "floppy", NULL);
+       else
+               return request_irq(FLOPPY_IRQ, floppy_interrupt,
+                                  IRQF_DISABLED, "floppy", NULL);
+}
+
+static int vdma_dma_setup(char *addr, unsigned long size, int mode, int io)
+{
+       doing_vdma = 1;
+       virtual_dma_port = io;
+       virtual_dma_mode = (mode  == DMA_MODE_WRITE);
+       virtual_dma_addr = addr;
+       virtual_dma_count = size;
+       virtual_dma_residue = 0;
+       return 0;
+}
+
+static int hard_dma_setup(char *addr, unsigned long size, int mode, int io)
 {
        static unsigned long prev_size;
        static dma_addr_t bus_addr = 0;
@@ -46,6 +133,7 @@ static __inline__ int powerpc_fd_dma_setup(char *addr, unsigned long size,
        static int prev_dir;
        int dir;
 
+       doing_vdma = 0;
        dir = (mode == DMA_MODE_READ) ? PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE;
 
        if (bus_addr 
@@ -74,11 +162,32 @@ static __inline__ int powerpc_fd_dma_setup(char *addr, unsigned long size,
        return 0;
 }
 
-#endif /* CONFIG_PCI */
+static struct fd_dma_ops real_dma_ops =
+{
+       ._disable_dma = disable_dma,
+       ._free_dma = free_dma,
+       ._get_dma_residue = get_dma_residue,
+       ._dma_setup = hard_dma_setup
+};
+
+static struct fd_dma_ops virt_dma_ops =
+{
+       ._disable_dma = vdma_disable_dma,
+       ._free_dma = vdma_nop,
+       ._get_dma_residue = vdma_get_dma_residue,
+       ._dma_setup = vdma_dma_setup
+};
 
-__inline__ void virtual_dma_init(void)
+static int fd_request_dma()
 {
-       /* Nothing to do on PowerPC */
+       if (can_use_virtual_dma & 1) {
+               fd_ops = &virt_dma_ops;
+               return 0;
+       }
+       else {
+               fd_ops = &real_dma_ops;
+               return request_dma(FLOPPY_DMA, "floppy");
+       }
 }
 
 static int FDC1 = 0x3f0;
index 4f5a1e01fdace5454a9bfa78e369f3592b61ff90..e5982ad465763b2052e55f20d20b5b135e284f17 100644 (file)
@@ -388,4 +388,13 @@ struct ps3_vuart_port_device {
 
 int ps3_vuart_port_device_register(struct ps3_vuart_port_device *dev);
 
+struct ps3_prealloc {
+    const char *name;
+    void *address;
+    unsigned long size;
+    unsigned long align;
+};
+
+extern struct ps3_prealloc ps3fb_videomemory;
+
 #endif
diff --git a/include/asm-powerpc/ps3av.h b/include/asm-powerpc/ps3av.h
new file mode 100644 (file)
index 0000000..43e90ea
--- /dev/null
@@ -0,0 +1,738 @@
+/*
+ * Copyright (C) 2006 Sony Computer Entertainment Inc.
+ * Copyright 2006, 2007 Sony 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; version 2 of the License.
+ *
+ * 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 _ASM_POWERPC_PS3AV_H_
+#define _ASM_POWERPC_PS3AV_H_
+
+#include <linux/mutex.h>
+
+/** command for ioctl() **/
+#define PS3AV_VERSION 0x205    /* version of ps3av command */
+
+#define PS3AV_CID_AV_INIT              0x00000001
+#define PS3AV_CID_AV_FIN               0x00000002
+#define PS3AV_CID_AV_GET_HW_CONF       0x00000003
+#define PS3AV_CID_AV_GET_MONITOR_INFO  0x00000004
+#define PS3AV_CID_AV_ENABLE_EVENT      0x00000006
+#define PS3AV_CID_AV_DISABLE_EVENT     0x00000007
+#define PS3AV_CID_AV_TV_MUTE           0x0000000a
+
+#define PS3AV_CID_AV_VIDEO_CS          0x00010001
+#define PS3AV_CID_AV_VIDEO_MUTE        0x00010002
+#define PS3AV_CID_AV_VIDEO_DISABLE_SIG 0x00010003
+#define PS3AV_CID_AV_AUDIO_PARAM       0x00020001
+#define PS3AV_CID_AV_AUDIO_MUTE        0x00020002
+#define PS3AV_CID_AV_HDMI_MODE         0x00040001
+
+#define PS3AV_CID_VIDEO_INIT           0x01000001
+#define PS3AV_CID_VIDEO_MODE           0x01000002
+#define PS3AV_CID_VIDEO_FORMAT         0x01000004
+#define PS3AV_CID_VIDEO_PITCH          0x01000005
+
+#define PS3AV_CID_AUDIO_INIT           0x02000001
+#define PS3AV_CID_AUDIO_MODE           0x02000002
+#define PS3AV_CID_AUDIO_MUTE           0x02000003
+#define PS3AV_CID_AUDIO_ACTIVE         0x02000004
+#define PS3AV_CID_AUDIO_INACTIVE       0x02000005
+#define PS3AV_CID_AUDIO_SPDIF_BIT      0x02000006
+#define PS3AV_CID_AUDIO_CTRL           0x02000007
+
+#define PS3AV_CID_EVENT_UNPLUGGED      0x10000001
+#define PS3AV_CID_EVENT_PLUGGED        0x10000002
+#define PS3AV_CID_EVENT_HDCP_DONE      0x10000003
+#define PS3AV_CID_EVENT_HDCP_FAIL      0x10000004
+#define PS3AV_CID_EVENT_HDCP_AUTH      0x10000005
+#define PS3AV_CID_EVENT_HDCP_ERROR     0x10000006
+
+#define PS3AV_CID_AVB_PARAM            0x04000001
+
+/* max backend ports */
+#define PS3AV_HDMI_MAX                 2       /* HDMI_0 HDMI_1 */
+#define PS3AV_AVMULTI_MAX              1       /* AVMULTI_0 */
+#define PS3AV_AV_PORT_MAX              (PS3AV_HDMI_MAX + PS3AV_AVMULTI_MAX)
+#define PS3AV_OPT_PORT_MAX             1       /* SPDIF0 */
+#define PS3AV_HEAD_MAX                 2       /* HEAD_A HEAD_B */
+
+/* num of pkt for PS3AV_CID_AVB_PARAM */
+#define PS3AV_AVB_NUM_VIDEO            PS3AV_HEAD_MAX
+#define PS3AV_AVB_NUM_AUDIO            0       /* not supported */
+#define PS3AV_AVB_NUM_AV_VIDEO         PS3AV_AV_PORT_MAX
+#define PS3AV_AVB_NUM_AV_AUDIO         PS3AV_HDMI_MAX
+
+#define PS3AV_MUTE_PORT_MAX            1       /* num of ports in mute pkt */
+
+/* event_bit */
+#define PS3AV_CMD_EVENT_BIT_UNPLUGGED                  (1 << 0)
+#define PS3AV_CMD_EVENT_BIT_PLUGGED                    (1 << 1)
+#define PS3AV_CMD_EVENT_BIT_HDCP_DONE                  (1 << 2)
+#define PS3AV_CMD_EVENT_BIT_HDCP_FAIL                  (1 << 3)
+#define PS3AV_CMD_EVENT_BIT_HDCP_REAUTH                        (1 << 4)
+#define PS3AV_CMD_EVENT_BIT_HDCP_TOPOLOGY              (1 << 5)
+
+/* common params */
+/* mute */
+#define PS3AV_CMD_MUTE_OFF                             0x0000
+#define PS3AV_CMD_MUTE_ON                              0x0001
+/* avport */
+#define PS3AV_CMD_AVPORT_HDMI_0                                0x0000
+#define PS3AV_CMD_AVPORT_HDMI_1                                0x0001
+#define PS3AV_CMD_AVPORT_AVMULTI_0                     0x0010
+#define PS3AV_CMD_AVPORT_SPDIF_0                       0x0020
+#define PS3AV_CMD_AVPORT_SPDIF_1                       0x0021
+
+/* for av backend */
+/* av_mclk */
+#define PS3AV_CMD_AV_MCLK_128                          0x0000
+#define PS3AV_CMD_AV_MCLK_256                          0x0001
+#define PS3AV_CMD_AV_MCLK_512                          0x0003
+/* av_inputlen */
+#define PS3AV_CMD_AV_INPUTLEN_16                       0x02
+#define PS3AV_CMD_AV_INPUTLEN_20                       0x0a
+#define PS3AV_CMD_AV_INPUTLEN_24                       0x0b
+/* alayout */
+#define PS3AV_CMD_AV_LAYOUT_32                         (1 << 0)
+#define PS3AV_CMD_AV_LAYOUT_44                         (1 << 1)
+#define PS3AV_CMD_AV_LAYOUT_48                         (1 << 2)
+#define PS3AV_CMD_AV_LAYOUT_88                         (1 << 3)
+#define PS3AV_CMD_AV_LAYOUT_96                         (1 << 4)
+#define PS3AV_CMD_AV_LAYOUT_176                                (1 << 5)
+#define PS3AV_CMD_AV_LAYOUT_192                                (1 << 6)
+/* hdmi_mode */
+#define PS3AV_CMD_AV_HDMI_MODE_NORMAL                  0xff
+#define PS3AV_CMD_AV_HDMI_HDCP_OFF                     0x01
+#define PS3AV_CMD_AV_HDMI_EDID_PASS                    0x80
+#define PS3AV_CMD_AV_HDMI_DVI                          0x40
+
+/* for video module */
+/* video_head */
+#define PS3AV_CMD_VIDEO_HEAD_A                         0x0000
+#define PS3AV_CMD_VIDEO_HEAD_B                         0x0001
+/* video_cs_out video_cs_in */
+#define PS3AV_CMD_VIDEO_CS_NONE                                0x0000
+#define PS3AV_CMD_VIDEO_CS_RGB_8                       0x0001
+#define PS3AV_CMD_VIDEO_CS_YUV444_8                    0x0002
+#define PS3AV_CMD_VIDEO_CS_YUV422_8                    0x0003
+#define PS3AV_CMD_VIDEO_CS_XVYCC_8                     0x0004
+#define PS3AV_CMD_VIDEO_CS_RGB_10                      0x0005
+#define PS3AV_CMD_VIDEO_CS_YUV444_10                   0x0006
+#define PS3AV_CMD_VIDEO_CS_YUV422_10                   0x0007
+#define PS3AV_CMD_VIDEO_CS_XVYCC_10                    0x0008
+#define PS3AV_CMD_VIDEO_CS_RGB_12                      0x0009
+#define PS3AV_CMD_VIDEO_CS_YUV444_12                   0x000a
+#define PS3AV_CMD_VIDEO_CS_YUV422_12                   0x000b
+#define PS3AV_CMD_VIDEO_CS_XVYCC_12                    0x000c
+/* video_vid */
+#define PS3AV_CMD_VIDEO_VID_NONE                       0x0000
+#define PS3AV_CMD_VIDEO_VID_480I                       0x0001
+#define PS3AV_CMD_VIDEO_VID_576I                       0x0003
+#define PS3AV_CMD_VIDEO_VID_480P                       0x0005
+#define PS3AV_CMD_VIDEO_VID_576P                       0x0006
+#define PS3AV_CMD_VIDEO_VID_1080I_60HZ                 0x0007
+#define PS3AV_CMD_VIDEO_VID_1080I_50HZ                 0x0008
+#define PS3AV_CMD_VIDEO_VID_720P_60HZ                  0x0009
+#define PS3AV_CMD_VIDEO_VID_720P_50HZ                  0x000a
+#define PS3AV_CMD_VIDEO_VID_1080P_60HZ                 0x000b
+#define PS3AV_CMD_VIDEO_VID_1080P_50HZ                 0x000c
+#define PS3AV_CMD_VIDEO_VID_WXGA                       0x000d
+#define PS3AV_CMD_VIDEO_VID_SXGA                       0x000e
+#define PS3AV_CMD_VIDEO_VID_WUXGA                      0x000f
+#define PS3AV_CMD_VIDEO_VID_480I_A                     0x0010
+/* video_format */
+#define PS3AV_CMD_VIDEO_FORMAT_BLACK                   0x0000
+#define PS3AV_CMD_VIDEO_FORMAT_ARGB_8BIT               0x0007
+/* video_order */
+#define PS3AV_CMD_VIDEO_ORDER_RGB                      0x0000
+#define PS3AV_CMD_VIDEO_ORDER_BGR                      0x0001
+/* video_fmt */
+#define PS3AV_CMD_VIDEO_FMT_X8R8G8B8                   0x0000
+/* video_out_format */
+#define PS3AV_CMD_VIDEO_OUT_FORMAT_RGB_12BIT           0x0000
+/* video_sync */
+#define PS3AV_CMD_VIDEO_SYNC_VSYNC                     0x0001
+#define PS3AV_CMD_VIDEO_SYNC_CSYNC                     0x0004
+#define PS3AV_CMD_VIDEO_SYNC_HSYNC                     0x0010
+
+/* for audio module */
+/* num_of_ch */
+#define PS3AV_CMD_AUDIO_NUM_OF_CH_2                    0x0000
+#define PS3AV_CMD_AUDIO_NUM_OF_CH_3                    0x0001
+#define PS3AV_CMD_AUDIO_NUM_OF_CH_4                    0x0002
+#define PS3AV_CMD_AUDIO_NUM_OF_CH_5                    0x0003
+#define PS3AV_CMD_AUDIO_NUM_OF_CH_6                    0x0004
+#define PS3AV_CMD_AUDIO_NUM_OF_CH_7                    0x0005
+#define PS3AV_CMD_AUDIO_NUM_OF_CH_8                    0x0006
+/* audio_fs */
+#define PS3AV_CMD_AUDIO_FS_32K                         0x0001
+#define PS3AV_CMD_AUDIO_FS_44K                         0x0002
+#define PS3AV_CMD_AUDIO_FS_48K                         0x0003
+#define PS3AV_CMD_AUDIO_FS_88K                         0x0004
+#define PS3AV_CMD_AUDIO_FS_96K                         0x0005
+#define PS3AV_CMD_AUDIO_FS_176K                                0x0006
+#define PS3AV_CMD_AUDIO_FS_192K                                0x0007
+/* audio_word_bits */
+#define PS3AV_CMD_AUDIO_WORD_BITS_16                   0x0001
+#define PS3AV_CMD_AUDIO_WORD_BITS_20                   0x0002
+#define PS3AV_CMD_AUDIO_WORD_BITS_24                   0x0003
+/* audio_format */
+#define PS3AV_CMD_AUDIO_FORMAT_PCM                     0x0001
+#define PS3AV_CMD_AUDIO_FORMAT_BITSTREAM               0x00ff
+/* audio_source */
+#define PS3AV_CMD_AUDIO_SOURCE_SERIAL                  0x0000
+#define PS3AV_CMD_AUDIO_SOURCE_SPDIF                   0x0001
+/* audio_swap */
+#define PS3AV_CMD_AUDIO_SWAP_0                         0x0000
+#define PS3AV_CMD_AUDIO_SWAP_1                         0x0000
+/* audio_map */
+#define PS3AV_CMD_AUDIO_MAP_OUTPUT_0                   0x0000
+#define PS3AV_CMD_AUDIO_MAP_OUTPUT_1                   0x0001
+#define PS3AV_CMD_AUDIO_MAP_OUTPUT_2                   0x0002
+#define PS3AV_CMD_AUDIO_MAP_OUTPUT_3                   0x0003
+/* audio_layout */
+#define PS3AV_CMD_AUDIO_LAYOUT_2CH                     0x0000
+#define PS3AV_CMD_AUDIO_LAYOUT_6CH                     0x000b  /* LREClr */
+#define PS3AV_CMD_AUDIO_LAYOUT_8CH                     0x001f  /* LREClrXY */
+/* audio_downmix */
+#define PS3AV_CMD_AUDIO_DOWNMIX_PERMITTED              0x0000
+#define PS3AV_CMD_AUDIO_DOWNMIX_PROHIBITED             0x0001
+
+/* audio_port */
+#define PS3AV_CMD_AUDIO_PORT_HDMI_0                    ( 1 << 0 )
+#define PS3AV_CMD_AUDIO_PORT_HDMI_1                    ( 1 << 1 )
+#define PS3AV_CMD_AUDIO_PORT_AVMULTI_0                 ( 1 << 10 )
+#define PS3AV_CMD_AUDIO_PORT_SPDIF_0                   ( 1 << 20 )
+#define PS3AV_CMD_AUDIO_PORT_SPDIF_1                   ( 1 << 21 )
+
+/* audio_ctrl_id */
+#define PS3AV_CMD_AUDIO_CTRL_ID_DAC_RESET              0x0000
+#define PS3AV_CMD_AUDIO_CTRL_ID_DAC_DE_EMPHASIS                0x0001
+#define PS3AV_CMD_AUDIO_CTRL_ID_AVCLK                  0x0002
+/* audio_ctrl_data[0] reset */
+#define PS3AV_CMD_AUDIO_CTRL_RESET_NEGATE              0x0000
+#define PS3AV_CMD_AUDIO_CTRL_RESET_ASSERT              0x0001
+/* audio_ctrl_data[0] de-emphasis */
+#define PS3AV_CMD_AUDIO_CTRL_DE_EMPHASIS_OFF           0x0000
+#define PS3AV_CMD_AUDIO_CTRL_DE_EMPHASIS_ON            0x0001
+/* audio_ctrl_data[0] avclk */
+#define PS3AV_CMD_AUDIO_CTRL_AVCLK_22                  0x0000
+#define PS3AV_CMD_AUDIO_CTRL_AVCLK_18                  0x0001
+
+/* av_vid */
+/* do not use these params directly, use vid_video2av */
+#define PS3AV_CMD_AV_VID_480I                          0x0000
+#define PS3AV_CMD_AV_VID_480P                          0x0001
+#define PS3AV_CMD_AV_VID_720P_60HZ                     0x0002
+#define PS3AV_CMD_AV_VID_1080I_60HZ                    0x0003
+#define PS3AV_CMD_AV_VID_1080P_60HZ                    0x0004
+#define PS3AV_CMD_AV_VID_576I                          0x0005
+#define PS3AV_CMD_AV_VID_576P                          0x0006
+#define PS3AV_CMD_AV_VID_720P_50HZ                     0x0007
+#define PS3AV_CMD_AV_VID_1080I_50HZ                    0x0008
+#define PS3AV_CMD_AV_VID_1080P_50HZ                    0x0009
+#define PS3AV_CMD_AV_VID_WXGA                          0x000a
+#define PS3AV_CMD_AV_VID_SXGA                          0x000b
+#define PS3AV_CMD_AV_VID_WUXGA                         0x000c
+/* av_cs_out av_cs_in */
+/* use cs_video2av() */
+#define PS3AV_CMD_AV_CS_RGB_8                          0x0000
+#define PS3AV_CMD_AV_CS_YUV444_8                       0x0001
+#define PS3AV_CMD_AV_CS_YUV422_8                       0x0002
+#define PS3AV_CMD_AV_CS_XVYCC_8                                0x0003
+#define PS3AV_CMD_AV_CS_RGB_10                         0x0004
+#define PS3AV_CMD_AV_CS_YUV444_10                      0x0005
+#define PS3AV_CMD_AV_CS_YUV422_10                      0x0006
+#define PS3AV_CMD_AV_CS_XVYCC_10                       0x0007
+#define PS3AV_CMD_AV_CS_RGB_12                         0x0008
+#define PS3AV_CMD_AV_CS_YUV444_12                      0x0009
+#define PS3AV_CMD_AV_CS_YUV422_12                      0x000a
+#define PS3AV_CMD_AV_CS_XVYCC_12                       0x000b
+#define PS3AV_CMD_AV_CS_8                              0x0000
+#define PS3AV_CMD_AV_CS_10                             0x0001
+#define PS3AV_CMD_AV_CS_12                             0x0002
+/* dither */
+#define PS3AV_CMD_AV_DITHER_OFF                                0x0000
+#define PS3AV_CMD_AV_DITHER_ON                         0x0001
+#define PS3AV_CMD_AV_DITHER_8BIT                       0x0000
+#define PS3AV_CMD_AV_DITHER_10BIT                      0x0002
+#define PS3AV_CMD_AV_DITHER_12BIT                      0x0004
+/* super_white */
+#define PS3AV_CMD_AV_SUPER_WHITE_OFF                   0x0000
+#define PS3AV_CMD_AV_SUPER_WHITE_ON                    0x0001
+/* aspect */
+#define PS3AV_CMD_AV_ASPECT_16_9                       0x0000
+#define PS3AV_CMD_AV_ASPECT_4_3                                0x0001
+/* video_cs_cnv() */
+#define PS3AV_CMD_VIDEO_CS_RGB                         0x0001
+#define PS3AV_CMD_VIDEO_CS_YUV422                      0x0002
+#define PS3AV_CMD_VIDEO_CS_YUV444                      0x0003
+
+/* for automode */
+#define PS3AV_RESBIT_720x480P                  0x0003  /* 0x0001 | 0x0002 */
+#define PS3AV_RESBIT_720x576P                  0x0003  /* 0x0001 | 0x0002 */
+#define PS3AV_RESBIT_1280x720P                 0x0004
+#define PS3AV_RESBIT_1920x1080I                        0x0008
+#define PS3AV_RESBIT_1920x1080P                        0x4000
+#define PS3AV_RES_MASK_60                      (PS3AV_RESBIT_720x480P \
+                                               | PS3AV_RESBIT_1280x720P \
+                                               | PS3AV_RESBIT_1920x1080I \
+                                               | PS3AV_RESBIT_1920x1080P)
+#define PS3AV_RES_MASK_50                      (PS3AV_RESBIT_720x576P \
+                                               | PS3AV_RESBIT_1280x720P \
+                                               | PS3AV_RESBIT_1920x1080I \
+                                               | PS3AV_RESBIT_1920x1080P)
+
+#define PS3AV_MONITOR_TYPE_HDMI                        1       /* HDMI */
+#define PS3AV_MONITOR_TYPE_DVI                 2       /* DVI */
+#define PS3AV_DEFAULT_HDMI_VID_REG_60          PS3AV_CMD_VIDEO_VID_480P
+#define PS3AV_DEFAULT_AVMULTI_VID_REG_60       PS3AV_CMD_VIDEO_VID_480I
+#define PS3AV_DEFAULT_HDMI_VID_REG_50          PS3AV_CMD_VIDEO_VID_576P
+#define PS3AV_DEFAULT_AVMULTI_VID_REG_50       PS3AV_CMD_VIDEO_VID_576I
+#define PS3AV_DEFAULT_DVI_VID                  PS3AV_CMD_VIDEO_VID_480P
+
+#define PS3AV_REGION_60                                0x01
+#define PS3AV_REGION_50                                0x02
+#define PS3AV_REGION_RGB                       0x10
+
+#define get_status(buf)                                (((__u32 *)buf)[2])
+#define PS3AV_HDR_SIZE                         4       /* version + size */
+
+/* for video mode */
+#define PS3AV_MODE_MASK                                0x000F
+#define PS3AV_MODE_HDCP_OFF                    0x1000  /* Retail PS3 product doesn't support this */
+#define PS3AV_MODE_DITHER                      0x0800
+#define PS3AV_MODE_FULL                                0x0080
+#define PS3AV_MODE_DVI                         0x0040
+#define PS3AV_MODE_RGB                         0x0020
+
+
+/** command packet structure **/
+struct ps3av_send_hdr {
+       u16 version;
+       u16 size;               /* size of command packet */
+       u32 cid;                /* command id */
+};
+
+struct ps3av_reply_hdr {
+       u16 version;
+       u16 size;
+       u32 cid;
+       u32 status;
+};
+
+/* backend: initialization */
+struct ps3av_pkt_av_init {
+       struct ps3av_send_hdr send_hdr;
+       u32 event_bit;
+};
+
+/* backend: finalize */
+struct ps3av_pkt_av_fin {
+       struct ps3av_send_hdr send_hdr;
+       /* recv */
+       u32 reserved;
+};
+
+/* backend: get port */
+struct ps3av_pkt_av_get_hw_conf {
+       struct ps3av_send_hdr send_hdr;
+       /* recv */
+       u32 status;
+       u16 num_of_hdmi;        /* out: number of hdmi */
+       u16 num_of_avmulti;     /* out: number of avmulti */
+       u16 num_of_spdif;       /* out: number of hdmi */
+       u16 reserved;
+};
+
+/* backend: get monitor info */
+struct ps3av_info_resolution {
+       u32 res_bits;
+       u32 native;
+};
+
+struct ps3av_info_cs {
+       u8 rgb;
+       u8 yuv444;
+       u8 yuv422;
+       u8 reserved;
+};
+
+struct ps3av_info_color {
+       u16 red_x;
+       u16 red_y;
+       u16 green_x;
+       u16 green_y;
+       u16 blue_x;
+       u16 blue_y;
+       u16 white_x;
+       u16 white_y;
+       u32 gamma;
+};
+
+struct ps3av_info_audio {
+       u8 type;
+       u8 max_num_of_ch;
+       u8 fs;
+       u8 sbit;
+};
+
+struct ps3av_info_monitor {
+       u8 avport;
+       u8 monitor_id[10];
+       u8 monitor_type;
+       u8 monitor_name[16];
+       struct ps3av_info_resolution res_60;
+       struct ps3av_info_resolution res_50;
+       struct ps3av_info_resolution res_other;
+       struct ps3av_info_resolution res_vesa;
+       struct ps3av_info_cs cs;
+       struct ps3av_info_color color;
+       u8 supported_ai;
+       u8 speaker_info;
+       u8 num_of_audio_block;
+       struct ps3av_info_audio audio[0];       /* 0 or more audio blocks */
+       u8 reserved[169];
+} __attribute__ ((packed));
+
+struct ps3av_pkt_av_get_monitor_info {
+       struct ps3av_send_hdr send_hdr;
+       u16 avport;             /* in: avport */
+       u16 reserved;
+       /* recv */
+       struct ps3av_info_monitor info; /* out: monitor info */
+};
+
+/* backend: enable/disable event */
+struct ps3av_pkt_av_event {
+       struct ps3av_send_hdr send_hdr;
+       u32 event_bit;          /* in */
+};
+
+/* backend: video cs param */
+struct ps3av_pkt_av_video_cs {
+       struct ps3av_send_hdr send_hdr;
+       u16 avport;             /* in: avport */
+       u16 av_vid;             /* in: video resolution */
+       u16 av_cs_out;          /* in: output color space */
+       u16 av_cs_in;           /* in: input color space */
+       u8 dither;              /* in: dither bit length */
+       u8 bitlen_out;          /* in: bit length */
+       u8 super_white;         /* in: super white */
+       u8 aspect;              /* in: aspect ratio */
+};
+
+/* backend: video mute */
+struct ps3av_av_mute {
+       u16 avport;             /* in: avport */
+       u16 mute;               /* in: mute on/off */
+};
+
+struct ps3av_pkt_av_video_mute {
+       struct ps3av_send_hdr send_hdr;
+       struct ps3av_av_mute mute[PS3AV_MUTE_PORT_MAX];
+};
+
+/* backend: video disable signal */
+struct ps3av_pkt_av_video_disable_sig {
+       struct ps3av_send_hdr send_hdr;
+       u16 avport;             /* in: avport */
+       u16 reserved;
+};
+
+/* backend: audio param */
+struct ps3av_audio_info_frame {
+       struct pb1_bit {
+               u8 ct:4;
+               u8 rsv:1;
+               u8 cc:3;
+       } pb1;
+       struct pb2_bit {
+               u8 rsv:3;
+               u8 sf:3;
+               u8 ss:2;
+       } pb2;
+       u8 pb3;
+       u8 pb4;
+       struct pb5_bit {
+               u8 dm:1;
+               u8 lsv:4;
+               u8 rsv:3;
+       } pb5;
+};
+
+struct ps3av_pkt_av_audio_param {
+       struct ps3av_send_hdr send_hdr;
+       u16 avport;             /* in: avport */
+       u16 reserved;
+       u8 mclk;                /* in: audio mclk */
+       u8 ns[3];               /* in: audio ns val */
+       u8 enable;              /* in: audio enable */
+       u8 swaplr;              /* in: audio swap */
+       u8 fifomap;             /* in: audio fifomap */
+       u8 inputctrl;           /* in: audio input ctrl */
+       u8 inputlen;            /* in: sample bit size */
+       u8 layout;              /* in: speaker layout param */
+       struct ps3av_audio_info_frame info;     /* in: info */
+       u8 chstat[5];           /* in: ch stat */
+};
+
+/* backend: audio_mute */
+struct ps3av_pkt_av_audio_mute {
+       struct ps3av_send_hdr send_hdr;
+       struct ps3av_av_mute mute[PS3AV_MUTE_PORT_MAX];
+};
+
+/* backend: hdmi_mode */
+struct ps3av_pkt_av_hdmi_mode {
+       struct ps3av_send_hdr send_hdr;
+       u8 mode;                /* in: hdmi_mode */
+       u8 reserved0;
+       u8 reserved1;
+       u8 reserved2;
+};
+
+/* backend: tv_mute */
+struct ps3av_pkt_av_tv_mute {
+       struct ps3av_send_hdr send_hdr;
+       u16 avport;             /* in: avport HDMI only */
+       u16 mute;               /* in: mute */
+};
+
+/* video: initialize */
+struct ps3av_pkt_video_init {
+       struct ps3av_send_hdr send_hdr;
+       /* recv */
+       u32 reserved;
+};
+
+/* video: mode setting */
+struct ps3av_pkt_video_mode {
+       struct ps3av_send_hdr send_hdr;
+       u32 video_head;         /* in: head */
+       u32 reserved;
+       u32 video_vid;          /* in: video resolution */
+       u16 reserved1;
+       u16 width;              /* in: width in pixel */
+       u16 reserved2;
+       u16 height;             /* in: height in pixel */
+       u32 pitch;              /* in: line size in byte */
+       u32 video_out_format;   /* in: out format */
+       u32 video_format;       /* in: input frame buffer format */
+       u8 reserved3;
+       u8 reserved4;
+       u16 video_order;        /* in: input RGB order */
+       u32 reserved5;
+};
+
+/* video: format */
+struct ps3av_pkt_video_format {
+       struct ps3av_send_hdr send_hdr;
+       u32 video_head;         /* in: head */
+       u32 video_format;       /* in: frame buffer format */
+       u16 reserved;
+       u16 video_order;        /* in: input RGB order */
+};
+
+/* video: pitch */
+struct ps3av_pkt_video_pitch {
+       u16 version;
+       u16 size;               /* size of command packet */
+       u32 cid;                /* command id */
+       u32 video_head;         /* in: head */
+       u32 pitch;              /* in: line size in byte */
+};
+
+/* audio: initialize */
+struct ps3av_pkt_audio_init {
+       struct ps3av_send_hdr send_hdr;
+       /* recv */
+       u32 reserved;
+};
+
+/* audio: mode setting */
+struct ps3av_pkt_audio_mode {
+       struct ps3av_send_hdr send_hdr;
+       u8 avport;              /* in: avport */
+       u8 reserved0[3];
+       u32 mask;               /* in: mask */
+       u32 audio_num_of_ch;    /* in: number of ch */
+       u32 audio_fs;           /* in: sampling freq */
+       u32 audio_word_bits;    /* in: sample bit size */
+       u32 audio_format;       /* in: audio output format */
+       u32 audio_source;       /* in: audio source */
+       u8 audio_enable[4];     /* in: audio enable */
+       u8 audio_swap[4];       /* in: audio swap */
+       u8 audio_map[4];        /* in: audio map */
+       u32 audio_layout;       /* in: speaker layout */
+       u32 audio_downmix;      /* in: audio downmix permission */
+       u32 audio_downmix_level;
+       u8 audio_cs_info[8];    /* in: IEC channel status */
+};
+
+/* audio: mute */
+struct ps3av_audio_mute {
+       u8 avport;              /* in: opt_port optical */
+       u8 reserved[3];
+       u32 mute;               /* in: mute */
+};
+
+struct ps3av_pkt_audio_mute {
+       struct ps3av_send_hdr send_hdr;
+       struct ps3av_audio_mute mute[PS3AV_OPT_PORT_MAX];
+};
+
+/* audio: active/inactive */
+struct ps3av_pkt_audio_active {
+       struct ps3av_send_hdr send_hdr;
+       u32 audio_port;         /* in: audio active/inactive port */
+};
+
+/* audio: SPDIF user bit */
+struct ps3av_pkt_audio_spdif_bit {
+       u16 version;
+       u16 size;               /* size of command packet */
+       u32 cid;                /* command id */
+       u8 avport;              /* in: avport SPDIF only */
+       u8 reserved[3];
+       u32 audio_port;         /* in: SPDIF only */
+       u32 spdif_bit_data[12]; /* in: user bit data */
+};
+
+/* audio: audio control */
+struct ps3av_pkt_audio_ctrl {
+       u16 version;
+       u16 size;               /* size of command packet */
+       u32 cid;                /* command id */
+       u32 audio_ctrl_id;      /* in: control id */
+       u32 audio_ctrl_data[4]; /* in: control data */
+};
+
+/* avb:param */
+#define PS3AV_PKT_AVB_PARAM_MAX_BUF_SIZE       \
+       (PS3AV_AVB_NUM_VIDEO*sizeof(struct ps3av_pkt_video_mode) + \
+        PS3AV_AVB_NUM_AUDIO*sizeof(struct ps3av_pkt_audio_mode) + \
+        PS3AV_AVB_NUM_AV_VIDEO*sizeof(struct ps3av_pkt_av_video_cs) + \
+        PS3AV_AVB_NUM_AV_AUDIO*sizeof(struct ps3av_pkt_av_audio_param))
+
+struct ps3av_pkt_avb_param {
+       struct ps3av_send_hdr send_hdr;
+       u16 num_of_video_pkt;
+       u16 num_of_audio_pkt;
+       u16 num_of_av_video_pkt;
+       u16 num_of_av_audio_pkt;
+       /*
+        * The actual buffer layout depends on the fields above:
+        *
+        * struct ps3av_pkt_video_mode video[num_of_video_pkt];
+        * struct ps3av_pkt_audio_mode audio[num_of_audio_pkt];
+        * struct ps3av_pkt_av_video_cs av_video[num_of_av_video_pkt];
+        * struct ps3av_pkt_av_audio_param av_audio[num_of_av_audio_pkt];
+        */
+       u8 buf[PS3AV_PKT_AVB_PARAM_MAX_BUF_SIZE];
+};
+
+struct ps3av {
+       int available;
+       struct semaphore sem;
+       struct semaphore ping;
+       struct semaphore pong;
+       struct mutex mutex;
+       int open_count;
+       struct ps3_vuart_port_device *dev;
+
+       int region;
+       struct ps3av_pkt_av_get_hw_conf av_hw_conf;
+       u32 av_port[PS3AV_AV_PORT_MAX + PS3AV_OPT_PORT_MAX];
+       u32 opt_port[PS3AV_OPT_PORT_MAX];
+       u32 head[PS3AV_HEAD_MAX];
+       u32 audio_port;
+       int ps3av_mode;
+       int ps3av_mode_old;
+};
+
+/** command status **/
+#define PS3AV_STATUS_SUCCESS                   0x0000  /* success */
+#define PS3AV_STATUS_RECEIVE_VUART_ERROR       0x0001  /* receive vuart error */
+#define PS3AV_STATUS_SYSCON_COMMUNICATE_FAIL   0x0002  /* syscon communication error */
+#define PS3AV_STATUS_INVALID_COMMAND           0x0003  /* obsolete invalid CID */
+#define PS3AV_STATUS_INVALID_PORT              0x0004  /* invalid port number */
+#define PS3AV_STATUS_INVALID_VID               0x0005  /* invalid video format */
+#define PS3AV_STATUS_INVALID_COLOR_SPACE       0x0006  /* invalid video colose space */
+#define PS3AV_STATUS_INVALID_FS                        0x0007  /* invalid audio sampling freq */
+#define PS3AV_STATUS_INVALID_AUDIO_CH          0x0008  /* invalid audio channel number */
+#define PS3AV_STATUS_UNSUPPORTED_VERSION       0x0009  /* version mismatch  */
+#define PS3AV_STATUS_INVALID_SAMPLE_SIZE       0x000a  /* invalid audio sample bit size */
+#define PS3AV_STATUS_FAILURE                   0x000b  /* other failures */
+#define PS3AV_STATUS_UNSUPPORTED_COMMAND       0x000c  /* unsupported cid */
+#define PS3AV_STATUS_BUFFER_OVERFLOW           0x000d  /* write buffer overflow */
+#define PS3AV_STATUS_INVALID_VIDEO_PARAM       0x000e  /* invalid video param */
+#define PS3AV_STATUS_NO_SEL                    0x000f  /* not exist selector */
+#define PS3AV_STATUS_INVALID_AV_PARAM          0x0010  /* invalid backend param */
+#define PS3AV_STATUS_INVALID_AUDIO_PARAM       0x0011  /* invalid audio param */
+#define PS3AV_STATUS_UNSUPPORTED_HDMI_MODE     0x0012  /* unsupported hdmi mode */
+#define PS3AV_STATUS_NO_SYNC_HEAD              0x0013  /* sync head failed */
+
+extern void ps3av_set_hdr(u32, u16, struct ps3av_send_hdr *);
+extern int ps3av_do_pkt(u32, u16, size_t, struct ps3av_send_hdr *);
+
+extern int ps3av_cmd_init(void);
+extern int ps3av_cmd_fin(void);
+extern int ps3av_cmd_av_video_mute(int, u32 *, u32);
+extern int ps3av_cmd_av_video_disable_sig(u32);
+extern int ps3av_cmd_av_tv_mute(u32, u32);
+extern int ps3av_cmd_enable_event(void);
+extern int ps3av_cmd_av_hdmi_mode(u8);
+extern u32 ps3av_cmd_set_av_video_cs(void *, u32, int, int, int, u32);
+extern u32 ps3av_cmd_set_video_mode(void *, u32, int, int, u32);
+extern int ps3av_cmd_video_format_black(u32, u32, u32);
+extern int ps3av_cmd_av_audio_mute(int, u32 *, u32);
+extern u32 ps3av_cmd_set_av_audio_param(void *, u32,
+                                       const struct ps3av_pkt_audio_mode *,
+                                       u32);
+extern void ps3av_cmd_set_audio_mode(struct ps3av_pkt_audio_mode *, u32, u32,
+                                    u32, u32, u32, u32);
+extern int ps3av_cmd_audio_mode(struct ps3av_pkt_audio_mode *);
+extern int ps3av_cmd_audio_mute(int, u32 *, u32);
+extern int ps3av_cmd_audio_active(int, u32);
+extern int ps3av_cmd_avb_param(struct ps3av_pkt_avb_param *, u32);
+extern int ps3av_cmd_av_get_hw_conf(struct ps3av_pkt_av_get_hw_conf *);
+#ifdef PS3AV_DEBUG
+extern void ps3av_cmd_av_hw_conf_dump(const struct ps3av_pkt_av_get_hw_conf *);
+extern void ps3av_cmd_av_monitor_info_dump(const struct ps3av_pkt_av_get_monitor_info *);
+#else
+static inline void ps3av_cmd_av_hw_conf_dump(const struct ps3av_pkt_av_get_hw_conf *hw_conf) {}
+static inline void ps3av_cmd_av_monitor_info_dump(const struct ps3av_pkt_av_get_monitor_info *monitor_info) {}
+#endif
+extern int ps3av_cmd_video_get_monitor_info(struct ps3av_pkt_av_get_monitor_info *,
+                                           u32);
+
+extern int ps3av_vuart_write(struct ps3_vuart_port_device *dev,
+                            const void *buf, unsigned long size);
+extern int ps3av_vuart_read(struct ps3_vuart_port_device *dev, void *buf,
+                           unsigned long size, int timeout);
+
+extern int ps3av_set_video_mode(u32, int);
+extern int ps3av_set_audio_mode(u32, u32, u32, u32, u32);
+extern int ps3av_set_mode(u32, int);
+extern int ps3av_get_mode(void);
+extern int ps3av_get_scanmode(int);
+extern int ps3av_get_refresh_rate(int);
+extern int ps3av_video_mode2res(u32, u32 *, u32 *);
+extern int ps3av_video_mute(int);
+extern int ps3av_audio_mute(int);
+extern int ps3av_dev_open(void);
+extern int ps3av_dev_close(void);
+
+#endif /* _ASM_POWERPC_PS3AV_H_ */
diff --git a/include/asm-powerpc/ps3fb.h b/include/asm-powerpc/ps3fb.h
new file mode 100644 (file)
index 0000000..ad81cf4
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2006 Sony Computer Entertainment Inc.
+ * Copyright 2006, 2007 Sony 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; version 2 of the License.
+ *
+ * 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 _ASM_POWERPC_PS3FB_H_
+#define _ASM_POWERPC_PS3FB_H_
+
+#include <linux/ioctl.h>
+
+/* ioctl */
+#define PS3FB_IOCTL_SETMODE       _IOW('r',  1, int) /* set video mode */
+#define PS3FB_IOCTL_GETMODE       _IOR('r',  2, int) /* get video mode */
+#define PS3FB_IOCTL_SCREENINFO    _IOR('r',  3, int) /* get screen info */
+#define PS3FB_IOCTL_ON            _IO('r', 4)        /* use IOCTL_FSEL */
+#define PS3FB_IOCTL_OFF           _IO('r', 5)        /* return to normal-flip */
+#define PS3FB_IOCTL_FSEL          _IOW('r', 6, int)  /* blit and flip request */
+
+#ifndef FBIO_WAITFORVSYNC
+#define FBIO_WAITFORVSYNC         _IOW('F', 0x20, __u32) /* wait for vsync */
+#endif
+
+struct ps3fb_ioctl_res {
+       __u32 xres; /* frame buffer x_size */
+       __u32 yres; /* frame buffer y_size */
+       __u32 xoff; /* margine x  */
+       __u32 yoff; /* margine y */
+       __u32 num_frames; /* num of frame buffers */
+};
+
+#ifdef __KERNEL__
+
+#ifdef CONFIG_FB_PS3
+extern void ps3fb_flip_ctl(int on);
+extern void ps3fb_cleanup(void);
+#else
+static inline void ps3fb_flip_ctl(int on) {}
+static inline void ps3fb_cleanup(void) {}
+#endif
+
+#endif /* __KERNEL__ */
+
+#endif /* _ASM_POWERPC_PS3FB_H_ */
index b634e16575f2e5586f9e42ecf22dac4dd987ced5..0f9f2dd24a79a651771796536c7a97340c087ae5 100644 (file)
@@ -129,7 +129,6 @@ struct spu {
        struct spu_runqueue *rq;
        unsigned long long timestamp;
        pid_t pid;
-       int prio;
        int class_0_pending;
        spinlock_t register_lock;
 
index 97b4354841774c1b8700252800b49154fcb47723..418e5c7e972cda46d21f686496c3b4bfcbc75f9b 100644 (file)
@@ -305,3 +305,4 @@ SYSCALL_SPU(faccessat)
 COMPAT_SYS_SPU(get_robust_list)
 COMPAT_SYS_SPU(set_robust_list)
 COMPAT_SYS(move_pages)
+SYSCALL_SPU(getcpu)
index 7f80a019b6a00310b572d3c57d5a955148b41e06..2c14fea07c8aa92ae9bc320553103dac8d255e67 100644 (file)
@@ -71,24 +71,6 @@ struct termio {
 #define _VEOL2 8
 #define _VSWTC 9
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IrDa - http://www.cs.uit.no/~dagb/irda/irda.html */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 /*                   ^C  ^\ del  ^U  ^D   1   0   0   0   0  ^W  ^R  ^Z  ^Q  ^S  ^V  ^U  */
 #define INIT_C_CC "\003\034\177\025\004\001\000\000\000\000\027\022\032\021\023\026\025" 
index ca93bc99237e6e9182bfa3ea4e4879d3f07b85fe..1babad99c719ba908919f97389479b248585fd8e 100644 (file)
@@ -150,7 +150,7 @@ struct ucc_slow_info {
        int ucc_num;
        enum qe_clock rx_clock;
        enum qe_clock tx_clock;
-       struct ucc_slow *us_regs;
+       struct ucc_slow *regs;
        int irq;
        u16 uccm_mask;
        int data_mem_part;
index 4cbc313aa02a10dedf3d0ae0503504bba8b37860..d03d8557f7069891cc06289024c15cb3bc09178d 100644 (file)
@@ -46,6 +46,7 @@ extern void __init udbg_init_iseries(void);
 extern void __init udbg_init_rtas_panel(void);
 extern void __init udbg_init_rtas_console(void);
 extern void __init udbg_init_debug_beat(void);
+extern void __init udbg_init_btext(void);
 
 #endif /* __KERNEL__ */
 #endif /* _ASM_POWERPC_UDBG_H */
index b9f9118b1607e667ebbc6df2f1145c18494180fe..26fc449bd9899cda5d760a0a5d63f8b112f7563b 100644 (file)
 
 #ifndef __ASSEMBLY__
 
-extern unsigned int vdso64_pages;
-extern unsigned int vdso32_pages;
-
 /* Offsets relative to thread->vdso_base */
 extern unsigned long vdso64_rt_sigtramp;
 extern unsigned long vdso32_sigtramp;
 extern unsigned long vdso32_rt_sigtramp;
 
-extern void vdso_init(void);
-
 #else /* __ASSEMBLY__ */
 
 #ifdef __VDSO64__
index 7a64ede53bb6fd7ec5efde9852b7619b2d96e96a..92fd02d7b17766604a6a74214e378a86ebb10f99 100644 (file)
@@ -109,6 +109,10 @@ void ppc4xx_init(unsigned long r3, unsigned long r4, unsigned long r5,
 #include <platforms/4xx/ocotea.h>
 #endif
 
+#if defined(CONFIG_TAISHAN)
+#include <platforms/4xx/taishan.h>
+#endif
+
 #ifndef __ASSEMBLY__
 #ifdef CONFIG_40x
 /*
index 58c70acffc73cc91dc24c8532a3d320ace6d9708..cfc81533b9ba195c447851e35eedf2214e26c312 100644 (file)
@@ -110,7 +110,9 @@ extern void ccw_driver_unregister (struct ccw_driver *driver);
 
 struct ccw1;
 
+extern int ccw_device_set_options_mask(struct ccw_device *, unsigned long);
 extern int ccw_device_set_options(struct ccw_device *, unsigned long);
+extern void ccw_device_clear_options(struct ccw_device *, unsigned long);
 
 /* Allow for i/o completion notification after primary interrupt status. */
 #define CCWDEV_EARLY_NOTIFICATION      0x0001
index a4c2d550dad4268e97836bda9ea6d6f48416cf8a..b7ff6afc3caa87fd5d92d4b238a77dd8efced069 100644 (file)
 
 #ifdef __KERNEL__
 
-#include <linux/vmalloc.h>
 #include <asm/page.h>
 
 #define IO_SPACE_LIMIT 0xffffffff
 
-#define __io_virt(x)            ((void *)(PAGE_OFFSET | (unsigned long)(x)))
-
 /*
  * Change virtual addresses to physical addresses and vv.
  * These are pretty trivial
@@ -38,75 +35,9 @@ static inline unsigned long virt_to_phys(volatile void * address)
 
 static inline void * phys_to_virt(unsigned long address)
 {
-        return __io_virt(address);
-}
-
-extern void * __ioremap(unsigned long offset, unsigned long size, unsigned long flags);
-
-static inline void * ioremap (unsigned long offset, unsigned long size)
-{
-        return __ioremap(offset, size, 0);
-}
-
-/*
- * This one maps high address device memory and turns off caching for that area.
- * it's useful if some control registers are in such an area and write combining
- * or read caching is not desirable:
- */
-static inline void * ioremap_nocache (unsigned long offset, unsigned long size)
-{
-        return __ioremap(offset, size, 0);
+       return (void *) address;
 }
 
-extern void iounmap(void *addr);
-
-/*
- * IO bus memory addresses are also 1:1 with the physical address
- */
-#define virt_to_bus virt_to_phys
-#define bus_to_virt phys_to_virt
-
-/*
- * readX/writeX() are used to access memory mapped devices. On some
- * architectures the memory mapped IO stuff needs to be accessed
- * differently.
- */
-
-#define readb(addr) (*(volatile unsigned char *) __io_virt(addr))
-#define readw(addr) (*(volatile unsigned short *) __io_virt(addr))
-#define readl(addr) (*(volatile unsigned int *) __io_virt(addr))
-#define readq(addr) (*(volatile unsigned long long *) __io_virt(addr))
-
-#define readb_relaxed(addr) readb(addr)
-#define readw_relaxed(addr) readw(addr)
-#define readl_relaxed(addr) readl(addr)
-#define readq_relaxed(addr) readq(addr)
-#define __raw_readb readb
-#define __raw_readw readw
-#define __raw_readl readl
-#define __raw_readq readq
-
-#define writeb(b,addr) (*(volatile unsigned char *) __io_virt(addr) = (b))
-#define writew(b,addr) (*(volatile unsigned short *) __io_virt(addr) = (b))
-#define writel(b,addr) (*(volatile unsigned int *) __io_virt(addr) = (b))
-#define writeq(b,addr) (*(volatile unsigned long long *) __io_virt(addr) = (b))
-#define __raw_writeb writeb
-#define __raw_writew writew
-#define __raw_writel writel
-#define __raw_writeq writeq
-
-#define memset_io(a,b,c)        memset(__io_virt(a),(b),(c))
-#define memcpy_fromio(a,b,c)    memcpy((a),__io_virt(b),(c))
-#define memcpy_toio(a,b,c)      memcpy(__io_virt(a),(b),(c))
-
-#define inb_p(addr) readb(addr)
-#define inb(addr) readb(addr)
-
-#define outb(x,addr) ((void) writeb(x,addr))
-#define outb_p(x,addr) outb(x,addr)
-
-#define mmiowb()       do { } while (0)
-
 /*
  * Convert a physical pointer to a virtual kernel pointer for /dev/mem
  * access
index 62b23caf370e09e7c70da9af92a10c373c7e1ed4..a3480e25eb4b3ff2af0f388227d924c8326ba1d6 100644 (file)
@@ -47,24 +47,6 @@ struct termio {
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IR - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14      /* synchronous PPP */
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 
 /*     intr=^C         quit=^\         erase=del       kill=^U
index c68e1680da0173d5754d1a1df4944120a5239e58..76a8ccf254a50695c2eba48732112ad2fe90bc1e 100644 (file)
@@ -1 +1,3 @@
 include include/asm-generic/Kbuild.asm
+
+header-y += cpu-features.h
diff --git a/include/asm-sh/bigsur/bigsur.h b/include/asm-sh/bigsur/bigsur.h
deleted file mode 100644 (file)
index 427245f..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *
- * Hitachi Big Sur Eval Board support
- *
- * Dustin McIntire (dustin@sensoria.com)
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * Derived from Hitachi SH7751 reference manual
- * 
- */
-
-#ifndef _ASM_BIGSUR_H_
-#define _ASM_BIGSUR_H_
-
-#include <asm/irq.h>
-#include <asm/hd64465/hd64465.h>
-
-/* 7751 Internal IRQ's used by external CPLD controller */
-#define BIGSUR_IRQ_LOW 0
-#define BIGSUR_IRQ_NUM  14         /* External CPLD level 1 IRQs */
-#define BIGSUR_IRQ_HIGH (BIGSUR_IRQ_LOW + BIGSUR_IRQ_NUM)
-#define BIGSUR_2NDLVL_IRQ_LOW   (HD64465_IRQ_BASE+HD64465_IRQ_NUM)  
-#define BIGSUR_2NDLVL_IRQ_NUM   32 /* Level 2 IRQs = 4 regs * 8 bits */
-#define BIGSUR_2NDLVL_IRQ_HIGH  (BIGSUR_2NDLVL_IRQ_LOW + \
-                                 BIGSUR_2NDLVL_IRQ_NUM)
-
-/* PCI interrupt base number (A_INTA-A_INTD) */
-#define BIGSUR_SH7751_PCI_IRQ_BASE  (BIGSUR_2NDLVL_IRQ_LOW+10)  
-
-/* CPLD registers and external chip addresses */
-#define BIGSUR_HD64464_ADDR    0xB2000000
-#define BIGSUR_DGDR    0xB1FFFE00
-#define BIGSUR_BIDR    0xB1FFFD00
-#define BIGSUR_CSLR    0xB1FFFC00
-#define BIGSUR_SW1R    0xB1FFFB00
-#define BIGSUR_DBGR    0xB1FFFA00
-#define BIGSUR_BDTR    0xB1FFF900
-#define BIGSUR_BDRR    0xB1FFF800
-#define BIGSUR_PPR1    0xB1FFF700
-#define BIGSUR_PPR2    0xB1FFF600
-#define BIGSUR_IDE2    0xB1FFF500
-#define BIGSUR_IDE3    0xB1FFF400
-#define BIGSUR_SPCR    0xB1FFF300
-#define BIGSUR_ETHR    0xB1FE0000
-#define BIGSUR_PPDR    0xB1FDFF00
-#define BIGSUR_ICTL    0xB1FDFE00
-#define BIGSUR_ICMD    0xB1FDFD00
-#define BIGSUR_DMA0    0xB1FDFC00
-#define BIGSUR_DMA1    0xB1FDFB00
-#define BIGSUR_IRQ0    0xB1FDFA00
-#define BIGSUR_IRQ1    0xB1FDF900
-#define BIGSUR_IRQ2    0xB1FDF800
-#define BIGSUR_IRQ3    0xB1FDF700
-#define BIGSUR_IMR0    0xB1FDF600
-#define BIGSUR_IMR1    0xB1FDF500
-#define BIGSUR_IMR2    0xB1FDF400
-#define BIGSUR_IMR3    0xB1FDF300
-#define BIGSUR_IRLMR0  0xB1FDF200
-#define BIGSUR_IRLMR1  0xB1FDF100
-#define BIGSUR_V320USC_ADDR  0xB1000000
-#define BIGSUR_HD64465_ADDR  0xB0000000
-#define BIGSUR_INTERNAL_BASE 0xB0000000
-
-/* SMC ethernet card parameters */
-#define BIGSUR_ETHER_IOPORT            0x220
-
-/* IDE register paramters */
-#define BIGSUR_IDECMD_IOPORT   0x1f0
-#define BIGSUR_IDECTL_IOPORT   0x1f8
-
-/* LED bit position in BIGSUR_CSLR */
-#define BIGSUR_LED  (1<<4)
-
-/* PCI: default LOCAL memory window sizes (seen from PCI bus) */
-#define BIGSUR_LSR0_SIZE    (64*(1<<20)) //64MB
-#define BIGSUR_LSR1_SIZE    (64*(1<<20)) //64MB
-
-#endif /* _ASM_BIGSUR_H_ */
diff --git a/include/asm-sh/bigsur/io.h b/include/asm-sh/bigsur/io.h
deleted file mode 100644 (file)
index 1470ac8..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * include/asm-sh/bigsur/io.h
- *
- * By Dustin McIntire (dustin@sensoria.com) (c)2001
- * Derived from io_hd64465.h, which bore the message:
- * By Greg Banks <gbanks@pocketpenguins.com>
- * (c) 2000 PocketPenguins Inc. 
- * and from io_hd64461.h, which bore the message:
- * Copyright 2000 Stuart Menefy (stuart.menefy@st.com)
- *
- * May be copied or modified under the terms of the GNU General Public
- * License.  See linux/COPYING for more information.
- *
- * IO functions for a Hitachi Big Sur Evaluation Board.
- */
-
-#ifndef _ASM_SH_IO_BIGSUR_H
-#define _ASM_SH_IO_BIGSUR_H
-
-#include <linux/types.h>
-
-extern unsigned long bigsur_isa_port2addr(unsigned long offset);
-extern int bigsur_irq_demux(int irq);
-/* Provision for generic secondary demux step -- used by PCMCIA code */
-extern void bigsur_register_irq_demux(int irq,
-               int (*demux)(int irq, void *dev), void *dev);
-extern void bigsur_unregister_irq_demux(int irq);
-/* Set this variable to 1 to see port traffic */
-extern int bigsur_io_debug;
-/* Map a range of ports to a range of kernel virtual memory. */
-extern void bigsur_port_map(u32 baseport, u32 nports, u32 addr, u8 shift);
-extern void bigsur_port_unmap(u32 baseport, u32 nports);
-
-#endif /* _ASM_SH_IO_BIGSUR_H */
-
diff --git a/include/asm-sh/bigsur/serial.h b/include/asm-sh/bigsur/serial.h
deleted file mode 100644 (file)
index a08fa82..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * include/asm-sh/bigsur/serial.h
- *
- * Configuration details for Big Sur 16550 based serial ports 
- * i.e. HD64465, PCMCIA, etc.
- */
-
-#ifndef _ASM_SERIAL_BIGSUR_H
-#define _ASM_SERIAL_BIGSUR_H
-#include <asm/hd64465.h>
-
-#define BASE_BAUD (3379200 / 16)
-
-#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST)
-
-
-#define SERIAL_PORT_DFNS                   \
-        /* UART CLK   PORT IRQ     FLAGS        */                      \
-        { 0, BASE_BAUD, 0x3F8, HD64465_IRQ_UART, STD_COM_FLAGS } /* ttyS0 */ 
-
-/* XXX: This should be moved ino irq.h */
-#define irq_cannonicalize(x) (x)
-
-#endif /* _ASM_SERIAL_BIGSUR_H */
index a294997a84127b02e42174dcb670e17629ab1392..5a117ec43c77b165e31b29ac269697136b1f2a05 100644 (file)
@@ -19,9 +19,9 @@ static void __init check_bugs(void)
        extern unsigned long loops_per_jiffy;
        char *p = &init_utsname()->machine[2]; /* "sh" */
 
-       cpu_data->loops_per_jiffy = loops_per_jiffy;
+       current_cpu_data.loops_per_jiffy = loops_per_jiffy;
 
-       switch (cpu_data->type) {
+       switch (current_cpu_data.type) {
        case CPU_SH7604 ... CPU_SH7619:
                *p++ = '2';
                break;
@@ -54,7 +54,7 @@ static void __init check_bugs(void)
                break;
        }
 
-       printk("CPU: %s\n", get_cpu_subtype());
+       printk("CPU: %s\n", get_cpu_subtype(&current_cpu_data));
 
 #ifndef __LITTLE_ENDIAN__
        /* 'eb' means 'Endian Big' */
index 07f62ec9ff0c8b9309d223f0424b0926afb86f4b..22f12634975b7b350cca273601227cf38a6d0fc1 100644 (file)
@@ -30,5 +30,8 @@ extern void __flush_invalidate_region(void *start, int size);
 
 #define HAVE_ARCH_UNMAPPED_AREA
 
+/* Page flag for lazy dcache write-back for the aliasing UP caches */
+#define PG_dcache_dirty        PG_arch_1
+
 #endif /* __KERNEL__ */
 #endif /* __ASM_SH_CACHEFLUSH_H */
index f70d8ef76a15f6b3d980bb4e01eb36516b2bae86..6fabbba228de88ed9a64c7c279d955aa282a53bc 100644 (file)
@@ -36,8 +36,6 @@
  /* 32KB cache, 4kb PAGE sizes need to check bit 12 */
 #define CACHE_ALIAS 0x00001000
 
-#define PG_mapped      PG_arch_1
-
 void flush_cache_all(void);
 void flush_cache_mm(struct mm_struct *mm);
 #define flush_cache_dup_mm(mm) flush_cache_mm(mm)
index b01a10f312259e9f3e8bef29041a4d47c0f29b04..b3746a936a0966a868bd0a55a6be50e5ab7e3dac 100644 (file)
@@ -17,6 +17,7 @@
  *  so we need them.
  */
 void flush_cache_all(void);
+void flush_dcache_all(void);
 void flush_cache_mm(struct mm_struct *mm);
 #define flush_cache_dup_mm(mm) flush_cache_mm(mm)
 void flush_cache_range(struct vm_area_struct *vma, unsigned long start,
@@ -38,16 +39,4 @@ void flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
 /* Initialization of P3 area for copy_user_page */
 void p3_cache_init(void);
 
-#define PG_mapped      PG_arch_1
-
-#ifdef CONFIG_MMU
-extern int remap_area_pages(unsigned long addr, unsigned long phys_addr,
-                           unsigned long size, unsigned long flags);
-#else /* CONFIG_MMU */
-static inline int remap_area_pages(unsigned long addr, unsigned long phys_addr,
-                                  unsigned long size, unsigned long flags)
-{
-       return 0;
-}
-#endif /* CONFIG_MMU */
 #endif /* __ASM_CPU_SH4_CACHEFLUSH_H */
index 3e4b3e6d80c02fb81b8e03dd882eb10c11ca99ab..c135e9cebd9c0c9a74f0479c3e16c1cfd09c38e6 100644 (file)
@@ -3,6 +3,17 @@
 
 #define DMAOR_INIT     ( 0x8000 | DMAOR_DME )
 
+/* SH7751/7760/7780 DMA IRQ sources */
+#define DMTE0_IRQ      34
+#define DMTE1_IRQ      35
+#define DMTE2_IRQ      36
+#define DMTE3_IRQ      37
+#define DMTE4_IRQ      44
+#define DMTE5_IRQ      45
+#define DMTE6_IRQ      46
+#define DMTE7_IRQ      47
+#define DMAE_IRQ       38
+
 #ifdef CONFIG_CPU_SH4A
 #define SH_DMAC_BASE   0xfc808020
 
index 8d0867b98e05141ce77d5bb4f3837e3877e0c124..d3bc7818bbbea2e6631f781739266fb740d0bb7e 100644 (file)
@@ -53,6 +53,10 @@ static inline void dma_free_coherent(struct device *dev, size_t size,
        consistent_free(vaddr, size);
 }
 
+#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
+#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
+#define dma_is_consistent(d, h) (1)
+
 static inline void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
                                  enum dma_data_direction dir)
 {
diff --git a/include/asm-sh/ec3104/ec3104.h b/include/asm-sh/ec3104/ec3104.h
deleted file mode 100644 (file)
index 639cfa4..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef __ASM_EC3104_H
-#define __ASM_EC3104_H
-
-
-/*
- * Most of the register set is at 0xb0ec0000 - 0xb0ecffff.
- *
- * as far as I've figured it out the register map is:
- * 0xb0ec0000 - id string
- * 0xb0ec0XXX - power management
- * 0xb0ec1XXX - interrupt control
- * 0xb0ec3XXX - ps2 port (touch pad on aero 8000)
- * 0xb0ec6XXX - i2c
- * 0xb0ec7000 - first serial port (proprietary connector on aero 8000)
- * 0xb0ec8000 - second serial port
- * 0xb0ec9000 - third serial port
- * 0xb0eca000 - fourth serial port (keyboard controller on aero 8000)
- * 0xb0eccXXX - GPIO
- * 0xb0ecdXXX - GPIO
- */
-
-#define EC3104_BASE    0xb0ec0000
-
-#define EC3104_SER4_DATA       (EC3104_BASE+0xa000)
-#define EC3104_SER4_IIR                (EC3104_BASE+0xa008)
-#define EC3104_SER4_MCR                (EC3104_BASE+0xa010)
-#define EC3104_SER4_LSR                (EC3104_BASE+0xa014)
-#define EC3104_SER4_MSR                (EC3104_BASE+0xa018)
-
-/*
- * our ISA bus.  this seems to be real ISA.
- */
-#define EC3104_ISA_BASE        0xa5000000
-
-#define EC3104_IRQ     11
-#define EC3104_IRQBASE 64
-
-#define EC3104_IRQ_SER1        EC3104_IRQBASE + 7
-#define EC3104_IRQ_SER2        EC3104_IRQBASE + 8
-#define EC3104_IRQ_SER3        EC3104_IRQBASE + 9
-#define EC3104_IRQ_SER4        EC3104_IRQBASE + 10
-
-#endif /* __ASM_EC3104_H */
diff --git a/include/asm-sh/ec3104/io.h b/include/asm-sh/ec3104/io.h
deleted file mode 100644 (file)
index ea5c8e6..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef _ASM_SH_IO_EC3104_H
-#define _ASM_SH_IO_EC3104_H
-
-#include <linux/types.h>
-
-extern unsigned char ec3104_inb(unsigned long port);
-extern unsigned short ec3104_inw(unsigned long port);
-extern unsigned long ec3104_inl(unsigned long port);
-
-extern void ec3104_outb(unsigned char value, unsigned long port);
-extern void ec3104_outw(unsigned short value, unsigned long port);
-extern void ec3104_outl(unsigned long value, unsigned long port);
-
-extern int ec3104_irq_demux(int irq);
-
-#endif /* _ASM_SH_IO_EC3104_H */
diff --git a/include/asm-sh/ec3104/keyboard.h b/include/asm-sh/ec3104/keyboard.h
deleted file mode 100644 (file)
index c1253a6..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-extern unsigned char ec3104_kbd_sysrq_xlate[];
-extern int ec3104_kbd_setkeycode(unsigned int scancode, unsigned int keycode);
-extern int ec3104_kbd_getkeycode(unsigned int scancode);
-extern int ec3104_kbd_translate(unsigned char, unsigned char *, char);
-extern char ec3104_kbd_unexpected_up(unsigned char);
-extern void ec3104_kbd_leds(unsigned char);
-extern void ec3104_kbd_init_hw(void);
-
-#define kbd_sysrq_xlate ec3104_kbd_sysrq_xlate
-#define kbd_setkeycode ec3104_kbd_setkeycode
-#define kbd_getkeycode ec3104_kbd_getkeycode
-#define kbd_translate ec3104_kbd_translate
-#define kbd_unexpected_up ec3104_kbd_unexpected_up
-#define kbd_leds ec3104_kbd_leds
-#define kbd_init_hw ec3104_kbd_init_hw
diff --git a/include/asm-sh/ec3104/serial.h b/include/asm-sh/ec3104/serial.h
deleted file mode 100644 (file)
index cfe4d78..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <asm/ec3104.h>
-/* Naturally we don't know the exact value but 115200 baud has a divisor
- * of 9 and 19200 baud has a divisor of 52, so this seems like a good
- * guess.  */
-#define BASE_BAUD (16800000 / 16)
-
-#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST)
-
-/* there is a fourth serial port with the expected values as well, but
- * it's got the keyboard controller behind it so we can't really use it
- * (without moving the keyboard driver to userspace, which doesn't sound
- * like a very good idea) */
-#define SERIAL_PORT_DFNS                       \
-       /* UART CLK   PORT IRQ     FLAGS        */                      \
-       { 0, BASE_BAUD, 0x11C00, EC3104_IRQBASE+7, STD_COM_FLAGS }, /* ttyS0 */ \
-       { 0, BASE_BAUD, 0x12000, EC3104_IRQBASE+8, STD_COM_FLAGS }, /* ttyS1 */ \
-       { 0, BASE_BAUD, 0x12400, EC3104_IRQBASE+9, STD_COM_FLAGS }, /* ttyS2 */
-
-/* XXX: This should be moved ino irq.h */
-#define irq_cannonicalize(x) (x)
index bff965ef4b95201626d5056e26f4e00c97975292..8ccf7ae593efaf871b0d8e7ec04e2625ae91eb72 100644 (file)
 /* 3. OFFCHIP_NR_IRQS */
 #if defined(CONFIG_HD64461)
 # define OFFCHIP_NR_IRQS 18
-#elif defined (CONFIG_SH_BIGSUR) /* must be before CONFIG_HD64465 */
-# define OFFCHIP_NR_IRQS 48
 #elif defined(CONFIG_HD64465)
 # define OFFCHIP_NR_IRQS 16
-#elif defined (CONFIG_SH_EC3104)
-# define OFFCHIP_NR_IRQS 16
 #elif defined (CONFIG_SH_DREAMCAST)
 # define OFFCHIP_NR_IRQS 96
 #elif defined (CONFIG_SH_TITAN)
index 7b26f53fe343f5711f97bbecdec0dd563be36ba6..0095c665d2723ef4d38e34cc939bdd0f9972e312 100644 (file)
@@ -85,10 +85,10 @@ extern int     setjmp(jmp_buf __jmpb);
 #define KGDB_PRINTK(...) printk("KGDB: " __VA_ARGS__)
 
 /* Forced breakpoint */
-#define BREAKPOINT() do {                                     \
-  if (kgdb_enabled) {                                         \
-    asm volatile("trapa   #0xff");                            \
-  }                                                           \
+#define BREAKPOINT()                                   \
+do {                                                   \
+       if (kgdb_enabled)                               \
+               __asm__ __volatile__("trapa   #0x3c");  \
 } while (0)
 
 /* KGDB should be able to flush all kernel text space */
index cf47df79bb9415c43a310c16c3c93737ebc2c1d2..eb0358c097d01a3c236b83400e03aa2ac5b757b7 100644 (file)
@@ -1,25 +1,19 @@
 #ifndef __MMU_H
 #define __MMU_H
 
-#if !defined(CONFIG_MMU)
+/* Default "unsigned long" context */
+typedef unsigned long mm_context_id_t[NR_CPUS];
 
 typedef struct {
+#ifdef CONFIG_MMU
+       mm_context_id_t         id;
+       void                    *vdso;
+#else
        struct vm_list_struct   *vmlist;
        unsigned long           end_brk;
+#endif
 } mm_context_t;
 
-#else
-
-/* Default "unsigned long" context */
-typedef unsigned long mm_context_id_t;
-
-typedef struct {
-       mm_context_id_t id;
-       void *vdso;
-} mm_context_t;
-
-#endif /* CONFIG_MMU */
-
 /*
  * Privileged Space Mapping Buffer (PMB) definitions
  */
index 46f04e23bd45ae9133c90c811ec1808f7832a14c..342024425b7df7a484e32fadb8796f089dd111c9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 1999 Niibe Yutaka
- * Copyright (C) 2003 Paul Mundt
+ * Copyright (C) 2003 - 2006 Paul Mundt
  *
  * ASID handling idea taken from MIPS implementation.
  */
  *    (b) ASID (Address Space IDentifier)
  */
 
-/*
- * Cache of MMU context last used.
- */
-extern unsigned long mmu_context_cache;
-
 #define MMU_CONTEXT_ASID_MASK          0x000000ff
 #define MMU_CONTEXT_VERSION_MASK       0xffffff00
 #define MMU_CONTEXT_FIRST_VERSION      0x00000100
@@ -32,6 +27,11 @@ extern unsigned long mmu_context_cache;
 /* ASID is 8-bit value, so it can't be 0x100 */
 #define MMU_NO_ASID                    0x100
 
+#define cpu_context(cpu, mm)   ((mm)->context.id[cpu])
+#define cpu_asid(cpu, mm)      (cpu_context((cpu), (mm)) & \
+                                MMU_CONTEXT_ASID_MASK)
+#define asid_cache(cpu)                (cpu_data[cpu].asid_cache)
+
 /*
  * Virtual Page Number mask
  */
@@ -41,18 +41,17 @@ extern unsigned long mmu_context_cache;
 /*
  * Get MMU context if needed.
  */
-static inline void get_mmu_context(struct mm_struct *mm)
+static inline void get_mmu_context(struct mm_struct *mm, unsigned int cpu)
 {
-       unsigned long mc = mmu_context_cache;
+       unsigned long asid = asid_cache(cpu);
 
        /* Check if we have old version of context. */
-       if (((mm->context.id ^ mc) & MMU_CONTEXT_VERSION_MASK) == 0)
+       if (((cpu_context(cpu, mm) ^ asid) & MMU_CONTEXT_VERSION_MASK) == 0)
                /* It's up to date, do nothing */
                return;
 
        /* It's old, we need to get new context with new version. */
-       mc = ++mmu_context_cache;
-       if (!(mc & MMU_CONTEXT_ASID_MASK)) {
+       if (!(++asid & MMU_CONTEXT_ASID_MASK)) {
                /*
                 * We exhaust ASID of this version.
                 * Flush all TLB and start new cycle.
@@ -63,10 +62,11 @@ static inline void get_mmu_context(struct mm_struct *mm)
                 * Fix version; Note that we avoid version #0
                 * to distingush NO_CONTEXT.
                 */
-               if (!mc)
-                       mmu_context_cache = mc = MMU_CONTEXT_FIRST_VERSION;
+               if (!asid)
+                       asid = MMU_CONTEXT_FIRST_VERSION;
        }
-       mm->context.id = mc;
+
+       cpu_context(cpu, mm) = asid_cache(cpu) = asid;
 }
 
 /*
@@ -74,9 +74,13 @@ static inline void get_mmu_context(struct mm_struct *mm)
  * instance.
  */
 static inline int init_new_context(struct task_struct *tsk,
-                                      struct mm_struct *mm)
+                                  struct mm_struct *mm)
 {
-       mm->context.id = NO_CONTEXT;
+       int i;
+
+       for (i = 0; i < num_online_cpus(); i++)
+               cpu_context(i, mm) = NO_CONTEXT;
+
        return 0;
 }
 
@@ -117,10 +121,10 @@ static inline unsigned long get_asid(void)
  * After we have set current->mm to a new value, this activates
  * the context for the new mm so we see the new mappings.
  */
-static inline void activate_context(struct mm_struct *mm)
+static inline void activate_context(struct mm_struct *mm, unsigned int cpu)
 {
-       get_mmu_context(mm);
-       set_asid(mm->context.id & MMU_CONTEXT_ASID_MASK);
+       get_mmu_context(mm, cpu);
+       set_asid(cpu_asid(cpu, mm));
 }
 
 /* MMU_TTB is used for optimizing the fault handling. */
@@ -138,10 +142,15 @@ static inline void switch_mm(struct mm_struct *prev,
                             struct mm_struct *next,
                             struct task_struct *tsk)
 {
+       unsigned int cpu = smp_processor_id();
+
        if (likely(prev != next)) {
+               cpu_set(cpu, next->cpu_vm_mask);
                set_TTB(next->pgd);
-               activate_context(next);
-       }
+               activate_context(next, cpu);
+       } else
+               if (!cpu_test_and_set(cpu, next->cpu_vm_mask))
+                       activate_context(next, cpu);
 }
 
 #define deactivate_mm(tsk,mm)  do { } while (0)
@@ -159,7 +168,7 @@ enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
 #define destroy_context(mm)            do { } while (0)
 #define set_asid(asid)                 do { } while (0)
 #define get_asid()                     (0)
-#define activate_context(mm)           do { } while (0)
+#define activate_context(mm,cpu)       do { } while (0)
 #define switch_mm(prev,next,tsk)       do { } while (0)
 #define deactivate_mm(tsk,mm)          do { } while (0)
 #define activate_mm(prev,next)         do { } while (0)
@@ -174,14 +183,16 @@ enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
  */
 static inline void enable_mmu(void)
 {
+       unsigned int cpu = smp_processor_id();
+
        /* Enable MMU */
        ctrl_outl(MMU_CONTROL_INIT, MMUCR);
        ctrl_barrier();
 
-       if (mmu_context_cache == NO_CONTEXT)
-               mmu_context_cache = MMU_CONTEXT_FIRST_VERSION;
+       if (asid_cache(cpu) == NO_CONTEXT)
+               asid_cache(cpu) = MMU_CONTEXT_FIRST_VERSION;
 
-       set_asid(mmu_context_cache & MMU_CONTEXT_ASID_MASK);
+       set_asid(asid_cache(cpu) & MMU_CONTEXT_ASID_MASK);
 }
 
 static inline void disable_mmu(void)
index 380fd62dd05ade8ac5806711c985ee96f94adf93..ac4b4677f28c49e7cfbfd97e78c94ab141927a0b 100644 (file)
@@ -13,6 +13,8 @@
    [ P4 control   ]            0xE0000000
  */
 
+#ifdef __KERNEL__
+
 /* PAGE_SHIFT determines the page size */
 #if defined(CONFIG_PAGE_SIZE_4KB)
 # define PAGE_SHIFT    12
@@ -51,7 +53,6 @@
 #define HUGETLB_PAGE_ORDER     (HPAGE_SHIFT-PAGE_SHIFT)
 #endif
 
-#ifdef __KERNEL__
 #ifndef __ASSEMBLY__
 
 extern void (*clear_page)(void *to);
index 036ca28438661f781aa9d84af95652e9bd1de1c9..9214c015fe14a52e7c318f8ac79c78fcdd659286 100644 (file)
@@ -43,17 +43,17 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];
 /* PGD bits */
 #define PGDIR_SHIFT    (PTE_SHIFT + PTE_BITS)
 #define PGDIR_BITS     (32 - PGDIR_SHIFT)
-#define PGDIR_SIZE     (1 << PGDIR_SHIFT)
+#define PGDIR_SIZE     (1UL << PGDIR_SHIFT)
 #define PGDIR_MASK     (~(PGDIR_SIZE-1))
 
 /* Entries per level */
-#define PTRS_PER_PTE   (PAGE_SIZE / 4)
+#define PTRS_PER_PTE   (PAGE_SIZE / (1 << PTE_MAGNITUDE))
 #define PTRS_PER_PGD   (PAGE_SIZE / 4)
 
 #define USER_PTRS_PER_PGD      (TASK_SIZE/PGDIR_SIZE)
 #define FIRST_USER_ADDRESS     0
 
-#define PTE_PHYS_MASK  0x1ffff000
+#define PTE_PHYS_MASK          (0x20000000 - PAGE_SIZE)
 
 /*
  * First 1MB map is used by fixed purpose.
@@ -583,11 +583,6 @@ struct mm_struct;
 extern unsigned int kobjsize(const void *objp);
 #endif /* !CONFIG_MMU */
 
-#if defined(CONFIG_CPU_SH4) || defined(CONFIG_SH7705_CACHE_32KB)
-#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
-extern pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep);
-#endif
-
 extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
 extern void paging_init(void);
 
index e29f2abb92defc7f9d24a6d8d4f0b3a9be7d365e..3e46a7afe764110ba68e8da824596f0f5359abea 100644 (file)
@@ -27,8 +27,6 @@
 #define CCN_CVR                0xff000040
 #define CCN_PRR                0xff000044
 
-const char *get_cpu_subtype(void);
-
 /*
  *  CPU type and hardware bug flags. Kept separately for each CPU.
  *
@@ -66,6 +64,7 @@ enum cpu_type {
 struct sh_cpuinfo {
        unsigned int type;
        unsigned long loops_per_jiffy;
+       unsigned long asid_cache;
 
        struct cache_info icache;       /* Primary I-cache */
        struct cache_info dcache;       /* Primary D-cache */
@@ -288,5 +287,8 @@ extern int vsyscall_init(void);
 #define vsyscall_init() do { } while (0)
 #endif
 
+/* arch/sh/kernel/setup.c */
+const char *get_cpu_subtype(struct sh_cpuinfo *c);
+
 #endif /* __KERNEL__ */
 #endif /* __ASM_SH_PROCESSOR_H */
index 796b8fcb81a8984ce5d887e49840d3c0f5fd74d3..10565ac7966a4f7c5c43ccd534501f60ee3c9f1f 100644 (file)
 #define IRQ_PCISLOT2   10              /* PCI Slot #2 IRQ */
 #define        IRQ_EXTENTION   11              /* EXTn IRQ */
 
+/* arch/sh/boards/renesas/rts7751r2d/irq.c */
+void init_rts7751r2d_IRQ(void);
+int rts7751r2d_irq_demux(int);
+
 #define __IO_PREFIX rts7751r2d
 #include <asm/io_generic.h>
 
index 8734590d27e8c79c6fb7bb831b1b13c8d923bf5b..21f6d330f18955fb800453dbf721132bd2c52c87 100644 (file)
@@ -9,11 +9,6 @@
 
 #include <linux/kernel.h>
 
-#ifdef CONFIG_SH_EC3104
-#include <asm/serial-ec3104.h>
-#elif defined (CONFIG_SH_BIGSUR)
-#include <asm/serial-bigsur.h>
-#else
 /*
  * This assumes you have a 1.8432 MHz clock for your UART.
  *
 
 #else
 
-#define SERIAL_PORT_DFNS                       \
-       /* UART CLK   PORT IRQ     FLAGS        */                      \
-       { 0, BASE_BAUD, 0x3F8, 4, STD_COM_FLAGS },      /* ttyS0 */     \
-       { 0, BASE_BAUD, 0x2F8, 3, STD_COM_FLAGS }       /* ttyS1 */
+#define SERIAL_PORT_DFNS
 
 #endif
 
-#endif
 #endif /* _ASM_SERIAL_H */
index 44edfd471443cd2682630040e1a4645bca99a914..e7c8f86ef8902b9ca28fb76896b21059d99181f2 100644 (file)
@@ -39,24 +39,6 @@ struct termio {
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IR - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 
 /*     intr=^C         quit=^\         erase=del       kill=^U
index 879f741105dbd366ed1bbcfdec6570024ae47662..279e70a77c75350a8ce7fc24e5fe707e766d69d6 100644 (file)
@@ -32,12 +32,20 @@ struct thread_info {
 
 #define PREEMPT_ACTIVE         0x10000000
 
-#ifdef CONFIG_4KSTACKS
-#define THREAD_SIZE            (PAGE_SIZE)
+#if defined(CONFIG_4KSTACKS)
+#define THREAD_SIZE_ORDER      (0)
+#elif defined(CONFIG_PAGE_SIZE_4KB)
+#define THREAD_SIZE_ORDER      (1)
+#elif defined(CONFIG_PAGE_SIZE_8KB)
+#define THREAD_SIZE_ORDER      (1)
+#elif defined(CONFIG_PAGE_SIZE_64KB)
+#define THREAD_SIZE_ORDER      (0)
 #else
-#define THREAD_SIZE            (PAGE_SIZE * 2)
+#error "Unknown thread size"
 #endif
-#define STACK_WARN             (THREAD_SIZE / 8)
+
+#define THREAD_SIZE    (PAGE_SIZE << THREAD_SIZE_ORDER)
+#define STACK_WARN     (THREAD_SIZE >> 3)
 
 /*
  * macros/functions for gaining access to the thread information structure
index 28c073b0fbab3e593dd42eebef3594604fc53b9e..455fb8da441e6786abe3895c83faf73e633469a6 100644 (file)
@@ -4,7 +4,6 @@
 /*
  * TLB flushing:
  *
- *  - flush_tlb() flushes the current mm struct TLBs
  *  - flush_tlb_all() flushes all processes TLBs
  *  - flush_tlb_mm(mm) flushes the specified mm context TLB's
  *  - flush_tlb_page(vma, vmaddr) flushes one page
  *  - flush_tlb_kernel_range(start, end) flushes a range of kernel pages
  *  - flush_tlb_pgtables(mm, start, end) flushes a range of page tables
  */
+extern void local_flush_tlb_all(void);
+extern void local_flush_tlb_mm(struct mm_struct *mm);
+extern void local_flush_tlb_range(struct vm_area_struct *vma,
+                                 unsigned long start,
+                                 unsigned long end);
+extern void local_flush_tlb_page(struct vm_area_struct *vma,
+                                unsigned long page);
+extern void local_flush_tlb_kernel_range(unsigned long start,
+                                        unsigned long end);
+extern void local_flush_tlb_one(unsigned long asid, unsigned long page);
+
+#ifdef CONFIG_SMP
 
-extern void flush_tlb(void);
 extern void flush_tlb_all(void);
 extern void flush_tlb_mm(struct mm_struct *mm);
 extern void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
                            unsigned long end);
 extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long page);
-extern void __flush_tlb_page(unsigned long asid, unsigned long page);
+extern void flush_tlb_kernel_range(unsigned long start, unsigned long end);
+extern void flush_tlb_one(unsigned long asid, unsigned long page);
+
+#else
+
+#define flush_tlb_all()                        local_flush_tlb_all()
+#define flush_tlb_mm(mm)               local_flush_tlb_mm(mm)
+#define flush_tlb_page(vma, page)      local_flush_tlb_page(vma, page)
+#define flush_tlb_one(asid, page)      local_flush_tlb_one(asid, page)
+
+#define flush_tlb_range(vma, start, end)       \
+       local_flush_tlb_range(vma, start, end)
+
+#define flush_tlb_kernel_range(start, end)     \
+       local_flush_tlb_kernel_range(start, end)
+
+#endif /* CONFIG_SMP */
 
 static inline void flush_tlb_pgtables(struct mm_struct *mm,
                                      unsigned long start, unsigned long end)
-{ /* Nothing to do */
+{
+       /* Nothing to do */
 }
-
-extern void flush_tlb_kernel_range(unsigned long start, unsigned long end);
-
 #endif /* __ASM_SH_TLBFLUSH_H */
index 694f51f47941f551b8fef9e3c1fdc8ff99f7ee56..ae9bbdeefbe128035cee2cae9b28419436b814ff 100644 (file)
@@ -17,7 +17,7 @@
 /* User Break Controller */
 #if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) || \
     defined(CONFIG_CPU_SUBTYPE_SH7300)
-#define UBC_TYPE_SH7729        (cpu_data->type == CPU_SH7729)
+#define UBC_TYPE_SH7729        (current_cpu_data.type == CPU_SH7729)
 #else
 #define UBC_TYPE_SH7729        0
 #endif
index f982073dc6c68250b580b11c814a5d77afed72dc..17f527bfd455ec72fa369e056f32652138e9a1fb 100644 (file)
 #define __NR_mq_getsetattr      (__NR_mq_open+5)
 #define __NR_kexec_load                283
 #define __NR_waitid            284
-/* #define __NR_sys_setaltroot 285 */
-#define __NR_add_key           286
-#define __NR_request_key       287
-#define __NR_keyctl            288
-#define __NR_ioprio_set                289
-#define __NR_ioprio_get                290
-#define __NR_inotify_init      291
-#define __NR_inotify_add_watch 292
-#define __NR_inotify_rm_watch  293
+#define __NR_add_key           285
+#define __NR_request_key       286
+#define __NR_keyctl            287
+#define __NR_ioprio_set                288
+#define __NR_ioprio_get                289
+#define __NR_inotify_init      290
+#define __NR_inotify_add_watch 291
+#define __NR_inotify_rm_watch  292
+/* 293 is unused */
 #define __NR_migrate_pages     294
 #define __NR_openat            295
 #define __NR_mkdirat           296
 #define __NR_mknodat           297
 #define __NR_fchownat          298
 #define __NR_futimesat         299
-#define __NR_newfstatat                300
+#define __NR_fstatat64         300
 #define __NR_unlinkat          301
 #define __NR_renameat          302
 #define __NR_linkat            303
index 99b0807d1c9f4806c1c51f3c4448fce433704828..64c936b22715e89283213cf6b9058117b3fdc3a2 100644 (file)
 #define AC97C_READ                     (1 << 19)
 #define AC97C_WD_BIT                   (1 << 2)
 #define AC97C_INDEX_MASK               0x7f
-/* -------------------------------------------------------------------- */
+
+/* arch/sh/cchips/voyagergx/consistent.c */
+void *voyagergx_consistent_alloc(struct device *, size_t, dma_addr_t *, gfp_t);
+int voyagergx_consistent_free(struct device *, size_t, void *, dma_addr_t);
 
 #endif /* _VOYAGER_GX_REG_H */
index 4a9c7fb411bc02b9d4bdb1abfcbaa592fa59f7cd..dc44e6ed3a7ccb55c1285b5979b716710945ca80 100644 (file)
@@ -50,24 +50,6 @@ struct termio {
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IR - http://www.cs.uit.no/~dagb/irda/irda.html */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14
-#define N_HCI          15      /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 
 /*     intr=^C         quit=^\         erase=del       kill=^U
index cab0b851b8b11164e8504313526603ffafaf410b..c23e74a0eaa8d4021c101a6bb4c3a5922ddfb4b2 100644 (file)
@@ -256,6 +256,35 @@ extern void iounmap(volatile void __iomem *addr);
 #define iowrite16(val,X)               writew(val,X)
 #define iowrite32(val,X)               writel(val,X)
 
+static inline void ioread8_rep(void __iomem *port, void *buf, unsigned long count)
+{
+       insb((unsigned long __force)port, buf, count);
+}
+static inline void ioread16_rep(void __iomem *port, void *buf, unsigned long count)
+{
+       insw((unsigned long __force)port, buf, count);
+}
+
+static inline void ioread32_rep(void __iomem *port, void *buf, unsigned long count)
+{
+       insl((unsigned long __force)port, buf, count);
+}
+
+static inline void iowrite8_rep(void __iomem *port, const void *buf, unsigned long count)
+{
+       outsb((unsigned long __force)port, buf, count);
+}
+
+static inline void iowrite16_rep(void __iomem *port, const void *buf, unsigned long count)
+{
+       outsw((unsigned long __force)port, buf, count);
+}
+
+static inline void iowrite32_rep(void __iomem *port, const void *buf, unsigned long count)
+{
+       outsl((unsigned long __force)port, buf, count);
+}
+
 /* Create a virtual mapping cookie for an IO port range */
 extern void __iomem *ioport_map(unsigned long port, unsigned int nr);
 extern void ioport_unmap(void __iomem *);
index d05f83c809893c404a9fc897fdf5164fbac6fbc9..d767f206ab33317988868a41a804d68054760019 100644 (file)
@@ -45,24 +45,6 @@ struct winsize {
        unsigned short ws_ypixel;
 };
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IrDa - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14      /* synchronous PPP */
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 #include <linux/module.h>
 
index 905e59b4a737537bbfe835b5512aaadcdf0c6f4a..5d233b42fe135b87b51d9c2f3e1339554ce8e7f5 100644 (file)
@@ -46,6 +46,10 @@ extern void irq_install_pre_handler(int virt_irq,
 #define irq_canonicalize(irq)  (irq)
 extern unsigned int build_irq(int inofixup, unsigned long iclr, unsigned long imap);
 extern unsigned int sun4v_build_irq(u32 devhandle, unsigned int devino);
+extern unsigned int sun4v_build_msi(u32 devhandle, unsigned int *virt_irq_p,
+                                   unsigned int msi_devino_start,
+                                   unsigned int msi_devino_end);
+extern void sun4v_destroy_msi(unsigned int virt_irq);
 extern unsigned int sbus_build_irq(void *sbus, unsigned int ino);
 
 static __inline__ void set_softint(unsigned long bits)
index dcfa7629358c396c9e977447ee24f56b31cd799e..7a246d8a1828b7f98cea9d9b10ff21e9e862c485 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/pci.h>
 #include <linux/ioport.h>
 #include <linux/spinlock.h>
+#include <linux/msi.h>
 
 #include <asm/io.h>
 #include <asm/page.h>
@@ -177,6 +178,24 @@ struct pci_pbm_info {
        int                             is_66mhz_capable;
        int                             all_devs_66mhz;
 
+#ifdef CONFIG_PCI_MSI
+       /* MSI info.  */
+       u32                             msiq_num;
+       u32                             msiq_ent_count;
+       u32                             msiq_first;
+       u32                             msiq_first_devino;
+       u32                             msi_num;
+       u32                             msi_first;
+       u32                             msi_data_mask;
+       u32                             msix_data_width;
+       u64                             msi32_start;
+       u64                             msi64_start;
+       u32                             msi32_len;
+       u32                             msi64_len;
+       void                            *msi_queues;
+       unsigned long                   *msi_bitmap;
+#endif /* !(CONFIG_PCI_MSI) */
+
        /* This PBM's streaming buffer. */
        struct pci_strbuf               stc;
 
@@ -213,6 +232,12 @@ struct pci_controller_info {
        void (*base_address_update)(struct pci_dev *, int);
        void (*resource_adjust)(struct pci_dev *, struct resource *, struct resource *);
 
+#ifdef CONFIG_PCI_MSI
+       int (*setup_msi_irq)(unsigned int *virt_irq_p, struct pci_dev *pdev,
+                            struct msi_desc *entry);
+       void (*teardown_msi_irq)(unsigned int virt_irq, struct pci_dev *pdev);
+#endif
+
        /* Now things for the actual PCI bus probes. */
        struct pci_ops                  *pci_ops;
        unsigned int                    pci_first_busno;
@@ -231,6 +256,9 @@ struct pcidev_cookie {
        int num_prom_regs;
        struct linux_prom_pci_registers prom_assignments[PROMREG_MAX];
        int num_prom_assignments;
+#ifdef CONFIG_PCI_MSI
+       unsigned int                    msi_num;
+#endif
 };
 
 /* Currently these are the same across all PCI controllers
index b356ee2cda92ffe028005aaedb8328e129f0c17a..5053df3cec400182b322ac805f0527aa53529742 100644 (file)
@@ -5,6 +5,6 @@
 #ifndef _SPARC64_SETUP_H
 #define _SPARC64_SETUP_H
 
-#define COMMAND_LINE_SIZE      256
+#define COMMAND_LINE_SIZE      2048
 
 #endif /* _SPARC64_SETUP_H */
index ee26a071c67776074f9386249c8b3af040370077..f05d390993d5d4c953727a240577e28e6649efa2 100644 (file)
@@ -45,24 +45,6 @@ struct winsize {
        unsigned short ws_ypixel;
 };
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IrDa - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14      /* synchronous PPP */
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 #include <linux/module.h>
 
index 99711134e477a2bae4a4ddb9c80961363b458f19..d3b90b7ac3e9820921272b12642f193803b142f5 100644 (file)
@@ -11,7 +11,7 @@ extern long elf_aux_hwcap;
 
 #define elf_check_arch(x) (1)
 
-#ifdef CONFIG_64_BIT
+#ifdef CONFIG_64BIT
 #define ELF_CLASS ELFCLASS64
 #else
 #define ELF_CLASS ELFCLASS32
index 10609af376c0339af5f22bafe48c918a2103a34f..31c2d4d685bd7692677db195bb4738642dea8459 100644 (file)
@@ -13,6 +13,7 @@
 struct arch_thread {
         unsigned long debugregs[8];
         int debugregs_seq;
+        unsigned long fs;
         struct faultinfo faultinfo;
 };
 
@@ -25,8 +26,9 @@ extern inline void rep_nop(void)
 #define cpu_relax()   rep_nop()
 
 #define INIT_ARCH_THREAD { .debugregs                  = { [ 0 ... 7 ] = 0 }, \
-                           .debugregs_seq      = 0, \
-                           .faultinfo          = { 0, 0, 0 } }
+                           .debugregs_seq      = 0,                           \
+                          .fs                  = 0, \
+                          .faultinfo           = { 0, 0, 0 } }
 
 static inline void arch_flush_thread(struct arch_thread *thread)
 {
index 03b4af4ac09a3c82509e93dc835ee84bb7f7d111..bf61d17de3f72d776a2f5ba3e6e1017c6884101d 100644 (file)
@@ -81,9 +81,10 @@ static inline void arch_switch_to_tt(struct task_struct *from,
 {
 }
 
-static inline void arch_switch_to_skas(struct task_struct *from,
-                                       struct task_struct *to)
-{
-}
+extern void arch_switch_to_skas(struct task_struct *from,
+                               struct task_struct *to);
+
+extern long arch_prctl_skas(struct task_struct *task, int code,
+                           unsigned long __user *addr);
 
 #endif
index 79e97b59806e1720cbd49e93b757fa3bfb9654d6..c2c2b1d5877618f49ce3b6a2829c340fa1e2b7a4 100644 (file)
@@ -39,24 +39,6 @@ struct termio {
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IR - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14      /* synchronous PPP */
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 
 /*     intr=^C         quit=^\         erase=del       kill=^U
index 8da9609070f471eaac12ae7269c4479eca459b1e..d4dbbe5f7bd9f466451e0ee65572b6accf929277 100644 (file)
@@ -7,7 +7,7 @@
 
 #include <asm/alternative.h>
 
-#if __GNUC__ < 4 || __GNUC_MINOR__ < 1
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1)
 /* Technically wrong, but this avoids compilation errors on some gcc
    versions. */
 #define ADDR "=m" (*(volatile long *) addr)
index b829f7b534be8d856cea11e8545339912f914b7b..7b1c3ad155fd6c3cb219555c832a9b4211efe66a 100644 (file)
@@ -31,7 +31,7 @@ extern char x86_boot_params[BOOT_PARAM_SIZE];
 #define EDD_MBR_SIG_NR (*(unsigned char *) (PARAM+EDD_MBR_SIG_NR_BUF))
 #define EDD_MBR_SIGNATURE ((unsigned int *) (PARAM+EDD_MBR_SIG_BUF))
 #define EDD_BUF     ((struct edd_info *) (PARAM+EDDBUF))
-#define COMMAND_LINE saved_command_line
+#define COMMAND_LINE boot_command_line
 
 #define RAMDISK_IMAGE_START_MASK       0x07FF
 #define RAMDISK_PROMPT_FLAG            0x8000
index 49dbab09ef2b05ac113aebd464631be17a572ea4..d2af227f06d025c7cccc56cfffc9f4f1501583e9 100644 (file)
@@ -66,6 +66,9 @@ static inline int dma_mapping_error(dma_addr_t dma_addr)
 #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
 #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
 
+#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
+#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
+
 extern void *dma_alloc_coherent(struct device *dev, size_t size,
                                dma_addr_t *dma_handle, gfp_t gfp);
 extern void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
index fa2086774105500f5ac2d7a5f8e1a6bbef219d38..6216fa3f28026b943dedaccb717c8e7edb871edb 100644 (file)
@@ -46,6 +46,7 @@ extern void e820_mark_nosave_regions(void);
 extern void e820_print_map(char *who);
 extern int e820_any_mapped(unsigned long start, unsigned long end, unsigned type);
 extern int e820_all_mapped(unsigned long start, unsigned long end, unsigned type);
+extern unsigned long e820_hole_size(unsigned long start, unsigned long end);
 
 extern void e820_setup_gap(void);
 extern void e820_register_active_regions(int nid,
@@ -56,6 +57,7 @@ extern void finish_e820_parsing(void);
 extern struct e820map e820;
 
 extern unsigned ebda_addr, ebda_size;
+extern unsigned long nodemap_addr, nodemap_size;
 #endif/*!__ASSEMBLY__*/
 
 #endif/*__E820_HEADER*/
index b39098408b6926a744b0929d46b04e7e446a6a1a..59a66f084611c676be7306d1b458b6e678b492da 100644 (file)
 extern int is_hpet_enabled(void);
 extern int hpet_rtc_timer_init(void);
 extern int apic_is_clustered_box(void);
+extern int hpet_arch_init(void);
+extern int hpet_timer_stop_set_go(unsigned long tick);
+extern int hpet_reenable(void);
+extern unsigned int hpet_calibrate_tsc(void);
 
 extern int hpet_use_timer;
+extern unsigned long hpet_address;
+extern unsigned long hpet_period;
+extern unsigned long hpet_tick;
 
 #ifdef CONFIG_HPET_EMULATE_RTC
 extern int hpet_mask_rtc_irq_bit(unsigned long bit_mask);
index 179cce755aa75656380f7f4e9005cebd46010742..552df5f10a6d462026eb10414766efd42a76a347 100644 (file)
@@ -91,7 +91,7 @@ extern void enable_8259A_irq(unsigned int irq);
 extern int i8259A_irq_pending(unsigned int irq);
 extern void make_8259A_irq(unsigned int irq);
 extern void init_8259A(int aeoi);
-extern void FASTCALL(send_IPI_self(int vector));
+extern void send_IPI_self(int vector);
 extern void init_VISWS_APIC_irqs(void);
 extern void setup_IO_APIC(void);
 extern void disable_IO_APIC(void);
index f5d84bb7c9488c3281cc6e386bbc67e97abdd16f..de2cd9a2303a92922a9dea817cd127841bf32765 100644 (file)
@@ -100,7 +100,7 @@ __OUTS(l)
 
 #define IO_SPACE_LIMIT 0xffff
 
-#if defined(__KERNEL__) && __x86_64__
+#if defined(__KERNEL__) && defined(__x86_64__)
 
 #include <linux/vmalloc.h>
 
index 561ecbfd4cb5604bce14e7ed2fc51848dbcae244..f4fb238c89f14212f84b51a9258fc5960a69a46d 100644 (file)
@@ -85,18 +85,8 @@ struct IO_APIC_route_entry {
                mask            :  1,   /* 0: enabled, 1: disabled */
                __reserved_2    : 15;
 
-       union {         struct { __u32
-                                       __reserved_1    : 24,
-                                       physical_dest   :  4,
-                                       __reserved_2    :  4;
-                       } physical;
-
-                       struct { __u32
-                                       __reserved_1    : 24,
-                                       logical_dest    :  8;
-                       } logical;
-       } dest;
-
+       __u32   __reserved_3    : 24,
+               dest            :  8;
 } __attribute__ ((packed));
 
 /*
index 5a11146d6d9cc753f6eb82face2fb15aba39c9c6..177e92b4019beba32d3eef9b645cba0c66c8cd41 100644 (file)
@@ -103,6 +103,8 @@ void mce_log_therm_throt_event(unsigned int cpu, __u64 status);
 
 extern atomic_t mce_entry;
 
+extern void do_machine_check(struct pt_regs *, long);
+
 #endif
 
 #endif
index c38ebdf6f426ad41ddfc19fc8df42553eae4b5a6..fb558fb1d21106f17e738ee1400e322397d72890 100644 (file)
 
 #include <asm/smp.h>
 
-/* Should really switch to dynamic allocation at some point */
-#define NODEMAPSIZE 0x4fff
-
 /* Simple perfect hash to map physical addresses to node numbers */
 struct memnode {
        int shift;
-       u8 map[NODEMAPSIZE];
-} ____cacheline_aligned;
+       unsigned int mapsize;
+       u8 *map;
+       u8 embedded_map[64-16];
+} ____cacheline_aligned; /* total size = 64 bytes */
 extern struct memnode memnode;
 #define memnode_shift memnode.shift
 #define memnodemap memnode.map
+#define memnodemapsize memnode.mapsize
 
 extern struct pglist_data *node_data[];
 
 static inline __attribute__((pure)) int phys_to_nid(unsigned long addr) 
 { 
        unsigned nid; 
-       VIRTUAL_BUG_ON((addr >> memnode_shift) >= NODEMAPSIZE);
+       VIRTUAL_BUG_ON(!memnodemap);
+       VIRTUAL_BUG_ON((addr >> memnode_shift) >= memnodemapsize);
        nid = memnodemap[addr >> memnode_shift]; 
        VIRTUAL_BUG_ON(nid >= MAX_NUMNODES || !node_data[nid]); 
        return nid; 
@@ -46,5 +47,10 @@ static inline __attribute__((pure)) int phys_to_nid(unsigned long addr)
 extern int pfn_valid(unsigned long pfn);
 #endif
 
+#ifdef CONFIG_NUMA_EMU
+#define FAKE_NODE_MIN_SIZE     (64*1024*1024)
+#define FAKE_NODE_MIN_HASH_MASK        (~(FAKE_NODE_MIN_SIZE - 1ul))
+#endif
+
 #endif
 #endif
index 16396b1de3e44e2068021f446d8b56f3b6f79448..6c2949a3c677bad80981fd593acb8d7da0e9cf10 100644 (file)
@@ -21,7 +21,7 @@ do {                                                                  \
        unsigned long dummy;                                            \
                                                                        \
        typecheck(atomic_t *, v);                                       \
-       typecheck_fn(fastcall void (*)(atomic_t *), fail_fn);           \
+       typecheck_fn(void (*)(atomic_t *), fail_fn);                    \
                                                                        \
        __asm__ __volatile__(                                           \
                LOCK_PREFIX "   decl (%%rdi)    \n"                     \
@@ -47,7 +47,7 @@ do {                                                                  \
  */
 static inline int
 __mutex_fastpath_lock_retval(atomic_t *count,
-                            int fastcall (*fail_fn)(atomic_t *))
+                            int (*fail_fn)(atomic_t *))
 {
        if (unlikely(atomic_dec_return(count) < 0))
                return fail_fn(count);
@@ -67,7 +67,7 @@ do {                                                                  \
        unsigned long dummy;                                            \
                                                                        \
        typecheck(atomic_t *, v);                                       \
-       typecheck_fn(fastcall void (*)(atomic_t *), fail_fn);           \
+       typecheck_fn(void (*)(atomic_t *), fail_fn);                    \
                                                                        \
        __asm__ __volatile__(                                           \
                LOCK_PREFIX "   incl (%%rdi)    \n"                     \
index 43d4c333a8b19a0c9f9a9a5a8bb218638f551a51..4e28b6060a5ed46ee7c033ebeccb9a7f1703f4f5 100644 (file)
@@ -18,11 +18,6 @@ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *p
        set_pmd(pmd, __pmd(_PAGE_TABLE | (page_to_pfn(pte) << PAGE_SHIFT)));
 }
 
-static inline pmd_t *get_pmd(void)
-{
-       return (pmd_t *)get_zeroed_page(GFP_KERNEL);
-}
-
 static inline void pmd_free(pmd_t *pmd)
 {
        BUG_ON((unsigned long)pmd & (PAGE_SIZE-1));
index 59901c690a0d4882744c770c4aabfa39ad605bb7..730bd6028416c5a9c28aa2767b19fdf85b816e78 100644 (file)
@@ -359,15 +359,6 @@ static inline int pmd_large(pmd_t pte) {
 #define mk_pte(page, pgprot)   pfn_pte(page_to_pfn(page), (pgprot))
 #define mk_pte_huge(entry) (pte_val(entry) |= _PAGE_PRESENT | _PAGE_PSE)
  
-/* physical address -> PTE */
-static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot)
-{ 
-       pte_t pte;
-       pte_val(pte) = physpage | pgprot_val(pgprot); 
-       pte_val(pte) &= __supported_pte_mask;
-       return pte; 
-}
 /* Change flags of a PTE */
 static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
 { 
index a6d2ff5c69b76ea2a5941740dd2206cf45f03726..f54f3abf93ce5a575d0d2b7dc5d4f26776335c71 100644 (file)
@@ -45,11 +45,7 @@ extern u32 pmtmr_ioport;
 #else
 #define pmtmr_ioport 0
 #endif
-extern unsigned long long monotonic_base;
-extern int sysctl_vsyscall;
 extern int nohpet;
-extern unsigned long vxtime_hz;
-extern void time_init_gtod(void);
 
 extern void early_printk(const char *fmt, ...) __attribute__((format(printf,1,2)));
 
@@ -91,8 +87,6 @@ extern void check_efer(void);
 
 extern int unhandled_signal(struct task_struct *tsk, int sig);
 
-extern int unsynchronized_tsc(void);
-
 extern void select_idle_routine(const struct cpuinfo_x86 *c);
 
 extern unsigned long table_start, table_end;
index 985d4e3c79da720b62ed4e9e86ac1f34ce30894e..eaeff73d6c10d07d91c818a182b2d7a5f08d48f1 100644 (file)
@@ -1,6 +1,6 @@
 #ifndef _x8664_SETUP_H
 #define _x8664_SETUP_H
 
-#define COMMAND_LINE_SIZE      256
+#define COMMAND_LINE_SIZE      2048
 
 #endif
index 443b225537f0bd61ecc4e18f22b5d0997a67bdb1..35ee59b78329853d78e13e45aad641a2daa2d033 100644 (file)
@@ -39,24 +39,6 @@ struct termio {
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
-/* line disciplines */
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IR - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14      /* synchronous PPP */
-#define N_HCI          15  /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 
 /*     intr=^C         quit=^\         erase=del       kill=^U
index b9e5320b76252f06d86fac9f1ac36eeaaa41233b..8c6808a3fba443ab74770b526997fd8a6ea0b447 100644 (file)
 #include <asm/hpet.h>
 #include <asm/system.h>
 #include <asm/processor.h>
+#include <asm/tsc.h>
 #include <linux/compiler.h>
 
 #define CLOCK_TICK_RATE        PIT_TICK_RATE   /* Underlying HZ */
 
-typedef unsigned long long cycles_t;
-
-static inline cycles_t get_cycles (void)
-{
-       unsigned long long ret;
-
-       rdtscll(ret);
-       return ret;
-}
-
-/* Like get_cycles, but make sure the CPU is synchronized. */
-static __always_inline cycles_t get_cycles_sync(void)
-{
-       unsigned long long ret;
-       unsigned eax;
-       /* Don't do an additional sync on CPUs where we know
-          RDTSC is already synchronous. */
-       alternative_io("cpuid", ASM_NOP2, X86_FEATURE_SYNC_RDTSC,
-                         "=a" (eax), "0" (1) : "ebx","ecx","edx","memory");
-       rdtscll(ret);
-       return ret;
-}
-
-extern unsigned int cpu_khz;
-
 extern int read_current_timer(unsigned long *timer_value);
 #define ARCH_HAS_READ_CURRENT_TIMER    1
 
-extern struct vxtime_data vxtime;
+#define USEC_PER_TICK (USEC_PER_SEC / HZ)
+#define NSEC_PER_TICK (NSEC_PER_SEC / HZ)
+#define FSEC_PER_TICK (FSEC_PER_SEC / HZ)
+
+#define NS_SCALE        10 /* 2^10, carefully chosen */
+#define US_SCALE        32 /* 2^32, arbitralrily chosen */
 
+extern void mark_tsc_unstable(void);
+extern void set_cyc2ns_scale(unsigned long khz);
 #endif
diff --git a/include/asm-x86_64/tsc.h b/include/asm-x86_64/tsc.h
new file mode 100644 (file)
index 0000000..9a0a368
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * linux/include/asm-x86_64/tsc.h
+ *
+ * x86_64 TSC related functions
+ */
+#ifndef _ASM_x86_64_TSC_H
+#define _ASM_x86_64_TSC_H
+
+#include <asm/processor.h>
+
+/*
+ * Standard way to access the cycle counter.
+ */
+typedef unsigned long long cycles_t;
+
+extern unsigned int cpu_khz;
+extern unsigned int tsc_khz;
+
+static inline cycles_t get_cycles(void)
+{
+       unsigned long long ret = 0;
+
+#ifndef CONFIG_X86_TSC
+       if (!cpu_has_tsc)
+               return 0;
+#endif
+
+#if defined(CONFIG_X86_GENERIC) || defined(CONFIG_X86_TSC)
+       rdtscll(ret);
+#endif
+       return ret;
+}
+
+/* Like get_cycles, but make sure the CPU is synchronized. */
+static __always_inline cycles_t get_cycles_sync(void)
+{
+       unsigned long long ret;
+#ifdef X86_FEATURE_SYNC_RDTSC
+       unsigned eax;
+
+       /*
+        * Don't do an additional sync on CPUs where we know
+        * RDTSC is already synchronous:
+        */
+       alternative_io("cpuid", ASM_NOP2, X86_FEATURE_SYNC_RDTSC,
+                         "=a" (eax), "0" (1) : "ebx","ecx","edx","memory");
+#else
+       sync_core();
+#endif
+       rdtscll(ret);
+
+       return ret;
+}
+
+extern void tsc_init(void);
+extern void mark_tsc_unstable(void);
+extern int unsynchronized_tsc(void);
+
+/*
+ * Boot-time check whether the TSCs are synchronized across
+ * all CPUs/cores:
+ */
+extern void check_tsc_sync_source(int cpu);
+extern void check_tsc_sync_target(void);
+
+#endif
index c0eac519840b2d1d15a4c0751d20293649bbe9b0..1981f70fcad1b1212fa1a3d464f8e0b05608f009 100644 (file)
  * Uhhuh, this needs 65-bit arithmetic. We have a carry..
  */
 #define __range_not_ok(addr,size) ({ \
-       unsigned long flag,sum; \
+       unsigned long flag,roksum; \
        __chk_user_ptr(addr); \
        asm("# range_ok\n\r" \
                "addq %3,%1 ; sbbq %0,%0 ; cmpq %1,%4 ; sbbq $0,%0"  \
-               :"=&r" (flag), "=r" (sum) \
+               :"=&r" (flag), "=r" (roksum) \
                :"1" (addr),"g" ((long)(size)),"g" (current_thread_info()->addr_limit.seg)); \
        flag; })
 
@@ -367,4 +367,18 @@ __copy_to_user_inatomic(void __user *dst, const void *src, unsigned size)
        return copy_user_generic((__force void *)dst, src, size);
 }
 
+#define ARCH_HAS_NOCACHE_UACCESS 1
+extern long __copy_user_nocache(void *dst, const void __user *src, unsigned size, int zerorest);
+
+static inline int __copy_from_user_nocache(void *dst, const void __user *src, unsigned size)
+{
+       might_sleep();
+       return __copy_user_nocache(dst, (__force void *)src, size, 1);
+}
+
+static inline int __copy_from_user_inatomic_nocache(void *dst, const void __user *src, unsigned size)
+{
+       return __copy_user_nocache(dst, (__force void *)src, size, 0);
+}
+
 #endif /* __X86_64_UACCESS_H */
index 05cb8dd200de7742456de435aa31c586b5df2776..82b4afe65c914a224a79274edeadfec94addb58d 100644 (file)
@@ -16,51 +16,27 @@ enum vsyscall_num {
 #ifdef __KERNEL__
 #include <linux/seqlock.h>
 
-#define __section_vxtime __attribute__ ((unused, __section__ (".vxtime"), aligned(16)))
 #define __section_vgetcpu_mode __attribute__ ((unused, __section__ (".vgetcpu_mode"), aligned(16)))
 #define __section_jiffies __attribute__ ((unused, __section__ (".jiffies"), aligned(16)))
-#define __section_sys_tz __attribute__ ((unused, __section__ (".sys_tz"), aligned(16)))
-#define __section_sysctl_vsyscall __attribute__ ((unused, __section__ (".sysctl_vsyscall"), aligned(16)))
-#define __section_xtime __attribute__ ((unused, __section__ (".xtime"), aligned(16)))
-#define __section_xtime_lock __attribute__ ((unused, __section__ (".xtime_lock"), aligned(16)))
 
-#define VXTIME_TSC     1
-#define VXTIME_HPET    2
-#define VXTIME_PMTMR   3
+/* Definitions for CONFIG_GENERIC_TIME definitions */
+#define __section_vsyscall_gtod_data __attribute__ \
+       ((unused, __section__ (".vsyscall_gtod_data"),aligned(16)))
+#define __vsyscall_fn __attribute__ ((unused,__section__(".vsyscall_fn")))
 
 #define VGETCPU_RDTSCP 1
 #define VGETCPU_LSL    2
 
-struct vxtime_data {
-       long hpet_address;      /* HPET base address */
-       int last;
-       unsigned long last_tsc;
-       long quot;
-       long tsc_quot;
-       int mode;
-};
-
 #define hpet_readl(a)           readl((const void __iomem *)fix_to_virt(FIX_HPET_BASE) + a)
 #define hpet_writel(d,a)        writel(d, (void __iomem *)fix_to_virt(FIX_HPET_BASE) + a)
 
-/* vsyscall space (readonly) */
-extern struct vxtime_data __vxtime;
 extern int __vgetcpu_mode;
-extern struct timespec __xtime;
 extern volatile unsigned long __jiffies;
-extern struct timezone __sys_tz;
-extern seqlock_t __xtime_lock;
 
 /* kernel space (writeable) */
-extern struct vxtime_data vxtime;
 extern int vgetcpu_mode;
 extern struct timezone sys_tz;
-extern int sysctl_vsyscall;
-extern seqlock_t xtime_lock;
-
-extern int sysctl_vsyscall;
-
-#define ARCH_HAVE_XTIME_LOCK 1
+extern struct vsyscall_gtod_data_t vsyscall_gtod_data;
 
 #endif /* __KERNEL__ */
 
index ba394cbb48071b03ddc789f21bf80fef84d50eb1..9b92620c8a1ed262d3b10a9cb44dd0b746feacc8 100644 (file)
@@ -79,7 +79,6 @@
 #define MADV_DOFORK    11              /* do inherit across fork */
 
 /* compatibility flags */
-#define MAP_ANON       MAP_ANONYMOUS
 #define MAP_FILE       0
 
 #endif /* _XTENSA_MMAN_H */
index 83c6aed1d1154655e2a516b5fa2007e4f87e25f3..f14b42c8dac06b320363f88ea97863049397092e 100644 (file)
@@ -52,25 +52,6 @@ struct termio {
 
 /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
 
-/* Line disciplines */
-
-#define N_TTY          0
-#define N_SLIP         1
-#define N_MOUSE                2
-#define N_PPP          3
-#define N_STRIP                4
-#define N_AX25         5
-#define N_X25          6       /* X.25 async */
-#define N_6PACK                7
-#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
-#define N_R3964                9       /* Reserved for Simatic R3964 module */
-#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
-#define N_IRDA         11      /* Linux IR - http://irda.sourceforge.net/ */
-#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data cards about SMS messages */
-#define N_HDLC         13      /* synchronous HDLC */
-#define N_SYNC_PPP     14
-#define N_HCI          15      /* Bluetooth HCI UART */
-
 #ifdef __KERNEL__
 
 /*     intr=^C         quit=^\         erase=del       kill=^U
index 683513e310de229e5b84d7ebf218fd0ca9b822ab..e81e301a4d7108590e99a609a74b931bc104e734 100644 (file)
@@ -156,7 +156,6 @@ header-y += video_encoder.h
 header-y += videotext.h
 header-y += vt.h
 header-y += wireless.h
-header-y += xattr.h
 header-y += x25.h
 
 unifdef-y += acct.h
@@ -324,6 +323,7 @@ unifdef-y += tty.h
 unifdef-y += types.h
 unifdef-y += udf_fs_i.h
 unifdef-y += udp.h
+unifdef-y += ufs_fs.h
 unifdef-y += uinput.h
 unifdef-y += uio.h
 unifdef-y += unistd.h
@@ -336,6 +336,7 @@ unifdef-y += wait.h
 unifdef-y += wanrouter.h
 unifdef-y += watchdog.h
 unifdef-y += wireless.h
+unifdef-y += xattr.h
 unifdef-y += xfrm.h
 
 objhdr-y += version.h
index 815f1fb4ce211302a334d447ae61b72d4c25053a..8bcfaa4c66ae78705ed128297d0069cd9f460752 100644 (file)
@@ -75,7 +75,7 @@ enum acpi_address_range_id {
 
 typedef int (*acpi_table_handler) (struct acpi_table_header *table);
 
-typedef int (*acpi_madt_entry_handler) (struct acpi_subtable_header *header, const unsigned long end);
+typedef int (*acpi_table_entry_handler) (struct acpi_subtable_header *header, const unsigned long end);
 
 char * __acpi_map_table (unsigned long phys_addr, unsigned long size);
 unsigned long acpi_find_rsdp (void);
@@ -85,8 +85,10 @@ int acpi_numa_init (void);
 
 int acpi_table_init (void);
 int acpi_table_parse (char *id, acpi_table_handler handler);
-int acpi_table_parse_madt (enum acpi_madt_type id, acpi_madt_entry_handler handler, unsigned int max_entries);
-int acpi_table_parse_srat (enum acpi_srat_type id, acpi_madt_entry_handler handler, unsigned int max_entries);
+int __init acpi_table_parse_entries(char *id, unsigned long table_size,
+       int entry_id, acpi_table_entry_handler handler, unsigned int max_entries);
+int acpi_table_parse_madt (enum acpi_madt_type id, acpi_table_entry_handler handler, unsigned int max_entries);
+int acpi_table_parse_srat (enum acpi_srat_type id, acpi_table_entry_handler handler, unsigned int max_entries);
 int acpi_parse_mcfg (struct acpi_table_header *header);
 void acpi_table_print_madt_entry (struct acpi_subtable_header *madt);
 void acpi_table_print_srat_entry (struct acpi_subtable_header *srat);
diff --git a/include/linux/acpi_pmtmr.h b/include/linux/acpi_pmtmr.h
new file mode 100644 (file)
index 0000000..1d0ef1a
--- /dev/null
@@ -0,0 +1,38 @@
+#ifndef _ACPI_PMTMR_H_
+#define _ACPI_PMTMR_H_
+
+#include <linux/clocksource.h>
+
+/* Number of PMTMR ticks expected during calibration run */
+#define PMTMR_TICKS_PER_SEC 3579545
+
+/* limit it to 24 bits */
+#define ACPI_PM_MASK CLOCKSOURCE_MASK(24)
+
+/* Overrun value */
+#define ACPI_PM_OVRRUN (1<<24)
+
+#ifdef CONFIG_X86_PM_TIMER
+
+extern u32 acpi_pm_read_verified(void);
+extern u32 pmtmr_ioport;
+
+static inline u32 acpi_pm_read_early(void)
+{
+       if (!pmtmr_ioport)
+               return 0;
+       /* mask the output to 24 bits */
+       return acpi_pm_read_verified() & ACPI_PM_MASK;
+}
+
+#else
+
+static inline u32 acpi_pm_read_early(void)
+{
+       return 0;
+}
+
+#endif
+
+#endif
+
index a5c8bb5d80baddd93fd375ce446e27377f60ab8d..abc521cfb08464a7e5a9c3cf11ca60d80f0529af 100644 (file)
@@ -87,10 +87,15 @@ struct agp_memory {
        u32 physical;
        u8 is_bound;
        u8 is_flushed;
+        u8 vmalloc_flag;
 };
 
 #define AGP_NORMAL_MEMORY 0
 
+#define AGP_USER_TYPES (1 << 16)
+#define AGP_USER_MEMORY (AGP_USER_TYPES)
+#define AGP_USER_CACHED_MEMORY (AGP_USER_TYPES + 1)
+
 extern struct agp_bridge_data *agp_bridge;
 extern struct list_head agp_bridges;
 
index 1df941648a573a449d6807917e7a8ab4207b5a03..272736e37990b7d96b71d7f4b0972ee2d7033d77 100644 (file)
@@ -44,9 +44,9 @@ enum {
        ATA_MAX_SECTORS_LBA48   = 65535,/* TODO: 65536? */
 
        ATA_ID_WORDS            = 256,
-       ATA_ID_SERNO_OFS        = 10,
-       ATA_ID_FW_REV_OFS       = 23,
-       ATA_ID_PROD_OFS         = 27,
+       ATA_ID_SERNO            = 10,
+       ATA_ID_FW_REV           = 23,
+       ATA_ID_PROD             = 27,
        ATA_ID_OLD_PIO_MODES    = 51,
        ATA_ID_FIELD_VALID      = 53,
        ATA_ID_MWDMA_MODES      = 63,
@@ -58,8 +58,11 @@ enum {
        ATA_ID_MAJOR_VER        = 80,
        ATA_ID_PIO4             = (1 << 1),
 
+       ATA_ID_SERNO_LEN        = 20,
+       ATA_ID_FW_REV_LEN       = 8,
+       ATA_ID_PROD_LEN         = 40,
+
        ATA_PCI_CTL_OFS         = 2,
-       ATA_SERNO_LEN           = 20,
        ATA_UDMA0               = (1 << 0),
        ATA_UDMA1               = ATA_UDMA0 | (1 << 1),
        ATA_UDMA2               = ATA_UDMA1 | (1 << 2),
@@ -296,6 +299,8 @@ struct ata_taskfile {
 #define ata_id_queue_depth(id) (((id)[75] & 0x1f) + 1)
 #define ata_id_removeable(id)  ((id)[0] & (1 << 7))
 #define ata_id_has_dword_io(id)        ((id)[50] & (1 << 0))
+#define ata_id_iordy_disable(id) ((id)[49] & (1 << 10))
+#define ata_id_has_iordy(id) ((id)[49] & (1 << 9))
 #define ata_id_u32(id,n)       \
        (((u32) (id)[(n) + 1] << 16) | ((u32) (id)[(n)]))
 #define ata_id_u64(id,n)       \
@@ -347,7 +352,7 @@ static inline int ata_drive_40wire(const u16 *dev_id)
 {
        if (ata_id_major_version(dev_id) >= 5 && ata_id_is_sata(dev_id))
                return 0;       /* SATA */
-       if (dev_id[93] & 0x4000)
+       if ((dev_id[93] & 0xE000) == 0x6000)
                return 0;       /* 80 wire */
        return 1;
 }
index 75b8baca08f3a999d0b84da8d30ea80a35b479ed..d12984ddaa9fff9d65da2f0a0f617524a688a820 100644 (file)
@@ -182,7 +182,7 @@ extern rwlock_t atalk_interfaces_lock;
 
 extern struct atalk_route atrtr_default;
 
-extern struct file_operations atalk_seq_arp_fops;
+extern const struct file_operations atalk_seq_arp_fops;
 
 extern int sysctl_aarp_expiry_time;
 extern int sysctl_aarp_tick_time;
index c1e82c51444320f0970162fa76b2065ab3727bf7..2d956cd566aed11bf0333c30cc0a36cca475dac9 100644 (file)
@@ -59,6 +59,7 @@ struct linux_binfmt {
        int (*load_shlib)(struct file *);
        int (*core_dump)(long signr, struct pt_regs * regs, struct file * file);
        unsigned long min_coredump;     /* minimal dump size */
+       int hasvdso;
 };
 
 extern int register_binfmt(struct linux_binfmt *);
index 36a6eacefe20d2c17f60b9b34c569cc8f425a843..83dcd8c0e97493cb5a385dff744f0856fd484625 100644 (file)
@@ -82,7 +82,6 @@ struct cfq_io_context {
 
        unsigned long last_end_request;
        sector_t last_request_pos;
-       unsigned long last_queue;
 
        unsigned long ttime_total;
        unsigned long ttime_samples;
index 5d9fb0e94156235eca46e199352933fc638b9596..dd27b1c7227f19bcdf177632816b22256538284b 100644 (file)
@@ -34,6 +34,7 @@ enum bh_state_bits {
        BH_Write_EIO,   /* I/O error on write */
        BH_Ordered,     /* ordered write */
        BH_Eopnotsupp,  /* operation not supported (barrier) */
+       BH_Unwritten,   /* Buffer is allocated on disk but not written */
 
        BH_PrivateStart,/* not a state bit, but the first bit available
                         * for private allocation by other entities
@@ -126,6 +127,7 @@ BUFFER_FNS(Boundary, boundary)
 BUFFER_FNS(Write_EIO, write_io_error)
 BUFFER_FNS(Ordered, ordered)
 BUFFER_FNS(Eopnotsupp, eopnotsupp)
+BUFFER_FNS(Unwritten, unwritten)
 
 #define bh_offset(bh)          ((unsigned long)(bh)->b_data & ~PAGE_MASK)
 #define touch_buffer(bh)       mark_page_accessed(bh->b_page)
@@ -172,12 +174,14 @@ struct super_block *freeze_bdev(struct block_device *);
 void thaw_bdev(struct block_device *, struct super_block *);
 int fsync_super(struct super_block *);
 int fsync_no_super(struct block_device *);
-struct buffer_head *__find_get_block(struct block_device *, sector_t, int);
-struct buffer_head * __getblk(struct block_device *, sector_t, int);
+struct buffer_head *__find_get_block(struct block_device *bdev, sector_t block,
+                       unsigned size);
+struct buffer_head *__getblk(struct block_device *bdev, sector_t block,
+                       unsigned size);
 void __brelse(struct buffer_head *);
 void __bforget(struct buffer_head *);
-void __breadahead(struct block_device *, sector_t block, int size);
-struct buffer_head *__bread(struct block_device *, sector_t block, int size);
+void __breadahead(struct block_device *, sector_t block, unsigned int size);
+struct buffer_head *__bread(struct block_device *, sector_t block, unsigned size);
 struct buffer_head *alloc_buffer_head(gfp_t gfp_flags);
 void free_buffer_head(struct buffer_head * bh);
 void FASTCALL(unlock_buffer(struct buffer_head *bh));
index 56499ab9e32ee9f1bb1a72adab6a856c781cb4a1..79bedddfd9ca15c02d9fa91793d24027fa5f6b8c 100644 (file)
@@ -1,7 +1,5 @@
 header-y += big_endian.h
 header-y += little_endian.h
-header-y += pdp_endian.h
 
 unifdef-y += generic.h
-unifdef-y += swabb.h
 unifdef-y += swab.h
diff --git a/include/linux/byteorder/pdp_endian.h b/include/linux/byteorder/pdp_endian.h
deleted file mode 100644 (file)
index 618631c..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-#ifndef _LINUX_BYTEORDER_PDP_ENDIAN_H
-#define _LINUX_BYTEORDER_PDP_ENDIAN_H
-
-/*
- * Could have been named NUXI-endian, but we use the same name as in glibc.
- * hopefully only the PDP and its evolutions (old VAXen in compatibility mode)
- * should ever use this braindead byteorder.
- * This file *should* work, but has not been tested.
- *
- * little-endian is 1234; big-endian is 4321; nuxi/pdp-endian is 3412
- *
- * I thought vaxen were NUXI-endian, but was told they were correct-endian
- * (little-endian), though indeed there existed NUXI-endian machines
- * (DEC PDP-11 and old VAXen in compatibility mode).
- * This makes this file a bit useless, but as a proof-of-concept.
- *
- * But what does a __u64 look like: is it 34127856 or 78563412 ???
- * I don't dare imagine! Hence, no 64-bit byteorder support yet.
- * Hopefully, there 64-bit pdp-endian support shouldn't ever be required.
- *
- */
-
-#ifndef __PDP_ENDIAN
-#define __PDP_ENDIAN 3412
-#endif
-#ifndef __PDP_ENDIAN_BITFIELD
-#define __PDP_ENDIAN_BITFIELD
-#endif
-
-#include <linux/byteorder/swab.h>
-#include <linux/byteorder/swabb.h>
-
-#define __constant_htonl(x) ___constant_swahb32((x))
-#define __constant_ntohl(x) ___constant_swahb32((x))
-#define __constant_htons(x) ___constant_swab16((x))
-#define __constant_ntohs(x) ___constant_swab16((x))
-#define __constant_cpu_to_le64(x) I DON'T KNOW
-#define __constant_le64_to_cpu(x) I DON'T KNOW
-#define __constant_cpu_to_le32(x) ___constant_swahw32((x))
-#define __constant_le32_to_cpu(x) ___constant_swahw32((x))
-#define __constant_cpu_to_le16(x) ((__u16)(x)
-#define __constant_le16_to_cpu(x) ((__u16)(x)
-#define __constant_cpu_to_be64(x) I DON'T KNOW
-#define __constant_be64_to_cpu(x) I DON'T KNOW
-#define __constant_cpu_to_be32(x) ___constant_swahb32((x))
-#define __constant_be32_to_cpu(x) ___constant_swahb32((x))
-#define __constant_cpu_to_be16(x) ___constant_swab16((x))
-#define __constant_be16_to_cpu(x) ___constant_swab16((x))
-#define __cpu_to_le64(x) I DON'T KNOW
-#define __le64_to_cpu(x) I DON'T KNOW
-#define __cpu_to_le32(x) ___swahw32((x))
-#define __le32_to_cpu(x) ___swahw32((x))
-#define __cpu_to_le16(x) ((__u16)(x)
-#define __le16_to_cpu(x) ((__u16)(x)
-#define __cpu_to_be64(x) I DON'T KNOW
-#define __be64_to_cpu(x) I DON'T KNOW
-#define __cpu_to_be32(x) __swahb32((x))
-#define __be32_to_cpu(x) __swahb32((x))
-#define __cpu_to_be16(x) __swab16((x))
-#define __be16_to_cpu(x) __swab16((x))
-#define __cpu_to_le64p(x) I DON'T KNOW
-#define __le64_to_cpup(x) I DON'T KNOW
-#define __cpu_to_le32p(x) ___swahw32p((x))
-#define __le32_to_cpup(x) ___swahw32p((x))
-#define __cpu_to_le16p(x) (*(__u16*)(x))
-#define __le16_to_cpup(x) (*(__u16*)(x))
-#define __cpu_to_be64p(x) I DON'T KNOW
-#define __be64_to_cpup(x) I DON'T KNOW
-#define __cpu_to_be32p(x) __swahb32p((x))
-#define __be32_to_cpup(x) __swahb32p((x))
-#define __cpu_to_be16p(x) __swab16p((x))
-#define __be16_to_cpup(x) __swab16p((x))
-#define __cpu_to_le64s(x) I DON'T KNOW
-#define __le64_to_cpus(x) I DON'T KNOW
-#define __cpu_to_le32s(x) ___swahw32s((x))
-#define __le32_to_cpus(x) ___swahw32s((x))
-#define __cpu_to_le16s(x) do {} while (0)
-#define __le16_to_cpus(x) do {} while (0)
-#define __cpu_to_be64s(x) I DON'T KNOW
-#define __be64_to_cpus(x) I DON'T KNOW
-#define __cpu_to_be32s(x) __swahb32s((x))
-#define __be32_to_cpus(x) __swahb32s((x))
-#define __cpu_to_be16s(x) __swab16s((x))
-#define __be16_to_cpus(x) __swab16s((x))
-
-#include <linux/byteorder/generic.h>
-
-#endif /* _LINUX_BYTEORDER_PDP_ENDIAN_H */
index ae5e5f914bf4a082b1f12e3956f4e868011710db..8c780c7d779e134fd9d42531b8f2e8d61b2badb4 100644 (file)
@@ -25,6 +25,8 @@
  *
  */
 
+#include <linux/types.h>
+
 #define ___swahw32(x) \
 ({ \
        __u32 __x = (x); \
 /*
  * Allow constant folding
  */
-#if defined(__GNUC__) && defined(__OPTIMIZE__)
-#  define __swahw32(x) \
+#define __swahw32(x) \
 (__builtin_constant_p((__u32)(x)) ? \
  ___swahw32((x)) : \
  __fswahw32((x)))
-#  define __swahb32(x) \
+#define __swahb32(x) \
 (__builtin_constant_p((__u32)(x)) ? \
  ___swahb32((x)) : \
  __fswahb32((x)))
-#else
-#  define __swahw32(x) __fswahw32(x)
-#  define __swahb32(x) __fswahb32(x)
-#endif /* OPTIMIZE */
 
 
 static inline __u32 __fswahw32(__u32 x)
@@ -128,13 +125,11 @@ static inline void __swahb32s(__u32 *addr)
  */
 #endif /* __BYTEORDER_HAS_U64__ */
 
-#if defined(__KERNEL__)
 #define swahw32 __swahw32
 #define swahb32 __swahb32
 #define swahw32p __swahw32p
 #define swahb32p __swahb32p
 #define swahw32s __swahw32s
 #define swahb32s __swahb32s
-#endif
 
 #endif /* _LINUX_BYTEORDER_SWABB_H */
diff --git a/include/linux/cfag12864b.h b/include/linux/cfag12864b.h
new file mode 100644 (file)
index 0000000..0bc45e6
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ *    Filename: cfag12864b.h
+ *     Version: 0.1.0
+ * Description: cfag12864b LCD driver header
+ *     License: GPLv2
+ *
+ *      Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
+ *        Date: 2006-10-12
+ *
+ *  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.
+ *
+ *  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 _CFAG12864B_H_
+#define _CFAG12864B_H_
+
+#define CFAG12864B_WIDTH       (128)
+#define CFAG12864B_HEIGHT      (64)
+#define CFAG12864B_CONTROLLERS (2)
+#define CFAG12864B_PAGES       (8)
+#define CFAG12864B_ADDRESSES   (64)
+#define CFAG12864B_SIZE                ((CFAG12864B_CONTROLLERS) * \
+                               (CFAG12864B_PAGES) * \
+                               (CFAG12864B_ADDRESSES))
+
+/*
+ * The driver will blit this buffer to the LCD
+ *
+ * Its size is CFAG12864B_SIZE.
+ */
+extern unsigned char * cfag12864b_buffer;
+
+/*
+ * Get the refresh rate of the LCD
+ *
+ * Returns the refresh rate (hertzs).
+ */
+extern unsigned int cfag12864b_getrate(void);
+
+/*
+ * Enable refreshing
+ *
+ * Returns 0 if successful (anyone was using it),
+ * or != 0 if failed (someone is using it).
+ */
+extern unsigned char cfag12864b_enable(void);
+
+/*
+ * Disable refreshing
+ *
+ * You should call this only when you finish using the LCD.
+ */
+extern void cfag12864b_disable(void);
+
+/*
+ * Is enabled refreshing? (is anyone using the module?)
+ *
+ * Returns 0 if refreshing is not enabled (anyone is using it),
+ * or != 0 if refreshing is enabled (someone is using it).
+ *
+ * Useful for buffer read-only modules.
+ */
+extern unsigned char cfag12864b_isenabled(void);
+
+#endif /* _CFAG12864B_H_ */
+
diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h
new file mode 100644 (file)
index 0000000..4ea7e7b
--- /dev/null
@@ -0,0 +1,142 @@
+/*  linux/include/linux/clockchips.h
+ *
+ *  This file contains the structure definitions for clockchips.
+ *
+ *  If you are not a clockchip, or the time of day code, you should
+ *  not be including this file!
+ */
+#ifndef _LINUX_CLOCKCHIPS_H
+#define _LINUX_CLOCKCHIPS_H
+
+#ifdef CONFIG_GENERIC_CLOCKEVENTS
+
+#include <linux/clocksource.h>
+#include <linux/cpumask.h>
+#include <linux/ktime.h>
+#include <linux/notifier.h>
+
+struct clock_event_device;
+
+/* Clock event mode commands */
+enum clock_event_mode {
+       CLOCK_EVT_MODE_UNUSED = 0,
+       CLOCK_EVT_MODE_SHUTDOWN,
+       CLOCK_EVT_MODE_PERIODIC,
+       CLOCK_EVT_MODE_ONESHOT,
+};
+
+/* Clock event notification values */
+enum clock_event_nofitiers {
+       CLOCK_EVT_NOTIFY_ADD,
+       CLOCK_EVT_NOTIFY_BROADCAST_ON,
+       CLOCK_EVT_NOTIFY_BROADCAST_OFF,
+       CLOCK_EVT_NOTIFY_BROADCAST_ENTER,
+       CLOCK_EVT_NOTIFY_BROADCAST_EXIT,
+       CLOCK_EVT_NOTIFY_SUSPEND,
+       CLOCK_EVT_NOTIFY_RESUME,
+       CLOCK_EVT_NOTIFY_CPU_DEAD,
+};
+
+/*
+ * Clock event features
+ */
+#define CLOCK_EVT_FEAT_PERIODIC                0x000001
+#define CLOCK_EVT_FEAT_ONESHOT         0x000002
+/*
+ * x86(64) specific misfeatures:
+ *
+ * - Clockevent source stops in C3 State and needs broadcast support.
+ * - Local APIC timer is used as a dummy device.
+ */
+#define CLOCK_EVT_FEAT_C3STOP          0x000004
+#define CLOCK_EVT_FEAT_DUMMY           0x000008
+
+/**
+ * struct clock_event_device - clock event device descriptor
+ * @name:              ptr to clock event name
+ * @hints:             usage hints
+ * @max_delta_ns:      maximum delta value in ns
+ * @min_delta_ns:      minimum delta value in ns
+ * @mult:              nanosecond to cycles multiplier
+ * @shift:             nanoseconds to cycles divisor (power of two)
+ * @rating:            variable to rate clock event devices
+ * @irq:               irq number (only for non cpu local devices)
+ * @cpumask:           cpumask to indicate for which cpus this device works
+ * @set_next_event:    set next event
+ * @set_mode:          set mode function
+ * @evthandler:                Assigned by the framework to be called by the low
+ *                     level handler of the event source
+ * @broadcast:         function to broadcast events
+ * @list:              list head for the management code
+ * @mode:              operating mode assigned by the management code
+ * @next_event:                local storage for the next event in oneshot mode
+ */
+struct clock_event_device {
+       const char              *name;
+       unsigned int            features;
+       unsigned long           max_delta_ns;
+       unsigned long           min_delta_ns;
+       unsigned long           mult;
+       int                     shift;
+       int                     rating;
+       int                     irq;
+       cpumask_t               cpumask;
+       int                     (*set_next_event)(unsigned long evt,
+                                                 struct clock_event_device *);
+       void                    (*set_mode)(enum clock_event_mode mode,
+                                           struct clock_event_device *);
+       void                    (*event_handler)(struct clock_event_device *);
+       void                    (*broadcast)(cpumask_t mask);
+       struct list_head        list;
+       enum clock_event_mode   mode;
+       ktime_t                 next_event;
+};
+
+/*
+ * Calculate a multiplication factor for scaled math, which is used to convert
+ * nanoseconds based values to clock ticks:
+ *
+ * clock_ticks = (nanoseconds * factor) >> shift.
+ *
+ * div_sc is the rearranged equation to calculate a factor from a given clock
+ * ticks / nanoseconds ratio:
+ *
+ * factor = (clock_ticks << shift) / nanoseconds
+ */
+static inline unsigned long div_sc(unsigned long ticks, unsigned long nsec,
+                                  int shift)
+{
+       uint64_t tmp = ((uint64_t)ticks) << shift;
+
+       do_div(tmp, nsec);
+       return (unsigned long) tmp;
+}
+
+/* Clock event layer functions */
+extern unsigned long clockevent_delta2ns(unsigned long latch,
+                                        struct clock_event_device *evt);
+extern void clockevents_register_device(struct clock_event_device *dev);
+
+extern void clockevents_exchange_device(struct clock_event_device *old,
+                                       struct clock_event_device *new);
+extern
+struct clock_event_device *clockevents_request_device(unsigned int features,
+                                                     cpumask_t cpumask);
+extern void clockevents_release_device(struct clock_event_device *dev);
+extern void clockevents_set_mode(struct clock_event_device *dev,
+                                enum clock_event_mode mode);
+extern int clockevents_register_notifier(struct notifier_block *nb);
+extern void clockevents_unregister_notifier(struct notifier_block *nb);
+extern int clockevents_program_event(struct clock_event_device *dev,
+                                    ktime_t expires, ktime_t now);
+
+extern void clockevents_notify(unsigned long reason, void *arg);
+
+#else
+
+static inline void clockevents_resume_events(void) { }
+#define clockevents_notify(reason, arg) do { } while (0)
+
+#endif
+
+#endif
index 1622d23a8dc3e9d7390e6642ee0d9f317aea6492..daa4940cc0f1fa37c9afd87b4ed759aac8c0a6bf 100644 (file)
 #include <linux/timex.h>
 #include <linux/time.h>
 #include <linux/list.h>
+#include <linux/timer.h>
 #include <asm/div64.h>
 #include <asm/io.h>
 
 /* clocksource cycle base type */
 typedef u64 cycle_t;
+struct clocksource;
 
 /**
  * struct clocksource - hardware abstraction for a free running counter
@@ -44,8 +46,8 @@ typedef u64 cycle_t;
  *                     subtraction of non 64 bit counters
  * @mult:              cycle to nanosecond multiplier
  * @shift:             cycle to nanosecond divisor (power of two)
- * @update_callback:   called when safe to alter clocksource values
- * @is_continuous:     defines if clocksource is free-running.
+ * @flags:             flags describing special properties
+ * @vread:             vsyscall based read
  * @cycle_interval:    Used internally by timekeeping core, please ignore.
  * @xtime_interval:    Used internally by timekeeping core, please ignore.
  */
@@ -57,15 +59,30 @@ struct clocksource {
        cycle_t mask;
        u32 mult;
        u32 shift;
-       int (*update_callback)(void);
-       int is_continuous;
+       unsigned long flags;
+       cycle_t (*vread)(void);
 
        /* timekeeping specific data, ignore */
        cycle_t cycle_last, cycle_interval;
        u64 xtime_nsec, xtime_interval;
        s64 error;
+
+#ifdef CONFIG_CLOCKSOURCE_WATCHDOG
+       /* Watchdog related data, used by the framework */
+       struct list_head wd_list;
+       cycle_t wd_last;
+#endif
 };
 
+/*
+ * Clock source flags bits::
+ */
+#define CLOCK_SOURCE_IS_CONTINUOUS             0x01
+#define CLOCK_SOURCE_MUST_VERIFY               0x02
+
+#define CLOCK_SOURCE_WATCHDOG                  0x10
+#define CLOCK_SOURCE_VALID_FOR_HRES            0x20
+
 /* simplify initialization of mask field */
 #define CLOCKSOURCE_MASK(bits) (cycle_t)(bits<64 ? ((1ULL<<bits)-1) : -1)
 
@@ -178,8 +195,16 @@ static inline void clocksource_calculate_interval(struct clocksource *c,
 
 
 /* used to install a new clocksource */
-int clocksource_register(struct clocksource*);
-void clocksource_reselect(void);
-struct clocksource* clocksource_get_next(void);
+extern int clocksource_register(struct clocksource*);
+extern struct clocksource* clocksource_get_next(void);
+extern void clocksource_change_rating(struct clocksource *cs, int rating);
+
+#ifdef CONFIG_GENERIC_TIME_VSYSCALL
+extern void update_vsyscall(struct timespec *ts, struct clocksource *c);
+#else
+static inline void update_vsyscall(struct timespec *ts, struct clocksource *c)
+{
+}
+#endif
 
 #endif /* _LINUX_CLOCKSOURCE_H */
index 4c2632a8d31b97a4fe3cdac74669a106f359e116..e4ac016ad27299f813809839fb81ccee258b3aa5 100644 (file)
@@ -23,9 +23,9 @@
 #include <linux/coda_fs_i.h>
 
 /* operations */
-extern struct inode_operations coda_dir_inode_operations;
-extern struct inode_operations coda_file_inode_operations;
-extern struct inode_operations coda_ioctl_inode_operations;
+extern const struct inode_operations coda_dir_inode_operations;
+extern const struct inode_operations coda_file_inode_operations;
+extern const struct inode_operations coda_ioctl_inode_operations;
 
 extern const struct address_space_operations coda_file_aops;
 extern const struct address_space_operations coda_symlink_aops;
index 6e1c44a935d411e5bbd5793b163d9082960d2196..9008eabb9c3ded7440e75c3d2b2c6c4c9c5f7e01 100644 (file)
 #define __inline__     __inline__      __attribute__((always_inline))
 #define __inline       __inline        __attribute__((always_inline))
 #define __deprecated                   __attribute__((deprecated))
+#define __packed                       __attribute__((packed))
+#define __weak                         __attribute__((weak))
+#define __naked                                __attribute__((naked))
+#define __noreturn                     __attribute__((noreturn))
+#define __pure                         __attribute__((pure))
+#define __aligned(x)                   __attribute__((aligned(x)))
+#define __printf(a,b)                  __attribute__((format(printf,a,b)))
 #define  noinline                      __attribute__((noinline))
 #define __attribute_pure__             __attribute__((pure))
 #define __attribute_const__            __attribute__((__const__))
index 7d0420274de00d26b86d6d986631860bb158d5d3..de25ee3b79196b1daa7d95ccb871f32652eb1a8a 100644 (file)
@@ -21,6 +21,7 @@ struct vc_data;
 struct console_font_op;
 struct console_font;
 struct module;
+struct tty_struct;
 
 /*
  * this is what the terminal answers to a ESC-Z or csi0c query.
@@ -132,6 +133,9 @@ static inline void resume_console(void) {}
 int mda_console_init(void);
 void prom_con_init(void);
 
+void vcs_make_sysfs(struct tty_struct *tty);
+void vcs_remove_sysfs(struct tty_struct *tty);
+
 /* Some debug stub to catch some of the obvious races in the VT code */
 #if 1
 #define WARN_CONSOLE_UNLOCKED()        WARN_ON(!is_console_locked() && !oops_in_progress)
index ed6c0fee1ac76fa5af1e0ed27c26a6b6fbc86395..a86162b26c0dde5a349a81129e67b74f1506d821 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <linux/wait.h>
 #include <linux/vt.h>
+#include <linux/workqueue.h>
 
 struct vt_struct;
 
@@ -103,6 +104,7 @@ struct vc_data {
 
 struct vc {
        struct vc_data *d;
+       struct work_struct SAK_work;
 
        /* might add  scrmem, vt_struct, kbd  at some time,
           to have everything in one place - the disadvantage
@@ -110,6 +112,7 @@ struct vc {
 };
 
 extern struct vc vc_cons [MAX_NR_CONSOLES];
+extern void vc_SAK(struct work_struct *work);
 
 #define CUR_DEF                0
 #define CUR_NONE       1
index bfb520212d7109eafb9811d9df5f827dc0a9b5f6..769ddc6df49243f39d8b8059e9c4a74828de4436 100644 (file)
@@ -49,10 +49,20 @@ struct notifier_block;
 
 #ifdef CONFIG_SMP
 /* Need to know about CPUs going up/down? */
-extern int register_cpu_notifier(struct notifier_block *nb);
 #ifdef CONFIG_HOTPLUG_CPU
+extern int register_cpu_notifier(struct notifier_block *nb);
 extern void unregister_cpu_notifier(struct notifier_block *nb);
 #else
+
+#ifndef MODULE
+extern int register_cpu_notifier(struct notifier_block *nb);
+#else
+static inline int register_cpu_notifier(struct notifier_block *nb)
+{
+       return 0;
+}
+#endif
+
 static inline void unregister_cpu_notifier(struct notifier_block *nb)
 {
 }
index 7f008f6bfdc36e2d1b430bf2b13bd876f43de1ff..0899e2cdcdd15761c9e1eaccb926acde77294e1c 100644 (file)
@@ -84,9 +84,6 @@ struct cpufreq_policy {
         unsigned int           policy; /* see above */
        struct cpufreq_governor *governor; /* see below */
 
-       struct mutex            lock;   /* CPU ->setpolicy or ->target may
-                                          only be called once a time */
-
        struct work_struct      update; /* if update_policy() needs to be
                                         * called, but you're in IRQ context */
 
@@ -172,11 +169,16 @@ extern int __cpufreq_driver_target(struct cpufreq_policy *policy,
                                   unsigned int relation);
 
 
-extern int cpufreq_driver_getavg(struct cpufreq_policy *policy);
+extern int __cpufreq_driver_getavg(struct cpufreq_policy *policy);
 
 int cpufreq_register_governor(struct cpufreq_governor *governor);
 void cpufreq_unregister_governor(struct cpufreq_governor *governor);
 
+int lock_policy_rwsem_read(int cpu);
+int lock_policy_rwsem_write(int cpu);
+void unlock_policy_rwsem_read(int cpu);
+void unlock_policy_rwsem_write(int cpu);
+
 
 /*********************************************************************
  *                      CPUFREQ DRIVER INTERFACE                     *
index fd404416f31c12eacb0ef60d958a148e7db57f81..826b15e914e2b9986787189dcba1d2efe15e15c3 100644 (file)
@@ -55,7 +55,7 @@ extern int cpuset_excl_nodes_overlap(const struct task_struct *p);
 extern int cpuset_memory_pressure_enabled;
 extern void __cpuset_memory_pressure_bump(void);
 
-extern struct file_operations proc_cpuset_operations;
+extern const struct file_operations proc_cpuset_operations;
 extern char *cpuset_task_status_allowed(struct task_struct *task, char *buffer);
 
 extern void cpuset_lock(void);
index 5ca1cdba563a43b4bc05cbe99b313203822add6b..26e4692f2d1a185c7c3bbe986e970eb1928721d7 100644 (file)
@@ -354,6 +354,41 @@ extern int __must_check device_create_bin_file(struct device *dev,
                                               struct bin_attribute *attr);
 extern void device_remove_bin_file(struct device *dev,
                                   struct bin_attribute *attr);
+
+/* device resource management */
+typedef void (*dr_release_t)(struct device *dev, void *res);
+typedef int (*dr_match_t)(struct device *dev, void *res, void *match_data);
+
+#ifdef CONFIG_DEBUG_DEVRES
+extern void * __devres_alloc(dr_release_t release, size_t size, gfp_t gfp,
+                            const char *name);
+#define devres_alloc(release, size, gfp) \
+       __devres_alloc(release, size, gfp, #release)
+#else
+extern void * devres_alloc(dr_release_t release, size_t size, gfp_t gfp);
+#endif
+extern void devres_free(void *res);
+extern void devres_add(struct device *dev, void *res);
+extern void * devres_find(struct device *dev, dr_release_t release,
+                         dr_match_t match, void *match_data);
+extern void * devres_get(struct device *dev, void *new_res,
+                        dr_match_t match, void *match_data);
+extern void * devres_remove(struct device *dev, dr_release_t release,
+                           dr_match_t match, void *match_data);
+extern int devres_destroy(struct device *dev, dr_release_t release,
+                         dr_match_t match, void *match_data);
+
+/* devres group */
+extern void * __must_check devres_open_group(struct device *dev, void *id,
+                                            gfp_t gfp);
+extern void devres_close_group(struct device *dev, void *id);
+extern void devres_remove_group(struct device *dev, void *id);
+extern int devres_release_group(struct device *dev, void *id);
+
+/* managed kzalloc/kfree for device drivers, no kmalloc, always use kzalloc */
+extern void *devm_kzalloc(struct device *dev, size_t size, gfp_t gfp);
+extern void devm_kfree(struct device *dev, void *p);
+
 struct device {
        struct klist            klist_children;
        struct klist_node       knode_parent;           /* node in sibling list */
@@ -397,6 +432,9 @@ struct device {
        /* arch specific additions */
        struct dev_archdata     archdata;
 
+       spinlock_t              devres_lock;
+       struct list_head        devres_head;
+
        /* class_device migration path */
        struct list_head        node;
        struct class            *class;
index ff203c465fed260f75de3c0d80a71e7d90f101d2..9a663c6db16a09faf68fe0d544e1c41695a9a6ef 100644 (file)
@@ -66,6 +66,33 @@ dma_mark_declared_memory_occupied(struct device *dev,
 }
 #endif
 
-#endif
+/*
+ * Managed DMA API
+ */
+extern void *dmam_alloc_coherent(struct device *dev, size_t size,
+                                dma_addr_t *dma_handle, gfp_t gfp);
+extern void dmam_free_coherent(struct device *dev, size_t size, void *vaddr,
+                              dma_addr_t dma_handle);
+extern void *dmam_alloc_noncoherent(struct device *dev, size_t size,
+                                   dma_addr_t *dma_handle, gfp_t gfp);
+extern void dmam_free_noncoherent(struct device *dev, size_t size, void *vaddr,
+                                 dma_addr_t dma_handle);
+#ifdef ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY
+extern int dmam_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
+                                       dma_addr_t device_addr, size_t size,
+                                       int flags);
+extern void dmam_release_declared_memory(struct device *dev);
+#else /* ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY */
+static inline int dmam_declare_coherent_memory(struct device *dev,
+                               dma_addr_t bus_addr, dma_addr_t device_addr,
+                               size_t size, gfp_t gfp)
+{
+       return 0;
+}
 
+static inline void dmam_release_declared_memory(struct device *dev)
+{
+}
+#endif /* ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY */
 
+#endif
index 76f12f46db7f655f545b13a6e9c3c5c0b58acc30..022e34fcbd1bf6b56cb5f0dbb250a28885797f80 100644 (file)
@@ -24,5 +24,12 @@ void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags,
 
 void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t addr);
 
+/*
+ * Managed DMA pool
+ */
+struct dma_pool *dmam_pool_create(const char *name, struct device *dev,
+                                 size_t size, size_t align, size_t allocation);
+void dmam_pool_destroy(struct dma_pool *pool);
+
 #endif
 
index 10b6a6fd5837c58b48746a7ecbd0391207c817d4..02bba040fcfb7e5e058b5c25d6bb138873ede572 100644 (file)
@@ -113,7 +113,7 @@ struct accessdata_dn
  * DECnet logical link information structure
  */
 struct linkinfo_dn {
-        __le16  idn_segsize;    /* Segment size for link */
+        __u16  idn_segsize;    /* Segment size for link */
         __u8   idn_linkstate;  /* Logical link state    */
 };
 
index 278ef4495819509748a2e1b3c53651202bbcf1f9..dfed8009ebff4913621ec00a8bbabb47af5f3d19 100644 (file)
@@ -36,7 +36,7 @@ static inline struct efs_sb_info *SUPER_INFO(struct super_block *sb)
 
 struct statfs;
 
-extern struct inode_operations efs_dir_inode_operations;
+extern const struct inode_operations efs_dir_inode_operations;
 extern const struct file_operations efs_dir_operations;
 extern const struct address_space_operations efs_symlink_aops;
 
index 11cca1bdc0c79840ab69c12b2a538d2a9770fb65..4eb18ac510aeb2e2be36b980da99751224f28e59 100644 (file)
@@ -868,16 +868,16 @@ do {                                                              \
 extern const struct file_operations ext3_dir_operations;
 
 /* file.c */
-extern struct inode_operations ext3_file_inode_operations;
+extern const struct inode_operations ext3_file_inode_operations;
 extern const struct file_operations ext3_file_operations;
 
 /* namei.c */
-extern struct inode_operations ext3_dir_inode_operations;
-extern struct inode_operations ext3_special_inode_operations;
+extern const struct inode_operations ext3_dir_inode_operations;
+extern const struct inode_operations ext3_special_inode_operations;
 
 /* symlink.c */
-extern struct inode_operations ext3_symlink_inode_operations;
-extern struct inode_operations ext3_fast_symlink_inode_operations;
+extern const struct inode_operations ext3_symlink_inode_operations;
+extern const struct inode_operations ext3_fast_symlink_inode_operations;
 
 
 #endif /* __KERNEL__ */
index 498503ee613d9d6d6b08d59f75f898320d1cf4ca..54c576d414c32b83d993942188e66b4171962f85 100644 (file)
@@ -955,16 +955,16 @@ do {                                                              \
 extern const struct file_operations ext4_dir_operations;
 
 /* file.c */
-extern struct inode_operations ext4_file_inode_operations;
+extern const struct inode_operations ext4_file_inode_operations;
 extern const struct file_operations ext4_file_operations;
 
 /* namei.c */
-extern struct inode_operations ext4_dir_inode_operations;
-extern struct inode_operations ext4_special_inode_operations;
+extern const struct inode_operations ext4_dir_inode_operations;
+extern const struct inode_operations ext4_special_inode_operations;
 
 /* symlink.c */
-extern struct inode_operations ext4_symlink_inode_operations;
-extern struct inode_operations ext4_fast_symlink_inode_operations;
+extern const struct inode_operations ext4_symlink_inode_operations;
+extern const struct inode_operations ext4_fast_symlink_inode_operations;
 
 /* extents.c */
 extern int ext4_ext_tree_init(handle_t *handle, struct inode *);
index 64177ec9a01910e71adee4d777ddb1ad49e29e6d..a78e25683f820bc056e80db62814180ee063e413 100644 (file)
 #define FB_AUX_TEXT_S3_MMIO    2       /* S3 MMIO fasttext */
 #define FB_AUX_TEXT_MGA_STEP16 3       /* MGA Millenium I: text, attr, 14 reserved bytes */
 #define FB_AUX_TEXT_MGA_STEP8  4       /* other MGAs:      text, attr,  6 reserved bytes */
+#define FB_AUX_TEXT_SVGA_GROUP 8       /* 8-15: SVGA tileblit compatible modes */
+#define FB_AUX_TEXT_SVGA_MASK  7       /* lower three bits says step */
+#define FB_AUX_TEXT_SVGA_STEP2 8       /* SVGA text mode:  text, attr */
+#define FB_AUX_TEXT_SVGA_STEP4 9       /* SVGA text mode:  text, attr,  2 reserved bytes */
+#define FB_AUX_TEXT_SVGA_STEP8 10      /* SVGA text mode:  text, attr,  6 reserved bytes */
+#define FB_AUX_TEXT_SVGA_STEP16        11      /* SVGA text mode:  text, attr, 14 reserved bytes */
+#define FB_AUX_TEXT_SVGA_LAST  15      /* reserved up to 15 */
 
 #define FB_AUX_VGA_PLANES_VGA4         0       /* 16 color planes (EGA/VGA) */
 #define FB_AUX_VGA_PLANES_CFB4         1       /* CFB4 in planes (VGA) */
@@ -945,25 +952,26 @@ extern unsigned char *fb_ddc_read(struct i2c_adapter *adapter);
 /* drivers/video/modedb.c */
 #define VESA_MODEDB_SIZE 34
 extern void fb_var_to_videomode(struct fb_videomode *mode,
-                               struct fb_var_screeninfo *var);
+                               const struct fb_var_screeninfo *var);
 extern void fb_videomode_to_var(struct fb_var_screeninfo *var,
-                               struct fb_videomode *mode);
-extern int fb_mode_is_equal(struct fb_videomode *mode1,
-                           struct fb_videomode *mode2);
-extern int fb_add_videomode(struct fb_videomode *mode, struct list_head *head);
-extern void fb_delete_videomode(struct fb_videomode *mode,
+                               const struct fb_videomode *mode);
+extern int fb_mode_is_equal(const struct fb_videomode *mode1,
+                           const struct fb_videomode *mode2);
+extern int fb_add_videomode(const struct fb_videomode *mode,
+                           struct list_head *head);
+extern void fb_delete_videomode(const struct fb_videomode *mode,
                                struct list_head *head);
-extern struct fb_videomode *fb_match_mode(struct fb_var_screeninfo *var,
-                                         struct list_head *head);
-extern struct fb_videomode *fb_find_best_mode(struct fb_var_screeninfo *var,
-                                             struct list_head *head);
-extern struct fb_videomode *fb_find_nearest_mode(struct fb_videomode *mode,
-                                                struct list_head *head);
+extern const struct fb_videomode *fb_match_mode(const struct fb_var_screeninfo *var,
+                                               struct list_head *head);
+extern const struct fb_videomode *fb_find_best_mode(const struct fb_var_screeninfo *var,
+                                                   struct list_head *head);
+extern const struct fb_videomode *fb_find_nearest_mode(const struct fb_videomode *mode,
+                                                      struct list_head *head);
 extern void fb_destroy_modelist(struct list_head *head);
-extern void fb_videomode_to_modelist(struct fb_videomode *modedb, int num,
+extern void fb_videomode_to_modelist(const struct fb_videomode *modedb, int num,
                                     struct list_head *head);
-extern struct fb_videomode *fb_find_best_display(struct fb_monspecs *specs,
-                                                struct list_head *head);
+extern const struct fb_videomode *fb_find_best_display(const struct fb_monspecs *specs,
+                                                      struct list_head *head);
 
 /* drivers/video/fbcmap.c */
 extern int fb_alloc_cmap(struct fb_cmap *cmap, int len, int transp);
index 1410e5330c8daafb1a9e781dca9c56c5e1c4a0e5..86ec3f4a7da6ec0cc33825c6052c9bbe1c4dbf9a 100644 (file)
@@ -169,6 +169,7 @@ extern int dir_notify_enable;
 #define IS_DIRSYNC(inode)      (__IS_FLG(inode, MS_SYNCHRONOUS|MS_DIRSYNC) || \
                                        ((inode)->i_flags & (S_SYNC|S_DIRSYNC)))
 #define IS_MANDLOCK(inode)     __IS_FLG(inode, MS_MANDLOCK)
+#define IS_NOATIME(inode)   __IS_FLG(inode, MS_RDONLY|MS_NOATIME)
 
 #define IS_NOQUOTA(inode)      ((inode)->i_flags & S_NOQUOTA)
 #define IS_APPEND(inode)       ((inode)->i_flags & S_APPEND)
@@ -550,7 +551,7 @@ struct inode {
        spinlock_t              i_lock; /* i_blocks, i_bytes, maybe i_size */
        struct mutex            i_mutex;
        struct rw_semaphore     i_alloc_sem;
-       struct inode_operations *i_op;
+       const struct inode_operations   *i_op;
        const struct file_operations    *i_fop; /* former ->i_op->default_file_ops */
        struct super_block      *i_sb;
        struct file_lock        *i_flock;
@@ -906,7 +907,7 @@ struct super_block {
        unsigned char           s_dirt;
        unsigned long long      s_maxbytes;     /* Max file size */
        struct file_system_type *s_type;
-       struct super_operations *s_op;
+       const struct super_operations   *s_op;
        struct dquot_operations *dq_op;
        struct quotactl_ops     *s_qcop;
        struct export_operations *s_export_op;
@@ -1382,7 +1383,7 @@ struct super_block *sget(struct file_system_type *type,
                        int (*set)(struct super_block *,void *),
                        void *data);
 extern int get_sb_pseudo(struct file_system_type *, char *,
-       struct super_operations *ops, unsigned long,
+       const struct super_operations *ops, unsigned long,
        struct vfsmount *mnt);
 extern int simple_set_mnt(struct vfsmount *mnt, struct super_block *sb);
 int __put_super(struct super_block *sb);
@@ -1572,12 +1573,18 @@ extern int invalidate_partition(struct gendisk *, int);
 extern int invalidate_inodes(struct super_block *);
 unsigned long invalidate_mapping_pages(struct address_space *mapping,
                                        pgoff_t start, pgoff_t end);
-unsigned long invalidate_inode_pages(struct address_space *mapping);
+
+static inline unsigned long __deprecated
+invalidate_inode_pages(struct address_space *mapping)
+{
+       return invalidate_mapping_pages(mapping, 0, ~0UL);
+}
+
 static inline void invalidate_remote_inode(struct inode *inode)
 {
        if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
            S_ISLNK(inode->i_mode))
-               invalidate_inode_pages(inode->i_mapping);
+               invalidate_mapping_pages(inode->i_mapping, 0, -1);
 }
 extern int invalidate_inode_pages2(struct address_space *mapping);
 extern int invalidate_inode_pages2_range(struct address_space *mapping,
@@ -1681,7 +1688,6 @@ extern struct inode *new_inode(struct super_block *);
 extern int __remove_suid(struct dentry *, int);
 extern int should_remove_suid(struct dentry *);
 extern int remove_suid(struct dentry *);
-extern void remove_dquot_ref(struct super_block *, int, struct list_head *);
 
 extern void __insert_inode_hash(struct inode *, unsigned long hashval);
 extern void remove_inode_hash(struct inode *);
@@ -1822,7 +1828,7 @@ extern void page_put_link(struct dentry *, struct nameidata *, void *);
 extern int __page_symlink(struct inode *inode, const char *symname, int len,
                gfp_t gfp_mask);
 extern int page_symlink(struct inode *inode, const char *symname, int len);
-extern struct inode_operations page_symlink_inode_operations;
+extern const struct inode_operations page_symlink_inode_operations;
 extern int generic_readlink(struct dentry *, char __user *, int);
 extern void generic_fillattr(struct inode *, struct kstat *);
 extern int vfs_getattr(struct vfsmount *, struct dentry *, struct kstat *);
@@ -1867,7 +1873,7 @@ extern int simple_commit_write(struct file *file, struct page *page,
 extern struct dentry *simple_lookup(struct inode *, struct dentry *, struct nameidata *);
 extern ssize_t generic_read_dir(struct file *, char __user *, size_t, loff_t *);
 extern const struct file_operations simple_dir_operations;
-extern struct inode_operations simple_dir_inode_operations;
+extern const struct inode_operations simple_dir_inode_operations;
 struct tree_descr { char *name; const struct file_operations *ops; int mode; };
 struct dentry *d_alloc_name(struct dentry *, const char *);
 extern int simple_fill_super(struct super_block *, int, struct tree_descr *);
index 0a022b2f63fc0fa95fa35df16784e2fcaef225b3..2c65da7cabb2a25acc1c42c067a3770872f29141 100644 (file)
@@ -20,7 +20,11 @@ enum {
        LINUX_EXTENDED_PARTITION = 0x85,
        WIN98_EXTENDED_PARTITION = 0x0f,
 
+       SUN_WHOLE_DISK = DOS_EXTENDED_PARTITION,
+
        LINUX_SWAP_PARTITION = 0x82,
+       LINUX_DATA_PARTITION = 0x83,
+       LINUX_LVM_PARTITION = 0x8e,
        LINUX_RAID_PARTITION = 0xfd,    /* autodetect RAID partition */
 
        SOLARIS_X86_PARTITION = LINUX_SWAP_PARTITION,
@@ -400,10 +404,14 @@ struct unixware_disklabel {
 
 #ifdef __KERNEL__
 
+#define ADDPART_FLAG_NONE      0
+#define ADDPART_FLAG_RAID      1
+#define ADDPART_FLAG_WHOLEDISK 2
+
 char *disk_name (struct gendisk *hd, int part, char *buf);
 
 extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev);
-extern void add_partition(struct gendisk *, int, sector_t, sector_t);
+extern void add_partition(struct gendisk *, int, sector_t, sector_t, int);
 extern void delete_partition(struct gendisk *, int);
 
 extern struct gendisk *alloc_disk_node(int minors, int node_id);
index 063799ea6be084c6125633c6c9f6e2cc72bd837e..2a7d15bcde4684a8b40a4f7aaf65e2e0177faf39 100644 (file)
@@ -85,8 +85,10 @@ struct vm_area_struct;
 
 static inline enum zone_type gfp_zone(gfp_t flags)
 {
+#ifdef CONFIG_ZONE_DMA
        if (flags & __GFP_DMA)
                return ZONE_DMA;
+#endif
 #ifdef CONFIG_ZONE_DMA32
        if (flags & __GFP_DMA32)
                return ZONE_DMA32;
index 70ad09c8ad1e6fe43b47e8d5a867f60db733cb42..5dc4a316ca370510bf5e661b0f2eff9ed4d8f107 100644 (file)
@@ -9,8 +9,6 @@
  *    published by the Free Software Foundation; either version 2 of
  *    the License, or (at your option) any later version.
  * =====================================================================
- * Version: $Id: gigaset_dev.h,v 1.4.4.4 2005/11/21 22:28:09 hjlipp Exp $
- * =====================================================================
  */
 
 #ifndef GIGASET_INTERFACE_H
index 612472aaa79c1607159794a2257356bde263e9a0..7803014f3a11bae4f353e7b042c0e1835997c7be 100644 (file)
@@ -106,13 +106,18 @@ static inline void account_system_vtime(struct task_struct *tsk)
  * always balanced, so the interrupted value of ->hardirq_context
  * will always be restored.
  */
-#define irq_enter()                                    \
+#define __irq_enter()                                  \
        do {                                            \
                account_system_vtime(current);          \
                add_preempt_count(HARDIRQ_OFFSET);      \
                trace_hardirq_enter();                  \
        } while (0)
 
+/*
+ * Enter irq context (on NO_HZ, update jiffies):
+ */
+extern void irq_enter(void);
+
 /*
  * Exit irq context without processing softirqs:
  */
@@ -128,7 +133,7 @@ static inline void account_system_vtime(struct task_struct *tsk)
  */
 extern void irq_exit(void);
 
-#define nmi_enter()            do { lockdep_off(); irq_enter(); } while (0)
+#define nmi_enter()            do { lockdep_off(); __irq_enter(); } while (0)
 #define nmi_exit()             do { __irq_exit(); lockdep_on(); } while (0)
 
 #endif /* LINUX_HARDIRQ_H */
index fca93025ab5191db9a1d4aeb9734dbfa2f574a20..37f9279192a998f50641d81056a57692a8eaf538 100644 (file)
 #include <linux/list.h>
 #include <linux/wait.h>
 
+struct hrtimer_clock_base;
+struct hrtimer_cpu_base;
+
 /*
  * Mode arguments of xxx_hrtimer functions:
  */
 enum hrtimer_mode {
-       HRTIMER_ABS,    /* Time value is absolute */
-       HRTIMER_REL,    /* Time value is relative to now */
+       HRTIMER_MODE_ABS,       /* Time value is absolute */
+       HRTIMER_MODE_REL,       /* Time value is relative to now */
 };
 
+/*
+ * Return values for the callback function
+ */
 enum hrtimer_restart {
-       HRTIMER_NORESTART,
-       HRTIMER_RESTART,
+       HRTIMER_NORESTART,      /* Timer is not restarted */
+       HRTIMER_RESTART,        /* Timer must be restarted */
 };
 
-#define HRTIMER_INACTIVE       ((void *)1UL)
+/*
+ * hrtimer callback modes:
+ *
+ *     HRTIMER_CB_SOFTIRQ:             Callback must run in softirq context
+ *     HRTIMER_CB_IRQSAFE:             Callback may run in hardirq context
+ *     HRTIMER_CB_IRQSAFE_NO_RESTART:  Callback may run in hardirq context and
+ *                                     does not restart the timer
+ *     HRTIMER_CB_IRQSAFE_NO_SOFTIRQ:  Callback must run in softirq context
+ *                                     Special mode for tick emultation
+ */
+enum hrtimer_cb_mode {
+       HRTIMER_CB_SOFTIRQ,
+       HRTIMER_CB_IRQSAFE,
+       HRTIMER_CB_IRQSAFE_NO_RESTART,
+       HRTIMER_CB_IRQSAFE_NO_SOFTIRQ,
+};
 
-struct hrtimer_base;
+/*
+ * Values to track state of the timer
+ *
+ * Possible states:
+ *
+ * 0x00                inactive
+ * 0x01                enqueued into rbtree
+ * 0x02                callback function running
+ * 0x04                callback pending (high resolution mode)
+ *
+ * Special case:
+ * 0x03                callback function running and enqueued
+ *             (was requeued on another CPU)
+ * The "callback function running and enqueued" status is only possible on
+ * SMP. It happens for example when a posix timer expired and the callback
+ * queued a signal. Between dropping the lock which protects the posix timer
+ * and reacquiring the base lock of the hrtimer, another CPU can deliver the
+ * signal and rearm the timer. We have to preserve the callback running state,
+ * as otherwise the timer could be removed before the softirq code finishes the
+ * the handling of the timer.
+ *
+ * The HRTIMER_STATE_ENQUEUE bit is always or'ed to the current state to
+ * preserve the HRTIMER_STATE_CALLBACK bit in the above scenario.
+ *
+ * All state transitions are protected by cpu_base->lock.
+ */
+#define HRTIMER_STATE_INACTIVE 0x00
+#define HRTIMER_STATE_ENQUEUED 0x01
+#define HRTIMER_STATE_CALLBACK 0x02
+#define HRTIMER_STATE_PENDING  0x04
 
 /**
  * struct hrtimer - the basic hrtimer structure
@@ -46,14 +96,34 @@ struct hrtimer_base;
  *             which the timer is based.
  * @function:  timer expiry callback function
  * @base:      pointer to the timer base (per cpu and per clock)
+ * @state:     state information (See bit values above)
+ * @cb_mode:   high resolution timer feature to select the callback execution
+ *              mode
+ * @cb_entry:  list head to enqueue an expired timer into the callback list
+ * @start_site:        timer statistics field to store the site where the timer
+ *             was started
+ * @start_comm: timer statistics field to store the name of the process which
+ *             started the timer
+ * @start_pid: timer statistics field to store the pid of the task which
+ *             started the timer
  *
- * The hrtimer structure must be initialized by init_hrtimer_#CLOCKTYPE()
+ * The hrtimer structure must be initialized by hrtimer_init()
  */
 struct hrtimer {
-       struct rb_node          node;
-       ktime_t                 expires;
-       int                     (*function)(struct hrtimer *);
-       struct hrtimer_base     *base;
+       struct rb_node                  node;
+       ktime_t                         expires;
+       enum hrtimer_restart            (*function)(struct hrtimer *);
+       struct hrtimer_clock_base       *base;
+       unsigned long                   state;
+#ifdef CONFIG_HIGH_RES_TIMERS
+       enum hrtimer_cb_mode            cb_mode;
+       struct list_head                cb_entry;
+#endif
+#ifdef CONFIG_TIMER_STATS
+       void                            *start_site;
+       char                            start_comm[16];
+       int                             start_pid;
+#endif
 };
 
 /**
@@ -70,37 +140,114 @@ struct hrtimer_sleeper {
 
 /**
  * struct hrtimer_base - the timer base for a specific clock
- * @index:             clock type index for per_cpu support when moving a timer
- *                     to a base on another cpu.
- * @lock:              lock protecting the base and associated timers
+ * @index:             clock type index for per_cpu support when moving a
+ *                     timer to a base on another cpu.
  * @active:            red black tree root node for the active timers
  * @first:             pointer to the timer node which expires first
  * @resolution:                the resolution of the clock, in nanoseconds
  * @get_time:          function to retrieve the current time of the clock
  * @get_softirq_time:  function to retrieve the current time from the softirq
- * @curr_timer:                the timer which is executing a callback right now
  * @softirq_time:      the time when running the hrtimer queue in the softirq
- * @lock_key:          the lock_class_key for use with lockdep
+ * @cb_pending:                list of timers where the callback is pending
+ * @offset:            offset of this clock to the monotonic base
+ * @reprogram:         function to reprogram the timer event
  */
-struct hrtimer_base {
+struct hrtimer_clock_base {
+       struct hrtimer_cpu_base *cpu_base;
        clockid_t               index;
-       spinlock_t              lock;
        struct rb_root          active;
        struct rb_node          *first;
        ktime_t                 resolution;
        ktime_t                 (*get_time)(void);
        ktime_t                 (*get_softirq_time)(void);
-       struct hrtimer          *curr_timer;
        ktime_t                 softirq_time;
-       struct lock_class_key lock_key;
+#ifdef CONFIG_HIGH_RES_TIMERS
+       ktime_t                 offset;
+       int                     (*reprogram)(struct hrtimer *t,
+                                            struct hrtimer_clock_base *b,
+                                            ktime_t n);
+#endif
+};
+
+#define HRTIMER_MAX_CLOCK_BASES 2
+
+/*
+ * struct hrtimer_cpu_base - the per cpu clock bases
+ * @lock:              lock protecting the base and associated clock bases
+ *                     and timers
+ * @lock_key:          the lock_class_key for use with lockdep
+ * @clock_base:                array of clock bases for this cpu
+ * @curr_timer:                the timer which is executing a callback right now
+ * @expires_next:      absolute time of the next event which was scheduled
+ *                     via clock_set_next_event()
+ * @hres_active:       State of high resolution mode
+ * @check_clocks:      Indictator, when set evaluate time source and clock
+ *                     event devices whether high resolution mode can be
+ *                     activated.
+ * @cb_pending:                Expired timers are moved from the rbtree to this
+ *                     list in the timer interrupt. The list is processed
+ *                     in the softirq.
+ * @nr_events:         Total number of timer interrupt events
+ */
+struct hrtimer_cpu_base {
+       spinlock_t                      lock;
+       struct lock_class_key           lock_key;
+       struct hrtimer_clock_base       clock_base[HRTIMER_MAX_CLOCK_BASES];
+#ifdef CONFIG_HIGH_RES_TIMERS
+       ktime_t                         expires_next;
+       int                             hres_active;
+       struct list_head                cb_pending;
+       unsigned long                   nr_events;
+#endif
 };
 
+#ifdef CONFIG_HIGH_RES_TIMERS
+struct clock_event_device;
+
+extern void clock_was_set(void);
+extern void hrtimer_interrupt(struct clock_event_device *dev);
+
+/*
+ * In high resolution mode the time reference must be read accurate
+ */
+static inline ktime_t hrtimer_cb_get_time(struct hrtimer *timer)
+{
+       return timer->base->get_time();
+}
+
+/*
+ * The resolution of the clocks. The resolution value is returned in
+ * the clock_getres() system call to give application programmers an
+ * idea of the (in)accuracy of timers. Timer values are rounded up to
+ * this resolution values.
+ */
+# define KTIME_HIGH_RES                (ktime_t) { .tv64 = 1 }
+# define KTIME_MONOTONIC_RES   KTIME_HIGH_RES
+
+#else
+
+# define KTIME_MONOTONIC_RES   KTIME_LOW_RES
+
 /*
  * clock_was_set() is a NOP for non- high-resolution systems. The
  * time-sorted order guarantees that a timer does not expire early and
  * is expired in the next softirq when the clock was advanced.
  */
-#define clock_was_set()                do { } while (0)
+static inline void clock_was_set(void) { }
+
+/*
+ * In non high resolution mode the time reference is taken from
+ * the base softirq time variable.
+ */
+static inline ktime_t hrtimer_cb_get_time(struct hrtimer *timer)
+{
+       return timer->base->softirq_time;
+}
+
+#endif
+
+extern ktime_t ktime_get(void);
+extern ktime_t ktime_get_real(void);
 
 /* Exported timer functions: */
 
@@ -114,19 +261,33 @@ extern int hrtimer_start(struct hrtimer *timer, ktime_t tim,
 extern int hrtimer_cancel(struct hrtimer *timer);
 extern int hrtimer_try_to_cancel(struct hrtimer *timer);
 
-#define hrtimer_restart(timer) hrtimer_start((timer), (timer)->expires, HRTIMER_ABS)
+static inline int hrtimer_restart(struct hrtimer *timer)
+{
+       return hrtimer_start(timer, timer->expires, HRTIMER_MODE_ABS);
+}
 
 /* Query timers: */
 extern ktime_t hrtimer_get_remaining(const struct hrtimer *timer);
 extern int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp);
 
-#ifdef CONFIG_NO_IDLE_HZ
 extern ktime_t hrtimer_get_next_event(void);
-#endif
 
+/*
+ * A timer is active, when it is enqueued into the rbtree or the callback
+ * function is running.
+ */
 static inline int hrtimer_active(const struct hrtimer *timer)
 {
-       return rb_parent(&timer->node) != &timer->node;
+       return timer->state != HRTIMER_STATE_INACTIVE;
+}
+
+/*
+ * Helper function to check, whether the timer is on one of the queues
+ */
+static inline int hrtimer_is_queued(struct hrtimer *timer)
+{
+       return timer->state &
+               (HRTIMER_STATE_ENQUEUED | HRTIMER_STATE_PENDING);
 }
 
 /* Forward a hrtimer so it expires after now: */
@@ -149,4 +310,53 @@ extern void hrtimer_run_queues(void);
 /* Bootup initialization: */
 extern void __init hrtimers_init(void);
 
+#if BITS_PER_LONG < 64
+extern unsigned long ktime_divns(const ktime_t kt, s64 div);
+#else /* BITS_PER_LONG < 64 */
+# define ktime_divns(kt, div)          (unsigned long)((kt).tv64 / (div))
+#endif
+
+/* Show pending timers: */
+extern void sysrq_timer_list_show(void);
+
+/*
+ * Timer-statistics info:
+ */
+#ifdef CONFIG_TIMER_STATS
+
+extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
+                                    void *timerf, char * comm);
+
+static inline void timer_stats_account_hrtimer(struct hrtimer *timer)
+{
+       timer_stats_update_stats(timer, timer->start_pid, timer->start_site,
+                                timer->function, timer->start_comm);
+}
+
+extern void __timer_stats_hrtimer_set_start_info(struct hrtimer *timer,
+                                                void *addr);
+
+static inline void timer_stats_hrtimer_set_start_info(struct hrtimer *timer)
+{
+       __timer_stats_hrtimer_set_start_info(timer, __builtin_return_address(0));
+}
+
+static inline void timer_stats_hrtimer_clear_start_info(struct hrtimer *timer)
+{
+       timer->start_site = NULL;
+}
+#else
+static inline void timer_stats_account_hrtimer(struct hrtimer *timer)
+{
+}
+
+static inline void timer_stats_hrtimer_set_start_info(struct hrtimer *timer)
+{
+}
+
+static inline void timer_stats_hrtimer_clear_start_info(struct hrtimer *timer)
+{
+}
+#endif
+
 #endif
index 6e7ec4c76178d9bd535de52762bc9017496c7797..9c21dc793d7b160d525a78841ecdc98f6cf89dca 100644 (file)
 #define I2C_HW_SMBUS_PIIX4     0x040000
 #define I2C_HW_SMBUS_ALI15X3   0x040001
 #define I2C_HW_SMBUS_VIA2      0x040002
-#define I2C_HW_SMBUS_VOODOO3   0x040003
 #define I2C_HW_SMBUS_I801      0x040004
 #define I2C_HW_SMBUS_AMD756    0x040005
 #define I2C_HW_SMBUS_SIS5595   0x040006
 #define I2C_HW_SMBUS_OV519     0x040010 /* OV519 USB 1.1 webcam IC */
 #define I2C_HW_SMBUS_OVFX2     0x040011 /* Cypress/OmniVision FX2 webcam */
 #define I2C_HW_SMBUS_CAFE      0x040012 /* Marvell 88ALP01 "CAFE" cam  */
+#define I2C_HW_SMBUS_ALI1563   0x040013
 
 /* --- ISA pseudo-adapter                                              */
 #define I2C_HW_ISA             0x050000
 
-/* --- IPMI pseudo-adapter                                             */
-#define I2C_HW_IPMI            0x0b0000
-
 /* --- IPMB adapter                                            */
 #define I2C_HW_IPMB            0x0c0000
 
index 71e50d3e492f2ccd1ed852ae959c759c67ed8830..9428092017e346dea02ca6442da258859ff39342 100644 (file)
@@ -125,7 +125,12 @@ struct i2c_driver {
         * it must be freed here.
         */
        int (*detach_client)(struct i2c_client *);
-       
+
+       /* driver model interfaces that don't relate to enumeration  */
+       void (*shutdown)(struct i2c_client *);
+       int (*suspend)(struct i2c_client *, pm_message_t mesg);
+       int (*resume)(struct i2c_client *);
+
        /* a ioctl like command that can be used to perform specific functions
         * with the device.
         */
index 5a593a1dec1efd7f53ab6ac58349db9b996157d2..e290a010e3f2dec2555f7c2f243b20702a86e5fe 100644 (file)
@@ -67,7 +67,8 @@ extern initcall_t __con_initcall_start[], __con_initcall_end[];
 extern initcall_t __security_initcall_start[], __security_initcall_end[];
 
 /* Defined in init/main.c */
-extern char saved_command_line[];
+extern char __initdata boot_command_line[];
+extern char *saved_command_line;
 extern unsigned int reset_devices;
 
 /* used by init/main.c */
@@ -164,7 +165,7 @@ struct obs_kernel_param {
 #define early_param(str, fn)                                   \
        __setup_param(str, fn, fn, 1)
 
-/* Relies on saved_command_line being set */
+/* Relies on boot_command_line being set */
 void __init parse_early_param(void);
 #endif /* __ASSEMBLY__ */
 
@@ -172,7 +173,7 @@ void __init parse_early_param(void);
  * module_init() - driver initialization entry point
  * @x: function to be run at kernel boot time or module insertion
  * 
- * module_init() will either be called during do_initcalls (if
+ * module_init() will either be called during do_initcalls() (if
  * builtin) or at module insertion time (if a module).  There can only
  * be one per module.
  */
index 6383d2d83bb0c5b12e233c5fbfe53e6e47c49578..a2d95ff50e9bd71eb741d5ef9a293574245ab244 100644 (file)
@@ -66,7 +66,7 @@
        .cpu_timers     = INIT_CPU_TIMERS(sig.cpu_timers),              \
        .rlim           = INIT_RLIMITS,                                 \
        .pgrp           = 1,                                            \
-       .tty_old_pgrp   = 0,                                            \
+       .tty_old_pgrp   = NULL,                                         \
        { .__session      = 1},                                         \
 }
 
index e36e86c869fb4e6576e3c67fd1febd0d16ba1ea2..e5ea1411050bfec4c8c1f9d2c6ea0899159cc668 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/sched.h>
 #include <linux/irqflags.h>
 #include <linux/bottom_half.h>
+#include <linux/device.h>
 #include <asm/atomic.h>
 #include <asm/ptrace.h>
 #include <asm/system.h>
@@ -41,6 +42,8 @@
  * IRQF_SHARED - allow sharing the irq among several devices
  * IRQF_PROBE_SHARED - set by callers when they expect sharing mismatches to occur
  * IRQF_TIMER - Flag to mark this interrupt as timer interrupt
+ * IRQF_PERCPU - Interrupt is per cpu
+ * IRQF_NOBALANCING - Flag to exclude this interrupt from irq balancing
  */
 #define IRQF_DISABLED          0x00000020
 #define IRQF_SAMPLE_RANDOM     0x00000040
@@ -48,6 +51,7 @@
 #define IRQF_PROBE_SHARED      0x00000100
 #define IRQF_TIMER             0x00000200
 #define IRQF_PERCPU            0x00000400
+#define IRQF_NOBALANCING       0x00000800
 
 /*
  * Migration helpers. Scheduled for removal in 1/2007
@@ -83,6 +87,11 @@ extern int request_irq(unsigned int, irq_handler_t handler,
                       unsigned long, const char *, void *);
 extern void free_irq(unsigned int, void *);
 
+extern int devm_request_irq(struct device *dev, unsigned int irq,
+                           irq_handler_t handler, unsigned long irqflags,
+                           const char *devname, void *dev_id);
+extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id);
+
 /*
  * On lockdep we dont want to enable hardirqs in hardirq
  * context. Use local_irq_enable_in_hardirq() to annotate
@@ -233,6 +242,9 @@ enum
        BLOCK_SOFTIRQ,
        TASKLET_SOFTIRQ,
        SCHED_SOFTIRQ,
+#ifdef CONFIG_HIGH_RES_TIMERS
+       HRTIMER_SOFTIRQ,
+#endif
 };
 
 /* softirq mask and active fields moved to irq_cpustat_t in
index 81877ea39309aea73cef4a63a3212c69ab5c9131..c244a0cc9319bc37dfaee08d2c385b638dcbc990 100644 (file)
 #include <asm/io.h>
 #include <asm/page.h>
 
+struct device;
+
 void __iowrite32_copy(void __iomem *to, const void *from, size_t count);
 void __iowrite64_copy(void __iomem *to, const void *from, size_t count);
 
 int ioremap_page_range(unsigned long addr, unsigned long end,
                       unsigned long phys_addr, pgprot_t prot);
 
+/*
+ * Managed iomap interface
+ */
+void __iomem * devm_ioport_map(struct device *dev, unsigned long port,
+                              unsigned int nr);
+void devm_ioport_unmap(struct device *dev, void __iomem *addr);
+
+void __iomem * devm_ioremap(struct device *dev, unsigned long offset,
+                           unsigned long size);
+void __iomem * devm_ioremap_nocache(struct device *dev, unsigned long offset,
+                                   unsigned long size);
+void devm_iounmap(struct device *dev, void __iomem *addr);
+
 /**
  *     check_signature         -       find BIOS signatures
  *     @io_addr: mmio address to check
index 15228d79c5bc0c32f5189ceb28b6adff526f3423..6859a3b14088459fef9de4e373f36ea0009a0f3a 100644 (file)
@@ -137,4 +137,24 @@ static inline int __deprecated check_region(resource_size_t s,
 {
        return __check_region(&ioport_resource, s, n);
 }
+
+/* Wrappers for managed devices */
+struct device;
+#define devm_request_region(dev,start,n,name) \
+       __devm_request_region(dev, &ioport_resource, (start), (n), (name))
+#define devm_request_mem_region(dev,start,n,name) \
+       __devm_request_region(dev, &iomem_resource, (start), (n), (name))
+
+extern struct resource * __devm_request_region(struct device *dev,
+                               struct resource *parent, resource_size_t start,
+                               resource_size_t n, const char *name);
+
+#define devm_release_region(start,n) \
+       __devm_release_region(dev, &ioport_resource, (start), (n))
+#define devm_release_mem_region(start,n) \
+       __devm_release_region(dev, &iomem_resource, (start), (n))
+
+extern void __devm_release_region(struct device *dev, struct resource *parent,
+                                 resource_size_t start, resource_size_t n);
+
 #endif /* _LINUX_IOPORT_H */
index 5504b671357f2cf3adf476244cc81b06f84af137..1939d42c21d266f66ebfa62b4b20e0db1277a599 100644 (file)
@@ -31,7 +31,7 @@ typedef       void fastcall (*irq_flow_handler_t)(unsigned int irq,
 /*
  * IRQ line status.
  *
- * Bits 0-16 are reserved for the IRQF_* bits in linux/interrupt.h
+ * Bits 0-7 are reserved for the IRQF_* bits in linux/interrupt.h
  *
  * IRQ types
  */
@@ -45,28 +45,30 @@ typedef     void fastcall (*irq_flow_handler_t)(unsigned int irq,
 #define IRQ_TYPE_PROBE         0x00000010      /* Probing in progress */
 
 /* Internal flags */
-#define IRQ_INPROGRESS         0x00010000      /* IRQ handler active - do not enter! */
-#define IRQ_DISABLED           0x00020000      /* IRQ disabled - do not enter! */
-#define IRQ_PENDING            0x00040000      /* IRQ pending - replay on enable */
-#define IRQ_REPLAY             0x00080000      /* IRQ has been replayed but not acked yet */
-#define IRQ_AUTODETECT         0x00100000      /* IRQ is being autodetected */
-#define IRQ_WAITING            0x00200000      /* IRQ not yet seen - for autodetection */
-#define IRQ_LEVEL              0x00400000      /* IRQ level triggered */
-#define IRQ_MASKED             0x00800000      /* IRQ masked - shouldn't be seen again */
-#define IRQ_PER_CPU            0x01000000      /* IRQ is per CPU */
+#define IRQ_INPROGRESS         0x00000100      /* IRQ handler active - do not enter! */
+#define IRQ_DISABLED           0x00000200      /* IRQ disabled - do not enter! */
+#define IRQ_PENDING            0x00000400      /* IRQ pending - replay on enable */
+#define IRQ_REPLAY             0x00000800      /* IRQ has been replayed but not acked yet */
+#define IRQ_AUTODETECT         0x00001000      /* IRQ is being autodetected */
+#define IRQ_WAITING            0x00002000      /* IRQ not yet seen - for autodetection */
+#define IRQ_LEVEL              0x00004000      /* IRQ level triggered */
+#define IRQ_MASKED             0x00008000      /* IRQ masked - shouldn't be seen again */
+#define IRQ_PER_CPU            0x00010000      /* IRQ is per CPU */
+#define IRQ_NOPROBE            0x00020000      /* IRQ is not valid for probing */
+#define IRQ_NOREQUEST          0x00040000      /* IRQ cannot be requested */
+#define IRQ_NOAUTOEN           0x00080000      /* IRQ will not be enabled on request irq */
+#define IRQ_WAKEUP             0x00100000      /* IRQ triggers system wakeup */
+#define IRQ_MOVE_PENDING       0x00200000      /* need to re-target IRQ destination */
+#define IRQ_NO_BALANCING       0x00400000      /* IRQ is excluded from balancing */
+
 #ifdef CONFIG_IRQ_PER_CPU
 # define CHECK_IRQ_PER_CPU(var) ((var) & IRQ_PER_CPU)
+# define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING)
 #else
 # define CHECK_IRQ_PER_CPU(var) 0
+# define IRQ_NO_BALANCING_MASK IRQ_NO_BALANCING
 #endif
 
-#define IRQ_NOPROBE            0x02000000      /* IRQ is not valid for probing */
-#define IRQ_NOREQUEST          0x04000000      /* IRQ cannot be requested */
-#define IRQ_NOAUTOEN           0x08000000      /* IRQ will not be enabled on request irq */
-#define IRQ_DELAYED_DISABLE    0x10000000      /* IRQ disable (masking) happens delayed. */
-#define IRQ_WAKEUP             0x20000000      /* IRQ triggers system wakeup */
-#define IRQ_MOVE_PENDING       0x40000000      /* need to re-target IRQ destination */
-
 struct proc_dir_entry;
 struct msi_desc;
 
@@ -127,6 +129,7 @@ struct irq_chip {
  *
  * @handle_irq:                highlevel irq-events handler [if NULL, __do_IRQ()]
  * @chip:              low level interrupt hardware access
+ * @msi_desc:          MSI descriptor
  * @handler_data:      per-IRQ data for the irq_chip methods
  * @chip_data:         platform-specific per-chip private data for the chip
  *                     methods, to allow shared chip implementations
@@ -235,11 +238,21 @@ static inline void set_pending_irq(unsigned int irq, cpumask_t mask)
 
 #endif /* CONFIG_GENERIC_PENDING_IRQ */
 
+extern int irq_set_affinity(unsigned int irq, cpumask_t cpumask);
+extern int irq_can_set_affinity(unsigned int irq);
+
 #else /* CONFIG_SMP */
 
 #define move_native_irq(x)
 #define move_masked_irq(x)
 
+static inline int irq_set_affinity(unsigned int irq, cpumask_t cpumask)
+{
+       return -EINVAL;
+}
+
+static inline int irq_can_set_affinity(unsigned int irq) { return 0; }
+
 #endif /* CONFIG_SMP */
 
 #ifdef CONFIG_IRQBALANCE
@@ -261,6 +274,11 @@ static inline int select_smp_affinity(unsigned int irq)
 
 extern int no_irq_affinity;
 
+static inline int irq_balancing_disabled(unsigned int irq)
+{
+       return irq_desc[irq].status & IRQ_NO_BALANCING_MASK;
+}
+
 /* Handle irq action chains: */
 extern int handle_IRQ_event(unsigned int irq, struct irqaction *action);
 
index 0ec6e28bccd27b7d2861f5eb442d5b06610d97f3..c080f61fb024fb053e111a8878d9c7b12788c001 100644 (file)
@@ -142,13 +142,13 @@ static inline u64 get_jiffies_64(void)
  *
  * And some not so obvious.
  *
- * Note that we don't want to return MAX_LONG, because
+ * Note that we don't want to return LONG_MAX, because
  * for various timeout reasons we often end up having
  * to wait "jiffies+1" in order to guarantee that we wait
  * at _least_ "jiffies" - so "jiffies+1" had better still
  * be positive.
  */
-#define MAX_JIFFY_OFFSET ((~0UL >> 1)-1)
+#define MAX_JIFFY_OFFSET ((LONG_MAX >> 1)-1)
 
 /*
  * We want to do realistic conversions of time so we need to use the same
@@ -259,207 +259,23 @@ static inline u64 get_jiffies_64(void)
 #endif
 
 /*
- * Convert jiffies to milliseconds and back.
- *
- * Avoid unnecessary multiplications/divisions in the
- * two most common HZ cases:
- */
-static inline unsigned int jiffies_to_msecs(const unsigned long j)
-{
-#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
-       return (MSEC_PER_SEC / HZ) * j;
-#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
-       return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC);
-#else
-       return (j * MSEC_PER_SEC) / HZ;
-#endif
-}
-
-static inline unsigned int jiffies_to_usecs(const unsigned long j)
-{
-#if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ)
-       return (USEC_PER_SEC / HZ) * j;
-#elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC)
-       return (j + (HZ / USEC_PER_SEC) - 1)/(HZ / USEC_PER_SEC);
-#else
-       return (j * USEC_PER_SEC) / HZ;
-#endif
-}
-
-static inline unsigned long msecs_to_jiffies(const unsigned int m)
-{
-       if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
-               return MAX_JIFFY_OFFSET;
-#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
-       return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
-#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
-       return m * (HZ / MSEC_PER_SEC);
-#else
-       return (m * HZ + MSEC_PER_SEC - 1) / MSEC_PER_SEC;
-#endif
-}
-
-static inline unsigned long usecs_to_jiffies(const unsigned int u)
-{
-       if (u > jiffies_to_usecs(MAX_JIFFY_OFFSET))
-               return MAX_JIFFY_OFFSET;
-#if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ)
-       return (u + (USEC_PER_SEC / HZ) - 1) / (USEC_PER_SEC / HZ);
-#elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC)
-       return u * (HZ / USEC_PER_SEC);
-#else
-       return (u * HZ + USEC_PER_SEC - 1) / USEC_PER_SEC;
-#endif
-}
-
-/*
- * The TICK_NSEC - 1 rounds up the value to the next resolution.  Note
- * that a remainder subtract here would not do the right thing as the
- * resolution values don't fall on second boundries.  I.e. the line:
- * nsec -= nsec % TICK_NSEC; is NOT a correct resolution rounding.
- *
- * Rather, we just shift the bits off the right.
- *
- * The >> (NSEC_JIFFIE_SC - SEC_JIFFIE_SC) converts the scaled nsec
- * value to a scaled second value.
- */
-static __inline__ unsigned long
-timespec_to_jiffies(const struct timespec *value)
-{
-       unsigned long sec = value->tv_sec;
-       long nsec = value->tv_nsec + TICK_NSEC - 1;
-
-       if (sec >= MAX_SEC_IN_JIFFIES){
-               sec = MAX_SEC_IN_JIFFIES;
-               nsec = 0;
-       }
-       return (((u64)sec * SEC_CONVERSION) +
-               (((u64)nsec * NSEC_CONVERSION) >>
-                (NSEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC;
-
-}
-
-static __inline__ void
-jiffies_to_timespec(const unsigned long jiffies, struct timespec *value)
-{
-       /*
-        * Convert jiffies to nanoseconds and separate with
-        * one divide.
-        */
-       u64 nsec = (u64)jiffies * TICK_NSEC;
-       value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &value->tv_nsec);
-}
-
-/* Same for "timeval"
- *
- * Well, almost.  The problem here is that the real system resolution is
- * in nanoseconds and the value being converted is in micro seconds.
- * Also for some machines (those that use HZ = 1024, in-particular),
- * there is a LARGE error in the tick size in microseconds.
-
- * The solution we use is to do the rounding AFTER we convert the
- * microsecond part.  Thus the USEC_ROUND, the bits to be shifted off.
- * Instruction wise, this should cost only an additional add with carry
- * instruction above the way it was done above.
- */
-static __inline__ unsigned long
-timeval_to_jiffies(const struct timeval *value)
-{
-       unsigned long sec = value->tv_sec;
-       long usec = value->tv_usec;
-
-       if (sec >= MAX_SEC_IN_JIFFIES){
-               sec = MAX_SEC_IN_JIFFIES;
-               usec = 0;
-       }
-       return (((u64)sec * SEC_CONVERSION) +
-               (((u64)usec * USEC_CONVERSION + USEC_ROUND) >>
-                (USEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC;
-}
-
-static __inline__ void
-jiffies_to_timeval(const unsigned long jiffies, struct timeval *value)
-{
-       /*
-        * Convert jiffies to nanoseconds and separate with
-        * one divide.
-        */
-       u64 nsec = (u64)jiffies * TICK_NSEC;
-       long tv_usec;
-
-       value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &tv_usec);
-       tv_usec /= NSEC_PER_USEC;
-       value->tv_usec = tv_usec;
-}
-
-/*
- * Convert jiffies/jiffies_64 to clock_t and back.
+ * Convert various time units to each other:
  */
-static inline clock_t jiffies_to_clock_t(long x)
-{
-#if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
-       return x / (HZ / USER_HZ);
-#else
-       u64 tmp = (u64)x * TICK_NSEC;
-       do_div(tmp, (NSEC_PER_SEC / USER_HZ));
-       return (long)tmp;
-#endif
-}
-
-static inline unsigned long clock_t_to_jiffies(unsigned long x)
-{
-#if (HZ % USER_HZ)==0
-       if (x >= ~0UL / (HZ / USER_HZ))
-               return ~0UL;
-       return x * (HZ / USER_HZ);
-#else
-       u64 jif;
-
-       /* Don't worry about loss of precision here .. */
-       if (x >= ~0UL / HZ * USER_HZ)
-               return ~0UL;
-
-       /* .. but do try to contain it here */
-       jif = x * (u64) HZ;
-       do_div(jif, USER_HZ);
-       return jif;
-#endif
-}
-
-static inline u64 jiffies_64_to_clock_t(u64 x)
-{
-#if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
-       do_div(x, HZ / USER_HZ);
-#else
-       /*
-        * There are better ways that don't overflow early,
-        * but even this doesn't overflow in hundreds of years
-        * in 64 bits, so..
-        */
-       x *= TICK_NSEC;
-       do_div(x, (NSEC_PER_SEC / USER_HZ));
-#endif
-       return x;
-}
-
-static inline u64 nsec_to_clock_t(u64 x)
-{
-#if (NSEC_PER_SEC % USER_HZ) == 0
-       do_div(x, (NSEC_PER_SEC / USER_HZ));
-#elif (USER_HZ % 512) == 0
-       x *= USER_HZ/512;
-       do_div(x, (NSEC_PER_SEC / 512));
-#else
-       /*
-         * max relative error 5.7e-8 (1.8s per year) for USER_HZ <= 1024,
-         * overflow after 64.99 years.
-         * exact for HZ=60, 72, 90, 120, 144, 180, 300, 600, 900, ...
-         */
-       x *= 9;
-       do_div(x, (unsigned long)((9ull * NSEC_PER_SEC + (USER_HZ/2))
-                                 / USER_HZ));
-#endif
-       return x;
-}
+extern unsigned int jiffies_to_msecs(const unsigned long j);
+extern unsigned int jiffies_to_usecs(const unsigned long j);
+extern unsigned long msecs_to_jiffies(const unsigned int m);
+extern unsigned long usecs_to_jiffies(const unsigned int u);
+extern unsigned long timespec_to_jiffies(const struct timespec *value);
+extern void jiffies_to_timespec(const unsigned long jiffies,
+                               struct timespec *value);
+extern unsigned long timeval_to_jiffies(const struct timeval *value);
+extern void jiffies_to_timeval(const unsigned long jiffies,
+                              struct timeval *value);
+extern clock_t jiffies_to_clock_t(long x);
+extern unsigned long clock_t_to_jiffies(unsigned long x);
+extern u64 jiffies_64_to_clock_t(u64 x);
+extern u64 nsec_to_clock_t(u64 x);
+
+#define TIMESTAMP_SIZE 30
 
 #endif
index 63fb18dcac3075fb0e75eef911b947e49309b32d..9ddf25c21538e5ef103cc75d8fc2ecaa8536375c 100644 (file)
@@ -92,11 +92,6 @@ extern int cond_resched(void);
                (__x < 0) ? -__x : __x;         \
        })
 
-#define labs(x) ({                             \
-               long __x = (x);                 \
-               (__x < 0) ? -__x : __x;         \
-       })
-
 extern struct atomic_notifier_head panic_notifier_list;
 extern long (*panic_blink)(long time);
 NORET_TYPE void panic(const char * fmt, ...)
@@ -139,7 +134,8 @@ extern unsigned long long memparse(char *ptr, char **retptr);
 extern int core_kernel_text(unsigned long addr);
 extern int __kernel_text_address(unsigned long addr);
 extern int kernel_text_address(unsigned long addr);
-extern int session_of_pgrp(int pgrp);
+struct pid;
+extern struct pid *session_of_pgrp(struct pid *pgrp);
 
 extern void dump_thread(struct pt_regs *regs, struct user *dump);
 
@@ -176,6 +172,7 @@ static inline void console_verbose(void)
 }
 
 extern void bust_spinlocks(int yes);
+extern void wake_up_klogd(void);
 extern int oops_in_progress;           /* If set, an oops, panic(), BUG() or die() is in progress */
 extern int panic_timeout;
 extern int panic_on_oops;
@@ -200,6 +197,7 @@ extern enum system_states {
 #define TAINT_FORCED_RMMOD             (1<<3)
 #define TAINT_MACHINE_CHECK            (1<<4)
 #define TAINT_BAD_PAGE                 (1<<5)
+#define TAINT_USER                     (1<<6)
 
 extern void dump_stack(void);
 
@@ -312,6 +310,9 @@ static inline int __attribute__ ((format (printf, 1, 2))) pr_debug(const char *
        (void)__tmp; \
 })
 
+struct sysinfo;
+extern int do_sysinfo(struct sysinfo *info);
+
 #endif /* __KERNEL__ */
 
 #define SI_LOAD_SHIFT  16
index 48eccd865bd8add9d9353f13771eab89745f0000..404f4464cb1aaf255b58c818a865ae4de2e103c7 100644 (file)
@@ -74,7 +74,7 @@ static inline void kfifo_reset(struct kfifo *fifo)
  * @buffer: the data to be added.
  * @len: the length of the data to be added.
  *
- * This function copies at most 'len' bytes from the 'buffer' into
+ * This function copies at most @len bytes from the @buffer into
  * the FIFO depending on the free space, and returns the number of
  * bytes copied.
  */
@@ -99,8 +99,8 @@ static inline unsigned int kfifo_put(struct kfifo *fifo,
  * @buffer: where the data must be copied.
  * @len: the size of the destination buffer.
  *
- * This function copies at most 'len' bytes from the FIFO into the
- * 'buffer' and returns the number of copied bytes.
+ * This function copies at most @len bytes from the FIFO into the
+ * @buffer and returns the number of copied bytes.
  */
 static inline unsigned int kfifo_get(struct kfifo *fifo,
                                     unsigned char *buffer, unsigned int len)
diff --git a/include/linux/ks0108.h b/include/linux/ks0108.h
new file mode 100644 (file)
index 0000000..8047d4b
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ *    Filename: ks0108.h
+ *     Version: 0.1.0
+ * Description: ks0108 LCD Controller driver header
+ *     License: GPLv2
+ *
+ *      Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
+ *        Date: 2006-10-31
+ *
+ *  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.
+ *
+ *  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 _KS0108_H_
+#define _KS0108_H_
+
+/* Write a byte to the data port */
+extern void ks0108_writedata(unsigned char byte);
+
+/* Write a byte to the control port */
+extern void ks0108_writecontrol(unsigned char byte);
+
+/* Set the controller's current display state (0..1) */
+extern void ks0108_displaystate(unsigned char state);
+
+/* Set the controller's current startline (0..63) */
+extern void ks0108_startline(unsigned char startline);
+
+/* Set the controller's current address (0..63) */
+extern void ks0108_address(unsigned char address);
+
+/* Set the controller's current page (0..7) */
+extern void ks0108_page(unsigned char page);
+
+#endif /* _KS0108_H_ */
index 611f17f79eefe32f78605589f175db8a77616474..c68c7ac6b2323601321f80910f8b2e7a19e03709 100644 (file)
@@ -163,7 +163,7 @@ static inline ktime_t ktime_sub(const ktime_t lhs, const ktime_t rhs)
  * @add1:      addend1
  * @add2:      addend2
  *
- * Returns the sum of addend1 and addend2
+ * Returns the sum of @add1 and @add2.
  */
 static inline ktime_t ktime_add(const ktime_t add1, const ktime_t add2)
 {
@@ -189,7 +189,7 @@ static inline ktime_t ktime_add(const ktime_t add1, const ktime_t add2)
  * @kt:                addend
  * @nsec:      the scalar nsec value to add
  *
- * Returns the sum of kt and nsec in ktime_t format
+ * Returns the sum of @kt and @nsec in ktime_t format
  */
 extern ktime_t ktime_add_ns(const ktime_t kt, u64 nsec);
 
@@ -246,7 +246,7 @@ static inline struct timeval ktime_to_timeval(const ktime_t kt)
  * ktime_to_ns - convert a ktime_t variable to scalar nanoseconds
  * @kt:                the ktime_t variable to convert
  *
- * Returns the scalar nanoseconds representation of kt
+ * Returns the scalar nanoseconds representation of @kt
  */
 static inline s64 ktime_to_ns(const ktime_t kt)
 {
@@ -261,8 +261,7 @@ static inline s64 ktime_to_ns(const ktime_t kt)
  * idea of the (in)accuracy of timers. Timer values are rounded up to
  * this resolution values.
  */
-#define KTIME_REALTIME_RES     (ktime_t){ .tv64 = TICK_NSEC }
-#define KTIME_MONOTONIC_RES    (ktime_t){ .tv64 = TICK_NSEC }
+#define KTIME_LOW_RES          (ktime_t){ .tv64 = TICK_NSEC }
 
 /* Get the monotonic time in timespec format: */
 extern void ktime_get_ts(struct timespec *ts);
index 1be148f0fce4aa4cdb156038e4b96be8d8231603..f3604593fb76ded7fe359da2eea2e2ee640bd5b5 100644 (file)
@@ -11,7 +11,7 @@
 #include <asm/types.h>
 #include <linux/ioctl.h>
 
-#define KVM_API_VERSION 2
+#define KVM_API_VERSION 3
 
 /*
  * Architectural interrupt line count, and the size of the bitmap needed
@@ -65,6 +65,8 @@ struct kvm_run {
        __u8 ready_for_interrupt_injection;
        __u8 if_flag;
        __u16 padding2;
+
+       /* in (pre_kvm_run), out (post_kvm_run) */
        __u64 cr8;
        __u64 apic_base;
 
@@ -185,6 +187,7 @@ struct kvm_translation {
        __u8  valid;
        __u8  writeable;
        __u8  usermode;
+       __u8  pad[5];
 };
 
 /* for KVM_INTERRUPT */
index 91bb8ceef0b5ab04ce1a462e68505cc53942d1bf..b870b20df43c6abb43fdf5973091201130841d59 100644 (file)
@@ -31,7 +31,7 @@
 #include <linux/pci.h>
 #include <linux/dma-mapping.h>
 #include <asm/scatterlist.h>
-#include <asm/io.h>
+#include <linux/io.h>
 #include <linux/ata.h>
 #include <linux/workqueue.h>
 #include <scsi/scsi_host.h>
@@ -54,8 +54,6 @@
 #undef ATA_VERBOSE_DEBUG       /* yet more debugging output */
 #undef ATA_IRQ_TRAP            /* define to ack screaming irqs */
 #undef ATA_NDEBUG              /* define to disable quick runtime checks */
-#define ATA_ENABLE_PATA                /* define to enable PATA support in some
-                                * low-level drivers */
 
 
 /* note: prints function name for you */
@@ -109,10 +107,6 @@ static inline u32 ata_msg_init(int dval, int default_msg_enable_bits)
 #define ATA_TAG_POISON         0xfafbfcfdU
 
 /* move to PCI layer? */
-#define PCI_VDEVICE(vendor, device)            \
-       PCI_VENDOR_ID_##vendor, (device),       \
-       PCI_ANY_ID, PCI_ANY_ID, 0, 0
-
 static inline struct device *pci_dev_to_dev(struct pci_dev *pdev)
 {
        return &pdev->dev;
@@ -178,6 +172,7 @@ enum {
        ATA_FLAG_DEBUGMSG       = (1 << 13),
        ATA_FLAG_SETXFER_POLLING= (1 << 14), /* use polling for SETXFER */
        ATA_FLAG_IGN_SIMPLEX    = (1 << 15), /* ignore SIMPLEX */
+       ATA_FLAG_NO_IORDY       = (1 << 16), /* controller lacks iordy */
 
        /* The following flag belongs to ap->pflags but is kept in
         * ap->flags because it's referenced in many LLDs and will be
@@ -308,7 +303,7 @@ enum {
         * most devices.
         */
        ATA_SPINUP_WAIT         = 8000,
-       
+
        /* Horkage types. May be set by libata or controller on drives
           (some horkage may be drive/controller pair dependant */
 
@@ -352,21 +347,21 @@ typedef int (*ata_reset_fn_t)(struct ata_port *ap, unsigned int *classes);
 typedef void (*ata_postreset_fn_t)(struct ata_port *ap, unsigned int *classes);
 
 struct ata_ioports {
-       unsigned long           cmd_addr;
-       unsigned long           data_addr;
-       unsigned long           error_addr;
-       unsigned long           feature_addr;
-       unsigned long           nsect_addr;
-       unsigned long           lbal_addr;
-       unsigned long           lbam_addr;
-       unsigned long           lbah_addr;
-       unsigned long           device_addr;
-       unsigned long           status_addr;
-       unsigned long           command_addr;
-       unsigned long           altstatus_addr;
-       unsigned long           ctl_addr;
-       unsigned long           bmdma_addr;
-       unsigned long           scr_addr;
+       void __iomem            *cmd_addr;
+       void __iomem            *data_addr;
+       void __iomem            *error_addr;
+       void __iomem            *feature_addr;
+       void __iomem            *nsect_addr;
+       void __iomem            *lbal_addr;
+       void __iomem            *lbam_addr;
+       void __iomem            *lbah_addr;
+       void __iomem            *device_addr;
+       void __iomem            *status_addr;
+       void __iomem            *command_addr;
+       void __iomem            *altstatus_addr;
+       void __iomem            *ctl_addr;
+       void __iomem            *bmdma_addr;
+       void __iomem            *scr_addr;
 };
 
 struct ata_probe_ent {
@@ -385,7 +380,7 @@ struct ata_probe_ent {
        unsigned int            irq_flags;
        unsigned long           port_flags;
        unsigned long           _host_flags;
-       void __iomem            *mmio_base;
+       void __iomem * const    *iomap;
        void                    *private_data;
 
        /* port_info for the secondary port.  Together with irq2, it's
@@ -402,7 +397,7 @@ struct ata_host {
        struct device           *dev;
        unsigned long           irq;
        unsigned long           irq2;
-       void __iomem            *mmio_base;
+       void __iomem * const    *iomap;
        unsigned int            n_ports;
        void                    *private_data;
        const struct ata_port_operations *ops;
@@ -431,9 +426,6 @@ struct ata_queued_cmd {
 
        unsigned int            pad_len;
 
-       unsigned int            nsect;
-       unsigned int            cursect;
-
        unsigned int            nbytes;
        unsigned int            curbytes;
 
@@ -639,6 +631,8 @@ struct ata_port_operations {
 
        irq_handler_t irq_handler;
        void (*irq_clear) (struct ata_port *);
+       u8 (*irq_on) (struct ata_port *);
+       u8 (*irq_ack) (struct ata_port *ap, unsigned int chk_drq);
 
        u32 (*scr_read) (struct ata_port *ap, unsigned int sc_reg);
        void (*scr_write) (struct ata_port *ap, unsigned int sc_reg,
@@ -720,20 +714,18 @@ extern int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_i
                             unsigned int n_ports);
 extern void ata_pci_remove_one (struct pci_dev *pdev);
 extern void ata_pci_device_do_suspend(struct pci_dev *pdev, pm_message_t mesg);
-extern void ata_pci_device_do_resume(struct pci_dev *pdev);
+extern int __must_check ata_pci_device_do_resume(struct pci_dev *pdev);
 extern int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg);
 extern int ata_pci_device_resume(struct pci_dev *pdev);
 extern int ata_pci_clear_simplex(struct pci_dev *pdev);
 #endif /* CONFIG_PCI */
 extern int ata_device_add(const struct ata_probe_ent *ent);
-extern void ata_port_detach(struct ata_port *ap);
+extern void ata_host_detach(struct ata_host *host);
 extern void ata_host_init(struct ata_host *, struct device *,
                          unsigned long, const struct ata_port_operations *);
-extern void ata_host_remove(struct ata_host *host);
 extern int ata_scsi_detect(struct scsi_host_template *sht);
 extern int ata_scsi_ioctl(struct scsi_device *dev, int cmd, void __user *arg);
 extern int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *));
-extern int ata_scsi_release(struct Scsi_Host *host);
 extern void ata_sas_port_destroy(struct ata_port *);
 extern struct ata_port *ata_sas_port_alloc(struct ata_host *,
                                           struct ata_port_info *, struct Scsi_Host *);
@@ -776,15 +768,11 @@ extern u8 ata_check_status(struct ata_port *ap);
 extern u8 ata_altstatus(struct ata_port *ap);
 extern void ata_exec_command(struct ata_port *ap, const struct ata_taskfile *tf);
 extern int ata_port_start (struct ata_port *ap);
-extern void ata_port_stop (struct ata_port *ap);
-extern void ata_host_stop (struct ata_host *host);
 extern irqreturn_t ata_interrupt (int irq, void *dev_instance);
-extern void ata_mmio_data_xfer(struct ata_device *adev, unsigned char *buf,
-                              unsigned int buflen, int write_data);
-extern void ata_pio_data_xfer(struct ata_device *adev, unsigned char *buf,
-                             unsigned int buflen, int write_data);
-extern void ata_pio_data_xfer_noirq(struct ata_device *adev, unsigned char *buf,
-                             unsigned int buflen, int write_data);
+extern void ata_data_xfer(struct ata_device *adev, unsigned char *buf,
+                         unsigned int buflen, int write_data);
+extern void ata_data_xfer_noirq(struct ata_device *adev, unsigned char *buf,
+                               unsigned int buflen, int write_data);
 extern void ata_qc_prep(struct ata_queued_cmd *qc);
 extern void ata_noop_qc_prep(struct ata_queued_cmd *qc);
 extern unsigned int ata_qc_issue_prot(struct ata_queued_cmd *qc);
@@ -826,6 +814,10 @@ extern void ata_scsi_slave_destroy(struct scsi_device *sdev);
 extern int ata_scsi_change_queue_depth(struct scsi_device *sdev,
                                       int queue_depth);
 extern struct ata_device *ata_dev_pair(struct ata_device *adev);
+extern u8 ata_irq_on(struct ata_port *ap);
+extern u8 ata_dummy_irq_on(struct ata_port *ap);
+extern u8 ata_irq_ack(struct ata_port *ap, unsigned int chk_drq);
+extern u8 ata_dummy_irq_ack(struct ata_port *ap, unsigned int chk_drq);
 
 /*
  * Timing helpers
@@ -864,7 +856,6 @@ struct pci_bits {
        unsigned long           val;
 };
 
-extern void ata_pci_host_stop (struct ata_host *host);
 extern struct ata_probe_ent *
 ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int portmask);
 extern int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits);
@@ -1096,10 +1087,9 @@ static inline u8 ata_wait_idle(struct ata_port *ap)
        u8 status = ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 1000);
 
        if (status != 0xff && (status & (ATA_BUSY | ATA_DRQ))) {
-               unsigned long l = ap->ioaddr.status_addr;
                if (ata_msg_warn(ap))
-                       printk(KERN_WARNING "ATA: abnormal status 0x%X on port 0x%lX\n",
-                               status, l);
+                       printk(KERN_WARNING "ATA: abnormal status 0x%X on port 0x%p\n",
+                               status, ap->ioaddr.status_addr);
        }
 
        return status;
@@ -1149,8 +1139,7 @@ static inline void ata_qc_reinit(struct ata_queued_cmd *qc)
        qc->dma_dir = DMA_NONE;
        qc->__sg = NULL;
        qc->flags = 0;
-       qc->cursect = qc->cursg = qc->cursg_ofs = 0;
-       qc->nsect = 0;
+       qc->cursg = qc->cursg_ofs = 0;
        qc->nbytes = qc->curbytes = 0;
        qc->n_elem = 0;
        qc->err_mask = 0;
@@ -1163,51 +1152,6 @@ static inline void ata_qc_reinit(struct ata_queued_cmd *qc)
        qc->result_tf.feature = 0;
 }
 
-/**
- *     ata_irq_ack - Acknowledge a device interrupt.
- *     @ap: Port on which interrupts are enabled.
- *
- *     Wait up to 10 ms for legacy IDE device to become idle (BUSY
- *     or BUSY+DRQ clear).  Obtain dma status and port status from
- *     device.  Clear the interrupt.  Return port status.
- *
- *     LOCKING:
- */
-
-static inline u8 ata_irq_ack(struct ata_port *ap, unsigned int chk_drq)
-{
-       unsigned int bits = chk_drq ? ATA_BUSY | ATA_DRQ : ATA_BUSY;
-       u8 host_stat, post_stat, status;
-
-       status = ata_busy_wait(ap, bits, 1000);
-       if (status & bits)
-               if (ata_msg_err(ap))
-                       printk(KERN_ERR "abnormal status 0x%X\n", status);
-
-       /* get controller status; clear intr, err bits */
-       if (ap->flags & ATA_FLAG_MMIO) {
-               void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
-               host_stat = readb(mmio + ATA_DMA_STATUS);
-               writeb(host_stat | ATA_DMA_INTR | ATA_DMA_ERR,
-                      mmio + ATA_DMA_STATUS);
-
-               post_stat = readb(mmio + ATA_DMA_STATUS);
-       } else {
-               host_stat = inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
-               outb(host_stat | ATA_DMA_INTR | ATA_DMA_ERR,
-                    ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
-
-               post_stat = inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
-       }
-
-       if (ata_msg_intr(ap))
-               printk(KERN_INFO "%s: irq ack: host_stat 0x%X, new host_stat 0x%X, drv_stat 0x%X\n",
-                       __FUNCTION__,
-                       host_stat, post_stat, status);
-
-       return status;
-}
-
 static inline int ata_try_flush_cache(const struct ata_device *dev)
 {
        return ata_id_wcache_enabled(dev->id) ||
@@ -1235,14 +1179,14 @@ static inline unsigned int __ac_err_mask(u8 status)
 static inline int ata_pad_alloc(struct ata_port *ap, struct device *dev)
 {
        ap->pad_dma = 0;
-       ap->pad = dma_alloc_coherent(dev, ATA_DMA_PAD_BUF_SZ,
-                                    &ap->pad_dma, GFP_KERNEL);
+       ap->pad = dmam_alloc_coherent(dev, ATA_DMA_PAD_BUF_SZ,
+                                     &ap->pad_dma, GFP_KERNEL);
        return (ap->pad == NULL) ? -ENOMEM : 0;
 }
 
 static inline void ata_pad_free(struct ata_port *ap, struct device *dev)
 {
-       dma_free_coherent(dev, ATA_DMA_PAD_BUF_SZ, ap->pad, ap->pad_dma);
+       dmam_free_coherent(dev, ATA_DMA_PAD_BUF_SZ, ap->pad, ap->pad_dma);
 }
 
 static inline struct ata_port *ata_shost_to_port(struct Scsi_Host *host)
index 611059d633f4a9fcf2ec435309564b4b4bb0b126..f9d71eab05eecc9a7d3891d346b86aa58d24233b 100644 (file)
@@ -161,7 +161,7 @@ static inline void __list_del(struct list_head * prev, struct list_head * next)
 /**
  * list_del - deletes entry from list.
  * @entry: the element to delete from the list.
- * Note: list_empty on entry does not return true after this, the entry is
+ * Note: list_empty() on entry does not return true after this, the entry is
  * in an undefined state.
  */
 #ifndef CONFIG_DEBUG_LIST
@@ -179,7 +179,7 @@ extern void list_del(struct list_head *entry);
  * list_del_rcu - deletes entry from list without re-initialization
  * @entry: the element to delete from the list.
  *
- * Note: list_empty on entry does not return true after this,
+ * Note: list_empty() on entry does not return true after this,
  * the entry is in an undefined state. It is useful for RCU based
  * lockfree traversal.
  *
@@ -209,7 +209,8 @@ static inline void list_del_rcu(struct list_head *entry)
  * list_replace - replace old entry by new one
  * @old : the element to be replaced
  * @new : the new element to insert
- * Note: if 'old' was empty, it will be overwritten.
+ *
+ * If @old was empty, it will be overwritten.
  */
 static inline void list_replace(struct list_head *old,
                                struct list_head *new)
@@ -359,6 +360,62 @@ static inline void list_splice_init(struct list_head *list,
        }
 }
 
+/**
+ * list_splice_init_rcu - splice an RCU-protected list into an existing list.
+ * @list:      the RCU-protected list to splice
+ * @head:      the place in the list to splice the first list into
+ * @sync:      function to sync: synchronize_rcu(), synchronize_sched(), ...
+ *
+ * @head can be RCU-read traversed concurrently with this function.
+ *
+ * Note that this function blocks.
+ *
+ * Important note: the caller must take whatever action is necessary to
+ *     prevent any other updates to @head.  In principle, it is possible
+ *     to modify the list as soon as sync() begins execution.
+ *     If this sort of thing becomes necessary, an alternative version
+ *     based on call_rcu() could be created.  But only if -really-
+ *     needed -- there is no shortage of RCU API members.
+ */
+static inline void list_splice_init_rcu(struct list_head *list,
+                                       struct list_head *head,
+                                       void (*sync)(void))
+{
+       struct list_head *first = list->next;
+       struct list_head *last = list->prev;
+       struct list_head *at = head->next;
+
+       if (list_empty(head))
+               return;
+
+       /* "first" and "last" tracking list, so initialize it. */
+
+       INIT_LIST_HEAD(list);
+
+       /*
+        * At this point, the list body still points to the source list.
+        * Wait for any readers to finish using the list before splicing
+        * the list body into the new list.  Any new readers will see
+        * an empty list.
+        */
+
+       sync();
+
+       /*
+        * Readers are finished with the source list, so perform splice.
+        * The order is important if the new list is global and accessible
+        * to concurrent RCU readers.  Note that RCU readers are not
+        * permitted to traverse the prev pointers without excluding
+        * this function.
+        */
+
+       last->next = at;
+       smp_wmb();
+       head->next = first;
+       first->prev = head;
+       at->prev = last;
+}
+
 /**
  * list_entry - get the struct for this entry
  * @ptr:       the &struct list_head pointer.
@@ -432,12 +489,12 @@ static inline void list_splice_init(struct list_head *list,
             pos = list_entry(pos->member.prev, typeof(*pos), member))
 
 /**
- * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue
+ * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue()
  * @pos:       the type * to use as a start point
  * @head:      the head of the list
  * @member:    the name of the list_struct within the struct.
  *
- * Prepares a pos entry for use as a start point in list_for_each_entry_continue.
+ * Prepares a pos entry for use as a start point in list_for_each_entry_continue().
  */
 #define list_prepare_entry(pos, head, member) \
        ((pos) ? : list_entry(head, typeof(*pos), member))
index ea097dddc44f791d34a599aa12b3a251413aa47d..06fe93a3e916d882fa09fe4275ed9cbf922ac8c0 100644 (file)
@@ -8,6 +8,8 @@
 #ifndef __LINUX_LOCKDEP_H
 #define __LINUX_LOCKDEP_H
 
+struct task_struct;
+
 #ifdef CONFIG_LOCKDEP
 
 #include <linux/linkage.h>
@@ -132,6 +134,7 @@ struct lock_list {
        struct list_head                entry;
        struct lock_class               *class;
        struct stack_trace              trace;
+       int                             distance;
 };
 
 /*
index b78bbf42135ac4287e8be81efee7ce3ebcddb3a7..b32c8a97fcec51b3ea266b75a964df505d36f542 100644 (file)
@@ -18,6 +18,7 @@
 #define MINIX_SUPER_MAGIC2     0x138F          /* minix fs, 30 char names */
 #define MINIX2_SUPER_MAGIC     0x2468          /* minix V2 fs */
 #define MINIX2_SUPER_MAGIC2    0x2478          /* minix V2 fs, 30 char names */
+#define MINIX3_SUPER_MAGIC     0x4d5a          /* minix V3 fs */
 
 #define MSDOS_SUPER_MAGIC      0x4d44          /* MD */
 #define NCP_SUPER_MAGIC                0x564c          /* Guess, what 0x564c is :-) */
index 432b2fa249290343702eabfbc8c031d84a697e39..bdc01127dced03198620b72441d3b38a49eb3a16 100644 (file)
 #ifdef __KERNEL__
 #include <linux/spinlock.h>            /* spinlock_t */
 extern spinlock_t rtc_lock;            /* serialize CMOS RAM access */
+
+/* Some RTCs extend the mc146818 register set to support alarms of more
+ * than 24 hours in the future; or dates that include a century code.
+ * This platform_data structure can pass this information to the driver.
+ */
+struct cmos_rtc_board_info {
+       u8      rtc_day_alarm;          /* zero, or register index */
+       u8      rtc_mon_alarm;          /* zero, or register index */
+       u8      rtc_century;            /* zero, or register index */
+};
 #endif
 
 /**********************************************************************
index 916e8f72c63d1b3f71a3d95f07649d874d205504..9850d513ff60e9b023273a9aa6a29f3b0baf2ed0 100644 (file)
@@ -25,7 +25,6 @@
 #define MINIX_ERROR_FS         0x0002          /* fs has errors. */
 
 #define MINIX_INODES_PER_BLOCK ((BLOCK_SIZE)/(sizeof (struct minix_inode)))
-#define MINIX2_INODES_PER_BLOCK ((BLOCK_SIZE)/(sizeof (struct minix2_inode)))
 
 /*
  * This is the original minix inode layout on disk.
@@ -75,9 +74,33 @@ struct minix_super_block {
        __u32 s_zones;
 };
 
+/*
+ * V3 minix super-block data on disk
+ */
+struct minix3_super_block {
+       __u16 s_ninodes;
+       __u16 s_nzones;
+       __u16 s_pad0;
+       __u16 s_imap_blocks;
+       __u16 s_zmap_blocks;
+       __u16 s_firstdatazone;
+       __u16 s_log_zone_size;
+       __u16 s_pad1;
+       __u32 s_max_size;
+       __u32 s_zones;
+       __u16 s_magic;
+       __u16 s_pad2;
+       __u16 s_blocksize;
+       __u8  s_disk_version;
+};
+
 struct minix_dir_entry {
        __u16 inode;
        char name[0];
 };
 
+struct minix3_dir_entry {
+       __u32 inode;
+       char name[0];
+};
 #endif
index bb793a4c8e9ecd514aad6b40e3b01c26b42c43a4..a0eec16eb0bdbb6a2092b443f299f28c5c11cc25 100644 (file)
@@ -437,15 +437,15 @@ static inline compound_page_dtor *get_compound_page_dtor(struct page *page)
 /* NODE:ZONE or SECTION:ZONE is used to ID a zone for the buddy allcator */
 #ifdef NODE_NOT_IN_PAGEFLAGS
 #define ZONEID_SHIFT           (SECTIONS_SHIFT + ZONES_SHIFT)
+#define ZONEID_PGOFF           ((SECTIONS_PGOFF < ZONES_PGOFF)? \
+                                               SECTIONS_PGOFF : ZONES_PGOFF)
 #else
 #define ZONEID_SHIFT           (NODES_SHIFT + ZONES_SHIFT)
+#define ZONEID_PGOFF           ((NODES_PGOFF < ZONES_PGOFF)? \
+                                               NODES_PGOFF : ZONES_PGOFF)
 #endif
 
-#if ZONES_WIDTH > 0
-#define ZONEID_PGSHIFT         ZONES_PGSHIFT
-#else
-#define ZONEID_PGSHIFT         NODES_PGOFF
-#endif
+#define ZONEID_PGSHIFT         (ZONEID_PGOFF * (ZONEID_SHIFT != 0))
 
 #if SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH > FLAGS_RESERVED
 #error SECTIONS_WIDTH+NODES_WIDTH+ZONES_WIDTH > FLAGS_RESERVED
@@ -471,7 +471,6 @@ static inline enum zone_type page_zonenum(struct page *page)
  */
 static inline int page_zone_id(struct page *page)
 {
-       BUILD_BUG_ON(ZONEID_PGSHIFT == 0 && ZONEID_MASK);
        return (page->flags >> ZONEID_PGSHIFT) & ZONEID_MASK;
 }
 
@@ -638,6 +637,7 @@ static inline int page_mapped(struct page *page)
  */
 #define NOPFN_SIGBUS   ((unsigned long) -1)
 #define NOPFN_OOM      ((unsigned long) -2)
+#define NOPFN_REFAULT  ((unsigned long) -3)
 
 /*
  * Different kinds of faults, as returned by handle_mm_fault().
@@ -786,6 +786,7 @@ extern int try_to_release_page(struct page * page, gfp_t gfp_mask);
 extern void do_invalidatepage(struct page *page, unsigned long offset);
 
 int __set_page_dirty_nobuffers(struct page *page);
+int __set_page_dirty_no_writeback(struct page *page);
 int redirty_page_for_writepage(struct writeback_control *wbc,
                                struct page *page);
 int FASTCALL(set_page_dirty(struct page *page));
@@ -1124,6 +1125,8 @@ unsigned long vmalloc_to_pfn(void *addr);
 int remap_pfn_range(struct vm_area_struct *, unsigned long addr,
                        unsigned long pfn, unsigned long size, pgprot_t);
 int vm_insert_page(struct vm_area_struct *, unsigned long addr, struct page *);
+int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr,
+                       unsigned long pfn);
 
 struct page *follow_page(struct vm_area_struct *, unsigned long address,
                        unsigned int foll_flags);
index 3b6723dfaff38f50bb8fa75e9b99072d9c2d69ba..895bc4e93039cdba7f6585b484abed3b9eb4a920 100644 (file)
@@ -1,30 +1,29 @@
-
 static inline void
 add_page_to_active_list(struct zone *zone, struct page *page)
 {
        list_add(&page->lru, &zone->active_list);
-       zone->nr_active++;
+       __inc_zone_state(zone, NR_ACTIVE);
 }
 
 static inline void
 add_page_to_inactive_list(struct zone *zone, struct page *page)
 {
        list_add(&page->lru, &zone->inactive_list);
-       zone->nr_inactive++;
+       __inc_zone_state(zone, NR_INACTIVE);
 }
 
 static inline void
 del_page_from_active_list(struct zone *zone, struct page *page)
 {
        list_del(&page->lru);
-       zone->nr_active--;
+       __dec_zone_state(zone, NR_ACTIVE);
 }
 
 static inline void
 del_page_from_inactive_list(struct zone *zone, struct page *page)
 {
        list_del(&page->lru);
-       zone->nr_inactive--;
+       __dec_zone_state(zone, NR_INACTIVE);
 }
 
 static inline void
@@ -33,9 +32,9 @@ del_page_from_lru(struct zone *zone, struct page *page)
        list_del(&page->lru);
        if (PageActive(page)) {
                __ClearPageActive(page);
-               zone->nr_active--;
+               __dec_zone_state(zone, NR_ACTIVE);
        } else {
-               zone->nr_inactive--;
+               __dec_zone_state(zone, NR_INACTIVE);
        }
 }
 
index b262f47961fbe8a439cc218cd62b20122c5ac957..ee9e3143df4fd0ab8b723a6bf14a7fd28f71e9f6 100644 (file)
@@ -47,15 +47,20 @@ struct zone_padding {
 #endif
 
 enum zone_stat_item {
+       /* First 128 byte cacheline (assuming 64 bit words) */
+       NR_FREE_PAGES,
+       NR_INACTIVE,
+       NR_ACTIVE,
        NR_ANON_PAGES,  /* Mapped anonymous pages */
        NR_FILE_MAPPED, /* pagecache pages mapped into pagetables.
                           only modified from process context */
        NR_FILE_PAGES,
-       NR_SLAB_RECLAIMABLE,
-       NR_SLAB_UNRECLAIMABLE,
-       NR_PAGETABLE,   /* used for pagetables */
        NR_FILE_DIRTY,
        NR_WRITEBACK,
+       /* Second 128 byte cacheline */
+       NR_SLAB_RECLAIMABLE,
+       NR_SLAB_UNRECLAIMABLE,
+       NR_PAGETABLE,           /* used for pagetables */
        NR_UNSTABLE_NFS,        /* NFS unstable pages */
        NR_BOUNCE,
        NR_VMSCAN_WRITE,
@@ -91,6 +96,7 @@ struct per_cpu_pageset {
 #endif
 
 enum zone_type {
+#ifdef CONFIG_ZONE_DMA
        /*
         * ZONE_DMA is used when there are devices that are not able
         * to do DMA to all of addressable memory (ZONE_NORMAL). Then we
@@ -111,6 +117,7 @@ enum zone_type {
         *                      <16M.
         */
        ZONE_DMA,
+#endif
 #ifdef CONFIG_ZONE_DMA32
        /*
         * x86_64 needs two ZONE_DMAs because it supports devices that are
@@ -147,15 +154,30 @@ enum zone_type {
  * match the requested limits. See gfp_zone() in include/linux/gfp.h
  */
 
-#if !defined(CONFIG_ZONE_DMA32) && !defined(CONFIG_HIGHMEM)
+/*
+ * Count the active zones.  Note that the use of defined(X) outside
+ * #if and family is not necessarily defined so ensure we cannot use
+ * it later.  Use __ZONE_COUNT to work out how many shift bits we need.
+ */
+#define __ZONE_COUNT (                 \
+         defined(CONFIG_ZONE_DMA)      \
+       + defined(CONFIG_ZONE_DMA32)    \
+       + 1                             \
+       + defined(CONFIG_HIGHMEM)       \
+)
+#if __ZONE_COUNT < 2
+#define ZONES_SHIFT 0
+#elif __ZONE_COUNT <= 2
 #define ZONES_SHIFT 1
-#else
+#elif __ZONE_COUNT <= 4
 #define ZONES_SHIFT 2
+#else
+#error ZONES_SHIFT -- too many zones configured adjust calculation
 #endif
+#undef __ZONE_COUNT
 
 struct zone {
        /* Fields commonly accessed by the page allocator */
-       unsigned long           free_pages;
        unsigned long           pages_min, pages_low, pages_high;
        /*
         * We don't know if the memory that we're going to allocate will be freeable
@@ -197,8 +219,6 @@ struct zone {
        struct list_head        inactive_list;
        unsigned long           nr_scan_active;
        unsigned long           nr_scan_inactive;
-       unsigned long           nr_active;
-       unsigned long           nr_inactive;
        unsigned long           pages_scanned;     /* since last reclaim */
        int                     all_unreclaimable; /* All pages pinned */
 
@@ -442,8 +462,6 @@ typedef struct pglist_data {
 
 #include <linux/memory_hotplug.h>
 
-void __get_zone_counts(unsigned long *active, unsigned long *inactive,
-                       unsigned long *free, struct pglist_data *pgdat);
 void get_zone_counts(unsigned long *active, unsigned long *inactive,
                        unsigned long *free);
 void build_all_zonelists(void);
@@ -523,7 +541,11 @@ static inline int is_dma32(struct zone *zone)
 
 static inline int is_dma(struct zone *zone)
 {
+#ifdef CONFIG_ZONE_DMA
        return zone == zone->zone_pgdat->node_zones + ZONE_DMA;
+#else
+       return 0;
+#endif
 }
 
 /* These two functions are used to setup the per zone pages min values */
index 1b7e178b0d8472549de308667343b15d4f44aa56..dab69afee2fa457b3d6feaf8bda7d3701d71c4ca 100644 (file)
@@ -43,9 +43,8 @@ struct vfsmount {
        struct super_block *mnt_sb;     /* pointer to superblock */
        struct list_head mnt_mounts;    /* list of children, anchored here */
        struct list_head mnt_child;     /* and going through their mnt_child */
-       atomic_t mnt_count;
        int mnt_flags;
-       int mnt_expiry_mark;            /* true if marked for expiry */
+       /* 4 bytes hole on 64bits arches */
        char *mnt_devname;              /* Name of device e.g. /dev/dsk/hda1 */
        struct list_head mnt_list;
        struct list_head mnt_expire;    /* link in fs-specific expiry list */
@@ -54,6 +53,13 @@ struct vfsmount {
        struct list_head mnt_slave;     /* slave list entry */
        struct vfsmount *mnt_master;    /* slave is on master->mnt_slave_list */
        struct mnt_namespace *mnt_ns;   /* containing namespace */
+       /*
+        * We put mnt_count & mnt_expiry_mark at the end of struct vfsmount
+        * to let these frequently modified fields in a separate cache line
+        * (so that reads of mnt_flags wont ping-pong on SMP machines)
+        */
+       atomic_t mnt_count;
+       int mnt_expiry_mark;            /* true if marked for expiry */
        int mnt_pinned;
 };
 
index 24a9ef1506b612c4e98d55522ce8140a5d3825a5..fa253fa73aa328e2dd21a507b03debcc77fc4b47 100644 (file)
@@ -234,7 +234,7 @@ struct msdos_sb_info {
        struct fat_mount_options options;
        struct nls_table *nls_disk;  /* Codepage used on disk */
        struct nls_table *nls_io;    /* Charset used for input and display */
-       void *dir_ops;               /* Opaque; default directory operations */
+       const void *dir_ops;                 /* Opaque; default directory operations */
        int dir_per_block;           /* dir entries per block */
        int dir_per_block_bits;      /* log2(dir_per_block) */
 
@@ -399,7 +399,7 @@ extern int fat_count_free_clusters(struct super_block *sb);
 extern int fat_generic_ioctl(struct inode *inode, struct file *filp,
                             unsigned int cmd, unsigned long arg);
 extern const struct file_operations fat_file_operations;
-extern struct inode_operations fat_file_inode_operations;
+extern const struct inode_operations fat_file_inode_operations;
 extern int fat_notify_change(struct dentry * dentry, struct iattr * attr);
 extern void fat_truncate(struct inode *inode);
 extern int fat_getattr(struct vfsmount *mnt, struct dentry *dentry,
@@ -413,7 +413,7 @@ extern struct inode *fat_build_inode(struct super_block *sb,
                        struct msdos_dir_entry *de, loff_t i_pos);
 extern int fat_sync_inode(struct inode *inode);
 extern int fat_fill_super(struct super_block *sb, void *data, int silent,
-                       struct inode_operations *fs_dir_inode_ops, int isvfat);
+                       const struct inode_operations *fs_dir_inode_ops, int isvfat);
 
 extern int fat_flush_inodes(struct super_block *sb, struct inode *i1,
                            struct inode *i2);
index 0ea7f89e613c1c6f95ac5fcbb71cdbcfa5f6b9d9..83e39eb054d3b62eb07c12c471cf7ca322d56f7c 100644 (file)
@@ -204,7 +204,7 @@ void ncp_update_inode(struct inode *, struct ncp_entry_info *);
 void ncp_update_inode2(struct inode *, struct ncp_entry_info *);
 
 /* linux/fs/ncpfs/dir.c */
-extern struct inode_operations ncp_dir_inode_operations;
+extern const struct inode_operations ncp_dir_inode_operations;
 extern const struct file_operations ncp_dir_operations;
 int ncp_conn_logged_in(struct super_block *);
 int ncp_date_dos2unix(__le16 time, __le16 date);
@@ -226,7 +226,7 @@ void ncp_lock_server(struct ncp_server *server);
 void ncp_unlock_server(struct ncp_server *server);
 
 /* linux/fs/ncpfs/file.c */
-extern struct inode_operations ncp_file_inode_operations;
+extern const struct inode_operations ncp_file_inode_operations;
 extern const struct file_operations ncp_file_operations;
 int ncp_make_open(struct inode *, int);
 
index d4c4c5120bc0ed16a5dfc3e6b4f1945d96b3a652..70d3b4f1e48d4ec395198a7c7f3f0230db803397 100644 (file)
@@ -172,8 +172,8 @@ struct nf_logger {
 
 /* Function to register/unregister log function. */
 int nf_log_register(int pf, struct nf_logger *logger);
-int nf_log_unregister_pf(int pf);
-void nf_log_unregister_logger(struct nf_logger *logger);
+void nf_log_unregister(struct nf_logger *logger);
+void nf_log_unregister_pf(int pf);
 
 /* Calls the registered backend logging function */
 void nf_log_packet(int pf,
index 33581c13d9474a6d33dfc080b4a75df990ab9ee0..da9274e6bf12c57a22a29db1f90eeab5e0ebc0b3 100644 (file)
@@ -301,6 +301,12 @@ extern unsigned int ip_conntrack_htable_size;
 extern int ip_conntrack_checksum;
  
 #define CONNTRACK_STAT_INC(count) (__get_cpu_var(ip_conntrack_stat).count++)
+#define CONNTRACK_STAT_INC_ATOMIC(count)               \
+do {                                                   \
+       local_bh_disable();                             \
+       __get_cpu_var(ip_conntrack_stat).count++;       \
+       local_bh_enable();                              \
+} while (0)
 
 #ifdef CONFIG_IP_NF_CONNTRACK_EVENTS
 #include <linux/notifier.h>
index b3b9b609ee893741de1df501b588d9c0abb4d110..2a20f488ac1b6fb61d372a6bcfb4aeb781666222 100644 (file)
@@ -23,6 +23,7 @@
 #define NETLINK_GENERIC                16
 /* leave room for NETLINK_DM (DM Events) */
 #define NETLINK_SCSITRANSPORT  18      /* SCSI Transports */
+#define NETLINK_ECRYPTFS       19
 
 #define MAX_LINKS 32           
 
index db05182ca0e87f122adc3b4c1dbff6622c6c5fbb..1be5be88debe77c5e51aed74ef77fb8697974b5f 100644 (file)
@@ -105,12 +105,11 @@ struct nfs4_ace {
        uint32_t        access_mask;
        int             whotype;
        uid_t           who;
-       struct list_head l_ace;
 };
 
 struct nfs4_acl {
        uint32_t        naces;
-       struct list_head ace_head;
+       struct nfs4_ace aces[0];
 };
 
 typedef struct { char data[NFS4_VERIFIER_SIZE]; } nfs4_verifier;
index 22aff4d01f20e0e59e02c6ee4f4a7c16c7fd76af..409b6e02f337cdf757ecfbf90fb009a6632aa611 100644 (file)
 
 #include <linux/posix_acl.h>
 
-struct nfs4_acl *nfs4_acl_new(void);
-void nfs4_acl_free(struct nfs4_acl *);
-int nfs4_acl_add_ace(struct nfs4_acl *, u32, u32, u32, int, uid_t);
+/* Maximum ACL we'll accept from client; chosen (somewhat arbitrarily) to
+ * fit in a page: */
+#define NFS4_ACL_MAX 170
+
+struct nfs4_acl *nfs4_acl_new(int);
+void nfs4_acl_add_ace(struct nfs4_acl *, u32, u32, u32, int, uid_t);
 int nfs4_acl_get_whotype(char *, u32);
 int nfs4_acl_write_who(int who, char *p);
 int nfs4_acl_permission(struct nfs4_acl *acl, uid_t owner, gid_t group,
index c5d4084773e8bf321ddba31e1370bfe0ae7cce64..47aaa2c66738c5d574b96d9048964e7822227a00 100644 (file)
 
 #include <linux/magic.h>
 
-/*
- * Enable debugging support for nfs client.
- * Requires RPC_DEBUG.
- */
-#ifdef RPC_DEBUG
-# define NFS_DEBUG
-#endif
-
 /* Default timeout values */
 #define NFS_MAX_UDP_TIMEOUT    (60*HZ)
 #define NFS_MAX_TCP_TIMEOUT    (600*HZ)
@@ -331,9 +323,9 @@ static inline void nfs_fattr_init(struct nfs_fattr *fattr)
 /*
  * linux/fs/nfs/file.c
  */
-extern struct inode_operations nfs_file_inode_operations;
+extern const struct inode_operations nfs_file_inode_operations;
 #ifdef CONFIG_NFS_V3
-extern struct inode_operations nfs3_file_inode_operations;
+extern const struct inode_operations nfs3_file_inode_operations;
 #endif /* CONFIG_NFS_V3 */
 extern const struct file_operations nfs_file_operations;
 extern const struct address_space_operations nfs_file_aops;
@@ -380,9 +372,9 @@ extern ssize_t nfs_file_direct_write(struct kiocb *iocb,
 /*
  * linux/fs/nfs/dir.c
  */
-extern struct inode_operations nfs_dir_inode_operations;
+extern const struct inode_operations nfs_dir_inode_operations;
 #ifdef CONFIG_NFS_V3
-extern struct inode_operations nfs3_dir_inode_operations;
+extern const struct inode_operations nfs3_dir_inode_operations;
 #endif /* CONFIG_NFS_V3 */
 extern const struct file_operations nfs_dir_operations;
 extern struct dentry_operations nfs_dentry_operations;
@@ -392,7 +384,7 @@ extern int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fh, struct nfs_
 /*
  * linux/fs/nfs/symlink.c
  */
-extern struct inode_operations nfs_symlink_inode_operations;
+extern const struct inode_operations nfs_symlink_inode_operations;
 
 /*
  * linux/fs/nfs/sysctl.c
@@ -409,8 +401,8 @@ extern void nfs_unregister_sysctl(void);
  * linux/fs/nfs/namespace.c
  */
 extern struct list_head nfs_automount_list;
-extern struct inode_operations nfs_mountpoint_inode_operations;
-extern struct inode_operations nfs_referral_inode_operations;
+extern const struct inode_operations nfs_mountpoint_inode_operations;
+extern const struct inode_operations nfs_referral_inode_operations;
 extern int nfs_mountpoint_expiry_timeout;
 extern void nfs_release_automount_timer(void);
 
@@ -567,6 +559,15 @@ extern void * nfs_root_data(void);
 #define NFSDBG_ALL             0xFFFF
 
 #ifdef __KERNEL__
+
+/*
+ * Enable debugging support for nfs client.
+ * Requires RPC_DEBUG.
+ */
+#ifdef RPC_DEBUG
+# define NFS_DEBUG
+#endif
+
 # undef ifdebug
 # ifdef NFS_DEBUG
 #  define ifdebug(fac)         if (unlikely(nfs_debug & NFSDBG_##fac))
index 9ee9da5e1cc9de834a4e81c9155b3e9e6b0f57ca..10c26ed0db7129831d42b109f2aa2bbc222f0286 100644 (file)
@@ -767,8 +767,8 @@ struct nfs_access_entry;
 struct nfs_rpc_ops {
        int     version;                /* Protocol version */
        struct dentry_operations *dentry_ops;
-       struct inode_operations *dir_inode_ops;
-       struct inode_operations *file_inode_ops;
+       const struct inode_operations *dir_inode_ops;
+       const struct inode_operations *file_inode_ops;
 
        int     (*getroot) (struct nfs_server *, struct nfs_fh *,
                            struct nfs_fsinfo *);
@@ -784,7 +784,6 @@ struct nfs_rpc_ops {
        int     (*access)  (struct inode *, struct nfs_access_entry *);
        int     (*readlink)(struct inode *, struct page *, unsigned int,
                            unsigned int);
-       int     (*read)    (struct nfs_read_data *);
        int     (*create)  (struct inode *, struct dentry *,
                            struct iattr *, int, struct nameidata *);
        int     (*remove)  (struct inode *, struct qstr *);
index f0cc777905270822d4684c48447056ed4c073092..323f8cfa060a4c74ec0d23366b1becc8cd9a7e16 100644 (file)
 
 #include <linux/sunrpc/msg_prot.h>
 
-#ifndef NFS_SUPER_MAGIC
-# define NFS_SUPER_MAGIC       0x6969
-#endif
-
 /*
  * Largest number of bytes we need to allocate for an NFS
  * call or reply.  Used to control buffer sizes.  We use
index 045e38cdbe646f966abf370cddb8d573b4770d62..9f62d6182d32824b3e9f8afd22b01532b98680af 100644 (file)
@@ -74,19 +74,20 @@ struct svc_export {
        uid_t                   ex_anon_uid;
        gid_t                   ex_anon_gid;
        int                     ex_fsid;
+       unsigned char *         ex_uuid; /* 16 byte fsid */
        struct nfsd4_fs_locations ex_fslocs;
 };
 
 /* an "export key" (expkey) maps a filehandlefragement to an
- * svc_export for a given client.  There can be two per export, one
- * for type 0 (dev/ino), one for type 1 (fsid)
+ * svc_export for a given client.  There can be several per export,
+ * for the different fsid types.
  */
 struct svc_expkey {
        struct cache_head       h;
 
        struct auth_domain *    ek_client;
        int                     ek_fsidtype;
-       u32                     ek_fsid[3];
+       u32                     ek_fsid[6];
 
        struct vfsmount *       ek_mnt;
        struct dentry *         ek_dentry;
index 4b7c4b568f6d685fbe53ab231f459c477d3f9e3a..72feac581aa354572b89fd3d5d3e9feb8839fe5c 100644 (file)
@@ -254,18 +254,6 @@ void               nfsd_lockd_shutdown(void);
  */
 extern struct timeval  nfssvc_boot;
 
-static inline int is_fsid(struct svc_fh *fh, struct knfsd_fh *reffh)
-{
-       if (fh->fh_export->ex_flags & NFSEXP_FSID) {
-               struct vfsmount *mnt = fh->fh_export->ex_mnt;
-               if (!old_valid_dev(mnt->mnt_sb->s_dev) ||
-                   (reffh->fh_version == 1 && reffh->fh_fsid_type == 1))
-                       return 1;
-       }
-       return 0;
-}
-
-
 #ifdef CONFIG_NFSD_V4
 
 /* before processing a COMPOUND operation, we have to check that there
index d9c6c382165dd23165d025ae4cd044db9dcf7f8b..11e568ee0eeb877b69ea1e78f320f203bffb6a39 100644 (file)
@@ -165,38 +165,91 @@ typedef struct svc_fh {
 
 } svc_fh;
 
-static inline void mk_fsid_v0(u32 *fsidv, dev_t dev, ino_t ino)
-{
-       fsidv[0] = htonl((MAJOR(dev)<<16) |
-                       MINOR(dev));
-       fsidv[1] = ino_t_to_u32(ino);
-}
+enum nfsd_fsid {
+       FSID_DEV = 0,
+       FSID_NUM,
+       FSID_MAJOR_MINOR,
+       FSID_ENCODE_DEV,
+       FSID_UUID4_INUM,
+       FSID_UUID8,
+       FSID_UUID16,
+       FSID_UUID16_INUM,
+};
 
-static inline void mk_fsid_v1(u32 *fsidv, u32 fsid)
-{
-       fsidv[0] = fsid;
-}
+enum fsid_source {
+       FSIDSOURCE_DEV,
+       FSIDSOURCE_FSID,
+       FSIDSOURCE_UUID,
+};
+extern enum fsid_source fsid_source(struct svc_fh *fhp);
 
-static inline void mk_fsid_v2(u32 *fsidv, dev_t dev, ino_t ino)
-{
-       fsidv[0] = htonl(MAJOR(dev));
-       fsidv[1] = htonl(MINOR(dev));
-       fsidv[2] = ino_t_to_u32(ino);
-}
 
-static inline void mk_fsid_v3(u32 *fsidv, dev_t dev, ino_t ino)
+/* This might look a little large to "inline" but in all calls except
+ * one, 'vers' is constant so moste of the function disappears.
+ */
+static inline void mk_fsid(int vers, u32 *fsidv, dev_t dev, ino_t ino,
+                          u32 fsid, unsigned char *uuid)
 {
-       fsidv[0] = new_encode_dev(dev);
-       fsidv[1] = ino_t_to_u32(ino);
+       u32 *up;
+       switch(vers) {
+       case FSID_DEV:
+               fsidv[0] = htonl((MAJOR(dev)<<16) |
+                                MINOR(dev));
+               fsidv[1] = ino_t_to_u32(ino);
+               break;
+       case FSID_NUM:
+               fsidv[0] = fsid;
+               break;
+       case FSID_MAJOR_MINOR:
+               fsidv[0] = htonl(MAJOR(dev));
+               fsidv[1] = htonl(MINOR(dev));
+               fsidv[2] = ino_t_to_u32(ino);
+               break;
+
+       case FSID_ENCODE_DEV:
+               fsidv[0] = new_encode_dev(dev);
+               fsidv[1] = ino_t_to_u32(ino);
+               break;
+
+       case FSID_UUID4_INUM:
+               /* 4 byte fsid and inode number */
+               up = (u32*)uuid;
+               fsidv[0] = ino_t_to_u32(ino);
+               fsidv[1] = up[0] ^ up[1] ^ up[2] ^ up[3];
+               break;
+
+       case FSID_UUID8:
+               /* 8 byte fsid  */
+               up = (u32*)uuid;
+               fsidv[0] = up[0] ^ up[2];
+               fsidv[1] = up[1] ^ up[3];
+               break;
+
+       case FSID_UUID16:
+               /* 16 byte fsid - NFSv3+ only */
+               memcpy(fsidv, uuid, 16);
+               break;
+
+       case FSID_UUID16_INUM:
+               /* 8 byte inode and 16 byte fsid */
+               *(u64*)fsidv = (u64)ino;
+               memcpy(fsidv+2, uuid, 16);
+               break;
+       default: BUG();
+       }
 }
 
 static inline int key_len(int type)
 {
        switch(type) {
-       case 0: return 8;
-       case 1: return 4;
-       case 2: return 12;
-       case 3: return 8;
+       case FSID_DEV:          return 8;
+       case FSID_NUM:          return 4;
+       case FSID_MAJOR_MINOR:  return 12;
+       case FSID_ENCODE_DEV:   return 8;
+       case FSID_UUID4_INUM:   return 8;
+       case FSID_UUID8:        return 8;
+       case FSID_UUID16:       return 16;
+       case FSID_UUID16_INUM:  return 24;
        default: return 0;
        }
 }
index acb4ed1302479ac4f1833466905024e013de41e7..29af2d5df0972cdac25fd2c73e42cd49976efa8a 100644 (file)
 #ifdef ARCH_HAS_NMI_WATCHDOG
 #include <asm/nmi.h>
 extern void touch_nmi_watchdog(void);
+extern void acpi_nmi_disable(void);
+extern void acpi_nmi_enable(void);
 #else
-# define touch_nmi_watchdog() touch_softlockup_watchdog()
+static inline void touch_nmi_watchdog(void)
+{
+       touch_softlockup_watchdog();
+}
+static inline void acpi_nmi_disable(void) { }
+static inline void acpi_nmi_enable(void) { }
 #endif
 
 #ifndef trigger_all_cpu_backtrace
index 805412cc68751daadc82d5f8ced4482b7b1f586f..98c8765a488e831cad0e35adef583fcf0c93cbe2 100644 (file)
@@ -167,6 +167,7 @@ struct pci_dev {
        unsigned int    broken_parity_status:1; /* Device generates false positive parity */
        unsigned int    msi_enabled:1;
        unsigned int    msix_enabled:1;
+       unsigned int    is_managed:1;
        atomic_t        enable_cnt;     /* pci_enable_device has been called */
 
        u32             saved_config_space[16]; /* config space saved at suspend time */
@@ -528,6 +529,14 @@ static inline int pci_write_config_dword(struct pci_dev *dev, int where, u32 val
 
 int __must_check pci_enable_device(struct pci_dev *dev);
 int __must_check pci_enable_device_bars(struct pci_dev *dev, int mask);
+int __must_check pcim_enable_device(struct pci_dev *pdev);
+void pcim_pin_device(struct pci_dev *pdev);
+
+static inline int pci_is_managed(struct pci_dev *pdev)
+{
+       return pdev->is_managed;
+}
+
 void pci_disable_device(struct pci_dev *dev);
 void pci_set_master(struct pci_dev *dev);
 #define HAVE_PCI_SET_MWI
@@ -831,6 +840,11 @@ enum pci_fixup_pass {
 
 void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev);
 
+void __iomem * pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen);
+void pcim_iounmap(struct pci_dev *pdev, void __iomem *addr);
+void __iomem * const * pcim_iomap_table(struct pci_dev *pdev);
+int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name);
+
 extern int pci_pci_problems;
 #define PCIPCI_FAIL            1       /* No PCI PCI DMA */
 #define PCIPCI_TRITON          2
index 6252cb9092dd836a91a380f6715650a85fe5ef03..182a96f77c8437d28987bd93a12dcb2eccef98ab 100644 (file)
@@ -15,6 +15,8 @@
 #define PCI_CLASS_STORAGE_FLOPPY       0x0102
 #define PCI_CLASS_STORAGE_IPI          0x0103
 #define PCI_CLASS_STORAGE_RAID         0x0104
+#define PCI_CLASS_STORAGE_SATA         0x0106
+#define PCI_CLASS_STORAGE_SATA_AHCI    0x010601
 #define PCI_CLASS_STORAGE_SAS          0x0107
 #define PCI_CLASS_STORAGE_OTHER                0x0180
 
 #define PCI_DEVICE_ID_ATI_IXP400_SATA2 0x437a
 #define PCI_DEVICE_ID_ATI_IXP600_SATA  0x4380
 #define PCI_DEVICE_ID_ATI_IXP600_SRAID 0x4381
+#define PCI_DEVICE_ID_ATI_IXP600_SMBUS 0x4385
 #define PCI_DEVICE_ID_ATI_IXP600_IDE   0x438c
 
 #define PCI_VENDOR_ID_VLSI             0x1004
 #define PCI_DEVICE_ID_PLX_R753         0x1152
 #define PCI_DEVICE_ID_PLX_OLITEC       0x1187
 #define PCI_DEVICE_ID_PLX_PCI200SYN    0x3196
+#define PCI_DEVICE_ID_PLX_9030          0x9030
 #define PCI_DEVICE_ID_PLX_9050         0x9050
 #define PCI_DEVICE_ID_PLX_9080         0x9080
 #define PCI_DEVICE_ID_PLX_GTEK_SERIAL2 0xa001
 #define PCI_VENDOR_ID_ITE              0x1283
 #define PCI_DEVICE_ID_ITE_8211         0x8211
 #define PCI_DEVICE_ID_ITE_8212         0x8212
+#define PCI_DEVICE_ID_ITE_8213         0x8213
 #define PCI_DEVICE_ID_ITE_8872         0x8872
 #define PCI_DEVICE_ID_ITE_IT8330G_0    0xe886
 
 #define PCI_VENDOR_ID_ELECTRONICDESIGNGMBH 0x12f8
 #define PCI_DEVICE_ID_LML_33R10                0x8a02
 
+#define PCI_VENDOR_ID_ESDGMBH          0x12fe
+#define PCI_DEVICE_ID_ESDGMBH_CPCIASIO4 0x0111
 
 #define PCI_VENDOR_ID_SIIG             0x131f
 #define PCI_SUBVENDOR_ID_SIIG          0x131f
 #define PCI_DEVICE_ID_MOXA_C168                0x1680
 #define PCI_DEVICE_ID_MOXA_CP168U      0x1681
 #define PCI_DEVICE_ID_MOXA_CP168EL     0x1682
+#define PCI_DEVICE_ID_MOXA_CP204J      0x2040
+#define PCI_DEVICE_ID_MOXA_C218                0x2180
+#define PCI_DEVICE_ID_MOXA_C320                0x3200
 
 #define PCI_VENDOR_ID_CCD              0x1397
 #define PCI_DEVICE_ID_CCD_2BD0         0x2bd0
 
 #define PCI_VENDOR_ID_CHELSIO          0x1425
 
+#define PCI_SUBVENDOR_ID_PERLE          0x155f
+#define PCI_SUBDEVICE_ID_PCI_RAS4       0xf001
+#define PCI_SUBDEVICE_ID_PCI_RAS8       0xf010
+
 
 #define PCI_VENDOR_ID_SYBA             0x1592
 #define PCI_DEVICE_ID_SYBA_2P_EPP      0x0782
index a0e31adf3abe1e6b2b457da037c1ceaf71658df4..4269de99e320afae47c4e96428636f07286668a6 100644 (file)
@@ -9,7 +9,7 @@
 
 struct phone_device {
        struct phone_device *next;
-       struct file_operations *f_op;
+       const struct file_operations *f_op;
        int (*open) (struct phone_device *, struct file *);
        int board;              /* Device private index */
        int minor;
index 4dec047b1837f1d7e365d1127dbbc68e4937d201..2ac27f9997dd99b00324cb50419b13d2e1b0b139 100644 (file)
@@ -105,20 +105,6 @@ static inline pid_t pid_nr(struct pid *pid)
        return nr;
 }
 
-
-#define do_each_task_pid(who, type, task)                              \
-       do {                                                            \
-               struct hlist_node *pos___;                              \
-               struct pid *pid___ = find_pid(who);                     \
-               if (pid___ != NULL)                                     \
-                       hlist_for_each_entry_rcu((task), pos___,        \
-                               &pid___->tasks[type], pids[type].node) {
-
-#define while_each_task_pid(who, type, task)                           \
-                       }                                               \
-       } while (0)
-
-
 #define do_each_pid_task(pid, type, task)                              \
        do {                                                            \
                struct hlist_node *pos___;                              \
index ab8a8dd8d64c5f55c88bd28c05d7439875239b72..9a5226f0f169789c5040d68b5a888de8484829ff 100644 (file)
@@ -352,6 +352,8 @@ struct pnp_protocol {
        (dev) = protocol_to_pnp_dev((dev)->protocol_list.next))
 
 
+extern struct bus_type pnp_bus_type;
+
 #if defined(CONFIG_PNP)
 
 /* device management */
index 87dec8fe6de900da1c495175144e21f99a1bf6b1..be4652a0545a0226cb23264e923f9692968e866b 100644 (file)
@@ -55,8 +55,8 @@ struct proc_dir_entry {
        uid_t uid;
        gid_t gid;
        loff_t size;
-       struct inode_operations * proc_iops;
-       const struct file_operations * proc_fops;
+       const struct inode_operations *proc_iops;
+       const struct file_operations *proc_fops;
        get_info_t *get_info;
        struct module *owner;
        struct proc_dir_entry *next, *parent, *subdir;
@@ -113,8 +113,6 @@ extern struct vfsmount *proc_mnt;
 extern int proc_fill_super(struct super_block *,void *,int);
 extern struct inode *proc_get_inode(struct super_block *, unsigned int, struct proc_dir_entry *);
 
-extern int proc_match(int, const char *,struct proc_dir_entry *);
-
 /*
  * These are generic /proc routines that use the internal
  * "struct proc_dir_entry" tree to traverse the filesystem.
index 0c7ac444fd3509961d6057ac48d3ef60a4e825d7..19bc9b8b6191eb1bd458fecb8e00595f966b14c2 100644 (file)
@@ -116,8 +116,8 @@ extern unsigned long qnx4_block_map(struct inode *inode, long iblock);
 
 extern struct buffer_head *qnx4_bread(struct inode *, int, int);
 
-extern struct inode_operations qnx4_file_inode_operations;
-extern struct inode_operations qnx4_dir_inode_operations;
+extern const struct inode_operations qnx4_file_inode_operations;
+extern const struct inode_operations qnx4_dir_inode_operations;
 extern const struct file_operations qnx4_file_operations;
 extern const struct file_operations qnx4_dir_operations;
 extern int qnx4_is_free(struct super_block *sb, long block);
index b8fbf26eb88579265a95e490700bb370d52544d2..77db80a953d61ba400890c4a5b128606c5ec6a28 100644 (file)
@@ -132,6 +132,7 @@ struct if_dqinfo {
 
 #ifdef __KERNEL__
 #include <linux/spinlock.h>
+#include <linux/rwsem.h>
 #include <linux/mutex.h>
 
 #include <linux/dqblk_xfs.h>
index 01ad71033d65018122801dae374679548d6880ab..36f125c0c6037f0270941e96e63790151a66fe34 100644 (file)
@@ -63,7 +63,7 @@ extern u64 secure_dccp_sequence_number(__be32 saddr, __be32 daddr,
                                       __be16 sport, __be16 dport);
 
 #ifndef MODULE
-extern struct file_operations random_fops, urandom_fops;
+extern const struct file_operations random_fops, urandom_fops;
 #endif
 
 unsigned int get_random_int(void);
index c3fc6caaad3f94bb196457feb20fa563c43f0848..965d5b3ea9eb3deaf583c4d986d45a9e3b70bc8c 100644 (file)
@@ -1949,9 +1949,9 @@ int reiserfs_global_version_in_proc(char *buffer, char **start, off_t offset,
 #endif
 
 /* dir.c */
-extern struct inode_operations reiserfs_dir_inode_operations;
-extern struct inode_operations reiserfs_symlink_inode_operations;
-extern struct inode_operations reiserfs_special_inode_operations;
+extern const struct inode_operations reiserfs_dir_inode_operations;
+extern const struct inode_operations reiserfs_symlink_inode_operations;
+extern const struct inode_operations reiserfs_special_inode_operations;
 extern const struct file_operations reiserfs_dir_operations;
 
 /* tail_conversion.c */
@@ -1963,7 +1963,7 @@ int indirect2direct(struct reiserfs_transaction_handle *, struct inode *,
 void reiserfs_unmap_buffer(struct buffer_head *);
 
 /* file.c */
-extern struct inode_operations reiserfs_file_inode_operations;
+extern const struct inode_operations reiserfs_file_inode_operations;
 extern const struct file_operations reiserfs_file_operations;
 extern const struct address_space_operations reiserfs_address_space_operations;
 
index 966c35851b2e784a445bac96e1458554ab8784de..66a96814d614c7dd23c4371d80a54a1a829b6a84 100644 (file)
@@ -2,7 +2,10 @@
   File: linux/reiserfs_xattr.h
 */
 
-#include <linux/xattr.h>
+#ifndef _LINUX_REISERFS_XATTR_H
+#define _LINUX_REISERFS_XATTR_H
+
+#include <linux/types.h>
 
 /* Magic value in header */
 #define REISERFS_XATTR_MAGIC 0x52465841        /* "RFXA" */
@@ -13,7 +16,18 @@ struct reiserfs_xattr_header {
 };
 
 #ifdef __KERNEL__
+
 #include <linux/init.h>
+#include <linux/list.h>
+#include <linux/rwsem.h>
+#include <linux/reiserfs_fs_i.h>
+#include <linux/reiserfs_fs.h>
+
+struct inode;
+struct dentry;
+struct iattr;
+struct super_block;
+struct nameidata;
 
 struct reiserfs_xattr_handler {
        char *prefix;
@@ -49,9 +63,7 @@ int reiserfs_xattr_set(struct inode *, const char *, const void *, size_t, int);
 
 extern struct reiserfs_xattr_handler user_handler;
 extern struct reiserfs_xattr_handler trusted_handler;
-#ifdef CONFIG_REISERFS_FS_SECURITY
 extern struct reiserfs_xattr_handler security_handler;
-#endif
 
 int reiserfs_xattr_register_handlers(void) __init;
 void reiserfs_xattr_unregister_handlers(void);
@@ -137,6 +149,8 @@ static inline int reiserfs_xattr_init(struct super_block *sb, int mount_flags)
 static inline void reiserfs_init_xattr_rwsem(struct inode *inode)
 {
 }
-#endif
+#endif  /*  CONFIG_REISERFS_FS_XATTR  */
+
+#endif  /*  __KERNEL__  */
 
-#endif                         /* __KERNEL__ */
+#endif  /*  _LINUX_REISERFS_XATTR_H  */
index c6a48bfc8b14700b5dee19e9b6630744c5187129..759a0f97bec23db4e26bddcfe124e095ced54b3a 100644 (file)
@@ -24,7 +24,7 @@
 /*
  * Tracks changes to rchan/rchan_buf structs
  */
-#define RELAYFS_CHANNEL_VERSION                6
+#define RELAYFS_CHANNEL_VERSION                7
 
 /*
  * Per-cpu relay channel buffer
@@ -64,6 +64,10 @@ struct rchan
        void *private_data;             /* for user-defined data */
        size_t last_toobig;             /* tried to log event > subbuf size */
        struct rchan_buf *buf[NR_CPUS]; /* per-cpu channel buffers */
+       int is_global;                  /* One global buffer ? */
+       struct list_head list;          /* for channel list */
+       struct dentry *parent;          /* parent dentry passed to open */
+       char base_filename[NAME_MAX];   /* saved base filename */
 };
 
 /*
@@ -162,7 +166,8 @@ struct rchan *relay_open(const char *base_filename,
                         struct dentry *parent,
                         size_t subbuf_size,
                         size_t n_subbufs,
-                        struct rchan_callbacks *cb);
+                        struct rchan_callbacks *cb,
+                        void *private_data);
 extern void relay_close(struct rchan *chan);
 extern void relay_flush(struct rchan *chan);
 extern void relay_subbufs_consumed(struct rchan *chan,
index d93857056cb99b1a45de079ab9e8101231d3f003..68e3f6853fa69a1950f106e6fd60ec37233865d9 100644 (file)
@@ -25,6 +25,7 @@
 
 #define RIO_ANY_DESTID         0xff
 #define RIO_NO_HOPCOUNT                -1
+#define RIO_INVALID_DESTID     0xffff
 
 #define RIO_MAX_MPORT_RESOURCES        16
 #define RIO_MAX_DEV_RESOURCES  16
index 4463735351904f039b1c3239f6161f52ce88ad77..5053dc01fad4148c89eff49723056ed0be7f9190 100644 (file)
@@ -436,7 +436,7 @@ struct signal_struct {
 
        /* job control IDs */
        pid_t pgrp;
-       pid_t tty_old_pgrp;
+       struct pid *tty_old_pgrp;
 
        union {
                pid_t session __deprecated;
@@ -1013,8 +1013,10 @@ struct task_struct {
  * to a stack based synchronous wait) if its doing sync IO.
  */
        wait_queue_t *io_wait;
+#ifdef CONFIG_TASK_XACCT
 /* i/o counters(bytes read/written, #syscalls */
        u64 rchar, wchar, syscr, syscw;
+#endif
        struct task_io_accounting ioac;
 #if defined(CONFIG_TASK_XACCT)
        u64 acct_rss_mem1;      /* accumulated rss usage */
@@ -1327,14 +1329,11 @@ extern int kill_pid_info(int sig, struct siginfo *info, struct pid *pid);
 extern int kill_pid_info_as_uid(int, struct siginfo *, struct pid *, uid_t, uid_t, u32);
 extern int kill_pgrp(struct pid *pid, int sig, int priv);
 extern int kill_pid(struct pid *pid, int sig, int priv);
-extern int __kill_pg_info(int sig, struct siginfo *info, pid_t pgrp);
-extern int kill_pg_info(int, struct siginfo *, pid_t);
 extern void do_notify_parent(struct task_struct *, int);
 extern void force_sig(int, struct task_struct *);
 extern void force_sig_specific(int, struct task_struct *);
 extern int send_sig(int, struct task_struct *, int);
 extern void zap_other_threads(struct task_struct *p);
-extern int kill_pg(pid_t, int, int);
 extern int kill_proc(pid_t, int, int);
 extern struct sigqueue *sigqueue_alloc(void);
 extern void sigqueue_free(struct sigqueue *);
@@ -1649,6 +1648,44 @@ extern int sched_create_sysfs_power_savings_entries(struct sysdev_class *cls);
 
 extern void normalize_rt_tasks(void);
 
+#ifdef CONFIG_TASK_XACCT
+static inline void add_rchar(struct task_struct *tsk, ssize_t amt)
+{
+       tsk->rchar += amt;
+}
+
+static inline void add_wchar(struct task_struct *tsk, ssize_t amt)
+{
+       tsk->wchar += amt;
+}
+
+static inline void inc_syscr(struct task_struct *tsk)
+{
+       tsk->syscr++;
+}
+
+static inline void inc_syscw(struct task_struct *tsk)
+{
+       tsk->syscw++;
+}
+#else
+static inline void add_rchar(struct task_struct *tsk, ssize_t amt)
+{
+}
+
+static inline void add_wchar(struct task_struct *tsk, ssize_t amt)
+{
+}
+
+static inline void inc_syscr(struct task_struct *tsk)
+{
+}
+
+static inline void inc_syscw(struct task_struct *tsk)
+{
+}
+#endif
+
 #endif /* __KERNEL__ */
 
 #endif
index 83cdefae993165cce7e8601dc127fcb520420161..7f88d97575fde375b4e808743b1038ff6fd84241 100644 (file)
@@ -492,7 +492,7 @@ struct request_sock;
  *     Note that the fown_struct, @fown, is never outside the context of a
  *     struct file, so the file structure (and associated security information)
  *     can always be obtained:
- *             (struct file *)((long)fown - offsetof(struct file,f_owner));
+ *             container_of(fown, struct file, f_owner)
  *     @tsk contains the structure of task receiving signal.
  *     @fown contains the file owner information.
  *     @sig is the signal that will be sent.  When 0, kernel sends SIGIO.
@@ -2130,7 +2130,7 @@ extern int mod_reg_security       (const char *name, struct security_operations *ops);
 extern int mod_unreg_security  (const char *name, struct security_operations *ops);
 extern struct dentry *securityfs_create_file(const char *name, mode_t mode,
                                             struct dentry *parent, void *data,
-                                            struct file_operations *fops);
+                                            const struct file_operations *fops);
 extern struct dentry *securityfs_create_dir(const char *name, struct dentry *parent);
 extern void securityfs_remove(struct dentry *dentry);
 
index cf23813cbec2a449cadec31f9d68e50e4a4f0bf3..586aaba917208ced8590539809f11228e6ee816d 100644 (file)
 /*Digi jsm */
 #define PORT_JSM        69
 
-#define PORT_IP3106    70
+#define PORT_PNX8XXX   70
 
 /* Hilscher netx */
 #define PORT_NETX      71
diff --git a/include/linux/serial_ip3106.h b/include/linux/serial_ip3106.h
deleted file mode 100644 (file)
index f500ac6..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Embedded Alley Solutions, source@embeddedalley.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
- */
-
-#ifndef _LINUX_SERIAL_IP3106_H
-#define _LINUX_SERIAL_IP3106_H
-
-#include <linux/serial_core.h>
-#include <linux/device.h>
-
-#define IP3106_NR_PORTS                2
-
-struct ip3106_port {
-       struct uart_port        port;
-       struct timer_list       timer;
-       unsigned int            old_status;
-};
-
-/* register offsets */
-#define IP3106_LCR             0
-#define IP3106_MCR             0x004
-#define IP3106_BAUD            0x008
-#define IP3106_CFG             0x00c
-#define IP3106_FIFO            0x028
-#define IP3106_ISTAT           0xfe0
-#define IP3106_IEN             0xfe4
-#define IP3106_ICLR            0xfe8
-#define IP3106_ISET            0xfec
-#define IP3106_PD              0xff4
-#define IP3106_MID             0xffc
-
-#define IP3106_UART_LCR_TXBREAK                (1<<30)
-#define IP3106_UART_LCR_PAREVN         0x10000000
-#define IP3106_UART_LCR_PAREN          0x08000000
-#define IP3106_UART_LCR_2STOPB         0x04000000
-#define IP3106_UART_LCR_8BIT           0x01000000
-#define IP3106_UART_LCR_TX_RST         0x00040000
-#define IP3106_UART_LCR_RX_RST         0x00020000
-#define IP3106_UART_LCR_RX_NEXT                0x00010000
-
-#define IP3106_UART_MCR_SCR            0xFF000000
-#define IP3106_UART_MCR_DCD            0x00800000
-#define IP3106_UART_MCR_CTS            0x00100000
-#define IP3106_UART_MCR_LOOP           0x00000010
-#define IP3106_UART_MCR_RTS            0x00000002
-#define IP3106_UART_MCR_DTR            0x00000001
-
-#define IP3106_UART_INT_TX             0x00000080
-#define IP3106_UART_INT_EMPTY          0x00000040
-#define IP3106_UART_INT_RCVTO          0x00000020
-#define IP3106_UART_INT_RX             0x00000010
-#define IP3106_UART_INT_RXOVRN         0x00000008
-#define IP3106_UART_INT_FRERR          0x00000004
-#define IP3106_UART_INT_BREAK          0x00000002
-#define IP3106_UART_INT_PARITY         0x00000001
-#define IP3106_UART_INT_ALLRX          0x0000003F
-#define IP3106_UART_INT_ALLTX          0x000000C0
-
-#define IP3106_UART_FIFO_TXFIFO                0x001F0000
-#define IP3106_UART_FIFO_TXFIFO_STA    (0x1f<<16)
-#define IP3106_UART_FIFO_RXBRK         0x00008000
-#define IP3106_UART_FIFO_RXFE          0x00004000
-#define IP3106_UART_FIFO_RXPAR         0x00002000
-#define IP3106_UART_FIFO_RXFIFO                0x00001F00
-#define IP3106_UART_FIFO_RBRTHR                0x000000FF
-
-#endif
diff --git a/include/linux/serial_pnx8xxx.h b/include/linux/serial_pnx8xxx.h
new file mode 100644 (file)
index 0000000..de6c19c
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Embedded Alley Solutions, source@embeddedalley.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
+ */
+
+#ifndef _LINUX_SERIAL_PNX8XXX_H
+#define _LINUX_SERIAL_PNX8XXX_H
+
+#include <linux/serial_core.h>
+#include <linux/device.h>
+
+#define PNX8XXX_NR_PORTS       2
+
+struct pnx8xxx_port {
+       struct uart_port        port;
+       struct timer_list       timer;
+       unsigned int            old_status;
+};
+
+/* register offsets */
+#define PNX8XXX_LCR            0
+#define PNX8XXX_MCR            0x004
+#define PNX8XXX_BAUD           0x008
+#define PNX8XXX_CFG            0x00c
+#define PNX8XXX_FIFO           0x028
+#define PNX8XXX_ISTAT          0xfe0
+#define PNX8XXX_IEN            0xfe4
+#define PNX8XXX_ICLR           0xfe8
+#define PNX8XXX_ISET           0xfec
+#define PNX8XXX_PD             0xff4
+#define PNX8XXX_MID            0xffc
+
+#define PNX8XXX_UART_LCR_TXBREAK       (1<<30)
+#define PNX8XXX_UART_LCR_PAREVN                0x10000000
+#define PNX8XXX_UART_LCR_PAREN         0x08000000
+#define PNX8XXX_UART_LCR_2STOPB                0x04000000
+#define PNX8XXX_UART_LCR_8BIT          0x01000000
+#define PNX8XXX_UART_LCR_TX_RST                0x00040000
+#define PNX8XXX_UART_LCR_RX_RST                0x00020000
+#define PNX8XXX_UART_LCR_RX_NEXT       0x00010000
+
+#define PNX8XXX_UART_MCR_SCR           0xFF000000
+#define PNX8XXX_UART_MCR_DCD           0x00800000
+#define PNX8XXX_UART_MCR_CTS           0x00100000
+#define PNX8XXX_UART_MCR_LOOP          0x00000010
+#define PNX8XXX_UART_MCR_RTS           0x00000002
+#define PNX8XXX_UART_MCR_DTR           0x00000001
+
+#define PNX8XXX_UART_INT_TX            0x00000080
+#define PNX8XXX_UART_INT_EMPTY         0x00000040
+#define PNX8XXX_UART_INT_RCVTO         0x00000020
+#define PNX8XXX_UART_INT_RX            0x00000010
+#define PNX8XXX_UART_INT_RXOVRN                0x00000008
+#define PNX8XXX_UART_INT_FRERR         0x00000004
+#define PNX8XXX_UART_INT_BREAK         0x00000002
+#define PNX8XXX_UART_INT_PARITY                0x00000001
+#define PNX8XXX_UART_INT_ALLRX         0x0000003F
+#define PNX8XXX_UART_INT_ALLTX         0x000000C0
+
+#define PNX8XXX_UART_FIFO_TXFIFO       0x001F0000
+#define PNX8XXX_UART_FIFO_TXFIFO_STA   (0x1f<<16)
+#define PNX8XXX_UART_FIFO_RXBRK                0x00008000
+#define PNX8XXX_UART_FIFO_RXFE         0x00004000
+#define PNX8XXX_UART_FIFO_RXPAR                0x00002000
+#define PNX8XXX_UART_FIFO_RXFIFO       0x00001F00
+#define PNX8XXX_UART_FIFO_RBRTHR       0x000000FF
+
+#endif
index 4b463e66ddeab265d0c1b48cc092e2e594dd46b6..5e4364644ed13eedadbb3e11256f44b63886b618 100644 (file)
@@ -19,7 +19,9 @@
 struct cache_sizes {
        size_t                  cs_size;
        struct kmem_cache       *cs_cachep;
+#ifdef CONFIG_ZONE_DMA
        struct kmem_cache       *cs_dmacachep;
+#endif
 };
 extern struct cache_sizes malloc_sizes[];
 
@@ -39,9 +41,12 @@ static inline void *kmalloc(size_t size, gfp_t flags)
                        __you_cannot_kmalloc_that_much();
                }
 found:
-               return kmem_cache_alloc((flags & GFP_DMA) ?
-                       malloc_sizes[i].cs_dmacachep :
-                       malloc_sizes[i].cs_cachep, flags);
+#ifdef CONFIG_ZONE_DMA
+               if (flags & GFP_DMA)
+                       return kmem_cache_alloc(malloc_sizes[i].cs_dmacachep,
+                                               flags);
+#endif
+               return kmem_cache_alloc(malloc_sizes[i].cs_cachep, flags);
        }
        return __kmalloc(size, flags);
 }
@@ -62,9 +67,12 @@ static inline void *kzalloc(size_t size, gfp_t flags)
                        __you_cannot_kzalloc_that_much();
                }
 found:
-               return kmem_cache_zalloc((flags & GFP_DMA) ?
-                       malloc_sizes[i].cs_dmacachep :
-                       malloc_sizes[i].cs_cachep, flags);
+#ifdef CONFIG_ZONE_DMA
+               if (flags & GFP_DMA)
+                       return kmem_cache_zalloc(malloc_sizes[i].cs_dmacachep,
+                                               flags);
+#endif
+               return kmem_cache_zalloc(malloc_sizes[i].cs_cachep, flags);
        }
        return __kzalloc(size, flags);
 }
@@ -88,9 +96,13 @@ static inline void *kmalloc_node(size_t size, gfp_t flags, int node)
                        __you_cannot_kmalloc_that_much();
                }
 found:
-               return kmem_cache_alloc_node((flags & GFP_DMA) ?
-                       malloc_sizes[i].cs_dmacachep :
-                       malloc_sizes[i].cs_cachep, flags, node);
+#ifdef CONFIG_ZONE_DMA
+               if (flags & GFP_DMA)
+                       return kmem_cache_alloc_node(malloc_sizes[i].cs_dmacachep,
+                                               flags, node);
+#endif
+               return kmem_cache_alloc_node(malloc_sizes[i].cs_cachep,
+                                               flags, node);
        }
        return __kmalloc_node(size, flags, node);
 }
index fcd35a210e7f7d5eed13b7c4e243b4ee3a9c7a50..28157a36e6ccd69ce4ae091fe835162364813e7c 100644 (file)
@@ -16,7 +16,7 @@ struct __kernel_sockaddr_storage {
                                /* _SS_MAXSIZE value minus size of ss_family */
 } __attribute__ ((aligned(_K_SS_ALIGNSIZE)));  /* force desired alignment */
 
-#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)
+#ifdef __KERNEL__
 
 #include <asm/socket.h>                        /* arch-dependent defines       */
 #include <linux/sockios.h>             /* the SIOCxxx I/O controls     */
index adb3dafd33e96a6d12c122fc62101b6c7a5c0947..3387e44dfd13bdef5014e050aff8e85637387048 100644 (file)
@@ -5,9 +5,17 @@
  *
  * It's OK if the min/max values are zero.
  */
+enum ads7846_filter {
+       ADS7846_FILTER_OK,
+       ADS7846_FILTER_REPEAT,
+       ADS7846_FILTER_IGNORE,
+};
+
 struct ads7846_platform_data {
        u16     model;                  /* 7843, 7845, 7846. */
        u16     vref_delay_usecs;       /* 0 for external vref; etc */
+       int     keep_vref_on:1;         /* set to keep vref on for differential
+                                        * measurements as well */
        u16     x_plate_ohms;
        u16     y_plate_ohms;
 
@@ -21,5 +29,9 @@ struct ads7846_platform_data {
        u16     debounce_rep;           /* additional consecutive good readings
                                         * required after the first two */
        int     (*get_pendown_state)(void);
+       int     (*filter_init)  (struct ads7846_platform_data *pdata,
+                                void **filter_data);
+       int     (*filter)       (void *filter_data, int data_idx, int *val);
+       void    (*filter_cleanup)(void *filter_data);
 };
 
diff --git a/include/linux/spi/eeprom.h b/include/linux/spi/eeprom.h
new file mode 100644 (file)
index 0000000..1085212
--- /dev/null
@@ -0,0 +1,22 @@
+#ifndef __LINUX_SPI_EEPROM_H
+#define __LINUX_SPI_EEPROM_H
+
+/*
+ * Put one of these structures in platform_data for SPI EEPROMS handled
+ * by the "at25" driver.  On SPI, most EEPROMS understand the same core
+ * command set.  If you need to support EEPROMs that don't yet fit, add
+ * flags to support those protocol options.  These values all come from
+ * the chip datasheets.
+ */
+struct spi_eeprom {
+       u32             byte_len;
+       char            name[10];
+       u16             page_size;              /* for writes */
+       u16             flags;
+#define        EE_ADDR1        0x0001                  /*  8 bit addrs */
+#define        EE_ADDR2        0x0002                  /* 16 bit addrs */
+#define        EE_ADDR3        0x0004                  /* 24 bit addrs */
+#define        EE_READONLY     0x0008                  /* disallow writes */
+};
+
+#endif /* __LINUX_SPI_EEPROM_H */
index 176f6e36dbfacbf4279593500a56c83230947095..4f0f8c2e58a5f1cfd937cdb8291cd34b0e5d454e 100644 (file)
@@ -114,6 +114,17 @@ static inline void spi_set_ctldata(struct spi_device *spi, void *state)
        spi->controller_state = state;
 }
 
+/* device driver data */
+
+static inline void spi_set_drvdata(struct spi_device *spi, void *data)
+{
+       dev_set_drvdata(&spi->dev, data);
+}
+
+static inline void *spi_get_drvdata(struct spi_device *spi)
+{
+       return dev_get_drvdata(&spi->dev);
+}
 
 struct spi_message;
 
@@ -137,13 +148,11 @@ extern int spi_register_driver(struct spi_driver *sdrv);
 
 static inline void spi_unregister_driver(struct spi_driver *sdrv)
 {
-       if (!sdrv)
-               return;
-       driver_unregister(&sdrv->driver);
+       if (sdrv)
+               driver_unregister(&sdrv->driver);
 }
 
 
-
 /**
  * struct spi_master - interface to SPI master controller
  * @cdev: class interface to this driver
@@ -154,7 +163,8 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)
  *     each slave has a chipselect signal, but it's common that not
  *     every chipselect is connected to a slave.
  * @setup: updates the device mode and clocking records used by a
- *     device's SPI controller; protocol code may call this.
+ *     device's SPI controller; protocol code may call this.  This
+ *     must fail if an unrecognized or unsupported mode is requested.
  * @transfer: adds a message to the controller's transfer queue.
  * @cleanup: frees controller-specific state
  *
@@ -211,7 +221,7 @@ struct spi_master {
                                                struct spi_message *mesg);
 
        /* called on release() to free memory provided by spi_master */
-       void                    (*cleanup)(const struct spi_device *spi);
+       void                    (*cleanup)(struct spi_device *spi);
 };
 
 static inline void *spi_master_get_devdata(struct spi_master *master)
@@ -296,6 +306,16 @@ extern struct spi_master *spi_busnum_to_master(u16 busnum);
  * shifting out three bytes with word size of sixteen or twenty bits;
  * the former uses two bytes per word, the latter uses four bytes.)
  *
+ * In-memory data values are always in native CPU byte order, translated
+ * from the wire byte order (big-endian except with SPI_LSB_FIRST).  So
+ * for example when bits_per_word is sixteen, buffers are 2N bytes long
+ * and hold N sixteen bit words in CPU byte order.
+ *
+ * When the word size of the SPI transfer is not a power-of-two multiple
+ * of eight bits, those in-memory words include extra bits.  In-memory
+ * words are always seen by protocol drivers as right-justified, so the
+ * undefined (rx) or unused (tx) bits are always the most significant bits.
+ *
  * All SPI transfers start with the relevant chipselect active.  Normally
  * it stays selected until after the last transfer in a message.  Drivers
  * can affect the chipselect signal using cs_change:
@@ -453,6 +473,11 @@ static inline void spi_message_free(struct spi_message *m)
  * changes those settings, and must be called from a context that can sleep.
  * The changes take effect the next time the device is selected and data
  * is transferred to or from it.
+ *
+ * Note that this call wil fail if the protocol driver specifies an option
+ * that the underlying controller or its driver does not support.  For
+ * example, not all hardware supports wire transfers using nine bit words,
+ * LSB-first wire encoding, or active-high chipselects.
  */
 static inline int
 spi_setup(struct spi_device *spi)
index 16ce178f54d7a0de40a69ebabfdddc488f4039fa..2e8c048b9b80f9bf539c96a7dcf12a5d86bad27f 100644 (file)
@@ -55,7 +55,7 @@ struct spi_bitbang {
  * methods, if you like.
  */
 extern int spi_bitbang_setup(struct spi_device *spi);
-extern void spi_bitbang_cleanup(const struct spi_device *spi);
+extern void spi_bitbang_cleanup(struct spi_device *spi);
 extern int spi_bitbang_transfer(struct spi_device *spi, struct spi_message *m);
 extern int spi_bitbang_setup_transfer(struct spi_device *spi,
                                      struct spi_transfer *t);
index 94b767d6427561297772ad556d9466333f424732..61fef376ed2e6161299719f8b3a7cfaf4f246b33 100644 (file)
@@ -228,15 +228,30 @@ do {                                                              \
 # define read_unlock_irq(lock)         _read_unlock_irq(lock)
 # define write_unlock_irq(lock)                _write_unlock_irq(lock)
 #else
-# define spin_unlock(lock)             __raw_spin_unlock(&(lock)->raw_lock)
-# define read_unlock(lock)             __raw_read_unlock(&(lock)->raw_lock)
-# define write_unlock(lock)            __raw_write_unlock(&(lock)->raw_lock)
-# define spin_unlock_irq(lock) \
-    do { __raw_spin_unlock(&(lock)->raw_lock); local_irq_enable(); } while (0)
-# define read_unlock_irq(lock) \
-    do { __raw_read_unlock(&(lock)->raw_lock); local_irq_enable(); } while (0)
-# define write_unlock_irq(lock) \
-    do { __raw_write_unlock(&(lock)->raw_lock); local_irq_enable(); } while (0)
+# define spin_unlock(lock) \
+    do {__raw_spin_unlock(&(lock)->raw_lock); __release(lock); } while (0)
+# define read_unlock(lock) \
+    do {__raw_read_unlock(&(lock)->raw_lock); __release(lock); } while (0)
+# define write_unlock(lock) \
+    do {__raw_write_unlock(&(lock)->raw_lock); __release(lock); } while (0)
+# define spin_unlock_irq(lock)                 \
+do {                                           \
+       __raw_spin_unlock(&(lock)->raw_lock);   \
+       __release(lock);                        \
+       local_irq_enable();                     \
+} while (0)
+# define read_unlock_irq(lock)                 \
+do {                                           \
+       __raw_read_unlock(&(lock)->raw_lock);   \
+       __release(lock);                        \
+       local_irq_enable();                     \
+} while (0)
+# define write_unlock_irq(lock)                        \
+do {                                           \
+       __raw_write_unlock(&(lock)->raw_lock);  \
+       __release(lock);                        \
+       local_irq_enable();                     \
+} while (0)
 #endif
 
 #define spin_unlock_irqrestore(lock, flags) \
index 679ef0d70b6b1bae44fb4d9a60af100b1ec2d8fb..4f8539ccff6cf8addcf9d3561d58d5ba8b518c26 100644 (file)
@@ -7,7 +7,7 @@
 
 #endif
 
-#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)
+#ifdef __KERNEL__
 
 #define S_IFMT  00170000
 #define S_IFSOCK 0140000
index a1be89deb3af7cb0f5d592b5bbfcdb82e216ccd0..c7a78eef2b4faf21171c175607a249d4b5c983bf 100644 (file)
@@ -40,6 +40,7 @@ struct rpc_clnt {
 
        unsigned int            cl_softrtry : 1,/* soft timeouts */
                                cl_intr     : 1,/* interruptible */
+                               cl_discrtry : 1,/* disconnect before retry */
                                cl_autobind : 1,/* use getport() */
                                cl_oneshot  : 1,/* dispose after use */
                                cl_dead     : 1;/* abandoned */
@@ -111,6 +112,7 @@ struct rpc_create_args {
 #define RPC_CLNT_CREATE_ONESHOT                (1UL << 3)
 #define RPC_CLNT_CREATE_NONPRIVPORT    (1UL << 4)
 #define RPC_CLNT_CREATE_NOPING         (1UL << 5)
+#define RPC_CLNT_CREATE_DISCRTRY       (1UL << 6)
 
 struct rpc_clnt *rpc_create(struct rpc_create_args *args);
 struct rpc_clnt        *rpc_bind_new_program(struct rpc_clnt *,
index 60fce3c928570166fdf354eee838adc22dc24d37..b7c7307ceec6bc8865104713559d800d6e1967c8 100644 (file)
@@ -78,7 +78,6 @@ void          rpc_unregister_sysctl(void);
  * module currently registers its sysctl table dynamically, the sysctl path
  * for module FOO is <CTL_SUNRPC, CTL_FOODEBUG>.
  */
-#define CTL_SUNRPC     7249    /* arbitrary and hopefully unused */
 
 enum {
        CTL_RPCDEBUG = 1,
index 8b6ce60ea0578f0284e74029f507b8f224831e85..de9fc576fa1c8000b56683650a6b250b15a7e5b6 100644 (file)
@@ -253,7 +253,7 @@ void                rpc_put_task(struct rpc_task *);
 void           rpc_exit_task(struct rpc_task *);
 void           rpc_release_calldata(const struct rpc_call_ops *, void *);
 void           rpc_killall_tasks(struct rpc_clnt *);
-int            rpc_execute(struct rpc_task *);
+void           rpc_execute(struct rpc_task *);
 void           rpc_init_priority_wait_queue(struct rpc_wait_queue *, const char *);
 void           rpc_init_wait_queue(struct rpc_wait_queue *, const char *);
 void           rpc_sleep_on(struct rpc_wait_queue *, struct rpc_task *,
index 64f3d60c72af2e918de63c2a28469176a1248dff..83b3c7b433aa452dae0e1e79028ba29171c1b9c3 100644 (file)
@@ -11,6 +11,7 @@
 #define SUNRPC_SVC_H
 
 #include <linux/in.h>
+#include <linux/in6.h>
 #include <linux/sunrpc/types.h>
 #include <linux/sunrpc/xdr.h>
 #include <linux/sunrpc/auth.h>
@@ -191,7 +192,13 @@ static inline void svc_putu32(struct kvec *iov, __be32 val)
        iov->iov_len += sizeof(__be32);
 }
 
-       
+union svc_addr_u {
+    struct in_addr     addr;
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+    struct in6_addr    addr6;
+#endif
+};
+
 /*
  * The context of a single thread, including the request currently being
  * processed.
@@ -200,8 +207,8 @@ struct svc_rqst {
        struct list_head        rq_list;        /* idle list */
        struct list_head        rq_all;         /* all threads list */
        struct svc_sock *       rq_sock;        /* socket */
-       struct sockaddr_in      rq_addr;        /* peer address */
-       int                     rq_addrlen;
+       struct sockaddr_storage rq_addr;        /* peer address */
+       size_t                  rq_addrlen;
 
        struct svc_serv *       rq_server;      /* RPC service definition */
        struct svc_pool *       rq_pool;        /* thread pool */
@@ -227,8 +234,8 @@ struct svc_rqst {
        unsigned short
                                rq_secure  : 1; /* secure port */
 
-
-       __be32                  rq_daddr;       /* dest addr of request - reply from here */
+       union svc_addr_u        rq_daddr;       /* dest addr of request
+                                                *  - reply from here */
 
        void *                  rq_argp;        /* decoded arguments */
        void *                  rq_resp;        /* xdr'd results */
@@ -255,6 +262,24 @@ struct svc_rqst {
        struct task_struct      *rq_task;       /* service thread */
 };
 
+/*
+ * Rigorous type checking on sockaddr type conversions
+ */
+static inline struct sockaddr_in *svc_addr_in(struct svc_rqst *rqst)
+{
+       return (struct sockaddr_in *) &rqst->rq_addr;
+}
+
+static inline struct sockaddr_in6 *svc_addr_in6(struct svc_rqst *rqst)
+{
+       return (struct sockaddr_in6 *) &rqst->rq_addr;
+}
+
+static inline struct sockaddr *svc_addr(struct svc_rqst *rqst)
+{
+       return (struct sockaddr *) &rqst->rq_addr;
+}
+
 /*
  * Check buffer bounds after decoding arguments
  */
@@ -292,9 +317,10 @@ static inline void svc_free_res_pages(struct svc_rqst *rqstp)
 
 struct svc_deferred_req {
        u32                     prot;   /* protocol (UDP or TCP) */
-       struct sockaddr_in      addr;
-       struct svc_sock         *svsk;  /* where reply must go */
-       __be32                  daddr;  /* where reply must come from */
+       struct svc_sock         *svsk;
+       struct sockaddr_storage addr;   /* where reply must go */
+       size_t                  addrlen;
+       union svc_addr_u        daddr;  /* where reply must come from */
        struct cache_deferred_req handle;
        int                     argslen;
        __be32                  args[0];
@@ -368,5 +394,8 @@ int            svc_register(struct svc_serv *, int, unsigned short);
 void              svc_wake_up(struct svc_serv *);
 void              svc_reserve(struct svc_rqst *rqstp, int space);
 struct svc_pool *  svc_pool_for_cpu(struct svc_serv *serv, int cpu);
+char *            svc_print_addr(struct svc_rqst *, char *, size_t);
+
+#define        RPC_MAX_ADDRBUFLEN      (63U)
 
 #endif /* SUNRPC_SVC_H */
index db312a1e2eebc70bca97465b0e28c5f6a7056bf6..cccea0a0feb48e83923cc10df72cd1b26133f244 100644 (file)
@@ -57,12 +57,15 @@ struct svc_sock {
 
        /* cache of various info for TCP sockets */
        void                    *sk_info_authunix;
+
+       struct sockaddr_storage sk_remote;      /* remote peer's address */
+       int                     sk_remotelen;   /* length of address */
 };
 
 /*
  * Function prototypes.
  */
-int            svc_makesock(struct svc_serv *, int, unsigned short);
+int            svc_makesock(struct svc_serv *, int, unsigned short, int flags);
 void           svc_close_socket(struct svc_sock *);
 int            svc_recv(struct svc_rqst *, long);
 int            svc_send(struct svc_rqst *);
@@ -74,4 +77,11 @@ int          svc_addsock(struct svc_serv *serv,
                            char *name_return,
                            int *proto);
 
+/*
+ * svc_makesock socket characteristics
+ */
+#define SVC_SOCK_DEFAULTS      (0U)
+#define SVC_SOCK_ANONYMOUS     (1U << 0)       /* don't register with pmap */
+#define SVC_SOCK_TEMPORARY     (1U << 1)       /* flag socket as temporary */
+
 #endif /* SUNRPC_SVCSOCK_H */
diff --git a/include/linux/svga.h b/include/linux/svga.h
new file mode 100644 (file)
index 0000000..eadb981
--- /dev/null
@@ -0,0 +1,124 @@
+#ifndef _LINUX_SVGA_H
+#define _LINUX_SVGA_H
+
+#ifdef __KERNEL__
+
+#include <linux/pci.h>
+#include <video/vga.h>
+
+/* Terminator for register set */
+
+#define VGA_REGSET_END_VAL     0xFF
+#define VGA_REGSET_END         {VGA_REGSET_END_VAL, 0, 0}
+
+struct vga_regset {
+       u8 regnum;
+       u8 lowbit;
+       u8 highbit;
+};
+
+/* ------------------------------------------------------------------------- */
+
+#define SVGA_FORMAT_END_VAL    0xFFFF
+#define SVGA_FORMAT_END                {SVGA_FORMAT_END_VAL, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, 0, 0, 0, 0, 0, 0}
+
+struct svga_fb_format {
+       /* var part */
+       u32 bits_per_pixel;
+       struct fb_bitfield red;
+       struct fb_bitfield green;
+       struct fb_bitfield blue;
+       struct fb_bitfield transp;
+       u32 nonstd;
+       /* fix part */
+       u32 type;
+       u32 type_aux;
+       u32 visual;
+       u32 xpanstep;
+       u32 xresstep;
+};
+
+struct svga_timing_regs {
+       const struct vga_regset *h_total_regs;
+       const struct vga_regset *h_display_regs;
+       const struct vga_regset *h_blank_start_regs;
+       const struct vga_regset *h_blank_end_regs;
+       const struct vga_regset *h_sync_start_regs;
+       const struct vga_regset *h_sync_end_regs;
+
+       const struct vga_regset *v_total_regs;
+       const struct vga_regset *v_display_regs;
+       const struct vga_regset *v_blank_start_regs;
+       const struct vga_regset *v_blank_end_regs;
+       const struct vga_regset *v_sync_start_regs;
+       const struct vga_regset *v_sync_end_regs;
+};
+
+struct svga_pll {
+       u16 m_min;
+       u16 m_max;
+       u16 n_min;
+       u16 n_max;
+       u16 r_min;
+       u16 r_max;  /* r_max < 32 */
+       u32 f_vco_min;
+       u32 f_vco_max;
+       u32 f_base;
+};
+
+
+/* Write a value to the attribute register */
+
+static inline void svga_wattr(u8 index, u8 data)
+{
+       inb(0x3DA);
+       outb(index, 0x3C0);
+       outb(data, 0x3C0);
+}
+
+/* Write a value to a sequence register with a mask */
+
+static inline void svga_wseq_mask(u8 index, u8 data, u8 mask)
+{
+       vga_wseq(NULL, index, (data & mask) | (vga_rseq(NULL, index) & ~mask));
+}
+
+/* Write a value to a CRT register with a mask */
+
+static inline void svga_wcrt_mask(u8 index, u8 data, u8 mask)
+{
+       vga_wcrt(NULL, index, (data & mask) | (vga_rcrt(NULL, index) & ~mask));
+}
+
+static inline int svga_primary_device(struct pci_dev *dev)
+{
+       u16 flags;
+       pci_read_config_word(dev, PCI_COMMAND, &flags);
+       return (flags & PCI_COMMAND_IO);
+}
+
+
+void svga_wcrt_multi(const struct vga_regset *regset, u32 value);
+void svga_wseq_multi(const struct vga_regset *regset, u32 value);
+
+void svga_set_default_gfx_regs(void);
+void svga_set_default_atc_regs(void);
+void svga_set_default_seq_regs(void);
+void svga_set_default_crt_regs(void);
+void svga_set_textmode_vga_regs(void);
+
+void svga_settile(struct fb_info *info, struct fb_tilemap *map);
+void svga_tilecopy(struct fb_info *info, struct fb_tilearea *area);
+void svga_tilefill(struct fb_info *info, struct fb_tilerect *rect);
+void svga_tileblit(struct fb_info *info, struct fb_tileblit *blit);
+void svga_tilecursor(struct fb_info *info, struct fb_tilecursor *cursor);
+
+int svga_compute_pll(const struct svga_pll *pll, u32 f_wanted, u16 *m, u16 *n, u16 *r, int node);
+int svga_check_timings(const struct svga_timing_regs *tm, struct fb_var_screeninfo *var, int node);
+void svga_set_timings(const struct svga_timing_regs *tm, struct fb_var_screeninfo *var, u32 hmul, u32 hdiv, u32 vmul, u32 vdiv, u32 hborder, int node);
+
+int svga_match_format(const struct svga_fb_format *frm, struct fb_var_screeninfo *var, struct fb_fix_screeninfo *fix);
+
+#endif /* __KERNEL__  */
+#endif /* _LINUX_SVGA_H */
+
index 5423559a44a6833b336e5b29b5863abdd5ccfe6a..006868881346b771eb471c91a4cde68047f3edc6 100644 (file)
@@ -170,11 +170,13 @@ extern void swapin_readahead(swp_entry_t, unsigned long, struct vm_area_struct *
 extern unsigned long totalram_pages;
 extern unsigned long totalreserve_pages;
 extern long nr_swap_pages;
-extern unsigned int nr_free_pages(void);
-extern unsigned int nr_free_pages_pgdat(pg_data_t *pgdat);
 extern unsigned int nr_free_buffer_pages(void);
 extern unsigned int nr_free_pagecache_pages(void);
 
+/* Definition of global_page_state not available yet */
+#define nr_free_pages() global_page_state(NR_FREE_PAGES)
+
+
 /* linux/mm/swap.c */
 extern void FASTCALL(lru_cache_add(struct page *));
 extern void FASTCALL(lru_cache_add_active(struct page *));
index 665412c4f4b910cdc8c60da3174a1f48ccbbd61d..2c5fb38d939260909fe7f549fd9f5159acbfe868 100644 (file)
@@ -53,7 +53,6 @@ struct __sysctl_args {
 
 /* For internal pattern-matching use only: */
 #ifdef __KERNEL__
-#define CTL_ANY                -1      /* Matches any name */
 #define CTL_NONE       0
 #define CTL_UNNUMBERED CTL_NONE        /* sysctl without a binary number */
 #endif
@@ -69,7 +68,13 @@ enum
        CTL_DEV=7,              /* Devices */
        CTL_BUS=8,              /* Busses */
        CTL_ABI=9,              /* Binary emulation */
-       CTL_CPU=10              /* CPU stuff (speed scaling, etc) */
+       CTL_CPU=10,             /* CPU stuff (speed scaling, etc) */
+       CTL_ARLAN=254,          /* arlan wireless driver */
+       CTL_APPLDATA=2120,      /* s390 appldata */
+       CTL_S390DBF=5677,       /* s390 debug */
+       CTL_SUNRPC=7249,        /* sunrpc debug */
+       CTL_PM=9899,            /* frv power management */
+       CTL_FRV=9898,           /* frv specific sysctls */
 };
 
 /* CTL_BUS names: */
@@ -202,6 +207,11 @@ enum
        VM_PANIC_ON_OOM=33,     /* panic at out-of-memory */
        VM_VDSO_ENABLED=34,     /* map VDSO into new processes? */
        VM_MIN_SLAB=35,          /* Percent pages ignored by zone reclaim */
+
+       /* s390 vm cmm sysctls */
+       VM_CMM_PAGES=1111,
+       VM_CMM_TIMED_PAGES=1112,
+       VM_CMM_TIMEOUT=1113,
 };
 
 
@@ -803,6 +813,7 @@ enum
        FS_AIO_NR=18,   /* current system-wide number of aio requests */
        FS_AIO_MAX_NR=19,       /* system-wide maximum number of aio requests */
        FS_INOTIFY=20,  /* inotify submenu */
+       FS_OCFS2=988,   /* ocfs2 */
 };
 
 /* /proc/sys/fs/quota/ */
@@ -913,7 +924,11 @@ enum
 #ifdef __KERNEL__
 #include <linux/list.h>
 
-extern void sysctl_init(void);
+/* For the /proc/sys support */
+struct ctl_table;
+extern struct ctl_table_header *sysctl_head_next(struct ctl_table_header *prev);
+extern void sysctl_head_finish(struct ctl_table_header *prev);
+extern int sysctl_perm(struct ctl_table *table, int op);
 
 typedef struct ctl_table ctl_table;
 
@@ -1007,9 +1022,9 @@ struct ctl_table
        int maxlen;
        mode_t mode;
        ctl_table *child;
+       ctl_table *parent;              /* Automatically set */
        proc_handler *proc_handler;     /* Callback for text formatting */
        ctl_handler *strategy;          /* Callback function for all r/w */
-       struct proc_dir_entry *de;      /* /proc control block */
        void *extra1;
        void *extra2;
 };
@@ -1024,8 +1039,8 @@ struct ctl_table_header
        struct completion *unregistering;
 };
 
-struct ctl_table_header * register_sysctl_table(ctl_table * table
-                                               int insert_at_head);
+struct ctl_table_header * register_sysctl_table(ctl_table * table);
+
 void unregister_sysctl_table(struct ctl_table_header * table);
 
 #else /* __KERNEL__ */
diff --git a/include/linux/tick.h b/include/linux/tick.h
new file mode 100644 (file)
index 0000000..9a7252e
--- /dev/null
@@ -0,0 +1,109 @@
+/*  linux/include/linux/tick.h
+ *
+ *  This file contains the structure definitions for tick related functions
+ *
+ */
+#ifndef _LINUX_TICK_H
+#define _LINUX_TICK_H
+
+#include <linux/clockchips.h>
+
+#ifdef CONFIG_GENERIC_CLOCKEVENTS
+
+enum tick_device_mode {
+       TICKDEV_MODE_PERIODIC,
+       TICKDEV_MODE_ONESHOT,
+};
+
+struct tick_device {
+       struct clock_event_device *evtdev;
+       enum tick_device_mode mode;
+};
+
+enum tick_nohz_mode {
+       NOHZ_MODE_INACTIVE,
+       NOHZ_MODE_LOWRES,
+       NOHZ_MODE_HIGHRES,
+};
+
+/**
+ * struct tick_sched - sched tick emulation and no idle tick control/stats
+ * @sched_timer:       hrtimer to schedule the periodic tick in high
+ *                     resolution mode
+ * @idle_tick:         Store the last idle tick expiry time when the tick
+ *                     timer is modified for idle sleeps. This is necessary
+ *                     to resume the tick timer operation in the timeline
+ *                     when the CPU returns from idle
+ * @tick_stopped:      Indicator that the idle tick has been stopped
+ * @idle_jiffies:      jiffies at the entry to idle for idle time accounting
+ * @idle_calls:                Total number of idle calls
+ * @idle_sleeps:       Number of idle calls, where the sched tick was stopped
+ * @idle_entrytime:    Time when the idle call was entered
+ * @idle_sleeptime:    Sum of the time slept in idle with sched tick stopped
+ */
+struct tick_sched {
+       struct hrtimer                  sched_timer;
+       unsigned long                   check_clocks;
+       enum tick_nohz_mode             nohz_mode;
+       ktime_t                         idle_tick;
+       int                             tick_stopped;
+       unsigned long                   idle_jiffies;
+       unsigned long                   idle_calls;
+       unsigned long                   idle_sleeps;
+       ktime_t                         idle_entrytime;
+       ktime_t                         idle_sleeptime;
+       unsigned long                   last_jiffies;
+       unsigned long                   next_jiffies;
+       ktime_t                         idle_expires;
+};
+
+extern void __init tick_init(void);
+extern int tick_is_oneshot_available(void);
+extern struct tick_device *tick_get_device(int cpu);
+
+# ifdef CONFIG_HIGH_RES_TIMERS
+extern int tick_init_highres(void);
+extern int tick_program_event(ktime_t expires, int force);
+extern void tick_setup_sched_timer(void);
+extern void tick_cancel_sched_timer(int cpu);
+# else
+static inline void tick_cancel_sched_timer(int cpu) { }
+# endif /* HIGHRES */
+
+# ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
+extern struct tick_device *tick_get_broadcast_device(void);
+extern cpumask_t *tick_get_broadcast_mask(void);
+
+#  ifdef CONFIG_TICK_ONESHOT
+extern cpumask_t *tick_get_broadcast_oneshot_mask(void);
+#  endif
+
+# endif /* BROADCAST */
+
+# ifdef CONFIG_TICK_ONESHOT
+extern void tick_clock_notify(void);
+extern int tick_check_oneshot_change(int allow_nohz);
+extern struct tick_sched *tick_get_tick_sched(int cpu);
+# else
+static inline void tick_clock_notify(void) { }
+static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
+# endif
+
+#else /* CONFIG_GENERIC_CLOCKEVENTS */
+static inline void tick_init(void) { }
+static inline void tick_cancel_sched_timer(int cpu) { }
+static inline void tick_clock_notify(void) { }
+static inline int tick_check_oneshot_change(int allow_nohz) { return 0; }
+#endif /* !CONFIG_GENERIC_CLOCKEVENTS */
+
+# ifdef CONFIG_NO_HZ
+extern void tick_nohz_stop_sched_tick(void);
+extern void tick_nohz_restart_sched_tick(void);
+extern void tick_nohz_update_jiffies(void);
+# else
+static inline void tick_nohz_stop_sched_tick(void) { }
+static inline void tick_nohz_restart_sched_tick(void) { }
+static inline void tick_nohz_update_jiffies(void) { }
+# endif /* !NO_HZ */
+
+#endif
index a5b739967b74f46f745526952b1c947c236cf75a..8ea8dea713c7c5d7a7da0fcd2e72d3d70f9112af 100644 (file)
@@ -46,7 +46,7 @@ static inline int timespec_equal(struct timespec *a, struct timespec *b)
  * lhs == rhs: return 0
  * lhs > rhs:  return >0
  */
-static inline int timespec_compare(struct timespec *lhs, struct timespec *rhs)
+static inline int timespec_compare(const struct timespec *lhs, const struct timespec *rhs)
 {
        if (lhs->tv_sec < rhs->tv_sec)
                return -1;
@@ -55,7 +55,7 @@ static inline int timespec_compare(struct timespec *lhs, struct timespec *rhs)
        return lhs->tv_nsec - rhs->tv_nsec;
 }
 
-static inline int timeval_compare(struct timeval *lhs, struct timeval *rhs)
+static inline int timeval_compare(const struct timeval *lhs, const struct timeval *rhs)
 {
        if (lhs->tv_sec < rhs->tv_sec)
                return -1;
@@ -90,8 +90,9 @@ static inline struct timespec timespec_sub(struct timespec lhs,
 
 extern struct timespec xtime;
 extern struct timespec wall_to_monotonic;
-extern seqlock_t xtime_lock;
+extern seqlock_t xtime_lock __attribute__((weak));
 
+extern unsigned long read_persistent_clock(void);
 void timekeeping_init(void);
 
 static inline unsigned long get_seconds(void)
index fb5edaaf0ebd11a05500ef64e1e56df5fa4f295b..719113b652dd55e31bd1f0afd039a55b1d972de0 100644 (file)
@@ -2,6 +2,7 @@
 #define _LINUX_TIMER_H
 
 #include <linux/list.h>
+#include <linux/ktime.h>
 #include <linux/spinlock.h>
 #include <linux/stddef.h>
 
@@ -15,6 +16,11 @@ struct timer_list {
        unsigned long data;
 
        struct tvec_t_base_s *base;
+#ifdef CONFIG_TIMER_STATS
+       void *start_site;
+       char start_comm[16];
+       int start_pid;
+#endif
 };
 
 extern struct tvec_t_base_s boot_tvec_bases;
@@ -61,7 +67,65 @@ extern int del_timer(struct timer_list * timer);
 extern int __mod_timer(struct timer_list *timer, unsigned long expires);
 extern int mod_timer(struct timer_list *timer, unsigned long expires);
 
+/*
+ * Return when the next timer-wheel timeout occurs (in absolute jiffies),
+ * locks the timer base:
+ */
 extern unsigned long next_timer_interrupt(void);
+/*
+ * Return when the next timer-wheel timeout occurs (in absolute jiffies),
+ * locks the timer base and does the comparison against the given
+ * jiffie.
+ */
+extern unsigned long get_next_timer_interrupt(unsigned long now);
+
+/*
+ * Timer-statistics info:
+ */
+#ifdef CONFIG_TIMER_STATS
+
+extern void init_timer_stats(void);
+
+extern void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
+                                    void *timerf, char * comm);
+
+static inline void timer_stats_account_timer(struct timer_list *timer)
+{
+       timer_stats_update_stats(timer, timer->start_pid, timer->start_site,
+                                timer->function, timer->start_comm);
+}
+
+extern void __timer_stats_timer_set_start_info(struct timer_list *timer,
+                                              void *addr);
+
+static inline void timer_stats_timer_set_start_info(struct timer_list *timer)
+{
+       __timer_stats_timer_set_start_info(timer, __builtin_return_address(0));
+}
+
+static inline void timer_stats_timer_clear_start_info(struct timer_list *timer)
+{
+       timer->start_site = NULL;
+}
+#else
+static inline void init_timer_stats(void)
+{
+}
+
+static inline void timer_stats_account_timer(struct timer_list *timer)
+{
+}
+
+static inline void timer_stats_timer_set_start_info(struct timer_list *timer)
+{
+}
+
+static inline void timer_stats_timer_clear_start_info(struct timer_list *timer)
+{
+}
+#endif
+
+extern void delayed_work_timer_fn(unsigned long __data);
 
 /**
  * add_timer - start a timer
@@ -96,7 +160,7 @@ static inline void add_timer(struct timer_list *timer)
 extern void init_timers(void);
 extern void run_local_timers(void);
 struct hrtimer;
-extern int it_real_fn(struct hrtimer *);
+extern enum hrtimer_restart it_real_fn(struct hrtimer *);
 
 unsigned long __round_jiffies(unsigned long j, int cpu);
 unsigned long __round_jiffies_relative(unsigned long j, int cpu);
index db501dc23c299e52af3ac357cd7af05478465d23..da929dbbea2a1c9ab246ee134bb83dcd9ec5c935 100644 (file)
@@ -255,10 +255,10 @@ struct time_interpolator {
        u8 jitter;                      /* if set compensate for fluctuations */
        u32 nsec_per_cyc;               /* set by register_time_interpolator() */
        void *addr;                     /* address of counter or function */
-       u64 mask;                       /* mask the valid bits of the counter */
+       cycles_t mask;                  /* mask the valid bits of the counter */
        unsigned long offset;           /* nsec offset at last update of interpolator */
        u64 last_counter;               /* counter value in units of the counter at last update */
-       u64 last_cycle;                 /* Last timer value if TIME_SOURCE_JITTER is set */
+       cycles_t last_cycle;            /* Last timer value if TIME_SOURCE_JITTER is set */
        u64 frequency;                  /* frequency in counts/second */
        long drift;                     /* drift in parts-per-million (or -1) */
        unsigned long skips;            /* skips forward */
@@ -286,6 +286,13 @@ static inline void time_interpolator_update(long delta_nsec)
 
 #define TICK_LENGTH_SHIFT      32
 
+#ifdef CONFIG_NO_HZ
+#define NTP_INTERVAL_FREQ  (2)
+#else
+#define NTP_INTERVAL_FREQ  (HZ)
+#endif
+#define NTP_INTERVAL_LENGTH (NSEC_PER_SEC/NTP_INTERVAL_FREQ)
+
 /* Returns how long ticks are at present, in ns / 2^(SHIFT_SCALE-10). */
 extern u64 current_tick_length(void);
 
index 916e5e3a699b695b963d2734fee707ffb7fc1af4..6a7c4edf0e138c38bc05cddd04603ee642cb9bf7 100644 (file)
@@ -33,4 +33,6 @@ typedef struct {
        unsigned int edi __attribute__ ((packed));
 } SMMRegisters;
 
+int tosh_smm(SMMRegisters *regs);
+
 #endif
index 65cbcf22c31e1e8ab7aef22b3b8da180825cf7cc..dee72b9a20fb320e6809002f3d186e4d0103e611 100644 (file)
 #define NR_PTYS        CONFIG_LEGACY_PTY_COUNT   /* Number of legacy ptys */
 #define NR_UNIX98_PTY_DEFAULT  4096      /* Default maximum for Unix98 ptys */
 #define NR_UNIX98_PTY_MAX      (1 << MINORBITS) /* Absolute limit */
-#define NR_LDISCS              16
+#define NR_LDISCS              17
+
+/* line disciplines */
+#define N_TTY          0
+#define N_SLIP         1
+#define N_MOUSE                2
+#define N_PPP          3
+#define N_STRIP                4
+#define N_AX25         5
+#define N_X25          6       /* X.25 async */
+#define N_6PACK                7
+#define N_MASC         8       /* Reserved for Mobitex module <kaz@cafe.net> */
+#define N_R3964                9       /* Reserved for Simatic R3964 module */
+#define N_PROFIBUS_FDL 10      /* Reserved for Profibus <Dave@mvhi.com> */
+#define N_IRDA         11      /* Linux IrDa - http://irda.sourceforge.net/ */
+#define N_SMSBLOCK     12      /* SMS block mode - for talking to GSM data */
+                               /* cards about SMS messages */
+#define N_HDLC         13      /* synchronous HDLC */
+#define N_SYNC_PPP     14      /* synchronous PPP */
+#define N_HCI          15      /* Bluetooth HCI UART */
+#define N_GIGASET_M101 16      /* Siemens Gigaset M101 serial DECT adapter */
 
 /*
  * This character is the same as _POSIX_VDISABLE: it cannot be used as
@@ -177,8 +197,8 @@ struct tty_struct {
        struct mutex termios_mutex;
        struct ktermios *termios, *termios_locked;
        char name[64];
-       int pgrp;
-       int session;
+       struct pid *pgrp;
+       struct pid *session;
        unsigned long flags;
        int count;
        struct winsize winsize;
@@ -283,7 +303,7 @@ extern int tty_read_raw_data(struct tty_struct *tty, unsigned char *bufp,
                             int buflen);
 extern void tty_write_message(struct tty_struct *tty, char *msg);
 
-extern int is_orphaned_pgrp(int pgrp);
+extern int is_current_pgrp_orphaned(void);
 extern int is_ignored(int sig);
 extern int tty_signal(int sig, struct tty_struct *tty);
 extern void tty_hangup(struct tty_struct * tty);
@@ -291,6 +311,7 @@ extern void tty_vhangup(struct tty_struct * tty);
 extern void tty_unhangup(struct file *filp);
 extern int tty_hung_up_p(struct file * filp);
 extern void do_SAK(struct tty_struct *tty);
+extern void __do_SAK(struct tty_struct *tty);
 extern void disassociate_ctty(int priv);
 extern void tty_flip_buffer_push(struct tty_struct *tty);
 extern speed_t tty_get_baud_rate(struct tty_struct *tty);
@@ -312,7 +333,6 @@ extern int tty_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
 
 extern dev_t tty_devnum(struct tty_struct *tty);
 extern void proc_clear_tty(struct task_struct *p);
-extern void __proc_set_tty(struct task_struct *tsk, struct tty_struct *tty);
 extern void proc_set_tty(struct task_struct *tsk, struct tty_struct *tty);
 extern struct tty_struct *get_current_tty(void);
 
index d3a4f994a5dcdc15b6e8452a799b97f3da26f72c..dc2e9fe694183722ed3dbc29c59cefd8aef2cefb 100644 (file)
@@ -40,13 +40,16 @@ typedef __u64 __fs64;
 typedef __u32 __fs32;
 typedef __u16 __fs16;
 #else
+#include <asm/div64.h>
 typedef __u64 __bitwise __fs64;
 typedef __u32 __bitwise __fs32;
 typedef __u16 __bitwise __fs16;
 #endif
 
+#ifdef __KERNEL__
 #include <linux/ufs_fs_i.h>
 #include <linux/ufs_fs_sb.h>
+#endif
 
 #define UFS_BBLOCK 0
 #define UFS_BBSIZE 8192
@@ -261,16 +264,9 @@ typedef __u16 __bitwise __fs16;
  */
 #define        ufs_inotocg(x)          ((x) / uspi->s_ipg)
 #define        ufs_inotocgoff(x)       ((x) % uspi->s_ipg)
-#define        ufs_inotofsba(x)        (ufs_cgimin(ufs_inotocg(x)) + ufs_inotocgoff(x) / uspi->s_inopf)
+#define        ufs_inotofsba(x)        (((u64)ufs_cgimin(ufs_inotocg(x))) + ufs_inotocgoff(x) / uspi->s_inopf)
 #define        ufs_inotofsbo(x)        ((x) % uspi->s_inopf)
 
-/*
- * Give cylinder group number for a file system block.
- * Give cylinder group block number for a file system block.
- */
-#define        ufs_dtog(d)     ((d) / uspi->s_fpg)
-#define        ufs_dtogd(d)    ((d) % uspi->s_fpg)
-
 /*
  * Compute the cylinder and rotational position of a cyl block addr.
  */
@@ -303,7 +299,7 @@ typedef __u16 __bitwise __fs16;
 #define UFS_MAXMNTLEN 512
 #define UFS2_MAXMNTLEN 468
 #define UFS2_MAXVOLLEN 32
-/* #define UFS_MAXCSBUFS 31 */
+#define UFS_MAXCSBUFS 31
 #define UFS_LINK_MAX 32000
 /*
 #define        UFS2_NOCSPTRS   ((128 / sizeof(void *)) - 4)
@@ -721,6 +717,7 @@ struct ufs_cg_private_info {
        __u32   c_nclusterblks; /* number of clusters this cg */
 };     
 
+
 struct ufs_sb_private_info {
        struct ufs_buffer_head s_ubh; /* buffer containing super block */
        struct ufs_csum_core cs_total;
@@ -754,7 +751,7 @@ struct ufs_sb_private_info {
        __u32   s_npsect;       /* # sectors/track including spares */
        __u32   s_interleave;   /* hardware sector interleave */
        __u32   s_trackskew;    /* sector 0 skew, per track */
-       __u32   s_csaddr;       /* blk addr of cyl grp summary area */
+       __u64   s_csaddr;       /* blk addr of cyl grp summary area */
        __u32   s_cssize;       /* size of cyl grp summary area */
        __u32   s_cgsize;       /* cylinder group size */
        __u32   s_ntrak;        /* tracks per cylinder */
@@ -950,17 +947,17 @@ struct ufs_super_block_third {
 #ifdef __KERNEL__
 
 /* balloc.c */
-extern void ufs_free_fragments (struct inode *, unsigned, unsigned);
-extern void ufs_free_blocks (struct inode *, unsigned, unsigned);
-extern unsigned ufs_new_fragments(struct inode *, __fs32 *, unsigned, unsigned,
-                                 unsigned, int *, struct page *);
+extern void ufs_free_fragments (struct inode *, u64, unsigned);
+extern void ufs_free_blocks (struct inode *, u64, unsigned);
+extern u64 ufs_new_fragments(struct inode *, void *, u64, u64,
+                            unsigned, int *, struct page *);
 
 /* cylinder.c */
 extern struct ufs_cg_private_info * ufs_load_cylinder (struct super_block *, unsigned);
 extern void ufs_put_cylinder (struct super_block *, unsigned);
 
 /* dir.c */
-extern struct inode_operations ufs_dir_inode_operations;
+extern const struct inode_operations ufs_dir_inode_operations;
 extern int ufs_add_link (struct dentry *, struct inode *);
 extern ino_t ufs_inode_by_name(struct inode *, struct dentry *);
 extern int ufs_make_empty(struct inode *, struct inode *);
@@ -972,7 +969,7 @@ extern void ufs_set_link(struct inode *dir, struct ufs_dir_entry *de,
                         struct page *page, struct inode *inode);
 
 /* file.c */
-extern struct inode_operations ufs_file_inode_operations;
+extern const struct inode_operations ufs_file_inode_operations;
 extern const struct file_operations ufs_file_operations;
 
 extern const struct address_space_operations ufs_aops;
@@ -999,7 +996,7 @@ extern void ufs_error (struct super_block *, const char *, const char *, ...) __
 extern void ufs_panic (struct super_block *, const char *, const char *, ...) __attribute__ ((format (printf, 3, 4)));
 
 /* symlink.c */
-extern struct inode_operations ufs_fast_symlink_inode_operations;
+extern const struct inode_operations ufs_fast_symlink_inode_operations;
 
 /* truncate.c */
 extern int ufs_truncate (struct inode *, loff_t);
@@ -1014,6 +1011,22 @@ static inline struct ufs_inode_info *UFS_I(struct inode *inode)
        return container_of(inode, struct ufs_inode_info, vfs_inode);
 }
 
+/*
+ * Give cylinder group number for a file system block.
+ * Give cylinder group block number for a file system block.
+ */
+/* #define     ufs_dtog(d)     ((d) / uspi->s_fpg) */
+static inline u64 ufs_dtog(struct ufs_sb_private_info * uspi, u64 b)
+{
+       do_div(b, uspi->s_fpg);
+       return b;
+}
+/* #define     ufs_dtogd(d)    ((d) % uspi->s_fpg) */
+static inline u32 ufs_dtogd(struct ufs_sb_private_info * uspi, u64 b)
+{
+       return do_div(b, uspi->s_fpg);
+}
+
 #endif /* __KERNEL__ */
 
 #endif /* __LINUX_UFS_FS_H */
index f50ce3b0cd524ed41454f8345cb2fffc4ee7b443..6496caa82f9ef12ac11316e7a95e71d2565925d7 100644 (file)
@@ -20,13 +20,12 @@ struct ufs_inode_info {
                __fs64  u2_i_data[15];
        } i_u1;
        __u32   i_flags;
-       __u32   i_gen;
        __u32   i_shadow;
        __u32   i_unused1;
        __u32   i_unused2;
        __u32   i_oeftflag;
        __u16   i_osync;
-       __u32   i_lastfrag;
+       __u64   i_lastfrag;
        __u32   i_dir_start_lookup;
        struct inode vfs_inode;
 };
index 8ff13c160f3d6a6bcba70055ccbec0d26d882317..e114c93fc578ab127cbc524e1a54cae5503450e0 100644 (file)
@@ -21,7 +21,6 @@
 struct ufs_sb_private_info;
 struct ufs_cg_private_info;
 struct ufs_csum;
-#define UFS_MAXCSBUFS 31
 
 struct ufs_sb_info {
        struct ufs_sb_private_info * s_uspi;    
index 5e9803ed17fc4dd9c167c13541bbe209063ec7a6..acb1f105870c9f4f2535259d46bfa9371ab1a612 100644 (file)
@@ -3,20 +3,15 @@
 
 #include <linux/types.h>
 #include <linux/percpu.h>
+#include <linux/mm.h>
 #include <linux/mmzone.h>
 #include <asm/atomic.h>
 
-#ifdef CONFIG_VM_EVENT_COUNTERS
-/*
- * Light weight per cpu counter implementation.
- *
- * Counters should only be incremented.  You need to set EMBEDDED
- * to disable VM_EVENT_COUNTERS.  Things like procps (vmstat,
- * top, etc) use /proc/vmstat and depend on these counters.
- *
- * Counters are handled completely inline. On many platforms the code
- * generated will simply be the increment of a global address.
- */
+#ifdef CONFIG_ZONE_DMA
+#define DMA_ZONE(xx) xx##_DMA,
+#else
+#define DMA_ZONE(xx)
+#endif
 
 #ifdef CONFIG_ZONE_DMA32
 #define DMA32_ZONE(xx) xx##_DMA32,
@@ -30,7 +25,7 @@
 #define HIGHMEM_ZONE(xx)
 #endif
 
-#define FOR_ALL_ZONES(xx) xx##_DMA, DMA32_ZONE(xx) xx##_NORMAL HIGHMEM_ZONE(xx)
+#define FOR_ALL_ZONES(xx) DMA_ZONE(xx) DMA32_ZONE(xx) xx##_NORMAL HIGHMEM_ZONE(xx)
 
 enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,
                FOR_ALL_ZONES(PGALLOC),
@@ -45,6 +40,17 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,
                NR_VM_EVENT_ITEMS
 };
 
+#ifdef CONFIG_VM_EVENT_COUNTERS
+/*
+ * Light weight per cpu counter implementation.
+ *
+ * Counters should only be incremented and no critical kernel component
+ * should rely on the counter values.
+ *
+ * Counters are handled completely inline. On many platforms the code
+ * generated will simply be the increment of a global address.
+ */
+
 struct vm_event_state {
        unsigned long event[NR_VM_EVENT_ITEMS];
 };
@@ -85,17 +91,30 @@ static inline void vm_events_fold_cpu(int cpu)
 #else
 
 /* Disable counters */
-#define get_cpu_vm_events(e)   0L
-#define count_vm_event(e)      do { } while (0)
-#define count_vm_events(e,d)   do { } while (0)
-#define __count_vm_event(e)    do { } while (0)
-#define __count_vm_events(e,d) do { } while (0)
-#define vm_events_fold_cpu(x)  do { } while (0)
+static inline void count_vm_event(enum vm_event_item item)
+{
+}
+static inline void count_vm_events(enum vm_event_item item, long delta)
+{
+}
+static inline void __count_vm_event(enum vm_event_item item)
+{
+}
+static inline void __count_vm_events(enum vm_event_item item, long delta)
+{
+}
+static inline void all_vm_events(unsigned long *ret)
+{
+}
+static inline void vm_events_fold_cpu(int cpu)
+{
+}
 
 #endif /* CONFIG_VM_EVENT_COUNTERS */
 
 #define __count_zone_vm_events(item, zone, delta) \
-                       __count_vm_events(item##_DMA + zone_idx(zone), delta)
+               __count_vm_events(item##_NORMAL - ZONE_NORMAL + \
+               zone_idx(zone), delta)
 
 /*
  * Zone based page accounting with per cpu differentials.
@@ -142,14 +161,16 @@ static inline unsigned long node_page_state(int node,
        struct zone *zones = NODE_DATA(node)->node_zones;
 
        return
+#ifdef CONFIG_ZONE_DMA
+               zone_page_state(&zones[ZONE_DMA], item) +
+#endif
 #ifdef CONFIG_ZONE_DMA32
                zone_page_state(&zones[ZONE_DMA32], item) +
 #endif
-               zone_page_state(&zones[ZONE_NORMAL], item) +
 #ifdef CONFIG_HIGHMEM
                zone_page_state(&zones[ZONE_HIGHMEM], item) +
 #endif
-               zone_page_state(&zones[ZONE_DMA], item);
+               zone_page_state(&zones[ZONE_NORMAL], item);
 }
 
 extern void zone_statistics(struct zonelist *, struct zone *);
@@ -186,6 +207,9 @@ void inc_zone_page_state(struct page *, enum zone_stat_item);
 void dec_zone_page_state(struct page *, enum zone_stat_item);
 
 extern void inc_zone_state(struct zone *, enum zone_stat_item);
+extern void __inc_zone_state(struct zone *, enum zone_stat_item);
+extern void dec_zone_state(struct zone *, enum zone_stat_item);
+extern void __dec_zone_state(struct zone *, enum zone_stat_item);
 
 void refresh_cpu_vm_stats(int);
 void refresh_vm_stats(void);
@@ -214,6 +238,12 @@ static inline void __inc_zone_page_state(struct page *page,
        __inc_zone_state(page_zone(page), item);
 }
 
+static inline void __dec_zone_state(struct zone *zone, enum zone_stat_item item)
+{
+       atomic_long_dec(&zone->vm_stat[item]);
+       atomic_long_dec(&vm_stat[item]);
+}
+
 static inline void __dec_zone_page_state(struct page *page,
                        enum zone_stat_item item)
 {
index 0e7f1e20ea45345d24a3d383256ddb798ec4fced..def131a5ac70085f685b527c6de0f23fccae4d0e 100644 (file)
 #define XATTR_CREATE   0x1     /* set value, fail if attr already exists */
 #define XATTR_REPLACE  0x2     /* set value, fail if attr does not exist */
 
+#ifdef  __KERNEL__
+
+#include <linux/types.h>
+
 /* Namespaces */
 #define XATTR_OS2_PREFIX "os2."
 #define XATTR_OS2_PREFIX_LEN (sizeof (XATTR_OS2_PREFIX) - 1)
@@ -29,6 +33,8 @@
 #define XATTR_USER_PREFIX "user."
 #define XATTR_USER_PREFIX_LEN (sizeof (XATTR_USER_PREFIX) - 1)
 
+struct inode;
+struct dentry;
 
 struct xattr_handler {
        char *prefix;
@@ -50,4 +56,6 @@ ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_siz
 int generic_setxattr(struct dentry *dentry, const char *name, const void *value, size_t size, int flags);
 int generic_removexattr(struct dentry *dentry, const char *name);
 
+#endif  /*  __KERNEL__  */
+
 #endif /* _LINUX_XATTR_H */
index 5ae10dd2e32ebaa1a08ae06392ea7ffc42b37eb7..47ff2f46e9086b7d465f5357bc5b156330849acf 100644 (file)
@@ -377,7 +377,7 @@ extern int  ax25_check_iframes_acked(ax25_cb *, unsigned short);
 /* ax25_route.c */
 extern void ax25_rt_device_down(struct net_device *);
 extern int  ax25_rt_ioctl(unsigned int, void __user *);
-extern struct file_operations ax25_route_fops;
+extern const struct file_operations ax25_route_fops;
 extern ax25_route *ax25_get_route(ax25_address *addr, struct net_device *dev);
 extern int  ax25_rt_autobind(ax25_cb *, ax25_address *);
 extern struct sk_buff *ax25_rt_build_path(struct sk_buff *, ax25_address *, ax25_address *, ax25_digi *);
@@ -430,7 +430,7 @@ extern unsigned long ax25_display_timer(struct timer_list *);
 extern int  ax25_uid_policy;
 extern ax25_uid_assoc *ax25_findbyuid(uid_t);
 extern int __must_check ax25_uid_ioctl(int, struct sockaddr_ax25 *);
-extern struct file_operations ax25_uid_fops;
+extern const struct file_operations ax25_uid_fops;
 extern void ax25_uid_free(void);
 
 /* sysctl_net_ax25.c */
index 76f957e258b0bc85bfa7b9de282f97c3a453b1a6..a566944c4962cafd94cadb3c851767582dc4a430 100644 (file)
@@ -68,9 +68,10 @@ extern void dn_rt_cache_flush(int delay);
 struct dn_route {
        union {
                struct dst_entry dst;
-               struct dn_route *rt_next;
        } u;
 
+       struct flowi fl;
+
        __le16 rt_saddr;
        __le16 rt_daddr;
        __le16 rt_gateway;
@@ -80,8 +81,6 @@ struct dn_route {
 
        unsigned rt_flags;
        unsigned rt_type;
-
-       struct flowi fl;
 };
 
 extern void dn_route_init(void);
index 62b7e7598e9adfbb246abb5a692515fbf0e99e0e..e12a8ce0b9b30737a39edbeaea90ba9edca76557 100644 (file)
@@ -37,9 +37,7 @@ struct sk_buff;
 
 struct dst_entry
 {
-       struct dst_entry        *next;
-       atomic_t                __refcnt;       /* client references    */
-       int                     __use;
+       struct rcu_head         rcu_head;
        struct dst_entry        *child;
        struct net_device       *dev;
        short                   error;
@@ -50,7 +48,6 @@ struct dst_entry
 #define DST_NOPOLICY           4
 #define DST_NOHASH             8
 #define DST_BALANCED            0x10
-       unsigned long           lastuse;
        unsigned long           expires;
 
        unsigned short          header_len;     /* more space at head required */
@@ -75,8 +72,16 @@ struct dst_entry
 #endif
 
        struct  dst_ops         *ops;
-       struct rcu_head         rcu_head;
                
+       unsigned long           lastuse;
+       atomic_t                __refcnt;       /* client references    */
+       int                     __use;
+       union {
+               struct dst_entry *next;
+               struct rtable    *rt_next;
+               struct rt6_info   *rt6_next;
+               struct dn_route  *dn_next;
+       };
        char                    info[0];
 };
 
index 7be4f4e3a0f2241b27ebb72aa69d0582a93a9fff..9eda572a2a6534f157b233b71f22bf9ed70abd65 100644 (file)
@@ -83,7 +83,6 @@ struct rt6_info
 {
        union {
                struct dst_entry        dst;
-               struct rt6_info         *next;
        } u;
 
        struct inet6_dev                *rt6i_idev;
index 68ec27490c2075d7fb342bc264b0ae6db2444bc1..0e690e34c00be55b43087260608483aca551b668 100644 (file)
@@ -257,6 +257,12 @@ extern int nf_conntrack_max;
 
 DECLARE_PER_CPU(struct ip_conntrack_stat, nf_conntrack_stat);
 #define NF_CT_STAT_INC(count) (__get_cpu_var(nf_conntrack_stat).count++)
+#define NF_CT_STAT_INC_ATOMIC(count)                   \
+do {                                                   \
+       local_bh_disable();                             \
+       __get_cpu_var(nf_conntrack_stat).count++;       \
+       local_bh_enable();                              \
+} while (0)
 
 /* no helper, no nat */
 #define        NF_CT_F_BASIC   0
index 41bcc9eb42062044a3bb47c7442884002e0f1136..173c7c1eff236330ba3f6433ba0f9d75f731b317 100644 (file)
@@ -8,7 +8,7 @@
 
 extern struct list_head nf_conntrack_expect_list;
 extern struct kmem_cache *nf_conntrack_expect_cachep;
-extern struct file_operations exp_file_ops;
+extern const struct file_operations exp_file_ops;
 
 struct nf_conntrack_expect
 {
index 664ddcffe00d23b47ab5cfffbd548728fc48c35c..eb575cbd4c954a14109b88abe6eaee64a04283ac 100644 (file)
@@ -89,7 +89,7 @@ extern struct nf_conntrack_l3proto *nf_ct_l3protos[AF_MAX];
 
 /* Protocol registration. */
 extern int nf_conntrack_l3proto_register(struct nf_conntrack_l3proto *proto);
-extern int nf_conntrack_l3proto_unregister(struct nf_conntrack_l3proto *proto);
+extern void nf_conntrack_l3proto_unregister(struct nf_conntrack_l3proto *proto);
 
 extern struct nf_conntrack_l3proto *
 nf_ct_l3proto_find_get(u_int16_t l3proto);
@@ -106,7 +106,7 @@ __nf_ct_l3proto_find(u_int16_t l3proto)
 {
        if (unlikely(l3proto >= AF_MAX))
                return &nf_conntrack_l3proto_generic;
-       return nf_ct_l3protos[l3proto];
+       return rcu_dereference(nf_ct_l3protos[l3proto]);
 }
 
 #endif /*_NF_CONNTRACK_L3PROTO_H*/
index fc8af08ff54246c68d8e88b47add005c0589ab0e..8415182ec1266053664626a2e29f4f450068cf8c 100644 (file)
@@ -109,7 +109,7 @@ extern void nf_ct_l4proto_put(struct nf_conntrack_l4proto *p);
 
 /* Protocol registration. */
 extern int nf_conntrack_l4proto_register(struct nf_conntrack_l4proto *proto);
-extern int nf_conntrack_l4proto_unregister(struct nf_conntrack_l4proto *proto);
+extern void nf_conntrack_l4proto_unregister(struct nf_conntrack_l4proto *proto);
 
 /* Generic netlink helpers */
 extern int nf_ct_port_tuple_to_nfattr(struct sk_buff *skb,
index e0ca112024a390155d2b75e6f0f9255ce98451d9..f06852bba62afb8a1cd42d1c3af51ee7efcc6c49 100644 (file)
@@ -215,8 +215,8 @@ extern struct net_device *nr_dev_get(ax25_address *);
 extern int  nr_rt_ioctl(unsigned int, void __user *);
 extern void nr_link_failed(ax25_cb *, int);
 extern int  nr_route_frame(struct sk_buff *, ax25_cb *);
-extern struct file_operations nr_nodes_fops;
-extern struct file_operations nr_neigh_fops;
+extern const struct file_operations nr_nodes_fops;
+extern const struct file_operations nr_neigh_fops;
 extern void nr_rt_free(void);
 
 /* nr_subr.c */
index 4c05a88b921b6d32fc8bc1e5431897e260c43ef0..a4047d3cf5ddda9a7511c3b68b6542a3c3e292d3 100644 (file)
@@ -189,9 +189,9 @@ extern void rose_enquiry_response(struct sock *);
 
 /* rose_route.c */
 extern struct rose_neigh rose_loopback_neigh;
-extern struct file_operations rose_neigh_fops;
-extern struct file_operations rose_nodes_fops;
-extern struct file_operations rose_routes_fops;
+extern const struct file_operations rose_neigh_fops;
+extern const struct file_operations rose_nodes_fops;
+extern const struct file_operations rose_routes_fops;
 
 extern void rose_add_loopback_neigh(void);
 extern int __must_check rose_add_loopback_node(rose_address *);
index 1440bdb5a27d2ac818c65abcae431f9ae6bf7753..749e4dfe5ff3323dcaaa3eaa94c3130e3e058628 100644 (file)
@@ -53,9 +53,11 @@ struct rtable
        union
        {
                struct dst_entry        dst;
-               struct rtable           *rt_next;
        } u;
 
+       /* Cache lookup keys */
+       struct flowi            fl;
+
        struct in_device        *idev;
        
        unsigned                rt_flags;
@@ -69,9 +71,6 @@ struct rtable
        /* Info on neighbour */
        __be32                  rt_gateway;
 
-       /* Cache lookup keys */
-       struct flowi            fl;
-
        /* Miscellaneous cached information */
        __be32                  rt_spec_dst; /* RFC1122 specific destination */
        struct inet_peer        *peer; /* long-living peer info */
index 16924cb772c97b1d858232c352d6860cda08e525..92a1fc46ea593c6cfb2f0529568c4aa2e83a7c48 100644 (file)
@@ -946,14 +946,14 @@ extern int xfrm_state_mtu(struct xfrm_state *x, int mtu);
 extern int xfrm_init_state(struct xfrm_state *x);
 extern int xfrm4_rcv(struct sk_buff *skb);
 extern int xfrm4_output(struct sk_buff *skb);
-extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler);
-extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler);
+extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family);
+extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family);
 extern int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi);
 extern int xfrm6_rcv(struct sk_buff **pskb);
 extern int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
                            xfrm_address_t *saddr, u8 proto);
-extern int xfrm6_tunnel_register(struct xfrm6_tunnel *handler);
-extern int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler);
+extern int xfrm6_tunnel_register(struct xfrm6_tunnel *handler, unsigned short family);
+extern int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler, unsigned short family);
 extern __be32 xfrm6_tunnel_alloc_spi(xfrm_address_t *saddr);
 extern void xfrm6_tunnel_free_spi(xfrm_address_t *saddr);
 extern __be32 xfrm6_tunnel_spi_lookup(xfrm_address_t *saddr);
index 0c775fceb675b052bece78b80c885aaf64f0723e..ad0182ef7809bba62450e4788dfb658fd601ce8d 100644 (file)
@@ -323,12 +323,20 @@ struct sas_ha_event {
        struct sas_ha_struct *ha;
 };
 
+enum sas_ha_state {
+       SAS_HA_REGISTERED,
+       SAS_HA_UNREGISTERED
+};
+
 struct sas_ha_struct {
 /* private: */
        spinlock_t       event_lock;
        struct sas_ha_event ha_events[HA_NUM_EVENTS];
        unsigned long    pending;
 
+       enum sas_ha_state state;
+       spinlock_t        state_lock;
+
        struct scsi_core core;
 
 /* public: */
@@ -553,15 +561,15 @@ struct sas_task {
 #define SAS_TASK_STATE_PENDING      1
 #define SAS_TASK_STATE_DONE         2
 #define SAS_TASK_STATE_ABORTED      4
-#define SAS_TASK_INITIATOR_ABORTED  8
+#define SAS_TASK_NEED_DEV_RESET     8
+#define SAS_TASK_AT_INITIATOR       16
 
 static inline struct sas_task *sas_alloc_task(gfp_t flags)
 {
        extern struct kmem_cache *sas_task_cache;
-       struct sas_task *task = kmem_cache_alloc(sas_task_cache, flags);
+       struct sas_task *task = kmem_cache_zalloc(sas_task_cache, flags);
 
        if (task) {
-               memset(task, 0, sizeof(*task));
                INIT_LIST_HEAD(&task->list);
                spin_lock_init(&task->task_state_lock);
                task->task_state_flags = SAS_TASK_STATE_PENDING;
@@ -613,6 +621,9 @@ struct sas_domain_function_template {
 extern int sas_register_ha(struct sas_ha_struct *);
 extern int sas_unregister_ha(struct sas_ha_struct *);
 
+int sas_set_phy_speed(struct sas_phy *phy,
+                     struct sas_phy_linkrates *rates);
+int sas_phy_enable(struct sas_phy *phy, int enabled);
 int sas_phy_reset(struct sas_phy *phy, int hard_reset);
 extern int sas_queuecommand(struct scsi_cmnd *,
                     void (*scsi_done)(struct scsi_cmnd *));
@@ -646,6 +657,9 @@ void sas_unregister_dev(struct domain_device *);
 
 void sas_init_dev(struct domain_device *);
 
-void sas_task_abort(struct work_struct *);
+void sas_task_abort(struct sas_task *);
+int __sas_task_abort(struct sas_task *);
+int sas_eh_device_reset_handler(struct scsi_cmnd *cmd);
+int sas_eh_bus_reset_handler(struct scsi_cmnd *cmd);
 
 #endif /* _SASLIB_H_ */
index 59633a82de47cd54dc6fa2cb6fcf09b9a1e270d4..9aedc19820b0df1d007b0d8e7150de5e3c07e5fd 100644 (file)
@@ -54,6 +54,7 @@ struct sas_identify {
 struct sas_phy {
        struct device           dev;
        int                     number;
+       int                     enabled;
 
        /* phy identification */
        struct sas_identify     identify;
@@ -163,6 +164,7 @@ struct sas_function_template {
        int (*get_enclosure_identifier)(struct sas_rphy *, u64 *);
        int (*get_bay_identifier)(struct sas_rphy *);
        int (*phy_reset)(struct sas_phy *, int);
+       int (*phy_enable)(struct sas_phy *, int);
        int (*set_phy_speed)(struct sas_phy *, struct sas_phy_linkrates *);
 };
 
@@ -180,6 +182,7 @@ extern struct sas_rphy *sas_end_device_alloc(struct sas_port *);
 extern struct sas_rphy *sas_expander_alloc(struct sas_port *, enum sas_device_type);
 void sas_rphy_free(struct sas_rphy *);
 extern int sas_rphy_add(struct sas_rphy *);
+extern void sas_rphy_remove(struct sas_rphy *);
 extern void sas_rphy_delete(struct sas_rphy *);
 extern int scsi_is_sas_rphy(const struct device *);
 
index da180f738477ef23040d68549c953969e7c524ff..286e9628ed8ba077f997e4105f6954e10d0d6c13 100644 (file)
@@ -85,6 +85,7 @@ struct spi_host_attrs {
 #define spi_pcomp_en(x)        (((struct spi_transport_attrs *)&(x)->starget_data)->pcomp_en)
 #define spi_hold_mcs(x)        (((struct spi_transport_attrs *)&(x)->starget_data)->hold_mcs)
 #define spi_initial_dv(x)      (((struct spi_transport_attrs *)&(x)->starget_data)->initial_dv)
+#define spi_dv_pending(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_pending)
 
 #define spi_support_sync(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->support_sync)
 #define spi_support_wide(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->support_wide)
index eb7ce96ddf3ad4c103718f7501196a78b6615003..23e45a4cf0e44ffe4a3074fe72e39c47e4518081 100644 (file)
 #define FXWC_SPDIFLEFT          (1<<22)                /* 0x00400000 */
 #define FXWC_SPDIFRIGHT         (1<<23)                /* 0x00800000 */
 
-#define A_TBLSZ        `               0x43    /* Effects Tank Internal Table Size. Only low byte or register used */
+#define A_TBLSZ                        0x43    /* Effects Tank Internal Table Size. Only low byte or register used */
 
 #define TCBS                   0x44            /* Tank cache buffer size register                      */
 #define TCBS_MASK              0x00000007      /* Tank cache buffer size field                         */
index ee6bc2d0680321f4b7d10af1d2c1c3d16c2b98e8..deff5a92efa6886ecd1d227b534e53fe98c04095 100644 (file)
@@ -447,7 +447,7 @@ struct snd_pcm_notify {
  *  Registering
  */
 
-extern struct file_operations snd_pcm_f_ops[2];
+extern const struct file_operations snd_pcm_f_ops[2];
 
 int snd_pcm_new(struct snd_card *card, char *id, int device,
                int playback_count, int capture_count,
index c39b3802cf18afbb43637a516663c589b11b3b03..a9ba7ee699394aff8e3363d1bff2b10acf0d7bf7 100644 (file)
@@ -1,3 +1,3 @@
 /* include/version.h.  Generated by alsa/ksync script.  */
 #define CONFIG_SND_VERSION "1.0.14rc2"
-#define CONFIG_SND_DATE " (Fri Feb 09 13:50:10 2007 UTC)"
+#define CONFIG_SND_DATE " (Wed Feb 14 07:42:13 2007 UTC)"
index 78b1f15a538fc69a0aaf2f94c11a400d5ad2193d..a9e118a1cd1628cc0679e216bfbc8b5c137ef6de 100644 (file)
@@ -140,7 +140,8 @@ typedef volatile struct {
 
 struct neofb_par {
        struct vgastate state;
-       atomic_t ref_count;
+       struct mutex open_lock;
+       unsigned int ref_count;
 
        unsigned char MiscOutReg;       /* Misc */
        unsigned char CRTC[25];         /* Crtc Controller */
diff --git a/include/video/s3blit.h b/include/video/s3blit.h
deleted file mode 100644 (file)
index b1db631..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-#ifndef _VIDEO_S3BLIT_H
-#define _VIDEO_S3BLIT_H
-
-/* s3 commands */
-#define S3_BITBLT       0xc011
-#define S3_TWOPOINTLINE 0x2811
-#define S3_FILLEDRECT   0x40b1
-
-#define S3_FIFO_EMPTY 0x0400
-#define S3_HDW_BUSY   0x0200
-
-/* Enhanced register mapping (MMIO mode) */
-
-#define S3_READ_SEL      0xbee8 /* offset f */
-#define S3_MULT_MISC     0xbee8 /* offset e */
-#define S3_ERR_TERM      0x92e8
-#define S3_FRGD_COLOR    0xa6e8
-#define S3_BKGD_COLOR    0xa2e8
-#define S3_PIXEL_CNTL    0xbee8 /* offset a */
-#define S3_FRGD_MIX      0xbae8
-#define S3_BKGD_MIX      0xb6e8
-#define S3_CUR_Y         0x82e8
-#define S3_CUR_X         0x86e8
-#define S3_DESTY_AXSTP   0x8ae8
-#define S3_DESTX_DIASTP  0x8ee8
-#define S3_MIN_AXIS_PCNT 0xbee8 /* offset 0 */
-#define S3_MAJ_AXIS_PCNT 0x96e8
-#define S3_CMD           0x9ae8
-#define S3_GP_STAT       0x9ae8
-#define S3_ADVFUNC_CNTL  0x4ae8
-#define S3_WRT_MASK      0xaae8
-#define S3_RD_MASK       0xaee8
-
-/* Enhanced register mapping (Packed MMIO mode, write only) */
-#define S3_ALT_CURXY     0x8100
-#define S3_ALT_CURXY2    0x8104
-#define S3_ALT_STEP      0x8108
-#define S3_ALT_STEP2     0x810c
-#define S3_ALT_ERR       0x8110
-#define S3_ALT_CMD       0x8118
-#define S3_ALT_MIX       0x8134
-#define S3_ALT_PCNT      0x8148
-#define S3_ALT_PAT       0x8168
-
-/* Drawing modes */
-#define S3_NOTCUR          0x0000
-#define S3_LOGICALZERO     0x0001
-#define S3_LOGICALONE      0x0002
-#define S3_LEAVEASIS       0x0003
-#define S3_NOTNEW          0x0004
-#define S3_CURXORNEW       0x0005
-#define S3_NOT_CURXORNEW   0x0006
-#define S3_NEW             0x0007
-#define S3_NOTCURORNOTNEW  0x0008
-#define S3_CURORNOTNEW     0x0009
-#define S3_NOTCURORNEW     0x000a
-#define S3_CURORNEW        0x000b
-#define S3_CURANDNEW       0x000c
-#define S3_NOTCURANDNEW    0x000d
-#define S3_CURANDNOTNEW    0x000e
-#define S3_NOTCURANDNOTNEW 0x000f
-
-#define S3_CRTC_ADR    0x03d4
-#define S3_CRTC_DATA   0x03d5
-
-#define S3_REG_LOCK2 0x39
-#define S3_HGC_MODE  0x45
-
-#define S3_HWGC_ORGX_H 0x46
-#define S3_HWGC_ORGX_L 0x47
-#define S3_HWGC_ORGY_H 0x48
-#define S3_HWGC_ORGY_L 0x49
-#define S3_HWGC_DX     0x4e
-#define S3_HWGC_DY     0x4f
-
-
-#define S3_LAW_CTL 0x58
-
-#endif /* _VIDEO_S3BLIT_H */
index a3f83e2c8250bf6ebf0a8429ed707a270531f769..f977086e118a9ee936a4fd77e3cb5490857b7624 100644 (file)
@@ -125,6 +125,12 @@ config IPC_NS
          environments, to use ipc namespaces to provide different ipc
          objects for different servers.  If unsure, say N.
 
+config SYSVIPC_SYSCTL
+       bool
+       depends on SYSVIPC
+       depends on SYSCTL
+       default y
+
 config POSIX_MQUEUE
        bool "POSIX Message Queues"
        depends on NET && EXPERIMENTAL
@@ -192,6 +198,24 @@ config TASK_DELAY_ACCT
 
          Say N if unsure.
 
+config TASK_XACCT
+       bool "Enable extended accounting over taskstats (EXPERIMENTAL)"
+       depends on TASKSTATS
+       help
+         Collect extended task accounting data and send the data
+         to userland for processing over the taskstats interface.
+
+         Say N if unsure.
+
+config TASK_IO_ACCOUNTING
+       bool "Enable per-task storage I/O accounting (EXPERIMENTAL)"
+       depends on TASK_XACCT
+       help
+         Collect information on the number of bytes of storage I/O which this
+         task has caused.
+
+         Say N if unsure.
+
 config UTS_NS
        bool "UTS Namespaces"
        default n
@@ -280,8 +304,12 @@ config RELAY
 
          If unsure, say N.
 
+if BLK_DEV_INITRD
+
 source "usr/Kconfig"
 
+endif
+
 config CC_OPTIMIZE_FOR_SIZE
        bool "Optimize for size (Look out for broken compilers!)"
        default y
@@ -295,24 +323,6 @@ config CC_OPTIMIZE_FOR_SIZE
 
          If unsure, say N.
 
-config TASK_XACCT
-       bool "Enable extended accounting over taskstats (EXPERIMENTAL)"
-       depends on TASKSTATS
-       help
-         Collect extended task accounting data and send the data
-         to userland for processing over the taskstats interface.
-
-         Say N if unsure.
-
-config TASK_IO_ACCOUNTING
-       bool "Enable per-task storage I/O accounting (EXPERIMENTAL)"
-       depends on TASK_XACCT
-       help
-         Collect information on the number of bytes of storage I/O which this
-         task has caused.
-
-         Say N if unsure.
-
 config SYSCTL
        bool
 
index 633a268d270d3cc8bfa906c1a22476caa9645360..0154aea1e52d874814c05cb2a9c83d83bc48af71 100644 (file)
@@ -2,7 +2,12 @@
 # Makefile for the linux kernel.
 #
 
-obj-y                          := main.o version.o mounts.o initramfs.o
+obj-y                          := main.o version.o mounts.o
+ifneq ($(CONFIG_BLK_DEV_INITRD),y)
+obj-y                          += noinitramfs.o
+else
+obj-$(CONFIG_BLK_DEV_INITRD)   += initramfs.o
+endif
 obj-$(CONFIG_GENERIC_CALIBRATE_DELAY) += calibrate.o
 
 mounts-y                       := do_mounts.o
index d206c7548fe6f80aa14f508d89f7a5f76c4216cd..40ff3b4048952993ed790b684800d3d36d56106b 100644 (file)
@@ -4,7 +4,7 @@
  *  Copyright (C) 1991, 1992  Linus Torvalds
  */
 
-#include <linux/sched.h>
+#include <linux/jiffies.h>
 #include <linux/delay.h>
 #include <linux/init.h>
 
index 4fa0f7977de1a16db501d91c3c9b062cb7898c2d..00eff7a110854d5706ff51205f5ef06a7a267d27 100644 (file)
@@ -491,6 +491,17 @@ static char * __init unpack_to_rootfs(char *buf, unsigned len, int check_only)
        return message;
 }
 
+static int __initdata do_retain_initrd;
+
+static int __init retain_initrd_param(char *str)
+{
+       if (*str)
+               return 0;
+       do_retain_initrd = 1;
+       return 1;
+}
+__setup("retain_initrd", retain_initrd_param);
+
 extern char __initramfs_start[], __initramfs_end[];
 #ifdef CONFIG_BLK_DEV_INITRD
 #include <linux/initrd.h>
@@ -501,7 +512,11 @@ static void __init free_initrd(void)
 #ifdef CONFIG_KEXEC
        unsigned long crashk_start = (unsigned long)__va(crashk_res.start);
        unsigned long crashk_end   = (unsigned long)__va(crashk_res.end);
+#endif
+       if (do_retain_initrd)
+               goto skip;
 
+#ifdef CONFIG_KEXEC
        /*
         * If the initrd region is overlapped with crashkernel reserved region,
         * free only memory that is not part of crashkernel region.
@@ -519,7 +534,7 @@ static void __init free_initrd(void)
        } else
 #endif
                free_initrd_mem(initrd_start, initrd_end);
-
+skip:
        initrd_start = 0;
        initrd_end = 0;
 }
index 8b4a7d76916235df139b98bd41019a228615a2dd..953500b02ac4136f4ad30aa0ea6b285019234131 100644 (file)
@@ -40,6 +40,7 @@
 #include <linux/cpu.h>
 #include <linux/cpuset.h>
 #include <linux/efi.h>
+#include <linux/tick.h>
 #include <linux/taskstats_kern.h>
 #include <linux/delayacct.h>
 #include <linux/unistd.h>
@@ -86,7 +87,6 @@ extern void init_IRQ(void);
 extern void fork_init(unsigned long);
 extern void mca_init(void);
 extern void sbus_init(void);
-extern void sysctl_init(void);
 extern void signals_init(void);
 extern void pidhash_init(void);
 extern void pidmap_init(void);
@@ -121,8 +121,12 @@ extern void time_init(void);
 void (*late_time_init)(void);
 extern void softirq_init(void);
 
-/* Untouched command line (eg. for /proc) saved by arch-specific code. */
-char saved_command_line[COMMAND_LINE_SIZE];
+/* Untouched command line saved by arch-specific code. */
+char __initdata boot_command_line[COMMAND_LINE_SIZE];
+/* Untouched saved command line (eg. for /proc) */
+char *saved_command_line;
+/* Command line for parameter parsing */
+static char *static_command_line;
 
 static char *execute_command;
 static char *ramdisk_execute_command;
@@ -395,15 +399,24 @@ static void __init smp_init(void)
        /* Any cleanup work */
        printk(KERN_INFO "Brought up %ld CPUs\n", (long)num_online_cpus());
        smp_cpus_done(max_cpus);
-#if 0
-       /* Get other processors into their bootup holding patterns. */
-
-       smp_commence();
-#endif
 }
 
 #endif
 
+/*
+ * We need to store the untouched command line for future reference.
+ * We also need to store the touched command line since the parameter
+ * parsing is performed in place, and we should allow a component to
+ * store reference of name/value for future reference.
+ */
+static void __init setup_command_line(char *command_line)
+{
+       saved_command_line = alloc_bootmem(strlen (boot_command_line)+1);
+       static_command_line = alloc_bootmem(strlen (command_line)+1);
+       strcpy (saved_command_line, boot_command_line);
+       strcpy (static_command_line, command_line);
+}
+
 /*
  * We need to finalize in a non-__init function or else race conditions
  * between the root thread and the init thread may cause start_kernel to
@@ -458,7 +471,7 @@ void __init parse_early_param(void)
                return;
 
        /* All fall through to do_early_param. */
-       strlcpy(tmp_cmdline, saved_command_line, COMMAND_LINE_SIZE);
+       strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
        parse_args("early options", tmp_cmdline, NULL, 0, do_early_param);
        done = 1;
 }
@@ -503,11 +516,13 @@ asmlinkage void __init start_kernel(void)
  * enable them
  */
        lock_kernel();
+       tick_init();
        boot_cpu_init();
        page_address_init();
        printk(KERN_NOTICE);
        printk(linux_banner);
        setup_arch(&command_line);
+       setup_command_line(command_line);
        unwind_setup();
        setup_per_cpu_areas();
        smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */
@@ -525,9 +540,9 @@ asmlinkage void __init start_kernel(void)
        preempt_disable();
        build_all_zonelists();
        page_alloc_init();
-       printk(KERN_NOTICE "Kernel command line: %s\n", saved_command_line);
+       printk(KERN_NOTICE "Kernel command line: %s\n", boot_command_line);
        parse_early_param();
-       parse_args("Booting kernel", command_line, __start___param,
+       parse_args("Booting kernel", static_command_line, __start___param,
                   __stop___param - __start___param,
                   &unknown_bootoption);
        if (!irqs_disabled()) {
@@ -688,8 +703,8 @@ static void __init do_basic_setup(void)
        usermodehelper_init();
        driver_init();
 
-#ifdef CONFIG_SYSCTL
-       sysctl_init();
+#ifdef CONFIG_PROC_FS
+       init_irq_proc();
 #endif
 
        do_initcalls();
@@ -713,7 +728,49 @@ static void run_init_process(char *init_filename)
        kernel_execve(init_filename, argv_init, envp_init);
 }
 
-static int init(void * unused)
+/* This is a non __init function. Force it to be noinline otherwise gcc
+ * makes it inline to init() and it becomes part of init.text section
+ */
+static int noinline init_post(void)
+{
+       free_initmem();
+       unlock_kernel();
+       mark_rodata_ro();
+       system_state = SYSTEM_RUNNING;
+       numa_default_policy();
+
+       if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
+               printk(KERN_WARNING "Warning: unable to open an initial console.\n");
+
+       (void) sys_dup(0);
+       (void) sys_dup(0);
+
+       if (ramdisk_execute_command) {
+               run_init_process(ramdisk_execute_command);
+               printk(KERN_WARNING "Failed to execute %s\n",
+                               ramdisk_execute_command);
+       }
+
+       /*
+        * We try each of these until one succeeds.
+        *
+        * The Bourne shell can be used instead of init if we are
+        * trying to recover a really broken machine.
+        */
+       if (execute_command) {
+               run_init_process(execute_command);
+               printk(KERN_WARNING "Failed to execute %s.  Attempting "
+                                       "defaults...\n", execute_command);
+       }
+       run_init_process("/sbin/init");
+       run_init_process("/etc/init");
+       run_init_process("/bin/init");
+       run_init_process("/bin/sh");
+
+       panic("No init found.  Try passing init= option to kernel.");
+}
+
+static int __init init(void * unused)
 {
        lock_kernel();
        /*
@@ -761,39 +818,6 @@ static int init(void * unused)
         * we're essentially up and running. Get rid of the
         * initmem segments and start the user-mode stuff..
         */
-       free_initmem();
-       unlock_kernel();
-       mark_rodata_ro();
-       system_state = SYSTEM_RUNNING;
-       numa_default_policy();
-
-       if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
-               printk(KERN_WARNING "Warning: unable to open an initial console.\n");
-
-       (void) sys_dup(0);
-       (void) sys_dup(0);
-
-       if (ramdisk_execute_command) {
-               run_init_process(ramdisk_execute_command);
-               printk(KERN_WARNING "Failed to execute %s\n",
-                               ramdisk_execute_command);
-       }
-
-       /*
-        * We try each of these until one succeeds.
-        *
-        * The Bourne shell can be used instead of init if we are 
-        * trying to recover a really broken machine.
-        */
-       if (execute_command) {
-               run_init_process(execute_command);
-               printk(KERN_WARNING "Failed to execute %s.  Attempting "
-                                       "defaults...\n", execute_command);
-       }
-       run_init_process("/sbin/init");
-       run_init_process("/etc/init");
-       run_init_process("/bin/init");
-       run_init_process("/bin/sh");
-
-       panic("No init found.  Try passing init= option to kernel.");
+       init_post();
+       return 0;
 }
diff --git a/init/noinitramfs.c b/init/noinitramfs.c
new file mode 100644 (file)
index 0000000..f4c1a3a
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * init/noinitramfs.c
+ *
+ * Copyright (C) 2006, NXP Semiconductors, All Rights Reserved
+ * Author: Jean-Paul Saman <jean-paul.saman@nxp.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; version 2 of the License.
+ *
+ * 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
+ */
+#include <linux/init.h>
+#include <linux/stat.h>
+#include <linux/kdev_t.h>
+#include <linux/syscalls.h>
+
+/*
+ * Create a simple rootfs that is similar to the default initramfs
+ */
+static int __init default_rootfs(void)
+{
+       int err;
+
+       err = sys_mkdir("/dev", 0755);
+       if (err < 0)
+               goto out;
+
+       err = sys_mknod((const char __user *) "/dev/console",
+                       S_IFCHR | S_IRUSR | S_IWUSR,
+                       new_encode_dev(MKDEV(5, 1)));
+       if (err < 0)
+               goto out;
+
+       err = sys_mkdir("/root", 0700);
+       if (err < 0)
+               goto out;
+
+       return 0;
+
+out:
+       printk(KERN_WARNING "Failed to create a rootfs\n");
+       return err;
+}
+rootfs_initcall(default_rootfs);
index 6c01ec1cc48d4848fd98c28d11362e790703005d..9d17d70ee02d0165e4f94e5eacda6ea7c808a469 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/utsname.h>
 #include <linux/utsrelease.h>
 #include <linux/version.h>
-#include <linux/sched.h>
 
 #define version(a) Version_ ## a
 #define version_string(a) version(a)
index 0a6d626cd79400cb1b8e6c560063145887e055a8..b93bba6652f1e7abc068d96ea3490e9491939684 100644 (file)
@@ -4,6 +4,7 @@
 
 obj-$(CONFIG_SYSVIPC_COMPAT) += compat.o
 obj-$(CONFIG_SYSVIPC) += util.o msgutil.o msg.o sem.o shm.o
+obj-$(CONFIG_SYSVIPC_SYSCTL) += ipc_sysctl.o
 obj_mq-$(CONFIG_COMPAT) += compat_mq.o
 obj-$(CONFIG_POSIX_MQUEUE) += mqueue.o msgutil.o $(obj_mq-y)
 
diff --git a/ipc/ipc_sysctl.c b/ipc/ipc_sysctl.c
new file mode 100644 (file)
index 0000000..a88934a
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+ *  Copyright (C) 2007
+ *
+ *  Author: Eric Biederman <ebiederm@xmision.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, version 2 of the
+ *  License.
+ */
+
+#include <linux/module.h>
+#include <linux/ipc.h>
+#include <linux/nsproxy.h>
+#include <linux/sysctl.h>
+#include <linux/uaccess.h>
+
+#ifdef CONFIG_IPC_NS
+static void *get_ipc(ctl_table *table)
+{
+       char *which = table->data;
+       struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns;
+       which = (which - (char *)&init_ipc_ns) + (char *)ipc_ns;
+       return which;
+}
+#else
+#define get_ipc(T) ((T)->data)
+#endif
+
+#ifdef CONFIG_PROC_FS
+static int proc_ipc_dointvec(ctl_table *table, int write, struct file *filp,
+       void __user *buffer, size_t *lenp, loff_t *ppos)
+{
+       struct ctl_table ipc_table;
+       memcpy(&ipc_table, table, sizeof(ipc_table));
+       ipc_table.data = get_ipc(table);
+
+       return proc_dointvec(&ipc_table, write, filp, buffer, lenp, ppos);
+}
+
+static int proc_ipc_doulongvec_minmax(ctl_table *table, int write,
+       struct file *filp, void __user *buffer, size_t *lenp, loff_t *ppos)
+{
+       struct ctl_table ipc_table;
+       memcpy(&ipc_table, table, sizeof(ipc_table));
+       ipc_table.data = get_ipc(table);
+
+       return proc_doulongvec_minmax(&ipc_table, write, filp, buffer,
+                                       lenp, ppos);
+}
+
+#else
+#define proc_ipc_doulongvec_minmax NULL
+#define proc_ipc_dointvec         NULL
+#endif
+
+#ifdef CONFIG_SYSCTL_SYSCALL
+/* The generic sysctl ipc data routine. */
+static int sysctl_ipc_data(ctl_table *table, int __user *name, int nlen,
+               void __user *oldval, size_t __user *oldlenp,
+               void __user *newval, size_t newlen)
+{
+       size_t len;
+       void *data;
+
+       /* Get out of I don't have a variable */
+       if (!table->data || !table->maxlen)
+               return -ENOTDIR;
+
+       data = get_ipc(table);
+       if (!data)
+               return -ENOTDIR;
+
+       if (oldval && oldlenp) {
+               if (get_user(len, oldlenp))
+                       return -EFAULT;
+               if (len) {
+                       if (len > table->maxlen)
+                               len = table->maxlen;
+                       if (copy_to_user(oldval, data, len))
+                               return -EFAULT;
+                       if (put_user(len, oldlenp))
+                               return -EFAULT;
+               }
+       }
+
+       if (newval && newlen) {
+               if (newlen > table->maxlen)
+                       newlen = table->maxlen;
+
+               if (copy_from_user(data, newval, newlen))
+                       return -EFAULT;
+       }
+       return 1;
+}
+#else
+#define sysctl_ipc_data NULL
+#endif
+
+static struct ctl_table ipc_kern_table[] = {
+       {
+               .ctl_name       = KERN_SHMMAX,
+               .procname       = "shmmax",
+               .data           = &init_ipc_ns.shm_ctlmax,
+               .maxlen         = sizeof (init_ipc_ns.shm_ctlmax),
+               .mode           = 0644,
+               .proc_handler   = proc_ipc_doulongvec_minmax,
+               .strategy       = sysctl_ipc_data,
+       },
+       {
+               .ctl_name       = KERN_SHMALL,
+               .procname       = "shmall",
+               .data           = &init_ipc_ns.shm_ctlall,
+               .maxlen         = sizeof (init_ipc_ns.shm_ctlall),
+               .mode           = 0644,
+               .proc_handler   = proc_ipc_doulongvec_minmax,
+               .strategy       = sysctl_ipc_data,
+       },
+       {
+               .ctl_name       = KERN_SHMMNI,
+               .procname       = "shmmni",
+               .data           = &init_ipc_ns.shm_ctlmni,
+               .maxlen         = sizeof (init_ipc_ns.shm_ctlmni),
+               .mode           = 0644,
+               .proc_handler   = proc_ipc_dointvec,
+               .strategy       = sysctl_ipc_data,
+       },
+       {
+               .ctl_name       = KERN_MSGMAX,
+               .procname       = "msgmax",
+               .data           = &init_ipc_ns.msg_ctlmax,
+               .maxlen         = sizeof (init_ipc_ns.msg_ctlmax),
+               .mode           = 0644,
+               .proc_handler   = proc_ipc_dointvec,
+               .strategy       = sysctl_ipc_data,
+       },
+       {
+               .ctl_name       = KERN_MSGMNI,
+               .procname       = "msgmni",
+               .data           = &init_ipc_ns.msg_ctlmni,
+               .maxlen         = sizeof (init_ipc_ns.msg_ctlmni),
+               .mode           = 0644,
+               .proc_handler   = proc_ipc_dointvec,
+               .strategy       = sysctl_ipc_data,
+       },
+       {
+               .ctl_name       = KERN_MSGMNB,
+               .procname       =  "msgmnb",
+               .data           = &init_ipc_ns.msg_ctlmnb,
+               .maxlen         = sizeof (init_ipc_ns.msg_ctlmnb),
+               .mode           = 0644,
+               .proc_handler   = proc_ipc_dointvec,
+               .strategy       = sysctl_ipc_data,
+       },
+       {
+               .ctl_name       = KERN_SEM,
+               .procname       = "sem",
+               .data           = &init_ipc_ns.sem_ctls,
+               .maxlen         = 4*sizeof (int),
+               .mode           = 0644,
+               .proc_handler   = proc_ipc_dointvec,
+               .strategy       = sysctl_ipc_data,
+       },
+       {}
+};
+
+static struct ctl_table ipc_root_table[] = {
+       {
+               .ctl_name       = CTL_KERN,
+               .procname       = "kernel",
+               .mode           = 0555,
+               .child          = ipc_kern_table,
+       },
+       {}
+};
+
+static int __init ipc_sysctl_init(void)
+{
+       register_sysctl_table(ipc_root_table);
+       return 0;
+}
+
+__initcall(ipc_sysctl_init);
index 02717f71d8d0ca325684d26d8bb79fe87c586ae1..0b5ecbe5f0456c121f2af016292fb0123f4bf4cd 100644 (file)
@@ -84,8 +84,8 @@ struct mqueue_inode_info {
        unsigned long qsize; /* size of queue in memory (sum of all msgs) */
 };
 
-static struct inode_operations mqueue_dir_inode_operations;
-static struct file_operations mqueue_file_operations;
+static const struct inode_operations mqueue_dir_inode_operations;
+static const struct file_operations mqueue_file_operations;
 static struct super_operations mqueue_super_ops;
 static void remove_notification(struct mqueue_inode_info *info);
 
@@ -1160,13 +1160,13 @@ out:
        return ret;
 }
 
-static struct inode_operations mqueue_dir_inode_operations = {
+static const struct inode_operations mqueue_dir_inode_operations = {
        .lookup = simple_lookup,
        .create = mqueue_create,
        .unlink = mqueue_unlink,
 };
 
-static struct file_operations mqueue_file_operations = {
+static const struct file_operations mqueue_file_operations = {
        .flush = mqueue_flush_file,
        .poll = mqueue_poll_file,
        .read = mqueue_read_file,
@@ -1255,7 +1255,7 @@ static int __init init_mqueue_fs(void)
                return -ENOMEM;
 
        /* ignore failues - they are not fatal */
-       mq_sysctl_table = register_sysctl_table(mq_sysctl_root, 0);
+       mq_sysctl_table = register_sysctl_table(mq_sysctl_root);
 
        error = register_filesystem(&mqueue_fs_type);
        if (error)
index f8e10a25ad7d9ece3f9e409eb3859ba282faed73..5bb617f6306e8df814398505393b15e2b0c3c0ee 100644 (file)
--- a/ipc/shm.c
+++ b/ipc/shm.c
@@ -42,7 +42,7 @@
 
 #include "util.h"
 
-static struct file_operations shm_file_operations;
+static const struct file_operations shm_file_operations;
 static struct vm_operations_struct shm_vm_ops;
 
 static struct ipc_ids init_shm_ids;
@@ -249,7 +249,7 @@ static int shm_release(struct inode *ino, struct file *file)
        return 0;
 }
 
-static struct file_operations shm_file_operations = {
+static const struct file_operations shm_file_operations = {
        .mmap           = shm_mmap,
        .release        = shm_release,
 #ifndef CONFIG_MMU
index a9b7a227b8d4c7bde79998048206b96fef1f57ed..08a647965b9e9c360ce0e182b53e294d347d2578 100644 (file)
@@ -150,7 +150,7 @@ void free_ipc_ns(struct kref *kref)
  *     ipc_init        -       initialise IPC subsystem
  *
  *     The various system5 IPC resources (semaphores, messages and shared
- *     memory are initialised
+ *     memory) are initialised
  */
  
 static int __init ipc_init(void)
@@ -205,10 +205,9 @@ void __ipc_init ipc_init_ids(struct ipc_ids* ids, int size)
 }
 
 #ifdef CONFIG_PROC_FS
-static struct file_operations sysvipc_proc_fops;
+static const struct file_operations sysvipc_proc_fops;
 /**
- *     ipc_init_proc_interface -  Create a proc interface for sysipc types
- *                                using a seq_file interface.
+ *     ipc_init_proc_interface -  Create a proc interface for sysipc types using a seq_file interface.
  *     @path: Path in procfs
  *     @header: Banner to be printed at the beginning of the file.
  *     @ids: ipc id table to iterate.
@@ -417,7 +416,7 @@ void* ipc_alloc(int size)
  *     @ptr: pointer returned by ipc_alloc
  *     @size: size of block
  *
- *     Free a block created with ipc_alloc. The caller must know the size
+ *     Free a block created with ipc_alloc(). The caller must know the size
  *     used in the allocation call.
  */
 
@@ -524,7 +523,7 @@ static void ipc_do_vfree(struct work_struct *work)
  * @head: RCU callback structure for queued work
  * 
  * Since RCU callback function is called in bh,
- * we need to defer the vfree to schedule_work
+ * we need to defer the vfree to schedule_work().
  */
 static void ipc_schedule_free(struct rcu_head *head)
 {
@@ -541,7 +540,7 @@ static void ipc_schedule_free(struct rcu_head *head)
  * ipc_immediate_free - free ipc + rcu space
  * @head: RCU callback structure that contains pointer to be freed
  *
- * Free from the RCU callback context
+ * Free from the RCU callback context.
  */
 static void ipc_immediate_free(struct rcu_head *head)
 {
@@ -603,8 +602,8 @@ int ipcperms (struct kern_ipc_perm *ipcp, short flag)
  *     @in: kernel permissions
  *     @out: new style IPC permissions
  *
- *     Turn the kernel object 'in' into a set of permissions descriptions
- *     for returning to userspace (out).
+ *     Turn the kernel object @in into a set of permissions descriptions
+ *     for returning to userspace (@out).
  */
  
 
@@ -624,8 +623,8 @@ void kernel_to_ipc64_perm (struct kern_ipc_perm *in, struct ipc64_perm *out)
  *     @in: new style IPC permissions
  *     @out: old style IPC permissions
  *
- *     Turn the new style permissions object in into a compatibility
- *     object and store it into the 'out' pointer.
+ *     Turn the new style permissions object @in into a compatibility
+ *     object and store it into the @out pointer.
  */
  
 void ipc64_perm_to_ipc_perm (struct ipc64_perm *in, struct ipc_perm *out)
@@ -722,7 +721,7 @@ int ipc_checkid(struct ipc_ids* ids, struct kern_ipc_perm* ipcp, int uid)
  *     @cmd: pointer to command
  *
  *     Return IPC_64 for new style IPC and IPC_OLD for old style IPC. 
- *     The cmd value is turned from an encoding command and version into
+ *     The @cmd value is turned from an encoding command and version into
  *     just the command code.
  */
  
@@ -739,14 +738,20 @@ int ipc_parse_version (int *cmd)
 #endif /* __ARCH_WANT_IPC_PARSE_VERSION */
 
 #ifdef CONFIG_PROC_FS
+struct ipc_proc_iter {
+       struct ipc_namespace *ns;
+       struct ipc_proc_iface *iface;
+};
+
 static void *sysvipc_proc_next(struct seq_file *s, void *it, loff_t *pos)
 {
-       struct ipc_proc_iface *iface = s->private;
+       struct ipc_proc_iter *iter = s->private;
+       struct ipc_proc_iface *iface = iter->iface;
        struct kern_ipc_perm *ipc = it;
        loff_t p;
        struct ipc_ids *ids;
 
-       ids = current->nsproxy->ipc_ns->ids[iface->ids];
+       ids = iter->ns->ids[iface->ids];
 
        /* If we had an ipc id locked before, unlock it */
        if (ipc && ipc != SEQ_START_TOKEN)
@@ -773,12 +778,13 @@ static void *sysvipc_proc_next(struct seq_file *s, void *it, loff_t *pos)
  */
 static void *sysvipc_proc_start(struct seq_file *s, loff_t *pos)
 {
-       struct ipc_proc_iface *iface = s->private;
+       struct ipc_proc_iter *iter = s->private;
+       struct ipc_proc_iface *iface = iter->iface;
        struct kern_ipc_perm *ipc;
        loff_t p;
        struct ipc_ids *ids;
 
-       ids = current->nsproxy->ipc_ns->ids[iface->ids];
+       ids = iter->ns->ids[iface->ids];
 
        /*
         * Take the lock - this will be released by the corresponding
@@ -807,21 +813,23 @@ static void *sysvipc_proc_start(struct seq_file *s, loff_t *pos)
 static void sysvipc_proc_stop(struct seq_file *s, void *it)
 {
        struct kern_ipc_perm *ipc = it;
-       struct ipc_proc_iface *iface = s->private;
+       struct ipc_proc_iter *iter = s->private;
+       struct ipc_proc_iface *iface = iter->iface;
        struct ipc_ids *ids;
 
        /* If we had a locked segment, release it */
        if (ipc && ipc != SEQ_START_TOKEN)
                ipc_unlock(ipc);
 
-       ids = current->nsproxy->ipc_ns->ids[iface->ids];
+       ids = iter->ns->ids[iface->ids];
        /* Release the lock we took in start() */
        mutex_unlock(&ids->mutex);
 }
 
 static int sysvipc_proc_show(struct seq_file *s, void *it)
 {
-       struct ipc_proc_iface *iface = s->private;
+       struct ipc_proc_iter *iter = s->private;
+       struct ipc_proc_iface *iface = iter->iface;
 
        if (it == SEQ_START_TOKEN)
                return seq_puts(s, iface->header);
@@ -836,22 +844,45 @@ static struct seq_operations sysvipc_proc_seqops = {
        .show  = sysvipc_proc_show,
 };
 
-static int sysvipc_proc_open(struct inode *inode, struct file *file) {
+static int sysvipc_proc_open(struct inode *inode, struct file *file)
+{
        int ret;
        struct seq_file *seq;
+       struct ipc_proc_iter *iter;
+
+       ret = -ENOMEM;
+       iter = kmalloc(sizeof(*iter), GFP_KERNEL);
+       if (!iter)
+               goto out;
 
        ret = seq_open(file, &sysvipc_proc_seqops);
-       if (!ret) {
-               seq = file->private_data;
-               seq->private = PDE(inode)->data;
-       }
+       if (ret)
+               goto out_kfree;
+
+       seq = file->private_data;
+       seq->private = iter;
+
+       iter->iface = PDE(inode)->data;
+       iter->ns    = get_ipc_ns(current->nsproxy->ipc_ns);
+out:
        return ret;
+out_kfree:
+       kfree(iter);
+       goto out;
+}
+
+static int sysvipc_proc_release(struct inode *inode, struct file *file)
+{
+       struct seq_file *seq = file->private_data;
+       struct ipc_proc_iter *iter = seq->private;
+       put_ipc_ns(iter->ns);
+       return seq_release_private(inode, file);
 }
 
-static struct file_operations sysvipc_proc_fops = {
+static const struct file_operations sysvipc_proc_fops = {
        .open    = sysvipc_proc_open,
        .read    = seq_read,
        .llseek  = seq_lseek,
-       .release = seq_release,
+       .release = sysvipc_proc_release,
 };
 #endif /* CONFIG_PROC_FS */
index 14f4d45e0ae95fbdeb4fe40d4815b495ec3d571f..ac6b27abb1adf21bccafac0dc9dde9c5929ffe83 100644 (file)
@@ -47,6 +47,7 @@ obj-$(CONFIG_GENERIC_HARDIRQS) += irq/
 obj-$(CONFIG_SECCOMP) += seccomp.o
 obj-$(CONFIG_RCU_TORTURE_TEST) += rcutorture.o
 obj-$(CONFIG_RELAY) += relay.o
+obj-$(CONFIG_SYSCTL) += utsname_sysctl.o
 obj-$(CONFIG_UTS_NS) += utsname.o
 obj-$(CONFIG_TASK_DELAY_ACCT) += delayacct.o
 obj-$(CONFIG_TASKSTATS) += taskstats.o tsacct.o
index 9c8c23227c7f28970f64de6e21cab6e8bfa08415..87865f8b4ce3ecdebad12707c6867a302bedee69 100644 (file)
@@ -1601,8 +1601,8 @@ static int audit_filter_user_rules(struct netlink_skb_parms *cb,
 
 int audit_filter_user(struct netlink_skb_parms *cb, int type)
 {
+       enum audit_state state = AUDIT_DISABLED;
        struct audit_entry *e;
-       enum audit_state   state;
        int ret = 1;
 
        rcu_read_lock();
index edb845a6e84ae5e649ece39e18384620c5dac74e..c8d3c776203490b763c0cc65bd7444a29655804a 100644 (file)
@@ -92,15 +92,17 @@ out:
  * cap_set_pg - set capabilities for all processes in a given process
  * group.  We call this holding task_capability_lock and tasklist_lock.
  */
-static inline int cap_set_pg(int pgrp, kernel_cap_t *effective,
+static inline int cap_set_pg(int pgrp_nr, kernel_cap_t *effective,
                              kernel_cap_t *inheritable,
                              kernel_cap_t *permitted)
 {
        struct task_struct *g, *target;
        int ret = -EPERM;
        int found = 0;
+       struct pid *pgrp;
 
-       do_each_task_pid(pgrp, PIDTYPE_PGID, g) {
+       pgrp = find_pid(pgrp_nr);
+       do_each_pid_task(pgrp, PIDTYPE_PGID, g) {
                target = g;
                while_each_thread(g, target) {
                        if (!security_capset_check(target, effective,
@@ -113,7 +115,7 @@ static inline int cap_set_pg(int pgrp, kernel_cap_t *effective,
                        }
                        found = 1;
                }
-       } while_each_task_pid(pgrp, PIDTYPE_PGID, g);
+       } while_each_pid_task(pgrp, PIDTYPE_PGID, g);
 
        if (!found)
             ret = 0;
index 6952dd057300f637e68a059ba1f299d8464ae9f8..cebb4c28c039b0cd9ad14592557d324b0ffac899 100644 (file)
@@ -1016,3 +1016,69 @@ asmlinkage long compat_sys_migrate_pages(compat_pid_t pid,
        return sys_migrate_pages(pid, nr_bits + 1, old, new);
 }
 #endif
+
+struct compat_sysinfo {
+       s32 uptime;
+       u32 loads[3];
+       u32 totalram;
+       u32 freeram;
+       u32 sharedram;
+       u32 bufferram;
+       u32 totalswap;
+       u32 freeswap;
+       u16 procs;
+       u16 pad;
+       u32 totalhigh;
+       u32 freehigh;
+       u32 mem_unit;
+       char _f[20-2*sizeof(u32)-sizeof(int)];
+};
+
+asmlinkage long
+compat_sys_sysinfo(struct compat_sysinfo __user *info)
+{
+       struct sysinfo s;
+
+       do_sysinfo(&s);
+
+       /* Check to see if any memory value is too large for 32-bit and scale
+        *  down if needed
+        */
+       if ((s.totalram >> 32) || (s.totalswap >> 32)) {
+               int bitcount = 0;
+
+               while (s.mem_unit < PAGE_SIZE) {
+                       s.mem_unit <<= 1;
+                       bitcount++;
+               }
+
+               s.totalram >>= bitcount;
+               s.freeram >>= bitcount;
+               s.sharedram >>= bitcount;
+               s.bufferram >>= bitcount;
+               s.totalswap >>= bitcount;
+               s.freeswap >>= bitcount;
+               s.totalhigh >>= bitcount;
+               s.freehigh >>= bitcount;
+       }
+
+       if (!access_ok(VERIFY_WRITE, info, sizeof(struct compat_sysinfo)) ||
+           __put_user (s.uptime, &info->uptime) ||
+           __put_user (s.loads[0], &info->loads[0]) ||
+           __put_user (s.loads[1], &info->loads[1]) ||
+           __put_user (s.loads[2], &info->loads[2]) ||
+           __put_user (s.totalram, &info->totalram) ||
+           __put_user (s.freeram, &info->freeram) ||
+           __put_user (s.sharedram, &info->sharedram) ||
+           __put_user (s.bufferram, &info->bufferram) ||
+           __put_user (s.totalswap, &info->totalswap) ||
+           __put_user (s.freeswap, &info->freeswap) ||
+           __put_user (s.procs, &info->procs) ||
+           __put_user (s.totalhigh, &info->totalhigh) ||
+           __put_user (s.freehigh, &info->freehigh) ||
+           __put_user (s.mem_unit, &info->mem_unit))
+               return -EFAULT;
+
+       return 0;
+}
+
index 7406fe6966f908cb547fba3de5fcf5d566f831ea..3d4206ada5c9d970c0806348a75424f30f7adbac 100644 (file)
@@ -309,6 +309,8 @@ void enable_nonboot_cpus(void)
        mutex_lock(&cpu_add_remove_lock);
        cpu_hotplug_disabled = 0;
        mutex_unlock(&cpu_add_remove_lock);
+       if (cpus_empty(frozen_cpus))
+               return;
 
        printk("Enabling non-boot CPUs ...\n");
        for_each_cpu_mask(cpu, frozen_cpus) {
index 6b05dc69c9597f900f46c02ff6acaff4e9768458..f382b0f775e15ca0d91600c796f746f11d159a72 100644 (file)
@@ -1540,7 +1540,7 @@ static const struct file_operations cpuset_file_operations = {
        .release = cpuset_file_release,
 };
 
-static struct inode_operations cpuset_dir_inode_operations = {
+static const struct inode_operations cpuset_dir_inode_operations = {
        .lookup = simple_lookup,
        .mkdir = cpuset_mkdir,
        .rmdir = cpuset_rmdir,
@@ -2656,7 +2656,7 @@ static int cpuset_open(struct inode *inode, struct file *file)
        return single_open(file, proc_cpuset_show, pid);
 }
 
-struct file_operations proc_cpuset_operations = {
+const struct file_operations proc_cpuset_operations = {
        .open           = cpuset_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index fec12eb124716f7e05e2564f241beef2049834cb..f132349c032569c94d4b3cd710b0c74fe8d0eec5 100644 (file)
@@ -185,21 +185,19 @@ repeat:
  * This checks not only the pgrp, but falls back on the pid if no
  * satisfactory pgrp is found. I dunno - gdb doesn't work correctly
  * without this...
+ *
+ * The caller must hold rcu lock or the tasklist lock.
  */
-int session_of_pgrp(int pgrp)
+struct pid *session_of_pgrp(struct pid *pgrp)
 {
        struct task_struct *p;
-       int sid = 0;
-
-       read_lock(&tasklist_lock);
+       struct pid *sid = NULL;
 
-       p = find_task_by_pid_type(PIDTYPE_PGID, pgrp);
+       p = pid_task(pgrp, PIDTYPE_PGID);
        if (p == NULL)
-               p = find_task_by_pid(pgrp);
+               p = pid_task(pgrp, PIDTYPE_PID);
        if (p != NULL)
-               sid = process_session(p);
-
-       read_unlock(&tasklist_lock);
+               sid = task_session(p);
 
        return sid;
 }
@@ -212,53 +210,52 @@ int session_of_pgrp(int pgrp)
  *
  * "I ask you, have you ever known what it is to be an orphan?"
  */
-static int will_become_orphaned_pgrp(int pgrp, struct task_struct *ignored_task)
+static int will_become_orphaned_pgrp(struct pid *pgrp, struct task_struct *ignored_task)
 {
        struct task_struct *p;
        int ret = 1;
 
-       do_each_task_pid(pgrp, PIDTYPE_PGID, p) {
+       do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
                if (p == ignored_task
                                || p->exit_state
                                || is_init(p->real_parent))
                        continue;
-               if (process_group(p->real_parent) != pgrp &&
-                   process_session(p->real_parent) == process_session(p)) {
+               if (task_pgrp(p->real_parent) != pgrp &&
+                   task_session(p->real_parent) == task_session(p)) {
                        ret = 0;
                        break;
                }
-       } while_each_task_pid(pgrp, PIDTYPE_PGID, p);
+       } while_each_pid_task(pgrp, PIDTYPE_PGID, p);
        return ret;     /* (sighing) "Often!" */
 }
 
-int is_orphaned_pgrp(int pgrp)
+int is_current_pgrp_orphaned(void)
 {
        int retval;
 
        read_lock(&tasklist_lock);
-       retval = will_become_orphaned_pgrp(pgrp, NULL);
+       retval = will_become_orphaned_pgrp(task_pgrp(current), NULL);
        read_unlock(&tasklist_lock);
 
        return retval;
 }
 
-static int has_stopped_jobs(int pgrp)
+static int has_stopped_jobs(struct pid *pgrp)
 {
        int retval = 0;
        struct task_struct *p;
 
-       do_each_task_pid(pgrp, PIDTYPE_PGID, p) {
+       do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
                if (p->state != TASK_STOPPED)
                        continue;
                retval = 1;
                break;
-       } while_each_task_pid(pgrp, PIDTYPE_PGID, p);
+       } while_each_pid_task(pgrp, PIDTYPE_PGID, p);
        return retval;
 }
 
 /**
- * reparent_to_init - Reparent the calling kernel thread to the init task
- * of the pid space that the thread belongs to.
+ * reparent_to_init - Reparent the calling kernel thread to the init task of the pid space that the thread belongs to.
  *
  * If a kernel thread is launched as a result of a system call, or if
  * it ever exits, it should generally reparent itself to init so that
@@ -431,8 +428,10 @@ static void close_files(struct files_struct * files)
                while (set) {
                        if (set & 1) {
                                struct file * file = xchg(&fdt->fd[i], NULL);
-                               if (file)
+                               if (file) {
                                        filp_close(file, files);
+                                       cond_resched();
+                               }
                        }
                        i++;
                        set >>= 1;
@@ -649,14 +648,14 @@ reparent_thread(struct task_struct *p, struct task_struct *father, int traced)
         * than we are, and it was the only connection
         * outside, so the child pgrp is now orphaned.
         */
-       if ((process_group(p) != process_group(father)) &&
-           (process_session(p) == process_session(father))) {
-               int pgrp = process_group(p);
+       if ((task_pgrp(p) != task_pgrp(father)) &&
+           (task_session(p) == task_session(father))) {
+               struct pid *pgrp = task_pgrp(p);
 
                if (will_become_orphaned_pgrp(pgrp, NULL) &&
                    has_stopped_jobs(pgrp)) {
-                       __kill_pg_info(SIGHUP, SEND_SIG_PRIV, pgrp);
-                       __kill_pg_info(SIGCONT, SEND_SIG_PRIV, pgrp);
+                       __kill_pgrp_info(SIGHUP, SEND_SIG_PRIV, pgrp);
+                       __kill_pgrp_info(SIGCONT, SEND_SIG_PRIV, pgrp);
                }
        }
 }
@@ -736,6 +735,7 @@ static void exit_notify(struct task_struct *tsk)
        int state;
        struct task_struct *t;
        struct list_head ptrace_dead, *_p, *_n;
+       struct pid *pgrp;
 
        if (signal_pending(tsk) && !(tsk->signal->flags & SIGNAL_GROUP_EXIT)
            && !thread_group_empty(tsk)) {
@@ -788,12 +788,13 @@ static void exit_notify(struct task_struct *tsk)
         
        t = tsk->real_parent;
        
-       if ((process_group(t) != process_group(tsk)) &&
-           (process_session(t) == process_session(tsk)) &&
-           will_become_orphaned_pgrp(process_group(tsk), tsk) &&
-           has_stopped_jobs(process_group(tsk))) {
-               __kill_pg_info(SIGHUP, SEND_SIG_PRIV, process_group(tsk));
-               __kill_pg_info(SIGCONT, SEND_SIG_PRIV, process_group(tsk));
+       pgrp = task_pgrp(tsk);
+       if ((task_pgrp(t) != pgrp) &&
+           (task_session(t) != task_session(tsk)) &&
+           will_become_orphaned_pgrp(pgrp, tsk) &&
+           has_stopped_jobs(pgrp)) {
+               __kill_pgrp_info(SIGHUP, SEND_SIG_PRIV, pgrp);
+               __kill_pgrp_info(SIGCONT, SEND_SIG_PRIV, pgrp);
        }
 
        /* Let father know we died 
index d57118da73ff04cfecc4b09b689c7bf74191dcc6..d154cc786489f3928bbaefe5d31e8da4f78b2481 100644 (file)
@@ -858,7 +858,7 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts
        init_sigpending(&sig->shared_pending);
        INIT_LIST_HEAD(&sig->posix_timers);
 
-       hrtimer_init(&sig->real_timer, CLOCK_MONOTONIC, HRTIMER_REL);
+       hrtimer_init(&sig->real_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
        sig->it_real_incr.tv64 = 0;
        sig->real_timer.function = it_real_fn;
        sig->tsk = tsk;
@@ -869,7 +869,7 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts
        sig->it_prof_incr = cputime_zero;
 
        sig->leader = 0;        /* session leadership doesn't inherit */
-       sig->tty_old_pgrp = 0;
+       sig->tty_old_pgrp = NULL;
 
        sig->utime = sig->stime = sig->cutime = sig->cstime = cputime_zero;
        sig->nvcsw = sig->nivcsw = sig->cnvcsw = sig->cnivcsw = 0;
@@ -1038,10 +1038,12 @@ static struct task_struct *copy_process(unsigned long clone_flags,
        p->utime = cputime_zero;
        p->stime = cputime_zero;
        p->sched_time = 0;
+#ifdef CONFIG_TASK_XACCT
        p->rchar = 0;           /* I/O counter: bytes read */
        p->wchar = 0;           /* I/O counter: bytes written */
        p->syscr = 0;           /* I/O counter: read syscalls */
        p->syscw = 0;           /* I/O counter: write syscalls */
+#endif
        task_io_accounting_init(p);
        acct_clear_integrals(p);
 
index 5a737de857d37e5d84bd7da9044c92ce22170a94..e749e7df14b1a598c201f61b4d9b5bf8fb7c3d97 100644 (file)
@@ -1134,7 +1134,7 @@ static int futex_lock_pi(u32 __user *uaddr, int detect, unsigned long sec,
 
        if (sec != MAX_SCHEDULE_TIMEOUT) {
                to = &timeout;
-               hrtimer_init(&to->timer, CLOCK_REALTIME, HRTIMER_ABS);
+               hrtimer_init(&to->timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
                hrtimer_init_sleeper(to, current);
                to->timer.expires = ktime_set(sec, nsec);
        }
index d0ba190dfeb6b9ae81c98f135515b19a145f8206..476cb0c0b4a432bce65c1f113011aa60cd3060b0 100644 (file)
@@ -1,8 +1,9 @@
 /*
  *  linux/kernel/hrtimer.c
  *
- *  Copyright(C) 2005, Thomas Gleixner <tglx@linutronix.de>
- *  Copyright(C) 2005, Red Hat, Inc., Ingo Molnar
+ *  Copyright(C) 2005-2006, Thomas Gleixner <tglx@linutronix.de>
+ *  Copyright(C) 2005-2007, Red Hat, Inc., Ingo Molnar
+ *  Copyright(C) 2006-2007  Timesys Corp., Thomas Gleixner
  *
  *  High-resolution kernel timers
  *
  */
 
 #include <linux/cpu.h>
+#include <linux/irq.h>
 #include <linux/module.h>
 #include <linux/percpu.h>
 #include <linux/hrtimer.h>
 #include <linux/notifier.h>
 #include <linux/syscalls.h>
+#include <linux/kallsyms.h>
 #include <linux/interrupt.h>
+#include <linux/tick.h>
+#include <linux/seq_file.h>
+#include <linux/err.h>
 
 #include <asm/uaccess.h>
 
@@ -45,7 +51,7 @@
  *
  * returns the time in ktime_t format
  */
-static ktime_t ktime_get(void)
+ktime_t ktime_get(void)
 {
        struct timespec now;
 
@@ -59,7 +65,7 @@ static ktime_t ktime_get(void)
  *
  * returns the time in ktime_t format
  */
-static ktime_t ktime_get_real(void)
+ktime_t ktime_get_real(void)
 {
        struct timespec now;
 
@@ -79,21 +85,22 @@ EXPORT_SYMBOL_GPL(ktime_get_real);
  * This ensures that we capture erroneous accesses to these clock ids
  * rather than moving them into the range of valid clock id's.
  */
-
-#define MAX_HRTIMER_BASES 2
-
-static DEFINE_PER_CPU(struct hrtimer_base, hrtimer_bases[MAX_HRTIMER_BASES]) =
+DEFINE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases) =
 {
+
+       .clock_base =
        {
-               .index = CLOCK_REALTIME,
-               .get_time = &ktime_get_real,
-               .resolution = KTIME_REALTIME_RES,
-       },
-       {
-               .index = CLOCK_MONOTONIC,
-               .get_time = &ktime_get,
-               .resolution = KTIME_MONOTONIC_RES,
-       },
+               {
+                       .index = CLOCK_REALTIME,
+                       .get_time = &ktime_get_real,
+                       .resolution = KTIME_LOW_RES,
+               },
+               {
+                       .index = CLOCK_MONOTONIC,
+                       .get_time = &ktime_get,
+                       .resolution = KTIME_LOW_RES,
+               },
+       }
 };
 
 /**
@@ -102,7 +109,7 @@ static DEFINE_PER_CPU(struct hrtimer_base, hrtimer_bases[MAX_HRTIMER_BASES]) =
  *
  * The function calculates the monotonic clock from the realtime
  * clock and the wall_to_monotonic offset and stores the result
- * in normalized timespec format in the variable pointed to by ts.
+ * in normalized timespec format in the variable pointed to by @ts.
  */
 void ktime_get_ts(struct timespec *ts)
 {
@@ -125,20 +132,35 @@ EXPORT_SYMBOL_GPL(ktime_get_ts);
  * Get the coarse grained time at the softirq based on xtime and
  * wall_to_monotonic.
  */
-static void hrtimer_get_softirq_time(struct hrtimer_base *base)
+static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base)
 {
        ktime_t xtim, tomono;
+       struct timespec xts;
        unsigned long seq;
 
        do {
                seq = read_seqbegin(&xtime_lock);
-               xtim = timespec_to_ktime(xtime);
-               tomono = timespec_to_ktime(wall_to_monotonic);
-
+#ifdef CONFIG_NO_HZ
+               getnstimeofday(&xts);
+#else
+               xts = xtime;
+#endif
        } while (read_seqretry(&xtime_lock, seq));
 
-       base[CLOCK_REALTIME].softirq_time = xtim;
-       base[CLOCK_MONOTONIC].softirq_time = ktime_add(xtim, tomono);
+       xtim = timespec_to_ktime(xts);
+       tomono = timespec_to_ktime(wall_to_monotonic);
+       base->clock_base[CLOCK_REALTIME].softirq_time = xtim;
+       base->clock_base[CLOCK_MONOTONIC].softirq_time =
+               ktime_add(xtim, tomono);
+}
+
+/*
+ * Helper function to check, whether the timer is running the callback
+ * function
+ */
+static inline int hrtimer_callback_running(struct hrtimer *timer)
+{
+       return timer->state & HRTIMER_STATE_CALLBACK;
 }
 
 /*
@@ -147,8 +169,6 @@ static void hrtimer_get_softirq_time(struct hrtimer_base *base)
  */
 #ifdef CONFIG_SMP
 
-#define set_curr_timer(b, t)           do { (b)->curr_timer = (t); } while (0)
-
 /*
  * We are using hashed locking: holding per_cpu(hrtimer_bases)[n].lock
  * means that all timers which are tied to this base via timer->base are
@@ -161,19 +181,20 @@ static void hrtimer_get_softirq_time(struct hrtimer_base *base)
  * possible to set timer->base = NULL and drop the lock: the timer remains
  * locked.
  */
-static struct hrtimer_base *lock_hrtimer_base(const struct hrtimer *timer,
-                                             unsigned long *flags)
+static
+struct hrtimer_clock_base *lock_hrtimer_base(const struct hrtimer *timer,
+                                            unsigned long *flags)
 {
-       struct hrtimer_base *base;
+       struct hrtimer_clock_base *base;
 
        for (;;) {
                base = timer->base;
                if (likely(base != NULL)) {
-                       spin_lock_irqsave(&base->lock, *flags);
+                       spin_lock_irqsave(&base->cpu_base->lock, *flags);
                        if (likely(base == timer->base))
                                return base;
                        /* The timer has migrated to another CPU: */
-                       spin_unlock_irqrestore(&base->lock, *flags);
+                       spin_unlock_irqrestore(&base->cpu_base->lock, *flags);
                }
                cpu_relax();
        }
@@ -182,12 +203,14 @@ static struct hrtimer_base *lock_hrtimer_base(const struct hrtimer *timer,
 /*
  * Switch the timer base to the current CPU when possible.
  */
-static inline struct hrtimer_base *
-switch_hrtimer_base(struct hrtimer *timer, struct hrtimer_base *base)
+static inline struct hrtimer_clock_base *
+switch_hrtimer_base(struct hrtimer *timer, struct hrtimer_clock_base *base)
 {
-       struct hrtimer_base *new_base;
+       struct hrtimer_clock_base *new_base;
+       struct hrtimer_cpu_base *new_cpu_base;
 
-       new_base = &__get_cpu_var(hrtimer_bases)[base->index];
+       new_cpu_base = &__get_cpu_var(hrtimer_bases);
+       new_base = &new_cpu_base->clock_base[base->index];
 
        if (base != new_base) {
                /*
@@ -199,13 +222,13 @@ switch_hrtimer_base(struct hrtimer *timer, struct hrtimer_base *base)
                 * completed. There is no conflict as we hold the lock until
                 * the timer is enqueued.
                 */
-               if (unlikely(base->curr_timer == timer))
+               if (unlikely(hrtimer_callback_running(timer)))
                        return base;
 
                /* See the comment in lock_timer_base() */
                timer->base = NULL;
-               spin_unlock(&base->lock);
-               spin_lock(&new_base->lock);
+               spin_unlock(&base->cpu_base->lock);
+               spin_lock(&new_base->cpu_base->lock);
                timer->base = new_base;
        }
        return new_base;
@@ -213,19 +236,17 @@ switch_hrtimer_base(struct hrtimer *timer, struct hrtimer_base *base)
 
 #else /* CONFIG_SMP */
 
-#define set_curr_timer(b, t)           do { } while (0)
-
-static inline struct hrtimer_base *
+static inline struct hrtimer_clock_base *
 lock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags)
 {
-       struct hrtimer_base *base = timer->base;
+       struct hrtimer_clock_base *base = timer->base;
 
-       spin_lock_irqsave(&base->lock, *flags);
+       spin_lock_irqsave(&base->cpu_base->lock, *flags);
 
        return base;
 }
 
-#define switch_hrtimer_base(t, b)      (b)
+# define switch_hrtimer_base(t, b)     (b)
 
 #endif /* !CONFIG_SMP */
 
@@ -256,15 +277,12 @@ ktime_t ktime_add_ns(const ktime_t kt, u64 nsec)
 
        return ktime_add(kt, tmp);
 }
-
-#else /* CONFIG_KTIME_SCALAR */
-
 # endif /* !CONFIG_KTIME_SCALAR */
 
 /*
  * Divide a ktime value by a nanosecond value
  */
-static unsigned long ktime_divns(const ktime_t kt, s64 div)
+unsigned long ktime_divns(const ktime_t kt, s64 div)
 {
        u64 dclc, inc, dns;
        int sft = 0;
@@ -281,18 +299,311 @@ static unsigned long ktime_divns(const ktime_t kt, s64 div)
 
        return (unsigned long) dclc;
 }
-
-#else /* BITS_PER_LONG < 64 */
-# define ktime_divns(kt, div)          (unsigned long)((kt).tv64 / (div))
 #endif /* BITS_PER_LONG >= 64 */
 
+/* High resolution timer related functions */
+#ifdef CONFIG_HIGH_RES_TIMERS
+
+/*
+ * High resolution timer enabled ?
+ */
+static int hrtimer_hres_enabled __read_mostly  = 1;
+
+/*
+ * Enable / Disable high resolution mode
+ */
+static int __init setup_hrtimer_hres(char *str)
+{
+       if (!strcmp(str, "off"))
+               hrtimer_hres_enabled = 0;
+       else if (!strcmp(str, "on"))
+               hrtimer_hres_enabled = 1;
+       else
+               return 0;
+       return 1;
+}
+
+__setup("highres=", setup_hrtimer_hres);
+
+/*
+ * hrtimer_high_res_enabled - query, if the highres mode is enabled
+ */
+static inline int hrtimer_is_hres_enabled(void)
+{
+       return hrtimer_hres_enabled;
+}
+
+/*
+ * Is the high resolution mode active ?
+ */
+static inline int hrtimer_hres_active(void)
+{
+       return __get_cpu_var(hrtimer_bases).hres_active;
+}
+
+/*
+ * Reprogram the event source with checking both queues for the
+ * next event
+ * Called with interrupts disabled and base->lock held
+ */
+static void hrtimer_force_reprogram(struct hrtimer_cpu_base *cpu_base)
+{
+       int i;
+       struct hrtimer_clock_base *base = cpu_base->clock_base;
+       ktime_t expires;
+
+       cpu_base->expires_next.tv64 = KTIME_MAX;
+
+       for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++, base++) {
+               struct hrtimer *timer;
+
+               if (!base->first)
+                       continue;
+               timer = rb_entry(base->first, struct hrtimer, node);
+               expires = ktime_sub(timer->expires, base->offset);
+               if (expires.tv64 < cpu_base->expires_next.tv64)
+                       cpu_base->expires_next = expires;
+       }
+
+       if (cpu_base->expires_next.tv64 != KTIME_MAX)
+               tick_program_event(cpu_base->expires_next, 1);
+}
+
+/*
+ * Shared reprogramming for clock_realtime and clock_monotonic
+ *
+ * When a timer is enqueued and expires earlier than the already enqueued
+ * timers, we have to check, whether it expires earlier than the timer for
+ * which the clock event device was armed.
+ *
+ * Called with interrupts disabled and base->cpu_base.lock held
+ */
+static int hrtimer_reprogram(struct hrtimer *timer,
+                            struct hrtimer_clock_base *base)
+{
+       ktime_t *expires_next = &__get_cpu_var(hrtimer_bases).expires_next;
+       ktime_t expires = ktime_sub(timer->expires, base->offset);
+       int res;
+
+       /*
+        * When the callback is running, we do not reprogram the clock event
+        * device. The timer callback is either running on a different CPU or
+        * the callback is executed in the hrtimer_interupt context. The
+        * reprogramming is handled either by the softirq, which called the
+        * callback or at the end of the hrtimer_interrupt.
+        */
+       if (hrtimer_callback_running(timer))
+               return 0;
+
+       if (expires.tv64 >= expires_next->tv64)
+               return 0;
+
+       /*
+        * Clockevents returns -ETIME, when the event was in the past.
+        */
+       res = tick_program_event(expires, 0);
+       if (!IS_ERR_VALUE(res))
+               *expires_next = expires;
+       return res;
+}
+
+
+/*
+ * Retrigger next event is called after clock was set
+ *
+ * Called with interrupts disabled via on_each_cpu()
+ */
+static void retrigger_next_event(void *arg)
+{
+       struct hrtimer_cpu_base *base;
+       struct timespec realtime_offset;
+       unsigned long seq;
+
+       if (!hrtimer_hres_active())
+               return;
+
+       do {
+               seq = read_seqbegin(&xtime_lock);
+               set_normalized_timespec(&realtime_offset,
+                                       -wall_to_monotonic.tv_sec,
+                                       -wall_to_monotonic.tv_nsec);
+       } while (read_seqretry(&xtime_lock, seq));
+
+       base = &__get_cpu_var(hrtimer_bases);
+
+       /* Adjust CLOCK_REALTIME offset */
+       spin_lock(&base->lock);
+       base->clock_base[CLOCK_REALTIME].offset =
+               timespec_to_ktime(realtime_offset);
+
+       hrtimer_force_reprogram(base);
+       spin_unlock(&base->lock);
+}
+
+/*
+ * Clock realtime was set
+ *
+ * Change the offset of the realtime clock vs. the monotonic
+ * clock.
+ *
+ * We might have to reprogram the high resolution timer interrupt. On
+ * SMP we call the architecture specific code to retrigger _all_ high
+ * resolution timer interrupts. On UP we just disable interrupts and
+ * call the high resolution interrupt code.
+ */
+void clock_was_set(void)
+{
+       /* Retrigger the CPU local events everywhere */
+       on_each_cpu(retrigger_next_event, NULL, 0, 1);
+}
+
+/*
+ * Check, whether the timer is on the callback pending list
+ */
+static inline int hrtimer_cb_pending(const struct hrtimer *timer)
+{
+       return timer->state & HRTIMER_STATE_PENDING;
+}
+
+/*
+ * Remove a timer from the callback pending list
+ */
+static inline void hrtimer_remove_cb_pending(struct hrtimer *timer)
+{
+       list_del_init(&timer->cb_entry);
+}
+
+/*
+ * Initialize the high resolution related parts of cpu_base
+ */
+static inline void hrtimer_init_hres(struct hrtimer_cpu_base *base)
+{
+       base->expires_next.tv64 = KTIME_MAX;
+       base->hres_active = 0;
+       INIT_LIST_HEAD(&base->cb_pending);
+}
+
+/*
+ * Initialize the high resolution related parts of a hrtimer
+ */
+static inline void hrtimer_init_timer_hres(struct hrtimer *timer)
+{
+       INIT_LIST_HEAD(&timer->cb_entry);
+}
+
+/*
+ * When High resolution timers are active, try to reprogram. Note, that in case
+ * the state has HRTIMER_STATE_CALLBACK set, no reprogramming and no expiry
+ * check happens. The timer gets enqueued into the rbtree. The reprogramming
+ * and expiry check is done in the hrtimer_interrupt or in the softirq.
+ */
+static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer,
+                                           struct hrtimer_clock_base *base)
+{
+       if (base->cpu_base->hres_active && hrtimer_reprogram(timer, base)) {
+
+               /* Timer is expired, act upon the callback mode */
+               switch(timer->cb_mode) {
+               case HRTIMER_CB_IRQSAFE_NO_RESTART:
+                       /*
+                        * We can call the callback from here. No restart
+                        * happens, so no danger of recursion
+                        */
+                       BUG_ON(timer->function(timer) != HRTIMER_NORESTART);
+                       return 1;
+               case HRTIMER_CB_IRQSAFE_NO_SOFTIRQ:
+                       /*
+                        * This is solely for the sched tick emulation with
+                        * dynamic tick support to ensure that we do not
+                        * restart the tick right on the edge and end up with
+                        * the tick timer in the softirq ! The calling site
+                        * takes care of this.
+                        */
+                       return 1;
+               case HRTIMER_CB_IRQSAFE:
+               case HRTIMER_CB_SOFTIRQ:
+                       /*
+                        * Move everything else into the softirq pending list !
+                        */
+                       list_add_tail(&timer->cb_entry,
+                                     &base->cpu_base->cb_pending);
+                       timer->state = HRTIMER_STATE_PENDING;
+                       raise_softirq(HRTIMER_SOFTIRQ);
+                       return 1;
+               default:
+                       BUG();
+               }
+       }
+       return 0;
+}
+
+/*
+ * Switch to high resolution mode
+ */
+static void hrtimer_switch_to_hres(void)
+{
+       struct hrtimer_cpu_base *base = &__get_cpu_var(hrtimer_bases);
+       unsigned long flags;
+
+       if (base->hres_active)
+               return;
+
+       local_irq_save(flags);
+
+       if (tick_init_highres()) {
+               local_irq_restore(flags);
+               return;
+       }
+       base->hres_active = 1;
+       base->clock_base[CLOCK_REALTIME].resolution = KTIME_HIGH_RES;
+       base->clock_base[CLOCK_MONOTONIC].resolution = KTIME_HIGH_RES;
+
+       tick_setup_sched_timer();
+
+       /* "Retrigger" the interrupt to get things going */
+       retrigger_next_event(NULL);
+       local_irq_restore(flags);
+       printk(KERN_INFO "Switched to high resolution mode on CPU %d\n",
+              smp_processor_id());
+}
+
+#else
+
+static inline int hrtimer_hres_active(void) { return 0; }
+static inline int hrtimer_is_hres_enabled(void) { return 0; }
+static inline void hrtimer_switch_to_hres(void) { }
+static inline void hrtimer_force_reprogram(struct hrtimer_cpu_base *base) { }
+static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer,
+                                           struct hrtimer_clock_base *base)
+{
+       return 0;
+}
+static inline int hrtimer_cb_pending(struct hrtimer *timer) { return 0; }
+static inline void hrtimer_remove_cb_pending(struct hrtimer *timer) { }
+static inline void hrtimer_init_hres(struct hrtimer_cpu_base *base) { }
+static inline void hrtimer_init_timer_hres(struct hrtimer *timer) { }
+
+#endif /* CONFIG_HIGH_RES_TIMERS */
+
+#ifdef CONFIG_TIMER_STATS
+void __timer_stats_hrtimer_set_start_info(struct hrtimer *timer, void *addr)
+{
+       if (timer->start_site)
+               return;
+
+       timer->start_site = addr;
+       memcpy(timer->start_comm, current->comm, TASK_COMM_LEN);
+       timer->start_pid = current->pid;
+}
+#endif
+
 /*
  * Counterpart to lock_timer_base above:
  */
 static inline
 void unlock_hrtimer_base(const struct hrtimer *timer, unsigned long *flags)
 {
-       spin_unlock_irqrestore(&timer->base->lock, *flags);
+       spin_unlock_irqrestore(&timer->base->cpu_base->lock, *flags);
 }
 
 /**
@@ -342,7 +653,8 @@ hrtimer_forward(struct hrtimer *timer, ktime_t now, ktime_t interval)
  * The timer is inserted in expiry order. Insertion into the
  * red black tree is O(log(n)). Must hold the base lock.
  */
-static void enqueue_hrtimer(struct hrtimer *timer, struct hrtimer_base *base)
+static void enqueue_hrtimer(struct hrtimer *timer,
+                           struct hrtimer_clock_base *base, int reprogram)
 {
        struct rb_node **link = &base->active.rb_node;
        struct rb_node *parent = NULL;
@@ -368,39 +680,85 @@ static void enqueue_hrtimer(struct hrtimer *timer, struct hrtimer_base *base)
         * Insert the timer to the rbtree and check whether it
         * replaces the first pending timer
         */
-       rb_link_node(&timer->node, parent, link);
-       rb_insert_color(&timer->node, &base->active);
-
        if (!base->first || timer->expires.tv64 <
-           rb_entry(base->first, struct hrtimer, node)->expires.tv64)
+           rb_entry(base->first, struct hrtimer, node)->expires.tv64) {
+               /*
+                * Reprogram the clock event device. When the timer is already
+                * expired hrtimer_enqueue_reprogram has either called the
+                * callback or added it to the pending list and raised the
+                * softirq.
+                *
+                * This is a NOP for !HIGHRES
+                */
+               if (reprogram && hrtimer_enqueue_reprogram(timer, base))
+                       return;
+
                base->first = &timer->node;
+       }
+
+       rb_link_node(&timer->node, parent, link);
+       rb_insert_color(&timer->node, &base->active);
+       /*
+        * HRTIMER_STATE_ENQUEUED is or'ed to the current state to preserve the
+        * state of a possibly running callback.
+        */
+       timer->state |= HRTIMER_STATE_ENQUEUED;
 }
 
 /*
  * __remove_hrtimer - internal function to remove a timer
  *
  * Caller must hold the base lock.
+ *
+ * High resolution timer mode reprograms the clock event device when the
+ * timer is the one which expires next. The caller can disable this by setting
+ * reprogram to zero. This is useful, when the context does a reprogramming
+ * anyway (e.g. timer interrupt)
  */
-static void __remove_hrtimer(struct hrtimer *timer, struct hrtimer_base *base)
+static void __remove_hrtimer(struct hrtimer *timer,
+                            struct hrtimer_clock_base *base,
+                            unsigned long newstate, int reprogram)
 {
-       /*
-        * Remove the timer from the rbtree and replace the
-        * first entry pointer if necessary.
-        */
-       if (base->first == &timer->node)
-               base->first = rb_next(&timer->node);
-       rb_erase(&timer->node, &base->active);
-       rb_set_parent(&timer->node, &timer->node);
+       /* High res. callback list. NOP for !HIGHRES */
+       if (hrtimer_cb_pending(timer))
+               hrtimer_remove_cb_pending(timer);
+       else {
+               /*
+                * Remove the timer from the rbtree and replace the
+                * first entry pointer if necessary.
+                */
+               if (base->first == &timer->node) {
+                       base->first = rb_next(&timer->node);
+                       /* Reprogram the clock event device. if enabled */
+                       if (reprogram && hrtimer_hres_active())
+                               hrtimer_force_reprogram(base->cpu_base);
+               }
+               rb_erase(&timer->node, &base->active);
+       }
+       timer->state = newstate;
 }
 
 /*
  * remove hrtimer, called with base lock held
  */
 static inline int
-remove_hrtimer(struct hrtimer *timer, struct hrtimer_base *base)
+remove_hrtimer(struct hrtimer *timer, struct hrtimer_clock_base *base)
 {
-       if (hrtimer_active(timer)) {
-               __remove_hrtimer(timer, base);
+       if (hrtimer_is_queued(timer)) {
+               int reprogram;
+
+               /*
+                * Remove the timer and force reprogramming when high
+                * resolution mode is active and the timer is on the current
+                * CPU. If we remove a timer on another CPU, reprogramming is
+                * skipped. The interrupt event on this CPU is fired and
+                * reprogramming happens in the interrupt handler. This is a
+                * rare case and less expensive than a smp call.
+                */
+               timer_stats_hrtimer_clear_start_info(timer);
+               reprogram = base->cpu_base == &__get_cpu_var(hrtimer_bases);
+               __remove_hrtimer(timer, base, HRTIMER_STATE_INACTIVE,
+                                reprogram);
                return 1;
        }
        return 0;
@@ -419,7 +777,7 @@ remove_hrtimer(struct hrtimer *timer, struct hrtimer_base *base)
 int
 hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode)
 {
-       struct hrtimer_base *base, *new_base;
+       struct hrtimer_clock_base *base, *new_base;
        unsigned long flags;
        int ret;
 
@@ -431,7 +789,7 @@ hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode)
        /* Switch the timer base, if necessary: */
        new_base = switch_hrtimer_base(timer, base);
 
-       if (mode == HRTIMER_REL) {
+       if (mode == HRTIMER_MODE_REL) {
                tim = ktime_add(tim, new_base->get_time());
                /*
                 * CONFIG_TIME_LOW_RES is a temporary way for architectures
@@ -446,7 +804,9 @@ hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode)
        }
        timer->expires = tim;
 
-       enqueue_hrtimer(timer, new_base);
+       timer_stats_hrtimer_set_start_info(timer);
+
+       enqueue_hrtimer(timer, new_base, base == new_base);
 
        unlock_hrtimer_base(timer, &flags);
 
@@ -466,13 +826,13 @@ EXPORT_SYMBOL_GPL(hrtimer_start);
  */
 int hrtimer_try_to_cancel(struct hrtimer *timer)
 {
-       struct hrtimer_base *base;
+       struct hrtimer_clock_base *base;
        unsigned long flags;
        int ret = -1;
 
        base = lock_hrtimer_base(timer, &flags);
 
-       if (base->curr_timer != timer)
+       if (!hrtimer_callback_running(timer))
                ret = remove_hrtimer(timer, base);
 
        unlock_hrtimer_base(timer, &flags);
@@ -508,19 +868,19 @@ EXPORT_SYMBOL_GPL(hrtimer_cancel);
  */
 ktime_t hrtimer_get_remaining(const struct hrtimer *timer)
 {
-       struct hrtimer_base *base;
+       struct hrtimer_clock_base *base;
        unsigned long flags;
        ktime_t rem;
 
        base = lock_hrtimer_base(timer, &flags);
-       rem = ktime_sub(timer->expires, timer->base->get_time());
+       rem = ktime_sub(timer->expires, base->get_time());
        unlock_hrtimer_base(timer, &flags);
 
        return rem;
 }
 EXPORT_SYMBOL_GPL(hrtimer_get_remaining);
 
-#ifdef CONFIG_NO_IDLE_HZ
+#if defined(CONFIG_NO_IDLE_HZ) || defined(CONFIG_NO_HZ)
 /**
  * hrtimer_get_next_event - get the time until next expiry event
  *
@@ -529,26 +889,31 @@ EXPORT_SYMBOL_GPL(hrtimer_get_remaining);
  */
 ktime_t hrtimer_get_next_event(void)
 {
-       struct hrtimer_base *base = __get_cpu_var(hrtimer_bases);
+       struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases);
+       struct hrtimer_clock_base *base = cpu_base->clock_base;
        ktime_t delta, mindelta = { .tv64 = KTIME_MAX };
        unsigned long flags;
        int i;
 
-       for (i = 0; i < MAX_HRTIMER_BASES; i++, base++) {
-               struct hrtimer *timer;
+       spin_lock_irqsave(&cpu_base->lock, flags);
 
-               spin_lock_irqsave(&base->lock, flags);
-               if (!base->first) {
-                       spin_unlock_irqrestore(&base->lock, flags);
-                       continue;
+       if (!hrtimer_hres_active()) {
+               for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++, base++) {
+                       struct hrtimer *timer;
+
+                       if (!base->first)
+                               continue;
+
+                       timer = rb_entry(base->first, struct hrtimer, node);
+                       delta.tv64 = timer->expires.tv64;
+                       delta = ktime_sub(delta, base->get_time());
+                       if (delta.tv64 < mindelta.tv64)
+                               mindelta.tv64 = delta.tv64;
                }
-               timer = rb_entry(base->first, struct hrtimer, node);
-               delta.tv64 = timer->expires.tv64;
-               spin_unlock_irqrestore(&base->lock, flags);
-               delta = ktime_sub(delta, base->get_time());
-               if (delta.tv64 < mindelta.tv64)
-                       mindelta.tv64 = delta.tv64;
        }
+
+       spin_unlock_irqrestore(&cpu_base->lock, flags);
+
        if (mindelta.tv64 < 0)
                mindelta.tv64 = 0;
        return mindelta;
@@ -564,17 +929,23 @@ ktime_t hrtimer_get_next_event(void)
 void hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
                  enum hrtimer_mode mode)
 {
-       struct hrtimer_base *bases;
+       struct hrtimer_cpu_base *cpu_base;
 
        memset(timer, 0, sizeof(struct hrtimer));
 
-       bases = __raw_get_cpu_var(hrtimer_bases);
+       cpu_base = &__raw_get_cpu_var(hrtimer_bases);
 
-       if (clock_id == CLOCK_REALTIME && mode != HRTIMER_ABS)
+       if (clock_id == CLOCK_REALTIME && mode != HRTIMER_MODE_ABS)
                clock_id = CLOCK_MONOTONIC;
 
-       timer->base = &bases[clock_id];
-       rb_set_parent(&timer->node, &timer->node);
+       timer->base = &cpu_base->clock_base[clock_id];
+       hrtimer_init_timer_hres(timer);
+
+#ifdef CONFIG_TIMER_STATS
+       timer->start_site = NULL;
+       timer->start_pid = -1;
+       memset(timer->start_comm, 0, TASK_COMM_LEN);
+#endif
 }
 EXPORT_SYMBOL_GPL(hrtimer_init);
 
@@ -583,26 +954,164 @@ EXPORT_SYMBOL_GPL(hrtimer_init);
  * @which_clock: which clock to query
  * @tp:                 pointer to timespec variable to store the resolution
  *
- * Store the resolution of the clock selected by which_clock in the
- * variable pointed to by tp.
+ * Store the resolution of the clock selected by @which_clock in the
+ * variable pointed to by @tp.
  */
 int hrtimer_get_res(const clockid_t which_clock, struct timespec *tp)
 {
-       struct hrtimer_base *bases;
+       struct hrtimer_cpu_base *cpu_base;
 
-       bases = __raw_get_cpu_var(hrtimer_bases);
-       *tp = ktime_to_timespec(bases[which_clock].resolution);
+       cpu_base = &__raw_get_cpu_var(hrtimer_bases);
+       *tp = ktime_to_timespec(cpu_base->clock_base[which_clock].resolution);
 
        return 0;
 }
 EXPORT_SYMBOL_GPL(hrtimer_get_res);
 
+#ifdef CONFIG_HIGH_RES_TIMERS
+
+/*
+ * High resolution timer interrupt
+ * Called with interrupts disabled
+ */
+void hrtimer_interrupt(struct clock_event_device *dev)
+{
+       struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases);
+       struct hrtimer_clock_base *base;
+       ktime_t expires_next, now;
+       int i, raise = 0;
+
+       BUG_ON(!cpu_base->hres_active);
+       cpu_base->nr_events++;
+       dev->next_event.tv64 = KTIME_MAX;
+
+ retry:
+       now = ktime_get();
+
+       expires_next.tv64 = KTIME_MAX;
+
+       base = cpu_base->clock_base;
+
+       for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) {
+               ktime_t basenow;
+               struct rb_node *node;
+
+               spin_lock(&cpu_base->lock);
+
+               basenow = ktime_add(now, base->offset);
+
+               while ((node = base->first)) {
+                       struct hrtimer *timer;
+
+                       timer = rb_entry(node, struct hrtimer, node);
+
+                       if (basenow.tv64 < timer->expires.tv64) {
+                               ktime_t expires;
+
+                               expires = ktime_sub(timer->expires,
+                                                   base->offset);
+                               if (expires.tv64 < expires_next.tv64)
+                                       expires_next = expires;
+                               break;
+                       }
+
+                       /* Move softirq callbacks to the pending list */
+                       if (timer->cb_mode == HRTIMER_CB_SOFTIRQ) {
+                               __remove_hrtimer(timer, base,
+                                                HRTIMER_STATE_PENDING, 0);
+                               list_add_tail(&timer->cb_entry,
+                                             &base->cpu_base->cb_pending);
+                               raise = 1;
+                               continue;
+                       }
+
+                       __remove_hrtimer(timer, base,
+                                        HRTIMER_STATE_CALLBACK, 0);
+                       timer_stats_account_hrtimer(timer);
+
+                       /*
+                        * Note: We clear the CALLBACK bit after
+                        * enqueue_hrtimer to avoid reprogramming of
+                        * the event hardware. This happens at the end
+                        * of this function anyway.
+                        */
+                       if (timer->function(timer) != HRTIMER_NORESTART) {
+                               BUG_ON(timer->state != HRTIMER_STATE_CALLBACK);
+                               enqueue_hrtimer(timer, base, 0);
+                       }
+                       timer->state &= ~HRTIMER_STATE_CALLBACK;
+               }
+               spin_unlock(&cpu_base->lock);
+               base++;
+       }
+
+       cpu_base->expires_next = expires_next;
+
+       /* Reprogramming necessary ? */
+       if (expires_next.tv64 != KTIME_MAX) {
+               if (tick_program_event(expires_next, 0))
+                       goto retry;
+       }
+
+       /* Raise softirq ? */
+       if (raise)
+               raise_softirq(HRTIMER_SOFTIRQ);
+}
+
+static void run_hrtimer_softirq(struct softirq_action *h)
+{
+       struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases);
+
+       spin_lock_irq(&cpu_base->lock);
+
+       while (!list_empty(&cpu_base->cb_pending)) {
+               enum hrtimer_restart (*fn)(struct hrtimer *);
+               struct hrtimer *timer;
+               int restart;
+
+               timer = list_entry(cpu_base->cb_pending.next,
+                                  struct hrtimer, cb_entry);
+
+               timer_stats_account_hrtimer(timer);
+
+               fn = timer->function;
+               __remove_hrtimer(timer, timer->base, HRTIMER_STATE_CALLBACK, 0);
+               spin_unlock_irq(&cpu_base->lock);
+
+               restart = fn(timer);
+
+               spin_lock_irq(&cpu_base->lock);
+
+               timer->state &= ~HRTIMER_STATE_CALLBACK;
+               if (restart == HRTIMER_RESTART) {
+                       BUG_ON(hrtimer_active(timer));
+                       /*
+                        * Enqueue the timer, allow reprogramming of the event
+                        * device
+                        */
+                       enqueue_hrtimer(timer, timer->base, 1);
+               } else if (hrtimer_active(timer)) {
+                       /*
+                        * If the timer was rearmed on another CPU, reprogram
+                        * the event device.
+                        */
+                       if (timer->base->first == &timer->node)
+                               hrtimer_reprogram(timer, timer->base);
+               }
+       }
+       spin_unlock_irq(&cpu_base->lock);
+}
+
+#endif /* CONFIG_HIGH_RES_TIMERS */
+
 /*
  * Expire the per base hrtimer-queue:
  */
-static inline void run_hrtimer_queue(struct hrtimer_base *base)
+static inline void run_hrtimer_queue(struct hrtimer_cpu_base *cpu_base,
+                                    int index)
 {
        struct rb_node *node;
+       struct hrtimer_clock_base *base = &cpu_base->clock_base[index];
 
        if (!base->first)
                return;
@@ -610,53 +1119,72 @@ static inline void run_hrtimer_queue(struct hrtimer_base *base)
        if (base->get_softirq_time)
                base->softirq_time = base->get_softirq_time();
 
-       spin_lock_irq(&base->lock);
+       spin_lock_irq(&cpu_base->lock);
 
        while ((node = base->first)) {
                struct hrtimer *timer;
-               int (*fn)(struct hrtimer *);
+               enum hrtimer_restart (*fn)(struct hrtimer *);
                int restart;
 
                timer = rb_entry(node, struct hrtimer, node);
                if (base->softirq_time.tv64 <= timer->expires.tv64)
                        break;
 
+               timer_stats_account_hrtimer(timer);
+
                fn = timer->function;
-               set_curr_timer(base, timer);
-               __remove_hrtimer(timer, base);
-               spin_unlock_irq(&base->lock);
+               __remove_hrtimer(timer, base, HRTIMER_STATE_CALLBACK, 0);
+               spin_unlock_irq(&cpu_base->lock);
 
                restart = fn(timer);
 
-               spin_lock_irq(&base->lock);
+               spin_lock_irq(&cpu_base->lock);
 
+               timer->state &= ~HRTIMER_STATE_CALLBACK;
                if (restart != HRTIMER_NORESTART) {
                        BUG_ON(hrtimer_active(timer));
-                       enqueue_hrtimer(timer, base);
+                       enqueue_hrtimer(timer, base, 0);
                }
        }
-       set_curr_timer(base, NULL);
-       spin_unlock_irq(&base->lock);
+       spin_unlock_irq(&cpu_base->lock);
 }
 
 /*
  * Called from timer softirq every jiffy, expire hrtimers:
+ *
+ * For HRT its the fall back code to run the softirq in the timer
+ * softirq context in case the hrtimer initialization failed or has
+ * not been done yet.
  */
 void hrtimer_run_queues(void)
 {
-       struct hrtimer_base *base = __get_cpu_var(hrtimer_bases);
+       struct hrtimer_cpu_base *cpu_base = &__get_cpu_var(hrtimer_bases);
        int i;
 
-       hrtimer_get_softirq_time(base);
+       if (hrtimer_hres_active())
+               return;
+
+       /*
+        * This _is_ ugly: We have to check in the softirq context,
+        * whether we can switch to highres and / or nohz mode. The
+        * clocksource switch happens in the timer interrupt with
+        * xtime_lock held. Notification from there only sets the
+        * check bit in the tick_oneshot code, otherwise we might
+        * deadlock vs. xtime_lock.
+        */
+       if (tick_check_oneshot_change(!hrtimer_is_hres_enabled()))
+               hrtimer_switch_to_hres();
 
-       for (i = 0; i < MAX_HRTIMER_BASES; i++)
-               run_hrtimer_queue(&base[i]);
+       hrtimer_get_softirq_time(cpu_base);
+
+       for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++)
+               run_hrtimer_queue(cpu_base, i);
 }
 
 /*
  * Sleep related functions:
  */
-static int hrtimer_wakeup(struct hrtimer *timer)
+static enum hrtimer_restart hrtimer_wakeup(struct hrtimer *timer)
 {
        struct hrtimer_sleeper *t =
                container_of(timer, struct hrtimer_sleeper, timer);
@@ -673,6 +1201,9 @@ void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, struct task_struct *task)
 {
        sl->timer.function = hrtimer_wakeup;
        sl->task = task;
+#ifdef CONFIG_HIGH_RES_TIMERS
+       sl->timer.cb_mode = HRTIMER_CB_IRQSAFE_NO_RESTART;
+#endif
 }
 
 static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mode)
@@ -683,10 +1214,11 @@ static int __sched do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mod
                set_current_state(TASK_INTERRUPTIBLE);
                hrtimer_start(&t->timer, t->timer.expires, mode);
 
-               schedule();
+               if (likely(t->task))
+                       schedule();
 
                hrtimer_cancel(&t->timer);
-               mode = HRTIMER_ABS;
+               mode = HRTIMER_MODE_ABS;
 
        } while (t->task && !signal_pending(current));
 
@@ -702,10 +1234,10 @@ long __sched hrtimer_nanosleep_restart(struct restart_block *restart)
 
        restart->fn = do_no_restart_syscall;
 
-       hrtimer_init(&t.timer, restart->arg0, HRTIMER_ABS);
+       hrtimer_init(&t.timer, restart->arg0, HRTIMER_MODE_ABS);
        t.timer.expires.tv64 = ((u64)restart->arg3 << 32) | (u64) restart->arg2;
 
-       if (do_nanosleep(&t, HRTIMER_ABS))
+       if (do_nanosleep(&t, HRTIMER_MODE_ABS))
                return 0;
 
        rmtp = (struct timespec __user *) restart->arg1;
@@ -738,7 +1270,7 @@ long hrtimer_nanosleep(struct timespec *rqtp, struct timespec __user *rmtp,
                return 0;
 
        /* Absolute timers do not update the rmtp value and restart: */
-       if (mode == HRTIMER_ABS)
+       if (mode == HRTIMER_MODE_ABS)
                return -ERESTARTNOHAND;
 
        if (rmtp) {
@@ -771,7 +1303,7 @@ sys_nanosleep(struct timespec __user *rqtp, struct timespec __user *rmtp)
        if (!timespec_valid(&tu))
                return -EINVAL;
 
-       return hrtimer_nanosleep(&tu, rmtp, HRTIMER_REL, CLOCK_MONOTONIC);
+       return hrtimer_nanosleep(&tu, rmtp, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
 }
 
 /*
@@ -779,56 +1311,60 @@ sys_nanosleep(struct timespec __user *rqtp, struct timespec __user *rmtp)
  */
 static void __devinit init_hrtimers_cpu(int cpu)
 {
-       struct hrtimer_base *base = per_cpu(hrtimer_bases, cpu);
+       struct hrtimer_cpu_base *cpu_base = &per_cpu(hrtimer_bases, cpu);
        int i;
 
-       for (i = 0; i < MAX_HRTIMER_BASES; i++, base++) {
-               spin_lock_init(&base->lock);
-               lockdep_set_class(&base->lock, &base->lock_key);
-       }
+       spin_lock_init(&cpu_base->lock);
+       lockdep_set_class(&cpu_base->lock, &cpu_base->lock_key);
+
+       for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++)
+               cpu_base->clock_base[i].cpu_base = cpu_base;
+
+       hrtimer_init_hres(cpu_base);
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
 
-static void migrate_hrtimer_list(struct hrtimer_base *old_base,
-                               struct hrtimer_base *new_base)
+static void migrate_hrtimer_list(struct hrtimer_clock_base *old_base,
+                               struct hrtimer_clock_base *new_base)
 {
        struct hrtimer *timer;
        struct rb_node *node;
 
        while ((node = rb_first(&old_base->active))) {
                timer = rb_entry(node, struct hrtimer, node);
-               __remove_hrtimer(timer, old_base);
+               BUG_ON(hrtimer_callback_running(timer));
+               __remove_hrtimer(timer, old_base, HRTIMER_STATE_INACTIVE, 0);
                timer->base = new_base;
-               enqueue_hrtimer(timer, new_base);
+               /*
+                * Enqueue the timer. Allow reprogramming of the event device
+                */
+               enqueue_hrtimer(timer, new_base, 1);
        }
 }
 
 static void migrate_hrtimers(int cpu)
 {
-       struct hrtimer_base *old_base, *new_base;
+       struct hrtimer_cpu_base *old_base, *new_base;
        int i;
 
        BUG_ON(cpu_online(cpu));
-       old_base = per_cpu(hrtimer_bases, cpu);
-       new_base = get_cpu_var(hrtimer_bases);
-
-       local_irq_disable();
+       old_base = &per_cpu(hrtimer_bases, cpu);
+       new_base = &get_cpu_var(hrtimer_bases);
 
-       for (i = 0; i < MAX_HRTIMER_BASES; i++) {
+       tick_cancel_sched_timer(cpu);
 
-               spin_lock(&new_base->lock);
-               spin_lock(&old_base->lock);
-
-               BUG_ON(old_base->curr_timer);
+       local_irq_disable();
 
-               migrate_hrtimer_list(old_base, new_base);
+       spin_lock(&new_base->lock);
+       spin_lock(&old_base->lock);
 
-               spin_unlock(&old_base->lock);
-               spin_unlock(&new_base->lock);
-               old_base++;
-               new_base++;
+       for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) {
+               migrate_hrtimer_list(&old_base->clock_base[i],
+                                    &new_base->clock_base[i]);
        }
+       spin_unlock(&old_base->lock);
+       spin_unlock(&new_base->lock);
 
        local_irq_enable();
        put_cpu_var(hrtimer_bases);
@@ -848,6 +1384,7 @@ static int __cpuinit hrtimer_cpu_notify(struct notifier_block *self,
 
 #ifdef CONFIG_HOTPLUG_CPU
        case CPU_DEAD:
+               clockevents_notify(CLOCK_EVT_NOTIFY_CPU_DEAD, &cpu);
                migrate_hrtimers(cpu);
                break;
 #endif
@@ -868,5 +1405,8 @@ void __init hrtimers_init(void)
        hrtimer_cpu_notify(&hrtimers_nb, (unsigned long)CPU_UP_PREPARE,
                          (void *)(long)smp_processor_id());
        register_cpu_notifier(&hrtimers_nb);
+#ifdef CONFIG_HIGH_RES_TIMERS
+       open_softirq(HRTIMER_SOFTIRQ, run_hrtimer_softirq, NULL);
+#endif
 }
 
index 1dab0ac3f79782a129dc5736ac8d838ee9d4ba01..681c52dbfe229bbffc32db74c395f3f149738ed4 100644 (file)
@@ -1,5 +1,5 @@
 
-obj-y := handle.o manage.o spurious.o resend.o chip.o
+obj-y := handle.o manage.o spurious.o resend.o chip.o devres.o
 obj-$(CONFIG_GENERIC_IRQ_PROBE) += autoprobe.o
 obj-$(CONFIG_PROC_FS) += proc.o
 obj-$(CONFIG_GENERIC_PENDING_IRQ) += migration.o
index 475e8a71bcdc19772b312461b95ba0b171f1790e..0133f4f9e9f0c71633ccff2d4029f479148d0af9 100644 (file)
@@ -168,7 +168,7 @@ EXPORT_SYMBOL(set_irq_data);
 /**
  *     set_irq_data - set irq type data for an irq
  *     @irq:   Interrupt number
- *     @data:  Pointer to interrupt specific data
+ *     @entry: Pointer to MSI descriptor data
  *
  *     Set the hardware irq controller data for an irq
  */
@@ -230,10 +230,6 @@ static void default_enable(unsigned int irq)
  */
 static void default_disable(unsigned int irq)
 {
-       struct irq_desc *desc = irq_desc + irq;
-
-       if (!(desc->status & IRQ_DELAYED_DISABLE))
-               desc->chip->mask(irq);
 }
 
 /*
@@ -298,13 +294,18 @@ handle_simple_irq(unsigned int irq, struct irq_desc *desc)
 
        if (unlikely(desc->status & IRQ_INPROGRESS))
                goto out_unlock;
-       desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
        kstat_cpu(cpu).irqs[irq]++;
 
        action = desc->action;
-       if (unlikely(!action || (desc->status & IRQ_DISABLED)))
+       if (unlikely(!action || (desc->status & IRQ_DISABLED))) {
+               if (desc->chip->mask)
+                       desc->chip->mask(irq);
+               desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
+               desc->status |= IRQ_PENDING;
                goto out_unlock;
+       }
 
+       desc->status &= ~(IRQ_REPLAY | IRQ_WAITING | IRQ_PENDING);
        desc->status |= IRQ_INPROGRESS;
        spin_unlock(&desc->lock);
 
@@ -396,11 +397,13 @@ handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc)
 
        /*
         * If its disabled or no action available
-        * keep it masked and get out of here
+        * then mask it and get out of here:
         */
        action = desc->action;
        if (unlikely(!action || (desc->status & IRQ_DISABLED))) {
                desc->status |= IRQ_PENDING;
+               if (desc->chip->mask)
+                       desc->chip->mask(irq);
                goto out;
        }
 
@@ -562,10 +565,8 @@ __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
 
        /* Uninstall? */
        if (handle == handle_bad_irq) {
-               if (desc->chip != &no_irq_chip) {
-                       desc->chip->mask(irq);
-                       desc->chip->ack(irq);
-               }
+               if (desc->chip != &no_irq_chip)
+                       mask_ack_irq(desc, irq);
                desc->status |= IRQ_DISABLED;
                desc->depth = 1;
        }
diff --git a/kernel/irq/devres.c b/kernel/irq/devres.c
new file mode 100644 (file)
index 0000000..85a430d
--- /dev/null
@@ -0,0 +1,88 @@
+#include <linux/module.h>
+#include <linux/interrupt.h>
+
+/*
+ * Device resource management aware IRQ request/free implementation.
+ */
+struct irq_devres {
+       unsigned int irq;
+       void *dev_id;
+};
+
+static void devm_irq_release(struct device *dev, void *res)
+{
+       struct irq_devres *this = res;
+
+       free_irq(this->irq, this->dev_id);
+}
+
+static int devm_irq_match(struct device *dev, void *res, void *data)
+{
+       struct irq_devres *this = res, *match = data;
+
+       return this->irq == match->irq && this->dev_id == match->dev_id;
+}
+
+/**
+ *     devm_request_irq - allocate an interrupt line for a managed device
+ *     @dev: device to request interrupt for
+ *     @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
+ *
+ *     Except for the extra @dev argument, this function takes the
+ *     same arguments and performs the same function as
+ *     request_irq().  IRQs requested with this function will be
+ *     automatically freed on driver detach.
+ *
+ *     If an IRQ allocated with this function needs to be freed
+ *     separately, dev_free_irq() must be used.
+ */
+int devm_request_irq(struct device *dev, unsigned int irq,
+                    irq_handler_t handler, unsigned long irqflags,
+                    const char *devname, void *dev_id)
+{
+       struct irq_devres *dr;
+       int rc;
+
+       dr = devres_alloc(devm_irq_release, sizeof(struct irq_devres),
+                         GFP_KERNEL);
+       if (!dr)
+               return -ENOMEM;
+
+       rc = request_irq(irq, handler, irqflags, devname, dev_id);
+       if (rc) {
+               kfree(dr);
+               return rc;
+       }
+
+       dr->irq = irq;
+       dr->dev_id = dev_id;
+       devres_add(dev, dr);
+
+       return 0;
+}
+EXPORT_SYMBOL(devm_request_irq);
+
+/**
+ *     devm_free_irq - free an interrupt
+ *     @dev: device to free interrupt for
+ *     @irq: Interrupt line to free
+ *     @dev_id: Device identity to free
+ *
+ *     Except for the extra @dev argument, this function takes the
+ *     same arguments and performs the same function as free_irq().
+ *     This function instead of free_irq() should be used to manually
+ *     free IRQs allocated with dev_request_irq().
+ */
+void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id)
+{
+       struct irq_devres match_data = { irq, dev_id };
+
+       free_irq(irq, dev_id);
+       WARN_ON(devres_destroy(dev, devm_irq_release, devm_irq_match,
+                              &match_data));
+}
+EXPORT_SYMBOL(devm_free_irq);
index 8b961adc3bd2d8f27cc14b2b0701e93522e2c232..5597c157442a19a5e5bbe7de068d86c261e98951 100644 (file)
@@ -38,6 +38,46 @@ void synchronize_irq(unsigned int irq)
 }
 EXPORT_SYMBOL(synchronize_irq);
 
+/**
+ *     irq_can_set_affinity - Check if the affinity of a given irq can be set
+ *     @irq:           Interrupt to check
+ *
+ */
+int irq_can_set_affinity(unsigned int irq)
+{
+       struct irq_desc *desc = irq_desc + irq;
+
+       if (CHECK_IRQ_PER_CPU(desc->status) || !desc->chip ||
+           !desc->chip->set_affinity)
+               return 0;
+
+       return 1;
+}
+
+/**
+ *     irq_set_affinity - Set the irq affinity of a given irq
+ *     @irq:           Interrupt to set affinity
+ *     @cpumask:       cpumask
+ *
+ */
+int irq_set_affinity(unsigned int irq, cpumask_t cpumask)
+{
+       struct irq_desc *desc = irq_desc + irq;
+
+       if (!desc->chip->set_affinity)
+               return -EINVAL;
+
+       set_balance_irq_affinity(irq, cpumask);
+
+#ifdef CONFIG_GENERIC_PENDING_IRQ
+       set_pending_irq(irq, cpumask);
+#else
+       desc->affinity = cpumask;
+       desc->chip->set_affinity(irq, cpumask);
+#endif
+       return 0;
+}
+
 #endif
 
 /**
@@ -281,6 +321,10 @@ int setup_irq(unsigned int irq, struct irqaction *new)
        if (new->flags & IRQF_PERCPU)
                desc->status |= IRQ_PER_CPU;
 #endif
+       /* Exclude IRQ from balancing */
+       if (new->flags & IRQF_NOBALANCING)
+               desc->status |= IRQ_NO_BALANCING;
+
        if (!shared) {
                irq_chip_set_defaults(desc->chip);
 
@@ -328,12 +372,14 @@ int setup_irq(unsigned int irq, struct irqaction *new)
        return 0;
 
 mismatch:
+#ifdef CONFIG_DEBUG_SHIRQ
        if (!(new->flags & IRQF_PROBE_SHARED)) {
                printk(KERN_ERR "IRQ handler type mismatch for IRQ %d\n", irq);
                if (old_name)
                        printk(KERN_ERR "current handler: %s\n", old_name);
                dump_stack();
        }
+#endif
        spin_unlock_irqrestore(&desc->lock, flags);
        return -EBUSY;
 }
@@ -357,6 +403,7 @@ void free_irq(unsigned int irq, void *dev_id)
        struct irq_desc *desc;
        struct irqaction **p;
        unsigned long flags;
+       irqreturn_t (*handler)(int, void *) = NULL;
 
        WARN_ON(in_interrupt());
        if (irq >= NR_IRQS)
@@ -396,6 +443,8 @@ void free_irq(unsigned int irq, void *dev_id)
 
                        /* Make sure it's not being used on another CPU */
                        synchronize_irq(irq);
+                       if (action->flags & IRQF_SHARED)
+                               handler = action->handler;
                        kfree(action);
                        return;
                }
@@ -403,6 +452,17 @@ void free_irq(unsigned int irq, void *dev_id)
                spin_unlock_irqrestore(&desc->lock, flags);
                return;
        }
+#ifdef CONFIG_DEBUG_SHIRQ
+       if (handler) {
+               /*
+                * It's a shared IRQ -- the driver ought to be prepared for it
+                * to happen even now it's being freed, so let's make sure....
+                * We do this after actually deregistering it, to make sure that
+                * a 'real' IRQ doesn't run in parallel with our fake
+                */
+               handler(irq, dev_id);
+       }
+#endif
 }
 EXPORT_SYMBOL(free_irq);
 
@@ -445,7 +505,7 @@ int request_irq(unsigned int irq, irq_handler_t handler,
        /*
         * Lockdep wants atomic interrupt handlers:
         */
-       irqflags |= SA_INTERRUPT;
+       irqflags |= IRQF_DISABLED;
 #endif
        /*
         * Sanity-check: shared interrupts must pass in a real dev-ID,
@@ -475,6 +535,25 @@ int request_irq(unsigned int irq, irq_handler_t handler,
 
        select_smp_affinity(irq);
 
+#ifdef CONFIG_DEBUG_SHIRQ
+       if (irqflags & IRQF_SHARED) {
+               /*
+                * It's a shared IRQ -- the driver ought to be prepared for it
+                * to happen immediately, so let's make sure....
+                * We do this before actually registering it, to make sure that
+                * a 'real' IRQ doesn't run in parallel with our fake
+                */
+               if (irqflags & IRQF_DISABLED) {
+                       unsigned long flags;
+
+                       local_irq_save(flags);
+                       handler(irq, dev_id);
+                       local_irq_restore(flags);
+               } else
+                       handler(irq, dev_id);
+       }
+#endif
+
        retval = setup_irq(irq, action);
        if (retval)
                kfree(action);
index 61f5c717a8f579cbe5dd3c9b3991b7ef2fb5cead..2db91eb54ad8bb539b2dccdcb059d6872c2191a4 100644 (file)
@@ -16,26 +16,6 @@ static struct proc_dir_entry *root_irq_dir;
 
 #ifdef CONFIG_SMP
 
-#ifdef CONFIG_GENERIC_PENDING_IRQ
-void proc_set_irq_affinity(unsigned int irq, cpumask_t mask_val)
-{
-       set_balance_irq_affinity(irq, mask_val);
-
-       /*
-        * Save these away for later use. Re-progam when the
-        * interrupt is pending
-        */
-       set_pending_irq(irq, mask_val);
-}
-#else
-void proc_set_irq_affinity(unsigned int irq, cpumask_t mask_val)
-{
-       set_balance_irq_affinity(irq, mask_val);
-       irq_desc[irq].affinity = mask_val;
-       irq_desc[irq].chip->set_affinity(irq, mask_val);
-}
-#endif
-
 static int irq_affinity_read_proc(char *page, char **start, off_t off,
                                  int count, int *eof, void *data)
 {
@@ -55,7 +35,7 @@ static int irq_affinity_write_proc(struct file *file, const char __user *buffer,
        cpumask_t new_value, tmp;
 
        if (!irq_desc[irq].chip->set_affinity || no_irq_affinity ||
-                               CHECK_IRQ_PER_CPU(irq_desc[irq].status))
+           irq_balancing_disabled(irq))
                return -EIO;
 
        err = cpumask_parse_user(buffer, count, new_value);
@@ -73,7 +53,7 @@ static int irq_affinity_write_proc(struct file *file, const char __user *buffer,
                   code to set default SMP affinity. */
                return select_smp_affinity(irq) ? -EINVAL : full_count;
 
-       proc_set_irq_affinity(irq, new_value);
+       irq_set_affinity(irq, new_value);
 
        return full_count;
 }
@@ -136,7 +116,6 @@ void register_irq_proc(unsigned int irq)
                entry = create_proc_entry("smp_affinity", 0600, irq_desc[irq].dir);
 
                if (entry) {
-                       entry->nlink = 1;
                        entry->data = (void *)(long)irq;
                        entry->read_proc = irq_affinity_read_proc;
                        entry->write_proc = irq_affinity_write_proc;
index 204ed7939e757222466c6e594fbb56a1b1eb46b3..307c6a632ef6baa7ff0cec46273293d4cc84afc6 100644 (file)
@@ -128,18 +128,13 @@ asmlinkage long sys_getitimer(int which, struct itimerval __user *value)
 /*
  * The timer is automagically restarted, when interval != 0
  */
-int it_real_fn(struct hrtimer *timer)
+enum hrtimer_restart it_real_fn(struct hrtimer *timer)
 {
        struct signal_struct *sig =
            container_of(timer, struct signal_struct, real_timer);
 
        send_group_sig_info(SIGALRM, SEND_SIG_PRIV, sig->tsk);
 
-       if (sig->it_real_incr.tv64 != 0) {
-               hrtimer_forward(timer, timer->base->softirq_time,
-                               sig->it_real_incr);
-               return HRTIMER_RESTART;
-       }
        return HRTIMER_NORESTART;
 }
 
@@ -231,11 +226,14 @@ again:
                        spin_unlock_irq(&tsk->sighand->siglock);
                        goto again;
                }
-               tsk->signal->it_real_incr =
-                       timeval_to_ktime(value->it_interval);
                expires = timeval_to_ktime(value->it_value);
-               if (expires.tv64 != 0)
-                       hrtimer_start(timer, expires, HRTIMER_REL);
+               if (expires.tv64 != 0) {
+                       tsk->signal->it_real_incr =
+                               timeval_to_ktime(value->it_interval);
+                       hrtimer_start(timer, expires, HRTIMER_MODE_REL);
+               } else
+                       tsk->signal->it_real_incr.tv64 = 0;
+
                spin_unlock_irq(&tsk->sighand->siglock);
                break;
        case ITIMER_VIRTUAL:
index 5d1d907378a299ad6c6aab16b15d55d1248f296e..cee419143fd47bb410b0cf80e7762a0f02ffbfce 100644 (file)
@@ -32,8 +32,8 @@
  * @gfp_mask: get_free_pages mask, passed to kmalloc()
  * @lock: the lock to be used to protect the fifo buffer
  *
- * Do NOT pass the kfifo to kfifo_free() after use ! Simply free the
- * struct kfifo with kfree().
+ * Do NOT pass the kfifo to kfifo_free() after use! Simply free the
+ * &struct kfifo with kfree().
  */
 struct kfifo *kfifo_init(unsigned char *buffer, unsigned int size,
                         gfp_t gfp_mask, spinlock_t *lock)
@@ -108,7 +108,7 @@ EXPORT_SYMBOL(kfifo_free);
  * @buffer: the data to be added.
  * @len: the length of the data to be added.
  *
- * This function copies at most 'len' bytes from the 'buffer' into
+ * This function copies at most @len bytes from the @buffer into
  * the FIFO depending on the free space, and returns the number of
  * bytes copied.
  *
@@ -155,8 +155,8 @@ EXPORT_SYMBOL(__kfifo_put);
  * @buffer: where the data must be copied.
  * @len: the size of the destination buffer.
  *
- * This function copies at most 'len' bytes from the FIFO into the
- * 'buffer' and returns the number of copied bytes.
+ * This function copies at most @len bytes from the FIFO into the
+ * @buffer and returns the number of copied bytes.
  *
  * Note that with only one concurrent reader and one concurrent
  * writer, you don't need extra locking to use these functions.
index 3a7379aa31ca6b0a92bec377a23e5c9debed72db..796276141e51902bd466b1f5b81b5220c109ca4a 100644 (file)
@@ -217,7 +217,10 @@ static int wait_for_helper(void *data)
                        sub_info->retval = ret;
        }
 
-       complete(sub_info->complete);
+       if (sub_info->wait < 0)
+               kfree(sub_info);
+       else
+               complete(sub_info->complete);
        return 0;
 }
 
@@ -239,6 +242,9 @@ static void __call_usermodehelper(struct work_struct *work)
                pid = kernel_thread(____call_usermodehelper, sub_info,
                                    CLONE_VFORK | SIGCHLD);
 
+       if (wait < 0)
+               return;
+
        if (pid < 0) {
                sub_info->retval = pid;
                complete(sub_info->complete);
@@ -253,6 +259,9 @@ static void __call_usermodehelper(struct work_struct *work)
  * @envp: null-terminated environment list
  * @session_keyring: session keyring for process (NULL for an empty keyring)
  * @wait: wait for the application to finish and return status.
+ *        when -1 don't wait at all, but you get no useful error back when
+ *        the program couldn't be exec'ed. This makes it safe to call
+ *        from interrupt context.
  *
  * Runs a user-space application.  The application is started
  * asynchronously if wait is not set, and runs as a child of keventd.
@@ -265,17 +274,8 @@ int call_usermodehelper_keys(char *path, char **argv, char **envp,
                             struct key *session_keyring, int wait)
 {
        DECLARE_COMPLETION_ONSTACK(done);
-       struct subprocess_info sub_info = {
-               .work           = __WORK_INITIALIZER(sub_info.work,
-                                                    __call_usermodehelper),
-               .complete       = &done,
-               .path           = path,
-               .argv           = argv,
-               .envp           = envp,
-               .ring           = session_keyring,
-               .wait           = wait,
-               .retval         = 0,
-       };
+       struct subprocess_info *sub_info;
+       int retval;
 
        if (!khelper_wq)
                return -EBUSY;
@@ -283,9 +283,25 @@ int call_usermodehelper_keys(char *path, char **argv, char **envp,
        if (path[0] == '\0')
                return 0;
 
-       queue_work(khelper_wq, &sub_info.work);
+       sub_info = kzalloc(sizeof(struct subprocess_info),  GFP_ATOMIC);
+       if (!sub_info)
+               return -ENOMEM;
+
+       INIT_WORK(&sub_info->work, __call_usermodehelper);
+       sub_info->complete = &done;
+       sub_info->path = path;
+       sub_info->argv = argv;
+       sub_info->envp = envp;
+       sub_info->ring = session_keyring;
+       sub_info->wait = wait;
+
+       queue_work(khelper_wq, &sub_info->work);
+       if (wait < 0) /* task has freed sub_info */
+               return 0;
        wait_for_completion(&done);
-       return sub_info.retval;
+       retval = sub_info->retval;
+       kfree(sub_info);
+       return retval;
 }
 EXPORT_SYMBOL(call_usermodehelper_keys);
 
index 1db8c72d0d380c637b18e3951df45f32291ceeda..87c50ccd1d4e93850373d23c8d96b46a93cc0688 100644 (file)
@@ -50,7 +50,7 @@ static struct kthread_stop_info kthread_stop_info;
 /**
  * kthread_should_stop - should this kthread return now?
  *
- * When someone calls kthread_stop on your kthread, it will be woken
+ * When someone calls kthread_stop() on your kthread, it will be woken
  * and this will return true.  You should then return, and your return
  * value will be passed through to kthread_stop().
  */
@@ -143,7 +143,7 @@ static void keventd_create_kthread(struct work_struct *work)
  * it.  See also kthread_run(), kthread_create_on_cpu().
  *
  * When woken, the thread will run @threadfn() with @data as its
- * argument. @threadfn can either call do_exit() directly if it is a
+ * argument. @threadfn() can either call do_exit() directly if it is a
  * standalone thread for which noone will call kthread_stop(), or
  * return when 'kthread_should_stop()' is true (which means
  * kthread_stop() has been called).  The return value should be zero
@@ -192,7 +192,7 @@ EXPORT_SYMBOL(kthread_create);
  *
  * Description: This function is equivalent to set_cpus_allowed(),
  * except that @cpu doesn't need to be online, and the thread must be
- * stopped (i.e., just returned from kthread_create().
+ * stopped (i.e., just returned from kthread_create()).
  */
 void kthread_bind(struct task_struct *k, unsigned int cpu)
 {
index 509efd49540f9beb09ddf347725690f939e09aa2..592c576d77a7c325cb4edfa4d496f244764b5ae5 100644 (file)
@@ -70,6 +70,9 @@ static int graph_lock(void)
 
 static inline int graph_unlock(void)
 {
+       if (debug_locks && !__raw_spin_is_locked(&lockdep_lock))
+               return DEBUG_LOCKS_WARN_ON(1);
+
        __raw_spin_unlock(&lockdep_lock);
        return 0;
 }
@@ -487,7 +490,7 @@ static void print_lock_dependencies(struct lock_class *class, int depth)
  * Add a new dependency to the head of the list:
  */
 static int add_lock_to_list(struct lock_class *class, struct lock_class *this,
-                           struct list_head *head, unsigned long ip)
+                           struct list_head *head, unsigned long ip, int distance)
 {
        struct lock_list *entry;
        /*
@@ -499,6 +502,7 @@ static int add_lock_to_list(struct lock_class *class, struct lock_class *this,
                return 0;
 
        entry->class = this;
+       entry->distance = distance;
        if (!save_trace(&entry->trace))
                return 0;
 
@@ -712,6 +716,9 @@ find_usage_backwards(struct lock_class *source, unsigned int depth)
        struct lock_list *entry;
        int ret;
 
+       if (!__raw_spin_is_locked(&lockdep_lock))
+               return DEBUG_LOCKS_WARN_ON(1);
+
        if (depth > max_recursion_depth)
                max_recursion_depth = depth;
        if (depth >= RECURSION_LIMIT)
@@ -900,7 +907,7 @@ check_deadlock(struct task_struct *curr, struct held_lock *next,
  */
 static int
 check_prev_add(struct task_struct *curr, struct held_lock *prev,
-              struct held_lock *next)
+              struct held_lock *next, int distance)
 {
        struct lock_list *entry;
        int ret;
@@ -978,8 +985,11 @@ check_prev_add(struct task_struct *curr, struct held_lock *prev,
         *  L2 added to its dependency list, due to the first chain.)
         */
        list_for_each_entry(entry, &prev->class->locks_after, entry) {
-               if (entry->class == next->class)
+               if (entry->class == next->class) {
+                       if (distance == 1)
+                               entry->distance = 1;
                        return 2;
+               }
        }
 
        /*
@@ -987,12 +997,13 @@ check_prev_add(struct task_struct *curr, struct held_lock *prev,
         * to the previous lock's dependency list:
         */
        ret = add_lock_to_list(prev->class, next->class,
-                              &prev->class->locks_after, next->acquire_ip);
+                              &prev->class->locks_after, next->acquire_ip, distance);
+
        if (!ret)
                return 0;
 
        ret = add_lock_to_list(next->class, prev->class,
-                              &next->class->locks_before, next->acquire_ip);
+                              &next->class->locks_before, next->acquire_ip, distance);
        if (!ret)
                return 0;
 
@@ -1040,13 +1051,14 @@ check_prevs_add(struct task_struct *curr, struct held_lock *next)
                goto out_bug;
 
        for (;;) {
+               int distance = curr->lockdep_depth - depth + 1;
                hlock = curr->held_locks + depth-1;
                /*
                 * Only non-recursive-read entries get new dependencies
                 * added:
                 */
                if (hlock->read != 2) {
-                       if (!check_prev_add(curr, hlock, next))
+                       if (!check_prev_add(curr, hlock, next, distance))
                                return 0;
                        /*
                         * Stop after the first non-trylock entry,
@@ -1293,7 +1305,8 @@ out_unlock_set:
        if (!subclass || force)
                lock->class_cache = class;
 
-       DEBUG_LOCKS_WARN_ON(class->subclass != subclass);
+       if (DEBUG_LOCKS_WARN_ON(class->subclass != subclass))
+               return NULL;
 
        return class;
 }
@@ -1308,7 +1321,8 @@ static inline int lookup_chain_cache(u64 chain_key, struct lock_class *class)
        struct list_head *hash_head = chainhashentry(chain_key);
        struct lock_chain *chain;
 
-       DEBUG_LOCKS_WARN_ON(!irqs_disabled());
+       if (DEBUG_LOCKS_WARN_ON(!irqs_disabled()))
+               return 0;
        /*
         * We can walk it lock-free, because entries only get added
         * to the hash:
@@ -1394,7 +1408,9 @@ static void check_chain_key(struct task_struct *curr)
                        return;
                }
                id = hlock->class - lock_classes;
-               DEBUG_LOCKS_WARN_ON(id >= MAX_LOCKDEP_KEYS);
+               if (DEBUG_LOCKS_WARN_ON(id >= MAX_LOCKDEP_KEYS))
+                       return;
+
                if (prev_hlock && (prev_hlock->irq_context !=
                                                        hlock->irq_context))
                        chain_key = 0;
@@ -2205,7 +2221,11 @@ out_calc_hash:
                        if (!check_prevs_add(curr, hlock))
                                return 0;
                graph_unlock();
-       }
+       } else
+               /* after lookup_chain_cache(): */
+               if (unlikely(!debug_locks))
+                       return 0;
+
        curr->lockdep_depth++;
        check_chain_key(curr);
        if (unlikely(curr->lockdep_depth >= MAX_LOCK_DEPTH)) {
@@ -2214,6 +2234,7 @@ out_calc_hash:
                printk("turning off the locking correctness validator.\n");
                return 0;
        }
+
        if (unlikely(curr->lockdep_depth > max_lockdep_depth))
                max_lockdep_depth = curr->lockdep_depth;
 
@@ -2764,4 +2785,3 @@ void debug_show_held_locks(struct task_struct *task)
 }
 
 EXPORT_SYMBOL_GPL(debug_show_held_locks);
-
index b554b40a4aa6ca1872f7225a47bc2829300e24b5..58f35e586ee3b508e693e3cd010a69982ae76b5f 100644 (file)
@@ -10,7 +10,6 @@
  * Code for /proc/lockdep and /proc/lockdep_stats:
  *
  */
-#include <linux/sched.h>
 #include <linux/module.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
@@ -77,12 +76,29 @@ static unsigned long count_backward_deps(struct lock_class *class)
        return ret;
 }
 
+static void print_name(struct seq_file *m, struct lock_class *class)
+{
+       char str[128];
+       const char *name = class->name;
+
+       if (!name) {
+               name = __get_key_name(class->key, str);
+               seq_printf(m, "%s", name);
+       } else{
+               seq_printf(m, "%s", name);
+               if (class->name_version > 1)
+                       seq_printf(m, "#%d", class->name_version);
+               if (class->subclass)
+                       seq_printf(m, "/%d", class->subclass);
+       }
+}
+
 static int l_show(struct seq_file *m, void *v)
 {
        unsigned long nr_forward_deps, nr_backward_deps;
        struct lock_class *class = m->private;
-       char str[128], c1, c2, c3, c4;
-       const char *name;
+       struct lock_list *entry;
+       char c1, c2, c3, c4;
 
        seq_printf(m, "%p", class->key);
 #ifdef CONFIG_DEBUG_LOCKDEP
@@ -97,16 +113,16 @@ static int l_show(struct seq_file *m, void *v)
        get_usage_chars(class, &c1, &c2, &c3, &c4);
        seq_printf(m, " %c%c%c%c", c1, c2, c3, c4);
 
-       name = class->name;
-       if (!name) {
-               name = __get_key_name(class->key, str);
-               seq_printf(m, ": %s", name);
-       } else{
-               seq_printf(m, ": %s", name);
-               if (class->name_version > 1)
-                       seq_printf(m, "#%d", class->name_version);
-               if (class->subclass)
-                       seq_printf(m, "/%d", class->subclass);
+       seq_printf(m, ": ");
+       print_name(m, class);
+       seq_puts(m, "\n");
+
+       list_for_each_entry(entry, &class->locks_after, entry) {
+               if (entry->distance == 1) {
+                       seq_printf(m, " -> [%p] ", entry->class);
+                       print_name(m, entry->class);
+                       seq_puts(m, "\n");
+               }
        }
        seq_puts(m, "\n");
 
@@ -227,7 +243,7 @@ static int lockdep_stats_show(struct seq_file *m, void *v)
 
                sum_forward_deps += count_forward_deps(class);
        }
-#ifdef CONFIG_LOCKDEP_DEBUG
+#ifdef CONFIG_DEBUG_LOCKDEP
        DEBUG_LOCKS_WARN_ON(debug_atomic_read(&nr_unused_locks) != nr_unused);
 #endif
        seq_printf(m, " lock-classes:                  %11lu [max: %lu]\n",
index 841539d72c55cdbb674b7a91786847c37ec5acdb..d17436cdea1b39a7cb0efc96801bf0655dcb8fb5 100644 (file)
@@ -13,7 +13,6 @@
  *  Released under the General Public License (GPL).
  */
 #include <linux/mutex.h>
-#include <linux/sched.h>
 #include <linux/delay.h>
 #include <linux/module.h>
 #include <linux/poison.h>
index 525e365f72390bb3fb4601c0be4c4bd81214eceb..623d1828259a9a4f1b9f7b6776bf0ea3b339c75d 100644 (file)
@@ -150,6 +150,7 @@ EXPORT_SYMBOL(panic);
  *  'R' - User forced a module unload.
  *  'M' - Machine had a machine check experience.
  *  'B' - System has hit bad_page.
+ *  'U' - Userspace-defined naughtiness.
  *
  *     The string is overwritten by the next call to print_taint().
  */
@@ -158,13 +159,14 @@ const char *print_tainted(void)
 {
        static char buf[20];
        if (tainted) {
-               snprintf(buf, sizeof(buf), "Tainted: %c%c%c%c%c%c",
+               snprintf(buf, sizeof(buf), "Tainted: %c%c%c%c%c%c%c",
                        tainted & TAINT_PROPRIETARY_MODULE ? 'P' : 'G',
                        tainted & TAINT_FORCED_MODULE ? 'F' : ' ',
                        tainted & TAINT_UNSAFE_SMP ? 'S' : ' ',
                        tainted & TAINT_FORCED_RMMOD ? 'R' : ' ',
                        tainted & TAINT_MACHINE_CHECK ? 'M' : ' ',
-                       tainted & TAINT_BAD_PAGE ? 'B' : ' ');
+                       tainted & TAINT_BAD_PAGE ? 'B' : ' ',
+                       tainted & TAINT_USER ? 'U' : ' ');
        }
        else
                snprintf(buf, sizeof(buf), "Not tainted");
index 7c3e1e6dfb5b5eef84f61f6259e764703846d9fd..657f77697415b2879c07b85e759e8d19b0880b93 100644 (file)
@@ -304,7 +304,7 @@ int posix_cpu_clock_get(const clockid_t which_clock, struct timespec *tp)
                 * should be able to see it.
                 */
                struct task_struct *p;
-               read_lock(&tasklist_lock);
+               rcu_read_lock();
                p = find_task_by_pid(pid);
                if (p) {
                        if (CPUCLOCK_PERTHREAD(which_clock)) {
@@ -312,12 +312,17 @@ int posix_cpu_clock_get(const clockid_t which_clock, struct timespec *tp)
                                        error = cpu_clock_sample(which_clock,
                                                                 p, &rtn);
                                }
-                       } else if (p->tgid == pid && p->signal) {
-                               error = cpu_clock_sample_group(which_clock,
-                                                              p, &rtn);
+                       } else {
+                               read_lock(&tasklist_lock);
+                               if (p->tgid == pid && p->signal) {
+                                       error =
+                                           cpu_clock_sample_group(which_clock,
+                                                                  p, &rtn);
+                               }
+                               read_unlock(&tasklist_lock);
                        }
                }
-               read_unlock(&tasklist_lock);
+               rcu_read_unlock();
        }
 
        if (error)
index 5fe87de10ff07ae1afbecc8e076360c4f6005424..44318ca71978d9afae52c6149153d323e08a06b5 100644 (file)
@@ -145,7 +145,7 @@ static int common_timer_set(struct k_itimer *, int,
                            struct itimerspec *, struct itimerspec *);
 static int common_timer_del(struct k_itimer *timer);
 
-static int posix_timer_fn(struct hrtimer *data);
+static enum hrtimer_restart posix_timer_fn(struct hrtimer *data);
 
 static struct k_itimer *lock_timer(timer_t timer_id, unsigned long *flags);
 
@@ -334,12 +334,12 @@ EXPORT_SYMBOL_GPL(posix_timer_event);
 
  * This code is for CLOCK_REALTIME* and CLOCK_MONOTONIC* timers.
  */
-static int posix_timer_fn(struct hrtimer *timer)
+static enum hrtimer_restart posix_timer_fn(struct hrtimer *timer)
 {
        struct k_itimer *timr;
        unsigned long flags;
        int si_private = 0;
-       int ret = HRTIMER_NORESTART;
+       enum hrtimer_restart ret = HRTIMER_NORESTART;
 
        timr = container_of(timer, struct k_itimer, it.real.timer);
        spin_lock_irqsave(&timr->it_lock, flags);
@@ -356,7 +356,7 @@ static int posix_timer_fn(struct hrtimer *timer)
                if (timr->it.real.interval.tv64 != 0) {
                        timr->it_overrun +=
                                hrtimer_forward(timer,
-                                               timer->base->softirq_time,
+                                               hrtimer_cb_get_time(timer),
                                                timr->it.real.interval);
                        ret = HRTIMER_RESTART;
                        ++timr->it_requeue_pending;
@@ -399,10 +399,9 @@ EXPORT_SYMBOL_GPL(register_posix_clock);
 static struct k_itimer * alloc_posix_timer(void)
 {
        struct k_itimer *tmr;
-       tmr = kmem_cache_alloc(posix_timers_cache, GFP_KERNEL);
+       tmr = kmem_cache_zalloc(posix_timers_cache, GFP_KERNEL);
        if (!tmr)
                return tmr;
-       memset(tmr, 0, sizeof (struct k_itimer));
        if (unlikely(!(tmr->sigq = sigqueue_alloc()))) {
                kmem_cache_free(posix_timers_cache, tmr);
                tmr = NULL;
@@ -723,7 +722,7 @@ common_timer_set(struct k_itimer *timr, int flags,
        if (!new_setting->it_value.tv_sec && !new_setting->it_value.tv_nsec)
                return 0;
 
-       mode = flags & TIMER_ABSTIME ? HRTIMER_ABS : HRTIMER_REL;
+       mode = flags & TIMER_ABSTIME ? HRTIMER_MODE_ABS : HRTIMER_MODE_REL;
        hrtimer_init(&timr->it.real.timer, timr->it_clock, mode);
        timr->it.real.timer.function = posix_timer_fn;
 
@@ -735,7 +734,7 @@ common_timer_set(struct k_itimer *timr, int flags,
        /* SIGEV_NONE timers are not queued ! See common_timer_get */
        if (((timr->it_sigev_notify & ~SIGEV_THREAD_ID) == SIGEV_NONE)) {
                /* Setup correct expiry time for relative timers */
-               if (mode == HRTIMER_REL)
+               if (mode == HRTIMER_MODE_REL)
                        timer->expires = ktime_add(timer->expires,
                                                   timer->base->get_time());
                return 0;
@@ -951,7 +950,8 @@ static int common_nsleep(const clockid_t which_clock, int flags,
                         struct timespec *tsave, struct timespec __user *rmtp)
 {
        return hrtimer_nanosleep(tsave, rmtp, flags & TIMER_ABSTIME ?
-                                HRTIMER_ABS : HRTIMER_REL, which_clock);
+                                HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
+                                which_clock);
 }
 
 asmlinkage long
index 88fc5d7ac737402c18db0306049b5873effeed55..406b20adb27ad820a455b93a836ab636cbf65436 100644 (file)
@@ -87,52 +87,24 @@ static inline void platform_finish(void)
        }
 }
 
+static void unprepare_processes(void)
+{
+       thaw_processes();
+       pm_restore_console();
+}
+
 static int prepare_processes(void)
 {
        int error = 0;
 
        pm_prepare_console();
-
-       error = disable_nonboot_cpus();
-       if (error)
-               goto enable_cpus;
-
        if (freeze_processes()) {
                error = -EBUSY;
-               goto thaw;
+               unprepare_processes();
        }
-
-       if (pm_disk_mode == PM_DISK_TESTPROC) {
-               printk("swsusp debug: Waiting for 5 seconds.\n");
-               mdelay(5000);
-               goto thaw;
-       }
-
-       error = platform_prepare();
-       if (error)
-               goto thaw;
-
-       /* Free memory before shutting down devices. */
-       if (!(error = swsusp_shrink_memory()))
-               return 0;
-
-       platform_finish();
- thaw:
-       thaw_processes();
- enable_cpus:
-       enable_nonboot_cpus();
-       pm_restore_console();
        return error;
 }
 
-static void unprepare_processes(void)
-{
-       platform_finish();
-       thaw_processes();
-       enable_nonboot_cpus();
-       pm_restore_console();
-}
-
 /**
  *     pm_suspend_disk - The granpappy of hibernation power management.
  *
@@ -150,29 +122,45 @@ int pm_suspend_disk(void)
        if (error)
                return error;
 
-       if (pm_disk_mode == PM_DISK_TESTPROC)
-               return 0;
+       if (pm_disk_mode == PM_DISK_TESTPROC) {
+               printk("swsusp debug: Waiting for 5 seconds.\n");
+               mdelay(5000);
+               goto Thaw;
+       }
+       /* Free memory before shutting down devices. */
+       error = swsusp_shrink_memory();
+       if (error)
+               goto Thaw;
+
+       error = platform_prepare();
+       if (error)
+               goto Thaw;
 
        suspend_console();
        error = device_suspend(PMSG_FREEZE);
        if (error) {
-               resume_console();
-               printk("Some devices failed to suspend\n");
-               goto Thaw;
+               printk(KERN_ERR "PM: Some devices failed to suspend\n");
+               goto Resume_devices;
        }
+       error = disable_nonboot_cpus();
+       if (error)
+               goto Enable_cpus;
 
        if (pm_disk_mode == PM_DISK_TEST) {
                printk("swsusp debug: Waiting for 5 seconds.\n");
                mdelay(5000);
-               goto Done;
+               goto Enable_cpus;
        }
 
        pr_debug("PM: snapshotting memory.\n");
        in_suspend = 1;
-       if ((error = swsusp_suspend()))
-               goto Done;
+       error = swsusp_suspend();
+       if (error)
+               goto Enable_cpus;
 
        if (in_suspend) {
+               enable_nonboot_cpus();
+               platform_finish();
                device_resume();
                resume_console();
                pr_debug("PM: writing image.\n");
@@ -188,7 +176,10 @@ int pm_suspend_disk(void)
        }
 
        swsusp_free();
- Done:
+ Enable_cpus:
+       enable_nonboot_cpus();
+ Resume_devices:
+       platform_finish();
        device_resume();
        resume_console();
  Thaw:
@@ -237,19 +228,28 @@ static int software_resume(void)
 
        pr_debug("PM: Checking swsusp image.\n");
 
-       if ((error = swsusp_check()))
+       error = swsusp_check();
+       if (error)
                goto Done;
 
        pr_debug("PM: Preparing processes for restore.\n");
 
-       if ((error = prepare_processes())) {
+       error = prepare_processes();
+       if (error) {
                swsusp_close();
                goto Done;
        }
 
+       error = platform_prepare();
+       if (error) {
+               swsusp_free();
+               goto Thaw;
+       }
+
        pr_debug("PM: Reading swsusp image.\n");
 
-       if ((error = swsusp_read())) {
+       error = swsusp_read();
+       if (error) {
                swsusp_free();
                goto Thaw;
        }
@@ -257,21 +257,22 @@ static int software_resume(void)
        pr_debug("PM: Preparing devices for restore.\n");
 
        suspend_console();
-       if ((error = device_suspend(PMSG_PRETHAW))) {
-               resume_console();
-               printk("Some devices failed to suspend\n");
-               swsusp_free();
-               goto Thaw;
-       }
+       error = device_suspend(PMSG_PRETHAW);
+       if (error)
+               goto Free;
 
-       mb();
+       error = disable_nonboot_cpus();
+       if (!error)
+               swsusp_resume();
 
-       pr_debug("PM: Restoring saved image.\n");
-       swsusp_resume();
-       pr_debug("PM: Restore failed, recovering.n");
+       enable_nonboot_cpus();
+ Free:
+       swsusp_free();
+       platform_finish();
        device_resume();
        resume_console();
  Thaw:
+       printk(KERN_ERR "PM: Restore failed, recovering.\n");
        unprepare_processes();
  Done:
        /* For success case, the suspend path will release the lock */
index ff3a6182f5f0df3fb479cbd56092dd0ee8e1ff2e..e1c4131204698fd891af0b8046406ae4fd0ff76a 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/cpu.h>
 #include <linux/resume-trace.h>
 #include <linux/freezer.h>
+#include <linux/vmstat.h>
 
 #include "power.h"
 
@@ -43,6 +44,11 @@ void pm_set_ops(struct pm_ops * ops)
        mutex_unlock(&pm_mutex);
 }
 
+static inline void pm_finish(suspend_state_t state)
+{
+       if (pm_ops->finish)
+               pm_ops->finish(state);
+}
 
 /**
  *     suspend_prepare - Do prep work before entering low-power state.
@@ -63,16 +69,13 @@ static int suspend_prepare(suspend_state_t state)
 
        pm_prepare_console();
 
-       error = disable_nonboot_cpus();
-       if (error)
-               goto Enable_cpu;
-
        if (freeze_processes()) {
                error = -EAGAIN;
                goto Thaw;
        }
 
-       if ((free_pages = nr_free_pages()) < FREE_PAGE_NUMBER) {
+       if ((free_pages = global_page_state(NR_FREE_PAGES))
+                       < FREE_PAGE_NUMBER) {
                pr_debug("PM: free some memory\n");
                shrink_all_memory(FREE_PAGE_NUMBER - free_pages);
                if (nr_free_pages() < FREE_PAGE_NUMBER) {
@@ -88,18 +91,22 @@ static int suspend_prepare(suspend_state_t state)
        }
 
        suspend_console();
-       if ((error = device_suspend(PMSG_SUSPEND))) {
+       error = device_suspend(PMSG_SUSPEND);
+       if (error) {
                printk(KERN_ERR "Some devices failed to suspend\n");
-               goto Finish;
+               goto Resume_devices;
        }
-       return 0;
- Finish:
-       if (pm_ops->finish)
-               pm_ops->finish(state);
+       error = disable_nonboot_cpus();
+       if (!error)
+               return 0;
+
+       enable_nonboot_cpus();
+ Resume_devices:
+       pm_finish(state);
+       device_resume();
+       resume_console();
  Thaw:
        thaw_processes();
- Enable_cpu:
-       enable_nonboot_cpus();
        pm_restore_console();
        return error;
 }
@@ -134,12 +141,11 @@ int suspend_enter(suspend_state_t state)
 
 static void suspend_finish(suspend_state_t state)
 {
+       enable_nonboot_cpus();
+       pm_finish(state);
        device_resume();
        resume_console();
        thaw_processes();
-       enable_nonboot_cpus();
-       if (pm_ops && pm_ops->finish)
-               pm_ops->finish(state);
        pm_restore_console();
 }
 
index c024606221c4f9d6dd7ba35f3634f9f944fda23e..fc53ad06812843d346a777711b97a7f4698c76e3 100644 (file)
@@ -591,7 +591,7 @@ static unsigned int count_free_highmem_pages(void)
 
        for_each_zone(zone)
                if (populated_zone(zone) && is_highmem(zone))
-                       cnt += zone->free_pages;
+                       cnt += zone_page_state(zone, NR_FREE_PAGES);
 
        return cnt;
 }
@@ -869,7 +869,7 @@ static int enough_free_mem(unsigned int nr_pages, unsigned int nr_highmem)
        for_each_zone(zone) {
                meta += snapshot_additional_pages(zone);
                if (!is_highmem(zone))
-                       free += zone->free_pages;
+                       free += zone_page_state(zone, NR_FREE_PAGES);
        }
 
        nr_pages += count_pages_for_highmem(nr_highmem);
index 31aa0390c777d186652fe1b5dc3bfb4aafbaa338..7fb834397a0d5f97701f0e604b138cb473647011 100644 (file)
@@ -230,9 +230,10 @@ int swsusp_shrink_memory(void)
                for_each_zone (zone)
                        if (populated_zone(zone)) {
                                if (is_highmem(zone)) {
-                                       highmem_size -= zone->free_pages;
+                                       highmem_size -=
+                                       zone_page_state(zone, NR_FREE_PAGES);
                                } else {
-                                       tmp -= zone->free_pages;
+                                       tmp -= zone_page_state(zone, NR_FREE_PAGES);
                                        tmp += zone->lowmem_reserve[ZONE_NORMAL];
                                        tmp += snapshot_additional_pages(zone);
                                }
index f7b7a785a5c60a35e133daa036f7b9667ce3d718..dd09efe7df54352fac2a621c3cef33286dd4d63a 100644 (file)
@@ -37,6 +37,7 @@ static struct snapshot_data {
        int mode;
        char frozen;
        char ready;
+       char platform_suspend;
 } snapshot_state;
 
 static atomic_t device_available = ATOMIC_INIT(1);
@@ -66,6 +67,7 @@ static int snapshot_open(struct inode *inode, struct file *filp)
        data->bitmap = NULL;
        data->frozen = 0;
        data->ready = 0;
+       data->platform_suspend = 0;
 
        return 0;
 }
@@ -122,6 +124,92 @@ static ssize_t snapshot_write(struct file *filp, const char __user *buf,
        return res;
 }
 
+static inline int platform_prepare(void)
+{
+       int error = 0;
+
+       if (pm_ops && pm_ops->prepare)
+               error = pm_ops->prepare(PM_SUSPEND_DISK);
+
+       return error;
+}
+
+static inline void platform_finish(void)
+{
+       if (pm_ops && pm_ops->finish)
+               pm_ops->finish(PM_SUSPEND_DISK);
+}
+
+static inline int snapshot_suspend(int platform_suspend)
+{
+       int error;
+
+       mutex_lock(&pm_mutex);
+       /* Free memory before shutting down devices. */
+       error = swsusp_shrink_memory();
+       if (error)
+               goto Finish;
+
+       if (platform_suspend) {
+               error = platform_prepare();
+               if (error)
+                       goto Finish;
+       }
+       suspend_console();
+       error = device_suspend(PMSG_FREEZE);
+       if (error)
+               goto Resume_devices;
+
+       error = disable_nonboot_cpus();
+       if (!error) {
+               in_suspend = 1;
+               error = swsusp_suspend();
+       }
+       enable_nonboot_cpus();
+ Resume_devices:
+       if (platform_suspend)
+               platform_finish();
+
+       device_resume();
+       resume_console();
+ Finish:
+       mutex_unlock(&pm_mutex);
+       return error;
+}
+
+static inline int snapshot_restore(int platform_suspend)
+{
+       int error;
+
+       mutex_lock(&pm_mutex);
+       pm_prepare_console();
+       if (platform_suspend) {
+               error = platform_prepare();
+               if (error)
+                       goto Finish;
+       }
+       suspend_console();
+       error = device_suspend(PMSG_PRETHAW);
+       if (error)
+               goto Resume_devices;
+
+       error = disable_nonboot_cpus();
+       if (!error)
+               error = swsusp_resume();
+
+       enable_nonboot_cpus();
+ Resume_devices:
+       if (platform_suspend)
+               platform_finish();
+
+       device_resume();
+       resume_console();
+ Finish:
+       pm_restore_console();
+       mutex_unlock(&pm_mutex);
+       return error;
+}
+
 static int snapshot_ioctl(struct inode *inode, struct file *filp,
                           unsigned int cmd, unsigned long arg)
 {
@@ -145,14 +233,9 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
                if (data->frozen)
                        break;
                mutex_lock(&pm_mutex);
-               error = disable_nonboot_cpus();
-               if (!error) {
-                       error = freeze_processes();
-                       if (error) {
-                               thaw_processes();
-                               enable_nonboot_cpus();
-                               error = -EBUSY;
-                       }
+               if (freeze_processes()) {
+                       thaw_processes();
+                       error = -EBUSY;
                }
                mutex_unlock(&pm_mutex);
                if (!error)
@@ -164,7 +247,6 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
                        break;
                mutex_lock(&pm_mutex);
                thaw_processes();
-               enable_nonboot_cpus();
                mutex_unlock(&pm_mutex);
                data->frozen = 0;
                break;
@@ -174,20 +256,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
                        error = -EPERM;
                        break;
                }
-               mutex_lock(&pm_mutex);
-               /* Free memory before shutting down devices. */
-               error = swsusp_shrink_memory();
-               if (!error) {
-                       suspend_console();
-                       error = device_suspend(PMSG_FREEZE);
-                       if (!error) {
-                               in_suspend = 1;
-                               error = swsusp_suspend();
-                               device_resume();
-                       }
-                       resume_console();
-               }
-               mutex_unlock(&pm_mutex);
+               error = snapshot_suspend(data->platform_suspend);
                if (!error)
                        error = put_user(in_suspend, (unsigned int __user *)arg);
                if (!error)
@@ -201,17 +270,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
                        error = -EPERM;
                        break;
                }
-               mutex_lock(&pm_mutex);
-               pm_prepare_console();
-               suspend_console();
-               error = device_suspend(PMSG_PRETHAW);
-               if (!error) {
-                       error = swsusp_resume();
-                       device_resume();
-               }
-               resume_console();
-               pm_restore_console();
-               mutex_unlock(&pm_mutex);
+               error = snapshot_restore(data->platform_suspend);
                break;
 
        case SNAPSHOT_FREE:
@@ -282,6 +341,11 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
                break;
 
        case SNAPSHOT_S2RAM:
+               if (!pm_ops) {
+                       error = -ENOSYS;
+                       break;
+               }
+
                if (!data->frozen) {
                        error = -EPERM;
                        break;
@@ -319,28 +383,35 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
                break;
 
        case SNAPSHOT_PMOPS:
+               error = -EINVAL;
+
                switch (arg) {
 
                case PMOPS_PREPARE:
-                       if (pm_ops->prepare) {
-                               error = pm_ops->prepare(PM_SUSPEND_DISK);
+                       if (pm_ops && pm_ops->enter) {
+                               data->platform_suspend = 1;
+                               error = 0;
+                       } else {
+                               error = -ENOSYS;
                        }
                        break;
 
                case PMOPS_ENTER:
-                       kernel_shutdown_prepare(SYSTEM_SUSPEND_DISK);
-                       error = pm_ops->enter(PM_SUSPEND_DISK);
+                       if (data->platform_suspend) {
+                               kernel_shutdown_prepare(SYSTEM_SUSPEND_DISK);
+                               error = pm_ops->enter(PM_SUSPEND_DISK);
+                               error = 0;
+                       }
                        break;
 
                case PMOPS_FINISH:
-                       if (pm_ops && pm_ops->finish) {
-                               pm_ops->finish(PM_SUSPEND_DISK);
-                       }
+                       if (data->platform_suspend)
+                               error = 0;
+
                        break;
 
                default:
                        printk(KERN_ERR "SNAPSHOT_PMOPS: invalid argument %ld\n", arg);
-                       error = -EINVAL;
 
                }
                break;
index c770e1a4e882289f66ae0e54451ba186f09c03d2..0c151877ff71ad117e2d751e34ce528606d7eea2 100644 (file)
@@ -483,7 +483,7 @@ static int have_callable_console(void)
  * printk - print a kernel message
  * @fmt: format string
  *
- * This is printk.  It can be called from any context.  We want it to work.
+ * 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
  * call the console drivers.  If we fail to get the semaphore we place the output
@@ -529,7 +529,7 @@ asmlinkage int vprintk(const char *fmt, va_list args)
                zap_locks();
 
        /* This stops the holder of console_sem just where we want him */
-       local_irq_save(flags);
+       raw_local_irq_save(flags);
        lockdep_off();
        spin_lock(&logbuf_lock);
        printk_cpu = smp_processor_id();
@@ -618,7 +618,7 @@ asmlinkage int vprintk(const char *fmt, va_list args)
                        up(&console_sem);
                }
                lockdep_on();
-               local_irq_restore(flags);
+               raw_local_irq_restore(flags);
        } else {
                /*
                 * Someone else owns the drivers.  We drop the spinlock, which
@@ -628,7 +628,7 @@ asmlinkage int vprintk(const char *fmt, va_list args)
                printk_cpu = UINT_MAX;
                spin_unlock(&logbuf_lock);
                lockdep_on();
-               local_irq_restore(flags);
+               raw_local_irq_restore(flags);
        }
 
        preempt_enable();
@@ -783,6 +783,12 @@ int is_console_locked(void)
        return console_locked;
 }
 
+void wake_up_klogd(void)
+{
+       if (!oops_in_progress && waitqueue_active(&log_wait))
+               wake_up_interruptible(&log_wait);
+}
+
 /**
  * release_console_sem - unlock the console system
  *
@@ -825,8 +831,8 @@ void release_console_sem(void)
        console_locked = 0;
        up(&console_sem);
        spin_unlock_irqrestore(&logbuf_lock, flags);
-       if (wake_klogd && !oops_in_progress && waitqueue_active(&log_wait))
-               wake_up_interruptible(&log_wait);
+       if (wake_klogd)
+               wake_up_klogd();
 }
 EXPORT_SYMBOL(release_console_sem);
 
index d6579d511069130980196be79005f2724a01b8d3..9bfadb248dd877b009e49710db79957f13188c5d 100644 (file)
@@ -449,7 +449,6 @@ void create_prof_cpu_mask(struct proc_dir_entry *root_irq_dir)
        /* create /proc/irq/prof_cpu_mask */
        if (!(entry = create_proc_entry("prof_cpu_mask", 0600, root_irq_dir)))
                return;
-       entry->nlink = 1;
        entry->data = (void *)&prof_cpu_mask;
        entry->read_proc = prof_cpu_mask_read_proc;
        entry->write_proc = prof_cpu_mask_write_proc;
index 284e2e8b4eed0e0d31ea1a5d5fb9f732f0a16d67..ef8a935710a27be3edc6c940f77878d2895d6434 100644 (file)
@@ -7,6 +7,8 @@
  * Copyright (C) 1999-2005 - Karim Yaghmour (karim@opersys.com)
  *
  * Moved to kernel/relay.c by Paul Mundt, 2006.
+ * November 2006 - CPU hotplug support by Mathieu Desnoyers
+ *     (mathieu.desnoyers@polymtl.ca)
  *
  * This file is released under the GPL.
  */
 #include <linux/relay.h>
 #include <linux/vmalloc.h>
 #include <linux/mm.h>
+#include <linux/cpu.h>
+
+/* list of open channels, for cpu hotplug */
+static DEFINE_MUTEX(relay_channels_mutex);
+static LIST_HEAD(relay_channels);
 
 /*
  * close() vm_op implementation for relay file mapping.
@@ -187,6 +194,7 @@ void relay_destroy_buf(struct rchan_buf *buf)
                        __free_page(buf->page_array[i]);
                kfree(buf->page_array);
        }
+       chan->buf[buf->cpu] = NULL;
        kfree(buf->padding);
        kfree(buf);
        kref_put(&chan->kref, relay_destroy_channel);
@@ -320,7 +328,7 @@ static void wakeup_readers(struct work_struct *work)
  *     @buf: the channel buffer
  *     @init: 1 if this is a first-time initialization
  *
- *     See relay_reset for description of effect.
+ *     See relay_reset() for description of effect.
  */
 static void __relay_reset(struct rchan_buf *buf, unsigned int init)
 {
@@ -356,57 +364,75 @@ static void __relay_reset(struct rchan_buf *buf, unsigned int init)
  *     and restarting the channel in its initial state.  The buffers
  *     are not freed, so any mappings are still in effect.
  *
- *     NOTE: Care should be taken that the channel isn't actually
+ *     NOTE. Care should be taken that the channel isn't actually
  *     being used by anything when this call is made.
  */
 void relay_reset(struct rchan *chan)
 {
        unsigned int i;
-       struct rchan_buf *prev = NULL;
 
        if (!chan)
                return;
 
-       for (i = 0; i < NR_CPUS; i++) {
-               if (!chan->buf[i] || chan->buf[i] == prev)
-                       break;
-               __relay_reset(chan->buf[i], 0);
-               prev = chan->buf[i];
+       if (chan->is_global && chan->buf[0]) {
+               __relay_reset(chan->buf[0], 0);
+               return;
        }
+
+       mutex_lock(&relay_channels_mutex);
+       for_each_online_cpu(i)
+               if (chan->buf[i])
+                       __relay_reset(chan->buf[i], 0);
+       mutex_unlock(&relay_channels_mutex);
 }
 EXPORT_SYMBOL_GPL(relay_reset);
 
 /*
  *     relay_open_buf - create a new relay channel buffer
  *
- *     Internal - used by relay_open().
+ *     used by relay_open() and CPU hotplug.
  */
-static struct rchan_buf *relay_open_buf(struct rchan *chan,
-                                       const char *filename,
-                                       struct dentry *parent,
-                                       int *is_global)
+static struct rchan_buf *relay_open_buf(struct rchan *chan, unsigned int cpu)
 {
-       struct rchan_buf *buf;
+       struct rchan_buf *buf = NULL;
        struct dentry *dentry;
+       char *tmpname;
 
-       if (*is_global)
+       if (chan->is_global)
                return chan->buf[0];
 
+       tmpname = kzalloc(NAME_MAX + 1, GFP_KERNEL);
+       if (!tmpname)
+               goto end;
+       snprintf(tmpname, NAME_MAX, "%s%d", chan->base_filename, cpu);
+
        buf = relay_create_buf(chan);
        if (!buf)
-               return NULL;
+               goto free_name;
+
+       buf->cpu = cpu;
+       __relay_reset(buf, 1);
 
        /* Create file in fs */
-       dentry = chan->cb->create_buf_file(filename, parent, S_IRUSR,
-                                          buf, is_global);
-       if (!dentry) {
-               relay_destroy_buf(buf);
-               return NULL;
-       }
+       dentry = chan->cb->create_buf_file(tmpname, chan->parent, S_IRUSR,
+                                          buf, &chan->is_global);
+       if (!dentry)
+               goto free_buf;
 
        buf->dentry = dentry;
-       __relay_reset(buf, 1);
 
+       if(chan->is_global) {
+               chan->buf[0] = buf;
+               buf->cpu = 0;
+       }
+
+       goto free_name;
+
+free_buf:
+       relay_destroy_buf(buf);
+free_name:
+       kfree(tmpname);
+end:
        return buf;
 }
 
@@ -447,6 +473,47 @@ static void setup_callbacks(struct rchan *chan,
        chan->cb = cb;
 }
 
+/**
+ *
+ *     relay_hotcpu_callback - CPU hotplug callback
+ *     @nb: notifier block
+ *     @action: hotplug action to take
+ *     @hcpu: CPU number
+ *
+ *     Returns the success/failure of the operation. (NOTIFY_OK, NOTIFY_BAD)
+ */
+static int __cpuinit relay_hotcpu_callback(struct notifier_block *nb,
+                               unsigned long action,
+                               void *hcpu)
+{
+       unsigned int hotcpu = (unsigned long)hcpu;
+       struct rchan *chan;
+
+       switch(action) {
+       case CPU_UP_PREPARE:
+               mutex_lock(&relay_channels_mutex);
+               list_for_each_entry(chan, &relay_channels, list) {
+                       if (chan->buf[hotcpu])
+                               continue;
+                       chan->buf[hotcpu] = relay_open_buf(chan, hotcpu);
+                       if(!chan->buf[hotcpu]) {
+                               printk(KERN_ERR
+                                       "relay_hotcpu_callback: cpu %d buffer "
+                                       "creation failed\n", hotcpu);
+                               mutex_unlock(&relay_channels_mutex);
+                               return NOTIFY_BAD;
+                       }
+               }
+               mutex_unlock(&relay_channels_mutex);
+               break;
+       case CPU_DEAD:
+               /* No need to flush the cpu : will be flushed upon
+                * final relay_flush() call. */
+               break;
+       }
+       return NOTIFY_OK;
+}
+
 /**
  *     relay_open - create a new relay channel
  *     @base_filename: base name of files to create
@@ -454,25 +521,24 @@ static void setup_callbacks(struct rchan *chan,
  *     @subbuf_size: size of sub-buffers
  *     @n_subbufs: number of sub-buffers
  *     @cb: client callback functions
+ *     @private_data: user-defined data
  *
  *     Returns channel pointer if successful, %NULL otherwise.
  *
  *     Creates a channel buffer for each cpu using the sizes and
  *     attributes specified.  The created channel buffer files
  *     will be named base_filename0...base_filenameN-1.  File
- *     permissions will be S_IRUSR.
+ *     permissions will be %S_IRUSR.
  */
 struct rchan *relay_open(const char *base_filename,
                         struct dentry *parent,
                         size_t subbuf_size,
                         size_t n_subbufs,
-                        struct rchan_callbacks *cb)
+                        struct rchan_callbacks *cb,
+                        void *private_data)
 {
        unsigned int i;
        struct rchan *chan;
-       char *tmpname;
-       int is_global = 0;
-
        if (!base_filename)
                return NULL;
 
@@ -487,38 +553,32 @@ struct rchan *relay_open(const char *base_filename,
        chan->n_subbufs = n_subbufs;
        chan->subbuf_size = subbuf_size;
        chan->alloc_size = FIX_SIZE(subbuf_size * n_subbufs);
+       chan->parent = parent;
+       chan->private_data = private_data;
+       strlcpy(chan->base_filename, base_filename, NAME_MAX);
        setup_callbacks(chan, cb);
        kref_init(&chan->kref);
 
-       tmpname = kmalloc(NAME_MAX + 1, GFP_KERNEL);
-       if (!tmpname)
-               goto free_chan;
-
+       mutex_lock(&relay_channels_mutex);
        for_each_online_cpu(i) {
-               sprintf(tmpname, "%s%d", base_filename, i);
-               chan->buf[i] = relay_open_buf(chan, tmpname, parent,
-                                             &is_global);
+               chan->buf[i] = relay_open_buf(chan, i);
                if (!chan->buf[i])
                        goto free_bufs;
-
-               chan->buf[i]->cpu = i;
        }
+       list_add(&chan->list, &relay_channels);
+       mutex_unlock(&relay_channels_mutex);
 
-       kfree(tmpname);
        return chan;
 
 free_bufs:
-       for (i = 0; i < NR_CPUS; i++) {
+       for_each_online_cpu(i) {
                if (!chan->buf[i])
                        break;
                relay_close_buf(chan->buf[i]);
-               if (is_global)
-                       break;
        }
-       kfree(tmpname);
 
-free_chan:
        kref_put(&chan->kref, relay_destroy_channel);
+       mutex_unlock(&relay_channels_mutex);
        return NULL;
 }
 EXPORT_SYMBOL_GPL(relay_open);
@@ -588,7 +648,7 @@ EXPORT_SYMBOL_GPL(relay_switch_subbuf);
  *     subbufs_consumed should be the number of sub-buffers newly consumed,
  *     not the total consumed.
  *
- *     NOTE: Kernel clients don't need to call this function if the channel
+ *     NOTE. Kernel clients don't need to call this function if the channel
  *     mode is 'overwrite'.
  */
 void relay_subbufs_consumed(struct rchan *chan,
@@ -619,24 +679,26 @@ EXPORT_SYMBOL_GPL(relay_subbufs_consumed);
 void relay_close(struct rchan *chan)
 {
        unsigned int i;
-       struct rchan_buf *prev = NULL;
 
        if (!chan)
                return;
 
-       for (i = 0; i < NR_CPUS; i++) {
-               if (!chan->buf[i] || chan->buf[i] == prev)
-                       break;
-               relay_close_buf(chan->buf[i]);
-               prev = chan->buf[i];
-       }
+       mutex_lock(&relay_channels_mutex);
+       if (chan->is_global && chan->buf[0])
+               relay_close_buf(chan->buf[0]);
+       else
+               for_each_possible_cpu(i)
+                       if (chan->buf[i])
+                               relay_close_buf(chan->buf[i]);
 
        if (chan->last_toobig)
                printk(KERN_WARNING "relay: one or more items not logged "
                       "[item size (%Zd) > sub-buffer size (%Zd)]\n",
                       chan->last_toobig, chan->subbuf_size);
 
+       list_del(&chan->list);
        kref_put(&chan->kref, relay_destroy_channel);
+       mutex_unlock(&relay_channels_mutex);
 }
 EXPORT_SYMBOL_GPL(relay_close);
 
@@ -649,17 +711,20 @@ EXPORT_SYMBOL_GPL(relay_close);
 void relay_flush(struct rchan *chan)
 {
        unsigned int i;
-       struct rchan_buf *prev = NULL;
 
        if (!chan)
                return;
 
-       for (i = 0; i < NR_CPUS; i++) {
-               if (!chan->buf[i] || chan->buf[i] == prev)
-                       break;
-               relay_switch_subbuf(chan->buf[i], 0);
-               prev = chan->buf[i];
+       if (chan->is_global && chan->buf[0]) {
+               relay_switch_subbuf(chan->buf[0], 0);
+               return;
        }
+
+       mutex_lock(&relay_channels_mutex);
+       for_each_possible_cpu(i)
+               if (chan->buf[i])
+                       relay_switch_subbuf(chan->buf[i], 0);
+       mutex_unlock(&relay_channels_mutex);
 }
 EXPORT_SYMBOL_GPL(relay_flush);
 
@@ -684,7 +749,7 @@ static int relay_file_open(struct inode *inode, struct file *filp)
  *     @filp: the file
  *     @vma: the vma describing what to map
  *
- *     Calls upon relay_mmap_buf to map the file into user space.
+ *     Calls upon relay_mmap_buf() to map the file into user space.
  */
 static int relay_file_mmap(struct file *filp, struct vm_area_struct *vma)
 {
@@ -826,7 +891,7 @@ static size_t relay_file_read_subbuf_avail(size_t read_pos,
  *     @read_pos: file read position
  *     @buf: relay channel buffer
  *
- *     If the read_pos is in the middle of padding, return the
+ *     If the @read_pos is in the middle of padding, return the
  *     position of the first actually available byte, otherwise
  *     return the original value.
  */
@@ -1022,3 +1087,12 @@ const struct file_operations relay_file_operations = {
        .sendfile       = relay_file_sendfile,
 };
 EXPORT_SYMBOL_GPL(relay_file_operations);
+
+static __init int relay_init(void)
+{
+
+       hotcpu_notifier(relay_hotcpu_callback, 0);
+       return 0;
+}
+
+module_init(relay_init);
index 7b9a497419d9501631e5a524582d6b812fb5e841..bdb55a33f9691e2f79765eeba502d075f71d067c 100644 (file)
@@ -8,7 +8,6 @@
  */
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/ioport.h>
 #include <linux/init.h>
@@ -17,6 +16,7 @@
 #include <linux/fs.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
+#include <linux/device.h>
 #include <asm/io.h>
 
 
@@ -617,6 +617,67 @@ void __release_region(struct resource *parent, resource_size_t start,
 }
 EXPORT_SYMBOL(__release_region);
 
+/*
+ * Managed region resource
+ */
+struct region_devres {
+       struct resource *parent;
+       resource_size_t start;
+       resource_size_t n;
+};
+
+static void devm_region_release(struct device *dev, void *res)
+{
+       struct region_devres *this = res;
+
+       __release_region(this->parent, this->start, this->n);
+}
+
+static int devm_region_match(struct device *dev, void *res, void *match_data)
+{
+       struct region_devres *this = res, *match = match_data;
+
+       return this->parent == match->parent &&
+               this->start == match->start && this->n == match->n;
+}
+
+struct resource * __devm_request_region(struct device *dev,
+                               struct resource *parent, resource_size_t start,
+                               resource_size_t n, const char *name)
+{
+       struct region_devres *dr = NULL;
+       struct resource *res;
+
+       dr = devres_alloc(devm_region_release, sizeof(struct region_devres),
+                         GFP_KERNEL);
+       if (!dr)
+               return NULL;
+
+       dr->parent = parent;
+       dr->start = start;
+       dr->n = n;
+
+       res = __request_region(parent, start, n, name);
+       if (res)
+               devres_add(dev, dr);
+       else
+               devres_free(dr);
+
+       return res;
+}
+EXPORT_SYMBOL(__devm_request_region);
+
+void __devm_release_region(struct device *dev, struct resource *parent,
+                          resource_size_t start, resource_size_t n)
+{
+       struct region_devres match_data = { parent, start, n };
+
+       __release_region(parent, start, n);
+       WARN_ON(devres_destroy(dev, devm_region_release, devm_region_match,
+                              &match_data));
+}
+EXPORT_SYMBOL(__devm_release_region);
+
 /*
  * Called from init/main.c to reserve IO ports.
  */
index 4ab17da46fd80de1690744f9022691923942cb70..180978cb2f7524b180863967be0391d32f47783d 100644 (file)
@@ -625,7 +625,7 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state,
        /* Setup the timer, when timeout != NULL */
        if (unlikely(timeout))
                hrtimer_start(&timeout->timer, timeout->timer.expires,
-                             HRTIMER_ABS);
+                             HRTIMER_MODE_ABS);
 
        for (;;) {
                /* Try to acquire the lock: */
index cca93cc0dd7d8ba7272b1ea4782e87c97bfe1a09..0dc757246d89b02c96593df44ff8d75acb93e711 100644 (file)
 
 #include <asm/unistd.h>
 
+/*
+ * Scheduler clock - returns current time in nanosec units.
+ * This is default implementation.
+ * Architectures and sub-architectures can override this.
+ */
+unsigned long long __attribute__((weak)) sched_clock(void)
+{
+       return (unsigned long long)jiffies * (1000000000 / HZ);
+}
+
 /*
  * Convert user-nice values [ -20 ... 0 ... 19 ]
  * to static priority [ MAX_RT_PRIO..MAX_PRIO-1 ],
@@ -1843,6 +1853,13 @@ context_switch(struct rq *rq, struct task_struct *prev,
        struct mm_struct *mm = next->mm;
        struct mm_struct *oldmm = prev->active_mm;
 
+       /*
+        * For paravirt, this is coupled with an exit in switch_to to
+        * combine the page table reload and the switch backend into
+        * one hypercall.
+        */
+       arch_enter_lazy_cpu_mode();
+
        if (!mm) {
                next->active_mm = oldmm;
                atomic_inc(&oldmm->mm_count);
@@ -2887,14 +2904,16 @@ static void active_load_balance(struct rq *busiest_rq, int busiest_cpu)
 static void update_load(struct rq *this_rq)
 {
        unsigned long this_load;
-       int i, scale;
+       unsigned int i, scale;
 
        this_load = this_rq->raw_weighted_load;
 
        /* Update our load: */
-       for (i = 0, scale = 1; i < 3; i++, scale <<= 1) {
+       for (i = 0, scale = 1; i < 3; i++, scale += scale) {
                unsigned long old_load, new_load;
 
+               /* scale is effectively 1 << i now, and >> i divides by scale */
+
                old_load = this_rq->cpu_load[i];
                new_load = this_load;
                /*
@@ -2904,7 +2923,7 @@ static void update_load(struct rq *this_rq)
                 */
                if (new_load > old_load)
                        new_load += scale-1;
-               this_rq->cpu_load[i] = (old_load*(scale-1) + new_load) / scale;
+               this_rq->cpu_load[i] = (old_load*(scale-1) + new_load) >> i;
        }
 }
 
@@ -4193,13 +4212,12 @@ static void __setscheduler(struct task_struct *p, int policy, int prio)
 }
 
 /**
- * sched_setscheduler - change the scheduling policy and/or RT priority of
- * a thread.
+ * sched_setscheduler - change the scheduling policy and/or RT priority of a thread.
  * @p: the task in question.
  * @policy: new policy.
  * @param: structure containing the new RT priority.
  *
- * NOTE: the task may be already dead
+ * NOTE that the task may be already dead.
  */
 int sched_setscheduler(struct task_struct *p, int policy,
                       struct sched_param *param)
@@ -4567,7 +4585,7 @@ asmlinkage long sys_sched_getaffinity(pid_t pid, unsigned int len,
 /**
  * sys_sched_yield - yield the current processor to other threads.
  *
- * this function yields the current CPU by moving the calling thread
+ * This function yields the current CPU by moving the calling thread
  * to the expired array. If there are no other threads running on this
  * CPU then this function will return.
  */
@@ -4694,7 +4712,7 @@ EXPORT_SYMBOL(cond_resched_softirq);
 /**
  * yield - yield the current processor to other threads.
  *
- * this is a shortcut for kernel-space yielding - it marks the
+ * This is a shortcut for kernel-space yielding - it marks the
  * thread runnable and calls sys_sched_yield().
  */
 void __sched yield(void)
index 5630255d2e2a958f6e58eea4596a62b0dea3f91a..e2a7d4bf7d57aac779c29384da8c06ed034fad1f 100644 (file)
@@ -456,26 +456,50 @@ static int __dequeue_signal(struct sigpending *pending, sigset_t *mask,
 int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
 {
        int signr = __dequeue_signal(&tsk->pending, mask, info);
-       if (!signr)
+       if (!signr) {
                signr = __dequeue_signal(&tsk->signal->shared_pending,
                                         mask, info);
+               /*
+                * itimer signal ?
+                *
+                * itimers are process shared and we restart periodic
+                * itimers in the signal delivery path to prevent DoS
+                * attacks in the high resolution timer case. This is
+                * compliant with the old way of self restarting
+                * itimers, as the SIGALRM is a legacy signal and only
+                * queued once. Changing the restart behaviour to
+                * restart the timer in the signal dequeue path is
+                * reducing the timer noise on heavy loaded !highres
+                * systems too.
+                */
+               if (unlikely(signr == SIGALRM)) {
+                       struct hrtimer *tmr = &tsk->signal->real_timer;
+
+                       if (!hrtimer_is_queued(tmr) &&
+                           tsk->signal->it_real_incr.tv64 != 0) {
+                               hrtimer_forward(tmr, tmr->base->get_time(),
+                                               tsk->signal->it_real_incr);
+                               hrtimer_restart(tmr);
+                       }
+               }
+       }
        recalc_sigpending_tsk(tsk);
-       if (signr && unlikely(sig_kernel_stop(signr))) {
-               /*
-                * Set a marker that we have dequeued a stop signal.  Our
-                * caller might release the siglock and then the pending
-                * stop signal it is about to process is no longer in the
-                * pending bitmasks, but must still be cleared by a SIGCONT
-                * (and overruled by a SIGKILL).  So those cases clear this
-                * shared flag after we've set it.  Note that this flag may
-                * remain set after the signal we return is ignored or
-                * handled.  That doesn't matter because its only purpose
-                * is to alert stop-signal processing code when another
-                * processor has come along and cleared the flag.
-                */
-               if (!(tsk->signal->flags & SIGNAL_GROUP_EXIT))
-                       tsk->signal->flags |= SIGNAL_STOP_DEQUEUED;
-       }
+       if (signr && unlikely(sig_kernel_stop(signr))) {
+               /*
+                * Set a marker that we have dequeued a stop signal.  Our
+                * caller might release the siglock and then the pending
+                * stop signal it is about to process is no longer in the
+                * pending bitmasks, but must still be cleared by a SIGCONT
+                * (and overruled by a SIGKILL).  So those cases clear this
+                * shared flag after we've set it.  Note that this flag may
+                * remain set after the signal we return is ignored or
+                * handled.  That doesn't matter because its only purpose
+                * is to alert stop-signal processing code when another
+                * processor has come along and cleared the flag.
+                */
+               if (!(tsk->signal->flags & SIGNAL_GROUP_EXIT))
+                       tsk->signal->flags |= SIGNAL_STOP_DEQUEUED;
+       }
        if ( signr &&
             ((info->si_code & __SI_MASK) == __SI_TIMER) &&
             info->si_sys_private){
@@ -1096,42 +1120,21 @@ int kill_pgrp_info(int sig, struct siginfo *info, struct pid *pgrp)
        return retval;
 }
 
-int __kill_pg_info(int sig, struct siginfo *info, pid_t pgrp)
-{
-       if (pgrp <= 0)
-               return -EINVAL;
-
-       return __kill_pgrp_info(sig, info, find_pid(pgrp));
-}
-
-int
-kill_pg_info(int sig, struct siginfo *info, pid_t pgrp)
-{
-       int retval;
-
-       read_lock(&tasklist_lock);
-       retval = __kill_pg_info(sig, info, pgrp);
-       read_unlock(&tasklist_lock);
-
-       return retval;
-}
-
 int kill_pid_info(int sig, struct siginfo *info, struct pid *pid)
 {
        int error;
-       int acquired_tasklist_lock = 0;
        struct task_struct *p;
 
        rcu_read_lock();
-       if (unlikely(sig_needs_tasklist(sig))) {
+       if (unlikely(sig_needs_tasklist(sig)))
                read_lock(&tasklist_lock);
-               acquired_tasklist_lock = 1;
-       }
+
        p = pid_task(pid, PIDTYPE_PID);
        error = -ESRCH;
        if (p)
                error = group_send_sig_info(sig, info, p);
-       if (unlikely(acquired_tasklist_lock))
+
+       if (unlikely(sig_needs_tasklist(sig)))
                read_unlock(&tasklist_lock);
        rcu_read_unlock();
        return error;
@@ -1192,8 +1195,10 @@ EXPORT_SYMBOL_GPL(kill_pid_info_as_uid);
 
 static int kill_something_info(int sig, struct siginfo *info, int pid)
 {
+       int ret;
+       rcu_read_lock();
        if (!pid) {
-               return kill_pg_info(sig, info, process_group(current));
+               ret = kill_pgrp_info(sig, info, task_pgrp(current));
        } else if (pid == -1) {
                int retval = 0, count = 0;
                struct task_struct * p;
@@ -1208,12 +1213,14 @@ static int kill_something_info(int sig, struct siginfo *info, int pid)
                        }
                }
                read_unlock(&tasklist_lock);
-               return count ? retval : -ESRCH;
+               ret = count ? retval : -ESRCH;
        } else if (pid < 0) {
-               return kill_pg_info(sig, info, -pid);
+               ret = kill_pgrp_info(sig, info, find_pid(-pid));
        } else {
-               return kill_proc_info(sig, info, pid);
+               ret = kill_pid_info(sig, info, find_pid(pid));
        }
+       rcu_read_unlock();
+       return ret;
 }
 
 /*
@@ -1311,12 +1318,6 @@ int kill_pid(struct pid *pid, int sig, int priv)
 }
 EXPORT_SYMBOL(kill_pid);
 
-int
-kill_pg(pid_t pgrp, int sig, int priv)
-{
-       return kill_pg_info(sig, __si_special(priv), pgrp);
-}
-
 int
 kill_proc(pid_t pid, int sig, int priv)
 {
@@ -1906,7 +1907,7 @@ relock:
 
                                /* signals can be posted during this window */
 
-                               if (is_orphaned_pgrp(process_group(current)))
+                               if (is_current_pgrp_orphaned())
                                        goto relock;
 
                                spin_lock_irq(&current->sighand->siglock);
@@ -1956,7 +1957,6 @@ EXPORT_SYMBOL(recalc_sigpending);
 EXPORT_SYMBOL_GPL(dequeue_signal);
 EXPORT_SYMBOL(flush_signals);
 EXPORT_SYMBOL(force_sig);
-EXPORT_SYMBOL(kill_pg);
 EXPORT_SYMBOL(kill_proc);
 EXPORT_SYMBOL(ptrace_notify);
 EXPORT_SYMBOL(send_sig);
@@ -2283,7 +2283,7 @@ static int do_tkill(int tgid, int pid, int sig)
  *  @pid: the PID of the thread
  *  @sig: signal to be sent
  *
- *  This syscall also checks the tgid and returns -ESRCH even if the PID
+ *  This syscall also checks the @tgid and returns -ESRCH even if the PID
  *  exists but it's not belonging to the target process anymore. This
  *  method solves the problem of threads exiting and PIDs getting reused.
  */
index 918e52df090e88ee0a03096bee651e6c3a4d6dce..8b75008e2bd84bc91db15681896ab1a631091378 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/kthread.h>
 #include <linux/rcupdate.h>
 #include <linux/smp.h>
+#include <linux/tick.h>
 
 #include <asm/irq.h>
 /*
@@ -273,6 +274,18 @@ EXPORT_SYMBOL(do_softirq);
 
 #endif
 
+/*
+ * Enter an interrupt context.
+ */
+void irq_enter(void)
+{
+       __irq_enter();
+#ifdef CONFIG_NO_HZ
+       if (idle_cpu(smp_processor_id()))
+               tick_nohz_update_jiffies();
+#endif
+}
+
 #ifdef __ARCH_IRQ_EXIT_IRQS_DISABLED
 # define invoke_softirq()      __do_softirq()
 #else
@@ -289,6 +302,12 @@ void irq_exit(void)
        sub_preempt_count(IRQ_EXIT_OFFSET);
        if (!in_interrupt() && local_softirq_pending())
                invoke_softirq();
+
+#ifdef CONFIG_NO_HZ
+       /* Make sure that timer wheel updates are propagated */
+       if (!in_interrupt() && idle_cpu(smp_processor_id()) && !need_resched())
+               tick_nohz_stop_sched_tick();
+#endif
        preempt_enable_no_resched();
 }
 
index 6e2101dec0fcfc9e95c52a1ac53bc6898b976edf..123b165080e658034a09be1ea2478c6d0093daea 100644 (file)
@@ -215,7 +215,7 @@ EXPORT_SYMBOL_GPL(atomic_notifier_chain_unregister);
  *     This routine uses RCU to synchronize with changes to the chain.
  *
  *     If the return value of the notifier can be and'ed
- *     with %NOTIFY_STOP_MASK then atomic_notifier_call_chain
+ *     with %NOTIFY_STOP_MASK then atomic_notifier_call_chain()
  *     will return immediately, with the return value of
  *     the notifier function which halted execution.
  *     Otherwise the return value is the return value
@@ -313,7 +313,7 @@ EXPORT_SYMBOL_GPL(blocking_notifier_chain_unregister);
  *     run in a process context, so they are allowed to block.
  *
  *     If the return value of the notifier can be and'ed
- *     with %NOTIFY_STOP_MASK then blocking_notifier_call_chain
+ *     with %NOTIFY_STOP_MASK then blocking_notifier_call_chain()
  *     will return immediately, with the return value of
  *     the notifier function which halted execution.
  *     Otherwise the return value is the return value
@@ -393,7 +393,7 @@ EXPORT_SYMBOL_GPL(raw_notifier_chain_unregister);
  *     All locking must be provided by the caller.
  *
  *     If the return value of the notifier can be and'ed
- *     with %NOTIFY_STOP_MASK then raw_notifier_call_chain
+ *     with %NOTIFY_STOP_MASK then raw_notifier_call_chain()
  *     will return immediately, with the return value of
  *     the notifier function which halted execution.
  *     Otherwise the return value is the return value
@@ -487,7 +487,7 @@ EXPORT_SYMBOL_GPL(srcu_notifier_chain_unregister);
  *     run in a process context, so they are allowed to block.
  *
  *     If the return value of the notifier can be and'ed
- *     with %NOTIFY_STOP_MASK then srcu_notifier_call_chain
+ *     with %NOTIFY_STOP_MASK then srcu_notifier_call_chain()
  *     will return immediately, with the return value of
  *     the notifier function which halted execution.
  *     Otherwise the return value is the return value
@@ -538,7 +538,7 @@ EXPORT_SYMBOL_GPL(srcu_init_notifier_head);
  *     Registers a function with the list of functions
  *     to be called at reboot time.
  *
- *     Currently always returns zero, as blocking_notifier_chain_register
+ *     Currently always returns zero, as blocking_notifier_chain_register()
  *     always returns zero.
  */
  
@@ -596,6 +596,7 @@ asmlinkage long sys_setpriority(int which, int who, int niceval)
        struct task_struct *g, *p;
        struct user_struct *user;
        int error = -EINVAL;
+       struct pid *pgrp;
 
        if (which > 2 || which < 0)
                goto out;
@@ -610,18 +611,21 @@ asmlinkage long sys_setpriority(int which, int who, int niceval)
        read_lock(&tasklist_lock);
        switch (which) {
                case PRIO_PROCESS:
-                       if (!who)
-                               who = current->pid;
-                       p = find_task_by_pid(who);
+                       if (who)
+                               p = find_task_by_pid(who);
+                       else
+                               p = current;
                        if (p)
                                error = set_one_prio(p, niceval, error);
                        break;
                case PRIO_PGRP:
-                       if (!who)
-                               who = process_group(current);
-                       do_each_task_pid(who, PIDTYPE_PGID, p) {
+                       if (who)
+                               pgrp = find_pid(who);
+                       else
+                               pgrp = task_pgrp(current);
+                       do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
                                error = set_one_prio(p, niceval, error);
-                       } while_each_task_pid(who, PIDTYPE_PGID, p);
+                       } while_each_pid_task(pgrp, PIDTYPE_PGID, p);
                        break;
                case PRIO_USER:
                        user = current->user;
@@ -656,6 +660,7 @@ asmlinkage long sys_getpriority(int which, int who)
        struct task_struct *g, *p;
        struct user_struct *user;
        long niceval, retval = -ESRCH;
+       struct pid *pgrp;
 
        if (which > 2 || which < 0)
                return -EINVAL;
@@ -663,9 +668,10 @@ asmlinkage long sys_getpriority(int which, int who)
        read_lock(&tasklist_lock);
        switch (which) {
                case PRIO_PROCESS:
-                       if (!who)
-                               who = current->pid;
-                       p = find_task_by_pid(who);
+                       if (who)
+                               p = find_task_by_pid(who);
+                       else
+                               p = current;
                        if (p) {
                                niceval = 20 - task_nice(p);
                                if (niceval > retval)
@@ -673,13 +679,15 @@ asmlinkage long sys_getpriority(int which, int who)
                        }
                        break;
                case PRIO_PGRP:
-                       if (!who)
-                               who = process_group(current);
-                       do_each_task_pid(who, PIDTYPE_PGID, p) {
+                       if (who)
+                               pgrp = find_pid(who);
+                       else
+                               pgrp = task_pgrp(current);
+                       do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
                                niceval = 20 - task_nice(p);
                                if (niceval > retval)
                                        retval = niceval;
-                       } while_each_task_pid(who, PIDTYPE_PGID, p);
+                       } while_each_pid_task(pgrp, PIDTYPE_PGID, p);
                        break;
                case PRIO_USER:
                        user = current->user;
@@ -1388,7 +1396,7 @@ asmlinkage long sys_setpgid(pid_t pid, pid_t pgid)
 
        if (p->real_parent == group_leader) {
                err = -EPERM;
-               if (process_session(p) != process_session(group_leader))
+               if (task_session(p) != task_session(group_leader))
                        goto out;
                err = -EACCES;
                if (p->did_exec)
@@ -1407,7 +1415,7 @@ asmlinkage long sys_setpgid(pid_t pid, pid_t pgid)
                struct task_struct *g =
                        find_task_by_pid_type(PIDTYPE_PGID, pgid);
 
-               if (!g || process_session(g) != process_session(group_leader))
+               if (!g || task_session(g) != task_session(group_leader))
                        goto out;
        }
 
@@ -1510,7 +1518,6 @@ asmlinkage long sys_setsid(void)
 
        spin_lock(&group_leader->sighand->siglock);
        group_leader->signal->tty = NULL;
-       group_leader->signal->tty_old_pgrp = 0;
        spin_unlock(&group_leader->sighand->siglock);
 
        err = process_group(group_leader);
index 600b33358ded97ea54e90b6cc39dafef8e03fa40..3ca1d5ff0319ea70321f196ab28b7b368179f271 100644 (file)
@@ -90,12 +90,6 @@ extern char modprobe_path[];
 #ifdef CONFIG_CHR_DEV_SG
 extern int sg_big_buff;
 #endif
-#ifdef CONFIG_SYSVIPC
-static int proc_ipc_dointvec(ctl_table *table, int write, struct file *filp,
-               void __user *buffer, size_t *lenp, loff_t *ppos);
-static int proc_ipc_doulongvec_minmax(ctl_table *table, int write, struct file *filp,
-               void __user *buffer, size_t *lenp, loff_t *ppos);
-#endif
 
 #ifdef __sparc__
 extern char reboot_command [];
@@ -135,22 +129,12 @@ static int parse_table(int __user *, int, void __user *, size_t __user *,
                void __user *, size_t, ctl_table *);
 #endif
 
-static int proc_do_uts_string(ctl_table *table, int write, struct file *filp,
-                 void __user *buffer, size_t *lenp, loff_t *ppos);
-
-static int sysctl_uts_string(ctl_table *table, int __user *name, int nlen,
-                 void __user *oldval, size_t __user *oldlenp,
-                 void __user *newval, size_t newlen);
-
-#ifdef CONFIG_SYSVIPC
-static int sysctl_ipc_data(ctl_table *table, int __user *name, int nlen,
-                 void __user *oldval, size_t __user *oldlenp,
-                 void __user *newval, size_t newlen);
-#endif
 
 #ifdef CONFIG_PROC_SYSCTL
 static int proc_do_cad_pid(ctl_table *table, int write, struct file *filp,
                  void __user *buffer, size_t *lenp, loff_t *ppos);
+static int proc_dointvec_taint(ctl_table *table, int write, struct file *filp,
+                              void __user *buffer, size_t *lenp, loff_t *ppos);
 #endif
 
 static ctl_table root_table[];
@@ -174,59 +158,6 @@ extern ctl_table inotify_table[];
 int sysctl_legacy_va_layout;
 #endif
 
-static void *get_uts(ctl_table *table, int write)
-{
-       char *which = table->data;
-#ifdef CONFIG_UTS_NS
-       struct uts_namespace *uts_ns = current->nsproxy->uts_ns;
-       which = (which - (char *)&init_uts_ns) + (char *)uts_ns;
-#endif
-       if (!write)
-               down_read(&uts_sem);
-       else
-               down_write(&uts_sem);
-       return which;
-}
-
-static void put_uts(ctl_table *table, int write, void *which)
-{
-       if (!write)
-               up_read(&uts_sem);
-       else
-               up_write(&uts_sem);
-}
-
-#ifdef CONFIG_SYSVIPC
-static void *get_ipc(ctl_table *table, int write)
-{
-       char *which = table->data;
-       struct ipc_namespace *ipc_ns = current->nsproxy->ipc_ns;
-       which = (which - (char *)&init_ipc_ns) + (char *)ipc_ns;
-       return which;
-}
-#else
-#define get_ipc(T,W) ((T)->data)
-#endif
-
-/* /proc declarations: */
-
-#ifdef CONFIG_PROC_SYSCTL
-
-static ssize_t proc_readsys(struct file *, char __user *, size_t, loff_t *);
-static ssize_t proc_writesys(struct file *, const char __user *, size_t, loff_t *);
-static int proc_opensys(struct inode *, struct file *);
-
-const struct file_operations proc_sys_file_operations = {
-       .open           = proc_opensys,
-       .read           = proc_readsys,
-       .write          = proc_writesys,
-};
-
-extern struct proc_dir_entry *proc_sys_root;
-
-static void register_proc_table(ctl_table *, struct proc_dir_entry *, void *);
-static void unregister_proc_table(ctl_table *, struct proc_dir_entry *);
-#endif
 
 /* The default sysctl tables: */
 
@@ -274,51 +205,6 @@ static ctl_table root_table[] = {
 };
 
 static ctl_table kern_table[] = {
-       {
-               .ctl_name       = KERN_OSTYPE,
-               .procname       = "ostype",
-               .data           = init_uts_ns.name.sysname,
-               .maxlen         = sizeof(init_uts_ns.name.sysname),
-               .mode           = 0444,
-               .proc_handler   = &proc_do_uts_string,
-               .strategy       = &sysctl_uts_string,
-       },
-       {
-               .ctl_name       = KERN_OSRELEASE,
-               .procname       = "osrelease",
-               .data           = init_uts_ns.name.release,
-               .maxlen         = sizeof(init_uts_ns.name.release),
-               .mode           = 0444,
-               .proc_handler   = &proc_do_uts_string,
-               .strategy       = &sysctl_uts_string,
-       },
-       {
-               .ctl_name       = KERN_VERSION,
-               .procname       = "version",
-               .data           = init_uts_ns.name.version,
-               .maxlen         = sizeof(init_uts_ns.name.version),
-               .mode           = 0444,
-               .proc_handler   = &proc_do_uts_string,
-               .strategy       = &sysctl_uts_string,
-       },
-       {
-               .ctl_name       = KERN_NODENAME,
-               .procname       = "hostname",
-               .data           = init_uts_ns.name.nodename,
-               .maxlen         = sizeof(init_uts_ns.name.nodename),
-               .mode           = 0644,
-               .proc_handler   = &proc_do_uts_string,
-               .strategy       = &sysctl_uts_string,
-       },
-       {
-               .ctl_name       = KERN_DOMAINNAME,
-               .procname       = "domainname",
-               .data           = init_uts_ns.name.domainname,
-               .maxlen         = sizeof(init_uts_ns.name.domainname),
-               .mode           = 0644,
-               .proc_handler   = &proc_do_uts_string,
-               .strategy       = &sysctl_uts_string,
-       },
        {
                .ctl_name       = KERN_PANIC,
                .procname       = "panic",
@@ -344,14 +230,16 @@ static ctl_table kern_table[] = {
                .proc_handler   = &proc_dostring,
                .strategy       = &sysctl_string,
        },
+#ifdef CONFIG_PROC_SYSCTL
        {
                .ctl_name       = KERN_TAINTED,
                .procname       = "tainted",
                .data           = &tainted,
                .maxlen         = sizeof(int),
-               .mode           = 0444,
-               .proc_handler   = &proc_dointvec,
+               .mode           = 0644,
+               .proc_handler   = &proc_dointvec_taint,
        },
+#endif
        {
                .ctl_name       = KERN_CAP_BSET,
                .procname       = "cap-bound",
@@ -473,71 +361,6 @@ static ctl_table kern_table[] = {
                .proc_handler   = &proc_dointvec,
        },
 #endif
-#ifdef CONFIG_SYSVIPC
-       {
-               .ctl_name       = KERN_SHMMAX,
-               .procname       = "shmmax",
-               .data           = &init_ipc_ns.shm_ctlmax,
-               .maxlen         = sizeof (init_ipc_ns.shm_ctlmax),
-               .mode           = 0644,
-               .proc_handler   = &proc_ipc_doulongvec_minmax,
-               .strategy       = sysctl_ipc_data,
-       },
-       {
-               .ctl_name       = KERN_SHMALL,
-               .procname       = "shmall",
-               .data           = &init_ipc_ns.shm_ctlall,
-               .maxlen         = sizeof (init_ipc_ns.shm_ctlall),
-               .mode           = 0644,
-               .proc_handler   = &proc_ipc_doulongvec_minmax,
-               .strategy       = sysctl_ipc_data,
-       },
-       {
-               .ctl_name       = KERN_SHMMNI,
-               .procname       = "shmmni",
-               .data           = &init_ipc_ns.shm_ctlmni,
-               .maxlen         = sizeof (init_ipc_ns.shm_ctlmni),
-               .mode           = 0644,
-               .proc_handler   = &proc_ipc_dointvec,
-               .strategy       = sysctl_ipc_data,
-       },
-       {
-               .ctl_name       = KERN_MSGMAX,
-               .procname       = "msgmax",
-               .data           = &init_ipc_ns.msg_ctlmax,
-               .maxlen         = sizeof (init_ipc_ns.msg_ctlmax),
-               .mode           = 0644,
-               .proc_handler   = &proc_ipc_dointvec,
-               .strategy       = sysctl_ipc_data,
-       },
-       {
-               .ctl_name       = KERN_MSGMNI,
-               .procname       = "msgmni",
-               .data           = &init_ipc_ns.msg_ctlmni,
-               .maxlen         = sizeof (init_ipc_ns.msg_ctlmni),
-               .mode           = 0644,
-               .proc_handler   = &proc_ipc_dointvec,
-               .strategy       = sysctl_ipc_data,
-       },
-       {
-               .ctl_name       = KERN_MSGMNB,
-               .procname       =  "msgmnb",
-               .data           = &init_ipc_ns.msg_ctlmnb,
-               .maxlen         = sizeof (init_ipc_ns.msg_ctlmnb),
-               .mode           = 0644,
-               .proc_handler   = &proc_ipc_dointvec,
-               .strategy       = sysctl_ipc_data,
-       },
-       {
-               .ctl_name       = KERN_SEM,
-               .procname       = "sem",
-               .data           = &init_ipc_ns.sem_ctls,
-               .maxlen         = 4*sizeof (int),
-               .mode           = 0644,
-               .proc_handler   = &proc_ipc_dointvec,
-               .strategy       = sysctl_ipc_data,
-       },
-#endif
 #ifdef CONFIG_MAGIC_SYSRQ
        {
                .ctl_name       = KERN_SYSRQ,
@@ -1038,6 +861,12 @@ static ctl_table vm_table[] = {
        { .ctl_name = 0 }
 };
 
+#if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)
+static ctl_table binfmt_misc_table[] = {
+       { .ctl_name = 0 }
+};
+#endif
+
 static ctl_table fs_table[] = {
        {
                .ctl_name       = FS_NRINODE,
@@ -1161,6 +990,14 @@ static ctl_table fs_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_dointvec,
        },
+#if defined(CONFIG_BINFMT_MISC) || defined(CONFIG_BINFMT_MISC_MODULE)
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "binfmt_misc",
+               .mode           = 0555,
+               .child          = binfmt_misc_table,
+       },
+#endif
        { .ctl_name = 0 }
 };
 
@@ -1172,8 +1009,6 @@ static ctl_table dev_table[] = {
        { .ctl_name = 0 }
 };
 
-extern void init_irq_proc (void);
-
 static DEFINE_SPINLOCK(sysctl_lock);
 
 /* called under sysctl_lock */
@@ -1215,19 +1050,47 @@ static void start_unregistering(struct ctl_table_header *p)
        list_del_init(&p->ctl_entry);
 }
 
-void __init sysctl_init(void)
+void sysctl_head_finish(struct ctl_table_header *head)
 {
-#ifdef CONFIG_PROC_SYSCTL
-       register_proc_table(root_table, proc_sys_root, &root_table_header);
-       init_irq_proc();
-#endif
+       if (!head)
+               return;
+       spin_lock(&sysctl_lock);
+       unuse_table(head);
+       spin_unlock(&sysctl_lock);
+}
+
+struct ctl_table_header *sysctl_head_next(struct ctl_table_header *prev)
+{
+       struct ctl_table_header *head;
+       struct list_head *tmp;
+       spin_lock(&sysctl_lock);
+       if (prev) {
+               tmp = &prev->ctl_entry;
+               unuse_table(prev);
+               goto next;
+       }
+       tmp = &root_table_header.ctl_entry;
+       for (;;) {
+               head = list_entry(tmp, struct ctl_table_header, ctl_entry);
+
+               if (!use_table(head))
+                       goto next;
+               spin_unlock(&sysctl_lock);
+               return head;
+       next:
+               tmp = tmp->next;
+               if (tmp == &root_table_header.ctl_entry)
+                       break;
+       }
+       spin_unlock(&sysctl_lock);
+       return NULL;
 }
 
 #ifdef CONFIG_SYSCTL_SYSCALL
 int do_sysctl(int __user *name, int nlen, void __user *oldval, size_t __user *oldlenp,
               void __user *newval, size_t newlen)
 {
-       struct list_head *tmp;
+       struct ctl_table_header *head;
        int error = -ENOTDIR;
 
        if (nlen <= 0 || nlen >= CTL_MAXNAME)
@@ -1237,26 +1100,16 @@ int do_sysctl(int __user *name, int nlen, void __user *oldval, size_t __user *ol
                if (!oldlenp || get_user(old_len, oldlenp))
                        return -EFAULT;
        }
-       spin_lock(&sysctl_lock);
-       tmp = &root_table_header.ctl_entry;
-       do {
-               struct ctl_table_header *head =
-                       list_entry(tmp, struct ctl_table_header, ctl_entry);
-
-               if (!use_table(head))
-                       continue;
-
-               spin_unlock(&sysctl_lock);
 
+       for (head = sysctl_head_next(NULL); head;
+                       head = sysctl_head_next(head)) {
                error = parse_table(name, nlen, oldval, oldlenp, 
                                        newval, newlen, head->ctl_table);
-
-               spin_lock(&sysctl_lock);
-               unuse_table(head);
-               if (error != -ENOTDIR)
+               if (error != -ENOTDIR) {
+                       sysctl_head_finish(head);
                        break;
-       } while ((tmp = tmp->next) != &root_table_header.ctl_entry);
-       spin_unlock(&sysctl_lock);
+               }
+       }
        return error;
 }
 
@@ -1277,7 +1130,7 @@ asmlinkage long sys_sysctl(struct __sysctl_args __user *args)
 #endif /* CONFIG_SYSCTL_SYSCALL */
 
 /*
- * ctl_perm does NOT grant the superuser all rights automatically, because
+ * sysctl_perm does NOT grant the superuser all rights automatically, because
  * some sysctl variables are readonly even to root.
  */
 
@@ -1292,7 +1145,7 @@ static int test_perm(int mode, int op)
        return -EACCES;
 }
 
-static inline int ctl_perm(ctl_table *table, int op)
+int sysctl_perm(ctl_table *table, int op)
 {
        int error;
        error = security_sysctl(table, op);
@@ -1316,19 +1169,11 @@ repeat:
        for ( ; table->ctl_name || table->procname; table++) {
                if (!table->ctl_name)
                        continue;
-               if (n == table->ctl_name || table->ctl_name == CTL_ANY) {
+               if (n == table->ctl_name) {
                        int error;
                        if (table->child) {
-                               if (ctl_perm(table, 001))
+                               if (sysctl_perm(table, 001))
                                        return -EPERM;
-                               if (table->strategy) {
-                                       error = table->strategy(
-                                               table, name, nlen,
-                                               oldval, oldlenp,
-                                               newval, newlen);
-                                       if (error)
-                                               return error;
-                               }
                                name++;
                                nlen--;
                                table = table->child;
@@ -1356,7 +1201,7 @@ int do_sysctl_strategy (ctl_table *table,
                op |= 004;
        if (newval) 
                op |= 002;
-       if (ctl_perm(table, op))
+       if (sysctl_perm(table, op))
                return -EPERM;
 
        if (table->strategy) {
@@ -1395,10 +1240,26 @@ int do_sysctl_strategy (ctl_table *table,
 }
 #endif /* CONFIG_SYSCTL_SYSCALL */
 
+static void sysctl_set_parent(struct ctl_table *parent, struct ctl_table *table)
+{
+       for (; table->ctl_name || table->procname; table++) {
+               table->parent = parent;
+               if (table->child)
+                       sysctl_set_parent(table, table->child);
+       }
+}
+
+static __init int sysctl_init(void)
+{
+       sysctl_set_parent(NULL, root_table);
+       return 0;
+}
+
+core_initcall(sysctl_init);
+
 /**
  * register_sysctl_table - register a sysctl hierarchy
  * @table: the top-level table structure
- * @insert_at_head: whether the entry should be inserted in front or at the end
  *
  * Register a sysctl table hierarchy. @table should be a filled in ctl_table
  * array. An entry with a ctl_name of 0 terminates the table. 
@@ -1464,8 +1325,7 @@ int do_sysctl_strategy (ctl_table *table,
  * This routine returns %NULL on a failure to register, and a pointer
  * to the table header on success.
  */
-struct ctl_table_header *register_sysctl_table(ctl_table * table, 
-                                              int insert_at_head)
+struct ctl_table_header *register_sysctl_table(ctl_table * table)
 {
        struct ctl_table_header *tmp;
        tmp = kmalloc(sizeof(struct ctl_table_header), GFP_KERNEL);
@@ -1475,15 +1335,10 @@ struct ctl_table_header *register_sysctl_table(ctl_table * table,
        INIT_LIST_HEAD(&tmp->ctl_entry);
        tmp->used = 0;
        tmp->unregistering = NULL;
+       sysctl_set_parent(NULL, table);
        spin_lock(&sysctl_lock);
-       if (insert_at_head)
-               list_add(&tmp->ctl_entry, &root_table_header.ctl_entry);
-       else
-               list_add_tail(&tmp->ctl_entry, &root_table_header.ctl_entry);
+       list_add_tail(&tmp->ctl_entry, &root_table_header.ctl_entry);
        spin_unlock(&sysctl_lock);
-#ifdef CONFIG_PROC_SYSCTL
-       register_proc_table(table, proc_sys_root, tmp);
-#endif
        return tmp;
 }
 
@@ -1499,9 +1354,6 @@ void unregister_sysctl_table(struct ctl_table_header * header)
        might_sleep();
        spin_lock(&sysctl_lock);
        start_unregistering(header);
-#ifdef CONFIG_PROC_SYSCTL
-       unregister_proc_table(header->ctl_table, proc_sys_root);
-#endif
        spin_unlock(&sysctl_lock);
        kfree(header);
 }
@@ -1525,155 +1377,6 @@ void unregister_sysctl_table(struct ctl_table_header * table)
 
 #ifdef CONFIG_PROC_SYSCTL
 
-/* Scan the sysctl entries in table and add them all into /proc */
-static void register_proc_table(ctl_table * table, struct proc_dir_entry *root, void *set)
-{
-       struct proc_dir_entry *de;
-       int len;
-       mode_t mode;
-       
-       for (; table->ctl_name || table->procname; table++) {
-               /* Can't do anything without a proc name. */
-               if (!table->procname)
-                       continue;
-               /* Maybe we can't do anything with it... */
-               if (!table->proc_handler && !table->child) {
-                       printk(KERN_WARNING "SYSCTL: Can't register %s\n",
-                               table->procname);
-                       continue;
-               }
-
-               len = strlen(table->procname);
-               mode = table->mode;
-
-               de = NULL;
-               if (table->proc_handler)
-                       mode |= S_IFREG;
-               else {
-                       mode |= S_IFDIR;
-                       for (de = root->subdir; de; de = de->next) {
-                               if (proc_match(len, table->procname, de))
-                                       break;
-                       }
-                       /* If the subdir exists already, de is non-NULL */
-               }
-
-               if (!de) {
-                       de = create_proc_entry(table->procname, mode, root);
-                       if (!de)
-                               continue;
-                       de->set = set;
-                       de->data = (void *) table;
-                       if (table->proc_handler)
-                               de->proc_fops = &proc_sys_file_operations;
-               }
-               table->de = de;
-               if (de->mode & S_IFDIR)
-                       register_proc_table(table->child, de, set);
-       }
-}
-
-/*
- * Unregister a /proc sysctl table and any subdirectories.
- */
-static void unregister_proc_table(ctl_table * table, struct proc_dir_entry *root)
-{
-       struct proc_dir_entry *de;
-       for (; table->ctl_name || table->procname; table++) {
-               if (!(de = table->de))
-                       continue;
-               if (de->mode & S_IFDIR) {
-                       if (!table->child) {
-                               printk (KERN_ALERT "Help - malformed sysctl tree on free\n");
-                               continue;
-                       }
-                       unregister_proc_table(table->child, de);
-
-                       /* Don't unregister directories which still have entries.. */
-                       if (de->subdir)
-                               continue;
-               }
-
-               /*
-                * In any case, mark the entry as goner; we'll keep it
-                * around if it's busy, but we'll know to do nothing with
-                * its fields.  We are under sysctl_lock here.
-                */
-               de->data = NULL;
-
-               /* Don't unregister proc entries that are still being used.. */
-               if (atomic_read(&de->count))
-                       continue;
-
-               table->de = NULL;
-               remove_proc_entry(table->procname, root);
-       }
-}
-
-static ssize_t do_rw_proc(int write, struct file * file, char __user * buf,
-                         size_t count, loff_t *ppos)
-{
-       int op;
-       struct proc_dir_entry *de = PDE(file->f_path.dentry->d_inode);
-       struct ctl_table *table;
-       size_t res;
-       ssize_t error = -ENOTDIR;
-       
-       spin_lock(&sysctl_lock);
-       if (de && de->data && use_table(de->set)) {
-               /*
-                * at that point we know that sysctl was not unregistered
-                * and won't be until we finish
-                */
-               spin_unlock(&sysctl_lock);
-               table = (struct ctl_table *) de->data;
-               if (!table || !table->proc_handler)
-                       goto out;
-               error = -EPERM;
-               op = (write ? 002 : 004);
-               if (ctl_perm(table, op))
-                       goto out;
-               
-               /* careful: calling conventions are nasty here */
-               res = count;
-               error = (*table->proc_handler)(table, write, file,
-                                               buf, &res, ppos);
-               if (!error)
-                       error = res;
-       out:
-               spin_lock(&sysctl_lock);
-               unuse_table(de->set);
-       }
-       spin_unlock(&sysctl_lock);
-       return error;
-}
-
-static int proc_opensys(struct inode *inode, struct file *file)
-{
-       if (file->f_mode & FMODE_WRITE) {
-               /*
-                * sysctl entries that are not writable,
-                * are _NOT_ writable, capabilities or not.
-                */
-               if (!(inode->i_mode & S_IWUSR))
-                       return -EPERM;
-       }
-
-       return 0;
-}
-
-static ssize_t proc_readsys(struct file * file, char __user * buf,
-                           size_t count, loff_t *ppos)
-{
-       return do_rw_proc(0, file, buf, count, ppos);
-}
-
-static ssize_t proc_writesys(struct file * file, const char __user * buf,
-                            size_t count, loff_t *ppos)
-{
-       return do_rw_proc(1, file, (char __user *) buf, count, ppos);
-}
-
 static int _proc_do_string(void* data, int maxlen, int write,
                           struct file *filp, void __user *buffer,
                           size_t *lenp, loff_t *ppos)
@@ -1681,13 +1384,12 @@ static int _proc_do_string(void* data, int maxlen, int write,
        size_t len;
        char __user *p;
        char c;
-       
-       if (!data || !maxlen || !*lenp ||
-           (*ppos && !write)) {
+
+       if (!data || !maxlen || !*lenp) {
                *lenp = 0;
                return 0;
        }
-       
+
        if (write) {
                len = 0;
                p = buffer;
@@ -1708,6 +1410,15 @@ static int _proc_do_string(void* data, int maxlen, int write,
                len = strlen(data);
                if (len > maxlen)
                        len = maxlen;
+
+               if (*ppos > len) {
+                       *lenp = 0;
+                       return 0;
+               }
+
+               data += *ppos;
+               len  -= *ppos;
+
                if (len > *lenp)
                        len = *lenp;
                if (len)
@@ -1749,21 +1460,6 @@ int proc_dostring(ctl_table *table, int write, struct file *filp,
                               buffer, lenp, ppos);
 }
 
-/*
- *     Special case of dostring for the UTS structure. This has locks
- *     to observe. Should this be in kernel/sys.c ????
- */
-
-static int proc_do_uts_string(ctl_table *table, int write, struct file *filp,
-                 void __user *buffer, size_t *lenp, loff_t *ppos)
-{
-       int r;
-       void *which;
-       which = get_uts(table, write);
-       r = _proc_do_string(which, table->maxlen,write,filp,buffer,lenp, ppos);
-       put_uts(table, write, which);
-       return r;
-}
 
 static int do_proc_dointvec_conv(int *negp, unsigned long *lvalp,
                                 int *valp,
@@ -1927,6 +1623,7 @@ int proc_dointvec(ctl_table *table, int write, struct file *filp,
 
 #define OP_SET 0
 #define OP_AND 1
+#define OP_OR  2
 
 static int do_proc_dointvec_bset_conv(int *negp, unsigned long *lvalp,
                                      int *valp,
@@ -1938,6 +1635,7 @@ static int do_proc_dointvec_bset_conv(int *negp, unsigned long *lvalp,
                switch(op) {
                case OP_SET:    *valp = val; break;
                case OP_AND:    *valp &= val; break;
+               case OP_OR:     *valp |= val; break;
                }
        } else {
                int val = *valp;
@@ -1961,7 +1659,7 @@ int proc_dointvec_bset(ctl_table *table, int write, struct file *filp,
 {
        int op;
 
-       if (!capable(CAP_SYS_MODULE)) {
+       if (write && !capable(CAP_SYS_MODULE)) {
                return -EPERM;
        }
 
@@ -1970,6 +1668,22 @@ int proc_dointvec_bset(ctl_table *table, int write, struct file *filp,
                                do_proc_dointvec_bset_conv,&op);
 }
 
+/*
+ *     Taint values can only be increased
+ */
+static int proc_dointvec_taint(ctl_table *table, int write, struct file *filp,
+                              void __user *buffer, size_t *lenp, loff_t *ppos)
+{
+       int op;
+
+       if (!capable(CAP_SYS_ADMIN))
+               return -EPERM;
+
+       op = OP_OR;
+       return do_proc_dointvec(table,write,filp,buffer,lenp,ppos,
+                               do_proc_dointvec_bset_conv,&op);
+}
+
 struct do_proc_dointvec_minmax_conv_param {
        int *min;
        int *max;
@@ -2331,27 +2045,6 @@ int proc_dointvec_ms_jiffies(ctl_table *table, int write, struct file *filp,
                                do_proc_dointvec_ms_jiffies_conv, NULL);
 }
 
-#ifdef CONFIG_SYSVIPC
-static int proc_ipc_dointvec(ctl_table *table, int write, struct file *filp,
-       void __user *buffer, size_t *lenp, loff_t *ppos)
-{
-       void *which;
-       which = get_ipc(table, write);
-       return __do_proc_dointvec(which, table, write, filp, buffer,
-                       lenp, ppos, NULL, NULL);
-}
-
-static int proc_ipc_doulongvec_minmax(ctl_table *table, int write,
-       struct file *filp, void __user *buffer, size_t *lenp, loff_t *ppos)
-{
-       void *which;
-       which = get_ipc(table, write);
-       return __do_proc_doulongvec_minmax(which, table, write, filp, buffer,
-                       lenp, ppos, 1l, 1l);
-}
-
-#endif
-
 static int proc_do_cad_pid(ctl_table *table, int write, struct file *filp,
                           void __user *buffer, size_t *lenp, loff_t *ppos)
 {
@@ -2382,31 +2075,6 @@ int proc_dostring(ctl_table *table, int write, struct file *filp,
        return -ENOSYS;
 }
 
-static int proc_do_uts_string(ctl_table *table, int write, struct file *filp,
-               void __user *buffer, size_t *lenp, loff_t *ppos)
-{
-       return -ENOSYS;
-}
-
-#ifdef CONFIG_SYSVIPC
-static int proc_do_ipc_string(ctl_table *table, int write, struct file *filp,
-               void __user *buffer, size_t *lenp, loff_t *ppos)
-{
-       return -ENOSYS;
-}
-static int proc_ipc_dointvec(ctl_table *table, int write, struct file *filp,
-               void __user *buffer, size_t *lenp, loff_t *ppos)
-{
-       return -ENOSYS;
-}
-static int proc_ipc_doulongvec_minmax(ctl_table *table, int write,
-               struct file *filp, void __user *buffer,
-               size_t *lenp, loff_t *ppos)
-{
-       return -ENOSYS;
-}
-#endif
-
 int proc_dointvec(ctl_table *table, int write, struct file *filp,
                  void __user *buffer, size_t *lenp, loff_t *ppos)
 {
@@ -2553,17 +2221,23 @@ int sysctl_jiffies(ctl_table *table, int __user *name, int nlen,
                void __user *oldval, size_t __user *oldlenp,
                void __user *newval, size_t newlen)
 {
-       if (oldval) {
+       if (oldval && oldlenp) {
                size_t olen;
-               if (oldlenp) { 
-                       if (get_user(olen, oldlenp))
+
+               if (get_user(olen, oldlenp))
+                       return -EFAULT;
+               if (olen) {
+                       int val;
+
+                       if (olen < sizeof(int))
+                               return -EINVAL;
+
+                       val = *(int *)(table->data) / HZ;
+                       if (put_user(val, (int __user *)oldval))
+                               return -EFAULT;
+                       if (put_user(sizeof(int), oldlenp))
                                return -EFAULT;
-                       if (olen!=sizeof(int))
-                               return -EINVAL; 
                }
-               if (put_user(*(int *)(table->data)/HZ, (int __user *)oldval) ||
-                   (oldlenp && put_user(sizeof(int),oldlenp)))
-                       return -EFAULT;
        }
        if (newval && newlen) { 
                int new;
@@ -2581,17 +2255,23 @@ int sysctl_ms_jiffies(ctl_table *table, int __user *name, int nlen,
                void __user *oldval, size_t __user *oldlenp,
                void __user *newval, size_t newlen)
 {
-       if (oldval) {
+       if (oldval && oldlenp) {
                size_t olen;
-               if (oldlenp) { 
-                       if (get_user(olen, oldlenp))
+
+               if (get_user(olen, oldlenp))
+                       return -EFAULT;
+               if (olen) {
+                       int val;
+
+                       if (olen < sizeof(int))
+                               return -EINVAL;
+
+                       val = jiffies_to_msecs(*(int *)(table->data));
+                       if (put_user(val, (int __user *)oldval))
+                               return -EFAULT;
+                       if (put_user(sizeof(int), oldlenp))
                                return -EFAULT;
-                       if (olen!=sizeof(int))
-                               return -EINVAL; 
                }
-               if (put_user(jiffies_to_msecs(*(int *)(table->data)), (int __user *)oldval) ||
-                   (oldlenp && put_user(sizeof(int),oldlenp)))
-                       return -EFAULT;
        }
        if (newval && newlen) { 
                int new;
@@ -2605,62 +2285,6 @@ int sysctl_ms_jiffies(ctl_table *table, int __user *name, int nlen,
 }
 
 
-/* The generic string strategy routine: */
-static int sysctl_uts_string(ctl_table *table, int __user *name, int nlen,
-                 void __user *oldval, size_t __user *oldlenp,
-                 void __user *newval, size_t newlen)
-{
-       struct ctl_table uts_table;
-       int r, write;
-       write = newval && newlen;
-       memcpy(&uts_table, table, sizeof(uts_table));
-       uts_table.data = get_uts(table, write);
-       r = sysctl_string(&uts_table, name, nlen,
-               oldval, oldlenp, newval, newlen);
-       put_uts(table, write, uts_table.data);
-       return r;
-}
-
-#ifdef CONFIG_SYSVIPC
-/* The generic sysctl ipc data routine. */
-static int sysctl_ipc_data(ctl_table *table, int __user *name, int nlen,
-               void __user *oldval, size_t __user *oldlenp,
-               void __user *newval, size_t newlen)
-{
-       size_t len;
-       void *data;
-
-       /* Get out of I don't have a variable */
-       if (!table->data || !table->maxlen)
-               return -ENOTDIR;
-
-       data = get_ipc(table, 1);
-       if (!data)
-               return -ENOTDIR;
-
-       if (oldval && oldlenp) {
-               if (get_user(len, oldlenp))
-                       return -EFAULT;
-               if (len) {
-                       if (len > table->maxlen)
-                               len = table->maxlen;
-                       if (copy_to_user(oldval, data, len))
-                               return -EFAULT;
-                       if (put_user(len, oldlenp))
-                               return -EFAULT;
-               }
-       }
-
-       if (newval && newlen) {
-               if (newlen > table->maxlen)
-                       newlen = table->maxlen;
-
-               if (copy_from_user(data, newval, newlen))
-                       return -EFAULT;
-       }
-       return 1;
-}
-#endif
 
 #else /* CONFIG_SYSCTL_SYSCALL */
 
@@ -2726,18 +2350,6 @@ int sysctl_ms_jiffies(ctl_table *table, int __user *name, int nlen,
        return -ENOSYS;
 }
 
-static int sysctl_uts_string(ctl_table *table, int __user *name, int nlen,
-                 void __user *oldval, size_t __user *oldlenp,
-                 void __user *newval, size_t newlen)
-{
-       return -ENOSYS;
-}
-static int sysctl_ipc_data(ctl_table *table, int __user *name, int nlen,
-               void __user *oldval, size_t __user *oldlenp,
-               void __user *newval, size_t newlen)
-{
-       return -ENOSYS;
-}
 #endif /* CONFIG_SYSCTL_SYSCALL */
 
 /*
index 0e017bff4c19e77daeb657669618c757399dde03..c6c80ea5d0ead904ac73030616ba02c5b2a5f7d9 100644 (file)
@@ -470,6 +470,260 @@ struct timeval ns_to_timeval(const s64 nsec)
        return tv;
 }
 
+/*
+ * Convert jiffies to milliseconds and back.
+ *
+ * Avoid unnecessary multiplications/divisions in the
+ * two most common HZ cases:
+ */
+unsigned int jiffies_to_msecs(const unsigned long j)
+{
+#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
+       return (MSEC_PER_SEC / HZ) * j;
+#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
+       return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC);
+#else
+       return (j * MSEC_PER_SEC) / HZ;
+#endif
+}
+EXPORT_SYMBOL(jiffies_to_msecs);
+
+unsigned int jiffies_to_usecs(const unsigned long j)
+{
+#if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ)
+       return (USEC_PER_SEC / HZ) * j;
+#elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC)
+       return (j + (HZ / USEC_PER_SEC) - 1)/(HZ / USEC_PER_SEC);
+#else
+       return (j * USEC_PER_SEC) / HZ;
+#endif
+}
+EXPORT_SYMBOL(jiffies_to_usecs);
+
+/*
+ * When we convert to jiffies then we interpret incoming values
+ * the following way:
+ *
+ * - negative values mean 'infinite timeout' (MAX_JIFFY_OFFSET)
+ *
+ * - 'too large' values [that would result in larger than
+ *   MAX_JIFFY_OFFSET values] mean 'infinite timeout' too.
+ *
+ * - all other values are converted to jiffies by either multiplying
+ *   the input value by a factor or dividing it with a factor
+ *
+ * We must also be careful about 32-bit overflows.
+ */
+unsigned long msecs_to_jiffies(const unsigned int m)
+{
+       /*
+        * Negative value, means infinite timeout:
+        */
+       if ((int)m < 0)
+               return MAX_JIFFY_OFFSET;
+
+#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
+       /*
+        * HZ is equal to or smaller than 1000, and 1000 is a nice
+        * round multiple of HZ, divide with the factor between them,
+        * but round upwards:
+        */
+       return (m + (MSEC_PER_SEC / HZ) - 1) / (MSEC_PER_SEC / HZ);
+#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
+       /*
+        * HZ is larger than 1000, and HZ is a nice round multiple of
+        * 1000 - simply multiply with the factor between them.
+        *
+        * But first make sure the multiplication result cannot
+        * overflow:
+        */
+       if (m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
+               return MAX_JIFFY_OFFSET;
+
+       return m * (HZ / MSEC_PER_SEC);
+#else
+       /*
+        * Generic case - multiply, round and divide. But first
+        * check that if we are doing a net multiplication, that
+        * we wouldnt overflow:
+        */
+       if (HZ > MSEC_PER_SEC && m > jiffies_to_msecs(MAX_JIFFY_OFFSET))
+               return MAX_JIFFY_OFFSET;
+
+       return (m * HZ + MSEC_PER_SEC - 1) / MSEC_PER_SEC;
+#endif
+}
+EXPORT_SYMBOL(msecs_to_jiffies);
+
+unsigned long usecs_to_jiffies(const unsigned int u)
+{
+       if (u > jiffies_to_usecs(MAX_JIFFY_OFFSET))
+               return MAX_JIFFY_OFFSET;
+#if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ)
+       return (u + (USEC_PER_SEC / HZ) - 1) / (USEC_PER_SEC / HZ);
+#elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC)
+       return u * (HZ / USEC_PER_SEC);
+#else
+       return (u * HZ + USEC_PER_SEC - 1) / USEC_PER_SEC;
+#endif
+}
+EXPORT_SYMBOL(usecs_to_jiffies);
+
+/*
+ * The TICK_NSEC - 1 rounds up the value to the next resolution.  Note
+ * that a remainder subtract here would not do the right thing as the
+ * resolution values don't fall on second boundries.  I.e. the line:
+ * nsec -= nsec % TICK_NSEC; is NOT a correct resolution rounding.
+ *
+ * Rather, we just shift the bits off the right.
+ *
+ * The >> (NSEC_JIFFIE_SC - SEC_JIFFIE_SC) converts the scaled nsec
+ * value to a scaled second value.
+ */
+unsigned long
+timespec_to_jiffies(const struct timespec *value)
+{
+       unsigned long sec = value->tv_sec;
+       long nsec = value->tv_nsec + TICK_NSEC - 1;
+
+       if (sec >= MAX_SEC_IN_JIFFIES){
+               sec = MAX_SEC_IN_JIFFIES;
+               nsec = 0;
+       }
+       return (((u64)sec * SEC_CONVERSION) +
+               (((u64)nsec * NSEC_CONVERSION) >>
+                (NSEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC;
+
+}
+EXPORT_SYMBOL(timespec_to_jiffies);
+
+void
+jiffies_to_timespec(const unsigned long jiffies, struct timespec *value)
+{
+       /*
+        * Convert jiffies to nanoseconds and separate with
+        * one divide.
+        */
+       u64 nsec = (u64)jiffies * TICK_NSEC;
+       value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &value->tv_nsec);
+}
+EXPORT_SYMBOL(jiffies_to_timespec);
+
+/* Same for "timeval"
+ *
+ * Well, almost.  The problem here is that the real system resolution is
+ * in nanoseconds and the value being converted is in micro seconds.
+ * Also for some machines (those that use HZ = 1024, in-particular),
+ * there is a LARGE error in the tick size in microseconds.
+
+ * The solution we use is to do the rounding AFTER we convert the
+ * microsecond part.  Thus the USEC_ROUND, the bits to be shifted off.
+ * Instruction wise, this should cost only an additional add with carry
+ * instruction above the way it was done above.
+ */
+unsigned long
+timeval_to_jiffies(const struct timeval *value)
+{
+       unsigned long sec = value->tv_sec;
+       long usec = value->tv_usec;
+
+       if (sec >= MAX_SEC_IN_JIFFIES){
+               sec = MAX_SEC_IN_JIFFIES;
+               usec = 0;
+       }
+       return (((u64)sec * SEC_CONVERSION) +
+               (((u64)usec * USEC_CONVERSION + USEC_ROUND) >>
+                (USEC_JIFFIE_SC - SEC_JIFFIE_SC))) >> SEC_JIFFIE_SC;
+}
+
+void jiffies_to_timeval(const unsigned long jiffies, struct timeval *value)
+{
+       /*
+        * Convert jiffies to nanoseconds and separate with
+        * one divide.
+        */
+       u64 nsec = (u64)jiffies * TICK_NSEC;
+       long tv_usec;
+
+       value->tv_sec = div_long_long_rem(nsec, NSEC_PER_SEC, &tv_usec);
+       tv_usec /= NSEC_PER_USEC;
+       value->tv_usec = tv_usec;
+}
+
+/*
+ * Convert jiffies/jiffies_64 to clock_t and back.
+ */
+clock_t jiffies_to_clock_t(long x)
+{
+#if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
+       return x / (HZ / USER_HZ);
+#else
+       u64 tmp = (u64)x * TICK_NSEC;
+       do_div(tmp, (NSEC_PER_SEC / USER_HZ));
+       return (long)tmp;
+#endif
+}
+EXPORT_SYMBOL(jiffies_to_clock_t);
+
+unsigned long clock_t_to_jiffies(unsigned long x)
+{
+#if (HZ % USER_HZ)==0
+       if (x >= ~0UL / (HZ / USER_HZ))
+               return ~0UL;
+       return x * (HZ / USER_HZ);
+#else
+       u64 jif;
+
+       /* Don't worry about loss of precision here .. */
+       if (x >= ~0UL / HZ * USER_HZ)
+               return ~0UL;
+
+       /* .. but do try to contain it here */
+       jif = x * (u64) HZ;
+       do_div(jif, USER_HZ);
+       return jif;
+#endif
+}
+EXPORT_SYMBOL(clock_t_to_jiffies);
+
+u64 jiffies_64_to_clock_t(u64 x)
+{
+#if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
+       do_div(x, HZ / USER_HZ);
+#else
+       /*
+        * There are better ways that don't overflow early,
+        * but even this doesn't overflow in hundreds of years
+        * in 64 bits, so..
+        */
+       x *= TICK_NSEC;
+       do_div(x, (NSEC_PER_SEC / USER_HZ));
+#endif
+       return x;
+}
+
+EXPORT_SYMBOL(jiffies_64_to_clock_t);
+
+u64 nsec_to_clock_t(u64 x)
+{
+#if (NSEC_PER_SEC % USER_HZ) == 0
+       do_div(x, (NSEC_PER_SEC / USER_HZ));
+#elif (USER_HZ % 512) == 0
+       x *= USER_HZ/512;
+       do_div(x, (NSEC_PER_SEC / 512));
+#else
+       /*
+         * max relative error 5.7e-8 (1.8s per year) for USER_HZ <= 1024,
+         * overflow after 64.99 years.
+         * exact for HZ=60, 72, 90, 120, 144, 180, 300, 600, 900, ...
+         */
+       x *= 9;
+       do_div(x, (unsigned long)((9ull * NSEC_PER_SEC + (USER_HZ/2)) /
+                                 USER_HZ));
+#endif
+       return x;
+}
+
 #if (BITS_PER_LONG < 64)
 u64 get_jiffies_64(void)
 {
diff --git a/kernel/time/Kconfig b/kernel/time/Kconfig
new file mode 100644 (file)
index 0000000..f663511
--- /dev/null
@@ -0,0 +1,25 @@
+#
+# Timer subsystem related configuration options
+#
+config TICK_ONESHOT
+       bool
+       default n
+
+config NO_HZ
+       bool "Tickless System (Dynamic Ticks)"
+       depends on GENERIC_TIME && GENERIC_CLOCKEVENTS
+       select TICK_ONESHOT
+       help
+         This option enables a tickless system: timer interrupts will
+         only trigger on an as-needed basis both when the system is
+         busy and when the system is idle.
+
+config HIGH_RES_TIMERS
+       bool "High Resolution Timer Support"
+       depends on GENERIC_TIME && GENERIC_CLOCKEVENTS
+       select TICK_ONESHOT
+       help
+         This option enables high resolution timer support. If your
+         hardware is not capable then this option only increases
+         the size of the kernel image.
+
index 61a3907d16fb5caa0ef0391b3e52b70a08a6844e..93bccba1f265e3b49df7d5bc54810ec5e3e39b2d 100644 (file)
@@ -1 +1,8 @@
-obj-y += ntp.o clocksource.o jiffies.o
+obj-y += ntp.o clocksource.o jiffies.o timer_list.o
+
+obj-$(CONFIG_GENERIC_CLOCKEVENTS)              += clockevents.o
+obj-$(CONFIG_GENERIC_CLOCKEVENTS)              += tick-common.o
+obj-$(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST)    += tick-broadcast.o
+obj-$(CONFIG_TICK_ONESHOT)                     += tick-oneshot.o
+obj-$(CONFIG_TICK_ONESHOT)                     += tick-sched.o
+obj-$(CONFIG_TIMER_STATS)                      += timer_stats.o
diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c
new file mode 100644 (file)
index 0000000..67932ea
--- /dev/null
@@ -0,0 +1,345 @@
+/*
+ * linux/kernel/time/clockevents.c
+ *
+ * This file contains functions which manage clock event devices.
+ *
+ * Copyright(C) 2005-2006, Thomas Gleixner <tglx@linutronix.de>
+ * Copyright(C) 2005-2007, Red Hat, Inc., Ingo Molnar
+ * Copyright(C) 2006-2007, Timesys Corp., Thomas Gleixner
+ *
+ * This code is licenced under the GPL version 2. For details see
+ * kernel-base/COPYING.
+ */
+
+#include <linux/clockchips.h>
+#include <linux/hrtimer.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/notifier.h>
+#include <linux/smp.h>
+#include <linux/sysdev.h>
+
+/* The registered clock event devices */
+static LIST_HEAD(clockevent_devices);
+static LIST_HEAD(clockevents_released);
+
+/* Notification for clock events */
+static RAW_NOTIFIER_HEAD(clockevents_chain);
+
+/* Protection for the above */
+static DEFINE_SPINLOCK(clockevents_lock);
+
+/**
+ * clockevents_delta2ns - Convert a latch value (device ticks) to nanoseconds
+ * @latch:     value to convert
+ * @evt:       pointer to clock event device descriptor
+ *
+ * Math helper, returns latch value converted to nanoseconds (bound checked)
+ */
+unsigned long clockevent_delta2ns(unsigned long latch,
+                                 struct clock_event_device *evt)
+{
+       u64 clc = ((u64) latch << evt->shift);
+
+       do_div(clc, evt->mult);
+       if (clc < 1000)
+               clc = 1000;
+       if (clc > LONG_MAX)
+               clc = LONG_MAX;
+
+       return (unsigned long) clc;
+}
+
+/**
+ * clockevents_set_mode - set the operating mode of a clock event device
+ * @dev:       device to modify
+ * @mode:      new mode
+ *
+ * Must be called with interrupts disabled !
+ */
+void clockevents_set_mode(struct clock_event_device *dev,
+                                enum clock_event_mode mode)
+{
+       if (dev->mode != mode) {
+               dev->set_mode(mode, dev);
+               dev->mode = mode;
+       }
+}
+
+/**
+ * clockevents_program_event - Reprogram the clock event device.
+ * @expires:   absolute expiry time (monotonic clock)
+ *
+ * Returns 0 on success, -ETIME when the event is in the past.
+ */
+int clockevents_program_event(struct clock_event_device *dev, ktime_t expires,
+                             ktime_t now)
+{
+       unsigned long long clc;
+       int64_t delta;
+
+       delta = ktime_to_ns(ktime_sub(expires, now));
+
+       if (delta <= 0)
+               return -ETIME;
+
+       dev->next_event = expires;
+
+       if (dev->mode == CLOCK_EVT_MODE_SHUTDOWN)
+               return 0;
+
+       if (delta > dev->max_delta_ns)
+               delta = dev->max_delta_ns;
+       if (delta < dev->min_delta_ns)
+               delta = dev->min_delta_ns;
+
+       clc = delta * dev->mult;
+       clc >>= dev->shift;
+
+       return dev->set_next_event((unsigned long) clc, dev);
+}
+
+/**
+ * clockevents_register_notifier - register a clock events change listener
+ */
+int clockevents_register_notifier(struct notifier_block *nb)
+{
+       int ret;
+
+       spin_lock(&clockevents_lock);
+       ret = raw_notifier_chain_register(&clockevents_chain, nb);
+       spin_unlock(&clockevents_lock);
+
+       return ret;
+}
+
+/**
+ * clockevents_unregister_notifier - unregister a clock events change listener
+ */
+void clockevents_unregister_notifier(struct notifier_block *nb)
+{
+       spin_lock(&clockevents_lock);
+       raw_notifier_chain_unregister(&clockevents_chain, nb);
+       spin_unlock(&clockevents_lock);
+}
+
+/*
+ * Notify about a clock event change. Called with clockevents_lock
+ * held.
+ */
+static void clockevents_do_notify(unsigned long reason, void *dev)
+{
+       raw_notifier_call_chain(&clockevents_chain, reason, dev);
+}
+
+/*
+ * Called after a notify add to make devices availble which were
+ * released from the notifier call.
+ */
+static void clockevents_notify_released(void)
+{
+       struct clock_event_device *dev;
+
+       while (!list_empty(&clockevents_released)) {
+               dev = list_entry(clockevents_released.next,
+                                struct clock_event_device, list);
+               list_del(&dev->list);
+               list_add(&dev->list, &clockevent_devices);
+               clockevents_do_notify(CLOCK_EVT_NOTIFY_ADD, dev);
+       }
+}
+
+/**
+ * clockevents_register_device - register a clock event device
+ * @dev:       device to register
+ */
+void clockevents_register_device(struct clock_event_device *dev)
+{
+       BUG_ON(dev->mode != CLOCK_EVT_MODE_UNUSED);
+
+       spin_lock(&clockevents_lock);
+
+       list_add(&dev->list, &clockevent_devices);
+       clockevents_do_notify(CLOCK_EVT_NOTIFY_ADD, dev);
+       clockevents_notify_released();
+
+       spin_unlock(&clockevents_lock);
+}
+
+/*
+ * Noop handler when we shut down an event device
+ */
+static void clockevents_handle_noop(struct clock_event_device *dev)
+{
+}
+
+/**
+ * clockevents_exchange_device - release and request clock devices
+ * @old:       device to release (can be NULL)
+ * @new:       device to request (can be NULL)
+ *
+ * Called from the notifier chain. clockevents_lock is held already
+ */
+void clockevents_exchange_device(struct clock_event_device *old,
+                                struct clock_event_device *new)
+{
+       unsigned long flags;
+
+       local_irq_save(flags);
+       /*
+        * Caller releases a clock event device. We queue it into the
+        * released list and do a notify add later.
+        */
+       if (old) {
+               old->event_handler = clockevents_handle_noop;
+               clockevents_set_mode(old, CLOCK_EVT_MODE_UNUSED);
+               list_del(&old->list);
+               list_add(&old->list, &clockevents_released);
+       }
+
+       if (new) {
+               BUG_ON(new->mode != CLOCK_EVT_MODE_UNUSED);
+               clockevents_set_mode(new, CLOCK_EVT_MODE_SHUTDOWN);
+       }
+       local_irq_restore(flags);
+}
+
+/**
+ * clockevents_request_device
+ */
+struct clock_event_device *clockevents_request_device(unsigned int features,
+                                                     cpumask_t cpumask)
+{
+       struct clock_event_device *cur, *dev = NULL;
+       struct list_head *tmp;
+
+       spin_lock(&clockevents_lock);
+
+       list_for_each(tmp, &clockevent_devices) {
+               cur = list_entry(tmp, struct clock_event_device, list);
+
+               if ((cur->features & features) == features &&
+                   cpus_equal(cpumask, cur->cpumask)) {
+                       if (!dev || dev->rating < cur->rating)
+                               dev = cur;
+               }
+       }
+
+       clockevents_exchange_device(NULL, dev);
+
+       spin_unlock(&clockevents_lock);
+
+       return dev;
+}
+
+/**
+ * clockevents_release_device
+ */
+void clockevents_release_device(struct clock_event_device *dev)
+{
+       spin_lock(&clockevents_lock);
+
+       clockevents_exchange_device(dev, NULL);
+       clockevents_notify_released();
+
+       spin_unlock(&clockevents_lock);
+}
+
+/**
+ * clockevents_notify - notification about relevant events
+ */
+void clockevents_notify(unsigned long reason, void *arg)
+{
+       spin_lock(&clockevents_lock);
+       clockevents_do_notify(reason, arg);
+
+       switch (reason) {
+       case CLOCK_EVT_NOTIFY_CPU_DEAD:
+               /*
+                * Unregister the clock event devices which were
+                * released from the users in the notify chain.
+                */
+               while (!list_empty(&clockevents_released)) {
+                       struct clock_event_device *dev;
+
+                       dev = list_entry(clockevents_released.next,
+                                        struct clock_event_device, list);
+                       list_del(&dev->list);
+               }
+               break;
+       default:
+               break;
+       }
+       spin_unlock(&clockevents_lock);
+}
+EXPORT_SYMBOL_GPL(clockevents_notify);
+
+#ifdef CONFIG_SYSFS
+
+/**
+ * clockevents_show_registered - sysfs interface for listing clockevents
+ * @dev:       unused
+ * @buf:       char buffer to be filled with clock events list
+ *
+ * Provides sysfs interface for listing registered clock event devices
+ */
+static ssize_t clockevents_show_registered(struct sys_device *dev, char *buf)
+{
+       struct list_head *tmp;
+       char *p = buf;
+       int cpu;
+
+       spin_lock(&clockevents_lock);
+
+       list_for_each(tmp, &clockevent_devices) {
+               struct clock_event_device *ce;
+
+               ce = list_entry(tmp, struct clock_event_device, list);
+               p += sprintf(p, "%-20s F:%04x M:%d", ce->name,
+                            ce->features, ce->mode);
+               p += sprintf(p, " C:");
+               if (!cpus_equal(ce->cpumask, cpu_possible_map)) {
+                       for_each_cpu_mask(cpu, ce->cpumask)
+                               p += sprintf(p, " %d", cpu);
+               } else {
+                       /*
+                        * FIXME: Add the cpu which is handling this sucker
+                        */
+               }
+               p += sprintf(p, "\n");
+       }
+
+       spin_unlock(&clockevents_lock);
+
+       return p - buf;
+}
+
+/*
+ * Sysfs setup bits:
+ */
+static SYSDEV_ATTR(registered, 0600,
+                  clockevents_show_registered, NULL);
+
+static struct sysdev_class clockevents_sysclass = {
+       set_kset_name("clockevents"),
+};
+
+static struct sys_device clockevents_sys_device = {
+       .id     = 0,
+       .cls    = &clockevents_sysclass,
+};
+
+static int __init clockevents_sysfs_init(void)
+{
+       int error = sysdev_class_register(&clockevents_sysclass);
+
+       if (!error)
+               error = sysdev_register(&clockevents_sys_device);
+       if (!error)
+               error = sysdev_create_file(
+                               &clockevents_sys_device,
+                               &attr_registered);
+       return error;
+}
+device_initcall(clockevents_sysfs_init);
+#endif
index 22504afc0d34b48bf10e216c72b33c3be4470598..193a0793af95440dfbf712fab6432e5e9553d275 100644 (file)
@@ -28,6 +28,8 @@
 #include <linux/sysdev.h>
 #include <linux/init.h>
 #include <linux/module.h>
+#include <linux/sched.h> /* for spin_unlock_irq() using preempt_count() m68k */
+#include <linux/tick.h>
 
 /* XXX - Would like a better way for initializing curr_clocksource */
 extern struct clocksource clocksource_jiffies;
@@ -47,6 +49,7 @@ extern struct clocksource clocksource_jiffies;
  */
 static struct clocksource *curr_clocksource = &clocksource_jiffies;
 static struct clocksource *next_clocksource;
+static struct clocksource *clocksource_override;
 static LIST_HEAD(clocksource_list);
 static DEFINE_SPINLOCK(clocksource_lock);
 static char override_name[32];
@@ -61,9 +64,123 @@ static int __init clocksource_done_booting(void)
        finished_booting = 1;
        return 0;
 }
-
 late_initcall(clocksource_done_booting);
 
+#ifdef CONFIG_CLOCKSOURCE_WATCHDOG
+static LIST_HEAD(watchdog_list);
+static struct clocksource *watchdog;
+static struct timer_list watchdog_timer;
+static DEFINE_SPINLOCK(watchdog_lock);
+static cycle_t watchdog_last;
+/*
+ * Interval: 0.5sec Treshold: 0.0625s
+ */
+#define WATCHDOG_INTERVAL (HZ >> 1)
+#define WATCHDOG_TRESHOLD (NSEC_PER_SEC >> 4)
+
+static void clocksource_ratewd(struct clocksource *cs, int64_t delta)
+{
+       if (delta > -WATCHDOG_TRESHOLD && delta < WATCHDOG_TRESHOLD)
+               return;
+
+       printk(KERN_WARNING "Clocksource %s unstable (delta = %Ld ns)\n",
+              cs->name, delta);
+       cs->flags &= ~(CLOCK_SOURCE_VALID_FOR_HRES | CLOCK_SOURCE_WATCHDOG);
+       clocksource_change_rating(cs, 0);
+       cs->flags &= ~CLOCK_SOURCE_WATCHDOG;
+       list_del(&cs->wd_list);
+}
+
+static void clocksource_watchdog(unsigned long data)
+{
+       struct clocksource *cs, *tmp;
+       cycle_t csnow, wdnow;
+       int64_t wd_nsec, cs_nsec;
+
+       spin_lock(&watchdog_lock);
+
+       wdnow = watchdog->read();
+       wd_nsec = cyc2ns(watchdog, (wdnow - watchdog_last) & watchdog->mask);
+       watchdog_last = wdnow;
+
+       list_for_each_entry_safe(cs, tmp, &watchdog_list, wd_list) {
+               csnow = cs->read();
+               /* Initialized ? */
+               if (!(cs->flags & CLOCK_SOURCE_WATCHDOG)) {
+                       if ((cs->flags & CLOCK_SOURCE_IS_CONTINUOUS) &&
+                           (watchdog->flags & CLOCK_SOURCE_IS_CONTINUOUS)) {
+                               cs->flags |= CLOCK_SOURCE_VALID_FOR_HRES;
+                               /*
+                                * We just marked the clocksource as
+                                * highres-capable, notify the rest of the
+                                * system as well so that we transition
+                                * into high-res mode:
+                                */
+                               tick_clock_notify();
+                       }
+                       cs->flags |= CLOCK_SOURCE_WATCHDOG;
+                       cs->wd_last = csnow;
+               } else {
+                       cs_nsec = cyc2ns(cs, (csnow - cs->wd_last) & cs->mask);
+                       cs->wd_last = csnow;
+                       /* Check the delta. Might remove from the list ! */
+                       clocksource_ratewd(cs, cs_nsec - wd_nsec);
+               }
+       }
+
+       if (!list_empty(&watchdog_list)) {
+               __mod_timer(&watchdog_timer,
+                           watchdog_timer.expires + WATCHDOG_INTERVAL);
+       }
+       spin_unlock(&watchdog_lock);
+}
+static void clocksource_check_watchdog(struct clocksource *cs)
+{
+       struct clocksource *cse;
+       unsigned long flags;
+
+       spin_lock_irqsave(&watchdog_lock, flags);
+       if (cs->flags & CLOCK_SOURCE_MUST_VERIFY) {
+               int started = !list_empty(&watchdog_list);
+
+               list_add(&cs->wd_list, &watchdog_list);
+               if (!started && watchdog) {
+                       watchdog_last = watchdog->read();
+                       watchdog_timer.expires = jiffies + WATCHDOG_INTERVAL;
+                       add_timer(&watchdog_timer);
+               }
+       } else if (cs->flags & CLOCK_SOURCE_IS_CONTINUOUS) {
+                       cs->flags |= CLOCK_SOURCE_VALID_FOR_HRES;
+
+               if (!watchdog || cs->rating > watchdog->rating) {
+                       if (watchdog)
+                               del_timer(&watchdog_timer);
+                       watchdog = cs;
+                       init_timer(&watchdog_timer);
+                       watchdog_timer.function = clocksource_watchdog;
+
+                       /* Reset watchdog cycles */
+                       list_for_each_entry(cse, &watchdog_list, wd_list)
+                               cse->flags &= ~CLOCK_SOURCE_WATCHDOG;
+                       /* Start if list is not empty */
+                       if (!list_empty(&watchdog_list)) {
+                               watchdog_last = watchdog->read();
+                               watchdog_timer.expires =
+                                       jiffies + WATCHDOG_INTERVAL;
+                               add_timer(&watchdog_timer);
+                       }
+               }
+       }
+       spin_unlock_irqrestore(&watchdog_lock, flags);
+}
+#else
+static void clocksource_check_watchdog(struct clocksource *cs)
+{
+       if (cs->flags & CLOCK_SOURCE_IS_CONTINUOUS)
+               cs->flags |= CLOCK_SOURCE_VALID_FOR_HRES;
+}
+#endif
+
 /**
  * clocksource_get_next - Returns the selected clocksource
  *
@@ -83,60 +200,54 @@ struct clocksource *clocksource_get_next(void)
 }
 
 /**
- * select_clocksource - Finds the best registered clocksource.
+ * select_clocksource - Selects the best registered clocksource.
  *
  * Private function. Must hold clocksource_lock when called.
  *
- * Looks through the list of registered clocksources, returning
- * the one with the highest rating value. If there is a clocksource
- * name that matches the override string, it returns that clocksource.
+ * Select the clocksource with the best rating, or the clocksource,
+ * which is selected by userspace override.
  */
 static struct clocksource *select_clocksource(void)
 {
-       struct clocksource *best = NULL;
-       struct list_head *tmp;
+       struct clocksource *next;
 
-       list_for_each(tmp, &clocksource_list) {
-               struct clocksource *src;
+       if (list_empty(&clocksource_list))
+               return NULL;
 
-               src = list_entry(tmp, struct clocksource, list);
-               if (!best)
-                       best = src;
-
-               /* check for override: */
-               if (strlen(src->name) == strlen(override_name) &&
-                   !strcmp(src->name, override_name)) {
-                       best = src;
-                       break;
-               }
-               /* pick the highest rating: */
-               if (src->rating > best->rating)
-                       best = src;
-       }
+       if (clocksource_override)
+               next = clocksource_override;
+       else
+               next = list_entry(clocksource_list.next, struct clocksource,
+                                 list);
+
+       if (next == curr_clocksource)
+               return NULL;
 
-       return best;
+       return next;
 }
 
-/**
- * is_registered_source - Checks if clocksource is registered
- * @c:         pointer to a clocksource
- *
- * Private helper function. Must hold clocksource_lock when called.
- *
- * Returns one if the clocksource is already registered, zero otherwise.
+/*
+ * Enqueue the clocksource sorted by rating
  */
-static int is_registered_source(struct clocksource *c)
+static int clocksource_enqueue(struct clocksource *c)
 {
-       int len = strlen(c->name);
-       struct list_head *tmp;
+       struct list_head *tmp, *entry = &clocksource_list;
 
        list_for_each(tmp, &clocksource_list) {
-               struct clocksource *src;
-
-               src = list_entry(tmp, struct clocksource, list);
-               if (strlen(src->name) == len && !strcmp(src->name, c->name))
-                       return 1;
+               struct clocksource *cs;
+
+               cs = list_entry(tmp, struct clocksource, list);
+               if (cs == c)
+                       return -EBUSY;
+               /* Keep track of the place, where to insert */
+               if (cs->rating >= c->rating)
+                       entry = tmp;
        }
+       list_add(&c->list, entry);
+
+       if (strlen(c->name) == strlen(override_name) &&
+           !strcmp(c->name, override_name))
+               clocksource_override = c;
 
        return 0;
 }
@@ -149,42 +260,35 @@ static int is_registered_source(struct clocksource *c)
  */
 int clocksource_register(struct clocksource *c)
 {
-       int ret = 0;
        unsigned long flags;
+       int ret;
 
        spin_lock_irqsave(&clocksource_lock, flags);
-       /* check if clocksource is already registered */
-       if (is_registered_source(c)) {
-               printk("register_clocksource: Cannot register %s. "
-                      "Already registered!", c->name);
-               ret = -EBUSY;
-       } else {
-               /* register it */
-               list_add(&c->list, &clocksource_list);
-               /* scan the registered clocksources, and pick the best one */
+       ret = clocksource_enqueue(c);
+       if (!ret)
                next_clocksource = select_clocksource();
-       }
        spin_unlock_irqrestore(&clocksource_lock, flags);
+       if (!ret)
+               clocksource_check_watchdog(c);
        return ret;
 }
 EXPORT_SYMBOL(clocksource_register);
 
 /**
- * clocksource_reselect - Rescan list for next clocksource
+ * clocksource_change_rating - Change the rating of a registered clocksource
  *
- * A quick helper function to be used if a clocksource changes its
- * rating. Forces the clocksource list to be re-scanned for the best
- * clocksource.
  */
-void clocksource_reselect(void)
+void clocksource_change_rating(struct clocksource *cs, int rating)
 {
        unsigned long flags;
 
        spin_lock_irqsave(&clocksource_lock, flags);
+       list_del(&cs->list);
+       cs->rating = rating;
+       clocksource_enqueue(cs);
        next_clocksource = select_clocksource();
        spin_unlock_irqrestore(&clocksource_lock, flags);
 }
-EXPORT_SYMBOL(clocksource_reselect);
 
 #ifdef CONFIG_SYSFS
 /**
@@ -220,7 +324,11 @@ sysfs_show_current_clocksources(struct sys_device *dev, char *buf)
 static ssize_t sysfs_override_clocksource(struct sys_device *dev,
                                          const char *buf, size_t count)
 {
+       struct clocksource *ovr = NULL;
+       struct list_head *tmp;
        size_t ret = count;
+       int len;
+
        /* strings from sysfs write are not 0 terminated! */
        if (count >= sizeof(override_name))
                return -EINVAL;
@@ -228,17 +336,32 @@ static ssize_t sysfs_override_clocksource(struct sys_device *dev,
        /* strip of \n: */
        if (buf[count-1] == '\n')
                count--;
-       if (count < 1)
-               return -EINVAL;
 
        spin_lock_irq(&clocksource_lock);
 
-       /* copy the name given: */
-       memcpy(override_name, buf, count);
+       if (count > 0)
+               memcpy(override_name, buf, count);
        override_name[count] = 0;
 
-       /* try to select it: */
-       next_clocksource = select_clocksource();
+       len = strlen(override_name);
+       if (len) {
+               ovr = clocksource_override;
+               /* try to select it: */
+               list_for_each(tmp, &clocksource_list) {
+                       struct clocksource *cs;
+
+                       cs = list_entry(tmp, struct clocksource, list);
+                       if (strlen(cs->name) == len &&
+                           !strcmp(cs->name, override_name))
+                               ovr = cs;
+               }
+       }
+
+       /* Reselect, when the override name has changed */
+       if (ovr != clocksource_override) {
+               clocksource_override = ovr;
+               next_clocksource = select_clocksource();
+       }
 
        spin_unlock_irq(&clocksource_lock);
 
index a99b2a6e6a07354781da79b6067b1944d438d5f9..3be8da8fed7efa1a972fca3c0c249dc7f1a983fa 100644 (file)
@@ -62,7 +62,6 @@ struct clocksource clocksource_jiffies = {
        .mask           = 0xffffffff, /*32bits*/
        .mult           = NSEC_PER_JIFFY << JIFFIES_SHIFT, /* details above */
        .shift          = JIFFIES_SHIFT,
-       .is_continuous  = 0, /* tick based, not free running */
 };
 
 static int __init init_jiffies_clocksource(void)
index 3afeaa3a73f998dd422e1518c6c4256749207538..eb12509e00bdd964fb2ed552aa8402a703f363ae 100644 (file)
@@ -24,7 +24,7 @@ static u64 tick_length, tick_length_base;
 
 #define MAX_TICKADJ            500             /* microsecs */
 #define MAX_TICKADJ_SCALED     (((u64)(MAX_TICKADJ * NSEC_PER_USEC) << \
-                                 TICK_LENGTH_SHIFT) / HZ)
+                                 TICK_LENGTH_SHIFT) / NTP_INTERVAL_FREQ)
 
 /*
  * phase-lock loop variables
@@ -46,13 +46,17 @@ long time_adjust;
 
 static void ntp_update_frequency(void)
 {
-       tick_length_base = (u64)(tick_usec * NSEC_PER_USEC * USER_HZ) << TICK_LENGTH_SHIFT;
-       tick_length_base += (s64)CLOCK_TICK_ADJUST << TICK_LENGTH_SHIFT;
-       tick_length_base += (s64)time_freq << (TICK_LENGTH_SHIFT - SHIFT_NSEC);
+       u64 second_length = (u64)(tick_usec * NSEC_PER_USEC * USER_HZ)
+                               << TICK_LENGTH_SHIFT;
+       second_length += (s64)CLOCK_TICK_ADJUST << TICK_LENGTH_SHIFT;
+       second_length += (s64)time_freq << (TICK_LENGTH_SHIFT - SHIFT_NSEC);
 
-       do_div(tick_length_base, HZ);
+       tick_length_base = second_length;
 
-       tick_nsec = tick_length_base >> TICK_LENGTH_SHIFT;
+       do_div(second_length, HZ);
+       tick_nsec = second_length >> TICK_LENGTH_SHIFT;
+
+       do_div(tick_length_base, NTP_INTERVAL_FREQ);
 }
 
 /**
@@ -162,7 +166,7 @@ void second_overflow(void)
                        tick_length -= MAX_TICKADJ_SCALED;
                } else {
                        tick_length += (s64)(time_adjust * NSEC_PER_USEC /
-                                            HZ) << TICK_LENGTH_SHIFT;
+                                       NTP_INTERVAL_FREQ) << TICK_LENGTH_SHIFT;
                        time_adjust = 0;
                }
        }
@@ -239,7 +243,8 @@ int do_adjtimex(struct timex *txc)
                    result = -EINVAL;
                    goto leave;
                }
-               time_freq = ((s64)txc->freq * NSEC_PER_USEC) >> (SHIFT_USEC - SHIFT_NSEC);
+               time_freq = ((s64)txc->freq * NSEC_PER_USEC)
+                               >> (SHIFT_USEC - SHIFT_NSEC);
            }
 
            if (txc->modes & ADJ_MAXERROR) {
@@ -309,7 +314,8 @@ int do_adjtimex(struct timex *txc)
                    freq_adj += time_freq;
                    freq_adj = min(freq_adj, (s64)MAXFREQ_NSEC);
                    time_freq = max(freq_adj, (s64)-MAXFREQ_NSEC);
-                   time_offset = (time_offset / HZ) << SHIFT_UPDATE;
+                   time_offset = (time_offset / NTP_INTERVAL_FREQ)
+                                       << SHIFT_UPDATE;
                } /* STA_PLL */
            } /* txc->modes & ADJ_OFFSET */
            if (txc->modes & ADJ_TICK)
@@ -324,8 +330,10 @@ leave:     if ((time_status & (STA_UNSYNC|STA_CLOCKERR)) != 0)
        if ((txc->modes & ADJ_OFFSET_SINGLESHOT) == ADJ_OFFSET_SINGLESHOT)
            txc->offset    = save_adjust;
        else
-           txc->offset    = shift_right(time_offset, SHIFT_UPDATE) * HZ / 1000;
-       txc->freq          = (time_freq / NSEC_PER_USEC) << (SHIFT_USEC - SHIFT_NSEC);
+           txc->offset    = shift_right(time_offset, SHIFT_UPDATE)
+                               * NTP_INTERVAL_FREQ / 1000;
+       txc->freq          = (time_freq / NSEC_PER_USEC)
+                               << (SHIFT_USEC - SHIFT_NSEC);
        txc->maxerror      = time_maxerror;
        txc->esterror      = time_esterror;
        txc->status        = time_status;
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c
new file mode 100644 (file)
index 0000000..12b3efe
--- /dev/null
@@ -0,0 +1,480 @@
+/*
+ * linux/kernel/time/tick-broadcast.c
+ *
+ * This file contains functions which emulate a local clock-event
+ * device via a broadcast event source.
+ *
+ * Copyright(C) 2005-2006, Thomas Gleixner <tglx@linutronix.de>
+ * Copyright(C) 2005-2007, Red Hat, Inc., Ingo Molnar
+ * Copyright(C) 2006-2007, Timesys Corp., Thomas Gleixner
+ *
+ * This code is licenced under the GPL version 2. For details see
+ * kernel-base/COPYING.
+ */
+#include <linux/cpu.h>
+#include <linux/err.h>
+#include <linux/hrtimer.h>
+#include <linux/irq.h>
+#include <linux/percpu.h>
+#include <linux/profile.h>
+#include <linux/sched.h>
+#include <linux/tick.h>
+
+#include "tick-internal.h"
+
+/*
+ * Broadcast support for broken x86 hardware, where the local apic
+ * timer stops in C3 state.
+ */
+
+struct tick_device tick_broadcast_device;
+static cpumask_t tick_broadcast_mask;
+static DEFINE_SPINLOCK(tick_broadcast_lock);
+
+/*
+ * Debugging: see timer_list.c
+ */
+struct tick_device *tick_get_broadcast_device(void)
+{
+       return &tick_broadcast_device;
+}
+
+cpumask_t *tick_get_broadcast_mask(void)
+{
+       return &tick_broadcast_mask;
+}
+
+/*
+ * Start the device in periodic mode
+ */
+static void tick_broadcast_start_periodic(struct clock_event_device *bc)
+{
+       if (bc && bc->mode == CLOCK_EVT_MODE_SHUTDOWN)
+               tick_setup_periodic(bc, 1);
+}
+
+/*
+ * Check, if the device can be utilized as broadcast device:
+ */
+int tick_check_broadcast_device(struct clock_event_device *dev)
+{
+       if (tick_broadcast_device.evtdev ||
+           (dev->features & CLOCK_EVT_FEAT_C3STOP))
+               return 0;
+
+       clockevents_exchange_device(NULL, dev);
+       tick_broadcast_device.evtdev = dev;
+       if (!cpus_empty(tick_broadcast_mask))
+               tick_broadcast_start_periodic(dev);
+       return 1;
+}
+
+/*
+ * Check, if the device is the broadcast device
+ */
+int tick_is_broadcast_device(struct clock_event_device *dev)
+{
+       return (dev && tick_broadcast_device.evtdev == dev);
+}
+
+/*
+ * Check, if the device is disfunctional and a place holder, which
+ * needs to be handled by the broadcast device.
+ */
+int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu)
+{
+       unsigned long flags;
+       int ret = 0;
+
+       spin_lock_irqsave(&tick_broadcast_lock, flags);
+
+       /*
+        * Devices might be registered with both periodic and oneshot
+        * mode disabled. This signals, that the device needs to be
+        * operated from the broadcast device and is a placeholder for
+        * the cpu local device.
+        */
+       if (!tick_device_is_functional(dev)) {
+               dev->event_handler = tick_handle_periodic;
+               cpu_set(cpu, tick_broadcast_mask);
+               tick_broadcast_start_periodic(tick_broadcast_device.evtdev);
+               ret = 1;
+       }
+
+       spin_unlock_irqrestore(&tick_broadcast_lock, flags);
+       return ret;
+}
+
+/*
+ * Broadcast the event to the cpus, which are set in the mask
+ */
+int tick_do_broadcast(cpumask_t mask)
+{
+       int ret = 0, cpu = smp_processor_id();
+       struct tick_device *td;
+
+       /*
+        * Check, if the current cpu is in the mask
+        */
+       if (cpu_isset(cpu, mask)) {
+               cpu_clear(cpu, mask);
+               td = &per_cpu(tick_cpu_device, cpu);
+               td->evtdev->event_handler(td->evtdev);
+               ret = 1;
+       }
+
+       if (!cpus_empty(mask)) {
+               /*
+                * It might be necessary to actually check whether the devices
+                * have different broadcast functions. For now, just use the
+                * one of the first device. This works as long as we have this
+                * misfeature only on x86 (lapic)
+                */
+               cpu = first_cpu(mask);
+               td = &per_cpu(tick_cpu_device, cpu);
+               td->evtdev->broadcast(mask);
+               ret = 1;
+       }
+       return ret;
+}
+
+/*
+ * Periodic broadcast:
+ * - invoke the broadcast handlers
+ */
+static void tick_do_periodic_broadcast(void)
+{
+       cpumask_t mask;
+
+       spin_lock(&tick_broadcast_lock);
+
+       cpus_and(mask, cpu_online_map, tick_broadcast_mask);
+       tick_do_broadcast(mask);
+
+       spin_unlock(&tick_broadcast_lock);
+}
+
+/*
+ * Event handler for periodic broadcast ticks
+ */
+static void tick_handle_periodic_broadcast(struct clock_event_device *dev)
+{
+       dev->next_event.tv64 = KTIME_MAX;
+
+       tick_do_periodic_broadcast();
+
+       /*
+        * The device is in periodic mode. No reprogramming necessary:
+        */
+       if (dev->mode == CLOCK_EVT_MODE_PERIODIC)
+               return;
+
+       /*
+        * Setup the next period for devices, which do not have
+        * periodic mode:
+        */
+       for (;;) {
+               ktime_t next = ktime_add(dev->next_event, tick_period);
+
+               if (!clockevents_program_event(dev, next, ktime_get()))
+                       return;
+               tick_do_periodic_broadcast();
+       }
+}
+
+/*
+ * Powerstate information: The system enters/leaves a state, where
+ * affected devices might stop
+ */
+static void tick_do_broadcast_on_off(void *why)
+{
+       struct clock_event_device *bc, *dev;
+       struct tick_device *td;
+       unsigned long flags, *reason = why;
+       int cpu;
+
+       spin_lock_irqsave(&tick_broadcast_lock, flags);
+
+       cpu = smp_processor_id();
+       td = &per_cpu(tick_cpu_device, cpu);
+       dev = td->evtdev;
+       bc = tick_broadcast_device.evtdev;
+
+       /*
+        * Is the device in broadcast mode forever or is it not
+        * affected by the powerstate ?
+        */
+       if (!dev || !tick_device_is_functional(dev) ||
+           !(dev->features & CLOCK_EVT_FEAT_C3STOP))
+               goto out;
+
+       if (*reason == CLOCK_EVT_NOTIFY_BROADCAST_ON) {
+               if (!cpu_isset(cpu, tick_broadcast_mask)) {
+                       cpu_set(cpu, tick_broadcast_mask);
+                       if (td->mode == TICKDEV_MODE_PERIODIC)
+                               clockevents_set_mode(dev,
+                                                    CLOCK_EVT_MODE_SHUTDOWN);
+               }
+       } else {
+               if (cpu_isset(cpu, tick_broadcast_mask)) {
+                       cpu_clear(cpu, tick_broadcast_mask);
+                       if (td->mode == TICKDEV_MODE_PERIODIC)
+                               tick_setup_periodic(dev, 0);
+               }
+       }
+
+       if (cpus_empty(tick_broadcast_mask))
+               clockevents_set_mode(bc, CLOCK_EVT_MODE_SHUTDOWN);
+       else {
+               if (tick_broadcast_device.mode == TICKDEV_MODE_PERIODIC)
+                       tick_broadcast_start_periodic(bc);
+               else
+                       tick_broadcast_setup_oneshot(bc);
+       }
+out:
+       spin_unlock_irqrestore(&tick_broadcast_lock, flags);
+}
+
+/*
+ * Powerstate information: The system enters/leaves a state, where
+ * affected devices might stop.
+ */
+void tick_broadcast_on_off(unsigned long reason, int *oncpu)
+{
+       int cpu = get_cpu();
+
+       if (cpu == *oncpu)
+               tick_do_broadcast_on_off(&reason);
+       else
+               smp_call_function_single(*oncpu, tick_do_broadcast_on_off,
+                                        &reason, 1, 1);
+       put_cpu();
+}
+
+/*
+ * Set the periodic handler depending on broadcast on/off
+ */
+void tick_set_periodic_handler(struct clock_event_device *dev, int broadcast)
+{
+       if (!broadcast)
+               dev->event_handler = tick_handle_periodic;
+       else
+               dev->event_handler = tick_handle_periodic_broadcast;
+}
+
+/*
+ * Remove a CPU from broadcasting
+ */
+void tick_shutdown_broadcast(unsigned int *cpup)
+{
+       struct clock_event_device *bc;
+       unsigned long flags;
+       unsigned int cpu = *cpup;
+
+       spin_lock_irqsave(&tick_broadcast_lock, flags);
+
+       bc = tick_broadcast_device.evtdev;
+       cpu_clear(cpu, tick_broadcast_mask);
+
+       if (tick_broadcast_device.mode == TICKDEV_MODE_PERIODIC) {
+               if (bc && cpus_empty(tick_broadcast_mask))
+                       clockevents_set_mode(bc, CLOCK_EVT_MODE_SHUTDOWN);
+       }
+
+       spin_unlock_irqrestore(&tick_broadcast_lock, flags);
+}
+
+#ifdef CONFIG_TICK_ONESHOT
+
+static cpumask_t tick_broadcast_oneshot_mask;
+
+/*
+ * Debugging: see timer_list.c
+ */
+cpumask_t *tick_get_broadcast_oneshot_mask(void)
+{
+       return &tick_broadcast_oneshot_mask;
+}
+
+static int tick_broadcast_set_event(ktime_t expires, int force)
+{
+       struct clock_event_device *bc = tick_broadcast_device.evtdev;
+       ktime_t now = ktime_get();
+       int res;
+
+       for(;;) {
+               res = clockevents_program_event(bc, expires, now);
+               if (!res || !force)
+                       return res;
+               now = ktime_get();
+               expires = ktime_add(now, ktime_set(0, bc->min_delta_ns));
+       }
+}
+
+/*
+ * Reprogram the broadcast device:
+ *
+ * Called with tick_broadcast_lock held and interrupts disabled.
+ */
+static int tick_broadcast_reprogram(void)
+{
+       ktime_t expires = { .tv64 = KTIME_MAX };
+       struct tick_device *td;
+       int cpu;
+
+       /*
+        * Find the event which expires next:
+        */
+       for (cpu = first_cpu(tick_broadcast_oneshot_mask); cpu != NR_CPUS;
+            cpu = next_cpu(cpu, tick_broadcast_oneshot_mask)) {
+               td = &per_cpu(tick_cpu_device, cpu);
+               if (td->evtdev->next_event.tv64 < expires.tv64)
+                       expires = td->evtdev->next_event;
+       }
+
+       if (expires.tv64 == KTIME_MAX)
+               return 0;
+
+       return tick_broadcast_set_event(expires, 0);
+}
+
+/*
+ * Handle oneshot mode broadcasting
+ */
+static void tick_handle_oneshot_broadcast(struct clock_event_device *dev)
+{
+       struct tick_device *td;
+       cpumask_t mask;
+       ktime_t now;
+       int cpu;
+
+       spin_lock(&tick_broadcast_lock);
+again:
+       dev->next_event.tv64 = KTIME_MAX;
+       mask = CPU_MASK_NONE;
+       now = ktime_get();
+       /* Find all expired events */
+       for (cpu = first_cpu(tick_broadcast_oneshot_mask); cpu != NR_CPUS;
+            cpu = next_cpu(cpu, tick_broadcast_oneshot_mask)) {
+               td = &per_cpu(tick_cpu_device, cpu);
+               if (td->evtdev->next_event.tv64 <= now.tv64)
+                       cpu_set(cpu, mask);
+       }
+
+       /*
+        * Wakeup the cpus which have an expired event. The broadcast
+        * device is reprogrammed in the return from idle code.
+        */
+       if (!tick_do_broadcast(mask)) {
+               /*
+                * The global event did not expire any CPU local
+                * events. This happens in dyntick mode, as the
+                * maximum PIT delta is quite small.
+                */
+               if (tick_broadcast_reprogram())
+                       goto again;
+       }
+       spin_unlock(&tick_broadcast_lock);
+}
+
+/*
+ * Powerstate information: The system enters/leaves a state, where
+ * affected devices might stop
+ */
+void tick_broadcast_oneshot_control(unsigned long reason)
+{
+       struct clock_event_device *bc, *dev;
+       struct tick_device *td;
+       unsigned long flags;
+       int cpu;
+
+       spin_lock_irqsave(&tick_broadcast_lock, flags);
+
+       /*
+        * Periodic mode does not care about the enter/exit of power
+        * states
+        */
+       if (tick_broadcast_device.mode == TICKDEV_MODE_PERIODIC)
+               goto out;
+
+       bc = tick_broadcast_device.evtdev;
+       cpu = smp_processor_id();
+       td = &per_cpu(tick_cpu_device, cpu);
+       dev = td->evtdev;
+
+       if (!(dev->features & CLOCK_EVT_FEAT_C3STOP))
+               goto out;
+
+       if (reason == CLOCK_EVT_NOTIFY_BROADCAST_ENTER) {
+               if (!cpu_isset(cpu, tick_broadcast_oneshot_mask)) {
+                       cpu_set(cpu, tick_broadcast_oneshot_mask);
+                       clockevents_set_mode(dev, CLOCK_EVT_MODE_SHUTDOWN);
+                       if (dev->next_event.tv64 < bc->next_event.tv64)
+                               tick_broadcast_set_event(dev->next_event, 1);
+               }
+       } else {
+               if (cpu_isset(cpu, tick_broadcast_oneshot_mask)) {
+                       cpu_clear(cpu, tick_broadcast_oneshot_mask);
+                       clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT);
+                       if (dev->next_event.tv64 != KTIME_MAX)
+                               tick_program_event(dev->next_event, 1);
+               }
+       }
+
+out:
+       spin_unlock_irqrestore(&tick_broadcast_lock, flags);
+}
+
+/**
+ * tick_broadcast_setup_highres - setup the broadcast device for highres
+ */
+void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
+{
+       if (bc->mode != CLOCK_EVT_MODE_ONESHOT) {
+               bc->event_handler = tick_handle_oneshot_broadcast;
+               clockevents_set_mode(bc, CLOCK_EVT_MODE_ONESHOT);
+               bc->next_event.tv64 = KTIME_MAX;
+       }
+}
+
+/*
+ * Select oneshot operating mode for the broadcast device
+ */
+void tick_broadcast_switch_to_oneshot(void)
+{
+       struct clock_event_device *bc;
+       unsigned long flags;
+
+       spin_lock_irqsave(&tick_broadcast_lock, flags);
+
+       tick_broadcast_device.mode = TICKDEV_MODE_ONESHOT;
+       bc = tick_broadcast_device.evtdev;
+       if (bc)
+               tick_broadcast_setup_oneshot(bc);
+       spin_unlock_irqrestore(&tick_broadcast_lock, flags);
+}
+
+
+/*
+ * Remove a dead CPU from broadcasting
+ */
+void tick_shutdown_broadcast_oneshot(unsigned int *cpup)
+{
+       struct clock_event_device *bc;
+       unsigned long flags;
+       unsigned int cpu = *cpup;
+
+       spin_lock_irqsave(&tick_broadcast_lock, flags);
+
+       bc = tick_broadcast_device.evtdev;
+       cpu_clear(cpu, tick_broadcast_oneshot_mask);
+
+       if (tick_broadcast_device.mode == TICKDEV_MODE_ONESHOT) {
+               if (bc && cpus_empty(tick_broadcast_oneshot_mask))
+                       clockevents_set_mode(bc, CLOCK_EVT_MODE_SHUTDOWN);
+       }
+
+       spin_unlock_irqrestore(&tick_broadcast_lock, flags);
+}
+
+#endif
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c
new file mode 100644 (file)
index 0000000..4500e34
--- /dev/null
@@ -0,0 +1,346 @@
+/*
+ * linux/kernel/time/tick-common.c
+ *
+ * This file contains the base functions to manage periodic tick
+ * related events.
+ *
+ * Copyright(C) 2005-2006, Thomas Gleixner <tglx@linutronix.de>
+ * Copyright(C) 2005-2007, Red Hat, Inc., Ingo Molnar
+ * Copyright(C) 2006-2007, Timesys Corp., Thomas Gleixner
+ *
+ * This code is licenced under the GPL version 2. For details see
+ * kernel-base/COPYING.
+ */
+#include <linux/cpu.h>
+#include <linux/err.h>
+#include <linux/hrtimer.h>
+#include <linux/irq.h>
+#include <linux/percpu.h>
+#include <linux/profile.h>
+#include <linux/sched.h>
+#include <linux/tick.h>
+
+#include "tick-internal.h"
+
+/*
+ * Tick devices
+ */
+DEFINE_PER_CPU(struct tick_device, tick_cpu_device);
+/*
+ * Tick next event: keeps track of the tick time
+ */
+ktime_t tick_next_period;
+ktime_t tick_period;
+static int tick_do_timer_cpu = -1;
+DEFINE_SPINLOCK(tick_device_lock);
+
+/*
+ * Debugging: see timer_list.c
+ */
+struct tick_device *tick_get_device(int cpu)
+{
+       return &per_cpu(tick_cpu_device, cpu);
+}
+
+/**
+ * tick_is_oneshot_available - check for a oneshot capable event device
+ */
+int tick_is_oneshot_available(void)
+{
+       struct clock_event_device *dev = __get_cpu_var(tick_cpu_device).evtdev;
+
+       return dev && (dev->features & CLOCK_EVT_FEAT_ONESHOT);
+}
+
+/*
+ * Periodic tick
+ */
+static void tick_periodic(int cpu)
+{
+       if (tick_do_timer_cpu == cpu) {
+               write_seqlock(&xtime_lock);
+
+               /* Keep track of the next tick event */
+               tick_next_period = ktime_add(tick_next_period, tick_period);
+
+               do_timer(1);
+               write_sequnlock(&xtime_lock);
+       }
+
+       update_process_times(user_mode(get_irq_regs()));
+       profile_tick(CPU_PROFILING);
+}
+
+/*
+ * Event handler for periodic ticks
+ */
+void tick_handle_periodic(struct clock_event_device *dev)
+{
+       int cpu = smp_processor_id();
+
+       tick_periodic(cpu);
+
+       if (dev->mode != CLOCK_EVT_MODE_ONESHOT)
+               return;
+       /*
+        * Setup the next period for devices, which do not have
+        * periodic mode:
+        */
+       for (;;) {
+               ktime_t next = ktime_add(dev->next_event, tick_period);
+
+               if (!clockevents_program_event(dev, next, ktime_get()))
+                       return;
+               tick_periodic(cpu);
+       }
+}
+
+/*
+ * Setup the device for a periodic tick
+ */
+void tick_setup_periodic(struct clock_event_device *dev, int broadcast)
+{
+       tick_set_periodic_handler(dev, broadcast);
+
+       /* Broadcast setup ? */
+       if (!tick_device_is_functional(dev))
+               return;
+
+       if (dev->features & CLOCK_EVT_FEAT_PERIODIC) {
+               clockevents_set_mode(dev, CLOCK_EVT_MODE_PERIODIC);
+       } else {
+               unsigned long seq;
+               ktime_t next;
+
+               do {
+                       seq = read_seqbegin(&xtime_lock);
+                       next = tick_next_period;
+               } while (read_seqretry(&xtime_lock, seq));
+
+               clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT);
+
+               for (;;) {
+                       if (!clockevents_program_event(dev, next, ktime_get()))
+                               return;
+                       next = ktime_add(next, tick_period);
+               }
+       }
+}
+
+/*
+ * Setup the tick device
+ */
+static void tick_setup_device(struct tick_device *td,
+                             struct clock_event_device *newdev, int cpu,
+                             cpumask_t cpumask)
+{
+       ktime_t next_event;
+       void (*handler)(struct clock_event_device *) = NULL;
+
+       /*
+        * First device setup ?
+        */
+       if (!td->evtdev) {
+               /*
+                * If no cpu took the do_timer update, assign it to
+                * this cpu:
+                */
+               if (tick_do_timer_cpu == -1) {
+                       tick_do_timer_cpu = cpu;
+                       tick_next_period = ktime_get();
+                       tick_period = ktime_set(0, NSEC_PER_SEC / HZ);
+               }
+
+               /*
+                * Startup in periodic mode first.
+                */
+               td->mode = TICKDEV_MODE_PERIODIC;
+       } else {
+               handler = td->evtdev->event_handler;
+               next_event = td->evtdev->next_event;
+       }
+
+       td->evtdev = newdev;
+
+       /*
+        * When the device is not per cpu, pin the interrupt to the
+        * current cpu:
+        */
+       if (!cpus_equal(newdev->cpumask, cpumask))
+               irq_set_affinity(newdev->irq, cpumask);
+
+       /*
+        * When global broadcasting is active, check if the current
+        * device is registered as a placeholder for broadcast mode.
+        * This allows us to handle this x86 misfeature in a generic
+        * way.
+        */
+       if (tick_device_uses_broadcast(newdev, cpu))
+               return;
+
+       if (td->mode == TICKDEV_MODE_PERIODIC)
+               tick_setup_periodic(newdev, 0);
+       else
+               tick_setup_oneshot(newdev, handler, next_event);
+}
+
+/*
+ * Check, if the new registered device should be used.
+ */
+static int tick_check_new_device(struct clock_event_device *newdev)
+{
+       struct clock_event_device *curdev;
+       struct tick_device *td;
+       int cpu, ret = NOTIFY_OK;
+       unsigned long flags;
+       cpumask_t cpumask;
+
+       spin_lock_irqsave(&tick_device_lock, flags);
+
+       cpu = smp_processor_id();
+       if (!cpu_isset(cpu, newdev->cpumask))
+               goto out;
+
+       td = &per_cpu(tick_cpu_device, cpu);
+       curdev = td->evtdev;
+       cpumask = cpumask_of_cpu(cpu);
+
+       /* cpu local device ? */
+       if (!cpus_equal(newdev->cpumask, cpumask)) {
+
+               /*
+                * If the cpu affinity of the device interrupt can not
+                * be set, ignore it.
+                */
+               if (!irq_can_set_affinity(newdev->irq))
+                       goto out_bc;
+
+               /*
+                * If we have a cpu local device already, do not replace it
+                * by a non cpu local device
+                */
+               if (curdev && cpus_equal(curdev->cpumask, cpumask))
+                       goto out_bc;
+       }
+
+       /*
+        * If we have an active device, then check the rating and the oneshot
+        * feature.
+        */
+       if (curdev) {
+               /*
+                * Prefer one shot capable devices !
+                */
+               if ((curdev->features & CLOCK_EVT_FEAT_ONESHOT) &&
+                   !(newdev->features & CLOCK_EVT_FEAT_ONESHOT))
+                       goto out_bc;
+               /*
+                * Check the rating
+                */
+               if (curdev->rating >= newdev->rating)
+                       goto out_bc;
+       }
+
+       /*
+        * Replace the eventually existing device by the new
+        * device. If the current device is the broadcast device, do
+        * not give it back to the clockevents layer !
+        */
+       if (tick_is_broadcast_device(curdev)) {
+               clockevents_set_mode(curdev, CLOCK_EVT_MODE_SHUTDOWN);
+               curdev = NULL;
+       }
+       clockevents_exchange_device(curdev, newdev);
+       tick_setup_device(td, newdev, cpu, cpumask);
+       if (newdev->features & CLOCK_EVT_FEAT_ONESHOT)
+               tick_oneshot_notify();
+
+       spin_unlock_irqrestore(&tick_device_lock, flags);
+       return NOTIFY_STOP;
+
+out_bc:
+       /*
+        * Can the new device be used as a broadcast device ?
+        */
+       if (tick_check_broadcast_device(newdev))
+               ret = NOTIFY_STOP;
+out:
+       spin_unlock_irqrestore(&tick_device_lock, flags);
+
+       return ret;
+}
+
+/*
+ * Shutdown an event device on a given cpu:
+ *
+ * This is called on a life CPU, when a CPU is dead. So we cannot
+ * access the hardware device itself.
+ * We just set the mode and remove it from the lists.
+ */
+static void tick_shutdown(unsigned int *cpup)
+{
+       struct tick_device *td = &per_cpu(tick_cpu_device, *cpup);
+       struct clock_event_device *dev = td->evtdev;
+       unsigned long flags;
+
+       spin_lock_irqsave(&tick_device_lock, flags);
+       td->mode = TICKDEV_MODE_PERIODIC;
+       if (dev) {
+               /*
+                * Prevent that the clock events layer tries to call
+                * the set mode function!
+                */
+               dev->mode = CLOCK_EVT_MODE_UNUSED;
+               clockevents_exchange_device(dev, NULL);
+               td->evtdev = NULL;
+       }
+       spin_unlock_irqrestore(&tick_device_lock, flags);
+}
+
+/*
+ * Notification about clock event devices
+ */
+static int tick_notify(struct notifier_block *nb, unsigned long reason,
+                              void *dev)
+{
+       switch (reason) {
+
+       case CLOCK_EVT_NOTIFY_ADD:
+               return tick_check_new_device(dev);
+
+       case CLOCK_EVT_NOTIFY_BROADCAST_ON:
+       case CLOCK_EVT_NOTIFY_BROADCAST_OFF:
+               tick_broadcast_on_off(reason, dev);
+               break;
+
+       case CLOCK_EVT_NOTIFY_BROADCAST_ENTER:
+       case CLOCK_EVT_NOTIFY_BROADCAST_EXIT:
+               tick_broadcast_oneshot_control(reason);
+               break;
+
+       case CLOCK_EVT_NOTIFY_CPU_DEAD:
+               tick_shutdown_broadcast_oneshot(dev);
+               tick_shutdown_broadcast(dev);
+               tick_shutdown(dev);
+               break;
+
+       default:
+               break;
+       }
+
+       return NOTIFY_OK;
+}
+
+static struct notifier_block tick_notifier = {
+       .notifier_call = tick_notify,
+};
+
+/**
+ * tick_init - initialize the tick control
+ *
+ * Register the notifier with the clockevents framework
+ */
+void __init tick_init(void)
+{
+       clockevents_register_notifier(&tick_notifier);
+}
diff --git a/kernel/time/tick-internal.h b/kernel/time/tick-internal.h
new file mode 100644 (file)
index 0000000..54861a0
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * tick internal variable and functions used by low/high res code
+ */
+DECLARE_PER_CPU(struct tick_device, tick_cpu_device);
+extern spinlock_t tick_device_lock;
+extern ktime_t tick_next_period;
+extern ktime_t tick_period;
+
+extern void tick_setup_periodic(struct clock_event_device *dev, int broadcast);
+extern void tick_handle_periodic(struct clock_event_device *dev);
+
+/*
+ * NO_HZ / high resolution timer shared code
+ */
+#ifdef CONFIG_TICK_ONESHOT
+extern void tick_setup_oneshot(struct clock_event_device *newdev,
+                              void (*handler)(struct clock_event_device *),
+                              ktime_t nextevt);
+extern int tick_program_event(ktime_t expires, int force);
+extern void tick_oneshot_notify(void);
+extern int tick_switch_to_oneshot(void (*handler)(struct clock_event_device *));
+
+# ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
+extern void tick_broadcast_setup_oneshot(struct clock_event_device *bc);
+extern void tick_broadcast_oneshot_control(unsigned long reason);
+extern void tick_broadcast_switch_to_oneshot(void);
+extern void tick_shutdown_broadcast_oneshot(unsigned int *cpup);
+# else /* BROADCAST */
+static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
+{
+       BUG();
+}
+static inline void tick_broadcast_oneshot_control(unsigned long reason) { }
+static inline void tick_broadcast_switch_to_oneshot(void) { }
+static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { }
+# endif /* !BROADCAST */
+
+#else /* !ONESHOT */
+static inline
+void tick_setup_oneshot(struct clock_event_device *newdev,
+                       void (*handler)(struct clock_event_device *),
+                       ktime_t nextevt)
+{
+       BUG();
+}
+static inline int tick_program_event(ktime_t expires, int force)
+{
+       return 0;
+}
+static inline void tick_oneshot_notify(void) { }
+static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
+{
+       BUG();
+}
+static inline void tick_broadcast_oneshot_control(unsigned long reason) { }
+static inline void tick_shutdown_broadcast_oneshot(unsigned int *cpup) { }
+#endif /* !TICK_ONESHOT */
+
+/*
+ * Broadcasting support
+ */
+#ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
+extern int tick_do_broadcast(cpumask_t mask);
+
+extern int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu);
+extern int tick_check_broadcast_device(struct clock_event_device *dev);
+extern int tick_is_broadcast_device(struct clock_event_device *dev);
+extern void tick_broadcast_on_off(unsigned long reason, int *oncpu);
+extern void tick_shutdown_broadcast(unsigned int *cpup);
+
+extern void
+tick_set_periodic_handler(struct clock_event_device *dev, int broadcast);
+
+#else /* !BROADCAST */
+
+static inline int tick_check_broadcast_device(struct clock_event_device *dev)
+{
+       return 0;
+}
+
+static inline int tick_is_broadcast_device(struct clock_event_device *dev)
+{
+       return 0;
+}
+static inline int tick_device_uses_broadcast(struct clock_event_device *dev,
+                                            int cpu)
+{
+       return 0;
+}
+static inline void tick_do_periodic_broadcast(struct clock_event_device *d) { }
+static inline void tick_broadcast_on_off(unsigned long reason, int *oncpu) { }
+static inline void tick_shutdown_broadcast(unsigned int *cpup) { }
+
+/*
+ * Set the periodic handler in non broadcast mode
+ */
+static inline void tick_set_periodic_handler(struct clock_event_device *dev,
+                                            int broadcast)
+{
+       dev->event_handler = tick_handle_periodic;
+}
+#endif /* !BROADCAST */
+
+/*
+ * Check, if the device is functional or a dummy for broadcast
+ */
+static inline int tick_device_is_functional(struct clock_event_device *dev)
+{
+       return !(dev->features & CLOCK_EVT_FEAT_DUMMY);
+}
diff --git a/kernel/time/tick-oneshot.c b/kernel/time/tick-oneshot.c
new file mode 100644 (file)
index 0000000..2e8b7ff
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * linux/kernel/time/tick-oneshot.c
+ *
+ * This file contains functions which manage high resolution tick
+ * related events.
+ *
+ * Copyright(C) 2005-2006, Thomas Gleixner <tglx@linutronix.de>
+ * Copyright(C) 2005-2007, Red Hat, Inc., Ingo Molnar
+ * Copyright(C) 2006-2007, Timesys Corp., Thomas Gleixner
+ *
+ * This code is licenced under the GPL version 2. For details see
+ * kernel-base/COPYING.
+ */
+#include <linux/cpu.h>
+#include <linux/err.h>
+#include <linux/hrtimer.h>
+#include <linux/irq.h>
+#include <linux/percpu.h>
+#include <linux/profile.h>
+#include <linux/sched.h>
+#include <linux/tick.h>
+
+#include "tick-internal.h"
+
+/**
+ * tick_program_event
+ */
+int tick_program_event(ktime_t expires, int force)
+{
+       struct clock_event_device *dev = __get_cpu_var(tick_cpu_device).evtdev;
+       ktime_t now = ktime_get();
+
+       while (1) {
+               int ret = clockevents_program_event(dev, expires, now);
+
+               if (!ret || !force)
+                       return ret;
+               now = ktime_get();
+               expires = ktime_add(now, ktime_set(0, dev->min_delta_ns));
+       }
+}
+
+/**
+ * tick_setup_oneshot - setup the event device for oneshot mode (hres or nohz)
+ */
+void tick_setup_oneshot(struct clock_event_device *newdev,
+                       void (*handler)(struct clock_event_device *),
+                       ktime_t next_event)
+{
+       newdev->event_handler = handler;
+       clockevents_set_mode(newdev, CLOCK_EVT_MODE_ONESHOT);
+       clockevents_program_event(newdev, next_event, ktime_get());
+}
+
+/**
+ * tick_switch_to_oneshot - switch to oneshot mode
+ */
+int tick_switch_to_oneshot(void (*handler)(struct clock_event_device *))
+{
+       struct tick_device *td = &__get_cpu_var(tick_cpu_device);
+       struct clock_event_device *dev = td->evtdev;
+
+       if (!dev || !(dev->features & CLOCK_EVT_FEAT_ONESHOT) ||
+           !tick_device_is_functional(dev))
+               return -EINVAL;
+
+       td->mode = TICKDEV_MODE_ONESHOT;
+       dev->event_handler = handler;
+       clockevents_set_mode(dev, CLOCK_EVT_MODE_ONESHOT);
+       tick_broadcast_switch_to_oneshot();
+       return 0;
+}
+
+#ifdef CONFIG_HIGH_RES_TIMERS
+/**
+ * tick_init_highres - switch to high resolution mode
+ *
+ * Called with interrupts disabled.
+ */
+int tick_init_highres(void)
+{
+       return tick_switch_to_oneshot(hrtimer_interrupt);
+}
+#endif
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
new file mode 100644 (file)
index 0000000..95e41f7
--- /dev/null
@@ -0,0 +1,563 @@
+/*
+ *  linux/kernel/time/tick-sched.c
+ *
+ *  Copyright(C) 2005-2006, Thomas Gleixner <tglx@linutronix.de>
+ *  Copyright(C) 2005-2007, Red Hat, Inc., Ingo Molnar
+ *  Copyright(C) 2006-2007  Timesys Corp., Thomas Gleixner
+ *
+ *  No idle tick implementation for low and high resolution timers
+ *
+ *  Started by: Thomas Gleixner and Ingo Molnar
+ *
+ *  For licencing details see kernel-base/COPYING
+ */
+#include <linux/cpu.h>
+#include <linux/err.h>
+#include <linux/hrtimer.h>
+#include <linux/interrupt.h>
+#include <linux/kernel_stat.h>
+#include <linux/percpu.h>
+#include <linux/profile.h>
+#include <linux/sched.h>
+#include <linux/tick.h>
+
+#include "tick-internal.h"
+
+/*
+ * Per cpu nohz control structure
+ */
+static DEFINE_PER_CPU(struct tick_sched, tick_cpu_sched);
+
+/*
+ * The time, when the last jiffy update happened. Protected by xtime_lock.
+ */
+static ktime_t last_jiffies_update;
+
+struct tick_sched *tick_get_tick_sched(int cpu)
+{
+       return &per_cpu(tick_cpu_sched, cpu);
+}
+
+/*
+ * Must be called with interrupts disabled !
+ */
+static void tick_do_update_jiffies64(ktime_t now)
+{
+       unsigned long ticks = 0;
+       ktime_t delta;
+
+       /* Reevalute with xtime_lock held */
+       write_seqlock(&xtime_lock);
+
+       delta = ktime_sub(now, last_jiffies_update);
+       if (delta.tv64 >= tick_period.tv64) {
+
+               delta = ktime_sub(delta, tick_period);
+               last_jiffies_update = ktime_add(last_jiffies_update,
+                                               tick_period);
+
+               /* Slow path for long timeouts */
+               if (unlikely(delta.tv64 >= tick_period.tv64)) {
+                       s64 incr = ktime_to_ns(tick_period);
+
+                       ticks = ktime_divns(delta, incr);
+
+                       last_jiffies_update = ktime_add_ns(last_jiffies_update,
+                                                          incr * ticks);
+               }
+               do_timer(++ticks);
+       }
+       write_sequnlock(&xtime_lock);
+}
+
+/*
+ * Initialize and return retrieve the jiffies update.
+ */
+static ktime_t tick_init_jiffy_update(void)
+{
+       ktime_t period;
+
+       write_seqlock(&xtime_lock);
+       /* Did we start the jiffies update yet ? */
+       if (last_jiffies_update.tv64 == 0)
+               last_jiffies_update = tick_next_period;
+       period = last_jiffies_update;
+       write_sequnlock(&xtime_lock);
+       return period;
+}
+
+/*
+ * NOHZ - aka dynamic tick functionality
+ */
+#ifdef CONFIG_NO_HZ
+/*
+ * NO HZ enabled ?
+ */
+static int tick_nohz_enabled __read_mostly  = 1;
+
+/*
+ * Enable / Disable tickless mode
+ */
+static int __init setup_tick_nohz(char *str)
+{
+       if (!strcmp(str, "off"))
+               tick_nohz_enabled = 0;
+       else if (!strcmp(str, "on"))
+               tick_nohz_enabled = 1;
+       else
+               return 0;
+       return 1;
+}
+
+__setup("nohz=", setup_tick_nohz);
+
+/**
+ * tick_nohz_update_jiffies - update jiffies when idle was interrupted
+ *
+ * Called from interrupt entry when the CPU was idle
+ *
+ * In case the sched_tick was stopped on this CPU, we have to check if jiffies
+ * must be updated. Otherwise an interrupt handler could use a stale jiffy
+ * value. We do this unconditionally on any cpu, as we don't know whether the
+ * cpu, which has the update task assigned is in a long sleep.
+ */
+void tick_nohz_update_jiffies(void)
+{
+       int cpu = smp_processor_id();
+       struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
+       unsigned long flags;
+       ktime_t now;
+
+       if (!ts->tick_stopped)
+               return;
+
+       cpu_clear(cpu, nohz_cpu_mask);
+       now = ktime_get();
+
+       local_irq_save(flags);
+       tick_do_update_jiffies64(now);
+       local_irq_restore(flags);
+}
+
+/**
+ * tick_nohz_stop_sched_tick - stop the idle tick from the idle task
+ *
+ * When the next event is more than a tick into the future, stop the idle tick
+ * Called either from the idle loop or from irq_exit() when an idle period was
+ * just interrupted by an interrupt which did not cause a reschedule.
+ */
+void tick_nohz_stop_sched_tick(void)
+{
+       unsigned long seq, last_jiffies, next_jiffies, delta_jiffies, flags;
+       struct tick_sched *ts;
+       ktime_t last_update, expires, now, delta;
+       int cpu;
+
+       local_irq_save(flags);
+
+       cpu = smp_processor_id();
+       ts = &per_cpu(tick_cpu_sched, cpu);
+
+       if (unlikely(ts->nohz_mode == NOHZ_MODE_INACTIVE))
+               goto end;
+
+       if (need_resched())
+               goto end;
+
+       cpu = smp_processor_id();
+       BUG_ON(local_softirq_pending());
+
+       now = ktime_get();
+       /*
+        * When called from irq_exit we need to account the idle sleep time
+        * correctly.
+        */
+       if (ts->tick_stopped) {
+               delta = ktime_sub(now, ts->idle_entrytime);
+               ts->idle_sleeptime = ktime_add(ts->idle_sleeptime, delta);
+       }
+
+       ts->idle_entrytime = now;
+       ts->idle_calls++;
+
+       /* Read jiffies and the time when jiffies were updated last */
+       do {
+               seq = read_seqbegin(&xtime_lock);
+               last_update = last_jiffies_update;
+               last_jiffies = jiffies;
+       } while (read_seqretry(&xtime_lock, seq));
+
+       /* Get the next timer wheel timer */
+       next_jiffies = get_next_timer_interrupt(last_jiffies);
+       delta_jiffies = next_jiffies - last_jiffies;
+
+       /*
+        * Do not stop the tick, if we are only one off
+        * or if the cpu is required for rcu
+        */
+       if (!ts->tick_stopped && (delta_jiffies == 1 || rcu_needs_cpu(cpu)))
+               goto out;
+
+       /* Schedule the tick, if we are at least one jiffie off */
+       if ((long)delta_jiffies >= 1) {
+
+               if (rcu_needs_cpu(cpu))
+                       delta_jiffies = 1;
+               else
+                       cpu_set(cpu, nohz_cpu_mask);
+               /*
+                * nohz_stop_sched_tick can be called several times before
+                * the nohz_restart_sched_tick is called. This happens when
+                * interrupts arrive which do not cause a reschedule. In the
+                * first call we save the current tick time, so we can restart
+                * the scheduler tick in nohz_restart_sched_tick.
+                */
+               if (!ts->tick_stopped) {
+                       ts->idle_tick = ts->sched_timer.expires;
+                       ts->tick_stopped = 1;
+                       ts->idle_jiffies = last_jiffies;
+               }
+               /*
+                * calculate the expiry time for the next timer wheel
+                * timer
+                */
+               expires = ktime_add_ns(last_update, tick_period.tv64 *
+                                      delta_jiffies);
+               ts->idle_expires = expires;
+               ts->idle_sleeps++;
+
+               if (ts->nohz_mode == NOHZ_MODE_HIGHRES) {
+                       hrtimer_start(&ts->sched_timer, expires,
+                                     HRTIMER_MODE_ABS);
+                       /* Check, if the timer was already in the past */
+                       if (hrtimer_active(&ts->sched_timer))
+                               goto out;
+               } else if(!tick_program_event(expires, 0))
+                               goto out;
+               /*
+                * We are past the event already. So we crossed a
+                * jiffie boundary. Update jiffies and raise the
+                * softirq.
+                */
+               tick_do_update_jiffies64(ktime_get());
+               cpu_clear(cpu, nohz_cpu_mask);
+       }
+       raise_softirq_irqoff(TIMER_SOFTIRQ);
+out:
+       ts->next_jiffies = next_jiffies;
+       ts->last_jiffies = last_jiffies;
+end:
+       local_irq_restore(flags);
+}
+
+/**
+ * nohz_restart_sched_tick - restart the idle tick from the idle task
+ *
+ * Restart the idle tick when the CPU is woken up from idle
+ */
+void tick_nohz_restart_sched_tick(void)
+{
+       int cpu = smp_processor_id();
+       struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
+       unsigned long ticks;
+       ktime_t now, delta;
+
+       if (!ts->tick_stopped)
+               return;
+
+       /* Update jiffies first */
+       now = ktime_get();
+
+       local_irq_disable();
+       tick_do_update_jiffies64(now);
+       cpu_clear(cpu, nohz_cpu_mask);
+
+       /* Account the idle time */
+       delta = ktime_sub(now, ts->idle_entrytime);
+       ts->idle_sleeptime = ktime_add(ts->idle_sleeptime, delta);
+
+       /*
+        * We stopped the tick in idle. Update process times would miss the
+        * time we slept as update_process_times does only a 1 tick
+        * accounting. Enforce that this is accounted to idle !
+        */
+       ticks = jiffies - ts->idle_jiffies;
+       /*
+        * We might be one off. Do not randomly account a huge number of ticks!
+        */
+       if (ticks && ticks < LONG_MAX) {
+               add_preempt_count(HARDIRQ_OFFSET);
+               account_system_time(current, HARDIRQ_OFFSET,
+                                   jiffies_to_cputime(ticks));
+               sub_preempt_count(HARDIRQ_OFFSET);
+       }
+
+       /*
+        * Cancel the scheduled timer and restore the tick
+        */
+       ts->tick_stopped  = 0;
+       hrtimer_cancel(&ts->sched_timer);
+       ts->sched_timer.expires = ts->idle_tick;
+
+       while (1) {
+               /* Forward the time to expire in the future */
+               hrtimer_forward(&ts->sched_timer, now, tick_period);
+
+               if (ts->nohz_mode == NOHZ_MODE_HIGHRES) {
+                       hrtimer_start(&ts->sched_timer,
+                                     ts->sched_timer.expires,
+                                     HRTIMER_MODE_ABS);
+                       /* Check, if the timer was already in the past */
+                       if (hrtimer_active(&ts->sched_timer))
+                               break;
+               } else {
+                       if (!tick_program_event(ts->sched_timer.expires, 0))
+                               break;
+               }
+               /* Update jiffies and reread time */
+               tick_do_update_jiffies64(now);
+               now = ktime_get();
+       }
+       local_irq_enable();
+}
+
+static int tick_nohz_reprogram(struct tick_sched *ts, ktime_t now)
+{
+       hrtimer_forward(&ts->sched_timer, now, tick_period);
+       return tick_program_event(ts->sched_timer.expires, 0);
+}
+
+/*
+ * The nohz low res interrupt handler
+ */
+static void tick_nohz_handler(struct clock_event_device *dev)
+{
+       struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
+       struct pt_regs *regs = get_irq_regs();
+       ktime_t now = ktime_get();
+
+       dev->next_event.tv64 = KTIME_MAX;
+
+       /* Check, if the jiffies need an update */
+       tick_do_update_jiffies64(now);
+
+       /*
+        * When we are idle and the tick is stopped, we have to touch
+        * the watchdog as we might not schedule for a really long
+        * time. This happens on complete idle SMP systems while
+        * waiting on the login prompt. We also increment the "start
+        * of idle" jiffy stamp so the idle accounting adjustment we
+        * do when we go busy again does not account too much ticks.
+        */
+       if (ts->tick_stopped) {
+               touch_softlockup_watchdog();
+               ts->idle_jiffies++;
+       }
+
+       update_process_times(user_mode(regs));
+       profile_tick(CPU_PROFILING);
+
+       /* Do not restart, when we are in the idle loop */
+       if (ts->tick_stopped)
+               return;
+
+       while (tick_nohz_reprogram(ts, now)) {
+               now = ktime_get();
+               tick_do_update_jiffies64(now);
+       }
+}
+
+/**
+ * tick_nohz_switch_to_nohz - switch to nohz mode
+ */
+static void tick_nohz_switch_to_nohz(void)
+{
+       struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
+       ktime_t next;
+
+       if (!tick_nohz_enabled)
+               return;
+
+       local_irq_disable();
+       if (tick_switch_to_oneshot(tick_nohz_handler)) {
+               local_irq_enable();
+               return;
+       }
+
+       ts->nohz_mode = NOHZ_MODE_LOWRES;
+
+       /*
+        * Recycle the hrtimer in ts, so we can share the
+        * hrtimer_forward with the highres code.
+        */
+       hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
+       /* Get the next period */
+       next = tick_init_jiffy_update();
+
+       for (;;) {
+               ts->sched_timer.expires = next;
+               if (!tick_program_event(next, 0))
+                       break;
+               next = ktime_add(next, tick_period);
+       }
+       local_irq_enable();
+
+       printk(KERN_INFO "Switched to NOHz mode on CPU #%d\n",
+              smp_processor_id());
+}
+
+#else
+
+static inline void tick_nohz_switch_to_nohz(void) { }
+
+#endif /* NO_HZ */
+
+/*
+ * High resolution timer specific code
+ */
+#ifdef CONFIG_HIGH_RES_TIMERS
+/*
+ * We rearm the timer until we get disabled by the idle code
+ * Called with interrupts disabled and timer->base->cpu_base->lock held.
+ */
+static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer)
+{
+       struct tick_sched *ts =
+               container_of(timer, struct tick_sched, sched_timer);
+       struct hrtimer_cpu_base *base = timer->base->cpu_base;
+       struct pt_regs *regs = get_irq_regs();
+       ktime_t now = ktime_get();
+
+       /* Check, if the jiffies need an update */
+       tick_do_update_jiffies64(now);
+
+       /*
+        * Do not call, when we are not in irq context and have
+        * no valid regs pointer
+        */
+       if (regs) {
+               /*
+                * When we are idle and the tick is stopped, we have to touch
+                * the watchdog as we might not schedule for a really long
+                * time. This happens on complete idle SMP systems while
+                * waiting on the login prompt. We also increment the "start of
+                * idle" jiffy stamp so the idle accounting adjustment we do
+                * when we go busy again does not account too much ticks.
+                */
+               if (ts->tick_stopped) {
+                       touch_softlockup_watchdog();
+                       ts->idle_jiffies++;
+               }
+               /*
+                * update_process_times() might take tasklist_lock, hence
+                * drop the base lock. sched-tick hrtimers are per-CPU and
+                * never accessible by userspace APIs, so this is safe to do.
+                */
+               spin_unlock(&base->lock);
+               update_process_times(user_mode(regs));
+               profile_tick(CPU_PROFILING);
+               spin_lock(&base->lock);
+       }
+
+       /* Do not restart, when we are in the idle loop */
+       if (ts->tick_stopped)
+               return HRTIMER_NORESTART;
+
+       hrtimer_forward(timer, now, tick_period);
+
+       return HRTIMER_RESTART;
+}
+
+/**
+ * tick_setup_sched_timer - setup the tick emulation timer
+ */
+void tick_setup_sched_timer(void)
+{
+       struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
+       ktime_t now = ktime_get();
+
+       /*
+        * Emulate tick processing via per-CPU hrtimers:
+        */
+       hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
+       ts->sched_timer.function = tick_sched_timer;
+       ts->sched_timer.cb_mode = HRTIMER_CB_IRQSAFE_NO_SOFTIRQ;
+
+       /* Get the next period */
+       ts->sched_timer.expires = tick_init_jiffy_update();
+
+       for (;;) {
+               hrtimer_forward(&ts->sched_timer, now, tick_period);
+               hrtimer_start(&ts->sched_timer, ts->sched_timer.expires,
+                             HRTIMER_MODE_ABS);
+               /* Check, if the timer was already in the past */
+               if (hrtimer_active(&ts->sched_timer))
+                       break;
+               now = ktime_get();
+       }
+
+#ifdef CONFIG_NO_HZ
+       if (tick_nohz_enabled)
+               ts->nohz_mode = NOHZ_MODE_HIGHRES;
+#endif
+}
+
+void tick_cancel_sched_timer(int cpu)
+{
+       struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
+
+       if (ts->sched_timer.base)
+               hrtimer_cancel(&ts->sched_timer);
+       ts->tick_stopped = 0;
+       ts->nohz_mode = NOHZ_MODE_INACTIVE;
+}
+#endif /* HIGH_RES_TIMERS */
+
+/**
+ * Async notification about clocksource changes
+ */
+void tick_clock_notify(void)
+{
+       int cpu;
+
+       for_each_possible_cpu(cpu)
+               set_bit(0, &per_cpu(tick_cpu_sched, cpu).check_clocks);
+}
+
+/*
+ * Async notification about clock event changes
+ */
+void tick_oneshot_notify(void)
+{
+       struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
+
+       set_bit(0, &ts->check_clocks);
+}
+
+/**
+ * Check, if a change happened, which makes oneshot possible.
+ *
+ * Called cyclic from the hrtimer softirq (driven by the timer
+ * softirq) allow_nohz signals, that we can switch into low-res nohz
+ * mode, because high resolution timers are disabled (either compile
+ * or runtime).
+ */
+int tick_check_oneshot_change(int allow_nohz)
+{
+       struct tick_sched *ts = &__get_cpu_var(tick_cpu_sched);
+
+       if (!test_and_clear_bit(0, &ts->check_clocks))
+               return 0;
+
+       if (ts->nohz_mode != NOHZ_MODE_INACTIVE)
+               return 0;
+
+       if (!timekeeping_is_continuous() || !tick_is_oneshot_available())
+               return 0;
+
+       if (!allow_nohz)
+               return 1;
+
+       tick_nohz_switch_to_nohz();
+       return 0;
+}
diff --git a/kernel/time/timer_list.c b/kernel/time/timer_list.c
new file mode 100644 (file)
index 0000000..f82c635
--- /dev/null
@@ -0,0 +1,287 @@
+/*
+ * kernel/time/timer_list.c
+ *
+ * List pending timers
+ *
+ * Copyright(C) 2006, Red Hat, Inc., Ingo Molnar
+ *
+ * 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/proc_fs.h>
+#include <linux/module.h>
+#include <linux/spinlock.h>
+#include <linux/sched.h>
+#include <linux/seq_file.h>
+#include <linux/kallsyms.h>
+#include <linux/tick.h>
+
+#include <asm/uaccess.h>
+
+typedef void (*print_fn_t)(struct seq_file *m, unsigned int *classes);
+
+DECLARE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases);
+
+/*
+ * This allows printing both to /proc/timer_list and
+ * to the console (on SysRq-Q):
+ */
+#define SEQ_printf(m, x...)                    \
+ do {                                          \
+       if (m)                                  \
+               seq_printf(m, x);               \
+       else                                    \
+               printk(x);                      \
+ } while (0)
+
+static void print_name_offset(struct seq_file *m, void *sym)
+{
+       unsigned long addr = (unsigned long)sym;
+       char namebuf[KSYM_NAME_LEN+1];
+       unsigned long size, offset;
+       const char *sym_name;
+       char *modname;
+
+       sym_name = kallsyms_lookup(addr, &size, &offset, &modname, namebuf);
+       if (sym_name)
+               SEQ_printf(m, "%s", sym_name);
+       else
+               SEQ_printf(m, "<%p>", sym);
+}
+
+static void
+print_timer(struct seq_file *m, struct hrtimer *timer, int idx, u64 now)
+{
+#ifdef CONFIG_TIMER_STATS
+       char tmp[TASK_COMM_LEN + 1];
+#endif
+       SEQ_printf(m, " #%d: ", idx);
+       print_name_offset(m, timer);
+       SEQ_printf(m, ", ");
+       print_name_offset(m, timer->function);
+       SEQ_printf(m, ", S:%02lx", timer->state);
+#ifdef CONFIG_TIMER_STATS
+       SEQ_printf(m, ", ");
+       print_name_offset(m, timer->start_site);
+       memcpy(tmp, timer->start_comm, TASK_COMM_LEN);
+       tmp[TASK_COMM_LEN] = 0;
+       SEQ_printf(m, ", %s/%d", tmp, timer->start_pid);
+#endif
+       SEQ_printf(m, "\n");
+       SEQ_printf(m, " # expires at %Ld nsecs [in %Ld nsecs]\n",
+               (unsigned long long)ktime_to_ns(timer->expires),
+               (unsigned long long)(ktime_to_ns(timer->expires) - now));
+}
+
+static void
+print_active_timers(struct seq_file *m, struct hrtimer_clock_base *base,
+                   u64 now)
+{
+       struct hrtimer *timer, tmp;
+       unsigned long next = 0, i;
+       struct rb_node *curr;
+       unsigned long flags;
+
+next_one:
+       i = 0;
+       spin_lock_irqsave(&base->cpu_base->lock, flags);
+
+       curr = base->first;
+       /*
+        * Crude but we have to do this O(N*N) thing, because
+        * we have to unlock the base when printing:
+        */
+       while (curr && i < next) {
+               curr = rb_next(curr);
+               i++;
+       }
+
+       if (curr) {
+
+               timer = rb_entry(curr, struct hrtimer, node);
+               tmp = *timer;
+               spin_unlock_irqrestore(&base->cpu_base->lock, flags);
+
+               print_timer(m, &tmp, i, now);
+               next++;
+               goto next_one;
+       }
+       spin_unlock_irqrestore(&base->cpu_base->lock, flags);
+}
+
+static void
+print_base(struct seq_file *m, struct hrtimer_clock_base *base, u64 now)
+{
+       SEQ_printf(m, "  .index:      %d\n",
+                       base->index);
+       SEQ_printf(m, "  .resolution: %Ld nsecs\n",
+                       (unsigned long long)ktime_to_ns(base->resolution));
+       SEQ_printf(m,   "  .get_time:   ");
+       print_name_offset(m, base->get_time);
+       SEQ_printf(m,   "\n");
+#ifdef CONFIG_HIGH_RES_TIMERS
+       SEQ_printf(m, "  .offset:     %Ld nsecs\n",
+                       ktime_to_ns(base->offset));
+#endif
+       SEQ_printf(m,   "active timers:\n");
+       print_active_timers(m, base, now);
+}
+
+static void print_cpu(struct seq_file *m, int cpu, u64 now)
+{
+       struct hrtimer_cpu_base *cpu_base = &per_cpu(hrtimer_bases, cpu);
+       int i;
+
+       SEQ_printf(m, "\ncpu: %d\n", cpu);
+       for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) {
+               SEQ_printf(m, " clock %d:\n", i);
+               print_base(m, cpu_base->clock_base + i, now);
+       }
+#define P(x) \
+       SEQ_printf(m, "  .%-15s: %Ld\n", #x, (u64)(cpu_base->x))
+#define P_ns(x) \
+       SEQ_printf(m, "  .%-15s: %Ld nsecs\n", #x, \
+               (u64)(ktime_to_ns(cpu_base->x)))
+
+#ifdef CONFIG_HIGH_RES_TIMERS
+       P_ns(expires_next);
+       P(hres_active);
+       P(nr_events);
+#endif
+#undef P
+#undef P_ns
+
+#ifdef CONFIG_TICK_ONESHOT
+# define P(x) \
+       SEQ_printf(m, "  .%-15s: %Ld\n", #x, (u64)(ts->x))
+# define P_ns(x) \
+       SEQ_printf(m, "  .%-15s: %Ld nsecs\n", #x, \
+               (u64)(ktime_to_ns(ts->x)))
+       {
+               struct tick_sched *ts = tick_get_tick_sched(cpu);
+               P(nohz_mode);
+               P_ns(idle_tick);
+               P(tick_stopped);
+               P(idle_jiffies);
+               P(idle_calls);
+               P(idle_sleeps);
+               P_ns(idle_entrytime);
+               P_ns(idle_sleeptime);
+               P(last_jiffies);
+               P(next_jiffies);
+               P_ns(idle_expires);
+               SEQ_printf(m, "jiffies: %Ld\n", (u64)jiffies);
+       }
+#endif
+
+#undef P
+#undef P_ns
+}
+
+#ifdef CONFIG_GENERIC_CLOCKEVENTS
+static void
+print_tickdevice(struct seq_file *m, struct tick_device *td)
+{
+       struct clock_event_device *dev = td->evtdev;
+
+       SEQ_printf(m, "\nTick Device: mode:     %d\n", td->mode);
+
+       SEQ_printf(m, "Clock Event Device: ");
+       if (!dev) {
+               SEQ_printf(m, "<NULL>\n");
+               return;
+       }
+       SEQ_printf(m, "%s\n", dev->name);
+       SEQ_printf(m, " max_delta_ns:   %ld\n", dev->max_delta_ns);
+       SEQ_printf(m, " min_delta_ns:   %ld\n", dev->min_delta_ns);
+       SEQ_printf(m, " mult:           %ld\n", dev->mult);
+       SEQ_printf(m, " shift:          %d\n", dev->shift);
+       SEQ_printf(m, " mode:           %d\n", dev->mode);
+       SEQ_printf(m, " next_event:     %Ld nsecs\n",
+                  (unsigned long long) ktime_to_ns(dev->next_event));
+
+       SEQ_printf(m, " set_next_event: ");
+       print_name_offset(m, dev->set_next_event);
+       SEQ_printf(m, "\n");
+
+       SEQ_printf(m, " set_mode:       ");
+       print_name_offset(m, dev->set_mode);
+       SEQ_printf(m, "\n");
+
+       SEQ_printf(m, " event_handler:  ");
+       print_name_offset(m, dev->event_handler);
+       SEQ_printf(m, "\n");
+}
+
+static void timer_list_show_tickdevices(struct seq_file *m)
+{
+       int cpu;
+
+#ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
+       print_tickdevice(m, tick_get_broadcast_device());
+       SEQ_printf(m, "tick_broadcast_mask: %08lx\n",
+                  tick_get_broadcast_mask()->bits[0]);
+#ifdef CONFIG_TICK_ONESHOT
+       SEQ_printf(m, "tick_broadcast_oneshot_mask: %08lx\n",
+                  tick_get_broadcast_oneshot_mask()->bits[0]);
+#endif
+       SEQ_printf(m, "\n");
+#endif
+       for_each_online_cpu(cpu)
+                  print_tickdevice(m, tick_get_device(cpu));
+       SEQ_printf(m, "\n");
+}
+#else
+static void timer_list_show_tickdevices(struct seq_file *m) { }
+#endif
+
+static int timer_list_show(struct seq_file *m, void *v)
+{
+       u64 now = ktime_to_ns(ktime_get());
+       int cpu;
+
+       SEQ_printf(m, "Timer List Version: v0.3\n");
+       SEQ_printf(m, "HRTIMER_MAX_CLOCK_BASES: %d\n", HRTIMER_MAX_CLOCK_BASES);
+       SEQ_printf(m, "now at %Ld nsecs\n", (unsigned long long)now);
+
+       for_each_online_cpu(cpu)
+               print_cpu(m, cpu, now);
+
+       SEQ_printf(m, "\n");
+       timer_list_show_tickdevices(m);
+
+       return 0;
+}
+
+void sysrq_timer_list_show(void)
+{
+       timer_list_show(NULL, NULL);
+}
+
+static int timer_list_open(struct inode *inode, struct file *filp)
+{
+       return single_open(filp, timer_list_show, NULL);
+}
+
+static struct file_operations timer_list_fops = {
+       .open           = timer_list_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = seq_release,
+};
+
+static int __init init_timer_list_procfs(void)
+{
+       struct proc_dir_entry *pe;
+
+       pe = create_proc_entry("timer_list", 0644, NULL);
+       if (!pe)
+               return -ENOMEM;
+
+       pe->proc_fops = &timer_list_fops;
+
+       return 0;
+}
+__initcall(init_timer_list_procfs);
diff --git a/kernel/time/timer_stats.c b/kernel/time/timer_stats.c
new file mode 100644 (file)
index 0000000..1bc4882
--- /dev/null
@@ -0,0 +1,411 @@
+/*
+ * kernel/time/timer_stats.c
+ *
+ * Collect timer usage statistics.
+ *
+ * Copyright(C) 2006, Red Hat, Inc., Ingo Molnar
+ * Copyright(C) 2006 Timesys Corp., Thomas Gleixner <tglx@timesys.com>
+ *
+ * timer_stats is based on timer_top, a similar functionality which was part of
+ * Con Kolivas dyntick patch set. It was developed by Daniel Petrini at the
+ * Instituto Nokia de Tecnologia - INdT - Manaus. timer_top's design was based
+ * on dynamic allocation of the statistics entries and linear search based
+ * lookup combined with a global lock, rather than the static array, hash
+ * and per-CPU locking which is used by timer_stats. It was written for the
+ * pre hrtimer kernel code and therefore did not take hrtimers into account.
+ * Nevertheless it provided the base for the timer_stats implementation and
+ * was a helpful source of inspiration. Kudos to Daniel and the Nokia folks
+ * for this effort.
+ *
+ * timer_top.c is
+ *     Copyright (C) 2005 Instituto Nokia de Tecnologia - INdT - Manaus
+ *     Written by Daniel Petrini <d.pensator@gmail.com>
+ *     timer_top.c was released under the GNU General Public License version 2
+ *
+ * We export the addresses and counting of timer functions being called,
+ * the pid and cmdline from the owner process if applicable.
+ *
+ * Start/stop data collection:
+ * # echo 1[0] >/proc/timer_stats
+ *
+ * Display the information collected so far:
+ * # cat /proc/timer_stats
+ *
+ * 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/proc_fs.h>
+#include <linux/module.h>
+#include <linux/spinlock.h>
+#include <linux/sched.h>
+#include <linux/seq_file.h>
+#include <linux/kallsyms.h>
+
+#include <asm/uaccess.h>
+
+/*
+ * This is our basic unit of interest: a timer expiry event identified
+ * by the timer, its start/expire functions and the PID of the task that
+ * started the timer. We count the number of times an event happens:
+ */
+struct entry {
+       /*
+        * Hash list:
+        */
+       struct entry            *next;
+
+       /*
+        * Hash keys:
+        */
+       void                    *timer;
+       void                    *start_func;
+       void                    *expire_func;
+       pid_t                   pid;
+
+       /*
+        * Number of timeout events:
+        */
+       unsigned long           count;
+
+       /*
+        * We save the command-line string to preserve
+        * this information past task exit:
+        */
+       char                    comm[TASK_COMM_LEN + 1];
+
+} ____cacheline_aligned_in_smp;
+
+/*
+ * Spinlock protecting the tables - not taken during lookup:
+ */
+static DEFINE_SPINLOCK(table_lock);
+
+/*
+ * Per-CPU lookup locks for fast hash lookup:
+ */
+static DEFINE_PER_CPU(spinlock_t, lookup_lock);
+
+/*
+ * Mutex to serialize state changes with show-stats activities:
+ */
+static DEFINE_MUTEX(show_mutex);
+
+/*
+ * Collection status, active/inactive:
+ */
+static int __read_mostly active;
+
+/*
+ * Beginning/end timestamps of measurement:
+ */
+static ktime_t time_start, time_stop;
+
+/*
+ * tstat entry structs only get allocated while collection is
+ * active and never freed during that time - this simplifies
+ * things quite a bit.
+ *
+ * They get freed when a new collection period is started.
+ */
+#define MAX_ENTRIES_BITS       10
+#define MAX_ENTRIES            (1UL << MAX_ENTRIES_BITS)
+
+static unsigned long nr_entries;
+static struct entry entries[MAX_ENTRIES];
+
+static atomic_t overflow_count;
+
+static void reset_entries(void)
+{
+       nr_entries = 0;
+       memset(entries, 0, sizeof(entries));
+       atomic_set(&overflow_count, 0);
+}
+
+static struct entry *alloc_entry(void)
+{
+       if (nr_entries >= MAX_ENTRIES)
+               return NULL;
+
+       return entries + nr_entries++;
+}
+
+/*
+ * The entries are in a hash-table, for fast lookup:
+ */
+#define TSTAT_HASH_BITS                (MAX_ENTRIES_BITS - 1)
+#define TSTAT_HASH_SIZE                (1UL << TSTAT_HASH_BITS)
+#define TSTAT_HASH_MASK                (TSTAT_HASH_SIZE - 1)
+
+#define __tstat_hashfn(entry)                                          \
+       (((unsigned long)(entry)->timer       ^                         \
+         (unsigned long)(entry)->start_func  ^                         \
+         (unsigned long)(entry)->expire_func ^                         \
+         (unsigned long)(entry)->pid           ) & TSTAT_HASH_MASK)
+
+#define tstat_hashentry(entry) (tstat_hash_table + __tstat_hashfn(entry))
+
+static struct entry *tstat_hash_table[TSTAT_HASH_SIZE] __read_mostly;
+
+static int match_entries(struct entry *entry1, struct entry *entry2)
+{
+       return entry1->timer       == entry2->timer       &&
+              entry1->start_func  == entry2->start_func  &&
+              entry1->expire_func == entry2->expire_func &&
+              entry1->pid         == entry2->pid;
+}
+
+/*
+ * Look up whether an entry matching this item is present
+ * in the hash already. Must be called with irqs off and the
+ * lookup lock held:
+ */
+static struct entry *tstat_lookup(struct entry *entry, char *comm)
+{
+       struct entry **head, *curr, *prev;
+
+       head = tstat_hashentry(entry);
+       curr = *head;
+
+       /*
+        * The fastpath is when the entry is already hashed,
+        * we do this with the lookup lock held, but with the
+        * table lock not held:
+        */
+       while (curr) {
+               if (match_entries(curr, entry))
+                       return curr;
+
+               curr = curr->next;
+       }
+       /*
+        * Slowpath: allocate, set up and link a new hash entry:
+        */
+       prev = NULL;
+       curr = *head;
+
+       spin_lock(&table_lock);
+       /*
+        * Make sure we have not raced with another CPU:
+        */
+       while (curr) {
+               if (match_entries(curr, entry))
+                       goto out_unlock;
+
+               prev = curr;
+               curr = curr->next;
+       }
+
+       curr = alloc_entry();
+       if (curr) {
+               *curr = *entry;
+               curr->count = 0;
+               memcpy(curr->comm, comm, TASK_COMM_LEN);
+               if (prev)
+                       prev->next = curr;
+               else
+                       *head = curr;
+               curr->next = NULL;
+       }
+ out_unlock:
+       spin_unlock(&table_lock);
+
+       return curr;
+}
+
+/**
+ * timer_stats_update_stats - Update the statistics for a timer.
+ * @timer:     pointer to either a timer_list or a hrtimer
+ * @pid:       the pid of the task which set up the timer
+ * @startf:    pointer to the function which did the timer setup
+ * @timerf:    pointer to the timer callback function of the timer
+ * @comm:      name of the process which set up the timer
+ *
+ * When the timer is already registered, then the event counter is
+ * incremented. Otherwise the timer is registered in a free slot.
+ */
+void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
+                             void *timerf, char * comm)
+{
+       /*
+        * It doesnt matter which lock we take:
+        */
+       spinlock_t *lock = &per_cpu(lookup_lock, raw_smp_processor_id());
+       struct entry *entry, input;
+       unsigned long flags;
+
+       input.timer = timer;
+       input.start_func = startf;
+       input.expire_func = timerf;
+       input.pid = pid;
+
+       spin_lock_irqsave(lock, flags);
+       if (!active)
+               goto out_unlock;
+
+       entry = tstat_lookup(&input, comm);
+       if (likely(entry))
+               entry->count++;
+       else
+               atomic_inc(&overflow_count);
+
+ out_unlock:
+       spin_unlock_irqrestore(lock, flags);
+}
+
+static void print_name_offset(struct seq_file *m, unsigned long addr)
+{
+       char namebuf[KSYM_NAME_LEN+1];
+       unsigned long size, offset;
+       const char *sym_name;
+       char *modname;
+
+       sym_name = kallsyms_lookup(addr, &size, &offset, &modname, namebuf);
+       if (sym_name)
+               seq_printf(m, "%s", sym_name);
+       else
+               seq_printf(m, "<%p>", (void *)addr);
+}
+
+static int tstats_show(struct seq_file *m, void *v)
+{
+       struct timespec period;
+       struct entry *entry;
+       unsigned long ms;
+       long events = 0;
+       ktime_t time;
+       int i;
+
+       mutex_lock(&show_mutex);
+       /*
+        * If still active then calculate up to now:
+        */
+       if (active)
+               time_stop = ktime_get();
+
+       time = ktime_sub(time_stop, time_start);
+
+       period = ktime_to_timespec(time);
+       ms = period.tv_nsec / 1000000;
+
+       seq_puts(m, "Timer Stats Version: v0.1\n");
+       seq_printf(m, "Sample period: %ld.%03ld s\n", period.tv_sec, ms);
+       if (atomic_read(&overflow_count))
+               seq_printf(m, "Overflow: %d entries\n",
+                       atomic_read(&overflow_count));
+
+       for (i = 0; i < nr_entries; i++) {
+               entry = entries + i;
+               seq_printf(m, "%4lu, %5d %-16s ",
+                               entry->count, entry->pid, entry->comm);
+
+               print_name_offset(m, (unsigned long)entry->start_func);
+               seq_puts(m, " (");
+               print_name_offset(m, (unsigned long)entry->expire_func);
+               seq_puts(m, ")\n");
+
+               events += entry->count;
+       }
+
+       ms += period.tv_sec * 1000;
+       if (!ms)
+               ms = 1;
+
+       if (events && period.tv_sec)
+               seq_printf(m, "%ld total events, %ld.%ld events/sec\n", events,
+                          events / period.tv_sec, events * 1000 / ms);
+       else
+               seq_printf(m, "%ld total events\n", events);
+
+       mutex_unlock(&show_mutex);
+
+       return 0;
+}
+
+/*
+ * After a state change, make sure all concurrent lookup/update
+ * activities have stopped:
+ */
+static void sync_access(void)
+{
+       unsigned long flags;
+       int cpu;
+
+       for_each_online_cpu(cpu) {
+               spin_lock_irqsave(&per_cpu(lookup_lock, cpu), flags);
+               /* nothing */
+               spin_unlock_irqrestore(&per_cpu(lookup_lock, cpu), flags);
+       }
+}
+
+static ssize_t tstats_write(struct file *file, const char __user *buf,
+                           size_t count, loff_t *offs)
+{
+       char ctl[2];
+
+       if (count != 2 || *offs)
+               return -EINVAL;
+
+       if (copy_from_user(ctl, buf, count))
+               return -EFAULT;
+
+       mutex_lock(&show_mutex);
+       switch (ctl[0]) {
+       case '0':
+               if (active) {
+                       active = 0;
+                       time_stop = ktime_get();
+                       sync_access();
+               }
+               break;
+       case '1':
+               if (!active) {
+                       reset_entries();
+                       time_start = ktime_get();
+                       active = 1;
+               }
+               break;
+       default:
+               count = -EINVAL;
+       }
+       mutex_unlock(&show_mutex);
+
+       return count;
+}
+
+static int tstats_open(struct inode *inode, struct file *filp)
+{
+       return single_open(filp, tstats_show, NULL);
+}
+
+static struct file_operations tstats_fops = {
+       .open           = tstats_open,
+       .read           = seq_read,
+       .write          = tstats_write,
+       .llseek         = seq_lseek,
+       .release        = seq_release,
+};
+
+void __init init_timer_stats(void)
+{
+       int cpu;
+
+       for_each_possible_cpu(cpu)
+               spin_lock_init(&per_cpu(lookup_lock, cpu));
+}
+
+static int __init init_tstats_procfs(void)
+{
+       struct proc_dir_entry *pe;
+
+       pe = create_proc_entry("timer_stats", 0644, NULL);
+       if (!pe)
+               return -ENOMEM;
+
+       pe->proc_fops = &tstats_fops;
+
+       return 0;
+}
+__initcall(init_tstats_procfs);
index c2a8ccfc288210fb45a3ae199c94572edbbc72b4..cb1b86a9c52f5749f767625ffe6f6895f4b476aa 100644 (file)
@@ -34,6 +34,8 @@
 #include <linux/cpu.h>
 #include <linux/syscalls.h>
 #include <linux/delay.h>
+#include <linux/tick.h>
+#include <linux/kallsyms.h>
 
 #include <asm/uaccess.h>
 #include <asm/unistd.h>
@@ -85,7 +87,7 @@ static DEFINE_PER_CPU(tvec_base_t *, tvec_bases) = &boot_tvec_bases;
  * @j: the time in (absolute) jiffies that should be rounded
  * @cpu: the processor number on which the timeout will happen
  *
- * __round_jiffies rounds an absolute time in the future (in jiffies)
+ * __round_jiffies() rounds an absolute time in the future (in jiffies)
  * up or down to (approximately) full seconds. This is useful for timers
  * for which the exact time they fire does not matter too much, as long as
  * they fire approximately every X seconds.
@@ -98,7 +100,7 @@ static DEFINE_PER_CPU(tvec_base_t *, tvec_bases) = &boot_tvec_bases;
  * processors firing at the exact same time, which could lead
  * to lock contention or spurious cache line bouncing.
  *
- * The return value is the rounded version of the "j" parameter.
+ * The return value is the rounded version of the @j parameter.
  */
 unsigned long __round_jiffies(unsigned long j, int cpu)
 {
@@ -142,7 +144,7 @@ EXPORT_SYMBOL_GPL(__round_jiffies);
  * @j: the time in (relative) jiffies that should be rounded
  * @cpu: the processor number on which the timeout will happen
  *
- * __round_jiffies_relative rounds a time delta  in the future (in jiffies)
+ * __round_jiffies_relative() rounds a time delta  in the future (in jiffies)
  * up or down to (approximately) full seconds. This is useful for timers
  * for which the exact time they fire does not matter too much, as long as
  * they fire approximately every X seconds.
@@ -155,7 +157,7 @@ EXPORT_SYMBOL_GPL(__round_jiffies);
  * processors firing at the exact same time, which could lead
  * to lock contention or spurious cache line bouncing.
  *
- * The return value is the rounded version of the "j" parameter.
+ * The return value is the rounded version of the @j parameter.
  */
 unsigned long __round_jiffies_relative(unsigned long j, int cpu)
 {
@@ -173,7 +175,7 @@ EXPORT_SYMBOL_GPL(__round_jiffies_relative);
  * round_jiffies - function to round jiffies to a full second
  * @j: the time in (absolute) jiffies that should be rounded
  *
- * round_jiffies rounds an absolute time in the future (in jiffies)
+ * round_jiffies() rounds an absolute time in the future (in jiffies)
  * up or down to (approximately) full seconds. This is useful for timers
  * for which the exact time they fire does not matter too much, as long as
  * they fire approximately every X seconds.
@@ -182,7 +184,7 @@ EXPORT_SYMBOL_GPL(__round_jiffies_relative);
  * at the same time, rather than at various times spread out. The goal
  * of this is to have the CPU wake up less, which saves power.
  *
- * The return value is the rounded version of the "j" parameter.
+ * The return value is the rounded version of the @j parameter.
  */
 unsigned long round_jiffies(unsigned long j)
 {
@@ -194,7 +196,7 @@ EXPORT_SYMBOL_GPL(round_jiffies);
  * round_jiffies_relative - function to round jiffies to a full second
  * @j: the time in (relative) jiffies that should be rounded
  *
- * round_jiffies_relative rounds a time delta  in the future (in jiffies)
+ * round_jiffies_relative() rounds a time delta  in the future (in jiffies)
  * up or down to (approximately) full seconds. This is useful for timers
  * for which the exact time they fire does not matter too much, as long as
  * they fire approximately every X seconds.
@@ -203,7 +205,7 @@ EXPORT_SYMBOL_GPL(round_jiffies);
  * at the same time, rather than at various times spread out. The goal
  * of this is to have the CPU wake up less, which saves power.
  *
- * The return value is the rounded version of the "j" parameter.
+ * The return value is the rounded version of the @j parameter.
  */
 unsigned long round_jiffies_relative(unsigned long j)
 {
@@ -262,6 +264,18 @@ static void internal_add_timer(tvec_base_t *base, struct timer_list *timer)
        list_add_tail(&timer->entry, vec);
 }
 
+#ifdef CONFIG_TIMER_STATS
+void __timer_stats_timer_set_start_info(struct timer_list *timer, void *addr)
+{
+       if (timer->start_site)
+               return;
+
+       timer->start_site = addr;
+       memcpy(timer->start_comm, current->comm, TASK_COMM_LEN);
+       timer->start_pid = current->pid;
+}
+#endif
+
 /**
  * init_timer - initialize a timer.
  * @timer: the timer to be initialized
@@ -273,11 +287,16 @@ void fastcall init_timer(struct timer_list *timer)
 {
        timer->entry.next = NULL;
        timer->base = __raw_get_cpu_var(tvec_bases);
+#ifdef CONFIG_TIMER_STATS
+       timer->start_site = NULL;
+       timer->start_pid = -1;
+       memset(timer->start_comm, 0, TASK_COMM_LEN);
+#endif
 }
 EXPORT_SYMBOL(init_timer);
 
 static inline void detach_timer(struct timer_list *timer,
-                                       int clear_pending)
+                               int clear_pending)
 {
        struct list_head *entry = &timer->entry;
 
@@ -324,6 +343,7 @@ int __mod_timer(struct timer_list *timer, unsigned long expires)
        unsigned long flags;
        int ret = 0;
 
+       timer_stats_timer_set_start_info(timer);
        BUG_ON(!timer->function);
 
        base = lock_timer_base(timer, &flags);
@@ -374,6 +394,7 @@ void add_timer_on(struct timer_list *timer, int cpu)
        tvec_base_t *base = per_cpu(tvec_bases, cpu);
        unsigned long flags;
 
+       timer_stats_timer_set_start_info(timer);
        BUG_ON(timer_pending(timer) || !timer->function);
        spin_lock_irqsave(&base->lock, flags);
        timer->base = base;
@@ -387,7 +408,7 @@ void add_timer_on(struct timer_list *timer, int cpu)
  * @timer: the timer to be modified
  * @expires: new timeout in jiffies
  *
- * mod_timer is a more efficient way to update the expire field of an
+ * mod_timer() is a more efficient way to update the expire field of an
  * active timer (if the timer is inactive it will be activated)
  *
  * mod_timer(timer, expires) is equivalent to:
@@ -406,6 +427,7 @@ int mod_timer(struct timer_list *timer, unsigned long expires)
 {
        BUG_ON(!timer->function);
 
+       timer_stats_timer_set_start_info(timer);
        /*
         * This is a common optimization triggered by the
         * networking code - if the timer is re-modified
@@ -436,6 +458,7 @@ int del_timer(struct timer_list *timer)
        unsigned long flags;
        int ret = 0;
 
+       timer_stats_timer_clear_start_info(timer);
        if (timer_pending(timer)) {
                base = lock_timer_base(timer, &flags);
                if (timer_pending(timer)) {
@@ -490,7 +513,7 @@ out:
  * the timer it also makes sure the handler has finished executing on other
  * CPUs.
  *
- * Synchronization rules: callers must prevent restarting of the timer,
+ * Synchronization rules: Callers must prevent restarting of the timer,
  * otherwise this function is meaningless. It must not be called from
  * interrupt contexts. The caller must not hold locks which would prevent
  * completion of the timer's handler. The timer's handler must not call
@@ -569,6 +592,8 @@ static inline void __run_timers(tvec_base_t *base)
                        fn = timer->function;
                        data = timer->data;
 
+                       timer_stats_account_timer(timer);
+
                        set_running_timer(base, timer);
                        detach_timer(timer, 1);
                        spin_unlock_irq(&base->lock);
@@ -591,105 +616,124 @@ static inline void __run_timers(tvec_base_t *base)
        spin_unlock_irq(&base->lock);
 }
 
-#ifdef CONFIG_NO_IDLE_HZ
+#if defined(CONFIG_NO_IDLE_HZ) || defined(CONFIG_NO_HZ)
 /*
  * Find out when the next timer event is due to happen. This
  * is used on S/390 to stop all activity when a cpus is idle.
  * This functions needs to be called disabled.
  */
-unsigned long next_timer_interrupt(void)
+static unsigned long __next_timer_interrupt(tvec_base_t *base)
 {
-       tvec_base_t *base;
-       struct list_head *list;
+       unsigned long timer_jiffies = base->timer_jiffies;
+       unsigned long expires = timer_jiffies + (LONG_MAX >> 1);
+       int index, slot, array, found = 0;
        struct timer_list *nte;
-       unsigned long expires;
-       unsigned long hr_expires = MAX_JIFFY_OFFSET;
-       ktime_t hr_delta;
        tvec_t *varray[4];
-       int i, j;
-
-       hr_delta = hrtimer_get_next_event();
-       if (hr_delta.tv64 != KTIME_MAX) {
-               struct timespec tsdelta;
-               tsdelta = ktime_to_timespec(hr_delta);
-               hr_expires = timespec_to_jiffies(&tsdelta);
-               if (hr_expires < 3)
-                       return hr_expires + jiffies;
-       }
-       hr_expires += jiffies;
-
-       base = __get_cpu_var(tvec_bases);
-       spin_lock(&base->lock);
-       expires = base->timer_jiffies + (LONG_MAX >> 1);
-       list = NULL;
 
        /* Look for timer events in tv1. */
-       j = base->timer_jiffies & TVR_MASK;
+       index = slot = timer_jiffies & TVR_MASK;
        do {
-               list_for_each_entry(nte, base->tv1.vec + j, entry) {
+               list_for_each_entry(nte, base->tv1.vec + slot, entry) {
+                       found = 1;
                        expires = nte->expires;
-                       if (j < (base->timer_jiffies & TVR_MASK))
-                               list = base->tv2.vec + (INDEX(0));
-                       goto found;
+                       /* Look at the cascade bucket(s)? */
+                       if (!index || slot < index)
+                               goto cascade;
+                       return expires;
                }
-               j = (j + 1) & TVR_MASK;
-       } while (j != (base->timer_jiffies & TVR_MASK));
+               slot = (slot + 1) & TVR_MASK;
+       } while (slot != index);
+
+cascade:
+       /* Calculate the next cascade event */
+       if (index)
+               timer_jiffies += TVR_SIZE - index;
+       timer_jiffies >>= TVR_BITS;
 
        /* Check tv2-tv5. */
        varray[0] = &base->tv2;
        varray[1] = &base->tv3;
        varray[2] = &base->tv4;
        varray[3] = &base->tv5;
-       for (i = 0; i < 4; i++) {
-               j = INDEX(i);
+
+       for (array = 0; array < 4; array++) {
+               tvec_t *varp = varray[array];
+
+               index = slot = timer_jiffies & TVN_MASK;
                do {
-                       if (list_empty(varray[i]->vec + j)) {
-                               j = (j + 1) & TVN_MASK;
-                               continue;
-                       }
-                       list_for_each_entry(nte, varray[i]->vec + j, entry)
+                       list_for_each_entry(nte, varp->vec + slot, entry) {
+                               found = 1;
                                if (time_before(nte->expires, expires))
                                        expires = nte->expires;
-                       if (j < (INDEX(i)) && i < 3)
-                               list = varray[i + 1]->vec + (INDEX(i + 1));
-                       goto found;
-               } while (j != (INDEX(i)));
-       }
-found:
-       if (list) {
-               /*
-                * The search wrapped. We need to look at the next list
-                * from next tv element that would cascade into tv element
-                * where we found the timer element.
-                */
-               list_for_each_entry(nte, list, entry) {
-                       if (time_before(nte->expires, expires))
-                               expires = nte->expires;
-               }
+                       }
+                       /*
+                        * Do we still search for the first timer or are
+                        * we looking up the cascade buckets ?
+                        */
+                       if (found) {
+                               /* Look at the cascade bucket(s)? */
+                               if (!index || slot < index)
+                                       break;
+                               return expires;
+                       }
+                       slot = (slot + 1) & TVN_MASK;
+               } while (slot != index);
+
+               if (index)
+                       timer_jiffies += TVN_SIZE - index;
+               timer_jiffies >>= TVN_BITS;
        }
-       spin_unlock(&base->lock);
+       return expires;
+}
 
-       /*
-        * It can happen that other CPUs service timer IRQs and increment
-        * jiffies, but we have not yet got a local timer tick to process
-        * the timer wheels.  In that case, the expiry time can be before
-        * jiffies, but since the high-resolution timer here is relative to
-        * jiffies, the default expression when high-resolution timers are
-        * not active,
-        *
-        *   time_before(MAX_JIFFY_OFFSET + jiffies, expires)
-        *
-        * would falsely evaluate to true.  If that is the case, just
-        * return jiffies so that we can immediately fire the local timer
-        */
-       if (time_before(expires, jiffies))
-               return jiffies;
+/*
+ * Check, if the next hrtimer event is before the next timer wheel
+ * event:
+ */
+static unsigned long cmp_next_hrtimer_event(unsigned long now,
+                                           unsigned long expires)
+{
+       ktime_t hr_delta = hrtimer_get_next_event();
+       struct timespec tsdelta;
 
-       if (time_before(hr_expires, expires))
-               return hr_expires;
+       if (hr_delta.tv64 == KTIME_MAX)
+               return expires;
 
+       if (hr_delta.tv64 <= TICK_NSEC)
+               return now;
+
+       tsdelta = ktime_to_timespec(hr_delta);
+       now += timespec_to_jiffies(&tsdelta);
+       if (time_before(now, expires))
+               return now;
        return expires;
 }
+
+/**
+ * next_timer_interrupt - return the jiffy of the next pending timer
+ */
+unsigned long get_next_timer_interrupt(unsigned long now)
+{
+       tvec_base_t *base = __get_cpu_var(tvec_bases);
+       unsigned long expires;
+
+       spin_lock(&base->lock);
+       expires = __next_timer_interrupt(base);
+       spin_unlock(&base->lock);
+
+       if (time_before_eq(expires, now))
+               return now;
+
+       return cmp_next_hrtimer_event(now, expires);
+}
+
+#ifdef CONFIG_NO_IDLE_HZ
+unsigned long next_timer_interrupt(void)
+{
+       return get_next_timer_interrupt(jiffies);
+}
+#endif
+
 #endif
 
 /******************************************************************/
@@ -832,32 +876,35 @@ EXPORT_SYMBOL(do_settimeofday);
  *
  * Accumulates current time interval and initializes new clocksource
  */
-static int change_clocksource(void)
+static void change_clocksource(void)
 {
        struct clocksource *new;
        cycle_t now;
        u64 nsec;
+
        new = clocksource_get_next();
-       if (clock != new) {
-               now = clocksource_read(new);
-               nsec =  __get_nsec_offset();
-               timespec_add_ns(&xtime, nsec);
-
-               clock = new;
-               clock->cycle_last = now;
-               printk(KERN_INFO "Time: %s clocksource has been installed.\n",
-                      clock->name);
-               return 1;
-       } else if (clock->update_callback) {
-               return clock->update_callback();
-       }
-       return 0;
+
+       if (clock == new)
+               return;
+
+       now = clocksource_read(new);
+       nsec =  __get_nsec_offset();
+       timespec_add_ns(&xtime, nsec);
+
+       clock = new;
+       clock->cycle_last = now;
+
+       clock->error = 0;
+       clock->xtime_nsec = 0;
+       clocksource_calculate_interval(clock, NTP_INTERVAL_LENGTH);
+
+       tick_clock_notify();
+
+       printk(KERN_INFO "Time: %s clocksource has been installed.\n",
+              clock->name);
 }
 #else
-static inline int change_clocksource(void)
-{
-       return 0;
-}
+static inline void change_clocksource(void) { }
 #endif
 
 /**
@@ -871,33 +918,56 @@ int timekeeping_is_continuous(void)
        do {
                seq = read_seqbegin(&xtime_lock);
 
-               ret = clock->is_continuous;
+               ret = clock->flags & CLOCK_SOURCE_VALID_FOR_HRES;
 
        } while (read_seqretry(&xtime_lock, seq));
 
        return ret;
 }
 
+/**
+ * read_persistent_clock -  Return time in seconds from the persistent clock.
+ *
+ * Weak dummy function for arches that do not yet support it.
+ * Returns seconds from epoch using the battery backed persistent clock.
+ * Returns zero if unsupported.
+ *
+ *  XXX - Do be sure to remove it once all arches implement it.
+ */
+unsigned long __attribute__((weak)) read_persistent_clock(void)
+{
+       return 0;
+}
+
 /*
  * timekeeping_init - Initializes the clocksource and common timekeeping values
  */
 void __init timekeeping_init(void)
 {
        unsigned long flags;
+       unsigned long sec = read_persistent_clock();
 
        write_seqlock_irqsave(&xtime_lock, flags);
 
        ntp_clear();
 
        clock = clocksource_get_next();
-       clocksource_calculate_interval(clock, tick_nsec);
+       clocksource_calculate_interval(clock, NTP_INTERVAL_LENGTH);
        clock->cycle_last = clocksource_read(clock);
 
+       xtime.tv_sec = sec;
+       xtime.tv_nsec = 0;
+       set_normalized_timespec(&wall_to_monotonic,
+               -xtime.tv_sec, -xtime.tv_nsec);
+
        write_sequnlock_irqrestore(&xtime_lock, flags);
 }
 
-
+/* flag for if timekeeping is suspended */
 static int timekeeping_suspended;
+/* time in seconds when suspend began */
+static unsigned long timekeeping_suspend_time;
+
 /**
  * timekeeping_resume - Resumes the generic timekeeping subsystem.
  * @dev:       unused
@@ -909,13 +979,26 @@ static int timekeeping_suspended;
 static int timekeeping_resume(struct sys_device *dev)
 {
        unsigned long flags;
+       unsigned long now = read_persistent_clock();
 
        write_seqlock_irqsave(&xtime_lock, flags);
-       /* restart the last cycle value */
+
+       if (now && (now > timekeeping_suspend_time)) {
+               unsigned long sleep_length = now - timekeeping_suspend_time;
+
+               xtime.tv_sec += sleep_length;
+               wall_to_monotonic.tv_sec -= sleep_length;
+       }
+       /* re-base the last cycle value */
        clock->cycle_last = clocksource_read(clock);
        clock->error = 0;
        timekeeping_suspended = 0;
        write_sequnlock_irqrestore(&xtime_lock, flags);
+
+       touch_softlockup_watchdog();
+       /* Resume hrtimers */
+       clock_was_set();
+
        return 0;
 }
 
@@ -925,6 +1008,7 @@ static int timekeeping_suspend(struct sys_device *dev, pm_message_t state)
 
        write_seqlock_irqsave(&xtime_lock, flags);
        timekeeping_suspended = 1;
+       timekeeping_suspend_time = read_persistent_clock();
        write_sequnlock_irqrestore(&xtime_lock, flags);
        return 0;
 }
@@ -1089,11 +1173,8 @@ static void update_wall_time(void)
        clock->xtime_nsec -= (s64)xtime.tv_nsec << clock->shift;
 
        /* check to see if there is a new clocksource to use */
-       if (change_clocksource()) {
-               clock->error = 0;
-               clock->xtime_nsec = 0;
-               clocksource_calculate_interval(clock, tick_nsec);
-       }
+       change_clocksource();
+       update_vsyscall(&xtime, clock);
 }
 
 /*
@@ -1162,11 +1243,9 @@ static inline void calc_load(unsigned long ticks)
  * This read-write spinlock protects us from races in SMP while
  * playing with xtime and avenrun.
  */
-#ifndef ARCH_HAVE_XTIME_LOCK
-__cacheline_aligned_in_smp DEFINE_SEQLOCK(xtime_lock);
+__attribute__((weak)) __cacheline_aligned_in_smp DEFINE_SEQLOCK(xtime_lock);
 
 EXPORT_SYMBOL(xtime_lock);
-#endif
 
 /*
  * This function runs timers and the timer-tq in bottom half context.
@@ -1175,7 +1254,8 @@ static void run_timer_softirq(struct softirq_action *h)
 {
        tvec_base_t *base = __get_cpu_var(tvec_bases);
 
-       hrtimer_run_queues();
+       hrtimer_run_queues();
+
        if (time_after_eq(jiffies, base->timer_jiffies))
                __run_timers(base);
 }
@@ -1392,17 +1472,16 @@ asmlinkage long sys_gettid(void)
 }
 
 /**
- * sys_sysinfo - fill in sysinfo struct
+ * do_sysinfo - fill in sysinfo struct
  * @info: pointer to buffer to fill
  */ 
-asmlinkage long sys_sysinfo(struct sysinfo __user *info)
+int do_sysinfo(struct sysinfo *info)
 {
-       struct sysinfo val;
        unsigned long mem_total, sav_total;
        unsigned int mem_unit, bitcount;
        unsigned long seq;
 
-       memset((char *)&val, 0, sizeof(struct sysinfo));
+       memset(info, 0, sizeof(struct sysinfo));
 
        do {
                struct timespec tp;
@@ -1422,17 +1501,17 @@ asmlinkage long sys_sysinfo(struct sysinfo __user *info)
                        tp.tv_nsec = tp.tv_nsec - NSEC_PER_SEC;
                        tp.tv_sec++;
                }
-               val.uptime = tp.tv_sec + (tp.tv_nsec ? 1 : 0);
+               info->uptime = tp.tv_sec + (tp.tv_nsec ? 1 : 0);
 
-               val.loads[0] = avenrun[0] << (SI_LOAD_SHIFT - FSHIFT);
-               val.loads[1] = avenrun[1] << (SI_LOAD_SHIFT - FSHIFT);
-               val.loads[2] = avenrun[2] << (SI_LOAD_SHIFT - FSHIFT);
+               info->loads[0] = avenrun[0] << (SI_LOAD_SHIFT - FSHIFT);
+               info->loads[1] = avenrun[1] << (SI_LOAD_SHIFT - FSHIFT);
+               info->loads[2] = avenrun[2] << (SI_LOAD_SHIFT - FSHIFT);
 
-               val.procs = nr_threads;
+               info->procs = nr_threads;
        } while (read_seqretry(&xtime_lock, seq));
 
-       si_meminfo(&val);
-       si_swapinfo(&val);
+       si_meminfo(info);
+       si_swapinfo(info);
 
        /*
         * If the sum of all the available memory (i.e. ram + swap)
@@ -1443,11 +1522,11 @@ asmlinkage long sys_sysinfo(struct sysinfo __user *info)
         *  -Erik Andersen <andersee@debian.org>
         */
 
-       mem_total = val.totalram + val.totalswap;
-       if (mem_total < val.totalram || mem_total < val.totalswap)
+       mem_total = info->totalram + info->totalswap;
+       if (mem_total < info->totalram || mem_total < info->totalswap)
                goto out;
        bitcount = 0;
-       mem_unit = val.mem_unit;
+       mem_unit = info->mem_unit;
        while (mem_unit > 1) {
                bitcount++;
                mem_unit >>= 1;
@@ -1459,22 +1538,31 @@ asmlinkage long sys_sysinfo(struct sysinfo __user *info)
 
        /*
         * If mem_total did not overflow, multiply all memory values by
-        * val.mem_unit and set it to 1.  This leaves things compatible
+        * info->mem_unit and set it to 1.  This leaves things compatible
         * with 2.2.x, and also retains compatibility with earlier 2.4.x
         * kernels...
         */
 
-       val.mem_unit = 1;
-       val.totalram <<= bitcount;
-       val.freeram <<= bitcount;
-       val.sharedram <<= bitcount;
-       val.bufferram <<= bitcount;
-       val.totalswap <<= bitcount;
-       val.freeswap <<= bitcount;
-       val.totalhigh <<= bitcount;
-       val.freehigh <<= bitcount;
+       info->mem_unit = 1;
+       info->totalram <<= bitcount;
+       info->freeram <<= bitcount;
+       info->sharedram <<= bitcount;
+       info->bufferram <<= bitcount;
+       info->totalswap <<= bitcount;
+       info->freeswap <<= bitcount;
+       info->totalhigh <<= bitcount;
+       info->freehigh <<= bitcount;
+
+out:
+       return 0;
+}
+
+asmlinkage long sys_sysinfo(struct sysinfo __user *info)
+{
+       struct sysinfo val;
+
+       do_sysinfo(&val);
 
- out:
        if (copy_to_user(info, &val, sizeof(struct sysinfo)))
                return -EFAULT;
 
@@ -1613,6 +1701,8 @@ void __init init_timers(void)
        int err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE,
                                (void *)(long)smp_processor_id());
 
+       init_timer_stats();
+
        BUG_ON(err == NOTIFY_BAD);
        register_cpu_notifier(&timers_nb);
        open_softirq(TIMER_SOFTIRQ, run_timer_softirq, NULL);
@@ -1624,7 +1714,7 @@ struct time_interpolator *time_interpolator __read_mostly;
 static struct time_interpolator *time_interpolator_list __read_mostly;
 static DEFINE_SPINLOCK(time_interpolator_lock);
 
-static inline u64 time_interpolator_get_cycles(unsigned int src)
+static inline cycles_t time_interpolator_get_cycles(unsigned int src)
 {
        unsigned long (*x)(void);
 
@@ -1650,8 +1740,8 @@ static inline u64 time_interpolator_get_counter(int writelock)
 
        if (time_interpolator->jitter)
        {
-               u64 lcycle;
-               u64 now;
+               cycles_t lcycle;
+               cycles_t now;
 
                do {
                        lcycle = time_interpolator->last_cycle;
index baacc36914152271e01343e5a4de233e7b8780ba..658f638c402c48fbb307b1a8242c6dfe16d9a1ac 100644 (file)
@@ -22,8 +22,6 @@
 #include <linux/acct.h>
 #include <linux/jiffies.h>
 
-
-#define USEC_PER_TICK  (USEC_PER_SEC/HZ)
 /*
  * fill in basic accounting fields
  */
diff --git a/kernel/utsname_sysctl.c b/kernel/utsname_sysctl.c
new file mode 100644 (file)
index 0000000..f22b9db
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ *  Copyright (C) 2007
+ *
+ *  Author: Eric Biederman <ebiederm@xmision.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, version 2 of the
+ *  License.
+ */
+
+#include <linux/module.h>
+#include <linux/uts.h>
+#include <linux/utsname.h>
+#include <linux/version.h>
+#include <linux/sysctl.h>
+
+static void *get_uts(ctl_table *table, int write)
+{
+       char *which = table->data;
+#ifdef CONFIG_UTS_NS
+       struct uts_namespace *uts_ns = current->nsproxy->uts_ns;
+       which = (which - (char *)&init_uts_ns) + (char *)uts_ns;
+#endif
+       if (!write)
+               down_read(&uts_sem);
+       else
+               down_write(&uts_sem);
+       return which;
+}
+
+static void put_uts(ctl_table *table, int write, void *which)
+{
+       if (!write)
+               up_read(&uts_sem);
+       else
+               up_write(&uts_sem);
+}
+
+#ifdef CONFIG_PROC_FS
+/*
+ *     Special case of dostring for the UTS structure. This has locks
+ *     to observe. Should this be in kernel/sys.c ????
+ */
+static int proc_do_uts_string(ctl_table *table, int write, struct file *filp,
+                 void __user *buffer, size_t *lenp, loff_t *ppos)
+{
+       struct ctl_table uts_table;
+       int r;
+       memcpy(&uts_table, table, sizeof(uts_table));
+       uts_table.data = get_uts(table, write);
+       r = proc_dostring(&uts_table,write,filp,buffer,lenp, ppos);
+       put_uts(table, write, uts_table.data);
+       return r;
+}
+#else
+#define proc_do_uts_string NULL
+#endif
+
+
+#ifdef CONFIG_SYSCTL_SYSCALL
+/* The generic string strategy routine: */
+static int sysctl_uts_string(ctl_table *table, int __user *name, int nlen,
+                 void __user *oldval, size_t __user *oldlenp,
+                 void __user *newval, size_t newlen)
+{
+       struct ctl_table uts_table;
+       int r, write;
+       write = newval && newlen;
+       memcpy(&uts_table, table, sizeof(uts_table));
+       uts_table.data = get_uts(table, write);
+       r = sysctl_string(&uts_table, name, nlen,
+               oldval, oldlenp, newval, newlen);
+       put_uts(table, write, uts_table.data);
+       return r;
+}
+#else
+#define sysctl_uts_string NULL
+#endif
+
+static struct ctl_table uts_kern_table[] = {
+       {
+               .ctl_name       = KERN_OSTYPE,
+               .procname       = "ostype",
+               .data           = init_uts_ns.name.sysname,
+               .maxlen         = sizeof(init_uts_ns.name.sysname),
+               .mode           = 0444,
+               .proc_handler   = proc_do_uts_string,
+               .strategy       = sysctl_uts_string,
+       },
+       {
+               .ctl_name       = KERN_OSRELEASE,
+               .procname       = "osrelease",
+               .data           = init_uts_ns.name.release,
+               .maxlen         = sizeof(init_uts_ns.name.release),
+               .mode           = 0444,
+               .proc_handler   = proc_do_uts_string,
+               .strategy       = sysctl_uts_string,
+       },
+       {
+               .ctl_name       = KERN_VERSION,
+               .procname       = "version",
+               .data           = init_uts_ns.name.version,
+               .maxlen         = sizeof(init_uts_ns.name.version),
+               .mode           = 0444,
+               .proc_handler   = proc_do_uts_string,
+               .strategy       = sysctl_uts_string,
+       },
+       {
+               .ctl_name       = KERN_NODENAME,
+               .procname       = "hostname",
+               .data           = init_uts_ns.name.nodename,
+               .maxlen         = sizeof(init_uts_ns.name.nodename),
+               .mode           = 0644,
+               .proc_handler   = proc_do_uts_string,
+               .strategy       = sysctl_uts_string,
+       },
+       {
+               .ctl_name       = KERN_DOMAINNAME,
+               .procname       = "domainname",
+               .data           = init_uts_ns.name.domainname,
+               .maxlen         = sizeof(init_uts_ns.name.domainname),
+               .mode           = 0644,
+               .proc_handler   = proc_do_uts_string,
+               .strategy       = sysctl_uts_string,
+       },
+       {}
+};
+
+static struct ctl_table uts_root_table[] = {
+       {
+               .ctl_name       = CTL_KERN,
+               .procname       = "kernel",
+               .mode           = 0555,
+               .child          = uts_kern_table,
+       },
+       {}
+};
+
+static int __init utsname_sysctl_init(void)
+{
+       register_sysctl_table(uts_root_table);
+       return 0;
+}
+
+__initcall(utsname_sysctl_init);
index a3da07c5af2835f57f094cddd20e731a8a77bdb5..b6fa5e63085d65b42f46fe97735751b6f402cab4 100644 (file)
@@ -218,7 +218,7 @@ int fastcall queue_work(struct workqueue_struct *wq, struct work_struct *work)
 }
 EXPORT_SYMBOL_GPL(queue_work);
 
-static void delayed_work_timer_fn(unsigned long __data)
+void delayed_work_timer_fn(unsigned long __data)
 {
        struct delayed_work *dwork = (struct delayed_work *)__data;
        struct workqueue_struct *wq = get_wq_data(&dwork->work);
@@ -245,6 +245,7 @@ int fastcall queue_delayed_work(struct workqueue_struct *wq,
        struct timer_list *timer = &dwork->timer;
        struct work_struct *work = &dwork->work;
 
+       timer_stats_timer_set_start_info(timer);
        if (delay == 0)
                return queue_work(wq, work);
 
@@ -593,8 +594,10 @@ EXPORT_SYMBOL(schedule_work);
  * After waiting for a given time this puts a job in the kernel-global
  * workqueue.
  */
-int fastcall schedule_delayed_work(struct delayed_work *dwork, unsigned long delay)
+int fastcall schedule_delayed_work(struct delayed_work *dwork,
+                                       unsigned long delay)
 {
+       timer_stats_timer_set_start_info(&dwork->timer);
        return queue_delayed_work(keventd_wq, dwork, delay);
 }
 EXPORT_SYMBOL(schedule_delayed_work);
@@ -656,8 +659,7 @@ void flush_scheduled_work(void)
 EXPORT_SYMBOL(flush_scheduled_work);
 
 /**
- * cancel_rearming_delayed_workqueue - reliably kill off a delayed
- *                     work whose handler rearms the delayed work.
+ * cancel_rearming_delayed_workqueue - reliably kill off a delayed work whose handler rearms the delayed work.
  * @wq:   the controlling workqueue structure
  * @dwork: the delayed work struct
  */
@@ -670,8 +672,7 @@ void cancel_rearming_delayed_workqueue(struct workqueue_struct *wq,
 EXPORT_SYMBOL(cancel_rearming_delayed_workqueue);
 
 /**
- * cancel_rearming_delayed_work - reliably kill off a delayed keventd
- *                     work whose handler rearms the delayed work.
+ * cancel_rearming_delayed_work - reliably kill off a delayed keventd work whose handler rearms the delayed work.
  * @dwork: the delayed work struct
  */
 void cancel_rearming_delayed_work(struct delayed_work *dwork)
index 9b03581cdecb3d746186e1c0fa1ab2685cdbcfcc..384249915047f0e28f8f82c10caa6b9795f4fb3b 100644 (file)
@@ -101,9 +101,14 @@ config TEXTSEARCH_FSM
 config PLIST
        boolean
 
-config IOMAP_COPY
+config HAS_IOMEM
        boolean
-       depends on !UML
+       depends on !NO_IOMEM
+       default y
+
+config HAS_IOPORT
+       boolean
+       depends on HAS_IOMEM && !NO_IOPORT
        default y
 
 endmenu
index 5c2681875b9ac31b1a363c63d909120cbc82b930..4448f91b865c10a48933a6a8d1c4ea645266b90c 100644 (file)
@@ -77,6 +77,15 @@ config DEBUG_KERNEL
          Say Y here if you are developing drivers or trying to debug and
          identify kernel problems.
 
+config DEBUG_SHIRQ
+       bool "Debug shared IRQ handlers"
+       depends on DEBUG_KERNEL && GENERIC_HARDIRQS
+       help
+         Enable this to generate a spurious interrupt as soon as a shared
+         interrupt handler is registered, and just before one is deregistered.
+         Drivers ought to be able to handle interrupts coming in at those
+         points; some don't and need to be caught.
+
 config LOG_BUF_SHIFT
        int "Kernel log buffer size (16 => 64KB, 17 => 128KB)" if DEBUG_KERNEL
        range 12 21
@@ -125,6 +134,17 @@ config SCHEDSTATS
          application, you can say N to avoid the very slight overhead
          this adds.
 
+config TIMER_STATS
+       bool "Collect kernel timers statistics"
+       depends on DEBUG_KERNEL && PROC_FS
+       help
+         If you say Y here, additional code will be inserted into the
+         timer routines to collect statistics about kernel timers being
+         reprogrammed. The statistics can be read from /proc/timer_stats.
+         The statistics collection is started by writing 1 to /proc/timer_stats,
+         writing 0 stops it. This feature is useful to collect information
+         about timer usage patterns in kernel and userspace.
+
 config DEBUG_SLAB
        bool "Debug slab memory allocations"
        depends on DEBUG_KERNEL && SLAB
@@ -181,19 +201,11 @@ config DEBUG_MUTEXES
         This feature allows mutex semantics violations to be detected and
         reported.
 
-config DEBUG_RWSEMS
-       bool "RW-sem debugging: basic checks"
-       depends on DEBUG_KERNEL
-       help
-        This feature allows read-write semaphore semantics violations to
-        be detected and reported.
-
 config DEBUG_LOCK_ALLOC
        bool "Lock debugging: detect incorrect freeing of live locks"
        depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT
        select DEBUG_SPINLOCK
        select DEBUG_MUTEXES
-       select DEBUG_RWSEMS
        select LOCKDEP
        help
         This feature will check whether any held lock (spinlock, rwlock,
@@ -209,7 +221,6 @@ config PROVE_LOCKING
        select LOCKDEP
        select DEBUG_SPINLOCK
        select DEBUG_MUTEXES
-       select DEBUG_RWSEMS
        select DEBUG_LOCK_ALLOC
        default n
        help
index 77b4bad7d441be4185001773a14ebf71aae06d32..992a39ef9ffd2167ac3a7e63dabefcf1715a5edb 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 lib-y := ctype.o string.o vsprintf.o cmdline.o \
-        bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o \
+        rbtree.o radix-tree.o dump_stack.o \
         idr.o div64.o int_sqrt.o bitmap.o extable.o prio_tree.o \
         sha1.o irq_regs.o reciprocal_div.o
 
@@ -12,14 +12,15 @@ lib-$(CONFIG_SMP) += cpumask.o
 
 lib-y  += kobject.o kref.o kobject_uevent.o klist.o
 
-obj-y += sort.o parser.o halfmd4.o debug_locks.o random32.o
+obj-y += sort.o parser.o halfmd4.o debug_locks.o random32.o bust_spinlocks.o
 
 ifeq ($(CONFIG_DEBUG_KOBJECT),y)
 CFLAGS_kobject.o += -DDEBUG
 CFLAGS_kobject_uevent.o += -DDEBUG
 endif
 
-obj-$(CONFIG_IOMAP_COPY) += iomap_copy.o
+obj-$(CONFIG_GENERIC_IOMAP) += iomap.o
+obj-$(CONFIG_HAS_IOMEM) += iomap_copy.o devres.o
 obj-$(CONFIG_DEBUG_LOCKING_API_SELFTESTS) += locking-selftest.o
 obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock_debug.o
 lib-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o
@@ -41,7 +42,6 @@ obj-$(CONFIG_CRC_CCITT)       += crc-ccitt.o
 obj-$(CONFIG_CRC16)    += crc16.o
 obj-$(CONFIG_CRC32)    += crc32.o
 obj-$(CONFIG_LIBCRC32C)        += libcrc32c.o
-obj-$(CONFIG_GENERIC_IOMAP) += iomap.o
 obj-$(CONFIG_GENERIC_ALLOCATOR) += genalloc.o
 
 obj-$(CONFIG_ZLIB_INFLATE) += zlib_inflate/
index 037fa9aa2ed77f554296c7f1f4b64f769fdd2a73..ee6e58fce8f75f675c2688294b07e01655a4396e 100644 (file)
@@ -95,7 +95,7 @@ void __bitmap_complement(unsigned long *dst, const unsigned long *src, int bits)
 }
 EXPORT_SYMBOL(__bitmap_complement);
 
-/*
+/**
  * __bitmap_shift_right - logical right shift of the bits in a bitmap
  *   @dst - destination bitmap
  *   @src - source bitmap
@@ -139,7 +139,7 @@ void __bitmap_shift_right(unsigned long *dst,
 EXPORT_SYMBOL(__bitmap_shift_right);
 
 
-/*
+/**
  * __bitmap_shift_left - logical left shift of the bits in a bitmap
  *   @dst - destination bitmap
  *   @src - source bitmap
@@ -529,7 +529,7 @@ int bitmap_parselist(const char *bp, unsigned long *maskp, int nmaskbits)
 }
 EXPORT_SYMBOL(bitmap_parselist);
 
-/*
+/**
  * bitmap_pos_to_ord(buf, pos, bits)
  *     @buf: pointer to a bitmap
  *     @pos: a bit position in @buf (0 <= @pos < @bits)
@@ -804,7 +804,7 @@ EXPORT_SYMBOL(bitmap_find_free_region);
  *     @pos: beginning of bit region to release
  *     @order: region size (log base 2 of number of bits) to release
  *
- * This is the complement to __bitmap_find_free_region and releases
+ * This is the complement to __bitmap_find_free_region() and releases
  * the found region (by clearing it in the bitmap).
  *
  * No return value.
index a2055bc3ef623d1b2f4659bdbd7dfe729ae47aa6..accb3565816993630ab98bc7818f3afe75307fa5 100644 (file)
 #include <linux/vt_kern.h>
 
 
-void bust_spinlocks(int yes)
+void __attribute__((weak)) bust_spinlocks(int yes)
 {
        if (yes) {
                oops_in_progress = 1;
        } else {
-               int loglevel_save = console_loglevel;
 #ifdef CONFIG_VT
                unblank_screen();
 #endif
                oops_in_progress = 0;
-               /*
-                * OK, the message is on the console.  Now we call printk()
-                * without oops_in_progress set so that printk() will give klogd
-                * and the blanked console a poke.  Hold onto your hats...
-                */
-               console_loglevel = 15;          /* NMI oopser may have shut the console up */
-               printk(" ");
-               console_loglevel = loglevel_save;
+               wake_up_klogd();
        }
 }
 
index 8a5b5303bd4f7a78187b4138eb08945c6333c10c..f596c08d213a0726c5f395209a3e20d730c3ea2c 100644 (file)
@@ -43,10 +43,10 @@ static int get_range(char **str, int *pint)
  *     comma as well.
  *
  *     Return values:
- *     0 : no int in string
- *     1 : int found, no subsequent comma
- *     2 : int found including a subsequent comma
- *     3 : hyphen found to denote a range
+ *     0 - no int in string
+ *     1 - int found, no subsequent comma
+ *     2 - int found including a subsequent comma
+ *     3 - hyphen found to denote a range
  */
 
 int get_option (char **str, int *pint)
diff --git a/lib/devres.c b/lib/devres.c
new file mode 100644 (file)
index 0000000..eb38849
--- /dev/null
@@ -0,0 +1,300 @@
+#include <linux/pci.h>
+#include <linux/io.h>
+#include <linux/module.h>
+
+static void devm_ioremap_release(struct device *dev, void *res)
+{
+       iounmap(*(void __iomem **)res);
+}
+
+static int devm_ioremap_match(struct device *dev, void *res, void *match_data)
+{
+       return *(void **)res == match_data;
+}
+
+/**
+ * devm_ioremap - Managed ioremap()
+ * @dev: Generic device to remap IO address for
+ * @offset: BUS offset to map
+ * @size: Size of map
+ *
+ * Managed ioremap().  Map is automatically unmapped on driver detach.
+ */
+void __iomem *devm_ioremap(struct device *dev, unsigned long offset,
+                          unsigned long size)
+{
+       void __iomem **ptr, *addr;
+
+       ptr = devres_alloc(devm_ioremap_release, sizeof(*ptr), GFP_KERNEL);
+       if (!ptr)
+               return NULL;
+
+       addr = ioremap(offset, size);
+       if (addr) {
+               *ptr = addr;
+               devres_add(dev, ptr);
+       } else
+               devres_free(ptr);
+
+       return addr;
+}
+EXPORT_SYMBOL(devm_ioremap);
+
+/**
+ * devm_ioremap_nocache - Managed ioremap_nocache()
+ * @dev: Generic device to remap IO address for
+ * @offset: BUS offset to map
+ * @size: Size of map
+ *
+ * Managed ioremap_nocache().  Map is automatically unmapped on driver
+ * detach.
+ */
+void __iomem *devm_ioremap_nocache(struct device *dev, unsigned long offset,
+                                  unsigned long size)
+{
+       void __iomem **ptr, *addr;
+
+       ptr = devres_alloc(devm_ioremap_release, sizeof(*ptr), GFP_KERNEL);
+       if (!ptr)
+               return NULL;
+
+       addr = ioremap_nocache(offset, size);
+       if (addr) {
+               *ptr = addr;
+               devres_add(dev, ptr);
+       } else
+               devres_free(ptr);
+
+       return addr;
+}
+EXPORT_SYMBOL(devm_ioremap_nocache);
+
+/**
+ * devm_iounmap - Managed iounmap()
+ * @dev: Generic device to unmap for
+ * @addr: Address to unmap
+ *
+ * Managed iounmap().  @addr must have been mapped using devm_ioremap*().
+ */
+void devm_iounmap(struct device *dev, void __iomem *addr)
+{
+       iounmap(addr);
+       WARN_ON(devres_destroy(dev, devm_ioremap_release, devm_ioremap_match,
+                              (void *)addr));
+}
+EXPORT_SYMBOL(devm_iounmap);
+
+#ifdef CONFIG_HAS_IOPORT
+/*
+ * Generic iomap devres
+ */
+static void devm_ioport_map_release(struct device *dev, void *res)
+{
+       ioport_unmap(*(void __iomem **)res);
+}
+
+static int devm_ioport_map_match(struct device *dev, void *res,
+                                void *match_data)
+{
+       return *(void **)res == match_data;
+}
+
+/**
+ * devm_ioport_map - Managed ioport_map()
+ * @dev: Generic device to map ioport for
+ * @port: Port to map
+ * @nr: Number of ports to map
+ *
+ * Managed ioport_map().  Map is automatically unmapped on driver
+ * detach.
+ */
+void __iomem * devm_ioport_map(struct device *dev, unsigned long port,
+                              unsigned int nr)
+{
+       void __iomem **ptr, *addr;
+
+       ptr = devres_alloc(devm_ioport_map_release, sizeof(*ptr), GFP_KERNEL);
+       if (!ptr)
+               return NULL;
+
+       addr = ioport_map(port, nr);
+       if (addr) {
+               *ptr = addr;
+               devres_add(dev, ptr);
+       } else
+               devres_free(ptr);
+
+       return addr;
+}
+EXPORT_SYMBOL(devm_ioport_map);
+
+/**
+ * devm_ioport_unmap - Managed ioport_unmap()
+ * @dev: Generic device to unmap for
+ * @addr: Address to unmap
+ *
+ * Managed ioport_unmap().  @addr must have been mapped using
+ * devm_ioport_map().
+ */
+void devm_ioport_unmap(struct device *dev, void __iomem *addr)
+{
+       ioport_unmap(addr);
+       WARN_ON(devres_destroy(dev, devm_ioport_map_release,
+                              devm_ioport_map_match, (void *)addr));
+}
+EXPORT_SYMBOL(devm_ioport_unmap);
+
+#ifdef CONFIG_PCI
+/*
+ * PCI iomap devres
+ */
+#define PCIM_IOMAP_MAX PCI_ROM_RESOURCE
+
+struct pcim_iomap_devres {
+       void __iomem *table[PCIM_IOMAP_MAX];
+};
+
+static void pcim_iomap_release(struct device *gendev, void *res)
+{
+       struct pci_dev *dev = container_of(gendev, struct pci_dev, dev);
+       struct pcim_iomap_devres *this = res;
+       int i;
+
+       for (i = 0; i < PCIM_IOMAP_MAX; i++)
+               if (this->table[i])
+                       pci_iounmap(dev, this->table[i]);
+}
+
+/**
+ * pcim_iomap_table - access iomap allocation table
+ * @pdev: PCI device to access iomap table for
+ *
+ * Access iomap allocation table for @dev.  If iomap table doesn't
+ * exist and @pdev is managed, it will be allocated.  All iomaps
+ * recorded in the iomap table are automatically unmapped on driver
+ * detach.
+ *
+ * This function might sleep when the table is first allocated but can
+ * be safely called without context and guaranteed to succed once
+ * allocated.
+ */
+void __iomem * const * pcim_iomap_table(struct pci_dev *pdev)
+{
+       struct pcim_iomap_devres *dr, *new_dr;
+
+       dr = devres_find(&pdev->dev, pcim_iomap_release, NULL, NULL);
+       if (dr)
+               return dr->table;
+
+       new_dr = devres_alloc(pcim_iomap_release, sizeof(*new_dr), GFP_KERNEL);
+       if (!new_dr)
+               return NULL;
+       dr = devres_get(&pdev->dev, new_dr, NULL, NULL);
+       return dr->table;
+}
+EXPORT_SYMBOL(pcim_iomap_table);
+
+/**
+ * pcim_iomap - Managed pcim_iomap()
+ * @pdev: PCI device to iomap for
+ * @bar: BAR to iomap
+ * @maxlen: Maximum length of iomap
+ *
+ * Managed pci_iomap().  Map is automatically unmapped on driver
+ * detach.
+ */
+void __iomem * pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen)
+{
+       void __iomem **tbl;
+
+       BUG_ON(bar >= PCIM_IOMAP_MAX);
+
+       tbl = (void __iomem **)pcim_iomap_table(pdev);
+       if (!tbl || tbl[bar])   /* duplicate mappings not allowed */
+               return NULL;
+
+       tbl[bar] = pci_iomap(pdev, bar, maxlen);
+       return tbl[bar];
+}
+EXPORT_SYMBOL(pcim_iomap);
+
+/**
+ * pcim_iounmap - Managed pci_iounmap()
+ * @pdev: PCI device to iounmap for
+ * @addr: Address to unmap
+ *
+ * Managed pci_iounmap().  @addr must have been mapped using pcim_iomap().
+ */
+void pcim_iounmap(struct pci_dev *pdev, void __iomem *addr)
+{
+       void __iomem **tbl;
+       int i;
+
+       pci_iounmap(pdev, addr);
+
+       tbl = (void __iomem **)pcim_iomap_table(pdev);
+       BUG_ON(!tbl);
+
+       for (i = 0; i < PCIM_IOMAP_MAX; i++)
+               if (tbl[i] == addr) {
+                       tbl[i] = NULL;
+                       return;
+               }
+       WARN_ON(1);
+}
+EXPORT_SYMBOL(pcim_iounmap);
+
+/**
+ * pcim_iomap_regions - Request and iomap PCI BARs
+ * @pdev: PCI device to map IO resources for
+ * @mask: Mask of BARs to request and iomap
+ * @name: Name used when requesting regions
+ *
+ * Request and iomap regions specified by @mask.
+ */
+int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name)
+{
+       void __iomem * const *iomap;
+       int i, rc;
+
+       iomap = pcim_iomap_table(pdev);
+       if (!iomap)
+               return -ENOMEM;
+
+       for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
+               unsigned long len;
+
+               if (!(mask & (1 << i)))
+                       continue;
+
+               rc = -EINVAL;
+               len = pci_resource_len(pdev, i);
+               if (!len)
+                       goto err_inval;
+
+               rc = pci_request_region(pdev, i, name);
+               if (rc)
+                       goto err_inval;
+
+               rc = -ENOMEM;
+               if (!pcim_iomap(pdev, i, 0))
+                       goto err_region;
+       }
+
+       return 0;
+
+ err_region:
+       pci_release_region(pdev, i);
+ err_inval:
+       while (--i >= 0) {
+               if (!(mask & (1 << i)))
+                       continue;
+               pcim_iounmap(pdev, iomap[i]);
+               pci_release_region(pdev, i);
+       }
+
+       return rc;
+}
+EXPORT_SYMBOL(pcim_iomap_regions);
+#endif
+#endif
index 71853531d3b0f6be6c0db0420ca8d646dd884469..305117ca2d415a1adf91700fe34a06d88028de67 100644 (file)
--- a/lib/idr.c
+++ b/lib/idr.c
@@ -329,8 +329,8 @@ static void sub_remove(struct idr *idp, int shift, int id)
 
 /**
  * idr_remove - remove the given id and free it's slot
- * idp: idr handle
- * id: uniqueue key
+ * @idp: idr handle
+ * @id: unique key
  */
 void idr_remove(struct idr *idp, int id)
 {
index d6ccdd85df5311a4326bf584920a1293dc11243c..4d43f37c01544de2b19e46bd259bdbe3fc5b7caf 100644 (file)
@@ -4,8 +4,9 @@
  * (C) Copyright 2004 Linus Torvalds
  */
 #include <linux/pci.h>
+#include <linux/io.h>
+
 #include <linux/module.h>
-#include <asm/io.h>
 
 /*
  * Read/write from/to an (offsettable) iomem cookie. It might be a PIO
index c2917ffe8bf11a024c34eb8729a9e87872bcfb5d..2782f49e906ec3e2315028041ca54681239e55a7 100644 (file)
@@ -97,11 +97,12 @@ static void fill_kobj_path(struct kobject *kobj, char *path, int length)
 }
 
 /**
- * kobject_get_path - generate and return the path associated with a given kobj
- * and kset pair.  The result must be freed by the caller with kfree().
+ * kobject_get_path - generate and return the path associated with a given kobj and kset pair.
  *
  * @kobj:      kobject in question, with which to build the path
  * @gfp_mask:  the allocation type used to allocate the path
+ *
+ * The result must be freed by the caller with kfree().
  */
 char *kobject_get_path(struct kobject *kobj, gfp_t gfp_mask)
 {
index 1cdabe3065f932d1edde271b2421ce6844ccb84c..4c45fd50e91367041d825a1146291a829b900eff 100644 (file)
@@ -20,8 +20,8 @@
 #define K3  0x8F1BBCDCL                        /* Rounds 40-59: sqrt(5) * 2^30 */
 #define K4  0xCA62C1D6L                        /* Rounds 60-79: sqrt(10) * 2^30 */
 
-/*
- * sha_transform: single block SHA1 transform
+/**
+ * sha_transform - single block SHA1 transform
  *
  * @digest: 160 bit digest to update
  * @data:   512 bits of data to hash
@@ -80,9 +80,8 @@ void sha_transform(__u32 *digest, const char *in, __u32 *W)
 }
 EXPORT_SYMBOL(sha_transform);
 
-/*
- * sha_init: initialize the vectors for a SHA1 digest
- *
+/**
+ * sha_init - initialize the vectors for a SHA1 digest
  * @buf: vector to initialize
  */
 void sha_init(__u32 *buf)
index 488788b341cb01960b92163b9326ec85c2a33445..961567894d16b89a208244ea957e44a3d9afd668 100644 (file)
@@ -27,7 +27,7 @@ static void generic_swap(void *a, void *b, int size)
        } while (--size > 0);
 }
 
-/*
+/**
  * sort - sort an array of elements
  * @base: pointer to data to sort
  * @num: number of elements
index a485d75962af5f7a6bbb4f819aa780c812fe25ca..bab440fb0dfcb99dfe46453350f7b6e9298c89eb 100644 (file)
@@ -160,7 +160,7 @@ EXPORT_SYMBOL(strcat);
  * @src: The string to append to it
  * @count: The maximum numbers of bytes to copy
  *
- * Note that in contrast to strncpy, strncat ensures the result is
+ * Note that in contrast to strncpy(), strncat() ensures the result is
  * terminated.
  */
 char *strncat(char *dest, const char *src, size_t count)
@@ -366,8 +366,7 @@ EXPORT_SYMBOL(strnlen);
 
 #ifndef __HAVE_ARCH_STRSPN
 /**
- * strspn - Calculate the length of the initial substring of @s which only
- *     contain letters in @accept
+ * strspn - Calculate the length of the initial substring of @s which only contain letters in @accept
  * @s: The string to be searched
  * @accept: The string to search for
  */
@@ -394,8 +393,7 @@ EXPORT_SYMBOL(strspn);
 
 #ifndef __HAVE_ARCH_STRCSPN
 /**
- * strcspn - Calculate the length of the initial substring of @s which does
- *     not contain letters in @reject
+ * strcspn - Calculate the length of the initial substring of @s which does not contain letters in @reject
  * @s: The string to be searched
  * @reject: The string to avoid
  */
index 50a43801018259422345f815b39876b6a1a6a78f..623a68af8b18dec5a6346046503ac7dbd05c4096 100644 (file)
@@ -313,7 +313,7 @@ cleanup1:
 #endif
 
 #ifndef SWIOTLB_ARCH_HAS_NEEDS_MAPPING
-static inline int
+static int
 address_needs_mapping(struct device *hwdev, dma_addr_t addr)
 {
        dma_addr_t mask = 0xffffffff;
@@ -672,7 +672,7 @@ swiotlb_unmap_single(struct device *hwdev, dma_addr_t dev_addr, size_t size,
  * address back to the card, you must first perform a
  * swiotlb_dma_sync_for_device, and then the device again owns the buffer
  */
-static inline void
+static void
 swiotlb_sync_single(struct device *hwdev, dma_addr_t dev_addr,
                    size_t size, int dir, int target)
 {
@@ -702,7 +702,7 @@ swiotlb_sync_single_for_device(struct device *hwdev, dma_addr_t dev_addr,
 /*
  * Same as above, but for a sub-range of the mapping.
  */
-static inline void
+static void
 swiotlb_sync_single_range(struct device *hwdev, dma_addr_t dev_addr,
                          unsigned long offset, size_t size,
                          int dir, int target)
@@ -805,7 +805,7 @@ swiotlb_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nelems,
  * The same as swiotlb_sync_single_* but for a scatter-gather list, same rules
  * and usage.
  */
-static inline void
+static void
 swiotlb_sync_sg(struct device *hwdev, struct scatterlist *sg,
                int nelems, int dir, int target)
 {
index 98bcadc0118523faeaf8443d4aeb248520c9798d..9e2a002c5b543305105c69a77410177882538b1b 100644 (file)
@@ -218,7 +218,7 @@ static unsigned int get_linear_data(unsigned int consumed, const u8 **dst,
  * Call textsearch_next() to retrieve subsequent matches.
  *
  * Returns the position of first occurrence of the pattern or
- * UINT_MAX if no occurrence was found.
+ * %UINT_MAX if no occurrence was found.
  */ 
 unsigned int textsearch_find_continuous(struct ts_config *conf,
                                        struct ts_state *state,
index bed7229378f2da073be0c25eda0a30bf07146380..b025864d2e43d08bffa10849610d5dce10b5b9ce 100644 (file)
@@ -247,12 +247,12 @@ static char * number(char * buf, char * end, unsigned long long num, int base, i
  * be generated for the given input, excluding the trailing
  * '\0', as per ISO C99. If you want to have the exact
  * number of characters written into @buf as return value
- * (not including the trailing '\0'), use vscnprintf. If the
+ * (not including the trailing '\0'), use vscnprintf(). If the
  * return is greater than or equal to @size, the resulting
  * string is truncated.
  *
  * Call this function if you are already dealing with a va_list.
- * You probably want snprintf instead.
+ * You probably want snprintf() instead.
  */
 int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
 {
@@ -509,7 +509,7 @@ EXPORT_SYMBOL(vsnprintf);
  * returns 0.
  *
  * Call this function if you are already dealing with a va_list.
- * You probably want scnprintf instead.
+ * You probably want scnprintf() instead.
  */
 int vscnprintf(char *buf, size_t size, const char *fmt, va_list args)
 {
@@ -554,8 +554,7 @@ EXPORT_SYMBOL(snprintf);
  * @...: Arguments for the format string
  *
  * The return value is the number of characters written into @buf not including
- * the trailing '\0'. If @size is <= 0 the function returns 0. If the return is
- * greater than or equal to @size, the resulting string is truncated.
+ * the trailing '\0'. If @size is <= 0 the function returns 0.
  */
 
 int scnprintf(char * buf, size_t size, const char *fmt, ...)
@@ -577,11 +576,11 @@ EXPORT_SYMBOL(scnprintf);
  * @args: Arguments for the format string
  *
  * The function returns the number of characters written
- * into @buf. Use vsnprintf or vscnprintf in order to avoid
+ * into @buf. Use vsnprintf() or vscnprintf() in order to avoid
  * buffer overflows.
  *
  * Call this function if you are already dealing with a va_list.
- * You probably want sprintf instead.
+ * You probably want sprintf() instead.
  */
 int vsprintf(char *buf, const char *fmt, va_list args)
 {
@@ -597,7 +596,7 @@ EXPORT_SYMBOL(vsprintf);
  * @...: Arguments for the format string
  *
  * The function returns the number of characters written
- * into @buf. Use snprintf or scnprintf in order to avoid
+ * into @buf. Use snprintf() or scnprintf() in order to avoid
  * buffer overflows.
  */
 int sprintf(char * buf, const char *fmt, ...)
index db7c55de92cdc2ded0583d1ccc5239bdb4828d00..7942b333e46cd46c11ac0f4a849c7b98efeee58e 100644 (file)
@@ -157,3 +157,9 @@ config RESOURCES_64BIT
        default 64BIT
        help
          This option allows memory and IO resources to be 64 bit.
+
+config ZONE_DMA_FLAG
+       int
+       default "0" if !ZONE_DMA
+       default "1"
+
index f30ef28405d34a4fbd6c81f096d1248ed84a6491..d1060b8d3cd65ba696afce181c09fd1c2585f196 100644 (file)
@@ -327,7 +327,7 @@ EXPORT_SYMBOL(sync_page_range);
  * @pos:       beginning offset in pages to write
  * @count:     number of bytes to write
  *
- * Note: Holding i_mutex across sync_page_range_nolock is not a good idea
+ * Note: Holding i_mutex across sync_page_range_nolock() is not a good idea
  * as it forces O_SYNC writers to different parts of the same file
  * to be serialised right until io completion.
  */
@@ -784,7 +784,7 @@ unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index,
  * @mapping: target address_space
  * @index: the page index
  *
- * Same as grab_cache_page, but do not wait if the page is unavailable.
+ * Same as grab_cache_page(), but do not wait if the page is unavailable.
  * This is intended for speculative data generators, where the data can
  * be regenerated if the page couldn't be grabbed.  This routine should
  * be safe to call while holding the lock for another page.
@@ -2079,21 +2079,27 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov,
                /* Limit the size of the copy to the caller's write size */
                bytes = min(bytes, count);
 
-               /*
-                * Limit the size of the copy to that of the current segment,
-                * because fault_in_pages_readable() doesn't know how to walk
-                * segments.
+               /* We only need to worry about prefaulting when writes are from
+                * user-space.  NFSd uses vfs_writev with several non-aligned
+                * segments in the vector, and limiting to one segment a time is
+                * a noticeable performance for re-write
                 */
-               bytes = min(bytes, cur_iov->iov_len - iov_base);
-
-               /*
-                * Bring in the user page that we will copy from _first_.
-                * Otherwise there's a nasty deadlock on copying from the
-                * same page as we're writing to, without it being marked
-                * up-to-date.
-                */
-               fault_in_pages_readable(buf, bytes);
+               if (!segment_eq(get_fs(), KERNEL_DS)) {
+                       /*
+                        * Limit the size of the copy to that of the current
+                        * segment, because fault_in_pages_readable() doesn't
+                        * know how to walk segments.
+                        */
+                       bytes = min(bytes, cur_iov->iov_len - iov_base);
 
+                       /*
+                        * Bring in the user page that we will copy from
+                        * _first_.  Otherwise there's a nasty deadlock on
+                        * copying from the same page as we're writing to,
+                        * without it being marked up-to-date.
+                        */
+                       fault_in_pages_readable(buf, bytes);
+               }
                page = __grab_cache_page(mapping,index,&cached_page,&lru_pvec);
                if (!page) {
                        status = -ENOMEM;
index 0206e7e5018c8998c87349706fe1fcfb5644933c..51e1c1995fec1d87a1e8e80d4518008d4ec4f4f1 100644 (file)
@@ -47,7 +47,8 @@ unsigned int nr_free_highpages (void)
        unsigned int pages = 0;
 
        for_each_online_pgdat(pgdat)
-               pages += pgdat->node_zones[ZONE_HIGHMEM].free_pages;
+               pages += zone_page_state(&pgdat->node_zones[ZONE_HIGHMEM],
+                       NR_FREE_PAGES);
 
        return pages;
 }
index ef09f0acb1d8efc25fed1a524cada7cab48d40ef..e7066e71dfa3b36daeb4830e3032091e38f0bfc1 100644 (file)
@@ -678,7 +678,7 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb,
                                if (pte_dirty(ptent))
                                        set_page_dirty(page);
                                if (pte_young(ptent))
-                                       mark_page_accessed(page);
+                                       SetPageReferenced(page);
                                file_rss--;
                        }
                        page_remove_rmap(page, vma);
@@ -1277,6 +1277,51 @@ int vm_insert_page(struct vm_area_struct *vma, unsigned long addr, struct page *
 }
 EXPORT_SYMBOL(vm_insert_page);
 
+/**
+ * vm_insert_pfn - insert single pfn into user vma
+ * @vma: user vma to map to
+ * @addr: target user address of this page
+ * @pfn: source kernel pfn
+ *
+ * Similar to vm_inert_page, this allows drivers to insert individual pages
+ * they've allocated into a user vma. Same comments apply.
+ *
+ * This function should only be called from a vm_ops->fault handler, and
+ * in that case the handler should return NULL.
+ */
+int vm_insert_pfn(struct vm_area_struct *vma, unsigned long addr,
+               unsigned long pfn)
+{
+       struct mm_struct *mm = vma->vm_mm;
+       int retval;
+       pte_t *pte, entry;
+       spinlock_t *ptl;
+
+       BUG_ON(!(vma->vm_flags & VM_PFNMAP));
+       BUG_ON(is_cow_mapping(vma->vm_flags));
+
+       retval = -ENOMEM;
+       pte = get_locked_pte(mm, addr, &ptl);
+       if (!pte)
+               goto out;
+       retval = -EBUSY;
+       if (!pte_none(*pte))
+               goto out_unlock;
+
+       /* Ok, finally just insert the thing.. */
+       entry = pfn_pte(pfn, vma->vm_page_prot);
+       set_pte_at(mm, addr, pte, entry);
+       update_mmu_cache(vma, addr, entry);
+
+       retval = 0;
+out_unlock:
+       pte_unmap_unlock(pte, ptl);
+
+out:
+       return retval;
+}
+EXPORT_SYMBOL(vm_insert_pfn);
+
 /*
  * maps a range of physical memory into the requested pages. the old
  * mappings are removed. any references to nonexistent pages results
@@ -1531,8 +1576,6 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
                        if (vma->vm_ops->page_mkwrite(vma, old_page) < 0)
                                goto unwritable_page;
 
-                       page_cache_release(old_page);
-
                        /*
                         * Since we dropped the lock we need to revalidate
                         * the PTE as someone else may have changed it.  If
@@ -1541,6 +1584,7 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
                         */
                        page_table = pte_offset_map_lock(mm, pmd, address,
                                                         &ptl);
+                       page_cache_release(old_page);
                        if (!pte_same(*page_table, orig_pte))
                                goto unlock;
                }
@@ -1776,9 +1820,7 @@ restart:
 }
 
 /**
- * unmap_mapping_range - unmap the portion of all mmaps
- * in the specified address_space corresponding to the specified
- * page range in the underlying file.
+ * unmap_mapping_range - unmap the portion of all mmaps in the specified address_space corresponding to the specified page range in the underlying file.
  * @mapping: the address space containing mmaps to be unmapped.
  * @holebegin: byte in first page to unmap, relative to the start of
  * the underlying file.  This will be rounded down to a PAGE_SIZE
@@ -2313,10 +2355,12 @@ static noinline int do_no_pfn(struct mm_struct *mm, struct vm_area_struct *vma,
        BUG_ON(is_cow_mapping(vma->vm_flags));
 
        pfn = vma->vm_ops->nopfn(vma, address & PAGE_MASK);
-       if (pfn == NOPFN_OOM)
+       if (unlikely(pfn == NOPFN_OOM))
                return VM_FAULT_OOM;
-       if (pfn == NOPFN_SIGBUS)
+       else if (unlikely(pfn == NOPFN_SIGBUS))
                return VM_FAULT_SIGBUS;
+       else if (unlikely(pfn == NOPFN_REFAULT))
+               return VM_FAULT_MINOR;
 
        page_table = pte_offset_map_lock(mm, pmd, address, &ptl);
 
index c2aec0e1090d03d540dc43d5b35388b044679c81..259a706bd83ec5d3392b37dcf093b2c3ec953145 100644 (file)
@@ -105,7 +105,7 @@ static struct kmem_cache *sn_cache;
 
 /* Highest zone. An specific allocation for a zone below that is not
    policied. */
-enum zone_type policy_zone = ZONE_DMA;
+enum zone_type policy_zone = 0;
 
 struct mempolicy default_policy = {
        .refcnt = ATOMIC_INIT(1), /* never free it */
index ccd8cb8cd41f59fc19e2198bfb2862ad72d62ff9..cc1ca86dfc2496b6e0cae7703d4a6dc4f4f97150 100644 (file)
@@ -46,9 +46,9 @@ static void free_pool(mempool_t *pool)
  * @pool_data: optional private data available to the user-defined functions.
  *
  * this function creates and allocates a guaranteed size, preallocated
- * memory pool. The pool can be used from the mempool_alloc and mempool_free
+ * memory pool. The pool can be used from the mempool_alloc() and mempool_free()
  * functions. This function might sleep. Both the alloc_fn() and the free_fn()
- * functions might sleep - as long as the mempool_alloc function is not called
+ * functions might sleep - as long as the mempool_alloc() function is not called
  * from IRQ contexts.
  */
 mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn,
@@ -195,7 +195,7 @@ EXPORT_SYMBOL(mempool_destroy);
  *             mempool_create().
  * @gfp_mask:  the usual allocation bitmask.
  *
- * this function only sleeps if the alloc_fn function sleeps or
+ * this function only sleeps if the alloc_fn() function sleeps or
  * returns NULL. Note that due to preallocation, this function
  * *never* fails when called from process contexts. (it might
  * fail if called from an IRQ context.)
index 8aca6f7167bbb25f858075c90c64d766fcc1e4c3..5efe0ded69b1857935d0295e9999210e4999a516 100644 (file)
@@ -12,6 +12,8 @@
 #include <linux/mm.h>
 #include <linux/mman.h>
 #include <linux/syscalls.h>
+#include <linux/swap.h>
+#include <linux/swapops.h>
 
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
  * and is up to date; i.e. that no page-in operation would be required
  * at this time if an application were to map and access this page.
  */
-static unsigned char mincore_page(struct vm_area_struct * vma,
-       unsigned long pgoff)
+static unsigned char mincore_page(struct address_space *mapping, pgoff_t pgoff)
 {
        unsigned char present = 0;
-       struct address_space * as = vma->vm_file->f_mapping;
-       struct page * page;
+       struct page *page;
 
-       page = find_get_page(as, pgoff);
+       /*
+        * When tmpfs swaps out a page from a file, any process mapping that
+        * file will not get a swp_entry_t in its pte, but rather it is like
+        * any other file mapping (ie. marked !present and faulted in with
+        * tmpfs's .nopage). So swapped out tmpfs mappings are tested here.
+        *
+        * However when tmpfs moves the page from pagecache and into swapcache,
+        * it is still in core, but the find_get_page below won't find it.
+        * No big deal, but make a note of it.
+        */
+       page = find_get_page(mapping, pgoff);
        if (page) {
                present = PageUptodate(page);
                page_cache_release(page);
@@ -45,7 +55,14 @@ static unsigned char mincore_page(struct vm_area_struct * vma,
  */
 static long do_mincore(unsigned long addr, unsigned char *vec, unsigned long pages)
 {
-       unsigned long i, nr, pgoff;
+       pgd_t *pgd;
+       pud_t *pud;
+       pmd_t *pmd;
+       pte_t *ptep;
+       spinlock_t *ptl;
+       unsigned long nr;
+       int i;
+       pgoff_t pgoff;
        struct vm_area_struct *vma = find_vma(current->mm, addr);
 
        /*
@@ -56,31 +73,82 @@ static long do_mincore(unsigned long addr, unsigned char *vec, unsigned long pag
                return -ENOMEM;
 
        /*
-        * Ok, got it. But check whether it's a segment we support
-        * mincore() on. Right now, we don't do any anonymous mappings.
-        *
-        * FIXME: This is just stupid. And returning ENOMEM is 
-        * stupid too. We should just look at the page tables. But
-        * this is what we've traditionally done, so we'll just
-        * continue doing it.
+        * Calculate how many pages there are left in the last level of the
+        * PTE array for our address.
         */
-       if (!vma->vm_file)
-               return -ENOMEM;
+       nr = PTRS_PER_PTE - ((addr >> PAGE_SHIFT) & (PTRS_PER_PTE-1));
 
        /*
-        * Calculate how many pages there are left in the vma, and
-        * what the pgoff is for our address.
+        * Don't overrun this vma
         */
-       nr = (vma->vm_end - addr) >> PAGE_SHIFT;
-       if (nr > pages)
-               nr = pages;
+       nr = min(nr, (vma->vm_end - addr) >> PAGE_SHIFT);
 
-       pgoff = (addr - vma->vm_start) >> PAGE_SHIFT;
-       pgoff += vma->vm_pgoff;
+       /*
+        * Don't return more than the caller asked for
+        */
+       nr = min(nr, pages);
+
+       pgd = pgd_offset(vma->vm_mm, addr);
+       if (pgd_none_or_clear_bad(pgd))
+               goto none_mapped;
+       pud = pud_offset(pgd, addr);
+       if (pud_none_or_clear_bad(pud))
+               goto none_mapped;
+       pmd = pmd_offset(pud, addr);
+       if (pmd_none_or_clear_bad(pmd))
+               goto none_mapped;
+
+       ptep = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);
+       for (i = 0; i < nr; i++, ptep++, addr += PAGE_SIZE) {
+               unsigned char present;
+               pte_t pte = *ptep;
+
+               if (pte_present(pte)) {
+                       present = 1;
+
+               } else if (pte_none(pte)) {
+                       if (vma->vm_file) {
+                               pgoff = linear_page_index(vma, addr);
+                               present = mincore_page(vma->vm_file->f_mapping,
+                                                       pgoff);
+                       } else
+                               present = 0;
+
+               } else if (pte_file(pte)) {
+                       pgoff = pte_to_pgoff(pte);
+                       present = mincore_page(vma->vm_file->f_mapping, pgoff);
+
+               } else { /* pte is a swap entry */
+                       swp_entry_t entry = pte_to_swp_entry(pte);
+                       if (is_migration_entry(entry)) {
+                               /* migration entries are always uptodate */
+                               present = 1;
+                       } else {
+#ifdef CONFIG_SWAP
+                               pgoff = entry.val;
+                               present = mincore_page(&swapper_space, pgoff);
+#else
+                               WARN_ON(1);
+                               present = 1;
+#endif
+                       }
+               }
+
+               vec[i] = present;
+       }
+       pte_unmap_unlock(ptep-1, ptl);
 
-       /* And then we just fill the sucker in.. */
-       for (i = 0 ; i < nr; i++, pgoff++)
-               vec[i] = mincore_page(vma, pgoff);
+       return nr;
+
+none_mapped:
+       if (vma->vm_file) {
+               pgoff = linear_page_index(vma, addr);
+               for (i = 0; i < nr; i++, pgoff++)
+                       vec[i] = mincore_page(vma->vm_file->f_mapping, pgoff);
+       } else {
+               for (i = 0; i < nr; i++)
+                       vec[i] = 0;
+       }
 
        return nr;
 }
index be0efbde4994f5454198384ce274b62eb827adc4..f7e088f5a309eff3a03c8da5ad4ca4b37ecd5518 100644 (file)
@@ -515,7 +515,7 @@ static int __cpuinit
 ratelimit_handler(struct notifier_block *self, unsigned long u, void *v)
 {
        writeback_set_ratelimit();
-       return 0;
+       return NOTIFY_DONE;
 }
 
 static struct notifier_block __cpuinitdata ratelimit_nb = {
@@ -549,9 +549,7 @@ void __init page_writeback_init(void)
 }
 
 /**
- * generic_writepages - walk the list of dirty pages of the given
- *                      address space and writepage() all of them.
- *
+ * generic_writepages - walk the list of dirty pages of the given address space and writepage() all of them.
  * @mapping: address space structure to write
  * @wbc: subtract the number of written pages from *@wbc->nr_to_write
  *
@@ -698,7 +696,6 @@ int do_writepages(struct address_space *mapping, struct writeback_control *wbc)
 
 /**
  * write_one_page - write out a single page and optionally wait on I/O
- *
  * @page: the page to write
  * @wait: if true, wait on writeout
  *
@@ -736,6 +733,16 @@ int write_one_page(struct page *page, int wait)
 }
 EXPORT_SYMBOL(write_one_page);
 
+/*
+ * For address_spaces which do not use buffers nor write back.
+ */
+int __set_page_dirty_no_writeback(struct page *page)
+{
+       if (!PageDirty(page))
+               SetPageDirty(page);
+       return 0;
+}
+
 /*
  * For address_spaces which do not use buffers.  Just tag the page as dirty in
  * its radix tree.
index f12052dc23ff673d98ad183b750875c53f7d7f78..d461b23a27a1176decc9229edf45c8ae1c388472 100644 (file)
@@ -73,7 +73,9 @@ static void __free_pages_ok(struct page *page, unsigned int order);
  * don't need any ZONE_NORMAL reservation
  */
 int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1] = {
+#ifdef CONFIG_ZONE_DMA
         256,
+#endif
 #ifdef CONFIG_ZONE_DMA32
         256,
 #endif
@@ -85,7 +87,9 @@ int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1] = {
 EXPORT_SYMBOL(totalram_pages);
 
 static char * const zone_names[MAX_NR_ZONES] = {
+#ifdef CONFIG_ZONE_DMA
         "DMA",
+#endif
 #ifdef CONFIG_ZONE_DMA32
         "DMA32",
 #endif
@@ -395,7 +399,7 @@ static inline void __free_one_page(struct page *page,
        VM_BUG_ON(page_idx & (order_size - 1));
        VM_BUG_ON(bad_range(zone, page));
 
-       zone->free_pages += order_size;
+       __mod_zone_page_state(zone, NR_FREE_PAGES, order_size);
        while (order < MAX_ORDER-1) {
                unsigned long combined_idx;
                struct free_area *area;
@@ -631,7 +635,7 @@ static struct page *__rmqueue(struct zone *zone, unsigned int order)
                list_del(&page->lru);
                rmv_page_order(page);
                area->nr_free--;
-               zone->free_pages -= 1UL << order;
+               __mod_zone_page_state(zone, NR_FREE_PAGES, - (1UL << order));
                expand(zone, page, order, current_order, area);
                return page;
        }
@@ -989,7 +993,8 @@ int zone_watermark_ok(struct zone *z, int order, unsigned long mark,
                      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;
+       long min = mark;
+       long free_pages = zone_page_state(z, NR_FREE_PAGES) - (1 << order) + 1;
        int o;
 
        if (alloc_flags & ALLOC_HIGH)
@@ -1439,35 +1444,6 @@ fastcall void free_pages(unsigned long addr, unsigned int order)
 
 EXPORT_SYMBOL(free_pages);
 
-/*
- * Total amount of free (allocatable) RAM:
- */
-unsigned int nr_free_pages(void)
-{
-       unsigned int sum = 0;
-       struct zone *zone;
-
-       for_each_zone(zone)
-               sum += zone->free_pages;
-
-       return sum;
-}
-
-EXPORT_SYMBOL(nr_free_pages);
-
-#ifdef CONFIG_NUMA
-unsigned int nr_free_pages_pgdat(pg_data_t *pgdat)
-{
-       unsigned int sum = 0;
-       enum zone_type i;
-
-       for (i = 0; i < MAX_NR_ZONES; i++)
-               sum += pgdat->node_zones[i].free_pages;
-
-       return sum;
-}
-#endif
-
 static unsigned int nr_free_zone_pages(int offset)
 {
        /* Just pick one node, since fallback list is circular */
@@ -1514,7 +1490,7 @@ void si_meminfo(struct sysinfo *val)
 {
        val->totalram = totalram_pages;
        val->sharedram = 0;
-       val->freeram = nr_free_pages();
+       val->freeram = global_page_state(NR_FREE_PAGES);
        val->bufferram = nr_blockdev_pages();
        val->totalhigh = totalhigh_pages;
        val->freehigh = nr_free_highpages();
@@ -1529,10 +1505,11 @@ void si_meminfo_node(struct sysinfo *val, int nid)
        pg_data_t *pgdat = NODE_DATA(nid);
 
        val->totalram = pgdat->node_present_pages;
-       val->freeram = nr_free_pages_pgdat(pgdat);
+       val->freeram = node_page_state(nid, NR_FREE_PAGES);
 #ifdef CONFIG_HIGHMEM
        val->totalhigh = pgdat->node_zones[ZONE_HIGHMEM].present_pages;
-       val->freehigh = pgdat->node_zones[ZONE_HIGHMEM].free_pages;
+       val->freehigh = zone_page_state(&pgdat->node_zones[ZONE_HIGHMEM],
+                       NR_FREE_PAGES);
 #else
        val->totalhigh = 0;
        val->freehigh = 0;
@@ -1551,9 +1528,6 @@ void si_meminfo_node(struct sysinfo *val, int nid)
 void show_free_areas(void)
 {
        int cpu;
-       unsigned long active;
-       unsigned long inactive;
-       unsigned long free;
        struct zone *zone;
 
        for_each_zone(zone) {
@@ -1577,16 +1551,14 @@ void show_free_areas(void)
                }
        }
 
-       get_zone_counts(&active, &inactive, &free);
-
        printk("Active:%lu inactive:%lu dirty:%lu writeback:%lu unstable:%lu\n"
-               " free:%u slab:%lu mapped:%lu pagetables:%lu bounce:%lu\n",
-               active,
-               inactive,
+               " free:%lu slab:%lu mapped:%lu pagetables:%lu bounce:%lu\n",
+               global_page_state(NR_ACTIVE),
+               global_page_state(NR_INACTIVE),
                global_page_state(NR_FILE_DIRTY),
                global_page_state(NR_WRITEBACK),
                global_page_state(NR_UNSTABLE_NFS),
-               nr_free_pages(),
+               global_page_state(NR_FREE_PAGES),
                global_page_state(NR_SLAB_RECLAIMABLE) +
                        global_page_state(NR_SLAB_UNRECLAIMABLE),
                global_page_state(NR_FILE_MAPPED),
@@ -1612,12 +1584,12 @@ void show_free_areas(void)
                        " all_unreclaimable? %s"
                        "\n",
                        zone->name,
-                       K(zone->free_pages),
+                       K(zone_page_state(zone, NR_FREE_PAGES)),
                        K(zone->pages_min),
                        K(zone->pages_low),
                        K(zone->pages_high),
-                       K(zone->nr_active),
-                       K(zone->nr_inactive),
+                       K(zone_page_state(zone, NR_ACTIVE)),
+                       K(zone_page_state(zone, NR_INACTIVE)),
                        K(zone->present_pages),
                        zone->pages_scanned,
                        (zone->all_unreclaimable ? "yes" : "no")
@@ -2651,11 +2623,11 @@ static void __meminit free_area_init_core(struct pglist_data *pgdat,
                                "  %s zone: %lu pages exceeds realsize %lu\n",
                                zone_names[j], memmap_pages, realsize);
 
-               /* Account for reserved DMA pages */
-               if (j == ZONE_DMA && realsize > dma_reserve) {
+               /* Account for reserved pages */
+               if (j == 0 && realsize > dma_reserve) {
                        realsize -= dma_reserve;
-                       printk(KERN_DEBUG "  DMA zone: %lu pages reserved\n",
-                                                               dma_reserve);
+                       printk(KERN_DEBUG "  %s zone: %lu pages reserved\n",
+                                       zone_names[0], dma_reserve);
                }
 
                if (!is_highmem_idx(j))
@@ -2675,7 +2647,6 @@ static void __meminit free_area_init_core(struct pglist_data *pgdat,
                spin_lock_init(&zone->lru_lock);
                zone_seqlock_init(zone);
                zone->zone_pgdat = pgdat;
-               zone->free_pages = 0;
 
                zone->prev_priority = DEF_PRIORITY;
 
@@ -2684,8 +2655,6 @@ static void __meminit free_area_init_core(struct pglist_data *pgdat,
                INIT_LIST_HEAD(&zone->inactive_list);
                zone->nr_scan_active = 0;
                zone->nr_scan_inactive = 0;
-               zone->nr_active = 0;
-               zone->nr_inactive = 0;
                zap_zone_vm_stats(zone);
                atomic_set(&zone->reclaim_in_progress, 0);
                if (!size)
@@ -2877,20 +2846,23 @@ static void __init sort_node_map(void)
                        cmp_node_active_region, NULL);
 }
 
-/* Find the lowest pfn for a node. This depends on a sorted early_node_map */
+/* Find the lowest pfn for a node */
 unsigned long __init find_min_pfn_for_node(unsigned long nid)
 {
        int i;
-
-       /* Regions in the early_node_map can be in any order */
-       sort_node_map();
+       unsigned long min_pfn = ULONG_MAX;
 
        /* Assuming a sorted map, the first range found has the starting pfn */
        for_each_active_range_index_in_nid(i, nid)
-               return early_node_map[i].start_pfn;
+               min_pfn = min(min_pfn, early_node_map[i].start_pfn);
 
-       printk(KERN_WARNING "Could not find start_pfn for node %lu\n", nid);
-       return 0;
+       if (min_pfn == ULONG_MAX) {
+               printk(KERN_WARNING
+                       "Could not find start_pfn for node %lu\n", nid);
+               return 0;
+       }
+
+       return min_pfn;
 }
 
 /**
@@ -2939,6 +2911,9 @@ void __init free_area_init_nodes(unsigned long *max_zone_pfn)
        unsigned long nid;
        enum zone_type i;
 
+       /* Sort early_node_map as initialisation assumes it is sorted */
+       sort_node_map();
+
        /* Record where the zone boundaries are */
        memset(arch_zone_lowest_possible_pfn, 0,
                                sizeof(arch_zone_lowest_possible_pfn));
index 0f539e8e827a7a1b0956c30d30ea89434b02bc26..93d9ee692fd8b193b12ba207f69f900c831e404d 100644 (file)
@@ -575,10 +575,6 @@ void handle_ra_miss(struct address_space *mapping,
  */
 unsigned long max_sane_readahead(unsigned long nr)
 {
-       unsigned long active;
-       unsigned long inactive;
-       unsigned long free;
-
-       __get_zone_counts(&active, &inactive, &free, NODE_DATA(numa_node_id()));
-       return min(nr, (inactive + free) / 2);
+       return min(nr, (node_page_state(numa_node_id(), NR_INACTIVE)
+               + node_page_state(numa_node_id(), NR_FREE_PAGES)) / 2);
 }
index 70da7a0981bfbad9683b5e9b0747277256a678ff..882053031aa0590b502551783c8902b50461abf1 100644 (file)
@@ -178,9 +178,9 @@ static inline void shmem_unacct_blocks(unsigned long flags, long pages)
 static struct super_operations shmem_ops;
 static const struct address_space_operations shmem_aops;
 static const struct file_operations shmem_file_operations;
-static struct inode_operations shmem_inode_operations;
-static struct inode_operations shmem_dir_inode_operations;
-static struct inode_operations shmem_special_inode_operations;
+static const struct inode_operations shmem_inode_operations;
+static const struct inode_operations shmem_dir_inode_operations;
+static const struct inode_operations shmem_special_inode_operations;
 static struct vm_operations_struct shmem_vm_ops;
 
 static struct backing_dev_info shmem_backing_dev_info  __read_mostly = {
@@ -1410,8 +1410,8 @@ shmem_get_inode(struct super_block *sb, int mode, dev_t dev)
 }
 
 #ifdef CONFIG_TMPFS
-static struct inode_operations shmem_symlink_inode_operations;
-static struct inode_operations shmem_symlink_inline_operations;
+static const struct inode_operations shmem_symlink_inode_operations;
+static const struct inode_operations shmem_symlink_inline_operations;
 
 /*
  * Normally tmpfs makes no use of shmem_prepare_write, but it
@@ -1904,12 +1904,12 @@ static void shmem_put_link(struct dentry *dentry, struct nameidata *nd, void *co
        }
 }
 
-static struct inode_operations shmem_symlink_inline_operations = {
+static const struct inode_operations shmem_symlink_inline_operations = {
        .readlink       = generic_readlink,
        .follow_link    = shmem_follow_link_inline,
 };
 
-static struct inode_operations shmem_symlink_inode_operations = {
+static const struct inode_operations shmem_symlink_inode_operations = {
        .truncate       = shmem_truncate,
        .readlink       = generic_readlink,
        .follow_link    = shmem_follow_link,
@@ -2316,7 +2316,7 @@ static void destroy_inodecache(void)
 
 static const struct address_space_operations shmem_aops = {
        .writepage      = shmem_writepage,
-       .set_page_dirty = __set_page_dirty_nobuffers,
+       .set_page_dirty = __set_page_dirty_no_writeback,
 #ifdef CONFIG_TMPFS
        .prepare_write  = shmem_prepare_write,
        .commit_write   = simple_commit_write,
@@ -2335,7 +2335,7 @@ static const struct file_operations shmem_file_operations = {
 #endif
 };
 
-static struct inode_operations shmem_inode_operations = {
+static const struct inode_operations shmem_inode_operations = {
        .truncate       = shmem_truncate,
        .setattr        = shmem_notify_change,
        .truncate_range = shmem_truncate_range,
@@ -2349,7 +2349,7 @@ static struct inode_operations shmem_inode_operations = {
 
 };
 
-static struct inode_operations shmem_dir_inode_operations = {
+static const struct inode_operations shmem_dir_inode_operations = {
 #ifdef CONFIG_TMPFS
        .create         = shmem_create,
        .lookup         = simple_lookup,
@@ -2371,7 +2371,7 @@ static struct inode_operations shmem_dir_inode_operations = {
 #endif
 };
 
-static struct inode_operations shmem_special_inode_operations = {
+static const struct inode_operations shmem_special_inode_operations = {
 #ifdef CONFIG_TMPFS_POSIX_ACL
        .setattr        = shmem_notify_change,
        .setxattr       = generic_setxattr,
index c6100628a6ef7be2325a55e18f69b80a5a0f2006..70784b848b69b475718f0090033770b7c17b511b 100644 (file)
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -793,8 +793,10 @@ static inline struct kmem_cache *__find_general_cachep(size_t size,
         * has cs_{dma,}cachep==NULL. Thus no special case
         * for large kmalloc calls required.
         */
+#ifdef CONFIG_ZONE_DMA
        if (unlikely(gfpflags & GFP_DMA))
                return csizep->cs_dmacachep;
+#endif
        return csizep->cs_cachep;
 }
 
@@ -1493,13 +1495,15 @@ void __init kmem_cache_init(void)
                                        ARCH_KMALLOC_FLAGS|SLAB_PANIC,
                                        NULL, NULL);
                }
-
-               sizes->cs_dmacachep = kmem_cache_create(names->name_dma,
+#ifdef CONFIG_ZONE_DMA
+               sizes->cs_dmacachep = kmem_cache_create(
+                                       names->name_dma,
                                        sizes->cs_size,
                                        ARCH_KMALLOC_MINALIGN,
                                        ARCH_KMALLOC_FLAGS|SLAB_CACHE_DMA|
                                                SLAB_PANIC,
                                        NULL, NULL);
+#endif
                sizes++;
                names++;
        }
@@ -2321,7 +2325,7 @@ kmem_cache_create (const char *name, size_t size, size_t align,
        cachep->slab_size = slab_size;
        cachep->flags = flags;
        cachep->gfpflags = 0;
-       if (flags & SLAB_CACHE_DMA)
+       if (CONFIG_ZONE_DMA_FLAG && (flags & SLAB_CACHE_DMA))
                cachep->gfpflags |= GFP_DMA;
        cachep->buffer_size = size;
        cachep->reciprocal_buffer_size = reciprocal_value(size);
@@ -2516,7 +2520,7 @@ EXPORT_SYMBOL(kmem_cache_shrink);
  * kmem_cache_destroy - delete a cache
  * @cachep: the cache to destroy
  *
- * Remove a struct kmem_cache object from the slab cache.
+ * Remove a &struct kmem_cache object from the slab cache.
  *
  * It is expected this function will be called by a module when it is
  * unloaded.  This will remove the cache completely, and avoid a duplicate
@@ -2643,10 +2647,12 @@ static void cache_init_objs(struct kmem_cache *cachep,
 
 static void kmem_flagcheck(struct kmem_cache *cachep, gfp_t flags)
 {
-       if (flags & GFP_DMA)
-               BUG_ON(!(cachep->gfpflags & GFP_DMA));
-       else
-               BUG_ON(cachep->gfpflags & GFP_DMA);
+       if (CONFIG_ZONE_DMA_FLAG) {
+               if (flags & GFP_DMA)
+                       BUG_ON(!(cachep->gfpflags & GFP_DMA));
+               else
+                       BUG_ON(cachep->gfpflags & GFP_DMA);
+       }
 }
 
 static void *slab_get_obj(struct kmem_cache *cachep, struct slab *slabp,
@@ -2814,19 +2820,11 @@ failed:
  */
 static void kfree_debugcheck(const void *objp)
 {
-       struct page *page;
-
        if (!virt_addr_valid(objp)) {
                printk(KERN_ERR "kfree_debugcheck: out of range ptr %lxh.\n",
                       (unsigned long)objp);
                BUG();
        }
-       page = virt_to_page(objp);
-       if (!PageSlab(page)) {
-               printk(KERN_ERR "kfree_debugcheck: bad ptr %lxh.\n",
-                      (unsigned long)objp);
-               BUG();
-       }
 }
 
 static inline void verify_redzone_free(struct kmem_cache *cache, void *obj)
@@ -3197,35 +3195,6 @@ static inline void *____cache_alloc(struct kmem_cache *cachep, gfp_t flags)
        return objp;
 }
 
-static __always_inline void *__cache_alloc(struct kmem_cache *cachep,
-                                               gfp_t flags, void *caller)
-{
-       unsigned long save_flags;
-       void *objp = NULL;
-
-       cache_alloc_debugcheck_before(cachep, flags);
-
-       local_irq_save(save_flags);
-
-       if (unlikely(NUMA_BUILD &&
-                       current->flags & (PF_SPREAD_SLAB | PF_MEMPOLICY)))
-               objp = alternate_node_alloc(cachep, flags);
-
-       if (!objp)
-               objp = ____cache_alloc(cachep, flags);
-       /*
-        * We may just have run out of memory on the local node.
-        * ____cache_alloc_node() knows how to locate memory on other nodes
-        */
-       if (NUMA_BUILD && !objp)
-               objp = ____cache_alloc_node(cachep, flags, numa_node_id());
-       local_irq_restore(save_flags);
-       objp = cache_alloc_debugcheck_after(cachep, flags, objp,
-                                           caller);
-       prefetchw(objp);
-       return objp;
-}
-
 #ifdef CONFIG_NUMA
 /*
  * Try allocating on another node if PF_SPREAD_SLAB|PF_MEMPOLICY.
@@ -3257,14 +3226,20 @@ static void *alternate_node_alloc(struct kmem_cache *cachep, gfp_t flags)
  * allocator to do its reclaim / fallback magic. We then insert the
  * slab into the proper nodelist and then allocate from it.
  */
-void *fallback_alloc(struct kmem_cache *cache, gfp_t flags)
+static void *fallback_alloc(struct kmem_cache *cache, gfp_t flags)
 {
-       struct zonelist *zonelist = &NODE_DATA(slab_node(current->mempolicy))
-                                       ->node_zonelists[gfp_zone(flags)];
+       struct zonelist *zonelist;
+       gfp_t local_flags;
        struct zone **z;
        void *obj = NULL;
        int nid;
-       gfp_t local_flags = (flags & GFP_LEVEL_MASK);
+
+       if (flags & __GFP_THISNODE)
+               return NULL;
+
+       zonelist = &NODE_DATA(slab_node(current->mempolicy))
+                       ->node_zonelists[gfp_zone(flags)];
+       local_flags = (flags & GFP_LEVEL_MASK);
 
 retry:
        /*
@@ -3374,16 +3349,110 @@ must_grow:
        if (x)
                goto retry;
 
-       if (!(flags & __GFP_THISNODE))
-               /* Unable to grow the cache. Fall back to other nodes. */
-               return fallback_alloc(cachep, flags);
-
-       return NULL;
+       return fallback_alloc(cachep, flags);
 
 done:
        return obj;
 }
-#endif
+
+/**
+ * kmem_cache_alloc_node - Allocate an object on the specified node
+ * @cachep: The cache to allocate from.
+ * @flags: See kmalloc().
+ * @nodeid: node number of the target node.
+ * @caller: return address of caller, used for debug information
+ *
+ * Identical to kmem_cache_alloc but it will allocate memory on the given
+ * node, which can improve the performance for cpu bound structures.
+ *
+ * Fallback to other node is possible if __GFP_THISNODE is not set.
+ */
+static __always_inline void *
+__cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid,
+                  void *caller)
+{
+       unsigned long save_flags;
+       void *ptr;
+
+       cache_alloc_debugcheck_before(cachep, flags);
+       local_irq_save(save_flags);
+
+       if (unlikely(nodeid == -1))
+               nodeid = numa_node_id();
+
+       if (unlikely(!cachep->nodelists[nodeid])) {
+               /* Node not bootstrapped yet */
+               ptr = fallback_alloc(cachep, flags);
+               goto out;
+       }
+
+       if (nodeid == numa_node_id()) {
+               /*
+                * Use the locally cached objects if possible.
+                * However ____cache_alloc does not allow fallback
+                * to other nodes. It may fail while we still have
+                * objects on other nodes available.
+                */
+               ptr = ____cache_alloc(cachep, flags);
+               if (ptr)
+                       goto out;
+       }
+       /* ___cache_alloc_node can fall back to other nodes */
+       ptr = ____cache_alloc_node(cachep, flags, nodeid);
+  out:
+       local_irq_restore(save_flags);
+       ptr = cache_alloc_debugcheck_after(cachep, flags, ptr, caller);
+
+       return ptr;
+}
+
+static __always_inline void *
+__do_cache_alloc(struct kmem_cache *cache, gfp_t flags)
+{
+       void *objp;
+
+       if (unlikely(current->flags & (PF_SPREAD_SLAB | PF_MEMPOLICY))) {
+               objp = alternate_node_alloc(cache, flags);
+               if (objp)
+                       goto out;
+       }
+       objp = ____cache_alloc(cache, flags);
+
+       /*
+        * We may just have run out of memory on the local node.
+        * ____cache_alloc_node() knows how to locate memory on other nodes
+        */
+       if (!objp)
+               objp = ____cache_alloc_node(cache, flags, numa_node_id());
+
+  out:
+       return objp;
+}
+#else
+
+static __always_inline void *
+__do_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
+{
+       return ____cache_alloc(cachep, flags);
+}
+
+#endif /* CONFIG_NUMA */
+
+static __always_inline void *
+__cache_alloc(struct kmem_cache *cachep, gfp_t flags, void *caller)
+{
+       unsigned long save_flags;
+       void *objp;
+
+       cache_alloc_debugcheck_before(cachep, flags);
+       local_irq_save(save_flags);
+       objp = __do_cache_alloc(cachep, flags);
+       local_irq_restore(save_flags);
+       objp = cache_alloc_debugcheck_after(cachep, flags, objp, caller);
+       prefetchw(objp);
+
+       return objp;
+}
 
 /*
  * Caller needs to acquire correct kmem_list's list_lock
@@ -3582,57 +3651,6 @@ out:
 }
 
 #ifdef CONFIG_NUMA
-/**
- * kmem_cache_alloc_node - Allocate an object on the specified node
- * @cachep: The cache to allocate from.
- * @flags: See kmalloc().
- * @nodeid: node number of the target node.
- * @caller: return address of caller, used for debug information
- *
- * Identical to kmem_cache_alloc but it will allocate memory on the given
- * node, which can improve the performance for cpu bound structures.
- *
- * Fallback to other node is possible if __GFP_THISNODE is not set.
- */
-static __always_inline void *
-__cache_alloc_node(struct kmem_cache *cachep, gfp_t flags,
-               int nodeid, void *caller)
-{
-       unsigned long save_flags;
-       void *ptr = NULL;
-
-       cache_alloc_debugcheck_before(cachep, flags);
-       local_irq_save(save_flags);
-
-       if (unlikely(nodeid == -1))
-               nodeid = numa_node_id();
-
-       if (likely(cachep->nodelists[nodeid])) {
-               if (nodeid == numa_node_id()) {
-                       /*
-                        * Use the locally cached objects if possible.
-                        * However ____cache_alloc does not allow fallback
-                        * to other nodes. It may fail while we still have
-                        * objects on other nodes available.
-                        */
-                       ptr = ____cache_alloc(cachep, flags);
-               }
-               if (!ptr) {
-                       /* ___cache_alloc_node can fall back to other nodes */
-                       ptr = ____cache_alloc_node(cachep, flags, nodeid);
-               }
-       } else {
-               /* Node not bootstrapped yet */
-               if (!(flags & __GFP_THISNODE))
-                       ptr = fallback_alloc(cachep, flags);
-       }
-
-       local_irq_restore(save_flags);
-       ptr = cache_alloc_debugcheck_after(cachep, flags, ptr, caller);
-
-       return ptr;
-}
-
 void *kmem_cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, int nodeid)
 {
        return __cache_alloc_node(cachep, flags, nodeid,
@@ -3733,6 +3751,7 @@ void kmem_cache_free(struct kmem_cache *cachep, void *objp)
        BUG_ON(virt_to_cache(objp) != cachep);
 
        local_irq_save(flags);
+       debug_check_no_locks_freed(objp, obj_size(cachep));
        __cache_free(cachep, objp);
        local_irq_restore(flags);
 }
@@ -4017,18 +4036,17 @@ void drain_array(struct kmem_cache *cachep, struct kmem_list3 *l3,
  * If we cannot acquire the cache chain mutex then just give up - we'll try
  * again on the next iteration.
  */
-static void cache_reap(struct work_struct *unused)
+static void cache_reap(struct work_struct *w)
 {
        struct kmem_cache *searchp;
        struct kmem_list3 *l3;
        int node = numa_node_id();
+       struct delayed_work *work =
+               container_of(w, struct delayed_work, work);
 
-       if (!mutex_trylock(&cache_chain_mutex)) {
+       if (!mutex_trylock(&cache_chain_mutex))
                /* Give up. Setup the next iteration. */
-               schedule_delayed_work(&__get_cpu_var(reap_work),
-                                     round_jiffies_relative(REAPTIMEOUT_CPUC));
-               return;
-       }
+               goto out;
 
        list_for_each_entry(searchp, &cache_chain, next) {
                check_irq_on();
@@ -4071,9 +4089,9 @@ next:
        mutex_unlock(&cache_chain_mutex);
        next_reap_node();
        refresh_cpu_vm_stats(smp_processor_id());
+out:
        /* Set up the next iteration */
-       schedule_delayed_work(&__get_cpu_var(reap_work),
-               round_jiffies_relative(REAPTIMEOUT_CPUC));
+       schedule_delayed_work(work, round_jiffies_relative(REAPTIMEOUT_CPUC));
 }
 
 #ifdef CONFIG_PROC_FS
index 5df947de7654461d43f1ba0a7ab80b46747239c8..ebf3fcb4115b8c664e54e4c47e02968ed93ab0be 100644 (file)
@@ -85,7 +85,7 @@ EXPORT_SYMBOL(cancel_dirty_page);
  *
  * We need to bale out if page->mapping is no longer equal to the original
  * mapping.  This happens a) when the VM reclaimed the page while we waited on
- * its lock, b) when a concurrent invalidate_inode_pages got there first and
+ * its lock, b) when a concurrent invalidate_mapping_pages got there first and
  * c) when tmpfs swizzles a page between a tmpfs inode and swapper_space.
  */
 static void
@@ -106,7 +106,7 @@ truncate_complete_page(struct address_space *mapping, struct page *page)
 }
 
 /*
- * This is for invalidate_inode_pages().  That function can be called at
+ * This is for invalidate_mapping_pages().  That function can be called at
  * any time, and is not supposed to throw away dirty pages.  But pages can
  * be marked dirty at any time too, so use remove_mapping which safely
  * discards clean, unused pages.
@@ -310,12 +310,7 @@ unlock:
        }
        return ret;
 }
-
-unsigned long invalidate_inode_pages(struct address_space *mapping)
-{
-       return invalidate_mapping_pages(mapping, 0, ~0UL);
-}
-EXPORT_SYMBOL(invalidate_inode_pages);
+EXPORT_SYMBOL(invalidate_mapping_pages);
 
 /*
  * This is like invalidate_complete_page(), except it ignores the page's
index 86897ee792d6b4a2f8e00a94cf4b12e2c1d6f075..9eef486da9093469fa6a101b05be786a02f0ed14 100644 (file)
@@ -699,7 +699,7 @@ finished:
  *     that it is big enough to cover the vma. Will return failure if
  *     that criteria isn't met.
  *
- *     Similar to remap_pfn_range (see mm/memory.c)
+ *     Similar to remap_pfn_range() (see mm/memory.c)
  */
 int remap_vmalloc_range(struct vm_area_struct *vma, void *addr,
                                                unsigned long pgoff)
index 7430df68cb64aaf2856c7158920442c77fe1cf27..0655d5fe73e82c164043bf99958397602d6846c7 100644 (file)
@@ -679,7 +679,7 @@ static unsigned long shrink_inactive_list(unsigned long max_scan,
                nr_taken = isolate_lru_pages(sc->swap_cluster_max,
                                             &zone->inactive_list,
                                             &page_list, &nr_scan);
-               zone->nr_inactive -= nr_taken;
+               __mod_zone_page_state(zone, NR_INACTIVE, -nr_taken);
                zone->pages_scanned += nr_scan;
                spin_unlock_irq(&zone->lru_lock);
 
@@ -740,7 +740,8 @@ static inline void note_zone_scanning_priority(struct zone *zone, int priority)
 
 static inline int zone_is_near_oom(struct zone *zone)
 {
-       return zone->pages_scanned >= (zone->nr_active + zone->nr_inactive)*3;
+       return zone->pages_scanned >= (zone_page_state(zone, NR_ACTIVE)
+                               + zone_page_state(zone, NR_INACTIVE))*3;
 }
 
 /*
@@ -825,7 +826,7 @@ force_reclaim_mapped:
        pgmoved = isolate_lru_pages(nr_pages, &zone->active_list,
                                    &l_hold, &pgscanned);
        zone->pages_scanned += pgscanned;
-       zone->nr_active -= pgmoved;
+       __mod_zone_page_state(zone, NR_ACTIVE, -pgmoved);
        spin_unlock_irq(&zone->lru_lock);
 
        while (!list_empty(&l_hold)) {
@@ -857,7 +858,7 @@ force_reclaim_mapped:
                list_move(&page->lru, &zone->inactive_list);
                pgmoved++;
                if (!pagevec_add(&pvec, page)) {
-                       zone->nr_inactive += pgmoved;
+                       __mod_zone_page_state(zone, NR_INACTIVE, pgmoved);
                        spin_unlock_irq(&zone->lru_lock);
                        pgdeactivate += pgmoved;
                        pgmoved = 0;
@@ -867,7 +868,7 @@ force_reclaim_mapped:
                        spin_lock_irq(&zone->lru_lock);
                }
        }
-       zone->nr_inactive += pgmoved;
+       __mod_zone_page_state(zone, NR_INACTIVE, pgmoved);
        pgdeactivate += pgmoved;
        if (buffer_heads_over_limit) {
                spin_unlock_irq(&zone->lru_lock);
@@ -885,14 +886,14 @@ force_reclaim_mapped:
                list_move(&page->lru, &zone->active_list);
                pgmoved++;
                if (!pagevec_add(&pvec, page)) {
-                       zone->nr_active += pgmoved;
+                       __mod_zone_page_state(zone, NR_ACTIVE, pgmoved);
                        pgmoved = 0;
                        spin_unlock_irq(&zone->lru_lock);
                        __pagevec_release(&pvec);
                        spin_lock_irq(&zone->lru_lock);
                }
        }
-       zone->nr_active += pgmoved;
+       __mod_zone_page_state(zone, NR_ACTIVE, pgmoved);
 
        __count_zone_vm_events(PGREFILL, zone, pgscanned);
        __count_vm_events(PGDEACTIVATE, pgdeactivate);
@@ -918,14 +919,16 @@ static unsigned long shrink_zone(int priority, struct zone *zone,
         * Add one to `nr_to_scan' just to make sure that the kernel will
         * slowly sift through the active list.
         */
-       zone->nr_scan_active += (zone->nr_active >> priority) + 1;
+       zone->nr_scan_active +=
+               (zone_page_state(zone, NR_ACTIVE) >> priority) + 1;
        nr_active = zone->nr_scan_active;
        if (nr_active >= sc->swap_cluster_max)
                zone->nr_scan_active = 0;
        else
                nr_active = 0;
 
-       zone->nr_scan_inactive += (zone->nr_inactive >> priority) + 1;
+       zone->nr_scan_inactive +=
+               (zone_page_state(zone, NR_INACTIVE) >> priority) + 1;
        nr_inactive = zone->nr_scan_inactive;
        if (nr_inactive >= sc->swap_cluster_max)
                zone->nr_scan_inactive = 0;
@@ -1037,7 +1040,8 @@ unsigned long try_to_free_pages(struct zone **zones, gfp_t gfp_mask)
                if (!cpuset_zone_allowed_hardwall(zone, GFP_KERNEL))
                        continue;
 
-               lru_pages += zone->nr_active + zone->nr_inactive;
+               lru_pages += zone_page_state(zone, NR_ACTIVE)
+                               + zone_page_state(zone, NR_INACTIVE);
        }
 
        for (priority = DEF_PRIORITY; priority >= 0; priority--) {
@@ -1182,7 +1186,8 @@ loop_again:
                for (i = 0; i <= end_zone; i++) {
                        struct zone *zone = pgdat->node_zones + i;
 
-                       lru_pages += zone->nr_active + zone->nr_inactive;
+                       lru_pages += zone_page_state(zone, NR_ACTIVE)
+                                       + zone_page_state(zone, NR_INACTIVE);
                }
 
                /*
@@ -1219,8 +1224,9 @@ loop_again:
                        if (zone->all_unreclaimable)
                                continue;
                        if (nr_slab == 0 && zone->pages_scanned >=
-                                   (zone->nr_active + zone->nr_inactive) * 6)
-                               zone->all_unreclaimable = 1;
+                               (zone_page_state(zone, NR_ACTIVE)
+                               + zone_page_state(zone, NR_INACTIVE)) * 6)
+                                       zone->all_unreclaimable = 1;
                        /*
                         * If we've done a decent amount of scanning and
                         * the reclaim ratio is low, start doing writepage
@@ -1385,18 +1391,22 @@ static unsigned long shrink_all_zones(unsigned long nr_pages, int prio,
 
                /* For pass = 0 we don't shrink the active list */
                if (pass > 0) {
-                       zone->nr_scan_active += (zone->nr_active >> prio) + 1;
+                       zone->nr_scan_active +=
+                               (zone_page_state(zone, NR_ACTIVE) >> prio) + 1;
                        if (zone->nr_scan_active >= nr_pages || pass > 3) {
                                zone->nr_scan_active = 0;
-                               nr_to_scan = min(nr_pages, zone->nr_active);
+                               nr_to_scan = min(nr_pages,
+                                       zone_page_state(zone, NR_ACTIVE));
                                shrink_active_list(nr_to_scan, zone, sc, prio);
                        }
                }
 
-               zone->nr_scan_inactive += (zone->nr_inactive >> prio) + 1;
+               zone->nr_scan_inactive +=
+                       (zone_page_state(zone, NR_INACTIVE) >> prio) + 1;
                if (zone->nr_scan_inactive >= nr_pages || pass > 3) {
                        zone->nr_scan_inactive = 0;
-                       nr_to_scan = min(nr_pages, zone->nr_inactive);
+                       nr_to_scan = min(nr_pages,
+                               zone_page_state(zone, NR_INACTIVE));
                        ret += shrink_inactive_list(nr_to_scan, zone, sc);
                        if (ret >= nr_pages)
                                return ret;
@@ -1408,12 +1418,7 @@ static unsigned long shrink_all_zones(unsigned long nr_pages, int prio,
 
 static unsigned long count_lru_pages(void)
 {
-       struct zone *zone;
-       unsigned long ret = 0;
-
-       for_each_zone(zone)
-               ret += zone->nr_active + zone->nr_inactive;
-       return ret;
+       return global_page_state(NR_ACTIVE) + global_page_state(NR_INACTIVE);
 }
 
 /*
index dc005a0c96ae5a0162b9da79e43d663c61c9422a..6c488d6ac425d948b7b77d78a6cac899be16af6a 100644 (file)
 #include <linux/module.h>
 #include <linux/cpu.h>
 
-void __get_zone_counts(unsigned long *active, unsigned long *inactive,
-                       unsigned long *free, struct pglist_data *pgdat)
-{
-       struct zone *zones = pgdat->node_zones;
-       int i;
-
-       *active = 0;
-       *inactive = 0;
-       *free = 0;
-       for (i = 0; i < MAX_NR_ZONES; i++) {
-               *active += zones[i].nr_active;
-               *inactive += zones[i].nr_inactive;
-               *free += zones[i].free_pages;
-       }
-}
-
-void get_zone_counts(unsigned long *active,
-               unsigned long *inactive, unsigned long *free)
-{
-       struct pglist_data *pgdat;
-
-       *active = 0;
-       *inactive = 0;
-       *free = 0;
-       for_each_online_pgdat(pgdat) {
-               unsigned long l, m, n;
-               __get_zone_counts(&l, &m, &n, pgdat);
-               *active += l;
-               *inactive += m;
-               *free += n;
-       }
-}
-
 #ifdef CONFIG_VM_EVENT_COUNTERS
 DEFINE_PER_CPU(struct vm_event_state, vm_event_states) = {{0}};
 EXPORT_PER_CPU_SYMBOL(vm_event_states);
@@ -239,7 +206,7 @@ EXPORT_SYMBOL(mod_zone_page_state);
  * in between and therefore the atomicity vs. interrupt cannot be exploited
  * in a useful way here.
  */
-static void __inc_zone_state(struct zone *zone, enum zone_stat_item item)
+void __inc_zone_state(struct zone *zone, enum zone_stat_item item)
 {
        struct per_cpu_pageset *pcp = zone_pcp(zone, smp_processor_id());
        s8 *p = pcp->vm_stat_diff + item;
@@ -260,9 +227,8 @@ void __inc_zone_page_state(struct page *page, enum zone_stat_item item)
 }
 EXPORT_SYMBOL(__inc_zone_page_state);
 
-void __dec_zone_page_state(struct page *page, enum zone_stat_item item)
+void __dec_zone_state(struct zone *zone, enum zone_stat_item item)
 {
-       struct zone *zone = page_zone(page);
        struct per_cpu_pageset *pcp = zone_pcp(zone, smp_processor_id());
        s8 *p = pcp->vm_stat_diff + item;
 
@@ -275,6 +241,11 @@ void __dec_zone_page_state(struct page *page, enum zone_stat_item item)
                *p = overstep;
        }
 }
+
+void __dec_zone_page_state(struct page *page, enum zone_stat_item item)
+{
+       __dec_zone_state(page_zone(page), item);
+}
 EXPORT_SYMBOL(__dec_zone_page_state);
 
 void inc_zone_state(struct zone *zone, enum zone_stat_item item)
@@ -437,6 +408,12 @@ const struct seq_operations fragmentation_op = {
        .show   = frag_show,
 };
 
+#ifdef CONFIG_ZONE_DMA
+#define TEXT_FOR_DMA(xx) xx "_dma",
+#else
+#define TEXT_FOR_DMA(xx)
+#endif
+
 #ifdef CONFIG_ZONE_DMA32
 #define TEXT_FOR_DMA32(xx) xx "_dma32",
 #else
@@ -449,19 +426,22 @@ const struct seq_operations fragmentation_op = {
 #define TEXT_FOR_HIGHMEM(xx)
 #endif
 
-#define TEXTS_FOR_ZONES(xx) xx "_dma", TEXT_FOR_DMA32(xx) xx "_normal", \
+#define TEXTS_FOR_ZONES(xx) TEXT_FOR_DMA(xx) TEXT_FOR_DMA32(xx) xx "_normal", \
                                        TEXT_FOR_HIGHMEM(xx)
 
 static const char * const vmstat_text[] = {
        /* Zoned VM counters */
+       "nr_free_pages",
+       "nr_active",
+       "nr_inactive",
        "nr_anon_pages",
        "nr_mapped",
        "nr_file_pages",
+       "nr_dirty",
+       "nr_writeback",
        "nr_slab_reclaimable",
        "nr_slab_unreclaimable",
        "nr_page_table_pages",
-       "nr_dirty",
-       "nr_writeback",
        "nr_unstable",
        "nr_bounce",
        "nr_vmscan_write",
@@ -529,17 +509,13 @@ static int zoneinfo_show(struct seq_file *m, void *arg)
                           "\n        min      %lu"
                           "\n        low      %lu"
                           "\n        high     %lu"
-                          "\n        active   %lu"
-                          "\n        inactive %lu"
                           "\n        scanned  %lu (a: %lu i: %lu)"
                           "\n        spanned  %lu"
                           "\n        present  %lu",
-                          zone->free_pages,
+                          zone_page_state(zone, NR_FREE_PAGES),
                           zone->pages_min,
                           zone->pages_low,
                           zone->pages_high,
-                          zone->nr_active,
-                          zone->nr_inactive,
                           zone->pages_scanned,
                           zone->nr_scan_active, zone->nr_scan_inactive,
                           zone->spanned_pages,
@@ -562,12 +538,6 @@ static int zoneinfo_show(struct seq_file *m, void *arg)
                        int j;
 
                        pageset = zone_pcp(zone, i);
-                       for (j = 0; j < ARRAY_SIZE(pageset->pcp); j++) {
-                               if (pageset->pcp[j].count)
-                                       break;
-                       }
-                       if (j == ARRAY_SIZE(pageset->pcp))
-                               continue;
                        for (j = 0; j < ARRAY_SIZE(pageset->pcp); j++) {
                                seq_printf(m,
                                           "\n    cpu: %i pcp: %i"
index 2a27e37bc4cb263869b0e5a20643997064067713..675d9ba8e591bf78803a09ecd3fcfa32596224b7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * NET3:       Fibre Channel device handling subroutines
- * 
+ *
  *             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
@@ -14,7 +14,6 @@
 #include <asm/system.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
 #include <net/arp.h>
 
 /*
- *     Put the headers on a Fibre Channel packet. 
+ *     Put the headers on a Fibre Channel packet.
  */
+
 static int fc_header(struct sk_buff *skb, struct net_device *dev,
                     unsigned short type,
-                    void *daddr, void *saddr, unsigned len) 
+                    void *daddr, void *saddr, unsigned len)
 {
        struct fch_hdr *fch;
        int hdr_len;
 
-       /* 
-        * Add the 802.2 SNAP header if IP as the IPv4 code calls  
+       /*
+        * Add the 802.2 SNAP header if IP as the IPv4 code calls
         * dev->hard_header directly.
         */
        if (type == ETH_P_IP || type == ETH_P_ARP)
@@ -60,7 +59,7 @@ static int fc_header(struct sk_buff *skb, struct net_device *dev,
        else
        {
                hdr_len = sizeof(struct fch_hdr);
-               fch = (struct fch_hdr *)skb_push(skb, hdr_len); 
+               fch = (struct fch_hdr *)skb_push(skb, hdr_len);
        }
 
        if(saddr)
@@ -68,20 +67,20 @@ static int fc_header(struct sk_buff *skb, struct net_device *dev,
        else
                memcpy(fch->saddr,dev->dev_addr,dev->addr_len);
 
-       if(daddr) 
+       if(daddr)
        {
                memcpy(fch->daddr,daddr,dev->addr_len);
                return(hdr_len);
        }
        return -hdr_len;
 }
-       
+
 /*
  *     A neighbour discovery of some species (eg arp) has completed. We
  *     can now send the packet.
  */
-static int fc_rebuild_header(struct sk_buff *skb) 
+
+static int fc_rebuild_header(struct sk_buff *skb)
 {
        struct fch_hdr *fch=(struct fch_hdr *)skb->data;
        struct fcllc *fcllc=(struct fcllc *)(skb->data+sizeof(struct fch_hdr));
@@ -100,7 +99,7 @@ static void fc_setup(struct net_device *dev)
 {
        dev->hard_header        = fc_header;
        dev->rebuild_header     = fc_rebuild_header;
-                
+
        dev->type               = ARPHRD_IEEE802;
        dev->hard_header_len    = FC_HLEN;
        dev->mtu                = 2024;
index 797c6d961deba4468a83d7b1d19eeff23cedec56..ace6386384bcee286cb7646cb86d078e65015868 100644 (file)
@@ -15,7 +15,7 @@
  *                     Mark Evans, <evansmp@uhura.aston.ac.uk>
  *                     Florian La Roche, <rzsfl@rz.uni-sb.de>
  *                     Alan Cox, <gw4pts@gw4pts.ampr.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; either version
  *             Alan Cox                :       New arp/rebuild header
  *             Maciej W. Rozycki       :       IPv6 support
  */
+
 #include <linux/module.h>
 #include <asm/system.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
@@ -57,7 +56,7 @@ static int fddi_header(struct sk_buff *skb, struct net_device *dev,
 {
        int hl = FDDI_K_SNAP_HLEN;
        struct fddihdr *fddi;
-       
+
        if(type != ETH_P_IP && type != ETH_P_IPV6 && type != ETH_P_ARP)
                hl=FDDI_K_8022_HLEN-3;
        fddi = (struct fddihdr *)skb_push(skb, hl);
@@ -74,7 +73,7 @@ static int fddi_header(struct sk_buff *skb, struct net_device *dev,
        }
 
        /* Set the source and destination hardware addresses */
-        
+
        if (saddr != NULL)
                memcpy(fddi->saddr, saddr, dev->addr_len);
        else
@@ -95,7 +94,7 @@ static int fddi_header(struct sk_buff *skb, struct net_device *dev,
  * (or in future other address resolution) has completed on
  * this sk_buff.  We now let ARP fill in the other fields.
  */
+
 static int fddi_rebuild_header(struct sk_buff  *skb)
 {
        struct fddihdr *fddi = (struct fddihdr *)skb->data;
@@ -105,7 +104,7 @@ static int fddi_rebuild_header(struct sk_buff       *skb)
                /* Try to get ARP to resolve the header and fill destination address */
                return arp_find(fddi->daddr, skb);
        else
-#endif 
+#endif
        {
                printk("%s: Don't know how to resolve type %04X addresses.\n",
                       skb->dev->name, ntohs(fddi->hdr.llc_snap.ethertype));
@@ -120,19 +119,19 @@ static int fddi_rebuild_header(struct sk_buff     *skb)
  * up.  It's used to fill in specific skb fields and to set
  * the proper pointer to the start of packet data (skb->data).
  */
+
 __be16 fddi_type_trans(struct sk_buff *skb, struct net_device *dev)
 {
        struct fddihdr *fddi = (struct fddihdr *)skb->data;
        __be16 type;
-       
+
        /*
         * Set mac.raw field to point to FC byte, set data field to point
         * to start of packet data.  Assume 802.2 SNAP frames for now.
         */
 
        skb->mac.raw = skb->data;       /* point to frame control (FC) */
-       
+
        if(fddi->hdr.llc_8022_1.dsap==0xe0)
        {
                skb_pull(skb, FDDI_K_8022_HLEN-3);
@@ -143,9 +142,9 @@ __be16 fddi_type_trans(struct sk_buff *skb, struct net_device *dev)
                skb_pull(skb, FDDI_K_SNAP_HLEN);                /* adjust for 21 byte header */
                type=fddi->hdr.llc_snap.ethertype;
        }
-       
+
        /* Set packet type based on destination address and flag settings */
-                       
+
        if (*fddi->daddr & 0x01)
        {
                if (memcmp(fddi->daddr, dev->broadcast, FDDI_K_ALEN) == 0)
@@ -153,7 +152,7 @@ __be16 fddi_type_trans(struct sk_buff *skb, struct net_device *dev)
                else
                        skb->pkt_type = PACKET_MULTICAST;
        }
-       
+
        else if (dev->flags & IFF_PROMISC)
        {
                if (memcmp(fddi->daddr, dev->dev_addr, FDDI_K_ALEN))
@@ -187,7 +186,7 @@ static void fddi_setup(struct net_device *dev)
        dev->addr_len           = FDDI_K_ALEN;
        dev->tx_queue_len       = 100;                  /* Long queues on FDDI */
        dev->flags              = IFF_BROADCAST | IFF_MULTICAST;
-       
+
        memset(dev->broadcast, 0xFF, FDDI_K_ALEN);
 }
 
index 579e2ddf5ebe85dfc701b1ded4a1731b97393662..578f2a3d692d2019a22b56105cef81c56ab10c4f 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
@@ -39,7 +38,7 @@
 #include <asm/system.h>
 
 /*
- * Create the HIPPI MAC header for an arbitrary protocol layer 
+ * Create the HIPPI MAC header for an arbitrary protocol layer
  *
  * saddr=NULL  means use device source address
  * daddr=NULL  means leave destination address (eg unresolved arp)
@@ -104,8 +103,8 @@ static int hippi_rebuild_header(struct sk_buff *skb)
        /*
         * Only IP is currently supported
         */
-        
-       if(hip->snap.ethertype != __constant_htons(ETH_P_IP)) 
+
+       if(hip->snap.ethertype != __constant_htons(ETH_P_IP))
        {
                printk(KERN_DEBUG "%s: unable to resolve type %X addresses.\n",skb->dev->name,ntohs(hip->snap.ethertype));
                return 0;
@@ -122,11 +121,11 @@ static int hippi_rebuild_header(struct sk_buff *skb)
 /*
  *     Determine the packet's protocol ID.
  */
+
 __be16 hippi_type_trans(struct sk_buff *skb, struct net_device *dev)
 {
        struct hippi_hdr *hip;
-       
+
        hip = (struct hippi_hdr *) skb->data;
 
        /*
@@ -173,10 +172,10 @@ static int hippi_neigh_setup_dev(struct net_device *dev, struct neigh_parms *p)
 {
        /* Never send broadcast/multicast ARP messages */
        p->mcast_probes = 0;
+
        /* In IPv6 unicast probes are valid even on NBMA,
        * because they are encapsulated in normal IPv6 protocol.
-       * Should be a generic flag. 
+       * Should be a generic flag.
        */
        if (p->tbl->family != AF_INET6)
                p->ucast_probes = 0;
@@ -193,7 +192,7 @@ static void hippi_setup(struct net_device *dev)
        dev->hard_header_parse          = NULL;
        dev->hard_header_cache          = NULL;
        dev->header_cache_update        = NULL;
-       dev->neigh_setup                = hippi_neigh_setup_dev; 
+       dev->neigh_setup                = hippi_neigh_setup_dev;
 
        /*
         * We don't support HIPPI `ARP' for the time being, and probably
@@ -210,9 +209,9 @@ static void hippi_setup(struct net_device *dev)
 
        /*
         * HIPPI doesn't support broadcast+multicast and we only use
-        * static ARP tables. ARP is disabled by hippi_neigh_setup_dev. 
+        * static ARP tables. ARP is disabled by hippi_neigh_setup_dev.
         */
-       dev->flags = 0; 
+       dev->flags = 0;
 }
 
 /**
index 270b9d2cae6589b983f9925ee728370aec74cec7..6e7c2120b83ff6a678ca0e3e33f377b713a711cf 100644 (file)
@@ -117,7 +117,7 @@ module_exit(snap_exit);
  */
 struct datalink_proto *register_snap_client(unsigned char *desc,
                                            int (*rcvfunc)(struct sk_buff *,
-                                                          struct net_device *,
+                                                          struct net_device *,
                                                           struct packet_type *,
                                                           struct net_device *))
 {
index 829deb41ce81d436aad10567d03d35ca86532b58..96bd14452c55826fb1875e1b59dbd3ac691e2b58 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * NET3:       Token ring device handling subroutines
- * 
+ *
  *             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
@@ -12,7 +12,7 @@
  *              22 Jun 98 Paul Norton <p.norton@computer.org> Rearranged
  *              tr_header and tr_type_trans to handle passing IPX SNAP and
  *              802.2 through the correct layers. Eliminated tr_reformat.
- *        
+ *
  */
 
 #include <asm/uaccess.h>
@@ -45,7 +45,7 @@ static void rif_check_expire(unsigned long dummy);
 /*
  *     Each RIF entry we learn is kept this way
  */
+
 struct rif_cache {
        unsigned char addr[TR_ALEN];
        int iface;
@@ -62,7 +62,7 @@ struct rif_cache {
  *     We hash the RIF cache 32 ways. We do after all have to look it
  *     up a lot.
  */
+
 static struct rif_cache *rif_table[RIF_TABLE_SIZE];
 
 static DEFINE_SPINLOCK(rif_lock);
@@ -71,7 +71,7 @@ static DEFINE_SPINLOCK(rif_lock);
 /*
  *     Garbage disposal timer.
  */
+
 static struct timer_list rif_timer;
 
 int sysctl_tr_rif_timeout = 60*10*HZ;
@@ -96,16 +96,16 @@ static inline unsigned long rif_hash(const unsigned char *addr)
  *     Put the headers on a token ring packet. Token ring source routing
  *     makes this a little more exciting than on ethernet.
  */
+
 static int tr_header(struct sk_buff *skb, struct net_device *dev,
                     unsigned short type,
-                    void *daddr, void *saddr, unsigned len) 
+                    void *daddr, void *saddr, unsigned len)
 {
        struct trh_hdr *trh;
        int hdr_len;
 
-       /* 
-        * Add the 802.2 SNAP header if IP as the IPv4/IPv6 code calls  
+       /*
+        * Add the 802.2 SNAP header if IP as the IPv4/IPv6 code calls
         * dev->hard_header directly.
         */
        if (type == ETH_P_IP || type == ETH_P_IPV6 || type == ETH_P_ARP)
@@ -123,7 +123,7 @@ static int tr_header(struct sk_buff *skb, struct net_device *dev,
        else
        {
                hdr_len = sizeof(struct trh_hdr);
-               trh = (struct trh_hdr *)skb_push(skb, hdr_len); 
+               trh = (struct trh_hdr *)skb_push(skb, hdr_len);
        }
 
        trh->ac=AC;
@@ -137,8 +137,8 @@ static int tr_header(struct sk_buff *skb, struct net_device *dev,
        /*
         *      Build the destination and then source route the frame
         */
-        
-       if(daddr) 
+
+       if(daddr)
        {
                memcpy(trh->daddr,daddr,dev->addr_len);
                tr_source_route(skb,trh,dev);
@@ -147,13 +147,13 @@ static int tr_header(struct sk_buff *skb, struct net_device *dev,
 
        return -hdr_len;
 }
-       
+
 /*
  *     A neighbour discovery of some species (eg arp) has completed. We
  *     can now send the packet.
  */
-static int tr_rebuild_header(struct sk_buff *skb) 
+
+static int tr_rebuild_header(struct sk_buff *skb)
 {
        struct trh_hdr *trh=(struct trh_hdr *)skb->data;
        struct trllc *trllc=(struct trllc *)(skb->data+sizeof(struct trh_hdr));
@@ -162,7 +162,7 @@ static int tr_rebuild_header(struct sk_buff *skb)
        /*
         *      FIXME: We don't yet support IPv6 over token rings
         */
-        
+
        if(trllc->ethertype != htons(ETH_P_IP)) {
                printk("tr_rebuild_header: Don't know how to resolve type %04X addresses ?\n", ntohs(trllc->ethertype));
                return 0;
@@ -172,39 +172,39 @@ static int tr_rebuild_header(struct sk_buff *skb)
        if(arp_find(trh->daddr, skb)) {
                        return 1;
        }
-       else 
-#endif 
-       {       
-               tr_source_route(skb,trh,dev); 
+       else
+#endif
+       {
+               tr_source_route(skb,trh,dev);
                return 0;
        }
 }
-       
+
 /*
  *     Some of this is a bit hackish. We intercept RIF information
  *     used for source routing. We also grab IP directly and don't feed
  *     it via SNAP.
  */
+
 __be16 tr_type_trans(struct sk_buff *skb, struct net_device *dev)
 {
 
        struct trh_hdr *trh=(struct trh_hdr *)skb->data;
        struct trllc *trllc;
        unsigned riflen=0;
-       
+
        skb->mac.raw = skb->data;
-       
-               if(trh->saddr[0] & TR_RII)
+
+       if(trh->saddr[0] & TR_RII)
                riflen = (ntohs(trh->rcf) & TR_RCF_LEN_MASK) >> 8;
 
        trllc = (struct trllc *)(skb->data+sizeof(struct trh_hdr)-TR_MAXRIFLEN+riflen);
 
        skb_pull(skb,sizeof(struct trh_hdr)-TR_MAXRIFLEN+riflen);
 
-       if(*trh->daddr & 0x80) 
+       if(*trh->daddr & 0x80)
        {
-               if(!memcmp(trh->daddr,dev->broadcast,TR_ALEN))  
+               if(!memcmp(trh->daddr,dev->broadcast,TR_ALEN))
                        skb->pkt_type=PACKET_BROADCAST;
                else
                        skb->pkt_type=PACKET_MULTICAST;
@@ -213,7 +213,7 @@ __be16 tr_type_trans(struct sk_buff *skb, struct net_device *dev)
        {
                skb->pkt_type=PACKET_MULTICAST;
        }
-       else if(dev->flags & IFF_PROMISC) 
+       else if(dev->flags & IFF_PROMISC)
        {
                if(memcmp(trh->daddr, dev->dev_addr, TR_ALEN))
                        skb->pkt_type=PACKET_OTHERHOST;
@@ -221,10 +221,10 @@ __be16 tr_type_trans(struct sk_buff *skb, struct net_device *dev)
 
        if ((skb->pkt_type != PACKET_BROADCAST) &&
            (skb->pkt_type != PACKET_MULTICAST))
-               tr_add_rif_info(trh,dev) ; 
+               tr_add_rif_info(trh,dev) ;
 
        /*
-        * Strip the SNAP header from ARP packets since we don't 
+        * Strip the SNAP header from ARP packets since we don't
         * pass them through to the 802.2/SNAP layers.
         */
 
@@ -241,32 +241,32 @@ __be16 tr_type_trans(struct sk_buff *skb, struct net_device *dev)
 }
 
 /*
- *     We try to do source routing... 
+ *     We try to do source routing...
  */
 
-void tr_source_route(struct sk_buff *skb,struct trh_hdr *trh,struct net_device *dev) 
+void tr_source_route(struct sk_buff *skb,struct trh_hdr *trh,struct net_device *dev)
 {
        int slack;
        unsigned int hash;
        struct rif_cache *entry;
        unsigned char *olddata;
        unsigned long flags;
-       static const unsigned char mcast_func_addr[] 
+       static const unsigned char mcast_func_addr[]
                = {0xC0,0x00,0x00,0x04,0x00,0x00};
-       
+
        spin_lock_irqsave(&rif_lock, flags);
 
        /*
-        *      Broadcasts are single route as stated in RFC 1042 
+        *      Broadcasts are single route as stated in RFC 1042
         */
        if( (!memcmp(&(trh->daddr[0]),&(dev->broadcast[0]),TR_ALEN)) ||
            (!memcmp(&(trh->daddr[0]),&(mcast_func_addr[0]), TR_ALEN))  )
        {
-               trh->rcf=htons((((sizeof(trh->rcf)) << 8) & TR_RCF_LEN_MASK)  
+               trh->rcf=htons((((sizeof(trh->rcf)) << 8) & TR_RCF_LEN_MASK)
                               | TR_RCF_FRAME2K | TR_RCF_LIMITED_BROADCAST);
                trh->saddr[0]|=TR_RII;
        }
-       else 
+       else
        {
                hash = rif_hash(trh->daddr);
                /*
@@ -277,7 +277,7 @@ void tr_source_route(struct sk_buff *skb,struct trh_hdr *trh,struct net_device *
                /*
                 *      If we found an entry we can route the frame.
                 */
-               if(entry) 
+               if(entry)
                {
 #if TR_SR_DEBUG
 printk("source routing for %02X:%02X:%02X:%02X:%02X:%02X\n",trh->daddr[0],
@@ -287,7 +287,7 @@ printk("source routing for %02X:%02X:%02X:%02X:%02X:%02X\n",trh->daddr[0],
                        {
                                trh->rcf=entry->rcf;
                                memcpy(&trh->rseg[0],&entry->rseg[0],8*sizeof(unsigned short));
-                               trh->rcf^=htons(TR_RCF_DIR_BIT);        
+                               trh->rcf^=htons(TR_RCF_DIR_BIT);
                                trh->rcf&=htons(0x1fff);        /* Issam Chehab <ichehab@madge1.demon.co.uk> */
 
                                trh->saddr[0]|=TR_RII;
@@ -301,14 +301,14 @@ printk("source routing for %02X:%02X:%02X:%02X:%02X:%02X\n",trh->daddr[0],
                        }
                        entry->last_used=jiffies;
                }
-               else 
+               else
                {
                        /*
                         *      Without the information we simply have to shout
                         *      on the wire. The replies should rapidly clean this
                         *      situation up.
                         */
-                       trh->rcf=htons((((sizeof(trh->rcf)) << 8) & TR_RCF_LEN_MASK)  
+                       trh->rcf=htons((((sizeof(trh->rcf)) << 8) & TR_RCF_LEN_MASK)
                                       | TR_RCF_FRAME2K | TR_RCF_LIMITED_BROADCAST);
                        trh->saddr[0]|=TR_RII;
 #if TR_SR_DEBUG
@@ -320,7 +320,7 @@ printk("source routing for %02X:%02X:%02X:%02X:%02X:%02X\n",trh->daddr[0],
        /* Compress the RIF here so we don't have to do it in the driver(s) */
        if (!(trh->saddr[0] & 0x80))
                slack = 18;
-       else 
+       else
                slack = 18 - ((ntohs(trh->rcf) & TR_RCF_LEN_MASK)>>8);
        olddata = skb->data;
        spin_unlock_irqrestore(&rif_lock, flags);
@@ -333,7 +333,7 @@ printk("source routing for %02X:%02X:%02X:%02X:%02X:%02X\n",trh->daddr[0],
  *     We have learned some new RIF information for our source
  *     routing.
  */
+
 static void tr_add_rif_info(struct trh_hdr *trh, struct net_device *dev)
 {
        unsigned int hash, rii_p = 0;
@@ -343,29 +343,29 @@ static void tr_add_rif_info(struct trh_hdr *trh, struct net_device *dev)
 
        spin_lock_irqsave(&rif_lock, flags);
        saddr0 = trh->saddr[0];
-       
+
        /*
         *      Firstly see if the entry exists
         */
 
-               if(trh->saddr[0] & TR_RII)
+       if(trh->saddr[0] & TR_RII)
        {
                trh->saddr[0]&=0x7f;
                if (((ntohs(trh->rcf) & TR_RCF_LEN_MASK) >> 8) > 2)
                {
                        rii_p = 1;
-               }
+               }
        }
 
        hash = rif_hash(trh->saddr);
        for(entry=rif_table[hash];entry && memcmp(&(entry->addr[0]),&(trh->saddr[0]),TR_ALEN);entry=entry->next);
 
-       if(entry==NULL) 
+       if(entry==NULL)
        {
 #if TR_SR_DEBUG
 printk("adding rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
                trh->saddr[0],trh->saddr[1],trh->saddr[2],
-                       trh->saddr[3],trh->saddr[4],trh->saddr[5],
+               trh->saddr[3],trh->saddr[4],trh->saddr[5],
                ntohs(trh->rcf));
 #endif
                /*
@@ -377,7 +377,7 @@ printk("adding rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
                 */
                entry=kmalloc(sizeof(struct rif_cache),GFP_ATOMIC);
 
-               if(!entry) 
+               if(!entry)
                {
                        printk(KERN_DEBUG "tr.c: Couldn't malloc rif cache entry !\n");
                        spin_unlock_irqrestore(&rif_lock, flags);
@@ -400,13 +400,13 @@ printk("adding rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
                {
                        entry->local_ring = 1;
                }
-       }       
+       }
        else    /* Y. Tahara added */
-       { 
+       {
                /*
                 *      Update existing entries
                 */
-               if (!entry->local_ring) 
+               if (!entry->local_ring)
                    if (entry->rcf != (trh->rcf & htons((unsigned short)~TR_RCF_BROADCAST_MASK)) &&
                         !(trh->rcf & htons(TR_RCF_BROADCAST_MASK)))
                    {
@@ -417,9 +417,9 @@ printk("updating rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
                ntohs(trh->rcf));
 #endif
                            entry->rcf = trh->rcf & htons((unsigned short)~TR_RCF_BROADCAST_MASK);
-                           memcpy(&(entry->rseg[0]),&(trh->rseg[0]),8*sizeof(unsigned short));
-                   }                                         
-               entry->last_used=jiffies;               
+                           memcpy(&(entry->rseg[0]),&(trh->rseg[0]),8*sizeof(unsigned short));
+                   }
+               entry->last_used=jiffies;
        }
        trh->saddr[0]=saddr0; /* put the routing indicator back for tcpdump */
        spin_unlock_irqrestore(&rif_lock, flags);
@@ -429,16 +429,16 @@ printk("updating rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
  *     Scan the cache with a timer and see what we need to throw out.
  */
 
-static void rif_check_expire(unsigned long dummy) 
+static void rif_check_expire(unsigned long dummy)
 {
        int i;
        unsigned long flags, next_interval = jiffies + sysctl_tr_rif_timeout/2;
 
        spin_lock_irqsave(&rif_lock, flags);
-       
+
        for(i =0; i < RIF_TABLE_SIZE; i++) {
                struct rif_cache *entry, **pentry;
-               
+
                pentry = rif_table+i;
                while((entry=*pentry) != NULL) {
                        unsigned long expires
@@ -455,7 +455,7 @@ static void rif_check_expire(unsigned long dummy)
                        }
                }
        }
-       
+
        spin_unlock_irqrestore(&rif_lock, flags);
 
        mod_timer(&rif_timer, next_interval);
@@ -466,7 +466,7 @@ static void rif_check_expire(unsigned long dummy)
  *     Generate the /proc/net information for the token ring RIF
  *     routing.
  */
+
 #ifdef CONFIG_PROC_FS
 
 static struct rif_cache *rif_get_idx(loff_t pos)
@@ -475,7 +475,7 @@ static struct rif_cache *rif_get_idx(loff_t pos)
        struct rif_cache *entry;
        loff_t off = 0;
 
-       for(i = 0; i < RIF_TABLE_SIZE; i++) 
+       for(i = 0; i < RIF_TABLE_SIZE; i++)
                for(entry = rif_table[i]; entry; entry = entry->next) {
                        if (off == pos)
                                return entry;
@@ -504,7 +504,7 @@ static void *rif_seq_next(struct seq_file *seq, void *v, loff_t *pos)
                goto scan;
        }
 
-       if (ent->next) 
+       if (ent->next)
                return ent->next;
 
        i = rif_hash(ent->addr);
@@ -541,13 +541,13 @@ static int rif_seq_show(struct seq_file *seq, void *v)
                           ttl/HZ);
 
                        if (entry->local_ring)
-                               seq_puts(seq, "local\n");
+                               seq_puts(seq, "local\n");
                        else {
 
                                seq_printf(seq, "%04X", ntohs(entry->rcf));
-                               rcf_len = ((ntohs(entry->rcf) & TR_RCF_LEN_MASK)>>8)-2; 
+                               rcf_len = ((ntohs(entry->rcf) & TR_RCF_LEN_MASK)>>8)-2;
                                if (rcf_len)
-                                       rcf_len >>= 1;
+                                       rcf_len >>= 1;
                                for(j = 1; j < rcf_len; j++) {
                                        if(j==1) {
                                                segment=ntohs(entry->rseg[j-1])>>4;
@@ -559,7 +559,7 @@ static int rif_seq_show(struct seq_file *seq, void *v)
                                }
                                seq_putc(seq, '\n');
                        }
-               }
+               }
        return 0;
 }
 
@@ -576,7 +576,7 @@ static int rif_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &rif_seq_ops);
 }
 
-static struct file_operations rif_seq_fops = {
+static const struct file_operations rif_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = rif_seq_open,
        .read    = seq_read,
@@ -591,7 +591,7 @@ static void tr_setup(struct net_device *dev)
        /*
         *      Configure and register
         */
-       
+
        dev->hard_header        = tr_header;
        dev->rebuild_header     = tr_rebuild_header;
 
@@ -600,7 +600,7 @@ static void tr_setup(struct net_device *dev)
        dev->mtu                = 2000;
        dev->addr_len           = TR_ALEN;
        dev->tx_queue_len       = 100;  /* Long queues on tr */
-       
+
        memset(dev->broadcast,0xFF, TR_ALEN);
 
        /* New-style flags. */
index 18fcb9fa518db4c4574d283ba8abdd35df9183fd..c1c205fad4fbc34cde3ba9474a269a42337959af 100644 (file)
@@ -5,7 +5,7 @@
  * Authors:    Ben Greear <greearb@candelatech.com>
  *              Please send support related email to: vlan@scry.wanfear.com
  *              VLAN Home Page: http://www.candelatech.com/~greear/vlan.html
- * 
+ *
  * Fixes:
  *              Fix for packet capture - Nick Eggleston <nick@dccinc.com>;
  *             Add HW acceleration hooks - David S. Miller <davem@redhat.com>;
@@ -72,7 +72,7 @@ static struct packet_type vlan_packet_type = {
 /*
  * Function vlan_proto_init (pro)
  *
- *    Initialize VLAN protocol layer, 
+ *    Initialize VLAN protocol layer,
  *
  */
 static int __init vlan_proto_init(void)
@@ -87,7 +87,7 @@ static int __init vlan_proto_init(void)
        /* proc file system initialization */
        err = vlan_proc_init();
        if (err < 0) {
-               printk(KERN_ERR 
+               printk(KERN_ERR
                       "%s %s: can't create entry in proc filesystem!\n",
                       __FUNCTION__, VLAN_NAME);
                return err;
@@ -108,7 +108,7 @@ static int __init vlan_proto_init(void)
        return 0;
 }
 
-/* Cleanup all vlan devices 
+/* Cleanup all vlan devices
  * Note: devices that have been registered that but not
  * brought up will exist but have no module ref count.
  */
@@ -132,7 +132,7 @@ static void __exit vlan_cleanup_devices(void)
 /*
  *     Module 'remove' entry point.
  *     o delete /proc/net/router directory and static entries.
- */ 
+ */
 static void __exit vlan_cleanup_module(void)
 {
        int i;
@@ -184,7 +184,7 @@ struct net_device *__find_vlan_dev(struct net_device *real_dev,
        struct vlan_group *grp = __vlan_find_group(real_dev->ifindex);
 
        if (grp)
-                return grp->vlan_devices[VID];
+               return grp->vlan_devices[VID];
 
        return NULL;
 }
@@ -269,7 +269,7 @@ static int unregister_vlan_dev(struct net_device *real_dev,
                }
        }
 
-        return ret;
+       return ret;
 }
 
 static int unregister_vlan_device(const char *vlan_IF_name)
@@ -295,7 +295,7 @@ static int unregister_vlan_device(const char *vlan_IF_name)
                        if (ret == 1)
                                ret = 0;
                } else {
-                       printk(VLAN_ERR 
+                       printk(VLAN_ERR
                               "%s: ERROR:      Tried to remove a non-vlan device "
                               "with VLAN code, name: %s  priv_flags: %hX\n",
                               __FUNCTION__, dev->name, dev->priv_flags);
@@ -315,7 +315,7 @@ static int unregister_vlan_device(const char *vlan_IF_name)
 static void vlan_setup(struct net_device *new_dev)
 {
        SET_MODULE_OWNER(new_dev);
-           
+
        /* new_dev->ifindex = 0;  it will be set when added to
         * the global list.
         * iflink is set as well.
@@ -324,7 +324,7 @@ static void vlan_setup(struct net_device *new_dev)
 
        /* Make this thing known as a VLAN device */
        new_dev->priv_flags |= IFF_802_1Q_VLAN;
-                               
+
        /* Set us up to have no queue, as the underlying Hardware device
         * can do all the queueing we could want.
         */
@@ -461,7 +461,7 @@ static struct net_device *register_vlan_device(const char *eth_IF_name,
        default:
                snprintf(name, IFNAMSIZ, "vlan%.4i", VLAN_ID);
        };
-                   
+
        new_dev = alloc_netdev(sizeof(struct vlan_dev_info), name,
                               vlan_setup);
 
@@ -477,7 +477,7 @@ static struct net_device *register_vlan_device(const char *eth_IF_name,
 
        new_dev->state = (real_dev->state & ((1<<__LINK_STATE_NOCARRIER) |
                                             (1<<__LINK_STATE_DORMANT))) |
-                        (1<<__LINK_STATE_PRESENT); 
+                        (1<<__LINK_STATE_PRESENT);
 
        /* need 4 bytes for extra VLAN header info,
         * hope the underlying device can handle it.
@@ -496,7 +496,7 @@ static struct net_device *register_vlan_device(const char *eth_IF_name,
        VLAN_MEM_DBG("new_dev->priv malloc, addr: %p  size: %i\n",
                     new_dev->priv,
                     sizeof(struct vlan_dev_info));
-           
+
        memcpy(new_dev->broadcast, real_dev->broadcast, real_dev->addr_len);
        memcpy(new_dev->dev_addr, real_dev->dev_addr, real_dev->addr_len);
        new_dev->addr_len = real_dev->addr_len;
@@ -521,7 +521,7 @@ static struct net_device *register_vlan_device(const char *eth_IF_name,
        printk(VLAN_DBG "About to go find the group for idx: %i\n",
               real_dev->ifindex);
 #endif
-           
+
        if (register_netdevice(new_dev))
                goto out_free_newdev;
 
@@ -543,22 +543,22 @@ static struct net_device *register_vlan_device(const char *eth_IF_name,
                grp = kzalloc(sizeof(struct vlan_group), GFP_KERNEL);
                if (!grp)
                        goto out_free_unregister;
-                                       
+
                /* printk(KERN_ALERT "VLAN REGISTER:  Allocated new group.\n"); */
                grp->real_dev_ifindex = real_dev->ifindex;
 
-               hlist_add_head_rcu(&grp->hlist, 
+               hlist_add_head_rcu(&grp->hlist,
                                   &vlan_group_hash[vlan_grp_hashfn(real_dev->ifindex)]);
 
                if (real_dev->features & NETIF_F_HW_VLAN_RX)
                        real_dev->vlan_rx_register(real_dev, grp);
        }
-           
+
        grp->vlan_devices[VLAN_ID] = new_dev;
 
        if (vlan_proc_add_dev(new_dev)<0)/* create it's proc entry */
-               printk(KERN_WARNING "VLAN: failed to add proc entry for %s\n",
-                                                        new_dev->name);
+               printk(KERN_WARNING "VLAN: failed to add proc entry for %s\n",
+                                                        new_dev->name);
 
        if (real_dev->features & NETIF_F_HW_VLAN_FILTER)
                real_dev->vlan_rx_add_vid(real_dev, VLAN_ID);
@@ -635,7 +635,7 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
                        vlandev = grp->vlan_devices[i];
                        if (!vlandev)
                                continue;
-                               
+
                        flgs = vlandev->flags;
                        if (flgs & IFF_UP)
                                continue;
@@ -643,7 +643,7 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
                        dev_change_flags(vlandev, flgs | IFF_UP);
                }
                break;
-               
+
        case NETDEV_UNREGISTER:
                /* Delete all VLANs for this dev. */
                for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
@@ -755,8 +755,8 @@ static int vlan_ioctl_handler(void __user *arg)
                /* TODO:  Implement
                   err = vlan_dev_get_ingress_priority(args);
                   if (copy_to_user((void*)arg, &args,
-                       sizeof(struct vlan_ioctl_args))) {
-                       err = -EFAULT;
+                       sizeof(struct vlan_ioctl_args))) {
+                       err = -EFAULT;
                   }
                */
                err = -EINVAL;
@@ -765,8 +765,8 @@ static int vlan_ioctl_handler(void __user *arg)
                /* TODO:  Implement
                   err = vlan_dev_get_egress_priority(args.device1, &(args.args);
                   if (copy_to_user((void*)arg, &args,
-                       sizeof(struct vlan_ioctl_args))) {
-                       err = -EFAULT;
+                       sizeof(struct vlan_ioctl_args))) {
+                       err = -EFAULT;
                   }
                */
                err = -EINVAL;
@@ -788,7 +788,7 @@ static int vlan_ioctl_handler(void __user *arg)
                args.u.VID = vid;
                if (copy_to_user(arg, &args,
                                 sizeof(struct vlan_ioctl_args))) {
-                      err = -EFAULT;
+                     err = -EFAULT;
                }
                break;
 
index 9ae3a14dd016d3ed9da0c2fb603c6a8da900e182..1976cdba8f726dc7d43edbaad4707878c18bb42f 100644 (file)
@@ -9,8 +9,8 @@
 #define VLAN_ERR KERN_ERR
 #define VLAN_INF KERN_INFO
 #define VLAN_DBG KERN_ALERT /* change these... to debug, having a hard time
-                             * changing the log level at run-time..for some reason.
-                             */
+                            * changing the log level at run-time..for some reason.
+                            */
 
 /*
 
@@ -24,7 +24,7 @@ I'll bet they might prove useful again... --Ben
 */
 
 /* This way they don't do anything! */
-#define VLAN_MEM_DBG(x, y, z) 
+#define VLAN_MEM_DBG(x, y, z)
 #define VLAN_FMEM_DBG(x, y)
 
 
@@ -51,10 +51,10 @@ struct net_device *__find_vlan_dev(struct net_device* real_dev,
 /* found in vlan_dev.c */
 int vlan_dev_rebuild_header(struct sk_buff *skb);
 int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev,
-                  struct packet_type *ptype, struct net_device *orig_dev);
+                 struct packet_type *ptype, struct net_device *orig_dev);
 int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
-                         unsigned short type, void *daddr, void *saddr,
-                         unsigned len);
+                        unsigned short type, void *daddr, void *saddr,
+                        unsigned len);
 int vlan_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev);
 int vlan_dev_hwaccel_hard_start_xmit(struct sk_buff *skb, struct net_device *dev);
 int vlan_dev_change_mtu(struct net_device *dev, int new_mtu);
index 60a508eb1945bd78c05b3a3424a93cb30af7b20f..2fc8fe2cb366e4887e25c998ef2881834d25dbbe 100644 (file)
@@ -5,14 +5,14 @@
  * Authors:    Ben Greear <greearb@candelatech.com>
  *              Please send support related email to: vlan@scry.wanfear.com
  *              VLAN Home Page: http://www.candelatech.com/~greear/vlan.html
- * 
+ *
  * Fixes:       Mar 22 2001: Martin Bokaemper <mbokaemper@unispherenetworks.com>
  *                - reset skb->pkt_type on incoming packets when MAC was changed
  *                - see that changed MAC is saddr for outgoing packets
  *              Oct 20, 2001:  Ard van Breeman:
  *                - Fix MC-list, finally.
  *                - Flush MC-list on VLAN destroy.
- *                
+ *
  *
  *             This program is free software; you can redistribute it and/or
  *             modify it under the terms of the GNU General Public License
@@ -58,12 +58,12 @@ int vlan_dev_rebuild_header(struct sk_buff *skb)
 
                /* TODO:  Confirm this will work with VLAN headers... */
                return arp_find(veth->h_dest, skb);
-#endif 
+#endif
        default:
                printk(VLAN_DBG
-                      "%s: unable to resolve type %X addresses.\n", 
+                      "%s: unable to resolve type %X addresses.\n",
                       dev->name, ntohs(veth->h_vlan_encapsulated_proto));
-        
+
                memcpy(veth->h_source, dev->dev_addr, ETH_ALEN);
                break;
        };
@@ -91,7 +91,7 @@ static inline struct sk_buff *vlan_check_reorder_header(struct sk_buff *skb)
 }
 
 /*
- *     Determine the packet's protocol ID. The rule here is that we 
+ *     Determine the packet's protocol ID. The rule here is that we
  *     assume 802.3 if the type field is short enough to be a length.
  *     This is normal practice and works for any 'now in use' protocol.
  *
@@ -113,7 +113,7 @@ static inline struct sk_buff *vlan_check_reorder_header(struct sk_buff *skb)
  *
  */
 int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev,
-                  struct packet_type* ptype, struct net_device *orig_dev)
+                 struct packet_type* ptype, struct net_device *orig_dev)
 {
        unsigned char *rawp = NULL;
        struct vlan_hdr *vhdr = (struct vlan_hdr *)(skb->data);
@@ -175,8 +175,8 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev,
 
 #ifdef VLAN_DEBUG
                printk(VLAN_DBG "%s: dropping skb: %p because came in on wrong device, dev: %s  real_dev: %s, skb_dev: %s\n",
-                       __FUNCTION__, skb, dev->name, 
-                       VLAN_DEV_INFO(skb->dev)->real_dev->name, 
+                       __FUNCTION__, skb, dev->name,
+                       VLAN_DEV_INFO(skb->dev)->real_dev->name,
                        skb->dev->name);
 #endif
                kfree_skb(skb);
@@ -191,7 +191,7 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev,
 
 #ifdef VLAN_DEBUG
        printk(VLAN_DBG "%s: priority: %lu  for TCI: %hu (hbo)\n",
-               __FUNCTION__, (unsigned long)(skb->priority), 
+               __FUNCTION__, (unsigned long)(skb->priority),
                ntohs(vhdr->h_vlan_TCI));
 #endif
 
@@ -207,7 +207,7 @@ int vlan_skb_recv(struct sk_buff *skb, struct net_device *dev,
                stats->multicast++;
                break;
 
-       case PACKET_OTHERHOST: 
+       case PACKET_OTHERHOST:
                /* Our lower layer thinks this is not local, let's make sure.
                 * This allows the VLAN to have a different MAC than the underlying
                 * device, and still route correctly.
@@ -319,7 +319,7 @@ static inline unsigned short vlan_dev_get_egress_qos_mask(struct net_device* dev
 }
 
 /*
- *     Create the VLAN header for an arbitrary protocol layer 
+ *     Create the VLAN header for an arbitrary protocol layer
  *
  *     saddr=NULL      means use device source address
  *     daddr=NULL      means leave destination address (eg unresolved arp)
@@ -328,8 +328,8 @@ static inline unsigned short vlan_dev_get_egress_qos_mask(struct net_device* dev
  *  physical devices.
  */
 int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
-                         unsigned short type, void *daddr, void *saddr,
-                         unsigned len)
+                        unsigned short type, void *daddr, void *saddr,
+                        unsigned len)
 {
        struct vlan_hdr *vhdr;
        unsigned short veth_TCI = 0;
@@ -346,7 +346,7 @@ int vlan_dev_hard_header(struct sk_buff *skb, struct net_device *dev,
         * fixes some programs that get confused when they see a VLAN device
         * sending a frame that is VLAN encoded (the consensus is that the VLAN
         * device should look completely like an Ethernet device when the
-        * REORDER_HEADER flag is set)  The drawback to this is some extra 
+        * REORDER_HEADER flag is set)  The drawback to this is some extra
         * header shuffling in the hard_start_xmit.  Users can turn off this
         * REORDER behaviour with the vconfig tool.
         */
@@ -553,7 +553,7 @@ int vlan_dev_set_egress_priority(char *dev_name, __u32 skb_prio, short vlan_prio
        struct net_device *dev = dev_get_by_name(dev_name);
        struct vlan_priority_tci_mapping *mp = NULL;
        struct vlan_priority_tci_mapping *np;
-   
+
        if (dev) {
                if (dev->priv_flags & IFF_802_1Q_VLAN) {
                        /* See if a priority mapping exists.. */
@@ -610,13 +610,13 @@ int vlan_dev_set_vlan_flag(char *dev_name, __u32 flag, short flag_val)
                                return -EINVAL;
                        }
                } else {
-                       printk(KERN_ERR 
+                       printk(KERN_ERR
                               "%s: %s is not a vlan device, priv_flags: %hX.\n",
                               __FUNCTION__, dev->name, dev->priv_flags);
                        dev_put(dev);
                }
        } else {
-               printk(KERN_ERR  "%s: Could not find device: %s\n", 
+               printk(KERN_ERR  "%s: Could not find device: %s\n",
                        __FUNCTION__, dev_name);
        }
 
@@ -700,7 +700,7 @@ int vlan_dev_set_mac_address(struct net_device *dev, void *addr_struct_p)
 }
 
 static inline int vlan_dmi_equals(struct dev_mc_list *dmi1,
-                                  struct dev_mc_list *dmi2)
+                                 struct dev_mc_list *dmi2)
 {
        return ((dmi1->dmi_addrlen == dmi2->dmi_addrlen) &&
                (memcmp(dmi1->dmi_addr, dmi2->dmi_addr, dmi1->dmi_addrlen) == 0));
@@ -810,7 +810,7 @@ int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
        case SIOCGMIIPHY:
        case SIOCGMIIREG:
        case SIOCSMIIREG:
-               if (real_dev->do_ioctl && netif_device_present(real_dev)) 
+               if (real_dev->do_ioctl && netif_device_present(real_dev))
                        err = real_dev->do_ioctl(real_dev, &ifrr, cmd);
                break;
 
@@ -818,7 +818,7 @@ int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
                err = dev_ethtool(&ifrr);
        }
 
-       if (!err) 
+       if (!err)
                ifr->ifr_ifru = ifrr.ifr_ifru;
 
        return err;
index a8fc0de1f969a89e15382c54fd675e53f3eccd72..5e24f72602a1b1a927938f8fe9b2e47cc6d32a98 100644 (file)
@@ -51,7 +51,7 @@ static int vlandev_seq_show(struct seq_file *seq, void *v);
 
 
 /*
- *     Names of the proc directory entries 
+ *     Names of the proc directory entries
  */
 
 static const char name_root[]   = "vlan";
@@ -66,7 +66,7 @@ static const char name_conf[]  = "config";
  */
 
 /*
- *     Generic /proc/net/vlan/<file> file and inode operations 
+ *     Generic /proc/net/vlan/<file> file and inode operations
  */
 
 static struct seq_operations vlan_seq_ops = {
@@ -81,7 +81,7 @@ static int vlan_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &vlan_seq_ops);
 }
 
-static struct file_operations vlan_fops = {
+static const struct file_operations vlan_fops = {
        .owner   = THIS_MODULE,
        .open    = vlan_seq_open,
        .read    = seq_read,
@@ -98,7 +98,7 @@ static int vlandev_seq_open(struct inode *inode, struct file *file)
        return single_open(file, vlandev_seq_show, PDE(inode)->data);
 }
 
-static struct file_operations vlandev_fops = {
+static const struct file_operations vlandev_fops = {
        .owner = THIS_MODULE,
        .open    = vlandev_seq_open,
        .read    = seq_read,
@@ -111,13 +111,13 @@ static struct file_operations vlandev_fops = {
  */
 
 /*
- *     /proc/net/vlan 
+ *     /proc/net/vlan
  */
 
 static struct proc_dir_entry *proc_vlan_dir;
 
 /*
- *     /proc/net/vlan/config 
+ *     /proc/net/vlan/config
  */
 
 static struct proc_dir_entry *proc_vlan_conf;
@@ -238,15 +238,15 @@ int vlan_proc_rem_dev(struct net_device *vlandev)
  */
 
 /* starting at dev, find a VLAN device */
-static struct net_device *vlan_skip(struct net_device *dev) 
+static struct net_device *vlan_skip(struct net_device *dev)
 {
-       while (dev && !(dev->priv_flags & IFF_802_1Q_VLAN)) 
+       while (dev && !(dev->priv_flags & IFF_802_1Q_VLAN))
                dev = dev->next;
 
        return dev;
 }
 
-/* start read of /proc/net/vlan/config */ 
+/* start read of /proc/net/vlan/config */
 static void *vlan_seq_start(struct seq_file *seq, loff_t *pos)
 {
        struct net_device *dev;
@@ -256,19 +256,19 @@ static void *vlan_seq_start(struct seq_file *seq, loff_t *pos)
 
        if (*pos == 0)
                return SEQ_START_TOKEN;
-       
-       for (dev = vlan_skip(dev_base); dev && i < *pos; 
+
+       for (dev = vlan_skip(dev_base); dev && i < *pos;
             dev = vlan_skip(dev->next), ++i);
-               
+
        return  (i == *pos) ? dev : NULL;
-} 
+}
 
 static void *vlan_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        ++*pos;
 
-       return vlan_skip((v == SEQ_START_TOKEN)  
-                           ? dev_base 
+       return vlan_skip((v == SEQ_START_TOKEN)
+                           ? dev_base
                            : ((struct net_device *)v)->next);
 }
 
@@ -287,13 +287,13 @@ static int vlan_seq_show(struct seq_file *seq, void *v)
                if (vlan_name_type < ARRAY_SIZE(vlan_name_type_str))
                    nmtype =  vlan_name_type_str[vlan_name_type];
 
-               seq_printf(seq, "Name-Type: %s\n", 
+               seq_printf(seq, "Name-Type: %s\n",
                           nmtype ? nmtype :  "UNKNOWN" );
        } else {
                const struct net_device *vlandev = v;
                const struct vlan_dev_info *dev_info = VLAN_DEV_INFO(vlandev);
 
-               seq_printf(seq, "%-15s| %d  | %s\n",  vlandev->name,  
+               seq_printf(seq, "%-15s| %d  | %s\n",  vlandev->name,
                           dev_info->vlan_id,    dev_info->real_dev->name);
        }
        return 0;
@@ -323,13 +323,13 @@ static int vlandev_seq_show(struct seq_file *seq, void *offset)
        seq_puts(seq, "\n");
        seq_printf(seq, fmt, "total frames transmitted", stats->tx_packets);
        seq_printf(seq, fmt, "total bytes transmitted", stats->tx_bytes);
-       seq_printf(seq, fmt, "total headroom inc", 
+       seq_printf(seq, fmt, "total headroom inc",
                   dev_info->cnt_inc_headroom_on_tx);
-       seq_printf(seq, fmt, "total encap on xmit", 
+       seq_printf(seq, fmt, "total encap on xmit",
                   dev_info->cnt_encap_on_xmit);
        seq_printf(seq, "Device: %s", dev_info->real_dev->name);
        /* now show all PRIORITY mappings relating to this VLAN */
-       seq_printf(seq, 
+       seq_printf(seq,
                       "\nINGRESS priority mappings: 0:%lu  1:%lu  2:%lu  3:%lu  4:%lu  5:%lu  6:%lu 7:%lu\n",
                       dev_info->ingress_priority_map[0],
                       dev_info->ingress_priority_map[1],
index f3777ec5bcb988bc9d33cb332aa96dc0dbeebd7d..d89d62f3702fd2551f97e28dbcd7f897702bf333 100644 (file)
@@ -895,7 +895,7 @@ struct aarp_iter_state {
 
 /*
  * Get the aarp entry that is in the chain described
- * by the iterator. 
+ * by the iterator.
  * If pos is set then skip till that index.
  * pos = 1 is the first entry
  */
@@ -905,7 +905,7 @@ static struct aarp_entry *iter_next(struct aarp_iter_state *iter, loff_t *pos)
        struct aarp_entry **table = iter->table;
        loff_t off = 0;
        struct aarp_entry *entry;
-       
+
  rescan:
        while(ct < AARP_HASH_SIZE) {
                for (entry = table[ct]; entry; entry = entry->next) {
@@ -950,9 +950,9 @@ static void *aarp_seq_next(struct seq_file *seq, void *v, loff_t *pos)
        ++*pos;
 
        /* first line after header */
-       if (v == SEQ_START_TOKEN) 
+       if (v == SEQ_START_TOKEN)
                entry = iter_next(iter, NULL);
-               
+
        /* next entry in current bucket */
        else if (entry->next)
                entry = entry->next;
@@ -986,7 +986,7 @@ static int aarp_seq_show(struct seq_file *seq, void *v)
        unsigned long now = jiffies;
 
        if (v == SEQ_START_TOKEN)
-               seq_puts(seq, 
+               seq_puts(seq,
                         "Address  Interface   Hardware Address"
                         "   Expires LastSend  Retry Status\n");
        else {
@@ -1014,7 +1014,7 @@ static int aarp_seq_show(struct seq_file *seq, void *v)
                           : (iter->table == unresolved) ? "unresolved"
                           : (iter->table == proxies) ? "proxies"
                           : "unknown");
-       }                                
+       }
        return 0;
 }
 
@@ -1030,7 +1030,7 @@ static int aarp_seq_open(struct inode *inode, struct file *file)
        struct seq_file *seq;
        int rc = -ENOMEM;
        struct aarp_iter_state *s = kmalloc(sizeof(*s), GFP_KERNEL);
-       
+
        if (!s)
                goto out;
 
@@ -1048,7 +1048,7 @@ out_kfree:
        goto out;
 }
 
-struct file_operations atalk_seq_arp_fops = {
+const struct file_operations atalk_seq_arp_fops = {
        .owner          = THIS_MODULE,
        .open           = aarp_seq_open,
        .read           = seq_read,
index 7ae4916cd26d9a2f78ef345867a3dfc4861c6ba5..57ff8122b5c59b8da1e0d0a44abce1f38ef710b9 100644 (file)
@@ -240,7 +240,7 @@ static int atalk_seq_socket_open(struct inode *inode, struct file *file)
        return seq_open(file, &atalk_seq_socket_ops);
 }
 
-static struct file_operations atalk_seq_interface_fops = {
+static const struct file_operations atalk_seq_interface_fops = {
        .owner          = THIS_MODULE,
        .open           = atalk_seq_interface_open,
        .read           = seq_read,
@@ -248,7 +248,7 @@ static struct file_operations atalk_seq_interface_fops = {
        .release        = seq_release,
 };
 
-static struct file_operations atalk_seq_route_fops = {
+static const struct file_operations atalk_seq_route_fops = {
        .owner          = THIS_MODULE,
        .open           = atalk_seq_route_open,
        .read           = seq_read,
@@ -256,7 +256,7 @@ static struct file_operations atalk_seq_route_fops = {
        .release        = seq_release,
 };
 
-static struct file_operations atalk_seq_socket_fops = {
+static const struct file_operations atalk_seq_socket_fops = {
        .owner          = THIS_MODULE,
        .open           = atalk_seq_socket_open,
        .read           = seq_read,
@@ -292,7 +292,7 @@ int __init atalk_proc_init(void)
        p->proc_fops = &atalk_seq_socket_fops;
 
        p = create_proc_entry("arp", S_IRUGO, atalk_proc_dir);
-       if (!p) 
+       if (!p)
                goto out_arp;
        p->proc_fops = &atalk_seq_arp_fops;
 
index 3a7052207708eb8f834480f7f3d56a5684cf5e28..113c175f171586242370c5e006f36c5c07bd4724 100644 (file)
  *             Bradford Johnson        :       IP-over-DDP (experimental)
  *             Jay Schulist            :       Moved IP-over-DDP to its own
  *                                             driver file. (ipddp.c & ipddp.h)
- *             Jay Schulist            :       Made work as module with 
+ *             Jay Schulist            :       Made work as module with
  *                                             AppleTalk drivers, cleaned it.
  *             Rob Newberry            :       Added proxy AARP and AARP
  *                                             procfs, moved probing to AARP
  *                                             module.
- *              Adrian Sun/ 
- *              Michael Zuelsdorff      :       fix for net.0 packets. don't 
+ *              Adrian Sun/
+ *              Michael Zuelsdorff      :       fix for net.0 packets. don't
  *                                              allow illegal ether/tokentalk
- *                                              port assignment. we lose a 
- *                                              valid localtalk port as a 
+ *                                              port assignment. we lose a
+ *                                              valid localtalk port as a
  *                                              result.
  *             Arnaldo C. de Melo      :       Cleanup, in preparation for
  *                                             shared skb support 8)
@@ -48,7 +48,7 @@
  *             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/capability.h>
@@ -100,17 +100,17 @@ static struct sock *atalk_search_socket(struct sockaddr_at *to,
                if (to->sat_port != at->src_port)
                        continue;
 
-               if (to->sat_addr.s_net == ATADDR_ANYNET &&
+               if (to->sat_addr.s_net == ATADDR_ANYNET &&
                    to->sat_addr.s_node == ATADDR_BCAST)
                        goto found;
 
-               if (to->sat_addr.s_net == at->src_net &&
+               if (to->sat_addr.s_net == at->src_net &&
                    (to->sat_addr.s_node == at->src_node ||
                     to->sat_addr.s_node == ATADDR_BCAST ||
                     to->sat_addr.s_node == ATADDR_ANYNODE))
                        goto found;
 
-               /* XXXX.0 -- we got a request for this router. make sure
+               /* XXXX.0 -- we got a request for this router. make sure
                 * that the node is appropriately set. */
                if (to->sat_addr.s_node == ATADDR_ANYNODE &&
                    to->sat_addr.s_net != ATADDR_ANYNET &&
@@ -314,7 +314,7 @@ static int atif_proxy_probe_device(struct atalk_iface *atif,
 
        if (probe_node == ATADDR_ANYNODE)
                probe_node = jiffies & 0xFF;
-               
+
        /* Scan the networks */
        for (netct = 0; netct <= netrange; netct++) {
                /* Sweep the available nodes from a given start */
@@ -417,7 +417,7 @@ static struct atalk_iface *atalk_find_interface(__be16 net, int node)
                if (node == ATADDR_ANYNODE && net != ATADDR_ANYNET &&
                    ntohs(iface->nets.nr_firstnet) <= ntohs(net) &&
                    ntohs(net) <= ntohs(iface->nets.nr_lastnet))
-                       break;
+                       break;
        }
        read_unlock_bh(&atalk_interfaces_lock);
        return iface;
@@ -432,13 +432,13 @@ static struct atalk_iface *atalk_find_interface(__be16 net, int node)
 static struct atalk_route *atrtr_find(struct atalk_addr *target)
 {
        /*
-        * we must search through all routes unless we find a 
+        * we must search through all routes unless we find a
         * host route, because some host routes might overlap
         * network routes
         */
        struct atalk_route *net_route = NULL;
        struct atalk_route *r;
-       
+
        read_lock_bh(&atalk_routes_lock);
        for (r = atalk_routes; r; r = r->next) {
                if (!(r->flags & RTF_UP))
@@ -460,8 +460,8 @@ static struct atalk_route *atrtr_find(struct atalk_addr *target)
                                net_route = r;
                }
        }
-       
-       /* 
+
+       /*
         * if we found a network route but not a direct host
         * route, then return it
         */
@@ -540,15 +540,15 @@ static int atrtr_create(struct rtentry *r, struct net_device *devhint)
                for (iface = atalk_interfaces; iface; iface = iface->next) {
                        if (!riface &&
                            ntohs(ga->sat_addr.s_net) >=
-                                       ntohs(iface->nets.nr_firstnet) &&
+                                       ntohs(iface->nets.nr_firstnet) &&
                            ntohs(ga->sat_addr.s_net) <=
-                                       ntohs(iface->nets.nr_lastnet))
+                                       ntohs(iface->nets.nr_lastnet))
                                riface = iface;
 
                        if (ga->sat_addr.s_net == iface->address.s_net &&
                            ga->sat_addr.s_node == iface->address.s_node)
                                riface = iface;
-               }               
+               }
                read_unlock_bh(&atalk_interfaces_lock);
 
                retval = -ENETUNREACH;
@@ -649,7 +649,7 @@ static int ddp_device_event(struct notifier_block *this, unsigned long event,
 {
        if (event == NETDEV_DOWN)
                /* Discard any use of this */
-               atalk_dev_down(ptr);
+               atalk_dev_down(ptr);
 
        return NOTIFY_DONE;
 }
@@ -701,13 +701,13 @@ static int atif_ioctl(int cmd, void __user *arg)
                         */
                        if ((dev->flags & IFF_POINTOPOINT) &&
                            atalk_find_interface(sa->sat_addr.s_net,
-                                                sa->sat_addr.s_node)) {
+                                                sa->sat_addr.s_node)) {
                                printk(KERN_DEBUG "AppleTalk: point-to-point "
                                                  "interface added with "
                                                  "existing address\n");
                                add_route = 0;
                        }
-                       
+
                        /*
                         * Phase 1 is fine on LocalTalk but we don't do
                         * EtherTalk phase 1. Anyone wanting to add it go ahead.
@@ -797,78 +797,78 @@ static int atif_ioctl(int cmd, void __user *arg)
                        sa->sat_addr.s_node = ATADDR_BCAST;
                        break;
 
-               case SIOCATALKDIFADDR:
-               case SIOCDIFADDR:
+               case SIOCATALKDIFADDR:
+               case SIOCDIFADDR:
                        if (!capable(CAP_NET_ADMIN))
                                return -EPERM;
                        if (sa->sat_family != AF_APPLETALK)
                                return -EINVAL;
                        atalk_dev_down(dev);
-                       break;                  
+                       break;
 
                case SIOCSARP:
                        if (!capable(CAP_NET_ADMIN))
-                                return -EPERM;
-                        if (sa->sat_family != AF_APPLETALK)
-                                return -EINVAL;
-                        if (!atif)
-                                return -EADDRNOTAVAIL;
-
-                        /*
-                         * for now, we only support proxy AARP on ELAP;
-                         * we should be able to do it for LocalTalk, too.
-                         */
-                        if (dev->type != ARPHRD_ETHER)
-                                return -EPROTONOSUPPORT;
-
-                        /*
-                         * atif points to the current interface on this network;
-                         * we aren't concerned about its current status (at
+                               return -EPERM;
+                       if (sa->sat_family != AF_APPLETALK)
+                               return -EINVAL;
+                       if (!atif)
+                               return -EADDRNOTAVAIL;
+
+                       /*
+                        * for now, we only support proxy AARP on ELAP;
+                        * we should be able to do it for LocalTalk, too.
+                        */
+                       if (dev->type != ARPHRD_ETHER)
+                               return -EPROTONOSUPPORT;
+
+                       /*
+                        * atif points to the current interface on this network;
+                        * we aren't concerned about its current status (at
                         * least for now), but it has all the settings about
                         * the network we're going to probe. Consequently, it
                         * must exist.
-                         */
-                        if (!atif)
-                                return -EADDRNOTAVAIL;
-
-                        nr = (struct atalk_netrange *)&(atif->nets);
-                        /*
-                         * Phase 1 is fine on Localtalk but we don't do
-                         * Ethertalk phase 1. Anyone wanting to add it go ahead.
-                         */
-                        if (dev->type == ARPHRD_ETHER && nr->nr_phase != 2)
-                                return -EPROTONOSUPPORT;
-
-                        if (sa->sat_addr.s_node == ATADDR_BCAST ||
+                        */
+                       if (!atif)
+                               return -EADDRNOTAVAIL;
+
+                       nr = (struct atalk_netrange *)&(atif->nets);
+                       /*
+                        * Phase 1 is fine on Localtalk but we don't do
+                        * Ethertalk phase 1. Anyone wanting to add it go ahead.
+                        */
+                       if (dev->type == ARPHRD_ETHER && nr->nr_phase != 2)
+                               return -EPROTONOSUPPORT;
+
+                       if (sa->sat_addr.s_node == ATADDR_BCAST ||
                            sa->sat_addr.s_node == 254)
-                                return -EINVAL;
-
-                        /*
-                         * Check if the chosen address is used. If so we
-                         * error and ATCP will try another.
-                         */
-                       if (atif_proxy_probe_device(atif, &(sa->sat_addr)) < 0)
-                               return -EADDRINUSE;
-                       
+                               return -EINVAL;
+
                        /*
-                         * We now have an address on the local network, and
+                        * Check if the chosen address is used. If so we
+                        * error and ATCP will try another.
+                        */
+                       if (atif_proxy_probe_device(atif, &(sa->sat_addr)) < 0)
+                               return -EADDRINUSE;
+
+                       /*
+                        * We now have an address on the local network, and
                         * the AARP code will defend it for us until we take it
                         * down. We don't set up any routes right now, because
                         * ATCP will install them manually via SIOCADDRT.
-                         */
-                        break;
-
-                case SIOCDARP:
-                        if (!capable(CAP_NET_ADMIN))
-                                return -EPERM;
-                        if (sa->sat_family != AF_APPLETALK)
-                                return -EINVAL;
-                        if (!atif)
-                                return -EADDRNOTAVAIL;
-
-                        /* give to aarp module to remove proxy entry */
-                        aarp_proxy_remove(atif->dev, &(sa->sat_addr));
-                        return 0;
+                        */
+                       break;
+
+               case SIOCDARP:
+                       if (!capable(CAP_NET_ADMIN))
+                               return -EPERM;
+                       if (sa->sat_family != AF_APPLETALK)
+                               return -EINVAL;
+                       if (!atif)
+                               return -EADDRNOTAVAIL;
+
+                       /* give to aarp module to remove proxy entry */
+                       aarp_proxy_remove(atif->dev, &(sa->sat_addr));
+                       return 0;
        }
 
        return copy_to_user(arg, &atreq, sizeof(atreq)) ? -EFAULT : 0;
@@ -899,7 +899,7 @@ static int atrtr_ioctl(unsigned int cmd, void __user *arg)
                                dev = __dev_get_by_name(name);
                                if (!dev)
                                        return -ENODEV;
-                       }                       
+                       }
                        return atrtr_create(&rt, dev);
                }
        }
@@ -917,7 +917,7 @@ static int atrtr_ioctl(unsigned int cmd, void __user *arg)
  * Checksum: This is 'optional'. It's quite likely also a good
  * candidate for assembler hackery 8)
  */
-static unsigned long atalk_sum_partial(const unsigned char *data, 
+static unsigned long atalk_sum_partial(const unsigned char *data,
                                       int len, unsigned long sum)
 {
        /* This ought to be unwrapped neatly. I'll trust gcc for now */
@@ -945,7 +945,7 @@ static unsigned long atalk_sum_skb(const struct sk_buff *skb, int offset,
                if (copy > len)
                        copy = len;
                sum = atalk_sum_partial(skb->data + offset, copy, sum);
-               if ( (len -= copy) == 0) 
+               if ( (len -= copy) == 0)
                        return sum;
 
                offset += copy;
@@ -1031,7 +1031,7 @@ static int atalk_create(struct socket *sock, int protocol)
 
        /*
         * We permit SOCK_DGRAM and RAW is an extension. It is trivial to do
-        * and gives you the full ELAP frame. Should be handy for CAP 8) 
+        * and gives you the full ELAP frame. Should be handy for CAP 8)
         */
        if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM)
                goto out;
@@ -1196,14 +1196,14 @@ static int atalk_connect(struct socket *sock, struct sockaddr *uaddr,
 
        if (addr->sat_addr.s_node == ATADDR_BCAST &&
            !sock_flag(sk, SOCK_BROADCAST)) {
-#if 1  
+#if 1
                printk(KERN_WARNING "%s is broken and did not set "
                                    "SO_BROADCAST. It will break when 2.2 is "
                                    "released.\n",
                        current->comm);
 #else
                return -EACCES;
-#endif                 
+#endif
        }
 
        if (sock_flag(sk, SOCK_ZAPPED))
@@ -1260,27 +1260,27 @@ static int atalk_getname(struct socket *sock, struct sockaddr *uaddr,
 #if defined(CONFIG_IPDDP) || defined(CONFIG_IPDDP_MODULE)
 static __inline__ int is_ip_over_ddp(struct sk_buff *skb)
 {
-        return skb->data[12] == 22;
+       return skb->data[12] == 22;
 }
 
 static int handle_ip_over_ddp(struct sk_buff *skb)
 {
-        struct net_device *dev = __dev_get_by_name("ipddp0");
+       struct net_device *dev = __dev_get_by_name("ipddp0");
        struct net_device_stats *stats;
 
        /* This needs to be able to handle ipddp"N" devices */
-        if (!dev)
-                return -ENODEV;
+       if (!dev)
+               return -ENODEV;
 
-        skb->protocol = htons(ETH_P_IP);
-        skb_pull(skb, 13);
-        skb->dev   = dev;
-        skb->h.raw = skb->data;
+       skb->protocol = htons(ETH_P_IP);
+       skb_pull(skb, 13);
+       skb->dev   = dev;
+       skb->h.raw = skb->data;
 
        stats = dev->priv;
-        stats->rx_packets++;
-        stats->rx_bytes += skb->len + 13;
-        netif_rx(skb);  /* Send the SKB up to a higher place. */
+       stats->rx_packets++;
+       stats->rx_bytes += skb->len + 13;
+       netif_rx(skb);  /* Send the SKB up to a higher place. */
        return 0;
 }
 #else
@@ -1298,7 +1298,7 @@ static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
 
        /*
         * Don't route multicast, etc., packets, or packets sent to "this
-        * network" 
+        * network"
         */
        if (skb->pkt_type != PACKET_HOST || !ddp->deh_dnet) {
                /*
@@ -1335,8 +1335,8 @@ static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
                ta.s_node = rt->gateway.s_node;
        }
 
-        /* Fix up skb->len field */
-        skb_trim(skb, min_t(unsigned int, origlen,
+       /* Fix up skb->len field */
+       skb_trim(skb, min_t(unsigned int, origlen,
                            (rt->dev->hard_header_len +
                             ddp_dl->header_length + (len_hops & 1023))));
 
@@ -1358,12 +1358,12 @@ static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
                /* 22 bytes - 12 ether, 2 len, 3 802.2 5 snap */
                struct sk_buff *nskb = skb_realloc_headroom(skb, 32);
                kfree_skb(skb);
-               if (!nskb) 
+               if (!nskb)
                        goto out;
                skb = nskb;
        } else
                skb = skb_unshare(skb, GFP_ATOMIC);
-       
+
        /*
         * If the buffer didn't vanish into the lack of space bitbucket we can
         * send it.
@@ -1395,13 +1395,13 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev,
        struct sock *sock;
        struct atalk_iface *atif;
        struct sockaddr_at tosat;
-        int origlen;
+       int origlen;
        __u16 len_hops;
 
        /* Don't mangle buffer if shared */
-       if (!(skb = skb_share_check(skb, GFP_ATOMIC))) 
+       if (!(skb = skb_share_check(skb, GFP_ATOMIC)))
                goto out;
-               
+
        /* Size check and make sure header is contiguous */
        if (!pskb_may_pull(skb, sizeof(*ddp)))
                goto freeit;
@@ -1490,7 +1490,7 @@ static int ltalk_rcv(struct sk_buff *skb, struct net_device *dev,
                        goto freeit;
 
                /* Don't mangle buffer if shared */
-               if (!(skb = skb_share_check(skb, GFP_ATOMIC))) 
+               if (!(skb = skb_share_check(skb, GFP_ATOMIC)))
                        return 0;
 
                /*
@@ -1501,11 +1501,11 @@ static int ltalk_rcv(struct sk_buff *skb, struct net_device *dev,
 
                /* Now fill in the long header */
 
-               /*
-                * These two first. The mac overlays the new source/dest
-                * network information so we MUST copy these before
-                * we write the network numbers !
-                */
+               /*
+                * These two first. The mac overlays the new source/dest
+                * network information so we MUST copy these before
+                * we write the network numbers !
+                */
 
                ddp->deh_dnode = skb->mac.raw[0];     /* From physical header */
                ddp->deh_snode = skb->mac.raw[1];     /* From physical header */
@@ -1605,7 +1605,7 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
        skb = sock_alloc_send_skb(sk, size, (flags & MSG_DONTWAIT), &err);
        if (!skb)
                return err;
-       
+
        skb->sk = sk;
        skb_reserve(skb, ddp_dl->header_length);
        skb_reserve(skb, dev->hard_header_len);
index 1237e208e246a5ebcce6d69f524749472c4d3b06..9e4dffc1e42359b91027868f1fc73bd8062c7368 100644 (file)
@@ -15,14 +15,14 @@ static int ltalk_change_mtu(struct net_device *dev, int mtu)
 }
 
 static int ltalk_mac_addr(struct net_device *dev, void *addr)
-{      
+{
        return -EINVAL;
 }
 
 static void ltalk_setup(struct net_device *dev)
 {
        /* Fill in the fields of the device structure with localtalk-generic values. */
-       
+
        dev->change_mtu         = ltalk_change_mtu;
        dev->hard_header        = NULL;
        dev->rebuild_header     = NULL;
@@ -34,8 +34,8 @@ static void ltalk_setup(struct net_device *dev)
        dev->hard_header_len    = LTALK_HLEN;
        dev->mtu                = LTALK_MTU;
        dev->addr_len           = LTALK_ALEN;
-       dev->tx_queue_len       = 10;   
-       
+       dev->tx_queue_len       = 10;
+
        dev->broadcast[0]       = 0xFF;
 
        dev->flags              = IFF_BROADCAST|IFF_MULTICAST|IFF_NOARP;
index 40b0af7437a2e0d5acbbcbfc59e5bc1ab37d5b6f..7df1778e221a6f9ab3782789ffeb51af61ceb165 100644 (file)
@@ -73,7 +73,7 @@ static struct ctl_table_header *atalk_table_header;
 
 void atalk_register_sysctl(void)
 {
-       atalk_table_header = register_sysctl_table(atalk_root_table, 1);
+       atalk_table_header = register_sysctl_table(atalk_root_table);
 }
 
 void atalk_unregister_sysctl(void)
index 3060fd0ba4b9fb51ca79a8079f22365433cc4470..6afa77d63bb534ac53e954515da36e3256b0af82 100644 (file)
@@ -4,7 +4,6 @@
 
 #include <linux/atm.h>
 #include <linux/atmdev.h>
-#include <linux/sched.h>
 #include <asm/uaccess.h>
 
 #include "signaling.h"
index 62f6ed1f2f98c9c5c25d70759f87d60e3e4f699d..f094a0879c16ddedcb386c6ca749a23f6c32fe9c 100644 (file)
@@ -30,15 +30,15 @@ static ssize_t show_address(struct class_device *cdev, char *buf)
 
 static ssize_t show_atmaddress(struct class_device *cdev, char *buf)
 {
-        unsigned long flags;
+       unsigned long flags;
        char *pos = buf;
        struct atm_dev *adev = to_atm_dev(cdev);
-        struct atm_dev_addr *aaddr;
+       struct atm_dev_addr *aaddr;
        int bin[] = { 1, 2, 10, 6, 1 }, *fmt = bin;
        int i, j;
 
-        spin_lock_irqsave(&adev->lock, flags);
-        list_for_each_entry(aaddr, &adev->local, entry) {
+       spin_lock_irqsave(&adev->lock, flags);
+       list_for_each_entry(aaddr, &adev->local, entry) {
                for(i = 0, j = 0; i < ATM_ESA_LEN; ++i, ++j) {
                        if (j == *fmt) {
                                pos += sprintf(pos, ".");
@@ -49,7 +49,7 @@ static ssize_t show_atmaddress(struct class_device *cdev, char *buf)
                }
                pos += sprintf(pos, "\n");
        }
-        spin_unlock_irqrestore(&adev->lock, flags);
+       spin_unlock_irqrestore(&adev->lock, flags);
 
        return pos - buf;
 }
@@ -61,7 +61,7 @@ static ssize_t show_carrier(struct class_device *cdev, char *buf)
 
        pos += sprintf(pos, "%d\n",
                       adev->signal == ATM_PHY_SIG_LOST ? 0 : 1);
-               
+
        return pos - buf;
 }
 
@@ -86,7 +86,7 @@ static ssize_t show_link_rate(struct class_device *cdev, char *buf)
                        link_rate = adev->link_rate * 8 * 53;
        }
        pos += sprintf(pos, "%d\n", link_rate);
-               
+
        return pos - buf;
 }
 
index 83a1c1b1d6cd2901761d5bc67b96c9594df094ba..ec4ebd3299e34acc154527ae3f4588964586a3ee 100644 (file)
@@ -182,7 +182,7 @@ static int br2684_xmit_vcc(struct sk_buff *skb, struct br2684_dev *brdev,
        ATM_SKB(skb)->vcc = atmvcc = brvcc->atmvcc;
        DPRINTK("atm_skb(%p)->vcc(%p)->dev(%p)\n", skb, atmvcc, atmvcc->dev);
        if (!atm_may_send(atmvcc, skb->truesize)) {
-               /* we free this here for now, because we cannot know in a higher 
+               /* we free this here for now, because we cannot know in a higher
                        layer whether the skb point it supplied wasn't freed yet.
                        now, it always is.
                */
@@ -718,7 +718,7 @@ static void *br2684_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 
        ++*pos;
 
-       brd = list_entry(brd->br2684_devs.next, 
+       brd = list_entry(brd->br2684_devs.next,
                         struct br2684_dev, br2684_devs);
        return (&brd->br2684_devs != &br2684_devs) ? brd : NULL;
 }
@@ -784,7 +784,7 @@ static int br2684_proc_open(struct inode *inode, struct file *file)
        return seq_open(file, &br2684_seq_ops);
 }
 
-static struct file_operations br2684_proc_ops = {
+static const struct file_operations br2684_proc_ops = {
        .owner   = THIS_MODULE,
        .open    = br2684_proc_open,
        .read    = seq_read,
index 5f8a1d222720c61ecf8b04ae077834e638a04f8d..ebb5d0ce8b6fd6f61fbe705c3b5162a6b6bca425 100644 (file)
@@ -971,7 +971,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations arp_seq_fops = {
+static const struct file_operations arp_seq_fops = {
        .open           = arp_seq_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index a2878e92c3abd903d734c48349aacc173e8b6bee..282d761454baaca115b57ac3995dcb4466949fe5 100644 (file)
@@ -109,11 +109,11 @@ static inline int vcc_writable(struct sock *sk)
        struct atm_vcc *vcc = atm_sk(sk);
 
        return (vcc->qos.txtp.max_sdu +
-               atomic_read(&sk->sk_wmem_alloc)) <= sk->sk_sndbuf;
+               atomic_read(&sk->sk_wmem_alloc)) <= sk->sk_sndbuf;
 }
 
 static void vcc_write_space(struct sock *sk)
-{       
+{
        read_lock(&sk->sk_callback_lock);
 
        if (vcc_writable(sk)) {
@@ -131,7 +131,7 @@ static struct proto vcc_proto = {
        .owner    = THIS_MODULE,
        .obj_size = sizeof(struct atm_vcc),
 };
+
 int vcc_create(struct socket *sock, int protocol, int family)
 {
        struct sock *sk;
@@ -359,7 +359,7 @@ static int __vcc_connect(struct atm_vcc *vcc, struct atm_dev *dev, short vpi,
                return error;
        vcc->dev = dev;
        write_lock_irq(&vcc_sklist_lock);
-       if (test_bit(ATM_DF_REMOVED, &dev->flags) || 
+       if (test_bit(ATM_DF_REMOVED, &dev->flags) ||
            (error = find_ci(vcc, &vpi, &vci))) {
                write_unlock_irq(&vcc_sklist_lock);
                goto fail_module_put;
@@ -494,20 +494,20 @@ int vcc_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
        if (!skb)
                return error;
 
-       copied = skb->len; 
+       copied = skb->len;
        if (copied > size) {
-               copied = size; 
+               copied = size;
                msg->msg_flags |= MSG_TRUNC;
        }
 
-        error = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
-        if (error)
-                return error;
-        sock_recv_timestamp(msg, sk, skb);
-        DPRINTK("RcvM %d -= %d\n", atomic_read(&sk->rmem_alloc), skb->truesize);
-        atm_return(vcc, skb->truesize);
-        skb_free_datagram(sk, skb);
-        return copied;
+       error = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
+       if (error)
+               return error;
+       sock_recv_timestamp(msg, sk, skb);
+       DPRINTK("RcvM %d -= %d\n", atomic_read(&sk->rmem_alloc), skb->truesize);
+       atm_return(vcc, skb->truesize);
+       skb_free_datagram(sk, skb);
+       return copied;
 }
 
 
@@ -675,7 +675,7 @@ static int check_qos(struct atm_qos *qos)
        int error;
 
        if (!qos->txtp.traffic_class && !qos->rxtp.traffic_class)
-                return -EINVAL;
+               return -EINVAL;
        if (qos->txtp.traffic_class != qos->rxtp.traffic_class &&
            qos->txtp.traffic_class && qos->rxtp.traffic_class &&
            qos->txtp.traffic_class != ATM_ANYCLASS &&
@@ -786,11 +786,11 @@ static int __init atm_init(void)
                printk(KERN_ERR "atmsvc_init() failed with %d\n", error);
                goto out_atmpvc_exit;
        }
-        if ((error = atm_proc_init()) < 0) {
+       if ((error = atm_proc_init()) < 0) {
                printk(KERN_ERR "atm_proc_init() failed with %d\n",error);
                goto out_atmsvc_exit;
        }
-        if ((error = atm_sysfs_init()) < 0) {
+       if ((error = atm_sysfs_init()) < 0) {
                printk(KERN_ERR "atm_sysfs_init() failed with %d\n",error);
                goto out_atmproc_exit;
        }
index a422da7788fbd44852fadba2261c5c5f1cdd1c0e..ad78c9e1117d2d3d8c2a9fb5fa995c1539b447cb 100644 (file)
@@ -1,5 +1,5 @@
 /* net/atm/common.h - ATM sockets (common part for PVC and SVC) */
+
 /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
 
 
index 8c2022c3e81dc05d0f9550e29c8bb9208fb4a4ac..8ccee4591f65f5571f4cfd8de770a0afd3e799f9 100644 (file)
@@ -76,7 +76,7 @@ int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                                }
                                skb = skb_peek(&sk->sk_receive_queue);
                                error = put_user(skb ? skb->len : 0,
-                                                (int __user *)argp) ? -EFAULT : 0;
+                                                (int __user *)argp) ? -EFAULT : 0;
                                goto done;
                        }
                case SIOCGSTAMP: /* borrowed from IP */
index 3fc0abeeaf344fac1d514b4f84b58339b6707703..3d804d61f6569e0ea0b0963d0abd50bc12204575 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * lec.c: Lan Emulation driver 
+ * lec.c: Lan Emulation driver
  *
  * Marko Kiiskila <mkiiskila@yahoo.com>
  */
@@ -1212,7 +1212,7 @@ static int lec_seq_release(struct inode *inode, struct file *file)
        return seq_release_private(inode, file);
 }
 
-static struct file_operations lec_seq_fops = {
+static const struct file_operations lec_seq_fops = {
        .owner = THIS_MODULE,
        .open = lec_seq_open,
        .read = seq_read,
@@ -1437,7 +1437,6 @@ static void lane2_associate_ind(struct net_device *dev, u8 *mac_addr,
  */
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <asm/param.h>
 #include <asm/atomic.h>
@@ -1457,7 +1456,7 @@ static void lane2_associate_ind(struct net_device *dev, u8 *mac_addr,
 static void lec_arp_check_expire(struct work_struct *work);
 static void lec_arp_expire_arp(unsigned long data);
 
-/* 
+/*
  * Arp table funcs
  */
 
@@ -1473,9 +1472,9 @@ static void lec_arp_init(struct lec_priv *priv)
        for (i = 0; i < LEC_ARP_TABLE_SIZE; i++) {
                INIT_HLIST_HEAD(&priv->lec_arp_tables[i]);
        }
-        INIT_HLIST_HEAD(&priv->lec_arp_empty_ones);
-        INIT_HLIST_HEAD(&priv->lec_no_forward);
-        INIT_HLIST_HEAD(&priv->mcast_fwds);
+       INIT_HLIST_HEAD(&priv->lec_arp_empty_ones);
+       INIT_HLIST_HEAD(&priv->lec_no_forward);
+       INIT_HLIST_HEAD(&priv->mcast_fwds);
        spin_lock_init(&priv->lec_arp_lock);
        INIT_DELAYED_WORK(&priv->lec_arp_work, lec_arp_check_expire);
        schedule_delayed_work(&priv->lec_arp_work, LEC_ARP_REFRESH_INTERVAL);
@@ -1770,7 +1769,7 @@ static void lec_arp_destroy(struct lec_priv *priv)
        spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
 }
 
-/* 
+/*
  * Find entry by mac_address
  */
 static struct lec_arp_table *lec_arp_find(struct lec_priv *priv,
@@ -1949,7 +1948,7 @@ restart:
 
 /*
  * Try to find vcc where mac_address is attached.
- * 
+ *
  */
 static struct atm_vcc *lec_arp_resolve(struct lec_priv *priv,
                                       unsigned char *mac_to_find, int is_rdesc,
@@ -2075,7 +2074,7 @@ lec_addr_delete(struct lec_priv *priv, unsigned char *atm_addr,
 }
 
 /*
- * Notifies:  Response to arp_request (atm_addr != NULL) 
+ * Notifies:  Response to arp_request (atm_addr != NULL)
  */
 static void
 lec_arp_update(struct lec_priv *priv, unsigned char *mac_addr,
@@ -2176,7 +2175,7 @@ out:
 }
 
 /*
- * Notifies: Vcc setup ready 
+ * Notifies: Vcc setup ready
  */
 static void
 lec_vcc_added(struct lec_priv *priv, struct atmlec_ioc *ioc_data,
@@ -2380,7 +2379,7 @@ lec_set_flush_tran_id(struct lec_priv *priv,
                        if (!memcmp(atm_addr, entry->atm_addr, ATM_ESA_LEN)) {
                                entry->flush_tran_id = tran_id;
                                DPRINTK("Set flush transaction id to %lx for %p\n",
-                                       tran_id, entry);
+                                       tran_id, entry);
                        }
                }
        spin_unlock_irqrestore(&priv->lec_arp_lock, flags);
index 99136babd5357a273a8c758b5d47116fc59d6dcf..b41cda7ea1e183804121ab9f89ab48b935e306fd 100644 (file)
@@ -52,12 +52,12 @@ struct lane2_ops {
 
 /*
  * ATM LAN Emulation supports both LLC & Dix Ethernet EtherType
- * frames. 
+ * frames.
  *
  * 1. Dix Ethernet EtherType frames encoded by placing EtherType
  *    field in h_type field. Data follows immediatelly after header.
  * 2. LLC Data frames whose total length, including LLC field and data,
- *    but not padding required to meet the minimum data frame length, 
+ *    but not padding required to meet the minimum data frame length,
  *    is less than 1536(0x0600) MUST be encoded by placing that length
  *    in the h_type field. The LLC field follows header immediatelly.
  * 3. LLC data frames longer than this maximum MUST be encoded by placing
index c18f73715ef9799acdc6177f3d2470eb4f10f196..cb3c004ff0224986485cc8228db6b15b9d6f573a 100644 (file)
@@ -32,7 +32,7 @@
 #include "resources.h"
 
 /*
- * mpc.c: Implementation of MPOA client kernel part 
+ * mpc.c: Implementation of MPOA client kernel part
  */
 
 #if 0
@@ -80,17 +80,17 @@ static struct llc_snap_hdr llc_snap_mpoa_ctrl = {
        0xaa, 0xaa, 0x03,
        {0x00, 0x00, 0x5e},
        {0x00, 0x03}         /* For MPOA control PDUs */
-};        
+};
 static struct llc_snap_hdr llc_snap_mpoa_data = {
        0xaa, 0xaa, 0x03,
        {0x00, 0x00, 0x00},
        {0x08, 0x00}         /* This is for IP PDUs only */
-};        
+};
 static struct llc_snap_hdr llc_snap_mpoa_data_tagged = {
        0xaa, 0xaa, 0x03,
        {0x00, 0x00, 0x00},
        {0x88, 0x4c}         /* This is for tagged data PDUs */
-};        
+};
 
 static struct notifier_block mpoa_notifier = {
        mpoa_event_listener,
@@ -106,12 +106,12 @@ static DEFINE_TIMER(mpc_timer, NULL, 0, 0);
 static struct mpoa_client *find_mpc_by_itfnum(int itf)
 {
        struct mpoa_client *mpc;
-       
+
        mpc = mpcs;  /* our global linked list */
        while (mpc != NULL) {
                if (mpc->dev_num == itf)
                        return mpc;
-               mpc = mpc->next;    
+               mpc = mpc->next;
        }
 
        return NULL;   /* not found */
@@ -120,7 +120,7 @@ static struct mpoa_client *find_mpc_by_itfnum(int itf)
 static struct mpoa_client *find_mpc_by_vcc(struct atm_vcc *vcc)
 {
        struct mpoa_client *mpc;
-       
+
        mpc = mpcs;  /* our global linked list */
        while (mpc != NULL) {
                if (mpc->mpoad_vcc == vcc)
@@ -134,7 +134,7 @@ static struct mpoa_client *find_mpc_by_vcc(struct atm_vcc *vcc)
 static struct mpoa_client *find_mpc_by_lec(struct net_device *dev)
 {
        struct mpoa_client *mpc;
-       
+
        mpc = mpcs;  /* our global linked list */
        while (mpc != NULL) {
                if (mpc->dev == dev)
@@ -190,7 +190,7 @@ struct atm_mpoa_qos *atm_mpoa_search_qos(__be32 dst_ip)
        }
 
        return qos;
-}        
+}
 
 /*
  * Returns 0 for failure
@@ -245,7 +245,7 @@ static struct net_device *find_lec_by_itfnum(int itf)
 
        sprintf(name, "lec%d", itf);
        dev = dev_get_by_name(name);
-       
+
        return dev;
 }
 
@@ -265,25 +265,25 @@ static struct mpoa_client *alloc_mpc(void)
        mpc->parameters.mpc_p2 = MPC_P2;
        memset(mpc->parameters.mpc_p3,0,sizeof(mpc->parameters.mpc_p3));
        mpc->parameters.mpc_p4 = MPC_P4;
-       mpc->parameters.mpc_p5 = MPC_P5; 
+       mpc->parameters.mpc_p5 = MPC_P5;
        mpc->parameters.mpc_p6 = MPC_P6;
-       
+
        mpcs = mpc;
-       
+
        return mpc;
 }
 
 /*
  *
  * start_mpc() puts the MPC on line. All the packets destined
- * to the lec underneath us are now being monitored and 
+ * to the lec underneath us are now being monitored and
  * shortcuts will be established.
  *
  */
 static void start_mpc(struct mpoa_client *mpc, struct net_device *dev)
 {
-       
-       dprintk("mpoa: (%s) start_mpc:\n", mpc->dev->name); 
+
+       dprintk("mpoa: (%s) start_mpc:\n", mpc->dev->name);
        if (dev->hard_start_xmit == NULL) {
                printk("mpoa: (%s) start_mpc: dev->hard_start_xmit == NULL, not starting\n",
                       dev->name);
@@ -297,8 +297,8 @@ static void start_mpc(struct mpoa_client *mpc, struct net_device *dev)
 
 static void stop_mpc(struct mpoa_client *mpc)
 {
-       
-       dprintk("mpoa: (%s) stop_mpc:", mpc->dev->name); 
+
+       dprintk("mpoa: (%s) stop_mpc:", mpc->dev->name);
 
        /* Lets not nullify lec device's dev->hard_start_xmit */
        if (mpc->dev->hard_start_xmit != mpc_send_packet) {
@@ -309,7 +309,7 @@ static void stop_mpc(struct mpoa_client *mpc)
        mpc->dev->hard_start_xmit = mpc->old_hard_start_xmit;
        mpc->old_hard_start_xmit = NULL;
        /* close_shortcuts(mpc);    ??? FIXME */
-       
+
        return;
 }
 
@@ -358,7 +358,7 @@ static void lane2_assoc_ind(struct net_device *dev, uint8_t *mac_addr,
        uint8_t length, mpoa_device_type, number_of_mps_macs;
        uint8_t *end_of_tlvs;
        struct mpoa_client *mpc;
-       
+
        mpoa_device_type = number_of_mps_macs = 0; /* silence gcc */
        dprintk("mpoa: (%s) lane2_assoc_ind: received TLV(s), ", dev->name);
        dprintk("total length of all TLVs %d\n", sizeoftlvs);
@@ -377,7 +377,7 @@ static void lane2_assoc_ind(struct net_device *dev, uint8_t *mac_addr,
                        printk("TLV value extends past its buffer, aborting parse\n");
                        return;
                }
-               
+
                if (type == 0) {
                        printk("mpoa: (%s) lane2_assoc_ind: TLV type was 0, returning\n", dev->name);
                        return;
@@ -412,10 +412,10 @@ static void lane2_assoc_ind(struct net_device *dev, uint8_t *mac_addr,
                        continue;  /* someone should read the spec */
                }
                dprintk("this MPS has %d MAC addresses\n", number_of_mps_macs);
-               
+
                /* ok, now we can go and tell our daemon the control address of MPS */
                send_set_mps_ctrl_addr(tlvs, mpc);
-               
+
                tlvs = copy_macs(mpc, mac_addr, tlvs, number_of_mps_macs, mpoa_device_type);
                if (tlvs == NULL) return;
        }
@@ -474,7 +474,7 @@ static int send_via_shortcut(struct sk_buff *skb, struct mpoa_client *mpc)
        iph = (struct iphdr *)buff;
        ipaddr = iph->daddr;
 
-       ddprintk("mpoa: (%s) send_via_shortcut: ipaddr 0x%x\n", mpc->dev->name, ipaddr);        
+       ddprintk("mpoa: (%s) send_via_shortcut: ipaddr 0x%x\n", mpc->dev->name, ipaddr);
 
        entry = mpc->in_ops->get(ipaddr, mpc);
        if (entry == NULL) {
@@ -483,15 +483,15 @@ static int send_via_shortcut(struct sk_buff *skb, struct mpoa_client *mpc)
                return 1;
        }
        if (mpc->in_ops->cache_hit(entry, mpc) != OPEN){   /* threshold not exceeded or VCC not ready */
-               ddprintk("mpoa: (%s) send_via_shortcut: cache_hit: returns != OPEN\n", mpc->dev->name);        
+               ddprintk("mpoa: (%s) send_via_shortcut: cache_hit: returns != OPEN\n", mpc->dev->name);
                mpc->in_ops->put(entry);
                return 1;
        }
 
-       ddprintk("mpoa: (%s) send_via_shortcut: using shortcut\n", mpc->dev->name);        
+       ddprintk("mpoa: (%s) send_via_shortcut: using shortcut\n", mpc->dev->name);
        /* MPOA spec A.1.4, MPOA client must decrement IP ttl at least by one */
        if (iph->ttl <= 1) {
-               ddprintk("mpoa: (%s) send_via_shortcut: IP ttl = %u, using LANE\n", mpc->dev->name, iph->ttl);        
+               ddprintk("mpoa: (%s) send_via_shortcut: IP ttl = %u, using LANE\n", mpc->dev->name, iph->ttl);
                mpc->in_ops->put(entry);
                return 1;
        }
@@ -529,7 +529,7 @@ static int mpc_send_packet(struct sk_buff *skb, struct net_device *dev)
        struct mpoa_client *mpc;
        struct ethhdr *eth;
        int i = 0;
-       
+
        mpc = find_mpc_by_lec(dev); /* this should NEVER fail */
        if(mpc == NULL) {
                printk("mpoa: (%s) mpc_send_packet: no MPC found\n", dev->name);
@@ -549,7 +549,7 @@ static int mpc_send_packet(struct sk_buff *skb, struct net_device *dev)
 
  non_ip:
        retval = mpc->old_hard_start_xmit(skb,dev);
-       
+
        return retval;
 }
 
@@ -569,11 +569,11 @@ static int atm_mpoa_vcc_attach(struct atm_vcc *vcc, void __user *arg)
        ipaddr = ioc_data.ipaddr;
        if (ioc_data.dev_num < 0 || ioc_data.dev_num >= MAX_LEC_ITF)
                return -EINVAL;
-       
+
        mpc = find_mpc_by_itfnum(ioc_data.dev_num);
        if (mpc == NULL)
                return -EINVAL;
-       
+
        if (ioc_data.type == MPC_SOCKET_INGRESS) {
                in_entry = mpc->in_ops->get(ipaddr, mpc);
                if (in_entry == NULL || in_entry->entry_state < INGRESS_RESOLVED) {
@@ -604,7 +604,7 @@ static void mpc_vcc_close(struct atm_vcc *vcc, struct net_device *dev)
        struct mpoa_client *mpc;
        in_cache_entry *in_entry;
        eg_cache_entry *eg_entry;
-       
+
        mpc = find_mpc_by_lec(dev);
        if (mpc == NULL) {
                printk("mpoa: (%s) mpc_vcc_close: close for unknown MPC\n", dev->name);
@@ -640,14 +640,14 @@ static void mpc_push(struct atm_vcc *vcc, struct sk_buff *skb)
        struct mpoa_client *mpc;
        __be32 tag;
        char *tmp;
-       
+
        ddprintk("mpoa: (%s) mpc_push:\n", dev->name);
        if (skb == NULL) {
                dprintk("mpoa: (%s) mpc_push: null skb, closing VCC\n", dev->name);
                mpc_vcc_close(vcc, dev);
                return;
        }
-       
+
        skb->dev = dev;
        if (memcmp(skb->data, &llc_snap_mpoa_ctrl, sizeof(struct llc_snap_hdr)) == 0) {
                struct sock *sk = sk_atm(vcc);
@@ -693,11 +693,11 @@ static void mpc_push(struct atm_vcc *vcc, struct sk_buff *skb)
                dev_kfree_skb_any(skb);
                return;
        }
-       
+
        /*
         * See if ingress MPC is using shortcut we opened as a return channel.
         * This means we have a bi-directional vcc opened by us.
-        */ 
+        */
        if (eg->shortcut == NULL) {
                eg->shortcut = vcc;
                printk("mpoa: (%s) mpc_push: egress SVC in use\n", dev->name);
@@ -743,7 +743,7 @@ static int atm_mpoa_mpoad_attach (struct atm_vcc *vcc, int arg)
        struct mpoa_client *mpc;
        struct lec_priv *priv;
        int err;
-       
+
        if (mpcs == NULL) {
                init_timer(&mpc_timer);
                mpc_timer_refresh();
@@ -755,7 +755,7 @@ static int atm_mpoa_mpoad_attach (struct atm_vcc *vcc, int arg)
                        return err;
                }
        }
-       
+
        mpc = find_mpc_by_itfnum(arg);
        if (mpc == NULL) {
                dprintk("mpoa: mpoad_attach: allocating new mpc for itf %d\n", arg);
@@ -776,7 +776,7 @@ static int atm_mpoa_mpoad_attach (struct atm_vcc *vcc, int arg)
                        dev_put(mpc->dev);
                        mpc->dev = NULL;
                } else
-                       priv->lane2_ops->associate_indicator = lane2_assoc_ind;  
+                       priv->lane2_ops->associate_indicator = lane2_assoc_ind;
        }
 
        mpc->mpoad_vcc = vcc;
@@ -788,7 +788,7 @@ static int atm_mpoa_mpoad_attach (struct atm_vcc *vcc, int arg)
        if (mpc->dev) {
                char empty[ATM_ESA_LEN];
                memset(empty, 0, ATM_ESA_LEN);
-               
+
                start_mpc(mpc, mpc->dev);
                /* set address if mpcd e.g. gets killed and restarted.
                 * If we do not do it now we have to wait for the next LE_ARP
@@ -806,7 +806,7 @@ static void send_set_mps_ctrl_addr(char *addr, struct mpoa_client *mpc)
        struct k_message mesg;
 
        memcpy (mpc->mps_ctrl_addr, addr, ATM_ESA_LEN);
-       
+
        mesg.type = SET_MPS_CTRL_ADDR;
        memcpy(mesg.MPS_ctrl, addr, ATM_ESA_LEN);
        msg_to_mpoad(&mesg, mpc);
@@ -828,7 +828,7 @@ static void mpoad_close(struct atm_vcc *vcc)
                printk("mpoa: mpoad_close: close for non-present mpoad\n");
                return;
        }
-       
+
        mpc->mpoad_vcc = NULL;
        if (mpc->dev) {
                struct lec_priv *priv = (struct lec_priv *)mpc->dev->priv;
@@ -844,7 +844,7 @@ static void mpoad_close(struct atm_vcc *vcc)
                atm_return(vcc, skb->truesize);
                kfree_skb(skb);
        }
-       
+
        printk("mpoa: (%s) going down\n",
                (mpc->dev) ? mpc->dev->name : "<unknown>");
        module_put(THIS_MODULE);
@@ -857,11 +857,11 @@ static void mpoad_close(struct atm_vcc *vcc)
  */
 static int msg_from_mpoad(struct atm_vcc *vcc, struct sk_buff *skb)
 {
-       
+
        struct mpoa_client *mpc = find_mpc_by_vcc(vcc);
        struct k_message *mesg = (struct k_message*)skb->data;
        atomic_sub(skb->truesize, &sk_atm(vcc)->sk_wmem_alloc);
-       
+
        if (mpc == NULL) {
                printk("mpoa: msg_from_mpoad: no mpc found\n");
                return 0;
@@ -938,7 +938,7 @@ int msg_to_mpoad(struct k_message *mesg, struct mpoa_client *mpc)
        skb_put(skb, sizeof(struct k_message));
        memcpy(skb->data, mesg, sizeof(struct k_message));
        atm_force_charge(mpc->mpoad_vcc, skb->truesize);
-       
+
        sk = sk_atm(mpc->mpoad_vcc);
        skb_queue_tail(&sk->sk_receive_queue, skb);
        sk->sk_data_ready(sk, skb->len);
@@ -955,7 +955,7 @@ static int mpoa_event_listener(struct notifier_block *mpoa_notifier, unsigned lo
        dev = (struct net_device *)dev_ptr;
        if (dev->name == NULL || strncmp(dev->name, "lec", 3))
                return NOTIFY_DONE; /* we are only interested in lec:s */
-       
+
        switch (event) {
        case NETDEV_REGISTER:       /* a new lec device was allocated */
                priv = (struct lec_priv *)dev->priv;
@@ -1043,7 +1043,7 @@ static void MPOA_trigger_rcvd(struct k_message *msg, struct mpoa_client *mpc)
                mpc->in_ops->put(entry);
                return;
        }
-       
+
        if(entry->entry_state == INGRESS_INVALID){
                entry->entry_state = INGRESS_RESOLVING;
                msg->type = SND_MPOA_RES_RQST;
@@ -1053,7 +1053,7 @@ static void MPOA_trigger_rcvd(struct k_message *msg, struct mpoa_client *mpc)
                mpc->in_ops->put(entry);
                return;
        }
-       
+
        printk("mpoa: (%s) MPOA_trigger_rcvd: entry already in resolving state\n",
                (mpc->dev) ? mpc->dev->name : "<unknown>");
        mpc->in_ops->put(entry);
@@ -1062,7 +1062,7 @@ static void MPOA_trigger_rcvd(struct k_message *msg, struct mpoa_client *mpc)
 
 /*
  * Things get complicated because we have to check if there's an egress
- * shortcut with suitable traffic parameters we could use. 
+ * shortcut with suitable traffic parameters we could use.
  */
 static void check_qos_and_open_shortcut(struct k_message *msg, struct mpoa_client *client, in_cache_entry *entry)
 {
@@ -1079,7 +1079,7 @@ static void check_qos_and_open_shortcut(struct k_message *msg, struct mpoa_clien
                            else if(eg_entry->shortcut->qos.txtp.max_pcr > 0)
                                    entry->shortcut = eg_entry->shortcut;
                }
-               if(entry->shortcut){
+               if(entry->shortcut){
                        dprintk("mpoa: (%s) using egress SVC to reach %u.%u.%u.%u\n",client->dev->name, NIPQUAD(dst_ip));
                        client->eg_ops->put(eg_entry);
                        return;
@@ -1094,7 +1094,7 @@ static void check_qos_and_open_shortcut(struct k_message *msg, struct mpoa_clien
        {
                msg->qos = qos->qos;
                printk("mpoa: (%s) trying to get a CBR shortcut\n",client->dev->name);
-       }
+       }
        else memset(&msg->qos,0,sizeof(struct atm_qos));
        msg_to_mpoad(msg, client);
        return;
@@ -1111,7 +1111,7 @@ static void MPOA_res_reply_rcvd(struct k_message *msg, struct mpoa_client *mpc)
                printk("\nmpoa: (%s) ARGH, received res. reply for an entry that doesn't exist.\n", mpc->dev->name);
                return;
        }
-       ddprintk(" entry_state = %d ", entry->entry_state);     
+       ddprintk(" entry_state = %d ", entry->entry_state);
 
        if (entry->entry_state == INGRESS_RESOLVED) {
                printk("\nmpoa: (%s) MPOA_res_reply_rcvd for RESOLVED entry!\n", mpc->dev->name);
@@ -1126,7 +1126,7 @@ static void MPOA_res_reply_rcvd(struct k_message *msg, struct mpoa_client *mpc)
        ddprintk("entry->shortcut = %p\n", entry->shortcut);
 
        if(entry->entry_state == INGRESS_RESOLVING && entry->shortcut != NULL){
-               entry->entry_state = INGRESS_RESOLVED; 
+               entry->entry_state = INGRESS_RESOLVED;
                mpc->in_ops->put(entry);
                return; /* Shortcut already open... */
        }
@@ -1137,7 +1137,7 @@ static void MPOA_res_reply_rcvd(struct k_message *msg, struct mpoa_client *mpc)
                mpc->in_ops->put(entry);
                return;
        }
-       
+
        check_qos_and_open_shortcut(msg, mpc, entry);
        entry->entry_state = INGRESS_RESOLVED;
        mpc->in_ops->put(entry);
@@ -1169,13 +1169,13 @@ static void ingress_purge_rcvd(struct k_message *msg, struct mpoa_client *mpc)
        } while (entry != NULL);
 
        return;
-} 
+}
 
 static void egress_purge_rcvd(struct k_message *msg, struct mpoa_client *mpc)
 {
        __be32 cache_id = msg->content.eg_info.cache_id;
        eg_cache_entry *entry = mpc->eg_ops->get_by_cache_id(cache_id, mpc);
-       
+
        if (entry == NULL) {
                dprintk("mpoa: (%s) egress_purge_rcvd: purge for a non-existing entry\n", mpc->dev->name);
                return;
@@ -1188,7 +1188,7 @@ static void egress_purge_rcvd(struct k_message *msg, struct mpoa_client *mpc)
        mpc->eg_ops->put(entry);
 
        return;
-} 
+}
 
 static void purge_egress_shortcut(struct atm_vcc *vcc, eg_cache_entry *entry)
 {
@@ -1259,7 +1259,7 @@ static void MPOA_cache_impos_rcvd( struct k_message * msg, struct mpoa_client *
 {
        uint16_t holding_time;
        eg_cache_entry *entry = mpc->eg_ops->get_by_cache_id(msg->content.eg_info.cache_id, mpc);
-       
+
        holding_time = msg->content.eg_info.holding_time;
        dprintk("mpoa: (%s) MPOA_cache_impos_rcvd: entry = %p, holding_time = %u\n",
               mpc->dev->name, entry, holding_time);
@@ -1272,13 +1272,13 @@ static void MPOA_cache_impos_rcvd( struct k_message * msg, struct mpoa_client *
                mpc->eg_ops->update(entry, holding_time);
                return;
        }
-       
+
        write_lock_irq(&mpc->egress_lock);
        mpc->eg_ops->remove_entry(entry, mpc);
        write_unlock_irq(&mpc->egress_lock);
 
        mpc->eg_ops->put(entry);
-       
+
        return;
 }
 
@@ -1328,7 +1328,7 @@ static void set_mps_mac_addr_rcvd(struct k_message *msg, struct mpoa_client *cli
                return;
        }
        client->number_of_mps_macs = 1;
-       
+
        return;
 }
 
@@ -1364,7 +1364,7 @@ static void mpc_timer_refresh(void)
        mpc_timer.data = mpc_timer.expires;
        mpc_timer.function = mpc_cache_check;
        add_timer(&mpc_timer);
-       
+
        return;
 }
 
@@ -1373,7 +1373,7 @@ static void mpc_cache_check( unsigned long checking_time  )
        struct mpoa_client *mpc = mpcs;
        static unsigned long previous_resolving_check_time;
        static unsigned long previous_refresh_time;
-       
+
        while( mpc != NULL ){
                mpc->in_ops->clear_count(mpc);
                mpc->eg_ops->clear_expired(mpc);
@@ -1388,7 +1388,7 @@ static void mpc_cache_check( unsigned long checking_time  )
                mpc = mpc->next;
        }
        mpc_timer_refresh();
-       
+
        return;
 }
 
index 51f460d005c306a5053a887278e8480e60e0d2af..24c386c35f5700442fcbee0134c6480daf8fa2a3 100644 (file)
 int msg_to_mpoad(struct k_message *msg, struct mpoa_client *mpc);
 
 struct mpoa_client {
-        struct mpoa_client *next;
-        struct net_device *dev;      /* lec in question                     */
-        int dev_num;                 /* e.g. 2 for lec2                     */
-        int (*old_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev);
-        struct atm_vcc *mpoad_vcc;   /* control channel to mpoad            */
-        uint8_t mps_ctrl_addr[ATM_ESA_LEN];  /* MPS control ATM address     */
-        uint8_t our_ctrl_addr[ATM_ESA_LEN];  /* MPC's control ATM address   */
-
-        rwlock_t ingress_lock;
-        struct in_cache_ops *in_ops; /* ingress cache operations            */
-        in_cache_entry *in_cache;    /* the ingress cache of this MPC       */
-
-        rwlock_t egress_lock;
-        struct eg_cache_ops *eg_ops; /* egress cache operations             */
-        eg_cache_entry *eg_cache;    /* the egress  cache of this MPC       */
-
-        uint8_t *mps_macs;           /* array of MPS MAC addresses, >=1     */
-        int number_of_mps_macs;      /* number of the above MAC addresses   */
-        struct mpc_parameters parameters;  /* parameters for this client    */
+       struct mpoa_client *next;
+       struct net_device *dev;      /* lec in question                     */
+       int dev_num;                 /* e.g. 2 for lec2                     */
+       int (*old_hard_start_xmit)(struct sk_buff *skb, struct net_device *dev);
+       struct atm_vcc *mpoad_vcc;   /* control channel to mpoad            */
+       uint8_t mps_ctrl_addr[ATM_ESA_LEN];  /* MPS control ATM address     */
+       uint8_t our_ctrl_addr[ATM_ESA_LEN];  /* MPC's control ATM address   */
+
+       rwlock_t ingress_lock;
+       struct in_cache_ops *in_ops; /* ingress cache operations            */
+       in_cache_entry *in_cache;    /* the ingress cache of this MPC       */
+
+       rwlock_t egress_lock;
+       struct eg_cache_ops *eg_ops; /* egress cache operations             */
+       eg_cache_entry *eg_cache;    /* the egress  cache of this MPC       */
+
+       uint8_t *mps_macs;           /* array of MPS MAC addresses, >=1     */
+       int number_of_mps_macs;      /* number of the above MAC addresses   */
+       struct mpc_parameters parameters;  /* parameters for this client    */
 };
 
 
 struct atm_mpoa_qos {
-        struct atm_mpoa_qos *next;
-        __be32 ipaddr;
-        struct atm_qos qos;
+       struct atm_mpoa_qos *next;
+       __be32 ipaddr;
+       struct atm_qos qos;
 };
 
 
index 697a081533b5acf26d49731e53d28f6f8d1e781c..24799e3e78f786398e679823c3d29feea384bef8 100644 (file)
@@ -369,7 +369,7 @@ static eg_cache_entry *eg_cache_get_by_vcc(struct atm_vcc *vcc, struct mpoa_clie
        while (entry != NULL){
                if (entry->shortcut == vcc) {
                        atomic_inc(&entry->use);
-                       read_unlock_irqrestore(&mpc->egress_lock, flags);
+                       read_unlock_irqrestore(&mpc->egress_lock, flags);
                        return entry;
                }
                entry = entry->next;
@@ -388,7 +388,7 @@ static eg_cache_entry *eg_cache_get_by_src_ip(__be32 ipaddr, struct mpoa_client
        while(entry != NULL){
                if(entry->latest_ip_addr == ipaddr) {
                        atomic_inc(&entry->use);
-                       read_unlock_irq(&mpc->egress_lock);
+                       read_unlock_irq(&mpc->egress_lock);
                        return entry;
                }
                entry = entry->next;
index 84de977def2ed595a8f00679b008e0fd90279576..8e5f78cf0be1456c348a08e0539b31bea0f79632 100644 (file)
@@ -12,66 +12,66 @@ struct mpoa_client;
 void atm_mpoa_init_cache(struct mpoa_client *mpc);
 
 typedef struct in_cache_entry {
-        struct in_cache_entry *next;
-        struct in_cache_entry *prev;
-        struct timeval  tv;
-        struct timeval  reply_wait;
-        struct timeval  hold_down;
-        uint32_t  packets_fwded;
-        uint16_t  entry_state; 
-        uint32_t retry_time;
-        uint32_t refresh_time;
-        uint32_t count;
-        struct   atm_vcc *shortcut;
-        uint8_t  MPS_ctrl_ATM_addr[ATM_ESA_LEN];
-        struct   in_ctrl_info ctrl_info;
-        atomic_t use;
+       struct in_cache_entry *next;
+       struct in_cache_entry *prev;
+       struct timeval  tv;
+       struct timeval  reply_wait;
+       struct timeval  hold_down;
+       uint32_t  packets_fwded;
+       uint16_t  entry_state;
+       uint32_t retry_time;
+       uint32_t refresh_time;
+       uint32_t count;
+       struct   atm_vcc *shortcut;
+       uint8_t  MPS_ctrl_ATM_addr[ATM_ESA_LEN];
+       struct   in_ctrl_info ctrl_info;
+       atomic_t use;
 } in_cache_entry;
 
 struct in_cache_ops{
-        in_cache_entry *(*add_entry)(__be32 dst_ip,
-                                      struct mpoa_client *client);
-        in_cache_entry *(*get)(__be32 dst_ip, struct mpoa_client *client);
-        in_cache_entry *(*get_with_mask)(__be32 dst_ip,
+       in_cache_entry *(*add_entry)(__be32 dst_ip,
+                                     struct mpoa_client *client);
+       in_cache_entry *(*get)(__be32 dst_ip, struct mpoa_client *client);
+       in_cache_entry *(*get_with_mask)(__be32 dst_ip,
                                         struct mpoa_client *client,
                                         __be32 mask);
-        in_cache_entry *(*get_by_vcc)(struct atm_vcc *vcc, 
-                                      struct mpoa_client *client);
-        void            (*put)(in_cache_entry *entry);
-        void            (*remove_entry)(in_cache_entry *delEntry,
+       in_cache_entry *(*get_by_vcc)(struct atm_vcc *vcc,
+                                     struct mpoa_client *client);
+       void            (*put)(in_cache_entry *entry);
+       void            (*remove_entry)(in_cache_entry *delEntry,
                                        struct mpoa_client *client );
-        int             (*cache_hit)(in_cache_entry *entry,
-                                     struct mpoa_client *client);
-        void            (*clear_count)(struct mpoa_client *client);
-        void            (*check_resolving)(struct mpoa_client *client);
-        void            (*refresh)(struct mpoa_client *client);
-        void            (*destroy_cache)(struct mpoa_client *mpc);
+       int             (*cache_hit)(in_cache_entry *entry,
+                                    struct mpoa_client *client);
+       void            (*clear_count)(struct mpoa_client *client);
+       void            (*check_resolving)(struct mpoa_client *client);
+       void            (*refresh)(struct mpoa_client *client);
+       void            (*destroy_cache)(struct mpoa_client *mpc);
 };
 
 typedef struct eg_cache_entry{
-        struct               eg_cache_entry *next;
-        struct               eg_cache_entry *prev;
-        struct               timeval  tv;
-        uint8_t              MPS_ctrl_ATM_addr[ATM_ESA_LEN];
-        struct atm_vcc       *shortcut;
-        uint32_t             packets_rcvd;
-        uint16_t             entry_state;
-        __be32             latest_ip_addr;    /* The src IP address of the last packet */
-        struct eg_ctrl_info  ctrl_info;
-        atomic_t             use;
+       struct               eg_cache_entry *next;
+       struct               eg_cache_entry *prev;
+       struct               timeval  tv;
+       uint8_t              MPS_ctrl_ATM_addr[ATM_ESA_LEN];
+       struct atm_vcc       *shortcut;
+       uint32_t             packets_rcvd;
+       uint16_t             entry_state;
+       __be32             latest_ip_addr;    /* The src IP address of the last packet */
+       struct eg_ctrl_info  ctrl_info;
+       atomic_t             use;
 } eg_cache_entry;
 
 struct eg_cache_ops{
-        eg_cache_entry *(*add_entry)(struct k_message *msg, struct mpoa_client *client);
-        eg_cache_entry *(*get_by_cache_id)(__be32 cache_id, struct mpoa_client *client);
-        eg_cache_entry *(*get_by_tag)(__be32 cache_id, struct mpoa_client *client);
-        eg_cache_entry *(*get_by_vcc)(struct atm_vcc *vcc, struct mpoa_client *client);
-        eg_cache_entry *(*get_by_src_ip)(__be32 ipaddr, struct mpoa_client *client);
-        void            (*put)(eg_cache_entry *entry);
-        void            (*remove_entry)(eg_cache_entry *entry, struct mpoa_client *client);
-        void            (*update)(eg_cache_entry *entry, uint16_t holding_time);
-        void            (*clear_expired)(struct mpoa_client *client);
-        void            (*destroy_cache)(struct mpoa_client *mpc);
+       eg_cache_entry *(*add_entry)(struct k_message *msg, struct mpoa_client *client);
+       eg_cache_entry *(*get_by_cache_id)(__be32 cache_id, struct mpoa_client *client);
+       eg_cache_entry *(*get_by_tag)(__be32 cache_id, struct mpoa_client *client);
+       eg_cache_entry *(*get_by_vcc)(struct atm_vcc *vcc, struct mpoa_client *client);
+       eg_cache_entry *(*get_by_src_ip)(__be32 ipaddr, struct mpoa_client *client);
+       void            (*put)(eg_cache_entry *entry);
+       void            (*remove_entry)(eg_cache_entry *entry, struct mpoa_client *client);
+       void            (*update)(eg_cache_entry *entry, uint16_t holding_time);
+       void            (*clear_expired)(struct mpoa_client *client);
+       void            (*destroy_cache)(struct mpoa_client *mpc);
 };
 
 
@@ -85,7 +85,7 @@ struct eg_cache_ops{
 /* VCC states */
 
 #define OPEN   1
-#define CLOSED 0 
+#define CLOSED 0
 
 /* Egress cache entry states */
 
index 3844c85d602f240707e73aa27c859d1b79ecaadc..4b05cbec7a581c8d44a14dfe3dbcfe593e961c40 100644 (file)
@@ -2,7 +2,7 @@
 #ifdef CONFIG_PROC_FS
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/string.h> 
+#include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/module.h>
 #include <linux/proc_fs.h>
@@ -16,7 +16,7 @@
 
 /*
  * mpoa_proc.c: Implementation MPOA client's proc
- * file system statistics 
+ * file system statistics
  */
 
 #if 1
@@ -32,14 +32,14 @@ extern struct proc_dir_entry *atm_proc_root;  /* from proc.c. */
 
 static int proc_mpc_open(struct inode *inode, struct file *file);
 static ssize_t proc_mpc_write(struct file *file, const char __user *buff,
-                              size_t nbytes, loff_t *ppos);
+                             size_t nbytes, loff_t *ppos);
 
 static int parse_qos(const char *buff);
 
 /*
  *   Define allowed FILE OPERATIONS
  */
-static struct file_operations mpc_file_operations = {
+static const struct file_operations mpc_file_operations = {
        .owner =        THIS_MODULE,
        .open =         proc_mpc_open,
        .read =         seq_read,
@@ -52,18 +52,18 @@ static struct file_operations mpc_file_operations = {
  * Returns the state of an ingress cache entry as a string
  */
 static const char *ingress_state_string(int state){
-        switch(state) {
+       switch(state) {
        case INGRESS_RESOLVING:
-               return "resolving  ";
+               return "resolving  ";
                break;
        case INGRESS_RESOLVED:
-                return "resolved   ";
+               return "resolved   ";
                break;
        case INGRESS_INVALID:
-               return "invalid    ";
+               return "invalid    ";
                break;
        case INGRESS_REFRESHING:
-               return "refreshing ";
+               return "refreshing ";
                break;
        default:
               return "";
@@ -74,15 +74,15 @@ static const char *ingress_state_string(int state){
  * Returns the state of an egress cache entry as a string
  */
 static const char *egress_state_string(int state){
-        switch(state) {
+       switch(state) {
        case EGRESS_RESOLVED:
-               return "resolved   ";
+               return "resolved   ";
                break;
        case EGRESS_PURGE:
-                return "purge      ";
+               return "purge      ";
                break;
        case EGRESS_INVALID:
-               return "invalid    ";
+               return "invalid    ";
                break;
        default:
               return "";
@@ -135,7 +135,7 @@ static int mpc_show(struct seq_file *m, void *v)
                return 0;
        }
 
-       seq_printf(m, "\nInterface %d:\n\n", mpc->dev_num);  
+       seq_printf(m, "\nInterface %d:\n\n", mpc->dev_num);
        seq_printf(m, "Ingress Entries:\nIP address      State      Holding time  Packets fwded  VPI  VCI\n");
        do_gettimeofday(&now);
 
@@ -163,7 +163,7 @@ static int mpc_show(struct seq_file *m, void *v)
                           egress_state_string(eg_entry->entry_state),
                           (eg_entry->ctrl_info.holding_time-(now.tv_sec-eg_entry->tv.tv_sec)),
                           eg_entry->packets_rcvd);
-               
+
                /* latest IP address */
                temp = (unsigned char *)&eg_entry->latest_ip_addr;
                sprintf(ip_string, "%d.%d.%d.%d", temp[0], temp[1], temp[2], temp[3]);
@@ -190,51 +190,51 @@ static int proc_mpc_open(struct inode *inode, struct file *file)
 }
 
 static ssize_t proc_mpc_write(struct file *file, const char __user *buff,
-                              size_t nbytes, loff_t *ppos)
+                             size_t nbytes, loff_t *ppos)
 {
-        char *page, *p;
+       char *page, *p;
        unsigned len;
 
-        if (nbytes == 0)
+       if (nbytes == 0)
                return 0;
 
-        if (nbytes >= PAGE_SIZE)
+       if (nbytes >= PAGE_SIZE)
                nbytes = PAGE_SIZE-1;
 
-        page = (char *)__get_free_page(GFP_KERNEL);
-        if (!page)
+       page = (char *)__get_free_page(GFP_KERNEL);
+       if (!page)
                return -ENOMEM;
 
-        for (p = page, len = 0; len < nbytes; p++, len++) {
-                if (get_user(*p, buff++)) {
+       for (p = page, len = 0; len < nbytes; p++, len++) {
+               if (get_user(*p, buff++)) {
                        free_page((unsigned long)page);
                        return -EFAULT;
                }
-                if (*p == '\0' || *p == '\n')
-                        break;
-        }
+               if (*p == '\0' || *p == '\n')
+                       break;
+       }
 
-        *p = '\0';
+       *p = '\0';
 
        if (!parse_qos(page))
-                printk("mpoa: proc_mpc_write: could not parse '%s'\n", page);
+               printk("mpoa: proc_mpc_write: could not parse '%s'\n", page);
+
+       free_page((unsigned long)page);
 
-        free_page((unsigned long)page);
-        
-        return len;
+       return len;
 }
 
 static int parse_qos(const char *buff)
 {
-        /* possible lines look like this
-         * add 130.230.54.142 tx=max_pcr,max_sdu rx=max_pcr,max_sdu
-         */
-        unsigned char ip[4]; 
+       /* possible lines look like this
+        * add 130.230.54.142 tx=max_pcr,max_sdu rx=max_pcr,max_sdu
+        */
+       unsigned char ip[4];
        int tx_pcr, tx_sdu, rx_pcr, rx_sdu;
-        __be32 ipaddr;
-       struct atm_qos qos; 
-        
-        memset(&qos, 0, sizeof(struct atm_qos));
+       __be32 ipaddr;
+       struct atm_qos qos;
+
+       memset(&qos, 0, sizeof(struct atm_qos));
 
        if (sscanf(buff, "del %hhu.%hhu.%hhu.%hhu",
                        ip, ip+1, ip+2, ip+3) == 4) {
@@ -250,14 +250,14 @@ static int parse_qos(const char *buff)
                ip, ip+1, ip+2, ip+3, &tx_pcr, &tx_sdu, &rx_pcr, &rx_sdu) != 8)
                return 0;
 
-        ipaddr = *(__be32 *)ip;
+       ipaddr = *(__be32 *)ip;
        qos.txtp.traffic_class = ATM_CBR;
        qos.txtp.max_pcr = tx_pcr;
        qos.txtp.max_sdu = tx_sdu;
        qos.rxtp.traffic_class = ATM_CBR;
        qos.rxtp.max_pcr = rx_pcr;
        qos.rxtp.max_sdu = rx_sdu;
-        qos.aal = ATM_AAL5;
+       qos.aal = ATM_AAL5;
        dprintk("mpoa: mpoa_proc.c: parse_qos(): setting qos paramameters to tx=%d,%d rx=%d,%d\n",
                qos.txtp.max_pcr,
                qos.txtp.max_sdu,
@@ -276,11 +276,11 @@ int mpc_proc_init(void)
 {
        struct proc_dir_entry *p;
 
-        p = create_proc_entry(STAT_FILE_NAME, 0, atm_proc_root);
+       p = create_proc_entry(STAT_FILE_NAME, 0, atm_proc_root);
        if (!p) {
-                printk(KERN_ERR "Unable to initialize /proc/atm/%s\n", STAT_FILE_NAME);
-                return -ENOMEM;
-        }
+               printk(KERN_ERR "Unable to initialize /proc/atm/%s\n", STAT_FILE_NAME);
+               return -ENOMEM;
+       }
        p->proc_fops = &mpc_file_operations;
        p->owner = THIS_MODULE;
        return 0;
index 739866bfe9e9d6992c05e64227964db56dcb3968..9e61e512f6670d77f0f7f0e2a55d1f79cb60ff5d 100644 (file)
@@ -33,7 +33,7 @@
 static ssize_t proc_dev_atm_read(struct file *file,char __user *buf,size_t count,
     loff_t *pos);
 
-static struct file_operations proc_atm_dev_ops = {
+static const struct file_operations proc_atm_dev_ops = {
        .owner =        THIS_MODULE,
        .read =         proc_dev_atm_read,
 };
@@ -86,7 +86,7 @@ static int __vcc_walk(struct sock **sock, int family, int *bucket, loff_t l)
                                break;
                }
                l--;
-       } 
+       }
 try_again:
        for (; sk; sk = sk_next(sk)) {
                l -= compare_family(sk, family);
@@ -205,7 +205,7 @@ static void vcc_info(struct seq_file *seq, struct atm_vcc *vcc)
        seq_printf(seq, "%p ", vcc);
        if (!vcc->dev)
                seq_printf(seq, "Unassigned    ");
-       else 
+       else
                seq_printf(seq, "%3d %3d %5d ", vcc->dev->number, vcc->vpi,
                        vcc->vci);
        switch (sk->sk_family) {
@@ -249,7 +249,7 @@ static int atm_dev_seq_show(struct seq_file *seq, void *v)
        static char atm_dev_banner[] =
                "Itf Type    ESI/\"MAC\"addr "
                "AAL(TX,err,RX,err,drop) ...               [refcnt]\n";
+
        if (v == (void *)1)
                seq_puts(seq, atm_dev_banner);
        else {
@@ -257,22 +257,22 @@ static int atm_dev_seq_show(struct seq_file *seq, void *v)
 
                atm_dev_info(seq, dev);
        }
-       return 0;
+       return 0;
 }
+
 static struct seq_operations atm_dev_seq_ops = {
        .start  = atm_dev_seq_start,
        .next   = atm_dev_seq_next,
        .stop   = atm_dev_seq_stop,
        .show   = atm_dev_seq_show,
 };
+
 static int atm_dev_seq_open(struct inode *inode, struct file *file)
 {
        return seq_open(file, &atm_dev_seq_ops);
 }
-static struct file_operations devices_seq_fops = {
+
+static const struct file_operations devices_seq_fops = {
        .open           = atm_dev_seq_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -281,7 +281,7 @@ static struct file_operations devices_seq_fops = {
 
 static int pvc_seq_show(struct seq_file *seq, void *v)
 {
-       static char atm_pvc_banner[] = 
+       static char atm_pvc_banner[] =
                "Itf VPI VCI   AAL RX(PCR,Class) TX(PCR,Class)\n";
 
        if (v == (void *)1)
@@ -307,7 +307,7 @@ static int pvc_seq_open(struct inode *inode, struct file *file)
        return __vcc_seq_open(inode, file, PF_ATMPVC, &pvc_seq_ops);
 }
 
-static struct file_operations pvc_seq_fops = {
+static const struct file_operations pvc_seq_fops = {
        .open           = pvc_seq_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -316,32 +316,32 @@ static struct file_operations pvc_seq_fops = {
 
 static int vcc_seq_show(struct seq_file *seq, void *v)
 {
-       if (v == (void *)1) {
-               seq_printf(seq, sizeof(void *) == 4 ? "%-8s%s" : "%-16s%s",
-                       "Address ", "Itf VPI VCI   Fam Flags Reply "
-                       "Send buffer     Recv buffer      [refcnt]\n");
-       } else {
-               struct vcc_state *state = seq->private;
-               struct atm_vcc *vcc = atm_sk(state->sk);
-  
-               vcc_info(seq, vcc);
-       }
-       return 0;
+       if (v == (void *)1) {
+               seq_printf(seq, sizeof(void *) == 4 ? "%-8s%s" : "%-16s%s",
+                       "Address ", "Itf VPI VCI   Fam Flags Reply "
+                       "Send buffer     Recv buffer      [refcnt]\n");
+       } else {
+               struct vcc_state *state = seq->private;
+               struct atm_vcc *vcc = atm_sk(state->sk);
+
+               vcc_info(seq, vcc);
+       }
+       return 0;
 }
-  
+
 static struct seq_operations vcc_seq_ops = {
-       .start  = vcc_seq_start,
-       .next   = vcc_seq_next,
-       .stop   = vcc_seq_stop,
-       .show   = vcc_seq_show,
+       .start  = vcc_seq_start,
+       .next   = vcc_seq_next,
+       .stop   = vcc_seq_stop,
+       .show   = vcc_seq_show,
 };
+
 static int vcc_seq_open(struct inode *inode, struct file *file)
 {
-       return __vcc_seq_open(inode, file, 0, &vcc_seq_ops);
+       return __vcc_seq_open(inode, file, 0, &vcc_seq_ops);
 }
-static struct file_operations vcc_seq_fops = {
+
+static const struct file_operations vcc_seq_fops = {
        .open           = vcc_seq_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -350,7 +350,7 @@ static struct file_operations vcc_seq_fops = {
 
 static int svc_seq_show(struct seq_file *seq, void *v)
 {
-       static char atm_svc_banner[] = 
+       static char atm_svc_banner[] =
                "Itf VPI VCI           State      Remote\n";
 
        if (v == (void *)1)
@@ -376,7 +376,7 @@ static int svc_seq_open(struct inode *inode, struct file *file)
        return __vcc_seq_open(inode, file, PF_ATMSVC, &svc_seq_ops);
 }
 
-static struct file_operations svc_seq_fops = {
+static const struct file_operations svc_seq_fops = {
        .open           = svc_seq_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -457,7 +457,7 @@ void atm_proc_dev_deregister(struct atm_dev *dev)
 
 static struct atm_proc_entry {
        char *name;
-       struct file_operations *proc_fops;
+       const struct file_operations *proc_fops;
        struct proc_dir_entry *dirent;
 } atm_proc_ents[] = {
        { .name = "devices",    .proc_fops = &devices_seq_fops },
@@ -472,7 +472,7 @@ static void atm_proc_dirs_remove(void)
        static struct atm_proc_entry *e;
 
        for (e = atm_proc_ents; e->name; e++) {
-               if (e->dirent) 
+               if (e->dirent)
                        remove_proc_entry(e->name, atm_proc_root);
        }
        remove_proc_entry("net/atm", NULL);
index b2148b43a42611c97780ff6dc8a0a8288527cf91..848e6e191cc7179f30c3cfdcfb4007f53c5e8a85 100644 (file)
@@ -72,7 +72,7 @@ static int pvc_setsockopt(struct socket *sock, int level, int optname,
 
 
 static int pvc_getsockopt(struct socket *sock, int level, int optname,
-                         char __user *optval, int __user *optlen)
+                         char __user *optval, int __user *optlen)
 {
        struct sock *sk = sock->sk;
        int error;
@@ -91,7 +91,7 @@ static int pvc_getname(struct socket *sock,struct sockaddr *sockaddr,
        struct atm_vcc *vcc = ATM_SD(sock);
 
        if (!vcc->dev || !test_bit(ATM_VF_ADDR,&vcc->flags)) return -ENOTCONN;
-        *sockaddr_len = sizeof(struct sockaddr_atmpvc);
+       *sockaddr_len = sizeof(struct sockaddr_atmpvc);
        addr = (struct sockaddr_atmpvc *) sockaddr;
        addr->sap_family = AF_ATMPVC;
        addr->sap_addr.itf = vcc->dev->number;
index 3e57b17ca523139222e771bd49656797b2ecab4b..1378f61c5c3178876aeffb0438621efdb91394c7 100644 (file)
@@ -4,7 +4,6 @@
 
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/atmdev.h>
 #include <linux/capability.h>
 #include <linux/kernel.h>
@@ -56,12 +55,12 @@ static int atm_send_aal0(struct atm_vcc *vcc,struct sk_buff *skb)
         * still work
         */
        if (!capable(CAP_NET_ADMIN) &&
-            (((u32 *) skb->data)[0] & (ATM_HDR_VPI_MASK | ATM_HDR_VCI_MASK)) !=
-            ((vcc->vpi << ATM_HDR_VPI_SHIFT) | (vcc->vci << ATM_HDR_VCI_SHIFT)))
+           (((u32 *) skb->data)[0] & (ATM_HDR_VPI_MASK | ATM_HDR_VCI_MASK)) !=
+           ((vcc->vpi << ATM_HDR_VPI_SHIFT) | (vcc->vci << ATM_HDR_VCI_SHIFT)))
            {
                kfree_skb(skb);
                return -EADDRNOTAVAIL;
-        }
+       }
        return vcc->dev->ops->send(vcc,skb);
 }
 
index 529f7e64aa2c33ae45d162b035ccf241431c6c0d..1bcf6dc8d40988b1f4a1e5198bfed470edb3e229 100644 (file)
@@ -142,8 +142,8 @@ void atm_dev_deregister(struct atm_dev *dev)
        set_bit(ATM_DF_REMOVED, &dev->flags);
 
        /*
-        * if we remove current device from atm_devs list, new device 
-        * with same number can appear, such we need deregister proc, 
+        * if we remove current device from atm_devs list, new device
+        * with same number can appear, such we need deregister proc,
         * release async all vccs and remove them from vccs list too
         */
        mutex_lock(&atm_dev_mutex);
@@ -228,7 +228,7 @@ int atm_dev_ioctl(unsigned int cmd, void __user *arg)
                                *tmp_p++ = dev->number;
                        }
                        mutex_unlock(&atm_dev_mutex);
-                       error = ((copy_to_user(buf, tmp_buf, size)) ||
+                       error = ((copy_to_user(buf, tmp_buf, size)) ||
                                        put_user(size, &iobuf->length))
                                                ? -EFAULT : 0;
                        kfree(tmp_buf);
@@ -247,7 +247,7 @@ int atm_dev_ioctl(unsigned int cmd, void __user *arg)
        if (!(dev = try_then_request_module(atm_dev_lookup(number),
                                            "atm-device-%d", number)))
                return -ENODEV;
-       
+
        switch (cmd) {
                case ATM_GETTYPE:
                        size = strlen(dev->type) + 1;
@@ -390,7 +390,7 @@ int atm_dev_ioctl(unsigned int cmd, void __user *arg)
                                goto done;
                        }
        }
-       
+
        if (size)
                error = put_user(size, &sioc->length)
                        ? -EFAULT : 0;
@@ -414,15 +414,15 @@ static __inline__ void *dev_get_idx(loff_t left)
 
 void *atm_dev_seq_start(struct seq_file *seq, loff_t *pos)
 {
-       mutex_lock(&atm_dev_mutex);
+       mutex_lock(&atm_dev_mutex);
        return *pos ? dev_get_idx(*pos) : (void *) 1;
 }
 
 void atm_dev_seq_stop(struct seq_file *seq, void *v)
 {
-       mutex_unlock(&atm_dev_mutex);
+       mutex_unlock(&atm_dev_mutex);
 }
+
 void *atm_dev_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        ++*pos;
index 434ead4557143f93b13f8779fa453fe70b97f511..08b2a69cc57273acee42a17b140195875baab94b 100644 (file)
@@ -1,7 +1,7 @@
 /* net/atm/signaling.h - ATM signaling */
+
 /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
+
 
 #ifndef NET_ATM_SIGNALING_H
 #define NET_ATM_SIGNALING_H
index 3a180cfd7b48ee37116f9b78a1dc98081a9528d5..876ec7b47a2f7a8eff8b3882f7e69e9b32cac9ea 100644 (file)
@@ -89,7 +89,7 @@ static int svc_release(struct socket *sock)
                clear_bit(ATM_VF_READY, &vcc->flags);
                /* VCC pointer is used as a reference, so we must not free it
                   (thereby subjecting it to re-use) before all pending connections
-                  are closed */
+                  are closed */
                svc_disconnect(vcc);
                vcc_release(sock);
        }
@@ -144,7 +144,7 @@ static int svc_bind(struct socket *sock,struct sockaddr *sockaddr,
                error = -EUNATCH;
                goto out;
        }
-        if (!sk->sk_err)
+       if (!sk->sk_err)
                set_bit(ATM_VF_BOUND,&vcc->flags);
        error = -sk->sk_err;
 out:
@@ -229,7 +229,7 @@ static int svc_connect(struct socket *sock,struct sockaddr *sockaddr,
                         * This is tricky:
                         *   Kernel ---close--> Demon
                         *   Kernel <--close--- Demon
-                        * or
+                        * or
                         *   Kernel ---close--> Demon
                         *   Kernel <--error--- Demon
                         * or
@@ -470,13 +470,13 @@ static int svc_setsockopt(struct socket *sock, int level, int optname,
                        }
                        set_bit(ATM_VF_HASSAP, &vcc->flags);
                        break;
-               case SO_MULTIPOINT:
+               case SO_MULTIPOINT:
                        if (level != SOL_ATM || optlen != sizeof(int)) {
                                error = -EINVAL;
                                goto out;
                        }
-                       if (get_user(value, (int __user *) optval)) {
-                               error = -EFAULT;
+                       if (get_user(value, (int __user *) optval)) {
+                               error = -EFAULT;
                                goto out;
                        }
                        if (value == 1) {
@@ -486,7 +486,7 @@ static int svc_setsockopt(struct socket *sock, int level, int optname,
                        } else {
                                error = -EINVAL;
                        }
-                       break;
+                       break;
                default:
                        error = vcc_setsockopt(sock, level, optname,
                                               optval, optlen);
@@ -539,7 +539,7 @@ static int svc_addparty(struct socket *sock, struct sockaddr *sockaddr,
        set_bit(ATM_VF_WAITING, &vcc->flags);
        prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
        sigd_enq(vcc, as_addparty, NULL, NULL,
-                (struct sockaddr_atmsvc *) sockaddr);
+                (struct sockaddr_atmsvc *) sockaddr);
        if (flags & O_NONBLOCK) {
                finish_wait(sk->sk_sleep, &wait);
                error = -EINPROGRESS;
@@ -587,26 +587,26 @@ out:
 
 static int svc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
-       int error, ep_ref;
-       struct sockaddr_atmsvc sa;
+       int error, ep_ref;
+       struct sockaddr_atmsvc sa;
        struct atm_vcc *vcc = ATM_SD(sock);
-  
+
        switch (cmd) {
-               case ATM_ADDPARTY:
-                       if (!test_bit(ATM_VF_SESSION, &vcc->flags))
-                               return -EINVAL;
-                       if (copy_from_user(&sa, (void __user *) arg, sizeof(sa)))
+               case ATM_ADDPARTY:
+                       if (!test_bit(ATM_VF_SESSION, &vcc->flags))
+                               return -EINVAL;
+                       if (copy_from_user(&sa, (void __user *) arg, sizeof(sa)))
                                return -EFAULT;
-                       error = svc_addparty(sock, (struct sockaddr *) &sa, sizeof(sa), 0);
-                       break;
-               case ATM_DROPPARTY:
-                       if (!test_bit(ATM_VF_SESSION, &vcc->flags))
-                               return -EINVAL;
-                       if (copy_from_user(&ep_ref, (void __user *) arg, sizeof(int)))
+                       error = svc_addparty(sock, (struct sockaddr *) &sa, sizeof(sa), 0);
+                       break;
+               case ATM_DROPPARTY:
+                       if (!test_bit(ATM_VF_SESSION, &vcc->flags))
+                               return -EINVAL;
+                       if (copy_from_user(&ep_ref, (void __user *) arg, sizeof(int)))
                                return -EFAULT;
-                       error = svc_dropparty(sock, ep_ref);
-                       break;
-               default:
+                       error = svc_dropparty(sock, ep_ref);
+                       break;
+               default:
                        error = vcc_ioctl(sock, cmd, arg);
        }
 
index 42233df2b09939ea835016f0050e68a90c4eaf26..1c07c6a50eb82eff90cfa88a209a979ce63307e8 100644 (file)
@@ -263,9 +263,9 @@ static void ax25_destroy_timer(unsigned long data)
 {
        ax25_cb *ax25=(ax25_cb *)data;
        struct sock *sk;
-       
+
        sk=ax25->sk;
-       
+
        bh_lock_sock(sk);
        sock_hold(sk);
        ax25_destroy_socket(ax25);
@@ -369,57 +369,57 @@ static int ax25_ctl_ioctl(const unsigned int cmd, void __user *arg)
                ax25_disconnect(ax25, ENETRESET);
                break;
 
-       case AX25_WINDOW:
-               if (ax25->modulus == AX25_MODULUS) {
-                       if (ax25_ctl.arg < 1 || ax25_ctl.arg > 7)
-                               return -EINVAL;
-               } else {
-                       if (ax25_ctl.arg < 1 || ax25_ctl.arg > 63)
-                               return -EINVAL;
-               }
-               ax25->window = ax25_ctl.arg;
-               break;
-
-       case AX25_T1:
+       case AX25_WINDOW:
+               if (ax25->modulus == AX25_MODULUS) {
+                       if (ax25_ctl.arg < 1 || ax25_ctl.arg > 7)
+                               return -EINVAL;
+               } else {
+                       if (ax25_ctl.arg < 1 || ax25_ctl.arg > 63)
+                               return -EINVAL;
+               }
+               ax25->window = ax25_ctl.arg;
+               break;
+
+       case AX25_T1:
                if (ax25_ctl.arg < 1)
-                       return -EINVAL;
-               ax25->rtt = (ax25_ctl.arg * HZ) / 2;
-               ax25->t1  = ax25_ctl.arg * HZ;
-               break;
-
-       case AX25_T2:
-               if (ax25_ctl.arg < 1)
-                       return -EINVAL;
-               ax25->t2 = ax25_ctl.arg * HZ;
-               break;
-
-       case AX25_N2:
-               if (ax25_ctl.arg < 1 || ax25_ctl.arg > 31)
                        return -EINVAL;
-               ax25->n2count = 0;
-               ax25->n2 = ax25_ctl.arg;
-               break;
-
-       case AX25_T3:
-               if (ax25_ctl.arg < 0)
-                       return -EINVAL;
-               ax25->t3 = ax25_ctl.arg * HZ;
-               break;
-
-       case AX25_IDLE:
-               if (ax25_ctl.arg < 0)
-                       return -EINVAL;
-               ax25->idle = ax25_ctl.arg * 60 * HZ;
-               break;
-
-       case AX25_PACLEN:
-               if (ax25_ctl.arg < 16 || ax25_ctl.arg > 65535)
-                       return -EINVAL;
-               ax25->paclen = ax25_ctl.arg;
-               break;
-
-       default:
-               return -EINVAL;
+               ax25->rtt = (ax25_ctl.arg * HZ) / 2;
+               ax25->t1  = ax25_ctl.arg * HZ;
+               break;
+
+       case AX25_T2:
+               if (ax25_ctl.arg < 1)
+                       return -EINVAL;
+               ax25->t2 = ax25_ctl.arg * HZ;
+               break;
+
+       case AX25_N2:
+               if (ax25_ctl.arg < 1 || ax25_ctl.arg > 31)
+                       return -EINVAL;
+               ax25->n2count = 0;
+               ax25->n2 = ax25_ctl.arg;
+               break;
+
+       case AX25_T3:
+               if (ax25_ctl.arg < 0)
+                       return -EINVAL;
+               ax25->t3 = ax25_ctl.arg * HZ;
+               break;
+
+       case AX25_IDLE:
+               if (ax25_ctl.arg < 0)
+                       return -EINVAL;
+               ax25->idle = ax25_ctl.arg * 60 * HZ;
+               break;
+
+       case AX25_PACLEN:
+               if (ax25_ctl.arg < 16 || ax25_ctl.arg > 65535)
+                       return -EINVAL;
+               ax25->paclen = ax25_ctl.arg;
+               break;
+
+       default:
+               return -EINVAL;
          }
 
        return 0;
@@ -1209,7 +1209,7 @@ static int __must_check ax25_connect(struct socket *sock,
 
        if (sk->sk_type == SOCK_SEQPACKET &&
            (ax25t=ax25_find_cb(&ax25->source_addr, &fsa->fsa_ax25.sax25_call, digi,
-                        ax25->ax25_dev->dev))) {
+                        ax25->ax25_dev->dev))) {
                kfree(digi);
                err = -EADDRINUSE;              /* Already such a connection */
                ax25_cb_put(ax25t);
@@ -1456,7 +1456,7 @@ static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock,
                err = -EMSGSIZE;
                goto out;
        }
-               
+
        if (usax != NULL) {
                if (usax->sax25_family != AF_AX25) {
                        err = -EINVAL;
@@ -1470,8 +1470,8 @@ static int ax25_sendmsg(struct kiocb *iocb, struct socket *sock,
                else if (addr_len != sizeof(struct full_sockaddr_ax25)) {
                        /* support for old structure may go away some time */
                        if ((addr_len < sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 6) ||
-                           (addr_len > sizeof(struct full_sockaddr_ax25))) {
-                               err = -EINVAL;
+                           (addr_len > sizeof(struct full_sockaddr_ax25))) {
+                               err = -EINVAL;
                                goto out;
                        }
 
@@ -1624,7 +1624,7 @@ static int ax25_recvmsg(struct kiocb *iocb, struct socket *sock,
 
        /* Now we can treat all alike */
        skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
-                               flags & MSG_DONTWAIT, &err);
+                               flags & MSG_DONTWAIT, &err);
        if (skb == NULL)
                goto out;
 
@@ -1869,7 +1869,7 @@ static void *ax25_info_next(struct seq_file *seq, void *v, loff_t *pos)
        return hlist_entry( ((struct ax25_cb *)v)->ax25_node.next,
                            struct ax25_cb, ax25_node);
 }
-       
+
 static void ax25_info_stop(struct seq_file *seq, void *v)
 {
        spin_unlock_bh(&ax25_list_lock);
@@ -1938,7 +1938,7 @@ static int ax25_info_open(struct inode *inode, struct file *file)
        return seq_open(file, &ax25_info_seqops);
 }
 
-static struct file_operations ax25_info_fops = {
+static const struct file_operations ax25_info_fops = {
        .owner = THIS_MODULE,
        .open = ax25_info_open,
        .read = seq_read,
index 97a49c79c6050df6caf43543caaff4d8bd07b3fc..7e7964dd987bc99a311084c285ea27e225082b57 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/in.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
@@ -126,10 +125,10 @@ int ax25cmp(const ax25_address *a, const ax25_address *b)
                ct++;
        }
 
-       if ((a->ax25_call[ct] & 0x1E) == (b->ax25_call[ct] & 0x1E))     /* SSID without control bit */
-               return 0;
+       if ((a->ax25_call[ct] & 0x1E) == (b->ax25_call[ct] & 0x1E))     /* SSID without control bit */
+               return 0;
 
-       return 2;                       /* Partial match */
+       return 2;                       /* Partial match */
 }
 
 EXPORT_SYMBOL(ax25cmp);
index b787678220fff4d6df193d720208fa67ed981b0f..528c874d9828df06f6d2c880b808d31da4164041 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
index edcaa897027cc031861b6d6bc66c5720a2c25b55..e37d217a986a6bc0de5ab3aa05f7d0c96014b96b 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
index 4d22d4430ec8a85128484685c4886ca4adc73cfa..9569dd3fa466e0e0e275b01bc10a2013edb47eda 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
index aff3e652c2d110ad55448ae2e41dd15fcac5affc..16be0c14780a18415bf203f617b8cb1c4cdb0808 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/in.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/spinlock.h>
 #include <linux/timer.h>
 #include <linux/string.h>
index e9d94291581ea1a67d53f39989ed26aef5fd0320..4a6b26becadc67fb3cd6da9ca307d1708526a228 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
index 136c3aefa9dec10983d1543c4cead6a876675019..7f818bbcd1c5e1a7030057453545b4d120c60216 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/in.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
@@ -55,46 +54,46 @@ int ax25_hard_header(struct sk_buff *skb, struct net_device *dev, unsigned short
        if (type == ETH_P_AX25)
                return 0;
 
-       /* header is an AX.25 UI frame from us to them */
-       buff = skb_push(skb, AX25_HEADER_LEN);
-       *buff++ = 0x00; /* KISS DATA */
+       /* header is an AX.25 UI frame from us to them */
+       buff = skb_push(skb, AX25_HEADER_LEN);
+       *buff++ = 0x00; /* KISS DATA */
 
        if (daddr != NULL)
                memcpy(buff, daddr, dev->addr_len);     /* Address specified */
 
-       buff[6] &= ~AX25_CBIT;
-       buff[6] &= ~AX25_EBIT;
-       buff[6] |= AX25_SSSID_SPARE;
-       buff    += AX25_ADDR_LEN;
-
-       if (saddr != NULL)
-               memcpy(buff, saddr, dev->addr_len);
-       else
-               memcpy(buff, dev->dev_addr, dev->addr_len);
-
-       buff[6] &= ~AX25_CBIT;
-       buff[6] |= AX25_EBIT;
-       buff[6] |= AX25_SSSID_SPARE;
-       buff    += AX25_ADDR_LEN;
-
-       *buff++  = AX25_UI;     /* UI */
-
-       /* Append a suitable AX.25 PID */
-       switch (type) {
-       case ETH_P_IP:
-               *buff++ = AX25_P_IP;
-               break;
-       case ETH_P_ARP:
-               *buff++ = AX25_P_ARP;
-               break;
-       default:
-               printk(KERN_ERR "AX.25: ax25_hard_header - wrong protocol type 0x%2.2x\n", type);
-               *buff++ = 0;
-               break;
-       }
+       buff[6] &= ~AX25_CBIT;
+       buff[6] &= ~AX25_EBIT;
+       buff[6] |= AX25_SSSID_SPARE;
+       buff    += AX25_ADDR_LEN;
+
+       if (saddr != NULL)
+               memcpy(buff, saddr, dev->addr_len);
+       else
+               memcpy(buff, dev->dev_addr, dev->addr_len);
+
+       buff[6] &= ~AX25_CBIT;
+       buff[6] |= AX25_EBIT;
+       buff[6] |= AX25_SSSID_SPARE;
+       buff    += AX25_ADDR_LEN;
+
+       *buff++  = AX25_UI;     /* UI */
+
+       /* Append a suitable AX.25 PID */
+       switch (type) {
+       case ETH_P_IP:
+               *buff++ = AX25_P_IP;
+               break;
+       case ETH_P_ARP:
+               *buff++ = AX25_P_ARP;
+               break;
+       default:
+               printk(KERN_ERR "AX.25: ax25_hard_header - wrong protocol type 0x%2.2x\n", type);
+               *buff++ = 0;
+               break;
+       }
 
        if (daddr != NULL)
-               return AX25_HEADER_LEN;
+               return AX25_HEADER_LEN;
 
        return -AX25_HEADER_LEN;        /* Unfinished header */
 }
@@ -114,8 +113,8 @@ int ax25_rebuild_header(struct sk_buff *skb)
        dst = (ax25_address *)(bp + 1);
        src = (ax25_address *)(bp + 8);
 
-       if (arp_find(bp + 1, skb))
-               return 1;
+       if (arp_find(bp + 1, skb))
+               return 1;
 
        route = ax25_get_route(dst, NULL);
        if (route) {
@@ -127,8 +126,8 @@ int ax25_rebuild_header(struct sk_buff *skb)
        if (dev == NULL)
                dev = skb->dev;
 
-        if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL) {
-                goto put;
+       if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL) {
+               goto put;
        }
 
        if (bp[16] == AX25_P_IP) {
@@ -175,8 +174,8 @@ int ax25_rebuild_header(struct sk_buff *skb)
                        ourskb->nh.raw = ourskb->data;
 
                        ax25=ax25_send_frame(
-                           ourskb, 
-                           ax25_dev->values[AX25_VALUES_PACLEN], 
+                           ourskb,
+                           ax25_dev->values[AX25_VALUES_PACLEN],
                            &src_c,
                            &dst_c, digipeat, dev);
                        if (ax25) {
@@ -186,13 +185,13 @@ int ax25_rebuild_header(struct sk_buff *skb)
                }
        }
 
-       bp[7]  &= ~AX25_CBIT;
-       bp[7]  &= ~AX25_EBIT;
-       bp[7]  |= AX25_SSSID_SPARE;
+       bp[7]  &= ~AX25_CBIT;
+       bp[7]  &= ~AX25_EBIT;
+       bp[7]  |= AX25_SSSID_SPARE;
 
-       bp[14] &= ~AX25_CBIT;
-       bp[14] |= AX25_EBIT;
-       bp[14] |= AX25_SSSID_SPARE;
+       bp[14] &= ~AX25_CBIT;
+       bp[14] |= AX25_EBIT;
+       bp[14] |= AX25_SSSID_SPARE;
 
        skb_pull(skb, AX25_KISS_HEADER_LEN);
 
@@ -211,7 +210,7 @@ put:
        if (route)
                ax25_put_route(route);
 
-       return 1;
+       return 1;
 }
 
 #else  /* INET */
index f84047d1e8ce1760f35ae81e3b24c1e3448f1be4..223835092b7afe743ca7d1050e9fe473457652b6 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/in.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
index 0a0381622b1cb16ce7d630ae8c18d54938a8c3b2..d65b8e22868d9a4c5e1f7a47ddbbfa3cc21080d9 100644 (file)
@@ -87,7 +87,7 @@ static int __must_check ax25_rt_add(struct ax25_routes_struct *route)
        ax25_rt = ax25_route_list;
        while (ax25_rt != NULL) {
                if (ax25cmp(&ax25_rt->callsign, &route->dest_addr) == 0 &&
-                           ax25_rt->dev == ax25_dev->dev) {
+                           ax25_rt->dev == ax25_dev->dev) {
                        kfree(ax25_rt->digipeat);
                        ax25_rt->digipeat = NULL;
                        if (route->digi_count != 0) {
@@ -252,8 +252,8 @@ static void *ax25_rt_seq_start(struct seq_file *seq, loff_t *pos)
 {
        struct ax25_route *ax25_rt;
        int i = 1;
-       read_lock(&ax25_route_lock);
+
+       read_lock(&ax25_route_lock);
        if (*pos == 0)
                return SEQ_START_TOKEN;
 
@@ -269,7 +269,7 @@ static void *ax25_rt_seq_start(struct seq_file *seq, loff_t *pos)
 static void *ax25_rt_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        ++*pos;
-       return (v == SEQ_START_TOKEN) ? ax25_route_list : 
+       return (v == SEQ_START_TOKEN) ? ax25_route_list :
                ((struct ax25_route *) v)->next;
 }
 
@@ -332,7 +332,7 @@ static int ax25_rt_info_open(struct inode *inode, struct file *file)
        return seq_open(file, &ax25_rt_seqops);
 }
 
-struct file_operations ax25_route_fops = {
+const struct file_operations ax25_route_fops = {
        .owner = THIS_MODULE,
        .open = ax25_rt_info_open,
        .read = seq_read,
index f6ed283e9de82fb2baee56e73580f5bc117fb5f4..a8eef88d86529d510e857e568c34be681d80bcfd 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
index 2b3c801ae48684716f58e4bc489e9bcb4f68375b..277f81bb979a6f0dc0d19b754a0f7e356753f7c7 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
index a29c480a4dc1f992f7f339c44f4b3d0ca9184526..f2f6918ac9bb69cae0c93f084b5955aed97f460c 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
@@ -34,7 +33,7 @@
 void ax25_std_heartbeat_expiry(ax25_cb *ax25)
 {
        struct sock *sk=ax25->sk;
-       
+
        if (sk)
                bh_lock_sock(sk);
 
index c41dbe5fadee53867d98e24967ce96f942a32c18..b6c577e3c9140a6b216f23b267b2338a22d3632c 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
@@ -56,7 +55,7 @@ void ax25_frames_acked(ax25_cb *ax25, unsigned short nr)
         */
        if (ax25->va != nr) {
                while (skb_peek(&ax25->ack_queue) != NULL && ax25->va != nr) {
-                       skb = skb_dequeue(&ax25->ack_queue);
+                       skb = skb_dequeue(&ax25->ack_queue);
                        kfree_skb(skb);
                        ax25->va = (ax25->va + 1) % ax25->modulus;
                }
@@ -65,7 +64,7 @@ void ax25_frames_acked(ax25_cb *ax25, unsigned short nr)
 
 void ax25_requeue_frames(ax25_cb *ax25)
 {
-        struct sk_buff *skb, *skb_prev = NULL;
+       struct sk_buff *skb, *skb_prev = NULL;
 
        /*
         * Requeue all the un-ack-ed frames on the output queue to be picked
index 5e9a81e8b214fe4fa96a7977be12c1fbe9378a05..75c76647b2cbdf62d0d76948d4558ec272d41cfa 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
@@ -164,7 +163,7 @@ static void *ax25_uid_seq_next(struct seq_file *seq, void *v, loff_t *pos)
        ++*pos;
 
        return hlist_entry(((ax25_uid_assoc *)v)->uid_node.next,
-                          ax25_uid_assoc, uid_node);
+                          ax25_uid_assoc, uid_node);
 }
 
 static void ax25_uid_seq_stop(struct seq_file *seq, void *v)
@@ -198,7 +197,7 @@ static int ax25_uid_info_open(struct inode *inode, struct file *file)
        return seq_open(file, &ax25_uid_seqops);
 }
 
-struct file_operations ax25_uid_fops = {
+const struct file_operations ax25_uid_fops = {
        .owner = THIS_MODULE,
        .open = ax25_uid_info_open,
        .read = seq_read,
index d23a27f25d2fd63c94568482c07a3696b607c3ca..443a8367663807c4265e002268b88e9be0acf221 100644 (file)
@@ -245,7 +245,7 @@ void ax25_register_sysctl(void)
 
        ax25_dir_table[0].child = ax25_table;
 
-       ax25_table_header = register_sysctl_table(ax25_root_table, 1);
+       ax25_table_header = register_sysctl_table(ax25_root_table);
 }
 
 void ax25_unregister_sysctl(void)
index 67df99e2e5c82b2a4fc72e28dc748a33209fcd55..c7228cfc6218b031e17a5f2779595ea365499ce4 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    BlueZ - Bluetooth protocol stack for Linux
    Copyright (C) 2000-2001 Qualcomm Incorporated
 
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
@@ -119,7 +119,7 @@ static int bt_sock_create(struct socket *sock, int proto)
 
        read_unlock(&bt_proto_lock);
 
-       return err; 
+       return err;
 }
 
 void bt_sock_link(struct bt_sock_list *l, struct sock *sk)
@@ -265,7 +265,7 @@ unsigned int bt_sock_poll(struct file * file, struct socket *sock, poll_table *w
        if (sk->sk_shutdown == SHUTDOWN_MASK)
                mask |= POLLHUP;
 
-       if (!skb_queue_empty(&sk->sk_receive_queue) || 
+       if (!skb_queue_empty(&sk->sk_receive_queue) ||
                        (sk->sk_shutdown & RCV_SHUTDOWN))
                mask |= POLLIN | POLLRDNORM;
 
index 0b6cd0e2528d4eb64e2f35addbd5869fc619a925..a2992280c3d1ee3a5b908faf793a18b6b4f16e5c 100644 (file)
@@ -1,7 +1,7 @@
 /*
   BNEP protocol definition for Linux Bluetooth stack (BlueZ).
   Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.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.
@@ -60,7 +60,7 @@
 // Extension types
 #define BNEP_EXT_CONTROL           0x00
 
-// Response messages 
+// Response messages
 #define BNEP_SUCCESS               0x00
 
 #define BNEP_CONN_INVALID_DST      0x01
@@ -81,7 +81,7 @@
 #define BNEP_CONNECT_TO  15
 #define BNEP_FILTER_TO   15
 
-// Headers 
+// Headers
 #define BNEP_TYPE_MASK  0x7f
 #define BNEP_EXT_HEADER         0x80
 
@@ -132,7 +132,7 @@ struct bnep_conndel_req {
 struct bnep_conninfo {
        __u32 flags;
        __u16 role;
-       __u16 state;    
+       __u16 state;
        __u8  dst[ETH_ALEN];
        char  device[16];
 };
@@ -155,10 +155,10 @@ int bnep_get_conninfo(struct bnep_conninfo *ci);
 // BNEP sessions
 struct bnep_session {
        struct list_head list;
-       
+
        unsigned int  role;
-        unsigned long state;
-        unsigned long flags;
+       unsigned long state;
+       unsigned long flags;
        atomic_t      killed;
 
        struct ethhdr eh;
@@ -166,7 +166,7 @@ struct bnep_session {
 
        struct bnep_proto_filter proto_filter[BNEP_MAX_PROTO_FILTERS];
        u64    mc_filter;
-       
+
        struct socket    *sock;
        struct net_device *dev;
        struct net_device_stats stats;
@@ -178,7 +178,7 @@ int bnep_sock_cleanup(void);
 
 static inline int bnep_mc_hash(__u8 *addr)
 {
-        return (crc32_be(~0, addr, ETH_ALEN) >> 26);
+       return (crc32_be(~0, addr, ETH_ALEN) >> 26);
 }
 
 #endif
index 7ba6470dc507224815c72d44d09f3da14e8e6c46..b85d1492c357795344c4e960633bbc84a5fdeffe 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    BNEP implementation for Linux Bluetooth stack (BlueZ).
    Copyright (C) 2001-2002 Inventel Systemes
    Written 2001-2002 by
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
 /*
  * $Id: core.c,v 1.20 2002/08/04 21:23:58 maxk Exp $
- */ 
+ */
 
 #include <linux/module.h>
 
@@ -74,7 +74,7 @@ static struct bnep_session *__bnep_get_session(u8 *dst)
        BT_DBG("");
 
        list_for_each(p, &bnep_session_list) {
-               s = list_entry(p, struct bnep_session, list);   
+               s = list_entry(p, struct bnep_session, list);
                if (!compare_ether_addr(dst, s->eh.h_source))
                        return s;
        }
@@ -87,7 +87,7 @@ static void __bnep_link_session(struct bnep_session *s)
           by the socket layer which has to hold the refference to this module.
         */
        __module_get(THIS_MODULE);
-       list_add(&s->list, &bnep_session_list); 
+       list_add(&s->list, &bnep_session_list);
 }
 
 static void __bnep_unlink_session(struct bnep_session *s)
@@ -203,7 +203,7 @@ static int bnep_ctrl_set_mcfilter(struct bnep_session *s, u8 *data, int len)
 
                        memcpy(a1, data, ETH_ALEN); data += ETH_ALEN;
                        a2 = data; data += ETH_ALEN;
-       
+
                        BT_DBG("mc filter %s -> %s",
                                batostr((void *) a1), batostr((void *) a2));
 
@@ -277,7 +277,7 @@ static int bnep_rx_extension(struct bnep_session *s, struct sk_buff *skb)
                }
 
                BT_DBG("type 0x%x len %d", h->type, h->len);
-       
+
                switch (h->type & BNEP_TYPE_MASK) {
                case BNEP_EXT_CONTROL:
                        bnep_rx_control(s, skb->data, skb->len);
@@ -293,7 +293,7 @@ static int bnep_rx_extension(struct bnep_session *s, struct sk_buff *skb)
                        break;
                }
        } while (!err && (h->type & BNEP_EXT_HEADER));
-       
+
        return err;
 }
 
@@ -319,7 +319,7 @@ static inline int bnep_rx_frame(struct bnep_session *s, struct sk_buff *skb)
 
        if ((type & BNEP_TYPE_MASK) > BNEP_RX_TYPES)
                goto badframe;
-       
+
        if ((type & BNEP_TYPE_MASK) == BNEP_CONTROL) {
                bnep_rx_control(s, skb->data, skb->len);
                kfree_skb(skb);
@@ -345,7 +345,7 @@ static inline int bnep_rx_frame(struct bnep_session *s, struct sk_buff *skb)
                        goto badframe;
                s->eh.h_proto = get_unaligned((__be16 *) (skb->data - 2));
        }
-       
+
        /* We have to alloc new skb and copy data here :(. Because original skb
         * may not be modified and because of the alignment requirements. */
        nskb = alloc_skb(2 + ETH_HLEN + skb->len, GFP_KERNEL);
@@ -361,7 +361,7 @@ static inline int bnep_rx_frame(struct bnep_session *s, struct sk_buff *skb)
        case BNEP_COMPRESSED:
                memcpy(__skb_put(nskb, ETH_HLEN), &s->eh, ETH_HLEN);
                break;
-       
+
        case BNEP_COMPRESSED_SRC_ONLY:
                memcpy(__skb_put(nskb, ETH_ALEN), s->eh.h_dest, ETH_ALEN);
                memcpy(__skb_put(nskb, ETH_ALEN), skb->mac.raw, ETH_ALEN);
@@ -381,7 +381,7 @@ static inline int bnep_rx_frame(struct bnep_session *s, struct sk_buff *skb)
 
        memcpy(__skb_put(nskb, skb->len), skb->data, skb->len);
        kfree_skb(skb);
-       
+
        s->stats.rx_packets++;
        nskb->dev       = dev;
        nskb->ip_summed = CHECKSUM_NONE;
@@ -435,7 +435,7 @@ static inline int bnep_tx_frame(struct bnep_session *s, struct sk_buff *skb)
                iv[il++] = (struct kvec) { eh->h_source, ETH_ALEN };
                len += ETH_ALEN;
                break;
-               
+
        case BNEP_COMPRESSED_DST_ONLY:
                iv[il++] = (struct kvec) { eh->h_dest, ETH_ALEN };
                len += ETH_ALEN;
@@ -445,7 +445,7 @@ static inline int bnep_tx_frame(struct bnep_session *s, struct sk_buff *skb)
 send:
        iv[il++] = (struct kvec) { skb->data, skb->len };
        len += skb->len;
-       
+
        /* FIXME: linearize skb */
        {
                len = kernel_sendmsg(sock, &s->msg, iv, il, len);
@@ -471,7 +471,7 @@ static int bnep_session(void *arg)
 
        BT_DBG("");
 
-        daemonize("kbnepd %s", dev->name);
+       daemonize("kbnepd %s", dev->name);
        set_user_nice(current, -15);
        current->flags |= PF_NOFREEZE;
 
@@ -488,13 +488,13 @@ static int bnep_session(void *arg)
 
                if (sk->sk_state != BT_CONNECTED)
                        break;
-       
+
                // TX
                while ((skb = skb_dequeue(&sk->sk_write_queue)))
                        if (bnep_tx_frame(s, skb))
                                break;
                netif_wake_queue(dev);
-       
+
                schedule();
        }
        set_current_state(TASK_RUNNING);
@@ -573,7 +573,7 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock)
        s->sock  = sock;
        s->role  = req->role;
        s->state = BT_CONNECTED;
-       
+
        s->msg.msg_flags = MSG_NOSIGNAL;
 
 #ifdef CONFIG_BT_BNEP_MC_FILTER
@@ -594,7 +594,7 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock)
        }
 
        __bnep_link_session(s);
-       
+
        err = kernel_thread(bnep_session, s, CLONE_KERNEL);
        if (err < 0) {
                /* Session thread start failed, gotta cleanup. */
@@ -627,7 +627,7 @@ int bnep_del_connection(struct bnep_conndel_req *req)
                /* Wakeup user-space which is polling for socket errors.
                 * This is temporary hack untill we have shutdown in L2CAP */
                s->sock->sk->sk_err = EUNATCH;
-               
+
                /* Kill session thread */
                atomic_inc(&s->killed);
                wake_up_interruptible(s->sock->sk->sk_sleep);
@@ -661,7 +661,7 @@ int bnep_get_connlist(struct bnep_connlist_req *req)
                s = list_entry(p, struct bnep_session, list);
 
                __bnep_copy_ci(&ci, s);
-               
+
                if (copy_to_user(req->ci, &ci, sizeof(ci))) {
                        err = -EFAULT;
                        break;
@@ -696,7 +696,7 @@ int bnep_get_conninfo(struct bnep_conninfo *ci)
 }
 
 static int __init bnep_init(void)
-{      
+{
        char flt[50] = "";
 
        l2cap_load();
index 67a002a9751aa85865364c89b8b1e35043c4dfc8..9092816f58de1e589d3afe951e2fa3b94b7404a0 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    BNEP implementation for Linux Bluetooth stack (BlueZ).
    Copyright (C) 2001-2002 Inventel Systemes
    Written 2001-2002 by
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
 /*
  * $Id: netdev.c,v 1.8 2002/08/04 21:23:58 maxk Exp $
- */ 
+ */
 
 #include <linux/module.h>
 
@@ -94,7 +94,7 @@ static void bnep_net_set_mc_list(struct net_device *dev)
        r->type = BNEP_CONTROL;
        r->ctrl = BNEP_FILTER_MULTI_ADDR_SET;
 
-        if (dev->flags & (IFF_PROMISC | IFF_ALLMULTI)) {
+       if (dev->flags & (IFF_PROMISC | IFF_ALLMULTI)) {
                u8 start[ETH_ALEN] = { 0x01 };
 
                /* Request all addresses */
@@ -102,14 +102,14 @@ static void bnep_net_set_mc_list(struct net_device *dev)
                memcpy(__skb_put(skb, ETH_ALEN), dev->broadcast, ETH_ALEN);
                r->len = htons(ETH_ALEN * 2);
        } else {
-                struct dev_mc_list *dmi = dev->mc_list;
+               struct dev_mc_list *dmi = dev->mc_list;
                int i, len = skb->len;
 
                if (dev->flags & IFF_BROADCAST) {
                        memcpy(__skb_put(skb, ETH_ALEN), dev->broadcast, ETH_ALEN);
                        memcpy(__skb_put(skb, ETH_ALEN), dev->broadcast, ETH_ALEN);
-               }       
-               
+               }
+
                /* FIXME: We should group addresses here. */
 
                for (i = 0; i < dev->mc_count && i < BNEP_MAX_MULTICAST_FILTERS; i++) {
@@ -159,13 +159,13 @@ static inline u16 bnep_net_eth_proto(struct sk_buff *skb)
 {
        struct ethhdr *eh = (void *) skb->data;
        u16 proto = ntohs(eh->h_proto);
-       
+
        if (proto >= 1536)
                return proto;
-               
+
        if (get_unaligned((__be16 *) skb->data) == htons(0xFFFF))
                return ETH_P_802_3;
-               
+
        return ETH_P_802_2;
 }
 
@@ -174,7 +174,7 @@ static inline int bnep_net_proto_filter(struct sk_buff *skb, struct bnep_session
        u16 proto = bnep_net_eth_proto(skb);
        struct bnep_proto_filter *f = s->proto_filter;
        int i;
-       
+
        for (i = 0; i < BNEP_MAX_PROTO_FILTERS && f[i].end; i++) {
                if (proto >= f[i].start && proto <= f[i].end)
                        return 0;
@@ -198,14 +198,14 @@ static int bnep_net_xmit(struct sk_buff *skb, struct net_device *dev)
                return 0;
        }
 #endif
-       
+
 #ifdef CONFIG_BT_BNEP_PROTO_FILTER
        if (bnep_net_proto_filter(skb, s)) {
                kfree_skb(skb);
                return 0;
        }
 #endif
-       
+
        /*
         * We cannot send L2CAP packets from here as we are potentially in a bh.
         * So we have to queue them and wake up session thread which is sleeping
index 5563db1bf526e94d4a48c5af511315c4d3646786..10292e77604612f371e0e26d9b59d446f4897b34 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    BNEP implementation for Linux Bluetooth stack (BlueZ).
    Copyright (C) 2001-2002 Inventel Systemes
    Written 2001-2002 by
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
 /*
  * $Id: sock.c,v 1.4 2002/08/04 21:23:58 maxk Exp $
- */ 
+ */
 
 #include <linux/module.h>
 
@@ -34,7 +34,6 @@
 #include <linux/capability.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
 #include <linux/fcntl.h>
@@ -89,7 +88,7 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
 
                if (copy_from_user(&ca, argp, sizeof(ca)))
                        return -EFAULT;
-       
+
                nsock = sockfd_lookup(ca.sock, &err);
                if (!nsock)
                        return err;
@@ -101,20 +100,20 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
 
                err = bnep_add_connection(&ca, nsock);
                if (!err) {
-                       if (copy_to_user(argp, &ca, sizeof(ca)))
+                       if (copy_to_user(argp, &ca, sizeof(ca)))
                                err = -EFAULT;
                } else
                        fput(nsock->file);
 
                return err;
-       
+
        case BNEPCONNDEL:
                if (!capable(CAP_NET_ADMIN))
                        return -EACCES;
 
                if (copy_from_user(&cd, argp, sizeof(cd)))
                        return -EFAULT;
-       
+
                return bnep_del_connection(&cd);
 
        case BNEPGETCONNLIST:
@@ -123,7 +122,7 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
 
                if (cl.cnum <= 0)
                        return -EINVAL;
-       
+
                err = bnep_get_connlist(&cl);
                if (!err && copy_to_user(argp, &cl, sizeof(cl)))
                        return -EFAULT;
@@ -163,7 +162,7 @@ static int bnep_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne
 
                if (cl.cnum <= 0)
                        return -EINVAL;
-       
+
                err = bnep_get_connlist(&cl);
 
                if (!err && put_user(cl.cnum, (uint32_t __user *) arg))
index ab166b48ce8dc02c8288b44d21d4d9c5ce7b2d22..3e9d5bb3fefb6de364353c62684efd5b7629e9d4 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    CMTP implementation for Linux Bluetooth stack (BlueZ).
    Copyright (C) 2002-2003 Marcel Holtmann <marcel@holtmann.org>
 
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
@@ -563,7 +563,7 @@ int cmtp_attach_device(struct cmtp_session *session)
 
        ret = wait_event_interruptible_timeout(session->wait,
                        session->ncontroller, CMTP_INTEROP_TIMEOUT);
-       
+
        BT_INFO("Found %d CAPI controller(s) on device %s", session->ncontroller, session->name);
 
        if (!ret)
index 40e3dfec0cc8677c5141ee337c8b67da9dce8d0d..e4663aa14d264830d528c8fdc109ff3381da5e59 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    CMTP implementation for Linux Bluetooth stack (BlueZ).
    Copyright (C) 2002-2003 Marcel Holtmann <marcel@holtmann.org>
 
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
index b81a01c64aeae8b35e601aec9029a98f4c1ecc86..3933608a92965b3c5cf9459d9cdabad557302312 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    CMTP implementation for Linux Bluetooth stack (BlueZ).
    Copyright (C) 2002-2003 Marcel Holtmann <marcel@holtmann.org>
 
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
@@ -336,7 +336,7 @@ int cmtp_add_connection(struct cmtp_connadd_req *req, struct socket *sock)
        baswap(&dst, &bt_sk(sock->sk)->dst);
 
        session = kzalloc(sizeof(struct cmtp_session), GFP_KERNEL);
-       if (!session) 
+       if (!session)
                return -ENOMEM;
 
        down_write(&cmtp_session_sem);
index 53295d33dc5c31eb610c1766e5795f3c7a123cfd..19be7861e51ead07db64e1fafb06956cc425e0d1 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    CMTP implementation for Linux Bluetooth stack (BlueZ).
    Copyright (C) 2002-2003 Marcel Holtmann <marcel@holtmann.org>
 
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
@@ -26,7 +26,6 @@
 #include <linux/capability.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
 #include <linux/fcntl.h>
@@ -154,7 +153,7 @@ static int cmtp_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne
 
                if (cl.cnum <= 0)
                        return -EINVAL;
-       
+
                err = cmtp_get_connlist(&cl);
 
                if (!err && put_user(cl.cnum, (uint32_t __user *) arg))
index 6cd5711fa28a59265403a81f608e6698e7f03dfa..f3403fdb59f8e6f9c38338f25398024410d50dca 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    BlueZ - Bluetooth protocol stack for Linux
    Copyright (C) 2000-2001 Qualcomm Incorporated
 
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
@@ -29,7 +29,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
 #include <linux/fcntl.h>
@@ -146,7 +145,7 @@ static void hci_conn_timeout(unsigned long arg)
        case BT_CONNECT:
                hci_acl_connect_cancel(conn);
                break;
-       case BT_CONNECTED:
+       case BT_CONNECTED:
                hci_acl_disconn(conn, 0x13);
                break;
        default:
@@ -272,7 +271,7 @@ struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src)
                if (!test_bit(HCI_UP, &d->flags) || test_bit(HCI_RAW, &d->flags))
                        continue;
 
-               /* Simple routing: 
+               /* Simple routing:
                 *   No source address - find interface with bdaddr != dst
                 *   Source address    - find interface with bdaddr == src
                 */
@@ -328,7 +327,7 @@ struct hci_conn * hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst)
 
                hci_conn_hold(sco);
 
-               if (acl->state == BT_CONNECTED && 
+               if (acl->state == BT_CONNECTED &&
                                (sco->state == BT_OPEN || sco->state == BT_CLOSED))
                        hci_add_sco(sco, acl->handle);
 
@@ -370,7 +369,7 @@ int hci_conn_encrypt(struct hci_conn *conn)
        if (hci_conn_auth(conn)) {
                struct hci_cp_set_conn_encrypt cp;
                cp.handle  = __cpu_to_le16(conn->handle);
-               cp.encrypt = 1; 
+               cp.encrypt = 1;
                hci_send_cmd(conn->hdev, OGF_LINK_CTL, OCF_SET_CONN_ENCRYPT, sizeof(cp), &cp);
        }
        return 0;
index 338ae977a31b2209fb39e1a97d644db185d4597a..4917919d86a6b251ddb35027571c46c6add6fcb0 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    BlueZ - Bluetooth protocol stack for Linux
    Copyright (C) 2000-2001 Qualcomm Incorporated
 
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
@@ -116,7 +116,7 @@ static void hci_req_cancel(struct hci_dev *hdev, int err)
 }
 
 /* Execute request and wait for completion. */
-static int __hci_request(struct hci_dev *hdev, void (*req)(struct hci_dev *hdev, unsigned long opt), 
+static int __hci_request(struct hci_dev *hdev, void (*req)(struct hci_dev *hdev, unsigned long opt),
                                unsigned long opt, __u32 timeout)
 {
        DECLARE_WAITQUEUE(wait, current);
@@ -278,7 +278,7 @@ static void hci_encrypt_req(struct hci_dev *hdev, unsigned long opt)
        hci_send_cmd(hdev, OGF_HOST_CTL, OCF_WRITE_ENCRYPT_MODE, 1, &encrypt);
 }
 
-/* Get HCI device by index. 
+/* Get HCI device by index.
  * Device is held on return. */
 struct hci_dev *hci_dev_get(int index)
 {
@@ -405,7 +405,7 @@ int hci_inquiry(void __user *arg)
                return -ENODEV;
 
        hci_dev_lock_bh(hdev);
-       if (inquiry_cache_age(hdev) > INQUIRY_CACHE_AGE_MAX || 
+       if (inquiry_cache_age(hdev) > INQUIRY_CACHE_AGE_MAX ||
                                        inquiry_cache_empty(hdev) ||
                                        ir.flags & IREQ_CACHE_FLUSH) {
                inquiry_cache_flush(hdev);
@@ -439,7 +439,7 @@ int hci_inquiry(void __user *arg)
                if (copy_to_user(ptr, buf, sizeof(struct inquiry_info) *
                                        ir.num_rsp))
                        err = -EFAULT;
-       } else 
+       } else
                err = -EFAULT;
 
        kfree(buf);
@@ -491,7 +491,7 @@ int hci_dev_open(__u16 dev)
                hci_dev_hold(hdev);
                set_bit(HCI_UP, &hdev->flags);
                hci_notify(hdev, HCI_DEV_UP);
-       } else {        
+       } else {
                /* Init failed, cleanup */
                tasklet_kill(&hdev->rx_task);
                tasklet_kill(&hdev->tx_task);
@@ -619,7 +619,7 @@ int hci_dev_reset(__u16 dev)
        if (hdev->flush)
                hdev->flush(hdev);
 
-       atomic_set(&hdev->cmd_cnt, 1); 
+       atomic_set(&hdev->cmd_cnt, 1);
        hdev->acl_cnt = 0; hdev->sco_cnt = 0;
 
        if (!test_bit(HCI_RAW, &hdev->flags))
@@ -841,7 +841,7 @@ int hci_register_dev(struct hci_dev *hdev)
                        break;
                head = p; id++;
        }
-       
+
        sprintf(hdev->name, "hci%d", id);
        hdev->id = id;
        list_add(&hdev->list, head);
@@ -1109,7 +1109,7 @@ int hci_send_acl(struct hci_conn *conn, struct sk_buff *skb, __u16 flags)
                __skb_queue_tail(&conn->data_q, skb);
                do {
                        skb = list; list = list->next;
-                       
+
                        skb->dev = (void *) hdev;
                        bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT;
                        hci_add_acl_hdr(skb, conn->handle, flags | ACL_CONT);
@@ -1164,7 +1164,7 @@ static inline struct hci_conn *hci_low_sent(struct hci_dev *hdev, __u8 type, int
        int num = 0, min = ~0;
        struct list_head *p;
 
-       /* We don't have to lock device here. Connections are always 
+       /* We don't have to lock device here. Connections are always
         * added and removed with TX task disabled. */
        list_for_each(p, &h->list) {
                struct hci_conn *c;
@@ -1306,7 +1306,7 @@ static inline void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb)
        hci_dev_lock(hdev);
        conn = hci_conn_hash_lookup_handle(hdev, handle);
        hci_dev_unlock(hdev);
-       
+
        if (conn) {
                register struct hci_proto *hp;
 
@@ -1318,7 +1318,7 @@ static inline void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb)
                        return;
                }
        } else {
-               BT_ERR("%s ACL packet for unknown connection handle %d", 
+               BT_ERR("%s ACL packet for unknown connection handle %d",
                        hdev->name, handle);
        }
 
@@ -1353,7 +1353,7 @@ static inline void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb)
                        return;
                }
        } else {
-               BT_ERR("%s SCO packet for unknown connection handle %d", 
+               BT_ERR("%s SCO packet for unknown connection handle %d",
                        hdev->name, handle);
        }
 
index bb94e6da223cb6f3535f5fecd611e91d3c0c067f..936d3fc479cdd9d2029a729e1a6ba63b4a7ab11d 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    BlueZ - Bluetooth protocol stack for Linux
    Copyright (C) 2000-2001 Qualcomm Incorporated
 
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
@@ -29,7 +29,6 @@
 #include <linux/types.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
 #include <linux/fcntl.h>
@@ -100,7 +99,7 @@ static void hci_cc_link_policy(struct hci_dev *hdev, __u16 ocf, struct sk_buff *
        BT_DBG("%s ocf 0x%x", hdev->name, ocf);
 
        switch (ocf) {
-       case OCF_ROLE_DISCOVERY: 
+       case OCF_ROLE_DISCOVERY:
                rd = (void *) skb->data;
 
                if (rd->status)
@@ -141,7 +140,7 @@ static void hci_cc_link_policy(struct hci_dev *hdev, __u16 ocf, struct sk_buff *
                break;
 
        default:
-               BT_DBG("%s: Command complete: ogf LINK_POLICY ocf %x", 
+               BT_DBG("%s: Command complete: ogf LINK_POLICY ocf %x",
                                hdev->name, ocf);
                break;
        }
@@ -237,10 +236,10 @@ static void hci_cc_host_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb
                if (!status) {
                        clear_bit(HCI_PSCAN, &hdev->flags);
                        clear_bit(HCI_ISCAN, &hdev->flags);
-                       if (param & SCAN_INQUIRY) 
+                       if (param & SCAN_INQUIRY)
                                set_bit(HCI_ISCAN, &hdev->flags);
 
-                       if (param & SCAN_PAGE) 
+                       if (param & SCAN_PAGE)
                                set_bit(HCI_PSCAN, &hdev->flags);
                }
                hci_req_complete(hdev, status);
@@ -343,7 +342,7 @@ static void hci_cc_info_param(struct hci_dev *hdev, __u16 ocf, struct sk_buff *s
 
                memcpy(hdev->features, lf->features, sizeof(hdev->features));
 
-               /* Adjust default settings according to features 
+               /* Adjust default settings according to features
                 * supported by device. */
                if (hdev->features[0] & LMP_3SLOT)
                        hdev->pkt_type |= (HCI_DM3 | HCI_DH3);
@@ -491,7 +490,7 @@ static void hci_cs_link_ctl(struct hci_dev *hdev, __u16 ocf, __u8 status)
                break;
 
        default:
-               BT_DBG("%s Command status: ogf LINK_CTL ocf %x status %d", 
+               BT_DBG("%s Command status: ogf LINK_CTL ocf %x status %d",
                        hdev->name, ocf, status);
                break;
        }
@@ -793,7 +792,7 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s
                if (!conn->out) {
                        struct hci_cp_change_conn_ptype cp;
                        cp.handle = ev->handle;
-                       cp.pkt_type = (conn->type == ACL_LINK) ? 
+                       cp.pkt_type = (conn->type == ACL_LINK) ?
                                __cpu_to_le16(hdev->pkt_type & ACL_PTYPE_MASK):
                                __cpu_to_le16(hdev->pkt_type & SCO_PTYPE_MASK);
 
index dbf98c49dbaaa0edeaf3b37e38b595f4ba79a237..f928d2b2a17dac5c81a7660108e895b5640a1263 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    BlueZ - Bluetooth protocol stack for Linux
    Copyright (C) 2000-2001 Qualcomm Incorporated
 
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
@@ -30,7 +30,6 @@
 #include <linux/capability.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
 #include <linux/fcntl.h>
@@ -170,7 +169,7 @@ static int hci_sock_release(struct socket *sock)
        return 0;
 }
 
-/* Ioctls that require bound socket */ 
+/* Ioctls that require bound socket */
 static inline int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd, unsigned long arg)
 {
        struct hci_dev *hdev = hci_pi(sk)->hdev;
@@ -348,8 +347,8 @@ static inline void hci_sock_cmsg(struct sock *sk, struct msghdr *msg, struct sk_
                put_cmsg(msg, SOL_HCI, HCI_CMSG_TSTAMP, sizeof(tv), &tv);
        }
 }
-static int hci_sock_recvmsg(struct kiocb *iocb, struct socket *sock, 
+
+static int hci_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
                                struct msghdr *msg, size_t len, int flags)
 {
        int noblock = flags & MSG_DONTWAIT;
@@ -386,7 +385,7 @@ static int hci_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
        return err ? : copied;
 }
 
-static int hci_sock_sendmsg(struct kiocb *iocb, struct socket *sock, 
+static int hci_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
                            struct msghdr *msg, size_t len)
 {
        struct sock *sk = sock->sk;
@@ -520,7 +519,7 @@ static int hci_sock_setsockopt(struct socket *sock, int level, int optname, char
                        *((u32 *) f->event_mask + 0) = uf.event_mask[0];
                        *((u32 *) f->event_mask + 1) = uf.event_mask[1];
                }
-               break; 
+               break;
 
        default:
                err = -ENOPROTOOPT;
@@ -535,7 +534,7 @@ static int hci_sock_getsockopt(struct socket *sock, int level, int optname, char
 {
        struct hci_ufilter uf;
        struct sock *sk = sock->sk;
-       int len, opt; 
+       int len, opt;
 
        if (get_user(len, optlen))
                return -EFAULT;
@@ -544,7 +543,7 @@ static int hci_sock_getsockopt(struct socket *sock, int level, int optname, char
        case HCI_DATA_DIR:
                if (hci_pi(sk)->cmsg_mask & HCI_CMSG_DIR)
                        opt = 1;
-               else 
+               else
                        opt = 0;
 
                if (put_user(opt, optval))
@@ -554,7 +553,7 @@ static int hci_sock_getsockopt(struct socket *sock, int level, int optname, char
        case HCI_TIME_STAMP:
                if (hci_pi(sk)->cmsg_mask & HCI_CMSG_TSTAMP)
                        opt = 1;
-               else 
+               else
                        opt = 0;
 
                if (put_user(opt, optval))
index 66782010f82cbacf442eba7a2d6c64f17d8c0964..4b99c5e4478da77c099190daea614244ada030d3 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    HIDP implementation for Linux Bluetooth stack (BlueZ).
    Copyright (C) 2003-2004 Marcel Holtmann <marcel@holtmann.org>
 
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
@@ -293,7 +293,7 @@ static inline void hidp_process_handshake(struct hidp_session *session, unsigned
 
        case HIDP_HSHK_ERR_FATAL:
                /* Device requests a reboot, as this is the only way this error
-                * can be recovered. */
+                * can be recovered. */
                __hidp_send_ctrl_message(session,
                        HIDP_TRANS_HID_CONTROL | HIDP_CTRL_SOFT_RESET, NULL, 0);
                break;
index c8dfacd40a065fa58d408a0b62984f6589b660df..a326601c8f414473a2345404c783003355cdc9d8 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    HIDP implementation for Linux Bluetooth stack (BlueZ).
    Copyright (C) 2003-2004 Marcel Holtmann <marcel@holtmann.org>
 
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
index 93cf9e586178b5d2d1477dc80dd049e9ccd60ea3..8b8a6c1dbd9905534628f492f8d329e03d6f71ff 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    HIDP implementation for Linux Bluetooth stack (BlueZ).
    Copyright (C) 2003-2004 Marcel Holtmann <marcel@holtmann.org>
 
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
@@ -26,7 +26,6 @@
 #include <linux/capability.h>
 #include <linux/errno.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/poll.h>
 #include <linux/fcntl.h>
@@ -206,7 +205,7 @@ static int hidp_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne
                                put_user(ca.idle_to, &uca->idle_to) ||
                                copy_to_user(&uca->name[0], &ca.name[0], 128))
                        return -EFAULT;
-               
+
                arg = (unsigned long) uca;
 
                /* Fall through. We don't actually write back any _changes_
index f8c25d5001558dd777868454bd4d7681dd878039..e83ee82440d333ba8e4d9ec4f1c5b937baeff711 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    BlueZ - Bluetooth protocol stack for Linux
    Copyright (C) 2000-2001 Qualcomm Incorporated
 
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
@@ -227,7 +227,7 @@ static void __l2cap_chan_add(struct l2cap_conn *conn, struct sock *sk, struct so
                bt_accept_enqueue(parent, sk);
 }
 
-/* Delete channel. 
+/* Delete channel.
  * Must be called on the locked socket. */
 static void l2cap_chan_del(struct sock *sk, int err)
 {
@@ -238,7 +238,7 @@ static void l2cap_chan_del(struct sock *sk, int err)
 
        BT_DBG("sk %p, conn %p, err %d", sk, conn, err);
 
-       if (conn) { 
+       if (conn) {
                /* Unlink from channel list */
                l2cap_chan_unlink(&conn->chan_list, sk);
                l2cap_pi(sk)->conn = NULL;
@@ -590,7 +590,7 @@ static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_
                err = -EACCES;
                goto done;
        }
-               
+
        write_lock_bh(&l2cap_sk_list.lock);
 
        if (la->l2_psm && __l2cap_get_sock_by_addr(la->l2_psm, &la->l2_bdaddr)) {
@@ -890,7 +890,7 @@ static inline int l2cap_do_send(struct sock *sk, struct msghdr *msg, int len)
                *frag = bt_skb_send_alloc(sk, count, msg->msg_flags & MSG_DONTWAIT, &err);
                if (!*frag)
                        goto fail;
-               
+
                if (memcpy_fromiovec(skb_put(*frag, count), msg->msg_iov, count)) {
                        err = -EFAULT;
                        goto fail;
@@ -1267,7 +1267,7 @@ static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen, unsigned
 
 static inline void l2cap_parse_conf_req(struct sock *sk, void *data, int len)
 {
-       int type, hint, olen; 
+       int type, hint, olen;
        unsigned long val;
        void *ptr = data;
 
@@ -1414,7 +1414,7 @@ static inline int l2cap_connect_req(struct l2cap_conn *conn, struct l2cap_cmd_hd
 
        /* Check for backlog size */
        if (sk_acceptq_is_full(parent)) {
-               BT_DBG("backlog full %d", parent->sk_ack_backlog); 
+               BT_DBG("backlog full %d", parent->sk_ack_backlog);
                goto response;
        }
 
@@ -1607,7 +1607,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr
                        goto done;
                }
 
-       default: 
+       default:
                sk->sk_state = BT_DISCONN;
                sk->sk_err   = ECONNRESET;
                l2cap_sock_set_timer(sk, HZ * 5);
index e5fd0cb70ae9e42ffa851e8d62874532a1115324..ad2af5814e40163e0e21e4c82a5a760e9e404894 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    BlueZ - Bluetooth protocol stack for Linux
    Copyright (C) 2000-2001 Qualcomm Incorporated
 
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
index 278c8676906a3d345c00498256973b4b91533c57..94f45736056085a901c78f7208781e67d465602c 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    RFCOMM implementation for Linux Bluetooth stack (BlueZ).
    Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.com>
    Copyright (C) 2002 Marcel Holtmann <marcel@holtmann.org>
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
@@ -134,7 +134,7 @@ static inline void rfcomm_session_put(struct rfcomm_session *s)
 /* ---- RFCOMM FCS computation ---- */
 
 /* reversed, 8-bit, poly=0x07 */
-static unsigned char rfcomm_crc_table[256] = { 
+static unsigned char rfcomm_crc_table[256] = {
        0x00, 0x91, 0xe3, 0x72, 0x07, 0x96, 0xe4, 0x75,
        0x0e, 0x9f, 0xed, 0x7c, 0x09, 0x98, 0xea, 0x7b,
        0x1c, 0x8d, 0xff, 0x6e, 0x1b, 0x8a, 0xf8, 0x69,
@@ -179,13 +179,13 @@ static unsigned char rfcomm_crc_table[256] = {
 /* CRC on 2 bytes */
 #define __crc(data) (rfcomm_crc_table[rfcomm_crc_table[0xff ^ data[0]] ^ data[1]])
 
-/* FCS on 2 bytes */ 
+/* FCS on 2 bytes */
 static inline u8 __fcs(u8 *data)
 {
        return (0xff - __crc(data));
 }
 
-/* FCS on 3 bytes */ 
+/* FCS on 3 bytes */
 static inline u8 __fcs2(u8 *data)
 {
        return (0xff - rfcomm_crc_table[__crc(data) ^ data[2]]);
@@ -288,7 +288,7 @@ struct rfcomm_dlc *rfcomm_dlc_alloc(gfp_t prio)
        atomic_set(&d->refcnt, 1);
 
        rfcomm_dlc_clear_state(d);
-       
+
        BT_DBG("%p", d);
 
        return d;
@@ -345,7 +345,7 @@ static int __rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst,
        int err = 0;
        u8 dlci;
 
-       BT_DBG("dlc %p state %ld %s %s channel %d", 
+       BT_DBG("dlc %p state %ld %s %s channel %d",
                        d, d->state, batostr(src), batostr(dst), channel);
 
        if (channel < 1 || channel > 30)
@@ -489,21 +489,21 @@ void fastcall __rfcomm_dlc_unthrottle(struct rfcomm_dlc *d)
        rfcomm_schedule(RFCOMM_SCHED_TX);
 }
 
-/* 
+/*
    Set/get modem status functions use _local_ status i.e. what we report
    to the other side.
    Remote status is provided by dlc->modem_status() callback.
  */
 int rfcomm_dlc_set_modem_status(struct rfcomm_dlc *d, u8 v24_sig)
 {
-       BT_DBG("dlc %p state %ld v24_sig 0x%x", 
+       BT_DBG("dlc %p state %ld v24_sig 0x%x",
                        d, d->state, v24_sig);
 
        if (test_bit(RFCOMM_RX_THROTTLED, &d->flags))
                v24_sig |= RFCOMM_V24_FC;
        else
                v24_sig &= ~RFCOMM_V24_FC;
-       
+
        d->v24_sig = v24_sig;
 
        if (!test_and_set_bit(RFCOMM_MSC_PENDING, &d->flags))
@@ -514,7 +514,7 @@ int rfcomm_dlc_set_modem_status(struct rfcomm_dlc *d, u8 v24_sig)
 
 int rfcomm_dlc_get_modem_status(struct rfcomm_dlc *d, u8 *v24_sig)
 {
-       BT_DBG("dlc %p state %ld v24_sig 0x%x", 
+       BT_DBG("dlc %p state %ld v24_sig 0x%x",
                        d, d->state, d->v24_sig);
 
        *v24_sig = d->v24_sig;
@@ -576,7 +576,7 @@ static struct rfcomm_session *rfcomm_session_get(bdaddr_t *src, bdaddr_t *dst)
        struct bt_sock *sk;
        list_for_each_safe(p, n, &session_list) {
                s = list_entry(p, struct rfcomm_session, list);
-               sk = bt_sk(s->sock->sk); 
+               sk = bt_sk(s->sock->sk);
 
                if ((!bacmp(src, BDADDR_ANY) || !bacmp(&sk->src, src)) &&
                                !bacmp(&sk->dst, dst))
@@ -825,7 +825,7 @@ static int rfcomm_send_pn(struct rfcomm_session *s, int cr, struct rfcomm_dlc *d
 
 int rfcomm_send_rpn(struct rfcomm_session *s, int cr, u8 dlci,
                        u8 bit_rate, u8 data_bits, u8 stop_bits,
-                       u8 parity, u8 flow_ctrl_settings, 
+                       u8 parity, u8 flow_ctrl_settings,
                        u8 xon_char, u8 xoff_char, u16 param_mask)
 {
        struct rfcomm_hdr *hdr;
@@ -834,8 +834,8 @@ int rfcomm_send_rpn(struct rfcomm_session *s, int cr, u8 dlci,
        u8 buf[16], *ptr = buf;
 
        BT_DBG("%p cr %d dlci %d bit_r 0x%x data_b 0x%x stop_b 0x%x parity 0x%x"
-                       " flwc_s 0x%x xon_c 0x%x xoff_c 0x%x p_mask 0x%x", 
-               s, cr, dlci, bit_rate, data_bits, stop_bits, parity, 
+                       " flwc_s 0x%x xon_c 0x%x xoff_c 0x%x p_mask 0x%x",
+               s, cr, dlci, bit_rate, data_bits, stop_bits, parity,
                flow_ctrl_settings, xon_char, xoff_char, param_mask);
 
        hdr = (void *) ptr; ptr += sizeof(*hdr);
@@ -1120,9 +1120,9 @@ static int rfcomm_recv_disc(struct rfcomm_session *s, u8 dlci)
 
                        d->state = BT_CLOSED;
                        __rfcomm_dlc_close(d, err);
-               } else 
+               } else
                        rfcomm_send_dm(s, dlci);
-                       
+
        } else {
                rfcomm_send_ua(s, 0);
 
@@ -1230,7 +1230,7 @@ static int rfcomm_apply_pn(struct rfcomm_dlc *d, int cr, struct rfcomm_pn *pn)
 {
        struct rfcomm_session *s = d->session;
 
-       BT_DBG("dlc %p state %ld dlci %d mtu %d fc 0x%x credits %d", 
+       BT_DBG("dlc %p state %ld dlci %d mtu %d fc 0x%x credits %d",
                        d, d->state, d->dlci, pn->mtu, pn->flow_ctrl, pn->credits);
 
        if ((pn->flow_ctrl == 0xf0 && s->cfc != RFCOMM_CFC_DISABLED) ||
@@ -1454,7 +1454,7 @@ static int rfcomm_recv_msc(struct rfcomm_session *s, int cr, struct sk_buff *skb
                if (d->modem_status)
                        d->modem_status(d, msc->v24_sig);
                rfcomm_dlc_unlock(d);
-               
+
                rfcomm_send_msc(s, 0, dlci, msc->v24_sig);
 
                d->mscex |= RFCOMM_MSCEX_RX;
@@ -1641,18 +1641,18 @@ static inline int rfcomm_process_tx(struct rfcomm_dlc *d)
        struct sk_buff *skb;
        int err;
 
-       BT_DBG("dlc %p state %ld cfc %d rx_credits %d tx_credits %d", 
+       BT_DBG("dlc %p state %ld cfc %d rx_credits %d tx_credits %d",
                        d, d->state, d->cfc, d->rx_credits, d->tx_credits);
 
        /* Send pending MSC */
        if (test_and_clear_bit(RFCOMM_MSC_PENDING, &d->flags))
-               rfcomm_send_msc(d->session, 1, d->dlci, d->v24_sig); 
+               rfcomm_send_msc(d->session, 1, d->dlci, d->v24_sig);
 
        if (d->cfc) {
-               /* CFC enabled. 
+               /* CFC enabled.
                 * Give them some credits */
                if (!test_bit(RFCOMM_RX_THROTTLED, &d->flags) &&
-                               d->rx_credits <= (d->cfc >> 2)) {
+                               d->rx_credits <= (d->cfc >> 2)) {
                        rfcomm_send_credits(d->session, d->addr, d->cfc - d->rx_credits);
                        d->rx_credits = d->cfc;
                }
@@ -1876,7 +1876,7 @@ static int rfcomm_add_listener(bdaddr_t *ba)
 
        /* Create socket */
        err = rfcomm_l2sock_create(&sock);
-       if (err < 0) { 
+       if (err < 0) {
                BT_ERR("Create socket failed %d", err);
                return err;
        }
index cb7e855f0828619fdc34095786f86d23a3d0532e..30586ab9e8783cad490916c367b1099a14103a85 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    RFCOMM implementation for Linux Bluetooth stack (BlueZ).
    Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.com>
    Copyright (C) 2002 Marcel Holtmann <marcel@holtmann.org>
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
@@ -130,7 +130,7 @@ static struct sock *__rfcomm_get_sock_by_addr(u8 channel, bdaddr_t *src)
        struct hlist_node *node;
 
        sk_for_each(sk, node, &rfcomm_sk_list.head) {
-               if (rfcomm_pi(sk)->channel == channel && 
+               if (rfcomm_pi(sk)->channel == channel &&
                                !bacmp(&bt_sk(sk)->src, src))
                        break;
        }
@@ -572,7 +572,7 @@ static int rfcomm_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
        while (len) {
                size_t size = min_t(size_t, len, d->mtu);
                int err;
-               
+
                skb = sock_alloc_send_skb(sk, size + RFCOMM_SKB_RESERVE,
                                msg->msg_flags & MSG_DONTWAIT, &err);
                if (!skb)
@@ -843,7 +843,7 @@ static int rfcomm_sock_release(struct socket *sock)
        return err;
 }
 
-/* ---- RFCOMM core layer callbacks ---- 
+/* ---- RFCOMM core layer callbacks ----
  *
  * called under rfcomm_lock()
  */
@@ -864,7 +864,7 @@ int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc *
 
        /* Check for backlog size */
        if (sk_acceptq_is_full(parent)) {
-               BT_DBG("backlog full %d", parent->sk_ack_backlog); 
+               BT_DBG("backlog full %d", parent->sk_ack_backlog);
                goto done;
        }
 
index eb2b52484c70e42e86cb329d093478cc225dab25..8cd82dce5008cf3e575229026e82281834847656 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    RFCOMM implementation for Linux Bluetooth stack (BlueZ).
    Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.com>
    Copyright (C) 2002 Marcel Holtmann <marcel@holtmann.org>
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
@@ -110,7 +110,7 @@ static void rfcomm_dev_destruct(struct rfcomm_dev *dev)
 
        kfree(dev);
 
-       /* It's safe to call module_put() here because socket still 
+       /* It's safe to call module_put() here because socket still
           holds reference to this module. */
        module_put(THIS_MODULE);
 }
@@ -185,7 +185,7 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc)
        int err = 0;
 
        BT_DBG("id %d channel %d", req->dev_id, req->channel);
-       
+
        dev = kzalloc(sizeof(struct rfcomm_dev), GFP_KERNEL);
        if (!dev)
                return -ENOMEM;
@@ -234,7 +234,7 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc)
        bacpy(&dev->dst, &req->dst);
        dev->channel = req->channel;
 
-       dev->flags = req->flags & 
+       dev->flags = req->flags &
                ((1 << RFCOMM_RELEASE_ONHUP) | (1 << RFCOMM_REUSE_DLC));
 
        init_waitqueue_head(&dev->wait);
@@ -249,7 +249,7 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc)
        dev->dlc   = dlc;
        rfcomm_dlc_unlock(dlc);
 
-       /* It's safe to call __module_get() here because socket already 
+       /* It's safe to call __module_get() here because socket already
           holds reference to this module. */
        __module_get(THIS_MODULE);
 
@@ -487,7 +487,7 @@ static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb)
 {
        struct rfcomm_dev *dev = dlc->owner;
        struct tty_struct *tty;
-       
+
        if (!dev || !(tty = dev->tty)) {
                kfree_skb(skb);
                return;
@@ -506,7 +506,7 @@ static void rfcomm_dev_state_change(struct rfcomm_dlc *dlc, int err)
        struct rfcomm_dev *dev = dlc->owner;
        if (!dev)
                return;
-       
+
        BT_DBG("dlc %p dev %p err %d", dlc, dev, err);
 
        dev->err = err;
@@ -525,7 +525,7 @@ static void rfcomm_dev_state_change(struct rfcomm_dlc *dlc, int err)
                                rfcomm_dev_put(dev);
                                rfcomm_dlc_lock(dlc);
                        }
-               } else 
+               } else
                        tty_hangup(dev->tty);
        }
 }
@@ -543,7 +543,7 @@ static void rfcomm_dev_modem_status(struct rfcomm_dlc *dlc, u8 v24_sig)
                        tty_hangup(dev->tty);
        }
 
-       dev->modem_status = 
+       dev->modem_status =
                ((v24_sig & RFCOMM_V24_RTC) ? (TIOCM_DSR | TIOCM_DTR) : 0) |
                ((v24_sig & RFCOMM_V24_RTR) ? (TIOCM_RTS | TIOCM_CTS) : 0) |
                ((v24_sig & RFCOMM_V24_IC)  ? TIOCM_RI : 0) |
@@ -561,7 +561,7 @@ static void rfcomm_tty_wakeup(unsigned long arg)
        BT_DBG("dev %p tty %p", dev, tty);
 
        if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags) && tty->ldisc.write_wakeup)
-                (tty->ldisc.write_wakeup)(tty);
+               (tty->ldisc.write_wakeup)(tty);
 
        wake_up_interruptible(&tty->write_wait);
 #ifdef SERIAL_HAVE_POLL_WAIT
@@ -576,7 +576,7 @@ static int rfcomm_tty_open(struct tty_struct *tty, struct file *filp)
        struct rfcomm_dlc *dlc;
        int err, id;
 
-        id = tty->index;
+       id = tty->index;
 
        BT_DBG("tty %p id %d", tty, id);
 
@@ -670,7 +670,7 @@ static int rfcomm_tty_write(struct tty_struct *tty, const unsigned char *buf, in
                size = min_t(uint, count, dlc->mtu);
 
                skb = rfcomm_wmalloc(dev, size + RFCOMM_SKB_RESERVE, GFP_ATOMIC);
-               
+
                if (!skb)
                        break;
 
@@ -773,7 +773,7 @@ static void rfcomm_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
                return;
 
        /* Handle turning off CRTSCTS */
-       if ((old->c_cflag & CRTSCTS) && !(new->c_cflag & CRTSCTS)) 
+       if ((old->c_cflag & CRTSCTS) && !(new->c_cflag & CRTSCTS))
                BT_DBG("Turning off CRTSCTS unsupported");
 
        /* Parity on/off and when on, odd/even */
@@ -830,7 +830,7 @@ static void rfcomm_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
        }
 
        /* Handle number of data bits [5-8] */
-       if ((old->c_cflag & CSIZE) != (new->c_cflag & CSIZE)) 
+       if ((old->c_cflag & CSIZE) != (new->c_cflag & CSIZE))
                changes |= RFCOMM_RPN_PM_DATA;
 
        switch (new->c_cflag & CSIZE) {
@@ -868,7 +868,7 @@ static void rfcomm_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
        case 9600:
                baud = RFCOMM_RPN_BR_9600;
                break;
-       case 19200: 
+       case 19200:
                baud = RFCOMM_RPN_BR_19200;
                break;
        case 38400:
@@ -887,7 +887,7 @@ static void rfcomm_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
                /* 9600 is standard accordinag to the RFCOMM specification */
                baud = RFCOMM_RPN_BR_9600;
                break;
-       
+
        }
 
        if (changes)
@@ -978,11 +978,11 @@ static int rfcomm_tty_read_proc(char *buf, char **start, off_t offset, int len,
 
 static int rfcomm_tty_tiocmget(struct tty_struct *tty, struct file *filp)
 {
-       struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
+       struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
 
        BT_DBG("tty %p dev %p", tty, dev);
 
-       return dev->modem_status;
+       return dev->modem_status;
 }
 
 static int rfcomm_tty_tiocmset(struct tty_struct *tty, struct file *filp, unsigned int set, unsigned int clear)
index 5d13d4f317538e1280118ac7f7f35994437163bf..ae4391440950cd14b1e9ef4c6b0fe7bc9259be40 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
    BlueZ - Bluetooth protocol stack for Linux
    Copyright (C) 2000-2001 Qualcomm Incorporated
 
    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
    IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
-   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
-   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
-   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
+   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
+   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
-   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
+   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
+   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
    SOFTWARE IS DISCLAIMED.
 */
 
@@ -149,7 +149,7 @@ static int sco_conn_del(struct hci_conn *hcon, int err)
        struct sco_conn *conn;
        struct sock *sk;
 
-       if (!(conn = hcon->sco_data)) 
+       if (!(conn = hcon->sco_data))
                return 0;
 
        BT_DBG("hcon %p conn %p, err %d", hcon, conn, err);
@@ -404,7 +404,7 @@ static void sco_sock_init(struct sock *sk, struct sock *parent)
 {
        BT_DBG("sk %p", sk);
 
-       if (parent) 
+       if (parent)
                sk->sk_type = parent->sk_type;
 }
 
@@ -522,7 +522,7 @@ static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen
        if ((err = sco_connect(sk)))
                goto done;
 
-       err = bt_sock_wait_state(sk, BT_CONNECTED, 
+       err = bt_sock_wait_state(sk, BT_CONNECTED,
                        sock_sndtimeo(sk, flags & O_NONBLOCK));
 
 done:
@@ -627,7 +627,7 @@ static int sco_sock_getname(struct socket *sock, struct sockaddr *addr, int *len
        return 0;
 }
 
-static int sco_sock_sendmsg(struct kiocb *iocb, struct socket *sock, 
+static int sco_sock_sendmsg(struct kiocb *iocb, struct socket *sock,
                            struct msghdr *msg, size_t len)
 {
        struct sock *sk = sock->sk;
@@ -677,7 +677,7 @@ static int sco_sock_getsockopt(struct socket *sock, int level, int optname, char
        struct sock *sk = sock->sk;
        struct sco_options opts;
        struct sco_conninfo cinfo;
-       int len, err = 0; 
+       int len, err = 0;
 
        BT_DBG("sk %p", sk);
 
@@ -761,7 +761,7 @@ static void __sco_chan_add(struct sco_conn *conn, struct sock *sk, struct sock *
                bt_accept_enqueue(parent, sk);
 }
 
-/* Delete channel. 
+/* Delete channel.
  * Must be called on the locked socket. */
 static void sco_chan_del(struct sock *sk, int err)
 {
@@ -771,7 +771,7 @@ static void sco_chan_del(struct sock *sk, int err)
 
        BT_DBG("sk %p, conn %p, err %d", sk, conn, err);
 
-       if (conn) { 
+       if (conn) {
                sco_conn_lock(conn);
                conn->sk = NULL;
                sco_pi(sk)->conn = NULL;
@@ -855,7 +855,7 @@ static int sco_connect_cfm(struct hci_conn *hcon, __u8 status)
                conn = sco_conn_add(hcon, status);
                if (conn)
                        sco_conn_ready(conn);
-       } else 
+       } else
                sco_conn_del(hcon, bt_err(status));
 
        return 0;
@@ -887,7 +887,7 @@ static int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb)
        }
 
 drop:
-       kfree_skb(skb); 
+       kfree_skb(skb);
        return 0;
 }
 
index f8dbcee80ebad7cdffb110fd87a8796db93643ab..905a39c33a16f73ce82beaaa9fd05295550485b5 100644 (file)
@@ -40,7 +40,7 @@ int br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
        skb->mac.raw = skb->data;
        skb_pull(skb, ETH_HLEN);
 
-       if (dest[0] & 1) 
+       if (dest[0] & 1)
                br_flood_deliver(br, skb, 0);
        else if ((dst = __br_fdb_get(br, dest)) != NULL)
                br_deliver(dst->dst, skb);
@@ -178,12 +178,12 @@ void br_dev_setup(struct net_device *dev)
        dev->change_mtu = br_change_mtu;
        dev->destructor = free_netdev;
        SET_MODULE_OWNER(dev);
-       SET_ETHTOOL_OPS(dev, &br_ethtool_ops);
+       SET_ETHTOOL_OPS(dev, &br_ethtool_ops);
        dev->stop = br_dev_stop;
        dev->tx_queue_len = 0;
        dev->set_mac_address = br_set_mac_address;
        dev->priv_flags = IFF_EBRIDGE;
 
-       dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA |
-                       NETIF_F_TSO | NETIF_F_NO_CSUM | NETIF_F_GSO_ROBUST;
+       dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA |
+                       NETIF_F_TSO | NETIF_F_NO_CSUM | NETIF_F_GSO_ROBUST;
 }
index 8ca448db7a0d779199fde2ed1c81f71eafbbca10..def2e403f932e25342c556040f129bba9b6830a1 100644 (file)
@@ -52,7 +52,7 @@ static __inline__ unsigned long hold_time(const struct net_bridge *br)
 static __inline__ int has_expired(const struct net_bridge *br,
                                  const struct net_bridge_fdb_entry *fdb)
 {
-       return !fdb->is_static 
+       return !fdb->is_static
                && time_before_eq(fdb->ageing_timer + hold_time(br), jiffies);
 }
 
@@ -71,7 +71,7 @@ void br_fdb_changeaddr(struct net_bridge_port *p, const unsigned char *newaddr)
 {
        struct net_bridge *br = p->br;
        int i;
-       
+
        spin_lock_bh(&br->hash_lock);
 
        /* Search all chains since old address/hash is unknown */
@@ -85,7 +85,7 @@ void br_fdb_changeaddr(struct net_bridge_port *p, const unsigned char *newaddr)
                                /* maybe another port has same hw addr? */
                                struct net_bridge_port *op;
                                list_for_each_entry(op, &br->port_list, list) {
-                                       if (op != p && 
+                                       if (op != p &&
                                            !compare_ether_addr(op->dev->dev_addr,
                                                                f->addr.addr)) {
                                                f->dst = op;
@@ -118,8 +118,8 @@ void br_fdb_cleanup(unsigned long _data)
                struct hlist_node *h, *n;
 
                hlist_for_each_entry_safe(f, h, n, &br->hash[i], hlist) {
-                       if (!f->is_static && 
-                           time_before_eq(f->ageing_timer + delay, jiffies)) 
+                       if (!f->is_static &&
+                           time_before_eq(f->ageing_timer + delay, jiffies))
                                fdb_delete(f);
                }
        }
@@ -138,11 +138,11 @@ void br_fdb_delete_by_port(struct net_bridge *br,
        spin_lock_bh(&br->hash_lock);
        for (i = 0; i < BR_HASH_SIZE; i++) {
                struct hlist_node *h, *g;
-               
+
                hlist_for_each_safe(h, g, &br->hash[i]) {
                        struct net_bridge_fdb_entry *f
                                = hlist_entry(h, struct net_bridge_fdb_entry, hlist);
-                       if (f->dst != p) 
+                       if (f->dst != p)
                                continue;
 
                        if (f->is_static && !do_all)
@@ -155,7 +155,7 @@ void br_fdb_delete_by_port(struct net_bridge *br,
                        if (f->is_local) {
                                struct net_bridge_port *op;
                                list_for_each_entry(op, &br->port_list, list) {
-                                       if (op != p && 
+                                       if (op != p &&
                                            !compare_ether_addr(op->dev->dev_addr,
                                                                f->addr.addr)) {
                                                f->dst = op;
@@ -190,14 +190,14 @@ struct net_bridge_fdb_entry *__br_fdb_get(struct net_bridge *br,
 }
 
 /* Interface used by ATM hook that keeps a ref count */
-struct net_bridge_fdb_entry *br_fdb_get(struct net_bridge *br, 
+struct net_bridge_fdb_entry *br_fdb_get(struct net_bridge *br,
                                        unsigned char *addr)
 {
        struct net_bridge_fdb_entry *fdb;
 
        rcu_read_lock();
        fdb = __br_fdb_get(br, addr);
-       if (fdb) 
+       if (fdb)
                atomic_inc(&fdb->use_count);
        rcu_read_unlock();
        return fdb;
@@ -218,7 +218,7 @@ void br_fdb_put(struct net_bridge_fdb_entry *ent)
 }
 
 /*
- * Fill buffer with forwarding table records in 
+ * Fill buffer with forwarding table records in
  * the API format.
  */
 int br_fdb_fillbuf(struct net_bridge *br, void *buf,
@@ -237,7 +237,7 @@ int br_fdb_fillbuf(struct net_bridge *br, void *buf,
                        if (num >= maxnum)
                                goto out;
 
-                       if (has_expired(br, f)) 
+                       if (has_expired(br, f))
                                continue;
 
                        if (skip) {
@@ -277,7 +277,7 @@ static inline struct net_bridge_fdb_entry *fdb_find(struct hlist_head *head,
 
 static struct net_bridge_fdb_entry *fdb_create(struct hlist_head *head,
                                               struct net_bridge_port *source,
-                                              const unsigned char *addr, 
+                                              const unsigned char *addr,
                                               int is_local)
 {
        struct net_bridge_fdb_entry *fdb;
@@ -307,17 +307,17 @@ static int fdb_insert(struct net_bridge *br, struct net_bridge_port *source,
 
        fdb = fdb_find(head, addr);
        if (fdb) {
-               /* it is okay to have multiple ports with same 
+               /* it is okay to have multiple ports with same
                 * address, just use the first one.
                 */
-               if (fdb->is_local) 
+               if (fdb->is_local)
                        return 0;
 
                printk(KERN_WARNING "%s adding interface with same address "
                       "as a received packet\n",
                       source->dev->name);
                fdb_delete(fdb);
-       }
+       }
 
        if (!fdb_create(head, source, addr, 1))
                return -ENOMEM;
@@ -350,7 +350,7 @@ void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source,
        if (likely(fdb)) {
                /* attempt to update an entry for a local interface */
                if (unlikely(fdb->is_local)) {
-                       if (net_ratelimit()) 
+                       if (net_ratelimit())
                                printk(KERN_WARNING "%s: received packet with "
                                       " own address as source address\n",
                                       source->dev->name);
index 191b861e5e53c25b176d1d36c1475cc6406ee5ae..3e45c1a1aa96124f1bf525346aecf14b704f4311 100644 (file)
@@ -21,7 +21,7 @@
 #include "br_private.h"
 
 /* Don't forward packets to originating port or forwarding diasabled */
-static inline int should_deliver(const struct net_bridge_port *p, 
+static inline int should_deliver(const struct net_bridge_port *p,
                                 const struct sk_buff *skb)
 {
        return (skb->dev != p->dev && p->state == BR_STATE_FORWARDING);
@@ -101,7 +101,7 @@ void br_forward(const struct net_bridge_port *to, struct sk_buff *skb)
 
 /* called under bridge lock */
 static void br_flood(struct net_bridge *br, struct sk_buff *skb, int clone,
-       void (*__packet_hook)(const struct net_bridge_port *p, 
+       void (*__packet_hook)(const struct net_bridge_port *p,
                              struct sk_buff *skb))
 {
        struct net_bridge_port *p;
index 2b7c2c7dad485aaa9e5399553ec27f2cd074a8e4..aff6a779c9c82e1df96417f55d086656fc6274cc 100644 (file)
@@ -47,7 +47,7 @@ static int port_cost(struct net_device *dev)
        set_fs(KERNEL_DS);
        err = dev_ethtool(&ifr);
        set_fs(old_fs);
-       
+
        if (!err) {
                switch(ecmd.speed) {
                case SPEED_100:
@@ -108,6 +108,7 @@ static void port_carrier_check(struct work_struct *work)
                spin_unlock_bh(&br->lock);
        }
 done:
+       dev_put(dev);
        rtnl_unlock();
 }
 
@@ -161,7 +162,8 @@ static void del_nbp(struct net_bridge_port *p)
 
        dev_set_promiscuity(dev, -1);
 
-       cancel_delayed_work(&p->carrier_check);
+       if (cancel_delayed_work(&p->carrier_check))
+               dev_put(dev);
 
        spin_lock_bh(&br->lock);
        br_stp_disable_port(p);
@@ -191,7 +193,7 @@ static void del_br(struct net_bridge *br)
        del_timer_sync(&br->gc_timer);
 
        br_sysfs_delbr(br->dev);
-       unregister_netdevice(br->dev);
+       unregister_netdevice(br->dev);
 }
 
 static struct net_device *new_bridge_dev(const char *name)
@@ -201,7 +203,7 @@ static struct net_device *new_bridge_dev(const char *name)
 
        dev = alloc_netdev(sizeof(struct net_bridge), name,
                           br_dev_setup);
-       
+
        if (!dev)
                return NULL;
 
@@ -258,12 +260,12 @@ static int find_portno(struct net_bridge *br)
 }
 
 /* called with RTNL but without bridge lock */
-static struct net_bridge_port *new_nbp(struct net_bridge *br, 
+static struct net_bridge_port *new_nbp(struct net_bridge *br,
                                       struct net_device *dev)
 {
        int index;
        struct net_bridge_port *p;
-       
+
        index = find_portno(br);
        if (index < 0)
                return ERR_PTR(index);
@@ -276,7 +278,7 @@ static struct net_bridge_port *new_nbp(struct net_bridge *br,
        dev_hold(dev);
        p->dev = dev;
        p->path_cost = port_cost(dev);
-       p->priority = 0x8000 >> BR_PORT_BITS;
+       p->priority = 0x8000 >> BR_PORT_BITS;
        p->port_no = index;
        br_init_port(p);
        p->state = BR_STATE_DISABLED;
@@ -298,7 +300,7 @@ int br_add_bridge(const char *name)
        int ret;
 
        dev = new_bridge_dev(name);
-       if (!dev) 
+       if (!dev)
                return -ENOMEM;
 
        rtnl_lock();
@@ -329,7 +331,7 @@ int br_del_bridge(const char *name)
 
        rtnl_lock();
        dev = __dev_get_by_name(name);
-       if (dev == NULL) 
+       if (dev == NULL)
                ret =  -ENXIO;  /* Could not find device */
 
        else if (!(dev->priv_flags & IFF_EBRIDGE)) {
@@ -340,9 +342,9 @@ int br_del_bridge(const char *name)
        else if (dev->flags & IFF_UP) {
                /* Not shutdown yet. */
                ret = -EBUSY;
-       } 
+       }
 
-       else 
+       else
                del_br(netdev_priv(dev));
 
        rtnl_unlock();
@@ -428,7 +430,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
        if (err)
                goto err0;
 
-       err = br_fdb_insert(br, p, dev->dev_addr);
+       err = br_fdb_insert(br, p, dev->dev_addr);
        if (err)
                goto err1;
 
@@ -444,7 +446,9 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
        spin_lock_bh(&br->lock);
        br_stp_recalculate_bridge_id(br);
        br_features_recompute(br);
-       schedule_delayed_work(&p->carrier_check, BR_PORT_DEBOUNCE);
+       if (schedule_delayed_work(&p->carrier_check, BR_PORT_DEBOUNCE))
+               dev_hold(dev);
+
        spin_unlock_bh(&br->lock);
 
        dev_set_mtu(br->dev, br_min_mtu(br));
@@ -464,8 +468,8 @@ err0:
 int br_del_if(struct net_bridge *br, struct net_device *dev)
 {
        struct net_bridge_port *p = dev->br_port;
-       
-       if (!p || p->br != br) 
+
+       if (!p || p->br != br)
                return -EINVAL;
 
        del_nbp(p);
index bfa4d8c333f7b727946e40c4c33e159d4fdbfe2f..35b94f9a1ac566a5a33bfec279b3fc27b1705a68 100644 (file)
@@ -119,7 +119,7 @@ static inline int is_link_local(const unsigned char *dest)
  * Called via br_handle_frame_hook.
  * Return 0 if *pskb should be processed furthur
  *       1 if *pskb is handled
- * note: already called with rcu_read_lock (preempt_disabled) 
+ * note: already called with rcu_read_lock (preempt_disabled)
  */
 int br_handle_frame(struct net_bridge_port *p, struct sk_buff **pskb)
 {
@@ -137,7 +137,7 @@ int br_handle_frame(struct net_bridge_port *p, struct sk_buff **pskb)
 
        if (p->state == BR_STATE_FORWARDING || p->state == BR_STATE_LEARNING) {
                if (br_should_route_hook) {
-                       if (br_should_route_hook(pskb)) 
+                       if (br_should_route_hook(pskb))
                                return 0;
                        skb = *pskb;
                        dest = eth_hdr(skb)->h_dest;
index 4c61a7e0a86e1ae9e16867f9f8e4b0412b8edbaf..3ab153d3c508810007da27fb9ca846a0a2ead0b0 100644 (file)
@@ -28,7 +28,7 @@ static int get_bridge_ifindices(int *indices, int num)
        int i = 0;
 
        for (dev = dev_base; dev && i < num; dev = dev->next) {
-               if (dev->priv_flags & IFF_EBRIDGE) 
+               if (dev->priv_flags & IFF_EBRIDGE)
                        indices[i++] = dev->ifindex;
        }
 
@@ -53,7 +53,7 @@ static void get_port_ifindices(struct net_bridge *br, int *ifindices, int num)
  *            (limited to a page for sanity)
  * offset  -- number of records to skip
  */
-static int get_fdb_entries(struct net_bridge *br, void __user *userbuf, 
+static int get_fdb_entries(struct net_bridge *br, void __user *userbuf,
                           unsigned long maxnum, unsigned long offset)
 {
        int num;
@@ -69,7 +69,7 @@ static int get_fdb_entries(struct net_bridge *br, void __user *userbuf,
        buf = kmalloc(size, GFP_USER);
        if (!buf)
                return -ENOMEM;
-       
+
        num = br_fdb_fillbuf(br, buf, maxnum, offset);
        if (num > 0) {
                if (copy_to_user(userbuf, buf, num*sizeof(struct __fdb_entry)))
@@ -91,7 +91,7 @@ static int add_del_if(struct net_bridge *br, int ifindex, int isadd)
        dev = dev_get_by_index(ifindex);
        if (dev == NULL)
                return -EINVAL;
-       
+
        if (isadd)
                ret = br_add_if(br, dev);
        else
@@ -110,7 +110,7 @@ static int old_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
 {
        struct net_bridge *br = netdev_priv(dev);
        unsigned long args[4];
-       
+
        if (copy_from_user(args, rq->ifr_data, sizeof(args)))
                return -EFAULT;
 
@@ -143,7 +143,7 @@ static int old_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                b.tcn_timer_value = br_timer_value(&br->tcn_timer);
                b.topology_change_timer_value = br_timer_value(&br->topology_change_timer);
                b.gc_timer_value = br_timer_value(&br->gc_timer);
-               rcu_read_unlock();
+               rcu_read_unlock();
 
                if (copy_to_user((void __user *)args[1], &b, sizeof(b)))
                        return -EFAULT;
@@ -275,7 +275,7 @@ static int old_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                        return -ERANGE;
 
                spin_lock_bh(&br->lock);
-               if ((p = br_get_port(br, args[1])) == NULL) 
+               if ((p = br_get_port(br, args[1])) == NULL)
                        ret = -EINVAL;
                else
                        br_stp_set_port_priority(p, args[2]);
@@ -301,7 +301,7 @@ static int old_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
        }
 
        case BRCTL_GET_FDB_ENTRIES:
-               return get_fdb_entries(br, (void __user *)args[1], 
+               return get_fdb_entries(br, (void __user *)args[1],
                                       args[2], args[3]);
        }
 
@@ -368,7 +368,7 @@ int br_ioctl_deviceless_stub(unsigned int cmd, void __user *uarg)
        case SIOCGIFBR:
        case SIOCSIFBR:
                return old_deviceless(uarg);
-               
+
        case SIOCBRADDBR:
        case SIOCBRDELBR:
        {
index a25fa8cb5284d9840ae2a1b5d3e19d412a67a780..7712d76f06ba8b22ba394d57d7e0d007034fe383 100644 (file)
@@ -68,7 +68,7 @@ static __be16 inline vlan_proto(const struct sk_buff *skb)
 
 #define IS_VLAN_IP(skb) \
        (skb->protocol == htons(ETH_P_8021Q) && \
-        vlan_proto(skb) == htons(ETH_P_IP) &&  \
+        vlan_proto(skb) == htons(ETH_P_IP) &&  \
         brnf_filter_vlan_tagged)
 
 #define IS_VLAN_IPV6(skb) \
@@ -124,7 +124,7 @@ static inline struct nf_bridge_info *nf_bridge_alloc(struct sk_buff *skb)
 
 static inline void nf_bridge_save_header(struct sk_buff *skb)
 {
-        int header_size = ETH_HLEN;
+       int header_size = ETH_HLEN;
 
        if (skb->protocol == htons(ETH_P_8021Q))
                header_size += VLAN_HLEN;
@@ -139,7 +139,7 @@ static inline void nf_bridge_save_header(struct sk_buff *skb)
 int nf_bridge_copy_header(struct sk_buff *skb)
 {
        int err;
-        int header_size = ETH_HLEN;
+       int header_size = ETH_HLEN;
 
        if (skb->protocol == htons(ETH_P_8021Q))
                header_size += VLAN_HLEN;
@@ -836,10 +836,10 @@ static unsigned int ip_sabotage_in(unsigned int hook, struct sk_buff **pskb,
  * For br_nf_post_routing, we need (prio = NF_BR_PRI_LAST), because
  * ip_refrag() can return NF_STOLEN. */
 static struct nf_hook_ops br_nf_ops[] = {
-       { .hook = br_nf_pre_routing, 
-         .owner = THIS_MODULE, 
-         .pf = PF_BRIDGE, 
-         .hooknum = NF_BR_PRE_ROUTING, 
+       { .hook = br_nf_pre_routing,
+         .owner = THIS_MODULE,
+         .pf = PF_BRIDGE,
+         .hooknum = NF_BR_PRE_ROUTING,
          .priority = NF_BR_PRI_BRNF, },
        { .hook = br_nf_local_in,
          .owner = THIS_MODULE,
@@ -957,7 +957,7 @@ int __init br_netfilter_init(void)
        if (ret < 0)
                return ret;
 #ifdef CONFIG_SYSCTL
-       brnf_sysctl_header = register_sysctl_table(brnf_net_table, 0);
+       brnf_sysctl_header = register_sysctl_table(brnf_net_table);
        if (brnf_sysctl_header == NULL) {
                printk(KERN_WARNING
                       "br_netfilter: can't register to sysctl.\n");
index 20278494e4da0d11712cfad0ed31f410abc5eb35..3311c4e30829ed93c6e3ce2d004f956eb8e60758 100644 (file)
@@ -26,7 +26,7 @@ struct notifier_block br_device_notifier = {
 
 /*
  * Handle changes in state of network devices enslaved to a bridge.
- * 
+ *
  * Note: don't care about up/down if bridge itself is down, because
  *     port state is checked when bridge is brought up.
  */
@@ -56,15 +56,17 @@ static int br_device_event(struct notifier_block *unused, unsigned long event, v
 
        case NETDEV_CHANGE:
                if (br->dev->flags & IFF_UP)
-                       schedule_delayed_work(&p->carrier_check, BR_PORT_DEBOUNCE);
+                       if (schedule_delayed_work(&p->carrier_check,
+                                               BR_PORT_DEBOUNCE))
+                               dev_hold(dev);
                break;
 
        case NETDEV_FEAT_CHANGE:
-               if (br->dev->flags & IFF_UP) 
+               if (br->dev->flags & IFF_UP)
                        br_features_recompute(br);
 
                /* could do recursive feature change notification
-                * but who would care?? 
+                * but who would care??
                 */
                break;
 
@@ -74,7 +76,7 @@ static int br_device_event(struct notifier_block *unused, unsigned long event, v
                break;
 
        case NETDEV_UP:
-               if (netif_carrier_ok(dev) && (br->dev->flags & IFF_UP)) 
+               if (netif_carrier_ok(dev) && (br->dev->flags & IFF_UP))
                        br_stp_enable_port(p);
                break;
 
@@ -82,7 +84,7 @@ static int br_device_event(struct notifier_block *unused, unsigned long event, v
                spin_unlock_bh(&br->lock);
                br_del_if(br, dev);
                goto done;
-       } 
+       }
        spin_unlock_bh(&br->lock);
 
  done:
index 3a534e94c7f3db084e7b501dcf48dfe72038ec28..6a0540e0591e93593d547ff35cafe1e00da50799 100644 (file)
@@ -149,7 +149,7 @@ extern struct net_bridge_fdb_entry *__br_fdb_get(struct net_bridge *br,
 extern struct net_bridge_fdb_entry *br_fdb_get(struct net_bridge *br,
                                               unsigned char *addr);
 extern void br_fdb_put(struct net_bridge_fdb_entry *ent);
-extern int br_fdb_fillbuf(struct net_bridge *br, void *buf, 
+extern int br_fdb_fillbuf(struct net_bridge *br, void *buf,
                          unsigned long count, unsigned long off);
 extern int br_fdb_insert(struct net_bridge *br,
                         struct net_bridge_port *source,
@@ -203,7 +203,7 @@ extern void br_netfilter_fini(void);
 /* br_stp.c */
 extern void br_log_state(const struct net_bridge_port *p);
 extern struct net_bridge_port *br_get_port(struct net_bridge *br,
-                                          u16 port_no);
+                                          u16 port_no);
 extern void br_init_port(struct net_bridge_port *p);
 extern void br_become_designated_port(struct net_bridge_port *p);
 
index 04ca0639a95a71d52ac7b2ae3a0a48f7a34f9cf6..f9ff4d57b0d7fc60cbbd5e5718f2e67c0b247121 100644 (file)
 #define MESSAGE_AGE_INCR       ((HZ < 256) ? 1 : (HZ/256))
 
 static const char *br_port_state_names[] = {
-       [BR_STATE_DISABLED] = "disabled", 
+       [BR_STATE_DISABLED] = "disabled",
        [BR_STATE_LISTENING] = "listening",
-       [BR_STATE_LEARNING] = "learning", 
-       [BR_STATE_FORWARDING] = "forwarding", 
+       [BR_STATE_LEARNING] = "learning",
+       [BR_STATE_FORWARDING] = "forwarding",
        [BR_STATE_BLOCKING] = "blocking",
 };
 
 void br_log_state(const struct net_bridge_port *p)
 {
        pr_info("%s: port %d(%s) entering %s state\n",
-               p->br->dev->name, p->port_no, p->dev->name, 
+               p->br->dev->name, p->port_no, p->dev->name,
                br_port_state_names[p->state]);
 
 }
@@ -53,7 +53,7 @@ struct net_bridge_port *br_get_port(struct net_bridge *br, u16 port_no)
 }
 
 /* called under bridge lock */
-static int br_should_become_root_port(const struct net_bridge_port *p, 
+static int br_should_become_root_port(const struct net_bridge_port *p,
                                      u16 root_port)
 {
        struct net_bridge *br;
@@ -184,7 +184,7 @@ void br_transmit_config(struct net_bridge_port *p)
 }
 
 /* called under bridge lock */
-static inline void br_record_config_information(struct net_bridge_port *p, 
+static inline void br_record_config_information(struct net_bridge_port *p,
                                                const struct br_config_bpdu *bpdu)
 {
        p->designated_root = bpdu->root;
@@ -192,12 +192,12 @@ static inline void br_record_config_information(struct net_bridge_port *p,
        p->designated_bridge = bpdu->bridge_id;
        p->designated_port = bpdu->port_id;
 
-       mod_timer(&p->message_age_timer, jiffies 
+       mod_timer(&p->message_age_timer, jiffies
                  + (p->br->max_age - bpdu->message_age));
 }
 
 /* called under bridge lock */
-static inline void br_record_config_timeout_values(struct net_bridge *br, 
+static inline void br_record_config_timeout_values(struct net_bridge *br,
                                            const struct br_config_bpdu *bpdu)
 {
        br->max_age = bpdu->max_age;
@@ -415,7 +415,7 @@ void br_received_config_bpdu(struct net_bridge_port *p, struct br_config_bpdu *b
 {
        struct net_bridge *br;
        int was_root;
+
        br = p->br;
        was_root = br_is_root_bridge(br);
 
@@ -430,7 +430,7 @@ void br_received_config_bpdu(struct net_bridge_port *p, struct br_config_bpdu *b
                                del_timer(&br->topology_change_timer);
                                br_transmit_tcn(br);
 
-                               mod_timer(&br->tcn_timer, 
+                               mod_timer(&br->tcn_timer,
                                          jiffies + br->bridge_hello_time);
                        }
                }
@@ -441,8 +441,8 @@ void br_received_config_bpdu(struct net_bridge_port *p, struct br_config_bpdu *b
                        if (bpdu->topology_change_ack)
                                br_topology_change_acknowledged(br);
                }
-       } else if (br_is_designated_port(p)) {          
-               br_reply(p);            
+       } else if (br_is_designated_port(p)) {
+               br_reply(p);
        }
 }
 
index 068d8afbf0a79896eadadbddf4e19c15d56da288..b9fb0dc4ab1290dc4bebcb151a579bf39fb92ae2 100644 (file)
@@ -29,7 +29,7 @@
 #define LLC_RESERVE sizeof(struct llc_pdu_un)
 
 static void br_send_bpdu(struct net_bridge_port *p,
-                        const unsigned char *data, int length)
+                        const unsigned char *data, int length)
 {
        struct sk_buff *skb;
 
index d294224592db0455e0bd31d7f04ab6a290abc21e..58d13f2bd121471eb5ee8adf90e5b4ec2dcd1530 100644 (file)
@@ -28,7 +28,7 @@
  */
 static inline port_id br_make_port_id(__u8 priority, __u16 port_no)
 {
-       return ((u16)priority << BR_PORT_BITS) 
+       return ((u16)priority << BR_PORT_BITS)
                | (port_no & ((1<<BR_PORT_BITS)-1));
 }
 
@@ -50,7 +50,7 @@ void br_stp_enable_bridge(struct net_bridge *br)
        spin_lock_bh(&br->lock);
        mod_timer(&br->hello_timer, jiffies + br->hello_time);
        mod_timer(&br->gc_timer, jiffies + HZ/10);
-       
+
        br_config_bpdu_generation(br);
 
        list_for_each_entry(p, &br->port_list, list) {
index d0fcde82c6fcaa3ff81b9569b6a960e9cbc69052..030aa798fea70bd5b9ee4a6fc814529c569e460b 100644 (file)
@@ -27,7 +27,7 @@ static int br_is_designated_for_some_port(const struct net_bridge *br)
 
        list_for_each_entry(p, &br->port_list, list) {
                if (p->state != BR_STATE_DISABLED &&
-                   !memcmp(&p->designated_bridge, &br->bridge_id, 8)) 
+                   !memcmp(&p->designated_bridge, &br->bridge_id, 8))
                        return 1;
        }
 
@@ -37,7 +37,7 @@ static int br_is_designated_for_some_port(const struct net_bridge *br)
 static void br_hello_timer_expired(unsigned long arg)
 {
        struct net_bridge *br = (struct net_bridge *)arg;
-       
+
        pr_debug("%s: hello timer expired\n", br->dev->name);
        spin_lock(&br->lock);
        if (br->dev->flags & IFF_UP) {
@@ -58,11 +58,11 @@ static void br_message_age_timer_expired(unsigned long arg)
        if (p->state == BR_STATE_DISABLED)
                return;
 
-       
+
        pr_info("%s: neighbor %.2x%.2x.%.2x:%.2x:%.2x:%.2x:%.2x:%.2x lost on port %d(%s)\n",
-               br->dev->name, 
-               id->prio[0], id->prio[1], 
-               id->addr[0], id->addr[1], id->addr[2], 
+               br->dev->name,
+               id->prio[0], id->prio[1],
+               id->addr[0], id->addr[1], id->addr[2],
                id->addr[3], id->addr[4], id->addr[5],
                p->port_no, p->dev->name);
 
@@ -114,7 +114,7 @@ static void br_tcn_timer_expired(unsigned long arg)
        spin_lock(&br->lock);
        if (br->dev->flags & IFF_UP) {
                br_transmit_tcn(br);
-       
+
                mod_timer(&br->tcn_timer,jiffies + br->bridge_hello_time);
        }
        spin_unlock(&br->lock);
@@ -135,7 +135,7 @@ static void br_hold_timer_expired(unsigned long arg)
 {
        struct net_bridge_port *p = (struct net_bridge_port *) arg;
 
-       pr_debug("%s: %d(%s) hold timer expired\n", 
+       pr_debug("%s: %d(%s) hold timer expired\n",
                 p->br->dev->name,  p->port_no, p->dev->name);
 
        spin_lock(&p->br->lock);
@@ -166,10 +166,10 @@ void br_stp_port_timer_init(struct net_bridge_port *p)
 
        setup_timer(&p->forward_delay_timer, br_forward_delay_timer_expired,
                      (unsigned long) p);
-                     
+
        setup_timer(&p->hold_timer, br_hold_timer_expired,
                      (unsigned long) p);
-}      
+}
 
 /* Report ticks left (in USER_HZ) used for API */
 unsigned long br_timer_value(const struct timer_list *timer)
index ce10464716a7cc4281e005c861f7add521be8a69..01a22ad0cc7591b037c4f6108f6aab311f13618e 100644 (file)
@@ -353,19 +353,19 @@ static ssize_t brforward_read(struct kobject *kobj, char *buf,
        if (off % sizeof(struct __fdb_entry) != 0)
                return -EINVAL;
 
-       n =  br_fdb_fillbuf(br, buf, 
+       n =  br_fdb_fillbuf(br, buf,
                            count / sizeof(struct __fdb_entry),
                            off / sizeof(struct __fdb_entry));
 
        if (n > 0)
                n *= sizeof(struct __fdb_entry);
-       
+
        return n;
 }
 
 static struct bin_attribute bridge_forward = {
        .attr = { .name = SYSFS_BRIDGE_FDB,
-                 .mode = S_IRUGO, 
+                 .mode = S_IRUGO,
                  .owner = THIS_MODULE, },
        .read = brforward_read,
 };
@@ -401,7 +401,7 @@ int br_sysfs_addbr(struct net_device *dev)
                goto out2;
        }
 
-       
+
        kobject_set_name(&br->ifobj, SYSFS_BRIDGE_PORT_SUBDIR);
        br->ifobj.ktype = NULL;
        br->ifobj.kset = NULL;
index 9abbc09ccdc376348545791de814ac835bb3194d..41a78072cd0eb1f4eed32752b2708ee6369788ee 100644 (file)
@@ -5,7 +5,7 @@
  * Chris Vitale csv@bluetail.com
  *
  * May 2003
- * 
+ *
  */
 
 #include <linux/netfilter_bridge/ebtables.h>
@@ -20,7 +20,7 @@ static int ebt_filter_802_3(const struct sk_buff *skb, const struct net_device *
        __be16 type = hdr->llc.ui.ctrl & IS_UI ? hdr->llc.ui.type : hdr->llc.ni.type;
 
        if (info->bitmask & EBT_802_3_SAP) {
-               if (FWINV(info->sap != hdr->llc.ui.ssap, EBT_802_3_SAP)) 
+               if (FWINV(info->sap != hdr->llc.ui.ssap, EBT_802_3_SAP))
                                return EBT_NOMATCH;
                if (FWINV(info->sap != hdr->llc.ui.dsap, EBT_802_3_SAP))
                                return EBT_NOMATCH;
@@ -29,7 +29,7 @@ static int ebt_filter_802_3(const struct sk_buff *skb, const struct net_device *
        if (info->bitmask & EBT_802_3_TYPE) {
                if (!(hdr->llc.ui.dsap == CHECK_TYPE && hdr->llc.ui.ssap == CHECK_TYPE))
                        return EBT_NOMATCH;
-               if (FWINV(info->type != type, EBT_802_3_TYPE)) 
+               if (FWINV(info->type != type, EBT_802_3_TYPE))
                        return EBT_NOMATCH;
        }
 
index ce97c4285f9adc1ddcd9de259e05f99b9b48d292..392d877040d31897f063d97c49b49ff7c1949532 100644 (file)
@@ -18,7 +18,7 @@ static int ebt_mac_wormhash_contains(const struct ebt_mac_wormhash *wh,
                                     const char *mac, __be32 ip)
 {
        /* You may be puzzled as to how this code works.
-        * Some tricks were used, refer to 
+        * Some tricks were used, refer to
         *      include/linux/netfilter_bridge/ebt_among.h
         * as there you can find a solution of this mystery.
         */
@@ -207,8 +207,8 @@ static int ebt_among_check(const char *tablename, unsigned int hookmask,
 }
 
 static struct ebt_match filter_among = {
-       .name           = EBT_AMONG_MATCH, 
-       .match          = ebt_filter_among, 
+       .name           = EBT_AMONG_MATCH,
+       .match          = ebt_filter_among,
        .check          = ebt_among_check,
        .me             = THIS_MODULE,
 };
index 0aa7b9910a86159a66043ba819298a02f6b917f1..ffe468a632e72c490c5344c2ac9db5850c82dd74 100644 (file)
@@ -51,7 +51,7 @@ static int ebt_target_reply(struct sk_buff **pskb, unsigned int hooknr,
                return EBT_DROP;
 
        arp_send(ARPOP_REPLY, ETH_P_ARP, *siptr, (struct net_device *)in,
-                *diptr, shp, info->mac, shp);
+                *diptr, shp, info->mac, shp);
 
        return info->target;
 }
index 6afa4d017d4a5cdcde535473cb0eae57c9fdaf91..69f7f0ab9c76ae5fa5d4cdd7ef2264417a675ba3 100644 (file)
@@ -61,15 +61,15 @@ static int ebt_filter_ip(const struct sk_buff *skb, const struct net_device *in,
                if (info->bitmask & EBT_IP_DPORT) {
                        u32 dst = ntohs(pptr->dst);
                        if (FWINV(dst < info->dport[0] ||
-                                 dst > info->dport[1],
-                                 EBT_IP_DPORT))
+                                 dst > info->dport[1],
+                                 EBT_IP_DPORT))
                        return EBT_NOMATCH;
                }
                if (info->bitmask & EBT_IP_SPORT) {
                        u32 src = ntohs(pptr->src);
                        if (FWINV(src < info->sport[0] ||
-                                 src > info->sport[1],
-                                 EBT_IP_SPORT))
+                                 src > info->sport[1],
+                                 EBT_IP_SPORT))
                        return EBT_NOMATCH;
                }
        }
index 985df82e427b2f9b2128a5bc68da1aed273dacd0..45712aec6a0ee28c07746bfeaf157c725695bb98 100644 (file)
@@ -169,10 +169,10 @@ static void ebt_log(const struct sk_buff *skb, unsigned int hooknr,
 
        if (info->bitmask & EBT_LOG_NFLOG)
                nf_log_packet(PF_BRIDGE, hooknr, skb, in, out, &li,
-                             "%s", info->prefix);
+                             "%s", info->prefix);
        else
                ebt_log_packet(PF_BRIDGE, hooknr, skb, in, out, &li,
-                              info->prefix);
+                              info->prefix);
 }
 
 static struct ebt_watcher log =
@@ -199,7 +199,7 @@ static int __init ebt_log_init(void)
        if (nf_log_register(PF_BRIDGE, &ebt_log_logger) < 0) {
                printk(KERN_WARNING "ebt_log: not logging via system console "
                       "since somebody else already registered for PF_INET\n");
-               /* we cannot make module load fail here, since otherwise 
+               /* we cannot make module load fail here, since otherwise
                 * ebtables userspace would abort */
        }
 
@@ -208,7 +208,7 @@ static int __init ebt_log_init(void)
 
 static void __exit ebt_log_fini(void)
 {
-       nf_log_unregister_logger(&ebt_log_logger);
+       nf_log_unregister(&ebt_log_logger);
        ebt_unregister_watcher(&log);
 }
 
index 025869ee0b68945b11d1331d6886123adbdd09dd..6b0d2169af74e379b468ea47dc8b47d6e26d5add 100644 (file)
@@ -26,7 +26,7 @@ static int ebt_filter_mark(const struct sk_buff *skb,
 static int ebt_mark_check(const char *tablename, unsigned int hookmask,
    const struct ebt_entry *e, void *data, unsigned int datalen)
 {
-        struct ebt_mark_m_info *info = (struct ebt_mark_m_info *) data;
+       struct ebt_mark_m_info *info = (struct ebt_mark_m_info *) data;
 
        if (datalen != EBT_ALIGN(sizeof(struct ebt_mark_m_info)))
                return -EINVAL;
index a0bed82145eda9fcb02d88d8a7edb1a6e577f922..31b77367319cb3949e5c9f61f27ce3c184225067 100644 (file)
@@ -62,7 +62,7 @@ static int ebt_filter_config(struct ebt_stp_info *info,
                verdict = 0;
                for (i = 0; i < 6; i++)
                        verdict |= (stpc->root[2+i] ^ c->root_addr[i]) &
-                                  c->root_addrmsk[i];
+                                  c->root_addrmsk[i];
                if (FWINV(verdict != 0, EBT_STP_ROOTADDR))
                        return EBT_NOMATCH;
        }
@@ -82,7 +82,7 @@ static int ebt_filter_config(struct ebt_stp_info *info,
                verdict = 0;
                for (i = 0; i < 6; i++)
                        verdict |= (stpc->sender[2+i] ^ c->sender_addr[i]) &
-                                  c->sender_addrmsk[i];
+                                  c->sender_addrmsk[i];
                if (FWINV(verdict != 0, EBT_STP_SENDERADDR))
                        return EBT_NOMATCH;
        }
index c1af68b5a29cacdd05ade7f014852d4809e2e1c7..8e15cc47f6c0995b714727cf9f8d319ad5b6c5da 100644 (file)
@@ -10,8 +10,8 @@
  * Based on ipt_ULOG.c, which is
  * (C) 2000-2002 by Harald Welte <laforge@netfilter.org>
  *
- * This module accepts two parameters: 
- * 
+ * This module accepts two parameters:
+ *
  * nlbufsiz:
  *   The parameter specifies how big the buffer for each netlink multicast
  * group is. e.g. If you say nlbufsiz=8192, up to eight kb of packets will
 #include "../br_private.h"
 
 #define PRINTR(format, args...) do { if (net_ratelimit()) \
-                                printk(format , ## args); } while (0)
+                               printk(format , ## args); } while (0)
 
 static unsigned int nlbufsiz = NLMSG_GOODSIZE;
 module_param(nlbufsiz, uint, 0600);
 MODULE_PARM_DESC(nlbufsiz, "netlink buffer size (number of bytes) "
-                           "(defaults to 4096)");
+                          "(defaults to 4096)");
 
 static unsigned int flushtimeout = 10;
 module_param(flushtimeout, uint, 0600);
 MODULE_PARM_DESC(flushtimeout, "buffer flush timeout (hundredths ofa second) "
-                               "(defaults to 10)");
+                              "(defaults to 10)");
 
 typedef struct {
        unsigned int qlen;              /* number of nlmsgs' in the skb */
@@ -157,7 +157,7 @@ static void ebt_ulog_packet(unsigned int hooknr, const struct sk_buff *skb,
        }
 
        nlh = NLMSG_PUT(ub->skb, 0, ub->qlen, 0,
-                       size - NLMSG_ALIGN(sizeof(*nlh)));
+                       size - NLMSG_ALIGN(sizeof(*nlh)));
        ub->qlen++;
 
        pm = NLMSG_DATA(nlh);
@@ -302,7 +302,7 @@ static int __init ebt_ulog_init(void)
        }
 
        ebtulognl = netlink_kernel_create(NETLINK_NFLOG, EBT_ULOG_MAXNLGROUPS,
-                                         NULL, THIS_MODULE);
+                                         NULL, THIS_MODULE);
        if (!ebtulognl)
                ret = -ENOMEM;
        else if ((ret = ebt_register_watcher(&ulog)))
@@ -323,7 +323,7 @@ static void __exit ebt_ulog_fini(void)
        ebt_ulog_buff_t *ub;
        int i;
 
-       nf_log_unregister_logger(&ebt_ulog_logger);
+       nf_log_unregister(&ebt_ulog_logger);
        ebt_unregister_watcher(&ulog);
        for (i = 0; i < EBT_ULOG_MAXNLGROUPS; i++) {
                ub = &ulog_buffers[i];
@@ -344,4 +344,4 @@ module_exit(ebt_ulog_fini);
 MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Bart De Schuymer <bdschuym@pandora.be>");
 MODULE_DESCRIPTION("ebtables userspace logging module for bridged Ethernet"
-                   " frames");
+                  " frames");
index 7ee377622964d46e1bb57687c6af01587fe37fa3..a43c697d3d7305dc4bc48d66254e4aa8cdacff63 100644 (file)
@@ -128,9 +128,9 @@ ebt_check_vlan(const char *tablename,
 
        /* Reserved VLAN ID (VID) values
         * -----------------------------
-        * 0 - The null VLAN ID. 
+        * 0 - The null VLAN ID.
         * 1 - The default Port VID (PVID)
-        * 0x0FFF - Reserved for implementation use. 
+        * 0x0FFF - Reserved for implementation use.
         * if_vlan.h: VLAN_GROUP_ARRAY_LEN 4096. */
        if (GET_BITMASK(EBT_VLAN_ID)) {
                if (!!info->id) { /* if id!=0 => check vid range */
@@ -141,7 +141,7 @@ ebt_check_vlan(const char *tablename,
                                return -EINVAL;
                        }
                        /* Note: This is valid VLAN-tagged frame point.
-                        * Any value of user_priority are acceptable, 
+                        * Any value of user_priority are acceptable,
                         * but should be ignored according to 802.1Q Std.
                         * So we just drop the prio flag. */
                        info->bitmask &= ~EBT_VLAN_PRIO;
index 127135ead2d5ade31f30571425fd15085e0920cf..81d84145c417ca8eda14cca79734f66a5f85bbd6 100644 (file)
@@ -51,10 +51,10 @@ static int check(const struct ebt_table_info *info, unsigned int valid_hooks)
 }
 
 static struct ebt_table frame_filter =
-{ 
+{
        .name           = "filter",
        .table          = &initial_table,
-       .valid_hooks    = FILTER_VALID_HOOKS, 
+       .valid_hooks    = FILTER_VALID_HOOKS,
        .lock           = RW_LOCK_UNLOCKED,
        .check          = check,
        .me             = THIS_MODULE,
index 6c84ccb8c9d754d045bc6351812917f6cfbd3cb3..34c49799f9b303a11d70c3c1f6839fe403a2e43c 100644 (file)
@@ -16,7 +16,6 @@
  */
 
 /* used for print_string */
-#include <linux/sched.h>
 #include <linux/tty.h>
 
 #include <linux/kmod.h>
 #include "../br_private.h"
 
 #define BUGPRINT(format, args...) printk("kernel msg: ebtables bug: please "\
-                                         "report to author: "format, ## args)
+                                        "report to author: "format, ## args)
 /* #define BUGPRINT(format, args...) */
 #define MEMPRINT(format, args...) printk("kernel msg: ebtables "\
-                                         ": out of memory: "format, ## args)
+                                        ": out of memory: "format, ## args)
 /* #define MEMPRINT(format, args...) */
 
 
@@ -482,7 +481,7 @@ ebt_check_entry_size_and_hooks(struct ebt_entry *e,
                   as it said it has */
                if (*n != *cnt) {
                        BUGPRINT("nentries does not equal the nr of entries "
-                                "in the chain\n");
+                                "in the chain\n");
                        return -EINVAL;
                }
                if (((struct ebt_entries *)e)->policy != EBT_DROP &&
@@ -809,7 +808,7 @@ static int translate_table(char *name, struct ebt_table_info *newinfo)
        i = 0; /* holds the expected nr. of entries for the chain */
        j = 0; /* holds the up to now counted entries for the chain */
        k = 0; /* holds the total nr. of entries, should equal
-                 newinfo->nentries afterwards */
+                 newinfo->nentries afterwards */
        udc_cnt = 0; /* will hold the nr. of user defined chains (udc) */
        ret = EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
           ebt_check_entry_size_and_hooks, newinfo,
@@ -820,7 +819,7 @@ static int translate_table(char *name, struct ebt_table_info *newinfo)
 
        if (i != j) {
                BUGPRINT("nentries does not equal the nr of entries in the "
-                        "(last) chain\n");
+                        "(last) chain\n");
                return -EINVAL;
        }
        if (k != newinfo->nentries) {
@@ -835,7 +834,7 @@ static int translate_table(char *name, struct ebt_table_info *newinfo)
                   if an error occurs */
                newinfo->chainstack =
                        vmalloc((highest_possible_processor_id()+1)
-                                       * sizeof(*(newinfo->chainstack)));
+                                       * sizeof(*(newinfo->chainstack)));
                if (!newinfo->chainstack)
                        return -ENOMEM;
                for_each_possible_cpu(i) {
@@ -948,7 +947,7 @@ static int do_replace(void __user *user, unsigned int len)
        if (tmp.num_counters >= INT_MAX / sizeof(struct ebt_counter))
                return -ENOMEM;
 
-       countersize = COUNTER_OFFSET(tmp.nentries) * 
+       countersize = COUNTER_OFFSET(tmp.nentries) *
                                        (highest_possible_processor_id()+1);
        newinfo = vmalloc(sizeof(*newinfo) + countersize);
        if (!newinfo)
@@ -1350,7 +1349,7 @@ static inline int ebt_make_names(struct ebt_entry *e, char *base, char __user *u
 
        hlp = ubase + (((char *)e + e->target_offset) - base);
        t = (struct ebt_entry_target *)(((char *)e) + e->target_offset);
-       
+
        ret = EBT_MATCH_ITERATE(e, ebt_make_matchname, base, ubase);
        if (ret != 0)
                return ret;
index 52d32f1bc7281c6da3276ae78a0cad1e63aa4426..1f32866d09b7f3ba6deae83fdffd7044fb8e3b6a 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
  * 32bit Socket syscall emulation. Based on arch/sparc64/kernel/sys_sparc32.c.
  *
  * Copyright (C) 2000          VA Linux Co
@@ -8,12 +8,11 @@
  * Copyright (C) 1997          David S. Miller (davem@caip.rutgers.edu)
  * Copyright (C) 2000          Hewlett-Packard Co.
  * Copyright (C) 2000          David Mosberger-Tang <davidm@hpl.hp.com>
- * Copyright (C) 2000,2001     Andi Kleen, SuSE Labs 
+ * Copyright (C) 2000,2001     Andi Kleen, SuSE Labs
  */
 
 #include <linux/kernel.h>
 #include <linux/fs.h>
-#include <linux/sched.h>
 #include <linux/types.h>
 #include <linux/file.h>
 #include <linux/icmpv6.h>
@@ -225,14 +224,14 @@ int put_cmsg_compat(struct msghdr *kmsg, int level, int type, int len, void *dat
                return 0; /* XXX: return error? check spec. */
        }
 
-       if (level == SOL_SOCKET && type == SO_TIMESTAMP) { 
+       if (level == SOL_SOCKET && type == SO_TIMESTAMP) {
                struct timeval *tv = (struct timeval *)data;
                ctv.tv_sec = tv->tv_sec;
                ctv.tv_usec = tv->tv_usec;
                data = &ctv;
                len = sizeof(struct compat_timeval);
-       } 
-       
+       }
+
        cmlen = CMSG_COMPAT_LEN(len);
        if(kmsg->msg_controllen < cmlen) {
                kmsg->msg_flags |= MSG_CTRUNC;
@@ -419,7 +418,7 @@ static int do_set_attach_filter(struct socket *sock, int level, int optname,
                                char __user *optval, int optlen)
 {
        struct compat_sock_fprog __user *fprog32 = (struct compat_sock_fprog __user *)optval;
-       struct sock_fprog __user *kfprog = compat_alloc_user_space(sizeof(struct sock_fprog)); 
+       struct sock_fprog __user *kfprog = compat_alloc_user_space(sizeof(struct sock_fprog));
        compat_uptr_t ptr;
        u16 len;
 
@@ -610,14 +609,14 @@ asmlinkage long compat_sys_socketcall(int call, u32 __user *args)
        int ret;
        u32 a[6];
        u32 a0, a1;
-                                
+
        if (call < SYS_SOCKET || call > SYS_RECVMSG)
                return -EINVAL;
        if (copy_from_user(a, args, nas[call]))
                return -EFAULT;
        a0 = a[0];
        a1 = a[1];
-       
+
        switch(call) {
        case SYS_SOCKET:
                ret = sys_socket(a0, a1, a[2]);
index 797fdd4352ce50e3bf1ef2de7e3e7f686d2258c4..186212b5b7da4a943690982ae7f3bd8743eed220 100644 (file)
@@ -430,7 +430,7 @@ EXPORT_SYMBOL(__skb_checksum_complete);
  *     @skb: skbuff
  *     @hlen: hardware length
  *     @iov: io vector
- * 
+ *
  *     Caller _must_ check that skb will fit to this iovec.
  *
  *     Returns: 0       - success.
index 1e94a1b9a0f4f1b588b88dde9d8c88a1cf39c10f..cf71614dae93bf29d5211b86dc487c9e9a82faff 100644 (file)
@@ -255,7 +255,7 @@ static int netdev_nit;
  *     is linked into kernel lists and may not be freed until it has been
  *     removed from the kernel lists.
  *
- *     This call does not sleep therefore it can not 
+ *     This call does not sleep therefore it can not
  *     guarantee all CPU's that are in middle of receiving packets
  *     will see the new packet type (until the next received packet).
  */
@@ -282,7 +282,7 @@ void dev_add_pack(struct packet_type *pt)
  *     Remove a protocol handler that was previously added to the kernel
  *     protocol handlers by dev_add_pack(). The passed &packet_type is removed
  *     from the kernel lists and can be freed or reused once this function
- *     returns. 
+ *     returns.
  *
  *      The packet type might still be in use by receivers
  *     and must not be freed until after all the CPU's have gone
@@ -327,7 +327,7 @@ out:
 void dev_remove_pack(struct packet_type *pt)
 {
        __dev_remove_pack(pt);
-       
+
        synchronize_net();
 }
 
@@ -607,7 +607,7 @@ EXPORT_SYMBOL(dev_getfirstbyhwtype);
  *     @mask: bitmask of bits in if_flags to check
  *
  *     Search for any interface with the given flags. Returns NULL if a device
- *     is not found or a pointer to the device. The device returned has 
+ *     is not found or a pointer to the device. The device returned has
  *     had a reference added and the pointer is safe until the user calls
  *     dev_put to indicate they have finished with it.
  */
@@ -802,7 +802,7 @@ void netdev_state_change(struct net_device *dev)
 
 void dev_load(const char *name)
 {
-       struct net_device *dev;  
+       struct net_device *dev;
 
        read_lock(&dev_base_lock);
        dev = __dev_get_by_name(name);
@@ -860,7 +860,7 @@ int dev_open(struct net_device *dev)
                        clear_bit(__LINK_STATE_START, &dev->state);
        }
 
-       /*
+       /*
         *      If it went open OK then:
         */
 
@@ -964,7 +964,7 @@ int dev_close(struct net_device *dev)
  *     is returned on a failure.
  *
  *     When registered all registration and up events are replayed
- *     to the new notifier to allow device to have a race free 
+ *     to the new notifier to allow device to have a race free
  *     view of the network device list.
  */
 
@@ -979,7 +979,7 @@ int register_netdevice_notifier(struct notifier_block *nb)
                for (dev = dev_base; dev; dev = dev->next) {
                        nb->notifier_call(nb, NETDEV_REGISTER, dev);
 
-                       if (dev->flags & IFF_UP) 
+                       if (dev->flags & IFF_UP)
                                nb->notifier_call(nb, NETDEV_UP, dev);
                }
        }
@@ -1157,7 +1157,7 @@ void netif_device_attach(struct net_device *dev)
        if (!test_and_set_bit(__LINK_STATE_PRESENT, &dev->state) &&
            netif_running(dev)) {
                netif_wake_queue(dev);
-               __netdev_watchdog_up(dev);
+               __netdev_watchdog_up(dev);
        }
 }
 EXPORT_SYMBOL(netif_device_attach);
@@ -1197,7 +1197,7 @@ int skb_checksum_help(struct sk_buff *skb)
 
 out_set_summed:
        skb->ip_summed = CHECKSUM_NONE;
-out:   
+out:
        return ret;
 }
 
@@ -1258,7 +1258,7 @@ EXPORT_SYMBOL(skb_gso_segment);
 void netdev_rx_csum_fault(struct net_device *dev)
 {
        if (net_ratelimit()) {
-               printk(KERN_ERR "%s: hw csum failure.\n", 
+               printk(KERN_ERR "%s: hw csum failure.\n",
                        dev ? dev->name : "<unknown>");
                dump_stack();
        }
@@ -1372,7 +1372,7 @@ gso:
                if (unlikely(netif_queue_stopped(dev) && skb->next))
                        return NETDEV_TX_BUSY;
        } while (skb->next);
-       
+
        skb->destructor = DEV_GSO_CB(skb)->destructor;
 
 out_kfree_skb:
@@ -1449,25 +1449,25 @@ int dev_queue_xmit(struct sk_buff *skb)
            (!(dev->features & NETIF_F_GEN_CSUM) &&
             (!(dev->features & NETIF_F_IP_CSUM) ||
              skb->protocol != htons(ETH_P_IP))))
-               if (skb_checksum_help(skb))
-                       goto out_kfree_skb;
+               if (skb_checksum_help(skb))
+                       goto out_kfree_skb;
 
 gso:
        spin_lock_prefetch(&dev->queue_lock);
 
-       /* Disable soft irqs for various locks below. Also 
-        * stops preemption for RCU. 
+       /* Disable soft irqs for various locks below. Also
+        * stops preemption for RCU.
         */
-       rcu_read_lock_bh(); 
+       rcu_read_lock_bh();
 
-       /* Updates of qdisc are serialized by queue_lock. 
-        * The struct Qdisc which is pointed to by qdisc is now a 
-        * rcu structure - it may be accessed without acquiring 
+       /* Updates of qdisc are serialized by queue_lock.
+        * The struct Qdisc which is pointed to by qdisc is now a
+        * rcu structure - it may be accessed without acquiring
         * a lock (but the structure may be stale.) The freeing of the
-        * qdisc will be deferred until it's known that there are no 
+        * qdisc will be deferred until it's known that there are no
         * more references to it.
-        * 
-        * If the qdisc has an enqueue function, we still need to 
+        *
+        * If the qdisc has an enqueue function, we still need to
         * hold the queue_lock before calling it, since queue_lock
         * also serializes access to the device queue.
         */
@@ -1715,8 +1715,8 @@ static __inline__ int handle_bridge(struct sk_buff **pskb,
        if (*pt_prev) {
                *ret = deliver_skb(*pskb, *pt_prev, orig_dev);
                *pt_prev = NULL;
-       } 
-       
+       }
+
        return br_handle_frame_hook(port, pskb);
 }
 #else
@@ -1728,16 +1728,16 @@ static __inline__ int handle_bridge(struct sk_buff **pskb,
  * when CONFIG_NET_CLS_ACT is? otherwise some useless instructions
  * a compare and 2 stores extra right now if we dont have it on
  * but have CONFIG_NET_CLS_ACT
- * NOTE: This doesnt stop any functionality; if you dont have 
+ * NOTE: This doesnt stop any functionality; if you dont have
  * the ingress scheduler, you just cant add policies on ingress.
  *
  */
-static int ing_filter(struct sk_buff *skb) 
+static int ing_filter(struct sk_buff *skb)
 {
        struct Qdisc *q;
        struct net_device *dev = skb->dev;
        int result = TC_ACT_OK;
-       
+
        if (dev->qdisc_ingress) {
                __u32 ttl = (__u32) G_TC_RTTL(skb->tc_verd);
                if (MAX_RED_LOOP < ttl++) {
@@ -1801,7 +1801,7 @@ int netif_receive_skb(struct sk_buff *skb)
 
        list_for_each_entry_rcu(ptype, &ptype_all, list) {
                if (!ptype->dev || ptype->dev == skb->dev) {
-                       if (pt_prev) 
+                       if (pt_prev)
                                ret = deliver_skb(skb, pt_prev, orig_dev);
                        pt_prev = ptype;
                }
@@ -1833,7 +1833,7 @@ ncls:
        list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type)&15], list) {
                if (ptype->type == type &&
                    (!ptype->dev || ptype->dev == skb->dev)) {
-                       if (pt_prev) 
+                       if (pt_prev)
                                ret = deliver_skb(skb, pt_prev, orig_dev);
                        pt_prev = ptype;
                }
@@ -2061,7 +2061,7 @@ static int dev_ifconf(char __user *arg)
                                total += done;
                        }
                }
-       }
+       }
 
        /*
         *      All done.  Write the updated control block back to the caller.
@@ -2154,7 +2154,7 @@ static struct netif_rx_stats *softnet_get_online(loff_t *pos)
        struct netif_rx_stats *rc = NULL;
 
        while (*pos < NR_CPUS)
-               if (cpu_online(*pos)) {
+               if (cpu_online(*pos)) {
                        rc = &per_cpu(netdev_rx_stat, *pos);
                        break;
                } else
@@ -2200,7 +2200,7 @@ static int dev_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &dev_seq_ops);
 }
 
-static struct file_operations dev_seq_fops = {
+static const struct file_operations dev_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = dev_seq_open,
        .read    = seq_read,
@@ -2220,7 +2220,7 @@ static int softnet_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &softnet_seq_ops);
 }
 
-static struct file_operations softnet_seq_fops = {
+static const struct file_operations softnet_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = softnet_seq_open,
        .read    = seq_read,
@@ -2282,7 +2282,7 @@ int netdev_set_master(struct net_device *slave, struct net_device *master)
        }
 
        slave->master = master;
-       
+
        synchronize_net();
 
        if (old)
@@ -2319,13 +2319,13 @@ void dev_set_promiscuity(struct net_device *dev, int inc)
                dev_mc_upload(dev);
                printk(KERN_INFO "device %s %s promiscuous mode\n",
                       dev->name, (dev->flags & IFF_PROMISC) ? "entered" :
-                                                              "left");
+                                                              "left");
                audit_log(current->audit_context, GFP_ATOMIC,
                        AUDIT_ANOM_PROMISCUOUS,
                        "dev=%s prom=%d old_prom=%d auid=%u",
                        dev->name, (dev->flags & IFF_PROMISC),
                        (old_flags & IFF_PROMISC),
-                       audit_get_loginuid(current->audit_context)); 
+                       audit_get_loginuid(current->audit_context));
        }
 }
 
@@ -2816,7 +2816,7 @@ int dev_ioctl(unsigned int cmd, void __user *arg)
                                rtnl_unlock();
                                if (IW_IS_GET(cmd) &&
                                    copy_to_user(arg, &ifr,
-                                                sizeof(struct ifreq)))
+                                                sizeof(struct ifreq)))
                                        ret = -EFAULT;
                                return ret;
                        }
@@ -2906,7 +2906,7 @@ int register_netdevice(struct net_device *dev)
                        goto out;
                }
        }
+
        if (!dev_valid_name(dev->name)) {
                ret = -EINVAL;
                goto out;
@@ -2923,9 +2923,9 @@ int register_netdevice(struct net_device *dev)
                        = hlist_entry(p, struct net_device, name_hlist);
                if (!strncmp(d->name, dev->name, IFNAMSIZ)) {
                        ret = -EEXIST;
-                       goto out;
+                       goto out;
                }
-       }
+       }
 
        /* Fix illegal SG+CSUM combinations. */
        if ((dev->features & NETIF_F_SG) &&
@@ -3024,7 +3024,7 @@ int register_netdev(struct net_device *dev)
                if (err < 0)
                        goto out;
        }
-       
+
        err = register_netdevice(dev);
 out:
        rtnl_unlock();
@@ -3041,7 +3041,7 @@ EXPORT_SYMBOL(register_netdev);
  * for netdevice notification, and cleanup and put back the
  * reference if they receive an UNREGISTER event.
  * We can get stuck here if buggy protocols don't correctly
- * call dev_put. 
+ * call dev_put.
  */
 static void netdev_wait_allrefs(struct net_device *dev)
 {
@@ -3205,8 +3205,8 @@ EXPORT_SYMBOL(alloc_netdev);
  *     free_netdev - free network device
  *     @dev: device
  *
- *     This function does the last stage of destroying an allocated device 
- *     interface. The reference to the device object is released.  
+ *     This function does the last stage of destroying an allocated device
+ *     interface. The reference to the device object is released.
  *     If this is the last reference then it will be freed.
  */
 void free_netdev(struct net_device *dev)
@@ -3227,9 +3227,9 @@ void free_netdev(struct net_device *dev)
        kfree((char *)dev - dev->padded);
 #endif
 }
+
 /* Synchronize with packet receive processing. */
-void synchronize_net(void) 
+void synchronize_net(void)
 {
        might_sleep();
        synchronize_rcu();
@@ -3291,12 +3291,12 @@ void unregister_netdevice(struct net_device *dev)
        /* Shutdown queueing discipline. */
        dev_shutdown(dev);
 
-       
+
        /* Notify protocols, that we are about to destroy
           this device. They should clean all the things.
        */
        raw_notifier_call_chain(&netdev_chain, NETDEV_UNREGISTER, dev);
-       
+
        /*
         *      Flush the multicast chain
         */
@@ -3483,7 +3483,7 @@ static int __init net_dev_init(void)
                goto out;
 
        INIT_LIST_HEAD(&ptype_all);
-       for (i = 0; i < 16; i++) 
+       for (i = 0; i < 16; i++)
                INIT_LIST_HEAD(&ptype_base[i]);
 
        for (i = 0; i < ARRAY_SIZE(dev_name_head); i++)
index b22648d04d365f1ce92a9eecf370effd6d32b202..56b310c0c860af79db12593d6efbe48f793e034d 100644 (file)
@@ -1,12 +1,12 @@
 /*
- *     Linux NET3:     Multicast List maintenance. 
+ *     Linux NET3:     Multicast List maintenance.
  *
  *     Authors:
- *             Tim Kordas <tjk@nostromo.eeap.cwru.edu> 
+ *             Tim Kordas <tjk@nostromo.eeap.cwru.edu>
  *             Richard Underwood <richard@wuzz.demon.co.uk>
  *
  *     Stir fried together from the IP multicast and CAP patches above
- *             Alan Cox <Alan.Cox@linux.org>   
+ *             Alan Cox <Alan.Cox@linux.org>
  *
  *     Fixes:
  *             Alan Cox        :       Update the device on a real delete
@@ -27,7 +27,6 @@
 #include <linux/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
 
 
 /*
- *     Device multicast list maintenance. 
+ *     Device multicast list maintenance.
  *
- *     This is used both by IP and by the user level maintenance functions. 
- *     Unlike BSD we maintain a usage count on a given multicast address so 
- *     that a casual user application can add/delete multicasts used by 
+ *     This is used both by IP and by the user level maintenance functions.
+ *     Unlike BSD we maintain a usage count on a given multicast address so
+ *     that a casual user application can add/delete multicasts used by
  *     protocols without doing damage to the protocols when it deletes the
  *     entries. It also helps IP as it tracks overlapping maps.
  *
@@ -67,7 +66,7 @@
 /*
  *     Update the multicast list into the physical NIC controller.
  */
+
 static void __dev_mc_upload(struct net_device *dev)
 {
        /* Don't do anything till we up the interface
@@ -100,7 +99,7 @@ void dev_mc_upload(struct net_device *dev)
 /*
  *     Delete a device level multicast
  */
+
 int dev_mc_delete(struct net_device *dev, void *addr, int alen, int glbl)
 {
        int err = 0;
@@ -137,7 +136,7 @@ int dev_mc_delete(struct net_device *dev, void *addr, int alen, int glbl)
                         *      loaded filter is now wrong. Fix it
                         */
                        __dev_mc_upload(dev);
-                       
+
                        netif_tx_unlock_bh(dev);
                        return 0;
                }
@@ -151,7 +150,7 @@ done:
 /*
  *     Add a device level multicast
  */
+
 int dev_mc_add(struct net_device *dev, void *addr, int alen, int glbl)
 {
        int err = 0;
@@ -187,7 +186,7 @@ int dev_mc_add(struct net_device *dev, void *addr, int alen, int glbl)
        dev->mc_count++;
 
        __dev_mc_upload(dev);
-       
+
        netif_tx_unlock_bh(dev);
        return 0;
 
@@ -204,7 +203,7 @@ done:
 void dev_mc_discard(struct net_device *dev)
 {
        netif_tx_lock_bh(dev);
-       
+
        while (dev->mc_list != NULL) {
                struct dev_mc_list *tmp = dev->mc_list;
                dev->mc_list = tmp->next;
@@ -225,7 +224,7 @@ static void *dev_mc_seq_start(struct seq_file *seq, loff_t *pos)
 
        read_lock(&dev_base_lock);
        for (dev = dev_base; dev; dev = dev->next) {
-               if (off++ == *pos) 
+               if (off++ == *pos)
                        return dev;
        }
        return NULL;
@@ -277,7 +276,7 @@ static int dev_mc_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &dev_mc_seq_ops);
 }
 
-static struct file_operations dev_mc_seq_fops = {
+static const struct file_operations dev_mc_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = dev_mc_seq_open,
        .read    = seq_read,
index 1a53fb39b7e008efa67709bcd4ac984426e064df..764bccb3d99265b2a014b41167d999cf1574e639 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/mm.h>
 #include <linux/module.h>
 #include <linux/netdevice.h>
-#include <linux/sched.h>
 #include <linux/skbuff.h>
 #include <linux/string.h>
 #include <linux/types.h>
@@ -29,7 +28,7 @@
  * 4) All operations modify state, so a spinlock is used.
  */
 static struct dst_entry        *dst_garbage_list;
-#if RT_CACHE_DEBUG >= 2 
+#if RT_CACHE_DEBUG >= 2
 static atomic_t                         dst_total = ATOMIC_INIT(0);
 #endif
 static DEFINE_SPINLOCK(dst_lock);
@@ -132,17 +131,16 @@ void * dst_alloc(struct dst_ops * ops)
                if (ops->gc())
                        return NULL;
        }
-       dst = kmem_cache_alloc(ops->kmem_cachep, GFP_ATOMIC);
+       dst = kmem_cache_zalloc(ops->kmem_cachep, GFP_ATOMIC);
        if (!dst)
                return NULL;
-       memset(dst, 0, ops->entry_size);
        atomic_set(&dst->__refcnt, 0);
        dst->ops = ops;
        dst->lastuse = jiffies;
        dst->path = dst;
        dst->input = dst_discard_in;
        dst->output = dst_discard_out;
-#if RT_CACHE_DEBUG >= 2 
+#if RT_CACHE_DEBUG >= 2
        atomic_inc(&dst_total);
 #endif
        atomic_inc(&ops->entries);
@@ -203,7 +201,7 @@ again:
                dst->ops->destroy(dst);
        if (dst->dev)
                dev_put(dst->dev);
-#if RT_CACHE_DEBUG >= 2 
+#if RT_CACHE_DEBUG >= 2
        atomic_dec(&dst_total);
 #endif
        kmem_cache_free(dst->ops->kmem_cachep, dst);
index 87dc556fd9d6c694f65e33c6868aebdeef8325cc..6168edd137dd39e0a986d3226115ff38091fbef1 100644 (file)
@@ -17,7 +17,7 @@
 #include <linux/netdevice.h>
 #include <asm/uaccess.h>
 
-/* 
+/*
  * Some useful ethtool_ops methods that're device independent.
  * If we find that all drivers want to do the same thing here,
  * we can turn these into dev_() function calls.
@@ -87,12 +87,12 @@ int ethtool_op_get_perm_addr(struct net_device *dev, struct ethtool_perm_addr *a
        unsigned char len = dev->addr_len;
        if ( addr->size < len )
                return -ETOOSMALL;
-       
+
        addr->size = len;
        memcpy(data, dev->perm_addr, len);
        return 0;
 }
+
 
 u32 ethtool_op_get_ufo(struct net_device *dev)
 {
@@ -550,7 +550,7 @@ static int ethtool_set_sg(struct net_device *dev, char __user *useraddr)
        if (copy_from_user(&edata, useraddr, sizeof(edata)))
                return -EFAULT;
 
-       if (edata.data && 
+       if (edata.data &&
            !(dev->features & NETIF_F_ALL_CSUM))
                return -EINVAL;
 
@@ -951,7 +951,7 @@ int dev_ethtool(struct ifreq *ifr)
        default:
                rc =  -EOPNOTSUPP;
        }
-       
+
        if(dev->ethtool_ops->complete)
                dev->ethtool_ops->complete(dev);
 
index 0df843b667f45fc44cdf6d83d60523268fb71502..8d185a089c53cdce1dced05fe08a6cd48f4d8f9e 100644 (file)
@@ -18,7 +18,6 @@
 
 #include <linux/module.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/fcntl.h>
 #include <linux/socket.h>
@@ -53,7 +52,7 @@ static void *__load_pointer(struct sk_buff *skb, int k)
 }
 
 static inline void *load_pointer(struct sk_buff *skb, int k,
-                                 unsigned int size, void *buffer)
+                                unsigned int size, void *buffer)
 {
        if (k >= 0)
                return skb_header_pointer(skb, k, size, buffer);
@@ -91,7 +90,7 @@ unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int
         */
        for (pc = 0; pc < flen; pc++) {
                fentry = &filter[pc];
-                       
+
                switch (fentry->code) {
                case BPF_ALU|BPF_ADD|BPF_X:
                        A += X;
@@ -399,7 +398,7 @@ int sk_chk_filter(struct sock_filter *filter, int flen)
  */
 int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk)
 {
-       struct sk_filter *fp; 
+       struct sk_filter *fp;
        unsigned int fsize = sizeof(struct sock_filter) * fprog->len;
        int err;
 
@@ -411,7 +410,7 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk)
        if (!fp)
                return -ENOMEM;
        if (copy_from_user(fp->insns, fprog->filter, fsize)) {
-               sock_kfree_s(sk, fp, fsize+sizeof(*fp)); 
+               sock_kfree_s(sk, fp, fsize+sizeof(*fp));
                return -EFAULT;
        }
 
index 3cad026764f0c9b94f9615ee22da0f9b4ed16833..17daf4c9f79384ad0005fbec5780cc8bd6f63321 100644 (file)
@@ -144,7 +144,7 @@ static void est_timer(unsigned long arg)
  * configuration TLV is created. Upon each interval, the latest statistics
  * will be read from &bstats and the estimated rate will be stored in
  * &rate_est with the statistics lock grabed during this period.
- * 
+ *
  * Returns 0 on success or a negative error code.
  */
 int gen_new_estimator(struct gnet_stats_basic *bstats,
@@ -231,7 +231,7 @@ void gen_kill_estimator(struct gnet_stats_basic *bstats,
  *
  * Replaces the configuration of a rate estimator by calling
  * gen_kill_estimator() and gen_new_estimator().
- * 
+ *
  * Returns 0 on success or a negative error code.
  */
 int
@@ -242,7 +242,7 @@ gen_replace_estimator(struct gnet_stats_basic *bstats,
     gen_kill_estimator(bstats, rate_est);
     return gen_new_estimator(bstats, rate_est, stats_lock, opt);
 }
-    
+
 
 EXPORT_SYMBOL(gen_kill_estimator);
 EXPORT_SYMBOL(gen_new_estimator);
index 8f21490355fa5b45e64363e3e786a016bbfb238f..259473d0559d1ed713887c6a21f90181a1a1c5a5 100644 (file)
@@ -57,7 +57,7 @@ gnet_stats_start_copy_compat(struct sk_buff *skb, int type, int tc_stats_type,
        int xstats_type, spinlock_t *lock, struct gnet_dump *d)
 {
        memset(d, 0, sizeof(*d));
-       
+
        spin_lock_bh(lock);
        d->lock = lock;
        if (type)
index 04b249c40b5b24a12f0e24165621cc182b1ec1c4..755c37fdaee799c734962a1739dafdbb71882ff5 100644 (file)
@@ -18,7 +18,6 @@
 
 #include <linux/errno.h>
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/kernel.h>
 #include <linux/mm.h>
 #include <linux/slab.h>
@@ -40,7 +39,7 @@
 int verify_iovec(struct msghdr *m, struct iovec *iov, char *address, int mode)
 {
        int size, err, ct;
-       
+
        if (m->msg_namelen) {
                if (mode == VERIFY_READ) {
                        err = move_addr_to_kernel(m->msg_name, m->msg_namelen,
@@ -79,7 +78,7 @@ int verify_iovec(struct msghdr *m, struct iovec *iov, char *address, int mode)
  *
  *     Note: this modifies the original iovec.
  */
+
 int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len)
 {
        while (len > 0) {
@@ -103,7 +102,7 @@ int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len)
  *
  *     Note: this modifies the original iovec.
  */
+
 int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len)
 {
        while (len > 0) {
@@ -209,7 +208,7 @@ int csum_partial_copy_fromiovecend(unsigned char *kdata, struct iovec *iov,
                        if (partial_cnt) {
                                copy -= partial_cnt;
                                if (copy_from_user(kdata + copy, base + copy,
-                                               partial_cnt))
+                                               partial_cnt))
                                        goto out_fault;
                        }
                }
@@ -224,7 +223,7 @@ int csum_partial_copy_fromiovecend(unsigned char *kdata, struct iovec *iov,
                kdata += copy + partial_cnt;
                iov++;
        }
-        *csump = csum;
+       *csump = csum;
 out:
        return err;
 
index 549a2ce951b04b01ccd8a316b10a51be33da148a..8b45c9d3b2490ce22bfdffd522dd5530439e8ca3 100644 (file)
@@ -124,7 +124,7 @@ void linkwatch_run_queue(void)
 
                dev_put(dev);
        }
-}       
+}
 
 
 static void linkwatch_event(struct work_struct *dummy)
@@ -133,7 +133,7 @@ static void linkwatch_event(struct work_struct *dummy)
         * per second so that a runaway driver does not
         * cause a storm of messages on the netlink
         * socket
-        */     
+        */
        linkwatch_nextevent = jiffies + HZ;
        clear_bit(LW_RUNNING, &linkwatch_flags);
 
index 054d46493d2be47b4ab9b4a467dd8f08052b5bf3..3183142c6044000b93829b4e340a3675a0c7d146 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/socket.h>
-#include <linux/sched.h>
 #include <linux/netdevice.h>
 #include <linux/proc_fs.h>
 #ifdef CONFIG_SYSCTL
@@ -63,7 +62,7 @@ void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev);
 
 static struct neigh_table *neigh_tables;
 #ifdef CONFIG_PROC_FS
-static struct file_operations neigh_stat_seq_fops;
+static const struct file_operations neigh_stat_seq_fops;
 #endif
 
 /*
@@ -251,12 +250,10 @@ static struct neighbour *neigh_alloc(struct neigh_table *tbl)
                        goto out_entries;
        }
 
-       n = kmem_cache_alloc(tbl->kmem_cachep, GFP_ATOMIC);
+       n = kmem_cache_zalloc(tbl->kmem_cachep, GFP_ATOMIC);
        if (!n)
                goto out_entries;
 
-       memset(n, 0, tbl->entry_size);
-
        skb_queue_head_init(&n->arp_queue);
        rwlock_init(&n->lock);
        n->updated        = n->used = now;
@@ -345,7 +342,7 @@ struct neighbour *neigh_lookup(struct neigh_table *tbl, const void *pkey,
        struct neighbour *n;
        int key_len = tbl->key_len;
        u32 hash_val = tbl->hash(pkey, dev);
-       
+
        NEIGH_CACHE_STAT_INC(tbl, lookups);
 
        read_lock_bh(&tbl->lock);
@@ -687,9 +684,9 @@ next_elt:
                np = &n->next;
        }
 
-       /* Cycle through all hash buckets every base_reachable_time/2 ticks.
-        * ARP entry timeouts range from 1/2 base_reachable_time to 3/2
-        * base_reachable_time.
+       /* Cycle through all hash buckets every base_reachable_time/2 ticks.
+        * ARP entry timeouts range from 1/2 base_reachable_time to 3/2
+        * base_reachable_time.
         */
        expire = tbl->parms.base_reachable_time >> 1;
        expire /= (tbl->hash_mask + 1);
@@ -744,7 +741,7 @@ static void neigh_timer_handler(unsigned long arg)
        }
 
        if (state & NUD_REACHABLE) {
-               if (time_before_eq(now, 
+               if (time_before_eq(now,
                                   neigh->confirmed + neigh->parms->reachable_time)) {
                        NEIGH_PRINTK2("neigh %p is still alive.\n", neigh);
                        next = neigh->confirmed + neigh->parms->reachable_time;
@@ -763,7 +760,7 @@ static void neigh_timer_handler(unsigned long arg)
                        notify = 1;
                }
        } else if (state & NUD_DELAY) {
-               if (time_before_eq(now, 
+               if (time_before_eq(now,
                                   neigh->confirmed + neigh->parms->delay_probe_time)) {
                        NEIGH_PRINTK2("neigh %p is now reachable.\n", neigh);
                        neigh->nud_state = NUD_REACHABLE;
@@ -849,7 +846,7 @@ int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb)
                goto out_unlock_bh;
 
        now = jiffies;
-       
+
        if (!(neigh->nud_state & (NUD_STALE | NUD_INCOMPLETE))) {
                if (neigh->parms->mcast_probes + neigh->parms->app_probes) {
                        atomic_set(&neigh->probes, neigh->parms->ucast_probes);
@@ -917,13 +914,13 @@ static void neigh_update_hhs(struct neighbour *neigh)
        NEIGH_UPDATE_F_OVERRIDE allows to override existing lladdr,
                                if it is different.
        NEIGH_UPDATE_F_WEAK_OVERRIDE will suspect existing "connected"
-                               lladdr instead of overriding it 
+                               lladdr instead of overriding it
                                if it is different.
                                It also allows to retain current state
                                if lladdr is unchanged.
        NEIGH_UPDATE_F_ADMIN    means that the change is administrative.
 
-       NEIGH_UPDATE_F_OVERRIDE_ISROUTER allows to override existing 
+       NEIGH_UPDATE_F_OVERRIDE_ISROUTER allows to override existing
                                NTF_ROUTER flag.
        NEIGH_UPDATE_F_ISROUTER indicates if the neighbour is known as
                                a router.
@@ -946,7 +943,7 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
        old    = neigh->nud_state;
        err    = -EPERM;
 
-       if (!(flags & NEIGH_UPDATE_F_ADMIN) && 
+       if (!(flags & NEIGH_UPDATE_F_ADMIN) &&
            (old & (NUD_NOARP | NUD_PERMANENT)))
                goto out;
 
@@ -970,7 +967,7 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
                   - compare new & old
                   - if they are different, check override flag
                 */
-               if ((old & NUD_VALID) && 
+               if ((old & NUD_VALID) &&
                    !memcmp(lladdr, neigh->ha, dev->addr_len))
                        lladdr = neigh->ha;
        } else {
@@ -1014,8 +1011,8 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
                neigh_del_timer(neigh);
                if (new & NUD_IN_TIMER) {
                        neigh_hold(neigh);
-                       neigh_add_timer(neigh, (jiffies + 
-                                               ((new & NUD_REACHABLE) ? 
+                       neigh_add_timer(neigh, (jiffies +
+                                               ((new & NUD_REACHABLE) ?
                                                 neigh->parms->reachable_time :
                                                 0)));
                }
@@ -1077,7 +1074,7 @@ struct neighbour *neigh_event_ns(struct neigh_table *tbl,
        struct neighbour *neigh = __neigh_lookup(tbl, saddr, dev,
                                                 lladdr || !dev->addr_len);
        if (neigh)
-               neigh_update(neigh, lladdr, NUD_STALE, 
+               neigh_update(neigh, lladdr, NUD_STALE,
                             NEIGH_UPDATE_F_OVERRIDE);
        return neigh;
 }
@@ -1129,7 +1126,7 @@ int neigh_compat_output(struct sk_buff *skb)
 
        if (dev->hard_header &&
            dev->hard_header(skb, dev, ntohs(skb->protocol), NULL, NULL,
-                            skb->len) < 0 &&
+                            skb->len) < 0 &&
            dev->rebuild_header(skb))
                return 0;
 
@@ -1349,10 +1346,10 @@ void neigh_table_init_no_netlink(struct neigh_table *tbl)
        tbl->stats = alloc_percpu(struct neigh_statistics);
        if (!tbl->stats)
                panic("cannot create neighbour cache statistics");
-       
+
 #ifdef CONFIG_PROC_FS
        tbl->pde = create_proc_entry(tbl->id, 0, proc_net_stat);
-       if (!tbl->pde) 
+       if (!tbl->pde)
                panic("cannot create neighbour proc dir entry");
        tbl->pde->proc_fops = &neigh_stat_seq_fops;
        tbl->pde->data = tbl;
@@ -1567,7 +1564,7 @@ int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
                                err = -ENOENT;
                                goto out_dev_put;
                        }
-       
+
                        neigh = __neigh_lookup_errno(tbl, dst, dev);
                        if (IS_ERR(neigh)) {
                                err = PTR_ERR(neigh);
@@ -1744,12 +1741,12 @@ errout:
        nlmsg_cancel(skb, nlh);
        return -EMSGSIZE;
 }
+
 static inline struct neigh_parms *lookup_neigh_params(struct neigh_table *tbl,
                                                      int ifindex)
 {
        struct neigh_parms *p;
-       
+
        for (p = &tbl->parms; p; p = p->next)
                if ((p->dev && p->dev->ifindex == ifindex) ||
                    (!p->dev && !ifindex))
@@ -1815,7 +1812,7 @@ int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
                goto errout_locked;
        }
 
-       /* 
+       /*
         * We acquire tbl->lock to be nice to the periodic timers and
         * make sure they always see a consistent set of values.
         */
@@ -2323,7 +2320,7 @@ static void *neigh_stat_seq_start(struct seq_file *seq, loff_t *pos)
 
        if (*pos == 0)
                return SEQ_START_TOKEN;
-       
+
        for (cpu = *pos-1; cpu < NR_CPUS; ++cpu) {
                if (!cpu_possible(cpu))
                        continue;
@@ -2405,7 +2402,7 @@ static int neigh_stat_seq_open(struct inode *inode, struct file *file)
        return ret;
 };
 
-static struct file_operations neigh_stat_seq_fops = {
+static const struct file_operations neigh_stat_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = neigh_stat_seq_open,
        .read    = seq_read,
@@ -2631,7 +2628,7 @@ static struct neigh_sysctl_table {
 };
 
 int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,
-                         int p_id, int pdev_id, char *p_name, 
+                         int p_id, int pdev_id, char *p_name,
                          proc_handler *handler, ctl_handler *strategy)
 {
        struct neigh_sysctl_table *t = kmemdup(&neigh_sysctl_template,
@@ -2663,7 +2660,7 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,
                t->neigh_vars[14].procname = NULL;
                t->neigh_vars[15].procname = NULL;
        } else {
-               dev_name_source = t->neigh_dev[0].procname;
+               dev_name_source = t->neigh_dev[0].procname;
                t->neigh_vars[12].data = (int *)(p + 1);
                t->neigh_vars[13].data = (int *)(p + 1) + 1;
                t->neigh_vars[14].data = (int *)(p + 1) + 2;
@@ -2698,7 +2695,7 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,
                goto free;
        }
 
-       t->neigh_dev[0].procname = dev_name;
+       t->neigh_dev[0].procname = dev_name;
 
        t->neigh_neigh_dir[0].ctl_name = pdev_id;
 
@@ -2710,7 +2707,7 @@ int neigh_sysctl_register(struct net_device *dev, struct neigh_parms *p,
        t->neigh_proto_dir[0].child    = t->neigh_neigh_dir;
        t->neigh_root_dir[0].child     = t->neigh_proto_dir;
 
-       t->sysctl_header = register_sysctl_table(t->neigh_root_dir, 0);
+       t->sysctl_header = register_sysctl_table(t->neigh_root_dir);
        if (!t->sysctl_header) {
                err = -ENOBUFS;
                goto free_procname;
index 44db095a8f7e9f4e404f616c4837edc019408060..6189dc03108d2da67aad2a155a3d53011a30daa0 100644 (file)
@@ -2,7 +2,7 @@
  * net-sysfs.c - network device class and attributes
  *
  * Copyright (c) 2003 Stephen Hemminger <shemminger@osdl.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; either version
@@ -23,7 +23,7 @@ static const char fmt_long_hex[] = "%#lx\n";
 static const char fmt_dec[] = "%d\n";
 static const char fmt_ulong[] = "%lu\n";
 
-static inline int dev_isalive(const struct net_device *dev) 
+static inline int dev_isalive(const struct net_device *dev)
 {
        return dev->reg_state <= NETREG_REGISTERED;
 }
@@ -265,7 +265,7 @@ static ssize_t netstat_show(const struct device *d,
 
        read_lock(&dev_base_lock);
        if (dev_isalive(dev) && dev->get_stats &&
-           (stats = (*dev->get_stats)(dev))) 
+           (stats = (*dev->get_stats)(dev)))
                ret = sprintf(buf, fmt_ulong,
                              *(unsigned long *)(((u8 *) stats) + offset));
 
@@ -349,7 +349,7 @@ static ssize_t wireless_show(struct device *d, char *buf,
        struct net_device *dev = to_net_dev(d);
        const struct iw_statistics *iw = NULL;
        ssize_t ret = -EINVAL;
-       
+
        read_lock(&dev_base_lock);
        if (dev_isalive(dev)) {
                if(dev->wireless_handlers &&
@@ -430,7 +430,7 @@ static int netdev_uevent(struct device *d, char **envp,
 #endif
 
 /*
- *     netdev_release -- destroy and free a dead device. 
+ *     netdev_release -- destroy and free a dead device.
  *     Called when last reference to device kobject is gone.
  */
 static void netdev_release(struct device *d)
index 823215d8e90f6411b6e6fb94ba1ecd9bcae2f6f1..da1019451ccbe68185af1db8b7db3bb30a305c8f 100644 (file)
@@ -237,13 +237,13 @@ static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
 {
        int status = NETDEV_TX_BUSY;
        unsigned long tries;
-       struct net_device *dev = np->dev;
-       struct netpoll_info *npinfo = np->dev->npinfo;
+       struct net_device *dev = np->dev;
+       struct netpoll_info *npinfo = np->dev->npinfo;
 
-       if (!npinfo || !netif_running(dev) || !netif_device_present(dev)) {
-               __kfree_skb(skb);
-               return;
-       }
+       if (!npinfo || !netif_running(dev) || !netif_device_present(dev)) {
+               __kfree_skb(skb);
+               return;
+       }
 
        /* don't get messages out of order, and no recursion */
        if (skb_queue_len(&npinfo->txq) == 0 &&
@@ -676,7 +676,7 @@ int netpoll_setup(struct netpoll *np)
                }
 
                atleast = jiffies + HZ/10;
-               atmost = jiffies + 4*HZ;
+               atmost = jiffies + 4*HZ;
                while (!netif_carrier_ok(ndev)) {
                        if (time_after(jiffies, atmost)) {
                                printk(KERN_NOTICE
@@ -772,9 +772,9 @@ void netpoll_cleanup(struct netpoll *np)
                        np->dev->npinfo = NULL;
                        if (atomic_dec_and_test(&npinfo->refcnt)) {
                                skb_queue_purge(&npinfo->arp_tx);
-                               skb_queue_purge(&npinfo->txq);
+                               skb_queue_purge(&npinfo->txq);
                                cancel_rearming_delayed_work(&npinfo->tx_work);
-                               flush_scheduled_work();
+                               flush_scheduled_work();
 
                                kfree(npinfo);
                        }
index 04d4b93c68eb0b226cdd7c0a4385402d6be27aa9..74a9a32b906d49990f3c2d4e2ccc99a8cf9a0810 100644 (file)
@@ -15,7 +15,7 @@
  *
  *
  * A tool for loading the network with preconfigurated packets.
- * The tool is implemented as a linux module.  Parameters are output 
+ * The tool is implemented as a linux module.  Parameters are output
  * device, delay (to hard_xmit), number of packets, and whether
  * to use multiple SKBs or just the same one.
  * pktgen uses the installed interface's output routine.
  *   *  Add IOCTL interface to easily get counters & configuration.
  *   --Ben Greear <greearb@candelatech.com>
  *
- * Renamed multiskb to clone_skb and cleaned up sending core for two distinct 
- * skb modes. A clone_skb=0 mode for Ben "ranges" work and a clone_skb != 0 
+ * Renamed multiskb to clone_skb and cleaned up sending core for two distinct
+ * skb modes. A clone_skb=0 mode for Ben "ranges" work and a clone_skb != 0
  * as a "fastpath" with a configurable number of clones after alloc's.
- * clone_skb=0 means all packets are allocated this also means ranges time 
- * stamps etc can be used. clone_skb=100 means 1 malloc is followed by 100 
+ * clone_skb=0 means all packets are allocated this also means ranges time
+ * stamps etc can be used. clone_skb=100 means 1 malloc is followed by 100
  * clones.
  *
- * Also moved to /proc/net/pktgen/ 
+ * Also moved to /proc/net/pktgen/
  * --ro
  *
  * Sept 10:  Fixed threading/locking.  Lots of bone-headed and more clever
  *
  * Integrated to 2.5.x 021029 --Lucio Maciel (luciomaciel@zipmail.com.br)
  *
- * 
+ *
  * 021124 Finished major redesign and rewrite for new functionality.
  * See Documentation/networking/pktgen.txt for how to use this.
  *
  * The new operation:
- * For each CPU one thread/process is created at start. This process checks 
- * for running devices in the if_list and sends packets until count is 0 it 
- * also the thread checks the thread->control which is used for inter-process 
- * communication. controlling process "posts" operations to the threads this 
+ * For each CPU one thread/process is created at start. This process checks
+ * for running devices in the if_list and sends packets until count is 0 it
+ * also the thread checks the thread->control which is used for inter-process
+ * communication. controlling process "posts" operations to the threads this
  * way. The if_lock should be possible to remove when add/rem_device is merged
  * into this too.
  *
- * By design there should only be *one* "controlling" process. In practice 
- * multiple write accesses gives unpredictable result. Understood by "write" 
+ * By design there should only be *one* "controlling" process. In practice
+ * multiple write accesses gives unpredictable result. Understood by "write"
  * to /proc gives result code thats should be read be the "writer".
  * For practical use this should be no problem.
  *
- * Note when adding devices to a specific CPU there good idea to also assign 
- * /proc/irq/XX/smp_affinity so TX-interrupts gets bound to the same CPU. 
+ * Note when adding devices to a specific CPU there good idea to also assign
+ * /proc/irq/XX/smp_affinity so TX-interrupts gets bound to the same CPU.
  * --ro
  *
- * Fix refcount off by one if first packet fails, potential null deref, 
+ * Fix refcount off by one if first packet fails, potential null deref,
  * memleak 030710- KJP
  *
  * First "ranges" functionality for ipv6 030726 --ro
  * Included flow support. 030802 ANK.
  *
  * Fixed unaligned access on IA-64 Grant Grundler <grundler@parisc-linux.org>
- * 
+ *
  * Remove if fix from added Harald Welte <laforge@netfilter.org> 040419
  * ia64 compilation fix from  Aron Griffis <aron@hp.com> 040604
  *
- * New xmit() return, do_div and misc clean up by Stephen Hemminger 
+ * New xmit() return, do_div and misc clean up by Stephen Hemminger
  * <shemminger@osdl.org> 040923
  *
- * Randy Dunlap fixed u64 printk compiler waring 
+ * Randy Dunlap fixed u64 printk compiler waring
  *
  * Remove FCS from BW calculation.  Lennert Buytenhek <buytenh@wantstofly.org>
  * New time handling. Lennert Buytenhek <buytenh@wantstofly.org> 041213
  *
- * Corrections from Nikolai Malykh (nmalykh@bilim.com) 
+ * Corrections from Nikolai Malykh (nmalykh@bilim.com)
  * Removed unused flags F_SET_SRCMAC & F_SET_SRCIP 041230
  *
- * interruptible_sleep_on_timeout() replaced Nishanth Aravamudan <nacc@us.ibm.com> 
+ * interruptible_sleep_on_timeout() replaced Nishanth Aravamudan <nacc@us.ibm.com>
  * 050103
  *
  * MPLS support by Steven Whitehouse <steve@chygwyn.com>
@@ -456,7 +456,7 @@ static inline __u64 pg_div64(__u64 n, __u64 base)
 /*
  * How do we know if the architecture we are running on
  * supports division with 64 bit base?
- * 
+ *
  */
 #if defined(__sparc_v9__) || defined(__powerpc64__) || defined(__alpha__) || defined(__x86_64__) || defined(__ia64__)
 
@@ -529,7 +529,7 @@ static struct notifier_block pktgen_notifier_block = {
 };
 
 /*
- * /proc handling functions 
+ * /proc handling functions
  *
  */
 
@@ -579,7 +579,7 @@ static int pgctrl_open(struct inode *inode, struct file *file)
        return single_open(file, pgctrl_show, PDE(inode)->data);
 }
 
-static struct file_operations pktgen_fops = {
+static const struct file_operations pktgen_fops = {
        .owner   = THIS_MODULE,
        .open    = pgctrl_open,
        .read    = seq_read,
@@ -1672,7 +1672,7 @@ static int pktgen_if_open(struct inode *inode, struct file *file)
        return single_open(file, pktgen_if_show, PDE(inode)->data);
 }
 
-static struct file_operations pktgen_if_fops = {
+static const struct file_operations pktgen_if_fops = {
        .owner   = THIS_MODULE,
        .open    = pktgen_if_open,
        .read    = seq_read,
@@ -1815,7 +1815,7 @@ static int pktgen_thread_open(struct inode *inode, struct file *file)
        return single_open(file, pktgen_thread_show, PDE(inode)->data);
 }
 
-static struct file_operations pktgen_thread_fops = {
+static const struct file_operations pktgen_thread_fops = {
        .owner   = THIS_MODULE,
        .open    = pktgen_thread_open,
        .read    = seq_read,
@@ -1979,7 +1979,7 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev)
 
        if (pkt_dev->flags & F_IPV6) {
                /*
-                * Skip this automatic address setting until locks or functions 
+                * Skip this automatic address setting until locks or functions
                 * gets exported
                 */
 
@@ -2477,10 +2477,10 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
 }
 
 /*
- * scan_ip6, fmt_ip taken from dietlibc-0.21 
+ * scan_ip6, fmt_ip taken from dietlibc-0.21
  * Author Felix von Leitner <felix-dietlibc@fefe.de>
  *
- * Slightly modified for kernel. 
+ * Slightly modified for kernel.
  * Should be candidate for net/ipv4/utils.c
  * --ro
  */
@@ -3256,7 +3256,7 @@ static __inline__ void pktgen_xmit(struct pktgen_dev *pkt_dev)
 out:;
 }
 
-/* 
+/*
  * Main loop of the thread goes here
  */
 
@@ -3365,8 +3365,8 @@ static struct pktgen_dev *pktgen_find_dev(struct pktgen_thread *t,
        return pkt_dev;
 }
 
-/* 
- * Adds a dev at front of if_list. 
+/*
+ * Adds a dev at front of if_list.
  */
 
 static int add_dev_to_thread(struct pktgen_thread *t,
@@ -3510,8 +3510,8 @@ static int __init pktgen_create_thread(int cpu)
        return 0;
 }
 
-/* 
- * Removes a device from the thread if_list. 
+/*
+ * Removes a device from the thread if_list.
  */
 static void _rem_dev_from_if_list(struct pktgen_thread *t,
                                  struct pktgen_dev *pkt_dev)
index 9bf9ae05f1571ed5a474b06749cbdb8b743a4d4d..6055074c4b81eb83ee2be5ea7cce4228185e825f 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/types.h>
 #include <linux/socket.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
@@ -874,7 +873,7 @@ void __init rtnetlink_init(void)
                panic("rtnetlink_init: cannot allocate rta_buf\n");
 
        rtnl = netlink_kernel_create(NETLINK_ROUTE, RTNLGRP_MAX, rtnetlink_rcv,
-                                    THIS_MODULE);
+                                    THIS_MODULE);
        if (rtnl == NULL)
                panic("rtnetlink_init: cannot initialize rtnetlink\n");
        netlink_set_nonroot(NETLINK_ROUTE, NL_NONROOT_RECV);
index 271cf060ef8c69fb79f37768972af65b5457d835..292ad8d5ad76262c46fc33248376cd0401658722 100644 (file)
@@ -36,7 +36,7 @@
 
 
 /*
- *     Only allow a user to send credentials, that they could set with 
+ *     Only allow a user to send credentials, that they could set with
  *     setu(g)id.
  */
 
@@ -79,11 +79,11 @@ static int scm_fp_copy(struct cmsghdr *cmsg, struct scm_fp_list **fplp)
 
        if (fpl->count + num > SCM_MAX_FD)
                return -EINVAL;
-       
+
        /*
         *      Verify the descriptors and increment the usage count.
         */
-        
+
        for (i=0; i< num; i++)
        {
                int fd = fdp[i];
@@ -123,7 +123,7 @@ int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *p)
                /* The first check was omitted in <= 2.2.5. The reasoning was
                   that parser checks cmsg_len in any case, so that
                   additional check would be work duplication.
-                  But if cmsg_level is not SOL_SOCKET, we do not check 
+                  But if cmsg_level is not SOL_SOCKET, we do not check
                   for too short ancillary data object at all! Oops.
                   OK, let's add it...
                 */
@@ -159,7 +159,7 @@ int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *p)
                p->fp = NULL;
        }
        return 0;
-       
+
 error:
        scm_destroy(p);
        return err;
@@ -189,7 +189,7 @@ int put_cmsg(struct msghdr * msg, int level, int type, int len, void *data)
 
        err = -EFAULT;
        if (copy_to_user(cm, &cmhdr, sizeof cmhdr))
-               goto out; 
+               goto out;
        if (copy_to_user(CMSG_DATA(cm), data, cmlen - sizeof(struct cmsghdr)))
                goto out;
        cmlen = CMSG_SPACE(len);
index f3404ae9f190713a547211ae6cc035f374c03068..f89ff151cfabff32a6436c98fef66e243118bc20 100644 (file)
@@ -41,7 +41,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/interrupt.h>
 #include <linux/in.h>
@@ -88,7 +87,7 @@ static struct kmem_cache *skbuff_fclone_cache __read_mostly;
 void skb_over_panic(struct sk_buff *skb, int sz, void *here)
 {
        printk(KERN_EMERG "skb_over_panic: text:%p len:%d put:%d head:%p "
-                         "data:%p tail:%p end:%p dev:%s\n",
+                         "data:%p tail:%p end:%p dev:%s\n",
               here, skb->len, sz, skb->head, skb->data, skb->tail, skb->end,
               skb->dev ? skb->dev->name : "<NULL>");
        BUG();
@@ -106,7 +105,7 @@ void skb_over_panic(struct sk_buff *skb, int sz, void *here)
 void skb_under_panic(struct sk_buff *skb, int sz, void *here)
 {
        printk(KERN_EMERG "skb_under_panic: text:%p len:%d put:%d head:%p "
-                         "data:%p tail:%p end:%p dev:%s\n",
+                         "data:%p tail:%p end:%p dev:%s\n",
               here, skb->len, sz, skb->head, skb->data, skb->tail, skb->end,
               skb->dev ? skb->dev->name : "<NULL>");
        BUG();
@@ -271,7 +270,7 @@ struct sk_buff *__netdev_alloc_skb(struct net_device *dev,
        int node = dev->dev.parent ? dev_to_node(dev->dev.parent) : -1;
        struct sk_buff *skb;
 
-       skb = __alloc_skb(length + NET_SKB_PAD, gfp_mask, 0, node);
+       skb = __alloc_skb(length + NET_SKB_PAD, gfp_mask, 0, node);
        if (likely(skb)) {
                skb_reserve(skb, NET_SKB_PAD);
                skb->dev = dev;
@@ -819,12 +818,12 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
  *
  *     May return error in out of memory cases. The skb is freed on error.
  */
+
 int skb_pad(struct sk_buff *skb, int pad)
 {
        int err;
        int ntail;
-       
+
        /* If the skbuff is non linear tailroom is always zero.. */
        if (!skb_cloned(skb) && skb_tailroom(skb) >= pad) {
                memset(skb->data+skb->len, 0, pad);
@@ -851,8 +850,8 @@ int skb_pad(struct sk_buff *skb, int pad)
 free_skb:
        kfree_skb(skb);
        return err;
-}      
+}
+
 /* Trims skb to length len. It can change skb pointers.
  */
 
index 0ed5b4f0bc407aef5b376149dcc2d49aa3c49937..e9986acdd0ab0920f5283801484619926907542f 100644 (file)
@@ -34,7 +34,7 @@
  *             Alan Cox        :       TCP ack handling is buggy, the DESTROY timer
  *                                     was buggy. Put a remove_sock() in the handler
  *                                     for memory when we hit 0. Also altered the timer
- *                                     code. The ACK stuff can wait and needs major 
+ *                                     code. The ACK stuff can wait and needs major
  *                                     TCP layer surgery.
  *             Alan Cox        :       Fixed TCP ack bug, removed remove sock
  *                                     and fixed timer/inet_bh race.
@@ -217,8 +217,8 @@ static void sock_warn_obsolete_bsdism(const char *name)
 {
        static int warned;
        static char warncomm[TASK_COMM_LEN];
-       if (strcmp(warncomm, current->comm) && warned < 5) { 
-               strcpy(warncomm,  current->comm); 
+       if (strcmp(warncomm, current->comm) && warned < 5) {
+               strcpy(warncomm,  current->comm);
                printk(KERN_WARNING "process `%s' is using obsolete "
                       "%s SO_BSDCOMPAT\n", warncomm, name);
                warned++;
@@ -226,8 +226,8 @@ static void sock_warn_obsolete_bsdism(const char *name)
 }
 
 static void sock_disable_timestamp(struct sock *sk)
-{      
-       if (sock_flag(sk, SOCK_TIMESTAMP)) { 
+{
+       if (sock_flag(sk, SOCK_TIMESTAMP)) {
                sock_reset_flag(sk, SOCK_TIMESTAMP);
                net_disable_timestamp();
        }
@@ -347,7 +347,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
        int valbool;
        struct linger ling;
        int ret = 0;
-       
+
        /*
         *      Options without arguments
         */
@@ -360,20 +360,20 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
                return 0;
        }
 #endif
-       
-       if(optlen<sizeof(int))
-               return(-EINVAL);
-       
+
+       if(optlen<sizeof(int))
+               return(-EINVAL);
+
        if (get_user(val, (int __user *)optval))
                return -EFAULT;
-       
-       valbool = val?1:0;
+
+       valbool = val?1:0;
 
        lock_sock(sk);
 
-       switch(optname) 
-       {
-               case SO_DEBUG:  
+       switch(optname)
+       {
+               case SO_DEBUG:
                        if(val && !capable(CAP_NET_ADMIN))
                        {
                                ret = -EACCES;
@@ -389,7 +389,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
                case SO_TYPE:
                case SO_ERROR:
                        ret = -ENOPROTOOPT;
-                       break;
+                       break;
                case SO_DONTROUTE:
                        if (valbool)
                                sock_set_flag(sk, SOCK_LOCALROUTE);
@@ -404,7 +404,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
                           about it this is right. Otherwise apps have to
                           play 'guess the biggest size' games. RCVBUF/SNDBUF
                           are treated in BSD as hints */
-                          
+
                        if (val > sysctl_wmem_max)
                                val = sysctl_wmem_max;
 set_sndbuf:
@@ -433,7 +433,7 @@ set_sndbuf:
                           about it this is right. Otherwise apps have to
                           play 'guess the biggest size' games. RCVBUF/SNDBUF
                           are treated in BSD as hints */
-                         
+
                        if (val > sysctl_rmem_max)
                                val = sysctl_rmem_max;
 set_rcvbuf:
@@ -474,16 +474,16 @@ set_rcvbuf:
                        sock_valbool_flag(sk, SOCK_KEEPOPEN, valbool);
                        break;
 
-               case SO_OOBINLINE:
+               case SO_OOBINLINE:
                        sock_valbool_flag(sk, SOCK_URGINLINE, valbool);
                        break;
 
-               case SO_NO_CHECK:
+               case SO_NO_CHECK:
                        sk->sk_no_check = valbool;
                        break;
 
                case SO_PRIORITY:
-                       if ((val >= 0 && val <= 6) || capable(CAP_NET_ADMIN)) 
+                       if ((val >= 0 && val <= 6) || capable(CAP_NET_ADMIN))
                                sk->sk_priority = val;
                        else
                                ret = -EPERM;
@@ -547,9 +547,9 @@ set_rcvbuf:
 #ifdef CONFIG_NETDEVICES
                case SO_BINDTODEVICE:
                {
-                       char devname[IFNAMSIZ]; 
+                       char devname[IFNAMSIZ];
 
-                       /* Sorry... */ 
+                       /* Sorry... */
                        if (!capable(CAP_NET_RAW)) {
                                ret = -EPERM;
                                break;
@@ -557,9 +557,9 @@ set_rcvbuf:
 
                        /* Bind this socket to a particular device like "eth0",
                         * as specified in the passed interface name. If the
-                        * name is "" or the option length is zero the socket 
-                        * is not bound. 
-                        */ 
+                        * name is "" or the option length is zero the socket
+                        * is not bound.
+                        */
 
                        if (!valbool) {
                                sk->sk_bound_dev_if = 0;
@@ -608,7 +608,7 @@ set_rcvbuf:
                case SO_DETACH_FILTER:
                        rcu_read_lock_bh();
                        filter = rcu_dereference(sk->sk_filter);
-                        if (filter) {
+                       if (filter) {
                                rcu_assign_pointer(sk->sk_filter, NULL);
                                sk_filter_release(sk, filter);
                                rcu_read_unlock_bh();
@@ -628,9 +628,9 @@ set_rcvbuf:
                /* We implement the SO_SNDLOWAT etc to
                   not be settable (1003.1g 5.3) */
                default:
-                       ret = -ENOPROTOOPT;
+                       ret = -ENOPROTOOPT;
                        break;
-       }
+       }
        release_sock(sk);
        return ret;
 }
@@ -640,32 +640,32 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
                    char __user *optval, int __user *optlen)
 {
        struct sock *sk = sock->sk;
-       
+
        union
        {
-               int val;
-               struct linger ling;
+               int val;
+               struct linger ling;
                struct timeval tm;
        } v;
-       
+
        unsigned int lv = sizeof(int);
        int len;
-       
-       if(get_user(len,optlen))
-               return -EFAULT;
+
+       if(get_user(len,optlen))
+               return -EFAULT;
        if(len < 0)
                return -EINVAL;
-               
-       switch(optname) 
-       {
-               case SO_DEBUG:          
+
+       switch(optname)
+       {
+               case SO_DEBUG:
                        v.val = sock_flag(sk, SOCK_DBG);
                        break;
-               
+
                case SO_DONTROUTE:
                        v.val = sock_flag(sk, SOCK_LOCALROUTE);
                        break;
-               
+
                case SO_BROADCAST:
                        v.val = !!sock_flag(sk, SOCK_BROADCAST);
                        break;
@@ -673,7 +673,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
                case SO_SNDBUF:
                        v.val = sk->sk_sndbuf;
                        break;
-               
+
                case SO_RCVBUF:
                        v.val = sk->sk_rcvbuf;
                        break;
@@ -687,7 +687,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
                        break;
 
                case SO_TYPE:
-                       v.val = sk->sk_type;                            
+                       v.val = sk->sk_type;
                        break;
 
                case SO_ERROR:
@@ -699,7 +699,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
                case SO_OOBINLINE:
                        v.val = !!sock_flag(sk, SOCK_URGINLINE);
                        break;
-       
+
                case SO_NO_CHECK:
                        v.val = sk->sk_no_check;
                        break;
@@ -707,13 +707,13 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
                case SO_PRIORITY:
                        v.val = sk->sk_priority;
                        break;
-               
-               case SO_LINGER: 
+
+               case SO_LINGER:
                        lv              = sizeof(v.ling);
                        v.ling.l_onoff  = !!sock_flag(sk, SOCK_LINGER);
-                       v.ling.l_linger = sk->sk_lingertime / HZ;
+                       v.ling.l_linger = sk->sk_lingertime / HZ;
                        break;
-                                       
+
                case SO_BSDCOMPAT:
                        sock_warn_obsolete_bsdism("getsockopt");
                        break;
@@ -750,7 +750,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
 
                case SO_SNDLOWAT:
                        v.val=1;
-                       break; 
+                       break;
 
                case SO_PASSCRED:
                        v.val = test_bit(SOCK_PASSCRED, &sock->flags) ? 1 : 0;
@@ -798,9 +798,9 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
        if (copy_to_user(optval, &v, len))
                return -EFAULT;
 lenout:
-       if (put_user(len, optlen))
-               return -EFAULT;
-       return 0;
+       if (put_user(len, optlen))
+               return -EFAULT;
+       return 0;
 }
 
 /*
@@ -846,7 +846,7 @@ struct sock *sk_alloc(int family, gfp_t priority,
                        sk->sk_prot = sk->sk_prot_creator = prot;
                        sock_lock_init(sk);
                }
-               
+
                if (security_sk_alloc(sk, family, priority))
                        goto out_free;
 
@@ -988,8 +988,8 @@ void __init sk_init(void)
  */
 
 
-/* 
- * Write buffer destructor automatically called from kfree_skb. 
+/*
+ * Write buffer destructor automatically called from kfree_skb.
  */
 void sock_wfree(struct sk_buff *skb)
 {
@@ -1002,8 +1002,8 @@ void sock_wfree(struct sk_buff *skb)
        sock_put(sk);
 }
 
-/* 
- * Read buffer destructor automatically called from kfree_skb. 
+/*
+ * Read buffer destructor automatically called from kfree_skb.
  */
 void sock_rfree(struct sk_buff *skb)
 {
@@ -1051,7 +1051,7 @@ struct sk_buff *sock_wmalloc(struct sock *sk, unsigned long size, int force,
 
 /*
  * Allocate a skb from the socket's receive buffer.
- */ 
+ */
 struct sk_buff *sock_rmalloc(struct sock *sk, unsigned long size, int force,
                             gfp_t priority)
 {
@@ -1065,16 +1065,16 @@ struct sk_buff *sock_rmalloc(struct sock *sk, unsigned long size, int force,
        return NULL;
 }
 
-/* 
+/*
  * Allocate a memory block from the socket's option memory buffer.
- */ 
+ */
 void *sock_kmalloc(struct sock *sk, int size, gfp_t priority)
 {
        if ((unsigned)size <= sysctl_optmem_max &&
            atomic_read(&sk->sk_omem_alloc) + size < sysctl_optmem_max) {
                void *mem;
                /* First do the add, to avoid the race if kmalloc
-                * might sleep.
+                * might sleep.
                 */
                atomic_add(size, &sk->sk_omem_alloc);
                mem = kmalloc(size, priority);
@@ -1210,7 +1210,7 @@ failure:
        return NULL;
 }
 
-struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size, 
+struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size,
                                    int noblock, int *errcode)
 {
        return sock_alloc_send_pskb(sk, size, 0, noblock, errcode);
@@ -1298,7 +1298,7 @@ int sock_no_bind(struct socket *sock, struct sockaddr *saddr, int len)
        return -EOPNOTSUPP;
 }
 
-int sock_no_connect(struct socket *sock, struct sockaddr *saddr, 
+int sock_no_connect(struct socket *sock, struct sockaddr *saddr,
                    int len, int flags)
 {
        return -EOPNOTSUPP;
@@ -1314,7 +1314,7 @@ int sock_no_accept(struct socket *sock, struct socket *newsock, int flags)
        return -EOPNOTSUPP;
 }
 
-int sock_no_getname(struct socket *sock, struct sockaddr *saddr, 
+int sock_no_getname(struct socket *sock, struct sockaddr *saddr,
                    int *len, int peer)
 {
        return -EOPNOTSUPP;
@@ -1400,7 +1400,7 @@ static void sock_def_error_report(struct sock *sk)
        read_lock(&sk->sk_callback_lock);
        if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
                wake_up_interruptible(sk->sk_sleep);
-       sk_wake_async(sk,0,POLL_ERR); 
+       sk_wake_async(sk,0,POLL_ERR);
        read_unlock(&sk->sk_callback_lock);
 }
 
@@ -1473,7 +1473,7 @@ void sock_init_data(struct socket *sock, struct sock *sk)
        sk->sk_send_head        =       NULL;
 
        init_timer(&sk->sk_timer);
-       
+
        sk->sk_allocation       =       GFP_KERNEL;
        sk->sk_rcvbuf           =       sysctl_rmem_default;
        sk->sk_sndbuf           =       sysctl_wmem_default;
@@ -1553,26 +1553,26 @@ void fastcall release_sock(struct sock *sk)
 EXPORT_SYMBOL(release_sock);
 
 int sock_get_timestamp(struct sock *sk, struct timeval __user *userstamp)
-{ 
+{
        if (!sock_flag(sk, SOCK_TIMESTAMP))
                sock_enable_timestamp(sk);
-       if (sk->sk_stamp.tv_sec == -1) 
+       if (sk->sk_stamp.tv_sec == -1)
                return -ENOENT;
        if (sk->sk_stamp.tv_sec == 0)
                do_gettimeofday(&sk->sk_stamp);
        return copy_to_user(userstamp, &sk->sk_stamp, sizeof(struct timeval)) ?
-               -EFAULT : 0; 
-} 
+               -EFAULT : 0;
+}
 EXPORT_SYMBOL(sock_get_timestamp);
 
 void sock_enable_timestamp(struct sock *sk)
-{      
-       if (!sock_flag(sk, SOCK_TIMESTAMP)) { 
+{
+       if (!sock_flag(sk, SOCK_TIMESTAMP)) {
                sock_set_flag(sk, SOCK_TIMESTAMP);
                net_enable_timestamp();
        }
 }
-EXPORT_SYMBOL(sock_enable_timestamp); 
+EXPORT_SYMBOL(sock_enable_timestamp);
 
 /*
  *     Get a socket option on an socket.
@@ -1911,7 +1911,7 @@ static int proto_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &proto_seq_ops);
 }
 
-static struct file_operations proto_seq_fops = {
+static const struct file_operations proto_seq_fops = {
        .owner          = THIS_MODULE,
        .open           = proto_seq_open,
        .read           = seq_read,
index d1d7decf70b0087af2de9358049e5e43ed46d326..755bacbcb321c296a45c5d53ae872469674aa4a8 100644 (file)
@@ -69,7 +69,7 @@ int sk_stream_wait_connect(struct sock *sk, long *timeo_p)
                sk->sk_write_pending++;
                done = sk_wait_event(sk, timeo_p,
                                     !sk->sk_err &&
-                                    !((1 << sk->sk_state) & 
+                                    !((1 << sk->sk_state) &
                                       ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)));
                finish_wait(sk->sk_sleep, &wait);
                sk->sk_write_pending--;
@@ -139,7 +139,7 @@ int sk_stream_wait_memory(struct sock *sk, long *timeo_p)
 
                set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
                sk->sk_write_pending++;
-               sk_wait_event(sk, &current_timeo, !sk->sk_err && 
+               sk_wait_event(sk, &current_timeo, !sk->sk_err &&
                                                  !(sk->sk_shutdown & SEND_SHUTDOWN) &&
                                                  sk_stream_memory_free(sk) &&
                                                  vm_wait);
index 248a6b666aff396233020e46ea56a9d2d14d8885..0ad1cd57bc393b126e5cecbbb0f5638b34d73d97 100644 (file)
@@ -58,7 +58,7 @@ int dma_skb_copy_datagram_iovec(struct dma_chan *chan,
                if (copy > len)
                        copy = len;
                cookie = dma_memcpy_to_iovec(chan, to, pinned_list,
-                                           skb->data + offset, copy);
+                                           skb->data + offset, copy);
                if (cookie < 0)
                        goto fault;
                len -= copy;
@@ -108,8 +108,8 @@ int dma_skb_copy_datagram_iovec(struct dma_chan *chan,
                                if (copy > len)
                                        copy = len;
                                cookie = dma_skb_copy_datagram_iovec(chan, list,
-                                               offset - start, to, copy,
-                                               pinned_list);
+                                               offset - start, to, copy,
+                                               pinned_list);
                                if (cookie < 0)
                                        goto fault;
                                len -= copy;
@@ -128,5 +128,5 @@ end:
        }
 
 fault:
-       return -EFAULT;
+       return -EFAULT;
 }
index 61556065f07ec23b3d115fa05a71b156b0ae2ce1..07236c17fab934adf24a3608034b04318dd3071a 100644 (file)
@@ -33,9 +33,9 @@
 int net_msg_cost = 5*HZ;
 int net_msg_burst = 10;
 
-/* 
+/*
  * All net warning printk()s should be guarded by this function.
- */ 
+ */
 int net_ratelimit(void)
 {
        return __printk_ratelimit(net_msg_cost, net_msg_burst);
index f69ab7b4408ecca979e5e6f43aefd2a051577c06..9936ab11e6e01e1158eb0b2c2e9ec1e148c0843a 100644 (file)
@@ -369,7 +369,7 @@ static const struct iw_ioctl_description standard_event[] = {
                .header_type    = IW_HEADER_TYPE_ADDR,
        },
        [IWEVEXPIRED    - IWEVFIRST] = {
-               .header_type    = IW_HEADER_TYPE_ADDR, 
+               .header_type    = IW_HEADER_TYPE_ADDR,
        },
        [IWEVGENIE      - IWEVFIRST] = {
                .header_type    = IW_HEADER_TYPE_POINT,
@@ -377,7 +377,7 @@ static const struct iw_ioctl_description standard_event[] = {
                .max_tokens     = IW_GENERIC_IE_MAX,
        },
        [IWEVMICHAELMICFAILURE  - IWEVFIRST] = {
-               .header_type    = IW_HEADER_TYPE_POINT, 
+               .header_type    = IW_HEADER_TYPE_POINT,
                .token_size     = 1,
                .max_tokens     = sizeof(struct iw_michaelmicfailure),
        },
@@ -630,11 +630,11 @@ static __inline__ void wireless_seq_printf_stats(struct seq_file *seq,
                           dev->name, stats->status, stats->qual.qual,
                           stats->qual.updated & IW_QUAL_QUAL_UPDATED
                           ? '.' : ' ',
-                          ((__s32) stats->qual.level) - 
+                          ((__s32) stats->qual.level) -
                           ((stats->qual.updated & IW_QUAL_DBM) ? 0x100 : 0),
                           stats->qual.updated & IW_QUAL_LEVEL_UPDATED
                           ? '.' : ' ',
-                          ((__s32) stats->qual.noise) - 
+                          ((__s32) stats->qual.noise) -
                           ((stats->qual.updated & IW_QUAL_DBM) ? 0x100 : 0),
                           stats->qual.updated & IW_QUAL_NOISE_UPDATED
                           ? '.' : ' ',
@@ -674,7 +674,7 @@ static int wireless_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &wireless_seq_ops);
 }
 
-static struct file_operations wireless_seq_fops = {
+static const struct file_operations wireless_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = wireless_seq_open,
        .read    = seq_read,
@@ -862,7 +862,7 @@ static int ioctl_standard_call(struct net_device *  dev,
                                           iwr->u.data.length *
                                           descr->token_size);
                        if (err)
-                               ret =  -EFAULT;                            
+                               ret =  -EFAULT;
 #ifdef WE_IOCTL_DEBUG
                        printk(KERN_DEBUG "%s (WE) : Wrote %d bytes\n",
                               dev->name,
@@ -1040,7 +1040,7 @@ static inline int ioctl_private_call(struct net_device *  dev,
                        err = copy_to_user(iwr->u.data.pointer, extra,
                                           extra_size);
                        if (err)
-                               ret =  -EFAULT;                            
+                               ret =  -EFAULT;
 #ifdef WE_IOCTL_DEBUG
                        printk(KERN_DEBUG "%s (WE) : Wrote %d elem\n",
                               dev->name, iwr->u.data.length);
@@ -1080,7 +1080,7 @@ int wireless_process_ioctl(struct ifreq *ifr, unsigned int cmd)
        /* A bunch of special cases, then the generic case...
         * Note that 'cmd' is already filtered in dev_ioctl() with
         * (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) */
-       switch(cmd) 
+       switch(cmd)
        {
                case SIOCGIWSTATS:
                        /* Get Wireless Stats */
@@ -2015,7 +2015,7 @@ void wireless_send_event(struct net_device *      dev,
                 * The best the driver could do is to log an error message.
                 * We will do it ourselves instead...
                 */
-               printk(KERN_ERR "%s (WE) : Invalid/Unknown Wireless Event (0x%04X)\n",
+               printk(KERN_ERR "%s (WE) : Invalid/Unknown Wireless Event (0x%04X)\n",
                       dev->name, cmd);
                return;
        }
@@ -2029,11 +2029,11 @@ void wireless_send_event(struct net_device *    dev,
        if(descr->header_type == IW_HEADER_TYPE_POINT) {
                /* Check if number of token fits within bounds */
                if(wrqu->data.length > descr->max_tokens) {
-                       printk(KERN_ERR "%s (WE) : Wireless Event too big (%d)\n", dev->name, wrqu->data.length);
+                       printk(KERN_ERR "%s (WE) : Wireless Event too big (%d)\n", dev->name, wrqu->data.length);
                        return;
                }
                if(wrqu->data.length < descr->min_tokens) {
-                       printk(KERN_ERR "%s (WE) : Wireless Event too small (%d)\n", dev->name, wrqu->data.length);
+                       printk(KERN_ERR "%s (WE) : Wireless Event too small (%d)\n", dev->name, wrqu->data.length);
                        return;
                }
                /* Calculate extra_len - extra is NULL for restricted events */
index fd38b05d6f79ec146edda973d2a307653a0c01f8..248d20f4c7c4edb45d94715b244331b760e77775 100644 (file)
@@ -139,7 +139,7 @@ static int ccid2_hc_tx_send_packet(struct sock *sk, struct sk_buff *skb)
                return 0;
        }
 
-        hctx = ccid2_hc_tx_sk(sk);
+       hctx = ccid2_hc_tx_sk(sk);
 
        ccid2_pr_debug("pipe=%d cwnd=%d\n", hctx->ccid2hctx_pipe,
                       hctx->ccid2hctx_cwnd);
@@ -368,13 +368,13 @@ static void ccid2_hc_tx_packet_sent(struct sock *sk, int more, unsigned int len)
 static int ccid2_ackvector(struct sock *sk, struct sk_buff *skb, int offset,
                           unsigned char **vec, unsigned char *veclen)
 {
-        const struct dccp_hdr *dh = dccp_hdr(skb);
-        unsigned char *options = (unsigned char *)dh + dccp_hdr_len(skb);
-        unsigned char *opt_ptr;
-        const unsigned char *opt_end = (unsigned char *)dh +
-                                        (dh->dccph_doff * 4);
-        unsigned char opt, len;
-        unsigned char *value;
+       const struct dccp_hdr *dh = dccp_hdr(skb);
+       unsigned char *options = (unsigned char *)dh + dccp_hdr_len(skb);
+       unsigned char *opt_ptr;
+       const unsigned char *opt_end = (unsigned char *)dh +
+                                       (dh->dccph_doff * 4);
+       unsigned char opt, len;
+       unsigned char *value;
 
        BUG_ON(offset < 0);
        options += offset;
@@ -383,29 +383,29 @@ static int ccid2_ackvector(struct sock *sk, struct sk_buff *skb, int offset,
                return -1;
 
        while (opt_ptr != opt_end) {
-                opt   = *opt_ptr++;
-                len   = 0;
-                value = NULL;
-
-                /* Check if this isn't a single byte option */
-                if (opt > DCCPO_MAX_RESERVED) {
-                        if (opt_ptr == opt_end)
-                                goto out_invalid_option;
-
-                        len = *opt_ptr++;
-                        if (len < 3)
-                                goto out_invalid_option;
-                        /*
-                         * Remove the type and len fields, leaving
-                         * just the value size
-                         */
-                        len     -= 2;
-                        value   = opt_ptr;
-                        opt_ptr += len;
-
-                        if (opt_ptr > opt_end)
-                                goto out_invalid_option;
-                }
+               opt   = *opt_ptr++;
+               len   = 0;
+               value = NULL;
+
+               /* Check if this isn't a single byte option */
+               if (opt > DCCPO_MAX_RESERVED) {
+                       if (opt_ptr == opt_end)
+                               goto out_invalid_option;
+
+                       len = *opt_ptr++;
+                       if (len < 3)
+                               goto out_invalid_option;
+                       /*
+                        * Remove the type and len fields, leaving
+                        * just the value size
+                        */
+                       len     -= 2;
+                       value   = opt_ptr;
+                       opt_ptr += len;
+
+                       if (opt_ptr > opt_end)
+                               goto out_invalid_option;
+               }
 
                switch (opt) {
                case DCCPO_ACK_VECTOR_0:
@@ -432,7 +432,7 @@ static void ccid2_hc_tx_kill_rto_timer(struct sock *sk)
 }
 
 static inline void ccid2_new_ack(struct sock *sk,
-                                struct ccid2_seq *seqp,
+                                struct ccid2_seq *seqp,
                                 unsigned int *maxincr)
 {
        struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
@@ -759,7 +759,7 @@ static void ccid2_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
 
 static int ccid2_hc_tx_init(struct ccid *ccid, struct sock *sk)
 {
-        struct ccid2_hc_tx_sock *hctx = ccid_priv(ccid);
+       struct ccid2_hc_tx_sock *hctx = ccid_priv(ccid);
 
        ccid2_change_cwnd(hctx, 1);
        /* Initialize ssthresh to infinity.  This means that we will exit the
@@ -793,7 +793,7 @@ static int ccid2_hc_tx_init(struct ccid *ccid, struct sock *sk)
 
 static void ccid2_hc_tx_exit(struct sock *sk)
 {
-        struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
+       struct ccid2_hc_tx_sock *hctx = ccid2_hc_tx_sk(sk);
        int i;
 
        ccid2_hc_tx_kill_rto_timer(sk);
index 5c452a3ec4d1521ee60f159735693909c918c27c..5361a4d8e13b54dc8d18ca2ea3fd959745928d06 100644 (file)
@@ -284,7 +284,7 @@ static void ccid3_hc_tx_no_feedback_timer(unsigned long data)
 
 restart_timer:
        sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer,
-                          jiffies + usecs_to_jiffies(t_nfb));
+                          jiffies + usecs_to_jiffies(t_nfb));
 out:
        bh_unlock_sock(sk);
        sock_put(sk);
@@ -319,7 +319,7 @@ static int ccid3_hc_tx_send_packet(struct sock *sk, struct sk_buff *skb)
        case TFRC_SSTATE_NO_SENT:
                sk_reset_timer(sk, &hctx->ccid3hctx_no_feedback_timer,
                               (jiffies +
-                               usecs_to_jiffies(TFRC_INITIAL_TIMEOUT)));
+                               usecs_to_jiffies(TFRC_INITIAL_TIMEOUT)));
                hctx->ccid3hctx_last_win_count   = 0;
                hctx->ccid3hctx_t_last_win_count = now;
                ccid3_hc_tx_set_state(sk, TFRC_SSTATE_NO_FBACK);
@@ -487,7 +487,7 @@ static void ccid3_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb)
                        ccid3_hc_tx_set_state(sk, TFRC_SSTATE_FBACK);
                } else {
                        hctx->ccid3hctx_rtt = (9 * hctx->ccid3hctx_rtt +
-                                                  (u32)r_sample) / 10;
+                                                  (u32)r_sample) / 10;
 
                        /* Update sending rate (step 4 of [RFC 3448, 4.3]) */
                        if (hctx->ccid3hctx_p > 0)
@@ -924,7 +924,7 @@ static void ccid3_hc_rx_update_li(struct sock *sk, u64 seq_loss, u8 win_loss)
 }
 
 static int ccid3_hc_rx_detect_loss(struct sock *sk,
-                                    struct dccp_rx_hist_entry *packet)
+                                   struct dccp_rx_hist_entry *packet)
 {
        struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
        struct dccp_rx_hist_entry *rx_hist =
@@ -1074,7 +1074,7 @@ static void ccid3_hc_rx_packet_recv(struct sock *sk, struct sk_buff *skb)
                       dccp_role(sk), sk, dccp_state_name(sk->sk_state));
 
        p_prev = hcrx->ccid3hcrx_p;
-       
+
        /* Calculate loss event rate */
        if (!list_empty(&hcrx->ccid3hcrx_li_hist)) {
                u32 i_mean = dccp_li_hist_calc_i_mean(&hcrx->ccid3hcrx_li_hist);
@@ -1156,7 +1156,7 @@ static int ccid3_hc_rx_getsockopt(struct sock *sk, const int optname, int len,
 {
        const struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
        const void *val;
-       
+
        /* Listen socks doesn't have a private CCID block */
        if (sk->sk_state == DCCP_LISTEN)
                return -EINVAL;
@@ -1183,7 +1183,7 @@ static int ccid3_hc_tx_getsockopt(struct sock *sk, const int optname, int len,
 {
        const struct ccid3_hc_tx_sock *hctx = ccid3_hc_tx_sk(sk);
        const void *val;
-       
+
        /* Listen socks doesn't have a private CCID block */
        if (sk->sk_state == DCCP_LISTEN)
                return -EINVAL;
index 1f960c19ea1bf0ca948403321efd30e09fb98de8..60d00f01539021742a329d212ed0dd84d12c7c7e 100644 (file)
@@ -137,7 +137,7 @@ extern void                 dccp_rx_hist_delete(struct dccp_rx_hist *hist);
 static inline struct dccp_rx_hist_entry *
                        dccp_rx_hist_entry_new(struct dccp_rx_hist *hist,
                                               const struct sock *sk,
-                                              const u32 ndp,
+                                              const u32 ndp,
                                               const struct sk_buff *skb,
                                               const gfp_t prio)
 {
@@ -169,7 +169,7 @@ static inline struct dccp_rx_hist_entry *
 }
 
 extern int dccp_rx_hist_find_entry(const struct list_head *list, const u64 seq,
-                                  u8 *ccval);
+                                  u8 *ccval);
 extern struct dccp_rx_hist_entry *
                dccp_rx_hist_find_data_packet(const struct list_head *list);
 
index 90009fd77e158f03e3e1a4002a23be34d0bd7e01..e4e64b76c10ca8335aa71328e6f40cb462239ddf 100644 (file)
@@ -26,7 +26,7 @@
   The following two-column lookup table implements a part of the TCP throughput
   equation from [RFC 3448, sec. 3.1]:
 
-                                    s
+                                    s
   X_calc  =  --------------------------------------------------------------
             R * sqrt(2*b*p/3) + (3 * t_RTO * sqrt(3*b*p/8) * (p + 32*p^3))
 
@@ -35,7 +35,7 @@
        s      is the packet size in bytes
        R      is the round trip time in seconds
        p      is the loss event rate, between 0 and 1.0, of the number of loss
-                     events as a fraction of the number of packets transmitted
+                     events as a fraction of the number of packets transmitted
        t_RTO  is the TCP retransmission timeout value in seconds
        b      is the number of packets acknowledged by a single TCP ACK
 
@@ -47,9 +47,9 @@
 
   which we can break down into:
 
-                      s
+                     s
        X_calc  =  ---------
-                   R * f(p)
+                   R * f(p)
 
   where f(p) is given for 0 < p <= 1 by:
 
@@ -62,7 +62,7 @@
     * the return result f(p)
   The lookup table therefore actually tabulates the following function g(q):
 
-       g(q)  =  1000000 * f(q/1000000)
+       g(q)  =  1000000 * f(q/1000000)
 
   Hence, when p <= 1, q must be less than or equal to 1000000. To achieve finer
   granularity for the practically more relevant case of small values of p (up to
@@ -628,7 +628,7 @@ u32 tfrc_calc_x(u16 s, u32 R, u32 p)
        if (R == 0) {                   /* possible  divide by zero */
                DCCP_CRIT("WARNING: RTT is 0, returning maximum X_calc.");
                return ~0U;
-       }
+       }
 
        if (p <= TFRC_CALC_X_SPLIT)             {     /* 0.0000 < p <= 0.05   */
                if (p < TFRC_SMALLEST_P) {            /* 0.0000 < p <  0.0001 */
@@ -638,7 +638,7 @@ u32 tfrc_calc_x(u16 s, u32 R, u32 p)
                } else                                /* 0.0001 <= p <= 0.05  */
                        index =  p/TFRC_SMALLEST_P - 1;
 
-               f = tfrc_calc_x_lookup[index][1];
+               f = tfrc_calc_x_lookup[index][1];
 
        } else {                                      /* 0.05   <  p <= 1.00  */
                index = p/(1000000/TFRC_CALC_X_ARRSIZE) - 1;
@@ -687,8 +687,8 @@ u32 tfrc_calc_x_reverse_lookup(u32 fvalue)
        if (fvalue <= tfrc_calc_x_lookup[TFRC_CALC_X_ARRSIZE - 1][1]) {
                index = tfrc_binsearch(fvalue, 1);
                return (index + 1) * TFRC_CALC_X_SPLIT / TFRC_CALC_X_ARRSIZE;
-       }
+       }
+
        /* else ... it must be in the coarse-grained column */
        index = tfrc_binsearch(fvalue, 0);
        return (index + 1) * 1000000 / TFRC_CALC_X_ARRSIZE;
index a0900bf98e6bbaf223f6cc3a02b500772ecc1781..e33a9edb40363ef7c964de7de3eb55c0c81d7846 100644 (file)
@@ -22,7 +22,7 @@
  *     DCCP - specific warning and debugging macros.
  */
 #define DCCP_WARN(fmt, a...) LIMIT_NETDEBUG(KERN_WARNING "%s: " fmt,       \
-                                                       __FUNCTION__, ##a)
+                                                       __FUNCTION__, ##a)
 #define DCCP_CRIT(fmt, a...) printk(KERN_CRIT fmt " at %s:%d/%s()\n", ##a, \
                                         __FILE__, __LINE__, __FUNCTION__)
 #define DCCP_BUG(a...)       do { DCCP_CRIT("BUG: " a); dump_stack(); } while(0)
@@ -34,7 +34,7 @@
 #ifdef MODULE
 #define DCCP_PRINTK(enable, fmt, args...)      do { if (enable)             \
                                                        printk(fmt, ##args); \
-                                               } while(0)
+                                               } while(0)
 #else
 #define DCCP_PRINTK(enable, fmt, args...)      printk(fmt, ##args)
 #endif
@@ -128,7 +128,7 @@ enum {
        DCCP_MIB_ACTIVEOPENS,                   /* ActiveOpens */
        DCCP_MIB_ESTABRESETS,                   /* EstabResets */
        DCCP_MIB_CURRESTAB,                     /* CurrEstab */
-       DCCP_MIB_OUTSEGS,                       /* OutSegs */ 
+       DCCP_MIB_OUTSEGS,                       /* OutSegs */
        DCCP_MIB_OUTRSTS,
        DCCP_MIB_ABORTONTIMEOUT,
        DCCP_MIB_TIMEOUTS,
@@ -372,7 +372,7 @@ static inline void dccp_update_gss(struct sock *sk, u64 seq)
                       (dp->dccps_gss -
                        dccp_msk(sk)->dccpms_sequence_window + 1));
 }
-                               
+
 static inline int dccp_ack_pending(const struct sock *sk)
 {
        const struct dccp_sock *dp = dccp_sk(sk);
index 95b6927ec6530eef17fab12cc5784d101fa7ded9..cd845df5320dbe6bb74d6ee2dfcbad8244a7723e 100644 (file)
@@ -480,8 +480,8 @@ void dccp_feat_clean(struct dccp_minisock *dmsk)
 
        list_for_each_entry_safe(opt, next, &dmsk->dccpms_pending,
                                 dccpop_node) {
-                BUG_ON(opt->dccpop_val == NULL);
-                kfree(opt->dccpop_val);
+               BUG_ON(opt->dccpop_val == NULL);
+               kfree(opt->dccpop_val);
 
                if (opt->dccpop_sc != NULL) {
                        BUG_ON(opt->dccpop_sc->dccpoc_val == NULL);
@@ -489,8 +489,8 @@ void dccp_feat_clean(struct dccp_minisock *dmsk)
                        kfree(opt->dccpop_sc);
                }
 
-                kfree(opt);
-        }
+               kfree(opt);
+       }
        INIT_LIST_HEAD(&dmsk->dccpms_pending);
 
        list_for_each_entry_safe(opt, next, &dmsk->dccpms_conf, dccpop_node) {
index 2c373ad7edcf297ea2404db9bf9c81d55aaf34c3..177f7dee4d101bf3a5963b0cd61d03cc1c605552 100644 (file)
@@ -30,7 +30,7 @@ static inline int dccp_feat_is_reserved(const u8 feat)
 {
        return (feat > DCCPF_DATA_CHECKSUM &&
                feat < DCCPF_MIN_CCID_SPECIFIC) ||
-               feat == DCCPF_RESERVED;
+               feat == DCCPF_RESERVED;
 }
 
 /* feature negotiation knows only these four option types (RFC 4340, sec. 6) */
index 565bc80557ceb79139ea96c930652def3a56237d..4dee462f00db2c11fab14f709e15d8f6cd97432a 100644 (file)
@@ -91,7 +91,7 @@ static int dccp_check_seqno(struct sock *sk, struct sk_buff *skb)
                else
                        return -1;
        }
-       
+
        /*
         *   Step 6: Check sequence numbers
         *      Let LSWL = S.SWL and LAWL = S.AWL
@@ -136,7 +136,7 @@ static int dccp_check_seqno(struct sock *sk, struct sk_buff *skb)
                          (unsigned long long) DCCP_SKB_CB(skb)->dccpd_seq,
                          (unsigned long long) dp->dccps_swh,
                          (DCCP_SKB_CB(skb)->dccpd_ack_seq ==
-                               DCCP_PKT_WITHOUT_ACK_SEQ) ? "doesn't exist" : "exists",
+                               DCCP_PKT_WITHOUT_ACK_SEQ) ? "doesn't exist" : "exists",
                          (unsigned long long) lawl,
                          (unsigned long long) DCCP_SKB_CB(skb)->dccpd_ack_seq,
                          (unsigned long long) dp->dccps_awh);
@@ -308,11 +308,11 @@ static int dccp_rcv_request_sent_state_process(struct sock *sk,
                if (dccp_parse_options(sk, skb))
                        goto out_invalid_packet;
 
-                if (dccp_msk(sk)->dccpms_send_ack_vector &&
-                    dccp_ackvec_add(dp->dccps_hc_rx_ackvec, sk,
-                                    DCCP_SKB_CB(skb)->dccpd_seq,
-                                    DCCP_ACKVEC_STATE_RECEIVED))
-                        goto out_invalid_packet; /* FIXME: change error code */
+               if (dccp_msk(sk)->dccpms_send_ack_vector &&
+                   dccp_ackvec_add(dp->dccps_hc_rx_ackvec, sk,
+                                   DCCP_SKB_CB(skb)->dccpd_seq,
+                                   DCCP_ACKVEC_STATE_RECEIVED))
+                       goto out_invalid_packet; /* FIXME: change error code */
 
                dp->dccps_isr = DCCP_SKB_CB(skb)->dccpd_seq;
                dccp_update_gsr(sk, dp->dccps_isr);
index fa2c982d43095f78022fbbef0f234fd47c489690..4a83978aa660dd9a628bb9134af6bd853de1353d 100644 (file)
@@ -106,7 +106,7 @@ int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
                goto failure;
 
        err = ip_route_newports(&rt, IPPROTO_DCCP, inet->sport, inet->dport,
-                               sk);
+                               sk);
        if (err != 0)
                goto failure;
 
@@ -157,7 +157,7 @@ static inline void dccp_do_pmtu_discovery(struct sock *sk,
        /* We don't check in the destentry if pmtu discovery is forbidden
         * on this route. We just assume that no packet_to_big packets
         * are send back when pmtu discovery is not active.
-        * There is a small race when the user changes this flag in the
+        * There is a small race when the user changes this flag in the
         * route, but I think that's acceptable.
         */
        if ((dst = __sk_dst_check(sk, 0)) == NULL)
@@ -486,7 +486,7 @@ static int dccp_v4_send_response(struct sock *sk, struct request_sock *req,
        struct sk_buff *skb;
 
        /* First, grab a route. */
-       
+
        if (dst == NULL && (dst = inet_csk_route_req(sk, req)) == NULL)
                goto out;
 
index 79140b3e592e40231585357ba045454af64308ee..7f51e8db3967280e7698fb1c916a64c6c4a5b24c 100644 (file)
@@ -734,7 +734,7 @@ static int dccp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
           looks not very well thought. For now we latch
           options, received in the last packet, enqueued
           by tcp. Feel free to propose better solution.
-                                              --ANK (980728)
+                                              --ANK (980728)
         */
        if (np->rxopt.all)
        /*
index c03ba61eb6da3c37a1bd225a24b566fdd2e89434..ca13f77319940893459e47c23794abe00f61c905 100644 (file)
@@ -242,7 +242,7 @@ int dccp_parse_options(struct sock *sk, struct sk_buff *skb)
                        DCCP_CRIT("DCCP(%p): option %d(len=%d) not "
                                  "implemented, ignoring", sk, opt, len);
                        break;
-               }
+               }
 
                if (opt != DCCPO_MANDATORY)
                        mandatory = 0;
@@ -442,7 +442,7 @@ static int dccp_insert_option_timestamp_echo(struct sock *sk,
 }
 
 static int dccp_insert_feat_opt(struct sk_buff *skb, u8 type, u8 feat,
-                               u8 *val, u8 len)
+                               u8 *val, u8 len)
 {
        u8 *to;
 
index 3435542e96528f5cce06257980e7ee95cc28ccf8..f5c6aca1dfa45557a31ed6f9fe0a9b0d4f109a9f 100644 (file)
@@ -87,7 +87,7 @@ static int dccp_transmit_skb(struct sock *sk, struct sk_buff *skb)
                        kfree_skb(skb);
                        return -EPROTO;
                }
-               
+
 
                /* Build DCCP header and checksum it. */
                dh = dccp_zeroed_hdr(skb, dccp_header_size);
@@ -415,7 +415,7 @@ static inline void dccp_connect_init(struct sock *sk)
 
        sk->sk_err = 0;
        sock_reset_flag(sk, SOCK_DONE);
-       
+
        dccp_sync_mss(sk, dst_mtu(dst));
 
        /*
index f81e37de35d594714ebb84d73d2a336d7fb30515..3b1f509f51dd7000c474f420aa2ef0ebc75a08cc 100644 (file)
@@ -149,7 +149,7 @@ out_free:
        return error ? error : cnt;
 }
 
-static struct file_operations dccpprobe_fops = {
+static const struct file_operations dccpprobe_fops = {
        .owner   = THIS_MODULE,
        .open    = dccpprobe_open,
        .read    = dccpprobe_read,
index 48438565d70f8da9b6d7938d22b2d61512582c6f..cf28c53a389a24b49c82ccc21721139bcbf110e1 100644 (file)
@@ -478,7 +478,7 @@ static int do_dccp_setsockopt(struct sock *sk, int level, int optname,
                        err = -EINVAL;
                else
                        err = dccp_setsockopt_change(sk, DCCPO_CHANGE_L,
-                                                    (struct dccp_so_feat __user *)
+                                                    (struct dccp_so_feat __user *)
                                                     optval);
                break;
        case DCCP_SOCKOPT_CHANGE_R:
index fdcfca3e9208926809e769f469a0fd139050c153..1260aabac5e1b1cc17332d01649121b5068ca922 100644 (file)
@@ -127,7 +127,7 @@ static struct ctl_table_header *dccp_table_header;
 
 int __init dccp_sysctl_init(void)
 {
-       dccp_table_header = register_sysctl_table(dccp_root_table, 1);
+       dccp_table_header = register_sysctl_table(dccp_root_table);
 
        return dccp_table_header != NULL ? 0 : -ENOMEM;
 }
index e5348f369c60a09055e4f7b464d9e3520eb95f35..41ea0f6594c4a5b26e82247cddc3539f90f06001 100644 (file)
@@ -60,7 +60,7 @@ static int dccp_write_timeout(struct sock *sk)
    be far nicer to have all of the black holes fixed rather than fixing
    all of the TCP implementations."
 
-                           Golden words :-).
+                          Golden words :-).
                   */
 
                        dst_negative_advice(&sk->sk_dst_cache);
index 21f20f21dd3273c770d492494f71c214ea6ea41e..c6568d637e1acfbcfbf6969d45812396ee1b625d 100644 (file)
@@ -45,7 +45,7 @@
 
 /******************************************************************************
     (c) 1995-1998 E.M. Serrat          emserrat@geocities.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
@@ -63,7 +63,7 @@ Version           Kernel     Date       Author/Comments
 Version 0.0.1     2.0.30    01-dic-97  Eduardo Marcelo Serrat
                                        (emserrat@geocities.com)
 
-                                        First Development of DECnet Socket La-
+                                       First Development of DECnet Socket La-
                                        yer for Linux. Only supports outgoing
                                        connections.
 
@@ -75,28 +75,28 @@ Version 0.0.2         2.1.105   20-jun-98   Patrick J. Caulfield
 Version 0.0.3     2.1.106   25-jun-98   Eduardo Marcelo Serrat
                                        (emserrat@geocities.com)
                                        _
-                                        Added support for incoming connections
-                                        so we can start developing server apps
-                                        on Linux.
+                                       Added support for incoming connections
+                                       so we can start developing server apps
+                                       on Linux.
                                        -
                                        Module Support
 Version 0.0.4     2.1.109   21-jul-98   Eduardo Marcelo Serrat
-                                       (emserrat@geocities.com)
-                                       _
-                                        Added support for X11R6.4. Now we can 
-                                        use DECnet transport for X on Linux!!!
-                                       -
+                                      (emserrat@geocities.com)
+                                      _
+                                       Added support for X11R6.4. Now we can
+                                       use DECnet transport for X on Linux!!!
+                                      -
 Version 0.0.5    2.1.110   01-aug-98   Eduardo Marcelo Serrat
-                                       (emserrat@geocities.com)
-                                       Removed bugs on flow control
-                                       Removed bugs on incoming accessdata
-                                       order
-                                       -
+                                      (emserrat@geocities.com)
+                                      Removed bugs on flow control
+                                      Removed bugs on incoming accessdata
+                                      order
+                                      -
 Version 0.0.6    2.1.110   07-aug-98   Eduardo Marcelo Serrat
-                                       dn_recvmsg fixes
+                                      dn_recvmsg fixes
 
-                                        Patrick J. Caulfield
-                                       dn_bind fixes
+                                       Patrick J. Caulfield
+                                      dn_bind fixes
 *******************************************************************************/
 
 #include <linux/module.h>
@@ -169,7 +169,7 @@ static struct hlist_head *dn_find_list(struct sock *sk)
        return &dn_sk_hash[dn_ntohs(scp->addrloc) & DN_SK_HASH_MASK];
 }
 
-/* 
+/*
  * Valid ports are those greater than zero and not already in use.
  */
 static int check_port(__le16 port)
@@ -218,7 +218,7 @@ static int dn_hash_sock(struct sock *sk)
        BUG_ON(sk_hashed(sk));
 
        write_lock_bh(&dn_hash_lock);
-       
+
        if (!scp->addrloc && !port_alloc(sk))
                goto out;
 
@@ -400,7 +400,7 @@ struct sock *dn_sklist_find_listener(struct sockaddr_dn *addr)
 
        sk = sk_head(&dn_wild_sk);
        if (sk) {
-               if (sk->sk_state == TCP_LISTEN)
+               if (sk->sk_state == TCP_LISTEN)
                        sock_hold(sk);
                else
                        sk = NULL;
@@ -500,7 +500,7 @@ static struct sock *dn_alloc_sock(struct socket *sock, gfp_t gfp)
        scp->ackxmt_oth = 0;            /* Last oth data ack'ed */
        scp->ackrcv_dat = 0;            /* Highest data ack recv*/
        scp->ackrcv_oth = 0;            /* Last oth data ack rec*/
-        scp->flowrem_sw = DN_SEND;
+       scp->flowrem_sw = DN_SEND;
        scp->flowloc_sw = DN_SEND;
        scp->flowrem_dat = 0;
        scp->flowrem_oth = 1;
@@ -690,7 +690,7 @@ static int dn_create(struct socket *sock, int protocol)
        }
 
 
-       if ((sk = dn_alloc_sock(sock, GFP_KERNEL)) == NULL) 
+       if ((sk = dn_alloc_sock(sock, GFP_KERNEL)) == NULL)
                return -ENOBUFS;
 
        sk->sk_protocol = protocol;
@@ -713,7 +713,7 @@ dn_release(struct socket *sock)
                sock_put(sk);
        }
 
-        return 0;
+       return 0;
 }
 
 static int dn_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
@@ -770,7 +770,7 @@ static int dn_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
        }
        release_sock(sk);
 
-        return rv;
+       return rv;
 }
 
 
@@ -791,7 +791,7 @@ static int dn_auto_bind(struct socket *sock)
         */
        if ((scp->accessdata.acc_accl != 0) &&
                (scp->accessdata.acc_accl <= 12)) {
-       
+
                scp->addr.sdn_objnamel = dn_htons(scp->accessdata.acc_accl);
                memcpy(scp->addr.sdn_objname, scp->accessdata.acc_acc, dn_ntohs(scp->addr.sdn_objnamel));
 
@@ -997,20 +997,20 @@ static inline int dn_check_state(struct sock *sk, struct sockaddr_dn *addr, int
 
 static void dn_access_copy(struct sk_buff *skb, struct accessdata_dn *acc)
 {
-        unsigned char *ptr = skb->data;
+       unsigned char *ptr = skb->data;
 
-        acc->acc_userl = *ptr++;
-        memcpy(&acc->acc_user, ptr, acc->acc_userl);
-        ptr += acc->acc_userl;
+       acc->acc_userl = *ptr++;
+       memcpy(&acc->acc_user, ptr, acc->acc_userl);
+       ptr += acc->acc_userl;
 
-        acc->acc_passl = *ptr++;
-        memcpy(&acc->acc_pass, ptr, acc->acc_passl);
-        ptr += acc->acc_passl;
+       acc->acc_passl = *ptr++;
+       memcpy(&acc->acc_pass, ptr, acc->acc_passl);
+       ptr += acc->acc_passl;
 
-        acc->acc_accl = *ptr++;
-        memcpy(&acc->acc_acc, ptr, acc->acc_accl);
+       acc->acc_accl = *ptr++;
+       memcpy(&acc->acc_acc, ptr, acc->acc_accl);
 
-        skb_pull(skb, acc->acc_accl + acc->acc_passl + acc->acc_userl + 3);
+       skb_pull(skb, acc->acc_accl + acc->acc_passl + acc->acc_userl + 3);
 
 }
 
@@ -1071,7 +1071,7 @@ static int dn_accept(struct socket *sock, struct socket *newsock, int flags)
 
        lock_sock(sk);
 
-        if (sk->sk_state != TCP_LISTEN || DN_SK(sk)->state != DN_O) {
+       if (sk->sk_state != TCP_LISTEN || DN_SK(sk)->state != DN_O) {
                release_sock(sk);
                return -EINVAL;
        }
@@ -1098,13 +1098,13 @@ static int dn_accept(struct socket *sock, struct socket *newsock, int flags)
        dst_release(xchg(&newsk->sk_dst_cache, skb->dst));
        skb->dst = NULL;
 
-        DN_SK(newsk)->state        = DN_CR;
+       DN_SK(newsk)->state        = DN_CR;
        DN_SK(newsk)->addrrem      = cb->src_port;
        DN_SK(newsk)->services_rem = cb->services;
        DN_SK(newsk)->info_rem     = cb->info;
        DN_SK(newsk)->segsize_rem  = cb->segsize;
        DN_SK(newsk)->accept_mode  = DN_SK(sk)->accept_mode;
-       
+
        if (DN_SK(newsk)->segsize_rem < 230)
                DN_SK(newsk)->segsize_rem = 230;
 
@@ -1154,15 +1154,15 @@ static int dn_accept(struct socket *sock, struct socket *newsock, int flags)
                dn_send_conn_ack(newsk);
 
                /*
-                * Here we use sk->sk_allocation since although the conn conf is
-                * for the newsk, the context is the old socket.
-                */
+                * Here we use sk->sk_allocation since although the conn conf is
+                * for the newsk, the context is the old socket.
+                */
                if (DN_SK(newsk)->accept_mode == ACC_IMMED)
                        err = dn_confirm_accept(newsk, &timeo,
                                                sk->sk_allocation);
        }
        release_sock(newsk);
-        return err;
+       return err;
 }
 
 
@@ -1177,10 +1177,10 @@ static int dn_getname(struct socket *sock, struct sockaddr *uaddr,int *uaddr_len
        lock_sock(sk);
 
        if (peer) {
-               if ((sock->state != SS_CONNECTED && 
-                    sock->state != SS_CONNECTING) && 
+               if ((sock->state != SS_CONNECTED &&
+                    sock->state != SS_CONNECTING) &&
                    scp->accept_mode == ACC_IMMED) {
-                       release_sock(sk);
+                       release_sock(sk);
                        return -ENOTCONN;
                }
 
@@ -1191,7 +1191,7 @@ static int dn_getname(struct socket *sock, struct sockaddr *uaddr,int *uaddr_len
 
        release_sock(sk);
 
-        return 0;
+       return 0;
 }
 
 
@@ -1285,7 +1285,7 @@ static int dn_listen(struct socket *sock, int backlog)
 out:
        release_sock(sk);
 
-        return err;
+       return err;
 }
 
 
@@ -1333,7 +1333,7 @@ static int dn_setsockopt(struct socket *sock, int level, int optname, char __use
        return err;
 }
 
-static int __dn_setsockopt(struct socket *sock, int level,int optname, char __user *optval, int optlen, int flags) 
+static int __dn_setsockopt(struct socket *sock, int level,int optname, char __user *optval, int optlen, int flags)
 {
        struct  sock *sk = sock->sk;
        struct dn_scp *scp = DN_SK(sk);
@@ -1360,7 +1360,7 @@ static int __dn_setsockopt(struct socket *sock, int level,int optname, char __us
 
        switch(optname) {
                case DSO_CONDATA:
-                       if (sock->state == SS_CONNECTED) 
+                       if (sock->state == SS_CONNECTED)
                                return -EISCONN;
                        if ((scp->state != DN_O) && (scp->state != DN_CR))
                                return -EINVAL;
@@ -1375,7 +1375,7 @@ static int __dn_setsockopt(struct socket *sock, int level,int optname, char __us
                        break;
 
                case DSO_DISDATA:
-                       if (sock->state != SS_CONNECTED && scp->accept_mode == ACC_IMMED)
+                       if (sock->state != SS_CONNECTED && scp->accept_mode == ACC_IMMED)
                                return -ENOTCONN;
 
                        if (optlen != sizeof(struct optdata_dn))
@@ -1388,7 +1388,7 @@ static int __dn_setsockopt(struct socket *sock, int level,int optname, char __us
                        break;
 
                case DSO_CONACCESS:
-                       if (sock->state == SS_CONNECTED) 
+                       if (sock->state == SS_CONNECTED)
                                return -EISCONN;
                        if (scp->state != DN_O)
                                return -EINVAL;
@@ -1521,7 +1521,7 @@ static int __dn_getsockopt(struct socket *sock, int level,int optname, char __us
 
        if(get_user(r_len , optlen))
                return -EFAULT;
-               
+
        switch(optname) {
                case DSO_CONDATA:
                        if (r_len > sizeof(struct optdata_dn))
@@ -1573,11 +1573,11 @@ static int __dn_getsockopt(struct socket *sock, int level,int optname, char __us
 #ifdef CONFIG_NETFILTER
                {
                        int val, len;
-                       
+
                        if(get_user(len, optlen))
                                return -EFAULT;
-                       
-                       val = nf_getsockopt(sk, PF_DECnet, optname, 
+
+                       val = nf_getsockopt(sk, PF_DECnet, optname,
                                                        optval, &len);
                        if (val >= 0)
                                val = put_user(len, optlen);
@@ -1588,7 +1588,7 @@ static int __dn_getsockopt(struct socket *sock, int level,int optname, char __us
                case DSO_SEQPACKET:
                case DSO_CONACCEPT:
                case DSO_CONREJECT:
-                       return -ENOPROTOOPT;
+                       return -ENOPROTOOPT;
 
                case DSO_MAXWINDOW:
                        if (r_len > sizeof(unsigned long))
@@ -1724,7 +1724,7 @@ static int dn_recvmsg(struct kiocb *iocb, struct socket *sock,
                                }
                        }
                }
-               
+
                if (scp->state != DN_RUN)
                        goto out;
 
@@ -1773,7 +1773,7 @@ static int dn_recvmsg(struct kiocb *iocb, struct socket *sock,
                if (skb->len == 0) {
                        skb_unlink(skb, queue);
                        kfree_skb(skb);
-                       /* 
+                       /*
                         * N.B. Don't refer to skb or cb after this point
                         * in loop.
                         */
@@ -1783,7 +1783,7 @@ static int dn_recvmsg(struct kiocb *iocb, struct socket *sock,
                        }
                }
 
-               if (eor) { 
+               if (eor) {
                        if (sk->sk_type == SOCK_SEQPACKET)
                                break;
                        if (!(flags & MSG_WAITALL))
@@ -1884,7 +1884,7 @@ static inline unsigned int dn_current_mss(struct sock *sk, int flags)
        return mss_now;
 }
 
-/* 
+/*
  * N.B. We get the timeout wrong here, but then we always did get it
  * wrong before and this is another step along the road to correcting
  * it. It ought to get updated each time we pass through the routine,
@@ -2044,7 +2044,7 @@ static int dn_sendmsg(struct kiocb *iocb, struct socket *sock,
                                cb->nsp_flags |= 0x20;
 
                        scp->seg_total += len;
-               
+
                        if (((sent + len) == size) && (flags & MSG_EOR)) {
                                cb->nsp_flags |= 0x40;
                                scp->seg_total = 0;
@@ -2202,7 +2202,7 @@ static void dn_socket_seq_stop(struct seq_file *seq, void *v)
 static void dn_printable_object(struct sockaddr_dn *dn, unsigned char *buf)
 {
        int i;
-    
+
        switch (dn_ntohs(dn->sdn_objnamel)) {
                case 0:
                        sprintf(buf, "%d", dn->sdn_objnum);
@@ -2214,7 +2214,7 @@ static void dn_printable_object(struct sockaddr_dn *dn, unsigned char *buf)
                                        buf[i] = '.';
                        }
                        buf[i] = 0;
-       }
+       }
 }
 
 static char *dn_state2asc(unsigned char state)
@@ -2331,7 +2331,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations dn_socket_seq_fops = {
+static const struct file_operations dn_socket_seq_fops = {
        .owner          = THIS_MODULE,
        .open           = dn_socket_seq_open,
        .read           = seq_read,
@@ -2381,7 +2381,7 @@ static int __init decnet_init(void)
 {
        int rc;
 
-        printk(banner);
+       printk(banner);
 
        rc = proto_register(&dn_proto, 1);
        if (rc != 0)
index 90b3dfd72b497d9a94500158b2eb21c570844bd5..060d725e2942b909580497b2a3c7ee9c9fe8c475 100644 (file)
@@ -224,27 +224,27 @@ static struct dn_dev_sysctl_table {
        {0}
        },
        {{
-               .ctl_name = 0, 
-               .procname = "", 
-               .mode = 0555, 
+               .ctl_name = 0,
+               .procname = "",
+               .mode = 0555,
                .child = dn_dev_sysctl.dn_dev_vars
        }, {0}},
        {{
                .ctl_name = NET_DECNET_CONF,
-               .procname = "conf", 
-               .mode = 0555, 
+               .procname = "conf",
+               .mode = 0555,
                .child = dn_dev_sysctl.dn_dev_dev
        }, {0}},
        {{
-               .ctl_name = NET_DECNET, 
-               .procname = "decnet", 
-               .mode = 0555, 
+               .ctl_name = NET_DECNET,
+               .procname = "decnet",
+               .mode = 0555,
                .child = dn_dev_sysctl.dn_dev_conf_dir
        }, {0}},
        {{
-               .ctl_name = CTL_NET, 
-               .procname = "net", 
-               .mode = 0555, 
+               .ctl_name = CTL_NET,
+               .procname = "net",
+               .mode = 0555,
                .child = dn_dev_sysctl.dn_dev_proto_dir
        }, {0}}
 };
@@ -261,7 +261,6 @@ static void dn_dev_sysctl_register(struct net_device *dev, struct dn_dev_parms *
        for(i = 0; i < ARRAY_SIZE(t->dn_dev_vars) - 1; i++) {
                long offset = (long)t->dn_dev_vars[i].data;
                t->dn_dev_vars[i].data = ((char *)parms) + offset;
-               t->dn_dev_vars[i].de = NULL;
        }
 
        if (dev) {
@@ -273,16 +272,12 @@ static void dn_dev_sysctl_register(struct net_device *dev, struct dn_dev_parms *
        }
 
        t->dn_dev_dev[0].child = t->dn_dev_vars;
-       t->dn_dev_dev[0].de = NULL;
        t->dn_dev_conf_dir[0].child = t->dn_dev_dev;
-       t->dn_dev_conf_dir[0].de = NULL;
        t->dn_dev_proto_dir[0].child = t->dn_dev_conf_dir;
-       t->dn_dev_proto_dir[0].de = NULL;
        t->dn_dev_root_dir[0].child = t->dn_dev_proto_dir;
-       t->dn_dev_root_dir[0].de = NULL;
        t->dn_dev_vars[0].extra1 = (void *)dev;
 
-       t->sysctl_header = register_sysctl_table(t->dn_dev_root_dir, 0);
+       t->sysctl_header = register_sysctl_table(t->dn_dev_root_dir);
        if (t->sysctl_header == NULL)
                kfree(t);
        else
@@ -299,7 +294,7 @@ static void dn_dev_sysctl_unregister(struct dn_dev_parms *parms)
        }
 }
 
-static int dn_forwarding_proc(ctl_table *table, int write, 
+static int dn_forwarding_proc(ctl_table *table, int write,
                                struct file *filep,
                                void __user *buffer,
                                size_t *lenp, loff_t *ppos)
@@ -456,7 +451,7 @@ static int dn_dev_insert_ifa(struct dn_dev *dn_db, struct dn_ifaddr *ifa)
 
        ASSERT_RTNL();
 
-       /* Check for duplicates */      
+       /* Check for duplicates */
        for(ifa1 = dn_db->ifa_list; ifa1; ifa1 = ifa1->ifa_next) {
                if (ifa1->ifa_local == ifa->ifa_local)
                        return -EEXIST;
@@ -708,7 +703,7 @@ static int dn_nl_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
                if (!dn_db)
                        return err;
        }
-       
+
        if ((ifa = dn_dev_alloc_ifa()) == NULL)
                return -ENOBUFS;
 
@@ -853,7 +848,7 @@ out:
        return rv;
 }
 
-/* 
+/*
  * Find a default address to bind to.
  *
  * This is one of those areas where the initial VMS concepts don't really
@@ -884,39 +879,39 @@ last_chance:
 
 static void dn_send_endnode_hello(struct net_device *dev, struct dn_ifaddr *ifa)
 {
-        struct endnode_hello_message *msg;
-        struct sk_buff *skb = NULL;
-        __le16 *pktlen;
+       struct endnode_hello_message *msg;
+       struct sk_buff *skb = NULL;
+       __le16 *pktlen;
        struct dn_dev *dn_db = (struct dn_dev *)dev->dn_ptr;
 
-        if ((skb = dn_alloc_skb(NULL, sizeof(*msg), GFP_ATOMIC)) == NULL)
+       if ((skb = dn_alloc_skb(NULL, sizeof(*msg), GFP_ATOMIC)) == NULL)
                return;
 
-        skb->dev = dev;
+       skb->dev = dev;
 
-        msg = (struct endnode_hello_message *)skb_put(skb,sizeof(*msg));
+       msg = (struct endnode_hello_message *)skb_put(skb,sizeof(*msg));
 
-        msg->msgflg  = 0x0D;
-        memcpy(msg->tiver, dn_eco_version, 3);
+       msg->msgflg  = 0x0D;
+       memcpy(msg->tiver, dn_eco_version, 3);
        dn_dn2eth(msg->id, ifa->ifa_local);
-        msg->iinfo   = DN_RT_INFO_ENDN;
-        msg->blksize = dn_htons(mtu2blksize(dev));
-        msg->area    = 0x00;
-        memset(msg->seed, 0, 8);
-        memcpy(msg->neighbor, dn_hiord, ETH_ALEN);
+       msg->iinfo   = DN_RT_INFO_ENDN;
+       msg->blksize = dn_htons(mtu2blksize(dev));
+       msg->area    = 0x00;
+       memset(msg->seed, 0, 8);
+       memcpy(msg->neighbor, dn_hiord, ETH_ALEN);
 
        if (dn_db->router) {
                struct dn_neigh *dn = (struct dn_neigh *)dn_db->router;
                dn_dn2eth(msg->neighbor, dn->addr);
        }
 
-        msg->timer   = dn_htons((unsigned short)dn_db->parms.t3);
-        msg->mpd     = 0x00;
-        msg->datalen = 0x02;
-        memset(msg->data, 0xAA, 2);
-        
-        pktlen = (__le16 *)skb_push(skb,2);
-        *pktlen = dn_htons(skb->len - 2);
+       msg->timer   = dn_htons((unsigned short)dn_db->parms.t3);
+       msg->mpd     = 0x00;
+       msg->datalen = 0x02;
+       memset(msg->data, 0xAA, 2);
+
+       pktlen = (__le16 *)skb_push(skb,2);
+       *pktlen = dn_htons(skb->len - 2);
 
        skb->nh.raw = skb->data;
 
@@ -986,11 +981,11 @@ static void dn_send_router_hello(struct net_device *dev, struct dn_ifaddr *ifa)
        dn_dn2eth(ptr, ifa->ifa_local);
        src = ptr;
        ptr += ETH_ALEN;
-       *ptr++ = dn_db->parms.forwarding == 1 ? 
+       *ptr++ = dn_db->parms.forwarding == 1 ?
                        DN_RT_INFO_L1RT : DN_RT_INFO_L2RT;
        *((__le16 *)ptr) = dn_htons(mtu2blksize(dev));
        ptr += 2;
-       *ptr++ = dn_db->parms.priority; /* Priority */ 
+       *ptr++ = dn_db->parms.priority; /* Priority */
        *ptr++ = 0; /* Area: Reserved */
        *((__le16 *)ptr) = dn_htons((unsigned short)dn_db->parms.t3);
        ptr += 2;
@@ -1408,18 +1403,18 @@ static char *dn_type2asc(char type)
 static int dn_dev_seq_show(struct seq_file *seq, void *v)
 {
        if (v == SEQ_START_TOKEN)
-               seq_puts(seq, "Name     Flags T1   Timer1 T3   Timer3 BlkSize Pri State DevType    Router Peer\n");
+               seq_puts(seq, "Name     Flags T1   Timer1 T3   Timer3 BlkSize Pri State DevType    Router Peer\n");
        else {
                struct net_device *dev = v;
                char peer_buf[DN_ASCBUF_LEN];
                char router_buf[DN_ASCBUF_LEN];
                struct dn_dev *dn_db = dev->dn_ptr;
 
-                seq_printf(seq, "%-8s %1s     %04u %04u   %04lu %04lu"
+               seq_printf(seq, "%-8s %1s     %04u %04u   %04lu %04lu"
                                "   %04hu    %03d %02x    %-10s %-7s %-7s\n",
-                               dev->name ? dev->name : "???",
-                               dn_type2asc(dn_db->parms.mode),
-                               0, 0,
+                               dev->name ? dev->name : "???",
+                               dn_type2asc(dn_db->parms.mode),
+                               0, 0,
                                dn_db->t3, dn_db->parms.t3,
                                mtu2blksize(dev),
                                dn_db->parms.priority,
@@ -1442,7 +1437,7 @@ static int dn_dev_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &dn_dev_seq_ops);
 }
 
-static struct file_operations dn_dev_seq_fops = {
+static const struct file_operations dn_dev_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = dn_dev_seq_open,
        .read    = seq_read,
@@ -1476,17 +1471,17 @@ MODULE_PARM_DESC(addr, "The DECnet address of this machine: area,node");
 
 void __init dn_dev_init(void)
 {
-        if (addr[0] > 63 || addr[0] < 0) {
-                printk(KERN_ERR "DECnet: Area must be between 0 and 63");
-                return;
-        }
+       if (addr[0] > 63 || addr[0] < 0) {
+               printk(KERN_ERR "DECnet: Area must be between 0 and 63");
+               return;
+       }
 
-        if (addr[1] > 1023 || addr[1] < 0) {
-                printk(KERN_ERR "DECnet: Node must be between 0 and 1023");
-                return;
-        }
+       if (addr[1] > 1023 || addr[1] < 0) {
+               printk(KERN_ERR "DECnet: Node must be between 0 and 1023");
+               return;
+       }
 
-        decnet_address = dn_htons((addr[0] << 10) | addr[1]);
+       decnet_address = dn_htons((addr[0] << 10) | addr[1]);
 
        dn_dev_devices_on();
 
index 1cf010124ec5ab6a96b2cd22b65171945af2a885..3cbfddc98430a5aa53cb59f0ff60d0a0eb5e6098 100644 (file)
@@ -527,7 +527,7 @@ int dn_fib_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
                return -EINVAL;
 
        tb = dn_fib_get_table(rtm_get_table(rta, r->rtm_table), 1);
-       if (tb) 
+       if (tb)
                return tb->insert(tb, r, (struct dn_kern_rta *)rta, nlh, &NETLINK_CB(skb));
 
        return -ENOBUFS;
@@ -654,80 +654,80 @@ static int dn_fib_dnaddr_event(struct notifier_block *this, unsigned long event,
 
 static int dn_fib_sync_down(__le16 local, struct net_device *dev, int force)
 {
-        int ret = 0;
-        int scope = RT_SCOPE_NOWHERE;
-
-        if (force)
-                scope = -1;
-
-        for_fib_info() {
-                /* 
-                 * This makes no sense for DECnet.... we will almost
-                 * certainly have more than one local address the same
-                 * over all our interfaces. It needs thinking about
-                 * some more.
-                 */
-                if (local && fi->fib_prefsrc == local) {
-                        fi->fib_flags |= RTNH_F_DEAD;
-                        ret++;
-                } else if (dev && fi->fib_nhs) {
-                        int dead = 0;
-
-                        change_nexthops(fi) {
-                                if (nh->nh_flags&RTNH_F_DEAD)
-                                        dead++;
-                                else if (nh->nh_dev == dev &&
-                                                nh->nh_scope != scope) {
+       int ret = 0;
+       int scope = RT_SCOPE_NOWHERE;
+
+       if (force)
+               scope = -1;
+
+       for_fib_info() {
+               /*
+                * This makes no sense for DECnet.... we will almost
+                * certainly have more than one local address the same
+                * over all our interfaces. It needs thinking about
+                * some more.
+                */
+               if (local && fi->fib_prefsrc == local) {
+                       fi->fib_flags |= RTNH_F_DEAD;
+                       ret++;
+               } else if (dev && fi->fib_nhs) {
+                       int dead = 0;
+
+                       change_nexthops(fi) {
+                               if (nh->nh_flags&RTNH_F_DEAD)
+                                       dead++;
+                               else if (nh->nh_dev == dev &&
+                                               nh->nh_scope != scope) {
                                        spin_lock_bh(&dn_fib_multipath_lock);
-                                        nh->nh_flags |= RTNH_F_DEAD;
-                                        fi->fib_power -= nh->nh_power;
-                                        nh->nh_power = 0;
+                                       nh->nh_flags |= RTNH_F_DEAD;
+                                       fi->fib_power -= nh->nh_power;
+                                       nh->nh_power = 0;
                                        spin_unlock_bh(&dn_fib_multipath_lock);
-                                        dead++;
-                                }
-                        } endfor_nexthops(fi)
-                        if (dead == fi->fib_nhs) {
-                                fi->fib_flags |= RTNH_F_DEAD;
-                                ret++;
-                        }
-                }
-        } endfor_fib_info();
-        return ret;
+                                       dead++;
+                               }
+                       } endfor_nexthops(fi)
+                       if (dead == fi->fib_nhs) {
+                               fi->fib_flags |= RTNH_F_DEAD;
+                               ret++;
+                       }
+               }
+       } endfor_fib_info();
+       return ret;
 }
 
 
 static int dn_fib_sync_up(struct net_device *dev)
 {
-        int ret = 0;
-
-        if (!(dev->flags&IFF_UP))
-                return 0;
-
-        for_fib_info() {
-                int alive = 0;
-
-                change_nexthops(fi) {
-                        if (!(nh->nh_flags&RTNH_F_DEAD)) {
-                                alive++;
-                                continue;
-                        }
-                        if (nh->nh_dev == NULL || !(nh->nh_dev->flags&IFF_UP))
-                                continue;
-                        if (nh->nh_dev != dev || dev->dn_ptr == NULL)
-                                continue;
-                        alive++;
+       int ret = 0;
+
+       if (!(dev->flags&IFF_UP))
+               return 0;
+
+       for_fib_info() {
+               int alive = 0;
+
+               change_nexthops(fi) {
+                       if (!(nh->nh_flags&RTNH_F_DEAD)) {
+                               alive++;
+                               continue;
+                       }
+                       if (nh->nh_dev == NULL || !(nh->nh_dev->flags&IFF_UP))
+                               continue;
+                       if (nh->nh_dev != dev || dev->dn_ptr == NULL)
+                               continue;
+                       alive++;
                        spin_lock_bh(&dn_fib_multipath_lock);
-                        nh->nh_power = 0;
-                        nh->nh_flags &= ~RTNH_F_DEAD;
+                       nh->nh_power = 0;
+                       nh->nh_flags &= ~RTNH_F_DEAD;
                        spin_unlock_bh(&dn_fib_multipath_lock);
-                } endfor_nexthops(fi);
-
-                if (alive > 0) {
-                        fi->fib_flags &= ~RTNH_F_DEAD;
-                        ret++;
-                }
-        } endfor_fib_info();
-        return ret;
+               } endfor_nexthops(fi);
+
+               if (alive > 0) {
+                       fi->fib_flags &= ~RTNH_F_DEAD;
+                       ret++;
+               }
+       } endfor_fib_info();
+       return ret;
 }
 
 static struct notifier_block dn_fib_dnaddr_notifier = {
index 7322bb36e825a1625ce4e130efbe02f2309634ab..bf701cf5a386121f9234f7f20f4cb434db350104 100644 (file)
@@ -3,7 +3,7 @@
  *              operating system.  DECnet is implemented using the  BSD Socket
  *              interface as the means of communication with the user level.
  *
- *              DECnet Neighbour Functions (Adjacency Database and 
+ *              DECnet Neighbour Functions (Adjacency Database and
  *                                                        On-Ethernet Cache)
  *
  * Author:      Steve Whitehouse <SteveW@ACM.org>
@@ -277,19 +277,19 @@ static int dn_short_output(struct sk_buff *skb)
        struct dn_skb_cb *cb = DN_SKB_CB(skb);
 
 
-        if (skb_headroom(skb) < headroom) {
-                struct sk_buff *skb2 = skb_realloc_headroom(skb, headroom);
-                if (skb2 == NULL) {
+       if (skb_headroom(skb) < headroom) {
+               struct sk_buff *skb2 = skb_realloc_headroom(skb, headroom);
+               if (skb2 == NULL) {
                        if (net_ratelimit())
-                               printk(KERN_CRIT "dn_short_output: no memory\n");
-                        kfree_skb(skb);
-                        return -ENOBUFS;
-                }
-                kfree_skb(skb);
-                skb = skb2;
+                               printk(KERN_CRIT "dn_short_output: no memory\n");
+                       kfree_skb(skb);
+                       return -ENOBUFS;
+               }
+               kfree_skb(skb);
+               skb = skb2;
                if (net_ratelimit())
-                       printk(KERN_INFO "dn_short_output: Increasing headroom\n");
-        }
+                       printk(KERN_INFO "dn_short_output: Increasing headroom\n");
+       }
 
        data = skb_push(skb, sizeof(struct dn_short_packet) + 2);
        *((__le16 *)data) = dn_htons(skb->len - 2);
@@ -598,7 +598,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations dn_neigh_seq_fops = {
+static const struct file_operations dn_neigh_seq_fops = {
        .owner          = THIS_MODULE,
        .open           = dn_neigh_seq_open,
        .read           = seq_read,
index 39a6cf7fb5660b2cf4187a341e0868450c1de369..9d20904f6f52ebe60b5cdbe2c0b0de42a92a7a5e 100644 (file)
@@ -33,7 +33,7 @@
 
 /******************************************************************************
     (c) 1995-1998 E.M. Serrat          emserrat@geocities.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
@@ -50,7 +50,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
@@ -63,7 +62,7 @@
 #include <asm/system.h>
 #include <linux/fcntl.h>
 #include <linux/mm.h>
-#include <linux/termios.h>      
+#include <linux/termios.h>
 #include <linux/interrupt.h>
 #include <linux/proc_fs.h>
 #include <linux/stat.h>
@@ -139,7 +138,7 @@ static int dn_process_ack(struct sock *sk, struct sk_buff *skb, int oth)
                ptr++;
                len += 2;
                if ((ack & 0x4000) == 0) {
-                       if (oth) 
+                       if (oth)
                                ack ^= 0x2000;
                        dn_ack(sk, skb, ack);
                }
@@ -152,7 +151,7 @@ static int dn_process_ack(struct sock *sk, struct sk_buff *skb, int oth)
                skb_pull(skb, 2);
                len += 2;
                if ((ack & 0x4000) == 0) {
-                       if (oth) 
+                       if (oth)
                                ack ^= 0x2000;
                        dn_ack(sk, skb, ack);
                }
@@ -349,9 +348,9 @@ static void dn_nsp_conn_conf(struct sock *sk, struct sk_buff *skb)
 
        if ((scp->state == DN_CI) || (scp->state == DN_CD)) {
                scp->persist = 0;
-                scp->addrrem = cb->src_port;
-                sk->sk_state = TCP_ESTABLISHED;
-                scp->state = DN_RUN;
+               scp->addrrem = cb->src_port;
+               sk->sk_state = TCP_ESTABLISHED;
+               scp->state = DN_RUN;
                scp->services_rem = cb->services;
                scp->info_rem = cb->info;
                scp->segsize_rem = cb->segsize;
@@ -366,13 +365,13 @@ static void dn_nsp_conn_conf(struct sock *sk, struct sk_buff *skb)
                                memcpy(scp->conndata_in.opt_data, skb->data + 1, dlen);
                        }
                }
-                dn_nsp_send_link(sk, DN_NOCHANGE, 0);
-                if (!sock_flag(sk, SOCK_DEAD))
-                       sk->sk_state_change(sk);
-        }
+               dn_nsp_send_link(sk, DN_NOCHANGE, 0);
+               if (!sock_flag(sk, SOCK_DEAD))
+                       sk->sk_state_change(sk);
+       }
 
 out:
-        kfree_skb(skb);
+       kfree_skb(skb);
 }
 
 static void dn_nsp_conn_ack(struct sock *sk, struct sk_buff *skb)
@@ -435,7 +434,7 @@ static void dn_nsp_disc_init(struct sock *sk, struct sk_buff *skb)
                sk->sk_state_change(sk);
        }
 
-       /* 
+       /*
         * It appears that its possible for remote machines to send disc
         * init messages with no port identifier if we are in the CI and
         * possibly also the CD state. Obviously we shouldn't reply with
@@ -519,7 +518,7 @@ static void dn_nsp_linkservice(struct sock *sk, struct sk_buff *skb)
 
        /*
         * Here we ignore erronous packets which should really
-        * should cause a connection abort. It is not critical 
+        * should cause a connection abort. It is not critical
         * for now though.
         */
        if (lsflags & 0xf8)
@@ -530,7 +529,7 @@ static void dn_nsp_linkservice(struct sock *sk, struct sk_buff *skb)
                switch(lsflags & 0x04) { /* FCVAL INT */
                case 0x00: /* Normal Request */
                        switch(lsflags & 0x03) { /* FCVAL MOD */
-                               case 0x00: /* Request count */
+                       case 0x00: /* Request count */
                                if (fcval < 0) {
                                        unsigned char p_fcval = -fcval;
                                        if ((scp->flowrem_dat > p_fcval) &&
@@ -541,7 +540,7 @@ static void dn_nsp_linkservice(struct sock *sk, struct sk_buff *skb)
                                        scp->flowrem_dat += fcval;
                                        wake_up = 1;
                                }
-                                       break;
+                               break;
                        case 0x01: /* Stop outgoing data */
                                scp->flowrem_sw = DN_DONTSEND;
                                break;
@@ -557,10 +556,10 @@ static void dn_nsp_linkservice(struct sock *sk, struct sk_buff *skb)
                                wake_up = 1;
                        }
                        break;
-                }
+               }
                if (wake_up && !sock_flag(sk, SOCK_DEAD))
                        sk->sk_state_change(sk);
-        }
+       }
 
        dn_nsp_send_oth_ack(sk);
 
@@ -576,38 +575,38 @@ out:
 static __inline__ int dn_queue_skb(struct sock *sk, struct sk_buff *skb, int sig, struct sk_buff_head *queue)
 {
        int err;
-       
-        /* Cast skb->rcvbuf to unsigned... It's pointless, but reduces
-           number of warnings when compiling with -W --ANK
-         */
-        if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >=
+
+       /* Cast skb->rcvbuf to unsigned... It's pointless, but reduces
+          number of warnings when compiling with -W --ANK
+        */
+       if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >=
            (unsigned)sk->sk_rcvbuf) {
-               err = -ENOMEM;
-               goto out;
-        }
+               err = -ENOMEM;
+               goto out;
+       }
 
        err = sk_filter(sk, skb);
        if (err)
                goto out;
 
-        skb_set_owner_r(skb, sk);
-        skb_queue_tail(queue, skb);
+       skb_set_owner_r(skb, sk);
+       skb_queue_tail(queue, skb);
 
        /* This code only runs from BH or BH protected context.
         * Therefore the plain read_lock is ok here. -DaveM
         */
        read_lock(&sk->sk_callback_lock);
-        if (!sock_flag(sk, SOCK_DEAD)) {
+       if (!sock_flag(sk, SOCK_DEAD)) {
                struct socket *sock = sk->sk_socket;
                wake_up_interruptible(sk->sk_sleep);
                if (sock && sock->fasync_list &&
                    !test_bit(SOCK_ASYNC_WAITDATA, &sock->flags))
-                       __kill_fasync(sock->fasync_list, sig, 
+                       __kill_fasync(sock->fasync_list, sig,
                                    (sig == SIGURG) ? POLL_PRI : POLL_IN);
        }
        read_unlock(&sk->sk_callback_lock);
 out:
-        return err;
+       return err;
 }
 
 static void dn_nsp_otherdata(struct sock *sk, struct sk_buff *skb)
@@ -652,16 +651,16 @@ static void dn_nsp_data(struct sock *sk, struct sk_buff *skb)
        skb_pull(skb, 2);
 
        if (seq_next(scp->numdat_rcv, segnum)) {
-                if (dn_queue_skb(sk, skb, SIGIO, &sk->sk_receive_queue) == 0) {
+               if (dn_queue_skb(sk, skb, SIGIO, &sk->sk_receive_queue) == 0) {
                        seq_add(&scp->numdat_rcv, 1);
-                       queued = 1;
-                }
+                       queued = 1;
+               }
 
                if ((scp->flowloc_sw == DN_SEND) && dn_congested(sk)) {
                        scp->flowloc_sw = DN_DONTSEND;
                        dn_nsp_send_link(sk, DN_DONTSEND, 0);
                }
-        }
+       }
 
        dn_nsp_send_data_ack(sk);
 out:
@@ -732,7 +731,7 @@ static int dn_nsp_rx_packet(struct sk_buff *skb)
        if (decnet_debug_level & 2)
                printk(KERN_DEBUG "dn_nsp_rx: Message type 0x%02x\n", (int)cb->nsp_flags);
 
-       if (cb->nsp_flags & 0x83) 
+       if (cb->nsp_flags & 0x83)
                goto free_out;
 
        /*
@@ -852,7 +851,7 @@ int dn_nsp_backlog_rcv(struct sock *sk, struct sk_buff *skb)
                        case 0x30:
                                dn_nsp_disc_init(sk, skb);
                                break;
-                       case 0x40:      
+                       case 0x40:
                                dn_nsp_disc_conf(sk, skb);
                                break;
                }
index b342e4e8f5f8c936b4efe57b393740cf6f64ad35..2d2cda82c7db998f88db3113880143a77b143705 100644 (file)
@@ -26,7 +26,7 @@
 
 /******************************************************************************
     (c) 1995-1998 E.M. Serrat          emserrat@geocities.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
@@ -43,7 +43,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
@@ -55,7 +54,7 @@
 #include <asm/system.h>
 #include <linux/fcntl.h>
 #include <linux/mm.h>
-#include <linux/termios.h>      
+#include <linux/termios.h>
 #include <linux/interrupt.h>
 #include <linux/proc_fs.h>
 #include <linux/stat.h>
@@ -176,14 +175,14 @@ static void dn_nsp_rtt(struct sock *sk, long rtt)
         * gathering this value might turn out negative, so we make sure
         * that is it always positive here.
         */
-       if (rtt < 0) 
+       if (rtt < 0)
                rtt = -rtt;
        /*
         * Add new rtt to smoothed average
         */
        delta = ((rtt << 3) - srtt);
        srtt += (delta >> 3);
-       if (srtt >= 1) 
+       if (srtt >= 1)
                scp->nsp_srtt = (unsigned long)srtt;
        else
                scp->nsp_srtt = 1;
@@ -193,7 +192,7 @@ static void dn_nsp_rtt(struct sock *sk, long rtt)
         */
        delta >>= 1;
        rttvar += ((((delta>0)?(delta):(-delta)) - rttvar) >> 2);
-       if (rttvar >= 1) 
+       if (rttvar >= 1)
                scp->nsp_rttvar = (unsigned long)rttvar;
        else
                scp->nsp_rttvar = 1;
@@ -434,7 +433,7 @@ int dn_nsp_check_xmit_queue(struct sock *sk, struct sk_buff *skb, struct sk_buff
                 * further.
                 */
                if (xmit_count == 1) {
-                       if (dn_equal(segnum, acknum)) 
+                       if (dn_equal(segnum, acknum))
                                dn_nsp_rtt(sk, (long)(pkttime - reftime));
 
                        if (scp->snd_window < scp->max_window)
@@ -486,16 +485,16 @@ void dn_send_conn_ack (struct sock *sk)
 {
        struct dn_scp *scp = DN_SK(sk);
        struct sk_buff *skb = NULL;
-        struct nsp_conn_ack_msg *msg;
+       struct nsp_conn_ack_msg *msg;
 
        if ((skb = dn_alloc_skb(sk, 3, sk->sk_allocation)) == NULL)
                return;
 
-        msg = (struct nsp_conn_ack_msg *)skb_put(skb, 3);
-        msg->msgflg = 0x24;                   
+       msg = (struct nsp_conn_ack_msg *)skb_put(skb, 3);
+       msg->msgflg = 0x24;
        msg->dstaddr = scp->addrrem;
 
-       dn_nsp_send(skb);       
+       dn_nsp_send(skb);
 }
 
 void dn_nsp_delayed_ack(struct sock *sk)
@@ -523,25 +522,25 @@ void dn_send_conn_conf(struct sock *sk, gfp_t gfp)
 {
        struct dn_scp *scp = DN_SK(sk);
        struct sk_buff *skb = NULL;
-        struct nsp_conn_init_msg *msg;
+       struct nsp_conn_init_msg *msg;
        __u8 len = (__u8)dn_ntohs(scp->conndata_out.opt_optl);
 
        if ((skb = dn_alloc_skb(sk, 50 + len, gfp)) == NULL)
                return;
 
-        msg = (struct nsp_conn_init_msg *)skb_put(skb, sizeof(*msg));
-        msg->msgflg = 0x28;                   
+       msg = (struct nsp_conn_init_msg *)skb_put(skb, sizeof(*msg));
+       msg->msgflg = 0x28;
        msg->dstaddr = scp->addrrem;
-        msg->srcaddr = scp->addrloc;
-        msg->services = scp->services_loc;
-        msg->info = scp->info_loc;
-        msg->segsize = dn_htons(scp->segsize_loc);
+       msg->srcaddr = scp->addrloc;
+       msg->services = scp->services_loc;
+       msg->info = scp->info_loc;
+       msg->segsize = dn_htons(scp->segsize_loc);
 
        *skb_put(skb,1) = len;
 
-       if (len > 0) 
+       if (len > 0)
                memcpy(skb_put(skb, len), scp->conndata_out.opt_data, len);
-       
+
 
        dn_nsp_send(skb);
 
@@ -550,7 +549,7 @@ void dn_send_conn_conf(struct sock *sk, gfp_t gfp)
 }
 
 
-static __inline__ void dn_nsp_do_disc(struct sock *sk, unsigned char msgflg, 
+static __inline__ void dn_nsp_do_disc(struct sock *sk, unsigned char msgflg,
                        unsigned short reason, gfp_t gfp,
                        struct dst_entry *dst,
                        int ddl, unsigned char *dd, __le16 rem, __le16 loc)
@@ -593,7 +592,7 @@ static __inline__ void dn_nsp_do_disc(struct sock *sk, unsigned char msgflg,
 }
 
 
-void dn_nsp_send_disc(struct sock *sk, unsigned char msgflg, 
+void dn_nsp_send_disc(struct sock *sk, unsigned char msgflg,
                        unsigned short reason, gfp_t gfp)
 {
        struct dn_scp *scp = DN_SK(sk);
@@ -605,19 +604,19 @@ void dn_nsp_send_disc(struct sock *sk, unsigned char msgflg,
        if (reason == 0)
                reason = dn_ntohs(scp->discdata_out.opt_status);
 
-       dn_nsp_do_disc(sk, msgflg, reason, gfp, sk->sk_dst_cache, ddl, 
+       dn_nsp_do_disc(sk, msgflg, reason, gfp, sk->sk_dst_cache, ddl,
                scp->discdata_out.opt_data, scp->addrrem, scp->addrloc);
 }
 
 
-void dn_nsp_return_disc(struct sk_buff *skb, unsigned char msgflg, 
+void dn_nsp_return_disc(struct sk_buff *skb, unsigned char msgflg,
                        unsigned short reason)
 {
        struct dn_skb_cb *cb = DN_SKB_CB(skb);
        int ddl = 0;
        gfp_t gfp = GFP_ATOMIC;
 
-       dn_nsp_do_disc(NULL, msgflg, reason, gfp, skb->dst, ddl, 
+       dn_nsp_do_disc(NULL, msgflg, reason, gfp, skb->dst, ddl,
                        NULL, cb->src_port, cb->dst_port);
 }
 
@@ -676,8 +675,8 @@ void dn_nsp_send_conninit(struct sock *sk, unsigned char msgflg)
 
        msg->srcaddr    = scp->addrloc;
        msg->services   = scp->services_loc;    /* Requested flow control    */
-       msg->info       = scp->info_loc;        /* Version Number            */ 
-       msg->segsize    = dn_htons(scp->segsize_loc);   /* Max segment size  */ 
+       msg->info       = scp->info_loc;        /* Version Number            */
+       msg->segsize    = dn_htons(scp->segsize_loc);   /* Max segment size  */
 
        if (scp->peer.sdn_objnum)
                type = 0;
@@ -692,7 +691,7 @@ void dn_nsp_send_conninit(struct sock *sk, unsigned char msgflg)
                menuver |= DN_MENUVER_UIC;
 
        *skb_put(skb, 1) = menuver;     /* Menu Version         */
-       
+
        aux = scp->accessdata.acc_userl;
        *skb_put(skb, 1) = aux;
        if (aux > 0)
@@ -718,6 +717,6 @@ void dn_nsp_send_conninit(struct sock *sk, unsigned char msgflg)
 
        cb->rt_flags = DN_RT_F_RQR;
 
-       dn_nsp_send(skb);       
+       dn_nsp_send(skb);
 }
 
index 9881933167bd8e9ae497a60b8615a2118b0674da..c1b5502f195be2ffd05ed3ada14c1ded000f0a4b 100644 (file)
@@ -43,7 +43,7 @@
 
 /******************************************************************************
     (c) 1995-1998 E.M. Serrat          emserrat@geocities.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
@@ -167,11 +167,11 @@ static void dn_dst_check_expire(unsigned long dummy)
                while((rt=*rtp) != NULL) {
                        if (atomic_read(&rt->u.dst.__refcnt) ||
                                        (now - rt->u.dst.lastuse) < expire) {
-                               rtp = &rt->u.rt_next;
+                               rtp = &rt->u.dst.dn_next;
                                continue;
                        }
-                       *rtp = rt->u.rt_next;
-                       rt->u.rt_next = NULL;
+                       *rtp = rt->u.dst.dn_next;
+                       rt->u.dst.dn_next = NULL;
                        dnrt_free(rt);
                }
                spin_unlock(&dn_rt_hash_table[i].lock);
@@ -198,11 +198,11 @@ static int dn_dst_gc(void)
                while((rt=*rtp) != NULL) {
                        if (atomic_read(&rt->u.dst.__refcnt) ||
                                        (now - rt->u.dst.lastuse) < expire) {
-                               rtp = &rt->u.rt_next;
+                               rtp = &rt->u.dst.dn_next;
                                continue;
                        }
-                       *rtp = rt->u.rt_next;
-                       rt->u.rt_next = NULL;
+                       *rtp = rt->u.dst.dn_next;
+                       rt->u.dst.dn_next = NULL;
                        dnrt_drop(rt);
                        break;
                }
@@ -246,7 +246,7 @@ static void dn_dst_update_pmtu(struct dst_entry *dst, u32 mtu)
        }
 }
 
-/* 
+/*
  * When a route has been marked obsolete. (e.g. routing cache flush)
  */
 static struct dst_entry *dn_dst_check(struct dst_entry *dst, __u32 cookie)
@@ -286,8 +286,8 @@ static int dn_insert_route(struct dn_route *rt, unsigned hash, struct dn_route *
        while((rth = *rthp) != NULL) {
                if (compare_keys(&rth->fl, &rt->fl)) {
                        /* Put it first */
-                       *rthp = rth->u.rt_next;
-                       rcu_assign_pointer(rth->u.rt_next,
+                       *rthp = rth->u.dst.dn_next;
+                       rcu_assign_pointer(rth->u.dst.dn_next,
                                           dn_rt_hash_table[hash].chain);
                        rcu_assign_pointer(dn_rt_hash_table[hash].chain, rth);
 
@@ -300,12 +300,12 @@ static int dn_insert_route(struct dn_route *rt, unsigned hash, struct dn_route *
                        *rp = rth;
                        return 0;
                }
-               rthp = &rth->u.rt_next;
+               rthp = &rth->u.dst.dn_next;
        }
 
-       rcu_assign_pointer(rt->u.rt_next, dn_rt_hash_table[hash].chain);
+       rcu_assign_pointer(rt->u.dst.dn_next, dn_rt_hash_table[hash].chain);
        rcu_assign_pointer(dn_rt_hash_table[hash].chain, rt);
-       
+
        dst_hold(&rt->u.dst);
        rt->u.dst.__use++;
        rt->u.dst.lastuse = now;
@@ -326,8 +326,8 @@ void dn_run_flush(unsigned long dummy)
                        goto nothing_to_declare;
 
                for(; rt; rt=next) {
-                       next = rt->u.rt_next;
-                       rt->u.rt_next = NULL;
+                       next = rt->u.dst.dn_next;
+                       rt->u.dst.dn_next = NULL;
                        dst_free((struct dst_entry *)rt);
                }
 
@@ -506,23 +506,23 @@ static int dn_route_rx_long(struct sk_buff *skb)
        skb_pull(skb, 20);
        skb->h.raw = skb->data;
 
-        /* Destination info */
-        ptr += 2;
+       /* Destination info */
+       ptr += 2;
        cb->dst = dn_eth2dn(ptr);
-        if (memcmp(ptr, dn_hiord_addr, 4) != 0)
-                goto drop_it;
-        ptr += 6;
+       if (memcmp(ptr, dn_hiord_addr, 4) != 0)
+               goto drop_it;
+       ptr += 6;
 
 
-        /* Source info */
-        ptr += 2;
+       /* Source info */
+       ptr += 2;
        cb->src = dn_eth2dn(ptr);
-        if (memcmp(ptr, dn_hiord_addr, 4) != 0)
-                goto drop_it;
-        ptr += 6;
-        /* Other junk */
-        ptr++;
-        cb->hops = *ptr++; /* Visit Count */
+       if (memcmp(ptr, dn_hiord_addr, 4) != 0)
+               goto drop_it;
+       ptr += 6;
+       /* Other junk */
+       ptr++;
+       cb->hops = *ptr++; /* Visit Count */
 
        return NF_HOOK(PF_DECnet, NF_DN_PRE_ROUTING, skb, skb->dev, NULL, dn_route_rx_packet);
 
@@ -545,16 +545,16 @@ static int dn_route_rx_short(struct sk_buff *skb)
        skb->h.raw = skb->data;
 
        cb->dst = *(__le16 *)ptr;
-        ptr += 2;
-        cb->src = *(__le16 *)ptr;
-        ptr += 2;
-        cb->hops = *ptr & 0x3f;
+       ptr += 2;
+       cb->src = *(__le16 *)ptr;
+       ptr += 2;
+       cb->hops = *ptr & 0x3f;
 
        return NF_HOOK(PF_DECnet, NF_DN_PRE_ROUTING, skb, skb->dev, NULL, dn_route_rx_packet);
 
 drop_it:
-        kfree_skb(skb);
-        return NET_RX_DROP;
+       kfree_skb(skb);
+       return NET_RX_DROP;
 }
 
 static int dn_route_discard(struct sk_buff *skb)
@@ -626,20 +626,20 @@ int dn_route_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type
        cb->rt_flags = flags;
 
        if (decnet_debug_level & 1)
-               printk(KERN_DEBUG 
+               printk(KERN_DEBUG
                        "dn_route_rcv: got 0x%02x from %s [%d %d %d]\n",
-                       (int)flags, (dev) ? dev->name : "???", len, skb->len, 
+                       (int)flags, (dev) ? dev->name : "???", len, skb->len,
                        padlen);
 
-        if (flags & DN_RT_PKT_CNTL) {
+       if (flags & DN_RT_PKT_CNTL) {
                if (unlikely(skb_linearize(skb)))
                        goto dump_it;
 
-                switch(flags & DN_RT_CNTL_MSK) {
-                       case DN_RT_PKT_INIT:
+               switch(flags & DN_RT_CNTL_MSK) {
+                       case DN_RT_PKT_INIT:
                                dn_dev_init_pkt(skb);
                                break;
-                       case DN_RT_PKT_VERI:
+                       case DN_RT_PKT_VERI:
                                dn_dev_veri_pkt(skb);
                                break;
                }
@@ -648,31 +648,31 @@ int dn_route_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type
                        goto dump_it;
 
                switch(flags & DN_RT_CNTL_MSK) {
-                       case DN_RT_PKT_HELO:
+                       case DN_RT_PKT_HELO:
                                return NF_HOOK(PF_DECnet, NF_DN_HELLO, skb, skb->dev, NULL, dn_route_ptp_hello);
 
-                       case DN_RT_PKT_L1RT:
-                       case DN_RT_PKT_L2RT:
-                                return NF_HOOK(PF_DECnet, NF_DN_ROUTE, skb, skb->dev, NULL, dn_route_discard);
-                       case DN_RT_PKT_ERTH:
+                       case DN_RT_PKT_L1RT:
+                       case DN_RT_PKT_L2RT:
+                               return NF_HOOK(PF_DECnet, NF_DN_ROUTE, skb, skb->dev, NULL, dn_route_discard);
+                       case DN_RT_PKT_ERTH:
                                return NF_HOOK(PF_DECnet, NF_DN_HELLO, skb, skb->dev, NULL, dn_neigh_router_hello);
 
-                       case DN_RT_PKT_EEDH:
+                       case DN_RT_PKT_EEDH:
                                return NF_HOOK(PF_DECnet, NF_DN_HELLO, skb, skb->dev, NULL, dn_neigh_endnode_hello);
-                }
-        } else {
+               }
+       } else {
                if (dn->parms.state != DN_DEV_S_RU)
                        goto dump_it;
 
                skb_pull(skb, 1); /* Pull flags */
 
-                switch(flags & DN_RT_PKT_MSK) {
-                       case DN_RT_PKT_LONG:
-                               return dn_route_rx_long(skb);
-                       case DN_RT_PKT_SHORT:
-                               return dn_route_rx_short(skb);
+               switch(flags & DN_RT_PKT_MSK) {
+                       case DN_RT_PKT_LONG:
+                               return dn_route_rx_long(skb);
+                       case DN_RT_PKT_SHORT:
+                               return dn_route_rx_short(skb);
                }
-        }
+       }
 
 dump_it:
        kfree_skb(skb);
@@ -815,8 +815,8 @@ static int dn_rt_set_next_hop(struct dn_route *rt, struct dn_fib_res *res)
                rt->u.dst.neighbour = n;
        }
 
-       if (rt->u.dst.metrics[RTAX_MTU-1] == 0 || 
-            rt->u.dst.metrics[RTAX_MTU-1] > rt->u.dst.dev->mtu)
+       if (rt->u.dst.metrics[RTAX_MTU-1] == 0 ||
+           rt->u.dst.metrics[RTAX_MTU-1] > rt->u.dst.dev->mtu)
                rt->u.dst.metrics[RTAX_MTU-1] = rt->u.dst.dev->mtu;
        mss = dn_mss_from_pmtu(dev, dst_mtu(&rt->u.dst));
        if (rt->u.dst.metrics[RTAX_ADVMSS-1] == 0 ||
@@ -876,7 +876,7 @@ static inline __le16 dn_fib_rules_map_destination(__le16 daddr, struct dn_fib_re
 
 static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *oldflp, int try_hard)
 {
-       struct flowi fl = { .nl_u = { .dn_u = 
+       struct flowi fl = { .nl_u = { .dn_u =
                                      { .daddr = oldflp->fld_dst,
                                        .saddr = oldflp->fld_src,
                                        .scope = RT_SCOPE_UNIVERSE,
@@ -899,7 +899,7 @@ static int dn_route_output_slow(struct dst_entry **pprt, const struct flowi *old
                       "dn_route_output_slow: dst=%04x src=%04x mark=%d"
                       " iif=%d oif=%d\n", dn_ntohs(oldflp->fld_dst),
                       dn_ntohs(oldflp->fld_src),
-                       oldflp->mark, loopback_dev.ifindex, oldflp->oif);
+                      oldflp->mark, loopback_dev.ifindex, oldflp->oif);
 
        /* If we have an output interface, verify its a DECnet device */
        if (oldflp->oif) {
@@ -982,19 +982,19 @@ source_ok:
                if (err != -ESRCH)
                        goto out;
                /*
-                * Here the fallback is basically the standard algorithm for 
+                * Here the fallback is basically the standard algorithm for
                 * routing in endnodes which is described in the DECnet routing
                 * docs
                 *
                 * If we are not trying hard, look in neighbour cache.
                 * The result is tested to ensure that if a specific output
-                * device/source address was requested, then we honour that 
+                * device/source address was requested, then we honour that
                 * here
                 */
                if (!try_hard) {
                        neigh = neigh_lookup_nodev(&dn_neigh_table, &fl.fld_dst);
                        if (neigh) {
-                               if ((oldflp->oif && 
+                               if ((oldflp->oif &&
                                    (neigh->dev->ifindex != oldflp->oif)) ||
                                    (oldflp->fld_src &&
                                    (!dn_dev_islocal(neigh->dev,
@@ -1044,7 +1044,7 @@ select_source:
                if (fl.fld_src == 0) {
                        fl.fld_src = dnet_select_source(dev_out, gateway,
                                                         res.type == RTN_LOCAL ?
-                                                        RT_SCOPE_HOST : 
+                                                        RT_SCOPE_HOST :
                                                         RT_SCOPE_LINK);
                        if (fl.fld_src == 0 && res.type != RTN_LOCAL)
                                goto e_addr;
@@ -1074,14 +1074,14 @@ select_source:
        if (res.fi->fib_nhs > 1 && fl.oif == 0)
                dn_fib_select_multipath(&fl, &res);
 
-       /* 
+       /*
         * We could add some logic to deal with default routes here and
         * get rid of some of the special casing above.
         */
 
        if (!fl.fld_src)
                fl.fld_src = DN_FIB_RES_PREFSRC(res);
-       
+
        if (dev_out)
                dev_put(dev_out);
        dev_out = DN_FIB_RES_DEV(res);
@@ -1144,8 +1144,8 @@ out:
        return err;
 
 e_addr:
-        err = -EADDRNOTAVAIL;
-        goto done;
+       err = -EADDRNOTAVAIL;
+       goto done;
 e_inval:
        err = -EINVAL;
        goto done;
@@ -1169,7 +1169,7 @@ static int __dn_route_output_key(struct dst_entry **pprt, const struct flowi *fl
        if (!(flags & MSG_TRYHARD)) {
                rcu_read_lock_bh();
                for(rt = rcu_dereference(dn_rt_hash_table[hash].chain); rt;
-                       rt = rcu_dereference(rt->u.rt_next)) {
+                       rt = rcu_dereference(rt->u.dst.dn_next)) {
                        if ((flp->fld_dst == rt->fl.fld_dst) &&
                            (flp->fld_src == rt->fl.fld_src) &&
                            (flp->mark == rt->fl.mark) &&
@@ -1223,7 +1223,7 @@ static int dn_route_input_slow(struct sk_buff *skb)
        int flags = 0;
        __le16 gateway = 0;
        __le16 local_src = 0;
-       struct flowi fl = { .nl_u = { .dn_u = 
+       struct flowi fl = { .nl_u = { .dn_u =
                                     { .daddr = cb->dst,
                                       .saddr = cb->src,
                                       .scope = RT_SCOPE_UNIVERSE,
@@ -1311,7 +1311,7 @@ static int dn_route_input_slow(struct sk_buff *skb)
                if (res.fi->fib_nhs > 1 && fl.oif == 0)
                        dn_fib_select_multipath(&fl, &res);
 
-               /* 
+               /*
                 * Check for out_dev == in_dev. We use the RTCF_DOREDIRECT
                 * flag as a hint to set the intra-ethernet bit when
                 * forwarding. If we've got NAT in operation, we don't do
@@ -1443,9 +1443,9 @@ int dn_route_input(struct sk_buff *skb)
 
        rcu_read_lock();
        for(rt = rcu_dereference(dn_rt_hash_table[hash].chain); rt != NULL;
-           rt = rcu_dereference(rt->u.rt_next)) {
+           rt = rcu_dereference(rt->u.dst.dn_next)) {
                if ((rt->fl.fld_src == cb->src) &&
-                   (rt->fl.fld_dst == cb->dst) &&
+                   (rt->fl.fld_dst == cb->dst) &&
                    (rt->fl.oif == 0) &&
                    (rt->fl.mark == skb->mark) &&
                    (rt->fl.iif == cb->iif)) {
@@ -1514,8 +1514,8 @@ static int dn_rt_fill_info(struct sk_buff *skb, u32 pid, u32 seq,
 
 nlmsg_failure:
 rtattr_failure:
-        skb_trim(skb, b - skb->data);
-        return -1;
+       skb_trim(skb, b - skb->data);
+       return -1;
 }
 
 /*
@@ -1627,12 +1627,12 @@ int dn_cache_dump(struct sk_buff *skb, struct netlink_callback *cb)
                rcu_read_lock_bh();
                for(rt = rcu_dereference(dn_rt_hash_table[h].chain), idx = 0;
                        rt;
-                       rt = rcu_dereference(rt->u.rt_next), idx++) {
+                       rt = rcu_dereference(rt->u.dst.dn_next), idx++) {
                        if (idx < s_idx)
                                continue;
                        skb->dst = dst_clone(&rt->u.dst);
                        if (dn_rt_fill_info(skb, NETLINK_CB(cb->skb).pid,
-                                       cb->nlh->nlmsg_seq, RTM_NEWROUTE, 
+                                       cb->nlh->nlmsg_seq, RTM_NEWROUTE,
                                        1, NLM_F_MULTI) <= 0) {
                                dst_release(xchg(&skb->dst, NULL));
                                rcu_read_unlock_bh();
@@ -1673,7 +1673,7 @@ static struct dn_route *dn_rt_cache_get_next(struct seq_file *seq, struct dn_rou
 {
        struct dn_rt_cache_iter_state *s = rcu_dereference(seq->private);
 
-       rt = rt->u.rt_next;
+       rt = rt->u.dst.dn_next;
        while(!rt) {
                rcu_read_unlock_bh();
                if (--s->bucket < 0)
@@ -1721,7 +1721,7 @@ static int dn_rt_cache_seq_show(struct seq_file *seq, void *v)
                        rt->u.dst.__use,
                        (int) dst_metric(&rt->u.dst, RTAX_RTT));
        return 0;
-} 
+}
 
 static struct seq_operations dn_rt_cache_seq_ops = {
        .start  = dn_rt_cache_seq_start,
@@ -1751,7 +1751,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations dn_rt_cache_seq_fops = {
+static const struct file_operations dn_rt_cache_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = dn_rt_cache_seq_open,
        .read    = seq_read,
@@ -1778,38 +1778,38 @@ void __init dn_route_init(void)
        for(order = 0; (1UL << order) < goal; order++)
                /* NOTHING */;
 
-        /*
-         * Only want 1024 entries max, since the table is very, very unlikely
-         * to be larger than that.
-         */
-        while(order && ((((1UL << order) * PAGE_SIZE) / 
-                                sizeof(struct dn_rt_hash_bucket)) >= 2048))
-                order--;
-
-        do {
-                dn_rt_hash_mask = (1UL << order) * PAGE_SIZE /
-                        sizeof(struct dn_rt_hash_bucket);
-                while(dn_rt_hash_mask & (dn_rt_hash_mask - 1))
-                        dn_rt_hash_mask--;
-                dn_rt_hash_table = (struct dn_rt_hash_bucket *)
-                        __get_free_pages(GFP_ATOMIC, order);
-        } while (dn_rt_hash_table == NULL && --order > 0);
+       /*
+        * Only want 1024 entries max, since the table is very, very unlikely
+        * to be larger than that.
+        */
+       while(order && ((((1UL << order) * PAGE_SIZE) /
+                               sizeof(struct dn_rt_hash_bucket)) >= 2048))
+               order--;
+
+       do {
+               dn_rt_hash_mask = (1UL << order) * PAGE_SIZE /
+                       sizeof(struct dn_rt_hash_bucket);
+               while(dn_rt_hash_mask & (dn_rt_hash_mask - 1))
+                       dn_rt_hash_mask--;
+               dn_rt_hash_table = (struct dn_rt_hash_bucket *)
+                       __get_free_pages(GFP_ATOMIC, order);
+       } while (dn_rt_hash_table == NULL && --order > 0);
 
        if (!dn_rt_hash_table)
-                panic("Failed to allocate DECnet route cache hash table\n");
+               panic("Failed to allocate DECnet route cache hash table\n");
 
-       printk(KERN_INFO 
-               "DECnet: Routing cache hash table of %u buckets, %ldKbytes\n", 
-               dn_rt_hash_mask, 
+       printk(KERN_INFO
+               "DECnet: Routing cache hash table of %u buckets, %ldKbytes\n",
+               dn_rt_hash_mask,
                (long)(dn_rt_hash_mask*sizeof(struct dn_rt_hash_bucket))/1024);
 
        dn_rt_hash_mask--;
-        for(i = 0; i <= dn_rt_hash_mask; i++) {
-                spin_lock_init(&dn_rt_hash_table[i].lock);
-                dn_rt_hash_table[i].chain = NULL;
-        }
+       for(i = 0; i <= dn_rt_hash_mask; i++) {
+               spin_lock_init(&dn_rt_hash_table[i].lock);
+               dn_rt_hash_table[i].chain = NULL;
+       }
 
-        dn_dst_ops.gc_thresh = (dn_rt_hash_mask + 1);
+       dn_dst_ops.gc_thresh = (dn_rt_hash_mask + 1);
 
        proc_net_fops_create("decnet_cache", S_IRUGO, &dn_rt_cache_seq_fops);
 }
index e32d0c3d5a96a3e3ec5b040ef4b1d365e68b4125..b6c98ac93dc8737d96e54ac7f00dacacf90ae6f4 100644 (file)
@@ -151,10 +151,10 @@ static int dn_fib_rule_configure(struct fib_rule *rule, struct sk_buff *skb,
        }
 
        if (tb[FRA_SRC])
-               r->src = nla_get_u16(tb[FRA_SRC]);
+               r->src = nla_get_le16(tb[FRA_SRC]);
 
        if (tb[FRA_DST])
-               r->dst = nla_get_u16(tb[FRA_DST]);
+               r->dst = nla_get_le16(tb[FRA_DST]);
 
        r->src_len = frh->src_len;
        r->srcmask = dnet_make_mask(r->src_len);
@@ -176,10 +176,10 @@ static int dn_fib_rule_compare(struct fib_rule *rule, struct fib_rule_hdr *frh,
        if (frh->dst_len && (r->dst_len != frh->dst_len))
                return 0;
 
-       if (tb[FRA_SRC] && (r->src != nla_get_u16(tb[FRA_SRC])))
+       if (tb[FRA_SRC] && (r->src != nla_get_le16(tb[FRA_SRC])))
                return 0;
 
-       if (tb[FRA_DST] && (r->dst != nla_get_u16(tb[FRA_DST])))
+       if (tb[FRA_DST] && (r->dst != nla_get_le16(tb[FRA_DST])))
                return 0;
 
        return 1;
@@ -214,9 +214,9 @@ static int dn_fib_rule_fill(struct fib_rule *rule, struct sk_buff *skb,
        frh->tos = 0;
 
        if (r->dst_len)
-               NLA_PUT_U16(skb, FRA_DST, r->dst);
+               NLA_PUT_LE16(skb, FRA_DST, r->dst);
        if (r->src_len)
-               NLA_PUT_U16(skb, FRA_SRC, r->src);
+               NLA_PUT_LE16(skb, FRA_SRC, r->src);
 
        return 0;
 
index c1f0cc1b1c60af482f1fbb302e09ac63d26c414c..780a141f8342c93c880b53245cbddaa2103cdc7b 100644 (file)
@@ -60,7 +60,7 @@ struct dn_hash
 #define dz_prefix(key,dz)      ((key).datum)
 
 #define for_nexthops(fi) { int nhsel; const struct dn_fib_nh *nh;\
-        for(nhsel = 0, nh = (fi)->fib_nh; nhsel < (fi)->fib_nhs; nh++, nhsel++)
+       for(nhsel = 0, nh = (fi)->fib_nh; nhsel < (fi)->fib_nhs; nh++, nhsel++)
 
 #define endfor_nexthops(fi) }
 
@@ -290,82 +290,82 @@ static inline size_t dn_fib_nlmsg_size(struct dn_fib_info *fi)
 }
 
 static int dn_fib_dump_info(struct sk_buff *skb, u32 pid, u32 seq, int event,
-                        u32 tb_id, u8 type, u8 scope, void *dst, int dst_len,
-                        struct dn_fib_info *fi, unsigned int flags)
+                       u32 tb_id, u8 type, u8 scope, void *dst, int dst_len,
+                       struct dn_fib_info *fi, unsigned int flags)
 {
-        struct rtmsg *rtm;
-        struct nlmsghdr *nlh;
-        unsigned char *b = skb->tail;
-
-        nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*rtm), flags);
-        rtm = NLMSG_DATA(nlh);
-        rtm->rtm_family = AF_DECnet;
-        rtm->rtm_dst_len = dst_len;
-        rtm->rtm_src_len = 0;
-        rtm->rtm_tos = 0;
-        rtm->rtm_table = tb_id;
+       struct rtmsg *rtm;
+       struct nlmsghdr *nlh;
+       unsigned char *b = skb->tail;
+
+       nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*rtm), flags);
+       rtm = NLMSG_DATA(nlh);
+       rtm->rtm_family = AF_DECnet;
+       rtm->rtm_dst_len = dst_len;
+       rtm->rtm_src_len = 0;
+       rtm->rtm_tos = 0;
+       rtm->rtm_table = tb_id;
        RTA_PUT_U32(skb, RTA_TABLE, tb_id);
-        rtm->rtm_flags = fi->fib_flags;
-        rtm->rtm_scope = scope;
+       rtm->rtm_flags = fi->fib_flags;
+       rtm->rtm_scope = scope;
        rtm->rtm_type  = type;
-        if (rtm->rtm_dst_len)
-                RTA_PUT(skb, RTA_DST, 2, dst);
-        rtm->rtm_protocol = fi->fib_protocol;
-        if (fi->fib_priority)
-                RTA_PUT(skb, RTA_PRIORITY, 4, &fi->fib_priority);
+       if (rtm->rtm_dst_len)
+               RTA_PUT(skb, RTA_DST, 2, dst);
+       rtm->rtm_protocol = fi->fib_protocol;
+       if (fi->fib_priority)
+               RTA_PUT(skb, RTA_PRIORITY, 4, &fi->fib_priority);
        if (rtnetlink_put_metrics(skb, fi->fib_metrics) < 0)
                goto rtattr_failure;
-        if (fi->fib_nhs == 1) {
-                if (fi->fib_nh->nh_gw)
-                        RTA_PUT(skb, RTA_GATEWAY, 2, &fi->fib_nh->nh_gw);
-                if (fi->fib_nh->nh_oif)
-                        RTA_PUT(skb, RTA_OIF, sizeof(int), &fi->fib_nh->nh_oif);
-        }
-        if (fi->fib_nhs > 1) {
-                struct rtnexthop *nhp;
-                struct rtattr *mp_head;
-                if (skb_tailroom(skb) <= RTA_SPACE(0))
-                        goto rtattr_failure;
-                mp_head = (struct rtattr *)skb_put(skb, RTA_SPACE(0));
-
-                for_nexthops(fi) {
-                        if (skb_tailroom(skb) < RTA_ALIGN(RTA_ALIGN(sizeof(*nhp)) + 4))
-                                goto rtattr_failure;
-                        nhp = (struct rtnexthop *)skb_put(skb, RTA_ALIGN(sizeof(*nhp)));
-                        nhp->rtnh_flags = nh->nh_flags & 0xFF;
-                        nhp->rtnh_hops = nh->nh_weight - 1;
-                        nhp->rtnh_ifindex = nh->nh_oif;
-                        if (nh->nh_gw)
-                                RTA_PUT(skb, RTA_GATEWAY, 2, &nh->nh_gw);
-                        nhp->rtnh_len = skb->tail - (unsigned char *)nhp;
-                } endfor_nexthops(fi);
-                mp_head->rta_type = RTA_MULTIPATH;
-                mp_head->rta_len = skb->tail - (u8*)mp_head;
-        }
-
-        nlh->nlmsg_len = skb->tail - b;
-        return skb->len;
+       if (fi->fib_nhs == 1) {
+               if (fi->fib_nh->nh_gw)
+                       RTA_PUT(skb, RTA_GATEWAY, 2, &fi->fib_nh->nh_gw);
+               if (fi->fib_nh->nh_oif)
+                       RTA_PUT(skb, RTA_OIF, sizeof(int), &fi->fib_nh->nh_oif);
+       }
+       if (fi->fib_nhs > 1) {
+               struct rtnexthop *nhp;
+               struct rtattr *mp_head;
+               if (skb_tailroom(skb) <= RTA_SPACE(0))
+                       goto rtattr_failure;
+               mp_head = (struct rtattr *)skb_put(skb, RTA_SPACE(0));
+
+               for_nexthops(fi) {
+                       if (skb_tailroom(skb) < RTA_ALIGN(RTA_ALIGN(sizeof(*nhp)) + 4))
+                               goto rtattr_failure;
+                       nhp = (struct rtnexthop *)skb_put(skb, RTA_ALIGN(sizeof(*nhp)));
+                       nhp->rtnh_flags = nh->nh_flags & 0xFF;
+                       nhp->rtnh_hops = nh->nh_weight - 1;
+                       nhp->rtnh_ifindex = nh->nh_oif;
+                       if (nh->nh_gw)
+                               RTA_PUT(skb, RTA_GATEWAY, 2, &nh->nh_gw);
+                       nhp->rtnh_len = skb->tail - (unsigned char *)nhp;
+               } endfor_nexthops(fi);
+               mp_head->rta_type = RTA_MULTIPATH;
+               mp_head->rta_len = skb->tail - (u8*)mp_head;
+       }
+
+       nlh->nlmsg_len = skb->tail - b;
+       return skb->len;
 
 
 nlmsg_failure:
 rtattr_failure:
-        skb_trim(skb, b - skb->data);
-        return -EMSGSIZE;
+       skb_trim(skb, b - skb->data);
+       return -EMSGSIZE;
 }
 
 
 static void dn_rtmsg_fib(int event, struct dn_fib_node *f, int z, u32 tb_id,
-                        struct nlmsghdr *nlh, struct netlink_skb_parms *req)
+                       struct nlmsghdr *nlh, struct netlink_skb_parms *req)
 {
-        struct sk_buff *skb;
-        u32 pid = req ? req->pid : 0;
+       struct sk_buff *skb;
+       u32 pid = req ? req->pid : 0;
        int err = -ENOBUFS;
 
-        skb = nlmsg_new(dn_fib_nlmsg_size(DN_FIB_INFO(f)), GFP_KERNEL);
-        if (skb == NULL)
+       skb = nlmsg_new(dn_fib_nlmsg_size(DN_FIB_INFO(f)), GFP_KERNEL);
+       if (skb == NULL)
                goto errout;
 
-        err = dn_fib_dump_info(skb, pid, nlh->nlmsg_seq, event, tb_id,
+       err = dn_fib_dump_info(skb, pid, nlh->nlmsg_seq, event, tb_id,
                               f->fn_type, f->fn_scope, &f->fn_key, z,
                               DN_FIB_INFO(f), 0);
        if (err < 0) {
@@ -380,7 +380,7 @@ errout:
                rtnl_set_sk_err(RTNLGRP_DECnet_ROUTE, err);
 }
 
-static __inline__ int dn_hash_dump_bucket(struct sk_buff *skb, 
+static __inline__ int dn_hash_dump_bucket(struct sk_buff *skb,
                                struct netlink_callback *cb,
                                struct dn_fib_table *tb,
                                struct dn_zone *dz,
@@ -394,12 +394,12 @@ static __inline__ int dn_hash_dump_bucket(struct sk_buff *skb,
                        continue;
                if (f->fn_state & DN_S_ZOMBIE)
                        continue;
-               if (dn_fib_dump_info(skb, NETLINK_CB(cb->skb).pid, 
+               if (dn_fib_dump_info(skb, NETLINK_CB(cb->skb).pid,
                                cb->nlh->nlmsg_seq,
                                RTM_NEWROUTE,
-                               tb->n, 
+                               tb->n,
                                (f->fn_state & DN_S_ZOMBIE) ? 0 : f->fn_type,
-                               f->fn_scope, &f->fn_key, dz->dz_order, 
+                               f->fn_scope, &f->fn_key, dz->dz_order,
                                f->fn_info, NLM_F_MULTI) < 0) {
                        cb->args[4] = i;
                        return -1;
@@ -409,7 +409,7 @@ static __inline__ int dn_hash_dump_bucket(struct sk_buff *skb,
        return skb->len;
 }
 
-static __inline__ int dn_hash_dump_zone(struct sk_buff *skb, 
+static __inline__ int dn_hash_dump_zone(struct sk_buff *skb,
                                struct netlink_callback *cb,
                                struct dn_fib_table *tb,
                                struct dn_zone *dz)
@@ -433,10 +433,10 @@ static __inline__ int dn_hash_dump_zone(struct sk_buff *skb,
        return skb->len;
 }
 
-static int dn_fib_table_dump(struct dn_fib_table *tb, struct sk_buff *skb, 
-                                struct netlink_callback *cb)
+static int dn_fib_table_dump(struct dn_fib_table *tb, struct sk_buff *skb,
+                               struct netlink_callback *cb)
 {
-        int m, s_m;
+       int m, s_m;
        struct dn_zone *dz;
        struct dn_hash *table = (struct dn_hash *)tb->data;
 
@@ -457,7 +457,7 @@ static int dn_fib_table_dump(struct dn_fib_table *tb, struct sk_buff *skb,
        read_unlock(&dn_fib_tables_lock);
        cb->args[2] = m;
 
-        return skb->len;
+       return skb->len;
 }
 
 int dn_fib_dump(struct sk_buff *skb, struct netlink_callback *cb)
@@ -482,7 +482,7 @@ int dn_fib_dump(struct sk_buff *skb, struct netlink_callback *cb)
                                goto next;
                        if (dumped)
                                memset(&cb->args[2], 0, sizeof(cb->args) -
-                                                2 * sizeof(cb->args[0]));
+                                                2 * sizeof(cb->args[0]));
                        if (tb->dump(tb, skb, cb) < 0)
                                goto out;
                        dumped = 1;
@@ -503,13 +503,13 @@ static int dn_fib_table_insert(struct dn_fib_table *tb, struct rtmsg *r, struct
        struct dn_fib_node *new_f, *f, **fp, **del_fp;
        struct dn_zone *dz;
        struct dn_fib_info *fi;
-        int z = r->rtm_dst_len;
+       int z = r->rtm_dst_len;
        int type = r->rtm_type;
        dn_fib_key_t key;
-        int err;
+       int err;
 
-        if (z > 16)
-                return -EINVAL;
+       if (z > 16)
+               return -EINVAL;
 
        dz = table->dh_zones[z];
        if (!dz && !(dz = dn_new_zone(table, z)))
@@ -524,8 +524,8 @@ static int dn_fib_table_insert(struct dn_fib_table *tb, struct rtmsg *r, struct
                key = dz_key(dst, dz);
        }
 
-        if ((fi = dn_fib_create_info(r, rta, n, &err)) == NULL)
-                return err;
+       if ((fi = dn_fib_create_info(r, rta, n, &err)) == NULL)
+               return err;
 
        if (dz->dz_nent > (dz->dz_divisor << 2) &&
                        dz->dz_divisor > DN_MAX_DIVISOR &&
@@ -593,12 +593,10 @@ create:
 
 replace:
        err = -ENOBUFS;
-       new_f = kmem_cache_alloc(dn_hash_kmem, GFP_KERNEL);
+       new_f = kmem_cache_zalloc(dn_hash_kmem, GFP_KERNEL);
        if (new_f == NULL)
                goto out;
 
-       memset(new_f, 0, sizeof(struct dn_fib_node));
-
        new_f->fn_key = key;
        new_f->fn_type = type;
        new_f->fn_scope = r->rtm_scope;
@@ -626,9 +624,9 @@ replace:
                dn_rt_cache_flush(-1);
        }
 
-        dn_rtmsg_fib(RTM_NEWROUTE, new_f, z, tb->n, n, req);
+       dn_rtmsg_fib(RTM_NEWROUTE, new_f, z, tb->n, n, req);
 
-        return 0;
+       return 0;
 out:
        dn_fib_release_info(fi);
        return err;
@@ -639,14 +637,14 @@ static int dn_fib_table_delete(struct dn_fib_table *tb, struct rtmsg *r, struct
 {
        struct dn_hash *table = (struct dn_hash*)tb->data;
        struct dn_fib_node **fp, **del_fp, *f;
-        int z = r->rtm_dst_len;
+       int z = r->rtm_dst_len;
        struct dn_zone *dz;
        dn_fib_key_t key;
        int matched;
 
 
-        if (z > 16)
-                return -EINVAL;
+       if (z > 16)
+               return -EINVAL;
 
        if ((dz = table->dh_zones[z]) == NULL)
                return -ESRCH;
@@ -682,7 +680,7 @@ static int dn_fib_table_delete(struct dn_fib_table *tb, struct rtmsg *r, struct
                if (del_fp == NULL &&
                                (!r->rtm_type || f->fn_type == r->rtm_type) &&
                                (r->rtm_scope == RT_SCOPE_NOWHERE || f->fn_scope == r->rtm_scope) &&
-                               (!r->rtm_protocol || 
+                               (!r->rtm_protocol ||
                                        fi->fib_protocol == r->rtm_protocol) &&
                                dn_fib_nh_match(r, n, rta, fi) == 0)
                        del_fp = fp;
@@ -690,7 +688,7 @@ static int dn_fib_table_delete(struct dn_fib_table *tb, struct rtmsg *r, struct
 
        if (del_fp) {
                f = *del_fp;
-               dn_rtmsg_fib(RTM_DELROUTE, f, z, tb->n, n, req);
+               dn_rtmsg_fib(RTM_DELROUTE, f, z, tb->n, n, req);
 
                if (matched != 1) {
                        write_lock_bh(&dn_fib_tables_lock);
@@ -714,7 +712,7 @@ static int dn_fib_table_delete(struct dn_fib_table *tb, struct rtmsg *r, struct
                return 0;
        }
 
-        return -ESRCH;
+       return -ESRCH;
 }
 
 static inline int dn_flush_list(struct dn_fib_node **fp, int z, struct dn_hash *table)
@@ -761,7 +759,7 @@ static int dn_fib_table_flush(struct dn_fib_table *tb)
 
 static int dn_fib_table_lookup(struct dn_fib_table *tb, const struct flowi *flp, struct dn_fib_res *res)
 {
-        int err;
+       int err;
        struct dn_zone *dz;
        struct dn_hash *t = (struct dn_hash *)tb->data;
 
@@ -790,7 +788,7 @@ static int dn_fib_table_lookup(struct dn_fib_table *tb, const struct flowi *flp,
 
                        if (err == 0) {
                                res->type = f->fn_type;
-                               res->scope = f->fn_scope; 
+                               res->scope = f->fn_scope;
                                res->prefixlen = dz->dz_order;
                                goto out;
                        }
@@ -801,21 +799,21 @@ static int dn_fib_table_lookup(struct dn_fib_table *tb, const struct flowi *flp,
        err = 1;
 out:
        read_unlock(&dn_fib_tables_lock);
-        return err;
+       return err;
 }
 
 
 struct dn_fib_table *dn_fib_get_table(u32 n, int create)
 {
-        struct dn_fib_table *t;
+       struct dn_fib_table *t;
        struct hlist_node *node;
        unsigned int h;
 
-        if (n < RT_TABLE_MIN)
-                return NULL;
+       if (n < RT_TABLE_MIN)
+               return NULL;
 
-        if (n > RT_TABLE_MAX)
-                return NULL;
+       if (n > RT_TABLE_MAX)
+               return NULL;
 
        h = n & (DN_FIB_TABLE_HASHSZ - 1);
        rcu_read_lock();
@@ -827,54 +825,54 @@ struct dn_fib_table *dn_fib_get_table(u32 n, int create)
        }
        rcu_read_unlock();
 
-        if (!create)
-                return NULL;
+       if (!create)
+               return NULL;
 
-        if (in_interrupt() && net_ratelimit()) {
-                printk(KERN_DEBUG "DECnet: BUG! Attempt to create routing table from interrupt\n"); 
-                return NULL;
-        }
+       if (in_interrupt() && net_ratelimit()) {
+               printk(KERN_DEBUG "DECnet: BUG! Attempt to create routing table from interrupt\n");
+               return NULL;
+       }
 
-        t = kzalloc(sizeof(struct dn_fib_table) + sizeof(struct dn_hash),
+       t = kzalloc(sizeof(struct dn_fib_table) + sizeof(struct dn_hash),
                    GFP_KERNEL);
-        if (t == NULL)
-                return NULL;
-
-        t->n = n;
-        t->insert = dn_fib_table_insert;
-        t->delete = dn_fib_table_delete;
-        t->lookup = dn_fib_table_lookup;
-        t->flush  = dn_fib_table_flush;
-        t->dump = dn_fib_table_dump;
+       if (t == NULL)
+               return NULL;
+
+       t->n = n;
+       t->insert = dn_fib_table_insert;
+       t->delete = dn_fib_table_delete;
+       t->lookup = dn_fib_table_lookup;
+       t->flush  = dn_fib_table_flush;
+       t->dump = dn_fib_table_dump;
        hlist_add_head_rcu(&t->hlist, &dn_fib_table_hash[h]);
 
-        return t;
+       return t;
 }
 
 struct dn_fib_table *dn_fib_empty_table(void)
 {
-        u32 id;
+       u32 id;
 
-        for(id = RT_TABLE_MIN; id <= RT_TABLE_MAX; id++)
+       for(id = RT_TABLE_MIN; id <= RT_TABLE_MAX; id++)
                if (dn_fib_get_table(id, 0) == NULL)
-                        return dn_fib_get_table(id, 1);
-        return NULL;
+                       return dn_fib_get_table(id, 1);
+       return NULL;
 }
 
 void dn_fib_flush(void)
 {
-        int flushed = 0;
-        struct dn_fib_table *tb;
+       int flushed = 0;
+       struct dn_fib_table *tb;
        struct hlist_node *node;
        unsigned int h;
 
        for (h = 0; h < DN_FIB_TABLE_HASHSZ; h++) {
                hlist_for_each_entry(tb, node, &dn_fib_table_hash[h], hlist)
-                       flushed += tb->flush(tb);
-        }
+                       flushed += tb->flush(tb);
+       }
 
-        if (flushed)
-                dn_rt_cache_flush(-1);
+       if (flushed)
+               dn_rt_cache_flush(-1);
 }
 
 void __init dn_fib_table_init(void)
@@ -894,7 +892,7 @@ void __exit dn_fib_table_cleanup(void)
        write_lock(&dn_fib_tables_lock);
        for (h = 0; h < DN_FIB_TABLE_HASHSZ; h++) {
                hlist_for_each_entry_safe(t, node, next, &dn_fib_table_hash[h],
-                                         hlist) {
+                                         hlist) {
                        hlist_del(&t->hlist);
                        kfree(t);
                }
index 8b99bd33540d53fc072278aa6ade21906a541f90..0e62def05a58b38f589b5594db24f140bdc07132 100644 (file)
@@ -138,7 +138,7 @@ static int __init dn_rtmsg_init(void)
        int rv = 0;
 
        dnrmg = netlink_kernel_create(NETLINK_DNRTMSG, DNRNG_NLGRP_MAX,
-                                     dnrmg_receive_user_sk, THIS_MODULE);
+                                     dnrmg_receive_user_sk, THIS_MODULE);
        if (dnrmg == NULL) {
                printk(KERN_ERR "dn_rtmsg: Cannot create netlink socket");
                return -ENOMEM;
index a4065eb1341eba834db319faec739d8a46e8c93f..52e40d7eb22d9f583c045175ae1d64aa4dde2e16 100644 (file)
@@ -164,7 +164,7 @@ static int dn_node_address_strategy(ctl_table *table, int __user *name, int nlen
        return 0;
 }
 
-static int dn_node_address_handler(ctl_table *table, int write, 
+static int dn_node_address_handler(ctl_table *table, int write,
                                struct file *filp,
                                void __user *buffer,
                                size_t *lenp, loff_t *ppos)
@@ -240,7 +240,7 @@ static int dn_def_dev_strategy(ctl_table *table, int __user *name, int nlen,
                        }
 
                        namel = strlen(devname) + 1;
-                       if (len > namel) len = namel;   
+                       if (len > namel) len = namel;
 
                        if (copy_to_user(oldval, devname, len))
                                return -EFAULT;
@@ -275,7 +275,7 @@ static int dn_def_dev_strategy(ctl_table *table, int __user *name, int nlen,
 }
 
 
-static int dn_def_dev_handler(ctl_table *table, int write, 
+static int dn_def_dev_handler(ctl_table *table, int write,
                                struct file * filp,
                                void __user *buffer,
                                size_t *lenp, loff_t *ppos)
@@ -341,17 +341,17 @@ static int dn_def_dev_handler(ctl_table *table, int write,
 
 static ctl_table dn_table[] = {
        {
-               .ctl_name = NET_DECNET_NODE_ADDRESS, 
-               .procname = "node_address", 
-               .maxlen = 7, 
-               .mode = 0644, 
+               .ctl_name = NET_DECNET_NODE_ADDRESS,
+               .procname = "node_address",
+               .maxlen = 7,
+               .mode = 0644,
                .proc_handler = dn_node_address_handler,
                .strategy = dn_node_address_strategy,
        },
        {
                .ctl_name = NET_DECNET_NODE_NAME,
                .procname = "node_name",
-               .data = node_name, 
+               .data = node_name,
                .maxlen = 7,
                .mode = 0644,
                .proc_handler = &proc_dostring,
@@ -359,8 +359,8 @@ static ctl_table dn_table[] = {
        },
        {
                .ctl_name = NET_DECNET_DEFAULT_DEVICE,
-               .procname = "default_device", 
-               .maxlen = 16, 
+               .procname = "default_device",
+               .maxlen = 16,
                .mode = 0644,
                .proc_handler = dn_def_dev_handler,
                .strategy = dn_def_dev_strategy,
@@ -432,32 +432,32 @@ static ctl_table dn_table[] = {
                .extra2 = &max_decnet_no_fc_max_cwnd
        },
        {
-                .ctl_name = NET_DECNET_MEM,
-                .procname = "decnet_mem",
-                .data = &sysctl_decnet_mem,
-                .maxlen = sizeof(sysctl_decnet_mem),
-                .mode = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = NET_DECNET_RMEM,
-                .procname = "decnet_rmem",
-                .data = &sysctl_decnet_rmem,
-                .maxlen = sizeof(sysctl_decnet_rmem),
-                .mode = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
-        {
-                .ctl_name = NET_DECNET_WMEM,
-                .procname = "decnet_wmem",
-                .data = &sysctl_decnet_wmem,
-                .maxlen = sizeof(sysctl_decnet_wmem),
-                .mode = 0644,
-                .proc_handler = &proc_dointvec,
-                .strategy = &sysctl_intvec,
-        },
+               .ctl_name = NET_DECNET_MEM,
+               .procname = "decnet_mem",
+               .data = &sysctl_decnet_mem,
+               .maxlen = sizeof(sysctl_decnet_mem),
+               .mode = 0644,
+               .proc_handler = &proc_dointvec,
+               .strategy = &sysctl_intvec,
+       },
+       {
+               .ctl_name = NET_DECNET_RMEM,
+               .procname = "decnet_rmem",
+               .data = &sysctl_decnet_rmem,
+               .maxlen = sizeof(sysctl_decnet_rmem),
+               .mode = 0644,
+               .proc_handler = &proc_dointvec,
+               .strategy = &sysctl_intvec,
+       },
+       {
+               .ctl_name = NET_DECNET_WMEM,
+               .procname = "decnet_wmem",
+               .data = &sysctl_decnet_wmem,
+               .maxlen = sizeof(sysctl_decnet_wmem),
+               .mode = 0644,
+               .proc_handler = &proc_dointvec,
+               .strategy = &sysctl_intvec,
+       },
        {
                .ctl_name = NET_DECNET_DEBUG_LEVEL,
                .procname = "debug",
@@ -472,18 +472,18 @@ static ctl_table dn_table[] = {
 
 static ctl_table dn_dir_table[] = {
        {
-               .ctl_name = NET_DECNET, 
-               .procname = "decnet", 
-               .mode = 0555, 
+               .ctl_name = NET_DECNET,
+               .procname = "decnet",
+               .mode = 0555,
                .child = dn_table},
        {0}
 };
 
 static ctl_table dn_root_table[] = {
        {
-               .ctl_name = CTL_NET, 
-               .procname = "net", 
-               .mode = 0555, 
+               .ctl_name = CTL_NET,
+               .procname = "net",
+               .mode = 0555,
                .child = dn_dir_table
        },
        {0}
@@ -491,7 +491,7 @@ static ctl_table dn_root_table[] = {
 
 void dn_register_sysctl(void)
 {
-       dn_table_header = register_sysctl_table(dn_root_table, 1);
+       dn_table_header = register_sysctl_table(dn_root_table);
 }
 
 void dn_unregister_sysctl(void)
index 4d66aac134835fb082044c26041c6f6039e3ba24..bc12e36263f0d4e15bcbfa300af80a5be5915f4a 100644 (file)
@@ -13,7 +13,6 @@
 
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
@@ -139,7 +138,7 @@ static int econet_recvmsg(struct kiocb *iocb, struct socket *sock,
        skb=skb_recv_datagram(sk,flags,flags&MSG_DONTWAIT,&err);
 
        /*
-        *      An error occurred so return it. Because skb_recv_datagram() 
+        *      An error occurred so return it. Because skb_recv_datagram()
         *      handles the blocking we don't see and worry about blocking
         *      retries.
         */
@@ -190,15 +189,15 @@ static int econet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len
        struct sockaddr_ec *sec = (struct sockaddr_ec *)uaddr;
        struct sock *sk;
        struct econet_sock *eo;
-       
+
        /*
         *      Check legality
         */
-        
+
        if (addr_len < sizeof(struct sockaddr_ec) ||
            sec->sec_family != AF_ECONET)
                return -EINVAL;
-       
+
        mutex_lock(&econet_mutex);
 
        sk = sock->sk;
@@ -283,18 +282,18 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
        int i;
        mm_segment_t oldfs;
 #endif
-               
+
        /*
-        *      Check the flags. 
+        *      Check the flags.
         */
 
-       if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT)) 
+       if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT))
                return -EINVAL;
 
        /*
-        *      Get and verify the address. 
+        *      Get and verify the address.
         */
-        
+
        mutex_lock(&econet_mutex);
 
        if (saddr == NULL) {
@@ -339,17 +338,17 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
                unsigned short proto = 0;
 
                dev_hold(dev);
-               
-               skb = sock_alloc_send_skb(sk, len+LL_RESERVED_SPACE(dev), 
+
+               skb = sock_alloc_send_skb(sk, len+LL_RESERVED_SPACE(dev),
                                          msg->msg_flags & MSG_DONTWAIT, &err);
                if (skb==NULL)
                        goto out_unlock;
-               
+
                skb_reserve(skb, LL_RESERVED_SPACE(dev));
                skb->nh.raw = skb->data;
-               
+
                eb = (struct ec_cb *)&skb->cb;
-               
+
                /* BUG: saddr may be NULL */
                eb->cookie = saddr->cookie;
                eb->sec = *saddr;
@@ -359,7 +358,7 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
                        int res;
                        struct ec_framehdr *fh;
                        err = -EINVAL;
-                       res = dev->hard_header(skb, dev, ntohs(proto), 
+                       res = dev->hard_header(skb, dev, ntohs(proto),
                                               &addr, NULL, len);
                        /* Poke in our control byte and
                           port number.  Hack, hack.  */
@@ -372,7 +371,7 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
                        } else if (res < 0)
                                goto out_free;
                }
-               
+
                /* Copy the data. Returns -EFAULT on error */
                err = memcpy_fromiovec(skb_put(skb,len), msg->msg_iov, len);
                skb->protocol = proto;
@@ -380,15 +379,15 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
                skb->priority = sk->sk_priority;
                if (err)
                        goto out_free;
-               
+
                err = -ENETDOWN;
                if (!(dev->flags & IFF_UP))
                        goto out_free;
-               
+
                /*
                 *      Now send it
                 */
-               
+
                dev_queue_xmit(skb);
                dev_put(dev);
                mutex_unlock(&econet_mutex);
@@ -414,7 +413,7 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
                mutex_unlock(&econet_mutex);
                return -ENETDOWN;               /* No socket - can't send */
        }
-       
+
        /* Make up a UDP datagram and hand it off to some higher intellect. */
 
        memset(&udpdest, 0, sizeof(udpdest));
@@ -432,7 +431,7 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
                idev = __in_dev_get_rcu(dev);
                if (idev) {
                        if (idev->ifa_list)
-                               network = ntohl(idev->ifa_list->ifa_address) & 
+                               network = ntohl(idev->ifa_list->ifa_address) &
                                        0xffffff00;             /* !!! */
                }
                rcu_read_unlock();
@@ -470,7 +469,7 @@ static int econet_sendmsg(struct kiocb *iocb, struct socket *sock,
        }
 
        /* Get a skbuff (no data, just holds our cb information) */
-       if ((skb = sock_alloc_send_skb(sk, 0, 
+       if ((skb = sock_alloc_send_skb(sk, 0,
                                       msg->msg_flags & MSG_DONTWAIT,
                                       &err)) == NULL) {
                mutex_unlock(&econet_mutex);
@@ -660,7 +659,7 @@ static int ec_dev_ioctl(struct socket *sock, unsigned int cmd, void __user *arg)
        if (copy_from_user(&ifr, arg, sizeof(struct ifreq)))
                return -EFAULT;
 
-       if ((dev = dev_get_by_name(ifr.ifr_name)) == NULL) 
+       if ((dev = dev_get_by_name(ifr.ifr_name)) == NULL)
                return -ENODEV;
 
        sec = (struct sockaddr_ec *)&ifr.ifr_addr;
@@ -754,7 +753,7 @@ static const struct proto_ops econet_ops = {
        .connect =      sock_no_connect,
        .socketpair =   sock_no_socketpair,
        .accept =       sock_no_accept,
-       .getname =      econet_getname, 
+       .getname =      econet_getname,
        .poll =         datagram_poll,
        .ioctl =        econet_ioctl,
        .listen =       sock_no_listen,
@@ -780,7 +779,7 @@ static struct sock *ec_listening_socket(unsigned char port, unsigned char
 
        sk_for_each(sk, node, &econet_sklist) {
                struct econet_sock *opt = ec_sk(sk);
-               if ((opt->port == port || opt->port == 0) && 
+               if ((opt->port == port || opt->port == 0) &&
                    (opt->station == station || opt->station == 0) &&
                    (opt->net == net || opt->net == 0))
                        goto found;
@@ -815,7 +814,7 @@ static int ec_queue_packet(struct sock *sk, struct sk_buff *skb,
 
 #ifdef CONFIG_ECONET_AUNUDP
 /*
- *     Send an AUN protocol response. 
+ *     Send an AUN protocol response.
  */
 
 static void aun_send_response(__u32 addr, unsigned long seq, int code, int cb)
@@ -828,7 +827,7 @@ static void aun_send_response(__u32 addr, unsigned long seq, int code, int cb)
        struct aunhdr ah = {.code = code, .cb = cb, .handle = seq};
        struct kvec iov = {.iov_base = (void *)&ah, .iov_len = sizeof(ah)};
        struct msghdr udpmsg;
-       
+
        udpmsg.msg_name = (void *)&sin;
        udpmsg.msg_namelen = sizeof(sin);
        udpmsg.msg_control = NULL;
@@ -858,7 +857,7 @@ static void aun_incoming(struct sk_buff *skb, struct aunhdr *ah, size_t len)
        if ((sk = ec_listening_socket(ah->port, stn, edev->net)) == NULL)
                goto bad;               /* Nobody wants it */
 
-       newskb = alloc_skb((len - sizeof(struct aunhdr) + 15) & ~15, 
+       newskb = alloc_skb((len - sizeof(struct aunhdr) + 15) & ~15,
                           GFP_ATOMIC);
        if (newskb == NULL)
        {
@@ -867,7 +866,7 @@ static void aun_incoming(struct sk_buff *skb, struct aunhdr *ah, size_t len)
                goto bad;
        }
 
-       memcpy(skb_put(newskb, len - sizeof(struct aunhdr)), (void *)(ah+1), 
+       memcpy(skb_put(newskb, len - sizeof(struct aunhdr)), (void *)(ah+1),
               len - sizeof(struct aunhdr));
 
        if (ec_queue_packet(sk, newskb, stn, edev->net, ah->cb, ah->port))
@@ -990,7 +989,7 @@ static void ab_cleanup(unsigned long h)
                struct ec_cb *eb = (struct ec_cb *)&skb->cb;
                if ((jiffies - eb->start) > eb->timeout)
                {
-                       tx_result(skb->sk, eb->cookie, 
+                       tx_result(skb->sk, eb->cookie,
                                  ECTYPE_TRANSMIT_NOT_PRESENT);
                        skb_unlink(skb, &aun_queue);
                        kfree_skb(skb);
@@ -1024,11 +1023,11 @@ static int __init aun_udp_initialise(void)
                printk("AUN: socket error %d\n", -error);
                return error;
        }
-       
+
        udpsock->sk->sk_reuse = 1;
        udpsock->sk->sk_allocation = GFP_ATOMIC; /* we're going to call it
                                                    from interrupts */
-       
+
        error = udpsock->ops->bind(udpsock, (struct sockaddr *)&sin,
                                sizeof(sin));
        if (error < 0)
index 2d31bf3f05c551e6cf3d6e4117cd2c98df81e661..7391f55904d1ba6bbdba777e88864bac2d938c98 100644 (file)
  *             Mark Evans, <evansmp@uhura.aston.ac.uk>
  *             Florian  La Roche, <rzsfl@rz.uni-sb.de>
  *             Alan Cox, <gw4pts@gw4pts.ampr.org>
- * 
+ *
  * Fixes:
  *             Mr Linux        : Arp problems
  *             Alan Cox        : Generic queue tidyup (very tiny here)
  *             Alan Cox        : eth_header ntohs should be htons
  *             Alan Cox        : eth_rebuild_header missing an htons and
  *                               minor other things.
- *             Tegge           : Arp bug fixes. 
+ *             Tegge           : Arp bug fixes.
  *             Florian         : Removed many unnecessary functions, code cleanup
  *                               and changes for new arp and skbuff.
  *             Alan Cox        : Redid header building to reflect new format.
@@ -40,7 +40,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
@@ -307,9 +306,9 @@ void ether_setup(struct net_device *dev)
        dev->hard_header_len    = ETH_HLEN;
        dev->mtu                = ETH_DATA_LEN;
        dev->addr_len           = ETH_ALEN;
-       dev->tx_queue_len       = 1000; /* Ethernet wants good queues */        
+       dev->tx_queue_len       = 1000; /* Ethernet wants good queues */
        dev->flags              = IFF_BROADCAST|IFF_MULTICAST;
-       
+
        memset(dev->broadcast, 0xFF, ETH_ALEN);
 
 }
index 7a95c3d8131425bb8c42bbabcb629747f06672f0..ec6d8851a06103e96e89f1b6cc5db8305cc371fe 100644 (file)
@@ -97,7 +97,7 @@ static int prism2_wep_build_iv(struct sk_buff *skb, int hdr_len,
        struct prism2_wep_data *wep = priv;
        u32 klen, len;
        u8 *pos;
-       
+
        if (skb_headroom(skb) < 4 || skb->len < hdr_len)
                return -1;
 
@@ -146,17 +146,17 @@ static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
        /* other checks are in prism2_wep_build_iv */
        if (skb_tailroom(skb) < 4)
                return -1;
-       
+
        /* add the IV to the frame */
        if (prism2_wep_build_iv(skb, hdr_len, NULL, 0, priv))
                return -1;
-       
+
        /* Copy the IV into the first 3 bytes of the key */
        memcpy(key, skb->data + hdr_len, 3);
 
        /* Copy rest of the WEP key (the secret part) */
        memcpy(key + 3, wep->key, wep->key_len);
-       
+
        len = skb->len - hdr_len - 4;
        pos = skb->data + hdr_len + 4;
        klen = 3 + wep->key_len;
index d97e5412e31b43a670b21364580f346bc5829734..4084909f6f924220becc534f557d5ab778ad6bb9 100644 (file)
@@ -663,7 +663,7 @@ int ieee80211_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
         * any security data (IV, ICV, etc) that was left behind */
        if (!can_be_decrypted && (fc & IEEE80211_FCTL_PROTECTED) &&
            ieee->host_strip_iv_icv) {
-               int trimlen = 0;
+               int trimlen = 0;
 
                /* Top two-bits of byte 3 are the key index */
                if (skb->len >= hdrlen + 3)
@@ -852,7 +852,7 @@ void ieee80211_rx_any(struct ieee80211_device *ieee,
 
        if ((fc & IEEE80211_FCTL_VERS) != 0)
                goto drop_free;
-               
+
        switch (fc & IEEE80211_FCTL_FTYPE) {
        case IEEE80211_FTYPE_MGMT:
                if (skb->len < sizeof(struct ieee80211_hdr_3addr))
@@ -1489,7 +1489,7 @@ static void update_network(struct ieee80211_network *dst,
 
        /* We only update the statistics if they were created by receiving
         * the network information on the actual channel the network is on.
-        * 
+        *
         * This keeps beacons received on neighbor channels from bringing
         * down the signal level of an AP. */
        if (dst->channel == src->stats.received_channel)
index 854fc13cd78d0b057dbf40812293f86b1a0716cb..c55949e5c58a990b923e747977e8e536c0f7a5fd 100644 (file)
@@ -54,7 +54,7 @@ Desc. | ctrl | dura |  DA/RA  |   TA    |    SA   | Sequ |  Frame  |  fcs |
       |      | tion | (BSSID) |         |         | ence |  data   |      |
       `--------------------------------------------------|         |------'
 Total: 28 non-data bytes                                 `----.----'
-                                                              |
+                                                             |
        .- 'Frame data' expands, if WEP enabled, to <----------'
        |
        V
@@ -64,8 +64,8 @@ Bytes |  4  |   0-2296  |  4  |
 Desc. | IV  | Encrypted | ICV |
       |     | Packet    |     |
       `-----|           |-----'
-            `-----.-----'
-                  |
+           `-----.-----'
+                 |
        .- 'Encrypted Packet' expands to
        |
        V
index 5cb9cfd35397dadc60c66a0048945ec88a57d8a0..40d7a55fe03e8158d49b85e8dd18da705cf3250f 100644 (file)
@@ -754,7 +754,7 @@ int ieee80211_wx_set_auth(struct net_device *dev,
        int err = 0;
 
        spin_lock_irqsave(&ieee->lock, flags);
-       
+
        switch (wrqu->param.flags & IW_AUTH_INDEX) {
        case IW_AUTH_WPA_VERSION:
        case IW_AUTH_CIPHER_PAIRWISE:
@@ -799,7 +799,7 @@ int ieee80211_wx_get_auth(struct net_device *dev,
        int err = 0;
 
        spin_lock_irqsave(&ieee->lock, flags);
-       
+
        switch (wrqu->param.flags & IW_AUTH_INDEX) {
        case IW_AUTH_WPA_VERSION:
        case IW_AUTH_CIPHER_PAIRWISE:
index a824852909e45b6fd3ab4dc27735921ffc9f9d6a..cc8110bdd5799359e95be983db36ba1616b6dff1 100644 (file)
@@ -30,7 +30,7 @@
  * Overview
  *
  * Before you can associate, you have to authenticate.
- * 
+ *
  */
 
 /* Sends out an association request to the desired AP */
@@ -41,10 +41,10 @@ ieee80211softmac_assoc(struct ieee80211softmac_device *mac, struct ieee80211soft
 
        /* Switch to correct channel for this network */
        mac->set_channel(mac->dev, net->channel);
-       
+
        /* Send association request */
        ieee80211softmac_send_mgt_frame(mac, net, IEEE80211_STYPE_ASSOC_REQ, 0);
-       
+
        dprintk(KERN_INFO PFX "sent association request!\n");
 
        spin_lock_irqsave(&mac->lock, flags);
@@ -153,7 +153,7 @@ network_matches_request(struct ieee80211softmac_device *mac, struct ieee80211_ne
        }
 
        /* if 'ANY' network requested, take any that doesn't have privacy enabled */
-       if (mac->associnfo.req_essid.len == 0 
+       if (mac->associnfo.req_essid.len == 0
            && !(net->capability & WLAN_CAPABILITY_PRIVACY))
                return 1;
        if (net->ssid_len != mac->associnfo.req_essid.len)
@@ -212,8 +212,8 @@ ieee80211softmac_assoc_work(struct work_struct *work)
 
        /* try to find the requested network in our list, if we found one already */
        if (bssvalid || mac->associnfo.bssfixed)
-               found = ieee80211softmac_get_network_by_bssid(mac, mac->associnfo.bssid);       
-       
+               found = ieee80211softmac_get_network_by_bssid(mac, mac->associnfo.bssid);
+
        /* Search the ieee80211 networks for this network if we didn't find it by bssid,
         * but only if we've scanned at least once (to get a better list of networks to
         * select from). If we have not scanned before, the !found logic below will be
@@ -265,7 +265,7 @@ ieee80211softmac_assoc_work(struct work_struct *work)
                if (mac->associnfo.scan_retry > 0) {
                        mac->associnfo.scan_retry--;
 
-                       /* We know of no such network. Let's scan. 
+                       /* We know of no such network. Let's scan.
                         * NB: this also happens if we had no memory to copy the network info...
                         * Maybe we can hope to have more memory after scanning finishes ;)
                         */
@@ -353,7 +353,7 @@ ieee80211softmac_associated(struct ieee80211softmac_device *mac,
                mac->set_bssid_filter(mac->dev, net->bssid);
        memcpy(mac->ieee->bssid, net->bssid, ETH_ALEN);
        netif_carrier_on(mac->dev);
-       
+
        mac->association_id = le16_to_cpup(&resp->aid);
 }
 
@@ -374,7 +374,7 @@ ieee80211softmac_handle_assoc_response(struct net_device * dev,
 
        if (unlikely(!mac->running))
                return -ENODEV;
-       
+
        spin_lock_irqsave(&mac->lock, flags);
 
        if (!mac->associnfo.associating) {
@@ -426,7 +426,7 @@ ieee80211softmac_handle_assoc_response(struct net_device * dev,
                        mac->associnfo.associated = 0;
                        ieee80211softmac_call_events_locked(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_FAILED, network);
        }
-       
+
        spin_unlock_irqrestore(&mac->lock, flags);
        return 0;
 }
index 8ed3e59b8024fd3f5dea77fd5e5df01162b3d039..826c32d24461198614b5ba3eb5eb4a0f33951ea2 100644 (file)
@@ -30,12 +30,12 @@ static void ieee80211softmac_auth_queue(struct work_struct *work);
 
 /* Queues an auth request to the desired AP */
 int
-ieee80211softmac_auth_req(struct ieee80211softmac_device *mac, 
+ieee80211softmac_auth_req(struct ieee80211softmac_device *mac,
        struct ieee80211softmac_network *net)
 {
        struct ieee80211softmac_auth_queue_item *auth;
        unsigned long flags;
-       
+
        if (net->authenticating || net->authenticated)
                return 0;
        net->authenticating = 1;
@@ -55,7 +55,7 @@ ieee80211softmac_auth_req(struct ieee80211softmac_device *mac,
        auth->retry = IEEE80211SOFTMAC_AUTH_RETRY_LIMIT;
        auth->state = IEEE80211SOFTMAC_AUTH_OPEN_REQUEST;
        INIT_DELAYED_WORK(&auth->work, ieee80211softmac_auth_queue);
-       
+
        /* Lock (for list) */
        spin_lock_irqsave(&mac->lock, flags);
 
@@ -63,7 +63,7 @@ ieee80211softmac_auth_req(struct ieee80211softmac_device *mac,
        list_add_tail(&auth->list, &mac->auth_queue);
        schedule_delayed_work(&auth->work, 0);
        spin_unlock_irqrestore(&mac->lock, flags);
-       
+
        return 0;
 }
 
@@ -85,7 +85,7 @@ ieee80211softmac_auth_queue(struct work_struct *work)
        if(auth->retry > 0) {
                /* Switch to correct channel for this network */
                mac->set_channel(mac->dev, net->channel);
-               
+
                /* Lock and set flags */
                spin_lock_irqsave(&mac->lock, flags);
                if (unlikely(!mac->running)) {
@@ -130,11 +130,11 @@ ieee80211softmac_auth_challenge_response(struct work_struct *work)
 }
 
 /* Handle the auth response from the AP
- * This should be registered with ieee80211 as handle_auth 
+ * This should be registered with ieee80211 as handle_auth
  */
-int 
+int
 ieee80211softmac_auth_resp(struct net_device *dev, struct ieee80211_auth *auth)
-{      
+{
 
        struct list_head *list_ptr;
        struct ieee80211softmac_device *mac = ieee80211_priv(dev);
@@ -142,7 +142,7 @@ ieee80211softmac_auth_resp(struct net_device *dev, struct ieee80211_auth *auth)
        struct ieee80211softmac_network *net = NULL;
        unsigned long flags;
        u8 * data;
-       
+
        if (unlikely(!mac->running))
                return -ENODEV;
 
@@ -157,15 +157,15 @@ ieee80211softmac_auth_resp(struct net_device *dev, struct ieee80211_auth *auth)
                        aq = NULL;
        }
        spin_unlock_irqrestore(&mac->lock, flags);
-       
+
        /* Make sure that we've got an auth queue item for this request */
        if(aq == NULL)
        {
                dprintkl(KERN_DEBUG PFX "Authentication response received from "MAC_FMT" but no queue item exists.\n", MAC_ARG(auth->header.addr2));
                /* Error #? */
                return -1;
-       }                       
-       
+       }
+
        /* Check for out of order authentication */
        if(!net->authenticating)
        {
@@ -182,10 +182,10 @@ ieee80211softmac_auth_resp(struct net_device *dev, struct ieee80211_auth *auth)
                case WLAN_STATUS_SUCCESS:
                        /* Update the status to Authenticated */
                        spin_lock_irqsave(&mac->lock, flags);
-                       net->authenticating = 0;
+                       net->authenticating = 0;
                        net->authenticated = 1;
                        spin_unlock_irqrestore(&mac->lock, flags);
-                       
+
                        /* Send event */
                        printkl(KERN_NOTICE PFX "Open Authentication completed with "MAC_FMT"\n", MAC_ARG(net->bssid));
                        ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_AUTHENTICATED, net);
@@ -196,8 +196,8 @@ ieee80211softmac_auth_resp(struct net_device *dev, struct ieee80211_auth *auth)
                        net->authenticated = 0;
                        net->authenticating = 0;
                        spin_unlock_irqrestore(&mac->lock, flags);
-                       
-                       printkl(KERN_NOTICE PFX "Open Authentication with "MAC_FMT" failed, error code: %i\n", 
+
+                       printkl(KERN_NOTICE PFX "Open Authentication with "MAC_FMT" failed, error code: %i\n",
                                MAC_ARG(net->bssid), le16_to_cpup(&auth->status));
                        /* Count the error? */
                        break;
@@ -212,11 +212,11 @@ ieee80211softmac_auth_resp(struct net_device *dev, struct ieee80211_auth *auth)
                        data = (u8 *)auth->info_element;
                        if (*data++ != MFIE_TYPE_CHALLENGE) {
                                printkl(KERN_NOTICE PFX "Shared Key Authentication failed due to a missing challenge.\n");
-                               break;  
+                               break;
                        }
                        /* Save the challenge */
                        spin_lock_irqsave(&mac->lock, flags);
-                       net->challenge_len = *data++;   
+                       net->challenge_len = *data++;
                        if (net->challenge_len > WLAN_AUTH_CHALLENGE_LEN)
                                net->challenge_len = WLAN_AUTH_CHALLENGE_LEN;
                        kfree(net->challenge);
@@ -229,7 +229,7 @@ ieee80211softmac_auth_resp(struct net_device *dev, struct ieee80211_auth *auth)
                                spin_unlock_irqrestore(&mac->lock, flags);
                                break;
                        }
-                       aq->state = IEEE80211SOFTMAC_AUTH_SHARED_RESPONSE; 
+                       aq->state = IEEE80211SOFTMAC_AUTH_SHARED_RESPONSE;
 
                        /* We reuse the work struct from the auth request here.
                         * It is safe to do so as each one is per-request, and
@@ -248,22 +248,22 @@ ieee80211softmac_auth_resp(struct net_device *dev, struct ieee80211_auth *auth)
                        /* Check the status code of the response */
                        switch(auth->status) {
                        case WLAN_STATUS_SUCCESS:
-                               /* Update the status to Authenticated */        
+                               /* Update the status to Authenticated */
                                spin_lock_irqsave(&mac->lock, flags);
                                net->authenticating = 0;
                                net->authenticated = 1;
                                spin_unlock_irqrestore(&mac->lock, flags);
-                               printkl(KERN_NOTICE PFX "Shared Key Authentication completed with "MAC_FMT"\n", 
+                               printkl(KERN_NOTICE PFX "Shared Key Authentication completed with "MAC_FMT"\n",
                                        MAC_ARG(net->bssid));
                                ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_AUTHENTICATED, net);
                                break;
                        default:
-                               printkl(KERN_NOTICE PFX "Shared Key Authentication with "MAC_FMT" failed, error code: %i\n", 
+                               printkl(KERN_NOTICE PFX "Shared Key Authentication with "MAC_FMT" failed, error code: %i\n",
                                        MAC_ARG(net->bssid), le16_to_cpup(&auth->status));
                                /* Lock and reset flags */
                                spin_lock_irqsave(&mac->lock, flags);
-                               net->authenticating = 0;
-                               net->authenticated = 0;
+                               net->authenticating = 0;
+                               net->authenticated = 0;
                                spin_unlock_irqrestore(&mac->lock, flags);
                                /* Count the error? */
                                break;
@@ -277,7 +277,7 @@ ieee80211softmac_auth_resp(struct net_device *dev, struct ieee80211_auth *auth)
                goto free_aq;
                break;
        default:
-               /* ERROR */     
+               /* ERROR */
                goto free_aq;
                break;
        }
@@ -313,7 +313,7 @@ ieee80211softmac_deauth_from_net(struct ieee80211softmac_device *mac,
        spin_lock_irqsave(&mac->lock, flags);
        net->authenticating = 0;
        net->authenticated = 0;
-       
+
        /* Find correct auth queue item, if it exists */
        list_for_each(list_ptr, &mac->auth_queue) {
                aq = list_entry(list_ptr, struct ieee80211softmac_auth_queue_item, list);
@@ -322,7 +322,7 @@ ieee80211softmac_deauth_from_net(struct ieee80211softmac_device *mac,
                else
                        aq = NULL;
        }
-       
+
        /* Cancel pending work */
        if(aq != NULL)
                /* Not entirely safe?  What about running work? */
@@ -333,7 +333,7 @@ ieee80211softmac_deauth_from_net(struct ieee80211softmac_device *mac,
        if(net->challenge != NULL)
                kfree(net->challenge);
        kfree(net);
-       
+
        /* can't transmit data right now... */
        netif_carrier_off(mac->dev);
        spin_unlock_irqrestore(&mac->lock, flags);
@@ -341,15 +341,15 @@ ieee80211softmac_deauth_from_net(struct ieee80211softmac_device *mac,
        ieee80211softmac_try_reassoc(mac);
 }
 
-/* 
+/*
  * Sends a deauth request to the desired AP
  */
-int 
-ieee80211softmac_deauth_req(struct ieee80211softmac_device *mac, 
+int
+ieee80211softmac_deauth_req(struct ieee80211softmac_device *mac,
        struct ieee80211softmac_network *net, int reason)
 {
        int ret;
-       
+
        /* Make sure the network is authenticated */
        if (!net->authenticated)
        {
@@ -357,25 +357,25 @@ ieee80211softmac_deauth_req(struct ieee80211softmac_device *mac,
                /* Error okay? */
                return -EPERM;
        }
-       
+
        /* Send the de-auth packet */
        if((ret = ieee80211softmac_send_mgt_frame(mac, net, IEEE80211_STYPE_DEAUTH, reason)))
                return ret;
-       
+
        ieee80211softmac_deauth_from_net(mac, net);
        return 0;
 }
+
 /*
  * This should be registered with ieee80211 as handle_deauth
  */
-int 
+int
 ieee80211softmac_deauth_resp(struct net_device *dev, struct ieee80211_deauth *deauth)
 {
-       
+
        struct ieee80211softmac_network *net = NULL;
        struct ieee80211softmac_device *mac = ieee80211_priv(dev);
-       
+
        if (unlikely(!mac->running))
                return -ENODEV;
 
@@ -385,7 +385,7 @@ ieee80211softmac_deauth_resp(struct net_device *dev, struct ieee80211_deauth *de
        }
 
        net = ieee80211softmac_get_network_by_bssid(mac, deauth->header.addr2);
-       
+
        if (net == NULL) {
                dprintkl(KERN_DEBUG PFX "Received deauthentication packet from "MAC_FMT", but that network is unknown.\n",
                        MAC_ARG(deauth->header.addr2));
index b9015656cfb3835e5e2966c457d0d9269ebb17f7..b3e33a4d48691f7ee3400ff9e22e612ebd49ffe4 100644 (file)
@@ -79,7 +79,7 @@ ieee80211softmac_notify_callback(struct work_struct *work)
                container_of(work, struct ieee80211softmac_event, work.work);
        struct ieee80211softmac_event event = *pevent;
        kfree(pevent);
-       
+
        event.fun(event.mac->dev, event.event_type, event.context);
 }
 
@@ -92,14 +92,14 @@ ieee80211softmac_notify_internal(struct ieee80211softmac_device *mac,
 
        if (event < -1 || event > IEEE80211SOFTMAC_EVENT_LAST)
                return -ENOSYS;
-       
+
        if (!fun)
                return -EINVAL;
-       
+
        eventptr = kmalloc(sizeof(struct ieee80211softmac_event), gfp_mask);
        if (!eventptr)
                return -ENOMEM;
-       
+
        eventptr->event_type = event;
        INIT_DELAYED_WORK(&eventptr->work, ieee80211softmac_notify_callback);
        eventptr->fun = fun;
@@ -122,7 +122,7 @@ ieee80211softmac_notify_gfp(struct net_device *dev,
 
        if (event < 0 || event > IEEE80211SOFTMAC_EVENT_LAST)
                return -ENOSYS;
-       
+
        return ieee80211softmac_notify_internal(mac, event, NULL, fun, context, gfp_mask);
 }
 EXPORT_SYMBOL_GPL(ieee80211softmac_notify_gfp);
@@ -133,7 +133,7 @@ ieee80211softmac_call_events_locked(struct ieee80211softmac_device *mac, int eve
 {
        struct ieee80211softmac_event *eventptr, *tmp;
        struct ieee80211softmac_network *network;
-       
+
        if (event >= 0) {
                union iwreq_data wrqu;
                int we_event;
index b96931001b43d131bc30d8d7841fda97b0897ce0..26c35253be334266680a01aa1579f794945b779f 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
  * Some parts based on code from net80211
  * Copyright (c) 2001 Atsushi Onoe
  * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- * 
+ *
  */
 
 #include "ieee80211softmac_priv.h"
 
 /* Helper functions for inserting data into the frames */
 
-/* 
+/*
  * Adds an ESSID element to the frame
  *
  */
@@ -53,7 +53,7 @@ ieee80211softmac_add_essid(u8 *dst, struct ieee80211softmac_essid *essid)
                *dst++ = 0;
                return dst;
        }
-}     
+}
 
 /* Adds Supported Rates and if required Extended Rates Information Element
  * to the frame, ASSUMES WE HAVE A SORTED LIST OF RATES */
@@ -81,18 +81,18 @@ ieee80211softmac_frame_add_rates(u8 *dst, const struct ieee80211softmac_ratesinf
                        memcpy(dst, r->rates + cck_len, ofdm_len);
                        dst += ofdm_len;
                }
-       }       
+       }
        return dst;
 }
 
 /* Allocate a management frame */
-static u8 * 
+static u8 *
 ieee80211softmac_alloc_mgt(u32 size)
 {
        u8 * data;
-       
+
        /* Add the header and FCS to the size */
-       size = size + IEEE80211_3ADDR_LEN;      
+       size = size + IEEE80211_3ADDR_LEN;
        if(size > IEEE80211_DATA_LEN)
                return NULL;
        /* Allocate the frame */
@@ -103,13 +103,13 @@ ieee80211softmac_alloc_mgt(u32 size)
 /*
  * Add a 2 Address Header
  */
-static void 
+static void
 ieee80211softmac_hdr_2addr(struct ieee80211softmac_device *mac,
        struct ieee80211_hdr_2addr *header, u32 type, u8 *dest)
 {
        /* Fill in the frame control flags */
        header->frame_ctl = cpu_to_le16(type);
-       /* Control packets always have WEP turned off */        
+       /* Control packets always have WEP turned off */
        if(type > IEEE80211_STYPE_CFENDACK && type < IEEE80211_STYPE_PSPOLL)
                header->frame_ctl |= mac->ieee->sec.level ? cpu_to_le16(IEEE80211_FCTL_PROTECTED) : 0;
 
@@ -130,13 +130,13 @@ ieee80211softmac_hdr_2addr(struct ieee80211softmac_device *mac,
 
 
 /* Add a 3 Address Header */
-static void 
+static void
 ieee80211softmac_hdr_3addr(struct ieee80211softmac_device *mac,
        struct ieee80211_hdr_3addr *header, u32 type, u8 *dest, u8 *bssid)
 {
        /* This is common with 2addr, so use that instead */
-       ieee80211softmac_hdr_2addr(mac, (struct ieee80211_hdr_2addr *)header, type, dest);      
-       
+       ieee80211softmac_hdr_2addr(mac, (struct ieee80211_hdr_2addr *)header, type, dest);
+
        /* Fill in the BSS ID */
        if(bssid == NULL)
                memset(header->addr3, 0xFF, ETH_ALEN);
@@ -201,11 +201,11 @@ ieee80211softmac_capabilities(struct ieee80211softmac_device *mac,
 
 /*****************************************************************************
  * Create Management packets
- *****************************************************************************/ 
+ *****************************************************************************/
 
 /* Creates an association request packet */
 static u32
-ieee80211softmac_assoc_req(struct ieee80211_assoc_request **pkt, 
+ieee80211softmac_assoc_req(struct ieee80211_assoc_request **pkt,
        struct ieee80211softmac_device *mac, struct ieee80211softmac_network *net)
 {
        u8 *data;
@@ -233,7 +233,7 @@ ieee80211softmac_assoc_req(struct ieee80211_assoc_request **pkt,
 
        /* Fill in Listen Interval (?) */
        (*pkt)->listen_interval = cpu_to_le16(10);
-       
+
        data = (u8 *)(*pkt)->info_element;
        /* Add SSID */
        data = ieee80211softmac_add_essid(data, &net->essid);
@@ -250,7 +250,7 @@ ieee80211softmac_assoc_req(struct ieee80211_assoc_request **pkt,
 
 /* Create a reassociation request packet */
 static u32
-ieee80211softmac_reassoc_req(struct ieee80211_reassoc_request **pkt, 
+ieee80211softmac_reassoc_req(struct ieee80211_reassoc_request **pkt,
        struct ieee80211softmac_device *mac, struct ieee80211softmac_network *net)
 {
        u8 *data;
@@ -263,9 +263,9 @@ ieee80211softmac_reassoc_req(struct ieee80211_reassoc_request **pkt,
                /* Rates IE */
                1 + 1 + IEEE80211SOFTMAC_MAX_RATES_LEN +
                /* Extended Rates IE */
-               1 + 1 + IEEE80211SOFTMAC_MAX_EX_RATES_LEN 
+               1 + 1 + IEEE80211SOFTMAC_MAX_EX_RATES_LEN
                /* Other IE's? */
-       );                              
+       );
        if (unlikely((*pkt) == NULL))
                return 0;
        ieee80211softmac_hdr_3addr(mac, &((*pkt)->header), IEEE80211_STYPE_REASSOC_REQ, net->bssid, net->bssid);
@@ -277,10 +277,10 @@ ieee80211softmac_reassoc_req(struct ieee80211_reassoc_request **pkt,
        (*pkt)->listen_interval = cpu_to_le16(10);
        /* Fill in the current AP MAC */
        memcpy((*pkt)->current_ap, mac->ieee->bssid, ETH_ALEN);
-       
+
        data = (u8 *)(*pkt)->info_element;
        /* Add SSID */
-       data = ieee80211softmac_add_essid(data, &net->essid); 
+       data = ieee80211softmac_add_essid(data, &net->essid);
        /* Add Rates */
        data = ieee80211softmac_frame_add_rates(data, &mac->ratesinfo);
        /* Return packet size */
@@ -289,7 +289,7 @@ ieee80211softmac_reassoc_req(struct ieee80211_reassoc_request **pkt,
 
 /* Create an authentication packet */
 static u32
-ieee80211softmac_auth(struct ieee80211_auth **pkt, 
+ieee80211softmac_auth(struct ieee80211_auth **pkt,
        struct ieee80211softmac_device *mac, struct ieee80211softmac_network *net,
        u16 transaction, u16 status, int *encrypt_mpdu)
 {
@@ -309,20 +309,20 @@ ieee80211softmac_auth(struct ieee80211_auth **pkt,
        if (unlikely((*pkt) == NULL))
                return 0;
        ieee80211softmac_hdr_3addr(mac, &((*pkt)->header), IEEE80211_STYPE_AUTH, net->bssid, net->bssid);
-               
+
        /* Algorithm */
        (*pkt)->algorithm = cpu_to_le16(auth_mode);
        /* Transaction */
        (*pkt)->transaction = cpu_to_le16(transaction);
        /* Status */
        (*pkt)->status = cpu_to_le16(status);
-       
+
        data = (u8 *)(*pkt)->info_element;
        /* Challenge Text */
        if (is_shared_response) {
                *data = MFIE_TYPE_CHALLENGE;
                data++;
-               
+
                /* Copy the challenge in */
                *data = net->challenge_len;
                data++;
@@ -360,7 +360,7 @@ static u32
 ieee80211softmac_probe_req(struct ieee80211_probe_request **pkt,
        struct ieee80211softmac_device *mac, struct ieee80211softmac_essid *essid)
 {
-       u8 *data;       
+       u8 *data;
        /* Allocate Packet */
        (*pkt) = (struct ieee80211_probe_request *)ieee80211softmac_alloc_mgt(
                /* SSID of requested network */
@@ -368,12 +368,12 @@ ieee80211softmac_probe_req(struct ieee80211_probe_request **pkt,
                /* Rates IE */
                1 + 1 + IEEE80211SOFTMAC_MAX_RATES_LEN +
                /* Extended Rates IE */
-               1 + 1 + IEEE80211SOFTMAC_MAX_EX_RATES_LEN 
+               1 + 1 + IEEE80211SOFTMAC_MAX_EX_RATES_LEN
        );
        if (unlikely((*pkt) == NULL))
                return 0;
        ieee80211softmac_hdr_3addr(mac, &((*pkt)->header), IEEE80211_STYPE_PROBE_REQ, NULL, NULL);
-               
+
        data = (u8 *)(*pkt)->info_element;
        /* Add ESSID (can be NULL) */
        data = ieee80211softmac_add_essid(data, essid);
@@ -401,7 +401,7 @@ ieee80211softmac_probe_resp(struct ieee80211_probe_response **pkt,
                2 +             /* DS Parameter Set */
                8 +             /* CF Parameter Set */
                4               /* IBSS Parameter Set */
-       );      
+       );
        if (unlikely((*pkt) == NULL))
                return 0;
        ieee80211softmac_hdr_3addr(mac, &((*pkt)->header), IEEE80211_STYPE_PROBE_RESP, net->bssid, net->bssid);
@@ -445,15 +445,15 @@ ieee80211softmac_send_mgt_frame(struct ieee80211softmac_device *mac,
                pkt_size = ieee80211softmac_probe_resp((struct ieee80211_probe_response **)(&pkt), mac, (struct ieee80211softmac_network *)ptrarg);
                break;
        default:
-                printkl(KERN_DEBUG PFX "Unsupported Management Frame type: %i\n", type);
-                return -EINVAL;
+               printkl(KERN_DEBUG PFX "Unsupported Management Frame type: %i\n", type);
+               return -EINVAL;
        };
 
        if(pkt_size == 0 || pkt == NULL) {
                printkl(KERN_DEBUG PFX "Error, packet is nonexistant or 0 length\n");
                return -ENOMEM;
        }
-       
+
        /* Send the packet to the ieee80211 layer for tx */
        /* we defined softmac->mgmt_xmit for this. Should we keep it
         * as it is (that means we'd need to wrap this into a txb),
index 256207b71dc94ce135aca1d3adc36f5c49875305..4f8c3ef7081950b6e20157245b100dfca7f64065 100644 (file)
@@ -32,19 +32,19 @@ struct net_device *alloc_ieee80211softmac(int sizeof_priv)
 {
        struct ieee80211softmac_device *softmac;
        struct net_device *dev;
-       
+
        dev = alloc_ieee80211(sizeof(struct ieee80211softmac_device) + sizeof_priv);
        softmac = ieee80211_priv(dev);
        softmac->dev = dev;
        softmac->ieee = netdev_priv(dev);
        spin_lock_init(&softmac->lock);
-       
+
        softmac->ieee->handle_auth = ieee80211softmac_auth_resp;
        softmac->ieee->handle_deauth = ieee80211softmac_deauth_resp;
        softmac->ieee->handle_assoc_response = ieee80211softmac_handle_assoc_response;
        softmac->ieee->handle_reassoc_request = ieee80211softmac_handle_reassoc_req;
        softmac->ieee->handle_disassoc = ieee80211softmac_handle_disassoc;
-       softmac->ieee->handle_beacon = ieee80211softmac_handle_beacon;
+       softmac->ieee->handle_beacon = ieee80211softmac_handle_beacon;
        softmac->scaninfo = NULL;
 
        softmac->associnfo.scan_retry = IEEE80211SOFTMAC_ASSOC_SCAN_RETRY_LIMIT;
@@ -66,37 +66,37 @@ struct net_device *alloc_ieee80211softmac(int sizeof_priv)
 
        /* to start with, we can't send anything ... */
        netif_carrier_off(dev);
-       
+
        return dev;
 }
 EXPORT_SYMBOL_GPL(alloc_ieee80211softmac);
 
 /* Clears the pending work queue items, stops all scans, etc. */
-void 
+void
 ieee80211softmac_clear_pending_work(struct ieee80211softmac_device *sm)
 {
        unsigned long flags;
        struct ieee80211softmac_event *eventptr, *eventtmp;
        struct ieee80211softmac_auth_queue_item *authptr, *authtmp;
        struct ieee80211softmac_network *netptr, *nettmp;
-       
+
        ieee80211softmac_stop_scan(sm);
        ieee80211softmac_wait_for_scan(sm);
-       
+
        spin_lock_irqsave(&sm->lock, flags);
        sm->running = 0;
 
        /* Free all pending assoc work items */
        cancel_delayed_work(&sm->associnfo.work);
-       
+
        /* Free all pending scan work items */
        if(sm->scaninfo != NULL)
-               cancel_delayed_work(&sm->scaninfo->softmac_scan);       
-       
+               cancel_delayed_work(&sm->scaninfo->softmac_scan);
+
        /* Free all pending auth work items */
        list_for_each_entry(authptr, &sm->auth_queue, list)
                cancel_delayed_work(&authptr->work);
-       
+
        /* delete all pending event calls and work items */
        list_for_each_entry_safe(eventptr, eventtmp, &sm->events, list)
                cancel_delayed_work(&eventptr->work);
@@ -111,13 +111,13 @@ ieee80211softmac_clear_pending_work(struct ieee80211softmac_device *sm)
                list_del(&authptr->list);
                kfree(authptr);
        }
-       
+
        /* delete all pending event calls and work items */
        list_for_each_entry_safe(eventptr, eventtmp, &sm->events, list) {
                list_del(&eventptr->list);
                kfree(eventptr);
        }
-               
+
        /* Free all networks */
        list_for_each_entry_safe(netptr, nettmp, &sm->network_list, list) {
                ieee80211softmac_del_network_locked(sm, netptr);
@@ -133,7 +133,7 @@ EXPORT_SYMBOL_GPL(ieee80211softmac_clear_pending_work);
 void free_ieee80211softmac(struct net_device *dev)
 {
        struct ieee80211softmac_device *sm = ieee80211_priv(dev);
-       ieee80211softmac_clear_pending_work(sm);        
+       ieee80211softmac_clear_pending_work(sm);
        kfree(sm->scaninfo);
        kfree(sm->wpa.IE);
        free_ieee80211(dev);
@@ -208,9 +208,9 @@ EXPORT_SYMBOL_GPL(ieee80211softmac_highest_supported_rate);
 void ieee80211softmac_process_erp(struct ieee80211softmac_device *mac,
        u8 erp_value)
 {
-       int use_protection;
+       int use_protection;
        int short_preamble;
-       u32 changes = 0;
+       u32 changes = 0;
 
        /* Barker preamble mode */
        short_preamble = ((erp_value & WLAN_ERP_BARKER_PREAMBLE) == 0
@@ -269,7 +269,7 @@ void ieee80211softmac_init_bss(struct ieee80211softmac_device *mac)
           rates, so 801.11g devices start off at 11M for now. People
           can manually change it if they really need to, but 11M is
           more reliable. Note similar logic in
-          ieee80211softmac_wx_set_rate() */     
+          ieee80211softmac_wx_set_rate() */
        if (ieee->modulation & IEEE80211_CCK_MODULATION) {
                txrates->user_rate = IEEE80211_CCK_RATE_11MB;
        } else if (ieee->modulation & IEEE80211_OFDM_MODULATION) {
@@ -332,7 +332,7 @@ void ieee80211softmac_set_rates(struct net_device *dev, u8 count, u8 *rates)
 {
        struct ieee80211softmac_device *mac = ieee80211_priv(dev);
        unsigned long flags;
-       
+
        spin_lock_irqsave(&mac->lock, flags);
        memcpy(mac->ratesinfo.rates, rates, count);
        mac->ratesinfo.count = count;
@@ -344,7 +344,7 @@ static u8 raise_rate(struct ieee80211softmac_device *mac, u8 rate)
 {
        int i;
        struct ieee80211softmac_ratesinfo *ri = &mac->ratesinfo;
-       
+
        for (i=0; i<ri->count-1; i++) {
                if (ri->rates[i] == rate)
                        return ri->rates[i+1];
@@ -357,7 +357,7 @@ u8 ieee80211softmac_lower_rate_delta(struct ieee80211softmac_device *mac, u8 rat
 {
        int i;
        struct ieee80211softmac_ratesinfo *ri = &mac->ratesinfo;
-       
+
        for (i=delta; i<ri->count; i++) {
                if (ri->rates[i] == rate)
                        return ri->rates[i-delta];
@@ -438,7 +438,7 @@ ieee80211softmac_create_network(struct ieee80211softmac_device *mac,
        softnet->channel = net->channel;
        softnet->essid.len = net->ssid_len;
        memcpy(softnet->essid.data, net->ssid, softnet->essid.len);
-       
+
        /* copy rates over */
        softnet->supported_rates.count = net->rates_len;
        memcpy(&softnet->supported_rates.rates[0], net->rates, net->rates_len);
@@ -529,7 +529,7 @@ ieee80211softmac_get_network_by_bssid(struct ieee80211softmac_device *mac,
 {
        unsigned long flags;
        struct ieee80211softmac_network *softmac_net;
-       
+
        spin_lock_irqsave(&mac->lock, flags);
        softmac_net = ieee80211softmac_get_network_by_bssid_locked(mac, bssid);
        spin_unlock_irqrestore(&mac->lock, flags);
@@ -556,13 +556,13 @@ ieee80211softmac_get_network_by_essid_locked(struct ieee80211softmac_device *mac
 /* Get a network from the list by ESSID with locking */
 struct ieee80211softmac_network *
 ieee80211softmac_get_network_by_essid(struct ieee80211softmac_device *mac,
-       struct ieee80211softmac_essid *essid)   
+       struct ieee80211softmac_essid *essid)
 {
        unsigned long flags;
        struct ieee80211softmac_network *softmac_net = NULL;
 
        spin_lock_irqsave(&mac->lock, flags);
-       softmac_net = ieee80211softmac_get_network_by_essid_locked(mac, essid); 
+       softmac_net = ieee80211softmac_get_network_by_essid_locked(mac, essid);
        spin_unlock_irqrestore(&mac->lock, flags);
        return softmac_net;
 }
index 4c2bba34d328c811ad2261c83dc39b371b00d7c5..c43b189634dfecffded989b046fbdb12834a6c31 100644 (file)
@@ -130,7 +130,7 @@ static inline u8 get_fallback_rate(struct ieee80211softmac_device *mac, u8 rate)
 {
        return ieee80211softmac_lower_rate_delta(mac, rate, 2);
 }
-                
+
 
 /*** prototypes from _io.c */
 int ieee80211softmac_send_mgt_frame(struct ieee80211softmac_device *mac,
@@ -156,7 +156,7 @@ int ieee80211softmac_handle_assoc_response(struct net_device * dev,
 int ieee80211softmac_handle_disassoc(struct net_device * dev,
                                     struct ieee80211_disassoc * disassoc);
 int ieee80211softmac_handle_reassoc_req(struct net_device * dev,
-                                       struct ieee80211_reassoc_request * reassoc);
+                                       struct ieee80211_reassoc_request * reassoc);
 void ieee80211softmac_assoc_timeout(struct work_struct *work);
 void ieee80211softmac_send_disassoc_req(struct ieee80211softmac_device *mac, u16 reason);
 void ieee80211softmac_disassoc(struct ieee80211softmac_device *mac);
@@ -164,15 +164,15 @@ void ieee80211softmac_disassoc(struct ieee80211softmac_device *mac);
 /* some helper functions */
 static inline int ieee80211softmac_scan_handlers_check_self(struct ieee80211softmac_device *sm)
 {
-       return (sm->start_scan == ieee80211softmac_start_scan_implementation) && 
-               (sm->stop_scan == ieee80211softmac_stop_scan_implementation) && 
+       return (sm->start_scan == ieee80211softmac_start_scan_implementation) &&
+               (sm->stop_scan == ieee80211softmac_stop_scan_implementation) &&
                (sm->wait_for_scan == ieee80211softmac_wait_for_scan_implementation);
 }
 
 static inline int ieee80211softmac_scan_sanity_check(struct ieee80211softmac_device *sm)
 {
-       return ((sm->start_scan != ieee80211softmac_start_scan_implementation) && 
-               (sm->stop_scan != ieee80211softmac_stop_scan_implementation) && 
+       return ((sm->start_scan != ieee80211softmac_start_scan_implementation) &&
+               (sm->stop_scan != ieee80211softmac_stop_scan_implementation) &&
                (sm->wait_for_scan != ieee80211softmac_wait_for_scan_implementation)
                ) || ieee80211softmac_scan_handlers_check_self(sm);
 }
index 0c85d6c24cdbca332a5e865fdbb2d51f0ab05621..abea3648680ebf02b978931fa5c20b3a2e0101fc 100644 (file)
@@ -62,12 +62,12 @@ ieee80211softmac_stop_scan(struct ieee80211softmac_device *sm)
        unsigned long flags;
 
        spin_lock_irqsave(&sm->lock, flags);
-       
+
        if (!sm->scanning) {
                spin_unlock_irqrestore(&sm->lock, flags);
                return;
        }
-       
+
        spin_unlock_irqrestore(&sm->lock, flags);
        sm->stop_scan(sm->dev);
 }
@@ -78,12 +78,12 @@ ieee80211softmac_wait_for_scan(struct ieee80211softmac_device *sm)
        unsigned long flags;
 
        spin_lock_irqsave(&sm->lock, flags);
-       
+
        if (!sm->scanning) {
                spin_unlock_irqrestore(&sm->lock, flags);
                return;
        }
-       
+
        spin_unlock_irqrestore(&sm->lock, flags);
        sm->wait_for_scan(sm->dev);
 }
@@ -158,14 +158,14 @@ int ieee80211softmac_start_scan_implementation(struct net_device *dev)
 {
        struct ieee80211softmac_device *sm = ieee80211_priv(dev);
        unsigned long flags;
-       
+
        if (!(dev->flags & IFF_UP))
                return -ENODEV;
 
        assert(ieee80211softmac_scan_handlers_check_self(sm));
        if (!ieee80211softmac_scan_handlers_check_self(sm))
                return -EINVAL;
-               
+
        spin_lock_irqsave(&sm->lock, flags);
        /* it looks like we need to hold the lock here
         * to make sure we don't allocate two of these... */
@@ -241,7 +241,7 @@ void ieee80211softmac_scan_finished(struct ieee80211softmac_device *sm)
        spin_lock_irqsave(&sm->lock, flags);
        sm->scanning = 0;
        spin_unlock_irqrestore(&sm->lock, flags);
-       
+
        if (sm->associnfo.bssvalid) {
                struct ieee80211softmac_network *net;
 
index fb58e03b3fbda3497245f3b484c01db14a343e4c..c306d52566e0dfda1673b37a089a85dd40ea78a7 100644 (file)
@@ -142,14 +142,14 @@ ieee80211softmac_wx_get_essid(struct net_device *net_dev,
        /* If all fails, return ANY (empty) */
        data->essid.length = 0;
        data->essid.flags = 0;  /* active */
-       
+
        /* If we have a statically configured ESSID then return it */
        if (sm->associnfo.static_essid) {
                data->essid.length = sm->associnfo.req_essid.len;
                data->essid.flags = 1;  /* active */
                memcpy(extra, sm->associnfo.req_essid.data, sm->associnfo.req_essid.len);
        }
-       
+
        /* If we're associating/associated, return that */
        if (sm->associnfo.associated || sm->associnfo.associating) {
                data->essid.length = sm->associnfo.associate_essid.len;
@@ -181,7 +181,7 @@ ieee80211softmac_wx_set_rate(struct net_device *net_dev,
                   rates, so 801.11g devices start off at 11M for now. People
                   can manually change it if they really need to, but 11M is
                   more reliable. Note similar logic in
-                  ieee80211softmac_wx_set_rate() */     
+                  ieee80211softmac_wx_set_rate() */
                if (ieee->modulation & IEEE80211_CCK_MODULATION)
                        in_rate = 11000000;
                else
@@ -247,7 +247,7 @@ ieee80211softmac_wx_set_rate(struct net_device *net_dev,
        ieee80211softmac_recalc_txrates(mac);
        err = 0;
 
-out_unlock:    
+out_unlock:
        spin_unlock_irqrestore(&mac->lock, flags);
 out:
        return err;
@@ -366,7 +366,7 @@ ieee80211softmac_wx_set_wap(struct net_device *net_dev,
        } else if (is_zero_ether_addr(data->ap_addr.sa_data)) {
                /* the bssid we have is no longer fixed */
                mac->associnfo.bssfixed = 0;
-        } else {
+       } else {
                if (!memcmp(mac->associnfo.bssid, data->ap_addr.sa_data, ETH_ALEN)) {
                        if (mac->associnfo.associating || mac->associnfo.associated) {
                        /* bssid unchanged and associated or associating - just return */
@@ -380,7 +380,7 @@ ieee80211softmac_wx_set_wap(struct net_device *net_dev,
                mac->associnfo.bssfixed = 1;
                /* queue associate if new bssid or (old one again and not associated) */
                schedule_delayed_work(&mac->associnfo.work, 0);
-        }
+       }
 
  out:
        mutex_unlock(&mac->associnfo.mutex);
@@ -437,7 +437,7 @@ ieee80211softmac_wx_set_genie(struct net_device *dev,
                mac->wpa.IEbuflen = 0;
        }
 
- out:  
+ out:
        spin_unlock_irqrestore(&mac->lock, flags);
        mutex_unlock(&mac->associnfo.mutex);
 
@@ -458,9 +458,9 @@ ieee80211softmac_wx_get_genie(struct net_device *dev,
 
        mutex_lock(&mac->associnfo.mutex);
        spin_lock_irqsave(&mac->lock, flags);
-       
+
        wrqu->data.length = 0;
-       
+
        if (mac->wpa.IE && mac->wpa.IElen) {
                wrqu->data.length = mac->wpa.IElen;
                if (mac->wpa.IElen <= space)
index 5750a2b2a0d6f38e8a6cf2874b560cc50ebfa8f2..cf358c84c44060353b69b5ef26129f8a9cb2a266 100644 (file)
@@ -550,7 +550,7 @@ int inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
                if (err < 0)
                        goto out;
 
-               sock->state = SS_CONNECTING;
+               sock->state = SS_CONNECTING;
 
                /* Just entered SS_CONNECTING state; the only
                 * difference is that return value in non-blocking
@@ -878,36 +878,36 @@ static struct net_proto_family inet_family_ops = {
  */
 static struct inet_protosw inetsw_array[] =
 {
-        {
-                .type =       SOCK_STREAM,
-                .protocol =   IPPROTO_TCP,
-                .prot =       &tcp_prot,
-                .ops =        &inet_stream_ops,
-                .capability = -1,
-                .no_check =   0,
-                .flags =      INET_PROTOSW_PERMANENT |
+       {
+               .type =       SOCK_STREAM,
+               .protocol =   IPPROTO_TCP,
+               .prot =       &tcp_prot,
+               .ops =        &inet_stream_ops,
+               .capability = -1,
+               .no_check =   0,
+               .flags =      INET_PROTOSW_PERMANENT |
                              INET_PROTOSW_ICSK,
-        },
-
-        {
-                .type =       SOCK_DGRAM,
-                .protocol =   IPPROTO_UDP,
-                .prot =       &udp_prot,
-                .ops =        &inet_dgram_ops,
-                .capability = -1,
-                .no_check =   UDP_CSUM_DEFAULT,
-                .flags =      INET_PROTOSW_PERMANENT,
+       },
+
+       {
+               .type =       SOCK_DGRAM,
+               .protocol =   IPPROTO_UDP,
+               .prot =       &udp_prot,
+               .ops =        &inet_dgram_ops,
+               .capability = -1,
+               .no_check =   UDP_CSUM_DEFAULT,
+               .flags =      INET_PROTOSW_PERMANENT,
        },
-        
+
 
        {
-               .type =       SOCK_RAW,
-               .protocol =   IPPROTO_IP,       /* wild card */
-               .prot =       &raw_prot,
-               .ops =        &inet_sockraw_ops,
-               .capability = CAP_NET_RAW,
-               .no_check =   UDP_CSUM_DEFAULT,
-               .flags =      INET_PROTOSW_REUSE,
+              .type =       SOCK_RAW,
+              .protocol =   IPPROTO_IP,        /* wild card */
+              .prot =       &raw_prot,
+              .ops =        &inet_sockraw_ops,
+              .capability = CAP_NET_RAW,
+              .no_check =   UDP_CSUM_DEFAULT,
+              .flags =      INET_PROTOSW_REUSE,
        }
 };
 
@@ -946,7 +946,7 @@ void inet_register_protosw(struct inet_protosw *p)
        /* Add the new entry after the last permanent entry if any, so that
         * the new entry does not override a permanent entry when matched with
         * a wild-card protocol. But it is allowed to override any existing
-        * non-permanent entry.  This means that when we remove this entry, the 
+        * non-permanent entry.  This means that when we remove this entry, the
         * system automatically returns to the old behavior.
         */
        list_add_rcu(&p->list, last_perm);
@@ -1073,7 +1073,7 @@ int inet_sk_rebuild_header(struct sock *sk)
                        },
                },
        };
-                                               
+
        security_sk_classify_flow(sk, &fl);
        err = ip_route_output_flow(&rt, &fl, sk, 0);
 }
@@ -1273,10 +1273,10 @@ static int __init inet_init(void)
                goto out_unregister_udp_proto;
 
        /*
-        *      Tell SOCKET that we are alive... 
+        *      Tell SOCKET that we are alive...
         */
 
-       (void)sock_register(&inet_family_ops);
+       (void)sock_register(&inet_family_ops);
 
        /*
         *      Add all the base protocols.
@@ -1306,9 +1306,9 @@ static int __init inet_init(void)
 
        arp_init();
 
-       /*
-        *      Set the IP module up
-        */
+       /*
+        *      Set the IP module up
+        */
 
        ip_init();
 
@@ -1334,11 +1334,11 @@ static int __init inet_init(void)
 #endif
        /*
         *      Initialise per-cpu ipv4 mibs
-        */ 
+        */
 
        if(init_ipv4_mibs())
                printk(KERN_CRIT "inet_init: Cannot init ipv4 mibs\n"); ;
-       
+
        ipv4_proc_init();
 
        ipfrag_init();
index 67a5509e26fc1e7b18dcfdbafd92986a97626ccb..7194eb40b6d08cbd2304fb8dd8d9eb415b9a73de 100644 (file)
@@ -91,7 +91,7 @@ static int ah_output(struct xfrm_state *x, struct sk_buff *skb)
        top_iph->check = 0;
 
        ahp = x->data;
-       ah->hdrlen  = (XFRM_ALIGN8(sizeof(struct ip_auth_hdr) + 
+       ah->hdrlen  = (XFRM_ALIGN8(sizeof(struct ip_auth_hdr) +
                                   ahp->icv_trunc_len) >> 2) - 2;
 
        ah->reserved = 0;
@@ -135,9 +135,9 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb)
        ah = (struct ip_auth_hdr*)skb->data;
        ahp = x->data;
        ah_hlen = (ah->hdrlen + 2) << 2;
-       
+
        if (ah_hlen != XFRM_ALIGN8(sizeof(struct ip_auth_hdr) + ahp->icv_full_len) &&
-           ah_hlen != XFRM_ALIGN8(sizeof(struct ip_auth_hdr) + ahp->icv_trunc_len)) 
+           ah_hlen != XFRM_ALIGN8(sizeof(struct ip_auth_hdr) + ahp->icv_trunc_len))
                goto out;
 
        if (!pskb_may_pull(skb, ah_hlen))
@@ -166,9 +166,9 @@ static int ah_input(struct xfrm_state *x, struct sk_buff *skb)
                if (ip_clear_mutable_options(iph, &dummy))
                        goto out;
        }
-        {
+       {
                u8 auth_data[MAX_AH_AUTH_LEN];
-               
+
                memcpy(auth_data, ah->auth_data, ahp->icv_trunc_len);
                skb_push(skb, ihl);
                err = ah_mac_digest(ahp, skb, ah->auth_data);
@@ -237,7 +237,7 @@ static int ah_init_state(struct xfrm_state *x)
        ahp->tfm = tfm;
        if (crypto_hash_setkey(tfm, ahp->key, ahp->key_len))
                goto error;
-       
+
        /*
         * Lookup the algorithm description maintained by xfrm_algo,
         * verify crypto transform properties, and store information
@@ -254,16 +254,16 @@ static int ah_init_state(struct xfrm_state *x)
                       aalg_desc->uinfo.auth.icv_fullbits/8);
                goto error;
        }
-       
+
        ahp->icv_full_len = aalg_desc->uinfo.auth.icv_fullbits/8;
        ahp->icv_trunc_len = aalg_desc->uinfo.auth.icv_truncbits/8;
-       
+
        BUG_ON(ahp->icv_trunc_len > MAX_AH_AUTH_LEN);
-       
+
        ahp->work_icv = kmalloc(ahp->icv_full_len, GFP_KERNEL);
        if (!ahp->work_icv)
                goto error;
-       
+
        x->props.header_len = XFRM_ALIGN8(sizeof(struct ip_auth_hdr) + ahp->icv_trunc_len);
        if (x->props.mode == XFRM_MODE_TUNNEL)
                x->props.header_len += sizeof(struct iphdr);
index 3981e8be9ab8f34e5504815c1f4b130ec068ee14..1a3488a83f49363a7d5200f37d01371f81cfd938 100644 (file)
@@ -15,9 +15,9 @@
  * 2 of the License, or (at your option) any later version.
  *
  * Fixes:
- *             Alan Cox        :       Removed the Ethernet assumptions in 
+ *             Alan Cox        :       Removed the Ethernet assumptions in
  *                                     Florian's code
- *             Alan Cox        :       Fixed some small errors in the ARP 
+ *             Alan Cox        :       Fixed some small errors in the ARP
  *                                     logic
  *             Alan Cox        :       Allow >4K in /proc
  *             Alan Cox        :       Make ARP add its own protocol entry
  *             Jonathan Naylor :       Only lookup the hardware address for
  *                                     the correct hardware type.
  *             Germano Caronni :       Assorted subtle races.
- *             Craig Schlenter :       Don't modify permanent entry 
+ *             Craig Schlenter :       Don't modify permanent entry
  *                                     during arp_rcv.
  *             Russ Nelson     :       Tidied up a few bits.
  *             Alexey Kuznetsov:       Major changes to caching and behaviour,
- *                                     eg intelligent arp probing and 
+ *                                     eg intelligent arp probing and
  *                                     generation
  *                                     of host down events.
  *             Alan Cox        :       Missing unlock in device events.
  *             Eckes           :       ARP ioctl control errors.
  *             Alexey Kuznetsov:       Arp free fix.
  *             Manuel Rodriguez:       Gratuitous ARP.
- *              Jonathan Layes  :       Added arpd support through kerneld 
+ *              Jonathan Layes  :       Added arpd support through kerneld
  *                                      message queue (960314)
  *             Mike Shaver     :       /proc/sys/net/ipv4/arp_* support
  *             Mike McLagan    :       Routing by source
@@ -78,7 +78,6 @@
 #include <linux/types.h>
 #include <linux/string.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/capability.h>
 #include <linux/socket.h>
 #include <linux/sockios.h>
@@ -210,7 +209,7 @@ int arp_mc_map(__be32 addr, u8 *haddr, struct net_device *dev, int dir)
        case ARPHRD_FDDI:
        case ARPHRD_IEEE802:
                ip_eth_mc_map(addr, haddr);
-               return 0; 
+               return 0;
        case ARPHRD_IEEE802_TR:
                ip_tr_mc_map(addr, haddr);
                return 0;
@@ -288,7 +287,7 @@ static int arp_constructor(struct neighbour *neigh)
                switch (dev->type) {
                default:
                        break;
-               case ARPHRD_ROSE:       
+               case ARPHRD_ROSE:
 #if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
                case ARPHRD_AX25:
 #if defined(CONFIG_NETROM) || defined(CONFIG_NETROM_MODULE)
@@ -425,18 +424,18 @@ static int arp_filter(__be32 sip, __be32 tip, struct net_device *dev)
        struct flowi fl = { .nl_u = { .ip4_u = { .daddr = sip,
                                                 .saddr = tip } } };
        struct rtable *rt;
-       int flag = 0; 
+       int flag = 0;
        /*unsigned long now; */
 
-       if (ip_route_output_key(&rt, &fl) < 0) 
+       if (ip_route_output_key(&rt, &fl) < 0)
                return 1;
-       if (rt->u.dst.dev != dev) { 
+       if (rt->u.dst.dev != dev) {
                NET_INC_STATS_BH(LINUX_MIB_ARPFILTER);
                flag = 1;
-       } 
-       ip_rt_put(rt); 
-       return flag; 
-} 
+       }
+       ip_rt_put(rt);
+       return flag;
+}
 
 /* OBSOLETE FUNCTIONS */
 
@@ -490,7 +489,7 @@ int arp_find(unsigned char *haddr, struct sk_buff *skb)
                n->used = jiffies;
                if (n->nud_state&NUD_VALID || neigh_event_send(n, skb) == 0) {
                        read_lock_bh(&n->lock);
-                       memcpy(haddr, n->ha, dev->addr_len);
+                       memcpy(haddr, n->ha, dev->addr_len);
                        read_unlock_bh(&n->lock);
                        neigh_release(n);
                        return 0;
@@ -572,7 +571,7 @@ struct sk_buff *arp_create(int type, int ptype, __be32 dest_ip,
        /*
         *      Allocate a buffer
         */
-       
+
        skb = alloc_skb(sizeof(struct arphdr)+ 2*(dev->addr_len+4)
                                + LL_RESERVED_SPACE(dev), GFP_ATOMIC);
        if (skb == NULL)
@@ -685,7 +684,7 @@ void arp_send(int type, int ptype, __be32 dest_ip,
        /*
         *      No arp on this interface.
         */
-       
+
        if (dev->flags&IFF_NOARP)
                return;
 
@@ -725,7 +724,7 @@ static int arp_process(struct sk_buff *skb)
        arp = skb->nh.arph;
 
        switch (dev_type) {
-       default:        
+       default:
                if (arp->ar_pro != htons(ETH_P_IP) ||
                    htons(dev_type) != arp->ar_hrd)
                        goto out;
@@ -792,7 +791,7 @@ static int arp_process(struct sk_buff *skb)
        tha     = arp_ptr;
        arp_ptr += dev->addr_len;
        memcpy(&tip, arp_ptr, 4);
-/* 
+/*
  *     Check for bad requests for 127.x.x.x and requests for multicast
  *     addresses.  If this is one such, delete it.
  */
@@ -809,16 +808,16 @@ static int arp_process(struct sk_buff *skb)
  *  Process entry.  The idea here is we want to send a reply if it is a
  *  request for us or if it is a request for someone else that we hold
  *  a proxy for.  We want to add an entry to our cache if it is a reply
- *  to us or if it is a request for our address.  
- *  (The assumption for this last is that if someone is requesting our 
- *  address, they are probably intending to talk to us, so it saves time 
- *  if we cache their address.  Their address is also probably not in 
+ *  to us or if it is a request for our address.
+ *  (The assumption for this last is that if someone is requesting our
+ *  address, they are probably intending to talk to us, so it saves time
+ *  if we cache their address.  Their address is also probably not in
  *  our cache, since ours is not in their cache.)
- * 
+ *
  *  Putting this another way, we only care about replies if they are to
  *  us, in which case we add them to the cache.  For requests, we care
  *  about those for us and those for our proxies.  We reply to both,
- *  and in the case of requests for us we add the requester to the arp 
+ *  and in the case of requests for us we add the requester to the arp
  *  cache.
  */
 
@@ -845,7 +844,7 @@ static int arp_process(struct sk_buff *skb)
                                if (!dont_send)
                                        dont_send |= arp_ignore(in_dev,dev,sip,tip);
                                if (!dont_send && IN_DEV_ARPFILTER(in_dev))
-                                       dont_send |= arp_filter(sip,tip,dev); 
+                                       dont_send |= arp_filter(sip,tip,dev);
                                if (!dont_send)
                                        arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha);
 
@@ -860,7 +859,7 @@ static int arp_process(struct sk_buff *skb)
                                if (n)
                                        neigh_release(n);
 
-                               if (NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED || 
+                               if (NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED ||
                                    skb->pkt_type == PACKET_HOST ||
                                    in_dev->arp_parms->proxy_delay == 0) {
                                        arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha);
@@ -1039,7 +1038,7 @@ static int arp_req_set(struct arpreq *r, struct net_device * dev)
                if (r->arp_flags & ATF_PERM)
                        state = NUD_PERMANENT;
                err = neigh_update(neigh, (r->arp_flags&ATF_COM) ?
-                                  r->arp_ha.sa_data : NULL, state, 
+                                  r->arp_ha.sa_data : NULL, state,
                                   NEIGH_UPDATE_F_OVERRIDE|
                                   NEIGH_UPDATE_F_ADMIN);
                neigh_release(neigh);
@@ -1121,7 +1120,7 @@ static int arp_req_delete(struct arpreq *r, struct net_device * dev)
        neigh = neigh_lookup(&arp_tbl, &ip, dev);
        if (neigh) {
                if (neigh->nud_state&~NUD_NOARP)
-                       err = neigh_update(neigh, NULL, NUD_FAILED, 
+                       err = neigh_update(neigh, NULL, NUD_FAILED,
                                           NEIGH_UPDATE_F_OVERRIDE|
                                           NEIGH_UPDATE_F_ADMIN);
                neigh_release(neigh);
@@ -1181,7 +1180,7 @@ int arp_ioctl(unsigned int cmd, void __user *arg)
 
        switch(cmd) {
        case SIOCDARP:
-               err = arp_req_delete(&r, dev);
+               err = arp_req_delete(&r, dev);
                break;
        case SIOCSARP:
                err = arp_req_set(&r, dev);
@@ -1268,14 +1267,14 @@ static char *ax2asc2(ax25_address *a, char *buf)
 
                if (c != ' ') *s++ = c;
        }
-       
+
        *s++ = '-';
 
        if ((n = ((a->ax25_call[6] >> 1) & 0x0F)) > 9) {
                *s++ = '1';
                n -= 10;
        }
-       
+
        *s++ = n + '0';
        *s++ = '\0';
 
@@ -1373,7 +1372,7 @@ static int arp_seq_open(struct inode *inode, struct file *file)
        struct seq_file *seq;
        int rc = -ENOMEM;
        struct neigh_seq_state *s = kzalloc(sizeof(*s), GFP_KERNEL);
-       
+
        if (!s)
                goto out;
 
@@ -1390,7 +1389,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations arp_seq_fops = {
+static const struct file_operations arp_seq_fops = {
        .owner          = THIS_MODULE,
        .open           = arp_seq_open,
        .read           = seq_read,
index 0072d79f0c2a0018cad97f12930cf8b4adde5b78..dd02a45d0f675945c8c85799ac99b4fbea4c9c04 100644 (file)
@@ -29,12 +29,12 @@ int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
        int oif;
        int err;
 
-       
-       if (addr_len < sizeof(*usin)) 
-               return -EINVAL;
 
-       if (usin->sin_family != AF_INET) 
-               return -EAFNOSUPPORT;
+       if (addr_len < sizeof(*usin))
+               return -EINVAL;
+
+       if (usin->sin_family != AF_INET)
+               return -EAFNOSUPPORT;
 
        sk_dst_reset(sk);
 
@@ -56,8 +56,8 @@ int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
                ip_rt_put(rt);
                return -EACCES;
        }
-       if (!inet->saddr)
-               inet->saddr = rt->rt_src;       /* Update source address */
+       if (!inet->saddr)
+               inet->saddr = rt->rt_src;       /* Update source address */
        if (!inet->rcv_saddr)
                inet->rcv_saddr = rt->rt_src;
        inet->daddr = rt->rt_dst;
index c40203640966f6a95b17281ba14a38d547ba2864..8a0ec10a13a7370b536a63a20b6c6a4c0fd431c4 100644 (file)
@@ -35,7 +35,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
@@ -252,7 +251,7 @@ static void __inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
 
        ASSERT_RTNL();
 
-       /* 1. Deleting primary ifaddr forces deletion all secondaries 
+       /* 1. Deleting primary ifaddr forces deletion all secondaries
         * unless alias promotion is set
         **/
 
@@ -260,7 +259,7 @@ static void __inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap,
                struct in_ifaddr **ifap1 = &ifa1->ifa_next;
 
                while ((ifa = *ifap1) != NULL) {
-                       if (!(ifa->ifa_flags & IFA_F_SECONDARY) && 
+                       if (!(ifa->ifa_flags & IFA_F_SECONDARY) &&
                            ifa1->ifa_scope <= ifa->ifa_scope)
                                last_prim = ifa;
 
@@ -583,8 +582,8 @@ static __inline__ int inet_abc_len(__be32 addr)
 {
        int rc = -1;    /* Something else, probably a multicast. */
 
-       if (ZERONET(addr))
-               rc = 0;
+       if (ZERONET(addr))
+               rc = 0;
        else {
                __u32 haddr = ntohl(addr);
 
@@ -596,7 +595,7 @@ static __inline__ int inet_abc_len(__be32 addr)
                        rc = 24;
        }
 
-       return rc;
+       return rc;
 }
 
 
@@ -1020,29 +1019,29 @@ int unregister_inetaddr_notifier(struct notifier_block *nb)
  * alias numbering and to create unique labels if possible.
 */
 static void inetdev_changename(struct net_device *dev, struct in_device *in_dev)
-{ 
+{
        struct in_ifaddr *ifa;
        int named = 0;
 
-       for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) { 
-               char old[IFNAMSIZ], *dot; 
+       for (ifa = in_dev->ifa_list; ifa; ifa = ifa->ifa_next) {
+               char old[IFNAMSIZ], *dot;
 
                memcpy(old, ifa->ifa_label, IFNAMSIZ);
-               memcpy(ifa->ifa_label, dev->name, IFNAMSIZ); 
+               memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
                if (named++ == 0)
                        continue;
                dot = strchr(ifa->ifa_label, ':');
-               if (dot == NULL) { 
-                       sprintf(old, ":%d", named); 
+               if (dot == NULL) {
+                       sprintf(old, ":%d", named);
                        dot = old;
                }
-               if (strlen(dot) + strlen(dev->name) < IFNAMSIZ) { 
-                       strcat(ifa->ifa_label, dot); 
-               } else { 
-                       strcpy(ifa->ifa_label + (IFNAMSIZ - strlen(dot) - 1), dot); 
-               } 
-       }       
-} 
+               if (strlen(dot) + strlen(dev->name) < IFNAMSIZ) {
+                       strcat(ifa->ifa_label, dot);
+               } else {
+                       strcpy(ifa->ifa_label + (IFNAMSIZ - strlen(dot) - 1), dot);
+               }
+       }
+}
 
 /* Called only under RTNL semaphore */
 
@@ -1539,7 +1538,7 @@ static struct devinet_sysctl_table {
                },
        },
        .devinet_conf_dir = {
-               {
+               {
                        .ctl_name       = NET_IPV4_CONF,
                        .procname       = "conf",
                        .mode           = 0555,
@@ -1577,37 +1576,32 @@ static void devinet_sysctl_register(struct in_device *in_dev,
                return;
        for (i = 0; i < ARRAY_SIZE(t->devinet_vars) - 1; i++) {
                t->devinet_vars[i].data += (char *)p - (char *)&ipv4_devconf;
-               t->devinet_vars[i].de = NULL;
        }
 
        if (dev) {
-               dev_name = dev->name; 
+               dev_name = dev->name;
                t->devinet_dev[0].ctl_name = dev->ifindex;
        } else {
                dev_name = "default";
                t->devinet_dev[0].ctl_name = NET_PROTO_CONF_DEFAULT;
        }
 
-       /* 
-        * Make a copy of dev_name, because '.procname' is regarded as const 
+       /*
+        * Make a copy of dev_name, because '.procname' is regarded as const
         * by sysctl and we wouldn't want anyone to change it under our feet
         * (see SIOCSIFNAME).
-        */     
+        */
        dev_name = kstrdup(dev_name, GFP_KERNEL);
        if (!dev_name)
            goto free;
 
        t->devinet_dev[0].procname    = dev_name;
        t->devinet_dev[0].child       = t->devinet_vars;
-       t->devinet_dev[0].de          = NULL;
        t->devinet_conf_dir[0].child  = t->devinet_dev;
-       t->devinet_conf_dir[0].de     = NULL;
        t->devinet_proto_dir[0].child = t->devinet_conf_dir;
-       t->devinet_proto_dir[0].de    = NULL;
        t->devinet_root_dir[0].child  = t->devinet_proto_dir;
-       t->devinet_root_dir[0].de     = NULL;
 
-       t->sysctl_header = register_sysctl_table(t->devinet_root_dir, 0);
+       t->sysctl_header = register_sysctl_table(t->devinet_root_dir);
        if (!t->sysctl_header)
            goto free_procname;
 
@@ -1641,7 +1635,7 @@ void __init devinet_init(void)
        rtnetlink_links[PF_INET] = inet_rtnetlink_table;
 #ifdef CONFIG_SYSCTL
        devinet_sysctl.sysctl_header =
-               register_sysctl_table(devinet_sysctl.devinet_root_dir, 0);
+               register_sysctl_table(devinet_sysctl.devinet_root_dir);
        devinet_sysctl_register(NULL, &ipv4_devconf_dflt);
 #endif
 }
index f2c6776ea0e6e0a8165ff7132f39194d4975a913..31041127eeb8006bb8729fbf769b56ffb1583e9e 100644 (file)
@@ -215,7 +215,7 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb)
        if (padlen+2 >= elen)
                goto out;
 
-       /* ... check padding bits here. Silly. :-) */ 
+       /* ... check padding bits here. Silly. :-) */
 
        iph = skb->nh.iph;
        ihl = iph->ihl * 4;
@@ -236,7 +236,7 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb)
 
                        ipaddr.a4 = iph->saddr;
                        km_new_mapping(x, &ipaddr, uh->source);
-                               
+
                        /* XXX: perhaps add an extra
                         * policy check here, to see
                         * if we should allow or
@@ -245,7 +245,7 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb)
                         * address/port.
                         */
                }
-       
+
                /*
                 * 2) ignore UDP/TCP checksums in case
                 *    of NAT-T in Transport Mode, or
@@ -284,7 +284,7 @@ static u32 esp4_get_max_size(struct xfrm_state *x, int mtu)
                mtu = ALIGN(mtu + 2, 4) + blksize - 4;
                break;
        case XFRM_MODE_BEET:
-               /* The worst case. */
+               /* The worst case. */
                enclen = IPV4_BEET_PHMAXLEN;
                mtu = ALIGN(mtu + enclen + 2, blksize);
                break;
index d47b72af89edeb4a9f506d4f919117de5517d2ae..1fba6439fc576c9a892af95e5f68f56168cc40c0 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/capability.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/string.h>
 #include <linux/socket.h>
@@ -160,7 +159,7 @@ unsigned inet_addr_type(__be32 addr)
 #ifdef CONFIG_IP_MULTIPLE_TABLES
        res.r = NULL;
 #endif
-       
+
        if (ip_fib_local_table) {
                ret = RTN_UNICAST;
                if (!ip_fib_local_table->tb_lookup(ip_fib_local_table,
@@ -378,7 +377,7 @@ static int rtentry_to_fib_config(int cmd, struct rtentry *rt,
                int len = 0;
 
                mx = kzalloc(3 * nla_total_size(4), GFP_KERNEL);
-               if (mx == NULL)
+               if (mx == NULL)
                        return -ENOMEM;
 
                if (rt->rt_flags & RTF_MTU)
@@ -400,7 +399,7 @@ static int rtentry_to_fib_config(int cmd, struct rtentry *rt,
 /*
  *     Handle IP routing ioctl calls. These are used to manipulate the routing tables
  */
+
 int ip_rt_ioctl(unsigned int cmd, void __user *arg)
 {
        struct fib_config cfg;
@@ -600,7 +599,7 @@ int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb)
                                goto next;
                        if (dumped)
                                memset(&cb->args[2], 0, sizeof(cb->args) -
-                                                2 * sizeof(cb->args[0]));
+                                                2 * sizeof(cb->args[0]));
                        if (tb->tb_dump(tb, skb, cb) < 0)
                                goto out;
                        dumped = 1;
@@ -766,7 +765,7 @@ static void fib_del_ifaddr(struct in_ifaddr *ifa)
 
 static void nl_fib_lookup(struct fib_result_nl *frn, struct fib_table *tb )
 {
-       
+
        struct fib_result       res;
        struct flowi            fl = { .mark = frn->fl_mark,
                                       .nl_u = { .ip4_u = { .daddr = frn->fl_addr,
@@ -791,11 +790,11 @@ static void nl_fib_lookup(struct fib_result_nl *frn, struct fib_table *tb )
 static void nl_fib_input(struct sock *sk, int len)
 {
        struct sk_buff *skb = NULL;
-        struct nlmsghdr *nlh = NULL;
+       struct nlmsghdr *nlh = NULL;
        struct fib_result_nl *frn;
-       u32 pid;     
+       u32 pid;
        struct fib_table *tb;
-       
+
        skb = skb_dequeue(&sk->sk_receive_queue);
        nlh = (struct nlmsghdr *)skb->data;
        if (skb->len < NLMSG_SPACE(0) || skb->len < nlh->nlmsg_len ||
@@ -803,17 +802,17 @@ static void nl_fib_input(struct sock *sk, int len)
                kfree_skb(skb);
                return;
        }
-       
+
        frn = (struct fib_result_nl *) NLMSG_DATA(nlh);
        tb = fib_get_table(frn->tb_id_in);
 
        nl_fib_lookup(frn, tb);
-       
+
        pid = nlh->nlmsg_pid;           /*pid of sending process */
        NETLINK_CB(skb).pid = 0;         /* from kernel */
        NETLINK_CB(skb).dst_group = 0;  /* unicast */
        netlink_unicast(sk, skb, pid, MSG_DONTWAIT);
-}    
+}
 
 static void nl_fib_lookup_init(void)
 {
index 648f47c1c399e262c86cfc22588ff257a5babcd5..a4949f957ab5cbecf9f6b1b79685112bd82ff6b0 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/string.h>
 #include <linux/socket.h>
@@ -146,7 +145,7 @@ static void fn_rehash_zone(struct fn_zone *fz)
        struct hlist_head *ht, *old_ht;
        int old_divisor, new_divisor;
        u32 new_hashmask;
-               
+
        old_divisor = fz->fz_divisor;
 
        switch (old_divisor) {
@@ -911,7 +910,7 @@ static struct fib_alias *fib_get_next(struct seq_file *seq)
 
                if (!iter->zone)
                        goto out;
-               
+
                iter->bucket = 0;
                iter->hash_head = iter->zone->fz_hash;
 
@@ -932,7 +931,7 @@ static struct fib_alias *fib_get_idx(struct seq_file *seq, loff_t pos)
 {
        struct fib_iter_state *iter = seq->private;
        struct fib_alias *fa;
-       
+
        if (iter->valid && pos >= iter->pos && iter->genid == fib_hash_genid) {
                fa   = iter->fa;
                pos -= iter->pos;
@@ -981,7 +980,7 @@ static unsigned fib_flag_trans(int type, __be32 mask, struct fib_info *fi)
        return flags;
 }
 
-/* 
+/*
  *     This outputs /proc/net/route.
  *
  *     It always works in backward compatibility mode.
@@ -1040,7 +1039,7 @@ static int fib_seq_open(struct inode *inode, struct file *file)
        struct seq_file *seq;
        int rc = -ENOMEM;
        struct fib_iter_state *s = kzalloc(sizeof(*s), GFP_KERNEL);
-       
+
        if (!s)
                goto out;
 
@@ -1057,7 +1056,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations fib_seq_fops = {
+static const struct file_operations fib_seq_fops = {
        .owner          = THIS_MODULE,
        .open           = fib_seq_open,
        .read           = seq_read,
index be1028c9933e66f2e89c871eff7e7cf9009fdf27..2f1fdae6efa6df82489b850fe93e227c230dcc09 100644 (file)
@@ -85,12 +85,12 @@ for (nhsel=0; nhsel < 1; nhsel++)
 #define endfor_nexthops(fi) }
 
 
-static const struct 
+static const struct
 {
        int     error;
        u8      scope;
 } fib_props[RTA_MAX + 1] = {
-        {
+       {
                .error  = 0,
                .scope  = RT_SCOPE_NOWHERE,
        },      /* RTN_UNSPEC */
@@ -439,7 +439,7 @@ int fib_nh_match(struct fib_config *cfg, struct fib_info *fi)
 
        rtnh = cfg->fc_mp;
        remaining = cfg->fc_mp_len;
-       
+
        for_nexthops(fi) {
                int attrlen;
 
@@ -508,9 +508,9 @@ int fib_nh_match(struct fib_config *cfg, struct fib_info *fi)
    Normally it looks as following.
 
    {universe prefix}  -> (gw, oif) [scope link]
-                          |
+                         |
                          |-> {link prefix} -> (gw, oif) [scope local]
-                                               |
+                                               |
                                                |-> {local prefix} (terminal node)
  */
 
@@ -864,7 +864,7 @@ err_inval:
        err = -EINVAL;
 
 failure:
-        if (fi) {
+       if (fi) {
                fi->fib_dead = 1;
                free_fib_info(fi);
        }
@@ -1049,7 +1049,7 @@ int fib_sync_down(__be32 local, struct net_device *dev, int force)
 {
        int ret = 0;
        int scope = RT_SCOPE_NOWHERE;
-       
+
        if (force)
                scope = -1;
 
index 1e589b91605efa36518f0abe338a7adc674bd38e..72b3036bbc09299ada84b297f4ef50b4de453dcb 100644 (file)
@@ -7,13 +7,13 @@
  *   Robert Olsson <robert.olsson@its.uu.se> Uppsala Universitet
  *     & Swedish University of Agricultural Sciences.
  *
- *   Jens Laas <jens.laas@data.slu.se> Swedish University of 
+ *   Jens Laas <jens.laas@data.slu.se> Swedish University of
  *     Agricultural Sciences.
- * 
+ *
  *   Hans Liss <hans.liss@its.uu.se>  Uppsala Universitet
  *
  * This work is based on the LPC-trie which is originally descibed in:
- * 
+ *
  * An experimental study of compression methods for dynamic tries
  * Stefan Nilsson and Matti Tikkanen. Algorithmica, 33(1):19-33, 2002.
  * http://www.nada.kth.se/~snilsson/public/papers/dyntrie2/
@@ -57,7 +57,6 @@
 #include <asm/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/string.h>
 #include <linux/socket.h>
@@ -224,34 +223,34 @@ static inline int tkey_mismatch(t_key a, int offset, t_key b)
 }
 
 /*
-  To understand this stuff, an understanding of keys and all their bits is 
-  necessary. Every node in the trie has a key associated with it, but not 
+  To understand this stuff, an understanding of keys and all their bits is
+  necessary. Every node in the trie has a key associated with it, but not
   all of the bits in that key are significant.
 
   Consider a node 'n' and its parent 'tp'.
 
-  If n is a leaf, every bit in its key is significant. Its presence is 
-  necessitated by path compression, since during a tree traversal (when 
-  searching for a leaf - unless we are doing an insertion) we will completely 
-  ignore all skipped bits we encounter. Thus we need to verify, at the end of 
-  a potentially successful search, that we have indeed been walking the 
+  If n is a leaf, every bit in its key is significant. Its presence is
+  necessitated by path compression, since during a tree traversal (when
+  searching for a leaf - unless we are doing an insertion) we will completely
+  ignore all skipped bits we encounter. Thus we need to verify, at the end of
+  a potentially successful search, that we have indeed been walking the
   correct key path.
 
-  Note that we can never "miss" the correct key in the tree if present by 
-  following the wrong path. Path compression ensures that segments of the key 
-  that are the same for all keys with a given prefix are skipped, but the 
-  skipped part *is* identical for each node in the subtrie below the skipped 
-  bit! trie_insert() in this implementation takes care of that - note the 
+  Note that we can never "miss" the correct key in the tree if present by
+  following the wrong path. Path compression ensures that segments of the key
+  that are the same for all keys with a given prefix are skipped, but the
+  skipped part *is* identical for each node in the subtrie below the skipped
+  bit! trie_insert() in this implementation takes care of that - note the
   call to tkey_sub_equals() in trie_insert().
 
-  if n is an internal node - a 'tnode' here, the various parts of its key 
+  if n is an internal node - a 'tnode' here, the various parts of its key
   have many different meanings.
 
-  Example:  
+  Example:
   _________________________________________________________________
   | i | i | i | i | i | i | i | N | N | N | S | S | S | S | S | C |
   -----------------------------------------------------------------
-    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15 
+    0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
 
   _________________________________________________________________
   | C | C | C | u | u | u | u | u | u | u | u | u | u | u | u | u |
@@ -263,23 +262,23 @@ static inline int tkey_mismatch(t_key a, int offset, t_key b)
   n->pos = 15
   n->bits = 4
 
-  First, let's just ignore the bits that come before the parent tp, that is 
-  the bits from 0 to (tp->pos-1). They are *known* but at this point we do 
+  First, let's just ignore the bits that come before the parent tp, that is
+  the bits from 0 to (tp->pos-1). They are *known* but at this point we do
   not use them for anything.
 
   The bits from (tp->pos) to (tp->pos + tp->bits - 1) - "N", above - are the
-  index into the parent's child array. That is, they will be used to find 
+  index into the parent's child array. That is, they will be used to find
   'n' among tp's children.
 
   The bits from (tp->pos + tp->bits) to (n->pos - 1) - "S" - are skipped bits
   for the node n.
 
-  All the bits we have seen so far are significant to the node n. The rest 
+  All the bits we have seen so far are significant to the node n. The rest
   of the bits are really not needed or indeed known in n->key.
 
-  The bits from (n->pos) to (n->pos + n->bits - 1) - "C" - are the index into 
+  The bits from (n->pos) to (n->pos + n->bits - 1) - "C" - are the index into
   n's child array, and will of course be different for each child.
-  
+
 
   The rest of the bits, from (n->pos + n->bits) onward, are completely unknown
   at this point.
@@ -294,7 +293,7 @@ static inline void check_tnode(const struct tnode *tn)
 static int halve_threshold = 25;
 static int inflate_threshold = 50;
 static int halve_threshold_root = 15;
-static int inflate_threshold_root = 25; 
+static int inflate_threshold_root = 25;
 
 
 static void __alias_free_mem(struct rcu_head *head)
@@ -355,7 +354,7 @@ static inline void tnode_free(struct tnode *tn)
                struct leaf *l = (struct leaf *) tn;
                call_rcu_bh(&l->rcu, __leaf_free_rcu);
        }
-        else
+       else
                call_rcu(&tn->rcu, __tnode_free_rcu);
 }
 
@@ -461,7 +460,7 @@ static struct node *resize(struct trie *t, struct tnode *tn)
        int inflate_threshold_use;
        int halve_threshold_use;
 
-       if (!tn)
+       if (!tn)
                return NULL;
 
        pr_debug("In tnode_resize %p inflate_threshold=%d threshold=%d\n",
@@ -556,7 +555,7 @@ static struct node *resize(struct trie *t, struct tnode *tn)
 
        if(!tn->parent)
                inflate_threshold_use = inflate_threshold_root;
-       else 
+       else
                inflate_threshold_use = inflate_threshold;
 
        err = 0;
@@ -587,7 +586,7 @@ static struct node *resize(struct trie *t, struct tnode *tn)
 
        if(!tn->parent)
                halve_threshold_use = halve_threshold_root;
-       else 
+       else
                halve_threshold_use = halve_threshold;
 
        err = 0;
@@ -665,10 +664,10 @@ static struct tnode *inflate(struct trie *t, struct tnode *tn)
                        right = tnode_new(inode->key|m, inode->pos + 1,
                                          inode->bits - 1);
 
-                        if (!right) {
+                       if (!right) {
                                tnode_free(left);
                                goto nomem;
-                        }
+                       }
 
                        put_child(t, tn, 2*i, (struct node *) left);
                        put_child(t, tn, 2*i+1, (struct node *) right);
@@ -890,23 +889,23 @@ static inline struct list_head * get_fa_head(struct leaf *l, int plen)
 
 static void insert_leaf_info(struct hlist_head *head, struct leaf_info *new)
 {
-        struct leaf_info *li = NULL, *last = NULL;
-        struct hlist_node *node;
+       struct leaf_info *li = NULL, *last = NULL;
+       struct hlist_node *node;
 
-        if (hlist_empty(head)) {
-                hlist_add_head_rcu(&new->hlist, head);
-        } else {
-                hlist_for_each_entry(li, node, head, hlist) {
-                        if (new->plen > li->plen)
-                                break;
+       if (hlist_empty(head)) {
+               hlist_add_head_rcu(&new->hlist, head);
+       } else {
+               hlist_for_each_entry(li, node, head, hlist) {
+                       if (new->plen > li->plen)
+                               break;
 
-                        last = li;
-                }
-                if (last)
-                        hlist_add_after_rcu(&last->hlist, &new->hlist);
-                else
-                        hlist_add_before_rcu(&new->hlist, &li->hlist);
-        }
+                       last = li;
+               }
+               if (last)
+                       hlist_add_after_rcu(&last->hlist, &new->hlist);
+               else
+                       hlist_add_before_rcu(&new->hlist, &li->hlist);
+       }
 }
 
 /* rcu_read_lock needs to be hold by caller from readside */
@@ -1700,7 +1699,7 @@ static struct leaf *nextleaf(struct trie *t, struct leaf *thisleaf)
                        /* Decend if tnode */
                        while (IS_TNODE(c)) {
                                p = (struct tnode *) c;
-                               idx = 0;
+                               idx = 0;
 
                                /* Rightmost non-NULL branch */
                                if (p && IS_TNODE(p))
@@ -2173,7 +2172,7 @@ static int fib_triestat_seq_open(struct inode *inode, struct file *file)
        return single_open(file, fib_triestat_seq_show, NULL);
 }
 
-static struct file_operations fib_triestat_fops = {
+static const struct file_operations fib_triestat_fops = {
        .owner  = THIS_MODULE,
        .open   = fib_triestat_seq_open,
        .read   = seq_read,
@@ -2303,9 +2302,9 @@ static int fib_trie_seq_show(struct seq_file *seq, void *v)
 
                seq_indent(seq, iter->depth-1);
                seq_printf(seq, "  +-- %d.%d.%d.%d/%d %d %d %d\n",
-                          NIPQUAD(prf), tn->pos, tn->bits, tn->full_children, 
+                          NIPQUAD(prf), tn->pos, tn->bits, tn->full_children,
                           tn->empty_children);
-               
+
        } else {
                struct leaf *l = (struct leaf *) n;
                int i;
@@ -2364,7 +2363,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations fib_trie_fops = {
+static const struct file_operations fib_trie_fops = {
        .owner  = THIS_MODULE,
        .open   = fib_trie_seq_open,
        .read   = seq_read,
@@ -2485,7 +2484,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations fib_route_fops = {
+static const struct file_operations fib_route_fops = {
        .owner  = THIS_MODULE,
        .open   = fib_route_seq_open,
        .read   = seq_read,
index 40cf0d0e1b83c21d4f2ba675aea2b764ab027550..4b7a0d946a0d2a78a17220902d5a52c84d8c7ece 100644 (file)
@@ -304,7 +304,7 @@ static inline int icmpv4_xrlim_allow(struct rtable *rt, int type, int code)
 
        /* No rate limit on loopback */
        if (dst->dev && (dst->dev->flags&IFF_LOOPBACK))
-               goto out;
+               goto out;
 
        /* Limit if icmp type is enabled in ratemask. */
        if ((1 << type) & sysctl_icmp_ratemask)
@@ -350,9 +350,9 @@ static void icmp_push_reply(struct icmp_bxm *icmp_param,
        struct sk_buff *skb;
 
        if (ip_append_data(icmp_socket->sk, icmp_glue_bits, icmp_param,
-                          icmp_param->data_len+icmp_param->head_len,
-                          icmp_param->head_len,
-                          ipc, rt, MSG_DONTWAIT) < 0)
+                          icmp_param->data_len+icmp_param->head_len,
+                          icmp_param->head_len,
+                          ipc, rt, MSG_DONTWAIT) < 0)
                ip_flush_pending_frames(icmp_socket->sk);
        else if ((skb = skb_peek(&icmp_socket->sk->sk_write_queue)) != NULL) {
                struct icmphdr *icmph = skb->h.icmph;
@@ -755,7 +755,7 @@ static void icmp_redirect(struct sk_buff *skb)
                               skb->h.icmph->un.gateway,
                               iph->saddr, skb->dev);
                break;
-       }
+       }
 out:
        return;
 out_err:
@@ -959,7 +959,7 @@ int icmp_rcv(struct sk_buff *skb)
         *      Parse the ICMP message
         */
 
-       if (rt->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST)) {
+       if (rt->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST)) {
                /*
                 *      RFC 1122: 3.2.2.6 An ICMP_ECHO to broadcast MAY be
                 *        silently ignored (we let user decide with a sysctl).
@@ -976,7 +976,7 @@ int icmp_rcv(struct sk_buff *skb)
                    icmph->type != ICMP_ADDRESS &&
                    icmph->type != ICMP_ADDRESSREPLY) {
                        goto error;
-               }
+               }
        }
 
        ICMP_INC_STATS_BH(icmp_pointers[icmph->type].input_entry);
@@ -1085,7 +1085,7 @@ static const struct icmp_control icmp_pointers[NR_ICMP_TYPES + 1] = {
                .input_entry = ICMP_MIB_DUMMY,
                .handler = icmp_discard,
        },
-       [ICMP_INFO_REPLY] = {
+       [ICMP_INFO_REPLY] = {
                .output_entry = ICMP_MIB_DUMMY,
                .input_entry = ICMP_MIB_DUMMY,
                .handler = icmp_discard,
index 024ae56cab256b34b379d482ab9659600135b90a..063721302ebf24faef796999f3aea0728950c116 100644 (file)
@@ -35,7 +35,7 @@
  *
  *             Chih-Jen Chang  :       Tried to revise IGMP to Version 2
  *             Tsu-Sheng Tsao          E-mail: chihjenc@scf.usc.edu and tsusheng@scf.usc.edu
- *                                     The enhancements are mainly based on Steve Deering's 
+ *                                     The enhancements are mainly based on Steve Deering's
  *                                     ipmulti-3.5 source code.
  *             Chih-Jen Chang  :       Added the igmp_get_mrouter_info and
  *             Tsu-Sheng Tsao          igmp_set_mrouter_info to keep track of
  *             Alan Cox        :       Stop IGMP from 0.0.0.0 being accepted.
  *             Alan Cox        :       Use GFP_ATOMIC in the right places.
  *             Christian Daudt :       igmp timer wasn't set for local group
- *                                     memberships but was being deleted, 
- *                                     which caused a "del_timer() called 
+ *                                     memberships but was being deleted,
+ *                                     which caused a "del_timer() called
  *                                     from %p with timer not initialized\n"
  *                                     message (960131).
- *             Christian Daudt :       removed del_timer from 
+ *             Christian Daudt :       removed del_timer from
  *                                     igmp_timer_expire function (960205).
  *             Christian Daudt :       igmp_heard_report now only calls
  *                                     igmp_timer_expire if tm->running is
@@ -718,7 +718,7 @@ static void igmp_ifc_event(struct in_device *in_dev)
 {
        if (IGMP_V1_SEEN(in_dev) || IGMP_V2_SEEN(in_dev))
                return;
-       in_dev->mr_ifc_count = in_dev->mr_qrv ? in_dev->mr_qrv : 
+       in_dev->mr_ifc_count = in_dev->mr_qrv ? in_dev->mr_qrv :
                IGMP_Unsolicited_Report_Count;
        igmp_ifc_start_timer(in_dev, 1);
 }
@@ -838,7 +838,7 @@ static void igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,
        if (len == 8) {
                if (ih->code == 0) {
                        /* Alas, old v1 router presents here. */
-       
+
                        max_delay = IGMP_Query_Response_Interval;
                        in_dev->mr_v1_seen = jiffies +
                                IGMP_V1_Router_Present_Timeout;
@@ -860,10 +860,10 @@ static void igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,
        } else { /* v3 */
                if (!pskb_may_pull(skb, sizeof(struct igmpv3_query)))
                        return;
-               
+
                ih3 = (struct igmpv3_query *) skb->h.raw;
                if (ih3->nsrcs) {
-                       if (!pskb_may_pull(skb, sizeof(struct igmpv3_query) 
+                       if (!pskb_may_pull(skb, sizeof(struct igmpv3_query)
                                           + ntohs(ih3->nsrcs)*sizeof(__be32)))
                                return;
                        ih3 = (struct igmpv3_query *) skb->h.raw;
@@ -909,7 +909,7 @@ static void igmp_heard_query(struct in_device *in_dev, struct sk_buff *skb,
                else
                        im->gsquery = mark;
                changed = !im->gsquery ||
-                       igmp_marksources(im, ntohs(ih3->nsrcs), ih3->srcs);
+                       igmp_marksources(im, ntohs(ih3->nsrcs), ih3->srcs);
                spin_unlock_bh(&im->lock);
                if (changed)
                        igmp_mod_timer(im, max_delay);
@@ -1257,9 +1257,9 @@ out:
 void ip_mc_dec_group(struct in_device *in_dev, __be32 addr)
 {
        struct ip_mc_list *i, **ip;
-       
+
        ASSERT_RTNL();
-       
+
        for (ip=&in_dev->mc_list; (i=*ip)!=NULL; ip=&i->next) {
                if (i->multiaddr==addr) {
                        if (--i->users == 0) {
@@ -1436,7 +1436,7 @@ static int ip_mc_del1_src(struct ip_mc_list *pmc, int sfmode,
 #ifdef CONFIG_IP_MULTICAST
                if (psf->sf_oldin &&
                    !IGMP_V1_SEEN(in_dev) && !IGMP_V2_SEEN(in_dev)) {
-                       psf->sf_crcount = in_dev->mr_qrv ? in_dev->mr_qrv : 
+                       psf->sf_crcount = in_dev->mr_qrv ? in_dev->mr_qrv :
                                IGMP_Unsolicited_Report_Count;
                        psf->sf_next = pmc->tomb;
                        pmc->tomb = psf;
@@ -1500,7 +1500,7 @@ static int ip_mc_del_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
                /* filter mode change */
                pmc->sfmode = MCAST_INCLUDE;
 #ifdef CONFIG_IP_MULTICAST
-               pmc->crcount = in_dev->mr_qrv ? in_dev->mr_qrv : 
+               pmc->crcount = in_dev->mr_qrv ? in_dev->mr_qrv :
                        IGMP_Unsolicited_Report_Count;
                in_dev->mr_ifc_count = pmc->crcount;
                for (psf=pmc->sources; psf; psf = psf->sf_next)
@@ -1679,7 +1679,7 @@ static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
 #ifdef CONFIG_IP_MULTICAST
                /* else no filters; keep old mode for reports */
 
-               pmc->crcount = in_dev->mr_qrv ? in_dev->mr_qrv : 
+               pmc->crcount = in_dev->mr_qrv ? in_dev->mr_qrv :
                        IGMP_Unsolicited_Report_Count;
                in_dev->mr_ifc_count = pmc->crcount;
                for (psf=pmc->sources; psf; psf = psf->sf_next)
@@ -1873,7 +1873,7 @@ int ip_mc_source(int add, int omode, struct sock *sk, struct
        } else if (pmc->sfmode != omode) {
                /* allow mode switches for empty-set filters */
                ip_mc_add_src(in_dev, &mreqs->imr_multiaddr, omode, 0, NULL, 0);
-               ip_mc_del_src(in_dev, &mreqs->imr_multiaddr, pmc->sfmode, 0, 
+               ip_mc_del_src(in_dev, &mreqs->imr_multiaddr, pmc->sfmode, 0,
                        NULL, 0);
                pmc->sfmode = omode;
        }
@@ -1899,7 +1899,7 @@ int ip_mc_source(int add, int omode, struct sock *sk, struct
                }
 
                /* update the interface filter */
-               ip_mc_del_src(in_dev, &mreqs->imr_multiaddr, omode, 1, 
+               ip_mc_del_src(in_dev, &mreqs->imr_multiaddr, omode, 1,
                        &mreqs->imr_sourceaddr, 1);
 
                for (j=i+1; j<psl->sl_count; j++)
@@ -1949,7 +1949,7 @@ int ip_mc_source(int add, int omode, struct sock *sk, struct
        psl->sl_count++;
        err = 0;
        /* update the interface list */
-       ip_mc_add_src(in_dev, &mreqs->imr_multiaddr, omode, 1, 
+       ip_mc_add_src(in_dev, &mreqs->imr_multiaddr, omode, 1,
                &mreqs->imr_sourceaddr, 1);
 done:
        rtnl_unlock();
@@ -2264,7 +2264,7 @@ static inline struct ip_mc_list *igmp_mc_get_first(struct seq_file *seq)
        struct igmp_mc_iter_state *state = igmp_mc_seq_private(seq);
 
        for (state->dev = dev_base, state->in_dev = NULL;
-            state->dev; 
+            state->dev;
             state->dev = state->dev->next) {
                struct in_device *in_dev;
                in_dev = in_dev_get(state->dev);
@@ -2346,7 +2346,7 @@ static void igmp_mc_seq_stop(struct seq_file *seq, void *v)
 static int igmp_mc_seq_show(struct seq_file *seq, void *v)
 {
        if (v == SEQ_START_TOKEN)
-               seq_puts(seq, 
+               seq_puts(seq,
                         "Idx\tDevice    : Count Querier\tGroup    Users Timer\tReporter\n");
        else {
                struct ip_mc_list *im = (struct ip_mc_list *)v;
@@ -2403,7 +2403,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations igmp_mc_seq_fops = {
+static const struct file_operations igmp_mc_seq_fops = {
        .owner          =       THIS_MODULE,
        .open           =       igmp_mc_seq_open,
        .read           =       seq_read,
@@ -2426,7 +2426,7 @@ static inline struct ip_sf_list *igmp_mcf_get_first(struct seq_file *seq)
        struct igmp_mcf_iter_state *state = igmp_mcf_seq_private(seq);
 
        for (state->dev = dev_base, state->idev = NULL, state->im = NULL;
-            state->dev; 
+            state->dev;
             state->dev = state->dev->next) {
                struct in_device *idev;
                idev = in_dev_get(state->dev);
@@ -2531,7 +2531,7 @@ static int igmp_mcf_seq_show(struct seq_file *seq, void *v)
        struct igmp_mcf_iter_state *state = igmp_mcf_seq_private(seq);
 
        if (v == SEQ_START_TOKEN) {
-               seq_printf(seq, 
+               seq_printf(seq,
                           "%3s %6s "
                           "%10s %10s %6s %6s\n", "Idx",
                           "Device", "MCA",
@@ -2539,8 +2539,8 @@ static int igmp_mcf_seq_show(struct seq_file *seq, void *v)
        } else {
                seq_printf(seq,
                           "%3d %6.6s 0x%08x "
-                          "0x%08x %6lu %6lu\n", 
-                          state->dev->ifindex, state->dev->name, 
+                          "0x%08x %6lu %6lu\n",
+                          state->dev->ifindex, state->dev->name,
                           ntohl(state->im->multiaddr),
                           ntohl(psf->sf_inaddr),
                           psf->sf_count[MCAST_INCLUDE],
@@ -2577,7 +2577,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations igmp_mcf_seq_fops = {
+static const struct file_operations igmp_mcf_seq_fops = {
        .owner          =       THIS_MODULE,
        .open           =       igmp_mcf_seq_open,
        .read           =       seq_read,
index 9d68837888d376d186e76d4eedf839d4ebb1bc29..43fb1600f1f03904846bc3d53a98c73e0f729a61 100644 (file)
@@ -149,7 +149,7 @@ success:
        if (!inet_csk(sk)->icsk_bind_hash)
                inet_bind_hash(sk, tb, snum);
        BUG_TRAP(inet_csk(sk)->icsk_bind_hash == tb);
-       ret = 0;
+       ret = 0;
 
 fail_unlock:
        spin_unlock(&head->lock);
@@ -255,7 +255,7 @@ EXPORT_SYMBOL(inet_csk_accept);
 
 /*
  * Using different timers for retransmit, delayed acks and probes
- * We may wish use just one timer maintaining a list of expire jiffies 
+ * We may wish use just one timer maintaining a list of expire jiffies
  * to optimize.
  */
 void inet_csk_init_xmit_timers(struct sock *sk,
@@ -273,7 +273,7 @@ void inet_csk_init_xmit_timers(struct sock *sk,
        icsk->icsk_delack_timer.function     = delack_handler;
        sk->sk_timer.function                = keepalive_handler;
 
-       icsk->icsk_retransmit_timer.data = 
+       icsk->icsk_retransmit_timer.data =
                icsk->icsk_delack_timer.data =
                        sk->sk_timer.data  = (unsigned long)sk;
 
index 8aa7d51e6881494584110ee183016606b8c0ed9d..5df71cd08da811e65b354abb82ed9103664d0e73 100644 (file)
@@ -381,7 +381,7 @@ static int inet_diag_bc_run(const void *bc, int len,
                                if (addr[0] == 0 && addr[1] == 0 &&
                                    addr[2] == htonl(0xffff) &&
                                    bitstring_match(addr + 3, cond->addr,
-                                                   cond->prefix_len))
+                                                   cond->prefix_len))
                                        break;
                        }
                        yes = 0;
@@ -518,7 +518,7 @@ static int inet_twsk_diag_dump(struct inet_timewait_sock *tw,
                }
                entry.sport = tw->tw_num;
                entry.dport = ntohs(tw->tw_dport);
-               entry.userlocks = 0; 
+               entry.userlocks = 0;
 
                if (!inet_diag_bc_run(RTA_DATA(bc), RTA_PAYLOAD(bc), &entry))
                        return 0;
index 150ace18dc759562414565dacfb4c918214d28c4..fb662621c54ecf65a5812726859553b8e03a42d8 100644 (file)
@@ -262,7 +262,7 @@ not_unique:
 static inline u32 inet_sk_port_offset(const struct sock *sk)
 {
        const struct inet_sock *inet = inet_sk(sk);
-       return secure_ipv4_port_ephemeral(inet->rcv_saddr, inet->daddr, 
+       return secure_ipv4_port_ephemeral(inet->rcv_saddr, inet->daddr,
                                          inet->dport);
 }
 
@@ -274,81 +274,81 @@ int inet_hash_connect(struct inet_timewait_death_row *death_row,
 {
        struct inet_hashinfo *hinfo = death_row->hashinfo;
        const unsigned short snum = inet_sk(sk)->num;
-       struct inet_bind_hashbucket *head;
-       struct inet_bind_bucket *tb;
+       struct inet_bind_hashbucket *head;
+       struct inet_bind_bucket *tb;
        int ret;
 
-       if (!snum) {
-               int low = sysctl_local_port_range[0];
-               int high = sysctl_local_port_range[1];
+       if (!snum) {
+               int low = sysctl_local_port_range[0];
+               int high = sysctl_local_port_range[1];
                int range = high - low;
-               int i;
+               int i;
                int port;
                static u32 hint;
                u32 offset = hint + inet_sk_port_offset(sk);
                struct hlist_node *node;
-               struct inet_timewait_sock *tw = NULL;
+               struct inet_timewait_sock *tw = NULL;
 
-               local_bh_disable();
+               local_bh_disable();
                for (i = 1; i <= range; i++) {
                        port = low + (i + offset) % range;
-                       head = &hinfo->bhash[inet_bhashfn(port, hinfo->bhash_size)];
-                       spin_lock(&head->lock);
+                       head = &hinfo->bhash[inet_bhashfn(port, hinfo->bhash_size)];
+                       spin_lock(&head->lock);
 
-                       /* Does not bother with rcv_saddr checks,
-                        * because the established check is already
-                        * unique enough.
-                        */
+                       /* Does not bother with rcv_saddr checks,
+                        * because the established check is already
+                        * unique enough.
+                        */
                        inet_bind_bucket_for_each(tb, node, &head->chain) {
-                               if (tb->port == port) {
-                                       BUG_TRAP(!hlist_empty(&tb->owners));
-                                       if (tb->fastreuse >= 0)
-                                               goto next_port;
-                                       if (!__inet_check_established(death_row,
+                               if (tb->port == port) {
+                                       BUG_TRAP(!hlist_empty(&tb->owners));
+                                       if (tb->fastreuse >= 0)
+                                               goto next_port;
+                                       if (!__inet_check_established(death_row,
                                                                      sk, port,
                                                                      &tw))
-                                               goto ok;
-                                       goto next_port;
-                               }
-                       }
-
-                       tb = inet_bind_bucket_create(hinfo->bind_bucket_cachep, head, port);
-                       if (!tb) {
-                               spin_unlock(&head->lock);
-                               break;
-                       }
-                       tb->fastreuse = -1;
-                       goto ok;
-
-               next_port:
-                       spin_unlock(&head->lock);
-               }
-               local_bh_enable();
-
-               return -EADDRNOTAVAIL;
+                                               goto ok;
+                                       goto next_port;
+                               }
+                       }
+
+                       tb = inet_bind_bucket_create(hinfo->bind_bucket_cachep, head, port);
+                       if (!tb) {
+                               spin_unlock(&head->lock);
+                               break;
+                       }
+                       tb->fastreuse = -1;
+                       goto ok;
+
+               next_port:
+                       spin_unlock(&head->lock);
+               }
+               local_bh_enable();
+
+               return -EADDRNOTAVAIL;
 
 ok:
                hint += i;
 
-               /* Head lock still held and bh's disabled */
-               inet_bind_hash(sk, tb, port);
+               /* Head lock still held and bh's disabled */
+               inet_bind_hash(sk, tb, port);
                if (sk_unhashed(sk)) {
-                       inet_sk(sk)->sport = htons(port);
-                       __inet_hash(hinfo, sk, 0);
-               }
-               spin_unlock(&head->lock);
+                       inet_sk(sk)->sport = htons(port);
+                       __inet_hash(hinfo, sk, 0);
+               }
+               spin_unlock(&head->lock);
 
-               if (tw) {
-                       inet_twsk_deschedule(tw, death_row);
-                       inet_twsk_put(tw);
-               }
+               if (tw) {
+                       inet_twsk_deschedule(tw, death_row);
+                       inet_twsk_put(tw);
+               }
 
                ret = 0;
                goto out;
-       }
+       }
 
-       head = &hinfo->bhash[inet_bhashfn(snum, hinfo->bhash_size)];
-       tb  = inet_csk(sk)->icsk_bind_hash;
+       head = &hinfo->bhash[inet_bhashfn(snum, hinfo->bhash_size)];
+       tb  = inet_csk(sk)->icsk_bind_hash;
        spin_lock_bh(&head->lock);
        if (sk_head(&tb->owners) == sk && !sk->sk_bind_node.next) {
                __inet_hash(hinfo, sk, 0);
index 711eb6d0285a8a4709a8e89a9c1b88697dcce7ee..db3ef96bdfd96412c9b30d88e785a97a38aaf17b 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/interrupt.h>
 #include <linux/spinlock.h>
 #include <linux/random.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/time.h>
 #include <linux/kernel.h>
index a22d11d2911cd4f7772b2d6428a5d525c5cc2f59..369e721c4bab3cf0fd58e61b88f170ad891373cb 100644 (file)
@@ -4,15 +4,15 @@
  *             interface as the means of communication with the user level.
  *
  *             The IP forwarding functionality.
- *             
+ *
  * Version:    $Id: ip_forward.c,v 1.48 2000/12/13 18:31:48 davem Exp $
  *
  * Authors:    see ip.c
  *
  * Fixes:
- *             Many            :       Split from ip.c , see ip_input.c for 
+ *             Many            :       Split from ip.c , see ip_input.c for
  *                                     history.
- *             Dave Gregorich  :       NULL ip_rt_put fix for multicast 
+ *             Dave Gregorich  :       NULL ip_rt_put fix for multicast
  *                                     routing.
  *             Jos Vos         :       Add call_out_firewall before sending,
  *                                     use output device for accounting.
@@ -23,7 +23,6 @@
 
 #include <linux/types.h>
 #include <linux/mm.h>
-#include <linux/sched.h>
 #include <linux/skbuff.h>
 #include <linux/ip.h>
 #include <linux/icmp.h>
@@ -69,14 +68,14 @@ int ip_forward(struct sk_buff *skb)
                goto drop;
 
        skb->ip_summed = CHECKSUM_NONE;
-       
+
        /*
         *      According to the RFC, we must first decrease the TTL field. If
         *      that reaches zero, we must reply an ICMP control message telling
         *      that the packet's lifetime expired.
         */
        if (skb->nh.iph->ttl <= 1)
-                goto too_many_hops;
+               goto too_many_hops;
 
        if (!xfrm4_route_forward(skb))
                goto drop;
@@ -107,16 +106,16 @@ int ip_forward(struct sk_buff *skb)
                       ip_forward_finish);
 
 sr_failed:
-        /*
+       /*
         *      Strict routing permits no gatewaying
         */
-         icmp_send(skb, ICMP_DEST_UNREACH, ICMP_SR_FAILED, 0);
-         goto drop;
+        icmp_send(skb, ICMP_DEST_UNREACH, ICMP_SR_FAILED, 0);
+        goto drop;
 
 too_many_hops:
-        /* Tell the sender its packet died... */
-        IP_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS);
-        icmp_send(skb, ICMP_TIME_EXCEEDED, ICMP_EXC_TTL, 0);
+       /* Tell the sender its packet died... */
+       IP_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS);
+       icmp_send(skb, ICMP_TIME_EXCEEDED, ICMP_EXC_TTL, 0);
 drop:
        kfree_skb(skb);
        return NET_RX_DROP;
index 8ce00d3703dacdeb46a387f27a8d5a609f100e7a..b6f05538037379719f06f5d5c176ce2394766fe2 100644 (file)
@@ -4,7 +4,7 @@
  *             interface as the means of communication with the user level.
  *
  *             The IP fragmentation functionality.
- *             
+ *
  * Version:    $Id: ip_fragment.c,v 1.59 2002/01/12 07:54:56 davem Exp $
  *
  * Authors:    Fred N. van Kempen <waltje@uWalt.NL.Mugnet.ORG>
@@ -238,7 +238,7 @@ static void ipq_kill(struct ipq *ipq)
        }
 }
 
-/* Memory limiting on fragments.  Evictor trashes the oldest 
+/* Memory limiting on fragments.  Evictor trashes the oldest
  * fragment queue until we are back under the threshold.
  */
 static void ip_evictor(void)
@@ -479,14 +479,14 @@ static void ip_frag_queue(struct ipq *qp, struct sk_buff *skb)
                goto err;
        }
 
-       offset = ntohs(skb->nh.iph->frag_off);
+       offset = ntohs(skb->nh.iph->frag_off);
        flags = offset & ~IP_OFFSET;
        offset &= IP_OFFSET;
        offset <<= 3;           /* offset is in 8-byte chunks */
-       ihl = skb->nh.iph->ihl * 4;
+       ihl = skb->nh.iph->ihl * 4;
 
        /* Determine the position of this fragment. */
-       end = offset + skb->len - ihl;
+       end = offset + skb->len - ihl;
 
        /* Is this the final fragment? */
        if ((flags & IP_MF) == 0) {
@@ -589,8 +589,8 @@ static void ip_frag_queue(struct ipq *qp, struct sk_buff *skb)
        else
                qp->fragments = skb;
 
-       if (skb->dev)
-               qp->iif = skb->dev->ifindex;
+       if (skb->dev)
+               qp->iif = skb->dev->ifindex;
        skb->dev = NULL;
        skb_get_timestamp(skb, &qp->stamp);
        qp->meat += skb->len;
@@ -684,7 +684,7 @@ static struct sk_buff *ip_frag_reasm(struct ipq *qp, struct net_device *dev)
        return head;
 
 out_nomem:
-       LIMIT_NETDEBUG(KERN_ERR "IP: queue_glue: no memory for gluing "
+       LIMIT_NETDEBUG(KERN_ERR "IP: queue_glue: no memory for gluing "
                              "queue %p\n", qp);
        goto out_fail;
 out_oversize:
@@ -703,7 +703,7 @@ struct sk_buff *ip_defrag(struct sk_buff *skb, u32 user)
        struct iphdr *iph = skb->nh.iph;
        struct ipq *qp;
        struct net_device *dev;
-       
+
        IP_INC_STATS_BH(IPSTATS_MIB_REASMREQDS);
 
        /* Start by cleaning up the memory. */
index 51c83500790f7af8270ee6b36a9e95f3fdaa61f4..9151da64231851199cafba4b844f8e20b81426b5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *     Linux NET3:     GRE over IP protocol decoder. 
+ *     Linux NET3:     GRE over IP protocol decoder.
  *
  *     Authors: Alexey Kuznetsov (kuznet@ms2.inr.ac.ru)
  *
@@ -13,7 +13,6 @@
 #include <linux/capability.h>
 #include <linux/module.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/kernel.h>
 #include <asm/uaccess.h>
 #include <linux/skbuff.h>
@@ -63,7 +62,7 @@
    solution, but it supposes maintaing new variable in ALL
    skb, even if no tunneling is used.
 
-   Current solution: t->recursion lock breaks dead loops. It looks 
+   Current solution: t->recursion lock breaks dead loops. It looks
    like dev->tbusy flag, but I preferred new variable, because
    the semantics is different. One day, when hard_start_xmit
    will be multithreaded we will have to use skb->encapsulation.
@@ -613,7 +612,7 @@ static int ipgre_rcv(struct sk_buff *skb)
                if (flags == 0 &&
                    skb->protocol == htons(ETH_P_WCCP)) {
                        skb->protocol = htons(ETH_P_IP);
-                       if ((*(h + offset) & 0xF0) != 0x40) 
+                       if ((*(h + offset) & 0xF0) != 0x40)
                                offset += 4;
                }
 
@@ -816,7 +815,7 @@ static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
                struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom);
                if (!new_skb) {
                        ip_rt_put(rt);
-                       stats->tx_dropped++;
+                       stats->tx_dropped++;
                        dev_kfree_skb(skb);
                        tunnel->recursion--;
                        return 0;
@@ -1044,7 +1043,7 @@ static int ipgre_tunnel_change_mtu(struct net_device *dev, int new_mtu)
    so that I had to set ARPHRD_IPGRE to a random value.
    I have an impression, that Cisco could make something similar,
    but this feature is apparently missing in IOS<=11.2(8).
-   
+
    I set up 10.66.66/24 and fec0:6666:6666::0/96 as virtual networks
    with broadcast 224.66.66.66. If you have access to mbone, play with me :-)
 
@@ -1076,9 +1075,9 @@ static int ipgre_header(struct sk_buff *skb, struct net_device *dev, unsigned sh
        p[1]            = htons(type);
 
        /*
-        *      Set the source hardware address. 
+        *      Set the source hardware address.
         */
-        
+
        if (saddr)
                memcpy(&iph->saddr, saddr, 4);
 
@@ -1088,7 +1087,7 @@ static int ipgre_header(struct sk_buff *skb, struct net_device *dev, unsigned sh
        }
        if (iph->daddr && !MULTICAST(iph->daddr))
                return t->hlen;
-       
+
        return -t->hlen;
 }
 
index 212734ca238fa88e2bcee0eb43e13c246a5f9720..f38e97647ac043878d21f636657d0f919ca5cee3 100644 (file)
@@ -15,7 +15,7 @@
  *             Stefan Becker, <stefanb@yello.ping.de>
  *             Jorge Cwik, <jorge@laser.satlink.net>
  *             Arnt Gulbrandsen, <agulbra@nvg.unit.no>
- *             
+ *
  *
  * Fixes:
  *             Alan Cox        :       Commented a couple of minor bits of surplus code
  *             Jos Vos         :       Do accounting *before* call_in_firewall
  *     Willy Konynenberg       :       Transparent proxying support
  *
- *  
+ *
  *
  * To Fix:
  *             IP fragmentation wants rewriting cleanly. The RFC815 algorithm is much more efficient
  *             and could be made very efficient with the addition of some virtual memory hacks to permit
  *             the allocation of a buffer that can then be 'grown' by twiddling page tables.
- *             Output fragmentation wants updating along with the buffer management to use a single 
+ *             Output fragmentation wants updating along with the buffer management to use a single
  *             interleaved copy algorithm so that fragmenting has a one copy overhead. Actual packet
  *             output should probably do its own fragmentation at the UDP/RAW layer. TCP shouldn't cause
  *             fragmentation anyway.
@@ -154,7 +154,7 @@ DEFINE_SNMP_STAT(struct ipstats_mib, ip_statistics) __read_mostly;
 
 /*
  *     Process Router Attention IP option
- */ 
+ */
 int ip_call_ra_chain(struct sk_buff *skb)
 {
        struct ip_ra_chain *ra;
@@ -202,8 +202,8 @@ static inline int ip_local_deliver_finish(struct sk_buff *skb)
 
        __skb_pull(skb, ihl);
 
-        /* Point into the IP datagram, just past the header. */
-        skb->h.raw = skb->data;
+       /* Point into the IP datagram, just past the header. */
+       skb->h.raw = skb->data;
 
        rcu_read_lock();
        {
@@ -259,7 +259,7 @@ static inline int ip_local_deliver_finish(struct sk_buff *skb)
 
 /*
  *     Deliver IP Packets to the higher protocol layers.
- */ 
+ */
 int ip_local_deliver(struct sk_buff *skb)
 {
        /*
@@ -335,14 +335,14 @@ static inline int ip_rcv_finish(struct sk_buff *skb)
        /*
         *      Initialise the virtual path cache for the packet. It describes
         *      how the packet travels inside Linux networking.
-        */ 
+        */
        if (skb->dst == NULL) {
                int err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos,
                                         skb->dev);
                if (unlikely(err)) {
                        if (err == -EHOSTUNREACH)
                                IP_INC_STATS_BH(IPSTATS_MIB_INADDRERRORS);
-                       goto drop; 
+                       goto drop;
                }
        }
 
@@ -363,13 +363,13 @@ static inline int ip_rcv_finish(struct sk_buff *skb)
        return dst_input(skb);
 
 drop:
-        kfree_skb(skb);
-        return NET_RX_DROP;
+       kfree_skb(skb);
+       return NET_RX_DROP;
 }
 
 /*
  *     Main IP Receive routine.
- */ 
+ */
 int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
 {
        struct iphdr *iph;
@@ -437,9 +437,9 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
 inhdr_error:
        IP_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS);
 drop:
-        kfree_skb(skb);
+       kfree_skb(skb);
 out:
-        return NET_RX_DROP;
+       return NET_RX_DROP;
 }
 
 EXPORT_SYMBOL(ip_statistics);
index 9f02917d6f45319de4680eade1dda3cf3440b050..f906a80d5a87952e408c1507df4b9eb26ad35352 100644 (file)
@@ -8,7 +8,7 @@
  * Version:    $Id: ip_options.c,v 1.21 2001/09/01 00:31:50 davem Exp $
  *
  * Authors:    A.N.Kuznetsov
- *             
+ *
  */
 
 #include <linux/capability.h>
@@ -26,7 +26,7 @@
 #include <net/route.h>
 #include <net/cipso_ipv4.h>
 
-/* 
+/*
  * Write options to IP header, record destination address to
  * source route option, address of outgoing interface
  * (we should already know it, so that this  function is allowed be
@@ -76,7 +76,7 @@ void ip_options_build(struct sk_buff * skb, struct ip_options * opt,
        }
 }
 
-/* 
+/*
  * Provided (sopt, skb) points to received options,
  * build in dopt compiled option set appropriate for answering.
  * i.e. invert SRR option, copy anothers,
@@ -85,7 +85,7 @@ void ip_options_build(struct sk_buff * skb, struct ip_options * opt,
  * NOTE: dopt cannot point to skb.
  */
 
-int ip_options_echo(struct ip_options * dopt, struct sk_buff * skb) 
+int ip_options_echo(struct ip_options * dopt, struct sk_buff * skb)
 {
        struct ip_options *sopt;
        unsigned char *sptr, *dptr;
@@ -215,7 +215,7 @@ int ip_options_echo(struct ip_options * dopt, struct sk_buff * skb)
  *     Simple and stupid 8), but the most efficient way.
  */
 
-void ip_options_fragment(struct sk_buff * skb) 
+void ip_options_fragment(struct sk_buff * skb)
 {
        unsigned char * optptr = skb->nh.raw + sizeof(struct iphdr);
        struct ip_options * opt = &(IPCB(skb)->opt);
@@ -370,7 +370,7 @@ int ip_options_compile(struct ip_options * opt, struct sk_buff * skb)
                                switch (optptr[3]&0xF) {
                                      case IPOPT_TS_TSONLY:
                                        opt->ts = optptr - iph;
-                                       if (skb) 
+                                       if (skb)
                                                timeptr = (__be32*)&optptr[optptr[2]-1];
                                        opt->ts_needtime = 1;
                                        optptr[2] += 4;
@@ -448,7 +448,7 @@ int ip_options_compile(struct ip_options * opt, struct sk_buff * skb)
                                goto error;
                        }
                        opt->cipso = optptr - iph;
-                       if (cipso_v4_validate(&optptr)) {
+                       if (cipso_v4_validate(&optptr)) {
                                pp_ptr = optptr;
                                goto error;
                        }
index a0f2008584bc6b24eb771b169cf33ca797f1c5b8..d096332f6c6d9e10753531364299f68672f604a7 100644 (file)
@@ -22,7 +22,7 @@
  *     Fixes:
  *             Alan Cox        :       Missing nonblock feature in ip_build_xmit.
  *             Mike Kilburn    :       htons() missing in ip_build_xmit.
- *             Bradford Johnson:       Fix faulty handling of some frames when 
+ *             Bradford Johnson:       Fix faulty handling of some frames when
  *                                     no route is found.
  *             Alexander Demenshin:    Missing sk/skb free in ip_queue_xmit
  *                                     (in case if packet not accepted by
@@ -33,9 +33,9 @@
  *                                     some redundant tests.
  *     Vitaly E. Lavrov        :       Transparent proxy revived after year coma.
  *             Andi Kleen      :       Replace ip_reply with ip_send_reply.
- *             Andi Kleen      :       Split fast and slow ip_build_xmit path 
- *                                     for decreased register pressure on x86 
- *                                     and more readibility. 
+ *             Andi Kleen      :       Split fast and slow ip_build_xmit path
+ *                                     for decreased register pressure on x86
+ *                                     and more readibility.
  *             Marc Boucher    :       When call_out_firewall returns FW_QUEUE,
  *                                     silently drop skb instead of failing with -EPERM.
  *             Detlev Wengorz  :       Copy protocol for fragments.
@@ -49,7 +49,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/string.h>
 #include <linux/errno.h>
@@ -114,7 +113,7 @@ static inline int ip_select_ttl(struct inet_sock *inet, struct dst_entry *dst)
        return ttl;
 }
 
-/* 
+/*
  *             Add an ip header to a skbuff and send it out.
  *
  */
@@ -243,7 +242,7 @@ int ip_mc_output(struct sk_buff *skb)
                        struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC);
                        if (newskb)
                                NF_HOOK(PF_INET, NF_IP_POST_ROUTING, newskb, NULL,
-                                       newskb->dev, 
+                                       newskb->dev,
                                        ip_dev_loopback_xmit);
                }
 
@@ -277,7 +276,7 @@ int ip_output(struct sk_buff *skb)
        skb->protocol = htons(ETH_P_IP);
 
        return NF_HOOK_COND(PF_INET, NF_IP_POST_ROUTING, skb, NULL, dev,
-                           ip_finish_output,
+                           ip_finish_output,
                            !(IPCB(skb)->flags & IPSKB_REROUTED));
 }
 
@@ -660,7 +659,7 @@ slow_path:
        return err;
 
 fail:
-       kfree_skb(skb); 
+       kfree_skb(skb);
        IP_INC_STATS(IPSTATS_MIB_FRAGFAILS);
        return err;
 }
@@ -755,7 +754,7 @@ static inline int ip_ufo_append_data(struct sock *sk,
  *     from many pieces of data. Each pieces will be holded on the socket
  *     until ip_push_pending_frames() is called. Each piece can be a page
  *     or non-page data.
- *     
+ *
  *     Not only UDP, other transport protocols - e.g. raw sockets - can use
  *     this interface potentially.
  *
@@ -888,7 +887,7 @@ alloc_new_skb:
                                datalen = maxfraglen - fragheaderlen;
                        fraglen = datalen + fragheaderlen;
 
-                       if ((flags & MSG_MORE) && 
+                       if ((flags & MSG_MORE) &&
                            !(rt->u.dst.dev->features&NETIF_F_SG))
                                alloclen = mtu;
                        else
@@ -903,14 +902,14 @@ alloc_new_skb:
                                alloclen += rt->u.dst.trailer_len;
 
                        if (transhdrlen) {
-                               skb = sock_alloc_send_skb(sk, 
+                               skb = sock_alloc_send_skb(sk,
                                                alloclen + hh_len + 15,
                                                (flags & MSG_DONTWAIT), &err);
                        } else {
                                skb = NULL;
                                if (atomic_read(&sk->sk_wmem_alloc) <=
                                    2 * sk->sk_sndbuf)
-                                       skb = sock_wmalloc(sk, 
+                                       skb = sock_wmalloc(sk,
                                                           alloclen + hh_len + 15, 1,
                                                           sk->sk_allocation);
                                if (unlikely(skb == NULL))
@@ -971,7 +970,7 @@ alloc_new_skb:
                        unsigned int off;
 
                        off = skb->len;
-                       if (getfrag(from, skb_put(skb, copy), 
+                       if (getfrag(from, skb_put(skb, copy),
                                        offset, copy, off, skb) < 0) {
                                __skb_trim(skb, off);
                                err = -EFAULT;
@@ -993,7 +992,7 @@ alloc_new_skb:
                                                goto error;
                                        }
                                        get_page(page);
-                                       skb_fill_page_desc(skb, i, page, sk->sk_sndmsg_off, 0);
+                                       skb_fill_page_desc(skb, i, page, sk->sk_sndmsg_off, 0);
                                        frag = &skb_shinfo(skb)->frags[i];
                                }
                        } else if (i < MAX_SKB_FRAGS) {
@@ -1033,7 +1032,7 @@ alloc_new_skb:
 error:
        inet->cork.length -= length;
        IP_INC_STATS(IPSTATS_MIB_OUTDISCARDS);
-       return err; 
+       return err;
 }
 
 ssize_t        ip_append_page(struct sock *sk, struct page *page,
@@ -1257,7 +1256,7 @@ int ip_push_pending_frames(struct sock *sk)
        skb->dst = dst_clone(&rt->u.dst);
 
        /* Netfilter gets whole the not fragmented skb. */
-       err = NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, 
+       err = NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL,
                      skb->dst->dev, dst_output);
        if (err) {
                if (err > 0)
@@ -1305,21 +1304,21 @@ void ip_flush_pending_frames(struct sock *sk)
 /*
  *     Fetch data from kernel space and fill in checksum if needed.
  */
-static int ip_reply_glue_bits(void *dptr, char *to, int offset, 
+static int ip_reply_glue_bits(void *dptr, char *to, int offset,
                              int len, int odd, struct sk_buff *skb)
 {
        __wsum csum;
 
        csum = csum_partial_copy_nocheck(dptr+offset, to, len, 0);
        skb->csum = csum_block_add(skb->csum, csum, odd);
-       return 0;  
+       return 0;
 }
 
-/* 
+/*
  *     Generic function to send a packet as reply to another packet.
  *     Used to send TCP resets so far. ICMP should use this function too.
  *
- *     Should run single threaded per socket because it uses the sock 
+ *     Should run single threaded per socket because it uses the sock
  *             structure to pass arguments.
  *
  *     LATER: switch from ip_build_xmit to ip_append_*
@@ -1357,7 +1356,7 @@ void ip_send_reply(struct sock *sk, struct sk_buff *skb, struct ip_reply_arg *ar
                                    /* Not quite clean, but right. */
                                    .uli_u = { .ports =
                                               { .sport = skb->h.th->dest,
-                                                .dport = skb->h.th->source } },
+                                                .dport = skb->h.th->source } },
                                    .proto = sk->sk_protocol };
                security_skb_classify_flow(skb, &fl);
                if (ip_route_output_key(&rt, &fl))
index 57d4bae6f080a470b277a28b505b6e11d015ebc4..23048d9f3584b199164a42a21e467c054975d8c5 100644 (file)
@@ -4,7 +4,7 @@
  *             interface as the means of communication with the user level.
  *
  *             The IP to API glue.
- *             
+ *
  * Version:    $Id: ip_sockglue.c,v 1.62 2002/02/01 22:01:04 davem Exp $
  *
  * Authors:    see ip.c
@@ -12,7 +12,7 @@
  * Fixes:
  *             Many            :       Split from ip.c , see ip.c for history.
  *             Martin Mares    :       TOS setting fixed.
- *             Alan Cox        :       Fixed a couple of oopses in Martin's 
+ *             Alan Cox        :       Fixed a couple of oopses in Martin's
  *                                     TOS tweaks.
  *             Mike McLagan    :       Routing by source
  */
@@ -20,7 +20,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/mm.h>
-#include <linux/sched.h>
 #include <linux/skbuff.h>
 #include <linux/ip.h>
 #include <linux/icmp.h>
@@ -253,7 +252,7 @@ int ip_ra_control(struct sock *sk, unsigned char on, void (*destructor)(struct s
        return 0;
 }
 
-void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err, 
+void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
                   __be16 port, u32 info, u8 *payload)
 {
        struct inet_sock *inet = inet_sk(sk);
@@ -266,10 +265,10 @@ void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
        if (!skb)
                return;
 
-       serr = SKB_EXT_ERR(skb);  
+       serr = SKB_EXT_ERR(skb);
        serr->ee.ee_errno = err;
        serr->ee.ee_origin = SO_EE_ORIGIN_ICMP;
-       serr->ee.ee_type = skb->h.icmph->type; 
+       serr->ee.ee_type = skb->h.icmph->type;
        serr->ee.ee_code = skb->h.icmph->code;
        serr->ee.ee_pad = 0;
        serr->ee.ee_info = info;
@@ -301,10 +300,10 @@ void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 port, u32 inf
        skb->nh.iph = iph;
        iph->daddr = daddr;
 
-       serr = SKB_EXT_ERR(skb);  
+       serr = SKB_EXT_ERR(skb);
        serr->ee.ee_errno = err;
        serr->ee.ee_origin = SO_EE_ORIGIN_LOCAL;
-       serr->ee.ee_type = 0; 
+       serr->ee.ee_type = 0;
        serr->ee.ee_code = 0;
        serr->ee.ee_pad = 0;
        serr->ee.ee_info = info;
@@ -319,7 +318,7 @@ void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 port, u32 inf
                kfree_skb(skb);
 }
 
-/* 
+/*
  *     Handle MSG_ERRQUEUE
  */
 int ip_recv_error(struct sock *sk, struct msghdr *msg, int len)
@@ -391,7 +390,7 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len)
        } else
                spin_unlock_bh(&sk->sk_error_queue.lock);
 
-out_free_skb:  
+out_free_skb:
        kfree_skb(skb);
 out:
        return err;
@@ -409,15 +408,15 @@ static int do_ip_setsockopt(struct sock *sk, int level,
        struct inet_sock *inet = inet_sk(sk);
        int val=0,err;
 
-       if (((1<<optname) & ((1<<IP_PKTINFO) | (1<<IP_RECVTTL) | 
-                           (1<<IP_RECVOPTS) | (1<<IP_RECVTOS) | 
-                           (1<<IP_RETOPTS) | (1<<IP_TOS) | 
-                           (1<<IP_TTL) | (1<<IP_HDRINCL) | 
-                           (1<<IP_MTU_DISCOVER) | (1<<IP_RECVERR) | 
+       if (((1<<optname) & ((1<<IP_PKTINFO) | (1<<IP_RECVTTL) |
+                           (1<<IP_RECVOPTS) | (1<<IP_RECVTOS) |
+                           (1<<IP_RETOPTS) | (1<<IP_TOS) |
+                           (1<<IP_TTL) | (1<<IP_HDRINCL) |
+                           (1<<IP_MTU_DISCOVER) | (1<<IP_RECVERR) |
                            (1<<IP_ROUTER_ALERT) | (1<<IP_FREEBIND) |
                            (1<<IP_PASSSEC))) ||
-                               optname == IP_MULTICAST_TTL || 
-                               optname == IP_MULTICAST_LOOP) { 
+                               optname == IP_MULTICAST_TTL ||
+                               optname == IP_MULTICAST_LOOP) {
                if (optlen >= sizeof(int)) {
                        if (get_user(val, (int __user *) optval))
                                return -EFAULT;
@@ -511,7 +510,7 @@ static int do_ip_setsockopt(struct sock *sk, int level,
                                val &= ~3;
                                val |= inet->tos & 3;
                        }
-                       if (IPTOS_PREC(val) >= IPTOS_PREC_CRITIC_ECP && 
+                       if (IPTOS_PREC(val) >= IPTOS_PREC_CRITIC_ECP &&
                            !capable(CAP_NET_ADMIN)) {
                                err = -EPERM;
                                break;
@@ -519,7 +518,7 @@ static int do_ip_setsockopt(struct sock *sk, int level,
                        if (inet->tos != val) {
                                inet->tos = val;
                                sk->sk_priority = rt_tos2priority(val);
-                               sk_dst_reset(sk); 
+                               sk_dst_reset(sk);
                        }
                        break;
                case IP_TTL:
@@ -556,13 +555,13 @@ static int do_ip_setsockopt(struct sock *sk, int level,
                        if (val < 0 || val > 255)
                                goto e_inval;
                        inet->mc_ttl = val;
-                       break;
-               case IP_MULTICAST_LOOP: 
+                       break;
+               case IP_MULTICAST_LOOP:
                        if (optlen<1)
                                goto e_inval;
                        inet->mc_loop = !!val;
-                       break;
-               case IP_MULTICAST_IF: 
+                       break;
+               case IP_MULTICAST_IF:
                {
                        struct ip_mreqn mreq;
                        struct net_device *dev = NULL;
@@ -616,7 +615,7 @@ static int do_ip_setsockopt(struct sock *sk, int level,
                }
 
                case IP_ADD_MEMBERSHIP:
-               case IP_DROP_MEMBERSHIP: 
+               case IP_DROP_MEMBERSHIP:
                {
                        struct ip_mreqn mreq;
 
@@ -629,7 +628,7 @@ static int do_ip_setsockopt(struct sock *sk, int level,
                        } else {
                                memset(&mreq, 0, sizeof(mreq));
                                if (copy_from_user(&mreq,optval,sizeof(struct ip_mreq)))
-                                       break; 
+                                       break;
                        }
 
                        if (optname == IP_ADD_MEMBERSHIP)
@@ -714,7 +713,7 @@ static int do_ip_setsockopt(struct sock *sk, int level,
                        break;
                }
                case MCAST_JOIN_GROUP:
-               case MCAST_LEAVE_GROUP: 
+               case MCAST_LEAVE_GROUP:
                {
                        struct group_req greq;
                        struct sockaddr_in *psin;
@@ -858,16 +857,16 @@ mc_msf_out:
                        kfree(gsf);
                        break;
                }
-               case IP_ROUTER_ALERT:   
+               case IP_ROUTER_ALERT:
                        err = ip_ra_control(sk, val ? 1 : 0, NULL);
                        break;
 
                case IP_FREEBIND:
                        if (optlen<1)
                                goto e_inval;
-                       inet->freebind = !!val; 
-                       break;                  
+                       inet->freebind = !!val;
+                       break;
+
                case IP_IPSEC_POLICY:
                case IP_XFRM_POLICY:
                        err = -EPERM;
@@ -954,7 +953,7 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname,
        struct inet_sock *inet = inet_sk(sk);
        int val;
        int len;
-       
+
        if(level!=SOL_IP)
                return -EOPNOTSUPP;
 
@@ -969,7 +968,7 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname,
                return -EFAULT;
        if(len < 0)
                return -EINVAL;
-               
+
        lock_sock(sk);
 
        switch(optname) {
@@ -984,7 +983,7 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname,
                                               inet->opt->optlen);
                                release_sock(sk);
 
-                               if (opt->optlen == 0) 
+                               if (opt->optlen == 0)
                                        return put_user(0, optlen);
 
                                ip_options_undo(opt);
@@ -1059,8 +1058,8 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname,
                        addr.s_addr = inet->mc_addr;
                        release_sock(sk);
 
-                       if(put_user(len, optlen))
-                               return -EFAULT;
+                       if(put_user(len, optlen))
+                               return -EFAULT;
                        if(copy_to_user(optval, &addr, len))
                                return -EFAULT;
                        return 0;
@@ -1101,7 +1100,7 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname,
                        release_sock(sk);
                        return err;
                }
-               case IP_PKTOPTIONS:             
+               case IP_PKTOPTIONS:
                {
                        struct msghdr msg;
 
@@ -1129,15 +1128,15 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname,
                        len -= msg.msg_controllen;
                        return put_user(len, optlen);
                }
-               case IP_FREEBIND: 
-                       val = inet->freebind; 
-                       break; 
+               case IP_FREEBIND:
+                       val = inet->freebind;
+                       break;
                default:
                        release_sock(sk);
                        return -ENOPROTOOPT;
        }
        release_sock(sk);
-       
+
        if (len < sizeof(int) && len > 0 && val>=0 && val<255) {
                unsigned char ucval = (unsigned char)val;
                len = 1;
@@ -1168,7 +1167,7 @@ int ip_getsockopt(struct sock *sk, int level,
                && (optname < MRT_BASE || optname > MRT_BASE+10)
 #endif
           ) {
-               int len;
+               int len;
 
                if(get_user(len,optlen))
                        return -EFAULT;
@@ -1197,7 +1196,7 @@ int compat_ip_getsockopt(struct sock *sk, int level, int optname,
            && (optname < MRT_BASE || optname > MRT_BASE+10)
 #endif
           ) {
-               int len;
+               int len;
 
                if (get_user(len, optlen))
                        return -EFAULT;
index 3839b706142e3816f73bbc9a6ff361a9f8467d44..aa704b88f014fa7118a8ccfc92fc067b65108c48 100644 (file)
@@ -5,7 +5,7 @@
  *
  * 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) 
+ * Software Foundation; either version 2 of the License, or (at your option)
  * any later version.
  *
  * Todo:
@@ -48,7 +48,7 @@ static int ipcomp_decompress(struct xfrm_state *x, struct sk_buff *skb)
        u8 *start, *scratch;
        struct crypto_comp *tfm;
        int cpu;
-       
+
        plen = skb->len;
        dlen = IPCOMP_SCRATCH_SIZE;
        start = skb->data;
@@ -69,11 +69,11 @@ static int ipcomp_decompress(struct xfrm_state *x, struct sk_buff *skb)
        err = pskb_expand_head(skb, 0, dlen - plen, GFP_ATOMIC);
        if (err)
                goto out;
-               
+
        skb->truesize += dlen - plen;
        __skb_put(skb, dlen - plen);
        memcpy(skb->data, scratch, dlen);
-out:   
+out:
        put_cpu();
        return err;
 }
@@ -85,11 +85,11 @@ static int ipcomp_input(struct xfrm_state *x, struct sk_buff *skb)
        struct ip_comp_hdr *ipch;
 
        if (skb_linearize_cow(skb))
-               goto out;
+               goto out;
 
        skb->ip_summed = CHECKSUM_NONE;
 
-       /* Remove ipcomp header and decompress original payload */      
+       /* Remove ipcomp header and decompress original payload */
        iph = skb->nh.iph;
        ipch = (void *)skb->data;
        iph->protocol = ipch->nexthdr;
@@ -97,7 +97,7 @@ static int ipcomp_input(struct xfrm_state *x, struct sk_buff *skb)
        __skb_pull(skb, sizeof(*ipch));
        err = ipcomp_decompress(x, skb);
 
-out:   
+out:
        return err;
 }
 
@@ -109,7 +109,7 @@ static int ipcomp_compress(struct xfrm_state *x, struct sk_buff *skb)
        u8 *start, *scratch;
        struct crypto_comp *tfm;
        int cpu;
-       
+
        ihlen = iph->ihl * 4;
        plen = skb->len - ihlen;
        dlen = IPCOMP_SCRATCH_SIZE;
@@ -127,14 +127,14 @@ static int ipcomp_compress(struct xfrm_state *x, struct sk_buff *skb)
                err = -EMSGSIZE;
                goto out;
        }
-       
+
        memcpy(start + sizeof(struct ip_comp_hdr), scratch, dlen);
        put_cpu();
 
        pskb_trim(skb, ihlen + dlen + sizeof(struct ip_comp_hdr));
        return 0;
-       
-out:   
+
+out:
        put_cpu();
        return err;
 }
@@ -157,7 +157,7 @@ static int ipcomp_output(struct xfrm_state *x, struct sk_buff *skb)
 
        if (skb_linearize_cow(skb))
                goto out_ok;
-       
+
        err = ipcomp_compress(x, skb);
        iph = skb->nh.iph;
 
@@ -194,7 +194,7 @@ static void ipcomp4_err(struct sk_buff *skb, u32 info)
 
        spi = htonl(ntohs(ipch->cpi));
        x = xfrm_state_lookup((xfrm_address_t *)&iph->daddr,
-                             spi, IPPROTO_COMP, AF_INET);
+                             spi, IPPROTO_COMP, AF_INET);
        if (!x)
                return;
        NETDEBUG(KERN_DEBUG "pmtu discovery on SA IPCOMP/%08x/%u.%u.%u.%u\n",
@@ -202,12 +202,12 @@ static void ipcomp4_err(struct sk_buff *skb, u32 info)
        xfrm_state_put(x);
 }
 
-/* We always hold one tunnel user reference to indicate a tunnel */ 
+/* We always hold one tunnel user reference to indicate a tunnel */
 static struct xfrm_state *ipcomp_tunnel_create(struct xfrm_state *x)
 {
        struct xfrm_state *t;
        u8 mode = XFRM_MODE_TUNNEL;
-       
+
        t = xfrm_state_alloc();
        if (t == NULL)
                goto out;
@@ -247,7 +247,7 @@ static int ipcomp_tunnel_attach(struct xfrm_state *x)
        struct xfrm_state *t;
 
        t = xfrm_state_lookup((xfrm_address_t *)&x->id.daddr.a4,
-                             x->props.saddr.a4, IPPROTO_IPIP, AF_INET);
+                             x->props.saddr.a4, IPPROTO_IPIP, AF_INET);
        if (!t) {
                t = ipcomp_tunnel_create(x);
                if (!t) {
index afa60b9a003f0e5185073993ffbd9cc22f960c0f..cf49de1a4983b3477fd9a59b6d0be9abf5c0975d 100644 (file)
@@ -12,7 +12,7 @@
  *  BOOTP rewritten to construct and analyse packets itself instead
  *  of misusing the IP layer. num_bugs_causing_wrong_arp_replies--;
  *                                          -- MJ, December 1998
- *  
+ *
  *  Fixed ip_auto_config_setup calling at startup in the new "Linker Magic"
  *  initialization scheme.
  *     - Arnaldo Carvalho de Melo <acme@conectiva.com.br>, 08/11/1999
@@ -98,8 +98,8 @@
 #define CONF_TIMEOUT_RANDOM    (HZ)    /* Maximum amount of randomization */
 #define CONF_TIMEOUT_MULT      *7/4    /* Rate of timeout growth */
 #define CONF_TIMEOUT_MAX       (HZ*30) /* Maximum allowed timeout */
-#define CONF_NAMESERVERS_MAX   3       /* Maximum number of nameservers  
-                                           - '3' from resolv.h */
+#define CONF_NAMESERVERS_MAX   3       /* Maximum number of nameservers
+                                          - '3' from resolv.h */
 
 #define NONE __constant_htonl(INADDR_NONE)
 
@@ -365,7 +365,7 @@ static int __init ic_defaults(void)
         *      At this point we have no userspace running so need not
         *      claim locks on system_utsname
         */
-        
+
        if (!ic_host_name_set)
                sprintf(init_utsname()->nodename, "%u.%u.%u.%u", NIPQUAD(ic_myaddr));
 
@@ -650,9 +650,9 @@ static void __init ic_bootp_init_ext(u8 *e)
        *e++ = 40;
        e += 40;
 
-       *e++ = 57;              /* set extension buffer size for reply */ 
+       *e++ = 57;              /* set extension buffer size for reply */
        *e++ = 2;
-       *e++ = 1;               /* 128+236+8+20+14, see dhcpd sources */ 
+       *e++ = 1;               /* 128+236+8+20+14, see dhcpd sources */
        *e++ = 150;
 
        *e++ = 255;             /* End of the list */
@@ -913,7 +913,7 @@ static int __init ic_bootp_recv(struct sk_buff *skb, struct net_device *dev, str
        /* Parse extensions */
        if (ext_len >= 4 &&
            !memcmp(b->exten, ic_bootp_cookie, 4)) { /* Check magic cookie */
-                u8 *end = (u8 *) b + ntohs(b->iph.tot_len);
+               u8 *end = (u8 *) b + ntohs(b->iph.tot_len);
                u8 *ext;
 
 #ifdef IPCONFIG_DHCP
@@ -1020,7 +1020,7 @@ drop:
        kfree_skb(skb);
 
        return 0;
-}      
+}
 
 
 #endif
@@ -1080,7 +1080,7 @@ static int __init ic_dynamic(void)
         * seems to be a terrible waste of CPU time, but actually there is
         * only one process running at all, so we don't need to use any
         * scheduler functions.
-        * [Actually we could now, but the nothing else running note still 
+        * [Actually we could now, but the nothing else running note still
         *  applies.. - AC]
         */
        printk(KERN_NOTICE "Sending %s%s%s requests .",
@@ -1156,7 +1156,7 @@ static int __init ic_dynamic(void)
        }
 
        printk("IP-Config: Got %s answer from %u.%u.%u.%u, ",
-               ((ic_got_reply & IC_RARP) ? "RARP" 
+               ((ic_got_reply & IC_RARP) ? "RARP"
                 : (ic_proto_enabled & IC_USE_DHCP) ? "DHCP" : "BOOTP"),
                NIPQUAD(ic_servaddr));
        printk("my address is %u.%u.%u.%u\n", NIPQUAD(ic_myaddr));
@@ -1200,7 +1200,7 @@ static int pnp_seq_open(struct inode *indoe, struct file *file)
        return single_open(file, pnp_seq_show, NULL);
 }
 
-static struct file_operations pnp_seq_fops = {
+static const struct file_operations pnp_seq_fops = {
        .owner          = THIS_MODULE,
        .open           = pnp_seq_open,
        .read           = seq_read,
@@ -1286,7 +1286,7 @@ static int __init ip_auto_config(void)
 #endif
            ic_first_dev->next) {
 #ifdef IPCONFIG_DYNAMIC
-       
+
                int retries = CONF_OPEN_RETRIES;
 
                if (ic_dynamic() < 0) {
@@ -1308,14 +1308,14 @@ static int __init ip_auto_config(void)
                         */
 #ifdef CONFIG_ROOT_NFS
                        if (ROOT_DEV ==  Root_NFS) {
-                               printk(KERN_ERR 
+                               printk(KERN_ERR
                                        "IP-Config: Retrying forever (NFS root)...\n");
                                goto try_try_again;
                        }
 #endif
 
                        if (--retries) {
-                               printk(KERN_ERR 
+                               printk(KERN_ERR
                                       "IP-Config: Reopening network devices...\n");
                                goto try_try_again;
                        }
@@ -1443,8 +1443,8 @@ static int __init ip_auto_config_setup(char *addrs)
 
        ic_set_manually = 1;
 
-       ic_enable = (*addrs && 
-               (strcmp(addrs, "off") != 0) && 
+       ic_enable = (*addrs &&
+               (strcmp(addrs, "off") != 0) &&
                (strcmp(addrs, "none") != 0));
        if (!ic_enable)
                return 1;
index da8bbd20c7edcef2df0c464b57089d691dbe03d0..3ec5ce0f5498cb17deead77b228e0408e3f9c050 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *     Linux NET3:     IP/IP protocol decoder. 
+ *     Linux NET3:     IP/IP protocol decoder.
  *
  *     Version: $Id: ipip.c,v 1.50 2001/10/02 02:22:36 davem Exp $
  *
        Thanks for the great code!
 
                -Sam Lantinga   (slouken@cs.ucdavis.edu)  02/01/95
-               
+
        Minor tweaks:
                Cleaned up the code a little and added some pre-1.3.0 tweaks.
                dev->hard_header/hard_header_len changed to use no headers.
                Comments/bracketing tweaked.
                Made the tunnels use dev->name not tunnel: when error reporting.
                Added tx_dropped stat
-               
+
                -Alan Cox       (Alan.Cox@linux.org) 21 March 95
 
        Reworked:
@@ -52,7 +52,7 @@
                Note:  There is currently no firewall or ICMP handling done.
 
                -Sam Lantinga   (slouken@cs.ucdavis.edu) 02/13/96
-               
+
 */
 
 /* Things I wish I had known when writing the tunnel driver:
@@ -75,7 +75,7 @@
        "allocated" with skb_put().  You can then write up to skb->len
        bytes to that buffer.  If you need more, you can call skb_put()
        again with the additional amount of space you need.  You can
-       find out how much more space you can allocate by calling 
+       find out how much more space you can allocate by calling
        "skb_tailroom(skb)".
        Now, to add header space, call "skb_push(skb, header_len)".
        This creates space at the beginning of the buffer and returns
    For comments look at net/ipv4/ip_gre.c --ANK
  */
 
+
 #include <linux/capability.h>
 #include <linux/module.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/kernel.h>
 #include <asm/uaccess.h>
 #include <linux/skbuff.h>
@@ -607,7 +606,7 @@ static int ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
                struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom);
                if (!new_skb) {
                        ip_rt_put(rt);
-                       stats->tx_dropped++;
+                       stats->tx_dropped++;
                        dev_kfree_skb(skb);
                        tunnel->recursion--;
                        return 0;
@@ -871,7 +870,7 @@ static int __init ipip_init(void)
 
        printk(banner);
 
-       if (xfrm4_tunnel_register(&ipip_handler)) {
+       if (xfrm4_tunnel_register(&ipip_handler, AF_INET)) {
                printk(KERN_INFO "ipip init: can't register tunnel\n");
                return -EAGAIN;
        }
@@ -893,7 +892,7 @@ static int __init ipip_init(void)
  err2:
        free_netdev(ipip_fb_tunnel_dev);
  err1:
-       xfrm4_tunnel_deregister(&ipip_handler);
+       xfrm4_tunnel_deregister(&ipip_handler, AF_INET);
        goto out;
 }
 
@@ -913,7 +912,7 @@ static void __exit ipip_destroy_tunnels(void)
 
 static void __exit ipip_fini(void)
 {
-       if (xfrm4_tunnel_deregister(&ipip_handler))
+       if (xfrm4_tunnel_deregister(&ipip_handler, AF_INET))
                printk(KERN_INFO "ipip close: can't deregister tunnel\n");
 
        rtnl_lock();
index ecb5422ea237d0ad811a46fa924ecd01d66720d9..601e3df69258117394c7c07306cd755dd10cf8cf 100644 (file)
@@ -31,7 +31,6 @@
 #include <asm/system.h>
 #include <asm/uaccess.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/capability.h>
 #include <linux/errno.h>
 #include <linux/timer.h>
@@ -241,7 +240,7 @@ failure:
 /*
  *     Delete a VIF entry
  */
+
 static int vif_delete(int vifi)
 {
        struct vif_device *v;
@@ -409,7 +408,7 @@ static int vif_add(struct vifctl *vifc, int mrtsock)
                        return -ENOBUFS;
                break;
 #endif
-       case VIFF_TUNNEL:       
+       case VIFF_TUNNEL:
                dev = ipmr_new_tunnel(vifc);
                if (!dev)
                        return -ENOBUFS;
@@ -479,20 +478,18 @@ static struct mfc_cache *ipmr_cache_find(__be32 origin, __be32 mcastgrp)
  */
 static struct mfc_cache *ipmr_cache_alloc(void)
 {
-       struct mfc_cache *c=kmem_cache_alloc(mrt_cachep, GFP_KERNEL);
+       struct mfc_cache *c=kmem_cache_zalloc(mrt_cachep, GFP_KERNEL);
        if(c==NULL)
                return NULL;
-       memset(c, 0, sizeof(*c));
        c->mfc_un.res.minvif = MAXVIFS;
        return c;
 }
 
 static struct mfc_cache *ipmr_cache_alloc_unres(void)
 {
-       struct mfc_cache *c=kmem_cache_alloc(mrt_cachep, GFP_ATOMIC);
+       struct mfc_cache *c=kmem_cache_zalloc(mrt_cachep, GFP_ATOMIC);
        if(c==NULL)
                return NULL;
-       memset(c, 0, sizeof(*c));
        skb_queue_head_init(&c->mfc_un.unres.unresolved);
        c->mfc_un.unres.expires = jiffies + 10*HZ;
        return c;
@@ -501,7 +498,7 @@ static struct mfc_cache *ipmr_cache_alloc_unres(void)
 /*
  *     A cache entry has gone into a resolved state from queued
  */
+
 static void ipmr_cache_resolve(struct mfc_cache *uc, struct mfc_cache *c)
 {
        struct sk_buff *skb;
@@ -538,7 +535,7 @@ static void ipmr_cache_resolve(struct mfc_cache *uc, struct mfc_cache *c)
  *
  *     Called under mrt_lock.
  */
+
 static int ipmr_cache_report(struct sk_buff *pkt, vifi_t vifi, int assert)
 {
        struct sk_buff *skb;
@@ -569,13 +566,13 @@ static int ipmr_cache_report(struct sk_buff *pkt, vifi_t vifi, int assert)
                memcpy(msg, pkt->nh.raw, sizeof(struct iphdr));
                msg->im_msgtype = IGMPMSG_WHOLEPKT;
                msg->im_mbz = 0;
-               msg->im_vif = reg_vif_num;
+               msg->im_vif = reg_vif_num;
                skb->nh.iph->ihl = sizeof(struct iphdr) >> 2;
                skb->nh.iph->tot_len = htons(ntohs(pkt->nh.iph->tot_len) + sizeof(struct iphdr));
-       } else 
+       } else
 #endif
-       {       
-               
+       {
+
        /*
         *      Copy the IP header
         */
@@ -597,7 +594,7 @@ static int ipmr_cache_report(struct sk_buff *pkt, vifi_t vifi, int assert)
        igmp->code      =       0;
        skb->nh.iph->tot_len=htons(skb->len);                   /* Fix the length */
        skb->h.raw = skb->nh.raw;
-        }
+       }
 
        if (mroute_socket == NULL) {
                kfree_skb(skb);
@@ -619,7 +616,7 @@ static int ipmr_cache_report(struct sk_buff *pkt, vifi_t vifi, int assert)
 /*
  *     Queue a packet for resolution. It gets locked cache entry!
  */
+
 static int
 ipmr_cache_unresolved(vifi_t vifi, struct sk_buff *skb)
 {
@@ -657,7 +654,7 @@ ipmr_cache_unresolved(vifi_t vifi, struct sk_buff *skb)
                 *      Reflect first query at mrouted.
                 */
                if ((err = ipmr_cache_report(skb, vifi, IGMPMSG_NOCACHE))<0) {
-                       /* If the report failed throw the cache entry 
+                       /* If the report failed throw the cache entry
                           out - Brad Parker
                         */
                        spin_unlock_bh(&mfc_unres_lock);
@@ -783,11 +780,11 @@ static int ipmr_mfc_add(struct mfcctl *mfc, int mrtsock)
 /*
  *     Close the multicast socket, and clear the vif tables etc
  */
+
 static void mroute_clean_tables(struct sock *sk)
 {
        int i;
-               
+
        /*
         *      Shut down all active vif entries
         */
@@ -854,13 +851,13 @@ static void mrtsock_destruct(struct sock *sk)
  *     that's how BSD mrouted happens to think. Maybe one day with a proper
  *     MOSPF/PIM router set up we can clean this up.
  */
+
 int ip_mroute_setsockopt(struct sock *sk,int optname,char __user *optval,int optlen)
 {
        int ret;
        struct vifctl vif;
        struct mfcctl mfc;
-       
+
        if(optname!=MRT_INIT)
        {
                if(sk!=mroute_socket && !capable(CAP_NET_ADMIN))
@@ -901,7 +898,7 @@ int ip_mroute_setsockopt(struct sock *sk,int optname,char __user *optval,int opt
                        if(optlen!=sizeof(vif))
                                return -EINVAL;
                        if (copy_from_user(&vif,optval,sizeof(vif)))
-                               return -EFAULT; 
+                               return -EFAULT;
                        if(vif.vifc_vifi >= MAXVIFS)
                                return -ENFILE;
                        rtnl_lock();
@@ -980,13 +977,13 @@ int ip_mroute_setsockopt(struct sock *sk,int optname,char __user *optval,int opt
 /*
  *     Getsock opt support for the multicast routing system.
  */
+
 int ip_mroute_getsockopt(struct sock *sk,int optname,char __user *optval,int __user *optlen)
 {
        int olr;
        int val;
 
-       if(optname!=MRT_VERSION && 
+       if(optname!=MRT_VERSION &&
 #ifdef CONFIG_IP_PIMSM
           optname!=MRT_PIM &&
 #endif
@@ -999,7 +996,7 @@ int ip_mroute_getsockopt(struct sock *sk,int optname,char __user *optval,int __u
        olr = min_t(unsigned int, olr, sizeof(int));
        if (olr < 0)
                return -EINVAL;
-               
+
        if(put_user(olr,optlen))
                return -EFAULT;
        if(optname==MRT_VERSION)
@@ -1018,19 +1015,19 @@ int ip_mroute_getsockopt(struct sock *sk,int optname,char __user *optval,int __u
 /*
  *     The IP multicast ioctl support routines.
  */
+
 int ipmr_ioctl(struct sock *sk, int cmd, void __user *arg)
 {
        struct sioc_sg_req sr;
        struct sioc_vif_req vr;
        struct vif_device *vif;
        struct mfc_cache *c;
-       
+
        switch(cmd)
        {
                case SIOCGETVIFCNT:
                        if (copy_from_user(&vr,arg,sizeof(vr)))
-                               return -EFAULT; 
+                               return -EFAULT;
                        if(vr.vifi>=maxvif)
                                return -EINVAL;
                        read_lock(&mrt_lock);
@@ -1096,7 +1093,7 @@ static struct notifier_block ip_mr_notifier={
  *     This avoids tunnel drivers and other mess and gives us the speed so
  *     important for multicast video.
  */
+
 static void ip_encap(struct sk_buff *skb, __be32 saddr, __be32 daddr)
 {
        struct iphdr *iph = (struct iphdr *)skb_push(skb,sizeof(struct iphdr));
@@ -1194,7 +1191,7 @@ static void ipmr_queue_xmit(struct sk_buff *skb, struct mfc_cache *c, int vifi)
        encap += LL_RESERVED_SPACE(dev) + rt->u.dst.header_len;
 
        if (skb_cow(skb, encap)) {
-               ip_rt_put(rt);
+               ip_rt_put(rt);
                goto out_free;
        }
 
@@ -1228,7 +1225,7 @@ static void ipmr_queue_xmit(struct sk_buff *skb, struct mfc_cache *c, int vifi)
         * not mrouter) cannot join to more than one interface - it will
         * result in receiving multiple packets.
         */
-       NF_HOOK(PF_INET, NF_IP_FORWARD, skb, skb->dev, dev, 
+       NF_HOOK(PF_INET, NF_IP_FORWARD, skb, skb->dev, dev,
                ipmr_forward_finish);
        return;
 
@@ -1289,7 +1286,7 @@ static int ip_mr_forward(struct sk_buff *skb, struct mfc_cache *cache, int local
                       large chunk of pimd to kernel. Ough... --ANK
                     */
                    (mroute_do_pim || cache->mfc_un.res.ttls[true_vifi] < 255) &&
-                   time_after(jiffies, 
+                   time_after(jiffies,
                               cache->mfc_un.res.last_assert + MFC_ASSERT_THRESH)) {
                        cache->mfc_un.res.last_assert = jiffies;
                        ipmr_cache_report(skb, true_vifi, IGMPMSG_WRONGVIF);
@@ -1426,14 +1423,14 @@ int pim_rcv_v1(struct sk_buff * skb)
        struct iphdr   *encap;
        struct net_device  *reg_dev = NULL;
 
-       if (!pskb_may_pull(skb, sizeof(*pim) + sizeof(*encap))) 
+       if (!pskb_may_pull(skb, sizeof(*pim) + sizeof(*encap)))
                goto drop;
 
        pim = (struct igmphdr*)skb->h.raw;
 
-        if (!mroute_do_pim ||
+       if (!mroute_do_pim ||
            skb->len < sizeof(*pim) + sizeof(*encap) ||
-           pim->group != PIM_V1_VERSION || pim->code != PIM_V1_REGISTER) 
+           pim->group != PIM_V1_VERSION || pim->code != PIM_V1_REGISTER)
                goto drop;
 
        encap = (struct iphdr*)(skb->h.raw + sizeof(struct igmphdr));
@@ -1445,7 +1442,7 @@ int pim_rcv_v1(struct sk_buff * skb)
         */
        if (!MULTICAST(encap->daddr) ||
            encap->tot_len == 0 ||
-           ntohs(encap->tot_len) + sizeof(*pim) > skb->len) 
+           ntohs(encap->tot_len) + sizeof(*pim) > skb->len)
                goto drop;
 
        read_lock(&mrt_lock);
@@ -1455,7 +1452,7 @@ int pim_rcv_v1(struct sk_buff * skb)
                dev_hold(reg_dev);
        read_unlock(&mrt_lock);
 
-       if (reg_dev == NULL) 
+       if (reg_dev == NULL)
                goto drop;
 
        skb->mac.raw = skb->nh.raw;
@@ -1486,13 +1483,13 @@ static int pim_rcv(struct sk_buff * skb)
        struct iphdr   *encap;
        struct net_device  *reg_dev = NULL;
 
-       if (!pskb_may_pull(skb, sizeof(*pim) + sizeof(*encap))) 
+       if (!pskb_may_pull(skb, sizeof(*pim) + sizeof(*encap)))
                goto drop;
 
        pim = (struct pimreghdr*)skb->h.raw;
-        if (pim->type != ((PIM_VERSION<<4)|(PIM_REGISTER)) ||
+       if (pim->type != ((PIM_VERSION<<4)|(PIM_REGISTER)) ||
            (pim->flags&PIM_NULL_REGISTER) ||
-           (ip_compute_csum((void *)pim, sizeof(*pim)) != 0 && 
+           (ip_compute_csum((void *)pim, sizeof(*pim)) != 0 &&
             csum_fold(skb_checksum(skb, 0, skb->len, 0))))
                goto drop;
 
@@ -1500,7 +1497,7 @@ static int pim_rcv(struct sk_buff * skb)
        encap = (struct iphdr*)(skb->h.raw + sizeof(struct pimreghdr));
        if (!MULTICAST(encap->daddr) ||
            encap->tot_len == 0 ||
-           ntohs(encap->tot_len) + sizeof(*pim) > skb->len) 
+           ntohs(encap->tot_len) + sizeof(*pim) > skb->len)
                goto drop;
 
        read_lock(&mrt_lock);
@@ -1510,7 +1507,7 @@ static int pim_rcv(struct sk_buff * skb)
                dev_hold(reg_dev);
        read_unlock(&mrt_lock);
 
-       if (reg_dev == NULL) 
+       if (reg_dev == NULL)
                goto drop;
 
        skb->mac.raw = skb->nh.raw;
@@ -1616,7 +1613,7 @@ int ipmr_get_route(struct sk_buff *skb, struct rtmsg *rtm, int nowait)
        return err;
 }
 
-#ifdef CONFIG_PROC_FS  
+#ifdef CONFIG_PROC_FS
 /*
  *     The /proc interfaces to multicast routing /proc/ip_mr_cache /proc/ip_mr_vif
  */
@@ -1630,7 +1627,7 @@ static struct vif_device *ipmr_vif_seq_idx(struct ipmr_vif_iter *iter,
        for (iter->ct = 0; iter->ct < maxvif; ++iter->ct) {
                if(!VIF_EXISTS(iter->ct))
                        continue;
-               if (pos-- == 0) 
+               if (pos-- == 0)
                        return &vif_table[iter->ct];
        }
        return NULL;
@@ -1639,7 +1636,7 @@ static struct vif_device *ipmr_vif_seq_idx(struct ipmr_vif_iter *iter,
 static void *ipmr_vif_seq_start(struct seq_file *seq, loff_t *pos)
 {
        read_lock(&mrt_lock);
-       return *pos ? ipmr_vif_seq_idx(seq->private, *pos - 1) 
+       return *pos ? ipmr_vif_seq_idx(seq->private, *pos - 1)
                : SEQ_START_TOKEN;
 }
 
@@ -1650,7 +1647,7 @@ static void *ipmr_vif_seq_next(struct seq_file *seq, void *v, loff_t *pos)
        ++*pos;
        if (v == SEQ_START_TOKEN)
                return ipmr_vif_seq_idx(iter, 0);
-       
+
        while (++iter->ct < maxvif) {
                if(!VIF_EXISTS(iter->ct))
                        continue;
@@ -1667,7 +1664,7 @@ static void ipmr_vif_seq_stop(struct seq_file *seq, void *v)
 static int ipmr_vif_seq_show(struct seq_file *seq, void *v)
 {
        if (v == SEQ_START_TOKEN) {
-               seq_puts(seq, 
+               seq_puts(seq,
                         "Interface      BytesIn  PktsIn  BytesOut PktsOut Flags Local    Remote\n");
        } else {
                const struct vif_device *vif = v;
@@ -1676,7 +1673,7 @@ static int ipmr_vif_seq_show(struct seq_file *seq, void *v)
                seq_printf(seq,
                           "%2Zd %-10s %8ld %7ld  %8ld %7ld %05X %08X %08X\n",
                           vif - vif_table,
-                          name, vif->bytes_in, vif->pkt_in, 
+                          name, vif->bytes_in, vif->pkt_in,
                           vif->bytes_out, vif->pkt_out,
                           vif->flags, vif->local, vif->remote);
        }
@@ -1695,7 +1692,7 @@ static int ipmr_vif_open(struct inode *inode, struct file *file)
        struct seq_file *seq;
        int rc = -ENOMEM;
        struct ipmr_vif_iter *s = kmalloc(sizeof(*s), GFP_KERNEL);
-       
+
        if (!s)
                goto out;
 
@@ -1714,7 +1711,7 @@ out_kfree:
 
 }
 
-static struct file_operations ipmr_vif_fops = {
+static const struct file_operations ipmr_vif_fops = {
        .owner   = THIS_MODULE,
        .open    = ipmr_vif_open,
        .read    = seq_read,
@@ -1734,15 +1731,15 @@ static struct mfc_cache *ipmr_mfc_seq_idx(struct ipmr_mfc_iter *it, loff_t pos)
 
        it->cache = mfc_cache_array;
        read_lock(&mrt_lock);
-       for (it->ct = 0; it->ct < MFC_LINES; it->ct++) 
-               for(mfc = mfc_cache_array[it->ct]; mfc; mfc = mfc->next) 
-                       if (pos-- == 0) 
+       for (it->ct = 0; it->ct < MFC_LINES; it->ct++)
+               for(mfc = mfc_cache_array[it->ct]; mfc; mfc = mfc->next)
+                       if (pos-- == 0)
                                return mfc;
        read_unlock(&mrt_lock);
 
        it->cache = &mfc_unres_queue;
        spin_lock_bh(&mfc_unres_lock);
-       for(mfc = mfc_unres_queue; mfc; mfc = mfc->next) 
+       for(mfc = mfc_unres_queue; mfc; mfc = mfc->next)
                if (pos-- == 0)
                        return mfc;
        spin_unlock_bh(&mfc_unres_lock);
@@ -1757,7 +1754,7 @@ static void *ipmr_mfc_seq_start(struct seq_file *seq, loff_t *pos)
        struct ipmr_mfc_iter *it = seq->private;
        it->cache = NULL;
        it->ct = 0;
-       return *pos ? ipmr_mfc_seq_idx(seq->private, *pos - 1) 
+       return *pos ? ipmr_mfc_seq_idx(seq->private, *pos - 1)
                : SEQ_START_TOKEN;
 }
 
@@ -1773,8 +1770,8 @@ static void *ipmr_mfc_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 
        if (mfc->next)
                return mfc->next;
-       
-       if (it->cache == &mfc_unres_queue) 
+
+       if (it->cache == &mfc_unres_queue)
                goto end_of_list;
 
        BUG_ON(it->cache != mfc_cache_array);
@@ -1789,10 +1786,10 @@ static void *ipmr_mfc_seq_next(struct seq_file *seq, void *v, loff_t *pos)
        read_unlock(&mrt_lock);
        it->cache = &mfc_unres_queue;
        it->ct = 0;
-               
+
        spin_lock_bh(&mfc_unres_lock);
        mfc = mfc_unres_queue;
-       if (mfc) 
+       if (mfc)
                return mfc;
 
  end_of_list:
@@ -1817,12 +1814,12 @@ static int ipmr_mfc_seq_show(struct seq_file *seq, void *v)
        int n;
 
        if (v == SEQ_START_TOKEN) {
-               seq_puts(seq, 
+               seq_puts(seq,
                 "Group    Origin   Iif     Pkts    Bytes    Wrong Oifs\n");
        } else {
                const struct mfc_cache *mfc = v;
                const struct ipmr_mfc_iter *it = seq->private;
-               
+
                seq_printf(seq, "%08lX %08lX %-3d %8ld %8ld %8ld",
                           (unsigned long) mfc->mfc_mcastgrp,
                           (unsigned long) mfc->mfc_origin,
@@ -1832,12 +1829,12 @@ static int ipmr_mfc_seq_show(struct seq_file *seq, void *v)
                           mfc->mfc_un.res.wrong_if);
 
                if (it->cache != &mfc_unres_queue) {
-                       for(n = mfc->mfc_un.res.minvif; 
+                       for(n = mfc->mfc_un.res.minvif;
                            n < mfc->mfc_un.res.maxvif; n++ ) {
-                               if(VIF_EXISTS(n) 
+                               if(VIF_EXISTS(n)
                                   && mfc->mfc_un.res.ttls[n] < 255)
-                               seq_printf(seq, 
-                                          " %2d:%-3d", 
+                               seq_printf(seq,
+                                          " %2d:%-3d",
                                           n, mfc->mfc_un.res.ttls[n]);
                        }
                }
@@ -1858,7 +1855,7 @@ static int ipmr_mfc_open(struct inode *inode, struct file *file)
        struct seq_file *seq;
        int rc = -ENOMEM;
        struct ipmr_mfc_iter *s = kmalloc(sizeof(*s), GFP_KERNEL);
-       
+
        if (!s)
                goto out;
 
@@ -1876,14 +1873,14 @@ out_kfree:
 
 }
 
-static struct file_operations ipmr_mfc_fops = {
+static const struct file_operations ipmr_mfc_fops = {
        .owner   = THIS_MODULE,
        .open    = ipmr_mfc_open,
        .read    = seq_read,
        .llseek  = seq_lseek,
        .release = seq_release_private,
 };
-#endif 
+#endif
 
 #ifdef CONFIG_IP_PIMSM_V2
 static struct net_protocol pim_protocol = {
@@ -1895,7 +1892,7 @@ static struct net_protocol pim_protocol = {
 /*
  *     Setup for IP multicast routing
  */
+
 void __init ip_mr_init(void)
 {
        mrt_cachep = kmem_cache_create("ip_mrt_cache",
@@ -1905,8 +1902,8 @@ void __init ip_mr_init(void)
        init_timer(&ipmr_expire_timer);
        ipmr_expire_timer.function=ipmr_expire_process;
        register_netdevice_notifier(&ip_mr_notifier);
-#ifdef CONFIG_PROC_FS  
+#ifdef CONFIG_PROC_FS
        proc_net_fops_create("ip_mr_vif", 0, &ipmr_vif_fops);
        proc_net_fops_create("ip_mr_cache", 0, &ipmr_mfc_fops);
-#endif 
+#endif
 }
index 6c40899aa16172a7f6bc79e9bcf590e43ebbd400..22e104c6a49387fafdd139f9ca1b07bd849fbc38 100644 (file)
@@ -561,7 +561,7 @@ static int ip_vs_app_open(struct inode *inode, struct file *file)
        return seq_open(file, &ip_vs_app_seq_ops);
 }
 
-static struct file_operations ip_vs_app_fops = {
+static const struct file_operations ip_vs_app_fops = {
        .owner   = THIS_MODULE,
        .open    = ip_vs_app_open,
        .read    = seq_read,
index 8086787a2c51e5c0df7f4043ac8778af0a819edf..7018f97c75dc64f18af0ffbced9734c1cf8d2dc7 100644 (file)
@@ -494,8 +494,8 @@ int ip_vs_check_template(struct ip_vs_conn *ct)
         * Checking the dest server status.
         */
        if ((dest == NULL) ||
-           !(dest->flags & IP_VS_DEST_F_AVAILABLE) || 
-           (sysctl_ip_vs_expire_quiescent_template && 
+           !(dest->flags & IP_VS_DEST_F_AVAILABLE) ||
+           (sysctl_ip_vs_expire_quiescent_template &&
             (atomic_read(&dest->weight) == 0))) {
                IP_VS_DBG(9, "check_template: dest not available for "
                          "protocol %s s:%u.%u.%u.%u:%d v:%u.%u.%u.%u:%d "
@@ -603,13 +603,12 @@ ip_vs_conn_new(int proto, __be32 caddr, __be16 cport, __be32 vaddr, __be16 vport
        struct ip_vs_conn *cp;
        struct ip_vs_protocol *pp = ip_vs_proto_get(proto);
 
-       cp = kmem_cache_alloc(ip_vs_conn_cachep, GFP_ATOMIC);
+       cp = kmem_cache_zalloc(ip_vs_conn_cachep, GFP_ATOMIC);
        if (cp == NULL) {
                IP_VS_ERR_RL("ip_vs_conn_new: no memory available.\n");
                return NULL;
        }
 
-       memset(cp, 0, sizeof(*cp));
        INIT_LIST_HEAD(&cp->c_list);
        init_timer(&cp->timer);
        cp->timer.data     = (unsigned long)cp;
@@ -667,7 +666,7 @@ static void *ip_vs_conn_array(struct seq_file *seq, loff_t pos)
 {
        int idx;
        struct ip_vs_conn *cp;
-       
+
        for(idx = 0; idx < IP_VS_CONN_TAB_SIZE; idx++) {
                ct_read_lock_bh(idx);
                list_for_each_entry(cp, &ip_vs_conn_tab[idx], c_list) {
@@ -695,7 +694,7 @@ static void *ip_vs_conn_seq_next(struct seq_file *seq, void *v, loff_t *pos)
        int idx;
 
        ++*pos;
-       if (v == SEQ_START_TOKEN) 
+       if (v == SEQ_START_TOKEN)
                return ip_vs_conn_array(seq, 0);
 
        /* more on same hash chain? */
@@ -710,7 +709,7 @@ static void *ip_vs_conn_seq_next(struct seq_file *seq, void *v, loff_t *pos)
                list_for_each_entry(cp, &ip_vs_conn_tab[idx], c_list) {
                        seq->private = &ip_vs_conn_tab[idx];
                        return cp;
-               }       
+               }
                ct_read_unlock_bh(idx);
        }
        seq->private = NULL;
@@ -758,7 +757,7 @@ static int ip_vs_conn_open(struct inode *inode, struct file *file)
        return seq_open(file, &ip_vs_conn_seq_ops);
 }
 
-static struct file_operations ip_vs_conn_fops = {
+static const struct file_operations ip_vs_conn_fops = {
        .owner   = THIS_MODULE,
        .open    = ip_vs_conn_open,
        .read    = seq_read,
index 34257520a3a6b8132eb87af036382aea06f753f2..24d7b66eb6d2dc2c49169af7db1a604d58420168 100644 (file)
@@ -813,14 +813,14 @@ ip_vs_out(unsigned int hooknum, struct sk_buff **pskb,
        skb->nh.iph->saddr = cp->vaddr;
        ip_send_check(skb->nh.iph);
 
-       /* For policy routing, packets originating from this
-        * machine itself may be routed differently to packets
-        * passing through.  We want this packet to be routed as
-        * if it came from this machine itself.  So re-compute
-        * the routing information.
-        */
-       if (ip_route_me_harder(pskb, RTN_LOCAL) != 0)
-               goto drop;
+       /* For policy routing, packets originating from this
+        * machine itself may be routed differently to packets
+        * passing through.  We want this packet to be routed as
+        * if it came from this machine itself.  So re-compute
+        * the routing information.
+        */
+       if (ip_route_me_harder(pskb, RTN_LOCAL) != 0)
+               goto drop;
        skb = *pskb;
 
        IP_VS_DBG_PKT(10, pp, skb, 0, "After SNAT");
@@ -847,7 +847,7 @@ ip_vs_out(unsigned int hooknum, struct sk_buff **pskb,
  *     forward to the right destination host if relevant.
  *     Currently handles error types - unreachable, quench, ttl exceeded.
  */
-static int 
+static int
 ip_vs_in_icmp(struct sk_buff **pskb, int *related, unsigned int hooknum)
 {
        struct sk_buff *skb = *pskb;
@@ -863,7 +863,7 @@ ip_vs_in_icmp(struct sk_buff **pskb, int *related, unsigned int hooknum)
        /* reassemble IP fragments */
        if (skb->nh.iph->frag_off & __constant_htons(IP_MF|IP_OFFSET)) {
                skb = ip_vs_gather_frags(skb,
-                                        hooknum == NF_IP_LOCAL_IN ?
+                                        hooknum == NF_IP_LOCAL_IN ?
                                         IP_DEFRAG_VS_IN : IP_DEFRAG_VS_FWD);
                if (!skb)
                        return NF_STOLEN;
index 9b933381ebbe7fc711b8f17d8ce6616d8dff0bdc..b3050a6817e7af88ed58b7213ee342b4c6f9f1bd 100644 (file)
@@ -1812,7 +1812,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations ip_vs_info_fops = {
+static const struct file_operations ip_vs_info_fops = {
        .owner   = THIS_MODULE,
        .open    = ip_vs_info_open,
        .read    = seq_read,
@@ -1859,7 +1859,7 @@ static int ip_vs_stats_seq_open(struct inode *inode, struct file *file)
        return single_open(file, ip_vs_stats_show, NULL);
 }
 
-static struct file_operations ip_vs_stats_fops = {
+static const struct file_operations ip_vs_stats_fops = {
        .owner = THIS_MODULE,
        .open = ip_vs_stats_seq_open,
        .read = seq_read,
@@ -2359,7 +2359,7 @@ int ip_vs_control_init(void)
        proc_net_fops_create("ip_vs", 0, &ip_vs_info_fops);
        proc_net_fops_create("ip_vs_stats",0, &ip_vs_stats_fops);
 
-       sysctl_header = register_sysctl_table(vs_root_table, 0);
+       sysctl_header = register_sysctl_table(vs_root_table);
 
        /* Initialize ip_vs_svc_table, ip_vs_svc_fwm_table, ip_vs_rtable */
        for(idx = 0; idx < IP_VS_SVC_TAB_SIZE; idx++)  {
index 687c1de1146fa7a6b510a88e563c8ab6037c48b4..847c47af040c475eef93f51156721c2da38110a0 100644 (file)
@@ -370,7 +370,7 @@ static int __init ip_vs_ftp_init(void)
                if (ret)
                        break;
                IP_VS_INFO("%s: loaded support on port[%d] = %d\n",
-                          app->name, i, ports[i]);
+                          app->name, i, ports[i]);
        }
 
        if (ret)
index a4385a2180ee6d3f890411927d3056fafbc48c34..c801273cb881151d65617f6c4ba6699bb26378ad 100644 (file)
@@ -118,7 +118,7 @@ static ctl_table vs_vars_table[] = {
                .procname       = "lblc_expiration",
                .data           = &sysctl_ip_vs_lblc_expiration,
                .maxlen         = sizeof(int),
-               .mode           = 0644, 
+               .mode           = 0644,
                .proc_handler   = &proc_dointvec_jiffies,
        },
        { .ctl_name = 0 }
@@ -128,7 +128,7 @@ static ctl_table vs_table[] = {
        {
                .ctl_name       = NET_IPV4_VS,
                .procname       = "vs",
-               .mode           = 0555, 
+               .mode           = 0555,
                .child          = vs_vars_table
        },
        { .ctl_name = 0 }
@@ -137,7 +137,7 @@ static ctl_table vs_table[] = {
 static ctl_table ipvs_ipv4_table[] = {
        {
                .ctl_name       = NET_IPV4,
-               .procname       = "ipv4", 
+               .procname       = "ipv4",
                .mode           = 0555,
                .child          = vs_table
        },
@@ -147,8 +147,8 @@ static ctl_table ipvs_ipv4_table[] = {
 static ctl_table lblc_root_table[] = {
        {
                .ctl_name       = CTL_NET,
-               .procname       = "net", 
-               .mode           = 0555, 
+               .procname       = "net",
+               .mode           = 0555,
                .child          = ipvs_ipv4_table
        },
        { .ctl_name = 0 }
@@ -288,7 +288,7 @@ static inline void ip_vs_lblc_full_check(struct ip_vs_lblc_table *tbl)
 
                write_lock(&tbl->lock);
                list_for_each_entry_safe(en, nxt, &tbl->bucket[j], list) {
-                       if (time_before(now, 
+                       if (time_before(now,
                                        en->lastuse + sysctl_ip_vs_lblc_expiration))
                                continue;
 
@@ -583,7 +583,7 @@ static struct ip_vs_scheduler ip_vs_lblc_scheduler =
 static int __init ip_vs_lblc_init(void)
 {
        INIT_LIST_HEAD(&ip_vs_lblc_scheduler.n_list);
-       sysctl_header = register_sysctl_table(lblc_root_table, 0);
+       sysctl_header = register_sysctl_table(lblc_root_table);
        return register_ip_vs_scheduler(&ip_vs_lblc_scheduler);
 }
 
index fe1af5d079afdee89edb20a6cfe78847acfa17cd..23f9b9e73c850f9a00e4d38c979023ad062f857b 100644 (file)
@@ -307,7 +307,7 @@ static ctl_table vs_vars_table[] = {
                .procname       = "lblcr_expiration",
                .data           = &sysctl_ip_vs_lblcr_expiration,
                .maxlen         = sizeof(int),
-               .mode           = 0644, 
+               .mode           = 0644,
                .proc_handler   = &proc_dointvec_jiffies,
        },
        { .ctl_name = 0 }
@@ -326,7 +326,7 @@ static ctl_table vs_table[] = {
 static ctl_table ipvs_ipv4_table[] = {
        {
                .ctl_name       = NET_IPV4,
-               .procname       = "ipv4", 
+               .procname       = "ipv4",
                .mode           = 0555,
                .child          = vs_table
        },
@@ -336,8 +336,8 @@ static ctl_table ipvs_ipv4_table[] = {
 static ctl_table lblcr_root_table[] = {
        {
                .ctl_name       = CTL_NET,
-               .procname       = "net", 
-               .mode           = 0555, 
+               .procname       = "net",
+               .mode           = 0555,
                .child          = ipvs_ipv4_table
        },
        { .ctl_name = 0 }
@@ -841,7 +841,7 @@ static struct ip_vs_scheduler ip_vs_lblcr_scheduler =
 static int __init ip_vs_lblcr_init(void)
 {
        INIT_LIST_HEAD(&ip_vs_lblcr_scheduler.n_list);
-       sysctl_header = register_sysctl_table(lblcr_root_table, 0);
+       sysctl_header = register_sysctl_table(lblcr_root_table);
 #ifdef CONFIG_IP_VS_LBLCR_DEBUG
        proc_net_create("ip_vs_lblcr", 0, ip_vs_lblcr_getinfo);
 #endif
index b23bab231cabfe0de3ff8647907c19d51b152522..433f8a947924fa1b17091e0f9b8f292570dafcbf 100644 (file)
@@ -68,7 +68,7 @@ ip_vs_rr_schedule(struct ip_vs_service *svc, const struct sk_buff *skb)
                        q = q->next;
                        continue;
                }
-               
+
                dest = list_entry(q, struct ip_vs_dest, n_list);
                if (!(dest->flags & IP_VS_DEST_F_OVERLOAD) &&
                    atomic_read(&dest->weight) > 0)
index 8bc42b76223db8555bb2edb97cfea61c24d303d3..1602304abbf9e9055388c680503fa0325ce4ab8a 100644 (file)
@@ -20,7 +20,6 @@
  */
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/spinlock.h>
 #include <linux/interrupt.h>
 #include <asm/string.h>
index 252e837b17a52d54079db9c1eb5a1f62d5889a4c..574c735836fc9373f2d4d66115ea07b4ad7cf484 100644 (file)
@@ -15,7 +15,6 @@
 #include <asm/system.h>
 #include <asm/uaccess.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/timer.h>
 #include <linux/mm.h>
@@ -134,7 +133,7 @@ static void drr_select_route(const struct flowi *flp,
                             struct rtable *first, struct rtable **rp)
 {
        struct rtable *nh, *result, *cur_min;
-       int min_usecount = -1; 
+       int min_usecount = -1;
        int devidx = -1;
        int cur_min_devidx = -1;
 
@@ -143,7 +142,7 @@ static void drr_select_route(const struct flowi *flp,
        result = NULL;
        cur_min = NULL;
        for (nh = rcu_dereference(first); nh;
-            nh = rcu_dereference(nh->u.rt_next)) {
+            nh = rcu_dereference(nh->u.dst.rt_next)) {
                if ((nh->u.dst.flags & DST_BALANCED) != 0 &&
                    multipath_comparekeys(&nh->fl, flp)) {
                        int nh_ifidx = nh->u.dst.dev->ifindex;
@@ -161,7 +160,7 @@ static void drr_select_route(const struct flowi *flp,
                         */
                        devidx = __multipath_finddev(nh_ifidx);
                        if (devidx == -1) {
-                               /* add the interface to the array 
+                               /* add the interface to the array
                                 * SMP safe
                                 */
                                spin_lock_bh(&state_lock);
index b8c289f247cbb2622bbabe2fdfc0a2e028931962..57f481498fbb39d99338187b9a0653efbb692b7a 100644 (file)
@@ -15,7 +15,6 @@
 #include <asm/system.h>
 #include <asm/uaccess.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/timer.h>
 #include <linux/mm.h>
@@ -74,7 +73,7 @@ static void random_select_route(const struct flowi *flp,
 
        /* count all candidate */
        for (rt = rcu_dereference(first); rt;
-            rt = rcu_dereference(rt->u.rt_next)) {
+            rt = rcu_dereference(rt->u.dst.rt_next)) {
                if ((rt->u.dst.flags & DST_BALANCED) != 0 &&
                    multipath_comparekeys(&rt->fl, flp))
                        ++candidate_count;
@@ -90,7 +89,7 @@ static void random_select_route(const struct flowi *flp,
                /* find chosen candidate and adjust GC data for all candidates
                 * to ensure they stay in cache
                 */
-               for (rt = first; rt; rt = rt->u.rt_next) {
+               for (rt = first; rt; rt = rt->u.dst.rt_next) {
                        if ((rt->u.dst.flags & DST_BALANCED) != 0 &&
                            multipath_comparekeys(&rt->fl, flp)) {
                                rt->u.dst.lastuse = jiffies;
index bba5abe5542d3a49dff281c9a222b335f0e2ee00..0ad22524f450dcbb0fad212dec428fa70472ed22 100644 (file)
@@ -15,7 +15,6 @@
 #include <asm/system.h>
 #include <asm/uaccess.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/timer.h>
 #include <linux/mm.h>
@@ -58,7 +57,7 @@ static void rr_select_route(const struct flowi *flp,
         */
        result = NULL;
        for (nh = rcu_dereference(first); nh;
-            nh = rcu_dereference(nh->u.rt_next)) {
+            nh = rcu_dereference(nh->u.dst.rt_next)) {
                if ((nh->u.dst.flags & DST_BALANCED) != 0 &&
                    multipath_comparekeys(&nh->fl, flp)) {
                        nh->u.dst.lastuse = jiffies;
index 92b04823e034292328be4cf92c2891ce8e05b9fd..2bdbb92b450adbf859501a5d83008d2521a80818 100644 (file)
@@ -15,7 +15,6 @@
 #include <asm/system.h>
 #include <asm/uaccess.h>
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/timer.h>
 #include <linux/mm.h>
@@ -142,7 +141,7 @@ out:
        return weight;
 }
 
-static void wrandom_init_state(void) 
+static void wrandom_init_state(void)
 {
        int i;
 
@@ -167,7 +166,7 @@ static void wrandom_select_route(const struct flowi *flp,
 
        /* collect all candidates and identify their weights */
        for (rt = rcu_dereference(first); rt;
-            rt = rcu_dereference(rt->u.rt_next)) {
+            rt = rcu_dereference(rt->u.dst.rt_next)) {
                if ((rt->u.dst.flags & DST_BALANCED) != 0 &&
                    multipath_comparekeys(&rt->fl, flp)) {
                        struct multipath_candidate* mpc =
@@ -287,7 +286,7 @@ static void __multipath_free(struct rcu_head *head)
 
 static void __multipath_free_dst(struct rcu_head *head)
 {
-       struct multipath_dest *dst = container_of(head,
+       struct multipath_dest *dst = container_of(head,
                                                  struct multipath_dest,
                                                  rcu);
        kfree(dst);
index c47ce7076bd55fd66b4688d2d081daa9c2a3aca2..6069a11514f66a5322074f4783edbb32b1738b92 100644 (file)
@@ -53,7 +53,7 @@ int ip_route_me_harder(struct sk_buff **pskb, unsigned addr_type)
                dst_release(&rt->u.dst);
                dst_release(odst);
        }
-       
+
        if ((*pskb)->dst->error)
                return -1;
 
@@ -70,7 +70,7 @@ int ip_route_me_harder(struct sk_buff **pskb, unsigned addr_type)
                struct sk_buff *nskb;
 
                nskb = skb_realloc_headroom(*pskb, hh_len);
-               if (!nskb) 
+               if (!nskb)
                        return -1;
                if ((*pskb)->sk)
                        skb_set_owner_w(nskb, (*pskb)->sk);
@@ -177,7 +177,7 @@ __sum16 nf_ip_checksum(struct sk_buff *skb, unsigned int hook,
                        break;
                if ((protocol == 0 && !csum_fold(skb->csum)) ||
                    !csum_tcpudp_magic(iph->saddr, iph->daddr,
-                                      skb->len - dataoff, protocol,
+                                      skb->len - dataoff, protocol,
                                       skb->csum)) {
                        skb->ip_summed = CHECKSUM_UNNECESSARY;
                        break;
index 9b08e7ad71bc3cb6bd1358ae880987812260e2a8..601808c796ec16ca59cbd7fbccee71891cacb268 100644 (file)
@@ -226,7 +226,7 @@ config IP_NF_QUEUE
 
 config IP_NF_IPTABLES
        tristate "IP tables support (required for filtering/masq/NAT)"
-       depends on NETFILTER_XTABLES
+       select NETFILTER_XTABLES
        help
          iptables is a general, extensible packet identification framework.
          The packet filtering and full NAT (masquerading, port forwarding,
@@ -606,7 +606,9 @@ config IP_NF_TARGET_TTL
 config IP_NF_TARGET_CLUSTERIP
        tristate "CLUSTERIP target support (EXPERIMENTAL)"
        depends on IP_NF_MANGLE && EXPERIMENTAL
-       depends on (IP_NF_CONNTRACK && IP_NF_CONNTRACK_MARK) || (NF_CONNTRACK_MARK && NF_CONNTRACK_IPV4)
+       depends on IP_NF_CONNTRACK || NF_CONNTRACK_IPV4
+       select IP_NF_CONNTRACK_MARK if IP_NF_CONNTRACK
+       select NF_CONNTRACK_MARK if NF_CONNTRACK_IPV4
        help
          The CLUSTERIP target allows you to build load-balancing clusters of
          network servers without having a dedicated load-balancing
@@ -629,7 +631,7 @@ config IP_NF_RAW
 # ARP tables
 config IP_NF_ARPTABLES
        tristate "ARP tables support"
-       depends on NETFILTER_XTABLES
+       select NETFILTER_XTABLES
        help
          arptables is a general, extensible packet identification framework.
          The ARP packet filtering and mangling (manipulation)subsystems
index 9aa22398b3dc9dca9da657ef86c696754ce11ef0..5170f5c75f9d1742e4f47cfdc693543b744cfe10 100644 (file)
@@ -544,7 +544,7 @@ static inline int check_entry_size_and_hooks(struct arpt_entry *e,
        }
 
        /* FIXME: underflows must be unconditional, standard verdicts
-           < 0 (not ARPT_RETURN). --RR */
+          < 0 (not ARPT_RETURN). --RR */
 
        /* Clear counters and comefrom */
        e->counters = ((struct xt_counters) { 0, 0 });
@@ -869,8 +869,8 @@ static int do_replace(void __user *user, unsigned int len)
        /* Update module usage count based on number of rules */
        duprintf("do_replace: oldnum=%u, initnum=%u, newnum=%u\n",
                oldinfo->number, oldinfo->initial_entries, newinfo->number);
-       if ((oldinfo->number > oldinfo->initial_entries) || 
-           (newinfo->number <= oldinfo->initial_entries)) 
+       if ((oldinfo->number > oldinfo->initial_entries) ||
+           (newinfo->number <= oldinfo->initial_entries))
                module_put(t->me);
        if ((oldinfo->number > oldinfo->initial_entries) &&
            (newinfo->number <= oldinfo->initial_entries))
index d12b1df252a1d985376bb82b7cc1604b31c61056..709db4d3f48f7fe9d7fb3f17a844595e9a690bde 100644 (file)
@@ -67,7 +67,7 @@ target(struct sk_buff **pskb,
 
 static int
 checkentry(const char *tablename, const void *e, const struct xt_target *target,
-           void *targinfo, unsigned int hook_mask)
+          void *targinfo, unsigned int hook_mask)
 {
        const struct arpt_mangle *mangle = targinfo;
 
index ad246ba7790b0c2718fdaaf12ed7eb0d597ea357..4f561f52c83a52c42baea4019023f6d641cd4c93 100644 (file)
@@ -9,7 +9,7 @@
  *
  *     Module load syntax:
  *     insmod ip_conntrack_amanda.o [master_timeout=n]
- *     
+ *
  *     Where master_timeout is the timeout (in seconds) of the master
  *     connection (port 10080).  This defaults to 5 minutes but if
  *     your clients take longer than 5 minutes to do their work
@@ -84,7 +84,7 @@ static struct {
 };
 
 static int help(struct sk_buff **pskb,
-                struct ip_conntrack *ct, enum ip_conntrack_info ctinfo)
+               struct ip_conntrack *ct, enum ip_conntrack_info ctinfo)
 {
        struct ts_state ts;
        struct ip_conntrack_expect *exp;
index 8556a4f4f60abde4adf99135e4c28967f4d2d96b..07ba1dd136b5b2e711336cdb0828291d012edc54 100644 (file)
@@ -2,7 +2,7 @@
    but required by, the NAT layer; it can also be used by an iptables
    extension. */
 
-/* (C) 1999-2001 Paul `Rusty' Russell  
+/* (C) 1999-2001 Paul `Rusty' Russell
  * (C) 2002-2004 Netfilter Core Team <coreteam@netfilter.org>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -99,7 +99,7 @@ __ip_ct_deliver_cached_events(struct ip_conntrack_ecache *ecache)
 void ip_ct_deliver_cached_events(const struct ip_conntrack *ct)
 {
        struct ip_conntrack_ecache *ecache;
-       
+
        local_bh_disable();
        ecache = &__get_cpu_var(ip_conntrack_ecache);
        if (ecache->ct == ct)
@@ -147,9 +147,9 @@ static u_int32_t __hash_conntrack(const struct ip_conntrack_tuple *tuple,
                            unsigned int size, unsigned int rnd)
 {
        return (jhash_3words((__force u32)tuple->src.ip,
-                            ((__force u32)tuple->dst.ip ^ tuple->dst.protonum),
-                            (tuple->src.u.all | (tuple->dst.u.all << 16)),
-                            rnd) % size);
+                            ((__force u32)tuple->dst.ip ^ tuple->dst.protonum),
+                            (tuple->src.u.all | (tuple->dst.u.all << 16)),
+                            rnd) % size);
 }
 
 static u_int32_t
@@ -219,7 +219,7 @@ struct ip_conntrack_expect *
 __ip_conntrack_expect_find(const struct ip_conntrack_tuple *tuple)
 {
        struct ip_conntrack_expect *i;
-       
+
        list_for_each_entry(i, &ip_conntrack_expect_list, list) {
                if (ip_ct_tuple_mask_cmp(tuple, &i->tuple, &i->mask))
                        return i;
@@ -232,7 +232,7 @@ struct ip_conntrack_expect *
 ip_conntrack_expect_find_get(const struct ip_conntrack_tuple *tuple)
 {
        struct ip_conntrack_expect *i;
-       
+
        read_lock_bh(&ip_conntrack_lock);
        i = __ip_conntrack_expect_find(tuple);
        if (i)
@@ -303,6 +303,7 @@ destroy_conntrack(struct nf_conntrack *nfct)
        struct ip_conntrack *ct = (struct ip_conntrack *)nfct;
        struct ip_conntrack_protocol *proto;
        struct ip_conntrack_helper *helper;
+       typeof(ip_conntrack_destroyed) destroyed;
 
        DEBUGP("destroy_conntrack(%p)\n", ct);
        IP_NF_ASSERT(atomic_read(&nfct->use) == 0);
@@ -318,12 +319,16 @@ destroy_conntrack(struct nf_conntrack *nfct)
        /* To make sure we don't get any weird locking issues here:
         * destroy_conntrack() MUST NOT be called with a write lock
         * to ip_conntrack_lock!!! -HW */
+       rcu_read_lock();
        proto = __ip_conntrack_proto_find(ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.protonum);
        if (proto && proto->destroy)
                proto->destroy(ct);
 
-       if (ip_conntrack_destroyed)
-               ip_conntrack_destroyed(ct);
+       destroyed = rcu_dereference(ip_conntrack_destroyed);
+       if (destroyed)
+               destroyed(ct);
+
+       rcu_read_unlock();
 
        write_lock_bh(&ip_conntrack_lock);
        /* Expectations will have been removed in clean_from_lists,
@@ -398,7 +403,7 @@ ip_conntrack_find_get(const struct ip_conntrack_tuple *tuple,
 
 static void __ip_conntrack_hash_insert(struct ip_conntrack *ct,
                                        unsigned int hash,
-                                       unsigned int repl_hash) 
+                                       unsigned int repl_hash)
 {
        ct->id = ++ip_conntrack_next_id;
        list_add(&ct->tuplehash[IP_CT_DIR_ORIGINAL].list,
@@ -446,15 +451,15 @@ __ip_conntrack_confirm(struct sk_buff **pskb)
        /* IP_NF_ASSERT(atomic_read(&ct->ct_general.use) == 1); */
 
        /* No external references means noone else could have
-           confirmed us. */
+          confirmed us. */
        IP_NF_ASSERT(!is_confirmed(ct));
        DEBUGP("Confirming conntrack %p\n", ct);
 
        write_lock_bh(&ip_conntrack_lock);
 
        /* See if there's one in the list already, including reverse:
-           NAT could have grabbed it without realizing, since we're
-           not in the hash.  If there is, we lost race. */
+          NAT could have grabbed it without realizing, since we're
+          not in the hash.  If there is, we lost race. */
        list_for_each_entry(h, &ip_conntrack_hash[hash], list)
                if (ip_ct_tuple_equal(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple,
                                      &h->tuple))
@@ -536,7 +541,7 @@ static int early_drop(struct list_head *chain)
        if (del_timer(&ct->timeout)) {
                death_by_timeout((unsigned long)ct);
                dropped = 1;
-               CONNTRACK_STAT_INC(early_drop);
+               CONNTRACK_STAT_INC_ATOMIC(early_drop);
        }
        ip_conntrack_put(ct);
        return dropped;
@@ -595,14 +600,14 @@ ip_conntrack_proto_find_get(u_int8_t protocol)
 {
        struct ip_conntrack_protocol *p;
 
-       preempt_disable();
+       rcu_read_lock();
        p = __ip_conntrack_proto_find(protocol);
        if (p) {
                if (!try_module_get(p->me))
                        p = &ip_conntrack_generic_protocol;
        }
-       preempt_enable();
-       
+       rcu_read_unlock();
+
        return p;
 }
 
@@ -638,14 +643,13 @@ struct ip_conntrack *ip_conntrack_alloc(struct ip_conntrack_tuple *orig,
                }
        }
 
-       conntrack = kmem_cache_alloc(ip_conntrack_cachep, GFP_ATOMIC);
+       conntrack = kmem_cache_zalloc(ip_conntrack_cachep, GFP_ATOMIC);
        if (!conntrack) {
                DEBUGP("Can't allocate conntrack.\n");
                atomic_dec(&ip_conntrack_count);
                return ERR_PTR(-ENOMEM);
        }
 
-       memset(conntrack, 0, sizeof(*conntrack));
        atomic_set(&conntrack->ct_general.use, 1);
        conntrack->ct_general.destroy = destroy_conntrack;
        conntrack->tuplehash[IP_CT_DIR_ORIGINAL].tuple = *orig;
@@ -746,7 +750,7 @@ resolve_normal_ct(struct sk_buff *skb,
 
        IP_NF_ASSERT((skb->nh.iph->frag_off & htons(IP_OFFSET)) == 0);
 
-       if (!ip_ct_get_tuple(skb->nh.iph, skb, skb->nh.iph->ihl*4, 
+       if (!ip_ct_get_tuple(skb->nh.iph, skb, skb->nh.iph->ihl*4,
                                &tuple,proto))
                return NULL;
 
@@ -771,7 +775,7 @@ resolve_normal_ct(struct sk_buff *skb,
                if (test_bit(IPS_SEEN_REPLY_BIT, &ct->status)) {
                        DEBUGP("ip_conntrack_in: normal packet for %p\n",
                               ct);
-                       *ctinfo = IP_CT_ESTABLISHED;
+                       *ctinfo = IP_CT_ESTABLISHED;
                } else if (test_bit(IPS_EXPECTED_BIT, &ct->status)) {
                        DEBUGP("ip_conntrack_in: related packet for %p\n",
                               ct);
@@ -803,7 +807,7 @@ unsigned int ip_conntrack_in(unsigned int hooknum,
 
        /* Previously seen (loopback or untracked)?  Ignore. */
        if ((*pskb)->nfct) {
-               CONNTRACK_STAT_INC(ignore);
+               CONNTRACK_STAT_INC_ATOMIC(ignore);
                return NF_ACCEPT;
        }
 
@@ -822,7 +826,7 @@ unsigned int ip_conntrack_in(unsigned int hooknum,
        if ((*pskb)->pkt_type == PACKET_BROADCAST) {
                printk("Broadcast packet!\n");
                return NF_ACCEPT;
-       } else if (((*pskb)->nh.iph->daddr & htonl(0x000000FF)) 
+       } else if (((*pskb)->nh.iph->daddr & htonl(0x000000FF))
                   == htonl(0x000000FF)) {
                printk("Should bcast: %u.%u.%u.%u->%u.%u.%u.%u (sk=%p, ptype=%u)\n",
                       NIPQUAD((*pskb)->nh.iph->saddr),
@@ -831,27 +835,28 @@ unsigned int ip_conntrack_in(unsigned int hooknum,
        }
 #endif
 
+       /* rcu_read_lock()ed by nf_hook_slow */
        proto = __ip_conntrack_proto_find((*pskb)->nh.iph->protocol);
 
        /* It may be an special packet, error, unclean...
         * inverse of the return code tells to the netfilter
         * core what to do with the packet. */
-       if (proto->error != NULL 
+       if (proto->error != NULL
            && (ret = proto->error(*pskb, &ctinfo, hooknum)) <= 0) {
-               CONNTRACK_STAT_INC(error);
-               CONNTRACK_STAT_INC(invalid);
+               CONNTRACK_STAT_INC_ATOMIC(error);
+               CONNTRACK_STAT_INC_ATOMIC(invalid);
                return -ret;
        }
 
        if (!(ct = resolve_normal_ct(*pskb, proto,&set_reply,hooknum,&ctinfo))) {
                /* Not valid part of a connection */
-               CONNTRACK_STAT_INC(invalid);
+               CONNTRACK_STAT_INC_ATOMIC(invalid);
                return NF_ACCEPT;
        }
 
        if (IS_ERR(ct)) {
                /* Too stressed to deal. */
-               CONNTRACK_STAT_INC(drop);
+               CONNTRACK_STAT_INC_ATOMIC(drop);
                return NF_DROP;
        }
 
@@ -863,7 +868,7 @@ unsigned int ip_conntrack_in(unsigned int hooknum,
                 * the netfilter core what to do*/
                nf_conntrack_put((*pskb)->nfct);
                (*pskb)->nfct = NULL;
-               CONNTRACK_STAT_INC(invalid);
+               CONNTRACK_STAT_INC_ATOMIC(invalid);
                return -ret;
        }
 
@@ -876,8 +881,15 @@ unsigned int ip_conntrack_in(unsigned int hooknum,
 int invert_tuplepr(struct ip_conntrack_tuple *inverse,
                   const struct ip_conntrack_tuple *orig)
 {
-       return ip_ct_invert_tuple(inverse, orig, 
-                                 __ip_conntrack_proto_find(orig->dst.protonum));
+       struct ip_conntrack_protocol *proto;
+       int ret;
+
+       rcu_read_lock();
+       proto = __ip_conntrack_proto_find(orig->dst.protonum);
+       ret = ip_ct_invert_tuple(inverse, orig, proto);
+       rcu_read_unlock();
+
+       return ret;
 }
 
 /* Would two expected things clash? */
@@ -885,7 +897,7 @@ static inline int expect_clash(const struct ip_conntrack_expect *a,
                               const struct ip_conntrack_expect *b)
 {
        /* Part covered by intersection of masks must be unequal,
-           otherwise they clash */
+          otherwise they clash */
        struct ip_conntrack_tuple intersect_mask
                = { { a->mask.src.ip & b->mask.src.ip,
                      { a->mask.src.u.all & b->mask.src.u.all } },
@@ -923,7 +935,7 @@ void ip_conntrack_unexpect_related(struct ip_conntrack_expect *exp)
 }
 
 /* We don't increase the master conntrack refcount for non-fulfilled
- * conntracks. During the conntrack destruction, the expectations are 
+ * conntracks. During the conntrack destruction, the expectations are
  * always killed before the conntrack itself */
 struct ip_conntrack_expect *ip_conntrack_expect_alloc(struct ip_conntrack *me)
 {
@@ -1012,7 +1024,7 @@ int ip_conntrack_expect_related(struct ip_conntrack_expect *expect)
        }
 
        /* Will be over limit? */
-       if (expect->master->helper->max_expected && 
+       if (expect->master->helper->max_expected &&
            expect->master->expecting >= expect->master->helper->max_expected)
                evict_oldest_expect(expect->master);
 
@@ -1021,7 +1033,7 @@ int ip_conntrack_expect_related(struct ip_conntrack_expect *expect)
        ret = 0;
 out:
        write_unlock_bh(&ip_conntrack_lock);
-       return ret;
+       return ret;
 }
 
 /* Alter reply tuple (maybe alter helper).  This is for NAT, and is
@@ -1069,7 +1081,7 @@ static inline void unhelp(struct ip_conntrack_tuple_hash *i,
                          const struct ip_conntrack_helper *me)
 {
        if (tuplehash_to_ctrack(i)->helper == me) {
-               ip_conntrack_event(IPCT_HELPER, tuplehash_to_ctrack(i));
+               ip_conntrack_event(IPCT_HELPER, tuplehash_to_ctrack(i));
                tuplehash_to_ctrack(i)->helper = NULL;
        }
 }
@@ -1105,8 +1117,8 @@ void ip_conntrack_helper_unregister(struct ip_conntrack_helper *me)
 }
 
 /* Refresh conntrack for this many jiffies and do accounting if do_acct is 1 */
-void __ip_ct_refresh_acct(struct ip_conntrack *ct, 
-                       enum ip_conntrack_info ctinfo,
+void __ip_ct_refresh_acct(struct ip_conntrack *ct,
+                       enum ip_conntrack_info ctinfo,
                        const struct sk_buff *skb,
                        unsigned long extra_jiffies,
                        int do_acct)
@@ -1140,7 +1152,7 @@ void __ip_ct_refresh_acct(struct ip_conntrack *ct,
 #ifdef CONFIG_IP_NF_CT_ACCT
        if (do_acct) {
                ct->counters[CTINFO2DIR(ctinfo)].packets++;
-               ct->counters[CTINFO2DIR(ctinfo)].bytes += 
+               ct->counters[CTINFO2DIR(ctinfo)].bytes +=
                                                ntohs(skb->nh.iph->tot_len);
                if ((ct->counters[CTINFO2DIR(ctinfo)].packets & 0x80000000)
                    || (ct->counters[CTINFO2DIR(ctinfo)].bytes & 0x80000000))
@@ -1194,7 +1206,7 @@ ip_ct_gather_frags(struct sk_buff *skb, u_int32_t user)
 {
        skb_orphan(skb);
 
-       local_bh_disable(); 
+       local_bh_disable();
        skb = ip_defrag(skb, user);
        local_bh_enable();
 
@@ -1211,7 +1223,7 @@ static void ip_conntrack_attach(struct sk_buff *nskb, struct sk_buff *skb)
 
        /* This ICMP is in reverse direction to the packet which caused it */
        ct = ip_conntrack_get(skb, &ctinfo);
-       
+
        if (CTINFO2DIR(ctinfo) == IP_CT_DIR_ORIGINAL)
                ctinfo = IP_CT_RELATED + IP_CT_IS_REPLY;
        else
@@ -1279,7 +1291,7 @@ getorigdst(struct sock *sk, int optval, void __user *user, int *len)
        struct inet_sock *inet = inet_sk(sk);
        struct ip_conntrack_tuple_hash *h;
        struct ip_conntrack_tuple tuple;
-       
+
        IP_CT_TUPLE_U_BLANK(&tuple);
        tuple.src.ip = inet->rcv_saddr;
        tuple.src.u.tcp.port = inet->sport;
@@ -1347,7 +1359,7 @@ static void free_conntrack_hash(struct list_head *hash, int vmalloced,int size)
        if (vmalloced)
                vfree(hash);
        else
-               free_pages((unsigned long)hash, 
+               free_pages((unsigned long)hash,
                           get_order(sizeof(struct list_head) * size));
 }
 
@@ -1355,11 +1367,11 @@ static void free_conntrack_hash(struct list_head *hash, int vmalloced,int size)
    supposed to kill the mall. */
 void ip_conntrack_cleanup(void)
 {
-       ip_ct_attach = NULL;
+       rcu_assign_pointer(ip_ct_attach, NULL);
 
        /* This makes sure all current packets have passed through
-           netfilter framework.  Roll on, two-stage module
-           delete... */
+          netfilter framework.  Roll on, two-stage module
+          delete... */
        synchronize_net();
 
        ip_ct_event_cache_flush();
@@ -1385,11 +1397,11 @@ static struct list_head *alloc_hashtable(int size, int *vmalloced)
        struct list_head *hash;
        unsigned int i;
 
-       *vmalloced = 0; 
-       hash = (void*)__get_free_pages(GFP_KERNEL, 
+       *vmalloced = 0;
+       hash = (void*)__get_free_pages(GFP_KERNEL,
                                       get_order(sizeof(struct list_head)
                                                 * size));
-       if (!hash) { 
+       if (!hash) {
                *vmalloced = 1;
                printk(KERN_WARNING"ip_conntrack: falling back to vmalloc.\n");
                hash = vmalloc(sizeof(struct list_head) * size);
@@ -1422,7 +1434,7 @@ static int set_hashsize(const char *val, struct kernel_param *kp)
        if (!hash)
                return -ENOMEM;
 
-       /* We have to rehash for the new table anyway, so we also can 
+       /* We have to rehash for the new table anyway, so we also can
         * use a new random seed */
        get_random_bytes(&rnd, 4);
 
@@ -1460,7 +1472,7 @@ int __init ip_conntrack_init(void)
 
        /* Idea from tcp.c: use 1/16384 of memory.  On i386: 32MB
         * machine has 256 buckets.  >= 1GB machines have 8192 buckets. */
-       if (!ip_conntrack_htable_size) {
+       if (!ip_conntrack_htable_size) {
                ip_conntrack_htable_size
                        = (((num_physpages << PAGE_SHIFT) / 16384)
                           / sizeof(struct list_head));
@@ -1490,8 +1502,8 @@ int __init ip_conntrack_init(void)
        }
 
        ip_conntrack_cachep = kmem_cache_create("ip_conntrack",
-                                               sizeof(struct ip_conntrack), 0,
-                                               0, NULL, NULL);
+                                               sizeof(struct ip_conntrack), 0,
+                                               0, NULL, NULL);
        if (!ip_conntrack_cachep) {
                printk(KERN_ERR "Unable to create ip_conntrack slab cache\n");
                goto err_free_hash;
@@ -1508,15 +1520,15 @@ int __init ip_conntrack_init(void)
        /* Don't NEED lock here, but good form anyway. */
        write_lock_bh(&ip_conntrack_lock);
        for (i = 0; i < MAX_IP_CT_PROTO; i++)
-               ip_ct_protos[i] = &ip_conntrack_generic_protocol;
+               rcu_assign_pointer(ip_ct_protos[i], &ip_conntrack_generic_protocol);
        /* Sew in builtin protocols. */
-       ip_ct_protos[IPPROTO_TCP] = &ip_conntrack_protocol_tcp;
-       ip_ct_protos[IPPROTO_UDP] = &ip_conntrack_protocol_udp;
-       ip_ct_protos[IPPROTO_ICMP] = &ip_conntrack_protocol_icmp;
+       rcu_assign_pointer(ip_ct_protos[IPPROTO_TCP], &ip_conntrack_protocol_tcp);
+       rcu_assign_pointer(ip_ct_protos[IPPROTO_UDP], &ip_conntrack_protocol_udp);
+       rcu_assign_pointer(ip_ct_protos[IPPROTO_ICMP], &ip_conntrack_protocol_icmp);
        write_unlock_bh(&ip_conntrack_lock);
 
        /* For use by ipt_REJECT */
-       ip_ct_attach = ip_conntrack_attach;
+       rcu_assign_pointer(ip_ct_attach, ip_conntrack_attach);
 
        /* Set up fake conntrack:
            - to never be deleted, not in any hashes */
index 0410c99cacae04d835b6f63ed789a8d54d81b4e7..1faa68ab9432e3a830f220ccde7b1348a9762f1d 100644 (file)
@@ -1,6 +1,6 @@
 /* FTP extension for IP connection tracking. */
 
-/* (C) 1999-2001 Paul `Rusty' Russell  
+/* (C) 1999-2001 Paul `Rusty' Russell
  * (C) 2002-2004 Netfilter Core Team <coreteam@netfilter.org>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -169,7 +169,7 @@ static int try_eprt(const char *data, size_t dlen, u_int32_t array[6],
        int length;
 
        /* First character is delimiter, then "1" for IPv4, then
-           delimiter again. */
+          delimiter again. */
        if (dlen <= 3) return 0;
        delim = data[0];
        if (isdigit(delim) || delim < 33 || delim > 126
@@ -344,14 +344,14 @@ static int help(struct sk_buff **pskb,
        if (!find_nl_seq(ntohl(th->seq), ct_ftp_info, dir)) {
                /* Now if this ends in \n, update ftp info. */
                DEBUGP("ip_conntrack_ftp_help: wrong seq pos %s(%u) or %s(%u)\n",
-                      ct_ftp_info->seq_aft_nl[0][dir] 
+                      ct_ftp_info->seq_aft_nl[0][dir]
                       old_seq_aft_nl_set ? "":"(UNSET) ", old_seq_aft_nl);
                ret = NF_ACCEPT;
                goto out_update_nl;
        }
 
        /* Initialize IP array to expected address (it's not mentioned
-           in EPSV responses) */
+          in EPSV responses) */
        array[0] = (ntohl(ct->tuplehash[dir].tuple.src.ip) >> 24) & 0xFF;
        array[1] = (ntohl(ct->tuplehash[dir].tuple.src.ip) >> 16) & 0xFF;
        array[2] = (ntohl(ct->tuplehash[dir].tuple.src.ip) >> 8) & 0xFF;
@@ -386,7 +386,7 @@ static int help(struct sk_buff **pskb,
 
        DEBUGP("conntrack_ftp: match `%s' (%u bytes at %u)\n",
               fb_ptr + matchoff, matchlen, ntohl(th->seq) + matchoff);
-                        
+
        /* Allocate expectation which will be inserted */
        exp = ip_conntrack_expect_alloc(ct);
        if (exp == NULL) {
@@ -504,7 +504,7 @@ static int __init ip_conntrack_ftp_init(void)
                        sprintf(tmpname, "ftp-%d", ports[i]);
                ftp[i].name = tmpname;
 
-               DEBUGP("ip_ct_ftp: registering helper for port %d\n", 
+               DEBUGP("ip_ct_ftp: registering helper for port %d\n",
                                ports[i]);
                ret = ip_conntrack_helper_register(&ftp[i]);
 
index aabfe1c06905fac1f3852ed4faafb89e5c7e7d41..53eb365ccc7e507f7ecac494265418e65b54b6f2 100644 (file)
@@ -42,7 +42,7 @@ MODULE_PARM_DESC(gkrouted_only, "only accept calls from gatekeeper");
 static int callforward_filter = 1;
 module_param(callforward_filter, bool, 0600);
 MODULE_PARM_DESC(callforward_filter, "only create call forwarding expectations "
-                                    "if both endpoints are on different sides "
+                                    "if both endpoints are on different sides "
                                     "(determined by routing information)");
 
 /* Hooks for NAT */
index 4d19373bbf0d58c85f4e0e6c9fe7151abc51954c..2b760c5cf709a32987b916f032ecd2b11b1bfcd6 100644 (file)
@@ -560,7 +560,7 @@ conntrack_pptp_help(struct sk_buff **pskb,
        tcph = skb_header_pointer(*pskb, nexthdr_off, sizeof(_tcph), &_tcph);
        BUG_ON(!tcph);
        nexthdr_off += tcph->doff * 4;
-       datalen = tcplen - tcph->doff * 4;
+       datalen = tcplen - tcph->doff * 4;
 
        pptph = skb_header_pointer(*pskb, nexthdr_off, sizeof(_pptph), &_pptph);
        if (!pptph) {
@@ -624,7 +624,7 @@ static struct ip_conntrack_helper pptp = {
        .max_expected = 2,
        .timeout = 5 * 60,
        .tuple = { .src = { .ip = 0,
-                           .u = { .tcp = { .port =
+                           .u = { .tcp = { .port =
                                    __constant_htons(PPTP_CONTROL_PORT) } }
                          },
                   .dst = { .ip = 0,
@@ -638,7 +638,7 @@ static struct ip_conntrack_helper pptp = {
                  .dst = { .ip = 0,
                           .u = { .all = 0 },
                           .protonum = 0xff
-                        }
+                        }
                },
        .help = conntrack_pptp_help,
        .destroy = pptp_destroy_siblings,
index 91832eca4106470de11dbcd2c6a4aa3a52c3bab2..053e591f407ad0c9eb45382a2562c94faeeb0748 100644 (file)
@@ -1,6 +1,6 @@
 /* IRC extension for IP connection tracking, Version 1.21
  * (C) 2000-2002 by Harald Welte <laforge@gnumonks.org>
- * based on RR's ip_conntrack_ftp.c    
+ * based on RR's ip_conntrack_ftp.c
  *
  * ip_conntrack_irc.c,v 1.21 2002/02/05 14:49:26 laforge Exp
  *
  *     Module load syntax:
  *     insmod ip_conntrack_irc.o ports=port1,port2,...port<MAX_PORTS>
  *                         max_dcc_channels=n dcc_timeout=secs
- *     
+ *
  *     please give the ports of all IRC servers You wish to connect to.
  *     If You don't specify ports, the default will be port 6667.
  *     With max_dcc_channels you can define the maximum number of not
  *     yet answered DCC channels per IRC session (default 8).
- *     With dcc_timeout you can specify how long the system waits for 
+ *     With dcc_timeout you can specify how long the system waits for
  *     an expected DCC channel (default 300 seconds).
  *
  */
@@ -63,7 +63,7 @@ static const char *dccprotos[] = { "SEND ", "CHAT ", "MOVE ", "TSEND ", "SCHAT "
 
 #if 0
 #define DEBUGP(format, args...) printk(KERN_DEBUG "%s:%s:" format, \
-                                       __FILE__, __FUNCTION__ , ## args)
+                                      __FILE__, __FUNCTION__ , ## args)
 #else
 #define DEBUGP(format, args...)
 #endif
@@ -71,7 +71,7 @@ static const char *dccprotos[] = { "SEND ", "CHAT ", "MOVE ", "TSEND ", "SCHAT "
 static int parse_dcc(char *data, char *data_end, u_int32_t *ip,
                     u_int16_t *port, char **ad_beg_p, char **ad_end_p)
 /* tries to get the ip_addr and port out of a dcc command
-   return value: -1 on failure, 0 on success 
+   return value: -1 on failure, 0 on success
        data            pointer to first byte of DCC command data
        data_end        pointer to last byte of dcc command data
        ip              returns parsed ip of dcc command
@@ -90,7 +90,7 @@ static int parse_dcc(char *data, char *data_end, u_int32_t *ip,
 
        /* skip blanks between ip and port */
        while (*data == ' ') {
-               if (data >= data_end) 
+               if (data >= data_end)
                        return -1;
                data++;
        }
@@ -171,7 +171,7 @@ static int help(struct sk_buff **pskb,
 
                        DEBUGP("DCC %s detected\n", dccprotos[i]);
                        data += strlen(dccprotos[i]);
-                       /* we have at least 
+                       /* we have at least
                         * (19+MINMATCHLEN)-5-dccprotos[i].matchlen bytes valid
                         * data left (== 14/13 bytes) */
                        if (parse_dcc((char *)data, data_limit, &dcc_ip,
@@ -260,7 +260,7 @@ static int __init ip_conntrack_irc_init(void)
        irc_buffer = kmalloc(65536, GFP_KERNEL);
        if (!irc_buffer)
                return -ENOMEM;
-       
+
        /* If no port given, default to standard irc port */
        if (ports_c == 0)
                ports[ports_c++] = IRC_PORT;
@@ -297,7 +297,7 @@ static int __init ip_conntrack_irc_init(void)
        return 0;
 }
 
-/* This function is intentionally _NOT_ defined as __exit, because 
+/* This function is intentionally _NOT_ defined as __exit, because
  * it is needed by the init function */
 static void ip_conntrack_irc_fini(void)
 {
index a1d6a89f64aa44b140eaa46473562f89508ec7c9..cc6dd49c9da0060f7fcf40d97a26925c1399440d 100644 (file)
@@ -42,7 +42,7 @@ module_param(timeout, uint, 0400);
 MODULE_PARM_DESC(timeout, "timeout for master connection/replies in seconds");
 
 static int help(struct sk_buff **pskb,
-                struct ip_conntrack *ct, enum ip_conntrack_info ctinfo)
+               struct ip_conntrack *ct, enum ip_conntrack_info ctinfo)
 {
        struct ip_conntrack_expect *exp;
        struct iphdr *iph = (*pskb)->nh.iph;
index 7f70b0886b83d4deaa97ed588f904d275d4b7be1..9228b76ccd9ac00993bb7d2c3020e884fbaef4dc 100644 (file)
@@ -6,10 +6,10 @@
  * (C) 2003 by Patrick Mchardy <kaber@trash.net>
  * (C) 2005-2006 by Pablo Neira Ayuso <pablo@eurodev.net>
  *
- * I've reworked this stuff to use attributes instead of conntrack 
+ * I've reworked this stuff to use attributes instead of conntrack
  * structures. 5.44 am. I need more tea. --pablo 05/07/11.
  *
- * Initial connection tracking via netlink development funded and 
+ * Initial connection tracking via netlink development funded and
  * generally made possible by Network Robots, Inc. (www.networkrobots.com)
  *
  * Further development of this code funded by Astaro AG (http://www.astaro.com)
@@ -45,7 +45,7 @@ MODULE_LICENSE("GPL");
 static char __initdata version[] = "0.90";
 
 static inline int
-ctnetlink_dump_tuples_proto(struct sk_buff *skb, 
+ctnetlink_dump_tuples_proto(struct sk_buff *skb,
                            const struct ip_conntrack_tuple *tuple,
                            struct ip_conntrack_protocol *proto)
 {
@@ -56,7 +56,7 @@ ctnetlink_dump_tuples_proto(struct sk_buff *skb,
 
        if (likely(proto->tuple_to_nfattr))
                ret = proto->tuple_to_nfattr(skb, tuple);
-       
+
        NFA_NEST_END(skb, nest_parms);
 
        return ret;
@@ -70,7 +70,7 @@ ctnetlink_dump_tuples_ip(struct sk_buff *skb,
                         const struct ip_conntrack_tuple *tuple)
 {
        struct nfattr *nest_parms = NFA_NEST(skb, CTA_TUPLE_IP);
-       
+
        NFA_PUT(skb, CTA_IP_V4_SRC, sizeof(__be32), &tuple->src.ip);
        NFA_PUT(skb, CTA_IP_V4_DST, sizeof(__be32), &tuple->dst.ip);
 
@@ -121,7 +121,7 @@ ctnetlink_dump_timeout(struct sk_buff *skb, const struct ip_conntrack *ct)
                timeout = 0;
        else
                timeout = htonl(timeout_l / HZ);
-       
+
        NFA_PUT(skb, CTA_TIMEOUT, sizeof(timeout), &timeout);
        return 0;
 
@@ -141,7 +141,7 @@ ctnetlink_dump_protoinfo(struct sk_buff *skb, const struct ip_conntrack *ct)
                ip_conntrack_proto_put(proto);
                return 0;
        }
-       
+
        nest_proto = NFA_NEST(skb, CTA_PROTOINFO);
 
        ret = proto->to_nfattr(skb, nest_proto, ct);
@@ -164,7 +164,7 @@ ctnetlink_dump_helpinfo(struct sk_buff *skb, const struct ip_conntrack *ct)
 
        if (!ct->helper)
                return 0;
-               
+
        nest_helper = NFA_NEST(skb, CTA_HELP);
        NFA_PUT(skb, CTA_HELP_NAME, strlen(ct->helper->name), ct->helper->name);
 
@@ -236,7 +236,7 @@ static inline int
 ctnetlink_dump_use(struct sk_buff *skb, const struct ip_conntrack *ct)
 {
        __be32 use = htonl(atomic_read(&ct->ct_general.use));
-       
+
        NFA_PUT(skb, CTA_USE, sizeof(__be32), &use);
        return 0;
 
@@ -248,7 +248,7 @@ nfattr_failure:
 
 static int
 ctnetlink_fill_info(struct sk_buff *skb, u32 pid, u32 seq,
-                   int event, int nowait, 
+                   int event, int nowait,
                    const struct ip_conntrack *ct)
 {
        struct nlmsghdr *nlh;
@@ -271,7 +271,7 @@ ctnetlink_fill_info(struct sk_buff *skb, u32 pid, u32 seq,
        if (ctnetlink_dump_tuples(skb, tuple(ct, IP_CT_DIR_ORIGINAL)) < 0)
                goto nfattr_failure;
        NFA_NEST_END(skb, nest_parms);
-       
+
        nest_parms = NFA_NEST(skb, CTA_TUPLE_REPLY);
        if (ctnetlink_dump_tuples(skb, tuple(ct, IP_CT_DIR_REPLY)) < 0)
                goto nfattr_failure;
@@ -299,7 +299,7 @@ nfattr_failure:
 
 #ifdef CONFIG_IP_NF_CONNTRACK_EVENTS
 static int ctnetlink_conntrack_event(struct notifier_block *this,
-                                     unsigned long events, void *ptr)
+                                    unsigned long events, void *ptr)
 {
        struct nlmsghdr *nlh;
        struct nfgenmsg *nfmsg;
@@ -324,7 +324,7 @@ static int ctnetlink_conntrack_event(struct notifier_block *this,
        } else if (events & (IPCT_STATUS | IPCT_PROTOINFO)) {
                type = IPCTNL_MSG_CT_NEW;
                group = NFNLGRP_CONNTRACK_UPDATE;
-       } else 
+       } else
                return NOTIFY_DONE;
 
        if (!nfnetlink_has_listeners(group))
@@ -349,7 +349,7 @@ static int ctnetlink_conntrack_event(struct notifier_block *this,
        if (ctnetlink_dump_tuples(skb, tuple(ct, IP_CT_DIR_ORIGINAL)) < 0)
                goto nfattr_failure;
        NFA_NEST_END(skb, nest_parms);
-       
+
        nest_parms = NFA_NEST(skb, CTA_TUPLE_REPLY);
        if (ctnetlink_dump_tuples(skb, tuple(ct, IP_CT_DIR_REPLY)) < 0)
                goto nfattr_failure;
@@ -368,16 +368,16 @@ static int ctnetlink_conntrack_event(struct notifier_block *this,
 
                if (events & IPCT_PROTOINFO
                    && ctnetlink_dump_protoinfo(skb, ct) < 0)
-                       goto nfattr_failure;
+                       goto nfattr_failure;
 
                if ((events & IPCT_HELPER || ct->helper)
                    && ctnetlink_dump_helpinfo(skb, ct) < 0)
-                       goto nfattr_failure;
+                       goto nfattr_failure;
 
 #ifdef CONFIG_IP_NF_CONNTRACK_MARK
                if ((events & IPCT_MARK || ct->mark)
                    && ctnetlink_dump_mark(skb, ct) < 0)
-                       goto nfattr_failure;
+                       goto nfattr_failure;
 #endif
 
                if (events & IPCT_COUNTER_FILLING &&
@@ -426,7 +426,7 @@ restart:
                                cb->args[1] = 0;
                        }
                        if (ctnetlink_fill_info(skb, NETLINK_CB(cb->skb).pid,
-                                               cb->nlh->nlmsg_seq,
+                                               cb->nlh->nlmsg_seq,
                                                IPCTNL_MSG_CT_NEW,
                                                1, ct) < 0) {
                                nf_conntrack_get(&ct->ct_general);
@@ -488,7 +488,7 @@ static const size_t cta_min_proto[CTA_PROTO_MAX] = {
 };
 
 static inline int
-ctnetlink_parse_tuple_proto(struct nfattr *attr, 
+ctnetlink_parse_tuple_proto(struct nfattr *attr,
                            struct ip_conntrack_tuple *tuple)
 {
        struct nfattr *tb[CTA_PROTO_MAX];
@@ -508,9 +508,9 @@ ctnetlink_parse_tuple_proto(struct nfattr *attr,
 
        if (likely(proto->nfattr_to_tuple))
                ret = proto->nfattr_to_tuple(tb, tuple);
-       
+
        ip_conntrack_proto_put(proto);
-       
+
        return ret;
 }
 
@@ -595,7 +595,7 @@ ctnetlink_parse_nat(struct nfattr *nat,
        int err;
 
        memset(range, 0, sizeof(*range));
-       
+
        nfattr_parse_nested(tb, CTA_NAT_MAX, nat);
 
        if (nfattr_bad_size(tb, CTA_NAT_MAX, cta_min_nat))
@@ -647,7 +647,7 @@ static const size_t cta_min[CTA_MAX] = {
 };
 
 static int
-ctnetlink_del_conntrack(struct sock *ctnl, struct sk_buff *skb, 
+ctnetlink_del_conntrack(struct sock *ctnl, struct sk_buff *skb,
                        struct nlmsghdr *nlh, struct nfattr *cda[], int *errp)
 {
        struct ip_conntrack_tuple_hash *h;
@@ -676,14 +676,14 @@ ctnetlink_del_conntrack(struct sock *ctnl, struct sk_buff *skb,
                return -ENOENT;
 
        ct = tuplehash_to_ctrack(h);
-       
+
        if (cda[CTA_ID-1]) {
                u_int32_t id = ntohl(*(__be32 *)NFA_DATA(cda[CTA_ID-1]));
                if (ct->id != id) {
                        ip_conntrack_put(ct);
                        return -ENOENT;
                }
-       }       
+       }
        if (del_timer(&ct->timeout))
                ct->timeout.function((unsigned long)ct);
 
@@ -693,7 +693,7 @@ ctnetlink_del_conntrack(struct sock *ctnl, struct sk_buff *skb,
 }
 
 static int
-ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb, 
+ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb,
                        struct nlmsghdr *nlh, struct nfattr *cda[], int *errp)
 {
        struct ip_conntrack_tuple_hash *h;
@@ -714,8 +714,8 @@ ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb,
                        return -ENOTSUPP;
 #endif
                if ((*errp = netlink_dump_start(ctnl, skb, nlh,
-                                               ctnetlink_dump_table,
-                                               ctnetlink_done)) != 0)
+                                               ctnetlink_dump_table,
+                                               ctnetlink_done)) != 0)
                        return -EINVAL;
 
                rlen = NLMSG_ALIGN(nlh->nlmsg_len);
@@ -751,7 +751,7 @@ ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb,
                return -ENOMEM;
        }
 
-       err = ctnetlink_fill_info(skb2, NETLINK_CB(skb).pid, nlh->nlmsg_seq, 
+       err = ctnetlink_fill_info(skb2, NETLINK_CB(skb).pid, nlh->nlmsg_seq,
                                  IPCTNL_MSG_CT_NEW, 1, ct);
        ip_conntrack_put(ct);
        if (err <= 0)
@@ -779,12 +779,12 @@ ctnetlink_change_status(struct ip_conntrack *ct, struct nfattr *cda[])
        if (d & (IPS_EXPECTED|IPS_CONFIRMED|IPS_DYING))
                /* unchangeable */
                return -EINVAL;
-       
+
        if (d & IPS_SEEN_REPLY && !(status & IPS_SEEN_REPLY))
                /* SEEN_REPLY bit can only be set */
                return -EINVAL;
 
-       
+
        if (d & IPS_ASSURED && !(status & IPS_ASSURED))
                /* ASSURED bit can only be set */
                return -EINVAL;
@@ -857,7 +857,7 @@ ctnetlink_change_helper(struct ip_conntrack *ct, struct nfattr *cda[])
                        memset(&ct->help, 0, sizeof(ct->help));
                }
        }
-       
+
        ct->helper = helper;
 
        return 0;
@@ -867,7 +867,7 @@ static inline int
 ctnetlink_change_timeout(struct ip_conntrack *ct, struct nfattr *cda[])
 {
        u_int32_t timeout = ntohl(*(__be32 *)NFA_DATA(cda[CTA_TIMEOUT-1]));
-       
+
        if (!del_timer(&ct->timeout))
                return -ETIME;
 
@@ -891,7 +891,7 @@ ctnetlink_change_protoinfo(struct ip_conntrack *ct, struct nfattr *cda[])
 
        if (proto->from_nfattr)
                err = proto->from_nfattr(tb, ct);
-       ip_conntrack_proto_put(proto); 
+       ip_conntrack_proto_put(proto);
 
        return err;
 }
@@ -934,7 +934,7 @@ ctnetlink_change_conntrack(struct ip_conntrack *ct, struct nfattr *cda[])
 }
 
 static int
-ctnetlink_create_conntrack(struct nfattr *cda[], 
+ctnetlink_create_conntrack(struct nfattr *cda[],
                           struct ip_conntrack_tuple *otuple,
                           struct ip_conntrack_tuple *rtuple)
 {
@@ -943,7 +943,7 @@ ctnetlink_create_conntrack(struct nfattr *cda[],
 
        ct = ip_conntrack_alloc(otuple, rtuple);
        if (ct == NULL || IS_ERR(ct))
-               return -ENOMEM; 
+               return -ENOMEM;
 
        if (!cda[CTA_TIMEOUT-1])
                goto err;
@@ -979,13 +979,13 @@ ctnetlink_create_conntrack(struct nfattr *cda[],
 
        return 0;
 
-err:   
+err:
        ip_conntrack_free(ct);
        return err;
 }
 
-static int 
-ctnetlink_new_conntrack(struct sock *ctnl, struct sk_buff *skb, 
+static int
+ctnetlink_new_conntrack(struct sock *ctnl, struct sk_buff *skb,
                        struct nlmsghdr *nlh, struct nfattr *cda[], int *errp)
 {
        struct ip_conntrack_tuple otuple, rtuple;
@@ -1039,9 +1039,9 @@ out_unlock:
        return err;
 }
 
-/*********************************************************************** 
- * EXPECT 
- ***********************************************************************/ 
+/***********************************************************************
+ * EXPECT
+ ***********************************************************************/
 
 static inline int
 ctnetlink_exp_dump_tuple(struct sk_buff *skb,
@@ -1049,7 +1049,7 @@ ctnetlink_exp_dump_tuple(struct sk_buff *skb,
                         enum ctattr_expect type)
 {
        struct nfattr *nest_parms = NFA_NEST(skb, type);
-       
+
        if (ctnetlink_dump_tuples(skb, tuple) < 0)
                goto nfattr_failure;
 
@@ -1059,7 +1059,7 @@ ctnetlink_exp_dump_tuple(struct sk_buff *skb,
 
 nfattr_failure:
        return -1;
-}                      
+}
 
 static inline int
 ctnetlink_exp_dump_mask(struct sk_buff *skb,
@@ -1090,7 +1090,7 @@ nfattr_failure:
 
 static inline int
 ctnetlink_exp_dump_expect(struct sk_buff *skb,
-                          const struct ip_conntrack_expect *exp)
+                         const struct ip_conntrack_expect *exp)
 {
        struct ip_conntrack *master = exp->master;
        __be32 timeout = htonl((exp->timeout.expires - jiffies) / HZ);
@@ -1104,20 +1104,20 @@ ctnetlink_exp_dump_expect(struct sk_buff *skb,
                                 &master->tuplehash[IP_CT_DIR_ORIGINAL].tuple,
                                 CTA_EXPECT_MASTER) < 0)
                goto nfattr_failure;
-       
+
        NFA_PUT(skb, CTA_EXPECT_TIMEOUT, sizeof(__be32), &timeout);
        NFA_PUT(skb, CTA_EXPECT_ID, sizeof(__be32), &id);
 
        return 0;
-       
+
 nfattr_failure:
        return -1;
 }
 
 static int
 ctnetlink_exp_fill_info(struct sk_buff *skb, u32 pid, u32 seq,
-                   int event, 
-                   int nowait, 
+                   int event,
+                   int nowait,
                    const struct ip_conntrack_expect *exp)
 {
        struct nlmsghdr *nlh;
@@ -1216,7 +1216,7 @@ ctnetlink_exp_dump_table(struct sk_buff *skb, struct netlink_callback *cb)
                        goto out;
                *id = exp->id;
        }
-out:   
+out:
        read_unlock_bh(&ip_conntrack_lock);
 
        return skb->len;
@@ -1228,7 +1228,7 @@ static const size_t cta_min_exp[CTA_EXPECT_MAX] = {
 };
 
 static int
-ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb, 
+ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb,
                     struct nlmsghdr *nlh, struct nfattr *cda[], int *errp)
 {
        struct ip_conntrack_tuple tuple;
@@ -1247,7 +1247,7 @@ ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb,
                        return -EAFNOSUPPORT;
 
                if ((*errp = netlink_dump_start(ctnl, skb, nlh,
-                                               ctnetlink_exp_dump_table,
+                                               ctnetlink_exp_dump_table,
                                                ctnetlink_done)) != 0)
                        return -EINVAL;
                rlen = NLMSG_ALIGN(nlh->nlmsg_len);
@@ -1275,14 +1275,14 @@ ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb,
                        ip_conntrack_expect_put(exp);
                        return -ENOENT;
                }
-       }       
+       }
 
        err = -ENOMEM;
        skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
        if (!skb2)
                goto out;
 
-       err = ctnetlink_exp_fill_info(skb2, NETLINK_CB(skb).pid, 
+       err = ctnetlink_exp_fill_info(skb2, NETLINK_CB(skb).pid,
                                      nlh->nlmsg_seq, IPCTNL_MSG_EXP_NEW,
                                      1, exp);
        if (err <= 0)
@@ -1300,7 +1300,7 @@ out:
 }
 
 static int
-ctnetlink_del_expect(struct sock *ctnl, struct sk_buff *skb, 
+ctnetlink_del_expect(struct sock *ctnl, struct sk_buff *skb,
                     struct nlmsghdr *nlh, struct nfattr *cda[], int *errp)
 {
        struct ip_conntrack_expect *exp, *tmp;
@@ -1333,7 +1333,7 @@ ctnetlink_del_expect(struct sock *ctnl, struct sk_buff *skb,
 
                /* after list removal, usage count == 1 */
                ip_conntrack_unexpect_related(exp);
-               /* have to put what we 'get' above. 
+               /* have to put what we 'get' above.
                 * after this line usage count == 0 */
                ip_conntrack_expect_put(exp);
        } else if (cda[CTA_EXPECT_HELP_NAME-1]) {
@@ -1348,7 +1348,7 @@ ctnetlink_del_expect(struct sock *ctnl, struct sk_buff *skb,
                }
                list_for_each_entry_safe(exp, tmp, &ip_conntrack_expect_list,
                                         list) {
-                       if (exp->master->helper == h 
+                       if (exp->master->helper == h
                            && del_timer(&exp->timeout)) {
                                ip_ct_unlink_expect(exp);
                                ip_conntrack_expect_put(exp);
@@ -1413,7 +1413,7 @@ ctnetlink_create_expect(struct nfattr *cda[])
                err = -ENOMEM;
                goto out;
        }
-       
+
        exp->expectfn = NULL;
        exp->flags = 0;
        exp->master = ct;
@@ -1423,7 +1423,7 @@ ctnetlink_create_expect(struct nfattr *cda[])
        err = ip_conntrack_expect_related(exp);
        ip_conntrack_expect_put(exp);
 
-out:   
+out:
        ip_conntrack_put(tuplehash_to_ctrack(h));
        return err;
 }
index 36f2b5e5d80adaff59f6817afca14dbc4f9e844f..88af82e986589f65ed0a5ae0783188f1754cda4c 100644 (file)
@@ -7,7 +7,6 @@
  */
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/netfilter.h>
 #include <linux/netfilter_ipv4/ip_conntrack_protocol.h>
index 295b6fa340dbc021e440c77cd92de51c03291164..ad70c81a21e04861c04a4e597bc00c87d0fba3eb 100644 (file)
@@ -7,7 +7,6 @@
  */
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/netfilter.h>
 #include <linux/in.h>
@@ -94,9 +93,9 @@ static int icmp_packet(struct ip_conntrack *ct,
                       enum ip_conntrack_info ctinfo)
 {
        /* Try to delete connection immediately after all replies:
-           won't actually vanish as we still have skb, and del_timer
-           means this will only run once even if count hits zero twice
-           (theoretically possible with SMP) */
+          won't actually vanish as we still have skb, and del_timer
+          means this will only run once even if count hits zero twice
+          (theoretically possible with SMP) */
        if (CTINFO2DIR(ctinfo) == IP_CT_DIR_REPLY) {
                if (atomic_dec_and_test(&ct->proto.icmp.count)
                    && del_timer(&ct->timeout))
@@ -114,11 +113,11 @@ static int icmp_packet(struct ip_conntrack *ct,
 static int icmp_new(struct ip_conntrack *conntrack,
                    const struct sk_buff *skb)
 {
-       static const u_int8_t valid_new[] = { 
+       static const u_int8_t valid_new[] = {
                [ICMP_ECHO] = 1,
                [ICMP_TIMESTAMP] = 1,
                [ICMP_INFO_REQUEST] = 1,
-               [ICMP_ADDRESS] = 1 
+               [ICMP_ADDRESS] = 1
        };
 
        if (conntrack->tuplehash[0].tuple.dst.u.icmp.type >= sizeof(valid_new)
@@ -282,7 +281,7 @@ static int icmp_nfattr_to_tuple(struct nfattr *tb[],
            || !tb[CTA_PROTO_ICMP_ID-1])
                return -EINVAL;
 
-       tuple->dst.u.icmp.type = 
+       tuple->dst.u.icmp.type =
                        *(u_int8_t *)NFA_DATA(tb[CTA_PROTO_ICMP_TYPE-1]);
        tuple->dst.u.icmp.code =
                        *(u_int8_t *)NFA_DATA(tb[CTA_PROTO_ICMP_CODE-1]);
index 2443322e4128ac3f054fabd442cc80713b71dbc5..e6942992b2f699634878e43e3a80c49f3f9c9e26 100644 (file)
@@ -1,9 +1,9 @@
 /*
  * Connection tracking protocol helper module for SCTP.
- * 
- * SCTP is defined in RFC 2960. References to various sections in this code 
+ *
+ * SCTP is defined in RFC 2960. References to various sections in this code
  * are to this RFC.
- * 
+ *
  * 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.
@@ -14,7 +14,6 @@
  */
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/interrupt.h>
 #include <linux/netfilter.h>
@@ -38,7 +37,7 @@
 static DEFINE_RWLOCK(sctp_lock);
 
 /* FIXME: Examine ipfilter's timeouts and conntrack transitions more
-   closely.  They're more complex. --RR 
+   closely.  They're more complex. --RR
 
    And so for me for SCTP :D -Kiran */
 
@@ -87,32 +86,32 @@ static const unsigned int * sctp_timeouts[]
 #define        sSA SCTP_CONNTRACK_SHUTDOWN_ACK_SENT
 #define        sIV SCTP_CONNTRACK_MAX
 
-/* 
+/*
        These are the descriptions of the states:
 
-NOTE: These state names are tantalizingly similar to the states of an 
+NOTE: These state names are tantalizingly similar to the states of an
 SCTP endpoint. But the interpretation of the states is a little different,
-considering that these are the states of the connection and not of an end 
+considering that these are the states of the connection and not of an end
 point. Please note the subtleties. -Kiran
 
 NONE              - Nothing so far.
-COOKIE WAIT       - We have seen an INIT chunk in the original direction, or also 
-                    an INIT_ACK chunk in the reply direction.
+COOKIE WAIT       - We have seen an INIT chunk in the original direction, or also
+                   an INIT_ACK chunk in the reply direction.
 COOKIE ECHOED     - We have seen a COOKIE_ECHO chunk in the original direction.
 ESTABLISHED       - We have seen a COOKIE_ACK in the reply direction.
 SHUTDOWN_SENT     - We have seen a SHUTDOWN chunk in the original direction.
 SHUTDOWN_RECD     - We have seen a SHUTDOWN chunk in the reply directoin.
 SHUTDOWN_ACK_SENT - We have seen a SHUTDOWN_ACK chunk in the direction opposite
-                    to that of the SHUTDOWN chunk.
-CLOSED            - We have seen a SHUTDOWN_COMPLETE chunk in the direction of 
-                    the SHUTDOWN chunk. Connection is closed.
+                   to that of the SHUTDOWN chunk.
+CLOSED            - We have seen a SHUTDOWN_COMPLETE chunk in the direction of
+                   the SHUTDOWN chunk. Connection is closed.
 */
 
 /* TODO
- - I have assumed that the first INIT is in the original direction. 
+ - I have assumed that the first INIT is in the original direction.
  This messes things when an INIT comes in the reply direction in CLOSED
  state.
- - Check the error type in the reply dir before transitioning from 
+ - Check the error type in the reply dir before transitioning from
 cookie echoed to closed.
  - Sec 5.2.4 of RFC 2960
  - Multi Homing support.
@@ -229,7 +228,7 @@ static int do_basic_checks(struct ip_conntrack *conntrack,
        for_each_sctp_chunk (skb, sch, _sch, offset, count) {
                DEBUGP("Chunk Num: %d  Type: %d\n", count, sch->type);
 
-               if (sch->type == SCTP_CID_INIT 
+               if (sch->type == SCTP_CID_INIT
                        || sch->type == SCTP_CID_INIT_ACK
                        || sch->type == SCTP_CID_SHUTDOWN_COMPLETE) {
                        flag = 1;
@@ -269,42 +268,42 @@ static int new_state(enum ip_conntrack_dir dir,
        DEBUGP("Chunk type: %d\n", chunk_type);
 
        switch (chunk_type) {
-               case SCTP_CID_INIT: 
+               case SCTP_CID_INIT:
                        DEBUGP("SCTP_CID_INIT\n");
                        i = 0; break;
-               case SCTP_CID_INIT_ACK: 
+               case SCTP_CID_INIT_ACK:
                        DEBUGP("SCTP_CID_INIT_ACK\n");
                        i = 1; break;
-               case SCTP_CID_ABORT: 
+               case SCTP_CID_ABORT:
                        DEBUGP("SCTP_CID_ABORT\n");
                        i = 2; break;
-               case SCTP_CID_SHUTDOWN: 
+               case SCTP_CID_SHUTDOWN:
                        DEBUGP("SCTP_CID_SHUTDOWN\n");
                        i = 3; break;
-               case SCTP_CID_SHUTDOWN_ACK: 
+               case SCTP_CID_SHUTDOWN_ACK:
                        DEBUGP("SCTP_CID_SHUTDOWN_ACK\n");
                        i = 4; break;
-               case SCTP_CID_ERROR: 
+               case SCTP_CID_ERROR:
                        DEBUGP("SCTP_CID_ERROR\n");
                        i = 5; break;
-               case SCTP_CID_COOKIE_ECHO: 
+               case SCTP_CID_COOKIE_ECHO:
                        DEBUGP("SCTP_CID_COOKIE_ECHO\n");
                        i = 6; break;
-               case SCTP_CID_COOKIE_ACK: 
+               case SCTP_CID_COOKIE_ACK:
                        DEBUGP("SCTP_CID_COOKIE_ACK\n");
                        i = 7; break;
-               case SCTP_CID_SHUTDOWN_COMPLETE: 
+               case SCTP_CID_SHUTDOWN_COMPLETE:
                        DEBUGP("SCTP_CID_SHUTDOWN_COMPLETE\n");
                        i = 8; break;
                default:
                        /* Other chunks like DATA, SACK, HEARTBEAT and
                        its ACK do not cause a change in state */
-                       DEBUGP("Unknown chunk type, Will stay in %s\n", 
+                       DEBUGP("Unknown chunk type, Will stay in %s\n",
                                                sctp_conntrack_names[cur_state]);
                        return cur_state;
        }
 
-       DEBUGP("dir: %d   cur_state: %s  chunk_type: %d  new_state: %s\n", 
+       DEBUGP("dir: %d   cur_state: %s  chunk_type: %d  new_state: %s\n",
                        dir, sctp_conntrack_names[cur_state], chunk_type,
                        sctp_conntrack_names[sctp_conntracks[dir][i][cur_state]]);
 
@@ -367,7 +366,7 @@ static int sctp_packet(struct ip_conntrack *conntrack,
                        /* Sec 8.5.1 (C) */
                        if (!(sh->vtag == conntrack->proto.sctp.vtag[CTINFO2DIR(ctinfo)])
                                && !(sh->vtag == conntrack->proto.sctp.vtag
-                                                       [1 - CTINFO2DIR(ctinfo)] 
+                                                       [1 - CTINFO2DIR(ctinfo)]
                                        && (sch->flags & 1))) {
                                write_unlock_bh(&sctp_lock);
                                return -1;
@@ -392,17 +391,17 @@ static int sctp_packet(struct ip_conntrack *conntrack,
                }
 
                /* If it is an INIT or an INIT ACK note down the vtag */
-               if (sch->type == SCTP_CID_INIT 
+               if (sch->type == SCTP_CID_INIT
                        || sch->type == SCTP_CID_INIT_ACK) {
                        sctp_inithdr_t _inithdr, *ih;
 
                        ih = skb_header_pointer(skb, offset + sizeof(sctp_chunkhdr_t),
-                                               sizeof(_inithdr), &_inithdr);
+                                               sizeof(_inithdr), &_inithdr);
                        if (ih == NULL) {
                                        write_unlock_bh(&sctp_lock);
                                        return -1;
                        }
-                       DEBUGP("Setting vtag %x for dir %d\n", 
+                       DEBUGP("Setting vtag %x for dir %d\n",
                                        ih->init_tag, !CTINFO2DIR(ctinfo));
                        conntrack->proto.sctp.vtag[!CTINFO2DIR(ctinfo)] = ih->init_tag;
                }
@@ -427,7 +426,7 @@ static int sctp_packet(struct ip_conntrack *conntrack,
 }
 
 /* Called when a new connection for this protocol found. */
-static int sctp_new(struct ip_conntrack *conntrack, 
+static int sctp_new(struct ip_conntrack *conntrack,
                    const struct sk_buff *skb)
 {
        enum sctp_conntrack newconntrack;
@@ -457,7 +456,7 @@ static int sctp_new(struct ip_conntrack *conntrack,
        newconntrack = SCTP_CONNTRACK_MAX;
        for_each_sctp_chunk (skb, sch, _sch, offset, count) {
                /* Don't need lock here: this conntrack not in circulation yet */
-               newconntrack = new_state (IP_CT_DIR_ORIGINAL, 
+               newconntrack = new_state (IP_CT_DIR_ORIGINAL,
                                                SCTP_CONNTRACK_NONE, sch->type);
 
                /* Invalid: delete conntrack */
@@ -472,14 +471,14 @@ static int sctp_new(struct ip_conntrack *conntrack,
                                sctp_inithdr_t _inithdr, *ih;
 
                                ih = skb_header_pointer(skb, offset + sizeof(sctp_chunkhdr_t),
-                                                       sizeof(_inithdr), &_inithdr);
+                                                       sizeof(_inithdr), &_inithdr);
                                if (ih == NULL)
                                        return 0;
 
-                               DEBUGP("Setting vtag %x for new conn\n", 
+                               DEBUGP("Setting vtag %x for new conn\n",
                                        ih->init_tag);
 
-                               conntrack->proto.sctp.vtag[IP_CT_DIR_REPLY] = 
+                               conntrack->proto.sctp.vtag[IP_CT_DIR_REPLY] =
                                                                ih->init_tag;
                        } else {
                                /* Sec 8.5.1 (A) */
@@ -489,7 +488,7 @@ static int sctp_new(struct ip_conntrack *conntrack,
                /* If it is a shutdown ack OOTB packet, we expect a return
                   shutdown complete, otherwise an ABORT Sec 8.4 (5) and (8) */
                else {
-                       DEBUGP("Setting vtag %x for new conn OOTB\n", 
+                       DEBUGP("Setting vtag %x for new conn OOTB\n",
                                sh->vtag);
                        conntrack->proto.sctp.vtag[IP_CT_DIR_REPLY] = sh->vtag;
                }
@@ -500,16 +499,16 @@ static int sctp_new(struct ip_conntrack *conntrack,
        return 1;
 }
 
-static struct ip_conntrack_protocol ip_conntrack_protocol_sctp = { 
-       .proto           = IPPROTO_SCTP, 
+static struct ip_conntrack_protocol ip_conntrack_protocol_sctp = {
+       .proto           = IPPROTO_SCTP,
        .name            = "sctp",
-       .pkt_to_tuple    = sctp_pkt_to_tuple, 
-       .invert_tuple    = sctp_invert_tuple, 
-       .print_tuple     = sctp_print_tuple, 
+       .pkt_to_tuple    = sctp_pkt_to_tuple,
+       .invert_tuple    = sctp_invert_tuple,
+       .print_tuple     = sctp_print_tuple,
        .print_conntrack = sctp_print_conntrack,
-       .packet          = sctp_packet, 
-       .new             = sctp_new, 
-       .destroy         = NULL, 
+       .packet          = sctp_packet,
+       .new             = sctp_new,
+       .destroy         = NULL,
        .me              = THIS_MODULE,
 #if defined(CONFIG_IP_NF_CONNTRACK_NETLINK) || \
     defined(CONFIG_IP_NF_CONNTRACK_NETLINK_MODULE)
@@ -603,7 +602,7 @@ static ctl_table ip_ct_net_table[] = {
        {
                .ctl_name       = CTL_NET,
                .procname       = "net",
-               .mode           = 0555, 
+               .mode           = 0555,
                .child          = ip_ct_ipv4_table,
        },
        { .ctl_name = 0 }
@@ -623,7 +622,7 @@ static int __init ip_conntrack_proto_sctp_init(void)
        }
 
 #ifdef CONFIG_SYSCTL
-       ip_ct_sysctl_header = register_sysctl_table(ip_ct_net_table, 0);
+       ip_ct_sysctl_header = register_sysctl_table(ip_ct_net_table);
        if (ip_ct_sysctl_header == NULL) {
                ret = -ENOMEM;
                printk("ip_conntrack_proto_sctp: can't register to sysctl.\n");
@@ -638,7 +637,7 @@ static int __init ip_conntrack_proto_sctp_init(void)
        ip_conntrack_protocol_unregister(&ip_conntrack_protocol_sctp);
 #endif
  out:
-       DEBUGP("SCTP conntrack module loading %s\n", 
+       DEBUGP("SCTP conntrack module loading %s\n",
                                        ret ? "failed": "succeeded");
        return ret;
 }
@@ -647,7 +646,7 @@ static void __exit ip_conntrack_proto_sctp_fini(void)
 {
        ip_conntrack_protocol_unregister(&ip_conntrack_protocol_sctp);
 #ifdef CONFIG_SYSCTL
-       unregister_sysctl_table(ip_ct_sysctl_header);
+       unregister_sysctl_table(ip_ct_sysctl_header);
 #endif
        DEBUGP("SCTP conntrack module unloaded\n");
 }
index c34f48fe547875e5bb48f9552526dd257eb79cfb..170d625fad67d7d7bc51878a937b597f8b8823f6 100644 (file)
@@ -20,7 +20,6 @@
  */
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/netfilter.h>
 #include <linux/module.h>
@@ -45,8 +44,8 @@
 /* Protects conntrack->proto.tcp */
 static DEFINE_RWLOCK(tcp_lock);
 
-/* "Be conservative in what you do, 
-    be liberal in what you accept from others." 
+/* "Be conservative in what you do,
+    be liberal in what you accept from others."
     If it's non-zero, we mark only out of window RST segments as INVALID. */
 int ip_ct_tcp_be_liberal __read_mostly = 0;
 
@@ -54,8 +53,8 @@ int ip_ct_tcp_be_liberal __read_mostly = 0;
    connections. */
 int ip_ct_tcp_loose __read_mostly = 1;
 
-/* Max number of the retransmitted packets without receiving an (acceptable) 
-   ACK from the destination. If this number is reached, a shorter timer 
+/* Max number of the retransmitted packets without receiving an (acceptable)
+   ACK from the destination. If this number is reached, a shorter timer
    will be started. */
 int ip_ct_tcp_max_retrans __read_mostly = 3;
 
@@ -74,7 +73,7 @@ static const char *tcp_conntrack_names[] = {
        "CLOSE",
        "LISTEN"
 };
-  
+
 #define SECS * HZ
 #define MINS * 60 SECS
 #define HOURS * 60 MINS
@@ -90,10 +89,10 @@ unsigned int ip_ct_tcp_timeout_time_wait __read_mostly =     2 MINS;
 unsigned int ip_ct_tcp_timeout_close __read_mostly =        10 SECS;
 
 /* RFC1122 says the R2 limit should be at least 100 seconds.
-   Linux uses 15 packets as limit, which corresponds 
+   Linux uses 15 packets as limit, which corresponds
    to ~13-30min depending on RTO. */
 unsigned int ip_ct_tcp_timeout_max_retrans __read_mostly =   5 MINS;
+
 static const unsigned int * tcp_timeouts[]
 = { NULL,                              /*      TCP_CONNTRACK_NONE */
     &ip_ct_tcp_timeout_syn_sent,       /*      TCP_CONNTRACK_SYN_SENT, */
@@ -106,7 +105,7 @@ static const unsigned int * tcp_timeouts[]
     &ip_ct_tcp_timeout_close,          /*      TCP_CONNTRACK_CLOSE,    */
     NULL,                              /*      TCP_CONNTRACK_LISTEN */
  };
+
 #define sNO TCP_CONNTRACK_NONE
 #define sSS TCP_CONNTRACK_SYN_SENT
 #define sSR TCP_CONNTRACK_SYN_RECV
@@ -129,13 +128,13 @@ enum tcp_bit_set {
        TCP_RST_SET,
        TCP_NONE_SET,
 };
-  
+
 /*
  * The TCP state transition table needs a few words...
  *
  * We are the man in the middle. All the packets go through us
  * but might get lost in transit to the destination.
- * It is assumed that the destinations can't receive segments 
+ * It is assumed that the destinations can't receive segments
  * we haven't seen.
  *
  * The checked segment is in window, but our windows are *not*
@@ -145,11 +144,11 @@ enum tcp_bit_set {
  * The meaning of the states are:
  *
  * NONE:       initial state
- * SYN_SENT:   SYN-only packet seen 
+ * SYN_SENT:   SYN-only packet seen
  * SYN_RECV:   SYN-ACK packet seen
  * ESTABLISHED:        ACK packet seen
  * FIN_WAIT:   FIN packet seen
- * CLOSE_WAIT: ACK seen (after FIN) 
+ * CLOSE_WAIT: ACK seen (after FIN)
  * LAST_ACK:   FIN seen (after FIN)
  * TIME_WAIT:  last ACK seen
  * CLOSE:      closed connection
@@ -157,8 +156,8 @@ enum tcp_bit_set {
  * LISTEN state is not used.
  *
  * Packets marked as IGNORED (sIG):
- *     if they may be either invalid or valid 
- *     and the receiver may send back a connection 
+ *     if they may be either invalid or valid
+ *     and the receiver may send back a connection
  *     closing RST or a SYN/ACK.
  *
  * Packets marked as INVALID (sIV):
@@ -175,7 +174,7 @@ static const enum tcp_conntrack tcp_conntracks[2][6][TCP_CONNTRACK_MAX] = {
  *     sSS -> sSS      Retransmitted SYN
  *     sSR -> sIG      Late retransmitted SYN?
  *     sES -> sIG      Error: SYNs in window outside the SYN_SENT state
- *                     are errors. Receiver will reply with RST 
+ *                     are errors. Receiver will reply with RST
  *                     and close the connection.
  *                     Or we are not in sync and hold a dead connection.
  *     sFW -> sIG
@@ -188,10 +187,10 @@ static const enum tcp_conntrack tcp_conntracks[2][6][TCP_CONNTRACK_MAX] = {
 /*synack*/ { sIV, sIV, sIV, sIV, sIV, sIV, sIV, sIV, sIV, sIV },
 /*
  * A SYN/ACK from the client is always invalid:
- *     - either it tries to set up a simultaneous open, which is 
+ *     - either it tries to set up a simultaneous open, which is
  *       not supported;
  *     - or the firewall has just been inserted between the two hosts
- *       during the session set-up. The SYN will be retransmitted 
+ *       during the session set-up. The SYN will be retransmitted
  *       by the true client (or it'll time out).
  */
 /*          sNO, sSS, sSR, sES, sFW, sCW, sLA, sTW, sCL, sLI   */
@@ -201,9 +200,9 @@ static const enum tcp_conntrack tcp_conntracks[2][6][TCP_CONNTRACK_MAX] = {
  *     sSS -> sIV      Client migth not send FIN in this state:
  *                     we enforce waiting for a SYN/ACK reply first.
  *     sSR -> sFW      Close started.
- *     sES -> sFW      
+ *     sES -> sFW
  *     sFW -> sLA      FIN seen in both directions, waiting for
- *                     the last ACK. 
+ *                     the last ACK.
  *                     Migth be a retransmitted FIN as well...
  *     sCW -> sLA
  *     sLA -> sLA      Retransmitted FIN. Remain in the same state.
@@ -281,7 +280,7 @@ static const enum tcp_conntrack tcp_conntracks[2][6][TCP_CONNTRACK_MAX] = {
 /*          sNO, sSS, sSR, sES, sFW, sCW, sLA, sTW, sCL, sLI   */
 /*rst*/    { sIV, sCL, sCL, sCL, sCL, sCL, sCL, sCL, sCL, sIV },
 /*none*/   { sIV, sIV, sIV, sIV, sIV, sIV, sIV, sIV, sIV, sIV }
-       }
+       }
 };
 
 static int tcp_pkt_to_tuple(const struct sk_buff *skb,
@@ -337,7 +336,7 @@ static int tcp_to_nfattr(struct sk_buff *skb, struct nfattr *nfa,
                         const struct ip_conntrack *ct)
 {
        struct nfattr *nest_parms;
-       
+
        read_lock_bh(&tcp_lock);
        nest_parms = NFA_NEST(skb, CTA_PROTOINFO_TCP);
        NFA_PUT(skb, CTA_PROTOINFO_TCP_STATE, sizeof(u_int8_t),
@@ -367,7 +366,7 @@ static int nfattr_to_tcp(struct nfattr *cda[], struct ip_conntrack *ct)
        if (!attr)
                return 0;
 
-        nfattr_parse_nested(tb, CTA_PROTOINFO_TCP_MAX, attr);
+       nfattr_parse_nested(tb, CTA_PROTOINFO_TCP_MAX, attr);
 
        if (nfattr_bad_size(tb, CTA_PROTOINFO_TCP_MAX, cta_min_tcp))
                return -EINVAL;
@@ -376,7 +375,7 @@ static int nfattr_to_tcp(struct nfattr *cda[], struct ip_conntrack *ct)
                return -EINVAL;
 
        write_lock_bh(&tcp_lock);
-       ct->proto.tcp.state = 
+       ct->proto.tcp.state =
                *(u_int8_t *)NFA_DATA(tb[CTA_PROTOINFO_TCP_STATE-1]);
        write_unlock_bh(&tcp_lock);
 
@@ -395,30 +394,30 @@ static unsigned int get_conntrack_index(const struct tcphdr *tcph)
 
 /* TCP connection tracking based on 'Real Stateful TCP Packet Filtering
    in IP Filter' by Guido van Rooij.
-   
+
    http://www.nluug.nl/events/sane2000/papers.html
    http://www.iae.nl/users/guido/papers/tcp_filtering.ps.gz
-   
+
    The boundaries and the conditions are changed according to RFC793:
    the packet must intersect the window (i.e. segments may be
    after the right or before the left edge) and thus receivers may ACK
    segments after the right edge of the window.
 
-       td_maxend = max(sack + max(win,1)) seen in reply packets
+       td_maxend = max(sack + max(win,1)) seen in reply packets
        td_maxwin = max(max(win, 1)) + (sack - ack) seen in sent packets
        td_maxwin += seq + len - sender.td_maxend
                        if seq + len > sender.td_maxend
        td_end    = max(seq + len) seen in sent packets
-   
+
    I.   Upper bound for valid data:    seq <= sender.td_maxend
    II.  Lower bound for valid data:    seq + len >= sender.td_end - receiver.td_maxwin
    III.        Upper bound for valid ack:      sack <= receiver.td_end
    IV. Lower bound for valid ack:      ack >= receiver.td_end - MAXACKWINDOW
-       
+
    where sack is the highest right edge of sack block found in the packet.
-       
-   The upper bound limit for a valid ack is not ignored - 
-   we doesn't have to deal with fragments. 
+
+   The upper bound limit for a valid ack is not ignored -
+   we doesn't have to deal with fragments.
 */
 
 static inline __u32 segment_seq_plus_len(__u32 seq,
@@ -429,25 +428,25 @@ static inline __u32 segment_seq_plus_len(__u32 seq,
        return (seq + len - (iph->ihl + tcph->doff)*4
                + (tcph->syn ? 1 : 0) + (tcph->fin ? 1 : 0));
 }
-  
+
 /* Fixme: what about big packets? */
 #define MAXACKWINCONST                 66000
 #define MAXACKWINDOW(sender)                                           \
        ((sender)->td_maxwin > MAXACKWINCONST ? (sender)->td_maxwin     \
                                              : MAXACKWINCONST)
-  
+
 /*
  * Simplified tcp_parse_options routine from tcp_input.c
  */
 static void tcp_options(const struct sk_buff *skb,
                        struct iphdr *iph,
-                       struct tcphdr *tcph, 
+                       struct tcphdr *tcph,
                        struct ip_ct_tcp_state *state)
 {
        unsigned char buff[(15 * 4) - sizeof(struct tcphdr)];
        unsigned char *ptr;
        int length = (tcph->doff*4) - sizeof(struct tcphdr);
-       
+
        if (!length)
                return;
 
@@ -456,13 +455,13 @@ static void tcp_options(const struct sk_buff *skb,
                                 length, buff);
        BUG_ON(ptr == NULL);
 
-       state->td_scale = 
+       state->td_scale =
        state->flags = 0;
-       
+
        while (length > 0) {
                int opcode=*ptr++;
                int opsize;
-               
+
                switch (opcode) {
                case TCPOPT_EOL:
                        return;
@@ -476,13 +475,13 @@ static void tcp_options(const struct sk_buff *skb,
                        if (opsize > length)
                                break;  /* don't parse partial options */
 
-                       if (opcode == TCPOPT_SACK_PERM 
+                       if (opcode == TCPOPT_SACK_PERM
                            && opsize == TCPOLEN_SACK_PERM)
                                state->flags |= IP_CT_TCP_FLAG_SACK_PERM;
                        else if (opcode == TCPOPT_WINDOW
                                 && opsize == TCPOLEN_WINDOW) {
                                state->td_scale = *(u_int8_t *)ptr;
-                               
+
                                if (state->td_scale > 14) {
                                        /* See RFC1323 */
                                        state->td_scale = 14;
@@ -517,16 +516,16 @@ static void tcp_sack(const struct sk_buff *skb,
        /* Fast path for timestamp-only option */
        if (length == TCPOLEN_TSTAMP_ALIGNED*4
            && *(__be32 *)ptr ==
-               __constant_htonl((TCPOPT_NOP << 24)
-                                | (TCPOPT_NOP << 16)
-                                | (TCPOPT_TIMESTAMP << 8)
-                                | TCPOLEN_TIMESTAMP))
+               __constant_htonl((TCPOPT_NOP << 24)
+                                | (TCPOPT_NOP << 16)
+                                | (TCPOPT_TIMESTAMP << 8)
+                                | TCPOLEN_TIMESTAMP))
                return;
-               
+
        while (length > 0) {
                int opcode=*ptr++;
                int opsize, i;
-               
+
                switch (opcode) {
                case TCPOPT_EOL:
                        return;
@@ -540,16 +539,16 @@ static void tcp_sack(const struct sk_buff *skb,
                        if (opsize > length)
                                break;  /* don't parse partial options */
 
-                       if (opcode == TCPOPT_SACK 
-                           && opsize >= (TCPOLEN_SACK_BASE 
-                                         + TCPOLEN_SACK_PERBLOCK)
-                           && !((opsize - TCPOLEN_SACK_BASE) 
-                                % TCPOLEN_SACK_PERBLOCK)) {
-                               for (i = 0;
-                                    i < (opsize - TCPOLEN_SACK_BASE);
-                                    i += TCPOLEN_SACK_PERBLOCK) {
+                       if (opcode == TCPOPT_SACK
+                           && opsize >= (TCPOLEN_SACK_BASE
+                                         + TCPOLEN_SACK_PERBLOCK)
+                           && !((opsize - TCPOLEN_SACK_BASE)
+                                % TCPOLEN_SACK_PERBLOCK)) {
+                               for (i = 0;
+                                    i < (opsize - TCPOLEN_SACK_BASE);
+                                    i += TCPOLEN_SACK_PERBLOCK) {
                                        tmp = ntohl(*((__be32 *)(ptr+i)+1));
-                                       
+
                                        if (after(tmp, *sack))
                                                *sack = tmp;
                                }
@@ -561,18 +560,18 @@ static void tcp_sack(const struct sk_buff *skb,
        }
 }
 
-static int tcp_in_window(struct ip_ct_tcp *state, 
-                         enum ip_conntrack_dir dir,
-                         unsigned int index,
-                         const struct sk_buff *skb,
-                         struct iphdr *iph,
-                         struct tcphdr *tcph)
+static int tcp_in_window(struct ip_ct_tcp *state,
+                        enum ip_conntrack_dir dir,
+                        unsigned int index,
+                        const struct sk_buff *skb,
+                        struct iphdr *iph,
+                        struct tcphdr *tcph)
 {
        struct ip_ct_tcp_state *sender = &state->seen[dir];
        struct ip_ct_tcp_state *receiver = &state->seen[!dir];
        __u32 seq, ack, sack, end, win, swin;
        int res;
-       
+
        /*
         * Get the required data from the packet.
         */
@@ -580,23 +579,23 @@ static int tcp_in_window(struct ip_ct_tcp *state,
        ack = sack = ntohl(tcph->ack_seq);
        win = ntohs(tcph->window);
        end = segment_seq_plus_len(seq, skb->len, iph, tcph);
-       
+
        if (receiver->flags & IP_CT_TCP_FLAG_SACK_PERM)
                tcp_sack(skb, iph, tcph, &sack);
-               
+
        DEBUGP("tcp_in_window: START\n");
        DEBUGP("tcp_in_window: src=%u.%u.%u.%u:%hu dst=%u.%u.%u.%u:%hu "
               "seq=%u ack=%u sack=%u win=%u end=%u\n",
-               NIPQUAD(iph->saddr), ntohs(tcph->source), 
+               NIPQUAD(iph->saddr), ntohs(tcph->source),
                NIPQUAD(iph->daddr), ntohs(tcph->dest),
                seq, ack, sack, win, end);
        DEBUGP("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i "
               "receiver end=%u maxend=%u maxwin=%u scale=%i\n",
                sender->td_end, sender->td_maxend, sender->td_maxwin,
-               sender->td_scale, 
-               receiver->td_end, receiver->td_maxend, receiver->td_maxwin, 
+               sender->td_scale,
+               receiver->td_end, receiver->td_maxend, receiver->td_maxwin,
                receiver->td_scale);
-               
+
        if (sender->td_end == 0) {
                /*
                 * Initialize sender data.
@@ -605,26 +604,26 @@ static int tcp_in_window(struct ip_ct_tcp *state,
                        /*
                         * Outgoing SYN-ACK in reply to a SYN.
                         */
-                       sender->td_end = 
+                       sender->td_end =
                        sender->td_maxend = end;
                        sender->td_maxwin = (win == 0 ? 1 : win);
 
                        tcp_options(skb, iph, tcph, sender);
-                       /* 
+                       /*
                         * RFC 1323:
                         * Both sides must send the Window Scale option
                         * to enable window scaling in either direction.
                         */
                        if (!(sender->flags & IP_CT_TCP_FLAG_WINDOW_SCALE
                              && receiver->flags & IP_CT_TCP_FLAG_WINDOW_SCALE))
-                               sender->td_scale = 
+                               sender->td_scale =
                                receiver->td_scale = 0;
                } else {
                        /*
                         * We are in the middle of a connection,
                         * its history is lost for us.
                         * Let's try to use the data from the packet.
-                        */
+                        */
                        sender->td_end = end;
                        sender->td_maxwin = (win == 0 ? 1 : win);
                        sender->td_maxend = end + sender->td_maxwin;
@@ -632,11 +631,11 @@ static int tcp_in_window(struct ip_ct_tcp *state,
        } else if (((state->state == TCP_CONNTRACK_SYN_SENT
                     && dir == IP_CT_DIR_ORIGINAL)
                    || (state->state == TCP_CONNTRACK_SYN_RECV
-                       && dir == IP_CT_DIR_REPLY))
+                       && dir == IP_CT_DIR_REPLY))
                    && after(end, sender->td_end)) {
                /*
                 * RFC 793: "if a TCP is reinitialized ... then it need
-                * not wait at all; it must only be sure to use sequence 
+                * not wait at all; it must only be sure to use sequence
                 * numbers larger than those recently used."
                 */
                sender->td_end =
@@ -645,14 +644,14 @@ static int tcp_in_window(struct ip_ct_tcp *state,
 
                tcp_options(skb, iph, tcph, sender);
        }
-       
+
        if (!(tcph->ack)) {
                /*
                 * If there is no ACK, just pretend it was set and OK.
                 */
                ack = sack = receiver->td_end;
-       } else if (((tcp_flag_word(tcph) & (TCP_FLAG_ACK|TCP_FLAG_RST)) == 
-                   (TCP_FLAG_ACK|TCP_FLAG_RST)) 
+       } else if (((tcp_flag_word(tcph) & (TCP_FLAG_ACK|TCP_FLAG_RST)) ==
+                   (TCP_FLAG_ACK|TCP_FLAG_RST))
                   && (ack == 0)) {
                /*
                 * Broken TCP stacks, that set ACK in RST packets as well
@@ -662,8 +661,8 @@ static int tcp_in_window(struct ip_ct_tcp *state,
        }
 
        if (seq == end
-           && (!tcph->rst 
-               || (seq == 0 && state->state == TCP_CONNTRACK_SYN_SENT)))
+           && (!tcph->rst
+               || (seq == 0 && state->state == TCP_CONNTRACK_SYN_SENT)))
                /*
                 * Packets contains no data: we assume it is valid
                 * and check the ack value only.
@@ -672,7 +671,7 @@ static int tcp_in_window(struct ip_ct_tcp *state,
                 * SYN.
                 */
                seq = end = sender->td_end;
-               
+
        DEBUGP("tcp_in_window: src=%u.%u.%u.%u:%hu dst=%u.%u.%u.%u:%hu "
               "seq=%u ack=%u sack =%u win=%u end=%u\n",
                NIPQUAD(iph->saddr), ntohs(tcph->source),
@@ -681,26 +680,26 @@ static int tcp_in_window(struct ip_ct_tcp *state,
        DEBUGP("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i "
               "receiver end=%u maxend=%u maxwin=%u scale=%i\n",
                sender->td_end, sender->td_maxend, sender->td_maxwin,
-               sender->td_scale, 
+               sender->td_scale,
                receiver->td_end, receiver->td_maxend, receiver->td_maxwin,
                receiver->td_scale);
-       
+
        DEBUGP("tcp_in_window: I=%i II=%i III=%i IV=%i\n",
                before(seq, sender->td_maxend + 1),
-               after(end, sender->td_end - receiver->td_maxwin - 1),
-               before(sack, receiver->td_end + 1),
-               after(ack, receiver->td_end - MAXACKWINDOW(sender)));
-       
+               after(end, sender->td_end - receiver->td_maxwin - 1),
+               before(sack, receiver->td_end + 1),
+               after(ack, receiver->td_end - MAXACKWINDOW(sender)));
+
        if (before(seq, sender->td_maxend + 1) &&
            after(end, sender->td_end - receiver->td_maxwin - 1) &&
            before(sack, receiver->td_end + 1) &&
            after(ack, receiver->td_end - MAXACKWINDOW(sender))) {
-               /*
+               /*
                 * Take into account window scaling (RFC 1323).
                 */
                if (!tcph->syn)
                        win <<= sender->td_scale;
-               
+
                /*
                 * Update sender data.
                 */
@@ -720,7 +719,7 @@ static int tcp_in_window(struct ip_ct_tcp *state,
                                receiver->td_maxend++;
                }
 
-               /* 
+               /*
                 * Check retransmissions.
                 */
                if (index == TCP_ACK_SET) {
@@ -756,11 +755,11 @@ static int tcp_in_window(struct ip_ct_tcp *state,
                        : "ACK is over the upper bound (ACKed data not seen yet)"
                        : "SEQ is under the lower bound (already ACKed data retransmitted)"
                        : "SEQ is over the upper bound (over the window of the receiver)");
-       }
-  
+       }
+
        DEBUGP("tcp_in_window: res=%i sender end=%u maxend=%u maxwin=%u "
               "receiver end=%u maxend=%u maxwin=%u\n",
-               res, sender->td_end, sender->td_maxend, sender->td_maxwin, 
+               res, sender->td_end, sender->td_maxend, sender->td_maxwin,
                receiver->td_end, receiver->td_maxend, receiver->td_maxwin);
 
        return res;
@@ -769,7 +768,7 @@ static int tcp_in_window(struct ip_ct_tcp *state,
 #ifdef CONFIG_IP_NF_NAT_NEEDED
 /* Update sender->td_end after NAT successfully mangled the packet */
 void ip_conntrack_tcp_update(struct sk_buff *skb,
-                            struct ip_conntrack *conntrack, 
+                            struct ip_conntrack *conntrack,
                             enum ip_conntrack_dir dir)
 {
        struct iphdr *iph = skb->nh.iph;
@@ -781,7 +780,7 @@ void ip_conntrack_tcp_update(struct sk_buff *skb,
 #endif
 
        end = segment_seq_plus_len(ntohl(tcph->seq), skb->len, iph, tcph);
-       
+
        write_lock_bh(&tcp_lock);
        /*
         * We have to worry for the ack in the reply packet only...
@@ -793,11 +792,11 @@ void ip_conntrack_tcp_update(struct sk_buff *skb,
        DEBUGP("tcp_update: sender end=%u maxend=%u maxwin=%u scale=%i "
               "receiver end=%u maxend=%u maxwin=%u scale=%i\n",
                sender->td_end, sender->td_maxend, sender->td_maxwin,
-               sender->td_scale, 
+               sender->td_scale,
                receiver->td_end, receiver->td_maxend, receiver->td_maxwin,
                receiver->td_scale);
 }
+
 #endif
 
 #define        TH_FIN  0x01
@@ -847,8 +846,8 @@ static int tcp_error(struct sk_buff *skb,
                        nf_log_packet(PF_INET, 0, skb, NULL, NULL, NULL,
                                "ip_ct_tcp: short packet ");
                return -NF_ACCEPT;
-       }
-  
+       }
+
        /* Not whole TCP header or malformed packet */
        if (th->doff*4 < sizeof(struct tcphdr) || tcplen < th->doff*4) {
                if (LOG_INVALID(IPPROTO_TCP))
@@ -856,7 +855,7 @@ static int tcp_error(struct sk_buff *skb,
                                "ip_ct_tcp: truncated/malformed packet ");
                return -NF_ACCEPT;
        }
-  
+
        /* Checksum invalid? Ignore.
         * We skip checking packets on the outgoing path
         * because it is assumed to be correct.
@@ -893,11 +892,11 @@ static int tcp_packet(struct ip_conntrack *conntrack,
        struct tcphdr *th, _tcph;
        unsigned long timeout;
        unsigned int index;
-       
+
        th = skb_header_pointer(skb, iph->ihl * 4,
                                sizeof(_tcph), &_tcph);
        BUG_ON(th == NULL);
-       
+
        write_lock_bh(&tcp_lock);
        old_state = conntrack->proto.tcp.state;
        dir = CTINFO2DIR(ctinfo);
@@ -907,7 +906,7 @@ static int tcp_packet(struct ip_conntrack *conntrack,
        switch (new_state) {
        case TCP_CONNTRACK_IGNORE:
                /* Ignored packets:
-                * 
+                *
                 * a) SYN in ORIGINAL
                 * b) SYN/ACK in REPLY
                 * c) ACK in reply direction after initial SYN in original.
@@ -916,30 +915,30 @@ static int tcp_packet(struct ip_conntrack *conntrack,
                    && conntrack->proto.tcp.last_index == TCP_SYN_SET
                    && conntrack->proto.tcp.last_dir != dir
                    && ntohl(th->ack_seq) ==
-                            conntrack->proto.tcp.last_end) {
-                       /* This SYN/ACK acknowledges a SYN that we earlier 
+                            conntrack->proto.tcp.last_end) {
+                       /* This SYN/ACK acknowledges a SYN that we earlier
                         * ignored as invalid. This means that the client and
                         * the server are both in sync, while the firewall is
                         * not. We kill this session and block the SYN/ACK so
-                        * that the client cannot but retransmit its SYN and 
+                        * that the client cannot but retransmit its SYN and
                         * thus initiate a clean new session.
                         */
-                       write_unlock_bh(&tcp_lock);
+                       write_unlock_bh(&tcp_lock);
                        if (LOG_INVALID(IPPROTO_TCP))
                                nf_log_packet(PF_INET, 0, skb, NULL, NULL,
                                              NULL, "ip_ct_tcp: "
                                              "killing out of sync session ");
-                       if (del_timer(&conntrack->timeout))
-                               conntrack->timeout.function((unsigned long)
-                                                           conntrack);
-                       return -NF_DROP;
+                       if (del_timer(&conntrack->timeout))
+                               conntrack->timeout.function((unsigned long)
+                                                           conntrack);
+                       return -NF_DROP;
                }
                conntrack->proto.tcp.last_index = index;
                conntrack->proto.tcp.last_dir = dir;
                conntrack->proto.tcp.last_seq = ntohl(th->seq);
-               conntrack->proto.tcp.last_end = 
+               conntrack->proto.tcp.last_end =
                    segment_seq_plus_len(ntohl(th->seq), skb->len, iph, th);
-               
+
                write_unlock_bh(&tcp_lock);
                if (LOG_INVALID(IPPROTO_TCP))
                        nf_log_packet(PF_INET, 0, skb, NULL, NULL, NULL,
@@ -959,16 +958,16 @@ static int tcp_packet(struct ip_conntrack *conntrack,
                if (old_state < TCP_CONNTRACK_TIME_WAIT)
                        break;
                if ((conntrack->proto.tcp.seen[dir].flags &
-                        IP_CT_TCP_FLAG_CLOSE_INIT)
+                        IP_CT_TCP_FLAG_CLOSE_INIT)
                    || after(ntohl(th->seq),
-                            conntrack->proto.tcp.seen[dir].td_end)) {  
-                       /* Attempt to reopen a closed connection.
-                       * Delete this connection and look up again. */
-                       write_unlock_bh(&tcp_lock);
-                       if (del_timer(&conntrack->timeout))
-                               conntrack->timeout.function((unsigned long)
-                                                           conntrack);
-                       return -NF_REPEAT;
+                            conntrack->proto.tcp.seen[dir].td_end)) {
+                       /* Attempt to reopen a closed connection.
+                       * Delete this connection and look up again. */
+                       write_unlock_bh(&tcp_lock);
+                       if (del_timer(&conntrack->timeout))
+                               conntrack->timeout.function((unsigned long)
+                                                           conntrack);
+                       return -NF_REPEAT;
                } else {
                        write_unlock_bh(&tcp_lock);
                        if (LOG_INVALID(IPPROTO_TCP))
@@ -979,9 +978,9 @@ static int tcp_packet(struct ip_conntrack *conntrack,
        case TCP_CONNTRACK_CLOSE:
                if (index == TCP_RST_SET
                    && ((test_bit(IPS_SEEN_REPLY_BIT, &conntrack->status)
-                        && conntrack->proto.tcp.last_index == TCP_SYN_SET)
-                       || (!test_bit(IPS_ASSURED_BIT, &conntrack->status)
-                           && conntrack->proto.tcp.last_index == TCP_ACK_SET))
+                        && conntrack->proto.tcp.last_index == TCP_SYN_SET)
+                       || (!test_bit(IPS_ASSURED_BIT, &conntrack->status)
+                           && conntrack->proto.tcp.last_index == TCP_ACK_SET))
                    && ntohl(th->ack_seq) == conntrack->proto.tcp.last_end) {
                        /* RST sent to invalid SYN or ACK we had let through
                         * at a) and c) above:
@@ -1000,13 +999,13 @@ static int tcp_packet(struct ip_conntrack *conntrack,
                break;
        }
 
-       if (!tcp_in_window(&conntrack->proto.tcp, dir, index, 
+       if (!tcp_in_window(&conntrack->proto.tcp, dir, index,
                           skb, iph, th)) {
                write_unlock_bh(&tcp_lock);
                return -NF_ACCEPT;
        }
     in_window:
-       /* From now on we have got in-window packets */ 
+       /* From now on we have got in-window packets */
        conntrack->proto.tcp.last_index = index;
 
        DEBUGP("tcp_conntracks: src=%u.%u.%u.%u:%hu dst=%u.%u.%u.%u:%hu "
@@ -1018,9 +1017,9 @@ static int tcp_packet(struct ip_conntrack *conntrack,
                old_state, new_state);
 
        conntrack->proto.tcp.state = new_state;
-       if (old_state != new_state 
+       if (old_state != new_state
            && (new_state == TCP_CONNTRACK_FIN_WAIT
-               || new_state == TCP_CONNTRACK_CLOSE))
+               || new_state == TCP_CONNTRACK_CLOSE))
                conntrack->proto.tcp.seen[dir].flags |= IP_CT_TCP_FLAG_CLOSE_INIT;
        timeout = conntrack->proto.tcp.retrans >= ip_ct_tcp_max_retrans
                  && *tcp_timeouts[new_state] > ip_ct_tcp_timeout_max_retrans
@@ -1046,8 +1045,8 @@ static int tcp_packet(struct ip_conntrack *conntrack,
                   && (old_state == TCP_CONNTRACK_SYN_RECV
                       || old_state == TCP_CONNTRACK_ESTABLISHED)
                   && new_state == TCP_CONNTRACK_ESTABLISHED) {
-               /* Set ASSURED if we see see valid ack in ESTABLISHED 
-                  after SYN_RECV or a valid answer for a picked up 
+               /* Set ASSURED if we see see valid ack in ESTABLISHED
+                  after SYN_RECV or a valid answer for a picked up
                   connection. */
                set_bit(IPS_ASSURED_BIT, &conntrack->status);
                ip_conntrack_event_cache(IPCT_STATUS, skb);
@@ -1056,7 +1055,7 @@ static int tcp_packet(struct ip_conntrack *conntrack,
 
        return NF_ACCEPT;
 }
+
 /* Called when a new connection for this protocol found. */
 static int tcp_new(struct ip_conntrack *conntrack,
                   const struct sk_buff *skb)
@@ -1072,7 +1071,7 @@ static int tcp_new(struct ip_conntrack *conntrack,
        th = skb_header_pointer(skb, iph->ihl * 4,
                                sizeof(_tcph), &_tcph);
        BUG_ON(th == NULL);
-       
+
        /* Don't need lock here: this conntrack not in circulation yet */
        new_state
                = tcp_conntracks[0][get_conntrack_index(th)]
@@ -1113,7 +1112,7 @@ static int tcp_new(struct ip_conntrack *conntrack,
                if (conntrack->proto.tcp.seen[0].td_maxwin == 0)
                        conntrack->proto.tcp.seen[0].td_maxwin = 1;
                conntrack->proto.tcp.seen[0].td_maxend =
-                       conntrack->proto.tcp.seen[0].td_end + 
+                       conntrack->proto.tcp.seen[0].td_end +
                        conntrack->proto.tcp.seen[0].td_maxwin;
                conntrack->proto.tcp.seen[0].td_scale = 0;
 
@@ -1123,25 +1122,25 @@ static int tcp_new(struct ip_conntrack *conntrack,
                conntrack->proto.tcp.seen[1].flags = IP_CT_TCP_FLAG_SACK_PERM |
                                                     IP_CT_TCP_FLAG_BE_LIBERAL;
        }
-    
+
        conntrack->proto.tcp.seen[1].td_end = 0;
        conntrack->proto.tcp.seen[1].td_maxend = 0;
        conntrack->proto.tcp.seen[1].td_maxwin = 1;
-       conntrack->proto.tcp.seen[1].td_scale = 0;      
+       conntrack->proto.tcp.seen[1].td_scale = 0;
 
        /* tcp_packet will set them */
        conntrack->proto.tcp.state = TCP_CONNTRACK_NONE;
        conntrack->proto.tcp.last_index = TCP_NONE_SET;
-        
+
        DEBUGP("tcp_new: sender end=%u maxend=%u maxwin=%u scale=%i "
               "receiver end=%u maxend=%u maxwin=%u scale=%i\n",
                sender->td_end, sender->td_maxend, sender->td_maxwin,
-               sender->td_scale, 
+               sender->td_scale,
                receiver->td_end, receiver->td_maxend, receiver->td_maxwin,
                receiver->td_scale);
        return 1;
 }
-  
+
 struct ip_conntrack_protocol ip_conntrack_protocol_tcp =
 {
        .proto                  = IPPROTO_TCP,
index d0e8a16970ec3533088497c17e14d0fedbd3f829..14c30c646c7fed33cdfab328ef590f89e5ce83b8 100644 (file)
@@ -7,7 +7,6 @@
  */
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/netfilter.h>
 #include <linux/in.h>
@@ -70,7 +69,7 @@ static int udp_packet(struct ip_conntrack *conntrack,
        /* If we've seen traffic both ways, this is some kind of UDP
           stream.  Extend timeout. */
        if (test_bit(IPS_SEEN_REPLY_BIT, &conntrack->status)) {
-               ip_ct_refresh_acct(conntrack, ctinfo, skb, 
+               ip_ct_refresh_acct(conntrack, ctinfo, skb,
                                   ip_ct_udp_timeout_stream);
                /* Also, more likely to be important, and not a probe */
                if (!test_and_set_bit(IPS_ASSURED_BIT, &conntrack->status))
@@ -102,7 +101,7 @@ static int udp_error(struct sk_buff *skb, enum ip_conntrack_info *ctinfo,
                                  "ip_ct_udp: short packet ");
                return -NF_ACCEPT;
        }
-       
+
        /* Truncated/malformed packets */
        if (ntohs(hdr->len) > udplen || ntohs(hdr->len) < sizeof(*hdr)) {
                if (LOG_INVALID(IPPROTO_UDP))
@@ -110,7 +109,7 @@ static int udp_error(struct sk_buff *skb, enum ip_conntrack_info *ctinfo,
                                  "ip_ct_udp: truncated/malformed packet ");
                return -NF_ACCEPT;
        }
-       
+
        /* Packet with no checksum */
        if (!hdr->check)
                return NF_ACCEPT;
@@ -126,7 +125,7 @@ static int udp_error(struct sk_buff *skb, enum ip_conntrack_info *ctinfo,
                                  "ip_ct_udp: bad UDP checksum ");
                return -NF_ACCEPT;
        }
-       
+
        return NF_ACCEPT;
 }
 
index 11c588a10e6b5e7adf993f59a3ae5a8a6dd2cfd3..c59a962c1f61c2c415b2e6ff7b12de755fa72864 100644 (file)
@@ -321,7 +321,7 @@ int ct_sip_get_info(const char *dptr, size_t dlen,
                        continue;
                }
                aux = ct_sip_search(hnfo->ln_str, dptr, hnfo->ln_strlen,
-                                   ct_sip_lnlen(dptr, limit),
+                                   ct_sip_lnlen(dptr, limit),
                                    hnfo->case_sensitive);
                if (!aux) {
                        DEBUGP("'%s' not found in '%s'.\n", hnfo->ln_str,
@@ -406,7 +406,7 @@ static int sip_help(struct sk_buff **pskb,
        if (dataoff >= (*pskb)->len) {
                DEBUGP("skb->len = %u\n", (*pskb)->len);
                return NF_ACCEPT;
-        }
+       }
 
        ip_ct_refresh(ct, *pskb, sip_timeout * HZ);
 
@@ -439,16 +439,16 @@ static int sip_help(struct sk_buff **pskb,
        }
        /* Get ip and port address from SDP packet. */
        if (ct_sip_get_info(dptr, datalen, &matchoff, &matchlen,
-                           POS_CONNECTION) > 0) {
+                           POS_CONNECTION) > 0) {
 
                /* We'll drop only if there are parse problems. */
                if (parse_ipaddr(dptr + matchoff, NULL, &ipaddr,
-                                dptr + datalen) < 0) {
+                                dptr + datalen) < 0) {
                        ret = NF_DROP;
                        goto out;
                }
                if (ct_sip_get_info(dptr, datalen, &matchoff, &matchlen,
-                                   POS_MEDIA) > 0) {
+                                   POS_MEDIA) > 0) {
 
                        port = simple_strtoul(dptr + matchoff, NULL, 10);
                        if (port < 1024) {
index 86efb5449676b959a97909d64ed0d8645323f81c..56b2f7546d1e9a8f5270f679812d598f386bad6b 100644 (file)
@@ -46,7 +46,7 @@ DECLARE_PER_CPU(struct ip_conntrack_stat, ip_conntrack_stat);
 
 static int kill_proto(struct ip_conntrack *i, void *data)
 {
-       return (i->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum == 
+       return (i->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum ==
                        *((u_int8_t *) data));
 }
 
@@ -124,12 +124,12 @@ static void *ct_seq_next(struct seq_file *s, void *v, loff_t *pos)
        (*pos)++;
        return ct_get_next(s, v);
 }
-  
+
 static void ct_seq_stop(struct seq_file *s, void *v)
 {
        read_unlock_bh(&ip_conntrack_lock);
 }
+
 static int ct_seq_show(struct seq_file *s, void *v)
 {
        const struct ip_conntrack_tuple_hash *hash = v;
@@ -155,12 +155,12 @@ static int ct_seq_show(struct seq_file *s, void *v)
 
        if (proto->print_conntrack(s, conntrack))
                return -ENOSPC;
-  
+
        if (print_tuple(s, &conntrack->tuplehash[IP_CT_DIR_ORIGINAL].tuple,
                        proto))
                return -ENOSPC;
 
-       if (seq_print_counters(s, &conntrack->counters[IP_CT_DIR_ORIGINAL]))
+       if (seq_print_counters(s, &conntrack->counters[IP_CT_DIR_ORIGINAL]))
                return -ENOSPC;
 
        if (!(test_bit(IPS_SEEN_REPLY_BIT, &conntrack->status)))
@@ -171,7 +171,7 @@ static int ct_seq_show(struct seq_file *s, void *v)
                        proto))
                return -ENOSPC;
 
-       if (seq_print_counters(s, &conntrack->counters[IP_CT_DIR_REPLY]))
+       if (seq_print_counters(s, &conntrack->counters[IP_CT_DIR_REPLY]))
                return -ENOSPC;
 
        if (test_bit(IPS_ASSURED_BIT, &conntrack->status))
@@ -200,7 +200,7 @@ static struct seq_operations ct_seq_ops = {
        .stop  = ct_seq_stop,
        .show  = ct_seq_show
 };
-  
+
 static int ct_open(struct inode *inode, struct file *file)
 {
        struct seq_file *seq;
@@ -222,14 +222,14 @@ out_free:
        return ret;
 }
 
-static struct file_operations ct_file_ops = {
+static const struct file_operations ct_file_ops = {
        .owner   = THIS_MODULE,
        .open    = ct_open,
        .read    = seq_read,
        .llseek  = seq_lseek,
        .release = seq_release_private,
 };
-  
+
 /* expects */
 static void *exp_seq_start(struct seq_file *s, loff_t *pos)
 {
@@ -253,7 +253,7 @@ static void *exp_seq_start(struct seq_file *s, loff_t *pos)
 
 static void *exp_seq_next(struct seq_file *s, void *v, loff_t *pos)
 {
-       struct list_head *e = v;
+       struct list_head *e = v;
 
        ++*pos;
        e = e->next;
@@ -297,8 +297,8 @@ static int exp_open(struct inode *inode, struct file *file)
 {
        return seq_open(file, &exp_seq_ops);
 }
-  
-static struct file_operations exp_file_ops = {
+
+static const struct file_operations exp_file_ops = {
        .owner   = THIS_MODULE,
        .open    = exp_open,
        .read    = seq_read,
@@ -386,7 +386,7 @@ static int ct_cpu_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &ct_cpu_seq_ops);
 }
 
-static struct file_operations ct_cpu_seq_fops = {
+static const struct file_operations ct_cpu_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = ct_cpu_seq_open,
        .read    = seq_read,
@@ -426,14 +426,14 @@ static unsigned int ip_conntrack_help(unsigned int hooknum,
 }
 
 static unsigned int ip_conntrack_defrag(unsigned int hooknum,
-                                       struct sk_buff **pskb,
-                                       const struct net_device *in,
-                                       const struct net_device *out,
-                                       int (*okfn)(struct sk_buff *))
+                                       struct sk_buff **pskb,
+                                       const struct net_device *in,
+                                       const struct net_device *out,
+                                       int (*okfn)(struct sk_buff *))
 {
 #if !defined(CONFIG_IP_NF_NAT) && !defined(CONFIG_IP_NF_NAT_MODULE)
        /* Previously seen (loopback)?  Ignore.  Do this before
-           fragment check. */
+          fragment check. */
        if ((*pskb)->nfct)
                return NF_ACCEPT;
 #endif
@@ -441,7 +441,7 @@ static unsigned int ip_conntrack_defrag(unsigned int hooknum,
        /* Gather fragments. */
        if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
                *pskb = ip_ct_gather_frags(*pskb,
-                                          hooknum == NF_IP_PRE_ROUTING ? 
+                                          hooknum == NF_IP_PRE_ROUTING ?
                                           IP_DEFRAG_CONNTRACK_IN :
                                           IP_DEFRAG_CONNTRACK_OUT);
                if (!*pskb)
@@ -776,7 +776,7 @@ static ctl_table ip_ct_net_table[] = {
        {
                .ctl_name       = CTL_NET,
                .procname       = "net",
-               .mode           = 0555, 
+               .mode           = 0555,
                .child          = ip_ct_ipv4_table,
        },
        { .ctl_name = 0 }
@@ -796,7 +796,7 @@ int ip_conntrack_protocol_register(struct ip_conntrack_protocol *proto)
                ret = -EBUSY;
                goto out;
        }
-       ip_ct_protos[proto->proto] = proto;
+       rcu_assign_pointer(ip_ct_protos[proto->proto], proto);
  out:
        write_unlock_bh(&ip_conntrack_lock);
        return ret;
@@ -805,11 +805,10 @@ int ip_conntrack_protocol_register(struct ip_conntrack_protocol *proto)
 void ip_conntrack_protocol_unregister(struct ip_conntrack_protocol *proto)
 {
        write_lock_bh(&ip_conntrack_lock);
-       ip_ct_protos[proto->proto] = &ip_conntrack_generic_protocol;
+       rcu_assign_pointer(ip_ct_protos[proto->proto],
+                          &ip_conntrack_generic_protocol);
        write_unlock_bh(&ip_conntrack_lock);
-
-       /* Somebody could be still looking at the proto in bh. */
-       synchronize_net();
+       synchronize_rcu();
 
        /* Remove all contrack entries for this protocol */
        ip_ct_iterate_cleanup(kill_proto, &proto->proto);
@@ -849,7 +848,7 @@ static int __init ip_conntrack_standalone_init(void)
                goto cleanup_proc_stat;
        }
 #ifdef CONFIG_SYSCTL
-       ip_ct_sysctl_header = register_sysctl_table(ip_ct_net_table, 0);
+       ip_ct_sysctl_header = register_sysctl_table(ip_ct_net_table);
        if (ip_ct_sysctl_header == NULL) {
                printk("ip_conntrack: can't register to sysctl.\n");
                ret = -ENOMEM;
index ef56de2eff0c71edc8dd8f29c1d2e431dc041f32..76e175e7a9729ade19b7bef5d1dcff2de6ce4cf8 100644 (file)
@@ -33,7 +33,7 @@ MODULE_PARM_DESC(ports, "port numbers of tftp servers");
 
 #if 0
 #define DEBUGP(format, args...) printk("%s:%s:" format, \
-                                       __FILE__, __FUNCTION__ , ## args)
+                                      __FILE__, __FUNCTION__ , ## args)
 #else
 #define DEBUGP(format, args...)
 #endif
@@ -113,7 +113,7 @@ static void ip_conntrack_tftp_fini(void)
                DEBUGP("unregistering helper for port %d\n",
                        ports[i]);
                ip_conntrack_helper_unregister(&tftp[i]);
-       } 
+       }
 }
 
 static int __init ip_conntrack_tftp_init(void)
index 5e08c2bf887d873f84cb67e1acfca0273c15be7d..40737fdbe9a73126dd17e59f97371973989c2cfb 100644 (file)
@@ -50,7 +50,7 @@ static struct ip_nat_protocol *ip_nat_protos[MAX_IP_NAT_PROTO];
 static inline struct ip_nat_protocol *
 __ip_nat_proto_find(u_int8_t protonum)
 {
-       return ip_nat_protos[protonum];
+       return rcu_dereference(ip_nat_protos[protonum]);
 }
 
 struct ip_nat_protocol *
@@ -58,13 +58,11 @@ ip_nat_proto_find_get(u_int8_t protonum)
 {
        struct ip_nat_protocol *p;
 
-       /* we need to disable preemption to make sure 'p' doesn't get
-        * removed until we've grabbed the reference */
-       preempt_disable();
+       rcu_read_lock();
        p = __ip_nat_proto_find(protonum);
        if (!try_module_get(p->me))
                p = &ip_nat_unknown_protocol;
-       preempt_enable();
+       rcu_read_unlock();
 
        return p;
 }
@@ -120,8 +118,8 @@ static int
 in_range(const struct ip_conntrack_tuple *tuple,
         const struct ip_nat_range *range)
 {
-       struct ip_nat_protocol *proto = 
-                               __ip_nat_proto_find(tuple->dst.protonum);
+       struct ip_nat_protocol *proto;
+       int ret = 0;
 
        /* If we are supposed to map IPs, then we must be in the
           range specified, otherwise let this drag us onto a new src IP. */
@@ -131,12 +129,15 @@ in_range(const struct ip_conntrack_tuple *tuple,
                        return 0;
        }
 
+       rcu_read_lock();
+       proto = __ip_nat_proto_find(tuple->dst.protonum);
        if (!(range->flags & IP_NAT_RANGE_PROTO_SPECIFIED)
            || proto->in_range(tuple, IP_NAT_MANIP_SRC,
                               &range->min, &range->max))
-               return 1;
+               ret = 1;
+       rcu_read_unlock();
 
-       return 0;
+       return ret;
 }
 
 static inline int
@@ -260,27 +261,25 @@ get_unique_tuple(struct ip_conntrack_tuple *tuple,
        /* 3) The per-protocol part of the manip is made to map into
           the range to make a unique tuple. */
 
-       proto = ip_nat_proto_find_get(orig_tuple->dst.protonum);
+       rcu_read_lock();
+       proto = __ip_nat_proto_find(orig_tuple->dst.protonum);
 
        /* Change protocol info to have some randomization */
        if (range->flags & IP_NAT_RANGE_PROTO_RANDOM) {
                proto->unique_tuple(tuple, range, maniptype, conntrack);
-               ip_nat_proto_put(proto);
-               return;
+               goto out;
        }
 
        /* Only bother mapping if it's not already in range and unique */
        if ((!(range->flags & IP_NAT_RANGE_PROTO_SPECIFIED)
             || proto->in_range(tuple, maniptype, &range->min, &range->max))
-           && !ip_nat_used_tuple(tuple, conntrack)) {
-               ip_nat_proto_put(proto);
-               return;
-       }
+           && !ip_nat_used_tuple(tuple, conntrack))
+               goto out;
 
        /* Last change: get protocol to try to obtain unique tuple. */
        proto->unique_tuple(tuple, range, maniptype, conntrack);
-
-       ip_nat_proto_put(proto);
+out:
+       rcu_read_unlock();
 }
 
 unsigned int
@@ -360,12 +359,11 @@ manip_pkt(u_int16_t proto,
        iph = (void *)(*pskb)->data + iphdroff;
 
        /* Manipulate protcol part. */
-       p = ip_nat_proto_find_get(proto);
-       if (!p->manip_pkt(pskb, iphdroff, target, maniptype)) {
-               ip_nat_proto_put(p);
+
+       /* rcu_read_lock()ed by nf_hook_slow */
+       p = __ip_nat_proto_find(proto);
+       if (!p->manip_pkt(pskb, iphdroff, target, maniptype))
                return 0;
-       }
-       ip_nat_proto_put(p);
 
        iph = (void *)(*pskb)->data + iphdroff;
 
@@ -422,6 +420,7 @@ int ip_nat_icmp_reply_translation(struct ip_conntrack *ct,
                struct icmphdr icmp;
                struct iphdr ip;
        } *inside;
+       struct ip_conntrack_protocol *proto;
        struct ip_conntrack_tuple inner, target;
        int hdrlen = (*pskb)->nh.iph->ihl * 4;
        enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
@@ -443,8 +442,8 @@ int ip_nat_icmp_reply_translation(struct ip_conntrack *ct,
                     (*pskb)->nfctinfo == IP_CT_RELATED+IP_CT_IS_REPLY);
 
        /* Redirects on non-null nats must be dropped, else they'll
-           start talking to each other without our translation, and be
-           confused... --RR */
+          start talking to each other without our translation, and be
+          confused... --RR */
        if (inside->icmp.type == ICMP_REDIRECT) {
                /* If NAT isn't finished, assume it and drop. */
                if ((ct->status & IPS_NAT_DONE_MASK) != IPS_NAT_DONE_MASK)
@@ -457,10 +456,11 @@ int ip_nat_icmp_reply_translation(struct ip_conntrack *ct,
        DEBUGP("icmp_reply_translation: translating error %p manp %u dir %s\n",
               *pskb, manip, dir == IP_CT_DIR_ORIGINAL ? "ORIG" : "REPLY");
 
+       /* rcu_read_lock()ed by nf_hook_slow */
+       proto = __ip_conntrack_proto_find(inside->ip.protocol);
        if (!ip_ct_get_tuple(&inside->ip, *pskb, (*pskb)->nh.iph->ihl*4 +
-                            sizeof(struct icmphdr) + inside->ip.ihl*4,
-                            &inner,
-                            __ip_conntrack_proto_find(inside->ip.protocol)))
+                            sizeof(struct icmphdr) + inside->ip.ihl*4,
+                            &inner, proto))
                return 0;
 
        /* Change inner back to look like incoming packet.  We do the
@@ -515,7 +515,7 @@ int ip_nat_protocol_register(struct ip_nat_protocol *proto)
                ret = -EBUSY;
                goto out;
        }
-       ip_nat_protos[proto->protonum] = proto;
+       rcu_assign_pointer(ip_nat_protos[proto->protonum], proto);
  out:
        write_unlock_bh(&ip_nat_lock);
        return ret;
@@ -526,18 +526,17 @@ EXPORT_SYMBOL(ip_nat_protocol_register);
 void ip_nat_protocol_unregister(struct ip_nat_protocol *proto)
 {
        write_lock_bh(&ip_nat_lock);
-       ip_nat_protos[proto->protonum] = &ip_nat_unknown_protocol;
+       rcu_assign_pointer(ip_nat_protos[proto->protonum],
+                          &ip_nat_unknown_protocol);
        write_unlock_bh(&ip_nat_lock);
-
-       /* Someone could be still looking at the proto in a bh. */
-       synchronize_net();
+       synchronize_rcu();
 }
 EXPORT_SYMBOL(ip_nat_protocol_unregister);
 
 #if defined(CONFIG_IP_NF_CONNTRACK_NETLINK) || \
     defined(CONFIG_IP_NF_CONNTRACK_NETLINK_MODULE)
 int
-ip_nat_port_range_to_nfattr(struct sk_buff *skb, 
+ip_nat_port_range_to_nfattr(struct sk_buff *skb,
                            const struct ip_nat_range *range)
 {
        NFA_PUT(skb, CTA_PROTONAT_PORT_MIN, sizeof(__be16),
@@ -555,21 +554,21 @@ int
 ip_nat_port_nfattr_to_range(struct nfattr *tb[], struct ip_nat_range *range)
 {
        int ret = 0;
-       
+
        /* we have to return whether we actually parsed something or not */
 
        if (tb[CTA_PROTONAT_PORT_MIN-1]) {
                ret = 1;
-               range->min.tcp.port = 
+               range->min.tcp.port =
                        *(__be16 *)NFA_DATA(tb[CTA_PROTONAT_PORT_MIN-1]);
        }
-       
+
        if (!tb[CTA_PROTONAT_PORT_MAX-1]) {
-               if (ret) 
+               if (ret)
                        range->max.tcp.port = range->min.tcp.port;
        } else {
                ret = 1;
-               range->max.tcp.port = 
+               range->max.tcp.port =
                        *(__be16 *)NFA_DATA(tb[CTA_PROTONAT_PORT_MAX-1]);
        }
 
@@ -594,10 +593,10 @@ static int __init ip_nat_init(void)
        /* Sew in builtin protocols. */
        write_lock_bh(&ip_nat_lock);
        for (i = 0; i < MAX_IP_NAT_PROTO; i++)
-               ip_nat_protos[i] = &ip_nat_unknown_protocol;
-       ip_nat_protos[IPPROTO_TCP] = &ip_nat_protocol_tcp;
-       ip_nat_protos[IPPROTO_UDP] = &ip_nat_protocol_udp;
-       ip_nat_protos[IPPROTO_ICMP] = &ip_nat_protocol_icmp;
+               rcu_assign_pointer(ip_nat_protos[i], &ip_nat_unknown_protocol);
+       rcu_assign_pointer(ip_nat_protos[IPPROTO_TCP], &ip_nat_protocol_tcp);
+       rcu_assign_pointer(ip_nat_protos[IPPROTO_UDP], &ip_nat_protocol_udp);
+       rcu_assign_pointer(ip_nat_protos[IPPROTO_ICMP], &ip_nat_protocol_icmp);
        write_unlock_bh(&ip_nat_lock);
 
        for (i = 0; i < ip_nat_htable_size; i++) {
@@ -605,8 +604,8 @@ static int __init ip_nat_init(void)
        }
 
        /* FIXME: Man, this is a hack.  <SIGH> */
-       IP_NF_ASSERT(ip_conntrack_destroyed == NULL);
-       ip_conntrack_destroyed = &ip_nat_cleanup_conntrack;
+       IP_NF_ASSERT(rcu_dereference(ip_conntrack_destroyed) == NULL);
+       rcu_assign_pointer(ip_conntrack_destroyed, ip_nat_cleanup_conntrack);
 
        /* Initialize fake conntrack so that NAT will skip it */
        ip_conntrack_untracked.status |= IPS_NAT_DONE_MASK;
@@ -624,7 +623,8 @@ static int clean_nat(struct ip_conntrack *i, void *data)
 static void __exit ip_nat_cleanup(void)
 {
        ip_ct_iterate_cleanup(&clean_nat, NULL);
-       ip_conntrack_destroyed = NULL;
+       rcu_assign_pointer(ip_conntrack_destroyed, NULL);
+       synchronize_rcu();
        vfree(bysource);
 }
 
index 913960e1380ffd6cf3538006e7cf933bf6260157..32e01d8dffcb08fc2a7882d74cd72e0f79cf24ab 100644 (file)
@@ -50,7 +50,7 @@ mangle_rfc959_packet(struct sk_buff **pskb,
        DEBUGP("calling ip_nat_mangle_tcp_packet\n");
 
        *seq += strlen(buffer) - matchlen;
-       return ip_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff, 
+       return ip_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff,
                                        matchlen, buffer, strlen(buffer));
 }
 
@@ -72,7 +72,7 @@ mangle_eprt_packet(struct sk_buff **pskb,
        DEBUGP("calling ip_nat_mangle_tcp_packet\n");
 
        *seq += strlen(buffer) - matchlen;
-       return ip_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff, 
+       return ip_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff,
                                        matchlen, buffer, strlen(buffer));
 }
 
@@ -94,7 +94,7 @@ mangle_epsv_packet(struct sk_buff **pskb,
        DEBUGP("calling ip_nat_mangle_tcp_packet\n");
 
        *seq += strlen(buffer) - matchlen;
-       return ip_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff, 
+       return ip_nat_mangle_tcp_packet(pskb, ct, ctinfo, matchoff,
                                        matchlen, buffer, strlen(buffer));
 }
 
index 2e5c4bc52a60d99f3641a5ffe91fdf3681cad5e6..dc778cfef58b43b37ac523f0257ad593c6b09dae 100644 (file)
@@ -1,4 +1,4 @@
-/* ip_nat_helper.c - generic support functions for NAT helpers 
+/* ip_nat_helper.c - generic support functions for NAT helpers
  *
  * (C) 2000-2002 Harald Welte <laforge@netfilter.org>
  * (C) 2003-2004 Netfilter Core Team <coreteam@netfilter.org>
@@ -8,7 +8,7 @@
  * published by the Free Software Foundation.
  *
  *     14 Jan 2002 Harald Welte <laforge@gnumonks.org>:
- *             - add support for SACK adjustment 
+ *             - add support for SACK adjustment
  *     14 Mar 2002 Harald Welte <laforge@gnumonks.org>:
  *             - merge SACK support into newnat API
  *     16 Aug 2002 Brian J. Murrell <netfilter@interlinx.bc.ca>:
 static DEFINE_SPINLOCK(ip_nat_seqofs_lock);
 
 /* Setup TCP sequence correction given this change at this sequence */
-static inline void 
+static inline void
 adjust_tcp_sequence(u32 seq,
                    int sizediff,
-                   struct ip_conntrack *ct, 
+                   struct ip_conntrack *ct,
                    enum ip_conntrack_info ctinfo)
 {
        int dir;
@@ -150,7 +150,7 @@ static int enlarge_skb(struct sk_buff **pskb, unsigned int extra)
  * skb enlargement, ...
  *
  * */
-int 
+int
 ip_nat_mangle_tcp_packet(struct sk_buff **pskb,
                         struct ip_conntrack *ct,
                         enum ip_conntrack_info ctinfo,
@@ -186,7 +186,7 @@ ip_nat_mangle_tcp_packet(struct sk_buff **pskb,
                tcph->check = tcp_v4_check(datalen,
                                           iph->saddr, iph->daddr,
                                           csum_partial((char *)tcph,
-                                                       datalen, 0));
+                                                       datalen, 0));
        } else
                nf_proto_csum_replace2(&tcph->check, *pskb,
                                        htons(oldlen), htons(datalen), 1);
@@ -202,7 +202,7 @@ ip_nat_mangle_tcp_packet(struct sk_buff **pskb,
        return 1;
 }
 EXPORT_SYMBOL(ip_nat_mangle_tcp_packet);
-                       
+
 /* Generic function for mangling variable-length address changes inside
  * NATed UDP connections (like the CONNECT DATA XXXXX MESG XXXXX INDEX XXXXX
  * command in the Amanda protocol)
@@ -213,7 +213,7 @@ EXPORT_SYMBOL(ip_nat_mangle_tcp_packet);
  * XXX - This function could be merged with ip_nat_mangle_tcp_packet which
  *       should be fairly easy to do.
  */
-int 
+int
 ip_nat_mangle_udp_packet(struct sk_buff **pskb,
                         struct ip_conntrack *ct,
                         enum ip_conntrack_info ctinfo,
@@ -228,8 +228,8 @@ ip_nat_mangle_udp_packet(struct sk_buff **pskb,
 
        /* UDP helpers might accidentally mangle the wrong packet */
        iph = (*pskb)->nh.iph;
-       if ((*pskb)->len < iph->ihl*4 + sizeof(*udph) + 
-                              match_offset + match_len)
+       if ((*pskb)->len < iph->ihl*4 + sizeof(*udph) +
+                              match_offset + match_len)
                return 0;
 
        if (!skb_make_writable(pskb, (*pskb)->len))
@@ -258,9 +258,9 @@ ip_nat_mangle_udp_packet(struct sk_buff **pskb,
        if ((*pskb)->ip_summed != CHECKSUM_PARTIAL) {
                udph->check = 0;
                udph->check = csum_tcpudp_magic(iph->saddr, iph->daddr,
-                                               datalen, IPPROTO_UDP,
-                                               csum_partial((char *)udph,
-                                                            datalen, 0));
+                                               datalen, IPPROTO_UDP,
+                                               csum_partial((char *)udph,
+                                                            datalen, 0));
                if (!udph->check)
                        udph->check = CSUM_MANGLED_0;
        } else
@@ -273,7 +273,7 @@ EXPORT_SYMBOL(ip_nat_mangle_udp_packet);
 /* Adjust one found SACK option including checksum correction */
 static void
 sack_adjust(struct sk_buff *skb,
-           struct tcphdr *tcph, 
+           struct tcphdr *tcph,
            unsigned int sackoff,
            unsigned int sackend,
            struct ip_nat_seq *natseq)
@@ -360,14 +360,14 @@ ip_nat_sack_adjust(struct sk_buff **pskb,
 
 /* TCP sequence number adjustment.  Returns 1 on success, 0 on failure */
 int
-ip_nat_seq_adjust(struct sk_buff **pskb, 
-                 struct ip_conntrack *ct, 
+ip_nat_seq_adjust(struct sk_buff **pskb,
+                 struct ip_conntrack *ct,
                  enum ip_conntrack_info ctinfo)
 {
        struct tcphdr *tcph;
        int dir;
        __be32 newseq, newack;
-       struct ip_nat_seq *this_way, *other_way;        
+       struct ip_nat_seq *this_way, *other_way;
 
        dir = CTINFO2DIR(ctinfo);
 
index ec957bbb53665fa5105151e23feea63e820318ce..24ce4a5023d76b0d3b9cb2abcef6e8c5740e357e 100644 (file)
@@ -202,10 +202,10 @@ pptp_outbound_pkt(struct sk_buff **pskb,
 
        /* mangle packet */
        if (ip_nat_mangle_tcp_packet(pskb, ct, ctinfo,
-                                    cid_off + sizeof(struct pptp_pkt_hdr) +
-                                    sizeof(struct PptpControlHeader),
-                                    sizeof(new_callid), (char *)&new_callid,
-                                    sizeof(new_callid)) == 0)
+                                    cid_off + sizeof(struct pptp_pkt_hdr) +
+                                    sizeof(struct PptpControlHeader),
+                                    sizeof(new_callid), (char *)&new_callid,
+                                    sizeof(new_callid)) == 0)
                return NF_DROP;
 
        return NF_ACCEPT;
@@ -293,7 +293,7 @@ pptp_inbound_pkt(struct sk_buff **pskb,
                ntohs(REQ_CID(pptpReq, pcid_off)), ntohs(new_pcid));
 
        if (ip_nat_mangle_tcp_packet(pskb, ct, ctinfo,
-                                    pcid_off + sizeof(struct pptp_pkt_hdr) +
+                                    pcid_off + sizeof(struct pptp_pkt_hdr) +
                                     sizeof(struct PptpControlHeader),
                                     sizeof(new_pcid), (char *)&new_pcid,
                                     sizeof(new_pcid)) == 0)
index feb26b48f1d5040fce65fc36c48e95df42976fab..cfaeea38314f380735fe938662f730197c3afc24 100644 (file)
@@ -88,8 +88,8 @@ static unsigned int help(struct sk_buff **pskb,
        DEBUGP("ip_nat_irc: Inserting '%s' == %u.%u.%u.%u, port %u\n",
               buffer, NIPQUAD(exp->tuple.src.ip), port);
 
-       ret = ip_nat_mangle_tcp_packet(pskb, exp->master, ctinfo, 
-                                      matchoff, matchlen, buffer, 
+       ret = ip_nat_mangle_tcp_packet(pskb, exp->master, ctinfo,
+                                      matchoff, matchlen, buffer,
                                       strlen(buffer));
        if (ret != NF_ACCEPT)
                ip_conntrack_unexpect_related(exp);
index fb716edd5bc6da555738c8eab0f6a5023d10a0bd..22a528ae0380bef73f1f6bfa10cf25c5e6b8c6a7 100644 (file)
@@ -45,7 +45,7 @@ icmp_unique_tuple(struct ip_conntrack_tuple *tuple,
 
        for (i = 0; i < range_size; i++, id++) {
                tuple->src.u.icmp.id = htons(ntohs(range->min.icmp.id) +
-                                            (id % range_size));
+                                            (id % range_size));
                if (!ip_nat_used_tuple(tuple, conntrack))
                        return 1;
        }
index e1c8a05f3dc679f4b8b1c75eb97702877a534549..080eb1d922007490cb1ccd237a313cd369c72bf8 100644 (file)
@@ -112,7 +112,7 @@ static unsigned int ipt_snat_target(struct sk_buff **pskb,
 
        /* Connection must be valid and new. */
        IP_NF_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_RELATED
-                           || ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY));
+                           || ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY));
        IP_NF_ASSERT(out);
 
        return ip_nat_setup_info(ct, &mr->range[0], hooknum);
@@ -223,8 +223,8 @@ alloc_null_binding(struct ip_conntrack *conntrack,
 
 unsigned int
 alloc_null_binding_confirmed(struct ip_conntrack *conntrack,
-                             struct ip_nat_info *info,
-                             unsigned int hooknum)
+                            struct ip_nat_info *info,
+                            unsigned int hooknum)
 {
        __be32 ip
                = (HOOK2MANIP(hooknum) == IP_NAT_MANIP_SRC
index 6223abc924ff33f5ad884de6128d3d60b2a797be..325c5a9dc2efe22da7cb275af0cbb92b9c51e1dd 100644 (file)
@@ -88,7 +88,7 @@ static int map_sip_addr(struct sk_buff **pskb, enum ip_conntrack_info ctinfo,
                return 1;
 
        if (!ip_nat_mangle_udp_packet(pskb, ct, ctinfo,
-                                     matchoff, matchlen, addr, addrlen))
+                                     matchoff, matchlen, addr, addrlen))
                return 0;
        *dptr = (*pskb)->data + (*pskb)->nh.iph->ihl*4 + sizeof(struct udphdr);
        return 1;
@@ -149,7 +149,7 @@ static unsigned int mangle_sip_packet(struct sk_buff **pskb,
                return 0;
 
        if (!ip_nat_mangle_udp_packet(pskb, ct, ctinfo,
-                                     matchoff, matchlen, buffer, bufflen))
+                                     matchoff, matchlen, buffer, bufflen))
                return 0;
 
        /* We need to reload this. Thanks Patrick. */
@@ -170,7 +170,7 @@ static int mangle_content_len(struct sk_buff **pskb,
 
        /* Get actual SDP lenght */
        if (ct_sip_get_info(dptr, (*pskb)->len - dataoff, &matchoff,
-                           &matchlen, POS_SDP_HEADER) > 0) {
+                           &matchlen, POS_SDP_HEADER) > 0) {
 
                /* since ct_sip_get_info() give us a pointer passing 'v='
                   we need to add 2 bytes in this count. */
@@ -178,7 +178,7 @@ static int mangle_content_len(struct sk_buff **pskb,
 
                /* Now, update SDP lenght */
                if (ct_sip_get_info(dptr, (*pskb)->len - dataoff, &matchoff,
-                                   &matchlen, POS_CONTENT) > 0) {
+                                   &matchlen, POS_CONTENT) > 0) {
 
                        bufflen = sprintf(buffer, "%u", c_len);
 
@@ -204,17 +204,17 @@ static unsigned int mangle_sdp(struct sk_buff **pskb,
        /* Mangle owner and contact info. */
        bufflen = sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(newip));
        if (!mangle_sip_packet(pskb, ctinfo, ct, &dptr, (*pskb)->len - dataoff,
-                              buffer, bufflen, POS_OWNER))
+                              buffer, bufflen, POS_OWNER))
                return 0;
 
        if (!mangle_sip_packet(pskb, ctinfo, ct, &dptr, (*pskb)->len - dataoff,
-                              buffer, bufflen, POS_CONNECTION))
+                              buffer, bufflen, POS_CONNECTION))
                return 0;
 
        /* Mangle media port. */
        bufflen = sprintf(buffer, "%u", port);
        if (!mangle_sip_packet(pskb, ctinfo, ct, &dptr, (*pskb)->len - dataoff,
-                              buffer, bufflen, POS_MEDIA))
+                              buffer, bufflen, POS_MEDIA))
                return 0;
 
        return mangle_content_len(pskb, ctinfo, ct, dptr);
index c3d9f3b090c44851a279eb8ee7aa5a5c9b22464a..e41d0efae5159ff405326d5c40178b6f066a7932 100644 (file)
@@ -3,11 +3,11 @@
  *
  * Basic SNMP Application Layer Gateway
  *
- * This IP NAT module is intended for use with SNMP network 
- * discovery and monitoring applications where target networks use 
+ * This IP NAT module is intended for use with SNMP network
+ * discovery and monitoring applications where target networks use
  * conflicting private address realms.
  *
- * Static NAT is used to remap the networks from the view of the network 
+ * Static NAT is used to remap the networks from the view of the network
  * management system at the IP layer, and this module remaps some application
  * layer addresses to match.
  *
@@ -20,7 +20,7 @@
  * More information on ALG and associated issues can be found in
  * RFC 2962
  *
- * The ASB.1/BER parsing code is derived from the gxsnmp package by Gregory 
+ * The ASB.1/BER parsing code is derived from the gxsnmp package by Gregory
  * McLean & Jochen Friedrich, stripped down for use in the kernel.
  *
  * Copyright (c) 2000 RP Internet (www.rpi.net.au).
@@ -69,8 +69,8 @@ MODULE_DESCRIPTION("Basic SNMP Application Layer Gateway");
 static int debug;
 static DEFINE_SPINLOCK(snmp_lock);
 
-/* 
- * Application layer address mapping mimics the NAT mapping, but 
+/*
+ * Application layer address mapping mimics the NAT mapping, but
  * only for the first octet in this case (a more flexible system
  * can be implemented if needed).
  */
@@ -80,7 +80,7 @@ struct oct1_map
        u_int8_t to;
 };
 
-                                  
+
 /*****************************************************************************
  *
  * Basic ASN.1 decoding routines (gxsnmp author Dirk Wisse)
@@ -129,7 +129,7 @@ struct oct1_map
 #define ASN1_ERR_DEC_LENGTH_MISMATCH   4
 #define ASN1_ERR_DEC_BADVALUE          5
 
-/* 
+/*
  * ASN.1 context.
  */
 struct asn1_ctx
@@ -148,10 +148,10 @@ struct asn1_octstr
        unsigned char *data;
        unsigned int len;
 };
-       
+
 static void asn1_open(struct asn1_ctx *ctx,
-                      unsigned char *buf,
-                      unsigned int len)
+                     unsigned char *buf,
+                     unsigned int len)
 {
        ctx->begin = buf;
        ctx->end = buf + len;
@@ -172,9 +172,9 @@ static unsigned char asn1_octet_decode(struct asn1_ctx *ctx, unsigned char *ch)
 static unsigned char asn1_tag_decode(struct asn1_ctx *ctx, unsigned int *tag)
 {
        unsigned char ch;
-       
+
        *tag = 0;
-       
+
        do
        {
                if (!asn1_octet_decode(ctx, &ch))
@@ -185,20 +185,20 @@ static unsigned char asn1_tag_decode(struct asn1_ctx *ctx, unsigned int *tag)
        return 1;
 }
 
-static unsigned char asn1_id_decode(struct asn1_ctx *ctx, 
-                                    unsigned int *cls,
-                                    unsigned int *con,
-                                    unsigned int *tag)
+static unsigned char asn1_id_decode(struct asn1_ctx *ctx,
+                                   unsigned int *cls,
+                                   unsigned int *con,
+                                   unsigned int *tag)
 {
        unsigned char ch;
-       
+
        if (!asn1_octet_decode(ctx, &ch))
                return 0;
-               
+
        *cls = (ch & 0xC0) >> 6;
        *con = (ch & 0x20) >> 5;
        *tag = (ch & 0x1F);
-       
+
        if (*tag == 0x1F) {
                if (!asn1_tag_decode(ctx, tag))
                        return 0;
@@ -207,25 +207,25 @@ static unsigned char asn1_id_decode(struct asn1_ctx *ctx,
 }
 
 static unsigned char asn1_length_decode(struct asn1_ctx *ctx,
-                                        unsigned int *def,
-                                        unsigned int *len)
+                                       unsigned int *def,
+                                       unsigned int *len)
 {
        unsigned char ch, cnt;
-       
+
        if (!asn1_octet_decode(ctx, &ch))
                return 0;
-               
+
        if (ch == 0x80)
                *def = 0;
        else {
                *def = 1;
-               
+
                if (ch < 0x80)
                        *len = ch;
                else {
                        cnt = (unsigned char) (ch & 0x7F);
                        *len = 0;
-                       
+
                        while (cnt > 0) {
                                if (!asn1_octet_decode(ctx, &ch))
                                        return 0;
@@ -239,20 +239,20 @@ static unsigned char asn1_length_decode(struct asn1_ctx *ctx,
 }
 
 static unsigned char asn1_header_decode(struct asn1_ctx *ctx,
-                                        unsigned char **eoc,
-                                        unsigned int *cls,
-                                        unsigned int *con,
-                                        unsigned int *tag)
+                                       unsigned char **eoc,
+                                       unsigned int *cls,
+                                       unsigned int *con,
+                                       unsigned int *tag)
 {
        unsigned int def, len;
-       
+
        if (!asn1_id_decode(ctx, cls, con, tag))
                return 0;
-               
+
        def = len = 0;
        if (!asn1_length_decode(ctx, &def, &len))
                return 0;
-               
+
        if (def)
                *eoc = ctx->pointer + len;
        else
@@ -263,19 +263,19 @@ static unsigned char asn1_header_decode(struct asn1_ctx *ctx,
 static unsigned char asn1_eoc_decode(struct asn1_ctx *ctx, unsigned char *eoc)
 {
        unsigned char ch;
-       
+
        if (eoc == 0) {
                if (!asn1_octet_decode(ctx, &ch))
                        return 0;
-                       
+
                if (ch != 0x00) {
                        ctx->error = ASN1_ERR_DEC_EOC_MISMATCH;
                        return 0;
                }
-               
+
                if (!asn1_octet_decode(ctx, &ch))
                        return 0;
-                       
+
                if (ch != 0x00) {
                        ctx->error = ASN1_ERR_DEC_EOC_MISMATCH;
                        return 0;
@@ -297,27 +297,27 @@ static unsigned char asn1_null_decode(struct asn1_ctx *ctx, unsigned char *eoc)
 }
 
 static unsigned char asn1_long_decode(struct asn1_ctx *ctx,
-                                      unsigned char *eoc,
-                                      long *integer)
+                                     unsigned char *eoc,
+                                     long *integer)
 {
        unsigned char ch;
        unsigned int  len;
-       
+
        if (!asn1_octet_decode(ctx, &ch))
                return 0;
-               
+
        *integer = (signed char) ch;
        len = 1;
-       
+
        while (ctx->pointer < eoc) {
                if (++len > sizeof (long)) {
                        ctx->error = ASN1_ERR_DEC_BADVALUE;
                        return 0;
                }
-               
+
                if (!asn1_octet_decode(ctx, &ch))
                        return 0;
-                       
+
                *integer <<= 8;
                *integer |= ch;
        }
@@ -325,28 +325,28 @@ static unsigned char asn1_long_decode(struct asn1_ctx *ctx,
 }
 
 static unsigned char asn1_uint_decode(struct asn1_ctx *ctx,
-                                      unsigned char *eoc,
-                                      unsigned int *integer)
+                                     unsigned char *eoc,
+                                     unsigned int *integer)
 {
        unsigned char ch;
        unsigned int  len;
-       
+
        if (!asn1_octet_decode(ctx, &ch))
                return 0;
-               
+
        *integer = ch;
        if (ch == 0) len = 0;
        else len = 1;
-       
+
        while (ctx->pointer < eoc) {
                if (++len > sizeof (unsigned int)) {
                        ctx->error = ASN1_ERR_DEC_BADVALUE;
                        return 0;
                }
-               
+
                if (!asn1_octet_decode(ctx, &ch))
                        return 0;
-                       
+
                *integer <<= 8;
                *integer |= ch;
        }
@@ -354,28 +354,28 @@ static unsigned char asn1_uint_decode(struct asn1_ctx *ctx,
 }
 
 static unsigned char asn1_ulong_decode(struct asn1_ctx *ctx,
-                                       unsigned char *eoc,
-                                       unsigned long *integer)
+                                      unsigned char *eoc,
+                                      unsigned long *integer)
 {
        unsigned char ch;
        unsigned int  len;
-       
+
        if (!asn1_octet_decode(ctx, &ch))
                return 0;
-               
+
        *integer = ch;
        if (ch == 0) len = 0;
        else len = 1;
-       
+
        while (ctx->pointer < eoc) {
                if (++len > sizeof (unsigned long)) {
                        ctx->error = ASN1_ERR_DEC_BADVALUE;
                        return 0;
                }
-               
+
                if (!asn1_octet_decode(ctx, &ch))
                        return 0;
-                       
+
                *integer <<= 8;
                *integer |= ch;
        }
@@ -383,21 +383,21 @@ static unsigned char asn1_ulong_decode(struct asn1_ctx *ctx,
 }
 
 static unsigned char asn1_octets_decode(struct asn1_ctx *ctx,
-                                        unsigned char *eoc,
-                                        unsigned char **octets,
-                                        unsigned int *len)
+                                       unsigned char *eoc,
+                                       unsigned char **octets,
+                                       unsigned int *len)
 {
        unsigned char *ptr;
-       
+
        *len = 0;
-       
+
        *octets = kmalloc(eoc - ctx->pointer, GFP_ATOMIC);
        if (*octets == NULL) {
                if (net_ratelimit())
                        printk("OOM in bsalg (%d)\n", __LINE__);
                return 0;
        }
-       
+
        ptr = *octets;
        while (ctx->pointer < eoc) {
                if (!asn1_octet_decode(ctx, (unsigned char *)ptr++)) {
@@ -411,16 +411,16 @@ static unsigned char asn1_octets_decode(struct asn1_ctx *ctx,
 }
 
 static unsigned char asn1_subid_decode(struct asn1_ctx *ctx,
-                                       unsigned long *subid)
+                                      unsigned long *subid)
 {
        unsigned char ch;
-       
+
        *subid = 0;
-       
+
        do {
                if (!asn1_octet_decode(ctx, &ch))
                        return 0;
-               
+
                *subid <<= 7;
                *subid |= ch & 0x7F;
        } while ((ch & 0x80) == 0x80);
@@ -428,14 +428,14 @@ static unsigned char asn1_subid_decode(struct asn1_ctx *ctx,
 }
 
 static unsigned char asn1_oid_decode(struct asn1_ctx *ctx,
-                                     unsigned char *eoc,
-                                     unsigned long **oid,
-                                     unsigned int *len)
+                                    unsigned char *eoc,
+                                    unsigned long **oid,
+                                    unsigned int *len)
 {
        unsigned long subid;
        unsigned int  size;
        unsigned long *optr;
-       
+
        size = eoc - ctx->pointer + 1;
        *oid = kmalloc(size * sizeof(unsigned long), GFP_ATOMIC);
        if (*oid == NULL) {
@@ -443,15 +443,15 @@ static unsigned char asn1_oid_decode(struct asn1_ctx *ctx,
                        printk("OOM in bsalg (%d)\n", __LINE__);
                return 0;
        }
-       
+
        optr = *oid;
-       
+
        if (!asn1_subid_decode(ctx, &subid)) {
                kfree(*oid);
                *oid = NULL;
                return 0;
        }
-       
+
        if (subid < 40) {
                optr [0] = 0;
                optr [1] = subid;
@@ -462,10 +462,10 @@ static unsigned char asn1_oid_decode(struct asn1_ctx *ctx,
                optr [0] = 2;
                optr [1] = subid - 80;
        }
-       
+
        *len = 2;
        optr += 2;
-       
+
        while (ctx->pointer < eoc) {
                if (++(*len) > size) {
                        ctx->error = ASN1_ERR_DEC_BADVALUE;
@@ -473,7 +473,7 @@ static unsigned char asn1_oid_decode(struct asn1_ctx *ctx,
                        *oid = NULL;
                        return 0;
                }
-               
+
                if (!asn1_subid_decode(ctx, optr++)) {
                        kfree(*oid);
                        *oid = NULL;
@@ -611,9 +611,9 @@ struct snmp_v1_trap
 #define SERR_EOM    2
 
 static inline void mangle_address(unsigned char *begin,
-                                  unsigned char *addr,
-                                  const struct oct1_map *map,
-                                  __sum16 *check);
+                                 unsigned char *addr,
+                                 const struct oct1_map *map,
+                                 __sum16 *check);
 struct snmp_cnv
 {
        unsigned int class;
@@ -633,7 +633,7 @@ static struct snmp_cnv snmp_conv [] =
        {ASN1_APL, SNMP_GGE, SNMP_GAUGE},       /* Gauge32 == Unsigned32  */
        {ASN1_APL, SNMP_TIT, SNMP_TIMETICKS},
        {ASN1_APL, SNMP_OPQ, SNMP_OPAQUE},
-       
+
        /* SNMPv2 data types and errors */
        {ASN1_UNI, ASN1_BTS, SNMP_BITSTR},
        {ASN1_APL, SNMP_C64, SNMP_COUNTER64},
@@ -644,13 +644,13 @@ static struct snmp_cnv snmp_conv [] =
 };
 
 static unsigned char snmp_tag_cls2syntax(unsigned int tag,
-                                         unsigned int cls,
-                                         unsigned short *syntax)
+                                        unsigned int cls,
+                                        unsigned short *syntax)
 {
        struct snmp_cnv *cnv;
-       
+
        cnv = snmp_conv;
-       
+
        while (cnv->syntax != -1) {
                if (cnv->tag == tag && cnv->class == cls) {
                        *syntax = cnv->syntax;
@@ -662,7 +662,7 @@ static unsigned char snmp_tag_cls2syntax(unsigned int tag,
 }
 
 static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
-                                        struct snmp_object **obj)
+                                       struct snmp_object **obj)
 {
        unsigned int cls, con, tag, len, idlen;
        unsigned short type;
@@ -670,41 +670,41 @@ static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
        unsigned long *lp, *id;
        unsigned long ul;
        long l;
-       
+
        *obj = NULL;
        id = NULL;
-       
+
        if (!asn1_header_decode(ctx, &eoc, &cls, &con, &tag))
                return 0;
-               
+
        if (cls != ASN1_UNI || con != ASN1_CON || tag != ASN1_SEQ)
                return 0;
-       
+
        if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
                return 0;
-       
+
        if (cls != ASN1_UNI || con != ASN1_PRI || tag != ASN1_OJI)
                return 0;
-       
+
        if (!asn1_oid_decode(ctx, end, &id, &idlen))
                return 0;
-               
+
        if (!asn1_header_decode(ctx, &end, &cls, &con, &tag)) {
                kfree(id);
                return 0;
        }
-       
+
        if (con != ASN1_PRI) {
                kfree(id);
                return 0;
        }
-       
+
        type = 0;
        if (!snmp_tag_cls2syntax(tag, cls, &type)) {
                kfree(id);
                return 0;
        }
-       
+
        l = 0;
        switch (type) {
                case SNMP_INTEGER:
@@ -714,7 +714,7 @@ static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
                                return 0;
                        }
                        *obj = kmalloc(sizeof(struct snmp_object) + len,
-                                      GFP_ATOMIC);
+                                      GFP_ATOMIC);
                        if (*obj == NULL) {
                                kfree(id);
                                if (net_ratelimit())
@@ -730,7 +730,7 @@ static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
                                return 0;
                        }
                        *obj = kmalloc(sizeof(struct snmp_object) + len,
-                                      GFP_ATOMIC);
+                                      GFP_ATOMIC);
                        if (*obj == NULL) {
                                kfree(id);
                                if (net_ratelimit())
@@ -818,12 +818,12 @@ static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
                        kfree(id);
                        return 0;
        }
-       
+
        (*obj)->syntax_len = len;
        (*obj)->type = type;
        (*obj)->id = id;
        (*obj)->id_len = idlen;
-       
+
        if (!asn1_eoc_decode(ctx, eoc)) {
                kfree(id);
                kfree(*obj);
@@ -834,49 +834,49 @@ static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
 }
 
 static unsigned char snmp_request_decode(struct asn1_ctx *ctx,
-                                         struct snmp_request *request)
+                                        struct snmp_request *request)
 {
        unsigned int cls, con, tag;
        unsigned char *end;
-       
+
        if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
                return 0;
-               
+
        if (cls != ASN1_UNI || con != ASN1_PRI || tag != ASN1_INT)
                return 0;
-               
+
        if (!asn1_ulong_decode(ctx, end, &request->id))
                return 0;
-               
+
        if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
                return 0;
-               
+
        if (cls != ASN1_UNI || con != ASN1_PRI || tag != ASN1_INT)
                return 0;
-               
+
        if (!asn1_uint_decode(ctx, end, &request->error_status))
                return 0;
-               
+
        if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
                return 0;
-               
+
        if (cls != ASN1_UNI || con != ASN1_PRI || tag != ASN1_INT)
                return 0;
-               
+
        if (!asn1_uint_decode(ctx, end, &request->error_index))
                return 0;
-       
+
        return 1;
 }
 
-/* 
+/*
  * Fast checksum update for possibly oddly-aligned UDP byte, from the
  * code example in the draft.
  */
 static void fast_csum(__sum16 *csum,
-                      const unsigned char *optr,
-                      const unsigned char *nptr,
-                      int offset)
+                     const unsigned char *optr,
+                     const unsigned char *nptr,
+                     int offset)
 {
        unsigned char s[4];
 
@@ -893,30 +893,30 @@ static void fast_csum(__sum16 *csum,
        *csum = csum_fold(csum_partial(s, 4, ~csum_unfold(*csum)));
 }
 
-/* 
+/*
  * Mangle IP address.
  *     - begin points to the start of the snmp messgae
  *      - addr points to the start of the address
  */
 static inline void mangle_address(unsigned char *begin,
-                                  unsigned char *addr,
-                                  const struct oct1_map *map,
-                                  __sum16 *check)
+                                 unsigned char *addr,
+                                 const struct oct1_map *map,
+                                 __sum16 *check)
 {
        if (map->from == NOCT1(addr)) {
                u_int32_t old;
-               
+
                if (debug)
                        memcpy(&old, (unsigned char *)addr, sizeof(old));
-                       
+
                *addr = map->to;
-               
+
                /* Update UDP checksum if being used */
                if (*check) {
                        fast_csum(check,
-                                 &map->from, &map->to, addr - begin);
+                                 &map->from, &map->to, addr - begin);
                }
-               
+
                if (debug)
                        printk(KERN_DEBUG "bsalg: mapped %u.%u.%u.%u to "
                               "%u.%u.%u.%u\n", NIPQUAD(old), NIPQUAD(*addr));
@@ -924,66 +924,66 @@ static inline void mangle_address(unsigned char *begin,
 }
 
 static unsigned char snmp_trap_decode(struct asn1_ctx *ctx,
-                                      struct snmp_v1_trap *trap,
-                                      const struct oct1_map *map,
-                                      __sum16 *check)
+                                     struct snmp_v1_trap *trap,
+                                     const struct oct1_map *map,
+                                     __sum16 *check)
 {
        unsigned int cls, con, tag, len;
        unsigned char *end;
 
        if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
                return 0;
-               
+
        if (cls != ASN1_UNI || con != ASN1_PRI || tag != ASN1_OJI)
                return 0;
-       
+
        if (!asn1_oid_decode(ctx, end, &trap->id, &trap->id_len))
                return 0;
-               
+
        if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
                goto err_id_free;
 
        if (!((cls == ASN1_APL && con == ASN1_PRI && tag == SNMP_IPA) ||
              (cls == ASN1_UNI && con == ASN1_PRI && tag == ASN1_OTS)))
                goto err_id_free;
-       
+
        if (!asn1_octets_decode(ctx, end, (unsigned char **)&trap->ip_address, &len))
                goto err_id_free;
-       
+
        /* IPv4 only */
        if (len != 4)
                goto err_addr_free;
-       
+
        mangle_address(ctx->begin, ctx->pointer - 4, map, check);
-       
+
        if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
                goto err_addr_free;
-               
+
        if (cls != ASN1_UNI || con != ASN1_PRI || tag != ASN1_INT)
                goto err_addr_free;
-               
+
        if (!asn1_uint_decode(ctx, end, &trap->general))
                goto err_addr_free;
-               
+
        if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
                goto err_addr_free;
-       
+
        if (cls != ASN1_UNI || con != ASN1_PRI || tag != ASN1_INT)
                goto err_addr_free;
-               
+
        if (!asn1_uint_decode(ctx, end, &trap->specific))
                goto err_addr_free;
-               
+
        if (!asn1_header_decode(ctx, &end, &cls, &con, &tag))
                goto err_addr_free;
-               
+
        if (!((cls == ASN1_APL && con == ASN1_PRI && tag == SNMP_TIT) ||
              (cls == ASN1_UNI && con == ASN1_PRI && tag == ASN1_INT)))
                goto err_addr_free;
-               
+
        if (!asn1_ulong_decode(ctx, end, &trap->time))
                goto err_addr_free;
-               
+
        return 1;
 
 err_addr_free:
@@ -1004,7 +1004,7 @@ err_id_free:
 static void hex_dump(unsigned char *buf, size_t len)
 {
        size_t i;
-       
+
        for (i = 0; i < len; i++) {
                if (i && !(i % 16))
                        printk("\n");
@@ -1018,30 +1018,30 @@ static void hex_dump(unsigned char *buf, size_t len)
  * (And this is the fucking 'basic' method).
  */
 static int snmp_parse_mangle(unsigned char *msg,
-                             u_int16_t len,
-                             const struct oct1_map *map,
-                             __sum16 *check)
+                            u_int16_t len,
+                            const struct oct1_map *map,
+                            __sum16 *check)
 {
        unsigned char *eoc, *end;
        unsigned int cls, con, tag, vers, pdutype;
        struct asn1_ctx ctx;
        struct asn1_octstr comm;
        struct snmp_object **obj;
-       
+
        if (debug > 1)
                hex_dump(msg, len);
 
        asn1_open(&ctx, msg, len);
-       
-       /* 
+
+       /*
         * Start of SNMP message.
         */
        if (!asn1_header_decode(&ctx, &eoc, &cls, &con, &tag))
                return 0;
        if (cls != ASN1_UNI || con != ASN1_CON || tag != ASN1_SEQ)
                return 0;
-       
-       /* 
+
+       /*
         * Version 1 or 2 handled.
         */
        if (!asn1_header_decode(&ctx, &end, &cls, &con, &tag))
@@ -1054,7 +1054,7 @@ static int snmp_parse_mangle(unsigned char *msg,
                printk(KERN_DEBUG "bsalg: snmp version: %u\n", vers + 1);
        if (vers > 1)
                return 1;
-       
+
        /*
         * Community.
         */
@@ -1066,14 +1066,14 @@ static int snmp_parse_mangle(unsigned char *msg,
                return 0;
        if (debug > 1) {
                unsigned int i;
-               
+
                printk(KERN_DEBUG "bsalg: community: ");
                for (i = 0; i < comm.len; i++)
                        printk("%c", comm.data[i]);
                printk("\n");
        }
        kfree(comm.data);
-       
+
        /*
         * PDU type
         */
@@ -1092,7 +1092,7 @@ static int snmp_parse_mangle(unsigned char *msg,
                        [SNMP_PDU_INFORM] = "inform",
                        [SNMP_PDU_TRAP2] = "trapv2"
                };
-               
+
                if (pdutype > SNMP_PDU_TRAP2)
                        printk(KERN_DEBUG "bsalg: bad pdu type %u\n", pdutype);
                else
@@ -1101,56 +1101,56 @@ static int snmp_parse_mangle(unsigned char *msg,
        if (pdutype != SNMP_PDU_RESPONSE &&
            pdutype != SNMP_PDU_TRAP1 && pdutype != SNMP_PDU_TRAP2)
                return 1;
-       
+
        /*
         * Request header or v1 trap
         */
        if (pdutype == SNMP_PDU_TRAP1) {
                struct snmp_v1_trap trap;
                unsigned char ret = snmp_trap_decode(&ctx, &trap, map, check);
-               
+
                if (ret) {
                        kfree(trap.id);
                        kfree((unsigned long *)trap.ip_address);
-               } else 
+               } else
                        return ret;
-               
+
        } else {
                struct snmp_request req;
-               
+
                if (!snmp_request_decode(&ctx, &req))
                        return 0;
-                       
+
                if (debug > 1)
                        printk(KERN_DEBUG "bsalg: request: id=0x%lx error_status=%u "
                        "error_index=%u\n", req.id, req.error_status,
                        req.error_index);
        }
-       
+
        /*
         * Loop through objects, look for IP addresses to mangle.
         */
        if (!asn1_header_decode(&ctx, &eoc, &cls, &con, &tag))
                return 0;
-               
+
        if (cls != ASN1_UNI || con != ASN1_CON || tag != ASN1_SEQ)
                return 0;
-       
+
        obj = kmalloc(sizeof(struct snmp_object), GFP_ATOMIC);
        if (obj == NULL) {
                if (net_ratelimit())
                        printk(KERN_WARNING "OOM in bsalg(%d)\n", __LINE__);
-               return 0;       
+               return 0;
        }
 
        while (!asn1_eoc_decode(&ctx, eoc)) {
                unsigned int i;
-               
+
                if (!snmp_object_decode(&ctx, obj)) {
                        if (*obj) {
                                kfree((*obj)->id);
                                kfree(*obj);
-                       }       
+                       }
                        kfree(obj);
                        return 0;
                }
@@ -1163,20 +1163,20 @@ static int snmp_parse_mangle(unsigned char *msg,
                                printk("%lu", (*obj)->id[i]);
                        }
                        printk(": type=%u\n", (*obj)->type);
-                       
+
                }
 
                if ((*obj)->type == SNMP_IPADDR)
                        mangle_address(ctx.begin, ctx.pointer - 4 , map, check);
-               
+
                kfree((*obj)->id);
                kfree(*obj);
        }
        kfree(obj);
-       
+
        if (!asn1_eoc_decode(&ctx, eoc))
                return 0;
-               
+
        return 1;
 }
 
@@ -1186,12 +1186,12 @@ static int snmp_parse_mangle(unsigned char *msg,
  *
  *****************************************************************************/
 
-/* 
+/*
  * SNMP translation routine.
  */
 static int snmp_translate(struct ip_conntrack *ct,
-                          enum ip_conntrack_info ctinfo,
-                          struct sk_buff **pskb)
+                         enum ip_conntrack_info ctinfo,
+                         struct sk_buff **pskb)
 {
        struct iphdr *iph = (*pskb)->nh.iph;
        struct udphdr *udph = (struct udphdr *)((__be32 *)iph + iph->ihl);
@@ -1213,12 +1213,12 @@ static int snmp_translate(struct ip_conntrack *ct,
                map.from = NOCT1(&ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.ip);
                map.to = NOCT1(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.ip);
        }
-       
+
        if (map.from == map.to)
                return NF_ACCEPT;
-       
+
        if (!snmp_parse_mangle((unsigned char *)udph + sizeof(struct udphdr),
-                              paylen, &map, &udph->check)) {
+                              paylen, &map, &udph->check)) {
                if (net_ratelimit())
                        printk(KERN_WARNING "bsalg: parser failed\n");
                return NF_DROP;
@@ -1247,7 +1247,7 @@ static int help(struct sk_buff **pskb,
        if (!(ct->status & IPS_NAT_MASK))
                return NF_ACCEPT;
 
-       /* 
+       /*
         * Make sure the packet length is ok.  So far, we were only guaranteed
         * to have a valid length IP header plus 8 bytes, which means we have
         * enough room for a UDP header.  Just verify the UDP length field so we
@@ -1305,7 +1305,7 @@ static struct ip_conntrack_helper snmp_trap_helper = {
  * Module stuff.
  *
  *****************************************************************************/
+
 static int __init ip_nat_snmp_basic_init(void)
 {
        int ret = 0;
index ad66328baa5dfee8f236b9f67c6e52c2840986ae..adf25f9f70e1316fe422e76015c1e23317c26fd2 100644 (file)
@@ -81,7 +81,7 @@ static void nat_decode_session(struct sk_buff *skb, struct flowi *fl)
        }
 }
 #endif
-               
+
 static unsigned int
 ip_nat_fn(unsigned int hooknum,
          struct sk_buff **pskb,
@@ -107,8 +107,8 @@ ip_nat_fn(unsigned int hooknum,
           protocol. 8) --RR */
        if (!ct) {
                /* Exception: ICMP redirect to new connection (not in
-                   hash table yet).  We must not let this through, in
-                   case we're doing NAT to the same network. */
+                  hash table yet).  We must not let this through, in
+                  case we're doing NAT to the same network. */
                if ((*pskb)->nh.iph->protocol == IPPROTO_ICMP) {
                        struct icmphdr _hdr, *hp;
 
@@ -148,7 +148,7 @@ ip_nat_fn(unsigned int hooknum,
                        if (unlikely(is_confirmed(ct)))
                                /* NAT module was loaded late */
                                ret = alloc_null_binding_confirmed(ct, info,
-                                                                  hooknum);
+                                                                  hooknum);
                        else if (hooknum == NF_IP_LOCAL_IN)
                                /* LOCAL_IN hook doesn't have a chain!  */
                                ret = alloc_null_binding(ct, info, hooknum);
@@ -179,10 +179,10 @@ ip_nat_fn(unsigned int hooknum,
 
 static unsigned int
 ip_nat_in(unsigned int hooknum,
-          struct sk_buff **pskb,
-          const struct net_device *in,
-          const struct net_device *out,
-          int (*okfn)(struct sk_buff *))
+         struct sk_buff **pskb,
+         const struct net_device *in,
+         const struct net_device *out,
+         int (*okfn)(struct sk_buff *))
 {
        unsigned int ret;
        __be32 daddr = (*pskb)->nh.iph->daddr;
@@ -277,9 +277,9 @@ ip_nat_adjust(unsigned int hooknum,
 
        ct = ip_conntrack_get(*pskb, &ctinfo);
        if (ct && test_bit(IPS_SEQ_ADJUST_BIT, &ct->status)) {
-               DEBUGP("ip_nat_standalone: adjusting sequence number\n");
-               if (!ip_nat_seq_adjust(pskb, ct, ctinfo))
-                       return NF_DROP;
+               DEBUGP("ip_nat_standalone: adjusting sequence number\n");
+               if (!ip_nat_seq_adjust(pskb, ct, ctinfo))
+                       return NF_DROP;
        }
        return NF_ACCEPT;
 }
index cd520df4dcf4c36552da82a3d6a37bef5131d0f3..a14798a850d7334311dad6d5170b8adcd688c356 100644 (file)
  *
  * 2000-03-27: Simplified code (thanks to Andi Kleen for clues).
  * 2000-05-20: Fixed notifier problems (following Miguel Freitas' report).
- * 2000-06-19: Fixed so nfmark is copied to metadata (reported by Sebastian 
+ * 2000-06-19: Fixed so nfmark is copied to metadata (reported by Sebastian
  *             Zander).
  * 2000-08-01: Added Nick Williams' MAC support.
  * 2002-06-25: Code cleanup.
  * 2005-01-10: Added /proc counter for dropped packets; fixed so
- *             packets aren't delivered to user space if they're going 
- *             to be dropped. 
+ *             packets aren't delivered to user space if they're going
+ *             to be dropped.
  * 2005-05-26: local_bh_{disable,enable} around nf_reinject (Harald Welte)
  *
  */
@@ -97,7 +97,7 @@ __ipq_find_entry(ipq_cmpfn cmpfn, unsigned long data)
 
        list_for_each_prev(p, &queue_list) {
                struct ipq_queue_entry *entry = (struct ipq_queue_entry *)p;
-               
+
                if (!cmpfn || cmpfn(entry, data))
                        return entry;
        }
@@ -129,7 +129,7 @@ static inline void
 __ipq_flush(int verdict)
 {
        struct ipq_queue_entry *entry;
-       
+
        while ((entry = __ipq_find_dequeue_entry(NULL, 0)))
                ipq_issue_verdict(entry, verdict);
 }
@@ -138,21 +138,21 @@ static inline int
 __ipq_set_mode(unsigned char mode, unsigned int range)
 {
        int status = 0;
-       
+
        switch(mode) {
        case IPQ_COPY_NONE:
        case IPQ_COPY_META:
                copy_mode = mode;
                copy_range = 0;
                break;
-               
+
        case IPQ_COPY_PACKET:
                copy_mode = mode;
                copy_range = range;
                if (copy_range > 0xFFFF)
                        copy_range = 0xFFFF;
                break;
-               
+
        default:
                status = -EINVAL;
 
@@ -173,7 +173,7 @@ static struct ipq_queue_entry *
 ipq_find_dequeue_entry(ipq_cmpfn cmpfn, unsigned long data)
 {
        struct ipq_queue_entry *entry;
-       
+
        write_lock_bh(&queue_lock);
        entry = __ipq_find_dequeue_entry(cmpfn, data);
        write_unlock_bh(&queue_lock);
@@ -199,14 +199,14 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
        struct nlmsghdr *nlh;
 
        read_lock_bh(&queue_lock);
-       
+
        switch (copy_mode) {
        case IPQ_COPY_META:
        case IPQ_COPY_NONE:
                size = NLMSG_SPACE(sizeof(*pmsg));
                data_len = 0;
                break;
-       
+
        case IPQ_COPY_PACKET:
                if ((entry->skb->ip_summed == CHECKSUM_PARTIAL ||
                     entry->skb->ip_summed == CHECKSUM_COMPLETE) &&
@@ -218,10 +218,10 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
                        data_len = entry->skb->len;
                else
                        data_len = copy_range;
-               
+
                size = NLMSG_SPACE(sizeof(*pmsg) + data_len);
                break;
-       
+
        default:
                *errp = -EINVAL;
                read_unlock_bh(&queue_lock);
@@ -233,7 +233,7 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
        skb = alloc_skb(size, GFP_ATOMIC);
        if (!skb)
                goto nlmsg_failure;
-               
+
        old_tail= skb->tail;
        nlh = NLMSG_PUT(skb, 0, 0, IPQM_PACKET, size - sizeof(*nlh));
        pmsg = NLMSG_DATA(nlh);
@@ -246,29 +246,29 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
        pmsg->mark            = entry->skb->mark;
        pmsg->hook            = entry->info->hook;
        pmsg->hw_protocol     = entry->skb->protocol;
-       
+
        if (entry->info->indev)
                strcpy(pmsg->indev_name, entry->info->indev->name);
        else
                pmsg->indev_name[0] = '\0';
-       
+
        if (entry->info->outdev)
                strcpy(pmsg->outdev_name, entry->info->outdev->name);
        else
                pmsg->outdev_name[0] = '\0';
-       
+
        if (entry->info->indev && entry->skb->dev) {
                pmsg->hw_type = entry->skb->dev->type;
                if (entry->skb->dev->hard_header_parse)
                        pmsg->hw_addrlen =
                                entry->skb->dev->hard_header_parse(entry->skb,
-                                                                  pmsg->hw_addr);
+                                                                  pmsg->hw_addr);
        }
-       
+
        if (data_len)
                if (skb_copy_bits(entry->skb, 0, pmsg->payload, data_len))
                        BUG();
-               
+
        nlh->nlmsg_len = skb->tail - old_tail;
        return skb;
 
@@ -303,26 +303,26 @@ ipq_enqueue_packet(struct sk_buff *skb, struct nf_info *info,
        nskb = ipq_build_packet_message(entry, &status);
        if (nskb == NULL)
                goto err_out_free;
-               
+
        write_lock_bh(&queue_lock);
-       
+
        if (!peer_pid)
-               goto err_out_free_nskb; 
+               goto err_out_free_nskb;
 
        if (queue_total >= queue_maxlen) {
-                queue_dropped++;
+               queue_dropped++;
                status = -ENOSPC;
                if (net_ratelimit())
-                         printk (KERN_WARNING "ip_queue: full at %d entries, "
+                         printk (KERN_WARNING "ip_queue: full at %d entries, "
                                  "dropping packets(s). Dropped: %d\n", queue_total,
                                  queue_dropped);
                goto err_out_free_nskb;
        }
 
-       /* netlink_unicast will either free the nskb or attach it to a socket */ 
+       /* netlink_unicast will either free the nskb or attach it to a socket */
        status = netlink_unicast(ipqnl, nskb, peer_pid, MSG_DONTWAIT);
        if (status < 0) {
-               queue_user_dropped++;
+               queue_user_dropped++;
                goto err_out_unlock;
        }
 
@@ -332,8 +332,8 @@ ipq_enqueue_packet(struct sk_buff *skb, struct nf_info *info,
        return status;
 
 err_out_free_nskb:
-       kfree_skb(nskb); 
-       
+       kfree_skb(nskb);
+
 err_out_unlock:
        write_unlock_bh(&queue_lock);
 
@@ -359,11 +359,11 @@ ipq_mangle_ipv4(ipq_verdict_msg_t *v, struct ipq_queue_entry *e)
                        return -EINVAL;
                if (diff > skb_tailroom(e->skb)) {
                        struct sk_buff *newskb;
-                       
+
                        newskb = skb_copy_expand(e->skb,
-                                                skb_headroom(e->skb),
-                                                diff,
-                                                GFP_ATOMIC);
+                                                skb_headroom(e->skb),
+                                                diff,
+                                                GFP_ATOMIC);
                        if (newskb == NULL) {
                                printk(KERN_WARNING "ip_queue: OOM "
                                      "in mangle, dropping packet\n");
@@ -403,11 +403,11 @@ ipq_set_verdict(struct ipq_verdict_msg *vmsg, unsigned int len)
                return -ENOENT;
        else {
                int verdict = vmsg->value;
-               
+
                if (vmsg->data_len && vmsg->data_len == len)
                        if (ipq_mangle_ipv4(vmsg, entry) < 0)
                                verdict = NF_DROP;
-               
+
                ipq_issue_verdict(entry, verdict);
                return 0;
        }
@@ -426,7 +426,7 @@ ipq_set_mode(unsigned char mode, unsigned int range)
 
 static int
 ipq_receive_peer(struct ipq_peer_msg *pmsg,
-                 unsigned char type, unsigned int len)
+                unsigned char type, unsigned int len)
 {
        int status = 0;
 
@@ -436,15 +436,15 @@ ipq_receive_peer(struct ipq_peer_msg *pmsg,
        switch (type) {
        case IPQM_MODE:
                status = ipq_set_mode(pmsg->msg.mode.value,
-                                     pmsg->msg.mode.range);
+                                     pmsg->msg.mode.range);
                break;
-               
+
        case IPQM_VERDICT:
                if (pmsg->msg.verdict.value > NF_MAX_VERDICT)
                        status = -EINVAL;
                else
                        status = ipq_set_verdict(&pmsg->msg.verdict,
-                                                len - sizeof(*pmsg));
+                                                len - sizeof(*pmsg));
                        break;
        default:
                status = -EINVAL;
@@ -468,7 +468,7 @@ dev_cmp(struct ipq_queue_entry *entry, unsigned long ifindex)
                        return 1;
                if (entry->skb->nf_bridge->physoutdev &&
                    entry->skb->nf_bridge->physoutdev->ifindex == ifindex)
-                       return 1;
+                       return 1;
        }
 #endif
        return 0;
@@ -478,7 +478,7 @@ static void
 ipq_dev_drop(int ifindex)
 {
        struct ipq_queue_entry *entry;
-       
+
        while ((entry = ipq_find_dequeue_entry(dev_cmp, ifindex)) != NULL)
                ipq_issue_verdict(entry, NF_DROP);
 }
@@ -502,25 +502,25 @@ ipq_rcv_skb(struct sk_buff *skb)
 
        pid = nlh->nlmsg_pid;
        flags = nlh->nlmsg_flags;
-       
+
        if(pid <= 0 || !(flags & NLM_F_REQUEST) || flags & NLM_F_MULTI)
                RCV_SKB_FAIL(-EINVAL);
-               
+
        if (flags & MSG_TRUNC)
                RCV_SKB_FAIL(-ECOMM);
-               
+
        type = nlh->nlmsg_type;
        if (type < NLMSG_NOOP || type >= IPQM_MAX)
                RCV_SKB_FAIL(-EINVAL);
-               
+
        if (type <= IPQM_BASE)
                return;
-               
+
        if (security_netlink_recv(skb, CAP_NET_ADMIN))
                RCV_SKB_FAIL(-EPERM);
-       
+
        write_lock_bh(&queue_lock);
-       
+
        if (peer_pid) {
                if (peer_pid != pid) {
                        write_unlock_bh(&queue_lock);
@@ -530,17 +530,17 @@ ipq_rcv_skb(struct sk_buff *skb)
                net_enable_timestamp();
                peer_pid = pid;
        }
-               
+
        write_unlock_bh(&queue_lock);
-       
+
        status = ipq_receive_peer(NLMSG_DATA(nlh), type,
-                                 nlmsglen - NLMSG_LENGTH(0));
+                                 nlmsglen - NLMSG_LENGTH(0));
        if (status < 0)
                RCV_SKB_FAIL(status);
-               
+
        if (flags & NLM_F_ACK)
                netlink_ack(skb, nlh, 0);
-        return;
+       return;
 }
 
 static void
@@ -550,19 +550,19 @@ ipq_rcv_sk(struct sock *sk, int len)
        unsigned int qlen;
 
        mutex_lock(&ipqnl_mutex);
-                       
+
        for (qlen = skb_queue_len(&sk->sk_receive_queue); qlen; qlen--) {
                skb = skb_dequeue(&sk->sk_receive_queue);
                ipq_rcv_skb(skb);
                kfree_skb(skb);
        }
-               
+
        mutex_unlock(&ipqnl_mutex);
 }
 
 static int
 ipq_rcv_dev_event(struct notifier_block *this,
-                  unsigned long event, void *ptr)
+                 unsigned long event, void *ptr)
 {
        struct net_device *dev = ptr;
 
@@ -578,7 +578,7 @@ static struct notifier_block ipq_dev_notifier = {
 
 static int
 ipq_rcv_nl_event(struct notifier_block *this,
-                 unsigned long event, void *ptr)
+                unsigned long event, void *ptr)
 {
        struct netlink_notify *n = ptr;
 
@@ -607,7 +607,7 @@ static ctl_table ipq_table[] = {
                .mode           = 0644,
                .proc_handler   = proc_dointvec
        },
-       { .ctl_name = 0 }
+       { .ctl_name = 0 }
 };
 
 static ctl_table ipq_dir_table[] = {
@@ -637,25 +637,25 @@ ipq_get_info(char *buffer, char **start, off_t offset, int length)
        int len;
 
        read_lock_bh(&queue_lock);
-       
+
        len = sprintf(buffer,
-                     "Peer PID          : %d\n"
-                     "Copy mode         : %hu\n"
-                     "Copy range        : %u\n"
-                     "Queue length      : %u\n"
-                     "Queue max. length : %u\n"
+                     "Peer PID          : %d\n"
+                     "Copy mode         : %hu\n"
+                     "Copy range        : %u\n"
+                     "Queue length      : %u\n"
+                     "Queue max. length : %u\n"
                      "Queue dropped     : %u\n"
                      "Netlink dropped   : %u\n",
-                     peer_pid,
-                     copy_mode,
-                     copy_range,
-                     queue_total,
-                     queue_maxlen,
+                     peer_pid,
+                     copy_mode,
+                     copy_range,
+                     queue_total,
+                     queue_maxlen,
                      queue_dropped,
                      queue_user_dropped);
 
        read_unlock_bh(&queue_lock);
-       
+
        *start = buffer + offset;
        len -= offset;
        if (len > length)
@@ -675,7 +675,7 @@ static int __init ip_queue_init(void)
 {
        int status = -ENOMEM;
        struct proc_dir_entry *proc;
-       
+
        netlink_register_notifier(&ipq_nl_notifier);
        ipqnl = netlink_kernel_create(NETLINK_FIREWALL, 0, ipq_rcv_sk,
                                      THIS_MODULE);
@@ -691,10 +691,10 @@ static int __init ip_queue_init(void)
                printk(KERN_ERR "ip_queue: failed to create proc entry\n");
                goto cleanup_ipqnl;
        }
-       
+
        register_netdevice_notifier(&ipq_dev_notifier);
-       ipq_sysctl_header = register_sysctl_table(ipq_root_table, 0);
-       
+       ipq_sysctl_header = register_sysctl_table(ipq_root_table);
+
        status = nf_register_queue_handler(PF_INET, &nfqh);
        if (status < 0) {
                printk(KERN_ERR "ip_queue: failed to register queue handler\n");
@@ -706,12 +706,12 @@ cleanup_sysctl:
        unregister_sysctl_table(ipq_sysctl_header);
        unregister_netdevice_notifier(&ipq_dev_notifier);
        proc_net_remove(IPQ_PROC_FS_NAME);
-       
+
 cleanup_ipqnl:
        sock_release(ipqnl->sk_socket);
        mutex_lock(&ipqnl_mutex);
        mutex_unlock(&ipqnl_mutex);
-       
+
 cleanup_netlink_notifier:
        netlink_unregister_notifier(&ipq_nl_notifier);
        return status;
index 5a7b3a3413899baeac42a1957411b6cfebf6eb74..50cc4b92e2845ae2699e225807582370b09621da 100644 (file)
@@ -297,7 +297,7 @@ ipt_do_table(struct sk_buff **pskb,
                                e = get_entry(table_base, v);
                        } else {
                                /* Targets which reenter must return
-                                   abs. verdicts */
+                                  abs. verdicts */
 #ifdef CONFIG_NETFILTER_DEBUG
                                ((struct ipt_entry *)table_base)->comefrom
                                        = 0xeeeeeeec;
@@ -556,9 +556,9 @@ err:
 
 static inline int check_target(struct ipt_entry *e, const char *name)
 {
-       struct ipt_entry_target *t;
+       struct ipt_entry_target *t;
        struct xt_target *target;
-       int ret;
+       int ret;
 
        t = ipt_get_target(e);
        target = t->u.kernel.target;
@@ -652,7 +652,7 @@ check_entry_size_and_hooks(struct ipt_entry *e,
        }
 
        /* FIXME: underflows must be unconditional, standard verdicts
-           < 0 (not IPT_RETURN). --RR */
+          < 0 (not IPT_RETURN). --RR */
 
        /* Clear counters and comefrom */
        e->counters = ((struct xt_counters) { 0, 0 });
@@ -2057,7 +2057,7 @@ void ipt_unregister_table(struct xt_table *table)
        struct xt_table_info *private;
        void *loc_cpu_entry;
 
-       private = xt_unregister_table(table);
+       private = xt_unregister_table(table);
 
        /* Decrease module usage counts and free resources */
        loc_cpu_entry = private->entries[raw_smp_processor_id()];
index 343c2abdc1a0829d458a202fe00012376d48a8fb..e965b333c997f41a9c1e55b73bbe68656375c96a 100644 (file)
@@ -1,4 +1,4 @@
-/* Cluster IP hashmark target 
+/* Cluster IP hashmark target
  * (C) 2003-2004 by Harald Welte <laforge@netfilter.org>
  * based on ideas of Fabio Olive Leite <olive@unixforge.org>
  *
@@ -70,7 +70,7 @@ static LIST_HEAD(clusterip_configs);
 static DEFINE_RWLOCK(clusterip_lock);
 
 #ifdef CONFIG_PROC_FS
-static struct file_operations clusterip_proc_fops;
+static const struct file_operations clusterip_proc_fops;
 static struct proc_dir_entry *clusterip_procdir;
 #endif
 
@@ -123,7 +123,7 @@ __clusterip_config_find(__be32 clusterip)
        struct list_head *pos;
 
        list_for_each(pos, &clusterip_configs) {
-               struct clusterip_config *c = list_entry(pos, 
+               struct clusterip_config *c = list_entry(pos,
                                        struct clusterip_config, list);
                if (c->clusterip == clusterip) {
                        return c;
@@ -229,7 +229,7 @@ clusterip_del_node(struct clusterip_config *c, u_int16_t nodenum)
        if (nodenum == 0 ||
            nodenum > c->num_total_nodes)
                return 1;
-               
+
        if (test_and_clear_bit(nodenum - 1, &c->local_nodes))
                return 0;
 
@@ -270,7 +270,7 @@ clusterip_hashfn(struct sk_buff *skb, struct clusterip_config *config)
                                      config->hash_initval);
                break;
        case CLUSTERIP_HASHMODE_SIP_SPT:
-               hashval = jhash_2words(ntohl(iph->saddr), sport, 
+               hashval = jhash_2words(ntohl(iph->saddr), sport,
                                       config->hash_initval);
                break;
        case CLUSTERIP_HASHMODE_SIP_SPT_DPT:
@@ -297,8 +297,8 @@ clusterip_responsible(struct clusterip_config *config, u_int32_t hash)
        return test_bit(hash - 1, &config->local_nodes);
 }
 
-/*********************************************************************** 
- * IPTABLES TARGET 
+/***********************************************************************
+ * IPTABLES TARGET
  ***********************************************************************/
 
 static unsigned int
@@ -321,7 +321,7 @@ target(struct sk_buff **pskb,
        if (mark == NULL) {
                printk(KERN_ERR "CLUSTERIP: no conntrack!\n");
                        /* FIXME: need to drop invalid ones, since replies
-                        * to outgoing connections of other nodes will be 
+                        * to outgoing connections of other nodes will be
                         * marked as INVALID */
                return NF_DROP;
        }
@@ -329,11 +329,11 @@ target(struct sk_buff **pskb,
        /* special case: ICMP error handling. conntrack distinguishes between
         * error messages (RELATED) and information requests (see below) */
        if ((*pskb)->nh.iph->protocol == IPPROTO_ICMP
-           && (ctinfo == IP_CT_RELATED 
+           && (ctinfo == IP_CT_RELATED
                || ctinfo == IP_CT_RELATED+IP_CT_IS_REPLY))
                return XT_CONTINUE;
 
-       /* ip_conntrack_icmp guarantees us that we only have ICMP_ECHO, 
+       /* ip_conntrack_icmp guarantees us that we only have ICMP_ECHO,
         * TIMESTAMP, INFO_REQUEST or ADDRESS type icmp packets from here
         * on, which all have an ID field [relevant for hashing]. */
 
@@ -376,8 +376,8 @@ static int
 checkentry(const char *tablename,
           const void *e_void,
           const struct xt_target *target,
-           void *targinfo,
-           unsigned int hook_mask)
+          void *targinfo,
+          unsigned int hook_mask)
 {
        struct ipt_clusterip_tgt_info *cipinfo = targinfo;
        const struct ipt_entry *e = e_void;
@@ -437,7 +437,7 @@ checkentry(const char *tablename,
                                return 0;
                        }
 
-                       config = clusterip_config_init(cipinfo, 
+                       config = clusterip_config_init(cipinfo,
                                                        e->ip.dst.s_addr, dev);
                        if (!config) {
                                printk(KERN_WARNING "CLUSTERIP: cannot allocate config\n");
@@ -483,8 +483,8 @@ static struct xt_target clusterip_tgt = {
 };
 
 
-/*********************************************************************** 
- * ARP MANGLING CODE 
+/***********************************************************************
+ * ARP MANGLING CODE
  ***********************************************************************/
 
 /* hardcoded for 48bit ethernet and 32bit ipv4 addresses */
@@ -496,7 +496,7 @@ struct arp_payload {
 } __attribute__ ((packed));
 
 #ifdef CLUSTERIP_DEBUG
-static void arp_print(struct arp_payload *payload) 
+static void arp_print(struct arp_payload *payload)
 {
 #define HBUFFERLEN 30
        char hbuffer[HBUFFERLEN];
@@ -510,7 +510,7 @@ static void arp_print(struct arp_payload *payload)
        }
        hbuffer[--k]='\0';
 
-       printk("src %u.%u.%u.%u@%s, dst %u.%u.%u.%u\n", 
+       printk("src %u.%u.%u.%u@%s, dst %u.%u.%u.%u\n",
                NIPQUAD(payload->src_ip), hbuffer,
                NIPQUAD(payload->dst_ip));
 }
@@ -540,13 +540,13 @@ arp_mangle(unsigned int hook,
 
        payload = (void *)(arp+1);
 
-       /* if there is no clusterip configuration for the arp reply's 
+       /* if there is no clusterip configuration for the arp reply's
         * source ip, we don't want to mangle it */
        c = clusterip_config_find_get(payload->src_ip, 0);
        if (!c)
                return NF_ACCEPT;
 
-       /* normally the linux kernel always replies to arp queries of 
+       /* normally the linux kernel always replies to arp queries of
         * addresses on different interfacs.  However, in the CLUSTERIP case
         * this wouldn't work, since we didn't subscribe the mcast group on
         * other interfaces */
@@ -577,8 +577,8 @@ static struct nf_hook_ops cip_arp_ops = {
        .priority = -1
 };
 
-/*********************************************************************** 
- * PROC DIR HANDLING 
+/***********************************************************************
+ * PROC DIR HANDLING
  ***********************************************************************/
 
 #ifdef CONFIG_PROC_FS
@@ -640,7 +640,7 @@ static int clusterip_seq_show(struct seq_file *s, void *v)
 {
        struct clusterip_seq_position *idx = (struct clusterip_seq_position *)v;
 
-       if (idx->pos != 0) 
+       if (idx->pos != 0)
                seq_putc(s, ',');
 
        seq_printf(s, "%u", idx->bit);
@@ -715,7 +715,7 @@ static ssize_t clusterip_proc_write(struct file *file, const char __user *input,
        return size;
 }
 
-static struct file_operations clusterip_proc_fops = {
+static const struct file_operations clusterip_proc_fops = {
        .owner   = THIS_MODULE,
        .open    = clusterip_proc_open,
        .read    = seq_read,
index b5ca5938d1fec47c130626d84b7e0dedb30807e9..4f565633631dfa971d39eb1bc151ebf0b292fc8d 100644 (file)
@@ -1,9 +1,9 @@
 /* iptables module for the IPv4 and TCP ECN bits, Version 1.5
  *
  * (C) 2002 by Harald Welte <laforge@netfilter.org>
- * 
+ *
  * 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 
+ * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  *
  * ipt_ECN.c,v 1.5 2002/08/18 19:36:51 laforge Exp
@@ -40,7 +40,7 @@ set_ect_ip(struct sk_buff **pskb, const struct ipt_ECN_info *einfo)
                iph->tos &= ~IPT_ECN_IP_MASK;
                iph->tos |= (einfo->ip_ect & IPT_ECN_IP_MASK);
                nf_csum_replace2(&iph->check, htons(oldtos), htons(iph->tos));
-       } 
+       }
        return 1;
 }
 
@@ -104,8 +104,8 @@ static int
 checkentry(const char *tablename,
           const void *e_void,
           const struct xt_target *target,
-           void *targinfo,
-           unsigned int hook_mask)
+          void *targinfo,
+          unsigned int hook_mask)
 {
        const struct ipt_ECN_info *einfo = (struct ipt_ECN_info *)targinfo;
        const struct ipt_entry *e = e_void;
index f68370ffb43f22e286d03dbd67962965924676d4..d9c37fd94228f233a29f8e8024d9a358474ceddd 100644 (file)
@@ -289,7 +289,7 @@ static void dump_packet(const struct nf_loginfo *info,
 
                if (ntohs(ih->frag_off) & IP_OFFSET)
                        break;
-               
+
                /* Max length: 9 "PROTO=AH " */
                printk("PROTO=AH ");
 
@@ -334,10 +334,10 @@ static void dump_packet(const struct nf_loginfo *info,
        }
 
        /* Max length: 15 "UID=4294967295 " */
-       if ((logflags & IPT_LOG_UID) && !iphoff && skb->sk) {
+       if ((logflags & IPT_LOG_UID) && !iphoff && skb->sk) {
                read_lock_bh(&skb->sk->sk_callback_lock);
                if (skb->sk->sk_socket && skb->sk->sk_socket->file)
-                       printk("UID=%u ", skb->sk->sk_socket->file->f_uid);
+                       printk("UID=%u ", skb->sk->sk_socket->file->f_uid);
                read_unlock_bh(&skb->sk->sk_callback_lock);
        }
 
@@ -431,7 +431,7 @@ ipt_log_target(struct sk_buff **pskb,
        li.u.log.logflags = loginfo->logflags;
 
        ipt_log_packet(PF_INET, hooknum, *pskb, in, out, &li,
-                      loginfo->prefix);
+                      loginfo->prefix);
        return XT_CONTINUE;
 }
 
@@ -483,13 +483,13 @@ static int __init ipt_log_init(void)
                /* we cannot make module load fail here, since otherwise
                 * iptables userspace would abort */
        }
-       
+
        return 0;
 }
 
 static void __exit ipt_log_fini(void)
 {
-       nf_log_unregister_logger(&ipt_log_logger);
+       nf_log_unregister(&ipt_log_logger);
        xt_unregister_target(&ipt_log_reg);
 }
 
index 91c42efcd5330508acd694270a4776bd67bfd2aa..b5955f3a3f8f0866a429493264b5ecef276a0791 100644 (file)
@@ -86,7 +86,7 @@ masquerade_target(struct sk_buff **pskb,
        nat = nfct_nat(ct);
 #endif
        IP_NF_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_RELATED
-                           || ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY));
+                           || ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY));
 
        /* Source address is 0.0.0.0 - locally generated packet that is
         * probably not supposed to be masqueraded.
@@ -221,7 +221,7 @@ static void __exit ipt_masquerade_fini(void)
 {
        xt_unregister_target(&masquerade);
        unregister_netdevice_notifier(&masq_dev_notifier);
-       unregister_inetaddr_notifier(&masq_inet_notifier);      
+       unregister_inetaddr_notifier(&masq_inet_notifier);
 }
 
 module_init(ipt_masquerade_init);
index b4acc241d8981a27b0475b2ee6c968a40bc34ba1..fd7aaa347cd8aac4332066af2c9edd9123ca3725 100644 (file)
@@ -92,13 +92,13 @@ target(struct sk_buff **pskb,
 static struct xt_target target_module = {
        .name           = MODULENAME,
        .family         = AF_INET,
-       .target         = target, 
+       .target         = target,
        .targetsize     = sizeof(struct ip_nat_multi_range_compat),
        .table          = "nat",
        .hooks          = (1 << NF_IP_PRE_ROUTING) | (1 << NF_IP_POST_ROUTING) |
                          (1 << NF_IP_LOCAL_OUT),
        .checkentry     = check,
-       .me             = THIS_MODULE 
+       .me             = THIS_MODULE
 };
 
 static int __init ipt_netmap_init(void)
index 54cd021aa5a8442ed5ad15bdb78b45d01752df1c..c2b6b80670f8bf89cfd68c16b396bdee1d4a99cc 100644 (file)
@@ -84,7 +84,7 @@ redirect_target(struct sk_buff **pskb,
                struct in_ifaddr *ifa;
 
                newdst = 0;
-               
+
                rcu_read_lock();
                indev = __in_dev_get_rcu((*pskb)->dev);
                if (indev && (ifa = indev->ifa_list))
index e4a1ddb386a731dfb0090a36d89d8ed4d6835fe3..80f739e218244936b1da8a27f9e041225046ba54 100644 (file)
@@ -57,7 +57,7 @@ static void send_reset(struct sk_buff *oldskb, int hook)
        oth = skb_header_pointer(oldskb, oldskb->nh.iph->ihl * 4,
                                 sizeof(_otcph), &_otcph);
        if (oth == NULL)
-               return;
+               return;
 
        /* No RST for RST. */
        if (oth->rst)
@@ -80,6 +80,10 @@ static void send_reset(struct sk_buff *oldskb, int hook)
        nskb->mark = 0;
        skb_init_secmark(nskb);
 
+       skb_shinfo(nskb)->gso_size = 0;
+       skb_shinfo(nskb)->gso_segs = 0;
+       skb_shinfo(nskb)->gso_type = 0;
+
        tcph = (struct tcphdr *)((u_int32_t*)nskb->nh.iph + nskb->nh.iph->ihl);
 
        /* Swap source and dest */
@@ -145,7 +149,7 @@ static void send_reset(struct sk_buff *oldskb, int hook)
 
        /* Adjust IP checksum */
        nskb->nh.iph->check = 0;
-       nskb->nh.iph->check = ip_fast_csum((unsigned char *)nskb->nh.iph, 
+       nskb->nh.iph->check = ip_fast_csum((unsigned char *)nskb->nh.iph,
                                           nskb->nh.iph->ihl);
 
        /* "Never happens" */
@@ -165,7 +169,7 @@ static void send_reset(struct sk_buff *oldskb, int hook)
 static inline void send_unreach(struct sk_buff *skb_in, int code)
 {
        icmp_send(skb_in, ICMP_DEST_UNREACH, code, 0);
-}      
+}
 
 static unsigned int reject(struct sk_buff **pskb,
                           const struct net_device *in,
@@ -177,33 +181,33 @@ static unsigned int reject(struct sk_buff **pskb,
        const struct ipt_reject_info *reject = targinfo;
 
        /* Our naive response construction doesn't deal with IP
-           options, and probably shouldn't try. */
+          options, and probably shouldn't try. */
        if ((*pskb)->nh.iph->ihl<<2 != sizeof(struct iphdr))
                return NF_DROP;
 
        /* WARNING: This code causes reentry within iptables.
           This means that the iptables jump stack is now crap.  We
           must return an absolute verdict. --RR */
-       switch (reject->with) {
-       case IPT_ICMP_NET_UNREACHABLE:
-               send_unreach(*pskb, ICMP_NET_UNREACH);
-               break;
-       case IPT_ICMP_HOST_UNREACHABLE:
-               send_unreach(*pskb, ICMP_HOST_UNREACH);
-               break;
-       case IPT_ICMP_PROT_UNREACHABLE:
-               send_unreach(*pskb, ICMP_PROT_UNREACH);
-               break;
-       case IPT_ICMP_PORT_UNREACHABLE:
-               send_unreach(*pskb, ICMP_PORT_UNREACH);
-               break;
-       case IPT_ICMP_NET_PROHIBITED:
-               send_unreach(*pskb, ICMP_NET_ANO);
-               break;
+       switch (reject->with) {
+       case IPT_ICMP_NET_UNREACHABLE:
+               send_unreach(*pskb, ICMP_NET_UNREACH);
+               break;
+       case IPT_ICMP_HOST_UNREACHABLE:
+               send_unreach(*pskb, ICMP_HOST_UNREACH);
+               break;
+       case IPT_ICMP_PROT_UNREACHABLE:
+               send_unreach(*pskb, ICMP_PROT_UNREACH);
+               break;
+       case IPT_ICMP_PORT_UNREACHABLE:
+               send_unreach(*pskb, ICMP_PORT_UNREACH);
+               break;
+       case IPT_ICMP_NET_PROHIBITED:
+               send_unreach(*pskb, ICMP_NET_ANO);
+               break;
        case IPT_ICMP_HOST_PROHIBITED:
-               send_unreach(*pskb, ICMP_HOST_ANO);
-               break;
-       case IPT_ICMP_ADMIN_PROHIBITED:
+               send_unreach(*pskb, ICMP_HOST_ANO);
+               break;
+       case IPT_ICMP_ADMIN_PROHIBITED:
                send_unreach(*pskb, ICMP_PKT_FILTERED);
                break;
        case IPT_TCP_RESET:
@@ -222,7 +226,7 @@ static int check(const char *tablename,
                 void *targinfo,
                 unsigned int hook_mask)
 {
-       const struct ipt_reject_info *rejinfo = targinfo;
+       const struct ipt_reject_info *rejinfo = targinfo;
        const struct ipt_entry *e = e_void;
 
        if (rejinfo->with == IPT_ICMP_ECHOREPLY) {
index a1cdd1262de29acf656a0ba1cb5e74e63584a86f..bd4404e5c6889821f7d0dd1d09e876232a73649d 100644 (file)
@@ -87,24 +87,24 @@ same_check(const char *tablename,
                        DEBUGP("same_check: bad MAP_IPS.\n");
                        return 0;
                }
-               rangeip = (ntohl(mr->range[count].max_ip) - 
+               rangeip = (ntohl(mr->range[count].max_ip) -
                                        ntohl(mr->range[count].min_ip) + 1);
                mr->ipnum += rangeip;
-               
+
                DEBUGP("same_check: range %u, ipnum = %u\n", count, rangeip);
        }
        DEBUGP("same_check: total ipaddresses = %u\n", mr->ipnum);
-       
+
        mr->iparray = kmalloc((sizeof(u_int32_t) * mr->ipnum), GFP_KERNEL);
        if (!mr->iparray) {
                DEBUGP("same_check: Couldn't allocate %u bytes "
-                       "for %u ipaddresses!\n", 
+                       "for %u ipaddresses!\n",
                        (sizeof(u_int32_t) * mr->ipnum), mr->ipnum);
                return 0;
        }
        DEBUGP("same_check: Allocated %u bytes for %u ipaddresses.\n",
                        (sizeof(u_int32_t) * mr->ipnum), mr->ipnum);
-       
+
        for (count = 0; count < mr->rangesize; count++) {
                for (countess = ntohl(mr->range[count].min_ip);
                                countess <= ntohl(mr->range[count].max_ip);
@@ -119,13 +119,13 @@ same_check(const char *tablename,
        return 1;
 }
 
-static void 
+static void
 same_destroy(const struct xt_target *target, void *targinfo)
 {
        struct ipt_same_info *mr = targinfo;
 
        kfree(mr->iparray);
-       
+
        DEBUGP("same_destroy: Deallocated %u bytes for %u ipaddresses.\n",
                        (sizeof(u_int32_t) * mr->ipnum), mr->ipnum);
 }
@@ -156,7 +156,7 @@ same_target(struct sk_buff **pskb,
           giving some hope for consistency across reboots.
           Here we calculate the index in same->iparray which
           holds the ipaddress we should use */
-       
+
 #ifdef CONFIG_NF_NAT_NEEDED
        tmpip = ntohl(t->src.u3.ip);
 
index 29b05a6bd108af7dd49433c6345f278b10c7f127..cedf9f7d9d6ef650fbeef90dc2609f7d45f8836f 100644 (file)
@@ -47,8 +47,8 @@ static int
 checkentry(const char *tablename,
           const void *e_void,
           const struct xt_target *target,
-           void *targinfo,
-           unsigned int hook_mask)
+          void *targinfo,
+          unsigned int hook_mask)
 {
        const u_int8_t tos = ((struct ipt_tos_target_info *)targinfo)->tos;
 
index d2b6fa3f9dcdf23cc8d8663a04ffe1ed8a359f70..64be31c22ba9eb4aac423865fc640e835cca86fb 100644 (file)
@@ -19,7 +19,7 @@ MODULE_AUTHOR("Harald Welte <laforge@netfilter.org>");
 MODULE_DESCRIPTION("IP tables TTL modification module");
 MODULE_LICENSE("GPL");
 
-static unsigned int 
+static unsigned int
 ipt_ttl_target(struct sk_buff **pskb,
               const struct net_device *in, const struct net_device *out,
               unsigned int hooknum, const struct xt_target *target,
@@ -71,7 +71,7 @@ static int ipt_ttl_checkentry(const char *tablename,
        struct ipt_TTL_info *info = targinfo;
 
        if (info->mode > IPT_TTL_MAXMODE) {
-               printk(KERN_WARNING "ipt_TTL: invalid or unknown Mode %u\n", 
+               printk(KERN_WARNING "ipt_TTL: invalid or unknown Mode %u\n",
                        info->mode);
                return 0;
        }
@@ -83,10 +83,10 @@ static int ipt_ttl_checkentry(const char *tablename,
 static struct xt_target ipt_TTL = {
        .name           = "TTL",
        .family         = AF_INET,
-       .target         = ipt_ttl_target, 
+       .target         = ipt_ttl_target,
        .targetsize     = sizeof(struct ipt_TTL_info),
        .table          = "mangle",
-       .checkentry     = ipt_ttl_checkentry, 
+       .checkentry     = ipt_ttl_checkentry,
        .me             = THIS_MODULE,
 };
 
index 7af57a3a1f3659d29415fd1bdb1fa6f9d20320ff..a26404dbe2129a8489785c52a0b081013b920e23 100644 (file)
@@ -4,9 +4,9 @@
  * (C) 2000-2004 by Harald Welte <laforge@netfilter.org>
  *
  * 2000/09/22 ulog-cprange feature added
- * 2001/01/04 in-kernel queue as proposed by Sebastian Zander 
+ * 2001/01/04 in-kernel queue as proposed by Sebastian Zander
  *                                             <zander@fokus.gmd.de>
- * 2001/01/30 per-rule nlgroup conflicts with global queue. 
+ * 2001/01/30 per-rule nlgroup conflicts with global queue.
  *            nlgroup now global (sysctl)
  * 2001/04/19 ulog-queue reworked, now fixed buffer size specified at
  *           module loadtime -HW
@@ -23,8 +23,8 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  *
- * This module accepts two parameters: 
- * 
+ * This module accepts two parameters:
+ *
  * nlbufsiz:
  *   The parameter specifies how big the buffer for each netlink multicast
  * group is. e.g. If you say nlbufsiz=8192, up to eight kb of packets will
@@ -72,7 +72,7 @@ MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_NFLOG);
 
 #if 0
 #define DEBUGP(format, args...) printk("%s:%s:" format, \
-                                       __FILE__, __FUNCTION__ , ## args)
+                                      __FILE__, __FUNCTION__ , ## args)
 #else
 #define DEBUGP(format, args...)
 #endif
@@ -162,7 +162,7 @@ static struct sk_buff *ulog_alloc_skb(unsigned int size)
                PRINTR("ipt_ULOG: can't alloc whole buffer %ub!\n", n);
 
                if (n > size) {
-                       /* try to allocate only as much as we need for 
+                       /* try to allocate only as much as we need for
                         * current packet */
 
                        skb = alloc_skb(size, GFP_ATOMIC);
@@ -203,7 +203,7 @@ static void ipt_ulog_packet(unsigned int hooknum,
        size = NLMSG_SPACE(sizeof(*pm) + copy_len);
 
        ub = &ulog_buffers[groupnum];
-       
+
        spin_lock_bh(&ulog_lock);
 
        if (!ub->skb) {
@@ -211,7 +211,7 @@ static void ipt_ulog_packet(unsigned int hooknum,
                        goto alloc_failure;
        } else if (ub->qlen >= loginfo->qthreshold ||
                   size > skb_tailroom(ub->skb)) {
-               /* either the queue len is too high or we don't have 
+               /* either the queue len is too high or we don't have
                 * enough room in nlskb left. send it to userspace. */
 
                ulog_send(groupnum);
@@ -220,11 +220,11 @@ static void ipt_ulog_packet(unsigned int hooknum,
                        goto alloc_failure;
        }
 
-       DEBUGP("ipt_ULOG: qlen %d, qthreshold %d\n", ub->qlen, 
+       DEBUGP("ipt_ULOG: qlen %d, qthreshold %d\n", ub->qlen,
                loginfo->qthreshold);
 
        /* NLMSG_PUT contains a hidden goto nlmsg_failure !!! */
-       nlh = NLMSG_PUT(ub->skb, 0, ub->qlen, ULOG_NL_EVENT, 
+       nlh = NLMSG_PUT(ub->skb, 0, ub->qlen, ULOG_NL_EVENT,
                        sizeof(*pm)+copy_len);
        ub->qlen++;
 
@@ -268,7 +268,7 @@ static void ipt_ulog_packet(unsigned int hooknum,
        /* copy_len <= skb->len, so can't fail. */
        if (skb_copy_bits(skb, 0, pm->payload, copy_len) < 0)
                BUG();
-       
+
        /* check if we are building multi-part messages */
        if (ub->qlen > 1) {
                ub->lastnlh->nlmsg_flags |= NLM_F_MULTI;
@@ -312,10 +312,10 @@ static unsigned int ipt_ulog_target(struct sk_buff **pskb,
        struct ipt_ulog_info *loginfo = (struct ipt_ulog_info *) targinfo;
 
        ipt_ulog_packet(hooknum, *pskb, in, out, loginfo, NULL);
+
        return XT_CONTINUE;
 }
+
 static void ipt_logfn(unsigned int pf,
                      unsigned int hooknum,
                      const struct sk_buff *skb,
@@ -396,7 +396,7 @@ static int __init ipt_ulog_init(void)
        }
 
        nflognl = netlink_kernel_create(NETLINK_NFLOG, ULOG_MAXNLGROUPS, NULL,
-                                       THIS_MODULE);
+                                       THIS_MODULE);
        if (!nflognl)
                return -ENOMEM;
 
@@ -407,7 +407,7 @@ static int __init ipt_ulog_init(void)
        }
        if (nflog)
                nf_log_register(PF_INET, &ipt_ulog_logger);
-       
+
        return 0;
 }
 
@@ -419,7 +419,7 @@ static void __exit ipt_ulog_fini(void)
        DEBUGP("ipt_ULOG: cleanup_module\n");
 
        if (nflog)
-               nf_log_unregister_logger(&ipt_ulog_logger);
+               nf_log_unregister(&ipt_ulog_logger);
        xt_unregister_target(&ipt_ulog_reg);
        sock_release(nflognl->sk_socket);
 
index 648f555c4d16463f088aa4b9232e400f3644acf4..cfa0472617f604c89f7e9cb87da40ae937c91632 100644 (file)
@@ -40,7 +40,7 @@ static int match(const struct sk_buff *skb,
                ret &= match_type(iph->saddr, info->source)^info->invert_source;
        if (info->dest)
                ret &= match_type(iph->daddr, info->dest)^info->invert_dest;
-       
+
        return ret;
 }
 
index 42f41224a43ae8ffe4d3d49b7d9bf8e9b5fc2350..18a16782cf405f1cc6f49fa07a4fa541135d43c0 100644 (file)
@@ -29,8 +29,8 @@ static inline int
 spi_match(u_int32_t min, u_int32_t max, u_int32_t spi, int invert)
 {
        int r=0;
-        duprintf("ah spi_match:%c 0x%x <= 0x%x <= 0x%x",invert? '!':' ',
-               min,spi,max);
+       duprintf("ah spi_match:%c 0x%x <= 0x%x <= 0x%x",invert? '!':' ',
+               min,spi,max);
        r=(spi >= min && spi <= max) ^ invert;
        duprintf(" result %s\n",r? "PASS" : "FAILED");
        return r;
index 05de593be94c84596e0d46dd0bb773a35dcd228d..bc5d5e6091e476bf58fb79bfe886a1e44f876f71 100644 (file)
@@ -41,7 +41,7 @@ match(const struct sk_buff *skb,
                        DEBUGP("src IP %u.%u.%u.%u NOT in range %s"
                               "%u.%u.%u.%u-%u.%u.%u.%u\n",
                                NIPQUAD(iph->saddr),
-                               info->flags & IPRANGE_SRC_INV ? "(INV) " : "",
+                               info->flags & IPRANGE_SRC_INV ? "(INV) " : "",
                                NIPQUAD(info->src.min_ip),
                                NIPQUAD(info->src.max_ip));
                        return 0;
@@ -54,7 +54,7 @@ match(const struct sk_buff *skb,
                        DEBUGP("dst IP %u.%u.%u.%u NOT in range %s"
                               "%u.%u.%u.%u-%u.%u.%u.%u\n",
                                NIPQUAD(iph->daddr),
-                               info->flags & IPRANGE_DST_INV ? "(INV) " : "",
+                               info->flags & IPRANGE_DST_INV ? "(INV) " : "",
                                NIPQUAD(info->dst.min_ip),
                                NIPQUAD(info->dst.max_ip));
                        return 0;
index 9f496ac834b5bea627a2327371d33ab80cb00c7a..7fae9aa8944c6bb4b07797015d9fd0df315aa754 100644 (file)
@@ -53,10 +53,10 @@ match(const struct sk_buff *skb,
 
 static int
 checkentry(const char *tablename,
-           const void *ip,
+          const void *ip,
           const struct xt_match *match,
-           void *matchinfo,
-           unsigned int hook_mask)
+          void *matchinfo,
+          unsigned int hook_mask)
 {
        const struct ipt_owner_info *info = matchinfo;
 
index 6b97b6796173b34d6f08727099455ad567b9a7e2..aecb9c48e15252ef4fe04fb8bb3c1d970dc47dda 100644 (file)
@@ -79,7 +79,7 @@ static DEFINE_MUTEX(recent_mutex);
 
 #ifdef CONFIG_PROC_FS
 static struct proc_dir_entry   *proc_dir;
-static struct file_operations  recent_fops;
+static const struct file_operations    recent_fops;
 #endif
 
 static u_int32_t hash_rnd;
@@ -454,7 +454,7 @@ static ssize_t recent_proc_write(struct file *file, const char __user *input,
        return size;
 }
 
-static struct file_operations recent_fops = {
+static const struct file_operations recent_fops = {
        .open           = recent_seq_open,
        .read           = seq_read,
        .write          = recent_proc_write,
index d5cd984e5ed2dda90b7b55c6f20171e7b4b316cd..1eca9f40037493b69a025f16f016d070c536b91d 100644 (file)
@@ -1,4 +1,4 @@
-/* IP tables module for matching the value of the TTL 
+/* IP tables module for matching the value of the TTL
  *
  * ipt_ttl.c,v 1.5 2000/11/13 11:16:08 laforge Exp
  *
@@ -41,7 +41,7 @@ static int match(const struct sk_buff *skb,
                        return (skb->nh.iph->ttl > info->ttl);
                        break;
                default:
-                       printk(KERN_WARNING "ipt_ttl: unknown mode %d\n", 
+                       printk(KERN_WARNING "ipt_ttl: unknown mode %d\n",
                                info->mode);
                        return 0;
        }
index 51053cb42f43b25c7b15b4e06a19715127667d55..d1d61e97b97659dc4a97928affc8cc27c1cbeaa6 100644 (file)
@@ -25,7 +25,7 @@ static struct
        struct ipt_replace repl;
        struct ipt_standard entries[3];
        struct ipt_error term;
-} initial_table __initdata 
+} initial_table __initdata
 = { { "filter", FILTER_VALID_HOOKS, 4,
       sizeof(struct ipt_standard) * 3 + sizeof(struct ipt_error),
       { [NF_IP_LOCAL_IN] = 0,
index a532e4d843326c33babab65e949cd03741e8bfe4..98b66ef0c714b93c7235e1bfd5cca07100ba1004 100644 (file)
@@ -58,7 +58,7 @@ static struct
              { { { { IPT_ALIGN(sizeof(struct ipt_standard_target)), "" } }, { } },
                -NF_ACCEPT - 1 } },
            /* LOCAL_IN */
-           { { { { 0 }, { 0 }, { 0 }, { 0 }, "", "", { 0 }, { 0 }, 0, 0, 0 },
+           { { { { 0 }, { 0 }, { 0 }, { 0 }, "", "", { 0 }, { 0 }, 0, 0, 0 },
                0,
                sizeof(struct ipt_entry),
                sizeof(struct ipt_standard),
@@ -66,7 +66,7 @@ static struct
              { { { { IPT_ALIGN(sizeof(struct ipt_standard_target)), "" } }, { } },
                -NF_ACCEPT - 1 } },
            /* FORWARD */
-           { { { { 0 }, { 0 }, { 0 }, { 0 }, "", "", { 0 }, { 0 }, 0, 0, 0 },
+           { { { { 0 }, { 0 }, { 0 }, { 0 }, "", "", { 0 }, { 0 }, 0, 0, 0 },
                0,
                sizeof(struct ipt_entry),
                sizeof(struct ipt_standard),
@@ -166,7 +166,7 @@ static struct nf_hook_ops ipt_ops[] = {
                .hook           = ipt_route_hook,
                .owner          = THIS_MODULE,
                .pf             = PF_INET,
-               .hooknum        = NF_IP_PRE_ROUTING, 
+               .hooknum        = NF_IP_PRE_ROUTING,
                .priority       = NF_IP_PRI_MANGLE,
        },
        {
index 5277550fa6b570ad41edeec85260c0ecf0384c20..18c3d4c9ff51e23ecd8ffece105407d7fed94e91 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
  * 'raw' table, which is the very first hooked in at PRE_ROUTING and LOCAL_OUT .
  *
  * Copyright (C) 2003 Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
@@ -15,26 +15,26 @@ static struct
        struct ipt_error term;
 } initial_table __initdata = {
        .repl = {
-               .name = "raw", 
-               .valid_hooks = RAW_VALID_HOOKS, 
+               .name = "raw",
+               .valid_hooks = RAW_VALID_HOOKS,
                .num_entries = 3,
                .size = sizeof(struct ipt_standard) * 2 + sizeof(struct ipt_error),
-               .hook_entry = { 
+               .hook_entry = {
                        [NF_IP_PRE_ROUTING] = 0,
                        [NF_IP_LOCAL_OUT] = sizeof(struct ipt_standard) },
-               .underflow = { 
+               .underflow = {
                        [NF_IP_PRE_ROUTING] = 0,
                        [NF_IP_LOCAL_OUT]  = sizeof(struct ipt_standard) },
        },
        .entries = {
             /* PRE_ROUTING */
-            { 
-                    .entry = { 
+            {
+                    .entry = {
                             .target_offset = sizeof(struct ipt_entry),
                             .next_offset = sizeof(struct ipt_standard),
                     },
-                    .target = { 
-                         .target = { 
+                    .target = {
+                         .target = {
                                  .u = {
                                          .target_size = IPT_ALIGN(sizeof(struct ipt_standard_target)),
                                  },
@@ -69,7 +69,7 @@ static struct
                        .target = {
                                .u = {
                                        .user = {
-                                               .target_size = IPT_ALIGN(sizeof(struct ipt_error_target)), 
+                                               .target_size = IPT_ALIGN(sizeof(struct ipt_error_target)),
                                                .name = IPT_ERROR_TARGET,
                                        },
                                },
@@ -80,9 +80,9 @@ static struct
 };
 
 static struct xt_table packet_raw = {
-       .name = "raw", 
-       .valid_hooks =  RAW_VALID_HOOKS, 
-       .lock = RW_LOCK_UNLOCKED, 
+       .name = "raw",
+       .valid_hooks =  RAW_VALID_HOOKS,
+       .lock = RW_LOCK_UNLOCKED,
        .me = THIS_MODULE,
        .af = AF_INET,
 };
index 471b638cedec8c2714745a9dac00bceea8d1e830..b984db771258f989f7a9499408ea0e4319c54e62 100644 (file)
@@ -66,7 +66,7 @@ static int ipv4_print_tuple(struct seq_file *s,
                            const struct nf_conntrack_tuple *tuple)
 {
        return seq_printf(s, "src=%u.%u.%u.%u dst=%u.%u.%u.%u ",
-                         NIPQUAD(tuple->src.u3.ip),
+                         NIPQUAD(tuple->src.u3.ip),
                          NIPQUAD(tuple->dst.u3.ip));
 }
 
@@ -82,14 +82,14 @@ nf_ct_ipv4_gather_frags(struct sk_buff *skb, u_int32_t user)
 {
        skb_orphan(skb);
 
-        local_bh_disable();
-        skb = ip_defrag(skb, user);
-        local_bh_enable();
+       local_bh_disable();
+       skb = ip_defrag(skb, user);
+       local_bh_enable();
 
-        if (skb)
+       if (skb)
                ip_send_check(skb->nh.iph);
 
-        return skb;
+       return skb;
 }
 
 static int
@@ -192,10 +192,10 @@ static unsigned int ipv4_conntrack_in(unsigned int hooknum,
 }
 
 static unsigned int ipv4_conntrack_local(unsigned int hooknum,
-                                        struct sk_buff **pskb,
-                                        const struct net_device *in,
-                                        const struct net_device *out,
-                                        int (*okfn)(struct sk_buff *))
+                                        struct sk_buff **pskb,
+                                        const struct net_device *in,
+                                        const struct net_device *out,
+                                        int (*okfn)(struct sk_buff *))
 {
        /* root is playing with raw sockets. */
        if ((*pskb)->len < sizeof(struct iphdr)
@@ -332,7 +332,7 @@ getorigdst(struct sock *sk, int optval, void __user *user, int *len)
        struct inet_sock *inet = inet_sk(sk);
        struct nf_conntrack_tuple_hash *h;
        struct nf_conntrack_tuple tuple;
-       
+
        NF_CT_TUPLE_U_BLANK(&tuple);
        tuple.src.u3.ip = inet->rcv_saddr;
        tuple.src.u.tcp.port = inet->sport;
@@ -501,7 +501,7 @@ static int __init nf_conntrack_l3proto_ipv4_init(void)
        return ret;
 #if defined(CONFIG_PROC_FS) && defined(CONFIG_NF_CONNTRACK_PROC_COMPAT)
  cleanup_hooks:
-       nf_unregister_hooks(ipv4_conntrack_ops, ARRAY_SIZE(ipv4_conntrack_ops));
+       nf_unregister_hooks(ipv4_conntrack_ops, ARRAY_SIZE(ipv4_conntrack_ops));
 #endif
  cleanup_ipv4:
        nf_conntrack_l3proto_unregister(&nf_conntrack_l3proto_ipv4);
index 3b31bc64960809394da42ad275c84c3578379ec2..89f933e810359d8d252e272b29ae22e3627702c1 100644 (file)
@@ -135,7 +135,7 @@ static int ct_seq_show(struct seq_file *s, void *v)
                        l3proto, l4proto))
                return -ENOSPC;
 
-       if (seq_print_counters(s, &ct->counters[IP_CT_DIR_ORIGINAL]))
+       if (seq_print_counters(s, &ct->counters[IP_CT_DIR_ORIGINAL]))
                return -ENOSPC;
 
        if (!(test_bit(IPS_SEEN_REPLY_BIT, &ct->status)))
@@ -146,7 +146,7 @@ static int ct_seq_show(struct seq_file *s, void *v)
                        l3proto, l4proto))
                return -ENOSPC;
 
-       if (seq_print_counters(s, &ct->counters[IP_CT_DIR_REPLY]))
+       if (seq_print_counters(s, &ct->counters[IP_CT_DIR_REPLY]))
                return -ENOSPC;
 
        if (test_bit(IPS_ASSURED_BIT, &ct->status))
@@ -197,7 +197,7 @@ out_free:
        return ret;
 }
 
-static struct file_operations ct_file_ops = {
+static const struct file_operations ct_file_ops = {
        .owner   = THIS_MODULE,
        .open    = ct_open,
        .read    = seq_read,
@@ -228,7 +228,7 @@ static void *exp_seq_start(struct seq_file *s, loff_t *pos)
 
 static void *exp_seq_next(struct seq_file *s, void *v, loff_t *pos)
 {
-       struct list_head *e = v;
+       struct list_head *e = v;
 
        ++*pos;
        e = e->next;
@@ -262,7 +262,7 @@ static int exp_seq_show(struct seq_file *s, void *v)
        print_tuple(s, &exp->tuple,
                    __nf_ct_l3proto_find(exp->tuple.src.l3num),
                    __nf_ct_l4proto_find(exp->tuple.src.l3num,
-                                        exp->tuple.dst.protonum));
+                                        exp->tuple.dst.protonum));
        return seq_putc(s, '\n');
 }
 
@@ -278,7 +278,7 @@ static int exp_open(struct inode *inode, struct file *file)
        return seq_open(file, &exp_seq_ops);
 }
 
-static struct file_operations ip_exp_file_ops = {
+static const struct file_operations ip_exp_file_ops = {
        .owner   = THIS_MODULE,
        .open    = exp_open,
        .read    = seq_read,
@@ -366,7 +366,7 @@ static int ct_cpu_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &ct_cpu_seq_ops);
 }
 
-static struct file_operations ct_cpu_seq_fops = {
+static const struct file_operations ct_cpu_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = ct_cpu_seq_open,
        .read    = seq_read,
index db9e7c45d3b42103b393d69deaa2e9b1fc71858c..88cfa6aacfc150f81eb9d7d419d2400812aa8515 100644 (file)
@@ -12,7 +12,6 @@
  */
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/netfilter.h>
 #include <linux/in.h>
@@ -101,9 +100,9 @@ static int icmp_packet(struct nf_conn *ct,
                       unsigned int hooknum)
 {
        /* Try to delete connection immediately after all replies:
-           won't actually vanish as we still have skb, and del_timer
-           means this will only run once even if count hits zero twice
-           (theoretically possible with SMP) */
+          won't actually vanish as we still have skb, and del_timer
+          means this will only run once even if count hits zero twice
+          (theoretically possible with SMP) */
        if (CTINFO2DIR(ctinfo) == IP_CT_DIR_REPLY) {
                if (atomic_dec_and_test(&ct->proto.icmp.count)
                    && del_timer(&ct->timeout))
@@ -144,8 +143,8 @@ extern struct nf_conntrack_l3proto nf_conntrack_l3proto_ipv4;
 /* Returns conntrack if it dealt with ICMP, and filled in skb fields */
 static int
 icmp_error_message(struct sk_buff *skb,
-                 enum ip_conntrack_info *ctinfo,
-                 unsigned int hooknum)
+                enum ip_conntrack_info *ctinfo,
+                unsigned int hooknum)
 {
        struct nf_conntrack_tuple innertuple, origtuple;
        struct {
@@ -170,7 +169,9 @@ icmp_error_message(struct sk_buff *skb,
                return -NF_ACCEPT;
        }
 
+       /* rcu_read_lock()ed by nf_hook_slow */
        innerproto = __nf_ct_l4proto_find(PF_INET, inside->ip.protocol);
+
        dataoff = skb->nh.iph->ihl*4 + sizeof(inside->icmp);
        /* Are they talking about one of our connections? */
        if (!nf_ct_get_tuple(skb, dataoff, dataoff + inside->ip.ihl*4, PF_INET,
@@ -181,9 +182,9 @@ icmp_error_message(struct sk_buff *skb,
                return -NF_ACCEPT;
        }
 
-        /* Ordinarily, we'd expect the inverted tupleproto, but it's
-           been preserved inside the ICMP. */
-        if (!nf_ct_invert_tuple(&innertuple, &origtuple,
+       /* Ordinarily, we'd expect the inverted tupleproto, but it's
+          been preserved inside the ICMP. */
+       if (!nf_ct_invert_tuple(&innertuple, &origtuple,
                                &nf_conntrack_l3proto_ipv4, innerproto)) {
                DEBUGP("icmp_error_message: no match\n");
                return -NF_ACCEPT;
@@ -212,10 +213,10 @@ icmp_error_message(struct sk_buff *skb,
                        *ctinfo += IP_CT_IS_REPLY;
        }
 
-        /* Update skb to refer to this connection */
-        skb->nfct = &nf_ct_tuplehash_to_ctrack(h)->ct_general;
-        skb->nfctinfo = *ctinfo;
-        return -NF_ACCEPT;
+       /* Update skb to refer to this connection */
+       skb->nfct = &nf_ct_tuplehash_to_ctrack(h)->ct_general;
+       skb->nfctinfo = *ctinfo;
+       return -NF_ACCEPT;
 }
 
 /* Small and modified version of icmp_rcv */
@@ -306,7 +307,7 @@ static int icmp_nfattr_to_tuple(struct nfattr *tb[],
        if (nfattr_bad_size(tb, CTA_PROTO_MAX, cta_min_proto))
                return -EINVAL;
 
-       tuple->dst.u.icmp.type = 
+       tuple->dst.u.icmp.type =
                        *(u_int8_t *)NFA_DATA(tb[CTA_PROTO_ICMP_TYPE-1]);
        tuple->dst.u.icmp.code =
                        *(u_int8_t *)NFA_DATA(tb[CTA_PROTO_ICMP_CODE-1]);
@@ -332,7 +333,7 @@ static struct ctl_table icmp_sysctl_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_dointvec_jiffies,
        },
-        {
+       {
                .ctl_name = 0
        }
 };
@@ -346,7 +347,7 @@ static struct ctl_table icmp_compat_sysctl_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_dointvec_jiffies,
        },
-        {
+       {
                .ctl_name = 0
        }
 };
index 998b2557692ca6d65e73800ead317b8d9377ad09..2c01378d35924fb3bfddbebce591a01a7d8502ed 100644 (file)
@@ -53,7 +53,7 @@ static struct nf_nat_protocol *nf_nat_protos[MAX_IP_NAT_PROTO];
 static inline struct nf_nat_protocol *
 __nf_nat_proto_find(u_int8_t protonum)
 {
-       return nf_nat_protos[protonum];
+       return rcu_dereference(nf_nat_protos[protonum]);
 }
 
 struct nf_nat_protocol *
@@ -61,13 +61,11 @@ nf_nat_proto_find_get(u_int8_t protonum)
 {
        struct nf_nat_protocol *p;
 
-       /* we need to disable preemption to make sure 'p' doesn't get
-        * removed until we've grabbed the reference */
-       preempt_disable();
+       rcu_read_lock();
        p = __nf_nat_proto_find(protonum);
        if (!try_module_get(p->me))
                p = &nf_nat_unknown_protocol;
-       preempt_enable();
+       rcu_read_unlock();
 
        return p;
 }
@@ -126,8 +124,8 @@ in_range(const struct nf_conntrack_tuple *tuple,
         const struct nf_nat_range *range)
 {
        struct nf_nat_protocol *proto;
+       int ret = 0;
 
-       proto = __nf_nat_proto_find(tuple->dst.protonum);
        /* If we are supposed to map IPs, then we must be in the
           range specified, otherwise let this drag us onto a new src IP. */
        if (range->flags & IP_NAT_RANGE_MAP_IPS) {
@@ -136,12 +134,15 @@ in_range(const struct nf_conntrack_tuple *tuple,
                        return 0;
        }
 
+       rcu_read_lock();
+       proto = __nf_nat_proto_find(tuple->dst.protonum);
        if (!(range->flags & IP_NAT_RANGE_PROTO_SPECIFIED) ||
            proto->in_range(tuple, IP_NAT_MANIP_SRC,
                            &range->min, &range->max))
-               return 1;
+               ret = 1;
+       rcu_read_unlock();
 
-       return 0;
+       return ret;
 }
 
 static inline int
@@ -268,27 +269,25 @@ get_unique_tuple(struct nf_conntrack_tuple *tuple,
        /* 3) The per-protocol part of the manip is made to map into
           the range to make a unique tuple. */
 
-       proto = nf_nat_proto_find_get(orig_tuple->dst.protonum);
+       rcu_read_lock();
+       proto = __nf_nat_proto_find(orig_tuple->dst.protonum);
 
        /* Change protocol info to have some randomization */
        if (range->flags & IP_NAT_RANGE_PROTO_RANDOM) {
                proto->unique_tuple(tuple, range, maniptype, ct);
-               nf_nat_proto_put(proto);
-               return;
+               goto out;
        }
 
        /* Only bother mapping if it's not already in range and unique */
        if ((!(range->flags & IP_NAT_RANGE_PROTO_SPECIFIED) ||
             proto->in_range(tuple, maniptype, &range->min, &range->max)) &&
-           !nf_nat_used_tuple(tuple, ct)) {
-               nf_nat_proto_put(proto);
-               return;
-       }
+           !nf_nat_used_tuple(tuple, ct))
+               goto out;
 
        /* Last change: get protocol to try to obtain unique tuple. */
        proto->unique_tuple(tuple, range, maniptype, ct);
-
-       nf_nat_proto_put(proto);
+out:
+       rcu_read_unlock();
 }
 
 unsigned int
@@ -369,12 +368,11 @@ manip_pkt(u_int16_t proto,
        iph = (void *)(*pskb)->data + iphdroff;
 
        /* Manipulate protcol part. */
-       p = nf_nat_proto_find_get(proto);
-       if (!p->manip_pkt(pskb, iphdroff, target, maniptype)) {
-               nf_nat_proto_put(p);
+
+       /* rcu_read_lock()ed by nf_hook_slow */
+       p = __nf_nat_proto_find(proto);
+       if (!p->manip_pkt(pskb, iphdroff, target, maniptype))
                return 0;
-       }
-       nf_nat_proto_put(p);
 
        iph = (void *)(*pskb)->data + iphdroff;
 
@@ -431,6 +429,7 @@ int nf_nat_icmp_reply_translation(struct nf_conn *ct,
                struct icmphdr icmp;
                struct iphdr ip;
        } *inside;
+       struct nf_conntrack_l4proto *l4proto;
        struct nf_conntrack_tuple inner, target;
        int hdrlen = (*pskb)->nh.iph->ihl * 4;
        enum ip_conntrack_dir dir = CTINFO2DIR(ctinfo);
@@ -452,8 +451,8 @@ int nf_nat_icmp_reply_translation(struct nf_conn *ct,
                     (*pskb)->nfctinfo == IP_CT_RELATED+IP_CT_IS_REPLY);
 
        /* Redirects on non-null nats must be dropped, else they'll
-           start talking to each other without our translation, and be
-           confused... --RR */
+          start talking to each other without our translation, and be
+          confused... --RR */
        if (inside->icmp.type == ICMP_REDIRECT) {
                /* If NAT isn't finished, assume it and drop. */
                if ((ct->status & IPS_NAT_DONE_MASK) != IPS_NAT_DONE_MASK)
@@ -466,16 +465,16 @@ int nf_nat_icmp_reply_translation(struct nf_conn *ct,
        DEBUGP("icmp_reply_translation: translating error %p manp %u dir %s\n",
               *pskb, manip, dir == IP_CT_DIR_ORIGINAL ? "ORIG" : "REPLY");
 
+       /* rcu_read_lock()ed by nf_hook_slow */
+       l4proto = __nf_ct_l4proto_find(PF_INET, inside->ip.protocol);
+
        if (!nf_ct_get_tuple(*pskb,
                             (*pskb)->nh.iph->ihl*4 + sizeof(struct icmphdr),
                             (*pskb)->nh.iph->ihl*4 +
-                            sizeof(struct icmphdr) + inside->ip.ihl*4,
-                            (u_int16_t)AF_INET,
-                            inside->ip.protocol,
-                            &inner,
-                            l3proto,
-                            __nf_ct_l4proto_find((u_int16_t)PF_INET,
-                                                 inside->ip.protocol)))
+                            sizeof(struct icmphdr) + inside->ip.ihl*4,
+                            (u_int16_t)AF_INET,
+                            inside->ip.protocol,
+                            &inner, l3proto, l4proto))
                return 0;
 
        /* Change inner back to look like incoming packet.  We do the
@@ -529,7 +528,7 @@ int nf_nat_protocol_register(struct nf_nat_protocol *proto)
                ret = -EBUSY;
                goto out;
        }
-       nf_nat_protos[proto->protonum] = proto;
+       rcu_assign_pointer(nf_nat_protos[proto->protonum], proto);
  out:
        write_unlock_bh(&nf_nat_lock);
        return ret;
@@ -540,11 +539,10 @@ EXPORT_SYMBOL(nf_nat_protocol_register);
 void nf_nat_protocol_unregister(struct nf_nat_protocol *proto)
 {
        write_lock_bh(&nf_nat_lock);
-       nf_nat_protos[proto->protonum] = &nf_nat_unknown_protocol;
+       rcu_assign_pointer(nf_nat_protos[proto->protonum],
+                          &nf_nat_unknown_protocol);
        write_unlock_bh(&nf_nat_lock);
-
-       /* Someone could be still looking at the proto in a bh. */
-       synchronize_net();
+       synchronize_rcu();
 }
 EXPORT_SYMBOL(nf_nat_protocol_unregister);
 
@@ -608,10 +606,10 @@ static int __init nf_nat_init(void)
        /* Sew in builtin protocols. */
        write_lock_bh(&nf_nat_lock);
        for (i = 0; i < MAX_IP_NAT_PROTO; i++)
-               nf_nat_protos[i] = &nf_nat_unknown_protocol;
-       nf_nat_protos[IPPROTO_TCP] = &nf_nat_protocol_tcp;
-       nf_nat_protos[IPPROTO_UDP] = &nf_nat_protocol_udp;
-       nf_nat_protos[IPPROTO_ICMP] = &nf_nat_protocol_icmp;
+               rcu_assign_pointer(nf_nat_protos[i], &nf_nat_unknown_protocol);
+       rcu_assign_pointer(nf_nat_protos[IPPROTO_TCP], &nf_nat_protocol_tcp);
+       rcu_assign_pointer(nf_nat_protos[IPPROTO_UDP], &nf_nat_protocol_udp);
+       rcu_assign_pointer(nf_nat_protos[IPPROTO_ICMP], &nf_nat_protocol_icmp);
        write_unlock_bh(&nf_nat_lock);
 
        for (i = 0; i < nf_nat_htable_size; i++) {
@@ -619,8 +617,8 @@ static int __init nf_nat_init(void)
        }
 
        /* FIXME: Man, this is a hack.  <SIGH> */
-       NF_CT_ASSERT(nf_conntrack_destroyed == NULL);
-       nf_conntrack_destroyed = &nf_nat_cleanup_conntrack;
+       NF_CT_ASSERT(rcu_dereference(nf_conntrack_destroyed) == NULL);
+       rcu_assign_pointer(nf_conntrack_destroyed, nf_nat_cleanup_conntrack);
 
        /* Initialize fake conntrack so that NAT will skip it */
        nf_conntrack_untracked.status |= IPS_NAT_DONE_MASK;
@@ -644,7 +642,8 @@ static int clean_nat(struct nf_conn *i, void *data)
 static void __exit nf_nat_cleanup(void)
 {
        nf_ct_iterate_cleanup(&clean_nat, NULL);
-       nf_conntrack_destroyed = NULL;
+       rcu_assign_pointer(nf_conntrack_destroyed, NULL);
+       synchronize_rcu();
        vfree(bysource);
        nf_ct_l3proto_put(l3proto);
 }
index fb9ab0114c2380f32c2abee0c6a12a531657aa98..9cbf3f9be13b050ef013d1e9d60313f34630ce1b 100644 (file)
@@ -256,7 +256,7 @@ static int nat_rtp_rtcp(struct sk_buff **pskb, struct nf_conn *ct,
        if (set_h245_addr(pskb, data, dataoff, taddr,
                          &ct->tuplehash[!dir].tuple.dst.u3,
                          htons((port & htons(1)) ? nated_port + 1 :
-                                                   nated_port)) == 0) {
+                                                   nated_port)) == 0) {
                /* Save ports */
                info->rtp_port[i][dir] = rtp_port;
                info->rtp_port[i][!dir] = htons(nated_port);
index dc6738bdfab786fc5e49208062135c984a249d2d..49a90c39ffce888de7c0bd664a70a9e279619b83 100644 (file)
@@ -179,7 +179,7 @@ nf_nat_mangle_tcp_packet(struct sk_buff **pskb,
                tcph->check = tcp_v4_check(datalen,
                                           iph->saddr, iph->daddr,
                                           csum_partial((char *)tcph,
-                                                       datalen, 0));
+                                                       datalen, 0));
        } else
                nf_proto_csum_replace2(&tcph->check, *pskb,
                                       htons(oldlen), htons(datalen), 1);
@@ -223,7 +223,7 @@ nf_nat_mangle_udp_packet(struct sk_buff **pskb,
        /* UDP helpers might accidentally mangle the wrong packet */
        iph = (*pskb)->nh.iph;
        if ((*pskb)->len < iph->ihl*4 + sizeof(*udph) +
-                              match_offset + match_len)
+                              match_offset + match_len)
                return 0;
 
        if (!skb_make_writable(pskb, (*pskb)->len))
@@ -252,9 +252,9 @@ nf_nat_mangle_udp_packet(struct sk_buff **pskb,
        if ((*pskb)->ip_summed != CHECKSUM_PARTIAL) {
                udph->check = 0;
                udph->check = csum_tcpudp_magic(iph->saddr, iph->daddr,
-                                               datalen, IPPROTO_UDP,
-                                               csum_partial((char *)udph,
-                                                            datalen, 0));
+                                               datalen, IPPROTO_UDP,
+                                               csum_partial((char *)udph,
+                                                            datalen, 0));
                if (!udph->check)
                        udph->check = CSUM_MANGLED_0;
        } else
index 5df4fcae3ab68673c903804a906efc122fbcdb4f..7ba341c22eaabd440a72f6d6fe6056652c9237c3 100644 (file)
@@ -184,10 +184,10 @@ pptp_outbound_pkt(struct sk_buff **pskb,
 
        /* mangle packet */
        if (nf_nat_mangle_tcp_packet(pskb, ct, ctinfo,
-                                    cid_off + sizeof(struct pptp_pkt_hdr) +
-                                    sizeof(struct PptpControlHeader),
-                                    sizeof(new_callid), (char *)&new_callid,
-                                    sizeof(new_callid)) == 0)
+                                    cid_off + sizeof(struct pptp_pkt_hdr) +
+                                    sizeof(struct PptpControlHeader),
+                                    sizeof(new_callid), (char *)&new_callid,
+                                    sizeof(new_callid)) == 0)
                return NF_DROP;
        return NF_ACCEPT;
 }
@@ -276,7 +276,7 @@ pptp_inbound_pkt(struct sk_buff **pskb,
                ntohs(REQ_CID(pptpReq, pcid_off)), ntohs(new_pcid));
 
        if (nf_nat_mangle_tcp_packet(pskb, ct, ctinfo,
-                                    pcid_off + sizeof(struct pptp_pkt_hdr) +
+                                    pcid_off + sizeof(struct pptp_pkt_hdr) +
                                     sizeof(struct PptpControlHeader),
                                     sizeof(new_pcid), (char *)&new_pcid,
                                     sizeof(new_pcid)) == 0)
index dcfd772972d77cebb01729dafdd2ad4cbf58a657..6bc2f06de055952d6bad47434e860620cc0a8fd2 100644 (file)
@@ -44,7 +44,7 @@ icmp_unique_tuple(struct nf_conntrack_tuple *tuple,
 
        for (i = 0; i < range_size; i++, id++) {
                tuple->src.u.icmp.id = htons(ntohs(range->min.icmp.id) +
-                                            (id % range_size));
+                                            (id % range_size));
                if (!nf_nat_used_tuple(tuple, ct))
                        return 1;
        }
index 7f95b4e2eb313f9e46bd1ade33689df03dcfa537..147a4370cf03e43f744600c5c3773454b54b5e68 100644 (file)
@@ -56,8 +56,8 @@ static struct
                /* PRE_ROUTING */
                {
                        .entry = {
-                               .target_offset = sizeof(struct ipt_entry),
-                               .next_offset = sizeof(struct ipt_standard),
+                               .target_offset = sizeof(struct ipt_entry),
+                               .next_offset = sizeof(struct ipt_standard),
                        },
                        .target = {
                                .target = {
@@ -71,8 +71,8 @@ static struct
                /* POST_ROUTING */
                {
                        .entry = {
-                               .target_offset = sizeof(struct ipt_entry),
-                               .next_offset = sizeof(struct ipt_standard),
+                               .target_offset = sizeof(struct ipt_entry),
+                               .next_offset = sizeof(struct ipt_standard),
                        },
                        .target = {
                                .target = {
@@ -86,8 +86,8 @@ static struct
                /* LOCAL_OUT */
                {
                        .entry = {
-                               .target_offset = sizeof(struct ipt_entry),
-                               .next_offset = sizeof(struct ipt_standard),
+                               .target_offset = sizeof(struct ipt_entry),
+                               .next_offset = sizeof(struct ipt_standard),
                        },
                        .target = {
                                .target = {
@@ -145,7 +145,7 @@ static unsigned int ipt_snat_target(struct sk_buff **pskb,
 
        /* Connection must be valid and new. */
        NF_CT_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_RELATED ||
-                           ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY));
+                           ctinfo == IP_CT_RELATED + IP_CT_IS_REPLY));
        NF_CT_ASSERT(out);
 
        return nf_nat_setup_info(ct, &mr->range[0], hooknum);
@@ -256,8 +256,8 @@ alloc_null_binding(struct nf_conn *ct,
 
 unsigned int
 alloc_null_binding_confirmed(struct nf_conn *ct,
-                             struct nf_nat_info *info,
-                             unsigned int hooknum)
+                            struct nf_nat_info *info,
+                            unsigned int hooknum)
 {
        __be32 ip
                = (HOOK2MANIP(hooknum) == IP_NAT_MANIP_SRC
index 3d524b957310b5e2e953d6187e8e69c8d0e78ddf..b12cd7c314caadefd43ea9e2f7842bb02fb07b28 100644 (file)
@@ -90,7 +90,7 @@ static int map_sip_addr(struct sk_buff **pskb, enum ip_conntrack_info ctinfo,
                return 1;
 
        if (!nf_nat_mangle_udp_packet(pskb, ct, ctinfo,
-                                     matchoff, matchlen, addr, addrlen))
+                                     matchoff, matchlen, addr, addrlen))
                return 0;
        *dptr = (*pskb)->data + (*pskb)->nh.iph->ihl*4 + sizeof(struct udphdr);
        return 1;
@@ -151,7 +151,7 @@ static unsigned int mangle_sip_packet(struct sk_buff **pskb,
                return 0;
 
        if (!nf_nat_mangle_udp_packet(pskb, ct, ctinfo,
-                                     matchoff, matchlen, buffer, bufflen))
+                                     matchoff, matchlen, buffer, bufflen))
                return 0;
 
        /* We need to reload this. Thanks Patrick. */
@@ -172,7 +172,7 @@ static int mangle_content_len(struct sk_buff **pskb,
 
        /* Get actual SDP lenght */
        if (ct_sip_get_info(ct, dptr, (*pskb)->len - dataoff, &matchoff,
-                           &matchlen, POS_SDP_HEADER) > 0) {
+                           &matchlen, POS_SDP_HEADER) > 0) {
 
                /* since ct_sip_get_info() give us a pointer passing 'v='
                   we need to add 2 bytes in this count. */
@@ -180,7 +180,7 @@ static int mangle_content_len(struct sk_buff **pskb,
 
                /* Now, update SDP length */
                if (ct_sip_get_info(ct, dptr, (*pskb)->len - dataoff, &matchoff,
-                                   &matchlen, POS_CONTENT) > 0) {
+                                   &matchlen, POS_CONTENT) > 0) {
 
                        bufflen = sprintf(buffer, "%u", c_len);
                        return nf_nat_mangle_udp_packet(pskb, ct, ctinfo,
@@ -205,17 +205,17 @@ static unsigned int mangle_sdp(struct sk_buff **pskb,
        /* Mangle owner and contact info. */
        bufflen = sprintf(buffer, "%u.%u.%u.%u", NIPQUAD(newip));
        if (!mangle_sip_packet(pskb, ctinfo, ct, &dptr, (*pskb)->len - dataoff,
-                              buffer, bufflen, POS_OWNER_IP4))
+                              buffer, bufflen, POS_OWNER_IP4))
                return 0;
 
        if (!mangle_sip_packet(pskb, ctinfo, ct, &dptr, (*pskb)->len - dataoff,
-                              buffer, bufflen, POS_CONNECTION_IP4))
+                              buffer, bufflen, POS_CONNECTION_IP4))
                return 0;
 
        /* Mangle media port. */
        bufflen = sprintf(buffer, "%u", port);
        if (!mangle_sip_packet(pskb, ctinfo, ct, &dptr, (*pskb)->len - dataoff,
-                              buffer, bufflen, POS_MEDIA))
+                              buffer, bufflen, POS_MEDIA))
                return 0;
 
        return mangle_content_len(pskb, ctinfo, ct, dptr);
index f12528fe1bf9f14ac552984997da16b7eeec7e3f..ce5c4939a6ee240d764e3e593429dae1523edb8a 100644 (file)
@@ -150,8 +150,8 @@ struct asn1_octstr
 };
 
 static void asn1_open(struct asn1_ctx *ctx,
-                      unsigned char *buf,
-                      unsigned int len)
+                     unsigned char *buf,
+                     unsigned int len)
 {
        ctx->begin = buf;
        ctx->end = buf + len;
@@ -186,9 +186,9 @@ static unsigned char asn1_tag_decode(struct asn1_ctx *ctx, unsigned int *tag)
 }
 
 static unsigned char asn1_id_decode(struct asn1_ctx *ctx,
-                                    unsigned int *cls,
-                                    unsigned int *con,
-                                    unsigned int *tag)
+                                   unsigned int *cls,
+                                   unsigned int *con,
+                                   unsigned int *tag)
 {
        unsigned char ch;
 
@@ -207,8 +207,8 @@ static unsigned char asn1_id_decode(struct asn1_ctx *ctx,
 }
 
 static unsigned char asn1_length_decode(struct asn1_ctx *ctx,
-                                        unsigned int *def,
-                                        unsigned int *len)
+                                       unsigned int *def,
+                                       unsigned int *len)
 {
        unsigned char ch, cnt;
 
@@ -239,10 +239,10 @@ static unsigned char asn1_length_decode(struct asn1_ctx *ctx,
 }
 
 static unsigned char asn1_header_decode(struct asn1_ctx *ctx,
-                                        unsigned char **eoc,
-                                        unsigned int *cls,
-                                        unsigned int *con,
-                                        unsigned int *tag)
+                                       unsigned char **eoc,
+                                       unsigned int *cls,
+                                       unsigned int *con,
+                                       unsigned int *tag)
 {
        unsigned int def, len;
 
@@ -297,8 +297,8 @@ static unsigned char asn1_null_decode(struct asn1_ctx *ctx, unsigned char *eoc)
 }
 
 static unsigned char asn1_long_decode(struct asn1_ctx *ctx,
-                                      unsigned char *eoc,
-                                      long *integer)
+                                     unsigned char *eoc,
+                                     long *integer)
 {
        unsigned char ch;
        unsigned int  len;
@@ -325,8 +325,8 @@ static unsigned char asn1_long_decode(struct asn1_ctx *ctx,
 }
 
 static unsigned char asn1_uint_decode(struct asn1_ctx *ctx,
-                                      unsigned char *eoc,
-                                      unsigned int *integer)
+                                     unsigned char *eoc,
+                                     unsigned int *integer)
 {
        unsigned char ch;
        unsigned int  len;
@@ -354,8 +354,8 @@ static unsigned char asn1_uint_decode(struct asn1_ctx *ctx,
 }
 
 static unsigned char asn1_ulong_decode(struct asn1_ctx *ctx,
-                                       unsigned char *eoc,
-                                       unsigned long *integer)
+                                      unsigned char *eoc,
+                                      unsigned long *integer)
 {
        unsigned char ch;
        unsigned int  len;
@@ -383,9 +383,9 @@ static unsigned char asn1_ulong_decode(struct asn1_ctx *ctx,
 }
 
 static unsigned char asn1_octets_decode(struct asn1_ctx *ctx,
-                                        unsigned char *eoc,
-                                        unsigned char **octets,
-                                        unsigned int *len)
+                                       unsigned char *eoc,
+                                       unsigned char **octets,
+                                       unsigned int *len)
 {
        unsigned char *ptr;
 
@@ -411,7 +411,7 @@ static unsigned char asn1_octets_decode(struct asn1_ctx *ctx,
 }
 
 static unsigned char asn1_subid_decode(struct asn1_ctx *ctx,
-                                       unsigned long *subid)
+                                      unsigned long *subid)
 {
        unsigned char ch;
 
@@ -428,9 +428,9 @@ static unsigned char asn1_subid_decode(struct asn1_ctx *ctx,
 }
 
 static unsigned char asn1_oid_decode(struct asn1_ctx *ctx,
-                                     unsigned char *eoc,
-                                     unsigned long **oid,
-                                     unsigned int *len)
+                                    unsigned char *eoc,
+                                    unsigned long **oid,
+                                    unsigned int *len)
 {
        unsigned long subid;
        unsigned int  size;
@@ -611,9 +611,9 @@ struct snmp_v1_trap
 #define SERR_EOM    2
 
 static inline void mangle_address(unsigned char *begin,
-                                  unsigned char *addr,
-                                  const struct oct1_map *map,
-                                  __sum16 *check);
+                                 unsigned char *addr,
+                                 const struct oct1_map *map,
+                                 __sum16 *check);
 struct snmp_cnv
 {
        unsigned int class;
@@ -644,8 +644,8 @@ static struct snmp_cnv snmp_conv [] =
 };
 
 static unsigned char snmp_tag_cls2syntax(unsigned int tag,
-                                         unsigned int cls,
-                                         unsigned short *syntax)
+                                        unsigned int cls,
+                                        unsigned short *syntax)
 {
        struct snmp_cnv *cnv;
 
@@ -662,7 +662,7 @@ static unsigned char snmp_tag_cls2syntax(unsigned int tag,
 }
 
 static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
-                                        struct snmp_object **obj)
+                                       struct snmp_object **obj)
 {
        unsigned int cls, con, tag, len, idlen;
        unsigned short type;
@@ -714,7 +714,7 @@ static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
                                return 0;
                        }
                        *obj = kmalloc(sizeof(struct snmp_object) + len,
-                                      GFP_ATOMIC);
+                                      GFP_ATOMIC);
                        if (*obj == NULL) {
                                kfree(id);
                                if (net_ratelimit())
@@ -730,7 +730,7 @@ static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
                                return 0;
                        }
                        *obj = kmalloc(sizeof(struct snmp_object) + len,
-                                      GFP_ATOMIC);
+                                      GFP_ATOMIC);
                        if (*obj == NULL) {
                                kfree(id);
                                if (net_ratelimit())
@@ -834,7 +834,7 @@ static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
 }
 
 static unsigned char snmp_request_decode(struct asn1_ctx *ctx,
-                                         struct snmp_request *request)
+                                        struct snmp_request *request)
 {
        unsigned int cls, con, tag;
        unsigned char *end;
@@ -874,9 +874,9 @@ static unsigned char snmp_request_decode(struct asn1_ctx *ctx,
  * code example in the draft.
  */
 static void fast_csum(__sum16 *csum,
-                      const unsigned char *optr,
-                      const unsigned char *nptr,
-                      int offset)
+                     const unsigned char *optr,
+                     const unsigned char *nptr,
+                     int offset)
 {
        unsigned char s[4];
 
@@ -899,9 +899,9 @@ static void fast_csum(__sum16 *csum,
  *      - addr points to the start of the address
  */
 static inline void mangle_address(unsigned char *begin,
-                                  unsigned char *addr,
-                                  const struct oct1_map *map,
-                                  __sum16 *check)
+                                 unsigned char *addr,
+                                 const struct oct1_map *map,
+                                 __sum16 *check)
 {
        if (map->from == NOCT1(addr)) {
                u_int32_t old;
@@ -914,7 +914,7 @@ static inline void mangle_address(unsigned char *begin,
                /* Update UDP checksum if being used */
                if (*check) {
                        fast_csum(check,
-                                 &map->from, &map->to, addr - begin);
+                                 &map->from, &map->to, addr - begin);
 
                }
 
@@ -925,9 +925,9 @@ static inline void mangle_address(unsigned char *begin,
 }
 
 static unsigned char snmp_trap_decode(struct asn1_ctx *ctx,
-                                      struct snmp_v1_trap *trap,
-                                      const struct oct1_map *map,
-                                      __sum16 *check)
+                                     struct snmp_v1_trap *trap,
+                                     const struct oct1_map *map,
+                                     __sum16 *check)
 {
        unsigned int cls, con, tag, len;
        unsigned char *end;
@@ -1019,9 +1019,9 @@ static void hex_dump(unsigned char *buf, size_t len)
  * (And this is the fucking 'basic' method).
  */
 static int snmp_parse_mangle(unsigned char *msg,
-                             u_int16_t len,
-                             const struct oct1_map *map,
-                             __sum16 *check)
+                            u_int16_t len,
+                            const struct oct1_map *map,
+                            __sum16 *check)
 {
        unsigned char *eoc, *end;
        unsigned int cls, con, tag, vers, pdutype;
@@ -1191,8 +1191,8 @@ static int snmp_parse_mangle(unsigned char *msg,
  * SNMP translation routine.
  */
 static int snmp_translate(struct nf_conn *ct,
-                          enum ip_conntrack_info ctinfo,
-                          struct sk_buff **pskb)
+                         enum ip_conntrack_info ctinfo,
+                         struct sk_buff **pskb)
 {
        struct iphdr *iph = (*pskb)->nh.iph;
        struct udphdr *udph = (struct udphdr *)((__be32 *)iph + iph->ihl);
@@ -1219,7 +1219,7 @@ static int snmp_translate(struct nf_conn *ct,
                return NF_ACCEPT;
 
        if (!snmp_parse_mangle((unsigned char *)udph + sizeof(struct udphdr),
-                              paylen, &map, &udph->check)) {
+                              paylen, &map, &udph->check)) {
                if (net_ratelimit())
                        printk(KERN_WARNING "bsalg: parser failed\n");
                return NF_DROP;
index 5a964a167c134ff8a8ed133c26bf762f35c0a574..e4d3ef17d45b610768f37e8fa2d026ee4eac6ba7 100644 (file)
@@ -96,8 +96,8 @@ nf_nat_fn(unsigned int hooknum,
           protocol. 8) --RR */
        if (!ct) {
                /* Exception: ICMP redirect to new connection (not in
-                   hash table yet).  We must not let this through, in
-                   case we're doing NAT to the same network. */
+                  hash table yet).  We must not let this through, in
+                  case we're doing NAT to the same network. */
                if ((*pskb)->nh.iph->protocol == IPPROTO_ICMP) {
                        struct icmphdr _hdr, *hp;
 
@@ -141,7 +141,7 @@ nf_nat_fn(unsigned int hooknum,
                        if (unlikely(nf_ct_is_confirmed(ct)))
                                /* NAT module was loaded late */
                                ret = alloc_null_binding_confirmed(ct, info,
-                                                                  hooknum);
+                                                                  hooknum);
                        else if (hooknum == NF_IP_LOCAL_IN)
                                /* LOCAL_IN hook doesn't have a chain!  */
                                ret = alloc_null_binding(ct, info, hooknum);
@@ -171,10 +171,10 @@ nf_nat_fn(unsigned int hooknum,
 
 static unsigned int
 nf_nat_in(unsigned int hooknum,
-          struct sk_buff **pskb,
-          const struct net_device *in,
-          const struct net_device *out,
-          int (*okfn)(struct sk_buff *))
+         struct sk_buff **pskb,
+         const struct net_device *in,
+         const struct net_device *out,
+         int (*okfn)(struct sk_buff *))
 {
        unsigned int ret;
        __be32 daddr = (*pskb)->nh.iph->daddr;
@@ -269,9 +269,9 @@ nf_nat_adjust(unsigned int hooknum,
 
        ct = nf_ct_get(*pskb, &ctinfo);
        if (ct && test_bit(IPS_SEQ_ADJUST_BIT, &ct->status)) {
-               DEBUGP("nf_nat_standalone: adjusting sequence number\n");
-               if (!nf_nat_seq_adjust(pskb, ct, ctinfo))
-                       return NF_DROP;
+               DEBUGP("nf_nat_standalone: adjusting sequence number\n");
+               if (!nf_nat_seq_adjust(pskb, ct, ctinfo))
+                       return NF_DROP;
        }
        return NF_ACCEPT;
 }
index cd873da54cbe5b5876abe933fa7287386e3d31cc..ae68a691e8cdc47b387721dcb9c1b88d716aa994 100644 (file)
@@ -79,7 +79,7 @@ static int sockstat_seq_open(struct inode *inode, struct file *file)
        return single_open(file, sockstat_seq_show, NULL);
 }
 
-static struct file_operations sockstat_seq_fops = {
+static const struct file_operations sockstat_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = sockstat_seq_open,
        .read    = seq_read,
@@ -266,7 +266,7 @@ static int snmp_seq_show(struct seq_file *seq, void *v)
 
        for (i = 0; snmp4_ipstats_list[i].name != NULL; i++)
                seq_printf(seq, " %lu",
-                          fold_field((void **) ip_statistics, 
+                          fold_field((void **) ip_statistics,
                                      snmp4_ipstats_list[i].entry));
 
        seq_puts(seq, "\nIcmp:");
@@ -276,7 +276,7 @@ static int snmp_seq_show(struct seq_file *seq, void *v)
        seq_puts(seq, "\nIcmp:");
        for (i = 0; snmp4_icmp_list[i].name != NULL; i++)
                seq_printf(seq, " %lu",
-                          fold_field((void **) icmp_statistics, 
+                          fold_field((void **) icmp_statistics,
                                      snmp4_icmp_list[i].entry));
 
        seq_puts(seq, "\nTcp:");
@@ -288,7 +288,7 @@ static int snmp_seq_show(struct seq_file *seq, void *v)
                /* MaxConn field is signed, RFC 2012 */
                if (snmp4_tcp_list[i].entry == TCP_MIB_MAXCONN)
                        seq_printf(seq, " %ld",
-                                  fold_field((void **) tcp_statistics, 
+                                  fold_field((void **) tcp_statistics,
                                              snmp4_tcp_list[i].entry));
                else
                        seq_printf(seq, " %lu",
@@ -303,7 +303,7 @@ static int snmp_seq_show(struct seq_file *seq, void *v)
        seq_puts(seq, "\nUdp:");
        for (i = 0; snmp4_udp_list[i].name != NULL; i++)
                seq_printf(seq, " %lu",
-                          fold_field((void **) udp_statistics, 
+                          fold_field((void **) udp_statistics,
                                      snmp4_udp_list[i].entry));
 
        /* the UDP and UDP-Lite MIBs are the same */
@@ -326,7 +326,7 @@ static int snmp_seq_open(struct inode *inode, struct file *file)
        return single_open(file, snmp_seq_show, NULL);
 }
 
-static struct file_operations snmp_seq_fops = {
+static const struct file_operations snmp_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = snmp_seq_open,
        .read    = seq_read,
@@ -348,7 +348,7 @@ static int netstat_seq_show(struct seq_file *seq, void *v)
        seq_puts(seq, "\nTcpExt:");
        for (i = 0; snmp4_net_list[i].name != NULL; i++)
                seq_printf(seq, " %lu",
-                          fold_field((void **) net_statistics, 
+                          fold_field((void **) net_statistics,
                                      snmp4_net_list[i].entry));
 
        seq_putc(seq, '\n');
@@ -360,7 +360,7 @@ static int netstat_seq_open(struct inode *inode, struct file *file)
        return single_open(file, netstat_seq_show, NULL);
 }
 
-static struct file_operations netstat_seq_fops = {
+static const struct file_operations netstat_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = netstat_seq_open,
        .read    = seq_read,
index 05f5114828eaf04d0393dda48038ed1c536639b6..da70fef82c93f11c8caa2168eca6f5793eb85cb0 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/socket.h>
 #include <linux/in.h>
@@ -74,7 +73,7 @@ int inet_add_protocol(struct net_protocol *prot, unsigned char protocol)
 /*
  *     Remove a protocol from the hash tables.
  */
+
 int inet_del_protocol(struct net_protocol *prot, unsigned char protocol)
 {
        int hash, ret;
index fed6a1e7af9e0aab861e4dddac537b7e8a19c561..87e9c1618100f4798c8f39cd56a0b32919cccbbf 100644 (file)
@@ -95,7 +95,7 @@ static void raw_v4_hash(struct sock *sk)
 
 static void raw_v4_unhash(struct sock *sk)
 {
-       write_lock_bh(&raw_v4_lock);
+       write_lock_bh(&raw_v4_lock);
        if (sk_del_node_init(sk))
                sock_prot_dec_use(sk->sk_prot);
        write_unlock_bh(&raw_v4_lock);
@@ -238,7 +238,7 @@ void raw_err (struct sock *sk, struct sk_buff *skb, u32 info)
 static int raw_rcv_skb(struct sock * sk, struct sk_buff * skb)
 {
        /* Charge it to the socket. */
-       
+
        if (sock_queue_rcv_skb(sk, skb) < 0) {
                /* FIXME: increment a raw drops counter here */
                kfree_skb(skb);
@@ -263,7 +263,7 @@ int raw_rcv(struct sock *sk, struct sk_buff *skb)
 }
 
 static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,
-                       struct rtable *rt, 
+                       struct rtable *rt,
                        unsigned int flags)
 {
        struct inet_sock *inet = inet_sk(sk);
@@ -285,7 +285,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,
        skb = sock_alloc_send_skb(sk, length+hh_len+15,
                                  flags&MSG_DONTWAIT, &err);
        if (skb == NULL)
-               goto error; 
+               goto error;
        skb_reserve(skb, hh_len);
 
        skb->priority = sk->sk_priority;
@@ -326,7 +326,7 @@ error_fault:
        kfree_skb(skb);
 error:
        IP_INC_STATS(IPSTATS_MIB_OUTDISCARDS);
-       return err; 
+       return err;
 }
 
 static int raw_probe_proto_opt(struct flowi *fl, struct msghdr *msg)
@@ -399,9 +399,9 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
        err = -EOPNOTSUPP;
        if (msg->msg_flags & MSG_OOB)   /* Mirror BSD error message */
                goto out;               /* compatibility */
-                        
+
        /*
-        *      Get and verify the address. 
+        *      Get and verify the address.
         */
 
        if (msg->msg_namelen) {
@@ -426,7 +426,7 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                 */
        } else {
                err = -EDESTADDRREQ;
-               if (sk->sk_state != TCP_ESTABLISHED) 
+               if (sk->sk_state != TCP_ESTABLISHED)
                        goto out;
                daddr = inet->daddr;
        }
@@ -480,7 +480,7 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                                                .saddr = saddr,
                                                .tos = tos } },
                                    .proto = inet->hdrincl ? IPPROTO_RAW :
-                                                            sk->sk_protocol,
+                                                            sk->sk_protocol,
                                  };
                if (!inet->hdrincl) {
                        err = raw_probe_proto_opt(&fl, msg);
@@ -503,9 +503,9 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
 back_from_confirm:
 
        if (inet->hdrincl)
-               err = raw_send_hdrinc(sk, msg->msg_iov, len, 
+               err = raw_send_hdrinc(sk, msg->msg_iov, len,
                                        rt, msg->msg_flags);
-       
+
         else {
                if (!ipc.addr)
                        ipc.addr = rt->rt_dst;
@@ -538,7 +538,7 @@ do_confirm:
 
 static void raw_close(struct sock *sk, long timeout)
 {
-        /*
+       /*
         * Raw sockets may have direct kernel refereneces. Kill them.
         */
        ip_ra_control(sk, 0, NULL);
@@ -861,7 +861,7 @@ static __inline__ char *get_raw_sock(struct sock *sp, char *tmpbuf, int i)
 
        sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X"
                " %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p",
-               i, src, srcp, dest, destp, sp->sk_state, 
+               i, src, srcp, dest, destp, sp->sk_state,
                atomic_read(&sp->sk_wmem_alloc),
                atomic_read(&sp->sk_rmem_alloc),
                0, 0L, 0, sock_i_uid(sp), 0, sock_i_ino(sp),
@@ -916,7 +916,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations raw_seq_fops = {
+static const struct file_operations raw_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = raw_seq_open,
        .read    = seq_read,
index baee304a3cb76127affa65fca0a4898c7028de1f..37e0d4d5cf94e85bc28248ab054266afbe1ecc98 100644 (file)
@@ -20,7 +20,7 @@
  *             (rco@di.uminho.pt)      Routing table insertion and update
  *             Linus Torvalds  :       Rewrote bits to be sensible
  *             Alan Cox        :       Added BSD route gw semantics
- *             Alan Cox        :       Super /proc >4K 
+ *             Alan Cox        :       Super /proc >4K
  *             Alan Cox        :       MTU in route table
  *             Alan Cox        :       MSS actually. Also added the window
  *                                     clamper.
@@ -38,7 +38,7 @@
  *             Alan Cox        :       Faster /proc handling
  *     Alexey Kuznetsov        :       Massive rework to support tree based routing,
  *                                     routing caches and better behaviour.
- *             
+ *
  *             Olaf Erb        :       irtt wasn't being copied right.
  *             Bjorn Ekwall    :       Kerneld route support.
  *             Alan Cox        :       Multicast fixed (I hope)
@@ -70,7 +70,6 @@
 #include <linux/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/bootmem.h>
 #include <linux/string.h>
@@ -289,7 +288,7 @@ static struct rtable *rt_cache_get_next(struct seq_file *seq, struct rtable *r)
 {
        struct rt_cache_iter_state *st = rcu_dereference(seq->private);
 
-       r = r->u.rt_next;
+       r = r->u.dst.rt_next;
        while (!r) {
                rcu_read_unlock_bh();
                if (--st->bucket < 0)
@@ -361,8 +360,8 @@ static int rt_cache_seq_show(struct seq_file *seq, void *v)
                                       dev_queue_xmit) : 0,
                        r->rt_spec_dst);
                seq_printf(seq, "%-127s\n", temp);
-        }
-       return 0;
+       }
+       return 0;
 }
 
 static struct seq_operations rt_cache_seq_ops = {
@@ -393,7 +392,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations rt_cache_seq_fops = {
+static const struct file_operations rt_cache_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = rt_cache_seq_open,
        .read    = seq_read,
@@ -429,7 +428,7 @@ static void *rt_cpu_seq_next(struct seq_file *seq, void *v, loff_t *pos)
                return &per_cpu(rt_cache_stat, cpu);
        }
        return NULL;
-       
+
 }
 
 static void rt_cpu_seq_stop(struct seq_file *seq, void *v)
@@ -445,7 +444,7 @@ static int rt_cpu_seq_show(struct seq_file *seq, void *v)
                seq_printf(seq, "entries  in_hit in_slow_tot in_slow_mc in_no_route in_brd in_martian_dst in_martian_src  out_hit out_slow_tot out_slow_mc  gc_total gc_ignored gc_goal_miss gc_dst_overflow in_hlist_search out_hlist_search\n");
                return 0;
        }
-       
+
        seq_printf(seq,"%08x  %08x %08x %08x %08x %08x %08x %08x "
                   " %08x %08x %08x %08x %08x %08x %08x %08x %08x \n",
                   atomic_read(&ipv4_dst_ops.entries),
@@ -459,7 +458,7 @@ static int rt_cpu_seq_show(struct seq_file *seq, void *v)
 
                   st->out_hit,
                   st->out_slow_tot,
-                  st->out_slow_mc, 
+                  st->out_slow_mc,
 
                   st->gc_total,
                   st->gc_ignored,
@@ -484,7 +483,7 @@ static int rt_cpu_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &rt_cpu_seq_ops);
 }
 
-static struct file_operations rt_cpu_seq_fops = {
+static const struct file_operations rt_cpu_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = rt_cpu_seq_open,
        .read    = seq_read,
@@ -493,7 +492,7 @@ static struct file_operations rt_cpu_seq_fops = {
 };
 
 #endif /* CONFIG_PROC_FS */
-  
+
 static __inline__ void rt_free(struct rtable *rt)
 {
        multipath_remove(rt);
@@ -512,7 +511,7 @@ static __inline__ int rt_fast_clean(struct rtable *rth)
        /* Kill broadcast/multicast entries very aggresively, if they
           collide in hash table with more useful entries */
        return (rth->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST)) &&
-               rth->fl.iif && rth->u.rt_next;
+               rth->fl.iif && rth->u.dst.rt_next;
 }
 
 static __inline__ int rt_valuable(struct rtable *rth)
@@ -595,10 +594,10 @@ static struct rtable **rt_remove_balanced_route(struct rtable **chain_head,
                if (((*rthp)->u.dst.flags & DST_BALANCED) != 0  &&
                    compare_keys(&(*rthp)->fl, &expentry->fl)) {
                        if (*rthp == expentry) {
-                               *rthp = rth->u.rt_next;
+                               *rthp = rth->u.dst.rt_next;
                                continue;
                        } else {
-                               *rthp = rth->u.rt_next;
+                               *rthp = rth->u.dst.rt_next;
                                rt_free(rth);
                                if (removed_count)
                                        ++(*removed_count);
@@ -606,9 +605,9 @@ static struct rtable **rt_remove_balanced_route(struct rtable **chain_head,
                } else {
                        if (!((*rthp)->u.dst.flags & DST_BALANCED) &&
                            passedexpired && !nextstep)
-                               nextstep = &rth->u.rt_next;
+                               nextstep = &rth->u.dst.rt_next;
 
-                       rthp = &rth->u.rt_next;
+                       rthp = &rth->u.dst.rt_next;
                }
        }
 
@@ -649,12 +648,12 @@ static void rt_check_expire(unsigned long dummy)
                                /* Entry is expired even if it is in use */
                                if (time_before_eq(now, rth->u.dst.expires)) {
                                        tmo >>= 1;
-                                       rthp = &rth->u.rt_next;
+                                       rthp = &rth->u.dst.rt_next;
                                        continue;
                                }
                        } else if (!rt_may_expire(rth, tmo, ip_rt_gc_timeout)) {
                                tmo >>= 1;
-                               rthp = &rth->u.rt_next;
+                               rthp = &rth->u.dst.rt_next;
                                continue;
                        }
 
@@ -668,12 +667,12 @@ static void rt_check_expire(unsigned long dummy)
                                if (!rthp)
                                        break;
                        } else {
-                               *rthp = rth->u.rt_next;
+                               *rthp = rth->u.dst.rt_next;
                                rt_free(rth);
                        }
 #else /* CONFIG_IP_ROUTE_MULTIPATH_CACHED */
-                       *rthp = rth->u.rt_next;
-                       rt_free(rth);
+                       *rthp = rth->u.dst.rt_next;
+                       rt_free(rth);
 #endif /* CONFIG_IP_ROUTE_MULTIPATH_CACHED */
                }
                spin_unlock(rt_hash_lock_addr(i));
@@ -706,7 +705,7 @@ static void rt_run_flush(unsigned long dummy)
                spin_unlock_bh(rt_hash_lock_addr(i));
 
                for (; rth; rth = next) {
-                       next = rth->u.rt_next;
+                       next = rth->u.dst.rt_next;
                        rt_free(rth);
                }
        }
@@ -739,7 +738,7 @@ void rt_cache_flush(int delay)
 
                if (user_mode && tmo < ip_rt_max_delay-ip_rt_min_delay)
                        tmo = 0;
-               
+
                if (delay > tmo)
                        delay = tmo;
        }
@@ -840,7 +839,7 @@ static int rt_garbage_collect(void)
                        while ((rth = *rthp) != NULL) {
                                if (!rt_may_expire(rth, tmo, expire)) {
                                        tmo >>= 1;
-                                       rthp = &rth->u.rt_next;
+                                       rthp = &rth->u.dst.rt_next;
                                        continue;
                                }
 #ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED
@@ -858,12 +857,12 @@ static int rt_garbage_collect(void)
                                        if (!rthp)
                                                break;
                                } else {
-                                       *rthp = rth->u.rt_next;
+                                       *rthp = rth->u.dst.rt_next;
                                        rt_free(rth);
                                        goal--;
                                }
 #else /* CONFIG_IP_ROUTE_MULTIPATH_CACHED */
-                               *rthp = rth->u.rt_next;
+                               *rthp = rth->u.dst.rt_next;
                                rt_free(rth);
                                goal--;
 #endif /* CONFIG_IP_ROUTE_MULTIPATH_CACHED */
@@ -947,13 +946,13 @@ restart:
                if (compare_keys(&rth->fl, &rt->fl)) {
 #endif
                        /* Put it first */
-                       *rthp = rth->u.rt_next;
+                       *rthp = rth->u.dst.rt_next;
                        /*
                         * Since lookup is lockfree, the deletion
                         * must be visible to another weakly ordered CPU before
                         * the insertion at the start of the hash chain.
                         */
-                       rcu_assign_pointer(rth->u.rt_next,
+                       rcu_assign_pointer(rth->u.dst.rt_next,
                                           rt_hash_table[hash].chain);
                        /*
                         * Since lookup is lockfree, the update writes
@@ -983,7 +982,7 @@ restart:
 
                chain_length++;
 
-               rthp = &rth->u.rt_next;
+               rthp = &rth->u.dst.rt_next;
        }
 
        if (cand) {
@@ -994,7 +993,7 @@ restart:
                 * only 2 entries per bucket. We will see.
                 */
                if (chain_length > ip_rt_gc_elasticity) {
-                       *candp = cand->u.rt_next;
+                       *candp = cand->u.dst.rt_next;
                        rt_free(cand);
                }
        }
@@ -1034,13 +1033,13 @@ restart:
                }
        }
 
-       rt->u.rt_next = rt_hash_table[hash].chain;
+       rt->u.dst.rt_next = rt_hash_table[hash].chain;
 #if RT_CACHE_DEBUG >= 2
-       if (rt->u.rt_next) {
+       if (rt->u.dst.rt_next) {
                struct rtable *trt;
                printk(KERN_DEBUG "rt_cache @%02x: %u.%u.%u.%u", hash,
                       NIPQUAD(rt->rt_dst));
-               for (trt = rt->u.rt_next; trt; trt = trt->u.rt_next)
+               for (trt = rt->u.dst.rt_next; trt; trt = trt->u.dst.rt_next)
                        printk(" . %u.%u.%u.%u", NIPQUAD(trt->rt_dst));
                printk("\n");
        }
@@ -1104,7 +1103,7 @@ void __ip_select_ident(struct iphdr *iph, struct dst_entry *dst, int more)
                        return;
                }
        } else
-               printk(KERN_DEBUG "rt_bind_peer(0) @%p\n", 
+               printk(KERN_DEBUG "rt_bind_peer(0) @%p\n",
                       __builtin_return_address(0));
 
        ip_select_fb_ident(iph);
@@ -1117,9 +1116,9 @@ static void rt_del(unsigned hash, struct rtable *rt)
        spin_lock_bh(rt_hash_lock_addr(hash));
        ip_rt_put(rt);
        for (rthp = &rt_hash_table[hash].chain; *rthp;
-            rthp = &(*rthp)->u.rt_next)
+            rthp = &(*rthp)->u.dst.rt_next)
                if (*rthp == rt) {
-                       *rthp = rt->u.rt_next;
+                       *rthp = rt->u.dst.rt_next;
                        rt_free(rt);
                        break;
                }
@@ -1167,7 +1166,7 @@ void ip_rt_redirect(__be32 old_gw, __be32 daddr, __be32 new_gw,
                                    rth->fl.fl4_src != skeys[i] ||
                                    rth->fl.oif != ikeys[k] ||
                                    rth->fl.iif != 0) {
-                                       rthp = &rth->u.rt_next;
+                                       rthp = &rth->u.dst.rt_next;
                                        continue;
                                }
 
@@ -1190,7 +1189,7 @@ void ip_rt_redirect(__be32 old_gw, __be32 daddr, __be32 new_gw,
 
                                /* Copy all the information. */
                                *rt = *rth;
-                               INIT_RCU_HEAD(&rt->u.dst.rcu_head);
+                               INIT_RCU_HEAD(&rt->u.dst.rcu_head);
                                rt->u.dst.__use         = 1;
                                atomic_set(&rt->u.dst.__refcnt, 1);
                                rt->u.dst.child         = NULL;
@@ -1225,11 +1224,11 @@ void ip_rt_redirect(__be32 old_gw, __be32 daddr, __be32 new_gw,
                                        rt_drop(rt);
                                        goto do_next;
                                }
-                               
+
                                netevent.old = &rth->u.dst;
                                netevent.new = &rt->u.dst;
-                               call_netevent_notifiers(NETEVENT_REDIRECT, 
-                                                       &netevent);
+                               call_netevent_notifiers(NETEVENT_REDIRECT,
+                                                       &netevent);
 
                                rt_del(hash, rth);
                                if (!rt_intern_hash(hash, rt, &rt))
@@ -1343,7 +1342,7 @@ void ip_rt_send_redirect(struct sk_buff *skb)
 #endif
        }
 out:
-        in_dev_put(in_dev);
+       in_dev_put(in_dev);
 }
 
 static int ip_error(struct sk_buff *skb)
@@ -1379,7 +1378,7 @@ static int ip_error(struct sk_buff *skb)
 
 out:   kfree_skb(skb);
        return 0;
-} 
+}
 
 /*
  *     The last two values are not from the RFC but
@@ -1392,7 +1391,7 @@ static const unsigned short mtu_plateau[] =
 static __inline__ unsigned short guess_mtu(unsigned short old_mtu)
 {
        int i;
-       
+
        for (i = 0; i < ARRAY_SIZE(mtu_plateau); i++)
                if (old_mtu > mtu_plateau[i])
                        return mtu_plateau[i];
@@ -1416,7 +1415,7 @@ unsigned short ip_rt_frag_needed(struct iphdr *iph, unsigned short new_mtu)
 
                rcu_read_lock();
                for (rth = rcu_dereference(rt_hash_table[hash].chain); rth;
-                    rth = rcu_dereference(rth->u.rt_next)) {
+                    rth = rcu_dereference(rth->u.dst.rt_next)) {
                        if (rth->fl.fl4_dst == daddr &&
                            rth->fl.fl4_src == skeys[i] &&
                            rth->rt_dst  == daddr &&
@@ -1436,7 +1435,7 @@ unsigned short ip_rt_frag_needed(struct iphdr *iph, unsigned short new_mtu)
                                        mtu = guess_mtu(old_mtu);
                                }
                                if (mtu <= rth->u.dst.metrics[RTAX_MTU-1]) {
-                                       if (mtu < rth->u.dst.metrics[RTAX_MTU-1]) { 
+                                       if (mtu < rth->u.dst.metrics[RTAX_MTU-1]) {
                                                dst_confirm(&rth->u.dst);
                                                if (mtu < ip_rt_min_pmtu) {
                                                        mtu = ip_rt_min_pmtu;
@@ -1600,7 +1599,7 @@ static void rt_set_nexthop(struct rtable *rt, struct fib_result *res, u32 itag)
 #endif
        set_class_tag(rt, itag);
 #endif
-        rt->rt_type = res->type;
+       rt->rt_type = res->type;
 }
 
 static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr,
@@ -1714,11 +1713,11 @@ static void ip_handle_martian_source(struct net_device *dev,
 #endif
 }
 
-static inline int __mkroute_input(struct sk_buff *skb, 
-                                 struct fib_result* res, 
-                                 struct in_device *in_dev, 
+static inline int __mkroute_input(struct sk_buff *skb,
+                                 struct fib_result* res,
+                                 struct in_device *in_dev,
                                  __be32 daddr, __be32 saddr, u32 tos,
-                                 struct rtable **result) 
+                                 struct rtable **result)
 {
 
        struct rtable *rth;
@@ -1738,12 +1737,12 @@ static inline int __mkroute_input(struct sk_buff *skb,
        }
 
 
-       err = fib_validate_source(saddr, daddr, tos, FIB_RES_OIF(*res), 
+       err = fib_validate_source(saddr, daddr, tos, FIB_RES_OIF(*res),
                                  in_dev->dev, &spec_dst, &itag);
        if (err < 0) {
-               ip_handle_martian_source(in_dev->dev, in_dev, skb, daddr, 
+               ip_handle_martian_source(in_dev->dev, in_dev, skb, daddr,
                                         saddr);
-               
+
                err = -EINVAL;
                goto cleanup;
        }
@@ -1811,10 +1810,10 @@ static inline int __mkroute_input(struct sk_buff *skb,
        /* release the working reference to the output device */
        in_dev_put(out_dev);
        return err;
-}                                              
+}
 
-static inline int ip_mkroute_input_def(struct sk_buff *skb, 
-                                      struct fib_result* res, 
+static inline int ip_mkroute_input_def(struct sk_buff *skb,
+                                      struct fib_result* res,
                                       const struct flowi *fl,
                                       struct in_device *in_dev,
                                       __be32 daddr, __be32 saddr, u32 tos)
@@ -1835,11 +1834,11 @@ static inline int ip_mkroute_input_def(struct sk_buff *skb,
 
        /* put it into the cache */
        hash = rt_hash(daddr, saddr, fl->iif);
-       return rt_intern_hash(hash, rth, (struct rtable**)&skb->dst);   
+       return rt_intern_hash(hash, rth, (struct rtable**)&skb->dst);
 }
 
-static inline int ip_mkroute_input(struct sk_buff *skb, 
-                                  struct fib_result* res, 
+static inline int ip_mkroute_input(struct sk_buff *skb,
+                                  struct fib_result* res,
                                   const struct flowi *fl,
                                   struct in_device *in_dev,
                                   __be32 daddr, __be32 saddr, u32 tos)
@@ -1859,7 +1858,7 @@ static inline int ip_mkroute_input(struct sk_buff *skb,
        if (hopcount < 2)
                return ip_mkroute_input_def(skb, res, fl, in_dev, daddr,
                                            saddr, tos);
-       
+
        /* add all alternatives to the routing cache */
        for (hop = 0; hop < hopcount; hop++) {
                res->nh_sel = hop;
@@ -1988,7 +1987,7 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr,
                goto e_nobufs;
        if (err == -EINVAL)
                goto e_inval;
-       
+
 done:
        in_dev_put(in_dev);
        if (free_res)
@@ -2071,8 +2070,8 @@ martian_destination:
 #endif
 
 e_hostunreach:
-        err = -EHOSTUNREACH;
-        goto done;
+       err = -EHOSTUNREACH;
+       goto done;
 
 e_inval:
        err = -EINVAL;
@@ -2099,7 +2098,7 @@ int ip_route_input(struct sk_buff *skb, __be32 daddr, __be32 saddr,
 
        rcu_read_lock();
        for (rth = rcu_dereference(rt_hash_table[hash].chain); rth;
-            rth = rcu_dereference(rth->u.rt_next)) {
+            rth = rcu_dereference(rth->u.dst.rt_next)) {
                if (rth->fl.fl4_dst == daddr &&
                    rth->fl.fl4_src == saddr &&
                    rth->fl.iif == iif &&
@@ -2153,11 +2152,11 @@ int ip_route_input(struct sk_buff *skb, __be32 daddr, __be32 saddr,
 }
 
 static inline int __mkroute_output(struct rtable **result,
-                                  struct fib_result* res, 
+                                  struct fib_result* res,
                                   const struct flowi *fl,
-                                  const struct flowi *oldflp, 
-                                  struct net_device *dev_out, 
-                                  unsigned flags) 
+                                  const struct flowi *oldflp,
+                                  struct net_device *dev_out,
+                                  unsigned flags)
 {
        struct rtable *rth;
        struct in_device *in_dev;
@@ -2190,7 +2189,7 @@ static inline int __mkroute_output(struct rtable **result,
                }
        } else if (res->type == RTN_MULTICAST) {
                flags |= RTCF_MULTICAST|RTCF_LOCAL;
-               if (!ip_check_mc(in_dev, oldflp->fl4_dst, oldflp->fl4_src, 
+               if (!ip_check_mc(in_dev, oldflp->fl4_dst, oldflp->fl4_src,
                                 oldflp->proto))
                        flags &= ~RTCF_LOCAL;
                /* If multicast route do not exist use
@@ -2208,7 +2207,7 @@ static inline int __mkroute_output(struct rtable **result,
        if (!rth) {
                err = -ENOBUFS;
                goto cleanup;
-       }               
+       }
 
        atomic_set(&rth->u.dst.__refcnt, 1);
        rth->u.dst.flags= DST_HOST;
@@ -2232,7 +2231,7 @@ static inline int __mkroute_output(struct rtable **result,
        rth->rt_dst     = fl->fl4_dst;
        rth->rt_src     = fl->fl4_src;
        rth->rt_iif     = oldflp->oif ? : dev_out->ifindex;
-       /* get references to the devices that are to be hold by the routing 
+       /* get references to the devices that are to be hold by the routing
           cache entry */
        rth->u.dst.dev  = dev_out;
        dev_hold(dev_out);
@@ -2250,7 +2249,7 @@ static inline int __mkroute_output(struct rtable **result,
        }
        if (flags & (RTCF_BROADCAST | RTCF_MULTICAST)) {
                rth->rt_spec_dst = fl->fl4_src;
-               if (flags & RTCF_LOCAL && 
+               if (flags & RTCF_LOCAL &&
                    !(dev_out->flags & IFF_LOOPBACK)) {
                        rth->u.dst.output = ip_mc_output;
                        RT_CACHE_STAT_INC(out_slow_mc);
@@ -2292,7 +2291,7 @@ static inline int ip_mkroute_output_def(struct rtable **rp,
                hash = rt_hash(oldflp->fl4_dst, oldflp->fl4_src, oldflp->oif);
                err = rt_intern_hash(hash, rth, rp);
        }
-       
+
        return err;
 }
 
@@ -2563,7 +2562,7 @@ int __ip_route_output_key(struct rtable **rp, const struct flowi *flp)
 
        rcu_read_lock_bh();
        for (rth = rcu_dereference(rt_hash_table[hash].chain); rth;
-               rth = rcu_dereference(rth->u.rt_next)) {
+               rth = rcu_dereference(rth->u.dst.rt_next)) {
                if (rth->fl.fl4_dst == flp->fl4_dst &&
                    rth->fl.fl4_src == flp->fl4_src &&
                    rth->fl.iif == 0 &&
@@ -2825,12 +2824,12 @@ int ip_rt_dump(struct sk_buff *skb,  struct netlink_callback *cb)
                        s_idx = 0;
                rcu_read_lock_bh();
                for (rt = rcu_dereference(rt_hash_table[h].chain), idx = 0; rt;
-                    rt = rcu_dereference(rt->u.rt_next), idx++) {
+                    rt = rcu_dereference(rt->u.dst.rt_next), idx++) {
                        if (idx < s_idx)
                                continue;
                        skb->dst = dst_clone(&rt->u.dst);
                        if (rt_fill_info(skb, NETLINK_CB(cb->skb).pid,
-                                        cb->nlh->nlmsg_seq, RTM_NEWROUTE, 
+                                        cb->nlh->nlmsg_seq, RTM_NEWROUTE,
                                         1, NLM_F_MULTI) <= 0) {
                                dst_release(xchg(&skb->dst, NULL));
                                rcu_read_unlock_bh();
@@ -2863,7 +2862,7 @@ static int ipv4_sysctl_rtcache_flush(ctl_table *ctl, int write,
                proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
                rt_cache_flush(flush_delay);
                return 0;
-       } 
+       }
 
        return -EINVAL;
 }
@@ -2880,13 +2879,13 @@ static int ipv4_sysctl_rtcache_flush_strategy(ctl_table *table,
        if (newlen != sizeof(int))
                return -EINVAL;
        if (get_user(delay, (int __user *)newval))
-               return -EFAULT; 
-       rt_cache_flush(delay); 
+               return -EFAULT;
+       rt_cache_flush(delay);
        return 0;
 }
 
 ctl_table ipv4_route_table[] = {
-        {
+       {
                .ctl_name       = NET_IPV4_ROUTE_FLUSH,
                .procname       = "flush",
                .data           = &flush_delay,
@@ -2931,7 +2930,7 @@ ctl_table ipv4_route_table[] = {
        },
        {
                /*  Deprecated. Use gc_min_interval_ms */
+
                .ctl_name       = NET_IPV4_ROUTE_GC_MIN_INTERVAL,
                .procname       = "gc_min_interval",
                .data           = &ip_rt_gc_min_interval,
@@ -3180,8 +3179,8 @@ int __init ip_rt_init(void)
        {
        struct proc_dir_entry *rtstat_pde = NULL; /* keep gcc happy */
        if (!proc_net_fops_create("rt_cache", S_IRUGO, &rt_cache_seq_fops) ||
-           !(rtstat_pde = create_proc_entry("rt_cache", S_IRUGO, 
-                                            proc_net_stat))) {
+           !(rtstat_pde = create_proc_entry("rt_cache", S_IRUGO,
+                                            proc_net_stat))) {
                return -ENOMEM;
        }
        rtstat_pde->proc_fops = &rt_cpu_seq_fops;
index 6b19530905afdbad2e7e2c46716b8d741447f7b9..33016cc90f0b8a7add18555666a010f87bc550ab 100644 (file)
@@ -2,16 +2,16 @@
  *  Syncookies implementation for the Linux kernel
  *
  *  Copyright (C) 1997 Andi Kleen
- *  Based on ideas by D.J.Bernstein and Eric Schenk. 
+ *  Based on ideas by D.J.Bernstein and Eric Schenk.
  *
  *     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.
- * 
+ *
  *  $Id: syncookies.c,v 1.18 2002/02/01 22:01:04 davem Exp $
  *
- *  Missing: IPv6 support. 
+ *  Missing: IPv6 support.
  */
 
 #include <linux/tcp.h>
@@ -57,7 +57,7 @@ static __u32 secure_tcp_syn_cookie(__be32 saddr, __be32 daddr, __be16 sport,
        /*
         * Compute the secure sequence number.
         * The output should be:
-        *   HASH(sec1,saddr,sport,daddr,dport,sec1) + sseq + (count * 2^24)
+        *   HASH(sec1,saddr,sport,daddr,dport,sec1) + sseq + (count * 2^24)
         *      + (HASH(sec2,saddr,sport,daddr,dport,count,sec2) % 2^24).
         * Where sseq is their sequence number and count increases every
         * minute by 1.
@@ -99,17 +99,17 @@ static __u32 check_tcp_syn_cookie(__u32 cookie, __be32 saddr, __be32 daddr,
                & COOKIEMASK;   /* Leaving the data behind */
 }
 
-/* 
+/*
  * This table has to be sorted and terminated with (__u16)-1.
  * XXX generate a better table.
  * Unresolved Issues: HIPPI with a 64k MSS is not well supported.
  */
 static __u16 const msstab[] = {
        64 - 1,
-       256 - 1,        
+       256 - 1,
        512 - 1,
        536 - 1,
-       1024 - 1,       
+       1024 - 1,
        1440 - 1,
        1460 - 1,
        4312 - 1,
@@ -128,7 +128,7 @@ __u32 cookie_v4_init_sequence(struct sock *sk, struct sk_buff *skb, __u16 *mssp)
        int mssind;
        const __u16 mss = *mssp;
 
-       
+
        tp->last_synq_overflow = jiffies;
 
        /* XXX sort msstab[] by probability?  Binary search? */
@@ -144,23 +144,23 @@ __u32 cookie_v4_init_sequence(struct sock *sk, struct sk_buff *skb, __u16 *mssp)
                                     jiffies / (HZ * 60), mssind);
 }
 
-/* 
+/*
  * This (misnamed) value is the age of syncookie which is permitted.
  * Its ideal value should be dependent on TCP_TIMEOUT_INIT and
  * sysctl_tcp_retries1. It's a rather complicated formula (exponential
  * backoff) to compute at runtime so it's currently hardcoded here.
  */
 #define COUNTER_TRIES 4
-/*  
- * Check if a ack sequence number is a valid syncookie. 
+/*
+ * Check if a ack sequence number is a valid syncookie.
  * Return the decoded mss if it is, or 0 if not.
  */
 static inline int cookie_check(struct sk_buff *skb, __u32 cookie)
 {
-       __u32 seq; 
+       __u32 seq;
        __u32 mssind;
 
-       seq = ntohl(skb->h.th->seq)-1; 
+       seq = ntohl(skb->h.th->seq)-1;
        mssind = check_tcp_syn_cookie(cookie,
                                      skb->nh.iph->saddr, skb->nh.iph->daddr,
                                      skb->h.th->source, skb->h.th->dest,
@@ -191,19 +191,19 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb,
        struct inet_request_sock *ireq;
        struct tcp_request_sock *treq;
        struct tcp_sock *tp = tcp_sk(sk);
-       __u32 cookie = ntohl(skb->h.th->ack_seq) - 1; 
+       __u32 cookie = ntohl(skb->h.th->ack_seq) - 1;
        struct sock *ret = sk;
-       struct request_sock *req; 
-       int mss; 
-       struct rtable *rt; 
+       struct request_sock *req;
+       int mss;
+       struct rtable *rt;
        __u8 rcv_wscale;
 
        if (!sysctl_tcp_syncookies || !skb->h.th->ack)
                goto out;
 
-       if (time_after(jiffies, tp->last_synq_overflow + TCP_TIMEOUT_INIT) ||
+       if (time_after(jiffies, tp->last_synq_overflow + TCP_TIMEOUT_INIT) ||
            (mss = cookie_check(skb, cookie)) == 0) {
-               NET_INC_STATS_BH(LINUX_MIB_SYNCOOKIESFAILED);
+               NET_INC_STATS_BH(LINUX_MIB_SYNCOOKIESFAILED);
                goto out;
        }
 
@@ -221,9 +221,9 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb,
        ireq = inet_rsk(req);
        treq = tcp_rsk(req);
        treq->rcv_isn           = ntohl(skb->h.th->seq) - 1;
-       treq->snt_isn           = cookie; 
+       treq->snt_isn           = cookie;
        req->mss                = mss;
-       ireq->rmt_port          = skb->h.th->source;
+       ireq->rmt_port          = skb->h.th->source;
        ireq->loc_addr          = skb->nh.iph->daddr;
        ireq->rmt_addr          = skb->nh.iph->saddr;
        ireq->opt               = NULL;
@@ -242,15 +242,15 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb,
        }
 
        ireq->snd_wscale = ireq->rcv_wscale = ireq->tstamp_ok = 0;
-       ireq->wscale_ok  = ireq->sack_ok = 0; 
-       req->expires    = 0UL; 
-       req->retrans    = 0; 
-       
+       ireq->wscale_ok  = ireq->sack_ok = 0;
+       req->expires    = 0UL;
+       req->retrans    = 0;
+
        /*
         * We need to lookup the route here to get at the correct
         * window size. We should better make sure that the window size
         * hasn't changed since we received the original syn, but I see
-        * no easy way to do this. 
+        * no easy way to do this.
         */
        {
                struct flowi fl = { .nl_u = { .ip4_u =
@@ -266,17 +266,17 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb,
                security_req_classify_flow(req, &fl);
                if (ip_route_output_key(&rt, &fl)) {
                        reqsk_free(req);
-                       goto out; 
+                       goto out;
                }
        }
 
        /* Try to redo what tcp_v4_send_synack did. */
        req->window_clamp = dst_metric(&rt->u.dst, RTAX_WINDOW);
        tcp_select_initial_window(tcp_full_space(sk), req->mss,
-                                 &req->rcv_wnd, &req->window_clamp, 
+                                 &req->rcv_wnd, &req->window_clamp,
                                  0, &rcv_wscale);
        /* BTW win scale with syncookies is 0 by definition */
-       ireq->rcv_wscale  = rcv_wscale; 
+       ireq->rcv_wscale  = rcv_wscale;
 
        ret = get_cookie_sock(sk, skb, req, &rt->u.dst);
 out:   return ret;
index fabf69a9108ca6f6d42f58c3eca46b30f1ffae6b..0aa304711a96ee09b7a99a48f4a1c676b4ee86ec 100644 (file)
@@ -24,7 +24,7 @@ extern int sysctl_ip_nonlocal_bind;
 
 #ifdef CONFIG_SYSCTL
 static int zero;
-static int tcp_retr1_max = 255; 
+static int tcp_retr1_max = 255;
 static int ip_local_port_range_min[] = { 1, 1 };
 static int ip_local_port_range_max[] = { 65535, 65535 };
 #endif
@@ -187,7 +187,7 @@ static int strategy_allowed_congestion_control(ctl_table *table, int __user *nam
 }
 
 ctl_table ipv4_table[] = {
-        {
+       {
                .ctl_name       = NET_IPV4_TCP_TIMESTAMPS,
                .procname       = "tcp_timestamps",
                .data           = &sysctl_tcp_timestamps,
@@ -195,7 +195,7 @@ ctl_table ipv4_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_dointvec
        },
-        {
+       {
                .ctl_name       = NET_IPV4_TCP_WINDOW_SCALING,
                .procname       = "tcp_window_scaling",
                .data           = &sysctl_tcp_window_scaling,
@@ -203,7 +203,7 @@ ctl_table ipv4_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_dointvec
        },
-        {
+       {
                .ctl_name       = NET_IPV4_TCP_SACK,
                .procname       = "tcp_sack",
                .data           = &sysctl_tcp_sack,
@@ -211,7 +211,7 @@ ctl_table ipv4_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_dointvec
        },
-        {
+       {
                .ctl_name       = NET_IPV4_TCP_RETRANS_COLLAPSE,
                .procname       = "tcp_retrans_collapse",
                .data           = &sysctl_tcp_retrans_collapse,
@@ -219,7 +219,7 @@ ctl_table ipv4_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_dointvec
        },
-        {
+       {
                .ctl_name       = NET_IPV4_FORWARD,
                .procname       = "ip_forward",
                .data           = &ipv4_devconf.forwarding,
@@ -228,16 +228,16 @@ ctl_table ipv4_table[] = {
                .proc_handler   = &ipv4_sysctl_forward,
                .strategy       = &ipv4_sysctl_forward_strategy
        },
-        {
+       {
                .ctl_name       = NET_IPV4_DEFAULT_TTL,
                .procname       = "ip_default_ttl",
-               .data           = &sysctl_ip_default_ttl,
+               .data           = &sysctl_ip_default_ttl,
                .maxlen         = sizeof(int),
                .mode           = 0644,
                .proc_handler   = &ipv4_doint_and_flush,
                .strategy       = &ipv4_doint_and_flush_strategy,
        },
-        {
+       {
                .ctl_name       = NET_IPV4_NO_PMTU_DISC,
                .procname       = "ip_no_pmtu_disc",
                .data           = &ipv4_config.no_pmtu_disc,
@@ -728,7 +728,7 @@ ctl_table ipv4_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_dointvec,
        },
-        {
+       {
                .ctl_name       = NET_IPV4_TCP_WORKAROUND_SIGNED_WINDOWS,
                .procname       = "tcp_workaround_signed_windows",
                .data           = &sysctl_tcp_workaround_signed_windows,
index 5bd43d7294fd1fe1f901a5f5f628051296313557..ac6516c642a1756fae602cb79e06cb42714df302 100644 (file)
@@ -475,7 +475,7 @@ static inline void skb_entail(struct sock *sk, struct tcp_sock *tp,
        if (!sk->sk_send_head)
                sk->sk_send_head = skb;
        if (tp->nonagle & TCP_NAGLE_PUSH)
-               tp->nonagle &= ~TCP_NAGLE_PUSH; 
+               tp->nonagle &= ~TCP_NAGLE_PUSH;
 }
 
 static inline void tcp_mark_urg(struct tcp_sock *tp, int flags,
@@ -557,7 +557,7 @@ new_segment:
                }
                if (!sk_stream_wmem_schedule(sk, copy))
                        goto wait_for_memory;
-               
+
                if (can_coalesce) {
                        skb_shinfo(skb)->frags[i - 1].size += copy;
                } else {
@@ -1439,12 +1439,12 @@ skip_copy:
                dma_async_memcpy_issue_pending(tp->ucopy.dma_chan);
 
                while (dma_async_memcpy_complete(tp->ucopy.dma_chan,
-                                                tp->ucopy.dma_cookie, &done,
-                                                &used) == DMA_IN_PROGRESS) {
+                                                tp->ucopy.dma_cookie, &done,
+                                                &used) == DMA_IN_PROGRESS) {
                        /* do partial cleanup of sk_async_wait_queue */
                        while ((skb = skb_peek(&sk->sk_async_wait_queue)) &&
                               (dma_async_is_complete(skb->dma_cookie, done,
-                                                     used) == DMA_SUCCESS)) {
+                                                     used) == DMA_SUCCESS)) {
                                __skb_dequeue(&sk->sk_async_wait_queue);
                                kfree_skb(skb);
                        }
@@ -2006,7 +2006,7 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info)
                info->tcpi_options |= TCPI_OPT_WSCALE;
                info->tcpi_snd_wscale = tp->rx_opt.snd_wscale;
                info->tcpi_rcv_wscale = tp->rx_opt.rcv_wscale;
-       } 
+       }
 
        if (tp->ecn_flags&TCP_ECN_OK)
                info->tcpi_options |= TCPI_OPT_ECN;
index 5ca7723d07987a604bb6382f0fdefc3f1850b2cb..c1b34f1edb32740fa38dc724f6792f5998118a54 100644 (file)
@@ -313,28 +313,28 @@ void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 rtt, u32 in_flight,
                return;
 
        /* In "safe" area, increase. */
-        if (tp->snd_cwnd <= tp->snd_ssthresh)
+       if (tp->snd_cwnd <= tp->snd_ssthresh)
                tcp_slow_start(tp);
 
-       /* In dangerous area, increase slowly. */
+       /* In dangerous area, increase slowly. */
        else if (sysctl_tcp_abc) {
-               /* RFC3465: Appropriate 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++;
-       }
+               /* RFC3465: Appropriate 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 6ad184802266b7e06fde04235104ca9ba40a6c61..9a582fb4ef9fb4b9a2c4962bbc3ef6d42dd13b54 100644 (file)
                                          */
 #define        BICTCP_HZ               10      /* BIC HZ 2^10 = 1024 */
 
-static int fast_convergence = 1;
-static int max_increment = 16;
-static int beta = 819;         /* = 819/1024 (BICTCP_BETA_SCALE) */
-static int initial_ssthresh = 100;
-static int bic_scale = 41;
-static int tcp_friendliness = 1;
+static int fast_convergence __read_mostly = 1;
+static int max_increment __read_mostly = 16;
+static int beta __read_mostly = 819;   /* = 819/1024 (BICTCP_BETA_SCALE) */
+static int initial_ssthresh __read_mostly = 100;
+static int bic_scale __read_mostly = 41;
+static int tcp_friendliness __read_mostly = 1;
 
-static u32 cube_rtt_scale;
-static u32 beta_scale;
-static u64 cube_factor;
+static u32 cube_rtt_scale __read_mostly;
+static u32 beta_scale __read_mostly;
+static u64 cube_factor __read_mostly;
 
 /* Note parameters that are used for precomputing scale factors are read-only */
 module_param(fast_convergence, int, 0644);
@@ -175,42 +175,42 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd)
                }
        }
 
-        /* cubic function - calc*/
-        /* calculate c * time^3 / rtt,
-         *  while considering overflow in calculation of time^3
+       /* cubic function - calc*/
+       /* calculate c * time^3 / rtt,
+        *  while considering overflow in calculation of time^3
         * (so time^3 is done by using 64 bit)
         * and without the support of division of 64bit numbers
         * (so all divisions are done by using 32 bit)
-         *  also NOTE the unit of those veriables
-         *       time  = (t - K) / 2^bictcp_HZ
-         *       c = bic_scale >> 10
+        *  also NOTE the unit of those veriables
+               time  = (t - K) / 2^bictcp_HZ
+               c = bic_scale >> 10
         * rtt  = (srtt >> 3) / HZ
         * !!! The following code does not have overflow problems,
         * if the cwnd < 1 million packets !!!
-         */
+        */
 
        /* change the unit from HZ to bictcp_HZ */
-        t = ((tcp_time_stamp + (ca->delay_min>>3) - ca->epoch_start)
+       t = ((tcp_time_stamp + (ca->delay_min>>3) - ca->epoch_start)
             << BICTCP_HZ) / HZ;
 
-        if (t < ca->bic_K)             /* t - K */
+       if (t < ca->bic_K)              /* t - K */
                offs = ca->bic_K - t;
-        else
-                offs = t - ca->bic_K;
+       else
+               offs = t - ca->bic_K;
 
        /* c/rtt * (t-K)^3 */
        delta = (cube_rtt_scale * offs * offs * offs) >> (10+3*BICTCP_HZ);
-        if (t < ca->bic_K)                                     /* below origin*/
-                bic_target = ca->bic_origin_point - delta;
-        else                                                   /* above origin*/
-                bic_target = ca->bic_origin_point + delta;
+       if (t < ca->bic_K)                                      /* below origin*/
+               bic_target = ca->bic_origin_point - delta;
+       else                                                    /* above origin*/
+               bic_target = ca->bic_origin_point + delta;
 
-        /* cubic function - calc bictcp_cnt*/
-        if (bic_target > cwnd) {
+       /* cubic function - calc bictcp_cnt*/
+       if (bic_target > cwnd) {
                ca->cnt = cwnd / (bic_target - cwnd);
-        } else {
-                ca->cnt = 100 * cwnd;              /* very small increment*/
-        }
+       } else {
+               ca->cnt = 100 * cwnd;              /* very small increment*/
+       }
 
        if (ca->delay_min > 0) {
                /* max increment = Smax * rtt / 0.1  */
@@ -219,7 +219,7 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd)
                        ca->cnt = min_cnt;
        }
 
-        /* slow start and low utilization  */
+       /* slow start and low utilization  */
        if (ca->loss_cwnd == 0)         /* could be aggressive in slow start */
                ca->cnt = 50;
 
@@ -227,9 +227,9 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd)
        if (tcp_friendliness) {
                u32 scale = beta_scale;
                delta = (cwnd * scale) >> 3;
-               while (ca->ack_cnt > delta) {           /* update tcp cwnd */
-                       ca->ack_cnt -= delta;
-                       ca->tcp_cwnd++;
+               while (ca->ack_cnt > delta) {           /* update tcp cwnd */
+                       ca->ack_cnt -= delta;
+                       ca->tcp_cwnd++;
                }
 
                if (ca->tcp_cwnd > cwnd){       /* if bic is slower than tcp */
@@ -238,7 +238,7 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd)
                        if (ca->cnt > max_cnt)
                                ca->cnt = max_cnt;
                }
-        }
+       }
 
        ca->cnt = (ca->cnt << ACK_RATIO_SHIFT) / ca->delayed_ack;
        if (ca->cnt == 0)                       /* cannot be zero */
index c4fc811bf377f6f65f86b21eb51e659555f1c2e6..a291097fcc0a9e4ba6ff813579680809fff9bf3e 100644 (file)
@@ -14,8 +14,8 @@
  * with fixed-point MD scaled <<8.
  */
 static const struct hstcp_aimd_val {
-        unsigned int cwnd;
-        unsigned int md;
+       unsigned int cwnd;
+       unsigned int md;
 } hstcp_aimd_vals[] = {
  {     38,  128, /*  0.50 */ },
  {    118,  112, /*  0.44 */ },
index 753987a1048ffdf8a890205fd425fcd69d420902..1020eb48d8d18590a0ae4da87fc8462bdb7fd60f 100644 (file)
 #include <linux/module.h>
 #include <net/tcp.h>
 
-#define ALPHA_BASE     (1<<7)  /* 1.0 with shift << 7 */
-#define BETA_MIN       (1<<6)  /* 0.5 with shift << 7 */
+#define ALPHA_BASE     (1<<7)  /* 1.0 with shift << 7 */
+#define BETA_MIN       (1<<6)  /* 0.5 with shift << 7 */
 #define BETA_MAX       102     /* 0.8 with shift << 7 */
 
-static int use_rtt_scaling = 1;
+static int use_rtt_scaling __read_mostly = 1;
 module_param(use_rtt_scaling, int, 0644);
 MODULE_PARM_DESC(use_rtt_scaling, "turn on/off RTT scaling");
 
-static int use_bandwidth_switch = 1;
+static int use_bandwidth_switch __read_mostly = 1;
 module_param(use_bandwidth_switch, int, 0644);
 MODULE_PARM_DESC(use_bandwidth_switch, "turn on/off bandwidth switcher");
 
 struct htcp {
        u32     alpha;          /* Fixed point arith, << 7 */
        u8      beta;           /* Fixed point arith, << 7 */
-       u8      modeswitch;     /* Delay modeswitch until we had at least one congestion event */
+       u8      modeswitch;     /* Delay modeswitch
+                                  until we had at least one congestion event */
        u16     pkts_acked;
        u32     packetcount;
        u32     minRTT;
@@ -44,14 +45,14 @@ struct htcp {
        u32     lasttime;
 };
 
-static inline u32 htcp_cong_time(struct htcp *ca)
+static inline u32 htcp_cong_time(const struct htcp *ca)
 {
        return jiffies - ca->last_cong;
 }
 
-static inline u32 htcp_ccount(struct htcp *ca)
+static inline u32 htcp_ccount(const struct htcp *ca)
 {
-       return htcp_cong_time(ca)/ca->minRTT;
+       return htcp_cong_time(ca) / ca->minRTT;
 }
 
 static inline void htcp_reset(struct htcp *ca)
@@ -67,10 +68,12 @@ static u32 htcp_cwnd_undo(struct sock *sk)
 {
        const struct tcp_sock *tp = tcp_sk(sk);
        struct htcp *ca = inet_csk_ca(sk);
+
        ca->last_cong = ca->undo_last_cong;
        ca->maxRTT = ca->undo_maxRTT;
        ca->old_maxB = ca->undo_old_maxB;
-       return max(tp->snd_cwnd, (tp->snd_ssthresh<<7)/ca->beta);
+
+       return max(tp->snd_cwnd, (tp->snd_ssthresh << 7) / ca->beta);
 }
 
 static inline void measure_rtt(struct sock *sk)
@@ -78,17 +81,19 @@ static inline void measure_rtt(struct sock *sk)
        const struct inet_connection_sock *icsk = inet_csk(sk);
        const struct tcp_sock *tp = tcp_sk(sk);
        struct htcp *ca = inet_csk_ca(sk);
-       u32 srtt = tp->srtt>>3;
+       u32 srtt = tp->srtt >> 3;
 
        /* keep track of minimum RTT seen so far, minRTT is zero at first */
        if (ca->minRTT > srtt || !ca->minRTT)
                ca->minRTT = srtt;
 
        /* max RTT */
-       if (icsk->icsk_ca_state == TCP_CA_Open && tp->snd_ssthresh < 0xFFFF && htcp_ccount(ca) > 3) {
+       if (icsk->icsk_ca_state == TCP_CA_Open
+           && tp->snd_ssthresh < 0xFFFF && htcp_ccount(ca) > 3) {
                if (ca->maxRTT < ca->minRTT)
                        ca->maxRTT = ca->minRTT;
-               if (ca->maxRTT < srtt && srtt <= ca->maxRTT+msecs_to_jiffies(20))
+               if (ca->maxRTT < srtt
+                   && srtt <= ca->maxRTT + msecs_to_jiffies(20))
                        ca->maxRTT = srtt;
        }
 }
@@ -116,15 +121,16 @@ static void measure_achieved_throughput(struct sock *sk, u32 pkts_acked)
 
        ca->packetcount += pkts_acked;
 
-       if (ca->packetcount >= tp->snd_cwnd - (ca->alpha>>7? : 1)
-                       && now - ca->lasttime >= ca->minRTT
-                       && ca->minRTT > 0) {
-               __u32 cur_Bi = ca->packetcount*HZ/(now - ca->lasttime);
+       if (ca->packetcount >= tp->snd_cwnd - (ca->alpha >> 7 ? : 1)
+           && now - ca->lasttime >= ca->minRTT
+           && ca->minRTT > 0) {
+               __u32 cur_Bi = ca->packetcount * HZ / (now - ca->lasttime);
+
                if (htcp_ccount(ca) <= 3) {
                        /* just after backoff */
                        ca->minB = ca->maxB = ca->Bi = cur_Bi;
                } else {
-                       ca->Bi = (3*ca->Bi + cur_Bi)/4;
+                       ca->Bi = (3 * ca->Bi + cur_Bi) / 4;
                        if (ca->Bi > ca->maxB)
                                ca->maxB = ca->Bi;
                        if (ca->minB > ca->maxB)
@@ -142,7 +148,7 @@ static inline void htcp_beta_update(struct htcp *ca, u32 minRTT, u32 maxRTT)
                u32 old_maxB = ca->old_maxB;
                ca->old_maxB = ca->maxB;
 
-               if (!between(5*maxB, 4*old_maxB, 6*old_maxB)) {
+               if (!between(5 * maxB, 4 * old_maxB, 6 * old_maxB)) {
                        ca->beta = BETA_MIN;
                        ca->modeswitch = 0;
                        return;
@@ -150,7 +156,7 @@ static inline void htcp_beta_update(struct htcp *ca, u32 minRTT, u32 maxRTT)
        }
 
        if (ca->modeswitch && minRTT > msecs_to_jiffies(10) && maxRTT) {
-               ca->beta = (minRTT<<7)/maxRTT;
+               ca->beta = (minRTT << 7) / maxRTT;
                if (ca->beta < BETA_MIN)
                        ca->beta = BETA_MIN;
                else if (ca->beta > BETA_MAX)
@@ -169,23 +175,26 @@ static inline void htcp_alpha_update(struct htcp *ca)
 
        if (diff > HZ) {
                diff -= HZ;
-               factor = 1+ ( 10*diff + ((diff/2)*(diff/2)/HZ) )/HZ;
+               factor = 1 + (10 * diff + ((diff / 2) * (diff / 2) / HZ)) / HZ;
        }
 
        if (use_rtt_scaling && minRTT) {
-               u32 scale = (HZ<<3)/(10*minRTT);
-               scale = min(max(scale, 1U<<2), 10U<<3); /* clamping ratio to interval [0.5,10]<<3 */
-               factor = (factor<<3)/scale;
+               u32 scale = (HZ << 3) / (10 * minRTT);
+
+               /* clamping ratio to interval [0.5,10]<<3 */
+               scale = min(max(scale, 1U << 2), 10U << 3);
+               factor = (factor << 3) / scale;
                if (!factor)
                        factor = 1;
        }
 
-       ca->alpha = 2*factor*((1<<7)-ca->beta);
+       ca->alpha = 2 * factor * ((1 << 7) - ca->beta);
        if (!ca->alpha)
                ca->alpha = ALPHA_BASE;
 }
 
-/* After we have the rtt data to calculate beta, we'd still prefer to wait one
+/*
+ * After we have the rtt data to calculate beta, we'd still prefer to wait one
  * rtt before we adjust our beta to ensure we are working from a consistent
  * data.
  *
@@ -202,15 +211,16 @@ static void htcp_param_update(struct sock *sk)
        htcp_beta_update(ca, minRTT, maxRTT);
        htcp_alpha_update(ca);
 
-       /* add slowly fading memory for maxRTT to accommodate routing changes etc */
+       /* add slowly fading memory for maxRTT to accommodate routing changes */
        if (minRTT > 0 && maxRTT > minRTT)
-               ca->maxRTT = minRTT + ((maxRTT-minRTT)*95)/100;
+               ca->maxRTT = minRTT + ((maxRTT - minRTT) * 95) / 100;
 }
 
 static u32 htcp_recalc_ssthresh(struct sock *sk)
 {
        const struct tcp_sock *tp = tcp_sk(sk);
        const struct htcp *ca = inet_csk_ca(sk);
+
        htcp_param_update(sk);
        return max((tp->snd_cwnd * ca->beta) >> 7, 2U);
 }
@@ -224,10 +234,9 @@ static void htcp_cong_avoid(struct sock *sk, u32 ack, u32 rtt,
        if (!tcp_is_cwnd_limited(sk, in_flight))
                return;
 
-        if (tp->snd_cwnd <= tp->snd_ssthresh)
+       if (tp->snd_cwnd <= tp->snd_ssthresh)
                tcp_slow_start(tp);
        else {
-
                measure_rtt(sk);
 
                /* In dangerous area, increase slowly.
index c6109895bb5e305f3d794d55b1c13b17c99a80fd..1a14191687ac752fcbbe4fa324517554a251950f 100644 (file)
@@ -50,9 +50,9 @@
  *             Andi Kleen:             Make sure we never ack data there is not
  *                                     enough room for. Also make this condition
  *                                     a fatal error if it might still happen.
- *             Andi Kleen:             Add tcp_measure_rcv_mss to make 
+ *             Andi Kleen:             Add tcp_measure_rcv_mss to make
  *                                     connections with MSS<min(MTU,ann. MSS)
- *                                     work without delayed acks. 
+ *                                     work without delayed acks.
  *             Andi Kleen:             Process packets with PSH set in the
  *                                     fast path.
  *             J Hadi Salim:           ECN support
@@ -112,17 +112,17 @@ int sysctl_tcp_abc __read_mostly;
 
 #define TCP_REMNANT (TCP_FLAG_FIN|TCP_FLAG_URG|TCP_FLAG_SYN|TCP_FLAG_PSH)
 
-/* Adapt the MSS value used to make delayed ack decision to the 
+/* Adapt the MSS value used to make delayed ack decision to the
  * real world.
- */ 
+ */
 static void tcp_measure_rcv_mss(struct sock *sk,
                                const struct sk_buff *skb)
 {
        struct inet_connection_sock *icsk = inet_csk(sk);
-       const unsigned int lss = icsk->icsk_ack.last_seg_size; 
+       const unsigned int lss = icsk->icsk_ack.last_seg_size;
        unsigned int len;
 
-       icsk->icsk_ack.last_seg_size = 0; 
+       icsk->icsk_ack.last_seg_size = 0;
 
        /* skb->len may jitter because of SACKs, even if peer
         * sends good full-sized frames.
@@ -440,15 +440,15 @@ void tcp_rcv_space_adjust(struct sock *sk)
        struct tcp_sock *tp = tcp_sk(sk);
        int time;
        int space;
-       
+
        if (tp->rcvq_space.time == 0)
                goto new_measure;
-       
+
        time = tcp_time_stamp - tp->rcvq_space.time;
        if (time < (tp->rcv_rtt_est.rtt >> 3) ||
            tp->rcv_rtt_est.rtt == 0)
                return;
-       
+
        space = 2 * (tp->copied_seq - tp->rcvq_space.seq);
 
        space = max(tp->rcvq_space.space, space);
@@ -483,7 +483,7 @@ void tcp_rcv_space_adjust(struct sock *sk)
                        }
                }
        }
-       
+
 new_measure:
        tp->rcvq_space.seq = tp->copied_seq;
        tp->rcvq_space.time = tcp_time_stamp;
@@ -509,7 +509,7 @@ static void tcp_event_data_recv(struct sock *sk, struct tcp_sock *tp, struct sk_
        tcp_measure_rcv_mss(sk, skb);
 
        tcp_rcv_rtt_measure(tp);
-       
+
        now = tcp_time_stamp;
 
        if (!icsk->icsk_ack.ato) {
@@ -561,7 +561,7 @@ static void tcp_rtt_estimator(struct sock *sk, const __u32 mrtt)
        /*      The following amusing code comes from Jacobson's
         *      article in SIGCOMM '88.  Note that rtt and mdev
         *      are scaled versions of rtt and mean deviation.
-        *      This is designed to be as fast as possible 
+        *      This is designed to be as fast as possible
         *      m stands for "measurement".
         *
         *      On a 1990 paper the rto value is changed to:
@@ -1249,8 +1249,8 @@ void tcp_enter_frto(struct sock *sk)
        tp->frto_counter = 1;
 
        if (icsk->icsk_ca_state <= TCP_CA_Disorder ||
-            tp->snd_una == tp->high_seq ||
-            (icsk->icsk_ca_state == TCP_CA_Loss && !icsk->icsk_retransmits)) {
+           tp->snd_una == tp->high_seq ||
+           (icsk->icsk_ca_state == TCP_CA_Loss && !icsk->icsk_retransmits)) {
                tp->prior_ssthresh = tcp_current_ssthresh(sk);
                tp->snd_ssthresh = icsk->icsk_ca_ops->ssthresh(sk);
                tcp_ca_event(sk, CA_EVENT_FRTO);
@@ -1969,11 +1969,11 @@ tcp_fastretrans_alert(struct sock *sk, u32 prior_snd_una,
         * 1. Reno does not count dupacks (sacked_out) automatically. */
        if (!tp->packets_out)
                tp->sacked_out = 0;
-        /* 2. SACK counts snd_fack in packets inaccurately. */
+       /* 2. SACK counts snd_fack in packets inaccurately. */
        if (tp->sacked_out == 0)
                tp->fackets_out = 0;
 
-        /* Now state machine starts.
+       /* Now state machine starts.
         * A. ECE, hence prohibit cwnd undoing, the reduction is required. */
        if (flag&FLAG_ECE)
                tp->prior_ssthresh = 0;
@@ -2203,7 +2203,7 @@ static int tcp_tso_acked(struct sock *sk, struct sk_buff *skb,
                         __u32 now, __s32 *seq_rtt)
 {
        struct tcp_sock *tp = tcp_sk(sk);
-       struct tcp_skb_cb *scb = TCP_SKB_CB(skb); 
+       struct tcp_skb_cb *scb = TCP_SKB_CB(skb);
        __u32 seq = tp->snd_una;
        __u32 packets_acked;
        int acked = 0;
@@ -2279,7 +2279,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p)
 
        while ((skb = skb_peek(&sk->sk_write_queue)) &&
               skb != sk->sk_send_head) {
-               struct tcp_skb_cb *scb = TCP_SKB_CB(skb); 
+               struct tcp_skb_cb *scb = TCP_SKB_CB(skb);
                __u8 sacked = scb->sacked;
 
                /* If our packet is before the ack sequence we can
@@ -2470,9 +2470,9 @@ static int tcp_ack_update_window(struct sock *sk, struct tcp_sock *tp,
 static void tcp_process_frto(struct sock *sk, u32 prior_snd_una)
 {
        struct tcp_sock *tp = tcp_sk(sk);
-       
+
        tcp_sync_left_out(tp);
-       
+
        if (tp->snd_una == prior_snd_una ||
            !before(tp->snd_una, tp->frto_highmark)) {
                /* RTO was caused by loss, start retransmitting in
@@ -2627,7 +2627,7 @@ void tcp_parse_options(struct sk_buff *skb, struct tcp_options_received *opt_rx,
        opt_rx->saw_tstamp = 0;
 
        while(length>0) {
-               int opcode=*ptr++;
+               int opcode=*ptr++;
                int opsize;
 
                switch (opcode) {
@@ -2642,7 +2642,7 @@ void tcp_parse_options(struct sk_buff *skb, struct tcp_options_received *opt_rx,
                                        return;
                                if (opsize > length)
                                        return; /* don't parse partial options */
-                               switch(opcode) {
+                               switch(opcode) {
                                case TCPOPT_MSS:
                                        if(opsize==TCPOLEN_MSS && th->syn && !estab) {
                                                u16 in_mss = ntohs(get_unaligned((__be16 *)ptr));
@@ -2701,10 +2701,10 @@ void tcp_parse_options(struct sk_buff *skb, struct tcp_options_received *opt_rx,
                                         */
                                        break;
 #endif
-                               };
-                               ptr+=opsize-2;
-                               length-=opsize;
-               };
+                               };
+                               ptr+=opsize-2;
+                               length-=opsize;
+               };
        }
 }
 
@@ -3263,7 +3263,7 @@ drop:
                           TCP_SKB_CB(skb)->end_seq);
 
                tcp_dsack_set(tp, TCP_SKB_CB(skb)->seq, tp->rcv_nxt);
-               
+
                /* If window is closed, drop tail of packet. But after
                 * remembering D-SACK for its head made in previous line.
                 */
@@ -3342,7 +3342,7 @@ drop:
                        }
                }
                __skb_insert(skb, skb1, skb1->next, &tp->out_of_order_queue);
-               
+
                /* And clean segments covered by new one as whole. */
                while ((skb1 = skb->next) !=
                       (struct sk_buff*)&tp->out_of_order_queue &&
@@ -3507,7 +3507,7 @@ static void tcp_collapse_ofo_queue(struct sock *sk)
  */
 static int tcp_prune_queue(struct sock *sk)
 {
-       struct tcp_sock *tp = tcp_sk(sk); 
+       struct tcp_sock *tp = tcp_sk(sk);
 
        SOCK_DEBUG(sk, "prune_queue: c=%x\n", tp->copied_seq);
 
@@ -3617,7 +3617,7 @@ static void tcp_new_space(struct sock *sk)
        struct tcp_sock *tp = tcp_sk(sk);
 
        if (tcp_should_expand_sndbuf(sk, tp)) {
-               int sndmem = max_t(u32, tp->rx_opt.mss_clamp, tp->mss_cache) +
+               int sndmem = max_t(u32, tp->rx_opt.mss_clamp, tp->mss_cache) +
                        MAX_TCP_HEADER + 16 + sizeof(struct sk_buff),
                    demanded = max_t(unsigned int, tp->snd_cwnd,
                                                   tp->reordering + 1);
@@ -3690,7 +3690,7 @@ static inline void tcp_ack_snd_check(struct sock *sk)
  *     For 1003.1g we should support a new option TCP_STDURG to permit
  *     either form (or just set the sysctl tcp_stdurg).
  */
+
 static void tcp_check_urg(struct sock * sk, struct tcphdr * th)
 {
        struct tcp_sock *tp = tcp_sk(sk);
@@ -3771,7 +3771,7 @@ static void tcp_urg(struct sock *sk, struct sk_buff *skb, struct tcphdr *th)
                u32 ptr = tp->urg_seq - ntohl(th->seq) + (th->doff * 4) -
                          th->syn;
 
-               /* Is the urgent pointer pointing into this packet? */   
+               /* Is the urgent pointer pointing into this packet? */
                if (ptr < skb->len) {
                        u8 tmp;
                        if (skb_copy_bits(skb, ptr, &tmp, 1))
@@ -3835,7 +3835,7 @@ static int tcp_dma_try_early_copy(struct sock *sk, struct sk_buff *skb, int hlen
        int copied_early = 0;
 
        if (tp->ucopy.wakeup)
-               return 0;
+               return 0;
 
        if (!tp->ucopy.dma_chan && tp->ucopy.pinned_list)
                tp->ucopy.dma_chan = get_softnet_dma();
@@ -3871,26 +3871,26 @@ out:
 #endif /* CONFIG_NET_DMA */
 
 /*
- *     TCP receive function for the ESTABLISHED state. 
+ *     TCP receive function for the ESTABLISHED state.
  *
- *     It is split into a fast path and a slow path. The fast path is 
+ *     It is split into a fast path and a slow path. The fast path is
  *     disabled when:
  *     - A zero window was announced from us - zero window probing
- *        is only handled properly in the slow path. 
+ *        is only handled properly in the slow path.
  *     - Out of order segments arrived.
  *     - Urgent data is expected.
  *     - There is no buffer space left
  *     - Unexpected TCP flags/window values/header lengths are received
- *       (detected by checking the TCP header against pred_flags) 
+ *       (detected by checking the TCP header against pred_flags)
  *     - Data is sent in both directions. Fast path only supports pure senders
  *       or pure receivers (this means either the sequence number or the ack
  *       value must stay constant)
  *     - Unexpected TCP option.
  *
- *     When these conditions are not satisfied it drops into a standard 
+ *     When these conditions are not satisfied it drops into a standard
  *     receive procedure patterned after RFC793 to handle all cases.
  *     The first three cases are guaranteed by proper pred_flags setting,
- *     the rest is checked inline. Fast processing is turned on in 
+ *     the rest is checked inline. Fast processing is turned on in
  *     tcp_data_queue when everything is OK.
  */
 int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
@@ -3900,15 +3900,15 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
 
        /*
         *      Header prediction.
-        *      The code loosely follows the one in the famous 
+        *      The code loosely follows the one in the famous
         *      "30 instruction TCP receive" Van Jacobson mail.
-        *      
-        *      Van's trick is to deposit buffers into socket queue 
+        *
+        *      Van's trick is to deposit buffers into socket queue
         *      on a device interrupt, to call tcp_recv function
         *      on the receive process context and checksum and copy
         *      the buffer to user space. smart...
         *
-        *      Our current scheme is not silly either but we take the 
+        *      Our current scheme is not silly either but we take the
         *      extra cost of the net_bh soft interrupt processing...
         *      We do checksum and copy also but from device to kernel.
         */
@@ -3919,7 +3919,7 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
         *      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 
+        *  turn it off (when there are holes in the receive
         *       space for instance)
         *      PSH flag is ignored.
         */
@@ -3943,7 +3943,7 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
                                goto slow_path;
 
                        tp->rx_opt.saw_tstamp = 1;
-                       ++ptr; 
+                       ++ptr;
                        tp->rx_opt.rcv_tsval = ntohl(*ptr);
                        ++ptr;
                        tp->rx_opt.rcv_tsecr = ntohl(*ptr);
@@ -3975,7 +3975,7 @@ int tcp_rcv_established(struct sock *sk, struct sk_buff *skb,
                                 * on entry.
                                 */
                                tcp_ack(sk, skb, 0);
-                               __kfree_skb(skb); 
+                               __kfree_skb(skb);
                                tcp_data_snd_check(sk, tp);
                                return 0;
                        } else { /* Header too small */
@@ -4393,11 +4393,11 @@ reset_and_undo:
 
 /*
  *     This function implements the receiving procedure of RFC 793 for
- *     all states except ESTABLISHED and TIME_WAIT. 
+ *     all states except ESTABLISHED and TIME_WAIT.
  *     It's called from both tcp_v4_rcv and tcp_v6_rcv and should be
  *     address independent.
  */
-       
+
 int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
                          struct tcphdr *th, unsigned len)
 {
@@ -4422,19 +4422,19 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
                        if (icsk->icsk_af_ops->conn_request(sk, skb) < 0)
                                return 1;
 
-                       /* Now we have several options: In theory there is 
-                        * nothing else in the frame. KA9Q has an option to 
+                       /* Now we have several options: In theory there is
+                        * nothing else in the frame. KA9Q has an option to
                         * send data with the syn, BSD accepts data with the
-                        * syn up to the [to be] advertised window and 
-                        * Solaris 2.1 gives you a protocol error. For now 
-                        * we just ignore it, that fits the spec precisely 
+                        * syn up to the [to be] advertised window and
+                        * Solaris 2.1 gives you a protocol error. For now
+                        * we just ignore it, that fits the spec precisely
                         * and avoids incompatibilities. It would be nice in
                         * future to drop through and process the data.
                         *
-                        * Now that TTCP is starting to be used we ought to 
+                        * Now that TTCP is starting to be used we ought to
                         * queue this data.
                         * But, this leaves one open to an easy denial of
-                        * service attack, and SYN cookies can't defend
+                        * service attack, and SYN cookies can't defend
                         * against this problem. So, we drop the data
                         * in the interest of security over speed unless
                         * it's still in use.
@@ -4624,7 +4624,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
        case TCP_FIN_WAIT1:
        case TCP_FIN_WAIT2:
                /* RFC 793 says to queue data in these states,
-                * RFC 1122 says we MUST send a reset. 
+                * RFC 1122 says we MUST send a reset.
                 * BSD 4.4 also does reset.
                 */
                if (sk->sk_shutdown & RCV_SHUTDOWN) {
@@ -4636,7 +4636,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
                        }
                }
                /* Fall through */
-       case TCP_ESTABLISHED: 
+       case TCP_ESTABLISHED:
                tcp_data_queue(sk, skb);
                queued = 1;
                break;
@@ -4648,7 +4648,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb,
                tcp_ack_snd_check(sk);
        }
 
-       if (!queued) { 
+       if (!queued) {
 discard:
                __kfree_skb(skb);
        }
index f51d6404c61c982d96cc589af2cc15c911ac48e8..0ba74bbe7d30bc9a14dbeb865ff4eb7adb9f72b8 100644 (file)
@@ -303,7 +303,7 @@ static void do_pmtu_discovery(struct sock *sk, struct iphdr *iph, u32 mtu)
        /* We don't check in the destentry if pmtu discovery is forbidden
         * on this route. We just assume that no packet_to_big packets
         * are send back when pmtu discovery is not active.
-        * There is a small race when the user changes this flag in the
+        * There is a small race when the user changes this flag in the
         * route, but I think that's acceptable.
         */
        if ((dst = __sk_dst_check(sk, 0)) == NULL)
@@ -880,7 +880,7 @@ int tcp_v4_md5_do_add(struct sock *sk, __be32 addr,
 
                if (md5sig->alloced4 == md5sig->entries4) {
                        keys = kmalloc((sizeof(*keys) *
-                                       (md5sig->entries4 + 1)), GFP_ATOMIC);
+                                       (md5sig->entries4 + 1)), GFP_ATOMIC);
                        if (!keys) {
                                kfree(newkey);
                                tcp_free_md5sig_pool();
@@ -934,7 +934,7 @@ int tcp_v4_md5_do_del(struct sock *sk, __be32 addr)
                                memcpy(&tp->md5sig_info->keys4[i],
                                       &tp->md5sig_info->keys4[i+1],
                                       (tp->md5sig_info->entries4 - i) *
-                                       sizeof(struct tcp4_md5sig_key));
+                                       sizeof(struct tcp4_md5sig_key));
                        }
                        tcp_free_md5sig_pool();
                        return 0;
@@ -1388,7 +1388,7 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
                goto drop_and_free;
 
        if (want_cookie) {
-               reqsk_free(req);
+               reqsk_free(req);
        } else {
                inet_csk_reqsk_queue_hash_add(sk, req, TCP_TIMEOUT_INIT);
        }
@@ -1704,7 +1704,7 @@ bad_packet:
 discard_it:
        /* Discard frame. */
        kfree_skb(skb);
-       return 0;
+       return 0;
 
 discard_and_relse:
        sock_put(sk);
@@ -1890,10 +1890,10 @@ int tcp_v4_destroy_sock(struct sock *sk)
        tcp_cleanup_congestion_control(sk);
 
        /* Cleanup up the write buffer. */
-       sk_stream_writequeue_purge(sk);
+       sk_stream_writequeue_purge(sk);
 
        /* Cleans up our, hopefully empty, out_of_order_queue. */
-       __skb_queue_purge(&tp->out_of_order_queue);
+       __skb_queue_purge(&tp->out_of_order_queue);
 
 #ifdef CONFIG_TCP_MD5SIG
        /* Clean up the MD5 key list, if any */
@@ -1906,7 +1906,7 @@ int tcp_v4_destroy_sock(struct sock *sk)
 
 #ifdef CONFIG_NET_DMA
        /* Cleans up our sk_async_wait_queue */
-       __skb_queue_purge(&sk->sk_async_wait_queue);
+       __skb_queue_purge(&sk->sk_async_wait_queue);
 #endif
 
        /* Clean prequeue, it must be empty really */
@@ -1983,7 +1983,7 @@ get_req:
                st->state = TCP_SEQ_STATE_LISTENING;
                read_unlock_bh(&icsk->icsk_accept_queue.syn_wait_lock);
        } else {
-               icsk = inet_csk(sk);
+               icsk = inet_csk(sk);
                read_lock_bh(&icsk->icsk_accept_queue.syn_wait_lock);
                if (reqsk_queue_len(&icsk->icsk_accept_queue))
                        goto start_req;
@@ -1996,7 +1996,7 @@ get_sk:
                        cur = sk;
                        goto out;
                }
-               icsk = inet_csk(sk);
+               icsk = inet_csk(sk);
                read_lock_bh(&icsk->icsk_accept_queue.syn_wait_lock);
                if (reqsk_queue_len(&icsk->icsk_accept_queue)) {
 start_req:
index 4a3889dd194352a0e26f1f1c1b486ccad4c36a5c..30b1e520ad943442fc76f13cc5d3b6d27aa5d657 100644 (file)
@@ -64,7 +64,7 @@ static __inline__ int tcp_in_window(u32 seq, u32 end_seq, u32 s_win, u32 e_win)
        return (seq == e_win && seq == end_seq);
 }
 
-/* 
+/*
  * * Main purpose of TIME-WAIT state is to close connection gracefully,
  *   when one of ends sits in LAST-ACK or CLOSING retransmitting FIN
  *   (and, probably, tail of data) and one or more our ACKs are lost.
@@ -176,13 +176,13 @@ kill_with_rst:
         *      "When a connection is [...] on TIME-WAIT state [...]
         *      [a TCP] MAY accept a new SYN from the remote TCP to
         *      reopen the connection directly, if it:
-        *      
+        *
         *      (1)  assigns its initial sequence number for the new
         *      connection to be larger than the largest sequence
         *      number it used on the previous connection incarnation,
         *      and
         *
-        *      (2)  returns to TIME-WAIT state if the SYN turns out 
+        *      (2)  returns to TIME-WAIT state if the SYN turns out
         *      to be an old duplicate".
         */
 
@@ -266,9 +266,9 @@ kill:
        return TCP_TW_SUCCESS;
 }
 
-/* 
+/*
  * Move a socket to time-wait or dead fin-wait-2 state.
- */ 
+ */
 void tcp_time_wait(struct sock *sk, int state, int timeo)
 {
        struct inet_timewait_sock *tw = NULL;
@@ -481,7 +481,7 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req,
        return newsk;
 }
 
-/* 
+/*
  *     Process an incoming packet for SYN_RECV sockets represented
  *     as a request_sock.
  */
index 58b7111523f4a4540fbc9833347565e41d13b979..dc151139b5afbe642a2b9245f3795dc5d688f0f1 100644 (file)
@@ -198,7 +198,7 @@ void tcp_select_initial_window(int __space, __u32 mss,
        (*rcv_wscale) = 0;
        if (wscale_ok) {
                /* Set window scaling on max possible window
-                * See RFC1323 for an explanation of the limit to 14 
+                * See RFC1323 for an explanation of the limit to 14
                 */
                space = max_t(u32, sysctl_tcp_rmem[2], sysctl_rmem_max);
                space = min_t(u32, space, *window_clamp);
@@ -451,7 +451,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
                                    (tp->rx_opt.eff_sacks *
                                     TCPOLEN_SACK_PERBLOCK));
        }
-               
+
        if (tcp_packets_in_flight(tp) == 0)
                tcp_ca_event(sk, CA_EVENT_TX_START);
 
@@ -481,7 +481,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
                /* RFC1323: The window in SYN & SYN/ACK segments
                 * is never scaled.
                 */
-               th->window      = htons(tp->rcv_wnd);
+               th->window      = htons(min(tp->rcv_wnd, 65535U));
        } else {
                th->window      = htons(tcp_select_window(sk));
        }
@@ -555,7 +555,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
 }
 
 
-/* This routine just queue's the buffer 
+/* This routine just queue's the buffer
  *
  * NOTE: probe0 timer is not checked, do not forget tcp_push_pending_frames,
  * otherwise socket can stall.
@@ -597,7 +597,7 @@ static void tcp_set_skb_tso_segs(struct sock *sk, struct sk_buff *skb, unsigned
 
 /* Function to create two new TCP segments.  Shrinks the given segment
  * to the specified size and appends a new segment with the rest of the
- * packet to the list.  This won't be called frequently, I hope. 
+ * packet to the list.  This won't be called frequently, I hope.
  * Remember, these are still headerless SKBs at this point.
  */
 int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss_now)
@@ -610,7 +610,7 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss
 
        BUG_ON(len > skb->len);
 
-       clear_all_retrans_hints(tp);
+       clear_all_retrans_hints(tp);
        nsize = skb_headlen(skb) - len;
        if (nsize < 0)
                nsize = 0;
@@ -821,7 +821,7 @@ void tcp_mtup_init(struct sock *sk)
 
        icsk->icsk_mtup.enabled = sysctl_tcp_mtu_probing > 1;
        icsk->icsk_mtup.search_high = tp->rx_opt.mss_clamp + sizeof(struct tcphdr) +
-                              icsk->icsk_af_ops->net_header_len;
+                              icsk->icsk_af_ops->net_header_len;
        icsk->icsk_mtup.search_low = tcp_mss_to_mtu(sk, sysctl_tcp_base_mss);
        icsk->icsk_mtup.probe_size = 0;
 }
@@ -1008,7 +1008,7 @@ static inline int tcp_minshall_check(const struct tcp_sock *tp)
  */
 
 static inline int tcp_nagle_check(const struct tcp_sock *tp,
-                                 const struct sk_buff *skb, 
+                                 const struct sk_buff *skb,
                                  unsigned mss_now, int nonagle)
 {
        return (skb->len < mss_now &&
@@ -1078,7 +1078,7 @@ static unsigned int tcp_snd_test(struct sock *sk, struct sk_buff *skb,
        return cwnd_quota;
 }
 
-static inline int tcp_skb_is_last(const struct sock *sk, 
+static inline int tcp_skb_is_last(const struct sock *sk,
                                  const struct sk_buff *skb)
 {
        return skb->next == (struct sk_buff *)&sk->sk_write_queue;
@@ -1298,7 +1298,7 @@ static int tcp_mtu_probe(struct sock *sk)
                        skb_copy_bits(skb, 0, skb_put(nskb, copy), copy);
                else
                        nskb->csum = skb_copy_and_csum_bits(skb, 0,
-                                        skb_put(nskb, copy), copy, nskb->csum);
+                                        skb_put(nskb, copy), copy, nskb->csum);
 
                if (skb->len <= copy) {
                        /* We've eaten all the data from this skb.
@@ -1308,7 +1308,7 @@ static int tcp_mtu_probe(struct sock *sk)
                        sk_stream_free_skb(sk, skb);
                } else {
                        TCP_SKB_CB(nskb)->flags |= TCP_SKB_CB(skb)->flags &
-                                                  ~(TCPCB_FLAG_FIN|TCPCB_FLAG_PSH);
+                                                  ~(TCPCB_FLAG_FIN|TCPCB_FLAG_PSH);
                        if (!skb_shinfo(skb)->nr_frags) {
                                skb_pull(skb, copy);
                                if (skb->ip_summed != CHECKSUM_PARTIAL)
@@ -1501,7 +1501,7 @@ void tcp_push_one(struct sock *sk, unsigned int mss_now)
 
 /* This function returns the amount that we can raise the
  * usable window based on the following constraints
- *  
+ *
  * 1. The window can never be shrunk once it is offered (RFC 793)
  * 2. We limit memory per socket
  *
@@ -1520,12 +1520,12 @@ void tcp_push_one(struct sock *sk, unsigned int mss_now)
  * side SWS prevention criteria. The problem is that under this rule
  * a stream of single byte packets will cause the right side of the
  * window to always advance by a single byte.
- * 
+ *
  * Of course, if the sender implements sender side SWS prevention
  * then this will not be a problem.
- * 
+ *
  * BSD seems to make the following compromise:
- * 
+ *
  *     If the free space is less than the 1/4 of the maximum
  *     space available and the free space is less than 1/2 mss,
  *     then set the window to 0.
@@ -1567,7 +1567,7 @@ u32 __tcp_select_window(struct sock *sk)
        int window;
 
        if (mss > full_space)
-               mss = full_space; 
+               mss = full_space;
 
        if (free_space < full_space/2) {
                icsk->icsk_ack.quick = 0;
@@ -1691,9 +1691,9 @@ static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *skb, int m
 }
 
 /* Do a simple retransmit without using the backoff mechanisms in
- * tcp_timer. This is used for path mtu discovery. 
+ * tcp_timer. This is used for path mtu discovery.
  * The socket is already locked here.
- */ 
+ */
 void tcp_simple_retransmit(struct sock *sk)
 {
        const struct inet_connection_sock *icsk = inet_csk(sk);
@@ -1703,7 +1703,7 @@ void tcp_simple_retransmit(struct sock *sk)
        int lost = 0;
 
        sk_stream_for_retrans_queue(skb, sk) {
-               if (skb->len > mss && 
+               if (skb->len > mss &&
                    !(TCP_SKB_CB(skb)->sacked&TCPCB_SACKED_ACKED)) {
                        if (TCP_SKB_CB(skb)->sacked&TCPCB_SACKED_RETRANS) {
                                TCP_SKB_CB(skb)->sacked &= ~TCPCB_SACKED_RETRANS;
@@ -1724,7 +1724,7 @@ void tcp_simple_retransmit(struct sock *sk)
 
        tcp_sync_left_out(tp);
 
-       /* Don't muck with the congestion window here.
+       /* Don't muck with the congestion window here.
         * Reason is that we do not increase amount of _data_
         * in network, but units changed and effective
         * cwnd/ssthresh really reduced now.
@@ -1747,7 +1747,7 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)
 {
        struct tcp_sock *tp = tcp_sk(sk);
        struct inet_connection_sock *icsk = inet_csk(sk);
-       unsigned int cur_mss = tcp_current_mss(sk, 0);
+       unsigned int cur_mss = tcp_current_mss(sk, 0);
        int err;
 
        /* Inconslusive MTU probe */
@@ -1984,10 +1984,10 @@ void tcp_xmit_retransmit_queue(struct sock *sk)
  */
 void tcp_send_fin(struct sock *sk)
 {
-       struct tcp_sock *tp = tcp_sk(sk);       
+       struct tcp_sock *tp = tcp_sk(sk);
        struct sk_buff *skb = skb_peek_tail(&sk->sk_write_queue);
        int mss_now;
-       
+
        /* Optimization, tack on the FIN if we have a queue of
         * unsent frames.  But be careful about outgoing SACKS
         * and IP options.
@@ -2146,21 +2146,21 @@ struct sk_buff * tcp_make_synack(struct sock *sk, struct dst_entry *dst,
        th->seq = htonl(TCP_SKB_CB(skb)->seq);
        th->ack_seq = htonl(tcp_rsk(req)->rcv_isn + 1);
        if (req->rcv_wnd == 0) { /* ignored for retransmitted syns */
-               __u8 rcv_wscale; 
+               __u8 rcv_wscale;
                /* Set this up on the first call only */
                req->window_clamp = tp->window_clamp ? : dst_metric(dst, RTAX_WINDOW);
                /* tcp_full_space because it is guaranteed to be the first packet */
-               tcp_select_initial_window(tcp_full_space(sk), 
+               tcp_select_initial_window(tcp_full_space(sk),
                        dst_metric(dst, RTAX_ADVMSS) - (ireq->tstamp_ok ? TCPOLEN_TSTAMP_ALIGNED : 0),
                        &req->rcv_wnd,
                        &req->window_clamp,
                        ireq->wscale_ok,
                        &rcv_wscale);
-               ireq->rcv_wscale = rcv_wscale; 
+               ireq->rcv_wscale = rcv_wscale;
        }
 
        /* RFC1323: The window in SYN & SYN/ACK segments is never scaled. */
-       th->window = htons(req->rcv_wnd);
+       th->window = htons(min(req->rcv_wnd, 65535U));
 
        TCP_SKB_CB(skb)->when = tcp_time_stamp;
        tcp_syn_build_options((__be32 *)(th + 1), dst_metric(dst, RTAX_ADVMSS), ireq->tstamp_ok,
@@ -2192,9 +2192,9 @@ struct sk_buff * tcp_make_synack(struct sock *sk, struct dst_entry *dst,
        return skb;
 }
 
-/* 
+/*
  * Do all connect socket setups that can be done AF independent.
- */ 
+ */
 static void tcp_connect_init(struct sock *sk)
 {
        struct dst_entry *dst = __sk_dst_get(sk);
@@ -2251,7 +2251,7 @@ static void tcp_connect_init(struct sock *sk)
 
 /*
  * Build a SYN and send it off.
- */ 
+ */
 int tcp_connect(struct sock *sk)
 {
        struct tcp_sock *tp = tcp_sk(sk);
@@ -2409,7 +2409,7 @@ static int tcp_xmit_probe_skb(struct sock *sk, int urgent)
 
        /* We don't queue it, tcp_transmit_skb() sets ownership. */
        skb = alloc_skb(MAX_TCP_HEADER, GFP_ATOMIC);
-       if (skb == NULL) 
+       if (skb == NULL)
                return -1;
 
        /* Reserve space for headers and set control bits. */
@@ -2498,7 +2498,7 @@ void tcp_send_probe0(struct sock *sk)
                if (icsk->icsk_backoff < sysctl_tcp_retries2)
                        icsk->icsk_backoff++;
                icsk->icsk_probes_out++;
-               inet_csk_reset_xmit_timer(sk, ICSK_TIME_PROBE0, 
+               inet_csk_reset_xmit_timer(sk, ICSK_TIME_PROBE0,
                                          min(icsk->icsk_rto << icsk->icsk_backoff, TCP_RTO_MAX),
                                          TCP_RTO_MAX);
        } else {
@@ -2510,7 +2510,7 @@ void tcp_send_probe0(struct sock *sk)
                 */
                if (!icsk->icsk_probes_out)
                        icsk->icsk_probes_out = 1;
-               inet_csk_reset_xmit_timer(sk, ICSK_TIME_PROBE0, 
+               inet_csk_reset_xmit_timer(sk, ICSK_TIME_PROBE0,
                                          min(icsk->icsk_rto << icsk->icsk_backoff,
                                              TCP_RESOURCE_PROBE_INTERVAL),
                                          TCP_RTO_MAX);
index 41c157848181f2e8bdc5104f9b01992d81bc16a9..61f406f27294e0079a0f60d8465a882dca99f2a9 100644 (file)
@@ -143,7 +143,7 @@ out_free:
        return error ? error : cnt;
 }
 
-static struct file_operations tcpprobe_fops = {
+static const struct file_operations tcpprobe_fops = {
        .owner   = THIS_MODULE,
        .open    = tcpprobe_open,
        .read    = tcpprobe_read,
index 3355c276b61146d561a073f6f4c98063cd15b3bd..a9243cfc1beadfa942184935cbe830d62e6fd0fc 100644 (file)
@@ -69,7 +69,7 @@ static int tcp_out_of_resources(struct sock *sk, int do_reset)
        struct tcp_sock *tp = tcp_sk(sk);
        int orphans = atomic_read(&tcp_orphan_count);
 
-       /* If peer does not open window for long time, or did not transmit 
+       /* If peer does not open window for long time, or did not transmit
         * anything for long time, penalize it. */
        if ((s32)(tcp_time_stamp - tp->lsndtime) > 2*TCP_RTO_MAX || !do_reset)
                orphans <<= 1;
@@ -137,7 +137,7 @@ static int tcp_write_timeout(struct sock *sk)
                                        tcp_sync_mss(sk, icsk->icsk_pmtu_cookie);
                                } else {
                                        mss = min(sysctl_tcp_base_mss,
-                                                 tcp_mtu_to_mss(sk, icsk->icsk_mtup.search_low)/2);
+                                                 tcp_mtu_to_mss(sk, icsk->icsk_mtup.search_low)/2);
                                        mss = max(mss, 68 - tp->tcp_header_len);
                                        icsk->icsk_mtup.search_low = tcp_mss_to_mtu(sk, mss);
                                        tcp_sync_mss(sk, icsk->icsk_pmtu_cookie);
@@ -150,7 +150,7 @@ static int tcp_write_timeout(struct sock *sk)
                retry_until = sysctl_tcp_retries2;
                if (sock_flag(sk, SOCK_DEAD)) {
                        const int alive = (icsk->icsk_rto < TCP_RTO_MAX);
+
                        retry_until = tcp_orphan_retries(sk, alive);
 
                        if (tcp_out_of_resources(sk, alive || icsk->icsk_retransmits < retry_until))
@@ -257,7 +257,7 @@ static void tcp_probe_timer(struct sock *sk)
 
        if (sock_flag(sk, SOCK_DEAD)) {
                const int alive = ((icsk->icsk_rto << icsk->icsk_backoff) < TCP_RTO_MAX);
+
                max_probes = tcp_orphan_retries(sk, alive);
 
                if (tcp_out_of_resources(sk, alive || icsk->icsk_probes_out <= max_probes))
@@ -453,7 +453,7 @@ static void tcp_keepalive_timer (unsigned long data)
        /* Only process if socket is not in use. */
        bh_lock_sock(sk);
        if (sock_owned_by_user(sk)) {
-               /* Try again later. */ 
+               /* Try again later. */
                inet_csk_reset_keepalive_timer (sk, HZ/20);
                goto out;
        }
@@ -515,7 +515,7 @@ resched:
        inet_csk_reset_keepalive_timer (sk, elapsed);
        goto out;
 
-death: 
+death:
        tcp_done(sk);
 
 out:
index ddc4bcc5785eed2737c2ddca93422026f86c3e0f..5c484dceb9675b7563dcf41faeb58eb38d17742c 100644 (file)
@@ -330,9 +330,9 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack,
                vegas->minRTT = 0x7fffffff;
        }
        /* Use normal slow start */
-       else if (tp->snd_cwnd <= tp->snd_ssthresh) 
+       else if (tp->snd_cwnd <= tp->snd_ssthresh)
                tcp_slow_start(tp);
-       
+
 }
 
 /* Extract info for Tcp socket info provided via netlink. */
index 4f42a86c77f377deb3972838e4737e4cf1006788..4e1b61032a9cb4d7bcbae5ce4980cd1362f56353 100644 (file)
@@ -63,10 +63,10 @@ static void tcp_westwood_init(struct sock *sk)
        struct westwood *w = inet_csk_ca(sk);
 
        w->bk = 0;
-        w->bw_ns_est = 0;
-        w->bw_est = 0;
-        w->accounted = 0;
-        w->cumul_ack = 0;
+       w->bw_ns_est = 0;
+       w->bw_est = 0;
+       w->accounted = 0;
+       w->cumul_ack = 0;
        w->reset_rtt_min = 1;
        w->rtt_min = w->rtt = TCP_WESTWOOD_INIT_RTT;
        w->rtt_win_sx = tcp_time_stamp;
@@ -121,7 +121,7 @@ static void westwood_update_window(struct sock *sk)
         * to fix mismatch between tp->snd_una and w->snd_una for the first
         * bandwidth sample
         */
-        if (w->first_ack) {
+       if (w->first_ack) {
                w->snd_una = tcp_sk(sk)->snd_una;
                w->first_ack = 0;
        }
@@ -147,7 +147,7 @@ static inline void update_rtt_min(struct westwood *w)
 {
        if (w->reset_rtt_min) {
                w->rtt_min = w->rtt;
-               w->reset_rtt_min = 0;   
+               w->reset_rtt_min = 0;
        } else
                w->rtt_min = min(w->rtt, w->rtt_min);
 }
@@ -183,15 +183,15 @@ static inline u32 westwood_acked_count(struct sock *sk)
 
        w->cumul_ack = tp->snd_una - w->snd_una;
 
-        /* If cumul_ack is 0 this is a dupack since it's not moving
-         * tp->snd_una.
-         */
-        if (!w->cumul_ack) {
+       /* If cumul_ack is 0 this is a dupack since it's not moving
+        * tp->snd_una.
+        */
+       if (!w->cumul_ack) {
                w->accounted += tp->mss_cache;
                w->cumul_ack = tp->mss_cache;
        }
 
-        if (w->cumul_ack > tp->mss_cache) {
+       if (w->cumul_ack > tp->mss_cache) {
                /* Partial or delayed ack */
                if (w->accounted >= w->cumul_ack) {
                        w->accounted -= w->cumul_ack;
@@ -237,7 +237,7 @@ static void tcp_westwood_event(struct sock *sk, enum tcp_ca_event event)
 
        case CA_EVENT_FRTO:
                tp->snd_ssthresh = tcp_westwood_bw_rttmin(sk);
-               /* Update RTT_min when next ack arrives */
+               /* Update RTT_min when next ack arrives */
                w->reset_rtt_min = 1;
                break;
 
index 8d30c48f090e59dd9ac96b40252b0ac4c9099246..a794a8ca8b4fd86e1b501448eab60a2a5a99e1bb 100644 (file)
 #include <net/xfrm.h>
 
 static struct xfrm_tunnel *tunnel4_handlers;
+static struct xfrm_tunnel *tunnel64_handlers;
 static DEFINE_MUTEX(tunnel4_mutex);
 
-int xfrm4_tunnel_register(struct xfrm_tunnel *handler)
+int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family)
 {
        struct xfrm_tunnel **pprev;
        int ret = -EEXIST;
@@ -24,7 +25,8 @@ int xfrm4_tunnel_register(struct xfrm_tunnel *handler)
 
        mutex_lock(&tunnel4_mutex);
 
-       for (pprev = &tunnel4_handlers; *pprev; pprev = &(*pprev)->next) {
+       for (pprev = (family == AF_INET) ? &tunnel4_handlers : &tunnel64_handlers;
+            *pprev; pprev = &(*pprev)->next) {
                if ((*pprev)->priority > priority)
                        break;
                if ((*pprev)->priority == priority)
@@ -44,14 +46,15 @@ err:
 
 EXPORT_SYMBOL(xfrm4_tunnel_register);
 
-int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler)
+int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family)
 {
        struct xfrm_tunnel **pprev;
        int ret = -ENOENT;
 
        mutex_lock(&tunnel4_mutex);
 
-       for (pprev = &tunnel4_handlers; *pprev; pprev = &(*pprev)->next) {
+       for (pprev = (family == AF_INET) ? &tunnel4_handlers : &tunnel64_handlers;
+            *pprev; pprev = &(*pprev)->next) {
                if (*pprev == handler) {
                        *pprev = handler->next;
                        ret = 0;
@@ -86,6 +89,26 @@ drop:
        return 0;
 }
 
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+static int tunnel64_rcv(struct sk_buff *skb)
+{
+       struct xfrm_tunnel *handler;
+
+       if (!pskb_may_pull(skb, sizeof(struct iphdr)))
+               goto drop;
+
+       for (handler = tunnel64_handlers; handler; handler = handler->next)
+               if (!handler->handler(skb))
+                       return 0;
+
+       icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0);
+
+drop:
+       kfree_skb(skb);
+       return 0;
+}
+#endif
+
 static void tunnel4_err(struct sk_buff *skb, u32 info)
 {
        struct xfrm_tunnel *handler;
@@ -101,17 +124,36 @@ static struct net_protocol tunnel4_protocol = {
        .no_policy      =       1,
 };
 
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+static struct net_protocol tunnel64_protocol = {
+       .handler        =       tunnel64_rcv,
+       .err_handler    =       tunnel4_err,
+       .no_policy      =       1,
+};
+#endif
+
 static int __init tunnel4_init(void)
 {
        if (inet_add_protocol(&tunnel4_protocol, IPPROTO_IPIP)) {
                printk(KERN_ERR "tunnel4 init: can't add protocol\n");
                return -EAGAIN;
        }
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+       if (inet_add_protocol(&tunnel64_protocol, IPPROTO_IPV6)) {
+               printk(KERN_ERR "tunnel64 init: can't add protocol\n");
+               inet_del_protocol(&tunnel4_protocol, IPPROTO_IPIP);
+               return -EAGAIN;
+       }
+#endif
        return 0;
 }
 
 static void __exit tunnel4_fini(void)
 {
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+       if (inet_del_protocol(&tunnel64_protocol, IPPROTO_IPV6))
+               printk(KERN_ERR "tunnel64 close: can't remove protocol\n");
+#endif
        if (inet_del_protocol(&tunnel4_protocol, IPPROTO_IPIP))
                printk(KERN_ERR "tunnel4 close: can't remove protocol\n");
 }
index 8b54c68a0d12d987596f5edca96699dcc8c9c348..ce6c46034314b35a3d17d2d18d35b0538cfe5116 100644 (file)
@@ -20,8 +20,8 @@
  *                                     for udp at least is 'valid'.
  *             Alan Cox        :       Fixed icmp handling properly
  *             Alan Cox        :       Correct error for oversized datagrams
- *             Alan Cox        :       Tidied select() semantics. 
- *             Alan Cox        :       udp_err() fixed properly, also now 
+ *             Alan Cox        :       Tidied select() semantics.
+ *             Alan Cox        :       udp_err() fixed properly, also now
  *                                     select and read wake correctly on errors
  *             Alan Cox        :       udp_send verify_area moved to avoid mem leak
  *             Alan Cox        :       UDP can count its memory
@@ -56,7 +56,7 @@
  *                                     does have a high hit rate.
  *             Olaf Kirch      :       Don't linearise iovec on sendmsg.
  *             Andi Kleen      :       Some cleanups, cache destination entry
- *                                     for connect. 
+ *                                     for connect.
  *     Vitaly E. Lavrov        :       Transparent proxy revived after year coma.
  *             Melvin Smith    :       Check msg_name not msg_namelen in sendto(),
  *                                     return ENOTCONN for unconnected sockets (POSIX)
@@ -77,7 +77,7 @@
  *             as published by the Free Software Foundation; either version
  *             2 of the License, or (at your option) any later version.
  */
+
 #include <asm/system.h>
 #include <asm/uaccess.h>
 #include <asm/ioctls.h>
@@ -120,7 +120,7 @@ static inline int __udp_lib_lport_inuse(__u16 num, struct hlist_head udptable[])
        struct hlist_node *node;
 
        sk_for_each(sk, node, &udptable[num & (UDP_HTABLE_SIZE - 1)])
-               if (inet_sk(sk)->num == num)
+               if (sk->sk_hash == num)
                        return 1;
        return 0;
 }
@@ -191,7 +191,7 @@ gotit:
                head = &udptable[snum & (UDP_HTABLE_SIZE - 1)];
 
                sk_for_each(sk2, node, head)
-                       if (inet_sk(sk2)->num == snum                        &&
+                       if (sk2->sk_hash == snum                             &&
                            sk2 != sk                                        &&
                            (!sk2->sk_reuse        || !sk->sk_reuse)         &&
                            (!sk2->sk_bound_dev_if || !sk->sk_bound_dev_if
@@ -200,6 +200,7 @@ gotit:
                                goto fail;
        }
        inet_sk(sk)->num = snum;
+       sk->sk_hash = snum;
        if (sk_unhashed(sk)) {
                head = &udptable[snum & (UDP_HTABLE_SIZE - 1)];
                sk_add_node(sk, head);
@@ -247,7 +248,7 @@ static struct sock *__udp4_lib_lookup(__be32 saddr, __be16 sport,
        sk_for_each(sk, node, &udptable[hnum & (UDP_HTABLE_SIZE - 1)]) {
                struct inet_sock *inet = inet_sk(sk);
 
-               if (inet->num == hnum && !ipv6_only_sock(sk)) {
+               if (sk->sk_hash == hnum && !ipv6_only_sock(sk)) {
                        int score = (sk->sk_family == PF_INET ? 1 : 0);
                        if (inet->rcv_saddr) {
                                if (inet->rcv_saddr != daddr)
@@ -296,7 +297,7 @@ static inline struct sock *udp_v4_mcast_next(struct sock *sk,
        sk_for_each_from(s, node) {
                struct inet_sock *inet = inet_sk(s);
 
-               if (inet->num != hnum                                   ||
+               if (s->sk_hash != hnum                                  ||
                    (inet->daddr && inet->daddr != rmt_addr)            ||
                    (inet->dport != rmt_port && inet->dport)            ||
                    (inet->rcv_saddr && inet->rcv_saddr != loc_addr)    ||
@@ -306,17 +307,17 @@ static inline struct sock *udp_v4_mcast_next(struct sock *sk,
                if (!ip_mc_sf_allow(s, loc_addr, rmt_addr, dif))
                        continue;
                goto found;
-       }
+       }
        s = NULL;
 found:
-       return s;
+       return s;
 }
 
 /*
  * This routine is called by the ICMP module when it gets some
  * sort of error condition.  If err < 0 then the socket should
  * be closed and the error returned to the user.  If err > 0
- * it's just the icmp type << 8 | icmp code.  
+ * it's just the icmp type << 8 | icmp code.
  * Header points to the ip header of the error packet. We move
  * on past this. Then (as it used to claim before adjustment)
  * header points to the first 8 bytes of the udp header.  We need
@@ -338,7 +339,7 @@ void __udp4_lib_err(struct sk_buff *skb, u32 info, struct hlist_head udptable[])
                               skb->dev->ifindex, udptable                  );
        if (sk == NULL) {
                ICMP_INC_STATS_BH(ICMP_MIB_INERRORS);
-               return; /* No socket for error */
+               return; /* No socket for error */
        }
 
        err = 0;
@@ -374,7 +375,7 @@ void __udp4_lib_err(struct sk_buff *skb, u32 info, struct hlist_head udptable[])
        }
 
        /*
-        *      RFC1122: OK.  Passes ICMP errors back to application, as per 
+        *      RFC1122: OK.  Passes ICMP errors back to application, as per
         *      4.1.3.3.
         */
        if (!inet->recverr) {
@@ -524,7 +525,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
        if (len > 0xFFFF)
                return -EMSGSIZE;
 
-       /* 
+       /*
         *      Check the flags.
         */
 
@@ -536,7 +537,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
        if (up->pending) {
                /*
                 * There are pending frames.
-                * The socket lock must be held while it's corked.
+                * The socket lock must be held while it's corked.
                 */
                lock_sock(sk);
                if (likely(up->pending)) {
@@ -544,14 +545,14 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                                release_sock(sk);
                                return -EINVAL;
                        }
-                       goto do_append_data;
+                       goto do_append_data;
                }
                release_sock(sk);
        }
        ulen += sizeof(struct udphdr);
 
        /*
-        *      Get and verify the address. 
+        *      Get and verify the address.
         */
        if (msg->msg_name) {
                struct sockaddr_in * usin = (struct sockaddr_in*)msg->msg_name;
@@ -575,7 +576,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
                   Route will not be used, if at least one option is set.
                 */
                connected = 1;
-       }
+       }
        ipc.addr = inet->saddr;
 
        ipc.oif = sk->sk_bound_dev_if;
@@ -601,7 +602,7 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
        }
        tos = RT_TOS(inet->tos);
        if (sock_flag(sk, SOCK_LOCALROUTE) ||
-           (msg->msg_flags & MSG_DONTROUTE) || 
+           (msg->msg_flags & MSG_DONTROUTE) ||
            (ipc.opt && ipc.opt->is_strictroute)) {
                tos |= RTO_ONLINK;
                connected = 0;
@@ -761,10 +762,10 @@ out:
 /*
  *     IOCTL requests applicable to the UDP protocol
  */
+
 int udp_ioctl(struct sock *sk, int cmd, unsigned long arg)
 {
-       switch(cmd) 
+       switch(cmd)
        {
                case SIOCOUTQ:
                {
@@ -804,11 +805,11 @@ int udp_ioctl(struct sock *sk, int cmd, unsigned long arg)
  */
 
 int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
-               size_t len, int noblock, int flags, int *addr_len)
+               size_t len, int noblock, int flags, int *addr_len)
 {
        struct inet_sock *inet = inet_sk(sk);
-       struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name;
-       struct sk_buff *skb;
+       struct sockaddr_in *sin = (struct sockaddr_in *)msg->msg_name;
+       struct sk_buff *skb;
        int copied, err, copy_only, is_udplite = IS_UDPLITE(sk);
 
        /*
@@ -824,8 +825,8 @@ try_again:
        skb = skb_recv_datagram(sk, flags, noblock, &err);
        if (!skb)
                goto out;
-  
-       copied = skb->len - sizeof(struct udphdr);
+
+       copied = skb->len - sizeof(struct udphdr);
        if (copied > len) {
                copied = len;
                msg->msg_flags |= MSG_TRUNC;
@@ -868,18 +869,18 @@ try_again:
                sin->sin_port = skb->h.uh->source;
                sin->sin_addr.s_addr = skb->nh.iph->saddr;
                memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
-       }
+       }
        if (inet->cmsg_flags)
                ip_cmsg_recv(msg, skb);
 
        err = copied;
        if (flags & MSG_TRUNC)
                err = skb->len - sizeof(struct udphdr);
-  
+
 out_free:
-       skb_free_datagram(sk, skb);
+       skb_free_datagram(sk, skb);
 out:
-       return err;
+       return err;
 
 csum_copy_err:
        UDP_INC_STATS_BH(UDP_MIB_INERRORS, is_udplite);
@@ -887,7 +888,7 @@ csum_copy_err:
        skb_kill_datagram(sk, skb, flags);
 
        if (noblock)
-               return -EAGAIN; 
+               return -EAGAIN;
        goto try_again;
 }
 
@@ -898,7 +899,7 @@ int udp_disconnect(struct sock *sk, int flags)
        /*
         *      1003.1g - break association.
         */
-        
+
        sk->sk_state = TCP_CLOSE;
        inet->daddr = 0;
        inet->dport = 0;
@@ -922,13 +923,13 @@ int udp_disconnect(struct sock *sk, int flags)
 static int udp_encap_rcv(struct sock * sk, struct sk_buff *skb)
 {
 #ifndef CONFIG_XFRM
-       return 1; 
+       return 1;
 #else
        struct udp_sock *up = udp_sk(sk);
-       struct udphdr *uh;
+       struct udphdr *uh;
        struct iphdr *iph;
        int iphlen, len;
-  
+
        __u8 *udpdata;
        __be32 *udpdata32;
        __u16 encap_type = up->encap_type;
@@ -971,7 +972,7 @@ static int udp_encap_rcv(struct sock * sk, struct sk_buff *skb)
                        return 0;
                } else if (len > 2 * sizeof(u32) + sizeof(struct ip_esp_hdr) &&
                           udpdata32[0] == 0 && udpdata32[1] == 0) {
-                       
+
                        /* ESP Packet with Non-IKE marker */
                        len = sizeof(struct udphdr) + 2 * sizeof(u32);
                } else
@@ -1187,14 +1188,14 @@ static inline void udp4_csum_init(struct sk_buff *skb, struct udphdr *uh)
 }
 
 /*
- *     All we need to do is get the socket, and then do a checksum. 
+ *     All we need to do is get the socket, and then do a checksum.
  */
+
 int __udp4_lib_rcv(struct sk_buff *skb, struct hlist_head udptable[],
                   int is_udplite)
 {
-       struct sock *sk;
-       struct udphdr *uh = skb->h.uh;
+       struct sock *sk;
+       struct udphdr *uh = skb->h.uh;
        unsigned short ulen;
        struct rtable *rt = (struct rtable*)skb->dst;
        __be32 saddr = skb->nh.iph->saddr;
@@ -1270,9 +1271,9 @@ short_packet:
        goto drop;
 
 csum_error:
-       /* 
-        * RFC1122: OK.  Discards the bad packet silently (as far as 
-        * the network is concerned, anyway) as per 4.1.3.4 (MUST). 
+       /*
+        * RFC1122: OK.  Discards the bad packet silently (as far as
+        * the network is concerned, anyway) as per 4.1.3.4 (MUST).
         */
        LIMIT_NETDEBUG(KERN_DEBUG "UDP%s: bad checksum. From %d.%d.%d.%d:%d to %d.%d.%d.%d:%d ulen %d\n",
                       is_udplite? "-Lite" : "",
@@ -1328,7 +1329,7 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
                        release_sock(sk);
                }
                break;
-               
+
        case UDP_ENCAP:
                switch (val) {
                case 0:
@@ -1356,8 +1357,8 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
                up->pcflag |= UDPLITE_SEND_CC;
                break;
 
-        /* The receiver specifies a minimum checksum coverage value. To make
-         * sense, this should be set to at least 8 (as done below). If zero is
+       /* The receiver specifies a minimum checksum coverage value. To make
+        * sense, this should be set to at least 8 (as done below). If zero is
         * used, this again means full checksum coverage.                     */
        case UDPLITE_RECV_CSCOV:
                if (!up->pcflag)         /* Disable the option on UDP sockets */
@@ -1406,7 +1407,7 @@ int udp_lib_getsockopt(struct sock *sk, int level, int optname,
                return -EFAULT;
 
        len = min_t(unsigned int, len, sizeof(int));
-       
+
        if(len < 0)
                return -EINVAL;
 
@@ -1433,11 +1434,11 @@ int udp_lib_getsockopt(struct sock *sk, int level, int optname,
                return -ENOPROTOOPT;
        };
 
-       if(put_user(len, optlen))
-               return -EFAULT;
+       if(put_user(len, optlen))
+               return -EFAULT;
        if(copy_to_user(optval, &val,len))
                return -EFAULT;
-       return 0;
+       return 0;
 }
 
 int udp_getsockopt(struct sock *sk, int level, int optname,
@@ -1463,7 +1464,7 @@ int compat_udp_getsockopt(struct sock *sk, int level, int optname,
  *     @sock - socket
  *     @wait - poll table
  *
- *     This is same as datagram poll, except for the special case of 
+ *     This is same as datagram poll, except for the special case of
  *     blocking sockets. If application is using a blocking fd
  *     and a packet with checksum error is in the queue;
  *     then it could get return from select indicating data available
@@ -1502,11 +1503,11 @@ unsigned int udp_poll(struct file *file, struct socket *sock, poll_table *wait)
        }
 
        return mask;
-       
+
 }
 
 struct proto udp_prot = {
-       .name              = "UDP",
+       .name              = "UDP",
        .owner             = THIS_MODULE,
        .close             = udp_lib_close,
        .connect           = ip4_datagram_connect,
@@ -1670,7 +1671,7 @@ static void udp4_format_sock(struct sock *sp, char *tmpbuf, int bucket)
 
        sprintf(tmpbuf, "%4d: %08X:%04X %08X:%04X"
                " %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p",
-               bucket, src, srcp, dest, destp, sp->sk_state, 
+               bucket, src, srcp, dest, destp, sp->sk_state,
                atomic_read(&sp->sk_wmem_alloc),
                atomic_read(&sp->sk_rmem_alloc),
                0, 0L, 0, sock_i_uid(sp), 0, sock_i_ino(sp),
index f6f4277ba6dc8ce23d9cf1d878a4ca3916106d8b..820a477cfaa6e9899234b03ee8120c9ca158babd 100644 (file)
@@ -10,7 +10,7 @@ extern void   __udp4_lib_err(struct sk_buff *, u32, struct hlist_head []);
 
 extern int     __udp_lib_get_port(struct sock *sk, unsigned short snum,
                                   struct hlist_head udptable[], int *port_rover,
-                                  int (*)(const struct sock*,const struct sock*));
+                                  int (*)(const struct sock*,const struct sock*));
 extern int     ipv4_rcv_saddr_equal(const struct sock *, const struct sock *);
 
 
index 8655d038364cba364880f8cb9595e94708fe14db..78e80deb7e89a25780d74a7e1691b73bb7e06b53 100644 (file)
@@ -6,7 +6,7 @@
  *             Split up af-specific portion
  *     Derek Atkins <derek@ihtfp.com>
  *             Add Encapsulation support
- *     
+ *
  */
 
 #include <linux/module.h>
@@ -27,6 +27,7 @@ static int xfrm4_parse_spi(struct sk_buff *skb, u8 nexthdr, __be32 *spi, __be32
 {
        switch (nexthdr) {
        case IPPROTO_IPIP:
+       case IPPROTO_IPV6:
                *spi = skb->nh.iph->saddr;
                *seq = 0;
                return 0;
@@ -42,7 +43,7 @@ static inline int xfrm4_rcv_encap_finish(struct sk_buff *skb)
 
        if (skb->dst == NULL) {
                if (ip_route_input(skb, iph->daddr, iph->saddr, iph->tos,
-                                  skb->dev))
+                                  skb->dev))
                        goto drop;
        }
        return dst_input(skb);
@@ -70,7 +71,8 @@ int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type)
                if (xfrm_nr == XFRM_MAX_DEPTH)
                        goto drop;
 
-               x = xfrm_state_lookup((xfrm_address_t *)&iph->daddr, spi, iph->protocol, AF_INET);
+               x = xfrm_state_lookup((xfrm_address_t *)&iph->daddr, spi,
+                               iph->protocol != IPPROTO_IPV6 ? iph->protocol : IPPROTO_IPIP, AF_INET);
                if (x == NULL)
                        goto drop;
 
@@ -149,7 +151,7 @@ int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type)
                ip_send_check(skb->nh.iph);
 
                NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, skb->dev, NULL,
-                       xfrm4_rcv_encap_finish);
+                       xfrm4_rcv_encap_finish);
                return 0;
 #else
                return -skb->nh.iph->protocol;
index e54c5494c88ffbf7d8d5b9733061e13b282a4f2c..e1cab33fdad1333506ce906b453e11ec8feee6bc 100644 (file)
@@ -95,6 +95,7 @@ static int xfrm4_tunnel_input(struct xfrm_state *x, struct sk_buff *skb)
 
        switch(iph->protocol){
                case IPPROTO_IPIP:
+                       break;
 #if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
                case IPPROTO_IPV6:
                        break;
index 04403fb01a5890abb1d1d8c41b8812b6d9c9b5d4..038ca160fe2c4c67e3ba17fd39f3361fd31fa795 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * xfrm4_output.c - Common IPsec encapsulation code for IPv4.
  * Copyright (c) 2004 Herbert Xu <herbert@gondor.apana.org.au>
- * 
+ *
  * 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
@@ -28,7 +28,7 @@ static int xfrm4_tunnel_check_size(struct sk_buff *skb)
                goto out;
 
        IPCB(skb)->flags |= IPSKB_XFRM_TUNNEL_SIZE;
-       
+
        if (!(iph->frag_off & htons(IP_DF)) || skb->local_df)
                goto out;
 
@@ -47,7 +47,7 @@ static int xfrm4_output_one(struct sk_buff *skb)
        struct dst_entry *dst = skb->dst;
        struct xfrm_state *x = dst->xfrm;
        int err;
-       
+
        if (skb->ip_summed == CHECKSUM_PARTIAL) {
                err = skb_checksum_help(skb);
                if (err)
@@ -78,7 +78,7 @@ static int xfrm4_output_one(struct sk_buff *skb)
                x->curlft.packets++;
 
                spin_unlock_bh(&x->lock);
-       
+
                if (!(skb->dst = dst_pop(dst))) {
                        err = -EHOSTUNREACH;
                        goto error_nolock;
index 699f27ce62ad169b05d996c55c000e68e859c404..fef19c6bcb98b89496c3e622041c77efd5ca9423 100644 (file)
@@ -1,11 +1,11 @@
-/* 
+/*
  * xfrm4_policy.c
  *
  * Changes:
  *     Kazunori MIYAZAWA @USAGI
  *     YOSHIFUJI Hideaki @USAGI
  *             Split up af-specific portion
- *     
+ *
  */
 
 #include <linux/compiler.h>
@@ -50,8 +50,8 @@ __xfrm4_find_bundle(struct flowi *fl, struct xfrm_policy *policy)
                struct xfrm_dst *xdst = (struct xfrm_dst*)dst;
                if (xdst->u.rt.fl.oif == fl->oif &&     /*XXX*/
                    xdst->u.rt.fl.fl4_dst == fl->fl4_dst &&
-                   xdst->u.rt.fl.fl4_src == fl->fl4_src &&
-                   xdst->u.rt.fl.fl4_tos == fl->fl4_tos &&
+                   xdst->u.rt.fl.fl4_src == fl->fl4_src &&
+                   xdst->u.rt.fl.fl4_tos == fl->fl4_tos &&
                    xfrm_bundle_ok(policy, xdst, fl, AF_INET, 0)) {
                        dst_clone(dst);
                        break;
index f110af5b1319f0968a4278283cdaa171761d6e75..3eef06454da943e24599d5ca7051a5c6c5ae34c4 100644 (file)
@@ -13,7 +13,7 @@
 static int ipip_output(struct xfrm_state *x, struct sk_buff *skb)
 {
        struct iphdr *iph;
-       
+
        iph = skb->nh.iph;
        iph->tot_len = htons(skb->len);
        ip_send_check(iph);
@@ -64,24 +64,45 @@ static struct xfrm_tunnel xfrm_tunnel_handler = {
        .priority       =       2,
 };
 
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+static struct xfrm_tunnel xfrm64_tunnel_handler = {
+       .handler        =       xfrm4_rcv,
+       .err_handler    =       xfrm_tunnel_err,
+       .priority       =       2,
+};
+#endif
+
 static int __init ipip_init(void)
 {
        if (xfrm_register_type(&ipip_type, AF_INET) < 0) {
                printk(KERN_INFO "ipip init: can't add xfrm type\n");
                return -EAGAIN;
        }
-       if (xfrm4_tunnel_register(&xfrm_tunnel_handler)) {
-               printk(KERN_INFO "ipip init: can't add xfrm handler\n");
+
+       if (xfrm4_tunnel_register(&xfrm_tunnel_handler, AF_INET)) {
+               printk(KERN_INFO "ipip init: can't add xfrm handler for AF_INET\n");
+               xfrm_unregister_type(&ipip_type, AF_INET);
+               return -EAGAIN;
+       }
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+       if (xfrm4_tunnel_register(&xfrm64_tunnel_handler, AF_INET6)) {
+               printk(KERN_INFO "ipip init: can't add xfrm handler for AF_INET6\n");
+               xfrm4_tunnel_deregister(&xfrm_tunnel_handler, AF_INET);
                xfrm_unregister_type(&ipip_type, AF_INET);
                return -EAGAIN;
        }
+#endif
        return 0;
 }
 
 static void __exit ipip_fini(void)
 {
-       if (xfrm4_tunnel_deregister(&xfrm_tunnel_handler))
-               printk(KERN_INFO "ipip close: can't remove xfrm handler\n");
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+       if (xfrm4_tunnel_deregister(&xfrm64_tunnel_handler, AF_INET6))
+               printk(KERN_INFO "ipip close: can't remove xfrm handler for AF_INET6\n");
+#endif
+       if (xfrm4_tunnel_deregister(&xfrm_tunnel_handler, AF_INET))
+               printk(KERN_INFO "ipip close: can't remove xfrm handler for AF_INET\n");
        if (xfrm_unregister_type(&ipip_type, AF_INET) < 0)
                printk(KERN_INFO "ipip close: can't remove xfrm type\n");
 }
index deb4101a2a81d30f3c4abcdd33c60c1da3b51ef9..79682efb14beebd08cc875eadb3bea42b83f65cf 100644 (file)
@@ -156,6 +156,7 @@ config INET6_XFRM_MODE_ROUTEOPTIMIZATION
 config IPV6_SIT
        tristate "IPv6: IPv6-in-IPv4 tunnel (SIT driver)"
        depends on IPV6
+       select INET_TUNNEL
        default y
        ---help---
          Tunneling means encapsulating data of one protocol type within
index fe5e1d833871b19f142998b37b7fd522a7db5a86..569a37d698f7711fbf2c61aad8b271cce11550c5 100644 (file)
@@ -3,7 +3,7 @@
  *     Linux INET6 implementation
  *
  *     Authors:
- *     Pedro Roque             <roque@di.fc.ul.pt>     
+ *     Pedro Roque             <roque@di.fc.ul.pt>
  *     Alexey Kuznetsov        <kuznet@ms2.inr.ac.ru>
  *
  *     $Id: addrconf.c,v 1.69 2001/10/31 21:55:54 davem Exp $
@@ -44,7 +44,6 @@
 #include <linux/types.h>
 #include <linux/socket.h>
 #include <linux/sockios.h>
-#include <linux/sched.h>
 #include <linux/net.h>
 #include <linux/in6.h>
 #include <linux/netdevice.h>
@@ -105,7 +104,7 @@ static void addrconf_sysctl_unregister(struct ipv6_devconf *p);
 
 #ifdef CONFIG_IPV6_PRIVACY
 static int __ipv6_regen_rndid(struct inet6_dev *idev);
-static int __ipv6_try_regen_rndid(struct inet6_dev *idev, struct in6_addr *tmpaddr); 
+static int __ipv6_try_regen_rndid(struct inet6_dev *idev, struct in6_addr *tmpaddr);
 static void ipv6_regen_rndid(unsigned long data);
 
 static int desync_factor = MAX_DESYNC_FACTOR * HZ;
@@ -137,7 +136,7 @@ static void addrconf_rs_timer(unsigned long data);
 static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
 static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
 
-static void inet6_prefix_notify(int event, struct inet6_dev *idev, 
+static void inet6_prefix_notify(int event, struct inet6_dev *idev,
                                struct prefix_info *pinfo);
 static int ipv6_chk_same_addr(const struct in6_addr *addr, struct net_device *dev);
 
@@ -241,7 +240,7 @@ int __ipv6_addr_type(const struct in6_addr *addr)
         */
        if ((st & htonl(0xE0000000)) != htonl(0x00000000) &&
            (st & htonl(0xE0000000)) != htonl(0xE0000000))
-               return (IPV6_ADDR_UNICAST | 
+               return (IPV6_ADDR_UNICAST |
                        IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL));
 
        if ((st & htonl(0xFF000000)) == htonl(0xFF000000)) {
@@ -252,7 +251,7 @@ int __ipv6_addr_type(const struct in6_addr *addr)
        }
 
        if ((st & htonl(0xFFC00000)) == htonl(0xFE800000))
-               return (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST | 
+               return (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST |
                        IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_LINKLOCAL));               /* addr-select 3.1 */
        if ((st & htonl(0xFFC00000)) == htonl(0xFEC00000))
                return (IPV6_ADDR_SITELOCAL | IPV6_ADDR_UNICAST |
@@ -272,11 +271,11 @@ int __ipv6_addr_type(const struct in6_addr *addr)
                }
 
                if (addr->s6_addr32[2] == htonl(0x0000ffff))
-                       return (IPV6_ADDR_MAPPED | 
+                       return (IPV6_ADDR_MAPPED |
                                IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL));  /* addr-select 3.3 */
        }
 
-       return (IPV6_ADDR_RESERVED | 
+       return (IPV6_ADDR_RESERVED |
                IPV6_ADDR_SCOPE_TYPE(IPV6_ADDR_SCOPE_GLOBAL));  /* addr-select 3.4 */
 }
 
@@ -348,10 +347,10 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
        if (dev->mtu < IPV6_MIN_MTU)
                return NULL;
 
-       ndev = kzalloc(sizeof(struct inet6_dev), GFP_KERNEL);
+       ndev = kzalloc(sizeof(struct inet6_dev), GFP_KERNEL);
 
-       if (ndev == NULL)
-               return NULL;
+       if (ndev == NULL)
+               return NULL;
 
        rwlock_init(&ndev->lock);
        ndev->dev = dev;
@@ -462,7 +461,7 @@ static void dev_forward_change(struct inet6_dev *idev)
        dev = idev->dev;
        if (dev && (dev->flags & IFF_MULTICAST)) {
                ipv6_addr_all_routers(&addr);
-       
+
                if (idev->cnf.forwarding)
                        ipv6_dev_mc_inc(dev, &addr);
                else
@@ -817,8 +816,8 @@ retry:
        tmp_valid_lft = min_t(__u32,
                              ifp->valid_lft,
                              idev->cnf.temp_valid_lft);
-       tmp_prefered_lft = min_t(__u32, 
-                                ifp->prefered_lft, 
+       tmp_prefered_lft = min_t(__u32,
+                                ifp->prefered_lft,
                                 idev->cnf.temp_prefered_lft - desync_factor / HZ);
        tmp_plen = ifp->prefix_len;
        max_addresses = idev->cnf.max_addresses;
@@ -828,7 +827,7 @@ retry:
 
        write_unlock(&idev->lock);
        ift = !max_addresses ||
-             ipv6_count_addresses(idev) < max_addresses ? 
+             ipv6_count_addresses(idev) < max_addresses ?
                ipv6_add_addr(idev, &addr, tmp_plen,
                              ipv6_addr_type(&addr)&IPV6_ADDR_SCOPE_MASK, IFA_F_TEMPORARY) : NULL;
        if (!ift || IS_ERR(ift)) {
@@ -1160,7 +1159,7 @@ record_it:
 
        if (!ifa_result)
                return -EADDRNOTAVAIL;
-       
+
        ipv6_addr_copy(saddr, &ifa_result->addr);
        in6_ifa_put(ifa_result);
        return 0;
@@ -1475,7 +1474,7 @@ regen:
         *  - value 0
         *  - XXX: already assigned to an address on the device
         */
-       if (idev->rndid[0] == 0xfd && 
+       if (idev->rndid[0] == 0xfd &&
            (idev->rndid[1]&idev->rndid[2]&idev->rndid[3]&idev->rndid[4]&idev->rndid[5]&idev->rndid[6]) == 0xff &&
            (idev->rndid[7]&0x80))
                goto regen;
@@ -1502,9 +1501,9 @@ static void ipv6_regen_rndid(unsigned long data)
 
        if (__ipv6_regen_rndid(idev) < 0)
                goto out;
-       
+
        expires = jiffies +
-               idev->cnf.temp_prefered_lft * HZ - 
+               idev->cnf.temp_prefered_lft * HZ -
                idev->cnf.regen_max_retry * idev->cnf.dad_transmits * idev->nd_parms->retrans_time - desync_factor;
        if (time_before(expires, jiffies)) {
                printk(KERN_WARNING
@@ -1630,12 +1629,12 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
        struct inet6_dev *in6_dev;
 
        pinfo = (struct prefix_info *) opt;
-       
+
        if (len < sizeof(struct prefix_info)) {
                ADBG(("addrconf: prefix option too short\n"));
                return;
        }
-       
+
        /*
         *      Validation checks ([ADDRCONF], page 19)
         */
@@ -1827,7 +1826,7 @@ ok:
                                 * When a new public address is created as described in [ADDRCONF],
                                 * also create a new temporary address.
                                 */
-                               read_unlock_bh(&in6_dev->lock); 
+                               read_unlock_bh(&in6_dev->lock);
                                ipv6_create_tempaddr(ifp, NULL);
                        } else {
                                read_unlock_bh(&in6_dev->lock);
@@ -1913,14 +1912,14 @@ static int inet6_addr_add(int ifindex, struct in6_addr *pfx, int plen,
        int scope;
 
        ASSERT_RTNL();
-       
+
        /* check the lifetime */
        if (!valid_lft || prefered_lft > valid_lft)
                return -EINVAL;
 
        if ((dev = __dev_get_by_index(ifindex)) == NULL)
                return -ENODEV;
-       
+
        if ((idev = addrconf_add_dev(dev)) == NULL)
                return -ENOBUFS;
 
@@ -1960,7 +1959,7 @@ static int inet6_addr_del(int ifindex, struct in6_addr *pfx, int plen)
        struct inet6_ifaddr *ifp;
        struct inet6_dev *idev;
        struct net_device *dev;
-       
+
        if ((dev = __dev_get_by_index(ifindex)) == NULL)
                return -ENODEV;
 
@@ -1973,7 +1972,7 @@ static int inet6_addr_del(int ifindex, struct in6_addr *pfx, int plen)
                    ipv6_addr_equal(pfx, &ifp->addr)) {
                        in6_ifa_hold(ifp);
                        read_unlock_bh(&idev->lock);
-                       
+
                        ipv6_del_addr(ifp);
 
                        /* If the last address is deleted administratively,
@@ -1993,10 +1992,10 @@ int addrconf_add_ifaddr(void __user *arg)
 {
        struct in6_ifreq ireq;
        int err;
-       
+
        if (!capable(CAP_NET_ADMIN))
                return -EPERM;
-       
+
        if (copy_from_user(&ireq, arg, sizeof(struct in6_ifreq)))
                return -EFAULT;
 
@@ -2011,7 +2010,7 @@ int addrconf_del_ifaddr(void __user *arg)
 {
        struct in6_ifreq ireq;
        int err;
-       
+
        if (!capable(CAP_NET_ADMIN))
                return -EPERM;
 
@@ -2056,7 +2055,7 @@ static void sit_add_v4_addrs(struct inet6_dev *idev)
                return;
        }
 
-        for (dev = dev_base; dev != NULL; dev = dev->next) {
+       for (dev = dev_base; dev != NULL; dev = dev->next) {
                struct in_device * in_dev = __in_dev_get_rtnl(dev);
                if (in_dev && (dev->flags & IFF_UP)) {
                        struct in_ifaddr * ifa;
@@ -2091,7 +2090,7 @@ static void sit_add_v4_addrs(struct inet6_dev *idev)
                                }
                        }
                }
-        }
+       }
 }
 #endif
 
@@ -2137,7 +2136,7 @@ static void addrconf_dev_config(struct net_device *dev)
 
        ASSERT_RTNL();
 
-       if ((dev->type != ARPHRD_ETHER) && 
+       if ((dev->type != ARPHRD_ETHER) &&
            (dev->type != ARPHRD_FDDI) &&
            (dev->type != ARPHRD_IEEE802_TR) &&
            (dev->type != ARPHRD_ARCNET) &&
@@ -2164,9 +2163,9 @@ static void addrconf_sit_config(struct net_device *dev)
 
        ASSERT_RTNL();
 
-       /* 
-        * Configure the tunnel with one of our IPv4 
-        * addresses... we should configure all of 
+       /*
+        * Configure the tunnel with one of our IPv4
+        * addresses... we should configure all of
         * our v4 addrs in the tunnel
         */
 
@@ -2233,7 +2232,7 @@ static void addrconf_ip6_tnl_config(struct net_device *dev)
        ip6_tnl_add_linklocal(idev);
 }
 
-static int addrconf_notify(struct notifier_block *this, unsigned long event, 
+static int addrconf_notify(struct notifier_block *this, unsigned long event,
                           void * data)
 {
        struct net_device *dev = (struct net_device *) data;
@@ -2378,7 +2377,7 @@ static int addrconf_ifdown(struct net_device *dev, int how)
                return -ENODEV;
 
        /* Step 1: remove reference to ipv6 device from parent device.
-                  Do not dev_put!
+                  Do not dev_put!
         */
        if (how == 1) {
                idev->dead = 1;
@@ -2461,7 +2460,7 @@ static int addrconf_ifdown(struct net_device *dev, int how)
        /* Step 5: netlink notification of this interface */
        idev->tstamp = jiffies;
        inet6_ifinfo_notify(RTM_DELLINK, idev);
-       
+
        /* Shot the device (if unregistered) */
 
        if (how == 1) {
@@ -2776,7 +2775,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations if6_fops = {
+static const struct file_operations if6_fops = {
        .owner          = THIS_MODULE,
        .open           = if6_seq_open,
        .read           = seq_read,
@@ -2850,8 +2849,8 @@ restart:
                        age = (now - ifp->tstamp) / HZ;
 
 #ifdef CONFIG_IPV6_PRIVACY
-                       regen_advance = ifp->idev->cnf.regen_max_retry * 
-                                       ifp->idev->cnf.dad_transmits * 
+                       regen_advance = ifp->idev->cnf.regen_max_retry *
+                                       ifp->idev->cnf.dad_transmits *
                                        ifp->idev->nd_parms->retrans_time / HZ;
 #endif
 
@@ -3217,7 +3216,7 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
        s_idx = cb->args[0];
        s_ip_idx = ip_idx = cb->args[1];
        read_lock(&dev_base_lock);
-       
+
        for (dev = dev_base, idx = 0; dev; dev = dev->next, idx++) {
                if (idx < s_idx)
                        continue;
@@ -3234,8 +3233,8 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
                             ifa = ifa->if_next, ip_idx++) {
                                if (ip_idx < s_ip_idx)
                                        continue;
-                               if ((err = inet6_fill_ifaddr(skb, ifa, 
-                                   NETLINK_CB(cb->skb).pid, 
+                               if ((err = inet6_fill_ifaddr(skb, ifa,
+                                   NETLINK_CB(cb->skb).pid,
                                    cb->nlh->nlmsg_seq, RTM_NEWADDR,
                                    NLM_F_MULTI)) <= 0)
                                        goto done;
@@ -3243,12 +3242,12 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
                        break;
                case MULTICAST_ADDR:
                        /* multicast address */
-                       for (ifmca = idev->mc_list; ifmca; 
+                       for (ifmca = idev->mc_list; ifmca;
                             ifmca = ifmca->next, ip_idx++) {
                                if (ip_idx < s_ip_idx)
                                        continue;
-                               if ((err = inet6_fill_ifmcaddr(skb, ifmca, 
-                                   NETLINK_CB(cb->skb).pid, 
+                               if ((err = inet6_fill_ifmcaddr(skb, ifmca,
+                                   NETLINK_CB(cb->skb).pid,
                                    cb->nlh->nlmsg_seq, RTM_GETMULTICAST,
                                    NLM_F_MULTI)) <= 0)
                                        goto done;
@@ -3260,10 +3259,10 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
                             ifaca = ifaca->aca_next, ip_idx++) {
                                if (ip_idx < s_ip_idx)
                                        continue;
-                               if ((err = inet6_fill_ifacaddr(skb, ifaca, 
-                                   NETLINK_CB(cb->skb).pid, 
+                               if ((err = inet6_fill_ifacaddr(skb, ifaca,
+                                   NETLINK_CB(cb->skb).pid,
                                    cb->nlh->nlmsg_seq, RTM_GETANYCAST,
-                                   NLM_F_MULTI)) <= 0) 
+                                   NLM_F_MULTI)) <= 0)
                                        goto done;
                        }
                        break;
@@ -3426,7 +3425,7 @@ static inline size_t inet6_if_nlmsg_size(void)
                 );
 }
 
-static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev, 
+static int inet6_fill_ifinfo(struct sk_buff *skb, struct inet6_dev *idev,
                             u32 pid, u32 seq, int event, unsigned int flags)
 {
        struct net_device *dev = idev->dev;
@@ -3498,7 +3497,7 @@ static int inet6_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
                        continue;
                if ((idev = in6_dev_get(dev)) == NULL)
                        continue;
-               err = inet6_fill_ifinfo(skb, idev, NETLINK_CB(cb->skb).pid, 
+               err = inet6_fill_ifinfo(skb, idev, NETLINK_CB(cb->skb).pid,
                                cb->nlh->nlmsg_seq, RTM_NEWLINK, NLM_F_MULTI);
                in6_dev_put(idev);
                if (err <= 0)
@@ -3514,7 +3513,7 @@ void inet6_ifinfo_notify(int event, struct inet6_dev *idev)
 {
        struct sk_buff *skb;
        int err = -ENOBUFS;
-       
+
        skb = nlmsg_new(inet6_if_nlmsg_size(), GFP_ATOMIC);
        if (skb == NULL)
                goto errout;
@@ -3578,7 +3577,7 @@ nla_put_failure:
        return -EMSGSIZE;
 }
 
-static void inet6_prefix_notify(int event, struct inet6_dev *idev, 
+static void inet6_prefix_notify(int event, struct inet6_dev *idev,
                         struct prefix_info *pinfo)
 {
        struct sk_buff *skb;
@@ -3675,10 +3674,10 @@ int addrconf_sysctl_forward(ctl_table *ctl, int write, struct file * filp,
                        rt6_purge_dflt_routers();
        }
 
-        return ret;
+       return ret;
 }
 
-static int addrconf_sysctl_forward_strategy(ctl_table *table, 
+static int addrconf_sysctl_forward_strategy(ctl_table *table,
                                            int __user *name, int nlen,
                                            void __user *oldval,
                                            size_t __user *oldlenp,
@@ -3743,19 +3742,19 @@ static struct addrconf_sysctl_table
 } addrconf_sysctl __read_mostly = {
        .sysctl_header = NULL,
        .addrconf_vars = {
-               {
+               {
                        .ctl_name       =       NET_IPV6_FORWARDING,
                        .procname       =       "forwarding",
-                       .data           =       &ipv6_devconf.forwarding,
+                       .data           =       &ipv6_devconf.forwarding,
                        .maxlen         =       sizeof(int),
                        .mode           =       0644,
-                       .proc_handler   =       &addrconf_sysctl_forward,
+                       .proc_handler   =       &addrconf_sysctl_forward,
                        .strategy       =       &addrconf_sysctl_forward_strategy,
                },
                {
                        .ctl_name       =       NET_IPV6_HOP_LIMIT,
                        .procname       =       "hop_limit",
-                       .data           =       &ipv6_devconf.hop_limit,
+                       .data           =       &ipv6_devconf.hop_limit,
                        .maxlen         =       sizeof(int),
                        .mode           =       0644,
                        .proc_handler   =       proc_dointvec,
@@ -3764,116 +3763,116 @@ static struct addrconf_sysctl_table
                        .ctl_name       =       NET_IPV6_MTU,
                        .procname       =       "mtu",
                        .data           =       &ipv6_devconf.mtu6,
-                       .maxlen         =       sizeof(int),
+                       .maxlen         =       sizeof(int),
                        .mode           =       0644,
-                       .proc_handler   =       &proc_dointvec,
+                       .proc_handler   =       &proc_dointvec,
                },
                {
                        .ctl_name       =       NET_IPV6_ACCEPT_RA,
                        .procname       =       "accept_ra",
-                       .data           =       &ipv6_devconf.accept_ra,
+                       .data           =       &ipv6_devconf.accept_ra,
                        .maxlen         =       sizeof(int),
                        .mode           =       0644,
-                       .proc_handler   =       &proc_dointvec,
+                       .proc_handler   =       &proc_dointvec,
                },
                {
                        .ctl_name       =       NET_IPV6_ACCEPT_REDIRECTS,
                        .procname       =       "accept_redirects",
-                       .data           =       &ipv6_devconf.accept_redirects,
+                       .data           =       &ipv6_devconf.accept_redirects,
                        .maxlen         =       sizeof(int),
                        .mode           =       0644,
-                       .proc_handler   =       &proc_dointvec,
+                       .proc_handler   =       &proc_dointvec,
                },
                {
                        .ctl_name       =       NET_IPV6_AUTOCONF,
                        .procname       =       "autoconf",
-                       .data           =       &ipv6_devconf.autoconf,
+                       .data           =       &ipv6_devconf.autoconf,
                        .maxlen         =       sizeof(int),
                        .mode           =       0644,
-                       .proc_handler   =       &proc_dointvec,
+                       .proc_handler   =       &proc_dointvec,
                },
                {
                        .ctl_name       =       NET_IPV6_DAD_TRANSMITS,
                        .procname       =       "dad_transmits",
-                       .data           =       &ipv6_devconf.dad_transmits,
+                       .data           =       &ipv6_devconf.dad_transmits,
                        .maxlen         =       sizeof(int),
                        .mode           =       0644,
-                       .proc_handler   =       &proc_dointvec,
+                       .proc_handler   =       &proc_dointvec,
                },
                {
                        .ctl_name       =       NET_IPV6_RTR_SOLICITS,
                        .procname       =       "router_solicitations",
-                       .data           =       &ipv6_devconf.rtr_solicits,
+                       .data           =       &ipv6_devconf.rtr_solicits,
                        .maxlen         =       sizeof(int),
                        .mode           =       0644,
-                       .proc_handler   =       &proc_dointvec,
+                       .proc_handler   =       &proc_dointvec,
                },
                {
                        .ctl_name       =       NET_IPV6_RTR_SOLICIT_INTERVAL,
                        .procname       =       "router_solicitation_interval",
-                       .data           =       &ipv6_devconf.rtr_solicit_interval,
+                       .data           =       &ipv6_devconf.rtr_solicit_interval,
                        .maxlen         =       sizeof(int),
                        .mode           =       0644,
-                       .proc_handler   =       &proc_dointvec_jiffies,
+                       .proc_handler   =       &proc_dointvec_jiffies,
                        .strategy       =       &sysctl_jiffies,
                },
                {
                        .ctl_name       =       NET_IPV6_RTR_SOLICIT_DELAY,
                        .procname       =       "router_solicitation_delay",
-                       .data           =       &ipv6_devconf.rtr_solicit_delay,
+                       .data           =       &ipv6_devconf.rtr_solicit_delay,
                        .maxlen         =       sizeof(int),
                        .mode           =       0644,
-                       .proc_handler   =       &proc_dointvec_jiffies,
+                       .proc_handler   =       &proc_dointvec_jiffies,
                        .strategy       =       &sysctl_jiffies,
                },
                {
                        .ctl_name       =       NET_IPV6_FORCE_MLD_VERSION,
                        .procname       =       "force_mld_version",
-                       .data           =       &ipv6_devconf.force_mld_version,
+                       .data           =       &ipv6_devconf.force_mld_version,
                        .maxlen         =       sizeof(int),
                        .mode           =       0644,
-                       .proc_handler   =       &proc_dointvec,
+                       .proc_handler   =       &proc_dointvec,
                },
 #ifdef CONFIG_IPV6_PRIVACY
                {
                        .ctl_name       =       NET_IPV6_USE_TEMPADDR,
                        .procname       =       "use_tempaddr",
-                       .data           =       &ipv6_devconf.use_tempaddr,
+                       .data           =       &ipv6_devconf.use_tempaddr,
                        .maxlen         =       sizeof(int),
                        .mode           =       0644,
-                       .proc_handler   =       &proc_dointvec,
+                       .proc_handler   =       &proc_dointvec,
                },
                {
                        .ctl_name       =       NET_IPV6_TEMP_VALID_LFT,
                        .procname       =       "temp_valid_lft",
-                       .data           =       &ipv6_devconf.temp_valid_lft,
+                       .data           =       &ipv6_devconf.temp_valid_lft,
                        .maxlen         =       sizeof(int),
                        .mode           =       0644,
-                       .proc_handler   =       &proc_dointvec,
+                       .proc_handler   =       &proc_dointvec,
                },
                {
                        .ctl_name       =       NET_IPV6_TEMP_PREFERED_LFT,
                        .procname       =       "temp_prefered_lft",
-                       .data           =       &ipv6_devconf.temp_prefered_lft,
+                       .data           =       &ipv6_devconf.temp_prefered_lft,
                        .maxlen         =       sizeof(int),
                        .mode           =       0644,
-                       .proc_handler   =       &proc_dointvec,
+                       .proc_handler   =       &proc_dointvec,
                },
                {
                        .ctl_name       =       NET_IPV6_REGEN_MAX_RETRY,
                        .procname       =       "regen_max_retry",
-                       .data           =       &ipv6_devconf.regen_max_retry,
+                       .data           =       &ipv6_devconf.regen_max_retry,
                        .maxlen         =       sizeof(int),
                        .mode           =       0644,
-                       .proc_handler   =       &proc_dointvec,
+                       .proc_handler   =       &proc_dointvec,
                },
                {
                        .ctl_name       =       NET_IPV6_MAX_DESYNC_FACTOR,
                        .procname       =       "max_desync_factor",
-                       .data           =       &ipv6_devconf.max_desync_factor,
+                       .data           =       &ipv6_devconf.max_desync_factor,
                        .maxlen         =       sizeof(int),
                        .mode           =       0644,
-                       .proc_handler   =       &proc_dointvec,
+                       .proc_handler   =       &proc_dointvec,
                },
 #endif
                {
@@ -3887,18 +3886,18 @@ static struct addrconf_sysctl_table
                {
                        .ctl_name       =       NET_IPV6_ACCEPT_RA_DEFRTR,
                        .procname       =       "accept_ra_defrtr",
-                       .data           =       &ipv6_devconf.accept_ra_defrtr,
+                       .data           =       &ipv6_devconf.accept_ra_defrtr,
                        .maxlen         =       sizeof(int),
                        .mode           =       0644,
-                       .proc_handler   =       &proc_dointvec,
+                       .proc_handler   =       &proc_dointvec,
                },
                {
                        .ctl_name       =       NET_IPV6_ACCEPT_RA_PINFO,
                        .procname       =       "accept_ra_pinfo",
-                       .data           =       &ipv6_devconf.accept_ra_pinfo,
+                       .data           =       &ipv6_devconf.accept_ra_pinfo,
                        .maxlen         =       sizeof(int),
                        .mode           =       0644,
-                       .proc_handler   =       &proc_dointvec,
+                       .proc_handler   =       &proc_dointvec,
                },
 #ifdef CONFIG_IPV6_ROUTER_PREF
                {
@@ -3999,22 +3998,21 @@ static void addrconf_sysctl_register(struct inet6_dev *idev, struct ipv6_devconf
                return;
        for (i=0; t->addrconf_vars[i].data; i++) {
                t->addrconf_vars[i].data += (char*)p - (char*)&ipv6_devconf;
-               t->addrconf_vars[i].de = NULL;
                t->addrconf_vars[i].extra1 = idev; /* embedded; no ref */
        }
        if (dev) {
-               dev_name = dev->name; 
+               dev_name = dev->name;
                t->addrconf_dev[0].ctl_name = dev->ifindex;
        } else {
                dev_name = "default";
                t->addrconf_dev[0].ctl_name = NET_PROTO_CONF_DEFAULT;
        }
 
-       /* 
-        * Make a copy of dev_name, because '.procname' is regarded as const 
+       /*
+        * Make a copy of dev_name, because '.procname' is regarded as const
         * by sysctl and we wouldn't want anyone to change it under our feet
         * (see SIOCSIFNAME).
-        */     
+        */
        dev_name = kstrdup(dev_name, GFP_KERNEL);
        if (!dev_name)
            goto free;
@@ -4022,15 +4020,11 @@ static void addrconf_sysctl_register(struct inet6_dev *idev, struct ipv6_devconf
        t->addrconf_dev[0].procname = dev_name;
 
        t->addrconf_dev[0].child = t->addrconf_vars;
-       t->addrconf_dev[0].de = NULL;
        t->addrconf_conf_dir[0].child = t->addrconf_dev;
-       t->addrconf_conf_dir[0].de = NULL;
        t->addrconf_proto_dir[0].child = t->addrconf_conf_dir;
-       t->addrconf_proto_dir[0].de = NULL;
        t->addrconf_root_dir[0].child = t->addrconf_proto_dir;
-       t->addrconf_root_dir[0].de = NULL;
 
-       t->sysctl_header = register_sysctl_table(t->addrconf_root_dir, 0);
+       t->sysctl_header = register_sysctl_table(t->addrconf_root_dir);
        if (t->sysctl_header == NULL)
                goto free_procname;
        else
@@ -4066,12 +4060,12 @@ static void addrconf_sysctl_unregister(struct ipv6_devconf *p)
 
 int register_inet6addr_notifier(struct notifier_block *nb)
 {
-        return atomic_notifier_chain_register(&inet6addr_chain, nb);
+       return atomic_notifier_chain_register(&inet6addr_chain, nb);
 }
 
 int unregister_inet6addr_notifier(struct notifier_block *nb)
 {
-        return atomic_notifier_chain_unregister(&inet6addr_chain,nb);
+       return atomic_notifier_chain_unregister(&inet6addr_chain,nb);
 }
 
 /*
@@ -4115,7 +4109,7 @@ int __init addrconf_init(void)
        rtnetlink_links[PF_INET6] = inet6_rtnetlink_table;
 #ifdef CONFIG_SYSCTL
        addrconf_sysctl.sysctl_header =
-               register_sysctl_table(addrconf_sysctl.addrconf_root_dir, 0);
+               register_sysctl_table(addrconf_sysctl.addrconf_root_dir);
        addrconf_sysctl_register(NULL, &ipv6_devconf_dflt);
 #endif
 
@@ -4124,9 +4118,9 @@ int __init addrconf_init(void)
 
 void __exit addrconf_cleanup(void)
 {
-       struct net_device *dev;
-       struct inet6_dev *idev;
-       struct inet6_ifaddr *ifa;
+       struct net_device *dev;
+       struct inet6_dev *idev;
+       struct inet6_ifaddr *ifa;
        int i;
 
        unregister_netdevice_notifier(&ipv6_dev_notf);
index 0e0e4262f4dc46a570c72c4a829699ef6fa6faf0..3585d8fa7f029930869ac900ad73ae0f4a442f22 100644 (file)
@@ -1,9 +1,9 @@
 /*
  *     PF_INET6 socket protocol family
- *     Linux INET6 implementation 
+ *     Linux INET6 implementation
  *
  *     Authors:
- *     Pedro Roque             <roque@di.fc.ul.pt>     
+ *     Pedro Roque             <roque@di.fc.ul.pt>
  *
  *     Adapted from linux/net/ipv4/af_inet.c
  *
@@ -28,7 +28,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
@@ -191,7 +190,7 @@ lookup_protocol:
        np->mc_loop     = 1;
        np->pmtudisc    = IPV6_PMTUDISC_WANT;
        np->ipv6only    = sysctl_ipv6_bindv6only;
-       
+
        /* Init the ipv4 part of the socket since we can have sockets
         * using v6 API for ipv4.
         */
@@ -206,7 +205,7 @@ lookup_protocol:
                inet->pmtudisc = IP_PMTUDISC_DONT;
        else
                inet->pmtudisc = IP_PMTUDISC_WANT;
-       /* 
+       /*
         * Increment only the relevant sk_prot->socks debug field, this changes
         * the previous behaviour of incrementing both the equivalent to
         * answer->prot->socks (inet6_sock_nr) and inet_sock_nr.
@@ -293,7 +292,7 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
                                         */
                                        sk->sk_bound_dev_if = addr->sin6_scope_id;
                                }
-                               
+
                                /* Binding to link-local address requires an interface */
                                if (!sk->sk_bound_dev_if) {
                                        err = -EINVAL;
@@ -327,7 +326,7 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
        inet->saddr = v4addr;
 
        ipv6_addr_copy(&np->rcv_saddr, &addr->sin6_addr);
-               
+
        if (!(addr_type & IPV6_ADDR_MULTICAST))
                ipv6_addr_copy(&np->saddr, &addr->sin6_addr);
 
@@ -393,7 +392,7 @@ EXPORT_SYMBOL_GPL(inet6_destroy_sock);
 /*
  *     This does both peername and sockname.
  */
+
 int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
                 int *uaddr_len, int peer)
 {
@@ -401,7 +400,7 @@ int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
        struct sock *sk = sock->sk;
        struct inet_sock *inet = inet_sk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
-  
+
        sin->sin6_family = AF_INET6;
        sin->sin6_flowinfo = 0;
        sin->sin6_scope_id = 0;
@@ -433,14 +432,14 @@ int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
        struct sock *sk = sock->sk;
 
-       switch(cmd) 
+       switch(cmd)
        {
        case SIOCGSTAMP:
                return sock_get_timestamp(sk, (struct timeval __user *)arg);
 
        case SIOCADDRT:
        case SIOCDELRT:
-         
+
                return(ipv6_route_ioctl(cmd,(void __user *)arg));
 
        case SIOCSIFADDR:
@@ -584,7 +583,7 @@ inet6_register_protosw(struct inet_protosw *p)
        /* Add the new entry after the last permanent entry if any, so that
         * the new entry does not override a permanent entry when matched with
         * a wild-card protocol. But it is allowed to override any existing
-        * non-permanent entry.  This means that when we remove this entry, the 
+        * non-permanent entry.  This means that when we remove this entry, the
         * system automatically returns to the old behavior.
         */
        list_add_rcu(&p->list, last_perm);
@@ -749,7 +748,7 @@ err_icmp_mib:
        snmp6_mib_free((void **)ipv6_statistics);
 err_ip_mib:
        return -ENOMEM;
-       
+
 }
 
 static void cleanup_ipv6_mibs(void)
@@ -763,7 +762,7 @@ static void cleanup_ipv6_mibs(void)
 static int __init inet6_init(void)
 {
        struct sk_buff *dummy_skb;
-        struct list_head *r;
+       struct list_head *r;
        int err;
 
        BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > sizeof(dummy_skb->cb));
@@ -814,7 +813,7 @@ static int __init inet6_init(void)
        err = init_ipv6_mibs();
        if (err)
                goto out_unregister_sock;
-       
+
        /*
         *      ipngwg API draft makes clear that the correct semantics
         *      for TCP and UDP is to consider one TCP and UDP instance
@@ -933,11 +932,11 @@ static void __exit inet6_exit(void)
 #ifdef CONFIG_PROC_FS
        if6_proc_exit();
        ac6_proc_exit();
-       ipv6_misc_proc_exit();
-       udp6_proc_exit();
-       udplite6_proc_exit();
-       tcp6_proc_exit();
-       raw6_proc_exit();
+       ipv6_misc_proc_exit();
+       udp6_proc_exit();
+       udplite6_proc_exit();
+       tcp6_proc_exit();
+       raw6_proc_exit();
 #endif
 #ifdef CONFIG_IPV6_MIP6
        mip6_fini();
@@ -952,7 +951,7 @@ static void __exit inet6_exit(void)
        ndisc_cleanup();
        icmpv6_cleanup();
 #ifdef CONFIG_SYSCTL
-       ipv6_sysctl_unregister();       
+       ipv6_sysctl_unregister();
 #endif
        cleanup_ipv6_mibs();
        proto_unregister(&rawv6_prot);
index 12c5a4dec09e32dd37dc4181c6e5bb8d6c4d286b..dc68b7269c3c90de00a54aacc072ad7faaca567e 100644 (file)
@@ -1,26 +1,26 @@
 /*
  * Copyright (C)2002 USAGI/WIDE Project
- * 
+ *
  * 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
  *
  * Authors
  *
- *     Mitsuru KANDA @USAGI       : IPv6 Support 
+ *     Mitsuru KANDA @USAGI       : IPv6 Support
  *     Kazunori MIYAZAWA @USAGI   :
  *     Kunihiro Ishiguro <kunihiro@ipinfusion.com>
- *     
+ *
  *     This file is derived from net/ipv4/ah.c.
  */
 
@@ -54,7 +54,7 @@ static int zero_out_mutable_opts(struct ipv6_opt_hdr *opthdr)
                        optlen = 1;
                        break;
                default:
-                       if (len < 2) 
+                       if (len < 2)
                                goto bad;
                        optlen = opt[off+1]+2;
                        if (len < optlen)
@@ -152,7 +152,7 @@ static void ipv6_rearrange_rthdr(struct ipv6hdr *iph, struct ipv6_rt_hdr *rthdr)
        segments_left = rthdr->segments_left;
        if (segments_left == 0)
                return;
-       rthdr->segments_left = 0; 
+       rthdr->segments_left = 0;
 
        /* The value of rthdr->hdrlen has been verified either by the system
         * call if it is locally generated, or by ipv6_rthdr_rcv() for incoming
@@ -278,7 +278,7 @@ static int ah6_output(struct xfrm_state *x, struct sk_buff *skb)
        top_iph->hop_limit   = 0;
 
        ahp = x->data;
-       ah->hdrlen  = (XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) + 
+       ah->hdrlen  = (XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) +
                                   ahp->icv_trunc_len) >> 2) - 2;
 
        ah->reserved = 0;
@@ -319,7 +319,7 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff *skb)
         * Moving the pointer of skb->nh.raw by using skb_pull as long as AH
         * header length. Then copy back the copy as long as hdr_len
         * If destination header following AH exists, copy it into after [Ext2].
-        * 
+        *
         * |<>|[IPv6][Ext1][Ext2][Dest][Payload]
         * There is offset of AH before IPv6 header after the process.
         */
@@ -347,9 +347,9 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff *skb)
        nexthdr = ah->nexthdr;
        ah_hlen = (ah->hdrlen + 2) << 2;
 
-        if (ah_hlen != XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) + ahp->icv_full_len) &&
-            ah_hlen != XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) + ahp->icv_trunc_len))
-                goto out;
+       if (ah_hlen != XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) + ahp->icv_full_len) &&
+           ah_hlen != XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) + ahp->icv_trunc_len))
+               goto out;
 
        if (!pskb_may_pull(skb, ah_hlen))
                goto out;
@@ -365,7 +365,7 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff *skb)
        skb->nh.ipv6h->flow_lbl[2] = 0;
        skb->nh.ipv6h->hop_limit   = 0;
 
-        {
+       {
                u8 auth_data[MAX_AH_AUTH_LEN];
 
                memcpy(auth_data, ah->auth_data, ahp->icv_trunc_len);
@@ -395,8 +395,8 @@ out:
        return err;
 }
 
-static void ah6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, 
-                    int type, int code, int offset, __be32 info)
+static void ah6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
+                   int type, int code, int offset, __be32 info)
 {
        struct ipv6hdr *iph = (struct ipv6hdr*)skb->data;
        struct ip_auth_hdr *ah = (struct ip_auth_hdr*)(skb->data+offset);
@@ -445,7 +445,7 @@ static int ah6_init_state(struct xfrm_state *x)
        ahp->tfm = tfm;
        if (crypto_hash_setkey(tfm, ahp->key, ahp->key_len))
                goto error;
-       
+
        /*
         * Lookup the algorithm description maintained by xfrm_algo,
         * verify crypto transform properties, and store information
@@ -462,16 +462,16 @@ static int ah6_init_state(struct xfrm_state *x)
                       aalg_desc->uinfo.auth.icv_fullbits/8);
                goto error;
        }
-       
+
        ahp->icv_full_len = aalg_desc->uinfo.auth.icv_fullbits/8;
        ahp->icv_trunc_len = aalg_desc->uinfo.auth.icv_truncbits/8;
-       
+
        BUG_ON(ahp->icv_trunc_len > MAX_AH_AUTH_LEN);
-       
+
        ahp->work_icv = kmalloc(ahp->icv_full_len, GFP_KERNEL);
        if (!ahp->work_icv)
                goto error;
-       
+
        x->props.header_len = XFRM_ALIGN8(sizeof(struct ipv6_auth_hdr) + ahp->icv_trunc_len);
        if (x->props.mode == XFRM_MODE_TUNNEL)
                x->props.header_len += sizeof(struct ipv6hdr);
index a9604764e015adc03c77cdcea9f50d63c947235b..e5ef5979ade417e32d2bc11a41979f7fc0056758 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *     Anycast support for IPv6
- *     Linux INET6 implementation 
+ *     Linux INET6 implementation
  *
  *     Authors:
  *     David L Stevens (dlstevens@us.ibm.com)
@@ -21,7 +21,6 @@
 #include <linux/string.h>
 #include <linux/socket.h>
 #include <linux/sockios.h>
-#include <linux/sched.h>
 #include <linux/net.h>
 #include <linux/in6.h>
 #include <linux/netdevice.h>
@@ -397,7 +396,7 @@ static int ipv6_dev_ac_dec(struct net_device *dev, struct in6_addr *addr)
        in6_dev_put(idev);
        return ret;
 }
-       
+
 /*
  *     check if the interface has this anycast address
  */
@@ -565,7 +564,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations ac6_seq_fops = {
+static const struct file_operations ac6_seq_fops = {
        .owner          =       THIS_MODULE,
        .open           =       ac6_seq_open,
        .read           =       seq_read,
index ecde30140f4a59bbd475218c052adb9d26e9935f..3b4e8dcf4c86f7992ab69ee64909f79ce30e813b 100644 (file)
@@ -1,9 +1,9 @@
 /*
  *     common UDP/RAW code
- *     Linux INET6 implementation 
+ *     Linux INET6 implementation
  *
  *     Authors:
- *     Pedro Roque             <roque@di.fc.ul.pt>     
+ *     Pedro Roque             <roque@di.fc.ul.pt>
  *
  *     $Id: datagram.c,v 1.24 2002/02/01 22:01:04 davem Exp $
  *
@@ -17,7 +17,6 @@
 #include <linux/errno.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/socket.h>
 #include <linux/sockios.h>
@@ -55,10 +54,10 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
        }
 
        if (addr_len < SIN6_LEN_RFC2133)
-               return -EINVAL;
+               return -EINVAL;
 
-       if (usin->sin6_family != AF_INET6) 
-               return -EAFNOSUPPORT;
+       if (usin->sin6_family != AF_INET6)
+               return -EAFNOSUPPORT;
 
        memset(&fl, 0, sizeof(fl));
        if (np->sndflow) {
@@ -93,14 +92,14 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
                sin.sin_addr.s_addr = daddr->s6_addr32[3];
                sin.sin_port = usin->sin6_port;
 
-               err = ip4_datagram_connect(sk, 
-                                          (struct sockaddr*) &sin, 
+               err = ip4_datagram_connect(sk,
+                                          (struct sockaddr*) &sin,
                                           sizeof(sin));
 
 ipv4_connected:
                if (err)
                        goto out;
-               
+
                ipv6_addr_set(&np->daddr, 0, 0, htonl(0x0000ffff), inet->daddr);
 
                if (ipv6_addr_any(&np->saddr)) {
@@ -206,7 +205,7 @@ out:
        return err;
 }
 
-void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, 
+void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
                     __be16 port, u32 info, u8 *payload)
 {
        struct ipv6_pinfo *np  = inet6_sk(sk);
@@ -223,7 +222,7 @@ void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
        serr = SKB_EXT_ERR(skb);
        serr->ee.ee_errno = err;
        serr->ee.ee_origin = SO_EE_ORIGIN_ICMP6;
-       serr->ee.ee_type = icmph->icmp6_type; 
+       serr->ee.ee_type = icmph->icmp6_type;
        serr->ee.ee_code = icmph->icmp6_code;
        serr->ee.ee_pad = 0;
        serr->ee.ee_info = info;
@@ -259,7 +258,7 @@ void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info)
        serr = SKB_EXT_ERR(skb);
        serr->ee.ee_errno = err;
        serr->ee.ee_origin = SO_EE_ORIGIN_LOCAL;
-       serr->ee.ee_type = 0; 
+       serr->ee.ee_type = 0;
        serr->ee.ee_code = 0;
        serr->ee.ee_pad = 0;
        serr->ee.ee_info = info;
@@ -274,7 +273,7 @@ void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info)
                kfree_skb(skb);
 }
 
-/* 
+/*
  *     Handle MSG_ERRQUEUE
  */
 int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
@@ -312,7 +311,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
        if (sin) {
                sin->sin6_family = AF_INET6;
                sin->sin6_flowinfo = 0;
-               sin->sin6_port = serr->port; 
+               sin->sin6_port = serr->port;
                sin->sin6_scope_id = 0;
                if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP6) {
                        ipv6_addr_copy(&sin->sin6_addr,
@@ -370,7 +369,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
                spin_unlock_bh(&sk->sk_error_queue.lock);
        }
 
-out_free_skb:  
+out_free_skb:
        kfree_skb(skb);
 out:
        return err;
@@ -419,7 +418,7 @@ int datagram_recv_ctl(struct sock *sk, struct msghdr *msg, struct sk_buff *skb)
                 * report extension headers (except for HbH)
                 * in order.
                 *
-                * Also note that IPV6_RECVRTHDRDSTOPTS is NOT 
+                * Also note that IPV6_RECVRTHDRDSTOPTS is NOT
                 * (and WILL NOT be) defined because
                 * IPV6_RECVDSTOPTS is more generic. --yoshfuji
                 */
@@ -512,15 +511,15 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
                        continue;
 
                switch (cmsg->cmsg_type) {
-               case IPV6_PKTINFO:
-               case IPV6_2292PKTINFO:
-                       if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct in6_pktinfo))) {
+               case IPV6_PKTINFO:
+               case IPV6_2292PKTINFO:
+                       if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct in6_pktinfo))) {
                                err = -EINVAL;
                                goto exit_f;
                        }
 
                        src_info = (struct in6_pktinfo *)CMSG_DATA(cmsg);
-                       
+
                        if (src_info->ipi6_ifindex) {
                                if (fl->oif && src_info->ipi6_ifindex != fl->oif)
                                        return -EINVAL;
@@ -531,7 +530,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
 
                        if (addr_type == IPV6_ADDR_ANY)
                                break;
-                       
+
                        if (addr_type & IPV6_ADDR_LINKLOCAL) {
                                if (!src_info->ipi6_ifindex)
                                        return -EINVAL;
@@ -554,7 +553,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
                        break;
 
                case IPV6_FLOWINFO:
-                        if (cmsg->cmsg_len < CMSG_LEN(4)) {
+                       if (cmsg->cmsg_len < CMSG_LEN(4)) {
                                err = -EINVAL;
                                goto exit_f;
                        }
@@ -570,7 +569,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
 
                case IPV6_2292HOPOPTS:
                case IPV6_HOPOPTS:
-                        if (opt->hopopt || cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) {
+                       if (opt->hopopt || cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) {
                                err = -EINVAL;
                                goto exit_f;
                        }
@@ -590,7 +589,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
                        break;
 
                case IPV6_2292DSTOPTS:
-                        if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) {
+                       if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) {
                                err = -EINVAL;
                                goto exit_f;
                        }
@@ -641,7 +640,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
 
                case IPV6_2292RTHDR:
                case IPV6_RTHDR:
-                        if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_rt_hdr))) {
+                       if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_rt_hdr))) {
                                err = -EINVAL;
                                goto exit_f;
                        }
@@ -661,7 +660,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
 
                        len = ((rthdr->hdrlen + 1) << 3);
 
-                        if (cmsg->cmsg_len < CMSG_LEN(len)) {
+                       if (cmsg->cmsg_len < CMSG_LEN(len)) {
                                err = -EINVAL;
                                goto exit_f;
                        }
@@ -716,7 +715,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl,
                    }
                default:
                        LIMIT_NETDEBUG(KERN_DEBUG "invalid cmsg type: %d\n",
-                                      cmsg->cmsg_type);
+                                      cmsg->cmsg_type);
                        err = -EINVAL;
                        break;
                };
index 25dcf69cd807beca9b533bd2728c6d337ea1ce86..363e63ffecca26ca7eadfcbfa07b859a0abc7df8 100644 (file)
@@ -1,26 +1,26 @@
 /*
  * Copyright (C)2002 USAGI/WIDE Project
- * 
+ *
  * 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
  *
  * Authors
  *
- *     Mitsuru KANDA @USAGI       : IPv6 Support 
+ *     Mitsuru KANDA @USAGI       : IPv6 Support
  *     Kazunori MIYAZAWA @USAGI   :
  *     Kunihiro Ishiguro <kunihiro@ipinfusion.com>
- *     
+ *
  *     This file is derived from net/ipv4/esp.c
  */
 
@@ -166,7 +166,7 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb)
        }
 
        /* If integrity check is required, do this. */
-        if (esp->auth.icv_full_len) {
+       if (esp->auth.icv_full_len) {
                u8 sum[alen];
 
                ret = esp_mac_digest(esp, skb, 0, skb->len - alen);
@@ -197,7 +197,7 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb)
        if (esp->conf.ivlen)
                crypto_blkcipher_set_iv(tfm, esph->enc_data, esp->conf.ivlen);
 
-        {
+       {
                u8 nexthdr[2];
                struct scatterlist *sg = &esp->sgbuf[0];
                u8 padlen;
@@ -225,7 +225,7 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb)
                        ret = -EINVAL;
                        goto out;
                }
-               /* ... check padding bits here. Silly. :-) */ 
+               /* ... check padding bits here. Silly. :-) */
 
                pskb_trim(skb, skb->len - alen - padlen - 2);
                ret = nexthdr[1];
@@ -256,20 +256,20 @@ static u32 esp6_get_max_size(struct xfrm_state *x, int mtu)
 }
 
 static void esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
-                     int type, int code, int offset, __be32 info)
+                    int type, int code, int offset, __be32 info)
 {
        struct ipv6hdr *iph = (struct ipv6hdr*)skb->data;
        struct ipv6_esp_hdr *esph = (struct ipv6_esp_hdr*)(skb->data+offset);
        struct xfrm_state *x;
 
-       if (type != ICMPV6_DEST_UNREACH && 
+       if (type != ICMPV6_DEST_UNREACH &&
            type != ICMPV6_PKT_TOOBIG)
                return;
 
        x = xfrm_state_lookup((xfrm_address_t *)&iph->daddr, esph->spi, IPPROTO_ESP, AF_INET6);
        if (!x)
                return;
-       printk(KERN_DEBUG "pmtu discovery on SA ESP/%08x/" NIP6_FMT "\n", 
+       printk(KERN_DEBUG "pmtu discovery on SA ESP/%08x/" NIP6_FMT "\n",
                        ntohl(esph->spi), NIP6(iph->daddr));
        xfrm_state_put(x);
 }
@@ -326,10 +326,10 @@ static int esp6_init_state(struct xfrm_state *x)
                esp->auth.tfm = hash;
                if (crypto_hash_setkey(hash, esp->auth.key, esp->auth.key_len))
                        goto error;
+
                aalg_desc = xfrm_aalg_get_byname(x->aalg->alg_name, 0);
                BUG_ON(!aalg_desc);
+
                if (aalg_desc->uinfo.auth.icv_fullbits/8 !=
                    crypto_hash_digestsize(hash)) {
                        NETDEBUG(KERN_INFO "ESP: %s digestsize %u != %hu\n",
@@ -338,10 +338,10 @@ static int esp6_init_state(struct xfrm_state *x)
                                 aalg_desc->uinfo.auth.icv_fullbits/8);
                        goto error;
                }
+
                esp->auth.icv_full_len = aalg_desc->uinfo.auth.icv_fullbits/8;
                esp->auth.icv_trunc_len = aalg_desc->uinfo.auth.icv_truncbits/8;
+
                esp->auth.work_icv = kmalloc(esp->auth.icv_full_len, GFP_KERNEL);
                if (!esp->auth.work_icv)
                        goto error;
index 0711f92d6a1238961ff0f7f4acd69e5e0268cd82..28e0c6568272054ddcae0ac4e41f71493959adc2 100644 (file)
@@ -16,7 +16,7 @@
  */
 
 /* Changes:
- *     yoshfuji                : ensure not to overrun while parsing 
+ *     yoshfuji                : ensure not to overrun while parsing
  *                               tlv options.
  *     Mitsuru KANDA @USAGI and: Remove ipv6_parse_exthdrs().
  *     YOSHIFUJI Hideaki @USAGI  Register inbound extension header
@@ -27,7 +27,6 @@
 #include <linux/types.h>
 #include <linux/socket.h>
 #include <linux/sockios.h>
-#include <linux/sched.h>
 #include <linux/net.h>
 #include <linux/netdevice.h>
 #include <linux/in6.h>
@@ -167,8 +166,8 @@ static int ip6_parse_tlv(struct tlvtype_proc *procs, struct sk_buff **skbp)
                                goto bad;
                        for (curr=procs; curr->type >= 0; curr++) {
                                if (curr->type == skb->nh.raw[off]) {
-                                       /* type specific length/alignment 
-                                          checks will be performed in the 
+                                       /* type specific length/alignment
+                                          checks will be performed in the
                                           func(). */
                                        if (curr->func(skbp, off) == 0)
                                                return 0;
@@ -572,7 +571,7 @@ void __init ipv6_rthdr_init(void)
    For now we need to test the engine, so that I created
    temporary (or permanent) backdoor.
    If listening socket set IPV6_RTHDR to 2, then we invert header.
-                                                   --ANK (980729)
+                                                  --ANK (980729)
  */
 
 struct ipv6_txoptions *
@@ -635,7 +634,7 @@ static int ipv6_hop_ra(struct sk_buff **skbp, int optoff)
                return 1;
        }
        LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_ra: wrong RA length %d\n",
-                      skb->nh.raw[optoff+1]);
+                      skb->nh.raw[optoff+1]);
        kfree_skb(skb);
        return 0;
 }
@@ -649,7 +648,7 @@ static int ipv6_hop_jumbo(struct sk_buff **skbp, int optoff)
 
        if (skb->nh.raw[optoff+1] != 4 || (optoff&3) != 2) {
                LIMIT_NETDEBUG(KERN_DEBUG "ipv6_hop_jumbo: wrong jumbo opt length/alignment %d\n",
-                              skb->nh.raw[optoff+1]);
+                              skb->nh.raw[optoff+1]);
                IP6_INC_STATS_BH(ip6_dst_idev(skb->dst),
                                 IPSTATS_MIB_INHDRERRORS);
                goto drop;
@@ -740,7 +739,7 @@ static void ipv6_push_rthdr(struct sk_buff *skb, u8 *proto,
        int hops;
 
        ihdr = (struct rt0_hdr *) opt;
-       
+
        phdr = (struct rt0_hdr *) skb_push(skb, (ihdr->rt_hdr.hdrlen + 1) << 3);
        memcpy(phdr, ihdr, sizeof(struct rt0_hdr));
 
index 21cbbbddaf4dff5e23d8a59310cb5769f28773b5..e1caa5d526c2537bf610f29e4fabaa94eccb111a 100644 (file)
@@ -4,13 +4,13 @@
  */
 #include <net/ipv6.h>
 
-/* 
+/*
  * find out if nexthdr is a well-known extension header or a protocol
  */
 
 int ipv6_ext_hdr(u8 nexthdr)
 {
-       /* 
+       /*
         * find out if nexthdr is an extension header or a protocol
         */
        return ( (nexthdr == NEXTHDR_HOP)       ||
@@ -25,18 +25,18 @@ int ipv6_ext_hdr(u8 nexthdr)
  * Skip any extension headers. This is used by the ICMP module.
  *
  * Note that strictly speaking this conflicts with RFC 2460 4.0:
- * ...The contents and semantics of each extension header determine whether 
+ * ...The contents and semantics of each extension header determine whether
  * or not to proceed to the next header.  Therefore, extension headers must
  * be processed strictly in the order they appear in the packet; a
  * receiver must not, for example, scan through a packet looking for a
  * particular kind of extension header and process that header prior to
  * processing all preceding ones.
- * 
+ *
  * We do exactly this. This is a protocol bug. We can't decide after a
- * seeing an unknown discard-with-error flavour TLV option if it's a 
+ * seeing an unknown discard-with-error flavour TLV option if it's a
  * ICMP error message or not (errors should never be send in reply to
  * ICMP error messages).
- * 
+ *
  * But I see no other way to do this. This might need to be reexamined
  * when Linux implements ESP (and maybe AUTH) headers.
  * --AK
@@ -90,9 +90,9 @@ int ipv6_skip_exthdr(const struct sk_buff *skb, int start, u8 *nexthdrp)
                                break;
                        hdrlen = 8;
                } else if (nexthdr == NEXTHDR_AUTH)
-                       hdrlen = (hp->hdrlen+2)<<2; 
+                       hdrlen = (hp->hdrlen+2)<<2;
                else
-                       hdrlen = ipv6_optlen(hp); 
+                       hdrlen = ipv6_optlen(hp);
 
                nexthdr = hp->nexthdr;
                start += hdrlen;
index 3dcc4b7f41b4cc65e5e7386842323f8d98938c8a..edfe98bf64c3366818cfbd6b75a7fa3967ce9a64 100644 (file)
@@ -37,7 +37,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/sockios.h>
 #include <linux/net.h>
 #include <linux/skbuff.h>
@@ -107,7 +106,7 @@ static __inline__ void icmpv6_xmit_unlock(void)
        spin_unlock_bh(&icmpv6_socket->sk->sk_lock.slock);
 }
 
-/* 
+/*
  * Slightly more convenient version of icmpv6_send.
  */
 void icmpv6_param_prob(struct sk_buff *skb, int code, int pos)
@@ -153,8 +152,8 @@ static int is_ineligible(struct sk_buff *skb)
 
 static int sysctl_icmpv6_time __read_mostly = 1*HZ;
 
-/* 
- * Check the ICMP output rate limit 
+/*
+ * Check the ICMP output rate limit
  */
 static inline int icmpv6_xrlim_allow(struct sock *sk, int type,
                                     struct flowi *fl)
@@ -170,7 +169,7 @@ static inline int icmpv6_xrlim_allow(struct sock *sk, int type,
        if (type == ICMPV6_PKT_TOOBIG)
                return 1;
 
-       /* 
+       /*
         * Look up the output route.
         * XXX: perhaps the expire for routing entries cloned by
         * this lookup should be more aggressive (not longer than timeout).
@@ -198,7 +197,7 @@ static inline int icmpv6_xrlim_allow(struct sock *sk, int type,
 /*
  *     an inline helper for the "simple" if statement below
  *     checks if parameter problem report is caused by an
- *     unrecognized IPv6 option that has the Option Type 
+ *     unrecognized IPv6 option that has the Option Type
  *     highest-order two bits set to 10
  */
 
@@ -298,7 +297,7 @@ static inline void mip6_addr_swap(struct sk_buff *skb) {}
 /*
  *     Send an ICMP message in response to a packet in error
  */
-void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info, 
+void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
                 struct net_device *dev)
 {
        struct inet6_dev *idev = NULL;
@@ -320,7 +319,7 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
                return;
 
        /*
-        *      Make sure we respect the rules 
+        *      Make sure we respect the rules
         *      i.e. RFC 1885 2.4(e)
         *      Rule (e.1) is enforced by not using icmpv6_send
         *      in any code that processes icmp errors.
@@ -336,8 +335,8 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
 
        if ((addr_type & IPV6_ADDR_MULTICAST || skb->pkt_type != PACKET_HOST)) {
                if (type != ICMPV6_PKT_TOOBIG &&
-                   !(type == ICMPV6_PARAMPROB && 
-                     code == ICMPV6_UNK_OPTION && 
+                   !(type == ICMPV6_PARAMPROB &&
+                     code == ICMPV6_UNK_OPTION &&
                      (opt_unrec(skb, info))))
                        return;
 
@@ -364,7 +363,7 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info,
                return;
        }
 
-       /* 
+       /*
         *      Never answer to a ICMP packet.
         */
        if (is_ineligible(skb)) {
@@ -543,14 +542,14 @@ static void icmpv6_echo_reply(struct sk_buff *skb)
        }
        err = icmpv6_push_pending_frames(sk, &fl, &tmp_hdr, skb->len + sizeof(struct icmp6hdr));
 
-        ICMP6_INC_STATS_BH(idev, ICMP6_MIB_OUTECHOREPLIES);
-        ICMP6_INC_STATS_BH(idev, ICMP6_MIB_OUTMSGS);
+       ICMP6_INC_STATS_BH(idev, ICMP6_MIB_OUTECHOREPLIES);
+       ICMP6_INC_STATS_BH(idev, ICMP6_MIB_OUTMSGS);
 
-out_put: 
+out_put:
        if (likely(idev != NULL))
                in6_dev_put(idev);
        dst_release(dst);
-out: 
+out:
        icmpv6_xmit_unlock();
 }
 
@@ -608,7 +607,7 @@ static void icmpv6_notify(struct sk_buff *skb, int type, int code, __be32 info)
        }
        read_unlock(&raw_v6_lock);
 }
-  
+
 /*
  *     Handle icmp messages
  */
@@ -722,9 +721,9 @@ static int icmpv6_rcv(struct sk_buff **pskb)
                if (type & ICMPV6_INFOMSG_MASK)
                        break;
 
-               /* 
-                * error of unknown type. 
-                * must pass to upper level 
+               /*
+                * error of unknown type.
+                * must pass to upper level
                 */
 
                icmpv6_notify(skb, type, hdr->icmp6_code, hdr->icmp6_mtu);
@@ -852,7 +851,7 @@ int icmpv6_err_convert(int type, int code, int *err)
        case ICMPV6_PKT_TOOBIG:
                *err = EMSGSIZE;
                break;
-               
+
        case ICMPV6_PARAMPROB:
                *err = EPROTO;
                fatal = 1;
index e61116949bee97650f0265eecd284a892f05f27b..ae6b0e7eb4885b1722fe6e2a89a5d167b0cdf5ab 100644 (file)
@@ -115,7 +115,7 @@ struct sock *inet6_lookup_listener(struct inet_hashinfo *hashinfo,
        sk_for_each(sk, node, &hashinfo->listening_hash[inet_lhashfn(hnum)]) {
                if (inet_sk(sk)->num == hnum && sk->sk_family == PF_INET6) {
                        const struct ipv6_pinfo *np = inet6_sk(sk);
-                       
+
                        score = 1;
                        if (!ipv6_addr_any(&np->rcv_saddr)) {
                                if (!ipv6_addr_equal(&np->rcv_saddr, daddr))
@@ -172,7 +172,7 @@ static int __inet6_check_established(struct inet_timewait_death_row *death_row,
        const struct in6_addr *saddr = &np->daddr;
        const int dif = sk->sk_bound_dev_if;
        const __portpair ports = INET_COMBINED_PORTS(inet->dport, lport);
-       const unsigned int hash = inet6_ehashfn(daddr, inet->num, saddr,
+       const unsigned int hash = inet6_ehashfn(daddr, lport, saddr,
                                                inet->dport);
        struct inet_ehash_bucket *head = inet_ehash_bucket(hinfo, hash);
        struct sock *sk2;
@@ -249,81 +249,81 @@ int inet6_hash_connect(struct inet_timewait_death_row *death_row,
 {
        struct inet_hashinfo *hinfo = death_row->hashinfo;
        const unsigned short snum = inet_sk(sk)->num;
-       struct inet_bind_hashbucket *head;
-       struct inet_bind_bucket *tb;
+       struct inet_bind_hashbucket *head;
+       struct inet_bind_bucket *tb;
        int ret;
 
-       if (snum == 0) {
-               const int low = sysctl_local_port_range[0];
-               const int high = sysctl_local_port_range[1];
+       if (snum == 0) {
+               const int low = sysctl_local_port_range[0];
+               const int high = sysctl_local_port_range[1];
                const int range = high - low;
-               int i, port;
+               int i, port;
                static u32 hint;
                const u32 offset = hint + inet6_sk_port_offset(sk);
                struct hlist_node *node;
-               struct inet_timewait_sock *tw = NULL;
+               struct inet_timewait_sock *tw = NULL;
 
-               local_bh_disable();
+               local_bh_disable();
                for (i = 1; i <= range; i++) {
                        port = low + (i + offset) % range;
-                       head = &hinfo->bhash[inet_bhashfn(port, hinfo->bhash_size)];
-                       spin_lock(&head->lock);
+                       head = &hinfo->bhash[inet_bhashfn(port, hinfo->bhash_size)];
+                       spin_lock(&head->lock);
 
-                       /* Does not bother with rcv_saddr checks,
-                        * because the established check is already
-                        * unique enough.
-                        */
+                       /* Does not bother with rcv_saddr checks,
+                        * because the established check is already
+                        * unique enough.
+                        */
                        inet_bind_bucket_for_each(tb, node, &head->chain) {
-                               if (tb->port == port) {
-                                       BUG_TRAP(!hlist_empty(&tb->owners));
-                                       if (tb->fastreuse >= 0)
-                                               goto next_port;
-                                       if (!__inet6_check_established(death_row,
+                               if (tb->port == port) {
+                                       BUG_TRAP(!hlist_empty(&tb->owners));
+                                       if (tb->fastreuse >= 0)
+                                               goto next_port;
+                                       if (!__inet6_check_established(death_row,
                                                                       sk, port,
                                                                       &tw))
-                                               goto ok;
-                                       goto next_port;
-                               }
-                       }
+                                               goto ok;
+                                       goto next_port;
+                               }
+                       }
 
-                       tb = inet_bind_bucket_create(hinfo->bind_bucket_cachep,
+                       tb = inet_bind_bucket_create(hinfo->bind_bucket_cachep,
                                                     head, port);
-                       if (!tb) {
-                               spin_unlock(&head->lock);
-                               break;
-                       }
-                       tb->fastreuse = -1;
-                       goto ok;
+                       if (!tb) {
+                               spin_unlock(&head->lock);
+                               break;
+                       }
+                       tb->fastreuse = -1;
+                       goto ok;
 
-               next_port:
-                       spin_unlock(&head->lock);
-               }
-               local_bh_enable();
+               next_port:
+                       spin_unlock(&head->lock);
+               }
+               local_bh_enable();
 
-               return -EADDRNOTAVAIL;
+               return -EADDRNOTAVAIL;
 
 ok:
                hint += i;
 
-               /* Head lock still held and bh's disabled */
-               inet_bind_hash(sk, tb, port);
+               /* Head lock still held and bh's disabled */
+               inet_bind_hash(sk, tb, port);
                if (sk_unhashed(sk)) {
-                       inet_sk(sk)->sport = htons(port);
-                       __inet6_hash(hinfo, sk);
-               }
-               spin_unlock(&head->lock);
+                       inet_sk(sk)->sport = htons(port);
+                       __inet6_hash(hinfo, sk);
+               }
+               spin_unlock(&head->lock);
 
-               if (tw) {
-                       inet_twsk_deschedule(tw, death_row);
-                       inet_twsk_put(tw);
-               }
+               if (tw) {
+                       inet_twsk_deschedule(tw, death_row);
+                       inet_twsk_put(tw);
+               }
 
                ret = 0;
                goto out;
-       }
+       }
 
-       head = &hinfo->bhash[inet_bhashfn(snum, hinfo->bhash_size)];
-       tb   = inet_csk(sk)->icsk_bind_hash;
+       head = &hinfo->bhash[inet_bhashfn(snum, hinfo->bhash_size)];
+       tb   = inet_csk(sk)->icsk_bind_hash;
        spin_lock_bh(&head->lock);
 
        if (sk_head(&tb->owners) == sk && sk->sk_bind_node.next == NULL) {
index 96d8310ae9c822ed99f39899b49838e3318f56e0..f4d7be77eb0fefa93446010f9c335655c18fa654 100644 (file)
@@ -1,9 +1,9 @@
 /*
- *     Linux INET6 implementation 
+ *     Linux INET6 implementation
  *     Forwarding Information Database
  *
  *     Authors:
- *     Pedro Roque             <roque@di.fc.ul.pt>     
+ *     Pedro Roque             <roque@di.fc.ul.pt>
  *
  *     $Id: ip6_fib.c,v 1.25 2001/10/31 21:55:55 davem Exp $
  *
@@ -97,7 +97,7 @@ static DEFINE_TIMER(ip6_fib_timer, fib6_run_gc, 0, 0);
 
 static struct fib6_walker_t fib6_walker_list = {
        .prev   = &fib6_walker_list,
-       .next   = &fib6_walker_list, 
+       .next   = &fib6_walker_list,
 };
 
 #define FOR_WALKERS(w) for ((w)=fib6_walker_list.next; (w) != &fib6_walker_list; (w)=(w)->next)
@@ -131,7 +131,7 @@ static __inline__ u32 fib6_new_sernum(void)
 /*
  *     Auxiliary address test functions for the radix tree.
  *
- *     These assume a 32bit processor (although it will work on 
+ *     These assume a 32bit processor (although it will work on
  *     64bit processors)
  */
 
@@ -150,8 +150,7 @@ static __inline__ struct fib6_node * node_alloc(void)
 {
        struct fib6_node *fn;
 
-       if ((fn = kmem_cache_alloc(fib6_node_kmem, GFP_ATOMIC)) != NULL)
-               memset(fn, 0, sizeof(struct fib6_node));
+       fn = kmem_cache_zalloc(fib6_node_kmem, GFP_ATOMIC);
 
        return fn;
 }
@@ -298,7 +297,7 @@ static int fib6_dump_node(struct fib6_walker_t *w)
        int res;
        struct rt6_info *rt;
 
-       for (rt = w->leaf; rt; rt = rt->u.next) {
+       for (rt = w->leaf; rt; rt = rt->u.dst.rt6_next) {
                res = rt6_dump_route(rt, w->args);
                if (res < 0) {
                        /* Frame is full, suspend walking */
@@ -434,7 +433,7 @@ static struct fib6_node * fib6_add_1(struct fib6_node *root, void *addr,
        struct fib6_node *pn = NULL;
        struct rt6key *key;
        int     bit;
-               __be32  dir = 0;
+       __be32  dir = 0;
        __u32   sernum = fib6_new_sernum();
 
        RT6_TRACE("fib6_add_1\n");
@@ -452,27 +451,27 @@ static struct fib6_node * fib6_add_1(struct fib6_node *root, void *addr,
                if (plen < fn->fn_bit ||
                    !ipv6_prefix_equal(&key->addr, addr, fn->fn_bit))
                        goto insert_above;
-               
+
                /*
                 *      Exact match ?
                 */
-                        
+
                if (plen == fn->fn_bit) {
                        /* clean up an intermediate node */
                        if ((fn->fn_flags & RTN_RTINFO) == 0) {
                                rt6_release(fn->leaf);
                                fn->leaf = NULL;
                        }
-                       
+
                        fn->fn_sernum = sernum;
-                               
+
                        return fn;
                }
 
                /*
                 *      We have more bits to go
                 */
-                        
+
                /* Try to walk down on tree. */
                fn->fn_sernum = sernum;
                dir = addr_bit_set(addr, fn->fn_bit);
@@ -490,7 +489,7 @@ static struct fib6_node * fib6_add_1(struct fib6_node *root, void *addr,
        if (ln == NULL)
                return NULL;
        ln->fn_bit = plen;
-                       
+
        ln->parent = pn;
        ln->fn_sernum = sernum;
 
@@ -504,7 +503,7 @@ static struct fib6_node * fib6_add_1(struct fib6_node *root, void *addr,
 
 insert_above:
        /*
-        * split since we don't have a common prefix anymore or 
+        * split since we don't have a common prefix anymore or
         * we have a less significant route.
         * we've to insert an intermediate node on the list
         * this new node will point to the one we need to create
@@ -518,18 +517,18 @@ insert_above:
           See comment in __ipv6_addr_diff: bit may be an invalid value,
           but if it is >= plen, the value is ignored in any case.
         */
-       
+
        bit = __ipv6_addr_diff(addr, &key->addr, addrlen);
 
-       /* 
-        *              (intermediate)[in]      
+       /*
+        *              (intermediate)[in]
         *                /        \
         *      (new leaf node)[ln] (old node)[fn]
         */
        if (plen > bit) {
                in = node_alloc();
                ln = node_alloc();
-               
+
                if (in == NULL || ln == NULL) {
                        if (in)
                                node_free(in);
@@ -538,8 +537,8 @@ insert_above:
                        return NULL;
                }
 
-               /* 
-                * new intermediate node. 
+               /*
+                * new intermediate node.
                 * RTN_RTINFO will
                 * be off since that an address that chooses one of
                 * the branches would not match less specific routes
@@ -576,7 +575,7 @@ insert_above:
                }
        } else { /* plen <= bit */
 
-               /* 
+               /*
                 *              (new leaf node)[ln]
                 *                /        \
                 *           (old node)[fn] NULL
@@ -592,7 +591,7 @@ insert_above:
                ln->parent = pn;
 
                ln->fn_sernum = sernum;
-               
+
                if (dir)
                        pn->right = ln;
                else
@@ -624,11 +623,11 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
            fn->leaf == &ip6_null_entry &&
            !(rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) ){
                fn->leaf = rt;
-               rt->u.next = NULL;
+               rt->u.dst.rt6_next = NULL;
                goto out;
        }
 
-       for (iter = fn->leaf; iter; iter=iter->u.next) {
+       for (iter = fn->leaf; iter; iter=iter->u.dst.rt6_next) {
                /*
                 *      Search for duplicates
                 */
@@ -656,7 +655,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
                if (iter->rt6i_metric > rt->rt6i_metric)
                        break;
 
-               ins = &iter->u.next;
+               ins = &iter->u.dst.rt6_next;
        }
 
        /*
@@ -664,7 +663,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
         */
 
 out:
-       rt->u.next = iter;
+       rt->u.dst.rt6_next = iter;
        *ins = rt;
        rt->rt6i_node = fn;
        atomic_inc(&rt->rt6i_ref);
@@ -1105,7 +1104,7 @@ static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp,
        RT6_TRACE("fib6_del_route\n");
 
        /* Unlink it */
-       *rtp = rt->u.next;
+       *rtp = rt->u.dst.rt6_next;
        rt->rt6i_node = NULL;
        rt6_stats.fib_rt_entries--;
        rt6_stats.fib_discarded_routes++;
@@ -1115,14 +1114,14 @@ static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp,
        FOR_WALKERS(w) {
                if (w->state == FWS_C && w->leaf == rt) {
                        RT6_TRACE("walker %p adjusted by delroute\n", w);
-                       w->leaf = rt->u.next;
+                       w->leaf = rt->u.dst.rt6_next;
                        if (w->leaf == NULL)
                                w->state = FWS_U;
                }
        }
        read_unlock(&fib6_walker_lock);
 
-       rt->u.next = NULL;
+       rt->u.dst.rt6_next = NULL;
 
        if (fn->leaf == NULL && fn->fn_flags&RTN_TL_ROOT)
                fn->leaf = &ip6_null_entry;
@@ -1190,7 +1189,7 @@ int fib6_del(struct rt6_info *rt, struct nl_info *info)
         *      Walk the leaf entries looking for ourself
         */
 
-       for (rtp = &fn->leaf; *rtp; rtp = &(*rtp)->u.next) {
+       for (rtp = &fn->leaf; *rtp; rtp = &(*rtp)->u.dst.rt6_next) {
                if (*rtp == rt) {
                        fib6_del_route(fn, rtp, info);
                        return 0;
@@ -1206,7 +1205,7 @@ int fib6_del(struct rt6_info *rt, struct nl_info *info)
  *     However, it is internally reenterable wrt itself and fib6_add/fib6_del.
  *     It means, that we can modify tree during walking
  *     and use this function for garbage collection, clone pruning,
- *     cleaning tree when a device goes down etc. etc. 
+ *     cleaning tree when a device goes down etc. etc.
  *
  *     It guarantees that every node will be traversed,
  *     and that it will be traversed only once.
@@ -1245,7 +1244,7 @@ static int fib6_walk_continue(struct fib6_walker_t *w)
                                continue;
                        }
                        w->state = FWS_L;
-#endif 
+#endif
                case FWS_L:
                        if (fn->left) {
                                w->node = fn->left;
@@ -1317,7 +1316,7 @@ static int fib6_clean_node(struct fib6_walker_t *w)
        struct rt6_info *rt;
        struct fib6_cleaner_t *c = (struct fib6_cleaner_t*)w;
 
-       for (rt = w->leaf; rt; rt = rt->u.next) {
+       for (rt = w->leaf; rt; rt = rt->u.dst.rt6_next) {
                res = c->func(rt, c->arg);
                if (res < 0) {
                        w->leaf = rt;
@@ -1338,7 +1337,7 @@ static int fib6_clean_node(struct fib6_walker_t *w)
 
 /*
  *     Convenient frontend to tree walker.
- *     
+ *
  *     func is called on each route.
  *             It may return -1 -> delete this route.
  *                           0  -> continue walking
index 624fae251f4e227c21dd8d8abd420f143910e70f..c206a152ed9d8b4a1b82aa9df925f08ab3713458 100644 (file)
@@ -228,10 +228,10 @@ struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions * opt_space,
                                         struct ipv6_txoptions * fopt)
 {
        struct ipv6_txoptions * fl_opt = fl->opt;
-       
+
        if (fopt == NULL || fopt->opt_flen == 0)
                return fl_opt;
-       
+
        if (fl_opt != NULL) {
                opt_space->hopopt = fl_opt->hopopt;
                opt_space->dst0opt = fl_opt->dst0opt;
@@ -677,7 +677,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations ip6fl_seq_fops = {
+static const struct file_operations ip6fl_seq_fops = {
        .owner          =       THIS_MODULE,
        .open           =       ip6fl_seq_open,
        .read           =       seq_read,
index ad0b8abcdf4b65fbd9ebec449dcefd4acfb118e7..11bfc7c431824b3c9b0a3254b8574375f3b798a6 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *     IPv6 input
- *     Linux INET6 implementation 
+ *     Linux INET6 implementation
  *
  *     Authors:
  *     Pedro Roque             <roque@di.fc.ul.pt>
@@ -25,7 +25,6 @@
 #include <linux/types.h>
 #include <linux/socket.h>
 #include <linux/sockios.h>
-#include <linux/sched.h>
 #include <linux/net.h>
 #include <linux/netdevice.h>
 #include <linux/in6.h>
@@ -48,7 +47,7 @@
 
 
 
-inline int ip6_rcv_finish( struct sk_buff *skb) 
+inline int ip6_rcv_finish( struct sk_buff *skb)
 {
        if (skb->dst == NULL)
                ip6_route_input(skb);
@@ -173,9 +172,9 @@ resubmit:
        hash = nexthdr & (MAX_INET_PROTOS - 1);
        if ((ipprot = rcu_dereference(inet6_protos[hash])) != NULL) {
                int ret;
-               
+
                if (ipprot->flags & INET6_PROTO_FINAL) {
-                       struct ipv6hdr *hdr;    
+                       struct ipv6hdr *hdr;
 
                        /* Free reference early: we don't need it any more,
                           and it may hold ip_conntrack module loaded
@@ -192,9 +191,9 @@ resubmit:
                                goto discard;
                }
                if (!(ipprot->flags & INET6_PROTO_NOPOLICY) &&
-                   !xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) 
+                   !xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
                        goto discard;
-               
+
                ret = ipprot->handler(&skb);
                if (ret > 0)
                        goto resubmit;
@@ -205,8 +204,8 @@ resubmit:
                        if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
                                IP6_INC_STATS_BH(idev, IPSTATS_MIB_INUNKNOWNPROTOS);
                                icmpv6_send(skb, ICMPV6_PARAMPROB,
-                                           ICMPV6_UNK_NEXTHDR, nhoff,
-                                           skb->dev);
+                                           ICMPV6_UNK_NEXTHDR, nhoff,
+                                           skb->dev);
                        }
                } else
                        IP6_INC_STATS_BH(idev, IPSTATS_MIB_INDELIVERS);
@@ -253,7 +252,7 @@ int ip6_mc_input(struct sk_buff *skb)
                        struct dst_entry *dst;
 
                        dst = skb->dst;
-                       
+
                        if (deliver) {
                                skb2 = skb_clone(skb, GFP_ATOMIC);
                                dst_output(skb2);
index 7b7bd44fbf47f3a4b66af6a5bfef62ee8bff4d99..305516921aa8e96583422cdce873777d22f8ee29 100644 (file)
@@ -1,9 +1,9 @@
 /*
  *     IPv6 output functions
- *     Linux INET6 implementation 
+ *     Linux INET6 implementation
  *
  *     Authors:
- *     Pedro Roque             <roque@di.fc.ul.pt>     
+ *     Pedro Roque             <roque@di.fc.ul.pt>
  *
  *     $Id: ip6_output.c,v 1.34 2002/02/01 22:01:04 davem Exp $
  *
@@ -363,7 +363,7 @@ int ip6_forward(struct sk_buff *skb)
        struct dst_entry *dst = skb->dst;
        struct ipv6hdr *hdr = skb->nh.ipv6h;
        struct inet6_skb_parm *opt = IP6CB(skb);
-       
+
        if (ipv6_devconf.forwarding == 0)
                goto error;
 
@@ -473,7 +473,7 @@ int ip6_forward(struct sk_buff *skb)
        hdr = skb->nh.ipv6h;
 
        /* Mangling hops number delayed to point after skb COW */
+
        hdr->hop_limit--;
 
        IP6_INC_STATS_BH(ip6_dst_idev(dst), IPSTATS_MIB_OUTFORWDATAGRAMS);
@@ -659,7 +659,7 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *))
                                frag->nh.ipv6h->payload_len = htons(frag->len - sizeof(struct ipv6hdr));
                                ip6_copy_metadata(frag, skb);
                        }
-                       
+
                        err = output(skb);
                        if(!err)
                                IP6_INC_STATS(ip6_dst_idev(&rt->u.dst), IPSTATS_MIB_FRAGCREATES);
@@ -792,7 +792,7 @@ slow_path:
 fail:
        IP6_INC_STATS(ip6_dst_idev(skb->dst),
                      IPSTATS_MIB_FRAGFAILS);
-       kfree_skb(skb); 
+       kfree_skb(skb);
        return err;
 }
 
@@ -955,7 +955,7 @@ static inline int ip6_ufo_append_data(struct sock *sk,
                struct frag_hdr fhdr;
 
                /* specify the length of each IP datagram fragment*/
-               skb_shinfo(skb)->gso_size = mtu - fragheaderlen - 
+               skb_shinfo(skb)->gso_size = mtu - fragheaderlen -
                                            sizeof(struct frag_hdr);
                skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
                ipv6_select_ident(skb, &fhdr);
@@ -1058,13 +1058,13 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
         * fragment alignment (= 8-15 octects, in total).
         *
         * Note that we may need to "move" the data from the tail of
-        * of the buffer to the new fragment when we split 
+        * of the buffer to the new fragment when we split
         * the message.
         *
-        * FIXME: It may be fragmented into multiple chunks 
+        * FIXME: It may be fragmented into multiple chunks
         *        at once if non-fragmentable extension headers
         *        are too large.
-        * --yoshfuji 
+        * --yoshfuji
         */
 
        inet->cork.length += length;
@@ -1129,7 +1129,7 @@ alloc_new_skb:
 
                        /*
                         * We just reserve space for fragment header.
-                        * Note: this may be overallocation if the message 
+                        * Note: this may be overallocation if the message
                         * (without MSG_MORE) fits into the MTU.
                         */
                        alloclen += sizeof(struct frag_hdr);
@@ -1310,7 +1310,7 @@ int ip6_push_pending_frames(struct sock *sk)
                ipv6_push_nfrag_opts(skb, opt, &proto, &final_dst);
 
        skb->nh.ipv6h = hdr = (struct ipv6hdr*) skb_push(skb, sizeof(struct ipv6hdr));
-       
+
        *(__be32*)hdr = fl->fl6_flowlabel |
                     htonl(0x60000000 | ((int)np->cork.tclass << 20));
 
index 2b9e3bb7da653b5c3a4ef313590c7e1971832cfe..662edb826899e5c78ba6f219699a8c4ac9199f4e 100644 (file)
@@ -3,7 +3,7 @@
  *     Linux INET6 implementation
  *
  *     Authors:
- *     Ville Nuorvala          <vnuorval@tcs.hut.fi>   
+ *     Ville Nuorvala          <vnuorval@tcs.hut.fi>
  *
  *     $Id$
  *
@@ -67,8 +67,8 @@ MODULE_LICENSE("GPL");
 #define HASH_SIZE  32
 
 #define HASH(addr) ((__force u32)((addr)->s6_addr32[0] ^ (addr)->s6_addr32[1] ^ \
-                    (addr)->s6_addr32[2] ^ (addr)->s6_addr32[3]) & \
-                    (HASH_SIZE - 1))
+                    (addr)->s6_addr32[2] ^ (addr)->s6_addr32[3]) & \
+                   (HASH_SIZE - 1))
 
 static int ip6ip6_fb_tnl_dev_init(struct net_device *dev);
 static int ip6ip6_tnl_dev_init(struct net_device *dev);
@@ -90,7 +90,7 @@ static inline struct dst_entry *ip6_tnl_dst_check(struct ip6_tnl *t)
 {
        struct dst_entry *dst = t->dst_cache;
 
-       if (dst && dst->obsolete && 
+       if (dst && dst->obsolete &&
            dst->ops->check(dst, t->dst_cookie) == NULL) {
                t->dst_cache = NULL;
                dst_release(dst);
@@ -116,12 +116,12 @@ static inline void ip6_tnl_dst_store(struct ip6_tnl *t, struct dst_entry *dst)
 
 /**
  * ip6ip6_tnl_lookup - fetch tunnel matching the end-point addresses
- *   @remote: the address of the tunnel exit-point 
- *   @local: the address of the tunnel entry-point 
+ *   @remote: the address of the tunnel exit-point
+ *   @local: the address of the tunnel entry-point
  *
- * Return:  
+ * Return:
  *   tunnel matching given end-points if found,
- *   else fallback tunnel if its device is up, 
+ *   else fallback tunnel if its device is up,
  *   else %NULL
  **/
 
@@ -146,13 +146,13 @@ ip6ip6_tnl_lookup(struct in6_addr *remote, struct in6_addr *local)
 
 /**
  * ip6ip6_bucket - get head of list matching given tunnel parameters
- *   @p: parameters containing tunnel end-points 
+ *   @p: parameters containing tunnel end-points
  *
  * Description:
- *   ip6ip6_bucket() returns the head of the list matching the 
+ *   ip6ip6_bucket() returns the head of the list matching the
  *   &struct in6_addr entries laddr and raddr in @p.
  *
- * Return: head of IPv6 tunnel list 
+ * Return: head of IPv6 tunnel list
  **/
 
 static struct ip6_tnl **
@@ -213,8 +213,8 @@ ip6ip6_tnl_unlink(struct ip6_tnl *t)
  *
  * Description:
  *   Create tunnel matching given parameters.
- * 
- * Return: 
+ *
+ * Return:
  *   created tunnel or NULL
  **/
 
@@ -234,7 +234,7 @@ static struct ip6_tnl *ip6_tnl_create(struct ip6_tnl_parm *p)
                        if (__dev_get_by_name(name) == NULL)
                                break;
                }
-               if (i == IP6_TNL_MAX) 
+               if (i == IP6_TNL_MAX)
                        goto failed;
        }
        dev = alloc_netdev(sizeof (*t), name, ip6ip6_tnl_dev_setup);
@@ -258,7 +258,7 @@ failed:
 
 /**
  * ip6ip6_tnl_locate - find or create tunnel matching given parameters
- *   @p: tunnel parameters 
+ *   @p: tunnel parameters
  *   @create: != 0 if allowed to create new tunnel if no match found
  *
  * Description:
@@ -289,7 +289,7 @@ static struct ip6_tnl *ip6ip6_tnl_locate(struct ip6_tnl_parm *p, int create)
 /**
  * ip6ip6_tnl_dev_uninit - tunnel device uninitializer
  *   @dev: the device to be destroyed
- *   
+ *
  * Description:
  *   ip6ip6_tnl_dev_uninit() removes tunnel from its list
  **/
@@ -314,8 +314,8 @@ ip6ip6_tnl_dev_uninit(struct net_device *dev)
  * parse_tvl_tnl_enc_lim - handle encapsulation limit option
  *   @skb: received socket buffer
  *
- * Return: 
- *   0 if none was found, 
+ * Return:
+ *   0 if none was found,
  *   else index to encapsulation limit
  **/
 
@@ -392,8 +392,8 @@ ip6ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
        __u16 len;
        int err = -ENOENT;
 
-       /* If the packet doesn't contain the original IPv6 header we are 
-          in trouble since we might need the source address for further 
+       /* If the packet doesn't contain the original IPv6 header we are
+          in trouble since we might need the source address for further
           processing of the error. */
 
        read_lock(&ip6ip6_lock);
@@ -418,7 +418,7 @@ ip6ip6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
                        if (net_ratelimit())
                                printk(KERN_WARNING
                                       "%s: Too small hop limit or "
-                                      "routing loop in tunnel!\n", 
+                                      "routing loop in tunnel!\n",
                                       t->parms.name);
                        rel_msg = 1;
                }
@@ -502,7 +502,7 @@ static inline int ip6_tnl_rcv_ctl(struct ip6_tnl *t)
        int ret = 0;
 
        if (p->flags & IP6_TNL_F_CAP_RCV) {
-               struct net_device *ldev = NULL;
+               struct net_device *ldev = NULL;
 
                if (p->link)
                        ldev = dev_get_by_index(p->link);
@@ -525,7 +525,7 @@ static inline int ip6_tnl_rcv_ctl(struct ip6_tnl *t)
  * Return: 0
  **/
 
-static int 
+static int
 ip6ip6_rcv(struct sk_buff *skb)
 {
        struct ipv6hdr *ipv6h;
@@ -595,13 +595,13 @@ static void init_tel_txopt(struct ipv6_tel_txoption *opt, __u8 encap_limit)
 /**
  * ip6ip6_tnl_addr_conflict - compare packet addresses to tunnel's own
  *   @t: the outgoing tunnel device
- *   @hdr: IPv6 header from the incoming packet 
+ *   @hdr: IPv6 header from the incoming packet
  *
  * Description:
- *   Avoid trivial tunneling loop by checking that tunnel exit-point 
+ *   Avoid trivial tunneling loop by checking that tunnel exit-point
  *   doesn't match source of incoming packet.
  *
- * Return: 
+ * Return:
  *   1 if conflict,
  *   0 else
  **/
@@ -617,7 +617,7 @@ static inline int ip6_tnl_xmit_ctl(struct ip6_tnl *t)
        struct ip6_tnl_parm *p = &t->parms;
        int ret = 0;
 
-       if (p->flags & IP6_TNL_F_CAP_XMIT) {
+       if (p->flags & IP6_TNL_F_CAP_XMIT) {
                struct net_device *ldev = NULL;
 
                if (p->link)
@@ -641,19 +641,19 @@ static inline int ip6_tnl_xmit_ctl(struct ip6_tnl *t)
        return ret;
 }
 /**
- * ip6ip6_tnl_xmit - encapsulate packet and send 
+ * ip6ip6_tnl_xmit - encapsulate packet and send
  *   @skb: the outgoing socket buffer
- *   @dev: the outgoing tunnel device 
+ *   @dev: the outgoing tunnel device
  *
  * Description:
  *   Build new header and do some sanity checks on the packet before sending
  *   it.
  *
- * Return: 
+ * Return:
  *   0
  **/
 
-static int 
+static int
 ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        struct ip6_tnl *t = netdev_priv(dev);
@@ -715,7 +715,7 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
        if (tdev == dev) {
                stats->collisions++;
                if (net_ratelimit())
-                       printk(KERN_WARNING 
+                       printk(KERN_WARNING
                               "%s: Local routing loop detected!\n",
                               t->parms.name);
                goto tx_err_dst_release;
@@ -741,11 +741,11 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
         * Okay, now see if we can stuff it in the buffer as-is.
         */
        max_headroom += LL_RESERVED_SPACE(tdev);
-       
-       if (skb_headroom(skb) < max_headroom || 
+
+       if (skb_headroom(skb) < max_headroom ||
            skb_cloned(skb) || skb_shared(skb)) {
                struct sk_buff *new_skb;
-               
+
                if (!(new_skb = skb_realloc_headroom(skb, max_headroom)))
                        goto tx_err_dst_release;
 
@@ -775,7 +775,7 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev)
        ipv6_addr_copy(&ipv6h->daddr, &fl.fl6_dst);
        nf_reset(skb);
        pkt_len = skb->len;
-       err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, 
+       err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL,
                      skb->dst->dev, dst_output);
 
        if (net_xmit_eval(err) == 0) {
@@ -898,14 +898,14 @@ ip6ip6_tnl_change(struct ip6_tnl *t, struct ip6_tnl_parm *p)
 }
 
 /**
- * ip6ip6_tnl_ioctl - configure ipv6 tunnels from userspace 
+ * ip6ip6_tnl_ioctl - configure ipv6 tunnels from userspace
  *   @dev: virtual device associated with tunnel
  *   @ifr: parameters passed from userspace
  *   @cmd: command to be performed
  *
  * Description:
- *   ip6ip6_tnl_ioctl() is used for managing IPv6 tunnels 
- *   from userspace. 
+ *   ip6ip6_tnl_ioctl() is used for managing IPv6 tunnels
+ *   from userspace.
  *
  *   The possible commands are the following:
  *     %SIOCGETTUNNEL: get tunnel parameters for device
@@ -913,7 +913,7 @@ ip6ip6_tnl_change(struct ip6_tnl *t, struct ip6_tnl_parm *p)
  *     %SIOCCHGTUNNEL: change tunnel parameters to those given
  *     %SIOCDELTUNNEL: delete tunnel
  *
- *   The fallback device "ip6tnl0", created during module 
+ *   The fallback device "ip6tnl0", created during module
  *   initialization, can be used for creating other tunnel devices.
  *
  * Return:
@@ -1009,7 +1009,7 @@ ip6ip6_tnl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 }
 
 /**
- * ip6ip6_tnl_get_stats - return the stats for tunnel device 
+ * ip6ip6_tnl_get_stats - return the stats for tunnel device
  *   @dev: virtual device associated with tunnel
  *
  * Return: stats for device
@@ -1102,7 +1102,7 @@ ip6ip6_tnl_dev_init(struct net_device *dev)
  * Return: 0
  **/
 
-static int 
+static int
 ip6ip6_fb_tnl_dev_init(struct net_device *dev)
 {
        struct ip6_tnl *t = netdev_priv(dev);
@@ -1128,7 +1128,7 @@ static int __init ip6_tunnel_init(void)
 {
        int  err;
 
-       if (xfrm6_tunnel_register(&ip6ip6_handler)) {
+       if (xfrm6_tunnel_register(&ip6ip6_handler, AF_INET6)) {
                printk(KERN_ERR "ip6ip6 init: can't register tunnel\n");
                return -EAGAIN;
        }
@@ -1147,7 +1147,7 @@ static int __init ip6_tunnel_init(void)
        }
        return 0;
 fail:
-       xfrm6_tunnel_deregister(&ip6ip6_handler);
+       xfrm6_tunnel_deregister(&ip6ip6_handler, AF_INET6);
        return err;
 }
 
@@ -1171,7 +1171,7 @@ static void __exit ip6ip6_destroy_tunnels(void)
 
 static void __exit ip6_tunnel_cleanup(void)
 {
-       if (xfrm6_tunnel_deregister(&ip6ip6_handler))
+       if (xfrm6_tunnel_deregister(&ip6ip6_handler, AF_INET6))
                printk(KERN_INFO "ip6ip6 close: can't deregister tunnel\n");
 
        rtnl_lock();
index 511730b67e97fb0ba1f9d167c07e120ea3b34f6a..5724ba9f75de595f13f0e6f0e8459020f425f590 100644 (file)
@@ -9,25 +9,25 @@
  * 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
  */
-/* 
+/*
  * [Memo]
  *
  * Outbound:
- *  The compression of IP datagram MUST be done before AH/ESP processing, 
- *  fragmentation, and the addition of Hop-by-Hop/Routing header. 
+ *  The compression of IP datagram MUST be done before AH/ESP processing,
+ *  fragmentation, and the addition of Hop-by-Hop/Routing header.
  *
  * Inbound:
- *  The decompression of IP datagram MUST be done after the reassembly, 
+ *  The decompression of IP datagram MUST be done after the reassembly,
  *  AH/ESP processing.
  */
 #include <linux/module.h>
@@ -176,7 +176,7 @@ out_ok:
 }
 
 static void ipcomp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
-                               int type, int code, int offset, __be32 info)
+                               int type, int code, int offset, __be32 info)
 {
        __be32 spi;
        struct ipv6hdr *iph = (struct ipv6hdr*)skb->data;
@@ -422,7 +422,7 @@ static int ipcomp6_init_state(struct xfrm_state *x)
        x->props.header_len = 0;
        if (x->props.mode == XFRM_MODE_TUNNEL)
                x->props.header_len += sizeof(struct ipv6hdr);
-       
+
        mutex_lock(&ipcomp6_resource_mutex);
        if (!ipcomp6_alloc_scratches())
                goto error;
@@ -455,7 +455,7 @@ error:
        goto out;
 }
 
-static struct xfrm_type ipcomp6_type = 
+static struct xfrm_type ipcomp6_type =
 {
        .description    = "IPCOMP6",
        .owner          = THIS_MODULE,
@@ -467,7 +467,7 @@ static struct xfrm_type ipcomp6_type =
        .hdr_offset     = xfrm6_find_1stfragopt,
 };
 
-static struct inet6_protocol ipcomp6_protocol = 
+static struct inet6_protocol ipcomp6_protocol =
 {
        .handler        = xfrm6_rcv,
        .err_handler    = ipcomp6_err,
@@ -490,7 +490,7 @@ static int __init ipcomp6_init(void)
 
 static void __exit ipcomp6_fini(void)
 {
-       if (inet6_del_protocol(&ipcomp6_protocol, IPPROTO_COMP) < 0) 
+       if (inet6_del_protocol(&ipcomp6_protocol, IPPROTO_COMP) < 0)
                printk(KERN_INFO "ipv6 ipcomp close: can't remove protocol\n");
        if (xfrm_unregister_type(&ipcomp6_type, AF_INET6) < 0)
                printk(KERN_INFO "ipv6 ipcomp close: can't remove xfrm type\n");
index 352690e2ab8280ec89019697cca70d48ada6e48c..286c86735aed7772f6851228026d0a633a1d45bd 100644 (file)
@@ -1,9 +1,9 @@
 /*
  *     IPv6 BSD socket options interface
- *     Linux INET6 implementation 
+ *     Linux INET6 implementation
  *
  *     Authors:
- *     Pedro Roque             <roque@di.fc.ul.pt>     
+ *     Pedro Roque             <roque@di.fc.ul.pt>
  *
  *     Based on linux/net/ipv4/ip_sockglue.c
  *
@@ -31,7 +31,6 @@
 #include <linux/types.h>
 #include <linux/socket.h>
 #include <linux/sockios.h>
-#include <linux/sched.h>
 #include <linux/net.h>
 #include <linux/in6.h>
 #include <linux/netdevice.h>
@@ -164,7 +163,7 @@ out:
 }
 
 static struct packet_type ipv6_packet_type = {
-       .type = __constant_htons(ETH_P_IPV6), 
+       .type = __constant_htons(ETH_P_IPV6),
        .func = ipv6_rcv,
        .gso_send_check = ipv6_gso_send_check,
        .gso_segment = ipv6_gso_segment,
@@ -320,7 +319,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
                np->rxopt.bits.rxinfo = valbool;
                retv = 0;
                break;
-               
+
        case IPV6_2292PKTINFO:
                np->rxopt.bits.rxoinfo = valbool;
                retv = 0;
@@ -376,7 +375,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
                np->tclass = val;
                retv = 0;
                break;
-               
+
        case IPV6_RECVTCLASS:
                np->rxopt.bits.rxtclass = valbool;
                retv = 0;
@@ -893,7 +892,7 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
        case IPV6_MTU:
        {
                struct dst_entry *dst;
-               val = 0;        
+               val = 0;
                lock_sock(sk);
                dst = sk_dst_get(sk);
                if (dst) {
index e3ec216958328ff12820d9f858a6041f847a758e..a8d6625ec7822aa7cd4fb8951e1e2d3b251b0689 100644 (file)
@@ -1,13 +1,13 @@
 /*
  *     Multicast support for IPv6
- *     Linux INET6 implementation 
+ *     Linux INET6 implementation
  *
  *     Authors:
- *     Pedro Roque             <roque@di.fc.ul.pt>     
+ *     Pedro Roque             <roque@di.fc.ul.pt>
  *
  *     $Id: mcast.c,v 1.40 2002/02/08 03:57:19 davem Exp $
  *
- *     Based on linux/ipv4/igmp.c and linux/ipv4/ip_sockglue.c 
+ *     Based on linux/ipv4/igmp.c and linux/ipv4/ip_sockglue.c
  *
  *     This program is free software; you can redistribute it and/or
  *      modify it under the terms of the GNU General Public License
@@ -644,7 +644,7 @@ int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf,
                memset(&ss, 0, sizeof(ss));
                psin6->sin6_family = AF_INET6;
                psin6->sin6_addr = psl->sl_addr[i];
-               if (copy_to_user(&optval->gf_slist[i], &ss, sizeof(ss)))
+               if (copy_to_user(&optval->gf_slist[i], &ss, sizeof(ss)))
                        return -EFAULT;
        }
        return 0;
@@ -1168,7 +1168,7 @@ int igmp6_event_query(struct sk_buff *skb)
 
        /* compute payload length excluding extension headers */
        len = ntohs(skb->nh.ipv6h->payload_len) + sizeof(struct ipv6hdr);
-       len -= (char *)skb->h.raw - (char *)skb->nh.ipv6h; 
+       len -= (char *)skb->h.raw - (char *)skb->nh.ipv6h;
 
        /* Drop queries with not link local source */
        if (!(ipv6_addr_type(&skb->nh.ipv6h->saddr)&IPV6_ADDR_LINKLOCAL))
@@ -1206,7 +1206,7 @@ int igmp6_event_query(struct sk_buff *skb)
                /* clear deleted report items */
                mld_clear_delrec(idev);
        } else if (len >= 28) {
-               int srcs_offset = sizeof(struct mld2_query) - 
+               int srcs_offset = sizeof(struct mld2_query) -
                                  sizeof(struct icmp6hdr);
                if (!pskb_may_pull(skb, srcs_offset)) {
                        in6_dev_put(idev);
@@ -1230,7 +1230,7 @@ int igmp6_event_query(struct sk_buff *skb)
                }
                /* mark sources to include, if group & source-specific */
                if (mlh2->nsrcs != 0) {
-                       if (!pskb_may_pull(skb, srcs_offset + 
+                       if (!pskb_may_pull(skb, srcs_offset +
                            ntohs(mlh2->nsrcs) * sizeof(struct in6_addr))) {
                                in6_dev_put(idev);
                                return -EINVAL;
@@ -1304,7 +1304,7 @@ int igmp6_event_report(struct sk_buff *skb)
 
        /* Drop reports with not link local source */
        addr_type = ipv6_addr_type(&skb->nh.ipv6h->saddr);
-       if (addr_type != IPV6_ADDR_ANY && 
+       if (addr_type != IPV6_ADDR_ANY &&
            !(addr_type&IPV6_ADDR_LINKLOCAL))
                return -EINVAL;
 
@@ -1413,7 +1413,7 @@ static struct sk_buff *mld_newpack(struct net_device *dev, int size)
 
        if (ipv6_get_lladdr(dev, &addr_buf)) {
                /* <draft-ietf-magma-mld-source-05.txt>:
-                * use unspecified address as the source address 
+                * use unspecified address as the source address
                 * when a valid link-local address is not available.
                 */
                memset(&addr_buf, 0, sizeof(addr_buf));
@@ -1454,7 +1454,7 @@ static inline int mld_dev_queue_xmit2(struct sk_buff *skb)
 static inline int mld_dev_queue_xmit(struct sk_buff *skb)
 {
        return NF_HOOK(PF_INET6, NF_IP6_POST_ROUTING, skb, NULL, skb->dev,
-                      mld_dev_queue_xmit2);
+                      mld_dev_queue_xmit2);
 }
 
 static void mld_sendpack(struct sk_buff *skb)
@@ -1754,8 +1754,8 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
 {
        struct sock *sk = igmp6_socket->sk;
        struct inet6_dev *idev;
-        struct sk_buff *skb;
-        struct icmp6hdr *hdr;
+       struct sk_buff *skb;
+       struct icmp6hdr *hdr;
        struct in6_addr *snd_addr;
        struct in6_addr *addrp;
        struct in6_addr addr_buf;
@@ -1793,7 +1793,7 @@ static void igmp6_send(struct in6_addr *addr, struct net_device *dev, int type)
 
        if (ipv6_get_lladdr(dev, &addr_buf)) {
                /* <draft-ietf-magma-mld-source-05.txt>:
-                * use unspecified address as the source address 
+                * use unspecified address as the source address
                 * when a valid link-local address is not available.
                 */
                memset(&addr_buf, 0, sizeof(addr_buf));
@@ -2330,7 +2330,7 @@ static inline struct ifmcaddr6 *igmp6_mc_get_first(struct seq_file *seq)
        struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq);
 
        for (state->dev = dev_base, state->idev = NULL;
-            state->dev; 
+            state->dev;
             state->dev = state->dev->next) {
                struct inet6_dev *idev;
                idev = in6_dev_get(state->dev);
@@ -2413,7 +2413,7 @@ static int igmp6_mc_seq_show(struct seq_file *seq, void *v)
        struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq);
 
        seq_printf(seq,
-                  "%-4d %-15s " NIP6_SEQFMT " %5d %08X %ld\n", 
+                  "%-4d %-15s " NIP6_SEQFMT " %5d %08X %ld\n",
                   state->dev->ifindex, state->dev->name,
                   NIP6(im->mca_addr),
                   im->mca_users, im->mca_flags,
@@ -2451,7 +2451,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations igmp6_mc_seq_fops = {
+static const struct file_operations igmp6_mc_seq_fops = {
        .owner          =       THIS_MODULE,
        .open           =       igmp6_mc_seq_open,
        .read           =       seq_read,
@@ -2474,7 +2474,7 @@ static inline struct ip6_sf_list *igmp6_mcf_get_first(struct seq_file *seq)
        struct igmp6_mcf_iter_state *state = igmp6_mcf_seq_private(seq);
 
        for (state->dev = dev_base, state->idev = NULL, state->im = NULL;
-            state->dev; 
+            state->dev;
             state->dev = state->dev->next) {
                struct inet6_dev *idev;
                idev = in6_dev_get(state->dev);
@@ -2579,7 +2579,7 @@ static int igmp6_mcf_seq_show(struct seq_file *seq, void *v)
        struct igmp6_mcf_iter_state *state = igmp6_mcf_seq_private(seq);
 
        if (v == SEQ_START_TOKEN) {
-               seq_printf(seq, 
+               seq_printf(seq,
                           "%3s %6s "
                           "%32s %32s %6s %6s\n", "Idx",
                           "Device", "Multicast Address",
@@ -2608,7 +2608,7 @@ static int igmp6_mcf_seq_open(struct inode *inode, struct file *file)
        struct seq_file *seq;
        int rc = -ENOMEM;
        struct igmp6_mcf_iter_state *s = kzalloc(sizeof(*s), GFP_KERNEL);
-       
+
        if (!s)
                goto out;
 
@@ -2625,7 +2625,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations igmp6_mcf_seq_fops = {
+static const struct file_operations igmp6_mcf_seq_fops = {
        .owner          =       THIS_MODULE,
        .open           =       igmp6_mcf_seq_open,
        .read           =       seq_read,
index 681bb077eaccf1ef90fd0f0601c2ad4c7afcac21..0afcabdd8ed6c9a52d434cce18ca96495dcc591c 100644 (file)
@@ -333,7 +333,7 @@ static struct xfrm_type mip6_destopt_type =
        .destructor     = mip6_destopt_destroy,
        .input          = mip6_destopt_input,
        .output         = mip6_destopt_output,
-       .reject         = mip6_destopt_reject,
+       .reject         = mip6_destopt_reject,
        .hdr_offset     = mip6_destopt_offset,
        .local_addr     = mip6_xfrm_addr,
 };
index 39bb658f3c447782ddd411102477cddaee9538be..121f31c283f8f823a0a26e747124839f542449ff 100644 (file)
@@ -1,9 +1,9 @@
 /*
  *     Neighbour Discovery for IPv6
- *     Linux INET6 implementation 
+ *     Linux INET6 implementation
  *
  *     Authors:
- *     Pedro Roque             <roque@di.fc.ul.pt>     
+ *     Pedro Roque             <roque@di.fc.ul.pt>
  *     Mike Shaver             <shaver@ingenia.com>
  *
  *     This program is free software; you can redistribute it and/or
@@ -427,25 +427,25 @@ static inline void ndisc_flow_init(struct flowi *fl, u8 type,
 
 static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
                   struct in6_addr *daddr, struct in6_addr *solicited_addr,
-                  int router, int solicited, int override, int inc_opt) 
+                  int router, int solicited, int override, int inc_opt)
 {
        struct in6_addr tmpaddr;
        struct inet6_ifaddr *ifp;
        struct inet6_dev *idev;
        struct flowi fl;
        struct dst_entry* dst;
-        struct sock *sk = ndisc_socket->sk;
+       struct sock *sk = ndisc_socket->sk;
        struct in6_addr *src_addr;
-        struct nd_msg *msg;
-        int len;
-        struct sk_buff *skb;
+       struct nd_msg *msg;
+       int len;
+       struct sk_buff *skb;
        int err;
 
        len = sizeof(struct icmp6hdr) + sizeof(struct in6_addr);
 
        /* for anycast or proxy, solicited_addr != src_addr */
        ifp = ipv6_get_ifaddr(solicited_addr, dev, 1);
-       if (ifp) {
+       if (ifp) {
                src_addr = solicited_addr;
                in6_ifa_put(ifp);
        } else {
@@ -479,7 +479,7 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
 
        if (skb == NULL) {
                ND_PRINTK0(KERN_ERR
-                          "ICMPv6 NA: %s() failed to allocate an skb.\n", 
+                          "ICMPv6 NA: %s() failed to allocate an skb.\n",
                           __FUNCTION__);
                dst_release(dst);
                return;
@@ -491,16 +491,16 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
        msg = (struct nd_msg *)skb_put(skb, len);
        skb->h.raw = (unsigned char*)msg;
 
-        msg->icmph.icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT;
-        msg->icmph.icmp6_code = 0;
-        msg->icmph.icmp6_cksum = 0;
+       msg->icmph.icmp6_type = NDISC_NEIGHBOUR_ADVERTISEMENT;
+       msg->icmph.icmp6_code = 0;
+       msg->icmph.icmp6_cksum = 0;
 
-        msg->icmph.icmp6_unused = 0;
-        msg->icmph.icmp6_router    = router;
-        msg->icmph.icmp6_solicited = solicited;
-        msg->icmph.icmp6_override  = override;
+       msg->icmph.icmp6_unused = 0;
+       msg->icmph.icmp6_router    = router;
+       msg->icmph.icmp6_solicited = solicited;
+       msg->icmph.icmp6_override  = override;
 
-        /* Set the target address. */
+       /* Set the target address. */
        ipv6_addr_copy(&msg->target, solicited_addr);
 
        if (inc_opt)
@@ -508,9 +508,9 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
                                       dev->addr_len, dev->type);
 
        /* checksum */
-       msg->icmph.icmp6_cksum = csum_ipv6_magic(src_addr, daddr, len, 
+       msg->icmph.icmp6_cksum = csum_ipv6_magic(src_addr, daddr, len,
                                                 IPPROTO_ICMPV6,
-                                                csum_partial((__u8 *) msg, 
+                                                csum_partial((__u8 *) msg,
                                                              len, 0));
 
        skb->dst = dst;
@@ -524,20 +524,20 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh,
 
        if (likely(idev != NULL))
                in6_dev_put(idev);
-}        
+}
 
 void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
                   struct in6_addr *solicit,
-                  struct in6_addr *daddr, struct in6_addr *saddr) 
+                  struct in6_addr *daddr, struct in6_addr *saddr)
 {
        struct flowi fl;
        struct dst_entry* dst;
        struct inet6_dev *idev;
-        struct sock *sk = ndisc_socket->sk;
-        struct sk_buff *skb;
-        struct nd_msg *msg;
+       struct sock *sk = ndisc_socket->sk;
+       struct sk_buff *skb;
+       struct nd_msg *msg;
        struct in6_addr addr_buf;
-        int len;
+       int len;
        int err;
        int send_llinfo;
 
@@ -569,7 +569,7 @@ void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
                                  1, &err);
        if (skb == NULL) {
                ND_PRINTK0(KERN_ERR
-                          "ICMPv6 NA: %s() failed to allocate an skb.\n", 
+                          "ICMPv6 NA: %s() failed to allocate an skb.\n",
                           __FUNCTION__);
                dst_release(dst);
                return;
@@ -594,9 +594,9 @@ void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh,
 
        /* checksum */
        msg->icmph.icmp6_cksum = csum_ipv6_magic(&skb->nh.ipv6h->saddr,
-                                                daddr, len, 
+                                                daddr, len,
                                                 IPPROTO_ICMPV6,
-                                                csum_partial((__u8 *) msg, 
+                                                csum_partial((__u8 *) msg,
                                                              len, 0));
        /* send it! */
        skb->dst = dst;
@@ -619,10 +619,10 @@ void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr,
        struct dst_entry* dst;
        struct inet6_dev *idev;
        struct sock *sk = ndisc_socket->sk;
-        struct sk_buff *skb;
-        struct icmp6hdr *hdr;
+       struct sk_buff *skb;
+       struct icmp6hdr *hdr;
        __u8 * opt;
-        int len;
+       int len;
        int err;
 
        ndisc_flow_init(&fl, NDISC_ROUTER_SOLICITATION, saddr, daddr,
@@ -640,13 +640,13 @@ void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr,
        if (dev->addr_len)
                len += ndisc_opt_addr_space(dev);
 
-        skb = sock_alloc_send_skb(sk,
+       skb = sock_alloc_send_skb(sk,
                                  (MAX_HEADER + sizeof(struct ipv6hdr) +
                                   len + LL_RESERVED_SPACE(dev)),
                                  1, &err);
        if (skb == NULL) {
                ND_PRINTK0(KERN_ERR
-                          "ICMPv6 RS: %s() failed to allocate an skb.\n", 
+                          "ICMPv6 RS: %s() failed to allocate an skb.\n",
                           __FUNCTION__);
                dst_release(dst);
                return;
@@ -655,12 +655,12 @@ void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr,
        skb_reserve(skb, LL_RESERVED_SPACE(dev));
        ip6_nd_hdr(sk, skb, dev, saddr, daddr, IPPROTO_ICMPV6, len);
 
-        hdr = (struct icmp6hdr *)skb_put(skb, len);
-        skb->h.raw = (unsigned char*)hdr;
-        hdr->icmp6_type = NDISC_ROUTER_SOLICITATION;
-        hdr->icmp6_code = 0;
-        hdr->icmp6_cksum = 0;
-        hdr->icmp6_unused = 0;
+       hdr = (struct icmp6hdr *)skb_put(skb, len);
+       skb->h.raw = (unsigned char*)hdr;
+       hdr->icmp6_type = NDISC_ROUTER_SOLICITATION;
+       hdr->icmp6_code = 0;
+       hdr->icmp6_cksum = 0;
+       hdr->icmp6_unused = 0;
 
        opt = (u8*) (hdr + 1);
 
@@ -686,7 +686,7 @@ void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr,
        if (likely(idev != NULL))
                in6_dev_put(idev);
 }
-                  
+
 
 static void ndisc_error_report(struct neighbour *neigh, struct sk_buff *skb)
 {
@@ -748,7 +748,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
        int is_router;
 
        if (ipv6_addr_is_multicast(&msg->target)) {
-               ND_PRINTK2(KERN_WARNING 
+               ND_PRINTK2(KERN_WARNING
                           "ICMPv6 NS: multicast target address");
                return;
        }
@@ -768,7 +768,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
        }
 
        if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
-               ND_PRINTK2(KERN_WARNING 
+               ND_PRINTK2(KERN_WARNING
                           "ICMPv6 NS: invalid ND options\n");
                return;
        }
@@ -782,12 +782,12 @@ static void ndisc_recv_ns(struct sk_buff *skb)
                }
 
                /* RFC2461 7.1.1:
-                *      If the IP source address is the unspecified address, 
-                *      there MUST NOT be source link-layer address option 
+                *      If the IP source address is the unspecified address,
+                *      there MUST NOT be source link-layer address option
                 *      in the message.
                 */
                if (dad) {
-                       ND_PRINTK2(KERN_WARNING 
+                       ND_PRINTK2(KERN_WARNING
                                   "ICMPv6 NS: bad DAD packet (link-layer address option)\n");
                        return;
                }
@@ -816,7 +816,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
                                        goto out;
                                }
                        }
-                       addrconf_dad_failure(ifp); 
+                       addrconf_dad_failure(ifp);
                        return;
                }
 
@@ -829,7 +829,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
                }
 
                if (ipv6_chk_acast_addr(dev, &msg->target) ||
-                   (idev->cnf.forwarding && 
+                   (idev->cnf.forwarding &&
                     (ipv6_devconf.proxy_ndp || idev->cnf.proxy_ndp) &&
                     (pneigh = pneigh_lookup(&nd_tbl,
                                             &msg->target, dev, 0)) != NULL)) {
@@ -839,8 +839,8 @@ static void ndisc_recv_ns(struct sk_buff *skb)
                            idev->nd_parms->proxy_delay != 0) {
                                /*
                                 * for anycast or proxy,
-                                * sender should delay its response 
-                                * by a random time between 0 and 
+                                * sender should delay its response
+                                * by a random time between 0 and
                                 * MAX_ANYCAST_DELAY_TIME seconds.
                                 * (RFC2461) -- yoshfuji
                                 */
@@ -869,14 +869,14 @@ static void ndisc_recv_ns(struct sk_buff *skb)
        else
                NEIGH_CACHE_STAT_INC(&nd_tbl, rcv_probes_ucast);
 
-       /* 
+       /*
         *      update / create cache entry
         *      for the source address
         */
        neigh = __neigh_lookup(&nd_tbl, saddr, dev,
                               !inc || lladdr || !dev->addr_len);
        if (neigh)
-               neigh_update(neigh, lladdr, NUD_STALE, 
+               neigh_update(neigh, lladdr, NUD_STALE,
                             NEIGH_UPDATE_F_WEAK_OVERRIDE|
                             NEIGH_UPDATE_F_OVERRIDE);
        if (neigh || !dev->hard_header) {
@@ -926,7 +926,7 @@ static void ndisc_recv_na(struct sk_buff *skb)
                           "ICMPv6 NA: solicited NA is multicasted.\n");
                return;
        }
-               
+
        if (!ndisc_parse_options(msg->opt, ndoptlen, &ndopts)) {
                ND_PRINTK2(KERN_WARNING
                           "ICMPv6 NS: invalid ND option\n");
@@ -1057,7 +1057,7 @@ out:
 
 static void ndisc_router_discovery(struct sk_buff *skb)
 {
-        struct ra_msg *ra_msg = (struct ra_msg *) skb->h.raw;
+       struct ra_msg *ra_msg = (struct ra_msg *) skb->h.raw;
        struct neighbour *neigh = NULL;
        struct inet6_dev *in6_dev;
        struct rt6_info *rt = NULL;
@@ -1076,7 +1076,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
                return;
        }
        if (optlen < 0) {
-               ND_PRINTK2(KERN_WARNING 
+               ND_PRINTK2(KERN_WARNING
                           "ICMPv6 RA: packet too short\n");
                return;
        }
@@ -1286,7 +1286,7 @@ skip_defrtr:
                        rt6_mtu_change(skb->dev, mtu);
                }
        }
-                       
+
        if (ndopts.nd_opts_tgt_lladdr || ndopts.nd_opts_rh) {
                ND_PRINTK2(KERN_WARNING
                           "ICMPv6 RA: invalid RA options");
@@ -1339,7 +1339,7 @@ static void ndisc_redirect_rcv(struct sk_buff *skb)
        if (ipv6_addr_equal(dest, target)) {
                on_link = 1;
        } else if (!(ipv6_addr_type(target) & IPV6_ADDR_LINKLOCAL)) {
-               ND_PRINTK2(KERN_WARNING 
+               ND_PRINTK2(KERN_WARNING
                           "ICMPv6 Redirect: target address is not link-local.\n");
                return;
        }
@@ -1352,11 +1352,11 @@ static void ndisc_redirect_rcv(struct sk_buff *skb)
                return;
        }
 
-       /* RFC2461 8.1: 
+       /* RFC2461 8.1:
         *      The IP source address of the Redirect MUST be the same as the current
         *      first-hop router for the specified ICMP Destination Address.
         */
-               
+
        if (!ndisc_parse_options((u8*)(dest + 1), optlen, &ndopts)) {
                ND_PRINTK2(KERN_WARNING
                           "ICMPv6 Redirect: invalid ND options\n");
@@ -1410,8 +1410,8 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
                ND_PRINTK2(KERN_WARNING
                           "ICMPv6 Redirect: no link-local address on %s\n",
                           dev->name);
-               return;
-       }
+               return;
+       }
 
        if (!ipv6_addr_equal(&skb->nh.ipv6h->daddr, target) &&
            !(ipv6_addr_type(target) & IPV6_ADDR_LINKLOCAL)) {
@@ -1507,7 +1507,7 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh,
         *      build redirect option and copy skb over to the new packet.
         */
 
-       memset(opt, 0, 8);      
+       memset(opt, 0, 8);
        *(opt++) = ND_OPT_REDIRECT_HDR;
        *(opt++) = (rd_len >> 3);
        opt += 6;
@@ -1556,7 +1556,7 @@ int ndisc_rcv(struct sk_buff *skb)
        }
 
        if (msg->icmph.icmp6_code != 0) {
-               ND_PRINTK2(KERN_WARNING 
+               ND_PRINTK2(KERN_WARNING
                           "ICMPv6 NDISC: invalid ICMPv6 code: %d\n",
                           msg->icmph.icmp6_code);
                return 0;
@@ -1717,12 +1717,12 @@ int __init ndisc_init(struct net_proto_family *ops)
 {
        struct ipv6_pinfo *np;
        struct sock *sk;
-        int err;
+       int err;
 
        err = sock_create_kern(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6, &ndisc_socket);
        if (err < 0) {
                ND_PRINTK0(KERN_ERR
-                          "ICMPv6 NDISC: Failed to initialize the control socket (err %d).\n", 
+                          "ICMPv6 NDISC: Failed to initialize the control socket (err %d).\n",
                           err);
                ndisc_socket = NULL; /* For safety. */
                return err;
@@ -1736,14 +1736,14 @@ int __init ndisc_init(struct net_proto_family *ops)
        np->mc_loop = 0;
        sk->sk_prot->unhash(sk);
 
-        /*
-         * Initialize the neighbour table
-         */
-       
+       /*
+        * Initialize the neighbour table
+        */
+
        neigh_table_init(&nd_tbl);
 
 #ifdef CONFIG_SYSCTL
-       neigh_sysctl_register(NULL, &nd_tbl.parms, NET_IPV6, NET_IPV6_NEIGH, 
+       neigh_sysctl_register(NULL, &nd_tbl.parms, NET_IPV6, NET_IPV6_NEIGH,
                              "ipv6",
                              &ndisc_ifinfo_sysctl_change,
                              &ndisc_ifinfo_sysctl_strategy);
index f6294e5bcb3175e84bbdbe6c28fb05017fc10413..0b2d265e7da746ef6383ba5b8fd2ee5cb008da64 100644 (file)
@@ -91,7 +91,7 @@ __sum16 nf_ip6_checksum(struct sk_buff *skb, unsigned int hook,
                if (hook != NF_IP6_PRE_ROUTING && hook != NF_IP6_LOCAL_IN)
                        break;
                if (!csum_ipv6_magic(&ip6h->saddr, &ip6h->daddr,
-                                    skb->len - dataoff, protocol,
+                                    skb->len - dataoff, protocol,
                                     csum_sub(skb->csum,
                                              skb_checksum(skb, 0,
                                                           dataoff, 0)))) {
@@ -106,7 +106,7 @@ __sum16 nf_ip6_checksum(struct sk_buff *skb, unsigned int hook,
                                             protocol,
                                             csum_sub(0,
                                                      skb_checksum(skb, 0,
-                                                                  dataoff, 0))));
+                                                                  dataoff, 0))));
                csum = __skb_checksum_complete(skb);
        }
        return csum;
index cd549aea84f068aebe9edfb75e5b99df6eb9da59..da07e9a88ee928656bdd8da4d7b2644da00832d2 100644 (file)
@@ -42,7 +42,8 @@ config IP6_NF_QUEUE
 
 config IP6_NF_IPTABLES
        tristate "IP6 tables support (required for filtering)"
-       depends on INET && IPV6 && EXPERIMENTAL && NETFILTER_XTABLES
+       depends on INET && IPV6 && EXPERIMENTAL
+       select NETFILTER_XTABLES
        help
          ip6tables is a general, extensible packet identification framework.
          Currently only the packet filtering and packet mangling subsystem
index d4d9f182441a95f0b81d6abd56bdee8e57688e19..fdb30a5916e57b6c6cb8060640e49bf4197ed9bc 100644 (file)
@@ -95,7 +95,7 @@ __ipq_find_entry(ipq_cmpfn cmpfn, unsigned long data)
 
        list_for_each_prev(p, &queue_list) {
                struct ipq_queue_entry *entry = (struct ipq_queue_entry *)p;
-               
+
                if (!cmpfn || cmpfn(entry, data))
                        return entry;
        }
@@ -127,7 +127,7 @@ static inline void
 __ipq_flush(int verdict)
 {
        struct ipq_queue_entry *entry;
-       
+
        while ((entry = __ipq_find_dequeue_entry(NULL, 0)))
                ipq_issue_verdict(entry, verdict);
 }
@@ -136,21 +136,21 @@ static inline int
 __ipq_set_mode(unsigned char mode, unsigned int range)
 {
        int status = 0;
-       
+
        switch(mode) {
        case IPQ_COPY_NONE:
        case IPQ_COPY_META:
                copy_mode = mode;
                copy_range = 0;
                break;
-               
+
        case IPQ_COPY_PACKET:
                copy_mode = mode;
                copy_range = range;
                if (copy_range > 0xFFFF)
                        copy_range = 0xFFFF;
                break;
-               
+
        default:
                status = -EINVAL;
 
@@ -171,7 +171,7 @@ static struct ipq_queue_entry *
 ipq_find_dequeue_entry(ipq_cmpfn cmpfn, unsigned long data)
 {
        struct ipq_queue_entry *entry;
-       
+
        write_lock_bh(&queue_lock);
        entry = __ipq_find_dequeue_entry(cmpfn, data);
        write_unlock_bh(&queue_lock);
@@ -197,14 +197,14 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
        struct nlmsghdr *nlh;
 
        read_lock_bh(&queue_lock);
-       
+
        switch (copy_mode) {
        case IPQ_COPY_META:
        case IPQ_COPY_NONE:
                size = NLMSG_SPACE(sizeof(*pmsg));
                data_len = 0;
                break;
-       
+
        case IPQ_COPY_PACKET:
                if ((entry->skb->ip_summed == CHECKSUM_PARTIAL ||
                     entry->skb->ip_summed == CHECKSUM_COMPLETE) &&
@@ -216,10 +216,10 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
                        data_len = entry->skb->len;
                else
                        data_len = copy_range;
-               
+
                size = NLMSG_SPACE(sizeof(*pmsg) + data_len);
                break;
-       
+
        default:
                *errp = -EINVAL;
                read_unlock_bh(&queue_lock);
@@ -231,7 +231,7 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
        skb = alloc_skb(size, GFP_ATOMIC);
        if (!skb)
                goto nlmsg_failure;
-               
+
        old_tail= skb->tail;
        nlh = NLMSG_PUT(skb, 0, 0, IPQM_PACKET, size - sizeof(*nlh));
        pmsg = NLMSG_DATA(nlh);
@@ -244,29 +244,29 @@ ipq_build_packet_message(struct ipq_queue_entry *entry, int *errp)
        pmsg->mark            = entry->skb->mark;
        pmsg->hook            = entry->info->hook;
        pmsg->hw_protocol     = entry->skb->protocol;
-       
+
        if (entry->info->indev)
                strcpy(pmsg->indev_name, entry->info->indev->name);
        else
                pmsg->indev_name[0] = '\0';
-       
+
        if (entry->info->outdev)
                strcpy(pmsg->outdev_name, entry->info->outdev->name);
        else
                pmsg->outdev_name[0] = '\0';
-       
+
        if (entry->info->indev && entry->skb->dev) {
                pmsg->hw_type = entry->skb->dev->type;
                if (entry->skb->dev->hard_header_parse)
                        pmsg->hw_addrlen =
                                entry->skb->dev->hard_header_parse(entry->skb,
-                                                                  pmsg->hw_addr);
+                                                                  pmsg->hw_addr);
        }
-       
+
        if (data_len)
                if (skb_copy_bits(entry->skb, 0, pmsg->payload, data_len))
                        BUG();
-               
+
        nlh->nlmsg_len = skb->tail - old_tail;
        return skb;
 
@@ -279,7 +279,7 @@ nlmsg_failure:
 }
 
 static int
-ipq_enqueue_packet(struct sk_buff *skb, struct nf_info *info, 
+ipq_enqueue_packet(struct sk_buff *skb, struct nf_info *info,
                   unsigned int queuenum, void *data)
 {
        int status = -EINVAL;
@@ -301,37 +301,37 @@ ipq_enqueue_packet(struct sk_buff *skb, struct nf_info *info,
        nskb = ipq_build_packet_message(entry, &status);
        if (nskb == NULL)
                goto err_out_free;
-               
+
        write_lock_bh(&queue_lock);
-       
+
        if (!peer_pid)
-               goto err_out_free_nskb; 
+               goto err_out_free_nskb;
 
        if (queue_total >= queue_maxlen) {
-                queue_dropped++;
+               queue_dropped++;
                status = -ENOSPC;
                if (net_ratelimit())
-                       printk (KERN_WARNING "ip6_queue: fill at %d entries, "
+                       printk (KERN_WARNING "ip6_queue: fill at %d entries, "
                                "dropping packet(s).  Dropped: %d\n", queue_total,
                                queue_dropped);
                goto err_out_free_nskb;
        }
 
-       /* netlink_unicast will either free the nskb or attach it to a socket */ 
+       /* netlink_unicast will either free the nskb or attach it to a socket */
        status = netlink_unicast(ipqnl, nskb, peer_pid, MSG_DONTWAIT);
        if (status < 0) {
-               queue_user_dropped++;
+               queue_user_dropped++;
                goto err_out_unlock;
        }
-       
+
        __ipq_enqueue_entry(entry);
 
        write_unlock_bh(&queue_lock);
        return status;
-       
+
 err_out_free_nskb:
-       kfree_skb(nskb); 
-       
+       kfree_skb(nskb);
+
 err_out_unlock:
        write_unlock_bh(&queue_lock);
 
@@ -357,11 +357,11 @@ ipq_mangle_ipv6(ipq_verdict_msg_t *v, struct ipq_queue_entry *e)
                        return -EINVAL;
                if (diff > skb_tailroom(e->skb)) {
                        struct sk_buff *newskb;
-                       
+
                        newskb = skb_copy_expand(e->skb,
-                                                skb_headroom(e->skb),
-                                                diff,
-                                                GFP_ATOMIC);
+                                                skb_headroom(e->skb),
+                                                diff,
+                                                GFP_ATOMIC);
                        if (newskb == NULL) {
                                printk(KERN_WARNING "ip6_queue: OOM "
                                      "in mangle, dropping packet\n");
@@ -401,11 +401,11 @@ ipq_set_verdict(struct ipq_verdict_msg *vmsg, unsigned int len)
                return -ENOENT;
        else {
                int verdict = vmsg->value;
-               
+
                if (vmsg->data_len && vmsg->data_len == len)
                        if (ipq_mangle_ipv6(vmsg, entry) < 0)
                                verdict = NF_DROP;
-               
+
                ipq_issue_verdict(entry, verdict);
                return 0;
        }
@@ -424,7 +424,7 @@ ipq_set_mode(unsigned char mode, unsigned int range)
 
 static int
 ipq_receive_peer(struct ipq_peer_msg *pmsg,
-                 unsigned char type, unsigned int len)
+                unsigned char type, unsigned int len)
 {
        int status = 0;
 
@@ -434,15 +434,15 @@ ipq_receive_peer(struct ipq_peer_msg *pmsg,
        switch (type) {
        case IPQM_MODE:
                status = ipq_set_mode(pmsg->msg.mode.value,
-                                     pmsg->msg.mode.range);
+                                     pmsg->msg.mode.range);
                break;
-               
+
        case IPQM_VERDICT:
                if (pmsg->msg.verdict.value > NF_MAX_VERDICT)
                        status = -EINVAL;
                else
                        status = ipq_set_verdict(&pmsg->msg.verdict,
-                                                len - sizeof(*pmsg));
+                                                len - sizeof(*pmsg));
                        break;
        default:
                status = -EINVAL;
@@ -456,7 +456,7 @@ dev_cmp(struct ipq_queue_entry *entry, unsigned long ifindex)
        if (entry->info->indev)
                if (entry->info->indev->ifindex == ifindex)
                        return 1;
-                       
+
        if (entry->info->outdev)
                if (entry->info->outdev->ifindex == ifindex)
                        return 1;
@@ -468,7 +468,7 @@ static void
 ipq_dev_drop(int ifindex)
 {
        struct ipq_queue_entry *entry;
-       
+
        while ((entry = ipq_find_dequeue_entry(dev_cmp, ifindex)) != NULL)
                ipq_issue_verdict(entry, NF_DROP);
 }
@@ -492,25 +492,25 @@ ipq_rcv_skb(struct sk_buff *skb)
 
        pid = nlh->nlmsg_pid;
        flags = nlh->nlmsg_flags;
-       
+
        if(pid <= 0 || !(flags & NLM_F_REQUEST) || flags & NLM_F_MULTI)
                RCV_SKB_FAIL(-EINVAL);
-               
+
        if (flags & MSG_TRUNC)
                RCV_SKB_FAIL(-ECOMM);
-               
+
        type = nlh->nlmsg_type;
        if (type < NLMSG_NOOP || type >= IPQM_MAX)
                RCV_SKB_FAIL(-EINVAL);
-               
+
        if (type <= IPQM_BASE)
                return;
-       
+
        if (security_netlink_recv(skb, CAP_NET_ADMIN))
-               RCV_SKB_FAIL(-EPERM);   
+               RCV_SKB_FAIL(-EPERM);
 
        write_lock_bh(&queue_lock);
-       
+
        if (peer_pid) {
                if (peer_pid != pid) {
                        write_unlock_bh(&queue_lock);
@@ -520,17 +520,17 @@ ipq_rcv_skb(struct sk_buff *skb)
                net_enable_timestamp();
                peer_pid = pid;
        }
-               
+
        write_unlock_bh(&queue_lock);
-       
+
        status = ipq_receive_peer(NLMSG_DATA(nlh), type,
-                                 nlmsglen - NLMSG_LENGTH(0));
+                                 nlmsglen - NLMSG_LENGTH(0));
        if (status < 0)
                RCV_SKB_FAIL(status);
-               
+
        if (flags & NLM_F_ACK)
                netlink_ack(skb, nlh, 0);
-        return;
+       return;
 }
 
 static void
@@ -540,19 +540,19 @@ ipq_rcv_sk(struct sock *sk, int len)
        unsigned int qlen;
 
        mutex_lock(&ipqnl_mutex);
-                       
+
        for (qlen = skb_queue_len(&sk->sk_receive_queue); qlen; qlen--) {
                skb = skb_dequeue(&sk->sk_receive_queue);
                ipq_rcv_skb(skb);
                kfree_skb(skb);
        }
-               
+
        mutex_unlock(&ipqnl_mutex);
 }
 
 static int
 ipq_rcv_dev_event(struct notifier_block *this,
-                  unsigned long event, void *ptr)
+                 unsigned long event, void *ptr)
 {
        struct net_device *dev = ptr;
 
@@ -568,7 +568,7 @@ static struct notifier_block ipq_dev_notifier = {
 
 static int
 ipq_rcv_nl_event(struct notifier_block *this,
-                 unsigned long event, void *ptr)
+                unsigned long event, void *ptr)
 {
        struct netlink_notify *n = ptr;
 
@@ -597,7 +597,7 @@ static ctl_table ipq_table[] = {
                .mode           = 0644,
                .proc_handler   = proc_dointvec
        },
-       { .ctl_name = 0 }
+       { .ctl_name = 0 }
 };
 
 static ctl_table ipq_dir_table[] = {
@@ -627,25 +627,25 @@ ipq_get_info(char *buffer, char **start, off_t offset, int length)
        int len;
 
        read_lock_bh(&queue_lock);
-       
+
        len = sprintf(buffer,
-                     "Peer PID          : %d\n"
-                     "Copy mode         : %hu\n"
-                     "Copy range        : %u\n"
-                     "Queue length      : %u\n"
-                     "Queue max. length : %u\n"
+                     "Peer PID          : %d\n"
+                     "Copy mode         : %hu\n"
+                     "Copy range        : %u\n"
+                     "Queue length      : %u\n"
+                     "Queue max. length : %u\n"
                      "Queue dropped     : %u\n"
                      "Netfilter dropped : %u\n",
-                     peer_pid,
-                     copy_mode,
-                     copy_range,
-                     queue_total,
-                     queue_maxlen,
+                     peer_pid,
+                     copy_mode,
+                     copy_range,
+                     queue_total,
+                     queue_maxlen,
                      queue_dropped,
                      queue_user_dropped);
 
        read_unlock_bh(&queue_lock);
-       
+
        *start = buffer + offset;
        len -= offset;
        if (len > length)
@@ -665,10 +665,10 @@ static int __init ip6_queue_init(void)
 {
        int status = -ENOMEM;
        struct proc_dir_entry *proc;
-       
+
        netlink_register_notifier(&ipq_nl_notifier);
        ipqnl = netlink_kernel_create(NETLINK_IP6_FW, 0, ipq_rcv_sk,
-                                     THIS_MODULE);
+                                     THIS_MODULE);
        if (ipqnl == NULL) {
                printk(KERN_ERR "ip6_queue: failed to create netlink socket\n");
                goto cleanup_netlink_notifier;
@@ -681,10 +681,10 @@ static int __init ip6_queue_init(void)
                printk(KERN_ERR "ip6_queue: failed to create proc entry\n");
                goto cleanup_ipqnl;
        }
-       
+
        register_netdevice_notifier(&ipq_dev_notifier);
-       ipq_sysctl_header = register_sysctl_table(ipq_root_table, 0);
-       
+       ipq_sysctl_header = register_sysctl_table(ipq_root_table);
+
        status = nf_register_queue_handler(PF_INET6, &nfqh);
        if (status < 0) {
                printk(KERN_ERR "ip6_queue: failed to register queue handler\n");
@@ -696,12 +696,12 @@ cleanup_sysctl:
        unregister_sysctl_table(ipq_sysctl_header);
        unregister_netdevice_notifier(&ipq_dev_notifier);
        proc_net_remove(IPQ_PROC_FS_NAME);
-       
+
 cleanup_ipqnl:
        sock_release(ipqnl->sk_socket);
        mutex_lock(&ipqnl_mutex);
        mutex_unlock(&ipqnl_mutex);
-       
+
 cleanup_netlink_notifier:
        netlink_unregister_notifier(&ipq_nl_notifier);
        return status;
index 7083e1cfb2f527dd95166a75e1d9450852d6ed33..7c512e13f9563b31f9f47579bb671d47e12ee5b2 100644 (file)
@@ -92,16 +92,16 @@ do {                                                                \
 #endif
 
 /* Check for an extension */
-int 
+int
 ip6t_ext_hdr(u8 nexthdr)
 {
-        return ( (nexthdr == IPPROTO_HOPOPTS)   ||
-                 (nexthdr == IPPROTO_ROUTING)   ||
-                 (nexthdr == IPPROTO_FRAGMENT)  ||
-                 (nexthdr == IPPROTO_ESP)       ||
-                 (nexthdr == IPPROTO_AH)        ||
-                 (nexthdr == IPPROTO_NONE)      ||
-                 (nexthdr == IPPROTO_DSTOPTS) );
+       return ( (nexthdr == IPPROTO_HOPOPTS)   ||
+                (nexthdr == IPPROTO_ROUTING)   ||
+                (nexthdr == IPPROTO_FRAGMENT)  ||
+                (nexthdr == IPPROTO_ESP)       ||
+                (nexthdr == IPPROTO_AH)        ||
+                (nexthdr == IPPROTO_NONE)      ||
+                (nexthdr == IPPROTO_DSTOPTS) );
 }
 
 /* Returns whether matches rule or not. */
@@ -120,9 +120,9 @@ ip6_packet_match(const struct sk_buff *skb,
 #define FWINV(bool,invflg) ((bool) ^ !!(ip6info->invflags & invflg))
 
        if (FWINV(ipv6_masked_addr_cmp(&ipv6->saddr, &ip6info->smsk,
-                                      &ip6info->src), IP6T_INV_SRCIP)
+                                      &ip6info->src), IP6T_INV_SRCIP)
            || FWINV(ipv6_masked_addr_cmp(&ipv6->daddr, &ip6info->dmsk,
-                                         &ip6info->dst), IP6T_INV_DSTIP)) {
+                                         &ip6info->dst), IP6T_INV_DSTIP)) {
                dprintf("Source or dest mismatch.\n");
 /*
                dprintf("SRC: %u. Mask: %u. Target: %u.%s\n", ip->saddr,
@@ -177,7 +177,7 @@ ip6_packet_match(const struct sk_buff *skb,
                *fragoff = _frag_off;
 
                dprintf("Packet protocol %hi ?= %s%hi.\n",
-                               protohdr, 
+                               protohdr,
                                ip6info->invflags & IP6T_INV_PROTO ? "!":"",
                                ip6info->proto);
 
@@ -197,7 +197,7 @@ ip6_packet_match(const struct sk_buff *skb,
 }
 
 /* should be ip6 safe */
-static inline int 
+static inline int
 ip6_checkentry(const struct ip6t_ip6 *ipv6)
 {
        if (ipv6->flags & ~IP6T_F_MASK) {
@@ -337,7 +337,7 @@ ip6t_do_table(struct sk_buff **pskb,
                                e = get_entry(table_base, v);
                        } else {
                                /* Targets which reenter must return
-                                   abs. verdicts */
+                                  abs. verdicts */
 #ifdef CONFIG_NETFILTER_DEBUG
                                ((struct ip6t_entry *)table_base)->comefrom
                                        = 0xeeeeeeec;
@@ -534,10 +534,10 @@ check_match(struct ip6t_entry_match *m,
        int ret;
 
        match = try_then_request_module(xt_find_match(AF_INET6, m->u.user.name,
-                                       m->u.user.revision),
+                                       m->u.user.revision),
                                        "ip6t_%s", m->u.user.name);
        if (IS_ERR(match) || !match) {
-               duprintf("check_match: `%s' not found\n", m->u.user.name);
+               duprintf("check_match: `%s' not found\n", m->u.user.name);
                return match ? PTR_ERR(match) : -ENOENT;
        }
        m->u.kernel.match = match;
@@ -661,7 +661,7 @@ check_entry_size_and_hooks(struct ip6t_entry *e,
        }
 
        /* FIXME: underflows must be unconditional, standard verdicts
-           < 0 (not IP6T_RETURN). --RR */
+          < 0 (not IP6T_RETURN). --RR */
 
        /* Clear counters and comefrom */
        e->counters = ((struct xt_counters) { 0, 0 });
@@ -1003,8 +1003,8 @@ do_replace(void __user *user, unsigned int len)
        /* Update module usage count based on number of rules */
        duprintf("do_replace: oldnum=%u, initnum=%u, newnum=%u\n",
                oldinfo->number, oldinfo->initial_entries, newinfo->number);
-       if ((oldinfo->number > oldinfo->initial_entries) || 
-           (newinfo->number <= oldinfo->initial_entries)) 
+       if ((oldinfo->number > oldinfo->initial_entries) ||
+           (newinfo->number <= oldinfo->initial_entries))
                module_put(t->me);
        if ((oldinfo->number > oldinfo->initial_entries) &&
            (newinfo->number <= oldinfo->initial_entries))
@@ -1492,9 +1492,9 @@ int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset,
                        }
                        hdrlen = 8;
                } else if (nexthdr == NEXTHDR_AUTH)
-                       hdrlen = (hp->hdrlen + 2) << 2; 
+                       hdrlen = (hp->hdrlen + 2) << 2;
                else
-                       hdrlen = ipv6_optlen(hp); 
+                       hdrlen = ipv6_optlen(hp);
 
                nexthdr = hp->nexthdr;
                len -= hdrlen;
index 04e500172fb48abc3c4505c9e8e4ec605338c4ba..ccbab66277e37d25918eea826c6a35059864a8f4 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
  * Hop Limit modification target for ip6tables
  * Maciej Soltysiak <solt@dns.toxicfilms.tv>
  * Based on HW's TTL module
@@ -18,7 +18,7 @@ MODULE_AUTHOR("Maciej Soltysiak <solt@dns.toxicfilms.tv>");
 MODULE_DESCRIPTION("IP6 tables Hop Limit modification module");
 MODULE_LICENSE("GPL");
 
-static unsigned int ip6t_hl_target(struct sk_buff **pskb, 
+static unsigned int ip6t_hl_target(struct sk_buff **pskb,
                                   const struct net_device *in,
                                   const struct net_device *out,
                                   unsigned int hooknum,
@@ -67,7 +67,7 @@ static int ip6t_hl_checkentry(const char *tablename,
        struct ip6t_HL_info *info = targinfo;
 
        if (info->mode > IP6T_HL_MAXMODE) {
-               printk(KERN_WARNING "ip6t_HL: invalid or unknown Mode %u\n", 
+               printk(KERN_WARNING "ip6t_HL: invalid or unknown Mode %u\n",
                        info->mode);
                return 0;
        }
@@ -80,12 +80,12 @@ static int ip6t_hl_checkentry(const char *tablename,
 }
 
 static struct xt_target ip6t_HL = {
-       .name           = "HL", 
+       .name           = "HL",
        .family         = AF_INET6,
-       .target         = ip6t_hl_target, 
+       .target         = ip6t_hl_target,
        .targetsize     = sizeof(struct ip6t_HL_info),
        .table          = "mangle",
-       .checkentry     = ip6t_hl_checkentry, 
+       .checkentry     = ip6t_hl_checkentry,
        .me             = THIS_MODULE
 };
 
index 5587a77b884c9666f15c56c403e49e74287e80fd..afaa039d0b7b51ffeff724031c82794f2eb6a644 100644 (file)
@@ -145,7 +145,7 @@ static void dump_packet(const struct nf_loginfo *info,
                                                        &_ahdr);
                                if (ah == NULL) {
                                        /*
-                                        * Max length: 26 "INCOMPLETE [65535    
+                                        * Max length: 26 "INCOMPLETE [65535
                                         *  bytes] )"
                                         */
                                        printk("INCOMPLETE [%u bytes] )",
@@ -387,7 +387,7 @@ ip6t_log_packet(unsigned int pf,
                loginfo = &default_loginfo;
 
        spin_lock_bh(&log_lock);
-       printk("<%d>%sIN=%s OUT=%s ", loginfo->u.log.level, 
+       printk("<%d>%sIN=%s OUT=%s ", loginfo->u.log.level,
                prefix,
                in ? in->name : "",
                out ? out->name : "");
@@ -442,7 +442,7 @@ ip6t_log_target(struct sk_buff **pskb,
        li.u.log.logflags = loginfo->logflags;
 
        ip6t_log_packet(PF_INET6, hooknum, *pskb, in, out, &li,
-                       loginfo->prefix);
+                       loginfo->prefix);
        return XT_CONTINUE;
 }
 
@@ -470,9 +470,9 @@ static int ip6t_log_checkentry(const char *tablename,
 static struct xt_target ip6t_log_reg = {
        .name           = "LOG",
        .family         = AF_INET6,
-       .target         = ip6t_log_target, 
+       .target         = ip6t_log_target,
        .targetsize     = sizeof(struct ip6t_log_info),
-       .checkentry     = ip6t_log_checkentry, 
+       .checkentry     = ip6t_log_checkentry,
        .me             = THIS_MODULE,
 };
 
@@ -501,7 +501,7 @@ static int __init ip6t_log_init(void)
 
 static void __exit ip6t_log_fini(void)
 {
-       nf_log_unregister_logger(&ip6t_logger);
+       nf_log_unregister(&ip6t_logger);
        xt_unregister_target(&ip6t_log_reg);
 }
 
index 278349c18793339aecbe210f58b3ae802e3ea880..6abee94c929fc70b020702ad70659b4566900969 100644 (file)
@@ -189,23 +189,23 @@ static unsigned int reject6_target(struct sk_buff **pskb,
        /* WARNING: This code causes reentry within ip6tables.
           This means that the ip6tables jump stack is now crap.  We
           must return an absolute verdict. --RR */
-       switch (reject->with) {
-       case IP6T_ICMP6_NO_ROUTE:
-               send_unreach(*pskb, ICMPV6_NOROUTE, hooknum);
-               break;
-       case IP6T_ICMP6_ADM_PROHIBITED:
-               send_unreach(*pskb, ICMPV6_ADM_PROHIBITED, hooknum);
-               break;
-       case IP6T_ICMP6_NOT_NEIGHBOUR:
-               send_unreach(*pskb, ICMPV6_NOT_NEIGHBOUR, hooknum);
-               break;
-       case IP6T_ICMP6_ADDR_UNREACH:
-               send_unreach(*pskb, ICMPV6_ADDR_UNREACH, hooknum);
-               break;
-       case IP6T_ICMP6_PORT_UNREACH:
-               send_unreach(*pskb, ICMPV6_PORT_UNREACH, hooknum);
-               break;
-       case IP6T_ICMP6_ECHOREPLY:
+       switch (reject->with) {
+       case IP6T_ICMP6_NO_ROUTE:
+               send_unreach(*pskb, ICMPV6_NOROUTE, hooknum);
+               break;
+       case IP6T_ICMP6_ADM_PROHIBITED:
+               send_unreach(*pskb, ICMPV6_ADM_PROHIBITED, hooknum);
+               break;
+       case IP6T_ICMP6_NOT_NEIGHBOUR:
+               send_unreach(*pskb, ICMPV6_NOT_NEIGHBOUR, hooknum);
+               break;
+       case IP6T_ICMP6_ADDR_UNREACH:
+               send_unreach(*pskb, ICMPV6_ADDR_UNREACH, hooknum);
+               break;
+       case IP6T_ICMP6_PORT_UNREACH:
+               send_unreach(*pskb, ICMPV6_PORT_UNREACH, hooknum);
+               break;
+       case IP6T_ICMP6_ECHOREPLY:
                /* Do nothing */
                break;
        case IP6T_TCP_RESET:
@@ -226,7 +226,7 @@ static int check(const char *tablename,
                 void *targinfo,
                 unsigned int hook_mask)
 {
-       const struct ip6t_reject_info *rejinfo = targinfo;
+       const struct ip6t_reject_info *rejinfo = targinfo;
        const struct ip6t_entry *e = entry;
 
        if (rejinfo->with == IP6T_ICMP6_ECHOREPLY) {
index 456c76adcbf6a5c2e3450c7893b2b47e871bdd51..d3c154371b41d30bbe85c72c170c2bc0969b0891 100644 (file)
@@ -78,13 +78,13 @@ match(const struct sk_buff *skb,
 
        DEBUGP("IPv6 AH spi %02X ",
               (spi_match(ahinfo->spis[0], ahinfo->spis[1],
-                         ntohl(ah->spi),
-                         !!(ahinfo->invflags & IP6T_AH_INV_SPI))));
+                         ntohl(ah->spi),
+                         !!(ahinfo->invflags & IP6T_AH_INV_SPI))));
        DEBUGP("len %02X %04X %02X ",
               ahinfo->hdrlen, hdrlen,
               (!ahinfo->hdrlen ||
-               (ahinfo->hdrlen == hdrlen) ^
-               !!(ahinfo->invflags & IP6T_AH_INV_LEN)));
+               (ahinfo->hdrlen == hdrlen) ^
+               !!(ahinfo->invflags & IP6T_AH_INV_LEN)));
        DEBUGP("res %02X %04X %02X\n",
               ahinfo->hdrres, ah->reserved,
               !(ahinfo->hdrres && ah->reserved));
@@ -92,12 +92,12 @@ match(const struct sk_buff *skb,
        return (ah != NULL)
               &&
               (spi_match(ahinfo->spis[0], ahinfo->spis[1],
-                         ntohl(ah->spi),
-                         !!(ahinfo->invflags & IP6T_AH_INV_SPI)))
+                         ntohl(ah->spi),
+                         !!(ahinfo->invflags & IP6T_AH_INV_SPI)))
               &&
               (!ahinfo->hdrlen ||
-               (ahinfo->hdrlen == hdrlen) ^
-               !!(ahinfo->invflags & IP6T_AH_INV_LEN))
+               (ahinfo->hdrlen == hdrlen) ^
+               !!(ahinfo->invflags & IP6T_AH_INV_LEN))
               &&
               !(ahinfo->hdrres && ah->reserved);
 }
@@ -105,10 +105,10 @@ match(const struct sk_buff *skb,
 /* Called when user tries to insert an entry of this type. */
 static int
 checkentry(const char *tablename,
-          const void *entry,
+         const void *entry,
          const struct xt_match *match,
-          void *matchinfo,
-          unsigned int hook_mask)
+         void *matchinfo,
+         unsigned int hook_mask)
 {
        const struct ip6t_ah *ahinfo = matchinfo;
 
index 601cc1211c62991c39760e3191d81f60465aabb6..37c8a4d4ed78d9417ac5eb31e6b98d739dc76983 100644 (file)
@@ -41,7 +41,7 @@ static int match(const struct sk_buff *skb,
                        return (ip6h->hop_limit > info->hop_limit);
                        break;
                default:
-                       printk(KERN_WARNING "ip6t_hl: unknown mode %d\n", 
+                       printk(KERN_WARNING "ip6t_hl: unknown mode %d\n",
                                info->mode);
                        return 0;
        }
index 26ac084adefc65f21dba581b5783dc17c20f6db4..700a11d25deb02c287641b030637ab038bc9a896 100644 (file)
@@ -1,7 +1,7 @@
 /* ipv6header match - matches IPv6 packets based
    on whether they contain certain headers */
 
-/* Original idea: Brad Chapman 
+/* Original idea: Brad Chapman
  * Rewritten by: Andras Kis-Szabo <kisza@sch.bme.hu> */
 
 /* (C) 2001-2002 Andras Kis-Szabo <kisza@sch.bme.hu>
index 2c7efc6a506daebf13cb9740c11a3b3b447f05e5..c2a909893a64cbd790e9d650fbf8d7f4ae722ef2 100644 (file)
@@ -66,6 +66,13 @@ match(const struct sk_buff *skb,
                return 0;
        }
 
+       if (mh->ip6mh_proto != IPPROTO_NONE) {
+               duprintf("Dropping invalid MH Payload Proto: %u\n",
+                        mh->ip6mh_proto);
+               *hotdrop = 1;
+               return 0;
+       }
+
        return type_match(mhinfo->types[0], mhinfo->types[1], mh->ip6mh_type,
                          !!(mhinfo->invflags & IP6T_MH_INV_TYPE));
 }
index 5f5aa0e514786691570e195598022930e75bc157..0c468d35a93743b34e7773966d313455dd89687f 100644 (file)
@@ -50,7 +50,7 @@ static struct
       0, NULL, { } },
     {
            /* PRE_ROUTING */
-            { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
+           { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
                0,
                sizeof(struct ip6t_entry),
                sizeof(struct ip6t_standard),
@@ -58,7 +58,7 @@ static struct
              { { { { IP6T_ALIGN(sizeof(struct ip6t_standard_target)), "" } }, { } },
                -NF_ACCEPT - 1 } },
            /* LOCAL_IN */
-            { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
+           { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
                0,
                sizeof(struct ip6t_entry),
                sizeof(struct ip6t_standard),
@@ -66,7 +66,7 @@ static struct
              { { { { IP6T_ALIGN(sizeof(struct ip6t_standard_target)), "" } }, { } },
                -NF_ACCEPT - 1 } },
            /* FORWARD */
-            { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
+           { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
                0,
                sizeof(struct ip6t_entry),
                sizeof(struct ip6t_standard),
@@ -74,7 +74,7 @@ static struct
              { { { { IP6T_ALIGN(sizeof(struct ip6t_standard_target)), "" } }, { } },
                -NF_ACCEPT - 1 } },
            /* LOCAL_OUT */
-            { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
+           { { { { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, { { { 0 } } }, "", "", { 0 }, { 0 }, 0, 0, 0 },
                0,
                sizeof(struct ip6t_entry),
                sizeof(struct ip6t_standard),
@@ -156,7 +156,7 @@ ip6t_local_hook(unsigned int hook,
 
        ret = ip6t_do_table(pskb, hook, in, out, &packet_mangler);
 
-       if (ret != NF_DROP && ret != NF_STOLEN 
+       if (ret != NF_DROP && ret != NF_STOLEN
                && (memcmp(&(*pskb)->nh.ipv6h->saddr, &saddr, sizeof(saddr))
                    || memcmp(&(*pskb)->nh.ipv6h->daddr, &daddr, sizeof(daddr))
                    || (*pskb)->mark != mark
index 277bf34638b4fa492a52bb90213e60ed2c400efb..a3eb5b8ce18d0abe8a7062b0cc340e1b6bb5b160 100644 (file)
@@ -87,10 +87,10 @@ static struct
        }
 };
 
-static struct xt_table packet_raw = { 
-       .name = "raw", 
-       .valid_hooks = RAW_VALID_HOOKS, 
-       .lock = RW_LOCK_UNLOCKED, 
+static struct xt_table packet_raw = {
+       .name = "raw",
+       .valid_hooks = RAW_VALID_HOOKS,
+       .lock = RW_LOCK_UNLOCKED,
        .me = THIS_MODULE,
        .af = AF_INET6,
 };
@@ -106,17 +106,17 @@ ip6t_hook(unsigned int hook,
        return ip6t_do_table(pskb, hook, in, out, &packet_raw);
 }
 
-static struct nf_hook_ops ip6t_ops[] = { 
+static struct nf_hook_ops ip6t_ops[] = {
        {
-         .hook = ip6t_hook, 
+         .hook = ip6t_hook,
          .pf = PF_INET6,
          .hooknum = NF_IP6_PRE_ROUTING,
          .priority = NF_IP6_PRI_FIRST,
          .owner = THIS_MODULE,
        },
        {
-         .hook = ip6t_hook, 
-         .pf = PF_INET6, 
+         .hook = ip6t_hook,
+         .pf = PF_INET6,
          .hooknum = NF_IP6_LOCAL_OUT,
          .priority = NF_IP6_PRI_FIRST,
          .owner = THIS_MODULE,
index a20615ffccffe8dae47cb88a635a5603c86c1588..4b7be4bb4d03406f437e08b9d5162aed80fd42fe 100644 (file)
@@ -154,8 +154,8 @@ ipv6_prepare(struct sk_buff **pskb, unsigned int hooknum, unsigned int *dataoff,
         */
        if ((protoff < 0) || (protoff > (*pskb)->len)) {
                DEBUGP("ip6_conntrack_core: can't find proto in pkt\n");
-               NF_CT_STAT_INC(error);
-               NF_CT_STAT_INC(invalid);
+               NF_CT_STAT_INC_ATOMIC(error);
+               NF_CT_STAT_INC_ATOMIC(invalid);
                return -NF_ACCEPT;
        }
 
@@ -349,7 +349,7 @@ static ctl_table nf_ct_ipv6_sysctl_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_dointvec,
        },
-        { .ctl_name = 0 }
+       { .ctl_name = 0 }
 };
 #endif
 
@@ -386,7 +386,7 @@ static int ipv6_nfattr_to_tuple(struct nfattr *tb[],
        if (nfattr_bad_size(tb, CTA_IP_MAX, cta_min_ip))
                return -EINVAL;
 
-       memcpy(&t->src.u3.ip6, NFA_DATA(tb[CTA_IP_V6_SRC-1]), 
+       memcpy(&t->src.u3.ip6, NFA_DATA(tb[CTA_IP_V6_SRC-1]),
               sizeof(u_int32_t) * 4);
        memcpy(&t->dst.u3.ip6, NFA_DATA(tb[CTA_IP_V6_DST-1]),
               sizeof(u_int32_t) * 4);
index 3905cacc69af1d916feb0dc419b47b912e198d25..21f19cc719f34d2bd4bcad23808efa95095bd023 100644 (file)
@@ -17,7 +17,6 @@
  */
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/module.h>
 #include <linux/netfilter.h>
@@ -104,9 +103,9 @@ static int icmpv6_packet(struct nf_conn *ct,
                       unsigned int hooknum)
 {
        /* Try to delete connection immediately after all replies:
-           won't actually vanish as we still have skb, and del_timer
-           means this will only run once even if count hits zero twice
-           (theoretically possible with SMP) */
+          won't actually vanish as we still have skb, and del_timer
+          means this will only run once even if count hits zero twice
+          (theoretically possible with SMP) */
        if (CTINFO2DIR(ctinfo) == IP_CT_DIR_REPLY) {
                if (atomic_dec_and_test(&ct->proto.icmp.count)
                    && del_timer(&ct->timeout))
@@ -182,6 +181,7 @@ icmpv6_error_message(struct sk_buff *skb,
                return -NF_ACCEPT;
        }
 
+       /* rcu_read_lock()ed by nf_hook_slow */
        inproto = __nf_ct_l4proto_find(PF_INET6, inprotonum);
 
        /* Are they talking about one of our connections? */
index d9c15402ba6619023b6f28633e14666ee615b09f..15ab1e3e8b564143f3a9166f97463cacdb2a27f2 100644 (file)
@@ -311,7 +311,7 @@ static struct nf_ct_frag6_queue *nf_ct_frag6_intern(unsigned int hash,
        write_lock(&nf_ct_frag6_lock);
 #ifdef CONFIG_SMP
        hlist_for_each_entry(fq, n, &nf_ct_frag6_hash[hash], list) {
-               if (fq->id == fq_in->id && 
+               if (fq->id == fq_in->id &&
                    ipv6_addr_equal(&fq_in->saddr, &fq->saddr) &&
                    ipv6_addr_equal(&fq_in->daddr, &fq->daddr)) {
                        atomic_inc(&fq->refcnt);
@@ -374,7 +374,7 @@ fq_find(__be32 id, struct in6_addr *src, struct in6_addr *dst)
 
        read_lock(&nf_ct_frag6_lock);
        hlist_for_each_entry(fq, n, &nf_ct_frag6_hash[hash], list) {
-               if (fq->id == id && 
+               if (fq->id == id &&
                    ipv6_addr_equal(src, &fq->saddr) &&
                    ipv6_addr_equal(dst, &fq->daddr)) {
                        atomic_inc(&fq->refcnt);
@@ -388,7 +388,7 @@ fq_find(__be32 id, struct in6_addr *src, struct in6_addr *dst)
 }
 
 
-static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb, 
+static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb,
                             struct frag_hdr *fhdr, int nhoff)
 {
        struct sk_buff *prev, *next;
@@ -405,12 +405,12 @@ static int nf_ct_frag6_queue(struct nf_ct_frag6_queue *fq, struct sk_buff *skb,
 
        if ((unsigned int)end > IPV6_MAXPLEN) {
                DEBUGP("offset is too large.\n");
-               return -1;
+               return -1;
        }
 
-       if (skb->ip_summed == CHECKSUM_COMPLETE)
-               skb->csum = csum_sub(skb->csum,
-                                    csum_partial(skb->nh.raw,
+       if (skb->ip_summed == CHECKSUM_COMPLETE)
+               skb->csum = csum_sub(skb->csum,
+                                    csum_partial(skb->nh.raw,
                                                  (u8*)(fhdr + 1) - skb->nh.raw,
                                                  0));
 
@@ -625,7 +625,7 @@ nf_ct_frag6_reasm(struct nf_ct_frag6_queue *fq, struct net_device *dev)
        /* We have to remove fragment header from datagram and to relocate
         * header in order to calculate ICV correctly. */
        head->nh.raw[fq->nhoffset] = head->h.raw[0];
-       memmove(head->head + sizeof(struct frag_hdr), head->head, 
+       memmove(head->head + sizeof(struct frag_hdr), head->head,
                (head->data - head->head) - sizeof(struct frag_hdr));
        head->mac.raw += sizeof(struct frag_hdr);
        head->nh.raw += sizeof(struct frag_hdr);
@@ -701,41 +701,41 @@ out_fail:
 static int
 find_prev_fhdr(struct sk_buff *skb, u8 *prevhdrp, int *prevhoff, int *fhoff)
 {
-        u8 nexthdr = skb->nh.ipv6h->nexthdr;
+       u8 nexthdr = skb->nh.ipv6h->nexthdr;
        u8 prev_nhoff = (u8 *)&skb->nh.ipv6h->nexthdr - skb->data;
        int start = (u8 *)(skb->nh.ipv6h+1) - skb->data;
        int len = skb->len - start;
        u8 prevhdr = NEXTHDR_IPV6;
 
-        while (nexthdr != NEXTHDR_FRAGMENT) {
-                struct ipv6_opt_hdr hdr;
-                int hdrlen;
+       while (nexthdr != NEXTHDR_FRAGMENT) {
+               struct ipv6_opt_hdr hdr;
+               int hdrlen;
 
                if (!ipv6_ext_hdr(nexthdr)) {
                        return -1;
                }
-                if (len < (int)sizeof(struct ipv6_opt_hdr)) {
+               if (len < (int)sizeof(struct ipv6_opt_hdr)) {
                        DEBUGP("too short\n");
                        return -1;
                }
-                if (nexthdr == NEXTHDR_NONE) {
+               if (nexthdr == NEXTHDR_NONE) {
                        DEBUGP("next header is none\n");
                        return -1;
                }
-                if (skb_copy_bits(skb, start, &hdr, sizeof(hdr)))
-                        BUG();
-                if (nexthdr == NEXTHDR_AUTH)
-                        hdrlen = (hdr.hdrlen+2)<<2;
-                else
-                        hdrlen = ipv6_optlen(&hdr);
+               if (skb_copy_bits(skb, start, &hdr, sizeof(hdr)))
+                       BUG();
+               if (nexthdr == NEXTHDR_AUTH)
+                       hdrlen = (hdr.hdrlen+2)<<2;
+               else
+                       hdrlen = ipv6_optlen(&hdr);
 
                prevhdr = nexthdr;
                prev_nhoff = start;
 
-                nexthdr = hdr.nexthdr;
-                len -= hdrlen;
-                start += hdrlen;
-        }
+               nexthdr = hdr.nexthdr;
+               len -= hdrlen;
+               start += hdrlen;
+       }
 
        if (len < 0)
                return -1;
@@ -749,7 +749,7 @@ find_prev_fhdr(struct sk_buff *skb, u8 *prevhdrp, int *prevhoff, int *fhoff)
 
 struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb)
 {
-       struct sk_buff *clone; 
+       struct sk_buff *clone;
        struct net_device *dev = skb->dev;
        struct frag_hdr *fhdr;
        struct nf_ct_frag6_queue *fq;
index 35249d8487bbb4b61a0b0b29fd83774e26dc594c..fa3fb509f1877c4efaac30113fbeeff6ac52484c 100644 (file)
@@ -17,7 +17,6 @@
  *             as published by the Free Software Foundation; either version
  *             2 of the License, or (at your option) any later version.
  */
-#include <linux/sched.h>
 #include <linux/socket.h>
 #include <linux/net.h>
 #include <linux/ipv6.h>
@@ -50,7 +49,7 @@ static int sockstat6_seq_show(struct seq_file *seq, void *v)
        seq_printf(seq, "UDP6: inuse %d\n",
                       fold_prot_inuse(&udpv6_prot));
        seq_printf(seq, "UDPLITE6: inuse %d\n",
-                       fold_prot_inuse(&udplitev6_prot));
+                       fold_prot_inuse(&udplitev6_prot));
        seq_printf(seq, "RAW6: inuse %d\n",
                       fold_prot_inuse(&rawv6_prot));
        seq_printf(seq, "FRAG6: inuse %d memory %d\n",
@@ -89,7 +88,7 @@ static struct snmp_mib snmp6_icmp6_list[] = {
 /* icmpv6 mib according to RFC 2466
 
    Exceptions:  {In|Out}AdminProhibs are removed, because I see
-                no good reasons to account them separately
+               no good reasons to account them separately
                of another dest.unreachs.
                OutErrs is zero identically.
                OutEchos too.
@@ -146,14 +145,14 @@ static struct snmp_mib snmp6_udplite6_list[] = {
 static unsigned long
 fold_field(void *mib[], int offt)
 {
-        unsigned long res = 0;
-        int i;
-        for_each_possible_cpu(i) {
-                res += *(((unsigned long *)per_cpu_ptr(mib[0], i)) + offt);
-                res += *(((unsigned long *)per_cpu_ptr(mib[1], i)) + offt);
-        }
-        return res;
+       unsigned long res = 0;
+       int i;
+
+       for_each_possible_cpu(i) {
+               res += *(((unsigned long *)per_cpu_ptr(mib[0], i)) + offt);
+               res += *(((unsigned long *)per_cpu_ptr(mib[1], i)) + offt);
+       }
+       return res;
 }
 
 static inline void
@@ -161,7 +160,7 @@ snmp6_seq_show_item(struct seq_file *seq, void **mib, struct snmp_mib *itemlist)
 {
        int i;
        for (i=0; itemlist[i].name; i++)
-               seq_printf(seq, "%-32s\t%lu\n", itemlist[i].name, 
+               seq_printf(seq, "%-32s\t%lu\n", itemlist[i].name,
                                fold_field(mib, itemlist[i].entry));
 }
 
@@ -187,7 +186,7 @@ static int sockstat6_seq_open(struct inode *inode, struct file *file)
        return single_open(file, sockstat6_seq_show, NULL);
 }
 
-static struct file_operations sockstat6_seq_fops = {
+static const struct file_operations sockstat6_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = sockstat6_seq_open,
        .read    = seq_read,
@@ -200,7 +199,7 @@ static int snmp6_seq_open(struct inode *inode, struct file *file)
        return single_open(file, snmp6_seq_show, PDE(inode)->data);
 }
 
-static struct file_operations snmp6_seq_fops = {
+static const struct file_operations snmp6_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = snmp6_seq_open,
        .read    = seq_read,
index 52c1d58b6ca61587c5b1e49261316d282b80efb8..ef43bd57baed0908307890f723c7ffed40708b10 100644 (file)
@@ -27,7 +27,6 @@
 #include <linux/types.h>
 #include <linux/socket.h>
 #include <linux/sockios.h>
-#include <linux/sched.h>
 #include <linux/net.h>
 #include <linux/in6.h>
 #include <linux/netdevice.h>
@@ -64,7 +63,7 @@ int inet6_add_protocol(struct inet6_protocol *prot, unsigned char protocol)
 /*
  *     Remove a protocol from the hash tables.
  */
+
 int inet6_del_protocol(struct inet6_protocol *prot, unsigned char protocol)
 {
        int ret, hash = protocol & (MAX_INET_PROTOS - 1);
index c2d8059e754e4814bb9131d7800dcb4791e4c2f2..306d5d83c06803727e2b9b64cd8e57e08e11fd80 100644 (file)
@@ -1,9 +1,9 @@
 /*
  *     RAW sockets for IPv6
- *     Linux INET6 implementation 
+ *     Linux INET6 implementation
  *
  *     Authors:
- *     Pedro Roque             <roque@di.fc.ul.pt>     
+ *     Pedro Roque             <roque@di.fc.ul.pt>
  *
  *     Adapted from linux/net/ipv4/raw.c
  *
@@ -11,7 +11,7 @@
  *
  *     Fixes:
  *     Hideaki YOSHIFUJI       :       sin6_scope_id support
- *     YOSHIFUJI,H.@USAGI      :       raw checksum (RFC2292(bis) compliance) 
+ *     YOSHIFUJI,H.@USAGI      :       raw checksum (RFC2292(bis) compliance)
  *     Kazunori MIYAZAWA @USAGI:       change process style to use ip6_append_data
  *
  *     This program is free software; you can redistribute it and/or
@@ -24,7 +24,6 @@
 #include <linux/types.h>
 #include <linux/socket.h>
 #include <linux/sockios.h>
-#include <linux/sched.h>
 #include <linux/net.h>
 #include <linux/in6.h>
 #include <linux/netdevice.h>
@@ -71,12 +70,12 @@ static void raw_v6_hash(struct sock *sk)
        write_lock_bh(&raw_v6_lock);
        sk_add_node(sk, list);
        sock_prot_inc_use(sk->sk_prot);
-       write_unlock_bh(&raw_v6_lock);
+       write_unlock_bh(&raw_v6_lock);
 }
 
 static void raw_v6_unhash(struct sock *sk)
 {
-       write_lock_bh(&raw_v6_lock);
+       write_lock_bh(&raw_v6_lock);
        if (sk_del_node_init(sk))
                sock_prot_dec_use(sk->sk_prot);
        write_unlock_bh(&raw_v6_lock);
@@ -250,7 +249,7 @@ static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
                                 */
                                sk->sk_bound_dev_if = addr->sin6_scope_id;
                        }
-                       
+
                        /* Binding to link-local address requires an interface */
                        if (!sk->sk_bound_dev_if)
                                goto out;
@@ -261,7 +260,7 @@ static int rawv6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
                                goto out;
                        }
                }
-               
+
                /* ipv4 addr of the socket is invalid.  Only the
                 * unspecified and mapped address have a v4 equivalent.
                 */
@@ -324,7 +323,7 @@ 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) && 
+       if ((raw6_sk(sk)->checksum || sk->sk_filter) &&
            skb_checksum_complete(skb)) {
                /* FIXME: increment a raw6 drops counter here */
                kfree_skb(skb);
@@ -342,10 +341,10 @@ static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb)
 }
 
 /*
- *     This is next to useless... 
+ *     This is next to useless...
  *     if we demultiplex in network layer we don't need the extra call
- *     just to queue the skb... 
- *     maybe we could have the network decide upon a hint if it 
+ *     just to queue the skb...
+ *     maybe we could have the network decide upon a hint if it
  *     should call raw_rcv for demultiplexing
  */
 int rawv6_rcv(struct sock *sk, struct sk_buff *skb)
@@ -353,17 +352,17 @@ int rawv6_rcv(struct sock *sk, struct sk_buff *skb)
        struct inet_sock *inet = inet_sk(sk);
        struct raw6_sock *rp = raw6_sk(sk);
 
-        if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) {
-                kfree_skb(skb);
-                return NET_RX_DROP;
-        }
+       if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) {
+               kfree_skb(skb);
+               return NET_RX_DROP;
+       }
 
        if (!rp->checksum)
                skb->ip_summed = CHECKSUM_UNNECESSARY;
 
        if (skb->ip_summed == CHECKSUM_COMPLETE) {
                skb_postpull_rcsum(skb, skb->nh.raw,
-                                  skb->h.raw - 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))
@@ -404,8 +403,8 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk,
 
        if (flags & MSG_OOB)
                return -EOPNOTSUPP;
-               
-       if (addr_len) 
+
+       if (addr_len)
                *addr_len=sizeof(*sin6);
 
        if (flags & MSG_ERRQUEUE)
@@ -416,10 +415,10 @@ static int rawv6_recvmsg(struct kiocb *iocb, struct sock *sk,
                goto out;
 
        copied = skb->len;
-       if (copied > len) {
-               copied = len;
-               msg->msg_flags |= MSG_TRUNC;
-       }
+       if (copied > len) {
+               copied = len;
+               msg->msg_flags |= MSG_TRUNC;
+       }
 
        if (skb->ip_summed==CHECKSUM_UNNECESSARY) {
                err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
@@ -549,7 +548,7 @@ out:
 }
 
 static int rawv6_send_hdrinc(struct sock *sk, void *from, int length,
-                       struct flowi *fl, struct rt6_info *rt, 
+                       struct flowi *fl, struct rt6_info *rt,
                        unsigned int flags)
 {
        struct ipv6_pinfo *np = inet6_sk(sk);
@@ -570,7 +569,7 @@ static int rawv6_send_hdrinc(struct sock *sk, void *from, int length,
        skb = sock_alloc_send_skb(sk, length+hh_len+15,
                                  flags&MSG_DONTWAIT, &err);
        if (skb == NULL)
-               goto error; 
+               goto error;
        skb_reserve(skb, hh_len);
 
        skb->priority = sk->sk_priority;
@@ -600,7 +599,7 @@ error_fault:
        kfree_skb(skb);
 error:
        IP6_INC_STATS(rt->rt6i_idev, IPSTATS_MIB_OUTDISCARDS);
-       return err; 
+       return err;
 }
 
 static int rawv6_probe_proto_opt(struct flowi *fl, struct msghdr *msg)
@@ -694,19 +693,19 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
                return -EMSGSIZE;
 
        /* Mirror BSD error message compatibility */
-       if (msg->msg_flags & MSG_OOB)           
+       if (msg->msg_flags & MSG_OOB)
                return -EOPNOTSUPP;
 
        /*
-        *      Get and verify the address. 
+        *      Get and verify the address.
         */
        memset(&fl, 0, sizeof(fl));
 
        if (sin6) {
-               if (addr_len < SIN6_LEN_RFC2133) 
+               if (addr_len < SIN6_LEN_RFC2133)
                        return -EINVAL;
 
-               if (sin6->sin6_family && sin6->sin6_family != AF_INET6) 
+               if (sin6->sin6_family && sin6->sin6_family != AF_INET6)
                        return(-EAFNOSUPPORT);
 
                /* port is the proto value [0..255] carried in nexthdr */
@@ -744,17 +743,17 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
                    ipv6_addr_type(daddr)&IPV6_ADDR_LINKLOCAL)
                        fl.oif = sin6->sin6_scope_id;
        } else {
-               if (sk->sk_state != TCP_ESTABLISHED) 
+               if (sk->sk_state != TCP_ESTABLISHED)
                        return -EDESTADDRREQ;
-               
+
                proto = inet->num;
                daddr = &np->daddr;
                fl.fl6_flowlabel = np->flow_label;
        }
 
        if (ipv6_addr_any(daddr)) {
-               /* 
-                * unspecified destination address 
+               /*
+                * unspecified destination address
                 * treated as error... is this correct ?
                 */
                fl6_sock_release(flowlabel);
@@ -792,7 +791,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
        err = rawv6_probe_proto_opt(&fl, msg);
        if (err)
                goto out;
+
        ipv6_addr_copy(&fl.fl6_dst, daddr);
        if (ipv6_addr_any(&fl.fl6_src) && !ipv6_addr_any(&np->saddr))
                ipv6_addr_copy(&fl.fl6_src, &np->saddr);
@@ -856,7 +855,7 @@ done:
        dst_release(dst);
        if (!inet->hdrincl)
                release_sock(sk);
-out:   
+out:
        fl6_sock_release(flowlabel);
        return err<0?err:len;
 do_confirm:
@@ -867,7 +866,7 @@ do_confirm:
        goto done;
 }
 
-static int rawv6_seticmpfilter(struct sock *sk, int level, int optname, 
+static int rawv6_seticmpfilter(struct sock *sk, int level, int optname,
                               char __user *optval, int optlen)
 {
        switch (optname) {
@@ -884,7 +883,7 @@ static int rawv6_seticmpfilter(struct sock *sk, int level, int optname,
        return 0;
 }
 
-static int rawv6_geticmpfilter(struct sock *sk, int level, int optname, 
+static int rawv6_geticmpfilter(struct sock *sk, int level, int optname,
                               char __user *optval, int __user *optlen)
 {
        int len;
@@ -916,7 +915,7 @@ static int do_rawv6_setsockopt(struct sock *sk, int level, int optname,
        struct raw6_sock *rp = raw6_sk(sk);
        int val;
 
-       if (get_user(val, (int __user *)optval))
+       if (get_user(val, (int __user *)optval))
                return -EFAULT;
 
        switch (optname) {
@@ -1224,7 +1223,7 @@ static void raw6_sock_seq_show(struct seq_file *seq, struct sock *sp, int i)
                   src->s6_addr32[2], src->s6_addr32[3], srcp,
                   dest->s6_addr32[0], dest->s6_addr32[1],
                   dest->s6_addr32[2], dest->s6_addr32[3], destp,
-                  sp->sk_state, 
+                  sp->sk_state,
                   atomic_read(&sp->sk_wmem_alloc),
                   atomic_read(&sp->sk_rmem_alloc),
                   0, 0L, 0,
@@ -1273,7 +1272,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations raw6_seq_fops = {
+static const struct file_operations raw6_seq_fops = {
        .owner =        THIS_MODULE,
        .open =         raw6_seq_open,
        .read =         seq_read,
index 6f9a9046510f730a6f1f431010e9ffe5f6e05e16..7034c54e5010d48dc1c306335e367e7e9470dfb1 100644 (file)
@@ -1,9 +1,9 @@
 /*
  *     IPv6 fragment reassembly
- *     Linux INET6 implementation 
+ *     Linux INET6 implementation
  *
  *     Authors:
- *     Pedro Roque             <roque@di.fc.ul.pt>     
+ *     Pedro Roque             <roque@di.fc.ul.pt>
  *
  *     $Id: reassembly.c,v 1.26 2001/03/07 22:00:57 davem Exp $
  *
@@ -15,8 +15,8 @@
  *      2 of the License, or (at your option) any later version.
  */
 
-/* 
- *     Fixes:  
+/*
+ *     Fixes:
  *     Andi Kleen      Make it work with multiple hosts.
  *                     More RFC compliance.
  *
@@ -343,7 +343,7 @@ static struct frag_queue *ip6_frag_intern(struct frag_queue *fq_in)
        hash = ip6qhashfn(fq_in->id, &fq_in->saddr, &fq_in->daddr);
 #ifdef CONFIG_SMP
        hlist_for_each_entry(fq, n, &ip6_frag_hash[hash], list) {
-               if (fq->id == fq_in->id && 
+               if (fq->id == fq_in->id &&
                    ipv6_addr_equal(&fq_in->saddr, &fq->saddr) &&
                    ipv6_addr_equal(&fq_in->daddr, &fq->daddr)) {
                        atomic_inc(&fq->refcnt);
@@ -406,7 +406,7 @@ fq_find(__be32 id, struct in6_addr *src, struct in6_addr *dst,
        read_lock(&ip6_frag_lock);
        hash = ip6qhashfn(id, src, dst);
        hlist_for_each_entry(fq, n, &ip6_frag_hash[hash], list) {
-               if (fq->id == id && 
+               if (fq->id == id &&
                    ipv6_addr_equal(src, &fq->saddr) &&
                    ipv6_addr_equal(dst, &fq->daddr)) {
                        atomic_inc(&fq->refcnt);
@@ -420,7 +420,7 @@ fq_find(__be32 id, struct in6_addr *src, struct in6_addr *dst,
 }
 
 
-static void ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb, 
+static void ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb,
                           struct frag_hdr *fhdr, int nhoff)
 {
        struct sk_buff *prev, *next;
@@ -436,13 +436,13 @@ static void ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb,
        if ((unsigned int)end > IPV6_MAXPLEN) {
                IP6_INC_STATS_BH(ip6_dst_idev(skb->dst),
                                 IPSTATS_MIB_INHDRERRORS);
-               icmpv6_param_prob(skb,ICMPV6_HDR_FIELD, (u8*)&fhdr->frag_off - skb->nh.raw);
-               return;
+               icmpv6_param_prob(skb,ICMPV6_HDR_FIELD, (u8*)&fhdr->frag_off - skb->nh.raw);
+               return;
        }
 
-       if (skb->ip_summed == CHECKSUM_COMPLETE)
-               skb->csum = csum_sub(skb->csum,
-                                    csum_partial(skb->nh.raw, (u8*)(fhdr+1)-skb->nh.raw, 0));
+       if (skb->ip_summed == CHECKSUM_COMPLETE)
+               skb->csum = csum_sub(skb->csum,
+                                    csum_partial(skb->nh.raw, (u8*)(fhdr+1)-skb->nh.raw, 0));
 
        /* Is this the final fragment? */
        if (!(fhdr->frag_off & htons(IP6_MF))) {
@@ -464,7 +464,7 @@ static void ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb,
                         */
                        IP6_INC_STATS_BH(ip6_dst_idev(skb->dst),
                                         IPSTATS_MIB_INHDRERRORS);
-                       icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, 
+                       icmpv6_param_prob(skb, ICMPV6_HDR_FIELD,
                                          offsetof(struct ipv6hdr, payload_len));
                        return;
                }
@@ -482,7 +482,7 @@ static void ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb,
        /* Point into the IP datagram 'data' part. */
        if (!pskb_pull(skb, (u8 *) (fhdr + 1) - skb->data))
                goto err;
-       
+
        if (pskb_trim_rcsum(skb, end - offset))
                goto err;
 
@@ -640,7 +640,7 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff **skb_in,
         * header in order to calculate ICV correctly. */
        nhoff = fq->nhoffset;
        head->nh.raw[nhoff] = head->h.raw[0];
-       memmove(head->head + sizeof(struct frag_hdr), head->head, 
+       memmove(head->head + sizeof(struct frag_hdr), head->head,
                (head->data - head->head) - sizeof(struct frag_hdr));
        head->mac.raw += sizeof(struct frag_hdr);
        head->nh.raw += sizeof(struct frag_hdr);
@@ -695,7 +695,7 @@ out_fail:
 
 static int ipv6_frag_rcv(struct sk_buff **skbp)
 {
-       struct sk_buff *skb = *skbp; 
+       struct sk_buff *skb = *skbp;
        struct net_device *dev = skb->dev;
        struct frag_hdr *fhdr;
        struct frag_queue *fq;
index 19c906f6efa14215bd509c5cbea621deb99dd26c..0e1f4b2cd3dd74e8a4daf4d23eaf9cf7babcf56d 100644 (file)
@@ -3,7 +3,7 @@
  *     FIB front-end.
  *
  *     Authors:
- *     Pedro Roque             <roque@di.fc.ul.pt>     
+ *     Pedro Roque             <roque@di.fc.ul.pt>
  *
  *     $Id: route.c,v 1.56 2001/10/31 21:55:55 davem Exp $
  *
@@ -201,7 +201,7 @@ static void ip6_dst_destroy(struct dst_entry *dst)
        if (idev != NULL) {
                rt->rt6i_idev = NULL;
                in6_dev_put(idev);
-       }       
+       }
 }
 
 static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev,
@@ -243,7 +243,7 @@ static __inline__ struct rt6_info *rt6_device_match(struct rt6_info *rt,
        struct rt6_info *sprt;
 
        if (oif) {
-               for (sprt = rt; sprt; sprt = sprt->u.next) {
+               for (sprt = rt; sprt; sprt = sprt->u.dst.rt6_next) {
                        struct net_device *dev = sprt->rt6i_dev;
                        if (dev->ifindex == oif)
                                return sprt;
@@ -252,7 +252,7 @@ static __inline__ struct rt6_info *rt6_device_match(struct rt6_info *rt,
                                    sprt->rt6i_idev->dev->ifindex != oif) {
                                        if (strict && oif)
                                                continue;
-                                       if (local && (!oif || 
+                                       if (local && (!oif ||
                                                      local->rt6i_idev->dev->ifindex == oif))
                                                continue;
                                }
@@ -350,7 +350,7 @@ static int rt6_score_route(struct rt6_info *rt, int oif,
                           int strict)
 {
        int m, n;
-               
+
        m = rt6_check_dev(rt, oif);
        if (!m && (strict & RT6_LOOKUP_F_IFACE))
                return -1;
@@ -376,7 +376,7 @@ static struct rt6_info *rt6_select(struct rt6_info **head, int oif,
 
        for (rt = rt0, metric = rt0->rt6i_metric;
             rt && rt->rt6i_metric == metric && (!last || rt != rt0);
-            rt = rt->u.next) {
+            rt = rt->u.dst.rt6_next) {
                int m;
 
                if (rt6_check_expired(rt))
@@ -404,9 +404,9 @@ static struct rt6_info *rt6_select(struct rt6_info **head, int oif,
                /* no entries matched; do round-robin */
                static DEFINE_SPINLOCK(lock);
                spin_lock(&lock);
-               *head = rt0->u.next;
-               rt0->u.next = last->u.next;
-               last->u.next = rt0;
+               *head = rt0->u.dst.rt6_next;
+               rt0->u.dst.rt6_next = last->u.dst.rt6_next;
+               last->u.dst.rt6_next = rt0;
                spin_unlock(&lock);
        }
 
@@ -723,7 +723,7 @@ void ip6_route_input(struct sk_buff *skb)
                                .flowlabel = (* (__be32 *) iph)&IPV6_FLOWINFO_MASK,
                        },
                },
-               .mark = skb->mark,
+               .mark = skb->mark,
                .proto = iph->nexthdr,
        };
 
@@ -888,9 +888,9 @@ static inline unsigned int ipv6_advmss(unsigned int mtu)
                mtu = ip6_rt_min_advmss;
 
        /*
-        * Maximal non-jumbo IPv6 payload is IPV6_MAXPLEN and 
-        * corresponding MSS is IPV6_MAXPLEN - tcp_header_size. 
-        * IPV6_MAXPLEN is also valid and means: "any MSS, 
+        * Maximal non-jumbo IPv6 payload is IPV6_MAXPLEN and
+        * corresponding MSS is IPV6_MAXPLEN - tcp_header_size.
+        * IPV6_MAXPLEN is also valid and means: "any MSS,
         * rely only on pmtu discovery"
         */
        if (mtu > IPV6_MAXPLEN - sizeof(struct tcphdr))
@@ -901,7 +901,7 @@ static inline unsigned int ipv6_advmss(unsigned int mtu)
 static struct dst_entry *ndisc_dst_gc_list;
 static DEFINE_SPINLOCK(ndisc_lock);
 
-struct dst_entry *ndisc_dst_alloc(struct net_device *dev, 
+struct dst_entry *ndisc_dst_alloc(struct net_device *dev,
                                  struct neighbour *neigh,
                                  struct in6_addr *addr,
                                  int (*output)(struct sk_buff *))
@@ -934,8 +934,8 @@ struct dst_entry *ndisc_dst_alloc(struct net_device *dev,
        rt->u.dst.output  = output;
 
 #if 0  /* there's no chance to use these for ndisc */
-       rt->u.dst.flags   = ipv6_addr_type(addr) & IPV6_ADDR_UNICAST 
-                               ? DST_HOST 
+       rt->u.dst.flags   = ipv6_addr_type(addr) & IPV6_ADDR_UNICAST
+                               ? DST_HOST
                                : 0;
        ipv6_addr_copy(&rt->rt6i_dst.addr, addr);
        rt->rt6i_dst.plen = 128;
@@ -958,7 +958,7 @@ int ndisc_dst_gc(int *more)
        int freed;
 
        next = NULL;
-       freed = 0;
+       freed = 0;
 
        spin_lock_bh(&ndisc_lock);
        pprev = &ndisc_dst_gc_list;
@@ -1276,9 +1276,9 @@ static int ip6_route_del(struct fib6_config *cfg)
        fn = fib6_locate(&table->tb6_root,
                         &cfg->fc_dst, cfg->fc_dst_len,
                         &cfg->fc_src, cfg->fc_src_len);
-       
+
        if (fn) {
-               for (rt = fn->leaf; rt; rt = rt->u.next) {
+               for (rt = fn->leaf; rt; rt = rt->u.dst.rt6_next) {
                        if (cfg->fc_ifindex &&
                            (rt->rt6i_dev == NULL ||
                             rt->rt6i_dev->ifindex != cfg->fc_ifindex))
@@ -1329,7 +1329,7 @@ static struct rt6_info *__ip6_route_redirect(struct fib6_table *table,
        read_lock_bh(&table->tb6_lock);
        fn = fib6_lookup(&table->tb6_root, &fl->fl6_dst, &fl->fl6_src);
 restart:
-       for (rt = fn->leaf; rt; rt = rt->u.next) {
+       for (rt = fn->leaf; rt; rt = rt->u.dst.rt6_next) {
                /*
                 * Current route is on-link; redirect is always invalid.
                 *
@@ -1405,7 +1405,7 @@ void rt6_redirect(struct in6_addr *dest, struct in6_addr *src,
         *      We have finally decided to accept it.
         */
 
-       neigh_update(neigh, lladdr, NUD_STALE, 
+       neigh_update(neigh, lladdr, NUD_STALE,
                     NEIGH_UPDATE_F_WEAK_OVERRIDE|
                     NEIGH_UPDATE_F_OVERRIDE|
                     (on_link ? 0 : (NEIGH_UPDATE_F_OVERRIDE_ISROUTER|
@@ -1454,7 +1454,7 @@ void rt6_redirect(struct in6_addr *dest, struct in6_addr *src,
        }
 
 out:
-        dst_release(&rt->u.dst);
+       dst_release(&rt->u.dst);
        return;
 }
 
@@ -1478,7 +1478,7 @@ void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr,
 
        if (pmtu < IPV6_MIN_MTU) {
                /*
-                * According to RFC2460, PMTU is set to the IPv6 Minimum Link 
+                * According to RFC2460, PMTU is set to the IPv6 Minimum Link
                 * MTU (1280) and a fragment header should always be included
                 * after a node receiving Too Big message reporting PMTU is
                 * less than the IPv6 Minimum Link MTU.
@@ -1590,7 +1590,7 @@ static struct rt6_info *rt6_get_route_info(struct in6_addr *prefix, int prefixle
        if (!fn)
                goto out;
 
-       for (rt = fn->leaf; rt; rt = rt->u.next) {
+       for (rt = fn->leaf; rt; rt = rt->u.dst.rt6_next) {
                if (rt->rt6i_dev->ifindex != ifindex)
                        continue;
                if ((rt->rt6i_flags & (RTF_ROUTEINFO|RTF_GATEWAY)) != (RTF_ROUTEINFO|RTF_GATEWAY))
@@ -1632,7 +1632,7 @@ static struct rt6_info *rt6_add_route_info(struct in6_addr *prefix, int prefixle
 #endif
 
 struct rt6_info *rt6_get_dflt_router(struct in6_addr *addr, struct net_device *dev)
-{      
+{
        struct rt6_info *rt;
        struct fib6_table *table;
 
@@ -1641,7 +1641,7 @@ struct rt6_info *rt6_get_dflt_router(struct in6_addr *addr, struct net_device *d
                return NULL;
 
        write_lock_bh(&table->tb6_lock);
-       for (rt = table->tb6_root.leaf; rt; rt=rt->u.next) {
+       for (rt = table->tb6_root.leaf; rt; rt=rt->u.dst.rt6_next) {
                if (dev == rt->rt6i_dev &&
                    ((rt->rt6i_flags & (RTF_ADDRCONF | RTF_DEFAULT)) == (RTF_ADDRCONF | RTF_DEFAULT)) &&
                    ipv6_addr_equal(&rt->rt6i_gateway, addr))
@@ -1684,7 +1684,7 @@ void rt6_purge_dflt_routers(void)
 
 restart:
        read_lock_bh(&table->tb6_lock);
-       for (rt = table->tb6_root.leaf; rt; rt = rt->u.next) {
+       for (rt = table->tb6_root.leaf; rt; rt = rt->u.dst.rt6_next) {
                if (rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) {
                        dst_hold(&rt->u.dst);
                        read_unlock_bh(&table->tb6_lock);
@@ -1896,8 +1896,8 @@ static int rt6_mtu_change_route(struct rt6_info *rt, void *p_arg)
         */
        if (rt->rt6i_dev == arg->dev &&
            !dst_metric_locked(&rt->u.dst, RTAX_MTU) &&
-            (dst_mtu(&rt->u.dst) > arg->mtu ||
-             (dst_mtu(&rt->u.dst) < arg->mtu &&
+           (dst_mtu(&rt->u.dst) > arg->mtu ||
+            (dst_mtu(&rt->u.dst) < arg->mtu &&
              dst_mtu(&rt->u.dst) == idev->cnf.mtu6)))
                rt->u.dst.metrics[RTAX_MTU-1] = arg->mtu;
        rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(arg->mtu);
@@ -2083,13 +2083,13 @@ static int rt6_fill_node(struct sk_buff *skb, struct rt6_info *rt,
 
        if (dst) {
                NLA_PUT(skb, RTA_DST, 16, dst);
-               rtm->rtm_dst_len = 128;
+               rtm->rtm_dst_len = 128;
        } else if (rtm->rtm_dst_len)
                NLA_PUT(skb, RTA_DST, 16, &rt->rt6i_dst.addr);
 #ifdef CONFIG_IPV6_SUBTREES
        if (src) {
                NLA_PUT(skb, RTA_SRC, 16, src);
-               rtm->rtm_src_len = 128;
+               rtm->rtm_src_len = 128;
        } else if (rtm->rtm_src_len)
                NLA_PUT(skb, RTA_SRC, 16, &rt->rt6i_src.addr);
 #endif
@@ -2299,7 +2299,7 @@ static int rt6_info_route(struct rt6_info *rt, void *p_arg)
        arg->len += sprintf(arg->buffer + arg->len,
                            " %08x %08x %08x %08x %8s\n",
                            rt->rt6i_metric, atomic_read(&rt->u.dst.__refcnt),
-                           rt->u.dst.__use, rt->rt6i_flags, 
+                           rt->u.dst.__use, rt->rt6i_flags,
                            rt->rt6i_dev ? rt->rt6i_dev->name : "");
        return 0;
 }
@@ -2345,7 +2345,7 @@ static int rt6_stats_seq_open(struct inode *inode, struct file *file)
        return single_open(file, rt6_stats_seq_show, NULL);
 }
 
-static struct file_operations rt6_stats_seq_fops = {
+static const struct file_operations rt6_stats_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = rt6_stats_seq_open,
        .read    = seq_read,
@@ -2371,91 +2371,91 @@ int ipv6_sysctl_rtcache_flush(ctl_table *ctl, int write, struct file * filp,
 }
 
 ctl_table ipv6_route_table[] = {
-        {
-               .ctl_name       =       NET_IPV6_ROUTE_FLUSH, 
+       {
+               .ctl_name       =       NET_IPV6_ROUTE_FLUSH,
                .procname       =       "flush",
-               .data           =       &flush_delay,
+               .data           =       &flush_delay,
                .maxlen         =       sizeof(int),
                .mode           =       0200,
-               .proc_handler   =       &ipv6_sysctl_rtcache_flush
+               .proc_handler   =       &ipv6_sysctl_rtcache_flush
        },
        {
                .ctl_name       =       NET_IPV6_ROUTE_GC_THRESH,
                .procname       =       "gc_thresh",
-               .data           =       &ip6_dst_ops.gc_thresh,
+               .data           =       &ip6_dst_ops.gc_thresh,
                .maxlen         =       sizeof(int),
                .mode           =       0644,
-               .proc_handler   =       &proc_dointvec,
+               .proc_handler   =       &proc_dointvec,
        },
        {
                .ctl_name       =       NET_IPV6_ROUTE_MAX_SIZE,
                .procname       =       "max_size",
-               .data           =       &ip6_rt_max_size,
+               .data           =       &ip6_rt_max_size,
                .maxlen         =       sizeof(int),
                .mode           =       0644,
-               .proc_handler   =       &proc_dointvec,
+               .proc_handler   =       &proc_dointvec,
        },
        {
                .ctl_name       =       NET_IPV6_ROUTE_GC_MIN_INTERVAL,
                .procname       =       "gc_min_interval",
-               .data           =       &ip6_rt_gc_min_interval,
+               .data           =       &ip6_rt_gc_min_interval,
                .maxlen         =       sizeof(int),
                .mode           =       0644,
-               .proc_handler   =       &proc_dointvec_jiffies,
+               .proc_handler   =       &proc_dointvec_jiffies,
                .strategy       =       &sysctl_jiffies,
        },
        {
                .ctl_name       =       NET_IPV6_ROUTE_GC_TIMEOUT,
                .procname       =       "gc_timeout",
-               .data           =       &ip6_rt_gc_timeout,
+               .data           =       &ip6_rt_gc_timeout,
                .maxlen         =       sizeof(int),
                .mode           =       0644,
-               .proc_handler   =       &proc_dointvec_jiffies,
+               .proc_handler   =       &proc_dointvec_jiffies,
                .strategy       =       &sysctl_jiffies,
        },
        {
                .ctl_name       =       NET_IPV6_ROUTE_GC_INTERVAL,
                .procname       =       "gc_interval",
-               .data           =       &ip6_rt_gc_interval,
+               .data           =       &ip6_rt_gc_interval,
                .maxlen         =       sizeof(int),
                .mode           =       0644,
-               .proc_handler   =       &proc_dointvec_jiffies,
+               .proc_handler   =       &proc_dointvec_jiffies,
                .strategy       =       &sysctl_jiffies,
        },
        {
                .ctl_name       =       NET_IPV6_ROUTE_GC_ELASTICITY,
                .procname       =       "gc_elasticity",
-               .data           =       &ip6_rt_gc_elasticity,
+               .data           =       &ip6_rt_gc_elasticity,
                .maxlen         =       sizeof(int),
                .mode           =       0644,
-               .proc_handler   =       &proc_dointvec_jiffies,
+               .proc_handler   =       &proc_dointvec_jiffies,
                .strategy       =       &sysctl_jiffies,
        },
        {
                .ctl_name       =       NET_IPV6_ROUTE_MTU_EXPIRES,
                .procname       =       "mtu_expires",
-               .data           =       &ip6_rt_mtu_expires,
+               .data           =       &ip6_rt_mtu_expires,
                .maxlen         =       sizeof(int),
                .mode           =       0644,
-               .proc_handler   =       &proc_dointvec_jiffies,
+               .proc_handler   =       &proc_dointvec_jiffies,
                .strategy       =       &sysctl_jiffies,
        },
        {
                .ctl_name       =       NET_IPV6_ROUTE_MIN_ADVMSS,
                .procname       =       "min_adv_mss",
-               .data           =       &ip6_rt_min_advmss,
+               .data           =       &ip6_rt_min_advmss,
                .maxlen         =       sizeof(int),
                .mode           =       0644,
-               .proc_handler   =       &proc_dointvec_jiffies,
+               .proc_handler   =       &proc_dointvec_jiffies,
                .strategy       =       &sysctl_jiffies,
        },
        {
                .ctl_name       =       NET_IPV6_ROUTE_GC_MIN_INTERVAL_MS,
                .procname       =       "gc_min_interval_ms",
-               .data           =       &ip6_rt_gc_min_interval,
+               .data           =       &ip6_rt_gc_min_interval,
                .maxlen         =       sizeof(int),
                .mode           =       0644,
-               .proc_handler   =       &proc_dointvec_ms_jiffies,
+               .proc_handler   =       &proc_dointvec_ms_jiffies,
                .strategy       =       &sysctl_ms_jiffies,
        },
        { .ctl_name = 0 }
index 47cfeadac6dd494267dbfe04825130a852594e13..08d6ed3396e42f6deb53c4422562eb9afb260765 100644 (file)
@@ -3,7 +3,7 @@
  *     Linux INET6 implementation
  *
  *     Authors:
- *     Pedro Roque             <roque@di.fc.ul.pt>     
+ *     Pedro Roque             <roque@di.fc.ul.pt>
  *     Alexey Kuznetsov        <kuznet@ms2.inr.ac.ru>
  *
  *     $Id: sit.c,v 1.53 2001/09/25 05:09:53 davem Exp $
@@ -24,7 +24,6 @@
 #include <linux/types.h>
 #include <linux/socket.h>
 #include <linux/sockios.h>
-#include <linux/sched.h>
 #include <linux/net.h>
 #include <linux/in6.h>
 #include <linux/netdevice.h>
@@ -216,7 +215,7 @@ static void ipip6_tunnel_uninit(struct net_device *dev)
 }
 
 
-static void ipip6_err(struct sk_buff *skb, u32 info)
+static int ipip6_err(struct sk_buff *skb, u32 info)
 {
 #ifndef I_WISH_WORLD_WERE_PERFECT
 
@@ -228,21 +227,22 @@ static void ipip6_err(struct sk_buff *skb, u32 info)
        int type = skb->h.icmph->type;
        int code = skb->h.icmph->code;
        struct ip_tunnel *t;
+       int err;
 
        switch (type) {
        default:
        case ICMP_PARAMETERPROB:
-               return;
+               return 0;
 
        case ICMP_DEST_UNREACH:
                switch (code) {
                case ICMP_SR_FAILED:
                case ICMP_PORT_UNREACH:
                        /* Impossible event. */
-                       return;
+                       return 0;
                case ICMP_FRAG_NEEDED:
                        /* Soft state for pmtu is maintained by IP core. */
-                       return;
+                       return 0;
                default:
                        /* All others are translated to HOST_UNREACH.
                           rfc2003 contains "deep thoughts" about NET_UNREACH,
@@ -253,14 +253,18 @@ static void ipip6_err(struct sk_buff *skb, u32 info)
                break;
        case ICMP_TIME_EXCEEDED:
                if (code != ICMP_EXC_TTL)
-                       return;
+                       return 0;
                break;
        }
 
+       err = -ENOENT;
+
        read_lock(&ipip6_lock);
        t = ipip6_tunnel_lookup(iph->daddr, iph->saddr);
        if (t == NULL || t->parms.iph.daddr == 0)
                goto out;
+
+       err = 0;
        if (t->parms.iph.ttl == 0 && type == ICMP_TIME_EXCEEDED)
                goto out;
 
@@ -271,7 +275,7 @@ static void ipip6_err(struct sk_buff *skb, u32 info)
        t->err_time = jiffies;
 out:
        read_unlock(&ipip6_lock);
-       return;
+       return err;
 #else
        struct iphdr *iph = (struct iphdr*)dp;
        int hlen = iph->ihl<<2;
@@ -332,7 +336,7 @@ out:
        /* Prepare fake skb to feed it to icmpv6_send */
        skb2 = skb_clone(skb, GFP_ATOMIC);
        if (skb2 == NULL)
-               return;
+               return 0;
        dst_release(skb2->dst);
        skb2->dst = NULL;
        skb_pull(skb2, skb->data - (u8*)iph6);
@@ -355,7 +359,7 @@ out:
                }
        }
        kfree_skb(skb2);
-       return;
+       return 0;
 #endif
 }
 
@@ -410,7 +414,7 @@ static inline __be32 try_6to4(struct in6_addr *v6dst)
        __be32 dst = 0;
 
        if (v6dst->s6_addr16[0] == htons(0x2002)) {
-               /* 6to4 v6 addr has 16 bits prefix, 32 v4addr, 16 SLA, ... */
+               /* 6to4 v6 addr has 16 bits prefix, 32 v4addr, 16 SLA, ... */
                memcpy(&dst, &v6dst->s6_addr16[1], 4);
        }
        return dst;
@@ -434,7 +438,7 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
        int    max_headroom;                    /* The extra header space needed */
        __be32 dst = tiph->daddr;
        int    mtu;
-       struct in6_addr *addr6; 
+       struct in6_addr *addr6;
        int addr_type;
 
        if (tunnel->recursion++) {
@@ -537,7 +541,7 @@ static int ipip6_tunnel_xmit(struct sk_buff *skb, struct net_device *dev)
                struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom);
                if (!new_skb) {
                        ip_rt_put(rt);
-                       stats->tx_dropped++;
+                       stats->tx_dropped++;
                        dev_kfree_skb(skb);
                        tunnel->recursion--;
                        return 0;
@@ -791,9 +795,10 @@ static int __init ipip6_fb_tunnel_init(struct net_device *dev)
        return 0;
 }
 
-static struct net_protocol sit_protocol = {
+static struct xfrm_tunnel sit_handler = {
        .handler        =       ipip6_rcv,
        .err_handler    =       ipip6_err,
+       .priority       =       1,
 };
 
 static void __exit sit_destroy_tunnels(void)
@@ -812,7 +817,7 @@ static void __exit sit_destroy_tunnels(void)
 
 static void __exit sit_cleanup(void)
 {
-       inet_del_protocol(&sit_protocol, IPPROTO_IPV6);
+       xfrm4_tunnel_deregister(&sit_handler, AF_INET6);
 
        rtnl_lock();
        sit_destroy_tunnels();
@@ -826,12 +831,12 @@ static int __init sit_init(void)
 
        printk(KERN_INFO "IPv6 over IPv4 tunneling driver\n");
 
-       if (inet_add_protocol(&sit_protocol, IPPROTO_IPV6) < 0) {
+       if (xfrm4_tunnel_register(&sit_handler, AF_INET6) < 0) {
                printk(KERN_INFO "sit init: Can't add protocol\n");
                return -EAGAIN;
        }
 
-       ipip6_fb_tunnel_dev = alloc_netdev(sizeof(struct ip_tunnel), "sit0", 
+       ipip6_fb_tunnel_dev = alloc_netdev(sizeof(struct ip_tunnel), "sit0",
                                           ipip6_tunnel_setup);
        if (!ipip6_fb_tunnel_dev) {
                err = -ENOMEM;
@@ -848,7 +853,7 @@ static int __init sit_init(void)
  err2:
        free_netdev(ipip6_fb_tunnel_dev);
  err1:
-       inet_del_protocol(&sit_protocol, IPPROTO_IPV6);
+       xfrm4_tunnel_deregister(&sit_handler, AF_INET6);
        goto out;
 }
 
index 7a4639db13464bf6f6c87af2312680fe736d2561..3fb44277207be3c8b318f93a1aa8d59e42227b1a 100644 (file)
@@ -92,7 +92,7 @@ static ctl_table ipv6_net_table[] = {
                .mode           = 0555,
                .child          = ipv6_table
        },
-        { .ctl_name = 0 }
+       { .ctl_name = 0 }
 };
 
 static ctl_table ipv6_root_table[] = {
@@ -102,12 +102,12 @@ static ctl_table ipv6_root_table[] = {
                .mode           = 0555,
                .child          = ipv6_net_table
        },
-        { .ctl_name = 0 }
+       { .ctl_name = 0 }
 };
 
 void ipv6_sysctl_register(void)
 {
-       ipv6_sysctl_header = register_sysctl_table(ipv6_root_table, 0);
+       ipv6_sysctl_header = register_sysctl_table(ipv6_root_table);
 }
 
 void ipv6_sysctl_unregister(void)
index dcb7b00a737dc9c801dd6c406337e2b1ee5d03f9..f57a9baa6b272417af7c1f705b44ae605891f70a 100644 (file)
@@ -1,13 +1,13 @@
 /*
  *     TCP over IPv6
- *     Linux INET6 implementation 
+ *     Linux INET6 implementation
  *
  *     Authors:
- *     Pedro Roque             <roque@di.fc.ul.pt>     
+ *     Pedro Roque             <roque@di.fc.ul.pt>
  *
  *     $Id: tcp_ipv6.c,v 1.144 2002/02/01 22:01:04 davem Exp $
  *
- *     Based on: 
+ *     Based on:
  *     linux/net/ipv4/tcp.c
  *     linux/net/ipv4/tcp_input.c
  *     linux/net/ipv4/tcp_output.c
@@ -74,7 +74,7 @@ static struct socket *tcp6_socket;
 
 static void    tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb);
 static void    tcp_v6_reqsk_send_ack(struct sk_buff *skb, struct request_sock *req);
-static void    tcp_v6_send_check(struct sock *sk, int len, 
+static void    tcp_v6_send_check(struct sock *sk, int len,
                                  struct sk_buff *skb);
 
 static int     tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb);
@@ -106,8 +106,8 @@ static void tcp_v6_hash(struct sock *sk)
 }
 
 static __inline__ __sum16 tcp_v6_check(struct tcphdr *th, int len,
-                                  struct in6_addr *saddr, 
-                                  struct in6_addr *daddr, 
+                                  struct in6_addr *saddr,
+                                  struct in6_addr *daddr,
                                   __wsum base)
 {
        return csum_ipv6_magic(saddr, daddr, len, IPPROTO_TCP, base);
@@ -121,11 +121,11 @@ static __u32 tcp_v6_init_sequence(struct sk_buff *skb)
                                            skb->h.th->source);
 }
 
-static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, 
+static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
                          int addr_len)
 {
        struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
-       struct inet_sock *inet = inet_sk(sk);
+       struct inet_sock *inet = inet_sk(sk);
        struct inet_connection_sock *icsk = inet_csk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct tcp_sock *tp = tcp_sk(sk);
@@ -135,10 +135,10 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
        int addr_type;
        int err;
 
-       if (addr_len < SIN6_LEN_RFC2133) 
+       if (addr_len < SIN6_LEN_RFC2133)
                return -EINVAL;
 
-       if (usin->sin6_family != AF_INET6) 
+       if (usin->sin6_family != AF_INET6)
                return(-EAFNOSUPPORT);
 
        memset(&fl, 0, sizeof(fl));
@@ -157,11 +157,11 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
        }
 
        /*
-        *      connect() to INADDR_ANY means loopback (BSD'ism).
-        */
-       
-       if(ipv6_addr_any(&usin->sin6_addr))
-               usin->sin6_addr.s6_addr[15] = 0x1; 
+        *      connect() to INADDR_ANY means loopback (BSD'ism).
+        */
+
+       if(ipv6_addr_any(&usin->sin6_addr))
+               usin->sin6_addr.s6_addr[15] = 0x1;
 
        addr_type = ipv6_addr_type(&usin->sin6_addr);
 
@@ -323,7 +323,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
        struct ipv6_pinfo *np;
        struct sock *sk;
        int err;
-       struct tcp_sock *tp; 
+       struct tcp_sock *tp;
        __u32 seq;
 
        sk = inet6_lookup(&tcp_hashinfo, &hdr->daddr, th->dest, &hdr->saddr,
@@ -347,7 +347,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
                goto out;
 
        tp = tcp_sk(sk);
-       seq = ntohl(th->seq); 
+       seq = ntohl(th->seq);
        if (sk->sk_state != TCP_LISTEN &&
            !between(seq, tp->snd_una, tp->snd_nxt)) {
                NET_INC_STATS_BH(LINUX_MIB_OUTOFWINDOWICMPS);
@@ -434,7 +434,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
 
        case TCP_SYN_SENT:
        case TCP_SYN_RECV:  /* Cannot happen.
-                              It can, it SYNs are crossed. --ANK */ 
+                              It can, it SYNs are crossed. --ANK */
                if (!sock_owned_by_user(sk)) {
                        sk->sk_err = err;
                        sk->sk_error_report(sk);                /* Wake people up to see the error (see connect in sock.c) */
@@ -519,7 +519,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req,
        }
 
 done:
-        if (opt && opt != np->opt)
+       if (opt && opt != np->opt)
                sock_kfree_s(sk, opt, opt->tot_len);
        dst_release(dst);
        return err;
@@ -950,8 +950,8 @@ static void tcp_v6_send_check(struct sock *sk, int len, struct sk_buff *skb)
                th->check = ~csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP,  0);
                skb->csum_offset = offsetof(struct tcphdr, check);
        } else {
-               th->check = csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP, 
-                                           csum_partial((char *)th, th->doff<<2, 
+               th->check = csum_ipv6_magic(&np->saddr, &np->daddr, len, IPPROTO_TCP,
+                                           csum_partial((char *)th, th->doff<<2,
                                                         skb->csum));
        }
 }
@@ -977,7 +977,7 @@ static int tcp_v6_gso_send_check(struct sk_buff *skb)
 
 static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
 {
-       struct tcphdr *th = skb->h.th, *t1; 
+       struct tcphdr *th = skb->h.th, *t1;
        struct sk_buff *buff;
        struct flowi fl;
        int tot_len = sizeof(*th);
@@ -989,7 +989,7 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
                return;
 
        if (!ipv6_unicast_destination(skb))
-               return; 
+               return;
 
 #ifdef CONFIG_TCP_MD5SIG
        if (sk)
@@ -1008,8 +1008,8 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
 
        buff = alloc_skb(MAX_HEADER + sizeof(struct ipv6hdr) + tot_len,
                         GFP_ATOMIC);
-       if (buff == NULL) 
-               return;
+       if (buff == NULL)
+               return;
 
        skb_reserve(buff, MAX_HEADER + sizeof(struct ipv6hdr) + tot_len);
 
@@ -1021,9 +1021,9 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
        t1->source = th->dest;
        t1->doff = tot_len / 4;
        t1->rst = 1;
-  
+
        if(th->ack) {
-               t1->seq = th->ack_seq;
+               t1->seq = th->ack_seq;
        } else {
                t1->ack = 1;
                t1->ack_seq = htonl(ntohl(th->seq) + th->syn + th->fin
@@ -1128,7 +1128,7 @@ static void tcp_v6_send_ack(struct tcp_timewait_sock *tw,
        t1->window = htons(win);
 
        topt = (__be32 *)(t1 + 1);
-       
+
        if (ts) {
                *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
                                (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
@@ -1243,15 +1243,15 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
                return tcp_v4_conn_request(sk, skb);
 
        if (!ipv6_unicast_destination(skb))
-               goto drop; 
+               goto drop;
 
        /*
-        *      There are no SYN attacks on IPv6, yet...        
+        *      There are no SYN attacks on IPv6, yet...
         */
        if (inet_csk_reqsk_queue_is_full(sk) && !isn) {
                if (net_ratelimit())
                        printk(KERN_INFO "TCPv6: dropping request, synflood is possible\n");
-               goto drop;              
+               goto drop;
        }
 
        if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1)
@@ -1292,7 +1292,7 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)
            ipv6_addr_type(&treq->rmt_addr) & IPV6_ADDR_LINKLOCAL)
                treq->iif = inet6_iif(skb);
 
-       if (isn == 0) 
+       if (isn == 0)
                isn = tcp_v6_init_sequence(skb);
 
        tcp_rsk(req)->snt_isn = isn;
@@ -1334,7 +1334,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
 
                newsk = tcp_v4_syn_recv_sock(sk, skb, req, dst);
 
-               if (newsk == NULL) 
+               if (newsk == NULL)
                        return NULL;
 
                newtcp6sk = (struct tcp6_sock *)newsk;
@@ -1419,7 +1419,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
 
                if ((xfrm_lookup(&dst, &fl, sk, 0)) < 0)
                        goto out;
-       } 
+       }
 
        newsk = tcp_create_openreq_child(sk, req, skb);
        if (newsk == NULL)
@@ -1448,7 +1448,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
        ipv6_addr_copy(&newnp->rcv_saddr, &treq->loc_addr);
        newsk->sk_bound_dev_if = treq->iif;
 
-       /* Now IPv6 options... 
+       /* Now IPv6 options...
 
           First: no IPv4 options.
         */
@@ -1592,7 +1592,7 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
           looks not very well thought. For now we latch
           options, received in the last packet, enqueued
           by tcp. Feel free to propose better solution.
-                                              --ANK (980728)
+                                              --ANK (980728)
         */
        if (np->rxopt.all)
                opt_skb = skb_clone(skb, GFP_ATOMIC);
@@ -1610,7 +1610,7 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
        if (skb->len < (skb->h.th->doff<<2) || tcp_checksum_complete(skb))
                goto csum_err;
 
-       if (sk->sk_state == TCP_LISTEN) { 
+       if (sk->sk_state == TCP_LISTEN) {
                struct sock *nsk = tcp_v6_hnd_req(sk, skb);
                if (!nsk)
                        goto discard;
@@ -1620,7 +1620,7 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
                 * otherwise we just shortcircuit this and continue with
                 * the new socket..
                 */
-               if(nsk != sk) {
+               if(nsk != sk) {
                        if (tcp_child_process(sk, nsk, skb))
                                goto reset;
                        if (opt_skb)
@@ -1681,7 +1681,7 @@ ipv6_pktoptions:
 static int tcp_v6_rcv(struct sk_buff **pskb)
 {
        struct sk_buff *skb = *pskb;
-       struct tcphdr *th;      
+       struct tcphdr *th;
        struct sock *sk;
        int ret;
 
@@ -1739,10 +1739,10 @@ process:
        ret = 0;
        if (!sock_owned_by_user(sk)) {
 #ifdef CONFIG_NET_DMA
-                struct tcp_sock *tp = tcp_sk(sk);
-                if (tp->ucopy.dma_chan)
-                        ret = tcp_v6_do_rcv(sk, skb);
-                else
+               struct tcp_sock *tp = tcp_sk(sk);
+               if (tp->ucopy.dma_chan)
+                       ret = tcp_v6_do_rcv(sk, skb);
+               else
 #endif
                {
                        if (!tcp_prequeue(sk, skb))
@@ -1945,7 +1945,7 @@ static int tcp_v6_destroy_sock(struct sock *sk)
 }
 
 /* Proc filesystem TCPv6 sock list dumping. */
-static void get_openreq6(struct seq_file *seq, 
+static void get_openreq6(struct seq_file *seq,
                         struct sock *sk, struct request_sock *req, int i, int uid)
 {
        int ttd = req->expires - jiffies;
@@ -1967,11 +1967,11 @@ static void get_openreq6(struct seq_file *seq,
                   ntohs(inet_rsk(req)->rmt_port),
                   TCP_SYN_RECV,
                   0,0, /* could print option size, but that is af dependent. */
-                  1,   /* timers active (only the expire timer) */  
-                  jiffies_to_clock_t(ttd), 
+                  1,   /* timers active (only the expire timer) */
+                  jiffies_to_clock_t(ttd),
                   req->retrans,
                   uid,
-                  0,  /* non standard timer */  
+                  0,  /* non standard timer */
                   0, /* open_requests have no inode */
                   0, req);
 }
@@ -2014,7 +2014,7 @@ static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
                   src->s6_addr32[2], src->s6_addr32[3], srcp,
                   dest->s6_addr32[0], dest->s6_addr32[1],
                   dest->s6_addr32[2], dest->s6_addr32[3], destp,
-                  sp->sk_state, 
+                  sp->sk_state,
                   tp->write_seq-tp->snd_una,
                   (sp->sk_state == TCP_LISTEN) ? sp->sk_ack_backlog : (tp->rcv_nxt - tp->copied_seq),
                   timer_active,
@@ -2031,7 +2031,7 @@ static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
                   );
 }
 
-static void get_timewait6_sock(struct seq_file *seq, 
+static void get_timewait6_sock(struct seq_file *seq,
                               struct inet_timewait_sock *tw, int i)
 {
        struct in6_addr *dest, *src;
index 918d07dd12197f7da36820cd8010e0192a1cb4a4..23e2809878ae87a82e527415b399d80b493103d8 100644 (file)
 #include <net/xfrm.h>
 
 static struct xfrm6_tunnel *tunnel6_handlers;
+static struct xfrm6_tunnel *tunnel46_handlers;
 static DEFINE_MUTEX(tunnel6_mutex);
 
-int xfrm6_tunnel_register(struct xfrm6_tunnel *handler)
+int xfrm6_tunnel_register(struct xfrm6_tunnel *handler, unsigned short family)
 {
        struct xfrm6_tunnel **pprev;
        int ret = -EEXIST;
@@ -40,7 +41,8 @@ int xfrm6_tunnel_register(struct xfrm6_tunnel *handler)
 
        mutex_lock(&tunnel6_mutex);
 
-       for (pprev = &tunnel6_handlers; *pprev; pprev = &(*pprev)->next) {
+       for (pprev = (family == AF_INET6) ? &tunnel6_handlers : &tunnel46_handlers;
+            *pprev; pprev = &(*pprev)->next) {
                if ((*pprev)->priority > priority)
                        break;
                if ((*pprev)->priority == priority)
@@ -60,14 +62,15 @@ err:
 
 EXPORT_SYMBOL(xfrm6_tunnel_register);
 
-int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler)
+int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler, unsigned short family)
 {
        struct xfrm6_tunnel **pprev;
        int ret = -ENOENT;
 
        mutex_lock(&tunnel6_mutex);
 
-       for (pprev = &tunnel6_handlers; *pprev; pprev = &(*pprev)->next) {
+       for (pprev = (family == AF_INET6) ? &tunnel6_handlers : &tunnel46_handlers;
+            *pprev; pprev = &(*pprev)->next) {
                if (*pprev == handler) {
                        *pprev = handler->next;
                        ret = 0;
@@ -103,6 +106,25 @@ drop:
        return 0;
 }
 
+static int tunnel46_rcv(struct sk_buff **pskb)
+{
+       struct sk_buff *skb = *pskb;
+       struct xfrm6_tunnel *handler;
+
+       if (!pskb_may_pull(skb, sizeof(struct ipv6hdr)))
+               goto drop;
+
+       for (handler = tunnel46_handlers; handler; handler = handler->next)
+               if (!handler->handler(skb))
+                       return 0;
+
+       icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_PORT_UNREACH, 0, skb->dev);
+
+drop:
+       kfree_skb(skb);
+       return 0;
+}
+
 static void tunnel6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
                        int type, int code, int offset, __be32 info)
 {
@@ -119,17 +141,30 @@ static struct inet6_protocol tunnel6_protocol = {
        .flags          = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
 };
 
+static struct inet6_protocol tunnel46_protocol = {
+       .handler        = tunnel46_rcv,
+       .err_handler    = tunnel6_err,
+       .flags          = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL,
+};
+
 static int __init tunnel6_init(void)
 {
        if (inet6_add_protocol(&tunnel6_protocol, IPPROTO_IPV6)) {
                printk(KERN_ERR "tunnel6 init(): can't add protocol\n");
                return -EAGAIN;
        }
+       if (inet6_add_protocol(&tunnel46_protocol, IPPROTO_IPIP)) {
+               printk(KERN_ERR "tunnel6 init(): can't add protocol\n");
+               inet6_del_protocol(&tunnel6_protocol, IPPROTO_IPV6);
+               return -EAGAIN;
+       }
        return 0;
 }
 
 static void __exit tunnel6_fini(void)
 {
+       if (inet6_del_protocol(&tunnel46_protocol, IPPROTO_IPIP))
+               printk(KERN_ERR "tunnel6 close: can't remove protocol\n");
        if (inet6_del_protocol(&tunnel6_protocol, IPPROTO_IPV6))
                printk(KERN_ERR "tunnel6 close: can't remove protocol\n");
 }
index 15e5195549cb337728739605b842e23b2ae3160e..0ad471909881f31b35c94a69b78bb50f870b58e9 100644 (file)
@@ -1,9 +1,9 @@
 /*
  *     UDP over IPv6
- *     Linux INET6 implementation 
+ *     Linux INET6 implementation
  *
  *     Authors:
- *     Pedro Roque             <roque@di.fc.ul.pt>     
+ *     Pedro Roque             <roque@di.fc.ul.pt>
  *
  *     Based on linux/ipv4/udp.c
  *
@@ -27,7 +27,6 @@
 #include <linux/types.h>
 #include <linux/socket.h>
 #include <linux/sockios.h>
-#include <linux/sched.h>
 #include <linux/net.h>
 #include <linux/in6.h>
 #include <linux/netdevice.h>
@@ -67,11 +66,11 @@ static struct sock *__udp6_lib_lookup(struct in6_addr *saddr, __be16 sport,
        unsigned short hnum = ntohs(dport);
        int badness = -1;
 
-       read_lock(&udp_hash_lock);
+       read_lock(&udp_hash_lock);
        sk_for_each(sk, node, &udptable[hnum & (UDP_HTABLE_SIZE - 1)]) {
                struct inet_sock *inet = inet_sk(sk);
 
-               if (inet->num == hnum && sk->sk_family == PF_INET6) {
+               if (sk->sk_hash == hnum && sk->sk_family == PF_INET6) {
                        struct ipv6_pinfo *np = inet6_sk(sk);
                        int score = 0;
                        if (inet->dport) {
@@ -105,7 +104,7 @@ static struct sock *__udp6_lib_lookup(struct in6_addr *saddr, __be16 sport,
        }
        if (result)
                sock_hold(result);
-       read_unlock(&udp_hash_lock);
+       read_unlock(&udp_hash_lock);
        return result;
 }
 
@@ -120,13 +119,13 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk,
 {
        struct ipv6_pinfo *np = inet6_sk(sk);
        struct inet_sock *inet = inet_sk(sk);
-       struct sk_buff *skb;
+       struct sk_buff *skb;
        size_t copied;
        int err, copy_only, is_udplite = IS_UDPLITE(sk);
 
-       if (addr_len)
-               *addr_len=sizeof(struct sockaddr_in6);
-  
+       if (addr_len)
+               *addr_len=sizeof(struct sockaddr_in6);
+
        if (flags & MSG_ERRQUEUE)
                return ipv6_recv_error(sk, msg, len);
 
@@ -135,11 +134,11 @@ try_again:
        if (!skb)
                goto out;
 
-       copied = skb->len - sizeof(struct udphdr);
-       if (copied > len) {
-               copied = len;
-               msg->msg_flags |= MSG_TRUNC;
-       }
+       copied = skb->len - sizeof(struct udphdr);
+       if (copied > len) {
+               copied = len;
+               msg->msg_flags |= MSG_TRUNC;
+       }
 
        /*
         *      Decide whether to checksum and/or copy data.
@@ -168,7 +167,7 @@ try_again:
        /* Copy the address. */
        if (msg->msg_name) {
                struct sockaddr_in6 *sin6;
-         
+
                sin6 = (struct sockaddr_in6 *) msg->msg_name;
                sin6->sin6_family = AF_INET6;
                sin6->sin6_port = skb->h.uh->source;
@@ -191,7 +190,7 @@ try_again:
        } else {
                if (np->rxopt.all)
                        datagram_recv_ctl(sk, msg, skb);
-       }
+       }
 
        err = copied;
        if (flags & MSG_TRUNC)
@@ -309,7 +308,7 @@ static struct sock *udp_v6_mcast_next(struct sock *sk,
        sk_for_each_from(s, node) {
                struct inet_sock *inet = inet_sk(s);
 
-               if (inet->num == num && s->sk_family == PF_INET6) {
+               if (s->sk_hash == num && s->sk_family == PF_INET6) {
                        struct ipv6_pinfo *np = inet6_sk(s);
                        if (inet->dport) {
                                if (inet->dport != rmt_port)
@@ -339,7 +338,7 @@ static struct sock *udp_v6_mcast_next(struct sock *sk,
  * so we don't need to lock the hashes.
  */
 static int __udp6_lib_mcast_deliver(struct sk_buff *skb, struct in6_addr *saddr,
-                          struct in6_addr *daddr, struct hlist_head udptable[])
+                          struct in6_addr *daddr, struct hlist_head udptable[])
 {
        struct sock *sk, *sk2;
        const struct udphdr *uh = skb->h.uh;
@@ -379,7 +378,7 @@ static inline int udp6_csum_init(struct sk_buff *skb, struct udphdr *uh)
        }
        if (skb->ip_summed == CHECKSUM_COMPLETE &&
            !csum_ipv6_magic(&skb->nh.ipv6h->saddr, &skb->nh.ipv6h->daddr,
-                            skb->len, IPPROTO_UDP, skb->csum             ))
+                            skb->len, IPPROTO_UDP, skb->csum             ))
                skb->ip_summed = CHECKSUM_UNNECESSARY;
 
        if (skb->ip_summed != CHECKSUM_UNNECESSARY)
@@ -396,7 +395,7 @@ int __udp6_lib_rcv(struct sk_buff **pskb, struct hlist_head udptable[],
 {
        struct sk_buff *skb = *pskb;
        struct sock *sk;
-       struct udphdr *uh;
+       struct udphdr *uh;
        struct net_device *dev = skb->dev;
        struct in6_addr *saddr, *daddr;
        u32 ulen = 0;
@@ -437,15 +436,15 @@ int __udp6_lib_rcv(struct sk_buff **pskb, struct hlist_head udptable[],
                        goto discard;
        }
 
-       /* 
-        *      Multicast receive code 
+       /*
+        *      Multicast receive code
         */
        if (ipv6_addr_is_multicast(daddr))
                return __udp6_lib_mcast_deliver(skb, saddr, daddr, udptable);
 
        /* Unicast */
 
-       /* 
+       /*
         * check socket cache ... must talk to Alan about his plans
         * for sock caches... i'll skip this for now.
         */
@@ -465,21 +464,21 @@ int __udp6_lib_rcv(struct sk_buff **pskb, struct hlist_head udptable[],
                kfree_skb(skb);
                return(0);
        }
-       
+
        /* deliver */
-       
+
        udpv6_queue_rcv_skb(sk, skb);
        sock_put(sk);
        return(0);
 
-short_packet:  
+short_packet:
        LIMIT_NETDEBUG(KERN_DEBUG "UDP%sv6: short packet: %d/%u\n",
                       is_udplite? "-Lite" : "",  ulen, skb->len);
 
 discard:
        UDP6_INC_STATS_BH(UDP_MIB_INERRORS, is_udplite);
        kfree_skb(skb);
-       return(0);      
+       return(0);
 }
 
 static __inline__ int udpv6_rcv(struct sk_buff **pskb)
@@ -498,7 +497,7 @@ static void udp_v6_flush_pending_frames(struct sock *sk)
                up->len = 0;
                up->pending = 0;
                ip6_flush_pending_frames(sk);
-        }
+       }
 }
 
 /*
@@ -594,7 +593,7 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
                if (sk->sk_state != TCP_ESTABLISHED)
                        return -EDESTADDRREQ;
                daddr = &np->daddr;
-       } else 
+       } else
                daddr = NULL;
 
        if (daddr) {
@@ -620,7 +619,7 @@ do_udp_sendmsg:
           */
        if (len > INT_MAX - sizeof(struct udphdr))
                return -EMSGSIZE;
-       
+
        if (up->pending) {
                /*
                 * There are pending frames.
@@ -713,7 +712,7 @@ do_udp_sendmsg:
        if (ipv6_addr_any(&fl.fl6_src) && !ipv6_addr_any(&np->saddr))
                ipv6_addr_copy(&fl.fl6_src, &np->saddr);
        fl.fl_ip_sport = inet->sport;
-       
+
        /* merge ip6_build_xmit from ip6_output */
        if (opt && opt->srcrt) {
                struct rt0_hdr *rt0 = (struct rt0_hdr *) opt->srcrt;
@@ -911,7 +910,7 @@ static void udp6_sock_seq_show(struct seq_file *seq, struct sock *sp, int bucket
                   src->s6_addr32[2], src->s6_addr32[3], srcp,
                   dest->s6_addr32[0], dest->s6_addr32[1],
                   dest->s6_addr32[2], dest->s6_addr32[3], destp,
-                  sp->sk_state, 
+                  sp->sk_state,
                   atomic_read(&sp->sk_wmem_alloc),
                   atomic_read(&sp->sk_rmem_alloc),
                   0, 0L, 0,
index ec98788991280c586d813be9f839068f4290d598..6e252f318f7c91c81f5cdf04d2822b476f26a8ae 100644 (file)
@@ -11,9 +11,9 @@ extern void   __udp6_lib_err(struct sk_buff *, struct inet6_skb_parm *,
                               int , int , int , __be32 , struct hlist_head []);
 
 extern int     udpv6_getsockopt(struct sock *sk, int level, int optname,
-                                char __user *optval, int __user *optlen);
+                                char __user *optval, int __user *optlen);
 extern int     udpv6_setsockopt(struct sock *sk, int level, int optname,
-                                char __user *optval, int optlen);
+                                char __user *optval, int optlen);
 #ifdef CONFIG_COMPAT
 extern int     compat_udpv6_setsockopt(struct sock *sk, int level, int optname,
                                        char __user *optval, int optlen);
@@ -24,7 +24,7 @@ extern int    udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
                              struct msghdr *msg, size_t len);
 extern int     udpv6_recvmsg(struct kiocb *iocb, struct sock *sk,
                              struct msghdr *msg, size_t len,
-                             int noblock, int flags, int *addr_len);
+                             int noblock, int flags, int *addr_len);
 extern int     udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb);
 extern int     udpv6_destroy_sock(struct sock *sk);
 
index 5c8b7a5688003dcf7c21ca0923be689b42d7cd40..31f651f950967018be3c43d0b173dd80dc0449c0 100644 (file)
@@ -33,14 +33,15 @@ int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi)
        seq = 0;
        if (!spi && (err = xfrm_parse_spi(skb, nexthdr, &spi, &seq)) != 0)
                goto drop;
-       
+
        do {
                struct ipv6hdr *iph = skb->nh.ipv6h;
 
                if (xfrm_nr == XFRM_MAX_DEPTH)
                        goto drop;
 
-               x = xfrm_state_lookup((xfrm_address_t *)&iph->daddr, spi, nexthdr, AF_INET6);
+               x = xfrm_state_lookup((xfrm_address_t *)&iph->daddr, spi,
+                               nexthdr != IPPROTO_IPIP ? nexthdr : IPPROTO_IPV6, AF_INET6);
                if (x == NULL)
                        goto drop;
                spin_lock(&x->lock);
@@ -115,7 +116,7 @@ int xfrm6_rcv_spi(struct sk_buff *skb, __be32 spi)
                __skb_push(skb, skb->data - skb->nh.raw);
 
                NF_HOOK(PF_INET6, NF_IP6_PRE_ROUTING, skb, skb->dev, NULL,
-                       ip6_rcv_finish);
+                       ip6_rcv_finish);
                return -1;
 #else
                return 1;
@@ -142,12 +143,12 @@ int xfrm6_rcv(struct sk_buff **pskb)
 int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
                     xfrm_address_t *saddr, u8 proto)
 {
-       struct xfrm_state *x = NULL;
-       int wildcard = 0;
+       struct xfrm_state *x = NULL;
+       int wildcard = 0;
        struct in6_addr any;
        xfrm_address_t *xany;
        struct xfrm_state *xfrm_vec_one = NULL;
-       int nh = 0;
+       int nh = 0;
        int i = 0;
 
        ipv6_addr_set(&any, 0, 0, 0, 0);
@@ -168,12 +169,12 @@ int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
                        break;
                case 2:
                default:
-                       /* lookup state with wild-card addresses */
+                       /* lookup state with wild-card addresses */
                        wildcard = 1; /* XXX */
                        dst = xany;
                        src = xany;
                        break;
-               }
+               }
 
                x = xfrm_state_lookup_byaddr(dst, src, proto, AF_INET6);
                if (!x)
@@ -193,8 +194,8 @@ int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
                if (unlikely(x->km.state != XFRM_STATE_VALID)) {
                        spin_unlock(&x->lock);
                        xfrm_state_put(x);
-                       x = NULL;
-                       continue;
+                       x = NULL;
+                       continue;
                }
                if (xfrm_state_check_expire(x)) {
                        spin_unlock(&x->lock);
index c260ea104c524df24f2a49209b8fe57ba0409efd..d6d786b89d2bb5e9ec529fec0ac1888f5ea83e31 100644 (file)
@@ -2,7 +2,7 @@
  * xfrm6_output.c - Common IPsec encapsulation code for IPv6.
  * Copyright (C) 2002 USAGI/WIDE Project
  * Copyright (c) 2004 Herbert Xu <herbert@gondor.apana.org.au>
- * 
+ *
  * 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
@@ -46,7 +46,7 @@ static int xfrm6_output_one(struct sk_buff *skb)
        struct dst_entry *dst = skb->dst;
        struct xfrm_state *x = dst->xfrm;
        int err;
-       
+
        if (skb->ip_summed == CHECKSUM_PARTIAL) {
                err = skb_checksum_help(skb);
                if (err)
@@ -81,7 +81,7 @@ static int xfrm6_output_one(struct sk_buff *skb)
                spin_unlock_bh(&x->lock);
 
                skb->nh.raw = skb->data;
-               
+
                if (!(skb->dst = dst_pop(dst))) {
                        err = -EHOSTUNREACH;
                        goto error_nolock;
@@ -108,7 +108,7 @@ static int xfrm6_output_finish2(struct sk_buff *skb)
 
        while (likely((err = xfrm6_output_one(skb)) == 0)) {
                nf_reset(skb);
-       
+
                err = nf_hook(PF_INET6, NF_IP6_LOCAL_OUT, &skb, NULL,
                              skb->dst->dev, dst_output);
                if (unlikely(err != 1))
index 59480e92177daf1e835e545714faad276228dad2..b1133f27c8aed0ce5578d0417c0c704bc1650c9b 100644 (file)
@@ -8,7 +8,7 @@
  *             IPv6 support
  *     YOSHIFUJI Hideaki
  *             Split up af-specific portion
- * 
+ *
  */
 
 #include <linux/compiler.h>
@@ -178,7 +178,8 @@ __xfrm6_bundle_create(struct xfrm_policy *policy, struct xfrm_state **xfrm, int
                __xfrm6_bundle_len_inc(&header_len, &nfheader_len, xfrm[i]);
                trailer_len += xfrm[i]->props.trailer_len;
 
-               if (xfrm[i]->props.mode == XFRM_MODE_TUNNEL) {
+               if (xfrm[i]->props.mode == XFRM_MODE_TUNNEL ||
+                   xfrm[i]->props.mode == XFRM_MODE_ROUTEOPTIMIZATION) {
                        unsigned short encap_family = xfrm[i]->props.family;
                        switch(encap_family) {
                        case AF_INET:
@@ -186,8 +187,9 @@ __xfrm6_bundle_create(struct xfrm_policy *policy, struct xfrm_state **xfrm, int
                                fl_tunnel.fl4_src = xfrm[i]->props.saddr.a4;
                                break;
                        case AF_INET6:
-                               ipv6_addr_copy(&fl_tunnel.fl6_dst, (struct in6_addr*)&xfrm[i]->id.daddr.a6);
-                               ipv6_addr_copy(&fl_tunnel.fl6_src, (struct in6_addr*)&xfrm[i]->props.saddr.a6);
+                               ipv6_addr_copy(&fl_tunnel.fl6_dst, __xfrm6_bundle_addr_remote(xfrm[i], &fl->fl6_dst));
+
+                               ipv6_addr_copy(&fl_tunnel.fl6_src, __xfrm6_bundle_addr_remote(xfrm[i], &fl->fl6_src));
                                break;
                        default:
                                BUG_ON(1);
@@ -247,9 +249,9 @@ __xfrm6_bundle_create(struct xfrm_policy *policy, struct xfrm_state **xfrm, int
                x->u.rt6.rt6i_metric   = rt0->rt6i_metric;
                x->u.rt6.rt6i_node     = rt0->rt6i_node;
                x->u.rt6.rt6i_gateway  = rt0->rt6i_gateway;
-               memcpy(&x->u.rt6.rt6i_gateway, &rt0->rt6i_gateway, sizeof(x->u.rt6.rt6i_gateway)); 
+               memcpy(&x->u.rt6.rt6i_gateway, &rt0->rt6i_gateway, sizeof(x->u.rt6.rt6i_gateway));
                x->u.rt6.rt6i_dst      = rt0->rt6i_dst;
-               x->u.rt6.rt6i_src      = rt0->rt6i_src; 
+               x->u.rt6.rt6i_src      = rt0->rt6i_src;
                x->u.rt6.rt6i_idev     = rt0->rt6i_idev;
                in6_dev_hold(rt0->rt6i_idev);
                __xfrm6_bundle_len_dec(&header_len, &nfheader_len, x->u.dst.xfrm);
index 60ad5f074e0a106f5ea2071337509f908eaf58a1..baa461b9f74eebf97c654aa858203dcf010aa7e8 100644 (file)
@@ -8,7 +8,7 @@
  *             IPv6 support
  *     YOSHIFUJI Hideaki @USAGI
  *             Split up af-specific portion
- *     
+ *
  */
 
 #include <net/xfrm.h>
index 12e426b9aacd19d2b03e3d35bfc230dcd3c42897..ee4b84a33ff41a63a22fd7cb628e5e2e382e737c 100644 (file)
@@ -5,12 +5,12 @@
  * 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
@@ -32,7 +32,7 @@
 #include <linux/mutex.h>
 
 /*
- * xfrm_tunnel_spi things are for allocating unique id ("spi") 
+ * xfrm_tunnel_spi things are for allocating unique id ("spi")
  * per xfrm_address_t.
  */
 struct xfrm6_tunnel_spi {
@@ -155,8 +155,8 @@ static u32 __xfrm6_tunnel_alloc_spi(xfrm_address_t *saddr)
 
        for (spi = xfrm6_tunnel_spi; spi <= XFRM6_TUNNEL_SPI_MAX; spi++) {
                index = xfrm6_tunnel_spi_hash_byspi(spi);
-               hlist_for_each_entry(x6spi, pos, 
-                                    &xfrm6_tunnel_spi_byspi[index], 
+               hlist_for_each_entry(x6spi, pos,
+                                    &xfrm6_tunnel_spi_byspi[index],
                                     list_byspi) {
                        if (x6spi->spi == spi)
                                goto try_next_1;
@@ -167,8 +167,8 @@ try_next_1:;
        }
        for (spi = XFRM6_TUNNEL_SPI_MIN; spi < xfrm6_tunnel_spi; spi++) {
                index = xfrm6_tunnel_spi_hash_byspi(spi);
-               hlist_for_each_entry(x6spi, pos, 
-                                    &xfrm6_tunnel_spi_byspi[index], 
+               hlist_for_each_entry(x6spi, pos,
+                                    &xfrm6_tunnel_spi_byspi[index],
                                     list_byspi) {
                        if (x6spi->spi == spi)
                                goto try_next_2;
@@ -222,7 +222,7 @@ void xfrm6_tunnel_free_spi(xfrm_address_t *saddr)
 
        write_lock_bh(&xfrm6_tunnel_spi_lock);
 
-       hlist_for_each_entry_safe(x6spi, pos, n, 
+       hlist_for_each_entry_safe(x6spi, pos, n,
                                  &xfrm6_tunnel_spi_byaddr[xfrm6_tunnel_spi_hash_byaddr(saddr)],
                                  list_byaddr)
        {
@@ -269,9 +269,9 @@ static int xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
 {
        /* xfrm6_tunnel native err handling */
        switch (type) {
-       case ICMPV6_DEST_UNREACH: 
+       case ICMPV6_DEST_UNREACH:
                switch (code) {
-               case ICMPV6_NOROUTE: 
+               case ICMPV6_NOROUTE:
                case ICMPV6_ADM_PROHIBITED:
                case ICMPV6_NOT_NEIGHBOUR:
                case ICMPV6_ADDR_UNREACH:
@@ -287,7 +287,7 @@ static int xfrm6_tunnel_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
                case ICMPV6_EXC_HOPLIMIT:
                        break;
                case ICMPV6_EXC_FRAGTIME:
-               default: 
+               default:
                        break;
                }
                break;
@@ -339,17 +339,29 @@ static struct xfrm6_tunnel xfrm6_tunnel_handler = {
        .priority       = 2,
 };
 
+static struct xfrm6_tunnel xfrm46_tunnel_handler = {
+       .handler        = xfrm6_tunnel_rcv,
+       .err_handler    = xfrm6_tunnel_err,
+       .priority       = 2,
+};
+
 static int __init xfrm6_tunnel_init(void)
 {
        if (xfrm_register_type(&xfrm6_tunnel_type, AF_INET6) < 0)
                return -EAGAIN;
 
-       if (xfrm6_tunnel_register(&xfrm6_tunnel_handler)) {
+       if (xfrm6_tunnel_register(&xfrm6_tunnel_handler, AF_INET6)) {
+               xfrm_unregister_type(&xfrm6_tunnel_type, AF_INET6);
+               return -EAGAIN;
+       }
+       if (xfrm6_tunnel_register(&xfrm46_tunnel_handler, AF_INET)) {
+               xfrm6_tunnel_deregister(&xfrm6_tunnel_handler, AF_INET6);
                xfrm_unregister_type(&xfrm6_tunnel_type, AF_INET6);
                return -EAGAIN;
        }
        if (xfrm6_tunnel_spi_init() < 0) {
-               xfrm6_tunnel_deregister(&xfrm6_tunnel_handler);
+               xfrm6_tunnel_deregister(&xfrm46_tunnel_handler, AF_INET);
+               xfrm6_tunnel_deregister(&xfrm6_tunnel_handler, AF_INET6);
                xfrm_unregister_type(&xfrm6_tunnel_type, AF_INET6);
                return -EAGAIN;
        }
@@ -359,7 +371,8 @@ static int __init xfrm6_tunnel_init(void)
 static void __exit xfrm6_tunnel_fini(void)
 {
        xfrm6_tunnel_spi_fini();
-       xfrm6_tunnel_deregister(&xfrm6_tunnel_handler);
+       xfrm6_tunnel_deregister(&xfrm46_tunnel_handler, AF_INET);
+       xfrm6_tunnel_deregister(&xfrm6_tunnel_handler, AF_INET6);
        xfrm_unregister_type(&xfrm6_tunnel_type, AF_INET6);
 }
 
index 89f283c51dff7314e2ff6f97ba565618617d7df3..cac35a77f069da4594b1585b4f8fc50cd2f8f54c 100644 (file)
@@ -11,7 +11,7 @@
  *     work I am currently employed to do there.
  *
  *     All the material in this file is subject to the Gnu license version 2.
- *     Neither Alan Cox nor the Swansea University Computer Society admit 
+ *     Neither Alan Cox nor the Swansea University Computer Society admit
  *     liability nor provide warranty for any of this software. This material
  *     is provided as is and at no charge.
  *
@@ -152,8 +152,8 @@ static void ipx_destroy_socket(struct sock *sk)
        ipx_remove_socket(sk);
        skb_queue_purge(&sk->sk_receive_queue);
 #ifdef IPX_REFCNT_DEBUG
-        atomic_dec(&ipx_sock_nr);
-        printk(KERN_DEBUG "IPX socket %p released, %d are still alive\n", sk,
+       atomic_dec(&ipx_sock_nr);
+       printk(KERN_DEBUG "IPX socket %p released, %d are still alive\n", sk,
                        atomic_read(&ipx_sock_nr));
        if (atomic_read(&sk->sk_refcnt) != 1)
                printk(KERN_DEBUG "Destruction sock ipx %p delayed, cnt=%d\n",
@@ -162,7 +162,7 @@ static void ipx_destroy_socket(struct sock *sk)
        sock_put(sk);
 }
 
-/* 
+/*
  * The following code is used to support IPX Interfaces (IPXITF).  An
  * IPX interface is defined by a physical device and a frame type.
  */
@@ -369,7 +369,7 @@ static __exit void ipxitf_cleanup(void)
        struct ipx_interface *i, *tmp;
 
        spin_lock_bh(&ipx_interfaces_lock);
-       list_for_each_entry_safe(i, tmp, &ipx_interfaces, node) 
+       list_for_each_entry_safe(i, tmp, &ipx_interfaces, node)
                __ipxitf_put(i);
        spin_unlock_bh(&ipx_interfaces_lock);
 }
@@ -446,10 +446,10 @@ static struct sock *ncp_connection_hack(struct ipx_interface *intrfc,
         * You might call this a hack, but believe me, you do not want a
         * complete NCP layer in the kernel, and this is VERY fast as well. */
        struct sock *sk = NULL;
-       int connection = 0;
+       int connection = 0;
        u8 *ncphdr = (u8 *)(ipx + 1);
 
-       if (*ncphdr == 0x22 && *(ncphdr + 1) == 0x22) /* NCP request */
+       if (*ncphdr == 0x22 && *(ncphdr + 1) == 0x22) /* NCP request */
                connection = (((int) *(ncphdr + 5)) << 8) | (int) *(ncphdr + 3);
        else if (*ncphdr == 0x77 && *(ncphdr + 1) == 0x77) /* BURST packet */
                connection = (((int) *(ncphdr + 9)) << 8) | (int) *(ncphdr + 8);
@@ -482,7 +482,7 @@ static int ipxitf_demux_socket(struct ipx_interface *intrfc,
 
        if (intrfc == ipx_primary_net && ntohs(ipx->ipx_dest.sock) == 0x451)
                sock1 = ncp_connection_hack(intrfc, ipx);
-        if (!sock1)
+       if (!sock1)
                /* No special socket found, forward the packet the normal way */
                sock1 = ipxitf_find_socket(intrfc, ipx->ipx_dest.sock);
 
@@ -607,22 +607,22 @@ int ipxitf_send(struct ipx_interface *intrfc, struct sk_buff *skb, char *node)
                *last_hop = IPX_SKB_CB(skb)->last_hop.netnum;
                IPX_SKB_CB(skb)->last_hop.index = -1;
        }
-       
-       /* 
+
+       /*
         * We need to know how many skbuffs it will take to send out this
         * packet to avoid unnecessary copies.
         */
-        
-       if (!dl || !dev || dev->flags & IFF_LOOPBACK) 
+
+       if (!dl || !dev || dev->flags & IFF_LOOPBACK)
                send_to_wire = 0;       /* No non looped */
 
        /*
-        * See if this should be demuxed to sockets on this interface 
+        * See if this should be demuxed to sockets on this interface
         *
         * We want to ensure the original was eaten or that we only use
         * up clones.
         */
-        
+
        if (ipx->ipx_dest.net == intrfc->if_netnum) {
                /*
                 * To our own node, loop and free the original.
@@ -709,8 +709,8 @@ static int ipxitf_rcv(struct ipx_interface *intrfc, struct sk_buff *skb)
 
        /* See if we should update our network number */
        if (!intrfc->if_netnum) /* net number of intrfc not known yet */
-               ipxitf_discover_netnum(intrfc, skb);
-       
+               ipxitf_discover_netnum(intrfc, skb);
+
        IPX_SKB_CB(skb)->last_hop.index = -1;
        if (ipx->ipx_type == IPX_TYPE_PPROP) {
                rc = ipxitf_pprop(intrfc, skb);
@@ -756,7 +756,7 @@ out_intrfc:
 
 static void ipxitf_discover_netnum(struct ipx_interface *intrfc,
                                   struct sk_buff *skb)
-{ 
+{
        const struct ipx_cb *cb = IPX_SKB_CB(skb);
 
        /* see if this is an intra packet: source_net == dest_net */
@@ -793,7 +793,7 @@ static void ipxitf_discover_netnum(struct ipx_interface *intrfc,
  * it, not even processing it locally, if it has exact %IPX_MAX_PPROP_HOPS we
  * don't broadcast it, but process it locally. See chapter 5 of Novell's "IPX
  * RIP and SAP Router Specification", Part Number 107-000029-001.
- * 
+ *
  * If it is valid, check if we have pprop broadcasting enabled by the user,
  * if not, just return zero for local processing.
  *
@@ -820,7 +820,7 @@ static int ipxitf_pprop(struct ipx_interface *intrfc, struct sk_buff *skb)
         * tctrl <= 15, any data payload... */
        if (IPX_SKB_CB(skb)->ipx_tctrl > IPX_MAX_PPROP_HOPS ||
            ntohs(ipx->ipx_pktsize) < sizeof(struct ipxhdr) +
-                                       IPX_MAX_PPROP_HOPS * sizeof(u32))
+                                       IPX_MAX_PPROP_HOPS * sizeof(u32))
                goto out;
        /* are we broadcasting this damn thing? */
        rc = 0;
@@ -831,7 +831,7 @@ static int ipxitf_pprop(struct ipx_interface *intrfc, struct sk_buff *skb)
         * locally. */
        if (IPX_SKB_CB(skb)->ipx_tctrl == IPX_MAX_PPROP_HOPS)
                goto out;
-       
+
        c = ((u8 *) ipx) + sizeof(struct ipxhdr);
        l = (__be32 *) c;
 
@@ -851,7 +851,7 @@ static int ipxitf_pprop(struct ipx_interface *intrfc, struct sk_buff *skb)
                /* Except unconfigured interfaces */
                if (!ifcs->if_netnum)
                        continue;
-                                       
+
                /* That aren't in the list */
                if (ifcs == intrfc)
                        continue;
@@ -1003,7 +1003,7 @@ static int ipxitf_create(struct ipx_interface_definition *idef)
                        dlink_type      = htons(ETH_P_IPX);
                        datalink        = pEII_datalink;
                        break;
-               } else 
+               } else
                        printk(KERN_WARNING "IPX frame type EtherII over "
                                        "token-ring is obsolete. Use SNAP "
                                        "instead.\n");
@@ -1208,14 +1208,14 @@ static int ipxitf_ioctl(unsigned int cmd, void __user *arg)
                rc = 0;
                break;
        }
-       case SIOCAIPXITFCRT: 
+       case SIOCAIPXITFCRT:
                rc = -EFAULT;
                if (get_user(val, (unsigned char __user *) arg))
                        break;
                rc = 0;
                ipxcfg_auto_create_interfaces = val;
                break;
-       case SIOCAIPXPRISLT: 
+       case SIOCAIPXPRISLT:
                rc = -EFAULT;
                if (get_user(val, (unsigned char __user *) arg))
                        break;
@@ -1230,14 +1230,14 @@ static int ipxitf_ioctl(unsigned int cmd, void __user *arg)
 /*
  *     Checksum routine for IPX
  */
+
 /* Note: We assume ipx_tctrl==0 and htons(length)==ipx_pktsize */
 /* This functions should *not* mess with packet contents */
 
 __be16 ipx_cksum(struct ipxhdr *packet, int length)
 {
-       /* 
-        *      NOTE: sum is a net byte order quantity, which optimizes the 
+       /*
+        *      NOTE: sum is a net byte order quantity, which optimizes the
         *      loop. This only works on big and little endian machines. (I
         *      don't know of a machine that isn't.)
         */
@@ -1342,7 +1342,7 @@ static int ipx_getsockopt(struct socket *sock, int level, int optname,
        rc = -EINVAL;
        if(len < 0)
                goto out;
-               
+
        rc = -EFAULT;
        if (put_user(len, optlen) || copy_to_user(optval, &val, len))
                goto out;
@@ -1372,13 +1372,13 @@ static int ipx_create(struct socket *sock, int protocol)
        if (sock->type != SOCK_DGRAM)
                goto out;
 
-               rc = -ENOMEM;
+       rc = -ENOMEM;
        sk = sk_alloc(PF_IPX, GFP_KERNEL, &ipx_proto, 1);
        if (!sk)
                goto out;
 #ifdef IPX_REFCNT_DEBUG
-        atomic_inc(&ipx_sock_nr);
-        printk(KERN_DEBUG "IPX socket %p created, now we have %d alive\n", sk,
+       atomic_inc(&ipx_sock_nr);
+       printk(KERN_DEBUG "IPX socket %p created, now we have %d alive\n", sk,
                        atomic_read(&ipx_sock_nr));
 #endif
        sock_init_data(sock, sk);
@@ -1561,7 +1561,7 @@ static int ipx_connect(struct socket *sock, struct sockaddr *uaddr,
                        goto out;
        }
 
-        /* We can either connect to primary network or somewhere
+       /* We can either connect to primary network or somewhere
         * we can route to */
        rt = ipxrtr_lookup(addr->sipx_network);
        rc = -ENETUNREACH;
@@ -1641,10 +1641,10 @@ static int ipx_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_ty
        struct ipxhdr *ipx;
        u16 ipx_pktsize;
        int rc = 0;
-               
-       /* Not ours */  
-        if (skb->pkt_type == PACKET_OTHERHOST)
-               goto drop;
+
+       /* Not ours */
+       if (skb->pkt_type == PACKET_OTHERHOST)
+               goto drop;
 
        if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL)
                goto out;
@@ -1653,12 +1653,12 @@ static int ipx_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_ty
                goto drop;
 
        ipx_pktsize = ntohs(ipx_hdr(skb)->ipx_pktsize);
-       
+
        /* Too small or invalid header? */
        if (ipx_pktsize < sizeof(struct ipxhdr) ||
            !pskb_may_pull(skb, ipx_pktsize))
                goto drop;
-                        
+
        ipx = ipx_hdr(skb);
        if (ipx->ipx_checksum != IPX_NO_CHECKSUM &&
           ipx->ipx_checksum != ipx_cksum(ipx, ipx_pktsize))
@@ -1786,7 +1786,7 @@ static int ipx_recvmsg(struct kiocb *iocb, struct socket *sock,
                if (rc)
                        goto out;
        }
-       
+
        rc = -ENOTCONN;
        if (sock_flag(sk, SOCK_ZAPPED))
                goto out;
@@ -1875,15 +1875,15 @@ static int ipx_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                 * This socket wants to take care of the NCP connection
                 * handed to us in arg.
                 */
-               rc = -EPERM;
-               if (!capable(CAP_NET_ADMIN))
+               rc = -EPERM;
+               if (!capable(CAP_NET_ADMIN))
                        break;
                rc = get_user(ipx_sk(sk)->ipx_ncp_conn,
                              (const unsigned short __user *)argp);
                break;
        case SIOCGSTAMP:
                rc = -EINVAL;
-               if (sk) 
+               if (sk)
                        rc = sock_get_timestamp(sk, argp);
                break;
        case SIOCGIFDSTADDR:
index b7463dfca63e154fb90fd674980d1b4adae81914..db32ac8e79bd6ed5b9e7b7b84f6aa67bfafcfead 100644 (file)
@@ -322,7 +322,7 @@ static int ipx_seq_socket_open(struct inode *inode, struct file *file)
        return seq_open(file, &ipx_seq_socket_ops);
 }
 
-static struct file_operations ipx_seq_interface_fops = {
+static const struct file_operations ipx_seq_interface_fops = {
        .owner          = THIS_MODULE,
        .open           = ipx_seq_interface_open,
        .read           = seq_read,
@@ -330,7 +330,7 @@ static struct file_operations ipx_seq_interface_fops = {
        .release        = seq_release,
 };
 
-static struct file_operations ipx_seq_route_fops = {
+static const struct file_operations ipx_seq_route_fops = {
        .owner          = THIS_MODULE,
        .open           = ipx_seq_route_open,
        .read           = seq_read,
@@ -338,7 +338,7 @@ static struct file_operations ipx_seq_route_fops = {
        .release        = seq_release,
 };
 
-static struct file_operations ipx_seq_socket_fops = {
+static const struct file_operations ipx_seq_socket_fops = {
        .owner          = THIS_MODULE,
        .open           = ipx_seq_socket_open,
        .read           = seq_read,
@@ -352,7 +352,7 @@ int __init ipx_proc_init(void)
 {
        struct proc_dir_entry *p;
        int rc = -ENOMEM;
-       
+
        ipx_proc_dir = proc_mkdir("ipx", proc_net);
 
        if (!ipx_proc_dir)
index 68560ee0d797481e8def03a906a166bb6c77d7f4..8e1cad971f11bd473da17883ff41c1cda6f68550 100644 (file)
@@ -234,7 +234,7 @@ int ipxrtr_route_packet(struct sock *sk, struct sockaddr_ipx *usipx,
        if (rc) {
                kfree_skb(skb);
                goto out_put;
-       }       
+       }
 
        /* Apply checksum. Not allowed on 802.3 links. */
        if (sk->sk_no_check || intrfc->if_dlink_type == htons(IPX_FRAME_8023))
@@ -242,7 +242,7 @@ int ipxrtr_route_packet(struct sock *sk, struct sockaddr_ipx *usipx,
        else
                ipx->ipx_checksum = ipx_cksum(ipx, len + sizeof(struct ipxhdr));
 
-       rc = ipxitf_send(intrfc, skb, (rt && rt->ir_routed) ? 
+       rc = ipxitf_send(intrfc, skb, (rt && rt->ir_routed) ?
                         rt->ir_router_node : ipx->ipx_dest.node);
 out_put:
        ipxitf_put(intrfc);
index fa574735c76fa11ce74d4e475316183e03fba1db..0cf52645053648c7444a86544537a2b54a0243a1 100644 (file)
@@ -34,7 +34,7 @@ static struct ctl_table ipx_dir_table[] = {
                .procname       = "ipx",
                .mode           = 0555,
                .child          = ipx_table,
-               },
+       },
        { 0 },
 };
 
@@ -52,7 +52,7 @@ static struct ctl_table_header *ipx_table_header;
 
 void ipx_register_sysctl(void)
 {
-       ipx_table_header = register_sysctl_table(ipx_root_table, 1);
+       ipx_table_header = register_sysctl_table(ipx_root_table);
 }
 
 void ipx_unregister_sysctl(void)
index 7e1aea89ef05b60709fcb37e1f5ec531303f0359..eabd6838f50a2e811888d22499e31ab90ae55af8 100644 (file)
@@ -138,7 +138,7 @@ static void irda_disconnect_indication(void *instance, void *sap,
                sk->sk_shutdown |= SEND_SHUTDOWN;
 
                sk->sk_state_change(sk);
-                sock_orphan(sk);
+               sock_orphan(sk);
                release_sock(sk);
 
                /* Close our TSAP.
@@ -158,7 +158,7 @@ static void irda_disconnect_indication(void *instance, void *sap,
                        irttp_close_tsap(self->tsap);
                        self->tsap = NULL;
                }
-        }
+       }
 
        /* Note : once we are there, there is not much you want to do
         * with the socket anymore, apart from closing it.
@@ -1211,7 +1211,7 @@ static int irda_release(struct socket *sock)
 
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
 
-        if (sk == NULL)
+       if (sk == NULL)
                return 0;
 
        lock_sock(sk);
@@ -1259,7 +1259,7 @@ static int irda_release(struct socket *sock)
         * memory leak is now gone... - Jean II
         */
 
-        return 0;
+       return 0;
 }
 
 /*
@@ -1312,7 +1312,7 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock,
                len = self->max_data_size;
        }
 
-       skb = sock_alloc_send_skb(sk, len + self->max_header_size + 16, 
+       skb = sock_alloc_send_skb(sk, len + self->max_header_size + 16,
                                  msg->msg_flags & MSG_DONTWAIT, &err);
        if (!skb)
                return -ENOBUFS;
@@ -1714,7 +1714,7 @@ static int irda_shutdown(struct socket *sock, int how)
        self->daddr = DEV_ADDR_ANY;     /* Until we get re-connected */
        self->saddr = 0x0;              /* so IrLMP assign us any link */
 
-        return 0;
+       return 0;
 }
 
 /*
index 89fd2a2cbca66a170c471672cfcbcd8c56745fd6..f097341286740182d5726ebb2bb5e0c43fcf8e2a 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      discovery.c
  * Version:       0.1
  * Description:   Routines for handling discoveries at the IrLMP layer
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * Modified at:   Fri May 28  3:11 CST 1999
  * Modified by:   Horst von Brand <vonbrand@sleipnir.valparaiso.cl>
- * 
+ *
  *     Copyright (c) 1999 Dag Brattli, 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 
+ *
+ *     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, 
+ *
+ *     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
- *     
+ *
  ********************************************************************/
 
 #include <linux/string.h>
@@ -65,9 +65,9 @@ void irlmp_add_discovery(hashbin_t *cachelog, discovery_t *new)
 
        spin_lock_irqsave(&cachelog->hb_spinlock, flags);
 
-       /* 
-        * Remove all discoveries of devices that has previously been 
-        * discovered on the same link with the same name (info), or the 
+       /*
+        * Remove all discoveries of devices that has previously been
+        * discovered on the same link with the same name (info), or the
         * same daddr. We do this since some devices (mostly PDAs) change
         * their device address between every discovery.
         */
@@ -79,10 +79,10 @@ void irlmp_add_discovery(hashbin_t *cachelog, discovery_t *new)
                discovery = (discovery_t *) hashbin_get_next(cachelog);
 
                if ((node->data.saddr == new->data.saddr) &&
-                   ((node->data.daddr == new->data.daddr) || 
+                   ((node->data.daddr == new->data.daddr) ||
                     (strcmp(node->data.info, new->data.info) == 0)))
                {
-                       /* This discovery is a previous discovery 
+                       /* This discovery is a previous discovery
                         * from the same device, so just remove it
                         */
                        hashbin_remove_this(cachelog, (irda_queue_t *) node);
@@ -134,7 +134,7 @@ void irlmp_add_discovery_log(hashbin_t *cachelog, hashbin_t *log)
 
                discovery = (discovery_t *) hashbin_remove_first(log);
        }
-       
+
        /* Delete the now empty log */
        hashbin_delete(log, (FREE_FUNC) kfree);
 }
@@ -232,7 +232,7 @@ void irlmp_dump_discoveries(hashbin_t *log)
        while (discovery != NULL) {
                IRDA_DEBUG(0, "Discovery:\n");
                IRDA_DEBUG(0, "  daddr=%08x\n", discovery->data.daddr);
-               IRDA_DEBUG(0, "  saddr=%08x\n", discovery->data.saddr); 
+               IRDA_DEBUG(0, "  saddr=%08x\n", discovery->data.saddr);
                IRDA_DEBUG(0, "  nickname=%s\n", discovery->data.info);
 
                discovery = (discovery_t *) hashbin_get_next(log);
@@ -321,26 +321,26 @@ static inline discovery_t *discovery_seq_idx(loff_t pos)
 {
        discovery_t *discovery;
 
-       for (discovery = (discovery_t *) hashbin_get_first(irlmp->cachelog); 
+       for (discovery = (discovery_t *) hashbin_get_first(irlmp->cachelog);
             discovery != NULL;
             discovery = (discovery_t *) hashbin_get_next(irlmp->cachelog)) {
                if (pos-- == 0)
                        break;
        }
-               
+
        return discovery;
 }
 
 static void *discovery_seq_start(struct seq_file *seq, loff_t *pos)
 {
        spin_lock_irq(&irlmp->cachelog->hb_spinlock);
-        return *pos ? discovery_seq_idx(*pos - 1) : SEQ_START_TOKEN;
+       return *pos ? discovery_seq_idx(*pos - 1) : SEQ_START_TOKEN;
 }
 
 static void *discovery_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        ++*pos;
-       return (v == SEQ_START_TOKEN) 
+       return (v == SEQ_START_TOKEN)
                ? (void *) hashbin_get_first(irlmp->cachelog)
                : (void *) hashbin_get_next(irlmp->cachelog);
 }
@@ -357,9 +357,9 @@ static int discovery_seq_show(struct seq_file *seq, void *v)
        else {
                const discovery_t *discovery = v;
 
-               seq_printf(seq, "nickname: %s, hint: 0x%02x%02x", 
+               seq_printf(seq, "nickname: %s, hint: 0x%02x%02x",
                           discovery->data.info,
-                          discovery->data.hints[0], 
+                          discovery->data.hints[0],
                           discovery->data.hints[1]);
 #if 0
                if ( discovery->data.hints[0] & HINT_PNP)
@@ -376,20 +376,20 @@ static int discovery_seq_show(struct seq_file *seq, void *v)
                        seq_puts(seq, "Fax ");
                if ( discovery->data.hints[0] & HINT_LAN)
                        seq_puts(seq, "LAN Access ");
-               
+
                if ( discovery->data.hints[1] & HINT_TELEPHONY)
                        seq_puts(seq, "Telephony ");
                if ( discovery->data.hints[1] & HINT_FILE_SERVER)
-                       seq_puts(seq, "File Server ");       
+                       seq_puts(seq, "File Server ");
                if ( discovery->data.hints[1] & HINT_COMM)
                        seq_puts(seq, "IrCOMM ");
                if ( discovery->data.hints[1] & HINT_OBEX)
                        seq_puts(seq, "IrOBEX ");
-#endif         
+#endif
                seq_printf(seq,", saddr: 0x%08x, daddr: 0x%08x\n\n",
                               discovery->data.saddr,
                               discovery->data.daddr);
-               
+
                seq_putc(seq, '\n');
        }
        return 0;
@@ -409,7 +409,7 @@ static int discovery_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &discovery_seq_ops);
 }
 
-struct file_operations discovery_seq_fops = {
+const struct file_operations discovery_seq_fops = {
        .owner          = THIS_MODULE,
        .open           = discovery_seq_open,
        .read           = seq_read,
index ad6b6af3dd976c97bd75818f55e4361421923529..4749f8f55391a32d8e5c46abb6a900f1db799636 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      ircomm_core.c
  * Version:       1.0
  * Description:   IrCOMM service interface
@@ -8,29 +8,28 @@
  * Created at:    Sun Jun  6 20:37:34 1999
  * Modified at:   Tue Dec 21 13:26:41 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
+ *
  *     Copyright (c) 1999 Dag Brattli, All Rights Reserved.
  *     Copyright (c) 2000-2003 Jean Tourrilhes <jt@hpl.hp.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 
+ *
+ *     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, 
+ *
+ *     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
- *     
+ *
  ********************************************************************/
 
 #include <linux/module.h>
-#include <linux/sched.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
 #include <linux/init.h>
 #include <net/irda/ircomm_core.h>
 
 static int __ircomm_close(struct ircomm_cb *self);
-static void ircomm_control_indication(struct ircomm_cb *self, 
+static void ircomm_control_indication(struct ircomm_cb *self,
                                      struct sk_buff *skb, int clen);
 
 #ifdef CONFIG_PROC_FS
 extern struct proc_dir_entry *proc_irda;
 static int ircomm_seq_open(struct inode *, struct file *);
 
-static struct file_operations ircomm_proc_fops = {
+static const struct file_operations ircomm_proc_fops = {
        .owner          = THIS_MODULE,
        .open           = ircomm_seq_open,
        .read           = seq_read,
@@ -69,22 +68,22 @@ hashbin_t *ircomm = NULL;
 
 static int __init ircomm_init(void)
 {
-       ircomm = hashbin_new(HB_LOCK); 
+       ircomm = hashbin_new(HB_LOCK);
        if (ircomm == NULL) {
                IRDA_ERROR("%s(), can't allocate hashbin!\n", __FUNCTION__);
                return -ENOMEM;
        }
-       
+
 #ifdef CONFIG_PROC_FS
        { struct proc_dir_entry *ent;
        ent = create_proc_entry("ircomm", 0, proc_irda);
-       if (ent) 
+       if (ent)
                ent->proc_fops = &ircomm_proc_fops;
        }
 #endif /* CONFIG_PROC_FS */
-       
+
        IRDA_MESSAGE("IrCOMM protocol (Dag Brattli)\n");
-               
+
        return 0;
 }
 
@@ -139,7 +138,7 @@ struct ircomm_cb *ircomm_open(notify_t *notify, __u8 service_type, int line)
 
        hashbin_insert(ircomm, (irda_queue_t *) self, line, NULL);
 
-       ircomm_next_state(self, IRCOMM_IDLE);   
+       ircomm_next_state(self, IRCOMM_IDLE);
 
        return self;
 }
@@ -195,8 +194,8 @@ int ircomm_close(struct ircomm_cb *self)
        entry = hashbin_remove(ircomm, self->line, NULL);
 
        IRDA_ASSERT(entry == self, return -1;);
-       
-        return __ircomm_close(self);
+
+       return __ircomm_close(self);
 }
 
 EXPORT_SYMBOL(ircomm_close);
@@ -206,9 +205,9 @@ EXPORT_SYMBOL(ircomm_close);
  *
  *    Impl. of this function is differ from one of the reference. This
  *    function does discovery as well as sending connect request
- * 
+ *
  */
-int ircomm_connect_request(struct ircomm_cb *self, __u8 dlsap_sel, 
+int ircomm_connect_request(struct ircomm_cb *self, __u8 dlsap_sel,
                           __u32 saddr, __u32 daddr, struct sk_buff *skb,
                           __u8 service_type)
 {
@@ -243,20 +242,20 @@ void ircomm_connect_indication(struct ircomm_cb *self, struct sk_buff *skb,
                               struct ircomm_info *info)
 {
        int clen = 0;
-       
+
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
        /* Check if the packet contains data on the control channel */
        if (skb->len > 0)
                clen = skb->data[0];
-       
-       /* 
-        * If there are any data hiding in the control channel, we must 
-        * deliver it first. The side effect is that the control channel 
+
+       /*
+        * If there are any data hiding in the control channel, we must
+        * deliver it first. The side effect is that the control channel
         * will be removed from the skb
         */
        if (self->notify.connect_indication)
-               self->notify.connect_indication(self->notify.instance, self, 
+               self->notify.connect_indication(self->notify.instance, self,
                                                info->qos, info->max_data_size,
                                                info->max_header_size, skb);
        else {
@@ -282,7 +281,7 @@ int ircomm_connect_response(struct ircomm_cb *self, struct sk_buff *userdata)
        ret = ircomm_do_event(self, IRCOMM_CONNECT_RESPONSE, userdata, NULL);
 
        return ret;
-}      
+}
 
 EXPORT_SYMBOL(ircomm_connect_response);
 
@@ -299,7 +298,7 @@ void ircomm_connect_confirm(struct ircomm_cb *self, struct sk_buff *skb,
 
        if (self->notify.connect_confirm )
                self->notify.connect_confirm(self->notify.instance,
-                                            self, info->qos, 
+                                            self, info->qos,
                                             info->max_data_size,
                                             info->max_header_size, skb);
        else {
@@ -322,7 +321,7 @@ int ircomm_data_request(struct ircomm_cb *self, struct sk_buff *skb)
        IRDA_ASSERT(self != NULL, return -EFAULT;);
        IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return -EFAULT;);
        IRDA_ASSERT(skb != NULL, return -EFAULT;);
-       
+
        ret = ircomm_do_event(self, IRCOMM_DATA_REQUEST, skb, NULL);
 
        return ret;
@@ -337,7 +336,7 @@ EXPORT_SYMBOL(ircomm_data_request);
  *
  */
 void ircomm_data_indication(struct ircomm_cb *self, struct sk_buff *skb)
-{      
+{
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(skb->len > 0, return;);
@@ -363,9 +362,9 @@ void ircomm_process_data(struct ircomm_cb *self, struct sk_buff *skb)
 
        clen = skb->data[0];
 
-       /* 
-        * If there are any data hiding in the control channel, we must 
-        * deliver it first. The side effect is that the control channel 
+       /*
+        * If there are any data hiding in the control channel, we must
+        * deliver it first. The side effect is that the control channel
         * will be removed from the skb
         */
        if (clen > 0)
@@ -375,7 +374,7 @@ void ircomm_process_data(struct ircomm_cb *self, struct sk_buff *skb)
        skb_pull(skb, clen+1);
 
        if (skb->len)
-               ircomm_data_indication(self, skb);              
+               ircomm_data_indication(self, skb);
        else {
                IRDA_DEBUG(4, "%s(), data was control info only!\n",
                           __FUNCTION__ );
@@ -391,13 +390,13 @@ void ircomm_process_data(struct ircomm_cb *self, struct sk_buff *skb)
 int ircomm_control_request(struct ircomm_cb *self, struct sk_buff *skb)
 {
        int ret;
-       
+
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(self != NULL, return -EFAULT;);
        IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return -EFAULT;);
        IRDA_ASSERT(skb != NULL, return -EFAULT;);
-       
+
        ret = ircomm_do_event(self, IRCOMM_CONTROL_REQUEST, skb, NULL);
 
        return ret;
@@ -411,10 +410,10 @@ EXPORT_SYMBOL(ircomm_control_request);
  *    Data has arrived on the control channel
  *
  */
-static void ircomm_control_indication(struct ircomm_cb *self, 
+static void ircomm_control_indication(struct ircomm_cb *self,
                                      struct sk_buff *skb, int clen)
 {
-       IRDA_DEBUG(2, "%s()\n", __FUNCTION__ ); 
+       IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
        /* Use udata for delivering data on the control channel */
        if (self->notify.udata_indication) {
@@ -427,8 +426,8 @@ static void ircomm_control_indication(struct ircomm_cb *self,
 
                /* Remove data channel from control channel */
                skb_trim(ctrl_skb, clen+1);
-       
-               self->notify.udata_indication(self->notify.instance, self, 
+
+               self->notify.udata_indication(self->notify.instance, self,
                                              ctrl_skb);
 
                /* Drop reference count -
@@ -455,7 +454,7 @@ int ircomm_disconnect_request(struct ircomm_cb *self, struct sk_buff *userdata)
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return -1;);
 
-       ret = ircomm_do_event(self, IRCOMM_DISCONNECT_REQUEST, userdata, 
+       ret = ircomm_do_event(self, IRCOMM_DISCONNECT_REQUEST, userdata,
                              &info);
        return ret;
 }
@@ -472,7 +471,7 @@ void ircomm_disconnect_indication(struct ircomm_cb *self, struct sk_buff *skb,
                                  struct ircomm_info *info)
 {
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
-       
+
        IRDA_ASSERT(info != NULL, return;);
 
        if (self->notify.disconnect_indication) {
@@ -486,7 +485,7 @@ void ircomm_disconnect_indication(struct ircomm_cb *self, struct sk_buff *skb,
 /*
  * Function ircomm_flow_request (self, flow)
  *
- *    
+ *
  *
  */
 void ircomm_flow_request(struct ircomm_cb *self, LOCAL_FLOW flow)
@@ -517,7 +516,7 @@ static void *ircomm_seq_start(struct seq_file *seq, loff_t *pos)
             self = (struct ircomm_cb *) hashbin_get_next(ircomm)) {
                if (off++ == *pos)
                        break;
-               
+
        }
        return self;
 }
@@ -535,7 +534,7 @@ static void ircomm_seq_stop(struct seq_file *seq, void *v)
 }
 
 static int ircomm_seq_show(struct seq_file *seq, void *v)
-{      
+{
        const struct ircomm_cb *self = v;
 
        IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return -EINVAL; );
@@ -548,7 +547,7 @@ static int ircomm_seq_show(struct seq_file *seq, void *v)
        seq_printf(seq,
                   " state: %s, slsap_sel: %#02x, dlsap_sel: %#02x, mode:",
                   ircomm_state[ self->state],
-                  self->slsap_sel, self->dlsap_sel); 
+                  self->slsap_sel, self->dlsap_sel);
 
        if(self->service_type & IRCOMM_3_WIRE_RAW)
                seq_printf(seq, " 3-wire-raw");
index 01f4e801a1ba6b7ec1c485eebb2785b8571c336d..8ba4e59ece16041e52eb3e5db89ae48b306de888 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      ircomm_event.c
  * Version:       1.0
  * Description:   IrCOMM layer state machine
@@ -8,27 +8,26 @@
  * Created at:    Sun Jun  6 20:33:11 1999
  * Modified at:   Sun Dec 12 13:44:32 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
+ *
  *     Copyright (c) 1999 Dag Brattli, 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 
+ *
+ *     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, 
+ *
+ *     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
- *     
+ *
  ********************************************************************/
 
-#include <linux/sched.h>
 #include <linux/proc_fs.h>
 #include <linux/init.h>
 
 #include <net/irda/ircomm_core.h>
 #include <net/irda/ircomm_event.h>
 
-static int ircomm_state_idle(struct ircomm_cb *self, IRCOMM_EVENT event, 
+static int ircomm_state_idle(struct ircomm_cb *self, IRCOMM_EVENT event,
                             struct sk_buff *skb, struct ircomm_info *info);
-static int ircomm_state_waiti(struct ircomm_cb *self, IRCOMM_EVENT event, 
+static int ircomm_state_waiti(struct ircomm_cb *self, IRCOMM_EVENT event,
                              struct sk_buff *skb, struct ircomm_info *info);
-static int ircomm_state_waitr(struct ircomm_cb *self, IRCOMM_EVENT event, 
+static int ircomm_state_waitr(struct ircomm_cb *self, IRCOMM_EVENT event,
                              struct sk_buff *skb, struct ircomm_info *info);
-static int ircomm_state_conn(struct ircomm_cb *self, IRCOMM_EVENT event, 
+static int ircomm_state_conn(struct ircomm_cb *self, IRCOMM_EVENT event,
                             struct sk_buff *skb, struct ircomm_info *info);
 
 char *ircomm_state[] = {
@@ -60,26 +59,26 @@ char *ircomm_state[] = {
 #ifdef CONFIG_IRDA_DEBUG
 static char *ircomm_event[] = {
        "IRCOMM_CONNECT_REQUEST",
-        "IRCOMM_CONNECT_RESPONSE",
-        "IRCOMM_TTP_CONNECT_INDICATION",
+       "IRCOMM_CONNECT_RESPONSE",
+       "IRCOMM_TTP_CONNECT_INDICATION",
        "IRCOMM_LMP_CONNECT_INDICATION",
-        "IRCOMM_TTP_CONNECT_CONFIRM",
+       "IRCOMM_TTP_CONNECT_CONFIRM",
        "IRCOMM_LMP_CONNECT_CONFIRM",
 
-        "IRCOMM_LMP_DISCONNECT_INDICATION",
+       "IRCOMM_LMP_DISCONNECT_INDICATION",
        "IRCOMM_TTP_DISCONNECT_INDICATION",
-        "IRCOMM_DISCONNECT_REQUEST",
+       "IRCOMM_DISCONNECT_REQUEST",
 
-        "IRCOMM_TTP_DATA_INDICATION",
+       "IRCOMM_TTP_DATA_INDICATION",
        "IRCOMM_LMP_DATA_INDICATION",
-        "IRCOMM_DATA_REQUEST",
-        "IRCOMM_CONTROL_REQUEST",
-        "IRCOMM_CONTROL_INDICATION",
+       "IRCOMM_DATA_REQUEST",
+       "IRCOMM_CONTROL_REQUEST",
+       "IRCOMM_CONTROL_INDICATION",
 };
 #endif /* CONFIG_IRDA_DEBUG */
 
 static int (*state[])(struct ircomm_cb *self, IRCOMM_EVENT event,
-                     struct sk_buff *skb, struct ircomm_info *info) = 
+                     struct sk_buff *skb, struct ircomm_info *info) =
 {
        ircomm_state_idle,
        ircomm_state_waiti,
@@ -93,14 +92,14 @@ static int (*state[])(struct ircomm_cb *self, IRCOMM_EVENT event,
  *    IrCOMM is currently idle
  *
  */
-static int ircomm_state_idle(struct ircomm_cb *self, IRCOMM_EVENT event, 
+static int ircomm_state_idle(struct ircomm_cb *self, IRCOMM_EVENT event,
                             struct sk_buff *skb, struct ircomm_info *info)
 {
        int ret = 0;
 
        switch (event) {
        case IRCOMM_CONNECT_REQUEST:
-               ircomm_next_state(self, IRCOMM_WAITI);          
+               ircomm_next_state(self, IRCOMM_WAITI);
                ret = self->issue.connect_request(self, skb, info);
                break;
        case IRCOMM_TTP_CONNECT_INDICATION:
@@ -119,10 +118,10 @@ static int ircomm_state_idle(struct ircomm_cb *self, IRCOMM_EVENT event,
 /*
  * Function ircomm_state_waiti (self, event, skb)
  *
- *    The IrCOMM user has requested an IrCOMM connection to the remote 
+ *    The IrCOMM user has requested an IrCOMM connection to the remote
  *    device and is awaiting confirmation
  */
-static int ircomm_state_waiti(struct ircomm_cb *self, IRCOMM_EVENT event, 
+static int ircomm_state_waiti(struct ircomm_cb *self, IRCOMM_EVENT event,
                              struct sk_buff *skb, struct ircomm_info *info)
 {
        int ret = 0;
@@ -152,8 +151,8 @@ static int ircomm_state_waiti(struct ircomm_cb *self, IRCOMM_EVENT event,
  *    IrCOMM has received an incoming connection request and is awaiting
  *    response from the user
  */
-static int ircomm_state_waitr(struct ircomm_cb *self, IRCOMM_EVENT event, 
-                             struct sk_buff *skb, struct ircomm_info *info) 
+static int ircomm_state_waitr(struct ircomm_cb *self, IRCOMM_EVENT event,
+                             struct sk_buff *skb, struct ircomm_info *info)
 {
        int ret = 0;
 
@@ -185,7 +184,7 @@ static int ircomm_state_waitr(struct ircomm_cb *self, IRCOMM_EVENT event,
  *    IrCOMM is connected to the peer IrCOMM device
  *
  */
-static int ircomm_state_conn(struct ircomm_cb *self, IRCOMM_EVENT event, 
+static int ircomm_state_conn(struct ircomm_cb *self, IRCOMM_EVENT event,
                             struct sk_buff *skb, struct ircomm_info *info)
 {
        int ret = 0;
@@ -228,7 +227,7 @@ static int ircomm_state_conn(struct ircomm_cb *self, IRCOMM_EVENT event,
  *
  */
 int ircomm_do_event(struct ircomm_cb *self, IRCOMM_EVENT event,
-                   struct sk_buff *skb, struct ircomm_info *info) 
+                   struct sk_buff *skb, struct ircomm_info *info)
 {
        IRDA_DEBUG(4, "%s: state=%s, event=%s\n", __FUNCTION__ ,
                   ircomm_state[self->state], ircomm_event[event]);
@@ -245,7 +244,7 @@ int ircomm_do_event(struct ircomm_cb *self, IRCOMM_EVENT event,
 void ircomm_next_state(struct ircomm_cb *self, IRCOMM_STATE state)
 {
        self->state = state;
-       
-       IRDA_DEBUG(4, "%s: next state=%s, service type=%d\n", __FUNCTION__ , 
+
+       IRDA_DEBUG(4, "%s: next state=%s, service type=%d\n", __FUNCTION__ ,
                   ircomm_state[self->state], self->service_type);
 }
index c8e0d89ee11fd3e9443767fd875d05372453bcc5..55860ee4e39e94cf68e08c4efe2c8e4b9bc9b3d1 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      ircomm_lmp.c
  * Version:       1.0
  * Description:   Interface between IrCOMM and IrLMP
@@ -9,28 +9,27 @@
  * Modified at:   Sun Dec 12 13:44:17 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * Sources:       Previous IrLPT work by Thomas Davis
- * 
+ *
  *     Copyright (c) 1999 Dag Brattli, All Rights Reserved.
  *     Copyright (c) 2000-2003 Jean Tourrilhes <jt@hpl.hp.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 
+ *
+ *     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, 
+ *
+ *     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
- *     
+ *
  ********************************************************************/
 
-#include <linux/sched.h>
 #include <linux/init.h>
 
 #include <net/irda/irda.h>
 /*
  * Function ircomm_lmp_connect_request (self, userdata)
  *
- *    
+ *
  *
  */
-static int ircomm_lmp_connect_request(struct ircomm_cb *self, 
-                                     struct sk_buff *userdata, 
+static int ircomm_lmp_connect_request(struct ircomm_cb *self,
+                                     struct sk_buff *userdata,
                                      struct ircomm_info *info)
 {
        int ret = 0;
@@ -61,14 +60,14 @@ static int ircomm_lmp_connect_request(struct ircomm_cb *self,
                skb_get(userdata);
 
        ret = irlmp_connect_request(self->lsap, info->dlsap_sel,
-                                   info->saddr, info->daddr, NULL, userdata); 
+                                   info->saddr, info->daddr, NULL, userdata);
        return ret;
-}      
+}
 
 /*
  * Function ircomm_lmp_connect_response (self, skb)
  *
- *    
+ *
  *
  */
 static int ircomm_lmp_connect_response(struct ircomm_cb *self,
@@ -78,7 +77,7 @@ static int ircomm_lmp_connect_response(struct ircomm_cb *self,
        int ret;
 
        IRDA_DEBUG(0, "%s()\n", __FUNCTION__ );
-       
+
        /* Any userdata supplied? */
        if (userdata == NULL) {
                tx_skb = alloc_skb(LMP_MAX_HEADER, GFP_ATOMIC);
@@ -88,8 +87,8 @@ static int ircomm_lmp_connect_response(struct ircomm_cb *self,
                /* Reserve space for MUX and LAP header */
                skb_reserve(tx_skb, LMP_MAX_HEADER);
        } else {
-               /*  
-                *  Check that the client has reserved enough space for 
+               /*
+                *  Check that the client has reserved enough space for
                 *  headers
                 */
                IRDA_ASSERT(skb_headroom(userdata) >= LMP_MAX_HEADER,
@@ -105,22 +104,22 @@ static int ircomm_lmp_connect_response(struct ircomm_cb *self,
        return 0;
 }
 
-static int ircomm_lmp_disconnect_request(struct ircomm_cb *self, 
-                                        struct sk_buff *userdata, 
+static int ircomm_lmp_disconnect_request(struct ircomm_cb *self,
+                                        struct sk_buff *userdata,
                                         struct ircomm_info *info)
 {
-        struct sk_buff *tx_skb;
+       struct sk_buff *tx_skb;
        int ret;
 
        IRDA_DEBUG(0, "%s()\n", __FUNCTION__ );
 
-        if (!userdata) {
+       if (!userdata) {
                tx_skb = alloc_skb(LMP_MAX_HEADER, GFP_ATOMIC);
                if (!tx_skb)
                        return -ENOMEM;
-               
+
                /*  Reserve space for MUX and LAP header */
-               skb_reserve(tx_skb, LMP_MAX_HEADER);            
+               skb_reserve(tx_skb, LMP_MAX_HEADER);
                userdata = tx_skb;
        } else {
                /* Don't forget to refcount it - should be NULL anyway */
@@ -136,7 +135,7 @@ static int ircomm_lmp_disconnect_request(struct ircomm_cb *self,
  * Function ircomm_lmp_flow_control (skb)
  *
  *    This function is called when a data frame we have sent to IrLAP has
- *    been deallocated. We do this to make sure we don't flood IrLAP with 
+ *    been deallocated. We do this to make sure we don't flood IrLAP with
  *    frames, since we are not using the IrTTP flow control mechanism
  */
 static void ircomm_lmp_flow_control(struct sk_buff *skb)
@@ -150,29 +149,29 @@ static void ircomm_lmp_flow_control(struct sk_buff *skb)
        cb = (struct irda_skb_cb *) skb->cb;
 
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
-        line = cb->line;
+
+       line = cb->line;
 
        self = (struct ircomm_cb *) hashbin_lock_find(ircomm, line, NULL);
-        if (!self) {
+       if (!self) {
                IRDA_DEBUG(2, "%s(), didn't find myself\n", __FUNCTION__ );
-                return;
+               return;
        }
 
-        IRDA_ASSERT(self != NULL, return;);
+       IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return;);
 
        self->pkt_count--;
 
-        if ((self->pkt_count < 2) && (self->flow_status == FLOW_STOP)) {
-                IRDA_DEBUG(2, "%s(), asking TTY to start again!\n", __FUNCTION__ );
-                self->flow_status = FLOW_START;
-                if (self->notify.flow_indication)
-                        self->notify.flow_indication(self->notify.instance, 
+       if ((self->pkt_count < 2) && (self->flow_status == FLOW_STOP)) {
+               IRDA_DEBUG(2, "%s(), asking TTY to start again!\n", __FUNCTION__ );
+               self->flow_status = FLOW_START;
+               if (self->notify.flow_indication)
+                       self->notify.flow_indication(self->notify.instance,
                                                     self, FLOW_START);
-        }
+       }
 }
-    
+
 /*
  * Function ircomm_lmp_data_request (self, userdata)
  *
@@ -180,7 +179,7 @@ static void ircomm_lmp_flow_control(struct sk_buff *skb)
  *
  */
 static int ircomm_lmp_data_request(struct ircomm_cb *self,
-                                  struct sk_buff *skb, 
+                                  struct sk_buff *skb,
                                   int not_used)
 {
        struct irda_skb_cb *cb;
@@ -189,8 +188,8 @@ static int ircomm_lmp_data_request(struct ircomm_cb *self,
        IRDA_ASSERT(skb != NULL, return -1;);
 
        cb = (struct irda_skb_cb *) skb->cb;
-       
-        cb->line = self->line;
+
+       cb->line = self->line;
 
        IRDA_DEBUG(4, "%s(), sending frame\n", __FUNCTION__ );
 
@@ -199,13 +198,13 @@ static int ircomm_lmp_data_request(struct ircomm_cb *self,
 
        skb->destructor = ircomm_lmp_flow_control;
 
-        if ((self->pkt_count++ > 7) && (self->flow_status == FLOW_START)) {
+       if ((self->pkt_count++ > 7) && (self->flow_status == FLOW_START)) {
                IRDA_DEBUG(2, "%s(), asking TTY to slow down!\n", __FUNCTION__ );
-               self->flow_status = FLOW_STOP;
-                if (self->notify.flow_indication)
-                       self->notify.flow_indication(self->notify.instance, 
-                                                    self, FLOW_STOP);
-        }
+               self->flow_status = FLOW_STOP;
+               if (self->notify.flow_indication)
+                       self->notify.flow_indication(self->notify.instance,
+                                                    self, FLOW_STOP);
+       }
        ret = irlmp_data_request(self->lsap, skb);
        if (ret) {
                IRDA_ERROR("%s(), failed\n", __FUNCTION__);
@@ -227,11 +226,11 @@ static int ircomm_lmp_data_indication(void *instance, void *sap,
        struct ircomm_cb *self = (struct ircomm_cb *) instance;
 
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return -1;);
        IRDA_ASSERT(skb != NULL, return -1;);
-       
+
        ircomm_do_event(self, IRCOMM_LMP_DATA_INDICATION, skb, NULL);
 
        /* Drop reference count - see ircomm_tty_data_indication(). */
@@ -241,15 +240,15 @@ static int ircomm_lmp_data_indication(void *instance, void *sap,
 }
 
 /*
- * Function ircomm_lmp_connect_confirm (instance, sap, qos, max_sdu_size, 
+ * Function ircomm_lmp_connect_confirm (instance, sap, qos, max_sdu_size,
  *                                       max_header_size, skb)
  *
  *    Connection has been confirmed by peer device
  *
  */
 static void ircomm_lmp_connect_confirm(void *instance, void *sap,
-                                      struct qos_info *qos, 
-                                      __u32 max_seg_size, 
+                                      struct qos_info *qos,
+                                      __u32 max_seg_size,
                                       __u8 max_header_size,
                                       struct sk_buff *skb)
 {
@@ -312,7 +311,7 @@ static void ircomm_lmp_connect_indication(void *instance, void *sap,
  *    Peer device has closed the connection, or the link went down for some
  *    other reason
  */
-static void ircomm_lmp_disconnect_indication(void *instance, void *sap, 
+static void ircomm_lmp_disconnect_indication(void *instance, void *sap,
                                             LM_REASON reason,
                                             struct sk_buff *skb)
 {
index a39f5735a90bffeb854d843fbeb58091ba93419c..01d7c9c7b3b4ea7875e4c3d8a30ca7a5dfa7e2e9 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      ircomm_param.c
  * Version:       1.0
  * Description:   Parameter handling for the IrCOMM protocol
@@ -8,27 +8,26 @@
  * Created at:    Mon Jun  7 10:25:11 1999
  * Modified at:   Sun Jan 30 14:32:03 2000
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
+ *
  *     Copyright (c) 1999-2000 Dag Brattli, 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 
+ *
+ *     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, 
+ *
+ *     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
- *     
+ *
  ********************************************************************/
 
-#include <linux/sched.h>
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
 
 
 #include <net/irda/ircomm_param.h>
 
-static int ircomm_param_service_type(void *instance, irda_param_t *param, 
+static int ircomm_param_service_type(void *instance, irda_param_t *param,
                                     int get);
-static int ircomm_param_port_type(void *instance, irda_param_t *param, 
+static int ircomm_param_port_type(void *instance, irda_param_t *param,
                                  int get);
-static int ircomm_param_port_name(void *instance, irda_param_t *param, 
+static int ircomm_param_port_name(void *instance, irda_param_t *param,
                                  int get);
-static int ircomm_param_service_type(void *instance, irda_param_t *param, 
+static int ircomm_param_service_type(void *instance, irda_param_t *param,
                                     int get);
-static int ircomm_param_data_rate(void *instance, irda_param_t *param, 
+static int ircomm_param_data_rate(void *instance, irda_param_t *param,
                                  int get);
-static int ircomm_param_data_format(void *instance, irda_param_t *param, 
+static int ircomm_param_data_format(void *instance, irda_param_t *param,
                                    int get);
-static int ircomm_param_flow_control(void *instance, irda_param_t *param, 
+static int ircomm_param_flow_control(void *instance, irda_param_t *param,
                                     int get);
 static int ircomm_param_xon_xoff(void *instance, irda_param_t *param, int get);
 static int ircomm_param_enq_ack(void *instance, irda_param_t *param, int get);
-static int ircomm_param_line_status(void *instance, irda_param_t *param, 
+static int ircomm_param_line_status(void *instance, irda_param_t *param,
                                    int get);
 static int ircomm_param_dte(void *instance, irda_param_t *param, int get);
 static int ircomm_param_dce(void *instance, irda_param_t *param, int get);
@@ -85,7 +84,7 @@ static pi_minor_info_t pi_minor_call_table_9_wire[] = {
 static pi_major_info_t pi_major_call_table[] = {
        { pi_minor_call_table_common,  3 },
        { pi_minor_call_table_non_raw, 6 },
-       { pi_minor_call_table_9_wire,  3 }
+       { pi_minor_call_table_9_wire,  3 }
 /*     { pi_minor_call_table_centronics }  */
 };
 
@@ -119,20 +118,20 @@ int ircomm_param_request(struct ircomm_tty_cb *self, __u8 pi, int flush)
 
        spin_lock_irqsave(&self->spinlock, flags);
 
-       skb = self->ctrl_skb;   
+       skb = self->ctrl_skb;
        if (!skb) {
                skb = alloc_skb(256, GFP_ATOMIC);
                if (!skb) {
                        spin_unlock_irqrestore(&self->spinlock, flags);
                        return -ENOMEM;
                }
-               
+
                skb_reserve(skb, self->max_header_size);
                self->ctrl_skb = skb;
        }
-       /* 
+       /*
         * Inserting is a little bit tricky since we don't know how much
-        * room we will need. But this should hopefully work OK 
+        * room we will need. But this should hopefully work OK
         */
        count = irda_param_insert(self, pi, skb->tail, skb_tailroom(skb),
                                  &ircomm_param_info);
@@ -162,7 +161,7 @@ int ircomm_param_request(struct ircomm_tty_cb *self, __u8 pi, int flush)
  *    query and then the remote device sends its initial parameters
  *
  */
-static int ircomm_param_service_type(void *instance, irda_param_t *param, 
+static int ircomm_param_service_type(void *instance, irda_param_t *param,
                                     int get)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
@@ -179,7 +178,7 @@ static int ircomm_param_service_type(void *instance, irda_param_t *param,
        /* Find all common service types */
        service_type &= self->service_type;
        if (!service_type) {
-               IRDA_DEBUG(2, 
+               IRDA_DEBUG(2,
                           "%s(), No common service type to use!\n", __FUNCTION__ );
                return -1;
        }
@@ -198,12 +197,12 @@ static int ircomm_param_service_type(void *instance, irda_param_t *param,
        else if (service_type & IRCOMM_3_WIRE_RAW)
                self->settings.service_type = IRCOMM_3_WIRE_RAW;
 
-       IRDA_DEBUG(0, "%s(), resulting service type=0x%02x\n", __FUNCTION__ , 
+       IRDA_DEBUG(0, "%s(), resulting service type=0x%02x\n", __FUNCTION__ ,
                   self->settings.service_type);
 
-       /* 
+       /*
         * Now the line is ready for some communication. Check if we are a
-         * server, and send over some initial parameters.
+        * server, and send over some initial parameters.
         * Client do it in ircomm_tty_state_setup().
         * Note : we may get called from ircomm_tty_getvalue_confirm(),
         * therefore before we even have open any socket. And self->client
@@ -235,13 +234,13 @@ static int ircomm_param_port_type(void *instance, irda_param_t *param, int get)
 
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
-       
+
        if (get)
                param->pv.i = IRCOMM_SERIAL;
        else {
                self->settings.port_type = (__u8) param->pv.i;
 
-               IRDA_DEBUG(0, "%s(), port type=%d\n", __FUNCTION__ , 
+               IRDA_DEBUG(0, "%s(), port type=%d\n", __FUNCTION__ ,
                           self->settings.port_type);
        }
        return 0;
@@ -256,7 +255,7 @@ static int ircomm_param_port_type(void *instance, irda_param_t *param, int get)
 static int ircomm_param_port_name(void *instance, irda_param_t *param, int get)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
 
@@ -279,7 +278,7 @@ static int ircomm_param_port_name(void *instance, irda_param_t *param, int get)
 static int ircomm_param_data_rate(void *instance, irda_param_t *param, int get)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
 
@@ -287,7 +286,7 @@ static int ircomm_param_data_rate(void *instance, irda_param_t *param, int get)
                param->pv.i = self->settings.data_rate;
        else
                self->settings.data_rate = param->pv.i;
-       
+
        IRDA_DEBUG(2, "%s(), data rate = %d\n", __FUNCTION__ , param->pv.i);
 
        return 0;
@@ -299,7 +298,7 @@ static int ircomm_param_data_rate(void *instance, irda_param_t *param, int get)
  *    Exchange data format to be used in this settings
  *
  */
-static int ircomm_param_data_format(void *instance, irda_param_t *param, 
+static int ircomm_param_data_format(void *instance, irda_param_t *param,
                                    int get)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
@@ -311,7 +310,7 @@ static int ircomm_param_data_format(void *instance, irda_param_t *param,
                param->pv.i = self->settings.data_format;
        else
                self->settings.data_format = (__u8) param->pv.i;
-       
+
        return 0;
 }
 
@@ -321,14 +320,14 @@ static int ircomm_param_data_format(void *instance, irda_param_t *param,
  *    Exchange flow control settings to be used in this settings
  *
  */
-static int ircomm_param_flow_control(void *instance, irda_param_t *param, 
+static int ircomm_param_flow_control(void *instance, irda_param_t *param,
                                     int get)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
 
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
-       
+
        if (get)
                param->pv.i = self->settings.flow_control;
        else
@@ -351,7 +350,7 @@ static int ircomm_param_xon_xoff(void *instance, irda_param_t *param, int get)
 
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
-       
+
        if (get) {
                param->pv.i = self->settings.xonxoff[0];
                param->pv.i |= self->settings.xonxoff[1] << 8;
@@ -360,7 +359,7 @@ static int ircomm_param_xon_xoff(void *instance, irda_param_t *param, int get)
                self->settings.xonxoff[1] = (__u16) param->pv.i >> 8;
        }
 
-       IRDA_DEBUG(0, "%s(), XON/XOFF = 0x%02x,0x%02x\n", __FUNCTION__ , 
+       IRDA_DEBUG(0, "%s(), XON/XOFF = 0x%02x,0x%02x\n", __FUNCTION__ ,
                   param->pv.i & 0xff, param->pv.i >> 8);
 
        return 0;
@@ -378,7 +377,7 @@ static int ircomm_param_enq_ack(void *instance, irda_param_t *param, int get)
 
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
-       
+
        if (get) {
                param->pv.i = self->settings.enqack[0];
                param->pv.i |= self->settings.enqack[1] << 8;
@@ -396,10 +395,10 @@ static int ircomm_param_enq_ack(void *instance, irda_param_t *param, int get)
 /*
  * Function ircomm_param_line_status (self, param)
  *
- *    
+ *
  *
  */
-static int ircomm_param_line_status(void *instance, irda_param_t *param, 
+static int ircomm_param_line_status(void *instance, irda_param_t *param,
                                    int get)
 {
        IRDA_DEBUG(2, "%s(), not impl.\n", __FUNCTION__ );
@@ -427,7 +426,7 @@ static int ircomm_param_dte(void *instance, irda_param_t *param, int get)
                dte = (__u8) param->pv.i;
 
                self->settings.dce = 0;
-                               
+
                if (dte & IRCOMM_DELTA_DTR)
                        self->settings.dce |= (IRCOMM_DELTA_DSR|
                                              IRCOMM_DELTA_RI |
@@ -436,7 +435,7 @@ static int ircomm_param_dte(void *instance, irda_param_t *param, int get)
                        self->settings.dce |= (IRCOMM_DSR|
                                              IRCOMM_RI |
                                              IRCOMM_CD);
-               
+
                if (dte & IRCOMM_DELTA_RTS)
                        self->settings.dce |= IRCOMM_DELTA_CTS;
                if (dte & IRCOMM_RTS)
@@ -455,7 +454,7 @@ static int ircomm_param_dte(void *instance, irda_param_t *param, int get)
 /*
  * Function ircomm_param_dce (instance, param)
  *
- *    
+ *
  *
  */
 static int ircomm_param_dce(void *instance, irda_param_t *param, int get)
index d98bf3570d290691ef8d9bb373da996f4725b20c..712eafd0cc7676679f5f3eed20b9e077b0d9ea15 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      ircomm_ttp.c
  * Version:       1.0
  * Description:   Interface between IrCOMM and IrTTP
@@ -8,28 +8,27 @@
  * Created at:    Sun Jun  6 20:48:27 1999
  * Modified at:   Mon Dec 13 11:35:13 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
+ *
  *     Copyright (c) 1999 Dag Brattli, All Rights Reserved.
  *     Copyright (c) 2000-2003 Jean Tourrilhes <jt@hpl.hp.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 
+ *
+ *     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, 
+ *
+ *     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
- *     
+ *
  ********************************************************************/
 
-#include <linux/sched.h>
 #include <linux/init.h>
 
 #include <net/irda/irda.h>
@@ -43,8 +42,8 @@
 static int ircomm_ttp_data_indication(void *instance, void *sap,
                                      struct sk_buff *skb);
 static void ircomm_ttp_connect_confirm(void *instance, void *sap,
-                                      struct qos_info *qos, 
-                                      __u32 max_sdu_size, 
+                                      struct qos_info *qos,
+                                      __u32 max_sdu_size,
                                       __u8 max_header_size,
                                       struct sk_buff *skb);
 static void ircomm_ttp_connect_indication(void *instance, void *sap,
@@ -54,25 +53,25 @@ static void ircomm_ttp_connect_indication(void *instance, void *sap,
                                          struct sk_buff *skb);
 static void ircomm_ttp_flow_indication(void *instance, void *sap,
                                       LOCAL_FLOW cmd);
-static void ircomm_ttp_disconnect_indication(void *instance, void *sap, 
+static void ircomm_ttp_disconnect_indication(void *instance, void *sap,
                                             LM_REASON reason,
                                             struct sk_buff *skb);
 static int ircomm_ttp_data_request(struct ircomm_cb *self,
-                                  struct sk_buff *skb, 
+                                  struct sk_buff *skb,
                                   int clen);
-static int ircomm_ttp_connect_request(struct ircomm_cb *self, 
-                                     struct sk_buff *userdata, 
+static int ircomm_ttp_connect_request(struct ircomm_cb *self,
+                                     struct sk_buff *userdata,
                                      struct ircomm_info *info);
 static int ircomm_ttp_connect_response(struct ircomm_cb *self,
                                       struct sk_buff *userdata);
-static int ircomm_ttp_disconnect_request(struct ircomm_cb *self, 
-                                        struct sk_buff *userdata, 
+static int ircomm_ttp_disconnect_request(struct ircomm_cb *self,
+                                        struct sk_buff *userdata,
                                         struct ircomm_info *info);
 
 /*
  * Function ircomm_open_tsap (self)
  *
- *    
+ *
  *
  */
 int ircomm_open_tsap(struct ircomm_cb *self)
@@ -113,11 +112,11 @@ int ircomm_open_tsap(struct ircomm_cb *self)
 /*
  * Function ircomm_ttp_connect_request (self, userdata)
  *
- *    
+ *
  *
  */
-static int ircomm_ttp_connect_request(struct ircomm_cb *self, 
-                                     struct sk_buff *userdata, 
+static int ircomm_ttp_connect_request(struct ircomm_cb *self,
+                                     struct sk_buff *userdata,
                                      struct ircomm_info *info)
 {
        int ret = 0;
@@ -129,16 +128,16 @@ static int ircomm_ttp_connect_request(struct ircomm_cb *self,
                skb_get(userdata);
 
        ret = irttp_connect_request(self->tsap, info->dlsap_sel,
-                                   info->saddr, info->daddr, NULL, 
-                                   TTP_SAR_DISABLE, userdata); 
+                                   info->saddr, info->daddr, NULL,
+                                   TTP_SAR_DISABLE, userdata);
 
        return ret;
-}      
+}
 
 /*
  * Function ircomm_ttp_connect_response (self, skb)
  *
- *    
+ *
  *
  */
 static int ircomm_ttp_connect_response(struct ircomm_cb *self,
@@ -147,7 +146,7 @@ static int ircomm_ttp_connect_response(struct ircomm_cb *self,
        int ret;
 
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
-       
+
        /* Don't forget to refcount it - should be NULL anyway */
        if(userdata)
                skb_get(userdata);
@@ -160,14 +159,14 @@ static int ircomm_ttp_connect_response(struct ircomm_cb *self,
 /*
  * Function ircomm_ttp_data_request (self, userdata)
  *
- *    Send IrCOMM data to IrTTP layer. Currently we do not try to combine 
- *    control data with pure data, so they will be sent as separate frames. 
+ *    Send IrCOMM data to IrTTP layer. Currently we do not try to combine
+ *    control data with pure data, so they will be sent as separate frames.
  *    Should not be a big problem though, since control frames are rare. But
- *    some of them are sent after connection establishment, so this can 
+ *    some of them are sent after connection establishment, so this can
  *    increase the latency a bit.
  */
 static int ircomm_ttp_data_request(struct ircomm_cb *self,
-                                  struct sk_buff *skb, 
+                                  struct sk_buff *skb,
                                   int clen)
 {
        int ret;
@@ -176,7 +175,7 @@ static int ircomm_ttp_data_request(struct ircomm_cb *self,
 
        IRDA_DEBUG(2, "%s(), clen=%d\n", __FUNCTION__ , clen);
 
-       /* 
+       /*
         * Insert clen field, currently we either send data only, or control
         * only frames, to make things easier and avoid queueing
         */
@@ -210,7 +209,7 @@ static int ircomm_ttp_data_indication(void *instance, void *sap,
        struct ircomm_cb *self = (struct ircomm_cb *) instance;
 
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return -1;);
        IRDA_ASSERT(skb != NULL, return -1;);
@@ -224,8 +223,8 @@ static int ircomm_ttp_data_indication(void *instance, void *sap,
 }
 
 static void ircomm_ttp_connect_confirm(void *instance, void *sap,
-                                      struct qos_info *qos, 
-                                      __u32 max_sdu_size, 
+                                      struct qos_info *qos,
+                                      __u32 max_sdu_size,
                                       __u8 max_header_size,
                                       struct sk_buff *skb)
 {
@@ -261,7 +260,7 @@ out:
  * Function ircomm_ttp_connect_indication (instance, sap, qos, max_sdu_size,
  *                                         max_header_size, skb)
  *
- *    
+ *
  *
  */
 static void ircomm_ttp_connect_indication(void *instance, void *sap,
@@ -301,11 +300,11 @@ out:
 /*
  * Function ircomm_ttp_disconnect_request (self, userdata, info)
  *
- *    
+ *
  *
  */
-static int ircomm_ttp_disconnect_request(struct ircomm_cb *self, 
-                                        struct sk_buff *userdata, 
+static int ircomm_ttp_disconnect_request(struct ircomm_cb *self,
+                                        struct sk_buff *userdata,
                                         struct ircomm_info *info)
 {
        int ret;
@@ -322,10 +321,10 @@ static int ircomm_ttp_disconnect_request(struct ircomm_cb *self,
 /*
  * Function ircomm_ttp_disconnect_indication (instance, sap, reason, skb)
  *
- *    
+ *
  *
  */
-static void ircomm_ttp_disconnect_indication(void *instance, void *sap, 
+static void ircomm_ttp_disconnect_indication(void *instance, void *sap,
                                             LM_REASON reason,
                                             struct sk_buff *skb)
 {
@@ -361,7 +360,7 @@ static void ircomm_ttp_flow_indication(void *instance, void *sap,
 
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRCOMM_MAGIC, return;);
-       
+
        if (self->notify.flow_indication)
                self->notify.flow_indication(self->notify.instance, self, cmd);
 }
index 262bda808d96762b2f96c9dc149f5460be4c1e0c..3d241e415a2ae67f25f9854090c1c6723b8cedf2 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      ircomm_tty.c
  * Version:       1.0
  * Description:   IrCOMM serial TTY driver
@@ -9,25 +9,25 @@
  * Modified at:   Wed Feb 23 00:09:02 2000
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * Sources:       serial.c and previous IrCOMM work by Takahide Higuchi
- * 
+ *
  *     Copyright (c) 1999-2000 Dag Brattli, All Rights Reserved.
  *     Copyright (c) 2000-2003 Jean Tourrilhes <jt@hpl.hp.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 
+ *
+ *     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, 
+ *
+ *     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
- *     
+ *
  ********************************************************************/
 
 #include <linux/init.h>
@@ -69,7 +69,7 @@ static int ircomm_tty_data_indication(void *instance, void *sap,
                                      struct sk_buff *skb);
 static int ircomm_tty_control_indication(void *instance, void *sap,
                                         struct sk_buff *skb);
-static void ircomm_tty_flow_indication(void *instance, void *sap, 
+static void ircomm_tty_flow_indication(void *instance, void *sap,
                                       LOCAL_FLOW cmd);
 #ifdef CONFIG_PROC_FS
 static int ircomm_tty_read_proc(char *buf, char **start, off_t offset, int len,
@@ -113,7 +113,7 @@ static int __init ircomm_tty_init(void)
        driver = alloc_tty_driver(IRCOMM_TTY_PORTS);
        if (!driver)
                return -ENOMEM;
-       ircomm_tty = hashbin_new(HB_LOCK); 
+       ircomm_tty = hashbin_new(HB_LOCK);
        if (ircomm_tty == NULL) {
                IRDA_ERROR("%s(), can't allocate hashbin!\n", __FUNCTION__);
                put_tty_driver(driver);
@@ -163,11 +163,11 @@ static void __exit ircomm_tty_cleanup(void)
 {
        int ret;
 
-       IRDA_DEBUG(4, "%s()\n", __FUNCTION__ ); 
+       IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
 
        ret = tty_unregister_driver(driver);
-        if (ret) {
-                IRDA_ERROR("%s(), failed to unregister driver\n",
+       if (ret) {
+               IRDA_ERROR("%s(), failed to unregister driver\n",
                           __FUNCTION__);
                return;
        }
@@ -179,7 +179,7 @@ static void __exit ircomm_tty_cleanup(void)
 /*
  * Function ircomm_startup (self)
  *
- *    
+ *
  *
  */
 static int ircomm_tty_startup(struct ircomm_tty_cb *self)
@@ -203,17 +203,17 @@ static int ircomm_tty_startup(struct ircomm_tty_cb *self)
        /* These callbacks we must handle ourselves */
        notify.data_indication       = ircomm_tty_data_indication;
        notify.udata_indication      = ircomm_tty_control_indication;
-       notify.flow_indication       = ircomm_tty_flow_indication;
+       notify.flow_indication       = ircomm_tty_flow_indication;
 
        /* Use the ircomm_tty interface for these ones */
-       notify.disconnect_indication = ircomm_tty_disconnect_indication;
+       notify.disconnect_indication = ircomm_tty_disconnect_indication;
        notify.connect_confirm       = ircomm_tty_connect_confirm;
-       notify.connect_indication    = ircomm_tty_connect_indication;
+       notify.connect_indication    = ircomm_tty_connect_indication;
        strlcpy(notify.name, "ircomm_tty", sizeof(notify.name));
        notify.instance = self;
 
        if (!self->ircomm) {
-               self->ircomm = ircomm_open(&notify, self->service_type, 
+               self->ircomm = ircomm_open(&notify, self->service_type,
                                           self->line);
        }
        if (!self->ircomm)
@@ -237,10 +237,10 @@ err:
 /*
  * Function ircomm_block_til_ready (self, filp)
  *
- *    
+ *
  *
  */
-static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self, 
+static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self,
                                      struct file *filp)
 {
        DECLARE_WAITQUEUE(wait, current);
@@ -248,7 +248,7 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self,
        int             do_clocal = 0, extra_count = 0;
        unsigned long   flags;
        struct tty_struct *tty;
-       
+
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
        tty = self->tty;
@@ -256,7 +256,7 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self,
        /*
         * If non-blocking mode is set, or the port is not enabled,
         * then make the check up front and then exit.
-        */     
+        */
        if (filp->f_flags & O_NONBLOCK || tty->flags & (1 << TTY_IO_ERROR)){
                /* nonblock mode is set or port is not enabled */
                self->flags |= ASYNC_NORMAL_ACTIVE;
@@ -268,17 +268,17 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self,
                IRDA_DEBUG(1, "%s(), doing CLOCAL!\n", __FUNCTION__ );
                do_clocal = 1;
        }
-       
+
        /* Wait for carrier detect and the line to become
         * free (i.e., not in use by the callout).  While we are in
         * this loop, self->open_count is dropped by one, so that
         * mgsl_close() knows when to free things.  We restore it upon
         * exit, either normal or abnormal.
         */
-        
+
        retval = 0;
        add_wait_queue(&self->open_wait, &wait);
-       
+
        IRDA_DEBUG(2, "%s(%d):block_til_ready before block on %s open_count=%d\n",
              __FILE__,__LINE__, tty->driver->name, self->open_count );
 
@@ -290,7 +290,7 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self,
        }
        spin_unlock_irqrestore(&self->spinlock, flags);
        self->blocked_open++;
-       
+
        while (1) {
                if (tty->termios->c_cflag & CBAUD) {
                        /* Here, we use to lock those two guys, but
@@ -298,45 +298,45 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self,
                         * I don't see the point (and I see the deadlock).
                         * Jean II */
                        self->settings.dte |= IRCOMM_RTS + IRCOMM_DTR;
-                       
+
                        ircomm_param_request(self, IRCOMM_DTE, TRUE);
                }
-               
+
                current->state = TASK_INTERRUPTIBLE;
-               
+
                if (tty_hung_up_p(filp) ||
                    !test_bit(ASYNC_B_INITIALIZED, &self->flags)) {
                        retval = (self->flags & ASYNC_HUP_NOTIFY) ?
                                        -EAGAIN : -ERESTARTSYS;
                        break;
                }
-               
-               /*  
+
+               /*
                 * Check if link is ready now. Even if CLOCAL is
                 * specified, we cannot return before the IrCOMM link is
-                * ready 
+                * ready
                 */
-               if (!test_bit(ASYNC_B_CLOSING, &self->flags) &&
-                   (do_clocal || (self->settings.dce & IRCOMM_CD)) &&
+               if (!test_bit(ASYNC_B_CLOSING, &self->flags) &&
+                   (do_clocal || (self->settings.dce & IRCOMM_CD)) &&
                    self->state == IRCOMM_TTY_READY)
                {
-                       break;
+                       break;
                }
-                       
+
                if (signal_pending(current)) {
                        retval = -ERESTARTSYS;
                        break;
                }
-               
+
                IRDA_DEBUG(1, "%s(%d):block_til_ready blocking on %s open_count=%d\n",
                      __FILE__,__LINE__, tty->driver->name, self->open_count );
-               
+
                schedule();
        }
-       
+
        __set_current_state(TASK_RUNNING);
        remove_wait_queue(&self->open_wait, &wait);
-       
+
        if (extra_count) {
                /* ++ is not atomic, so this should be protected - Jean II */
                spin_lock_irqsave(&self->spinlock, flags);
@@ -344,14 +344,14 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self,
                spin_unlock_irqrestore(&self->spinlock, flags);
        }
        self->blocked_open--;
-       
+
        IRDA_DEBUG(1, "%s(%d):block_til_ready after blocking on %s open_count=%d\n",
              __FILE__,__LINE__, tty->driver->name, self->open_count);
-                        
+
        if (!retval)
                self->flags |= ASYNC_NORMAL_ACTIVE;
-               
-       return retval;  
+
+       return retval;
 }
 
 /*
@@ -384,7 +384,7 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
                        IRDA_ERROR("%s(), kmalloc failed!\n", __FUNCTION__);
                        return -ENOMEM;
                }
-               
+
                self->magic = IRCOMM_TTY_MAGIC;
                self->flow = FLOW_STOP;
 
@@ -398,13 +398,13 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
                /* Init some important stuff */
                init_timer(&self->watchdog_timer);
                init_waitqueue_head(&self->open_wait);
-               init_waitqueue_head(&self->close_wait);
+               init_waitqueue_head(&self->close_wait);
                spin_lock_init(&self->spinlock);
 
-               /* 
+               /*
                 * Force TTY into raw mode by default which is usually what
                 * we want for IrCOMM and IrLPT. This way applications will
-                * not have to twiddle with printcap etc.  
+                * not have to twiddle with printcap etc.
                 */
                tty->termios->c_iflag = 0;
                tty->termios->c_oflag = 0;
@@ -420,7 +420,7 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
        self->tty = tty;
        spin_unlock_irqrestore(&self->spinlock, flags);
 
-       IRDA_DEBUG(1, "%s(), %s%d, count = %d\n", __FUNCTION__ , tty->driver->name, 
+       IRDA_DEBUG(1, "%s(), %s%d, count = %d\n", __FUNCTION__ , tty->driver->name,
                   self->line, self->open_count);
 
        /* Not really used by us, but lets do it anyway */
@@ -473,7 +473,7 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
 
        ret = ircomm_tty_block_til_ready(self, filp);
        if (ret) {
-               IRDA_DEBUG(2, 
+               IRDA_DEBUG(2,
                      "%s(), returning after block_til_ready with %d\n", __FUNCTION__ ,
                      ret);
 
@@ -519,7 +519,7 @@ static void ircomm_tty_close(struct tty_struct *tty, struct file *filp)
                 * serial port won't be shutdown.
                 */
                IRDA_DEBUG(0, "%s(), bad serial port count; "
-                          "tty->count is 1, state->count is %d\n", __FUNCTION__ , 
+                          "tty->count is 1, state->count is %d\n", __FUNCTION__ ,
                           self->open_count);
                self->open_count = 1;
        }
@@ -546,7 +546,7 @@ static void ircomm_tty_close(struct tty_struct *tty, struct file *filp)
        spin_unlock_irqrestore(&self->spinlock, flags);
 
        /*
-        * Now we wait for the transmit buffer to clear; and we notify 
+        * Now we wait for the transmit buffer to clear; and we notify
         * the line discipline to only process XON/XOFF characters.
         */
        tty->closing = 1;
@@ -576,7 +576,7 @@ static void ircomm_tty_close(struct tty_struct *tty, struct file *filp)
 /*
  * Function ircomm_tty_flush_buffer (tty)
  *
- *    
+ *
  *
  */
 static void ircomm_tty_flush_buffer(struct tty_struct *tty)
@@ -586,9 +586,9 @@ static void ircomm_tty_flush_buffer(struct tty_struct *tty)
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
 
-       /* 
-        * Let do_softint() do this to avoid race condition with 
-        * do_softint() ;-) 
+       /*
+        * Let do_softint() do this to avoid race condition with
+        * do_softint() ;-)
         */
        schedule_work(&self->tqueue);
 }
@@ -597,7 +597,7 @@ static void ircomm_tty_flush_buffer(struct tty_struct *tty)
  * Function ircomm_tty_do_softint (work)
  *
  *    We use this routine to give the write wakeup to the user at at a
- *    safe time (as fast as possible after write have completed). This 
+ *    safe time (as fast as possible after write have completed). This
  *    can be compared to the Tx interrupt.
  */
 static void ircomm_tty_do_softint(struct work_struct *work)
@@ -638,7 +638,7 @@ static void ircomm_tty_do_softint(struct work_struct *work)
 
        /* Unlink transmit buffer */
        spin_lock_irqsave(&self->spinlock, flags);
-       
+
        skb = self->tx_skb;
        self->tx_skb = NULL;
 
@@ -650,9 +650,9 @@ static void ircomm_tty_do_softint(struct work_struct *work)
                /* Drop reference count - see ircomm_ttp_data_request(). */
                dev_kfree_skb(skb);
        }
-               
+
        /* Check if user (still) wants to be waken up */
-       if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && 
+       if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
            tty->ldisc.write_wakeup)
        {
                (tty->ldisc.write_wakeup)(tty);
@@ -717,12 +717,12 @@ static int ircomm_tty_write(struct tty_struct *tty,
        /* Fetch current transmit buffer */
        skb = self->tx_skb;
 
-       /*  
+       /*
         * Send out all the data we get, possibly as multiple fragmented
         * frames, but this will only happen if the data is larger than the
         * max data size. The normal case however is just the opposite, and
         * this function may be called multiple times, and will then actually
-        * defragment the data and send it out as one packet as soon as 
+        * defragment the data and send it out as one packet as soon as
         * possible, but at a safer point in time
         */
        while (count) {
@@ -731,16 +731,16 @@ static int ircomm_tty_write(struct tty_struct *tty,
                /* Adjust data size to the max data size */
                if (size > self->max_data_size)
                        size = self->max_data_size;
-               
-               /* 
+
+               /*
                 * Do we already have a buffer ready for transmit, or do
-                * we need to allocate a new frame 
+                * we need to allocate a new frame
                 */
-               if (skb) {                      
-                       /* 
-                        * Any room for more data at the end of the current 
+               if (skb) {
+                       /*
+                        * Any room for more data at the end of the current
                         * transmit buffer? Cannot use skb_tailroom, since
-                        * dev_alloc_skb gives us a larger skb than we 
+                        * dev_alloc_skb gives us a larger skb than we
                         * requested
                         * Note : use tx_data_size, because max_data_size
                         * may have changed and we don't want to overwrite
@@ -751,8 +751,8 @@ static int ircomm_tty_write(struct tty_struct *tty,
                                if (size > tailroom)
                                        size = tailroom;
                        } else {
-                               /* 
-                                * Current transmit frame is full, so break 
+                               /*
+                                * Current transmit frame is full, so break
                                 * out, so we can send it as soon as possible
                                 */
                                break;
@@ -782,15 +782,15 @@ static int ircomm_tty_write(struct tty_struct *tty,
 
        spin_unlock_irqrestore(&self->spinlock, flags);
 
-       /*     
+       /*
         * Schedule a new thread which will transmit the frame as soon
         * as possible, but at a safe point in time. We do this so the
         * "user" can give us data multiple times, as PPP does (because of
         * its 256 byte tx buffer). We will then defragment and send out
-        * all this data as one single packet.  
+        * all this data as one single packet.
         */
        schedule_work(&self->tqueue);
-       
+
        return len;
 }
 
@@ -846,7 +846,7 @@ static void ircomm_tty_wait_until_sent(struct tty_struct *tty, int timeout)
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
        unsigned long orig_jiffies, poll_time;
        unsigned long flags;
-       
+
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(self != NULL, return;);
@@ -876,7 +876,7 @@ static void ircomm_tty_wait_until_sent(struct tty_struct *tty, int timeout)
  *
  *    This routine notifies the tty driver that input buffers for the line
  *    discipline are close to full, and it should somehow signal that no
- *    more characters should be sent to the tty.  
+ *    more characters should be sent to the tty.
  */
 static void ircomm_tty_throttle(struct tty_struct *tty)
 {
@@ -890,16 +890,16 @@ static void ircomm_tty_throttle(struct tty_struct *tty)
        /* Software flow control? */
        if (I_IXOFF(tty))
                ircomm_tty_send_xchar(tty, STOP_CHAR(tty));
-       
+
        /* Hardware flow control? */
        if (tty->termios->c_cflag & CRTSCTS) {
                self->settings.dte &= ~IRCOMM_RTS;
                self->settings.dte |= IRCOMM_DELTA_RTS;
-       
+
                ircomm_param_request(self, IRCOMM_DTE, TRUE);
        }
 
-        ircomm_flow_request(self->ircomm, FLOW_STOP);
+       ircomm_flow_request(self->ircomm, FLOW_STOP);
 }
 
 /*
@@ -930,7 +930,7 @@ static void ircomm_tty_unthrottle(struct tty_struct *tty)
                ircomm_param_request(self, IRCOMM_DTE, TRUE);
                IRDA_DEBUG(1, "%s(), FLOW_START\n", __FUNCTION__ );
        }
-        ircomm_flow_request(self->ircomm, FLOW_START);
+       ircomm_flow_request(self->ircomm, FLOW_START);
 }
 
 /*
@@ -975,7 +975,7 @@ static void ircomm_tty_shutdown(struct ircomm_tty_cb *self)
        spin_lock_irqsave(&self->spinlock, flags);
 
        del_timer(&self->watchdog_timer);
-       
+
        /* Free parameter buffer */
        if (self->ctrl_skb) {
                dev_kfree_skb(self->ctrl_skb);
@@ -1001,7 +1001,7 @@ static void ircomm_tty_shutdown(struct ircomm_tty_cb *self)
  *
  *    This routine notifies the tty driver that it should hangup the tty
  *    device.
- * 
+ *
  */
 static void ircomm_tty_hangup(struct tty_struct *tty)
 {
@@ -1044,7 +1044,7 @@ static void ircomm_tty_send_xchar(struct tty_struct *tty, char ch)
  * Function ircomm_tty_start (tty)
  *
  *    This routine notifies the tty driver that it resume sending
- *    characters to the tty device.  
+ *    characters to the tty device.
  */
 void ircomm_tty_start(struct tty_struct *tty)
 {
@@ -1057,9 +1057,9 @@ void ircomm_tty_start(struct tty_struct *tty)
  * Function ircomm_tty_stop (tty)
  *
  *     This routine notifies the tty driver that it should stop outputting
- *     characters to the tty device. 
+ *     characters to the tty device.
  */
-static void ircomm_tty_stop(struct tty_struct *tty) 
+static void ircomm_tty_stop(struct tty_struct *tty)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
 
@@ -1094,14 +1094,14 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
                /*wake_up_interruptible(&self->delta_msr_wait);*/
        }
        if ((self->flags & ASYNC_CHECK_CD) && (status & IRCOMM_DELTA_CD)) {
-               IRDA_DEBUG(2, 
+               IRDA_DEBUG(2,
                           "%s(), ircomm%d CD now %s...\n", __FUNCTION__ , self->line,
                           (status & IRCOMM_CD) ? "on" : "off");
 
                if (status & IRCOMM_CD) {
                        wake_up_interruptible(&self->open_wait);
                } else {
-                       IRDA_DEBUG(2, 
+                       IRDA_DEBUG(2,
                                   "%s(), Doing serial hangup..\n", __FUNCTION__ );
                        if (tty)
                                tty_hangup(tty);
@@ -1113,10 +1113,10 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
        if (self->flags & ASYNC_CTS_FLOW) {
                if (tty->hw_stopped) {
                        if (status & IRCOMM_CTS) {
-                               IRDA_DEBUG(2, 
+                               IRDA_DEBUG(2,
                                           "%s(), CTS tx start...\n", __FUNCTION__ );
                                tty->hw_stopped = 0;
-                               
+
                                /* Wake up processes blocked on open */
                                wake_up_interruptible(&self->open_wait);
 
@@ -1125,7 +1125,7 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
                        }
                } else {
                        if (!(status & IRCOMM_CTS)) {
-                               IRDA_DEBUG(2, 
+                               IRDA_DEBUG(2,
                                           "%s(), CTS tx stop...\n", __FUNCTION__ );
                                tty->hw_stopped = 1;
                        }
@@ -1145,7 +1145,7 @@ static int ircomm_tty_data_indication(void *instance, void *sap,
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
 
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
        IRDA_ASSERT(skb != NULL, return -1;);
@@ -1155,10 +1155,10 @@ static int ircomm_tty_data_indication(void *instance, void *sap,
                return 0;
        }
 
-       /* 
+       /*
         * If we receive data when hardware is stopped then something is wrong.
         * We try to poll the peers line settings to check if we are up todate.
-        * Devices like WinCE can do this, and since they don't send any 
+        * Devices like WinCE can do this, and since they don't send any
         * params, we can just as well declare the hardware for running.
         */
        if (self->tty->hw_stopped && (self->flow == FLOW_START)) {
@@ -1170,9 +1170,9 @@ static int ircomm_tty_data_indication(void *instance, void *sap,
                ircomm_tty_link_established(self);
        }
 
-       /* 
+       /*
         * Just give it over to the line discipline. There is no need to
-        * involve the flip buffers, since we are not running in an interrupt 
+        * involve the flip buffers, since we are not running in an interrupt
         * handler
         */
        self->tty->ldisc.receive_buf(self->tty, skb->data, NULL, skb->len);
@@ -1195,14 +1195,14 @@ static int ircomm_tty_control_indication(void *instance, void *sap,
        int clen;
 
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
        IRDA_ASSERT(skb != NULL, return -1;);
 
        clen = skb->data[0];
 
-       irda_param_extract_all(self, skb->data+1, IRDA_MIN(skb->len-1, clen), 
+       irda_param_extract_all(self, skb->data+1, IRDA_MIN(skb->len-1, clen),
                               &ircomm_param_info);
 
        /* No need to kfree_skb - see ircomm_control_indication() */
@@ -1217,7 +1217,7 @@ static int ircomm_tty_control_indication(void *instance, void *sap,
  *    transmission of data. We just mark the hardware as stopped, and wait
  *    for IrTTP to notify us that things are OK again.
  */
-static void ircomm_tty_flow_indication(void *instance, void *sap, 
+static void ircomm_tty_flow_indication(void *instance, void *sap,
                                       LOCAL_FLOW cmd)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
@@ -1247,7 +1247,7 @@ static void ircomm_tty_flow_indication(void *instance, void *sap,
 
 static int ircomm_tty_line_info(struct ircomm_tty_cb *self, char *buf)
 {
-        int  ret=0;
+       int  ret=0;
 
        ret += sprintf(buf+ret, "State: %s\n", ircomm_tty_state[self->state]);
 
@@ -1260,37 +1260,37 @@ static int ircomm_tty_line_info(struct ircomm_tty_cb *self, char *buf)
                ret += sprintf(buf+ret, "3_WIRE_RAW");
        else
                ret += sprintf(buf+ret, "No common service type!\n");
-        ret += sprintf(buf+ret, "\n");
+       ret += sprintf(buf+ret, "\n");
 
        ret += sprintf(buf+ret, "Port name: %s\n", self->settings.port_name);
 
-       ret += sprintf(buf+ret, "DTE status: ");        
-        if (self->settings.dte & IRCOMM_RTS)
-                ret += sprintf(buf+ret, "RTS|");
-        if (self->settings.dte & IRCOMM_DTR)
-                ret += sprintf(buf+ret, "DTR|");
+       ret += sprintf(buf+ret, "DTE status: ");
+       if (self->settings.dte & IRCOMM_RTS)
+               ret += sprintf(buf+ret, "RTS|");
+       if (self->settings.dte & IRCOMM_DTR)
+               ret += sprintf(buf+ret, "DTR|");
        if (self->settings.dte)
                ret--; /* remove the last | */
-        ret += sprintf(buf+ret, "\n");
+       ret += sprintf(buf+ret, "\n");
 
        ret += sprintf(buf+ret, "DCE status: ");
-        if (self->settings.dce & IRCOMM_CTS)
-                ret += sprintf(buf+ret, "CTS|");
-        if (self->settings.dce & IRCOMM_DSR)
-                ret += sprintf(buf+ret, "DSR|");
-        if (self->settings.dce & IRCOMM_CD)
-                ret += sprintf(buf+ret, "CD|");
-        if (self->settings.dce & IRCOMM_RI) 
-                ret += sprintf(buf+ret, "RI|");
+       if (self->settings.dce & IRCOMM_CTS)
+               ret += sprintf(buf+ret, "CTS|");
+       if (self->settings.dce & IRCOMM_DSR)
+               ret += sprintf(buf+ret, "DSR|");
+       if (self->settings.dce & IRCOMM_CD)
+               ret += sprintf(buf+ret, "CD|");
+       if (self->settings.dce & IRCOMM_RI)
+               ret += sprintf(buf+ret, "RI|");
        if (self->settings.dce)
                ret--; /* remove the last | */
-        ret += sprintf(buf+ret, "\n");
+       ret += sprintf(buf+ret, "\n");
 
        ret += sprintf(buf+ret, "Configuration: ");
        if (!self->settings.null_modem)
                ret += sprintf(buf+ret, "DTE <-> DCE\n");
        else
-               ret += sprintf(buf+ret, 
+               ret += sprintf(buf+ret,
                               "DTE <-> DTE (null modem emulation)\n");
 
        ret += sprintf(buf+ret, "Data rate: %d\n", self->settings.data_rate);
@@ -1314,7 +1314,7 @@ static int ircomm_tty_line_info(struct ircomm_tty_cb *self, char *buf)
                ret += sprintf(buf+ret, "ENQ_ACK_OUT|");
        if (self->settings.flow_control)
                ret--; /* remove the last | */
-        ret += sprintf(buf+ret, "\n");
+       ret += sprintf(buf+ret, "\n");
 
        ret += sprintf(buf+ret, "Flags: ");
        if (self->flags & ASYNC_CTS_FLOW)
@@ -1333,25 +1333,25 @@ static int ircomm_tty_line_info(struct ircomm_tty_cb *self, char *buf)
                ret--; /* remove the last | */
        ret += sprintf(buf+ret, "\n");
 
-       ret += sprintf(buf+ret, "Role: %s\n", self->client ? 
+       ret += sprintf(buf+ret, "Role: %s\n", self->client ?
                       "client" : "server");
        ret += sprintf(buf+ret, "Open count: %d\n", self->open_count);
        ret += sprintf(buf+ret, "Max data size: %d\n", self->max_data_size);
        ret += sprintf(buf+ret, "Max header size: %d\n", self->max_header_size);
-               
+
        if (self->tty)
-               ret += sprintf(buf+ret, "Hardware: %s\n", 
+               ret += sprintf(buf+ret, "Hardware: %s\n",
                               self->tty->hw_stopped ? "Stopped" : "Running");
 
-        ret += sprintf(buf+ret, "\n");
-        return ret;
+       ret += sprintf(buf+ret, "\n");
+       return ret;
 }
 
 
 /*
  * Function ircomm_tty_read_proc (buf, start, offset, len, eof, unused)
  *
- *    
+ *
  *
  */
 #ifdef CONFIG_PROC_FS
@@ -1359,8 +1359,8 @@ static int ircomm_tty_read_proc(char *buf, char **start, off_t offset, int len,
                                int *eof, void *unused)
 {
        struct ircomm_tty_cb *self;
-        int count = 0, l;
-        off_t begin = 0;
+       int count = 0, l;
+       off_t begin = 0;
        unsigned long flags;
 
        spin_lock_irqsave(&ircomm_tty->hb_spinlock, flags);
@@ -1370,25 +1370,25 @@ static int ircomm_tty_read_proc(char *buf, char **start, off_t offset, int len,
                if (self->magic != IRCOMM_TTY_MAGIC)
                        break;
 
-                l = ircomm_tty_line_info(self, buf + count);
-                count += l;
-                if (count+begin > offset+len)
-                        goto done;
-                if (count+begin < offset) {
-                        begin += count;
-                        count = 0;
-                }
-                               
+               l = ircomm_tty_line_info(self, buf + count);
+               count += l;
+               if (count+begin > offset+len)
+                       goto done;
+               if (count+begin < offset) {
+                       begin += count;
+                       count = 0;
+               }
+
                self = (struct ircomm_tty_cb *) hashbin_get_next(ircomm_tty);
-        }
-        *eof = 1;
+       }
+       *eof = 1;
 done:
        spin_unlock_irqrestore(&ircomm_tty->hb_spinlock, flags);
 
-        if (offset >= count+begin)
-                return 0;
-        *start = buf + (offset-begin);
-        return ((len < begin+count-offset) ? len : begin+count-offset);
+       if (offset >= count+begin)
+               return 0;
+       *start = buf + (offset-begin);
+       return ((len < begin+count-offset) ? len : begin+count-offset);
 }
 #endif /* CONFIG_PROC_FS */
 
index 99f5eddbb4b78281c39b6e0e359b1a3d88f78cca..824309dabfe9450102791912c77c8f0ba1b74b4b 100644 (file)
@@ -1,35 +1,34 @@
 /*********************************************************************
- *                
+ *
  * Filename:      ircomm_tty_attach.c
- * Version:       
+ * Version:
  * Description:   Code for attaching the serial driver to IrCOMM
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sat Jun  5 17:42:00 1999
  * Modified at:   Tue Jan  4 14:20:49 2000
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
+ *
  *     Copyright (c) 1999-2000 Dag Brattli, All Rights Reserved.
  *     Copyright (c) 2000-2003 Jean Tourrilhes <jt@hpl.hp.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 
+ *
+ *     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, 
+ *
+ *     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
- *     
+ *
  ********************************************************************/
 
-#include <linux/sched.h>
 #include <linux/init.h>
 
 #include <net/irda/irda.h>
@@ -50,35 +49,35 @@ static void ircomm_tty_ias_register(struct ircomm_tty_cb *self);
 static void ircomm_tty_discovery_indication(discinfo_t *discovery,
                                            DISCOVERY_MODE mode,
                                            void *priv);
-static void ircomm_tty_getvalue_confirm(int result, __u16 obj_id, 
+static void ircomm_tty_getvalue_confirm(int result, __u16 obj_id,
                                        struct ias_value *value, void *priv);
 static void ircomm_tty_start_watchdog_timer(struct ircomm_tty_cb *self,
                                            int timeout);
 static void ircomm_tty_watchdog_timer_expired(void *data);
 
-static int ircomm_tty_state_idle(struct ircomm_tty_cb *self, 
-                                IRCOMM_TTY_EVENT event, 
-                                struct sk_buff *skb, 
+static int ircomm_tty_state_idle(struct ircomm_tty_cb *self,
+                                IRCOMM_TTY_EVENT event,
+                                struct sk_buff *skb,
                                 struct ircomm_tty_info *info);
-static int ircomm_tty_state_search(struct ircomm_tty_cb *self, 
-                                  IRCOMM_TTY_EVENT event, 
-                                  struct sk_buff *skb, 
+static int ircomm_tty_state_search(struct ircomm_tty_cb *self,
+                                  IRCOMM_TTY_EVENT event,
+                                  struct sk_buff *skb,
                                   struct ircomm_tty_info *info);
-static int ircomm_tty_state_query_parameters(struct ircomm_tty_cb *self, 
-                                            IRCOMM_TTY_EVENT event, 
-                                            struct sk_buff *skb, 
+static int ircomm_tty_state_query_parameters(struct ircomm_tty_cb *self,
+                                            IRCOMM_TTY_EVENT event,
+                                            struct sk_buff *skb,
                                             struct ircomm_tty_info *info);
-static int ircomm_tty_state_query_lsap_sel(struct ircomm_tty_cb *self, 
-                                          IRCOMM_TTY_EVENT event, 
-                                          struct sk_buff *skb, 
+static int ircomm_tty_state_query_lsap_sel(struct ircomm_tty_cb *self,
+                                          IRCOMM_TTY_EVENT event,
+                                          struct sk_buff *skb,
                                           struct ircomm_tty_info *info);
-static int ircomm_tty_state_setup(struct ircomm_tty_cb *self, 
-                                 IRCOMM_TTY_EVENT event, 
-                                 struct sk_buff *skb, 
+static int ircomm_tty_state_setup(struct ircomm_tty_cb *self,
+                                 IRCOMM_TTY_EVENT event,
+                                 struct sk_buff *skb,
                                  struct ircomm_tty_info *info);
-static int ircomm_tty_state_ready(struct ircomm_tty_cb *self, 
-                                 IRCOMM_TTY_EVENT event, 
-                                 struct sk_buff *skb, 
+static int ircomm_tty_state_ready(struct ircomm_tty_cb *self,
+                                 IRCOMM_TTY_EVENT event,
+                                 struct sk_buff *skb,
                                  struct ircomm_tty_info *info);
 
 char *ircomm_tty_state[] = {
@@ -111,7 +110,7 @@ static char *ircomm_tty_event[] = {
 #endif /* CONFIG_IRDA_DEBUG */
 
 static int (*state[])(struct ircomm_tty_cb *self, IRCOMM_TTY_EVENT event,
-                     struct sk_buff *skb, struct ircomm_tty_info *info) = 
+                     struct sk_buff *skb, struct ircomm_tty_info *info) =
 {
        ircomm_tty_state_idle,
        ircomm_tty_state_search,
@@ -125,7 +124,7 @@ static int (*state[])(struct ircomm_tty_cb *self, IRCOMM_TTY_EVENT event,
  * Function ircomm_tty_attach_cable (driver)
  *
  *    Try to attach cable (IrCOMM link). This function will only return
- *    when the link has been connected, or if an error condition occurs. 
+ *    when the link has been connected, or if an error condition occurs.
  *    If success, the return value is the resulting service type.
  */
 int ircomm_tty_attach_cable(struct ircomm_tty_cb *self)
@@ -135,7 +134,7 @@ int ircomm_tty_attach_cable(struct ircomm_tty_cb *self)
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
 
-               /* Check if somebody has already connected to us */
+       /* Check if somebody has already connected to us */
        if (ircomm_is_connected(self->ircomm)) {
                IRDA_DEBUG(0, "%s(), already connected!\n", __FUNCTION__ );
                return 0;
@@ -177,7 +176,7 @@ void ircomm_tty_detach_cable(struct ircomm_tty_cb *self)
                self->skey = NULL;
        }
 
-       if (self->iriap) { 
+       if (self->iriap) {
                iriap_close(self->iriap);
                self->iriap = NULL;
        }
@@ -212,7 +211,7 @@ static void ircomm_tty_ias_register(struct ircomm_tty_cb *self)
 
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
-       
+
        /* Compute hint bits based on service */
        hints = irlmp_service_to_hint(S_COMM);
        if (self->service_type & IRCOMM_3_WIRE_RAW)
@@ -234,19 +233,19 @@ static void ircomm_tty_ias_register(struct ircomm_tty_cb *self)
        if (self->service_type & IRCOMM_3_WIRE_RAW) {
                /* Register IrLPT with LM-IAS */
                self->obj = irias_new_object("IrLPT", IAS_IRLPT_ID);
-               irias_add_integer_attrib(self->obj, "IrDA:IrLMP:LsapSel", 
+               irias_add_integer_attrib(self->obj, "IrDA:IrLMP:LsapSel",
                                         self->slsap_sel, IAS_KERNEL_ATTR);
        } else {
                /* Register IrCOMM with LM-IAS */
                self->obj = irias_new_object("IrDA:IrCOMM", IAS_IRCOMM_ID);
-               irias_add_integer_attrib(self->obj, "IrDA:TinyTP:LsapSel", 
+               irias_add_integer_attrib(self->obj, "IrDA:TinyTP:LsapSel",
                                         self->slsap_sel, IAS_KERNEL_ATTR);
-               
+
                /* Code the parameters into the buffer */
-               irda_param_pack(oct_seq, "bbbbbb", 
+               irda_param_pack(oct_seq, "bbbbbb",
                                IRCOMM_SERVICE_TYPE, 1, self->service_type,
                                IRCOMM_PORT_TYPE,    1, IRCOMM_SERIAL);
-               
+
                /* Register parameters with LM-IAS */
                irias_add_octseq_attrib(self->obj, "Parameters", oct_seq, 6,
                                        IAS_KERNEL_ATTR);
@@ -302,23 +301,23 @@ int ircomm_tty_send_initial_parameters(struct ircomm_tty_cb *self)
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
 
-       if (self->service_type & IRCOMM_3_WIRE_RAW) 
+       if (self->service_type & IRCOMM_3_WIRE_RAW)
                return 0;
 
-       /* 
-        * Set default values, but only if the application for some reason 
+       /*
+        * Set default values, but only if the application for some reason
         * haven't set them already
         */
-       IRDA_DEBUG(2, "%s(), data-rate = %d\n", __FUNCTION__ , 
+       IRDA_DEBUG(2, "%s(), data-rate = %d\n", __FUNCTION__ ,
                   self->settings.data_rate);
        if (!self->settings.data_rate)
                self->settings.data_rate = 9600;
-       IRDA_DEBUG(2, "%s(), data-format = %d\n", __FUNCTION__ , 
+       IRDA_DEBUG(2, "%s(), data-format = %d\n", __FUNCTION__ ,
                   self->settings.data_format);
        if (!self->settings.data_format)
                self->settings.data_format = IRCOMM_WSIZE_8;  /* 8N1 */
 
-       IRDA_DEBUG(2, "%s(), flow-control = %d\n", __FUNCTION__ , 
+       IRDA_DEBUG(2, "%s(), flow-control = %d\n", __FUNCTION__ ,
                   self->settings.flow_control);
        /*self->settings.flow_control = IRCOMM_RTS_CTS_IN|IRCOMM_RTS_CTS_OUT;*/
 
@@ -330,7 +329,7 @@ int ircomm_tty_send_initial_parameters(struct ircomm_tty_cb *self)
                ircomm_param_request(self, IRCOMM_SERVICE_TYPE, FALSE);
        ircomm_param_request(self, IRCOMM_DATA_RATE, FALSE);
        ircomm_param_request(self, IRCOMM_DATA_FORMAT, FALSE);
-       
+
        /* For a 3 wire service, we just flush the last parameter and return */
        if (self->settings.service_type == IRCOMM_3_WIRE) {
                ircomm_param_request(self, IRCOMM_FLOW_CONTROL, TRUE);
@@ -342,10 +341,10 @@ int ircomm_tty_send_initial_parameters(struct ircomm_tty_cb *self)
 #if 0
        ircomm_param_request(self, IRCOMM_XON_XOFF, FALSE);
        ircomm_param_request(self, IRCOMM_ENQ_ACK, FALSE);
-#endif 
+#endif
        /* Notify peer that we are ready to receive data */
        ircomm_param_request(self, IRCOMM_DTE, TRUE);
-       
+
        return 0;
 }
 
@@ -388,8 +387,8 @@ static void ircomm_tty_discovery_indication(discinfo_t *discovery,
        self = (struct ircomm_tty_cb *) hashbin_get_first(ircomm_tty);
        while (self != NULL) {
                IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
-               
-               ircomm_tty_do_event(self, IRCOMM_TTY_DISCOVERY_INDICATION, 
+
+               ircomm_tty_do_event(self, IRCOMM_TTY_DISCOVERY_INDICATION,
                                    NULL, &info);
 
                self = (struct ircomm_tty_cb *) hashbin_get_next(ircomm_tty);
@@ -402,7 +401,7 @@ static void ircomm_tty_discovery_indication(discinfo_t *discovery,
  *    Link disconnected
  *
  */
-void ircomm_tty_disconnect_indication(void *instance, void *sap, 
+void ircomm_tty_disconnect_indication(void *instance, void *sap,
                                      LM_REASON reason,
                                      struct sk_buff *skb)
 {
@@ -422,7 +421,7 @@ void ircomm_tty_disconnect_indication(void *instance, void *sap,
        /* Stop data transfers */
        self->tty->hw_stopped = 1;
 
-       ircomm_tty_do_event(self, IRCOMM_TTY_DISCONNECT_INDICATION, NULL, 
+       ircomm_tty_do_event(self, IRCOMM_TTY_DISCONNECT_INDICATION, NULL,
                            NULL);
 }
 
@@ -432,8 +431,8 @@ void ircomm_tty_disconnect_indication(void *instance, void *sap,
  *    Got result from the IAS query we make
  *
  */
-static void ircomm_tty_getvalue_confirm(int result, __u16 obj_id, 
-                                       struct ias_value *value, 
+static void ircomm_tty_getvalue_confirm(int result, __u16 obj_id,
+                                       struct ias_value *value,
                                        void *priv)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) priv;
@@ -454,18 +453,18 @@ static void ircomm_tty_getvalue_confirm(int result, __u16 obj_id,
        }
 
        switch (value->type) {
-       case IAS_OCT_SEQ:
+       case IAS_OCT_SEQ:
                IRDA_DEBUG(2, "%s(), got octet sequence\n", __FUNCTION__ );
 
                irda_param_extract_all(self, value->t.oct_seq, value->len,
                                       &ircomm_param_info);
 
-               ircomm_tty_do_event(self, IRCOMM_TTY_GOT_PARAMETERS, NULL, 
+               ircomm_tty_do_event(self, IRCOMM_TTY_GOT_PARAMETERS, NULL,
                                    NULL);
                break;
        case IAS_INTEGER:
-               /* Got LSAP selector */ 
-               IRDA_DEBUG(2, "%s(), got lsapsel = %d\n", __FUNCTION__ , 
+               /* Got LSAP selector */
+               IRDA_DEBUG(2, "%s(), got lsapsel = %d\n", __FUNCTION__ ,
                           value->t.integer);
 
                if (value->t.integer == -1) {
@@ -491,10 +490,10 @@ static void ircomm_tty_getvalue_confirm(int result, __u16 obj_id,
  *    Connection confirmed
  *
  */
-void ircomm_tty_connect_confirm(void *instance, void *sap, 
-                               struct qos_info *qos, 
-                               __u32 max_data_size, 
-                               __u8 max_header_size, 
+void ircomm_tty_connect_confirm(void *instance, void *sap,
+                               struct qos_info *qos,
+                               __u32 max_data_size,
+                               __u8 max_header_size,
                                struct sk_buff *skb)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
@@ -515,16 +514,16 @@ void ircomm_tty_connect_confirm(void *instance, void *sap,
 }
 
 /*
- * Function ircomm_tty_connect_indication (instance, sap, qos, max_sdu_size, 
+ * Function ircomm_tty_connect_indication (instance, sap, qos, max_sdu_size,
  *                                         skb)
  *
  *    we are discovered and being requested to connect by remote device !
  *
  */
-void ircomm_tty_connect_indication(void *instance, void *sap, 
-                                  struct qos_info *qos, 
+void ircomm_tty_connect_indication(void *instance, void *sap,
+                                  struct qos_info *qos,
                                   __u32 max_data_size,
-                                  __u8 max_header_size, 
+                                  __u8 max_header_size,
                                   struct sk_buff *skb)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
@@ -542,8 +541,8 @@ void ircomm_tty_connect_indication(void *instance, void *sap,
 
        clen = skb->data[0];
        if (clen)
-               irda_param_extract_all(self, skb->data+1, 
-                                      IRDA_MIN(skb->len, clen), 
+               irda_param_extract_all(self, skb->data+1,
+                                      IRDA_MIN(skb->len, clen),
                                       &ircomm_param_info);
 
        ircomm_tty_do_event(self, IRCOMM_TTY_CONNECT_INDICATION, NULL, NULL);
@@ -566,14 +565,14 @@ void ircomm_tty_link_established(struct ircomm_tty_cb *self)
 
        if (!self->tty)
                return;
-       
+
        del_timer(&self->watchdog_timer);
 
-       /* 
+       /*
         * IrCOMM link is now up, and if we are not using hardware
         * flow-control, then declare the hardware as running. Otherwise we
         * will have to wait for the peer device (DCE) to raise the CTS
-        * line.  
+        * line.
         */
        if ((self->flags & ASYNC_CTS_FLOW) && ((self->settings.dce & IRCOMM_CTS) == 0)) {
                IRDA_DEBUG(0, "%s(), waiting for CTS ...\n", __FUNCTION__ );
@@ -582,7 +581,7 @@ void ircomm_tty_link_established(struct ircomm_tty_cb *self)
                IRDA_DEBUG(1, "%s(), starting hardware!\n", __FUNCTION__ );
 
                self->tty->hw_stopped = 0;
-       
+
                /* Wake up processes blocked on open */
                wake_up_interruptible(&self->open_wait);
        }
@@ -593,8 +592,8 @@ void ircomm_tty_link_established(struct ircomm_tty_cb *self)
 /*
  * Function ircomm_tty_start_watchdog_timer (self, timeout)
  *
- *    Start the watchdog timer. This timer is used to make sure that any 
- *    connection attempt is successful, and if not, we will retry after 
+ *    Start the watchdog timer. This timer is used to make sure that any
+ *    connection attempt is successful, and if not, we will retry after
  *    the timeout
  */
 static void ircomm_tty_start_watchdog_timer(struct ircomm_tty_cb *self,
@@ -616,7 +615,7 @@ static void ircomm_tty_start_watchdog_timer(struct ircomm_tty_cb *self,
 static void ircomm_tty_watchdog_timer_expired(void *data)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) data;
-       
+
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(self != NULL, return;);
@@ -633,14 +632,14 @@ static void ircomm_tty_watchdog_timer_expired(void *data)
  *
  */
 int ircomm_tty_do_event(struct ircomm_tty_cb *self, IRCOMM_TTY_EVENT event,
-                       struct sk_buff *skb, struct ircomm_tty_info *info) 
+                       struct sk_buff *skb, struct ircomm_tty_info *info)
 {
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
 
        IRDA_DEBUG(2, "%s: state=%s, event=%s\n", __FUNCTION__ ,
                   ircomm_tty_state[self->state], ircomm_tty_event[event]);
-       
+
        return (*state[self->state])(self, event, skb, info);
 }
 
@@ -656,7 +655,7 @@ static inline void ircomm_tty_next_state(struct ircomm_tty_cb *self, IRCOMM_TTY_
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
 
-       IRDA_DEBUG(2, "%s: next state=%s, service type=%d\n", __FUNCTION__ , 
+       IRDA_DEBUG(2, "%s: next state=%s, service type=%d\n", __FUNCTION__ ,
                   ircomm_tty_state[self->state], self->service_type);
        */
        self->state = state;
@@ -668,9 +667,9 @@ static inline void ircomm_tty_next_state(struct ircomm_tty_cb *self, IRCOMM_TTY_
  *    Just hanging around
  *
  */
-static int ircomm_tty_state_idle(struct ircomm_tty_cb *self, 
-                                IRCOMM_TTY_EVENT event, 
-                                struct sk_buff *skb, 
+static int ircomm_tty_state_idle(struct ircomm_tty_cb *self,
+                                IRCOMM_TTY_EVENT event,
+                                struct sk_buff *skb,
                                 struct ircomm_tty_info *info)
 {
        int ret = 0;
@@ -679,10 +678,10 @@ static int ircomm_tty_state_idle(struct ircomm_tty_cb *self,
                   ircomm_tty_state[self->state], ircomm_tty_event[event]);
        switch (event) {
        case IRCOMM_TTY_ATTACH_CABLE:
-               /* Try to discover any remote devices */                
+               /* Try to discover any remote devices */
                ircomm_tty_start_watchdog_timer(self, 3*HZ);
                ircomm_tty_next_state(self, IRCOMM_TTY_SEARCH);
-               
+
                irlmp_discovery_request(DISCOVERY_DEFAULT_SLOTS);
                break;
        case IRCOMM_TTY_DISCOVERY_INDICATION:
@@ -701,7 +700,7 @@ static int ircomm_tty_state_idle(struct ircomm_tty_cb *self,
                iriap_getvaluebyclass_request(self->iriap,
                                              self->saddr, self->daddr,
                                              "IrDA:IrCOMM", "Parameters");
-               
+
                ircomm_tty_start_watchdog_timer(self, 3*HZ);
                ircomm_tty_next_state(self, IRCOMM_TTY_QUERY_PARAMETERS);
                break;
@@ -732,9 +731,9 @@ static int ircomm_tty_state_idle(struct ircomm_tty_cb *self,
  *    Trying to discover an IrCOMM device
  *
  */
-static int ircomm_tty_state_search(struct ircomm_tty_cb *self, 
-                                  IRCOMM_TTY_EVENT event, 
-                                  struct sk_buff *skb, 
+static int ircomm_tty_state_search(struct ircomm_tty_cb *self,
+                                  IRCOMM_TTY_EVENT event,
+                                  struct sk_buff *skb,
                                   struct ircomm_tty_info *info)
 {
        int ret = 0;
@@ -752,19 +751,19 @@ static int ircomm_tty_state_search(struct ircomm_tty_cb *self,
                                     __FUNCTION__);
                        return -EBUSY;
                }
-               
+
                self->iriap = iriap_open(LSAP_ANY, IAS_CLIENT, self,
                                         ircomm_tty_getvalue_confirm);
-               
+
                if (self->service_type == IRCOMM_3_WIRE_RAW) {
                        iriap_getvaluebyclass_request(self->iriap, self->saddr,
-                                                     self->daddr, "IrLPT", 
+                                                     self->daddr, "IrLPT",
                                                      "IrDA:IrLMP:LsapSel");
                        ircomm_tty_next_state(self, IRCOMM_TTY_QUERY_LSAP_SEL);
                } else {
                        iriap_getvaluebyclass_request(self->iriap, self->saddr,
-                                                     self->daddr, 
-                                                     "IrDA:IrCOMM", 
+                                                     self->daddr,
+                                                     "IrDA:IrCOMM",
                                                      "Parameters");
 
                        ircomm_tty_next_state(self, IRCOMM_TTY_QUERY_PARAMETERS);
@@ -783,7 +782,7 @@ static int ircomm_tty_state_search(struct ircomm_tty_cb *self,
 #if 1
                /* Give up */
 #else
-               /* Try to discover any remote devices */                
+               /* Try to discover any remote devices */
                ircomm_tty_start_watchdog_timer(self, 3*HZ);
                irlmp_discovery_request(DISCOVERY_DEFAULT_SLOTS);
 #endif
@@ -805,9 +804,9 @@ static int ircomm_tty_state_search(struct ircomm_tty_cb *self,
  *    Querying the remote LM-IAS for IrCOMM parameters
  *
  */
-static int ircomm_tty_state_query_parameters(struct ircomm_tty_cb *self, 
-                                            IRCOMM_TTY_EVENT event, 
-                                            struct sk_buff *skb, 
+static int ircomm_tty_state_query_parameters(struct ircomm_tty_cb *self,
+                                            IRCOMM_TTY_EVENT event,
+                                            struct sk_buff *skb,
                                             struct ircomm_tty_info *info)
 {
        int ret = 0;
@@ -822,12 +821,12 @@ static int ircomm_tty_state_query_parameters(struct ircomm_tty_cb *self,
                                     __FUNCTION__);
                        return -EBUSY;
                }
-               
+
                self->iriap = iriap_open(LSAP_ANY, IAS_CLIENT, self,
                                         ircomm_tty_getvalue_confirm);
 
-               iriap_getvaluebyclass_request(self->iriap, self->saddr, 
-                                             self->daddr, "IrDA:IrCOMM", 
+               iriap_getvaluebyclass_request(self->iriap, self->saddr,
+                                             self->daddr, "IrDA:IrCOMM",
                                              "IrDA:TinyTP:LsapSel");
 
                ircomm_tty_start_watchdog_timer(self, 3*HZ);
@@ -836,7 +835,7 @@ static int ircomm_tty_state_query_parameters(struct ircomm_tty_cb *self,
        case IRCOMM_TTY_WD_TIMER_EXPIRED:
                /* Go back to search mode */
                ircomm_tty_next_state(self, IRCOMM_TTY_SEARCH);
-               ircomm_tty_start_watchdog_timer(self, 3*HZ); 
+               ircomm_tty_start_watchdog_timer(self, 3*HZ);
                break;
        case IRCOMM_TTY_CONNECT_INDICATION:
                del_timer(&self->watchdog_timer);
@@ -863,9 +862,9 @@ static int ircomm_tty_state_query_parameters(struct ircomm_tty_cb *self,
  *    Query remote LM-IAS for the LSAP selector which we can connect to
  *
  */
-static int ircomm_tty_state_query_lsap_sel(struct ircomm_tty_cb *self, 
-                                          IRCOMM_TTY_EVENT event, 
-                                          struct sk_buff *skb, 
+static int ircomm_tty_state_query_lsap_sel(struct ircomm_tty_cb *self,
+                                          IRCOMM_TTY_EVENT event,
+                                          struct sk_buff *skb,
                                           struct ircomm_tty_info *info)
 {
        int ret = 0;
@@ -877,7 +876,7 @@ static int ircomm_tty_state_query_lsap_sel(struct ircomm_tty_cb *self,
        case IRCOMM_TTY_GOT_LSAPSEL:
                /* Connect to remote device */
                ret = ircomm_connect_request(self->ircomm, self->dlsap_sel,
-                                            self->saddr, self->daddr, 
+                                            self->saddr, self->daddr,
                                             NULL, self->service_type);
                ircomm_tty_start_watchdog_timer(self, 3*HZ);
                ircomm_tty_next_state(self, IRCOMM_TTY_SETUP);
@@ -912,9 +911,9 @@ static int ircomm_tty_state_query_lsap_sel(struct ircomm_tty_cb *self,
  *    Trying to connect
  *
  */
-static int ircomm_tty_state_setup(struct ircomm_tty_cb *self, 
-                                 IRCOMM_TTY_EVENT event, 
-                                 struct sk_buff *skb, 
+static int ircomm_tty_state_setup(struct ircomm_tty_cb *self,
+                                 IRCOMM_TTY_EVENT event,
+                                 struct sk_buff *skb,
                                  struct ircomm_tty_info *info)
 {
        int ret = 0;
@@ -926,10 +925,10 @@ static int ircomm_tty_state_setup(struct ircomm_tty_cb *self,
        case IRCOMM_TTY_CONNECT_CONFIRM:
                del_timer(&self->watchdog_timer);
                ircomm_tty_ias_unregister(self);
-               
-               /* 
+
+               /*
                 * Send initial parameters. This will also send out queued
-                * parameters waiting for the connection to come up 
+                * parameters waiting for the connection to come up
                 */
                ircomm_tty_send_initial_parameters(self);
                ircomm_tty_link_established(self);
@@ -938,7 +937,7 @@ static int ircomm_tty_state_setup(struct ircomm_tty_cb *self,
        case IRCOMM_TTY_CONNECT_INDICATION:
                del_timer(&self->watchdog_timer);
                ircomm_tty_ias_unregister(self);
-               
+
                /* Accept connection */
                ircomm_connect_response(self->ircomm, NULL);
                ircomm_tty_next_state(self, IRCOMM_TTY_READY);
@@ -966,9 +965,9 @@ static int ircomm_tty_state_setup(struct ircomm_tty_cb *self,
  *    IrCOMM is now connected
  *
  */
-static int ircomm_tty_state_ready(struct ircomm_tty_cb *self, 
-                                 IRCOMM_TTY_EVENT event, 
-                                 struct sk_buff *skb, 
+static int ircomm_tty_state_ready(struct ircomm_tty_cb *self,
+                                 IRCOMM_TTY_EVENT event,
+                                 struct sk_buff *skb,
                                  struct ircomm_tty_info *info)
 {
        int ret = 0;
@@ -976,7 +975,7 @@ static int ircomm_tty_state_ready(struct ircomm_tty_cb *self,
        switch (event) {
        case IRCOMM_TTY_DATA_REQUEST:
                ret = ircomm_data_request(self->ircomm, skb);
-               break;          
+               break;
        case IRCOMM_TTY_DETACH_CABLE:
                ircomm_disconnect_request(self->ircomm, NULL);
                ircomm_tty_next_state(self, IRCOMM_TTY_IDLE);
index 75e39ea599d81147fca02e540eb03f77e3f329d0..6030947b6d93b2d5c171f17714217e4abf5016b7 100644 (file)
@@ -1,36 +1,35 @@
 /*********************************************************************
- *                
+ *
  * Filename:      ircomm_tty_ioctl.c
- * Version:       
- * Description:   
+ * Version:
+ * Description:
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Thu Jun 10 14:39:09 1999
  * Modified at:   Wed Jan  5 14:45:43 2000
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
+ *
  *     Copyright (c) 1999-2000 Dag Brattli, 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 
+ *
+ *     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, 
+ *
+ *     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
- *     
+ *
  ********************************************************************/
 
 #include <linux/init.h>
 #include <linux/fs.h>
-#include <linux/sched.h>
 #include <linux/termios.h>
 #include <linux/tty.h>
 #include <linux/serial.h>
@@ -75,7 +74,7 @@ static void ircomm_tty_change_speed(struct ircomm_tty_cb *self)
        }
        if (cflag & CSTOPB)
                cval |= IRCOMM_2_STOP_BIT;
-       
+
        if (cflag & PARENB)
                cval |= IRCOMM_PARITY_ENABLE;
        if (!(cflag & PARODD))
@@ -88,7 +87,7 @@ static void ircomm_tty_change_speed(struct ircomm_tty_cb *self)
 
        self->settings.data_rate = baud;
        ircomm_param_request(self, IRCOMM_DATA_RATE, FALSE);
-       
+
        /* CTS flow control flag and modem status interrupts */
        if (cflag & CRTSCTS) {
                self->flags |= ASYNC_CTS_FLOW;
@@ -104,7 +103,7 @@ static void ircomm_tty_change_speed(struct ircomm_tty_cb *self)
                self->flags &= ~ASYNC_CHECK_CD;
        else
                self->flags |= ASYNC_CHECK_CD;
-#if 0  
+#if 0
        /*
         * Set up parity check flag
         */
@@ -113,7 +112,7 @@ static void ircomm_tty_change_speed(struct ircomm_tty_cb *self)
                driver->read_status_mask |= LSR_FE | LSR_PE;
        if (I_BRKINT(driver->tty) || I_PARMRK(driver->tty))
                driver->read_status_mask |= LSR_BI;
-       
+
        /*
         * Characters to ignore
         */
@@ -124,17 +123,17 @@ static void ircomm_tty_change_speed(struct ircomm_tty_cb *self)
        if (I_IGNBRK(self->tty)) {
                self->ignore_status_mask |= LSR_BI;
                /*
-                * If we're ignore parity and break indicators, ignore 
+                * If we're ignore parity and break indicators, ignore
                 * overruns too. (For real raw support).
                 */
-               if (I_IGNPAR(self->tty)) 
+               if (I_IGNPAR(self->tty))
                        self->ignore_status_mask |= LSR_OE;
        }
 #endif
        self->settings.data_format = cval;
 
        ircomm_param_request(self, IRCOMM_DATA_FORMAT, FALSE);
-       ircomm_param_request(self, IRCOMM_FLOW_CONTROL, TRUE);
+       ircomm_param_request(self, IRCOMM_FLOW_CONTROL, TRUE);
 }
 
 /*
@@ -145,7 +144,7 @@ static void ircomm_tty_change_speed(struct ircomm_tty_cb *self)
  *    should be prepared to accept the case where old == NULL, and try to
  *    do something rational.
  */
-void ircomm_tty_set_termios(struct tty_struct *tty, 
+void ircomm_tty_set_termios(struct tty_struct *tty,
                            struct ktermios *old_termios)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
@@ -153,8 +152,8 @@ void ircomm_tty_set_termios(struct tty_struct *tty,
 
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
-       if ((cflag == old_termios->c_cflag) && 
-           (RELEVANT_IFLAG(tty->termios->c_iflag) == 
+       if ((cflag == old_termios->c_cflag) &&
+           (RELEVANT_IFLAG(tty->termios->c_iflag) ==
             RELEVANT_IFLAG(old_termios->c_iflag)))
        {
                return;
@@ -168,21 +167,21 @@ void ircomm_tty_set_termios(struct tty_struct *tty,
                self->settings.dte &= ~(IRCOMM_DTR|IRCOMM_RTS);
                ircomm_param_request(self, IRCOMM_DTE, TRUE);
        }
-       
+
        /* Handle transition away from B0 status */
        if (!(old_termios->c_cflag & CBAUD) &&
            (cflag & CBAUD)) {
                self->settings.dte |= IRCOMM_DTR;
-               if (!(tty->termios->c_cflag & CRTSCTS) || 
+               if (!(tty->termios->c_cflag & CRTSCTS) ||
                    !test_bit(TTY_THROTTLED, &tty->flags)) {
                        self->settings.dte |= IRCOMM_RTS;
                }
                ircomm_param_request(self, IRCOMM_DTE, TRUE);
        }
-       
+
        /* Handle turning off CRTSCTS */
        if ((old_termios->c_cflag & CRTSCTS) &&
-           !(tty->termios->c_cflag & CRTSCTS)) 
+           !(tty->termios->c_cflag & CRTSCTS))
        {
                tty->hw_stopped = 0;
                ircomm_tty_start(tty);
@@ -192,7 +191,7 @@ void ircomm_tty_set_termios(struct tty_struct *tty,
 /*
  * Function ircomm_tty_tiocmget (tty, file)
  *
- *    
+ *
  *
  */
 int ircomm_tty_tiocmget(struct tty_struct *tty, struct file *file)
@@ -217,12 +216,12 @@ int ircomm_tty_tiocmget(struct tty_struct *tty, struct file *file)
 /*
  * Function ircomm_tty_tiocmset (tty, file, set, clear)
  *
- *    
+ *
  *
  */
 int ircomm_tty_tiocmset(struct tty_struct *tty, struct file *file,
                        unsigned int set, unsigned int clear)
-{ 
+{
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
 
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
@@ -249,21 +248,21 @@ int ircomm_tty_tiocmset(struct tty_struct *tty, struct file *file,
                self->settings.dte |= IRCOMM_DELTA_DTR;
 
        ircomm_param_request(self, IRCOMM_DTE, TRUE);
-       
+
        return 0;
 }
 
 /*
  * Function get_serial_info (driver, retinfo)
  *
- *    
+ *
  *
  */
 static int ircomm_tty_get_serial_info(struct ircomm_tty_cb *self,
                                      struct serial_struct __user *retinfo)
 {
        struct serial_struct info;
-   
+
        if (!retinfo)
                return -EFAULT;
 
@@ -277,11 +276,11 @@ static int ircomm_tty_get_serial_info(struct ircomm_tty_cb *self,
        info.closing_wait = self->closing_wait;
 
        /* For compatibility  */
-       info.type = PORT_16550A;
-       info.port = 0;
-       info.irq = 0;
+       info.type = PORT_16550A;
+       info.port = 0;
+       info.irq = 0;
        info.xmit_fifo_size = 0;
-       info.hub6 = 0;   
+       info.hub6 = 0;
        info.custom_divisor = 0;
 
        if (copy_to_user(retinfo, &info, sizeof(*retinfo)))
@@ -293,7 +292,7 @@ static int ircomm_tty_get_serial_info(struct ircomm_tty_cb *self,
 /*
  * Function set_serial_info (driver, new_info)
  *
- *    
+ *
  *
  */
 static int ircomm_tty_set_serial_info(struct ircomm_tty_cb *self,
@@ -311,7 +310,7 @@ static int ircomm_tty_set_serial_info(struct ircomm_tty_cb *self,
 
        state = self
        old_state = *self;
-  
+
        if (!capable(CAP_SYS_ADMIN)) {
                if ((new_serial.baud_base != state->settings.data_rate) ||
                    (new_serial.close_delay != state->close_delay) ||
@@ -368,10 +367,10 @@ static int ircomm_tty_set_serial_info(struct ircomm_tty_cb *self,
 /*
  * Function ircomm_tty_ioctl (tty, file, cmd, arg)
  *
- *    
+ *
  *
  */
-int ircomm_tty_ioctl(struct tty_struct *tty, struct file *file, 
+int ircomm_tty_ioctl(struct tty_struct *tty, struct file *file,
                     unsigned int cmd, unsigned long arg)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
@@ -416,7 +415,7 @@ int ircomm_tty_ioctl(struct tty_struct *tty, struct file *file,
                    put_user(cnow.brk, &p_cuser->brk) ||
                    put_user(cnow.buf_overrun, &p_cuser->buf_overrun))
                        return -EFAULT;
-#endif         
+#endif
                return 0;
        default:
                ret = -ENOIOCTLCMD;  /* ioctls which we must ignore */
index 7e7a31798d8d04855fead92b2ebdb444f85ea26a..e717801b38f9c76b345df4ca5a08330e6f392f1b 100644 (file)
@@ -341,11 +341,11 @@ static void irda_task_timer_expired(void *data)
  */
 static void irda_device_setup(struct net_device *dev)
 {
-        dev->hard_header_len = 0;
-        dev->addr_len        = LAP_ALEN;
+       dev->hard_header_len = 0;
+       dev->addr_len        = LAP_ALEN;
 
-        dev->type            = ARPHRD_IRDA;
-        dev->tx_queue_len    = 8; /* Window size + 1 s-frame */
+       dev->type            = ARPHRD_IRDA;
+       dev->tx_queue_len    = 8; /* Window size + 1 s-frame */
 
        memset(dev->broadcast, 0xff, LAP_ALEN);
 
@@ -354,7 +354,7 @@ static void irda_device_setup(struct net_device *dev)
 }
 
 /*
- * Funciton  alloc_irdadev 
+ * Funciton  alloc_irdadev
  *     Allocates and sets up an IRDA device in a manner similar to
  *     alloc_etherdev.
  */
@@ -386,9 +386,9 @@ dongle_t *irda_device_dongle_init(struct net_device *dev, int type)
        /* Try to load the module needed */
        if (!reg && capable(CAP_SYS_MODULE)) {
                spin_unlock(&dongles->hb_spinlock);
-       
+
                request_module("irda-dongle-%d", type);
-               
+
                spin_lock(&dongles->hb_spinlock);
                reg = hashbin_find(dongles, type, NULL);
        }
@@ -438,15 +438,15 @@ int irda_device_register_dongle(struct dongle_reg *new)
        spin_lock(&dongles->hb_spinlock);
        /* Check if this dongle has been registered before */
        if (hashbin_find(dongles, new->type, NULL)) {
-               IRDA_MESSAGE("%s: Dongle type %x already registered\n", 
+               IRDA_MESSAGE("%s: Dongle type %x already registered\n",
                             __FUNCTION__, new->type);
-        } else {
+       } else {
                /* Insert IrDA dongle into hashbin */
                hashbin_insert(dongles, (irda_queue_t *) new, new->type, NULL);
        }
        spin_unlock(&dongles->hb_spinlock);
 
-        return 0;
+       return 0;
 }
 EXPORT_SYMBOL(irda_device_register_dongle);
 
@@ -462,7 +462,7 @@ void irda_device_unregister_dongle(struct dongle_reg *dongle)
 
        spin_lock(&dongles->hb_spinlock);
        node = hashbin_remove(dongles, dongle->type, NULL);
-       if (!node) 
+       if (!node)
                IRDA_ERROR("%s: dongle not found!\n", __FUNCTION__);
        spin_unlock(&dongles->hb_spinlock);
 }
index 8f1c6d65b24786f174bf1dbde831c97a7e7a2e99..915d9384f36a1784fe84f476b4c48f099a82168c 100644 (file)
@@ -79,10 +79,10 @@ static int iriap_data_indication(void *instance, void *sap,
 
 static void iriap_watchdog_timer_expired(void *data);
 
-static inline void iriap_start_watchdog_timer(struct iriap_cb *self, 
-                                             int timeout) 
+static inline void iriap_start_watchdog_timer(struct iriap_cb *self,
+                                             int timeout)
 {
-       irda_start_timer(&self->watchdog_timer, timeout, self, 
+       irda_start_timer(&self->watchdog_timer, timeout, self,
                         iriap_watchdog_timer_expired);
 }
 
@@ -674,7 +674,7 @@ static void iriap_getvaluebyclass_indication(struct iriap_cb *self,
        if (attrib == NULL) {
                IRDA_DEBUG(2, "LM-IAS: Attribute %s not found\n", attr);
                iriap_getvaluebyclass_response(self, obj->id,
-                                              IAS_ATTRIB_UNKNOWN, 
+                                              IAS_ATTRIB_UNKNOWN,
                                               &irias_missing);
                return;
        }
@@ -971,7 +971,7 @@ static const char *ias_value_types[] = {
        "IAS_STRING"
 };
 
-static inline struct ias_object *irias_seq_idx(loff_t pos) 
+static inline struct ias_object *irias_seq_idx(loff_t pos)
 {
        struct ias_object *obj;
 
@@ -980,7 +980,7 @@ static inline struct ias_object *irias_seq_idx(loff_t pos)
                if (pos-- == 0)
                        break;
        }
-               
+
        return obj;
 }
 
@@ -995,7 +995,7 @@ static void *irias_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        ++*pos;
 
-       return (v == SEQ_START_TOKEN) 
+       return (v == SEQ_START_TOKEN)
                ? (void *) hashbin_get_first(irias_objects)
                : (void *) hashbin_get_next(irias_objects);
 }
@@ -1027,7 +1027,7 @@ static int irias_seq_show(struct seq_file *seq, void *v)
                for (attrib = (struct ias_attrib *) hashbin_get_first(obj->attribs);
                     attrib != NULL;
                     attrib = (struct ias_attrib *) hashbin_get_next(obj->attribs)) {
-                    
+
                        IRDA_ASSERT(attrib->magic == IAS_ATTRIB_MAGIC,
                                    goto outloop; );
 
@@ -1046,14 +1046,14 @@ static int irias_seq_show(struct seq_file *seq, void *v)
                                           attrib->value->t.string);
                                break;
                        case IAS_OCT_SEQ:
-                               seq_printf(seq, "octet sequence (%d bytes)\n", 
+                               seq_printf(seq, "octet sequence (%d bytes)\n",
                                           attrib->value->len);
                                break;
                        case IAS_MISSING:
                                seq_puts(seq, "missing\n");
                                break;
                        default:
-                               seq_printf(seq, "type %d?\n", 
+                               seq_printf(seq, "type %d?\n",
                                           attrib->value->type);
                        }
                        seq_putc(seq, '\n');
@@ -1080,7 +1080,7 @@ static int irias_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &irias_seq_ops);
 }
 
-struct file_operations irias_seq_fops = {
+const struct file_operations irias_seq_fops = {
        .owner          = THIS_MODULE,
        .open           = irias_seq_open,
        .read           = seq_read,
index 2a571b43ebec78c60215773eaac9109cd34fd83c..4adaae242b9e44b422b46f1fe3b4fd8422db1b0d 100644 (file)
@@ -57,8 +57,8 @@ static char *strndup(char *str, size_t max)
                len = max;
 
        /* Allocate new string */
-        new_str = kmalloc(len + 1, GFP_ATOMIC);
-        if (new_str == NULL) {
+       new_str = kmalloc(len + 1, GFP_ATOMIC);
+       if (new_str == NULL) {
                IRDA_WARNING("%s: Unable to kmalloc!\n", __FUNCTION__);
                return NULL;
        }
@@ -78,7 +78,7 @@ static char *strndup(char *str, size_t max)
  */
 struct ias_object *irias_new_object( char *name, int id)
 {
-        struct ias_object *obj;
+       struct ias_object *obj;
 
        IRDA_DEBUG( 4, "%s()\n", __FUNCTION__);
 
index 95cf1234ea17ff2e88a088c3da5766361bbaa7e4..a4c1c954582787ced123a932d0c3f8acc5b48f18 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      irlan_client.c
  * Version:       0.9
  * Description:   IrDA LAN Access Protocol (IrLAN) Client
  * Sources:       skeleton.c by Donald Becker <becker@CESDIS.gsfc.nasa.gov>
  *                slip.c by Laurence Culhane, <loz@holmes.demon.co.uk>
  *                          Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
- * 
- *     Copyright (c) 1998-1999 Dag Brattli <dagb@cs.uit.no>, 
+ *
+ *     Copyright (c) 1998-1999 Dag Brattli <dagb@cs.uit.no>,
  *     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 
+ *
+ *     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.
  *
  *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
+ *     provide warranty for any of this software. This material is
  *     provided "AS-IS" and at no charge.
  *
  ********************************************************************/
 
 #undef CONFIG_IRLAN_GRATUITOUS_ARP
 
-static void irlan_client_ctrl_disconnect_indication(void *instance, void *sap, 
-                                                   LM_REASON reason, 
+static void irlan_client_ctrl_disconnect_indication(void *instance, void *sap,
+                                                   LM_REASON reason,
                                                    struct sk_buff *);
-static int irlan_client_ctrl_data_indication(void *instance, void *sap, 
+static int irlan_client_ctrl_data_indication(void *instance, void *sap,
                                             struct sk_buff *skb);
-static void irlan_client_ctrl_connect_confirm(void *instance, void *sap, 
-                                             struct qos_info *qos, 
+static void irlan_client_ctrl_connect_confirm(void *instance, void *sap,
+                                             struct qos_info *qos,
                                              __u32 max_sdu_size,
                                              __u8 max_header_size,
                                              struct sk_buff *);
-static void irlan_check_response_param(struct irlan_cb *self, char *param, 
+static void irlan_check_response_param(struct irlan_cb *self, char *param,
                                       char *value, int val_len);
 static void irlan_client_open_ctrl_tsap(struct irlan_cb *self);
 
 static void irlan_client_kick_timer_expired(void *data)
 {
        struct irlan_cb *self = (struct irlan_cb *) data;
-       
+
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
-       
-       /*  
+
+       /*
         * If we are in peer mode, the client may not have got the discovery
-        * indication it needs to make progress. If the client is still in 
+        * indication it needs to make progress. If the client is still in
         * IDLE state, we must kick it to, but only if the provider is not IDLE
-        */
-       if ((self->provider.access_type == ACCESS_PEER) && 
+        */
+       if ((self->provider.access_type == ACCESS_PEER) &&
            (self->client.state == IRLAN_IDLE) &&
            (self->provider.state != IRLAN_IDLE)) {
                irlan_client_wakeup(self, self->saddr, self->daddr);
@@ -92,8 +92,8 @@ static void irlan_client_kick_timer_expired(void *data)
 static void irlan_client_start_kick_timer(struct irlan_cb *self, int timeout)
 {
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
-       
-       irda_start_timer(&self->client.kick_timer, timeout, (void *) self, 
+
+       irda_start_timer(&self->client.kick_timer, timeout, (void *) self,
                         irlan_client_kick_timer_expired);
 }
 
@@ -110,11 +110,11 @@ void irlan_client_wakeup(struct irlan_cb *self, __u32 saddr, __u32 daddr)
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
 
-       /* 
+       /*
         * Check if we are already awake, or if we are a provider in direct
         * mode (in that case we must leave the client idle
         */
-       if ((self->client.state != IRLAN_IDLE) || 
+       if ((self->client.state != IRLAN_IDLE) ||
            (self->provider.access_type == ACCESS_DIRECT))
        {
                        IRDA_DEBUG(0, "%s(), already awake!\n", __FUNCTION__ );
@@ -135,7 +135,7 @@ void irlan_client_wakeup(struct irlan_cb *self, __u32 saddr, __u32 daddr)
        irlan_open_data_tsap(self);
 
        irlan_do_client_event(self, IRLAN_DISCOVERY_INDICATION, NULL);
-       
+
        /* Start kick timer */
        irlan_client_start_kick_timer(self, 2*HZ);
 }
@@ -148,11 +148,11 @@ void irlan_client_wakeup(struct irlan_cb *self, __u32 saddr, __u32 daddr)
  */
 void irlan_client_discovery_indication(discinfo_t *discovery,
                                       DISCOVERY_MODE mode,
-                                      void *priv) 
+                                      void *priv)
 {
        struct irlan_cb *self;
        __u32 saddr, daddr;
-       
+
        IRDA_DEBUG(1, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(discovery != NULL, return;);
@@ -177,35 +177,35 @@ void irlan_client_discovery_indication(discinfo_t *discovery,
 
                IRDA_DEBUG(1, "%s(), Found instance (%08x)!\n", __FUNCTION__ ,
                      daddr);
-               
+
                irlan_client_wakeup(self, saddr, daddr);
        }
 IRDA_ASSERT_LABEL(out:)
        rcu_read_unlock();
 }
-       
+
 /*
  * Function irlan_client_data_indication (handle, skb)
  *
  *    This function gets the data that is received on the control channel
  *
  */
-static int irlan_client_ctrl_data_indication(void *instance, void *sap, 
+static int irlan_client_ctrl_data_indication(void *instance, void *sap,
                                             struct sk_buff *skb)
 {
        struct irlan_cb *self;
-       
+
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
-       
+
        self = (struct irlan_cb *) instance;
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return -1;);
        IRDA_ASSERT(skb != NULL, return -1;);
-       
-       irlan_do_client_event(self, IRLAN_DATA_INDICATION, skb); 
 
-       /* Ready for a new command */   
+       irlan_do_client_event(self, IRLAN_DATA_INDICATION, skb);
+
+       /* Ready for a new command */
        IRDA_DEBUG(2, "%s(), clearing tx_busy\n", __FUNCTION__ );
        self->client.tx_busy = FALSE;
 
@@ -215,27 +215,27 @@ static int irlan_client_ctrl_data_indication(void *instance, void *sap,
        return 0;
 }
 
-static void irlan_client_ctrl_disconnect_indication(void *instance, void *sap, 
-                                                   LM_REASON reason, 
-                                                   struct sk_buff *userdata) 
+static void irlan_client_ctrl_disconnect_indication(void *instance, void *sap,
+                                                   LM_REASON reason,
+                                                   struct sk_buff *userdata)
 {
        struct irlan_cb *self;
        struct tsap_cb *tsap;
        struct sk_buff *skb;
 
        IRDA_DEBUG(4, "%s(), reason=%d\n", __FUNCTION__ , reason);
-       
+
        self = (struct irlan_cb *) instance;
        tsap = (struct tsap_cb *) sap;
 
        IRDA_ASSERT(self != NULL, return;);
-       IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);       
+       IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
        IRDA_ASSERT(tsap != NULL, return;);
        IRDA_ASSERT(tsap->magic == TTP_TSAP_MAGIC, return;);
-       
+
        IRDA_ASSERT(tsap == self->client.tsap_ctrl, return;);
 
-               /* Remove frames queued on the control channel */
+       /* Remove frames queued on the control channel */
        while ((skb = skb_dequeue(&self->client.txq)) != NULL) {
                dev_kfree_skb(skb);
        }
@@ -272,7 +272,7 @@ static void irlan_client_open_ctrl_tsap(struct irlan_cb *self)
        notify.disconnect_indication = irlan_client_ctrl_disconnect_indication;
        notify.instance = self;
        strlcpy(notify.name, "IrLAN ctrl (c)", sizeof(notify.name));
-       
+
        tsap = irttp_open_tsap(LSAP_ANY, DEFAULT_INITIAL_CREDIT, &notify);
        if (!tsap) {
                IRDA_DEBUG(2, "%s(), Got no tsap!\n", __FUNCTION__ );
@@ -287,11 +287,11 @@ static void irlan_client_open_ctrl_tsap(struct irlan_cb *self)
  *    Connection to peer IrLAN laye confirmed
  *
  */
-static void irlan_client_ctrl_connect_confirm(void *instance, void *sap, 
-                                             struct qos_info *qos, 
+static void irlan_client_ctrl_connect_confirm(void *instance, void *sap,
+                                             struct qos_info *qos,
                                              __u32 max_sdu_size,
                                              __u8 max_header_size,
-                                             struct sk_buff *skb) 
+                                             struct sk_buff *skb)
 {
        struct irlan_cb *self;
 
@@ -316,7 +316,7 @@ static void irlan_client_ctrl_connect_confirm(void *instance, void *sap,
  *    Print return code of request to peer IrLAN layer.
  *
  */
-static void print_ret_code(__u8 code) 
+static void print_ret_code(__u8 code)
 {
        switch(code) {
        case 0:
@@ -358,7 +358,7 @@ static void print_ret_code(__u8 code)
 /*
  * Function irlan_client_parse_response (self, skb)
  *
- *    Extract all parameters from received buffer, then feed them to 
+ *    Extract all parameters from received buffer, then feed them to
  *    check_params for parsing
  */
 void irlan_client_parse_response(struct irlan_cb *self, struct sk_buff *skb)
@@ -369,30 +369,30 @@ void irlan_client_parse_response(struct irlan_cb *self, struct sk_buff *skb)
        int ret;
        __u16 val_len;
        int i;
-        char *name;
-        char *value;
+       char *name;
+       char *value;
+
+       IRDA_ASSERT(skb != NULL, return;);
 
-       IRDA_ASSERT(skb != NULL, return;);      
-       
        IRDA_DEBUG(4, "%s() skb->len=%d\n", __FUNCTION__ , (int) skb->len);
-       
+
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
-       
+
        if (!skb) {
                IRDA_ERROR("%s(), Got NULL skb!\n", __FUNCTION__);
                return;
        }
        frame = skb->data;
-       
-       /* 
-        *  Check return code and print it if not success 
+
+       /*
+        *  Check return code and print it if not success
         */
        if (frame[0]) {
                print_ret_code(frame[0]);
                return;
        }
-       
+
        name = kmalloc(255, GFP_ATOMIC);
        if (!name)
                return;
@@ -406,11 +406,11 @@ void irlan_client_parse_response(struct irlan_cb *self, struct sk_buff *skb)
        count = frame[1];
 
        IRDA_DEBUG(4, "%s(), got %d parameters\n", __FUNCTION__ , count);
-       
+
        ptr = frame+2;
 
        /* For all parameters */
-       for (i=0; i<count;i++) {
+       for (i=0; i<count;i++) {
                ret = irlan_extract_param(ptr, name, value, &val_len);
                if (ret < 0) {
                        IRDA_DEBUG(2, "%s(), IrLAN, Error!\n", __FUNCTION__ );
@@ -418,7 +418,7 @@ void irlan_client_parse_response(struct irlan_cb *self, struct sk_buff *skb)
                }
                ptr += ret;
                irlan_check_response_param(self, name, value, val_len);
-       }
+       }
        /* Cleanup */
        kfree(name);
        kfree(value);
@@ -430,8 +430,8 @@ void irlan_client_parse_response(struct irlan_cb *self, struct sk_buff *skb)
  *     Check which parameter is received and update local variables
  *
  */
-static void irlan_check_response_param(struct irlan_cb *self, char *param, 
-                                      char *value, int val_len) 
+static void irlan_check_response_param(struct irlan_cb *self, char *param,
+                                      char *value, int val_len)
 {
        __u16 tmp_cpu; /* Temporary value in host order */
        __u8 *bytes;
@@ -465,7 +465,7 @@ static void irlan_check_response_param(struct irlan_cb *self, char *param,
                        self->client.filter_type |= IRLAN_BROADCAST;
                else if (strcmp(value, "IPX_SOCKET") == 0)
                        self->client.filter_type |= IRLAN_IPX_SOCKET;
-               
+
        }
        if (strcmp(param, "ACCESS_TYPE") == 0) {
                if (strcmp(value, "DIRECT") == 0)
@@ -480,7 +480,7 @@ static void irlan_check_response_param(struct irlan_cb *self, char *param,
        }
        /* IRLAN version */
        if (strcmp(param, "IRLAN_VER") == 0) {
-               IRDA_DEBUG(4, "IrLAN version %d.%d\n", (__u8) value[0], 
+               IRDA_DEBUG(4, "IrLAN version %d.%d\n", (__u8) value[0],
                      (__u8) value[1]);
 
                self->version[0] = value[0];
@@ -497,17 +497,17 @@ static void irlan_check_response_param(struct irlan_cb *self, char *param,
                memcpy(&tmp_cpu, value, 2); /* Align value */
                le16_to_cpus(&tmp_cpu);     /* Convert to host order */
                self->client.recv_arb_val = tmp_cpu;
-               IRDA_DEBUG(2, "%s(), receive arb val=%d\n", __FUNCTION__ , 
+               IRDA_DEBUG(2, "%s(), receive arb val=%d\n", __FUNCTION__ ,
                           self->client.recv_arb_val);
        }
        if (strcmp(param, "MAX_FRAME") == 0) {
                memcpy(&tmp_cpu, value, 2); /* Align value */
                le16_to_cpus(&tmp_cpu);     /* Convert to host order */
                self->client.max_frame = tmp_cpu;
-               IRDA_DEBUG(4, "%s(), max frame=%d\n", __FUNCTION__ , 
+               IRDA_DEBUG(4, "%s(), max frame=%d\n", __FUNCTION__ ,
                           self->client.max_frame);
        }
-        
+
        /* RECONNECT_KEY, in case the link goes down! */
        if (strcmp(param, "RECONNECT_KEY") == 0) {
                IRDA_DEBUG(4, "Got reconnect key: ");
@@ -521,9 +521,9 @@ static void irlan_check_response_param(struct irlan_cb *self, char *param,
        if (strcmp(param, "FILTER_ENTRY") == 0) {
                bytes = value;
                IRDA_DEBUG(4, "Ethernet address = %02x:%02x:%02x:%02x:%02x:%02x\n",
-                     bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], 
+                     bytes[0], bytes[1], bytes[2], bytes[3], bytes[4],
                      bytes[5]);
-               for (i = 0; i < 6; i++) 
+               for (i = 0; i < 6; i++)
                        self->dev->dev_addr[i] = bytes[i];
        }
 }
@@ -534,11 +534,11 @@ static void irlan_check_response_param(struct irlan_cb *self, char *param,
  *    Got results from remote LM-IAS
  *
  */
-void irlan_client_get_value_confirm(int result, __u16 obj_id, 
-                                   struct ias_value *value, void *priv) 
+void irlan_client_get_value_confirm(int result, __u16 obj_id,
+                                   struct ias_value *value, void *priv)
 {
        struct irlan_cb *self;
-       
+
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(priv != NULL, return;);
@@ -553,7 +553,7 @@ void irlan_client_get_value_confirm(int result, __u16 obj_id,
        /* Check if request succeeded */
        if (result != IAS_SUCCESS) {
                IRDA_DEBUG(2, "%s(), got NULL value!\n", __FUNCTION__ );
-               irlan_do_client_event(self, IRLAN_IAS_PROVIDER_NOT_AVAIL, 
+               irlan_do_client_event(self, IRLAN_IAS_PROVIDER_NOT_AVAIL,
                                      NULL);
                return;
        }
index ce943b69e9961441b3ef9d541061b585722f1a67..843ab6fbb394b17065f35e01b74162a653e69a69 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      irlan_client_event.c
  * Version:       0.9
  * Description:   IrLAN client state machine
@@ -8,17 +8,17 @@
  * Created at:    Sun Aug 31 20:14:37 1997
  * Modified at:   Sun Dec 26 21:52:24 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
- *     Copyright (c) 1998-1999 Dag Brattli <dagb@cs.uit.no>, 
+ *
+ *     Copyright (c) 1998-1999 Dag Brattli <dagb@cs.uit.no>,
  *     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 
+ *
+ *     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.
  *
  *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
+ *     provide warranty for any of this software. This material is
  *     provided "AS-IS" and at no charge.
  *
  ********************************************************************/
 #include <net/irda/irlan_client.h>
 #include <net/irda/irlan_event.h>
 
-static int irlan_client_state_idle (struct irlan_cb *self, IRLAN_EVENT event, 
+static int irlan_client_state_idle (struct irlan_cb *self, IRLAN_EVENT event,
                                    struct sk_buff *skb);
-static int irlan_client_state_query(struct irlan_cb *self, IRLAN_EVENT event, 
+static int irlan_client_state_query(struct irlan_cb *self, IRLAN_EVENT event,
                                    struct sk_buff *skb);
-static int irlan_client_state_conn (struct irlan_cb *self, IRLAN_EVENT event, 
+static int irlan_client_state_conn (struct irlan_cb *self, IRLAN_EVENT event,
                                    struct sk_buff *skb);
-static int irlan_client_state_info (struct irlan_cb *self, IRLAN_EVENT event, 
+static int irlan_client_state_info (struct irlan_cb *self, IRLAN_EVENT event,
                                    struct sk_buff *skb);
-static int irlan_client_state_media(struct irlan_cb *self, IRLAN_EVENT event, 
+static int irlan_client_state_media(struct irlan_cb *self, IRLAN_EVENT event,
                                    struct sk_buff *skb);
-static int irlan_client_state_open (struct irlan_cb *self, IRLAN_EVENT event, 
+static int irlan_client_state_open (struct irlan_cb *self, IRLAN_EVENT event,
                                    struct sk_buff *skb);
-static int irlan_client_state_wait (struct irlan_cb *self, IRLAN_EVENT event, 
+static int irlan_client_state_wait (struct irlan_cb *self, IRLAN_EVENT event,
                                    struct sk_buff *skb);
-static int irlan_client_state_arb  (struct irlan_cb *self, IRLAN_EVENT event, 
+static int irlan_client_state_arb  (struct irlan_cb *self, IRLAN_EVENT event,
                                    struct sk_buff *skb);
-static int irlan_client_state_data (struct irlan_cb *self, IRLAN_EVENT event, 
+static int irlan_client_state_data (struct irlan_cb *self, IRLAN_EVENT event,
                                    struct sk_buff *skb);
-static int irlan_client_state_close(struct irlan_cb *self, IRLAN_EVENT event, 
+static int irlan_client_state_close(struct irlan_cb *self, IRLAN_EVENT event,
                                    struct sk_buff *skb);
-static int irlan_client_state_sync (struct irlan_cb *self, IRLAN_EVENT event, 
+static int irlan_client_state_sync (struct irlan_cb *self, IRLAN_EVENT event,
                                    struct sk_buff *skb);
 
 static int (*state[])(struct irlan_cb *, IRLAN_EVENT event, struct sk_buff *) =
-{ 
+{
        irlan_client_state_idle,
        irlan_client_state_query,
        irlan_client_state_conn,
@@ -74,8 +74,8 @@ static int (*state[])(struct irlan_cb *, IRLAN_EVENT event, struct sk_buff *) =
        irlan_client_state_sync
 };
 
-void irlan_do_client_event(struct irlan_cb *self, IRLAN_EVENT event, 
-                          struct sk_buff *skb) 
+void irlan_do_client_event(struct irlan_cb *self, IRLAN_EVENT event,
+                          struct sk_buff *skb)
 {
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
@@ -89,14 +89,14 @@ void irlan_do_client_event(struct irlan_cb *self, IRLAN_EVENT event,
  *    IDLE, We are waiting for an indication that there is a provider
  *    available.
  */
-static int irlan_client_state_idle(struct irlan_cb *self, IRLAN_EVENT event, 
-                                  struct sk_buff *skb) 
+static int irlan_client_state_idle(struct irlan_cb *self, IRLAN_EVENT event,
+                                  struct sk_buff *skb)
 {
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return -1;);
-       
+
        switch (event) {
        case IRLAN_DISCOVERY_INDICATION:
                if (self->client.iriap) {
@@ -104,7 +104,7 @@ static int irlan_client_state_idle(struct irlan_cb *self, IRLAN_EVENT event,
                                     __FUNCTION__);
                        return -EBUSY;
                }
-               
+
                self->client.iriap = iriap_open(LSAP_ANY, IAS_CLIENT, self,
                                                irlan_client_get_value_confirm);
                /* Get some values from peer IAS */
@@ -120,7 +120,7 @@ static int irlan_client_state_idle(struct irlan_cb *self, IRLAN_EVENT event,
                IRDA_DEBUG(4, "%s(), Unknown event %d\n", __FUNCTION__ , event);
                break;
        }
-       if (skb) 
+       if (skb)
                dev_kfree_skb(skb);
 
        return 0;
@@ -133,23 +133,23 @@ static int irlan_client_state_idle(struct irlan_cb *self, IRLAN_EVENT event,
  *    to provider, just waiting for the confirm.
  *
  */
-static int irlan_client_state_query(struct irlan_cb *self, IRLAN_EVENT event, 
-                                   struct sk_buff *skb) 
+static int irlan_client_state_query(struct irlan_cb *self, IRLAN_EVENT event,
+                                   struct sk_buff *skb)
 {
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return -1;);
-       
+
        switch(event) {
        case IRLAN_IAS_PROVIDER_AVAIL:
                IRDA_ASSERT(self->dtsap_sel_ctrl != 0, return -1;);
 
                self->client.open_retries = 0;
-               
-               irttp_connect_request(self->client.tsap_ctrl, 
-                                     self->dtsap_sel_ctrl, 
-                                     self->saddr, self->daddr, NULL, 
+
+               irttp_connect_request(self->client.tsap_ctrl,
+                                     self->dtsap_sel_ctrl,
+                                     self->saddr, self->daddr, NULL,
                                      IRLAN_MTU, NULL);
                irlan_next_client_state(self, IRLAN_CONN);
                break;
@@ -158,7 +158,7 @@ static int irlan_client_state_query(struct irlan_cb *self, IRLAN_EVENT event,
                irlan_next_client_state(self, IRLAN_IDLE);
 
                /* Give the client a kick! */
-               if ((self->provider.access_type == ACCESS_PEER) && 
+               if ((self->provider.access_type == ACCESS_PEER) &&
                    (self->provider.state != IRLAN_IDLE))
                        irlan_client_wakeup(self, self->saddr, self->daddr);
                break;
@@ -175,7 +175,7 @@ static int irlan_client_state_query(struct irlan_cb *self, IRLAN_EVENT event,
        }
        if (skb)
                dev_kfree_skb(skb);
-       
+
        return 0;
 }
 
@@ -186,13 +186,13 @@ static int irlan_client_state_query(struct irlan_cb *self, IRLAN_EVENT event,
  *    commands yet.
  *
  */
-static int irlan_client_state_conn(struct irlan_cb *self, IRLAN_EVENT event, 
-                                  struct sk_buff *skb) 
+static int irlan_client_state_conn(struct irlan_cb *self, IRLAN_EVENT event,
+                                  struct sk_buff *skb)
 {
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
-       
+
        switch (event) {
        case IRLAN_CONNECT_COMPLETE:
                /* Send getinfo cmd */
@@ -212,7 +212,7 @@ static int irlan_client_state_conn(struct irlan_cb *self, IRLAN_EVENT event,
        }
        if (skb)
                dev_kfree_skb(skb);
-       
+
        return 0;
 }
 
@@ -221,24 +221,24 @@ static int irlan_client_state_conn(struct irlan_cb *self, IRLAN_EVENT event,
  *
  *    INFO, We have issued a GetInfo command and is awaiting a reply.
  */
-static int irlan_client_state_info(struct irlan_cb *self, IRLAN_EVENT event, 
-                                  struct sk_buff *skb) 
+static int irlan_client_state_info(struct irlan_cb *self, IRLAN_EVENT event,
+                                  struct sk_buff *skb)
 {
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(self != NULL, return -1;);
-       
+
        switch (event) {
        case IRLAN_DATA_INDICATION:
                IRDA_ASSERT(skb != NULL, return -1;);
-       
+
                irlan_client_parse_response(self, skb);
-               
+
                irlan_next_client_state(self, IRLAN_MEDIA);
-               
+
                irlan_get_media_char(self);
                break;
-               
+
        case IRLAN_LMP_DISCONNECT:
        case IRLAN_LAP_DISCONNECT:
                irlan_next_client_state(self, IRLAN_IDLE);
@@ -252,7 +252,7 @@ static int irlan_client_state_info(struct irlan_cb *self, IRLAN_EVENT event,
        }
        if (skb)
                dev_kfree_skb(skb);
-       
+
        return 0;
 }
 
@@ -263,11 +263,11 @@ static int irlan_client_state_info(struct irlan_cb *self, IRLAN_EVENT event,
  *    reply.
  *
  */
-static int irlan_client_state_media(struct irlan_cb *self, IRLAN_EVENT event, 
-                                   struct sk_buff *skb) 
+static int irlan_client_state_media(struct irlan_cb *self, IRLAN_EVENT event,
+                                   struct sk_buff *skb)
 {
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
 
        switch(event) {
@@ -289,7 +289,7 @@ static int irlan_client_state_media(struct irlan_cb *self, IRLAN_EVENT event,
        }
        if (skb)
                dev_kfree_skb(skb);
-       
+
        return 0;
 }
 
@@ -300,47 +300,47 @@ static int irlan_client_state_media(struct irlan_cb *self, IRLAN_EVENT event,
  *    reply
  *
  */
-static int irlan_client_state_open(struct irlan_cb *self, IRLAN_EVENT event, 
-                                  struct sk_buff *skb) 
+static int irlan_client_state_open(struct irlan_cb *self, IRLAN_EVENT event,
+                                  struct sk_buff *skb)
 {
        struct qos_info qos;
 
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
 
        switch(event) {
        case IRLAN_DATA_INDICATION:
                irlan_client_parse_response(self, skb);
-               
+
                /*
-                *  Check if we have got the remote TSAP for data 
+                *  Check if we have got the remote TSAP for data
                 *  communications
                 */
-               IRDA_ASSERT(self->dtsap_sel_data != 0, return -1;);
+               IRDA_ASSERT(self->dtsap_sel_data != 0, return -1;);
 
                /* Check which access type we are dealing with */
                switch (self->client.access_type) {
                case ACCESS_PEER:
                    if (self->provider.state == IRLAN_OPEN) {
-                           
+
                            irlan_next_client_state(self, IRLAN_ARB);
-                           irlan_do_client_event(self, IRLAN_CHECK_CON_ARB, 
+                           irlan_do_client_event(self, IRLAN_CHECK_CON_ARB,
                                                  NULL);
                    } else {
-                       
+
                            irlan_next_client_state(self, IRLAN_WAIT);
                    }
                    break;
                case ACCESS_DIRECT:
                case ACCESS_HOSTED:
                        qos.link_disc_time.bits = 0x01; /* 3 secs */
-                       
-                       irttp_connect_request(self->tsap_data, 
-                                             self->dtsap_sel_data, 
-                                             self->saddr, self->daddr, &qos, 
+
+                       irttp_connect_request(self->tsap_data,
+                                             self->dtsap_sel_data,
+                                             self->saddr, self->daddr, &qos,
                                              IRLAN_MTU, NULL);
-                       
+
                        irlan_next_client_state(self, IRLAN_DATA);
                        break;
                default:
@@ -359,7 +359,7 @@ static int irlan_client_state_open(struct irlan_cb *self, IRLAN_EVENT event,
                IRDA_DEBUG(2, "%s(), Unknown event %d\n", __FUNCTION__ , event);
                break;
        }
-       
+
        if (skb)
                dev_kfree_skb(skb);
 
@@ -373,13 +373,13 @@ static int irlan_client_state_open(struct irlan_cb *self, IRLAN_EVENT event,
  *    provider OPEN state.
  *
  */
-static int irlan_client_state_wait(struct irlan_cb *self, IRLAN_EVENT event, 
-                                  struct sk_buff *skb) 
+static int irlan_client_state_wait(struct irlan_cb *self, IRLAN_EVENT event,
+                                  struct sk_buff *skb)
 {
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
-       
+
        switch(event) {
        case IRLAN_PROVIDER_SIGNAL:
                irlan_next_client_state(self, IRLAN_ARB);
@@ -398,36 +398,36 @@ static int irlan_client_state_wait(struct irlan_cb *self, IRLAN_EVENT event,
        }
        if (skb)
                dev_kfree_skb(skb);
-       
+
        return 0;
 }
 
-static int irlan_client_state_arb(struct irlan_cb *self, IRLAN_EVENT event, 
-                                 struct sk_buff *skb) 
+static int irlan_client_state_arb(struct irlan_cb *self, IRLAN_EVENT event,
+                                 struct sk_buff *skb)
 {
        struct qos_info qos;
 
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(self != NULL, return -1;);
-       
+
        switch(event) {
        case IRLAN_CHECK_CON_ARB:
                if (self->client.recv_arb_val == self->provider.send_arb_val) {
                        irlan_next_client_state(self, IRLAN_CLOSE);
                        irlan_close_data_channel(self);
-               } else if (self->client.recv_arb_val < 
-                          self->provider.send_arb_val) 
+               } else if (self->client.recv_arb_val <
+                          self->provider.send_arb_val)
                {
                        qos.link_disc_time.bits = 0x01; /* 3 secs */
 
                        irlan_next_client_state(self, IRLAN_DATA);
-                       irttp_connect_request(self->tsap_data, 
-                                             self->dtsap_sel_data, 
-                                             self->saddr, self->daddr, &qos, 
+                       irttp_connect_request(self->tsap_data,
+                                             self->dtsap_sel_data,
+                                             self->saddr, self->daddr, &qos,
                                              IRLAN_MTU, NULL);
                } else if (self->client.recv_arb_val >
-                          self->provider.send_arb_val) 
+                          self->provider.send_arb_val)
                {
                        IRDA_DEBUG(2, "%s(), lost the battle :-(\n", __FUNCTION__ );
                }
@@ -448,7 +448,7 @@ static int irlan_client_state_arb(struct irlan_cb *self, IRLAN_EVENT event,
        }
        if (skb)
                dev_kfree_skb(skb);
-       
+
        return 0;
 }
 
@@ -459,8 +459,8 @@ static int irlan_client_state_arb(struct irlan_cb *self, IRLAN_EVENT event,
  *    the local and remote machines.
  *
  */
-static int irlan_client_state_data(struct irlan_cb *self, IRLAN_EVENT event, 
-                                  struct sk_buff *skb) 
+static int irlan_client_state_data(struct irlan_cb *self, IRLAN_EVENT event,
+                                  struct sk_buff *skb)
 {
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
 
@@ -470,7 +470,7 @@ static int irlan_client_state_data(struct irlan_cb *self, IRLAN_EVENT event,
        switch(event) {
        case IRLAN_DATA_INDICATION:
                irlan_client_parse_response(self, skb);
-               break;          
+               break;
        case IRLAN_LMP_DISCONNECT: /* FALLTHROUGH */
        case IRLAN_LAP_DISCONNECT:
                irlan_next_client_state(self, IRLAN_IDLE);
@@ -481,18 +481,18 @@ static int irlan_client_state_data(struct irlan_cb *self, IRLAN_EVENT event,
        }
        if (skb)
                dev_kfree_skb(skb);
-       
+
        return 0;
 }
 
 /*
  * Function irlan_client_state_close (self, event, skb, info)
  *
- *    
+ *
  *
  */
-static int irlan_client_state_close(struct irlan_cb *self, IRLAN_EVENT event, 
-                                   struct sk_buff *skb) 
+static int irlan_client_state_close(struct irlan_cb *self, IRLAN_EVENT event,
+                                   struct sk_buff *skb)
 {
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
@@ -505,17 +505,17 @@ static int irlan_client_state_close(struct irlan_cb *self, IRLAN_EVENT event,
 /*
  * Function irlan_client_state_sync (self, event, skb, info)
  *
- *    
+ *
  *
  */
-static int irlan_client_state_sync(struct irlan_cb *self, IRLAN_EVENT event, 
-                                  struct sk_buff *skb) 
+static int irlan_client_state_sync(struct irlan_cb *self, IRLAN_EVENT event,
+                                  struct sk_buff *skb)
 {
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
-       
+
        if (skb)
                dev_kfree_skb(skb);
-       
+
        return 0;
 }
 
index 310776dd61094225ad9020d093b227bde66c5dfc..fcf9d6599628cdba2d2e52b937d1f1e0f96ead0e 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      irlan_common.c
  * Version:       0.9
  * Description:   IrDA LAN Access Protocol Implementation
@@ -8,17 +8,17 @@
  * Created at:    Sun Aug 31 20:14:37 1997
  * Modified at:   Sun Dec 26 21:53:10 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
- *     Copyright (c) 1997, 1999 Dag Brattli <dagb@cs.uit.no>, 
+ *
+ *     Copyright (c) 1997, 1999 Dag Brattli <dagb@cs.uit.no>,
  *     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 
+ *
+ *     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.
  *
  *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
+ *     provide warranty for any of this software. This material is
  *     provided "AS-IS" and at no charge.
  *
  ********************************************************************/
 
 #include <net/irda/irlan_common.h>
 #include <net/irda/irlan_client.h>
-#include <net/irda/irlan_provider.h> 
+#include <net/irda/irlan_provider.h>
 #include <net/irda/irlan_eth.h>
 #include <net/irda/irlan_filter.h>
 
 
-/* 
+/*
  * Send gratuitous ARP when connected to a new AP or not. May be a clever
  * thing to do, but for some reason the machine crashes if you use DHCP. So
  * lets not use it by default.
@@ -93,7 +93,7 @@ extern struct proc_dir_entry *proc_irda;
 
 static int irlan_seq_open(struct inode *inode, struct file *file);
 
-static struct file_operations irlan_fops = {
+static const struct file_operations irlan_fops = {
        .owner   = THIS_MODULE,
        .open    = irlan_seq_open,
        .read    = seq_read,
@@ -106,8 +106,8 @@ extern struct proc_dir_entry *proc_irda;
 
 static struct irlan_cb *irlan_open(__u32 saddr, __u32 daddr);
 static void __irlan_close(struct irlan_cb *self);
-static int __irlan_insert_param(struct sk_buff *skb, char *param, int type, 
-                               __u8 value_byte, __u16 value_short, 
+static int __irlan_insert_param(struct sk_buff *skb, char *param, int type,
+                               __u8 value_byte, __u16 value_short,
                                __u8 *value_array, __u16 value_len);
 static void irlan_open_unicast_addr(struct irlan_cb *self);
 static void irlan_get_unicast_addr(struct irlan_cb *self);
@@ -177,7 +177,7 @@ err_ckey:
        return -ENOMEM;
 }
 
-static void __exit irlan_cleanup(void) 
+static void __exit irlan_cleanup(void)
 {
        struct irlan_cb *self, *next;
 
@@ -201,7 +201,7 @@ static void __exit irlan_cleanup(void)
 /*
  * Function irlan_open (void)
  *
- *    Open new instance of a client/provider, we should only register the 
+ *    Open new instance of a client/provider, we should only register the
  *    network device if this instance is ment for a particular client/provider
  */
 static struct irlan_cb *irlan_open(__u32 saddr, __u32 daddr)
@@ -229,9 +229,9 @@ static struct irlan_cb *irlan_open(__u32 saddr, __u32 daddr)
        /* Provider access can only be PEER, DIRECT, or HOSTED */
        self->provider.access_type = access;
        if (access == ACCESS_DIRECT) {
-               /*  
+               /*
                 * Since we are emulating an IrLAN sever we will have to
-                * give ourself an ethernet address!  
+                * give ourself an ethernet address!
                 */
                dev->dev_addr[0] = 0x40;
                dev->dev_addr[1] = 0x00;
@@ -245,15 +245,15 @@ static struct irlan_cb *irlan_open(__u32 saddr, __u32 daddr)
        self->disconnect_reason = LM_USER_REQUEST;
        init_timer(&self->watchdog_timer);
        init_timer(&self->client.kick_timer);
-       init_waitqueue_head(&self->open_wait);  
-       
+       init_waitqueue_head(&self->open_wait);
+
        skb_queue_head_init(&self->client.txq);
-       
+
        irlan_next_client_state(self, IRLAN_IDLE);
        irlan_next_provider_state(self, IRLAN_IDLE);
 
        if (register_netdev(dev)) {
-               IRDA_DEBUG(2, "%s(), register_netdev() failed!\n", 
+               IRDA_DEBUG(2, "%s(), register_netdev() failed!\n",
                           __FUNCTION__ );
                self = NULL;
                free_netdev(dev);
@@ -268,14 +268,14 @@ static struct irlan_cb *irlan_open(__u32 saddr, __u32 daddr)
 /*
  * Function __irlan_close (self)
  *
- *    This function closes and deallocates the IrLAN client instances. Be 
+ *    This function closes and deallocates the IrLAN client instances. Be
  *    aware that other functions which calls client_close() must
  *    remove self from irlans list first.
  */
 static void __irlan_close(struct irlan_cb *self)
 {
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
-       
+
        ASSERT_RTNL();
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
@@ -285,8 +285,8 @@ static void __irlan_close(struct irlan_cb *self)
 
        /* Close all open connections and remove TSAPs */
        irlan_close_tsaps(self);
-       
-       if (self->client.iriap) 
+
+       if (self->client.iriap)
                iriap_close(self->client.iriap);
 
        /* Remove frames queued on the control channel */
@@ -316,17 +316,17 @@ struct irlan_cb *irlan_get_any(void)
 static void irlan_connect_indication(void *instance, void *sap,
                                     struct qos_info *qos,
                                     __u32 max_sdu_size,
-                                    __u8 max_header_size, 
+                                    __u8 max_header_size,
                                     struct sk_buff *skb)
 {
        struct irlan_cb *self;
        struct tsap_cb *tsap;
 
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
-       
+
        self = (struct irlan_cb *) instance;
        tsap = (struct tsap_cb *) sap;
-       
+
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
        IRDA_ASSERT(tsap == self->tsap_data,return;);
@@ -349,9 +349,9 @@ static void irlan_connect_indication(void *instance, void *sap,
        irlan_do_client_event(self, IRLAN_DATA_CONNECT_INDICATION, NULL);
 
        if (self->provider.access_type == ACCESS_PEER) {
-               /* 
+               /*
                 * Data channel is open, so we are now allowed to
-                * configure the remote filter 
+                * configure the remote filter
                 */
                irlan_get_unicast_addr(self);
                irlan_open_unicast_addr(self);
@@ -361,10 +361,10 @@ static void irlan_connect_indication(void *instance, void *sap,
 }
 
 static void irlan_connect_confirm(void *instance, void *sap,
-                                 struct qos_info *qos, 
+                                 struct qos_info *qos,
                                  __u32 max_sdu_size,
-                                 __u8 max_header_size, 
-                                 struct sk_buff *skb) 
+                                 __u8 max_header_size,
+                                 struct sk_buff *skb)
 {
        struct irlan_cb *self;
 
@@ -381,16 +381,16 @@ static void irlan_connect_confirm(void *instance, void *sap,
        IRDA_DEBUG(0, "%s: We are now connected!\n", __FUNCTION__);
        del_timer(&self->watchdog_timer);
 
-       /* 
+       /*
         * Data channel is open, so we are now allowed to configure the remote
-        * filter 
+        * filter
         */
        irlan_get_unicast_addr(self);
        irlan_open_unicast_addr(self);
-       
+
        /* Open broadcast and multicast filter by default */
-       irlan_set_broadcast_filter(self, TRUE);
-       irlan_set_multicast_filter(self, TRUE);
+       irlan_set_broadcast_filter(self, TRUE);
+       irlan_set_multicast_filter(self, TRUE);
 
        /* Ready to transfer Ethernet frames */
        netif_start_queue(self->dev);
@@ -408,29 +408,29 @@ static void irlan_connect_confirm(void *instance, void *sap,
  *    the specified connection (handle)
  */
 static void irlan_disconnect_indication(void *instance,
-                                       void *sap, LM_REASON reason, 
-                                       struct sk_buff *userdata) 
+                                       void *sap, LM_REASON reason,
+                                       struct sk_buff *userdata)
 {
        struct irlan_cb *self;
        struct tsap_cb *tsap;
 
        IRDA_DEBUG(0, "%s(), reason=%d\n", __FUNCTION__ , reason);
-       
+
        self = (struct irlan_cb *) instance;
        tsap = (struct tsap_cb *) sap;
 
        IRDA_ASSERT(self != NULL, return;);
-       IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);       
+       IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
        IRDA_ASSERT(tsap != NULL, return;);
        IRDA_ASSERT(tsap->magic == TTP_TSAP_MAGIC, return;);
-       
+
        IRDA_ASSERT(tsap == self->tsap_data, return;);
 
        IRDA_DEBUG(2, "IrLAN, data channel disconnected by peer!\n");
 
        /* Save reason so we know if we should try to reconnect or not */
        self->disconnect_reason = reason;
-       
+
        switch (reason) {
        case LM_USER_REQUEST: /* User request */
                IRDA_DEBUG(2, "%s(), User requested\n", __FUNCTION__ );
@@ -451,7 +451,7 @@ static void irlan_disconnect_indication(void *instance,
                IRDA_ERROR("%s(), Unknown disconnect reason\n", __FUNCTION__);
                break;
        }
-       
+
        /* If you want to pass the skb to *both* state machines, you will
         * need to skb_clone() it, so that you don't free it twice.
         * As the state machines don't need it, git rid of it here...
@@ -461,7 +461,7 @@ static void irlan_disconnect_indication(void *instance,
 
        irlan_do_client_event(self, IRLAN_LMP_DISCONNECT, NULL);
        irlan_do_provider_event(self, IRLAN_LMP_DISCONNECT, NULL);
-       
+
        wake_up_interruptible(&self->open_wait);
 }
 
@@ -480,12 +480,12 @@ void irlan_open_data_tsap(struct irlan_cb *self)
                return;
 
        irda_notify_init(&notify);
-       
+
        notify.data_indication       = irlan_eth_receive;
        notify.udata_indication      = irlan_eth_receive;
        notify.connect_indication    = irlan_connect_indication;
        notify.connect_confirm       = irlan_connect_confirm;
-       notify.flow_indication       = irlan_eth_flow_indication;
+       notify.flow_indication       = irlan_eth_flow_indication;
        notify.disconnect_indication = irlan_disconnect_indication;
        notify.instance              = self;
        strlcpy(notify.name, "IrLAN data", sizeof(notify.name));
@@ -497,7 +497,7 @@ void irlan_open_data_tsap(struct irlan_cb *self)
        }
        self->tsap_data = tsap;
 
-       /* 
+       /*
         *  This is the data TSAP selector which we will pass to the client
         *  when the client ask for it.
         */
@@ -518,13 +518,13 @@ void irlan_close_tsaps(struct irlan_cb *self)
                self->tsap_data = NULL;
        }
        if (self->client.tsap_ctrl) {
-               irttp_disconnect_request(self->client.tsap_ctrl, NULL, 
+               irttp_disconnect_request(self->client.tsap_ctrl, NULL,
                                         P_NORMAL);
                irttp_close_tsap(self->client.tsap_ctrl);
                self->client.tsap_ctrl = NULL;
        }
        if (self->provider.tsap_ctrl) {
-               irttp_disconnect_request(self->provider.tsap_ctrl, NULL, 
+               irttp_disconnect_request(self->provider.tsap_ctrl, NULL,
                                         P_NORMAL);
                irttp_close_tsap(self->provider.tsap_ctrl);
                self->provider.tsap_ctrl = NULL;
@@ -545,8 +545,8 @@ void irlan_ias_register(struct irlan_cb *self, __u8 tsap_sel)
 
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
-       
-       /* 
+
+       /*
         * Check if object has already been registered by a previous provider.
         * If that is the case, we just change the value of the attribute
         */
@@ -560,9 +560,9 @@ void irlan_ias_register(struct irlan_cb *self, __u8 tsap_sel)
                irias_object_change_attribute("IrLAN", "IrDA:TinyTP:LsapSel",
                                              new_value);
        }
-       
-        /* Register PnP object only if not registered before */
-        if (!irias_find_object("PnP")) {
+
+       /* Register PnP object only if not registered before */
+       if (!irias_find_object("PnP")) {
                obj = irias_new_object("PnP", IAS_PNP_ID);
 #if 0
                irias_add_string_attrib(obj, "Name", sysctl_devname,
@@ -606,10 +606,10 @@ int irlan_run_ctrl_tx_queue(struct irlan_cb *self)
                self->client.tx_busy = FALSE;
                return 0;
        }
-       
+
        /* Check that it's really possible to send commands */
-       if ((self->client.tsap_ctrl == NULL) || 
-           (self->client.state == IRLAN_IDLE)) 
+       if ((self->client.tsap_ctrl == NULL) ||
+           (self->client.state == IRLAN_IDLE))
        {
                self->client.tx_busy = FALSE;
                dev_kfree_skb(skb);
@@ -649,7 +649,7 @@ void irlan_get_provider_info(struct irlan_cb *self)
        __u8 *frame;
 
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
-       
+
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
 
@@ -661,12 +661,12 @@ void irlan_get_provider_info(struct irlan_cb *self)
        /* Reserve space for TTP, LMP, and LAP header */
        skb_reserve(skb, self->client.max_header_size);
        skb_put(skb, 2);
-       
+
        frame = skb->data;
-       
-       frame[0] = CMD_GET_PROVIDER_INFO;
+
+       frame[0] = CMD_GET_PROVIDER_INFO;
        frame[1] = 0x00;                 /* Zero parameters */
-       
+
        irlan_ctrl_data_request(self, skb);
 }
 
@@ -676,16 +676,16 @@ void irlan_get_provider_info(struct irlan_cb *self)
  *    Send an Open Data Command to provider
  *
  */
-void irlan_open_data_channel(struct irlan_cb *self) 
+void irlan_open_data_channel(struct irlan_cb *self)
 {
        struct sk_buff *skb;
        __u8 *frame;
-       
+
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
-       
+
        skb = alloc_skb(IRLAN_MAX_HEADER + IRLAN_CMD_HEADER +
                        IRLAN_STRING_PARAMETER_LEN("MEDIA", "802.3") +
                        IRLAN_STRING_PARAMETER_LEN("ACCESS_TYPE", "DIRECT"),
@@ -695,11 +695,11 @@ void irlan_open_data_channel(struct irlan_cb *self)
 
        skb_reserve(skb, self->client.max_header_size);
        skb_put(skb, 2);
-       
+
        frame = skb->data;
-       
+
        /* Build frame */
-       frame[0] = CMD_OPEN_DATA_CHANNEL;
+       frame[0] = CMD_OPEN_DATA_CHANNEL;
        frame[1] = 0x02; /* Two parameters */
 
        irlan_insert_string_param(skb, "MEDIA", "802.3");
@@ -711,11 +711,11 @@ void irlan_open_data_channel(struct irlan_cb *self)
        irlan_ctrl_data_request(self, skb);
 }
 
-void irlan_close_data_channel(struct irlan_cb *self) 
+void irlan_close_data_channel(struct irlan_cb *self)
 {
        struct sk_buff *skb;
        __u8 *frame;
-       
+
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(self != NULL, return;);
@@ -733,11 +733,11 @@ void irlan_close_data_channel(struct irlan_cb *self)
 
        skb_reserve(skb, self->client.max_header_size);
        skb_put(skb, 2);
-       
+
        frame = skb->data;
-       
+
        /* Build frame */
-       frame[0] = CMD_CLOSE_DATA_CHAN;
+       frame[0] = CMD_CLOSE_DATA_CHAN;
        frame[1] = 0x01; /* One parameter */
 
        irlan_insert_byte_param(skb, "DATA_CHAN", self->dtsap_sel_data);
@@ -748,7 +748,7 @@ void irlan_close_data_channel(struct irlan_cb *self)
 /*
  * Function irlan_open_unicast_addr (self)
  *
- *    Make IrLAN provider accept ethernet frames addressed to the unicast 
+ *    Make IrLAN provider accept ethernet frames addressed to the unicast
  *    address.
  *
  */
@@ -756,12 +756,12 @@ static void irlan_open_unicast_addr(struct irlan_cb *self)
 {
        struct sk_buff *skb;
        __u8 *frame;
-       
+
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(self != NULL, return;);
-       IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);       
-       
+       IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
+
        skb = alloc_skb(IRLAN_MAX_HEADER + IRLAN_CMD_HEADER +
                        IRLAN_BYTE_PARAMETER_LEN("DATA_CHAN") +
                        IRLAN_STRING_PARAMETER_LEN("FILTER_TYPE", "DIRECTED") +
@@ -773,15 +773,15 @@ static void irlan_open_unicast_addr(struct irlan_cb *self)
        /* Reserve space for TTP, LMP, and LAP header */
        skb_reserve(skb, self->max_header_size);
        skb_put(skb, 2);
-       
+
        frame = skb->data;
-       
-       frame[0] = CMD_FILTER_OPERATION;
+
+       frame[0] = CMD_FILTER_OPERATION;
        frame[1] = 0x03;                 /* Three parameters */
-       irlan_insert_byte_param(skb, "DATA_CHAN" , self->dtsap_sel_data);
-       irlan_insert_string_param(skb, "FILTER_TYPE", "DIRECTED");
-       irlan_insert_string_param(skb, "FILTER_MODE", "FILTER"); 
-       
+       irlan_insert_byte_param(skb, "DATA_CHAN" , self->dtsap_sel_data);
+       irlan_insert_string_param(skb, "FILTER_TYPE", "DIRECTED");
+       irlan_insert_string_param(skb, "FILTER_MODE", "FILTER");
+
        irlan_ctrl_data_request(self, skb);
 }
 
@@ -794,17 +794,17 @@ static void irlan_open_unicast_addr(struct irlan_cb *self)
  *    one but then _we_ have to initiate all communication with other
  *    hosts, since ARP request for this host will not be answered.
  */
-void irlan_set_broadcast_filter(struct irlan_cb *self, int status) 
+void irlan_set_broadcast_filter(struct irlan_cb *self, int status)
 {
        struct sk_buff *skb;
        __u8 *frame;
-       
+
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
-       
-       skb = alloc_skb(IRLAN_MAX_HEADER + IRLAN_CMD_HEADER +
+
+       skb = alloc_skb(IRLAN_MAX_HEADER + IRLAN_CMD_HEADER +
                        IRLAN_BYTE_PARAMETER_LEN("DATA_CHAN") +
                        IRLAN_STRING_PARAMETER_LEN("FILTER_TYPE", "BROADCAST") +
                        /* We may waste one byte here...*/
@@ -816,17 +816,17 @@ void irlan_set_broadcast_filter(struct irlan_cb *self, int status)
        /* Reserve space for TTP, LMP, and LAP header */
        skb_reserve(skb, self->client.max_header_size);
        skb_put(skb, 2);
-       
+
        frame = skb->data;
-       
-       frame[0] = CMD_FILTER_OPERATION;
+
+       frame[0] = CMD_FILTER_OPERATION;
        frame[1] = 0x03;                 /* Three parameters */
-       irlan_insert_byte_param(skb, "DATA_CHAN", self->dtsap_sel_data);
-       irlan_insert_string_param(skb, "FILTER_TYPE", "BROADCAST");
+       irlan_insert_byte_param(skb, "DATA_CHAN", self->dtsap_sel_data);
+       irlan_insert_string_param(skb, "FILTER_TYPE", "BROADCAST");
        if (status)
-               irlan_insert_string_param(skb, "FILTER_MODE", "FILTER"); 
+               irlan_insert_string_param(skb, "FILTER_MODE", "FILTER");
        else
-               irlan_insert_string_param(skb, "FILTER_MODE", "NONE"); 
+               irlan_insert_string_param(skb, "FILTER_MODE", "NONE");
 
        irlan_ctrl_data_request(self, skb);
 }
@@ -835,14 +835,14 @@ void irlan_set_broadcast_filter(struct irlan_cb *self, int status)
  * Function irlan_set_multicast_filter (self, status)
  *
  *    Make IrLAN provider accept ethernet frames addressed to the multicast
- *    address. 
+ *    address.
  *
  */
-void irlan_set_multicast_filter(struct irlan_cb *self, int status) 
+void irlan_set_multicast_filter(struct irlan_cb *self, int status)
 {
        struct sk_buff *skb;
        __u8 *frame;
-       
+
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(self != NULL, return;);
@@ -856,21 +856,21 @@ void irlan_set_multicast_filter(struct irlan_cb *self, int status)
                        GFP_ATOMIC);
        if (!skb)
                return;
-       
+
        /* Reserve space for TTP, LMP, and LAP header */
        skb_reserve(skb, self->client.max_header_size);
        skb_put(skb, 2);
-       
+
        frame = skb->data;
-       
-       frame[0] = CMD_FILTER_OPERATION;
+
+       frame[0] = CMD_FILTER_OPERATION;
        frame[1] = 0x03;                 /* Three parameters */
-       irlan_insert_byte_param(skb, "DATA_CHAN", self->dtsap_sel_data);
-       irlan_insert_string_param(skb, "FILTER_TYPE", "MULTICAST");
+       irlan_insert_byte_param(skb, "DATA_CHAN", self->dtsap_sel_data);
+       irlan_insert_string_param(skb, "FILTER_TYPE", "MULTICAST");
        if (status)
-               irlan_insert_string_param(skb, "FILTER_MODE", "ALL"); 
+               irlan_insert_string_param(skb, "FILTER_MODE", "ALL");
        else
-               irlan_insert_string_param(skb, "FILTER_MODE", "NONE"); 
+               irlan_insert_string_param(skb, "FILTER_MODE", "NONE");
 
        irlan_ctrl_data_request(self, skb);
 }
@@ -887,12 +887,12 @@ static void irlan_get_unicast_addr(struct irlan_cb *self)
 {
        struct sk_buff *skb;
        __u8 *frame;
-               
+
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
-       
+
        skb = alloc_skb(IRLAN_MAX_HEADER + IRLAN_CMD_HEADER +
                        IRLAN_BYTE_PARAMETER_LEN("DATA_CHAN") +
                        IRLAN_STRING_PARAMETER_LEN("FILTER_TYPE", "DIRECTED") +
@@ -905,34 +905,34 @@ static void irlan_get_unicast_addr(struct irlan_cb *self)
        /* Reserve space for TTP, LMP, and LAP header */
        skb_reserve(skb, self->client.max_header_size);
        skb_put(skb, 2);
-       
+
        frame = skb->data;
-       
-       frame[0] = CMD_FILTER_OPERATION;
+
+       frame[0] = CMD_FILTER_OPERATION;
        frame[1] = 0x03;                 /* Three parameters */
-       irlan_insert_byte_param(skb, "DATA_CHAN", self->dtsap_sel_data);
-       irlan_insert_string_param(skb, "FILTER_TYPE", "DIRECTED");
-       irlan_insert_string_param(skb, "FILTER_OPERATION", "DYNAMIC"); 
-       
+       irlan_insert_byte_param(skb, "DATA_CHAN", self->dtsap_sel_data);
+       irlan_insert_string_param(skb, "FILTER_TYPE", "DIRECTED");
+       irlan_insert_string_param(skb, "FILTER_OPERATION", "DYNAMIC");
+
        irlan_ctrl_data_request(self, skb);
 }
 
 /*
  * Function irlan_get_media_char (self)
  *
- *    
+ *
  *
  */
-void irlan_get_media_char(struct irlan_cb *self) 
+void irlan_get_media_char(struct irlan_cb *self)
 {
        struct sk_buff *skb;
        __u8 *frame;
-       
+
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
-       
+
        skb = alloc_skb(IRLAN_MAX_HEADER + IRLAN_CMD_HEADER +
                        IRLAN_STRING_PARAMETER_LEN("MEDIA", "802.3"),
                        GFP_ATOMIC);
@@ -943,13 +943,13 @@ void irlan_get_media_char(struct irlan_cb *self)
        /* Reserve space for TTP, LMP, and LAP header */
        skb_reserve(skb, self->client.max_header_size);
        skb_put(skb, 2);
-       
+
        frame = skb->data;
-       
+
        /* Build frame */
-       frame[0] = CMD_GET_MEDIA_CHAR;
+       frame[0] = CMD_GET_MEDIA_CHAR;
        frame[1] = 0x01; /* One parameter */
-       
+
        irlan_insert_string_param(skb, "MEDIA", "802.3");
        irlan_ctrl_data_request(self, skb);
 }
@@ -980,7 +980,7 @@ int irlan_insert_string_param(struct sk_buff *skb, char *param, char *string)
 {
        int string_len = strlen(string);
 
-       return __irlan_insert_param(skb, param, IRLAN_ARRAY, 0, 0, string, 
+       return __irlan_insert_param(skb, param, IRLAN_ARRAY, 0, 0, string,
                                    string_len);
 }
 
@@ -993,7 +993,7 @@ int irlan_insert_string_param(struct sk_buff *skb, char *param, char *string)
 int irlan_insert_array_param(struct sk_buff *skb, char *name, __u8 *array,
                             __u16 array_len)
 {
-       return __irlan_insert_param(skb, name, IRLAN_ARRAY, 0, 0, array, 
+       return __irlan_insert_param(skb, name, IRLAN_ARRAY, 0, 0, array,
                                    array_len);
 }
 
@@ -1006,19 +1006,19 @@ int irlan_insert_array_param(struct sk_buff *skb, char *name, __u8 *array,
  *    | Name Length[1] | Param Name[1..255] | Val Length[2] | Value[0..1016]|
  *    -----------------------------------------------------------------------
  */
-static int __irlan_insert_param(struct sk_buff *skb, char *param, int type, 
-                               __u8 value_byte, __u16 value_short, 
+static int __irlan_insert_param(struct sk_buff *skb, char *param, int type,
+                               __u8 value_byte, __u16 value_short,
                                __u8 *value_array, __u16 value_len)
 {
        __u8 *frame;
        __u8 param_len;
        __le16 tmp_le; /* Temporary value in little endian format */
        int n=0;
-       
+
        if (skb == NULL) {
                IRDA_DEBUG(2, "%s(), Got NULL skb\n", __FUNCTION__ );
                return 0;
-       }       
+       }
 
        param_len = strlen(param);
        switch (type) {
@@ -1037,7 +1037,7 @@ static int __irlan_insert_param(struct sk_buff *skb, char *param, int type,
                return 0;
                break;
        }
-       
+
        /* Insert at end of sk-buffer */
        frame = skb->tail;
 
@@ -1045,15 +1045,15 @@ static int __irlan_insert_param(struct sk_buff *skb, char *param, int type,
        if (skb_tailroom(skb) < (param_len+value_len+3)) {
                IRDA_DEBUG(2, "%s(), No more space at end of skb\n", __FUNCTION__ );
                return 0;
-       }       
+       }
        skb_put(skb, param_len+value_len+3);
-       
+
        /* Insert parameter length */
        frame[n++] = param_len;
-       
+
        /* Insert parameter */
        memcpy(frame+n, param, param_len); n += param_len;
-       
+
        /* Insert value length (2 byte little endian format, LSB first) */
        tmp_le = cpu_to_le16(value_len);
        memcpy(frame+n, &tmp_le, 2); n += 2; /* To avoid alignment problems */
@@ -1082,36 +1082,36 @@ static int __irlan_insert_param(struct sk_buff *skb, char *param, int type,
  * Function irlan_extract_param (buf, name, value, len)
  *
  *    Extracts a single parameter name/value pair from buffer and updates
- *    the buffer pointer to point to the next name/value pair. 
+ *    the buffer pointer to point to the next name/value pair.
  */
 int irlan_extract_param(__u8 *buf, char *name, char *value, __u16 *len)
 {
        __u8 name_len;
        __u16 val_len;
        int n=0;
-       
+
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
-       
+
        /* get length of parameter name (1 byte) */
        name_len = buf[n++];
-       
+
        if (name_len > 254) {
                IRDA_DEBUG(2, "%s(), name_len > 254\n", __FUNCTION__ );
                return -RSP_INVALID_COMMAND_FORMAT;
        }
-       
+
        /* get parameter name */
        memcpy(name, buf+n, name_len);
        name[name_len] = '\0';
        n+=name_len;
-       
-       /*  
-        *  Get length of parameter value (2 bytes in little endian 
-        *  format) 
+
+       /*
+        *  Get length of parameter value (2 bytes in little endian
+        *  format)
         */
        memcpy(&val_len, buf+n, 2); /* To avoid alignment problems */
        le16_to_cpus(&val_len); n+=2;
-       
+
        if (val_len > 1016) {
                IRDA_DEBUG(2, "%s(), parameter length to long\n", __FUNCTION__ );
                return -RSP_INVALID_COMMAND_FORMAT;
@@ -1122,9 +1122,9 @@ int irlan_extract_param(__u8 *buf, char *name, char *value, __u16 *len)
        memcpy(value, buf+n, val_len);
        value[val_len] = '\0';
        n+=val_len;
-       
-       IRDA_DEBUG(4, "Parameter: %s ", name); 
-       IRDA_DEBUG(4, "Value: %s\n", value); 
+
+       IRDA_DEBUG(4, "Parameter: %s ", name);
+       IRDA_DEBUG(4, "Value: %s\n", value);
 
        return n;
 }
@@ -1133,7 +1133,7 @@ int irlan_extract_param(__u8 *buf, char *name, char *value, __u16 *len)
 
 /*
  * Start of reading /proc entries.
- * Return entry at pos, 
+ * Return entry at pos,
  *     or start_token to indicate print header line
  *     or NULL if end of file
  */
@@ -1147,7 +1147,7 @@ static void *irlan_seq_start(struct seq_file *seq, loff_t *pos)
                return SEQ_START_TOKEN;
 
        list_for_each_entry(self, &irlans, dev_list) {
-               if (*pos == i) 
+               if (*pos == i)
                        return self;
                ++i;
        }
@@ -1160,12 +1160,12 @@ static void *irlan_seq_next(struct seq_file *seq, void *v, loff_t *pos)
        struct list_head *nxt;
 
        ++*pos;
-       if (v == SEQ_START_TOKEN) 
+       if (v == SEQ_START_TOKEN)
                nxt = irlans.next;
        else
                nxt = ((struct irlan_cb *)v)->dev_list.next;
 
-       return (nxt == &irlans) ? NULL 
+       return (nxt == &irlans) ? NULL
                : list_entry(nxt, struct irlan_cb, dev_list);
 }
 
@@ -1185,7 +1185,7 @@ static int irlan_seq_show(struct seq_file *seq, void *v)
                seq_puts(seq, "IrLAN instances:\n");
        else {
                struct irlan_cb *self = v;
-               
+
                IRDA_ASSERT(self != NULL, return -1;);
                IRDA_ASSERT(self->magic == IRLAN_MAGIC, return -1;);
 
@@ -1201,17 +1201,17 @@ static int irlan_seq_show(struct seq_file *seq, void *v)
                               self->daddr);
                seq_printf(seq,"version: %d.%d,\n",
                               self->version[1], self->version[0]);
-               seq_printf(seq,"access type: %s\n", 
+               seq_printf(seq,"access type: %s\n",
                               irlan_access[self->client.access_type]);
-               seq_printf(seq,"media: %s\n", 
+               seq_printf(seq,"media: %s\n",
                               irlan_media[self->media]);
-               
+
                seq_printf(seq,"local filter:\n");
                seq_printf(seq,"remote filter: ");
                irlan_print_filter(seq, self->client.filter_type);
-               seq_printf(seq,"tx busy: %s\n", 
+               seq_printf(seq,"tx busy: %s\n",
                               netif_queue_stopped(self->dev) ? "TRUE" : "FALSE");
-                       
+
                seq_putc(seq,'\n');
        }
        return 0;
@@ -1231,7 +1231,7 @@ static int irlan_seq_open(struct inode *inode, struct file *file)
 #endif
 
 MODULE_AUTHOR("Dag Brattli <dagb@cs.uit.no>");
-MODULE_DESCRIPTION("The Linux IrDA LAN protocol"); 
+MODULE_DESCRIPTION("The Linux IrDA LAN protocol");
 MODULE_LICENSE("GPL");
 
 module_param(eth, bool, 0);
index b0ccc455b74740a5d5f3d5db27ca9f18da5c50fd..672ab3f69033b0848562365c2cad7a68cf7745e5 100644 (file)
@@ -1,8 +1,8 @@
 /*********************************************************************
- *                
+ *
  * Filename:      irlan_eth.c
- * Version:       
- * Description:   
+ * Version:
+ * Description:
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Thu Oct 15 08:37:58 1998
  * Sources:       skeleton.c by Donald Becker <becker@CESDIS.gsfc.nasa.gov>
  *                slip.c by Laurence Culhane,   <loz@holmes.demon.co.uk>
  *                          Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
- * 
+ *
  *     Copyright (c) 1998-2000 Dag Brattli, 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 
+ *
+ *     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.
- *  
+ *
  *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
+ *     provide warranty for any of this software. This material is
  *     provided "AS-IS" and at no charge.
- *     
+ *
  ********************************************************************/
 
 #include <linux/netdevice.h>
@@ -55,7 +55,7 @@ static void irlan_eth_setup(struct net_device *dev)
 {
        dev->open               = irlan_eth_open;
        dev->stop               = irlan_eth_close;
-       dev->hard_start_xmit    = irlan_eth_xmit; 
+       dev->hard_start_xmit    = irlan_eth_xmit;
        dev->get_stats          = irlan_eth_get_stats;
        dev->set_multicast_list = irlan_eth_set_multicast_list;
        dev->destructor         = free_netdev;
@@ -63,8 +63,8 @@ static void irlan_eth_setup(struct net_device *dev)
        SET_MODULE_OWNER(dev);
 
        ether_setup(dev);
-       
-       /* 
+
+       /*
         * Lets do all queueing in IrTTP instead of this device driver.
         * Queueing here as well can introduce some strange latency
         * problems, which we will avoid by setting the queue size to 0.
@@ -104,17 +104,17 @@ struct net_device *alloc_irlandev(const char *name)
 static int irlan_eth_open(struct net_device *dev)
 {
        struct irlan_cb *self = netdev_priv(dev);
-       
+
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
        /* Ready to play! */
-       netif_stop_queue(dev); /* Wait until data link is ready */
+       netif_stop_queue(dev); /* Wait until data link is ready */
 
        /* We are now open, so time to do some work */
        self->disconnect_reason = 0;
        irlan_client_wakeup(self, self->saddr, self->daddr);
 
-       /* Make sure we have a hardware address before we return, 
+       /* Make sure we have a hardware address before we return,
           so DHCP clients gets happy */
        return wait_event_interruptible(self->open_wait,
                                        !self->tsap_data->connected);
@@ -124,30 +124,30 @@ static int irlan_eth_open(struct net_device *dev)
  * Function irlan_eth_close (dev)
  *
  *    Stop the ether network device, his function will usually be called by
- *    ifconfig down. We should now disconnect the link, We start the 
+ *    ifconfig down. We should now disconnect the link, We start the
  *    close timer, so that the instance will be removed if we are unable
  *    to discover the remote device after the disconnect.
  */
 static int irlan_eth_close(struct net_device *dev)
 {
        struct irlan_cb *self = netdev_priv(dev);
-       
+
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
-       
+
        /* Stop device */
        netif_stop_queue(dev);
-       
+
        irlan_close_data_channel(self);
        irlan_close_tsaps(self);
 
        irlan_do_client_event(self, IRLAN_LMP_DISCONNECT, NULL);
-       irlan_do_provider_event(self, IRLAN_LMP_DISCONNECT, NULL);      
-       
+       irlan_do_provider_event(self, IRLAN_LMP_DISCONNECT, NULL);
+
        /* Remove frames queued on the control channel */
        skb_queue_purge(&self->client.txq);
 
        self->client.tx_busy = 0;
-       
+
        return 0;
 }
 
@@ -164,7 +164,7 @@ static int irlan_eth_xmit(struct sk_buff *skb, struct net_device *dev)
 
        /* skb headroom large enough to contain all IrDA-headers? */
        if ((skb_headroom(skb) < self->max_header_size) || (skb_shared(skb))) {
-               struct sk_buff *new_skb = 
+               struct sk_buff *new_skb =
                        skb_realloc_headroom(skb, self->max_header_size);
 
                /*  We have to free the original skb anyway */
@@ -176,7 +176,7 @@ static int irlan_eth_xmit(struct sk_buff *skb, struct net_device *dev)
 
                /* Use the new skb instead */
                skb = new_skb;
-       } 
+       }
 
        dev->trans_start = jiffies;
 
@@ -187,7 +187,7 @@ static int irlan_eth_xmit(struct sk_buff *skb, struct net_device *dev)
                ret = irttp_data_request(self->tsap_data, skb);
 
        if (ret < 0) {
-               /*   
+               /*
                 * IrTTPs tx queue is full, so we just have to
                 * drop the frame! You might think that we should
                 * just return -1 and don't deallocate the frame,
@@ -195,15 +195,15 @@ static int irlan_eth_xmit(struct sk_buff *skb, struct net_device *dev)
                 * we have replaced the original skb with a new
                 * one with larger headroom, and that would really
                 * confuse do_dev_queue_xmit() in dev.c! I have
-                * tried :-) DB 
+                * tried :-) DB
                 */
                /* irttp_data_request already free the packet */
                self->stats.tx_dropped++;
        } else {
                self->stats.tx_packets++;
-               self->stats.tx_bytes += skb->len; 
+               self->stats.tx_bytes += skb->len;
        }
-       
+
        return 0;
 }
 
@@ -218,37 +218,37 @@ int irlan_eth_receive(void *instance, void *sap, struct sk_buff *skb)
        struct irlan_cb *self = instance;
 
        if (skb == NULL) {
-               ++self->stats.rx_dropped; 
+               ++self->stats.rx_dropped;
                return 0;
        }
        if (skb->len < ETH_HLEN) {
                IRDA_DEBUG(0, "%s() : IrLAN frame too short (%d)\n",
                           __FUNCTION__, skb->len);
-               ++self->stats.rx_dropped; 
+               ++self->stats.rx_dropped;
                dev_kfree_skb(skb);
                return 0;
        }
-               
-       /* 
-        * Adopt this frame! Important to set all these fields since they 
+
+       /*
+        * Adopt this frame! Important to set all these fields since they
         * might have been previously set by the low level IrDA network
-        * device driver 
+        * device driver
         */
        skb->dev = self->dev;
        skb->protocol=eth_type_trans(skb, skb->dev); /* Remove eth header */
-       
+
        self->stats.rx_packets++;
-       self->stats.rx_bytes += skb->len; 
+       self->stats.rx_bytes += skb->len;
 
        netif_rx(skb);   /* Eat it! */
-       
+
        return 0;
 }
 
 /*
  * Function irlan_eth_flow (status)
  *
- *    Do flow control between IP/Ethernet and IrLAN/IrTTP. This is done by 
+ *    Do flow control between IP/Ethernet and IrLAN/IrTTP. This is done by
  *    controlling the queue stop/start.
  *
  * The IrDA link layer has the advantage to have flow control, and
@@ -268,11 +268,11 @@ void irlan_eth_flow_indication(void *instance, void *sap, LOCAL_FLOW flow)
 
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
-       
+
        dev = self->dev;
 
        IRDA_ASSERT(dev != NULL, return;);
-       
+
        IRDA_DEBUG(0, "%s() : flow %s ; running %d\n", __FUNCTION__,
                   flow == FLOW_STOP ? "FLOW_STOP" : "FLOW_START",
                   netif_running(dev));
@@ -301,10 +301,10 @@ void irlan_eth_send_gratuitous_arp(struct net_device *dev)
 {
        struct in_device *in_dev;
 
-       /* 
+       /*
         * When we get a new MAC address do a gratuitous ARP. This
         * is useful if we have changed access points on the same
-        * subnet.  
+        * subnet.
         */
 #ifdef CONFIG_INET
        IRDA_DEBUG(4, "IrLAN: Sending gratuitous ARP\n");
@@ -313,10 +313,10 @@ void irlan_eth_send_gratuitous_arp(struct net_device *dev)
        if (in_dev == NULL)
                goto out;
        if (in_dev->ifa_list)
-               
-       arp_send(ARPOP_REQUEST, ETH_P_ARP, 
+
+       arp_send(ARPOP_REQUEST, ETH_P_ARP,
                 in_dev->ifa_list->ifa_address,
-                dev, 
+                dev,
                 in_dev->ifa_list->ifa_address,
                 NULL, dev->dev_addr, NULL);
 out:
@@ -331,9 +331,9 @@ out:
  *
  */
 #define HW_MAX_ADDRS 4 /* Must query to get it! */
-static void irlan_eth_set_multicast_list(struct net_device *dev) 
+static void irlan_eth_set_multicast_list(struct net_device *dev)
 {
-       struct irlan_cb *self = netdev_priv(dev);
+       struct irlan_cb *self = netdev_priv(dev);
 
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
@@ -346,7 +346,7 @@ static void irlan_eth_set_multicast_list(struct net_device *dev)
        if (dev->flags & IFF_PROMISC) {
                /* Enable promiscuous mode */
                IRDA_WARNING("Promiscous mode not implemented by IrLAN!\n");
-       } 
+       }
        else if ((dev->flags & IFF_ALLMULTI) || dev->mc_count > HW_MAX_ADDRS) {
                /* Disable promiscuous mode, use normal mode. */
                IRDA_DEBUG(4, "%s(), Setting multicast filter\n", __FUNCTION__ );
@@ -378,7 +378,7 @@ static void irlan_eth_set_multicast_list(struct net_device *dev)
  *    Get the current statistics for this device
  *
  */
-static struct net_device_stats *irlan_eth_get_stats(struct net_device *dev) 
+static struct net_device_stats *irlan_eth_get_stats(struct net_device *dev)
 {
        struct irlan_cb *self = netdev_priv(dev);
 
index 2778d8c6aa3113eb16d1fb2fada8622e3f591760..623e0fd16c1900909c3830e1409a6ec7d872fe62 100644 (file)
@@ -1,25 +1,25 @@
 /*********************************************************************
- *                
+ *
  * Filename:      irlan_event.c
- * Version:       
- * Description:   
+ * Version:
+ * Description:
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Tue Oct 20 09:10:16 1998
  * Modified at:   Sat Oct 30 12:59:01 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
+ *
  *     Copyright (c) 1998-1999 Dag Brattli, 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 
+ *
+ *     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.
- *  
+ *
  *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
+ *     provide warranty for any of this software. This material is
  *     provided "AS-IS" and at no charge.
- *     
+ *
  ********************************************************************/
 
 #include <net/irda/irlan_event.h>
@@ -38,7 +38,7 @@ char *irlan_state[] = {
        "IRLAN_SYNC",
 };
 
-void irlan_next_client_state(struct irlan_cb *self, IRLAN_STATE state) 
+void irlan_next_client_state(struct irlan_cb *self, IRLAN_STATE state)
 {
        IRDA_DEBUG(2, "%s(), %s\n", __FUNCTION__ , irlan_state[state]);
 
@@ -48,7 +48,7 @@ void irlan_next_client_state(struct irlan_cb *self, IRLAN_STATE state)
        self->client.state = state;
 }
 
-void irlan_next_provider_state(struct irlan_cb *self, IRLAN_STATE state) 
+void irlan_next_provider_state(struct irlan_cb *self, IRLAN_STATE state)
 {
        IRDA_DEBUG(2, "%s(), %s\n", __FUNCTION__ , irlan_state[state]);
 
index ca7d358dab523866d32f67813d6a13781adaff67..e6346b88f934fef993428aa9e0448475094d28e3 100644 (file)
@@ -1,25 +1,25 @@
 /*********************************************************************
- *                
+ *
  * Filename:      irlan_filter.c
- * Version:       
- * Description:   
+ * Version:
+ * Description:
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Fri Jan 29 11:16:38 1999
  * Modified at:   Sat Oct 30 12:58:45 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
+ *
  *     Copyright (c) 1998-1999 Dag Brattli, 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 
+ *
+ *     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.
- *  
+ *
  *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
+ *     provide warranty for any of this software. This material is
  *     provided "AS-IS" and at no charge.
- *     
+ *
  ********************************************************************/
 
 #include <linux/skbuff.h>
@@ -40,7 +40,7 @@ void irlan_filter_request(struct irlan_cb *self, struct sk_buff *skb)
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
 
-       if ((self->provider.filter_type == IRLAN_DIRECTED) && 
+       if ((self->provider.filter_type == IRLAN_DIRECTED) &&
            (self->provider.filter_operation == DYNAMIC))
        {
                IRDA_DEBUG(0, "Giving peer a dynamic Ethernet address\n");
@@ -48,12 +48,12 @@ void irlan_filter_request(struct irlan_cb *self, struct sk_buff *skb)
                self->provider.mac_address[1] = 0x00;
                self->provider.mac_address[2] = 0x00;
                self->provider.mac_address[3] = 0x00;
-               
+
                /* Use arbitration value to generate MAC address */
                if (self->provider.access_type == ACCESS_PEER) {
-                       self->provider.mac_address[4] = 
+                       self->provider.mac_address[4] =
                                self->provider.send_arb_val & 0xff;
-                       self->provider.mac_address[5] = 
+                       self->provider.mac_address[5] =
                                (self->provider.send_arb_val >> 8) & 0xff;
                } else {
                        /* Just generate something for now */
@@ -65,12 +65,12 @@ void irlan_filter_request(struct irlan_cb *self, struct sk_buff *skb)
                skb->data[1] = 0x03;
                irlan_insert_string_param(skb, "FILTER_MODE", "NONE");
                irlan_insert_short_param(skb, "MAX_ENTRY", 0x0001);
-               irlan_insert_array_param(skb, "FILTER_ENTRY", 
+               irlan_insert_array_param(skb, "FILTER_ENTRY",
                                         self->provider.mac_address, 6);
                return;
        }
-       
-       if ((self->provider.filter_type == IRLAN_DIRECTED) && 
+
+       if ((self->provider.filter_type == IRLAN_DIRECTED) &&
            (self->provider.filter_mode == FILTER))
        {
                IRDA_DEBUG(0, "Directed filter on\n");
@@ -78,7 +78,7 @@ void irlan_filter_request(struct irlan_cb *self, struct sk_buff *skb)
                skb->data[1] = 0x00;
                return;
        }
-       if ((self->provider.filter_type == IRLAN_DIRECTED) && 
+       if ((self->provider.filter_type == IRLAN_DIRECTED) &&
            (self->provider.filter_mode == NONE))
        {
                IRDA_DEBUG(0, "Directed filter off\n");
@@ -87,7 +87,7 @@ void irlan_filter_request(struct irlan_cb *self, struct sk_buff *skb)
                return;
        }
 
-       if ((self->provider.filter_type == IRLAN_BROADCAST) && 
+       if ((self->provider.filter_type == IRLAN_BROADCAST) &&
            (self->provider.filter_mode == FILTER))
        {
                IRDA_DEBUG(0, "Broadcast filter on\n");
@@ -95,7 +95,7 @@ void irlan_filter_request(struct irlan_cb *self, struct sk_buff *skb)
                skb->data[1] = 0x00;
                return;
        }
-       if ((self->provider.filter_type == IRLAN_BROADCAST) && 
+       if ((self->provider.filter_type == IRLAN_BROADCAST) &&
            (self->provider.filter_mode == NONE))
        {
                IRDA_DEBUG(0, "Broadcast filter off\n");
@@ -103,7 +103,7 @@ void irlan_filter_request(struct irlan_cb *self, struct sk_buff *skb)
                skb->data[1] = 0x00;
                return;
        }
-       if ((self->provider.filter_type == IRLAN_MULTICAST) && 
+       if ((self->provider.filter_type == IRLAN_MULTICAST) &&
            (self->provider.filter_mode == FILTER))
        {
                IRDA_DEBUG(0, "Multicast filter on\n");
@@ -111,7 +111,7 @@ void irlan_filter_request(struct irlan_cb *self, struct sk_buff *skb)
                skb->data[1] = 0x00;
                return;
        }
-       if ((self->provider.filter_type == IRLAN_MULTICAST) && 
+       if ((self->provider.filter_type == IRLAN_MULTICAST) &&
            (self->provider.filter_mode == NONE))
        {
                IRDA_DEBUG(0, "Multicast filter off\n");
@@ -119,7 +119,7 @@ void irlan_filter_request(struct irlan_cb *self, struct sk_buff *skb)
                skb->data[1] = 0x00;
                return;
        }
-       if ((self->provider.filter_type == IRLAN_MULTICAST) && 
+       if ((self->provider.filter_type == IRLAN_MULTICAST) &&
            (self->provider.filter_operation == GET))
        {
                IRDA_DEBUG(0, "Multicast filter get\n");
index 58efde919667fb1a18c7ee0436aa53c6c1185f09..aac66434e4739d69610eaf80dc43f7893fa8dbd0 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      irlan_provider.c
  * Version:       0.9
  * Description:   IrDA LAN Access Protocol Implementation
  * Sources:       skeleton.c by Donald Becker <becker@CESDIS.gsfc.nasa.gov>
  *                slip.c by Laurence Culhane,   <loz@holmes.demon.co.uk>
  *                          Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
- * 
- *     Copyright (c) 1998-1999 Dag Brattli <dagb@cs.uit.no>, 
+ *
+ *     Copyright (c) 1998-1999 Dag Brattli <dagb@cs.uit.no>,
  *     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 
+ *
+ *     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.
  *
  *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
+ *     provide warranty for any of this software. This material is
  *     provided "AS-IS" and at no charge.
  *
  ********************************************************************/
@@ -52,8 +52,8 @@
 #include <net/irda/irlan_filter.h>
 #include <net/irda/irlan_client.h>
 
-static void irlan_provider_connect_indication(void *instance, void *sap, 
-                                             struct qos_info *qos, 
+static void irlan_provider_connect_indication(void *instance, void *sap,
+                                             struct qos_info *qos,
                                              __u32 max_sdu_size,
                                              __u8 max_header_size,
                                              struct sk_buff *skb);
@@ -64,14 +64,14 @@ static void irlan_provider_connect_indication(void *instance, void *sap,
  *    This function gets the data that is received on the control channel
  *
  */
-static int irlan_provider_data_indication(void *instance, void *sap, 
-                                         struct sk_buff *skb) 
+static int irlan_provider_data_indication(void *instance, void *sap,
+                                         struct sk_buff *skb)
 {
        struct irlan_cb *self;
        __u8 code;
-       
+
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
-       
+
        self = (struct irlan_cb *) instance;
 
        IRDA_ASSERT(self != NULL, return -1;);
@@ -83,16 +83,16 @@ static int irlan_provider_data_indication(void *instance, void *sap,
        switch(code) {
        case CMD_GET_PROVIDER_INFO:
                IRDA_DEBUG(4, "Got GET_PROVIDER_INFO command!\n");
-               irlan_do_provider_event(self, IRLAN_GET_INFO_CMD, skb); 
+               irlan_do_provider_event(self, IRLAN_GET_INFO_CMD, skb);
                break;
 
        case CMD_GET_MEDIA_CHAR:
                IRDA_DEBUG(4, "Got GET_MEDIA_CHAR command!\n");
-               irlan_do_provider_event(self, IRLAN_GET_MEDIA_CMD, skb); 
+               irlan_do_provider_event(self, IRLAN_GET_MEDIA_CMD, skb);
                break;
        case CMD_OPEN_DATA_CHANNEL:
                IRDA_DEBUG(4, "Got OPEN_DATA_CHANNEL command!\n");
-               irlan_do_provider_event(self, IRLAN_OPEN_DATA_CMD, skb); 
+               irlan_do_provider_event(self, IRLAN_OPEN_DATA_CMD, skb);
                break;
        case CMD_FILTER_OPERATION:
                IRDA_DEBUG(4, "Got FILTER_OPERATION command!\n");
@@ -119,9 +119,9 @@ static int irlan_provider_data_indication(void *instance, void *sap,
  *    Got connection from peer IrLAN client
  *
  */
-static void irlan_provider_connect_indication(void *instance, void *sap, 
+static void irlan_provider_connect_indication(void *instance, void *sap,
                                              struct qos_info *qos,
-                                             __u32 max_sdu_size, 
+                                             __u32 max_sdu_size,
                                              __u8 max_header_size,
                                              struct sk_buff *skb)
 {
@@ -130,13 +130,13 @@ static void irlan_provider_connect_indication(void *instance, void *sap,
        __u32 saddr, daddr;
 
        IRDA_DEBUG(0, "%s()\n", __FUNCTION__ );
-       
+
        self = (struct irlan_cb *) instance;
        tsap = (struct tsap_cb *) sap;
-       
+
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
-       
+
        IRDA_ASSERT(tsap == self->provider.tsap_ctrl,return;);
        IRDA_ASSERT(self->provider.state == IRLAN_IDLE, return;);
 
@@ -147,13 +147,13 @@ static void irlan_provider_connect_indication(void *instance, void *sap,
 
        irlan_do_provider_event(self, IRLAN_CONNECT_INDICATION, NULL);
 
-       /*  
+       /*
         * If we are in peer mode, the client may not have got the discovery
-        * indication it needs to make progress. If the client is still in 
-        * IDLE state, we must kick it. 
+        * indication it needs to make progress. If the client is still in
+        * IDLE state, we must kick it.
         */
-       if ((self->provider.access_type == ACCESS_PEER) && 
-           (self->client.state == IRLAN_IDLE)) 
+       if ((self->provider.access_type == ACCESS_PEER) &&
+           (self->client.state == IRLAN_IDLE))
        {
                irlan_client_wakeup(self, self->saddr, self->daddr);
        }
@@ -175,38 +175,38 @@ void irlan_provider_connect_response(struct irlan_cb *self,
        irttp_connect_response(tsap, IRLAN_MTU, NULL);
 }
 
-static void irlan_provider_disconnect_indication(void *instance, void *sap, 
-                                                LM_REASON reason, 
-                                                struct sk_buff *userdata) 
+static void irlan_provider_disconnect_indication(void *instance, void *sap,
+                                                LM_REASON reason,
+                                                struct sk_buff *userdata)
 {
        struct irlan_cb *self;
        struct tsap_cb *tsap;
 
        IRDA_DEBUG(4, "%s(), reason=%d\n", __FUNCTION__ , reason);
-       
+
        self = (struct irlan_cb *) instance;
        tsap = (struct tsap_cb *) sap;
 
        IRDA_ASSERT(self != NULL, return;);
-       IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);       
+       IRDA_ASSERT(self->magic == IRLAN_MAGIC, return;);
        IRDA_ASSERT(tsap != NULL, return;);
        IRDA_ASSERT(tsap->magic == TTP_TSAP_MAGIC, return;);
-       
+
        IRDA_ASSERT(tsap == self->provider.tsap_ctrl, return;);
-       
+
        irlan_do_provider_event(self, IRLAN_LMP_DISCONNECT, NULL);
 }
 
 /*
  * Function irlan_parse_open_data_cmd (self, skb)
  *
- *    
+ *
  *
  */
 int irlan_parse_open_data_cmd(struct irlan_cb *self, struct sk_buff *skb)
 {
        int ret;
-       
+
        ret = irlan_provider_parse_command(self, CMD_OPEN_DATA_CHANNEL, skb);
 
        /* Open data channel */
@@ -218,12 +218,12 @@ int irlan_parse_open_data_cmd(struct irlan_cb *self, struct sk_buff *skb)
 /*
  * Function parse_command (skb)
  *
- *    Extract all parameters from received buffer, then feed them to 
+ *    Extract all parameters from received buffer, then feed them to
  *    check_params for parsing
  *
  */
 int irlan_provider_parse_command(struct irlan_cb *self, int cmd,
-                                struct sk_buff *skb) 
+                                struct sk_buff *skb)
 {
        __u8 *frame;
        __u8 *ptr;
@@ -231,16 +231,16 @@ int irlan_provider_parse_command(struct irlan_cb *self, int cmd,
        __u16 val_len;
        int i;
        char *name;
-        char *value;
+       char *value;
        int ret = RSP_SUCCESS;
-       
+
        IRDA_ASSERT(skb != NULL, return -RSP_PROTOCOL_ERROR;);
-       
+
        IRDA_DEBUG(4, "%s(), skb->len=%d\n", __FUNCTION__ , (int)skb->len);
 
        IRDA_ASSERT(self != NULL, return -RSP_PROTOCOL_ERROR;);
        IRDA_ASSERT(self->magic == IRLAN_MAGIC, return -RSP_PROTOCOL_ERROR;);
-       
+
        if (!skb)
                return -RSP_PROTOCOL_ERROR;
 
@@ -259,11 +259,11 @@ int irlan_provider_parse_command(struct irlan_cb *self, int cmd,
        count = frame[1];
 
        IRDA_DEBUG(4, "Got %d parameters\n", count);
-       
+
        ptr = frame+2;
-       
+
        /* For all parameters */
-       for (i=0; i<count;i++) {
+       for (i=0; i<count;i++) {
                ret = irlan_extract_param(ptr, name, value, &val_len);
                if (ret < 0) {
                        IRDA_DEBUG(2, "%s(), IrLAN, Error!\n", __FUNCTION__ );
@@ -286,7 +286,7 @@ int irlan_provider_parse_command(struct irlan_cb *self, int cmd,
  *    Send reply to query to peer IrLAN layer
  *
  */
-void irlan_provider_send_reply(struct irlan_cb *self, int command, 
+void irlan_provider_send_reply(struct irlan_cb *self, int command,
                               int ret_code)
 {
        struct sk_buff *skb;
@@ -310,7 +310,7 @@ void irlan_provider_send_reply(struct irlan_cb *self, int command,
        /* Reserve space for TTP, LMP, and LAP header */
        skb_reserve(skb, self->provider.max_header_size);
        skb_put(skb, 2);
-       
+
        switch (command) {
        case CMD_GET_PROVIDER_INFO:
                skb->data[0] = 0x00; /* Success */
@@ -356,7 +356,7 @@ void irlan_provider_send_reply(struct irlan_cb *self, int command,
                skb->data[0] = 0x00; /* Success */
                if (self->provider.send_arb_val) {
                        skb->data[1] = 0x03; /* 3 parameters */
-                       irlan_insert_short_param(skb, "CON_ARB", 
+                       irlan_insert_short_param(skb, "CON_ARB",
                                                 self->provider.send_arb_val);
                } else
                        skb->data[1] = 0x02; /* 2 parameters */
@@ -378,13 +378,13 @@ void irlan_provider_send_reply(struct irlan_cb *self, int command,
  * Function irlan_provider_register(void)
  *
  *    Register provider support so we can accept incoming connections.
- * 
+ *
  */
 int irlan_provider_open_ctrl_tsap(struct irlan_cb *self)
 {
        struct tsap_cb *tsap;
        notify_t notify;
-       
+
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
 
        IRDA_ASSERT(self != NULL, return -1;);
@@ -393,7 +393,7 @@ int irlan_provider_open_ctrl_tsap(struct irlan_cb *self)
        /* Check if already open */
        if (self->provider.tsap_ctrl)
                return -1;
-       
+
        /*
         *  First register well known control TSAP
         */
index 5a086f9827ed08a85e861db9ef8c54d3d6774477..ef401bd6ea0036765594ed3a122b8ec4341c0824 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      irlan_provider_event.c
  * Version:       0.9
  * Description:   IrLAN provider state machine)
@@ -8,16 +8,16 @@
  * Created at:    Sun Aug 31 20:14:37 1997
  * Modified at:   Sat Oct 30 12:52:41 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
+ *
  *     Copyright (c) 1998-1999 Dag Brattli <dagb@cs.uit.no>, 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 
+ *
+ *     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.
  *
  *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
+ *     provide warranty for any of this software. This material is
  *     provided "AS-IS" and at no charge.
  *
  ********************************************************************/
 #include <net/irda/irlan_provider.h>
 #include <net/irda/irlan_event.h>
 
-static int irlan_provider_state_idle(struct irlan_cb *self, IRLAN_EVENT event, 
+static int irlan_provider_state_idle(struct irlan_cb *self, IRLAN_EVENT event,
                                     struct sk_buff *skb);
-static int irlan_provider_state_info(struct irlan_cb *self, IRLAN_EVENT event, 
+static int irlan_provider_state_info(struct irlan_cb *self, IRLAN_EVENT event,
                                     struct sk_buff *skb);
-static int irlan_provider_state_open(struct irlan_cb *self, IRLAN_EVENT event, 
+static int irlan_provider_state_open(struct irlan_cb *self, IRLAN_EVENT event,
                                     struct sk_buff *skb);
-static int irlan_provider_state_data(struct irlan_cb *self, IRLAN_EVENT event, 
+static int irlan_provider_state_data(struct irlan_cb *self, IRLAN_EVENT event,
                                     struct sk_buff *skb);
 
-static int (*state[])(struct irlan_cb *self, IRLAN_EVENT event, 
-                     struct sk_buff *skb) = 
-{ 
+static int (*state[])(struct irlan_cb *self, IRLAN_EVENT event,
+                     struct sk_buff *skb) =
+{
        irlan_provider_state_idle,
        NULL, /* Query */
        NULL, /* Info */
@@ -55,8 +55,8 @@ static int (*state[])(struct irlan_cb *self, IRLAN_EVENT event,
        NULL, /* Sync */
 };
 
-void irlan_do_provider_event(struct irlan_cb *self, IRLAN_EVENT event, 
-                            struct sk_buff *skb) 
+void irlan_do_provider_event(struct irlan_cb *self, IRLAN_EVENT event,
+                            struct sk_buff *skb)
 {
        IRDA_ASSERT(*state[ self->provider.state] != NULL, return;);
 
@@ -73,9 +73,9 @@ static int irlan_provider_state_idle(struct irlan_cb *self, IRLAN_EVENT event,
                                     struct sk_buff *skb)
 {
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
-       
+
        switch(event) {
        case IRLAN_CONNECT_INDICATION:
             irlan_provider_connect_response( self, self->provider.tsap_ctrl);
@@ -96,13 +96,13 @@ static int irlan_provider_state_idle(struct irlan_cb *self, IRLAN_EVENT event,
  *
  *    INFO, We have issued a GetInfo command and is awaiting a reply.
  */
-static int irlan_provider_state_info(struct irlan_cb *self, IRLAN_EVENT event, 
-                                    struct sk_buff *skb) 
+static int irlan_provider_state_info(struct irlan_cb *self, IRLAN_EVENT event,
+                                    struct sk_buff *skb)
 {
        int ret;
 
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
 
        switch(event) {
@@ -110,7 +110,7 @@ static int irlan_provider_state_info(struct irlan_cb *self, IRLAN_EVENT event,
                /* Be sure to use 802.3 in case of peer mode */
                if (self->provider.access_type == ACCESS_PEER) {
                        self->media = MEDIA_802_3;
-                       
+
                        /* Check if client has started yet */
                        if (self->client.state == IRLAN_IDLE) {
                                /* This should get the client going */
@@ -118,15 +118,15 @@ static int irlan_provider_state_info(struct irlan_cb *self, IRLAN_EVENT event,
                        }
                }
 
-               irlan_provider_send_reply(self, CMD_GET_PROVIDER_INFO, 
+               irlan_provider_send_reply(self, CMD_GET_PROVIDER_INFO,
                                          RSP_SUCCESS);
                /* Keep state */
                break;
-       case IRLAN_GET_MEDIA_CMD: 
-               irlan_provider_send_reply(self, CMD_GET_MEDIA_CHAR, 
+       case IRLAN_GET_MEDIA_CMD:
+               irlan_provider_send_reply(self, CMD_GET_MEDIA_CHAR,
                                          RSP_SUCCESS);
                /* Keep state */
-               break;          
+               break;
        case IRLAN_OPEN_DATA_CMD:
                ret = irlan_parse_open_data_cmd(self, skb);
                if (self->provider.access_type == ACCESS_PEER) {
@@ -152,7 +152,7 @@ static int irlan_provider_state_info(struct irlan_cb *self, IRLAN_EVENT event,
        }
        if (skb)
                dev_kfree_skb(skb);
-       
+
        return 0;
 }
 
@@ -163,7 +163,7 @@ static int irlan_provider_state_info(struct irlan_cb *self, IRLAN_EVENT event,
  *    reply
  *
  */
-static int irlan_provider_state_open(struct irlan_cb *self, IRLAN_EVENT event, 
+static int irlan_provider_state_open(struct irlan_cb *self, IRLAN_EVENT event,
                                     struct sk_buff *skb)
 {
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
@@ -173,11 +173,11 @@ static int irlan_provider_state_open(struct irlan_cb *self, IRLAN_EVENT event,
        switch(event) {
        case IRLAN_FILTER_CONFIG_CMD:
                irlan_provider_parse_command(self, CMD_FILTER_OPERATION, skb);
-               irlan_provider_send_reply(self, CMD_FILTER_OPERATION, 
+               irlan_provider_send_reply(self, CMD_FILTER_OPERATION,
                                          RSP_SUCCESS);
                /* Keep state */
                break;
-       case IRLAN_DATA_CONNECT_INDICATION: 
+       case IRLAN_DATA_CONNECT_INDICATION:
                irlan_next_provider_state(self, IRLAN_DATA);
                irlan_provider_connect_response(self, self->tsap_data);
                break;
@@ -202,8 +202,8 @@ static int irlan_provider_state_open(struct irlan_cb *self, IRLAN_EVENT event,
  *    the local and remote machines.
  *
  */
-static int irlan_provider_state_data(struct irlan_cb *self, IRLAN_EVENT event, 
-                                    struct sk_buff *skb) 
+static int irlan_provider_state_data(struct irlan_cb *self, IRLAN_EVENT event,
+                                    struct sk_buff *skb)
 {
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );
 
@@ -213,7 +213,7 @@ static int irlan_provider_state_data(struct irlan_cb *self, IRLAN_EVENT event,
        switch(event) {
        case IRLAN_FILTER_CONFIG_CMD:
                irlan_provider_parse_command(self, CMD_FILTER_OPERATION, skb);
-               irlan_provider_send_reply(self, CMD_FILTER_OPERATION, 
+               irlan_provider_send_reply(self, CMD_FILTER_OPERATION,
                                          RSP_SUCCESS);
                break;
        case IRLAN_LMP_DISCONNECT: /* FALLTHROUGH */
@@ -226,7 +226,7 @@ static int irlan_provider_state_data(struct irlan_cb *self, IRLAN_EVENT event,
        }
        if (skb)
                dev_kfree_skb(skb);
-       
+
        return 0;
 }
 
index e7852a07495e44785c4b42148d22f69e12dd9fc7..d93ebd11431e86b2c82f65fc220e7e1316abfc50 100644 (file)
@@ -87,7 +87,7 @@ int __init irlap_init(void)
        /* Allocate master array */
        irlap = hashbin_new(HB_LOCK);
        if (irlap == NULL) {
-               IRDA_ERROR("%s: can't allocate irlap hashbin!\n",
+               IRDA_ERROR("%s: can't allocate irlap hashbin!\n",
                           __FUNCTION__);
                return -ENOMEM;
        }
@@ -701,8 +701,8 @@ void irlap_update_nr_received(struct irlap_cb *self, int nr)
        int count = 0;
 
        /*
-         * Remove all the ack-ed frames from the window queue.
-         */
+        * Remove all the ack-ed frames from the window queue.
+        */
 
        /*
         *  Optimize for the common case. It is most likely that the receiver
@@ -1109,13 +1109,13 @@ static void *irlap_seq_start(struct seq_file *seq, loff_t *pos)
        spin_lock_irq(&irlap->hb_spinlock);
        iter->id = 0;
 
-       for (self = (struct irlap_cb *) hashbin_get_first(irlap); 
+       for (self = (struct irlap_cb *) hashbin_get_first(irlap);
             self; self = (struct irlap_cb *) hashbin_get_next(irlap)) {
                if (iter->id == *pos)
                        break;
                ++iter->id;
        }
-               
+
        return self;
 }
 
@@ -1137,7 +1137,7 @@ static int irlap_seq_show(struct seq_file *seq, void *v)
 {
        const struct irlap_iter_state *iter = seq->private;
        const struct irlap_cb *self = v;
-       
+
        IRDA_ASSERT(self->magic == LAP_MAGIC, return -EINVAL;);
 
        seq_printf(seq, "irlap%d ", iter->id);
@@ -1222,7 +1222,7 @@ static int irlap_seq_open(struct inode *inode, struct file *file)
        struct seq_file *seq;
        int rc = -ENOMEM;
        struct irlap_iter_state *s = kzalloc(sizeof(*s), GFP_KERNEL);
-       
+
        if (!s)
                goto out;
 
@@ -1244,7 +1244,7 @@ out_kfree:
        goto out;
 }
 
-struct file_operations irlap_seq_fops = {
+const struct file_operations irlap_seq_fops = {
        .owner          = THIS_MODULE,
        .open           = irlap_seq_open,
        .read           = seq_read,
index 99faff68c399aa92422453f79497889113de9094..7b6433fe1dc23d4bacbff6eed1efd7937d201583 100644 (file)
@@ -827,7 +827,7 @@ static int irlap_state_conn(struct irlap_cb *self, IRLAP_EVENT event,
                irlap_disconnect_indication(self, LAP_DISC_INDICATION);
                break;
        default:
-               IRDA_DEBUG(1, "%s(), Unknown event %d, %s\n", __FUNCTION__, 
+               IRDA_DEBUG(1, "%s(), Unknown event %d, %s\n", __FUNCTION__,
                           event, irlap_event[event]);
 
                ret = -1;
@@ -864,7 +864,7 @@ static int irlap_state_setup(struct irlap_cb *self, IRLAP_EVENT event,
  *  between 15 msecs and 45 msecs.
  */
                        irlap_start_backoff_timer(self, msecs_to_jiffies(20 +
-                                                       (jiffies % 30)));
+                                                       (jiffies % 30)));
                } else {
                        /* Always switch state before calling upper layers */
                        irlap_next_state(self, LAP_NDM);
@@ -1377,7 +1377,7 @@ static int irlap_state_nrm_p(struct irlap_cb *self, IRLAP_EVENT event,
                                /* Resend rejected frames */
                                irlap_resend_rejected_frames(self, CMD_FRAME);
 
-                               /* Give peer some time to retransmit! 
+                               /* Give peer some time to retransmit!
                                 * But account for our own Tx. */
                                irlap_start_final_timer(self, 2 * self->final_timeout);
 
index dba349c832d02454b8451bbd02aa1935e23d9e15..0b04603e9c475bb9b95ac05d1c5d6e48e3c08a6c 100644 (file)
@@ -414,7 +414,7 @@ static void irlap_recv_discovery_xid_rsp(struct irlap_cb *self,
                IRDA_ERROR("%s: frame to short!\n", __FUNCTION__);
                return;
        }
-               
+
        xid = (struct xid_frame *) skb->data;
 
        info->daddr = le32_to_cpu(xid->saddr);
@@ -485,7 +485,7 @@ static void irlap_recv_discovery_xid_cmd(struct irlap_cb *self,
                IRDA_ERROR("%s: frame to short!\n", __FUNCTION__);
                return;
        }
-       
+
        xid = (struct xid_frame *) skb->data;
 
        info->daddr = le32_to_cpu(xid->saddr);
@@ -524,7 +524,7 @@ static void irlap_recv_discovery_xid_cmd(struct irlap_cb *self,
         */
        if (info->s == 0xff) {
                /* Check if things are sane at this point... */
-               if((discovery_info == NULL) || 
+               if((discovery_info == NULL) ||
                   !pskb_may_pull(skb, 3)) {
                        IRDA_ERROR("%s: discovery frame to short!\n",
                                   __FUNCTION__);
index 7e5d12ab3b90dd1f580465089a6b150377eb07b9..9df0461b6d18fe8b6750b77c2d1bbc716236ca60 100644 (file)
@@ -116,7 +116,7 @@ int __init irlmp_init(void)
  *    Remove IrLMP layer
  *
  */
-void __exit irlmp_cleanup(void) 
+void __exit irlmp_cleanup(void)
 {
        /* Check for main structure */
        IRDA_ASSERT(irlmp != NULL, return;);
@@ -892,7 +892,7 @@ void irlmp_discovery_request(int nslots)
 
        /*
         * Start a single discovery operation if discovery is not already
-         * running
+        * running
         */
        if (!sysctl_discovery) {
                /* Check if user wants to override the default */
@@ -1528,12 +1528,12 @@ int irlmp_unregister_service(void *handle)
 
        /* Refresh current hint bits */
        spin_lock_irqsave(&irlmp->services->hb_spinlock, flags);
-        service = (irlmp_service_t *) hashbin_get_first(irlmp->services);
-        while (service) {
+       service = (irlmp_service_t *) hashbin_get_first(irlmp->services);
+       while (service) {
                irlmp->hints.word |= service->hints.word;
 
-                service = (irlmp_service_t *)hashbin_get_next(irlmp->services);
-        }
+               service = (irlmp_service_t *)hashbin_get_next(irlmp->services);
+       }
        spin_unlock_irqrestore(&irlmp->services->hb_spinlock, flags);
        return 0;
 }
@@ -1861,7 +1861,7 @@ static void *irlmp_seq_hb_idx(struct irlmp_iter_state *iter, loff_t *off)
 
        spin_lock_irq(&iter->hashbin->hb_spinlock);
        for (element = hashbin_get_first(iter->hashbin);
-            element != NULL; 
+            element != NULL;
             element = hashbin_get_next(iter->hashbin)) {
                if (!off || *off-- == 0) {
                        /* NB: hashbin left locked */
@@ -1918,7 +1918,7 @@ static void *irlmp_seq_next(struct seq_file *seq, void *v, loff_t *pos)
        if (v == NULL) {                        /* no more in this hash bin */
                spin_unlock_irq(&iter->hashbin->hb_spinlock);
 
-               if (iter->hashbin == irlmp->unconnected_lsaps) 
+               if (iter->hashbin == irlmp->unconnected_lsaps)
                        v =  LINK_START_TOKEN;
 
                iter->hashbin = NULL;
@@ -2026,7 +2026,7 @@ out_kfree:
        goto out;
 }
 
-struct file_operations irlmp_seq_fops = {
+const struct file_operations irlmp_seq_fops = {
        .owner          = THIS_MODULE,
        .open           = irlmp_seq_open,
        .read           = seq_read,
index 4c90dd1b450317b22af7acaeb5b61ca3a19cd952..65ffa981510add944657bac1a9e766425da732cf 100644 (file)
@@ -615,7 +615,7 @@ static int irlmp_state_connect(struct lsap_cb *self, IRLMP_EVENT event,
        default:
                /* LM_LAP_DISCONNECT_INDICATION : Should never happen, we
                 * are *not* yet bound to the IrLAP link. Jean II */
-               IRDA_DEBUG(0, "%s(), Unknown event %s on LSAP %#02x\n", 
+               IRDA_DEBUG(0, "%s(), Unknown event %s on LSAP %#02x\n",
                           __FUNCTION__, irlmp_event[event], self->slsap_sel);
                break;
        }
index 39761a1d18f53058e5c45490d44e5dfa3e647855..559302d3fe66264611100da2352010ebe0580897 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      irlmp_frame.c
  * Version:       0.9
  * Description:   IrLMP frame implementation
@@ -8,18 +8,18 @@
  * Created at:    Tue Aug 19 02:09:59 1997
  * Modified at:   Mon Dec 13 13:41:12 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
+ *
  *     Copyright (c) 1998-1999 Dag Brattli <dagb@cs.uit.no>
  *     All Rights Reserved.
  *     Copyright (c) 2000-2003 Jean Tourrilhes <jt@hpl.hp.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 
+ *
+ *     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.
  *
  *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
+ *     provide warranty for any of this software. This material is
  *     provided "AS-IS" and at no charge.
  *
  ********************************************************************/
@@ -34,7 +34,7 @@
 #include <net/irda/irlmp_frame.h>
 #include <net/irda/discovery.h>
 
-static struct lsap_cb *irlmp_find_lsap(struct lap_cb *self, __u8 dlsap, 
+static struct lsap_cb *irlmp_find_lsap(struct lap_cb *self, __u8 dlsap,
                                       __u8 slsap, int status, hashbin_t *);
 
 inline void irlmp_send_data_pdu(struct lap_cb *self, __u8 dlsap, __u8 slsap,
@@ -56,18 +56,18 @@ inline void irlmp_send_data_pdu(struct lap_cb *self, __u8 dlsap, __u8 slsap,
  *    Send Link Control Frame to IrLAP
  */
 void irlmp_send_lcf_pdu(struct lap_cb *self, __u8 dlsap, __u8 slsap,
-                       __u8 opcode, struct sk_buff *skb) 
+                       __u8 opcode, struct sk_buff *skb)
 {
        __u8 *frame;
-       
+
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
 
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == LMP_LAP_MAGIC, return;);
        IRDA_ASSERT(skb != NULL, return;);
-       
+
        frame = skb->data;
-       
+
        frame[0] = dlsap | CONTROL_BIT;
        frame[1] = slsap;
 
@@ -87,14 +87,14 @@ void irlmp_send_lcf_pdu(struct lap_cb *self, __u8 dlsap, __u8 slsap,
  *    Used by IrLAP to pass received data frames to IrLMP layer
  *
  */
-void irlmp_link_data_indication(struct lap_cb *self, struct sk_buff *skb, 
+void irlmp_link_data_indication(struct lap_cb *self, struct sk_buff *skb,
                                int unreliable)
 {
        struct lsap_cb *lsap;
        __u8   slsap_sel;   /* Source (this) LSAP address */
        __u8   dlsap_sel;   /* Destination LSAP address */
        __u8   *fp;
-       
+
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__);
 
        IRDA_ASSERT(self != NULL, return;);
@@ -104,11 +104,11 @@ void irlmp_link_data_indication(struct lap_cb *self, struct sk_buff *skb,
        fp = skb->data;
 
        /*
-        *  The next statements may be confusing, but we do this so that 
+        *  The next statements may be confusing, but we do this so that
         *  destination LSAP of received frame is source LSAP in our view
         */
-       slsap_sel = fp[0] & LSAP_MASK; 
-       dlsap_sel = fp[1];      
+       slsap_sel = fp[0] & LSAP_MASK;
+       dlsap_sel = fp[1];
 
        /*
         *  Check if this is an incoming connection, since we must deal with
@@ -118,11 +118,11 @@ void irlmp_link_data_indication(struct lap_cb *self, struct sk_buff *skb,
                IRDA_DEBUG(3, "%s(), incoming connection, "
                           "source LSAP=%d, dest LSAP=%d\n",
                           __FUNCTION__, slsap_sel, dlsap_sel);
-               
+
                /* Try to find LSAP among the unconnected LSAPs */
                lsap = irlmp_find_lsap(self, dlsap_sel, slsap_sel, CONNECT_CMD,
                                       irlmp->unconnected_lsaps);
-               
+
                /* Maybe LSAP was already connected, so try one more time */
                if (!lsap) {
                        IRDA_DEBUG(1, "%s(), incoming connection for LSAP already connected\n", __FUNCTION__);
@@ -130,9 +130,9 @@ void irlmp_link_data_indication(struct lap_cb *self, struct sk_buff *skb,
                                               self->lsaps);
                }
        } else
-               lsap = irlmp_find_lsap(self, dlsap_sel, slsap_sel, 0, 
+               lsap = irlmp_find_lsap(self, dlsap_sel, slsap_sel, 0,
                                       self->lsaps);
-       
+
        if (lsap == NULL) {
                IRDA_DEBUG(2, "IrLMP, Sorry, no LSAP for received frame!\n");
                IRDA_DEBUG(2, "%s(), slsap_sel = %02x, dlsap_sel = %02x\n",
@@ -146,8 +146,8 @@ void irlmp_link_data_indication(struct lap_cb *self, struct sk_buff *skb,
                return;
        }
 
-       /* 
-        *  Check if we received a control frame? 
+       /*
+        *  Check if we received a control frame?
         */
        if (fp[0] & CONTROL_BIT) {
                switch (fp[2]) {
@@ -161,7 +161,7 @@ void irlmp_link_data_indication(struct lap_cb *self, struct sk_buff *skb,
                case DISCONNECT:
                        IRDA_DEBUG(4, "%s(), Disconnect indication!\n",
                                   __FUNCTION__);
-                       irlmp_do_lsap_event(lsap, LM_DISCONNECT_INDICATION, 
+                       irlmp_do_lsap_event(lsap, LM_DISCONNECT_INDICATION,
                                            skb);
                        break;
                case ACCESSMODE_CMD:
@@ -181,7 +181,7 @@ void irlmp_link_data_indication(struct lap_cb *self, struct sk_buff *skb,
                        irlmp_udata_indication(lsap, skb);
                else
                        irlmp_do_lsap_event(lsap, LM_UDATA_INDICATION, skb);
-       } else {        
+       } else {
                /* Optimize and bypass the state machine if possible */
                if (lsap->lsap_state == LSAP_DATA_TRANSFER_READY)
                        irlmp_data_indication(lsap, skb);
@@ -193,7 +193,7 @@ void irlmp_link_data_indication(struct lap_cb *self, struct sk_buff *skb,
 /*
  * Function irlmp_link_unitdata_indication (self, skb)
  *
- *    
+ *
  *
  */
 #ifdef CONFIG_IRDA_ULTRA
@@ -205,7 +205,7 @@ void irlmp_link_unitdata_indication(struct lap_cb *self, struct sk_buff *skb)
        __u8   pid;         /* Protocol identifier */
        __u8   *fp;
        unsigned long flags;
-       
+
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__);
 
        IRDA_ASSERT(self != NULL, return;);
@@ -215,13 +215,13 @@ void irlmp_link_unitdata_indication(struct lap_cb *self, struct sk_buff *skb)
        fp = skb->data;
 
        /*
-        *  The next statements may be confusing, but we do this so that 
+        *  The next statements may be confusing, but we do this so that
         *  destination LSAP of received frame is source LSAP in our view
         */
-       slsap_sel = fp[0] & LSAP_MASK; 
+       slsap_sel = fp[0] & LSAP_MASK;
        dlsap_sel = fp[1];
        pid       = fp[2];
-       
+
        if (pid & 0x80) {
                IRDA_DEBUG(0, "%s(), extension in PID not supp!\n",
                           __FUNCTION__);
@@ -233,7 +233,7 @@ void irlmp_link_unitdata_indication(struct lap_cb *self, struct sk_buff *skb)
                IRDA_DEBUG(0, "%s(), dropping frame!\n", __FUNCTION__);
                return;
        }
-       
+
        /* Search the connectionless LSAP */
        spin_lock_irqsave(&irlmp->unconnected_lsaps->hb_spinlock, flags);
        lsap = (struct lsap_cb *) hashbin_get_first(irlmp->unconnected_lsaps);
@@ -241,10 +241,10 @@ void irlmp_link_unitdata_indication(struct lap_cb *self, struct sk_buff *skb)
                /*
                 *  Check if source LSAP and dest LSAP selectors and PID match.
                 */
-               if ((lsap->slsap_sel == slsap_sel) && 
-                   (lsap->dlsap_sel == dlsap_sel) && 
-                   (lsap->pid == pid)) 
-               {                       
+               if ((lsap->slsap_sel == slsap_sel) &&
+                   (lsap->dlsap_sel == dlsap_sel) &&
+                   (lsap->pid == pid))
+               {
                        break;
                }
                lsap = (struct lsap_cb *) hashbin_get_next(irlmp->unconnected_lsaps);
@@ -262,12 +262,12 @@ void irlmp_link_unitdata_indication(struct lap_cb *self, struct sk_buff *skb)
 /*
  * Function irlmp_link_disconnect_indication (reason, userdata)
  *
- *    IrLAP has disconnected 
+ *    IrLAP has disconnected
  *
  */
-void irlmp_link_disconnect_indication(struct lap_cb *lap, 
-                                     struct irlap_cb *irlap, 
-                                     LAP_REASON reason, 
+void irlmp_link_disconnect_indication(struct lap_cb *lap,
+                                     struct irlap_cb *irlap,
+                                     LAP_REASON reason,
                                      struct sk_buff *skb)
 {
        IRDA_DEBUG(2, "%s()\n", __FUNCTION__);
@@ -278,8 +278,8 @@ void irlmp_link_disconnect_indication(struct lap_cb *lap,
        lap->reason = reason;
        lap->daddr = DEV_ADDR_ANY;
 
-        /* FIXME: must do something with the skb if any */
-       
+       /* FIXME: must do something with the skb if any */
+
        /*
         *  Inform station state machine
         */
@@ -292,9 +292,9 @@ void irlmp_link_disconnect_indication(struct lap_cb *lap,
  *    Incoming LAP connection!
  *
  */
-void irlmp_link_connect_indication(struct lap_cb *self, __u32 saddr, 
+void irlmp_link_connect_indication(struct lap_cb *self, __u32 saddr,
                                   __u32 daddr, struct qos_info *qos,
-                                  struct sk_buff *skb) 
+                                  struct sk_buff *skb)
 {
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__);
 
@@ -314,7 +314,7 @@ void irlmp_link_connect_indication(struct lap_cb *self, __u32 saddr,
  *    LAP connection confirmed!
  *
  */
-void irlmp_link_connect_confirm(struct lap_cb *self, struct qos_info *qos, 
+void irlmp_link_connect_confirm(struct lap_cb *self, struct qos_info *qos,
                                struct sk_buff *skb)
 {
        IRDA_DEBUG(4, "%s()\n", __FUNCTION__);
@@ -359,7 +359,7 @@ void irlmp_link_connect_confirm(struct lap_cb *self, struct qos_info *qos,
  *
  * Jean II
  */
-void irlmp_link_discovery_indication(struct lap_cb *self, 
+void irlmp_link_discovery_indication(struct lap_cb *self,
                                     discovery_t *discovery)
 {
        IRDA_ASSERT(self != NULL, return;);
@@ -367,7 +367,7 @@ void irlmp_link_discovery_indication(struct lap_cb *self,
 
        /* Add to main log, cleanup */
        irlmp_add_discovery(irlmp->cachelog, discovery);
-       
+
        /* Just handle it the same way as a discovery confirm,
         * bypass the LM_LAP state machine (see below) */
        irlmp_discovery_confirm(irlmp->cachelog, DISCOVERY_PASSIVE);
@@ -387,7 +387,7 @@ void irlmp_link_discovery_confirm(struct lap_cb *self, hashbin_t *log)
 
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == LMP_LAP_MAGIC, return;);
-       
+
        /* Add to main log, cleanup */
        irlmp_add_discovery_log(irlmp->cachelog, log);
 
@@ -420,7 +420,7 @@ static inline void irlmp_update_cache(struct lap_cb *lap,
  *    Find handle associated with destination and source LSAP
  *
  * Any IrDA connection (LSAP/TSAP) is uniquely identified by
- * 3 parameters, the local lsap, the remote lsap and the remote address. 
+ * 3 parameters, the local lsap, the remote lsap and the remote address.
  * We may initiate multiple connections to the same remote service
  * (they will have different local lsap), a remote device may initiate
  * multiple connections to the same local service (they will have
@@ -433,20 +433,20 @@ static inline void irlmp_update_cache(struct lap_cb *lap,
  */
 static struct lsap_cb *irlmp_find_lsap(struct lap_cb *self, __u8 dlsap_sel,
                                       __u8 slsap_sel, int status,
-                                      hashbin_t *queue) 
+                                      hashbin_t *queue)
 {
        struct lsap_cb *lsap;
        unsigned long flags;
-       
-       /* 
+
+       /*
         *  Optimize for the common case. We assume that the last frame
         *  received is in the same connection as the last one, so check in
         *  cache first to avoid the linear search
         */
 #ifdef CONFIG_IRDA_CACHE_LAST_LSAP
-       if ((self->cache.valid) && 
-           (self->cache.slsap_sel == slsap_sel) && 
-           (self->cache.dlsap_sel == dlsap_sel)) 
+       if ((self->cache.valid) &&
+           (self->cache.slsap_sel == slsap_sel) &&
+           (self->cache.dlsap_sel == dlsap_sel))
        {
                return (self->cache.lsap);
        }
@@ -456,14 +456,14 @@ static struct lsap_cb *irlmp_find_lsap(struct lap_cb *self, __u8 dlsap_sel,
 
        lsap = (struct lsap_cb *) hashbin_get_first(queue);
        while (lsap != NULL) {
-               /* 
-                *  If this is an incoming connection, then the destination 
-                *  LSAP selector may have been specified as LM_ANY so that 
+               /*
+                *  If this is an incoming connection, then the destination
+                *  LSAP selector may have been specified as LM_ANY so that
                 *  any client can connect. In that case we only need to check
                 *  if the source LSAP (in our view!) match!
                 */
-               if ((status == CONNECT_CMD) && 
-                   (lsap->slsap_sel == slsap_sel) &&      
+               if ((status == CONNECT_CMD) &&
+                   (lsap->slsap_sel == slsap_sel) &&
                    (lsap->dlsap_sel == LSAP_ANY)) {
                        /* This is where the dest lsap sel is set on incoming
                         * lsaps */
@@ -473,8 +473,8 @@ static struct lsap_cb *irlmp_find_lsap(struct lap_cb *self, __u8 dlsap_sel,
                /*
                 *  Check if source LSAP and dest LSAP selectors match.
                 */
-               if ((lsap->slsap_sel == slsap_sel) && 
-                   (lsap->dlsap_sel == dlsap_sel)) 
+               if ((lsap->slsap_sel == slsap_sel) &&
+                   (lsap->dlsap_sel == dlsap_sel))
                        break;
 
                lsap = (struct lsap_cb *) hashbin_get_next(queue);
index 2869b16e417d273ac9bdbe4b355ee2d35bb2c295..826e6c4ca5d510ab3e54e088eeef7f4c458bf3ee 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      irmod.c
  * Version:       0.9
  * Description:   IrDA stack main entry points
@@ -8,19 +8,19 @@
  * Created at:    Mon Dec 15 13:55:39 1997
  * Modified at:   Wed Jan  5 15:12:41 2000
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
+ *
  *     Copyright (c) 1997, 1999-2000 Dag Brattli, All Rights Reserved.
  *     Copyright (c) 2000-2004 Jean Tourrilhes <jt@hpl.hp.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 
+ *
+ *     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.
- *  
+ *
  *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
+ *     provide warranty for any of this software. This material is
  *     provided "AS-IS" and at no charge.
- *     
+ *
  ********************************************************************/
 
 /*
@@ -52,7 +52,7 @@ extern void irda_sysctl_unregister(void);
 extern int  irsock_init(void);
 extern void irsock_cleanup(void);
 /* irlap_frame.c */
-extern int  irlap_driver_rcv(struct sk_buff *, struct net_device *, 
+extern int  irlap_driver_rcv(struct sk_buff *, struct net_device *,
                             struct packet_type *, struct net_device *);
 
 /*
@@ -104,16 +104,16 @@ static int __init irda_init(void)
        IRDA_DEBUG(0, "%s()\n", __FUNCTION__);
 
        /* Lower layer of the stack */
-       irlmp_init();
+       irlmp_init();
        irlap_init();
-       
+
        /* Higher layers of the stack */
        iriap_init();
-       irttp_init();
+       irttp_init();
        irsock_init();
-       
+
        /* Add IrDA packet type (Start receiving packets) */
-        dev_add_pack(&irda_packet_type);
+       dev_add_pack(&irda_packet_type);
 
        /* External APIs */
 #ifdef CONFIG_PROC_FS
@@ -124,7 +124,7 @@ static int __init irda_init(void)
 #endif
 
        /* Driver/dongle support */
-       irda_device_init();
+       irda_device_init();
 
        return 0;
 }
@@ -140,14 +140,14 @@ static void __exit irda_cleanup(void)
        /* Remove External APIs */
 #ifdef CONFIG_SYSCTL
        irda_sysctl_unregister();
-#endif 
+#endif
 #ifdef CONFIG_PROC_FS
        irda_proc_unregister();
 #endif
 
        /* Remove IrDA packet type (stop receiving packets) */
-        dev_remove_pack(&irda_packet_type);
-       
+       dev_remove_pack(&irda_packet_type);
+
        /* Remove higher layers */
        irsock_cleanup();
        irttp_cleanup();
@@ -177,8 +177,8 @@ static void __exit irda_cleanup(void)
  */
 subsys_initcall(irda_init);
 module_exit(irda_cleanup);
+
 MODULE_AUTHOR("Dag Brattli <dagb@cs.uit.no> & Jean Tourrilhes <jt@hpl.hp.com>");
-MODULE_DESCRIPTION("The Linux IrDA Protocol Stack"); 
+MODULE_DESCRIPTION("The Linux IrDA Protocol Stack");
 MODULE_LICENSE("GPL");
 MODULE_ALIAS_NETPROTO(PF_IRDA);
index 80887528e77efeb4c9655758371f6b73ccdac376..873ae189e37af107b22b0cf7427de8ca1fcadba6 100644 (file)
@@ -44,7 +44,7 @@
  * the generic Linux PPP driver. Because IrNET depend on recent
  * changes of the PPP driver interface, IrNET will work only with very
  * recent kernel (2.3.99-pre6 and up).
- * 
+ *
  * The present implementation offer the following features :
  *     o simple user interface using pppd
  *     o efficient implementation (interface directly to PPP and IrTTP)
 
 #define DEBUG_ASSERT           0       /* Verify all assertions */
 
-/* 
+/*
  * These are the macros we are using to actually print the debug
  * statements. Don't look at it, it's ugly...
  *
index f65c7a83bc5cf95d3f5884ec9391a888b59e590f..c378e668af0c2e1cea690245c114d296c12b3da9 100644 (file)
@@ -118,7 +118,7 @@ irnet_open_tsap(irnet_socket *      self)
 
   /* Open an IrTTP instance */
   self->tsap = irttp_open_tsap(LSAP_ANY, DEFAULT_INITIAL_CREDIT,
-                              &notify);        
+                              &notify);
   DABORT(self->tsap == NULL, -ENOMEM,
         IRDA_SR_ERROR, "Unable to allocate TSAP !\n");
 
@@ -188,7 +188,7 @@ irnet_ias_to_tsap(irnet_socket *    self,
          if(value->t.integer != -1)
            /* Get the remote TSAP selector */
            dtsap_sel = value->t.integer;
-         else 
+         else
            self->errno = -EADDRNOTAVAIL;
          break;
        default:
@@ -280,8 +280,8 @@ irnet_connect_tsap(irnet_socket *   self)
     }
 
   /* Connect to remote device */
-  err = irttp_connect_request(self->tsap, self->dtsap_sel, 
-                             self->rsaddr, self->daddr, NULL, 
+  err = irttp_connect_request(self->tsap, self->dtsap_sel,
+                             self->rsaddr, self->daddr, NULL,
                              self->max_sdu_size_rx, NULL);
   if(err != 0)
     {
@@ -438,7 +438,7 @@ irnet_dname_to_daddr(irnet_socket * self)
   if(discoveries == NULL)
     DRETURN(-ENETUNREACH, IRDA_SR_INFO, "Cachelog empty...\n");
 
-  /* 
+  /*
    * Now, check all discovered devices (if any), and connect
    * client only about the services that the client is
    * interested in...
@@ -627,7 +627,7 @@ irda_irnet_destroy(irnet_socket *   self)
 
   /* Unregister with LM-IAS */
   if(self->iriap)
-    { 
+    {
       iriap_close(self->iriap);
       self->iriap = NULL;
     }
@@ -945,7 +945,7 @@ irnet_setup_server(void)
 
   /* Register with LM-IAS (so that people can connect to us) */
   irnet_server.ias_obj = irias_new_object(IRNET_SERVICE_NAME, jiffies);
-  irias_add_integer_attrib(irnet_server.ias_obj, IRNET_IAS_VALUE, 
+  irias_add_integer_attrib(irnet_server.ias_obj, IRNET_IAS_VALUE,
                           irnet_server.s.stsap_sel, IAS_KERNEL_ATTR);
   irias_insert_object(irnet_server.ias_obj);
 
@@ -1076,7 +1076,7 @@ irnet_data_indication(void *      instance,
  */
 static void
 irnet_disconnect_indication(void *     instance,
-                           void *      sap, 
+                           void *      sap,
                            LM_REASON   reason,
                            struct sk_buff *skb)
 {
@@ -1166,10 +1166,10 @@ irnet_disconnect_indication(void *      instance,
  */
 static void
 irnet_connect_confirm(void *   instance,
-                     void *    sap, 
+                     void *    sap,
                      struct qos_info *qos,
                      __u32     max_sdu_size,
-                     __u8      max_header_size, 
+                     __u8      max_header_size,
                      struct sk_buff *skb)
 {
   irnet_socket *       self = (irnet_socket *) instance;
@@ -1235,7 +1235,7 @@ irnet_connect_confirm(void *      instance,
 static void
 irnet_flow_indication(void *   instance,
                      void *    sap,
-                     LOCAL_FLOW flow) 
+                     LOCAL_FLOW flow)
 {
   irnet_socket *       self = (irnet_socket *) instance;
   LOCAL_FLOW           oldflow = self->tx_flow;
@@ -1308,13 +1308,13 @@ irnet_status_indication(void *  instance,
  * Some other node is attempting to connect to the IrNET service, and has
  * sent a connection request on our server socket.
  * We just redirect the connection to the relevant IrNET socket.
- * 
+ *
  * Note : we also make sure that between 2 irnet nodes, there can
  * exist only one irnet connection.
  */
 static void
 irnet_connect_indication(void *                instance,
-                        void *         sap, 
+                        void *         sap,
                         struct qos_info *qos,
                         __u32          max_sdu_size,
                         __u8           max_header_size,
@@ -1463,7 +1463,7 @@ irnet_connect_indication(void *           instance,
  */
 static void
 irnet_getvalue_confirm(int     result,
-                      __u16    obj_id, 
+                      __u16    obj_id,
                       struct ias_value *value,
                       void *   priv)
 {
@@ -1526,7 +1526,7 @@ irnet_getvalue_confirm(int        result,
  */
 static void
 irnet_discovervalue_confirm(int                result,
-                           __u16       obj_id, 
+                           __u16       obj_id,
                            struct ias_value *value,
                            void *      priv)
 {
@@ -1645,7 +1645,7 @@ irnet_discovery_indication(discinfo_t *           discovery,
                           void *               priv)
 {
   irnet_socket *       self = &irnet_server.s;
-       
+
   DENTER(IRDA_OCB_TRACE, "(self=0x%p)\n", self);
   DASSERT(priv == &irnet_server, , IRDA_OCB_ERROR,
          "Invalid instance (0x%p) !!!\n", priv);
@@ -1676,7 +1676,7 @@ irnet_expiry_indication(discinfo_t *      expiry,
                        void *          priv)
 {
   irnet_socket *       self = &irnet_server.s;
-       
+
   DENTER(IRDA_OCB_TRACE, "(self=0x%p)\n", self);
   DASSERT(priv == &irnet_server, , IRDA_OCB_ERROR,
          "Invalid instance (0x%p) !!!\n", priv);
@@ -1718,7 +1718,7 @@ irnet_proc_read(char *    buf,
   int                  i = 0;
 
   len = 0;
-       
+
   /* Get the IrNET server information... */
   len += sprintf(buf+len, "IrNET server - ");
   len += sprintf(buf+len, "IrDA state: %s, ",
@@ -1811,7 +1811,7 @@ irda_irnet_init(void)
   memset(&irnet_server, 0, sizeof(struct irnet_root));
 
   /* Setup start of irnet instance list */
-  irnet_server.list = hashbin_new(HB_NOLOCK); 
+  irnet_server.list = hashbin_new(HB_NOLOCK);
   DABORT(irnet_server.list == NULL, -ENOMEM,
         MODULE_ERROR, "Can't allocate hashbin!\n");
   /* Init spinlock for instance list */
index f2fecd32d8f6469dabedf96ecbd049baee895c2d..0ba92d0d52040e6c142dd7a1184d6cb44e87dde7 100644 (file)
@@ -146,7 +146,7 @@ static void
                               void *);
 static void
        irnet_discovervalue_confirm(int,
-                                   __u16, 
+                                   __u16,
                                    struct ias_value *,
                                    void *);
 #ifdef DISCOVERY_EVENTS
index a1e502ff90709a0e98b1da34e48e88eee7bd019c..2f9f8dce5a6946b1f72772b05f30eeaf550b4691 100644 (file)
@@ -93,7 +93,7 @@ irnet_ctrl_write(irnet_socket *       ap,
 
       /* Check if we recognised one of the known command
        * We can't use "switch" with strings, so hack with "continue" */
-      
+
       /* First command : name -> Requested IrDA nickname */
       if(!strncmp(start, "name", 4))
        {
@@ -744,7 +744,7 @@ dev_irnet_ioctl(struct inode *      inode,
       break;
 
       /* Set DTR/RTS */
-    case TIOCMBIS: 
+    case TIOCMBIS:
     case TIOCMBIC:
       /* Set exclusive/non-exclusive mode */
     case TIOCEXCL:
@@ -941,7 +941,7 @@ ppp_irnet_send(struct ppp_channel * chan,
   ret = irttp_data_request(self->tsap, skb);
   if(ret < 0)
     {
-      /*   
+      /*
        * > IrTTPs tx queue is full, so we just have to
        * > drop the frame! You might think that we should
        * > just return -1 and don't deallocate the frame,
@@ -949,7 +949,7 @@ ppp_irnet_send(struct ppp_channel * chan,
        * > we have replaced the original skb with a new
        * > one with larger headroom, and that would really
        * > confuse do_dev_queue_xmit() in dev.c! I have
-       * > tried :-) DB 
+       * > tried :-) DB
        * Correction : we verify the flow control above (self->tx_flow),
        * so we come here only if IrTTP doesn't like the packet (empty,
        * too large, IrTTP not connected). In those rare cases, it's ok
@@ -1136,6 +1136,6 @@ irnet_cleanup(void)
 module_init(irnet_init);
 module_exit(irnet_cleanup);
 MODULE_AUTHOR("Jean Tourrilhes <jt@hpl.hp.com>");
-MODULE_DESCRIPTION("IrNET : Synchronous PPP over IrDA"); 
+MODULE_DESCRIPTION("IrNET : Synchronous PPP over IrDA");
 MODULE_LICENSE("GPL");
 MODULE_ALIAS_CHARDEV(10, 187);
index 88b9c43f637082fffa3f07c76d975ce34e0d7799..d6f9aba5b9dc1de454e058d4bb037ef0e56445cf 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      irproc.c
  * Version:       1.0
  * Description:   Various entries in the /proc file system
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  *
  *     Copyright (c) 1998-1999, Dag Brattli <dagb@cs.uit.no>
- *     Copyright (c) 1998, Thomas Davis, <ratbert@radiks.net>, 
+ *     Copyright (c) 1998, Thomas Davis, <ratbert@radiks.net>,
  *     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 
+ *
+ *     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.
- *  
- *     I, Thomas Davis, provide no warranty for any of this software. 
- *     This material is provided "AS-IS" and at no charge. 
- *     
+ *
+ *     I, Thomas Davis, provide no warranty for any of this software.
+ *     This material is provided "AS-IS" and at no charge.
+ *
  ********************************************************************/
 
 #include <linux/miscdevice.h>
@@ -46,7 +46,7 @@ struct irda_entry {
 
 struct proc_dir_entry *proc_irda;
 EXPORT_SYMBOL(proc_irda);
+
 static struct irda_entry irda_dirs[] = {
        {"discovery",   &discovery_seq_fops},
        {"irttp",       &irttp_seq_fops},
@@ -61,7 +61,7 @@ static struct irda_entry irda_dirs[] = {
  *    Register irda entry in /proc file system
  *
  */
-void __init irda_proc_register(void) 
+void __init irda_proc_register(void)
 {
        int i;
        struct proc_dir_entry *d;
@@ -73,7 +73,7 @@ void __init irda_proc_register(void)
 
        for (i=0; i<ARRAY_SIZE(irda_dirs); i++) {
                d = create_proc_entry(irda_dirs[i].name, 0, proc_irda);
-               if (d) 
+               if (d)
                        d->proc_fops = irda_dirs[i].fops;
        }
 }
@@ -84,17 +84,17 @@ void __init irda_proc_register(void)
  *    Unregister irda entry in /proc file system
  *
  */
-void __exit irda_proc_unregister(void) 
+void __exit irda_proc_unregister(void)
 {
        int i;
 
-        if (proc_irda) {
-                for (i=0; i<ARRAY_SIZE(irda_dirs); i++)
-                        remove_proc_entry(irda_dirs[i].name, proc_irda);
+       if (proc_irda) {
+               for (i=0; i<ARRAY_SIZE(irda_dirs); i++)
+                       remove_proc_entry(irda_dirs[i].name, proc_irda);
 
-                remove_proc_entry("irda", proc_net);
-                proc_irda = NULL;
-        }
+               remove_proc_entry("irda", proc_net);
+               proc_irda = NULL;
+       }
 }
 
 
index 1d26cd33ea13af07bbc22e53df6ce54c02f3e759..92662330dbcf0aee2bf1b7e0fc557ef36a64895e 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      irqueue.c
  * Version:       0.3
  * Description:   General queue implementation
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
  * Modified at:   Thu Jan  4 14:29:10 CET 2001
  * Modified by:   Marc Zyngier <mzyngier@freesurf.fr>
- * 
+ *
  *     Copyright (C) 1998-1999, Aage Kvalnes <aage@cs.uit.no>
- *     Copyright (C) 1998, Dag Brattli, 
+ *     Copyright (C) 1998, Dag Brattli,
  *     All Rights Reserved.
  *
  *     This code is taken from the Vortex Operating System written by Aage
  *     Kvalnes. Aage has agreed that this code can use the GPL licence,
  *     although he does not use that licence in his own code.
- *     
+ *
  *     This copyright does however _not_ include the ELF hash() function
  *     which I currently don't know which licence or copyright it
  *     has. Please inform me if you know.
- *      
- *     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 
+ *
+ *     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.
- *  
+ *
  *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
+ *     provide warranty for any of this software. This material is
  *     provided "AS-IS" and at no charge.
- *     
+ *
  ********************************************************************/
 
 /*
@@ -213,7 +213,7 @@ static __u32 hash( const char* name)
 {
        __u32 h = 0;
        __u32 g;
-       
+
        while(*name) {
                h = (h<<4) + *name++;
                if ((g = (h & 0xf0000000)))
@@ -231,7 +231,7 @@ static __u32 hash( const char* name)
  */
 static void enqueue_first(irda_queue_t **queue, irda_queue_t* element)
 {
-       
+
        IRDA_DEBUG( 4, "%s()\n", __FUNCTION__);
 
        /*
@@ -242,7 +242,7 @@ static void enqueue_first(irda_queue_t **queue, irda_queue_t* element)
                 * Queue is empty.  Insert one element into the queue.
                 */
                element->q_next = element->q_prev = *queue = element;
-               
+
        } else {
                /*
                 * Queue is not empty.  Insert element into front of queue.
@@ -267,20 +267,20 @@ static irda_queue_t *dequeue_first(irda_queue_t **queue)
        irda_queue_t *ret;
 
        IRDA_DEBUG( 4, "dequeue_first()\n");
-       
+
        /*
         * Set return value
         */
        ret =  *queue;
-       
+
        if ( *queue == NULL ) {
                /*
                 * Queue was empty.
                 */
        } else if ( (*queue)->q_next == *queue ) {
-               /* 
+               /*
                 *  Queue only contained a single element. It will now be
-                *  empty.  
+                *  empty.
                 */
                *queue = NULL;
        } else {
@@ -291,7 +291,7 @@ static irda_queue_t *dequeue_first(irda_queue_t **queue)
                (*queue)->q_next->q_prev = (*queue)->q_prev;
                *queue = (*queue)->q_next;
        }
-       
+
        /*
         * Return the removed entry (or NULL of queue was empty).
         */
@@ -306,25 +306,25 @@ static irda_queue_t *dequeue_first(irda_queue_t **queue)
 static irda_queue_t *dequeue_general(irda_queue_t **queue, irda_queue_t* element)
 {
        irda_queue_t *ret;
-       
+
        IRDA_DEBUG( 4, "dequeue_general()\n");
-       
+
        /*
         * Set return value
         */
        ret =  *queue;
-               
+
        if ( *queue == NULL ) {
                /*
                 * Queue was empty.
                 */
        } else if ( (*queue)->q_next == *queue ) {
-               /* 
+               /*
                 *  Queue only contained a single element. It will now be
-                *  empty.  
+                *  empty.
                 */
                *queue = NULL;
-               
+
        } else {
                /*
                 *  Remove specific element.
@@ -334,7 +334,7 @@ static irda_queue_t *dequeue_general(irda_queue_t **queue, irda_queue_t* element
                if ( (*queue) == element)
                        (*queue) = element->q_next;
        }
-       
+
        /*
         * Return the removed entry (or NULL of queue was empty).
         */
@@ -352,7 +352,7 @@ static irda_queue_t *dequeue_general(irda_queue_t **queue, irda_queue_t* element
 hashbin_t *hashbin_new(int type)
 {
        hashbin_t* hashbin;
-       
+
        /*
         * Allocate new hashbin
         */
@@ -380,8 +380,8 @@ EXPORT_SYMBOL(hashbin_new);
 /*
  * Function hashbin_delete (hashbin, free_func)
  *
- *    Destroy hashbin, the free_func can be a user supplied special routine 
- *    for deallocating this structure if it's complex. If not the user can 
+ *    Destroy hashbin, the free_func can be a user supplied special routine
+ *    for deallocating this structure if it's complex. If not the user can
  *    just supply kfree, which should take care of the job.
  */
 int hashbin_delete( hashbin_t* hashbin, FREE_FUNC free_func)
@@ -392,7 +392,7 @@ int hashbin_delete( hashbin_t* hashbin, FREE_FUNC free_func)
 
        IRDA_ASSERT(hashbin != NULL, return -1;);
        IRDA_ASSERT(hashbin->magic == HB_MAGIC, return -1;);
-       
+
        /* Synchronize */
        if ( hashbin->hb_type & HB_LOCK ) {
                spin_lock_irqsave(&hashbin->hb_spinlock, flags);
@@ -407,11 +407,11 @@ int hashbin_delete( hashbin_t* hashbin, FREE_FUNC free_func)
                while (queue ) {
                        if (free_func)
                                (*free_func)(queue);
-                       queue = dequeue_first( 
+                       queue = dequeue_first(
                                (irda_queue_t**) &hashbin->hb_queue[i]);
                }
        }
-       
+
        /* Cleanup local data */
        hashbin->hb_current = NULL;
        hashbin->magic = ~HB_MAGIC;
@@ -438,7 +438,7 @@ EXPORT_SYMBOL(hashbin_delete);
  *    Insert an entry into the hashbin
  *
  */
-void hashbin_insert(hashbin_t* hashbin, irda_queue_t* entry, long hashv, 
+void hashbin_insert(hashbin_t* hashbin, irda_queue_t* entry, long hashv,
                    const char* name)
 {
        unsigned long flags = 0;
@@ -460,14 +460,14 @@ void hashbin_insert(hashbin_t* hashbin, irda_queue_t* entry, long hashv,
        if ( hashbin->hb_type & HB_LOCK ) {
                spin_lock_irqsave(&hashbin->hb_spinlock, flags);
        } /* Default is no-lock  */
-       
+
        /*
         * Store name and key
         */
        entry->q_hash = hashv;
        if ( name )
                strlcpy( entry->q_name, name, sizeof(entry->q_name));
-       
+
        /*
         * Insert new entry first
         */
@@ -482,7 +482,7 @@ void hashbin_insert(hashbin_t* hashbin, irda_queue_t* entry, long hashv,
 }
 EXPORT_SYMBOL(hashbin_insert);
 
-/* 
+/*
  *  Function hashbin_remove_first (hashbin)
  *
  *    Remove first entry of the hashbin
@@ -537,7 +537,7 @@ void *hashbin_remove_first( hashbin_t *hashbin)
 }
 
 
-/* 
+/*
  *  Function hashbin_remove (hashbin, hashv, name)
  *
  *    Remove entry with the given name
@@ -561,7 +561,7 @@ void* hashbin_remove( hashbin_t* hashbin, long hashv, const char* name)
 
        IRDA_ASSERT( hashbin != NULL, return NULL;);
        IRDA_ASSERT( hashbin->magic == HB_MAGIC, return NULL;);
-       
+
        /*
         * Locate hashbin
         */
@@ -601,7 +601,7 @@ void* hashbin_remove( hashbin_t* hashbin, long hashv, const char* name)
                        entry = entry->q_next;
                } while ( entry != hashbin->hb_queue[ bin ] );
        }
-       
+
        /*
         * If entry was found, dequeue it
         */
@@ -622,18 +622,18 @@ void* hashbin_remove( hashbin_t* hashbin, long hashv, const char* name)
        if ( hashbin->hb_type & HB_LOCK ) {
                spin_unlock_irqrestore(&hashbin->hb_spinlock, flags);
        } /* Default is no-lock  */
-       
-       
+
+
        /* Return */
-       if ( found ) 
+       if ( found )
                return entry;
        else
                return NULL;
-       
+
 }
 EXPORT_SYMBOL(hashbin_remove);
 
-/* 
+/*
  *  Function hashbin_remove_this (hashbin, entry)
  *
  *    Remove entry with the given name
@@ -655,7 +655,7 @@ void* hashbin_remove_this( hashbin_t* hashbin, irda_queue_t* entry)
        IRDA_ASSERT( hashbin != NULL, return NULL;);
        IRDA_ASSERT( hashbin->magic == HB_MAGIC, return NULL;);
        IRDA_ASSERT( entry != NULL, return NULL;);
-       
+
        /* Synchronize */
        if ( hashbin->hb_type & HB_LOCK ) {
                spin_lock_irqsave(&hashbin->hb_spinlock, flags);
@@ -722,7 +722,7 @@ void* hashbin_find( hashbin_t* hashbin, long hashv, const char* name )
        if ( name )
                hashv = hash( name );
        bin = GET_HASHBIN( hashv );
-       
+
        /*
         * Search for entry
         */
@@ -829,7 +829,7 @@ void* hashbin_find_next( hashbin_t* hashbin, long hashv, const char* name,
  *    called before any calls to hashbin_get_next()!
  *
  */
-irda_queue_t *hashbin_get_first( hashbin_t* hashbin) 
+irda_queue_t *hashbin_get_first( hashbin_t* hashbin)
 {
        irda_queue_t *entry;
        int i;
@@ -860,7 +860,7 @@ EXPORT_SYMBOL(hashbin_get_first);
  *    Get next item in hashbin. A series of hashbin_get_next() calls must
  *    be started by a call to hashbin_get_first(). The function returns
  *    NULL when all items have been traversed
- * 
+ *
  * The context of the search is stored within the hashbin, so you must
  * protect yourself from concurrent enumerations. - Jean II
  */
@@ -876,13 +876,13 @@ irda_queue_t *hashbin_get_next( hashbin_t *hashbin)
        if ( hashbin->hb_current == NULL) {
                IRDA_ASSERT( hashbin->hb_current != NULL, return NULL;);
                return NULL;
-       }       
+       }
        entry = hashbin->hb_current->q_next;
        bin = GET_HASHBIN( entry->q_hash);
 
-       /*  
+       /*
         *  Make sure that we are not back at the beginning of the queue
-        *  again 
+        *  again
         */
        if ( entry != hashbin->hb_queue[ bin ]) {
                hashbin->hb_current = entry;
@@ -895,7 +895,7 @@ irda_queue_t *hashbin_get_next( hashbin_t *hashbin)
         */
        if ( bin >= HASHBIN_SIZE)
                return NULL;
-       
+
        /*
         *  Move to next queue in hashbin
         */
@@ -904,7 +904,7 @@ irda_queue_t *hashbin_get_next( hashbin_t *hashbin)
                entry = hashbin->hb_queue[ i];
                if ( entry) {
                        hashbin->hb_current = entry;
-                       
+
                        return entry;
                }
        }
index 86805c3d8324a0d6ae158292e55139d110ec9920..2e968e7d8feaddb68a99ea775f5a90a91efe7973 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      irsysctl.c
  * Version:       1.0
  * Description:   Sysctl interface for IrDA
@@ -8,19 +8,19 @@
  * Created at:    Sun May 24 22:12:06 1998
  * Modified at:   Fri Jun  4 02:50:15 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
+ *
  *     Copyright (c) 1997, 1999 Dag Brattli, All Rights Reserved.
  *     Copyright (c) 2000-2001 Jean Tourrilhes <jt@hpl.hp.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 
+ *
+ *     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.
- *  
+ *
  *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
+ *     provide warranty for any of this software. This material is
  *     provided "AS-IS" and at no charge.
- *     
+ *
  ********************************************************************/
 
 #include <linux/mm.h>
@@ -111,7 +111,7 @@ static ctl_table irda_table[] = {
                .strategy       = &sysctl_string
        },
 #ifdef CONFIG_IRDA_DEBUG
-        {
+       {
                .ctl_name       = DEBUG,
                .procname       = "debug",
                .data           = &irda_debug,
@@ -121,7 +121,7 @@ static ctl_table irda_table[] = {
        },
 #endif
 #ifdef CONFIG_IRDA_FAST_RR
-        {
+       {
                .ctl_name       = FAST_POLL,
                .procname       = "fast_poll_increase",
                .data           = &sysctl_fast_poll_increase,
@@ -274,7 +274,7 @@ static struct ctl_table_header *irda_table_header;
  */
 int __init irda_sysctl_register(void)
 {
-       irda_table_header = register_sysctl_table(irda_root_table, 0);
+       irda_table_header = register_sysctl_table(irda_root_table);
        if (!irda_table_header)
                return -ENOMEM;
 
@@ -287,7 +287,7 @@ int __init irda_sysctl_register(void)
  *    Unregister our sysctl interface
  *
  */
-void __exit irda_sysctl_unregister(void) 
+void __exit irda_sysctl_unregister(void)
 {
        unregister_sysctl_table(irda_table_header);
 }
index 03504f3e4990cb82bb8592845d79c7525d172b09..a7486b3bddcb0150f7afadcab71ad40d85d6dec6 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                
+ *
  * Filename:      irttp.c
  * Version:       1.2
  * Description:   Tiny Transport Protocol (TTP) implementation
@@ -8,18 +8,18 @@
  * Created at:    Sun Aug 31 20:14:31 1997
  * Modified at:   Wed Jan  5 11:31:27 2000
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
- *     Copyright (c) 1998-2000 Dag Brattli <dagb@cs.uit.no>, 
+ *
+ *     Copyright (c) 1998-2000 Dag Brattli <dagb@cs.uit.no>,
  *     All Rights Reserved.
  *     Copyright (c) 2000-2003 Jean Tourrilhes <jt@hpl.hp.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 
+ *
+ *     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.
  *
  *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
+ *     provide warranty for any of this software. This material is
  *     provided "AS-IS" and at no charge.
  *
  ********************************************************************/
@@ -42,17 +42,17 @@ static struct irttp_cb *irttp;
 
 static void __irttp_close_tsap(struct tsap_cb *self);
 
-static int irttp_data_indication(void *instance, void *sap, 
+static int irttp_data_indication(void *instance, void *sap,
                                 struct sk_buff *skb);
-static int irttp_udata_indication(void *instance, void *sap, 
+static int irttp_udata_indication(void *instance, void *sap,
                                  struct sk_buff *skb);
-static void irttp_disconnect_indication(void *instance, void *sap,  
+static void irttp_disconnect_indication(void *instance, void *sap,
                                        LM_REASON reason, struct sk_buff *);
-static void irttp_connect_indication(void *instance, void *sap, 
+static void irttp_connect_indication(void *instance, void *sap,
                                     struct qos_info *qos, __u32 max_sdu_size,
                                     __u8 header_size, struct sk_buff *skb);
-static void irttp_connect_confirm(void *instance, void *sap, 
-                                 struct qos_info *qos, __u32 max_sdu_size, 
+static void irttp_connect_confirm(void *instance, void *sap,
+                                 struct qos_info *qos, __u32 max_sdu_size,
                                  __u8 header_size, struct sk_buff *skb);
 static void irttp_run_tx_queue(struct tsap_cb *self);
 static void irttp_run_rx_queue(struct tsap_cb *self);
@@ -61,7 +61,7 @@ static void irttp_flush_queues(struct tsap_cb *self);
 static void irttp_fragment_skb(struct tsap_cb *self, struct sk_buff *skb);
 static struct sk_buff *irttp_reassemble_skb(struct tsap_cb *self);
 static void irttp_todo_expired(unsigned long data);
-static int irttp_param_max_sdu_size(void *instance, irda_param_t *param, 
+static int irttp_param_max_sdu_size(void *instance, irda_param_t *param,
                                    int get);
 
 static void irttp_flow_indication(void *instance, void *sap, LOCAL_FLOW flow);
@@ -109,7 +109,7 @@ int __init irttp_init(void)
  *    Called by module destruction/cleanup code
  *
  */
-void __exit irttp_cleanup(void) 
+void __exit irttp_cleanup(void)
 {
        /* Check for main structure */
        IRDA_ASSERT(irttp->magic == TTP_MAGIC, return;);
@@ -865,7 +865,7 @@ static int irttp_udata_indication(void *instance, void *sap,
                err = self->notify.udata_indication(self->notify.instance,
                                                    self,skb);
                /* Same comment as in irttp_do_data_indication() */
-               if (!err) 
+               if (!err)
                        return 0;
        }
        /* Either no handler, or handler returns an error */
@@ -940,7 +940,7 @@ static int irttp_data_indication(void *instance, void *sap,
 
        /*
         * If the peer device has given us some credits and we didn't have
-         * anyone from before, then we need to shedule the tx queue.
+        * anyone from before, then we need to shedule the tx queue.
         * We need to do that because our Tx have stopped (so we may not
         * get any LAP flow indication) and the user may be stopped as
         * well. - Jean II
@@ -1798,14 +1798,14 @@ static void *irttp_seq_start(struct seq_file *seq, loff_t *pos)
        spin_lock_irq(&irttp->tsaps->hb_spinlock);
        iter->id = 0;
 
-       for (self = (struct tsap_cb *) hashbin_get_first(irttp->tsaps); 
+       for (self = (struct tsap_cb *) hashbin_get_first(irttp->tsaps);
             self != NULL;
             self = (struct tsap_cb *) hashbin_get_next(irttp->tsaps)) {
                if (iter->id == *pos)
                        break;
                ++iter->id;
        }
-               
+
        return self;
 }
 
@@ -1895,7 +1895,7 @@ out_kfree:
        goto out;
 }
 
-struct file_operations irttp_seq_fops = {
+const struct file_operations irttp_seq_fops = {
        .owner          = THIS_MODULE,
        .open           = irttp_seq_open,
        .read           = seq_read,
index 1324942f976c25056d95d985b408886ba9f45d34..75a72d203b01c785cd6dd70c59363f87e25a813b 100644 (file)
@@ -563,7 +563,7 @@ static int irda_param_extract(void *self, __u8 *buf, int len,
  *    safe. Returns the number of bytes that was parsed
  *
  */
-int irda_param_extract_all(void *self, __u8 *buf, int len, 
+int irda_param_extract_all(void *self, __u8 *buf, int len,
                           pi_param_info_t *info)
 {
        int ret = -1;
index 95a69c013ee84205f105d052ed74e8840c1e8d84..349012c926b704aa6ce28a645090ccd1413f3d0f 100644 (file)
@@ -1,5 +1,5 @@
 /*********************************************************************
- *                                
+ *
  * Filename:      qos.c
  * Version:       1.0
  * Description:   IrLAP QoS parameter negotiation
@@ -8,26 +8,26 @@
  * Created at:    Tue Sep  9 00:00:26 1997
  * Modified at:   Sun Jan 30 14:29:16 2000
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
- *     Copyright (c) 1998-2000 Dag Brattli <dagb@cs.uit.no>, 
+ *
+ *     Copyright (c) 1998-2000 Dag Brattli <dagb@cs.uit.no>,
  *     All Rights Reserved.
  *     Copyright (c) 2000-2001 Jean Tourrilhes <jt@hpl.hp.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 
+ *
+ *     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, 
+ *
+ *     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
- *     
+ *
  ********************************************************************/
 
 #include <asm/byteorder.h>
@@ -84,16 +84,16 @@ unsigned sysctl_max_tx_data_size = 2042;
 unsigned sysctl_max_tx_window = 7;
 
 static int irlap_param_baud_rate(void *instance, irda_param_t *param, int get);
-static int irlap_param_link_disconnect(void *instance, irda_param_t *parm, 
+static int irlap_param_link_disconnect(void *instance, irda_param_t *parm,
                                       int get);
-static int irlap_param_max_turn_time(void *instance, irda_param_t *param, 
+static int irlap_param_max_turn_time(void *instance, irda_param_t *param,
                                     int get);
 static int irlap_param_data_size(void *instance, irda_param_t *param, int get);
-static int irlap_param_window_size(void *instance, irda_param_t *param, 
+static int irlap_param_window_size(void *instance, irda_param_t *param,
                                   int get);
-static int irlap_param_additional_bofs(void *instance, irda_param_t *parm, 
+static int irlap_param_additional_bofs(void *instance, irda_param_t *parm,
                                       int get);
-static int irlap_param_min_turn_time(void *instance, irda_param_t *param, 
+static int irlap_param_min_turn_time(void *instance, irda_param_t *param,
                                     int get);
 
 #ifndef CONFIG_IRDA_DYNAMIC_WINDOW
@@ -101,7 +101,7 @@ static __u32 irlap_requested_line_capacity(struct qos_info *qos);
 #endif
 
 static __u32 min_turn_times[]  = { 10000, 5000, 1000, 500, 100, 50, 10, 0 }; /* us */
-static __u32 baud_rates[]      = { 2400, 9600, 19200, 38400, 57600, 115200, 576000, 
+static __u32 baud_rates[]      = { 2400, 9600, 19200, 38400, 57600, 115200, 576000,
                                   1152000, 4000000, 16000000 };           /* bps */
 static __u32 data_sizes[]      = { 64, 128, 256, 512, 1024, 2048 };        /* bytes */
 static __u32 add_bofs[]        = { 48, 24, 12, 5, 3, 2, 1, 0 };            /* bytes */
@@ -165,7 +165,7 @@ static pi_param_info_t irlap_param_info = { pi_major_call_table, 2, 0x7f, 7 };
 static inline int value_index(__u32 value, __u32 *array, int size)
 {
        int i;
-       
+
        for (i=0; i < size; i++)
                if (array[i] == value)
                        break;
@@ -178,7 +178,7 @@ static inline int value_index(__u32 value, __u32 *array, int size)
  *    Returns value to index in array, easy!
  *
  */
-static inline __u32 index_value(int index, __u32 *array) 
+static inline __u32 index_value(int index, __u32 *array)
 {
        return array[index];
 }
@@ -189,7 +189,7 @@ static inline __u32 index_value(int index, __u32 *array)
  *    Returns index to most significant bit (MSB) in word
  *
  */
-static int msb_index (__u16 word) 
+static int msb_index (__u16 word)
 {
        __u16 msb = 0x8000;
        int index = 15;   /* Current MSB */
@@ -298,12 +298,12 @@ void irda_qos_compute_intersection(struct qos_info *qos, struct qos_info *new)
  *
  *    The purpose of this function is for layers and drivers to be able to
  *    set the maximum QoS possible and then "and in" their own limitations
- * 
+ *
  */
 void irda_init_max_qos_capabilies(struct qos_info *qos)
 {
        int i;
-       /* 
+       /*
         *  These are the maximum supported values as specified on pages
         *  39-43 in IrLAP
         */
@@ -361,25 +361,25 @@ static void irlap_adjust_qos_settings(struct qos_info *qos)
                qos->min_turn_time.value = sysctl_min_tx_turn_time;
        }
 
-       /* 
+       /*
         * Not allowed to use a max turn time less than 500 ms if the baudrate
         * is less than 115200
         */
-       if ((qos->baud_rate.value < 115200) && 
+       if ((qos->baud_rate.value < 115200) &&
            (qos->max_turn_time.value < 500))
        {
-               IRDA_DEBUG(0, 
+               IRDA_DEBUG(0,
                           "%s(), adjusting max turn time from %d to 500 ms\n",
                           __FUNCTION__, qos->max_turn_time.value);
                qos->max_turn_time.value = 500;
        }
-       
+
        /*
-        * The data size must be adjusted according to the baud rate and max 
+        * The data size must be adjusted according to the baud rate and max
         * turn time
         */
        index = value_index(qos->data_size.value, data_sizes, 6);
-       line_capacity = irlap_max_line_capacity(qos->baud_rate.value, 
+       line_capacity = irlap_max_line_capacity(qos->baud_rate.value,
                                                qos->max_turn_time.value);
 
 #ifdef CONFIG_IRDA_DYNAMIC_WINDOW
@@ -427,32 +427,32 @@ static void irlap_adjust_qos_settings(struct qos_info *qos)
  *    We just set the QoS capabilities for the peer station
  *
  */
-int irlap_qos_negotiate(struct irlap_cb *self, struct sk_buff *skb) 
+int irlap_qos_negotiate(struct irlap_cb *self, struct sk_buff *skb)
 {
        int ret;
-       
-       ret = irda_param_extract_all(self, skb->data, skb->len, 
+
+       ret = irda_param_extract_all(self, skb->data, skb->len,
                                     &irlap_param_info);
-       
+
        /* Convert the negotiated bits to values */
        irda_qos_bits_to_value(&self->qos_tx);
        irda_qos_bits_to_value(&self->qos_rx);
 
        irlap_adjust_qos_settings(&self->qos_tx);
 
-       IRDA_DEBUG(2, "Setting BAUD_RATE to %d bps.\n", 
+       IRDA_DEBUG(2, "Setting BAUD_RATE to %d bps.\n",
                   self->qos_tx.baud_rate.value);
        IRDA_DEBUG(2, "Setting DATA_SIZE to %d bytes\n",
                   self->qos_tx.data_size.value);
-       IRDA_DEBUG(2, "Setting WINDOW_SIZE to %d\n", 
+       IRDA_DEBUG(2, "Setting WINDOW_SIZE to %d\n",
                   self->qos_tx.window_size.value);
-       IRDA_DEBUG(2, "Setting XBOFS to %d\n", 
+       IRDA_DEBUG(2, "Setting XBOFS to %d\n",
                   self->qos_tx.additional_bofs.value);
        IRDA_DEBUG(2, "Setting MAX_TURN_TIME to %d ms.\n",
                   self->qos_tx.max_turn_time.value);
        IRDA_DEBUG(2, "Setting MIN_TURN_TIME to %d usecs.\n",
                   self->qos_tx.min_turn_time.value);
-       IRDA_DEBUG(2, "Setting LINK_DISC to %d secs.\n", 
+       IRDA_DEBUG(2, "Setting LINK_DISC to %d secs.\n",
                   self->qos_tx.link_disc_time.value);
        return ret;
 }
@@ -463,55 +463,55 @@ int irlap_qos_negotiate(struct irlap_cb *self, struct sk_buff *skb)
  *    Insert QoS negotiaion pararameters into frame
  *
  */
-int irlap_insert_qos_negotiation_params(struct irlap_cb *self, 
+int irlap_insert_qos_negotiation_params(struct irlap_cb *self,
                                        struct sk_buff *skb)
 {
        int ret;
 
        /* Insert data rate */
-       ret = irda_param_insert(self, PI_BAUD_RATE, skb->tail, 
+       ret = irda_param_insert(self, PI_BAUD_RATE, skb->tail,
                                skb_tailroom(skb), &irlap_param_info);
        if (ret < 0)
                return ret;
        skb_put(skb, ret);
 
        /* Insert max turnaround time */
-       ret = irda_param_insert(self, PI_MAX_TURN_TIME, skb->tail, 
+       ret = irda_param_insert(self, PI_MAX_TURN_TIME, skb->tail,
                                skb_tailroom(skb), &irlap_param_info);
        if (ret < 0)
                return ret;
        skb_put(skb, ret);
 
        /* Insert data size */
-       ret = irda_param_insert(self, PI_DATA_SIZE, skb->tail, 
+       ret = irda_param_insert(self, PI_DATA_SIZE, skb->tail,
                                skb_tailroom(skb), &irlap_param_info);
        if (ret < 0)
                return ret;
        skb_put(skb, ret);
 
        /* Insert window size */
-       ret = irda_param_insert(self, PI_WINDOW_SIZE, skb->tail, 
+       ret = irda_param_insert(self, PI_WINDOW_SIZE, skb->tail,
                                skb_tailroom(skb), &irlap_param_info);
        if (ret < 0)
                return ret;
        skb_put(skb, ret);
 
        /* Insert additional BOFs */
-       ret = irda_param_insert(self, PI_ADD_BOFS, skb->tail, 
+       ret = irda_param_insert(self, PI_ADD_BOFS, skb->tail,
                                skb_tailroom(skb), &irlap_param_info);
        if (ret < 0)
                return ret;
        skb_put(skb, ret);
 
        /* Insert minimum turnaround time */
-       ret = irda_param_insert(self, PI_MIN_TURN_TIME, skb->tail, 
+       ret = irda_param_insert(self, PI_MIN_TURN_TIME, skb->tail,
                                skb_tailroom(skb), &irlap_param_info);
        if (ret < 0)
                return ret;
        skb_put(skb, ret);
 
        /* Insert link disconnect/threshold time */
-       ret = irda_param_insert(self, PI_LINK_DISC, skb->tail, 
+       ret = irda_param_insert(self, PI_LINK_DISC, skb->tail,
                                skb_tailroom(skb), &irlap_param_info);
        if (ret < 0)
                return ret;
@@ -537,12 +537,12 @@ static int irlap_param_baud_rate(void *instance, irda_param_t *param, int get)
 
        if (get) {
                param->pv.i = self->qos_rx.baud_rate.bits;
-               IRDA_DEBUG(2, "%s(), baud rate = 0x%02x\n", 
-                          __FUNCTION__, param->pv.i);          
+               IRDA_DEBUG(2, "%s(), baud rate = 0x%02x\n",
+                          __FUNCTION__, param->pv.i);
        } else {
-               /* 
+               /*
                 *  Stations must agree on baud rate, so calculate
-                *  intersection 
+                *  intersection
                 */
                IRDA_DEBUG(2, "Requested BAUD_RATE: 0x%04x\n", (__u16) param->pv.i);
                final = (__u16) param->pv.i & self->qos_rx.baud_rate.bits;
@@ -558,24 +558,24 @@ static int irlap_param_baud_rate(void *instance, irda_param_t *param, int get)
 /*
  * Function irlap_param_link_disconnect (instance, param, get)
  *
- *    Negotiate link disconnect/threshold time. 
+ *    Negotiate link disconnect/threshold time.
  *
  */
-static int irlap_param_link_disconnect(void *instance, irda_param_t *param, 
+static int irlap_param_link_disconnect(void *instance, irda_param_t *param,
                                       int get)
 {
        __u16 final;
-       
+
        struct irlap_cb *self = (struct irlap_cb *) instance;
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
-       
+
        if (get)
                param->pv.i = self->qos_rx.link_disc_time.bits;
        else {
-               /*  
-                *  Stations must agree on link disconnect/threshold 
+               /*
+                *  Stations must agree on link disconnect/threshold
                 *  time.
                 */
                IRDA_DEBUG(2, "LINK_DISC: %02x\n", (__u8) param->pv.i);
@@ -595,14 +595,14 @@ static int irlap_param_link_disconnect(void *instance, irda_param_t *param,
  *    will be negotiated independently for each station
  *
  */
-static int irlap_param_max_turn_time(void *instance, irda_param_t *param, 
+static int irlap_param_max_turn_time(void *instance, irda_param_t *param,
                                     int get)
 {
        struct irlap_cb *self = (struct irlap_cb *) instance;
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
-       
+
        if (get)
                param->pv.i = self->qos_rx.max_turn_time.bits;
        else
@@ -621,10 +621,10 @@ static int irlap_param_max_turn_time(void *instance, irda_param_t *param,
 static int irlap_param_data_size(void *instance, irda_param_t *param, int get)
 {
        struct irlap_cb *self = (struct irlap_cb *) instance;
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
-       
+
        if (get)
                param->pv.i = self->qos_rx.data_size.bits;
        else
@@ -640,14 +640,14 @@ static int irlap_param_data_size(void *instance, irda_param_t *param, int get)
  *    will be negotiated independently for each station
  *
  */
-static int irlap_param_window_size(void *instance, irda_param_t *param, 
+static int irlap_param_window_size(void *instance, irda_param_t *param,
                                   int get)
 {
        struct irlap_cb *self = (struct irlap_cb *) instance;
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
-       
+
        if (get)
                param->pv.i = self->qos_rx.window_size.bits;
        else
@@ -665,10 +665,10 @@ static int irlap_param_window_size(void *instance, irda_param_t *param,
 static int irlap_param_additional_bofs(void *instance, irda_param_t *param, int get)
 {
        struct irlap_cb *self = (struct irlap_cb *) instance;
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
-       
+
        if (get)
                param->pv.i = self->qos_rx.additional_bofs.bits;
        else
@@ -683,14 +683,14 @@ static int irlap_param_additional_bofs(void *instance, irda_param_t *param, int
  *    Negotiate the minimum turn around time. This is a type 1 parameter and
  *    will be negotiated independently for each station
  */
-static int irlap_param_min_turn_time(void *instance, irda_param_t *param, 
+static int irlap_param_min_turn_time(void *instance, irda_param_t *param,
                                     int get)
 {
        struct irlap_cb *self = (struct irlap_cb *) instance;
-       
+
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == LAP_MAGIC, return -1;);
-       
+
        if (get)
                param->pv.i = self->qos_rx.min_turn_time.bits;
        else
@@ -721,9 +721,9 @@ __u32 irlap_max_line_capacity(__u32 speed, __u32 max_turn_time)
 
        line_capacity = max_line_capacities[i][j];
 
-       IRDA_DEBUG(2, "%s(), line capacity=%d bytes\n", 
+       IRDA_DEBUG(2, "%s(), line capacity=%d bytes\n",
                   __FUNCTION__, line_capacity);
-       
+
        return line_capacity;
 }
 
@@ -749,7 +749,7 @@ void irda_qos_bits_to_value(struct qos_info *qos)
        int index;
 
        IRDA_ASSERT(qos != NULL, return;);
-       
+
        index = msb_index(qos->baud_rate.bits);
        qos->baud_rate.value = baud_rates[index];
 
@@ -761,13 +761,13 @@ void irda_qos_bits_to_value(struct qos_info *qos)
 
        index = msb_index(qos->min_turn_time.bits);
        qos->min_turn_time.value = min_turn_times[index];
-       
+
        index = msb_index(qos->max_turn_time.bits);
        qos->max_turn_time.value = max_turn_times[index];
 
        index = msb_index(qos->link_disc_time.bits);
        qos->link_disc_time.value = link_disc_times[index];
-       
+
        index = msb_index(qos->additional_bofs.bits);
        qos->additional_bofs.value = add_bofs[index];
 }
index 3871a2b911f93722e78791203eccb048d7b95a13..d3a6ee8cc4a281a60baa7522278294a3d5799e03 100644 (file)
@@ -1,25 +1,25 @@
 /*********************************************************************
- *                
+ *
  * Filename:      timer.c
- * Version:       
- * Description:   
+ * Version:
+ * Description:
  * Status:        Experimental.
  * Author:        Dag Brattli <dagb@cs.uit.no>
  * Created at:    Sat Aug 16 00:59:29 1997
  * Modified at:   Wed Dec  8 12:50:34 1999
  * Modified by:   Dag Brattli <dagb@cs.uit.no>
- * 
- *     Copyright (c) 1997, 1999 Dag Brattli <dagb@cs.uit.no>, 
+ *
+ *     Copyright (c) 1997, 1999 Dag Brattli <dagb@cs.uit.no>,
  *     All Rights Reserved.
  *     Copyright (c) 2000-2002 Jean Tourrilhes <jt@hpl.hp.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 
+ *
+ *     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.
  *
  *     Neither Dag Brattli nor University of Tromsø admit liability nor
- *     provide warranty for any of this software. This material is 
+ *     provide warranty for any of this software. This material is
  *     provided "AS-IS" and at no charge.
  *
  ********************************************************************/
@@ -40,11 +40,11 @@ static void irlap_query_timer_expired(void* data);
 static void irlap_final_timer_expired(void* data);
 static void irlap_wd_timer_expired(void* data);
 static void irlap_backoff_timer_expired(void* data);
-static void irlap_media_busy_expired(void* data); 
+static void irlap_media_busy_expired(void* data);
 
 void irlap_start_slot_timer(struct irlap_cb *self, int timeout)
 {
-       irda_start_timer(&self->slot_timer, timeout, (void *) self, 
+       irda_start_timer(&self->slot_timer, timeout, (void *) self,
                         irlap_slot_timer_expired);
 }
 
@@ -67,31 +67,31 @@ void irlap_start_query_timer(struct irlap_cb *self, int S, int s)
        /* Set or re-set the timer. We reset the timer for each received
         * discovery query, which allow us to automatically adjust to
         * the speed of the peer discovery (faster or slower). Jean II */
-       irda_start_timer( &self->query_timer, timeout, (void *) self, 
+       irda_start_timer( &self->query_timer, timeout, (void *) self,
                          irlap_query_timer_expired);
 }
 
 void irlap_start_final_timer(struct irlap_cb *self, int timeout)
 {
-       irda_start_timer(&self->final_timer, timeout, (void *) self, 
+       irda_start_timer(&self->final_timer, timeout, (void *) self,
                         irlap_final_timer_expired);
 }
 
 void irlap_start_wd_timer(struct irlap_cb *self, int timeout)
 {
-       irda_start_timer(&self->wd_timer, timeout, (void *) self, 
+       irda_start_timer(&self->wd_timer, timeout, (void *) self,
                         irlap_wd_timer_expired);
 }
 
 void irlap_start_backoff_timer(struct irlap_cb *self, int timeout)
 {
-       irda_start_timer(&self->backoff_timer, timeout, (void *) self, 
+       irda_start_timer(&self->backoff_timer, timeout, (void *) self,
                         irlap_backoff_timer_expired);
 }
 
 void irlap_start_mbusy_timer(struct irlap_cb *self, int timeout)
 {
-       irda_start_timer(&self->media_busy_timer, timeout, 
+       irda_start_timer(&self->media_busy_timer, timeout,
                         (void *) self, irlap_media_busy_expired);
 }
 
@@ -109,25 +109,25 @@ void irlap_stop_mbusy_timer(struct irlap_cb *self)
                irlap_do_event(self, MEDIA_BUSY_TIMER_EXPIRED, NULL, NULL);
 }
 
-void irlmp_start_watchdog_timer(struct lsap_cb *self, int timeout) 
+void irlmp_start_watchdog_timer(struct lsap_cb *self, int timeout)
 {
        irda_start_timer(&self->watchdog_timer, timeout, (void *) self,
                         irlmp_watchdog_timer_expired);
 }
 
-void irlmp_start_discovery_timer(struct irlmp_cb *self, int timeout) 
+void irlmp_start_discovery_timer(struct irlmp_cb *self, int timeout)
 {
        irda_start_timer(&self->discovery_timer, timeout, (void *) self,
                         irlmp_discovery_timer_expired);
 }
 
-void irlmp_start_idle_timer(struct lap_cb *self, int timeout) 
+void irlmp_start_idle_timer(struct lap_cb *self, int timeout)
 {
        irda_start_timer(&self->idle_timer, timeout, (void *) self,
                         irlmp_idle_timer_expired);
 }
 
-void irlmp_stop_idle_timer(struct lap_cb *self) 
+void irlmp_stop_idle_timer(struct lap_cb *self)
 {
        /* If timer is activated, kill it! */
        del_timer(&self->idle_timer);
@@ -147,7 +147,7 @@ static void irlap_slot_timer_expired(void *data)
        IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
 
        irlap_do_event(self, SLOT_TIMER_EXPIRED, NULL, NULL);
-} 
+}
 
 /*
  * Function irlap_query_timer_expired (data)
@@ -163,12 +163,12 @@ static void irlap_query_timer_expired(void *data)
        IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
 
        irlap_do_event(self, QUERY_TIMER_EXPIRED, NULL, NULL);
-} 
+}
 
 /*
  * Function irda_final_timer_expired (data)
  *
- *    
+ *
  *
  */
 static void irlap_final_timer_expired(void *data)
@@ -184,32 +184,32 @@ static void irlap_final_timer_expired(void *data)
 /*
  * Function irda_wd_timer_expired (data)
  *
- *    
+ *
  *
  */
 static void irlap_wd_timer_expired(void *data)
 {
        struct irlap_cb *self = (struct irlap_cb *) data;
-       
+
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
-       
+
        irlap_do_event(self, WD_TIMER_EXPIRED, NULL, NULL);
 }
 
 /*
  * Function irda_backoff_timer_expired (data)
  *
- *    
+ *
  *
  */
 static void irlap_backoff_timer_expired(void *data)
 {
        struct irlap_cb *self = (struct irlap_cb *) data;
-       
+
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == LAP_MAGIC, return;);
-       
+
        irlap_do_event(self, BACKOFF_TIMER_EXPIRED, NULL, NULL);
 }
 
@@ -217,7 +217,7 @@ static void irlap_backoff_timer_expired(void *data)
 /*
  * Function irtty_media_busy_expired (data)
  *
- *    
+ *
  */
 void irlap_media_busy_expired(void* data)
 {
index 87130c1c8693a91e678e418817b6f4bd09c10287..5abfb71aae8db6045d76236a4dd0285c4296bd31 100644 (file)
@@ -295,7 +295,7 @@ async_unwrap_bof(struct net_device *dev,
        case OUTSIDE_FRAME:
        case BEGIN_FRAME:
        default:
-               /* We may receive multiple BOF at the start of frame */ 
+               /* We may receive multiple BOF at the start of frame */
                break;
        }
 
index b4e444063d1f7004c2e39b8b6d8b2df3603ffc15..1c58204d767e6ad460775b13985833dcbf3d5f95 100644 (file)
@@ -152,7 +152,7 @@ static int pfkey_create(struct socket *sock, int protocol)
        sk = sk_alloc(PF_KEY, GFP_KERNEL, &key_proto, 1);
        if (sk == NULL)
                goto out;
-       
+
        sock->ops = &pfkey_ops;
        sock_init_data(sock, sk);
 
@@ -487,7 +487,7 @@ static int parse_exthdrs(struct sk_buff *skb, struct sadb_msg *hdr, void **ext_h
                            ext_type == SADB_X_EXT_NAT_T_OA) {
                                if (verify_address_len(p))
                                        return -EINVAL;
-                       }                               
+                       }
                        if (ext_type == SADB_X_EXT_SEC_CTX) {
                                if (verify_sec_ctx_len(p))
                                        return -EINVAL;
@@ -556,12 +556,12 @@ static int pfkey_sadb_addr2xfrm_addr(struct sadb_address *addr,
 {
        switch (((struct sockaddr*)(addr + 1))->sa_family) {
        case AF_INET:
-               xaddr->a4 = 
+               xaddr->a4 =
                        ((struct sockaddr_in *)(addr + 1))->sin_addr.s_addr;
                return AF_INET;
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
        case AF_INET6:
-               memcpy(xaddr->a6, 
+               memcpy(xaddr->a6,
                       &((struct sockaddr_in6 *)(addr + 1))->sin6_addr,
                       sizeof(struct in6_addr));
                return AF_INET6;
@@ -659,11 +659,11 @@ static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys,
 
        /* base, SA, (lifetime (HSC),) address(SD), (address(P),)
           key(AE), (identity(SD),) (sensitivity)> */
-       size = sizeof(struct sadb_msg) +sizeof(struct sadb_sa) + 
+       size = sizeof(struct sadb_msg) +sizeof(struct sadb_sa) +
                sizeof(struct sadb_lifetime) +
                ((hsc & 1) ? sizeof(struct sadb_lifetime) : 0) +
                ((hsc & 2) ? sizeof(struct sadb_lifetime) : 0) +
-                       sizeof(struct sadb_address)*2 + 
+                       sizeof(struct sadb_address)*2 +
                                sockaddr_size*2 +
                                        sizeof(struct sadb_x_sa2);
 
@@ -685,13 +685,13 @@ static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys,
 
        if (add_keys) {
                if (x->aalg && x->aalg->alg_key_len) {
-                       auth_key_size = 
-                               PFKEY_ALIGN8((x->aalg->alg_key_len + 7) / 8); 
+                       auth_key_size =
+                               PFKEY_ALIGN8((x->aalg->alg_key_len + 7) / 8);
                        size += sizeof(struct sadb_key) + auth_key_size;
                }
                if (x->ealg && x->ealg->alg_key_len) {
-                       encrypt_key_size = 
-                               PFKEY_ALIGN8((x->ealg->alg_key_len+7) / 8); 
+                       encrypt_key_size =
+                               PFKEY_ALIGN8((x->ealg->alg_key_len+7) / 8);
                        size += sizeof(struct sadb_key) + encrypt_key_size;
                }
        }
@@ -758,7 +758,7 @@ static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys,
 
        /* hard time */
        if (hsc & 2) {
-               lifetime = (struct sadb_lifetime *)  skb_put(skb, 
+               lifetime = (struct sadb_lifetime *)  skb_put(skb,
                                                             sizeof(struct sadb_lifetime));
                lifetime->sadb_lifetime_len =
                        sizeof(struct sadb_lifetime)/sizeof(uint64_t);
@@ -770,7 +770,7 @@ static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys,
        }
        /* soft time */
        if (hsc & 1) {
-               lifetime = (struct sadb_lifetime *)  skb_put(skb, 
+               lifetime = (struct sadb_lifetime *)  skb_put(skb,
                                                             sizeof(struct sadb_lifetime));
                lifetime->sadb_lifetime_len =
                        sizeof(struct sadb_lifetime)/sizeof(uint64_t);
@@ -791,16 +791,16 @@ static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys,
        lifetime->sadb_lifetime_addtime = x->curlft.add_time;
        lifetime->sadb_lifetime_usetime = x->curlft.use_time;
        /* src address */
-       addr = (struct sadb_address*) skb_put(skb, 
+       addr = (struct sadb_address*) skb_put(skb,
                                              sizeof(struct sadb_address)+sockaddr_size);
-       addr->sadb_address_len = 
+       addr->sadb_address_len =
                (sizeof(struct sadb_address)+sockaddr_size)/
                        sizeof(uint64_t);
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
-       /* "if the ports are non-zero, then the sadb_address_proto field, 
-          normally zero, MUST be filled in with the transport 
+       /* "if the ports are non-zero, then the sadb_address_proto field,
+          normally zero, MUST be filled in with the transport
           protocol's number." - RFC2367 */
-       addr->sadb_address_proto = 0; 
+       addr->sadb_address_proto = 0;
        addr->sadb_address_reserved = 0;
        if (x->props.family == AF_INET) {
                addr->sadb_address_prefixlen = 32;
@@ -813,29 +813,29 @@ static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys,
        }
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
        else if (x->props.family == AF_INET6) {
-               addr->sadb_address_prefixlen = 128;
+               addr->sadb_address_prefixlen = 128;
 
                sin6 = (struct sockaddr_in6 *) (addr + 1);
                sin6->sin6_family = AF_INET6;
                sin6->sin6_port = 0;
                sin6->sin6_flowinfo = 0;
-               memcpy(&sin6->sin6_addr, x->props.saddr.a6,
+               memcpy(&sin6->sin6_addr, x->props.saddr.a6,
                       sizeof(struct in6_addr));
                sin6->sin6_scope_id = 0;
-       }
+       }
 #endif
        else
                BUG();
 
        /* dst address */
-       addr = (struct sadb_address*) skb_put(skb, 
+       addr = (struct sadb_address*) skb_put(skb,
                                              sizeof(struct sadb_address)+sockaddr_size);
-       addr->sadb_address_len = 
+       addr->sadb_address_len =
                (sizeof(struct sadb_address)+sockaddr_size)/
                        sizeof(uint64_t);
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
-       addr->sadb_address_proto = 0; 
-       addr->sadb_address_prefixlen = 32; /* XXX */ 
+       addr->sadb_address_proto = 0;
+       addr->sadb_address_prefixlen = 32; /* XXX */
        addr->sadb_address_reserved = 0;
        if (x->props.family == AF_INET) {
                sin = (struct sockaddr_in *) (addr + 1);
@@ -845,9 +845,9 @@ static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys,
                memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
 
                if (x->sel.saddr.a4 != x->props.saddr.a4) {
-                       addr = (struct sadb_address*) skb_put(skb, 
+                       addr = (struct sadb_address*) skb_put(skb,
                                sizeof(struct sadb_address)+sockaddr_size);
-                       addr->sadb_address_len = 
+                       addr->sadb_address_len =
                                (sizeof(struct sadb_address)+sockaddr_size)/
                                sizeof(uint64_t);
                        addr->sadb_address_exttype = SADB_EXT_ADDRESS_PROXY;
@@ -876,9 +876,9 @@ static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys,
 
                if (memcmp (x->sel.saddr.a6, x->props.saddr.a6,
                            sizeof(struct in6_addr))) {
-                       addr = (struct sadb_address *) skb_put(skb, 
+                       addr = (struct sadb_address *) skb_put(skb,
                                sizeof(struct sadb_address)+sockaddr_size);
-                       addr->sadb_address_len = 
+                       addr->sadb_address_len =
                                (sizeof(struct sadb_address)+sockaddr_size)/
                                sizeof(uint64_t);
                        addr->sadb_address_exttype = SADB_EXT_ADDRESS_PROXY;
@@ -902,7 +902,7 @@ static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys,
 
        /* auth key */
        if (add_keys && auth_key_size) {
-               key = (struct sadb_key *) skb_put(skb, 
+               key = (struct sadb_key *) skb_put(skb,
                                                  sizeof(struct sadb_key)+auth_key_size);
                key->sadb_key_len = (sizeof(struct sadb_key) + auth_key_size) /
                        sizeof(uint64_t);
@@ -913,14 +913,14 @@ static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys,
        }
        /* encrypt key */
        if (add_keys && encrypt_key_size) {
-               key = (struct sadb_key *) skb_put(skb, 
+               key = (struct sadb_key *) skb_put(skb,
                                                  sizeof(struct sadb_key)+encrypt_key_size);
-               key->sadb_key_len = (sizeof(struct sadb_key) + 
+               key->sadb_key_len = (sizeof(struct sadb_key) +
                                     encrypt_key_size) / sizeof(uint64_t);
                key->sadb_key_exttype = SADB_EXT_KEY_ENCRYPT;
                key->sadb_key_bits = x->ealg->alg_key_len;
                key->sadb_key_reserved = 0;
-               memcpy(key + 1, x->ealg->alg_key, 
+               memcpy(key + 1, x->ealg->alg_key,
                       (x->ealg->alg_key_len+7)/8);
        }
 
@@ -979,17 +979,17 @@ static struct sk_buff * pfkey_xfrm_state2msg(struct xfrm_state *x, int add_keys,
        return skb;
 }
 
-static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr, 
+static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
                                                void **ext_hdrs)
 {
-       struct xfrm_state *x; 
+       struct xfrm_state *x;
        struct sadb_lifetime *lifetime;
        struct sadb_sa *sa;
        struct sadb_key *key;
        struct sadb_x_sec_ctx *sec_ctx;
        uint16_t proto;
        int err;
-       
+
 
        sa = (struct sadb_sa *) ext_hdrs[SADB_EXT_SA-1];
        if (!sa ||
@@ -1022,7 +1022,7 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
    SADB_SASTATE_MATURE and the kernel MUST return an error if this is
    not true.
 
-           However, KAME setkey always uses SADB_SASTATE_LARVAL.
+          However, KAME setkey always uses SADB_SASTATE_LARVAL.
           Hence, we have to _ignore_ sadb_sa_state, which is also reasonable.
         */
        if (sa->sadb_sa_auth > SADB_AALG_MAX ||
@@ -1144,13 +1144,13 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct sadb_msg *hdr,
        }
        /* x->algo.flags = sa->sadb_sa_flags; */
 
-       x->props.family = pfkey_sadb_addr2xfrm_addr((struct sadb_address *) ext_hdrs[SADB_EXT_ADDRESS_SRC-1], 
+       x->props.family = pfkey_sadb_addr2xfrm_addr((struct sadb_address *) ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
                                                    &x->props.saddr);
        if (!x->props.family) {
                err = -EAFNOSUPPORT;
                goto out;
        }
-       pfkey_sadb_addr2xfrm_addr((struct sadb_address *) ext_hdrs[SADB_EXT_ADDRESS_DST-1], 
+       pfkey_sadb_addr2xfrm_addr((struct sadb_address *) ext_hdrs[SADB_EXT_ADDRESS_DST-1],
                                  &x->id.daddr);
 
        if (ext_hdrs[SADB_X_EXT_SA2-1]) {
@@ -1410,7 +1410,7 @@ static int pfkey_add(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr,
        struct km_event c;
 
        xfrm_probe_algs();
-       
+
        x = pfkey_msg2xfrm_state(hdr, ext_hdrs);
        if (IS_ERR(x))
                return PTR_ERR(x);
@@ -1530,13 +1530,13 @@ static struct sk_buff *compose_sadb_supported(struct sadb_msg *orig,
                auth_len *= sizeof(struct sadb_alg);
                auth_len += sizeof(struct sadb_supported);
        }
-       
+
        enc_len = xfrm_count_enc_supported();
        if (enc_len) {
                enc_len *= sizeof(struct sadb_alg);
                enc_len += sizeof(struct sadb_supported);
        }
-       
+
        len = enc_len + auth_len + sizeof(struct sadb_msg);
 
        skb = alloc_skb(len + 16, allocation);
@@ -1605,7 +1605,7 @@ static int pfkey_register(struct sock *sk, struct sk_buff *skb, struct sadb_msg
        }
 
        xfrm_probe_algs();
-       
+
        supp_skb = compose_sadb_supported(hdr, GFP_KERNEL);
        if (!supp_skb) {
                if (hdr->sadb_msg_satype != SADB_SATYPE_UNSPEC)
@@ -1856,7 +1856,7 @@ static int pfkey_xfrm_policy2msg_size(struct xfrm_policy *xp)
 
        return sizeof(struct sadb_msg) +
                (sizeof(struct sadb_lifetime) * 3) +
-               (sizeof(struct sadb_address) * 2) + 
+               (sizeof(struct sadb_address) * 2) +
                (sockaddr_size * 2) +
                sizeof(struct sadb_x_policy) +
                (xp->xfrm_nr * sizeof(struct sadb_x_ipsecrequest)) +
@@ -1904,9 +1904,9 @@ static void pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, i
        memset(hdr, 0, size);   /* XXX do we need this ? */
 
        /* src address */
-       addr = (struct sadb_address*) skb_put(skb, 
+       addr = (struct sadb_address*) skb_put(skb,
                                              sizeof(struct sadb_address)+sockaddr_size);
-       addr->sadb_address_len = 
+       addr->sadb_address_len =
                (sizeof(struct sadb_address)+sockaddr_size)/
                        sizeof(uint64_t);
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
@@ -1936,14 +1936,14 @@ static void pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, i
                BUG();
 
        /* dst address */
-       addr = (struct sadb_address*) skb_put(skb, 
+       addr = (struct sadb_address*) skb_put(skb,
                                              sizeof(struct sadb_address)+sockaddr_size);
        addr->sadb_address_len =
                (sizeof(struct sadb_address)+sockaddr_size)/
                        sizeof(uint64_t);
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
        addr->sadb_address_proto = pfkey_proto_from_xfrm(xp->selector.proto);
-       addr->sadb_address_prefixlen = xp->selector.prefixlen_d; 
+       addr->sadb_address_prefixlen = xp->selector.prefixlen_d;
        addr->sadb_address_reserved = 0;
        if (xp->family == AF_INET) {
                sin = (struct sockaddr_in *) (addr + 1);
@@ -1967,7 +1967,7 @@ static void pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, i
                BUG();
 
        /* hard time */
-       lifetime = (struct sadb_lifetime *)  skb_put(skb, 
+       lifetime = (struct sadb_lifetime *)  skb_put(skb,
                                                     sizeof(struct sadb_lifetime));
        lifetime->sadb_lifetime_len =
                sizeof(struct sadb_lifetime)/sizeof(uint64_t);
@@ -1977,7 +1977,7 @@ static void pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, i
        lifetime->sadb_lifetime_addtime = xp->lft.hard_add_expires_seconds;
        lifetime->sadb_lifetime_usetime = xp->lft.hard_use_expires_seconds;
        /* soft time */
-       lifetime = (struct sadb_lifetime *)  skb_put(skb, 
+       lifetime = (struct sadb_lifetime *)  skb_put(skb,
                                                     sizeof(struct sadb_lifetime));
        lifetime->sadb_lifetime_len =
                sizeof(struct sadb_lifetime)/sizeof(uint64_t);
@@ -1987,7 +1987,7 @@ static void pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, i
        lifetime->sadb_lifetime_addtime = xp->lft.soft_add_expires_seconds;
        lifetime->sadb_lifetime_usetime = xp->lft.soft_use_expires_seconds;
        /* current time */
-       lifetime = (struct sadb_lifetime *)  skb_put(skb, 
+       lifetime = (struct sadb_lifetime *)  skb_put(skb,
                                                     sizeof(struct sadb_lifetime));
        lifetime->sadb_lifetime_len =
                sizeof(struct sadb_lifetime)/sizeof(uint64_t);
@@ -2019,8 +2019,8 @@ static void pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, i
                req_size = sizeof(struct sadb_x_ipsecrequest);
                if (t->mode == XFRM_MODE_TUNNEL)
                        req_size += ((t->encap_family == AF_INET ?
-                                    sizeof(struct sockaddr_in) :
-                                    sizeof(struct sockaddr_in6)) * 2);
+                                    sizeof(struct sockaddr_in) :
+                                    sizeof(struct sockaddr_in6)) * 2);
                else
                        size -= 2*socklen;
                rq = (void*)skb_put(skb, req_size);
@@ -2150,7 +2150,7 @@ static int pfkey_spdadd(struct sock *sk, struct sk_buff *skb, struct sadb_msg *h
                      XFRM_POLICY_BLOCK : XFRM_POLICY_ALLOW);
        xp->priority = pol->sadb_x_policy_priority;
 
-       sa = ext_hdrs[SADB_EXT_ADDRESS_SRC-1], 
+       sa = ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
        xp->family = pfkey_sadb_addr2xfrm_addr(sa, &xp->selector.saddr);
        if (!xp->family) {
                err = -EINVAL;
@@ -2163,7 +2163,7 @@ static int pfkey_spdadd(struct sock *sk, struct sk_buff *skb, struct sadb_msg *h
        if (xp->selector.sport)
                xp->selector.sport_mask = htons(0xffff);
 
-       sa = ext_hdrs[SADB_EXT_ADDRESS_DST-1], 
+       sa = ext_hdrs[SADB_EXT_ADDRESS_DST-1],
        pfkey_sadb_addr2xfrm_addr(sa, &xp->selector.daddr);
        xp->selector.prefixlen_d = sa->sadb_address_prefixlen;
 
@@ -2224,7 +2224,7 @@ static int pfkey_spdadd(struct sock *sk, struct sk_buff *skb, struct sadb_msg *h
 
        if (hdr->sadb_msg_type == SADB_X_SPDUPDATE)
                c.event = XFRM_MSG_UPDPOLICY;
-       else 
+       else
                c.event = XFRM_MSG_NEWPOLICY;
 
        c.seq = hdr->sadb_msg_seq;
@@ -2261,7 +2261,7 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, struct sadb_msg
 
        memset(&sel, 0, sizeof(sel));
 
-       sa = ext_hdrs[SADB_EXT_ADDRESS_SRC-1], 
+       sa = ext_hdrs[SADB_EXT_ADDRESS_SRC-1],
        sel.family = pfkey_sadb_addr2xfrm_addr(sa, &sel.saddr);
        sel.prefixlen_s = sa->sadb_address_prefixlen;
        sel.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto);
@@ -2269,7 +2269,7 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, struct sadb_msg
        if (sel.sport)
                sel.sport_mask = htons(0xffff);
 
-       sa = ext_hdrs[SADB_EXT_ADDRESS_DST-1], 
+       sa = ext_hdrs[SADB_EXT_ADDRESS_DST-1],
        pfkey_sadb_addr2xfrm_addr(sa, &sel.daddr);
        sel.prefixlen_d = sa->sadb_address_prefixlen;
        sel.proto = pfkey_proto_to_xfrm(sa->sadb_address_proto);
@@ -2297,16 +2297,17 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, struct sadb_msg
                                   &sel, tmp.security, 1);
        security_xfrm_policy_free(&tmp);
 
-       xfrm_audit_log(audit_get_loginuid(current->audit_context), 0,
-                      AUDIT_MAC_IPSEC_DELSPD, (xp) ? 1 : 0, xp, NULL);
-
        if (xp == NULL)
                return -ENOENT;
 
-       err = 0;
+       err = security_xfrm_policy_delete(xp);
 
-       if ((err = security_xfrm_policy_delete(xp)))
+       xfrm_audit_log(audit_get_loginuid(current->audit_context), 0,
+                      AUDIT_MAC_IPSEC_DELSPD, err ? 0 : 1, xp, NULL);
+
+       if (err)
                goto out;
+
        c.seq = hdr->sadb_msg_seq;
        c.pid = hdr->sadb_msg_pid;
        c.event = XFRM_MSG_DELPOLICY;
@@ -2743,15 +2744,15 @@ static int count_esp_combs(struct xfrm_tmpl *t)
                struct xfrm_algo_desc *ealg = xfrm_ealg_get_byidx(i);
                if (!ealg)
                        break;
-                       
+
                if (!(ealg_tmpl_set(t, ealg) && ealg->available))
                        continue;
-                       
+
                for (k = 1; ; k++) {
                        struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(k);
                        if (!aalg)
                                break;
-                               
+
                        if (aalg_tmpl_set(t, aalg) && aalg->available)
                                sz += sizeof(struct sadb_comb);
                }
@@ -2806,10 +2807,10 @@ static void dump_esp_combs(struct sk_buff *skb, struct xfrm_tmpl *t)
                struct xfrm_algo_desc *ealg = xfrm_ealg_get_byidx(i);
                if (!ealg)
                        break;
-       
+
                if (!(ealg_tmpl_set(t, ealg) && ealg->available))
                        continue;
-                       
+
                for (k = 1; ; k++) {
                        struct sadb_comb *c;
                        struct xfrm_algo_desc *aalg = xfrm_aalg_get_byidx(k);
@@ -2941,7 +2942,7 @@ static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct
        struct sadb_x_sec_ctx *sec_ctx;
        struct xfrm_sec_ctx *xfrm_ctx;
        int ctx_size = 0;
-       
+
        sockaddr_size = pfkey_sockaddr_size(x->props.family);
        if (!sockaddr_size)
                return -EINVAL;
@@ -2950,7 +2951,7 @@ static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct
                (sizeof(struct sadb_address) * 2) +
                (sockaddr_size * 2) +
                sizeof(struct sadb_x_policy);
-       
+
        if (x->id.proto == IPPROTO_AH)
                size += count_ah_combs(t);
        else if (x->id.proto == IPPROTO_ESP)
@@ -2964,7 +2965,7 @@ static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct
        skb =  alloc_skb(size + 16, GFP_ATOMIC);
        if (skb == NULL)
                return -ENOMEM;
-       
+
        hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg));
        hdr->sadb_msg_version = PF_KEY_V2;
        hdr->sadb_msg_type = SADB_ACQUIRE;
@@ -2976,9 +2977,9 @@ static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct
        hdr->sadb_msg_pid = 0;
 
        /* src address */
-       addr = (struct sadb_address*) skb_put(skb, 
+       addr = (struct sadb_address*) skb_put(skb,
                                              sizeof(struct sadb_address)+sockaddr_size);
-       addr->sadb_address_len = 
+       addr->sadb_address_len =
                (sizeof(struct sadb_address)+sockaddr_size)/
                        sizeof(uint64_t);
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
@@ -3008,9 +3009,9 @@ static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct
 #endif
        else
                BUG();
-       
+
        /* dst address */
-       addr = (struct sadb_address*) skb_put(skb, 
+       addr = (struct sadb_address*) skb_put(skb,
                                              sizeof(struct sadb_address)+sockaddr_size);
        addr->sadb_address_len =
                (sizeof(struct sadb_address)+sockaddr_size)/
@@ -3019,7 +3020,7 @@ static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct
        addr->sadb_address_proto = 0;
        addr->sadb_address_reserved = 0;
        if (x->props.family == AF_INET) {
-               addr->sadb_address_prefixlen = 32; 
+               addr->sadb_address_prefixlen = 32;
 
                sin = (struct sockaddr_in *) (addr + 1);
                sin->sin_family = AF_INET;
@@ -3029,7 +3030,7 @@ static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct
        }
 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
        else if (x->props.family == AF_INET6) {
-               addr->sadb_address_prefixlen = 128; 
+               addr->sadb_address_prefixlen = 128;
 
                sin6 = (struct sockaddr_in6 *) (addr + 1);
                sin6->sin6_family = AF_INET6;
@@ -3074,7 +3075,7 @@ static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct
 }
 
 static struct xfrm_policy *pfkey_compile_policy(struct sock *sk, int opt,
-                                                u8 *data, int len, int *dir)
+                                               u8 *data, int len, int *dir)
 {
        struct xfrm_policy *xp;
        struct sadb_x_policy *pol = (struct sadb_x_policy*)data;
@@ -3193,17 +3194,17 @@ static int pfkey_send_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr,
         * HDR | SA | ADDRESS_SRC (old addr) | NAT_T_SPORT (old port) |
         * ADDRESS_DST (new addr) | NAT_T_DPORT (new port)
         */
-       
+
        size = sizeof(struct sadb_msg) +
                sizeof(struct sadb_sa) +
                (sizeof(struct sadb_address) * 2) +
                (sockaddr_size * 2) +
                (sizeof(struct sadb_x_nat_t_port) * 2);
-       
+
        skb =  alloc_skb(size + 16, GFP_ATOMIC);
        if (skb == NULL)
                return -ENOMEM;
-       
+
        hdr = (struct sadb_msg *) skb_put(skb, sizeof(struct sadb_msg));
        hdr->sadb_msg_version = PF_KEY_V2;
        hdr->sadb_msg_type = SADB_X_NAT_T_NEW_MAPPING;
@@ -3228,7 +3229,7 @@ static int pfkey_send_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr,
        /* ADDRESS_SRC (old addr) */
        addr = (struct sadb_address*)
                skb_put(skb, sizeof(struct sadb_address)+sockaddr_size);
-       addr->sadb_address_len = 
+       addr->sadb_address_len =
                (sizeof(struct sadb_address)+sockaddr_size)/
                        sizeof(uint64_t);
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_SRC;
@@ -3269,7 +3270,7 @@ static int pfkey_send_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr,
        /* ADDRESS_DST (new addr) */
        addr = (struct sadb_address*)
                skb_put(skb, sizeof(struct sadb_address)+sockaddr_size);
-       addr->sadb_address_len = 
+       addr->sadb_address_len =
                (sizeof(struct sadb_address)+sockaddr_size)/
                        sizeof(uint64_t);
        addr->sadb_address_exttype = SADB_EXT_ADDRESS_DST;
@@ -3674,7 +3675,7 @@ static int pfkey_read_proc(char *buffer, char **start, off_t offset,
                               );
 
                buffer[len++] = '\n';
-               
+
                pos = begin + len;
                if (pos < offset) {
                        len = 0;
index 7e6bc41eeb216df942fcaf4b0575a1d4e26a6d05..a2e7aa63fd8a4939af6d8cf687bd1302abfd86dd 100644 (file)
@@ -14,7 +14,7 @@
  *     LAPB 002        Jonathan Naylor New timer architecture.
  *     2000-10-29      Henner Eisen    lapb_data_indication() return status.
  */
+
 #include <linux/module.h>
 #include <linux/errno.h>
 #include <linux/types.h>
@@ -43,7 +43,7 @@ static struct list_head lapb_list = LIST_HEAD_INIT(lapb_list);
 static DEFINE_RWLOCK(lapb_list_lock);
 
 /*
- *     Free an allocated lapb control block. 
+ *     Free an allocated lapb control block.
  */
 static void lapb_free_cb(struct lapb_cb *lapb)
 {
@@ -407,7 +407,7 @@ int lapb_data_indication(struct lapb_cb *lapb, struct sk_buff *skb)
                return lapb->callbacks.data_indication(lapb->dev, skb);
 
        kfree_skb(skb);
-       return NET_RX_CN_HIGH; /* For now; must be != NET_RX_DROP */ 
+       return NET_RX_CN_HIGH; /* For now; must be != NET_RX_DROP */
 }
 
 int lapb_data_transmit(struct lapb_cb *lapb, struct sk_buff *skb)
index b0f8713f66cae3aeeef51bac2406d57292cd58cb..6762e7c751ebe7342fb96cdaca6ee0f8f629d2e1 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
index 49a761bd9314559205308635b1a609c949eb5e0f..339cc5f2684f1008d930c0c2ecf943d537d9294f 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
@@ -34,7 +33,7 @@
 #include <linux/interrupt.h>
 #include <net/lapb.h>
 
-/* 
+/*
  *  This procedure is passed a buffer descriptor for an iframe. It builds
  *  the rest of the control part of the frame and then writes it out.
  */
@@ -66,7 +65,7 @@ static void lapb_send_iframe(struct lapb_cb *lapb, struct sk_buff *skb, int poll
               lapb->dev, lapb->state, poll_bit, lapb->vs, lapb->vr);
 #endif
 
-       lapb_transmit_buffer(lapb, skb, LAPB_COMMAND);  
+       lapb_transmit_buffer(lapb, skb, LAPB_COMMAND);
 }
 
 void lapb_kick(struct lapb_cb *lapb)
index 8b5eefd70f03c3f686f14fc84947ac5e7ce90ab3..b827f47ac133c64f71e9934b5acc086505a88a79 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
@@ -59,7 +58,7 @@ void lapb_frames_acked(struct lapb_cb *lapb, unsigned short nr)
         */
        if (lapb->va != nr)
                while (skb_peek(&lapb->ack_queue) && lapb->va != nr) {
-                       skb = skb_dequeue(&lapb->ack_queue);
+                       skb = skb_dequeue(&lapb->ack_queue);
                        kfree_skb(skb);
                        lapb->va = (lapb->va + 1) % modulus;
                }
@@ -67,7 +66,7 @@ void lapb_frames_acked(struct lapb_cb *lapb, unsigned short nr)
 
 void lapb_requeue_frames(struct lapb_cb *lapb)
 {
-        struct sk_buff *skb, *skb_prev = NULL;
+       struct sk_buff *skb, *skb_prev = NULL;
 
        /*
         * Requeue all the un-ack-ed frames on the output queue to be picked
@@ -91,7 +90,7 @@ int lapb_validate_nr(struct lapb_cb *lapb, unsigned short nr)
 {
        unsigned short vc = lapb->va;
        int modulus;
-       
+
        modulus = (lapb->mode & LAPB_EXTENDED) ? LAPB_EMODULUS : LAPB_SMODULUS;
 
        while (vc != lapb->vs) {
@@ -99,7 +98,7 @@ int lapb_validate_nr(struct lapb_cb *lapb, unsigned short nr)
                        return 1;
                vc = (vc + 1) % modulus;
        }
-       
+
        return nr == lapb->vs;
 }
 
@@ -149,7 +148,7 @@ int lapb_decode(struct lapb_cb *lapb, struct sk_buff *skb,
                                frame->cr = LAPB_RESPONSE;
                }
        }
-               
+
        skb_pull(skb, 1);
 
        if (lapb->mode & LAPB_EXTENDED) {
@@ -220,9 +219,9 @@ int lapb_decode(struct lapb_cb *lapb, struct sk_buff *skb,
        return 0;
 }
 
-/* 
+/*
  *     This routine is called when the HDLC layer internally  generates a
- *     command or  response  for  the remote machine ( eg. RR, UA etc. ). 
+ *     command or  response  for  the remote machine ( eg. RR, UA etc. ).
  *     Only supervisory or unnumbered frames are processed, FRMRs are handled
  *     by lapb_transmit_frmr below.
  */
@@ -259,7 +258,7 @@ void lapb_send_control(struct lapb_cb *lapb, int frametype,
        lapb_transmit_buffer(lapb, skb, type);
 }
 
-/* 
+/*
  *     This routine generates FRMRs based on information previously stored in
  *     the LAPB control block.
  */
index 2c8f0f809220c37ca349bb473df0a1116d31d24b..af6d14b44e2e66abe826896c8fb4c2672f661509 100644 (file)
@@ -101,7 +101,7 @@ static void lapb_t1timer_expiry(unsigned long param)
                /*
                 *      Awaiting connection state, send SABM(E), up to N2 times.
                 */
-               case LAPB_STATE_1: 
+               case LAPB_STATE_1:
                        if (lapb->n2count == lapb->n2) {
                                lapb_clear_queues(lapb);
                                lapb->state = LAPB_STATE_0;
index 190bb3e051881fa1455f4456bff39e890ad0cc20..7d9fa38b6a7d14ca5a35d8c782d5b7e0f383a34a 100644 (file)
@@ -67,7 +67,7 @@ static inline u16 llc_ui_next_link_no(int sap)
 static inline __be16 llc_proto_type(u16 arphrd)
 {
        return arphrd == ARPHRD_IEEE802_TR ?
-                        htons(ETH_P_TR_802_2) : htons(ETH_P_802_2);
+                        htons(ETH_P_TR_802_2) : htons(ETH_P_802_2);
 }
 
 /**
@@ -114,7 +114,7 @@ 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) || 
+       if (unlikely(llc_data_accept_state(llc->state) ||
                     llc->remote_busy_flag ||
                     llc->p_flag)) {
                long timeout = sock_sndtimeo(sk, noblock);
@@ -602,7 +602,7 @@ static int llc_ui_accept(struct socket *sock, struct socket *newsock, int flags)
        int rc = -EOPNOTSUPP;
 
        dprintk("%s: accepting on %02X\n", __FUNCTION__,
-               llc_sk(sk)->laddr.lsap);
+               llc_sk(sk)->laddr.lsap);
        lock_sock(sk);
        if (unlikely(sk->sk_type != SOCK_STREAM))
                goto out;
@@ -617,7 +617,7 @@ static int llc_ui_accept(struct socket *sock, struct socket *newsock, int flags)
                        goto out;
        }
        dprintk("%s: got a new connection on %02X\n", __FUNCTION__,
-               llc_sk(sk)->laddr.lsap);
+               llc_sk(sk)->laddr.lsap);
        skb = skb_dequeue(&sk->sk_receive_queue);
        rc = -EINVAL;
        if (!skb->sk)
@@ -682,7 +682,7 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock,
        if (flags & MSG_PEEK) {
                peek_seq = llc->copied_seq;
                seq = &peek_seq;
-       }
+       }
 
        target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
        copied = 0;
@@ -860,7 +860,7 @@ static int llc_ui_sendmsg(struct kiocb *iocb, struct socket *sock,
                goto release;
        skb->dev      = llc->dev;
        skb->protocol = llc_proto_type(addr->sllc_arphrd);
-       skb_reserve(skb, hdrlen); 
+       skb_reserve(skb, hdrlen);
        rc = memcpy_fromiovec(skb_put(skb, copied), msg->msg_iov, copied);
        if (rc)
                goto out;
@@ -1116,11 +1116,11 @@ static const struct proto_ops llc_ui_ops = {
 };
 
 static char llc_proc_err_msg[] __initdata =
-        KERN_CRIT "LLC: Unable to register the proc_fs entries\n";
+       KERN_CRIT "LLC: Unable to register the proc_fs entries\n";
 static char llc_sysctl_err_msg[] __initdata =
-        KERN_CRIT "LLC: Unable to register the sysctl entries\n";
+       KERN_CRIT "LLC: Unable to register the sysctl entries\n";
 static char llc_sock_err_msg[] __initdata =
-        KERN_CRIT "LLC: Unable to register the network family\n";
+       KERN_CRIT "LLC: Unable to register the network family\n";
 
 static int __init llc2_init(void)
 {
index c761c15da4212e987be4db497d650df8758bf5b6..3b8cfbe029a74ba8d47fb24bd1d1aad8f952d351 100644 (file)
@@ -854,7 +854,7 @@ static void llc_sk_init(struct sock* sk)
        llc->n2 = 2;   /* max retransmit */
        llc->k  = 2;   /* tx win size, will adjust dynam */
        llc->rw = 128; /* rx win size (opt and equal to
-                       * tx_win of remote LLC) */
+                       * tx_win of remote LLC) */
        skb_queue_head_init(&llc->pdu_unack_q);
        sk->sk_backlog_rcv = llc_backlog_rcv;
 }
index db82aff6e40f54802fa79592a76a1d08712b923b..b3f65d1e80b12584e46c49e55f9c5dddcd47e01a 100644 (file)
@@ -164,7 +164,7 @@ int llc_rcv(struct sk_buff *skb, struct net_device *dev,
        sap = llc_sap_find(pdu->dsap);
        if (unlikely(!sap)) {/* unknown SAP */
                dprintk("%s: llc_sap_find(%02X) failed!\n", __FUNCTION__,
-                       pdu->dsap);
+                       pdu->dsap);
                goto drop;
        }
        /*
@@ -173,9 +173,9 @@ int llc_rcv(struct sk_buff *skb, struct net_device *dev,
         */
        rcv = rcu_dereference(sap->rcv_func);
        if (rcv) {
-               struct sk_buff *cskb = skb_clone(skb, GFP_ATOMIC);
-               if (cskb)
-                       rcv(cskb, dev, pt, orig_dev);
+               struct sk_buff *cskb = skb_clone(skb, GFP_ATOMIC);
+               if (cskb)
+                       rcv(cskb, dev, pt, orig_dev);
        }
        dest = llc_pdu_type(skb);
        if (unlikely(!dest || !llc_type_handlers[dest - 1]))
index b4e668e0e12c46da8b7f5cbf1a6a24a9c5da73ba..f4291f349e92c458f8181e9ac085904a9605dfd2 100644 (file)
@@ -40,7 +40,7 @@ int llc_mac_hdr_init(struct sk_buff *skb,
        case ARPHRD_IEEE802_TR: {
                struct net_device *dev = skb->dev;
                struct trh_hdr *trh;
-               
+
                skb->mac.raw = skb_push(skb, sizeof(*trh));
                trh = tr_hdr(skb);
                trh->ac = AC;
index a28ce525d201b2061ab2d91f056f156f1d6a91ad..fa8324396db39765b65bd0221a5510c838767578 100644 (file)
@@ -39,7 +39,7 @@ void llc_pdu_set_pf_bit(struct sk_buff *skb, u8 bit_value)
 
        llc_pdu_decode_pdu_type(skb, &pdu_type);
        pdu = llc_pdu_sn_hdr(skb);
-       
+
        switch (pdu_type) {
        case LLC_PDU_TYPE_I:
        case LLC_PDU_TYPE_S:
index 19308fece3ad945ae58c4e92dcef5fcfa57812f6..3ab9d9f8b17fc8d4368dd03e32ff134c9e8776fa 100644 (file)
@@ -142,18 +142,18 @@ out:
 }
 
 static char *llc_conn_state_names[] = {
-       [LLC_CONN_STATE_ADM] =        "adm", 
-       [LLC_CONN_STATE_SETUP] =      "setup", 
+       [LLC_CONN_STATE_ADM] =        "adm",
+       [LLC_CONN_STATE_SETUP] =      "setup",
        [LLC_CONN_STATE_NORMAL] =     "normal",
-       [LLC_CONN_STATE_BUSY] =       "busy", 
-       [LLC_CONN_STATE_REJ] =        "rej", 
-       [LLC_CONN_STATE_AWAIT] =      "await", 
+       [LLC_CONN_STATE_BUSY] =       "busy",
+       [LLC_CONN_STATE_REJ] =        "rej",
+       [LLC_CONN_STATE_AWAIT] =      "await",
        [LLC_CONN_STATE_AWAIT_BUSY] = "await_busy",
        [LLC_CONN_STATE_AWAIT_REJ] =  "await_rej",
        [LLC_CONN_STATE_D_CONN] =     "d_conn",
-       [LLC_CONN_STATE_RESET] =      "reset", 
-       [LLC_CONN_STATE_ERROR] =      "error", 
-       [LLC_CONN_STATE_TEMP] =       "temp", 
+       [LLC_CONN_STATE_RESET] =      "reset",
+       [LLC_CONN_STATE_ERROR] =      "error",
+       [LLC_CONN_STATE_TEMP] =       "temp",
 };
 
 static int llc_seq_core_show(struct seq_file *seq, void *v)
@@ -208,7 +208,7 @@ static int llc_seq_core_open(struct inode *inode, struct file *file)
        return seq_open(file, &llc_seq_core_ops);
 }
 
-static struct file_operations llc_seq_socket_fops = {
+static const struct file_operations llc_seq_socket_fops = {
        .owner          = THIS_MODULE,
        .open           = llc_seq_socket_open,
        .read           = seq_read,
@@ -216,7 +216,7 @@ static struct file_operations llc_seq_socket_fops = {
        .release        = seq_release,
 };
 
-static struct file_operations llc_seq_core_fops = {
+static const struct file_operations llc_seq_core_fops = {
        .owner          = THIS_MODULE,
        .open           = llc_seq_core_open,
        .read           = seq_read,
index 6a43201aa32e2d2ead2d593d2bf4c0c1d27101bb..135f7d80069e93e12145c5419bef51151a15dcae 100644 (file)
@@ -175,7 +175,7 @@ struct llc_sap_state llc_sap_state_table[LLC_NR_SAP_STATES] = {
        [LLC_SAP_STATE_INACTIVE - 1] = {
                .curr_state     = LLC_SAP_STATE_INACTIVE,
                .transitions    = llc_sap_inactive_state_transitions,
-               },
+       },
        [LLC_SAP_STATE_ACTIVE - 1] = {
                .curr_state     = LLC_SAP_STATE_ACTIVE,
                .transitions    = llc_sap_active_state_transitions,
index 61cb8cf7d1532a4d4b1abd51244e863fc7e8b887..2615dc81aa36f018e6120cbaada3b685accc4db2 100644 (file)
@@ -201,7 +201,7 @@ static void llc_sap_state_process(struct llc_sap *sap, struct sk_buff *skb)
                        if (sock_queue_rcv_skb(skb->sk, skb))
                                kfree_skb(skb);
                }
-       } 
+       }
        kfree_skb(skb);
 }
 
@@ -215,7 +215,7 @@ static void llc_sap_state_process(struct llc_sap *sap, struct sk_buff *skb)
  *     This function is called when upper layer wants to send a TEST pdu.
  *     Returns 0 for success, 1 otherwise.
  */
-void llc_build_and_send_test_pkt(struct llc_sap *sap, 
+void llc_build_and_send_test_pkt(struct llc_sap *sap,
                                 struct sk_buff *skb, u8 *dmac, u8 dsap)
 {
        struct llc_sap_state_ev *ev = llc_sap_ev(skb);
@@ -224,7 +224,7 @@ void llc_build_and_send_test_pkt(struct llc_sap *sap,
        ev->daddr.lsap = dsap;
        memcpy(ev->saddr.mac, skb->dev->dev_addr, IFHWADDRLEN);
        memcpy(ev->daddr.mac, dmac, IFHWADDRLEN);
-       
+
        ev->type      = LLC_SAP_EV_TYPE_PRIM;
        ev->prim      = LLC_TEST_PRIM;
        ev->prim_type = LLC_PRIM_TYPE_REQ;
index 8275bd33bd9d6b3d0ad2cea55a1c579e14b5f9e5..576355a192ab062c804312f9ebccccebb56f7425 100644 (file)
@@ -112,17 +112,17 @@ static struct llc_station llc_main_station;
 
 static int llc_stat_ev_enable_with_dup_addr_check(struct sk_buff *skb)
 {
-       struct llc_station_state_ev *ev = llc_station_ev(skb);  
-       
+       struct llc_station_state_ev *ev = llc_station_ev(skb);
+
        return ev->type == LLC_STATION_EV_TYPE_SIMPLE &&
               ev->prim_type ==
-                             LLC_STATION_EV_ENABLE_WITH_DUP_ADDR_CHECK ? 0 : 1;
+                             LLC_STATION_EV_ENABLE_WITH_DUP_ADDR_CHECK ? 0 : 1;
 }
 
 static int llc_stat_ev_enable_without_dup_addr_check(struct sk_buff *skb)
 {
-       struct llc_station_state_ev *ev = llc_station_ev(skb);  
-       
+       struct llc_station_state_ev *ev = llc_station_ev(skb);
+
        return ev->type == LLC_STATION_EV_TYPE_SIMPLE &&
               ev->prim_type ==
                        LLC_STATION_EV_ENABLE_WITHOUT_DUP_ADDR_CHECK ? 0 : 1;
@@ -130,8 +130,8 @@ static int llc_stat_ev_enable_without_dup_addr_check(struct sk_buff *skb)
 
 static int llc_stat_ev_ack_tmr_exp_lt_retry_cnt_max_retry(struct sk_buff *skb)
 {
-       struct llc_station_state_ev *ev = llc_station_ev(skb);  
-       
+       struct llc_station_state_ev *ev = llc_station_ev(skb);
+
        return ev->type == LLC_STATION_EV_TYPE_ACK_TMR &&
                llc_main_station.retry_count <
                llc_main_station.maximum_retry ? 0 : 1;
@@ -139,8 +139,8 @@ static int llc_stat_ev_ack_tmr_exp_lt_retry_cnt_max_retry(struct sk_buff *skb)
 
 static int llc_stat_ev_ack_tmr_exp_eq_retry_cnt_max_retry(struct sk_buff *skb)
 {
-       struct llc_station_state_ev *ev = llc_station_ev(skb);  
-       
+       struct llc_station_state_ev *ev = llc_station_ev(skb);
+
        return ev->type == LLC_STATION_EV_TYPE_ACK_TMR &&
                llc_main_station.retry_count ==
                llc_main_station.maximum_retry ? 0 : 1;
@@ -148,7 +148,7 @@ static int llc_stat_ev_ack_tmr_exp_eq_retry_cnt_max_retry(struct sk_buff *skb)
 
 static int llc_stat_ev_rx_null_dsap_xid_c(struct sk_buff *skb)
 {
-       struct llc_station_state_ev *ev = llc_station_ev(skb);  
+       struct llc_station_state_ev *ev = llc_station_ev(skb);
        struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb);
 
        return ev->type == LLC_STATION_EV_TYPE_PDU &&
@@ -306,7 +306,7 @@ static int llc_station_ac_send_test_r(struct sk_buff *skb)
        llc_pdu_decode_sa(skb, mac_da);
        llc_pdu_decode_ssap(skb, &dsap);
        llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, 0, dsap, LLC_PDU_RSP);
-               llc_pdu_init_as_test_rsp(nskb, skb);
+       llc_pdu_init_as_test_rsp(nskb, skb);
        rc = llc_mac_hdr_init(nskb, llc_station_mac_sa, mac_da);
        if (unlikely(rc))
                goto free;
index 45d7dd92a08804e2978a739b2db6f9d3296eb437..46992d03601766503cc9250a25cda2b27ddccb3a 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * sysctl_net_llc.c: sysctl interface to LLC net subsystem.
- * 
+ *
  * Arnaldo Carvalho de Melo <acme@conectiva.com.br>
  */
 
@@ -72,7 +72,7 @@ static struct ctl_table llc2_dir_timeout_table[] = {
                .procname       = "timeout",
                .mode           = 0555,
                .child          = llc2_timeout_table,
-               },
+       },
        { 0 },
 };
 
@@ -82,7 +82,7 @@ static struct ctl_table llc_table[] = {
                .procname       = "llc2",
                .mode           = 0555,
                .child          = llc2_dir_timeout_table,
-               },
+       },
        {
                .ctl_name       = NET_LLC_STATION,
                .procname       = "station",
@@ -98,7 +98,7 @@ static struct ctl_table llc_dir_table[] = {
                .procname       = "llc",
                .mode           = 0555,
                .child          = llc_table,
-               },
+       },
        { 0 },
 };
 
@@ -116,7 +116,7 @@ static struct ctl_table_header *llc_table_header;
 
 int __init llc_sysctl_init(void)
 {
-       llc_table_header = register_sysctl_table(llc_root_table, 1);
+       llc_table_header = register_sysctl_table(llc_root_table);
 
        return llc_table_header ? 0 : -ENOMEM;
 }
index 748f7f00909a741cd745a12b9ffbae861cc51896..253fce3ad2d3f5c42fee3add47a9cae551b0de51 100644 (file)
@@ -302,7 +302,9 @@ config NETFILTER_XT_TARGET_CONNMARK
        tristate  '"CONNMARK" target support'
        depends on NETFILTER_XTABLES
        depends on IP_NF_MANGLE || IP6_NF_MANGLE
-       depends on (IP_NF_CONNTRACK && IP_NF_CONNTRACK_MARK) || (NF_CONNTRACK_MARK && NF_CONNTRACK)
+       depends on IP_NF_CONNTRACK || NF_CONNTRACK
+       select IP_NF_CONNTRACK_MARK if IP_NF_CONNTRACK
+       select NF_CONNTRACK_MARK if NF_CONNTRACK
        help
          This option adds a `CONNMARK' target, which allows one to manipulate
          the connection mark value.  Similar to the MARK target, but
@@ -434,7 +436,9 @@ config NETFILTER_XT_MATCH_COMMENT
 config NETFILTER_XT_MATCH_CONNBYTES
        tristate  '"connbytes" per-connection counter match support'
        depends on NETFILTER_XTABLES
-       depends on (IP_NF_CONNTRACK && IP_NF_CT_ACCT) || (NF_CT_ACCT && NF_CONNTRACK)
+       depends on IP_NF_CONNTRACK || NF_CONNTRACK
+       select IP_NF_CT_ACCT if IP_NF_CONNTRACK
+       select NF_CT_ACCT if NF_CONNTRACK
        help
          This option adds a `connbytes' match, which allows you to match the
          number of bytes and/or packets for each direction within a connection.
@@ -445,7 +449,9 @@ config NETFILTER_XT_MATCH_CONNBYTES
 config NETFILTER_XT_MATCH_CONNMARK
        tristate  '"connmark" connection mark match support'
        depends on NETFILTER_XTABLES
-       depends on (IP_NF_CONNTRACK && IP_NF_CONNTRACK_MARK) || (NF_CONNTRACK_MARK && NF_CONNTRACK)
+       depends on IP_NF_CONNTRACK || NF_CONNTRACK
+       select IP_NF_CONNTRACK_MARK if IP_NF_CONNTRACK
+       select NF_CONNTRACK_MARK if NF_CONNTRACK
        help
          This option adds a `connmark' match, which allows you to match the
          connection mark value previously set for the session by `CONNMARK'. 
index 291b8c6862f1498707884e09d695ee51824de166..c3ebdbd917e9276e125b7a9733519d9d327219db 100644 (file)
@@ -1,4 +1,4 @@
-/* netfilter.c: look after the filters for various protocols. 
+/* netfilter.c: look after the filters for various protocols.
  * Heavily influenced by the old firewall.c by David Bonn and Alan Cox.
  *
  * Thanks to Rob `CmdrTaco' Malda for not influencing this code in any
 #include <linux/netdevice.h>
 #include <linux/inetdevice.h>
 #include <linux/proc_fs.h>
+#include <linux/mutex.h>
 #include <net/sock.h>
 
 #include "nf_internals.h"
 
-static DEFINE_SPINLOCK(afinfo_lock);
+static DEFINE_MUTEX(afinfo_mutex);
 
 struct nf_afinfo *nf_afinfo[NPROTO] __read_mostly;
 EXPORT_SYMBOL(nf_afinfo);
 
 int nf_register_afinfo(struct nf_afinfo *afinfo)
 {
-       spin_lock(&afinfo_lock);
+       int err;
+
+       err = mutex_lock_interruptible(&afinfo_mutex);
+       if (err < 0)
+               return err;
        rcu_assign_pointer(nf_afinfo[afinfo->family], afinfo);
-       spin_unlock(&afinfo_lock);
+       mutex_unlock(&afinfo_mutex);
        return 0;
 }
 EXPORT_SYMBOL_GPL(nf_register_afinfo);
 
 void nf_unregister_afinfo(struct nf_afinfo *afinfo)
 {
-       spin_lock(&afinfo_lock);
+       mutex_lock(&afinfo_mutex);
        rcu_assign_pointer(nf_afinfo[afinfo->family], NULL);
-       spin_unlock(&afinfo_lock);
+       mutex_unlock(&afinfo_mutex);
        synchronize_rcu();
 }
 EXPORT_SYMBOL_GPL(nf_unregister_afinfo);
@@ -56,30 +61,31 @@ EXPORT_SYMBOL_GPL(nf_unregister_afinfo);
  * packets come back: if the hook is gone, the packet is discarded. */
 struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS] __read_mostly;
 EXPORT_SYMBOL(nf_hooks);
-static DEFINE_SPINLOCK(nf_hook_lock);
+static DEFINE_MUTEX(nf_hook_mutex);
 
 int nf_register_hook(struct nf_hook_ops *reg)
 {
        struct list_head *i;
+       int err;
 
-       spin_lock_bh(&nf_hook_lock);
+       err = mutex_lock_interruptible(&nf_hook_mutex);
+       if (err < 0)
+               return err;
        list_for_each(i, &nf_hooks[reg->pf][reg->hooknum]) {
                if (reg->priority < ((struct nf_hook_ops *)i)->priority)
                        break;
        }
        list_add_rcu(&reg->list, i->prev);
-       spin_unlock_bh(&nf_hook_lock);
-
-       synchronize_net();
+       mutex_unlock(&nf_hook_mutex);
        return 0;
 }
 EXPORT_SYMBOL(nf_register_hook);
 
 void nf_unregister_hook(struct nf_hook_ops *reg)
 {
-       spin_lock_bh(&nf_hook_lock);
+       mutex_lock(&nf_hook_mutex);
        list_del_rcu(&reg->list);
-       spin_unlock_bh(&nf_hook_lock);
+       mutex_unlock(&nf_hook_mutex);
 
        synchronize_net();
 }
@@ -135,14 +141,14 @@ unsigned int nf_iterate(struct list_head *head,
                        continue;
 
                /* Optimization: we don't need to hold module
-                   reference here, since function can't sleep. --RR */
+                  reference here, since function can't sleep. --RR */
                verdict = elem->hook(hook, skb, indev, outdev, okfn);
                if (verdict != NF_ACCEPT) {
 #ifdef CONFIG_NETFILTER_DEBUG
                        if (unlikely((verdict & NF_VERDICT_MASK)
                                                        > NF_MAX_VERDICT)) {
                                NFDEBUG("Evil return from %p(%u).\n",
-                                       elem->hook, hook);
+                                       elem->hook, hook);
                                continue;
                        }
 #endif
@@ -248,9 +254,12 @@ void nf_ct_attach(struct sk_buff *new, struct sk_buff *skb)
 {
        void (*attach)(struct sk_buff *, struct sk_buff *);
 
-       if (skb->nfct && (attach = ip_ct_attach) != NULL) {
-               mb(); /* Just to be sure: must be read before executing this */
-               attach(new, skb);
+       if (skb->nfct) {
+               rcu_read_lock();
+               attach = rcu_dereference(ip_ct_attach);
+               if (attach)
+                       attach(new, skb);
+               rcu_read_unlock();
        }
 }
 EXPORT_SYMBOL(nf_ct_attach);
index 9b02ec4012fb3f4ab515d089cd4f3b1b14a20808..32891ebc9e68f3f6d657a83faa615548449c36e7 100644 (file)
@@ -318,6 +318,7 @@ destroy_conntrack(struct nf_conntrack *nfct)
        struct nf_conn_help *help = nfct_help(ct);
        struct nf_conntrack_l3proto *l3proto;
        struct nf_conntrack_l4proto *l4proto;
+       typeof(nf_conntrack_destroyed) destroyed;
 
        DEBUGP("destroy_conntrack(%p)\n", ct);
        NF_CT_ASSERT(atomic_read(&nfct->use) == 0);
@@ -332,16 +333,21 @@ destroy_conntrack(struct nf_conntrack *nfct)
        /* To make sure we don't get any weird locking issues here:
         * destroy_conntrack() MUST NOT be called with a write lock
         * to nf_conntrack_lock!!! -HW */
+       rcu_read_lock();
        l3proto = __nf_ct_l3proto_find(ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.l3num);
        if (l3proto && l3proto->destroy)
                l3proto->destroy(ct);
 
-       l4proto = __nf_ct_l4proto_find(ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.l3num, ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.protonum);
+       l4proto = __nf_ct_l4proto_find(ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.l3num,
+                                      ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.protonum);
        if (l4proto && l4proto->destroy)
                l4proto->destroy(ct);
 
-       if (nf_conntrack_destroyed)
-               nf_conntrack_destroyed(ct);
+       destroyed = rcu_dereference(nf_conntrack_destroyed);
+       if (destroyed)
+               destroyed(ct);
+
+       rcu_read_unlock();
 
        write_lock_bh(&nf_conntrack_lock);
        /* Expectations will have been removed in clean_from_lists,
@@ -418,7 +424,7 @@ EXPORT_SYMBOL_GPL(nf_conntrack_find_get);
 
 static void __nf_conntrack_hash_insert(struct nf_conn *ct,
                                       unsigned int hash,
-                                      unsigned int repl_hash) 
+                                      unsigned int repl_hash)
 {
        ct->id = ++nf_conntrack_next_id;
        list_add(&ct->tuplehash[IP_CT_DIR_ORIGINAL].list,
@@ -560,7 +566,7 @@ static int early_drop(struct list_head *chain)
        if (del_timer(&ct->timeout)) {
                death_by_timeout((unsigned long)ct);
                dropped = 1;
-               NF_CT_STAT_INC(early_drop);
+               NF_CT_STAT_INC_ATOMIC(early_drop);
        }
        nf_ct_put(ct);
        return dropped;
@@ -647,9 +653,14 @@ struct nf_conn *nf_conntrack_alloc(const struct nf_conntrack_tuple *orig,
                                   const struct nf_conntrack_tuple *repl)
 {
        struct nf_conntrack_l3proto *l3proto;
+       struct nf_conn *ct;
 
+       rcu_read_lock();
        l3proto = __nf_ct_l3proto_find(orig->src.l3num);
-       return __nf_conntrack_alloc(orig, repl, l3proto, 0);
+       ct = __nf_conntrack_alloc(orig, repl, l3proto, 0);
+       rcu_read_unlock();
+
+       return ct;
 }
 EXPORT_SYMBOL_GPL(nf_conntrack_alloc);
 
@@ -813,11 +824,13 @@ nf_conntrack_in(int pf, unsigned int hooknum, struct sk_buff **pskb)
 
        /* Previously seen (loopback or untracked)?  Ignore. */
        if ((*pskb)->nfct) {
-               NF_CT_STAT_INC(ignore);
+               NF_CT_STAT_INC_ATOMIC(ignore);
                return NF_ACCEPT;
        }
 
+       /* rcu_read_lock()ed by nf_hook_slow */
        l3proto = __nf_ct_l3proto_find((u_int16_t)pf);
+
        if ((ret = l3proto->prepare(pskb, hooknum, &dataoff, &protonum)) <= 0) {
                DEBUGP("not prepared to track yet or error occured\n");
                return -ret;
@@ -830,8 +843,8 @@ nf_conntrack_in(int pf, unsigned int hooknum, struct sk_buff **pskb)
         * core what to do with the packet. */
        if (l4proto->error != NULL &&
            (ret = l4proto->error(*pskb, dataoff, &ctinfo, pf, hooknum)) <= 0) {
-               NF_CT_STAT_INC(error);
-               NF_CT_STAT_INC(invalid);
+               NF_CT_STAT_INC_ATOMIC(error);
+               NF_CT_STAT_INC_ATOMIC(invalid);
                return -ret;
        }
 
@@ -839,13 +852,13 @@ nf_conntrack_in(int pf, unsigned int hooknum, struct sk_buff **pskb)
                               &set_reply, &ctinfo);
        if (!ct) {
                /* Not valid part of a connection */
-               NF_CT_STAT_INC(invalid);
+               NF_CT_STAT_INC_ATOMIC(invalid);
                return NF_ACCEPT;
        }
 
        if (IS_ERR(ct)) {
                /* Too stressed to deal. */
-               NF_CT_STAT_INC(drop);
+               NF_CT_STAT_INC_ATOMIC(drop);
                return NF_DROP;
        }
 
@@ -858,7 +871,7 @@ nf_conntrack_in(int pf, unsigned int hooknum, struct sk_buff **pskb)
                DEBUGP("nf_conntrack_in: Can't track with proto module\n");
                nf_conntrack_put((*pskb)->nfct);
                (*pskb)->nfct = NULL;
-               NF_CT_STAT_INC(invalid);
+               NF_CT_STAT_INC_ATOMIC(invalid);
                return -ret;
        }
 
@@ -872,10 +885,15 @@ EXPORT_SYMBOL_GPL(nf_conntrack_in);
 int nf_ct_invert_tuplepr(struct nf_conntrack_tuple *inverse,
                         const struct nf_conntrack_tuple *orig)
 {
-       return nf_ct_invert_tuple(inverse, orig,
-                                 __nf_ct_l3proto_find(orig->src.l3num),
-                                 __nf_ct_l4proto_find(orig->src.l3num,
-                                                    orig->dst.protonum));
+       int ret;
+
+       rcu_read_lock();
+       ret = nf_ct_invert_tuple(inverse, orig,
+                                __nf_ct_l3proto_find(orig->src.l3num),
+                                __nf_ct_l4proto_find(orig->src.l3num,
+                                                     orig->dst.protonum));
+       rcu_read_unlock();
+       return ret;
 }
 EXPORT_SYMBOL_GPL(nf_ct_invert_tuplepr);
 
@@ -1048,7 +1066,7 @@ get_next_corpse(int (*iter)(struct nf_conn *i, void *data),
                        if (iter(ct, data))
                                goto found;
                }
-       }
+       }
        list_for_each_entry(h, &unconfirmed, list) {
                ct = nf_ct_tuplehash_to_ctrack(h);
                if (iter(ct, data))
@@ -1089,7 +1107,7 @@ static void free_conntrack_hash(struct list_head *hash, int vmalloced, int size)
        if (vmalloced)
                vfree(hash);
        else
-               free_pages((unsigned long)hash, 
+               free_pages((unsigned long)hash,
                           get_order(sizeof(struct list_head) * size));
 }
 
@@ -1105,7 +1123,7 @@ void nf_conntrack_cleanup(void)
 {
        int i;
 
-       ip_ct_attach = NULL;
+       rcu_assign_pointer(ip_ct_attach, NULL);
 
        /* This makes sure all current packets have passed through
           netfilter framework.  Roll on, two-stage module
@@ -1150,18 +1168,18 @@ static struct list_head *alloc_hashtable(int size, int *vmalloced)
        struct list_head *hash;
        unsigned int i;
 
-       *vmalloced = 0; 
-       hash = (void*)__get_free_pages(GFP_KERNEL, 
+       *vmalloced = 0;
+       hash = (void*)__get_free_pages(GFP_KERNEL,
                                       get_order(sizeof(struct list_head)
                                                 * size));
-       if (!hash) { 
+       if (!hash) {
                *vmalloced = 1;
                printk(KERN_WARNING "nf_conntrack: falling back to vmalloc.\n");
                hash = vmalloc(sizeof(struct list_head) * size);
        }
 
        if (hash)
-               for (i = 0; i < size; i++) 
+               for (i = 0; i < size; i++)
                        INIT_LIST_HEAD(&hash[i]);
 
        return hash;
@@ -1268,12 +1286,12 @@ int __init nf_conntrack_init(void)
 
        /* Don't NEED lock here, but good form anyway. */
        write_lock_bh(&nf_conntrack_lock);
-        for (i = 0; i < AF_MAX; i++)
+       for (i = 0; i < AF_MAX; i++)
                nf_ct_l3protos[i] = &nf_conntrack_l3proto_generic;
-        write_unlock_bh(&nf_conntrack_lock);
+       write_unlock_bh(&nf_conntrack_lock);
 
        /* For use by REJECT target */
-       ip_ct_attach = __nf_conntrack_attach;
+       rcu_assign_pointer(ip_ct_attach, __nf_conntrack_attach);
 
        /* Set up fake conntrack:
            - to never be deleted, not in any hashes */
index 9cbf926cdd14fb0d6af92917339e1cd1d3f23b23..ce70a6fc6bdab26488273e5878e2a77ff9245c7f 100644 (file)
@@ -130,7 +130,7 @@ void nf_ct_remove_expectations(struct nf_conn *ct)
                if (i->master == ct && del_timer(&i->timeout)) {
                        nf_ct_unlink_expect(i);
                        nf_conntrack_expect_put(i);
-               }
+               }
        }
 }
 EXPORT_SYMBOL_GPL(nf_ct_remove_expectations);
@@ -435,7 +435,7 @@ static int exp_open(struct inode *inode, struct file *file)
        return seq_open(file, &exp_seq_ops);
 }
 
-struct file_operations exp_file_ops = {
+const struct file_operations exp_file_ops = {
        .owner   = THIS_MODULE,
        .open    = exp_open,
        .read    = seq_read,
index 92a947168761ecec4ee3a7bbc16b891c487277d8..3089dfc40c884c02951503dec69f3297eede3e4a 100644 (file)
@@ -126,7 +126,7 @@ get_ipv6_addr(const char *src, size_t dlen, struct in6_addr *dst, u_int8_t term)
 }
 
 static int try_number(const char *data, size_t dlen, u_int32_t array[],
-                      int array_size, char sep, char term)
+                     int array_size, char sep, char term)
 {
        u_int32_t i, len;
 
@@ -413,8 +413,8 @@ static int help(struct sk_buff **pskb,
                goto out_update_nl;
        }
 
-        /* Initialize IP/IPv6 addr to expected address (it's not mentioned
-           in EPSV responses) */
+       /* Initialize IP/IPv6 addr to expected address (it's not mentioned
+          in EPSV responses) */
        cmd.l3num = ct->tuplehash[dir].tuple.src.l3num;
        memcpy(cmd.u3.all, &ct->tuplehash[dir].tuple.src.u3.all,
               sizeof(cmd.u3.all));
@@ -466,11 +466,11 @@ static int help(struct sk_buff **pskb,
            memcmp(&cmd.u3.all, &ct->tuplehash[dir].tuple.src.u3.all,
                     sizeof(cmd.u3.all))) {
                /* Enrico Scholz's passive FTP to partially RNAT'd ftp
-                   server: it really wants us to connect to a
-                   different IP address.  Simply don't record it for
-                   NAT. */
+                  server: it really wants us to connect to a
+                  different IP address.  Simply don't record it for
+                  NAT. */
                if (cmd.l3num == PF_INET) {
-                       DEBUGP("conntrack_ftp: NOT RECORDING: " NIPQUAD_FMT " != " NIPQUAD_FMT "\n",
+                       DEBUGP("conntrack_ftp: NOT RECORDING: " NIPQUAD_FMT " != " NIPQUAD_FMT "\n",
                               NIPQUAD(cmd.u3.ip),
                               NIPQUAD(ct->tuplehash[dir].tuple.src.u3.ip));
                } else {
index 6d8568959f827d1312386f4ce5959dd4b34c3193..b284db73ca7ce935d886b9c1bc06ba38ca5cb74d 100644 (file)
@@ -49,7 +49,7 @@ MODULE_PARM_DESC(gkrouted_only, "only accept calls from gatekeeper");
 static int callforward_filter __read_mostly = 1;
 module_param(callforward_filter, bool, 0600);
 MODULE_PARM_DESC(callforward_filter, "only create call forwarding expectations "
-                                    "if both endpoints are on different sides "
+                                    "if both endpoints are on different sides "
                                     "(determined by routing information)");
 
 /* Hooks for NAT */
@@ -300,7 +300,7 @@ static int expect_rtp_rtcp(struct sk_buff **pskb, struct nf_conn *ct,
                                 IPPROTO_UDP, NULL, &rtcp_port);
 
        if (memcmp(&ct->tuplehash[dir].tuple.src.u3,
-                  &ct->tuplehash[!dir].tuple.dst.u3,
+                  &ct->tuplehash[!dir].tuple.dst.u3,
                   sizeof(ct->tuplehash[dir].tuple.src.u3)) &&
                   (nat_rtp_rtcp = rcu_dereference(nat_rtp_rtcp_hook)) &&
                   ct->status & IPS_NAT_MASK) {
@@ -743,7 +743,7 @@ static int callforward_do_filter(union nf_conntrack_address *src,
                        rt2 = (struct rt6_info *)ip6_route_output(NULL, &fl2);
                        if (rt2) {
                                if (!memcmp(&rt1->rt6i_gateway, &rt2->rt6i_gateway,
-                                           sizeof(rt1->rt6i_gateway)) &&
+                                           sizeof(rt1->rt6i_gateway)) &&
                                    rt1->u.dst.dev == rt2->u.dst.dev)
                                        ret = 1;
                                dst_release(&rt2->u.dst);
@@ -780,7 +780,7 @@ static int expect_callforwarding(struct sk_buff **pskb,
         * we don't need to track the second call */
        if (callforward_filter &&
            callforward_do_filter(&addr, &ct->tuplehash[!dir].tuple.src.u3,
-                                 ct->tuplehash[!dir].tuple.src.l3num)) {
+                                 ct->tuplehash[!dir].tuple.src.l3num)) {
                DEBUGP("nf_ct_q931: Call Forwarding not tracked\n");
                return 0;
        }
@@ -840,7 +840,7 @@ static int process_setup(struct sk_buff **pskb, struct nf_conn *ct,
        if ((setup->options & eSetup_UUIE_destCallSignalAddress) &&
            (set_h225_addr) && ct->status && IPS_NAT_MASK &&
            get_h225_addr(ct, *data, &setup->destCallSignalAddress,
-                         &addr, &port) &&
+                         &addr, &port) &&
            memcmp(&addr, &ct->tuplehash[!dir].tuple.src.u3, sizeof(addr))) {
                DEBUGP("nf_ct_q931: set destCallSignalAddress "
                       NIP6_FMT ":%hu->" NIP6_FMT ":%hu\n",
@@ -858,7 +858,7 @@ static int process_setup(struct sk_buff **pskb, struct nf_conn *ct,
        if ((setup->options & eSetup_UUIE_sourceCallSignalAddress) &&
            (set_h225_addr) && ct->status & IPS_NAT_MASK &&
            get_h225_addr(ct, *data, &setup->sourceCallSignalAddress,
-                         &addr, &port) &&
+                         &addr, &port) &&
            memcmp(&addr, &ct->tuplehash[!dir].tuple.dst.u3, sizeof(addr))) {
                DEBUGP("nf_ct_q931: set sourceCallSignalAddress "
                       NIP6_FMT ":%hu->" NIP6_FMT ":%hu\n",
@@ -1282,7 +1282,7 @@ static int expect_q931(struct sk_buff **pskb, struct nf_conn *ct,
        for (i = 0; i < count; i++) {
                if (get_h225_addr(ct, *data, &taddr[i], &addr, &port) &&
                    memcmp(&addr, &ct->tuplehash[dir].tuple.src.u3,
-                          sizeof(addr)) == 0 && port != 0)
+                          sizeof(addr)) == 0 && port != 0)
                        break;
        }
 
@@ -1294,7 +1294,7 @@ static int expect_q931(struct sk_buff **pskb, struct nf_conn *ct,
                return -1;
        nf_conntrack_expect_init(exp, ct->tuplehash[!dir].tuple.src.l3num,
                                 gkrouted_only ? /* only accept calls from GK? */
-                                       &ct->tuplehash[!dir].tuple.src.u3 :
+                                       &ct->tuplehash[!dir].tuple.src.u3 :
                                        NULL,
                                 &ct->tuplehash[!dir].tuple.dst.u3,
                                 IPPROTO_TCP, NULL, &port);
@@ -1513,7 +1513,7 @@ static int process_arq(struct sk_buff **pskb, struct nf_conn *ct,
        set_h225_addr = rcu_dereference(set_h225_addr_hook);
        if ((arq->options & eAdmissionRequest_destCallSignalAddress) &&
            get_h225_addr(ct, *data, &arq->destCallSignalAddress,
-                         &addr, &port) &&
+                         &addr, &port) &&
            !memcmp(&addr, &ct->tuplehash[dir].tuple.src.u3, sizeof(addr)) &&
            port == info->sig_port[dir] &&
            set_h225_addr && ct->status & IPS_NAT_MASK) {
@@ -1526,7 +1526,7 @@ static int process_arq(struct sk_buff **pskb, struct nf_conn *ct,
 
        if ((arq->options & eAdmissionRequest_srcCallSignalAddress) &&
            get_h225_addr(ct, *data, &arq->srcCallSignalAddress,
-                         &addr, &port) &&
+                         &addr, &port) &&
            !memcmp(&addr, &ct->tuplehash[dir].tuple.src.u3, sizeof(addr)) &&
            set_h225_addr && ct->status & IPS_NAT_MASK) {
                /* Calling ARQ */
index ed01db634399f5ec9fdf503c0f7e19c4c1f6d802..43ccd0e2e8aebbd2c93da46b21615c2a19c4d1ff 100644 (file)
@@ -57,7 +57,7 @@ static const char *dccprotos[] = {
 
 #if 0
 #define DEBUGP(format, args...) printk(KERN_DEBUG "%s:%s:" format, \
-                                       __FILE__, __FUNCTION__ , ## args)
+                                      __FILE__, __FUNCTION__ , ## args)
 #else
 #define DEBUGP(format, args...)
 #endif
index a3d31c3ac8e64029991bfab44607717f8d6c4cff..cbd96f3c1b8913d5acabad673edd0735bca3133d 100644 (file)
@@ -77,7 +77,7 @@ generic_prepare(struct sk_buff **pskb, unsigned int hooknum,
 
 
 static u_int32_t generic_get_features(const struct nf_conntrack_tuple *tuple)
-                               
+
 {
        return NF_CT_F_BASIC;
 }
index 2a48efdf0d6764bc85bf3b2bb0e6cadc4171ccf6..bb26a658cc1cfb423bc173e26a310347bb4da97f 100644 (file)
@@ -43,7 +43,7 @@ module_param(timeout, uint, 0400);
 MODULE_PARM_DESC(timeout, "timeout for master connection/replies in seconds");
 
 static int help(struct sk_buff **pskb, unsigned int protoff,
-                struct nf_conn *ct, enum ip_conntrack_info ctinfo)
+               struct nf_conn *ct, enum ip_conntrack_info ctinfo)
 {
        struct nf_conntrack_expect *exp;
        struct iphdr *iph = (*pskb)->nh.iph;
index c64f029f7052a3eadd5831d348c4ea1602a88850..48f05314ebf7421f6141d822a908f10f1f47803e 100644 (file)
@@ -6,10 +6,10 @@
  * (C) 2003 by Patrick Mchardy <kaber@trash.net>
  * (C) 2005-2006 by Pablo Neira Ayuso <pablo@eurodev.net>
  *
- * I've reworked this stuff to use attributes instead of conntrack 
+ * I've reworked this stuff to use attributes instead of conntrack
  * structures. 5.44 am. I need more tea. --pablo 05/07/11.
  *
- * Initial connection tracking via netlink development funded and 
+ * Initial connection tracking via netlink development funded and
  * generally made possible by Network Robots, Inc. (www.networkrobots.com)
  *
  * Further development of this code funded by Astaro AG (http://www.astaro.com)
@@ -53,7 +53,7 @@ MODULE_LICENSE("GPL");
 static char __initdata version[] = "0.93";
 
 static inline int
-ctnetlink_dump_tuples_proto(struct sk_buff *skb, 
+ctnetlink_dump_tuples_proto(struct sk_buff *skb,
                            const struct nf_conntrack_tuple *tuple,
                            struct nf_conntrack_l4proto *l4proto)
 {
@@ -64,7 +64,7 @@ ctnetlink_dump_tuples_proto(struct sk_buff *skb,
 
        if (likely(l4proto->tuple_to_nfattr))
                ret = l4proto->tuple_to_nfattr(skb, tuple);
-       
+
        NFA_NEST_END(skb, nest_parms);
 
        return ret;
@@ -135,7 +135,7 @@ ctnetlink_dump_timeout(struct sk_buff *skb, const struct nf_conn *ct)
                timeout = 0;
        else
                timeout = htonl(timeout_l / HZ);
-       
+
        NFA_PUT(skb, CTA_TIMEOUT, sizeof(timeout), &timeout);
        return 0;
 
@@ -154,7 +154,7 @@ ctnetlink_dump_protoinfo(struct sk_buff *skb, const struct nf_conn *ct)
                nf_ct_l4proto_put(l4proto);
                return 0;
        }
-       
+
        nest_proto = NFA_NEST(skb, CTA_PROTOINFO);
 
        ret = l4proto->to_nfattr(skb, nest_proto, ct);
@@ -178,7 +178,7 @@ ctnetlink_dump_helpinfo(struct sk_buff *skb, const struct nf_conn *ct)
 
        if (!help || !help->helper)
                return 0;
-               
+
        nest_helper = NFA_NEST(skb, CTA_HELP);
        NFA_PUT(skb, CTA_HELP_NAME, strlen(help->helper->name), help->helper->name);
 
@@ -250,7 +250,7 @@ static inline int
 ctnetlink_dump_use(struct sk_buff *skb, const struct nf_conn *ct)
 {
        __be32 use = htonl(atomic_read(&ct->ct_general.use));
-       
+
        NFA_PUT(skb, CTA_USE, sizeof(u_int32_t), &use);
        return 0;
 
@@ -262,7 +262,7 @@ nfattr_failure:
 
 static int
 ctnetlink_fill_info(struct sk_buff *skb, u32 pid, u32 seq,
-                   int event, int nowait, 
+                   int event, int nowait,
                    const struct nf_conn *ct)
 {
        struct nlmsghdr *nlh;
@@ -277,7 +277,7 @@ ctnetlink_fill_info(struct sk_buff *skb, u32 pid, u32 seq,
        nfmsg  = NLMSG_DATA(nlh);
 
        nlh->nlmsg_flags    = (nowait && pid) ? NLM_F_MULTI : 0;
-       nfmsg->nfgen_family = 
+       nfmsg->nfgen_family =
                ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.l3num;
        nfmsg->version      = NFNETLINK_V0;
        nfmsg->res_id       = 0;
@@ -286,7 +286,7 @@ ctnetlink_fill_info(struct sk_buff *skb, u32 pid, u32 seq,
        if (ctnetlink_dump_tuples(skb, tuple(ct, IP_CT_DIR_ORIGINAL)) < 0)
                goto nfattr_failure;
        NFA_NEST_END(skb, nest_parms);
-       
+
        nest_parms = NFA_NEST(skb, CTA_TUPLE_REPLY);
        if (ctnetlink_dump_tuples(skb, tuple(ct, IP_CT_DIR_REPLY)) < 0)
                goto nfattr_failure;
@@ -314,7 +314,7 @@ nfattr_failure:
 
 #ifdef CONFIG_NF_CONNTRACK_EVENTS
 static int ctnetlink_conntrack_event(struct notifier_block *this,
-                                     unsigned long events, void *ptr)
+                                    unsigned long events, void *ptr)
 {
        struct nlmsghdr *nlh;
        struct nfgenmsg *nfmsg;
@@ -364,7 +364,7 @@ static int ctnetlink_conntrack_event(struct notifier_block *this,
        if (ctnetlink_dump_tuples(skb, tuple(ct, IP_CT_DIR_ORIGINAL)) < 0)
                goto nfattr_failure;
        NFA_NEST_END(skb, nest_parms);
-       
+
        nest_parms = NFA_NEST(skb, CTA_TUPLE_REPLY);
        if (ctnetlink_dump_tuples(skb, tuple(ct, IP_CT_DIR_REPLY)) < 0)
                goto nfattr_failure;
@@ -383,16 +383,16 @@ static int ctnetlink_conntrack_event(struct notifier_block *this,
 
                if (events & IPCT_PROTOINFO
                    && ctnetlink_dump_protoinfo(skb, ct) < 0)
-                       goto nfattr_failure;
+                       goto nfattr_failure;
 
                if ((events & IPCT_HELPER || nfct_help(ct))
                    && ctnetlink_dump_helpinfo(skb, ct) < 0)
-                       goto nfattr_failure;
+                       goto nfattr_failure;
 
 #ifdef CONFIG_NF_CONNTRACK_MARK
                if ((events & IPCT_MARK || ct->mark)
                    && ctnetlink_dump_mark(skb, ct) < 0)
-                       goto nfattr_failure;
+                       goto nfattr_failure;
 #endif
 
                if (events & IPCT_COUNTER_FILLING &&
@@ -450,7 +450,7 @@ restart:
                                cb->args[1] = 0;
                        }
                        if (ctnetlink_fill_info(skb, NETLINK_CB(cb->skb).pid,
-                                               cb->nlh->nlmsg_seq,
+                                               cb->nlh->nlmsg_seq,
                                                IPCTNL_MSG_CT_NEW,
                                                1, ct) < 0) {
                                nf_conntrack_get(&ct->ct_general);
@@ -500,7 +500,7 @@ static const size_t cta_min_proto[CTA_PROTO_MAX] = {
 };
 
 static inline int
-ctnetlink_parse_tuple_proto(struct nfattr *attr, 
+ctnetlink_parse_tuple_proto(struct nfattr *attr,
                            struct nf_conntrack_tuple *tuple)
 {
        struct nfattr *tb[CTA_PROTO_MAX];
@@ -522,7 +522,7 @@ ctnetlink_parse_tuple_proto(struct nfattr *attr,
                ret = l4proto->nfattr_to_tuple(tb, tuple);
 
        nf_ct_l4proto_put(l4proto);
-       
+
        return ret;
 }
 
@@ -609,7 +609,7 @@ nfnetlink_parse_nat(struct nfattr *nat,
        int err;
 
        memset(range, 0, sizeof(*range));
-       
+
        nfattr_parse_nested(tb, CTA_NAT_MAX, nat);
 
        if (nfattr_bad_size(tb, CTA_NAT_MAX, cta_min_nat))
@@ -661,7 +661,7 @@ static const size_t cta_min[CTA_MAX] = {
 };
 
 static int
-ctnetlink_del_conntrack(struct sock *ctnl, struct sk_buff *skb, 
+ctnetlink_del_conntrack(struct sock *ctnl, struct sk_buff *skb,
                        struct nlmsghdr *nlh, struct nfattr *cda[], int *errp)
 {
        struct nf_conntrack_tuple_hash *h;
@@ -692,14 +692,14 @@ ctnetlink_del_conntrack(struct sock *ctnl, struct sk_buff *skb,
                return -ENOENT;
 
        ct = nf_ct_tuplehash_to_ctrack(h);
-       
+
        if (cda[CTA_ID-1]) {
                u_int32_t id = ntohl(*(__be32 *)NFA_DATA(cda[CTA_ID-1]));
                if (ct->id != id) {
                        nf_ct_put(ct);
                        return -ENOENT;
                }
-       }       
+       }
        if (del_timer(&ct->timeout))
                ct->timeout.function((unsigned long)ct);
 
@@ -709,7 +709,7 @@ ctnetlink_del_conntrack(struct sock *ctnl, struct sk_buff *skb,
 }
 
 static int
-ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb, 
+ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb,
                        struct nlmsghdr *nlh, struct nfattr *cda[], int *errp)
 {
        struct nf_conntrack_tuple_hash *h;
@@ -765,7 +765,7 @@ ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb,
                return -ENOMEM;
        }
 
-       err = ctnetlink_fill_info(skb2, NETLINK_CB(skb).pid, nlh->nlmsg_seq, 
+       err = ctnetlink_fill_info(skb2, NETLINK_CB(skb).pid, nlh->nlmsg_seq,
                                  IPCTNL_MSG_CT_NEW, 1, ct);
        nf_ct_put(ct);
        if (err <= 0)
@@ -793,12 +793,12 @@ ctnetlink_change_status(struct nf_conn *ct, struct nfattr *cda[])
        if (d & (IPS_EXPECTED|IPS_CONFIRMED|IPS_DYING))
                /* unchangeable */
                return -EINVAL;
-       
+
        if (d & IPS_SEEN_REPLY && !(status & IPS_SEEN_REPLY))
                /* SEEN_REPLY bit can only be set */
                return -EINVAL;
 
-       
+
        if (d & IPS_ASSURED && !(status & IPS_ASSURED))
                /* ASSURED bit can only be set */
                return -EINVAL;
@@ -877,7 +877,7 @@ ctnetlink_change_helper(struct nf_conn *ct, struct nfattr *cda[])
                        memset(&help->help, 0, sizeof(help->help));
                }
        }
-       
+
        help->helper = helper;
 
        return 0;
@@ -887,7 +887,7 @@ static inline int
 ctnetlink_change_timeout(struct nf_conn *ct, struct nfattr *cda[])
 {
        u_int32_t timeout = ntohl(*(__be32 *)NFA_DATA(cda[CTA_TIMEOUT-1]));
-       
+
        if (!del_timer(&ct->timeout))
                return -ETIME;
 
@@ -955,7 +955,7 @@ ctnetlink_change_conntrack(struct nf_conn *ct, struct nfattr *cda[])
 }
 
 static int
-ctnetlink_create_conntrack(struct nfattr *cda[], 
+ctnetlink_create_conntrack(struct nfattr *cda[],
                           struct nf_conntrack_tuple *otuple,
                           struct nf_conntrack_tuple *rtuple)
 {
@@ -965,7 +965,7 @@ ctnetlink_create_conntrack(struct nfattr *cda[],
 
        ct = nf_conntrack_alloc(otuple, rtuple);
        if (ct == NULL || IS_ERR(ct))
-               return -ENOMEM; 
+               return -ENOMEM;
 
        if (!cda[CTA_TIMEOUT-1])
                goto err;
@@ -1003,13 +1003,13 @@ ctnetlink_create_conntrack(struct nfattr *cda[],
 
        return 0;
 
-err:   
+err:
        nf_conntrack_free(ct);
        return err;
 }
 
-static int 
-ctnetlink_new_conntrack(struct sock *ctnl, struct sk_buff *skb, 
+static int
+ctnetlink_new_conntrack(struct sock *ctnl, struct sk_buff *skb,
                        struct nlmsghdr *nlh, struct nfattr *cda[], int *errp)
 {
        struct nf_conntrack_tuple otuple, rtuple;
@@ -1065,9 +1065,9 @@ out_unlock:
        return err;
 }
 
-/*********************************************************************** 
- * EXPECT 
- ***********************************************************************/ 
+/***********************************************************************
+ * EXPECT
+ ***********************************************************************/
 
 static inline int
 ctnetlink_exp_dump_tuple(struct sk_buff *skb,
@@ -1075,7 +1075,7 @@ ctnetlink_exp_dump_tuple(struct sk_buff *skb,
                         enum ctattr_expect type)
 {
        struct nfattr *nest_parms = NFA_NEST(skb, type);
-       
+
        if (ctnetlink_dump_tuples(skb, tuple) < 0)
                goto nfattr_failure;
 
@@ -1085,7 +1085,7 @@ ctnetlink_exp_dump_tuple(struct sk_buff *skb,
 
 nfattr_failure:
        return -1;
-}                      
+}
 
 static inline int
 ctnetlink_exp_dump_mask(struct sk_buff *skb,
@@ -1120,7 +1120,7 @@ nfattr_failure:
 
 static inline int
 ctnetlink_exp_dump_expect(struct sk_buff *skb,
-                          const struct nf_conntrack_expect *exp)
+                         const struct nf_conntrack_expect *exp)
 {
        struct nf_conn *master = exp->master;
        __be32 timeout = htonl((exp->timeout.expires - jiffies) / HZ);
@@ -1134,20 +1134,20 @@ ctnetlink_exp_dump_expect(struct sk_buff *skb,
                                 &master->tuplehash[IP_CT_DIR_ORIGINAL].tuple,
                                 CTA_EXPECT_MASTER) < 0)
                goto nfattr_failure;
-       
+
        NFA_PUT(skb, CTA_EXPECT_TIMEOUT, sizeof(timeout), &timeout);
        NFA_PUT(skb, CTA_EXPECT_ID, sizeof(u_int32_t), &id);
 
        return 0;
-       
+
 nfattr_failure:
        return -1;
 }
 
 static int
 ctnetlink_exp_fill_info(struct sk_buff *skb, u32 pid, u32 seq,
-                   int event, 
-                   int nowait, 
+                   int event,
+                   int nowait,
                    const struct nf_conntrack_expect *exp)
 {
        struct nlmsghdr *nlh;
@@ -1250,7 +1250,7 @@ ctnetlink_exp_dump_table(struct sk_buff *skb, struct netlink_callback *cb)
                        goto out;
                *id = exp->id;
        }
-out:   
+out:
        read_unlock_bh(&nf_conntrack_lock);
 
        return skb->len;
@@ -1262,7 +1262,7 @@ static const size_t cta_min_exp[CTA_EXPECT_MAX] = {
 };
 
 static int
-ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb, 
+ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb,
                     struct nlmsghdr *nlh, struct nfattr *cda[], int *errp)
 {
        struct nf_conntrack_tuple tuple;
@@ -1279,7 +1279,7 @@ ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb,
                u32 rlen;
 
                if ((*errp = netlink_dump_start(ctnl, skb, nlh,
-                                               ctnetlink_exp_dump_table,
+                                               ctnetlink_exp_dump_table,
                                                ctnetlink_done)) != 0)
                        return -EINVAL;
                rlen = NLMSG_ALIGN(nlh->nlmsg_len);
@@ -1307,14 +1307,14 @@ ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb,
                        nf_conntrack_expect_put(exp);
                        return -ENOENT;
                }
-       }       
+       }
 
        err = -ENOMEM;
        skb2 = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
        if (!skb2)
                goto out;
 
-       err = ctnetlink_exp_fill_info(skb2, NETLINK_CB(skb).pid, 
+       err = ctnetlink_exp_fill_info(skb2, NETLINK_CB(skb).pid,
                                      nlh->nlmsg_seq, IPCTNL_MSG_EXP_NEW,
                                      1, exp);
        if (err <= 0)
@@ -1332,7 +1332,7 @@ out:
 }
 
 static int
-ctnetlink_del_expect(struct sock *ctnl, struct sk_buff *skb, 
+ctnetlink_del_expect(struct sock *ctnl, struct sk_buff *skb,
                     struct nlmsghdr *nlh, struct nfattr *cda[], int *errp)
 {
        struct nf_conntrack_expect *exp, *tmp;
@@ -1366,7 +1366,7 @@ ctnetlink_del_expect(struct sock *ctnl, struct sk_buff *skb,
 
                /* after list removal, usage count == 1 */
                nf_conntrack_unexpect_related(exp);
-               /* have to put what we 'get' above. 
+               /* have to put what we 'get' above.
                 * after this line usage count == 0 */
                nf_conntrack_expect_put(exp);
        } else if (cda[CTA_EXPECT_HELP_NAME-1]) {
@@ -1449,7 +1449,7 @@ ctnetlink_create_expect(struct nfattr *cda[], u_int8_t u3)
                err = -ENOMEM;
                goto out;
        }
-       
+
        exp->expectfn = NULL;
        exp->flags = 0;
        exp->master = ct;
@@ -1460,7 +1460,7 @@ ctnetlink_create_expect(struct nfattr *cda[], u_int8_t u3)
        err = nf_conntrack_expect_related(exp);
        nf_conntrack_expect_put(exp);
 
-out:   
+out:
        nf_ct_put(nf_ct_tuplehash_to_ctrack(h));
        return err;
 }
index c59df3bc2bbd41d2c0a3239670c6ef6aa8ab5abb..115bcb5d5a7c72721d4c57f0b6687b06ccebfba2 100644 (file)
@@ -520,7 +520,7 @@ conntrack_pptp_help(struct sk_buff **pskb, unsigned int protoff,
        tcph = skb_header_pointer(*pskb, nexthdr_off, sizeof(_tcph), &_tcph);
        BUG_ON(!tcph);
        nexthdr_off += tcph->doff * 4;
-       datalen = tcplen - tcph->doff * 4;
+       datalen = tcplen - tcph->doff * 4;
 
        pptph = skb_header_pointer(*pskb, nexthdr_off, sizeof(_pptph), &_pptph);
        if (!pptph) {
index 1a61b72712cd53bbc36a238454959227bbaefb45..456155f05c759d3b3726bacc0f994ba311e7cdba 100644 (file)
@@ -66,7 +66,7 @@ __nf_ct_l4proto_find(u_int16_t l3proto, u_int8_t l4proto)
        if (unlikely(l3proto >= AF_MAX || nf_ct_protos[l3proto] == NULL))
                return &nf_conntrack_l4proto_generic;
 
-       return nf_ct_protos[l3proto][l4proto];
+       return rcu_dereference(nf_ct_protos[l3proto][l4proto]);
 }
 EXPORT_SYMBOL_GPL(__nf_ct_l4proto_find);
 
@@ -77,11 +77,11 @@ nf_ct_l4proto_find_get(u_int16_t l3proto, u_int8_t l4proto)
 {
        struct nf_conntrack_l4proto *p;
 
-       preempt_disable();
+       rcu_read_lock();
        p = __nf_ct_l4proto_find(l3proto, l4proto);
        if (!try_module_get(p->me))
                p = &nf_conntrack_l4proto_generic;
-       preempt_enable();
+       rcu_read_unlock();
 
        return p;
 }
@@ -98,11 +98,11 @@ nf_ct_l3proto_find_get(u_int16_t l3proto)
 {
        struct nf_conntrack_l3proto *p;
 
-       preempt_disable();
+       rcu_read_lock();
        p = __nf_ct_l3proto_find(l3proto);
        if (!try_module_get(p->me))
                p = &nf_conntrack_l3proto_generic;
-       preempt_enable();
+       rcu_read_unlock();
 
        return p;
 }
@@ -137,10 +137,8 @@ void nf_ct_l3proto_module_put(unsigned short l3proto)
 {
        struct nf_conntrack_l3proto *p;
 
-       preempt_disable();
+       /* rcu_read_lock not necessary since the caller holds a reference */
        p = __nf_ct_l3proto_find(l3proto);
-       preempt_enable();
-
        module_put(p->me);
 }
 EXPORT_SYMBOL_GPL(nf_ct_l3proto_module_put);
@@ -202,7 +200,7 @@ int nf_conntrack_l3proto_register(struct nf_conntrack_l3proto *proto)
                ret = -EBUSY;
                goto out_unlock;
        }
-       nf_ct_l3protos[proto->l3proto] = proto;
+       rcu_assign_pointer(nf_ct_l3protos[proto->l3proto], proto);
        write_unlock_bh(&nf_conntrack_lock);
 
        ret = nf_ct_l3proto_register_sysctl(proto);
@@ -217,35 +215,21 @@ out:
 }
 EXPORT_SYMBOL_GPL(nf_conntrack_l3proto_register);
 
-int nf_conntrack_l3proto_unregister(struct nf_conntrack_l3proto *proto)
+void nf_conntrack_l3proto_unregister(struct nf_conntrack_l3proto *proto)
 {
-       int ret = 0;
-
-       if (proto->l3proto >= AF_MAX) {
-               ret = -EBUSY;
-               goto out;
-       }
+       BUG_ON(proto->l3proto >= AF_MAX);
 
        write_lock_bh(&nf_conntrack_lock);
-       if (nf_ct_l3protos[proto->l3proto] != proto) {
-               write_unlock_bh(&nf_conntrack_lock);
-               ret = -EBUSY;
-               goto out;
-       }
-
-       nf_ct_l3protos[proto->l3proto] = &nf_conntrack_l3proto_generic;
+       BUG_ON(nf_ct_l3protos[proto->l3proto] != proto);
+       rcu_assign_pointer(nf_ct_l3protos[proto->l3proto],
+                          &nf_conntrack_l3proto_generic);
        write_unlock_bh(&nf_conntrack_lock);
+       synchronize_rcu();
 
        nf_ct_l3proto_unregister_sysctl(proto);
 
-       /* Somebody could be still looking at the proto in bh. */
-       synchronize_net();
-
        /* Remove all contrack entries for this protocol */
        nf_ct_iterate_cleanup(kill_l3proto, proto);
-
-out:
-       return ret;
 }
 EXPORT_SYMBOL_GPL(nf_conntrack_l3proto_unregister);
 
@@ -356,7 +340,7 @@ retry:
                goto retry;
        }
 
-       nf_ct_protos[l4proto->l3proto][l4proto->l4proto] = l4proto;
+       rcu_assign_pointer(nf_ct_protos[l4proto->l3proto][l4proto->l4proto], l4proto);
        write_unlock_bh(&nf_conntrack_lock);
 
        ret = nf_ct_l4proto_register_sysctl(l4proto);
@@ -371,40 +355,25 @@ out:
 }
 EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_register);
 
-int nf_conntrack_l4proto_unregister(struct nf_conntrack_l4proto *l4proto)
+void nf_conntrack_l4proto_unregister(struct nf_conntrack_l4proto *l4proto)
 {
-       int ret = 0;
-
-       if (l4proto->l3proto >= PF_MAX) {
-               ret = -EBUSY;
-               goto out;
-       }
+       BUG_ON(l4proto->l3proto >= PF_MAX);
 
        if (l4proto == &nf_conntrack_l4proto_generic) {
                nf_ct_l4proto_unregister_sysctl(l4proto);
-               goto out;
+               return;
        }
 
        write_lock_bh(&nf_conntrack_lock);
-       if (nf_ct_protos[l4proto->l3proto][l4proto->l4proto]
-           != l4proto) {
-               write_unlock_bh(&nf_conntrack_lock);
-               ret = -EBUSY;
-               goto out;
-       }
-       nf_ct_protos[l4proto->l3proto][l4proto->l4proto]
-               = &nf_conntrack_l4proto_generic;
+       BUG_ON(nf_ct_protos[l4proto->l3proto][l4proto->l4proto] != l4proto);
+       rcu_assign_pointer(nf_ct_protos[l4proto->l3proto][l4proto->l4proto],
+                          &nf_conntrack_l4proto_generic);
        write_unlock_bh(&nf_conntrack_lock);
+       synchronize_rcu();
 
        nf_ct_l4proto_unregister_sysctl(l4proto);
 
-       /* Somebody could be still looking at the proto in bh. */
-       synchronize_net();
-
        /* Remove all contrack entries for this protocol */
        nf_ct_iterate_cleanup(kill_l4proto, l4proto);
-
-out:
-       return ret;
 }
 EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_unregister);
index 69902531c2367d77684de80cd5083a5d70d5e23b..7c069939695a40c38bcb2c2ee00011db45344112 100644 (file)
@@ -12,7 +12,7 @@
  */
 
 #include <linux/types.h>
-#include <linux/sched.h>
+#include <linux/jiffies.h>
 #include <linux/timer.h>
 #include <linux/netfilter.h>
 #include <net/netfilter/nf_conntrack_l4proto.h>
index 76e263668222c9ea3a0e4591f53ad9333aeb7791..3c80558716a0b3c9f0773a9b485c38ac63935c8b 100644 (file)
@@ -1,9 +1,9 @@
 /*
  * Connection tracking protocol helper module for SCTP.
- * 
- * SCTP is defined in RFC 2960. References to various sections in this code 
+ *
+ * SCTP is defined in RFC 2960. References to various sections in this code
  * are to this RFC.
- * 
+ *
  * 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.
@@ -19,7 +19,6 @@
  */
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/netfilter.h>
 #include <linux/module.h>
@@ -45,7 +44,7 @@
 static DEFINE_RWLOCK(sctp_lock);
 
 /* FIXME: Examine ipfilter's timeouts and conntrack transitions more
-   closely.  They're more complex. --RR 
+   closely.  They're more complex. --RR
 
    And so for me for SCTP :D -Kiran */
 
@@ -94,32 +93,32 @@ static unsigned int * sctp_timeouts[]
 #define        sSA SCTP_CONNTRACK_SHUTDOWN_ACK_SENT
 #define        sIV SCTP_CONNTRACK_MAX
 
-/* 
+/*
        These are the descriptions of the states:
 
-NOTE: These state names are tantalizingly similar to the states of an 
+NOTE: These state names are tantalizingly similar to the states of an
 SCTP endpoint. But the interpretation of the states is a little different,
-considering that these are the states of the connection and not of an end 
+considering that these are the states of the connection and not of an end
 point. Please note the subtleties. -Kiran
 
 NONE              - Nothing so far.
-COOKIE WAIT       - We have seen an INIT chunk in the original direction, or also 
-                    an INIT_ACK chunk in the reply direction.
+COOKIE WAIT       - We have seen an INIT chunk in the original direction, or also
+                   an INIT_ACK chunk in the reply direction.
 COOKIE ECHOED     - We have seen a COOKIE_ECHO chunk in the original direction.
 ESTABLISHED       - We have seen a COOKIE_ACK in the reply direction.
 SHUTDOWN_SENT     - We have seen a SHUTDOWN chunk in the original direction.
 SHUTDOWN_RECD     - We have seen a SHUTDOWN chunk in the reply directoin.
 SHUTDOWN_ACK_SENT - We have seen a SHUTDOWN_ACK chunk in the direction opposite
-                    to that of the SHUTDOWN chunk.
-CLOSED            - We have seen a SHUTDOWN_COMPLETE chunk in the direction of 
-                    the SHUTDOWN chunk. Connection is closed.
+                   to that of the SHUTDOWN chunk.
+CLOSED            - We have seen a SHUTDOWN_COMPLETE chunk in the direction of
+                   the SHUTDOWN chunk. Connection is closed.
 */
 
 /* TODO
- - I have assumed that the first INIT is in the original direction. 
+ - I have assumed that the first INIT is in the original direction.
  This messes things when an INIT comes in the reply direction in CLOSED
  state.
- - Check the error type in the reply dir before transitioning from 
+ - Check the error type in the reply dir before transitioning from
 cookie echoed to closed.
  - Sec 5.2.4 of RFC 2960
  - Multi Homing support.
@@ -237,7 +236,7 @@ static int do_basic_checks(struct nf_conn *conntrack,
        for_each_sctp_chunk (skb, sch, _sch, offset, dataoff, count) {
                DEBUGP("Chunk Num: %d  Type: %d\n", count, sch->type);
 
-               if (sch->type == SCTP_CID_INIT 
+               if (sch->type == SCTP_CID_INIT
                        || sch->type == SCTP_CID_INIT_ACK
                        || sch->type == SCTP_CID_SHUTDOWN_COMPLETE) {
                        flag = 1;
@@ -277,42 +276,42 @@ static int new_state(enum ip_conntrack_dir dir,
        DEBUGP("Chunk type: %d\n", chunk_type);
 
        switch (chunk_type) {
-               case SCTP_CID_INIT: 
+               case SCTP_CID_INIT:
                        DEBUGP("SCTP_CID_INIT\n");
                        i = 0; break;
-               case SCTP_CID_INIT_ACK: 
+               case SCTP_CID_INIT_ACK:
                        DEBUGP("SCTP_CID_INIT_ACK\n");
                        i = 1; break;
-               case SCTP_CID_ABORT: 
+               case SCTP_CID_ABORT:
                        DEBUGP("SCTP_CID_ABORT\n");
                        i = 2; break;
-               case SCTP_CID_SHUTDOWN: 
+               case SCTP_CID_SHUTDOWN:
                        DEBUGP("SCTP_CID_SHUTDOWN\n");
                        i = 3; break;
-               case SCTP_CID_SHUTDOWN_ACK: 
+               case SCTP_CID_SHUTDOWN_ACK:
                        DEBUGP("SCTP_CID_SHUTDOWN_ACK\n");
                        i = 4; break;
-               case SCTP_CID_ERROR: 
+               case SCTP_CID_ERROR:
                        DEBUGP("SCTP_CID_ERROR\n");
                        i = 5; break;
-               case SCTP_CID_COOKIE_ECHO: 
+               case SCTP_CID_COOKIE_ECHO:
                        DEBUGP("SCTP_CID_COOKIE_ECHO\n");
                        i = 6; break;
-               case SCTP_CID_COOKIE_ACK: 
+               case SCTP_CID_COOKIE_ACK:
                        DEBUGP("SCTP_CID_COOKIE_ACK\n");
                        i = 7; break;
-               case SCTP_CID_SHUTDOWN_COMPLETE: 
+               case SCTP_CID_SHUTDOWN_COMPLETE:
                        DEBUGP("SCTP_CID_SHUTDOWN_COMPLETE\n");
                        i = 8; break;
                default:
                        /* Other chunks like DATA, SACK, HEARTBEAT and
                        its ACK do not cause a change in state */
-                       DEBUGP("Unknown chunk type, Will stay in %s\n", 
+                       DEBUGP("Unknown chunk type, Will stay in %s\n",
                                                sctp_conntrack_names[cur_state]);
                        return cur_state;
        }
 
-       DEBUGP("dir: %d   cur_state: %s  chunk_type: %d  new_state: %s\n", 
+       DEBUGP("dir: %d   cur_state: %s  chunk_type: %d  new_state: %s\n",
                        dir, sctp_conntrack_names[cur_state], chunk_type,
                        sctp_conntrack_names[sctp_conntracks[dir][i][cur_state]]);
 
@@ -377,7 +376,7 @@ static int sctp_packet(struct nf_conn *conntrack,
                        /* Sec 8.5.1 (C) */
                        if (!(sh->vtag == conntrack->proto.sctp.vtag[CTINFO2DIR(ctinfo)])
                                && !(sh->vtag == conntrack->proto.sctp.vtag
-                                                       [1 - CTINFO2DIR(ctinfo)] 
+                                                       [1 - CTINFO2DIR(ctinfo)]
                                        && (sch->flags & 1))) {
                                write_unlock_bh(&sctp_lock);
                                return -1;
@@ -402,17 +401,17 @@ static int sctp_packet(struct nf_conn *conntrack,
                }
 
                /* If it is an INIT or an INIT ACK note down the vtag */
-               if (sch->type == SCTP_CID_INIT 
+               if (sch->type == SCTP_CID_INIT
                        || sch->type == SCTP_CID_INIT_ACK) {
                        sctp_inithdr_t _inithdr, *ih;
 
                        ih = skb_header_pointer(skb, offset + sizeof(sctp_chunkhdr_t),
-                                               sizeof(_inithdr), &_inithdr);
+                                               sizeof(_inithdr), &_inithdr);
                        if (ih == NULL) {
                                        write_unlock_bh(&sctp_lock);
                                        return -1;
                        }
-                       DEBUGP("Setting vtag %x for dir %d\n", 
+                       DEBUGP("Setting vtag %x for dir %d\n",
                                        ih->init_tag, !CTINFO2DIR(ctinfo));
                        conntrack->proto.sctp.vtag[!CTINFO2DIR(ctinfo)] = ih->init_tag;
                }
@@ -466,7 +465,7 @@ static int sctp_new(struct nf_conn *conntrack, const struct sk_buff *skb,
        newconntrack = SCTP_CONNTRACK_MAX;
        for_each_sctp_chunk (skb, sch, _sch, offset, dataoff, count) {
                /* Don't need lock here: this conntrack not in circulation yet */
-               newconntrack = new_state(IP_CT_DIR_ORIGINAL, 
+               newconntrack = new_state(IP_CT_DIR_ORIGINAL,
                                         SCTP_CONNTRACK_NONE, sch->type);
 
                /* Invalid: delete conntrack */
@@ -481,14 +480,14 @@ static int sctp_new(struct nf_conn *conntrack, const struct sk_buff *skb,
                                sctp_inithdr_t _inithdr, *ih;
 
                                ih = skb_header_pointer(skb, offset + sizeof(sctp_chunkhdr_t),
-                                                       sizeof(_inithdr), &_inithdr);
+                                                       sizeof(_inithdr), &_inithdr);
                                if (ih == NULL)
                                        return 0;
 
-                               DEBUGP("Setting vtag %x for new conn\n", 
+                               DEBUGP("Setting vtag %x for new conn\n",
                                        ih->init_tag);
 
-                               conntrack->proto.sctp.vtag[IP_CT_DIR_REPLY] = 
+                               conntrack->proto.sctp.vtag[IP_CT_DIR_REPLY] =
                                                                ih->init_tag;
                        } else {
                                /* Sec 8.5.1 (A) */
@@ -498,7 +497,7 @@ static int sctp_new(struct nf_conn *conntrack, const struct sk_buff *skb,
                /* If it is a shutdown ack OOTB packet, we expect a return
                   shutdown complete, otherwise an ABORT Sec 8.4 (5) and (8) */
                else {
-                       DEBUGP("Setting vtag %x for new conn OOTB\n", 
+                       DEBUGP("Setting vtag %x for new conn OOTB\n",
                                sh->vtag);
                        conntrack->proto.sctp.vtag[IP_CT_DIR_REPLY] = sh->vtag;
                }
@@ -698,7 +697,7 @@ int __init nf_conntrack_proto_sctp_init(void)
  cleanup_sctp4:
        nf_conntrack_l4proto_unregister(&nf_conntrack_l4proto_sctp4);
  out:
-       DEBUGP("SCTP conntrack module loading %s\n", 
+       DEBUGP("SCTP conntrack module loading %s\n",
                                        ret ? "failed": "succeeded");
        return ret;
 }
index 6fccdcf43e08a0e2738b8060b1d98f2f89e6f2d8..069b85ca51cd026d2799d24d82e7c5208bd40481 100644 (file)
@@ -25,7 +25,6 @@
  */
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/netfilter.h>
 #include <linux/module.h>
 /* Protects conntrack->proto.tcp */
 static DEFINE_RWLOCK(tcp_lock);
 
-/* "Be conservative in what you do, 
-    be liberal in what you accept from others." 
+/* "Be conservative in what you do,
+    be liberal in what you accept from others."
     If it's non-zero, we mark only out of window RST segments as INVALID. */
-int nf_ct_tcp_be_liberal __read_mostly = 0;
+static int nf_ct_tcp_be_liberal __read_mostly = 0;
 
 /* If it is set to zero, we disable picking up already established
    connections. */
-int nf_ct_tcp_loose __read_mostly = 1;
+static int nf_ct_tcp_loose __read_mostly = 1;
 
-/* Max number of the retransmitted packets without receiving an (acceptable) 
-   ACK from the destination. If this number is reached, a shorter timer 
+/* Max number of the retransmitted packets without receiving an (acceptable)
+   ACK from the destination. If this number is reached, a shorter timer
    will be started. */
-int nf_ct_tcp_max_retrans __read_mostly = 3;
+static int nf_ct_tcp_max_retrans __read_mostly = 3;
 
   /* FIXME: Examine ipfilter's timeouts and conntrack transitions more
      closely.  They're more complex. --RR */
@@ -84,7 +83,7 @@ static const char *tcp_conntrack_names[] = {
        "CLOSE",
        "LISTEN"
 };
-  
+
 #define SECS * HZ
 #define MINS * 60 SECS
 #define HOURS * 60 MINS
@@ -100,10 +99,10 @@ static unsigned int nf_ct_tcp_timeout_time_wait __read_mostly =     2 MINS;
 static unsigned int nf_ct_tcp_timeout_close __read_mostly =        10 SECS;
 
 /* RFC1122 says the R2 limit should be at least 100 seconds.
-   Linux uses 15 packets as limit, which corresponds 
+   Linux uses 15 packets as limit, which corresponds
    to ~13-30min depending on RTO. */
 static unsigned int nf_ct_tcp_timeout_max_retrans __read_mostly =   5 MINS;
+
 static unsigned int * tcp_timeouts[] = {
     NULL,                              /* TCP_CONNTRACK_NONE */
     &nf_ct_tcp_timeout_syn_sent,       /* TCP_CONNTRACK_SYN_SENT, */
@@ -116,7 +115,7 @@ static unsigned int * tcp_timeouts[] = {
     &nf_ct_tcp_timeout_close,          /* TCP_CONNTRACK_CLOSE, */
     NULL,                              /* TCP_CONNTRACK_LISTEN */
  };
+
 #define sNO TCP_CONNTRACK_NONE
 #define sSS TCP_CONNTRACK_SYN_SENT
 #define sSR TCP_CONNTRACK_SYN_RECV
@@ -139,13 +138,13 @@ enum tcp_bit_set {
        TCP_RST_SET,
        TCP_NONE_SET,
 };
-  
+
 /*
  * The TCP state transition table needs a few words...
  *
  * We are the man in the middle. All the packets go through us
  * but might get lost in transit to the destination.
- * It is assumed that the destinations can't receive segments 
+ * It is assumed that the destinations can't receive segments
  * we haven't seen.
  *
  * The checked segment is in window, but our windows are *not*
@@ -155,11 +154,11 @@ enum tcp_bit_set {
  * The meaning of the states are:
  *
  * NONE:       initial state
- * SYN_SENT:   SYN-only packet seen 
+ * SYN_SENT:   SYN-only packet seen
  * SYN_RECV:   SYN-ACK packet seen
  * ESTABLISHED:        ACK packet seen
  * FIN_WAIT:   FIN packet seen
- * CLOSE_WAIT: ACK seen (after FIN) 
+ * CLOSE_WAIT: ACK seen (after FIN)
  * LAST_ACK:   FIN seen (after FIN)
  * TIME_WAIT:  last ACK seen
  * CLOSE:      closed connection
@@ -167,8 +166,8 @@ enum tcp_bit_set {
  * LISTEN state is not used.
  *
  * Packets marked as IGNORED (sIG):
- *     if they may be either invalid or valid 
- *     and the receiver may send back a connection 
+ *     if they may be either invalid or valid
+ *     and the receiver may send back a connection
  *     closing RST or a SYN/ACK.
  *
  * Packets marked as INVALID (sIV):
@@ -185,7 +184,7 @@ static enum tcp_conntrack tcp_conntracks[2][6][TCP_CONNTRACK_MAX] = {
  *     sSS -> sSS      Retransmitted SYN
  *     sSR -> sIG      Late retransmitted SYN?
  *     sES -> sIG      Error: SYNs in window outside the SYN_SENT state
- *                     are errors. Receiver will reply with RST 
+ *                     are errors. Receiver will reply with RST
  *                     and close the connection.
  *                     Or we are not in sync and hold a dead connection.
  *     sFW -> sIG
@@ -198,10 +197,10 @@ static enum tcp_conntrack tcp_conntracks[2][6][TCP_CONNTRACK_MAX] = {
 /*synack*/ { sIV, sIV, sIV, sIV, sIV, sIV, sIV, sIV, sIV, sIV },
 /*
  * A SYN/ACK from the client is always invalid:
- *     - either it tries to set up a simultaneous open, which is 
+ *     - either it tries to set up a simultaneous open, which is
  *       not supported;
  *     - or the firewall has just been inserted between the two hosts
- *       during the session set-up. The SYN will be retransmitted 
+ *       during the session set-up. The SYN will be retransmitted
  *       by the true client (or it'll time out).
  */
 /*          sNO, sSS, sSR, sES, sFW, sCW, sLA, sTW, sCL, sLI   */
@@ -213,7 +212,7 @@ static enum tcp_conntrack tcp_conntracks[2][6][TCP_CONNTRACK_MAX] = {
  *     sSR -> sFW      Close started.
  *     sES -> sFW
  *     sFW -> sLA      FIN seen in both directions, waiting for
- *                     the last ACK. 
+ *                     the last ACK.
  *                     Migth be a retransmitted FIN as well...
  *     sCW -> sLA
  *     sLA -> sLA      Retransmitted FIN. Remain in the same state.
@@ -291,7 +290,7 @@ static enum tcp_conntrack tcp_conntracks[2][6][TCP_CONNTRACK_MAX] = {
 /*          sNO, sSS, sSR, sES, sFW, sCW, sLA, sTW, sCL, sLI   */
 /*rst*/    { sIV, sCL, sCL, sCL, sCL, sCL, sCL, sCL, sCL, sIV },
 /*none*/   { sIV, sIV, sIV, sIV, sIV, sIV, sIV, sIV, sIV, sIV }
-       }
+       }
 };
 
 static int tcp_pkt_to_tuple(const struct sk_buff *skb,
@@ -352,21 +351,21 @@ static unsigned int get_conntrack_index(const struct tcphdr *tcph)
 
 /* TCP connection tracking based on 'Real Stateful TCP Packet Filtering
    in IP Filter' by Guido van Rooij.
-   
+
    http://www.nluug.nl/events/sane2000/papers.html
    http://www.iae.nl/users/guido/papers/tcp_filtering.ps.gz
-   
+
    The boundaries and the conditions are changed according to RFC793:
    the packet must intersect the window (i.e. segments may be
    after the right or before the left edge) and thus receivers may ACK
    segments after the right edge of the window.
 
-       td_maxend = max(sack + max(win,1)) seen in reply packets
+       td_maxend = max(sack + max(win,1)) seen in reply packets
        td_maxwin = max(max(win, 1)) + (sack - ack) seen in sent packets
        td_maxwin += seq + len - sender.td_maxend
                        if seq + len > sender.td_maxend
        td_end    = max(seq + len) seen in sent packets
-   
+
    I.   Upper bound for valid data:    seq <= sender.td_maxend
    II.  Lower bound for valid data:    seq + len >= sender.td_end - receiver.td_maxwin
    III.        Upper bound for valid ack:      sack <= receiver.td_end
@@ -374,8 +373,8 @@ static unsigned int get_conntrack_index(const struct tcphdr *tcph)
 
    where sack is the highest right edge of sack block found in the packet.
 
-   The upper bound limit for a valid ack is not ignored - 
-   we doesn't have to deal with fragments. 
+   The upper bound limit for a valid ack is not ignored -
+   we doesn't have to deal with fragments.
 */
 
 static inline __u32 segment_seq_plus_len(__u32 seq,
@@ -388,19 +387,19 @@ static inline __u32 segment_seq_plus_len(__u32 seq,
        return (seq + len - dataoff - tcph->doff*4
                + (tcph->syn ? 1 : 0) + (tcph->fin ? 1 : 0));
 }
-  
+
 /* Fixme: what about big packets? */
 #define MAXACKWINCONST                 66000
 #define MAXACKWINDOW(sender)                                           \
        ((sender)->td_maxwin > MAXACKWINCONST ? (sender)->td_maxwin     \
                                              : MAXACKWINCONST)
-  
+
 /*
  * Simplified tcp_parse_options routine from tcp_input.c
  */
 static void tcp_options(const struct sk_buff *skb,
                        unsigned int dataoff,
-                       struct tcphdr *tcph, 
+                       struct tcphdr *tcph,
                        struct ip_ct_tcp_state *state)
 {
        unsigned char buff[(15 * 4) - sizeof(struct tcphdr)];
@@ -414,7 +413,7 @@ static void tcp_options(const struct sk_buff *skb,
                                 length, buff);
        BUG_ON(ptr == NULL);
 
-       state->td_scale = 
+       state->td_scale =
        state->flags = 0;
 
        while (length > 0) {
@@ -434,7 +433,7 @@ static void tcp_options(const struct sk_buff *skb,
                        if (opsize > length)
                                break;  /* don't parse partial options */
 
-                       if (opcode == TCPOPT_SACK_PERM 
+                       if (opcode == TCPOPT_SACK_PERM
                            && opsize == TCPOLEN_SACK_PERM)
                                state->flags |= IP_CT_TCP_FLAG_SACK_PERM;
                        else if (opcode == TCPOPT_WINDOW
@@ -457,7 +456,7 @@ static void tcp_options(const struct sk_buff *skb,
 static void tcp_sack(const struct sk_buff *skb, unsigned int dataoff,
                     struct tcphdr *tcph, __u32 *sack)
 {
-        unsigned char buff[(15 * 4) - sizeof(struct tcphdr)];
+       unsigned char buff[(15 * 4) - sizeof(struct tcphdr)];
        unsigned char *ptr;
        int length = (tcph->doff*4) - sizeof(struct tcphdr);
        __u32 tmp;
@@ -472,10 +471,10 @@ static void tcp_sack(const struct sk_buff *skb, unsigned int dataoff,
        /* Fast path for timestamp-only option */
        if (length == TCPOLEN_TSTAMP_ALIGNED*4
            && *(__be32 *)ptr ==
-               __constant_htonl((TCPOPT_NOP << 24)
-                                | (TCPOPT_NOP << 16)
-                                | (TCPOPT_TIMESTAMP << 8)
-                                | TCPOLEN_TIMESTAMP))
+               __constant_htonl((TCPOPT_NOP << 24)
+                                | (TCPOPT_NOP << 16)
+                                | (TCPOPT_TIMESTAMP << 8)
+                                | TCPOLEN_TIMESTAMP))
                return;
 
        while (length > 0) {
@@ -495,15 +494,15 @@ static void tcp_sack(const struct sk_buff *skb, unsigned int dataoff,
                        if (opsize > length)
                                break;  /* don't parse partial options */
 
-                       if (opcode == TCPOPT_SACK 
-                           && opsize >= (TCPOLEN_SACK_BASE 
-                                         + TCPOLEN_SACK_PERBLOCK)
-                           && !((opsize - TCPOLEN_SACK_BASE) 
-                                % TCPOLEN_SACK_PERBLOCK)) {
-                               for (i = 0;
-                                    i < (opsize - TCPOLEN_SACK_BASE);
-                                    i += TCPOLEN_SACK_PERBLOCK) {
-                                       tmp = ntohl(*((__be32 *)(ptr+i)+1));
+                       if (opcode == TCPOPT_SACK
+                           && opsize >= (TCPOLEN_SACK_BASE
+                                         + TCPOLEN_SACK_PERBLOCK)
+                           && !((opsize - TCPOLEN_SACK_BASE)
+                                % TCPOLEN_SACK_PERBLOCK)) {
+                               for (i = 0;
+                                    i < (opsize - TCPOLEN_SACK_BASE);
+                                    i += TCPOLEN_SACK_PERBLOCK) {
+                                       tmp = ntohl(*((__be32 *)(ptr+i)+1));
 
                                        if (after(tmp, *sack))
                                                *sack = tmp;
@@ -516,12 +515,12 @@ static void tcp_sack(const struct sk_buff *skb, unsigned int dataoff,
        }
 }
 
-static int tcp_in_window(struct ip_ct_tcp *state, 
-                         enum ip_conntrack_dir dir,
-                         unsigned int index,
-                         const struct sk_buff *skb,
+static int tcp_in_window(struct ip_ct_tcp *state,
+                        enum ip_conntrack_dir dir,
+                        unsigned int index,
+                        const struct sk_buff *skb,
                         unsigned int dataoff,
-                         struct tcphdr *tcph,
+                        struct tcphdr *tcph,
                         int pf)
 {
        struct ip_ct_tcp_state *sender = &state->seen[dir];
@@ -543,14 +542,14 @@ static int tcp_in_window(struct ip_ct_tcp *state,
        DEBUGP("tcp_in_window: START\n");
        DEBUGP("tcp_in_window: src=%u.%u.%u.%u:%hu dst=%u.%u.%u.%u:%hu "
               "seq=%u ack=%u sack=%u win=%u end=%u\n",
-               NIPQUAD(iph->saddr), ntohs(tcph->source), 
+               NIPQUAD(iph->saddr), ntohs(tcph->source),
                NIPQUAD(iph->daddr), ntohs(tcph->dest),
                seq, ack, sack, win, end);
        DEBUGP("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i "
               "receiver end=%u maxend=%u maxwin=%u scale=%i\n",
                sender->td_end, sender->td_maxend, sender->td_maxwin,
-               sender->td_scale, 
-               receiver->td_end, receiver->td_maxend, receiver->td_maxwin, 
+               sender->td_scale,
+               receiver->td_end, receiver->td_maxend, receiver->td_maxwin,
                receiver->td_scale);
 
        if (sender->td_end == 0) {
@@ -561,26 +560,26 @@ static int tcp_in_window(struct ip_ct_tcp *state,
                        /*
                         * Outgoing SYN-ACK in reply to a SYN.
                         */
-                       sender->td_end = 
+                       sender->td_end =
                        sender->td_maxend = end;
                        sender->td_maxwin = (win == 0 ? 1 : win);
 
                        tcp_options(skb, dataoff, tcph, sender);
-                       /* 
+                       /*
                         * RFC 1323:
                         * Both sides must send the Window Scale option
                         * to enable window scaling in either direction.
                         */
                        if (!(sender->flags & IP_CT_TCP_FLAG_WINDOW_SCALE
                              && receiver->flags & IP_CT_TCP_FLAG_WINDOW_SCALE))
-                               sender->td_scale = 
+                               sender->td_scale =
                                receiver->td_scale = 0;
                } else {
                        /*
                         * We are in the middle of a connection,
                         * its history is lost for us.
                         * Let's try to use the data from the packet.
-                        */
+                        */
                        sender->td_end = end;
                        sender->td_maxwin = (win == 0 ? 1 : win);
                        sender->td_maxend = end + sender->td_maxwin;
@@ -592,7 +591,7 @@ static int tcp_in_window(struct ip_ct_tcp *state,
                   && after(end, sender->td_end)) {
                /*
                 * RFC 793: "if a TCP is reinitialized ... then it need
-                * not wait at all; it must only be sure to use sequence 
+                * not wait at all; it must only be sure to use sequence
                 * numbers larger than those recently used."
                 */
                sender->td_end =
@@ -607,8 +606,8 @@ static int tcp_in_window(struct ip_ct_tcp *state,
                 * If there is no ACK, just pretend it was set and OK.
                 */
                ack = sack = receiver->td_end;
-       } else if (((tcp_flag_word(tcph) & (TCP_FLAG_ACK|TCP_FLAG_RST)) == 
-                   (TCP_FLAG_ACK|TCP_FLAG_RST)) 
+       } else if (((tcp_flag_word(tcph) & (TCP_FLAG_ACK|TCP_FLAG_RST)) ==
+                   (TCP_FLAG_ACK|TCP_FLAG_RST))
                   && (ack == 0)) {
                /*
                 * Broken TCP stacks, that set ACK in RST packets as well
@@ -637,21 +636,21 @@ static int tcp_in_window(struct ip_ct_tcp *state,
        DEBUGP("tcp_in_window: sender end=%u maxend=%u maxwin=%u scale=%i "
               "receiver end=%u maxend=%u maxwin=%u scale=%i\n",
                sender->td_end, sender->td_maxend, sender->td_maxwin,
-               sender->td_scale, 
+               sender->td_scale,
                receiver->td_end, receiver->td_maxend, receiver->td_maxwin,
                receiver->td_scale);
 
        DEBUGP("tcp_in_window: I=%i II=%i III=%i IV=%i\n",
                before(seq, sender->td_maxend + 1),
                after(end, sender->td_end - receiver->td_maxwin - 1),
-               before(sack, receiver->td_end + 1),
-               after(ack, receiver->td_end - MAXACKWINDOW(sender)));
+               before(sack, receiver->td_end + 1),
+               after(ack, receiver->td_end - MAXACKWINDOW(sender)));
 
        if (before(seq, sender->td_maxend + 1) &&
            after(end, sender->td_end - receiver->td_maxwin - 1) &&
            before(sack, receiver->td_end + 1) &&
            after(ack, receiver->td_end - MAXACKWINDOW(sender))) {
-               /*
+               /*
                 * Take into account window scaling (RFC 1323).
                 */
                if (!tcph->syn)
@@ -676,7 +675,7 @@ static int tcp_in_window(struct ip_ct_tcp *state,
                                receiver->td_maxend++;
                }
 
-               /* 
+               /*
                 * Check retransmissions.
                 */
                if (index == TCP_ACK_SET) {
@@ -712,11 +711,11 @@ static int tcp_in_window(struct ip_ct_tcp *state,
                        : "ACK is over the upper bound (ACKed data not seen yet)"
                        : "SEQ is under the lower bound (already ACKed data retransmitted)"
                        : "SEQ is over the upper bound (over the window of the receiver)");
-       }
-  
+       }
+
        DEBUGP("tcp_in_window: res=%i sender end=%u maxend=%u maxwin=%u "
               "receiver end=%u maxend=%u maxwin=%u\n",
-               res, sender->td_end, sender->td_maxend, sender->td_maxwin, 
+               res, sender->td_end, sender->td_maxend, sender->td_maxwin,
                receiver->td_end, receiver->td_maxend, receiver->td_maxwin);
 
        return res;
@@ -727,7 +726,7 @@ static int tcp_in_window(struct ip_ct_tcp *state,
 /* Caller must linearize skb at tcp header. */
 void nf_conntrack_tcp_update(struct sk_buff *skb,
                             unsigned int dataoff,
-                            struct nf_conn *conntrack, 
+                            struct nf_conn *conntrack,
                             int dir)
 {
        struct tcphdr *tcph = (void *)skb->data + dataoff;
@@ -750,7 +749,7 @@ void nf_conntrack_tcp_update(struct sk_buff *skb,
        DEBUGP("tcp_update: sender end=%u maxend=%u maxwin=%u scale=%i "
               "receiver end=%u maxend=%u maxwin=%u scale=%i\n",
                sender->td_end, sender->td_maxend, sender->td_maxwin,
-               sender->td_scale, 
+               sender->td_scale,
                receiver->td_end, receiver->td_maxend, receiver->td_maxwin,
                receiver->td_scale);
 }
@@ -804,8 +803,8 @@ static int tcp_error(struct sk_buff *skb,
                        nf_log_packet(pf, 0, skb, NULL, NULL, NULL,
                                "nf_ct_tcp: short packet ");
                return -NF_ACCEPT;
-       }
-  
+       }
+
        /* Not whole TCP header or malformed packet */
        if (th->doff*4 < sizeof(struct tcphdr) || tcplen < th->doff*4) {
                if (LOG_INVALID(IPPROTO_TCP))
@@ -813,7 +812,7 @@ static int tcp_error(struct sk_buff *skb,
                                "nf_ct_tcp: truncated/malformed packet ");
                return -NF_ACCEPT;
        }
-  
+
        /* Checksum invalid? Ignore.
         * We skip checking packets on the outgoing path
         * because the checksum is assumed to be correct.
@@ -870,28 +869,28 @@ static int tcp_packet(struct nf_conn *conntrack,
                 *
                 * a) SYN in ORIGINAL
                 * b) SYN/ACK in REPLY
-                * c) ACK in reply direction after initial SYN in original. 
+                * c) ACK in reply direction after initial SYN in original.
                 */
                if (index == TCP_SYNACK_SET
                    && conntrack->proto.tcp.last_index == TCP_SYN_SET
                    && conntrack->proto.tcp.last_dir != dir
                    && ntohl(th->ack_seq) ==
-                            conntrack->proto.tcp.last_end) {
-                       /* This SYN/ACK acknowledges a SYN that we earlier 
+                            conntrack->proto.tcp.last_end) {
+                       /* This SYN/ACK acknowledges a SYN that we earlier
                         * ignored as invalid. This means that the client and
                         * the server are both in sync, while the firewall is
                         * not. We kill this session and block the SYN/ACK so
-                        * that the client cannot but retransmit its SYN and 
+                        * that the client cannot but retransmit its SYN and
                         * thus initiate a clean new session.
                         */
-                       write_unlock_bh(&tcp_lock);
+                       write_unlock_bh(&tcp_lock);
                        if (LOG_INVALID(IPPROTO_TCP))
                                nf_log_packet(pf, 0, skb, NULL, NULL, NULL,
                                          "nf_ct_tcp: killing out of sync session ");
-                       if (del_timer(&conntrack->timeout))
-                               conntrack->timeout.function((unsigned long)
-                                                           conntrack);
-                       return -NF_DROP;
+                       if (del_timer(&conntrack->timeout))
+                               conntrack->timeout.function((unsigned long)
+                                                           conntrack);
+                       return -NF_DROP;
                }
                conntrack->proto.tcp.last_index = index;
                conntrack->proto.tcp.last_dir = dir;
@@ -921,13 +920,13 @@ static int tcp_packet(struct nf_conn *conntrack,
                        IP_CT_TCP_FLAG_CLOSE_INIT)
                    || after(ntohl(th->seq),
                             conntrack->proto.tcp.seen[dir].td_end)) {
-                       /* Attempt to reopen a closed connection.
-                       * Delete this connection and look up again. */
-                       write_unlock_bh(&tcp_lock);
-                       if (del_timer(&conntrack->timeout))
-                               conntrack->timeout.function((unsigned long)
-                                                           conntrack);
-                       return -NF_REPEAT;
+                       /* Attempt to reopen a closed connection.
+                       * Delete this connection and look up again. */
+                       write_unlock_bh(&tcp_lock);
+                       if (del_timer(&conntrack->timeout))
+                               conntrack->timeout.function((unsigned long)
+                                                           conntrack);
+                       return -NF_REPEAT;
                } else {
                        write_unlock_bh(&tcp_lock);
                        if (LOG_INVALID(IPPROTO_TCP))
@@ -938,9 +937,9 @@ static int tcp_packet(struct nf_conn *conntrack,
        case TCP_CONNTRACK_CLOSE:
                if (index == TCP_RST_SET
                    && ((test_bit(IPS_SEEN_REPLY_BIT, &conntrack->status)
-                        && conntrack->proto.tcp.last_index == TCP_SYN_SET)
-                       || (!test_bit(IPS_ASSURED_BIT, &conntrack->status)
-                           && conntrack->proto.tcp.last_index == TCP_ACK_SET))
+                        && conntrack->proto.tcp.last_index == TCP_SYN_SET)
+                       || (!test_bit(IPS_ASSURED_BIT, &conntrack->status)
+                           && conntrack->proto.tcp.last_index == TCP_ACK_SET))
                    && ntohl(th->ack_seq) == conntrack->proto.tcp.last_end) {
                        /* RST sent to invalid SYN or ACK we had let through
                         * at a) and c) above:
@@ -1005,8 +1004,8 @@ static int tcp_packet(struct nf_conn *conntrack,
                   && (old_state == TCP_CONNTRACK_SYN_RECV
                       || old_state == TCP_CONNTRACK_ESTABLISHED)
                   && new_state == TCP_CONNTRACK_ESTABLISHED) {
-               /* Set ASSURED if we see see valid ack in ESTABLISHED 
-                  after SYN_RECV or a valid answer for a picked up 
+               /* Set ASSURED if we see see valid ack in ESTABLISHED
+                  after SYN_RECV or a valid answer for a picked up
                   connection. */
                set_bit(IPS_ASSURED_BIT, &conntrack->status);
                nf_conntrack_event_cache(IPCT_STATUS, skb);
@@ -1015,7 +1014,7 @@ static int tcp_packet(struct nf_conn *conntrack,
 
        return NF_ACCEPT;
 }
+
 /* Called when a new connection for this protocol found. */
 static int tcp_new(struct nf_conn *conntrack,
                   const struct sk_buff *skb,
@@ -1071,7 +1070,7 @@ static int tcp_new(struct nf_conn *conntrack,
                if (conntrack->proto.tcp.seen[0].td_maxwin == 0)
                        conntrack->proto.tcp.seen[0].td_maxwin = 1;
                conntrack->proto.tcp.seen[0].td_maxend =
-                       conntrack->proto.tcp.seen[0].td_end + 
+                       conntrack->proto.tcp.seen[0].td_end +
                        conntrack->proto.tcp.seen[0].td_maxwin;
                conntrack->proto.tcp.seen[0].td_scale = 0;
 
@@ -1081,20 +1080,20 @@ static int tcp_new(struct nf_conn *conntrack,
                conntrack->proto.tcp.seen[1].flags = IP_CT_TCP_FLAG_SACK_PERM |
                                                     IP_CT_TCP_FLAG_BE_LIBERAL;
        }
-    
+
        conntrack->proto.tcp.seen[1].td_end = 0;
        conntrack->proto.tcp.seen[1].td_maxend = 0;
        conntrack->proto.tcp.seen[1].td_maxwin = 1;
-       conntrack->proto.tcp.seen[1].td_scale = 0;      
+       conntrack->proto.tcp.seen[1].td_scale = 0;
 
        /* tcp_packet will set them */
        conntrack->proto.tcp.state = TCP_CONNTRACK_NONE;
        conntrack->proto.tcp.last_index = TCP_NONE_SET;
-        
+
        DEBUGP("tcp_new: sender end=%u maxend=%u maxwin=%u scale=%i "
               "receiver end=%u maxend=%u maxwin=%u scale=%i\n",
                sender->td_end, sender->td_maxend, sender->td_maxwin,
-               sender->td_scale, 
+               sender->td_scale,
                receiver->td_end, receiver->td_maxend, receiver->td_maxwin,
                receiver->td_scale);
        return 1;
@@ -1110,7 +1109,7 @@ static int tcp_to_nfattr(struct sk_buff *skb, struct nfattr *nfa,
                         const struct nf_conn *ct)
 {
        struct nfattr *nest_parms;
-       
+
        read_lock_bh(&tcp_lock);
        nest_parms = NFA_NEST(skb, CTA_PROTOINFO_TCP);
        NFA_PUT(skb, CTA_PROTOINFO_TCP_STATE, sizeof(u_int8_t),
@@ -1140,7 +1139,7 @@ static int nfattr_to_tcp(struct nfattr *cda[], struct nf_conn *ct)
        if (!attr)
                return 0;
 
-        nfattr_parse_nested(tb, CTA_PROTOINFO_TCP_MAX, attr);
+       nfattr_parse_nested(tb, CTA_PROTOINFO_TCP_MAX, attr);
 
        if (nfattr_bad_size(tb, CTA_PROTOINFO_TCP_MAX, cta_min_tcp))
                return -EINVAL;
@@ -1149,7 +1148,7 @@ static int nfattr_to_tcp(struct nfattr *cda[], struct nf_conn *ct)
                return -EINVAL;
 
        write_lock_bh(&tcp_lock);
-       ct->proto.tcp.state = 
+       ct->proto.tcp.state =
                *(u_int8_t *)NFA_DATA(tb[CTA_PROTOINFO_TCP_STATE-1]);
        write_unlock_bh(&tcp_lock);
 
index e49cd25998c4e40a9f1caf63a953ae85beab8c9f..d0a1cee7ee52d765b144a2f53e15e3fbb1627451 100644 (file)
@@ -12,7 +12,6 @@
  */
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/module.h>
 #include <linux/netfilter.h>
index 9dec115346784428f3b2a18a64873ce77299f2db..7aaa8c91b2938f4ac2872ed2002ccf97d2806390 100644 (file)
@@ -341,7 +341,7 @@ int ct_sip_get_info(struct nf_conn *ct,
                        continue;
                }
                aux = ct_sip_search(hnfo->ln_str, dptr, hnfo->ln_strlen,
-                                   ct_sip_lnlen(dptr, limit),
+                                   ct_sip_lnlen(dptr, limit),
                                    hnfo->case_sensitive);
                if (!aux) {
                        DEBUGP("'%s' not found in '%s'.\n", hnfo->ln_str,
@@ -451,12 +451,12 @@ static int sip_help(struct sk_buff **pskb,
 
                /* We'll drop only if there are parse problems. */
                if (!parse_addr(ct, dptr + matchoff, NULL, &addr,
-                               dptr + datalen)) {
+                               dptr + datalen)) {
                        ret = NF_DROP;
                        goto out;
                }
                if (ct_sip_get_info(ct, dptr, datalen, &matchoff, &matchlen,
-                                   POS_MEDIA) > 0) {
+                                   POS_MEDIA) > 0) {
 
                        port = simple_strtoul(dptr + matchoff, NULL, 10);
                        if (port < 1024) {
index f1cb60ff9319bf1a9651c984157a04d16c592ff2..b8586360e519179864cda89ea24ce54d63eb884b 100644 (file)
@@ -229,7 +229,7 @@ out_free:
        return ret;
 }
 
-static struct file_operations ct_file_ops = {
+static const struct file_operations ct_file_ops = {
        .owner   = THIS_MODULE,
        .open    = ct_open,
        .read    = seq_read,
@@ -317,7 +317,7 @@ static int ct_cpu_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &ct_cpu_seq_ops);
 }
 
-static struct file_operations ct_cpu_seq_fops = {
+static const struct file_operations ct_cpu_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = ct_cpu_seq_open,
        .read    = seq_read,
@@ -445,7 +445,7 @@ static int __init nf_conntrack_standalone_init(void)
        proc_stat->owner = THIS_MODULE;
 #endif
 #ifdef CONFIG_SYSCTL
-       nf_ct_sysctl_header = register_sysctl_table(nf_ct_net_table, 0);
+       nf_ct_sysctl_header = register_sysctl_table(nf_ct_net_table);
        if (nf_ct_sysctl_header == NULL) {
                printk("nf_conntrack: can't register to sysctl.\n");
                ret = -ENOMEM;
@@ -472,7 +472,7 @@ static int __init nf_conntrack_standalone_init(void)
 static void __exit nf_conntrack_standalone_fini(void)
 {
 #ifdef CONFIG_SYSCTL
-       unregister_sysctl_table(nf_ct_sysctl_header);
+       unregister_sysctl_table(nf_ct_sysctl_header);
 #endif
 #ifdef CONFIG_PROC_FS
        remove_proc_entry("nf_conntrack", proc_net_stat);
index f5bffe24b0a5a71dff902d3f0ea2360156610b41..37c4542e3112f5a93420c72755264a2c802c6a4e 100644 (file)
@@ -31,7 +31,7 @@ MODULE_PARM_DESC(ports, "Port numbers of TFTP servers");
 
 #if 0
 #define DEBUGP(format, args...) printk("%s:%s:" format, \
-                                       __FILE__, __FUNCTION__ , ## args)
+                                      __FILE__, __FUNCTION__ , ## args)
 #else
 #define DEBUGP(format, args...)
 #endif
index a981971ce1d5f6929e147ba2a0462beaea623178..0df7fff196a715f19c3f2621f4ecac8f0874e9a4 100644 (file)
@@ -24,7 +24,7 @@ extern unsigned int nf_iterate(struct list_head *head,
 
 /* nf_queue.c */
 extern int nf_queue(struct sk_buff *skb,
-                   struct list_head *elem, 
+                   struct list_head *elem,
                    int pf, unsigned int hook,
                    struct net_device *indev,
                    struct net_device *outdev,
index 8901b3a07f7e26a41d23bb6389c6c6d7731e61ca..91b220cf5a1fee639d506c3ba48a69f1fc7e9664 100644 (file)
 
 #define NF_LOG_PREFIXLEN               128
 
-static struct nf_logger *nf_logging[NPROTO]; /* = NULL */
-static DEFINE_SPINLOCK(nf_log_lock);
+static struct nf_logger *nf_loggers[NPROTO];
+static DEFINE_MUTEX(nf_log_mutex);
 
 /* return EBUSY if somebody else is registered, EEXIST if the same logger
  * is registred, 0 on success. */
 int nf_log_register(int pf, struct nf_logger *logger)
 {
-       int ret = -EBUSY;
+       int ret;
 
        if (pf >= NPROTO)
                return -EINVAL;
 
        /* Any setup of logging members must be done before
         * substituting pointer. */
-       spin_lock(&nf_log_lock);
-       if (!nf_logging[pf]) {
-               rcu_assign_pointer(nf_logging[pf], logger);
-               ret = 0;
-       } else if (nf_logging[pf] == logger)
+       ret = mutex_lock_interruptible(&nf_log_mutex);
+       if (ret < 0)
+               return ret;
+
+       if (!nf_loggers[pf])
+               rcu_assign_pointer(nf_loggers[pf], logger);
+       else if (nf_loggers[pf] == logger)
                ret = -EEXIST;
+       else
+               ret = -EBUSY;
 
-       spin_unlock(&nf_log_lock);
+       mutex_unlock(&nf_log_mutex);
        return ret;
-}              
+}
 EXPORT_SYMBOL(nf_log_register);
 
-int nf_log_unregister_pf(int pf)
+void nf_log_unregister_pf(int pf)
 {
        if (pf >= NPROTO)
-               return -EINVAL;
-
-       spin_lock(&nf_log_lock);
-       nf_logging[pf] = NULL;
-       spin_unlock(&nf_log_lock);
+               return;
+       mutex_lock(&nf_log_mutex);
+       rcu_assign_pointer(nf_loggers[pf], NULL);
+       mutex_unlock(&nf_log_mutex);
 
        /* Give time to concurrent readers. */
-       synchronize_net();
-
-       return 0;
+       synchronize_rcu();
 }
 EXPORT_SYMBOL(nf_log_unregister_pf);
 
-void nf_log_unregister_logger(struct nf_logger *logger)
+void nf_log_unregister(struct nf_logger *logger)
 {
        int i;
 
-       spin_lock(&nf_log_lock);
+       mutex_lock(&nf_log_mutex);
        for (i = 0; i < NPROTO; i++) {
-               if (nf_logging[i] == logger)
-                       nf_logging[i] = NULL;
+               if (nf_loggers[i] == logger)
+                       rcu_assign_pointer(nf_loggers[i], NULL);
        }
-       spin_unlock(&nf_log_lock);
+       mutex_unlock(&nf_log_mutex);
 
-       synchronize_net();
+       synchronize_rcu();
 }
-EXPORT_SYMBOL(nf_log_unregister_logger);
+EXPORT_SYMBOL(nf_log_unregister);
 
 void nf_log_packet(int pf,
                   unsigned int hooknum,
@@ -82,9 +83,9 @@ void nf_log_packet(int pf,
        va_list args;
        char prefix[NF_LOG_PREFIXLEN];
        struct nf_logger *logger;
-       
+
        rcu_read_lock();
-       logger = rcu_dereference(nf_logging[pf]);
+       logger = rcu_dereference(nf_loggers[pf]);
        if (logger) {
                va_start(args, fmt);
                vsnprintf(prefix, sizeof(prefix), fmt, args);
@@ -131,11 +132,11 @@ static int seq_show(struct seq_file *s, void *v)
        loff_t *pos = v;
        const struct nf_logger *logger;
 
-       logger = rcu_dereference(nf_logging[*pos]);
+       logger = rcu_dereference(nf_loggers[*pos]);
 
        if (!logger)
                return seq_printf(s, "%2lld NONE\n", *pos);
-       
+
        return seq_printf(s, "%2lld %s\n", *pos, logger->name);
 }
 
@@ -151,7 +152,7 @@ static int nflog_open(struct inode *inode, struct file *file)
        return seq_open(file, &nflog_seq_ops);
 }
 
-static struct file_operations nflog_file_ops = {
+static const struct file_operations nflog_file_ops = {
        .owner   = THIS_MODULE,
        .open    = nflog_open,
        .read    = seq_read,
index 4d8936ed581d2f9e524e6b1a59a844db1546676b..b1f2ace96f6d2acab781ee38d34671e986f379c3 100644 (file)
@@ -10,7 +10,7 @@
 
 #include "nf_internals.h"
 
-/* 
+/*
  * A queue handler may be registered for each protocol.  Each is protected by
  * long term mutex.  The handler must provide an an outfn() to accept packets
  * for queueing and must reinject all packets it receives, no matter what.
@@ -22,7 +22,7 @@ static DEFINE_RWLOCK(queue_handler_lock);
 /* return EBUSY when somebody else is registered, return EEXIST if the
  * same handler is registered, return 0 in case of success. */
 int nf_register_queue_handler(int pf, struct nf_queue_handler *qh)
-{      
+{
        int ret;
 
        if (pf >= NPROTO)
@@ -52,7 +52,7 @@ int nf_unregister_queue_handler(int pf)
        write_lock_bh(&queue_handler_lock);
        queue_handler[pf] = NULL;
        write_unlock_bh(&queue_handler_lock);
-       
+
        return 0;
 }
 EXPORT_SYMBOL(nf_unregister_queue_handler);
@@ -70,8 +70,8 @@ void nf_unregister_queue_handlers(struct nf_queue_handler *qh)
 }
 EXPORT_SYMBOL_GPL(nf_unregister_queue_handlers);
 
-/* 
- * Any packet that leaves via this function must come back 
+/*
+ * Any packet that leaves via this function must come back
  * through nf_reinject().
  */
 static int __nf_queue(struct sk_buff *skb,
@@ -115,7 +115,7 @@ static int __nf_queue(struct sk_buff *skb,
                return 1;
        }
 
-       *info = (struct nf_info) { 
+       *info = (struct nf_info) {
                (struct nf_hook_ops *)elem, pf, hook, indev, outdev, okfn };
 
        /* If it's going away, ignore hook. */
@@ -226,10 +226,10 @@ void nf_reinject(struct sk_buff *skb, struct nf_info *info,
        module_put(info->elem->owner);
 
        list_for_each_rcu(i, &nf_hooks[info->pf][info->hook]) {
-               if (i == elem) 
-                       break;
-       }
-  
+               if (i == elem)
+                       break;
+       }
+
        if (i == &nf_hooks[info->pf][info->hook]) {
                /* The module which sent it to userspace is gone. */
                NFDEBUG("%s: module disappeared, dropping packet.\n",
@@ -252,7 +252,7 @@ void nf_reinject(struct sk_buff *skb, struct nf_info *info,
        if (verdict == NF_ACCEPT) {
        next_hook:
                verdict = nf_iterate(&nf_hooks[info->pf][info->hook],
-                                    &skb, info->hook, 
+                                    &skb, info->hook,
                                     info->indev, info->outdev, &elem,
                                     info->okfn, INT_MIN);
        }
@@ -331,7 +331,7 @@ static int nfqueue_open(struct inode *inode, struct file *file)
        return seq_open(file, &nfqueue_seq_ops);
 }
 
-static struct file_operations nfqueue_file_ops = {
+static const struct file_operations nfqueue_file_ops = {
        .owner   = THIS_MODULE,
        .open    = nfqueue_open,
        .read    = seq_read,
index c2e44e90e4374f0be18650a5e109fddb946d78a8..8b8ece750313b5a401741564c57c4eb3b775b552 100644 (file)
@@ -32,13 +32,13 @@ int nf_register_sockopt(struct nf_sockopt_ops *reg)
        list_for_each(i, &nf_sockopts) {
                struct nf_sockopt_ops *ops = (struct nf_sockopt_ops *)i;
                if (ops->pf == reg->pf
-                   && (overlap(ops->set_optmin, ops->set_optmax, 
+                   && (overlap(ops->set_optmin, ops->set_optmax,
                                reg->set_optmin, reg->set_optmax)
-                       || overlap(ops->get_optmin, ops->get_optmax, 
+                       || overlap(ops->get_optmin, ops->get_optmax,
                                   reg->get_optmin, reg->get_optmax))) {
                        NFDEBUG("nf_sock overlap: %u-%u/%u-%u v %u-%u/%u-%u\n",
-                               ops->set_optmin, ops->set_optmax, 
-                               ops->get_optmin, ops->get_optmax, 
+                               ops->set_optmin, ops->set_optmax,
+                               ops->get_optmin, ops->get_optmax,
                                reg->set_optmin, reg->set_optmax,
                                reg->get_optmin, reg->get_optmax);
                        ret = -EBUSY;
@@ -73,7 +73,7 @@ void nf_unregister_sockopt(struct nf_sockopt_ops *reg)
 EXPORT_SYMBOL(nf_unregister_sockopt);
 
 /* Call get/setsockopt() */
-static int nf_sockopt(struct sock *sk, int pf, int val, 
+static int nf_sockopt(struct sock *sk, int pf, int val,
                      char __user *opt, int *len, int get)
 {
        struct list_head *i;
@@ -107,7 +107,7 @@ static int nf_sockopt(struct sock *sk, int pf, int val,
        }
        mutex_unlock(&nf_sockopt_mutex);
        return -ENOPROTOOPT;
-       
+
  out:
        mutex_lock(&nf_sockopt_mutex);
        ops->use--;
index 06ddddb2911f8f9691757bf9a130907f1bebfc47..ee34589e48a4407918b06a3f2452611d38366399 100644 (file)
@@ -56,7 +56,7 @@ nf_register_sysctl_table(struct ctl_table *path, struct ctl_table *table)
        path = path_dup(path, table);
        if (path == NULL)
                return NULL;
-       header = register_sysctl_table(path, 0);
+       header = register_sysctl_table(path);
        if (header == NULL)
                path_free(path, table);
        return header;
index 52fdfa2686c9f2c76aa54e75083f1deabc3ac949..11d504d0ac72068d8c88bc794fe4cb8c1284e3d9 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/socket.h>
 #include <linux/kernel.h>
 #include <linux/major.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
@@ -105,7 +104,7 @@ static inline struct nfnl_callback *
 nfnetlink_find_client(u_int16_t type, struct nfnetlink_subsystem *ss)
 {
        u_int8_t cb_id = NFNL_MSG_TYPE(type);
-       
+
        if (cb_id >= ss->cb_count) {
                DEBUGP("msgtype %u >= %u, returning\n", type, ss->cb_count);
                return NULL;
@@ -187,7 +186,7 @@ nfnetlink_check_attributes(struct nfnetlink_subsystem *subsys,
        /* implicit: if nlmsg_len == min_len, we return 0, and an empty
         * (zeroed) cda[] array. The message is valid, but empty. */
 
-        return 0;
+       return 0;
 }
 
 int nfnetlink_has_listeners(unsigned int group)
@@ -268,12 +267,12 @@ static int nfnetlink_rcv_msg(struct sk_buff *skb,
        }
 
        {
-               u_int16_t attr_count = 
+               u_int16_t attr_count =
                        ss->cb[NFNL_MSG_TYPE(nlh->nlmsg_type)].attr_count;
                struct nfattr *cda[attr_count];
 
                memset(cda, 0, sizeof(struct nfattr *) * attr_count);
-               
+
                err = nfnetlink_check_attributes(ss, nlh, cda);
                if (err < 0)
                        goto err_inval;
@@ -357,7 +356,7 @@ static int __init nfnetlink_init(void)
        printk("Netfilter messages via NETLINK v%s.\n", nfversion);
 
        nfnl = netlink_kernel_create(NETLINK_NETFILTER, NFNLGRP_MAX,
-                                    nfnetlink_rcv, THIS_MODULE);
+                                    nfnetlink_rcv, THIS_MODULE);
        if (!nfnl) {
                printk(KERN_ERR "cannot initialize nfnetlink!\n");
                return -1;
index d1505dd25c6663b4cc8fddb56c9e92ad395e569a..b8eab0dbc3dd3f3a93f6af25317dc1c5e7f2f98b 100644 (file)
@@ -75,7 +75,7 @@ struct nfulnl_instance {
        u_int32_t seq;                  /* instance-local sequential counter */
        u_int16_t group_num;            /* number of this queue */
        u_int16_t flags;
-       u_int8_t copy_mode;     
+       u_int8_t copy_mode;
 };
 
 static DEFINE_RWLOCK(instances_lock);
@@ -146,7 +146,7 @@ instance_create(u_int16_t group_num, int pid)
        UDEBUG("entering (group_num=%u, pid=%d)\n", group_num,
                pid);
 
-       write_lock_bh(&instances_lock); 
+       write_lock_bh(&instances_lock);
        if (__instance_lookup(group_num)) {
                inst = NULL;
                UDEBUG("aborting, instance already exists\n");
@@ -179,10 +179,10 @@ instance_create(u_int16_t group_num, int pid)
        if (!try_module_get(THIS_MODULE))
                goto out_free;
 
-       hlist_add_head(&inst->hlist, 
+       hlist_add_head(&inst->hlist,
                       &instance_table[instance_hashfn(group_num)]);
 
-       UDEBUG("newly added node: %p, next=%p\n", &inst->hlist, 
+       UDEBUG("newly added node: %p, next=%p\n", &inst->hlist,
                inst->hlist.next);
 
        write_unlock_bh(&instances_lock);
@@ -251,14 +251,14 @@ nfulnl_set_mode(struct nfulnl_instance *inst, u_int8_t mode,
        int status = 0;
 
        spin_lock_bh(&inst->lock);
-       
+
        switch (mode) {
        case NFULNL_COPY_NONE:
        case NFULNL_COPY_META:
                inst->copy_mode = mode;
                inst->copy_range = 0;
                break;
-               
+
        case NFULNL_COPY_PACKET:
                inst->copy_mode = mode;
                /* we're using struct nfattr which has 16bit nfa_len */
@@ -267,7 +267,7 @@ nfulnl_set_mode(struct nfulnl_instance *inst, u_int8_t mode,
                else
                        inst->copy_range = range;
                break;
-               
+
        default:
                status = -EINVAL;
                break;
@@ -327,7 +327,7 @@ nfulnl_set_flags(struct nfulnl_instance *inst, u_int16_t flags)
        return 0;
 }
 
-static struct sk_buff *nfulnl_alloc_skb(unsigned int inst_size, 
+static struct sk_buff *nfulnl_alloc_skb(unsigned int inst_size,
                                        unsigned int pkt_size)
 {
        struct sk_buff *skb;
@@ -387,7 +387,7 @@ __nfulnl_send(struct nfulnl_instance *inst)
 
 static void nfulnl_timer(unsigned long data)
 {
-       struct nfulnl_instance *inst = (struct nfulnl_instance *)data; 
+       struct nfulnl_instance *inst = (struct nfulnl_instance *)data;
 
        UDEBUG("timer function called, flushing buffer\n");
 
@@ -399,9 +399,9 @@ static void nfulnl_timer(unsigned long data)
 
 /* This is an inline function, we don't really care about a long
  * list of arguments */
-static inline int 
+static inline int
 __build_packet_message(struct nfulnl_instance *inst,
-                       const struct sk_buff *skb, 
+                       const struct sk_buff *skb,
                        unsigned int data_len,
                        unsigned int pf,
                        unsigned int hooknum,
@@ -417,9 +417,9 @@ __build_packet_message(struct nfulnl_instance *inst,
        __be32 tmp_uint;
 
        UDEBUG("entered\n");
-               
+
        old_tail = inst->skb->tail;
-       nlh = NLMSG_PUT(inst->skb, 0, 0, 
+       nlh = NLMSG_PUT(inst->skb, 0, 0,
                        NFNL_SUBSYS_ULOG << 8 | NFULNL_MSG_PACKET,
                        sizeof(struct nfgenmsg));
        nfmsg = NLMSG_DATA(nlh);
@@ -457,7 +457,7 @@ __build_packet_message(struct nfulnl_instance *inst,
                        NFA_PUT(inst->skb, NFULA_IFINDEX_INDEV,
                                sizeof(tmp_uint), &tmp_uint);
                        if (skb->nf_bridge && skb->nf_bridge->physindev) {
-                               tmp_uint = 
+                               tmp_uint =
                                    htonl(skb->nf_bridge->physindev->ifindex);
                                NFA_PUT(inst->skb, NFULA_IFINDEX_PHYSINDEV,
                                        sizeof(tmp_uint), &tmp_uint);
@@ -488,7 +488,7 @@ __build_packet_message(struct nfulnl_instance *inst,
                        NFA_PUT(inst->skb, NFULA_IFINDEX_OUTDEV,
                                sizeof(tmp_uint), &tmp_uint);
                        if (skb->nf_bridge) {
-                               tmp_uint = 
+                               tmp_uint =
                                    htonl(skb->nf_bridge->physoutdev->ifindex);
                                NFA_PUT(inst->skb, NFULA_IFINDEX_PHYSOUTDEV,
                                        sizeof(tmp_uint), &tmp_uint);
@@ -558,7 +558,7 @@ __build_packet_message(struct nfulnl_instance *inst,
                if (skb_copy_bits(skb, 0, NFA_DATA(nfa), data_len))
                        BUG();
        }
-               
+
        nlh->nlmsg_len = inst->skb->tail - old_tail;
        return 0;
 
@@ -599,7 +599,7 @@ nfulnl_log_packet(unsigned int pf,
        unsigned int nlbufsiz;
        unsigned int plen;
 
-       if (li_user && li_user->type == NF_LOG_TYPE_ULOG) 
+       if (li_user && li_user->type == NF_LOG_TYPE_ULOG)
                li = li_user;
        else
                li = &default_loginfo;
@@ -648,24 +648,24 @@ nfulnl_log_packet(unsigned int pf,
        /* per-rule qthreshold overrides per-instance */
        if (qthreshold > li->u.ulog.qthreshold)
                qthreshold = li->u.ulog.qthreshold;
-       
+
        switch (inst->copy_mode) {
        case NFULNL_COPY_META:
        case NFULNL_COPY_NONE:
                data_len = 0;
                break;
-       
+
        case NFULNL_COPY_PACKET:
-               if (inst->copy_range == 0 
+               if (inst->copy_range == 0
                    || inst->copy_range > skb->len)
                        data_len = skb->len;
                else
                        data_len = inst->copy_range;
-               
+
                size += NFA_SPACE(data_len);
                UDEBUG("copy_packet, therefore size now %u\n", size);
                break;
-       
+
        default:
                spin_unlock_bh(&inst->lock);
                instance_put(inst);
@@ -991,9 +991,9 @@ static int seq_show(struct seq_file *s, void *v)
 {
        const struct nfulnl_instance *inst = v;
 
-       return seq_printf(s, "%5d %6d %5d %1d %5d %6d %2d\n", 
+       return seq_printf(s, "%5d %6d %5d %1d %5d %6d %2d\n",
                          inst->group_num,
-                         inst->peer_pid, inst->qlen, 
+                         inst->peer_pid, inst->qlen,
                          inst->copy_mode, inst->copy_range,
                          inst->flushtimeout, atomic_read(&inst->use));
 }
@@ -1025,7 +1025,7 @@ out_free:
        return ret;
 }
 
-static struct file_operations nful_file_ops = {
+static const struct file_operations nful_file_ops = {
        .owner   = THIS_MODULE,
        .open    = nful_open,
        .read    = seq_read,
@@ -1041,10 +1041,10 @@ static int __init nfnetlink_log_init(void)
 #ifdef CONFIG_PROC_FS
        struct proc_dir_entry *proc_nful;
 #endif
-       
+
        for (i = 0; i < INSTANCE_BUCKETS; i++)
                INIT_HLIST_HEAD(&instance_table[i]);
-       
+
        /* it's not really all that important to have a random value, so
         * we can do this from the init function, even if there hasn't
         * been that much entropy yet */
@@ -1077,7 +1077,7 @@ cleanup_netlink_notifier:
 
 static void __exit nfnetlink_log_fini(void)
 {
-       nf_log_unregister_logger(&nfulnl_logger);
+       nf_log_unregister(&nfulnl_logger);
 #ifdef CONFIG_PROC_FS
        remove_proc_entry("nfnetlink_log", proc_net_netfilter);
 #endif
index a88a017da22c4146893952a6d0706fa9e44aebe3..d9ce4a71d0f3152963327dfc9e0906350353179f 100644 (file)
@@ -129,7 +129,7 @@ instance_create(u_int16_t queue_num, int pid)
 
        QDEBUG("entering for queue_num=%u, pid=%d\n", queue_num, pid);
 
-       write_lock_bh(&instances_lock); 
+       write_lock_bh(&instances_lock);
        if (__instance_lookup(queue_num)) {
                inst = NULL;
                QDEBUG("aborting, instance already exists\n");
@@ -154,7 +154,7 @@ instance_create(u_int16_t queue_num, int pid)
        if (!try_module_get(THIS_MODULE))
                goto out_free;
 
-       hlist_add_head(&inst->hlist, 
+       hlist_add_head(&inst->hlist,
                       &instance_table[instance_hashfn(queue_num)]);
 
        write_unlock_bh(&instances_lock);
@@ -239,14 +239,14 @@ __enqueue_entry(struct nfqnl_instance *queue,
  * entry if cmpfn is NULL.
  */
 static inline struct nfqnl_queue_entry *
-__find_entry(struct nfqnl_instance *queue, nfqnl_cmpfn cmpfn, 
+__find_entry(struct nfqnl_instance *queue, nfqnl_cmpfn cmpfn,
                   unsigned long data)
 {
        struct list_head *p;
 
        list_for_each_prev(p, &queue->queue_list) {
                struct nfqnl_queue_entry *entry = (struct nfqnl_queue_entry *)p;
-               
+
                if (!cmpfn || cmpfn(entry, data))
                        return entry;
        }
@@ -279,7 +279,7 @@ static inline void
 __nfqnl_flush(struct nfqnl_instance *queue, int verdict)
 {
        struct nfqnl_queue_entry *entry;
-       
+
        while ((entry = __find_dequeue_entry(queue, NULL, 0)))
                issue_verdict(entry, verdict);
 }
@@ -289,14 +289,14 @@ __nfqnl_set_mode(struct nfqnl_instance *queue,
                 unsigned char mode, unsigned int range)
 {
        int status = 0;
-       
+
        switch (mode) {
        case NFQNL_COPY_NONE:
        case NFQNL_COPY_META:
                queue->copy_mode = mode;
                queue->copy_range = 0;
                break;
-               
+
        case NFQNL_COPY_PACKET:
                queue->copy_mode = mode;
                /* we're using struct nfattr which has 16bit nfa_len */
@@ -305,7 +305,7 @@ __nfqnl_set_mode(struct nfqnl_instance *queue,
                else
                        queue->copy_range = range;
                break;
-               
+
        default:
                status = -EINVAL;
 
@@ -318,7 +318,7 @@ find_dequeue_entry(struct nfqnl_instance *queue,
                         nfqnl_cmpfn cmpfn, unsigned long data)
 {
        struct nfqnl_queue_entry *entry;
-       
+
        spin_lock_bh(&queue->lock);
        entry = __find_dequeue_entry(queue, cmpfn, data);
        spin_unlock_bh(&queue->lock);
@@ -369,13 +369,13 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue,
        outdev = entinf->outdev;
 
        spin_lock_bh(&queue->lock);
-       
+
        switch (queue->copy_mode) {
        case NFQNL_COPY_META:
        case NFQNL_COPY_NONE:
                data_len = 0;
                break;
-       
+
        case NFQNL_COPY_PACKET:
                if ((entskb->ip_summed == CHECKSUM_PARTIAL ||
                     entskb->ip_summed == CHECKSUM_COMPLETE) &&
@@ -383,15 +383,15 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue,
                        spin_unlock_bh(&queue->lock);
                        return NULL;
                }
-               if (queue->copy_range == 0 
+               if (queue->copy_range == 0
                    || queue->copy_range > entskb->len)
                        data_len = entskb->len;
                else
                        data_len = queue->copy_range;
-               
+
                size += NFA_SPACE(data_len);
                break;
-       
+
        default:
                *errp = -EINVAL;
                spin_unlock_bh(&queue->lock);
@@ -403,9 +403,9 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue,
        skb = alloc_skb(size, GFP_ATOMIC);
        if (!skb)
                goto nlmsg_failure;
-               
+
        old_tail= skb->tail;
-       nlh = NLMSG_PUT(skb, 0, 0, 
+       nlh = NLMSG_PUT(skb, 0, 0,
                        NFNL_SUBSYS_QUEUE << 8 | NFQNL_MSG_PACKET,
                        sizeof(struct nfgenmsg));
        nfmsg = NLMSG_DATA(nlh);
@@ -427,9 +427,9 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue,
 #else
                if (entinf->pf == PF_BRIDGE) {
                        /* Case 1: indev is physical input device, we need to
-                        * look for bridge group (when called from 
+                        * look for bridge group (when called from
                         * netfilter_bridge) */
-                       NFA_PUT(skb, NFQA_IFINDEX_PHYSINDEV, sizeof(tmp_uint), 
+                       NFA_PUT(skb, NFQA_IFINDEX_PHYSINDEV, sizeof(tmp_uint),
                                &tmp_uint);
                        /* this is the bridge group "brX" */
                        tmp_uint = htonl(indev->br_port->br->dev->ifindex);
@@ -457,7 +457,7 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue,
 #else
                if (entinf->pf == PF_BRIDGE) {
                        /* Case 1: outdev is physical output device, we need to
-                        * look for bridge group (when called from 
+                        * look for bridge group (when called from
                         * netfilter_bridge) */
                        NFA_PUT(skb, NFQA_IFINDEX_PHYSOUTDEV, sizeof(tmp_uint),
                                &tmp_uint);
@@ -490,7 +490,7 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue,
                struct nfqnl_msg_packet_hw phw;
 
                int len = entskb->dev->hard_header_parse(entskb,
-                                                          phw.hw_addr);
+                                                          phw.hw_addr);
                phw.hw_addrlen = htons(len);
                NFA_PUT(skb, NFQA_HWADDR, sizeof(phw), &phw);
        }
@@ -520,7 +520,7 @@ nfqnl_build_packet_message(struct nfqnl_instance *queue,
                if (skb_copy_bits(entskb, 0, NFA_DATA(nfa), data_len))
                        BUG();
        }
-               
+
        nlh->nlmsg_len = skb->tail - old_tail;
        return skb;
 
@@ -535,7 +535,7 @@ nfattr_failure:
 }
 
 static int
-nfqnl_enqueue_packet(struct sk_buff *skb, struct nf_info *info, 
+nfqnl_enqueue_packet(struct sk_buff *skb, struct nf_info *info,
                     unsigned int queuenum, void *data)
 {
        int status = -EINVAL;
@@ -560,7 +560,7 @@ nfqnl_enqueue_packet(struct sk_buff *skb, struct nf_info *info,
        entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
        if (entry == NULL) {
                if (net_ratelimit())
-                       printk(KERN_ERR 
+                       printk(KERN_ERR
                                "nf_queue: OOM in nfqnl_enqueue_packet()\n");
                status = -ENOMEM;
                goto err_out_put;
@@ -573,18 +573,18 @@ nfqnl_enqueue_packet(struct sk_buff *skb, struct nf_info *info,
        nskb = nfqnl_build_packet_message(queue, entry, &status);
        if (nskb == NULL)
                goto err_out_free;
-               
+
        spin_lock_bh(&queue->lock);
-       
+
        if (!queue->peer_pid)
-               goto err_out_free_nskb; 
+               goto err_out_free_nskb;
 
        if (queue->queue_total >= queue->queue_maxlen) {
-                queue->queue_dropped++;
+               queue->queue_dropped++;
                status = -ENOSPC;
                if (net_ratelimit())
-                         printk(KERN_WARNING "nf_queue: full at %d entries, "
-                                "dropping packets(s). Dropped: %d\n", 
+                         printk(KERN_WARNING "nf_queue: full at %d entries, "
+                                "dropping packets(s). Dropped: %d\n",
                                 queue->queue_total, queue->queue_dropped);
                goto err_out_free_nskb;
        }
@@ -592,7 +592,7 @@ nfqnl_enqueue_packet(struct sk_buff *skb, struct nf_info *info,
        /* nfnetlink_unicast will either free the nskb or add it to a socket */
        status = nfnetlink_unicast(nskb, queue->peer_pid, MSG_DONTWAIT);
        if (status < 0) {
-               queue->queue_user_dropped++;
+               queue->queue_user_dropped++;
                goto err_out_unlock;
        }
 
@@ -603,8 +603,8 @@ nfqnl_enqueue_packet(struct sk_buff *skb, struct nf_info *info,
        return status;
 
 err_out_free_nskb:
-       kfree_skb(nskb); 
-       
+       kfree_skb(nskb);
+
 err_out_unlock:
        spin_unlock_bh(&queue->lock);
 
@@ -629,11 +629,11 @@ nfqnl_mangle(void *data, int data_len, struct nfqnl_queue_entry *e)
                        return -EINVAL;
                if (diff > skb_tailroom(e->skb)) {
                        struct sk_buff *newskb;
-                       
+
                        newskb = skb_copy_expand(e->skb,
-                                                skb_headroom(e->skb),
-                                                diff,
-                                                GFP_ATOMIC);
+                                                skb_headroom(e->skb),
+                                                diff,
+                                                GFP_ATOMIC);
                        if (newskb == NULL) {
                                printk(KERN_WARNING "nf_queue: OOM "
                                      "in mangle, dropping packet\n");
@@ -676,7 +676,7 @@ static int
 dev_cmp(struct nfqnl_queue_entry *entry, unsigned long ifindex)
 {
        struct nf_info *entinf = entry->info;
-       
+
        if (entinf->indev)
                if (entinf->indev->ifindex == ifindex)
                        return 1;
@@ -702,7 +702,7 @@ static void
 nfqnl_dev_drop(int ifindex)
 {
        int i;
-       
+
        QDEBUG("entering for ifindex %u\n", ifindex);
 
        /* this only looks like we have to hold the readlock for a way too long
@@ -717,7 +717,7 @@ nfqnl_dev_drop(int ifindex)
 
                hlist_for_each_entry(inst, tmp, head, hlist) {
                        struct nfqnl_queue_entry *entry;
-                       while ((entry = find_dequeue_entry(inst, dev_cmp, 
+                       while ((entry = find_dequeue_entry(inst, dev_cmp,
                                                           ifindex)) != NULL)
                                issue_verdict(entry, NF_DROP);
                }
@@ -835,8 +835,8 @@ nfqnl_recv_verdict(struct sock *ctnl, struct sk_buff *skb,
 
        if (nfqa[NFQA_MARK-1])
                entry->skb->mark = ntohl(*(__be32 *)
-                                        NFA_DATA(nfqa[NFQA_MARK-1]));
-               
+                                        NFA_DATA(nfqa[NFQA_MARK-1]));
+
        issue_verdict(entry, verdict);
        instance_put(queue);
        return 0;
@@ -1077,7 +1077,7 @@ out_free:
        return ret;
 }
 
-static struct file_operations nfqnl_file_ops = {
+static const struct file_operations nfqnl_file_ops = {
        .owner   = THIS_MODULE,
        .open    = nfqnl_open,
        .read    = seq_read,
@@ -1093,7 +1093,7 @@ static int __init nfnetlink_queue_init(void)
 #ifdef CONFIG_PROC_FS
        struct proc_dir_entry *proc_nfqueue;
 #endif
-       
+
        for (i = 0; i < INSTANCE_BUCKETS; i++)
                INIT_HLIST_HEAD(&instance_table[i]);
 
index 8996584b84998708ccc0eabf94b4faa19b96ad11..ec607a421a5a10c452ee13688eeba164aab4be98 100644 (file)
@@ -305,7 +305,7 @@ int xt_find_revision(int af, const char *name, u8 revision, int target,
 EXPORT_SYMBOL_GPL(xt_find_revision);
 
 int xt_check_match(const struct xt_match *match, unsigned short family,
-                   unsigned int size, const char *table, unsigned int hook_mask,
+                  unsigned int size, const char *table, unsigned int hook_mask,
                   unsigned short proto, int inv_proto)
 {
        if (XT_ALIGN(match->matchsize) != size) {
@@ -377,7 +377,7 @@ int xt_compat_match_to_user(struct xt_entry_match *m, void __user **dstptr,
 
        if (copy_to_user(cm, m, sizeof(*cm)) ||
            put_user(msize, &cm->u.user.match_size))
-               return -EFAULT;
+               return -EFAULT;
 
        if (match->compat_to_user) {
                if (match->compat_to_user((void __user *)cm->data, m->data))
@@ -432,7 +432,7 @@ int xt_compat_target_offset(struct xt_target *target)
 EXPORT_SYMBOL_GPL(xt_compat_target_offset);
 
 void xt_compat_target_from_user(struct xt_entry_target *t, void **dstptr,
-                               int *size)
+                               int *size)
 {
        struct xt_target *target = t->u.kernel.target;
        struct compat_xt_entry_target *ct = (struct compat_xt_entry_target *)t;
@@ -467,7 +467,7 @@ int xt_compat_target_to_user(struct xt_entry_target *t, void __user **dstptr,
 
        if (copy_to_user(ct, t, sizeof(*ct)) ||
            put_user(tsize, &ct->u.user.target_size))
-               return -EFAULT;
+               return -EFAULT;
 
        if (target->compat_to_user) {
                if (target->compat_to_user((void __user *)ct->data, t->data))
@@ -710,7 +710,7 @@ static void *xt_tgt_seq_start(struct seq_file *seq, loff_t *pos)
 
        if (mutex_lock_interruptible(&xt[af].mutex) != 0)
                return NULL;
-       
+
        return xt_get_idx(list, seq, *pos);
 }
 
@@ -723,7 +723,7 @@ static void *xt_tgt_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 
        if (af >= NPROTO)
                return NULL;
-       
+
        list = type2list(af, type);
        if (!list)
                return NULL;
@@ -772,7 +772,7 @@ static int xt_tgt_open(struct inode *inode, struct file *file)
        return ret;
 }
 
-static struct file_operations xt_file_ops = {
+static const struct file_operations xt_file_ops = {
        .owner   = THIS_MODULE,
        .open    = xt_tgt_open,
        .read    = seq_read,
index 195e92990da77a159fe32f7f2450d516b1cf9497..30884833e665b6d7cb721dcb1b4c6015418d84ec 100644 (file)
@@ -15,6 +15,8 @@
 #include <linux/ip.h>
 #include <net/checksum.h>
 
+#include <linux/netfilter_ipv4.h>
+#include <linux/netfilter_ipv6.h>
 #include <linux/netfilter/x_tables.h>
 #include <linux/netfilter/xt_CLASSIFY.h>
 
@@ -46,7 +48,7 @@ static struct xt_target xt_classify_target[] = {
                .table          = "mangle",
                .hooks          = (1 << NF_IP_LOCAL_OUT) |
                                  (1 << NF_IP_FORWARD) |
-                                 (1 << NF_IP_POST_ROUTING),
+                                 (1 << NF_IP_POST_ROUTING),
                .me             = THIS_MODULE,
        },
        {
@@ -55,9 +57,9 @@ static struct xt_target xt_classify_target[] = {
                .target         = target,
                .targetsize     = sizeof(struct xt_classify_target_info),
                .table          = "mangle",
-               .hooks          = (1 << NF_IP_LOCAL_OUT) |
-                                 (1 << NF_IP_FORWARD) |
-                                 (1 << NF_IP_POST_ROUTING),
+               .hooks          = (1 << NF_IP6_LOCAL_OUT) |
+                                 (1 << NF_IP6_FORWARD) |
+                                 (1 << NF_IP6_POST_ROUTING),
                .me             = THIS_MODULE,
        },
 };
index cfc45af357d50146034fcc052d48a7ba4eb8cf96..43817808d865daa2d85411c3df0a57710542f6f4 100644 (file)
@@ -50,11 +50,11 @@ target_v1(struct sk_buff **pskb,
        case XT_MARK_SET:
                mark = markinfo->mark;
                break;
-               
+
        case XT_MARK_AND:
                mark = (*pskb)->mark & markinfo->mark;
                break;
-               
+
        case XT_MARK_OR:
                mark = (*pskb)->mark | markinfo->mark;
                break;
index 39e117502bd7c821afc4c1adef330585bdedf2f2..201155b316e0a8452c0e986b309c70d8a1ef219e 100644 (file)
@@ -3,9 +3,9 @@
  * (C) 2005 by Harald Welte <laforge@netfilter.org>
  *
  * 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 
+ * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
- * 
+ *
  */
 
 #include <linux/module.h>
index 6d00dcaed2385b4dfddbcab61b37bef2a90d59ea..b874a2008b2b9371a1a647f78f22b5e8195a9eea 100644 (file)
@@ -22,8 +22,8 @@ target(struct sk_buff **pskb,
        if ((*pskb)->nfct != NULL)
                return XT_CONTINUE;
 
-       /* Attach fake conntrack entry. 
-          If there is a real ct entry correspondig to this packet, 
+       /* Attach fake conntrack entry.
+          If there is a real ct entry correspondig to this packet,
           it'll hang aroun till timing out. We don't deal with it
           for performance reasons. JK */
        nf_ct_untrack(*pskb);
index f1131c3a9db5bcfd174911b45336d7aa3052621a..705f0e830a79576d73529964523eb40bfc7f1c68 100644 (file)
@@ -55,7 +55,7 @@ static int checkentry_selinux(struct xt_secmark_target_info *info)
 {
        int err;
        struct xt_secmark_target_selinux_info *sel = &info->u.sel;
-       
+
        sel->selctx[SECMARK_SELCTX_MAX - 1] = '\0';
 
        err = selinux_string_to_sid(sel->selctx, &sel->selsid);
index 3dc2357b8de88dd163e62a18a90d17bee52db27e..2885c378288eec8e937cac7998434141b3a3f27e 100644 (file)
@@ -51,10 +51,10 @@ match(const struct sk_buff *skb,
        if (ct == &ip_conntrack_untracked)
                statebit = XT_CONNTRACK_STATE_UNTRACKED;
        else if (ct)
-               statebit = XT_CONNTRACK_STATE_BIT(ctinfo);
-       else
-               statebit = XT_CONNTRACK_STATE_INVALID;
+               statebit = XT_CONNTRACK_STATE_BIT(ctinfo);
+       else
+               statebit = XT_CONNTRACK_STATE_INVALID;
+
        if (sinfo->flags & XT_CONNTRACK_STATE) {
                if (ct) {
                        if (test_bit(IPS_SRC_NAT_BIT, &ct->status))
@@ -77,7 +77,7 @@ match(const struct sk_buff *skb,
            FWINV(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum !=
                  sinfo->tuple[IP_CT_DIR_ORIGINAL].dst.protonum,
                  XT_CONNTRACK_PROTO))
-                return 0;
+               return 0;
 
        if (sinfo->flags & XT_CONNTRACK_ORIGSRC &&
            FWINV((ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.ip &
@@ -147,10 +147,10 @@ match(const struct sk_buff *skb,
        if (ct == &nf_conntrack_untracked)
                statebit = XT_CONNTRACK_STATE_UNTRACKED;
        else if (ct)
-               statebit = XT_CONNTRACK_STATE_BIT(ctinfo);
-       else
-               statebit = XT_CONNTRACK_STATE_INVALID;
+               statebit = XT_CONNTRACK_STATE_BIT(ctinfo);
+       else
+               statebit = XT_CONNTRACK_STATE_INVALID;
+
        if (sinfo->flags & XT_CONNTRACK_STATE) {
                if (ct) {
                        if (test_bit(IPS_SRC_NAT_BIT, &ct->status))
@@ -171,41 +171,41 @@ match(const struct sk_buff *skb,
 
        if (sinfo->flags & XT_CONNTRACK_PROTO &&
            FWINV(ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum !=
-                 sinfo->tuple[IP_CT_DIR_ORIGINAL].dst.protonum,
+                 sinfo->tuple[IP_CT_DIR_ORIGINAL].dst.protonum,
                  XT_CONNTRACK_PROTO))
-                return 0;
+               return 0;
 
        if (sinfo->flags & XT_CONNTRACK_ORIGSRC &&
            FWINV((ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3.ip &
-                  sinfo->sipmsk[IP_CT_DIR_ORIGINAL].s_addr) !=
+                  sinfo->sipmsk[IP_CT_DIR_ORIGINAL].s_addr) !=
                  sinfo->tuple[IP_CT_DIR_ORIGINAL].src.ip,
                  XT_CONNTRACK_ORIGSRC))
                return 0;
 
        if (sinfo->flags & XT_CONNTRACK_ORIGDST &&
            FWINV((ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.u3.ip &
-                  sinfo->dipmsk[IP_CT_DIR_ORIGINAL].s_addr) !=
+                  sinfo->dipmsk[IP_CT_DIR_ORIGINAL].s_addr) !=
                  sinfo->tuple[IP_CT_DIR_ORIGINAL].dst.ip,
                  XT_CONNTRACK_ORIGDST))
                return 0;
 
        if (sinfo->flags & XT_CONNTRACK_REPLSRC &&
            FWINV((ct->tuplehash[IP_CT_DIR_REPLY].tuple.src.u3.ip &
-                  sinfo->sipmsk[IP_CT_DIR_REPLY].s_addr) !=
+                  sinfo->sipmsk[IP_CT_DIR_REPLY].s_addr) !=
                  sinfo->tuple[IP_CT_DIR_REPLY].src.ip,
                  XT_CONNTRACK_REPLSRC))
                return 0;
 
        if (sinfo->flags & XT_CONNTRACK_REPLDST &&
            FWINV((ct->tuplehash[IP_CT_DIR_REPLY].tuple.dst.u3.ip &
-                  sinfo->dipmsk[IP_CT_DIR_REPLY].s_addr) !=
+                  sinfo->dipmsk[IP_CT_DIR_REPLY].s_addr) !=
                  sinfo->tuple[IP_CT_DIR_REPLY].dst.ip,
                  XT_CONNTRACK_REPLDST))
                return 0;
 
        if (sinfo->flags & XT_CONNTRACK_STATUS &&
            FWINV((ct->status & sinfo->statusmask) == 0,
-                 XT_CONNTRACK_STATUS))
+                 XT_CONNTRACK_STATUS))
                return 0;
 
        if(sinfo->flags & XT_CONNTRACK_EXPIRES) {
index 3e6cf430e518ee8a8a843016a54a50d8dca886df..2c9c0dee8aaf1ea5e5f541748570a1202d0c25ad 100644 (file)
@@ -26,7 +26,7 @@ MODULE_DESCRIPTION("Match for DCCP protocol packets");
 MODULE_ALIAS("ipt_dccp");
 
 #define DCCHECK(cond, option, flag, invflag) (!((flag) & (option)) \
-                                 || (!!((invflag) & (option)) ^ (cond)))
+                                 || (!!((invflag) & (option)) ^ (cond)))
 
 static unsigned char *dccp_optbuf;
 static DEFINE_SPINLOCK(dccp_buflock);
@@ -67,9 +67,9 @@ dccp_find_option(u_int8_t option,
                        return 1;
                }
 
-               if (op[i] < 2) 
+               if (op[i] < 2)
                        i++;
-               else 
+               else
                        i += op[i+1]?:1;
        }
 
@@ -106,18 +106,18 @@ match(const struct sk_buff *skb,
 
        if (offset)
                return 0;
-       
+
        dh = skb_header_pointer(skb, protoff, sizeof(_dh), &_dh);
        if (dh == NULL) {
                *hotdrop = 1;
                return 0;
-               }
+       }
 
-       return  DCCHECK(((ntohs(dh->dccph_sport) >= info->spts[0]) 
-                       && (ntohs(dh->dccph_sport) <= info->spts[1])), 
-                       XT_DCCP_SRC_PORTS, info->flags, info->invflags)
-               && DCCHECK(((ntohs(dh->dccph_dport) >= info->dpts[0]) 
-                       && (ntohs(dh->dccph_dport) <= info->dpts[1])), 
+       return  DCCHECK(((ntohs(dh->dccph_sport) >= info->spts[0])
+                       && (ntohs(dh->dccph_sport) <= info->spts[1])),
+                       XT_DCCP_SRC_PORTS, info->flags, info->invflags)
+               && DCCHECK(((ntohs(dh->dccph_dport) >= info->dpts[0])
+                       && (ntohs(dh->dccph_dport) <= info->dpts[1])),
                        XT_DCCP_DEST_PORTS, info->flags, info->invflags)
                && DCCHECK(match_types(dh, info->typemask),
                           XT_DCCP_TYPE, info->flags, info->invflags)
index bd1f7a2048d6d8cca560e3cd714278530965b68f..9f37d593ca38a2badf2677cfa98753e6d84c2ea9 100644 (file)
@@ -37,7 +37,7 @@ MODULE_ALIAS("ip6t_hashlimit");
 /* need to declare this at the top */
 static struct proc_dir_entry *hashlimit_procdir4;
 static struct proc_dir_entry *hashlimit_procdir6;
-static struct file_operations dl_file_ops;
+static const struct file_operations dl_file_ops;
 
 /* hash table crap */
 struct dsthash_dst {
@@ -208,7 +208,7 @@ static int htable_create(struct xt_hashlimit_info *minfo, int family)
        spin_lock_init(&hinfo->lock);
        hinfo->pde = create_proc_entry(minfo->name, 0,
                                       family == AF_INET ? hashlimit_procdir4 :
-                                                          hashlimit_procdir6);
+                                                          hashlimit_procdir6);
        if (!hinfo->pde) {
                vfree(hinfo);
                return -1;
@@ -240,7 +240,7 @@ static int select_gc(struct xt_hashlimit_htable *ht, struct dsthash_ent *he)
 }
 
 static void htable_selective_cleanup(struct xt_hashlimit_htable *ht,
-                               int (*select)(struct xt_hashlimit_htable *ht,
+                               int (*select)(struct xt_hashlimit_htable *ht,
                                              struct dsthash_ent *he))
 {
        unsigned int i;
@@ -279,7 +279,7 @@ static void htable_destroy(struct xt_hashlimit_htable *hinfo)
        /* remove proc entry */
        remove_proc_entry(hinfo->pde->name,
                          hinfo->family == AF_INET ? hashlimit_procdir4 :
-                                                    hashlimit_procdir6);
+                                                    hashlimit_procdir6);
        htable_selective_cleanup(hinfo, select_all);
        vfree(hinfo);
 }
@@ -483,7 +483,7 @@ hashlimit_match(const struct sk_buff *skb,
                return 1;
        }
 
-               spin_unlock_bh(&hinfo->lock);
+       spin_unlock_bh(&hinfo->lock);
 
        /* default case: we're overlimit, thus don't match */
        return 0;
@@ -714,7 +714,7 @@ static int dl_proc_open(struct inode *inode, struct file *file)
        return ret;
 }
 
-static struct file_operations dl_file_ops = {
+static const struct file_operations dl_file_ops = {
        .owner   = THIS_MODULE,
        .open    = dl_proc_open,
        .read    = seq_read,
index 04bc32ba719566651a8fc1c23c1498bca02da6ca..407d1d5da8a1740329b1964433ffca5f1fe3d971 100644 (file)
@@ -53,7 +53,7 @@ match(const struct sk_buff *skb,
        struct ip_conntrack *ct;
        enum ip_conntrack_info ctinfo;
        int ret = info->invert;
-       
+
        ct = ip_conntrack_get((struct sk_buff *)skb, &ctinfo);
        if (!ct) {
                DEBUGP("xt_helper: Eek! invalid conntrack?\n");
@@ -67,19 +67,19 @@ match(const struct sk_buff *skb,
 
        read_lock_bh(&ip_conntrack_lock);
        if (!ct->master->helper) {
-               DEBUGP("xt_helper: master ct %p has no helper\n", 
+               DEBUGP("xt_helper: master ct %p has no helper\n",
                        exp->expectant);
                goto out_unlock;
        }
 
-       DEBUGP("master's name = %s , info->name = %s\n", 
+       DEBUGP("master's name = %s , info->name = %s\n",
                ct->master->helper->name, info->name);
 
        if (info->name[0] == '\0')
                ret ^= 1;
        else
-               ret ^= !strncmp(ct->master->helper->name, info->name, 
-                               strlen(ct->master->helper->name));
+               ret ^= !strncmp(ct->master->helper->name, info->name,
+                               strlen(ct->master->helper->name));
 out_unlock:
        read_unlock_bh(&ip_conntrack_lock);
        return ret;
@@ -102,7 +102,7 @@ match(const struct sk_buff *skb,
        struct nf_conn_help *master_help;
        enum ip_conntrack_info ctinfo;
        int ret = info->invert;
-       
+
        ct = nf_ct_get((struct sk_buff *)skb, &ctinfo);
        if (!ct) {
                DEBUGP("xt_helper: Eek! invalid conntrack?\n");
@@ -117,19 +117,19 @@ match(const struct sk_buff *skb,
        read_lock_bh(&nf_conntrack_lock);
        master_help = nfct_help(ct->master);
        if (!master_help || !master_help->helper) {
-               DEBUGP("xt_helper: master ct %p has no helper\n", 
+               DEBUGP("xt_helper: master ct %p has no helper\n",
                        exp->expectant);
                goto out_unlock;
        }
 
-       DEBUGP("master's name = %s , info->name = %s\n", 
+       DEBUGP("master's name = %s , info->name = %s\n",
                ct->master->helper->name, info->name);
 
        if (info->name[0] == '\0')
                ret ^= 1;
        else
                ret ^= !strncmp(master_help->helper->name, info->name,
-                               strlen(master_help->helper->name));
+                               strlen(master_help->helper->name));
 out_unlock:
        read_unlock_bh(&nf_conntrack_lock);
        return ret;
index 67fd30d9f303232bfd64bfda54c0e7746b2adc47..32fb998d9bac6e49f2d237afc3d10291f38c2224 100644 (file)
@@ -32,7 +32,7 @@ match(const struct sk_buff *skb,
 {
        const struct xt_length_info *info = matchinfo;
        u_int16_t pktlen = ntohs(skb->nh.iph->tot_len);
-       
+
        return (pktlen >= info->min && pktlen <= info->max) ^ info->invert;
 }
 
@@ -48,7 +48,7 @@ match6(const struct sk_buff *skb,
 {
        const struct xt_length_info *info = matchinfo;
        u_int16_t pktlen = ntohs(skb->nh.ipv6h->payload_len) + sizeof(struct ipv6hdr);
-       
+
        return (pktlen >= info->min && pktlen <= info->max) ^ info->invert;
 }
 
index fda7b7dec27d26404e08a79851e7fa052c63a021..6fd8347c0058f410531cf14a052f47f3a274ccc4 100644 (file)
@@ -89,7 +89,7 @@ ipt_limit_match(const struct sk_buff *skb,
                return 1;
        }
 
-               spin_unlock_bh(&limit_lock);
+       spin_unlock_bh(&limit_lock);
        return 0;
 }
 
index 425fc21e31f54f95013382007075c12d35f8a709..d430d90d7b2609256f3587f3a1bfda34490f2016 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/etherdevice.h>
 
 #include <linux/netfilter_ipv4.h>
+#include <linux/netfilter_ipv6.h>
 #include <linux/netfilter/xt_mac.h>
 #include <linux/netfilter/x_tables.h>
 
@@ -59,9 +60,9 @@ static struct xt_match xt_mac_match[] = {
                .family         = AF_INET6,
                .match          = match,
                .matchsize      = sizeof(struct xt_mac_info),
-               .hooks          = (1 << NF_IP_PRE_ROUTING) |
-                                 (1 << NF_IP_LOCAL_IN) |
-                                 (1 << NF_IP_FORWARD),
+               .hooks          = (1 << NF_IP6_PRE_ROUTING) |
+                                 (1 << NF_IP6_LOCAL_IN) |
+                                 (1 << NF_IP6_FORWARD),
                .me             = THIS_MODULE,
        },
 };
index dfa1ee6914c08eb6cfbc0da6ebcb77f35d38f9fb..39911dddb01103e95389c13ba9d328117702e06b 100644 (file)
@@ -36,10 +36,10 @@ match(const struct sk_buff *skb,
 
 static int
 checkentry(const char *tablename,
-           const void *entry,
+          const void *entry,
           const struct xt_match *match,
-           void *matchinfo,
-           unsigned int hook_mask)
+          void *matchinfo,
+          unsigned int hook_mask)
 {
        const struct xt_mark_info *minfo = matchinfo;
 
index 1602086c7fd612e27429b71d10c9ad4e9823c3af..4dce2a81702afa0151a2fd8363d3b3d5ae586b73 100644 (file)
@@ -91,7 +91,7 @@ ports_match_v1(const struct xt_multiport_v1 *minfo,
                }
        }
 
-       return minfo->invert;
+       return minfo->invert;
 }
 
 static int
index b9b3ffc5451dc2138e035b7a7d4fd7428d9b94c5..35a0fe200c397c509d256dddd23cc8d57e3d3338 100644 (file)
@@ -117,7 +117,7 @@ checkentry(const char *tablename,
            (!(info->bitmask & XT_PHYSDEV_OP_BRIDGED) ||
             info->invert & XT_PHYSDEV_OP_BRIDGED) &&
            hook_mask & ((1 << NF_IP_LOCAL_OUT) | (1 << NF_IP_FORWARD) |
-                        (1 << NF_IP_POST_ROUTING))) {
+                        (1 << NF_IP_POST_ROUTING))) {
                printk(KERN_WARNING "physdev match: using --physdev-out in the "
                       "OUTPUT, FORWARD and POSTROUTING chains for non-bridged "
                       "traffic is not supported anymore.\n");
index 46bde2b1e1e0feec6bfede6622060afe6d4d931a..15b45a95ec13b2711a52ad1a00029279b4946b4a 100644 (file)
@@ -109,13 +109,13 @@ match_policy_out(const struct sk_buff *skb, const struct xt_policy_info *info,
 }
 
 static int match(const struct sk_buff *skb,
-                 const struct net_device *in,
-                 const struct net_device *out,
-                 const struct xt_match *match,
-                 const void *matchinfo,
-                 int offset,
-                 unsigned int protoff,
-                 int *hotdrop)
+                const struct net_device *in,
+                const struct net_device *out,
+                const struct xt_match *match,
+                const void *matchinfo,
+                int offset,
+                unsigned int protoff,
+                int *hotdrop)
 {
        const struct xt_policy_info *info = matchinfo;
        int ret;
@@ -134,27 +134,27 @@ static int match(const struct sk_buff *skb,
 }
 
 static int checkentry(const char *tablename, const void *ip_void,
-                      const struct xt_match *match,
-                      void *matchinfo, unsigned int hook_mask)
+                     const struct xt_match *match,
+                     void *matchinfo, unsigned int hook_mask)
 {
        struct xt_policy_info *info = matchinfo;
 
        if (!(info->flags & (XT_POLICY_MATCH_IN|XT_POLICY_MATCH_OUT))) {
                printk(KERN_ERR "xt_policy: neither incoming nor "
-                               "outgoing policy selected\n");
+                               "outgoing policy selected\n");
                return 0;
        }
        /* hook values are equal for IPv4 and IPv6 */
        if (hook_mask & (1 << NF_IP_PRE_ROUTING | 1 << NF_IP_LOCAL_IN)
            && info->flags & XT_POLICY_MATCH_OUT) {
                printk(KERN_ERR "xt_policy: output policy not valid in "
-                               "PRE_ROUTING and INPUT\n");
+                               "PRE_ROUTING and INPUT\n");
                return 0;
        }
        if (hook_mask & (1 << NF_IP_POST_ROUTING | 1 << NF_IP_LOCAL_OUT)
            && info->flags & XT_POLICY_MATCH_IN) {
                printk(KERN_ERR "xt_policy: input policy not valid in "
-                               "POST_ROUTING and OUTPUT\n");
+                               "POST_ROUTING and OUTPUT\n");
                return 0;
        }
        if (info->len > XT_POLICY_MAX_ELEM) {
index b75fa2c70e6653426387563fc1dfe2c43e74b43d..bfdde06ca0b7dfe5ceec4fab5368e577543b0645 100644 (file)
@@ -30,8 +30,8 @@ match(const struct sk_buff *skb,
                q->quota -= skb->len;
                ret ^= 1;
        } else {
-               /* we do not allow even small packets from now on */
-               q->quota = 0;
+               /* we do not allow even small packets from now on */
+               q->quota = 0;
        }
        spin_unlock_bh(&quota_lock);
 
index a80b7d132b65fd7cf2460758f7bf007cbf54cad9..97ffc2fbc19d907a5f3fedc1f056d8714c51404f 100644 (file)
@@ -35,7 +35,7 @@ match(const struct sk_buff *skb,
 {
        const struct xt_realm_info *info = matchinfo;
        struct dst_entry *dst = skb->dst;
-    
+
        return (info->id == (dst->tclassid & info->mask)) ^ info->invert;
 }
 
index 71bf036f833c60ce433e0a20de3bd50561160aec..f86d8d769d478b636753d9a91c5faa7acd9c82ef 100644 (file)
@@ -66,9 +66,9 @@ match_packet(const struct sk_buff *skb,
                        duprintf("Dropping invalid SCTP packet.\n");
                        *hotdrop = 1;
                        return 0;
-               }
+               }
 
-               duprintf("Chunk num: %d\toffset: %d\ttype: %d\tlength: %d\tflags: %x\n", 
+               duprintf("Chunk num: %d\toffset: %d\ttype: %d\tlength: %d\tflags: %x\n",
                                ++i, offset, sch->type, htons(sch->length), sch->flags);
 
                offset += (ntohs(sch->length) + 3) & ~3;
@@ -78,21 +78,21 @@ match_packet(const struct sk_buff *skb,
                if (SCTP_CHUNKMAP_IS_SET(chunkmap, sch->type)) {
                        switch (chunk_match_type) {
                        case SCTP_CHUNK_MATCH_ANY:
-                               if (match_flags(flag_info, flag_count, 
+                               if (match_flags(flag_info, flag_count,
                                        sch->type, sch->flags)) {
                                        return 1;
                                }
                                break;
 
                        case SCTP_CHUNK_MATCH_ALL:
-                               if (match_flags(flag_info, flag_count, 
+                               if (match_flags(flag_info, flag_count,
                                        sch->type, sch->flags)) {
                                        SCTP_CHUNKMAP_CLEAR(chunkmapcopy, sch->type);
                                }
                                break;
 
                        case SCTP_CHUNK_MATCH_ONLY:
-                               if (!match_flags(flag_info, flag_count, 
+                               if (!match_flags(flag_info, flag_count,
                                        sch->type, sch->flags)) {
                                        return 0;
                                }
@@ -136,24 +136,24 @@ match(const struct sk_buff *skb,
                duprintf("Dropping non-first fragment.. FIXME\n");
                return 0;
        }
-       
+
        sh = skb_header_pointer(skb, protoff, sizeof(_sh), &_sh);
        if (sh == NULL) {
                duprintf("Dropping evil TCP offset=0 tinygram.\n");
                *hotdrop = 1;
                return 0;
-               }
+       }
        duprintf("spt: %d\tdpt: %d\n", ntohs(sh->source), ntohs(sh->dest));
 
-       return  SCCHECK(((ntohs(sh->source) >= info->spts[0]) 
-                       && (ntohs(sh->source) <= info->spts[1])), 
-                       XT_SCTP_SRC_PORTS, info->flags, info->invflags)
-               && SCCHECK(((ntohs(sh->dest) >= info->dpts[0]) 
-                       && (ntohs(sh->dest) <= info->dpts[1])), 
+       return  SCCHECK(((ntohs(sh->source) >= info->spts[0])
+                       && (ntohs(sh->source) <= info->spts[1])),
+                       XT_SCTP_SRC_PORTS, info->flags, info->invflags)
+               && SCCHECK(((ntohs(sh->dest) >= info->dpts[0])
+                       && (ntohs(sh->dest) <= info->dpts[1])),
                        XT_SCTP_DEST_PORTS, info->flags, info->invflags)
                && SCCHECK(match_packet(skb, protoff + sizeof (sctp_sctphdr_t),
                                        info->chunkmap, info->chunk_match_type,
-                                       info->flag_info, info->flag_count, 
+                                       info->flag_info, info->flag_count,
                                        hotdrop),
                           XT_SCTP_CHUNK_TYPES, info->flags, info->invflags);
 }
@@ -170,9 +170,9 @@ checkentry(const char *tablename,
        return !(info->flags & ~XT_SCTP_VALID_FLAGS)
                && !(info->invflags & ~XT_SCTP_VALID_FLAGS)
                && !(info->invflags & ~info->flags)
-               && ((!(info->flags & XT_SCTP_CHUNK_TYPES)) || 
+               && ((!(info->flags & XT_SCTP_CHUNK_TYPES)) ||
                        (info->chunk_match_type &
-                               (SCTP_CHUNK_MATCH_ALL 
+                               (SCTP_CHUNK_MATCH_ALL
                                | SCTP_CHUNK_MATCH_ANY
                                | SCTP_CHUNK_MATCH_ONLY)));
 }
index 4453252400aa22a4555e6b2bb2439d7e6204e53b..999a005dbd0cb5c73c0285f3241b03794f7a9418 100644 (file)
@@ -1,5 +1,5 @@
 /* String matching match for iptables
- * 
+ *
  * (C) 2005 Pablo Neira Ayuso <pablo@eurodev.net>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -35,8 +35,8 @@ static int match(const struct sk_buff *skb,
 
        memset(&state, 0, sizeof(struct ts_state));
 
-       return (skb_find_text((struct sk_buff *)skb, conf->from_offset, 
-                            conf->to_offset, conf->config, &state) 
+       return (skb_find_text((struct sk_buff *)skb, conf->from_offset,
+                            conf->to_offset, conf->config, &state)
                             != UINT_MAX) ^ conf->invert;
 }
 
@@ -55,7 +55,7 @@ static int checkentry(const char *tablename,
        if (conf->from_offset > conf->to_offset)
                return 0;
        if (conf->algo[XT_STRING_MAX_ALGO_NAME_SIZE - 1] != '\0')
-               return 0;
+               return 0;
        if (conf->patlen > XT_STRING_MAX_PATTERN_SIZE)
                return 0;
        ts_conf = textsearch_prepare(conf->algo, conf->pattern, conf->patlen,
index a3682fe2f1926268cd7cb5269c27d149c23bb108..80571d0749f7ad5375505bc8f3ec89ab1bfaea6e 100644 (file)
@@ -64,9 +64,9 @@ match(const struct sk_buff *skb,
                        u_int16_t mssval;
 
                        mssval = (op[i+2] << 8) | op[i+3];
-                       
+
                        return (mssval >= info->mss_min &&
-                               mssval <= info->mss_max) ^ info->invert;
+                               mssval <= info->mss_max) ^ info->invert;
                }
                if (op[i] < 2)
                        i++;
index 73e0ff469bff284c765bc80ebcc723af3e81f38e..07e47dbcb0a9cd1fa455ef8b7f7d60c19ac33971 100644 (file)
@@ -292,7 +292,7 @@ static int netlbl_cipsov4_add_std(struct genl_info *info)
                                        }
                        }
                doi_def->map.std->cat.local = kcalloc(
-                                             doi_def->map.std->cat.local_size,
+                                             doi_def->map.std->cat.local_size,
                                              sizeof(u32),
                                              GFP_KERNEL);
                if (doi_def->map.std->cat.local == NULL) {
@@ -300,7 +300,7 @@ static int netlbl_cipsov4_add_std(struct genl_info *info)
                        goto add_std_failure;
                }
                doi_def->map.std->cat.cipso = kcalloc(
-                                             doi_def->map.std->cat.cipso_size,
+                                             doi_def->map.std->cat.cipso_size,
                                              sizeof(u32),
                                              GFP_KERNEL);
                if (doi_def->map.std->cat.cipso == NULL) {
@@ -325,10 +325,10 @@ static int netlbl_cipsov4_add_std(struct genl_info *info)
                                if (cat_loc == NULL || cat_rem == NULL)
                                        goto add_std_failure;
                                doi_def->map.std->cat.local[
-                                                       nla_get_u32(cat_loc)] =
+                                                       nla_get_u32(cat_loc)] =
                                        nla_get_u32(cat_rem);
                                doi_def->map.std->cat.cipso[
-                                                       nla_get_u32(cat_rem)] =
+                                                       nla_get_u32(cat_rem)] =
                                        nla_get_u32(cat_loc);
                        }
        }
index 383dd4e82ee150fc33a3a8b726c0d5e02ff7f4b8..e73d8f546c6bf075d4a4d7c591b1258e5c571408 100644 (file)
@@ -8,7 +8,7 @@
  *             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.
- * 
+ *
  * Tue Jun 26 14:36:48 MEST 2001 Herbert "herp" Rosmanith
  *                               added netlink_proto_exit
  * Tue Jan 22 18:32:44 BRST 2002 Arnaldo C. de Melo <acme@conectiva.com.br>
@@ -470,7 +470,7 @@ static int netlink_release(struct socket *sock)
                                          };
                atomic_notifier_call_chain(&netlink_chain,
                                NETLINK_URELEASE, &n);
-       }       
+       }
 
        module_put(nlk->module);
 
@@ -528,11 +528,11 @@ retry:
        return err;
 }
 
-static inline int netlink_capable(struct socket *sock, unsigned int flag) 
-{ 
+static inline int netlink_capable(struct socket *sock, unsigned int flag)
+{
        return (nl_table[sock->sk->sk_protocol].nl_nonroot & flag) ||
               capable(CAP_NET_ADMIN);
-} 
+}
 
 static void
 netlink_update_subscriptions(struct sock *sk, unsigned int subscriptions)
@@ -574,7 +574,7 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr, int addr_len
        struct netlink_sock *nlk = nlk_sk(sk);
        struct sockaddr_nl *nladdr = (struct sockaddr_nl *)addr;
        int err;
-       
+
        if (nladdr->nl_family != AF_NETLINK)
                return -EINVAL;
 
@@ -605,9 +605,9 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr, int addr_len
 
        netlink_table_grab();
        netlink_update_subscriptions(sk, nlk->subscriptions +
-                                        hweight32(nladdr->nl_groups) -
-                                        hweight32(nlk->groups[0]));
-       nlk->groups[0] = (nlk->groups[0] & ~0xffffffffUL) | nladdr->nl_groups; 
+                                        hweight32(nladdr->nl_groups) -
+                                        hweight32(nlk->groups[0]));
+       nlk->groups[0] = (nlk->groups[0] & ~0xffffffffUL) | nladdr->nl_groups;
        netlink_update_listeners(sk);
        netlink_table_ungrab();
 
@@ -652,7 +652,7 @@ static int netlink_getname(struct socket *sock, struct sockaddr *addr, int *addr
        struct sock *sk = sock->sk;
        struct netlink_sock *nlk = nlk_sk(sk);
        struct sockaddr_nl *nladdr=(struct sockaddr_nl *)addr;
-       
+
        nladdr->nl_family = AF_NETLINK;
        nladdr->nl_pad = 0;
        *addr_len = sizeof(*nladdr);
@@ -999,7 +999,7 @@ void netlink_set_err(struct sock *ssk, u32 pid, u32 group, int code)
 }
 
 static int netlink_setsockopt(struct socket *sock, int level, int optname,
-                              char __user *optval, int optlen)
+                             char __user *optval, int optlen)
 {
        struct sock *sk = sock->sk;
        struct netlink_sock *nlk = nlk_sk(sk);
@@ -1054,7 +1054,7 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname,
 }
 
 static int netlink_getsockopt(struct socket *sock, int level, int optname,
-                              char __user *optval, int __user *optlen)
+                             char __user *optval, int __user *optlen)
 {
        struct sock *sk = sock->sk;
        struct netlink_sock *nlk = nlk_sk(sk);
@@ -1257,15 +1257,15 @@ static void netlink_data_ready(struct sock *sk, int len)
 }
 
 /*
- *     We export these functions to other modules. They provide a 
+ *     We export these functions to other modules. They provide a
  *     complete set of kernel non-blocking support for message
  *     queueing.
  */
 
 struct sock *
 netlink_kernel_create(int unit, unsigned int groups,
-                      void (*input)(struct sock *sk, int len),
-                      struct module *module)
+                     void (*input)(struct sock *sk, int len),
+                     struct module *module)
 {
        struct socket *sock;
        struct sock *sk;
@@ -1317,10 +1317,10 @@ out_sock_release:
 }
 
 void netlink_set_nonroot(int protocol, unsigned int flags)
-{ 
-       if ((unsigned int)protocol < MAX_LINKS) 
+{
+       if ((unsigned int)protocol < MAX_LINKS)
                nl_table[protocol].nl_nonroot = flags;
-} 
+}
 
 static void netlink_destroy_callback(struct netlink_callback *cb)
 {
@@ -1341,7 +1341,7 @@ static int netlink_dump(struct sock *sk)
        struct sk_buff *skb;
        struct nlmsghdr *nlh;
        int len, err = -ENOBUFS;
-       
+
        skb = sock_rmalloc(sk, NLMSG_GOODSIZE, 0, GFP_KERNEL);
        if (!skb)
                goto errout;
@@ -1626,7 +1626,7 @@ static void *netlink_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 
        if (v == SEQ_START_TOKEN)
                return netlink_seq_socket_idx(seq, 0);
-               
+
        s = sk_next(v);
        if (s)
                return s;
@@ -1713,7 +1713,7 @@ static int netlink_seq_open(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations netlink_seq_fops = {
+static const struct file_operations netlink_seq_fops = {
        .owner          = THIS_MODULE,
        .open           = netlink_seq_open,
        .read           = seq_read,
@@ -1732,7 +1732,7 @@ int netlink_unregister_notifier(struct notifier_block *nb)
 {
        return atomic_notifier_chain_unregister(&netlink_chain, nb);
 }
-                
+
 static const struct proto_ops netlink_ops = {
        .family =       PF_NETLINK,
        .owner =        THIS_MODULE,
@@ -1808,7 +1808,7 @@ static int __init netlink_proto_init(void)
 #ifdef CONFIG_PROC_FS
        proc_net_fops_create("netlink", 0, &netlink_seq_fops);
 #endif
-       /* The netlink device handler may be needed early. */ 
+       /* The netlink device handler may be needed early. */
        rtnetlink_init();
 out:
        return err;
index 548e4e6e698f041f3802a28339b4ed69ba971b7c..c2996794eb25c0c939dcd52ae594e0727322e654 100644 (file)
@@ -310,7 +310,7 @@ static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh,
        if (nlh->nlmsg_type < NLMSG_MIN_TYPE)
                goto ignore;
 
-               family = genl_family_find_byid(nlh->nlmsg_type);
+       family = genl_family_find_byid(nlh->nlmsg_type);
        if (family == NULL) {
                err = -ENOENT;
                goto errout;
index 43bbe2c9e49aa48f8b8995e857945f440dc98acd..bf9837dd95c4505642b99f93e9b96403d055685e 100644 (file)
@@ -110,7 +110,7 @@ static int nr_device_event(struct notifier_block *this, unsigned long event, voi
 
        nr_kill_by_device(dev);
        nr_rt_device_down(dev);
-       
+
        return NOTIFY_DONE;
 }
 
@@ -137,7 +137,7 @@ static struct sock *nr_find_listener(ax25_address *addr)
        sk_for_each(s, node, &nr_list)
                if (!ax25cmp(&nr_sk(s)->source_addr, addr) &&
                    s->sk_state == TCP_LISTEN) {
-                       bh_lock_sock(s);
+                       bh_lock_sock(s);
                        goto found;
                }
        s = NULL;
@@ -157,7 +157,7 @@ static struct sock *nr_find_socket(unsigned char index, unsigned char id)
        spin_lock_bh(&nr_list_lock);
        sk_for_each(s, node, &nr_list) {
                struct nr_sock *nr = nr_sk(s);
-               
+
                if (nr->my_index == index && nr->my_id == id) {
                        bh_lock_sock(s);
                        goto found;
@@ -181,10 +181,10 @@ static struct sock *nr_find_peer(unsigned char index, unsigned char id,
        spin_lock_bh(&nr_list_lock);
        sk_for_each(s, node, &nr_list) {
                struct nr_sock *nr = nr_sk(s);
-               
+
                if (nr->your_index == index && nr->your_id == id &&
                    !ax25cmp(&nr->dest_addr, dest)) {
-                       bh_lock_sock(s);
+                       bh_lock_sock(s);
                        goto found;
                }
        }
@@ -341,17 +341,17 @@ static int nr_getsockopt(struct socket *sock, int level, int optname,
        struct sock *sk = sock->sk;
        struct nr_sock *nr = nr_sk(sk);
        int val = 0;
-       int len; 
+       int len;
 
        if (level != SOL_NETROM)
                return -ENOPROTOOPT;
-       
+
        if (get_user(len, optlen))
                return -EFAULT;
 
        if (len < 0)
                return -EINVAL;
-               
+
        switch (optname) {
        case NETROM_T1:
                val = nr->t1 / HZ;
@@ -537,7 +537,7 @@ static int nr_release(struct socket *sock)
                break;
        }
 
-       sock->sk   = NULL;      
+       sock->sk   = NULL;
        release_sock(sk);
        sock_put(sk);
 
@@ -644,7 +644,7 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
                return -EISCONN;        /* No reconnect on a seqpacket socket */
        }
 
-       sk->sk_state   = TCP_CLOSE;     
+       sk->sk_state   = TCP_CLOSE;
        sock->state = SS_UNCONNECTED;
 
        if (addr_len != sizeof(struct sockaddr_ax25) && addr_len != sizeof(struct full_sockaddr_ax25)) {
@@ -710,7 +710,7 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
                release_sock(sk);
                return -EINPROGRESS;
        }
-               
+
        /*
         * A Connect Ack with Choke or timeout or failed routing will go to
         * closed.
@@ -848,7 +848,7 @@ static int nr_getname(struct socket *sock, struct sockaddr *uaddr,
 int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
 {
        struct sock *sk;
-       struct sock *make;      
+       struct sock *make;
        struct nr_sock *nr_make;
        ax25_address *src, *dest, *user;
        unsigned short circuit_index, circuit_id;
@@ -1258,10 +1258,10 @@ static void *nr_info_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        ++*pos;
 
-       return (v == SEQ_START_TOKEN) ? sk_head(&nr_list) 
+       return (v == SEQ_START_TOKEN) ? sk_head(&nr_list)
                : sk_next((struct sock *)v);
 }
-       
+
 static void nr_info_stop(struct seq_file *seq, void *v)
 {
        spin_unlock_bh(&nr_list_lock);
@@ -1291,7 +1291,7 @@ static int nr_info_show(struct seq_file *seq, void *v)
 
                seq_printf(seq, "%-9s ", ax2asc(buf, &nr->user_addr));
                seq_printf(seq, "%-9s ", ax2asc(buf, &nr->dest_addr));
-               seq_printf(seq, 
+               seq_printf(seq,
 "%-9s %-3s  %02X/%02X %02X/%02X %2d %3d %3d %3d %3lu/%03lu %2lu/%02lu %3lu/%03lu %3lu/%03lu %2d/%02d %3d %5d %5d %ld\n",
                        ax2asc(buf, &nr->source_addr),
                        devname,
@@ -1329,13 +1329,13 @@ static struct seq_operations nr_info_seqops = {
        .stop = nr_info_stop,
        .show = nr_info_show,
 };
+
 static int nr_info_open(struct inode *inode, struct file *file)
 {
        return seq_open(file, &nr_info_seqops);
 }
-static struct file_operations nr_info_fops = {
+
+static const struct file_operations nr_info_fops = {
        .owner = THIS_MODULE,
        .open = nr_info_open,
        .read = seq_read,
@@ -1415,7 +1415,7 @@ static int __init nr_proto_init(void)
                        printk(KERN_ERR "NET/ROM: nr_proto_init - unable to allocate device structure\n");
                        goto fail;
                }
-               
+
                dev->base_addr = i;
                if (register_netdev(dev)) {
                        printk(KERN_ERR "NET/ROM: nr_proto_init - unable to register network device\n");
@@ -1430,7 +1430,7 @@ static int __init nr_proto_init(void)
                printk(KERN_ERR "NET/ROM: nr_proto_init - unable to register socket family\n");
                goto fail;
        }
-               
+
        register_netdevice_notifier(&nr_dev_notifier);
 
        ax25_register_pid(&nr_pid);
index 4700d5225b78f59aff3b5f8154064bf4d06a7ebd..9a97ed6e6910d656b1a2a0c505f7238b51484db3 100644 (file)
@@ -9,7 +9,6 @@
 #include <linux/module.h>
 #include <linux/proc_fs.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/fs.h>
 #include <linux/types.h>
index a7d88b5ad756a85731d97feec43a58193129367c..5560acbaaa9548d78feabbd877370b1fb214a2c7 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
index 7939ded9c98ccc85a48053db5deab178d9e14de5..0cbfb611465b3a6f9580b2bc22b6680901267faf 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
index 8f88964099ef05744db60430922c2e538ebffcc5..8e6bd4e9d82c76e929ce1648c51456ce9da6e60f 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
@@ -781,8 +780,8 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
 
        if (ax25 != NULL) {
                ret = nr_add_node(nr_src, "", &ax25->dest_addr, ax25->digipeat,
-                                 ax25->ax25_dev->dev, 0,
-                                 sysctl_netrom_obsolescence_count_initialiser);
+                                 ax25->ax25_dev->dev, 0,
+                                 sysctl_netrom_obsolescence_count_initialiser);
                if (ret)
                        return ret;
        }
@@ -861,8 +860,8 @@ static void *nr_node_start(struct seq_file *seq, loff_t *pos)
        struct nr_node *nr_node;
        struct hlist_node *node;
        int i = 1;
-       spin_lock_bh(&nr_node_list_lock);
+
+       spin_lock_bh(&nr_node_list_lock);
        if (*pos == 0)
                return SEQ_START_TOKEN;
 
@@ -879,8 +878,8 @@ static void *nr_node_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        struct hlist_node *node;
        ++*pos;
-       
-       node = (v == SEQ_START_TOKEN)  
+
+       node = (v == SEQ_START_TOKEN)
                ? nr_node_list.first
                : ((struct nr_node *)v)->node_node.next;
 
@@ -934,7 +933,7 @@ static int nr_node_info_open(struct inode *inode, struct file *file)
        return seq_open(file, &nr_node_seqops);
 }
 
-struct file_operations nr_nodes_fops = {
+const struct file_operations nr_nodes_fops = {
        .owner = THIS_MODULE,
        .open = nr_node_info_open,
        .read = seq_read,
@@ -963,8 +962,8 @@ static void *nr_neigh_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        struct hlist_node *node;
        ++*pos;
-       
-       node = (v == SEQ_START_TOKEN)  
+
+       node = (v == SEQ_START_TOKEN)
                ? nr_neigh_list.first
                : ((struct nr_neigh *)v)->neigh_node.next;
 
@@ -997,7 +996,7 @@ static int nr_neigh_show(struct seq_file *seq, void *v)
 
                if (nr_neigh->digipeat != NULL) {
                        for (i = 0; i < nr_neigh->digipeat->ndigi; i++)
-                               seq_printf(seq, " %s", 
+                               seq_printf(seq, " %s",
                                           ax2asc(buf, &nr_neigh->digipeat->calls[i]));
                }
 
@@ -1018,7 +1017,7 @@ static int nr_neigh_info_open(struct inode *inode, struct file *file)
        return seq_open(file, &nr_neigh_seqops);
 }
 
-struct file_operations nr_neigh_fops = {
+const struct file_operations nr_neigh_fops = {
        .owner = THIS_MODULE,
        .open = nr_neigh_info_open,
        .read = seq_read,
index bcb9946b4f5628f59276cfed1082c33135d95119..07b694d1887079280147030d46aa0360063647ff 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
@@ -57,7 +56,7 @@ void nr_frames_acked(struct sock *sk, unsigned short nr)
         */
        if (nrom->va != nr) {
                while (skb_peek(&nrom->ack_queue) != NULL && nrom->va != nr) {
-                       skb = skb_dequeue(&nrom->ack_queue);
+                       skb = skb_dequeue(&nrom->ack_queue);
                        kfree_skb(skb);
                        nrom->va = (nrom->va + 1) % NR_MODULUS;
                }
index ddba1c144260d4b6adfe1b288c9a68739d551b31..6cfaad952c6cdcbd36e5991355b1673f7394d211 100644 (file)
@@ -43,7 +43,7 @@ void nr_init_timers(struct sock *sk)
        init_timer(&nr->t1timer);
        nr->t1timer.data     = (unsigned long)sk;
        nr->t1timer.function = &nr_t1timer_expiry;
-       
+
        init_timer(&nr->t2timer);
        nr->t2timer.data     = (unsigned long)sk;
        nr->t2timer.function = &nr_t2timer_expiry;
index 6bb8dda849dc71d1de1bd13ca8942eb6d607316f..2ea68da01fb836bf8f8ae5fa4b70c13686df12e7 100644 (file)
@@ -35,7 +35,7 @@ static int min_reset[]   = {0}, max_reset[]   = {1};
 static struct ctl_table_header *nr_table_header;
 
 static ctl_table nr_table[] = {
-        {
+       {
                .ctl_name       = NET_NETROM_DEFAULT_PATH_QUALITY,
                .procname       = "default_path_quality",
                .data           = &sysctl_netrom_default_path_quality,
@@ -46,18 +46,18 @@ static ctl_table nr_table[] = {
                .extra1         = &min_quality,
                .extra2         = &max_quality
        },
-        {
+       {
                .ctl_name       = NET_NETROM_OBSOLESCENCE_COUNT_INITIALISER,
                .procname       = "obsolescence_count_initialiser",
                .data           = &sysctl_netrom_obsolescence_count_initialiser,
                .maxlen         = sizeof(int),
                .mode           = 0644,
-               .proc_handler   = &proc_dointvec_minmax,
+               .proc_handler   = &proc_dointvec_minmax,
                .strategy       = &sysctl_intvec,
                .extra1         = &min_obs,
                .extra2         = &max_obs
        },
-        {
+       {
                .ctl_name       = NET_NETROM_NETWORK_TTL_INITIALISER,
                .procname       = "network_ttl_initialiser",
                .data           = &sysctl_netrom_network_ttl_initialiser,
@@ -68,7 +68,7 @@ static ctl_table nr_table[] = {
                .extra1         = &min_ttl,
                .extra2         = &max_ttl
        },
-        {
+       {
                .ctl_name       = NET_NETROM_TRANSPORT_TIMEOUT,
                .procname       = "transport_timeout",
                .data           = &sysctl_netrom_transport_timeout,
@@ -79,7 +79,7 @@ static ctl_table nr_table[] = {
                .extra1         = &min_t1,
                .extra2         = &max_t1
        },
-        {
+       {
                .ctl_name       = NET_NETROM_TRANSPORT_MAXIMUM_TRIES,
                .procname       = "transport_maximum_tries",
                .data           = &sysctl_netrom_transport_maximum_tries,
@@ -90,7 +90,7 @@ static ctl_table nr_table[] = {
                .extra1         = &min_n2,
                .extra2         = &max_n2
        },
-        {
+       {
                .ctl_name       = NET_NETROM_TRANSPORT_ACKNOWLEDGE_DELAY,
                .procname       = "transport_acknowledge_delay",
                .data           = &sysctl_netrom_transport_acknowledge_delay,
@@ -101,7 +101,7 @@ static ctl_table nr_table[] = {
                .extra1         = &min_t2,
                .extra2         = &max_t2
        },
-        {
+       {
                .ctl_name       = NET_NETROM_TRANSPORT_BUSY_DELAY,
                .procname       = "transport_busy_delay",
                .data           = &sysctl_netrom_transport_busy_delay,
@@ -112,7 +112,7 @@ static ctl_table nr_table[] = {
                .extra1         = &min_t4,
                .extra2         = &max_t4
        },
-        {
+       {
                .ctl_name       = NET_NETROM_TRANSPORT_REQUESTED_WINDOW_SIZE,
                .procname       = "transport_requested_window_size",
                .data           = &sysctl_netrom_transport_requested_window_size,
@@ -123,7 +123,7 @@ static ctl_table nr_table[] = {
                .extra1         = &min_window,
                .extra2         = &max_window
        },
-        {
+       {
                .ctl_name       = NET_NETROM_TRANSPORT_NO_ACTIVITY_TIMEOUT,
                .procname       = "transport_no_activity_timeout",
                .data           = &sysctl_netrom_transport_no_activity_timeout,
@@ -134,7 +134,7 @@ static ctl_table nr_table[] = {
                .extra1         = &min_idle,
                .extra2         = &max_idle
        },
-        {
+       {
                .ctl_name       = NET_NETROM_ROUTING_CONTROL,
                .procname       = "routing_control",
                .data           = &sysctl_netrom_routing_control,
@@ -145,7 +145,7 @@ static ctl_table nr_table[] = {
                .extra1         = &min_route,
                .extra2         = &max_route
        },
-        {
+       {
                .ctl_name       = NET_NETROM_LINK_FAILS_COUNT,
                .procname       = "link_fails_count",
                .data           = &sysctl_netrom_link_fails_count,
@@ -156,7 +156,7 @@ static ctl_table nr_table[] = {
                .extra1         = &min_fails,
                .extra2         = &max_fails
        },
-        {
+       {
                .ctl_name       = NET_NETROM_RESET,
                .procname       = "reset",
                .data           = &sysctl_netrom_reset_circuit,
@@ -192,7 +192,7 @@ static ctl_table nr_root_table[] = {
 
 void __init nr_register_sysctl(void)
 {
-       nr_table_header = register_sysctl_table(nr_root_table, 1);
+       nr_table_header = register_sysctl_table(nr_root_table);
 }
 
 void nr_unregister_sysctl(void)
index a6fa48788e8f0c81729df730e9d76fcd70a071a6..bf2699074774dc436d53d5276c2375721df58cf1 100644 (file)
@@ -11,7 +11,7 @@
  *             Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  *             Alan Cox, <gw4pts@gw4pts.ampr.org>
  *
- * Fixes:      
+ * Fixes:
  *             Alan Cox        :       verify_area() now used correctly
  *             Alan Cox        :       new skbuff lists, look ma no backlogs!
  *             Alan Cox        :       tidied skbuff lists.
  *     Alexey Kuznetsov        :       Untied from IPv4 stack.
  *     Cyrus Durgin            :       Fixed kerneld for kmod.
  *     Michal Ostrowski        :       Module initialization cleanup.
- *         Ulises Alonso        :       Frame number limit removal and 
+ *         Ulises Alonso        :       Frame number limit removal and
  *                                      packet_set_ring memory leak.
  *             Eric Biederman  :       Allow for > 8 byte hardware addresses.
  *                                     The convention is that longer addresses
  *                                     will simply extend the hardware address
- *                                     byte arrays at the end of sockaddr_ll 
+ *                                     byte arrays at the end of sockaddr_ll
  *                                     and packet_mreq.
  *
  *             This program is free software; you can redistribute it and/or
@@ -48,9 +48,8 @@
  *             2 of the License, or (at your option) any later version.
  *
  */
+
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/capability.h>
 #include <linux/fcntl.h>
@@ -124,7 +123,7 @@ Outgoing, dev->hard_header!=NULL
 
 Incoming, dev->hard_header==NULL
    mac.raw -> UNKNOWN position. It is very likely, that it points to ll header.
-              PPP makes it, that is wrong, because introduce assymetry
+             PPP makes it, that is wrong, because introduce assymetry
              between rx and tx paths.
    data    -> data
 
@@ -237,7 +236,7 @@ static inline char *packet_lookup_frame(struct packet_sock *po, unsigned int pos
        frame_offset = position % po->frames_per_block;
 
        frame = po->pg_vec[pg_vec_pos] + (frame_offset * po->frame_size);
-       
+
        return frame;
 }
 #endif
@@ -280,7 +279,7 @@ static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev,  struct
         */
 
        sk = pt->af_packet_priv;
-       
+
        /*
         *      Yank back the headers [hope the device set this
         *      right or kerboom...]
@@ -336,7 +335,7 @@ oom:
  *     Output a raw packet to a device layer. This bypasses all the other
  *     protocol layers and you must therefore supply it with a complete frame
  */
+
 static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
                               struct msghdr *msg, size_t len)
 {
@@ -346,9 +345,9 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
        struct net_device *dev;
        __be16 proto=0;
        int err;
-       
+
        /*
-        *      Get and verify the address. 
+        *      Get and verify the address.
         */
 
        if (saddr)
@@ -362,7 +361,7 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
                return(-ENOTCONN);      /* SOCK_PACKET must be sent giving an address */
 
        /*
-        *      Find the device first to size check it 
+        *      Find the device first to size check it
         */
 
        saddr->spkt_device[13] = 0;
@@ -370,7 +369,7 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
        err = -ENODEV;
        if (dev == NULL)
                goto out_unlock;
-       
+
        err = -ENETDOWN;
        if (!(dev->flags & IFF_UP))
                goto out_unlock;
@@ -379,7 +378,7 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
         *      You may not queue a frame bigger than the mtu. This is the lowest level
         *      raw protocol and you must do your own fragmentation at this level.
         */
-        
+
        err = -EMSGSIZE;
        if (len > dev->mtu + dev->hard_header_len)
                goto out_unlock;
@@ -392,14 +391,14 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
         *      deal with the problem - do your own algorithmic backoffs. That's far
         *      more flexible.
         */
-        
-       if (skb == NULL) 
+
+       if (skb == NULL)
                goto out_unlock;
 
        /*
-        *      Fill it in 
+        *      Fill it in
         */
-        
+
        /* FIXME: Save some space for broken drivers that write a
         * hard header at transmission time by themselves. PPP is the
         * notable one here. This should really be fixed at the driver level.
@@ -641,7 +640,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe
 
        spin_lock(&sk->sk_receive_queue.lock);
        h = (struct tpacket_hdr *)packet_lookup_frame(po, po->head);
-       
+
        if (h->tp_status)
                goto ring_is_full;
        po->head = po->head != po->frame_max ? po->head+1 : 0;
@@ -660,7 +659,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct packe
        h->tp_snaplen = snaplen;
        h->tp_mac = macoff;
        h->tp_net = netoff;
-       if (skb->tstamp.off_sec == 0) { 
+       if (skb->tstamp.off_sec == 0) {
                __net_timestamp(skb);
                sock_enable_timestamp(sk);
        }
@@ -700,7 +699,7 @@ drop_n_restore:
                skb->len = skb_len;
        }
 drop:
-        kfree_skb(skb);
+       kfree_skb(skb);
        return 0;
 
 ring_is_full:
@@ -728,9 +727,9 @@ static int packet_sendmsg(struct kiocb *iocb, struct socket *sock,
        int ifindex, err, reserve = 0;
 
        /*
-        *      Get and verify the address. 
+        *      Get and verify the address.
         */
-        
+
        if (saddr == NULL) {
                struct packet_sock *po = pkt_sk(sk);
 
@@ -939,11 +938,11 @@ static int packet_bind_spkt(struct socket *sock, struct sockaddr *uaddr, int add
        char name[15];
        struct net_device *dev;
        int err = -ENODEV;
-       
+
        /*
         *      Check legality
         */
-        
+
        if (addr_len != sizeof(struct sockaddr))
                return -EINVAL;
        strlcpy(name,uaddr->sa_data,sizeof(name));
@@ -968,7 +967,7 @@ static int packet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len
        /*
         *      Check legality
         */
-        
+
        if (addr_len < sizeof(struct sockaddr_ll))
                return -EINVAL;
        if (sll->sll_family != AF_PACKET)
@@ -995,7 +994,7 @@ static struct proto packet_proto = {
 };
 
 /*
- *     Create a packet of type SOCK_PACKET. 
+ *     Create a packet of type SOCK_PACKET.
  */
 
 static int packet_create(struct socket *sock, int protocol)
@@ -1097,7 +1096,7 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock,
        skb=skb_recv_datagram(sk,flags,flags&MSG_DONTWAIT,&err);
 
        /*
-        *      An error occurred so return it. Because skb_recv_datagram() 
+        *      An error occurred so return it. Because skb_recv_datagram()
         *      handles the blocking we don't see and worry about blocking
         *      retries.
         */
@@ -1358,7 +1357,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
 
        switch(optname) {
 #ifdef CONFIG_PACKET_MULTICAST
-       case PACKET_ADD_MEMBERSHIP:     
+       case PACKET_ADD_MEMBERSHIP:
        case PACKET_DROP_MEMBERSHIP:
        {
                struct packet_mreq_max mreq;
@@ -1438,7 +1437,7 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
 
        if (len < 0)
                return -EINVAL;
-               
+
        switch(optname) {
        case PACKET_STATISTICS:
                if (len > sizeof(struct tpacket_stats))
@@ -1547,7 +1546,7 @@ static int packet_ioctl(struct socket *sock, unsigned int cmd,
                }
                case SIOCGSTAMP:
                        return sock_get_timestamp(sk, (struct timeval __user *)arg);
-                       
+
 #ifdef CONFIG_INET
                case SIOCADDRT:
                case SIOCDELRT:
@@ -1608,7 +1607,7 @@ static void packet_mm_open(struct vm_area_struct *vma)
        struct file *file = vma->vm_file;
        struct socket * sock = file->private_data;
        struct sock *sk = sock->sk;
-       
+
        if (sk)
                atomic_inc(&pkt_sk(sk)->mapped);
 }
@@ -1618,7 +1617,7 @@ static void packet_mm_close(struct vm_area_struct *vma)
        struct file *file = vma->vm_file;
        struct socket * sock = file->private_data;
        struct sock *sk = sock->sk;
-       
+
        if (sk)
                atomic_dec(&pkt_sk(sk)->mapped);
 }
@@ -1682,7 +1681,7 @@ static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing
        int was_running, order = 0;
        __be16 num;
        int err = 0;
-       
+
        if (req->tp_block_nr) {
                int i, l;
 
@@ -1744,7 +1743,7 @@ static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing
                __sock_put(sk);
        }
        spin_unlock(&po->bind_lock);
-               
+
        synchronize_net();
 
        err = -EBUSY;
@@ -1861,7 +1860,7 @@ static const struct proto_ops packet_ops = {
        .connect =      sock_no_connect,
        .socketpair =   sock_no_socketpair,
        .accept =       sock_no_accept,
-       .getname =      packet_getname, 
+       .getname =      packet_getname,
        .poll =         packet_poll,
        .ioctl =        packet_ioctl,
        .listen =       sock_no_listen,
@@ -1906,17 +1905,17 @@ static void *packet_seq_start(struct seq_file *seq, loff_t *pos)
 static void *packet_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        ++*pos;
-       return  (v == SEQ_START_TOKEN) 
-               ? sk_head(&packet_sklist) 
+       return  (v == SEQ_START_TOKEN)
+               ? sk_head(&packet_sklist)
                : sk_next((struct sock*)v) ;
 }
 
 static void packet_seq_stop(struct seq_file *seq, void *v)
 {
-       read_unlock(&packet_sklist_lock);               
+       read_unlock(&packet_sklist_lock);
 }
 
-static int packet_seq_show(struct seq_file *seq, void *v) 
+static int packet_seq_show(struct seq_file *seq, void *v)
 {
        if (v == SEQ_START_TOKEN)
                seq_puts(seq, "sk       RefCnt Type Proto  Iface R Rmem   User   Inode\n");
@@ -1952,7 +1951,7 @@ static int packet_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &packet_seq_ops);
 }
 
-static struct file_operations packet_seq_fops = {
+static const struct file_operations packet_seq_fops = {
        .owner          = THIS_MODULE,
        .open           = packet_seq_open,
        .read           = seq_read,
index 9e279464c9d1ed59e7b558e2fa1e0e8e6a37737a..8c34f1ca6c8c8eb8486d084bbd1e17eb6eca224c 100644 (file)
@@ -1351,7 +1351,7 @@ static void *rose_info_start(struct seq_file *seq, loff_t *pos)
        spin_lock_bh(&rose_list_lock);
        if (*pos == 0)
                return SEQ_START_TOKEN;
-       
+
        i = 1;
        sk_for_each(s, node, &rose_list) {
                if (i == *pos)
@@ -1365,10 +1365,10 @@ static void *rose_info_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        ++*pos;
 
-       return (v == SEQ_START_TOKEN) ? sk_head(&rose_list) 
+       return (v == SEQ_START_TOKEN) ? sk_head(&rose_list)
                : sk_next((struct sock *)v);
 }
-       
+
 static void rose_info_stop(struct seq_file *seq, void *v)
 {
        spin_unlock_bh(&rose_list_lock);
@@ -1379,7 +1379,7 @@ static int rose_info_show(struct seq_file *seq, void *v)
        char buf[11];
 
        if (v == SEQ_START_TOKEN)
-               seq_puts(seq, 
+               seq_puts(seq,
                         "dest_addr  dest_call src_addr   src_call  dev   lci neigh st vs vr va   t  t1  t2  t3  hb    idle Snd-Q Rcv-Q inode\n");
 
        else {
@@ -1392,7 +1392,7 @@ static int rose_info_show(struct seq_file *seq, void *v)
                        devname = "???";
                else
                        devname = dev->name;
-               
+
                seq_printf(seq, "%-10s %-9s ",
                        rose2asc(&rose->dest_addr),
                        ax2asc(buf, &rose->dest_call));
@@ -1440,7 +1440,7 @@ static int rose_info_open(struct inode *inode, struct file *file)
        return seq_open(file, &rose_info_seqops);
 }
 
-static struct file_operations rose_info_fops = {
+static const struct file_operations rose_info_fops = {
        .owner = THIS_MODULE,
        .open = rose_info_open,
        .read = seq_read,
@@ -1520,7 +1520,7 @@ static int __init rose_proto_init(void)
                char name[IFNAMSIZ];
 
                sprintf(name, "rose%d", i);
-               dev = alloc_netdev(sizeof(struct net_device_stats), 
+               dev = alloc_netdev(sizeof(struct net_device_stats),
                                   name, rose_setup);
                if (!dev) {
                        printk(KERN_ERR "ROSE: rose_proto_init - unable to allocate memory\n");
index 50824d345fa6e43fe61d04e8f1b075081a743c35..8d88795dc663497654aeb0eb292fa91680e260c1 100644 (file)
@@ -9,7 +9,6 @@
 #include <linux/module.h>
 #include <linux/proc_fs.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/interrupt.h>
 #include <linux/fs.h>
 #include <linux/types.h>
index 8348d33f1efefceb64472f52577067c3550931bf..4ee0879d354064cad674b5423a3f9de40ef5ca38 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
index 2965ffc83b9b78bb8db22d7f6d25a02ee6ec90fa..69820f93414b1ca7f98fb62b5570d8d0bfbca0aa 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
index 8028c0d425dc51992ef55e7dc95d66e3397cf700..a1233e1b1ab60a103d2eca883826346f40c1ec81 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
@@ -66,7 +65,7 @@ static int __must_check rose_add_node(struct rose_route_struct *rose_route,
        while (rose_node != NULL) {
                if ((rose_node->mask == rose_route->mask) &&
                    (rosecmpm(&rose_route->address, &rose_node->address,
-                             rose_route->mask) == 0))
+                             rose_route->mask) == 0))
                        break;
                rose_node = rose_node->next;
        }
@@ -300,7 +299,7 @@ static int rose_del_node(struct rose_route_struct *rose_route,
        while (rose_node != NULL) {
                if ((rose_node->mask == rose_route->mask) &&
                    (rosecmpm(&rose_route->address, &rose_node->address,
-                             rose_route->mask) == 0))
+                             rose_route->mask) == 0))
                        break;
                rose_node = rose_node->next;
        }
@@ -1070,7 +1069,7 @@ static void *rose_node_start(struct seq_file *seq, loff_t *pos)
        if (*pos == 0)
                return SEQ_START_TOKEN;
 
-       for (rose_node = rose_node_list; rose_node && i < *pos; 
+       for (rose_node = rose_node_list; rose_node && i < *pos;
             rose_node = rose_node->next, ++i);
 
        return (i == *pos) ? rose_node : NULL;
@@ -1079,8 +1078,8 @@ static void *rose_node_start(struct seq_file *seq, loff_t *pos)
 static void *rose_node_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        ++*pos;
-       
-       return (v == SEQ_START_TOKEN) ? rose_node_list 
+
+       return (v == SEQ_START_TOKEN) ? rose_node_list
                : ((struct rose_node *)v)->next;
 }
 
@@ -1129,7 +1128,7 @@ static int rose_nodes_open(struct inode *inode, struct file *file)
        return seq_open(file, &rose_node_seqops);
 }
 
-struct file_operations rose_nodes_fops = {
+const struct file_operations rose_nodes_fops = {
        .owner = THIS_MODULE,
        .open = rose_nodes_open,
        .read = seq_read,
@@ -1146,7 +1145,7 @@ static void *rose_neigh_start(struct seq_file *seq, loff_t *pos)
        if (*pos == 0)
                return SEQ_START_TOKEN;
 
-       for (rose_neigh = rose_neigh_list; rose_neigh && i < *pos; 
+       for (rose_neigh = rose_neigh_list; rose_neigh && i < *pos;
             rose_neigh = rose_neigh->next, ++i);
 
        return (i == *pos) ? rose_neigh : NULL;
@@ -1155,8 +1154,8 @@ static void *rose_neigh_start(struct seq_file *seq, loff_t *pos)
 static void *rose_neigh_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        ++*pos;
-       
-       return (v == SEQ_START_TOKEN) ? rose_neigh_list 
+
+       return (v == SEQ_START_TOKEN) ? rose_neigh_list
                : ((struct rose_neigh *)v)->next;
 }
 
@@ -1171,7 +1170,7 @@ static int rose_neigh_show(struct seq_file *seq, void *v)
        int i;
 
        if (v == SEQ_START_TOKEN)
-               seq_puts(seq, 
+               seq_puts(seq,
                         "addr  callsign  dev  count use mode restart  t0  tf digipeaters\n");
        else {
                struct rose_neigh *rose_neigh = v;
@@ -1211,7 +1210,7 @@ static int rose_neigh_open(struct inode *inode, struct file *file)
        return seq_open(file, &rose_neigh_seqops);
 }
 
-struct file_operations rose_neigh_fops = {
+const struct file_operations rose_neigh_fops = {
        .owner = THIS_MODULE,
        .open = rose_neigh_open,
        .read = seq_read,
@@ -1229,7 +1228,7 @@ static void *rose_route_start(struct seq_file *seq, loff_t *pos)
        if (*pos == 0)
                return SEQ_START_TOKEN;
 
-       for (rose_route = rose_route_list; rose_route && i < *pos; 
+       for (rose_route = rose_route_list; rose_route && i < *pos;
             rose_route = rose_route->next, ++i);
 
        return (i == *pos) ? rose_route : NULL;
@@ -1238,8 +1237,8 @@ static void *rose_route_start(struct seq_file *seq, loff_t *pos)
 static void *rose_route_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        ++*pos;
-       
-       return (v == SEQ_START_TOKEN) ? rose_route_list 
+
+       return (v == SEQ_START_TOKEN) ? rose_route_list
                : ((struct rose_route *)v)->next;
 }
 
@@ -1253,30 +1252,30 @@ static int rose_route_show(struct seq_file *seq, void *v)
        char buf[11];
 
        if (v == SEQ_START_TOKEN)
-               seq_puts(seq, 
+               seq_puts(seq,
                         "lci  address     callsign   neigh  <-> lci  address     callsign   neigh\n");
        else {
                struct rose_route *rose_route = v;
 
-               if (rose_route->neigh1) 
+               if (rose_route->neigh1)
                        seq_printf(seq,
                                   "%3.3X  %-10s  %-9s  %05d      ",
                                   rose_route->lci1,
                                   rose2asc(&rose_route->src_addr),
                                   ax2asc(buf, &rose_route->src_call),
                                   rose_route->neigh1->number);
-               else 
-                       seq_puts(seq, 
+               else
+                       seq_puts(seq,
                                 "000  *           *          00000      ");
 
-               if (rose_route->neigh2) 
+               if (rose_route->neigh2)
                        seq_printf(seq,
                                   "%3.3X  %-10s  %-9s  %05d\n",
                                rose_route->lci2,
                                rose2asc(&rose_route->dest_addr),
                                ax2asc(buf, &rose_route->dest_call),
                                rose_route->neigh2->number);
-                else 
+                else
                         seq_puts(seq,
                                  "000  *           *          00000\n");
                }
@@ -1295,7 +1294,7 @@ static int rose_route_open(struct inode *inode, struct file *file)
        return seq_open(file, &rose_route_seqops);
 }
 
-struct file_operations rose_routes_fops = {
+const struct file_operations rose_routes_fops = {
        .owner = THIS_MODULE,
        .open = rose_route_open,
        .read = seq_read,
index 36a77944622b8bd59bf51cdf424919712db5ddef..b05108f382da4a757b0381a106bfcbc3598dd51e 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/socket.h>
 #include <linux/in.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/timer.h>
 #include <linux/string.h>
 #include <linux/sockios.h>
index 8548c7cf564367d7f93ba59cc59524dda5b82821..455b0555a6695518621ca558a19c77acf6410534 100644 (file)
@@ -25,7 +25,7 @@ static int min_window[] = {1}, max_window[] = {7};
 static struct ctl_table_header *rose_table_header;
 
 static ctl_table rose_table[] = {
-        {
+       {
                .ctl_name       = NET_ROSE_RESTART_REQUEST_TIMEOUT,
                .procname       = "restart_request_timeout",
                .data           = &sysctl_rose_restart_request_timeout,
@@ -36,7 +36,7 @@ static ctl_table rose_table[] = {
                .extra1         = &min_timer,
                .extra2         = &max_timer
        },
-        {
+       {
                .ctl_name       = NET_ROSE_CALL_REQUEST_TIMEOUT,
                .procname       = "call_request_timeout",
                .data           = &sysctl_rose_call_request_timeout,
@@ -47,7 +47,7 @@ static ctl_table rose_table[] = {
                .extra1         = &min_timer,
                .extra2         = &max_timer
        },
-        {
+       {
                .ctl_name       = NET_ROSE_RESET_REQUEST_TIMEOUT,
                .procname       = "reset_request_timeout",
                .data           = &sysctl_rose_reset_request_timeout,
@@ -58,7 +58,7 @@ static ctl_table rose_table[] = {
                .extra1         = &min_timer,
                .extra2         = &max_timer
        },
-        {
+       {
                .ctl_name       = NET_ROSE_CLEAR_REQUEST_TIMEOUT,
                .procname       = "clear_request_timeout",
                .data           = &sysctl_rose_clear_request_timeout,
@@ -69,7 +69,7 @@ static ctl_table rose_table[] = {
                .extra1         = &min_timer,
                .extra2         = &max_timer
        },
-        {
+       {
                .ctl_name       = NET_ROSE_NO_ACTIVITY_TIMEOUT,
                .procname       = "no_activity_timeout",
                .data           = &sysctl_rose_no_activity_timeout,
@@ -80,7 +80,7 @@ static ctl_table rose_table[] = {
                .extra1         = &min_idle,
                .extra2         = &max_idle
        },
-        {
+       {
                .ctl_name       = NET_ROSE_ACK_HOLD_BACK_TIMEOUT,
                .procname       = "acknowledge_hold_back_timeout",
                .data           = &sysctl_rose_ack_hold_back_timeout,
@@ -91,7 +91,7 @@ static ctl_table rose_table[] = {
                .extra1         = &min_timer,
                .extra2         = &max_timer
        },
-        {
+       {
                .ctl_name       = NET_ROSE_ROUTING_CONTROL,
                .procname       = "routing_control",
                .data           = &sysctl_rose_routing_control,
@@ -102,7 +102,7 @@ static ctl_table rose_table[] = {
                .extra1         = &min_route,
                .extra2         = &max_route
        },
-        {
+       {
                .ctl_name       = NET_ROSE_LINK_FAIL_TIMEOUT,
                .procname       = "link_fail_timeout",
                .data           = &sysctl_rose_link_fail_timeout,
@@ -113,7 +113,7 @@ static ctl_table rose_table[] = {
                .extra1         = &min_ftimer,
                .extra2         = &max_ftimer
        },
-        {
+       {
                .ctl_name       = NET_ROSE_MAX_VCS,
                .procname       = "maximum_virtual_circuits",
                .data           = &sysctl_rose_maximum_vcs,
@@ -124,7 +124,7 @@ static ctl_table rose_table[] = {
                .extra1         = &min_maxvcs,
                .extra2         = &max_maxvcs
        },
-        {
+       {
                .ctl_name       = NET_ROSE_WINDOW_SIZE,
                .procname       = "window_size",
                .data           = &sysctl_rose_window_size,
@@ -160,7 +160,7 @@ static ctl_table rose_root_table[] = {
 
 void __init rose_register_sysctl(void)
 {
-       rose_table_header = register_sysctl_table(rose_root_table, 1);
+       rose_table_header = register_sysctl_table(rose_root_table);
 }
 
 void rose_unregister_sysctl(void)
index 93d2c55ad2d5decf115080ba0e5733caa037cd49..a7c929a9fdca89070c1fa70d4dc9a0b4a4275664 100644 (file)
@@ -163,7 +163,7 @@ int rxrpc_create_connection(struct rxrpc_transport *trans,
                conn = list_entry(_p, struct rxrpc_connection, link);
                if (conn->addr.sin_port == candidate->addr.sin_port     &&
                    conn->security_ix   == candidate->security_ix       &&
-                   conn->service_id    == candidate->service_id        && 
+                   conn->service_id    == candidate->service_id        &&
                    conn->in_clientflag == 0)
                        goto found_in_graveyard;
        }
@@ -247,13 +247,13 @@ int rxrpc_connection_lookup(struct rxrpc_peer *peer,
                    conn->in_epoch              == x_epoch      &&
                    conn->conn_id               == x_connid     &&
                    conn->security_ix           == x_secix      &&
-                   conn->service_id            == x_servid     && 
+                   conn->service_id            == x_servid     &&
                    conn->in_clientflag         == x_clflag)
                        goto found_active;
        }
        read_unlock(&peer->conn_lock);
 
-       /* [uncommon case] not active 
+       /* [uncommon case] not active
         * - create a candidate for a new record if an inbound connection
         * - only examine the graveyard for an outbound connection
         */
@@ -286,7 +286,7 @@ int rxrpc_connection_lookup(struct rxrpc_peer *peer,
                    conn->in_epoch              == x_epoch      &&
                    conn->conn_id               == x_connid     &&
                    conn->security_ix           == x_secix      &&
-                   conn->service_id            == x_servid     && 
+                   conn->service_id            == x_servid     &&
                    conn->in_clientflag         == x_clflag)
                        goto found_active_second_chance;
        }
@@ -299,7 +299,7 @@ int rxrpc_connection_lookup(struct rxrpc_peer *peer,
                    conn->in_epoch              == x_epoch      &&
                    conn->conn_id               == x_connid     &&
                    conn->security_ix           == x_secix      &&
-                   conn->service_id            == x_servid     && 
+                   conn->service_id            == x_servid     &&
                    conn->in_clientflag         == x_clflag)
                        goto found_in_graveyard;
        }
index 70e52f6b0b649444db7c60503cf2df170c03c1c7..cc0c5795a103c458554bca62d51596a137f6ebb4 100644 (file)
@@ -14,7 +14,7 @@
  */
 #if 1
 #define __RXACCT_DECL(X) X
-#define __RXACCT(X) do { X; } while(0) 
+#define __RXACCT(X) do { X; } while(0)
 #else
 #define __RXACCT_DECL(X)
 #define __RXACCT(X) do { } while(0)
index 49effd92144e2908ea95ce6ecdff1fb4be7a6940..bbbcd6c2404870cefc6c0bddc7ad18fe7a305d18 100644 (file)
@@ -141,7 +141,7 @@ static int rxrpc_krxiod(void *arg)
 
                try_to_freeze();
 
-                /* discard pending signals */
+               /* discard pending signals */
                rxrpc_discard_my_signals();
 
        } while (!rxrpc_krxiod_die);
index 3ab0f77409f49c79de6c65dc361962bf14be1c94..9a1e7f5e034c973039bb7113eaf2fa84638f3815 100644 (file)
@@ -110,7 +110,7 @@ static int rxrpc_krxsecd(void *arg)
 
                try_to_freeze();
 
-                /* discard pending signals */
+               /* discard pending signals */
                rxrpc_discard_my_signals();
 
        } while (!die);
index 48cbd065bb45ab8ba5d676f802ebbcdf2ecc0d28..baec1f7fd8b9969c8491adddeb73b173fde53ac1 100644 (file)
@@ -146,17 +146,17 @@ __attribute__((no_instrument_function));
 void __cyg_profile_func_enter (void *this_fn, void *call_site)
 {
        asm volatile("  movl    %%esp,%%edi     \n"
-                    "  andl    %0,%%edi        \n"
-                    "  addl    %1,%%edi        \n"
-                    "  movl    %%esp,%%ecx     \n"
-                    "  subl    %%edi,%%ecx     \n"
-                    "  shrl    $2,%%ecx        \n"
-                    "  movl    $0xedededed,%%eax     \n"
-                    "  rep stosl               \n"
-                    :
-                    : "i"(~(THREAD_SIZE-1)), "i"(sizeof(struct thread_info))
-                    : "eax", "ecx", "edi", "memory", "cc"
-                    );
+                   "  andl    %0,%%edi        \n"
+                   "  addl    %1,%%edi        \n"
+                   "  movl    %%esp,%%ecx     \n"
+                   "  subl    %%edi,%%ecx     \n"
+                   "  shrl    $2,%%ecx        \n"
+                   "  movl    $0xedededed,%%eax     \n"
+                   "  rep stosl               \n"
+                   :
+                   : "i"(~(THREAD_SIZE-1)), "i"(sizeof(struct thread_info))
+                   : "eax", "ecx", "edi", "memory", "cc"
+                   );
 }
 
 void __cyg_profile_func_exit(void *this_fn, void *call_site)
@@ -165,16 +165,16 @@ __attribute__((no_instrument_function));
 void __cyg_profile_func_exit(void *this_fn, void *call_site)
 {
        asm volatile("  movl    %%esp,%%edi     \n"
-                    "  andl    %0,%%edi        \n"
-                    "  addl    %1,%%edi        \n"
-                    "  movl    %%esp,%%ecx     \n"
-                    "  subl    %%edi,%%ecx     \n"
-                    "  shrl    $2,%%ecx        \n"
-                    "  movl    $0xdadadada,%%eax     \n"
-                    "  rep stosl               \n"
-                    :
-                    : "i"(~(THREAD_SIZE-1)), "i"(sizeof(struct thread_info))
-                    : "eax", "ecx", "edi", "memory", "cc"
-                    );
+                   "  andl    %0,%%edi        \n"
+                   "  addl    %1,%%edi        \n"
+                   "  movl    %%esp,%%ecx     \n"
+                   "  subl    %%edi,%%ecx     \n"
+                   "  shrl    $2,%%ecx        \n"
+                   "  movl    $0xdadadada,%%eax     \n"
+                   "  rep stosl               \n"
+                   :
+                   : "i"(~(THREAD_SIZE-1)), "i"(sizeof(struct thread_info))
+                   : "eax", "ecx", "edi", "memory", "cc"
+                   );
 }
 #endif
index 29975d99d864de1a1d8ea5b2b4a91a719c8b0861..8551c879e45645428840a60d97a2b857cdca4b80 100644 (file)
@@ -37,7 +37,7 @@ static struct seq_operations rxrpc_proc_transports_ops = {
        .show   = rxrpc_proc_transports_show,
 };
 
-static struct file_operations rxrpc_proc_transports_fops = {
+static const struct file_operations rxrpc_proc_transports_fops = {
        .open           = rxrpc_proc_transports_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -57,7 +57,7 @@ static struct seq_operations rxrpc_proc_peers_ops = {
        .show   = rxrpc_proc_peers_show,
 };
 
-static struct file_operations rxrpc_proc_peers_fops = {
+static const struct file_operations rxrpc_proc_peers_fops = {
        .open           = rxrpc_proc_peers_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -77,7 +77,7 @@ static struct seq_operations rxrpc_proc_conns_ops = {
        .show   = rxrpc_proc_conns_show,
 };
 
-static struct file_operations rxrpc_proc_conns_fops = {
+static const struct file_operations rxrpc_proc_conns_fops = {
        .open           = rxrpc_proc_conns_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -97,7 +97,7 @@ static struct seq_operations rxrpc_proc_calls_ops = {
        .show   = rxrpc_proc_calls_show,
 };
 
-static struct file_operations rxrpc_proc_calls_fops = {
+static const struct file_operations rxrpc_proc_calls_fops = {
        .open           = rxrpc_proc_calls_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index 6374df7e77d1bfeb3558efd37e769e8e1b60f834..884290754af7e905d9f3cab143cf448766e6ef66 100644 (file)
@@ -27,7 +27,7 @@ int rxrpc_knet;
 static struct ctl_table_header *rxrpc_sysctl = NULL;
 
 static ctl_table rxrpc_sysctl_table[] = {
-        {
+       {
                .ctl_name       = 1,
                .procname       = "kdebug",
                .data           = &rxrpc_kdebug,
@@ -35,7 +35,7 @@ static ctl_table rxrpc_sysctl_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_dointvec
        },
-        {
+       {
                .ctl_name       = 2,
                .procname       = "ktrace",
                .data           = &rxrpc_ktrace,
@@ -43,7 +43,7 @@ static ctl_table rxrpc_sysctl_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_dointvec
        },
-        {
+       {
                .ctl_name       = 3,
                .procname       = "kproto",
                .data           = &rxrpc_kproto,
@@ -51,7 +51,7 @@ static ctl_table rxrpc_sysctl_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_dointvec
        },
-        {
+       {
                .ctl_name       = 4,
                .procname       = "knet",
                .data           = &rxrpc_knet,
@@ -59,7 +59,7 @@ static ctl_table rxrpc_sysctl_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_dointvec
        },
-        {
+       {
                .ctl_name       = 5,
                .procname       = "peertimo",
                .data           = &rxrpc_peer_timeout,
@@ -67,7 +67,7 @@ static ctl_table rxrpc_sysctl_table[] = {
                .mode           = 0644,
                .proc_handler   = &proc_doulongvec_minmax
        },
-        {
+       {
                .ctl_name       = 6,
                .procname       = "conntimo",
                .data           = &rxrpc_conn_timeout,
@@ -97,7 +97,7 @@ static ctl_table rxrpc_dir_sysctl_table[] = {
 int rxrpc_sysctl_init(void)
 {
 #ifdef CONFIG_SYSCTL
-       rxrpc_sysctl = register_sysctl_table(rxrpc_dir_sysctl_table, 0);
+       rxrpc_sysctl = register_sysctl_table(rxrpc_dir_sysctl_table);
        if (!rxrpc_sysctl)
                return -ENOMEM;
 #endif /* CONFIG_SYSCTL */
index 4268b38d92d25e4d66a972e1b498793b6004400b..8e57be2df93625867d470eb5185fe22114ec513d 100644 (file)
@@ -9,7 +9,6 @@
  * 2 of the License, or (at your option) any later version.
  */
 
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/module.h>
 #include <rxrpc/transport.h>
@@ -330,10 +329,10 @@ static int rxrpc_incoming_msg(struct rxrpc_transport *trans,
        msg->state = RXRPC_MSG_RECEIVED;
        skb_get_timestamp(pkt, &msg->stamp);
        if (msg->stamp.tv_sec == 0) {
-               do_gettimeofday(&msg->stamp); 
-               if (pkt->sk) 
+               do_gettimeofday(&msg->stamp);
+               if (pkt->sk)
                        sock_enable_timestamp(pkt->sk);
-       } 
+       }
        msg->seq = ntohl(msg->hdr.seq);
 
        /* attach the packet */
index 835070e9169cc03b5975709827f752ff6d6576a0..cb21617a5670516a9719623a5cceecd62bdca961 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
@@ -65,7 +64,7 @@ int tcf_hash_release(struct tcf_common *p, int bind,
                        p->tcfc_bindcnt--;
 
                p->tcfc_refcnt--;
-               if (p->tcfc_bindcnt <= 0 && p->tcfc_refcnt <= 0) {
+               if (p->tcfc_bindcnt <= 0 && p->tcfc_refcnt <= 0) {
                        tcf_hash_destroy(p, hinfo);
                        ret = 1;
                }
@@ -362,7 +361,7 @@ static struct tc_action_ops *tc_lookup_action_id(u32 type)
 #endif
 
 int tcf_action_exec(struct sk_buff *skb, struct tc_action *act,
-                    struct tcf_result *res)
+                   struct tcf_result *res)
 {
        struct tc_action *a;
        int ret = -1;
@@ -473,7 +472,7 @@ errout:
 }
 
 struct tc_action *tcf_action_init_1(struct rtattr *rta, struct rtattr *est,
-                                    char *name, int ovr, int bind, int *err)
+                                   char *name, int ovr, int bind, int *err)
 {
        struct tc_action *a;
        struct tc_action_ops *a_o;
@@ -553,7 +552,7 @@ err_out:
 }
 
 struct tc_action *tcf_action_init(struct rtattr *rta, struct rtattr *est,
-                                  char *name, int ovr, int bind, int *err)
+                                 char *name, int ovr, int bind, int *err)
 {
        struct rtattr *tb[TCA_ACT_MAX_PRIO+1];
        struct tc_action *head = NULL, *act, *act_prev = NULL;
@@ -590,7 +589,7 @@ int tcf_action_copy_stats(struct sk_buff *skb, struct tc_action *a,
        int err = 0;
        struct gnet_dump d;
        struct tcf_act_hdr *h = a->priv;
-       
+
        if (h == NULL)
                goto errout;
 
@@ -632,7 +631,7 @@ errout:
 
 static int
 tca_get_fill(struct sk_buff *skb, struct tc_action *a, u32 pid, u32 seq,
-             u16 flags, int event, int bind, int ref)
+            u16 flags, int event, int bind, int ref)
 {
        struct tcamsg *t;
        struct nlmsghdr *nlh;
@@ -645,7 +644,7 @@ tca_get_fill(struct sk_buff *skb, struct tc_action *a, u32 pid, u32 seq,
        t->tca_family = AF_UNSPEC;
        t->tca__pad1 = 0;
        t->tca__pad2 = 0;
-       
+
        x = (struct rtattr*) skb->tail;
        RTA_PUT(skb, TCA_ACT_TAB, 0, NULL);
 
@@ -653,7 +652,7 @@ tca_get_fill(struct sk_buff *skb, struct tc_action *a, u32 pid, u32 seq,
                goto rtattr_failure;
 
        x->rta_len = skb->tail - (u8*)x;
-       
+
        nlh->nlmsg_len = skb->tail - b;
        return skb->len;
 
@@ -852,7 +851,7 @@ tca_action_gd(struct rtattr *rta, struct nlmsghdr *n, u32 pid, int event)
                }
 
                if (tca_get_fill(skb, head, pid, n->nlmsg_seq, 0, event,
-                                0, 1) <= 0) {
+                                0, 1) <= 0) {
                        kfree_skb(skb);
                        ret = -EINVAL;
                        goto err;
@@ -861,7 +860,7 @@ tca_action_gd(struct rtattr *rta, struct nlmsghdr *n, u32 pid, int event)
                /* now do the delete */
                tcf_action_destroy(head, 0);
                ret = rtnetlink_send(skb, pid, RTNLGRP_TC,
-                                    n->nlmsg_flags&NLM_F_ECHO);
+                                    n->nlmsg_flags&NLM_F_ECHO);
                if (ret > 0)
                        return 0;
                return ret;
@@ -872,7 +871,7 @@ err:
 }
 
 static int tcf_add_notify(struct tc_action *a, u32 pid, u32 seq, int event,
-                          u16 flags)
+                         u16 flags)
 {
        struct tcamsg *t;
        struct nlmsghdr *nlh;
@@ -900,10 +899,10 @@ static int tcf_add_notify(struct tc_action *a, u32 pid, u32 seq, int event,
                goto rtattr_failure;
 
        x->rta_len = skb->tail - (u8*)x;
-       
+
        nlh->nlmsg_len = skb->tail - b;
        NETLINK_CB(skb).dst_group = RTNLGRP_TC;
-       
+
        err = rtnetlink_send(skb, pid, RTNLGRP_TC, flags&NLM_F_ECHO);
        if (err > 0)
                err = 0;
@@ -915,7 +914,7 @@ nlmsg_failure:
        return -1;
 }
 
-       
+
 static int
 tcf_action_add(struct rtattr *rta, struct nlmsghdr *n, u32 pid, int ovr)
 {
@@ -999,13 +998,13 @@ find_dump_kind(struct nlmsghdr *n)
                return NULL;
 
        if (rtattr_parse(tb, TCA_ACT_MAX_PRIO, RTA_DATA(tb1),
-                        NLMSG_ALIGN(RTA_PAYLOAD(tb1))) < 0)
+                        NLMSG_ALIGN(RTA_PAYLOAD(tb1))) < 0)
                return NULL;
        if (tb[0] == NULL)
                return NULL;
 
        if (rtattr_parse(tb2, TCA_ACT_MAX, RTA_DATA(tb[0]),
-                        RTA_PAYLOAD(tb[0])) < 0)
+                        RTA_PAYLOAD(tb[0])) < 0)
                return NULL;
        kind = tb2[TCA_ACT_KIND-1];
 
@@ -1043,7 +1042,7 @@ tc_dump_action(struct sk_buff *skb, struct netlink_callback *cb)
        }
 
        nlh = NLMSG_PUT(skb, NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq,
-                       cb->nlh->nlmsg_type, sizeof(*t));
+                       cb->nlh->nlmsg_type, sizeof(*t));
        t = NLMSG_DATA(nlh);
        t->tca_family = AF_UNSPEC;
        t->tca__pad1 = 0;
index 85de7efd5fea7b29ca7a208633c5740f1a1762e5..87d0faf328672ef5d951bdd4b073a963ecc45389 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
@@ -65,7 +64,7 @@ static g_rand gact_rand[MAX_RAND]= { NULL, gact_net_rand, gact_determ };
 #endif /* CONFIG_GACT_PROB */
 
 static int tcf_gact_init(struct rtattr *rta, struct rtattr *est,
-                         struct tc_action *a, int ovr, int bind)
+                        struct tc_action *a, int ovr, int bind)
 {
        struct rtattr *tb[TCA_GACT_MAX];
        struct tc_gact *parm;
index 4c68c718f5ecd97455abcf316a71769dbca697a4..47f0b13242395d7b2e71447bdc1e9daaef2bba52 100644 (file)
@@ -16,7 +16,6 @@
 #include <asm/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
@@ -70,7 +69,7 @@ static int ipt_init_target(struct ipt_entry_target *t, char *table, unsigned int
        }
        if (t->u.kernel.target->checkentry
            && !t->u.kernel.target->checkentry(table, NULL,
-                                              t->u.kernel.target, t->data,
+                                              t->u.kernel.target, t->data,
                                               hook)) {
                module_put(t->u.kernel.target->me);
                ret = -EINVAL;
@@ -83,7 +82,7 @@ static void ipt_destroy_target(struct ipt_entry_target *t)
 {
        if (t->u.kernel.target->destroy)
                t->u.kernel.target->destroy(t->u.kernel.target, t->data);
-        module_put(t->u.kernel.target->me);
+       module_put(t->u.kernel.target->me);
 }
 
 static int tcf_ipt_release(struct tcf_ipt *ipt, int bind)
index 483897271f1598bb9d0659887f36a035e1d0381c..68f26cb278f9f74eba6a10e2e682782f4188dd33 100644 (file)
@@ -17,7 +17,6 @@
 #include <asm/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
index 8ac65c219b98070885dc0ee2ff294aede855441b..3d6a2fcc9ce4e46aea8796108b054eb7d6e4d070 100644 (file)
@@ -14,7 +14,6 @@
 #include <asm/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
@@ -153,8 +152,8 @@ static int tcf_pedit(struct sk_buff *skb, struct tc_action *a,
                        if (tkey->offmask) {
                                if (skb->len > tkey->at) {
                                         char *j = pptr + tkey->at;
-                                        offset += ((*j & tkey->offmask) >> 
-                                                  tkey->shift);
+                                        offset += ((*j & tkey->offmask) >>
+                                                  tkey->shift);
                                } else {
                                        goto bad;
                                }
@@ -176,7 +175,7 @@ static int tcf_pedit(struct sk_buff *skb, struct tc_action *a,
                        *ptr = ((*ptr & tkey->mask) ^ tkey->val);
                        munged++;
                }
-               
+
                if (munged)
                        skb->tc_verd = SET_TC_MUNGED(skb->tc_verd);
                goto done;
@@ -200,8 +199,8 @@ static int tcf_pedit_dump(struct sk_buff *skb, struct tc_action *a,
        struct tcf_pedit *p = a->priv;
        struct tc_pedit *opt;
        struct tcf_t t;
-       int s; 
-               
+       int s;
+
        s = sizeof(*opt) + p->tcfp_nkeys * sizeof(struct tc_pedit_key);
 
        /* netlink spinlocks held above us - must use ATOMIC */
index af68e1e83251080789bccce4e8b7c950d8115b24..10a5a5c36f76cdd70ac7297dff3dcf215fceda6b 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
@@ -62,7 +61,7 @@ struct tc_police_compat
 
 #ifdef CONFIG_NET_CLS_ACT
 static int tcf_act_police_walker(struct sk_buff *skb, struct netlink_callback *cb,
-                              int type, struct tc_action *a)
+                             int type, struct tc_action *a)
 {
        struct tcf_common *p;
        int err = 0, index = -1, i = 0, s_i = 0, n_i = 0;
@@ -112,7 +111,7 @@ void tcf_police_destroy(struct tcf_police *p)
 {
        unsigned int h = tcf_hash(p->tcf_index, POL_TAB_MASK);
        struct tcf_common **p1p;
-       
+
        for (p1p = &tcf_police_ht[h]; *p1p; p1p = &(*p1p)->tcfc_next) {
                if (*p1p == &p->common) {
                        write_lock_bh(&police_lock);
@@ -135,7 +134,7 @@ void tcf_police_destroy(struct tcf_police *p)
 
 #ifdef CONFIG_NET_CLS_ACT
 static int tcf_act_police_locate(struct rtattr *rta, struct rtattr *est,
-                                 struct tc_action *a, int ovr, int bind)
+                                struct tc_action *a, int ovr, int bind)
 {
        unsigned h;
        int ret = 0, err;
@@ -269,7 +268,7 @@ static int tcf_act_police_cleanup(struct tc_action *a, int bind)
 }
 
 static int tcf_act_police(struct sk_buff *skb, struct tc_action *a,
-                          struct tcf_result *res)
+                         struct tcf_result *res)
 {
        struct tcf_police *police = a->priv;
        psched_time_t now;
@@ -606,12 +605,12 @@ rtattr_failure:
 int tcf_police_dump_stats(struct sk_buff *skb, struct tcf_police *police)
 {
        struct gnet_dump d;
-       
+
        if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS,
                                         TCA_XSTATS, police->tcf_stats_lock,
                                         &d) < 0)
                goto errout;
-       
+
        if (gnet_stats_copy_basic(&d, &police->tcf_bstats) < 0 ||
 #ifdef CONFIG_NET_ESTIMATOR
            gnet_stats_copy_rate_est(&d, &police->tcf_rate_est) < 0 ||
index 5fe80854ca91cdf58d766c66ce1c8fccb8d882a2..c7971182af0752d67b267a22e607f58dc0dd1613 100644 (file)
@@ -43,9 +43,9 @@ static int tcf_simp(struct sk_buff *skb, struct tc_action *a, struct tcf_result
        d->tcf_bstats.bytes += skb->len;
        d->tcf_bstats.packets++;
 
-       /* print policy string followed by _ then packet count 
-        * Example if this was the 3rd packet and the string was "hello" 
-        * then it would look like "hello_3" (without quotes) 
+       /* print policy string followed by _ then packet count
+        * Example if this was the 3rd packet and the string was "hello"
+        * then it would look like "hello_3" (without quotes)
         **/
        printk("simple: %s_%d\n",
               (char *)d->tcfd_defdata, d->tcf_bstats.packets);
index edb8fc97ae11a183734f700aa06bbf84d758f78e..5c6ffdb77d2d69bfdc35869b388a3e486ca18603 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
@@ -286,7 +285,7 @@ replay:
                        goto errout;
        } else {
                switch (n->nlmsg_type) {
-               case RTM_NEWTFILTER:    
+               case RTM_NEWTFILTER:
                        err = -EEXIST;
                        if (n->nlmsg_flags&NLM_F_EXCL)
                                goto errout;
@@ -481,11 +480,11 @@ tcf_exts_destroy(struct tcf_proto *tp, struct tcf_exts *exts)
 
 int
 tcf_exts_validate(struct tcf_proto *tp, struct rtattr **tb,
-                 struct rtattr *rate_tlv, struct tcf_exts *exts,
-                 struct tcf_ext_map *map)
+                 struct rtattr *rate_tlv, struct tcf_exts *exts,
+                 struct tcf_ext_map *map)
 {
        memset(exts, 0, sizeof(*exts));
-       
+
 #ifdef CONFIG_NET_CLS_ACT
        {
                int err;
@@ -511,7 +510,7 @@ tcf_exts_validate(struct tcf_proto *tp, struct rtattr **tb,
 #elif defined CONFIG_NET_CLS_POLICE
        if (map->police && tb[map->police-1]) {
                struct tcf_police *p;
-               
+
                p = tcf_police_locate(tb[map->police-1], rate_tlv);
                if (p == NULL)
                        return -EINVAL;
@@ -530,7 +529,7 @@ tcf_exts_validate(struct tcf_proto *tp, struct rtattr **tb,
 
 void
 tcf_exts_change(struct tcf_proto *tp, struct tcf_exts *dst,
-               struct tcf_exts *src)
+               struct tcf_exts *src)
 {
 #ifdef CONFIG_NET_CLS_ACT
        if (src->action) {
@@ -597,7 +596,7 @@ rtattr_failure: __attribute__ ((unused))
 
 int
 tcf_exts_dump_stats(struct sk_buff *skb, struct tcf_exts *exts,
-                   struct tcf_ext_map *map)
+                   struct tcf_ext_map *map)
 {
 #ifdef CONFIG_NET_CLS_ACT
        if (exts->action)
index 09fda68c8b39f494f6b5802a99efc34a39cdc030..fad08e521c24f91456590ac4cb6988776f80171b 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/errno.h>
@@ -98,7 +97,7 @@ static void basic_destroy(struct tcf_proto *tp)
 {
        struct basic_head *head = (struct basic_head *) xchg(&tp->root, NULL);
        struct basic_filter *f, *n;
-       
+
        list_for_each_entry_safe(f, n, &head->flist, link) {
                list_del(&f->link);
                basic_delete_filter(tp, f);
@@ -157,7 +156,7 @@ errout:
 }
 
 static int basic_change(struct tcf_proto *tp, unsigned long base, u32 handle,
-                       struct rtattr **tca, unsigned long *arg)
+                       struct rtattr **tca, unsigned long *arg)
 {
        int err = -EINVAL;
        struct basic_head *head = (struct basic_head *) tp->root;
@@ -292,7 +291,7 @@ static int __init init_basic(void)
        return register_tcf_proto_ops(&cls_basic_ops);
 }
 
-static void __exit exit_basic(void) 
+static void __exit exit_basic(void)
 {
        unregister_tcf_proto_ops(&cls_basic_ops);
 }
index c797d6ada7de06948ef1fab1e225a224ffdc057d..5dbb9d451f7300a0620019656f695dbe0506ab78 100644 (file)
@@ -24,7 +24,6 @@
 #include <linux/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
@@ -91,7 +90,7 @@ static __inline__ int fw_hash(u32 handle)
        else if (HTSIZE == 256) {
                u8 *t = (u8 *) &handle;
                return t[0] ^ t[1] ^ t[2] ^ t[3];
-       } else 
+       } else
                return handle & (HTSIZE - 1);
 }
 
@@ -407,7 +406,7 @@ static int __init init_fw(void)
        return register_tcf_proto_ops(&cls_fw_ops);
 }
 
-static void __exit exit_fw(void) 
+static void __exit exit_fw(void)
 {
        unregister_tcf_proto_ops(&cls_fw_ops);
 }
index d3aea730d4c85d923cda240af52272d91cf6e5da..e85df07d8ce7a9e4d286505730be30a05f307409 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
index ad2613790d853cb0d5ab116c36498ffa2909f260..1d4a1fb17608c2a3664711c8561cc07f8c659208 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
index 587b9adab38c07645acacef135e7242a8a729abb..7853621a04cc03d5c68fa1f6d0064c5f6586c88f 100644 (file)
@@ -130,7 +130,7 @@ static struct tcf_ext_map rsvp_ext_map = {
        else if (r > 0)                                 \
                return r;                               \
 }
-       
+
 static int rsvp_classify(struct sk_buff *skb, struct tcf_proto *tp,
                         struct tcf_result *res)
 {
@@ -347,7 +347,7 @@ static int tunnel_bts(struct rsvp_head *data)
 {
        int n = data->tgenerator>>5;
        u32 b = 1<<(data->tgenerator&0x1F);
-       
+
        if (data->tmap[n]&b)
                return 0;
        data->tmap[n] |= b;
@@ -547,7 +547,7 @@ insert:
        s->next = *sp;
        wmb();
        *sp = s;
-       
+
        goto insert;
 
 errout:
@@ -654,7 +654,7 @@ static int __init init_rsvp(void)
        return register_tcf_proto_ops(&RSVP_OPS);
 }
 
-static void __exit exit_rsvp(void) 
+static void __exit exit_rsvp(void)
 {
        unregister_tcf_proto_ops(&RSVP_OPS);
 }
index fde51f7848ebe1544a0bdaa9b08cb226ab24fc70..a2979d89798fc3270f62db9684013bacd76aaecc 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
index 5af8a59e1503c7d5a90cf332af72ee5921d94950..040e2d2d281a61413750a2a407624cce2c31f656 100644 (file)
@@ -222,7 +222,7 @@ tcindex_set_parms(struct tcf_proto *tp, unsigned long base, u32 handle,
        err = tcf_exts_validate(tp, tb, est, &e, &tcindex_ext_map);
        if (err < 0)
                return err;
-       
+
        memcpy(&cp, p, sizeof(cp));
        memset(&new_filter_result, 0, sizeof(new_filter_result));
 
@@ -316,12 +316,12 @@ tcindex_set_parms(struct tcf_proto *tp, unsigned long base, u32 handle,
                f = kzalloc(sizeof(*f), GFP_KERNEL);
                if (!f)
                        goto errout_alloc;
-       }
+       }
 
        if (tb[TCA_TCINDEX_CLASSID-1]) {
                cr.res.classid = *(u32 *) RTA_DATA(tb[TCA_TCINDEX_CLASSID-1]);
                tcf_bind_filter(tp, &cr.res, base);
-       }
+       }
 
        tcf_exts_change(tp, &cr.exts, &e);
 
@@ -341,7 +341,7 @@ tcindex_set_parms(struct tcf_proto *tp, unsigned long base, u32 handle,
                for (fp = p->h+(handle % p->hash); *fp; fp = &(*fp)->next)
                        /* nothing */;
                *fp = f;
-       }
+       }
        tcf_tree_unlock(tp);
 
        return 0;
@@ -491,7 +491,7 @@ static int tcindex_dump(struct tcf_proto *tp, unsigned long fh,
                if (tcf_exts_dump_stats(skb, &r->exts, &tcindex_ext_map) < 0)
                        goto rtattr_failure;
        }
-       
+
        return skb->len;
 
 rtattr_failure:
@@ -519,7 +519,7 @@ static int __init init_tcindex(void)
        return register_tcf_proto_ops(&cls_tcindex_ops);
 }
 
-static void __exit exit_tcindex(void) 
+static void __exit exit_tcindex(void)
 {
        unregister_tcf_proto_ops(&cls_tcindex_ops);
 }
index 8b51948019958b39f182a6119735cc7a50c94a22..0bcb16928d254101f03cce2607895dc89411143d 100644 (file)
@@ -36,7 +36,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
@@ -760,7 +759,7 @@ static int u32_dump(struct tcf_proto *tp, unsigned long fh,
                        RTA_PUT(skb, TCA_U32_INDEV, IFNAMSIZ, n->indev);
 #endif
 #ifdef CONFIG_CLS_U32_PERF
-               RTA_PUT(skb, TCA_U32_PCNT, 
+               RTA_PUT(skb, TCA_U32_PCNT,
                sizeof(struct tc_u32_pcnt) + n->sel.nkeys*sizeof(u64),
                        n->pf);
 #endif
@@ -810,7 +809,7 @@ static int __init init_u32(void)
        return register_tcf_proto_ops(&cls_u32_ops);
 }
 
-static void __exit exit_u32(void) 
+static void __exit exit_u32(void)
 {
        unregister_tcf_proto_ops(&cls_u32_ops);
 }
index 8ed93c39b4eaa5dcd76e2ebdeee3690dad3bb5eb..8d6dacd8190054a9cc401d48342232644ad3e7a9 100644 (file)
@@ -88,7 +88,7 @@ static int __init init_em_cmp(void)
        return tcf_em_register(&em_cmp_ops);
 }
 
-static void __exit exit_em_cmp(void) 
+static void __exit exit_em_cmp(void)
 {
        tcf_em_unregister(&em_cmp_ops);
 }
index 45d47d37155ead9727f5543b22e43cd0b3f87958..60acf8cdb27b34774f71dfdf79654349bf26cc5a 100644 (file)
@@ -9,7 +9,7 @@
  * Authors:    Thomas Graf <tgraf@suug.ch>
  *
  * ==========================================================================
- * 
+ *
  *     The metadata ematch compares two meta objects where each object
  *     represents either a meta value stored in the kernel or a static
  *     value provided by userspace. The objects are not provided by
@@ -290,7 +290,7 @@ META_COLLECTOR(var_sk_bound_if)
                dst->len = 3;
         } else  {
                struct net_device *dev;
-               
+
                dev = dev_get_by_index(skb->sk->sk_bound_dev_if);
                *err = var_dev(dev, dst);
                if (dev)
@@ -671,7 +671,7 @@ static inline struct meta_type_ops * meta_type_ops(struct meta_value *v)
  * Core
  **************************************************************************/
 
-static inline int meta_get(struct sk_buff *skb, struct tcf_pkt_info *info, 
+static inline int meta_get(struct sk_buff *skb, struct tcf_pkt_info *info,
                           struct meta_value *v, struct meta_obj *dst)
 {
        int err = 0;
@@ -753,7 +753,7 @@ static int em_meta_change(struct tcf_proto *tp, void *data, int len,
        struct rtattr *tb[TCA_EM_META_MAX];
        struct tcf_meta_hdr *hdr;
        struct meta_match *meta = NULL;
-       
+
        if (rtattr_parse(tb, TCA_EM_META_MAX, data, len) < 0)
                goto errout;
 
@@ -822,7 +822,7 @@ static int em_meta_dump(struct sk_buff *skb, struct tcf_ematch *em)
 
 rtattr_failure:
        return -1;
-}              
+}
 
 static struct tcf_ematch_ops em_meta_ops = {
        .kind     = TCF_EM_META,
@@ -839,7 +839,7 @@ static int __init init_em_meta(void)
        return tcf_em_register(&em_meta_ops);
 }
 
-static void __exit exit_em_meta(void) 
+static void __exit exit_em_meta(void)
 {
        tcf_em_unregister(&em_meta_ops);
 }
index 005db409be645a45abfd82f7694602874bc5b3ba..b4b36efce29248e37f1e2a941fa45743d76e4f52 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/skbuff.h>
 #include <linux/tc_ematch/tc_em_nbyte.h>
@@ -23,7 +22,7 @@ struct nbyte_data
        struct tcf_em_nbyte     hdr;
        char                    pattern[0];
 };
-       
+
 static int em_nbyte_change(struct tcf_proto *tp, void *data, int data_len,
                           struct tcf_ematch *em)
 {
@@ -68,7 +67,7 @@ static int __init init_em_nbyte(void)
        return tcf_em_register(&em_nbyte_ops);
 }
 
-static void __exit exit_em_nbyte(void) 
+static void __exit exit_em_nbyte(void)
 {
        tcf_em_unregister(&em_nbyte_ops);
 }
index aa17d8f7c4c873aca24d6ae54ec5247dd8fefd8d..e8f46169449d8c5985cba6baed0096aa1610b2ab 100644 (file)
@@ -12,7 +12,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/skbuff.h>
 #include <linux/textsearch.h>
@@ -125,7 +124,7 @@ static int em_text_dump(struct sk_buff *skb, struct tcf_ematch *m)
 
 rtattr_failure:
        return -1;
-}              
+}
 
 static struct tcf_ematch_ops em_text_ops = {
        .kind     = TCF_EM_TEXT,
@@ -142,7 +141,7 @@ static int __init init_em_text(void)
        return tcf_em_register(&em_text_ops);
 }
 
-static void __exit exit_em_text(void) 
+static void __exit exit_em_text(void)
 {
        tcf_em_unregister(&em_text_ops);
 }
index e3ddfce0ac8d9b28e7eee8d49c1f35920932363f..cd0600c6796984b955d26f4b5cc65e46aba8c4e6 100644 (file)
@@ -23,7 +23,7 @@ static int em_u32_match(struct sk_buff *skb, struct tcf_ematch *em,
 {
        struct tc_u32_key *key = (struct tc_u32_key *) em->data;
        unsigned char *ptr = skb->nh.raw;
-       
+
        if (info) {
                if (info->ptr)
                        ptr = info->ptr;
@@ -34,7 +34,7 @@ static int em_u32_match(struct sk_buff *skb, struct tcf_ematch *em,
 
        if (!tcf_valid_offset(skb, ptr, sizeof(u32)))
                return 0;
-       
+
        return !(((*(u32*) ptr)  ^ key->val) & key->mask);
 }
 
@@ -51,7 +51,7 @@ static int __init init_em_u32(void)
        return tcf_em_register(&em_u32_ops);
 }
 
-static void __exit exit_em_u32(void) 
+static void __exit exit_em_u32(void)
 {
        tcf_em_unregister(&em_u32_ops);
 }
index 8f8a16da72a8970acb1c11357ec228573b85cad4..959c306c57143d9700a122d8332a3cd3ecca4a40 100644 (file)
  *                     --------<-POP---------
  *
  * where B is a virtual ematch referencing to sequence starting with B1.
- * 
+ *
  * ==========================================================================
  *
  * How to write an ematch in 60 seconds
  * ------------------------------------
- * 
+ *
  *   1) Provide a matcher function:
  *      static int my_match(struct sk_buff *skb, struct tcf_ematch *m,
  *                          struct tcf_pkt_info *info)
@@ -84,7 +84,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/mm.h>
 #include <linux/errno.h>
 #include <linux/interrupt.h>
@@ -115,7 +114,7 @@ static inline struct tcf_ematch_ops * tcf_em_lookup(u16 kind)
 
 /**
  * tcf_em_register - register an extended match
- * 
+ *
  * @ops: ematch operations lookup table
  *
  * This function must be called by ematches to announce their presence.
@@ -211,7 +210,7 @@ static int tcf_em_validate(struct tcf_proto *tp,
                if (ref <= idx)
                        goto errout;
 
-               
+
                em->data = ref;
        } else {
                /* Note: This lookup will increase the module refcnt
@@ -327,7 +326,7 @@ int tcf_em_tree_validate(struct tcf_proto *tp, struct rtattr *rta,
        /* We do not use rtattr_parse_nested here because the maximum
         * number of attributes is unknown. This saves us the allocation
         * for a tb buffer which would serve no purpose at all.
-        * 
+        *
         * The array of rt attributes is parsed in the order as they are
         * provided, their type must be incremental from 1 to n. Even
         * if it does not serve any real purpose, a failure of sticking
@@ -399,7 +398,7 @@ void tcf_em_tree_destroy(struct tcf_proto *tp, struct tcf_ematch_tree *tree)
                        module_put(em->ops->owner);
                }
        }
-       
+
        tree->hdr.nmatches = 0;
        kfree(tree->matches);
 }
index 65825f4409d98c9872898bac77422c37b481b092..ecc988af4a9a8e798b5dd439b9ce3c008a8f97e9 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
@@ -389,7 +388,7 @@ static int qdisc_graft(struct net_device *dev, struct Qdisc *parent,
        struct Qdisc *q = *old;
 
 
-       if (parent == NULL) { 
+       if (parent == NULL) {
                if (q && q->flags&TCQ_F_INGRESS) {
                        *old = dev_graft_qdisc(dev, q);
                } else {
@@ -596,7 +595,7 @@ static int tc_get_qdisc(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
                                q = qdisc_leaf(p, clid);
                        } else { /* ingress */
                                q = dev->qdisc_ingress;
-                        }
+                       }
                } else {
                        q = dev->qdisc_sleeping;
                }
@@ -743,7 +742,7 @@ create_n_graft:
                return -ENOENT;
        if (clid == TC_H_INGRESS)
                q = qdisc_create(dev, tcm->tcm_parent, tca, &err);
-        else
+       else
                q = qdisc_create(dev, tcm->tcm_handle, tca, &err);
        if (q == NULL) {
                if (err == -EAGAIN)
@@ -808,10 +807,10 @@ static int tc_fill_qdisc(struct sk_buff *skb, struct Qdisc *q, u32 clid,
 #endif
            gnet_stats_copy_queue(&d, &q->qstats) < 0)
                goto rtattr_failure;
-       
+
        if (gnet_stats_finish_copy(&d) < 0)
                goto rtattr_failure;
-       
+
        nlh->nlmsg_len = skb->tail - b;
        return skb->len;
 
@@ -954,7 +953,7 @@ static int tc_ctl_tclass(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
        }
 
        /* OK. Locate qdisc */
-       if ((q = qdisc_lookup(dev, qid)) == NULL) 
+       if ((q = qdisc_lookup(dev, qid)) == NULL)
                return -ENOENT;
 
        /* An check that it supports classes */
@@ -978,7 +977,7 @@ static int tc_ctl_tclass(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
                        goto out;
        } else {
                switch (n->nlmsg_type) {
-               case RTM_NEWTCLASS:     
+               case RTM_NEWTCLASS:
                        err = -EEXIST;
                        if (n->nlmsg_flags&NLM_F_EXCL)
                                goto out;
@@ -1162,7 +1161,7 @@ reclassify:
                                skb->tc_verd = SET_TC_VERD(skb->tc_verd,verd);
                                goto reclassify;
                        } else {
-                               if (skb->tc_verd) 
+                               if (skb->tc_verd)
                                        skb->tc_verd = SET_TC_VERD(skb->tc_verd,0);
                                return err;
                        }
@@ -1194,13 +1193,13 @@ static int psched_open(struct inode *inode, struct file *file)
        return single_open(file, psched_show, PDE(inode)->data);
 }
 
-static struct file_operations psched_fops = {
+static const struct file_operations psched_fops = {
        .owner = THIS_MODULE,
        .open = psched_open,
        .read  = seq_read,
        .llseek = seq_lseek,
        .release = single_release,
-};     
+};
 #endif
 
 #ifdef CONFIG_NET_SCH_CLK_CPU
index edc7bb0b9c8b72f8589b91e5d238f6448eb0ca5d..afb3bbd571f27d981909ac3264eff661a235e28c 100644 (file)
@@ -107,7 +107,7 @@ static __inline__ struct atm_flow_data *lookup_flow(struct Qdisc *sch,
        struct atm_qdisc_data *p = PRIV(sch);
        struct atm_flow_data *flow;
 
-        for (flow = p->flows; flow; flow = flow->next)
+       for (flow = p->flows; flow; flow = flow->next)
                if (flow->classid == classid) break;
        return flow;
 }
@@ -125,7 +125,7 @@ static int atm_tc_graft(struct Qdisc *sch,unsigned long arg,
        if (!new) new = &noop_qdisc;
        *old = xchg(&flow->q,new);
        if (*old) qdisc_reset(*old);
-        return 0;
+       return 0;
 }
 
 
@@ -145,7 +145,7 @@ static unsigned long atm_tc_get(struct Qdisc *sch,u32 classid)
 
        DPRINTK("atm_tc_get(sch %p,[qdisc %p],classid %x)\n",sch,p,classid);
        flow = lookup_flow(sch,classid);
-        if (flow) flow->ref++;
+       if (flow) flow->ref++;
        DPRINTK("atm_tc_get: flow %p\n",flow);
        return (unsigned long) flow;
 }
@@ -280,9 +280,9 @@ static int atm_tc_change(struct Qdisc *sch, u32 classid, u32 parent,
            opt->rta_type,RTA_PAYLOAD(opt),hdr_len);
        if (!(sock = sockfd_lookup(fd,&error))) return error; /* f_count++ */
        DPRINTK("atm_tc_change: f_count %d\n",file_count(sock->file));
-        if (sock->ops->family != PF_ATMSVC && sock->ops->family != PF_ATMPVC) {
+       if (sock->ops->family != PF_ATMSVC && sock->ops->family != PF_ATMPVC) {
                error = -EPROTOTYPE;
-                goto err_out;
+               goto err_out;
        }
        /* @@@ should check if the socket is really operational or we'll crash
           on vcc->send */
@@ -320,9 +320,9 @@ static int atm_tc_change(struct Qdisc *sch, u32 classid, u32 parent,
                flow->q = &noop_qdisc;
        DPRINTK("atm_tc_change: qdisc %p\n",flow->q);
        flow->sock = sock;
-        flow->vcc = ATM_SD(sock); /* speedup */
+       flow->vcc = ATM_SD(sock); /* speedup */
        flow->vcc->user_back = flow;
-        DPRINTK("atm_tc_change: vcc %p\n",flow->vcc);
+       DPRINTK("atm_tc_change: vcc %p\n",flow->vcc);
        flow->old_pop = flow->vcc->pop;
        flow->parent = p;
        flow->vcc->pop = sch_atm_pop;
@@ -391,7 +391,7 @@ static struct tcf_proto **atm_tc_find_tcf(struct Qdisc *sch,unsigned long cl)
        struct atm_flow_data *flow = (struct atm_flow_data *) cl;
 
        DPRINTK("atm_tc_find_tcf(sch %p,[qdisc %p],flow %p)\n",sch,p,flow);
-        return flow ? &flow->filter_list : &p->link.filter_list;
+       return flow ? &flow->filter_list : &p->link.filter_list;
 }
 
 
@@ -546,8 +546,8 @@ static int atm_tc_requeue(struct sk_buff *skb,struct Qdisc *sch)
        D2PRINTK("atm_tc_requeue(skb %p,sch %p,[qdisc %p])\n",skb,sch,p);
        ret = p->link.q->ops->requeue(skb,p->link.q);
        if (!ret) {
-        sch->q.qlen++;
-        sch->qstats.requeues++;
+       sch->q.qlen++;
+       sch->qstats.requeues++;
     } else {
                sch->qstats.drops++;
                p->link.qstats.drops++;
@@ -726,7 +726,7 @@ static int __init atm_init(void)
        return register_qdisc(&atm_qdisc_ops);
 }
 
-static void __exit atm_exit(void) 
+static void __exit atm_exit(void)
 {
        unregister_qdisc(&atm_qdisc_ops);
 }
index f79a4f3d0a9584db88107acd901347c96a110087..76c92e710a33486926c196e4f16b5c0ad4450ba2 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
        =======================================
 
        Sources: [1] Sally Floyd and Van Jacobson, "Link-sharing and Resource
-                Management Models for Packet Networks",
+                Management Models for Packet Networks",
                 IEEE/ACM Transactions on Networking, Vol.3, No.4, 1995
 
-                [2] Sally Floyd, "Notes on CBQ and Guaranteed Service", 1995
+                [2] Sally Floyd, "Notes on CBQ and Guaranteed Service", 1995
 
-                [3] Sally Floyd, "Notes on Class-Based Queueing: Setting
+                [3] Sally Floyd, "Notes on Class-Based Queueing: Setting
                 Parameters", 1996
 
                 [4] Sally Floyd and Michael Speer, "Experimental Results
        the implementation is different. Particularly:
 
        --- The WRR algorithm is different. Our version looks more
-        reasonable (I hope) and works when quanta are allowed to be
-        less than MTU, which is always the case when real time classes
-        have small rates. Note, that the statement of [3] is
-        incomplete, delay may actually be estimated even if class
-        per-round allotment is less than MTU. Namely, if per-round
-        allotment is W*r_i, and r_1+...+r_k = r < 1
+       reasonable (I hope) and works when quanta are allowed to be
+       less than MTU, which is always the case when real time classes
+       have small rates. Note, that the statement of [3] is
+       incomplete, delay may actually be estimated even if class
+       per-round allotment is less than MTU. Namely, if per-round
+       allotment is W*r_i, and r_1+...+r_k = r < 1
 
        delay_i <= ([MTU/(W*r_i)]*W*r + W*r + k*MTU)/B
 
@@ -280,7 +279,7 @@ cbq_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
 #ifdef CONFIG_NET_CLS_ACT
                switch (result) {
                case TC_ACT_QUEUED:
-               case TC_ACT_STOLEN: 
+               case TC_ACT_STOLEN:
                        *qerr = NET_XMIT_SUCCESS;
                case TC_ACT_SHOT:
                        return NULL;
@@ -479,7 +478,7 @@ static void cbq_ovl_classic(struct cbq_class *cl)
        if (!cl->delayed) {
                delay += cl->offtime;
 
-               /* 
+               /*
                   Class goes to sleep, so that it will have no
                   chance to work avgidle. Let's forgive it 8)
 
@@ -717,7 +716,7 @@ static int cbq_reshape_fail(struct sk_buff *skb, struct Qdisc *child)
 }
 #endif
 
-/* 
+/*
    It is mission critical procedure.
 
    We "regenerate" toplevel cutoff, if transmitting class
@@ -739,7 +738,7 @@ cbq_update_toplevel(struct cbq_sched_data *q, struct cbq_class *cl,
                                }
                        } while ((borrowed=borrowed->borrow) != NULL);
                }
-#if 0  
+#if 0
        /* It is not necessary now. Uncommenting it
           will save CPU cycles, but decrease fairness.
         */
@@ -768,7 +767,7 @@ cbq_update(struct cbq_sched_data *q)
                   (now - last) is total time between packet right edges.
                   (last_pktlen/rate) is "virtual" busy time, so that
 
-                        idle = (now - last) - last_pktlen/rate
+                        idle = (now - last) - last_pktlen/rate
                 */
 
                idle = PSCHED_TDIFF(q->now, cl->last);
@@ -907,7 +906,7 @@ cbq_dequeue_prio(struct Qdisc *sch, int prio)
                        skb = cl->q->dequeue(cl->q);
 
                        /* Class did not give us any skb :-(
-                          It could occur even if cl->q->q.qlen != 0 
+                          It could occur even if cl->q->q.qlen != 0
                           f.e. if cl->q == "tbf"
                         */
                        if (skb == NULL)
@@ -2131,7 +2130,7 @@ static int __init cbq_module_init(void)
 {
        return register_qdisc(&cbq_qdisc_ops);
 }
-static void __exit cbq_module_exit(void) 
+static void __exit cbq_module_exit(void)
 {
        unregister_qdisc(&cbq_qdisc_ops);
 }
index d5421816f00700ca298d6b1a1dd3a5972189fb19..96324cf4e6a9ac9a1046cfd294d66ab0ec0a82cd 100644 (file)
@@ -68,7 +68,7 @@ static inline int dsmark_valid_indices(u16 indices)
                        return 0;
                indices >>= 1;
        }
+
        return 1;
 }
 
@@ -100,7 +100,7 @@ static int dsmark_graft(struct Qdisc *sch, unsigned long arg,
        qdisc_reset(*old);
        sch_tree_unlock(sch);
 
-        return 0;
+       return 0;
 }
 
 static struct Qdisc *dsmark_leaf(struct Qdisc *sch, unsigned long arg)
@@ -151,7 +151,7 @@ static int dsmark_change(struct Qdisc *sch, u32 classid, u32 parent,
 
        if (tb[TCA_DSMARK_VALUE-1])
                p->value[*arg-1] = RTA_GET_U8(tb[TCA_DSMARK_VALUE-1]);
-               
+
        if (tb[TCA_DSMARK_MASK-1])
                p->mask[*arg-1] = mask;
 
@@ -167,7 +167,7 @@ static int dsmark_delete(struct Qdisc *sch, unsigned long arg)
 
        if (!dsmark_valid_index(p, arg))
                return -EINVAL;
-       
+
        p->mask[arg-1] = 0xff;
        p->value[arg-1] = 0;
 
@@ -193,9 +193,9 @@ static void dsmark_walk(struct Qdisc *sch,struct qdisc_walker *walker)
                                break;
                        }
                }
-ignore:                
+ignore:
                walker->count++;
-        }
+       }
 }
 
 static struct tcf_proto **dsmark_find_tcf(struct Qdisc *sch,unsigned long cl)
@@ -338,7 +338,7 @@ static unsigned int dsmark_drop(struct Qdisc *sch)
 {
        struct dsmark_qdisc_data *p = PRIV(sch);
        unsigned int len;
-       
+
        DPRINTK("dsmark_reset(sch %p,[qdisc %p])\n", sch, p);
 
        if (p->q->ops->drop == NULL)
@@ -506,7 +506,7 @@ static int __init dsmark_module_init(void)
        return register_qdisc(&dsmark_qdisc_ops);
 }
 
-static void __exit dsmark_module_exit(void) 
+static void __exit dsmark_module_exit(void)
 {
        unregister_qdisc(&dsmark_qdisc_ops);
 }
index 3b6e6a7809278f69769ca764f65df928d0e023d3..52eb3439d7c6bf561dc88fca37fdaea0e8a1da4b 100644 (file)
@@ -36,7 +36,7 @@
 
 /* Main transmission queue. */
 
-/* Main qdisc structure lock. 
+/* Main qdisc structure lock.
 
    However, modifications
    to data, participating in scheduling must be additionally
@@ -66,7 +66,7 @@ void qdisc_unlock_tree(struct net_device *dev)
        write_unlock(&qdisc_tree_lock);
 }
 
-/* 
+/*
    dev->queue_lock serializes queue accesses for this device
    AND dev->qdisc pointer itself.
 
@@ -82,7 +82,7 @@ void qdisc_unlock_tree(struct net_device *dev)
    we do not check dev->tbusy flag here.
 
    Returns:  0  - queue is empty.
-            >0  - queue is not empty, but throttled.
+           >0  - queue is not empty, but throttled.
            <0  - queue is not empty. Device is throttled, if dev->tbusy != 0.
 
    NOTE: Called under dev->queue_lock with locally disabled BH.
@@ -112,7 +112,7 @@ static inline int qdisc_restart(struct net_device *dev)
                        if (!netif_tx_trylock(dev)) {
                        collision:
                                /* So, someone grabbed the driver. */
-                               
+
                                /* It may be transient configuration error,
                                   when hard_start_xmit() recurses. We detect
                                   it by checking xmit owner and drop the
@@ -128,7 +128,7 @@ static inline int qdisc_restart(struct net_device *dev)
                                goto requeue;
                        }
                }
-               
+
                {
                        /* And release queue */
                        spin_unlock(&dev->queue_lock);
@@ -137,7 +137,7 @@ static inline int qdisc_restart(struct net_device *dev)
                                int ret;
 
                                ret = dev_hard_start_xmit(skb, dev);
-                               if (ret == NETDEV_TX_OK) { 
+                               if (ret == NETDEV_TX_OK) {
                                        if (!nolock) {
                                                netif_tx_unlock(dev);
                                        }
@@ -146,15 +146,15 @@ static inline int qdisc_restart(struct net_device *dev)
                                }
                                if (ret == NETDEV_TX_LOCKED && nolock) {
                                        spin_lock(&dev->queue_lock);
-                                       goto collision; 
+                                       goto collision;
                                }
                        }
 
                        /* NETDEV_TX_BUSY - we need to requeue */
                        /* Release the driver */
-                       if (!nolock) { 
+                       if (!nolock) {
                                netif_tx_unlock(dev);
-                       } 
+                       }
                        spin_lock(&dev->queue_lock);
                        q = dev->qdisc;
                }
@@ -300,7 +300,7 @@ struct Qdisc noop_qdisc = {
        .enqueue        =       noop_enqueue,
        .dequeue        =       noop_dequeue,
        .flags          =       TCQ_F_BUILTIN,
-       .ops            =       &noop_qdisc_ops,        
+       .ops            =       &noop_qdisc_ops,
        .list           =       LIST_HEAD_INIT(noop_qdisc.list),
 };
 
@@ -454,7 +454,7 @@ struct Qdisc * qdisc_create_dflt(struct net_device *dev, struct Qdisc_ops *ops,
                                 unsigned int parentid)
 {
        struct Qdisc *sch;
-       
+
        sch = qdisc_alloc(dev, ops);
        if (IS_ERR(sch))
                goto errout;
@@ -478,7 +478,7 @@ void qdisc_reset(struct Qdisc *qdisc)
                ops->reset(qdisc);
 }
 
-/* this is the rcu callback function to clean up a qdisc when there 
+/* this is the rcu callback function to clean up a qdisc when there
  * are no further references to it */
 
 static void __qdisc_destroy(struct rcu_head *head)
@@ -600,10 +600,10 @@ void dev_shutdown(struct net_device *dev)
        dev->qdisc_sleeping = &noop_qdisc;
        qdisc_destroy(qdisc);
 #if defined(CONFIG_NET_SCH_INGRESS) || defined(CONFIG_NET_SCH_INGRESS_MODULE)
-        if ((qdisc = dev->qdisc_ingress) != NULL) {
+       if ((qdisc = dev->qdisc_ingress) != NULL) {
                dev->qdisc_ingress = NULL;
                qdisc_destroy(qdisc);
-        }
+       }
 #endif
        BUG_TRAP(!timer_pending(&dev->watchdog_timer));
        qdisc_unlock_tree(dev);
index 18e81a8ffb012e5aab0b7b6b9d9f1d3965f803d3..fa1b4fe7a5fd9772f27a8dd9b7f46e1a7df2ef08 100644 (file)
@@ -335,7 +335,7 @@ static void gred_reset(struct Qdisc* sch)
 
        qdisc_reset_queue(sch);
 
-        for (i = 0; i < t->DPs; i++) {
+       for (i = 0; i < t->DPs; i++) {
                struct gred_sched_data *q = t->tab[i];
 
                if (!q)
@@ -393,7 +393,7 @@ static inline int gred_change_table_def(struct Qdisc *sch, struct rtattr *dps)
                               "shadowed VQ 0x%x\n", i);
                        gred_destroy_vq(table->tab[i]);
                        table->tab[i] = NULL;
-               }
+               }
        }
 
        return 0;
index 6eefa69957772956628a5d74888570af99e01ee0..396deb71480f5612250e25cc58cc29f7178c4b1c 100644 (file)
@@ -71,8 +71,6 @@
 #include <asm/system.h>
 #include <asm/div64.h>
 
-#define HFSC_DEBUG 1
-
 /*
  * kernel internal service curve representation:
  *   coordinates are given by 64 bit unsigned integers.
@@ -211,17 +209,6 @@ do {                                                                       \
 } while (0)
 #endif
 
-#if HFSC_DEBUG
-#define ASSERT(cond)                                                   \
-do {                                                                   \
-       if (unlikely(!(cond)))                                          \
-               printk("assertion %s failed at %s:%i (%s)\n",           \
-                      #cond, __FILE__, __LINE__, __FUNCTION__);        \
-} while (0)
-#else
-#define ASSERT(cond)
-#endif /* HFSC_DEBUG */
-
 #define        HT_INFINITY     0xffffffffffffffffULL   /* infinite time value */
 
 
@@ -284,7 +271,7 @@ static inline struct hfsc_class *
 eltree_get_minel(struct hfsc_sched *q)
 {
        struct rb_node *n;
-       
+
        n = rb_first(&q->eligible);
        if (n == NULL)
                return NULL;
@@ -773,7 +760,7 @@ init_vf(struct hfsc_class *cl, unsigned int len)
                        /* update the virtual curve */
                        vt = cl->cl_vt + cl->cl_vtoff;
                        rtsc_min(&cl->cl_virtual, &cl->cl_fsc, vt,
-                                                     cl->cl_total);
+                                                     cl->cl_total);
                        if (cl->cl_virtual.x == vt) {
                                cl->cl_virtual.x -= cl->cl_vtoff;
                                cl->cl_vtoff = 0;
@@ -796,10 +783,10 @@ init_vf(struct hfsc_class *cl, unsigned int len)
 
                                /* update the ulimit curve */
                                rtsc_min(&cl->cl_ulimit, &cl->cl_usc, cur_time,
-                                        cl->cl_total);
+                                        cl->cl_total);
                                /* compute myf */
                                cl->cl_myf = rtsc_y2x(&cl->cl_ulimit,
-                                                     cl->cl_total);
+                                                     cl->cl_total);
                                cl->cl_myfadj = 0;
                        }
                }
@@ -853,7 +840,7 @@ update_vf(struct hfsc_class *cl, unsigned int len, u64 cur_time)
                 * update vt and f
                 */
                cl->cl_vt = rtsc_y2x(&cl->cl_virtual, cl->cl_total)
-                           - cl->cl_vtoff + cl->cl_vtadj;
+                           - cl->cl_vtoff + cl->cl_vtadj;
 
                /*
                 * if vt of the class is smaller than cvtmin,
@@ -870,7 +857,7 @@ update_vf(struct hfsc_class *cl, unsigned int len, u64 cur_time)
 
                if (cl->cl_flags & HFSC_USC) {
                        cl->cl_myf = cl->cl_myfadj + rtsc_y2x(&cl->cl_ulimit,
-                                                             cl->cl_total);
+                                                             cl->cl_total);
 #if 0
                        /*
                         * This code causes classes to stay way under their
@@ -1001,7 +988,7 @@ hfsc_find_class(u32 classid, struct Qdisc *sch)
 
 static void
 hfsc_change_rsc(struct hfsc_class *cl, struct tc_service_curve *rsc,
-                u64 cur_time)
+               u64 cur_time)
 {
        sc2isc(rsc, &cl->cl_rsc);
        rtsc_init(&cl->cl_deadline, &cl->cl_rsc, cur_time, cl->cl_cumul);
@@ -1023,7 +1010,7 @@ hfsc_change_fsc(struct hfsc_class *cl, struct tc_service_curve *fsc)
 
 static void
 hfsc_change_usc(struct hfsc_class *cl, struct tc_service_curve *usc,
-                u64 cur_time)
+               u64 cur_time)
 {
        sc2isc(usc, &cl->cl_usc);
        rtsc_init(&cl->cl_ulimit, &cl->cl_usc, cur_time, cl->cl_total);
@@ -1032,7 +1019,7 @@ hfsc_change_usc(struct hfsc_class *cl, struct tc_service_curve *usc,
 
 static int
 hfsc_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
-                  struct rtattr **tca, unsigned long *arg)
+                 struct rtattr **tca, unsigned long *arg)
 {
        struct hfsc_sched *q = qdisc_priv(sch);
        struct hfsc_class *cl = (struct hfsc_class *)*arg;
@@ -1228,9 +1215,9 @@ hfsc_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
 #ifdef CONFIG_NET_CLS_ACT
                switch (result) {
                case TC_ACT_QUEUED:
-               case TC_ACT_STOLEN: 
+               case TC_ACT_STOLEN:
                        *qerr = NET_XMIT_SUCCESS;
-               case TC_ACT_SHOT: 
+               case TC_ACT_SHOT:
                        return NULL;
                }
 #elif defined(CONFIG_NET_CLS_POLICE)
@@ -1259,7 +1246,7 @@ hfsc_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
 
 static int
 hfsc_graft_class(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
-                 struct Qdisc **old)
+                struct Qdisc **old)
 {
        struct hfsc_class *cl = (struct hfsc_class *)arg;
 
@@ -1397,7 +1384,7 @@ hfsc_dump_curves(struct sk_buff *skb, struct hfsc_class *cl)
 
 static int
 hfsc_dump_class(struct Qdisc *sch, unsigned long arg, struct sk_buff *skb,
-                struct tcmsg *tcm)
+               struct tcmsg *tcm)
 {
        struct hfsc_class *cl = (struct hfsc_class *)arg;
        unsigned char *b = skb->tail;
@@ -1492,7 +1479,7 @@ hfsc_schedule_watchdog(struct Qdisc *sch, u64 cur_time)
                if (next_time == 0 || next_time > q->root.cl_cfmin)
                        next_time = q->root.cl_cfmin;
        }
-       ASSERT(next_time != 0);
+       WARN_ON(next_time == 0);
        delay = next_time - cur_time;
        delay = PSCHED_US2JIFFIE(delay);
 
index 15f23c5511a869d24927881868bc8a42cf581f5a..97cbb9aec946b56b2e0547206349ec615ec4a876 100644 (file)
@@ -11,7 +11,7 @@
  * Credits (in time order) for older HTB versions:
  *              Stef Coene <stef.coene@docum.org>
  *                     HTB support at LARTC mailing list
- *             Ondrej Kraus, <krauso@barr.cz> 
+ *             Ondrej Kraus, <krauso@barr.cz>
  *                     found missing INIT_QDISC(htb)
  *             Vladimir Smelhaus, Aamer Akhter, Bert Hubert
  *                     helped a lot to locate nasty class stall bug
@@ -33,7 +33,6 @@
 #include <linux/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
     Author: devik@cdi.cz
     ========================================================================
     HTB is like TBF with multiple classes. It is also similar to CBQ because
-    it allows to assign priority to each class in hierarchy. 
+    it allows to assign priority to each class in hierarchy.
     In fact it is another implementation of Floyd's formal sharing.
 
     Levels:
-    Each class is assigned level. Leaf has ALWAYS level 0 and root 
+    Each class is assigned level. Leaf has ALWAYS level 0 and root
     classes have level TC_HTB_MAXDEPTH-1. Interior nodes has level
     one less than their parent.
 */
@@ -245,7 +244,7 @@ static inline struct htb_class *htb_find(u32 handle, struct Qdisc *sch)
  * We allow direct class selection by classid in priority. The we examine
  * filters in qdisc and in inner nodes (if higher filter points to the inner
  * node). If we end up with classid MAJOR:0 we enqueue the skb into special
- * internal fifo (direct). These packets then go directly thru. If we still 
+ * internal fifo (direct). These packets then go directly thru. If we still
  * have no valid leaf we try to use MAJOR:default leaf. It still unsuccessfull
  * then finish and return direct queue.
  */
@@ -433,7 +432,7 @@ static inline void htb_remove_class_from_row(struct htb_sched *q,
  * htb_activate_prios - creates active classe's feed chain
  *
  * The class is connected to ancestors and/or appropriate rows
- * for priorities it is participating on. cl->cmode must be new 
+ * for priorities it is participating on. cl->cmode must be new
  * (activated) mode. It does nothing if cl->prio_activity == 0.
  */
 static void htb_activate_prios(struct htb_sched *q, struct htb_class *cl)
@@ -466,7 +465,7 @@ static void htb_activate_prios(struct htb_sched *q, struct htb_class *cl)
 /**
  * htb_deactivate_prios - remove class from feed chain
  *
- * cl->cmode must represent old mode (before deactivation). It does 
+ * cl->cmode must represent old mode (before deactivation). It does
  * nothing if cl->prio_activity == 0. Class is removed from all feed
  * chains and rows.
  */
@@ -524,9 +523,9 @@ static inline long htb_hiwater(const struct htb_class *cl)
  *
  * It computes cl's mode at time cl->t_c+diff and returns it. If mode
  * is not HTB_CAN_SEND then cl->pq_key is updated to time difference
- * from now to time when cl will change its state. 
+ * from now to time when cl will change its state.
  * Also it is worth to note that class mode doesn't change simply
- * at cl->{c,}tokens == 0 but there can rather be hysteresis of 
+ * at cl->{c,}tokens == 0 but there can rather be hysteresis of
  * 0 .. -cl->{c,}buffer range. It is meant to limit number of
  * mode transitions per time unit. The speed gain is about 1/6.
  */
@@ -575,7 +574,7 @@ htb_change_class_mode(struct htb_sched *q, struct htb_class *cl, long *diff)
 }
 
 /**
- * htb_activate - inserts leaf cl into appropriate active feeds 
+ * htb_activate - inserts leaf cl into appropriate active feeds
  *
  * Routine learns (new) priority of leaf and activates feed chain
  * for the prio. It can be called on already active leaf safely.
@@ -594,7 +593,7 @@ static inline void htb_activate(struct htb_sched *q, struct htb_class *cl)
 }
 
 /**
- * htb_deactivate - remove leaf cl from active feeds 
+ * htb_deactivate - remove leaf cl from active feeds
  *
  * Make sure that leaf is active. In the other words it can't be called
  * with non-active leaf. It also removes class from the drop list.
@@ -854,7 +853,7 @@ static struct htb_class *htb_lookup_leaf(struct rb_root *tree, int prio,
 
        for (i = 0; i < 65535; i++) {
                if (!*sp->pptr && *sp->pid) {
-                       /* ptr was invalidated but id is valid - try to recover 
+                       /* ptr was invalidated but id is valid - try to recover
                           the original or next ptr */
                        *sp->pptr =
                            htb_id_find_next_upper(prio, sp->root, *sp->pid);
@@ -906,7 +905,7 @@ next:
 
                /* class can be empty - it is unlikely but can be true if leaf
                   qdisc drops packets in enqueue routine or if someone used
-                  graft operation on the leaf since last dequeue; 
+                  graft operation on the leaf since last dequeue;
                   simply deactivate and skip such class */
                if (unlikely(cl->un.leaf.q->q.qlen == 0)) {
                        struct htb_class *next;
@@ -1229,7 +1228,7 @@ static int htb_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
        if (cl && !cl->level) {
                if (new == NULL &&
                    (new = qdisc_create_dflt(sch->dev, &pfifo_qdisc_ops,
-                                            cl->classid))
+                                            cl->classid))
                    == NULL)
                        return -ENOBUFS;
                sch_tree_lock(sch);
@@ -1347,7 +1346,7 @@ static void htb_destroy(struct Qdisc *sch)
        del_timer_sync(&q->rttim);
 #endif
        /* This line used to be after htb_destroy_class call below
-          and surprisingly it worked in 2.4. But it must precede it 
+          and surprisingly it worked in 2.4. But it must precede it
           because filter need its target class alive to be able to call
           unbind_filter on it (without Oops). */
        htb_destroy_filters(&q->filter_list);
index c3242f727d414667a26b89b4ff68d0895645a524..cfe070ee6ee33d2f62cfe0c09783d9389b3bfc63 100644 (file)
@@ -1,4 +1,4 @@
-/* net/sched/sch_ingress.c - Ingress qdisc 
+/* net/sched/sch_ingress.c - Ingress qdisc
  *              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
@@ -47,7 +47,7 @@
 */
 #ifndef CONFIG_NET_CLS_ACT
 #ifdef CONFIG_NETFILTER
-static int nf_registered; 
+static int nf_registered;
 #endif
 #endif
 
@@ -70,7 +70,7 @@ static int ingress_graft(struct Qdisc *sch,unsigned long arg,
        DPRINTK("ingress_graft(sch %p,[qdisc %p],new %p,old %p)\n",
                sch, p, new, old);
        DPRINTK("\n ingress_graft: You cannot add qdiscs to classes");
-        return 1;
+       return 1;
 }
 
 
@@ -162,7 +162,7 @@ static int ingress_enqueue(struct sk_buff *skb,struct Qdisc *sch)
                case TC_ACT_QUEUED:
                        result = TC_ACT_STOLEN;
                        break;
-               case TC_ACT_RECLASSIFY: 
+               case TC_ACT_RECLASSIFY:
                case TC_ACT_OK:
                case TC_ACT_UNSPEC:
                default:
@@ -172,7 +172,7 @@ static int ingress_enqueue(struct sk_buff *skb,struct Qdisc *sch)
        };
 /* backward compat */
 #else
-#ifdef CONFIG_NET_CLS_POLICE  
+#ifdef CONFIG_NET_CLS_POLICE
        switch (result) {
                case TC_POLICE_SHOT:
                result = NF_DROP;
@@ -232,14 +232,14 @@ static unsigned int ingress_drop(struct Qdisc *sch)
 #ifdef CONFIG_NETFILTER
 static unsigned int
 ing_hook(unsigned int hook, struct sk_buff **pskb,
-                             const struct net_device *indev,
-                             const struct net_device *outdev,
-                            int (*okfn)(struct sk_buff *))
+                            const struct net_device *indev,
+                            const struct net_device *outdev,
+                            int (*okfn)(struct sk_buff *))
 {
-       
+
        struct Qdisc *q;
        struct sk_buff *skb = *pskb;
-        struct net_device *dev = skb->dev;
+       struct net_device *dev = skb->dev;
        int fwres=NF_ACCEPT;
 
        DPRINTK("ing_hook: skb %s dev=%s len=%u\n",
@@ -247,7 +247,7 @@ ing_hook(unsigned int hook, struct sk_buff **pskb,
                skb->dev ? (*pskb)->dev->name : "(no dev)",
                skb->len);
 
-/* 
+/*
 revisit later: Use a private since lock dev->queue_lock is also
 used on the egress (might slow things for an iota)
 */
@@ -257,8 +257,8 @@ used on the egress (might slow things for an iota)
                if ((q = dev->qdisc_ingress) != NULL)
                        fwres = q->enqueue(skb, q);
                spin_unlock(&dev->queue_lock);
-        }
-                       
+       }
+
        return fwres;
 }
 
@@ -296,7 +296,7 @@ static int ingress_init(struct Qdisc *sch,struct rtattr *opt)
        printk("Ingress scheduler: Classifier actions prefered over netfilter\n");
 #endif
 #endif
-                                                                                
+
 #ifndef CONFIG_NET_CLS_ACT
 #ifdef CONFIG_NETFILTER
        if (!nf_registered) {
@@ -417,7 +417,7 @@ static int __init ingress_module_init(void)
 
        return ret;
 }
-static void __exit ingress_module_exit(void) 
+static void __exit ingress_module_exit(void)
 {
        unregister_qdisc(&ingress_qdisc_ops);
 #ifndef CONFIG_NET_CLS_ACT
index 79542af9dab1fb3213778011d3222e34bd202e0c..1ccbfb55b0b8cf6f5e3ab76707cb1fc88e6f4015 100644 (file)
@@ -7,7 +7,7 @@
  *             2 of the License.
  *
  *             Many of the algorithms and ideas for this came from
- *             NIST Net which is not copyrighted. 
+ *             NIST Net which is not copyrighted.
  *
  * Authors:    Stephen Hemminger <shemminger@osdl.org>
  *             Catalin(ux aka Dino) BOIE <catab at umbrella dot ro>
@@ -114,7 +114,7 @@ static unsigned long get_crandom(struct crndstate *state)
  * std deviation sigma.  Uses table lookup to approximate the desired
  * distribution, and a uniformly-distributed pseudo-random source.
  */
-static long tabledist(unsigned long mu, long sigma, 
+static long tabledist(unsigned long mu, long sigma,
                      struct crndstate *state, const struct disttable *dist)
 {
        long t, x;
@@ -126,7 +126,7 @@ static long tabledist(unsigned long mu, long sigma,
        rnd = get_crandom(state);
 
        /* default uniform distribution */
-       if (dist == NULL) 
+       if (dist == NULL)
                return (rnd % (2*sigma)) - sigma + mu;
 
        t = dist->table[rnd % dist->size];
@@ -218,7 +218,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch)
                ++q->counter;
                ret = q->qdisc->enqueue(skb, q->qdisc);
        } else {
-               /* 
+               /*
                 * Do re-ordering by putting one out of N packets at the front
                 * of the queue.
                 */
@@ -323,7 +323,7 @@ static void netem_reset(struct Qdisc *sch)
 /* Pass size change message down to embedded FIFO */
 static int set_fifo_limit(struct Qdisc *q, int limit)
 {
-        struct rtattr *rta;
+       struct rtattr *rta;
        int ret = -ENOMEM;
 
        /* Hack to avoid sending change message to non-FIFO */
@@ -333,9 +333,9 @@ static int set_fifo_limit(struct Qdisc *q, int limit)
        rta = kmalloc(RTA_LENGTH(sizeof(struct tc_fifo_qopt)), GFP_KERNEL);
        if (rta) {
                rta->rta_type = RTM_NEWQDISC;
-               rta->rta_len = RTA_LENGTH(sizeof(struct tc_fifo_qopt)); 
+               rta->rta_len = RTA_LENGTH(sizeof(struct tc_fifo_qopt));
                ((struct tc_fifo_qopt *)RTA_DATA(rta))->limit = limit;
-               
+
                ret = q->ops->change(q, rta);
                kfree(rta);
        }
@@ -364,7 +364,7 @@ static int get_dist_table(struct Qdisc *sch, const struct rtattr *attr)
        d->size = n;
        for (i = 0; i < n; i++)
                d->table[i] = data[i];
-       
+
        spin_lock_bh(&sch->dev->queue_lock);
        d = xchg(&q->delay_dist, d);
        spin_unlock_bh(&sch->dev->queue_lock);
@@ -419,7 +419,7 @@ static int netem_change(struct Qdisc *sch, struct rtattr *opt)
        struct netem_sched_data *q = qdisc_priv(sch);
        struct tc_netem_qopt *qopt;
        int ret;
-       
+
        if (opt == NULL || RTA_PAYLOAD(opt) < sizeof(*qopt))
                return -EINVAL;
 
@@ -429,7 +429,7 @@ static int netem_change(struct Qdisc *sch, struct rtattr *opt)
                pr_debug("netem: can't set fifo limit\n");
                return ret;
        }
-       
+
        q->latency = qopt->latency;
        q->jitter = qopt->jitter;
        q->limit = qopt->limit;
@@ -445,10 +445,10 @@ static int netem_change(struct Qdisc *sch, struct rtattr *opt)
 
        /* Handle nested options after initial queue options.
         * Should have put all options in nested format but too late now.
-        */ 
+        */
        if (RTA_PAYLOAD(opt) > sizeof(*qopt)) {
                struct rtattr *tb[TCA_NETEM_MAX];
-               if (rtattr_parse(tb, TCA_NETEM_MAX, 
+               if (rtattr_parse(tb, TCA_NETEM_MAX,
                                 RTA_DATA(opt) + sizeof(*qopt),
                                 RTA_PAYLOAD(opt) - sizeof(*qopt)))
                        return -EINVAL;
@@ -681,7 +681,7 @@ static void netem_put(struct Qdisc *sch, unsigned long arg)
 {
 }
 
-static int netem_change_class(struct Qdisc *sch, u32 classid, u32 parentid, 
+static int netem_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
                            struct rtattr **tca, unsigned long *arg)
 {
        return -ENOSYS;
index 000e043ebd62df8c7dc00f2c516a7d190f1f7973..de889f23f22a5fdb29481c6696957e0832f95170 100644 (file)
@@ -7,7 +7,7 @@
  *             2 of the License, or (at your option) any later version.
  *
  * Authors:    Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
- * Fixes:       19990609: J Hadi Salim <hadi@nortelnetworks.com>: 
+ * Fixes:       19990609: J Hadi Salim <hadi@nortelnetworks.com>:
  *              Init --  EINVAL when opt undefined
  */
 
@@ -17,7 +17,6 @@
 #include <linux/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
@@ -105,7 +104,7 @@ prio_enqueue(struct sk_buff *skb, struct Qdisc *sch)
                return NET_XMIT_SUCCESS;
        }
        sch->qstats.drops++;
-       return ret; 
+       return ret;
 }
 
 
@@ -453,7 +452,7 @@ static int __init prio_module_init(void)
        return register_qdisc(&prio_qdisc_ops);
 }
 
-static void __exit prio_module_exit(void) 
+static void __exit prio_module_exit(void)
 {
        unregister_qdisc(&prio_qdisc_ops);
 }
index acddad08850fa65d1082e2d5377b8fd9d3956b4b..00db53eb8159ecadc156fe1eab669cf179d4008d 100644 (file)
@@ -185,7 +185,7 @@ static struct Qdisc *red_create_dflt(struct Qdisc *sch, u32 limit)
                              TC_H_MAKE(sch->handle, 1));
        if (q) {
                rta = kmalloc(RTA_LENGTH(sizeof(struct tc_fifo_qopt)),
-                             GFP_KERNEL);
+                             GFP_KERNEL);
                if (rta) {
                        rta->rta_type = RTM_NEWQDISC;
                        rta->rta_len = RTA_LENGTH(sizeof(struct tc_fifo_qopt));
index 82844801e4218e39956ad89c8d8169669e9e2325..66f32051a99b4b182adf0db17fdb0c29ae67c3c8 100644 (file)
@@ -53,7 +53,7 @@
        Queuing using Deficit Round Robin", Proc. SIGCOMM 95.
 
 
-       This is not the thing that is usually called (W)FQ nowadays. 
+       This is not the thing that is usually called (W)FQ nowadays.
        It does not use any timestamp mechanism, but instead
        processes queues in round-robin order.
 
@@ -63,7 +63,7 @@
 
        DRAWBACKS:
 
-       - "Stochastic" -> It is not 100% fair. 
+       - "Stochastic" -> It is not 100% fair.
        When hash collisions occur, several flows are considered as one.
 
        - "Round-robin" -> It introduces larger delays than virtual clock
@@ -501,7 +501,7 @@ static int __init sfq_module_init(void)
 {
        return register_qdisc(&sfq_qdisc_ops);
 }
-static void __exit sfq_module_exit(void) 
+static void __exit sfq_module_exit(void)
 {
        unregister_qdisc(&sfq_qdisc_ops);
 }
index ed9b6d93854086e004979a41e3b68a79135a02b5..85da8daa61d20a7c6130577c03c182d2d42ef213 100644 (file)
@@ -276,7 +276,7 @@ static void tbf_reset(struct Qdisc* sch)
 static struct Qdisc *tbf_create_dflt_qdisc(struct Qdisc *sch, u32 limit)
 {
        struct Qdisc *q;
-        struct rtattr *rta;
+       struct rtattr *rta;
        int ret;
 
        q = qdisc_create_dflt(sch->dev, &bfifo_qdisc_ops,
@@ -285,7 +285,7 @@ static struct Qdisc *tbf_create_dflt_qdisc(struct Qdisc *sch, u32 limit)
                rta = kmalloc(RTA_LENGTH(sizeof(struct tc_fifo_qopt)), GFP_KERNEL);
                if (rta) {
                        rta->rta_type = RTM_NEWQDISC;
-                       rta->rta_len = RTA_LENGTH(sizeof(struct tc_fifo_qopt)); 
+                       rta->rta_len = RTA_LENGTH(sizeof(struct tc_fifo_qopt));
                        ((struct tc_fifo_qopt *)RTA_DATA(rta))->limit = limit;
 
                        ret = q->ops->change(q, rta);
@@ -475,7 +475,7 @@ static void tbf_put(struct Qdisc *sch, unsigned long arg)
 {
 }
 
-static int tbf_change_class(struct Qdisc *sch, u32 classid, u32 parentid, 
+static int tbf_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
                            struct rtattr **tca, unsigned long *arg)
 {
        return -ENOSYS;
index 4c16ad57a3e49141335a2812b4c7bc3e976e9b46..587123c61af94b654460ef237f02d8e6f4059feb 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/bitops.h>
 #include <linux/types.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/socket.h>
@@ -178,7 +177,7 @@ teql_destroy(struct Qdisc* sch)
                                teql_neigh_release(xchg(&dat->ncache, NULL));
                                break;
                        }
-                               
+
                } while ((prev = q) != master->slaves);
        }
 }
@@ -292,7 +291,7 @@ restart:
 
        do {
                struct net_device *slave = q->dev;
-               
+
                if (slave->qdisc_sleeping != q)
                        continue;
                if (netif_queue_stopped(slave) || ! netif_running(slave)) {
@@ -425,7 +424,7 @@ static __init void teql_master_setup(struct net_device *dev)
 
        master->dev     = dev;
        ops->priv_size  = sizeof(struct teql_sched_data);
-       
+
        ops->enqueue    =       teql_enqueue;
        ops->dequeue    =       teql_dequeue;
        ops->requeue    =       teql_requeue;
@@ -489,7 +488,7 @@ static int __init teql_init(void)
        return i ? 0 : err;
 }
 
-static void __exit teql_exit(void) 
+static void __exit teql_exit(void)
 {
        struct teql_master *master, *nxt;
 
index 5db95caed0a321f2bc10bd11ec5061fa100c3df9..fa82b73c965bc17dadc5ecbaf90bd2f3dae06f21 100644 (file)
@@ -52,7 +52,6 @@
 #include <linux/fcntl.h>
 #include <linux/poll.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 
 #include <linux/slab.h>
 #include <linux/in.h>
@@ -158,14 +157,14 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a
         * 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]
+       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] = asoc->sackdelay;
        asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] =
                sp->autoclose * HZ;
-       
+
        /* Initilizes the timers */
        for (i = SCTP_EVENT_TIMEOUT_NONE; i < SCTP_NUM_TIMEOUT_TYPES; ++i) {
                init_timer(&asoc->timers[i]);
@@ -1334,8 +1333,8 @@ int sctp_assoc_set_bind_addr_from_cookie(struct sctp_association *asoc,
                                      asoc->ep->base.bind_addr.port, gfp);
 }
 
-/* Lookup laddr in the bind address list of an association. */ 
-int sctp_assoc_lookup_laddr(struct sctp_association *asoc, 
+/* Lookup laddr in the bind address list of an association. */
+int sctp_assoc_lookup_laddr(struct sctp_association *asoc,
                            const union sctp_addr *laddr)
 {
        int found;
@@ -1343,7 +1342,7 @@ int sctp_assoc_lookup_laddr(struct sctp_association *asoc,
        sctp_read_lock(&asoc->base.addr_lock);
        if ((asoc->base.bind_addr.port == ntohs(laddr->v4.sin_port)) &&
            sctp_bind_addr_match(&asoc->base.bind_addr, laddr,
-                                sctp_sk(asoc->base.sk))) {
+                                sctp_sk(asoc->base.sk))) {
                found = 1;
                goto out;
        }
index 00994158e4962997ba90a6ac9cdf7a00863bf9ea..fdb287a9e2e2c8c9b3baa97ca1ee11f8b59093eb 100644 (file)
@@ -43,7 +43,6 @@
  */
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/in.h>
 #include <net/sock.h>
 #include <net/ipv6.h>
@@ -62,7 +61,7 @@ static void sctp_bind_addr_clean(struct sctp_bind_addr *);
 /* Copy 'src' to 'dest' taking 'scope' into account.  Omit addresses
  * in 'src' which have a broader scope than 'scope'.
  */
-int sctp_bind_addr_copy(struct sctp_bind_addr *dest, 
+int sctp_bind_addr_copy(struct sctp_bind_addr *dest,
                        const struct sctp_bind_addr *src,
                        sctp_scope_t scope, gfp_t gfp,
                        int flags)
@@ -296,7 +295,7 @@ int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list,
  ********************************************************************/
 
 /* Does this contain a specified address?  Allow wildcarding. */
-int sctp_bind_addr_match(struct sctp_bind_addr *bp, 
+int sctp_bind_addr_match(struct sctp_bind_addr *bp,
                         const union sctp_addr *addr,
                         struct sctp_sock *opt)
 {
@@ -306,7 +305,7 @@ int sctp_bind_addr_match(struct sctp_bind_addr *bp,
        list_for_each(pos, &bp->address_list) {
                laddr = list_entry(pos, struct sctp_sockaddr_entry, list);
                if (opt->pf->cmp_addr(&laddr->a, addr, opt))
-                       return 1;
+                       return 1;
        }
 
        return 0;
@@ -329,12 +328,12 @@ union sctp_addr *sctp_find_unmatch_addr(struct sctp_bind_addr     *bp,
 
        list_for_each(pos, &bp->address_list) {
                laddr = list_entry(pos, struct sctp_sockaddr_entry, list);
-               
+
                addr_buf = (union sctp_addr *)addrs;
                for (i = 0; i < addrcnt; i++) {
                        addr = (union sctp_addr *)addr_buf;
                        af = sctp_get_af_specific(addr->v4.sin_family);
-                       if (!af) 
+                       if (!af)
                                return NULL;
 
                        if (opt->pf->cmp_addr(&laddr->a, addr, opt))
@@ -350,7 +349,7 @@ union sctp_addr *sctp_find_unmatch_addr(struct sctp_bind_addr       *bp,
 }
 
 /* Copy out addresses from the global local address list. */
-static int sctp_copy_one_addr(struct sctp_bind_addr *dest, 
+static int sctp_copy_one_addr(struct sctp_bind_addr *dest,
                              union sctp_addr *addr,
                              sctp_scope_t scope, gfp_t gfp,
                              int flags)
index 31f05ec8e1d3f32d71196ba5b5799f6b103318dc..59cf7b06d216c7450cbf1bec1f3965812d63fff8 100644 (file)
@@ -1,40 +1,40 @@
 /* SCTP kernel reference Implementation
  * Copyright (c) 1999-2001 Motorola, Inc.
  * Copyright (c) 2001-2003 International Business Machines, Corp.
- * 
+ *
  * This file is part of the SCTP kernel reference Implementation
- * 
+ *
  * SCTP Checksum functions
- * 
- * The SCTP reference implementation is free software; 
- * you can redistribute it and/or modify it under the terms of 
+ *
+ * The SCTP reference implementation 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.
- * 
- * The SCTP reference implementation is distributed in the hope that it 
+ *
+ * The SCTP reference implementation 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 GNU CC; see the file COPYING.  If not, write to
  * the Free Software Foundation, 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.  
- * 
+ * Boston, MA 02111-1307, USA.
+ *
  * Please send any bug reports or fixes you make to the
  * email address(es):
  *    lksctp developers <lksctp-developers@lists.sourceforge.net>
- * 
+ *
  * Or submit a bug report through the following website:
  *    http://www.sf.net/projects/lksctp
  *
- * Written or modified by: 
- *    Dinakaran Joseph 
+ * Written or modified by:
+ *    Dinakaran Joseph
  *    Jon Grimm <jgrimm@us.ibm.com>
  *    Sridhar Samudrala <sri@us.ibm.com>
- * 
+ *
  * Any bugs reported given to us we will try to fix... any fixes shared will
  * be incorporated into the next SCTP release.
  */
@@ -135,10 +135,10 @@ static const __u32 crc_c[256] = {
        0x79B737BA, 0x8BDCB4B9, 0x988C474D, 0x6AE7C44E,
        0xBE2DA0A5, 0x4C4623A6, 0x5F16D052, 0xAD7D5351,
 };
-     
+
 __u32 sctp_start_cksum(__u8 *buffer, __u16 length)
 {
-       __u32 crc32 = ~(__u32) 0;
+       __u32 crc32 = ~(__u32) 0;
        __u32 i;
 
        /* Optimize this routine to be SCTP specific, knowing how
@@ -147,7 +147,7 @@ __u32 sctp_start_cksum(__u8 *buffer, __u16 length)
 
        /* Calculate CRC up to the checksum. */
        for (i = 0; i < (sizeof(struct sctphdr) - sizeof(__u32)); i++)
-               CRC32C(crc32, buffer[i]);
+               CRC32C(crc32, buffer[i]);
 
        /* Skip checksum field of the header. */
        for (i = 0; i < sizeof(__u32); i++)
@@ -175,13 +175,13 @@ __u32 sctp_update_copy_cksum(__u8 *to, __u8 *from, __u16 length, __u32 crc32)
        __u32 i;
        __u32 *_to = (__u32 *)to;
        __u32 *_from = (__u32 *)from;
-       
+
        for (i = 0; i < (length/4); i++) {
                _to[i] = _from[i];
                CRC32C(crc32, from[i*4]);
                CRC32C(crc32, from[i*4+1]);
                CRC32C(crc32, from[i*4+2]);
-               CRC32C(crc32, from[i*4+3]);     
+               CRC32C(crc32, from[i*4+3]);
        }
 
        return crc32;
index aa8340373af7f1596e66f93ab418d87bda9052d0..5f5ab28977c9c83c54ff081c2b98d10a05872e74 100644 (file)
@@ -3,48 +3,48 @@
  * Copyright (c) 1999-2000 Cisco, Inc.
  * Copyright (c) 1999-2001 Motorola, Inc.
  * Copyright (c) 2001 Intel Corp.
- * 
+ *
  * This file is part of the SCTP kernel reference Implementation
- * 
+ *
  * This file is part of the implementation of the add-IP extension,
  * based on <draft-ietf-tsvwg-addip-sctp-02.txt> June 29, 2001,
  * for the SCTP kernel reference Implementation.
- * 
+ *
  * This file converts numerical ID value to alphabetical names for SCTP
  * terms such as chunk type, parameter time, event type, etc.
- * 
- * The SCTP reference implementation is free software; 
- * you can redistribute it and/or modify it under the terms of 
+ *
+ * The SCTP reference implementation 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.
- * 
- * The SCTP reference implementation is distributed in the hope that it 
+ *
+ * The SCTP reference implementation 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 GNU CC; see the file COPYING.  If not, write to
  * the Free Software Foundation, 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.  
- * 
+ * Boston, MA 02111-1307, USA.
+ *
  * Please send any bug reports or fixes you make to the
  * email address(es):
  *    lksctp developers <lksctp-developers@lists.sourceforge.net>
- * 
+ *
  * Or submit a bug report through the following website:
  *    http://www.sf.net/projects/lksctp
  *
- * Written or modified by: 
+ * Written or modified by:
  *    La Monte H.P. Yarroll <piggy@acm.org>
  *    Karl Knutson          <karl@athena.chicago.il.us>
  *    Xingang Guo           <xingang.guo@intel.com>
  *    Jon Grimm             <jgrimm@us.ibm.com>
  *    Daisy Chang          <daisyc@us.ibm.com>
  *    Sridhar Samudrala            <sri@us.ibm.com>
- * 
+ *
  * Any bugs reported given to us we will try to fix... any fixes shared will
  * be incorporated into the next SCTP release.
  */
@@ -81,7 +81,7 @@ const char *sctp_cname(const sctp_subtype_t cid)
                return "illegal chunk id";
        if (cid.chunk <= SCTP_CID_BASE_MAX)
                return sctp_cid_tbl[cid.chunk];
-       
+
        switch (cid.chunk) {
        case SCTP_CID_ASCONF:
                return "ASCONF";
@@ -154,7 +154,7 @@ const char *sctp_pname(const sctp_subtype_t id)
 
 static const char *sctp_other_tbl[] = {
        "NO_PENDING_TSN",
-        "ICMP_PROTO_UNREACH",
+       "ICMP_PROTO_UNREACH",
 };
 
 /* Lookup "other" debug name. */
index 129756908da49992b5a42e07b84f7521a778e891..1404a9e2e78f1686487ac97142715455b16df42d 100644 (file)
@@ -50,7 +50,6 @@
  */
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/in.h>
 #include <linux/random.h>      /* get_random_bytes() */
@@ -369,7 +368,7 @@ static void sctp_endpoint_bh_rcv(struct work_struct *work)
                        chunk->transport->last_time_heard = jiffies;
 
                error = sctp_do_sm(SCTP_EVENT_T_CHUNK, subtype, state,
-                                   ep, asoc, chunk, GFP_ATOMIC);
+                                  ep, asoc, chunk, GFP_ATOMIC);
 
                if (error && chunk)
                        chunk->pdiscard = 1;
index 33111873a488eaf78b63907d73da6ce6ad9cc9fd..71db66873695ffadeed4ac18cc68454dfbc7ab44 100644 (file)
@@ -226,7 +226,7 @@ int sctp_rcv(struct sk_buff *skb)
        nf_reset(skb);
 
        if (sk_filter(sk, skb))
-                goto discard_release;
+               goto discard_release;
 
        /* Create an SCTP packet structure. */
        chunk = sctp_chunkify(skb, asoc, sk);
@@ -293,11 +293,11 @@ discard_release:
 int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb)
 {
        struct sctp_chunk *chunk = SCTP_INPUT_CB(skb)->chunk;
-       struct sctp_inq *inqueue = &chunk->rcvr->inqueue;
-       struct sctp_ep_common *rcvr = NULL;
+       struct sctp_inq *inqueue = &chunk->rcvr->inqueue;
+       struct sctp_ep_common *rcvr = NULL;
        int backloged = 0;
 
-       rcvr = chunk->rcvr;
+       rcvr = chunk->rcvr;
 
        /* If the rcvr is dead then the association or endpoint
         * has been deleted and we can safely drop the chunk
@@ -347,7 +347,7 @@ done:
        else
                BUG();
 
-        return 0;
+       return 0;
 }
 
 static void sctp_add_backlog(struct sock *sk, struct sk_buff *skb)
@@ -399,7 +399,7 @@ void sctp_icmp_frag_needed(struct sock *sk, struct sctp_association *asoc,
         * Normally, if PMTU discovery is disabled, an ICMP Fragmentation
         * Needed will never be sent, but if a message was sent before
         * PMTU discovery was disabled that was larger than the PMTU, it
-        * would not be fragmented, so it must be re-transmitted fragmented.     
+        * would not be fragmented, so it must be re-transmitted fragmented.
         */
        sctp_retransmit(&asoc->outqueue, t, SCTP_RTXR_PMTUD);
 }
@@ -416,8 +416,8 @@ void sctp_icmp_frag_needed(struct sock *sk, struct sctp_association *asoc,
  *
  */
 void sctp_icmp_proto_unreachable(struct sock *sk,
-                           struct sctp_association *asoc,
-                           struct sctp_transport *t)
+                          struct sctp_association *asoc,
+                          struct sctp_transport *t)
 {
        SCTP_DEBUG_PRINTK("%s\n",  __FUNCTION__);
 
index 71b07466e880415ce812ca0b55e4f90e37f67ab9..c30629e177814cc1313f7a710999ffdfe67b873c 100644 (file)
@@ -2,43 +2,43 @@
  * Copyright (c) 1999-2000 Cisco, Inc.
  * Copyright (c) 1999-2001 Motorola, Inc.
  * Copyright (c) 2002 International Business Machines, Corp.
- * 
+ *
  * This file is part of the SCTP kernel reference Implementation
- * 
+ *
  * These functions are the methods for accessing the SCTP inqueue.
  *
  * An SCTP inqueue is a queue into which you push SCTP packets
  * (which might be bundles or fragments of chunks) and out of which you
  * pop SCTP whole chunks.
- * 
- * The SCTP reference implementation is free software; 
- * you can redistribute it and/or modify it under the terms of 
+ *
+ * The SCTP reference implementation 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.
- * 
- * The SCTP reference implementation is distributed in the hope that it 
+ *
+ * The SCTP reference implementation 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 GNU CC; see the file COPYING.  If not, write to
  * the Free Software Foundation, 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.  
- * 
+ * Boston, MA 02111-1307, USA.
+ *
  * Please send any bug reports or fixes you make to the
  * email address(es):
  *    lksctp developers <lksctp-developers@lists.sourceforge.net>
- * 
+ *
  * Or submit a bug report through the following website:
  *    http://www.sf.net/projects/lksctp
  *
- * Written or modified by: 
+ * Written or modified by:
  *    La Monte H.P. Yarroll <piggy@acm.org>
  *    Karl Knutson <karl@athena.chicago.il.us>
- * 
+ *
  * Any bugs reported given to us we will try to fix... any fixes shared will
  * be incorporated into the next SCTP release.
  */
@@ -152,8 +152,8 @@ struct sctp_chunk *sctp_inq_pop(struct sctp_inq *queue)
                chunk->data_accepted = 0;
        }
 
-        chunk->chunk_hdr = ch;
-        chunk->chunk_end = ((__u8 *)ch) + WORD_ROUND(ntohs(ch->length));
+       chunk->chunk_hdr = ch;
+       chunk->chunk_end = ((__u8 *)ch) + WORD_ROUND(ntohs(ch->length));
        /* In the unlikely case of an IP reassembly, the skb could be
         * non-linear. If so, update chunk_end so that it doesn't go past
         * the skb->tail.
@@ -169,11 +169,11 @@ struct sctp_chunk *sctp_inq_pop(struct sctp_inq *queue)
                /* This is not a singleton */
                chunk->singleton = 0;
        } else if (chunk->chunk_end > chunk->skb->tail) {
-                /* RFC 2960, Section 6.10  Bundling
+               /* RFC 2960, Section 6.10  Bundling
                 *
                 * Partial chunks MUST NOT be placed in an SCTP packet.
                 * If the receiver detects a partial chunk, it MUST drop
-                * the chunk.  
+                * the chunk.
                 *
                 * Since the end of the chunk is past the end of our buffer
                 * (which contains the whole packet, we can freely discard
index ef36be073a139418ef7e50942150eaa7f4acfcaf..63fe1093b61635f06ecfc821e2c3caf6e68524eb 100644 (file)
@@ -53,7 +53,6 @@
 #include <linux/socket.h>
 #include <linux/sockios.h>
 #include <linux/net.h>
-#include <linux/sched.h>
 #include <linux/in.h>
 #include <linux/in6.h>
 #include <linux/netdevice.h>
@@ -236,7 +235,7 @@ static struct dst_entry *sctp_v6_get_dst(struct sctp_association *asoc,
        ipv6_addr_copy(&fl.fl6_dst, &daddr->v6.sin6_addr);
        if (ipv6_addr_type(&daddr->v6.sin6_addr) & IPV6_ADDR_LINKLOCAL)
                fl.oif = daddr->v6.sin6_scope_id;
-       
+
 
        SCTP_DEBUG_PRINTK("%s: DST=" NIP6_FMT " ",
                          __FUNCTION__, NIP6(fl.fl6_dst));
index 8ff588f0d76af8343820d6020118c7d48570eae4..fcfb9d806de1137d3b5fb7e1e3beab4e79a94933 100644 (file)
@@ -1,39 +1,39 @@
 /* SCTP kernel reference Implementation
  * (C) Copyright IBM Corp. 2001, 2004
- * 
+ *
  * This file is part of the SCTP kernel reference Implementation
- * 
+ *
  * Support for memory object debugging.  This allows one to monitor the
- * object allocations/deallocations for types instrumented for this 
- * via the proc fs. 
- * 
- * The SCTP reference implementation is free software; 
- * you can redistribute it and/or modify it under the terms of 
+ * object allocations/deallocations for types instrumented for this
+ * via the proc fs.
+ *
+ * The SCTP reference implementation 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.
- * 
- * The SCTP reference implementation is distributed in the hope that it 
+ *
+ * The SCTP reference implementation 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 GNU CC; see the file COPYING.  If not, write to
  * the Free Software Foundation, 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.  
- * 
+ * Boston, MA 02111-1307, USA.
+ *
  * Please send any bug reports or fixes you make to the
  * email address(es):
  *    lksctp developers <lksctp-developers@lists.sourceforge.net>
- * 
+ *
  * Or submit a bug report through the following website:
  *    http://www.sf.net/projects/lksctp
  *
- * Written or modified by: 
+ * Written or modified by:
  *    Jon Grimm             <jgrimm@us.ibm.com>
- * 
+ *
  * Any bugs reported given to us we will try to fix... any fixes shared will
  * be incorporated into the next SCTP release.
  */
@@ -121,7 +121,7 @@ done:
        if (len > length)
                len = length;
 
-       return len;
+       return len;
 }
 
 /* Initialize the objcount in the proc filesystem.  */
@@ -131,7 +131,7 @@ void sctp_dbg_objcnt_init(void)
        ent = create_proc_read_entry("sctp_dbg_objcnt", 0, proc_net_sctp,
                               sctp_dbg_objcnt_read, NULL);
        if (!ent)
-               printk(KERN_WARNING 
+               printk(KERN_WARNING
                        "sctp_dbg_objcnt: Unable to create /proc entry.\n");
 }
 
index 3ef4351dd956ad95649afd568b3a91381a86e730..f875fc3ced5498f012996eaf7d39d4039c149642 100644 (file)
@@ -85,8 +85,8 @@ struct sctp_packet *sctp_packet_config(struct sctp_packet *packet,
                chunk = sctp_get_ecne_prepend(packet->transport->asoc);
 
                /* If there a is a prepend chunk stick it on the list before
-                * any other chunks get appended.
-                */
+                * any other chunks get appended.
+                */
                if (chunk)
                        sctp_packet_append_chunk(packet, chunk);
        }
@@ -110,8 +110,8 @@ struct sctp_packet *sctp_packet_init(struct sctp_packet *packet,
        packet->destination_port = dport;
        INIT_LIST_HEAD(&packet->chunk_list);
        if (asoc) {
-               struct sctp_sock *sp = sctp_sk(asoc->base.sk);  
-               overhead = sp->pf->af->net_header_len; 
+               struct sctp_sock *sp = sctp_sk(asoc->base.sk);
+               overhead = sp->pf->af->net_header_len;
        } else {
                overhead = sizeof(struct ipv6hdr);
        }
@@ -442,7 +442,7 @@ int sctp_packet_transmit(struct sctp_packet *packet)
                 * acknowledged or have failed.
                 */
                if (!sctp_chunk_is_data(chunk))
-                       sctp_chunk_free(chunk);
+                       sctp_chunk_free(chunk);
        }
 
        /* Perform final transformation on checksum. */
@@ -528,7 +528,7 @@ err:
        list_for_each_entry_safe(chunk, tmp, &packet->chunk_list, list) {
                list_del_init(&chunk->list);
                if (!sctp_chunk_is_data(chunk))
-                       sctp_chunk_free(chunk);
+                       sctp_chunk_free(chunk);
        }
        goto out;
 nomem:
index fba567a7cb64343dad79285057f0ae8d9a384b98..5c2ddd10db065629139d0544cc439ffa42e10687 100644 (file)
@@ -376,7 +376,7 @@ static void sctp_insert_list(struct list_head *head, struct list_head *new)
                }
        }
        if (!done)
-               list_add_tail(new, head); 
+               list_add_tail(new, head);
 }
 
 /* Mark all the eligible packets on a transport for retransmission.  */
@@ -578,7 +578,7 @@ static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt,
                        break;
 
                case SCTP_XMIT_RWND_FULL:
-                       /* Send this packet. */
+                       /* Send this packet. */
                        if ((error = sctp_packet_transmit(pkt)) == 0)
                                *start_timer = 1;
 
@@ -590,7 +590,7 @@ static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt,
                        break;
 
                case SCTP_XMIT_NAGLE_DELAY:
-                       /* Send this packet. */
+                       /* Send this packet. */
                        if ((error = sctp_packet_transmit(pkt)) == 0)
                                *start_timer = 1;
 
@@ -605,7 +605,7 @@ static int sctp_outq_flush_rtx(struct sctp_outq *q, struct sctp_packet *pkt,
                         */
                        list_add_tail(lchunk, &transport->transmitted);
 
-                       /* Mark the chunk as ineligible for fast retransmit 
+                       /* Mark the chunk as ineligible for fast retransmit
                         * after it is retransmitted.
                         */
                        if (chunk->fast_retransmit > 0)
@@ -703,11 +703,11 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
                         * inactive.
                         *
                         * 3.3.6 Heartbeat Acknowledgement:
-                        * ...  
+                        * ...
                         * A HEARTBEAT ACK is always sent to the source IP
                         * address of the IP datagram containing the
                         * HEARTBEAT chunk to which this ack is responding.
-                        * ...  
+                        * ...
                         */
                        if (chunk->chunk_hdr->type != SCTP_CID_HEARTBEAT &&
                            chunk->chunk_hdr->type != SCTP_CID_HEARTBEAT_ACK)
@@ -914,7 +914,7 @@ int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
                                BUG();
                        }
 
-                       /* BUG: We assume that the sctp_packet_transmit() 
+                       /* BUG: We assume that the sctp_packet_transmit()
                         * call below will succeed all the time and add the
                         * chunk to the transmitted list and restart the
                         * timers.
@@ -1266,7 +1266,7 @@ static void sctp_check_transmitted(struct sctp_outq *q,
                                 * first instance of the packet or a later
                                 * instance).
                                 */
-                               if (!tchunk->tsn_gap_acked &&
+                               if (!tchunk->tsn_gap_acked &&
                                    !tchunk->resent &&
                                    tchunk->rtt_in_progress) {
                                        tchunk->rtt_in_progress = 0;
@@ -1275,7 +1275,7 @@ static void sctp_check_transmitted(struct sctp_outq *q,
                                                                  rtt);
                                }
                        }
-                        if (TSN_lte(tsn, sack_ctsn)) {
+                       if (TSN_lte(tsn, sack_ctsn)) {
                                /* RFC 2960  6.3.2 Retransmission Timer Rules
                                 *
                                 * R3) Whenever a SACK is received
@@ -1590,7 +1590,7 @@ static void sctp_mark_missing(struct sctp_outq *q,
                SCTP_DEBUG_PRINTK("%s: transport: %p, cwnd: %d, "
                                  "ssthresh: %d, flight_size: %d, pba: %d\n",
                                  __FUNCTION__, transport, transport->cwnd,
-                                 transport->ssthresh, transport->flight_size,
+                                 transport->ssthresh, transport->flight_size,
                                  transport->partial_bytes_acked);
        }
 }
@@ -1603,7 +1603,7 @@ static int sctp_acked(struct sctp_sackhdr *sack, __u32 tsn)
        __u16 gap;
        __u32 ctsn = ntohl(sack->cum_tsn_ack);
 
-        if (TSN_lte(tsn, ctsn))
+       if (TSN_lte(tsn, ctsn))
                goto pass;
 
        /* 3.3.4 Selective Acknowledgement (SACK) (3):
@@ -1657,7 +1657,7 @@ static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn)
 
        /* PR-SCTP C1) Let SackCumAck be the Cumulative TSN ACK carried in the
         * received SACK.
-        * 
+        *
         * If (Advanced.Peer.Ack.Point < SackCumAck), then update
         * Advanced.Peer.Ack.Point to be equal to SackCumAck.
         */
@@ -1671,7 +1671,7 @@ static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn)
         *
         * Assuming that a SACK arrived with the Cumulative TSN ACK 102
         * and the Advanced.Peer.Ack.Point is updated to this value:
-        * 
+        *
         *   out-queue at the end of  ==>   out-queue after Adv.Ack.Point
         *   normal SACK processing           local advancement
         *                ...                           ...
@@ -1692,7 +1692,7 @@ static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn)
 
                /* Remove any chunks in the abandoned queue that are acked by
                 * the ctsn.
-                */ 
+                */
                if (TSN_lte(tsn, ctsn)) {
                        list_del_init(lchunk);
                        if (!chunk->tsn_gap_acked) {
@@ -1743,7 +1743,7 @@ static void sctp_generate_fwdtsn(struct sctp_outq *q, __u32 ctsn)
         */
        if (asoc->adv_peer_ack_point > ctsn)
                ftsn_chunk = sctp_make_fwdtsn(asoc, asoc->adv_peer_ack_point,
-                                             nskips, &ftsn_skip_arr[0]); 
+                                             nskips, &ftsn_skip_arr[0]);
 
        if (ftsn_chunk) {
                list_add_tail(&ftsn_chunk->list, &q->control_chunk_list);
index 3a7ebfcc1fdbc6eb9fa8837fbf8017d373228780..1b2976d34ac759212a24d2aa1ee97cfcb1e2cd87 100644 (file)
@@ -70,7 +70,7 @@ int sctp_primitive_ ## name(struct sctp_association *asoc, \
        \
        error = sctp_do_sm(event_type, subtype, state, ep, asoc, \
                           arg, GFP_KERNEL); \
-       return error; \
+       return error; \
 }
 
 /* 10.1 ULP-to-SCTP
@@ -207,7 +207,7 @@ DECLARE_PRIMITIVE(REQUESTHEARTBEAT);
 
 /* ADDIP
 * 3.1.1 Address Configuration Change Chunk (ASCONF)
-* 
+*
 * This chunk is used to communicate to the remote endpoint one of the
 * configuration change requests that MUST be acknowledged.  The
 * information carried in the ASCONF Chunk uses the form of a
index b3493bdbcacbc884cabedc055c3cd82f5097850e..2f12bf2d8d3c622f5f134cf1fa3308d7fab015fd 100644 (file)
@@ -77,7 +77,7 @@ static struct snmp_mib sctp_snmp_list[] = {
 
 /* Return the current value of a particular entry in the mib by adding its
  * per cpu counters.
- */ 
+ */
 static unsigned long
 fold_field(void *mib[], int nr)
 {
@@ -102,7 +102,7 @@ static int sctp_snmp_seq_show(struct seq_file *seq, void *v)
 
        for (i = 0; sctp_snmp_list[i].name != NULL; i++)
                seq_printf(seq, "%-32s\t%ld\n", sctp_snmp_list[i].name,
-                          fold_field((void **)sctp_statistics, 
+                          fold_field((void **)sctp_statistics,
                                      sctp_snmp_list[i].entry));
 
        return 0;
@@ -114,7 +114,7 @@ static int sctp_snmp_seq_open(struct inode *inode, struct file *file)
        return single_open(file, sctp_snmp_seq_show, NULL);
 }
 
-static struct file_operations sctp_snmp_seq_fops = {
+static const struct file_operations sctp_snmp_seq_fops = {
        .owner   = THIS_MODULE,
        .open    = sctp_snmp_seq_open,
        .read    = seq_read,
@@ -264,7 +264,7 @@ static int sctp_eps_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &sctp_eps_ops);
 }
 
-static struct file_operations sctp_eps_seq_fops = {
+static const struct file_operations sctp_eps_seq_fops = {
        .open    = sctp_eps_seq_open,
        .read    = seq_read,
        .llseek  = seq_lseek,
@@ -374,7 +374,7 @@ static int sctp_assocs_seq_open(struct inode *inode, struct file *file)
        return seq_open(file, &sctp_assoc_ops);
 }
 
-static struct file_operations sctp_assocs_seq_fops = {
+static const struct file_operations sctp_assocs_seq_fops = {
        .open    = sctp_assocs_seq_open,
        .read    = seq_read,
        .llseek  = seq_lseek,
index 0ef48126b117c76267208833f76c96c84fa814bb..e17a823ca90fcecc1d6e5da68d7ad6b9ea70eeee 100644 (file)
@@ -102,11 +102,11 @@ static __init int sctp_proc_init(void)
        }
 
        if (sctp_snmp_proc_init())
-               goto out_nomem; 
+               goto out_nomem;
        if (sctp_eps_proc_init())
-               goto out_nomem; 
+               goto out_nomem;
        if (sctp_assocs_proc_init())
-               goto out_nomem; 
+               goto out_nomem;
 
        return 0;
 
@@ -114,7 +114,7 @@ out_nomem:
        return -ENOMEM;
 }
 
-/* Clean up the proc fs entry for the SCTP protocol. 
+/* Clean up the proc fs entry for the SCTP protocol.
  * Note: Do not make this __exit as it is used in the init error
  * path.
  */
@@ -286,7 +286,7 @@ static int sctp_v4_to_addr_param(const union sctp_addr *addr,
 
        param->v4.param_hdr.type = SCTP_PARAM_IPV4_ADDRESS;
        param->v4.param_hdr.length = htons(length);
-       param->v4.addr.s_addr = addr->v4.sin_addr.s_addr;       
+       param->v4.addr.s_addr = addr->v4.sin_addr.s_addr;
 
        return length;
 }
@@ -344,9 +344,9 @@ static int sctp_v4_addr_valid(union sctp_addr *addr,
        if (IS_IPV4_UNUSABLE_ADDRESS(&addr->v4.sin_addr.s_addr))
                return 0;
 
-       /* Is this a broadcast address? */
-       if (skb && ((struct rtable *)skb->dst)->rt_flags & RTCF_BROADCAST)
-               return 0;
+       /* Is this a broadcast address? */
+       if (skb && ((struct rtable *)skb->dst)->rt_flags & RTCF_BROADCAST)
+               return 0;
 
        return 1;
 }
@@ -494,7 +494,7 @@ out_unlock:
 out:
        if (dst)
                SCTP_DEBUG_PRINTK("rt_dst:%u.%u.%u.%u, rt_src:%u.%u.%u.%u\n",
-                                 NIPQUAD(rt->rt_dst), NIPQUAD(rt->rt_src));
+                                 NIPQUAD(rt->rt_dst), NIPQUAD(rt->rt_src));
        else
                SCTP_DEBUG_PRINTK("NO ROUTE\n");
 
@@ -517,14 +517,14 @@ static void sctp_v4_get_saddr(struct sctp_association *asoc,
        if (rt) {
                saddr->v4.sin_family = AF_INET;
                saddr->v4.sin_port = htons(asoc->base.bind_addr.port);
-               saddr->v4.sin_addr.s_addr = rt->rt_src; 
+               saddr->v4.sin_addr.s_addr = rt->rt_src;
        }
 }
 
 /* What interface did this skb arrive on? */
 static int sctp_v4_skb_iif(const struct sk_buff *skb)
 {
-       return ((struct rtable *)skb->dst)->rt_iif;
+       return ((struct rtable *)skb->dst)->rt_iif;
 }
 
 /* Was this packet marked by Explicit Congestion Notification? */
@@ -569,7 +569,7 @@ static struct sock *sctp_v4_create_accept_sk(struct sock *sk,
        newinet->dport = htons(asoc->peer.port);
        newinet->daddr = asoc->peer.primary_addr.v4.sin_addr.s_addr;
        newinet->pmtudisc = inet->pmtudisc;
-       newinet->id = asoc->next_tsn ^ jiffies;
+       newinet->id = asoc->next_tsn ^ jiffies;
 
        newinet->uc_ttl = -1;
        newinet->mc_loop = 1;
index 0b1ddb1005acf3ba451faa15bf0ff8237f211a1f..f7fb29d5a0c728ea83cad16b54bfe6671b06d81d 100644 (file)
@@ -118,7 +118,7 @@ void  sctp_init_cause(struct sctp_chunk *chunk, __be16 cause_code,
        int padlen;
        __u16 len;
 
-        /* Cause code constants are now defined in network order.  */
+       /* Cause code constants are now defined in network order.  */
        err.cause = cause_code;
        len = sizeof(sctp_errhdr_t) + paylen;
        padlen = len % 4;
@@ -295,11 +295,11 @@ struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc,
         */
        chunksize = sizeof(initack) + addrs_len + cookie_len + unkparam_len;
 
-        /* Tell peer that we'll do ECN only if peer advertised such cap.  */
+       /* Tell peer that we'll do ECN only if peer advertised such cap.  */
        if (asoc->peer.ecn_capable)
                chunksize += sizeof(ecap_param);
 
-        /* Tell peer that we'll do PR-SCTP only if peer advertised.  */
+       /* Tell peer that we'll do PR-SCTP only if peer advertised.  */
        if (asoc->peer.prsctp_capable)
                chunksize += sizeof(prsctp_param);
 
@@ -728,7 +728,7 @@ struct sctp_chunk *sctp_make_shutdown_complete(
        if (retval && chunk)
                retval->transport = chunk->transport;
 
-        return retval;
+       return retval;
 }
 
 /* Create an ABORT.  Note that we set the T bit if we have no
@@ -844,7 +844,7 @@ err_chunk:
        return retval;
 }
 
-/* Make an ABORT chunk with a PROTOCOL VIOLATION cause code. */ 
+/* Make an ABORT chunk with a PROTOCOL VIOLATION cause code. */
 struct sctp_chunk *sctp_make_abort_violation(
        const struct sctp_association *asoc,
        const struct sctp_chunk *chunk,
@@ -979,11 +979,10 @@ struct sctp_chunk *sctp_chunkify(struct sk_buff *skb,
 {
        struct sctp_chunk *retval;
 
-       retval = kmem_cache_alloc(sctp_chunk_cachep, GFP_ATOMIC);
+       retval = kmem_cache_zalloc(sctp_chunk_cachep, GFP_ATOMIC);
 
        if (!retval)
                goto nodata;
-       memset(retval, 0, sizeof(struct sctp_chunk));
 
        if (!sk) {
                SCTP_DEBUG_PRINTK("chunkifying skb %p w/o an sk\n", skb);
@@ -1265,8 +1264,8 @@ static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep,
        /* Header size is static data prior to the actual cookie, including
         * any padding.
         */
-       headersize = sizeof(sctp_paramhdr_t) + 
-                    (sizeof(struct sctp_signed_cookie) - 
+       headersize = sizeof(sctp_paramhdr_t) +
+                    (sizeof(struct sctp_signed_cookie) -
                      sizeof(struct sctp_cookie));
        bodysize = sizeof(struct sctp_cookie)
                + ntohs(init_chunk->chunk_hdr->length) + addrs_len;
@@ -1315,7 +1314,7 @@ static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep,
        memcpy((__u8 *)&cookie->c.peer_init[0] +
               ntohs(init_chunk->chunk_hdr->length), raw_addrs, addrs_len);
 
-       if (sctp_sk(ep->base.sk)->hmac) {
+       if (sctp_sk(ep->base.sk)->hmac) {
                struct hash_desc desc;
 
                /* Sign the message.  */
@@ -1324,8 +1323,8 @@ static sctp_cookie_param_t *sctp_pack_cookie(const struct sctp_endpoint *ep,
                sg.length = bodysize;
                keylen = SCTP_SECRET_SIZE;
                key = (char *)ep->secret_key[ep->current_key];
-               desc.tfm = sctp_sk(ep->base.sk)->hmac;
-               desc.flags = 0;
+               desc.tfm = sctp_sk(ep->base.sk)->hmac;
+               desc.flags = 0;
 
                if (crypto_hash_setkey(desc.tfm, key, keylen) ||
                    crypto_hash_digest(&desc, &sg, bodysize, cookie->signature))
@@ -1365,7 +1364,7 @@ struct sctp_association *sctp_unpack_cookie(
         * any padding.
         */
        headersize = sizeof(sctp_chunkhdr_t) +
-                    (sizeof(struct sctp_signed_cookie) - 
+                    (sizeof(struct sctp_signed_cookie) -
                      sizeof(struct sctp_cookie));
        bodysize = ntohs(chunk->chunk_hdr->length) - headersize;
        fixed_size = headersize + sizeof(struct sctp_cookie);
@@ -1593,7 +1592,7 @@ static int sctp_process_inv_paramlength(const struct sctp_association *asoc,
                                        struct sctp_chunk **errp)
 {
        char            error[] = "The following parameter had invalid length:";
-       size_t          payload_len = WORD_ROUND(sizeof(error)) + 
+       size_t          payload_len = WORD_ROUND(sizeof(error)) +
                                                sizeof(sctp_paramhdr_t);
 
 
@@ -1752,7 +1751,7 @@ static int sctp_verify_param(const struct sctp_association *asoc,
        case SCTP_PARAM_FWD_TSN_SUPPORT:
                if (sctp_prsctp_enable)
                        break;
-               /* Fall Through */ 
+               /* Fall Through */
        default:
                SCTP_DEBUG_PRINTK("Unrecognized param: %d for chunk %d.\n",
                                ntohs(param.p->type), cid);
@@ -1861,7 +1860,7 @@ int sctp_process_init(struct sctp_association *asoc, sctp_cid_t cid,
        sctp_walk_params(param, peer_init, init_hdr.params) {
 
                if (!sctp_process_param(asoc, param, peer_addr, gfp))
-                        goto clean_up;
+                       goto clean_up;
        }
 
        /* Walk list of transports, removing transports in the UNKNOWN state. */
@@ -1937,7 +1936,7 @@ int sctp_process_init(struct sctp_association *asoc, sctp_cid_t cid,
         */
 
        /* Allocate storage for the negotiated streams if it is not a temporary
-        * association.
+        * association.
         */
        if (!asoc->temp) {
                int assoc_id;
@@ -2109,7 +2108,7 @@ static int sctp_process_param(struct sctp_association *asoc,
                        asoc->peer.prsctp_capable = 1;
                        break;
                }
-               /* Fall Through */ 
+               /* Fall Through */
        default:
                /* Any unrecognized parameters should have been caught
                 * and handled by sctp_verify_param() which should be
@@ -2168,7 +2167,7 @@ __u32 sctp_generate_tsn(const struct sctp_endpoint *ep)
  *     |                     ASCONF Parameter #N                       |
  *      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  *
- * Address Parameter and other parameter will not be wrapped in this function 
+ * Address Parameter and other parameter will not be wrapped in this function
  */
 static struct sctp_chunk *sctp_make_asconf(struct sctp_association *asoc,
                                           union sctp_addr *addr,
@@ -2290,7 +2289,7 @@ struct sctp_chunk *sctp_make_asconf_update_ip(struct sctp_association *asoc,
  *     |                       Address Parameter                       |
  *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  *
- * Create an ASCONF chunk with Set Primary IP address parameter. 
+ * Create an ASCONF chunk with Set Primary IP address parameter.
  */
 struct sctp_chunk *sctp_make_asconf_set_prim(struct sctp_association *asoc,
                                             union sctp_addr *addr)
@@ -2339,7 +2338,7 @@ struct sctp_chunk *sctp_make_asconf_set_prim(struct sctp_association *asoc,
  *     |                 ASCONF Parameter Response#N                   |
  *     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  *
- * Create an ASCONF_ACK chunk with enough space for the parameter responses. 
+ * Create an ASCONF_ACK chunk with enough space for the parameter responses.
  */
 static struct sctp_chunk *sctp_make_asconf_ack(const struct sctp_association *asoc,
                                               __u32 serial, int vparam_len)
@@ -2381,7 +2380,7 @@ static void sctp_add_asconf_response(struct sctp_chunk *chunk, __be32 crr_id,
                                 ntohs(asconf_param->param_hdr.length);
        }
 
-       /* Add Success Indication or Error Cause Indication parameter. */ 
+       /* Add Success Indication or Error Cause Indication parameter. */
        ack_param.param_hdr.type = response_type;
        ack_param.param_hdr.length = htons(sizeof(ack_param) +
                                           err_param_len +
@@ -2424,11 +2423,11 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
        switch (asconf_param->param_hdr.type) {
        case SCTP_PARAM_ADD_IP:
                /* ADDIP 4.3 D9) If an endpoint receives an ADD IP address
-                * request and does not have the local resources to add this
-                * new address to the association, it MUST return an Error
-                * Cause TLV set to the new error code 'Operation Refused
-                * Due to Resource Shortage'.
-                */
+                * request and does not have the local resources to add this
+                * new address to the association, it MUST return an Error
+                * Cause TLV set to the new error code 'Operation Refused
+                * Due to Resource Shortage'.
+                */
 
                peer = sctp_assoc_add_peer(asoc, &addr, GFP_ATOMIC, SCTP_UNCONFIRMED);
                if (!peer)
@@ -2440,10 +2439,10 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
                break;
        case SCTP_PARAM_DEL_IP:
                /* ADDIP 4.3 D7) If a request is received to delete the
-                * last remaining IP address of a peer endpoint, the receiver
-                * MUST send an Error Cause TLV with the error cause set to the
-                * new error code 'Request to Delete Last Remaining IP Address'.
-                */
+                * last remaining IP address of a peer endpoint, the receiver
+                * MUST send an Error Cause TLV with the error cause set to the
+                * new error code 'Request to Delete Last Remaining IP Address'.
+                */
                pos = asoc->peer.transport_addr_list.next;
                if (pos->next == &asoc->peer.transport_addr_list)
                        return SCTP_ERROR_DEL_LAST_IP;
@@ -2475,7 +2474,7 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
        return SCTP_ERROR_NO_ERROR;
 }
 
-/* Process an incoming ASCONF chunk with the next expected serial no. and 
+/* Process an incoming ASCONF chunk with the next expected serial no. and
  * return an ASCONF_ACK chunk to be sent in response.
  */
 struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
@@ -2495,19 +2494,19 @@ struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
        hdr = (sctp_addiphdr_t *)asconf->skb->data;
        serial = ntohl(hdr->serial);
 
-       /* Skip the addiphdr and store a pointer to address parameter.  */ 
+       /* Skip the addiphdr and store a pointer to address parameter.  */
        length = sizeof(sctp_addiphdr_t);
        addr_param = (union sctp_addr_param *)(asconf->skb->data + length);
        chunk_len -= length;
 
        /* Skip the address parameter and store a pointer to the first
         * asconf paramter.
-        */ 
+        */
        length = ntohs(addr_param->v4.param_hdr.length);
        asconf_param = (sctp_addip_param_t *)((void *)addr_param + length);
        chunk_len -= length;
 
-       /* create an ASCONF_ACK chunk. 
+       /* create an ASCONF_ACK chunk.
         * Based on the definitions of parameters, we know that the size of
         * ASCONF_ACK parameters are less than or equal to the twice of ASCONF
         * paramters.
@@ -2538,7 +2537,7 @@ struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
                /* ADDIP 4.3 D11) When an endpoint receiving an ASCONF to add
                 * an IP address sends an 'Out of Resource' in its response, it
                 * MUST also fail any subsequent add or delete requests bundled
-                * in the ASCONF. 
+                * in the ASCONF.
                 */
                if (SCTP_ERROR_RSRC_LOW == err_code)
                        goto done;
@@ -2549,12 +2548,12 @@ struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
                                                      length);
                chunk_len -= length;
        }
-       
+
 done:
        asoc->peer.addip_serial++;
 
        /* If we are sending a new ASCONF_ACK hold a reference to it in assoc
-        * after freeing the reference to old asconf ack if any. 
+        * after freeing the reference to old asconf ack if any.
         */
        if (asconf_ack) {
                if (asoc->addip_last_asconf_ack)
@@ -2622,7 +2621,7 @@ static int sctp_asconf_param_success(struct sctp_association *asoc,
 
 /* Get the corresponding ASCONF response error code from the ASCONF_ACK chunk
  * for the given asconf parameter.  If there is no response for this parameter,
- * return the error code based on the third argument 'no_err'. 
+ * return the error code based on the third argument 'no_err'.
  * ADDIP 4.1
  * A7) If an error response is received for a TLV parameter, all TLVs with no
  * response before the failed TLV are considered successful if not reported.
@@ -2646,7 +2645,7 @@ static __be16 sctp_get_asconf_response(struct sctp_chunk *asconf_ack,
 
        /* Skip the addiphdr from the asconf_ack chunk and store a pointer to
         * the first asconf_ack parameter.
-        */ 
+        */
        length = sizeof(sctp_addiphdr_t);
        asconf_ack_param = (sctp_addip_param_t *)(asconf_ack->skb->data +
                                                  length);
@@ -2697,14 +2696,14 @@ int sctp_process_asconf_ack(struct sctp_association *asoc,
 
        /* Skip the chunkhdr and addiphdr from the last asconf sent and store
         * a pointer to address parameter.
-        */ 
+        */
        length = sizeof(sctp_addip_chunk_t);
        addr_param = (union sctp_addr_param *)(asconf->skb->data + length);
        asconf_len -= length;
 
        /* Skip the address parameter in the last asconf sent and store a
         * pointer to the first asconf paramter.
-        */ 
+        */
        length = ntohs(addr_param->v4.param_hdr.length);
        asconf_param = (sctp_addip_param_t *)((void *)addr_param + length);
        asconf_len -= length;
@@ -2741,7 +2740,7 @@ int sctp_process_asconf_ack(struct sctp_association *asoc,
                case SCTP_ERROR_INV_PARAM:
                        /* Disable sending this type of asconf parameter in
                         * future.
-                        */     
+                        */
                        asoc->peer.addip_disabled_mask |=
                                asconf_param->param_hdr.type;
                        break;
@@ -2755,7 +2754,7 @@ int sctp_process_asconf_ack(struct sctp_association *asoc,
 
                /* Skip the processed asconf parameter and move to the next
                 * one.
-                */ 
+                */
                length = ntohs(asconf_param->param_hdr.length);
                asconf_param = (sctp_addip_param_t *)((void *)asconf_param +
                                                      length);
@@ -2784,14 +2783,14 @@ int sctp_process_asconf_ack(struct sctp_association *asoc,
        return retval;
 }
 
-/* Make a FWD TSN chunk. */ 
+/* Make a FWD TSN chunk. */
 struct sctp_chunk *sctp_make_fwdtsn(const struct sctp_association *asoc,
                                    __u32 new_cum_tsn, size_t nstreams,
                                    struct sctp_fwdtsn_skip *skiplist)
 {
        struct sctp_chunk *retval = NULL;
        struct sctp_fwdtsn_chunk *ftsn_chunk;
-       struct sctp_fwdtsn_hdr ftsn_hdr; 
+       struct sctp_fwdtsn_hdr ftsn_hdr;
        struct sctp_fwdtsn_skip skip;
        size_t hint;
        int i;
index 6db77d1329f7fe6fd63a099a583b9d7dc8dad7dd..135567493119e24cee2e359ac8b8e2640f19f120 100644 (file)
@@ -61,7 +61,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
                                struct sctp_endpoint *ep,
                                struct sctp_association *asoc,
                                void *event_arg,
-                               sctp_disposition_t status,
+                               sctp_disposition_t status,
                                sctp_cmd_seq_t *commands,
                                gfp_t gfp);
 static int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype,
@@ -78,7 +78,7 @@ static int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype,
  ********************************************************************/
 
 /* A helper function for delayed processing of INET ECN CE bit. */
-static void sctp_do_ecn_ce_work(struct sctp_association *asoc, 
+static void sctp_do_ecn_ce_work(struct sctp_association *asoc,
                                __u32 lowest_tsn)
 {
        /* Save the TSN away for comparison when we receive CWR */
@@ -160,7 +160,7 @@ static int sctp_gen_sack(struct sctp_association *asoc, int force,
        struct sctp_transport *trans = asoc->peer.last_data_from;
        int error = 0;
 
-       if (force || 
+       if (force ||
            (!trans && (asoc->param_flags & SPP_SACKDELAY_DISABLE)) ||
            (trans && (trans->param_flags & SPP_SACKDELAY_DISABLE)))
                asoc->peer.sack_needed = 1;
@@ -178,7 +178,7 @@ static int sctp_gen_sack(struct sctp_association *asoc, int force,
         * [This is actually not mentioned in Section 6, but we
         * implement it here anyway. --piggy]
         */
-        if (max_tsn_seen != ctsn)
+       if (max_tsn_seen != ctsn)
                asoc->peer.sack_needed = 1;
 
        /* From 6.2  Acknowledgement on Reception of DATA Chunks:
@@ -199,10 +199,10 @@ static int sctp_gen_sack(struct sctp_association *asoc, int force,
                 * for the association.
                 */
                if (trans)
-                       asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = 
+                       asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] =
                                trans->sackdelay;
                else
-                       asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = 
+                       asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] =
                                asoc->sackdelay;
 
                /* Restart the SACK timer. */
@@ -338,8 +338,8 @@ static void sctp_generate_t4_rto_event(unsigned long data)
 
 static void sctp_generate_t5_shutdown_guard_event(unsigned long data)
 {
-        struct sctp_association *asoc = (struct sctp_association *)data;
-        sctp_generate_timeout_event(asoc,
+       struct sctp_association *asoc = (struct sctp_association *)data;
+       sctp_generate_timeout_event(asoc,
                                    SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD);
 
 } /* sctp_generate_t5_shutdown_guard_event() */
@@ -380,7 +380,7 @@ void sctp_generate_heartbeat_event(unsigned long data)
                           asoc->state, asoc->ep, asoc,
                           transport, GFP_ATOMIC);
 
-         if (error)
+        if (error)
                 asoc->base.sk->sk_err = -error;
 
 out_unlock:
@@ -570,7 +570,7 @@ static void sctp_cmd_hb_timers_stop(sctp_cmd_seq_t *cmds,
 
 /* Helper function to stop any pending T3-RTX timers */
 static void sctp_cmd_t3_rtx_timers_stop(sctp_cmd_seq_t *cmds,
-                                       struct sctp_association *asoc)
+                                       struct sctp_association *asoc)
 {
        struct sctp_transport *t;
        struct list_head *pos;
@@ -675,7 +675,7 @@ static int sctp_cmd_process_sack(sctp_cmd_seq_t *cmds,
 /* Helper function to set the timeout value for T2-SHUTDOWN timer and to set
  * the transport for a shutdown chunk.
  */
-static void sctp_cmd_setup_t2(sctp_cmd_seq_t *cmds, 
+static void sctp_cmd_setup_t2(sctp_cmd_seq_t *cmds,
                              struct sctp_association *asoc,
                              struct sctp_chunk *chunk)
 {
@@ -688,7 +688,7 @@ static void sctp_cmd_setup_t2(sctp_cmd_seq_t *cmds,
 }
 
 /* Helper function to change the state of an association. */
-static void sctp_cmd_new_state(sctp_cmd_seq_t *cmds, 
+static void sctp_cmd_new_state(sctp_cmd_seq_t *cmds,
                               struct sctp_association *asoc,
                               sctp_state_t state)
 {
@@ -727,7 +727,7 @@ static void sctp_cmd_new_state(sctp_cmd_seq_t *cmds,
            sctp_state(asoc, SHUTDOWN_RECEIVED)) {
                /* Wake up any processes waiting in the asoc's wait queue in
                 * sctp_wait_for_connect() or sctp_wait_for_sndbuf().
-                */
+                */
                if (waitqueue_active(&asoc->wait))
                        wake_up_interruptible(&asoc->wait);
 
@@ -749,9 +749,9 @@ static void sctp_cmd_delete_tcb(sctp_cmd_seq_t *cmds,
        struct sock *sk = asoc->base.sk;
 
        /* If it is a non-temporary association belonging to a TCP-style
-        * listening socket that is not closed, do not free it so that accept() 
+        * listening socket that is not closed, do not free it so that accept()
         * can pick it up later.
-        */ 
+        */
        if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING) &&
            (!asoc->temp) && (sk->sk_shutdown != SHUTDOWN_MASK))
                return;
@@ -764,7 +764,7 @@ static void sctp_cmd_delete_tcb(sctp_cmd_seq_t *cmds,
  * ADDIP Section 4.1 ASCONF Chunk Procedures
  * A4) Start a T-4 RTO timer, using the RTO value of the selected
  * destination address (we use active path instead of primary path just
- * because primary path may be inactive. 
+ * because primary path may be inactive.
  */
 static void sctp_cmd_setup_t4(sctp_cmd_seq_t *cmds,
                                struct sctp_association *asoc,
@@ -777,7 +777,7 @@ static void sctp_cmd_setup_t4(sctp_cmd_seq_t *cmds,
        chunk->transport = t;
 }
 
-/* Process an incoming Operation Error Chunk. */ 
+/* Process an incoming Operation Error Chunk. */
 static void sctp_cmd_process_operr(sctp_cmd_seq_t *cmds,
                                   struct sctp_association *asoc,
                                   struct sctp_chunk *chunk)
@@ -816,7 +816,7 @@ static void sctp_cmd_process_operr(sctp_cmd_seq_t *cmds,
 }
 
 /* Process variable FWDTSN chunk information. */
-static void sctp_cmd_process_fwdtsn(struct sctp_ulpq *ulpq, 
+static void sctp_cmd_process_fwdtsn(struct sctp_ulpq *ulpq,
                                    struct sctp_chunk *chunk)
 {
        struct sctp_fwdtsn_skip *skip;
@@ -828,9 +828,9 @@ static void sctp_cmd_process_fwdtsn(struct sctp_ulpq *ulpq,
        return;
 }
 
-/* Helper function to remove the association non-primary peer 
+/* Helper function to remove the association non-primary peer
  * transports.
- */ 
+ */
 static void sctp_cmd_del_non_primary(struct sctp_association *asoc)
 {
        struct sctp_transport *t;
@@ -840,7 +840,7 @@ static void sctp_cmd_del_non_primary(struct sctp_association *asoc)
        list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) {
                t = list_entry(pos, struct sctp_transport, transports);
                if (!sctp_cmp_addr_exact(&t->ipaddr,
-                                        &asoc->peer.primary_addr)) {
+                                        &asoc->peer.primary_addr)) {
                        sctp_assoc_del_peer(asoc, &t->ipaddr);
                }
        }
@@ -915,7 +915,7 @@ int sctp_do_sm(sctp_event_t event_type, sctp_subtype_t subtype,
        DEBUG_POST;
 
        error = sctp_side_effects(event_type, subtype, state,
-                                 ep, asoc, event_arg, status, 
+                                 ep, asoc, event_arg, status,
                                  &commands, gfp);
        DEBUG_POST_SFX;
 
@@ -968,7 +968,7 @@ static int sctp_side_effects(sctp_event_t event_type, sctp_subtype_t subtype,
                error = -ENOMEM;
                break;
 
-        case SCTP_DISPOSITION_DELETE_TCB:
+       case SCTP_DISPOSITION_DELETE_TCB:
                /* This should now be a command. */
                break;
 
@@ -1021,7 +1021,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
                                struct sctp_endpoint *ep,
                                struct sctp_association *asoc,
                                void *event_arg,
-                               sctp_disposition_t status,
+                               sctp_disposition_t status,
                                sctp_cmd_seq_t *commands,
                                gfp_t gfp)
 {
@@ -1057,7 +1057,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
                case SCTP_CMD_NEW_ASOC:
                        /* Register a new association.  */
                        if (local_cork) {
-                               sctp_outq_uncork(&asoc->outqueue); 
+                               sctp_outq_uncork(&asoc->outqueue);
                                local_cork = 0;
                        }
                        asoc = cmd->obj.ptr;
@@ -1074,7 +1074,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
                       sctp_outq_teardown(&asoc->outqueue);
                       break;
 
-               case SCTP_CMD_DELETE_TCB:                       
+               case SCTP_CMD_DELETE_TCB:
                        if (local_cork) {
                                sctp_outq_uncork(&asoc->outqueue);
                                local_cork = 0;
@@ -1104,7 +1104,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
 
                case SCTP_CMD_PROCESS_FWDTSN:
                        sctp_cmd_process_fwdtsn(&asoc->ulpq, cmd->obj.ptr);
-                        break;
+                       break;
 
                case SCTP_CMD_GEN_SACK:
                        /* Generate a Selective ACK.
@@ -1162,12 +1162,12 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
                                                SCTP_CHUNK(cmd->obj.ptr));
 
                        /* FIXME - Eventually come up with a cleaner way to
-                        * enabling COOKIE-ECHO + DATA bundling during 
-                        * multihoming stale cookie scenarios, the following 
-                        * command plays with asoc->peer.retran_path to 
-                        * avoid the problem of sending the COOKIE-ECHO and 
-                        * DATA in different paths, which could result 
-                        * in the association being ABORTed if the DATA chunk 
+                        * enabling COOKIE-ECHO + DATA bundling during
+                        * multihoming stale cookie scenarios, the following
+                        * command plays with asoc->peer.retran_path to
+                        * avoid the problem of sending the COOKIE-ECHO and
+                        * DATA in different paths, which could result
+                        * in the association being ABORTed if the DATA chunk
                         * is processed first by the server.  Checking the
                         * init error counter simply causes this command
                         * to be executed only during failed attempts of
@@ -1177,7 +1177,7 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
                             asoc->peer.primary_path) &&
                            (asoc->init_err_counter > 0)) {
                                sctp_add_cmd_sf(commands,
-                                               SCTP_CMD_FORCE_PRIM_RETRAN,
+                                               SCTP_CMD_FORCE_PRIM_RETRAN,
                                                SCTP_NULL());
                        }
 
index fbbc9e6a3b787bc8209a3c036bb3be7995813068..b3cad8a03736c1a05b34fe6c9264a3b192eb6e19 100644 (file)
@@ -189,7 +189,7 @@ sctp_disposition_t sctp_sf_do_4_C(const struct sctp_endpoint *ep,
                                             0, 0, 0, GFP_ATOMIC);
        if (ev)
                sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP,
-                               SCTP_ULPEVENT(ev));
+                               SCTP_ULPEVENT(ev));
 
        /* Upon reception of the SHUTDOWN COMPLETE chunk the endpoint
         * will verify that it is in SHUTDOWN-ACK-SENT state, if it is
@@ -228,7 +228,7 @@ sctp_disposition_t sctp_sf_do_4_C(const struct sctp_endpoint *ep,
  *    Verification Tag field to Tag_A, and also provide its own
  *    Verification Tag (Tag_Z) in the Initiate Tag field.
  *
- * Verification Tag: Must be 0. 
+ * Verification Tag: Must be 0.
  *
  * Inputs
  * (endpoint, asoc, chunk)
@@ -256,7 +256,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
        /* 6.10 Bundling
         * An endpoint MUST NOT bundle INIT, INIT ACK or
         * SHUTDOWN COMPLETE with any other chunks.
-        * 
+        *
         * IG Section 2.11.2
         * Furthermore, we require that the receiver of an INIT chunk MUST
         * enforce these rules by silently discarding an arriving packet
@@ -282,7 +282,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
                return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
 
        /* 3.1 A packet containing an INIT chunk MUST have a zero Verification
-        * Tag. 
+        * Tag.
         */
        if (chunk->sctp_hdr->vtag != 0)
                return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
@@ -326,7 +326,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(const struct sctp_endpoint *ep,
                }
        }
 
-        /* Grab the INIT header.  */
+       /* Grab the INIT header.  */
        chunk->subh.init_hdr = (sctp_inithdr_t *)chunk->skb->data;
 
        /* Tag the variable length parameters.  */
@@ -594,7 +594,7 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep,
        /* "Decode" the chunk.  We have no optional parameters so we
         * are in good shape.
         */
-        chunk->subh.cookie_hdr =
+       chunk->subh.cookie_hdr =
                (struct sctp_signed_cookie *)chunk->skb->data;
        if (!pskb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) -
                                         sizeof(sctp_chunkhdr_t)))
@@ -665,7 +665,7 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(const struct sctp_endpoint *ep,
        if (!ev)
                goto nomem_ev;
 
-       /* Sockets API Draft Section 5.3.1.6    
+       /* Sockets API Draft Section 5.3.1.6
         * When a peer sends a Adaptation Layer Indication parameter , SCTP
         * delivers this notification to inform the application that of the
         * peers requested adaptation layer.
@@ -891,7 +891,7 @@ sctp_disposition_t sctp_sf_sendbeat_8_3(const struct sctp_endpoint *ep,
        sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMER_UPDATE,
                        SCTP_TRANSPORT(transport));
 
-        return SCTP_DISPOSITION_CONSUME;
+       return SCTP_DISPOSITION_CONSUME;
 }
 
 /*
@@ -1280,7 +1280,7 @@ static sctp_disposition_t sctp_sf_do_unexpected_init(
                return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
 
        /* 3.1 A packet containing an INIT chunk MUST have a zero Verification
-        * Tag. 
+        * Tag.
         */
        if (chunk->sctp_hdr->vtag != 0)
                return sctp_sf_tabort_8_4_8(ep, asoc, type, arg, commands);
@@ -1548,7 +1548,7 @@ sctp_disposition_t sctp_sf_do_5_2_3_initack(const struct sctp_endpoint *ep,
        /* Per the above section, we'll discard the chunk if we have an
         * endpoint.  If this is an OOTB INIT-ACK, treat it as such.
         */
-        if (ep == sctp_sk((sctp_get_ctl_sock()))->ep)
+       if (ep == sctp_sk((sctp_get_ctl_sock()))->ep)
                return sctp_sf_ootb(ep, asoc, type, arg, commands);
        else
                return sctp_sf_discard_chunk(ep, asoc, type, arg, commands);
@@ -1760,9 +1760,9 @@ static sctp_disposition_t sctp_sf_do_dupcook_d(const struct sctp_endpoint *ep,
 
        /* Clarification from Implementor's Guide:
         * D) When both local and remote tags match the endpoint should
-         * enter the ESTABLISHED state, if it is in the COOKIE-ECHOED state.
-         * It should stop any cookie timer that may be running and send
-         * a COOKIE ACK.
+        * enter the ESTABLISHED state, if it is in the COOKIE-ECHOED state.
+        * It should stop any cookie timer that may be running and send
+        * a COOKIE ACK.
         */
 
        /* Don't accidentally move back into established state. */
@@ -1786,7 +1786,7 @@ static sctp_disposition_t sctp_sf_do_dupcook_d(const struct sctp_endpoint *ep,
                                             SCTP_COMM_UP, 0,
                                             asoc->c.sinit_num_ostreams,
                                             asoc->c.sinit_max_instreams,
-                                             GFP_ATOMIC);
+                                            GFP_ATOMIC);
                if (!ev)
                        goto nomem;
 
@@ -1870,7 +1870,7 @@ sctp_disposition_t sctp_sf_do_5_2_4_dupcook(const struct sctp_endpoint *ep,
        /* "Decode" the chunk.  We have no optional parameters so we
         * are in good shape.
         */
-        chunk->subh.cookie_hdr = (struct sctp_signed_cookie *)chunk->skb->data;
+       chunk->subh.cookie_hdr = (struct sctp_signed_cookie *)chunk->skb->data;
        if (!pskb_pull(chunk->skb, ntohs(chunk->chunk_hdr->length) -
                                        sizeof(sctp_chunkhdr_t)))
                goto nomem;
@@ -1936,7 +1936,7 @@ sctp_disposition_t sctp_sf_do_5_2_4_dupcook(const struct sctp_endpoint *ep,
        default: /* Discard packet for all others. */
                retval = sctp_sf_pdiscard(ep, asoc, type, arg, commands);
                break;
-        };
+       };
 
        /* Delete the tempory new association. */
        sctp_add_cmd_sf(commands, SCTP_CMD_NEW_ASOC, SCTP_ASOC(new_asoc));
@@ -2083,7 +2083,7 @@ sctp_disposition_t sctp_sf_cookie_echoed_err(const struct sctp_endpoint *ep,
         */
        sctp_walk_errors(err, chunk->chunk_hdr) {
                if (SCTP_ERROR_STALE_COOKIE == err->cause)
-                       return sctp_sf_do_5_2_6_stale(ep, asoc, type, 
+                       return sctp_sf_do_5_2_6_stale(ep, asoc, type,
                                                        arg, commands);
        }
 
@@ -2185,10 +2185,10 @@ static sctp_disposition_t sctp_sf_do_5_2_6_stale(const struct sctp_endpoint *ep,
         */
        sctp_add_cmd_sf(commands, SCTP_CMD_DEL_NON_PRIMARY, SCTP_NULL());
 
-       /* If we've sent any data bundled with COOKIE-ECHO we will need to 
-        * resend 
+       /* If we've sent any data bundled with COOKIE-ECHO we will need to
+        * resend
         */
-       sctp_add_cmd_sf(commands, SCTP_CMD_RETRAN, 
+       sctp_add_cmd_sf(commands, SCTP_CMD_RETRAN,
                        SCTP_TRANSPORT(asoc->peer.primary_path));
 
        /* Cast away the const modifier, as we want to just
@@ -2274,7 +2274,7 @@ sctp_disposition_t sctp_sf_do_9_1_abort(const struct sctp_endpoint *ep,
                error = ((sctp_errhdr_t *)chunk->skb->data)->cause;
 
        sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, SCTP_ERROR(ECONNRESET));
-       /* ASSOC_FAILED will DELETE_TCB. */
+       /* ASSOC_FAILED will DELETE_TCB. */
        sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, SCTP_PERR(error));
        SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
        SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
@@ -2439,7 +2439,7 @@ sctp_disposition_t sctp_sf_do_9_2_shutdown(const struct sctp_endpoint *ep,
        ev = sctp_ulpevent_make_shutdown_event(asoc, 0, GFP_ATOMIC);
        if (!ev) {
                disposition = SCTP_DISPOSITION_NOMEM;
-               goto out;       
+               goto out;
        }
        sctp_add_cmd_sf(commands, SCTP_CMD_EVENT_ULP, SCTP_ULPEVENT(ev));
 
@@ -2553,7 +2553,7 @@ sctp_disposition_t sctp_sf_do_ecn_cwr(const struct sctp_endpoint *ep,
        if (!sctp_chunk_length_valid(chunk, sizeof(sctp_ecne_chunk_t)))
                return sctp_sf_violation_chunklen(ep, asoc, type, arg,
                                                  commands);
-               
+
        cwr = (sctp_cwrhdr_t *) chunk->skb->data;
        skb_pull(chunk->skb, sizeof(sctp_cwrhdr_t));
 
@@ -2661,7 +2661,7 @@ sctp_disposition_t sctp_sf_eat_data_6_2(const struct sctp_endpoint *ep,
                sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG,
                                SCTP_NULL());
                return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
-        }
+       }
 
        if (!sctp_chunk_length_valid(chunk, sizeof(sctp_data_chunk_t)))
                return sctp_sf_violation_chunklen(ep, asoc, type, arg,
@@ -2743,7 +2743,7 @@ discard_noforce:
        return SCTP_DISPOSITION_DISCARD;
 consume:
        return SCTP_DISPOSITION_CONSUME;
-       
+
 }
 
 /*
@@ -2930,7 +2930,7 @@ sctp_disposition_t sctp_sf_tabort_8_4_8(const struct sctp_endpoint *ep,
                /* Make an ABORT. The T bit will be set if the asoc
                 * is NULL.
                 */
-               abort = sctp_make_abort(asoc, chunk, 0);
+               abort = sctp_make_abort(asoc, chunk, 0);
                if (!abort) {
                        sctp_ootb_pkt_free(packet);
                        return SCTP_DISPOSITION_NOMEM;
@@ -2994,7 +2994,7 @@ sctp_disposition_t sctp_sf_operr_notify(const struct sctp_endpoint *ep,
                }
 
                sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_OPERR,
-                               SCTP_CHUNK(chunk));     
+                               SCTP_CHUNK(chunk));
        }
        return SCTP_DISPOSITION_CONSUME;
 
@@ -3128,7 +3128,7 @@ sctp_disposition_t sctp_sf_ootb(const struct sctp_endpoint *ep,
                 */
                if (SCTP_CID_ABORT == ch->type)
                        return sctp_sf_pdiscard(ep, asoc, type, arg, commands);
-                       
+
                ch = (sctp_chunkhdr_t *) ch_end;
        } while (ch_end < skb->tail);
 
@@ -3175,8 +3175,8 @@ static sctp_disposition_t sctp_sf_shut_8_4_5(const struct sctp_endpoint *ep,
 
        if (packet) {
                /* Make an SHUTDOWN_COMPLETE.
-                * The T bit will be set if the asoc is NULL.
-                */
+                * The T bit will be set if the asoc is NULL.
+                */
                shut = sctp_make_shutdown_complete(asoc, chunk);
                if (!shut) {
                        sctp_ootb_pkt_free(packet);
@@ -3261,10 +3261,10 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep,
 
        /* ADDIP 4.2 C1) Compare the value of the serial number to the value
         * the endpoint stored in a new association variable
-        * 'Peer-Serial-Number'. 
+        * 'Peer-Serial-Number'.
         */
        if (serial == asoc->peer.addip_serial + 1) {
-               /* ADDIP 4.2 C2) If the value found in the serial number is
+               /* ADDIP 4.2 C2) If the value found in the serial number is
                 * equal to the ('Peer-Serial-Number' + 1), the endpoint MUST
                 * do V1-V5.
                 */
@@ -3285,9 +3285,9 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep,
                else
                        return SCTP_DISPOSITION_DISCARD;
        } else {
-               /* ADDIP 4.2 C4) Otherwise, the ASCONF Chunk is discarded since 
+               /* ADDIP 4.2 C4) Otherwise, the ASCONF Chunk is discarded since
                 * it must be either a stale packet or from an attacker.
-                */     
+                */
                return SCTP_DISPOSITION_DISCARD;
        }
 
@@ -3296,7 +3296,7 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep,
         * being responded to.
         */
        sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(asconf_ack));
-       
+
        return SCTP_DISPOSITION_CONSUME;
 }
 
@@ -3307,7 +3307,7 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep,
  */
 sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
                                         const struct sctp_association *asoc,
-                                        const sctp_subtype_t type, void *arg,
+                                        const sctp_subtype_t type, void *arg,
                                         sctp_cmd_seq_t *commands)
 {
        struct sctp_chunk       *asconf_ack = arg;
@@ -3359,7 +3359,7 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
                                SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO));
                sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET,SCTP_NULL());
                sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
-                               SCTP_ERROR(ECONNABORTED));
+                               SCTP_ERROR(ECONNABORTED));
                sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
                                SCTP_PERR(SCTP_ERROR_ASCONF_ACK));
                SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
@@ -3387,7 +3387,7 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep,
                 */
                sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET,SCTP_NULL());
                sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
-                               SCTP_ERROR(ECONNABORTED));
+                               SCTP_ERROR(ECONNABORTED));
                sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
                                SCTP_PERR(SCTP_ERROR_ASCONF_ACK));
                SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
@@ -3451,17 +3451,17 @@ sctp_disposition_t sctp_sf_eat_fwd_tsn(const struct sctp_endpoint *ep,
 
        sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_FWDTSN, SCTP_U32(tsn));
        if (len > sizeof(struct sctp_fwdtsn_hdr))
-               sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_FWDTSN, 
+               sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_FWDTSN,
                                SCTP_CHUNK(chunk));
-       
+
        /* Count this as receiving DATA. */
        if (asoc->autoclose) {
                sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART,
                                SCTP_TO(SCTP_EVENT_TIMEOUT_AUTOCLOSE));
        }
-       
+
        /* FIXME: For now send a SACK, but DATA processing may
-        * send another. 
+        * send another.
         */
        sctp_add_cmd_sf(commands, SCTP_CMD_GEN_SACK, SCTP_NOFORCE());
 
@@ -3511,9 +3511,9 @@ sctp_disposition_t sctp_sf_eat_fwd_tsn_fast(
 
        sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_FWDTSN, SCTP_U32(tsn));
        if (len > sizeof(struct sctp_fwdtsn_hdr))
-               sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_FWDTSN, 
+               sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_FWDTSN,
                                SCTP_CHUNK(chunk));
-       
+
        /* Go a head and force a SACK, since we are shutting down. */
 gen_shutdown:
        /* Implementor's Guide.
@@ -3527,7 +3527,7 @@ gen_shutdown:
        sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_RESTART,
                        SCTP_TO(SCTP_EVENT_TIMEOUT_T2_SHUTDOWN));
 
-        return SCTP_DISPOSITION_CONSUME;
+       return SCTP_DISPOSITION_CONSUME;
 }
 
 /*
@@ -3706,7 +3706,7 @@ sctp_disposition_t sctp_sf_violation(const struct sctp_endpoint *ep,
  * if it's length is set to be smaller then the size of sctp_sack_chunk_t.
  *
  * We inform the other end by sending an ABORT with a Protocol Violation
- * error code. 
+ * error code.
  *
  * Section: Not specified
  * Verification Tag:  Nothing to do
@@ -3747,7 +3747,7 @@ static sctp_disposition_t sctp_sf_violation_chunklen(
                                SCTP_PERR(SCTP_ERROR_PROTO_VIOLATION));
        } else {
                sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR,
-                               SCTP_ERROR(ECONNABORTED));
+                               SCTP_ERROR(ECONNABORTED));
                sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED,
                                SCTP_PERR(SCTP_ERROR_PROTO_VIOLATION));
                SCTP_DEC_STATS(SCTP_MIB_CURRESTAB);
@@ -3756,7 +3756,7 @@ static sctp_disposition_t sctp_sf_violation_chunklen(
        sctp_add_cmd_sf(commands, SCTP_CMD_DISCARD_PACKET, SCTP_NULL());
 
        SCTP_INC_STATS(SCTP_MIB_ABORTEDS);
-       
+
        return SCTP_DISPOSITION_ABORT;
 
 nomem:
@@ -4437,7 +4437,7 @@ sctp_disposition_t sctp_sf_do_9_2_start_shutdown(
        /* sctp-implguide 2.10 Issues with Heartbeating and failover
         *
         * HEARTBEAT ... is discontinued after sending either SHUTDOWN
-         * or SHUTDOWN-ACK.
+        * or SHUTDOWN-ACK.
         */
        sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_STOP, SCTP_NULL());
 
@@ -4515,7 +4515,7 @@ sctp_disposition_t sctp_sf_do_9_2_shutdown_ack(
        /* sctp-implguide 2.10 Issues with Heartbeating and failover
         *
         * HEARTBEAT ... is discontinued after sending either SHUTDOWN
-         * or SHUTDOWN-ACK.
+        * or SHUTDOWN-ACK.
         */
        sctp_add_cmd_sf(commands, SCTP_CMD_HB_TIMERS_STOP, SCTP_NULL());
 
@@ -4874,7 +4874,7 @@ sctp_disposition_t sctp_sf_t4_timer_expire(
        /* ADDIP 4.1 B4) Re-transmit the ASCONF Chunk last sent and if possible
         * choose an alternate destination address (please refer to RFC2960
         * [5] section 6.4.1). An endpoint MUST NOT add new parameters to this
-        * chunk, it MUST be the same (including its serial number) as the last 
+        * chunk, it MUST be the same (including its serial number) as the last
         * ASCONF sent.
         */
        sctp_chunk_hold(asoc->addip_last_asconf);
@@ -4953,7 +4953,7 @@ sctp_disposition_t sctp_sf_autoclose_timer_expire(
        /* sctpimpguide-05 Section 2.12.2
         * The sender of the SHUTDOWN MAY also start an overall guard timer
         * 'T5-shutdown-guard' to bound the overall time for shutdown sequence.
-        */
+        */
        sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_START,
                        SCTP_TO(SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD));
        disposition = SCTP_DISPOSITION_CONSUME;
@@ -5127,7 +5127,7 @@ static struct sctp_packet *sctp_ootb_pkt_new(const struct sctp_association *asoc
                        vtag = ntohl(init->init_hdr.init_tag);
                        break;
                }
-               default:        
+               default:
                        vtag = ntohl(chunk->sctp_hdr->vtag);
                        break;
                }
@@ -5176,7 +5176,7 @@ static void sctp_send_stale_cookie_err(const struct sctp_endpoint *ep,
                        /* Override the OOTB vtag from the cookie. */
                        cookie = chunk->subh.cookie_hdr;
                        packet->vtag = cookie->c.peer_vtag;
-                       
+
                        /* Set the skb to the belonging sock for accounting. */
                        err_chunk->skb->sk = ep->base.sk;
                        sctp_packet_append_chunk(packet, err_chunk);
@@ -5310,7 +5310,7 @@ static int sctp_eat_data(const struct sctp_association *asoc,
                sctp_add_cmd_sf(commands, SCTP_CMD_PART_DELIVER, SCTP_NULL());
        }
 
-        /* Spill over rwnd a little bit.  Note: While allowed, this spill over
+       /* Spill over rwnd a little bit.  Note: While allowed, this spill over
         * seems a bit troublesome in that frag_point varies based on
         * PMTU.  In cases, such as loopback, this might be a rather
         * large spill over.
index 5f6cc7aa661bd0371d1394d23610c6be780a6644..5e54b17377f40a0b3eb5a711031ae07d32bc16bd 100644 (file)
@@ -954,7 +954,7 @@ static const sctp_sm_table_entry_t timeout_event_table[SCTP_NUM_TIMEOUT_TYPES][S
        TYPE_SCTP_EVENT_TIMEOUT_AUTOCLOSE,
 };
 
-static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid, 
+static const sctp_sm_table_entry_t *sctp_chunk_event_lookup(sctp_cid_t cid,
                                                            sctp_state_t state)
 {
        if (state > SCTP_STATE_MAX)
index 388d0fb1a3776a7e8a487ab3656df4b17166f2fa..536298c2eda26034d3f0afab142ad95cbcee2e7d 100644 (file)
@@ -381,12 +381,12 @@ SCTP_STATIC int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len)
 
  /* ADDIP Section 4.1.1 Congestion Control of ASCONF Chunks
  *
- * R1) One and only one ASCONF Chunk MAY be in transit and unacknowledged 
+ * R1) One and only one ASCONF Chunk MAY be in transit and unacknowledged
  * at any one time.  If a sender, after sending an ASCONF chunk, decides
- * it needs to transfer another ASCONF Chunk, it MUST wait until the 
+ * it needs to transfer another ASCONF Chunk, it MUST wait until the
  * ASCONF-ACK Chunk returns from the previous ASCONF Chunk before sending a
- * subsequent ASCONF. Note this restriction binds each side, so at any 
- * time two ASCONF may be in-transit on any given association (one sent 
+ * subsequent ASCONF. Note this restriction binds each side, so at any
+ * time two ASCONF may be in-transit on any given association (one sent
  * from each endpoint).
  */
 static int sctp_send_asconf(struct sctp_association *asoc,
@@ -396,10 +396,10 @@ static int sctp_send_asconf(struct sctp_association *asoc,
 
        /* If there is an outstanding ASCONF chunk, queue it for later
         * transmission.
-        */     
+        */
        if (asoc->addip_last_asconf) {
                list_add_tail(&chunk->list, &asoc->addip_chunk_list);
-               goto out;       
+               goto out;
        }
 
        /* Hold the chunk until an ASCONF_ACK is received. */
@@ -449,7 +449,7 @@ int sctp_bindx_add(struct sock *sk, struct sockaddr *addrs, int addrcnt)
                        goto err_bindx_add;
                }
 
-               retval = sctp_do_bind(sk, (union sctp_addr *)sa_addr, 
+               retval = sctp_do_bind(sk, (union sctp_addr *)sa_addr,
                                      af->sockaddr_len);
 
                addr_buf += af->sockaddr_len;
@@ -470,13 +470,13 @@ err_bindx_add:
  * associations that are part of the endpoint indicating that a list of local
  * addresses are added to the endpoint.
  *
- * If any of the addresses is already in the bind address list of the 
+ * If any of the addresses is already in the bind address list of the
  * association, we do not send the chunk for that association.  But it will not
  * affect other associations.
  *
  * Only sctp_setsockopt_bindx() is supposed to call this function.
  */
-static int sctp_send_asconf_add_ip(struct sock         *sk, 
+static int sctp_send_asconf_add_ip(struct sock         *sk,
                                   struct sockaddr      *addrs,
                                   int                  addrcnt)
 {
@@ -517,8 +517,8 @@ static int sctp_send_asconf_add_ip(struct sock              *sk,
                        continue;
 
                /* Check if any address in the packed array of addresses is
-                * in the bind address list of the association. If so, 
-                * do not send the asconf chunk to its peer, but continue with 
+                * in the bind address list of the association. If so,
+                * do not send the asconf chunk to its peer, but continue with
                 * other associations.
                 */
                addr_buf = addrs;
@@ -664,7 +664,7 @@ err_bindx_rem:
  * the associations that are part of the endpoint indicating that a list of
  * local addresses are removed from the endpoint.
  *
- * If any of the addresses is already in the bind address list of the 
+ * If any of the addresses is already in the bind address list of the
  * association, we do not send the chunk for that association.  But it will not
  * affect other associations.
  *
@@ -710,7 +710,7 @@ static int sctp_send_asconf_del_ip(struct sock              *sk,
                        continue;
 
                /* Check if any address in the packed array of addresses is
-                * not present in the bind address list of the association.
+                * not present in the bind address list of the association.
                 * If so, do not send the asconf chunk to its peer, but
                 * continue with other associations.
                 */
@@ -898,7 +898,7 @@ SCTP_STATIC int sctp_setsockopt_bindx(struct sock* sk,
                return -EFAULT;
        }
 
-       /* Walk through the addrs buffer and count the number of addresses. */ 
+       /* Walk through the addrs buffer and count the number of addresses. */
        addr_buf = kaddrs;
        while (walk_size < addrs_size) {
                sa_addr = (struct sockaddr *)addr_buf;
@@ -906,7 +906,7 @@ SCTP_STATIC int sctp_setsockopt_bindx(struct sock* sk,
 
                /* If the address family is not supported or if this address
                 * causes the address buffer to overflow return EINVAL.
-                */ 
+                */
                if (!af || (walk_size + af->sockaddr_len) > addrs_size) {
                        kfree(kaddrs);
                        return -EINVAL;
@@ -935,7 +935,7 @@ SCTP_STATIC int sctp_setsockopt_bindx(struct sock* sk,
        default:
                err = -EINVAL;
                break;
-        };
+       };
 
 out:
        kfree(kaddrs);
@@ -1035,10 +1035,10 @@ static int __sctp_connect(struct sock* sk,
                                }
                        } else {
                                /*
-                                * If an unprivileged user inherits a 1-many 
-                                * style socket with open associations on a 
-                                * privileged port, it MAY be permitted to 
-                                * accept new associations, but it SHOULD NOT 
+                                * If an unprivileged user inherits a 1-many
+                                * style socket with open associations on a
+                                * privileged port, it MAY be permitted to
+                                * accept new associations, but it SHOULD NOT
                                 * be permitted to open new associations.
                                 */
                                if (ep->base.bind_addr.port < PROT_SOCK &&
@@ -1094,8 +1094,8 @@ static int __sctp_connect(struct sock* sk,
 out_free:
 
        SCTP_DEBUG_PRINTK("About to exit __sctp_connect() free asoc: %p"
-                         " kaddrs: %p err: %d\n",
-                         asoc, kaddrs, err);
+                         " kaddrs: %p err: %d\n",
+                         asoc, kaddrs, err);
        if (asoc)
                sctp_association_free(asoc);
        return err;
@@ -1435,7 +1435,7 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
         * length messages when SCTP_EOF|SCTP_ABORT is not set.
         * If SCTP_ABORT is set, the message length could be non zero with
         * the msg_iov set to the user abort reason.
-        */
+        */
        if (((sinfo_flags & SCTP_EOF) && (msg_len > 0)) ||
            (!(sinfo_flags & (SCTP_EOF|SCTP_ABORT)) && (msg_len == 0))) {
                err = -EINVAL;
@@ -1599,7 +1599,7 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk,
                                        = sinit->sinit_max_attempts;
                        }
                        if (sinit->sinit_max_init_timeo) {
-                               asoc->max_init_timeo = 
+                               asoc->max_init_timeo =
                                 msecs_to_jiffies(sinit->sinit_max_init_timeo);
                        }
                }
@@ -2298,7 +2298,7 @@ static int sctp_setsockopt_delayed_ack_time(struct sock *sk,
        /* Get association, if assoc_id != 0 and the socket is a one
         * to many style socket, and an association was not found, then
         * the id was invalid.
-        */
+        */
        asoc = sctp_id2assoc(sk, params.assoc_id);
        if (!asoc && params.assoc_id && sctp_style(sk, UDP))
                return -EINVAL;
@@ -2307,22 +2307,22 @@ static int sctp_setsockopt_delayed_ack_time(struct sock *sk,
                if (asoc) {
                        asoc->sackdelay =
                                msecs_to_jiffies(params.assoc_value);
-                       asoc->param_flags = 
+                       asoc->param_flags =
                                (asoc->param_flags & ~SPP_SACKDELAY) |
                                SPP_SACKDELAY_ENABLE;
                } else {
                        sp->sackdelay = params.assoc_value;
-                       sp->param_flags = 
+                       sp->param_flags =
                                (sp->param_flags & ~SPP_SACKDELAY) |
                                SPP_SACKDELAY_ENABLE;
                }
        } else {
                if (asoc) {
-                       asoc->param_flags = 
+                       asoc->param_flags =
                                (asoc->param_flags & ~SPP_SACKDELAY) |
                                SPP_SACKDELAY_DISABLE;
                } else {
-                       sp->param_flags = 
+                       sp->param_flags =
                                (sp->param_flags & ~SPP_SACKDELAY) |
                                SPP_SACKDELAY_DISABLE;
                }
@@ -2338,17 +2338,17 @@ static int sctp_setsockopt_delayed_ack_time(struct sock *sk,
                        if (params.assoc_value) {
                                trans->sackdelay =
                                        msecs_to_jiffies(params.assoc_value);
-                               trans->param_flags = 
+                               trans->param_flags =
                                        (trans->param_flags & ~SPP_SACKDELAY) |
                                        SPP_SACKDELAY_ENABLE;
                        } else {
-                               trans->param_flags = 
+                               trans->param_flags =
                                        (trans->param_flags & ~SPP_SACKDELAY) |
                                        SPP_SACKDELAY_DISABLE;
                        }
                }
        }
+
        return 0;
 }
 
@@ -2374,13 +2374,13 @@ static int sctp_setsockopt_initmsg(struct sock *sk, char __user *optval, int opt
                return -EFAULT;
 
        if (sinit.sinit_num_ostreams)
-               sp->initmsg.sinit_num_ostreams = sinit.sinit_num_ostreams;      
+               sp->initmsg.sinit_num_ostreams = sinit.sinit_num_ostreams;
        if (sinit.sinit_max_instreams)
-               sp->initmsg.sinit_max_instreams = sinit.sinit_max_instreams;    
+               sp->initmsg.sinit_max_instreams = sinit.sinit_max_instreams;
        if (sinit.sinit_max_attempts)
-               sp->initmsg.sinit_max_attempts = sinit.sinit_max_attempts;      
+               sp->initmsg.sinit_max_attempts = sinit.sinit_max_attempts;
        if (sinit.sinit_max_init_timeo)
-               sp->initmsg.sinit_max_init_timeo = sinit.sinit_max_init_timeo;  
+               sp->initmsg.sinit_max_init_timeo = sinit.sinit_max_init_timeo;
 
        return 0;
 }
@@ -2511,7 +2511,7 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, int opt
 
        if (asoc) {
                if (rtoinfo.srto_initial != 0)
-                       asoc->rto_initial = 
+                       asoc->rto_initial =
                                msecs_to_jiffies(rtoinfo.srto_initial);
                if (rtoinfo.srto_max != 0)
                        asoc->rto_max = msecs_to_jiffies(rtoinfo.srto_max);
@@ -2665,7 +2665,7 @@ static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, int optl
        /* Update the frag_point of the existing associations. */
        list_for_each(pos, &(sp->ep->asocs)) {
                asoc = list_entry(pos, struct sctp_association, asocs);
-               asoc->frag_point = sctp_frag_point(sp, asoc->pathmtu); 
+               asoc->frag_point = sctp_frag_point(sp, asoc->pathmtu);
        }
 
        return 0;
@@ -2703,7 +2703,7 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optva
                return -EFAULT;
 
        asoc = sctp_id2assoc(sk, prim.sspp_assoc_id);
-       if (!asoc) 
+       if (!asoc)
                return -EINVAL;
 
        if (!asoc->peer.asconf_capable)
@@ -3015,7 +3015,7 @@ SCTP_STATIC struct sock *sctp_accept(struct sock *sk, int flags, int *err)
 
 out:
        sctp_release_sock(sk);
-       *err = error;
+       *err = error;
        return newsk;
 }
 
@@ -3087,7 +3087,7 @@ SCTP_STATIC int sctp_init_sock(struct sock *sk)
        sp->assocparams.sasoc_cookie_life = sctp_valid_cookie_life;
 
        /* Initialize default event subscriptions. By default, all the
-        * options are off. 
+        * options are off.
         */
        memset(&sp->subscribe, 0, sizeof(struct sctp_event_subscribe));
 
@@ -3099,8 +3099,8 @@ SCTP_STATIC int sctp_init_sock(struct sock *sk)
        sp->pathmtu     = 0; // allow default discovery
        sp->sackdelay   = sctp_sack_timeout;
        sp->param_flags = SPP_HB_ENABLE |
-                         SPP_PMTUD_ENABLE |
-                         SPP_SACKDELAY_ENABLE;
+                         SPP_PMTUD_ENABLE |
+                         SPP_SACKDELAY_ENABLE;
 
        /* If enabled no SCTP message fragmentation will be performed.
         * Configure through SCTP_DISABLE_FRAGMENTS socket option.
@@ -3680,7 +3680,7 @@ static int sctp_getsockopt_delayed_ack_time(struct sock *sk, int len,
        /* Get association, if assoc_id != 0 and the socket is a one
         * to many style socket, and an association was not found, then
         * the id was invalid.
-        */
+        */
        asoc = sctp_id2assoc(sk, params.assoc_id);
        if (!asoc && params.assoc_id && sctp_style(sk, UDP))
                return -EINVAL;
@@ -3756,7 +3756,7 @@ static int sctp_getsockopt_peer_addrs_num_old(struct sock *sk, int len,
        return cnt;
 }
 
-/* 
+/*
  * Old API for getting list of peer addresses. Does not work for 32-bit
  * programs running on a 64-bit kernel
  */
@@ -3833,7 +3833,7 @@ static int sctp_getsockopt_peer_addrs(struct sock *sk, int len,
                return -EINVAL;
 
        to = optval + offsetof(struct sctp_getaddrs,addrs);
-       space_left = len - sizeof(struct sctp_getaddrs) - 
+       space_left = len - sizeof(struct sctp_getaddrs) -
                        offsetof(struct sctp_getaddrs,addrs);
 
        list_for_each(pos, &asoc->peer.transport_addr_list) {
@@ -3907,7 +3907,7 @@ static int sctp_getsockopt_local_addrs_num_old(struct sock *sk, int len,
                                addr = list_entry(pos,
                                                  struct sctp_sockaddr_entry,
                                                  list);
-                               if ((PF_INET == sk->sk_family) && 
+                               if ((PF_INET == sk->sk_family) &&
                                    (AF_INET6 == addr->a.sa.sa_family))
                                        continue;
                                cnt++;
@@ -3941,7 +3941,7 @@ static int sctp_copy_laddrs_to_user_old(struct sock *sk, __u16 port, int max_add
 
        list_for_each_safe(pos, next, &sctp_local_addr_list) {
                addr = list_entry(pos, struct sctp_sockaddr_entry, list);
-               if ((PF_INET == sk->sk_family) && 
+               if ((PF_INET == sk->sk_family) &&
                    (AF_INET6 == addr->a.sa.sa_family))
                        continue;
                memcpy(&temp, &addr->a, sizeof(temp));
@@ -3970,7 +3970,7 @@ static int sctp_copy_laddrs_to_user(struct sock *sk, __u16 port,
 
        list_for_each_safe(pos, next, &sctp_local_addr_list) {
                addr = list_entry(pos, struct sctp_sockaddr_entry, list);
-               if ((PF_INET == sk->sk_family) && 
+               if ((PF_INET == sk->sk_family) &&
                    (AF_INET6 == addr->a.sa.sa_family))
                        continue;
                memcpy(&temp, &addr->a, sizeof(temp));
@@ -4051,7 +4051,7 @@ static int sctp_getsockopt_local_addrs_old(struct sock *sk, int len,
                                err = cnt;
                                goto unlock;
                        }
-                       goto copy_getaddrs;             
+                       goto copy_getaddrs;
                }
        }
 
@@ -4139,7 +4139,7 @@ static int sctp_getsockopt_local_addrs(struct sock *sk, int len,
                                err = cnt;
                                goto unlock;
                        }
-                       goto copy_getaddrs;             
+                       goto copy_getaddrs;
                }
        }
 
@@ -4196,7 +4196,7 @@ static int sctp_getsockopt_primary_addr(struct sock *sk, int len,
 
        if (!asoc->peer.primary_path)
                return -ENOTCONN;
-       
+
        memcpy(&prim.ssp_addr, &asoc->peer.primary_path->ipaddr,
                asoc->peer.primary_path->af_specific->sockaddr_len);
 
@@ -4864,7 +4864,7 @@ SCTP_STATIC int sctp_seqpacket_listen(struct sock *sk, int backlog)
        if (!backlog) {
                if (sctp_sstate(sk, CLOSED))
                        return 0;
-               
+
                sctp_unhash_endpoint(ep);
                sk->sk_state = SCTP_SS_CLOSED;
        }
@@ -4872,7 +4872,7 @@ SCTP_STATIC int sctp_seqpacket_listen(struct sock *sk, int backlog)
        /* Return if we are already listening. */
        if (sctp_sstate(sk, LISTENING))
                return 0;
-               
+
        /*
         * If a bind() or sctp_bindx() is not called prior to a listen()
         * call that allows new associations to be accepted, the system
@@ -4907,7 +4907,7 @@ SCTP_STATIC int sctp_stream_listen(struct sock *sk, int backlog)
        if (!backlog) {
                if (sctp_sstate(sk, CLOSED))
                        return 0;
-               
+
                sctp_unhash_endpoint(ep);
                sk->sk_state = SCTP_SS_CLOSED;
        }
@@ -5010,7 +5010,7 @@ unsigned int sctp_poll(struct file *file, struct socket *sock, poll_table *wait)
         */
        if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))
                return (!list_empty(&sp->ep->asocs)) ?
-                       (POLLIN | POLLRDNORM) : 0;
+                       (POLLIN | POLLRDNORM) : 0;
 
        mask = 0;
 
@@ -5430,7 +5430,7 @@ static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p,
        DEFINE_WAIT(wait);
 
        SCTP_DEBUG_PRINTK("wait_for_sndbuf: asoc=%p, timeo=%ld, msg_len=%zu\n",
-                         asoc, (long)(*timeo_p), msg_len);
+                         asoc, (long)(*timeo_p), msg_len);
 
        /* Increment the association's refcnt.  */
        sctp_association_hold(asoc);
index 633cd178654b48da2c3acbba632ade51673bedcb..e2c679baf912ad35662837d4a6447057053218be 100644 (file)
@@ -254,7 +254,7 @@ static struct ctl_table_header * sctp_sysctl_header;
 /* Sysctl registration.  */
 void sctp_sysctl_register(void)
 {
-       sctp_sysctl_header = register_sysctl_table(sctp_root_table, 0);
+       sctp_sysctl_header = register_sysctl_table(sctp_root_table);
 }
 
 /* Sysctl deregistration.  */
index 3e5936a5f671db698f560e65b4f5761ad3edd579..a596f5308cb18c89cd63836f95d65aef1f630b58 100644 (file)
@@ -130,9 +130,9 @@ static struct sctp_transport *sctp_transport_init(struct sctp_transport *peer,
 struct sctp_transport *sctp_transport_new(const union sctp_addr *addr,
                                          gfp_t gfp)
 {
-        struct sctp_transport *transport;
+       struct sctp_transport *transport;
 
-        transport = t_new(struct sctp_transport, gfp);
+       transport = t_new(struct sctp_transport, gfp);
        if (!transport)
                goto fail;
 
@@ -185,7 +185,7 @@ static void sctp_transport_destroy(struct sctp_transport *transport)
        if (transport->asoc)
                sctp_association_put(transport->asoc);
 
-        sctp_packet_free(&transport->packet);
+       sctp_packet_free(&transport->packet);
 
        dst_release(transport->dst);
        kfree(transport);
@@ -268,7 +268,7 @@ void sctp_transport_route(struct sctp_transport *transport,
 
                /* Initialize sk->sk_rcv_saddr, if the transport is the
                 * association's active path for getsockname().
-                */ 
+                */
                if (asoc && (transport == asoc->peer.active_path))
                        opt->pf->af->to_sk_saddr(&transport->saddr,
                                                 asoc->base.sk);
@@ -459,8 +459,8 @@ void sctp_transport_lower_cwnd(struct sctp_transport *transport,
                 * destination address(es) to which the missing DATA chunks
                 * were last sent, according to the formula described in
                 * Section 7.2.3.
-                *
-                * RFC 2960 7.2.3, sctpimpguide Upon detection of packet
+                *
+                * RFC 2960 7.2.3, sctpimpguide Upon detection of packet
                 * losses from SACK (see Section 7.2.4), An endpoint
                 * should do the following:
                 *      ssthresh = max(cwnd/2, 4*MTU)
@@ -488,7 +488,7 @@ void sctp_transport_lower_cwnd(struct sctp_transport *transport,
                if ((jiffies - transport->last_time_ecne_reduced) >
                    transport->rtt) {
                        transport->ssthresh = max(transport->cwnd/2,
-                                                 4*transport->asoc->pathmtu);
+                                                 4*transport->asoc->pathmtu);
                        transport->cwnd = transport->ssthresh;
                        transport->last_time_ecne_reduced = jiffies;
                }
index 42d9498c64fadde9e6279cc8527734237fecc38b..d3192a1babccb96645c8f3d54db2621a62073fc1 100644 (file)
@@ -277,7 +277,7 @@ static void sctp_tsnmap_update(struct sctp_tsnmap *map)
                        /* Now tsn_map must have been all '1's,
                         * so we swap the map and check the overflow table
                         */
-                       __u8 *tmp = map->tsn_map;
+                       __u8 *tmp = map->tsn_map;
                        memset(tmp, 0, map->len);
                        map->tsn_map = map->overflow_map;
                        map->overflow_map = tmp;
index 445e07a7ac4b873cd1f7138e806fd97c1d1a0193..2e11bc8d5d35cf79bf8908536c7cdb76bd3f12bc 100644 (file)
@@ -749,7 +749,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_pdapi(
         */
        pd->pdapi_length = sizeof(struct sctp_pdapi_event);
 
-        /*  pdapi_indication: 32 bits (unsigned integer)
+       /*  pdapi_indication: 32 bits (unsigned integer)
         *
         * This field holds the indication being sent to the application.
         */
@@ -790,13 +790,13 @@ void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event,
                return;
 
        /* Sockets API Extensions for SCTP
-        * Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
-        *
-        * sinfo_stream: 16 bits (unsigned integer)
-        *
-        * For recvmsg() the SCTP stack places the message's stream number in
-        * this value.
-       */
+        * Section 5.2.2 SCTP Header Information Structure (SCTP_SNDRCV)
+        *
+        * sinfo_stream: 16 bits (unsigned integer)
+        *
+        * For recvmsg() the SCTP stack places the message's stream number in
+        * this value.
+       */
        sinfo.sinfo_stream = event->stream;
        /* sinfo_ssn: 16 bits (unsigned integer)
         *
@@ -828,7 +828,7 @@ void sctp_ulpevent_read_sndrcvinfo(const struct sctp_ulpevent *event,
        sinfo.sinfo_flags = event->flags;
        /* sinfo_tsn: 32 bit (unsigned integer)
         *
-        * For the receiving side, this field holds a TSN that was 
+        * For the receiving side, this field holds a TSN that was
         * assigned to one of the SCTP Data Chunks.
         */
        sinfo.sinfo_tsn = event->tsn;
@@ -879,7 +879,7 @@ static void sctp_ulpevent_receive_data(struct sctp_ulpevent *event,
         * fragment of the real event.  However, we still need to do rwnd
         * accounting.
         * In general, the skb passed from IP can have only 1 level of
-        * fragments. But we allow multiple levels of fragments. 
+        * fragments. But we allow multiple levels of fragments.
         */
        for (frag = skb_shinfo(skb)->frag_list; frag; frag = frag->next) {
                sctp_ulpevent_receive_data(sctp_skb2event(frag), asoc);
@@ -888,7 +888,7 @@ static void sctp_ulpevent_receive_data(struct sctp_ulpevent *event,
 
 /* Do accounting for bytes just read by user and release the references to
  * the association.
- */ 
+ */
 static void sctp_ulpevent_release_data(struct sctp_ulpevent *event)
 {
        struct sk_buff *skb, *frag;
index e1d144275f97aab998d4edc5155e608a316945e9..f4759a9bdaee5d52c21850928c132e4dc7ecf523 100644 (file)
@@ -191,7 +191,7 @@ int sctp_ulpq_tail_event(struct sctp_ulpq *ulpq, struct sctp_ulpevent *event)
                queue = &sk->sk_receive_queue;
        } else if (ulpq->pd_mode) {
                if (event->msg_flags & MSG_NOTIFICATION)
-                       queue = &sctp_sk(sk)->pd_lobby;
+                       queue = &sctp_sk(sk)->pd_lobby;
                else {
                        clear_pd = event->msg_flags & MSG_EOR;
                        queue = &sk->sk_receive_queue;
@@ -298,32 +298,32 @@ static struct sctp_ulpevent *sctp_make_reassembled_event(struct sk_buff_head *qu
         */
        if (last)
                last->next = pos;
-       else {
-               if (skb_cloned(f_frag)) {
-                       /* This is a cloned skb, we can't just modify
-                        * the frag_list.  We need a new skb to do that.
-                        * Instead of calling skb_unshare(), we'll do it
-                        * ourselves since we need to delay the free.
-                        */
-                       new = skb_copy(f_frag, GFP_ATOMIC);
-                       if (!new)
-                               return NULL;    /* try again later */
-
-                       sctp_skb_set_owner_r(new, f_frag->sk);
-
-                       skb_shinfo(new)->frag_list = pos;
-               } else
-                       skb_shinfo(f_frag)->frag_list = pos;
-       }
+       else {
+               if (skb_cloned(f_frag)) {
+                       /* This is a cloned skb, we can't just modify
+                        * the frag_list.  We need a new skb to do that.
+                        * Instead of calling skb_unshare(), we'll do it
+                        * ourselves since we need to delay the free.
+                        */
+                       new = skb_copy(f_frag, GFP_ATOMIC);
+                       if (!new)
+                               return NULL;    /* try again later */
+
+                       sctp_skb_set_owner_r(new, f_frag->sk);
+
+                       skb_shinfo(new)->frag_list = pos;
+               } else
+                       skb_shinfo(f_frag)->frag_list = pos;
+       }
 
        /* Remove the first fragment from the reassembly queue.  */
        __skb_unlink(f_frag, queue);
 
-       /* if we did unshare, then free the old skb and re-assign */
-       if (new) {
-               kfree_skb(f_frag);
-               f_frag = new;
-       }
+       /* if we did unshare, then free the old skb and re-assign */
+       if (new) {
+               kfree_skb(f_frag);
+               f_frag = new;
+       }
 
        while (pos) {
 
@@ -335,7 +335,7 @@ static struct sctp_ulpevent *sctp_make_reassembled_event(struct sk_buff_head *qu
 
                /* Remove the fragment from the reassembly queue.  */
                __skb_unlink(pos, queue);
-       
+
                /* Break if we have reached the last fragment.  */
                if (pos == l_frag)
                        break;
@@ -624,7 +624,7 @@ static inline void sctp_ulpq_store_ordered(struct sctp_ulpq *ulpq,
 
        sid = event->stream;
        ssn = event->ssn;
-       
+
        cevent = (struct sctp_ulpevent *) pos->cb;
        csid = cevent->stream;
        cssn = cevent->ssn;
@@ -718,11 +718,11 @@ static inline void sctp_ulpq_reap_ordered(struct sctp_ulpq *ulpq)
                if (cssn != sctp_ssn_peek(in, csid))
                        break;
 
-               /* Found it, so mark in the ssnmap. */         
+               /* Found it, so mark in the ssnmap. */
                sctp_ssn_next(in, csid);
 
                __skb_unlink(pos, &ulpq->lobby);
-               if (!event) {                                           
+               if (!event) {
                        /* Create a temporary list to collect chunks on.  */
                        event = sctp_skb2event(pos);
                        __skb_queue_tail(&temp, sctp_event2skb(event));
@@ -755,7 +755,7 @@ void sctp_ulpq_skip(struct sctp_ulpq *ulpq, __u16 sid, __u16 ssn)
        sctp_ssn_skip(in, sid, ssn);
 
        /* Go find any other chunks that were waiting for
-        * ordering and deliver them if needed. 
+        * ordering and deliver them if needed.
         */
        sctp_ulpq_reap_ordered(ulpq);
        return;
@@ -849,7 +849,7 @@ void sctp_ulpq_renege(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk,
        if (chunk) {
                needed = ntohs(chunk->chunk_hdr->length);
                needed -= sizeof(sctp_data_chunk_t);
-       } else 
+       } else
                needed = SCTP_DEFAULT_MAXWINDOW;
 
        freed = 0;
@@ -866,7 +866,7 @@ void sctp_ulpq_renege(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk,
                tsn = ntohl(chunk->subh.data_hdr->tsn);
                sctp_tsnmap_mark(&asoc->peer.tsn_map, tsn);
                sctp_ulpq_tail_data(ulpq, chunk, gfp);
-               
+
                sctp_ulpq_partial_delivery(ulpq, chunk, gfp);
        }
 
index 5f374e1ff5268922371fa6c485f63a5ae2089ba6..0778c54424117ee48c6337714f3fe72403d4f7ae 100644 (file)
@@ -117,7 +117,7 @@ static ssize_t sock_sendpage(struct file *file, struct page *page,
  *     in the operation structures but are done directly via the socketcall() multiplexor.
  */
 
-static struct file_operations socket_file_ops = {
+static const struct file_operations socket_file_ops = {
        .owner =        THIS_MODULE,
        .llseek =       no_llseek,
        .aio_read =     sock_aio_read,
@@ -2180,7 +2180,7 @@ done:
 }
 
 int kernel_connect(struct socket *sock, struct sockaddr *addr, int addrlen,
-                   int flags)
+                  int flags)
 {
        return sock->ops->connect(sock, addr, addrlen, flags);
 }
index 993ff1a5d945687883c51ffc4a8662c87aa7704a..9527f2bb17449ea6808f4fffd5f73feace80442f 100644 (file)
@@ -181,7 +181,7 @@ rpcauth_gc_credcache(struct rpc_auth *auth, struct hlist_head *free)
        struct rpc_cred *cred;
        int             i;
 
-       dprintk("RPC: gc'ing RPC credentials for auth %p\n", auth);
+       dprintk("RPC:       gc'ing RPC credentials for auth %p\n", auth);
        for (i = 0; i < RPC_CREDCACHE_NR; i++) {
                hlist_for_each_safe(pos, next, &cache->hashtable[i]) {
                        cred = hlist_entry(pos, struct rpc_cred, cr_hash);
@@ -213,7 +213,7 @@ retry:
                rpcauth_gc_credcache(auth, &free);
        hlist_for_each_safe(pos, next, &cache->hashtable[nr]) {
                struct rpc_cred *entry;
-               entry = hlist_entry(pos, struct rpc_cred, cr_hash);
+               entry = hlist_entry(pos, struct rpc_cred, cr_hash);
                if (entry->cr_ops->crmatch(acred, entry, flags)) {
                        hlist_del(&entry->cr_hash);
                        cred = entry;
@@ -267,7 +267,7 @@ rpcauth_lookupcred(struct rpc_auth *auth, int flags)
        };
        struct rpc_cred *ret;
 
-       dprintk("RPC:     looking up %s cred\n",
+       dprintk("RPC:       looking up %s cred\n",
                auth->au_ops->au_name);
        get_group_info(acred.group_info);
        ret = auth->au_ops->lookup_cred(auth, &acred, flags);
@@ -287,7 +287,7 @@ rpcauth_bindcred(struct rpc_task *task)
        struct rpc_cred *ret;
        int flags = 0;
 
-       dprintk("RPC: %4d looking up %s cred\n",
+       dprintk("RPC: %5u looking up %s cred\n",
                task->tk_pid, task->tk_auth->au_ops->au_name);
        get_group_info(acred.group_info);
        if (task->tk_flags & RPC_TASK_ROOTCREDS)
@@ -304,8 +304,9 @@ rpcauth_bindcred(struct rpc_task *task)
 void
 rpcauth_holdcred(struct rpc_task *task)
 {
-       dprintk("RPC: %4d holding %s cred %p\n",
-               task->tk_pid, task->tk_auth->au_ops->au_name, task->tk_msg.rpc_cred);
+       dprintk("RPC: %5u holding %s cred %p\n",
+               task->tk_pid, task->tk_auth->au_ops->au_name,
+               task->tk_msg.rpc_cred);
        if (task->tk_msg.rpc_cred)
                get_rpccred(task->tk_msg.rpc_cred);
 }
@@ -324,7 +325,7 @@ rpcauth_unbindcred(struct rpc_task *task)
 {
        struct rpc_cred *cred = task->tk_msg.rpc_cred;
 
-       dprintk("RPC: %4d releasing %s cred %p\n",
+       dprintk("RPC: %5u releasing %s cred %p\n",
                task->tk_pid, task->tk_auth->au_ops->au_name, cred);
 
        put_rpccred(cred);
@@ -336,7 +337,7 @@ rpcauth_marshcred(struct rpc_task *task, __be32 *p)
 {
        struct rpc_cred *cred = task->tk_msg.rpc_cred;
 
-       dprintk("RPC: %4d marshaling %s cred %p\n",
+       dprintk("RPC: %5u marshaling %s cred %p\n",
                task->tk_pid, task->tk_auth->au_ops->au_name, cred);
 
        return cred->cr_ops->crmarshal(task, p);
@@ -347,7 +348,7 @@ rpcauth_checkverf(struct rpc_task *task, __be32 *p)
 {
        struct rpc_cred *cred = task->tk_msg.rpc_cred;
 
-       dprintk("RPC: %4d validating %s cred %p\n",
+       dprintk("RPC: %5u validating %s cred %p\n",
                task->tk_pid, task->tk_auth->au_ops->au_name, cred);
 
        return cred->cr_ops->crvalidate(task, p);
@@ -359,7 +360,7 @@ rpcauth_wrap_req(struct rpc_task *task, kxdrproc_t encode, void *rqstp,
 {
        struct rpc_cred *cred = task->tk_msg.rpc_cred;
 
-       dprintk("RPC: %4d using %s cred %p to wrap rpc data\n",
+       dprintk("RPC: %5u using %s cred %p to wrap rpc data\n",
                        task->tk_pid, cred->cr_ops->cr_name, cred);
        if (cred->cr_ops->crwrap_req)
                return cred->cr_ops->crwrap_req(task, encode, rqstp, data, obj);
@@ -373,7 +374,7 @@ rpcauth_unwrap_resp(struct rpc_task *task, kxdrproc_t decode, void *rqstp,
 {
        struct rpc_cred *cred = task->tk_msg.rpc_cred;
 
-       dprintk("RPC: %4d using %s cred %p to unwrap rpc data\n",
+       dprintk("RPC: %5u using %s cred %p to unwrap rpc data\n",
                        task->tk_pid, cred->cr_ops->cr_name, cred);
        if (cred->cr_ops->crunwrap_resp)
                return cred->cr_ops->crunwrap_resp(task, decode, rqstp,
@@ -388,7 +389,7 @@ rpcauth_refreshcred(struct rpc_task *task)
        struct rpc_cred *cred = task->tk_msg.rpc_cred;
        int err;
 
-       dprintk("RPC: %4d refreshing %s cred %p\n",
+       dprintk("RPC: %5u refreshing %s cred %p\n",
                task->tk_pid, task->tk_auth->au_ops->au_name, cred);
 
        err = cred->cr_ops->crrefresh(task);
@@ -400,7 +401,7 @@ rpcauth_refreshcred(struct rpc_task *task)
 void
 rpcauth_invalcred(struct rpc_task *task)
 {
-       dprintk("RPC: %4d invalidating %s cred %p\n",
+       dprintk("RPC: %5u invalidating %s cred %p\n",
                task->tk_pid, task->tk_auth->au_ops->au_name, task->tk_msg.rpc_cred);
        spin_lock(&rpc_credcache_lock);
        if (task->tk_msg.rpc_cred)
index e1a104abb782d81635937f90aa202742f3836f84..4e4ccc5b6fea905131bab2cc6d1a7dd39fd14b97 100644 (file)
@@ -2,7 +2,7 @@
  * linux/net/sunrpc/auth_gss/auth_gss.c
  *
  * RPCSEC_GSS client authentication.
- * 
+ *
  *  Copyright (c) 2000 The Regents of the University of Michigan.
  *  All rights reserved.
  *
@@ -74,7 +74,7 @@ static struct rpc_credops gss_credops;
 * as it is passed to gssd to signal the use of
 * machine creds should be part of the shared rpc interface */
 
-#define CA_RUN_AS_MACHINE  0x00000200 
+#define CA_RUN_AS_MACHINE  0x00000200
 
 /* dump the buffer in `emacs-hexl' style */
 #define isprint(c)      ((c > 0x1f) && (c < 0x7f))
@@ -241,7 +241,7 @@ gss_fill_context(const void *p, const void *end, struct gss_cl_ctx *ctx, struct
        }
        return q;
 err:
-       dprintk("RPC:      gss_fill_context returning %ld\n", -PTR_ERR(p));
+       dprintk("RPC:       gss_fill_context returning %ld\n", -PTR_ERR(p));
        return p;
 }
 
@@ -276,10 +276,10 @@ __gss_find_upcall(struct gss_auth *gss_auth, uid_t uid)
                if (pos->uid != uid)
                        continue;
                atomic_inc(&pos->count);
-               dprintk("RPC:      gss_find_upcall found msg %p\n", pos);
+               dprintk("RPC:       gss_find_upcall found msg %p\n", pos);
                return pos;
        }
-       dprintk("RPC:      gss_find_upcall found nothing\n");
+       dprintk("RPC:       gss_find_upcall found nothing\n");
        return NULL;
 }
 
@@ -393,7 +393,8 @@ gss_refresh_upcall(struct rpc_task *task)
        struct gss_upcall_msg *gss_msg;
        int err = 0;
 
-       dprintk("RPC: %4u gss_refresh_upcall for uid %u\n", task->tk_pid, cred->cr_uid);
+       dprintk("RPC: %5u gss_refresh_upcall for uid %u\n", task->tk_pid,
+                                                               cred->cr_uid);
        gss_msg = gss_setup_upcall(task->tk_client, gss_auth, cred);
        if (IS_ERR(gss_msg)) {
                err = PTR_ERR(gss_msg);
@@ -413,8 +414,8 @@ gss_refresh_upcall(struct rpc_task *task)
        spin_unlock(&gss_auth->lock);
        gss_release_msg(gss_msg);
 out:
-       dprintk("RPC: %4u gss_refresh_upcall for uid %u result %d\n", task->tk_pid,
-                       cred->cr_uid, err);
+       dprintk("RPC: %5u gss_refresh_upcall for uid %u result %d\n",
+                       task->tk_pid, cred->cr_uid, err);
        return err;
 }
 
@@ -426,7 +427,7 @@ gss_create_upcall(struct gss_auth *gss_auth, struct gss_cred *gss_cred)
        DEFINE_WAIT(wait);
        int err = 0;
 
-       dprintk("RPC: gss_upcall for uid %u\n", cred->cr_uid);
+       dprintk("RPC:       gss_upcall for uid %u\n", cred->cr_uid);
        gss_msg = gss_setup_upcall(gss_auth->client, gss_auth, cred);
        if (IS_ERR(gss_msg)) {
                err = PTR_ERR(gss_msg);
@@ -454,7 +455,8 @@ out_intr:
        finish_wait(&gss_msg->waitqueue, &wait);
        gss_release_msg(gss_msg);
 out:
-       dprintk("RPC: gss_create_upcall for uid %u result %d\n", cred->cr_uid, err);
+       dprintk("RPC:       gss_create_upcall for uid %u result %d\n",
+                       cred->cr_uid, err);
        return err;
 }
 
@@ -546,14 +548,14 @@ gss_pipe_downcall(struct file *filp, const char __user *src, size_t mlen)
        }
        gss_put_ctx(ctx);
        kfree(buf);
-       dprintk("RPC:      gss_pipe_downcall returning length %Zu\n", mlen);
+       dprintk("RPC:       gss_pipe_downcall returning length %Zu\n", mlen);
        return mlen;
 err_put_ctx:
        gss_put_ctx(ctx);
 err:
        kfree(buf);
 out:
-       dprintk("RPC:      gss_pipe_downcall returning %d\n", err);
+       dprintk("RPC:       gss_pipe_downcall returning %d\n", err);
        return err;
 }
 
@@ -591,7 +593,7 @@ gss_pipe_destroy_msg(struct rpc_pipe_msg *msg)
        static unsigned long ratelimit;
 
        if (msg->errno < 0) {
-               dprintk("RPC:      gss_pipe_destroy_msg releasing msg %p\n",
+               dprintk("RPC:       gss_pipe_destroy_msg releasing msg %p\n",
                                gss_msg);
                atomic_inc(&gss_msg->count);
                gss_unhash_msg(gss_msg);
@@ -607,8 +609,8 @@ gss_pipe_destroy_msg(struct rpc_pipe_msg *msg)
        }
 }
 
-/* 
- * NOTE: we have the opportunity to use different 
+/*
+ * NOTE: we have the opportunity to use different
  * parameters based on the input flavor (which must be a pseudoflavor)
  */
 static struct rpc_auth *
@@ -618,7 +620,7 @@ gss_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor)
        struct rpc_auth * auth;
        int err = -ENOMEM; /* XXX? */
 
-       dprintk("RPC:      creating GSS authenticator for client %p\n",clnt);
+       dprintk("RPC:       creating GSS authenticator for client %p\n", clnt);
 
        if (!try_module_get(THIS_MODULE))
                return ERR_PTR(err);
@@ -670,8 +672,8 @@ gss_destroy(struct rpc_auth *auth)
 {
        struct gss_auth *gss_auth;
 
-       dprintk("RPC:      destroying GSS authenticator %p flavor %d\n",
-               auth, auth->au_flavor);
+       dprintk("RPC:       destroying GSS authenticator %p flavor %d\n",
+                       auth, auth->au_flavor);
 
        gss_auth = container_of(auth, struct gss_auth, rpc_auth);
        rpc_unlink(gss_auth->dentry);
@@ -689,7 +691,7 @@ gss_destroy(struct rpc_auth *auth)
 static void
 gss_destroy_ctx(struct gss_cl_ctx *ctx)
 {
-       dprintk("RPC:      gss_destroy_ctx\n");
+       dprintk("RPC:       gss_destroy_ctx\n");
 
        if (ctx->gc_gss_ctx)
                gss_delete_sec_context(&ctx->gc_gss_ctx);
@@ -703,7 +705,7 @@ gss_destroy_cred(struct rpc_cred *rc)
 {
        struct gss_cred *cred = container_of(rc, struct gss_cred, gc_base);
 
-       dprintk("RPC:      gss_destroy_cred \n");
+       dprintk("RPC:       gss_destroy_cred \n");
 
        if (cred->gc_ctx)
                gss_put_ctx(cred->gc_ctx);
@@ -726,7 +728,7 @@ gss_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
        struct gss_cred *cred = NULL;
        int err = -ENOMEM;
 
-       dprintk("RPC:      gss_create_cred for uid %d, flavor %d\n",
+       dprintk("RPC:       gss_create_cred for uid %d, flavor %d\n",
                acred->uid, auth->au_flavor);
 
        if (!(cred = kzalloc(sizeof(*cred), GFP_KERNEL)))
@@ -745,7 +747,7 @@ gss_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
        return &cred->gc_base;
 
 out_err:
-       dprintk("RPC:      gss_create_cred failed with error %d\n", err);
+       dprintk("RPC:       gss_create_cred failed with error %d\n", err);
        return ERR_PTR(err);
 }
 
@@ -799,7 +801,7 @@ gss_marshal(struct rpc_task *task, __be32 *p)
        struct kvec     iov;
        struct xdr_buf  verf_buf;
 
-       dprintk("RPC: %4u gss_marshal\n", task->tk_pid);
+       dprintk("RPC: %5u gss_marshal\n", task->tk_pid);
 
        *p++ = htonl(RPC_AUTH_GSS);
        cred_len = p++;
@@ -865,11 +867,11 @@ gss_validate(struct rpc_task *task, __be32 *p)
        u32             flav,len;
        u32             maj_stat;
 
-       dprintk("RPC: %4u gss_validate\n", task->tk_pid);
+       dprintk("RPC: %5u gss_validate\n", task->tk_pid);
 
        flav = ntohl(*p++);
        if ((len = ntohl(*p++)) > RPC_MAX_AUTH_SIZE)
-                goto out_bad;
+               goto out_bad;
        if (flav != RPC_AUTH_GSS)
                goto out_bad;
        seq = htonl(task->tk_rqstp->rq_seqno);
@@ -888,12 +890,12 @@ gss_validate(struct rpc_task *task, __be32 *p)
         * calculate the length of the verifier: */
        task->tk_auth->au_verfsize = XDR_QUADLEN(len) + 2;
        gss_put_ctx(ctx);
-       dprintk("RPC: %4u GSS gss_validate: gss_verify_mic succeeded.\n",
+       dprintk("RPC: %5u gss_validate: gss_verify_mic succeeded.\n",
                        task->tk_pid);
        return p + XDR_QUADLEN(len);
 out_bad:
        gss_put_ctx(ctx);
-       dprintk("RPC: %4u gss_validate failed.\n", task->tk_pid);
+       dprintk("RPC: %5u gss_validate failed.\n", task->tk_pid);
        return NULL;
 }
 
@@ -925,7 +927,7 @@ gss_wrap_req_integ(struct rpc_cred *cred, struct gss_cl_ctx *ctx,
        *integ_len = htonl(integ_buf.len);
 
        /* guess whether we're in the head or the tail: */
-       if (snd_buf->page_len || snd_buf->tail[0].iov_len) 
+       if (snd_buf->page_len || snd_buf->tail[0].iov_len)
                iov = snd_buf->tail;
        else
                iov = snd_buf->head;
@@ -1030,7 +1032,7 @@ gss_wrap_req_priv(struct rpc_cred *cred, struct gss_cl_ctx *ctx,
        maj_stat = gss_wrap(ctx->gc_gss_ctx, offset, snd_buf, inpages);
        /* RPC_SLACK_SPACE should prevent this ever happening: */
        BUG_ON(snd_buf->len > snd_buf->buflen);
-        status = -EIO;
+       status = -EIO;
        /* We're assuming that when GSS_S_CONTEXT_EXPIRED, the encryption was
         * done anyway, so it's safe to put the request on the wire: */
        if (maj_stat == GSS_S_CONTEXT_EXPIRED)
@@ -1063,7 +1065,7 @@ gss_wrap_req(struct rpc_task *task,
        struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred);
        int             status = -EIO;
 
-       dprintk("RPC: %4u gss_wrap_req\n", task->tk_pid);
+       dprintk("RPC: %5u gss_wrap_req\n", task->tk_pid);
        if (ctx->gc_proc != RPC_GSS_PROC_DATA) {
                /* The spec seems a little ambiguous here, but I think that not
                 * wrapping context destruction requests makes the most sense.
@@ -1079,14 +1081,14 @@ gss_wrap_req(struct rpc_task *task,
                        status = gss_wrap_req_integ(cred, ctx, encode,
                                                                rqstp, p, obj);
                        break;
-                       case RPC_GSS_SVC_PRIVACY:
+               case RPC_GSS_SVC_PRIVACY:
                        status = gss_wrap_req_priv(cred, ctx, encode,
                                        rqstp, p, obj);
                        break;
        }
 out:
        gss_put_ctx(ctx);
-       dprintk("RPC: %4u gss_wrap_req returning %d\n", task->tk_pid, status);
+       dprintk("RPC: %5u gss_wrap_req returning %d\n", task->tk_pid, status);
        return status;
 }
 
@@ -1179,7 +1181,7 @@ gss_unwrap_resp(struct rpc_task *task,
                        if (status)
                                goto out;
                        break;
-                       case RPC_GSS_SVC_PRIVACY:
+               case RPC_GSS_SVC_PRIVACY:
                        status = gss_unwrap_resp_priv(cred, ctx, rqstp, &p);
                        if (status)
                                goto out;
@@ -1192,11 +1194,11 @@ out_decode:
        status = decode(rqstp, p, obj);
 out:
        gss_put_ctx(ctx);
-       dprintk("RPC: %4u gss_unwrap_resp returning %d\n", task->tk_pid,
+       dprintk("RPC: %5u gss_unwrap_resp returning %d\n", task->tk_pid,
                        status);
        return status;
 }
-  
+
 static struct rpc_authops authgss_ops = {
        .owner          = THIS_MODULE,
        .au_flavor      = RPC_AUTH_GSS,
index 826df44e7fca15dfdb2f640e5dfc84f872ddb2ce..ea8c92ecdae5294834253f552fb8f1523501bc5d 100644 (file)
@@ -11,7 +11,7 @@
 
 /*
  * Copyright 1993 by OpenVision Technologies, Inc.
- * 
+ *
  * Permission to use, copy, modify, distribute, and sell this software
  * and its documentation for any purpose is hereby granted without fee,
  * provided that the above copyright notice appears in all copies and
@@ -21,7 +21,7 @@
  * without specific, written prior permission. OpenVision makes no
  * representations about the suitability of this software for any
  * purpose.  It is provided "as is" without express or implied warranty.
- * 
+ *
  * OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
  * EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -201,7 +201,7 @@ g_verify_token_header(struct xdr_netobj *mech, int *body_size,
                return(G_BAD_TOK_HEADER);
        if (*buf++ != 0x06)
                return(G_BAD_TOK_HEADER);
+
        if ((toksize-=1) < 0)
                return(G_BAD_TOK_HEADER);
        toid.len = *buf++;
@@ -211,9 +211,9 @@ g_verify_token_header(struct xdr_netobj *mech, int *body_size,
        toid.data = buf;
        buf+=toid.len;
 
-       if (! g_OID_equal(&toid, mech)) 
+       if (! g_OID_equal(&toid, mech))
                ret = G_WRONG_MECH;
+
    /* G_WRONG_MECH is not returned immediately because it's more important
       to return G_BAD_TOK_HEADER if the token header is in fact bad */
 
index d926cda8862399de9d73d94c30063004a7c6b3f5..f441aa0b26dcebb879daea6b2c3e42eccd0584bb 100644 (file)
@@ -58,7 +58,7 @@ krb5_encrypt(
        int length)
 {
        u32 ret = -EINVAL;
-        struct scatterlist sg[1];
+       struct scatterlist sg[1];
        u8 local_iv[16] = {0};
        struct blkcipher_desc desc = { .tfm = tfm, .info = local_iv };
 
@@ -66,7 +66,7 @@ krb5_encrypt(
                goto out;
 
        if (crypto_blkcipher_ivsize(tfm) > 16) {
-               dprintk("RPC:      gss_k5encrypt: tfm iv size to large %d\n",
+               dprintk("RPC:       gss_k5encrypt: tfm iv size to large %d\n",
                         crypto_blkcipher_ivsize(tfm));
                goto out;
        }
@@ -79,7 +79,7 @@ krb5_encrypt(
 
        ret = crypto_blkcipher_encrypt_iv(&desc, sg, sg, length);
 out:
-       dprintk("RPC:      krb5_encrypt returns %d\n",ret);
+       dprintk("RPC:       krb5_encrypt returns %d\n", ret);
        return ret;
 }
 
@@ -102,7 +102,7 @@ krb5_decrypt(
                goto out;
 
        if (crypto_blkcipher_ivsize(tfm) > 16) {
-               dprintk("RPC:      gss_k5decrypt: tfm iv size to large %d\n",
+               dprintk("RPC:       gss_k5decrypt: tfm iv size to large %d\n",
                        crypto_blkcipher_ivsize(tfm));
                goto out;
        }
@@ -114,7 +114,7 @@ krb5_decrypt(
 
        ret = crypto_blkcipher_decrypt_iv(&desc, sg, sg, length);
 out:
-       dprintk("RPC:      gss_k5decrypt returns %d\n",ret);
+       dprintk("RPC:       gss_k5decrypt returns %d\n",ret);
        return ret;
 }
 
index 05d4bee86fc06d32c0ab559a936bfff92b8623ae..7b194321705323441b28cb413632bcae23a3bc21 100644 (file)
@@ -175,7 +175,8 @@ gss_import_sec_context_kerberos(const void *p,
        }
 
        ctx_id->internal_ctx_id = ctx;
-       dprintk("RPC:      Successfully imported new context.\n");
+
+       dprintk("RPC:       Successfully imported new context.\n");
        return 0;
 
 out_err_free_key2:
index d0bb5064f8c5ae1b0578b8f635cea5d5df0695a4..a0d9faa59cb55d6bc6720d5159301fbc0fa712f2 100644 (file)
@@ -83,7 +83,7 @@ gss_get_mic_kerberos(struct gss_ctx *gss_ctx, struct xdr_buf *text,
        s32                     now;
        u32                     seq_send;
 
-       dprintk("RPC:     gss_krb5_seal\n");
+       dprintk("RPC:       gss_krb5_seal\n");
 
        now = get_seconds();
 
index c604baf3a5f694de79525cedf66a120d59953dd9..43f3421f1e6a829f640fe4b4ba7874638c86f9bd 100644 (file)
@@ -11,7 +11,7 @@
 
 /*
  * Copyright 1993 by OpenVision Technologies, Inc.
- * 
+ *
  * Permission to use, copy, modify, distribute, and sell this software
  * and its documentation for any purpose is hereby granted without fee,
  * provided that the above copyright notice appears in all copies and
@@ -21,7 +21,7 @@
  * without specific, written prior permission. OpenVision makes no
  * representations about the suitability of this software for any
  * purpose.  It is provided "as is" without express or implied warranty.
- * 
+ *
  * OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
  * EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
@@ -70,7 +70,7 @@ krb5_get_seq_num(struct crypto_blkcipher *key,
        s32 code;
        unsigned char plain[8];
 
-       dprintk("RPC:      krb5_get_seq_num:\n");
+       dprintk("RPC:       krb5_get_seq_num:\n");
 
        if ((code = krb5_decrypt(key, cksum, buf, plain, 8)))
                return code;
index 87f8977ccece78861cd8d65c1e83007930b82cc0..e30a993466bc2ccb27de86c66656390baecf22dc 100644 (file)
@@ -86,7 +86,7 @@ gss_verify_mic_kerberos(struct gss_ctx *gss_ctx,
        unsigned char           *ptr = (unsigned char *)read_token->data;
        int                     bodysize;
 
-       dprintk("RPC:      krb5_read_token\n");
+       dprintk("RPC:       krb5_read_token\n");
 
        if (g_verify_token_header(&ctx->mech_used, &bodysize, &ptr,
                                        read_token->len))
index fe25b3d898dc53951be0c84166df3eae02487817..42b3220bed399093ce7008a3b1183109c65e49ee 100644 (file)
@@ -129,7 +129,7 @@ gss_wrap_kerberos(struct gss_ctx *ctx, int offset,
        struct page             **tmp_pages;
        u32                     seq_send;
 
-       dprintk("RPC:     gss_wrap_kerberos\n");
+       dprintk("RPC:       gss_wrap_kerberos\n");
 
        now = get_seconds();
 
@@ -215,7 +215,7 @@ gss_unwrap_kerberos(struct gss_ctx *ctx, int offset, struct xdr_buf *buf)
        int                     data_len;
        int                     blocksize;
 
-       dprintk("RPC:      gss_unwrap_kerberos\n");
+       dprintk("RPC:       gss_unwrap_kerberos\n");
 
        ptr = (u8 *)buf->head[0].iov_base + offset;
        if (g_verify_token_header(&kctx->mech_used, &bodysize, &ptr,
index 3db745379d060a0d3e0a653636223e3d7d460ab4..26872517ccf3c4efc861d190841bcb49d10eb99e 100644 (file)
@@ -6,14 +6,14 @@
  *
  *  J. Bruce Fields   <bfields@umich.edu>
  *
- *  Redistribution and use in source and binary forms, with or without 
+ *  Redistribution and use in source and binary forms, with or without
  *  modification, are permitted provided that the following conditions
  *  are met:
  *
  *  1. Redistributions of source code must retain the above copyright
  *     notice, this list of conditions and the following disclaimer.
  *  2. Redistributions in binary form must reproduce the above copyright
- *     notice, this list of conditions and the following disclaimer in the 
+ *     notice, this list of conditions and the following disclaimer in the
  *     documentation and/or other materials provided with the distribution.
  *  3. Neither the name of the University nor the names of its
  *     contributors may be used to endorse or promote products derived
@@ -113,7 +113,7 @@ gss_mech_register(struct gss_api_mech *gm)
        spin_lock(&registered_mechs_lock);
        list_add(&gm->gm_list, &registered_mechs);
        spin_unlock(&registered_mechs_lock);
-       dprintk("RPC:      registered gss mechanism %s\n", gm->gm_name);
+       dprintk("RPC:       registered gss mechanism %s\n", gm->gm_name);
        return 0;
 }
 
@@ -125,7 +125,7 @@ gss_mech_unregister(struct gss_api_mech *gm)
        spin_lock(&registered_mechs_lock);
        list_del(&gm->gm_list);
        spin_unlock(&registered_mechs_lock);
-       dprintk("RPC:      unregistered gss mechanism %s\n", gm->gm_name);
+       dprintk("RPC:       unregistered gss mechanism %s\n", gm->gm_name);
        gss_mech_free(gm);
 }
 
@@ -298,7 +298,7 @@ gss_unwrap(struct gss_ctx   *ctx_id,
 u32
 gss_delete_sec_context(struct gss_ctx  **context_handle)
 {
-       dprintk("RPC:      gss_delete_sec_context deleting %p\n",
+       dprintk("RPC:       gss_delete_sec_context deleting %p\n",
                        *context_handle);
 
        if (!*context_handle)
index 8ef3f1c1943564f5eb788467f40dff1ff8852604..7e15aa68ae64c57800d4fef33f20bc1a9a80b33a 100644 (file)
@@ -97,7 +97,8 @@ gss_import_sec_context_spkm3(const void *p, size_t len,
        if (IS_ERR(p))
                goto out_err_free_ctx;
        if (version != 1) {
-               dprintk("RPC: unknown spkm3 token format: obsolete nfs-utils?\n");
+               dprintk("RPC:       unknown spkm3 token format: "
+                               "obsolete nfs-utils?\n");
                goto out_err_free_ctx;
        }
 
@@ -138,7 +139,7 @@ gss_import_sec_context_spkm3(const void *p, size_t len,
 
        ctx_id->internal_ctx_id = ctx;
 
-       dprintk("Successfully imported new spkm context.\n");
+       dprintk("RPC:       Successfully imported new spkm context.\n");
        return 0;
 
 out_err_free_intg_key:
@@ -183,7 +184,7 @@ gss_verify_mic_spkm3(struct gss_ctx         *ctx,
 
        maj_stat = spkm3_read_token(sctx, checksum, signbuf, SPKM_MIC_TOK);
 
-       dprintk("RPC: gss_verify_mic_spkm3 returning %d\n", maj_stat);
+       dprintk("RPC:       gss_verify_mic_spkm3 returning %d\n", maj_stat);
        return maj_stat;
 }
 
@@ -197,7 +198,7 @@ gss_get_mic_spkm3(struct gss_ctx    *ctx,
 
        err = spkm3_make_token(sctx, message_buffer,
                                message_token, SPKM_MIC_TOK);
-       dprintk("RPC: gss_get_mic_spkm3 returning %d\n", err);
+       dprintk("RPC:       gss_get_mic_spkm3 returning %d\n", err);
        return err;
 }
 
index b179d58c6249cf66b2004aa18fb0560011f0c8e5..104cbf4f769fa21d5b6029f57dd741995006f9c0 100644 (file)
@@ -75,20 +75,21 @@ spkm3_make_token(struct spkm3_ctx *ctx,
        now = jiffies;
 
        if (ctx->ctx_id.len != 16) {
-               dprintk("RPC: spkm3_make_token BAD ctx_id.len %d\n",
+               dprintk("RPC:       spkm3_make_token BAD ctx_id.len %d\n",
                                ctx->ctx_id.len);
                goto out_err;
        }
 
        if (!g_OID_equal(&ctx->intg_alg, &hmac_md5_oid)) {
-               dprintk("RPC: gss_spkm3_seal: unsupported I-ALG algorithm."
-                               "only support hmac-md5 I-ALG.\n");
+               dprintk("RPC:       gss_spkm3_seal: unsupported I-ALG "
+                               "algorithm.  only support hmac-md5 I-ALG.\n");
                goto out_err;
        } else
                checksum_type = CKSUMTYPE_HMAC_MD5;
 
        if (!g_OID_equal(&ctx->conf_alg, &cast5_cbc_oid)) {
-               dprintk("RPC: gss_spkm3_seal: unsupported C-ALG algorithm\n");
+               dprintk("RPC:       gss_spkm3_seal: unsupported C-ALG "
+                               "algorithm\n");
                goto out_err;
        }
 
@@ -113,7 +114,8 @@ spkm3_make_token(struct spkm3_ctx *ctx,
 
                spkm3_make_mic_token(&ptr, tokenlen, &mic_hdr, &md5cksum, md5elen, md5zbit);
        } else if (toktype == SPKM_WRAP_TOK) { /* Not Supported */
-               dprintk("RPC: gss_spkm3_seal: SPKM_WRAP_TOK not supported\n");
+               dprintk("RPC:       gss_spkm3_seal: SPKM_WRAP_TOK "
+                               "not supported\n");
                goto out_err;
        }
 
@@ -153,7 +155,7 @@ make_spkm3_checksum(s32 cksumtype, struct xdr_netobj *key, char *header,
                        cksumname = "md5";
                        break;
                default:
-                       dprintk("RPC:      spkm3_make_checksum:"
+                       dprintk("RPC:       spkm3_make_checksum:"
                                        " unsupported checksum %d", cksumtype);
                        return GSS_S_FAILURE;
        }
index 35188b6ea8f75a950709498fa5dc187e73b0c02f..6cdd241ad267f7631f8a349aece2f91686fc230e 100644 (file)
@@ -59,7 +59,7 @@ asn1_bitstring_len(struct xdr_netobj *in, int *enclen, int *zerobits)
 
        /* count trailing 0's */
        for(i = in->len; i > 0; i--) {
-               if (*ptr == 0) { 
+               if (*ptr == 0) {
                        ptr--;
                        elen--;
                } else
@@ -82,7 +82,7 @@ asn1_bitstring_len(struct xdr_netobj *in, int *enclen, int *zerobits)
 
 /*
  * decode_asn1_bitstring()
- * 
+ *
  * decode a bitstring into a buffer of the expected length.
  * enclen = bit string length
  * explen = expected length (define in rfc)
@@ -97,9 +97,9 @@ decode_asn1_bitstring(struct xdr_netobj *out, char *in, int enclen, int explen)
        return 1;
 }
 
-/* 
+/*
  * SPKMInnerContextToken choice SPKM_MIC asn1 token layout
- * 
+ *
  * contextid is always 16 bytes plain data. max asn1 bitstring len = 17.
  *
  * tokenlen = pos[0] to end of token (max pos[45] with MD5 cksum)
@@ -107,21 +107,21 @@ decode_asn1_bitstring(struct xdr_netobj *out, char *in, int enclen, int explen)
  * pos  value
  * ----------
  * [0] a4  SPKM-MIC tag
- * [1] ??  innertoken length  (max 44) 
- * 
- * 
- * tok_hdr piece of checksum data starts here 
+ * [1] ??  innertoken length  (max 44)
+ *
+ *
+ * tok_hdr piece of checksum data starts here
  *
- * the maximum mic-header len = 9 + 17 = 26 
+ * the maximum mic-header len = 9 + 17 = 26
  *     mic-header
  *     ----------
- * [2] 30      SEQUENCE tag  
- * [3] ??      mic-header length: (max 23) = TokenID + ContextID 
+ * [2] 30      SEQUENCE tag
+ * [3] ??      mic-header length: (max 23) = TokenID + ContextID
  *
  *             TokenID  - all fields constant and can be hardcoded
  *             -------
  * [4]   02    Type 2
- * [5]   02    Length 2 
+ * [5]   02    Length 2
  * [6][7] 01 01        TokenID (SPKM_MIC_TOK)
  *
  *             ContextID  - encoded length not constant, calculated
@@ -131,17 +131,17 @@ decode_asn1_bitstring(struct xdr_netobj *out, char *in, int enclen, int explen)
  * [10]        ??      ctxzbit
  * [11]                contextid
  *
- * mic_header piece of checksum data ends here. 
+ * mic_header piece of checksum data ends here.
  *
  *     int-cksum - encoded length not constant, calculated
  *     ---------
  * [??]        03      Type 3
- * [??]        ??      encoded length 
- * [??]        ??      md5zbit         
+ * [??]        ??      encoded length
+ * [??]        ??      md5zbit
  * [??]                int-cksum (NID_md5 = 16)
  *
- * maximum SPKM-MIC innercontext token length = 
- *      10 + encoded contextid_size(17 max) + 2 + encoded  
+ * maximum SPKM-MIC innercontext token length =
+ *      10 + encoded contextid_size(17 max) + 2 + encoded
  *       cksum_size (17 maxfor NID_md5) = 46
  */
 
@@ -178,8 +178,8 @@ spkm3_mic_header(unsigned char **hdrbuf, unsigned int *hdrlen, unsigned char *ct
 /*
  * spkm3_mic_innercontext_token()
  *
- * *tokp points to the beginning of the SPKM_MIC token  described 
- * in rfc 2025, section 3.2.1: 
+ * *tokp points to the beginning of the SPKM_MIC token  described
+ * in rfc 2025, section 3.2.1:
  *
  * toklen is the inner token length
  */
@@ -209,7 +209,7 @@ spkm3_verify_mic_token(unsigned char **tokp, int *mic_hdrlen, unsigned char **ck
 
        /* spkm3 innercontext token preamble */
        if ((ptr[0] != 0xa4) || (ptr[2] != 0x30)) {
-               dprintk("RPC: BAD SPKM ictoken preamble\n"); 
+               dprintk("RPC:       BAD SPKM ictoken preamble\n");
                goto out;
        }
 
@@ -217,25 +217,25 @@ spkm3_verify_mic_token(unsigned char **tokp, int *mic_hdrlen, unsigned char **ck
 
        /* token type */
        if ((ptr[4] != 0x02) || (ptr[5] != 0x02)) {
-               dprintk("RPC: BAD asn1 SPKM3 token type\n");
+               dprintk("RPC:       BAD asn1 SPKM3 token type\n");
                goto out;
        }
 
        /* only support SPKM_MIC_TOK */
        if((ptr[6] != 0x01) || (ptr[7] != 0x01)) {
-               dprintk("RPC: ERROR unsupported SPKM3 token \n");
+               dprintk("RPC:       ERROR unsupported SPKM3 token \n");
                goto out;
        }
 
        /* contextid */
        if (ptr[8] != 0x03) {
-               dprintk("RPC: BAD SPKM3 asn1 context-id type\n");
+               dprintk("RPC:       BAD SPKM3 asn1 context-id type\n");
                goto out;
        }
 
        ctxelen = ptr[9];
        if (ctxelen > 17) {  /* length includes asn1 zbit octet */
-               dprintk("RPC: BAD SPKM3 contextid len %d\n", ctxelen);
+               dprintk("RPC:       BAD SPKM3 contextid len %d\n", ctxelen);
                goto out;
        }
 
@@ -245,17 +245,19 @@ spkm3_verify_mic_token(unsigned char **tokp, int *mic_hdrlen, unsigned char **ck
                goto out;
 
        /*
-       * in the current implementation: the optional int-alg is not present 
-       * so the default int-alg (md5) is used the optional snd-seq field is 
-       * also not present 
+       * in the current implementation: the optional int-alg is not present
+       * so the default int-alg (md5) is used the optional snd-seq field is
+       * also not present
        */
 
        if (*mic_hdrlen != 6 + ctxelen) {
-               dprintk("RPC: BAD SPKM_ MIC_TOK header len %d: we only support default int-alg (should be absent) and do not support snd-seq\n", *mic_hdrlen);
+               dprintk("RPC:       BAD SPKM_ MIC_TOK header len %d: we only "
+                               "support default int-alg (should be absent) "
+                               "and do not support snd-seq\n", *mic_hdrlen);
                goto out;
        }
        /* checksum */
-        *cksum = (&ptr[10] + ctxelen); /* ctxelen includes ptr[10] */
+       *cksum = (&ptr[10] + ctxelen); /* ctxelen includes ptr[10] */
 
        ret = GSS_S_COMPLETE;
 out:
index e54581ca75702b43321aae63bced573ceffc73b8..cc21ee860bb67005958c3f3f9af62067d6eaad3f 100644 (file)
@@ -45,7 +45,7 @@
 
 /*
  * spkm3_read_token()
- * 
+ *
  * only SPKM_MIC_TOK with md5 intg-alg is supported
  */
 u32
@@ -72,7 +72,7 @@ spkm3_read_token(struct spkm3_ctx *ctx,
        /* decode the token */
 
        if (toktype != SPKM_MIC_TOK) {
-               dprintk("RPC: BAD SPKM3 token type: %d\n", toktype);
+               dprintk("RPC:       BAD SPKM3 token type: %d\n", toktype);
                goto out;
        }
 
@@ -80,7 +80,7 @@ spkm3_read_token(struct spkm3_ctx *ctx,
                goto out;
 
        if (*cksum++ != 0x03) {
-               dprintk("RPC: spkm3_read_token BAD checksum type\n");
+               dprintk("RPC:       spkm3_read_token BAD checksum type\n");
                goto out;
        }
        md5elen = *cksum++;
@@ -97,7 +97,8 @@ spkm3_read_token(struct spkm3_ctx *ctx,
         */
        ret = GSS_S_DEFECTIVE_TOKEN;
        if (!g_OID_equal(&ctx->intg_alg, &hmac_md5_oid)) {
-               dprintk("RPC: gss_spkm3_seal: unsupported I-ALG algorithm\n");
+               dprintk("RPC:       gss_spkm3_seal: unsupported I-ALG "
+                               "algorithm\n");
                goto out;
        }
 
@@ -113,7 +114,7 @@ spkm3_read_token(struct spkm3_ctx *ctx,
        ret = GSS_S_BAD_SIG;
        code = memcmp(md5cksum.data, wire_cksum.data, wire_cksum.len);
        if (code) {
-               dprintk("RPC: bad MIC checksum\n");
+               dprintk("RPC:       bad MIC checksum\n");
                goto out;
        }
 
index 066c64a97fd87fafd5e48411b82bae5abb574393..db298b501c817d1c0a90825aa526068293c59565 100644 (file)
@@ -172,8 +172,8 @@ static struct cache_head *rsi_alloc(void)
 }
 
 static void rsi_request(struct cache_detail *cd,
-                       struct cache_head *h,
-                       char **bpp, int *blen)
+                      struct cache_head *h,
+                      char **bpp, int *blen)
 {
        struct rsi *rsii = container_of(h, struct rsi, h);
 
@@ -184,7 +184,7 @@ static void rsi_request(struct cache_detail *cd,
 
 
 static int rsi_parse(struct cache_detail *cd,
-                    char *mesg, int mlen)
+                   char *mesg, int mlen)
 {
        /* context token expiry major minor context token */
        char *buf = mesg;
@@ -669,14 +669,14 @@ gss_verify_header(struct svc_rqst *rqstp, struct rsc *rsci,
        }
 
        if (gc->gc_seq > MAXSEQ) {
-               dprintk("RPC:      svcauth_gss: discarding request with large sequence number %d\n",
-                               gc->gc_seq);
+               dprintk("RPC:       svcauth_gss: discarding request with "
+                               "large sequence number %d\n", gc->gc_seq);
                *authp = rpcsec_gsserr_ctxproblem;
                return SVC_DENIED;
        }
        if (!gss_check_seq_num(rsci, gc->gc_seq)) {
-               dprintk("RPC:      svcauth_gss: discarding request with old sequence number %d\n",
-                               gc->gc_seq);
+               dprintk("RPC:       svcauth_gss: discarding request with "
+                               "old sequence number %d\n", gc->gc_seq);
                return SVC_DROP;
        }
        return SVC_OK;
@@ -958,7 +958,8 @@ svcauth_gss_accept(struct svc_rqst *rqstp, __be32 *authp)
        __be32          *reject_stat = resv->iov_base + resv->iov_len;
        int             ret;
 
-       dprintk("RPC:      svcauth_gss: argv->iov_len = %zd\n",argv->iov_len);
+       dprintk("RPC:       svcauth_gss: argv->iov_len = %zd\n",
+                       argv->iov_len);
 
        *authp = rpc_autherr_badcred;
        if (!svcdata)
index 3be257dc32b2af4e26a5f1028ac8dc30586b7e28..3df9fccab2f8b34c17b7d04208a0c46f3d9d4219 100644 (file)
@@ -10,7 +10,6 @@
 #include <linux/module.h>
 #include <linux/utsname.h>
 #include <linux/sunrpc/clnt.h>
-#include <linux/sched.h>
 
 #ifdef RPC_DEBUG
 # define RPCDBG_FACILITY       RPCDBG_AUTH
index f7f990c9afe2ef805b2ea75e1d9b23dbb7f2d2fc..4e7733aee36e8f42dafa178cceabdfa028a3dbae 100644 (file)
@@ -39,7 +39,8 @@ static struct rpc_credops     unix_credops;
 static struct rpc_auth *
 unx_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor)
 {
-       dprintk("RPC: creating UNIX authenticator for client %p\n", clnt);
+       dprintk("RPC:       creating UNIX authenticator for client %p\n",
+                       clnt);
        if (atomic_inc_return(&unix_auth.au_count) == 0)
                unix_cred_cache.nextgc = jiffies + (unix_cred_cache.expire >> 1);
        return &unix_auth;
@@ -48,7 +49,7 @@ unx_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor)
 static void
 unx_destroy(struct rpc_auth *auth)
 {
-       dprintk("RPC: destroying UNIX authenticator %p\n", auth);
+       dprintk("RPC:       destroying UNIX authenticator %p\n", auth);
        rpcauth_free_credcache(auth);
 }
 
@@ -67,8 +68,8 @@ unx_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
        struct unx_cred *cred;
        int             i;
 
-       dprintk("RPC:      allocating UNIX cred for uid %d gid %d\n",
-                               acred->uid, acred->gid);
+       dprintk("RPC:       allocating UNIX cred for uid %d gid %d\n",
+                       acred->uid, acred->gid);
 
        if (!(cred = kmalloc(sizeof(*cred), GFP_KERNEL)))
                return ERR_PTR(-ENOMEM);
index 14274490f92e8d9b521b5396320c5e76178adb5e..f02f24ae946877516d2fd8050c40aebb8ba7f43c 100644 (file)
@@ -215,7 +215,8 @@ int cache_check(struct cache_detail *detail,
                if (rv == -EAGAIN)
                        rv = -ENOENT;
        } else if (rv == -EAGAIN || age > refresh_age/2) {
-               dprintk("Want update, refage=%ld, age=%ld\n", refresh_age, age);
+               dprintk("RPC:       Want update, refage=%ld, age=%ld\n",
+                               refresh_age, age);
                if (!test_and_set_bit(CACHE_PENDING, &h->flags)) {
                        switch (cache_make_upcall(detail, h)) {
                        case -EINVAL:
@@ -274,7 +275,7 @@ int cache_check(struct cache_detail *detail,
  *
  * A table is then only scanned if the current time is at least
  * the nextcheck time.
- * 
+ *
  */
 
 static LIST_HEAD(cache_list);
@@ -282,9 +283,9 @@ static DEFINE_SPINLOCK(cache_list_lock);
 static struct cache_detail *current_detail;
 static int current_index;
 
-static struct file_operations cache_file_operations;
-static struct file_operations content_file_operations;
-static struct file_operations cache_flush_operations;
+static const struct file_operations cache_file_operations;
+static const struct file_operations content_file_operations;
+static const struct file_operations cache_flush_operations;
 
 static void do_cache_clean(struct work_struct *work);
 static DECLARE_DELAYED_WORK(cache_cleaner, do_cache_clean);
@@ -296,16 +297,16 @@ void cache_register(struct cache_detail *cd)
                struct proc_dir_entry *p;
                cd->proc_ent->owner = cd->owner;
                cd->channel_ent = cd->content_ent = NULL;
-               
-               p = create_proc_entry("flush", S_IFREG|S_IRUSR|S_IWUSR,
-                                     cd->proc_ent);
+
+               p = create_proc_entry("flush", S_IFREG|S_IRUSR|S_IWUSR,
+                                     cd->proc_ent);
                cd->flush_ent =  p;
-               if (p) {
-                       p->proc_fops = &cache_flush_operations;
-                       p->owner = cd->owner;
-                       p->data = cd;
-               }
+               if (p) {
+                       p->proc_fops = &cache_flush_operations;
+                       p->owner = cd->owner;
+                       p->data = cd;
+               }
+
                if (cd->cache_request || cd->cache_parse) {
                        p = create_proc_entry("channel", S_IFREG|S_IRUSR|S_IWUSR,
                                              cd->proc_ent);
@@ -316,16 +317,16 @@ void cache_register(struct cache_detail *cd)
                                p->data = cd;
                        }
                }
-               if (cd->cache_show) {
-                       p = create_proc_entry("content", S_IFREG|S_IRUSR|S_IWUSR,
-                                             cd->proc_ent);
+               if (cd->cache_show) {
+                       p = create_proc_entry("content", S_IFREG|S_IRUSR|S_IWUSR,
+                                             cd->proc_ent);
                        cd->content_ent = p;
-                       if (p) {
-                               p->proc_fops = &content_file_operations;
-                               p->owner = cd->owner;
-                               p->data = cd;
-                       }
-               }
+                       if (p) {
+                               p->proc_fops = &content_file_operations;
+                               p->owner = cd->owner;
+                               p->data = cd;
+                       }
+               }
        }
        rwlock_init(&cd->hash_lock);
        INIT_LIST_HEAD(&cd->queue);
@@ -417,15 +418,15 @@ static int cache_clean(void)
                current_index++;
 
        /* find a cleanable entry in the bucket and clean it, or set to next bucket */
-       
+
        if (current_detail && current_index < current_detail->hash_size) {
                struct cache_head *ch, **cp;
                struct cache_detail *d;
-               
+
                write_lock(&current_detail->hash_lock);
 
                /* Ok, now to clean this strand */
-                       
+
                cp = & current_detail->hash_table[current_index];
                ch = *cp;
                for (; ch; cp= & ch->next, ch= *cp) {
@@ -477,9 +478,9 @@ static void do_cache_clean(struct work_struct *work)
 }
 
 
-/* 
+/*
  * Clean all caches promptly.  This just calls cache_clean
- * repeatedly until we are sure that every cache has had a chance to 
+ * repeatedly until we are sure that every cache has had a chance to
  * be fully cleaned
  */
 void cache_flush(void)
@@ -508,7 +509,7 @@ void cache_purge(struct cache_detail *detail)
  * All deferred requests are stored in a hash table,
  * indexed by "struct cache_head *".
  * As it may be wasteful to store a whole request
- * structure, we allow the request to provide a 
+ * structure, we allow the request to provide a
  * deferred form, which must contain a
  * 'struct cache_deferred_req'
  * This cache_deferred_req contains a method to allow
@@ -584,7 +585,7 @@ static void cache_revisit_request(struct cache_head *item)
 
        INIT_LIST_HEAD(&pending);
        spin_lock(&cache_defer_lock);
-       
+
        lp = cache_defer_hash[hash].next;
        if (lp) {
                while (lp != &cache_defer_hash[hash]) {
@@ -614,7 +615,7 @@ void cache_clean_deferred(void *owner)
 
        INIT_LIST_HEAD(&pending);
        spin_lock(&cache_defer_lock);
-       
+
        list_for_each_entry_safe(dreq, tmp, &cache_defer_list, recent) {
                if (dreq->owner == owner) {
                        list_del(&dreq->hash);
@@ -639,7 +640,7 @@ void cache_clean_deferred(void *owner)
  * On write, an update request is processed
  * Poll works if anything to read, and always allows write
  *
- * Implemented by linked list of requests.  Each open file has 
+ * Implemented by linked list of requests.  Each open file has
  * a ->private that also exists in this list.  New request are added
  * to the end and may wakeup and preceding readers.
  * New readers are added to the head.  If, on read, an item is found with
@@ -887,7 +888,7 @@ cache_release(struct inode *inode, struct file *filp)
 
 
 
-static struct file_operations cache_file_operations = {
+static const struct file_operations cache_file_operations = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .read           = cache_read,
@@ -1059,10 +1060,10 @@ static int cache_make_upcall(struct cache_detail *detail, struct cache_head *h)
  * Messages are, like requests, separated into fields by
  * spaces and dequotes as \xHEXSTRING or embedded \nnn octal
  *
- * Message is 
+ * Message is
  *   reply cachename expiry key ... content....
  *
- * key and content are both parsed by cache 
+ * key and content are both parsed by cache
  */
 
 #define isodigit(c) (isdigit(c) && c <= '7')
@@ -1132,7 +1133,7 @@ static void *c_start(struct seq_file *m, loff_t *pos)
        unsigned hash, entry;
        struct cache_head *ch;
        struct cache_detail *cd = ((struct handle*)m->private)->cd;
-       
+
 
        read_lock(&cd->hash_lock);
        if (!n--)
@@ -1147,7 +1148,7 @@ static void *c_start(struct seq_file *m, loff_t *pos)
        do {
                hash++;
                n += 1LL<<32;
-       } while(hash < cd->hash_size && 
+       } while(hash < cd->hash_size &&
                cd->hash_table[hash]==NULL);
        if (hash >= cd->hash_size)
                return NULL;
@@ -1245,7 +1246,7 @@ static int content_release(struct inode *inode, struct file *file)
        return seq_release(inode, file);
 }
 
-static struct file_operations content_file_operations = {
+static const struct file_operations content_file_operations = {
        .open           = content_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -1297,7 +1298,7 @@ static ssize_t write_flush(struct file * file, const char __user * buf,
        return count;
 }
 
-static struct file_operations cache_flush_operations = {
+static const struct file_operations cache_flush_operations = {
        .open           = nonseekable_open,
        .read           = read_flush,
        .write          = write_flush,
index 16c9fbc1db6995e059ec263aa02449f912bd3942..6d7221fe990a593824245cf1bfac7b817df7dd64 100644 (file)
 # define RPCDBG_FACILITY       RPCDBG_CALL
 #endif
 
+#define dprint_status(t)                                       \
+       dprintk("RPC: %5u %s (status %d)\n", t->tk_pid,         \
+                       __FUNCTION__, t->tk_status)
+
 static DECLARE_WAIT_QUEUE_HEAD(destroy_wait);
 
 
@@ -106,8 +110,8 @@ static struct rpc_clnt * rpc_new_client(struct rpc_xprt *xprt, char *servname, s
        int err;
        int len;
 
-       dprintk("RPC: creating %s client for %s (xprt %p)\n",
-               program->name, servname, xprt);
+       dprintk("RPC:       creating %s client for %s (xprt %p)\n",
+                       program->name, servname, xprt);
 
        err = -EINVAL;
        if (!xprt)
@@ -220,7 +224,7 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
                xprt->resvport = 0;
 
        dprintk("RPC:       creating %s client for %s (xprt %p)\n",
-               args->program->name, args->servername, xprt);
+                       args->program->name, args->servername, xprt);
 
        clnt = rpc_new_client(xprt, args->servername, args->program,
                                args->version, args->authflavor);
@@ -245,6 +249,8 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
                clnt->cl_autobind = 1;
        if (args->flags & RPC_CLNT_CREATE_ONESHOT)
                clnt->cl_oneshot = 1;
+       if (args->flags & RPC_CLNT_CREATE_DISCRTRY)
+               clnt->cl_discrtry = 1;
 
        return clnt;
 }
@@ -288,7 +294,7 @@ out_no_path:
 out_no_stats:
        kfree(new);
 out_no_clnt:
-       dprintk("RPC: %s returned error %d\n", __FUNCTION__, err);
+       dprintk("RPC:       %s: returned error %d\n", __FUNCTION__, err);
        return ERR_PTR(err);
 }
 
@@ -301,7 +307,7 @@ out_no_clnt:
 int
 rpc_shutdown_client(struct rpc_clnt *clnt)
 {
-       dprintk("RPC: shutting down %s client for %s, tasks=%d\n",
+       dprintk("RPC:       shutting down %s client for %s, tasks=%d\n",
                        clnt->cl_protname, clnt->cl_server,
                        atomic_read(&clnt->cl_users));
 
@@ -336,7 +342,7 @@ rpc_destroy_client(struct rpc_clnt *clnt)
                return 1;
        BUG_ON(atomic_read(&clnt->cl_users) != 0);
 
-       dprintk("RPC: destroying %s client for %s\n",
+       dprintk("RPC:       destroying %s client for %s\n",
                        clnt->cl_protname, clnt->cl_server);
        if (clnt->cl_auth) {
                rpcauth_destroy(clnt->cl_auth);
@@ -366,8 +372,8 @@ out_free:
 void
 rpc_release_client(struct rpc_clnt *clnt)
 {
-       dprintk("RPC:      rpc_release_client(%p, %d)\n",
-                               clnt, atomic_read(&clnt->cl_users));
+       dprintk("RPC:       rpc_release_client(%p, %d)\n",
+                       clnt, atomic_read(&clnt->cl_users));
 
        if (!atomic_dec_and_test(&clnt->cl_users))
                return;
@@ -410,7 +416,7 @@ struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *old,
                rpc_shutdown_client(clnt);
                clnt = ERR_PTR(err);
        }
-out:   
+out:
        return clnt;
 }
 
@@ -431,7 +437,7 @@ static const struct rpc_call_ops rpc_default_ops = {
  *     sleeps on RPC calls
  */
 #define RPC_INTR_SIGNALS (sigmask(SIGHUP) | sigmask(SIGINT) | sigmask(SIGQUIT) | sigmask(SIGTERM))
+
 static void rpc_save_sigmask(sigset_t *oldset, int intr)
 {
        unsigned long   sigallow = sigmask(SIGKILL);
@@ -474,7 +480,7 @@ int rpc_call_sync(struct rpc_clnt *clnt, struct rpc_message *msg, int flags)
        int             status;
 
        /* If this client is slain all further I/O fails */
-       if (clnt->cl_dead) 
+       if (clnt->cl_dead)
                return -EIO;
 
        BUG_ON(flags & RPC_TASK_ASYNC);
@@ -486,17 +492,13 @@ int rpc_call_sync(struct rpc_clnt *clnt, struct rpc_message *msg, int flags)
        /* Mask signals on RPC calls _and_ GSS_AUTH upcalls */
        rpc_task_sigmask(task, &oldset);
 
-       rpc_call_setup(task, msg, 0);
-
        /* Set up the call info struct and execute the task */
+       rpc_call_setup(task, msg, 0);
+       if (task->tk_status == 0) {
+               atomic_inc(&task->tk_count);
+               rpc_execute(task);
+       }
        status = task->tk_status;
-       if (status != 0)
-               goto out;
-       atomic_inc(&task->tk_count);
-       status = rpc_execute(task);
-       if (status == 0)
-               status = task->tk_status;
-out:
        rpc_put_task(task);
        rpc_restore_sigmask(&oldset);
        return status;
@@ -515,7 +517,7 @@ rpc_call_async(struct rpc_clnt *clnt, struct rpc_message *msg, int flags,
 
        /* If this client is slain all further I/O fails */
        status = -EIO;
-       if (clnt->cl_dead) 
+       if (clnt->cl_dead)
                goto out_release;
 
        flags |= RPC_TASK_ASYNC;
@@ -526,7 +528,7 @@ rpc_call_async(struct rpc_clnt *clnt, struct rpc_message *msg, int flags,
                goto out_release;
 
        /* Mask signals on GSS_AUTH upcalls */
-       rpc_task_sigmask(task, &oldset);                
+       rpc_task_sigmask(task, &oldset);
 
        rpc_call_setup(task, msg, 0);
 
@@ -537,7 +539,7 @@ rpc_call_async(struct rpc_clnt *clnt, struct rpc_message *msg, int flags,
        else
                rpc_put_task(task);
 
-       rpc_restore_sigmask(&oldset);           
+       rpc_restore_sigmask(&oldset);
        return status;
 out_release:
        rpc_release_calldata(tk_ops, data);
@@ -658,9 +660,10 @@ call_start(struct rpc_task *task)
 {
        struct rpc_clnt *clnt = task->tk_client;
 
-       dprintk("RPC: %4d call_start %s%d proc %d (%s)\n", task->tk_pid,
-               clnt->cl_protname, clnt->cl_vers, task->tk_msg.rpc_proc->p_proc,
-               (RPC_IS_ASYNC(task) ? "async" : "sync"));
+       dprintk("RPC: %5u call_start %s%d proc %d (%s)\n", task->tk_pid,
+                       clnt->cl_protname, clnt->cl_vers,
+                       task->tk_msg.rpc_proc->p_proc,
+                       (RPC_IS_ASYNC(task) ? "async" : "sync"));
 
        /* Increment call count */
        task->tk_msg.rpc_proc->p_count++;
@@ -674,7 +677,7 @@ call_start(struct rpc_task *task)
 static void
 call_reserve(struct rpc_task *task)
 {
-       dprintk("RPC: %4d call_reserve\n", task->tk_pid);
+       dprint_status(task);
 
        if (!rpcauth_uptodatecred(task)) {
                task->tk_action = call_refresh;
@@ -694,8 +697,7 @@ call_reserveresult(struct rpc_task *task)
 {
        int status = task->tk_status;
 
-       dprintk("RPC: %4d call_reserveresult (status %d)\n",
-                               task->tk_pid, task->tk_status);
+       dprint_status(task);
 
        /*
         * After a call to xprt_reserve(), we must have either
@@ -749,8 +751,8 @@ call_allocate(struct rpc_task *task)
        struct rpc_xprt *xprt = task->tk_xprt;
        unsigned int    bufsiz;
 
-       dprintk("RPC: %4d call_allocate (status %d)\n", 
-                               task->tk_pid, task->tk_status);
+       dprint_status(task);
+
        task->tk_action = call_bind;
        if (req->rq_buffer)
                return;
@@ -761,7 +763,8 @@ call_allocate(struct rpc_task *task)
 
        if (xprt->ops->buf_alloc(task, bufsiz << 1) != NULL)
                return;
-       printk(KERN_INFO "RPC: buffer allocation failed for task %p\n", task); 
+
+       dprintk("RPC: %5u rpc_buffer allocation failed\n", task->tk_pid);
 
        if (RPC_IS_ASYNC(task) || !signalled()) {
                xprt_release(task);
@@ -798,8 +801,7 @@ call_encode(struct rpc_task *task)
        kxdrproc_t      encode;
        __be32          *p;
 
-       dprintk("RPC: %4d call_encode (status %d)\n", 
-                               task->tk_pid, task->tk_status);
+       dprint_status(task);
 
        /* Default buffer setup */
        bufsiz = req->rq_bufsize >> 1;
@@ -845,8 +847,7 @@ call_bind(struct rpc_task *task)
 {
        struct rpc_xprt *xprt = task->tk_xprt;
 
-       dprintk("RPC: %4d call_bind (status %d)\n",
-                               task->tk_pid, task->tk_status);
+       dprint_status(task);
 
        task->tk_action = call_connect;
        if (!xprt_bound(xprt)) {
@@ -865,8 +866,7 @@ call_bind_status(struct rpc_task *task)
        int status = -EACCES;
 
        if (task->tk_status >= 0) {
-               dprintk("RPC: %4d call_bind_status (status %d)\n",
-                                       task->tk_pid, task->tk_status);
+               dprint_status(task);
                task->tk_status = 0;
                task->tk_action = call_connect;
                return;
@@ -874,24 +874,24 @@ call_bind_status(struct rpc_task *task)
 
        switch (task->tk_status) {
        case -EACCES:
-               dprintk("RPC: %4d remote rpcbind: RPC program/version unavailable\n",
-                               task->tk_pid);
+               dprintk("RPC: %5u remote rpcbind: RPC program/version "
+                               "unavailable\n", task->tk_pid);
                rpc_delay(task, 3*HZ);
                goto retry_timeout;
        case -ETIMEDOUT:
-               dprintk("RPC: %4d rpcbind request timed out\n",
+               dprintk("RPC: %5u rpcbind request timed out\n",
                                task->tk_pid);
                goto retry_timeout;
        case -EPFNOSUPPORT:
-               dprintk("RPC: %4d remote rpcbind service unavailable\n",
+               dprintk("RPC: %5u remote rpcbind service unavailable\n",
                                task->tk_pid);
                break;
        case -EPROTONOSUPPORT:
-               dprintk("RPC: %4d remote rpcbind version 2 unavailable\n",
+               dprintk("RPC: %5u remote rpcbind version 2 unavailable\n",
                                task->tk_pid);
                break;
        default:
-               dprintk("RPC: %4d unrecognized rpcbind error (%d)\n",
+               dprintk("RPC: %5u unrecognized rpcbind error (%d)\n",
                                task->tk_pid, -task->tk_status);
                status = -EIO;
        }
@@ -911,7 +911,7 @@ call_connect(struct rpc_task *task)
 {
        struct rpc_xprt *xprt = task->tk_xprt;
 
-       dprintk("RPC: %4d call_connect xprt %p %s connected\n",
+       dprintk("RPC: %5u call_connect xprt %p %s connected\n",
                        task->tk_pid, xprt,
                        (xprt_connected(xprt) ? "is" : "is not"));
 
@@ -933,8 +933,7 @@ call_connect_status(struct rpc_task *task)
        struct rpc_clnt *clnt = task->tk_client;
        int status = task->tk_status;
 
-       dprintk("RPC: %5u call_connect_status (status %d)\n", 
-                               task->tk_pid, task->tk_status);
+       dprint_status(task);
 
        task->tk_status = 0;
        if (status >= 0) {
@@ -966,8 +965,7 @@ call_connect_status(struct rpc_task *task)
 static void
 call_transmit(struct rpc_task *task)
 {
-       dprintk("RPC: %4d call_transmit (status %d)\n", 
-                               task->tk_pid, task->tk_status);
+       dprint_status(task);
 
        task->tk_action = call_status;
        if (task->tk_status < 0)
@@ -1028,8 +1026,7 @@ call_status(struct rpc_task *task)
        if (req->rq_received > 0 && !req->rq_bytes_sent)
                task->tk_status = req->rq_received;
 
-       dprintk("RPC: %4d call_status (status %d)\n", 
-                               task->tk_pid, task->tk_status);
+       dprint_status(task);
 
        status = task->tk_status;
        if (status >= 0) {
@@ -1080,11 +1077,11 @@ call_timeout(struct rpc_task *task)
        struct rpc_clnt *clnt = task->tk_client;
 
        if (xprt_adjust_timeout(task->tk_rqstp) == 0) {
-               dprintk("RPC: %4d call_timeout (minor)\n", task->tk_pid);
+               dprintk("RPC: %5u call_timeout (minor)\n", task->tk_pid);
                goto retry;
        }
 
-       dprintk("RPC: %4d call_timeout (major)\n", task->tk_pid);
+       dprintk("RPC: %5u call_timeout (major)\n", task->tk_pid);
        task->tk_timeouts++;
 
        if (RPC_IS_SOFT(task)) {
@@ -1118,8 +1115,8 @@ call_decode(struct rpc_task *task)
        kxdrproc_t      decode = task->tk_msg.rpc_proc->p_decode;
        __be32          *p;
 
-       dprintk("RPC: %4d call_decode (status %d)\n", 
-                               task->tk_pid, task->tk_status);
+       dprintk("RPC: %5u call_decode (status %d)\n",
+                       task->tk_pid, task->tk_status);
 
        if (task->tk_flags & RPC_CALL_MAJORSEEN) {
                printk(KERN_NOTICE "%s: server %s OK\n",
@@ -1133,8 +1130,8 @@ call_decode(struct rpc_task *task)
                        clnt->cl_stats->rpcretrans++;
                        goto out_retry;
                }
-               dprintk("%s: too small RPC reply size (%d bytes)\n",
-                       clnt->cl_protname, task->tk_status);
+               dprintk("RPC:       %s: too small RPC reply size (%d bytes)\n",
+                               clnt->cl_protname, task->tk_status);
                task->tk_action = call_timeout;
                goto out_retry;
        }
@@ -1166,8 +1163,8 @@ call_decode(struct rpc_task *task)
                                                      task->tk_msg.rpc_resp);
                unlock_kernel();
        }
-       dprintk("RPC: %4d call_decode result %d\n", task->tk_pid,
-                                       task->tk_status);
+       dprintk("RPC: %5u call_decode result %d\n", task->tk_pid,
+                       task->tk_status);
        return;
 out_retry:
        req->rq_received = req->rq_private_buf.len = 0;
@@ -1180,7 +1177,7 @@ out_retry:
 static void
 call_refresh(struct rpc_task *task)
 {
-       dprintk("RPC: %4d call_refresh\n", task->tk_pid);
+       dprint_status(task);
 
        xprt_release(task);     /* Must do to obtain new XID */
        task->tk_action = call_refreshresult;
@@ -1196,8 +1193,8 @@ static void
 call_refreshresult(struct rpc_task *task)
 {
        int status = task->tk_status;
-       dprintk("RPC: %4d call_refreshresult (status %d)\n", 
-                               task->tk_pid, task->tk_status);
+
+       dprint_status(task);
 
        task->tk_status = 0;
        task->tk_action = call_reserve;
@@ -1275,11 +1272,15 @@ call_verify(struct rpc_task *task)
                        case RPC_AUTH_ERROR:
                                break;
                        case RPC_MISMATCH:
-                               dprintk("%s: RPC call version mismatch!\n", __FUNCTION__);
+                               dprintk("RPC: %5u %s: RPC call version "
+                                               "mismatch!\n",
+                                               task->tk_pid, __FUNCTION__);
                                error = -EPROTONOSUPPORT;
                                goto out_err;
                        default:
-                               dprintk("%s: RPC call rejected, unknown error: %x\n", __FUNCTION__, n);
+                               dprintk("RPC: %5u %s: RPC call rejected, "
+                                               "unknown error: %x\n",
+                                               task->tk_pid, __FUNCTION__, n);
                                goto out_eio;
                }
                if (--len < 0)
@@ -1292,8 +1293,8 @@ call_verify(struct rpc_task *task)
                        if (!task->tk_cred_retry)
                                break;
                        task->tk_cred_retry--;
-                       dprintk("RPC: %4d call_verify: retry stale creds\n",
-                                                       task->tk_pid);
+                       dprintk("RPC: %5u %s: retry stale creds\n",
+                                       task->tk_pid, __FUNCTION__);
                        rpcauth_invalcred(task);
                        task->tk_action = call_refresh;
                        goto out_retry;
@@ -1303,8 +1304,8 @@ call_verify(struct rpc_task *task)
                        if (!task->tk_garb_retry)
                                break;
                        task->tk_garb_retry--;
-                       dprintk("RPC: %4d call_verify: retry garbled creds\n",
-                                                       task->tk_pid);
+                       dprintk("RPC: %5u %s: retry garbled creds\n",
+                                       task->tk_pid, __FUNCTION__);
                        task->tk_action = call_bind;
                        goto out_retry;
                case RPC_AUTH_TOOWEAK:
@@ -1315,8 +1316,8 @@ call_verify(struct rpc_task *task)
                        printk(KERN_WARNING "call_verify: unknown auth error: %x\n", n);
                        error = -EIO;
                }
-               dprintk("RPC: %4d call_verify: call rejected %d\n",
-                                               task->tk_pid, n);
+               dprintk("RPC: %5u %s: call rejected %d\n",
+                               task->tk_pid, __FUNCTION__, n);
                goto out_err;
        }
        if (!(p = rpcauth_checkverf(task, p))) {
@@ -1330,20 +1331,24 @@ call_verify(struct rpc_task *task)
        case RPC_SUCCESS:
                return p;
        case RPC_PROG_UNAVAIL:
-               dprintk("RPC: call_verify: program %u is unsupported by server %s\n",
+               dprintk("RPC: %5u %s: program %u is unsupported by server %s\n",
+                               task->tk_pid, __FUNCTION__,
                                (unsigned int)task->tk_client->cl_prog,
                                task->tk_client->cl_server);
                error = -EPFNOSUPPORT;
                goto out_err;
        case RPC_PROG_MISMATCH:
-               dprintk("RPC: call_verify: program %u, version %u unsupported by server %s\n",
+               dprintk("RPC: %5u %s: program %u, version %u unsupported by "
+                               "server %s\n", task->tk_pid, __FUNCTION__,
                                (unsigned int)task->tk_client->cl_prog,
                                (unsigned int)task->tk_client->cl_vers,
                                task->tk_client->cl_server);
                error = -EPROTONOSUPPORT;
                goto out_err;
        case RPC_PROC_UNAVAIL:
-               dprintk("RPC: call_verify: proc %p unsupported by program %u, version %u on server %s\n",
+               dprintk("RPC: %5u %s: proc %p unsupported by program %u, "
+                               "version %u on server %s\n",
+                               task->tk_pid, __FUNCTION__,
                                task->tk_msg.rpc_proc,
                                task->tk_client->cl_prog,
                                task->tk_client->cl_vers,
@@ -1351,7 +1356,8 @@ call_verify(struct rpc_task *task)
                error = -EOPNOTSUPP;
                goto out_err;
        case RPC_GARBAGE_ARGS:
-               dprintk("RPC: %4d %s: server saw garbage\n", task->tk_pid, __FUNCTION__);
+               dprintk("RPC: %5u %s: server saw garbage\n",
+                               task->tk_pid, __FUNCTION__);
                break;                  /* retry */
        default:
                printk(KERN_WARNING "call_verify: server accept status: %x\n", n);
@@ -1362,7 +1368,8 @@ out_garbage:
        task->tk_client->cl_stats->rpcgarbage++;
        if (task->tk_garb_retry) {
                task->tk_garb_retry--;
-               dprintk("RPC %s: retrying %4d\n", __FUNCTION__, task->tk_pid);
+               dprintk("RPC: %5u %s: retrying\n",
+                               task->tk_pid, __FUNCTION__);
                task->tk_action = call_bind;
 out_retry:
                return ERR_PTR(-EAGAIN);
index 3946ec3eb517a674881fc3b8d35277f2a5f3de44..d9f765344589e5e87b53443c3787b355d440305c 100644 (file)
@@ -62,7 +62,10 @@ static inline void pmap_map_free(struct portmap_args *map)
 
 static void pmap_map_release(void *data)
 {
-       pmap_map_free(data);
+       struct portmap_args *map = data;
+
+       xprt_put(map->pm_xprt);
+       pmap_map_free(map);
 }
 
 static const struct rpc_call_ops pmap_getport_ops = {
@@ -94,7 +97,7 @@ void rpc_getport(struct rpc_task *task)
        struct rpc_task *child;
        int status;
 
-       dprintk("RPC: %4d rpc_getport(%s, %u, %u, %d)\n",
+       dprintk("RPC: %5u rpc_getport(%s, %u, %u, %d)\n",
                        task->tk_pid, clnt->cl_server,
                        clnt->cl_prog, clnt->cl_vers, xprt->prot);
 
@@ -133,7 +136,7 @@ void rpc_getport(struct rpc_task *task)
        status = -EIO;
        child = rpc_run_task(pmap_clnt, RPC_TASK_ASYNC, &pmap_getport_ops, map);
        if (IS_ERR(child))
-               goto bailout;
+               goto bailout_nofree;
        rpc_put_task(child);
 
        task->tk_xprt->stat.bind_count++;
@@ -175,7 +178,7 @@ int rpc_getport_external(struct sockaddr_in *sin, __u32 prog, __u32 vers, int pr
        char            hostname[32];
        int             status;
 
-       dprintk("RPC:      rpc_getport_external(%u.%u.%u.%u, %u, %u, %d)\n",
+       dprintk("RPC:       rpc_getport_external(%u.%u.%u.%u, %u, %u, %d)\n",
                        NIPQUAD(sin->sin_addr.s_addr), prog, vers, prot);
 
        sprintf(hostname, "%u.%u.%u.%u", NIPQUAD(sin->sin_addr.s_addr));
@@ -218,11 +221,10 @@ static void pmap_getport_done(struct rpc_task *child, void *data)
                status = 0;
        }
 
-       dprintk("RPC: %4d pmap_getport_done(status %d, port %u)\n",
+       dprintk("RPC: %5u pmap_getport_done(status %d, port %u)\n",
                        child->tk_pid, status, map->pm_port);
 
        pmap_wake_portmap_waiters(xprt, status);
-       xprt_put(xprt);
 }
 
 /**
@@ -255,13 +257,14 @@ int rpc_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay)
        struct rpc_clnt         *pmap_clnt;
        int error = 0;
 
-       dprintk("RPC: registering (%u, %u, %d, %u) with portmapper.\n",
+       dprintk("RPC:       registering (%u, %u, %d, %u) with portmapper.\n",
                        prog, vers, prot, port);
 
        pmap_clnt = pmap_create("localhost", &sin, IPPROTO_UDP, 1);
        if (IS_ERR(pmap_clnt)) {
                error = PTR_ERR(pmap_clnt);
-               dprintk("RPC: couldn't create pmap client. Error = %d\n", error);
+               dprintk("RPC:       couldn't create pmap client. Error = %d\n",
+                               error);
                return error;
        }
 
@@ -272,7 +275,7 @@ int rpc_register(u32 prog, u32 vers, int prot, unsigned short port, int *okay)
                        "RPC: failed to contact portmap (errno %d).\n",
                        error);
        }
-       dprintk("RPC: registration status %d/%d\n", error, *okay);
+       dprintk("RPC:       registration status %d/%d\n", error, *okay);
 
        /* Client deleted automatically because cl_oneshot == 1 */
        return error;
@@ -303,8 +306,9 @@ static struct rpc_clnt *pmap_create(char *hostname, struct sockaddr_in *srvaddr,
  */
 static int xdr_encode_mapping(struct rpc_rqst *req, __be32 *p, struct portmap_args *map)
 {
-       dprintk("RPC: xdr_encode_mapping(%u, %u, %u, %u)\n",
-               map->pm_prog, map->pm_vers, map->pm_prot, map->pm_port);
+       dprintk("RPC:       xdr_encode_mapping(%u, %u, %u, %u)\n",
+                       map->pm_prog, map->pm_vers,
+                       map->pm_prot, map->pm_port);
        *p++ = htonl(map->pm_prog);
        *p++ = htonl(map->pm_vers);
        *p++ = htonl(map->pm_prot);
@@ -329,7 +333,7 @@ static int xdr_decode_bool(struct rpc_rqst *req, __be32 *p, unsigned int *boolp)
 static struct rpc_procinfo     pmap_procedures[] = {
 [PMAP_SET] = {
          .p_proc               = PMAP_SET,
-         .p_encode             = (kxdrproc_t) xdr_encode_mapping,      
+         .p_encode             = (kxdrproc_t) xdr_encode_mapping,
          .p_decode             = (kxdrproc_t) xdr_decode_bool,
          .p_bufsiz             = 4,
          .p_count              = 1,
@@ -338,7 +342,7 @@ static struct rpc_procinfo  pmap_procedures[] = {
        },
 [PMAP_UNSET] = {
          .p_proc               = PMAP_UNSET,
-         .p_encode             = (kxdrproc_t) xdr_encode_mapping,      
+         .p_encode             = (kxdrproc_t) xdr_encode_mapping,
          .p_decode             = (kxdrproc_t) xdr_decode_bool,
          .p_bufsiz             = 4,
          .p_count              = 1,
index 89273d35e0cc433d554d2abe1a91305cea51a5d7..9b9ea5045569196947565d700f62672763b146f1 100644 (file)
@@ -309,7 +309,7 @@ rpc_pipe_ioctl(struct inode *ino, struct file *filp,
        }
 }
 
-static struct file_operations rpc_pipe_fops = {
+static const struct file_operations rpc_pipe_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .read           = rpc_pipe_read,
@@ -366,7 +366,7 @@ rpc_info_release(struct inode *inode, struct file *file)
        return single_release(inode, file);
 }
 
-static struct file_operations rpc_info_operations = {
+static const struct file_operations rpc_info_operations = {
        .owner          = THIS_MODULE,
        .open           = rpc_info_open,
        .read           = seq_read,
@@ -589,7 +589,7 @@ __rpc_mkdir(struct inode *dir, struct dentry *dentry)
 {
        struct inode *inode;
 
-       inode = rpc_get_inode(dir->i_sb, S_IFDIR | S_IRUSR | S_IXUSR);
+       inode = rpc_get_inode(dir->i_sb, S_IFDIR | S_IRUGO | S_IXUGO);
        if (!inode)
                goto out_err;
        inode->i_ino = iunique(dir->i_sb, 100);
index fc083f0b354434940b98aa27e882f9d4bef8bfe6..6d87320074b1556f98280dde419157f6288a2cb7 100644 (file)
@@ -4,7 +4,7 @@
  * Scheduling for synchronous and asynchronous RPC requests.
  *
  * Copyright (C) 1996 Olaf Kirch, <okir@monad.swb.de>
- * 
+ *
  * TCP NFS related read + write fixes
  * (C) 1999 Dave Airlie, University of Limerick, Ireland <airlied@linux.ie>
  */
@@ -74,7 +74,7 @@ static DEFINE_SPINLOCK(rpc_sched_lock);
 static inline void
 __rpc_disable_timer(struct rpc_task *task)
 {
-       dprintk("RPC: %4d disabling timer\n", task->tk_pid);
+       dprintk("RPC: %5u disabling timer\n", task->tk_pid);
        task->tk_timeout_fn = NULL;
        task->tk_timeout = 0;
 }
@@ -93,7 +93,7 @@ static void rpc_run_timer(struct rpc_task *task)
        callback = task->tk_timeout_fn;
        task->tk_timeout_fn = NULL;
        if (callback && RPC_IS_QUEUED(task)) {
-               dprintk("RPC: %4d running timer\n", task->tk_pid);
+               dprintk("RPC: %5u running timer\n", task->tk_pid);
                callback(task);
        }
        smp_mb__before_clear_bit();
@@ -110,7 +110,7 @@ __rpc_add_timer(struct rpc_task *task, rpc_action timer)
        if (!task->tk_timeout)
                return;
 
-       dprintk("RPC: %4d setting alarm for %lu ms\n",
+       dprintk("RPC: %5u setting alarm for %lu ms\n",
                        task->tk_pid, task->tk_timeout * 1000 / HZ);
 
        if (timer)
@@ -132,7 +132,7 @@ rpc_delete_timer(struct rpc_task *task)
                return;
        if (test_and_clear_bit(RPC_TASK_HAS_TIMER, &task->tk_runstate)) {
                del_singleshot_timer_sync(&task->tk_timer);
-               dprintk("RPC: %4d deleting timer\n", task->tk_pid);
+               dprintk("RPC: %5u deleting timer\n", task->tk_pid);
        }
 }
 
@@ -179,8 +179,8 @@ static void __rpc_add_wait_queue(struct rpc_wait_queue *queue, struct rpc_task *
        queue->qlen++;
        rpc_set_queued(task);
 
-       dprintk("RPC: %4d added to queue %p \"%s\"\n",
-                               task->tk_pid, queue, rpc_qname(queue));
+       dprintk("RPC: %5u added to queue %p \"%s\"\n",
+                       task->tk_pid, queue, rpc_qname(queue));
 }
 
 /*
@@ -212,8 +212,8 @@ static void __rpc_remove_wait_queue(struct rpc_task *task)
        else
                list_del(&task->u.tk_wait.list);
        queue->qlen--;
-       dprintk("RPC: %4d removed from queue %p \"%s\"\n",
-                               task->tk_pid, queue, rpc_qname(queue));
+       dprintk("RPC: %5u removed from queue %p \"%s\"\n",
+                       task->tk_pid, queue, rpc_qname(queue));
 }
 
 static inline void rpc_set_waitqueue_priority(struct rpc_wait_queue *queue, int priority)
@@ -307,7 +307,7 @@ EXPORT_SYMBOL(__rpc_wait_for_completion_task);
 /*
  * Make an RPC task runnable.
  *
- * Note: If the task is ASYNC, this must be called with 
+ * Note: If the task is ASYNC, this must be called with
  * the spinlock held to protect the wait queue operation.
  */
 static void rpc_make_runnable(struct rpc_task *task)
@@ -344,8 +344,8 @@ static void rpc_make_runnable(struct rpc_task *task)
 static void __rpc_sleep_on(struct rpc_wait_queue *q, struct rpc_task *task,
                        rpc_action action, rpc_action timer)
 {
-       dprintk("RPC: %4d sleep_on(queue \"%s\" time %ld)\n", task->tk_pid,
-                               rpc_qname(q), jiffies);
+       dprintk("RPC: %5u sleep_on(queue \"%s\" time %lu)\n",
+                       task->tk_pid, rpc_qname(q), jiffies);
 
        if (!RPC_IS_ASYNC(task) && !RPC_IS_ACTIVATED(task)) {
                printk(KERN_ERR "RPC: Inactive synchronous task put to sleep!\n");
@@ -381,7 +381,8 @@ void rpc_sleep_on(struct rpc_wait_queue *q, struct rpc_task *task,
  */
 static void __rpc_do_wake_up_task(struct rpc_task *task)
 {
-       dprintk("RPC: %4d __rpc_wake_up_task (now %ld)\n", task->tk_pid, jiffies);
+       dprintk("RPC: %5u __rpc_wake_up_task (now %lu)\n",
+                       task->tk_pid, jiffies);
 
 #ifdef RPC_DEBUG
        BUG_ON(task->tk_magic != RPC_TASK_MAGIC_ID);
@@ -397,7 +398,7 @@ static void __rpc_do_wake_up_task(struct rpc_task *task)
 
        rpc_make_runnable(task);
 
-       dprintk("RPC:      __rpc_wake_up_task done\n");
+       dprintk("RPC:       __rpc_wake_up_task done\n");
 }
 
 /*
@@ -418,7 +419,7 @@ static void __rpc_wake_up_task(struct rpc_task *task)
 static void
 __rpc_default_timer(struct rpc_task *task)
 {
-       dprintk("RPC: %d timeout (default timer)\n", task->tk_pid);
+       dprintk("RPC: %5u timeout (default timer)\n", task->tk_pid);
        task->tk_status = -ETIMEDOUT;
        rpc_wake_up_task(task);
 }
@@ -502,7 +503,8 @@ struct rpc_task * rpc_wake_up_next(struct rpc_wait_queue *queue)
 {
        struct rpc_task *task = NULL;
 
-       dprintk("RPC:      wake_up_next(%p \"%s\")\n", queue, rpc_qname(queue));
+       dprintk("RPC:       wake_up_next(%p \"%s\")\n",
+                       queue, rpc_qname(queue));
        rcu_read_lock_bh();
        spin_lock(&queue->lock);
        if (RPC_IS_PRIORITY(queue))
@@ -625,12 +627,12 @@ void rpc_release_calldata(const struct rpc_call_ops *ops, void *calldata)
 /*
  * This is the RPC `scheduler' (or rather, the finite state machine).
  */
-static int __rpc_execute(struct rpc_task *task)
+static void __rpc_execute(struct rpc_task *task)
 {
        int             status = 0;
 
-       dprintk("RPC: %4d rpc_execute flgs %x\n",
-                               task->tk_pid, task->tk_flags);
+       dprintk("RPC: %5u __rpc_execute flags=0x%x\n",
+                       task->tk_pid, task->tk_flags);
 
        BUG_ON(RPC_IS_QUEUED(task));
 
@@ -646,8 +648,8 @@ static int __rpc_execute(struct rpc_task *task)
                if (RPC_DO_CALLBACK(task)) {
                        /* Define a callback save pointer */
                        void (*save_callback)(struct rpc_task *);
-       
-                       /* 
+
+                       /*
                         * If a callback exists, save it, reset it,
                         * call it.
                         * The save is needed to stop from resetting
@@ -679,14 +681,14 @@ static int __rpc_execute(struct rpc_task *task)
                if (RPC_IS_ASYNC(task)) {
                        /* Careful! we may have raced... */
                        if (RPC_IS_QUEUED(task))
-                               return 0;
+                               return;
                        if (rpc_test_and_set_running(task))
-                               return 0;
+                               return;
                        continue;
                }
 
                /* sync task: sleep here */
-               dprintk("RPC: %4d sync task going to sleep\n", task->tk_pid);
+               dprintk("RPC: %5u sync task going to sleep\n", task->tk_pid);
                /* Note: Caller should be using rpc_clnt_sigmask() */
                status = out_of_line_wait_on_bit(&task->tk_runstate,
                                RPC_TASK_QUEUED, rpc_wait_bit_interruptible,
@@ -698,19 +700,19 @@ static int __rpc_execute(struct rpc_task *task)
                         * clean up after sleeping on some queue, we don't
                         * break the loop here, but go around once more.
                         */
-                       dprintk("RPC: %4d got signal\n", task->tk_pid);
+                       dprintk("RPC: %5u got signal\n", task->tk_pid);
                        task->tk_flags |= RPC_TASK_KILLED;
                        rpc_exit(task, -ERESTARTSYS);
                        rpc_wake_up_task(task);
                }
                rpc_set_running(task);
-               dprintk("RPC: %4d sync task resuming\n", task->tk_pid);
+               dprintk("RPC: %5u sync task resuming\n", task->tk_pid);
        }
 
-       dprintk("RPC: %4d, return %d, status %d\n", task->tk_pid, status, task->tk_status);
+       dprintk("RPC: %5u return %d, status %d\n", task->tk_pid, status,
+                       task->tk_status);
        /* Release all resources associated with the task */
        rpc_release_task(task);
-       return status;
 }
 
 /*
@@ -722,12 +724,11 @@ static int __rpc_execute(struct rpc_task *task)
  *      released. In particular note that tk_release() will have
  *      been called, so your task memory may have been freed.
  */
-int
-rpc_execute(struct rpc_task *task)
+void rpc_execute(struct rpc_task *task)
 {
        rpc_set_active(task);
        rpc_set_running(task);
-       return __rpc_execute(task);
+       __rpc_execute(task);
 }
 
 static void rpc_async_schedule(struct work_struct *work)
@@ -826,7 +827,7 @@ void rpc_init_task(struct rpc_task *task, struct rpc_clnt *clnt, int flags, cons
        /* starting timestamp */
        task->tk_start = jiffies;
 
-       dprintk("RPC: %4d new task procpid %d\n", task->tk_pid,
+       dprintk("RPC:       new task initialized, procpid %u\n",
                                current->pid);
 }
 
@@ -839,7 +840,7 @@ rpc_alloc_task(void)
 static void rpc_free_task(struct rcu_head *rcu)
 {
        struct rpc_task *task = container_of(rcu, struct rpc_task, u.tk_rcu);
-       dprintk("RPC: %4d freeing task\n", task->tk_pid);
+       dprintk("RPC: %5u freeing task\n", task->tk_pid);
        mempool_free(task, rpc_task_mempool);
 }
 
@@ -858,7 +859,7 @@ struct rpc_task *rpc_new_task(struct rpc_clnt *clnt, int flags, const struct rpc
 
        rpc_init_task(task, clnt, flags, tk_ops, calldata);
 
-       dprintk("RPC: %4d allocated task\n", task->tk_pid);
+       dprintk("RPC:       allocated task %p\n", task);
        task->tk_flags |= RPC_TASK_DYNAMIC;
 out:
        return task;
@@ -902,7 +903,7 @@ static void rpc_release_task(struct rpc_task *task)
 #ifdef RPC_DEBUG
        BUG_ON(task->tk_magic != RPC_TASK_MAGIC_ID);
 #endif
-       dprintk("RPC: %4d release task\n", task->tk_pid);
+       dprintk("RPC: %5u release task\n", task->tk_pid);
 
        /* Remove from global task list */
        spin_lock(&rpc_sched_lock);
@@ -955,7 +956,7 @@ void rpc_killall_tasks(struct rpc_clnt *clnt)
        struct rpc_task *rovr;
        struct list_head *le;
 
-       dprintk("RPC:      killing all tasks for client %p\n", clnt);
+       dprintk("RPC:       killing all tasks for client %p\n", clnt);
 
        /*
         * Spin lock all_tasks to prevent changes...
@@ -984,7 +985,8 @@ static void rpciod_killall(void)
                rpc_killall_tasks(NULL);
                flush_workqueue(rpciod_workqueue);
                if (!list_empty(&all_tasks)) {
-                       dprintk("rpciod_killall: waiting for tasks to exit\n");
+                       dprintk("RPC:       rpciod_killall: waiting for tasks "
+                                       "to exit\n");
                        yield();
                }
        }
@@ -1004,7 +1006,7 @@ rpciod_up(void)
        int error = 0;
 
        mutex_lock(&rpciod_mutex);
-       dprintk("rpciod_up: users %d\n", rpciod_users);
+       dprintk("RPC:       rpciod_up: users %u\n", rpciod_users);
        rpciod_users++;
        if (rpciod_workqueue)
                goto out;
@@ -1012,7 +1014,7 @@ rpciod_up(void)
         * If there's no pid, we should be the first user.
         */
        if (rpciod_users > 1)
-               printk(KERN_WARNING "rpciod_up: no workqueue, %d users??\n", rpciod_users);
+               printk(KERN_WARNING "rpciod_up: no workqueue, %u users??\n", rpciod_users);
        /*
         * Create the rpciod thread and wait for it to start.
         */
@@ -1034,7 +1036,7 @@ void
 rpciod_down(void)
 {
        mutex_lock(&rpciod_mutex);
-       dprintk("rpciod_down sema %d\n", rpciod_users);
+       dprintk("RPC:       rpciod_down sema %u\n", rpciod_users);
        if (rpciod_users) {
                if (--rpciod_users)
                        goto out;
@@ -1042,7 +1044,7 @@ rpciod_down(void)
                printk(KERN_WARNING "rpciod_down: no users??\n");
 
        if (!rpciod_workqueue) {
-               dprintk("rpciod_down: Nothing to do!\n");
+               dprintk("RPC:       rpciod_down: Nothing to do!\n");
                goto out;
        }
        rpciod_killall();
@@ -1072,7 +1074,7 @@ void rpc_show_tasks(void)
                if (RPC_IS_QUEUED(t))
                        rpc_waitq = rpc_qname(t->u.tk_wait.rpc_waitq);
 
-               printk("%05d %04d %04x %06d %8p %6d %8p %08ld %8s %8p %8p\n",
+               printk("%5u %04d %04x %6d %8p %6d %8p %8ld %8s %8p %8p\n",
                        t->tk_pid,
                        (t->tk_msg.rpc_proc ? t->tk_msg.rpc_proc->p_proc : -1),
                        t->tk_flags, t->tk_status,
index bd98124c3a649b97508685cd2f87b4813aeb83b7..74ba7d443dfc06ec7162c2d7b1735bc2bfc67e06 100644 (file)
@@ -16,7 +16,6 @@
 
 #include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
 #include <linux/sunrpc/clnt.h>
@@ -66,7 +65,7 @@ static int rpc_proc_open(struct inode *inode, struct file *file)
        return single_open(file, rpc_proc_show, PDE(inode)->data);
 }
 
-static struct file_operations rpc_proc_fops = {
+static const struct file_operations rpc_proc_fops = {
        .owner = THIS_MODULE,
        .open = rpc_proc_open,
        .read  = seq_read,
@@ -226,7 +225,7 @@ do_register(const char *name, void *data, const struct file_operations *fops)
        struct proc_dir_entry *ent;
 
        rpc_proc_init();
-       dprintk("RPC: registering /proc/net/rpc/%s\n", name);
+       dprintk("RPC:       registering /proc/net/rpc/%s\n", name);
 
        ent = create_proc_entry(name, 0, proc_net_rpc);
        if (ent) {
@@ -263,7 +262,7 @@ svc_proc_unregister(const char *name)
 void
 rpc_proc_init(void)
 {
-       dprintk("RPC: registering /proc/net/rpc\n");
+       dprintk("RPC:       registering /proc/net/rpc\n");
        if (!proc_net_rpc) {
                struct proc_dir_entry *ent;
                ent = proc_mkdir("rpc", proc_net);
@@ -277,7 +276,7 @@ rpc_proc_init(void)
 void
 rpc_proc_exit(void)
 {
-       dprintk("RPC: unregistering /proc/net/rpc\n");
+       dprintk("RPC:       unregistering /proc/net/rpc\n");
        if (proc_net_rpc) {
                proc_net_rpc = NULL;
                remove_proc_entry("net/rpc", NULL);
index d85fddeb6388f54e4293b85e1e64da965c2ebd76..43ecf62f12ef2b6797631b420009198d1ce9d883 100644 (file)
@@ -9,7 +9,6 @@
 #include <linux/module.h>
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/uio.h>
 #include <linux/unistd.h>
 #include <linux/init.h>
@@ -137,7 +136,7 @@ EXPORT_SYMBOL(nlm_debug);
 
 extern int register_rpc_pipefs(void);
 extern void unregister_rpc_pipefs(void);
-extern struct cache_detail ip_map_cache;
+extern struct cache_detail ip_map_cache, unix_gid_cache;
 extern int init_socket_xprt(void);
 extern void cleanup_socket_xprt(void);
 
@@ -157,6 +156,7 @@ init_sunrpc(void)
        rpc_proc_init();
 #endif
        cache_register(&ip_map_cache);
+       cache_register(&unix_gid_cache);
        init_socket_xprt();
 out:
        return err;
@@ -170,6 +170,8 @@ cleanup_sunrpc(void)
        rpc_destroy_mempool();
        if (cache_unregister(&ip_map_cache))
                printk(KERN_ERR "sunrpc: failed to unregister ip_map cache\n");
+       if (cache_unregister(&unix_gid_cache))
+             printk(KERN_ERR "sunrpc: failed to unregister unix_gid cache\n");
 #ifdef RPC_DEBUG
        rpc_unregister_sysctl();
 #endif
index c1f878131ac61b6f9f24d1516e5ad00320526f9b..4ab137403e1ac3b0ff075b97dde73308bc843c8c 100644 (file)
@@ -317,7 +317,7 @@ __svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
        for (i = 0; i < serv->sv_nrpools; i++) {
                struct svc_pool *pool = &serv->sv_pools[i];
 
-               dprintk("initialising pool %u for %s\n",
+               dprintk("svc: initialising pool %u for %s\n",
                                i, serv->sv_name);
 
                pool->sp_id = i;
@@ -368,7 +368,7 @@ svc_destroy(struct svc_serv *serv)
 {
        struct svc_sock *svsk;
 
-       dprintk("RPC: svc_destroy(%s, %d)\n",
+       dprintk("svc: svc_destroy(%s, %d)\n",
                                serv->sv_program->pg_name,
                                serv->sv_nrthreads);
 
@@ -397,7 +397,7 @@ svc_destroy(struct svc_serv *serv)
                                  sk_list);
                svc_close_socket(svsk);
        }
-       
+
        cache_clean_deferred(serv);
 
        /* Unregister service with the portmapper */
@@ -415,7 +415,7 @@ svc_init_buffer(struct svc_rqst *rqstp, unsigned int size)
 {
        int pages;
        int arghi;
-       
+
        pages = size / PAGE_SIZE + 1; /* extra page as we hold both request and reply.
                                       * We assume one is at most one page
                                       */
@@ -514,7 +514,7 @@ choose_pool(struct svc_serv *serv, struct svc_pool *pool, unsigned int *state)
        if (pool != NULL)
                return pool;
 
-       return &serv->sv_pools[(*state)++ % serv->sv_nrpools];
+       return &serv->sv_pools[(*state)++ % serv->sv_nrpools];
 }
 
 /*
@@ -530,13 +530,13 @@ choose_victim(struct svc_serv *serv, struct svc_pool *pool, unsigned int *state)
                spin_lock_bh(&pool->sp_lock);
        } else {
                /* choose a pool in round-robin fashion */
-               for (i = 0; i < serv->sv_nrpools; i++) {
-                       pool = &serv->sv_pools[--(*state) % serv->sv_nrpools];
+               for (i = 0; i < serv->sv_nrpools; i++) {
+                       pool = &serv->sv_pools[--(*state) % serv->sv_nrpools];
                        spin_lock_bh(&pool->sp_lock);
-                       if (!list_empty(&pool->sp_all_threads))
-                               goto found_pool;
+                       if (!list_empty(&pool->sp_all_threads))
+                               goto found_pool;
                        spin_unlock_bh(&pool->sp_lock);
-               }
+               }
                return NULL;
        }
 
@@ -551,7 +551,7 @@ found_pool:
                rqstp = list_entry(pool->sp_all_threads.next, struct svc_rqst, rq_all);
                list_del_init(&rqstp->rq_all);
                task = rqstp->rq_task;
-       }
+       }
        spin_unlock_bh(&pool->sp_lock);
 
        return task;
@@ -636,7 +636,7 @@ svc_exit_thread(struct svc_rqst *rqstp)
 
 /*
  * Register an RPC service with the local portmapper.
- * To unregister a service, call this routine with 
+ * To unregister a service, call this routine with
  * proto and port == 0.
  */
 int
@@ -654,7 +654,7 @@ svc_register(struct svc_serv *serv, int proto, unsigned short port)
                        if (progp->pg_vers[i] == NULL)
                                continue;
 
-                       dprintk("RPC: svc_register(%s, %s, %d, %d)%s\n",
+                       dprintk("svc: svc_register(%s, %s, %d, %d)%s\n",
                                        progp->pg_name,
                                        proto == IPPROTO_UDP?  "udp" : "tcp",
                                        port,
@@ -709,7 +709,7 @@ svc_process(struct svc_rqst *rqstp)
                goto err_short_len;
 
        /* setup response xdr_buf.
-        * Initially it has just one page 
+        * Initially it has just one page
         */
        rqstp->rq_resused = 1;
        resv->iov_base = page_address(rqstp->rq_respages[0]);
@@ -811,7 +811,7 @@ svc_process(struct svc_rqst *rqstp)
        memset(rqstp->rq_argp, 0, procp->pc_argsize);
        memset(rqstp->rq_resp, 0, procp->pc_ressize);
 
-       /* un-reserve some of the out-queue now that we have a 
+       /* un-reserve some of the out-queue now that we have a
         * better idea of reply size
         */
        if (procp->pc_xdrressize)
index c7bb5f7f21a587213a4003ec1f5218492a579d3d..f5c3808bf85ab7cf1d03edaf8c43bbebc5faa3cf 100644 (file)
@@ -2,7 +2,7 @@
  * linux/net/sunrpc/svcauth.c
  *
  * The generic interface for RPC authentication on the server side.
- * 
+ *
  * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
  *
  * CHANGES
@@ -10,7 +10,6 @@
  */
 
 #include <linux/types.h>
-#include <linux/sched.h>
 #include <linux/module.h>
 #include <linux/sunrpc/types.h>
 #include <linux/sunrpc/xdr.h>
@@ -74,7 +73,7 @@ int svc_authorise(struct svc_rqst *rqstp)
        int rv = 0;
 
        rqstp->rq_authop = NULL;
-       
+
        if (aops) {
                rv = aops->release(rqstp);
                module_put(aops->owner);
index 0d1e8fb83b930ee4e9e472d07e2f265875389b02..9bae4090254c89f7fb0de7ab25529eac5ea2c90b 100644 (file)
@@ -151,7 +151,7 @@ static void ip_map_request(struct cache_detail *cd,
        char text_addr[20];
        struct ip_map *im = container_of(h, struct ip_map, h);
        __be32 addr = im->m_addr.s_addr;
-       
+
        snprintf(text_addr, 20, "%u.%u.%u.%u",
                 ntohl(addr) >> 24 & 0xff,
                 ntohl(addr) >> 16 & 0xff,
@@ -198,7 +198,7 @@ static int ip_map_parse(struct cache_detail *cd,
 
        if (sscanf(buf, "%u.%u.%u.%u%c", &b1, &b2, &b3, &b4, &c) != 4)
                return -EINVAL;
-       
+
        expiry = get_expiry(&mesg);
        if (expiry ==0)
                return -EINVAL;
@@ -248,7 +248,7 @@ static int ip_map_show(struct seq_file *m,
        /* class addr domain */
        addr = im->m_addr;
 
-       if (test_bit(CACHE_VALID, &h->flags) && 
+       if (test_bit(CACHE_VALID, &h->flags) &&
            !test_bit(CACHE_NEGATIVE, &h->flags))
                dom = im->m_client->h.name;
 
@@ -262,7 +262,7 @@ static int ip_map_show(struct seq_file *m,
                   );
        return 0;
 }
-       
+
 
 struct cache_detail ip_map_cache = {
        .owner          = THIS_MODULE,
@@ -343,7 +343,7 @@ int auth_unix_add_addr(struct in_addr addr, struct auth_domain *dom)
 int auth_unix_forget_old(struct auth_domain *dom)
 {
        struct unix_domain *udom;
-       
+
        if (dom->flavour != &svcauth_unix)
                return -EINVAL;
        udom = container_of(dom, struct unix_domain, h);
@@ -418,9 +418,218 @@ svcauth_unix_info_release(void *info)
        cache_put(&ipm->h, &ip_map_cache);
 }
 
+/****************************************************************************
+ * auth.unix.gid cache
+ * simple cache to map a UID to a list of GIDs
+ * because AUTH_UNIX aka AUTH_SYS has a max of 16
+ */
+#define        GID_HASHBITS    8
+#define        GID_HASHMAX     (1<<GID_HASHBITS)
+#define        GID_HASHMASK    (GID_HASHMAX - 1)
+
+struct unix_gid {
+       struct cache_head       h;
+       uid_t                   uid;
+       struct group_info       *gi;
+};
+static struct cache_head       *gid_table[GID_HASHMAX];
+
+static void unix_gid_put(struct kref *kref)
+{
+       struct cache_head *item = container_of(kref, struct cache_head, ref);
+       struct unix_gid *ug = container_of(item, struct unix_gid, h);
+       if (test_bit(CACHE_VALID, &item->flags) &&
+           !test_bit(CACHE_NEGATIVE, &item->flags))
+               put_group_info(ug->gi);
+       kfree(ug);
+}
+
+static int unix_gid_match(struct cache_head *corig, struct cache_head *cnew)
+{
+       struct unix_gid *orig = container_of(corig, struct unix_gid, h);
+       struct unix_gid *new = container_of(cnew, struct unix_gid, h);
+       return orig->uid == new->uid;
+}
+static void unix_gid_init(struct cache_head *cnew, struct cache_head *citem)
+{
+       struct unix_gid *new = container_of(cnew, struct unix_gid, h);
+       struct unix_gid *item = container_of(citem, struct unix_gid, h);
+       new->uid = item->uid;
+}
+static void unix_gid_update(struct cache_head *cnew, struct cache_head *citem)
+{
+       struct unix_gid *new = container_of(cnew, struct unix_gid, h);
+       struct unix_gid *item = container_of(citem, struct unix_gid, h);
+
+       get_group_info(item->gi);
+       new->gi = item->gi;
+}
+static struct cache_head *unix_gid_alloc(void)
+{
+       struct unix_gid *g = kmalloc(sizeof(*g), GFP_KERNEL);
+       if (g)
+               return &g->h;
+       else
+               return NULL;
+}
+
+static void unix_gid_request(struct cache_detail *cd,
+                            struct cache_head *h,
+                            char **bpp, int *blen)
+{
+       char tuid[20];
+       struct unix_gid *ug = container_of(h, struct unix_gid, h);
+
+       snprintf(tuid, 20, "%u", ug->uid);
+       qword_add(bpp, blen, tuid);
+       (*bpp)[-1] = '\n';
+}
+
+static struct unix_gid *unix_gid_lookup(uid_t uid);
+extern struct cache_detail unix_gid_cache;
+
+static int unix_gid_parse(struct cache_detail *cd,
+                       char *mesg, int mlen)
+{
+       /* uid expiry Ngid gid0 gid1 ... gidN-1 */
+       int uid;
+       int gids;
+       int rv;
+       int i;
+       int err;
+       time_t expiry;
+       struct unix_gid ug, *ugp;
+
+       if (mlen <= 0 || mesg[mlen-1] != '\n')
+               return -EINVAL;
+       mesg[mlen-1] = 0;
+
+       rv = get_int(&mesg, &uid);
+       if (rv)
+               return -EINVAL;
+       ug.uid = uid;
+
+       expiry = get_expiry(&mesg);
+       if (expiry == 0)
+               return -EINVAL;
+
+       rv = get_int(&mesg, &gids);
+       if (rv || gids < 0 || gids > 8192)
+               return -EINVAL;
+
+       ug.gi = groups_alloc(gids);
+       if (!ug.gi)
+               return -ENOMEM;
+
+       for (i = 0 ; i < gids ; i++) {
+               int gid;
+               rv = get_int(&mesg, &gid);
+               err = -EINVAL;
+               if (rv)
+                       goto out;
+               GROUP_AT(ug.gi, i) = gid;
+       }
+
+       ugp = unix_gid_lookup(uid);
+       if (ugp) {
+               struct cache_head *ch;
+               ug.h.flags = 0;
+               ug.h.expiry_time = expiry;
+               ch = sunrpc_cache_update(&unix_gid_cache,
+                                        &ug.h, &ugp->h,
+                                        hash_long(uid, GID_HASHBITS));
+               if (!ch)
+                       err = -ENOMEM;
+               else {
+                       err = 0;
+                       cache_put(ch, &unix_gid_cache);
+               }
+       } else
+               err = -ENOMEM;
+ out:
+       if (ug.gi)
+               put_group_info(ug.gi);
+       return err;
+}
+
+static int unix_gid_show(struct seq_file *m,
+                        struct cache_detail *cd,
+                        struct cache_head *h)
+{
+       struct unix_gid *ug;
+       int i;
+       int glen;
+
+       if (h == NULL) {
+               seq_puts(m, "#uid cnt: gids...\n");
+               return 0;
+       }
+       ug = container_of(h, struct unix_gid, h);
+       if (test_bit(CACHE_VALID, &h->flags) &&
+           !test_bit(CACHE_NEGATIVE, &h->flags))
+               glen = ug->gi->ngroups;
+       else
+               glen = 0;
+
+       seq_printf(m, "%d %d:", ug->uid, glen);
+       for (i = 0; i < glen; i++)
+               seq_printf(m, " %d", GROUP_AT(ug->gi, i));
+       seq_printf(m, "\n");
+       return 0;
+}
+
+struct cache_detail unix_gid_cache = {
+       .owner          = THIS_MODULE,
+       .hash_size      = GID_HASHMAX,
+       .hash_table     = gid_table,
+       .name           = "auth.unix.gid",
+       .cache_put      = unix_gid_put,
+       .cache_request  = unix_gid_request,
+       .cache_parse    = unix_gid_parse,
+       .cache_show     = unix_gid_show,
+       .match          = unix_gid_match,
+       .init           = unix_gid_init,
+       .update         = unix_gid_update,
+       .alloc          = unix_gid_alloc,
+};
+
+static struct unix_gid *unix_gid_lookup(uid_t uid)
+{
+       struct unix_gid ug;
+       struct cache_head *ch;
+
+       ug.uid = uid;
+       ch = sunrpc_cache_lookup(&unix_gid_cache, &ug.h,
+                                hash_long(uid, GID_HASHBITS));
+       if (ch)
+               return container_of(ch, struct unix_gid, h);
+       else
+               return NULL;
+}
+
+static int unix_gid_find(uid_t uid, struct group_info **gip,
+                        struct svc_rqst *rqstp)
+{
+       struct unix_gid *ug = unix_gid_lookup(uid);
+       if (!ug)
+               return -EAGAIN;
+       switch (cache_check(&unix_gid_cache, &ug->h, &rqstp->rq_chandle)) {
+       case -ENOENT:
+               *gip = NULL;
+               return 0;
+       case 0:
+               *gip = ug->gi;
+               get_group_info(*gip);
+               return 0;
+       default:
+               return -EAGAIN;
+       }
+}
+
 static int
 svcauth_unix_set_client(struct svc_rqst *rqstp)
 {
+       struct sockaddr_in *sin = svc_addr_in(rqstp);
        struct ip_map *ipm;
 
        rqstp->rq_client = NULL;
@@ -430,7 +639,7 @@ svcauth_unix_set_client(struct svc_rqst *rqstp)
        ipm = ip_map_cached_get(rqstp);
        if (ipm == NULL)
                ipm = ip_map_lookup(rqstp->rq_server->sv_program->pg_class,
-                                   rqstp->rq_addr.sin_addr);
+                                   sin->sin_addr);
 
        if (ipm == NULL)
                return SVC_DENIED;
@@ -465,7 +674,7 @@ svcauth_null_accept(struct svc_rqst *rqstp, __be32 *authp)
        if (argv->iov_len < 3*4)
                return SVC_GARBAGE;
 
-       if (svc_getu32(argv) != 0) { 
+       if (svc_getu32(argv) != 0) {
                dprintk("svc: bad null cred\n");
                *authp = rpc_autherr_badcred;
                return SVC_DENIED;
@@ -542,12 +751,19 @@ svcauth_unix_accept(struct svc_rqst *rqstp, __be32 *authp)
        slen = svc_getnl(argv);                 /* gids length */
        if (slen > 16 || (len -= (slen + 2)*4) < 0)
                goto badcred;
-       cred->cr_group_info = groups_alloc(slen);
-       if (cred->cr_group_info == NULL)
+       if (unix_gid_find(cred->cr_uid, &cred->cr_group_info, rqstp)
+           == -EAGAIN)
                return SVC_DROP;
-       for (i = 0; i < slen; i++)
-               GROUP_AT(cred->cr_group_info, i) = svc_getnl(argv);
-
+       if (cred->cr_group_info == NULL) {
+               cred->cr_group_info = groups_alloc(slen);
+               if (cred->cr_group_info == NULL)
+                       return SVC_DROP;
+               for (i = 0; i < slen; i++)
+                       GROUP_AT(cred->cr_group_info, i) = svc_getnl(argv);
+       } else {
+               for (i = 0; i < slen ; i++)
+                       svc_getnl(argv);
+       }
        if (svc_getu32(argv) != htonl(RPC_AUTH_NULL) || svc_getu32(argv) != 0) {
                *authp = rpc_autherr_badverf;
                return SVC_DENIED;
index cf93cd1d857bf9a1e7ff8457265ffb60f5956b2b..63ae94771b8e589e851eb94fc154599b5fc0754f 100644 (file)
 #include <net/sock.h>
 #include <net/checksum.h>
 #include <net/ip.h>
+#include <net/ipv6.h>
 #include <net/tcp_states.h>
 #include <asm/uaccess.h>
 #include <asm/ioctls.h>
 
 #include <linux/sunrpc/types.h>
+#include <linux/sunrpc/clnt.h>
 #include <linux/sunrpc/xdr.h>
 #include <linux/sunrpc/svcsock.h>
 #include <linux/sunrpc/stats.h>
@@ -58,7 +60,7 @@
  *     providing that certain rules are followed:
  *
  *     SK_CONN, SK_DATA, can be set or cleared at any time.
- *             after a set, svc_sock_enqueue must be called.   
+ *             after a set, svc_sock_enqueue must be called.
  *             after a clear, the socket must be read/accepted
  *              if this succeeds, it must be set again.
  *     SK_CLOSE can set at any time. It is never cleared.
@@ -75,7 +77,7 @@
 
 
 static struct svc_sock *svc_setup_socket(struct svc_serv *, struct socket *,
-                                        int *errp, int pmap_reg);
+                                        int *errp, int flags);
 static void            svc_delete_socket(struct svc_sock *svsk);
 static void            svc_udp_data_ready(struct sock *, int);
 static int             svc_udp_recvfrom(struct svc_rqst *);
@@ -121,6 +123,41 @@ static inline void svc_reclassify_socket(struct socket *sock)
 }
 #endif
 
+static char *__svc_print_addr(struct sockaddr *addr, char *buf, size_t len)
+{
+       switch (addr->sa_family) {
+       case AF_INET:
+               snprintf(buf, len, "%u.%u.%u.%u, port=%u",
+                       NIPQUAD(((struct sockaddr_in *) addr)->sin_addr),
+                       htons(((struct sockaddr_in *) addr)->sin_port));
+               break;
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+       case AF_INET6:
+               snprintf(buf, len, "%x:%x:%x:%x:%x:%x:%x:%x, port=%u",
+                       NIP6(((struct sockaddr_in6 *) addr)->sin6_addr),
+                       htons(((struct sockaddr_in6 *) addr)->sin6_port));
+               break;
+#endif
+       default:
+               snprintf(buf, len, "unknown address type: %d", addr->sa_family);
+               break;
+       }
+       return buf;
+}
+
+/**
+ * svc_print_addr - Format rq_addr field for printing
+ * @rqstp: svc_rqst struct containing address to print
+ * @buf: target buffer for formatted address
+ * @len: length of target buffer
+ *
+ */
+char *svc_print_addr(struct svc_rqst *rqstp, char *buf, size_t len)
+{
+       return __svc_print_addr(svc_addr(rqstp), buf, len);
+}
+EXPORT_SYMBOL_GPL(svc_print_addr);
+
 /*
  * Queue up an idle server thread.  Must have pool->sp_lock held.
  * Note: this is really a stack rather than a queue, so that we only
@@ -252,7 +289,7 @@ svc_sock_enqueue(struct svc_sock *svsk)
                        svsk->sk_sk, rqstp);
                svc_thread_dequeue(pool, rqstp);
                if (rqstp->rq_sock)
-                       printk(KERN_ERR 
+                       printk(KERN_ERR
                                "svc_sock_enqueue: server %p, rq_sock=%p!\n",
                                rqstp, rqstp->rq_sock);
                rqstp->rq_sock = svsk;
@@ -410,6 +447,43 @@ svc_wake_up(struct svc_serv *serv)
        }
 }
 
+union svc_pktinfo_u {
+       struct in_pktinfo pkti;
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+       struct in6_pktinfo pkti6;
+#endif
+};
+
+static void svc_set_cmsg_data(struct svc_rqst *rqstp, struct cmsghdr *cmh)
+{
+       switch (rqstp->rq_sock->sk_sk->sk_family) {
+       case AF_INET: {
+                       struct in_pktinfo *pki = CMSG_DATA(cmh);
+
+                       cmh->cmsg_level = SOL_IP;
+                       cmh->cmsg_type = IP_PKTINFO;
+                       pki->ipi_ifindex = 0;
+                       pki->ipi_spec_dst.s_addr = rqstp->rq_daddr.addr.s_addr;
+                       cmh->cmsg_len = CMSG_LEN(sizeof(*pki));
+               }
+               break;
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+       case AF_INET6: {
+                       struct in6_pktinfo *pki = CMSG_DATA(cmh);
+
+                       cmh->cmsg_level = SOL_IPV6;
+                       cmh->cmsg_type = IPV6_PKTINFO;
+                       pki->ipi6_ifindex = 0;
+                       ipv6_addr_copy(&pki->ipi6_addr,
+                                       &rqstp->rq_daddr.addr6);
+                       cmh->cmsg_len = CMSG_LEN(sizeof(*pki));
+               }
+               break;
+#endif
+       }
+       return;
+}
+
 /*
  * Generic sendto routine
  */
@@ -419,9 +493,8 @@ svc_sendto(struct svc_rqst *rqstp, struct xdr_buf *xdr)
        struct svc_sock *svsk = rqstp->rq_sock;
        struct socket   *sock = svsk->sk_sock;
        int             slen;
-       char            buffer[CMSG_SPACE(sizeof(struct in_pktinfo))];
+       char            buffer[CMSG_SPACE(sizeof(union svc_pktinfo_u))];
        struct cmsghdr *cmh = (struct cmsghdr *)buffer;
-       struct in_pktinfo *pki = (struct in_pktinfo *)CMSG_DATA(cmh);
        int             len = 0;
        int             result;
        int             size;
@@ -429,25 +502,20 @@ svc_sendto(struct svc_rqst *rqstp, struct xdr_buf *xdr)
        size_t          base = xdr->page_base;
        unsigned int    pglen = xdr->page_len;
        unsigned int    flags = MSG_MORE;
+       char            buf[RPC_MAX_ADDRBUFLEN];
 
        slen = xdr->len;
 
        if (rqstp->rq_prot == IPPROTO_UDP) {
-               /* set the source and destination */
-               struct msghdr   msg;
-               msg.msg_name    = &rqstp->rq_addr;
-               msg.msg_namelen = sizeof(rqstp->rq_addr);
-               msg.msg_iov     = NULL;
-               msg.msg_iovlen  = 0;
-               msg.msg_flags   = MSG_MORE;
-
-               msg.msg_control = cmh;
-               msg.msg_controllen = sizeof(buffer);
-               cmh->cmsg_len = CMSG_LEN(sizeof(*pki));
-               cmh->cmsg_level = SOL_IP;
-               cmh->cmsg_type = IP_PKTINFO;
-               pki->ipi_ifindex = 0;
-               pki->ipi_spec_dst.s_addr = rqstp->rq_daddr;
+               struct msghdr msg = {
+                       .msg_name       = &rqstp->rq_addr,
+                       .msg_namelen    = rqstp->rq_addrlen,
+                       .msg_control    = cmh,
+                       .msg_controllen = sizeof(buffer),
+                       .msg_flags      = MSG_MORE,
+               };
+
+               svc_set_cmsg_data(rqstp, cmh);
 
                if (sock_sendmsg(sock, &msg, 0) < 0)
                        goto out;
@@ -484,16 +552,16 @@ svc_sendto(struct svc_rqst *rqstp, struct xdr_buf *xdr)
        if (xdr->tail[0].iov_len) {
                result = kernel_sendpage(sock, rqstp->rq_respages[0],
                                             ((unsigned long)xdr->tail[0].iov_base)
-                                               & (PAGE_SIZE-1),
+                                               & (PAGE_SIZE-1),
                                             xdr->tail[0].iov_len, 0);
 
                if (result > 0)
                        len += result;
        }
 out:
-       dprintk("svc: socket %p sendto([%p %Zu... ], %d) = %d (addr %x)\n",
-                       rqstp->rq_sock, xdr->head[0].iov_base, xdr->head[0].iov_len, xdr->len, len,
-               rqstp->rq_addr.sin_addr.s_addr);
+       dprintk("svc: socket %p sendto([%p %Zu... ], %d) = %d (addr %s)\n",
+               rqstp->rq_sock, xdr->head[0].iov_base, xdr->head[0].iov_len,
+               xdr->len, len, svc_print_addr(rqstp, buf, sizeof(buf)));
 
        return len;
 }
@@ -568,31 +636,22 @@ svc_recv_available(struct svc_sock *svsk)
 static int
 svc_recvfrom(struct svc_rqst *rqstp, struct kvec *iov, int nr, int buflen)
 {
-       struct msghdr   msg;
-       struct socket   *sock;
-       int             len, alen;
-
-       rqstp->rq_addrlen = sizeof(rqstp->rq_addr);
-       sock = rqstp->rq_sock->sk_sock;
-
-       msg.msg_name    = &rqstp->rq_addr;
-       msg.msg_namelen = sizeof(rqstp->rq_addr);
-       msg.msg_control = NULL;
-       msg.msg_controllen = 0;
-
-       msg.msg_flags   = MSG_DONTWAIT;
+       struct svc_sock *svsk = rqstp->rq_sock;
+       struct msghdr msg = {
+               .msg_flags      = MSG_DONTWAIT,
+       };
+       int len;
 
-       len = kernel_recvmsg(sock, &msg, iov, nr, buflen, MSG_DONTWAIT);
+       len = kernel_recvmsg(svsk->sk_sock, &msg, iov, nr, buflen,
+                               msg.msg_flags);
 
        /* sock_recvmsg doesn't fill in the name/namelen, so we must..
-        * possibly we should cache this in the svc_sock structure
-        * at accept time. FIXME
         */
-       alen = sizeof(rqstp->rq_addr);
-       kernel_getpeername(sock, (struct sockaddr *)&rqstp->rq_addr, &alen);
+       memcpy(&rqstp->rq_addr, &svsk->sk_remote, svsk->sk_remotelen);
+       rqstp->rq_addrlen = svsk->sk_remotelen;
 
        dprintk("svc: socket %p recvfrom(%p, %Zu) = %d\n",
-               rqstp->rq_sock, iov[0].iov_base, iov[0].iov_len, len);
+               svsk, iov[0].iov_base, iov[0].iov_len, len);
 
        return len;
 }
@@ -662,6 +721,47 @@ svc_write_space(struct sock *sk)
        }
 }
 
+static void svc_udp_get_sender_address(struct svc_rqst *rqstp,
+                                       struct sk_buff *skb)
+{
+       switch (rqstp->rq_sock->sk_sk->sk_family) {
+       case AF_INET: {
+               /* this seems to come from net/ipv4/udp.c:udp_recvmsg */
+                       struct sockaddr_in *sin = svc_addr_in(rqstp);
+
+                       sin->sin_family = AF_INET;
+                       sin->sin_port = skb->h.uh->source;
+                       sin->sin_addr.s_addr = skb->nh.iph->saddr;
+                       rqstp->rq_addrlen = sizeof(struct sockaddr_in);
+                       /* Remember which interface received this request */
+                       rqstp->rq_daddr.addr.s_addr = skb->nh.iph->daddr;
+               }
+               break;
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+       case AF_INET6: {
+               /* this is derived from net/ipv6/udp.c:udpv6_recvmesg */
+                       struct sockaddr_in6 *sin6 = svc_addr_in6(rqstp);
+
+                       sin6->sin6_family = AF_INET6;
+                       sin6->sin6_port = skb->h.uh->source;
+                       sin6->sin6_flowinfo = 0;
+                       sin6->sin6_scope_id = 0;
+                       if (ipv6_addr_type(&sin6->sin6_addr) &
+                                                       IPV6_ADDR_LINKLOCAL)
+                               sin6->sin6_scope_id = IP6CB(skb)->iif;
+                       ipv6_addr_copy(&sin6->sin6_addr,
+                                                       &skb->nh.ipv6h->saddr);
+                       rqstp->rq_addrlen = sizeof(struct sockaddr_in);
+                       /* Remember which interface received this request */
+                       ipv6_addr_copy(&rqstp->rq_daddr.addr6,
+                                                       &skb->nh.ipv6h->saddr);
+               }
+               break;
+#endif
+       }
+       return;
+}
+
 /*
  * Receive a datagram from a UDP socket.
  */
@@ -711,7 +811,7 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)
                tv.tv_sec = xtime.tv_sec;
                tv.tv_usec = xtime.tv_nsec / NSEC_PER_USEC;
                skb_set_timestamp(skb, &tv);
-               /* Don't enable netstamp, sunrpc doesn't 
+               /* Don't enable netstamp, sunrpc doesn't
                   need that much accuracy */
        }
        skb_get_timestamp(skb, &svsk->sk_sk->sk_stamp);
@@ -725,13 +825,9 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)
        len  = skb->len - sizeof(struct udphdr);
        rqstp->rq_arg.len = len;
 
-       rqstp->rq_prot        = IPPROTO_UDP;
+       rqstp->rq_prot = IPPROTO_UDP;
 
-       /* Get sender address */
-       rqstp->rq_addr.sin_family = AF_INET;
-       rqstp->rq_addr.sin_port = skb->h.uh->source;
-       rqstp->rq_addr.sin_addr.s_addr = skb->nh.iph->saddr;
-       rqstp->rq_daddr = skb->nh.iph->daddr;
+       svc_udp_get_sender_address(rqstp, skb);
 
        if (skb_is_nonlinear(skb)) {
                /* we have to copy */
@@ -743,7 +839,7 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)
                        return 0;
                }
                local_bh_enable();
-               skb_free_datagram(svsk->sk_sk, skb); 
+               skb_free_datagram(svsk->sk_sk, skb);
        } else {
                /* we can use it in-place */
                rqstp->rq_arg.head[0].iov_base = skb->data + sizeof(struct udphdr);
@@ -794,7 +890,7 @@ svc_udp_init(struct svc_sock *svsk)
        svsk->sk_sendto = svc_udp_sendto;
 
        /* initialise setting must have enough space to
-        * receive and respond to one request.  
+        * receive and respond to one request.
         * svc_udp_recvfrom will re-adjust if necessary
         */
        svc_sock_setbufsize(svsk->sk_sock,
@@ -875,18 +971,36 @@ svc_tcp_data_ready(struct sock *sk, int count)
                wake_up_interruptible(sk->sk_sleep);
 }
 
+static inline int svc_port_is_privileged(struct sockaddr *sin)
+{
+       switch (sin->sa_family) {
+       case AF_INET:
+               return ntohs(((struct sockaddr_in *)sin)->sin_port)
+                       < PROT_SOCK;
+#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
+       case AF_INET6:
+               return ntohs(((struct sockaddr_in6 *)sin)->sin6_port)
+                       < PROT_SOCK;
+#endif
+       default:
+               return 0;
+       }
+}
+
 /*
  * Accept a TCP connection
  */
 static void
 svc_tcp_accept(struct svc_sock *svsk)
 {
-       struct sockaddr_in sin;
+       struct sockaddr_storage addr;
+       struct sockaddr *sin = (struct sockaddr *) &addr;
        struct svc_serv *serv = svsk->sk_server;
        struct socket   *sock = svsk->sk_sock;
        struct socket   *newsock;
        struct svc_sock *newsvsk;
        int             err, slen;
+       char            buf[RPC_MAX_ADDRBUFLEN];
 
        dprintk("svc: tcp_accept %p sock %p\n", svsk, sock);
        if (!sock)
@@ -907,8 +1021,7 @@ svc_tcp_accept(struct svc_sock *svsk)
        set_bit(SK_CONN, &svsk->sk_flags);
        svc_sock_enqueue(svsk);
 
-       slen = sizeof(sin);
-       err = kernel_getpeername(newsock, (struct sockaddr *) &sin, &slen);
+       err = kernel_getpeername(newsock, sin, &slen);
        if (err < 0) {
                if (net_ratelimit())
                        printk(KERN_WARNING "%s: peername failed (err %d)!\n",
@@ -917,27 +1030,30 @@ svc_tcp_accept(struct svc_sock *svsk)
        }
 
        /* Ideally, we would want to reject connections from unauthorized
-        * hosts here, but when we get encription, the IP of the host won't
-        * tell us anything. For now just warn about unpriv connections.
+        * hosts here, but when we get encryption, the IP of the host won't
+        * tell us anything.  For now just warn about unpriv connections.
         */
-       if (ntohs(sin.sin_port) >= 1024) {
+       if (!svc_port_is_privileged(sin)) {
                dprintk(KERN_WARNING
-                       "%s: connect from unprivileged port: %u.%u.%u.%u:%d\n",
-                       serv->sv_name, 
-                       NIPQUAD(sin.sin_addr.s_addr), ntohs(sin.sin_port));
+                       "%s: connect from unprivileged port: %s\n",
+                       serv->sv_name,
+                       __svc_print_addr(sin, buf, sizeof(buf)));
        }
-
-       dprintk("%s: connect from %u.%u.%u.%u:%04x\n", serv->sv_name,
-                       NIPQUAD(sin.sin_addr.s_addr), ntohs(sin.sin_port));
+       dprintk("%s: connect from %s\n", serv->sv_name,
+               __svc_print_addr(sin, buf, sizeof(buf)));
 
        /* make sure that a write doesn't block forever when
         * low on memory
         */
        newsock->sk->sk_sndtimeo = HZ*30;
 
-       if (!(newsvsk = svc_setup_socket(serv, newsock, &err, 0)))
+       if (!(newsvsk = svc_setup_socket(serv, newsock, &err,
+                                (SVC_SOCK_ANONYMOUS | SVC_SOCK_TEMPORARY))))
                goto failed;
+       memcpy(&newsvsk->sk_remote, sin, slen);
+       newsvsk->sk_remotelen = slen;
 
+       svc_sock_received(newsvsk);
 
        /* make sure that we don't have too many active connections.
         * If we have, something must be dropped.
@@ -960,11 +1076,9 @@ svc_tcp_accept(struct svc_sock *svsk)
                                        "sockets, consider increasing the "
                                        "number of nfsd threads\n",
                                                   serv->sv_name);
-                               printk(KERN_NOTICE "%s: last TCP connect from "
-                                       "%u.%u.%u.%u:%d\n",
-                                       serv->sv_name,
-                                       NIPQUAD(sin.sin_addr.s_addr),
-                                       ntohs(sin.sin_port));
+                               printk(KERN_NOTICE
+                                      "%s: last TCP connect from %s\n",
+                                      serv->sv_name, buf);
                        }
                        /*
                         * Always select the oldest socket. It's not fair,
@@ -1038,7 +1152,7 @@ svc_tcp_recvfrom(struct svc_rqst *rqstp)
                 * on the number of threads which will access the socket.
                 *
                 * rcvbuf just needs to be able to hold a few requests.
-                * Normally they will be removed from the queue 
+                * Normally they will be removed from the queue
                 * as soon a a complete request arrives.
                 */
                svc_sock_setbufsize(svsk->sk_sock,
@@ -1063,7 +1177,7 @@ svc_tcp_recvfrom(struct svc_rqst *rqstp)
 
                if (len < want) {
                        dprintk("svc: short recvfrom while reading record length (%d of %lu)\n",
-                               len, want);
+                               len, want);
                        svc_sock_received(svsk);
                        return -EAGAIN; /* record header not complete */
                }
@@ -1221,7 +1335,7 @@ svc_tcp_init(struct svc_sock *svsk)
                tp->nonagle = 1;        /* disable Nagle's algorithm */
 
                /* initialise setting must have enough space to
-                * receive and respond to one request.  
+                * receive and respond to one request.
                 * svc_tcp_recvfrom will re-adjust if necessary
                 */
                svc_sock_setbufsize(svsk->sk_sock,
@@ -1230,7 +1344,7 @@ svc_tcp_init(struct svc_sock *svsk)
 
                set_bit(SK_CHNGBUF, &svsk->sk_flags);
                set_bit(SK_DATA, &svsk->sk_flags);
-               if (sk->sk_state != TCP_ESTABLISHED) 
+               if (sk->sk_state != TCP_ESTABLISHED)
                        set_bit(SK_CLOSE, &svsk->sk_flags);
        }
 }
@@ -1246,7 +1360,7 @@ svc_sock_update_bufs(struct svc_serv *serv)
 
        spin_lock_bh(&serv->sv_lock);
        list_for_each(le, &serv->sv_permsocks) {
-               struct svc_sock *svsk = 
+               struct svc_sock *svsk =
                        list_entry(le, struct svc_sock, sk_list);
                set_bit(SK_CHNGBUF, &svsk->sk_flags);
        }
@@ -1266,7 +1380,7 @@ svc_sock_update_bufs(struct svc_serv *serv)
 int
 svc_recv(struct svc_rqst *rqstp, long timeout)
 {
-       struct svc_sock         *svsk =NULL;
+       struct svc_sock         *svsk = NULL;
        struct svc_serv         *serv = rqstp->rq_server;
        struct svc_pool         *pool = rqstp->rq_pool;
        int                     len, i;
@@ -1278,11 +1392,11 @@ svc_recv(struct svc_rqst *rqstp, long timeout)
                rqstp, timeout);
 
        if (rqstp->rq_sock)
-               printk(KERN_ERR 
+               printk(KERN_ERR
                        "svc_recv: service %p, socket not NULL!\n",
                         rqstp);
        if (waitqueue_active(&rqstp->rq_wait))
-               printk(KERN_ERR 
+               printk(KERN_ERR
                        "svc_recv: service %p, wait queue active!\n",
                         rqstp);
 
@@ -1363,7 +1477,7 @@ svc_recv(struct svc_rqst *rqstp, long timeout)
        svsk->sk_lastrecv = get_seconds();
        clear_bit(SK_OLD, &svsk->sk_flags);
 
-       rqstp->rq_secure  = ntohs(rqstp->rq_addr.sin_port) < 1024;
+       rqstp->rq_secure = svc_port_is_privileged(svc_addr(rqstp));
        rqstp->rq_chandle.defer = svc_defer;
 
        if (serv->sv_stats)
@@ -1371,7 +1485,7 @@ svc_recv(struct svc_rqst *rqstp, long timeout)
        return len;
 }
 
-/* 
+/*
  * Drop request
  */
 void
@@ -1476,12 +1590,14 @@ svc_age_temp_sockets(unsigned long closure)
  * Initialize socket for RPC use and create svc_sock struct
  * XXX: May want to setsockopt SO_SNDBUF and SO_RCVBUF.
  */
-static struct svc_sock *
-svc_setup_socket(struct svc_serv *serv, struct socket *sock,
-                                       int *errp, int pmap_register)
+static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
+                                               struct socket *sock,
+                                               int *errp, int flags)
 {
        struct svc_sock *svsk;
        struct sock     *inet;
+       int             pmap_register = !(flags & SVC_SOCK_ANONYMOUS);
+       int             is_temporary = flags & SVC_SOCK_TEMPORARY;
 
        dprintk("svc: svc_setup_socket %p\n", sock);
        if (!(svsk = kzalloc(sizeof(*svsk), GFP_KERNEL))) {
@@ -1523,7 +1639,7 @@ svc_setup_socket(struct svc_serv *serv, struct socket *sock,
                svc_tcp_init(svsk);
 
        spin_lock_bh(&serv->sv_lock);
-       if (!pmap_register) {
+       if (is_temporary) {
                set_bit(SK_TEMP, &svsk->sk_flags);
                list_add(&svsk->sk_list, &serv->sv_tempsocks);
                serv->sv_tmpcnt++;
@@ -1543,8 +1659,6 @@ svc_setup_socket(struct svc_serv *serv, struct socket *sock,
        dprintk("svc: svc_setup_socket created %p (inet %p)\n",
                                svsk, svsk->sk_sk);
 
-       clear_bit(SK_BUSY, &svsk->sk_flags);
-       svc_sock_enqueue(svsk);
        return svsk;
 }
 
@@ -1567,9 +1681,11 @@ int svc_addsock(struct svc_serv *serv,
        else if (so->state > SS_UNCONNECTED)
                err = -EISCONN;
        else {
-               svsk = svc_setup_socket(serv, so, &err, 1);
-               if (svsk)
+               svsk = svc_setup_socket(serv, so, &err, SVC_SOCK_DEFAULTS);
+               if (svsk) {
+                       svc_sock_received(svsk);
                        err = 0;
+               }
        }
        if (err) {
                sockfd_put(so);
@@ -1583,18 +1699,18 @@ EXPORT_SYMBOL_GPL(svc_addsock);
 /*
  * Create socket for RPC service.
  */
-static int
-svc_create_socket(struct svc_serv *serv, int protocol, struct sockaddr_in *sin)
+static int svc_create_socket(struct svc_serv *serv, int protocol,
+                               struct sockaddr *sin, int len, int flags)
 {
        struct svc_sock *svsk;
        struct socket   *sock;
        int             error;
        int             type;
+       char            buf[RPC_MAX_ADDRBUFLEN];
 
-       dprintk("svc: svc_create_socket(%s, %d, %u.%u.%u.%u:%d)\n",
-                               serv->sv_program->pg_name, protocol,
-                               NIPQUAD(sin->sin_addr.s_addr),
-                               ntohs(sin->sin_port));
+       dprintk("svc: svc_create_socket(%s, %d, %s)\n",
+                       serv->sv_program->pg_name, protocol,
+                       __svc_print_addr(sin, buf, sizeof(buf)));
 
        if (protocol != IPPROTO_UDP && protocol != IPPROTO_TCP) {
                printk(KERN_WARNING "svc: only UDP and TCP "
@@ -1603,15 +1719,15 @@ svc_create_socket(struct svc_serv *serv, int protocol, struct sockaddr_in *sin)
        }
        type = (protocol == IPPROTO_UDP)? SOCK_DGRAM : SOCK_STREAM;
 
-       if ((error = sock_create_kern(PF_INET, type, protocol, &sock)) < 0)
+       error = sock_create_kern(sin->sa_family, type, protocol, &sock);
+       if (error < 0)
                return error;
 
        svc_reclassify_socket(sock);
 
        if (type == SOCK_STREAM)
-               sock->sk->sk_reuse = 1; /* allow address reuse */
-       error = kernel_bind(sock, (struct sockaddr *) sin,
-                                       sizeof(*sin));
+               sock->sk->sk_reuse = 1;         /* allow address reuse */
+       error = kernel_bind(sock, sin, len);
        if (error < 0)
                goto bummer;
 
@@ -1620,8 +1736,10 @@ svc_create_socket(struct svc_serv *serv, int protocol, struct sockaddr_in *sin)
                        goto bummer;
        }
 
-       if ((svsk = svc_setup_socket(serv, sock, &error, 1)) != NULL)
-               return 0;
+       if ((svsk = svc_setup_socket(serv, sock, &error, flags)) != NULL) {
+               svc_sock_received(svsk);
+               return ntohs(inet_sk(svsk->sk_sk)->sport);
+       }
 
 bummer:
        dprintk("svc: svc_create_socket error = %d\n", -error);
@@ -1651,7 +1769,7 @@ svc_delete_socket(struct svc_sock *svsk)
 
        if (!test_and_set_bit(SK_DETACHED, &svsk->sk_flags))
                list_del_init(&svsk->sk_list);
-       /*
+       /*
         * We used to delete the svc_sock from whichever list
         * it's sk_ready node was on, but we don't actually
         * need to.  This is because the only time we're called
@@ -1681,23 +1799,30 @@ void svc_close_socket(struct svc_sock *svsk)
        svc_sock_put(svsk);
 }
 
-/*
- * Make a socket for nfsd and lockd
+/**
+ * svc_makesock - Make a socket for nfsd and lockd
+ * @serv: RPC server structure
+ * @protocol: transport protocol to use
+ * @port: port to use
+ * @flags: requested socket characteristics
+ *
  */
-int
-svc_makesock(struct svc_serv *serv, int protocol, unsigned short port)
+int svc_makesock(struct svc_serv *serv, int protocol, unsigned short port,
+                       int flags)
 {
-       struct sockaddr_in      sin;
+       struct sockaddr_in sin = {
+               .sin_family             = AF_INET,
+               .sin_addr.s_addr        = INADDR_ANY,
+               .sin_port               = htons(port),
+       };
 
        dprintk("svc: creating socket proto = %d\n", protocol);
-       sin.sin_family      = AF_INET;
-       sin.sin_addr.s_addr = INADDR_ANY;
-       sin.sin_port        = htons(port);
-       return svc_create_socket(serv, protocol, &sin);
+       return svc_create_socket(serv, protocol, (struct sockaddr *) &sin,
+                                                       sizeof(sin), flags);
 }
 
 /*
- * Handle defer and revisit of requests 
+ * Handle defer and revisit of requests
  */
 
 static void svc_revisit(struct cache_deferred_req *dreq, int too_many)
@@ -1742,7 +1867,8 @@ svc_defer(struct cache_req *req)
 
                dr->handle.owner = rqstp->rq_server;
                dr->prot = rqstp->rq_prot;
-               dr->addr = rqstp->rq_addr;
+               memcpy(&dr->addr, &rqstp->rq_addr, rqstp->rq_addrlen);
+               dr->addrlen = rqstp->rq_addrlen;
                dr->daddr = rqstp->rq_daddr;
                dr->argslen = rqstp->rq_arg.len >> 2;
                memcpy(dr->args, rqstp->rq_arg.head[0].iov_base-skip, dr->argslen<<2);
@@ -1766,7 +1892,8 @@ static int svc_deferred_recv(struct svc_rqst *rqstp)
        rqstp->rq_arg.page_len = 0;
        rqstp->rq_arg.len = dr->argslen<<2;
        rqstp->rq_prot        = dr->prot;
-       rqstp->rq_addr        = dr->addr;
+       memcpy(&rqstp->rq_addr, &dr->addr, dr->addrlen);
+       rqstp->rq_addrlen     = dr->addrlen;
        rqstp->rq_daddr       = dr->daddr;
        rqstp->rq_respages    = rqstp->rq_pages;
        return dr->argslen<<2;
@@ -1776,7 +1903,7 @@ static int svc_deferred_recv(struct svc_rqst *rqstp)
 static struct svc_deferred_req *svc_deferred_dequeue(struct svc_sock *svsk)
 {
        struct svc_deferred_req *dr = NULL;
-       
+
        if (!test_bit(SK_DEFERRED, &svsk->sk_flags))
                return NULL;
        spin_lock_bh(&svsk->sk_defer_lock);
index 82b27528d0c45b50b2b25416b84b9f03b1d6ac74..738db32a287d0be1500e0f67d1ce3676f439783b 100644 (file)
@@ -35,14 +35,8 @@ static ctl_table             sunrpc_table[];
 void
 rpc_register_sysctl(void)
 {
-       if (!sunrpc_table_header) {
-               sunrpc_table_header = register_sysctl_table(sunrpc_table, 1);
-#ifdef CONFIG_PROC_FS
-               if (sunrpc_table[0].de)
-                       sunrpc_table[0].de->owner = THIS_MODULE;
-#endif
-       }
-                       
+       if (!sunrpc_table_header)
+               sunrpc_table_header = register_sysctl_table(sunrpc_table);
 }
 
 void
@@ -126,7 +120,7 @@ static ctl_table debug_table[] = {
                .maxlen         = sizeof(int),
                .mode           = 0644,
                .proc_handler   = &proc_dodebug
-       }, 
+       },
        {
                .ctl_name       = CTL_NFSDEBUG,
                .procname       = "nfs_debug",
@@ -134,7 +128,7 @@ static ctl_table debug_table[] = {
                .maxlen         = sizeof(int),
                .mode           = 0644,
                .proc_handler   = &proc_dodebug
-       }, 
+       },
        {
                .ctl_name       = CTL_NFSDDEBUG,
                .procname       = "nfsd_debug",
@@ -142,7 +136,7 @@ static ctl_table debug_table[] = {
                .maxlen         = sizeof(int),
                .mode           = 0644,
                .proc_handler   = &proc_dodebug
-       }, 
+       },
        {
                .ctl_name       = CTL_NLMDEBUG,
                .procname       = "nlm_debug",
@@ -150,7 +144,7 @@ static ctl_table debug_table[] = {
                .maxlen         = sizeof(int),
                .mode           = 0644,
                .proc_handler   = &proc_dodebug
-       }, 
+       },
        { .ctl_name = 0 }
 };
 
index a0af250ca319752a6c940ff6be4ef7beebc937f2..6a59180e166718d309f7a2f98df0bb7fc31852d7 100644 (file)
@@ -302,7 +302,7 @@ _copy_from_pages(char *p, struct page **pages, size_t pgbase, size_t len)
  * @buf: xdr_buf
  * @len: bytes to remove from buf->head[0]
  *
- * Shrinks XDR buffer's header kvec buf->head[0] by 
+ * Shrinks XDR buffer's header kvec buf->head[0] by
  * 'len' bytes. The extra data is not lost, but is instead
  * moved into the inlined pages and/or the tail.
  */
@@ -375,7 +375,7 @@ xdr_shrink_bufhead(struct xdr_buf *buf, size_t len)
  * @buf: xdr_buf
  * @len: bytes to remove from buf->pages
  *
- * Shrinks XDR buffer's page array buf->pages by 
+ * Shrinks XDR buffer's page array buf->pages by
  * 'len' bytes. The extra data is not lost, but is instead
  * moved into the tail.
  */
@@ -1024,7 +1024,7 @@ xdr_encode_array2(struct xdr_buf *buf, unsigned int base,
 
 int
 xdr_process_buf(struct xdr_buf *buf, unsigned int offset, unsigned int len,
-                int (*actor)(struct scatterlist *, void *), void *data)
+               int (*actor)(struct scatterlist *, void *), void *data)
 {
        int i, ret = 0;
        unsigned page_len, thislen, page_offset;
index 7a3999f0a4a2aabc7e156bdb459a68a5cab7d6a7..ee6ffa01dfb18f0bc2e78ea8e8b86d7470c7b8bb 100644 (file)
@@ -108,7 +108,7 @@ int xprt_reserve_xprt(struct rpc_task *task)
        return 1;
 
 out_sleep:
-       dprintk("RPC: %4d failed to lock transport %p\n",
+       dprintk("RPC: %5u failed to lock transport %p\n",
                        task->tk_pid, xprt);
        task->tk_timeout = 0;
        task->tk_status = -EAGAIN;
@@ -158,7 +158,7 @@ int xprt_reserve_xprt_cong(struct rpc_task *task)
        }
        xprt_clear_locked(xprt);
 out_sleep:
-       dprintk("RPC: %4d failed to lock transport %p\n", task->tk_pid, xprt);
+       dprintk("RPC: %5u failed to lock transport %p\n", task->tk_pid, xprt);
        task->tk_timeout = 0;
        task->tk_status = -EAGAIN;
        if (req && req->rq_ntrans)
@@ -281,7 +281,7 @@ __xprt_get_cong(struct rpc_xprt *xprt, struct rpc_task *task)
 
        if (req->rq_cong)
                return 1;
-       dprintk("RPC: %4d xprt_cwnd_limited cong = %ld cwnd = %ld\n",
+       dprintk("RPC: %5u xprt_cwnd_limited cong = %lu cwnd = %lu\n",
                        task->tk_pid, xprt->cong, xprt->cwnd);
        if (RPCXPRT_CONGESTED(xprt))
                return 0;
@@ -340,7 +340,7 @@ void xprt_adjust_cwnd(struct rpc_task *task, int result)
                if (cwnd < RPC_CWNDSCALE)
                        cwnd = RPC_CWNDSCALE;
        }
-       dprintk("RPC:      cong %ld, cwnd was %ld, now %ld\n",
+       dprintk("RPC:       cong %ld, cwnd was %ld, now %ld\n",
                        xprt->cong, xprt->cwnd, cwnd);
        xprt->cwnd = cwnd;
        __xprt_put_cong(xprt, req);
@@ -387,8 +387,8 @@ void xprt_write_space(struct rpc_xprt *xprt)
 
        spin_lock_bh(&xprt->transport_lock);
        if (xprt->snd_task) {
-               dprintk("RPC:      write space: waking waiting task on xprt %p\n",
-                               xprt);
+               dprintk("RPC:       write space: waking waiting task on "
+                               "xprt %p\n", xprt);
                rpc_wake_up_task(xprt->snd_task);
        }
        spin_unlock_bh(&xprt->transport_lock);
@@ -410,7 +410,7 @@ void xprt_set_retrans_timeout_def(struct rpc_task *task)
 /*
  * xprt_set_retrans_timeout_rtt - set a request's retransmit timeout
  * @task: task whose timeout is to be set
- * 
+ *
  * Set a request's retransmit timeout using the RTT estimator.
  */
 void xprt_set_retrans_timeout_rtt(struct rpc_task *task)
@@ -494,7 +494,7 @@ static void xprt_autoclose(struct work_struct *work)
  */
 void xprt_disconnect(struct rpc_xprt *xprt)
 {
-       dprintk("RPC:      disconnected transport %p\n", xprt);
+       dprintk("RPC:       disconnected transport %p\n", xprt);
        spin_lock_bh(&xprt->transport_lock);
        xprt_clear_connected(xprt);
        xprt_wake_pending_tasks(xprt, -ENOTCONN);
@@ -530,7 +530,7 @@ void xprt_connect(struct rpc_task *task)
 {
        struct rpc_xprt *xprt = task->tk_xprt;
 
-       dprintk("RPC: %4d xprt_connect xprt %p %s connected\n", task->tk_pid,
+       dprintk("RPC: %5u xprt_connect xprt %p %s connected\n", task->tk_pid,
                        xprt, (xprt_connected(xprt) ? "is" : "is not"));
 
        if (!xprt_bound(xprt)) {
@@ -560,7 +560,7 @@ static void xprt_connect_status(struct rpc_task *task)
        if (task->tk_status >= 0) {
                xprt->stat.connect_count++;
                xprt->stat.connect_time += (long)jiffies - xprt->stat.connect_start;
-               dprintk("RPC: %4d xprt_connect_status: connection established\n",
+               dprintk("RPC: %5u xprt_connect_status: connection established\n",
                                task->tk_pid);
                return;
        }
@@ -568,20 +568,22 @@ static void xprt_connect_status(struct rpc_task *task)
        switch (task->tk_status) {
        case -ECONNREFUSED:
        case -ECONNRESET:
-               dprintk("RPC: %4d xprt_connect_status: server %s refused connection\n",
-                               task->tk_pid, task->tk_client->cl_server);
+               dprintk("RPC: %5u xprt_connect_status: server %s refused "
+                               "connection\n", task->tk_pid,
+                               task->tk_client->cl_server);
                break;
        case -ENOTCONN:
-               dprintk("RPC: %4d xprt_connect_status: connection broken\n",
+               dprintk("RPC: %5u xprt_connect_status: connection broken\n",
                                task->tk_pid);
                break;
        case -ETIMEDOUT:
-               dprintk("RPC: %4d xprt_connect_status: connect attempt timed out\n",
-                               task->tk_pid);
+               dprintk("RPC: %5u xprt_connect_status: connect attempt timed "
+                               "out\n", task->tk_pid);
                break;
        default:
-               dprintk("RPC: %4d xprt_connect_status: error %d connecting to server %s\n",
-                               task->tk_pid, -task->tk_status, task->tk_client->cl_server);
+               dprintk("RPC: %5u xprt_connect_status: error %d connecting to "
+                               "server %s\n", task->tk_pid, -task->tk_status,
+                               task->tk_client->cl_server);
                xprt_release_write(xprt, task);
                task->tk_status = -EIO;
        }
@@ -602,6 +604,9 @@ struct rpc_rqst *xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid)
                if (entry->rq_xid == xid)
                        return entry;
        }
+
+       dprintk("RPC:       xprt_lookup_rqst did not find xid %08x\n",
+                       ntohl(xid));
        xprt->stat.bad_xids++;
        return NULL;
 }
@@ -654,7 +659,7 @@ static void xprt_timer(struct rpc_task *task)
        struct rpc_rqst *req = task->tk_rqstp;
        struct rpc_xprt *xprt = req->rq_xprt;
 
-       dprintk("RPC: %4d xprt_timer\n", task->tk_pid);
+       dprintk("RPC: %5u xprt_timer\n", task->tk_pid);
 
        spin_lock(&xprt->transport_lock);
        if (!req->rq_received) {
@@ -678,7 +683,7 @@ int xprt_prepare_transmit(struct rpc_task *task)
        struct rpc_xprt *xprt = req->rq_xprt;
        int err = 0;
 
-       dprintk("RPC: %4d xprt_prepare_transmit\n", task->tk_pid);
+       dprintk("RPC: %5u xprt_prepare_transmit\n", task->tk_pid);
 
        spin_lock_bh(&xprt->transport_lock);
        if (req->rq_received && !req->rq_bytes_sent) {
@@ -716,7 +721,7 @@ void xprt_transmit(struct rpc_task *task)
        struct rpc_xprt *xprt = req->rq_xprt;
        int status;
 
-       dprintk("RPC: %4d xprt_transmit(%u)\n", task->tk_pid, req->rq_slen);
+       dprintk("RPC: %5u xprt_transmit(%u)\n", task->tk_pid, req->rq_slen);
 
        if (!req->rq_received) {
                if (list_empty(&req->rq_list)) {
@@ -730,13 +735,23 @@ void xprt_transmit(struct rpc_task *task)
                        xprt_reset_majortimeo(req);
                        /* Turn off autodisconnect */
                        del_singleshot_timer_sync(&xprt->timer);
+               } else {
+                       /* If all request bytes have been sent,
+                        * then we must be retransmitting this one */
+                       if (!req->rq_bytes_sent) {
+                               if (task->tk_client->cl_discrtry) {
+                                       xprt_disconnect(xprt);
+                                       task->tk_status = -ENOTCONN;
+                                       return;
+                               }
+                       }
                }
        } else if (!req->rq_bytes_sent)
                return;
 
        status = xprt->ops->send_request(task);
        if (status == 0) {
-               dprintk("RPC: %4d xmit complete\n", task->tk_pid);
+               dprintk("RPC: %5u xmit complete\n", task->tk_pid);
                spin_lock_bh(&xprt->transport_lock);
 
                xprt->ops->set_retrans_timeout(task);
@@ -777,7 +792,7 @@ static inline void do_xprt_reserve(struct rpc_task *task)
                xprt_request_init(task, xprt);
                return;
        }
-       dprintk("RPC:      waiting for request slot\n");
+       dprintk("RPC:       waiting for request slot\n");
        task->tk_status = -EAGAIN;
        task->tk_timeout = 0;
        rpc_sleep_on(&xprt->backlog, task, NULL, NULL);
@@ -822,7 +837,7 @@ static void xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt)
        req->rq_xid     = xprt_alloc_xid(xprt);
        req->rq_release_snd_buf = NULL;
        xprt_reset_majortimeo(req);
-       dprintk("RPC: %4d reserved req %p xid %08x\n", task->tk_pid,
+       dprintk("RPC: %5u reserved req %p xid %08x\n", task->tk_pid,
                        req, ntohl(req->rq_xid));
 }
 
@@ -856,7 +871,7 @@ void xprt_release(struct rpc_task *task)
                req->rq_release_snd_buf(req);
        memset(req, 0, sizeof(*req));   /* mark unused */
 
-       dprintk("RPC: %4d release request %p\n", task->tk_pid, req);
+       dprintk("RPC: %5u release request %p\n", task->tk_pid, req);
 
        spin_lock(&xprt->reserve_lock);
        list_add(&req->rq_list, &xprt->free);
@@ -873,7 +888,7 @@ void xprt_release(struct rpc_task *task)
  */
 void xprt_set_timeout(struct rpc_timeout *to, unsigned int retr, unsigned long incr)
 {
-       to->to_initval   = 
+       to->to_initval   =
        to->to_increment = incr;
        to->to_maxval    = to->to_initval + (incr * retr);
        to->to_retries   = retr;
@@ -906,7 +921,7 @@ struct rpc_xprt *xprt_create_transport(int proto, struct sockaddr *ap, size_t si
                return ERR_PTR(-EIO);
        }
        if (IS_ERR(xprt)) {
-               dprintk("RPC:      xprt_create_transport: failed, %ld\n",
+               dprintk("RPC:       xprt_create_transport: failed, %ld\n",
                                -PTR_ERR(xprt));
                return xprt;
        }
@@ -936,7 +951,7 @@ struct rpc_xprt *xprt_create_transport(int proto, struct sockaddr *ap, size_t si
 
        xprt_init_xid(xprt);
 
-       dprintk("RPC:      created transport %p with %u slots\n", xprt,
+       dprintk("RPC:       created transport %p with %u slots\n", xprt,
                        xprt->max_reqs);
 
        return xprt;
@@ -951,7 +966,7 @@ static void xprt_destroy(struct kref *kref)
 {
        struct rpc_xprt *xprt = container_of(kref, struct rpc_xprt, kref);
 
-       dprintk("RPC:      destroying transport %p\n", xprt);
+       dprintk("RPC:       destroying transport %p\n", xprt);
        xprt->shutdown = 1;
        del_timer_sync(&xprt->timer);
 
index 49cabffd7fdb87a884a9416b9a46b5848d509506..a5a32029e7283e9ef2bf7b834fef64e202e3330d 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/types.h>
 #include <linux/slab.h>
 #include <linux/capability.h>
-#include <linux/sched.h>
 #include <linux/pagemap.h>
 #include <linux/errno.h>
 #include <linux/socket.h>
@@ -192,7 +191,7 @@ static void xs_pktdump(char *msg, u32 *packet, unsigned int count)
        u8 *buf = (u8 *) packet;
        int j;
 
-       dprintk("RPC:      %s\n", msg);
+       dprintk("RPC:       %s\n", msg);
        for (j = 0; j < count && j < 128; j += 4) {
                if (!(j & 31)) {
                        if (j)
@@ -418,7 +417,7 @@ static void xs_nospace(struct rpc_task *task)
        struct rpc_xprt *xprt = req->rq_xprt;
        struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
 
-       dprintk("RPC: %4d xmit incomplete (%u left of %u)\n",
+       dprintk("RPC: %5u xmit incomplete (%u left of %u)\n",
                        task->tk_pid, req->rq_slen - req->rq_bytes_sent,
                        req->rq_slen);
 
@@ -467,7 +466,7 @@ static int xs_udp_send_request(struct rpc_task *task)
                              xprt->addrlen, xdr,
                              req->rq_bytes_sent);
 
-       dprintk("RPC:      xs_udp_send_request(%u) = %d\n",
+       dprintk("RPC:       xs_udp_send_request(%u) = %d\n",
                        xdr->len - req->rq_bytes_sent, status);
 
        if (likely(status >= (int) req->rq_slen))
@@ -488,7 +487,7 @@ static int xs_udp_send_request(struct rpc_task *task)
                xs_nospace(task);
                break;
        default:
-               dprintk("RPC:      sendmsg returned unrecognized error %d\n",
+               dprintk("RPC:       sendmsg returned unrecognized error %d\n",
                        -status);
                break;
        }
@@ -539,7 +538,7 @@ static int xs_tcp_send_request(struct rpc_task *task)
                status = xs_sendpages(transport->sock,
                                        NULL, 0, xdr, req->rq_bytes_sent);
 
-               dprintk("RPC:      xs_tcp_send_request(%u) = %d\n",
+               dprintk("RPC:       xs_tcp_send_request(%u) = %d\n",
                                xdr->len - req->rq_bytes_sent, status);
 
                if (unlikely(status < 0))
@@ -570,7 +569,7 @@ static int xs_tcp_send_request(struct rpc_task *task)
                status = -ENOTCONN;
                break;
        default:
-               dprintk("RPC:      sendmsg returned unrecognized error %d\n",
+               dprintk("RPC:       sendmsg returned unrecognized error %d\n",
                        -status);
                xprt_disconnect(xprt);
                break;
@@ -622,7 +621,7 @@ static void xs_close(struct rpc_xprt *xprt)
        if (!sk)
                goto clear_close_wait;
 
-       dprintk("RPC:      xs_close xprt %p\n", xprt);
+       dprintk("RPC:       xs_close xprt %p\n", xprt);
 
        write_lock_bh(&sk->sk_callback_lock);
        transport->inet = NULL;
@@ -652,7 +651,7 @@ static void xs_destroy(struct rpc_xprt *xprt)
 {
        struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
 
-       dprintk("RPC:      xs_destroy xprt %p\n", xprt);
+       dprintk("RPC:       xs_destroy xprt %p\n", xprt);
 
        cancel_delayed_work(&transport->connect_worker);
        flush_scheduled_work();
@@ -686,7 +685,7 @@ static void xs_udp_data_ready(struct sock *sk, int len)
        __be32 *xp;
 
        read_lock(&sk->sk_callback_lock);
-       dprintk("RPC:      xs_udp_data_ready...\n");
+       dprintk("RPC:       xs_udp_data_ready...\n");
        if (!(xprt = xprt_from_sock(sk)))
                goto out;
 
@@ -698,7 +697,7 @@ static void xs_udp_data_ready(struct sock *sk, int len)
 
        repsize = skb->len - sizeof(struct udphdr);
        if (repsize < 4) {
-               dprintk("RPC:      impossible RPC reply size %d!\n", repsize);
+               dprintk("RPC:       impossible RPC reply size %d!\n", repsize);
                goto dropit;
        }
 
@@ -762,11 +761,11 @@ static inline void xs_tcp_read_fraghdr(struct rpc_xprt *xprt, struct xdr_skb_rea
 
        /* Sanity check of the record length */
        if (unlikely(transport->tcp_reclen < 4)) {
-               dprintk("RPC:      invalid TCP record fragment length\n");
+               dprintk("RPC:       invalid TCP record fragment length\n");
                xprt_disconnect(xprt);
                return;
        }
-       dprintk("RPC:      reading TCP record fragment of length %d\n",
+       dprintk("RPC:       reading TCP record fragment of length %d\n",
                        transport->tcp_reclen);
 }
 
@@ -789,7 +788,7 @@ static inline void xs_tcp_read_xid(struct sock_xprt *transport, struct xdr_skb_r
        char *p;
 
        len = sizeof(transport->tcp_xid) - transport->tcp_offset;
-       dprintk("RPC:      reading XID (%Zu bytes)\n", len);
+       dprintk("RPC:       reading XID (%Zu bytes)\n", len);
        p = ((char *) &transport->tcp_xid) + transport->tcp_offset;
        used = xdr_skb_read_bits(desc, p, len);
        transport->tcp_offset += used;
@@ -798,7 +797,7 @@ static inline void xs_tcp_read_xid(struct sock_xprt *transport, struct xdr_skb_r
        transport->tcp_flags &= ~TCP_RCV_COPY_XID;
        transport->tcp_flags |= TCP_RCV_COPY_DATA;
        transport->tcp_copied = 4;
-       dprintk("RPC:      reading reply for XID %08x\n",
+       dprintk("RPC:       reading reply for XID %08x\n",
                        ntohl(transport->tcp_xid));
        xs_tcp_check_fraghdr(transport);
 }
@@ -816,7 +815,7 @@ static inline void xs_tcp_read_request(struct rpc_xprt *xprt, struct xdr_skb_rea
        req = xprt_lookup_rqst(xprt, transport->tcp_xid);
        if (!req) {
                transport->tcp_flags &= ~TCP_RCV_COPY_DATA;
-               dprintk("RPC:      XID %08x request not found!\n",
+               dprintk("RPC:       XID %08x request not found!\n",
                                ntohl(transport->tcp_xid));
                spin_unlock(&xprt->transport_lock);
                return;
@@ -853,19 +852,20 @@ static inline void xs_tcp_read_request(struct rpc_xprt *xprt, struct xdr_skb_rea
                 * be discarded.
                 */
                transport->tcp_flags &= ~TCP_RCV_COPY_DATA;
-               dprintk("RPC:      XID %08x truncated request\n",
+               dprintk("RPC:       XID %08x truncated request\n",
                                ntohl(transport->tcp_xid));
-               dprintk("RPC:      xprt = %p, tcp_copied = %lu, tcp_offset = %u, tcp_reclen = %u\n",
-                               xprt, transport->tcp_copied, transport->tcp_offset,
-                                       transport->tcp_reclen);
+               dprintk("RPC:       xprt = %p, tcp_copied = %lu, "
+                               "tcp_offset = %u, tcp_reclen = %u\n",
+                               xprt, transport->tcp_copied,
+                               transport->tcp_offset, transport->tcp_reclen);
                goto out;
        }
 
-       dprintk("RPC:      XID %08x read %Zd bytes\n",
+       dprintk("RPC:       XID %08x read %Zd bytes\n",
                        ntohl(transport->tcp_xid), r);
-       dprintk("RPC:      xprt = %p, tcp_copied = %lu, tcp_offset = %u, tcp_reclen = %u\n",
-                       xprt, transport->tcp_copied, transport->tcp_offset,
-                               transport->tcp_reclen);
+       dprintk("RPC:       xprt = %p, tcp_copied = %lu, tcp_offset = %u, "
+                       "tcp_reclen = %u\n", xprt, transport->tcp_copied,
+                       transport->tcp_offset, transport->tcp_reclen);
 
        if (transport->tcp_copied == req->rq_private_buf.buflen)
                transport->tcp_flags &= ~TCP_RCV_COPY_DATA;
@@ -891,7 +891,7 @@ static inline void xs_tcp_read_discard(struct sock_xprt *transport, struct xdr_s
        desc->count -= len;
        desc->offset += len;
        transport->tcp_offset += len;
-       dprintk("RPC:      discarded %Zu bytes\n", len);
+       dprintk("RPC:       discarded %Zu bytes\n", len);
        xs_tcp_check_fraghdr(transport);
 }
 
@@ -905,7 +905,7 @@ static int xs_tcp_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb, uns
                .count  = len,
        };
 
-       dprintk("RPC:      xs_tcp_data_recv started\n");
+       dprintk("RPC:       xs_tcp_data_recv started\n");
        do {
                /* Read in a new fragment marker if necessary */
                /* Can we ever really expect to get completely empty fragments? */
@@ -926,7 +926,7 @@ static int xs_tcp_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb, uns
                /* Skip over any trailing bytes on short reads */
                xs_tcp_read_discard(transport, &desc);
        } while (desc.count);
-       dprintk("RPC:      xs_tcp_data_recv done\n");
+       dprintk("RPC:       xs_tcp_data_recv done\n");
        return len - desc.count;
 }
 
@@ -941,8 +941,9 @@ static void xs_tcp_data_ready(struct sock *sk, int bytes)
        struct rpc_xprt *xprt;
        read_descriptor_t rd_desc;
 
+       dprintk("RPC:       xs_tcp_data_ready...\n");
+
        read_lock(&sk->sk_callback_lock);
-       dprintk("RPC:      xs_tcp_data_ready...\n");
        if (!(xprt = xprt_from_sock(sk)))
                goto out;
        if (xprt->shutdown)
@@ -968,11 +969,11 @@ static void xs_tcp_state_change(struct sock *sk)
        read_lock(&sk->sk_callback_lock);
        if (!(xprt = xprt_from_sock(sk)))
                goto out;
-       dprintk("RPC:      xs_tcp_state_change client %p...\n", xprt);
-       dprintk("RPC:      state %x conn %d dead %d zapped %d\n",
-                               sk->sk_state, xprt_connected(xprt),
-                               sock_flag(sk, SOCK_DEAD),
-                               sock_flag(sk, SOCK_ZAPPED));
+       dprintk("RPC:       xs_tcp_state_change client %p...\n", xprt);
+       dprintk("RPC:       state %x conn %d dead %d zapped %d\n",
+                       sk->sk_state, xprt_connected(xprt),
+                       sock_flag(sk, SOCK_DEAD),
+                       sock_flag(sk, SOCK_ZAPPED));
 
        switch (sk->sk_state) {
        case TCP_ESTABLISHED:
@@ -1140,7 +1141,7 @@ static void xs_set_port(struct rpc_xprt *xprt, unsigned short port)
 {
        struct sockaddr_in *sap = (struct sockaddr_in *) &xprt->addr;
 
-       dprintk("RPC:      setting port for xprt %p to %u\n", xprt, port);
+       dprintk("RPC:       setting port for xprt %p to %u\n", xprt, port);
 
        sap->sin_port = htons(port);
 }
@@ -1159,7 +1160,7 @@ static int xs_bindresvport(struct sock_xprt *transport, struct socket *sock)
                                                sizeof(myaddr));
                if (err == 0) {
                        transport->port = port;
-                       dprintk("RPC:      xs_bindresvport bound to port %u\n",
+                       dprintk("RPC:       xs_bindresvport bound to port %u\n",
                                        port);
                        return 0;
                }
@@ -1169,7 +1170,7 @@ static int xs_bindresvport(struct sock_xprt *transport, struct socket *sock)
                        port--;
        } while (err == -EADDRINUSE && port != transport->port);
 
-       dprintk("RPC:      can't bind to reserved port (%d).\n", -err);
+       dprintk("RPC:       can't bind to reserved port (%d).\n", -err);
        return err;
 }
 
@@ -1223,7 +1224,7 @@ static void xs_udp_connect_worker(struct work_struct *work)
        xs_close(xprt);
 
        if ((err = sock_create_kern(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock)) < 0) {
-               dprintk("RPC:      can't create UDP transport socket (%d).\n", -err);
+               dprintk("RPC:       can't create UDP transport socket (%d).\n", -err);
                goto out;
        }
        xs_reclassify_socket(sock);
@@ -1233,7 +1234,7 @@ static void xs_udp_connect_worker(struct work_struct *work)
                goto out;
        }
 
-       dprintk("RPC:      worker connecting xprt %p to address: %s\n",
+       dprintk("RPC:       worker connecting xprt %p to address: %s\n",
                        xprt, xprt->address_strings[RPC_DISPLAY_ALL]);
 
        if (!transport->inet) {
@@ -1275,7 +1276,7 @@ static void xs_tcp_reuse_connection(struct rpc_xprt *xprt)
        struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
        struct sockaddr any;
 
-       dprintk("RPC:      disconnecting xprt %p to reuse port\n", xprt);
+       dprintk("RPC:       disconnecting xprt %p to reuse port\n", xprt);
 
        /*
         * Disconnect the transport socket by doing a connect operation
@@ -1285,7 +1286,7 @@ static void xs_tcp_reuse_connection(struct rpc_xprt *xprt)
        any.sa_family = AF_UNSPEC;
        result = kernel_connect(transport->sock, &any, sizeof(any), 0);
        if (result)
-               dprintk("RPC:      AF_UNSPEC connect return code %d\n",
+               dprintk("RPC:       AF_UNSPEC connect return code %d\n",
                                result);
 }
 
@@ -1309,7 +1310,8 @@ static void xs_tcp_connect_worker(struct work_struct *work)
        if (!sock) {
                /* start from scratch */
                if ((err = sock_create_kern(PF_INET, SOCK_STREAM, IPPROTO_TCP, &sock)) < 0) {
-                       dprintk("RPC:      can't create TCP transport socket (%d).\n", -err);
+                       dprintk("RPC:       can't create TCP transport "
+                                       "socket (%d).\n", -err);
                        goto out;
                }
                xs_reclassify_socket(sock);
@@ -1322,7 +1324,7 @@ static void xs_tcp_connect_worker(struct work_struct *work)
                /* "close" the socket, preserving the local port */
                xs_tcp_reuse_connection(xprt);
 
-       dprintk("RPC:      worker connecting xprt %p to address: %s\n",
+       dprintk("RPC:       worker connecting xprt %p to address: %s\n",
                        xprt, xprt->address_strings[RPC_DISPLAY_ALL]);
 
        if (!transport->inet) {
@@ -1359,8 +1361,9 @@ static void xs_tcp_connect_worker(struct work_struct *work)
        xprt->stat.connect_start = jiffies;
        status = kernel_connect(sock, (struct sockaddr *) &xprt->addr,
                        xprt->addrlen, O_NONBLOCK);
-       dprintk("RPC: %p  connect status %d connected %d sock state %d\n",
-                       xprt, -status, xprt_connected(xprt), sock->sk->sk_state);
+       dprintk("RPC:       %p connect status %d connected %d sock state %d\n",
+                       xprt, -status, xprt_connected(xprt),
+                       sock->sk->sk_state);
        if (status < 0) {
                switch (status) {
                        case -EINPROGRESS:
@@ -1404,7 +1407,8 @@ static void xs_connect(struct rpc_task *task)
                return;
 
        if (transport->sock != NULL) {
-               dprintk("RPC:      xs_connect delayed xprt %p for %lu seconds\n",
+               dprintk("RPC:       xs_connect delayed xprt %p for %lu "
+                               "seconds\n",
                                xprt, xprt->reestablish_timeout / HZ);
                schedule_delayed_work(&transport->connect_worker,
                                        xprt->reestablish_timeout);
@@ -1412,7 +1416,7 @@ static void xs_connect(struct rpc_task *task)
                if (xprt->reestablish_timeout > XS_TCP_MAX_REEST_TO)
                        xprt->reestablish_timeout = XS_TCP_MAX_REEST_TO;
        } else {
-               dprintk("RPC:      xs_connect scheduled xprt %p\n", xprt);
+               dprintk("RPC:       xs_connect scheduled xprt %p\n", xprt);
                schedule_delayed_work(&transport->connect_worker, 0);
 
                /* flush_scheduled_work can sleep... */
@@ -1507,13 +1511,14 @@ static struct rpc_xprt *xs_setup_xprt(struct sockaddr *addr, size_t addrlen, uns
        struct sock_xprt *new;
 
        if (addrlen > sizeof(xprt->addr)) {
-               dprintk("RPC:      xs_setup_xprt: address too large\n");
+               dprintk("RPC:       xs_setup_xprt: address too large\n");
                return ERR_PTR(-EBADF);
        }
 
        new = kzalloc(sizeof(*new), GFP_KERNEL);
        if (new == NULL) {
-               dprintk("RPC:      xs_setup_xprt: couldn't allocate rpc_xprt\n");
+               dprintk("RPC:       xs_setup_xprt: couldn't allocate "
+                               "rpc_xprt\n");
                return ERR_PTR(-ENOMEM);
        }
        xprt = &new->xprt;
@@ -1522,7 +1527,8 @@ static struct rpc_xprt *xs_setup_xprt(struct sockaddr *addr, size_t addrlen, uns
        xprt->slot = kcalloc(xprt->max_reqs, sizeof(struct rpc_rqst), GFP_KERNEL);
        if (xprt->slot == NULL) {
                kfree(xprt);
-               dprintk("RPC:      xs_setup_xprt: couldn't allocate slot table\n");
+               dprintk("RPC:       xs_setup_xprt: couldn't allocate slot "
+                               "table\n");
                return ERR_PTR(-ENOMEM);
        }
 
@@ -1572,7 +1578,7 @@ struct rpc_xprt *xs_setup_udp(struct sockaddr *addr, size_t addrlen, struct rpc_
                xprt_set_timeout(&xprt->timeout, 5, 5 * HZ);
 
        xs_format_peer_addresses(xprt);
-       dprintk("RPC:      set up transport to address %s\n",
+       dprintk("RPC:       set up transport to address %s\n",
                        xprt->address_strings[RPC_DISPLAY_ALL]);
 
        return xprt;
@@ -1616,7 +1622,7 @@ struct rpc_xprt *xs_setup_tcp(struct sockaddr *addr, size_t addrlen, struct rpc_
                xprt_set_timeout(&xprt->timeout, 2, 60 * HZ);
 
        xs_format_peer_addresses(xprt);
-       dprintk("RPC:      set up transport to address %s\n",
+       dprintk("RPC:       set up transport to address %s\n",
                        xprt->address_strings[RPC_DISPLAY_ALL]);
 
        return xprt;
@@ -1629,13 +1635,8 @@ struct rpc_xprt *xs_setup_tcp(struct sockaddr *addr, size_t addrlen, struct rpc_
 int init_socket_xprt(void)
 {
 #ifdef RPC_DEBUG
-       if (!sunrpc_table_header) {
-               sunrpc_table_header = register_sysctl_table(sunrpc_table, 1);
-#ifdef CONFIG_PROC_FS
-               if (sunrpc_table[0].de)
-                       sunrpc_table[0].de->owner = THIS_MODULE;
-#endif
-       }
+       if (!sunrpc_table_header)
+               sunrpc_table_header = register_sysctl_table(sunrpc_table);
 #endif
 
        return 0;
index 0be25e175b935641cf889695c40f7d1d545e0eef..e5207a11edf64d36fd4a44bc8e9212425b1bf57f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/addr.c: TIPC address utility routines
- *     
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2004-2005, Wind River Systems
  * All rights reserved.
@@ -48,10 +48,10 @@ u32 tipc_get_addr(void)
 
 /**
  * tipc_addr_domain_valid - validates a network domain address
- * 
- * Accepts <Z.C.N>, <Z.C.0>, <Z.0.0>, and <0.0.0>, 
+ *
+ * Accepts <Z.C.N>, <Z.C.0>, <Z.0.0>, and <0.0.0>,
  * where Z, C, and N are non-zero and do not exceed the configured limits.
- * 
+ *
  * Returns 1 if domain address is valid, otherwise 0
  */
 
@@ -80,10 +80,10 @@ int tipc_addr_domain_valid(u32 addr)
 
 /**
  * tipc_addr_node_valid - validates a proposed network address for this node
- * 
- * Accepts <Z.C.N>, where Z, C, and N are non-zero and do not exceed 
+ *
+ * Accepts <Z.C.N>, where Z, C, and N are non-zero and do not exceed
  * the configured limits.
- * 
+ *
  * Returns 1 if address can be used, otherwise 0
  */
 
index bcfebb3cbbf319f31e8c6bd4af45e7688c1c13bf..e4bd5335e48d9eb64bdd9d5b1bf899ce7a8ec8d9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/addr.h: Include file for TIPC address utility routines
- * 
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2004-2005, Wind River Systems
  * All rights reserved.
@@ -100,8 +100,8 @@ static inline int addr_scope(u32 domain)
 
 /**
  * addr_domain - convert 2-bit scope value to equivalent message lookup domain
- *  
- * Needed when address of a named message must be looked up a second time 
+ *
+ * Needed when address of a named message must be looked up a second time
  * after a network hop.
  */
 
index 730c5c47ed8d4b67b465caba2dc9768d514e3f87..e7880172ef19275db1e9f0e9c7d94fdc1e1a51e9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/bcast.c: TIPC broadcast code
- *     
+ *
  * Copyright (c) 2004-2006, Ericsson AB
  * Copyright (c) 2004, Intel Corporation.
  * Copyright (c) 2005, Wind River Systems
  * Loss rate for incoming broadcast frames; used to test retransmission code.
  * Set to N to cause every N'th frame to be discarded; 0 => don't discard any.
  */
+
 #define TIPC_BCAST_LOSS_RATE 0
 
 /**
  * struct bcbearer_pair - a pair of bearers used by broadcast link
  * @primary: pointer to primary bearer
  * @secondary: pointer to secondary bearer
- * 
- * Bearers must have same priority and same set of reachable destinations 
+ *
+ * Bearers must have same priority and same set of reachable destinations
  * to be paired.
  */
 
@@ -84,7 +84,7 @@ struct bcbearer_pair {
  * @bpairs_temp: temporary array of bearer pairs used by tipc_bcbearer_sort()
  * @remains: temporary node map used by tipc_bcbearer_send()
  * @remains_new: temporary node map used tipc_bcbearer_send()
- * 
+ *
  * Note: The fields labelled "temporary" are incorporated into the bearer
  * to avoid consuming potentially limited stack space through the use of
  * large local variables within multicast routines.  Concurrent access is
@@ -104,7 +104,7 @@ struct bcbearer {
  * struct bclink - link used for broadcast messages
  * @link: (non-standard) broadcast link structure
  * @node: (non-standard) node structure representing b'cast link's peer node
- * 
+ *
  * Handles sequence numbering, fragmentation, bundling, etc.
  */
 
@@ -125,7 +125,7 @@ char tipc_bclink_name[] = "multicast-link";
 static u32 buf_seqno(struct sk_buff *buf)
 {
        return msg_seqno(buf_msg(buf));
-} 
+}
 
 static u32 bcbuf_acks(struct sk_buff *buf)
 {
@@ -143,9 +143,9 @@ static void bcbuf_decr_acks(struct sk_buff *buf)
 }
 
 
-/** 
+/**
  * bclink_set_gap - set gap according to contents of current deferred pkt queue
- * 
+ *
  * Called with 'node' locked, bc_lock unlocked
  */
 
@@ -159,14 +159,14 @@ static void bclink_set_gap(struct node *n_ptr)
                n_ptr->bclink.gap_to = mod(buf_seqno(buf) - 1);
 }
 
-/** 
+/**
  * bclink_ack_allowed - test if ACK or NACK message can be sent at this moment
- * 
+ *
  * This mechanism endeavours to prevent all nodes in network from trying
  * to ACK or NACK at the same time.
- * 
+ *
  * Note: TIPC uses a different trigger to distribute ACKs than it does to
- *       distribute NACKs, but tries to use the same spacing (divide by 16). 
+ *       distribute NACKs, but tries to use the same spacing (divide by 16).
  */
 
 static int bclink_ack_allowed(u32 n)
@@ -175,11 +175,11 @@ static int bclink_ack_allowed(u32 n)
 }
 
 
-/** 
+/**
  * bclink_retransmit_pkt - retransmit broadcast packets
  * @after: sequence number of last packet to *not* retransmit
  * @to: sequence number of last packet to retransmit
- * 
+ *
  * Called with bc_lock locked
  */
 
@@ -189,16 +189,16 @@ static void bclink_retransmit_pkt(u32 after, u32 to)
 
        buf = bcl->first_out;
        while (buf && less_eq(buf_seqno(buf), after)) {
-               buf = buf->next;                
+               buf = buf->next;
        }
        tipc_link_retransmit(bcl, buf, mod(to - after));
 }
 
-/** 
+/**
  * tipc_bclink_acknowledge - handle acknowledgement of broadcast packets
  * @n_ptr: node that sent acknowledgement info
  * @acked: broadcast sequence # that has been acknowledged
- * 
+ *
  * Node is locked, bc_lock unlocked.
  */
 
@@ -244,9 +244,9 @@ void tipc_bclink_acknowledge(struct node *n_ptr, u32 acked)
        spin_unlock_bh(&bc_lock);
 }
 
-/** 
+/**
  * bclink_send_ack - unicast an ACK msg
- * 
+ *
  * tipc_net_lock and node lock set
  */
 
@@ -258,9 +258,9 @@ static void bclink_send_ack(struct node *n_ptr)
                tipc_link_send_proto_msg(l_ptr, STATE_MSG, 0, 0, 0, 0, 0);
 }
 
-/** 
+/**
  * bclink_send_nack- broadcast a NACK msg
- * 
+ *
  * tipc_net_lock and node lock set
  */
 
@@ -278,7 +278,7 @@ static void bclink_send_nack(struct node *n_ptr)
                msg_init(msg, BCAST_PROTOCOL, STATE_MSG,
                         TIPC_OK, INT_H_SIZE, n_ptr->addr);
                msg_set_mc_netid(msg, tipc_net_id);
-               msg_set_bcast_ack(msg, mod(n_ptr->bclink.last_in)); 
+               msg_set_bcast_ack(msg, mod(n_ptr->bclink.last_in));
                msg_set_bcgap_after(msg, n_ptr->bclink.gap_after);
                msg_set_bcgap_to(msg, n_ptr->bclink.gap_to);
                msg_set_bcast_tag(msg, tipc_own_tag);
@@ -292,17 +292,17 @@ static void bclink_send_nack(struct node *n_ptr)
                        bcl->stats.bearer_congs++;
                }
 
-               /* 
+               /*
                 * Ensure we doesn't send another NACK msg to the node
                 * until 16 more deferred messages arrive from it
                 * (i.e. helps prevent all nodes from NACK'ing at same time)
                 */
-               
+
                n_ptr->bclink.nack_sync = tipc_own_tag;
        }
 }
 
-/** 
+/**
  * tipc_bclink_check_gap - send a NACK if a sequence gap exists
  *
  * tipc_net_lock and node lock set
@@ -320,9 +320,9 @@ void tipc_bclink_check_gap(struct node *n_ptr, u32 last_sent)
        bclink_send_nack(n_ptr);
 }
 
-/** 
+/**
  * tipc_bclink_peek_nack - process a NACK msg meant for another node
- * 
+ *
  * Only tipc_net_lock set.
  */
 
@@ -349,7 +349,7 @@ static void tipc_bclink_peek_nack(u32 dest, u32 sender_tag, u32 gap_after, u32 g
                if (less_eq(my_to, gap_to))
                        n_ptr->bclink.gap_to = gap_after;
        } else {
-               /* 
+               /*
                 * Expand gap if missing bufs not in deferred queue:
                 */
                struct sk_buff *buf = n_ptr->bclink.deferred_head;
@@ -371,7 +371,7 @@ static void tipc_bclink_peek_nack(u32 dest, u32 sender_tag, u32 gap_after, u32 g
        }
        /*
         * Some nodes may send a complementary NACK now:
-        */ 
+        */
        if (bclink_ack_allowed(sender_tag + 1)) {
                if (n_ptr->bclink.gap_to != n_ptr->bclink.gap_after) {
                        bclink_send_nack(n_ptr);
@@ -408,7 +408,7 @@ int tipc_bclink_send_msg(struct sk_buff *buf)
 
 /**
  * tipc_bclink_recv_pkt - receive a broadcast packet, and deliver upwards
- * 
+ *
  * tipc_net_lock is read_locked, no other locks set
  */
 
@@ -425,7 +425,7 @@ void tipc_bclink_recv_pkt(struct sk_buff *buf)
 
        msg_dbg(msg, "<BC<<<");
 
-       if (unlikely(!node || !tipc_node_is_up(node) || !node->bclink.supported || 
+       if (unlikely(!node || !tipc_node_is_up(node) || !node->bclink.supported ||
                     (msg_mc_netid(msg) != tipc_net_id))) {
                buf_discard(buf);
                return;
@@ -443,7 +443,7 @@ void tipc_bclink_recv_pkt(struct sk_buff *buf)
                        bclink_retransmit_pkt(msg_bcgap_after(msg),
                                              msg_bcgap_to(msg));
                        bcl->owner->next = NULL;
-                       spin_unlock_bh(&bc_lock);              
+                       spin_unlock_bh(&bc_lock);
                } else {
                        tipc_bclink_peek_nack(msg_destnode(msg),
                                              msg_bcast_tag(msg),
@@ -547,10 +547,10 @@ u32 tipc_bclink_acks_missing(struct node *n_ptr)
 
 /**
  * tipc_bcbearer_send - send a packet through the broadcast pseudo-bearer
- * 
+ *
  * Send through as many bearers as necessary to reach all nodes
  * that support TIPC multicasting.
- * 
+ *
  * Returns 0 if packet sent successfully, non-zero if not
  */
 
@@ -581,7 +581,7 @@ static int tipc_bcbearer_send(struct sk_buff *buf,
                send_count = 0;
 
        /* Send buffer over bearers until all targets reached */
-       
+
        bcbearer->remains = tipc_cltr_bcast_nodes;
 
        for (bp_index = 0; bp_index < MAX_BEARERS; bp_index++) {
@@ -615,7 +615,7 @@ update:
 
                bcbearer->remains = bcbearer->remains_new;
        }
-       
+
        /* Unable to reach all targets */
 
        bcbearer->bearer.publ.blocked = 1;
@@ -682,7 +682,7 @@ void tipc_bcbearer_sort(void)
 
 /**
  * tipc_bcbearer_push - resolve bearer congestion
- * 
+ *
  * Forces bclink to push out any unsent packets, until all packets are gone
  * or congestion reoccurs.
  * No locks set when function called
@@ -714,27 +714,27 @@ int tipc_bclink_stats(char *buf, const u32 buf_size)
        spin_lock_bh(&bc_lock);
 
        tipc_printf(&pb, "Link <%s>\n"
-                        "  Window:%u packets\n", 
+                        "  Window:%u packets\n",
                    bcl->name, bcl->queue_limit[0]);
-       tipc_printf(&pb, "  RX packets:%u fragments:%u/%u bundles:%u/%u\n", 
+       tipc_printf(&pb, "  RX packets:%u fragments:%u/%u bundles:%u/%u\n",
                    bcl->stats.recv_info,
                    bcl->stats.recv_fragments,
                    bcl->stats.recv_fragmented,
                    bcl->stats.recv_bundles,
                    bcl->stats.recv_bundled);
-       tipc_printf(&pb, "  TX packets:%u fragments:%u/%u bundles:%u/%u\n", 
+       tipc_printf(&pb, "  TX packets:%u fragments:%u/%u bundles:%u/%u\n",
                    bcl->stats.sent_info,
                    bcl->stats.sent_fragments,
-                   bcl->stats.sent_fragmented, 
+                   bcl->stats.sent_fragmented,
                    bcl->stats.sent_bundles,
                    bcl->stats.sent_bundled);
-       tipc_printf(&pb, "  RX naks:%u defs:%u dups:%u\n", 
+       tipc_printf(&pb, "  RX naks:%u defs:%u dups:%u\n",
                    bcl->stats.recv_nacks,
-                   bcl->stats.deferred_recv, 
+                   bcl->stats.deferred_recv,
                    bcl->stats.duplicates);
-       tipc_printf(&pb, "  TX naks:%u acks:%u dups:%u\n", 
-                   bcl->stats.sent_nacks, 
-                   bcl->stats.sent_acks, 
+       tipc_printf(&pb, "  TX naks:%u acks:%u dups:%u\n",
+                   bcl->stats.sent_nacks,
+                   bcl->stats.sent_acks,
                    bcl->stats.retransmitted);
        tipc_printf(&pb, "  Congestion bearer:%u link:%u  Send queue max:%u avg:%u\n",
                    bcl->stats.bearer_congs,
@@ -778,7 +778,7 @@ int tipc_bclink_init(void)
        bclink = kzalloc(sizeof(*bclink), GFP_ATOMIC);
        if (!bcbearer || !bclink) {
  nomem:
-               warn("Multicast link creation failed, no memory\n");
+               warn("Multicast link creation failed, no memory\n");
                kfree(bcbearer);
                bcbearer = NULL;
                kfree(bclink);
@@ -796,7 +796,7 @@ int tipc_bclink_init(void)
        bcl->next_out_no = 1;
        spin_lock_init(&bclink->node.lock);
        bcl->owner = &bclink->node;
-        bcl->max_pkt = MAX_PKT_DEFAULT_MCAST;
+       bcl->max_pkt = MAX_PKT_DEFAULT_MCAST;
        tipc_link_set_queue_limits(bcl, BCLINK_WIN_DEFAULT);
        bcl->b_ptr = &bcbearer->bearer;
        bcl->state = WORKING_WORKING;
index b243d9d495f0588382f13272f30c3cb45c8067c2..f910ed29d05570172223da5070a0aefa1e772df5 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/bcast.h: Include file for TIPC broadcast code
- * 
+ *
  * Copyright (c) 2003-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
@@ -102,7 +102,7 @@ static inline void tipc_nmap_add(struct node_map *nm_ptr, u32 node)
        }
 }
 
-/** 
+/**
  * nmap_remove - remove a node from a node map
  */
 
@@ -190,7 +190,7 @@ static inline void tipc_port_list_add(struct port_list *pl_ptr, u32 port)
 
 /**
  * port_list_free - free dynamically created entries in port_list chain
- * 
+ *
  * Note: First item is on stack, so it doesn't need to be released
  */
 
index 39744a33bd3693864997d6ec2d1d2339f2f2eb48..271a375b49b74ab10395ca08555801f5cf0b0f46 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/bearer.c: TIPC bearer code
- * 
+ *
  * Copyright (c) 1996-2006, Ericsson AB
  * Copyright (c) 2004-2006, Wind River Systems
  * All rights reserved.
@@ -52,7 +52,7 @@ struct bearer *tipc_bearers = NULL;
 
 /**
  * media_name_valid - validate media name
- * 
+ *
  * Returns 1 if media name is valid, otherwise 0.
  */
 
@@ -84,17 +84,17 @@ static struct media *media_find(const char *name)
 
 /**
  * tipc_register_media - register a media type
- * 
+ *
  * Bearers for this media type must be activated separately at a later stage.
  */
 
 int  tipc_register_media(u32 media_type,
-                        char *name, 
-                        int (*enable)(struct tipc_bearer *), 
-                        void (*disable)(struct tipc_bearer *), 
-                        int (*send_msg)(struct sk_buff *, 
+                        char *name,
+                        int (*enable)(struct tipc_bearer *),
+                        void (*disable)(struct tipc_bearer *),
+                        int (*send_msg)(struct sk_buff *,
                                         struct tipc_bearer *,
-                                        struct tipc_media_addr *), 
+                                        struct tipc_media_addr *),
                         char *(*addr2str)(struct tipc_media_addr *a,
                                           char *str_buf, int str_size),
                         struct tipc_media_addr *bcast_addr,
@@ -121,11 +121,11 @@ int  tipc_register_media(u32 media_type,
        }
        if ((bearer_priority < TIPC_MIN_LINK_PRI) &&
            (bearer_priority > TIPC_MAX_LINK_PRI)) {
-               warn("Media <%s> rejected, illegal priority (%u)\n", name, 
+               warn("Media <%s> rejected, illegal priority (%u)\n", name,
                     bearer_priority);
                goto exit;
        }
-       if ((link_tolerance < TIPC_MIN_LINK_TOL) || 
+       if ((link_tolerance < TIPC_MIN_LINK_TOL) ||
            (link_tolerance > TIPC_MAX_LINK_TOL)) {
                warn("Media <%s> rejected, illegal tolerance (%u)\n", name,
                     link_tolerance);
@@ -219,7 +219,7 @@ struct sk_buff *tipc_media_get_names(void)
 
        read_lock_bh(&tipc_net_lock);
        for (i = 0, m_ptr = media_list; i < media_count; i++, m_ptr++) {
-               tipc_cfg_append_tlv(buf, TIPC_TLV_MEDIA_NAME, m_ptr->name, 
+               tipc_cfg_append_tlv(buf, TIPC_TLV_MEDIA_NAME, m_ptr->name,
                                    strlen(m_ptr->name) + 1);
        }
        read_unlock_bh(&tipc_net_lock);
@@ -230,11 +230,11 @@ struct sk_buff *tipc_media_get_names(void)
  * bearer_name_validate - validate & (optionally) deconstruct bearer name
  * @name - ptr to bearer name string
  * @name_parts - ptr to area for bearer name components (or NULL if not needed)
- * 
+ *
  * Returns 1 if bearer name is valid, otherwise 0.
  */
 
-static int bearer_name_validate(const char *name, 
+static int bearer_name_validate(const char *name,
                                struct bearer_name *name_parts)
 {
        char name_copy[TIPC_MAX_BEARER_NAME];
@@ -262,8 +262,8 @@ static int bearer_name_validate(const char *name,
 
        /* validate component parts of bearer name */
 
-       if ((media_len <= 1) || (media_len > TIPC_MAX_MEDIA_NAME) || 
-           (if_len <= 1) || (if_len > TIPC_MAX_IF_NAME) || 
+       if ((media_len <= 1) || (media_len > TIPC_MAX_MEDIA_NAME) ||
+           (if_len <= 1) || (if_len > TIPC_MAX_IF_NAME) ||
            (strspn(media_name, tipc_alphabet) != (media_len - 1)) ||
            (strspn(if_name, tipc_alphabet) != (if_len - 1)))
                return 0;
@@ -336,8 +336,8 @@ struct sk_buff *tipc_bearer_get_names(void)
                for (j = 0; j < MAX_BEARERS; j++) {
                        b_ptr = &tipc_bearers[j];
                        if (b_ptr->active && (b_ptr->media == m_ptr)) {
-                               tipc_cfg_append_tlv(buf, TIPC_TLV_BEARER_NAME, 
-                                                   b_ptr->publ.name, 
+                               tipc_cfg_append_tlv(buf, TIPC_TLV_BEARER_NAME,
+                                                   b_ptr->publ.name,
                                                    strlen(b_ptr->publ.name) + 1);
                        }
                }
@@ -401,8 +401,8 @@ void tipc_bearer_lock_push(struct bearer *b_ptr)
 
 
 /*
- * Interrupt enabling new requests after bearer congestion or blocking:    
- * See bearer_send().   
+ * Interrupt enabling new requests after bearer congestion or blocking:
+ * See bearer_send().
  */
 void tipc_continue(struct tipc_bearer *tb_ptr)
 {
@@ -417,9 +417,9 @@ void tipc_continue(struct tipc_bearer *tb_ptr)
 }
 
 /*
- * Schedule link for sending of messages after the bearer 
- * has been deblocked by 'continue()'. This method is called 
- * when somebody tries to send a message via this link while 
+ * Schedule link for sending of messages after the bearer
+ * has been deblocked by 'continue()'. This method is called
+ * when somebody tries to send a message via this link while
  * the bearer is congested. 'tipc_net_lock' is in read_lock here
  * bearer.lock is busy
  */
@@ -430,9 +430,9 @@ static void tipc_bearer_schedule_unlocked(struct bearer *b_ptr, struct link *l_p
 }
 
 /*
- * Schedule link for sending of messages after the bearer 
- * has been deblocked by 'continue()'. This method is called 
- * when somebody tries to send a message via this link while 
+ * Schedule link for sending of messages after the bearer
+ * has been deblocked by 'continue()'. This method is called
+ * when somebody tries to send a message via this link while
  * the bearer is congested. 'tipc_net_lock' is in read_lock here,
  * bearer.lock is free
  */
@@ -468,7 +468,7 @@ int tipc_bearer_resolve_congestion(struct bearer *b_ptr, struct link *l_ptr)
 
 /**
  * tipc_enable_bearer - enable bearer with the given name
- */              
+ */
 
 int tipc_enable_bearer(const char *name, u32 bcast_scope, u32 priority)
 {
@@ -490,7 +490,7 @@ int tipc_enable_bearer(const char *name, u32 bcast_scope, u32 priority)
                warn("Bearer <%s> rejected, illegal name\n", name);
                return -EINVAL;
        }
-       if (!tipc_addr_domain_valid(bcast_scope) || 
+       if (!tipc_addr_domain_valid(bcast_scope) ||
            !in_scope(bcast_scope, tipc_own_addr)) {
                warn("Bearer <%s> rejected, illegal broadcast scope\n", name);
                return -EINVAL;
@@ -539,7 +539,7 @@ restart:
                }
        }
        if (bearer_id >= MAX_BEARERS) {
-               warn("Bearer <%s> rejected, bearer limit reached (%u)\n", 
+               warn("Bearer <%s> rejected, bearer limit reached (%u)\n",
                     name, MAX_BEARERS);
                goto failed;
        }
@@ -612,7 +612,7 @@ int tipc_block_bearer(const char *name)
 
 /**
  * bearer_disable -
- * 
+ *
  * Note: This routine assumes caller holds tipc_net_lock.
  */
 
index c4e7c1c3655b84dba596da999a71ea69fb7bf775..6a36b6600e6c79c7c827eca58061de84e1f7f754 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/bearer.h: Include file for TIPC bearer code
- * 
+ *
  * Copyright (c) 1996-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
  * @type_id: TIPC media identifier [defined in tipc_bearer.h]
  * @name: media name
  */
+
 struct media {
-       int (*send_msg)(struct sk_buff *buf, 
+       int (*send_msg)(struct sk_buff *buf,
                        struct tipc_bearer *b_ptr,
                        struct tipc_media_addr *dest);
        int (*enable_bearer)(struct tipc_bearer *b_ptr);
        void (*disable_bearer)(struct tipc_bearer *b_ptr);
-       char *(*addr2str)(struct tipc_media_addr *a, 
+       char *(*addr2str)(struct tipc_media_addr *a,
                          char *str_buf, int str_size);
        struct tipc_media_addr bcast_addr;
        int bcast;
@@ -91,7 +91,7 @@ struct media {
  * @net_plane: network plane ('A' through 'H') currently associated with bearer
  * @nodes: indicates which nodes in cluster can be reached through bearer
  */
+
 struct bearer {
        struct tipc_bearer publ;
        struct media *media;
@@ -131,21 +131,21 @@ void tipc_bearer_lock_push(struct bearer *b_ptr);
 
 
 /**
- * tipc_bearer_send- sends buffer to destination over bearer 
- * 
+ * tipc_bearer_send- sends buffer to destination over bearer
+ *
  * Returns true (1) if successful, or false (0) if unable to send
- * 
+ *
  * IMPORTANT:
  * The media send routine must not alter the buffer being passed in
  * as it may be needed for later retransmission!
- * 
- * If the media send routine returns a non-zero value (indicating that 
+ *
+ * If the media send routine returns a non-zero value (indicating that
  * it was unable to send the buffer), it must:
  *   1) mark the bearer as blocked,
  *   2) call tipc_continue() once the bearer is able to send again.
  * Media types that are unable to meet these two critera must ensure their
  * send routine always returns success -- even if the buffer was not sent --
- * and let TIPC's link code deal with the undelivered message. 
+ * and let TIPC's link code deal with the undelivered message.
  */
 
 static inline int tipc_bearer_send(struct bearer *b_ptr, struct sk_buff *buf,
index b46b5188a9fd77d01bebd8ed5c481b5b5e1fcfc9..95b373913aa0dd21ae33a73dc730b92fd2e5c2fa 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/cluster.c: TIPC cluster management routines
- * 
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
@@ -56,7 +56,7 @@ struct cluster *tipc_cltr_create(u32 addr)
 {
        struct _zone *z_ptr;
        struct cluster *c_ptr;
-       int max_nodes; 
+       int max_nodes;
 
        c_ptr = kzalloc(sizeof(*c_ptr), GFP_ATOMIC);
        if (c_ptr == NULL) {
@@ -81,7 +81,7 @@ struct cluster *tipc_cltr_create(u32 addr)
                tipc_local_nodes = c_ptr->nodes;
        c_ptr->highest_slave = LOWEST_SLAVE - 1;
        c_ptr->highest_node = 0;
-       
+
        z_ptr = tipc_zone_find(tipc_zone(addr));
        if (!z_ptr) {
                z_ptr = tipc_zone_create(addr);
@@ -150,7 +150,7 @@ void tipc_cltr_attach_node(struct cluster *c_ptr, struct node *n_ptr)
 
 /**
  * tipc_cltr_select_router - select router to a cluster
- * 
+ *
  * Uses deterministic and fair algorithm.
  */
 
@@ -192,7 +192,7 @@ u32 tipc_cltr_select_router(struct cluster *c_ptr, u32 ref)
 
 /**
  * tipc_cltr_select_node - select destination node within a remote cluster
- * 
+ *
  * Uses deterministic and fair algorithm.
  */
 
@@ -295,7 +295,7 @@ void tipc_cltr_send_slave_routes(struct cluster *c_ptr, u32 dest)
                msg_set_remote_node(msg, c_ptr->addr);
                msg_set_type(msg, SLAVE_ROUTING_TABLE);
                for (n_num = LOWEST_SLAVE; n_num <= highest; n_num++) {
-                       if (c_ptr->nodes[n_num] && 
+                       if (c_ptr->nodes[n_num] &&
                            tipc_node_has_active_links(c_ptr->nodes[n_num])) {
                                send = 1;
                                msg_set_dataoctet(msg, n_num);
@@ -329,7 +329,7 @@ void tipc_cltr_send_ext_routes(struct cluster *c_ptr, u32 dest)
                msg_set_remote_node(msg, c_ptr->addr);
                msg_set_type(msg, EXT_ROUTING_TABLE);
                for (n_num = 1; n_num <= highest; n_num++) {
-                       if (c_ptr->nodes[n_num] && 
+                       if (c_ptr->nodes[n_num] &&
                            tipc_node_has_active_links(c_ptr->nodes[n_num])) {
                                send = 1;
                                msg_set_dataoctet(msg, n_num);
@@ -360,7 +360,7 @@ void tipc_cltr_send_local_routes(struct cluster *c_ptr, u32 dest)
                msg_set_remote_node(msg, c_ptr->addr);
                msg_set_type(msg, LOCAL_ROUTING_TABLE);
                for (n_num = 1; n_num <= highest; n_num++) {
-                       if (c_ptr->nodes[n_num] && 
+                       if (c_ptr->nodes[n_num] &&
                            tipc_node_has_active_links(c_ptr->nodes[n_num])) {
                                send = 1;
                                msg_set_dataoctet(msg, n_num);
@@ -492,7 +492,7 @@ void tipc_cltr_remove_as_router(struct cluster *c_ptr, u32 router)
 }
 
 /**
- * tipc_cltr_multicast - multicast message to local nodes 
+ * tipc_cltr_multicast - multicast message to local nodes
  */
 
 static void tipc_cltr_multicast(struct cluster *c_ptr, struct sk_buff *buf,
@@ -554,9 +554,9 @@ void tipc_cltr_broadcast(struct sk_buff *buf)
                                        buf_copy = skb_copy(buf, GFP_ATOMIC);
                                        if (buf_copy == NULL)
                                                goto exit;
-                                       msg_set_destnode(buf_msg(buf_copy), 
+                                       msg_set_destnode(buf_msg(buf_copy),
                                                         n_ptr->addr);
-                                       tipc_link_send(buf_copy, n_ptr->addr, 
+                                       tipc_link_send(buf_copy, n_ptr->addr,
                                                       n_ptr->addr);
                                }
                        }
index 1b4cd309495ae9eac69f995269735c9ab7d69c8d..62df074afaecf8a5912b5b9a25a0779a391b8da8 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/cluster.h: Include file for TIPC cluster management routines
- * 
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
@@ -50,7 +50,7 @@
  * @highest_node: id of highest numbered node within cluster
  * @highest_slave: (used for secondary node support)
  */
+
 struct cluster {
        u32 addr;
        struct _zone *owner;
index baf55c459c8bc15b2e2b514642656889a1e123a2..14789a82de537b6629383ec37af4ec6d6b5c81dc 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/config.c: TIPC configuration management code
- * 
+ *
  * Copyright (c) 2002-2006, Ericsson AB
  * Copyright (c) 2004-2006, Wind River Systems
  * All rights reserved.
@@ -86,7 +86,7 @@ struct sk_buff *tipc_cfg_reply_alloc(int payload_size)
        return buf;
 }
 
-int tipc_cfg_append_tlv(struct sk_buff *buf, int tlv_type, 
+int tipc_cfg_append_tlv(struct sk_buff *buf, int tlv_type,
                        void *tlv_data, int tlv_data_size)
 {
        struct tlv_desc *tlv = (struct tlv_desc *)buf->tail;
@@ -112,7 +112,7 @@ struct sk_buff *tipc_cfg_reply_unsigned_type(u16 tlv_type, u32 value)
        buf = tipc_cfg_reply_alloc(TLV_SPACE(sizeof(value)));
        if (buf) {
                value_net = htonl(value);
-               tipc_cfg_append_tlv(buf, tlv_type, &value_net, 
+               tipc_cfg_append_tlv(buf, tlv_type, &value_net,
                                    sizeof(value_net));
        }
        return buf;
@@ -182,7 +182,7 @@ int tipc_cfg_cmd(const struct tipc_cmd_msg * msg,
 
 static void cfg_cmd_event(struct tipc_cmd_msg *msg,
                          char *data,
-                         u32 sz,        
+                         u32 sz,
                          struct tipc_portid const *orig)
 {
        int rv = -EINVAL;
@@ -192,7 +192,7 @@ static void cfg_cmd_event(struct tipc_cmd_msg *msg,
 
        msg->cmd = ntohl(msg->cmd);
 
-       cfg_prepare_res_msg(msg->cmd, msg->usr_handle, rv, &rmsg, msg_sect, 
+       cfg_prepare_res_msg(msg->cmd, msg->usr_handle, rv, &rmsg, msg_sect,
                            data, 0);
        if (ntohl(msg->magic) != TIPC_MAGIC)
                goto exit;
@@ -295,7 +295,7 @@ static struct sk_buff *cfg_set_own_addr(void)
                                                   " (cannot change node address once assigned)");
        tipc_own_addr = addr;
 
-       /* 
+       /*
         * Must release all spinlocks before calling start_net() because
         * Linux version of TIPC calls eth_media_start() which calls
         * register_netdevice_notifier() which may block!
@@ -619,7 +619,7 @@ static void cfg_named_msg_event(void *userdata,
                                struct sk_buff **buf,
                                const unchar *msg,
                                u32 size,
-                               u32 importance, 
+                               u32 importance,
                                struct tipc_portid const *orig,
                                struct tipc_name_seq const *dest)
 {
@@ -640,7 +640,7 @@ static void cfg_named_msg_event(void *userdata,
        /* Generate reply for request (if can't, return request) */
 
        rep_buf = tipc_cfg_do_cmd(orig->node,
-                                 ntohs(req_hdr->tcm_type), 
+                                 ntohs(req_hdr->tcm_type),
                                  msg + sizeof(*req_hdr),
                                  size - sizeof(*req_hdr),
                                  BUF_HEADROOM + MAX_H_SIZE + sizeof(*rep_hdr));
index 7a728f954d84b3b4ab53f78972b120b40c3036b6..5cd7cc56c54d13ee43a1a5155ff3d0a99dfa5a88 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/config.h: Include file for TIPC configuration service code
- * 
+ *
  * Copyright (c) 2003-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
@@ -43,7 +43,7 @@
 #include "link.h"
 
 struct sk_buff *tipc_cfg_reply_alloc(int payload_size);
-int tipc_cfg_append_tlv(struct sk_buff *buf, int tlv_type, 
+int tipc_cfg_append_tlv(struct sk_buff *buf, int tlv_type,
                        void *tlv_data, int tlv_data_size);
 struct sk_buff *tipc_cfg_reply_unsigned_type(u16 tlv_type, u32 value);
 struct sk_buff *tipc_cfg_reply_string_type(u16 tlv_type, char *string);
@@ -68,8 +68,8 @@ static inline struct sk_buff *tipc_cfg_reply_ultra_string(char *string)
        return tipc_cfg_reply_string_type(TIPC_TLV_ULTRA_STRING, string);
 }
 
-struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, 
-                               const void *req_tlv_area, int req_tlv_space, 
+struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd,
+                               const void *req_tlv_area, int req_tlv_space,
                                int headroom);
 
 void tipc_cfg_link_event(u32 addr, char *name, int up);
index 6f5b7ee311802388b80ad5d72e2a8a15ae48b89e..d2d7d32c02c7bc4044065b695a43f138c591fab3 100644 (file)
@@ -89,7 +89,7 @@ int tipc_mode = TIPC_NOT_RUNNING;
 int tipc_random;
 atomic_t tipc_user_count = ATOMIC_INIT(0);
 
-const char tipc_alphabet[] = 
+const char tipc_alphabet[] =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.";
 
 /* configurable TIPC parameters */
@@ -171,13 +171,13 @@ int tipc_core_start(void)
        get_random_bytes(&tipc_random, sizeof(tipc_random));
        tipc_mode = TIPC_NODE_MODE;
 
-       if ((res = tipc_handler_start()) || 
+       if ((res = tipc_handler_start()) ||
            (res = tipc_ref_table_init(tipc_max_ports + tipc_max_subscriptions,
                                       tipc_random)) ||
            (res = tipc_reg_start()) ||
            (res = tipc_nametbl_init()) ||
-            (res = tipc_k_signal((Handler)tipc_subscr_start, 0)) ||
-           (res = tipc_k_signal((Handler)tipc_cfg_init, 0)) || 
+           (res = tipc_k_signal((Handler)tipc_subscr_start, 0)) ||
+           (res = tipc_k_signal((Handler)tipc_cfg_init, 0)) ||
            (res = tipc_netlink_start()) ||
            (res = tipc_socket_init())) {
                tipc_core_stop();
@@ -191,7 +191,7 @@ static int __init tipc_init(void)
        int res;
 
        tipc_log_reinit(CONFIG_TIPC_LOG);
-       info("Activated (version " TIPC_MOD_VER 
+       info("Activated (version " TIPC_MOD_VER
             " compiled " __DATE__ " " __TIME__ ")\n");
 
        tipc_own_addr = 0;
@@ -207,9 +207,9 @@ static int __init tipc_init(void)
 
        if ((res = tipc_core_start()))
                err("Unable to start in single node mode\n");
-       else    
+       else
                info("Started in single node mode\n");
-        return res;
+       return res;
 }
 
 static void __exit tipc_exit(void)
@@ -268,11 +268,11 @@ EXPORT_SYMBOL(tipc_available_nodes);
 /* TIPC API for external bearers (see tipc_bearer.h) */
 
 EXPORT_SYMBOL(tipc_block_bearer);
-EXPORT_SYMBOL(tipc_continue); 
+EXPORT_SYMBOL(tipc_continue);
 EXPORT_SYMBOL(tipc_disable_bearer);
 EXPORT_SYMBOL(tipc_enable_bearer);
 EXPORT_SYMBOL(tipc_recv_msg);
-EXPORT_SYMBOL(tipc_register_media); 
+EXPORT_SYMBOL(tipc_register_media);
 
 /* TIPC API for external APIs (see tipc_port.h) */
 
index 4638947c2326e0ea534f490b02abc767270d2c1a..e40ada964d6e9ce4794b30c98ab6f2516ac70427 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/core.h: Include file for TIPC global declarations
- * 
+ *
  * Copyright (c) 2005-2006, Ericsson AB
  * Copyright (c) 2005-2006, Wind River Systems
  * All rights reserved.
@@ -54,7 +54,7 @@
 #include <asm/atomic.h>
 #include <asm/hardirq.h>
 #include <linux/netdevice.h>
-#include <linux/in.h>  
+#include <linux/in.h>
 #include <linux/list.h>
 #include <linux/vmalloc.h>
 
@@ -88,7 +88,7 @@ void tipc_dump(struct print_buf*,const char *fmt, ...);
 #define dump(fmt, arg...) do {if (DBG_OUTPUT != TIPC_NULL) tipc_dump(DBG_OUTPUT, fmt, ##arg);} while(0)
 
 
-/*     
+/*
  * By default, TIPC_OUTPUT is defined to be system console and TIPC log buffer,
  * while DBG_OUTPUT is the null print buffer.  These defaults can be changed
  * here, or on a per .c file basis, by redefining these symbols.  The following
@@ -126,9 +126,9 @@ void tipc_dump(struct print_buf*,const char *fmt, ...);
 #define dump(fmt,arg...) do {} while (0)
 
 
-/*     
+/*
  * TIPC_OUTPUT is defined to be the system console, while DBG_OUTPUT is
- * the null print buffer.  Thes ensures that any system or debug messages 
+ * the null print buffer.  Thes ensures that any system or debug messages
  * that are generated without using the above macros are handled correctly.
  */
 
@@ -138,10 +138,10 @@ void tipc_dump(struct print_buf*,const char *fmt, ...);
 #undef  DBG_OUTPUT
 #define DBG_OUTPUT TIPC_NULL
 
-#endif                   
+#endif
 
 
-/* 
+/*
  * TIPC-specific error codes
  */
 
@@ -204,11 +204,11 @@ u32 tipc_k_signal(Handler routine, unsigned long argument);
  * @timer: pointer to timer structure
  * @routine: pointer to routine to invoke when timer expires
  * @argument: value to pass to routine when timer expires
- * 
+ *
  * Timer must be initialized before use (and terminated when no longer needed).
  */
 
-static inline void k_init_timer(struct timer_list *timer, Handler routine, 
+static inline void k_init_timer(struct timer_list *timer, Handler routine,
                                unsigned long argument)
 {
        dbg("initializing timer %p\n", timer);
@@ -221,13 +221,13 @@ static inline void k_init_timer(struct timer_list *timer, Handler routine,
  * k_start_timer - start a timer
  * @timer: pointer to timer structure
  * @msec: time to delay (in ms)
- * 
+ *
  * Schedules a previously initialized timer for later execution.
  * If timer is already running, the new timeout overrides the previous request.
- * 
+ *
  * To ensure the timer doesn't expire before the specified delay elapses,
  * the amount of delay is rounded up when converting to the jiffies
- * then an additional jiffy is added to account for the fact that 
+ * then an additional jiffy is added to account for the fact that
  * the starting time may be in the middle of the current jiffy.
  */
 
@@ -240,10 +240,10 @@ static inline void k_start_timer(struct timer_list *timer, unsigned long msec)
 /**
  * k_cancel_timer - cancel a timer
  * @timer: pointer to timer structure
- * 
- * Cancels a previously initialized timer.  
+ *
+ * Cancels a previously initialized timer.
  * Can be called safely even if the timer is already inactive.
- * 
+ *
  * WARNING: Must not be called when holding locks required by the timer's
  *          timeout routine, otherwise deadlock can occur on SMP systems!
  */
@@ -257,11 +257,11 @@ static inline void k_cancel_timer(struct timer_list *timer)
 /**
  * k_term_timer - terminate a timer
  * @timer: pointer to timer structure
- * 
+ *
  * Prevents further use of a previously initialized timer.
- * 
+ *
  * WARNING: Caller must ensure timer isn't currently running.
- * 
+ *
  * (Do not "enhance" this routine to automatically cancel an active timer,
  * otherwise deadlock can arise when a timeout routine calls k_term_timer.)
  */
@@ -302,7 +302,7 @@ static inline struct tipc_msg *buf_msg(struct sk_buff *skb)
  * @size: message size (including TIPC header)
  *
  * Returns a new buffer with data pointers set to the specified size.
- * 
+ *
  * NOTE: Headroom is reserved to allow prepending of a data link header.
  *       There may also be unrequested tailroom present at the buffer's end.
  */
@@ -334,4 +334,4 @@ static inline void buf_discard(struct sk_buff *skb)
                kfree_skb(skb);
 }
 
-#endif                 
+#endif
index 627f99b7afdfbcc637bc0eca6f4cf1bc8badfcd6..e809d2a2ce062486f408a923dbdfa2b590ad537f 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/dbg.c: TIPC print buffer routines for debugging
- * 
+ *
  * Copyright (c) 1996-2006, Ericsson AB
  * Copyright (c) 2005-2006, Wind River Systems
  * All rights reserved.
@@ -123,34 +123,34 @@ int tipc_printbuf_empty(struct print_buf *pb)
 /**
  * tipc_printbuf_validate - check for print buffer overflow
  * @pb: pointer to print buffer structure
- * 
- * Verifies that a print buffer has captured all data written to it. 
+ *
+ * Verifies that a print buffer has captured all data written to it.
  * If data has been lost, linearize buffer and prepend an error message
- * 
+ *
  * Returns length of print buffer data string (including trailing NUL)
  */
 
 int tipc_printbuf_validate(struct print_buf *pb)
 {
-        char *err = "\n\n*** PRINT BUFFER OVERFLOW ***\n\n";
-        char *cp_buf;
-        struct print_buf cb;
+       char *err = "\n\n*** PRINT BUFFER OVERFLOW ***\n\n";
+       char *cp_buf;
+       struct print_buf cb;
 
        if (!pb->buf)
                return 0;
 
        if (pb->buf[pb->size - 1] == 0) {
-                cp_buf = kmalloc(pb->size, GFP_ATOMIC);
-                if (cp_buf != NULL){
-                        tipc_printbuf_init(&cb, cp_buf, pb->size);
-                        tipc_printbuf_move(&cb, pb);
-                        tipc_printbuf_move(pb, &cb);
-                        kfree(cp_buf);
-                        memcpy(pb->buf, err, strlen(err));
-                } else {
-                        tipc_printbuf_reset(pb);
-                        tipc_printf(pb, err);
-                }
+               cp_buf = kmalloc(pb->size, GFP_ATOMIC);
+               if (cp_buf != NULL){
+                       tipc_printbuf_init(&cb, cp_buf, pb->size);
+                       tipc_printbuf_move(&cb, pb);
+                       tipc_printbuf_move(pb, &cb);
+                       kfree(cp_buf);
+                       memcpy(pb->buf, err, strlen(err));
+               } else {
+                       tipc_printbuf_reset(pb);
+                       tipc_printf(pb, err);
+               }
        }
        return (pb->crs - pb->buf + 1);
 }
@@ -159,7 +159,7 @@ int tipc_printbuf_validate(struct print_buf *pb)
  * tipc_printbuf_move - move print buffer contents to another print buffer
  * @pb_to: pointer to destination print buffer structure
  * @pb_from: pointer to source print buffer structure
- * 
+ *
  * Current contents of destination print buffer (if any) are discarded.
  * Source print buffer becomes empty if a successful move occurs.
  */
@@ -234,13 +234,13 @@ void tipc_printf(struct print_buf *pb, const char *fmt, ...)
                                pb->crs = pb->buf + pb->size - 1;
                        } else {
                                strcpy(pb->buf, print_string + chars_left);
-                                save_char = print_string[chars_left];
-                                print_string[chars_left] = 0;
-                                strcpy(pb->crs, print_string);
-                                print_string[chars_left] = save_char;
-                                pb->crs = pb->buf + chars_to_add - chars_left;
-                        }
-                }
+                               save_char = print_string[chars_left];
+                               print_string[chars_left] = 0;
+                               strcpy(pb->crs, print_string);
+                               print_string[chars_left] = save_char;
+                               pb->crs = pb->buf + chars_to_add - chars_left;
+                       }
+               }
                pb_next = pb->next;
                pb->next = NULL;
                pb = pb_next;
@@ -249,7 +249,7 @@ void tipc_printf(struct print_buf *pb, const char *fmt, ...)
 }
 
 /**
- * TIPC_TEE - perform next output operation on both print buffers  
+ * TIPC_TEE - perform next output operation on both print buffers
  * @b0: pointer to chain of print buffers (may be NULL)
  * @b1: pointer to print buffer to add to chain
  *
@@ -350,7 +350,7 @@ void tipc_dump(struct print_buf *pb, const char *fmt, ...)
 }
 
 /**
- * tipc_log_stop - free up TIPC log print buffer 
+ * tipc_log_stop - free up TIPC log print buffer
  */
 
 void tipc_log_stop(void)
index 467c0bc78a79feb7e8938a9100ae4e42cb3541df..c01b085000e08622838ce5b46f1ea1023d7069c2 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/dbg.h: Include file for TIPC print buffer routines
- * 
+ *
  * Copyright (c) 1997-2006, Ericsson AB
  * Copyright (c) 2005-2006, Wind River Systems
  * All rights reserved.
index 3b0cd12f37dafeb788ddbe2334a57cd5ffacae4c..5d643e5721eb45ec36d3fb43d2f205e90f1ec5b5 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/discover.c
- * 
+ *
  * Copyright (c) 2003-2006, Ericsson AB
  * Copyright (c) 2005-2006, Wind River Systems
  * All rights reserved.
 #define  CHECK_LINK_COUNT      306
 #endif
 
-/* 
+/*
  * TODO: Most of the inter-cluster setup stuff should be
  * rewritten, and be made conformant with specification.
- */ 
+ */
 
 
 /**
@@ -80,10 +80,10 @@ struct link_req {
 
 
 #if 0
-int disc_create_link(const struct tipc_link_create *argv) 
+int disc_create_link(const struct tipc_link_create *argv)
 {
-       /* 
-        * Code for inter cluster link setup here 
+       /*
+        * Code for inter cluster link setup here
         */
        return TIPC_OK;
 }
@@ -93,16 +93,16 @@ int disc_create_link(const struct tipc_link_create *argv)
  * disc_lost_link(): A link has lost contact
  */
 
-void tipc_disc_link_event(u32 addr, char *name, int up) 
+void tipc_disc_link_event(u32 addr, char *name, int up)
 {
        if (in_own_cluster(addr))
                return;
-       /* 
-        * Code for inter cluster link setup here 
+       /*
+        * Code for inter cluster link setup here
         */
 }
 
-/** 
+/**
  * tipc_disc_init_msg - initialize a link setup message
  * @type: message type (request or response)
  * @req_links: number of links associated with message
@@ -210,7 +210,7 @@ void tipc_disc_recv_msg(struct sk_buff *buf)
                        dbg("creating link\n");
                        link = tipc_link_create(b_ptr, orig, &media_addr);
                        if (!link) {
-                               spin_unlock_bh(&n_ptr->lock);                
+                               spin_unlock_bh(&n_ptr->lock);
                                return;
                        }
                }
@@ -224,10 +224,10 @@ void tipc_disc_recv_msg(struct sk_buff *buf)
                        warn("Resetting link <%s>, peer interface address changed\n",
                             link->name);
                        memcpy(addr, &media_addr, sizeof(*addr));
-                       tipc_link_reset(link);     
+                       tipc_link_reset(link);
                }
                link_fully_up = (link->state == WORKING_WORKING);
-               spin_unlock_bh(&n_ptr->lock);                
+               spin_unlock_bh(&n_ptr->lock);
                if ((type == DSC_RESP_MSG) || link_fully_up)
                        return;
                rbuf = tipc_disc_init_msg(DSC_RESP_MSG, 1, orig, b_ptr);
@@ -244,23 +244,23 @@ void tipc_disc_recv_msg(struct sk_buff *buf)
  * @req: ptr to link request structure
  */
 
-void tipc_disc_stop_link_req(struct link_req *req) 
+void tipc_disc_stop_link_req(struct link_req *req)
 {
        if (!req)
                return;
-               
+
        k_cancel_timer(&req->timer);
        k_term_timer(&req->timer);
        buf_discard(req->buf);
        kfree(req);
-} 
+}
 
 /**
  * tipc_disc_update_link_req - update frequency of periodic link setup requests
  * @req: ptr to link request structure
  */
 
-void tipc_disc_update_link_req(struct link_req *req) 
+void tipc_disc_update_link_req(struct link_req *req)
 {
        if (!req)
                return;
@@ -278,16 +278,16 @@ void tipc_disc_update_link_req(struct link_req *req)
        } else {
                /* leave timer "as is" if haven't yet reached a "normal" rate */
        }
-} 
+}
 
 /**
  * disc_timeout - send a periodic link setup request
  * @req: ptr to link request structure
- * 
+ *
  * Called whenever a link setup request timer associated with a bearer expires.
  */
 
-static void disc_timeout(struct link_req *req) 
+static void disc_timeout(struct link_req *req)
 {
        spin_lock_bh(&req->bearer->publ.lock);
 
@@ -300,7 +300,7 @@ static void disc_timeout(struct link_req *req)
                req->timer_intv *= 2;
                if (req->timer_intv > TIPC_LINK_REQ_FAST)
                        req->timer_intv = TIPC_LINK_REQ_FAST;
-               if ((req->timer_intv == TIPC_LINK_REQ_FAST) && 
+               if ((req->timer_intv == TIPC_LINK_REQ_FAST) &&
                    (req->bearer->nodes.count))
                        req->timer_intv = TIPC_LINK_REQ_SLOW;
        }
@@ -315,14 +315,14 @@ static void disc_timeout(struct link_req *req)
  * @dest: destination address for request messages
  * @dest_domain: network domain of node(s) which should respond to message
  * @req_links: max number of desired links
- * 
+ *
  * Returns pointer to link request structure, or NULL if unable to create.
  */
 
-struct link_req *tipc_disc_init_link_req(struct bearer *b_ptr, 
+struct link_req *tipc_disc_init_link_req(struct bearer *b_ptr,
                                         const struct tipc_media_addr *dest,
                                         u32 dest_domain,
-                                        u32 req_links) 
+                                        u32 req_links)
 {
        struct link_req *req;
 
@@ -342,5 +342,5 @@ struct link_req *tipc_disc_init_link_req(struct bearer *b_ptr,
        k_init_timer(&req->timer, (Handler)disc_timeout, (unsigned long)req);
        k_start_timer(&req->timer, req->timer_intv);
        return req;
-} 
+}
 
index 0454fd1ae7f357cd0f5596981a04da632b7a7a53..9fd7587b143a5e74dd03ec6b8a7299ae5f410f58 100644 (file)
@@ -41,7 +41,7 @@
 
 struct link_req;
 
-struct link_req *tipc_disc_init_link_req(struct bearer *b_ptr, 
+struct link_req *tipc_disc_init_link_req(struct bearer *b_ptr,
                                         const struct tipc_media_addr *dest,
                                         u32 dest_domain,
                                         u32 req_links);
index 682da4a280416311ead3d8b9c45a4c42c67cda47..9be4839e32c5efe1a3ad87e24b1e6f42ecb3f9f9 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/eth_media.c: Ethernet bearer support for TIPC
- * 
+ *
  * Copyright (c) 2001-2006, Ericsson AB
  * Copyright (c) 2005-2006, Wind River Systems
  * All rights reserved.
@@ -50,7 +50,7 @@
  * @dev: ptr to associated Ethernet network device
  * @tipc_packet_type: used in binding TIPC to Ethernet driver
  */
+
 struct eth_bearer {
        struct tipc_bearer *bearer;
        struct net_device *dev;
@@ -62,10 +62,10 @@ static int eth_started = 0;
 static struct notifier_block notifier;
 
 /**
- * send_msg - send a TIPC message out over an Ethernet interface 
+ * send_msg - send a TIPC message out over an Ethernet interface
  */
 
-static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr, 
+static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr,
                    struct tipc_media_addr *dest)
 {
        struct sk_buff *clone;
@@ -76,7 +76,7 @@ static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr,
                clone->nh.raw = clone->data;
                dev = ((struct eth_bearer *)(tb_ptr->usr_handle))->dev;
                clone->dev = dev;
-               dev->hard_header(clone, dev, ETH_P_TIPC, 
+               dev->hard_header(clone, dev, ETH_P_TIPC,
                                 &dest->dev_addr.eth_addr,
                                 dev->dev_addr, clone->len);
                dev_queue_xmit(clone);
@@ -86,12 +86,12 @@ static int send_msg(struct sk_buff *buf, struct tipc_bearer *tb_ptr,
 
 /**
  * recv_msg - handle incoming TIPC message from an Ethernet interface
- * 
+ *
  * Routine truncates any Ethernet padding/CRC appended to the message,
  * and ensures message size matches actual length
  */
 
-static int recv_msg(struct sk_buff *buf, struct net_device *dev, 
+static int recv_msg(struct sk_buff *buf, struct net_device *dev,
                    struct packet_type *pt, struct net_device *orig_dev)
 {
        struct eth_bearer *eb_ptr = (struct eth_bearer *)pt->af_packet_priv;
@@ -99,14 +99,14 @@ static int recv_msg(struct sk_buff *buf, struct net_device *dev,
 
        if (likely(eb_ptr->bearer)) {
               if (likely(!dev->promiscuity) ||
-                  !memcmp(buf->mac.raw,dev->dev_addr,ETH_ALEN) ||
-                  !memcmp(buf->mac.raw,dev->broadcast,ETH_ALEN)) {
-                       size = msg_size((struct tipc_msg *)buf->data);
-                       skb_trim(buf, size);
-                       if (likely(buf->len == size)) {
-                               buf->next = NULL;
-                               tipc_recv_msg(buf, eb_ptr->bearer);
-                               return TIPC_OK;
+                  !memcmp(buf->mac.raw,dev->dev_addr,ETH_ALEN) ||
+                  !memcmp(buf->mac.raw,dev->broadcast,ETH_ALEN)) {
+                       size = msg_size((struct tipc_msg *)buf->data);
+                       skb_trim(buf, size);
+                       if (likely(buf->len == size)) {
+                               buf->next = NULL;
+                               tipc_recv_msg(buf, eb_ptr->bearer);
+                               return TIPC_OK;
                        }
                }
        }
@@ -115,7 +115,7 @@ static int recv_msg(struct sk_buff *buf, struct net_device *dev,
 }
 
 /**
- * enable_bearer - attach TIPC bearer to an Ethernet interface 
+ * enable_bearer - attach TIPC bearer to an Ethernet interface
  */
 
 static int enable_bearer(struct tipc_bearer *tb_ptr)
@@ -127,7 +127,7 @@ static int enable_bearer(struct tipc_bearer *tb_ptr)
 
        /* Find device with specified name */
 
-       while (dev && dev->name && strncmp(dev->name, driver_name, IFNAMSIZ)) { 
+       while (dev && dev->name && strncmp(dev->name, driver_name, IFNAMSIZ)) {
                dev = dev->next;
        }
        if (!dev)
@@ -154,14 +154,14 @@ static int enable_bearer(struct tipc_bearer *tb_ptr)
        eb_ptr->bearer = tb_ptr;
        tb_ptr->usr_handle = (void *)eb_ptr;
        tb_ptr->mtu = dev->mtu;
-       tb_ptr->blocked = 0; 
+       tb_ptr->blocked = 0;
        tb_ptr->addr.type = htonl(TIPC_MEDIA_TYPE_ETH);
        memcpy(&tb_ptr->addr.dev_addr, &dev->dev_addr, ETH_ALEN);
        return 0;
 }
 
 /**
- * disable_bearer - detach TIPC bearer from an Ethernet interface 
+ * disable_bearer - detach TIPC bearer from an Ethernet interface
  *
  * We really should do dev_remove_pack() here, but this function can not be
  * called at tasklet level. => Use eth_bearer->bearer as a flag to throw away
@@ -176,11 +176,11 @@ static void disable_bearer(struct tipc_bearer *tb_ptr)
 /**
  * recv_notification - handle device updates from OS
  *
- * Change the state of the Ethernet bearer (if any) associated with the 
+ * Change the state of the Ethernet bearer (if any) associated with the
  * specified device.
  */
 
-static int recv_notification(struct notifier_block *nb, unsigned long evt, 
+static int recv_notification(struct notifier_block *nb, unsigned long evt,
                             void *dv)
 {
        struct net_device *dev = (struct net_device *)dv;
@@ -194,7 +194,7 @@ static int recv_notification(struct notifier_block *nb, unsigned long evt,
        if (!eb_ptr->bearer)
                return NOTIFY_DONE;             /* bearer had been disabled */
 
-        eb_ptr->bearer->mtu = dev->mtu;
+       eb_ptr->bearer->mtu = dev->mtu;
 
        switch (evt) {
        case NETDEV_CHANGE:
@@ -210,12 +210,12 @@ static int recv_notification(struct notifier_block *nb, unsigned long evt,
                tipc_block_bearer(eb_ptr->bearer->name);
                break;
        case NETDEV_CHANGEMTU:
-        case NETDEV_CHANGEADDR:
+       case NETDEV_CHANGEADDR:
                tipc_block_bearer(eb_ptr->bearer->name);
-                tipc_continue(eb_ptr->bearer);
+               tipc_continue(eb_ptr->bearer);
                break;
        case NETDEV_UNREGISTER:
-        case NETDEV_CHANGENAME:
+       case NETDEV_CHANGENAME:
                tipc_disable_bearer(eb_ptr->bearer->name);
                break;
        }
@@ -227,7 +227,7 @@ static int recv_notification(struct notifier_block *nb, unsigned long evt,
  */
 
 static char *eth_addr2str(struct tipc_media_addr *a, char *str_buf, int str_size)
-{                       
+{
        unchar *addr = (unchar *)&a->dev_addr;
 
        if (str_size < 18)
@@ -246,7 +246,7 @@ static char *eth_addr2str(struct tipc_media_addr *a, char *str_buf, int str_size
  */
 
 int tipc_eth_media_start(void)
-{                       
+{
        struct tipc_media_addr bcast_addr;
        int res;
 
@@ -259,8 +259,8 @@ int tipc_eth_media_start(void)
        memset(eth_bearers, 0, sizeof(eth_bearers));
 
        res = tipc_register_media(TIPC_MEDIA_TYPE_ETH, "eth",
-                                 enable_bearer, disable_bearer, send_msg, 
-                                 eth_addr2str, &bcast_addr, ETH_LINK_PRIORITY, 
+                                 enable_bearer, disable_bearer, send_msg,
+                                 eth_addr2str, &bcast_addr, ETH_LINK_PRIORITY,
                                  ETH_LINK_TOLERANCE, ETH_LINK_WINDOW);
        if (res)
                return res;
index eb80778d6d9c6d22781b205a21b139bd4c87f052..e1dcf663f8a64960fdfdc824df07f071dca6818e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/handler.c: TIPC signal handling
- * 
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
@@ -95,7 +95,7 @@ static void process_signal_queue(unsigned long dummy)
 
 int tipc_handler_start(void)
 {
-       tipc_queue_item_cache = 
+       tipc_queue_item_cache =
                kmem_cache_create("tipc_queue_items", sizeof(struct queue_item),
                                  0, SLAB_HWCACHE_ALIGN, NULL, NULL);
        if (!tipc_queue_item_cache)
@@ -110,7 +110,7 @@ int tipc_handler_start(void)
 void tipc_handler_stop(void)
 {
        struct list_head *l, *n;
-       struct queue_item *item; 
+       struct queue_item *item;
 
        if (!handler_enabled)
                return;
index 1bb983c8130b32be1b70e776b04ee573f6530c42..71c2f2fd405c251dccf23be6b77374f42ef17685 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/link.c: TIPC link code
- * 
+ *
  * Copyright (c) 1996-2006, Ericsson AB
  * Copyright (c) 2004-2006, Wind River Systems
  * All rights reserved.
 #include "bcast.h"
 
 
-/* 
- * Limit for deferred reception queue: 
+/*
+ * Limit for deferred reception queue:
  */
 
 #define DEF_QUEUE_LIMIT 256u
 
-/* 
- * Link state events: 
+/*
+ * Link state events:
  */
 
 #define  STARTING_EVT    856384768     /* link processing trigger */
 #define  TRAFFIC_MSG_EVT 560815u       /* rx'd ??? */
 #define  TIMEOUT_EVT     560817u       /* link timer expired */
 
-/*   
- * The following two 'message types' is really just implementation 
- * data conveniently stored in the message header. 
+/*
+ * The following two 'message types' is really just implementation
+ * data conveniently stored in the message header.
  * They must not be considered part of the protocol
  */
 #define OPEN_MSG   0
 #define CLOSED_MSG 1
 
-/* 
+/*
  * State value stored in 'exp_msg_count'
  */
 
@@ -97,7 +97,7 @@ struct link_name {
 
 /* LINK EVENT CODE IS NOT SUPPORTED AT PRESENT */
 
-/** 
+/**
  * struct link_event - link up/down event notification
  */
 
@@ -121,7 +121,7 @@ static int  link_send_sections_long(struct port *sender,
 static void link_check_defragm_bufs(struct link *l_ptr);
 static void link_state_event(struct link *l_ptr, u32 event);
 static void link_reset_statistics(struct link *l_ptr);
-static void link_print(struct link *l_ptr, struct print_buf *buf, 
+static void link_print(struct link *l_ptr, struct print_buf *buf,
                       const char *str);
 
 /*
@@ -136,13 +136,13 @@ static void link_print(struct link *l_ptr, struct print_buf *buf,
  *
  * To enable per-link debugging, use LINK_LOG_BUF_SIZE to specify the size
  * of the print buffer used by each link.  If LINK_LOG_BUF_SIZE is set to 0,
- * the dbg_link_XXX() routines simply send their output to the standard 
+ * the dbg_link_XXX() routines simply send their output to the standard
  * debug print buffer (DBG_OUTPUT), if it has been defined; this can be useful
  * when there is only a single link in the system being debugged.
  *
  * Notes:
  * - When enabled, LINK_LOG_BUF_SIZE should be set to at least TIPC_PB_MIN_SIZE
- * - "l_ptr" must be valid when using dbg_link_XXX() macros  
+ * - "l_ptr" must be valid when using dbg_link_XXX() macros
  */
 
 #define LINK_LOG_BUF_SIZE 0
@@ -222,18 +222,18 @@ static u32 link_max_pkt(struct link *l_ptr)
 static void link_init_max_pkt(struct link *l_ptr)
 {
        u32 max_pkt;
-       
+
        max_pkt = (l_ptr->b_ptr->publ.mtu & ~3);
        if (max_pkt > MAX_MSG_SIZE)
                max_pkt = MAX_MSG_SIZE;
 
-        l_ptr->max_pkt_target = max_pkt;
+       l_ptr->max_pkt_target = max_pkt;
        if (l_ptr->max_pkt_target < MAX_PKT_DEFAULT)
                l_ptr->max_pkt = l_ptr->max_pkt_target;
-       else 
+       else
                l_ptr->max_pkt = MAX_PKT_DEFAULT;
 
-        l_ptr->max_pkt_probes = 0;
+       l_ptr->max_pkt_probes = 0;
 }
 
 static u32 link_next_sent(struct link *l_ptr)
@@ -269,7 +269,7 @@ int tipc_link_is_active(struct link *l_ptr)
  * link_name_validate - validate & (optionally) deconstruct link name
  * @name - ptr to link name string
  * @name_parts - ptr to area for link name components (or NULL if not needed)
- * 
+ *
  * Returns 1 if link name is valid, otherwise 0.
  */
 
@@ -317,8 +317,8 @@ static int link_name_validate(const char *name, struct link_name *name_parts)
                    &z_peer, &c_peer, &n_peer, &dummy) != 3) ||
            (z_local > 255) || (c_local > 4095) || (n_local > 4095) ||
            (z_peer  > 255) || (c_peer  > 4095) || (n_peer  > 4095) ||
-           (if_local_len <= 1) || (if_local_len > TIPC_MAX_IF_NAME) || 
-           (if_peer_len  <= 1) || (if_peer_len  > TIPC_MAX_IF_NAME) || 
+           (if_local_len <= 1) || (if_local_len > TIPC_MAX_IF_NAME) ||
+           (if_peer_len  <= 1) || (if_peer_len  > TIPC_MAX_IF_NAME) ||
            (strspn(if_local, tipc_alphabet) != (if_local_len - 1)) ||
            (strspn(if_peer, tipc_alphabet) != (if_peer_len - 1)))
                return 0;
@@ -337,7 +337,7 @@ static int link_name_validate(const char *name, struct link_name *name_parts)
 /**
  * link_timeout - handle expiration of link timer
  * @l_ptr: pointer to link
- * 
+ *
  * This routine must not grab "tipc_net_lock" to avoid a potential deadlock conflict
  * with tipc_link_delete().  (There is no risk that the node will be deleted by
  * another thread because tipc_link_delete() always cancels the link timer before
@@ -406,7 +406,7 @@ static void link_set_timer(struct link *l_ptr, u32 time)
  * @b_ptr: pointer to associated bearer
  * @peer: network address of node at other end of link
  * @media_addr: media address to use when sending messages over link
- * 
+ *
  * Returns pointer to link.
  */
 
@@ -427,7 +427,7 @@ struct link *tipc_link_create(struct bearer *b_ptr, const u32 peer,
        if_name = strchr(b_ptr->publ.name, ':') + 1;
        sprintf(l_ptr->name, "%u.%u.%u:%s-%u.%u.%u:",
                tipc_zone(tipc_own_addr), tipc_cluster(tipc_own_addr),
-               tipc_node(tipc_own_addr), 
+               tipc_node(tipc_own_addr),
                if_name,
                tipc_zone(peer), tipc_cluster(peer), tipc_node(peer));
                /* note: peer i/f is appended to link name by reset/activate */
@@ -478,17 +478,17 @@ struct link *tipc_link_create(struct bearer *b_ptr, const u32 peer,
 
        dbg("tipc_link_create(): tolerance = %u,cont intv = %u, abort_limit = %u\n",
            l_ptr->tolerance, l_ptr->continuity_interval, l_ptr->abort_limit);
-       
+
        return l_ptr;
 }
 
-/** 
+/**
  * tipc_link_delete - delete a link
  * @l_ptr: pointer to link
- * 
+ *
  * Note: 'tipc_net_lock' is write_locked, bearer is locked.
  * This routine must not grab the node lock until after link timer cancellation
- * to avoid a potential deadlock situation.  
+ * to avoid a potential deadlock situation.
  */
 
 void tipc_link_delete(struct link *l_ptr)
@@ -501,7 +501,7 @@ void tipc_link_delete(struct link *l_ptr)
        dbg("tipc_link_delete()\n");
 
        k_cancel_timer(&l_ptr->timer);
-       
+
        tipc_node_lock(l_ptr->owner);
        tipc_link_reset(l_ptr);
        tipc_node_detach_link(l_ptr->owner, l_ptr);
@@ -521,12 +521,12 @@ void tipc_link_start(struct link *l_ptr)
 }
 
 /**
- * link_schedule_port - schedule port for deferred sending 
+ * link_schedule_port - schedule port for deferred sending
  * @l_ptr: pointer to link
  * @origport: reference to sending port
  * @sz: amount of data to be sent
- * 
- * Schedules port for renewed sending of messages after link congestion 
+ *
+ * Schedules port for renewed sending of messages after link congestion
  * has abated.
  */
 
@@ -567,7 +567,7 @@ void tipc_link_wakeup_ports(struct link *l_ptr, int all)
                return;
        if (link_congested(l_ptr))
                goto exit;
-       list_for_each_entry_safe(p_ptr, temp_p_ptr, &l_ptr->waiting_ports, 
+       list_for_each_entry_safe(p_ptr, temp_p_ptr, &l_ptr->waiting_ports,
                                 wait_list) {
                if (win <= 0)
                        break;
@@ -584,7 +584,7 @@ exit:
        spin_unlock_bh(&tipc_port_list_lock);
 }
 
-/** 
+/**
  * link_release_outqueue - purge link's outbound message queue
  * @l_ptr: pointer to link
  */
@@ -621,7 +621,7 @@ void tipc_link_reset_fragments(struct link *l_ptr)
        l_ptr->defragm_buf = NULL;
 }
 
-/** 
+/**
  * tipc_link_stop - purge all inbound and outbound messages associated with link
  * @l_ptr: pointer to link
  */
@@ -665,7 +665,7 @@ static void link_send_event(void (*fcn)(u32 a, char *n, int up),
                            struct link *l_ptr, int up)
 {
        struct link_event *ev;
-       
+
        ev = kmalloc(sizeof(*ev), GFP_ATOMIC);
        if (!ev) {
                warn("Link event allocation failure\n");
@@ -690,15 +690,15 @@ void tipc_link_reset(struct link *l_ptr)
        u32 prev_state = l_ptr->state;
        u32 checkpoint = l_ptr->next_in_no;
        int was_active_link = tipc_link_is_active(l_ptr);
-       
+
        msg_set_session(l_ptr->pmsg, msg_session(l_ptr->pmsg) + 1);
 
-        /* Link is down, accept any session: */
+       /* Link is down, accept any session: */
        l_ptr->peer_session = 0;
 
-        /* Prepare for max packet size negotiation */
+       /* Prepare for max packet size negotiation */
        link_init_max_pkt(l_ptr);
-       
+
        l_ptr->state = RESET_UNKNOWN;
        dbg_link_state("Resetting Link\n");
 
@@ -770,7 +770,7 @@ static void link_activate(struct link *l_ptr)
 
 static void link_state_event(struct link *l_ptr, unsigned event)
 {
-       struct link *other; 
+       struct link *other;
        u32 cont_intv = l_ptr->continuity_interval;
 
        if (!l_ptr->started && (event != STARTING_EVT))
@@ -799,11 +799,11 @@ static void link_state_event(struct link *l_ptr, unsigned event)
                        if (l_ptr->next_in_no != l_ptr->checkpoint) {
                                l_ptr->checkpoint = l_ptr->next_in_no;
                                if (tipc_bclink_acks_missing(l_ptr->owner)) {
-                                       tipc_link_send_proto_msg(l_ptr, STATE_MSG, 
+                                       tipc_link_send_proto_msg(l_ptr, STATE_MSG,
                                                                 0, 0, 0, 0, 0);
                                        l_ptr->fsm_msg_cnt++;
                                } else if (l_ptr->max_pkt < l_ptr->max_pkt_target) {
-                                       tipc_link_send_proto_msg(l_ptr, STATE_MSG, 
+                                       tipc_link_send_proto_msg(l_ptr, STATE_MSG,
                                                                 1, 0, 0, 0, 0);
                                        l_ptr->fsm_msg_cnt++;
                                }
@@ -819,7 +819,7 @@ static void link_state_event(struct link *l_ptr, unsigned event)
                        break;
                case RESET_MSG:
                        dbg_link("RES -> RR\n");
-                       info("Resetting link <%s>, requested by peer\n", 
+                       info("Resetting link <%s>, requested by peer\n",
                             l_ptr->name);
                        tipc_link_reset(l_ptr);
                        l_ptr->state = RESET_RESET;
@@ -871,7 +871,7 @@ static void link_state_event(struct link *l_ptr, unsigned event)
                                dbg_link("Probing %u/%u,timer = %u ms)\n",
                                         l_ptr->fsm_msg_cnt, l_ptr->abort_limit,
                                         cont_intv / 4);
-                               tipc_link_send_proto_msg(l_ptr, STATE_MSG, 
+                               tipc_link_send_proto_msg(l_ptr, STATE_MSG,
                                                         1, 0, 0, 0, 0);
                                l_ptr->fsm_msg_cnt++;
                                link_set_timer(l_ptr, cont_intv / 4);
@@ -977,11 +977,11 @@ static void link_state_event(struct link *l_ptr, unsigned event)
 
 /*
  * link_bundle_buf(): Append contents of a buffer to
- * the tail of an existing one. 
+ * the tail of an existing one.
  */
 
 static int link_bundle_buf(struct link *l_ptr,
-                          struct sk_buff *bundler, 
+                          struct sk_buff *bundler,
                           struct sk_buff *buf)
 {
        struct tipc_msg *bundler_msg = buf_msg(bundler);
@@ -1030,8 +1030,8 @@ static void link_add_to_outqueue(struct link *l_ptr,
        l_ptr->out_queue_size++;
 }
 
-/* 
- * tipc_link_send_buf() is the 'full path' for messages, called from 
+/*
+ * tipc_link_send_buf() is the 'full path' for messages, called from
  * inside TIPC when the 'fast path' in tipc_send_buf
  * has failed, and from link_send()
  */
@@ -1074,7 +1074,7 @@ int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf)
        if (queue_size > l_ptr->stats.max_queue_sz)
                l_ptr->stats.max_queue_sz = queue_size;
 
-       if (likely(!tipc_bearer_congested(l_ptr->b_ptr, l_ptr) && 
+       if (likely(!tipc_bearer_congested(l_ptr->b_ptr, l_ptr) &&
                   !link_congested(l_ptr))) {
                link_add_to_outqueue(l_ptr, buf, msg);
 
@@ -1094,7 +1094,7 @@ int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf)
 
                /* Try adding message to an existing bundle */
 
-               if (l_ptr->next_out && 
+               if (l_ptr->next_out &&
                    link_bundle_buf(l_ptr, l_ptr->last_out, buf)) {
                        tipc_bearer_resolve_congestion(l_ptr->b_ptr, l_ptr);
                        return dsz;
@@ -1109,7 +1109,7 @@ int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf)
                        if (bundler) {
                                msg_init(&bundler_hdr, MSG_BUNDLER, OPEN_MSG,
                                         TIPC_OK, INT_H_SIZE, l_ptr->addr);
-                               memcpy(bundler->data, (unchar *)&bundler_hdr, 
+                               memcpy(bundler->data, (unchar *)&bundler_hdr,
                                       INT_H_SIZE);
                                skb_trim(bundler, INT_H_SIZE);
                                link_bundle_buf(l_ptr, bundler, buf);
@@ -1126,8 +1126,8 @@ int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf)
        return dsz;
 }
 
-/* 
- * tipc_link_send(): same as tipc_link_send_buf(), but the link to use has 
+/*
+ * tipc_link_send(): same as tipc_link_send_buf(), but the link to use has
  * not been selected yet, and the the owner node is not locked
  * Called by TIPC internal users, e.g. the name distributor
  */
@@ -1161,8 +1161,8 @@ int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector)
        return res;
 }
 
-/* 
- * link_send_buf_fast: Entry for data messages where the 
+/*
+ * link_send_buf_fast: Entry for data messages where the
  * destination link is known and the header is complete,
  * inclusive total message length. Very time critical.
  * Link is locked. Returns user data length.
@@ -1197,8 +1197,8 @@ static int link_send_buf_fast(struct link *l_ptr, struct sk_buff *buf,
        return tipc_link_send_buf(l_ptr, buf);  /* All other cases */
 }
 
-/* 
- * tipc_send_buf_fast: Entry for data messages where the 
+/*
+ * tipc_send_buf_fast: Entry for data messages where the
  * destination node is known and the header is complete,
  * inclusive total message length.
  * Returns user data length.
@@ -1236,15 +1236,15 @@ int tipc_send_buf_fast(struct sk_buff *buf, u32 destnode)
 }
 
 
-/* 
- * tipc_link_send_sections_fast: Entry for messages where the 
+/*
+ * tipc_link_send_sections_fast: Entry for messages where the
  * destination processor is known and the header is complete,
- * except for total message length. 
+ * except for total message length.
  * Returns user data length or errno.
  */
-int tipc_link_send_sections_fast(struct port *sender, 
+int tipc_link_send_sections_fast(struct port *sender,
                                 struct iovec const *msg_sect,
-                                const u32 num_sect, 
+                                const u32 num_sect,
                                 u32 destaddr)
 {
        struct tipc_msg *hdr = &sender->publ.phdr;
@@ -1287,14 +1287,14 @@ exit:
 
                        /* Exit if link (or bearer) is congested */
 
-                       if (link_congested(l_ptr) || 
+                       if (link_congested(l_ptr) ||
                            !list_empty(&l_ptr->b_ptr->cong_links)) {
                                res = link_schedule_port(l_ptr,
                                                         sender->publ.ref, res);
                                goto exit;
                        }
 
-                       /* 
+                       /*
                         * Message size exceeds max_pkt hint; update hint,
                         * then re-try fast path or fragment the message
                         */
@@ -1324,10 +1324,10 @@ exit:
        return res;
 }
 
-/* 
- * link_send_sections_long(): Entry for long messages where the 
+/*
+ * link_send_sections_long(): Entry for long messages where the
  * destination node is known and the header is complete,
- * inclusive total message length. 
+ * inclusive total message length.
  * Link and bearer congestion status have been checked to be ok,
  * and are ignored if they change.
  *
@@ -1357,9 +1357,9 @@ static int link_send_sections_long(struct port *sender,
 
 again:
        fragm_no = 1;
-       max_pkt = sender->max_pkt - INT_H_SIZE;  
+       max_pkt = sender->max_pkt - INT_H_SIZE;
                /* leave room for tunnel header in case of link changeover */
-       fragm_sz = max_pkt - INT_H_SIZE; 
+       fragm_sz = max_pkt - INT_H_SIZE;
                /* leave room for fragmentation header in each fragment */
        rest = dsz;
        fragm_crs = 0;
@@ -1440,7 +1440,7 @@ error:
                        if (!buf)
                                goto error;
 
-                       buf->next = NULL;                                
+                       buf->next = NULL;
                        prev->next = buf;
                        memcpy(buf->data, (unchar *)&fragm_hdr, INT_H_SIZE);
                        fragm_crs = INT_H_SIZE;
@@ -1450,7 +1450,7 @@ error:
        }
        while (rest > 0);
 
-       /* 
+       /*
         * Now we have a buffer chain. Select a link and check
         * that packet size is still OK
         */
@@ -1506,7 +1506,7 @@ reject:
        return dsz;
 }
 
-/* 
+/*
  * tipc_link_push_packet: Push one unsent packet to the media
  */
 u32 tipc_link_push_packet(struct link *l_ptr)
@@ -1519,7 +1519,7 @@ u32 tipc_link_push_packet(struct link *l_ptr)
        /* consider that buffers may have been released in meantime */
 
        if (r_q_size && buf) {
-               u32 last = lesser(mod(r_q_head + r_q_size), 
+               u32 last = lesser(mod(r_q_head + r_q_size),
                                  link_last_sent(l_ptr));
                u32 first = msg_seqno(buf_msg(buf));
 
@@ -1535,7 +1535,7 @@ u32 tipc_link_push_packet(struct link *l_ptr)
 
        if (r_q_size && buf && !skb_cloned(buf)) {
                msg_set_ack(buf_msg(buf), mod(l_ptr->next_in_no - 1));
-               msg_set_bcast_ack(buf_msg(buf), l_ptr->owner->bclink.last_in); 
+               msg_set_bcast_ack(buf_msg(buf), l_ptr->owner->bclink.last_in);
                if (tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr)) {
                        msg_dbg(buf_msg(buf), ">DEF-RETR>");
                        l_ptr->retransm_queue_head = mod(++r_q_head);
@@ -1554,7 +1554,7 @@ u32 tipc_link_push_packet(struct link *l_ptr)
        buf = l_ptr->proto_msg_queue;
        if (buf) {
                msg_set_ack(buf_msg(buf), mod(l_ptr->next_in_no - 1));
-               msg_set_bcast_ack(buf_msg(buf),l_ptr->owner->bclink.last_in); 
+               msg_set_bcast_ack(buf_msg(buf),l_ptr->owner->bclink.last_in);
                if (tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr)) {
                        msg_dbg(buf_msg(buf), ">DEF-PROT>");
                        l_ptr->unacked_window = 0;
@@ -1578,7 +1578,7 @@ u32 tipc_link_push_packet(struct link *l_ptr)
 
                if (mod(next - first) < l_ptr->queue_limit[0]) {
                        msg_set_ack(msg, mod(l_ptr->next_in_no - 1));
-                       msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); 
+                       msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in);
                        if (tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr)) {
                                if (msg_user(msg) == MSG_BUNDLER)
                                        msg_set_type(msg, CLOSED_MSG);
@@ -1629,12 +1629,12 @@ static void link_reset_all(unsigned long addr)
 
        tipc_node_lock(n_ptr);
 
-       warn("Resetting all links to %s\n", 
+       warn("Resetting all links to %s\n",
             addr_string_fill(addr_string, n_ptr->addr));
 
        for (i = 0; i < MAX_BEARERS; i++) {
                if (n_ptr->links[i]) {
-                       link_print(n_ptr->links[i], TIPC_OUTPUT, 
+                       link_print(n_ptr->links[i], TIPC_OUTPUT,
                                   "Resetting link\n");
                        tipc_link_reset(n_ptr->links[i]);
                }
@@ -1689,7 +1689,7 @@ static void link_retransmit_failure(struct link *l_ptr, struct sk_buff *buf)
        }
 }
 
-void tipc_link_retransmit(struct link *l_ptr, struct sk_buff *buf, 
+void tipc_link_retransmit(struct link *l_ptr, struct sk_buff *buf,
                          u32 retransmits)
 {
        struct tipc_msg *msg;
@@ -1698,7 +1698,7 @@ void tipc_link_retransmit(struct link *l_ptr, struct sk_buff *buf,
                return;
 
        msg = buf_msg(buf);
-       
+
        dbg("Retransmitting %u in link %x\n", retransmits, l_ptr);
 
        if (tipc_bearer_congested(l_ptr->b_ptr, l_ptr)) {
@@ -1728,7 +1728,7 @@ void tipc_link_retransmit(struct link *l_ptr, struct sk_buff *buf,
        while (retransmits && (buf != l_ptr->next_out) && buf && !skb_cloned(buf)) {
                msg = buf_msg(buf);
                msg_set_ack(msg, mod(l_ptr->next_in_no - 1));
-               msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); 
+               msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in);
                if (tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr)) {
                        msg_dbg(buf_msg(buf), ">RETR>");
                        buf = buf->next;
@@ -1746,7 +1746,7 @@ void tipc_link_retransmit(struct link *l_ptr, struct sk_buff *buf,
        l_ptr->retransm_queue_head = l_ptr->retransm_queue_size = 0;
 }
 
-/* 
+/*
  * link_recv_non_seq: Receive packets which are outside
  *                    the link sequence flow
  */
@@ -1761,11 +1761,11 @@ static void link_recv_non_seq(struct sk_buff *buf)
                tipc_bclink_recv_pkt(buf);
 }
 
-/** 
+/**
  * link_insert_deferred_queue - insert deferred messages back into receive chain
  */
 
-static struct sk_buff *link_insert_deferred_queue(struct link *l_ptr, 
+static struct sk_buff *link_insert_deferred_queue(struct link *l_ptr,
                                                  struct sk_buff *buf)
 {
        u32 seq_no;
@@ -1813,11 +1813,11 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *tb_ptr)
                        link_recv_non_seq(buf);
                        continue;
                }
-               
+
                if (unlikely(!msg_short(msg) &&
                             (msg_destnode(msg) != tipc_own_addr)))
                        goto cont;
-               
+
                n_ptr = tipc_node_find(msg_prevnode(msg));
                if (unlikely(!n_ptr))
                        goto cont;
@@ -1828,8 +1828,8 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *tb_ptr)
                        tipc_node_unlock(n_ptr);
                        goto cont;
                }
-               /* 
-                * Release acked messages 
+               /*
+                * Release acked messages
                 */
                if (less(n_ptr->bclink.acked, msg_bcast_ack(msg))) {
                        if (tipc_node_is_up(n_ptr) && n_ptr->bclink.supported)
@@ -1837,7 +1837,7 @@ void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *tb_ptr)
                }
 
                crs = l_ptr->first_out;
-               while ((crs != l_ptr->next_out) && 
+               while ((crs != l_ptr->next_out) &&
                       less_eq(msg_seqno(buf_msg(crs)), ackd)) {
                        struct sk_buff *next = crs->next;
 
@@ -1875,7 +1875,7 @@ deliver:
                                        switch (msg_user(msg)) {
                                        case MSG_BUNDLER:
                                                l_ptr->stats.recv_bundles++;
-                                               l_ptr->stats.recv_bundled += 
+                                               l_ptr->stats.recv_bundled +=
                                                        msg_msgcnt(msg);
                                                tipc_node_unlock(n_ptr);
                                                tipc_link_recv_bundle(buf);
@@ -1894,7 +1894,7 @@ deliver:
                                                continue;
                                        case MSG_FRAGMENTER:
                                                l_ptr->stats.recv_fragments++;
-                                               if (tipc_link_recv_fragment(&l_ptr->defragm_buf, 
+                                               if (tipc_link_recv_fragment(&l_ptr->defragm_buf,
                                                                            &buf, &msg)) {
                                                        l_ptr->stats.recv_fragmented++;
                                                        goto deliver;
@@ -1905,7 +1905,7 @@ deliver:
                                                if (link_recv_changeover_msg(&l_ptr, &buf)) {
                                                        msg = buf_msg(buf);
                                                        seq_no = msg_seqno(msg);
-                                                       TIPC_SKB_CB(buf)->handle 
+                                                       TIPC_SKB_CB(buf)->handle
                                                                = b_ptr;
                                                        if (type == ORIGINAL_MSG)
                                                                goto deliver;
@@ -1948,8 +1948,8 @@ cont:
        read_unlock_bh(&tipc_net_lock);
 }
 
-/* 
- * link_defer_buf(): Sort a received out-of-sequence packet 
+/*
+ * link_defer_buf(): Sort a received out-of-sequence packet
  *                   into the deferred reception queue.
  * Returns the increase of the queue length,i.e. 0 or 1
  */
@@ -1986,7 +1986,7 @@ u32 tipc_link_defer_pkt(struct sk_buff **head,
                        if (prev)
                                prev->next = buf;
                        else
-                               *head = buf;   
+                               *head = buf;
                        return 1;
                }
                if (seq_no == msg_seqno(msg)) {
@@ -2003,11 +2003,11 @@ u32 tipc_link_defer_pkt(struct sk_buff **head,
        return 0;
 }
 
-/** 
+/**
  * link_handle_out_of_seq_msg - handle arrival of out-of-sequence packet
  */
 
-static void link_handle_out_of_seq_msg(struct link *l_ptr, 
+static void link_handle_out_of_seq_msg(struct link *l_ptr,
                                       struct sk_buff *buf)
 {
        u32 seq_no = msg_seqno(buf_msg(buf));
@@ -2017,14 +2017,14 @@ static void link_handle_out_of_seq_msg(struct link *l_ptr,
                return;
        }
 
-       dbg("rx OOS msg: seq_no %u, expecting %u (%u)\n", 
+       dbg("rx OOS msg: seq_no %u, expecting %u (%u)\n",
            seq_no, mod(l_ptr->next_in_no), l_ptr->next_in_no);
 
        /* Record OOS packet arrival (force mismatch on next timeout) */
 
        l_ptr->checkpoint--;
 
-       /* 
+       /*
         * Discard packet if a duplicate; otherwise add it to deferred queue
         * and notify peer of gap as per protocol specification
         */
@@ -2053,13 +2053,13 @@ void tipc_link_send_proto_msg(struct link *l_ptr, u32 msg_typ, int probe_msg,
 {
        struct sk_buff *buf = NULL;
        struct tipc_msg *msg = l_ptr->pmsg;
-        u32 msg_size = sizeof(l_ptr->proto_msg);
+       u32 msg_size = sizeof(l_ptr->proto_msg);
 
        if (link_blocked(l_ptr))
                return;
        msg_set_type(msg, msg_typ);
        msg_set_net_plane(msg, l_ptr->b_ptr->net_plane);
-       msg_set_bcast_ack(msg, mod(l_ptr->owner->bclink.last_in)); 
+       msg_set_bcast_ack(msg, mod(l_ptr->owner->bclink.last_in));
        msg_set_last_bcast(msg, tipc_bclink_get_last_sent());
 
        if (msg_typ == STATE_MSG) {
@@ -2082,23 +2082,23 @@ void tipc_link_send_proto_msg(struct link *l_ptr, u32 msg_typ, int probe_msg,
                msg_set_max_pkt(msg, ack_mtu);
                msg_set_ack(msg, mod(l_ptr->next_in_no - 1));
                msg_set_probe(msg, probe_msg != 0);
-               if (probe_msg) { 
+               if (probe_msg) {
                        u32 mtu = l_ptr->max_pkt;
 
-                        if ((mtu < l_ptr->max_pkt_target) &&
+                       if ((mtu < l_ptr->max_pkt_target) &&
                            link_working_working(l_ptr) &&
                            l_ptr->fsm_msg_cnt) {
                                msg_size = (mtu + (l_ptr->max_pkt_target - mtu)/2 + 2) & ~3;
-                                if (l_ptr->max_pkt_probes == 10) {
-                                        l_ptr->max_pkt_target = (msg_size - 4);
-                                        l_ptr->max_pkt_probes = 0;
+                               if (l_ptr->max_pkt_probes == 10) {
+                                       l_ptr->max_pkt_target = (msg_size - 4);
+                                       l_ptr->max_pkt_probes = 0;
                                        msg_size = (mtu + (l_ptr->max_pkt_target - mtu)/2 + 2) & ~3;
-                                }
+                               }
                                l_ptr->max_pkt_probes++;
-                        }
+                       }
 
                        l_ptr->stats.sent_probes++;
-                }
+               }
                l_ptr->stats.sent_states++;
        } else {                /* RESET_MSG or ACTIVATE_MSG */
                msg_set_ack(msg, mod(l_ptr->reset_checkpoint - 1));
@@ -2144,7 +2144,7 @@ void tipc_link_send_proto_msg(struct link *l_ptr, u32 msg_typ, int probe_msg,
                return;
 
        memcpy(buf->data, (unchar *)msg, sizeof(l_ptr->proto_msg));
-        msg_set_size(buf_msg(buf), msg_size);
+       msg_set_size(buf_msg(buf), msg_size);
 
        if (tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr)) {
                l_ptr->unacked_window = 0;
@@ -2160,15 +2160,15 @@ void tipc_link_send_proto_msg(struct link *l_ptr, u32 msg_typ, int probe_msg,
 
 /*
  * Receive protocol message :
- * Note that network plane id propagates through the network, and may 
- * change at any time. The node with lowest address rules    
+ * Note that network plane id propagates through the network, and may
+ * change at any time. The node with lowest address rules
  */
 
 static void link_recv_proto_msg(struct link *l_ptr, struct sk_buff *buf)
 {
        u32 rec_gap = 0;
        u32 max_pkt_info;
-        u32 max_pkt_ack;
+       u32 max_pkt_ack;
        u32 msg_tol;
        struct tipc_msg *msg = buf_msg(buf);
 
@@ -2188,12 +2188,12 @@ static void link_recv_proto_msg(struct link *l_ptr, struct sk_buff *buf)
        l_ptr->owner->permit_changeover = msg_redundant_link(msg);
 
        switch (msg_type(msg)) {
-       
+
        case RESET_MSG:
                if (!link_working_unknown(l_ptr) && l_ptr->peer_session) {
                        if (msg_session(msg) == l_ptr->peer_session) {
                                dbg("Duplicate RESET: %u<->%u\n",
-                                   msg_session(msg), l_ptr->peer_session);                                     
+                                   msg_session(msg), l_ptr->peer_session);
                                break; /* duplicate: ignore */
                        }
                }
@@ -2211,13 +2211,13 @@ static void link_recv_proto_msg(struct link *l_ptr, struct sk_buff *buf)
                        l_ptr->priority = msg_linkprio(msg);
 
                max_pkt_info = msg_max_pkt(msg);
-                if (max_pkt_info) {
+               if (max_pkt_info) {
                        if (max_pkt_info < l_ptr->max_pkt_target)
                                l_ptr->max_pkt_target = max_pkt_info;
                        if (l_ptr->max_pkt > l_ptr->max_pkt_target)
                                l_ptr->max_pkt = l_ptr->max_pkt_target;
                } else {
-                        l_ptr->max_pkt = l_ptr->max_pkt_target;
+                       l_ptr->max_pkt = l_ptr->max_pkt_target;
                }
                l_ptr->owner->bclink.supported = (max_pkt_info != 0);
 
@@ -2235,8 +2235,8 @@ static void link_recv_proto_msg(struct link *l_ptr, struct sk_buff *buf)
 
                if ((msg_tol = msg_link_tolerance(msg)))
                        link_set_supervision_props(l_ptr, msg_tol);
-               
-               if (msg_linkprio(msg) && 
+
+               if (msg_linkprio(msg) &&
                    (msg_linkprio(msg) != l_ptr->priority)) {
                        warn("Resetting link <%s>, priority change %u->%u\n",
                             l_ptr->name, l_ptr->priority, msg_linkprio(msg));
@@ -2250,25 +2250,25 @@ static void link_recv_proto_msg(struct link *l_ptr, struct sk_buff *buf)
                        break;
 
                if (less_eq(mod(l_ptr->next_in_no), msg_next_sent(msg))) {
-                       rec_gap = mod(msg_next_sent(msg) - 
+                       rec_gap = mod(msg_next_sent(msg) -
                                      mod(l_ptr->next_in_no));
                }
 
                max_pkt_ack = msg_max_pkt(msg);
-                if (max_pkt_ack > l_ptr->max_pkt) {
-                        dbg("Link <%s> updated MTU %u -> %u\n",
-                            l_ptr->name, l_ptr->max_pkt, max_pkt_ack);
-                        l_ptr->max_pkt = max_pkt_ack;
-                        l_ptr->max_pkt_probes = 0;
-                }
+               if (max_pkt_ack > l_ptr->max_pkt) {
+                       dbg("Link <%s> updated MTU %u -> %u\n",
+                           l_ptr->name, l_ptr->max_pkt, max_pkt_ack);
+                       l_ptr->max_pkt = max_pkt_ack;
+                       l_ptr->max_pkt_probes = 0;
+               }
 
                max_pkt_ack = 0;
-                if (msg_probe(msg)) {
+               if (msg_probe(msg)) {
                        l_ptr->stats.recv_probes++;
-                        if (msg_size(msg) > sizeof(l_ptr->proto_msg)) {
-                                max_pkt_ack = msg_size(msg);
-                        }
-                }
+                       if (msg_size(msg) > sizeof(l_ptr->proto_msg)) {
+                               max_pkt_ack = msg_size(msg);
+                       }
+               }
 
                /* Protocol message before retransmits, reduce loss risk */
 
@@ -2294,11 +2294,11 @@ exit:
 
 
 /*
- * tipc_link_tunnel(): Send one message via a link belonging to 
+ * tipc_link_tunnel(): Send one message via a link belonging to
  * another bearer. Owner node is locked.
  */
-void tipc_link_tunnel(struct link *l_ptr, 
-                     struct tipc_msg *tunnel_hdr, 
+void tipc_link_tunnel(struct link *l_ptr,
+                     struct tipc_msg *tunnel_hdr,
                      struct tipc_msg  *msg,
                      u32 selector)
 {
@@ -2374,7 +2374,7 @@ void tipc_link_changeover(struct link *l_ptr)
                return;
        }
 
-       split_bundles = (l_ptr->owner->active_links[0] != 
+       split_bundles = (l_ptr->owner->active_links[0] !=
                         l_ptr->owner->active_links[1]);
 
        while (crs) {
@@ -2418,7 +2418,7 @@ void tipc_link_send_duplicate(struct link *l_ptr, struct link *tunnel)
                if (msg_user(msg) == MSG_BUNDLER)
                        msg_set_type(msg, CLOSED_MSG);
                msg_set_ack(msg, mod(l_ptr->next_in_no - 1));   /* Update */
-               msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); 
+               msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in);
                msg_set_size(&tunnel_hdr, length + INT_H_SIZE);
                outbuf = buf_acquire(length + INT_H_SIZE);
                if (outbuf == NULL) {
@@ -2445,7 +2445,7 @@ void tipc_link_send_duplicate(struct link *l_ptr, struct link *tunnel)
  * @skb: encapsulating message buffer
  * @from_pos: offset to extract from
  *
- * Returns a new message buffer containing an embedded message.  The 
+ * Returns a new message buffer containing an embedded message.  The
  * encapsulating message itself is left unchanged.
  */
 
@@ -2461,7 +2461,7 @@ static struct sk_buff *buf_extract(struct sk_buff *skb, u32 from_pos)
        return eb;
 }
 
-/* 
+/*
  *  link_recv_changeover_msg(): Receive tunneled packet sent
  *  via other link. Node is locked. Return extracted buffer.
  */
@@ -2482,7 +2482,7 @@ static int link_recv_changeover_msg(struct link **l_ptr,
                goto exit;
        }
        if (dest_link == *l_ptr) {
-               err("Unexpected changeover message on link <%s>\n", 
+               err("Unexpected changeover message on link <%s>\n",
                    (*l_ptr)->name);
                goto exit;
        }
@@ -2582,9 +2582,9 @@ void tipc_link_recv_bundle(struct sk_buff *buf)
  */
 
 
-/* 
+/*
  * tipc_link_send_long_buf: Entry for buffers needing fragmentation.
- * The buffer is complete, inclusive total message length. 
+ * The buffer is complete, inclusive total message length.
  * Returns user data length.
  */
 int tipc_link_send_long_buf(struct link *l_ptr, struct sk_buff *buf)
@@ -2650,9 +2650,9 @@ exit:
        return dsz;
 }
 
-/* 
- * A pending message being re-assembled must store certain values 
- * to handle subsequent fragments correctly. The following functions 
+/*
+ * A pending message being re-assembled must store certain values
+ * to handle subsequent fragments correctly. The following functions
  * help storing these values in unused, available fields in the
  * pending message. This makes dynamic memory allocation unecessary.
  */
@@ -2692,11 +2692,11 @@ static void incr_timer_cnt(struct sk_buff *buf)
        msg_incr_reroute_cnt(buf_msg(buf));
 }
 
-/* 
- * tipc_link_recv_fragment(): Called with node lock on. Returns 
+/*
+ * tipc_link_recv_fragment(): Called with node lock on. Returns
  * the reassembled buffer if message is complete.
  */
-int tipc_link_recv_fragment(struct sk_buff **pending, struct sk_buff **fb, 
+int tipc_link_recv_fragment(struct sk_buff **pending, struct sk_buff **fb,
                            struct tipc_msg **m)
 {
        struct sk_buff *prev = NULL;
@@ -2737,9 +2737,9 @@ int tipc_link_recv_fragment(struct sk_buff **pending, struct sk_buff **fb,
 
                        /*  Prepare buffer for subsequent fragments. */
 
-                       set_long_msg_seqno(pbuf, long_msg_seq_no); 
-                       set_fragm_size(pbuf,fragm_sz); 
-                       set_expected_frags(pbuf,exp_fragm_cnt - 1); 
+                       set_long_msg_seqno(pbuf, long_msg_seq_no);
+                       set_fragm_size(pbuf,fragm_sz);
+                       set_expected_frags(pbuf,exp_fragm_cnt - 1);
                } else {
                        warn("Link unable to reassemble fragmented message\n");
                }
@@ -2765,7 +2765,7 @@ int tipc_link_recv_fragment(struct sk_buff **pending, struct sk_buff **fb,
                        *m = buf_msg(pbuf);
                        return 1;
                }
-               set_expected_frags(pbuf,exp_frags);     
+               set_expected_frags(pbuf,exp_frags);
                return 0;
        }
        dbg(" Discarding orphan fragment %x\n",fbuf);
@@ -2849,10 +2849,10 @@ void tipc_link_set_queue_limits(struct link *l_ptr, u32 window)
  * link_find_link - locate link by name
  * @name - ptr to link name string
  * @node - ptr to area to be filled with ptr to associated node
- * 
+ *
  * Caller must hold 'tipc_net_lock' to ensure node and bearer are not deleted;
  * this also prevents link deletion.
- * 
+ *
  * Returns pointer to link (or 0 if invalid link name).
  */
 
@@ -2860,7 +2860,7 @@ static struct link *link_find_link(const char *name, struct node **node)
 {
        struct link_name link_name_parts;
        struct bearer *b_ptr;
-       struct link *l_ptr; 
+       struct link *l_ptr;
 
        if (!link_name_validate(name, &link_name_parts))
                return NULL;
@@ -2869,7 +2869,7 @@ static struct link *link_find_link(const char *name, struct node **node)
        if (!b_ptr)
                return NULL;
 
-       *node = tipc_node_find(link_name_parts.addr_peer); 
+       *node = tipc_node_find(link_name_parts.addr_peer);
        if (!*node)
                return NULL;
 
@@ -2880,14 +2880,14 @@ static struct link *link_find_link(const char *name, struct node **node)
        return l_ptr;
 }
 
-struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space, 
+struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space,
                                     u16 cmd)
 {
        struct tipc_link_config *args;
-        u32 new_value;
+       u32 new_value;
        struct link *l_ptr;
        struct node *node;
-        int res;
+       int res;
 
        if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_LINK_CONFIG))
                return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);
@@ -2899,40 +2899,40 @@ struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space
                if ((cmd == TIPC_CMD_SET_LINK_WINDOW) &&
                    (tipc_bclink_set_queue_limits(new_value) == 0))
                        return tipc_cfg_reply_none();
-               return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED
+               return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED
                                                   " (cannot change setting on broadcast link)");
        }
 
        read_lock_bh(&tipc_net_lock);
-       l_ptr = link_find_link(args->name, &node); 
+       l_ptr = link_find_link(args->name, &node);
        if (!l_ptr) {
                read_unlock_bh(&tipc_net_lock);
-               return tipc_cfg_reply_error_string("link not found");
+               return tipc_cfg_reply_error_string("link not found");
        }
 
        tipc_node_lock(node);
        res = -EINVAL;
        switch (cmd) {
-       case TIPC_CMD_SET_LINK_TOL: 
-               if ((new_value >= TIPC_MIN_LINK_TOL) && 
+       case TIPC_CMD_SET_LINK_TOL:
+               if ((new_value >= TIPC_MIN_LINK_TOL) &&
                    (new_value <= TIPC_MAX_LINK_TOL)) {
                        link_set_supervision_props(l_ptr, new_value);
-                       tipc_link_send_proto_msg(l_ptr, STATE_MSG, 
+                       tipc_link_send_proto_msg(l_ptr, STATE_MSG,
                                                 0, 0, new_value, 0, 0);
                        res = TIPC_OK;
                }
                break;
-       case TIPC_CMD_SET_LINK_PRI: 
+       case TIPC_CMD_SET_LINK_PRI:
                if ((new_value >= TIPC_MIN_LINK_PRI) &&
                    (new_value <= TIPC_MAX_LINK_PRI)) {
                        l_ptr->priority = new_value;
-                       tipc_link_send_proto_msg(l_ptr, STATE_MSG, 
+                       tipc_link_send_proto_msg(l_ptr, STATE_MSG,
                                                 0, 0, 0, new_value, 0);
                        res = TIPC_OK;
                }
                break;
-       case TIPC_CMD_SET_LINK_WINDOW: 
-               if ((new_value >= TIPC_MIN_LINK_WIN) && 
+       case TIPC_CMD_SET_LINK_WINDOW:
+               if ((new_value >= TIPC_MIN_LINK_WIN) &&
                    (new_value <= TIPC_MAX_LINK_WIN)) {
                        tipc_link_set_queue_limits(l_ptr, new_value);
                        res = TIPC_OK;
@@ -2943,7 +2943,7 @@ struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space
 
        read_unlock_bh(&tipc_net_lock);
        if (res)
-               return tipc_cfg_reply_error_string("cannot change link setting");
+               return tipc_cfg_reply_error_string("cannot change link setting");
 
        return tipc_cfg_reply_none();
 }
@@ -2963,7 +2963,7 @@ static void link_reset_statistics(struct link *l_ptr)
 struct sk_buff *tipc_link_cmd_reset_stats(const void *req_tlv_area, int req_tlv_space)
 {
        char *link_name;
-       struct link *l_ptr; 
+       struct link *l_ptr;
        struct node *node;
 
        if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_LINK_NAME))
@@ -2977,7 +2977,7 @@ struct sk_buff *tipc_link_cmd_reset_stats(const void *req_tlv_area, int req_tlv_
        }
 
        read_lock_bh(&tipc_net_lock);
-       l_ptr = link_find_link(link_name, &node); 
+       l_ptr = link_find_link(link_name, &node);
        if (!l_ptr) {
                read_unlock_bh(&tipc_net_lock);
                return tipc_cfg_reply_error_string("link not found");
@@ -3004,14 +3004,14 @@ static u32 percent(u32 count, u32 total)
  * @name: link name
  * @buf: print buffer area
  * @buf_size: size of print buffer area
- * 
+ *
  * Returns length of print buffer data string (or 0 if error)
  */
 
 static int tipc_link_stats(const char *name, char *buf, const u32 buf_size)
 {
        struct print_buf pb;
-       struct link *l_ptr; 
+       struct link *l_ptr;
        struct node *node;
        char *status;
        u32 profile_total = 0;
@@ -3022,7 +3022,7 @@ static int tipc_link_stats(const char *name, char *buf, const u32 buf_size)
        tipc_printbuf_init(&pb, buf, buf_size);
 
        read_lock_bh(&tipc_net_lock);
-       l_ptr = link_find_link(name, &node); 
+       l_ptr = link_find_link(name, &node);
        if (!l_ptr) {
                read_unlock_bh(&tipc_net_lock);
                return 0;
@@ -3036,28 +3036,28 @@ static int tipc_link_stats(const char *name, char *buf, const u32 buf_size)
        else
                status = "DEFUNCT";
        tipc_printf(&pb, "Link <%s>\n"
-                        "  %s  MTU:%u  Priority:%u  Tolerance:%u ms"
-                        "  Window:%u packets\n", 
-                   l_ptr->name, status, link_max_pkt(l_ptr), 
+                        "  %s  MTU:%u  Priority:%u  Tolerance:%u ms"
+                        "  Window:%u packets\n",
+                   l_ptr->name, status, link_max_pkt(l_ptr),
                    l_ptr->priority, l_ptr->tolerance, l_ptr->queue_limit[0]);
-       tipc_printf(&pb, "  RX packets:%u fragments:%u/%u bundles:%u/%u\n", 
+       tipc_printf(&pb, "  RX packets:%u fragments:%u/%u bundles:%u/%u\n",
                    l_ptr->next_in_no - l_ptr->stats.recv_info,
                    l_ptr->stats.recv_fragments,
                    l_ptr->stats.recv_fragmented,
                    l_ptr->stats.recv_bundles,
                    l_ptr->stats.recv_bundled);
-       tipc_printf(&pb, "  TX packets:%u fragments:%u/%u bundles:%u/%u\n", 
+       tipc_printf(&pb, "  TX packets:%u fragments:%u/%u bundles:%u/%u\n",
                    l_ptr->next_out_no - l_ptr->stats.sent_info,
                    l_ptr->stats.sent_fragments,
-                   l_ptr->stats.sent_fragmented, 
+                   l_ptr->stats.sent_fragmented,
                    l_ptr->stats.sent_bundles,
                    l_ptr->stats.sent_bundled);
        profile_total = l_ptr->stats.msg_length_counts;
        if (!profile_total)
                profile_total = 1;
        tipc_printf(&pb, "  TX profile sample:%u packets  average:%u octets\n"
-                        "  0-64:%u%% -256:%u%% -1024:%u%% -4096:%u%% "
-                        "-16354:%u%% -32768:%u%% -66000:%u%%\n",
+                        "  0-64:%u%% -256:%u%% -1024:%u%% -4096:%u%% "
+                        "-16354:%u%% -32768:%u%% -66000:%u%%\n",
                    l_ptr->stats.msg_length_counts,
                    l_ptr->stats.msg_lengths_total / profile_total,
                    percent(l_ptr->stats.msg_length_profile[0], profile_total),
@@ -3067,21 +3067,21 @@ static int tipc_link_stats(const char *name, char *buf, const u32 buf_size)
                    percent(l_ptr->stats.msg_length_profile[4], profile_total),
                    percent(l_ptr->stats.msg_length_profile[5], profile_total),
                    percent(l_ptr->stats.msg_length_profile[6], profile_total));
-       tipc_printf(&pb, "  RX states:%u probes:%u naks:%u defs:%u dups:%u\n", 
+       tipc_printf(&pb, "  RX states:%u probes:%u naks:%u defs:%u dups:%u\n",
                    l_ptr->stats.recv_states,
                    l_ptr->stats.recv_probes,
                    l_ptr->stats.recv_nacks,
-                   l_ptr->stats.deferred_recv, 
+                   l_ptr->stats.deferred_recv,
                    l_ptr->stats.duplicates);
-       tipc_printf(&pb, "  TX states:%u probes:%u naks:%u acks:%u dups:%u\n", 
-                   l_ptr->stats.sent_states, 
-                   l_ptr->stats.sent_probes, 
-                   l_ptr->stats.sent_nacks, 
-                   l_ptr->stats.sent_acks, 
+       tipc_printf(&pb, "  TX states:%u probes:%u naks:%u acks:%u dups:%u\n",
+                   l_ptr->stats.sent_states,
+                   l_ptr->stats.sent_probes,
+                   l_ptr->stats.sent_nacks,
+                   l_ptr->stats.sent_acks,
                    l_ptr->stats.retransmitted);
        tipc_printf(&pb, "  Congestion bearer:%u link:%u  Send queue max:%u avg:%u\n",
                    l_ptr->stats.bearer_congs,
-                   l_ptr->stats.link_congs, 
+                   l_ptr->stats.link_congs,
                    l_ptr->stats.max_queue_sz,
                    l_ptr->stats.queue_sz_counts
                    ? (l_ptr->stats.accu_queue_sz / l_ptr->stats.queue_sz_counts)
@@ -3113,7 +3113,7 @@ struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area, int req_tlv_s
                                  (char *)TLV_DATA(rep_tlv), MAX_LINK_STATS_INFO);
        if (!str_len) {
                buf_discard(buf);
-               return tipc_cfg_reply_error_string("link not found");
+               return tipc_cfg_reply_error_string("link not found");
        }
 
        skb_put(buf, TLV_SPACE(str_len));
@@ -3164,7 +3164,7 @@ int link_control(const char *name, u32 op, u32 val)
  * tipc_link_get_max_pkt - get maximum packet size to use when sending to destination
  * @dest: network address of destination node
  * @selector: used to select from set of active links
- * 
+ *
  * If no active link can be found, uses default maximum packet size.
  */
 
@@ -3173,11 +3173,11 @@ u32 tipc_link_get_max_pkt(u32 dest, u32 selector)
        struct node *n_ptr;
        struct link *l_ptr;
        u32 res = MAX_PKT_DEFAULT;
-       
+
        if (dest == tipc_own_addr)
                return MAX_MSG_SIZE;
 
-       read_lock_bh(&tipc_net_lock);        
+       read_lock_bh(&tipc_net_lock);
        n_ptr = tipc_node_select(dest, selector);
        if (n_ptr) {
                tipc_node_lock(n_ptr);
@@ -3186,7 +3186,7 @@ u32 tipc_link_get_max_pkt(u32 dest, u32 selector)
                        res = link_max_pkt(l_ptr);
                tipc_node_unlock(n_ptr);
        }
-       read_unlock_bh(&tipc_net_lock);       
+       read_unlock_bh(&tipc_net_lock);
        return res;
 }
 
@@ -3244,8 +3244,8 @@ static void link_print(struct link *l_ptr, struct print_buf *buf,
                tipc_printf(buf, "%u]",
                            msg_seqno(buf_msg
                                      (l_ptr->last_out)), l_ptr->out_queue_size);
-               if ((mod(msg_seqno(buf_msg(l_ptr->last_out)) - 
-                        msg_seqno(buf_msg(l_ptr->first_out))) 
+               if ((mod(msg_seqno(buf_msg(l_ptr->last_out)) -
+                        msg_seqno(buf_msg(l_ptr->first_out)))
                     != (l_ptr->out_queue_size - 1))
                    || (l_ptr->last_out->next != 0)) {
                        tipc_printf(buf, "\nSend queue inconsistency\n");
index 2d3c157f707d179e8961dceb6b36fa104e38d4f4..52f3e7c1871fbee83a5d84a78387fbca00cc60e7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/link.h: Include file for TIPC link code
- * 
+ *
  * Copyright (c) 1995-2006, Ericsson AB
  * Copyright (c) 2004-2005, Wind River Systems
  * All rights reserved.
@@ -45,8 +45,8 @@
 #define PUSH_FAILED   1
 #define PUSH_FINISHED 2
 
-/* 
- * Link states 
+/*
+ * Link states
  */
 
 #define WORKING_WORKING 560810u
@@ -54,7 +54,7 @@
 #define RESET_UNKNOWN   560812u
 #define RESET_RESET     560813u
 
-/* 
+/*
  * Starting value for maximum packet size negotiation on unicast links
  * (unless bearer MTU is less)
  */
@@ -74,7 +74,7 @@
  * @peer_session: link session # being used by peer end of link
  * @peer_bearer_id: bearer id used by link's peer endpoint
  * @b_ptr: pointer to bearer used by link
- * @tolerance: minimum link continuity loss needed to reset link [in ms] 
+ * @tolerance: minimum link continuity loss needed to reset link [in ms]
  * @continuity_interval: link continuity testing interval [in ms]
  * @abort_limit: # of unacknowledged continuity probes needed to reset link
  * @state: current state of link FSM
  * @stats: collects statistics regarding link activity
  * @print_buf: print buffer used to log link activity
  */
+
 struct link {
        u32 addr;
        char name[TIPC_MAX_LINK_NAME];
@@ -143,18 +143,18 @@ struct link {
        u32 exp_msg_count;
        u32 reset_checkpoint;
 
-        /* Max packet negotiation */
-        u32 max_pkt;
-        u32 max_pkt_target;
-        u32 max_pkt_probes;
+       /* Max packet negotiation */
+       u32 max_pkt;
+       u32 max_pkt_target;
+       u32 max_pkt_probes;
 
        /* Sending */
        u32 out_queue_size;
        struct sk_buff *first_out;
        struct sk_buff *last_out;
        u32 next_out_no;
-        u32 last_retransmitted;
-        u32 stale_count;
+       u32 last_retransmitted;
+       u32 stale_count;
 
        /* Reception */
        u32 next_in_no;
@@ -174,7 +174,7 @@ struct link {
        u32 long_msg_seq_no;
        struct sk_buff *defragm_buf;
 
-        /* Statistics */
+       /* Statistics */
        struct {
                u32 sent_info;          /* used in counting # sent packets */
                u32 recv_info;          /* used in counting # recv'd packets */
@@ -239,9 +239,9 @@ void tipc_link_reset(struct link *l_ptr);
 int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector);
 int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf);
 u32 tipc_link_get_max_pkt(u32 dest,u32 selector);
-int tipc_link_send_sections_fast(struct port* sender, 
+int tipc_link_send_sections_fast(struct port* sender,
                                 struct iovec const *msg_sect,
-                                const u32 num_sect, 
+                                const u32 num_sect,
                                 u32 destnode);
 int tipc_link_send_long_buf(struct link *l_ptr, struct sk_buff *buf);
 void tipc_link_tunnel(struct link *l_ptr, struct tipc_msg *tnl_hdr,
@@ -250,7 +250,7 @@ void tipc_link_recv_bundle(struct sk_buff *buf);
 int  tipc_link_recv_fragment(struct sk_buff **pending,
                             struct sk_buff **fb,
                             struct tipc_msg **msg);
-void tipc_link_send_proto_msg(struct link *l_ptr, u32 msg_typ, int prob, u32 gap, 
+void tipc_link_send_proto_msg(struct link *l_ptr, u32 msg_typ, int prob, u32 gap,
                              u32 tolerance, u32 priority, u32 acked_mtu);
 void tipc_link_push_queue(struct link *l_ptr);
 u32 tipc_link_defer_pkt(struct sk_buff **head, struct sk_buff **tail,
index 3bd345a344e52eae9a5bb783f60219eefc4f440d..782485468fb2a1445a29317643ee66b617fe5099 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/msg.c: TIPC message header routines
- *     
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
index 6699aaf7bd4cdefa305ef8eb95d19fc5ed987241..62d5490636044e41bddb4834aec81dd563bc61de 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/msg.h: Include file for TIPC message header routines
- * 
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
 
 /*
                TIPC user data message header format, version 2
-               
+
        - Fundamental definitions available to privileged TIPC users
          are located in tipc_msg.h.
-       - Remaining definitions available to TIPC internal users appear below. 
+       - Remaining definitions available to TIPC internal users appear below.
 */
 
 
@@ -75,7 +75,7 @@ static inline void msg_set_bits(struct tipc_msg *m, u32 w,
        msg_set_word(m, w, (word |= (val << pos)));
 }
 
-/* 
+/*
  * Word 0
  */
 
@@ -84,7 +84,7 @@ static inline u32 msg_version(struct tipc_msg *m)
        return msg_bits(m, 0, 29, 7);
 }
 
-static inline void msg_set_version(struct tipc_msg *m) 
+static inline void msg_set_version(struct tipc_msg *m)
 {
        msg_set_bits(m, 0, 29, 0xf, TIPC_VERSION);
 }
@@ -99,47 +99,47 @@ static inline u32 msg_isdata(struct tipc_msg *m)
        return (msg_user(m) <= DATA_CRITICAL);
 }
 
-static inline void msg_set_user(struct tipc_msg *m, u32 n) 
+static inline void msg_set_user(struct tipc_msg *m, u32 n)
 {
        msg_set_bits(m, 0, 25, 0xf, n);
 }
 
-static inline void msg_set_importance(struct tipc_msg *m, u32 i) 
+static inline void msg_set_importance(struct tipc_msg *m, u32 i)
 {
        msg_set_user(m, i);
 }
 
-static inline void msg_set_hdr_sz(struct tipc_msg *m,u32 n) 
+static inline void msg_set_hdr_sz(struct tipc_msg *m,u32 n)
 {
        msg_set_bits(m, 0, 21, 0xf, n>>2);
 }
 
-static inline int msg_non_seq(struct tipc_msg *m) 
+static inline int msg_non_seq(struct tipc_msg *m)
 {
        return msg_bits(m, 0, 20, 1);
 }
 
-static inline void msg_set_non_seq(struct tipc_msg *m) 
+static inline void msg_set_non_seq(struct tipc_msg *m)
 {
        msg_set_bits(m, 0, 20, 1, 1);
 }
 
-static inline int msg_dest_droppable(struct tipc_msg *m) 
+static inline int msg_dest_droppable(struct tipc_msg *m)
 {
        return msg_bits(m, 0, 19, 1);
 }
 
-static inline void msg_set_dest_droppable(struct tipc_msg *m, u32 d) 
+static inline void msg_set_dest_droppable(struct tipc_msg *m, u32 d)
 {
        msg_set_bits(m, 0, 19, 1, d);
 }
 
-static inline int msg_src_droppable(struct tipc_msg *m) 
+static inline int msg_src_droppable(struct tipc_msg *m)
 {
        return msg_bits(m, 0, 18, 1);
 }
 
-static inline void msg_set_src_droppable(struct tipc_msg *m, u32 d) 
+static inline void msg_set_src_droppable(struct tipc_msg *m, u32 d)
 {
        msg_set_bits(m, 0, 18, 1, d);
 }
@@ -150,31 +150,31 @@ static inline void msg_set_size(struct tipc_msg *m, u32 sz)
 }
 
 
-/* 
+/*
  * Word 1
  */
 
-static inline void msg_set_type(struct tipc_msg *m, u32 n) 
+static inline void msg_set_type(struct tipc_msg *m, u32 n)
 {
        msg_set_bits(m, 1, 29, 0x7, n);
 }
 
-static inline void msg_set_errcode(struct tipc_msg *m, u32 err) 
+static inline void msg_set_errcode(struct tipc_msg *m, u32 err)
 {
        msg_set_bits(m, 1, 25, 0xf, err);
 }
 
-static inline u32 msg_reroute_cnt(struct tipc_msg *m) 
+static inline u32 msg_reroute_cnt(struct tipc_msg *m)
 {
        return msg_bits(m, 1, 21, 0xf);
 }
 
-static inline void msg_incr_reroute_cnt(struct tipc_msg *m) 
+static inline void msg_incr_reroute_cnt(struct tipc_msg *m)
 {
        msg_set_bits(m, 1, 21, 0xf, msg_reroute_cnt(m) + 1);
 }
 
-static inline void msg_reset_reroute_cnt(struct tipc_msg *m) 
+static inline void msg_reset_reroute_cnt(struct tipc_msg *m)
 {
        msg_set_bits(m, 1, 21, 0xf, 0);
 }
@@ -184,12 +184,12 @@ static inline u32 msg_lookup_scope(struct tipc_msg *m)
        return msg_bits(m, 1, 19, 0x3);
 }
 
-static inline void msg_set_lookup_scope(struct tipc_msg *m, u32 n) 
+static inline void msg_set_lookup_scope(struct tipc_msg *m, u32 n)
 {
        msg_set_bits(m, 1, 19, 0x3, n);
 }
 
-static inline void msg_set_options(struct tipc_msg *m, const char *opt, u32 sz) 
+static inline void msg_set_options(struct tipc_msg *m, const char *opt, u32 sz)
 {
        u32 hsz = msg_hdr_sz(m);
        char *to = (char *)&m->hdr[hsz/4];
@@ -206,13 +206,13 @@ static inline u32 msg_bcast_ack(struct tipc_msg *m)
        return msg_bits(m, 1, 0, 0xffff);
 }
 
-static inline void msg_set_bcast_ack(struct tipc_msg *m, u32 n) 
+static inline void msg_set_bcast_ack(struct tipc_msg *m, u32 n)
 {
        msg_set_bits(m, 1, 0, 0xffff, n);
 }
 
 
-/* 
+/*
  * Word 2
  */
 
@@ -221,7 +221,7 @@ static inline u32 msg_ack(struct tipc_msg *m)
        return msg_bits(m, 2, 16, 0xffff);
 }
 
-static inline void msg_set_ack(struct tipc_msg *m, u32 n) 
+static inline void msg_set_ack(struct tipc_msg *m, u32 n)
 {
        msg_set_bits(m, 2, 16, 0xffff, n);
 }
@@ -231,48 +231,48 @@ static inline u32 msg_seqno(struct tipc_msg *m)
        return msg_bits(m, 2, 0, 0xffff);
 }
 
-static inline void msg_set_seqno(struct tipc_msg *m, u32 n) 
+static inline void msg_set_seqno(struct tipc_msg *m, u32 n)
 {
        msg_set_bits(m, 2, 0, 0xffff, n);
 }
 
 
-/* 
+/*
  * Words 3-10
  */
 
 
-static inline void msg_set_prevnode(struct tipc_msg *m, u32 a) 
+static inline void msg_set_prevnode(struct tipc_msg *m, u32 a)
 {
        msg_set_word(m, 3, a);
 }
 
-static inline void msg_set_origport(struct tipc_msg *m, u32 p) 
+static inline void msg_set_origport(struct tipc_msg *m, u32 p)
 {
        msg_set_word(m, 4, p);
 }
 
-static inline void msg_set_destport(struct tipc_msg *m, u32 p) 
+static inline void msg_set_destport(struct tipc_msg *m, u32 p)
 {
        msg_set_word(m, 5, p);
 }
 
-static inline void msg_set_mc_netid(struct tipc_msg *m, u32 p) 
+static inline void msg_set_mc_netid(struct tipc_msg *m, u32 p)
 {
        msg_set_word(m, 5, p);
 }
 
-static inline void msg_set_orignode(struct tipc_msg *m, u32 a) 
+static inline void msg_set_orignode(struct tipc_msg *m, u32 a)
 {
        msg_set_word(m, 6, a);
 }
 
-static inline void msg_set_destnode(struct tipc_msg *m, u32 a) 
+static inline void msg_set_destnode(struct tipc_msg *m, u32 a)
 {
        msg_set_word(m, 7, a);
 }
 
-static inline int msg_is_dest(struct tipc_msg *m, u32 d) 
+static inline int msg_is_dest(struct tipc_msg *m, u32 d)
 {
        return(msg_short(m) || (msg_destnode(m) == d));
 }
@@ -284,7 +284,7 @@ static inline u32 msg_routed(struct tipc_msg *m)
        return(msg_destnode(m) ^ msg_orignode(m)) >> 11;
 }
 
-static inline void msg_set_nametype(struct tipc_msg *m, u32 n) 
+static inline void msg_set_nametype(struct tipc_msg *m, u32 n)
 {
        msg_set_word(m, 8, n);
 }
@@ -309,17 +309,17 @@ static inline void msg_set_transp_seqno(struct tipc_msg *m, u32 n)
        msg_set_word(m, 8, n);
 }
 
-static inline void msg_set_namelower(struct tipc_msg *m, u32 n) 
+static inline void msg_set_namelower(struct tipc_msg *m, u32 n)
 {
        msg_set_word(m, 9, n);
 }
 
-static inline void msg_set_nameinst(struct tipc_msg *m, u32 n) 
+static inline void msg_set_nameinst(struct tipc_msg *m, u32 n)
 {
        msg_set_namelower(m, n);
 }
 
-static inline void msg_set_nameupper(struct tipc_msg *m, u32 n) 
+static inline void msg_set_nameupper(struct tipc_msg *m, u32 n)
 {
        msg_set_word(m, 10, n);
 }
@@ -329,7 +329,7 @@ static inline struct tipc_msg *msg_get_wrapped(struct tipc_msg *m)
        return (struct tipc_msg *)msg_data(m);
 }
 
-static inline void msg_expand(struct tipc_msg *m, u32 destnode) 
+static inline void msg_expand(struct tipc_msg *m, u32 destnode)
 {
        if (!msg_short(m))
                return;
@@ -344,7 +344,7 @@ static inline void msg_expand(struct tipc_msg *m, u32 destnode)
 /*
                TIPC internal message header format, version 2
 
-       1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0 
+       1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    w0:|vers |msg usr|hdr sz |n|resrv|            packet size          |
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -372,9 +372,9 @@ static inline void msg_expand(struct tipc_msg *m, u32 destnode)
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
       NB: CONN_MANAGER use data message format. LINK_CONFIG has own format.
-*/   
+*/
 
-/* 
+/*
  * Internal users
  */
 
@@ -390,7 +390,7 @@ static inline void msg_expand(struct tipc_msg *m, u32 destnode)
 #define  INT_H_SIZE           40
 #define  DSC_H_SIZE           40
 
-/* 
+/*
  *  Connection management protocol messages
  */
 
@@ -398,7 +398,7 @@ static inline void msg_expand(struct tipc_msg *m, u32 destnode)
 #define CONN_PROBE_REPLY  1
 #define CONN_ACK          2
 
-/* 
+/*
  * Name distributor messages
  */
 
@@ -406,7 +406,7 @@ static inline void msg_expand(struct tipc_msg *m, u32 destnode)
 #define WITHDRAWAL        1
 
 
-/* 
+/*
  * Word 1
  */
 
@@ -425,13 +425,13 @@ static inline u32 msg_req_links(struct tipc_msg *m)
        return msg_bits(m, 1, 16, 0xfff);
 }
 
-static inline void msg_set_req_links(struct tipc_msg *m, u32 n) 
+static inline void msg_set_req_links(struct tipc_msg *m, u32 n)
 {
        msg_set_bits(m, 1, 16, 0xfff, n);
 }
 
 
-/* 
+/*
  * Word 2
  */
 
@@ -440,7 +440,7 @@ static inline u32 msg_dest_domain(struct tipc_msg *m)
        return msg_word(m, 2);
 }
 
-static inline void msg_set_dest_domain(struct tipc_msg *m, u32 n) 
+static inline void msg_set_dest_domain(struct tipc_msg *m, u32 n)
 {
        msg_set_word(m, 2, n);
 }
@@ -460,13 +460,13 @@ static inline u32 msg_bcgap_to(struct tipc_msg *m)
        return msg_bits(m, 2, 0, 0xffff);
 }
 
-static inline void msg_set_bcgap_to(struct tipc_msg *m, u32 n) 
+static inline void msg_set_bcgap_to(struct tipc_msg *m, u32 n)
 {
        msg_set_bits(m, 2, 0, 0xffff, n);
 }
 
 
-/* 
+/*
  * Word 4
  */
 
@@ -533,7 +533,7 @@ static inline void msg_set_link_selector(struct tipc_msg *m, u32 n)
        msg_set_bits(m, 4, 0, 1, (n & 1));
 }
 
-/* 
+/*
  * Word 5
  */
 
@@ -603,7 +603,7 @@ static inline void msg_clear_redundant_link(struct tipc_msg *m)
 }
 
 
-/* 
+/*
  * Word 9
  */
 
@@ -627,12 +627,12 @@ static inline void msg_set_bcast_tag(struct tipc_msg *m, u32 n)
        msg_set_bits(m, 9, 16, 0xffff, n);
 }
 
-static inline u32 msg_max_pkt(struct tipc_msg *m) 
+static inline u32 msg_max_pkt(struct tipc_msg *m)
 {
        return (msg_bits(m, 9, 16, 0xffff) * 4);
 }
 
-static inline void msg_set_max_pkt(struct tipc_msg *m, u32 n) 
+static inline void msg_set_max_pkt(struct tipc_msg *m, u32 n)
 {
        msg_set_bits(m, 9, 16, 0xffff, (n / 4));
 }
@@ -647,7 +647,7 @@ static inline void msg_set_link_tolerance(struct tipc_msg *m, u32 n)
        msg_set_bits(m, 9, 0, 0xffff, n);
 }
 
-/* 
+/*
  * Routing table message data
  */
 
@@ -672,7 +672,7 @@ static inline void msg_set_dataoctet(struct tipc_msg *m, u32 pos)
        msg_data(m)[pos + 4] = 1;
 }
 
-/* 
+/*
  * Segmentation message types
  */
 
@@ -680,7 +680,7 @@ static inline void msg_set_dataoctet(struct tipc_msg *m, u32 pos)
 #define FRAGMENT           1
 #define LAST_FRAGMENT      2
 
-/* 
+/*
  * Link management protocol message types
  */
 
@@ -688,13 +688,13 @@ static inline void msg_set_dataoctet(struct tipc_msg *m, u32 pos)
 #define RESET_MSG       1
 #define ACTIVATE_MSG    2
 
-/* 
+/*
  * Changeover tunnel message types
  */
 #define DUPLICATE_MSG    0
 #define ORIGINAL_MSG     1
 
-/* 
+/*
  * Routing table message types
  */
 #define EXT_ROUTING_TABLE    0
@@ -703,7 +703,7 @@ static inline void msg_set_dataoctet(struct tipc_msg *m, u32 pos)
 #define ROUTE_ADDITION       3
 #define ROUTE_REMOVAL        4
 
-/* 
+/*
  * Config protocol message types
  */
 
@@ -724,7 +724,7 @@ static inline u32 msg_tot_importance(struct tipc_msg *m)
 }
 
 
-static inline void msg_init(struct tipc_msg *m, u32 user, u32 type, 
+static inline void msg_init(struct tipc_msg *m, u32 user, u32 type,
                            u32 err, u32 hsize, u32 destnode)
 {
        memset(m, 0, hsize);
@@ -741,7 +741,7 @@ static inline void msg_init(struct tipc_msg *m, u32 user, u32 type,
        }
 }
 
-/** 
+/**
  * msg_calc_data_size - determine total data size for message
  */
 
@@ -755,15 +755,15 @@ static inline int msg_calc_data_size(struct iovec const *msg_sect, u32 num_sect)
        return dsz;
 }
 
-/** 
+/**
  * msg_build - create message using specified header and data
- * 
+ *
  * Note: Caller must not hold any locks in case copy_from_user() is interrupted!
- * 
+ *
  * Returns message data size or errno
  */
 
-static inline int msg_build(struct tipc_msg *hdr, 
+static inline int msg_build(struct tipc_msg *hdr,
                            struct iovec const *msg_sect, u32 num_sect,
                            int max_size, int usrmem, struct sk_buff** buf)
 {
@@ -789,11 +789,11 @@ static inline int msg_build(struct tipc_msg *hdr,
        memcpy((*buf)->data, (unchar *)hdr, hsz);
        for (res = 1, cnt = 0; res && (cnt < num_sect); cnt++) {
                if (likely(usrmem))
-                       res = !copy_from_user((*buf)->data + pos, 
-                                             msg_sect[cnt].iov_base, 
+                       res = !copy_from_user((*buf)->data + pos,
+                                             msg_sect[cnt].iov_base,
                                              msg_sect[cnt].iov_len);
                else
-                       memcpy((*buf)->data + pos, msg_sect[cnt].iov_base, 
+                       memcpy((*buf)->data + pos, msg_sect[cnt].iov_base,
                               msg_sect[cnt].iov_len);
                pos += msg_sect[cnt].iov_len;
        }
index 7bf87cb26ef3e0dbf072f760d112052646e9f357..39fd1619febf4c1e9e4c49152fe0fb9964d02522 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/name_distr.c: TIPC name distribution code
- * 
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
  * @upper: name sequence upper bound
  * @ref: publishing port reference
  * @key: publication key
- * 
+ *
  * ===> All fields are stored in network byte order. <===
- * 
+ *
  * First 3 fields identify (name or) name sequence being published.
  * Reference field uniquely identifies port that published name sequence.
  * Key field uniquely identifies publication, in the event a port has
  * multiple publications of the same name sequence.
- * 
- * Note: There is no field that identifies the publishing node because it is 
+ *
+ * Note: There is no field that identifies the publishing node because it is
  * the same for all items contained within a publication message.
  */
 
@@ -74,12 +74,12 @@ struct distr_item {
 };
 
 /**
- * List of externally visible publications by this node -- 
+ * List of externally visible publications by this node --
  * that is, all publications having scope > TIPC_NODE_SCOPE.
  */
 
 static LIST_HEAD(publ_root);
-static u32 publ_cnt = 0;               
+static u32 publ_cnt = 0;
 
 /**
  * publ_to_item - add publication info to a publication message
@@ -101,12 +101,12 @@ static void publ_to_item(struct distr_item *i, struct publication *p)
 
 static struct sk_buff *named_prepare_buf(u32 type, u32 size, u32 dest)
 {
-       struct sk_buff *buf = buf_acquire(LONG_H_SIZE + size);  
+       struct sk_buff *buf = buf_acquire(LONG_H_SIZE + size);
        struct tipc_msg *msg;
 
        if (buf != NULL) {
                msg = buf_msg(buf);
-               msg_init(msg, NAME_DISTRIBUTOR, type, TIPC_OK, 
+               msg_init(msg, NAME_DISTRIBUTOR, type, TIPC_OK,
                         LONG_H_SIZE, dest);
                msg_set_size(msg, LONG_H_SIZE + size);
        }
@@ -174,7 +174,7 @@ void tipc_named_node_up(unsigned long node)
        u32 rest;
        u32 max_item_buf;
 
-       read_lock_bh(&tipc_nametbl_lock); 
+       read_lock_bh(&tipc_nametbl_lock);
        max_item_buf = TIPC_MAX_USER_MSG_SIZE / ITEM_SIZE;
        max_item_buf *= ITEM_SIZE;
        rest = publ_cnt * ITEM_SIZE;
@@ -183,7 +183,7 @@ void tipc_named_node_up(unsigned long node)
                if (!buf) {
                        left = (rest <= max_item_buf) ? rest : max_item_buf;
                        rest -= left;
-                       buf = named_prepare_buf(PUBLICATION, left, node);       
+                       buf = named_prepare_buf(PUBLICATION, left, node);
                        if (!buf) {
                                warn("Bulk publication distribution failure\n");
                                goto exit;
@@ -196,20 +196,20 @@ void tipc_named_node_up(unsigned long node)
                if (!left) {
                        msg_set_link_selector(buf_msg(buf), node);
                        dbg("tipc_named_node_up: sending publish msg to "
-                           "<%u.%u.%u>\n", tipc_zone(node), 
+                           "<%u.%u.%u>\n", tipc_zone(node),
                            tipc_cluster(node), tipc_node(node));
                        tipc_link_send(buf, node, node);
                        buf = NULL;
                }
        }
 exit:
-       read_unlock_bh(&tipc_nametbl_lock); 
+       read_unlock_bh(&tipc_nametbl_lock);
 }
 
 /**
  * node_is_down - remove publication associated with a failed node
- * 
- * Invoked for each publication issued by a newly failed node.  
+ *
+ * Invoked for each publication issued by a newly failed node.
  * Removes publication structure from name table & deletes it.
  * In rare cases the link may have come back up again when this
  * function is called, and we have two items representing the same
@@ -221,15 +221,15 @@ static void node_is_down(struct publication *publ)
 {
        struct publication *p;
 
-        write_lock_bh(&tipc_nametbl_lock);
-       dbg("node_is_down: withdrawing %u, %u, %u\n", 
+       write_lock_bh(&tipc_nametbl_lock);
+       dbg("node_is_down: withdrawing %u, %u, %u\n",
            publ->type, publ->lower, publ->upper);
-        publ->key += 1222345;
-       p = tipc_nametbl_remove_publ(publ->type, publ->lower, 
+       publ->key += 1222345;
+       p = tipc_nametbl_remove_publ(publ->type, publ->lower,
                                     publ->node, publ->ref, publ->key);
        write_unlock_bh(&tipc_nametbl_lock);
 
-        if (p != publ) {
+       if (p != publ) {
                err("Unable to remove publication from failed node\n"
                    "(type=%u, lower=%u, node=0x%x, ref=%u, key=%u)\n",
                    publ->type, publ->lower, publ->node, publ->ref, publ->key);
@@ -251,27 +251,27 @@ void tipc_named_recv(struct sk_buff *buf)
        struct distr_item *item = (struct distr_item *)msg_data(msg);
        u32 count = msg_data_sz(msg) / ITEM_SIZE;
 
-       write_lock_bh(&tipc_nametbl_lock); 
+       write_lock_bh(&tipc_nametbl_lock);
        while (count--) {
                if (msg_type(msg) == PUBLICATION) {
-                       dbg("tipc_named_recv: got publication for %u, %u, %u\n", 
+                       dbg("tipc_named_recv: got publication for %u, %u, %u\n",
                            ntohl(item->type), ntohl(item->lower),
                            ntohl(item->upper));
-                       publ = tipc_nametbl_insert_publ(ntohl(item->type), 
+                       publ = tipc_nametbl_insert_publ(ntohl(item->type),
                                                        ntohl(item->lower),
                                                        ntohl(item->upper),
                                                        TIPC_CLUSTER_SCOPE,
-                                                       msg_orignode(msg), 
+                                                       msg_orignode(msg),
                                                        ntohl(item->ref),
                                                        ntohl(item->key));
                        if (publ) {
-                               tipc_nodesub_subscribe(&publ->subscr, 
-                                                      msg_orignode(msg), 
+                               tipc_nodesub_subscribe(&publ->subscr,
+                                                      msg_orignode(msg),
                                                       publ,
                                                       (net_ev_handler)node_is_down);
                        }
                } else if (msg_type(msg) == WITHDRAWAL) {
-                       dbg("tipc_named_recv: got withdrawl for %u, %u, %u\n", 
+                       dbg("tipc_named_recv: got withdrawl for %u, %u, %u\n",
                            ntohl(item->type), ntohl(item->lower),
                            ntohl(item->upper));
                        publ = tipc_nametbl_remove_publ(ntohl(item->type),
@@ -282,7 +282,7 @@ void tipc_named_recv(struct sk_buff *buf)
 
                        if (publ) {
                                tipc_nodesub_unsubscribe(&publ->subscr);
-                               kfree(publ);
+                               kfree(publ);
                        } else {
                                err("Unable to remove publication by node 0x%x\n"
                                    "(type=%u, lower=%u, ref=%u, key=%u)\n",
@@ -295,13 +295,13 @@ void tipc_named_recv(struct sk_buff *buf)
                }
                item++;
        }
-       write_unlock_bh(&tipc_nametbl_lock); 
+       write_unlock_bh(&tipc_nametbl_lock);
        buf_discard(buf);
 }
 
 /**
  * tipc_named_reinit - re-initialize local publication list
- * 
+ *
  * This routine is called whenever TIPC networking is (re)enabled.
  * All existing publications by this node that have "cluster" or "zone" scope
  * are updated to reflect the node's current network address.
@@ -312,11 +312,11 @@ void tipc_named_reinit(void)
 {
        struct publication *publ;
 
-       write_lock_bh(&tipc_nametbl_lock); 
+       write_lock_bh(&tipc_nametbl_lock);
        list_for_each_entry(publ, &publ_root, local_list) {
                if (publ->node == tipc_own_addr)
                        break;
                publ->node = tipc_own_addr;
        }
-       write_unlock_bh(&tipc_nametbl_lock); 
+       write_unlock_bh(&tipc_nametbl_lock);
 }
index 843da0172f4e9ec974cfb5ea48d5240ad0fe9131..1e41bdd4f2553a13a8a8f6ebeb75604ab9997fdb 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/name_distr.h: Include file for TIPC name distribution code
- * 
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
index 049242ea5c38e88ce4394d100ba300194a5dde55..9dfc9127acdd4f6ef6fdcad29082f1a477d639e2 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/name_table.c: TIPC name table code
- * 
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2004-2005, Wind River Systems
  * All rights reserved.
@@ -65,7 +65,7 @@ struct sub_seq {
        struct publication *zone_list;
 };
 
-/** 
+/**
  * struct name_seq - container for all published instances of a name type
  * @type: 32 bit 'type' value for name sequence
  * @sseq: pointer to dynamically-sized array of sub-sequences of this 'type';
@@ -89,7 +89,7 @@ struct name_seq {
 
 /**
  * struct name_table - table containing all existing port name publications
- * @types: pointer to fixed-sized array of name sequence lists, 
+ * @types: pointer to fixed-sized array of name sequence lists,
  *         accessed via hashing on 'type'; name sequence lists are *not* sorted
  * @local_publ_count: number of publications issued by this node
  */
@@ -113,8 +113,8 @@ static int hash(int x)
  * publ_create - create a publication structure
  */
 
-static struct publication *publ_create(u32 type, u32 lower, u32 upper, 
-                                      u32 scope, u32 node, u32 port_ref,   
+static struct publication *publ_create(u32 type, u32 lower, u32 upper,
+                                      u32 scope, u32 node, u32 port_ref,
                                       u32 key)
 {
        struct publication *publ = kzalloc(sizeof(*publ), GFP_ATOMIC);
@@ -148,7 +148,7 @@ static struct sub_seq *tipc_subseq_alloc(u32 cnt)
 
 /**
  * tipc_nameseq_create - create a name sequence structure for the specified 'type'
- * 
+ *
  * Allocates a single sub-sequence structure and sets it to all 0's.
  */
 
@@ -178,7 +178,7 @@ static struct name_seq *tipc_nameseq_create(u32 type, struct hlist_head *seq_hea
 
 /**
  * nameseq_find_subseq - find sub-sequence (if any) matching a name instance
- *  
+ *
  * Very time-critical, so binary searches through sub-sequence array.
  */
 
@@ -204,7 +204,7 @@ static struct sub_seq *nameseq_find_subseq(struct name_seq *nseq,
 
 /**
  * nameseq_locate_subseq - determine position of name instance in sub-sequence
- * 
+ *
  * Returns index in sub-sequence array of the entry that contains the specified
  * instance value; if no entry contains that value, returns the position
  * where a new entry for it would be inserted in the array.
@@ -232,7 +232,7 @@ static u32 nameseq_locate_subseq(struct name_seq *nseq, u32 instance)
 }
 
 /**
- * tipc_nameseq_insert_publ - 
+ * tipc_nameseq_insert_publ -
  */
 
 static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
@@ -343,8 +343,8 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
                }
        }
 
-       /* 
-        * Any subscriptions waiting for notification? 
+       /*
+        * Any subscriptions waiting for notification?
         */
        list_for_each_entry_safe(s, st, &nseq->subscriptions, nameseq_list) {
                dbg("calling report_overlap()\n");
@@ -352,7 +352,7 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
                                           publ->lower,
                                           publ->upper,
                                           TIPC_PUBLISHED,
-                                          publ->ref, 
+                                          publ->ref,
                                           publ->node,
                                           created_subseq);
        }
@@ -361,7 +361,7 @@ static struct publication *tipc_nameseq_insert_publ(struct name_seq *nseq,
 
 /**
  * tipc_nameseq_remove_publ -
- * 
+ *
  * NOTE: There may be cases where TIPC is asked to remove a publication
  * that is not in the name table.  For example, if another node issues a
  * publication for a name sequence that overlaps an existing name sequence
@@ -392,12 +392,12 @@ static struct publication *tipc_nameseq_remove_publ(struct name_seq *nseq, u32 i
 
        prev = sseq->zone_list;
        publ = sseq->zone_list->zone_list_next;
-       while ((publ->key != key) || (publ->ref != ref) || 
+       while ((publ->key != key) || (publ->ref != ref) ||
               (publ->node && (publ->node != node))) {
                prev = publ;
                publ = publ->zone_list_next;
                if (prev == sseq->zone_list) {
-                       
+
                        /* Prevent endless loop if publication not found */
 
                        return NULL;
@@ -426,7 +426,7 @@ static struct publication *tipc_nameseq_remove_publ(struct name_seq *nseq, u32 i
 
                                err("Unable to de-list cluster publication\n"
                                    "{%u%u}, node=0x%x, ref=%u, key=%u)\n",
-                                   publ->type, publ->lower, publ->node, 
+                                   publ->type, publ->lower, publ->node,
                                    publ->ref, publ->key);
                                goto end_cluster;
                        }
@@ -456,7 +456,7 @@ end_cluster:
 
                                err("Unable to de-list node publication\n"
                                    "{%u%u}, node=0x%x, ref=%u, key=%u)\n",
-                                   publ->type, publ->lower, publ->node, 
+                                   publ->type, publ->lower, publ->node,
                                    publ->ref, publ->key);
                                goto end_node;
                        }
@@ -486,8 +486,8 @@ end_node:
                tipc_subscr_report_overlap(s,
                                           publ->lower,
                                           publ->upper,
-                                          TIPC_WITHDRAWN, 
-                                          publ->ref, 
+                                          TIPC_WITHDRAWN,
+                                          publ->ref,
                                           publ->node,
                                           removed_subseq);
        }
@@ -517,8 +517,8 @@ void tipc_nameseq_subscribe(struct name_seq *nseq, struct subscription *s)
                        int must_report = 1;
 
                        do {
-                               tipc_subscr_report_overlap(s, 
-                                                          sseq->lower, 
+                               tipc_subscr_report_overlap(s,
+                                                          sseq->lower,
                                                           sseq->upper,
                                                           TIPC_PUBLISHED,
                                                           crs->ref,
@@ -576,7 +576,7 @@ struct publication *tipc_nametbl_insert_publ(u32 type, u32 lower, u32 upper,
                                        scope, node, port, key);
 }
 
-struct publication *tipc_nametbl_remove_publ(u32 type, u32 lower, 
+struct publication *tipc_nametbl_remove_publ(u32 type, u32 lower,
                                             u32 node, u32 ref, u32 key)
 {
        struct publication *publ;
@@ -676,14 +676,14 @@ not_found:
 
 /**
  * tipc_nametbl_mc_translate - find multicast destinations
- * 
+ *
  * Creates list of all local ports that overlap the given multicast address;
  * also determines if any off-node ports overlap.
  *
  * Note: Publications with a scope narrower than 'limit' are ignored.
  * (i.e. local node-scope publications mustn't receive messages arriving
  * from another node, even if the multcast link brought it here)
- * 
+ *
  * Returns non-zero if any off-node ports overlap
  */
 
@@ -730,7 +730,7 @@ exit:
  * tipc_nametbl_publish_rsv - publish port name using a reserved name type
  */
 
-int tipc_nametbl_publish_rsv(u32 ref, unsigned int scope, 
+int tipc_nametbl_publish_rsv(u32 ref, unsigned int scope,
                        struct tipc_name_seq const *seq)
 {
        int res;
@@ -745,13 +745,13 @@ int tipc_nametbl_publish_rsv(u32 ref, unsigned int scope,
  * tipc_nametbl_publish - add name publication to network name tables
  */
 
-struct publication *tipc_nametbl_publish(u32 type, u32 lower, u32 upper, 
+struct publication *tipc_nametbl_publish(u32 type, u32 lower, u32 upper,
                                    u32 scope, u32 port_ref, u32 key)
 {
        struct publication *publ;
 
        if (table.local_publ_count >= tipc_max_publications) {
-               warn("Publication failed, local publication limit reached (%u)\n", 
+               warn("Publication failed, local publication limit reached (%u)\n",
                     tipc_max_publications);
                return NULL;
        }
@@ -808,22 +808,22 @@ void tipc_nametbl_subscribe(struct subscription *s)
        u32 type = s->seq.type;
        struct name_seq *seq;
 
-        write_lock_bh(&tipc_nametbl_lock);
+       write_lock_bh(&tipc_nametbl_lock);
        seq = nametbl_find_seq(type);
        if (!seq) {
                seq = tipc_nameseq_create(type, &table.types[hash(type)]);
        }
-        if (seq){
-                spin_lock_bh(&seq->lock);
-                dbg("tipc_nametbl_subscribe:found %p for {%u,%u,%u}\n",
-                    seq, type, s->seq.lower, s->seq.upper);
-                tipc_nameseq_subscribe(seq, s);
-                spin_unlock_bh(&seq->lock);
-        } else {
+       if (seq){
+               spin_lock_bh(&seq->lock);
+               dbg("tipc_nametbl_subscribe:found %p for {%u,%u,%u}\n",
+                   seq, type, s->seq.lower, s->seq.upper);
+               tipc_nameseq_subscribe(seq, s);
+               spin_unlock_bh(&seq->lock);
+       } else {
                warn("Failed to create subscription for {%u,%u,%u}\n",
                     s->seq.type, s->seq.lower, s->seq.upper);
-        }
-        write_unlock_bh(&tipc_nametbl_lock);
+       }
+       write_unlock_bh(&tipc_nametbl_lock);
 }
 
 /**
@@ -834,19 +834,19 @@ void tipc_nametbl_unsubscribe(struct subscription *s)
 {
        struct name_seq *seq;
 
-        write_lock_bh(&tipc_nametbl_lock);
-        seq = nametbl_find_seq(s->seq.type);
+       write_lock_bh(&tipc_nametbl_lock);
+       seq = nametbl_find_seq(s->seq.type);
        if (seq != NULL){
-                spin_lock_bh(&seq->lock);
-                list_del_init(&s->nameseq_list);
-                spin_unlock_bh(&seq->lock);
-                if ((seq->first_free == 0) && list_empty(&seq->subscriptions)) {
-                        hlist_del_init(&seq->ns_list);
-                        kfree(seq->sseqs);
-                        kfree(seq);
-                }
-        }
-        write_unlock_bh(&tipc_nametbl_lock);
+               spin_lock_bh(&seq->lock);
+               list_del_init(&s->nameseq_list);
+               spin_unlock_bh(&seq->lock);
+               if ((seq->first_free == 0) && list_empty(&seq->subscriptions)) {
+                       hlist_del_init(&seq->ns_list);
+                       kfree(seq->sseqs);
+                       kfree(seq);
+               }
+       }
+       write_unlock_bh(&tipc_nametbl_lock);
 }
 
 
@@ -952,7 +952,7 @@ static void nametbl_header(struct print_buf *buf, u32 depth)
  * nametbl_list - print specified name table contents into the given buffer
  */
 
-static void nametbl_list(struct print_buf *buf, u32 depth_info, 
+static void nametbl_list(struct print_buf *buf, u32 depth_info,
                         u32 type, u32 lowbound, u32 upbound)
 {
        struct hlist_head *seq_head;
@@ -976,7 +976,7 @@ static void nametbl_list(struct print_buf *buf, u32 depth_info,
                for (i = 0; i < tipc_nametbl_size; i++) {
                        seq_head = &table.types[i];
                        hlist_for_each_entry(seq, seq_node, seq_head, ns_list) {
-                               nameseq_list(seq, buf, depth, seq->type, 
+                               nameseq_list(seq, buf, depth, seq->type,
                                             lowbound, upbound, i);
                        }
                }
@@ -991,7 +991,7 @@ static void nametbl_list(struct print_buf *buf, u32 depth_info,
                seq_head = &table.types[i];
                hlist_for_each_entry(seq, seq_node, seq_head, ns_list) {
                        if (seq->type == type) {
-                               nameseq_list(seq, buf, depth, type, 
+                               nameseq_list(seq, buf, depth, type,
                                             lowbound, upbound, i);
                                break;
                        }
@@ -1030,7 +1030,7 @@ struct sk_buff *tipc_nametbl_get(const void *req_tlv_area, int req_tlv_space)
        tipc_printbuf_init(&b, TLV_DATA(rep_tlv), MAX_NAME_TBL_QUERY);
        argv = (struct tipc_name_table_query *)TLV_DATA(req_tlv_area);
        read_lock_bh(&tipc_nametbl_lock);
-       nametbl_list(&b, ntohl(argv->depth), ntohl(argv->type), 
+       nametbl_list(&b, ntohl(argv->depth), ntohl(argv->type),
                     ntohl(argv->lowbound), ntohl(argv->upbound));
        read_unlock_bh(&tipc_nametbl_lock);
        str_len = tipc_printbuf_validate(&b);
index e8a3d71763ce637e5bdfabe753be917c2792ae92..b9e7cd336d76d54488dc2ded2f0a91914cb7dea1 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/name_table.h: Include file for TIPC name table code
- * 
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2004-2005, Wind River Systems
  * All rights reserved.
@@ -64,7 +64,7 @@ struct port_list;
  * @node_list: next matching name seq publication with >= node scope
  * @cluster_list: next matching name seq publication with >= cluster scope
  * @zone_list: next matching name seq publication with >= zone scope
- * 
+ *
  * Note that the node list, cluster list, and zone list are circular lists.
  */
 
@@ -89,16 +89,16 @@ extern rwlock_t tipc_nametbl_lock;
 
 struct sk_buff *tipc_nametbl_get(const void *req_tlv_area, int req_tlv_space);
 u32 tipc_nametbl_translate(u32 type, u32 instance, u32 *node);
-int tipc_nametbl_mc_translate(u32 type, u32 lower, u32 upper, u32 limit, 
+int tipc_nametbl_mc_translate(u32 type, u32 lower, u32 upper, u32 limit,
                         struct port_list *dports);
-int tipc_nametbl_publish_rsv(u32 ref, unsigned int scope, 
+int tipc_nametbl_publish_rsv(u32 ref, unsigned int scope,
                        struct tipc_name_seq const *seq);
 struct publication *tipc_nametbl_publish(u32 type, u32 lower, u32 upper,
                                    u32 scope, u32 port_ref, u32 key);
 int tipc_nametbl_withdraw(u32 type, u32 lower, u32 ref, u32 key);
 struct publication *tipc_nametbl_insert_publ(u32 type, u32 lower, u32 upper,
                                        u32 scope, u32 node, u32 ref, u32 key);
-struct publication *tipc_nametbl_remove_publ(u32 type, u32 lower, 
+struct publication *tipc_nametbl_remove_publ(u32 type, u32 lower,
                                        u32 node, u32 ref, u32 key);
 void tipc_nametbl_subscribe(struct subscription *s);
 void tipc_nametbl_unsubscribe(struct subscription *s);
index a991bf8a7f7493db1ee39b1dc6d1e6fff7e862a1..c39c76201e8edb2bd343c68f4b5e6ce4de202c49 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/net.c: TIPC network routing code
- * 
+ *
  * Copyright (c) 1995-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
 #include "discover.h"
 #include "config.h"
 
-/* 
+/*
  * The TIPC locking policy is designed to ensure a very fine locking
  * granularity, permitting complete parallel access to individual
- * port and node/link instances. The code consists of three major 
+ * port and node/link instances. The code consists of three major
  * locking domains, each protected with their own disjunct set of locks.
  *
  * 1: The routing hierarchy.
- *    Comprises the structures 'zone', 'cluster', 'node', 'link' 
- *    and 'bearer'. The whole hierarchy is protected by a big 
- *    read/write lock, tipc_net_lock, to enssure that nothing is added 
- *    or removed while code is accessing any of these structures. 
- *    This layer must not be called from the two others while they 
+ *    Comprises the structures 'zone', 'cluster', 'node', 'link'
+ *    and 'bearer'. The whole hierarchy is protected by a big
+ *    read/write lock, tipc_net_lock, to enssure that nothing is added
+ *    or removed while code is accessing any of these structures.
+ *    This layer must not be called from the two others while they
  *    hold any of their own locks.
  *    Neither must it itself do any upcalls to the other two before
  *    it has released tipc_net_lock and other protective locks.
  *
- *   Within the tipc_net_lock domain there are two sub-domains;'node' and 
+ *   Within the tipc_net_lock domain there are two sub-domains;'node' and
  *   'bearer', where local write operations are permitted,
  *   provided that those are protected by individual spin_locks
- *   per instance. Code holding tipc_net_lock(read) and a node spin_lock 
+ *   per instance. Code holding tipc_net_lock(read) and a node spin_lock
  *   is permitted to poke around in both the node itself and its
- *   subordinate links. I.e, it can update link counters and queues, 
- *   change link state, send protocol messages, and alter the 
- *   "active_links" array in the node; but it can _not_ remove a link 
+ *   subordinate links. I.e, it can update link counters and queues,
+ *   change link state, send protocol messages, and alter the
+ *   "active_links" array in the node; but it can _not_ remove a link
  *   or a node from the overall structure.
- *   Correspondingly, individual bearers may change status within a 
- *   tipc_net_lock(read), protected by an individual spin_lock ber bearer 
+ *   Correspondingly, individual bearers may change status within a
+ *   tipc_net_lock(read), protected by an individual spin_lock ber bearer
  *   instance, but it needs tipc_net_lock(write) to remove/add any bearers.
- *     
  *
- *  2: The transport level of the protocol. 
- *     This consists of the structures port, (and its user level 
- *     representations, such as user_port and tipc_sock), reference and 
- *     tipc_user (port.c, reg.c, socket.c). 
+ *
+ *  2: The transport level of the protocol.
+ *     This consists of the structures port, (and its user level
+ *     representations, such as user_port and tipc_sock), reference and
+ *     tipc_user (port.c, reg.c, socket.c).
  *
  *     This layer has four different locks:
  *     - The tipc_port spin_lock. This is protecting each port instance
- *       from parallel data access and removal. Since we can not place 
- *       this lock in the port itself, it has been placed in the 
+ *       from parallel data access and removal. Since we can not place
+ *       this lock in the port itself, it has been placed in the
  *       corresponding reference table entry, which has the same life
- *       cycle as the module. This entry is difficult to access from 
- *       outside the TIPC core, however, so a pointer to the lock has 
- *       been added in the port instance, -to be used for unlocking 
+ *       cycle as the module. This entry is difficult to access from
+ *       outside the TIPC core, however, so a pointer to the lock has
+ *       been added in the port instance, -to be used for unlocking
  *       only.
- *     - A read/write lock to protect the reference table itself (teg.c). 
- *       (Nobody is using read-only access to this, so it can just as 
+ *     - A read/write lock to protect the reference table itself (teg.c).
+ *       (Nobody is using read-only access to this, so it can just as
  *       well be changed to a spin_lock)
  *     - A spin lock to protect the registry of kernel/driver users (reg.c)
- *     - A global spin_lock (tipc_port_lock), which only task is to ensure 
+ *     - A global spin_lock (tipc_port_lock), which only task is to ensure
  *       consistency where more than one port is involved in an operation,
  *       i.e., whe a port is part of a linked list of ports.
  *       There are two such lists; 'port_list', which is used for management,
  *       and 'wait_list', which is used to queue ports during congestion.
- *     
+ *
  *  3: The name table (name_table.c, name_distr.c, subscription.c)
- *     - There is one big read/write-lock (tipc_nametbl_lock) protecting the 
- *       overall name table structure. Nothing must be added/removed to 
+ *     - There is one big read/write-lock (tipc_nametbl_lock) protecting the
+ *       overall name table structure. Nothing must be added/removed to
  *       this structure without holding write access to it.
  *     - There is one local spin_lock per sub_sequence, which can be seen
  *       as a sub-domain to the tipc_nametbl_lock domain. It is used only
 DEFINE_RWLOCK(tipc_net_lock);
 struct network tipc_net = { NULL };
 
-struct node *tipc_net_select_remote_node(u32 addr, u32 ref) 
+struct node *tipc_net_select_remote_node(u32 addr, u32 ref)
 {
        return tipc_zone_select_remote_node(tipc_net.zones[tipc_zone(addr)], addr, ref);
 }
@@ -224,7 +224,7 @@ void tipc_net_route_msg(struct sk_buff *buf)
                        buf_discard(buf);
                } else {
                        msg_dbg(msg, "NET>REJ>:");
-                       tipc_reject_msg(buf, msg_destport(msg) ? 
+                       tipc_reject_msg(buf, msg_destport(msg) ?
                                        TIPC_ERR_NO_PORT : TIPC_ERR_NO_NAME);
                }
                return;
@@ -236,7 +236,7 @@ void tipc_net_route_msg(struct sk_buff *buf)
        dnode = msg_short(msg) ? tipc_own_addr : msg_destnode(msg);
        if (in_scope(dnode, tipc_own_addr)) {
                if (msg_isdata(msg)) {
-                       if (msg_mcast(msg)) 
+                       if (msg_mcast(msg))
                                tipc_port_recv_mcast(buf, NULL);
                        else if (msg_destport(msg))
                                tipc_port_recv_msg(buf);
@@ -284,7 +284,7 @@ int tipc_net_start(void)
            (res = tipc_bclink_init())) {
                return res;
        }
-        tipc_subscr_stop();
+       tipc_subscr_stop();
        tipc_cfg_stop();
        tipc_k_signal((Handler)tipc_subscr_start, 0);
        tipc_k_signal((Handler)tipc_cfg_init, 0);
@@ -298,12 +298,12 @@ void tipc_net_stop(void)
 {
        if (tipc_mode != TIPC_NET_MODE)
                return;
-        write_lock_bh(&tipc_net_lock);
+       write_lock_bh(&tipc_net_lock);
        tipc_bearer_stop();
        tipc_mode = TIPC_NODE_MODE;
        tipc_bclink_stop();
        net_stop();
-        write_unlock_bh(&tipc_net_lock);
+       write_unlock_bh(&tipc_net_lock);
        info("Left network mode \n");
 }
 
index f3e0b85e64753d1e7bedc728d45dd93aa5d2c26e..a6a0e9976ac9e1de14395165e53ca9750f430219 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/net.h: Include file for TIPC network routing code
- * 
+ *
  * Copyright (c) 1995-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
@@ -43,7 +43,7 @@ struct _zone;
  * struct network - TIPC network structure
  * @zones: array of pointers to all zones within network
  */
+
 struct network {
        struct _zone **zones;
 };
index eb1bb4dce7af950f43bbf6c5899f649ea170e986..b8e1edc2badcbff690cecc06adaed983ec874039 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/netlink.c: TIPC configuration handling
- * 
+ *
  * Copyright (c) 2005-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
@@ -63,15 +63,15 @@ static int handle_cmd(struct sk_buff *skb, struct genl_info *info)
                genlmsg_unicast(rep_buf, req_nlh->nlmsg_pid);
        }
 
-        return 0;
+       return 0;
 }
 
 static struct genl_family family = {
-        .id            = GENL_ID_GENERATE,
-        .name          = TIPC_GENL_NAME,
-        .version       = TIPC_GENL_VERSION,
-        .hdrsize       = TIPC_GENL_HDRLEN,
-        .maxattr       = 0,
+       .id             = GENL_ID_GENERATE,
+       .name           = TIPC_GENL_NAME,
+       .version        = TIPC_GENL_VERSION,
+       .hdrsize        = TIPC_GENL_HDRLEN,
+       .maxattr        = 0,
 };
 
 static struct genl_ops ops = {
@@ -93,7 +93,7 @@ int tipc_netlink_start(void)
        if (genl_register_ops(&family, &ops))
                goto err_unregister;
 
-        return 0;
+       return 0;
 
  err_unregister:
        genl_unregister_family(&family);
index 4111a31def7997548dd0e49024d6f92612123eb6..e2e452a62ba181238399c7fc3ddc730cd07e8100 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/node.c: TIPC node management routines
- * 
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2005-2006, Wind River Systems
  * All rights reserved.
@@ -58,7 +58,7 @@ struct node *tipc_node_create(u32 addr)
 {
        struct cluster *c_ptr;
        struct node *n_ptr;
-        struct node **curr_node;
+       struct node **curr_node;
 
        n_ptr = kzalloc(sizeof(*n_ptr),GFP_ATOMIC);
        if (!n_ptr) {
@@ -74,16 +74,16 @@ struct node *tipc_node_create(u32 addr)
                kfree(n_ptr);
                return NULL;
        }
-               
+
        n_ptr->addr = addr;
-                spin_lock_init(&n_ptr->lock);
+               spin_lock_init(&n_ptr->lock);
        INIT_LIST_HEAD(&n_ptr->nsub);
        n_ptr->owner = c_ptr;
        tipc_cltr_attach_node(c_ptr, n_ptr);
        n_ptr->last_router = -1;
 
        /* Insert node into ordered list */
-       for (curr_node = &tipc_nodes; *curr_node; 
+       for (curr_node = &tipc_nodes; *curr_node;
             curr_node = &(*curr_node)->next) {
                if (addr < (*curr_node)->addr) {
                        n_ptr->next = *curr_node;
@@ -116,7 +116,7 @@ void tipc_node_delete(struct node *n_ptr)
 
 /**
  * tipc_node_link_up - handle addition of link
- * 
+ *
  * Link becomes active (alone or shared) or standby, depending on its priority.
  */
 
@@ -128,19 +128,19 @@ void tipc_node_link_up(struct node *n_ptr, struct link *l_ptr)
 
        info("Established link <%s> on network plane %c\n",
             l_ptr->name, l_ptr->b_ptr->net_plane);
-       
+
        if (!active[0]) {
                dbg(" link %x into %x/%x\n", l_ptr, &active[0], &active[1]);
                active[0] = active[1] = l_ptr;
                node_established_contact(n_ptr);
                return;
        }
-       if (l_ptr->priority < active[0]->priority) { 
+       if (l_ptr->priority < active[0]->priority) {
                info("New link <%s> becomes standby\n", l_ptr->name);
                return;
        }
        tipc_link_send_duplicate(active[0], l_ptr);
-       if (l_ptr->priority == active[0]->priority) { 
+       if (l_ptr->priority == active[0]->priority) {
                active[0] = l_ptr;
                return;
        }
@@ -160,17 +160,17 @@ static void node_select_active_links(struct node *n_ptr)
        u32 i;
        u32 highest_prio = 0;
 
-        active[0] = active[1] = NULL;
+       active[0] = active[1] = NULL;
 
        for (i = 0; i < MAX_BEARERS; i++) {
-                struct link *l_ptr = n_ptr->links[i];
+               struct link *l_ptr = n_ptr->links[i];
 
                if (!l_ptr || !tipc_link_is_up(l_ptr) ||
                    (l_ptr->priority < highest_prio))
                        continue;
 
                if (l_ptr->priority > highest_prio) {
-                        highest_prio = l_ptr->priority;
+                       highest_prio = l_ptr->priority;
                        active[0] = active[1] = l_ptr;
                } else {
                        active[1] = l_ptr;
@@ -203,15 +203,15 @@ void tipc_node_link_down(struct node *n_ptr, struct link *l_ptr)
                active[1] = active[0];
        if (active[0] == l_ptr)
                node_select_active_links(n_ptr);
-       if (tipc_node_is_up(n_ptr)) 
+       if (tipc_node_is_up(n_ptr))
                tipc_link_changeover(l_ptr);
-       else 
+       else
                node_lost_contact(n_ptr);
 }
 
 int tipc_node_has_active_links(struct node *n_ptr)
 {
-       return (n_ptr && 
+       return (n_ptr &&
                ((n_ptr->active_links[0]) || (n_ptr->active_links[1])));
 }
 
@@ -236,28 +236,28 @@ struct node *tipc_node_attach_link(struct link *l_ptr)
 
        if (!n_ptr)
                n_ptr = tipc_node_create(l_ptr->addr);
-        if (n_ptr) {
+       if (n_ptr) {
                u32 bearer_id = l_ptr->b_ptr->identity;
                char addr_string[16];
 
-                if (n_ptr->link_cnt >= 2) {
+               if (n_ptr->link_cnt >= 2) {
                        char addr_string[16];
 
-                        err("Attempt to create third link to %s\n",
+                       err("Attempt to create third link to %s\n",
                            addr_string_fill(addr_string, n_ptr->addr));
-                        return NULL;
-                }
-
-                if (!n_ptr->links[bearer_id]) {
-                        n_ptr->links[bearer_id] = l_ptr;
-                        tipc_net.zones[tipc_zone(l_ptr->addr)]->links++;
-                        n_ptr->link_cnt++;
-                        return n_ptr;
-                }
-                err("Attempt to establish second link on <%s> to %s \n",
-                    l_ptr->b_ptr->publ.name, 
+                       return NULL;
+               }
+
+               if (!n_ptr->links[bearer_id]) {
+                       n_ptr->links[bearer_id] = l_ptr;
+                       tipc_net.zones[tipc_zone(l_ptr->addr)]->links++;
+                       n_ptr->link_cnt++;
+                       return n_ptr;
+               }
+               err("Attempt to establish second link on <%s> to %s \n",
+                   l_ptr->b_ptr->publ.name,
                    addr_string_fill(addr_string, l_ptr->addr));
-        }
+       }
        return NULL;
 }
 
@@ -272,17 +272,17 @@ void tipc_node_detach_link(struct node *n_ptr, struct link *l_ptr)
  * Routing table management - five cases to handle:
  *
  * 1: A link towards a zone/cluster external node comes up.
- *    => Send a multicast message updating routing tables of all 
- *    system nodes within own cluster that the new destination 
- *    can be reached via this node. 
+ *    => Send a multicast message updating routing tables of all
+ *    system nodes within own cluster that the new destination
+ *    can be reached via this node.
  *    (node.establishedContact()=>cluster.multicastNewRoute())
  *
  * 2: A link towards a slave node comes up.
- *    => Send a multicast message updating routing tables of all 
- *    system nodes within own cluster that the new destination 
- *    can be reached via this node. 
+ *    => Send a multicast message updating routing tables of all
+ *    system nodes within own cluster that the new destination
+ *    can be reached via this node.
  *    (node.establishedContact()=>cluster.multicastNewRoute())
- *    => Send a  message to the slave node about existence 
+ *    => Send a  message to the slave node about existence
  *    of all system nodes within cluster:
  *    (node.establishedContact()=>cluster.sendLocalRoutes())
  *
@@ -292,13 +292,13 @@ void tipc_node_detach_link(struct node *n_ptr, struct link *l_ptr)
  *     nodes which can be reached via this node.
  *    (node.establishedContact()==>network.sendExternalRoutes())
  *    (node.establishedContact()==>network.sendSlaveRoutes())
- *    => Send messages to all directly connected slave nodes 
+ *    => Send messages to all directly connected slave nodes
  *    containing information about the existence of the new node
  *    (node.establishedContact()=>cluster.multicastNewRoute())
- *    
+ *
  * 4: The link towards a zone/cluster external node or slave
  *    node goes down.
- *    => Send a multcast message updating routing tables of all 
+ *    => Send a multcast message updating routing tables of all
  *    nodes within cluster that the new destination can not any
  *    longer be reached via this node.
  *    (node.lostAllLinks()=>cluster.bcastLostRoute())
@@ -308,7 +308,7 @@ void tipc_node_detach_link(struct node *n_ptr, struct link *l_ptr)
  *    routing tables. Note: This is a completely node
  *    local operation.
  *    (node.lostAllLinks()=>network.removeAsRouter())
- *    => Send messages to all directly connected slave nodes 
+ *    => Send messages to all directly connected slave nodes
  *    containing information about loss of the node
  *    (node.establishedContact()=>cluster.multicastLostRoute())
  *
@@ -319,12 +319,12 @@ static void node_established_contact(struct node *n_ptr)
        struct cluster *c_ptr;
 
        dbg("node_established_contact:-> %x\n", n_ptr->addr);
-       if (!tipc_node_has_active_routes(n_ptr) && in_own_cluster(n_ptr->addr)) { 
+       if (!tipc_node_has_active_routes(n_ptr) && in_own_cluster(n_ptr->addr)) {
                tipc_k_signal((Handler)tipc_named_node_up, n_ptr->addr);
        }
 
-        /* Syncronize broadcast acks */
-        n_ptr->bclink.acked = tipc_bclink_get_last_sent();
+       /* Syncronize broadcast acks */
+       n_ptr->bclink.acked = tipc_bclink_get_last_sent();
 
        if (is_slave(tipc_own_addr))
                return;
@@ -333,11 +333,11 @@ static void node_established_contact(struct node *n_ptr)
                c_ptr = tipc_cltr_find(tipc_own_addr);
                if (!c_ptr)
                        c_ptr = tipc_cltr_create(tipc_own_addr);
-                if (c_ptr)
-                        tipc_cltr_bcast_new_route(c_ptr, n_ptr->addr, 1, 
+               if (c_ptr)
+                       tipc_cltr_bcast_new_route(c_ptr, n_ptr->addr, 1,
                                                  tipc_max_nodes);
                return;
-       } 
+       }
 
        c_ptr = n_ptr->owner;
        if (is_slave(n_ptr->addr)) {
@@ -367,26 +367,26 @@ static void node_lost_contact(struct node *n_ptr)
        char addr_string[16];
        u32 i;
 
-        /* Clean up broadcast reception remains */
-        n_ptr->bclink.gap_after = n_ptr->bclink.gap_to = 0;
-        while (n_ptr->bclink.deferred_head) {
-                struct sk_buff* buf = n_ptr->bclink.deferred_head;
-                n_ptr->bclink.deferred_head = buf->next;
-                buf_discard(buf);
-        }
-        if (n_ptr->bclink.defragm) {
-                buf_discard(n_ptr->bclink.defragm);  
-                n_ptr->bclink.defragm = NULL;
-        }            
-        if (in_own_cluster(n_ptr->addr) && n_ptr->bclink.supported) { 
-                tipc_bclink_acknowledge(n_ptr, mod(n_ptr->bclink.acked + 10000));
-        }
-
-        /* Update routing tables */
+       /* Clean up broadcast reception remains */
+       n_ptr->bclink.gap_after = n_ptr->bclink.gap_to = 0;
+       while (n_ptr->bclink.deferred_head) {
+               struct sk_buff* buf = n_ptr->bclink.deferred_head;
+               n_ptr->bclink.deferred_head = buf->next;
+               buf_discard(buf);
+       }
+       if (n_ptr->bclink.defragm) {
+               buf_discard(n_ptr->bclink.defragm);
+               n_ptr->bclink.defragm = NULL;
+       }
+       if (in_own_cluster(n_ptr->addr) && n_ptr->bclink.supported) {
+               tipc_bclink_acknowledge(n_ptr, mod(n_ptr->bclink.acked + 10000));
+       }
+
+       /* Update routing tables */
        if (is_slave(tipc_own_addr)) {
                tipc_net_remove_as_router(n_ptr->addr);
        } else {
-               if (!in_own_cluster(n_ptr->addr)) { 
+               if (!in_own_cluster(n_ptr->addr)) {
                        /* Case 4 (see above) */
                        c_ptr = tipc_cltr_find(tipc_own_addr);
                        tipc_cltr_bcast_lost_route(c_ptr, n_ptr->addr, 1,
@@ -399,7 +399,7 @@ static void node_lost_contact(struct node *n_ptr)
                                                           tipc_max_nodes);
                        } else {
                                if (n_ptr->bclink.supported) {
-                                       tipc_nmap_remove(&tipc_cltr_bcast_nodes, 
+                                       tipc_nmap_remove(&tipc_cltr_bcast_nodes,
                                                         n_ptr->addr);
                                        if (n_ptr->addr < tipc_own_addr)
                                                tipc_own_tag--;
@@ -414,13 +414,13 @@ static void node_lost_contact(struct node *n_ptr)
        if (tipc_node_has_active_routes(n_ptr))
                return;
 
-       info("Lost contact with %s\n", 
+       info("Lost contact with %s\n",
             addr_string_fill(addr_string, n_ptr->addr));
 
        /* Abort link changeover */
        for (i = 0; i < MAX_BEARERS; i++) {
                struct link *l_ptr = n_ptr->links[i];
-               if (!l_ptr) 
+               if (!l_ptr)
                        continue;
                l_ptr->reset_checkpoint = l_ptr->next_in_no;
                l_ptr->exp_msg_count = 0;
@@ -429,7 +429,7 @@ static void node_lost_contact(struct node *n_ptr)
 
        /* Notify subscribers */
        list_for_each_entry_safe(ns, tns, &n_ptr->nsub, nodesub_list) {
-                ns->node = NULL;
+               ns->node = NULL;
                list_del_init(&ns->nodesub_list);
                tipc_k_signal((Handler)ns->handle_node_down,
                              (unsigned long)ns->usr_handle);
@@ -438,7 +438,7 @@ static void node_lost_contact(struct node *n_ptr)
 
 /**
  * tipc_node_select_next_hop - find the next-hop node for a message
- * 
+ *
  * Called by when cluster local lookup has failed.
  */
 
@@ -447,13 +447,13 @@ struct node *tipc_node_select_next_hop(u32 addr, u32 selector)
        struct node *n_ptr;
        u32 router_addr;
 
-        if (!tipc_addr_domain_valid(addr))
-                return NULL;
+       if (!tipc_addr_domain_valid(addr))
+               return NULL;
 
        /* Look for direct link to destination processsor */
        n_ptr = tipc_node_find(addr);
        if (n_ptr && tipc_node_has_active_links(n_ptr))
-                return n_ptr;
+               return n_ptr;
 
        /* Cluster local system nodes *must* have direct links */
        if (!is_slave(addr) && in_own_cluster(addr))
@@ -461,10 +461,10 @@ struct node *tipc_node_select_next_hop(u32 addr, u32 selector)
 
        /* Look for cluster local router with direct link to node */
        router_addr = tipc_node_select_router(n_ptr, selector);
-       if (router_addr) 
-                return tipc_node_select(router_addr, selector);
+       if (router_addr)
+               return tipc_node_select(router_addr, selector);
 
-       /* Slave nodes can only be accessed within own cluster via a 
+       /* Slave nodes can only be accessed within own cluster via a
           known router with direct link -- if no router was found,give up */
        if (is_slave(addr))
                return NULL;
@@ -473,20 +473,20 @@ struct node *tipc_node_select_next_hop(u32 addr, u32 selector)
        addr = tipc_addr(tipc_zone(addr), tipc_cluster(addr), 0);
        n_ptr = tipc_net_select_remote_node(addr, selector);
        if (n_ptr && tipc_node_has_active_links(n_ptr))
-                return n_ptr;
+               return n_ptr;
 
        /* Last resort -- look for any router to anywhere in remote zone */
        router_addr =  tipc_net_select_router(addr, selector);
-       if (router_addr) 
-                return tipc_node_select(router_addr, selector);
+       if (router_addr)
+               return tipc_node_select(router_addr, selector);
 
-        return NULL;
+       return NULL;
 }
 
 /**
  * tipc_node_select_router - select router to reach specified node
- * 
- * Uses a deterministic and fair algorithm for selecting router node. 
+ *
+ * Uses a deterministic and fair algorithm for selecting router node.
  */
 
 u32 tipc_node_select_router(struct node *n_ptr, u32 ref)
@@ -496,8 +496,8 @@ u32 tipc_node_select_router(struct node *n_ptr, u32 ref)
        u32 start;
        u32 r;
 
-        if (!n_ptr)
-                return 0;
+       if (!n_ptr)
+               return 0;
 
        if (n_ptr->last_router < 0)
                return 0;
@@ -531,10 +531,10 @@ void tipc_node_add_router(struct node *n_ptr, u32 router)
 {
        u32 r_num = tipc_node(router);
 
-       n_ptr->routers[r_num / 32] = 
+       n_ptr->routers[r_num / 32] =
                ((1 << (r_num % 32)) | n_ptr->routers[r_num / 32]);
        n_ptr->last_router = tipc_max_nodes / 32;
-       while ((--n_ptr->last_router >= 0) && 
+       while ((--n_ptr->last_router >= 0) &&
               !n_ptr->routers[n_ptr->last_router]);
 }
 
@@ -548,7 +548,7 @@ void tipc_node_remove_router(struct node *n_ptr, u32 router)
        n_ptr->routers[r_num / 32] =
                ((~(1 << (r_num % 32))) & (n_ptr->routers[r_num / 32]));
        n_ptr->last_router = tipc_max_nodes / 32;
-       while ((--n_ptr->last_router >= 0) && 
+       while ((--n_ptr->last_router >= 0) &&
               !n_ptr->routers[n_ptr->last_router]);
 
        if (!tipc_node_is_up(n_ptr))
@@ -562,7 +562,7 @@ void node_print(struct print_buf *buf, struct node *n_ptr, char *str)
 
        tipc_printf(buf, "\n\n%s", str);
        for (i = 0; i < MAX_BEARERS; i++) {
-               if (!n_ptr->links[i]) 
+               if (!n_ptr->links[i])
                        continue;
                tipc_printf(buf, "Links[%u]: %x, ", i, n_ptr->links[i]);
        }
@@ -590,7 +590,7 @@ struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space)
        u32 domain;
        struct sk_buff *buf;
        struct node *n_ptr;
-        struct tipc_node_info node_info;
+       struct tipc_node_info node_info;
        u32 payload_size;
 
        if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_NET_ADDR))
@@ -601,10 +601,10 @@ struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space)
                return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE
                                                   " (network address)");
 
-        if (!tipc_nodes)
-                return tipc_cfg_reply_none();
+       if (!tipc_nodes)
+               return tipc_cfg_reply_none();
 
-       /* For now, get space for all other nodes 
+       /* For now, get space for all other nodes
           (will need to modify this when slave nodes are supported */
 
        payload_size = TLV_SPACE(sizeof(node_info)) * (tipc_max_nodes - 1);
@@ -620,9 +620,9 @@ struct sk_buff *tipc_node_get_nodes(const void *req_tlv_area, int req_tlv_space)
        for (n_ptr = tipc_nodes; n_ptr; n_ptr = n_ptr->next) {
                if (!in_scope(domain, n_ptr->addr))
                        continue;
-                node_info.addr = htonl(n_ptr->addr);
-                node_info.up = htonl(tipc_node_is_up(n_ptr));
-               tipc_cfg_append_tlv(buf, TIPC_TLV_NODE_INFO, 
+               node_info.addr = htonl(n_ptr->addr);
+               node_info.up = htonl(tipc_node_is_up(n_ptr));
+               tipc_cfg_append_tlv(buf, TIPC_TLV_NODE_INFO,
                                    &node_info, sizeof(node_info));
        }
 
@@ -634,7 +634,7 @@ struct sk_buff *tipc_node_get_links(const void *req_tlv_area, int req_tlv_space)
        u32 domain;
        struct sk_buff *buf;
        struct node *n_ptr;
-        struct tipc_link_info link_info;
+       struct tipc_link_info link_info;
        u32 payload_size;
 
        if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_NET_ADDR))
@@ -645,9 +645,9 @@ struct sk_buff *tipc_node_get_links(const void *req_tlv_area, int req_tlv_space)
                return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE
                                                   " (network address)");
 
-        if (tipc_mode != TIPC_NET_MODE)
-                return tipc_cfg_reply_none();
-       
+       if (tipc_mode != TIPC_NET_MODE)
+               return tipc_cfg_reply_none();
+
        /* Get space for all unicast links + multicast link */
 
        payload_size = TLV_SPACE(sizeof(link_info)) *
@@ -661,27 +661,27 @@ struct sk_buff *tipc_node_get_links(const void *req_tlv_area, int req_tlv_space)
 
        /* Add TLV for broadcast link */
 
-        link_info.dest = htonl(tipc_own_addr & 0xfffff00);
-        link_info.up = htonl(1);
-        sprintf(link_info.str, tipc_bclink_name);
+       link_info.dest = htonl(tipc_own_addr & 0xfffff00);
+       link_info.up = htonl(1);
+       sprintf(link_info.str, tipc_bclink_name);
        tipc_cfg_append_tlv(buf, TIPC_TLV_LINK_INFO, &link_info, sizeof(link_info));
 
        /* Add TLVs for any other links in scope */
 
        for (n_ptr = tipc_nodes; n_ptr; n_ptr = n_ptr->next) {
-                u32 i;
+               u32 i;
 
                if (!in_scope(domain, n_ptr->addr))
                        continue;
-                for (i = 0; i < MAX_BEARERS; i++) {
-                        if (!n_ptr->links[i]) 
-                                continue;
-                        link_info.dest = htonl(n_ptr->addr);
-                        link_info.up = htonl(tipc_link_is_up(n_ptr->links[i]));
-                        strcpy(link_info.str, n_ptr->links[i]->name);
-                       tipc_cfg_append_tlv(buf, TIPC_TLV_LINK_INFO, 
+               for (i = 0; i < MAX_BEARERS; i++) {
+                       if (!n_ptr->links[i])
+                               continue;
+                       link_info.dest = htonl(n_ptr->addr);
+                       link_info.up = htonl(tipc_link_is_up(n_ptr->links[i]));
+                       strcpy(link_info.str, n_ptr->links[i]->name);
+                       tipc_cfg_append_tlv(buf, TIPC_TLV_LINK_INFO,
                                            &link_info, sizeof(link_info));
-                }
+               }
        }
 
        return buf;
index a07cc79ea63719f2aaec8737aee2b59153789cc9..cd1882654bbb27205307e0f61302c72ff8697f16 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/node.h: Include file for TIPC node management routines
- * 
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
@@ -67,7 +67,7 @@
  *    @deferred_tail: newest OOS b'cast message received from node
  *    @defragm: list of partially reassembled b'cast message fragments from node
  */
+
 struct node {
        u32 addr;
        spinlock_t lock;
@@ -85,8 +85,8 @@ struct node {
                int supported;
                u32 acked;
                u32 last_in;
-               u32 gap_after; 
-               u32 gap_to; 
+               u32 gap_after;
+               u32 gap_to;
                u32 nack_sync;
                struct sk_buff *deferred_head;
                struct sk_buff *deferred_tail;
index cc3fff3dec4f825cefda388a04b3d97b397be013..8ecbd0fb6103442712626899ee59edc6470ee0e2 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/node_subscr.c: TIPC "node down" subscription handling
- * 
+ *
  * Copyright (c) 1995-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
  * tipc_nodesub_subscribe - create "node down" subscription for specified node
  */
 
-void tipc_nodesub_subscribe(struct node_subscr *node_sub, u32 addr, 
+void tipc_nodesub_subscribe(struct node_subscr *node_sub, u32 addr,
                       void *usr_handle, net_ev_handler handle_down)
 {
        if (addr == tipc_own_addr) {
                node_sub->node = NULL;
                return;
        }
-       
+
        node_sub->node = tipc_node_find(addr);
        if (!node_sub->node) {
                warn("Node subscription rejected, unknown node 0x%x\n", addr);
index 01751c4fbb43ec10d40f8be516d18e2380d17df9..5f3f5859b84c3538252a7d21ccf36b0cca8c7af3 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/node_subscr.h: Include file for TIPC "node down" subscription handling
- * 
+ *
  * Copyright (c) 1995-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
index b7f3199523caaf846d0aa1479c69888426374040..5f8217d4b45206d2f3339a0bdfa0752607cec96e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/port.c: TIPC port code
- * 
+ *
  * Copyright (c) 1992-2006, Ericsson AB
  * Copyright (c) 2004-2005, Wind River Systems
  * All rights reserved.
@@ -126,8 +126,8 @@ int tipc_multicast(u32 ref, struct tipc_name_seq const *seq, u32 domain,
 
        ext_targets = tipc_nametbl_mc_translate(seq->type, seq->lower, seq->upper,
                                                TIPC_NODE_SCOPE, &dports);
-       
-       /* Send message to destinations (duplicate it only if necessary) */ 
+
+       /* Send message to destinations (duplicate it only if necessary) */
 
        if (ext_targets) {
                if (dports.count != 0) {
@@ -157,7 +157,7 @@ int tipc_multicast(u32 ref, struct tipc_name_seq const *seq, u32 domain,
 
 /**
  * tipc_port_recv_mcast - deliver multicast message to all destination ports
- * 
+ *
  * If there is no port list, perform a lookup to create one
  */
 
@@ -213,7 +213,7 @@ exit:
 
 /**
  * tipc_createport_raw - create a native TIPC port
- * 
+ *
  * Returns local port reference
  */
 
@@ -273,7 +273,7 @@ int tipc_deleteport(u32 ref)
 
        tipc_withdraw(ref, 0, NULL);
        p_ptr = tipc_port_lock(ref);
-       if (!p_ptr) 
+       if (!p_ptr)
                return -EINVAL;
 
        tipc_ref_discard(ref);
@@ -302,7 +302,7 @@ int tipc_deleteport(u32 ref)
 
 /**
  * tipc_get_port() - return port associated with 'ref'
- * 
+ *
  * Note: Port is not locked.
  */
 
@@ -336,7 +336,7 @@ static int port_unreliable(struct port *p_ptr)
 int tipc_portunreliable(u32 ref, unsigned int *isunreliable)
 {
        struct port *p_ptr;
-       
+
        p_ptr = tipc_port_lock(ref);
        if (!p_ptr)
                return -EINVAL;
@@ -348,7 +348,7 @@ int tipc_portunreliable(u32 ref, unsigned int *isunreliable)
 int tipc_set_portunreliable(u32 ref, unsigned int isunreliable)
 {
        struct port *p_ptr;
-       
+
        p_ptr = tipc_port_lock(ref);
        if (!p_ptr)
                return -EINVAL;
@@ -365,7 +365,7 @@ static int port_unreturnable(struct port *p_ptr)
 int tipc_portunreturnable(u32 ref, unsigned int *isunrejectable)
 {
        struct port *p_ptr;
-       
+
        p_ptr = tipc_port_lock(ref);
        if (!p_ptr)
                return -EINVAL;
@@ -377,7 +377,7 @@ int tipc_portunreturnable(u32 ref, unsigned int *isunrejectable)
 int tipc_set_portunreturnable(u32 ref, unsigned int isunrejectable)
 {
        struct port *p_ptr;
-       
+
        p_ptr = tipc_port_lock(ref);
        if (!p_ptr)
                return -EINVAL;
@@ -386,19 +386,19 @@ int tipc_set_portunreturnable(u32 ref, unsigned int isunrejectable)
        return TIPC_OK;
 }
 
-/* 
- * port_build_proto_msg(): build a port level protocol 
- * or a connection abortion message. Called with 
+/*
+ * port_build_proto_msg(): build a port level protocol
+ * or a connection abortion message. Called with
  * tipc_port lock on.
  */
 static struct sk_buff *port_build_proto_msg(u32 destport, u32 destnode,
                                            u32 origport, u32 orignode,
-                                           u32 usr, u32 type, u32 err, 
+                                           u32 usr, u32 type, u32 err,
                                            u32 seqno, u32 ack)
 {
        struct sk_buff *buf;
        struct tipc_msg *msg;
-       
+
        buf = buf_acquire(LONG_H_SIZE);
        if (buf) {
                msg = buf_msg(buf);
@@ -461,7 +461,7 @@ int tipc_reject_msg(struct sk_buff *buf, u32 err)
                msg_set_orignode(rmsg, tipc_own_addr);
        else
                msg_set_orignode(rmsg, msg_destnode(msg));
-       msg_set_size(rmsg, data_sz + hdr_sz); 
+       msg_set_size(rmsg, data_sz + hdr_sz);
        msg_set_nametype(rmsg, msg_nametype(msg));
        msg_set_nameinst(rmsg, msg_nameinst(msg));
        memcpy(rbuf->data + hdr_sz, msg_data(msg), data_sz);
@@ -492,7 +492,7 @@ int tipc_port_reject_sections(struct port *p_ptr, struct tipc_msg *hdr,
        struct sk_buff *buf;
        int res;
 
-       res = msg_build(hdr, msg_sect, num_sect, MAX_MSG_SIZE, 
+       res = msg_build(hdr, msg_sect, num_sect, MAX_MSG_SIZE,
                        !p_ptr->user_port, &buf);
        if (!buf)
                return res;
@@ -523,7 +523,7 @@ static void port_timeout(unsigned long ref)
                                           tipc_own_addr,
                                           CONN_MANAGER,
                                           CONN_PROBE,
-                                          TIPC_OK, 
+                                          TIPC_OK,
                                           port_out_seqno(p_ptr),
                                           0);
                port_incr_out_seqno(p_ptr);
@@ -562,7 +562,7 @@ static struct sk_buff *port_build_self_abort_msg(struct port *p_ptr, u32 err)
                                    port_peernode(p_ptr),
                                    imp,
                                    TIPC_CONN_MSG,
-                                   err, 
+                                   err,
                                    p_ptr->last_in_seqno + 1,
                                    0);
 }
@@ -582,7 +582,7 @@ static struct sk_buff *port_build_peer_abort_msg(struct port *p_ptr, u32 err)
                                    tipc_own_addr,
                                    imp,
                                    TIPC_CONN_MSG,
-                                   err, 
+                                   err,
                                    port_out_seqno(p_ptr),
                                    0);
 }
@@ -613,7 +613,7 @@ void tipc_port_recv_proto_msg(struct sk_buff *buf)
                        }
                }
                if (msg_type(msg) == CONN_ACK) {
-                       int wakeup = tipc_port_congested(p_ptr) && 
+                       int wakeup = tipc_port_congested(p_ptr) &&
                                     p_ptr->publ.congested &&
                                     p_ptr->wakeup;
                        p_ptr->acked += msg_msgcnt(msg);
@@ -630,8 +630,8 @@ void tipc_port_recv_proto_msg(struct sk_buff *buf)
        }
        if (err) {
                r_buf = port_build_proto_msg(msg_origport(msg),
-                                            msg_orignode(msg), 
-                                            msg_destport(msg), 
+                                            msg_orignode(msg),
+                                            msg_destport(msg),
                                             tipc_own_addr,
                                             DATA_HIGH,
                                             TIPC_CONN_MSG,
@@ -643,10 +643,10 @@ void tipc_port_recv_proto_msg(struct sk_buff *buf)
 
        /* All is fine */
        if (msg_type(msg) == CONN_PROBE) {
-               r_buf = port_build_proto_msg(msg_origport(msg), 
-                                            msg_orignode(msg), 
-                                            msg_destport(msg), 
-                                            tipc_own_addr, 
+               r_buf = port_build_proto_msg(msg_origport(msg),
+                                            msg_orignode(msg),
+                                            msg_destport(msg),
+                                            tipc_own_addr,
                                             CONN_MANAGER,
                                             CONN_PROBE_REPLY,
                                             TIPC_OK,
@@ -665,39 +665,39 @@ exit:
 
 static void port_print(struct port *p_ptr, struct print_buf *buf, int full_id)
 {
-        struct publication *publ;
+       struct publication *publ;
 
        if (full_id)
-               tipc_printf(buf, "<%u.%u.%u:%u>:", 
+               tipc_printf(buf, "<%u.%u.%u:%u>:",
                            tipc_zone(tipc_own_addr), tipc_cluster(tipc_own_addr),
-                            tipc_node(tipc_own_addr), p_ptr->publ.ref);
+                           tipc_node(tipc_own_addr), p_ptr->publ.ref);
        else
                tipc_printf(buf, "%-10u:", p_ptr->publ.ref);
 
-        if (p_ptr->publ.connected) {
-                u32 dport = port_peerport(p_ptr);
-                u32 destnode = port_peernode(p_ptr);
-
-                tipc_printf(buf, " connected to <%u.%u.%u:%u>",
-                            tipc_zone(destnode), tipc_cluster(destnode),
-                            tipc_node(destnode), dport);
-                if (p_ptr->publ.conn_type != 0)
-                        tipc_printf(buf, " via {%u,%u}",
-                                    p_ptr->publ.conn_type,
-                                    p_ptr->publ.conn_instance);
-        }
-        else if (p_ptr->publ.published) {
-                tipc_printf(buf, " bound to");
-                list_for_each_entry(publ, &p_ptr->publications, pport_list) {
+       if (p_ptr->publ.connected) {
+               u32 dport = port_peerport(p_ptr);
+               u32 destnode = port_peernode(p_ptr);
+
+               tipc_printf(buf, " connected to <%u.%u.%u:%u>",
+                           tipc_zone(destnode), tipc_cluster(destnode),
+                           tipc_node(destnode), dport);
+               if (p_ptr->publ.conn_type != 0)
+                       tipc_printf(buf, " via {%u,%u}",
+                                   p_ptr->publ.conn_type,
+                                   p_ptr->publ.conn_instance);
+       }
+       else if (p_ptr->publ.published) {
+               tipc_printf(buf, " bound to");
+               list_for_each_entry(publ, &p_ptr->publications, pport_list) {
                        if (publ->lower == publ->upper)
                                tipc_printf(buf, " {%u,%u}", publ->type,
                                            publ->lower);
                        else
-                               tipc_printf(buf, " {%u,%u,%u}", publ->type, 
+                               tipc_printf(buf, " {%u,%u,%u}", publ->type,
                                            publ->lower, publ->upper);
-                }
-        }
-        tipc_printf(buf, "\n");
+               }
+       }
+       tipc_printf(buf, "\n");
 }
 
 #define MAX_PORT_QUERY 32768
@@ -818,7 +818,7 @@ static void port_dispatcher_sigh(void *dummy)
                struct sk_buff *next = buf->next;
                struct tipc_msg *msg = buf_msg(buf);
                u32 dref = msg_destport(msg);
-               
+
                message_type = msg_type(msg);
                if (message_type > TIPC_DIRECT_MSG)
                        goto reject;    /* Unsupported message type */
@@ -838,7 +838,7 @@ static void port_dispatcher_sigh(void *dummy)
                        goto err;
 
                switch (message_type) {
-               
+
                case TIPC_CONN_MSG:{
                                tipc_conn_msg_event cb = up_ptr->conn_msg_cb;
                                u32 peer_port = port_peerport(p_ptr);
@@ -856,9 +856,9 @@ static void port_dispatcher_sigh(void *dummy)
                                        goto reject;
                                if (unlikely(!cb))
                                        goto reject;
-                               if (unlikely(++p_ptr->publ.conn_unacked >= 
+                               if (unlikely(++p_ptr->publ.conn_unacked >=
                                             TIPC_FLOW_CONTROL_WIN))
-                                       tipc_acknowledge(dref, 
+                                       tipc_acknowledge(dref,
                                                         p_ptr->publ.conn_unacked);
                                skb_pull(buf, msg_hdr_sz(msg));
                                cb(usr_handle, dref, &buf, msg_data(msg),
@@ -874,7 +874,7 @@ static void port_dispatcher_sigh(void *dummy)
                                if (unlikely(!cb))
                                        goto reject;
                                skb_pull(buf, msg_hdr_sz(msg));
-                               cb(usr_handle, dref, &buf, msg_data(msg), 
+                               cb(usr_handle, dref, &buf, msg_data(msg),
                                   msg_data_sz(msg), msg_importance(msg),
                                   &orig);
                                break;
@@ -895,7 +895,7 @@ static void port_dispatcher_sigh(void *dummy)
                                dseq.upper = (message_type == TIPC_NAMED_MSG)
                                        ? dseq.lower : msg_nameupper(msg);
                                skb_pull(buf, msg_hdr_sz(msg));
-                               cb(usr_handle, dref, &buf, msg_data(msg), 
+                               cb(usr_handle, dref, &buf, msg_data(msg),
                                   msg_data_sz(msg), msg_importance(msg),
                                   &orig, &dseq);
                                break;
@@ -907,9 +907,9 @@ static void port_dispatcher_sigh(void *dummy)
                continue;
 err:
                switch (message_type) {
-               
+
                case TIPC_CONN_MSG:{
-                               tipc_conn_shutdown_event cb = 
+                               tipc_conn_shutdown_event cb =
                                        up_ptr->conn_err_cb;
                                u32 peer_port = port_peerport(p_ptr);
                                u32 peer_node = port_peernode(p_ptr);
@@ -940,7 +940,7 @@ err:
                        }
                case TIPC_MCAST_MSG:
                case TIPC_NAMED_MSG:{
-                               tipc_named_msg_err_event cb = 
+                               tipc_named_msg_err_event cb =
                                        up_ptr->named_err_cb;
 
                                spin_unlock_bh(p_ptr->publ.lock);
@@ -951,7 +951,7 @@ err:
                                dseq.upper = (message_type == TIPC_NAMED_MSG)
                                        ? dseq.lower : msg_nameupper(msg);
                                skb_pull(buf, msg_hdr_sz(msg));
-                               cb(usr_handle, dref, &buf, msg_data(msg), 
+                               cb(usr_handle, dref, &buf, msg_data(msg),
                                   msg_data_sz(msg), msg_errcode(msg), &dseq);
                                break;
                        }
@@ -986,9 +986,9 @@ static u32 port_dispatcher(struct tipc_port *dummy, struct sk_buff *buf)
        return TIPC_OK;
 }
 
-/* 
+/*
  * Wake up port after congestion: Called with port locked,
- *                                
+ *
  */
 
 static void port_wakeup_sh(unsigned long ref)
@@ -1033,7 +1033,7 @@ void tipc_acknowledge(u32 ref, u32 ack)
                                           tipc_own_addr,
                                           CONN_MANAGER,
                                           CONN_ACK,
-                                          TIPC_OK, 
+                                          TIPC_OK,
                                           port_out_seqno(p_ptr),
                                           ack);
        }
@@ -1046,20 +1046,20 @@ void tipc_acknowledge(u32 ref, u32 ack)
  *                    registry if non-zero user_ref.
  */
 
-int tipc_createport(u32 user_ref, 
-                   void *usr_handle, 
-                   unsigned int importance, 
-                   tipc_msg_err_event error_cb, 
-                   tipc_named_msg_err_event named_error_cb, 
-                   tipc_conn_shutdown_event conn_error_cb, 
-                   tipc_msg_event msg_cb, 
-                   tipc_named_msg_event named_msg_cb, 
-                   tipc_conn_msg_event conn_msg_cb, 
+int tipc_createport(u32 user_ref,
+                   void *usr_handle,
+                   unsigned int importance,
+                   tipc_msg_err_event error_cb,
+                   tipc_named_msg_err_event named_error_cb,
+                   tipc_conn_shutdown_event conn_error_cb,
+                   tipc_msg_event msg_cb,
+                   tipc_named_msg_event named_msg_cb,
+                   tipc_conn_msg_event conn_msg_cb,
                    tipc_continue_event continue_event_cb,/* May be zero */
                    u32 *portref)
 {
        struct user_port *up_ptr;
-       struct port *p_ptr; 
+       struct port *p_ptr;
        u32 ref;
 
        up_ptr = kmalloc(sizeof(*up_ptr), GFP_ATOMIC);
@@ -1088,7 +1088,7 @@ int tipc_createport(u32 user_ref,
        INIT_LIST_HEAD(&up_ptr->uport_list);
        tipc_reg_add_port(up_ptr);
        *portref = p_ptr->publ.ref;
-       dbg(" tipc_createport: %x with ref %u\n", p_ptr, p_ptr->publ.ref);        
+       dbg(" tipc_createport: %x with ref %u\n", p_ptr, p_ptr->publ.ref);
        tipc_port_unlock(p_ptr);
        return TIPC_OK;
 }
@@ -1103,7 +1103,7 @@ int tipc_ownidentity(u32 ref, struct tipc_portid *id)
 int tipc_portimportance(u32 ref, unsigned int *importance)
 {
        struct port *p_ptr;
-       
+
        p_ptr = tipc_port_lock(ref);
        if (!p_ptr)
                return -EINVAL;
@@ -1172,19 +1172,19 @@ int tipc_withdraw(u32 ref, unsigned int scope, struct tipc_name_seq const *seq)
        struct publication *publ;
        struct publication *tpubl;
        int res = -EINVAL;
-       
+
        p_ptr = tipc_port_lock(ref);
        if (!p_ptr)
                return -EINVAL;
        if (!seq) {
-               list_for_each_entry_safe(publ, tpubl, 
+               list_for_each_entry_safe(publ, tpubl,
                                         &p_ptr->publications, pport_list) {
-                       tipc_nametbl_withdraw(publ->type, publ->lower, 
+                       tipc_nametbl_withdraw(publ->type, publ->lower,
                                              publ->ref, publ->key);
                }
                res = TIPC_OK;
        } else {
-               list_for_each_entry_safe(publ, tpubl, 
+               list_for_each_entry_safe(publ, tpubl,
                                         &p_ptr->publications, pport_list) {
                        if (publ->scope != scope)
                                continue;
@@ -1194,7 +1194,7 @@ int tipc_withdraw(u32 ref, unsigned int scope, struct tipc_name_seq const *seq)
                                continue;
                        if (publ->upper != seq->upper)
                                break;
-                       tipc_nametbl_withdraw(publ->type, publ->lower, 
+                       tipc_nametbl_withdraw(publ->type, publ->lower,
                                              publ->ref, publ->key);
                        res = TIPC_OK;
                        break;
@@ -1292,7 +1292,7 @@ int tipc_shutdown(u32 ref)
                                           tipc_own_addr,
                                           imp,
                                           TIPC_CONN_MSG,
-                                          TIPC_CONN_SHUTDOWN, 
+                                          TIPC_CONN_SHUTDOWN,
                                           port_out_seqno(p_ptr),
                                           0);
        }
@@ -1304,7 +1304,7 @@ int tipc_shutdown(u32 ref)
 int tipc_isconnected(u32 ref, int *isconnected)
 {
        struct port *p_ptr;
-       
+
        p_ptr = tipc_port_lock(ref);
        if (!p_ptr)
                return -EINVAL;
@@ -1317,7 +1317,7 @@ int tipc_peer(u32 ref, struct tipc_portid *peer)
 {
        struct port *p_ptr;
        int res;
-        
+
        p_ptr = tipc_port_lock(ref);
        if (!p_ptr)
                return -EINVAL;
@@ -1348,7 +1348,7 @@ int tipc_port_recv_sections(struct port *sender, unsigned int num_sect,
 {
        struct sk_buff *buf;
        int res;
-        
+
        res = msg_build(&sender->publ.phdr, msg_sect, num_sect,
                        MAX_MSG_SIZE, !sender->user_port, &buf);
        if (likely(buf))
@@ -1394,7 +1394,7 @@ int tipc_send(u32 ref, unsigned int num_sect, struct iovec const *msg_sect)
        return -ELINKCONG;
 }
 
-/** 
+/**
  * tipc_send_buf - send message buffer on connection
  */
 
@@ -1406,7 +1406,7 @@ int tipc_send_buf(u32 ref, struct sk_buff *buf, unsigned int dsz)
        u32 hsz;
        u32 sz;
        u32 res;
-        
+
        p_ptr = tipc_port_deref(ref);
        if (!p_ptr || !p_ptr->publ.connected)
                return -EINVAL;
@@ -1447,12 +1447,12 @@ int tipc_send_buf(u32 ref, struct sk_buff *buf, unsigned int dsz)
  * tipc_forward2name - forward message sections to port name
  */
 
-int tipc_forward2name(u32 ref, 
-                     struct tipc_name const *name, 
+int tipc_forward2name(u32 ref,
+                     struct tipc_name const *name,
                      u32 domain,
-                     u32 num_sect, 
+                     u32 num_sect,
                      struct iovec const *msg_sect,
-                     struct tipc_portid const *orig, 
+                     struct tipc_portid const *orig,
                      unsigned int importance)
 {
        struct port *p_ptr;
@@ -1483,7 +1483,7 @@ int tipc_forward2name(u32 ref,
                p_ptr->sent++;
                if (likely(destnode == tipc_own_addr))
                        return tipc_port_recv_sections(p_ptr, num_sect, msg_sect);
-               res = tipc_link_send_sections_fast(p_ptr, msg_sect, num_sect, 
+               res = tipc_link_send_sections_fast(p_ptr, msg_sect, num_sect,
                                                   destnode);
                if (likely(res != -ELINKCONG))
                        return res;
@@ -1493,7 +1493,7 @@ int tipc_forward2name(u32 ref,
                }
                return -ELINKCONG;
        }
-       return tipc_port_reject_sections(p_ptr, msg, msg_sect, num_sect, 
+       return tipc_port_reject_sections(p_ptr, msg, msg_sect, num_sect,
                                         TIPC_ERR_NO_NAME);
 }
 
@@ -1501,10 +1501,10 @@ int tipc_forward2name(u32 ref,
  * tipc_send2name - send message sections to port name
  */
 
-int tipc_send2name(u32 ref, 
+int tipc_send2name(u32 ref,
                   struct tipc_name const *name,
-                  unsigned int domain, 
-                  unsigned int num_sect, 
+                  unsigned int domain,
+                  unsigned int num_sect,
                   struct iovec const *msg_sect)
 {
        struct tipc_portid orig;
@@ -1515,7 +1515,7 @@ int tipc_send2name(u32 ref,
                                 TIPC_PORT_IMPORTANCE);
 }
 
-/** 
+/**
  * tipc_forward_buf2name - forward message buffer to port name
  */
 
@@ -1571,14 +1571,14 @@ int tipc_forward_buf2name(u32 ref,
        return tipc_reject_msg(buf, TIPC_ERR_NO_NAME);
 }
 
-/** 
+/**
  * tipc_send_buf2name - send message buffer to port name
  */
 
-int tipc_send_buf2name(u32 ref, 
-                      struct tipc_name const *dest, 
+int tipc_send_buf2name(u32 ref,
+                      struct tipc_name const *dest,
                       u32 domain,
-                      struct sk_buff *buf, 
+                      struct sk_buff *buf,
                       unsigned int dsz)
 {
        struct tipc_portid orig;
@@ -1589,15 +1589,15 @@ int tipc_send_buf2name(u32 ref,
                                     TIPC_PORT_IMPORTANCE);
 }
 
-/** 
+/**
  * tipc_forward2port - forward message sections to port identity
  */
 
 int tipc_forward2port(u32 ref,
                      struct tipc_portid const *dest,
-                     unsigned int num_sect, 
+                     unsigned int num_sect,
                      struct iovec const *msg_sect,
-                     struct tipc_portid const *orig, 
+                     struct tipc_portid const *orig,
                      unsigned int importance)
 {
        struct port *p_ptr;
@@ -1630,24 +1630,24 @@ int tipc_forward2port(u32 ref,
        return -ELINKCONG;
 }
 
-/** 
- * tipc_send2port - send message sections to port identity 
+/**
+ * tipc_send2port - send message sections to port identity
  */
 
-int tipc_send2port(u32 ref, 
+int tipc_send2port(u32 ref,
                   struct tipc_portid const *dest,
-                  unsigned int num_sect, 
+                  unsigned int num_sect,
                   struct iovec const *msg_sect)
 {
        struct tipc_portid orig;
 
        orig.ref = ref;
        orig.node = tipc_own_addr;
-       return tipc_forward2port(ref, dest, num_sect, msg_sect, &orig, 
+       return tipc_forward2port(ref, dest, num_sect, msg_sect, &orig,
                                 TIPC_PORT_IMPORTANCE);
 }
 
-/** 
+/**
  * tipc_forward_buf2port - forward message buffer to port identity
  */
 int tipc_forward_buf2port(u32 ref,
@@ -1692,20 +1692,20 @@ int tipc_forward_buf2port(u32 ref,
        return -ELINKCONG;
 }
 
-/** 
+/**
  * tipc_send_buf2port - send message buffer to port identity
  */
 
-int tipc_send_buf2port(u32 ref, 
+int tipc_send_buf2port(u32 ref,
                       struct tipc_portid const *dest,
-                      struct sk_buff *buf, 
+                      struct sk_buff *buf,
                       unsigned int dsz)
 {
        struct tipc_portid orig;
 
        orig.ref = ref;
        orig.node = tipc_own_addr;
-       return tipc_forward_buf2port(ref, dest, buf, dsz, &orig, 
+       return tipc_forward_buf2port(ref, dest, buf, dsz, &orig,
                                     TIPC_PORT_IMPORTANCE);
 }
 
index 839f100da646e8d8fc7c4a3bc6b35635bdd78963..7ef4d64b32f79a95e89bd412c1dae6e1ef47248b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/port.h: Include file for TIPC port code
- * 
+ *
  * Copyright (c) 1994-2006, Ericsson AB
  * Copyright (c) 2004-2005, Wind River Systems
  * All rights reserved.
  * <various callback routines>
  * @uport_list: adjacent user ports in list of ports held by user
  */
+
 struct user_port {
        u32 user_ref;
-       void *usr_handle; 
+       void *usr_handle;
        u32 ref;
-       tipc_msg_err_event err_cb; 
-       tipc_named_msg_err_event named_err_cb; 
-       tipc_conn_shutdown_event conn_err_cb; 
-       tipc_msg_event msg_cb; 
-       tipc_named_msg_event named_msg_cb; 
-       tipc_conn_msg_event conn_msg_cb; 
+       tipc_msg_err_event err_cb;
+       tipc_named_msg_err_event named_err_cb;
+       tipc_conn_shutdown_event conn_err_cb;
+       tipc_msg_event msg_cb;
+       tipc_named_msg_event named_msg_cb;
+       tipc_conn_msg_event conn_msg_cb;
        tipc_continue_event continue_event_cb;
        struct list_head uport_list;
 };
@@ -113,7 +113,7 @@ struct port {
 extern spinlock_t tipc_port_list_lock;
 struct port_list;
 
-int tipc_port_recv_sections(struct port *p_ptr, u32 num_sect, 
+int tipc_port_recv_sections(struct port *p_ptr, u32 num_sect,
                            struct iovec const *msg_sect);
 int tipc_port_reject_sections(struct port *p_ptr, struct tipc_msg *hdr,
                              struct iovec const *msg_sect, u32 num_sect,
@@ -133,9 +133,9 @@ static inline struct port *tipc_port_lock(u32 ref)
        return (struct port *)tipc_ref_lock(ref);
 }
 
-/** 
+/**
  * tipc_port_unlock - unlock a port instance
- * 
+ *
  * Can use pointer instead of tipc_ref_unlock() since port is already locked.
  */
 
@@ -164,7 +164,7 @@ static inline int tipc_port_congested(struct port *p_ptr)
        return((p_ptr->sent - p_ptr->acked) >= (TIPC_FLOW_CONTROL_WIN * 2));
 }
 
-/** 
+/**
  * tipc_port_recv_msg - receive message from lower layer and deliver to port user
  */
 
@@ -175,7 +175,7 @@ static inline int tipc_port_recv_msg(struct sk_buff *buf)
        u32 destport = msg_destport(msg);
        u32 dsz = msg_data_sz(msg);
        u32 err;
-       
+
        /* forward unresolved named message */
        if (unlikely(!destport)) {
                tipc_net_route_msg(buf);
index e6d6ae22ea495065db2e5862c8ec41b95fda8661..6704a58c785162e40989711bd061c44e6b8f25e8 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/ref.c: TIPC object registry code
- * 
+ *
  * Copyright (c) 1991-2006, Ericsson AB
  * Copyright (c) 2004-2005, Wind River Systems
  * All rights reserved.
  * Object reference table consists of 2**N entries.
  *
  * A used entry has object ptr != 0, reference == XXXX|own index
- *                                  (XXXX changes each time entry is acquired) 
+ *                                  (XXXX changes each time entry is acquired)
  * A free entry has object ptr == 0, reference == YYYY|next free index
  *                                  (YYYY is one more than last used XXXX)
  *
- * Free list is initially chained from entry (2**N)-1 to entry 1. 
+ * Free list is initially chained from entry (2**N)-1 to entry 1.
  * Entry 0 is not used to allow index 0 to indicate the end of the free list.
  *
  * Note: Any accidental reference of the form XXXX|0--0 won't match entry 0
@@ -113,9 +113,9 @@ void tipc_ref_table_stop(void)
 
 /**
  * tipc_ref_acquire - create reference to an object
- * 
+ *
  * Return a unique reference value which can be translated back to the pointer
- * 'object' at a later time.  Also, pass back a pointer to the lock protecting 
+ * 'object' at a later time.  Also, pass back a pointer to the lock protecting
  * the object, but without locking it.
  */
 
@@ -141,15 +141,15 @@ u32 tipc_ref_acquire(void *object, spinlock_t **lock)
                index = tipc_ref_table.first_free;
                entry = &(tipc_ref_table.entries[index]);
                index_mask = tipc_ref_table.index_mask;
-               /* take lock in case a previous user of entry still holds it */ 
-               spin_lock_bh(&entry->lock);  
+               /* take lock in case a previous user of entry still holds it */
+               spin_lock_bh(&entry->lock);
                next_plus_upper = entry->data.next_plus_upper;
                tipc_ref_table.first_free = next_plus_upper & index_mask;
                reference = (next_plus_upper & ~index_mask) + index;
                entry->data.reference = reference;
                entry->object = object;
-                if (lock != 0)
-                        *lock = &entry->lock;
+               if (lock != 0)
+                       *lock = &entry->lock;
                spin_unlock_bh(&entry->lock);
        }
        write_unlock_bh(&ref_table_lock);
@@ -158,7 +158,7 @@ u32 tipc_ref_acquire(void *object, spinlock_t **lock)
 
 /**
  * tipc_ref_discard - invalidate references to an object
- * 
+ *
  * Disallow future references to an object and free up the entry for re-use.
  * Note: The entry's spin_lock may still be busy after discard
  */
@@ -166,7 +166,7 @@ u32 tipc_ref_acquire(void *object, spinlock_t **lock)
 void tipc_ref_discard(u32 ref)
 {
        struct reference *entry;
-       u32 index; 
+       u32 index;
        u32 index_mask;
 
        if (!ref) {
@@ -198,7 +198,7 @@ void tipc_ref_discard(u32 ref)
                tipc_ref_table.first_free = index;
        else
                /* next_plus_upper is always XXXX|0--0 for last free entry */
-               tipc_ref_table.entries[tipc_ref_table.last_free].data.next_plus_upper 
+               tipc_ref_table.entries[tipc_ref_table.last_free].data.next_plus_upper
                        |= index;
        tipc_ref_table.last_free = index;
 
index 6d20006be45b66d4f034aabf6ebd1eb538041ecc..38f3a7f4a78d8dcb8308db0b2ffc9aa2a921ca29 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/ref.h: Include file for TIPC object registry code
- * 
+ *
  * Copyright (c) 1991-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
@@ -43,7 +43,7 @@
  * @lock: spinlock controlling access to object
  * @data: reference value associated with object (or link to next unused entry)
  */
+
 struct reference {
        void *object;
        spinlock_t lock;
@@ -96,7 +96,7 @@ static inline void *tipc_ref_lock(u32 ref)
 }
 
 /**
- * tipc_ref_unlock - unlock referenced object 
+ * tipc_ref_unlock - unlock referenced object
  */
 
 static inline void tipc_ref_unlock(u32 ref)
@@ -119,7 +119,7 @@ static inline void tipc_ref_unlock(u32 ref)
 static inline void *tipc_ref_deref(u32 ref)
 {
        if (likely(tipc_ref_table.entries)) {
-               struct reference *r = 
+               struct reference *r =
                        &tipc_ref_table.entries[ref & tipc_ref_table.index_mask];
 
                if (likely(r->data.reference == ref))
index 2a6a5a6b4c125bac4f9e2e59241091b71a6d1c99..b71739fbe2c66cf588805bf99f6761695045f1b4 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/socket.c: TIPC socket API
- * 
+ *
  * Copyright (c) 2001-2006, Ericsson AB
  * Copyright (c) 2004-2006, Wind River Systems
  * All rights reserved.
@@ -82,29 +82,29 @@ static int sockets_enabled = 0;
 static atomic_t tipc_queue_size = ATOMIC_INIT(0);
 
 
-/* 
- * sock_lock(): Lock a port/socket pair. lock_sock() can 
- * not be used here, since the same lock must protect ports 
+/*
+ * sock_lock(): Lock a port/socket pair. lock_sock() can
+ * not be used here, since the same lock must protect ports
  * with non-socket interfaces.
  * See net.c for description of locking policy.
  */
 static void sock_lock(struct tipc_sock* tsock)
 {
-        spin_lock_bh(tsock->p->lock);       
+       spin_lock_bh(tsock->p->lock);
 }
 
-/* 
+/*
  * sock_unlock(): Unlock a port/socket pair
  */
 static void sock_unlock(struct tipc_sock* tsock)
 {
-        spin_unlock_bh(tsock->p->lock);
+       spin_unlock_bh(tsock->p->lock);
 }
 
 /**
  * pollmask - determine the current set of poll() events for a socket
  * @sock: socket structure
- * 
+ *
  * TIPC sets the returned events as follows:
  * a) POLLRDNORM and POLLIN are set if the socket's receive queue is non-empty
  *    or if a connection-oriented socket is does not have an active connection
@@ -115,7 +115,7 @@ static void sock_unlock(struct tipc_sock* tsock)
  *
  * IMPORTANT: The fact that a read or write operation will not block does NOT
  * imply that the operation will succeed!
- * 
+ *
  * Returns pollmask value
  */
 
@@ -130,7 +130,7 @@ static u32 pollmask(struct socket *sock)
        else
                mask = 0;
 
-       if (sock->state == SS_DISCONNECTING) 
+       if (sock->state == SS_DISCONNECTING)
                mask |= POLLHUP;
        else
                mask |= POLLOUT;
@@ -146,9 +146,9 @@ static u32 pollmask(struct socket *sock)
 
 static void advance_queue(struct tipc_sock *tsock)
 {
-        sock_lock(tsock);
+       sock_lock(tsock);
        buf_discard(skb_dequeue(&tsock->sk.sk_receive_queue));
-        sock_unlock(tsock);
+       sock_unlock(tsock);
        atomic_dec(&tipc_queue_size);
 }
 
@@ -156,7 +156,7 @@ static void advance_queue(struct tipc_sock *tsock)
  * tipc_create - create a TIPC socket
  * @sock: pre-allocated socket structure
  * @protocol: protocol indicator (must be 0)
- * 
+ *
  * This routine creates and attaches a 'struct sock' to the 'struct socket',
  * then create and attaches a TIPC port to the 'struct sock' part.
  *
@@ -167,7 +167,7 @@ static int tipc_create(struct socket *sock, int protocol)
        struct tipc_sock *tsock;
        struct tipc_port *port;
        struct sock *sk;
-        u32 ref;
+       u32 ref;
 
        if (unlikely(protocol != 0))
                return -EPROTONOSUPPORT;
@@ -232,7 +232,7 @@ static int tipc_create(struct socket *sock, int protocol)
  * For SEQPACKET and STREAM socket types, the first message is rejected
  * and any others are discarded.  (If the first message on a STREAM socket
  * is partially-read, it is discarded and the next one is rejected instead.)
- * 
+ *
  * NOTE: Rejected messages are not necessarily returned to the sender!  They
  * are returned or discarded according to the "destination droppable" setting
  * specified for the message by the sender.
@@ -247,7 +247,7 @@ static int release(struct socket *sock)
        int res = TIPC_OK;
        struct sk_buff *buf;
 
-        dbg("sock_delete: %x\n",tsock);
+       dbg("sock_delete: %x\n",tsock);
        if (!tsock)
                return 0;
        down_interruptible(&tsock->sem);
@@ -255,7 +255,7 @@ static int release(struct socket *sock)
                up(&tsock->sem);
                return 0;
        }
-       
+
        /* Reject unreceived messages, unless no longer connected */
 
        while (sock->state != SS_DISCONNECTING) {
@@ -289,7 +289,7 @@ static int release(struct socket *sock)
 
        sock_put(sk);
 
-        atomic_dec(&tipc_user_count);
+       atomic_dec(&tipc_user_count);
        return res;
 }
 
@@ -298,11 +298,11 @@ static int release(struct socket *sock)
  * @sock: socket structure
  * @uaddr: socket address describing name(s) and desired operation
  * @uaddr_len: size of socket address data structure
- * 
+ *
  * Name and name sequence binding is indicated using a positive scope value;
  * a negative scope value unbinds the specified name.  Specifying no name
  * (i.e. a socket address length of 0) unbinds all names from the socket.
- * 
+ *
  * Returns 0 on success, errno otherwise
  */
 
@@ -314,7 +314,7 @@ static int bind(struct socket *sock, struct sockaddr *uaddr, int uaddr_len)
 
        if (down_interruptible(&tsock->sem))
                return -ERESTARTSYS;
-       
+
        if (unlikely(!uaddr_len)) {
                res = tipc_withdraw(tsock->p->ref, 0, NULL);
                goto exit;
@@ -335,8 +335,8 @@ static int bind(struct socket *sock, struct sockaddr *uaddr, int uaddr_len)
                res = -EAFNOSUPPORT;
                goto exit;
        }
-        
-               if (addr->scope > 0)
+
+       if (addr->scope > 0)
                res = tipc_publish(tsock->p->ref, addr->scope,
                                   &addr->addr.nameseq);
        else
@@ -347,17 +347,17 @@ exit:
        return res;
 }
 
-/** 
+/**
  * get_name - get port ID of socket or peer socket
  * @sock: socket structure
  * @uaddr: area for returned socket address
  * @uaddr_len: area for returned length of socket address
  * @peer: 0 to obtain socket name, 1 to obtain peer socket name
- * 
+ *
  * Returns 0 on success, errno otherwise
  */
 
-static int get_name(struct socket *sock, struct sockaddr *uaddr, 
+static int get_name(struct socket *sock, struct sockaddr *uaddr,
                    int *uaddr_len, int peer)
 {
        struct tipc_sock *tsock = tipc_sk(sock->sk);
@@ -390,7 +390,7 @@ static int get_name(struct socket *sock, struct sockaddr *uaddr,
  * Returns the pollmask
  */
 
-static unsigned int poll(struct file *file, struct socket *sock, 
+static unsigned int poll(struct file *file, struct socket *sock,
                         poll_table *wait)
 {
        poll_wait(file, sock->sk->sk_sleep, wait);
@@ -398,14 +398,14 @@ static unsigned int poll(struct file *file, struct socket *sock,
        return pollmask(sock);
 }
 
-/** 
+/**
  * dest_name_check - verify user is permitted to send to specified port name
  * @dest: destination address
  * @m: descriptor for message to be sent
- * 
+ *
  * Prevents restricted configuration commands from being issued by
  * unauthorized users.
- * 
+ *
  * Returns 0 if permission is granted, otherwise errno
  */
 
@@ -413,19 +413,19 @@ static int dest_name_check(struct sockaddr_tipc *dest, struct msghdr *m)
 {
        struct tipc_cfg_msg_hdr hdr;
 
-        if (likely(dest->addr.name.name.type >= TIPC_RESERVED_TYPES))
-                return 0;
-        if (likely(dest->addr.name.name.type == TIPC_TOP_SRV))
-                return 0;
+       if (likely(dest->addr.name.name.type >= TIPC_RESERVED_TYPES))
+               return 0;
+       if (likely(dest->addr.name.name.type == TIPC_TOP_SRV))
+               return 0;
 
-        if (likely(dest->addr.name.name.type != TIPC_CFG_SRV))
-                return -EACCES;
+       if (likely(dest->addr.name.name.type != TIPC_CFG_SRV))
+               return -EACCES;
 
-        if (copy_from_user(&hdr, m->msg_iov[0].iov_base, sizeof(hdr)))
+       if (copy_from_user(&hdr, m->msg_iov[0].iov_base, sizeof(hdr)))
                return -EFAULT;
        if ((ntohs(hdr.tcm_type) & 0xC000) && (!capable(CAP_NET_ADMIN)))
                return -EACCES;
-        
+
        return 0;
 }
 
@@ -435,12 +435,12 @@ static int dest_name_check(struct sockaddr_tipc *dest, struct msghdr *m)
  * @sock: socket structure
  * @m: message to send
  * @total_len: length of message
- * 
+ *
  * Message must have an destination specified explicitly.
- * Used for SOCK_RDM and SOCK_DGRAM messages, 
+ * Used for SOCK_RDM and SOCK_DGRAM messages,
  * and for 'SYN' messages on SOCK_SEQPACKET and SOCK_STREAM connections.
  * (Note: 'SYN+' is prohibited on SOCK_STREAM.)
- * 
+ *
  * Returns the number of bytes sent on success, or errno otherwise
  */
 
@@ -448,7 +448,7 @@ static int send_msg(struct kiocb *iocb, struct socket *sock,
                    struct msghdr *m, size_t total_len)
 {
        struct tipc_sock *tsock = tipc_sk(sock->sk);
-        struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name;
+       struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name;
        struct sk_buff *buf;
        int needs_conn;
        int res = -EINVAL;
@@ -489,61 +489,61 @@ static int send_msg(struct kiocb *iocb, struct socket *sock,
                sock->state = SS_CONNECTING;
        }
 
-        do {
-                if (dest->addrtype == TIPC_ADDR_NAME) {
-                        if ((res = dest_name_check(dest, m)))
-                                goto exit;
-                        res = tipc_send2name(tsock->p->ref,
-                                             &dest->addr.name.name,
-                                             dest->addr.name.domain, 
-                                             m->msg_iovlen,
-                                             m->msg_iov);
-                }
-                else if (dest->addrtype == TIPC_ADDR_ID) {
-                        res = tipc_send2port(tsock->p->ref,
-                                             &dest->addr.id,
-                                             m->msg_iovlen,
-                                             m->msg_iov);
-                }
-                else if (dest->addrtype == TIPC_ADDR_MCAST) {
+       do {
+               if (dest->addrtype == TIPC_ADDR_NAME) {
+                       if ((res = dest_name_check(dest, m)))
+                               goto exit;
+                       res = tipc_send2name(tsock->p->ref,
+                                            &dest->addr.name.name,
+                                            dest->addr.name.domain,
+                                            m->msg_iovlen,
+                                            m->msg_iov);
+               }
+               else if (dest->addrtype == TIPC_ADDR_ID) {
+                       res = tipc_send2port(tsock->p->ref,
+                                            &dest->addr.id,
+                                            m->msg_iovlen,
+                                            m->msg_iov);
+               }
+               else if (dest->addrtype == TIPC_ADDR_MCAST) {
                        if (needs_conn) {
                                res = -EOPNOTSUPP;
                                goto exit;
                        }
-                        if ((res = dest_name_check(dest, m)))
-                                goto exit;
-                        res = tipc_multicast(tsock->p->ref,
-                                             &dest->addr.nameseq,
-                                             0,
-                                             m->msg_iovlen,
-                                             m->msg_iov);
-                }
-                if (likely(res != -ELINKCONG)) {
-exit:                                
-                        up(&tsock->sem);
-                        return res;
-                }
+                       if ((res = dest_name_check(dest, m)))
+                               goto exit;
+                       res = tipc_multicast(tsock->p->ref,
+                                            &dest->addr.nameseq,
+                                            0,
+                                            m->msg_iovlen,
+                                            m->msg_iov);
+               }
+               if (likely(res != -ELINKCONG)) {
+exit:
+                       up(&tsock->sem);
+                       return res;
+               }
                if (m->msg_flags & MSG_DONTWAIT) {
                        res = -EWOULDBLOCK;
                        goto exit;
                }
-                if (wait_event_interruptible(*sock->sk->sk_sleep,
-                                             !tsock->p->congested)) {
-                    res = -ERESTARTSYS;
-                    goto exit;
-                }
-        } while (1);
+               if (wait_event_interruptible(*sock->sk->sk_sleep,
+                                            !tsock->p->congested)) {
+                   res = -ERESTARTSYS;
+                   goto exit;
+               }
+       } while (1);
 }
 
-/** 
+/**
  * send_packet - send a connection-oriented message
  * @iocb: (unused)
  * @sock: socket structure
  * @m: message to send
  * @total_len: length of message
- * 
+ *
  * Used for SOCK_SEQPACKET messages and SOCK_STREAM data.
- * 
+ *
  * Returns the number of bytes sent on success, or errno otherwise
  */
 
@@ -551,7 +551,7 @@ static int send_packet(struct kiocb *iocb, struct socket *sock,
                       struct msghdr *m, size_t total_len)
 {
        struct tipc_sock *tsock = tipc_sk(sock->sk);
-        struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name;
+       struct sockaddr_tipc *dest = (struct sockaddr_tipc *)m->msg_name;
        int res;
 
        /* Handle implied connection establishment */
@@ -561,45 +561,45 @@ static int send_packet(struct kiocb *iocb, struct socket *sock,
 
        if (down_interruptible(&tsock->sem)) {
                return -ERESTARTSYS;
-        }
+       }
 
-        do {
+       do {
                if (unlikely(sock->state != SS_CONNECTED)) {
                        if (sock->state == SS_DISCONNECTING)
-                               res = -EPIPE;   
+                               res = -EPIPE;
                        else
                                res = -ENOTCONN;
                        goto exit;
                }
 
-                res = tipc_send(tsock->p->ref, m->msg_iovlen, m->msg_iov);
-                if (likely(res != -ELINKCONG)) {
+               res = tipc_send(tsock->p->ref, m->msg_iovlen, m->msg_iov);
+               if (likely(res != -ELINKCONG)) {
 exit:
-                        up(&tsock->sem);
-                        return res;
-                }
+                       up(&tsock->sem);
+                       return res;
+               }
                if (m->msg_flags & MSG_DONTWAIT) {
                        res = -EWOULDBLOCK;
                        goto exit;
                }
-                if (wait_event_interruptible(*sock->sk->sk_sleep,
-                                             !tsock->p->congested)) {
-                    res = -ERESTARTSYS;
-                    goto exit;
-                }
-        } while (1);
+               if (wait_event_interruptible(*sock->sk->sk_sleep,
+                                            !tsock->p->congested)) {
+                   res = -ERESTARTSYS;
+                   goto exit;
+               }
+       } while (1);
 }
 
-/** 
+/**
  * send_stream - send stream-oriented data
  * @iocb: (unused)
  * @sock: socket structure
  * @m: data to send
  * @total_len: total length of data to be sent
- * 
+ *
  * Used for SOCK_STREAM data.
- * 
- * Returns the number of bytes sent on success (or partial success), 
+ *
+ * Returns the number of bytes sent on success (or partial success),
  * or errno if no data sent
  */
 
@@ -616,26 +616,26 @@ static int send_stream(struct kiocb *iocb, struct socket *sock,
        int bytes_to_send;
        int bytes_sent;
        int res;
-       
+
        if (likely(total_len <= TIPC_MAX_USER_MSG_SIZE))
                return send_packet(iocb, sock, m, total_len);
 
        /* Can only send large data streams if already connected */
 
-        if (unlikely(sock->state != SS_CONNECTED)) {
-                if (sock->state == SS_DISCONNECTING)
-                        return -EPIPE;   
-                else
-                        return -ENOTCONN;
-        }
+       if (unlikely(sock->state != SS_CONNECTED)) {
+               if (sock->state == SS_DISCONNECTING)
+                       return -EPIPE;
+               else
+                       return -ENOTCONN;
+       }
 
        if (unlikely(m->msg_name))
                return -EISCONN;
 
-       /* 
+       /*
         * Send each iovec entry using one or more messages
         *
-        * Note: This algorithm is good for the most likely case 
+        * Note: This algorithm is good for the most likely case
         * (i.e. one large iovec entry), but could be improved to pass sets
         * of small iovec entries into send_packet().
         */
@@ -657,7 +657,7 @@ static int send_stream(struct kiocb *iocb, struct socket *sock,
                                ? curr_left : TIPC_MAX_USER_MSG_SIZE;
                        my_iov.iov_base = curr_start;
                        my_iov.iov_len = bytes_to_send;
-                        if ((res = send_packet(iocb, sock, &my_msg, 0)) < 0) {
+                       if ((res = send_packet(iocb, sock, &my_msg, 0)) < 0) {
                                return bytes_sent ? bytes_sent : res;
                        }
                        curr_left -= bytes_to_send;
@@ -676,11 +676,11 @@ static int send_stream(struct kiocb *iocb, struct socket *sock,
  * @sock: socket structure
  * @tsock: TIPC-specific socket structure
  * @msg: peer's response message
- * 
+ *
  * Returns 0 on success, errno otherwise
  */
 
-static int auto_connect(struct socket *sock, struct tipc_sock *tsock, 
+static int auto_connect(struct socket *sock, struct tipc_sock *tsock,
                        struct tipc_msg *msg)
 {
        struct tipc_portid peer;
@@ -702,15 +702,15 @@ static int auto_connect(struct socket *sock, struct tipc_sock *tsock,
  * set_orig_addr - capture sender's address for received message
  * @m: descriptor for message info
  * @msg: received message header
- * 
+ *
  * Note: Address is not captured if not requested by receiver.
  */
 
 static void set_orig_addr(struct msghdr *m, struct tipc_msg *msg)
 {
-        struct sockaddr_tipc *addr = (struct sockaddr_tipc *)m->msg_name;
+       struct sockaddr_tipc *addr = (struct sockaddr_tipc *)m->msg_name;
 
-        if (addr) {
+       if (addr) {
                addr->family = AF_TIPC;
                addr->addrtype = TIPC_ADDR_ID;
                addr->addr.id.ref = msg_origport(msg);
@@ -722,13 +722,13 @@ static void set_orig_addr(struct msghdr *m, struct tipc_msg *msg)
 }
 
 /**
- * anc_data_recv - optionally capture ancillary data for received message 
+ * anc_data_recv - optionally capture ancillary data for received message
  * @m: descriptor for message info
  * @msg: received message header
  * @tport: TIPC port associated with message
- * 
+ *
  * Note: Ancillary data is not captured if not requested by receiver.
- * 
+ *
  * Returns 0 if successful, otherwise errno
  */
 
@@ -753,7 +753,7 @@ static int anc_data_recv(struct msghdr *m, struct tipc_msg *msg,
                if ((res = put_cmsg(m, SOL_TIPC, TIPC_ERRINFO, 8, anc_data)))
                        return res;
                if (anc_data[1] &&
-                   (res = put_cmsg(m, SOL_TIPC, TIPC_RETDATA, anc_data[1], 
+                   (res = put_cmsg(m, SOL_TIPC, TIPC_RETDATA, anc_data[1],
                                    msg_data(msg))))
                        return res;
        }
@@ -790,13 +790,13 @@ static int anc_data_recv(struct msghdr *m, struct tipc_msg *msg,
        return 0;
 }
 
-/** 
+/**
  * recv_msg - receive packet-oriented message
  * @iocb: (unused)
  * @m: descriptor for message info
  * @buf_len: total size of user buffer area
  * @flags: receive flags
- * 
+ *
  * Used for SOCK_DGRAM, SOCK_RDM, and SOCK_SEQPACKET messages.
  * If the complete message doesn't fit in user area, truncate it.
  *
@@ -827,9 +827,9 @@ static int recv_msg(struct kiocb *iocb, struct socket *sock,
        if (sock->type == SOCK_SEQPACKET) {
                if (unlikely(sock->state == SS_UNCONNECTED))
                        return -ENOTCONN;
-               if (unlikely((sock->state == SS_DISCONNECTING) && 
+               if (unlikely((sock->state == SS_DISCONNECTING) &&
                             (skb_queue_len(&sock->sk->sk_receive_queue) == 0)))
-                       return -ENOTCONN;
+                       return -ENOTCONN;
        }
 
        /* Look for a message in receive queue; wait if necessary */
@@ -845,7 +845,7 @@ restart:
        }
 
        if ((res = wait_event_interruptible(
-               *sock->sk->sk_sleep, 
+               *sock->sk->sk_sleep,
                ((q_len = skb_queue_len(&sock->sk->sk_receive_queue)) ||
                 (sock->state == SS_DISCONNECTING))) )) {
                goto exit;
@@ -890,7 +890,7 @@ restart:
                goto exit;
 
        /* Capture message data (if valid) & compute return value (always) */
-       
+
        if (!err) {
                if (unlikely(buf_len < sz)) {
                        sz = buf_len;
@@ -913,23 +913,23 @@ restart:
        /* Consume received message (optional) */
 
        if (likely(!(flags & MSG_PEEK))) {
-                if (unlikely(++tsock->p->conn_unacked >= TIPC_FLOW_CONTROL_WIN))
-                        tipc_acknowledge(tsock->p->ref, tsock->p->conn_unacked);
+               if (unlikely(++tsock->p->conn_unacked >= TIPC_FLOW_CONTROL_WIN))
+                       tipc_acknowledge(tsock->p->ref, tsock->p->conn_unacked);
                advance_queue(tsock);
-        }
+       }
 exit:
        up(&tsock->sem);
        return res;
 }
 
-/** 
+/**
  * recv_stream - receive stream-oriented data
  * @iocb: (unused)
  * @m: descriptor for message info
  * @buf_len: total size of user buffer area
  * @flags: receive flags
- * 
- * Used for SOCK_STREAM messages only.  If not enough data is available 
+ *
+ * Used for SOCK_STREAM messages only.  If not enough data is available
  * will optionally wait for more; never truncates data.
  *
  * Returns size of returned message data, errno otherwise
@@ -980,7 +980,7 @@ restart:
        }
 
        if ((res = wait_event_interruptible(
-               *sock->sk->sk_sleep, 
+               *sock->sk->sk_sleep,
                ((q_len = skb_queue_len(&sock->sk->sk_receive_queue)) ||
                 (sock->state == SS_DISCONNECTING))) )) {
                goto exit;
@@ -1017,7 +1017,7 @@ restart:
        }
 
        /* Capture message data (if valid) & compute return value (always) */
-       
+
        if (!err) {
                buf_crs = (unsigned char *)(TIPC_SKB_CB(buf)->handle);
                sz = buf->tail - buf_crs;
@@ -1050,14 +1050,14 @@ restart:
        /* Consume received message (optional) */
 
        if (likely(!(flags & MSG_PEEK))) {
-                if (unlikely(++tsock->p->conn_unacked >= TIPC_FLOW_CONTROL_WIN))
-                        tipc_acknowledge(tsock->p->ref, tsock->p->conn_unacked);
+               if (unlikely(++tsock->p->conn_unacked >= TIPC_FLOW_CONTROL_WIN))
+                       tipc_acknowledge(tsock->p->ref, tsock->p->conn_unacked);
                advance_queue(tsock);
-        }
+       }
 
        /* Loop around if more data is required */
 
-       if ((sz_copied < buf_len)    /* didn't get all requested data */ 
+       if ((sz_copied < buf_len)    /* didn't get all requested data */
            && (flags & MSG_WAITALL) /* ... and need to wait for more */
            && (!(flags & MSG_PEEK)) /* ... and aren't just peeking at data */
            && (!err)                /* ... and haven't reached a FIN */
@@ -1074,7 +1074,7 @@ exit:
  * @queue_size: current size of queue
  * @base: nominal maximum size of queue
  * @msg: message to be added to queue
- * 
+ *
  * Returns 1 if queue is currently overloaded, 0 otherwise
  */
 
@@ -1098,7 +1098,7 @@ static int queue_overloaded(u32 queue_size, u32 base, struct tipc_msg *msg)
        return (queue_size > threshold);
 }
 
-/** 
+/**
  * async_disconnect - wrapper function used to disconnect port
  * @portref: TIPC port reference (passed as pointer-sized value)
  */
@@ -1108,13 +1108,13 @@ static void async_disconnect(unsigned long portref)
        tipc_disconnect((u32)portref);
 }
 
-/** 
+/**
  * dispatch - handle arriving message
  * @tport: TIPC port that received message
  * @buf: message
- * 
+ *
  * Called with port locked.  Must not take socket lock to avoid deadlock risk.
- * 
+ *
  * Returns TIPC error status code (TIPC_OK if message is not to be rejected)
  */
 
@@ -1159,13 +1159,13 @@ static u32 dispatch(struct tipc_port *tport, struct sk_buff *buf)
                                msg_dbg(msg, "dispatch filter 4\n");
                                return TIPC_ERR_NO_PORT;
                        }
-               } 
+               }
                else if (sock->state == SS_LISTENING) {
                        if (msg_connected(msg) || msg_errcode(msg)) {
                                msg_dbg(msg, "dispatch filter 5\n");
                                return TIPC_ERR_NO_PORT;
                        }
-               } 
+               }
                else if (sock->state == SS_DISCONNECTING) {
                        msg_dbg(msg, "dispatch filter 6\n");
                        return TIPC_ERR_NO_PORT;
@@ -1180,18 +1180,18 @@ static u32 dispatch(struct tipc_port *tport, struct sk_buff *buf)
 
        /* Reject message if there isn't room to queue it */
 
-       if (unlikely((u32)atomic_read(&tipc_queue_size) > 
+       if (unlikely((u32)atomic_read(&tipc_queue_size) >
                     OVERLOAD_LIMIT_BASE)) {
-               if (queue_overloaded(atomic_read(&tipc_queue_size), 
+               if (queue_overloaded(atomic_read(&tipc_queue_size),
                                     OVERLOAD_LIMIT_BASE, msg))
                        return TIPC_ERR_OVERLOAD;
-        }
+       }
        recv_q_len = skb_queue_len(&tsock->sk.sk_receive_queue);
        if (unlikely(recv_q_len > (OVERLOAD_LIMIT_BASE / 2))) {
-               if (queue_overloaded(recv_q_len, 
-                                    OVERLOAD_LIMIT_BASE / 2, msg)) 
+               if (queue_overloaded(recv_q_len,
+                                    OVERLOAD_LIMIT_BASE / 2, msg))
                        return TIPC_ERR_OVERLOAD;
-        }
+       }
 
        /* Initiate connection termination for an incoming 'FIN' */
 
@@ -1213,10 +1213,10 @@ static u32 dispatch(struct tipc_port *tport, struct sk_buff *buf)
        return TIPC_OK;
 }
 
-/** 
+/**
  * wakeupdispatch - wake up port after congestion
  * @tport: port to wakeup
- * 
+ *
  * Called with port lock on.
  */
 
@@ -1238,7 +1238,7 @@ static void wakeupdispatch(struct tipc_port *tport)
  * Returns 0 on success, errno otherwise
  */
 
-static int connect(struct socket *sock, struct sockaddr *dest, int destlen, 
+static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
                   int flags)
 {
    struct tipc_sock *tsock = tipc_sk(sock->sk);
@@ -1260,7 +1260,7 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
    if (sock->state == SS_CONNECTING)
           return -EALREADY;
    if (sock->state != SS_UNCONNECTED)
-           return -EISCONN;
+          return -EISCONN;
 
    /*
     * Reject connection attempt using multicast address
@@ -1270,7 +1270,7 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
     */
 
    if (dst->addrtype == TIPC_ADDR_MCAST)
-           return -EINVAL;
+          return -EINVAL;
 
    /* Send a 'SYN-' to destination */
 
@@ -1281,19 +1281,19 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
           return res;
    }
 
-   if (down_interruptible(&tsock->sem)) 
-           return -ERESTARTSYS;
-       
+   if (down_interruptible(&tsock->sem))
+          return -ERESTARTSYS;
+
    /* Wait for destination's 'ACK' response */
 
    res = wait_event_interruptible_timeout(*sock->sk->sk_sleep,
-                                          skb_queue_len(&sock->sk->sk_receive_queue),
+                                         skb_queue_len(&sock->sk->sk_receive_queue),
                                          sock->sk->sk_rcvtimeo);
    buf = skb_peek(&sock->sk->sk_receive_queue);
    if (res > 0) {
           msg = buf_msg(buf);
-           res = auto_connect(sock, tsock, msg);
-           if (!res) {
+          res = auto_connect(sock, tsock, msg);
+          if (!res) {
                   if (!msg_data_sz(msg))
                           advance_queue(tsock);
           }
@@ -1301,7 +1301,7 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
           if (res == 0) {
                   res = -ETIMEDOUT;
           } else
-                  { /* leave "res" unchanged */ }
+                  { /* leave "res" unchanged */ }
           sock->state = SS_DISCONNECTING;
    }
 
@@ -1309,11 +1309,11 @@ static int connect(struct socket *sock, struct sockaddr *dest, int destlen,
    return res;
 }
 
-/** 
+/**
  * listen - allow socket to listen for incoming connections
  * @sock: socket structure
  * @len: (unused)
- * 
+ *
  * Returns 0 on success, errno otherwise
  */
 
@@ -1326,15 +1326,15 @@ static int listen(struct socket *sock, int len)
        if (sock->state != SS_UNCONNECTED)
                return -EINVAL;
        sock->state = SS_LISTENING;
-        return 0;
+       return 0;
 }
 
-/** 
+/**
  * accept - wait for connection request
  * @sock: listening socket
  * @newsock: new socket that is to be connected
  * @flags: file-related flags associated with socket
- * 
+ *
  * Returns 0 on success, errno otherwise
  */
 
@@ -1348,15 +1348,15 @@ static int accept(struct socket *sock, struct socket *newsock, int flags)
                return -EOPNOTSUPP;
        if (sock->state != SS_LISTENING)
                return -EINVAL;
-       
-       if (unlikely((skb_queue_len(&sock->sk->sk_receive_queue) == 0) && 
+
+       if (unlikely((skb_queue_len(&sock->sk->sk_receive_queue) == 0) &&
                     (flags & O_NONBLOCK)))
                return -EWOULDBLOCK;
 
        if (down_interruptible(&tsock->sem))
                return -ERESTARTSYS;
 
-       if (wait_event_interruptible(*sock->sk->sk_sleep, 
+       if (wait_event_interruptible(*sock->sk->sk_sleep,
                                     skb_queue_len(&sock->sk->sk_receive_queue))) {
                res = -ERESTARTSYS;
                goto exit;
@@ -1381,18 +1381,18 @@ static int accept(struct socket *sock, struct socket *newsock, int flags)
                        new_tsock->p->conn_instance = msg_nameinst(msg);
                }
 
-               /* 
+              /*
                 * Respond to 'SYN-' by discarding it & returning 'ACK'-.
                 * Respond to 'SYN+' by queuing it on new socket.
                 */
 
                msg_dbg(msg,"<ACC<: ");
-                if (!msg_data_sz(msg)) {
-                        struct msghdr m = {NULL,};
+               if (!msg_data_sz(msg)) {
+                       struct msghdr m = {NULL,};
 
-                        send_packet(NULL, newsock, &m, 0);
-                        advance_queue(tsock);
-                } else {
+                       send_packet(NULL, newsock, &m, 0);
+                       advance_queue(tsock);
+               } else {
                        sock_lock(tsock);
                        skb_dequeue(&sock->sk->sk_receive_queue);
                        sock_unlock(tsock);
@@ -1410,7 +1410,7 @@ exit:
  * @how: direction to close (unused; always treated as read + write)
  *
  * Terminates connection (if necessary), then purges socket's receive queue.
- * 
+ *
  * Returns 0 on success, errno otherwise
  */
 
@@ -1483,32 +1483,32 @@ restart:
  * @opt: option identifier
  * @ov: pointer to new option value
  * @ol: length of option value
- * 
- * For stream sockets only, accepts and ignores all IPPROTO_TCP options 
+ *
+ * For stream sockets only, accepts and ignores all IPPROTO_TCP options
  * (to ease compatibility).
- * 
+ *
  * Returns 0 on success, errno otherwise
  */
 
-static int setsockopt(struct socket *sock, 
+static int setsockopt(struct socket *sock,
                      int lvl, int opt, char __user *ov, int ol)
 {
        struct tipc_sock *tsock = tipc_sk(sock->sk);
        u32 value;
        int res;
 
-        if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM))
-                return 0;
+       if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM))
+               return 0;
        if (lvl != SOL_TIPC)
                return -ENOPROTOOPT;
        if (ol < sizeof(value))
                return -EINVAL;
-        if ((res = get_user(value, (u32 __user *)ov)))
+       if ((res = get_user(value, (u32 __user *)ov)))
                return res;
 
-       if (down_interruptible(&tsock->sem)) 
+       if (down_interruptible(&tsock->sem))
                return -ERESTARTSYS;
-       
+
        switch (opt) {
        case TIPC_IMPORTANCE:
                res = tipc_set_portimportance(tsock->p->ref, value);
@@ -1516,7 +1516,7 @@ static int setsockopt(struct socket *sock,
        case TIPC_SRC_DROPPABLE:
                if (sock->type != SOCK_STREAM)
                        res = tipc_set_portunreliable(tsock->p->ref, value);
-               else 
+               else
                        res = -ENOPROTOOPT;
                break;
        case TIPC_DEST_DROPPABLE:
@@ -1540,29 +1540,29 @@ static int setsockopt(struct socket *sock,
  * @opt: option identifier
  * @ov: receptacle for option value
  * @ol: receptacle for length of option value
- * 
- * For stream sockets only, returns 0 length result for all IPPROTO_TCP options 
+ *
+ * For stream sockets only, returns 0 length result for all IPPROTO_TCP options
  * (to ease compatibility).
- * 
+ *
  * Returns 0 on success, errno otherwise
  */
 
-static int getsockopt(struct socket *sock, 
+static int getsockopt(struct socket *sock,
                      int lvl, int opt, char __user *ov, int __user *ol)
 {
        struct tipc_sock *tsock = tipc_sk(sock->sk);
-        int len;
+       int len;
        u32 value;
-        int res;
+       int res;
 
-        if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM))
-                return put_user(0, ol);
+       if ((lvl == IPPROTO_TCP) && (sock->type == SOCK_STREAM))
+               return put_user(0, ol);
        if (lvl != SOL_TIPC)
                return -ENOPROTOOPT;
-        if ((res = get_user(len, ol)))
-                return res;
+       if ((res = get_user(len, ol)))
+               return res;
 
-       if (down_interruptible(&tsock->sem)) 
+       if (down_interruptible(&tsock->sem))
                return -ERESTARTSYS;
 
        switch (opt) {
@@ -1595,30 +1595,30 @@ static int getsockopt(struct socket *sock,
                res = put_user(sizeof(value), ol);
        }
 
-        up(&tsock->sem);
+       up(&tsock->sem);
        return res;
 }
 
 /**
  * Placeholders for non-implemented functionality
- * 
+ *
  * Returns error code (POSIX-compliant where defined)
  */
 
 static int ioctl(struct socket *s, u32 cmd, unsigned long arg)
 {
-        return -EINVAL;
+       return -EINVAL;
 }
 
 static int no_mmap(struct file *file, struct socket *sock,
-                   struct vm_area_struct *vma)
+                  struct vm_area_struct *vma)
 {
-        return -EINVAL;
+       return -EINVAL;
 }
 static ssize_t no_sendpage(struct socket *sock, struct page *page,
-                           int offset, size_t size, int flags)
+                          int offset, size_t size, int flags)
 {
-        return -EINVAL;
+       return -EINVAL;
 }
 
 static int no_skpair(struct socket *s1, struct socket *s2)
@@ -1647,8 +1647,8 @@ static struct proto_ops msg_ops = {
        .getsockopt     = getsockopt,
        .sendmsg        = send_msg,
        .recvmsg        = recv_msg,
-        .mmap          = no_mmap,
-        .sendpage      = no_sendpage
+       .mmap           = no_mmap,
+       .sendpage       = no_sendpage
 };
 
 static struct proto_ops packet_ops = {
@@ -1668,8 +1668,8 @@ static struct proto_ops packet_ops = {
        .getsockopt     = getsockopt,
        .sendmsg        = send_packet,
        .recvmsg        = recv_msg,
-        .mmap          = no_mmap,
-        .sendpage      = no_sendpage
+       .mmap           = no_mmap,
+       .sendpage       = no_sendpage
 };
 
 static struct proto_ops stream_ops = {
@@ -1689,8 +1689,8 @@ static struct proto_ops stream_ops = {
        .getsockopt     = getsockopt,
        .sendmsg        = send_stream,
        .recvmsg        = recv_stream,
-        .mmap          = no_mmap,
-        .sendpage      = no_sendpage
+       .mmap           = no_mmap,
+       .sendpage       = no_sendpage
 };
 
 static struct net_proto_family tipc_family_ops = {
@@ -1707,14 +1707,14 @@ static struct proto tipc_proto = {
 
 /**
  * tipc_socket_init - initialize TIPC socket interface
- * 
+ *
  * Returns 0 on success, errno otherwise
  */
 int tipc_socket_init(void)
 {
        int res;
 
-        res = proto_register(&tipc_proto, 1);
+       res = proto_register(&tipc_proto, 1);
        if (res) {
                err("Failed to register TIPC protocol type\n");
                goto out;
index ddade7388aa065b1b3a7be8f3c70dc76d31d7283..8c01ccd3626ce6cc26a7da35d748c789e29a0053 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/subscr.c: TIPC subscription service
- * 
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
  * @port_ref: object reference to port used to communicate with subscriber
  * @swap: indicates if subscriber uses opposite endianness in its messages
  */
+
 struct subscriber {
        u32 ref;
-        spinlock_t *lock;
+       spinlock_t *lock;
        struct list_head subscriber_list;
        struct list_head subscription_list;
        u32 port_ref;
@@ -82,7 +82,7 @@ static struct top_srv topsrv = { 0 };
  * htohl - convert value to endianness used by destination
  * @in: value to convert
  * @swap: non-zero if endianness must be reversed
- * 
+ *
  * Returns converted value
  */
 
@@ -97,11 +97,11 @@ static u32 htohl(u32 in, int swap)
  * subscr_send_event - send a message containing a tipc_event to the subscriber
  */
 
-static void subscr_send_event(struct subscription *sub, 
-                             u32 found_lower, 
+static void subscr_send_event(struct subscription *sub,
+                             u32 found_lower,
                              u32 found_upper,
-                             u32 event, 
-                             u32 port_ref, 
+                             u32 event,
+                             u32 port_ref,
                              u32 node)
 {
        struct iovec msg_sect;
@@ -123,8 +123,8 @@ static void subscr_send_event(struct subscription *sub,
  * Returns 1 if there is overlap, otherwise 0.
  */
 
-int tipc_subscr_overlap(struct subscription *sub, 
-                       u32 found_lower, 
+int tipc_subscr_overlap(struct subscription *sub,
+                       u32 found_lower,
                        u32 found_upper)
 
 {
@@ -139,15 +139,15 @@ int tipc_subscr_overlap(struct subscription *sub,
 
 /**
  * tipc_subscr_report_overlap - issue event if there is subscription overlap
- * 
+ *
  * Protected by nameseq.lock in name_table.c
  */
 
-void tipc_subscr_report_overlap(struct subscription *sub, 
-                               u32 found_lower, 
+void tipc_subscr_report_overlap(struct subscription *sub,
+                               u32 found_lower,
                                u32 found_upper,
-                               u32 event, 
-                               u32 port_ref, 
+                               u32 event,
+                               u32 port_ref,
                                u32 node,
                                int must)
 {
@@ -189,11 +189,11 @@ static void subscr_timeout(struct subscription *sub)
 
        /* Notify subscriber of timeout, then unlink subscription */
 
-       subscr_send_event(sub, 
-                         sub->evt.s.seq.lower, 
+       subscr_send_event(sub,
+                         sub->evt.s.seq.lower,
                          sub->evt.s.seq.upper,
-                         TIPC_SUBSCR_TIMEOUT, 
-                         0, 
+                         TIPC_SUBSCR_TIMEOUT,
+                         0,
                          0);
        list_del(&sub->subscription_list);
 
@@ -221,11 +221,11 @@ static void subscr_del(struct subscription *sub)
 
 /**
  * subscr_terminate - terminate communication with a subscriber
- * 
+ *
  * Called with subscriber locked.  Routine must temporarily release this lock
- * to enable subscription timeout routine(s) to finish without deadlocking; 
+ * to enable subscription timeout routine(s) to finish without deadlocking;
  * the lock is then reclaimed to allow caller to release it upon return.
- * (This should work even in the unlikely event some other thread creates 
+ * (This should work even in the unlikely event some other thread creates
  * a new object reference in the interim that uses this lock; this routine will
  * simply wait for it to be released, then claim it.)
  */
@@ -241,7 +241,7 @@ static void subscr_terminate(struct subscriber *subscriber)
        spin_unlock_bh(subscriber->lock);
 
        /* Destroy any existing subscriptions for subscriber */
-       
+
        list_for_each_entry_safe(sub, sub_temp, &subscriber->subscription_list,
                                 subscription_list) {
                if (sub->timeout != TIPC_WAIT_FOREVER) {
@@ -315,7 +315,7 @@ static void subscr_cancel(struct tipc_subscr *s,
 
 /**
  * subscr_subscribe - create subscription for subscriber
- * 
+ *
  * Called with subscriber locked
  */
 
@@ -431,7 +431,7 @@ static void subscr_conn_msg_event(void *usr_handle,
                subscr_terminate(subscriber);
        else
                subscr_subscribe((struct tipc_subscr *)data, subscriber);
-       
+
        spin_unlock_bh(subscriber_lock);
 }
 
@@ -444,7 +444,7 @@ static void subscr_named_msg_event(void *usr_handle,
                                   struct sk_buff **buf,
                                   const unchar *data,
                                   u32 size,
-                                  u32 importance, 
+                                  u32 importance,
                                   struct tipc_portid const *orig,
                                   struct tipc_name_seq const *dest)
 {
@@ -534,22 +534,22 @@ int tipc_subscr_start(void)
                return res;
        }
 
-       res = tipc_createport(topsrv.user_ref,
-                             NULL,
-                             TIPC_CRITICAL_IMPORTANCE,
-                             NULL,
-                             NULL,
-                             NULL,
-                             NULL,
-                             subscr_named_msg_event,
-                             NULL,
-                             NULL,
-                             &topsrv.setup_port);
-       if (res)
+       res = tipc_createport(topsrv.user_ref,
+                             NULL,
+                             TIPC_CRITICAL_IMPORTANCE,
+                             NULL,
+                             NULL,
+                             NULL,
+                             NULL,
+                             subscr_named_msg_event,
+                             NULL,
+                             NULL,
+                             &topsrv.setup_port);
+       if (res)
                goto failed;
 
-       res = tipc_nametbl_publish_rsv(topsrv.setup_port, TIPC_NODE_SCOPE, &seq);
-       if (res)
+       res = tipc_nametbl_publish_rsv(topsrv.setup_port, TIPC_NODE_SCOPE, &seq);
+       if (res)
                goto failed;
 
        spin_unlock_bh(&topsrv.lock);
@@ -571,7 +571,7 @@ void tipc_subscr_stop(void)
 
        if (topsrv.user_ref) {
                tipc_deleteport(topsrv.setup_port);
-               list_for_each_entry_safe(subscriber, subscriber_temp, 
+               list_for_each_entry_safe(subscriber, subscriber_temp,
                                         &topsrv.subscriber_list,
                                         subscriber_list) {
                        tipc_ref_lock(subscriber->ref);
index 1e5090465d2e3ba00756e37027967f916c0ee46e..93a8e674fac1dd4ccd370466156fab217f9d2f27 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/subscr.h: Include file for TIPC subscription service
- * 
+ *
  * Copyright (c) 2003-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
@@ -48,7 +48,7 @@
  * @timer_ref: reference to timer governing subscription duration (may be NULL)
  * @owner: pointer to subscriber object associated with this subscription
  */
+
 struct subscription {
        struct tipc_name_seq seq;
        u32 timeout;
@@ -60,15 +60,15 @@ struct subscription {
        struct subscriber *owner;
 };
 
-int tipc_subscr_overlap(struct subscription * sub, 
-                       u32 found_lower, 
+int tipc_subscr_overlap(struct subscription * sub,
+                       u32 found_lower,
                        u32 found_upper);
 
-void tipc_subscr_report_overlap(struct subscription * sub, 
-                               u32 found_lower, 
+void tipc_subscr_report_overlap(struct subscription * sub,
+                               u32 found_lower,
                                u32 found_upper,
-                               u32 event, 
-                               u32 port_ref, 
+                               u32 event,
+                               u32 port_ref,
                                u32 node,
                                int must_report);
 
index 04d1b9be9c5197ccf4ec6c9c9a401985959d50a0..4146c40cd20b444ecd71b3f2b60d2433a3689c75 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/user_reg.c: TIPC user registry code
- * 
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2004-2005, Wind River Systems
  * All rights reserved.
@@ -40,7 +40,7 @@
 /*
  * TIPC user registry keeps track of users of the tipc_port interface.
  *
- * The registry utilizes an array of "TIPC user" entries; 
+ * The registry utilizes an array of "TIPC user" entries;
  * a user's ID is the index of their associated array entry.
  * Array entry 0 is not used, so userid 0 is not valid;
  * TIPC sometimes uses this value to denote an anonymous user.
@@ -51,7 +51,7 @@
  * struct tipc_user - registered TIPC user info
  * @next: index of next free registry entry (or -1 for an allocated entry)
  * @callback: ptr to routine to call when TIPC mode changes (NULL if none)
- * @usr_handle: user-defined value passed to callback routine 
+ * @usr_handle: user-defined value passed to callback routine
  * @ports: list of user ports owned by the user
  */
 
@@ -71,7 +71,7 @@ static DEFINE_SPINLOCK(reg_lock);
 
 /**
  * reg_init - create TIPC user registry (but don't activate it)
- * 
+ *
  * If registry has been pre-initialized it is left "as is".
  * NOTE: This routine may be called when TIPC is inactive.
  */
@@ -79,7 +79,7 @@ static DEFINE_SPINLOCK(reg_lock);
 static int reg_init(void)
 {
        u32 i;
-       
+
        spin_lock_bh(&reg_lock);
        if (!users) {
                users = kzalloc(USER_LIST_SIZE, GFP_ATOMIC);
@@ -137,7 +137,7 @@ int tipc_reg_start(void)
  */
 
 void tipc_reg_stop(void)
-{               
+{
        int id;
 
        if (!users)
@@ -174,14 +174,14 @@ int tipc_attach(u32 *userid, tipc_mode_event cb, void *usr_handle)
        user_ptr = &users[next_free_user];
        *userid = next_free_user;
        next_free_user = user_ptr->next;
-       user_ptr->next = -1; 
+       user_ptr->next = -1;
        spin_unlock_bh(&reg_lock);
 
        user_ptr->callback = cb;
        user_ptr->usr_handle = usr_handle;
        INIT_LIST_HEAD(&user_ptr->ports);
        atomic_inc(&tipc_user_count);
-       
+
        if (cb && (tipc_mode != TIPC_NOT_RUNNING))
                tipc_k_signal((Handler)reg_callback, (unsigned long)user_ptr);
        return TIPC_OK;
@@ -207,16 +207,16 @@ void tipc_detach(u32 userid)
        }
 
        user_ptr = &users[userid];
-        user_ptr->callback = NULL;              
+       user_ptr->callback = NULL;
        INIT_LIST_HEAD(&ports_temp);
-        list_splice(&user_ptr->ports, &ports_temp);
+       list_splice(&user_ptr->ports, &ports_temp);
        user_ptr->next = next_free_user;
        next_free_user = userid;
        spin_unlock_bh(&reg_lock);
 
        atomic_dec(&tipc_user_count);
 
-        list_for_each_entry_safe(up_ptr, temp_up_ptr, &ports_temp, uport_list) {
+       list_for_each_entry_safe(up_ptr, temp_up_ptr, &ports_temp, uport_list) {
                tipc_deleteport(up_ptr->ref);
        }
 }
index d0e88794ed1b48b938d5390027ba3fea923f3e13..81dc12e2882f02abc575fa1248fabcf3ad2c76a7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/user_reg.h: Include file for TIPC user registry code
- * 
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
index f5b00ea2d5acb2cb77d46d7ec3c2265fe3c16700..114e173f11a5fbbb6b459219984778fe44ebd2d8 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/zone.c: TIPC zone management routines
- * 
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2005, Wind River Systems
  * All rights reserved.
@@ -92,7 +92,7 @@ void tipc_zone_remove_as_router(struct _zone *z_ptr, u32 router)
 
        for (c_num = 1; c_num <= tipc_max_clusters; c_num++) {
                if (z_ptr->clusters[c_num]) {
-                       tipc_cltr_remove_as_router(z_ptr->clusters[c_num], 
+                       tipc_cltr_remove_as_router(z_ptr->clusters[c_num],
                                                   router);
                }
        }
index 5ab3d08602e2528d31dc45f9cea84c656b9dbfb3..6e7a08df8af5bc1ca14b7263d7ed9a033edc3a42 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * net/tipc/zone.h: Include file for TIPC zone management routines
- * 
+ *
  * Copyright (c) 2000-2006, Ericsson AB
  * Copyright (c) 2005-2006, Wind River Systems
  * All rights reserved.
@@ -47,7 +47,7 @@
  * @clusters: array of pointers to all clusters within zone
  * @links: number of (unicast) links to zone
  */
+
 struct _zone {
        u32 addr;
        struct cluster *clusters[2]; /* currently limited to just 1 cluster */
index 2f208c7f4d435aaef980a37795052609940f608d..606971645b33e0c43e5f8e097144570fa317a80f 100644 (file)
@@ -195,7 +195,7 @@ static inline void unix_release_addr(struct unix_address *addr)
  *             - if started by not zero, should be NULL terminated (FS object)
  *             - if started by zero, it is abstract name.
  */
+
 static int unix_mkname(struct sockaddr_un * sunaddr, int len, unsigned *hashp)
 {
        if (len <= sizeof(short) || len > sizeof(*sunaddr))
@@ -432,7 +432,7 @@ static int unix_release_sock (struct sock *sk, int embrion)
         */
 
        if (atomic_read(&unix_tot_inflight))
-               unix_gc();              /* Garbage collect fds */       
+               unix_gc();              /* Garbage collect fds */
 
        return 0;
 }
@@ -698,7 +698,7 @@ static struct sock *unix_find_other(struct sockaddr_un *sunname, int len,
        struct sock *u;
        struct nameidata nd;
        int err = 0;
-       
+
        if (sunname->sun_path[0]) {
                err = path_lookup(sunname->sun_path, LOOKUP_FOLLOW, &nd);
                if (err)
@@ -915,7 +915,7 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr,
                unix_peer(sk)=other;
                unix_state_wunlock(sk);
        }
-       return 0;
+       return 0;
 
 out_unlock:
        unix_state_wunlock(sk);
@@ -1021,7 +1021,7 @@ restart:
                        goto out;
                sock_put(other);
                goto restart;
-        }
+       }
 
        /* Latch our state.
 
@@ -1415,7 +1415,7 @@ out:
        return err;
 }
 
-               
+
 static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
                               struct msghdr *msg, size_t len)
 {
@@ -1467,11 +1467,11 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
 
                if (size > SKB_MAX_ALLOC)
                        size = SKB_MAX_ALLOC;
-                       
+
                /*
                 *      Grab a buffer
                 */
-                
+
                skb=sock_alloc_send_skb(sk,size,msg->msg_flags&MSG_DONTWAIT, &err);
 
                if (skb==NULL)
@@ -1530,7 +1530,7 @@ static int unix_seqpacket_sendmsg(struct kiocb *kiocb, struct socket *sock,
 {
        int err;
        struct sock *sk = sock->sk;
-       
+
        err = sock_error(sk);
        if (err)
                return err;
@@ -1543,7 +1543,7 @@ static int unix_seqpacket_sendmsg(struct kiocb *kiocb, struct socket *sock,
 
        return unix_dgram_sendmsg(kiocb, sock, msg, len);
 }
-                                                                                            
+
 static void unix_copy_addr(struct msghdr *msg, struct sock *sk)
 {
        struct unix_sock *u = unix_sk(sk);
@@ -1605,7 +1605,7 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,
                if (UNIXCB(skb).fp)
                        unix_detach_fds(siocb->scm, skb);
        }
-       else 
+       else
        {
                /* It is questionable: on PEEK we could:
                   - do not return fds - good, but too simple 8)
@@ -1613,11 +1613,11 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,
                     apparently wrong)
                   - clone fds (I chose it for now, it is the most universal
                     solution)
-               
-                  POSIX 1003.1g does not actually define this clearly
-                  at all. POSIX 1003.1g doesn't define a lot of things
-                  clearly however!                  
-                  
+
+                  POSIX 1003.1g does not actually define this clearly
+                  at all. POSIX 1003.1g doesn't define a lot of things
+                  clearly however!
+
                */
                if (UNIXCB(skb).fp)
                        siocb->scm->fp = scm_fp_dup(UNIXCB(skb).fp);
@@ -1637,7 +1637,7 @@ out:
 /*
  *     Sleep until data has arrive. But check for races..
  */
+
 static long unix_stream_data_wait(struct sock * sk, long timeo)
 {
        DEFINE_WAIT(wait);
@@ -1721,7 +1721,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock,
                        /*
                         *      POSIX 1003.1g mandates this order.
                         */
-                        
+
                        if ((err = sock_error(sk)) != 0)
                                break;
                        if (sk->sk_shutdown & RCV_SHUTDOWN)
@@ -1937,7 +1937,7 @@ static struct sock *unix_seq_idx(int *iter, loff_t pos)
        struct sock *s;
 
        for (s = first_unix_socket(iter); s; s = next_unix_socket(iter, s)) {
-               if (off == pos) 
+               if (off == pos)
                        return s;
                ++off;
        }
@@ -1955,7 +1955,7 @@ static void *unix_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        ++*pos;
 
-       if (v == (void *)1) 
+       if (v == (void *)1)
                return first_unix_socket(seq->private);
        return next_unix_socket(seq->private, v);
 }
@@ -1967,7 +1967,7 @@ static void unix_seq_stop(struct seq_file *seq, void *v)
 
 static int unix_seq_show(struct seq_file *seq, void *v)
 {
-       
+
        if (v == (void *)1)
                seq_puts(seq, "Num       RefCount Protocol Flags    Type St "
                         "Inode Path\n");
@@ -2040,7 +2040,7 @@ out_kfree:
        goto out;
 }
 
-static struct file_operations unix_seq_fops = {
+static const struct file_operations unix_seq_fops = {
        .owner          = THIS_MODULE,
        .open           = unix_seq_open,
        .read           = seq_read,
@@ -2064,8 +2064,8 @@ static int __init af_unix_init(void)
        BUILD_BUG_ON(sizeof(struct unix_skb_parms) > sizeof(dummy_skb->cb));
 
        rc = proto_register(&unix_proto, 1);
-        if (rc != 0) {
-                printk(KERN_CRIT "%s: Cannot create unix_sock SLAB cache!\n",
+       if (rc != 0) {
+               printk(KERN_CRIT "%s: Cannot create unix_sock SLAB cache!\n",
                       __FUNCTION__);
                goto out;
        }
index f14ad6635fccf15a324831a1d094ed6d529cd8cb..f20b7ea7c5553264b5ecd18fc3e5196a8f012500 100644 (file)
@@ -63,9 +63,8 @@
  *             Damn. Added missing check for ->dead in listen queues scanning.
  *
  */
+
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/string.h>
 #include <linux/socket.h>
 #include <linux/un.h>
@@ -118,7 +117,7 @@ static struct sock *unix_get_socket(struct file *filp)
  *     Keep the number of times in flight count for the file
  *     descriptor if it is for an AF_UNIX socket.
  */
+
 void unix_inflight(struct file *fp)
 {
        struct sock *s = unix_get_socket(fp);
@@ -190,7 +189,7 @@ void unix_gc(void)
                unix_sk(s)->gc_tree = GC_ORPHAN;
        }
        /*
-        *      Everything is now marked 
+        *      Everything is now marked
         */
 
        /* Invariant to be maintained:
@@ -227,7 +226,7 @@ void unix_gc(void)
        }
 
        /*
-        *      Mark phase 
+        *      Mark phase
         */
 
        while (!empty_stack())
@@ -237,11 +236,11 @@ void unix_gc(void)
 
                spin_lock(&x->sk_receive_queue.lock);
                skb = skb_peek(&x->sk_receive_queue);
-               
+
                /*
-                *      Loop through all but first born 
+                *      Loop through all but first born
                 */
-               
+
                while (skb && skb != (struct sk_buff *)&x->sk_receive_queue) {
                        /*
                         *      Do we have file descriptors ?
index 690ffa5d5bfbf5bd5e01e0bf0fa61ca263f68b10..eb0bd57ebadac12b613e0881f9b6566aa0185cc6 100644 (file)
@@ -50,7 +50,7 @@ static struct ctl_table_header * unix_sysctl_header;
 
 void unix_sysctl_register(void)
 {
-       unix_sysctl_header = register_sysctl_table(unix_root_table, 0);
+       unix_sysctl_header = register_sysctl_table(unix_root_table);
 }
 
 void unix_sysctl_unregister(void)
index c2059733e15a10700d7d90dd12308da986027a9c..41d7e32be70dcf847b07879c9b3e65906864fe95 100644 (file)
 *              2 of the License, or (at your option) any later version.
 * ============================================================================
 * Due Credit:
-*               Wanpipe socket layer is based on Packet and 
-*               the X25 socket layers. The above sockets were 
-*               used for the specific use of Sangoma Technologies 
-*               API programs. 
-*               Packet socket Authors: Ross Biro, Fred N. van Kempen and 
+*               Wanpipe socket layer is based on Packet and
+*               the X25 socket layers. The above sockets were
+*               used for the specific use of Sangoma Technologies
+*               API programs.
+*               Packet socket Authors: Ross Biro, Fred N. van Kempen and
 *                                      Alan Cox.
 *               X25 socket Author: Jonathan Naylor.
 * ============================================================================
@@ -28,7 +28,7 @@
 * Feb 29, 2000  Nenad Corbic     o Added support for PVC protocols, such as
 *                                  CHDLC, Frame Relay and HDLC API.
 * Jan 17, 2000         Nenad Corbic     o Initial version, based on AF_PACKET socket.
-*                                 X25API support only. 
+*                                 X25API support only.
 *
 ******************************************************************************/
 
        #define DBG_PRINTK(format, a...) printk(format, ## a)
 #else
        #define DBG_PRINTK(format, a...)
-#endif      
+#endif
 
 
-/* SECURE SOCKET IMPLEMENTATION 
- * 
+/* SECURE SOCKET IMPLEMENTATION
+ *
  *   TRANSMIT:
  *
  *      When the user sends a packet via send() system call
- *      the wanpipe_sendmsg() function is executed.  
- *      
+ *      the wanpipe_sendmsg() function is executed.
+ *
  *      Each packet is enqueud into sk->sk_write_queue transmit
  *      queue. When the packet is enqueued, a delayed transmit
- *      timer is triggerd which acts as a Bottom Half hander. 
+ *      timer is triggerd which acts as a Bottom Half hander.
  *
  *      wanpipe_delay_transmit() function (BH), dequeues packets
- *      from the sk->sk_write_queue transmit queue and sends it 
- *      to the deriver via dev->hard_start_xmit(skb, dev) function.  
+ *      from the sk->sk_write_queue transmit queue and sends it
+ *      to the deriver via dev->hard_start_xmit(skb, dev) function.
  *      Note, this function is actual a function pointer of if_send()
  *      routine in the wanpipe driver.
  *
  *      X25API GUARANTEED DELIVERY:
  *
- *         In order to provide 100% guaranteed packet delivery, 
- *         an atomic 'packet_sent' counter is implemented.  Counter 
- *         is incremented for each packet enqueued 
+ *         In order to provide 100% guaranteed packet delivery,
+ *         an atomic 'packet_sent' counter is implemented.  Counter
+ *         is incremented for each packet enqueued
  *         into sk->sk_write_queue.  Counter is decremented each
- *         time wanpipe_delayed_transmit() function successfuly 
+ *         time wanpipe_delayed_transmit() function successfuly
  *         passes the packet to the driver. Before each send(), a poll
  *         routine checks the sock resources The maximum value of
  *         packet sent counter is 1, thus if one packet is queued, the
  *      function, wanpipe_rcv() to queue the incoming packets
  *      into an AF_WANPIPE socket queue.  Based on wanpipe_rcv()
  *      return code, the driver knows whether the packet was
- *      successfully queued.  If the socket queue is full, 
- *      protocol flow control is used by the driver, if any, 
+ *      successfully queued.  If the socket queue is full,
+ *      protocol flow control is used by the driver, if any,
  *      to slow down the traffic until the sock queue is free.
  *
- *      Every time a packet arrives into a socket queue the 
+ *      Every time a packet arrives into a socket queue the
  *      socket wakes up processes which are waiting to receive
  *      data.
  *
  *      bit which signals the socket to kick the wanpipe driver
  *      bottom half hander when the socket queue is partialy
  *      empty. wanpipe_recvmsg() function performs this action.
- * 
+ *
  *      In case of x25api, packets will never be dropped, since
- *      flow control is available. 
- *      
- *      In case of streaming protocols like CHDLC, packets will 
- *      be dropped but the statistics will be generated. 
+ *      flow control is available.
+ *
+ *      In case of streaming protocols like CHDLC, packets will
+ *      be dropped but the statistics will be generated.
  */
 
 
@@ -170,11 +170,11 @@ struct wanpipe_opt
        struct net_device *dev; /* Bounded device */
        unsigned short lcn;     /* Binded LCN */
        unsigned char  svc;     /* 0=pvc, 1=svc */
-       unsigned char  timer;   /* flag for delayed transmit*/  
+       unsigned char  timer;   /* flag for delayed transmit*/
        struct timer_list tx_timer;
        unsigned poll_cnt;
        unsigned char force;    /* Used to force sock release */
-       atomic_t packet_sent;   
+       atomic_t packet_sent;
 };
 #endif
 
@@ -215,8 +215,8 @@ static int check_driver_busy (struct sock *);
  *
  *     Wanpipe socket bottom half handler.  This function
  *      is called by the WANPIPE device drivers to queue a
- *      incoming packet into the socket receive queue. 
- *      Once the packet is queued, all processes waiting to 
+ *      incoming packet into the socket receive queue.
+ *      Once the packet is queued, all processes waiting to
  *      read are woken up.
  *
  *      During socket bind, this function is bounded into
@@ -245,13 +245,13 @@ static int wanpipe_rcv(struct sk_buff *skb, struct net_device *dev,
        if (dev->hard_header_parse)
                sll->sll_halen = dev->hard_header_parse(skb, sll->sll_addr);
 
-       /* 
+       /*
         * WAN_PACKET_DATA : Data which should be passed up the receive queue.
-         * WAN_PACKET_ASYC : Asynchronous data like place call, which should
-         *                   be passed up the listening sock.
-         * WAN_PACKET_ERR  : Asynchronous data like clear call or restart 
-         *                   which should go into an error queue.
-         */
+        * WAN_PACKET_ASYC : Asynchronous data like place call, which should
+        *                   be passed up the listening sock.
+        * WAN_PACKET_ERR  : Asynchronous data like clear call or restart
+        *                   which should go into an error queue.
+        */
        switch (skb->pkt_type){
 
                case WAN_PACKET_DATA:
@@ -261,10 +261,10 @@ static int wanpipe_rcv(struct sk_buff *skb, struct net_device *dev,
                        break;
                case WAN_PACKET_CMD:
                        sk->sk_state = chan->state;
-                       /* Bug fix: update Mar6. 
-                         * Do not set the sock lcn number here, since
-                        * cmd is not guaranteed to be executed on the
-                         * board, thus Lcn could be wrong */
+                       /* Bug fix: update Mar6.
+                        * Do not set the sock lcn number here, since
+                        * cmd is not guaranteed to be executed on the
+                        * board, thus Lcn could be wrong */
                        sk->sk_data_ready(sk, skb->len);
                        kfree_skb(skb);
                        break;
@@ -276,7 +276,7 @@ static int wanpipe_rcv(struct sk_buff *skb, struct net_device *dev,
                        break;
                default:
                        printk(KERN_INFO "wansock: BH Illegal Packet Type Dropping\n");
-                       kfree_skb(skb); 
+                       kfree_skb(skb);
                        break;
        }
 
@@ -297,20 +297,20 @@ static int wanpipe_rcv(struct sk_buff *skb, struct net_device *dev,
  *
  *     Wanpipe LISTEN socket bottom half handler.  This function
  *      is called by the WANPIPE device drivers to queue an
- *      incoming call into the socket listening queue. 
- *      Once the packet is queued, the waiting accept() process 
+ *      incoming call into the socket listening queue.
+ *      Once the packet is queued, the waiting accept() process
  *      is woken up.
  *
  *      During socket bind, this function is bounded into
- *      WANPIPE driver private. 
- * 
+ *      WANPIPE driver private.
+ *
  *      IMPORTANT NOTE:
  *          The accept call() is waiting for an skb packet
  *          which contains a pointer to a device structure.
  *
- *          When we do a bind to a device structre, we 
- *          bind a newly created socket into "chan->sk".  Thus, 
- *          when accept receives the skb packet, it will know 
+ *          When we do a bind to a device structre, we
+ *          bind a newly created socket into "chan->sk".  Thus,
+ *          when accept receives the skb packet, it will know
  *          from which dev it came form, and in turn it will know
  *          the address of the new sock.
  *
@@ -322,31 +322,31 @@ static int wanpipe_listen_rcv (struct sk_buff *skb,  struct sock *sk)
        wanpipe_opt *wp = wp_sk(sk), *newwp;
        struct wan_sockaddr_ll *sll = (struct wan_sockaddr_ll*)skb->cb;
        struct sock *newsk;
-       struct net_device *dev; 
+       struct net_device *dev;
        sdla_t *card;
        mbox_cmd_t *mbox_ptr;
        wanpipe_common_t *chan;
 
-       /* Find a free device, if none found, all svc's are busy 
-         */
+       /* Find a free device, if none found, all svc's are busy
+        */
 
        card = (sdla_t*)wp->card;
        if (!card){
                printk(KERN_INFO "wansock: LISTEN ERROR, No Card\n");
                return -ENODEV;
        }
-       
+
        dev = wanpipe_find_free_dev(card);
        if (!dev){
                printk(KERN_INFO "wansock: LISTEN ERROR, No Free Device\n");
                return -ENODEV;
        }
 
-       chan=dev->priv; 
+       chan=dev->priv;
        chan->state = WANSOCK_CONNECTING;
 
        /* Allocate a new sock, which accept will bind
-         * and pass up to the user 
+        * and pass up to the user
         */
        if ((newsk = wanpipe_make_new(sk)) == NULL){
                release_device(dev);
@@ -354,33 +354,33 @@ static int wanpipe_listen_rcv (struct sk_buff *skb,  struct sock *sk)
        }
 
 
-       /* Initialize the new sock structure 
+       /* Initialize the new sock structure
         */
        newsk->sk_bound_dev_if = dev->ifindex;
        newwp = wp_sk(newsk);
        newwp->card = wp->card;
 
        /* Insert the sock into the main wanpipe
-         * sock list.
-         */
+        * sock list.
+        */
        atomic_inc(&wanpipe_socks_nr);
 
        /* Allocate and fill in the new Mail Box. Then
-         * bind the mail box to the sock. It will be 
-         * used by the ioctl call to read call information
-         * and to execute commands. 
-         */    
+        * bind the mail box to the sock. It will be
+        * used by the ioctl call to read call information
+        * and to execute commands.
+        */
        if ((mbox_ptr = kzalloc(sizeof(mbox_cmd_t), GFP_ATOMIC)) == NULL) {
                wanpipe_kill_sock_irq (newsk);
-               release_device(dev);            
+               release_device(dev);
                return -ENOMEM;
        }
        memcpy(mbox_ptr,skb->data,skb->len);
 
        /* Register the lcn on which incoming call came
-         * from. Thus, if we have to clear it, we know
-         * which lcn to clear
-        */ 
+        * from. Thus, if we have to clear it, we know
+        * which lcn to clear
+        */
 
        newwp->lcn = mbox_ptr->cmd.lcn;
        newwp->mbox = (void *)mbox_ptr;
@@ -416,20 +416,20 @@ static int wanpipe_listen_rcv (struct sk_buff *skb,  struct sock *sk)
 
        /* We must do this manually, since the sock_queue_rcv_skb()
         * function sets the skb->dev to NULL.  However, we use
-        * the dev field in the accept function.*/ 
-       if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >= 
+        * the dev field in the accept function.*/
+       if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >=
            (unsigned)sk->sk_rcvbuf) {
 
-               wanpipe_unlink_driver(newsk);
+               wanpipe_unlink_driver(newsk);
                wanpipe_kill_sock_irq (newsk);
                --sk->sk_ack_backlog;
                return -ENOMEM;
-       }       
+       }
 
        skb_set_owner_r(skb, sk);
        skb_queue_tail(&sk->sk_receive_queue, skb);
        sk->sk_data_ready(sk, skb->len);
-       
+
        return 0;
 }
 
@@ -474,7 +474,7 @@ static struct sock *wanpipe_make_new(struct sock *osk)
        return sk;
 }
 
-/* 
+/*
  * FIXME: wanpipe_opt has to include a sock in its definition and stop using
  * sk_protinfo, but this code is not even compilable now, so lets leave it for
  * later.
@@ -489,12 +489,12 @@ static struct proto wanpipe_proto = {
  * wanpipe_make_new
  *
  *     Allocate memory for the a new sock, and sock
- *      private data.  
- *     
+ *      private data.
+ *
  *     Increment the module use count.
- *             
- *      This function is used by wanpipe_create() and 
- *      wanpipe_make_new() functions. 
+ *
+ *      This function is used by wanpipe_create() and
+ *      wanpipe_make_new() functions.
  *
  *===========================================================*/
 
@@ -514,7 +514,7 @@ static struct sock *wanpipe_alloc_socket(void)
        wp_sk(sk) = wan_opt;
 
        /* Use timer to send data to the driver. This will act
-         * as a BH handler for sendmsg functions */
+        * as a BH handler for sendmsg functions */
        init_timer(&wan_opt->tx_timer);
        wan_opt->tx_timer.data     = (unsigned long)sk;
        wan_opt->tx_timer.function = wanpipe_delayed_transmit;
@@ -528,14 +528,14 @@ static struct sock *wanpipe_alloc_socket(void)
  * wanpipe_sendmsg
  *
  *     This function implements a sendto() system call,
- *      for AF_WANPIPE socket family. 
+ *      for AF_WANPIPE socket family.
  *      During socket bind() sk->sk_bound_dev_if is initialized
  *      to a correct network device. This number is used
  *      to find a network device to which the packet should
  *      be passed to.
  *
- *      Each packet is queued into sk->sk_write_queue and 
- *      delayed transmit bottom half handler is marked for 
+ *      Each packet is queued into sk->sk_write_queue and
+ *      delayed transmit bottom half handler is marked for
  *      execution.
  *
  *      A socket must be in WANSOCK_CONNECTED state before
@@ -554,18 +554,18 @@ static int wanpipe_sendmsg(struct kiocb *iocb, struct socket *sock,
        unsigned char *addr;
        int ifindex, err, reserve = 0;
 
-       
+
        if (!sock_flag(sk, SOCK_ZAPPED))
                return -ENETDOWN;
 
        if (sk->sk_state != WANSOCK_CONNECTED)
-               return -ENOTCONN;       
+               return -ENOTCONN;
 
-       if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT)) 
+       if (msg->msg_flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT))
                return(-EINVAL);
 
        /* it was <=, now one can send
-         * zero length packets */
+        * zero length packets */
        if (len < sizeof(x25api_hdr_t))
                return -EINVAL;
 
@@ -577,7 +577,7 @@ static int wanpipe_sendmsg(struct kiocb *iocb, struct socket *sock,
                addr    = NULL;
 
        }else{
-               if (msg->msg_namelen < sizeof(struct wan_sockaddr_ll)){ 
+               if (msg->msg_namelen < sizeof(struct wan_sockaddr_ll)){
                        return -EINVAL;
                }
 
@@ -592,12 +592,12 @@ static int wanpipe_sendmsg(struct kiocb *iocb, struct socket *sock,
                return -ENXIO;
        }
        dev_put(dev);
-       
+
        if (sock->type == SOCK_RAW)
                reserve = dev->hard_header_len;
 
        if (len > dev->mtu+reserve){
-               return -EMSGSIZE;
+               return -EMSGSIZE;
        }
 
        skb = sock_alloc_send_skb(sk, len + LL_RESERVED_SPACE(dev),
@@ -606,7 +606,7 @@ static int wanpipe_sendmsg(struct kiocb *iocb, struct socket *sock,
        if (skb==NULL){
                goto out_unlock;
        }
-               
+
        skb_reserve(skb, LL_RESERVED_SPACE(dev));
        skb->nh.raw = skb->data;
 
@@ -645,7 +645,7 @@ static int wanpipe_sendmsg(struct kiocb *iocb, struct socket *sock,
 
        if (!(test_and_set_bit(0, &wp->timer)))
                mod_timer(&wp->tx_timer, jiffies + 1);
-       
+
        return(len);
 
 out_free:
@@ -658,12 +658,12 @@ out_unlock:
  * wanpipe_delayed_tarnsmit
  *
  *     Transmit bottom half handler. It dequeues packets
- *      from sk->sk_write_queue and passes them to the 
- *      driver.  If the driver is busy, the packet is 
- *      re-enqueued.  
+ *      from sk->sk_write_queue and passes them to the
+ *      driver.  If the driver is busy, the packet is
+ *      re-enqueued.
  *
  *      Packet Sent counter is decremented on successful
- *      transmission. 
+ *      transmission.
  *===========================================================*/
 
 
@@ -680,17 +680,17 @@ static void wanpipe_delayed_transmit (unsigned long data)
                DBG_PRINTK(KERN_INFO "wansock: Transmit delay, no dev or card\n");
                return;
        }
-       
+
        if (sk->sk_state != WANSOCK_CONNECTED || !sock_flag(sk, SOCK_ZAPPED)) {
                clear_bit(0, &wp->timer);
                DBG_PRINTK(KERN_INFO "wansock: Tx Timer, State not CONNECTED\n");
                return;
        }
-       
+
        /* If driver is executing command, we must offload
-         * the board by not sending data. Otherwise a 
-         * pending command will never get a free buffer
-         * to execute */       
+        * the board by not sending data. Otherwise a
+        * pending command will never get a free buffer
+        * to execute */
        if (atomic_read(&card->u.x.command_busy)){
                wp->tx_timer.expires = jiffies + SLOW_BACKOFF;
                add_timer(&wp->tx_timer);
@@ -698,30 +698,30 @@ static void wanpipe_delayed_transmit (unsigned long data)
                return;
        }
 
-       
+
        if (test_and_set_bit(0,&wanpipe_tx_critical)){
                printk(KERN_INFO "WanSock: Tx timer critical %s\n",dev->name);
                wp->tx_timer.expires = jiffies + SLOW_BACKOFF;
                add_timer(&wp->tx_timer);
                return;
-       }       
-       
+       }
+
        /* Check for a packet in the fifo and send */
        if ((skb = skb_dequeue(&sk->sk_write_queue)) != NULL){
 
-               if (dev->hard_start_xmit(skb, dev) != 0){                       
+               if (dev->hard_start_xmit(skb, dev) != 0){
 
                        /* Driver failed to transmit, re-enqueue
-                         * the packet and retry again later */
+                        * the packet and retry again later */
                        skb_queue_head(&sk->sk_write_queue,skb);
                        clear_bit(0,&wanpipe_tx_critical);
                        return;
                }else{
 
                        /* Packet Sent successful. Check for more packets
-                         * if more packets, re-trigger the transmit routine 
-                         * other wise exit
-                         */
+                        * if more packets, re-trigger the transmit routine
+                        * other wise exit
+                        */
                        atomic_dec(&wp->packet_sent);
 
                        if (skb_peek(&sk->sk_write_queue) == NULL) {
@@ -741,18 +741,18 @@ static void wanpipe_delayed_transmit (unsigned long data)
 }
 
 /*============================================================
- * execute_command 
+ * execute_command
  *
  *     Execute x25api commands.  The atomic variable
  *      chan->command is used to indicate to the driver that
  *      command is pending for execution.  The acutal command
- *      structure is placed into a sock mbox structure 
+ *      structure is placed into a sock mbox structure
  *      (wp_sk(sk)->mbox).
  *
  *      The sock private structure, mbox is
  *      used as shared memory between sock and the driver.
  *      Driver uses the sock mbox to execute the command
- *      and return the result.  
+ *      and return the result.
  *
  *      For all command except PLACE CALL, the function
  *      waits for the result.  PLACE CALL can be ether
@@ -768,7 +768,7 @@ static int execute_command(struct sock *sk,  unsigned char cmd, unsigned int fla
        wanpipe_common_t *chan=NULL;
        int err=0;
        DECLARE_WAITQUEUE(wait, current);
-       
+
        dev = dev_get_by_index(sk->sk_bound_dev_if);
        if (dev == NULL){
                printk(KERN_INFO "wansock: Exec failed no dev %i\n",
@@ -793,7 +793,7 @@ static int execute_command(struct sock *sk,  unsigned char cmd, unsigned int fla
                return -EINVAL;
        }
 
-       ((mbox_cmd_t*)wp->mbox)->cmd.command = cmd;     
+       ((mbox_cmd_t*)wp->mbox)->cmd.command = cmd;
        ((mbox_cmd_t*)wp->mbox)->cmd.lcn     = wp->lcn;
        ((mbox_cmd_t*)wp->mbox)->cmd.result  = 0x7F;
 
@@ -820,12 +820,12 @@ static int execute_command(struct sock *sk,  unsigned char cmd, unsigned int fla
        }
        current->state = TASK_RUNNING;
        remove_wait_queue(sk->sk_sleep,&wait);
-       
+
        return err;
 }
 
 /*============================================================
- * wanpipe_destroy_timer 
+ * wanpipe_destroy_timer
  *
  *     Used by wanpipe_release, to delay release of
  *      the socket.
@@ -846,7 +846,7 @@ static void wanpipe_destroy_timer(unsigned long data)
 
                kfree(wp);
                wp_sk(sk) = NULL;
-               
+
                if (atomic_read(&sk->sk_refcnt) != 1) {
                        atomic_set(&sk->sk_refcnt, 1);
                        DBG_PRINTK(KERN_INFO "wansock: Error, wrong reference count: %i ! :delay.\n",
@@ -865,9 +865,9 @@ static void wanpipe_destroy_timer(unsigned long data)
 /*============================================================
  * wanpipe_unlink_driver
  *
- *     When the socket is released, this function is 
+ *     When the socket is released, this function is
  *      used to remove links that bind the sock and the
- *      driver together.  
+ *      driver together.
  *===========================================================*/
 static void wanpipe_unlink_driver (struct sock *sk)
 {
@@ -882,7 +882,7 @@ static void wanpipe_unlink_driver (struct sock *sk)
        if (!dev){
                printk(KERN_INFO "wansock: No dev on release\n");
                return;
-       }                       
+       }
        dev_put(dev);
 
        if ((chan = dev->priv) == NULL){
@@ -897,7 +897,7 @@ static void wanpipe_unlink_driver (struct sock *sk)
        chan->tx_timer=NULL;
        clear_bit(0,&chan->common_critical);
        release_device(dev);
-       
+
        return;
 }
 
@@ -931,7 +931,7 @@ static void wanpipe_link_driver(struct net_device *dev, struct sock *sk)
 /*============================================================
  * release_device
  *
- *     During sock release, clear a critical bit, which 
+ *     During sock release, clear a critical bit, which
  *      marks the device a being taken.
  *===========================================================*/
 
@@ -945,8 +945,8 @@ static void release_device(struct net_device *dev)
 /*============================================================
  * wanpipe_release
  *
- *     Close a PACKET socket. This is fairly simple. We 
- *      immediately go to 'closed' state and remove our 
+ *     Close a PACKET socket. This is fairly simple. We
+ *      immediately go to 'closed' state and remove our
  *      protocol entry in the device list.
  *===========================================================*/
 
@@ -954,7 +954,7 @@ static int wanpipe_release(struct socket *sock)
 {
        wanpipe_opt *wp;
        struct sock *sk = sock->sk;
-       
+
        if (!sk)
                return 0;
 
@@ -962,9 +962,9 @@ static int wanpipe_release(struct socket *sock)
        check_write_queue(sk);
 
        /* Kill the tx timer, if we don't kill it now, the timer
-         * will run after we kill the sock.  Timer code will 
-         * try to access the sock which has been killed and cause
-         * kernel panic */
+        * will run after we kill the sock.  Timer code will
+        * try to access the sock which has been killed and cause
+        * kernel panic */
 
        del_timer(&wp->tx_timer);
 
@@ -982,7 +982,7 @@ static int wanpipe_release(struct socket *sock)
                        DBG_PRINTK(KERN_INFO "wansock: Sending Clear Indication %i\n",
                                        sk->sk_state);
                        dev_put(dev);
-               }       
+               }
        }
 
        set_bit(1,&wanpipe_tx_critical);
@@ -992,10 +992,10 @@ static int wanpipe_release(struct socket *sock)
        clear_bit(1,&wanpipe_tx_critical);
 
 
-       
+
        release_driver(sk);
 
-       
+
        /*
         *      Now the socket is dead. No more input will appear.
         */
@@ -1040,9 +1040,9 @@ static int wanpipe_release(struct socket *sock)
 /*============================================================
  * check_write_queue
  *
- *     During sock shutdown, if the sock state is 
- *      WANSOCK_CONNECTED and there is transmit data 
- *      pending. Wait until data is released 
+ *     During sock shutdown, if the sock state is
+ *      WANSOCK_CONNECTED and there is transmit data
+ *      pending. Wait until data is released
  *      before proceeding.
  *===========================================================*/
 
@@ -1062,7 +1062,7 @@ static void check_write_queue(struct sock *sk)
 /*============================================================
  * release_driver
  *
- *     This function is called during sock shutdown, to 
+ *     This function is called during sock shutdown, to
  *      release any resources and links that bind the sock
  *      to the driver.  It also changes the state of the
  *      sock to WANSOCK_DISCONNECTED
@@ -1105,7 +1105,7 @@ static void release_driver(struct sock *sk)
  *  start_cleanup_timer
  *
  *     If new incoming call's are pending but the socket
- *      is being released, start the timer which will 
+ *      is being released, start the timer which will
  *      envoke the kill routines for pending socks.
  *===========================================================*/
 
@@ -1125,7 +1125,7 @@ static void start_cleanup_timer (struct sock *sk)
  *
  *     This is a function which performs actual killing
  *      of the sock.  It releases socket resources,
- *      and unlinks the sock from the driver. 
+ *      and unlinks the sock from the driver.
  *===========================================================*/
 
 static void wanpipe_kill_sock_timer (unsigned long data)
@@ -1139,13 +1139,13 @@ static void wanpipe_kill_sock_timer (unsigned long data)
 
        /* This function can be called from interrupt. We must use
         * appropriate locks */
-       
+
        if (test_bit(1,&wanpipe_tx_critical)){
                sk->sk_timer.expires = jiffies + 10;
                add_timer(&sk->sk_timer);
                return;
        }
-       
+
        write_lock(&wanpipe_sklist_lock);
        sk_del_node_init(sk);
        write_unlock(&wanpipe_sklist_lock);
@@ -1159,7 +1159,7 @@ static void wanpipe_kill_sock_timer (unsigned long data)
                        chan=dev->priv;
                        atomic_set(&chan->disconnect,1);
                        dev_put(dev);
-               }       
+               }
        }
 
        release_driver(sk);
@@ -1170,7 +1170,7 @@ static void wanpipe_kill_sock_timer (unsigned long data)
        skb_queue_purge(&sk->sk_receive_queue);
        skb_queue_purge(&sk->sk_write_queue);
        skb_queue_purge(&sk->sk_error_queue);
-       
+
        if (atomic_read(&sk->sk_rmem_alloc) ||
            atomic_read(&sk->sk_wmem_alloc)) {
                del_timer(&sk->sk_timer);
@@ -1205,7 +1205,7 @@ static void wanpipe_kill_sock_accept (struct sock *sk)
 
        /* This function can be called from interrupt. We must use
         * appropriate locks */
-       
+
        write_lock(&wanpipe_sklist_lock);
        sk_del_node_init(sk);
        write_unlock(&wanpipe_sklist_lock);
@@ -1282,10 +1282,10 @@ static int wanpipe_do_bind(struct sock *sk, struct net_device *dev,
                        chan=dev->priv;
                        sk->sk_state = chan->state;
 
-                       if (wp->num == htons(X25_PROT) && 
-                           sk->sk_state != WANSOCK_DISCONNECTED && 
+                       if (wp->num == htons(X25_PROT) &&
+                           sk->sk_state != WANSOCK_DISCONNECTED &&
                            sk->sk_state != WANSOCK_CONNECTING) {
-                               DBG_PRINTK(KERN_INFO 
+                               DBG_PRINTK(KERN_INFO
                                        "wansock: Binding to Device not DISCONNECTED %i\n",
                                                sk->sk_state);
                                release_device(dev);
@@ -1338,7 +1338,7 @@ static int wanpipe_bind(struct socket *sock, struct sockaddr *uaddr, int addr_le
        /*
         *      Check legality
         */
-        
+
        if (addr_len < sizeof(struct wan_sockaddr_ll)){
                printk(KERN_INFO "wansock: Address length error\n");
                return -EINVAL;
@@ -1358,12 +1358,12 @@ static int wanpipe_bind(struct socket *sock, struct sockaddr *uaddr, int addr_le
 
        if (!strcmp(sll->sll_device,"svc_listen")){
 
-               /* Bind a sock to a card structure for listening 
-                */             
-               int err=0; 
+               /* Bind a sock to a card structure for listening
+                */
+               int err=0;
 
                /* This is x25 specific area if protocol doesn't
-                 * match, return error */
+                * match, return error */
                if (sll->sll_protocol != htons(X25_PROT))
                        return -EINVAL;
 
@@ -1376,14 +1376,14 @@ static int wanpipe_bind(struct socket *sock, struct sockaddr *uaddr, int addr_le
                sk->sk_state = WANSOCK_BIND_LISTEN;
                return 0;
 
-       }else if (!strcmp(sll->sll_device,"svc_connect")){ 
+       }else if (!strcmp(sll->sll_device,"svc_connect")){
 
                /* This is x25 specific area if protocol doesn't
-                 * match, return error */
+                * match, return error */
                if (sll->sll_protocol != htons(X25_PROT))
                        return -EINVAL;
 
-               /* Find a free device 
+               /* Find a free device
                 */
                dev = wanpipe_find_free_dev(card);
                if (dev == NULL){
@@ -1392,9 +1392,9 @@ static int wanpipe_bind(struct socket *sock, struct sockaddr *uaddr, int addr_le
                        return -EINVAL;
                }
        }else{
-               /* Bind a socket to a interface name 
-                 * This is used by PVC mostly
-                 */
+               /* Bind a socket to a interface name
+                * This is used by PVC mostly
+                */
                strlcpy(name,sll->sll_device,sizeof(name));
                dev = dev_get_by_name(name);
                if (dev == NULL){
@@ -1419,8 +1419,8 @@ static int wanpipe_bind(struct socket *sock, struct sockaddr *uaddr, int addr_le
 
 /*============================================================
  * get_atomic_device
- *     
- *     Sets a bit atomically which indicates that 
+ *
+ *     Sets a bit atomically which indicates that
  *      the interface is taken. This avoids race conditions.
  *===========================================================*/
 
@@ -1436,7 +1436,7 @@ static inline int get_atomic_device(struct net_device *dev)
 
 /*============================================================
  * check_dev
- *     
+ *
  *     Check that device name belongs to a particular card.
  *===========================================================*/
 
@@ -1446,8 +1446,8 @@ static int check_dev(struct net_device *dev, sdla_t *card)
 
        for (tmp_dev = card->wandev.dev; tmp_dev;
             tmp_dev = *((struct net_device **)tmp_dev->priv)) {
-               if (tmp_dev->ifindex == dev->ifindex){ 
-                       return 0;       
+               if (tmp_dev->ifindex == dev->ifindex){
+                       return 0;
                }
        }
        return 1;
@@ -1455,7 +1455,7 @@ static int check_dev(struct net_device *dev, sdla_t *card)
 
 /*============================================================
  *  wanpipe_find_free_dev
- *     
+ *
  *     Find a free network interface. If found set atomic
  *      bit indicating that the interface is taken.
  *      X25API Specific.
@@ -1468,12 +1468,12 @@ struct net_device *wanpipe_find_free_dev(sdla_t *card)
 
        if (test_and_set_bit(0,&find_free_critical)){
                printk(KERN_INFO "CRITICAL in Find Free\n");
-       }       
+       }
 
        for (dev = card->wandev.dev; dev;
             dev = *((struct net_device **)dev->priv)) {
                chan = dev->priv;
-               if (!chan) 
+               if (!chan)
                        continue;
                if (chan->usedby == API && chan->svc){
                        if (!get_atomic_device (dev)){
@@ -1492,16 +1492,16 @@ struct net_device *wanpipe_find_free_dev(sdla_t *card)
 
 /*============================================================
  *  wanpipe_create
- *     
+ *
  *     SOCKET() System call.  It allocates a sock structure
- *      and adds the socket to the wanpipe_sk_list. 
+ *      and adds the socket to the wanpipe_sk_list.
  *      Crates AF_WANPIPE socket.
  *===========================================================*/
 
 static int wanpipe_create(struct socket *sock, int protocol)
 {
        struct sock *sk;
-       
+
        //FIXME: This checks for root user, SECURITY ?
        //if (!capable(CAP_NET_RAW))
        //      return -EPERM;
@@ -1526,7 +1526,7 @@ static int wanpipe_create(struct socket *sock, int protocol)
        sk->sk_bound_dev_if = 0;
 
        atomic_inc(&wanpipe_socks_nr);
-       
+
        /* We must disable interrupts because the ISR
         * can also change the list */
        set_bit(1,&wanpipe_tx_critical);
@@ -1541,8 +1541,8 @@ static int wanpipe_create(struct socket *sock, int protocol)
 
 /*============================================================
  *  wanpipe_recvmsg
- *     
- *     Pull a packet from our receive queue and hand it 
+ *
+ *     Pull a packet from our receive queue and hand it
  *      to the user. If necessary we block.
  *===========================================================*/
 
@@ -1570,13 +1570,13 @@ static int wanpipe_recvmsg(struct kiocb *iocb, struct socket *sock,
         *      but then it will block.
         */
 
-       if (flags & MSG_OOB){   
+       if (flags & MSG_OOB){
                skb = skb_dequeue(&sk->sk_error_queue);
        }else{
                skb=skb_recv_datagram(sk,flags,1,&err);
        }
        /*
-        *      An error occurred so return it. Because skb_recv_datagram() 
+        *      An error occurred so return it. Because skb_recv_datagram()
         *      handles the blocking we don't see and worry about blocking
         *      retries.
         */
@@ -1602,9 +1602,9 @@ static int wanpipe_recvmsg(struct kiocb *iocb, struct socket *sock,
        err = memcpy_toiovec(msg->msg_iov, skb->data, copied);
        if (err)
                goto out_free;
-       
+
        sock_recv_timestamp(msg, sk, skb);
-       
+
        if (msg->msg_name)
                memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
 
@@ -1623,13 +1623,13 @@ out:
 
 /*============================================================
  *  wanpipe_wakeup_driver
- *     
+ *
  *     If socket receive buffer is full and driver cannot
  *      pass data up the sock, it sets a packet_block flag.
- *      This function check that flag and if sock receive 
- *      queue has room it kicks the driver BH handler. 
+ *      This function check that flag and if sock receive
+ *      queue has room it kicks the driver BH handler.
  *
- *     This way, driver doesn't have to poll the sock 
+ *     This way, driver doesn't have to poll the sock
  *      receive queue.
  *===========================================================*/
 
@@ -1646,8 +1646,8 @@ static void wanpipe_wakeup_driver(struct sock *sk)
 
        if ((chan = dev->priv) == NULL)
                return;
-       
-       if (atomic_read(&chan->receive_block)){  
+
+       if (atomic_read(&chan->receive_block)){
                if (atomic_read(&sk->sk_rmem_alloc) <
                    ((unsigned)sk->sk_rcvbuf * 0.9)) {
                        printk(KERN_INFO "wansock: Queuing task for wanpipe\n");
@@ -1655,13 +1655,13 @@ static void wanpipe_wakeup_driver(struct sock *sk)
                        wanpipe_queue_tq(&chan->wanpipe_task);
                        wanpipe_mark_bh();
                }
-       }       
-}      
+       }
+}
 
 /*============================================================
  *  wanpipe_getname
- *     
- *     I don't know what to do with this yet. 
+ *
+ *     I don't know what to do with this yet.
  *      User can use this function to get sock address
  *      information. Not very useful for Sangoma's purposes.
  *===========================================================*/
@@ -1687,17 +1687,17 @@ static int wanpipe_getname(struct socket *sock, struct sockaddr *uaddr,
                sll->sll_halen = 0;
        }
        *uaddr_len = sizeof(*sll);
-       
+
        dev_put(dev);
-       
+
        return 0;
 }
 
 /*============================================================
  *  wanpipe_notifier
- *     
+ *
  *     If driver turns off network interface, this function
- *      will be envoked. Currently I treate it as a 
+ *      will be envoked. Currently I treate it as a
  *      call disconnect. More thought should go into this
  *      function.
  *
@@ -1718,7 +1718,7 @@ static int wanpipe_notifier(struct notifier_block *this, unsigned long msg, void
                        continue;
                if (dev == NULL)
                        continue;
-               
+
                switch (msg) {
                case NETDEV_DOWN:
                case NETDEV_UNREGISTER:
@@ -1732,7 +1732,7 @@ static int wanpipe_notifier(struct notifier_block *this, unsigned long msg, void
 
                                if (msg == NETDEV_UNREGISTER) {
                                        printk(KERN_INFO "wansock: Unregistering Device: %s\n",
-                                                         dev->name);
+                                                         dev->name);
                                        wanpipe_unlink_driver(sk);
                                        sk->sk_bound_dev_if = 0;
                                }
@@ -1753,7 +1753,7 @@ static int wanpipe_notifier(struct notifier_block *this, unsigned long msg, void
 
 /*============================================================
  *  wanpipe_ioctl
- *     
+ *
  *     Execute a user commands, and set socket options.
  *
  * FIXME: More thought should go into this function.
@@ -1765,7 +1765,7 @@ static int wanpipe_ioctl(struct socket *sock, unsigned int cmd, unsigned long ar
        struct sock *sk = sock->sk;
        int err;
 
-       switch(cmd) 
+       switch(cmd)
        {
                case SIOCGSTAMP:
                        return sock_get_timestamp(sk, (struct timeval __user *)arg);
@@ -1778,7 +1778,7 @@ static int wanpipe_ioctl(struct socket *sock, unsigned int cmd, unsigned long ar
 
                        if (sk->sk_state == WANSOCK_CONNECTED)
                                return 0;
-                       
+
                        return 1;
 
 
@@ -1804,7 +1804,7 @@ static int wanpipe_ioctl(struct socket *sock, unsigned int cmd, unsigned long ar
                case SIOC_WANPIPE_DEBUG:
 
                        return wanpipe_debug(sk,(void*)arg);
-       
+
                case SIOC_WANPIPE_SET_NONBLOCK:
 
                        if (sk->sk_state != WANSOCK_DISCONNECTED)
@@ -1812,7 +1812,7 @@ static int wanpipe_ioctl(struct socket *sock, unsigned int cmd, unsigned long ar
 
                        sock->file->f_flags |= O_NONBLOCK;
                        return 0;
-       
+
 #ifdef CONFIG_INET
                case SIOCADDRT:
                case SIOCDELRT:
@@ -1842,7 +1842,7 @@ static int wanpipe_ioctl(struct socket *sock, unsigned int cmd, unsigned long ar
 
 /*============================================================
  *  wanpipe_debug
- *     
+ *
  *     This function will pass up information about all
  *      active sockets.
  *
@@ -1893,49 +1893,49 @@ static int wanpipe_debug (struct sock *origsk, void *arg)
 
                if (sk->sk_bound_dev_if) {
                        dev = dev_get_by_index(sk->sk_bound_dev_if);
-                       if (!dev)       
+                       if (!dev)
                                continue;
 
                        chan=dev->priv;
                        dev_put(dev);
-       
+
                        if ((err=put_user(chan->state, &dbg_data->debug[cnt].d_state)))
                                return err;
                        if ((err=put_user(chan->svc, &dbg_data->debug[cnt].svc)))
                                return err;
 
-                       if ((err=put_user(atomic_read(&chan->command), 
+                       if ((err=put_user(atomic_read(&chan->command),
                                                &dbg_data->debug[cnt].command)))
                                return err;
 
 
                        if (wp){
-                               sdla_t *card = (sdla_t*)wp->card;                       
-       
+                               sdla_t *card = (sdla_t*)wp->card;
+
                                if (card){
-                                       if ((err=put_user(atomic_read(&card->u.x.command_busy), 
+                                       if ((err=put_user(atomic_read(&card->u.x.command_busy),
                                                                &dbg_data->debug[cnt].cmd_busy)))
                                                return err;
                                }
 
-                               if ((err=put_user(wp->lcn, 
+                               if ((err=put_user(wp->lcn,
                                                  &dbg_data->debug[cnt].lcn)))
                                        return err;
-                               
+
                                if (wp->mbox) {
                                        if ((err=put_user(1, &dbg_data->debug[cnt].mbox)))
                                                return err;
                                }
                        }
 
-                       if ((err=put_user(atomic_read(&chan->receive_block), 
+                       if ((err=put_user(atomic_read(&chan->receive_block),
                                                                &dbg_data->debug[cnt].rblock)))
                                return err;
 
                        if (copy_to_user(dbg_data->debug[cnt].name, dev->name, strlen(dev->name)))
                                return -EFAULT;
                }
-       
+
                if (++cnt == MAX_NUM_DEBUG)
                        break;
        }
@@ -1944,7 +1944,7 @@ static int wanpipe_debug (struct sock *origsk, void *arg)
 
 /*============================================================
  *  get_ioctl_cmd
- *     
+ *
  *     Pass up the contents of socket MBOX to the user.
  *===========================================================*/
 
@@ -1974,7 +1974,7 @@ static int get_ioctl_cmd (struct sock *sk, void *arg)
        if ((err=put_user(mbox_ptr->cmd.result, &usr_data->hdr.result)))
                return err;
        if ((err=put_user(mbox_ptr->cmd.lcn, &usr_data->hdr.lcn)))
-               return err;     
+               return err;
 
        if (mbox_ptr->cmd.length > 0){
                if (mbox_ptr->cmd.length > X25_MAX_DATA)
@@ -1986,13 +1986,13 @@ static int get_ioctl_cmd (struct sock *sk, void *arg)
                }
        }
        return 0;
-} 
+}
 
 /*============================================================
  *  set_ioctl_cmd
- *     
+ *
  *     Before command can be execute, socket MBOX must
- *      be created, and initialized with user data.    
+ *      be created, and initialized with user data.
  *===========================================================*/
 
 static int set_ioctl_cmd (struct sock *sk, void *arg)
@@ -2008,7 +2008,7 @@ static int set_ioctl_cmd (struct sock *sk, void *arg)
                        return -ENODEV;
 
                dev_put(dev);
-               
+
                if ((mbox_ptr = kzalloc(sizeof(mbox_cmd_t), GFP_ATOMIC)) == NULL)
                        return -ENOMEM;
 
@@ -2092,12 +2092,12 @@ unsigned int wanpipe_poll(struct file * file, struct socket *sock, poll_table *w
                return mask;
        }
 
-       /* This check blocks the user process if there is   
+       /* This check blocks the user process if there is
         * a packet already queued in the socket write queue.
-         * This option is only for X25API protocol, for other
-         * protocol like chdlc enable streaming mode, 
-         * where multiple packets can be pending in the socket 
-         * transmit queue */
+        * This option is only for X25API protocol, for other
+        * protocol like chdlc enable streaming mode,
+        * where multiple packets can be pending in the socket
+        * transmit queue */
 
        if (wp_sk(sk)->num == htons(X25_PROT)) {
                if (atomic_read(&wp_sk(sk)->packet_sent))
@@ -2110,7 +2110,7 @@ unsigned int wanpipe_poll(struct file * file, struct socket *sock, poll_table *w
        }else{
                set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);
        }
-               
+
        return mask;
 }
 
@@ -2125,8 +2125,8 @@ static int wanpipe_listen(struct socket *sock, int backlog)
 {
        struct sock *sk = sock->sk;
 
-       /* This is x25 specific area if protocol doesn't
-         * match, return error */
+       /* This is x25 specific area if protocol doesn't
+        * match, return error */
        if (wp_sk(sk)->num != htons(X25_PROT))
                return -EINVAL;
 
@@ -2163,7 +2163,7 @@ static int wanpipe_link_card (struct sock *sk)
        card->sk=sk;
        card->func=wanpipe_listen_rcv;
        sock_set_flag(sk, SOCK_ZAPPED);
+
        return 0;
 }
 
@@ -2176,7 +2176,7 @@ static int wanpipe_link_card (struct sock *sk)
 
 static void wanpipe_unlink_card (struct sock *sk)
 {
-       sdla_t *card = (sdla_t*)wp_sk(sk)->card; 
+       sdla_t *card = (sdla_t*)wp_sk(sk)->card;
 
        if (card){
                card->sk=NULL;
@@ -2202,9 +2202,9 @@ static int wanpipe_exec_cmd(struct sock *sk, int cmd, unsigned int flags)
                printk(KERN_INFO "NO MBOX PTR !!!!!\n");
                return -EINVAL;
        }
-       
+
        /* This is x25 specific area if protocol doesn't
-         * match, return error */
+        * match, return error */
        if (wp->num != htons(X25_PROT))
                return -EINVAL;
 
@@ -2217,17 +2217,17 @@ static int wanpipe_exec_cmd(struct sock *sk, int cmd, unsigned int flags)
                                err = -EHOSTDOWN;
                                break;
                        }
-                       
+
                        err = execute_command(sk,X25_ACCEPT_CALL,0);
                        if (err < 0)
                                break;
 
-                       /* Update. Mar6 2000. 
-                         * Do not set the sock lcn number here, since
-                         * it is done in wanpipe_listen_rcv(). 
-                         */ 
-                       if (sk->sk_state == WANSOCK_CONNECTED) {
-                               wp->lcn = ((mbox_cmd_t*)wp->mbox)->cmd.lcn;     
+                       /* Update. Mar6 2000.
+                        * Do not set the sock lcn number here, since
+                        * it is done in wanpipe_listen_rcv().
+                        */
+                       if (sk->sk_state == WANSOCK_CONNECTED) {
+                               wp->lcn = ((mbox_cmd_t*)wp->mbox)->cmd.lcn;
                                DBG_PRINTK(KERN_INFO "\nwansock: Accept OK %i\n",
                                        wp->lcn);
                                err = 0;
@@ -2249,15 +2249,15 @@ static int wanpipe_exec_cmd(struct sock *sk, int cmd, unsigned int flags)
 
 
                        /* Check if data buffers are pending for transmission,
-                         * if so, check whether user wants to wait until data
-                         * is transmitted, or clear a call and drop packets */
-                          
+                        * if so, check whether user wants to wait until data
+                        * is transmitted, or clear a call and drop packets */
+
                        if (atomic_read(&sk->sk_wmem_alloc) ||
                            check_driver_busy(sk)) {
-                               mbox_cmd_t *mbox = wp->mbox;
+                               mbox_cmd_t *mbox = wp->mbox;
                                if (mbox->cmd.qdm & 0x80){
                                        mbox->cmd.result = 0x35;
-                                       err = -EAGAIN;  
+                                       err = -EAGAIN;
                                        break;
                                }
                        }
@@ -2286,15 +2286,15 @@ static int wanpipe_exec_cmd(struct sock *sk, int cmd, unsigned int flags)
 
 
                        /* Check if data buffers are pending for transmission,
-                         * if so, check whether user wants to wait until data
-                         * is transmitted, or reset a call and drop packets */
-                          
+                        * if so, check whether user wants to wait until data
+                        * is transmitted, or reset a call and drop packets */
+
                        if (atomic_read(&sk->sk_wmem_alloc) ||
                            check_driver_busy(sk)) {
-                               mbox_cmd_t *mbox = wp->mbox;
+                               mbox_cmd_t *mbox = wp->mbox;
                                if (mbox->cmd.qdm & 0x80){
                                        mbox->cmd.result = 0x35;
-                                       err = -EAGAIN;  
+                                       err = -EAGAIN;
                                        break;
                                }
                        }
@@ -2316,7 +2316,7 @@ static int wanpipe_exec_cmd(struct sock *sk, int cmd, unsigned int flags)
 
                        if (sk->sk_state == WANSOCK_CONNECTED) {
 
-                               wp->lcn = ((mbox_cmd_t*)wp->mbox)->cmd.lcn;     
+                               wp->lcn = ((mbox_cmd_t*)wp->mbox)->cmd.lcn;
 
                                DBG_PRINTK(KERN_INFO "\nwansock: PLACE CALL OK %i\n",
                                        wp->lcn);
@@ -2337,7 +2337,7 @@ static int wanpipe_exec_cmd(struct sock *sk, int cmd, unsigned int flags)
 
                        break;
 
-               default: 
+               default:
                        return -EINVAL;
        }
 
@@ -2364,9 +2364,9 @@ static int check_driver_busy (struct sock *sk)
 /*======================================================================
  * wanpipe_accept
  *
- *     ACCEPT() System call.   X25API Specific function. 
- *     For each incoming call, create a new socket and 
- *      return it to the user. 
+ *     ACCEPT() System call.   X25API Specific function.
+ *     For each incoming call, create a new socket and
+ *      return it to the user.
  *=====================================================================*/
 
 static int wanpipe_accept(struct socket *sock, struct socket *newsock, int flags)
@@ -2378,10 +2378,10 @@ static int wanpipe_accept(struct socket *sock, struct socket *newsock, int flags
        int err=0;
 
        if (newsock->sk != NULL){
-               wanpipe_kill_sock_accept(newsock->sk);  
+               wanpipe_kill_sock_accept(newsock->sk);
                newsock->sk=NULL;
        }
-       
+
        if ((sk = sock->sk) == NULL)
                return -EINVAL;
 
@@ -2410,10 +2410,10 @@ static int wanpipe_accept(struct socket *sock, struct socket *newsock, int flags
        }
        current->state = TASK_RUNNING;
        remove_wait_queue(sk->sk_sleep,&wait);
-       
+
        if (err != 0)
                return err;
-       
+
        newsk = get_newsk_from_skb(skb);
        if (!newsk){
                return -EINVAL;
@@ -2431,7 +2431,7 @@ static int wanpipe_accept(struct socket *sock, struct socket *newsock, int flags
        /* Now attach up the new socket */
        sk->sk_ack_backlog--;
        newsock->sk = newsk;
-       
+
        kfree_skb(skb);
 
        DBG_PRINTK(KERN_INFO "\nwansock: ACCEPT Got LCN %i\n",
@@ -2449,16 +2449,16 @@ static int wanpipe_accept(struct socket *sock, struct socket *newsock, int flags
 struct sock * get_newsk_from_skb (struct sk_buff *skb)
 {
        struct net_device *dev = skb->dev;
-       wanpipe_common_t *chan; 
+       wanpipe_common_t *chan;
 
        if (!dev){
                return NULL;
        }
-               
+
        if ((chan = dev->priv) == NULL){
                return NULL;
        }
-               
+
        if (!chan->sk){
                return NULL;
        }
@@ -2470,7 +2470,7 @@ struct sock * get_newsk_from_skb (struct sk_buff *skb)
  *
  *     CONNECT() System Call. X25API specific function
  *     Check the state of the sock, and execute PLACE_CALL command.
- *      Connect can ether block or return without waiting for connection, 
+ *      Connect can ether block or return without waiting for connection,
  *      if specified by user.
  *=====================================================================*/
 
@@ -2492,7 +2492,7 @@ static int wanpipe_connect(struct socket *sock, struct sockaddr *uaddr, int addr
                return -ECONNREFUSED;
        }
 
-       sk->sk_state = WANSOCK_DISCONNECTED;    
+       sk->sk_state = WANSOCK_DISCONNECTED;
        sock->state  = SS_UNCONNECTED;
 
        if (addr_len != sizeof(struct wan_sockaddr_ll))
@@ -2505,7 +2505,7 @@ static int wanpipe_connect(struct socket *sock, struct sockaddr *uaddr, int addr
                return -ENETUNREACH;
 
        dev_put(dev);
-       
+
        if (!sock_flag(sk, SOCK_ZAPPED)) /* Must bind first - autobinding does not work */
                return -EINVAL;
 
@@ -2534,7 +2534,7 @@ static int wanpipe_connect(struct socket *sock, struct sockaddr *uaddr, int addr
 
        if (sk->sk_state != WANSOCK_CONNECTED) {
                sock->state = SS_UNCONNECTED;
-               return -ECONNREFUSED; 
+               return -ECONNREFUSED;
        }
 
        sock->state = SS_CONNECTED;
@@ -2549,10 +2549,10 @@ const struct proto_ops wanpipe_ops = {
        .connect =      wanpipe_connect,
        .socketpair =   sock_no_socketpair,
        .accept =       wanpipe_accept,
-       .getname =      wanpipe_getname, 
+       .getname =      wanpipe_getname,
        .poll =         wanpipe_poll,
        .ioctl =        wanpipe_ioctl,
-       .listen =       wanpipe_listen, 
+       .listen =       wanpipe_listen,
        .shutdown =     sock_no_shutdown,
        .setsockopt =   sock_no_setsockopt,
        .getsockopt =   sock_no_getsockopt,
index 4d90a179aeda82bcf54b4ac627e467041049bc5b..5d2d93dc083727348c26f26746bf8fc15c2e7e9c 100644 (file)
@@ -314,10 +314,10 @@ __be16 wanrouter_type_trans(struct sk_buff *skb, struct net_device *dev)
                cnt += 1;
                break;
 
-        case NLPID_SNAP:       /* SNAP encapsulation */
+       case NLPID_SNAP:        /* SNAP encapsulation */
                if (memcmp(&skb->data[cnt + 1], wanrouter_oui_ether,
                           sizeof(wanrouter_oui_ether))){
-                       printk(KERN_INFO
+                       printk(KERN_INFO
                                "%s: unsupported SNAP OUI %02X-%02X-%02X "
                                "on interface %s!\n", wanrouter_modname,
                                skb->data[cnt+1], skb->data[cnt+2],
@@ -450,7 +450,7 @@ static int wanrouter_device_setup(struct wan_device *wandev,
                kfree(conf);
                printk(KERN_INFO "%s: ERROR, Invalid MAGIC Number\n",
                                wandev->name);
-               return -EINVAL;
+               return -EINVAL;
        }
 
        if (conf->data_size && conf->data) {
@@ -459,13 +459,13 @@ static int wanrouter_device_setup(struct wan_device *wandev,
                            "%s: ERROR, Invalid firmware data size %i !\n",
                                        wandev->name, conf->data_size);
                        kfree(conf);
-                       return -EINVAL;
+                       return -EINVAL;
                }
 
                data = vmalloc(conf->data_size);
                if (!data) {
                        printk(KERN_INFO
-                               "%s: ERROR, Faild allocate kernel memory !\n",
+                               "%s: ERROR, Faild allocate kernel memory !\n",
                                wandev->name);
                        kfree(conf);
                        return -ENOBUFS;
@@ -686,7 +686,7 @@ out:
 static int wanrouter_device_del_if(struct wan_device *wandev, char __user *u_name)
 {
        char name[WAN_IFNAME_SZ + 1];
-        int err = 0;
+       int err = 0;
 
        if (wandev->state == WAN_UNCONFIGURED)
                return -ENODEV;
@@ -709,8 +709,8 @@ static int wanrouter_device_del_if(struct wan_device *wandev, char __user *u_nam
         * interfaces are deleted and the link irrecoverably disconnected.
         */
 
-        if (!wandev->ndev && wandev->shutdown)
-                err = wandev->shutdown(wandev);
+       if (!wandev->ndev && wandev->shutdown)
+               err = wandev->shutdown(wandev);
 
        return err;
 }
@@ -804,7 +804,7 @@ static int wanrouter_delete_interface(struct wan_device *wandev, char *name)
 
 static void lock_adapter_irq(spinlock_t *lock, unsigned long *smp_flags)
 {
-               spin_lock_irqsave(lock, *smp_flags);
+       spin_lock_irqsave(lock, *smp_flags);
 }
 
 
index 930ea59463ad2888890a5c45b6f8aea9e6d24d67..205106521ecba36c886f5dbf90064798e3da2d25 100644 (file)
 
 #define PROT_DECODE(prot) ((prot == WANCONFIG_FR) ? " FR" :\
                              (prot == WANCONFIG_X25) ? " X25" : \
-                                (prot == WANCONFIG_PPP) ? " PPP" : \
+                                (prot == WANCONFIG_PPP) ? " PPP" : \
                                    (prot == WANCONFIG_CHDLC) ? " CHDLC": \
                                       (prot == WANCONFIG_MPPP) ? " MPPP" : \
-                                          " Unknown" )
+                                          " Unknown" )
 
 /****** Function Prototypes *************************************************/
 
@@ -188,7 +188,7 @@ static int status_open(struct inode *inode, struct file *file)
        return seq_open(file, &status_op);
 }
 
-static struct file_operations config_fops = {
+static const struct file_operations config_fops = {
        .owner   = THIS_MODULE,
        .open    = config_open,
        .read    = seq_read,
@@ -196,7 +196,7 @@ static struct file_operations config_fops = {
        .release = seq_release,
 };
 
-static struct file_operations status_fops = {
+static const struct file_operations status_fops = {
        .owner   = THIS_MODULE,
        .open    = status_open,
        .read    = seq_read,
@@ -271,7 +271,7 @@ static int wandev_open(struct inode *inode, struct file *file)
        return single_open(file, wandev_show, PDE(inode)->data);
 }
 
-static struct file_operations wandev_fops = {
+static const struct file_operations wandev_fops = {
        .owner   = THIS_MODULE,
        .open    = wandev_open,
        .read    = seq_read,
index b37d894358ec28fb68e83d387a79b486024e40a2..e62ba41b05c59b06e8889440f079ccbd9f19344b 100644 (file)
@@ -3,7 +3,7 @@
  *
  *     This is ALPHA test software. This code may break your machine,
  *     randomly fail to work with new releases, misbehave and/or generally
- *     screw up. It might even work. 
+ *     screw up. It might even work.
  *
  *     This code REQUIRES 2.1.15 or higher
  *
  *     X.25 002        Jonathan Naylor Centralised disconnect handling.
  *                                     New timer architecture.
  *     2000-03-11      Henner Eisen    MSG_EOR handling more POSIX compliant.
- *     2000-03-22      Daniela Squassoni Allowed disabling/enabling of 
- *                                       facilities negotiation and increased 
+ *     2000-03-22      Daniela Squassoni Allowed disabling/enabling of
+ *                                       facilities negotiation and increased
  *                                       the throughput upper limit.
  *     2000-08-27      Arnaldo C. Melo s/suser/capable/ + micro cleanups
- *     2000-09-04      Henner Eisen    Set sock->state in x25_accept(). 
+ *     2000-09-04      Henner Eisen    Set sock->state in x25_accept().
  *                                     Fixed x25_output() related skb leakage.
  *     2000-10-02      Henner Eisen    Made x25_kick() single threaded per socket.
  *     2000-10-27      Henner Eisen    MSG_DONTWAIT for fragment allocation.
@@ -256,8 +256,8 @@ static struct sock *x25_find_listener(struct x25_address *addr,
                         * call user data vs this sockets call user data
                         */
                        if(skb->len > 0 && x25_sk(s)->cudmatchlength > 0) {
-                               if((memcmp(x25_sk(s)->calluserdata.cuddata,
-                                       skb->data,
+                               if((memcmp(x25_sk(s)->calluserdata.cuddata,
+                                       skb->data,
                                        x25_sk(s)->cudmatchlength)) == 0) {
                                        sock_hold(s);
                                        goto found;
@@ -421,7 +421,7 @@ static int x25_getsockopt(struct socket *sock, int level, int optname,
 {
        struct sock *sk = sock->sk;
        int val, len, rc = -ENOPROTOOPT;
-       
+
        if (level != SOL_X25 || optname != X25_QBITINCL)
                goto out;
 
@@ -434,7 +434,7 @@ static int x25_getsockopt(struct socket *sock, int level, int optname,
        rc = -EINVAL;
        if (len < 0)
                goto out;
-               
+
        rc = -EFAULT;
        if (put_user(len, optlen))
                goto out;
@@ -523,12 +523,12 @@ static int x25_create(struct socket *sock, int protocol)
        x25->facilities.pacsize_out = X25_DEFAULT_PACKET_SIZE;
        x25->facilities.throughput  = X25_DEFAULT_THROUGHPUT;
        x25->facilities.reverse     = X25_DEFAULT_REVERSE;
-       x25->dte_facilities.calling_len = 0;
-       x25->dte_facilities.called_len = 0;
-       memset(x25->dte_facilities.called_ae, '\0',
-                       sizeof(x25->dte_facilities.called_ae));
-       memset(x25->dte_facilities.calling_ae, '\0',
-                       sizeof(x25->dte_facilities.calling_ae));
+       x25->dte_facilities.calling_len = 0;
+       x25->dte_facilities.called_len = 0;
+       memset(x25->dte_facilities.called_ae, '\0',
+                       sizeof(x25->dte_facilities.called_ae));
+       memset(x25->dte_facilities.calling_ae, '\0',
+                       sizeof(x25->dte_facilities.calling_ae));
 
        rc = 0;
 out:
@@ -608,7 +608,7 @@ static int x25_release(struct socket *sock)
                        break;
        }
 
-       sock->sk        = NULL; 
+       sock->sk        = NULL;
        sk->sk_socket   = NULL; /* Not used, but we should do this */
 out:
        return 0;
@@ -635,7 +635,7 @@ static int x25_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
 static int x25_wait_for_connection_establishment(struct sock *sk)
 {
        DECLARE_WAITQUEUE(wait, current);
-        int rc;
+       int rc;
 
        add_wait_queue_exclusive(sk->sk_sleep, &wait);
        for (;;) {
@@ -686,7 +686,7 @@ static int x25_connect(struct socket *sock, struct sockaddr *uaddr,
        if (sk->sk_state == TCP_ESTABLISHED)
                goto out;
 
-       sk->sk_state   = TCP_CLOSE;     
+       sk->sk_state   = TCP_CLOSE;
        sock->state = SS_UNCONNECTED;
 
        rc = -EINVAL;
@@ -778,7 +778,7 @@ static int x25_wait_for_data(struct sock *sk, long timeout)
        remove_wait_queue(sk->sk_sleep, &wait);
        return rc;
 }
-       
+
 static int x25_accept(struct socket *sock, struct socket *newsock, int flags)
 {
        struct sock *sk = sock->sk;
@@ -837,7 +837,7 @@ static int x25_getname(struct socket *sock, struct sockaddr *uaddr,
 
        return 0;
 }
+
 int x25_rx_call_request(struct sk_buff *skb, struct x25_neigh *nb,
                        unsigned int lci)
 {
@@ -1120,7 +1120,7 @@ static int x25_sendmsg(struct kiocb *iocb, struct socket *sock,
        if (msg->msg_flags & MSG_OOB)
                skb_queue_tail(&x25->interrupt_out_queue, skb);
        else {
-               len = x25_output(sk, skb);
+               len = x25_output(sk, skb);
                if (len < 0)
                        kfree_skb(skb);
                else if (x25->qbitincl)
@@ -1219,7 +1219,7 @@ static int x25_recvmsg(struct kiocb *iocb, struct socket *sock,
                msg->msg_flags |= MSG_TRUNC;
        }
 
-       /* Currently, each datagram always contains a complete record */ 
+       /* Currently, each datagram always contains a complete record */
        msg->msg_flags |= MSG_EOR;
 
        rc = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
@@ -1277,8 +1277,8 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                case SIOCGSTAMP:
                        rc = -EINVAL;
                        if (sk)
-                               rc = sock_get_timestamp(sk, 
-                                               (struct timeval __user *)argp); 
+                               rc = sock_get_timestamp(sk,
+                                               (struct timeval __user *)argp);
                        break;
                case SIOCGIFADDR:
                case SIOCSIFADDR:
@@ -1346,17 +1346,17 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                }
 
                case SIOCX25GDTEFACILITIES: {
-                       rc = copy_to_user(argp, &x25->dte_facilities,
+                       rc = copy_to_user(argp, &x25->dte_facilities,
                                                sizeof(x25->dte_facilities));
                        if (rc)
                                rc = -EFAULT;
-                       break;
-               }
+                       break;
+               }
 
-               case SIOCX25SDTEFACILITIES: {
-                       struct x25_dte_facilities dtefacs;
-                       rc = -EFAULT;
-                       if (copy_from_user(&dtefacs, argp, sizeof(dtefacs)))
+               case SIOCX25SDTEFACILITIES: {
+                       struct x25_dte_facilities dtefacs;
+                       rc = -EFAULT;
+                       if (copy_from_user(&dtefacs, argp, sizeof(dtefacs)))
                                break;
                        rc = -EINVAL;
                        if (sk->sk_state != TCP_LISTEN &&
@@ -1414,7 +1414,7 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                        if (copy_from_user(&sub_addr, argp,
                                        sizeof(sub_addr)))
                                break;
-                       rc = -EINVAL;
+                       rc = -EINVAL;
                        if(sub_addr.cudmatchlength > X25_MAX_CUD_LEN)
                                break;
                        x25->cudmatchlength = sub_addr.cudmatchlength;
@@ -1443,7 +1443,7 @@ static int x25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
                        break;
                }
 
-               default:
+               default:
                        rc = -ENOIOCTLCMD;
                        break;
        }
index 2b2e7fd689f3904342b4bb678043c3d5076a24c7..a59b77f18234d498748d8dac63f55889eb742f03 100644 (file)
@@ -18,7 +18,7 @@ static int max_timer[] = { 300 * HZ };
 static struct ctl_table_header *x25_table_header;
 
 static struct ctl_table x25_table[] = {
-        {
+       {
                .ctl_name =     NET_X25_RESTART_REQUEST_TIMEOUT,
                .procname =     "restart_request_timeout",
                .data =         &sysctl_x25_restart_request_timeout,
@@ -29,7 +29,7 @@ static struct ctl_table x25_table[] = {
                .extra1 =       &min_timer,
                .extra2 =       &max_timer,
        },
-        {
+       {
                .ctl_name =     NET_X25_CALL_REQUEST_TIMEOUT,
                .procname =     "call_request_timeout",
                .data =         &sysctl_x25_call_request_timeout,
@@ -40,7 +40,7 @@ static struct ctl_table x25_table[] = {
                .extra1 =       &min_timer,
                .extra2 =       &max_timer,
        },
-        {
+       {
                .ctl_name =     NET_X25_RESET_REQUEST_TIMEOUT,
                .procname =     "reset_request_timeout",
                .data =         &sysctl_x25_reset_request_timeout,
@@ -51,7 +51,7 @@ static struct ctl_table x25_table[] = {
                .extra1 =       &min_timer,
                .extra2 =       &max_timer,
        },
-        {
+       {
                .ctl_name =     NET_X25_CLEAR_REQUEST_TIMEOUT,
                .procname =     "clear_request_timeout",
                .data =         &sysctl_x25_clear_request_timeout,
@@ -62,7 +62,7 @@ static struct ctl_table x25_table[] = {
                .extra1 =       &min_timer,
                .extra2 =       &max_timer,
        },
-        {
+       {
                .ctl_name =     NET_X25_ACK_HOLD_BACK_TIMEOUT,
                .procname =     "acknowledgement_hold_back_timeout",
                .data =         &sysctl_x25_ack_holdback_timeout,
@@ -106,7 +106,7 @@ static struct ctl_table x25_root_table[] = {
 
 void __init x25_register_sysctl(void)
 {
-       x25_table_header = register_sysctl_table(x25_root_table, 1);
+       x25_table_header = register_sysctl_table(x25_root_table);
 }
 
 void x25_unregister_sysctl(void)
index f099fd6a7c0ef2b34a6e92f1df24fb4b526a798a..c7221de98a9529cff4d11ac141ccc00eb7da9bcc 100644 (file)
@@ -1,8 +1,8 @@
 /*
  *     X.25 Packet Layer release 002
  *
- *     This is ALPHA test software. This code may break your machine, randomly fail to work with new 
- *     releases, misbehave and/or generally screw up. It might even work. 
+ *     This is ALPHA test software. This code may break your machine, randomly fail to work with new
+ *     releases, misbehave and/or generally screw up. It might even work.
  *
  *     This code REQUIRES 2.1.15 or higher
  *
@@ -31,7 +31,7 @@ static int x25_receive_data(struct sk_buff *skb, struct x25_neigh *nb)
        unsigned int lci;
 
        frametype = skb->data[2];
-        lci = ((skb->data[0] << 8) & 0xF00) + ((skb->data[1] << 0) & 0x0FF);
+       lci = ((skb->data[0] << 8) & 0xF00) + ((skb->data[1] << 0) & 0x0FF);
 
        /*
         *      LCI of zero is always for us, and its always a link control
index 27f5cc7966f691414b26bdce5c228e6e940f512b..dec404afa11333830ac69330ce2d6ef4a7fa357a 100644 (file)
@@ -3,7 +3,7 @@
  *
  *     This is ALPHA test software. This code may break your machine,
  *     randomly fail to work with new releases, misbehave and/or generally
- *     screw up. It might even work. 
+ *     screw up. It might even work.
  *
  *     This code REQUIRES 2.1.15 or higher
  *
@@ -15,7 +15,7 @@
  *
  *     History
  *     X.25 001        Split from x25_subr.c
- *     mar/20/00       Daniela Squassoni Disabling/enabling of facilities 
+ *     mar/20/00       Daniela Squassoni Disabling/enabling of facilities
  *                                       negotiation.
  *     apr/14/05       Shaun Pereira - Allow fast select with no restriction
  *                                     on response.
@@ -125,8 +125,8 @@ int x25_parse_facilities(struct sk_buff *skb, struct x25_facilities *facilities,
                        break;
                case X25_FAC_CLASS_D:
                        switch (*p) {
-                       case X25_FAC_CALLING_AE:
-                               if (p[1] > X25_MAX_DTE_FACIL_LEN)
+                       case X25_FAC_CALLING_AE:
+                               if (p[1] > X25_MAX_DTE_FACIL_LEN)
                                        break;
                                dte_facs->calling_len = p[2];
                                memcpy(dte_facs->calling_ae, &p[3], p[1] - 1);
@@ -293,7 +293,7 @@ int x25_negotiate_facilities(struct sk_buff *skb, struct sock *sk,
 }
 
 /*
- *     Limit values of certain facilities according to the capability of the 
+ *     Limit values of certain facilities according to the capability of the
  *      currently attached x25 link.
  */
 void x25_limit_facilities(struct x25_facilities *facilities,
index eed50e10f09be6f93d1f3cce4febfba0400714c0..c5239fcdefa0c6b155364ad70e7a11c3423982ec 100644 (file)
@@ -3,7 +3,7 @@
  *
  *     This is ALPHA test software. This code may break your machine,
  *     randomly fail to work with new releases, misbehave and/or generally
- *     screw up. It might even work. 
+ *     screw up. It might even work.
  *
  *     This code REQUIRES 2.1.15 or higher
  *
@@ -17,7 +17,7 @@
  *     X.25 001        Jonathan Naylor   Started coding.
  *     X.25 002        Jonathan Naylor   Centralised disconnection code.
  *                                       New timer architecture.
- *     2000-03-20      Daniela Squassoni Disabling/enabling of facilities 
+ *     2000-03-20      Daniela Squassoni Disabling/enabling of facilities
  *                                       negotiation.
  *     2000-11-10      Henner Eisen      Check and reset for out-of-sequence
  *                                       i-frames.
@@ -67,7 +67,7 @@ static int x25_queue_rx_frame(struct sock *sk, struct sk_buff *skb, int more)
                        kfree_skb(skbo);
                }
 
-               x25->fraglen = 0;               
+               x25->fraglen = 0;
        }
 
        skb_set_owner_r(skbn, sk);
@@ -167,7 +167,7 @@ static int x25_state3_machine(struct sock *sk, struct sk_buff *skb, int frametyp
        int queued = 0;
        int modulus;
        struct x25_sock *x25 = x25_sk(sk);
-       
+
        modulus = (x25->neighbour->extended) ? X25_EMODULUS : X25_SMODULUS;
 
        switch (frametype) {
index 0a760fe66843fa128858aa67c1959b4b39bb0f46..741ce95d4ad156b65f12a5693776a20a60d91d03 100644 (file)
@@ -3,7 +3,7 @@
  *
  *     This is ALPHA test software. This code may break your machine,
  *     randomly fail to work with new releases, misbehave and/or generally
- *     screw up. It might even work. 
+ *     screw up. It might even work.
  *
  *     This code REQUIRES 2.1.15 or higher
  *
@@ -16,7 +16,7 @@
  *     History
  *     X.25 001        Jonathan Naylor   Started coding.
  *     X.25 002        Jonathan Naylor   New timer architecture.
- *     mar/20/00       Daniela Squassoni Disabling/enabling of facilities 
+ *     mar/20/00       Daniela Squassoni Disabling/enabling of facilities
  *                                       negotiation.
  *     2000-09-04      Henner Eisen      dev_hold() / dev_put() for x25_neigh.
  */
@@ -94,7 +94,7 @@ void x25_link_control(struct sk_buff *skb, struct x25_neigh *nb,
                               skb->data[3], skb->data[4],
                               skb->data[5], skb->data[6]);
                        break;
-                       
+
                default:
                        printk(KERN_WARNING "x25: received unknown %02X "
                               "with LCI 000\n", frametype);
index a2e62cea819a05547816e113bb8b3d2de6a0ac4f..6f5737853912a9d66185979195d725629e53a873 100644 (file)
@@ -3,7 +3,7 @@
  *
  *     This is ALPHA test software. This code may break your machine,
  *     randomly fail to work with new releases, misbehave and/or generally
- *     screw up. It might even work. 
+ *     screw up. It might even work.
  *
  *     This code REQUIRES 2.1.15 or higher
  *
@@ -78,7 +78,7 @@ int x25_output(struct sock *sk, struct sk_buff *skb)
                                               "sent\n", err, sent);
                                return err;
                        }
-                               
+
                        skb_reserve(skbn, frontlen);
 
                        len = max_len > skb->len ? skb->len : max_len;
@@ -101,7 +101,7 @@ int x25_output(struct sock *sk, struct sk_buff *skb)
                        skb_queue_tail(&sk->sk_write_queue, skbn);
                        sent += len;
                }
-               
+
                kfree_skb(skb);
        } else {
                skb_queue_tail(&sk->sk_write_queue, skb);
@@ -110,7 +110,7 @@ int x25_output(struct sock *sk, struct sk_buff *skb)
        return sent;
 }
 
-/* 
+/*
  *     This procedure is passed a buffer descriptor for an iframe. It builds
  *     the rest of the control part of the frame and then writes it out.
  */
@@ -131,7 +131,7 @@ static void x25_send_iframe(struct sock *sk, struct sk_buff *skb)
                skb->data[2] |= (x25->vr << 5) & 0xE0;
        }
 
-       x25_transmit_link(skb, x25->neighbour); 
+       x25_transmit_link(skb, x25->neighbour);
 }
 
 void x25_kick(struct sock *sk)
index e0470bd8c2f9e6e8282e34285fdc82cb7e59b14b..96001f0c64fc16a8f4cd32512bb31adab912ec5f 100644 (file)
@@ -3,7 +3,7 @@
  *
  *     This is ALPHA test software. This code may break your machine,
  *     randomly fail to work with new releases, misbehave and/or generally
- *     screw up. It might even work. 
+ *     screw up. It might even work.
  *
  *     This code REQUIRES 2.4 with seq_file support
  *
@@ -62,7 +62,7 @@ static void *x25_seq_route_next(struct seq_file *seq, void *v, loff_t *pos)
        rt = v;
        if (rt->node.next != &x25_route_list)
                rt = list_entry(rt->node.next, struct x25_route, node);
-       else 
+       else
                rt = NULL;
 out:
        return rt;
@@ -88,7 +88,7 @@ static int x25_seq_route_show(struct seq_file *seq, void *v)
                   rt->dev ? rt->dev->name : "???");
 out:
        return 0;
-} 
+}
 
 static __inline__ struct sock *x25_get_socket_idx(loff_t pos)
 {
@@ -163,7 +163,7 @@ static int x25_seq_socket_show(struct seq_file *seq, void *v)
                   s->sk_socket ? SOCK_INODE(s->sk_socket)->i_ino : 0L);
 out:
        return 0;
-} 
+}
 
 static __inline__ struct x25_forward *x25_get_forward_idx(loff_t pos)
 {
@@ -270,7 +270,7 @@ static int x25_seq_forward_open(struct inode *inode, struct file *file)
        return seq_open(file, &x25_seq_forward_ops);
 }
 
-static struct file_operations x25_seq_socket_fops = {
+static const struct file_operations x25_seq_socket_fops = {
        .owner          = THIS_MODULE,
        .open           = x25_seq_socket_open,
        .read           = seq_read,
@@ -278,7 +278,7 @@ static struct file_operations x25_seq_socket_fops = {
        .release        = seq_release,
 };
 
-static struct file_operations x25_seq_route_fops = {
+static const struct file_operations x25_seq_route_fops = {
        .owner          = THIS_MODULE,
        .open           = x25_seq_route_open,
        .read           = seq_read,
index 883a848bca5bb6e1f6c74fb64e3b7d4f1bf1535a..060fcfaa2f47c3ec8465348336dd4a095546b22e 100644 (file)
@@ -3,7 +3,7 @@
  *
  *     This is ALPHA test software. This code may break your machine,
  *     randomly fail to work with new releases, misbehave and/or generally
- *     screw up. It might even work. 
+ *     screw up. It might even work.
  *
  *     This code REQUIRES 2.1.15 or higher
  *
index 71ff3088f6fe325cb7321df423566ce59e420b5e..2af190dc5b014ef8f544772d188c668e367f3a90 100644 (file)
@@ -3,7 +3,7 @@
  *
  *     This is ALPHA test software. This code may break your machine,
  *     randomly fail to work with new releases, misbehave and/or generally
- *     screw up. It might even work. 
+ *     screw up. It might even work.
  *
  *     This code REQUIRES 2.1.15 or higher
  *
@@ -99,8 +99,8 @@ static void x25_heartbeat_expiry(unsigned long param)
 {
        struct sock *sk = (struct sock *)param;
 
-        bh_lock_sock(sk);
-        if (sock_owned_by_user(sk)) /* can currently only occur in state 3 */ 
+       bh_lock_sock(sk);
+       if (sock_owned_by_user(sk)) /* can currently only occur in state 3 */
                goto restart_heartbeat;
 
        switch (x25_sk(sk)->state) {
index 248f94814dfbd33d951ae539f286ec1287e55654..f373a8a7d9c84830c8c95664a122370e936b97df 100644 (file)
@@ -1,11 +1,11 @@
-/* 
+/*
  * xfrm algorithm interface
  *
  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
  *
  * 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) 
+ * Software Foundation; either version 2 of the License, or (at your option)
  * any later version.
  */
 
@@ -32,14 +32,14 @@ static struct xfrm_algo_desc aalg_list[] = {
 {
        .name = "hmac(digest_null)",
        .compat = "digest_null",
-       
+
        .uinfo = {
                .auth = {
                        .icv_truncbits = 0,
                        .icv_fullbits = 0,
                }
        },
-       
+
        .desc = {
                .sadb_alg_id = SADB_X_AALG_NULL,
                .sadb_alg_ivlen = 0,
@@ -57,7 +57,7 @@ static struct xfrm_algo_desc aalg_list[] = {
                        .icv_fullbits = 128,
                }
        },
-       
+
        .desc = {
                .sadb_alg_id = SADB_AALG_MD5HMAC,
                .sadb_alg_ivlen = 0,
@@ -142,14 +142,14 @@ static struct xfrm_algo_desc ealg_list[] = {
 {
        .name = "ecb(cipher_null)",
        .compat = "cipher_null",
-       
+
        .uinfo = {
                .encr = {
                        .blockbits = 8,
                        .defkeybits = 0,
                }
        },
-       
+
        .desc = {
                .sadb_alg_id =  SADB_EALG_NULL,
                .sadb_alg_ivlen = 0,
@@ -248,22 +248,22 @@ static struct xfrm_algo_desc ealg_list[] = {
        }
 },
 {
-        .name = "cbc(serpent)",
-        .compat = "serpent",
-
-        .uinfo = {
-                .encr = {
-                        .blockbits = 128,
-                        .defkeybits = 128,
-                }
-        },
-
-        .desc = {
-                .sadb_alg_id = SADB_X_EALG_SERPENTCBC,
-                .sadb_alg_ivlen = 8,
-                .sadb_alg_minbits = 128,
-                .sadb_alg_maxbits = 256,
-        }
+       .name = "cbc(serpent)",
+       .compat = "serpent",
+
+       .uinfo = {
+               .encr = {
+                       .blockbits = 128,
+                       .defkeybits = 128,
+               }
+       },
+
+       .desc = {
+               .sadb_alg_id = SADB_X_EALG_SERPENTCBC,
+               .sadb_alg_ivlen = 8,
+               .sadb_alg_minbits = 128,
+               .sadb_alg_maxbits = 256,
+       }
 },
 {
        .name = "cbc(camellia)",
@@ -283,22 +283,22 @@ static struct xfrm_algo_desc ealg_list[] = {
        }
 },
 {
-        .name = "cbc(twofish)",
-        .compat = "twofish",
-                 
-        .uinfo = {
-                .encr = {
-                        .blockbits = 128,
-                        .defkeybits = 128,
-                }
-        },
-
-        .desc = {
-                .sadb_alg_id = SADB_X_EALG_TWOFISHCBC,
-                .sadb_alg_ivlen = 8,
-                .sadb_alg_minbits = 128,
-                .sadb_alg_maxbits = 256
-        }
+       .name = "cbc(twofish)",
+       .compat = "twofish",
+
+       .uinfo = {
+               .encr = {
+                       .blockbits = 128,
+                       .defkeybits = 128,
+               }
+       },
+
+       .desc = {
+               .sadb_alg_id = SADB_X_EALG_TWOFISHCBC,
+               .sadb_alg_ivlen = 8,
+               .sadb_alg_minbits = 128,
+               .sadb_alg_maxbits = 256
+       }
 },
 };
 
@@ -478,7 +478,7 @@ void xfrm_probe_algs(void)
 {
 #ifdef CONFIG_CRYPTO
        int i, status;
-       
+
        BUG_ON(in_softirq());
 
        for (i = 0; i < aalg_entries(); i++) {
@@ -487,14 +487,14 @@ void xfrm_probe_algs(void)
                if (aalg_list[i].available != status)
                        aalg_list[i].available = status;
        }
-       
+
        for (i = 0; i < ealg_entries(); i++) {
                status = crypto_has_blkcipher(ealg_list[i].name, 0,
                                              CRYPTO_ALG_ASYNC);
                if (ealg_list[i].available != status)
                        ealg_list[i].available = status;
        }
-       
+
        for (i = 0; i < calg_entries(); i++) {
                status = crypto_has_comp(calg_list[i].name, 0,
                                         CRYPTO_ALG_ASYNC);
@@ -541,15 +541,15 @@ int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *desc,
        if (copy > 0) {
                if (copy > len)
                        copy = len;
-               
+
                sg.page = virt_to_page(skb->data + offset);
                sg.offset = (unsigned long)(skb->data + offset) % PAGE_SIZE;
                sg.length = copy;
-               
+
                err = icv_update(desc, &sg, copy);
                if (unlikely(err))
                        return err;
-               
+
                if ((len -= copy) == 0)
                        return 0;
                offset += copy;
@@ -566,11 +566,11 @@ int skb_icv_walk(const struct sk_buff *skb, struct hash_desc *desc,
 
                        if (copy > len)
                                copy = len;
-                       
+
                        sg.page = frag->page;
                        sg.offset = frag->page_offset + offset-start;
                        sg.length = copy;
-                       
+
                        err = icv_update(desc, &sg, copy);
                        if (unlikely(err))
                                return err;
index 414f890703802a0e2ef761df2573561f54f1b79e..ee15bdae14196d092b85ce9aa5123e5d128d0a25 100644 (file)
@@ -4,7 +4,7 @@
  * Changes:
  *     YOSHIFUJI Hideaki @USAGI
  *             Split up af-specific portion
- *     
+ *
  */
 
 #include <linux/slab.h>
index fa7ce060b454ea9c01343d38b7c1ebcde96d1c2c..946b715db5ec8c708287d8d5ae51a2eb4d77ab8e 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
  * xfrm_policy.c
  *
  * Changes:
@@ -151,7 +151,7 @@ retry:
        return type;
 }
 
-int xfrm_dst_lookup(struct xfrm_dst **dst, struct flowi *fl, 
+int xfrm_dst_lookup(struct xfrm_dst **dst, struct flowi *fl,
                    unsigned short family)
 {
        struct xfrm_policy_afinfo *afinfo = xfrm_policy_get_afinfo(family);
@@ -262,7 +262,7 @@ static inline unsigned long make_jiffies(long secs)
        if (secs >= (MAX_SCHEDULE_TIMEOUT-1)/HZ)
                return MAX_SCHEDULE_TIMEOUT-1;
        else
-               return secs*HZ;
+               return secs*HZ;
 }
 
 static void xfrm_policy_timer(unsigned long data)
@@ -1024,17 +1024,17 @@ end:
 static inline int policy_to_flow_dir(int dir)
 {
        if (XFRM_POLICY_IN == FLOW_DIR_IN &&
-           XFRM_POLICY_OUT == FLOW_DIR_OUT &&
-           XFRM_POLICY_FWD == FLOW_DIR_FWD)
-               return dir;
-       switch (dir) {
-       default:
-       case XFRM_POLICY_IN:
-               return FLOW_DIR_IN;
-       case XFRM_POLICY_OUT:
-               return FLOW_DIR_OUT;
-       case XFRM_POLICY_FWD:
-               return FLOW_DIR_FWD;
+           XFRM_POLICY_OUT == FLOW_DIR_OUT &&
+           XFRM_POLICY_FWD == FLOW_DIR_FWD)
+               return dir;
+       switch (dir) {
+       default:
+       case XFRM_POLICY_IN:
+               return FLOW_DIR_IN;
+       case XFRM_POLICY_OUT:
+               return FLOW_DIR_OUT;
+       case XFRM_POLICY_FWD:
+               return FLOW_DIR_FWD;
        };
 }
 
@@ -1044,9 +1044,9 @@ static struct xfrm_policy *xfrm_sk_policy_lookup(struct sock *sk, int dir, struc
 
        read_lock_bh(&xfrm_policy_lock);
        if ((pol = sk->sk_policy[dir]) != NULL) {
-               int match = xfrm_selector_match(&pol->selector, fl,
+               int match = xfrm_selector_match(&pol->selector, fl,
                                                sk->sk_family);
-               int err = 0;
+               int err = 0;
 
                if (match) {
                        err = security_xfrm_policy_lookup(pol, fl->secid,
@@ -1511,7 +1511,7 @@ restart:
        }
        *dst_p = dst;
        dst_release(dst_orig);
-       xfrm_pols_put(pols, npols);
+       xfrm_pols_put(pols, npols);
        return 0;
 
 error:
@@ -1546,11 +1546,11 @@ xfrm_secpath_reject(int idx, struct sk_buff *skb, struct flowi *fl)
  */
 
 static inline int
-xfrm_state_ok(struct xfrm_tmpl *tmpl, struct xfrm_state *x, 
+xfrm_state_ok(struct xfrm_tmpl *tmpl, struct xfrm_state *x,
              unsigned short family)
 {
        if (xfrm_state_kern(x))
-               return tmpl->optional && !xfrm_state_addr_cmp(tmpl, x, family);
+               return tmpl->optional && !xfrm_state_addr_cmp(tmpl, x, tmpl->encap_family);
        return  x->id.proto == tmpl->id.proto &&
                (x->id.spi == tmpl->id.spi || !tmpl->id.spi) &&
                (x->props.reqid == tmpl->reqid || !tmpl->reqid) &&
@@ -1619,7 +1619,7 @@ static inline int secpath_has_nontransport(struct sec_path *sp, int k, int *idxp
        return 0;
 }
 
-int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb, 
+int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,
                        unsigned short family)
 {
        struct xfrm_policy *pol;
@@ -1997,9 +1997,14 @@ void xfrm_audit_log(uid_t auid, u32 sid, int type, int result,
        if (audit_enabled == 0)
                return;
 
+       BUG_ON((type == AUDIT_MAC_IPSEC_ADDSA ||
+               type == AUDIT_MAC_IPSEC_DELSA) && !x);
+       BUG_ON((type == AUDIT_MAC_IPSEC_ADDSPD ||
+               type == AUDIT_MAC_IPSEC_DELSPD) && !xp);
+
        audit_buf = audit_log_start(current->audit_context, GFP_ATOMIC, type);
        if (audit_buf == NULL)
-       return;
+               return;
 
        switch(type) {
        case AUDIT_MAC_IPSEC_ADDSA:
@@ -2243,7 +2248,7 @@ static int xfrm_migrate_selector_match(struct xfrm_selector *sel_cmp,
        if (sel_cmp->proto == IPSEC_ULPROTO_ANY) {
                if (sel_tgt->family == sel_cmp->family &&
                    xfrm_addr_cmp(&sel_tgt->daddr, &sel_cmp->daddr,
-                                 sel_cmp->family) == 0 &&
+                                 sel_cmp->family) == 0 &&
                    xfrm_addr_cmp(&sel_tgt->saddr, &sel_cmp->saddr,
                                  sel_cmp->family) == 0 &&
                    sel_tgt->prefixlen_d == sel_cmp->prefixlen_d &&
index 91b02687db52a62ea60370e8c4066459e0033ac7..a35f9e4ede2674625b13191a9fd58736e81cbe91 100644 (file)
@@ -227,7 +227,7 @@ static inline unsigned long make_jiffies(long secs)
        if (secs >= (MAX_SCHEDULE_TIMEOUT-1)/HZ)
                return MAX_SCHEDULE_TIMEOUT-1;
        else
-               return secs*HZ;
+               return secs*HZ;
 }
 
 static void xfrm_timer_handler(unsigned long data)
@@ -523,7 +523,7 @@ static void xfrm_hash_grow_check(int have_hash_collision)
 }
 
 struct xfrm_state *
-xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr, 
+xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
                struct flowi *fl, struct xfrm_tmpl *tmpl,
                struct xfrm_policy *pol, int *err,
                unsigned short family)
@@ -534,7 +534,7 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
        int acquire_in_progress = 0;
        int error = 0;
        struct xfrm_state *best = NULL;
-       
+
        spin_lock_bh(&xfrm_state_lock);
        hlist_for_each_entry(x, entry, xfrm_state_bydst+h, bydst) {
                if (x->props.family == family &&
@@ -570,7 +570,7 @@ xfrm_state_find(xfrm_address_t *daddr, xfrm_address_t *saddr,
                                acquire_in_progress = 1;
                        } else if (x->km.state == XFRM_STATE_ERROR ||
                                   x->km.state == XFRM_STATE_EXPIRED) {
-                               if (xfrm_selector_match(&x->sel, fl, family) &&
+                               if (xfrm_selector_match(&x->sel, fl, family) &&
                                    security_xfrm_state_pol_flow_match(x, pol, fl))
                                        error = -ESRCH;
                        }
@@ -866,7 +866,7 @@ struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig, int *errp)
        }
        x->props.calgo = orig->props.calgo;
 
-        if (orig->encap) {
+       if (orig->encap) {
                x->encap = kmemdup(orig->encap, sizeof(*x->encap), GFP_KERNEL);
                if (!x->encap)
                        goto error;
@@ -947,7 +947,7 @@ struct xfrm_state * xfrm_migrate_state_find(struct xfrm_migrate *m)
                }
        }
 
-        return NULL;
+       return NULL;
 }
 EXPORT_SYMBOL(xfrm_migrate_state_find);
 
@@ -1121,8 +1121,8 @@ xfrm_state_lookup_byaddr(xfrm_address_t *daddr, xfrm_address_t *saddr,
 EXPORT_SYMBOL(xfrm_state_lookup_byaddr);
 
 struct xfrm_state *
-xfrm_find_acq(u8 mode, u32 reqid, u8 proto, 
-             xfrm_address_t *daddr, xfrm_address_t *saddr, 
+xfrm_find_acq(u8 mode, u32 reqid, u8 proto,
+             xfrm_address_t *daddr, xfrm_address_t *saddr,
              int create, unsigned short family)
 {
        struct xfrm_state *x;
@@ -1738,7 +1738,7 @@ error:
 }
 
 EXPORT_SYMBOL(xfrm_init_state);
+
 void __init xfrm_state_init(void)
 {
        unsigned int sz;
index 079a5d3157592842847b6f4a823fcf9c7e477ffb..2567453216113fdd5e23a51e856f1a6526abfc7b 100644 (file)
@@ -48,7 +48,7 @@ static int verify_one_alg(struct rtattr **xfrma, enum xfrm_attr_type_t type)
 
        algp = RTA_DATA(rt);
 
-       len -= (algp->alg_key_len + 7U) / 8; 
+       len -= (algp->alg_key_len + 7U) / 8;
        if (len < 0)
                return -EINVAL;
 
@@ -1107,7 +1107,7 @@ static int copy_sec_ctx(struct xfrm_sec_ctx *s, struct sk_buff *skb)
        uctx->ctx_alg = s->ctx_alg;
        uctx->ctx_len = s->ctx_len;
        memcpy(uctx + 1, s->ctx_str, s->ctx_len);
-       return 0;
+       return 0;
 
  rtattr_failure:
        return -1;
@@ -1273,10 +1273,6 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh,
                xp = xfrm_policy_bysel_ctx(type, p->dir, &p->sel, tmp.security, delete);
                security_xfrm_policy_free(&tmp);
        }
-       if (delete)
-               xfrm_audit_log(NETLINK_CB(skb).loginuid, NETLINK_CB(skb).sid,
-                              AUDIT_MAC_IPSEC_DELSPD, (xp) ? 1 : 0, xp, NULL);
-
        if (xp == NULL)
                return -ENOENT;
 
@@ -1292,8 +1288,14 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh,
                                              MSG_DONTWAIT);
                }
        } else {
-               if ((err = security_xfrm_policy_delete(xp)) != 0)
+               err = security_xfrm_policy_delete(xp);
+
+               xfrm_audit_log(NETLINK_CB(skb).loginuid, NETLINK_CB(skb).sid,
+                              AUDIT_MAC_IPSEC_DELSPD, err ? 0 : 1, xp, NULL);
+
+               if (err != 0)
                        goto out;
+
                c.data.byid = p->index;
                c.event = nlh->nlmsg_type;
                c.seq = nlh->nlmsg_seq;
@@ -2467,7 +2469,7 @@ static int __init xfrm_user_init(void)
        printk(KERN_INFO "Initializing XFRM netlink socket\n");
 
        nlsk = netlink_kernel_create(NETLINK_XFRM, XFRMNLGRP_MAX,
-                                    xfrm_netlink_rcv, THIS_MODULE);
+                                    xfrm_netlink_rcv, THIS_MODULE);
        if (nlsk == NULL)
                return -ENOMEM;
        rcu_assign_pointer(xfrm_nl, nlsk);
index c0ae0a7ddb427e2ba05fc4c67a0b64ddf4f1fbb4..512c2f5c341d015cc06b5e9361ee06592ab57b9d 100644 (file)
@@ -89,6 +89,7 @@ void ConfigItem::okRename(int col)
 {
        Parent::okRename(col);
        sym_set_string_value(menu->sym, text(dataColIdx).latin1());
+       listView()->updateList(this);
 }
 #endif
 
@@ -605,6 +606,8 @@ void ConfigList::updateMenuList(P* parent, struct menu* menu)
 
                visible = menu_is_visible(child);
                if (showAll || visible) {
+                       if (!child->sym && !child->list && !child->prompt)
+                               continue;
                        if (!item || item->menu != child)
                                item = new ConfigItem(parent, last, child, visible);
                        else
@@ -1247,6 +1250,7 @@ void ConfigSearchWindow::search(void)
 
        free(result);
        list->list->clear();
+       info->clear();
 
        result = sym_re_search(editField->text().latin1());
        if (!result)
@@ -1316,7 +1320,7 @@ ConfigMainWindow::ConfigMainWindow(void)
        conf_changed();
        QAction *saveAsAction = new QAction("Save As...", "Save &As...", 0, this);
          connect(saveAsAction, SIGNAL(activated()), SLOT(saveConfigAs()));
-       QAction *searchAction = new QAction("Search", "&Search", CTRL+Key_F, this);
+       QAction *searchAction = new QAction("Find", "&Find", CTRL+Key_F, this);
          connect(searchAction, SIGNAL(activated()), SLOT(searchConfig()));
        QAction *singleViewAction = new QAction("Single View", QPixmap(xpm_single_view), "Split View", 0, this);
          connect(singleViewAction, SIGNAL(activated()), SLOT(showSingleView()));
@@ -1373,10 +1377,13 @@ ConfigMainWindow::ConfigMainWindow(void)
        saveAction->addTo(config);
        saveAsAction->addTo(config);
        config->insertSeparator();
-       searchAction->addTo(config);
-       config->insertSeparator();
        quitAction->addTo(config);
 
+       // create edit menu
+       QPopupMenu* editMenu = new QPopupMenu(this);
+       menu->insertItem("&Edit", editMenu);
+       searchAction->addTo(editMenu);
+
        // create options menu
        QPopupMenu* optionMenu = new QPopupMenu(this);
        menu->insertItem("&Option", optionMenu);
@@ -1467,7 +1474,10 @@ void ConfigMainWindow::searchConfig(void)
 void ConfigMainWindow::changeMenu(struct menu *menu)
 {
        configList->setRootMenu(menu);
-       backAction->setEnabled(TRUE);
+       if (configList->rootEntry->parent == &rootmenu)
+               backAction->setEnabled(FALSE);
+       else
+               backAction->setEnabled(TRUE);
 }
 
 void ConfigMainWindow::setMenuLink(struct menu *menu)
index f50a70f550b39b37566269d466eaebd33de50ea6..4d928b859845d02ba63cf128c7165bc4896b0fac 100755 (executable)
@@ -83,7 +83,7 @@ use strict;
 #  * my_function
 #  **/
 #
-# If the Description: header tag is ommitted, then there must be a blank line
+# If the Description: header tag is omitted, then there must be a blank line
 # after the last parameter specification.
 # e.g.
 # /**
@@ -265,7 +265,7 @@ my $doc_start = '^/\*\*\s*$'; # Allow whitespace at end of comment start.
 my $doc_end = '\*/';
 my $doc_com = '\s*\*\s*';
 my $doc_decl = $doc_com.'(\w+)';
-my $doc_sect = $doc_com.'(['.$doc_special.']?[\w ]+):(.*)';
+my $doc_sect = $doc_com.'(['.$doc_special.']?[\w\s]+):(.*)';
 my $doc_content = $doc_com.'(.*)';
 my $doc_block = $doc_com.'DOC:\s*(.*)?';
 
@@ -365,7 +365,7 @@ sub dump_section {
 #  parameterlist => @list of parameters
 #  parameterdescs => %parameter descriptions
 #  sectionlist => @list of sections
-#  sections => %descriont descriptions
+#  sections => %section descriptions
 #
 
 sub output_highlight {
@@ -583,14 +583,14 @@ sub output_function_xml(%) {
     $id = "API-".$args{'function'};
     $id =~ s/[^A-Za-z0-9]/-/g;
 
-    print "<refentry>\n";
+    print "<refentry id=\"$id\">\n";
     print "<refentryinfo>\n";
     print " <title>LINUX</title>\n";
     print " <productname>Kernel Hackers Manual</productname>\n";
     print " <date>$man_date</date>\n";
     print "</refentryinfo>\n";
     print "<refmeta>\n";
-    print " <refentrytitle><phrase id=\"$id\">".$args{'function'}."</phrase></refentrytitle>\n";
+    print " <refentrytitle><phrase>".$args{'function'}."</phrase></refentrytitle>\n";
     print " <manvolnum>9</manvolnum>\n";
     print "</refmeta>\n";
     print "<refnamediv>\n";
@@ -659,14 +659,14 @@ sub output_struct_xml(%) {
     $id = "API-struct-".$args{'struct'};
     $id =~ s/[^A-Za-z0-9]/-/g;
 
-    print "<refentry>\n";
+    print "<refentry id=\"$id\">\n";
     print "<refentryinfo>\n";
     print " <title>LINUX</title>\n";
     print " <productname>Kernel Hackers Manual</productname>\n";
     print " <date>$man_date</date>\n";
     print "</refentryinfo>\n";
     print "<refmeta>\n";
-    print " <refentrytitle><phrase id=\"$id\">".$args{'type'}." ".$args{'struct'}."</phrase></refentrytitle>\n";
+    print " <refentrytitle><phrase>".$args{'type'}." ".$args{'struct'}."</phrase></refentrytitle>\n";
     print " <manvolnum>9</manvolnum>\n";
     print "</refmeta>\n";
     print "<refnamediv>\n";
@@ -743,14 +743,14 @@ sub output_enum_xml(%) {
     $id = "API-enum-".$args{'enum'};
     $id =~ s/[^A-Za-z0-9]/-/g;
 
-    print "<refentry>\n";
+    print "<refentry id=\"$id\">\n";
     print "<refentryinfo>\n";
     print " <title>LINUX</title>\n";
     print " <productname>Kernel Hackers Manual</productname>\n";
     print " <date>$man_date</date>\n";
     print "</refentryinfo>\n";
     print "<refmeta>\n";
-    print " <refentrytitle><phrase id=\"$id\">enum ".$args{'enum'}."</phrase></refentrytitle>\n";
+    print " <refentrytitle><phrase>enum ".$args{'enum'}."</phrase></refentrytitle>\n";
     print " <manvolnum>9</manvolnum>\n";
     print "</refmeta>\n";
     print "<refnamediv>\n";
@@ -809,14 +809,14 @@ sub output_typedef_xml(%) {
     $id = "API-typedef-".$args{'typedef'};
     $id =~ s/[^A-Za-z0-9]/-/g;
 
-    print "<refentry>\n";
+    print "<refentry id=\"$id\">\n";
     print "<refentryinfo>\n";
     print " <title>LINUX</title>\n";
     print " <productname>Kernel Hackers Manual</productname>\n";
     print " <date>$man_date</date>\n";
     print "</refentryinfo>\n";
     print "<refmeta>\n";
-    print " <refentrytitle><phrase id=\"$id\">typedef ".$args{'typedef'}."</phrase></refentrytitle>\n";
+    print " <refentrytitle><phrase>typedef ".$args{'typedef'}."</phrase></refentrytitle>\n";
     print " <manvolnum>9</manvolnum>\n";
     print "</refmeta>\n";
     print "<refnamediv>\n";
@@ -953,7 +953,11 @@ sub output_function_man(%) {
     print $args{'function'}." \\- ".$args{'purpose'}."\n";
 
     print ".SH SYNOPSIS\n";
-    print ".B \"".$args{'functiontype'}."\" ".$args{'function'}."\n";
+    if ($args{'functiontype'} ne "") {
+       print ".B \"".$args{'functiontype'}."\" ".$args{'function'}."\n";
+    } else {
+       print ".B \"".$args{'function'}."\n";
+    }
     $count = 0;
     my $parenth = "(";
     my $post = ",";
@@ -1118,13 +1122,19 @@ sub output_intro_man(%) {
 sub output_function_text(%) {
     my %args = %{$_[0]};
     my ($parameter, $section);
+    my $start;
 
     print "Name:\n\n";
     print $args{'function'}." - ".$args{'purpose'}."\n";
 
     print "\nSynopsis:\n\n";
-    my $start=$args{'functiontype'}." ".$args{'function'}." (";
+    if ($args{'functiontype'} ne "") {
+       $start = $args{'functiontype'}." ".$args{'function'}." (";
+    } else {
+       $start = $args{'function'}." (";
+    }
     print $start;
+
     my $count = 0;
     foreach my $parameter (@{$args{'parameterlist'}}) {
        $type = $args{'parametertypes'}{$parameter};
@@ -1433,7 +1443,7 @@ sub create_parameterlist($$$) {
        } elsif ($arg =~ m/\(.*\*/) {
            # pointer-to-function
            $arg =~ tr/#/,/;
-           $arg =~ m/[^\(]+\(\*([^\)]+)\)/;
+           $arg =~ m/[^\(]+\(\*\s*([^\)]+)\)/;
            $param = $1;
            $type = $arg;
            $type =~ s/([^\(]+\(\*)$param/$1/;
@@ -1536,7 +1546,7 @@ sub dump_function($$) {
     $prototype =~ s/^__always_inline +//;
     $prototype =~ s/^noinline +//;
     $prototype =~ s/__devinit +//;
-    $prototype =~ s/^#define +//; #ak added
+    $prototype =~ s/^#define\s+//; #ak added
     $prototype =~ s/__attribute__ \(\([a-z,]*\)\)//;
 
     # Yes, this truly is vile.  We are looking for:
@@ -1570,7 +1580,8 @@ sub dump_function($$) {
        $prototype =~ m/^(\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
        $prototype =~ m/^(\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
        $prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+)\s+([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
-       $prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/)  {
+       $prototype =~ m/^(\w+\s+\w+\s+\w+\s+\w+\s*\*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/ ||
+       $prototype =~ m/^(\w+\s+\w+\s*\*\s*\w+\s*\*\s*)\s*([a-zA-Z0-9_~:]+)\s*\(([^\{]*)\)/)  {
        $return_type = $1;
        $declaration_name = $2;
        my $args = $3;
@@ -1710,6 +1721,7 @@ sub process_file($) {
     my $file;
     my $identifier;
     my $func;
+    my $descr;
     my $initial_section_counter = $section_counter;
 
     if (defined($ENV{'SRCTREE'})) {
@@ -1753,7 +1765,12 @@ sub process_file($) {
 
                $state = 2;
                if (/-(.*)/) {
-                   $declaration_purpose = xml_escape($1);
+                   # strip leading/trailing/multiple spaces #RDD:T:
+                   $descr= $1;
+                   $descr =~ s/^\s*//;
+                   $descr =~ s/\s*$//;
+                   $descr =~ s/\s+/ /;
+                   $declaration_purpose = xml_escape($descr);
                } else {
                    $declaration_purpose = "";
                }
index d7b8a384b4a7991960d33c7c01c60d6f58f92fd6..82d0af46f0ef01a6b10ccdbfc22614cc56436bed 100755 (executable)
@@ -58,7 +58,7 @@ UTS_TRUNCATE="sed -e s/\(.\{1,$UTS_LEN\}\).*/\1/"
     echo \#define LINUX_COMPILE_DOMAIN
   fi
 
-  echo \#define LINUX_COMPILER \"`$CC -v 2>&1 | tail -n 1`\"
+  echo \#define LINUX_COMPILER \"`LC_ALL=C LANG=C $CC -v 2>&1 | tail -n 1`\"
 ) > .tmpcompile
 
 # Only replace the real compile.h if the new one is different,
index 52a17ab97eb0c371070b4e310fb3822936ed79a1..4b06c5eea7283a94524c149f598cfef66872eaaa 100755 (executable)
@@ -4,12 +4,15 @@
 # Build U-Boot image when `mkimage' tool is available.
 #
 
-MKIMAGE=$(type -path mkimage)
+MKIMAGE=$(type -path ${CROSS_COMPILE}mkimage)
 
 if [ -z "${MKIMAGE}" ]; then
-       # Doesn't exist
-       echo '"mkimage" command not found - U-Boot images will not be built' >&2
-       exit 0;
+       MKIMAGE=$(type -path mkimage)
+       if [ -z "${MKIMAGE}" ]; then
+               # Doesn't exist
+               echo '"mkimage" command not found - U-Boot images will not be built' >&2
+               exit 0;
+       fi
 fi
 
 # Call "mkimage" to create U-Boot image
index 2aa47623f5f8cec51322f883b60d6c932722663c..569e68410d7a96a78f2673d4fdaf12bfc65136af 100644 (file)
@@ -641,12 +641,20 @@ static int secref_whitelist(const char *modname, const char *tosec,
        if (f1 && f2)
                return 1;
 
-       /* Whitelist all references from .pci_fixup section if vmlinux */
+       /* Whitelist all references from .pci_fixup section if vmlinux
+        * Whitelist all refereces from .text.head to .init.data if vmlinux
+        * Whitelist all refereces from .text.head to .init.text if vmlinux
+        */
        if (is_vmlinux(modname)) {
                if ((strcmp(fromsec, ".pci_fixup") == 0) &&
                    (strcmp(tosec, ".init.text") == 0))
                return 1;
 
+               if ((strcmp(fromsec, ".text.head") == 0) &&
+                       ((strcmp(tosec, ".init.data") == 0) ||
+                       (strcmp(tosec, ".init.text") == 0)))
+               return 1;
+
                /* Check for pattern 3 */
                for (s = pat3refsym; *s; s++)
                        if (strcmp(refsymname, *s) == 0)
index 9b16e14f3a80e8faa6ad2bc5efe53d100e3d29a0..d7ecf89fbc743435dc8e82cb424c1b9803984700 100644 (file)
@@ -50,7 +50,7 @@ static int default_open(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations default_file_ops = {
+static const struct file_operations default_file_ops = {
        .read =         default_read_file,
        .write =        default_write_file,
        .open =         default_open,
@@ -215,7 +215,7 @@ static int create_by_name(const char *name, mode_t mode,
  */
 struct dentry *securityfs_create_file(const char *name, mode_t mode,
                                   struct dentry *parent, void *data,
-                                  struct file_operations *fops)
+                                  const struct file_operations *fops)
 {
        struct dentry *dentry = NULL;
        int error;
index bcdb285337339d108160e8fb305220088dec9eb5..e10ec995f2751101d39a7dfbd145cd8ce52cc6ee 100644 (file)
@@ -9,7 +9,6 @@
  * 2 of the License, or (at your option) any later version.
  */
 
-#include <linux/sched.h>
 #include <linux/syscalls.h>
 #include <linux/keyctl.h>
 #include <linux/compat.h>
index 686a9ee0c5dee8b43fbcf72e407dc386e52e7086..3e0d0a6e224f5e36204c05526175d9382f6af6c6 100644 (file)
@@ -33,7 +33,7 @@ static struct seq_operations proc_keys_ops = {
        .show   = proc_keys_show,
 };
 
-static struct file_operations proc_keys_fops = {
+static const struct file_operations proc_keys_fops = {
        .open           = proc_keys_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
@@ -54,7 +54,7 @@ static struct seq_operations proc_key_users_ops = {
        .show   = proc_key_users_show,
 };
 
-static struct file_operations proc_key_users_fops = {
+static const struct file_operations proc_key_users_fops = {
        .open           = proc_key_users_open,
        .read           = seq_read,
        .llseek         = seq_lseek,
index 5bbfdebb7acfb79436d615851ec91d57c2d74c49..7c687d568221cd71a3e863b9c9c50f5cd9352005 100644 (file)
@@ -11,7 +11,6 @@
 
 #include <linux/module.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/seq_file.h>
 #include <linux/err.h>
index ee4e0701b6e0bbfb431c5d1fa5672ab036492fa0..fc8601b2b7acabde473cc86a0fdc4b342a00e97a 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
-#include <linux/sched.h>
 #include <linux/security.h>
 
 #define SECURITY_FRAMEWORK_VERSION     "1.0.0"
index e7c0b5e2066bbb532995ba0758516c236b60c1d1..da8caf10ef9745b5f222117e9e236960c2f4e643 100644 (file)
@@ -332,11 +332,10 @@ static struct avc_node *avc_alloc_node(void)
 {
        struct avc_node *node;
 
-       node = kmem_cache_alloc(avc_node_cachep, GFP_ATOMIC);
+       node = kmem_cache_zalloc(avc_node_cachep, GFP_ATOMIC);
        if (!node)
                goto out;
 
-       memset(node, 0, sizeof(*node));
        INIT_RCU_HEAD(&node->rhead);
        INIT_LIST_HEAD(&node->list);
        atomic_set(&node->ae.used, 1);
index 65fb5e8ea9419ba1dc984c728d2614721f7bbf9b..b1ac22d231954bc5e900c07da670962c953ba1c2 100644 (file)
@@ -181,11 +181,10 @@ static int inode_alloc_security(struct inode *inode)
        struct task_security_struct *tsec = current->security;
        struct inode_security_struct *isec;
 
-       isec = kmem_cache_alloc(sel_inode_cache, GFP_KERNEL);
+       isec = kmem_cache_zalloc(sel_inode_cache, GFP_KERNEL);
        if (!isec)
                return -ENOMEM;
 
-       memset(isec, 0, sizeof(*isec));
        mutex_init(&isec->lock);
        INIT_LIST_HEAD(&isec->list);
        isec->inode = inode;
@@ -1078,6 +1077,9 @@ static int inode_has_perm(struct task_struct *tsk,
        struct inode_security_struct *isec;
        struct avc_audit_data ad;
 
+       if (unlikely (IS_PRIVATE (inode)))
+               return 0;
+
        tsec = tsk->security;
        isec = inode->i_security;
 
@@ -1424,6 +1426,47 @@ static int selinux_capable(struct task_struct *tsk, int cap)
        return task_has_capability(tsk,cap);
 }
 
+static int selinux_sysctl_get_sid(ctl_table *table, u16 tclass, u32 *sid)
+{
+       int buflen, rc;
+       char *buffer, *path, *end;
+
+       rc = -ENOMEM;
+       buffer = (char*)__get_free_page(GFP_KERNEL);
+       if (!buffer)
+               goto out;
+
+       buflen = PAGE_SIZE;
+       end = buffer+buflen;
+       *--end = '\0';
+       buflen--;
+       path = end-1;
+       *path = '/';
+       while (table) {
+               const char *name = table->procname;
+               size_t namelen = strlen(name);
+               buflen -= namelen + 1;
+               if (buflen < 0)
+                       goto out_free;
+               end -= namelen;
+               memcpy(end, name, namelen);
+               *--end = '/';
+               path = end;
+               table = table->parent;
+       }
+       buflen -= 4;
+       if (buflen < 0)
+               goto out_free;
+       end -= 4;
+       memcpy(end, "/sys", 4);
+       path = end;
+       rc = security_genfs_sid("proc", path, tclass, sid);
+out_free:
+       free_page((unsigned long)buffer);
+out:
+       return rc;
+}
+
 static int selinux_sysctl(ctl_table *table, int op)
 {
        int error = 0;
@@ -1438,8 +1481,8 @@ static int selinux_sysctl(ctl_table *table, int op)
 
        tsec = current->security;
 
-       rc = selinux_proc_get_sid(table->de, (op == 001) ?
-                                 SECCLASS_DIR : SECCLASS_FILE, &tsid);
+       rc = selinux_sysctl_get_sid(table, (op == 0001) ?
+                                   SECCLASS_DIR : SECCLASS_FILE, &tsid);
        if (rc) {
                /* Default to the well-defined sysctl SID. */
                tsid = SECINITSID_SYSCTL;
@@ -2655,7 +2698,7 @@ static int selinux_file_send_sigiotask(struct task_struct *tsk,
        struct file_security_struct *fsec;
 
        /* struct fown_struct is never outside the context of a struct file */
-        file = (struct file *)((long)fown - offsetof(struct file,f_owner));
+        file = container_of(fown, struct file, f_owner);
 
        tsec = tsk->security;
        fsec = file->f_security;
index c8bf6e172f6e02ed8246f26d642d8841181b8151..93b3177c7585aca735deea6397cbddee86a192cd 100644 (file)
@@ -161,7 +161,7 @@ out:
 #define sel_write_enforce NULL
 #endif
 
-static struct file_operations sel_enforce_ops = {
+static const struct file_operations sel_enforce_ops = {
        .read           = sel_read_enforce,
        .write          = sel_write_enforce,
 };
@@ -211,7 +211,7 @@ out:
 #define sel_write_disable NULL
 #endif
 
-static struct file_operations sel_disable_ops = {
+static const struct file_operations sel_disable_ops = {
        .write          = sel_write_disable,
 };
 
@@ -225,7 +225,7 @@ static ssize_t sel_read_policyvers(struct file *filp, char __user *buf,
        return simple_read_from_buffer(buf, count, ppos, tmpbuf, length);
 }
 
-static struct file_operations sel_policyvers_ops = {
+static const struct file_operations sel_policyvers_ops = {
        .read           = sel_read_policyvers,
 };
 
@@ -242,7 +242,7 @@ static ssize_t sel_read_mls(struct file *filp, char __user *buf,
        return simple_read_from_buffer(buf, count, ppos, tmpbuf, length);
 }
 
-static struct file_operations sel_mls_ops = {
+static const struct file_operations sel_mls_ops = {
        .read           = sel_read_mls,
 };
 
@@ -294,7 +294,7 @@ out:
        return length;
 }
 
-static struct file_operations sel_load_ops = {
+static const struct file_operations sel_load_ops = {
        .write          = sel_write_load,
 };
 
@@ -374,7 +374,7 @@ out:
        free_page((unsigned long) page);
        return length;
 }
-static struct file_operations sel_checkreqprot_ops = {
+static const struct file_operations sel_checkreqprot_ops = {
        .read           = sel_read_checkreqprot,
        .write          = sel_write_checkreqprot,
 };
@@ -423,7 +423,7 @@ out:
        free_page((unsigned long) page);
        return length;
 }
-static struct file_operations sel_compat_net_ops = {
+static const struct file_operations sel_compat_net_ops = {
        .read           = sel_read_compat_net,
        .write          = sel_write_compat_net,
 };
@@ -467,7 +467,7 @@ static ssize_t selinux_transaction_write(struct file *file, const char __user *b
        return rv;
 }
 
-static struct file_operations transaction_ops = {
+static const struct file_operations transaction_ops = {
        .write          = selinux_transaction_write,
        .read           = simple_transaction_read,
        .release        = simple_transaction_release,
@@ -875,7 +875,7 @@ out:
        return length;
 }
 
-static struct file_operations sel_bool_ops = {
+static const struct file_operations sel_bool_ops = {
        .read           = sel_read_bool,
        .write          = sel_write_bool,
 };
@@ -932,7 +932,7 @@ out:
        return length;
 }
 
-static struct file_operations sel_commit_bools_ops = {
+static const struct file_operations sel_commit_bools_ops = {
        .write          = sel_commit_bools_write,
 };
 
@@ -1131,12 +1131,12 @@ out:
        return ret;
 }
 
-static struct file_operations sel_avc_cache_threshold_ops = {
+static const struct file_operations sel_avc_cache_threshold_ops = {
        .read           = sel_read_avc_cache_threshold,
        .write          = sel_write_avc_cache_threshold,
 };
 
-static struct file_operations sel_avc_hash_stats_ops = {
+static const struct file_operations sel_avc_hash_stats_ops = {
        .read           = sel_read_avc_hash_stats,
 };
 
@@ -1198,7 +1198,7 @@ static int sel_open_avc_cache_stats(struct inode *inode, struct file *file)
        return seq_open(file, &sel_avc_cache_stats_seq_ops);
 }
 
-static struct file_operations sel_avc_cache_stats_ops = {
+static const struct file_operations sel_avc_cache_stats_ops = {
        .open           = sel_open_avc_cache_stats,
        .read           = seq_read,
        .llseek         = seq_lseek,
index ebb993c5c244d3e5fb72468eee758fe40550e23a..9142073319c0085fcd07f87291510f3033f20bf2 100644 (file)
@@ -36,10 +36,9 @@ avtab_insert_node(struct avtab *h, int hvalue,
                  struct avtab_key *key, struct avtab_datum *datum)
 {
        struct avtab_node * newnode;
-       newnode = kmem_cache_alloc(avtab_node_cachep, GFP_KERNEL);
+       newnode = kmem_cache_zalloc(avtab_node_cachep, GFP_KERNEL);
        if (newnode == NULL)
                return NULL;
-       memset(newnode, 0, sizeof(struct avtab_node));
        newnode->key = *key;
        newnode->datum = *datum;
        if (prev) {
index 871c33bd0741315638ef15dce4ef1e888850246b..d78f9ff30da906bb30edefcc9f63aaccf2fce5aa 100644 (file)
@@ -7,7 +7,6 @@
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/errno.h>
-#include <linux/sched.h>
 #include "flask.h"
 #include "security.h"
 #include "sidtab.h"
index dede954b2c657e0c1db1f135c38da9f630e5442b..28db4be7a16f28b79d582689c8fb1388927310b3 100644 (file)
@@ -305,7 +305,7 @@ static int pxa2xx_ac97_resume(struct platform_device *dev)
 #define pxa2xx_ac97_resume     NULL
 #endif
 
-static int pxa2xx_ac97_probe(struct platform_device *dev)
+static int __devinit pxa2xx_ac97_probe(struct platform_device *dev)
 {
        struct snd_card *card;
        struct snd_ac97_bus *ac97_bus;
@@ -369,7 +369,7 @@ static int pxa2xx_ac97_probe(struct platform_device *dev)
        return ret;
 }
 
-static int pxa2xx_ac97_remove(struct platform_device *dev)
+static int __devexit pxa2xx_ac97_remove(struct platform_device *dev)
 {
        struct snd_card *card = platform_get_drvdata(dev);
 
@@ -386,7 +386,7 @@ static int pxa2xx_ac97_remove(struct platform_device *dev)
 
 static struct platform_driver pxa2xx_ac97_driver = {
        .probe          = pxa2xx_ac97_probe,
-       .remove         = pxa2xx_ac97_remove,
+       .remove         = __devexit_p(pxa2xx_ac97_remove),
        .suspend        = pxa2xx_ac97_suspend,
        .resume         = pxa2xx_ac97_resume,
        .driver         = {
index 42bcf2794b285dd14bc89d8b9cb8cc11686d2037..86de7258b76d04a0695251e94ecfcbc2e63c10a4 100644 (file)
@@ -1398,7 +1398,7 @@ static int snd_ctl_fasync(int fd, struct file * file, int on)
  *  INIT PART
  */
 
-static struct file_operations snd_ctl_f_ops =
+static const struct file_operations snd_ctl_f_ops =
 {
        .owner =        THIS_MODULE,
        .read =         snd_ctl_read,
index 39c03f3dfbfa07d2a0dfed12ac5bf12480cfb8ac..96ffdf18c3fef89e7aa6e39d303a6a678df932ba 100644 (file)
@@ -317,7 +317,7 @@ static int snd_hwdep_control_ioctl(struct snd_card *card,
 
  */
 
-static struct file_operations snd_hwdep_f_ops =
+static const struct file_operations snd_hwdep_f_ops =
 {
        .owner =        THIS_MODULE,
        .llseek =       snd_hwdep_llseek,
index 54591e2eb6eea23d8febdf0d42d94421d5db3a3f..bf6dbf99528be5a0895de0d3616f02e15d1c350a 100644 (file)
@@ -507,7 +507,7 @@ static int snd_info_entry_mmap(struct file *file, struct vm_area_struct *vma)
        return -ENXIO;
 }
 
-static struct file_operations snd_info_entry_operations =
+static const struct file_operations snd_info_entry_operations =
 {
        .owner =                THIS_MODULE,
        .llseek =               snd_info_entry_llseek,
index db61037337427b9adc881868fa104c9ec015bc06..4a431e3ea3a2c7f8bb69bbd2d347cd419883d283 100644 (file)
@@ -36,7 +36,7 @@
 static DEFINE_SPINLOCK(shutdown_lock);
 static LIST_HEAD(shutdown_files);
 
-static struct file_operations snd_shutdown_f_ops;
+static const struct file_operations snd_shutdown_f_ops;
 
 static unsigned int snd_cards_lock;    /* locked for registering/using */
 struct snd_card *snd_cards[SNDRV_CARDS];
@@ -244,7 +244,7 @@ static int snd_disconnect_fasync(int fd, struct file *file, int on)
        return -ENODEV;
 }
 
-static struct file_operations snd_shutdown_f_ops =
+static const struct file_operations snd_shutdown_f_ops =
 {
        .owner =        THIS_MODULE,
        .llseek =       snd_disconnect_llseek,
index 6db86a7c9704047fbc352a4efb5e2f1ee3352489..f78cd000e88d6ec0a8d54df79ce393c5e68fb66e 100644 (file)
@@ -21,7 +21,6 @@
 
 #include <sound/driver.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/time.h>
 #include <linux/ioport.h>
 #include <sound/core.h>
index 3391f2a9b4d167150114deec246ce3cc7082978e..74a2923eb40155708d5f97543e3fc3e3f0e65926 100644 (file)
@@ -390,7 +390,7 @@ int snd_mixer_oss_ioctl_card(struct snd_card *card, unsigned int cmd, unsigned l
  *  REGISTRATION PART
  */
 
-static struct file_operations snd_mixer_oss_f_ops =
+static const struct file_operations snd_mixer_oss_f_ops =
 {
        .owner =        THIS_MODULE,
        .open =         snd_mixer_oss_open,
index 786a82e68890c86247052513f6c72b2d9e3523d3..c4744bb07f4119c2ee930953fd9049b7daa9e210 100644 (file)
@@ -2889,7 +2889,7 @@ static void snd_pcm_oss_proc_done(struct snd_pcm *pcm)
  *  ENTRY functions
  */
 
-static struct file_operations snd_pcm_oss_f_reg =
+static const struct file_operations snd_pcm_oss_f_reg =
 {
        .owner =        THIS_MODULE,
        .read =         snd_pcm_oss_read,
index b52e89393fa399062c93b46b81f3fa84be36d591..3e276fcf3336eec5f0234de0750f83d54404b0a4 100644 (file)
@@ -3424,7 +3424,7 @@ out:
  *  Register section
  */
 
-struct file_operations snd_pcm_f_ops[2] = {
+const struct file_operations snd_pcm_f_ops[2] = {
        {
                .owner =                THIS_MODULE,
                .write =                snd_pcm_write,
index 7e6ceec738d53cafc868865d5470a70d13f91b43..d14dcbb6dbca70a6789b0b56144cd1d99f85f361 100644 (file)
@@ -1359,7 +1359,7 @@ static void snd_rawmidi_proc_info_read(struct snd_info_entry *entry,
  *  Register functions
  */
 
-static struct file_operations snd_rawmidi_f_ops =
+static const struct file_operations snd_rawmidi_f_ops =
 {
        .owner =        THIS_MODULE,
        .read =         snd_rawmidi_read,
index b09babf272cd0e88ae62650af6ab48ba013b77d9..f80fab8f2ed199abf1b7037058862db13bd3acec 100644 (file)
@@ -20,7 +20,6 @@
  
 #include <sound/driver.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <sound/core.h>
 #include <sound/ainstr_fm.h>
 #include <sound/initval.h>
index 3c31038a74bae4dce539aecf5718b7284b2d5584..c640e1cf854d2ae9af99b4afe02f1c5f87c717e6 100644 (file)
@@ -20,7 +20,6 @@
  
 #include <sound/driver.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <sound/core.h>
 #include <sound/ainstr_gf1.h>
index 7f8df19ba5638f70dc65b7e980f49a738e1a96e7..5367baee2d08b87dfd2c1a48b3336e2899659713 100644 (file)
@@ -20,7 +20,6 @@
  
 #include <sound/driver.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <sound/core.h>
 #include <sound/ainstr_iw.h>
index 6d6ffece7cbe88b5f5b135f182c04f4cd3c9f2dc..ac717bef9d7788b8473fe2a47af8ba17cf038402 100644 (file)
@@ -20,7 +20,6 @@
  
 #include <sound/driver.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <sound/core.h>
 #include <sound/ainstr_simple.h>
index 92858cf8b6eb09e4b71b951698375e20a6a9efb2..2eb987308b539af5f321c9ea0c7264ca24a56a33 100644 (file)
@@ -208,7 +208,7 @@ odev_poll(struct file *file, poll_table * wait)
  * registration of sequencer minor device
  */
 
-static struct file_operations seq_oss_f_ops =
+static const struct file_operations seq_oss_f_ops =
 {
        .owner =        THIS_MODULE,
        .read =         odev_read,
index bb9dd9fa8e51a0b122f2e3ef1010937c4d986112..694efe832b6787f9aa683635c42a00346d626aab 100644 (file)
@@ -2538,7 +2538,7 @@ void snd_seq_info_clients_read(struct snd_info_entry *entry,
  *  REGISTRATION PART
  */
 
-static struct file_operations snd_seq_f_ops =
+static const struct file_operations snd_seq_f_ops =
 {
        .owner =        THIS_MODULE,
        .read =         snd_seq_read,
index 972f93405364ec59efc62a35f97fda81d250d74d..061a7c61402a7fefc4f16f00fe0c99a710486962 100644 (file)
@@ -38,7 +38,6 @@
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <linux/wait.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <sound/core.h>
 #include <sound/rawmidi.h>
index 4084de06412707e28011788d56c02aa60514fe10..70600df94d62e3ef6d3d38566e9699a92bcfa7f4 100644 (file)
@@ -168,7 +168,7 @@ static int snd_open(struct inode *inode, struct file *file)
        return err;
 }
 
-static struct file_operations snd_fops =
+static const struct file_operations snd_fops =
 {
        .owner =        THIS_MODULE,
        .open =         snd_open
index 3e06383510692ba3ef5416eb367b0a7c9f5c2b4c..160e40ede72316a68bc13e47ee4d9bd25bf2be94 100644 (file)
@@ -1901,7 +1901,7 @@ static unsigned int snd_timer_user_poll(struct file *file, poll_table * wait)
 #define snd_timer_user_ioctl_compat    NULL
 #endif
 
-static struct file_operations snd_timer_f_ops =
+static const struct file_operations snd_timer_f_ops =
 {
        .owner =        THIS_MODULE,
        .read =         snd_timer_user_read,
index 8339bad969bab9fc4decf1a14a0b37d337952296..a0f28f51fc7eb89c0b7ea30da694a224390df8b8 100644 (file)
@@ -423,7 +423,8 @@ static struct snd_pcm_ops snd_card_dummy_capture_ops = {
        .pointer =              snd_card_dummy_pcm_pointer,
 };
 
-static int __init snd_card_dummy_pcm(struct snd_dummy *dummy, int device, int substreams)
+static int __devinit snd_card_dummy_pcm(struct snd_dummy *dummy, int device,
+                                       int substreams)
 {
        struct snd_pcm *pcm;
        int err;
@@ -562,7 +563,7 @@ DUMMY_VOLUME("CD Volume", 0, MIXER_ADDR_CD),
 DUMMY_CAPSRC("CD Capture Switch", 0, MIXER_ADDR_CD)
 };
 
-static int __init snd_card_dummy_new_mixer(struct snd_dummy *dummy)
+static int __devinit snd_card_dummy_new_mixer(struct snd_dummy *dummy)
 {
        struct snd_card *card = dummy->card;
        unsigned int idx;
@@ -579,7 +580,7 @@ static int __init snd_card_dummy_new_mixer(struct snd_dummy *dummy)
        return 0;
 }
 
-static int __init snd_dummy_probe(struct platform_device *devptr)
+static int __devinit snd_dummy_probe(struct platform_device *devptr)
 {
        struct snd_card *card;
        struct snd_dummy *dummy;
@@ -617,7 +618,7 @@ static int __init snd_dummy_probe(struct platform_device *devptr)
        return err;
 }
 
-static int snd_dummy_remove(struct platform_device *devptr)
+static int __devexit snd_dummy_remove(struct platform_device *devptr)
 {
        snd_card_free(platform_get_drvdata(devptr));
        platform_set_drvdata(devptr, NULL);
@@ -648,7 +649,7 @@ static int snd_dummy_resume(struct platform_device *pdev)
 
 static struct platform_driver snd_dummy_driver = {
        .probe          = snd_dummy_probe,
-       .remove         = snd_dummy_remove,
+       .remove         = __devexit_p(snd_dummy_remove),
 #ifdef CONFIG_PM
        .suspend        = snd_dummy_suspend,
        .resume         = snd_dummy_resume,
index a9ff391258e707c3ac7bf696e457e61de0fe0d92..40eb026c86ed4d817349ae614573493646578662 100644 (file)
@@ -583,7 +583,7 @@ static irqreturn_t snd_mtpav_irqh(int irq, void *dev_id)
 /*
  * get ISA resources
  */
-static int __init snd_mtpav_get_ISA(struct mtpav * mcard)
+static int __devinit snd_mtpav_get_ISA(struct mtpav * mcard)
 {
        if ((mcard->res_port = request_region(port, 3, "MotuMTPAV MIDI")) == NULL) {
                snd_printk("MTVAP port 0x%lx is busy\n", port);
@@ -619,7 +619,7 @@ static struct snd_rawmidi_ops snd_mtpav_input = {
  * get RAWMIDI resources
  */
 
-static void __init snd_mtpav_set_name(struct mtpav *chip,
+static void __devinit snd_mtpav_set_name(struct mtpav *chip,
                                      struct snd_rawmidi_substream *substream)
 {
        if (substream->number >= 0 && substream->number < chip->num_ports)
@@ -634,7 +634,7 @@ static void __init snd_mtpav_set_name(struct mtpav *chip,
                strcpy(substream->name, "MTP broadcast");
 }
 
-static int __init snd_mtpav_get_RAWMIDI(struct mtpav *mcard)
+static int __devinit snd_mtpav_get_RAWMIDI(struct mtpav *mcard)
 {
        int rval;
        struct snd_rawmidi *rawmidi;
@@ -691,7 +691,7 @@ static void snd_mtpav_free(struct snd_card *card)
 
 /*
  */
-static int __init snd_mtpav_probe(struct platform_device *dev)
+static int __devinit snd_mtpav_probe(struct platform_device *dev)
 {
        struct snd_card *card;
        int err;
@@ -745,7 +745,7 @@ static int __init snd_mtpav_probe(struct platform_device *dev)
        return err;
 }
 
-static int snd_mtpav_remove(struct platform_device *devptr)
+static int __devexit snd_mtpav_remove(struct platform_device *devptr)
 {
        snd_card_free(platform_get_drvdata(devptr));
        platform_set_drvdata(devptr, NULL);
@@ -756,7 +756,7 @@ static int snd_mtpav_remove(struct platform_device *devptr)
 
 static struct platform_driver snd_mtpav_driver = {
        .probe          = snd_mtpav_probe,
-       .remove         = snd_mtpav_remove,
+       .remove         = __devexit_p(snd_mtpav_remove),
        .driver         = {
                .name   = SND_MTPAV_DRIVER
        },
index 5327c6f841f40aad39888b5005137c78d2dcbe9e..6c9f4c9bfeb6c3616063daf1b8fe127a65360f17 100644 (file)
@@ -1026,7 +1026,7 @@ __err:
        return err;
 }
 
-static int snd_mts64_remove(struct platform_device *pdev)
+static int __devexit snd_mts64_remove(struct platform_device *pdev)
 {
        struct snd_card *card = platform_get_drvdata(pdev);
 
@@ -1039,7 +1039,7 @@ static int snd_mts64_remove(struct platform_device *pdev)
 
 static struct platform_driver snd_mts64_driver = {
        .probe  = snd_mts64_probe,
-       .remove = snd_mts64_remove,
+       .remove = __devexit_p(snd_mts64_remove),
        .driver = {
                .name = PLATFORM_DRIVER
        }
@@ -1048,7 +1048,7 @@ static struct platform_driver snd_mts64_driver = {
 /*********************************************************************
  * module init stuff
  *********************************************************************/
-static void snd_mts64_unregister_all(void)
+static void __init_or_module snd_mts64_unregister_all(void)
 {
        int i;
 
index 6c48772aaefd851d837618e449a85dee16ab9857..b2d0ba4bd184073ad5b07fa2a2f25a7c81d1cc1a 100644 (file)
@@ -811,7 +811,7 @@ __err:
        return err;
 }
 
-static int snd_portman_remove(struct platform_device *pdev)
+static int __devexit snd_portman_remove(struct platform_device *pdev)
 {
        struct snd_card *card = platform_get_drvdata(pdev);
 
@@ -824,7 +824,7 @@ static int snd_portman_remove(struct platform_device *pdev)
 
 static struct platform_driver snd_portman_driver = {
        .probe  = snd_portman_probe,
-       .remove = snd_portman_remove,
+       .remove = __devexit_p(snd_portman_remove),
        .driver = {
                .name = PLATFORM_DRIVER
        }
@@ -833,7 +833,7 @@ static struct platform_driver snd_portman_driver = {
 /*********************************************************************
  * module init stuff
  *********************************************************************/
-static void snd_portman_unregister_all(void)
+static void __init_or_module snd_portman_unregister_all(void)
 {
        int i;
 
index 3a86a58207269c3169c6e6457a0700d2138b0728..838a4277929d8060bc0fdda7389e0273cfc4bea7 100644 (file)
@@ -327,7 +327,7 @@ static void snd_uart16550_buffer_timer(unsigned long data)
  *  return 0 if found
  *  return negative error if not found
  */
-static int __init snd_uart16550_detect(struct snd_uart16550 *uart)
+static int __devinit snd_uart16550_detect(struct snd_uart16550 *uart)
 {
        unsigned long io_base = uart->base;
        int ok;
@@ -781,7 +781,7 @@ static int snd_uart16550_dev_free(struct snd_device *device)
        return snd_uart16550_free(uart);
 }
 
-static int __init snd_uart16550_create(struct snd_card *card,
+static int __devinit snd_uart16550_create(struct snd_card *card,
                                       unsigned long iobase,
                                       int irq,
                                       unsigned int speed,
@@ -860,7 +860,7 @@ static int __init snd_uart16550_create(struct snd_card *card,
        return 0;
 }
 
-static void __init snd_uart16550_substreams(struct snd_rawmidi_str *stream)
+static void __devinit snd_uart16550_substreams(struct snd_rawmidi_str *stream)
 {
        struct snd_rawmidi_substream *substream;
 
@@ -869,7 +869,7 @@ static void __init snd_uart16550_substreams(struct snd_rawmidi_str *stream)
        }
 }
 
-static int __init snd_uart16550_rmidi(struct snd_uart16550 *uart, int device,
+static int __devinit snd_uart16550_rmidi(struct snd_uart16550 *uart, int device,
                                      int outs, int ins,
                                      struct snd_rawmidi **rmidi)
 {
@@ -896,7 +896,7 @@ static int __init snd_uart16550_rmidi(struct snd_uart16550 *uart, int device,
        return 0;
 }
 
-static int __init snd_serial_probe(struct platform_device *devptr)
+static int __devinit snd_serial_probe(struct platform_device *devptr)
 {
        struct snd_card *card;
        struct snd_uart16550 *uart;
@@ -981,7 +981,7 @@ static int __init snd_serial_probe(struct platform_device *devptr)
        return err;
 }
 
-static int snd_serial_remove(struct platform_device *devptr)
+static int __devexit snd_serial_remove(struct platform_device *devptr)
 {
        snd_card_free(platform_get_drvdata(devptr));
        platform_set_drvdata(devptr, NULL);
@@ -992,7 +992,7 @@ static int snd_serial_remove(struct platform_device *devptr)
 
 static struct platform_driver snd_serial_driver = {
        .probe          = snd_serial_probe,
-       .remove         = snd_serial_remove,
+       .remove         = __devexit_p( snd_serial_remove),
        .driver         = {
                .name   = SND_SERIAL_DRIVER
        },
index 59171f8200dfb8fd1dd957e5bb37dd273d292b79..46f3d34860679c677abe9ee83a32316f5005e243 100644 (file)
@@ -44,7 +44,6 @@
 #include <sound/driver.h>
 #include <linux/init.h>
 #include <linux/wait.h>
-#include <linux/sched.h>
 #include <linux/err.h>
 #include <linux/platform_device.h>
 #include <linux/moduleparam.h>
@@ -85,7 +84,7 @@ struct snd_card_virmidi {
 static struct platform_device *devices[SNDRV_CARDS];
 
 
-static int __init snd_virmidi_probe(struct platform_device *devptr)
+static int __devinit snd_virmidi_probe(struct platform_device *devptr)
 {
        struct snd_card *card;
        struct snd_card_virmidi *vmidi;
@@ -129,7 +128,7 @@ static int __init snd_virmidi_probe(struct platform_device *devptr)
        return err;
 }
 
-static int snd_virmidi_remove(struct platform_device *devptr)
+static int __devexit snd_virmidi_remove(struct platform_device *devptr)
 {
        snd_card_free(platform_get_drvdata(devptr));
        platform_set_drvdata(devptr, NULL);
@@ -140,7 +139,7 @@ static int snd_virmidi_remove(struct platform_device *devptr)
 
 static struct platform_driver snd_virmidi_driver = {
        .probe          = snd_virmidi_probe,
-       .remove         = snd_virmidi_remove,
+       .remove         = __devexit_p(snd_virmidi_remove),
        .driver         = {
                .name   = SND_VIRMIDI_DRIVER
        },
index 99908e44124da32593b6fa85ea87eafeb4cc1c6b..74e501dea8b1f935141f38a0b77cea08d7a8f125 100644 (file)
@@ -65,7 +65,7 @@ MODULE_PARM_DESC(thinkpad, "Enable only for the onboard CS4248 of IBM Thinkpad 3
 static struct platform_device *devices[SNDRV_CARDS];
 
 
-static int __init snd_ad1848_probe(struct platform_device *pdev)
+static int __devinit snd_ad1848_probe(struct platform_device *pdev)
 {
        int dev = pdev->id;
        struct snd_card *card;
index d1f6dfcec46edfd73e55fce385be78e618b76189..c09a8009d2fa7230196a27fab89231dcfcc4fb7b 100644 (file)
@@ -574,7 +574,7 @@ static int __devinit snd_cmi8330_nonpnp_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int snd_cmi8330_nonpnp_remove(struct platform_device *devptr)
+static int __devexit snd_cmi8330_nonpnp_remove(struct platform_device *devptr)
 {
        snd_card_free(platform_get_drvdata(devptr));
        platform_set_drvdata(devptr, NULL);
@@ -597,7 +597,7 @@ static int snd_cmi8330_nonpnp_resume(struct platform_device *dev)
 
 static struct platform_driver snd_cmi8330_driver = {
        .probe          = snd_cmi8330_nonpnp_probe,
-       .remove         = snd_cmi8330_nonpnp_remove,
+       .remove         = __devexit_p(snd_cmi8330_nonpnp_remove),
 #ifdef CONFIG_PM
        .suspend        = snd_cmi8330_nonpnp_suspend,
        .resume         = snd_cmi8330_nonpnp_resume,
index c20a4b1b1536532f93d8a0274b0d24d28cc81751..ce57d526f7bc3e5b8fc6608c83d97ff248a99f71 100644 (file)
@@ -23,7 +23,6 @@
 
 #include <sound/driver.h>
 #include <linux/init.h>
-#include <linux/sched.h>
 #include <linux/wait.h>
 #include <linux/pnp.h>
 #include <linux/moduleparam.h>
index 7f29f56e405b29a26e0c62d43182e804f0555451..65f97ff4eef1e747d7ba5bb0a1d6f875415cad13 100644 (file)
@@ -73,7 +73,7 @@ static struct platform_device *devices[SNDRV_CARDS];
 
 #define PFX    "es1688: "
 
-static int __init snd_es1688_probe(struct platform_device *pdev)
+static int __devinit snd_es1688_probe(struct platform_device *pdev)
 {
        int dev = pdev->id;
        static int possible_irqs[] = {5, 9, 10, 7, -1};
@@ -171,7 +171,7 @@ static int __init snd_es1688_probe(struct platform_device *pdev)
        return err;
 }
 
-static int snd_es1688_remove(struct platform_device *devptr)
+static int __devexit snd_es1688_remove(struct platform_device *devptr)
 {
        snd_card_free(platform_get_drvdata(devptr));
        platform_set_drvdata(devptr, NULL);
@@ -182,7 +182,7 @@ static int snd_es1688_remove(struct platform_device *devptr)
 
 static struct platform_driver snd_es1688_driver = {
        .probe          = snd_es1688_probe,
-       .remove         = snd_es1688_remove,
+       .remove         = __devexit_p(snd_es1688_remove),
        /* FIXME: suspend/resume */
        .driver         = {
                .name   = ES1688_DRIVER
index 37057a37dc30a870b611473113cd6b39425fa845..0395e2e0dd038290f6bb16dff43944b0acd40cf3 100644 (file)
@@ -76,7 +76,7 @@ static struct platform_device *devices[SNDRV_CARDS];
 
 #define PFX    "gusclassic: "
 
-static int __init snd_gusclassic_detect(struct snd_gus_card * gus)
+static int __devinit snd_gusclassic_detect(struct snd_gus_card * gus)
 {
        unsigned char d;
 
@@ -95,7 +95,7 @@ static int __init snd_gusclassic_detect(struct snd_gus_card * gus)
        return 0;
 }
 
-static void __init snd_gusclassic_init(int dev, struct snd_gus_card * gus)
+static void __devinit snd_gusclassic_init(int dev, struct snd_gus_card * gus)
 {
        gus->equal_irq = 0;
        gus->codec_flag = 0;
@@ -103,7 +103,7 @@ static void __init snd_gusclassic_init(int dev, struct snd_gus_card * gus)
        gus->joystick_dac = joystick_dac[dev];
 }
 
-static int __init snd_gusclassic_probe(struct platform_device *pdev)
+static int __devinit snd_gusclassic_probe(struct platform_device *pdev)
 {
        int dev = pdev->id;
        static int possible_irqs[] = {5, 11, 12, 9, 7, 15, 3, 4, -1};
@@ -211,7 +211,7 @@ static int __init snd_gusclassic_probe(struct platform_device *pdev)
        return err;
 }
 
-static int snd_gusclassic_remove(struct platform_device *devptr)
+static int __devexit snd_gusclassic_remove(struct platform_device *devptr)
 {
        snd_card_free(platform_get_drvdata(devptr));
        platform_set_drvdata(devptr, NULL);
@@ -222,7 +222,7 @@ static int snd_gusclassic_remove(struct platform_device *devptr)
 
 static struct platform_driver snd_gusclassic_driver = {
        .probe          = snd_gusclassic_probe,
-       .remove         = snd_gusclassic_remove,
+       .remove         = __devexit_p(snd_gusclassic_remove),
        /* FIXME: suspend/resume */
        .driver         = {
                .name   = GUSCLASSIC_DRIVER
index 532c56e35ca496fd7a28c3252ce2823b840452e5..4f55fc3e66c14cc1dd167fe1b60c19693fab6170 100644 (file)
@@ -92,7 +92,7 @@ static struct platform_device *devices[SNDRV_CARDS];
 
 #define PFX    "gusextreme: "
 
-static int __init snd_gusextreme_detect(int dev,
+static int __devinit snd_gusextreme_detect(int dev,
                                        struct snd_card *card,
                                        struct snd_gus_card * gus,
                                        struct snd_es1688 *es1688)
@@ -142,12 +142,12 @@ static int __init snd_gusextreme_detect(int dev,
        return 0;
 }
 
-static void __init snd_gusextreme_init(int dev, struct snd_gus_card * gus)
+static void __devinit snd_gusextreme_init(int dev, struct snd_gus_card * gus)
 {
        gus->joystick_dac = joystick_dac[dev];
 }
 
-static int __init snd_gusextreme_mixer(struct snd_es1688 *chip)
+static int __devinit snd_gusextreme_mixer(struct snd_es1688 *chip)
 {
        struct snd_card *card = chip->card;
        struct snd_ctl_elem_id id1, id2;
@@ -169,7 +169,7 @@ static int __init snd_gusextreme_mixer(struct snd_es1688 *chip)
        return 0;
 }
 
-static int __init snd_gusextreme_probe(struct platform_device *pdev)
+static int __devinit snd_gusextreme_probe(struct platform_device *pdev)
 {
        int dev = pdev->id;
        static int possible_ess_irqs[] = {5, 9, 10, 7, -1};
@@ -321,7 +321,7 @@ static int __init snd_gusextreme_probe(struct platform_device *pdev)
        return err;
 }
 
-static int snd_gusextreme_remove(struct platform_device *devptr)
+static int __devexit snd_gusextreme_remove(struct platform_device *devptr)
 {
        snd_card_free(platform_get_drvdata(devptr));
        platform_set_drvdata(devptr, NULL);
@@ -332,7 +332,7 @@ static int snd_gusextreme_remove(struct platform_device *devptr)
 
 static struct platform_driver snd_gusextreme_driver = {
        .probe          = snd_gusextreme_probe,
-       .remove         = snd_gusextreme_remove,
+       .remove         = __devexit_p(snd_gusextreme_remove),
        /* FIXME: suspend/resume */
        .driver         = {
                .name   = GUSEXTREME_DRIVER
index c1c69e3cbfd040c3ee7636d0a7c0feec6a6fac8a..d1ad90ca035de59760b9b500aa139372e0b47586 100644 (file)
@@ -85,7 +85,7 @@ struct snd_gusmax {
 
 #define PFX    "gusmax: "
 
-static int __init snd_gusmax_detect(struct snd_gus_card * gus)
+static int __devinit snd_gusmax_detect(struct snd_gus_card * gus)
 {
        unsigned char d;
 
@@ -127,7 +127,8 @@ static irqreturn_t snd_gusmax_interrupt(int irq, void *dev_id)
        return IRQ_RETVAL(handled);
 }
 
-static void __init snd_gusmax_init(int dev, struct snd_card *card, struct snd_gus_card * gus)
+static void __devinit snd_gusmax_init(int dev, struct snd_card *card,
+                                     struct snd_gus_card * gus)
 {
        gus->equal_irq = 1;
        gus->codec_flag = 1;
@@ -145,7 +146,7 @@ static void __init snd_gusmax_init(int dev, struct snd_card *card, struct snd_gu
 #define CS4231_PRIVATE( left, right, shift, mute ) \
                        ((left << 24)|(right << 16)|(shift<<8)|mute)
 
-static int __init snd_gusmax_mixer(struct snd_cs4231 *chip)
+static int __devinit snd_gusmax_mixer(struct snd_cs4231 *chip)
 {
        struct snd_card *card = chip->card;
        struct snd_ctl_elem_id id1, id2;
@@ -204,7 +205,7 @@ static void snd_gusmax_free(struct snd_card *card)
                free_irq(maxcard->irq, (void *)maxcard);
 }
 
-static int __init snd_gusmax_probe(struct platform_device *pdev)
+static int __devinit snd_gusmax_probe(struct platform_device *pdev)
 {
        int dev = pdev->id;
        static int possible_irqs[] = {5, 11, 12, 9, 7, 15, 3, -1};
@@ -348,7 +349,7 @@ static int __init snd_gusmax_probe(struct platform_device *pdev)
        return err;
 }
 
-static int snd_gusmax_remove(struct platform_device *devptr)
+static int __devexit snd_gusmax_remove(struct platform_device *devptr)
 {
        snd_card_free(platform_get_drvdata(devptr));
        platform_set_drvdata(devptr, NULL);
@@ -359,7 +360,7 @@ static int snd_gusmax_remove(struct platform_device *devptr)
 
 static struct platform_driver snd_gusmax_driver = {
        .probe          = snd_gusmax_probe,
-       .remove         = snd_gusmax_remove,
+       .remove         = __devexit_p(snd_gusmax_remove),
        /* FIXME: suspend/resume */
        .driver         = {
                .name   = GUSMAX_DRIVER
index 1e30713d2cada591a3a3228adf600356715227e8..f3db686b1c0c5da850bfeda7bb790e59df9d8cf6 100644 (file)
@@ -919,7 +919,7 @@ static int __devinit snd_opl3sa2_nonpnp_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int snd_opl3sa2_nonpnp_remove(struct platform_device *devptr)
+static int __devexit snd_opl3sa2_nonpnp_remove(struct platform_device *devptr)
 {
        snd_card_free(platform_get_drvdata(devptr));
        platform_set_drvdata(devptr, NULL);
@@ -942,7 +942,7 @@ static int snd_opl3sa2_nonpnp_resume(struct platform_device *dev)
 
 static struct platform_driver snd_opl3sa2_nonpnp_driver = {
        .probe          = snd_opl3sa2_nonpnp_probe,
-       .remove         = snd_opl3sa2_nonpnp_remove,
+       .remove         = __devexit( snd_opl3sa2_nonpnp_remove),
 #ifdef CONFIG_PM
        .suspend        = snd_opl3sa2_nonpnp_suspend,
        .resume         = snd_opl3sa2_nonpnp_resume,
index 268ebd34703ec1fa821b5c31083b16e7bd6bb3a8..be1e83e6dea32b7132e252416c83fa2dae7872b1 100644 (file)
@@ -83,7 +83,7 @@ static void snd_sb8_free(struct snd_card *card)
        release_and_free_resource(acard->fm_res);
 }
 
-static int __init snd_sb8_probe(struct platform_device *pdev)
+static int __devinit snd_sb8_probe(struct platform_device *pdev)
 {
        int dev = pdev->id;
        struct snd_sb *chip;
@@ -193,7 +193,7 @@ static int __init snd_sb8_probe(struct platform_device *pdev)
        return err;
 }
 
-static int snd_sb8_remove(struct platform_device *pdev)
+static int __devexit snd_sb8_remove(struct platform_device *pdev)
 {
        snd_card_free(platform_get_drvdata(pdev));
        platform_set_drvdata(pdev, NULL);
@@ -230,7 +230,7 @@ static int snd_sb8_resume(struct platform_device *dev)
 
 static struct platform_driver snd_sb8_driver = {
        .probe          = snd_sb8_probe,
-       .remove         = snd_sb8_remove,
+       .remove         = __devexit_p(snd_sb8_remove),
 #ifdef CONFIG_PM
        .suspend        = snd_sb8_suspend,
        .resume         = snd_sb8_resume,
index a0588c21324ac6ae98fbfccbf286139c1a97d582..4c419300305d34de140cd9c5c87399906883a3a4 100644 (file)
@@ -5,6 +5,20 @@
 #
 # Prompt user for primary drivers.
 
+config OBSOLETE_OSS
+       bool "Obsolete OSS drivers"
+       depends on SOUND_PRIME
+       help
+         This option enables support for obsolete OSS drivers that
+         are scheduled for removal in the near future since there
+         are ALSA drivers for the same hardware.
+
+         Please contact Adrian Bunk <bunk@stusta.de> if you had to
+         say Y here because your soundcard is not properly supported
+         by ALSA.
+
+         If unsure, say N.
+
 config SOUND_BT878
        tristate "BT878 audio dma"
        depends on SOUND_PRIME && PCI
@@ -33,7 +47,7 @@ config SOUND_BCM_CS4297A
 
 config SOUND_ES1371
        tristate "Creative Ensoniq AudioPCI 97 (ES1371)"
-       depends on SOUND_PRIME && PCI
+       depends on SOUND_PRIME && PCI && OBSOLETE_OSS
        help
          Say Y or M if you have a PCI sound card utilizing the Ensoniq
          ES1371 chipset, such as Ensoniq's AudioPCI97. To find out if
@@ -705,18 +719,6 @@ config AEDSP16_SBPRO
 
 endchoice
 
-config AEDSP16_MPU401
-       bool "Audio Excel DSP 16 (MPU401 emulation)"
-       depends on SOUND_AEDSP16 && SOUND_MPU401
-       help
-         Answer Y if you want your audio card to emulate the MPU-401 midi
-         interface. You should then also say Y to "MPU-401 support".
-
-         Note that the I/O base for MPU-401 support of aedsp16 is the same
-         you have selected for "MPU-401 support". If you are using this
-         driver as a module you have to specify the MPU I/O base address with
-         the parameter 'mpu_base=0xNNN'.
-
 config SOUND_VIDC
        tristate "VIDC 16-bit sound"
        depends on ARM && (ARCH_ACORN || ARCH_CLPS7500) && SOUND_OSS
index 602db497929abd70d048d1d5215b0d869651ab5f..fef56cac06c832650db596299af04185dc9919dc 100644 (file)
@@ -744,11 +744,10 @@ static int ac97_check_modem(struct ac97_codec *codec)
  
 struct ac97_codec *ac97_alloc_codec(void)
 {
-       struct ac97_codec *codec = kmalloc(sizeof(struct ac97_codec), GFP_KERNEL);
+       struct ac97_codec *codec = kzalloc(sizeof(struct ac97_codec), GFP_KERNEL);
        if(!codec)
                return NULL;
 
-       memset(codec, 0, sizeof(*codec));
        spin_lock_init(&codec->lock);
        INIT_LIST_HEAD(&codec->list);
        return codec;
index 09263d72a519983a10e96347d9ee4f8cd3f1ed9d..c0730a3563a2962ab86a4c24ec39c063c4df0de4 100644 (file)
@@ -230,9 +230,8 @@ static ad1889_dev_t *ad1889_alloc_dev(struct pci_dev *pci)
        struct dmabuf *dmabuf;
        int i;
 
-       if ((dev = kmalloc(sizeof(ad1889_dev_t), GFP_KERNEL)) == NULL) 
+       if ((dev = kzalloc(sizeof(ad1889_dev_t), GFP_KERNEL)) == NULL)
                return NULL;
-       memset(dev, 0, sizeof(ad1889_dev_t));
        spin_lock_init(&dev->lock);
        dev->pci = pci;
 
@@ -778,7 +777,7 @@ static int ad1889_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations ad1889_fops = {
+static const struct file_operations ad1889_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .read           = ad1889_read,
@@ -812,7 +811,7 @@ static int ad1889_mixer_ioctl(struct inode *inode, struct file *file,
        return codec->mixer_ioctl(codec, cmd, arg);
 }
 
-static struct file_operations ad1889_mixer_fops = {
+static const struct file_operations ad1889_mixer_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .ioctl          = ad1889_mixer_ioctl,
index 219795171c714796df5aaa51f740abd75fad7116..a339f0c0d5129323068a89831adb19fcbefa38cc 100644 (file)
@@ -1354,11 +1354,11 @@ au1550_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
                ((file->f_mode & FMODE_READ) && s->dma_adc.mapped);
 
 #ifdef DEBUG
-       for (count=0; count<sizeof(ioctl_str)/sizeof(ioctl_str[0]); count++) {
+       for (count = 0; count < ARRAY_SIZE(ioctl_str); count++) {
                if (ioctl_str[count].cmd == cmd)
                        break;
        }
-       if (count < sizeof(ioctl_str) / sizeof(ioctl_str[0]))
+       if (count < ARRAY_SIZE(ioctl_str))
                pr_debug("ioctl %s, arg=0x%lxn", ioctl_str[count].str, arg);
        else
                pr_debug("ioctl 0x%x unknown, arg=0x%lx\n", cmd, arg);
index ad7210a00dc01ead45e119d7fed3f2c613124ed6..f813ae9c2134e2e7b17f41c486bf23c7d167a543 100644 (file)
@@ -429,7 +429,7 @@ static int btaudio_mixer_ioctl(struct inode *inode, struct file *file,
        return 0;
 }
 
-static struct file_operations btaudio_mixer_fops = {
+static const struct file_operations btaudio_mixer_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .open           = btaudio_mixer_open,
@@ -796,7 +796,7 @@ static unsigned int btaudio_dsp_poll(struct file *file, struct poll_table_struct
        return mask;
 }
 
-static struct file_operations btaudio_digital_dsp_fops = {
+static const struct file_operations btaudio_digital_dsp_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .open           = btaudio_dsp_open_digital,
@@ -807,7 +807,7 @@ static struct file_operations btaudio_digital_dsp_fops = {
        .poll           = btaudio_dsp_poll,
 };
 
-static struct file_operations btaudio_analog_dsp_fops = {
+static const struct file_operations btaudio_analog_dsp_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .open           = btaudio_dsp_open_analog,
@@ -915,12 +915,11 @@ static int __devinit btaudio_probe(struct pci_dev *pci_dev,
                return -EBUSY;
        }
 
-       bta = kmalloc(sizeof(*bta),GFP_ATOMIC);
+       bta = kzalloc(sizeof(*bta),GFP_ATOMIC);
        if (!bta) {
                rc = -ENOMEM;
                goto fail0;
        }
-       memset(bta,0,sizeof(*bta));
 
        bta->pci  = pci_dev;
        bta->irq  = pci_dev->irq;
index 147c8a951137a4452fb059a66dab5cbfbc381c7d..2a1f0d9ac968083f5ec0ec3a6164bf15ff6bc5b4 100644 (file)
@@ -3048,10 +3048,9 @@ static int cs_open(struct inode *inode, struct file *file)
                CS_DBGOUT(CS_WAVE_READ, 2, printk("cs46xx: cs_open() FMODE_READ\n") );
                if (card->states[0] == NULL) {
                        state = card->states[0] =
-                               kmalloc(sizeof(struct cs_state), GFP_KERNEL);
+                               kzalloc(sizeof(struct cs_state), GFP_KERNEL);
                        if (state == NULL)
                                return -ENOMEM;
-                       memset(state, 0, sizeof(struct cs_state));
                        mutex_init(&state->sem);
                        dmabuf = &state->dmabuf;
                        dmabuf->pbuf = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
@@ -3114,10 +3113,9 @@ static int cs_open(struct inode *inode, struct file *file)
                CS_DBGOUT(CS_OPEN, 2, printk("cs46xx: cs_open() FMODE_WRITE\n") );
                if (card->states[1] == NULL) {
                        state = card->states[1] =
-                               kmalloc(sizeof(struct cs_state), GFP_KERNEL);
+                               kzalloc(sizeof(struct cs_state), GFP_KERNEL);
                        if (state == NULL)
                                return -ENOMEM;
-                       memset(state, 0, sizeof(struct cs_state));
                        mutex_init(&state->sem);
                        dmabuf = &state->dmabuf;
                        dmabuf->pbuf = (void *)get_zeroed_page(GFP_KERNEL | GFP_DMA);
@@ -5075,11 +5073,10 @@ static int __devinit cs46xx_probe(struct pci_dev *pci_dev,
        pci_read_config_word(pci_dev, PCI_SUBSYSTEM_VENDOR_ID, &ss_vendor);
        pci_read_config_word(pci_dev, PCI_SUBSYSTEM_ID, &ss_card);
 
-       if ((card = kmalloc(sizeof(struct cs_card), GFP_KERNEL)) == NULL) {
+       if ((card = kzalloc(sizeof(struct cs_card), GFP_KERNEL)) == NULL) {
                printk(KERN_ERR "cs46xx: out of memory\n");
                return -ENOMEM;
        }
-       memset(card, 0, sizeof(*card));
        card->ba0_addr = RSRCADDRESS(pci_dev, 0);
        card->ba1_addr = RSRCADDRESS(pci_dev, 1);
        card->pci_dev = pci_dev;
index cb845580fe031ee54efcf5f19acac2a8fa025173..18e149f52a8869b6b2b22600afe17ddb194e89e7 100644 (file)
@@ -14,7 +14,7 @@ config DMASOUND_ATARI
 
 config DMASOUND_PMAC
        tristate "PowerMac DMA sound support"
-       depends on PPC32 && PPC_PMAC && SOUND && I2C
+       depends on PPC32 && PPC_PMAC && SOUND && I2C && OBSOLETE_OSS
        select DMASOUND
        help
          If you want to use the internal audio of your PowerMac in Linux,
index 7360d8954d6009009f57e7b18b8f437fb15f9c52..0f0d03a55dab71139fbac2fd1da9fb3832f605ba 100644 (file)
@@ -163,10 +163,9 @@ static int daca_detect_client(struct i2c_adapter *adapter, int address)
        struct i2c_client *new_client;
        int rc = -ENODEV;
 
-       new_client = kmalloc(sizeof(*new_client), GFP_KERNEL);
+       new_client = kzalloc(sizeof(*new_client), GFP_KERNEL);
        if (!new_client)
                return -ENOMEM;
-       memset(new_client, 0, sizeof(*new_client));
 
        new_client->addr = address;
        new_client->adapter = adapter;
index 80b836e80d993745b11b16dcd5c1f86da4c07795..a0ec886f2aa367e0f573a3bc8e4f6d981260158f 100644 (file)
@@ -371,7 +371,7 @@ static int mixer_ioctl(struct inode *inode, struct file *file, u_int cmd,
        return -EINVAL;
 }
 
-static struct file_operations mixer_fops =
+static const struct file_operations mixer_fops =
 {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
@@ -1337,7 +1337,7 @@ static int sq_ioctl(struct inode *inode, struct file *file, u_int cmd,
        return -EINVAL;
 }
 
-static struct file_operations sq_fops =
+static const struct file_operations sq_fops =
 {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
@@ -1561,7 +1561,7 @@ static ssize_t state_read(struct file *file, char __user *buf, size_t count,
        return n;
 }
 
-static struct file_operations state_fops = {
+static const struct file_operations state_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .read           = state_read,
index 2f21a3c00374ad2b40e40482ab1aff41594f9a09..4b7dbdd2a43833c2553c2b994a28f599e3d6bc46 100644 (file)
@@ -807,10 +807,9 @@ tas3001c_init(struct i2c_client *client)
        size_t sz = sizeof(*self) + (TAS3001C_REG_MAX*sizeof(tas_shadow_t));
        int i, j;
 
-       self = kmalloc(sz, GFP_KERNEL);
+       self = kzalloc(sz, GFP_KERNEL);
        if (!self)
                return -ENOMEM;
-       memset(self, 0, sz);
 
        self->super.client = client;
        self->super.shadow = (tas_shadow_t *)(self+1);
index af34fb39bc29ed2323572097dd8c8d99cd778502..678bf0ff6da27329ad0951b9b2bf2ae7bb7714c9 100644 (file)
@@ -1092,10 +1092,9 @@ tas3004_init(struct i2c_client *client)
        char mcr2 = 0;
        int i, j;
 
-       self = kmalloc(sz, GFP_KERNEL);
+       self = kzalloc(sz, GFP_KERNEL);
        if (!self)
                return -ENOMEM;
-       memset(self, 0, sz);
 
        self->super.client = client;
        self->super.shadow = (tas_shadow_t *)(self+1);
index 882ae98a41b127c7b23d76d4465bc1cc3e5f2acf..665e85b5562bd56785494bbfbd428b9459afaa5a 100644 (file)
@@ -135,10 +135,9 @@ tas_detect_client(struct i2c_adapter *adapter, int address)
                return -ENODEV;
        }
        
-       new_client = kmalloc(sizeof(*new_client), GFP_KERNEL);
+       new_client = kzalloc(sizeof(*new_client), GFP_KERNEL);
        if (!new_client)
                return -ENOMEM;
-       memset(new_client, 0, sizeof(*new_client));
 
        new_client->addr = address;
        new_client->adapter = adapter;
index efcf589d7083401450d2c743d36b65e5cedbf6ee..e75ea21eb8117fd67558b4d64328f18c806035be 100644 (file)
@@ -1582,7 +1582,7 @@ static void emu10k1_waveout_bh(unsigned long refdata)
        return;
 }
 
-struct file_operations emu10k1_audio_fops = {
+const struct file_operations emu10k1_audio_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .read           = emu10k1_audio_read,
index 6c59df7b00011965f04cad5f5f3a3bd17319ae5d..16ac02540a3f77ac0ee591abe4e529abe8430e02 100644 (file)
@@ -455,15 +455,13 @@ static int __devinit emu10k1_midi_init(struct emu10k1_card *card)
 {
        int ret;
 
-       card->mpuout = kmalloc(sizeof(struct emu10k1_mpuout), GFP_KERNEL);
+       card->mpuout = kzalloc(sizeof(struct emu10k1_mpuout), GFP_KERNEL);
        if (card->mpuout == NULL) {
                printk(KERN_WARNING "emu10k1: Unable to allocate emu10k1_mpuout: out of memory\n");
                ret = -ENOMEM;
                goto err_out1;
        }
 
-       memset(card->mpuout, 0, sizeof(struct emu10k1_mpuout));
-
        card->mpuout->intr = 1;
        card->mpuout->status = FLAGS_AVAILABLE;
        card->mpuout->state = CARDMIDIOUT_STATE_DEFAULT;
@@ -472,15 +470,13 @@ static int __devinit emu10k1_midi_init(struct emu10k1_card *card)
 
        spin_lock_init(&card->mpuout->lock);
 
-       card->mpuin = kmalloc(sizeof(struct emu10k1_mpuin), GFP_KERNEL);
+       card->mpuin = kzalloc(sizeof(struct emu10k1_mpuin), GFP_KERNEL);
        if (card->mpuin == NULL) {
                printk(KERN_WARNING "emu10k1: Unable to allocate emu10k1_mpuin: out of memory\n");
                ret = -ENOMEM;
                 goto err_out2;
        }
 
-       memset(card->mpuin, 0, sizeof(struct emu10k1_mpuin));
-
        card->mpuin->status = FLAGS_AVAILABLE;
 
        tasklet_init(&card->mpuin->tasklet, emu10k1_mpuin_bh, (unsigned long) card->mpuin);
@@ -1280,11 +1276,10 @@ static int __devinit emu10k1_probe(struct pci_dev *pci_dev, const struct pci_dev
 
        pci_set_master(pci_dev);
 
-       if ((card = kmalloc(sizeof(struct emu10k1_card), GFP_KERNEL)) == NULL) {
+       if ((card = kzalloc(sizeof(struct emu10k1_card), GFP_KERNEL)) == NULL) {
                 printk(KERN_ERR "emu10k1: out of memory\n");
                 return -ENOMEM;
         }
-        memset(card, 0, sizeof(struct emu10k1_card));
 
        card->iobase = pci_resource_start(pci_dev, 0);
        card->length = pci_resource_len(pci_dev, 0); 
index cca3dad2bdf4bf2550f48668286687cb1dc33ed1..df1e990449a0370b0f5b7090205c8162990e19d7 100644 (file)
@@ -458,7 +458,7 @@ int emu10k1_midi_callback(unsigned long msg, unsigned long refdata, unsigned lon
 }
 
 /* MIDI file operations */
-struct file_operations emu10k1_midi_fops = {
+const struct file_operations emu10k1_midi_fops = {
        .owner          = THIS_MODULE,
        .read           = emu10k1_midi_read,
        .write          = emu10k1_midi_write,
index 6419796c2ed7b665e442547dfea1447e6f7590a4..bc3805fb0701eae0ce5dab83ba12c3c69b2f64c4 100644 (file)
@@ -681,7 +681,7 @@ static int emu10k1_mixer_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-struct file_operations emu10k1_mixer_fops = {
+const struct file_operations emu10k1_mixer_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .ioctl          = emu10k1_mixer_ioctl,
index cc282a0cd539847d8b10be91d3a7551e5194d06b..974dd732b1499606c37d6b324e6b932a4dddab14 100644 (file)
 #include <linux/dma-mapping.h>
 #include <linux/mutex.h>
 #include <linux/mm.h>
+#include <linux/kernel.h>
 
 #include <asm/io.h>
 #include <asm/page.h>
@@ -2870,11 +2871,10 @@ static int __devinit es1371_probe(struct pci_dev *pcidev, const struct pci_devic
                printk(KERN_WARNING "es1371: architecture does not support 32bit PCI busmaster DMA\n");
                return i;
        }
-       if (!(s = kmalloc(sizeof(struct es1371_state), GFP_KERNEL))) {
+       if (!(s = kzalloc(sizeof(struct es1371_state), GFP_KERNEL))) {
                printk(KERN_WARNING PFX "out of memory\n");
                return -ENOMEM;
        }
-       memset(s, 0, sizeof(struct es1371_state));
        
        s->codec = ac97_alloc_codec();
        if(s->codec == NULL)
@@ -2998,7 +2998,7 @@ static int __devinit es1371_probe(struct pci_dev *pcidev, const struct pci_devic
        set_fs(KERNEL_DS);
        val = SOUND_MASK_LINE;
        mixdev_ioctl(s->codec, SOUND_MIXER_WRITE_RECSRC, (unsigned long)&val);
-       for (i = 0; i < sizeof(initvol)/sizeof(initvol[0]); i++) {
+       for (i = 0; i < ARRAY_SIZE(initvol); i++) {
                val = initvol[i].vol;
                mixdev_ioctl(s->codec, initvol[i].mixch, (unsigned long)&val);
        }
index d18286ccc14d244ee18d55b9ac9d04c48b0c2c50..a94b9df489dcbcae8c8253b28a552288495cdd53 100644 (file)
@@ -1377,7 +1377,7 @@ static int hal2_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-static struct file_operations hal2_audio_fops = {
+static const struct file_operations hal2_audio_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .read           = hal2_read,
@@ -1388,7 +1388,7 @@ static struct file_operations hal2_audio_fops = {
        .release        = hal2_release,
 };
 
-static struct file_operations hal2_mixer_fops = {
+static const struct file_operations hal2_mixer_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .ioctl          = hal2_ioctl_mixdev,
@@ -1435,10 +1435,9 @@ static int hal2_init_card(struct hal2_card **phal2, struct hpc3_regs *hpc3)
        int ret = 0;
        struct hal2_card *hal2;
 
-       hal2 = kmalloc(sizeof(struct hal2_card), GFP_KERNEL);
+       hal2 = kzalloc(sizeof(struct hal2_card), GFP_KERNEL);
        if (!hal2)
                return -ENOMEM;
-       memset(hal2, 0, sizeof(struct hal2_card));
 
        hal2->ctl_regs = (struct hal2_ctl_regs *)hpc3->pbus_extregs[0];
        hal2->aes_regs = (struct hal2_aes_regs *)hpc3->pbus_extregs[1];
index c3c8a720d555a73749c1b9f62587f16097f7fae2..f5e31f11973d39a1ae995dd0d311c253c028551c 100644 (file)
@@ -2580,10 +2580,9 @@ static int i810_open(struct inode *inode, struct file *file)
                for (i = 0; i < NR_HW_CH && card && !card->initializing; i++) {
                        if (card->states[i] == NULL) {
                                state = card->states[i] = (struct i810_state *)
-                                       kmalloc(sizeof(struct i810_state), GFP_KERNEL);
+                                       kzalloc(sizeof(struct i810_state), GFP_KERNEL);
                                if (state == NULL)
                                        return -ENOMEM;
-                               memset(state, 0, sizeof(struct i810_state));
                                dmabuf = &state->dmabuf;
                                goto found_virt;
                        }
@@ -3205,10 +3204,9 @@ static void __devinit i810_configure_clocking (void)
         */
        if(card != NULL) {
                state = card->states[0] = (struct i810_state *)
-                                       kmalloc(sizeof(struct i810_state), GFP_KERNEL);
+                                       kzalloc(sizeof(struct i810_state), GFP_KERNEL);
                if (state == NULL)
                        return;
-               memset(state, 0, sizeof(struct i810_state));
                dmabuf = &state->dmabuf;
 
                dmabuf->write_channel = card->alloc_pcm_channel(card);
@@ -3273,11 +3271,10 @@ static int __devinit i810_probe(struct pci_dev *pci_dev, const struct pci_device
                return -ENODEV;
        }
        
-       if ((card = kmalloc(sizeof(struct i810_card), GFP_KERNEL)) == NULL) {
+       if ((card = kzalloc(sizeof(struct i810_card), GFP_KERNEL)) == NULL) {
                printk(KERN_ERR "i810_audio: out of memory\n");
                return -ENOMEM;
        }
-       memset(card, 0, sizeof(*card));
 
        card->initializing = 1;
        card->pci_dev = pci_dev;
index 12e7b3038be2bb8a05dcb2c27045d4023c340464..dfe670f12e67d71117904db746c2a2b8e87af10d 100644 (file)
@@ -139,13 +139,12 @@ static int __devinit probe_one(struct pci_dev *pdev, const struct pci_device_id
        printk(KERN_INFO "kahlua: XpressAudio on IRQ %d, DMA %d, %d\n",
                irq, dma8, dma16);
        
-       hw_config = kmalloc(sizeof(struct address_info), GFP_KERNEL);
+       hw_config = kzalloc(sizeof(struct address_info), GFP_KERNEL);
        if(hw_config == NULL)
        {
                printk(KERN_ERR "kahlua: out of memory.\n");
                return 1;
        }
-       memset(hw_config, 0, sizeof(*hw_config));
        
        pci_set_drvdata(pdev, hw_config);
        
index 24110d63b136803e1d9ac9a2942b213e068a066e..f1f49ebf752ea0a6ee109fbf9622b1a0265c92f0 100644 (file)
@@ -1106,7 +1106,7 @@ static irqreturn_t intr(int irq, void *dev_id)
        return IRQ_HANDLED;
 }
 
-static struct file_operations dev_fileops = {
+static const struct file_operations dev_fileops = {
        .owner          = THIS_MODULE,
        .read           = dev_read,
        .write          = dev_write,
index da9728e17727a9a60d3d1d9cb1ca79f8725c6820..27b4ba3aaa7cc78746c3469ce95f5894afb62bcc 100644 (file)
@@ -1381,11 +1381,11 @@ static int vrc5477_ac97_ioctl(struct inode *inode, struct file *file,
        int val, ret;
 
 #ifdef VRC5477_AC97_DEBUG
-       for (count=0; count<sizeof(ioctl_str)/sizeof(ioctl_str[0]); count++) {
+       for (count = 0; count < ARRAY_SIZE(ioctl_str); count++) {
                if (ioctl_str[count].cmd == cmd)
                        break;
        }
-       if (count < sizeof(ioctl_str)/sizeof(ioctl_str[0]))
+       if (count < ARRAY_SIZE(ioctl_str))
                printk(KERN_INFO PFX "ioctl %s\n", ioctl_str[count].str);
        else
                printk(KERN_INFO PFX "ioctl unknown, 0x%x\n", cmd);
@@ -1860,11 +1860,10 @@ static int __devinit vrc5477_ac97_probe(struct pci_dev *pcidev,
        if (pcidev->irq == 0) 
                return -1;
 
-       if (!(s = kmalloc(sizeof(struct vrc5477_ac97_state), GFP_KERNEL))) {
+       if (!(s = kzalloc(sizeof(struct vrc5477_ac97_state), GFP_KERNEL))) {
                printk(KERN_ERR PFX "alloc of device struct failed\n");
                return -1;
        }
-       memset(s, 0, sizeof(struct vrc5477_ac97_state));
 
        init_waitqueue_head(&s->dma_adc.wait);
        init_waitqueue_head(&s->dma_dac.wait);
index 2e8cfa5481f28c4e1e7d7f2d40b5326538bd02d7..fc273e55094480db93f3ad351c4e6aea49137c28 100644 (file)
@@ -166,7 +166,7 @@ int opl3_detect(int ioaddr, int *osp)
                return 0;
        }
 
-       devc = kmalloc(sizeof(*devc), GFP_KERNEL);
+       devc = kzalloc(sizeof(*devc), GFP_KERNEL);
 
        if (devc == NULL)
        {
@@ -175,7 +175,6 @@ int opl3_detect(int ioaddr, int *osp)
                return 0;
        }
 
-       memset(devc, 0, sizeof(*devc));
        strcpy(devc->fm_info.name, "OPL2");
 
        if (!request_region(ioaddr, 4, devc->fm_info.name)) {
index 0490562c7f7f03d8bed5f945ee4f30943721f64b..a1a962d7f67d3a07e77cf1d0a36b791116ca83cf 100644 (file)
@@ -43,4 +43,4 @@ extern int sound_nblocks;
 #undef PSEUDO_DMA_AUTOINIT
 #define ALLOW_BUFFER_MAPPING
 
-extern struct file_operations oss_sound_fops;
+extern const struct file_operations oss_sound_fops;
index 8666291c00523fccca590df1d6a5fbedbf6c28c7..27acd6f29b98ffe06e4ffddd737e2d49218ce7c3 100644 (file)
@@ -137,11 +137,10 @@ static int __init sb_init_legacy(void)
 {
        struct sb_module_options sbmo = {0};
 
-       if((legacy = kmalloc(sizeof(struct sb_card_config), GFP_KERNEL)) == NULL) {
+       if((legacy = kzalloc(sizeof(struct sb_card_config), GFP_KERNEL)) == NULL) {
                printk(KERN_ERR "sb: Error: Could not allocate memory\n");
                return -ENOMEM;
        }
-       memset(legacy, 0, sizeof(struct sb_card_config));
 
        legacy->conf.io_base      = io;
        legacy->conf.irq          = irq;
@@ -247,11 +246,10 @@ static int sb_pnp_probe(struct pnp_card_link *card, const struct pnp_card_device
                return -EBUSY;
        }
 
-       if((scc = kmalloc(sizeof(struct sb_card_config), GFP_KERNEL)) == NULL) {
+       if((scc = kzalloc(sizeof(struct sb_card_config), GFP_KERNEL)) == NULL) {
                printk(KERN_ERR "sb: Error: Could not allocate memory\n");
                return -ENOMEM;
        }
-       memset(scc, 0, sizeof(struct sb_card_config));
 
        printk(KERN_INFO "sb: PnP: Found Card Named = \"%s\", Card PnP id = " \
               "%s, Device PnP id = %s\n", card->card->name, card_id->id,
index 51f554154c48dfa0a7c56d082231268fc9a55c5a..7ea9accc2ba4461dd5a543cec153b4c8ca729dde 100644 (file)
@@ -255,7 +255,7 @@ static int dac_audio_release(struct inode *inode, struct file *file)
        return 0;
 }
 
-struct file_operations dac_audio_fops = {
+const struct file_operations dac_audio_fops = {
       .read =          dac_audio_read,
       .write = dac_audio_write,
       .ioctl = dac_audio_ioctl,
index a89108cb74eae7c18ae772163dca1ac93161aaa0..dcd8d6d2f56f39b6b821f12e503bce389996ccf4 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/ctype.h>
 #include <linux/stddef.h>
 #include <linux/kmod.h>
+#include <linux/kernel.h>
 #include <asm/dma.h>
 #include <asm/io.h>
 #include <linux/wait.h>
@@ -482,7 +483,7 @@ static int sound_mmap(struct file *file, struct vm_area_struct *vma)
        return 0;
 }
 
-struct file_operations oss_sound_fops = {
+const struct file_operations oss_sound_fops = {
        .owner          = THIS_MODULE,
        .llseek         = no_llseek,
        .read           = sound_read,
@@ -557,7 +558,7 @@ static int __init oss_init(void)
        /* Protecting the innocent */
        sound_dmap_flag = (dmabuf > 0 ? 1 : 0);
 
-       for (i = 0; i < sizeof (dev_list) / sizeof *dev_list; i++) {
+       for (i = 0; i < ARRAY_SIZE(dev_list); i++) {
                device_create(sound_class, NULL,
                              MKDEV(SOUND_MAJOR, dev_list[i].minor),
                              "%s", dev_list[i].name);
@@ -581,7 +582,7 @@ static void __exit oss_cleanup(void)
 {
        int i, j;
 
-       for (i = 0; i < sizeof (dev_list) / sizeof *dev_list; i++) {
+       for (i = 0; i < ARRAY_SIZE(dev_list); i++) {
                device_destroy(sound_class, MKDEV(SOUND_MAJOR, dev_list[i].minor));
                if (!dev_list[i].num)
                        continue;
index 471c274c5000e5ebe1dd0f69c5d4e8c57a51c556..016b918329ada95227ddb95666fdd6ccc7615531 100644 (file)
@@ -77,6 +77,7 @@
 #include <linux/poll.h>
 #include <linux/smp_lock.h>
 #include <linux/mutex.h>
+#include <linux/kernel.h>
 
 #include <asm/byteorder.h>
 #include <asm/dma.h>
@@ -615,25 +616,23 @@ static int init_serdma(serdma_t *dma)
 
         /* Descriptors */
         dma->ringsz = DMA_DESCR;
-        dma->descrtab = kmalloc(dma->ringsz * sizeof(serdma_descr_t), GFP_KERNEL);
+        dma->descrtab = kzalloc(dma->ringsz * sizeof(serdma_descr_t), GFP_KERNEL);
         if (!dma->descrtab) {
-                printk(KERN_ERR "cs4297a: kmalloc descrtab failed\n");
+                printk(KERN_ERR "cs4297a: kzalloc descrtab failed\n");
                 return -1;
         }
-        memset(dma->descrtab, 0, dma->ringsz * sizeof(serdma_descr_t));
         dma->descrtab_end = dma->descrtab + dma->ringsz;
        /* XXX bloddy mess, use proper DMA API here ...  */
        dma->descrtab_phys = CPHYSADDR((long)dma->descrtab);
         dma->descr_add = dma->descr_rem = dma->descrtab;
 
         /* Frame buffer area */
-        dma->dma_buf = kmalloc(DMA_BUF_SIZE, GFP_KERNEL);
+        dma->dma_buf = kzalloc(DMA_BUF_SIZE, GFP_KERNEL);
         if (!dma->dma_buf) {
-                printk(KERN_ERR "cs4297a: kmalloc dma_buf failed\n");
+                printk(KERN_ERR "cs4297a: kzalloc dma_buf failed\n");
                 kfree(dma->descrtab);
                 return -1;
         }
-        memset(dma->dma_buf, 0, DMA_BUF_SIZE);
         dma->dma_buf_phys = CPHYSADDR((long)dma->dma_buf);
 
         /* Samples buffer area */
@@ -2618,12 +2617,11 @@ static int __init cs4297a_init(void)
         udelay(100);
 #endif
 
-       if (!(s = kmalloc(sizeof(struct cs4297a_state), GFP_KERNEL))) {
+       if (!(s = kzalloc(sizeof(struct cs4297a_state), GFP_KERNEL))) {
                CS_DBGOUT(CS_ERROR, 1, printk(KERN_ERR
                      "cs4297a: probe() no memory for state struct.\n"));
                return -1;
        }
-       memset(s, 0, sizeof(struct cs4297a_state));
         s->magic = CS4297a_MAGIC;
        init_waitqueue_head(&s->dma_adc.wait);
        init_waitqueue_head(&s->dma_dac.wait);
@@ -2676,7 +2674,7 @@ static int __init cs4297a_init(void)
 #if 0
                 val = SOUND_MASK_LINE;
                 mixer_ioctl(s, SOUND_MIXER_WRITE_RECSRC, (unsigned long) &val);
-                for (i = 0; i < sizeof(initvol) / sizeof(initvol[0]); i++) {
+                for (i = 0; i < ARRAY_SIZE(initvol); i++) {
                         val = initvol[i].vol;
                         mixer_ioctl(s, initvol[i].mixch, (unsigned long) &val);
                 }
index 6b1f8c9cdcf870419924dad10156dcf395df4e9f..72a8a0ed36a2855cca84d0d64a1c3844a96ab344 100644 (file)
@@ -2729,12 +2729,11 @@ trident_open(struct inode *inode, struct file *file)
                }
                for (i = 0; i < NR_HW_CH; i++) {
                        if (card->states[i] == NULL) {
-                               state = card->states[i] = kmalloc(sizeof(*state), GFP_KERNEL);
+                               state = card->states[i] = kzalloc(sizeof(*state), GFP_KERNEL);
                                if (state == NULL) {
                                        mutex_unlock(&card->open_mutex);
                                        return -ENOMEM;
                                }
-                               memset(state, 0, sizeof(*state));
                                mutex_init(&state->sem);
                                dmabuf = &state->dmabuf;
                                goto found_virt;
@@ -3618,7 +3617,7 @@ ali_allocate_other_states_resources(struct trident_state *state, int chan_nums)
                        }
                        return -EBUSY;
                }
-               s = card->states[i] = kmalloc(sizeof(*state), GFP_KERNEL);
+               s = card->states[i] = kzalloc(sizeof(*state), GFP_KERNEL);
                if (!s) {
                        num = ali_multi_channels_5_1[state_count];
                        ali_free_pcm_channel(card, num);
@@ -3630,7 +3629,6 @@ ali_allocate_other_states_resources(struct trident_state *state, int chan_nums)
                        }
                        return -ENOMEM;
                }
-               memset(s, 0, sizeof(*state));
 
                s->dmabuf.channel = channel;
                s->dmabuf.ossfragshift = s->dmabuf.ossmaxfrags =
@@ -4399,11 +4397,10 @@ trident_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id)
        }
 
        rc = -ENOMEM;
-       if ((card = kmalloc(sizeof(*card), GFP_KERNEL)) == NULL) {
+       if ((card = kzalloc(sizeof(*card), GFP_KERNEL)) == NULL) {
                printk(KERN_ERR "trident: out of memory\n");
                goto out_release_region;
        }
-       memset(card, 0, sizeof (*card));
 
        init_timer(&card->timer);
        card->iobase = iobase;
index c96cc8c68b3bec1135aefc7fd7e6c370c540121d..7ab3a732e184443ecc299147240f1470df2e9e84 100644 (file)
@@ -1619,7 +1619,7 @@ out:
 }
 
 
-static struct file_operations via_mixer_fops = {
+static const struct file_operations via_mixer_fops = {
        .owner          = THIS_MODULE,
        .open           = via_mixer_open,
        .llseek         = no_llseek,
@@ -2042,7 +2042,7 @@ static int via_interrupt_init (struct via_info *card)
  *
  */
 
-static struct file_operations via_dsp_fops = {
+static const struct file_operations via_dsp_fops = {
        .owner          = THIS_MODULE,
        .open           = via_dsp_open,
        .release        = via_dsp_release,
index 6dfb9f4b03ec9c0fae1df528ec9245f226ab50ed..d25249a932bfa48abe544bfa7dac49ba0a3e17e7 100644 (file)
@@ -3035,7 +3035,7 @@ static int vwsnd_audio_release(struct inode *inode, struct file *file)
        return err;
 }
 
-static struct file_operations vwsnd_audio_fops = {
+static const struct file_operations vwsnd_audio_fops = {
        .owner =        THIS_MODULE,
        .llseek =       no_llseek,
        .read =         vwsnd_audio_read,
@@ -3225,7 +3225,7 @@ static int vwsnd_mixer_ioctl(struct inode *ioctl,
        return retval;
 }
 
-static struct file_operations vwsnd_mixer_fops = {
+static const struct file_operations vwsnd_mixer_fops = {
        .owner =        THIS_MODULE,
        .llseek =       no_llseek,
        .ioctl =        vwsnd_mixer_ioctl,
index 26a7c6af95bcc5c18992cbe2a2ebea1763f741c7..b48c72923a13dfb30c35669213112a31baa4ffc2 100644 (file)
@@ -1267,12 +1267,10 @@ static int __init waveartist_init(wavnc_info *devc)
        conf_printf2(dev_name, devc->hw.io_base, devc->hw.irq,
                     devc->hw.dma, devc->hw.dma2);
 
-       portc = kmalloc(sizeof(wavnc_port_info), GFP_KERNEL);
+       portc = kzalloc(sizeof(wavnc_port_info), GFP_KERNEL);
        if (portc == NULL)
                goto nomem;
 
-       memset(portc, 0, sizeof(wavnc_port_info));
-
        my_dev = sound_install_audiodrv(AUDIO_DRIVER_VERSION, dev_name,
                        &waveartist_audio_driver, sizeof(struct audio_driver),
                        devc->audio_flags, AFMT_U8 | AFMT_S16_LE | AFMT_S8,
index 74ed81081478c1266a8851f6c8709fcdcc90c486..a9eec2a2357d5fae8638d2234444aca90ffe1bc2 100644 (file)
@@ -143,6 +143,7 @@ static const struct ac97_codec_id snd_ac97_codec_ids[] = {
 { 0x43525970, 0xfffffff8, "CS4202",            NULL,           NULL },
 { 0x43585421, 0xffffffff, "HSD11246",          NULL,           NULL }, // SmartMC II
 { 0x43585428, 0xfffffff8, "Cx20468",           patch_conexant, NULL }, // SmartAMC fixme: the mask might be different
+{ 0x43585431, 0xffffffff, "Cx20551",           patch_cx20551,  NULL },
 { 0x44543031, 0xfffffff0, "DT0398",            NULL,           NULL },
 { 0x454d4328, 0xffffffff, "EM28028",           NULL,           NULL },  // same as TR28028?
 { 0x45838308, 0xffffffff, "ESS1988",           NULL,           NULL },
index 641d0c8d659ed222f7540e8483f7881c1c232ab3..bfc2fed16da3a0208a6a5be3d146a81032ecffd1 100644 (file)
@@ -1338,6 +1338,12 @@ int patch_conexant(struct snd_ac97 * ac97)
        return 0;
 }
 
+int patch_cx20551(struct snd_ac97 *ac97)
+{
+       snd_ac97_update_bits(ac97, 0x5c, 0x01, 0x01);
+       return 0;
+}
+
 /*
  * Analog Device AD18xx, AD19xx codecs
  */
index 94340daaaf1f7a64835c2923b0780230fd01a260..555d1c9a98fd724f2dc977a7ac860a4cfcf923b0 100644 (file)
@@ -39,6 +39,7 @@ int patch_sigmatel_stac9758(struct snd_ac97 * ac97);
 int patch_cirrus_cs4299(struct snd_ac97 * ac97);
 int patch_cirrus_spdif(struct snd_ac97 * ac97);
 int patch_conexant(struct snd_ac97 * ac97);
+int patch_cx20551(struct snd_ac97 * ac97);
 int patch_ad1819(struct snd_ac97 * ac97);
 int patch_ad1881(struct snd_ac97 * ac97);
 int patch_ad1885(struct snd_ac97 * ac97);
index 73f4668238c6034cad86c749ee405767b8d1eada..23a1c75085b58fcd742a0e015003005a43a72931 100644 (file)
@@ -57,6 +57,7 @@ struct conexant_spec {
                                         * dig_out_nid and hp_nid are optional
                                         */
        unsigned int cur_eapd;
+       unsigned int hp_present;
        unsigned int need_dac_fix;
 
        /* capture */
@@ -354,7 +355,7 @@ static struct hda_codec_ops conexant_patch_ops = {
  * the private value = nid | (invert << 8)
  */
 
-static int conexant_eapd_info(struct snd_kcontrol *kcontrol,
+static int cxt_eapd_info(struct snd_kcontrol *kcontrol,
                              struct snd_ctl_elem_info *uinfo)
 {
        uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
@@ -364,7 +365,7 @@ static int conexant_eapd_info(struct snd_kcontrol *kcontrol,
        return 0;
 }
 
-static int conexant_eapd_get(struct snd_kcontrol *kcontrol,
+static int cxt_eapd_get(struct snd_kcontrol *kcontrol,
                             struct snd_ctl_elem_value *ucontrol)
 {
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
@@ -375,9 +376,10 @@ static int conexant_eapd_get(struct snd_kcontrol *kcontrol,
        else
                ucontrol->value.integer.value[0] = spec->cur_eapd;
        return 0;
+
 }
 
-static int conexant_eapd_put(struct snd_kcontrol *kcontrol,
+static int cxt_eapd_put(struct snd_kcontrol *kcontrol,
                             struct snd_ctl_elem_value *ucontrol)
 {
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
@@ -385,11 +387,13 @@ static int conexant_eapd_put(struct snd_kcontrol *kcontrol,
        int invert = (kcontrol->private_value >> 8) & 1;
        hda_nid_t nid = kcontrol->private_value & 0xff;
        unsigned int eapd;
+
        eapd = ucontrol->value.integer.value[0];
        if (invert)
                eapd = !eapd;
        if (eapd == spec->cur_eapd && !codec->in_resume)
                return 0;
+       
        spec->cur_eapd = eapd;
        snd_hda_codec_write(codec, nid,
                            0, AC_VERB_SET_EAPD_BTLENABLE,
@@ -400,6 +404,15 @@ static int conexant_eapd_put(struct snd_kcontrol *kcontrol,
 /* controls for test mode */
 #ifdef CONFIG_SND_DEBUG
 
+#define CXT_EAPD_SWITCH(xname, nid, mask) \
+       { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0,  \
+         .info = cxt_eapd_info, \
+         .get = cxt_eapd_get, \
+         .put = cxt_eapd_put, \
+         .private_value = nid | (mask<<16) }
+
+
+
 static int conexant_ch_mode_info(struct snd_kcontrol *kcontrol,
                                 struct snd_ctl_elem_info *uinfo)
 {
@@ -492,7 +505,7 @@ static int cxt_gpio_data_put(struct snd_kcontrol *kcontrol,
          .get = cxt_gpio_data_get, \
          .put = cxt_gpio_data_put, \
          .private_value = nid | (mask<<16) }
-
+#if 0
 static int cxt_spdif_ctrl_info(struct snd_kcontrol *kcontrol,
                               struct snd_ctl_elem_info *uinfo)
 {
@@ -547,7 +560,7 @@ static int cxt_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
          .get = cxt_spdif_ctrl_get, \
          .put = cxt_spdif_ctrl_put, \
          .private_value = nid | (mask<<16) }
-
+#endif
 #endif /* CONFIG_SND_DEBUG */
 
 /* Conexant 5045 specific */
@@ -564,7 +577,7 @@ static struct hda_channel_mode cxt5045_modes[1] = {
 static struct hda_input_mux cxt5045_capture_source = {
        .num_items = 2,
        .items = {
-               { "ExtMic", 0x1 },
+               { "IntMic", 0x1 },
                { "LineIn", 0x2 },
        }
 };
@@ -575,15 +588,20 @@ static int cxt5045_hp_master_sw_put(struct snd_kcontrol *kcontrol,
 {
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
        struct conexant_spec *spec = codec->spec;
+       unsigned int bits;
 
-       if (!conexant_eapd_put(kcontrol, ucontrol))
+       if (!cxt_eapd_put(kcontrol, ucontrol))
                return 0;
 
-       /* toggle HP mute appropriately */
-       snd_hda_codec_amp_update(codec, 0x11, 0, HDA_OUTPUT, 0,
-                                0x80, spec->cur_eapd ? 0 : 0x80);
-       snd_hda_codec_amp_update(codec, 0x11, 1, HDA_OUTPUT, 0,
-                                0x80, spec->cur_eapd ? 0 : 0x80);
+       /* toggle internal speakers mute depending of presence of
+        * the headphone jack
+        */
+       bits = (!spec->hp_present && spec->cur_eapd) ? 0 : 0x80;
+       snd_hda_codec_amp_update(codec, 0x10, 0, HDA_OUTPUT, 0, 0x80, bits);
+       snd_hda_codec_amp_update(codec, 0x10, 1, HDA_OUTPUT, 0, 0x80, bits);
+       bits = spec->cur_eapd ? 0 : 0x80;
+       snd_hda_codec_amp_update(codec, 0x11, 0, HDA_OUTPUT, 0, 0x80, bits);
+       snd_hda_codec_amp_update(codec, 0x11, 1, HDA_OUTPUT, 0, 0x80, bits);
        return 1;
 }
 
@@ -610,14 +628,13 @@ static int cxt5045_hp_master_vol_put(struct snd_kcontrol *kcontrol,
 /* mute internal speaker if HP is plugged */
 static void cxt5045_hp_automute(struct hda_codec *codec)
 {
-       unsigned int present;
+       struct conexant_spec *spec = codec->spec;
+       unsigned int bits = (spec->hp_present || !spec->cur_eapd) ? 0x80 : 0;
 
-       present = snd_hda_codec_read(codec, 0x11, 0,
+       spec->hp_present = snd_hda_codec_read(codec, 0x11, 0,
                                     AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
-       snd_hda_codec_amp_update(codec, 0x10, 0, HDA_OUTPUT, 0,
-                                0x80, present ? 0x80 : 0);
-       snd_hda_codec_amp_update(codec, 0x10, 1, HDA_OUTPUT, 0,
-                                0x80, present ? 0x80 : 0);
+       snd_hda_codec_amp_update(codec, 0x10, 0, HDA_OUTPUT, 0, 0x80, bits);
+       snd_hda_codec_amp_update(codec, 0x10, 1, HDA_OUTPUT, 0, 0x80, bits);
 }
 
 /* unsolicited event for HP jack sensing */
@@ -640,25 +657,27 @@ static struct snd_kcontrol_new cxt5045_mixers[] = {
                .get = conexant_mux_enum_get,
                .put = conexant_mux_enum_put
        },
-       HDA_CODEC_VOLUME("Mic Bypass Capture Volume", 0x17, 0x02, HDA_INPUT),
-       HDA_CODEC_MUTE("Mic Bypass Capture Switch", 0x17, 0x02, HDA_INPUT),
-       HDA_CODEC_VOLUME("Capture Volume", 0x1a, 0x02, HDA_INPUT),
-       HDA_CODEC_MUTE("Capture Switch", 0x1a, 0x02, HDA_INPUT),
+       HDA_CODEC_VOLUME("Int Mic Volume", 0x17, 0x01, HDA_INPUT),
+       HDA_CODEC_MUTE("Int Mic Switch", 0x17, 0x01, HDA_INPUT),
+       HDA_CODEC_VOLUME("Ext Mic Volume", 0x17, 0x02, HDA_INPUT),
+       HDA_CODEC_MUTE("Ext Mic Switch", 0x17, 0x02, HDA_INPUT),
+       HDA_CODEC_VOLUME("Capture Volume", 0x1a, 0x0, HDA_INPUT),
+       HDA_CODEC_MUTE("Capture Switch", 0x1a, 0x0, HDA_INPUT),
        {
                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
                .name = "Master Playback Volume",
                .info = snd_hda_mixer_amp_volume_info,
                .get = snd_hda_mixer_amp_volume_get,
                .put = cxt5045_hp_master_vol_put,
-               .private_value = HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
+               .private_value = HDA_COMPOSE_AMP_VAL(0x10, 3, 0, HDA_OUTPUT),
        },
        {
                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
                .name = "Master Playback Switch",
-               .info = conexant_eapd_info,
-               .get = conexant_eapd_get,
+               .info = cxt_eapd_info,
+               .get = cxt_eapd_get,
                .put = cxt5045_hp_master_sw_put,
-               .private_value = 0x11,
+               .private_value = 0x10,
        },
 
        {}
@@ -669,22 +688,26 @@ static struct hda_verb cxt5045_init_verbs[] = {
        {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
        {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN|AC_PINCTL_VREF_50 },
        /* HP, Amp  */
-       {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
-       {0x1A, AC_VERB_SET_CONNECT_SEL,0x01},
-       {0x1A, AC_VERB_SET_AMP_GAIN_MUTE,
-        AC_AMP_SET_OUTPUT|AC_AMP_SET_RIGHT|AC_AMP_SET_LEFT|0x00},
-       {0x1A, AC_VERB_SET_AMP_GAIN_MUTE,
+       {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
+       {0x17, AC_VERB_SET_CONNECT_SEL,0x01},
+       {0x17, AC_VERB_SET_AMP_GAIN_MUTE,
+        AC_AMP_SET_OUTPUT|AC_AMP_SET_RIGHT|AC_AMP_SET_LEFT|0x01},
+       {0x17, AC_VERB_SET_AMP_GAIN_MUTE,
+        AC_AMP_SET_OUTPUT|AC_AMP_SET_RIGHT|AC_AMP_SET_LEFT|0x02},
+       {0x17, AC_VERB_SET_AMP_GAIN_MUTE,
         AC_AMP_SET_OUTPUT|AC_AMP_SET_RIGHT|AC_AMP_SET_LEFT|0x03},
-       /* Record selector: Front mic */
-       {0x14, AC_VERB_SET_CONNECT_SEL,0x03},
        {0x17, AC_VERB_SET_AMP_GAIN_MUTE,
+        AC_AMP_SET_OUTPUT|AC_AMP_SET_RIGHT|AC_AMP_SET_LEFT|0x04},
+       /* Record selector: Int mic */
+       {0x1a, AC_VERB_SET_CONNECT_SEL,0x0},
+       {0x1a, AC_VERB_SET_AMP_GAIN_MUTE,
         AC_AMP_SET_INPUT|AC_AMP_SET_RIGHT|AC_AMP_SET_LEFT|0x17},
        /* SPDIF route: PCM */
        { 0x13, AC_VERB_SET_CONNECT_SEL, 0x0 },
        /* pin sensing on HP and Mic jacks */
        {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT},
        /* EAPD */
-       {0x10, AC_VERB_SET_EAPD_BTLENABLE, 0x0 }, /* default on */
+       {0x10, AC_VERB_SET_EAPD_BTLENABLE, 0x2 }, /* default on */ 
        { } /* end */
 };
 
@@ -706,8 +729,6 @@ static struct hda_input_mux cxt5045_test_capture_source = {
 static struct snd_kcontrol_new cxt5045_test_mixer[] = {
 
        /* Output controls */
-       HDA_CODEC_VOLUME("OutAmp-1 Volume", 0x19, 0x00, HDA_OUTPUT),
-       HDA_CODEC_MUTE("OutAmp-1 Switch", 0x19,0x00, HDA_OUTPUT),
        HDA_CODEC_VOLUME("Speaker Playback Volume", 0x10, 0x0, HDA_OUTPUT),
        HDA_CODEC_MUTE("Speaker Playback Switch", 0x10, 0x0, HDA_OUTPUT),
        
@@ -715,6 +736,9 @@ static struct snd_kcontrol_new cxt5045_test_mixer[] = {
        CXT_PIN_MODE("HP-OUT pin mode", 0x11, CXT_PIN_DIR_INOUT),
        CXT_PIN_MODE("LINE1 pin mode", 0x12, CXT_PIN_DIR_INOUT),
 
+       /* EAPD Switch Control */
+       CXT_EAPD_SWITCH("External Amplifier", 0x10, 0x0),
+
        /* Loopback mixer controls */
        HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x17, 0x01, HDA_INPUT),
        HDA_CODEC_MUTE("MIC1 Playback Switch", 0x17, 0x01, HDA_INPUT),
@@ -725,17 +749,16 @@ static struct snd_kcontrol_new cxt5045_test_mixer[] = {
        HDA_CODEC_VOLUME("CD Playback Volume", 0x17, 0x04, HDA_INPUT),
        HDA_CODEC_MUTE("CD Playback Switch", 0x17, 0x04, HDA_INPUT),
 
-       /* Controls for GPIO pins, assuming they exist and are configured as outputs */
-       CXT_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
-#if 0   /* limit this to one GPIO pin for now */       
-       CXT_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
-       CXT_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
-       CXT_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
-#endif
-       CXT_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x13, 0x01),
-
-       HDA_CODEC_VOLUME("Capture Volume", 0x17, 0x0, HDA_OUTPUT),
-       HDA_CODEC_MUTE("Capture Switch", 0x17, 0x0, HDA_OUTPUT),
+       HDA_CODEC_VOLUME("Capture-1 Volume", 0x17, 0x0, HDA_INPUT),
+       HDA_CODEC_MUTE("Capture-1 Switch", 0x17, 0x0, HDA_INPUT),
+       HDA_CODEC_VOLUME("Capture-2 Volume", 0x17, 0x1, HDA_INPUT),
+       HDA_CODEC_MUTE("Capture-2 Switch", 0x17, 0x1, HDA_INPUT),
+       HDA_CODEC_VOLUME("Capture-3 Volume", 0x17, 0x2, HDA_INPUT),
+       HDA_CODEC_MUTE("Capture-3 Switch", 0x17, 0x2, HDA_INPUT),
+       HDA_CODEC_VOLUME("Capture-4 Volume", 0x17, 0x3, HDA_INPUT),
+       HDA_CODEC_MUTE("Capture-4 Switch", 0x17, 0x3, HDA_INPUT),
+       HDA_CODEC_VOLUME("Capture-5 Volume", 0x17, 0x4, HDA_INPUT),
+       HDA_CODEC_MUTE("Capture-5 Switch", 0x17, 0x4, HDA_INPUT),
        {
                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
                .name = "Input Source",
@@ -748,14 +771,9 @@ static struct snd_kcontrol_new cxt5045_test_mixer[] = {
 };
 
 static struct hda_verb cxt5045_test_init_verbs[] = {
-       /* Enable all GPIOs as outputs with an initial value of 0 */
-       {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
-       {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
-       {0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
-
        /* Enable retasking pins as output, initially without power amp */
        {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
-       {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+       {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
 
        /* Disable digital (SPDIF) pins initially, but users can enable
         * them via a mixer switch.  In the case of SPDIF-out, this initverb
@@ -823,6 +841,8 @@ static const char *cxt5045_models[CXT5045_MODELS] = {
 
 static struct snd_pci_quirk cxt5045_cfg_tbl[] = {
        SND_PCI_QUIRK(0x103c, 0x30b7, "HP DV6000Z", CXT5045_LAPTOP),
+       SND_PCI_QUIRK(0x103c, 0x30bb, "HP DV8000", CXT5045_LAPTOP),
+       SND_PCI_QUIRK(0x1734, 0x10ad, "Fujitsu Si1520", CXT5045_LAPTOP),
        {}
 };
 
@@ -880,11 +900,11 @@ static int patch_cxt5045(struct hda_codec *codec)
 
 
 /* Conexant 5047 specific */
+#define CXT5047_SPDIF_OUT      0x11
 
-static hda_nid_t cxt5047_dac_nids[1] = { 0x10 };
+static hda_nid_t cxt5047_dac_nids[2] = { 0x10, 0x1c };
 static hda_nid_t cxt5047_adc_nids[1] = { 0x12 };
 static hda_nid_t cxt5047_capsrc_nids[1] = { 0x1a };
-#define CXT5047_SPDIF_OUT      0x11
 
 static struct hda_channel_mode cxt5047_modes[1] = {
        { 2, NULL },
@@ -893,15 +913,23 @@ static struct hda_channel_mode cxt5047_modes[1] = {
 static struct hda_input_mux cxt5047_capture_source = {
        .num_items = 2,
        .items = {
-               { "ExtMic", 0x1 },
-               { "IntMic", 0x2 },
+               { "ExtMic", 0x0 },
+               { "IntMic", 0x1 },
        }
 };
 
 static struct hda_input_mux cxt5047_hp_capture_source = {
        .num_items = 1,
        .items = {
-               { "ExtMic", 0x1 },
+               { "ExtMic", 0x2 },
+       }
+};
+
+static struct hda_input_mux cxt5047_toshiba_capture_source = {
+       .num_items = 2,
+       .items = {
+               { "ExtMic", 0x2 },
+               { "Line-In", 0x1 },
        }
 };
 
@@ -911,20 +939,24 @@ static int cxt5047_hp_master_sw_put(struct snd_kcontrol *kcontrol,
 {
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
        struct conexant_spec *spec = codec->spec;
+       unsigned int bits;
 
-       if (!conexant_eapd_put(kcontrol, ucontrol))
+       if (!cxt_eapd_put(kcontrol, ucontrol))
                return 0;
 
-       /* toggle HP mute appropriately */
-       snd_hda_codec_amp_update(codec, 0x13, 0, HDA_OUTPUT, 0,
-                                0x80, spec->cur_eapd ? 0 : 0x80);
-       snd_hda_codec_amp_update(codec, 0x13, 1, HDA_OUTPUT, 0,
-                                0x80, spec->cur_eapd ? 0 : 0x80);
+       /* toggle internal speakers mute depending of presence of
+        * the headphone jack
+        */
+       bits = (!spec->hp_present && spec->cur_eapd) ? 0 : 0x80;
+       snd_hda_codec_amp_update(codec, 0x1d, 0, HDA_OUTPUT, 0, 0x80, bits);
+       snd_hda_codec_amp_update(codec, 0x1d, 1, HDA_OUTPUT, 0, 0x80, bits);
+       bits = spec->cur_eapd ? 0 : 0x80;
+       snd_hda_codec_amp_update(codec, 0x13, 0, HDA_OUTPUT, 0, 0x80, bits);
+       snd_hda_codec_amp_update(codec, 0x13, 1, HDA_OUTPUT, 0, 0x80, bits);
        return 1;
 }
 
-#if 0
-/* bind volumes of both NID 0x13 and 0x1d */
+/* bind volumes of both NID 0x13 (Headphones) and 0x1d (Speakers) */
 static int cxt5047_hp_master_vol_put(struct snd_kcontrol *kcontrol,
                                     struct snd_ctl_elem_value *ucontrol)
 {
@@ -932,9 +964,9 @@ static int cxt5047_hp_master_vol_put(struct snd_kcontrol *kcontrol,
        long *valp = ucontrol->value.integer.value;
        int change;
 
-       change = snd_hda_codec_amp_update(codec, 0x1c, 0, HDA_OUTPUT, 0,
+       change = snd_hda_codec_amp_update(codec, 0x1d, 0, HDA_OUTPUT, 0,
                                          0x7f, valp[0] & 0x7f);
-       change |= snd_hda_codec_amp_update(codec, 0x1c, 1, HDA_OUTPUT, 0,
+       change |= snd_hda_codec_amp_update(codec, 0x1d, 1, HDA_OUTPUT, 0,
                                           0x7f, valp[1] & 0x7f);
        snd_hda_codec_amp_update(codec, 0x13, 0, HDA_OUTPUT, 0,
                                 0x7f, valp[0] & 0x7f);
@@ -942,19 +974,20 @@ static int cxt5047_hp_master_vol_put(struct snd_kcontrol *kcontrol,
                                 0x7f, valp[1] & 0x7f);
        return change;
 }
-#endif
 
 /* mute internal speaker if HP is plugged */
 static void cxt5047_hp_automute(struct hda_codec *codec)
 {
-       unsigned int present;
+       struct conexant_spec *spec = codec->spec;
+       unsigned int bits = spec->hp_present || !spec->cur_eapd ? 0x80 : 0;
 
-       present = snd_hda_codec_read(codec, 0x13, 0,
+       spec->hp_present = snd_hda_codec_read(codec, 0x13, 0,
                                     AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
-       snd_hda_codec_amp_update(codec, 0x1c, 0, HDA_OUTPUT, 0,
-                                0x80, present ? 0x80 : 0);
-       snd_hda_codec_amp_update(codec, 0x1c, 1, HDA_OUTPUT, 0,
-                                0x80, present ? 0x80 : 0);
+       snd_hda_codec_amp_update(codec, 0x1d, 0, HDA_OUTPUT, 0, 0x80, bits);
+       snd_hda_codec_amp_update(codec, 0x1d, 1, HDA_OUTPUT, 0, 0x80, bits);
+       /* Mute/Unmute PCM 2 for good measure - some systems need this */
+       snd_hda_codec_amp_update(codec, 0x1c, 0, HDA_OUTPUT, 0, 0x80, bits);
+       snd_hda_codec_amp_update(codec, 0x1c, 1, HDA_OUTPUT, 0, 0x80, bits);
 }
 
 /* toggle input of built-in and mic jack appropriately */
@@ -1009,12 +1042,55 @@ static struct snd_kcontrol_new cxt5047_mixers[] = {
        HDA_CODEC_MUTE("Capture Switch", 0x12, 0x03, HDA_INPUT),
        HDA_CODEC_VOLUME("PCM Volume", 0x10, 0x00, HDA_OUTPUT),
        HDA_CODEC_MUTE("PCM Switch", 0x10, 0x00, HDA_OUTPUT),
-       HDA_CODEC_VOLUME("Master Playback Volume", 0x13, 0x00, HDA_OUTPUT),
+       HDA_CODEC_VOLUME("PCM-2 Volume", 0x1c, 0x00, HDA_OUTPUT),
+       HDA_CODEC_MUTE("PCM-2 Switch", 0x1c, 0x00, HDA_OUTPUT),
+       {
+               .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+               .name = "Master Playback Volume",
+               .info = snd_hda_mixer_amp_volume_info,
+               .get = snd_hda_mixer_amp_volume_get,
+               .put = cxt5047_hp_master_vol_put,
+               .private_value = HDA_COMPOSE_AMP_VAL(0x13, 3, 0, HDA_OUTPUT),
+       },
        {
                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
                .name = "Master Playback Switch",
-               .info = conexant_eapd_info,
-               .get = conexant_eapd_get,
+               .info = cxt_eapd_info,
+               .get = cxt_eapd_get,
+               .put = cxt5047_hp_master_sw_put,
+               .private_value = 0x13,
+       },
+
+       {}
+};
+
+static struct snd_kcontrol_new cxt5047_toshiba_mixers[] = {
+       {
+               .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+               .name = "Capture Source",
+               .info = conexant_mux_enum_info,
+               .get = conexant_mux_enum_get,
+               .put = conexant_mux_enum_put
+       },
+       HDA_CODEC_VOLUME("Mic Bypass Capture Volume", 0x19, 0x02, HDA_INPUT),
+       HDA_CODEC_MUTE("Mic Bypass Capture Switch", 0x19, 0x02, HDA_INPUT),
+       HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x03, HDA_INPUT),
+       HDA_CODEC_MUTE("Capture Switch", 0x12, 0x03, HDA_INPUT),
+       HDA_CODEC_VOLUME("PCM Volume", 0x10, 0x00, HDA_OUTPUT),
+       HDA_CODEC_MUTE("PCM Switch", 0x10, 0x00, HDA_OUTPUT),
+       {
+               .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+               .name = "Master Playback Volume",
+               .info = snd_hda_mixer_amp_volume_info,
+               .get = snd_hda_mixer_amp_volume_get,
+               .put = cxt5047_hp_master_vol_put,
+               .private_value = HDA_COMPOSE_AMP_VAL(0x13, 3, 0, HDA_OUTPUT),
+       },
+       {
+               .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+               .name = "Master Playback Switch",
+               .info = cxt_eapd_info,
+               .get = cxt_eapd_get,
                .put = cxt5047_hp_master_sw_put,
                .private_value = 0x13,
        },
@@ -1040,8 +1116,8 @@ static struct snd_kcontrol_new cxt5047_hp_mixers[] = {
        {
                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
                .name = "Master Playback Switch",
-               .info = conexant_eapd_info,
-               .get = conexant_eapd_get,
+               .info = cxt_eapd_info,
+               .get = cxt_eapd_get,
                .put = cxt5047_hp_master_sw_put,
                .private_value = 0x13,
        },
@@ -1053,19 +1129,23 @@ static struct hda_verb cxt5047_init_verbs[] = {
        {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
        {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN|AC_PINCTL_VREF_50 },
        {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN|AC_PINCTL_VREF_50 },
-       /* HP, Amp  */
+       /* HP, Amp, Speaker  */
        {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
-       {0x1A, AC_VERB_SET_CONNECT_SEL,0x03},
+       {0x1A, AC_VERB_SET_CONNECT_SEL,0x00},
        {0x1A, AC_VERB_SET_AMP_GAIN_MUTE,
         AC_AMP_SET_OUTPUT|AC_AMP_SET_RIGHT|AC_AMP_SET_LEFT|0x00},
        {0x1A, AC_VERB_SET_AMP_GAIN_MUTE,
         AC_AMP_SET_OUTPUT|AC_AMP_SET_RIGHT|AC_AMP_SET_LEFT|0x03},
+       {0x1d, AC_VERB_SET_CONNECT_SEL,0x0},
        /* Record selector: Front mic */
        {0x12, AC_VERB_SET_CONNECT_SEL,0x03},
        {0x19, AC_VERB_SET_AMP_GAIN_MUTE,
         AC_AMP_SET_INPUT|AC_AMP_SET_RIGHT|AC_AMP_SET_LEFT|0x17},
        /* SPDIF route: PCM */
        { 0x18, AC_VERB_SET_CONNECT_SEL, 0x0 },
+       /* Enable unsolicited events */
+       {0x13, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT},
+       {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT},
        { } /* end */
 };
 
@@ -1075,14 +1155,24 @@ static struct hda_verb cxt5047_toshiba_init_verbs[] = {
        /* pin sensing on HP and Mic jacks */
        {0x13, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT},
        {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT},
+       /* Speaker routing */
+       {0x1d, AC_VERB_SET_CONNECT_SEL,0x1},
+       /* Change default to ExtMic for recording */
+       {0x1a, AC_VERB_SET_CONNECT_SEL,0x2},
        {}
 };
 
 /* configuration for HP Laptops */
 static struct hda_verb cxt5047_hp_init_verbs[] = {
-       /* pin sensing on HP and Mic jacks */
+       /* pin sensing on HP jack */
        {0x13, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT},
-       {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT},
+       /* Record selector: Ext Mic */
+       {0x12, AC_VERB_SET_CONNECT_SEL,0x03},
+       {0x1a, AC_VERB_SET_CONNECT_SEL,0x02},
+       {0x19, AC_VERB_SET_AMP_GAIN_MUTE,
+        AC_AMP_SET_INPUT|AC_AMP_SET_RIGHT|AC_AMP_SET_LEFT|0x17},
+       /* Speaker routing */
+       {0x1d, AC_VERB_SET_CONNECT_SEL,0x1},
        {}
 };
 
@@ -1091,53 +1181,56 @@ static struct hda_verb cxt5047_hp_init_verbs[] = {
  */
 #ifdef CONFIG_SND_DEBUG
 static struct hda_input_mux cxt5047_test_capture_source = {
-       .num_items = 5,
+       .num_items = 4,
        .items = {
-               { "MIXER", 0x0 },
-               { "LINE1 pin", 0x1 },
-               { "MIC1 pin", 0x2 },
-               { "MIC2 pin", 0x3 },
-               { "CD pin", 0x4 },
+               { "LINE1 pin", 0x0 },
+               { "MIC1 pin", 0x1 },
+               { "MIC2 pin", 0x2 },
+               { "CD pin", 0x3 },
         },
 };
 
 static struct snd_kcontrol_new cxt5047_test_mixer[] = {
 
        /* Output only controls */
-       HDA_CODEC_VOLUME("OutAmp-1 Volume", 0x10, 0x00, HDA_OUTPUT),
-       HDA_CODEC_MUTE("OutAmp-1 Switch", 0x10,0x00, HDA_OUTPUT),
-       HDA_CODEC_VOLUME("OutAmp-2 Volume", 0x1c, 0x00, HDA_OUTPUT),
-       HDA_CODEC_MUTE("OutAmp-2 Switch", 0x1c, 0x00, HDA_OUTPUT),
+       HDA_CODEC_VOLUME("OutAmp-1 Volume", 0x10, 0x0, HDA_OUTPUT),
+       HDA_CODEC_MUTE("OutAmp-1 Switch", 0x10,0x0, HDA_OUTPUT),
+       HDA_CODEC_VOLUME("OutAmp-2 Volume", 0x1c, 0x0, HDA_OUTPUT),
+       HDA_CODEC_MUTE("OutAmp-2 Switch", 0x1c, 0x0, HDA_OUTPUT),
        HDA_CODEC_VOLUME("Speaker Playback Volume", 0x1d, 0x0, HDA_OUTPUT),
        HDA_CODEC_MUTE("Speaker Playback Switch", 0x1d, 0x0, HDA_OUTPUT),
        HDA_CODEC_VOLUME("HeadPhone Playback Volume", 0x13, 0x0, HDA_OUTPUT),
        HDA_CODEC_MUTE("HeadPhone Playback Switch", 0x13, 0x0, HDA_OUTPUT),
+       HDA_CODEC_VOLUME("Line1-Out Playback Volume", 0x14, 0x0, HDA_OUTPUT),
+       HDA_CODEC_MUTE("Line1-Out Playback Switch", 0x14, 0x0, HDA_OUTPUT),
+       HDA_CODEC_VOLUME("Line2-Out Playback Volume", 0x15, 0x0, HDA_OUTPUT),
+       HDA_CODEC_MUTE("Line2-Out Playback Switch", 0x15, 0x0, HDA_OUTPUT),
 
        /* Modes for retasking pin widgets */
        CXT_PIN_MODE("LINE1 pin mode", 0x14, CXT_PIN_DIR_INOUT),
        CXT_PIN_MODE("MIC1 pin mode", 0x15, CXT_PIN_DIR_INOUT),
 
-       /* Loopback mixer controls */
-       HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x19, 0x02, HDA_INPUT),
-       HDA_CODEC_MUTE("MIC1 Playback Switch", 0x19, 0x02, HDA_INPUT),
-       HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x19, 0x03, HDA_INPUT),
-       HDA_CODEC_MUTE("MIC2 Playback Switch", 0x19, 0x03, HDA_INPUT),
-       HDA_CODEC_VOLUME("LINE Playback Volume", 0x19, 0x01, HDA_INPUT),
-       HDA_CODEC_MUTE("LINE Playback Switch", 0x19, 0x01, HDA_INPUT),
-       HDA_CODEC_VOLUME("CD Playback Volume", 0x19, 0x04, HDA_INPUT),
-       HDA_CODEC_MUTE("CD Playback Switch", 0x19, 0x04, HDA_INPUT),
-
-#if 0   
-       /* Controls for GPIO pins, assuming they exist and are configured as outputs */
-       CXT_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
-       CXT_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
-       CXT_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
-       CXT_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
-#endif
-       CXT_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x18, 0x01),
+       /* EAPD Switch Control */
+       CXT_EAPD_SWITCH("External Amplifier", 0x13, 0x0),
 
-       HDA_CODEC_VOLUME("Capture Volume", 0x19, 0x0, HDA_OUTPUT),
-       HDA_CODEC_MUTE("Capture Switch", 0x19, 0x0, HDA_OUTPUT),
+       /* Loopback mixer controls */
+       HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x12, 0x01, HDA_INPUT),
+       HDA_CODEC_MUTE("MIC1 Playback Switch", 0x12, 0x01, HDA_INPUT),
+       HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x12, 0x02, HDA_INPUT),
+       HDA_CODEC_MUTE("MIC2 Playback Switch", 0x12, 0x02, HDA_INPUT),
+       HDA_CODEC_VOLUME("LINE Playback Volume", 0x12, 0x0, HDA_INPUT),
+       HDA_CODEC_MUTE("LINE Playback Switch", 0x12, 0x0, HDA_INPUT),
+       HDA_CODEC_VOLUME("CD Playback Volume", 0x12, 0x04, HDA_INPUT),
+       HDA_CODEC_MUTE("CD Playback Switch", 0x12, 0x04, HDA_INPUT),
+
+       HDA_CODEC_VOLUME("Capture-1 Volume", 0x19, 0x0, HDA_INPUT),
+       HDA_CODEC_MUTE("Capture-1 Switch", 0x19, 0x0, HDA_INPUT),
+       HDA_CODEC_VOLUME("Capture-2 Volume", 0x19, 0x1, HDA_INPUT),
+       HDA_CODEC_MUTE("Capture-2 Switch", 0x19, 0x1, HDA_INPUT),
+       HDA_CODEC_VOLUME("Capture-3 Volume", 0x19, 0x2, HDA_INPUT),
+       HDA_CODEC_MUTE("Capture-3 Switch", 0x19, 0x2, HDA_INPUT),
+       HDA_CODEC_VOLUME("Capture-4 Volume", 0x19, 0x3, HDA_INPUT),
+       HDA_CODEC_MUTE("Capture-4 Switch", 0x19, 0x3, HDA_INPUT),
        {
                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
                .name = "Input Source",
@@ -1145,16 +1238,18 @@ static struct snd_kcontrol_new cxt5047_test_mixer[] = {
                .get = conexant_mux_enum_get,
                .put = conexant_mux_enum_put,
        },
+       /* Controls for GPIO pins, assuming they exist and are configured
+       * as outputs
+       */
+       CXT_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
+       CXT_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
+       CXT_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
+       CXT_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
 
        { } /* end */
 };
 
 static struct hda_verb cxt5047_test_init_verbs[] = {
-       /* Enable all GPIOs as outputs with an initial value of 0 */
-       {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
-       {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
-       {0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
-
        /* Enable retasking pins as output, initially without power amp */
        {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
        {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
@@ -1215,7 +1310,6 @@ static int cxt5047_hp_init(struct hda_codec *codec)
 {
        conexant_init(codec);
        cxt5047_hp_automute(codec);
-       cxt5047_hp_automic(codec);
        return 0;
 }
 
@@ -1242,6 +1336,7 @@ static const char *cxt5047_models[CXT5047_MODELS] = {
 static struct snd_pci_quirk cxt5047_cfg_tbl[] = {
        SND_PCI_QUIRK(0x103c, 0x30a0, "HP DV1000", CXT5047_LAPTOP),
        SND_PCI_QUIRK(0x103c, 0x30b2, "HP DV2000T/DV3000T", CXT5047_LAPTOP),
+       SND_PCI_QUIRK(0x103c, 0x30b5, "HP DV2000Z", CXT5047_LAPTOP),
        SND_PCI_QUIRK(0x103c, 0x30a5, "HP DV5200T/DV8000T", CXT5047_LAPTOP_HP),
        SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba P100", CXT5047_LAPTOP_EAPD),
        {}
@@ -1291,8 +1386,10 @@ static int patch_cxt5047(struct hda_codec *codec)
                codec->patch_ops.init = cxt5047_hp_init;
                break;
        case CXT5047_LAPTOP_EAPD:
+               spec->input_mux = &cxt5047_toshiba_capture_source;
                spec->num_init_verbs = 2;
                spec->init_verbs[1] = cxt5047_toshiba_init_verbs;
+               spec->mixers[0] = cxt5047_toshiba_mixers;
                break;
 #ifdef CONFIG_SND_DEBUG
        case CXT5047_TEST:
@@ -1305,7 +1402,9 @@ static int patch_cxt5047(struct hda_codec *codec)
 }
 
 struct hda_codec_preset snd_hda_preset_conexant[] = {
-       { .id = 0x14f15045, .name = "CXT5045", .patch = patch_cxt5045 },
-       { .id = 0x14f15047, .name = "CXT5047", .patch = patch_cxt5047 },
+       { .id = 0x14f15045, .name = "CX20549 (Venice)",
+         .patch = patch_cxt5045 },
+       { .id = 0x14f15047, .name = "CX20551 (Waikiki)",
+         .patch = patch_cxt5047 },
        {} /* terminator */
 };
index 6f4a39273b988f8a99f8ac83283684a925cfc1ec..f7ef9c5afe8732d70d98b6191df4dc1b00f6571a 100644 (file)
@@ -457,6 +457,10 @@ static struct snd_pci_quirk stac9200_cfg_tbl[] = {
                      "Dell Latitude 120L", STAC_REF),
        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cc,
                      "Dell Latitude D820", STAC_REF),
+       SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01cd,
+                     "Dell Inspiron E1705/9400", STAC_REF),
+       SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01ce,
+                     "Dell XPS M1710", STAC_REF),
        {} /* terminator */
 };
 
@@ -1800,6 +1804,7 @@ static int patch_stac925x(struct hda_codec *codec)
        spec->board_config = snd_hda_check_board_config(codec, STAC_925x_MODELS,
                                                        stac925x_models,
                                                        stac925x_cfg_tbl);
+ again:
        if (spec->board_config < 0) {
                snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC925x, using BIOS defaults\n");
                err = stac92xx_save_bios_config_regs(codec);
@@ -1825,6 +1830,15 @@ static int patch_stac925x(struct hda_codec *codec)
        spec->mixer = stac925x_mixer;
 
        err = stac92xx_parse_auto_config(codec, 0x8, 0x7);
+       if (!err) {
+               if (spec->board_config < 0) {
+                       printk(KERN_WARNING "hda_codec: No auto-config is "
+                              "available, default to model=ref\n");
+                       spec->board_config = STAC_925x_REF;
+                       goto again;
+               }
+               err = -EINVAL;
+       }
        if (err < 0) {
                stac92xx_free(codec);
                return err;
@@ -1850,6 +1864,7 @@ static int patch_stac922x(struct hda_codec *codec)
        spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS,
                                                        stac922x_models,
                                                        stac922x_cfg_tbl);
+ again:
        if (spec->board_config < 0) {
                snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC922x, "
                        "using BIOS defaults\n");
@@ -1875,6 +1890,15 @@ static int patch_stac922x(struct hda_codec *codec)
        spec->multiout.dac_nids = spec->dac_nids;
        
        err = stac92xx_parse_auto_config(codec, 0x08, 0x09);
+       if (!err) {
+               if (spec->board_config < 0) {
+                       printk(KERN_WARNING "hda_codec: No auto-config is "
+                              "available, default to model=ref\n");
+                       spec->board_config = STAC_D945_REF;
+                       goto again;
+               }
+               err = -EINVAL;
+       }
        if (err < 0) {
                stac92xx_free(codec);
                return err;
@@ -1903,6 +1927,7 @@ static int patch_stac927x(struct hda_codec *codec)
        spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS,
                                                        stac927x_models,
                                                        stac927x_cfg_tbl);
+ again:
        if (spec->board_config < 0) {
                 snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC927x, using BIOS defaults\n");
                err = stac92xx_save_bios_config_regs(codec);
@@ -1945,6 +1970,15 @@ static int patch_stac927x(struct hda_codec *codec)
        spec->multiout.dac_nids = spec->dac_nids;
 
        err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
+       if (!err) {
+               if (spec->board_config < 0) {
+                       printk(KERN_WARNING "hda_codec: No auto-config is "
+                              "available, default to model=ref\n");
+                       spec->board_config = STAC_D965_REF;
+                       goto again;
+               }
+               err = -EINVAL;
+       }
        if (err < 0) {
                stac92xx_free(codec);
                return err;
@@ -1970,6 +2004,7 @@ static int patch_stac9205(struct hda_codec *codec)
        spec->board_config = snd_hda_check_board_config(codec, STAC_9205_MODELS,
                                                        stac9205_models,
                                                        stac9205_cfg_tbl);
+ again:
        if (spec->board_config < 0) {
                snd_printdd(KERN_INFO "hda_codec: Unknown model for STAC9205, using BIOS defaults\n");
                err = stac92xx_save_bios_config_regs(codec);
@@ -2008,6 +2043,15 @@ static int patch_stac9205(struct hda_codec *codec)
                            AC_VERB_SET_GPIO_MASK, 0x00000001);
 
        err = stac92xx_parse_auto_config(codec, 0x1f, 0x20);
+       if (!err) {
+               if (spec->board_config < 0) {
+                       printk(KERN_WARNING "hda_codec: No auto-config is "
+                              "available, default to model=ref\n");
+                       spec->board_config = STAC_9205_REF;
+                       goto again;
+               }
+               err = -EINVAL;
+       }
        if (err < 0) {
                stac92xx_free(codec);
                return err;
index fcc544a96ba3e80552f6ff4b7584ee6ddbcbf0ea..9fc0c0388881cdfca722e2504bfd9ae369716af2 100644 (file)
@@ -20,6 +20,8 @@
 #include <linux/device.h>
 #include <linux/delay.h>
 #include <linux/clk.h>
+#include <linux/atmel_pdc.h>
+
 #include <sound/driver.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
@@ -29,7 +31,6 @@
 #include <asm/arch/hardware.h>
 #include <asm/arch/at91_pmc.h>
 #include <asm/arch/at91_ssc.h>
-#include <asm/arch/at91_pdc.h>
 
 #include "at91-pcm.h"
 #include "at91-i2s.h"
  * SSC PDC registers required by the PCM DMA engine.
  */
 static struct at91_pdc_regs pdc_tx_reg = {
-       .xpr            = AT91_PDC_TPR,
-       .xcr            = AT91_PDC_TCR,
-       .xnpr           = AT91_PDC_TNPR,
-       .xncr           = AT91_PDC_TNCR,
+       .xpr            = ATMEL_PDC_TPR,
+       .xcr            = ATMEL_PDC_TCR,
+       .xnpr           = ATMEL_PDC_TNPR,
+       .xncr           = ATMEL_PDC_TNCR,
 };
 
 static struct at91_pdc_regs pdc_rx_reg = {
-       .xpr            = AT91_PDC_RPR,
-       .xcr            = AT91_PDC_RCR,
-       .xnpr           = AT91_PDC_RNPR,
-       .xncr           = AT91_PDC_RNCR,
+       .xpr            = ATMEL_PDC_RPR,
+       .xcr            = ATMEL_PDC_RCR,
+       .xnpr           = ATMEL_PDC_RNPR,
+       .xncr           = ATMEL_PDC_RNCR,
 };
 
 /*
@@ -72,8 +73,8 @@ static struct at91_ssc_mask ssc_tx_mask = {
        .ssc_disable    = AT91_SSC_TXDIS,
        .ssc_endx       = AT91_SSC_ENDTX,
        .ssc_endbuf     = AT91_SSC_TXBUFE,
-       .pdc_enable     = AT91_PDC_TXTEN,
-       .pdc_disable    = AT91_PDC_TXTDIS,
+       .pdc_enable     = ATMEL_PDC_TXTEN,
+       .pdc_disable    = ATMEL_PDC_TXTDIS,
 };
 
 static struct at91_ssc_mask ssc_rx_mask = {
@@ -81,8 +82,8 @@ static struct at91_ssc_mask ssc_rx_mask = {
        .ssc_disable    = AT91_SSC_RXDIS,
        .ssc_endx       = AT91_SSC_ENDRX,
        .ssc_endbuf     = AT91_SSC_RXBUFF,
-       .pdc_enable     = AT91_PDC_RXTEN,
-       .pdc_disable    = AT91_PDC_RXTDIS,
+       .pdc_enable     = ATMEL_PDC_RXTEN,
+       .pdc_disable    = ATMEL_PDC_RXTDIS,
 };
 
 
@@ -508,14 +509,14 @@ static int at91_i2s_hw_params(struct snd_pcm_substream *substream,
                /* Reset the SSC and its PDC registers */
                at91_ssc_write(ssc_p->ssc.base + AT91_SSC_CR, AT91_SSC_SWRST);
 
-               at91_ssc_write(ssc_p->ssc.base + AT91_PDC_RPR, 0);
-               at91_ssc_write(ssc_p->ssc.base + AT91_PDC_RCR, 0);
-               at91_ssc_write(ssc_p->ssc.base + AT91_PDC_RNPR, 0);
-               at91_ssc_write(ssc_p->ssc.base + AT91_PDC_RNCR, 0);
-               at91_ssc_write(ssc_p->ssc.base + AT91_PDC_TPR, 0);
-               at91_ssc_write(ssc_p->ssc.base + AT91_PDC_TCR, 0);
-               at91_ssc_write(ssc_p->ssc.base + AT91_PDC_TNPR, 0);
-               at91_ssc_write(ssc_p->ssc.base + AT91_PDC_TNCR, 0);
+               at91_ssc_write(ssc_p->ssc.base + ATMEL_PDC_RPR, 0);
+               at91_ssc_write(ssc_p->ssc.base + ATMEL_PDC_RCR, 0);
+               at91_ssc_write(ssc_p->ssc.base + ATMEL_PDC_RNPR, 0);
+               at91_ssc_write(ssc_p->ssc.base + ATMEL_PDC_RNCR, 0);
+               at91_ssc_write(ssc_p->ssc.base + ATMEL_PDC_TPR, 0);
+               at91_ssc_write(ssc_p->ssc.base + ATMEL_PDC_TCR, 0);
+               at91_ssc_write(ssc_p->ssc.base + ATMEL_PDC_TNPR, 0);
+               at91_ssc_write(ssc_p->ssc.base + ATMEL_PDC_TNCR, 0);
 
                if ((ret = request_irq(ssc_p->ssc.pid, at91_i2s_interrupt,
                                        0, ssc_p->name, ssc_p)) < 0) {
index e88b12e7cc40395aab427d3c27e3509f60573934..b39b95a470401edd66f8789826317ede5e59e593 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/platform_device.h>
 #include <linux/slab.h>
 #include <linux/dma-mapping.h>
+#include <linux/atmel_pdc.h>
 
 #include <sound/driver.h>
 #include <sound/core.h>
@@ -30,7 +31,6 @@
 
 #include <asm/arch/hardware.h>
 #include <asm/arch/at91_ssc.h>
-#include <asm/arch/at91_pdc.h>
 
 #include "at91-pcm.h"
 
@@ -83,7 +83,7 @@ static void at91_pcm_dma_irq(u32 ssc_sr,
                        params->name, ssc_sr, count);
 
                /* re-start the PDC */
-               at91_ssc_write(params->ssc_base + AT91_PDC_PTCR, params->mask->pdc_disable);
+               at91_ssc_write(params->ssc_base + ATMEL_PDC_PTCR, params->mask->pdc_disable);
 
                prtd->period_ptr += prtd->period_size;
                if (prtd->period_ptr >= prtd->dma_buffer_end) {
@@ -94,7 +94,7 @@ static void at91_pcm_dma_irq(u32 ssc_sr,
                at91_ssc_write(params->ssc_base + params->pdc->xcr,
                                prtd->period_size / params->pdc_xfer_size);
 
-               at91_ssc_write(params->ssc_base + AT91_PDC_PTCR, params->mask->pdc_enable);
+               at91_ssc_write(params->ssc_base + ATMEL_PDC_PTCR, params->mask->pdc_enable);
        }
 
        if (ssc_sr & params->mask->ssc_endx) {
@@ -143,7 +143,7 @@ static int at91_pcm_hw_free(struct snd_pcm_substream *substream)
        struct at91_pcm_dma_params *params = prtd->params;
 
        if (params != NULL) {
-               at91_ssc_write(params->ssc_base + AT91_PDC_PTCR, params->mask->pdc_disable);
+               at91_ssc_write(params->ssc_base + ATMEL_PDC_PTCR, params->mask->pdc_disable);
                prtd->params->dma_intr_handler = NULL;
        }
 
@@ -158,7 +158,7 @@ static int at91_pcm_prepare(struct snd_pcm_substream *substream)
        at91_ssc_write(params->ssc_base + AT91_SSC_IDR,
                        params->mask->ssc_endx | params->mask->ssc_endbuf);
 
-       at91_ssc_write(params->ssc_base + AT91_PDC_PTCR, params->mask->pdc_disable);
+       at91_ssc_write(params->ssc_base + ATMEL_PDC_PTCR, params->mask->pdc_disable);
        return 0;
 }
 
@@ -192,7 +192,7 @@ static int at91_pcm_trigger(struct snd_pcm_substream *substream,
                at91_ssc_write(params->ssc_base + AT91_SSC_IER,
                        params->mask->ssc_endx | params->mask->ssc_endbuf);
 
-               at91_ssc_write(params->ssc_base + AT91_PDC_PTCR, params->mask->pdc_enable);
+               at91_ssc_write(params->ssc_base + ATMEL_PDC_PTCR, params->mask->pdc_enable);
 
                DBG("sr=%lx imr=%lx\n", at91_ssc_read(params->ssc_base + AT91_SSC_SR),
                                        at91_ssc_read(params->ssc_base + AT91_SSC_IER));
@@ -201,12 +201,12 @@ static int at91_pcm_trigger(struct snd_pcm_substream *substream,
        case SNDRV_PCM_TRIGGER_STOP:
        case SNDRV_PCM_TRIGGER_SUSPEND:
        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-               at91_ssc_write(params->ssc_base + AT91_PDC_PTCR, params->mask->pdc_disable);
+               at91_ssc_write(params->ssc_base + ATMEL_PDC_PTCR, params->mask->pdc_disable);
                break;
 
        case SNDRV_PCM_TRIGGER_RESUME:
        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-               at91_ssc_write(params->ssc_base + AT91_PDC_PTCR, params->mask->pdc_enable);
+               at91_ssc_write(params->ssc_base + ATMEL_PDC_PTCR, params->mask->pdc_enable);
                break;
 
        default:
@@ -379,7 +379,7 @@ static int at91_pcm_suspend(struct platform_device *pdev,
 
        /* disable the PDC and save the PDC registers */
 
-       at91_ssc_write(params->ssc_base + AT91_PDC_PTCR, params->mask->pdc_disable);
+       at91_ssc_write(params->ssc_base + ATMEL_PDC_PTCR, params->mask->pdc_disable);
 
        prtd->pdc_xpr_save  = at91_ssc_read(params->ssc_base + params->pdc->xpr);
        prtd->pdc_xcr_save  = at91_ssc_read(params->ssc_base + params->pdc->xcr);
@@ -408,7 +408,7 @@ static int at91_pcm_resume(struct platform_device *pdev,
        at91_ssc_write(params->ssc_base + params->pdc->xnpr, prtd->pdc_xnpr_save);
        at91_ssc_write(params->ssc_base + params->pdc->xncr, prtd->pdc_xncr_save);
 
-       at91_ssc_write(params->ssc_base + AT91_PDC_PTCR, params->mask->pdc_enable);
+       at91_ssc_write(params->ssc_base + ATMEL_PDC_PTCR, params->mask->pdc_enable);
        return 0;
 }
 #else
index 78ac2688e1247dfbe082a150466f5b1116ef4cb1..ec2a2787957a2d56497dec1dc3bda83f5a7842df 100644 (file)
@@ -1,15 +1,15 @@
 config SND_SOC_AC97_CODEC
        tristate
-       depends SND_SOC
+       depends on SND_SOC
 
 config SND_SOC_WM8731
        tristate
-       depends SND_SOC
+       depends on SND_SOC
 
 config SND_SOC_WM8750
        tristate
-       depends SND_SOC
+       depends on SND_SOC
 
 config SND_SOC_WM9712
        tristate
-       depends SND_SOC
+       depends on SND_SOC
index 8f1ced4ab34cb2fbf0dd3143fa882ce916dafac6..46daca1755028d9ac73a4270deda963a11ef6cc9 100644 (file)
@@ -436,7 +436,7 @@ EXPORT_SYMBOL(unregister_sound_dsp);
 
 static int soundcore_open(struct inode *, struct file *);
 
-static struct file_operations soundcore_fops=
+static const struct file_operations soundcore_fops=
 {
        /* We must have an owner or the module locking fails */
        .owner  = THIS_MODULE,
index 573e3701c14f02f526bac8777d86fa922e36d2a0..ebcac13fd3970cd0c0fd989748b6a08c89a4b636 100644 (file)
@@ -20,7 +20,6 @@
 
 #include <sound/driver.h>
 #include <linux/wait.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <linux/string.h>
 #include <sound/core.h>
index 59144ec026e4c4534b136e99c059f67b513034d7..680f2b7fec207158abd4ef28cec6c72364ac9d83 100644 (file)
@@ -20,7 +20,6 @@
 
 #include <sound/driver.h>
 #include <linux/wait.h>
-#include <linux/sched.h>
 #include <linux/slab.h>
 #include <sound/core.h>
 #include <sound/emux_synth.h>
index 4dfb91d4398a02fb6962ba07310f658d7cc30fe9..b6d886373bb001b46da476a0cb1a2f3c6d44db19 100644 (file)
@@ -325,16 +325,6 @@ static int prepare_capture_urb(struct snd_usb_substream *subs,
        }
        urb->transfer_buffer_length = offs;
        urb->number_of_packets = ctx->packets;
-#if 0 // for check
-       if (! urb->bandwidth) {
-               int bustime;
-               bustime = usb_check_bandwidth(urb->dev, urb);
-               if (bustime < 0)
-                       return bustime;
-               printk("urb %d: bandwidth = %d (packets = %d)\n", ctx->index, bustime, urb->number_of_packets);
-               usb_claim_bandwidth(urb->dev, urb, bustime, 1);
-       }
-#endif // for check
        return 0;
 }
 
index 25b4ab4f61e7299d1eda8dc84b5eb1b47c2f17fd..858262068f4fe5ff4502e0d1df9221ef029f6532 100644 (file)
@@ -947,6 +947,29 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        }
 },
        /* TODO: add Edirol M-100FX support */
+{
+       /* has ID 0x004e when not in "Advanced Driver" mode */
+       USB_DEVICE(0x0582, 0x004c),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .vendor_name = "EDIROL",
+               .product_name = "PCR-A",
+               .ifnum = QUIRK_ANY_INTERFACE,
+               .type = QUIRK_COMPOSITE,
+               .data = (const struct snd_usb_audio_quirk[]) {
+                       {
+                               .ifnum = 1,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = 2,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = -1
+                       }
+               }
+       }
+},
 {
        /* has ID 0x004f when not in "Advanced Driver" mode */
        USB_DEVICE(0x0582, 0x004d),
index 382702ad663bea2fd72ba169556c147693a92b4a..201f27f8cbaf1c6b266b68f3a915c3edce50b67b 100644 (file)
@@ -7,7 +7,7 @@ PHONY += klibcdirs
 
 
 # Generate builtin.o based on initramfs_data.o
-obj-y := initramfs_data.o
+obj-$(CONFIG_BLK_DEV_INITRD) := initramfs_data.o
 
 # initramfs_data.o contains the initramfs_data.cpio.gz image.
 # The image is included using .incbin, a dependency which is not
index 83acd6cc0b3cd70325ec383eb8fdc309918a0a98..8365db6cfe06449246ef5156a4a886d7e14fbdbc 100644 (file)
@@ -14,6 +14,7 @@
  * Original work by Jeff Garzik
  *
  * External file lists, symlink, pipe and fifo support by Thayne Harbaugh
+ * Hard link support by Luciano Rocha
  */
 
 #define xstr(s) #s
@@ -286,16 +287,19 @@ static int cpio_mknod_line(const char *line)
        return rc;
 }
 
-/* Not marked static to keep the compiler quiet, as no one uses this yet... */
 static int cpio_mkfile(const char *name, const char *location,
-                       unsigned int mode, uid_t uid, gid_t gid)
+                       unsigned int mode, uid_t uid, gid_t gid,
+                       unsigned int nlinks)
 {
        char s[256];
        char *filebuf = NULL;
        struct stat buf;
+       long size;
        int file = -1;
        int retval;
        int rc = -1;
+       int namesize;
+       int i;
 
        mode |= S_IFREG;
 
@@ -323,29 +327,41 @@ static int cpio_mkfile(const char *name, const char *location,
                goto error;
        }
 
-       sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX"
-              "%08X%08X%08X%08X%08X%08X%08X",
-               "070701",               /* magic */
-               ino++,                  /* ino */
-               mode,                   /* mode */
-               (long) uid,             /* uid */
-               (long) gid,             /* gid */
-               1,                      /* nlink */
-               (long) buf.st_mtime,    /* mtime */
-               (int) buf.st_size,      /* filesize */
-               3,                      /* major */
-               1,                      /* minor */
-               0,                      /* rmajor */
-               0,                      /* rminor */
-               (unsigned)strlen(name) + 1,/* namesize */
-               0);                     /* chksum */
-       push_hdr(s);
-       push_string(name);
-       push_pad();
+       size = 0;
+       for (i = 1; i <= nlinks; i++) {
+               /* data goes on last link */
+               if (i == nlinks) size = buf.st_size;
+
+               namesize = strlen(name) + 1;
+               sprintf(s,"%s%08X%08X%08lX%08lX%08X%08lX"
+                      "%08lX%08X%08X%08X%08X%08X%08X",
+                       "070701",               /* magic */
+                       ino,                    /* ino */
+                       mode,                   /* mode */
+                       (long) uid,             /* uid */
+                       (long) gid,             /* gid */
+                       nlinks,                 /* nlink */
+                       (long) buf.st_mtime,    /* mtime */
+                       size,                   /* filesize */
+                       3,                      /* major */
+                       1,                      /* minor */
+                       0,                      /* rmajor */
+                       0,                      /* rminor */
+                       namesize,               /* namesize */
+                       0);                     /* chksum */
+               push_hdr(s);
+               push_string(name);
+               push_pad();
+
+               if (size) {
+                       fwrite(filebuf, size, 1, stdout);
+                       offset += size;
+                       push_pad();
+               }
 
-       fwrite(filebuf, buf.st_size, 1, stdout);
-       offset += buf.st_size;
-       push_pad();
+               name += namesize;
+       }
+       ino++;
        rc = 0;
        
 error:
@@ -357,18 +373,51 @@ error:
 static int cpio_mkfile_line(const char *line)
 {
        char name[PATH_MAX + 1];
+       char *dname = NULL; /* malloc'ed buffer for hard links */
        char location[PATH_MAX + 1];
        unsigned int mode;
        int uid;
        int gid;
+       int nlinks = 1;
+       int end = 0, dname_len = 0;
        int rc = -1;
 
-       if (5 != sscanf(line, "%" str(PATH_MAX) "s %" str(PATH_MAX) "s %o %d %d", name, location, &mode, &uid, &gid)) {
+       if (5 > sscanf(line, "%" str(PATH_MAX) "s %" str(PATH_MAX)
+                               "s %o %d %d %n",
+                               name, location, &mode, &uid, &gid, &end)) {
                fprintf(stderr, "Unrecognized file format '%s'", line);
                goto fail;
        }
-       rc = cpio_mkfile(name, location, mode, uid, gid);
+       if (end && isgraph(line[end])) {
+               int len;
+               int nend;
+
+               dname = malloc(strlen(line));
+               if (!dname) {
+                       fprintf (stderr, "out of memory (%d)\n", dname_len);
+                       goto fail;
+               }
+
+               dname_len = strlen(name) + 1;
+               memcpy(dname, name, dname_len);
+
+               do {
+                       nend = 0;
+                       if (sscanf(line + end, "%" str(PATH_MAX) "s %n",
+                                       name, &nend) < 1)
+                               break;
+                       len = strlen(name) + 1;
+                       memcpy(dname + dname_len, name, len);
+                       dname_len += len;
+                       nlinks++;
+                       end += nend;
+               } while (isgraph(line[end]));
+       } else {
+               dname = name;
+       }
+       rc = cpio_mkfile(dname, location, mode, uid, gid, nlinks);
  fail:
+       if (dname_len) free(dname);
        return rc;
 }
 
@@ -381,22 +430,23 @@ void usage(const char *prog)
                "describe the files to be included in the initramfs archive:\n"
                "\n"
                "# a comment\n"
-               "file <name> <location> <mode> <uid> <gid>\n"
+               "file <name> <location> <mode> <uid> <gid> [<hard links>]\n"
                "dir <name> <mode> <uid> <gid>\n"
                "nod <name> <mode> <uid> <gid> <dev_type> <maj> <min>\n"
                "slink <name> <target> <mode> <uid> <gid>\n"
                "pipe <name> <mode> <uid> <gid>\n"
                "sock <name> <mode> <uid> <gid>\n"
                "\n"
-               "<name>      name of the file/dir/nod/etc in the archive\n"
-               "<location>  location of the file in the current filesystem\n"
-               "<target>    link target\n"
-               "<mode>      mode/permissions of the file\n"
-               "<uid>       user id (0=root)\n"
-               "<gid>       group id (0=root)\n"
-               "<dev_type>  device type (b=block, c=character)\n"
-               "<maj>       major number of nod\n"
-               "<min>       minor number of nod\n"
+               "<name>       name of the file/dir/nod/etc in the archive\n"
+               "<location>   location of the file in the current filesystem\n"
+               "<target>     link target\n"
+               "<mode>       mode/permissions of the file\n"
+               "<uid>        user id (0=root)\n"
+               "<gid>        group id (0=root)\n"
+               "<dev_type>   device type (b=block, c=character)\n"
+               "<maj>        major number of nod\n"
+               "<min>        minor number of nod\n"
+               "<hard links> space separated list of other links to file\n"
                "\n"
                "example:\n"
                "# A simple initramfs\n"